ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OGU2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjgyIEBACitMT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJjeGNvcmUKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N4Y29yZS9pbmNsdWRlCitMT0NBTF9DRkxBR1MgOj0gJChMT0NBTF9DX0lOQ0xVREVTOiU9LUklKQorTE9DQUxfTERMSUJTIDo9IC1MJChTWVNST09UKS91c3IvbGliIC1sZGwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGFsbG9jLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hhcml0aG0uY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGFycmF5LmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hjbXAuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGNvbnZlcnQuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGNvcHkuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGRhdGFzdHJ1Y3RzLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hkcmF3aW5nLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hkeHQuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeGVycm9yLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hpbWFnZS5jcHAgXAorICAgICAgICBjeGNvcmUvc3JjL2N4amFjb2JpZWlnZW5zLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hsb2dpYy5jcHAgXAorICAgICAgICBjeGNvcmUvc3JjL2N4bHV0LmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3htYXRoZnVuY3MuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeG1hdG11bC5jcHAgXAorICAgICAgICBjeGNvcmUvc3JjL2N4bWF0cml4LmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3htZWFuLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3htZWFuc2R2LmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3htaW5tYXhsb2MuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeG5vcm0uY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeG91dHRleHQuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeHBlcnNpc3RlbmNlLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hwcmVjb21wLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hyYW5kLmNwcCBcCisgICAgICAgIGN4Y29yZS9zcmMvY3hzdW1waXhlbHMuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeHN2ZC5jcHAgXAorICAgICAgICBjeGNvcmUvc3JjL2N4c3dpdGNoZXIuY3BwIFwKKyAgICAgICAgY3hjb3JlL3NyYy9jeHRhYmxlcy5jcHAgXAorICAgICAgICBjeGNvcmUvc3JjL2N4dXRpbHMuY3BwCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEUgICAgOj0gbGliY3YKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N4Y29yZS9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9jeGNvcmUvc3JjIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9jdi9pbmNsdWRlCitMT0NBTF9DRkxBR1MgOj0gJChMT0NBTF9DX0lOQ0xVREVTOiU9LUklKQorTE9DQUxfTERMSUJTIDo9IC1MJChTWVNST09UKS91c3IvbGliIC1sZGwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgY3Yvc3JjL2N2YWNjdW0uY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2YWRhcHRocmVzaC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZhcHByb3guY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y2FsY2NvbnRyYXN0aGlzdG9ncmFtLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNhbGNpbWFnZWhvbW9ncmFwaHkuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y2FsaWJpbml0LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNhbGlicmF0aW9uLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNhbXNoaWZ0LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNhbm55LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNvbG9yLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNvbmRlbnMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y29udG91cnMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y29udG91cnRyZWUuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y29udmh1bGwuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2Y29ybmVyLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmNvcm5lcnN1YnBpeC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZkZXJpdi5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZkaXN0cmFuc2Zvcm0uY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2ZG9taW5hbnRzLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmVtZC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZmZWF0dXJlc2VsZWN0LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmZpbHRlci5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZmbG9vZGZpbGwuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2ZnVuZGFtLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmdlb21ldHJ5LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmhhYXIuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2aGlzdG9ncmFtLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmhvdWdoLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdmltZ3dhcnAuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2aW5wYWludC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZrYWxtYW4uY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2bGluZWZpdC5jcHAgXAorICAgICAgICBjdi9zcmMvY3Zsa3B5cmFtaWQuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2bWF0Y2hjb250b3Vycy5jcHAgXAorICAgICAgICBjdi9zcmMvY3Ztb21lbnRzLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdm1vcnBoLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdm1vdGVtcGwuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2b3B0Zmxvd2JtLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdm9wdGZsb3docy5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZvcHRmbG93bGsuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2cGdoLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnBvc2l0LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnByZWNvbXAuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2cHlyYW1pZHMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2cHlyc2VnbWVudGF0aW9uLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnJvdGNhbGlwZXJzLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnNhbXBsZXJzLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnNlZ21lbnRhdGlvbi5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZzaGFwZWRlc2NyLmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnNtb290aC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZzbmFrZXMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2c3RlcmVvYm0uY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2c3RlcmVvZ2MuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2c3ViZGl2aXNpb24yZC5jcHAgXAorICAgICAgICBjdi9zcmMvY3ZzdW1waXhlbHMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2c3VyZi5jcHAgXAorICAgICAgICBjdi9zcmMvY3Zzd2l0Y2hlci5jcHAgXAorICAgICAgICBjdi9zcmMvY3Z0YWJsZXMuY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2dGVtcGxtYXRjaC5jcHAgXAorICAgICAgICBjdi9zcmMvY3Z0aHJlc2guY3BwIFwKKyAgICAgICAgY3Yvc3JjL2N2dW5kaXN0b3J0LmNwcCBcCisgICAgICAgIGN2L3NyYy9jdnV0aWxzLmNwcCBcCisgICAgICAgIGN2L3NyYy9teWN2SGFhckRldGVjdE9iamVjdHMuY3BwCisjICAgICAgICBjdi9zcmMvY3ZrZHRyZWUuY3BwIFwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICA6PSBsaWJjdmF1eAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N2L3NyYyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvY3YvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvY3hjb3JlL2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N2YXV4L2luY2x1ZGUKK0xPQ0FMX0NGTEFHUyA6PSAkKExPQ0FMX0NfSU5DTFVERVM6JT0tSSUpCitMT0NBTF9MRExJQlMgOj0gLUwkKFNZU1JPT1QpL3Vzci9saWIgLWxkbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICAgICAgICBjdmF1eC9zcmMvY2Ftc2hpZnQuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2YXV4LmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmF1eHV0aWxzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmJnZmdfYWNtbW0yMDAzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmJnZmdfY29kZWJvb2suY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2YmdmZ19jb21tb24uY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2YmdmZ19nYXVzc21peC5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZjYWxpYmZpbHRlci5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZjbGlxdWUuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2Y29ycmVzcG9uZC5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3Zjb3JyaW1hZ2VzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmNyZWF0ZWhhbmRtYXNrLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmRwc3RlcmVvLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmVpZ2Vub2JqZWN0cy5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZlcGlsaW5lcy5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZmYWNlLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmZhY2VkZXRlY3Rpb24uY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2ZmFjZXRlbXBsYXRlLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmZpbmRmYWNlLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmZpbmRoYW5kcmVnaW9uLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmhtbS5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZobW0xZC5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZobW1vYnMuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2bGNtLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmxlZS5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZsZXZtYXIuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2bGV2bWFycHJvamJhbmRsZS5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3ZsZXZtYXJ0cmlmLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmxpbmVzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdmxtZWRzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdm1hdC5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3Ztb3JwaGNvbnRvdXJzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdm1vcnBoaW5nLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdnByZXdhcnAuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2c2NhbmxpbmVzLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdnNlZ21lbnQuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2N2c3ViZGl2Mi5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3Z0ZXh0dXJlLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdnRyaWZvY2FsLmNwcCBcCisgICAgICAgIGN2YXV4L3NyYy9jdnZlY2ZhY2V0cmFja2luZy5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvY3Z2aWRlby5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvZGVjb21wcG9seS5jcHAgXAorICAgICAgICBjdmF1eC9zcmMvZW5taW4uY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL2V4dGVuZGVkZWRnZXMuY3BwIFwKKyAgICAgICAgY3ZhdXgvc3JjL3ByZWNvbXAuY3BwCisjICAgICAgICBjdmF1eC9zcmMvY3YzZHRyYWNrZXIuY3BwIFwKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICA6PSBsaWJjdm1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvY3Yvc3JjIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9jdi9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9jeGNvcmUvaW5jbHVkZSBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvbWwvaW5jbHVkZQorTE9DQUxfQ0ZMQUdTIDo9ICQoTE9DQUxfQ19JTkNMVURFUzolPS1JJSkKK0xPQ0FMX0xETElCUyA6PSAtTCQoU1lTUk9PVCkvdXNyL2xpYiAtbGRsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIG1sL3NyYy9tbC5jcHAgXAorICAgICAgICBtbC9zcmMvbWxhbm5fbWxwLmNwcCBcCisgICAgICAgIG1sL3NyYy9tbGJvb3N0LmNwcCBcCisgICAgICAgIG1sL3NyYy9tbGNubi5jcHAgXAorICAgICAgICBtbC9zcmMvbWxlbS5jcHAgXAorICAgICAgICBtbC9zcmMvbWxlc3RpbWF0ZS5jcHAgXAorICAgICAgICBtbC9zcmMvbWxrbmVhcmVzdC5jcHAgXAorICAgICAgICBtbC9zcmMvbWxuYmF5ZXMuY3BwIFwKKyAgICAgICAgbWwvc3JjL21scnRyZWVzLmNwcCBcCisgICAgICAgIG1sL3NyYy9tbHN2bS5jcHAgXAorICAgICAgICBtbC9zcmMvbWx0ZXN0c2V0LmNwcCBcCisgICAgICAgIG1sL3NyYy9tbHRyZWUuY3BwIFwKKyAgICAgICAgbWwvc3JjL21sX2lubmVyX2Z1bmN0aW9ucy5jcHAKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICA6PSBsaWJjdmhpZ2hndWkKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9jdi9zcmMgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N2L2luY2x1ZGUgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL2N4Y29yZS9pbmNsdWRlIFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9vdGhlcmxpYnMvaGlnaGd1aSBcCisgICAgICAgIGV4dGVybmFsL2pwZWcKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJqcGVnCisKK0xPQ0FMX0NGTEFHUyA6PSAkKExPQ0FMX0NfSU5DTFVERVM6JT0tSSUpIC1ESEFWRV9KUEVHCitMT0NBTF9MRExJQlMgOj0gLUwkKFNZU1JPT1QpL3Vzci9saWIgLWxkbCAtbGpwZWcKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvYml0c3RybS5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9iYXNlLmNwcCBcCisgICAgICAgIG90aGVybGlicy9oaWdoZ3VpL2dyZm10X2JtcC5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9leHIuY3BwIFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfaW1hZ2Vpby5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9qcGVnLmNwcCBcCisgICAgICAgIG90aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcyMDAwLmNwcCBcCisgICAgICAgIG90aGVybGlicy9oaWdoZ3VpL2dyZm10X3BuZy5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9weG0uY3BwIFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfc3VucmFzLmNwcCBcCisgICAgICAgIG90aGVybGlicy9oaWdoZ3VpL2dyZm10X3RpZmYuY3BwIFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvaW1hZ2UuY3BwIFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvbG9hZHNhdmUuY3BwIFwKKyAgICAgICAgb3RoZXJsaWJzL2hpZ2hndWkvcHJlY29tcC5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS91dGlscy5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9jdmNhcC5jcHAgXAorICAgICAgICBvdGhlcmxpYnMvaGlnaGd1aS9jdmNhcF9zb2NrZXQuY3BwCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSAgICA6PSBsaWJvcGVuY3YKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChMT0NBTF9QQVRIKS9saWJvcGVuY3YubWsKKworTE9DQUxfQ0ZMQUdTIDo9ICQoTE9DQUxfQ19JTkNMVURFUzolPS1JJSkKK0xPQ0FMX0xETElCUyA6PSAtTCQoU1lTUk9PVCkvdXNyL2xpYiAtbGRsIC1sbG9nIFwKKyAgICAgICAgICAgICAgICAtTCQoVEFSR0VUX09VVCkgLWxjeGNvcmUgLWxjdiAtbGN2YXV4IC1sY3ZtbCAtbGN2aGlnaGd1aQorCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgICAgIFdMTm9uRmlsZUJ5dGVTdHJlYW0uY3BwCisKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJjeGNvcmUgbGliY3YgbGliY3ZhdXggbGliY3ZtbCBsaWJjdmhpZ2hndWkKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9BcHBsaWNhdGlvbi5tayBiL0FwcGxpY2F0aW9uLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMjc4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9BcHBsaWNhdGlvbi5tawpAQCAtMCwwICsxLDMgQEAKK0FQUF9CVUlMRF9TQ1JJUFQgOj0gJChjYWxsIG15LWRpcikvQW5kcm9pZC5taworQVBQX1BST0pFQ1RfUEFUSCA6PSAkKGNhbGwgbXktZGlyKS90ZXN0cy9WaWRlb0VtdWxhdGlvbgorQVBQX01PRFVMRVMgICAgICA6PSBjeGNvcmUgY3YgY3ZhdXggY3ZtbCBjdmhpZ2hndWkgb3BlbmN2CmRpZmYgLS1naXQgYS9MSUNFTlNFX0FuZHJvaWRfTkRLIGIvTElDRU5TRV9BbmRyb2lkX05ESwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDM3OWIzCi0tLSAvZGV2L251bGwKKysrIGIvTElDRU5TRV9BbmRyb2lkX05ESwpAQCAtMCwwICsxLDEyIEBACitPcGVuQ1YgZm9yIEFuZHJvaWQgTkRLDQorQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgU0lQcm9wIFByb2plY3QgaHR0cDovL3d3dy5zaXByb3Aub3JnLw0KKw0KK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5Lg0KK0luIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQoraW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksDQorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCisNCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCisyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQorMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCmRpZmYgLS1naXQgYS9MSUNFTlNFX09wZW5DViBiL0xJQ0VOU0VfT3BlbkNWCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODEwODEKLS0tIC9kZXYvbnVsbAorKysgYi9MSUNFTlNFX09wZW5DVgpAQCAtMCwwICsxLDM2IEBACitJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLiAKKworQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCitJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQgCisgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkgCisKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLiAKKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKK2FyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCithbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAord2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCitpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKyhpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKK2xvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCithbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCitvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKK3RoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4gIApkaWZmIC0tZ2l0IGEvTU9EVUxFX0xJQ0VOU0VfQlNEIGIvTU9EVUxFX0xJQ0VOU0VfQlNECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9NT0RVTEVfTElDRU5TRV9CU0QKZGlmZiAtLWdpdCBhL05PVElDRSBiL05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjk1ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvTk9USUNFCkBAIC0wLDAgKzEsODgwIEBACitJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorCitCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KK0lmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCitjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisKKworICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisKK0NvcHlyaWdodCAoQykgMjAwMC0yMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KK1RoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKK2FueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCit3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCitJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKK2luZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKK2FuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKK29yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgordGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK09wZW5DViBmb3IgQW5kcm9pZCBOREsKK0NvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNJUHJvcCBQcm9qZWN0IGh0dHA6Ly93d3cuc2lwcm9wLm9yZy8KKworVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCitpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwKK3N1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisKKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAgICAqICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAgICAqCisgICAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgICogYXJlIG1ldDoKKyAgICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgICAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICAgICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICAgICogIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAgICAqICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KKyAgICAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgICAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICAgICoKKyAgICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgICAgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAgICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgICAgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAgICAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgICAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICAgICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgICAgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICAgICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICAgICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICAgICogU1VDSCBEQU1BR0UuCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICogQ29weXJpZ2h0wqkgMjAwOCwgTGl1IExpdSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogY29uZGl0aW9ucyBhcmUgbWV0OgorICogCVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqIAljb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogCWRpc2NsYWltZXIuCisgKiAJUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogCWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAJZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCVRoZSBuYW1lIG9mIENvbnRyaWJ1dG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yCisgKiAJcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLAorICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvCisvLyAgdGhpcyBsaWNlbnNlLiAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwKKy8vICBpbnN0YWxsLCBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDA4LCBHb29nbGUsIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2UKKy8vICAgICBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKy8vICAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiCisvLyBhbmQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlCisvLyBpbXBsaWVkIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZQorLy8gYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUKKy8vIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwgaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IKKy8vIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8vICAgICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisvLyAgICAqICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vICAgICoKKy8vICAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyAgICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworLy8gICAgKiBhcmUgbWV0OgorLy8gICAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKy8vICAgICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vICAgICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCisvLyAgICAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKy8vICAgICogIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKy8vICAgICogIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorLy8gICAgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworLy8gICAgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKy8vICAgICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLyAgICAqCisvLyAgICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisvLyAgICAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorLy8gICAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorLy8gICAgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKy8vICAgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKy8vICAgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKy8vICAgICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisvLyAgICAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisvLyAgICAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKy8vICAgICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorLy8gICAgKiBTVUNIIERBTUFHRS4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPUFlSSUdIVCBOT1RJQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgT3JpZ2luYWwgY29kZSBmb3IgQmF5ZXItPkJHUi9SR0IgY29udmVyc2lvbiBpcyBwcm92aWRlZCBieSBEaXJrIFNjaGFlZmVyCisgIGZyb20gTUQtTWF0aGVtYXRpc2NoZSBEaWVuc3RlIEdtYkguIEJlbG93IGlzIHRoZSBjb3B5cmlnaHQgbm90aWNlOgorCisgICAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKyAgICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlCisgICAgdG8gdGhpcyBsaWNlbnNlLiBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLAorICAgIGluc3RhbGwsIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKworICAgIENvbnRyaWJ1dG9ycyBMaWNlbnNlIEFncmVlbWVudDoKKworICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLAorICAgICAgTUQtTWF0aGVtYXRpc2NoZSBEaWVuc3RlIEdtYkgKKyAgICAgIEltIERlZmRhaGwgNS0xMAorICAgICAgNDQxNDEgRG9ydG11bmQKKyAgICAgIEdlcm1hbnkKKyAgICAgIHd3dy5tZC1pdC5kZQorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3JtcywKKyAgICB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkCisgICAgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICAgIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgVGhlIG5hbWUgb2YgQ29udHJpYnV0b3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgICAgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICAgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICAgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09QWVJJR0hUIE5PVElDRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tCisKKyAgVGhlIGNvZGUgaGFzIGJlZW4gZGVyaXZlZCBmcm9tIGxpYnN2bSBsaWJyYXJ5ICh2ZXJzaW9uIDIuNikKKyAgKGh0dHA6Ly93d3cuY3NpZS5udHUuZWR1LnR3L35jamxpbi9saWJzdm0pLgorCisgIEhlcmUgaXMgdGhlIG9yaWduYWwgY29weXJpZ2h0OgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQ29weXJpZ2h0IChjKSAyMDAwLTIwMDMgQ2hpaC1DaHVuZyBDaGFuZyBhbmQgQ2hpaC1KZW4gTGluCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICAgIGFyZSBtZXQ6CisKKyAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAzLiBOZWl0aGVyIG5hbWUgb2YgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKKworICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgICBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgICAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgICAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUgorICAgIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICAgIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAgICBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GCisgICAgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKKyAgICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBpY3ZlcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAyLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQoIEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8oaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCwgWGF2aWVyIERlbGFjb3VyLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0KCBDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWZhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCwgTmlscyBIYXNsZXIsIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vCQkJICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8JCSAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworICBDb3B5cmlnaHQgKEMpIDE5NzgtMTk5OSBLZW4gVHVya293c2tpLiA8dHVya0Bjb21wdXRlci5vcmc+CisKKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgV2FycmFudHkgSW5mb3JtYXRpb24KKyAgICAgIEV2ZW4gdGhvdWdoIEkgaGF2ZSByZXZpZXdlZCB0aGlzIHNvZnR3YXJlLCBJIG1ha2Ugbm8gd2FycmFudHkKKyAgICAgIG9yIHJlcHJlc2VudGF0aW9uLCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLCB3aXRoIHJlc3BlY3QgdG8gdGhpcworICAgICAgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvciBmaXRuZXNzIGZvciBhCisgICAgICBwYXJ0aWN1bGFyIHB1cnBvc2UuICBBcyBhIHJlc3VsdCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAiYXMgaXMsIgorICAgICAgYW5kIHlvdSwgaXRzIHVzZXIsIGFyZSBhc3N1bWluZyB0aGUgZW50aXJlIHJpc2sgYXMgdG8gaXRzIHF1YWxpdHkKKyAgICAgIGFuZCBhY2N1cmFjeS4KKworICAgIFRoaXMgY29kZSBtYXkgYmUgdXNlZCBhbmQgZnJlZWx5IGRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgaXQgaW5jbHVkZXMKKyAgICB0aGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBhYm92ZSB3YXJyYW50eSBpbmZvcm1hdGlvbi4KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisgICAgVGhlIGFsZ29yaXRobXMgZGV2ZWxvcGVkIGFuZCBpbXBsZW1lbnRlZCBieSBWZXpobmV2ZXRzIFZsZGltaXIKKyAgICBha2EgRGVhZCBNb3JveiAodnZwQGdyYXBoaWNzLmNzLm1zdS5ydSkKKyAgICBTZWUgaHR0cDovL2dyYXBoaWNzLmNzLm1zdS5zdS9lbi9yZXNlYXJjaC9jYWxpYnJhdGlvbi9vcGVuY3YuaHRtbAorICAgIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKworICAgIFJlbGlhYmlsaXR5IGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IFBoaWxpcCBHcnVlYmVsZS4KKyAgICA8YSBocmVmPSJtYWlsdG86cGdydWViZWxlQGNveC5uZXQiPnBncnVlYmVsZUBjb3gubmV0PC9hPgorCisgICAgU29tZSBmdXJ0aGVyIGltcHJvdmVtZW50cyBmb3IgZGV0ZWN0aW9uIG9mIHBhcnRpYWxseSBvY2x1ZGVkIGJvYXJkcyBhdCBub24taWRlYWwKKyAgICBsaWdodGluZyBjb25kaXRpb25zIGhhdmUgYmVlbiBtYWRlIGJ5IEFsZXggQm92eXJpbiBhbmQgS3VydCBLb2xvbmlnZQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgQ29weXJpZ2h0IChDKSAxOTgxLTE5OTkgS2VuIFR1cmtvd3NraS4gPHR1cmtAY29tcHV0ZXIub3JnPgorCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgV2FycmFudHkgSW5mb3JtYXRpb24KKyAgRXZlbiB0aG91Z2ggSSBoYXZlIHJldmlld2VkIHRoaXMgc29mdHdhcmUsIEkgbWFrZSBubyB3YXJyYW50eQorICBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgd2l0aCByZXNwZWN0IHRvIHRoaXMKKyAgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvciBmaXRuZXNzIGZvciBhCisgIHBhcnRpY3VsYXIgcHVycG9zZS4gIEFzIGEgcmVzdWx0LCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiCisgIGFuZCB5b3UsIGl0cyB1c2VyLCBhcmUgYXNzdW1pbmcgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5CisgIGFuZCBhY2N1cmFjeS4KKworICBUaGlzIGNvZGUgbWF5IGJlIHVzZWQgYW5kIGZyZWVseSBkaXN0cmlidXRlZCBhcyBsb25nIGFzIGl0IGluY2x1ZGVzCisgIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGFib3ZlIHdhcnJhbnR5IGluZm9ybWF0aW9uLgorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAgICBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRWFydGggTW92ZXJzIERpc3RhbmNlLgorICAgIEJhc2VkIG9mIHRoZSBzb2x1dGlvbiBmb3IgdGhlIFRyYW5zcG9ydGF0aW9uIHByb2JsZW0gYXMgZGVzY3JpYmVkIGluCisgICAgIkludHJvZHVjdGlvbiB0byBNYXRoZW1hdGljYWwgUHJvZ3JhbW1pbmciIGJ5IEYuIFMuIEhpbGxpZXIgYW5kCisgICAgRy4gSi4gTGllYmVybWFuLCBNY0dyYXctSGlsbCwgMTk5MC4KKworICAgIENvcHlyaWdodCAoQykgMTk5OCBZb3NzaSBSdWJuZXIKKyAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQsIFN0YW5mb3JkIFVuaXZlcnNpdHkKKyAgICBFLU1haWw6IHJ1Ym5lckBjcy5zdGFuZm9yZC5lZHUgICBVUkw6IGh0dHA6Ly92aXNpb24uc3RhbmZvcmQuZWR1L35ydWJuZXIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyAqIENvbnN0YW50LXRpbWUgbWVkaWFuIGZpbHRlcmluZyAtLSBodHRwOi8vbm9taXM4MC5vcmcvY3RtZi5odG1sCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ltb24gUGVycmVhdWx0CisgKgorICogQ29udGFjdDoKKyAqICBMYWJvcmF0b2lyZSBkZSB2aXNpb24gZXQgc3lzdGVtZXMgbnVtZXJpcXVlcworICogIFBhdmlsbG9uIEFkcmllbi1Qb3VsaW90CisgKiAgVW5pdmVyc2l0ZSBMYXZhbAorICogIFNhaW50ZS1Gb3ksIFF1ZWJlYywgQ2FuYWRhCisgKiAgRzFLIDdQNAorICoKKyAqICBwZXJyZWF1bEBnZWwudWxhdmFsLmNhCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDT1BZUklHSFQgTk9USUNFICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgIFRoZSBmdW5jdGlvbiBmb3IgUkdCIHRvIExhYiBjb252ZXJzaW9uIGlzIGJhc2VkIG9uIHRoZSBNQVRMQUIgc2NyaXB0CisgIFJHQjJMYWIubSB0cmFuc2xhdGVkIGJ5IE1hcmsgUnV6b24gZnJvbSBDIGNvZGUgYnkgWW9zc2kgUnVibmVyLCAyMyBTZXB0ZW1iZXIgMTk5Ny4KKyAgU2VlIHRoZSBwYWdlIFtodHRwOi8vdmlzaW9uLnN0YW5mb3JkLmVkdS9+cnV6b24vc29mdHdhcmUvcmdibGFiLmh0bWxdCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgVGhpcyBwYXJ0IG9mIHRoZSBmaWxlIGltcGxlbWVudHMgSlBFRyBjb2RlYyBvbiBiYXNlIG9mIElKRyBsaWJqcGVnIGxpYnJhcnksCisgICAgaW4gcGFydGljdWxhciwgdGhpcyBpcyB0aGUgbW9kaWZpZWQgZXhhbXBsZS5kb2MgZnJvbSBsaWJqcGVnIHBhY2thZ2UuCisgICAgU2VlIG90aGVybGlicy9fZ3JhcGhpY3MvcmVhZG1lLnR4dCBmb3IgY29weXJpZ2h0IG5vdGljZS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICBBIHBhcnQgb2YgdGhlIGZpbGUgaW1wbGVtZW50cyBUSUZGIHJlYWRlciBvbiBiYXNlIG9mIGxpYnRpZmYgbGlicmFyeQorICAgIChzZWUgb3RoZXJsaWJzL19ncmFwaGljcy9yZWFkbWUudHh0IGZvciBjb3B5cmlnaHQgbm90aWNlKQorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zICh1bnRpbCAjZW5kaWYpCisgKiBpcyBhbiBleHRyYWN0IGZyb20gSVBMIGhlYWRlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDE5OTUgSW50ZWwgQ29ycG9yYXRpb24uCisgKi8KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwpkaWZmIC0tZ2l0IGEvUkVBRE1FLnJkb2MgYi9SRUFETUUucmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjhjZjcxCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLnJkb2MKQEAgLTAsMCArMSw3NiBAQAorPSBPcGVuQ1YtQW5kcm9pZAorCitEZWRpY2F0ZWQgdG8gcHJvdmlkaW5nIGFuIG9wdGltaXplZCBwb3J0IG9mIE9wZW5DViBmb3IgdGhlIEdvb2dsZSBBbmRyb2lkIE9TLgorCis9PSBSZXF1aXJlbWVudHMKKworSW4gb3JkZXIgdG8gdXNlIE9wZW5DVi1BbmRyb2lkLCB5b3Ugd2lsbCBuZWVkIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsIGJvdGggdGhlIEFuZHJvaWQgU0RLIGFuZCBOREsgdmVyc2lvbiAxLjYuICBJdCBtYXkgb3IgbWF5IG5vdCB3b3JrIHdpdGggYSBoaWdoZXIgdmVyc2lvbi4gSXQgaGFzIGJlZW4gY29uZmlybWVkIHRoYXQgdGhpcyBkb2Vzbid0IHdvcmsgd2l0aCBvbGRlciB2ZXJzaW9ucywgc28gcGxlYXNlIHVzZSAxLjYgb3IgaGlnaGVyLgorCitJbiBhZGRpdGlvbiB0byBoYXZpbmcgdGhlIFNESyBvciBOREsgeW91IHdpbGwgYWxzbyBuZWVkIHRvIGhhdmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisqIEFuIEFuZHJvaWQgUGhvbmUgRGV2IFBob25lIChNaWdodCB3b3JrIHdpdGggb3RoZXIgcGhvbmVzLCBoYXMgbm90IGJlZW4gdGVzdGVkKQorKiBBIG5ld2VyIHZlcnNpb24gb2YgdGhlIFF1aWNrVGltZSBKYXZhIExpYnJhcmllcworCitGb3IgdGhvc2Ugb2YgeW91IHJ1bm5pbmcgb24gdGhlIGVtdWxhdG9yLCBJIGJ1aWx0IGEgdmVyeSBzaW1wbGUgU29ja2V0LWJhc2VkIENhbWVyYSBzZXJ2ZXIgdGhhdCB3aWxsIHNlbmQgaW1hZ2VzIG92ZXIgYSBzb2NrZXQgY29ubmVjdGlvbi4gIFRoaXMgdXNlcyB0aGUgUXVpY2tUaW1lIGxpYnJhcmllcyB3aGljaCBhcmUgcHJlc2VudCBieSBkZWZhdWx0IG9uIE1hYyBPUyBYLCBidXQgSSBoYXZlbid0IHRlc3RlZCBvbiBvdGhlciBPU2VzLiAgSWYgaXQgZG9lc24ndCB3b3JrIGZvciB5b3UsIHlvdSBjYW4gYWx3YXlzIHRyeSB0aGUgb3JpZ2luYWwgV2ViY2FtQnJvYWRjYXN0ZXIgSSBkZXJpdmVkIG1pbmUgZnJvbSB3aGljaCB1c2VzIHRoZSBKTUYgKHdoaWNoIGRvZXNuJ3Qgd29yayB3aXRoIE1hYyBPUyBYLCBoZW5jZSB0aGUgUVRXZWJjYW1Ccm9hZGNhc3Rlcik6CitodHRwOi8vd3d3LnRvbWdpYmFyYS5jb20vYW5kcm9pZC9jYW1lcmEtc291cmNlCisKKz09IEJ1aWxkCisKK0J1aWxkaW5nIGlzIHF1aXRlIHNpbXBsZS4gIEknbSBnb2luZyB0byBhc3N1bWUgdGhhdCB5b3UgYXJlIGZhbWlsaWFyIHdpdGggQW5kcm9pZCBpZiB5b3UgYXJlIHJlYWRpbmcgdGhpcyBhbmQga2VlcCBpdCByYXRoZXIgc2hvcnQuCisKKyogQ3JlYXRlIGEgc3ltYm9saWMgbGluayBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgeW91IHB1bGxlZCB0aGUgT3BlbkNWLUFuZHJvaWQgcmVwb3NpdG9yeSB0byB5b3VyIFtBTkRST0lEX05ES19ST09UXS9hcHBzLyBkaXJlY3RvcnkuICBFeGFtcGxlczoKKyAgbG4gLXMgfi9Tb3VyY2UvT3BlbkNWLUFuZHJvaWQgb3BlbmN2CisKKyogRnJvbSB0aGUgW0FORFJPSURfTkRLX1JPT1RdIHJ1bjoKKyAgYnVpbGQvaG9zdC1zZXR1cC5zaAorCisqIE5vdyBydW46CisgIG1ha2UgQVBQPW9wZW5jdgorICAKK0J5IGRlZmF1bHQsIHRoaXMgd2lsbCBidWlsZCB0aGUgb3BlbmN2IGxpYnJhcnkgYW5kIHB1c2ggaXQgaW50bzoKK1tPUEVOQ1ZfQU5EUk9JRF9ST09UXS90ZXN0cy9WaWRlb0VtdWxhdGlvbi9saWJzCisKK1lvdSBjYW4gY2hhbmdlIHdoZXJlIHRoZSBsaWIgaXMgZGVsaXZlcmVkIGJ5IG1vZGlmeWluZyB0aGUgQVBQX1BST0pFQ1RfUEFUSCBpbjoKK1tPUEVOQ1ZfQU5EUk9JRF9ST09UXS9BcHBsaWNhdGlvbi5taworCitPbmNlIHlvdSBoYXZlIGJ1aWx0IHRoZSBPcGVuQ1YgbGlicmFyeSwgeW91IGNhbiBub3cgYnVpbGQgYW5kIFtPUEVOQ1ZfQU5EUk9JRF9ST09UXS90ZXN0cy9WaWRlb0VtdWxhdGlvbi4KKworPGI+Tk9URTo8L2I+IElmIHlvdSBwbGFuIHRvIHVzZSB0aGUgU29ja2V0IENhbWVyYSwgeW91IHdpbGwgbmVlZCB0byBidWlsZCBhbmQgcnVuIHRoZSBbT1BFTkNWX0FORFJPSURfUk9PVF0vdGVzdHMvUVRXZWJjYW1Ccm9hZGNhc3RlciBmaXJzdC4gIEFsc28sIGlmIHlvdSB1c2UgRWNsaXBzZSB0byBkZXZlbG9wIEFuZHJvaWQsIHRoZXJlIGFyZSBhbHJlYWR5IHByb2plY3RzIGRlZmluZWQgZm9yIGJvdGggb2YgdGhlc2UgYXBwbGljYXRpb25zLiAgWW91IGNhbiBzaW1wbHkgaW1wb3J0IHRoZW0gaW50byB5b3VyIHdvcmtzcGFjZS4KKworPT0gU2V0dXAKKworSWYgeW91IHdhbnQgdG8gdGVzdCBmYWNlIHRyYWNraW5nLCB0aGVuIHlvdSBuZWVkIHRvIGhhdmUgYSBIYWFyIENsYXNzaWZpZXIgQ2FzY2FkZSBYTUwuICBJIGhhdmUgcHJvdmlkZWQgb25lIGZvciB1c2UgYW5kIGl0IGlzIHN0b3JlZCBpbjoKK3Rlc3RzL2hhYXJjYXNjYWRlX2Zyb250YWxmYWNlX2FsdC54bWwKKworQmVmb3JlIGF0dGVtcHRpbmcgdG8gcnVuIHRoZSBWaWRlb0VtdWxhdG9yIGFwcGxpY2F0aW9uLCB5b3UgbXVzdCBmaXJzdCBjb3B5IHRoaXMgWE1MIGZpbGUgaW50byB0aGUgZW11bGF0b3IgaW4gdGhlIGZvbGxvd2luZyBsb2NhdGlvbjoKKy9kYXRhL2RhdGEvb3JnLnNpcHJvcC5vcGVuY3YvZmlsZXMvaGFhcmNhc2NhZGVfZnJvbnRhbGZhY2VfYWx0LnhtbAorCitDdXJyZW50bHksIHRoaXMgaXMgYSBoYXJkLWNvZGVkIHBhdGggdGhhdCB3ZSBsb29rIHVwLiAgSG9wZWZ1bGx5LCB0aGlzIGNhbiBiZSByZW1lZGllZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLgorCis9PSBSdW4KKworSW4gb3JkZXIgdG8gdXNlIHRoZSBWaWRlb0VtdWxhdG9yLCB5b3UgaGF2ZSB0byB1c2UgdGhlIGVtdWxhdG9yIChoZW5jZSB0aGUgbmFtZS4pICBJZiB5b3UgaGF2ZSBhIERldiBQaG9uZSwgeW91IGNhbiBwbGF5IGFyb3VuZCB3aXRoIHRoZSBvbGQgJ09wZW5DVlNhbXBsZScgdGVzdCBvciBtb2RpZnkgdGhlIFZpZGVvRW11bGF0b3IgdG8gc3VwcG9ydCBhIHJlYWwgY2FtZXJhLiAgVGhpcyBpcyBzb21ldGhpbmcgd2Ugd2lsbCB3b3JrIG9uIHJlc29sdmluZyBpbiB0aGUgZnV0dXJlLgorCitVc2luZyB0aGUgZW11bGF0b3IgdGhlcmUgYXJlIHR3byBzbGlnaHRseSBkaWZmZXJlbnQgJ2ZsYXZvcnMnIG9mIHJ1bm5pbmcuICBCb3RoIGFyZSBzb2NrZXQgYmFzZWQgY2FtZXJhcywgYnV0IG9uZSBpcyB3cml0dGVuIGluIEMrKyBhbmQgZW11bGF0ZXMgYSByZWFsIE9wZW5DViBDYXB0dXJlIHdoaWxlIHRoZSBvdGhlciAobG9vc2VseSkgZW11bGF0ZXMgYSBjYW1lcmEgaW1wbGVtZW50YXRpb24gaW4gSmF2YS4gIFRoZSBDKysgdmVyc2lvbiBpcyB0aGUgZGVmYXVsdCBhcyBpdCBpcyBzbGlnaHRseSBmYXN0ZXIgYW5kIHRha2VzIGEgbGl0dGxlIGxlc3MgbWVtb3J5LiAgQWxzbywgdGhlIHVsdGltYXRlIGdvYWwgaXMgdG8gaG9vayB1cCB3aXRoIGEgcmVhbCBjYW1lcmEgaW4gQysrIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBwYXNzIGh1Z2UgYW1vdW50cyBvZiBkYXRhIChpbWFnZXMpIGJhY2sgYW5kIGZvcnRoIHRocm91Z2ggdGhlIEpOSSBpbnRlcmZhY2UuCisKKzxiPk5PVEU6PC9iPiBGb3IgYWxsIG9mIHRoZXNlIGV4YW1wbGVzIHlvdSBjYW5ub3QgdXNlIGxvY2FsaG9zdCBvciAxMjcuMC4wLjEgYXMgeW91ciBhZGRyZXNzIGZvciB0aGUgc29ja2V0IGNhbWVyYS4gIFRoZSByZWFzb24gaXMgYmVjYXVzZSB3aGVuIHRoZSBjbGllbnQgaXMgcnVubmluZyBvbiB0aGUgQW5kcm9pZCBlbXVsYXRvciwgYm90aCBvZiB0aGVzZSBtYXAgdG8gQW5kcm9pZCdzIGxvY2FsaG9zdCwgbm90IHRoZSBtYWNoaW5lIHlvdSBhcmUgcnVubmluZyB0aGUgZW11bGF0b3Igb24uICBUaGlzIG1lYW5zIHlvdSBoYXZlIHRvIGJlIGNvbm5lY3RlZCB0byBhIG5ldHdvcmsgaW4gb3JkZXIgdG8gdXNlIHRoZSBzb2NrZXQgY2FtZXJhLCBhIGxpbWl0YXRpb24uCisKKz09PSBDKysKKworU2luY2UgdGhpcyBpcyB0aGUgZGVmYXVsdCwgd2UgaGF2ZSBtYWRlIGl0IHByZXR0eSBlYXN5Li4uCisKKyogU3RhcnQgdGhlIFdlYmNhbUJyb2FkY2FzdGVyIC0gdGhpcyBpcyBhIHNvY2tldCBzZXJ2ZXIgdGhhdCBncmFicyBpbWFnZXMgZnJvbSB5b3VyIGNhbWVyYSBhbmQgc2VydmVzIHRoZW0gdXAKKyogU3RhcnQgdGhlIFZpZGVvRW11bGF0b3IgLSB0aGlzIHJ1bnMgdGhlIEFuZHJvaWQgYXBwbGljYXRpb24gdGhhdCBhbGxvd3MgeW91IHRvIHRyeSBvdXQgdGhlIHZhcmlvdXMgcGllY2VzIGltcGxlbWVudGVkIHRodXMgZmFyCisqIE9uY2UgdGhlIGFwcGxpY2F0aW9uIGNvbWVzIHVwLCB5b3Ugd2lsbCBoYXZlIHRvIGNvbmZpZ3VyZSBmb3IgeW91ciBtYWNoaW5lIGFkZHJlc3MgYW5kIHBvcnQgZm9yIHRoZSBzb2NrZXQgY2FtZXJhIHRvIHdvcmsuCisqIExlYXZlIFVzZSBDKysgU29ja2V0Q2FwdHVyZSBDSEVDS0VEIQorKiBDaG9vc2Ugd2hpY2ggdGVzdCB5b3Ugd2FudCB0byBydW4uCisKKz09PSBKYXZhCisKK1RvIHVzZSBKYXZhLCB5b3UgaGF2ZSB0byBtYWtlIGEgc21hbGwgY29kZSBjaGFuZ2UuICBFdmVudHVhbGx5IHdlIHdpbGwgbWFrZSB0aGlzIGEgY29uZmlndXJhYmxlIG9wdGlvbiB3aXRob3V0IGhhdmluZyB0byBtYWtlIGEgY29kZSBjaGFuZ2UuICBUaGUgcmVhc29uIGlzIGJlY2F1c2Ugd2hlbiB3ZSBzZW5kIGRhdGEgb3ZlciBhIHNvY2tldCBmcm9tIEphdmEgdG8gSmF2YSBpdCBpcyBmYXN0ZXIgdG8gc2VuZCBzZXJpYWxpemVkIGJ1ZmZlcmVkIGltYWdlcy4gIEhvd2V2ZXIsIHdoZW4gd2Ugc2VuZCBkYXRhIHRvIEMrKywgd2UgaGF2ZSB0byBzZW5kIGEgcmF3IGJ5dGUgYXJyYXkuCisKKyogTW9kaWZ5IHRoZSBXZWJjYW1Ccm9hZGNhc3RlciBieSBjaGFuZ2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBhc3NpZ25lZCB0byBSQVcgdG8gZmFsc2UuCisqIFN0YXJ0IHRoZSBXZWJjYW1Ccm9hZGNhc3RlciAtIHRoaXMgaXMgYSBzb2NrZXQgc2VydmVyIHRoYXQgZ3JhYnMgaW1hZ2VzIGZyb20geW91ciBjYW1lcmEgYW5kIHNlcnZlcyB0aGVtIHVwCisqIFN0YXJ0IHRoZSBWaWRlb0VtdWxhdG9yIC0gdGhpcyBydW5zIHRoZSBBbmRyb2lkIGFwcGxpY2F0aW9uIHRoYXQgYWxsb3dzIHlvdSB0byB0cnkgb3V0IHRoZSB2YXJpb3VzIHBpZWNlcyBpbXBsZW1lbnRlZCB0aHVzIGZhcgorKiBPbmNlIHRoZSBhcHBsaWNhdGlvbiBjb21lcyB1cCwgeW91IHdpbGwgaGF2ZSB0byBjb25maWd1cmUgZm9yIHlvdXIgbWFjaGluZSBhZGRyZXNzIGFuZCBwb3J0IGZvciB0aGUgc29ja2V0IGNhbWVyYSB0byB3b3JrLgorKiBVTkNIRUNLIFVzZSBDKysgU29ja2V0Q2FwdHVyZSEKKyogQ2hvb3NlIHdoaWNoIHRlc3QgeW91IHdhbnQgdG8gcnVuLgpkaWZmIC0tZ2l0IGEvVkVSU0lPTi50eHQgYi9WRVJTSU9OLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjMwNTIyCi0tLSAvZGV2L251bGwKKysrIGIvVkVSU0lPTi50eHQKQEAgLTAsMCArMSw0IEBACitUaGlzIGlzIE9wZW5DViB2ZXJzaW9uIDEuMSBmb3IgQW5kcm9pZC4gSXQgd2FzIG9idGFpbmVkIGF0IGh0dHA6Ly9vcGVuY3Yud2lsbG93Z2FyYWdlLmNvbS8uCisKK1BsZWFzZSBub3RlIHRoYXQgZHVlIHRvIHBsYXRmb3JtIGFuZCBwcm9qZWN0IGNvbnN0cmFpbnRzIHRoaXMgaXMgTk9UIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBPcGVuQ1YhCisKZGlmZiAtLWdpdCBhL1dMTm9uRmlsZUJ5dGVTdHJlYW0uY3BwIGIvV0xOb25GaWxlQnl0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4YzE3NAotLS0gL2Rldi9udWxsCisrKyBiL1dMTm9uRmlsZUJ5dGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTUwIEBACisvKg0KK09wZW5DViBmb3IgQW5kcm9pZCBOREsNCitDb3B5cmlnaHQgKGMpIDIwMDYtMjAwOSBTSVByb3AgUHJvamVjdCBodHRwOi8vd3d3LnNpcHJvcC5vcmcvDQorDQorVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuDQorSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCitQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCitpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwNCitzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOg0KKw0KKzEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLg0KKzIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4NCiszLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KKyovDQorI2luY2x1ZGUgIldMTm9uRmlsZUJ5dGVTdHJlYW0uaCINCisNCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBXTE5vbkZpbGVCeXRlU3RyZWFtIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIA0KKw0KK1dMTm9uRmlsZUJ5dGVTdHJlYW06OldMTm9uRmlsZUJ5dGVTdHJlYW0oKQ0KK3sNCisgICAgbV9zdGFydCA9IG1fZW5kID0gbV9jdXJyZW50ID0gMDsNCisgICAgX3NpemUgPSAwOw0KKyAgICBtX2lzX29wZW5lZCA9IGZhbHNlOw0KK30NCisNCisNCitXTE5vbkZpbGVCeXRlU3RyZWFtOjp+V0xOb25GaWxlQnl0ZVN0cmVhbSgpDQorew0KKwlEZWFsbG9jYXRlKCk7DQorfQ0KKw0KKw0KK3ZvaWQgIFdMTm9uRmlsZUJ5dGVTdHJlYW06OkFsbG9jYXRlKGludCBkYXRhX3NpemUpDQorew0KKwlpZighbV9zdGFydCkNCisgICAgCW1fc3RhcnQgPSBuZXcgdWNoYXJbZGF0YV9zaXplXTsNCisNCisgICAgbV9lbmQgPSBtX3N0YXJ0ICsgZGF0YV9zaXplOw0KKyAgICBtX2N1cnJlbnQgPSBtX3N0YXJ0Ow0KK30NCisNCit2b2lkICBXTE5vbkZpbGVCeXRlU3RyZWFtOjpEZWFsbG9jYXRlKCkNCit7DQorCWlmKG1fc3RhcnQpDQorCXsNCisJCWRlbGV0ZSBbXSBtX3N0YXJ0Ow0KKwkJbV9zdGFydCA9IDA7DQorCX0NCit9DQorDQorYm9vbCAgV0xOb25GaWxlQnl0ZVN0cmVhbTo6T3BlbihpbnQgZGF0YV9zaXplKQ0KK3sNCisgICAgQ2xvc2UoKTsNCisgICAgQWxsb2NhdGUoZGF0YV9zaXplKTsNCisgICAgDQorICAgIG1faXNfb3BlbmVkID0gdHJ1ZTsNCisgICAgbV9jdXJyZW50ID0gbV9zdGFydDsNCisgICAgX3NpemUgPSBkYXRhX3NpemU7DQorICAgIA0KKyAgICByZXR1cm4gdHJ1ZTsNCit9DQorDQorDQordm9pZCAgV0xOb25GaWxlQnl0ZVN0cmVhbTo6Q2xvc2UoKQ0KK3sNCisgICAgbV9pc19vcGVuZWQgPSBmYWxzZTsNCisJRGVhbGxvY2F0ZSgpOw0KK30NCisNCisNCit2b2lkIFdMTm9uRmlsZUJ5dGVTdHJlYW06OlB1dEJ5dGUoIGludCB2YWwgKQ0KK3sNCisgICAgKm1fY3VycmVudCsrID0gKHVjaGFyKXZhbDsNCit9DQorDQorDQordm9pZCBXTE5vbkZpbGVCeXRlU3RyZWFtOjpQdXRCeXRlcyggY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgY291bnQgKQ0KK3sNCisgICAgdWNoYXIqIGRhdGEgPSAodWNoYXIqKWJ1ZmZlcjsNCisgICAgDQorICAgIGFzc2VydCggZGF0YSAmJiBtX2N1cnJlbnQgJiYgY291bnQgPj0gMCApOw0KKw0KKyAgICB3aGlsZSggY291bnQgKQ0KKyAgICB7DQorICAgICAgICBpbnQgbCA9IChpbnQpKG1fZW5kIC0gbV9jdXJyZW50KTsNCisgICAgICAgIA0KKyAgICAgICAgaWYoIGwgPiBjb3VudCApDQorICAgICAgICAgICAgbCA9IGNvdW50Ow0KKyAgICAgICAgDQorICAgICAgICBpZiggbCA+IDAgKQ0KKyAgICAgICAgew0KKyAgICAgICAgICAgIG1lbWNweSggbV9jdXJyZW50LCBkYXRhLCBsICk7DQorICAgICAgICAgICAgbV9jdXJyZW50ICs9IGw7DQorICAgICAgICAgICAgZGF0YSArPSBsOw0KKyAgICAgICAgICAgIGNvdW50IC09IGw7DQorICAgICAgICB9DQorICAgIH0NCit9DQorDQorDQordm9pZCBXTE5vbkZpbGVCeXRlU3RyZWFtOjpQdXRXb3JkKCBpbnQgdmFsICkNCit7DQorICAgIHVjaGFyICpjdXJyZW50ID0gbV9jdXJyZW50Ow0KKw0KKyAgICBpZiggY3VycmVudCsxIDwgbV9lbmQgKQ0KKyAgICB7DQorICAgICAgICBjdXJyZW50WzBdID0gKHVjaGFyKXZhbDsNCisgICAgICAgIGN1cnJlbnRbMV0gPSAodWNoYXIpKHZhbCA+PiA4KTsNCisgICAgICAgIG1fY3VycmVudCA9IGN1cnJlbnQgKyAyOw0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgUHV0Qnl0ZSh2YWwpOw0KKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gOCk7DQorICAgIH0NCit9DQorDQorDQordm9pZCBXTE5vbkZpbGVCeXRlU3RyZWFtOjpQdXREV29yZCggaW50IHZhbCApDQorew0KKyAgICB1Y2hhciAqY3VycmVudCA9IG1fY3VycmVudDsNCisNCisgICAgaWYoIGN1cnJlbnQrMyA8IG1fZW5kICkNCisgICAgew0KKyAgICAgICAgY3VycmVudFswXSA9ICh1Y2hhcil2YWw7DQorICAgICAgICBjdXJyZW50WzFdID0gKHVjaGFyKSh2YWwgPj4gOCk7DQorICAgICAgICBjdXJyZW50WzJdID0gKHVjaGFyKSh2YWwgPj4gMTYpOw0KKyAgICAgICAgY3VycmVudFszXSA9ICh1Y2hhcikodmFsID4+IDI0KTsNCisgICAgICAgIG1fY3VycmVudCA9IGN1cnJlbnQgKyA0Ow0KKyAgICB9DQorICAgIGVsc2UNCisgICAgew0KKyAgICAgICAgUHV0Qnl0ZSh2YWwpOw0KKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gOCk7DQorICAgICAgICBQdXRCeXRlKHZhbCA+PiAxNik7DQorICAgICAgICBQdXRCeXRlKHZhbCA+PiAyNCk7DQorICAgIH0NCit9DQorDQorDQordWNoYXIqIFdMTm9uRmlsZUJ5dGVTdHJlYW06OkdldEJ5dGUoKQ0KK3sNCisJcmV0dXJuIG1fc3RhcnQ7DQorfQ0KKw0KK2ludCBXTE5vbkZpbGVCeXRlU3RyZWFtOjpHZXRTaXplKCkNCit7DQorCXJldHVybiBfc2l6ZTsNCit9DQorDQpkaWZmIC0tZ2l0IGEvV0xOb25GaWxlQnl0ZVN0cmVhbS5oIGIvV0xOb25GaWxlQnl0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZThiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9XTE5vbkZpbGVCeXRlU3RyZWFtLmgKQEAgLTAsMCArMSw1MSBAQAorLyoNCitPcGVuQ1YgZm9yIEFuZHJvaWQgTkRLDQorQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgU0lQcm9wIFByb2plY3QgaHR0cDovL3d3dy5zaXByb3Aub3JnLw0KKw0KK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5Lg0KK0luIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQoraW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksDQorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCisNCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCisyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQorMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCisqLw0KKyNpZm5kZWYgX1dMTm9uRmlsZUJ5dGVTdHJlYW1fSF8NCisjZGVmaW5lIF9XTE5vbkZpbGVCeXRlU3RyZWFtX0hfDQorDQorI2luY2x1ZGUgPHN0ZGlvLmg+DQorI2luY2x1ZGUgImN2LmgiDQorI2luY2x1ZGUgImN4Y29yZS5oIg0KKyNpbmNsdWRlICJjdmF1eC5oIg0KKyNpbmNsdWRlICJoaWdoZ3VpLmgiDQorI2luY2x1ZGUgIm1sLmgiDQorI2luY2x1ZGUgInV0aWxzLmgiDQorDQorY2xhc3MgV0xOb25GaWxlQnl0ZVN0cmVhbSB7DQorcHVibGljOg0KKyAgICBXTE5vbkZpbGVCeXRlU3RyZWFtKCk7DQorICAgIH5XTE5vbkZpbGVCeXRlU3RyZWFtKCk7DQorDQorICAgIGJvb2wgICAgT3BlbihpbnQgZGF0YV9zaXplKTsNCisgICAgdm9pZCAgICBDbG9zZSgpOw0KKyAgICB2b2lkICAgIFB1dEJ5dGUoIGludCB2YWwgKTsNCisgICAgdm9pZCAgICBQdXRCeXRlcyggY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgY291bnQgKTsNCisgICAgdm9pZCAgICBQdXRXb3JkKCBpbnQgdmFsICk7DQorICAgIHZvaWQgICAgUHV0RFdvcmQoIGludCB2YWwgKTsgDQorICAgIHVjaGFyKiAgR2V0Qnl0ZSgpOyANCisgICAgaW50ICAgICBHZXRTaXplKCk7IA0KKw0KK3Byb3RlY3RlZDoNCisgICAgdm9pZCAgICBBbGxvY2F0ZShpbnQgZGF0YV9zaXplKTsNCisJdm9pZCAgICBEZWFsbG9jYXRlKCk7DQorICAgIGludCAgICAgX3NpemU7DQorICAgIHVjaGFyKiAgbV9zdGFydDsNCisgICAgdWNoYXIqICBtX2VuZDsNCisgICAgdWNoYXIqICBtX2N1cnJlbnQ7DQorICAgIGJvb2wgICAgbV9pc19vcGVuZWQ7DQorDQorfTsNCisNCisjZW5kaWYvKl9XTE5vbkZpbGVCeXRlU3RyZWFtX0hfKi8NCmRpZmYgLS1naXQgYS9jdi9pbmNsdWRlL2N2LmggYi9jdi9pbmNsdWRlL2N2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJlYzQ1NAotLS0gL2Rldi9udWxsCisrKyBiL2N2L2luY2x1ZGUvY3YuaApAQCAtMCwwICsxLDE0ODIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisKKyNpZm5kZWYgX0NWX0hfCisjZGVmaW5lIF9DVl9IXworCisjaWZkZWYgX19JUExfSF9fCisjZGVmaW5lIEhBVkVfSVBMCisjZW5kaWYKKworI2lmbmRlZiBTS0lQX0lOQ0xVREVTCisgICNpZiBkZWZpbmVkKF9DSF8pCisgICAgI3ByYWdtYSBwYWNrYWdlIDxjaG9wZW5jdj4KKyAgICAjaW5jbHVkZSA8Y2hkbC5oPgorICAgIExPQURfQ0hETChjdikKKyAgI2VuZGlmCisjZW5kaWYKKworI2luY2x1ZGUgImN4Y29yZS5oIgorI2luY2x1ZGUgImN2dHlwZXMuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBQcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENvcGllcyBzb3VyY2UgMkQgYXJyYXkgaW5zaWRlIG9mIHRoZSBsYXJnZXIgZGVzdGluYXRpb24gYXJyYXkgYW5kCisgICBtYWtlcyBhIGJvcmRlciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgKElQTF9CT1JERVJfKikgYXJvdW5kIHRoZSBjb3BpZWQgYXJlYS4gKi8KK0NWQVBJKHZvaWQpIGN2Q29weU1ha2VCb3JkZXIoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsIEN2UG9pbnQgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvcmRlcnR5cGUsIEN2U2NhbGFyIHZhbHVlIENWX0RFRkFVTFQoY3ZTY2FsYXJBbGwoMCkpKTsKKworI2RlZmluZSBDVl9CTFVSX05PX1NDQUxFIDAKKyNkZWZpbmUgQ1ZfQkxVUiAgMQorI2RlZmluZSBDVl9HQVVTU0lBTiAgMgorI2RlZmluZSBDVl9NRURJQU4gMworI2RlZmluZSBDVl9CSUxBVEVSQUwgNAorCisvKiBTbW9vdGhlcyBhcnJheSAocmVtb3ZlcyBub2lzZSkgKi8KK0NWQVBJKHZvaWQpIGN2U21vb3RoKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBzbW9vdGh0eXBlIENWX0RFRkFVTFQoQ1ZfR0FVU1NJQU4pLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplMSBDVl9ERUZBVUxUKDMpLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplMiBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaWdtYTEgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2lnbWEyIENWX0RFRkFVTFQoMCkpOworCisvKiBDb252b2x2ZXMgdGhlIGltYWdlIHdpdGggdGhlIGtlcm5lbCAqLworQ1ZBUEkodm9pZCkgY3ZGaWx0ZXIyRCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgY29uc3QgQ3ZNYXQqIGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgYW5jaG9yIENWX0RFRkFVTFQoY3ZQb2ludCgtMSwtMSkpKTsKKworLyogRmluZHMgaW50ZWdyYWwgaW1hZ2U6IFNVTShYLFkpID0gc3VtKHg8WCx5PFkpSSh4LHkpICovCitDVkFQSSh2b2lkKSBjdkludGVncmFsKCBjb25zdCBDdkFyciogaW1hZ2UsIEN2QXJyKiBzdW0sCisgICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBzcXN1bSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogdGlsdGVkX3N1bSBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyoKKyAgIFNtb290aGVzIHRoZSBpbnB1dCBpbWFnZSB3aXRoIGdhdXNzaWFuIGtlcm5lbCBhbmQgdGhlbiBkb3duLXNhbXBsZXMgaXQuCisgICBkc3Rfd2lkdGggPSBmbG9vcihzcmNfd2lkdGgvMilbKzFdLAorICAgZHN0X2hlaWdodCA9IGZsb29yKHNyY19oZWlnaHQvMilbKzFdCisqLworQ1ZBUEkodm9pZCkgIGN2UHlyRG93biggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXIgQ1ZfREVGQVVMVChDVl9HQVVTU0lBTl81eDUpICk7CisKKy8qIAorICAgVXAtc2FtcGxlcyBpbWFnZSBhbmQgc21vb3RoZXMgdGhlIHJlc3VsdCB3aXRoIGdhdXNzaWFuIGtlcm5lbC4KKyAgIGRzdF93aWR0aCA9IHNyY193aWR0aCoyLAorICAgZHN0X2hlaWdodCA9IHNyY19oZWlnaHQqMgorKi8KK0NWQVBJKHZvaWQpICBjdlB5clVwKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXIgQ1ZfREVGQVVMVChDVl9HQVVTU0lBTl81eDUpICk7CisKKy8qIEJ1aWxkcyBweXJhbWlkIGZvciBhbiBpbWFnZSAqLworQ1ZBUEkoQ3ZNYXQqKikgY3ZDcmVhdGVQeXJhbWlkKCBjb25zdCBDdkFyciogaW1nLCBpbnQgZXh0cmFfbGF5ZXJzLCBkb3VibGUgcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTaXplKiBsYXllcl9zaXplcyBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogYnVmYXJyIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYWxjIENWX0RFRkFVTFQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWx0ZXIgQ1ZfREVGQVVMVChDVl9HQVVTU0lBTl81eDUpICk7CisKKy8qIFJlbGVhc2VzIHB5cmFtaWQgKi8KK0NWQVBJKHZvaWQpICBjdlJlbGVhc2VQeXJhbWlkKCBDdk1hdCoqKiBweXJhbWlkLCBpbnQgZXh0cmFfbGF5ZXJzICk7CisKKworLyogU3BsaXRzIGNvbG9yIG9yIGdyYXlzY2FsZSBpbWFnZSBpbnRvIG11bHRpcGxlIGNvbm5lY3RlZCBjb21wb25lbnRzCisgICBvZiBuZWFybHkgdGhlIHNhbWUgY29sb3IvYnJpZ2h0bmVzcyB1c2luZyBtb2RpZmljYXRpb24gb2YgQnVydCBhbGdvcml0aG0uCisgICBjb21wIHdpdGggY29udGFpbiBhIHBvaW50ZXIgdG8gc2VxdWVuY2UgKEN2U2VxKQorICAgb2YgY29ubmVjdGVkIGNvbXBvbmVudHMgKEN2Q29ubmVjdGVkQ29tcCkgKi8KK0NWQVBJKHZvaWQpIGN2UHlyU2VnbWVudGF0aW9uKCBJcGxJbWFnZSogc3JjLCBJcGxJbWFnZSogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBDdlNlcSoqIGNvbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIGRvdWJsZSB0aHJlc2hvbGQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZDIgKTsKKworLyogRmlsdGVycyBpbWFnZSB1c2luZyBtZWFuc2hpZnQgYWxnb3JpdGhtICovCitDVkFQSSh2b2lkKSBjdlB5ck1lYW5TaGlmdEZpbHRlcmluZyggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgCisgICAgZG91YmxlIHNwLCBkb3VibGUgc3IsIGludCBtYXhfbGV2ZWwgQ1ZfREVGQVVMVCgxKSwKKyAgICBDdlRlcm1Dcml0ZXJpYSB0ZXJtY3JpdCBDVl9ERUZBVUxUKGN2VGVybUNyaXRlcmlhKENWX1RFUk1DUklUX0lURVIrQ1ZfVEVSTUNSSVRfRVBTLDUsMSkpKTsKKworLyogU2VnbWVudHMgaW1hZ2UgdXNpbmcgc2VlZCAibWFya2VycyIgKi8KK0NWQVBJKHZvaWQpIGN2V2F0ZXJzaGVkKCBjb25zdCBDdkFyciogaW1hZ2UsIEN2QXJyKiBtYXJrZXJzICk7CisKKyNkZWZpbmUgQ1ZfSU5QQUlOVF9OUyAgICAgIDAKKyNkZWZpbmUgQ1ZfSU5QQUlOVF9URUxFQSAgIDEKKworLyogSW5wYWludHMgdGhlIHNlbGVjdGVkIHJlZ2lvbiBpbiB0aGUgaW1hZ2UgKi8KK0NWQVBJKHZvaWQpIGN2SW5wYWludCggY29uc3QgQ3ZBcnIqIHNyYywgY29uc3QgQ3ZBcnIqIGlucGFpbnRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRzdCwgZG91YmxlIGlucGFpbnRSYW5nZSwgaW50IGZsYWdzICk7CisKKyNkZWZpbmUgQ1ZfU0NIQVJSIC0xCisjZGVmaW5lIENWX01BWF9TT0JFTF9LU0laRSA3CisKKy8qIENhbGN1bGF0ZXMgYW4gaW1hZ2UgZGVyaXZhdGl2ZSB1c2luZyBnZW5lcmFsaXplZCBTb2JlbAorICAgKGFwZXJ0dXJlX3NpemUgPSAxLDMsNSw3KSBvciBTY2hhcnIgKGFwZXJ0dXJlX3NpemUgPSAtMSkgb3BlcmF0b3IuCisgICBTY2hhcnIgY2FuIGJlIHVzZWQgb25seSBmb3IgdGhlIGZpcnN0IGR4IG9yIGR5IGRlcml2YXRpdmUgKi8KK0NWQVBJKHZvaWQpIGN2U29iZWwoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgIGludCB4b3JkZXIsIGludCB5b3JkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCBhcGVydHVyZV9zaXplIENWX0RFRkFVTFQoMykpOworCisvKiBDYWxjdWxhdGVzIHRoZSBpbWFnZSBMYXBsYWNpYW46IChkMi9keCArIGQyL2R5KUkgKi8KK0NWQVBJKHZvaWQpIGN2TGFwbGFjZSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXBlcnR1cmVfc2l6ZSBDVl9ERUZBVUxUKDMpICk7CisKKy8qIENvbnN0YW50cyBmb3IgY29sb3IgY29udmVyc2lvbiAqLworI2RlZmluZSAgQ1ZfQkdSMkJHUkEgICAgMAorI2RlZmluZSAgQ1ZfUkdCMlJHQkEgICAgQ1ZfQkdSMkJHUkEKKworI2RlZmluZSAgQ1ZfQkdSQTJCR1IgICAgMQorI2RlZmluZSAgQ1ZfUkdCQTJSR0IgICAgQ1ZfQkdSQTJCR1IKKworI2RlZmluZSAgQ1ZfQkdSMlJHQkEgICAgMgorI2RlZmluZSAgQ1ZfUkdCMkJHUkEgICAgQ1ZfQkdSMlJHQkEKKworI2RlZmluZSAgQ1ZfUkdCQTJCR1IgICAgMworI2RlZmluZSAgQ1ZfQkdSQTJSR0IgICAgQ1ZfUkdCQTJCR1IKKworI2RlZmluZSAgQ1ZfQkdSMlJHQiAgICAgNAorI2RlZmluZSAgQ1ZfUkdCMkJHUiAgICAgQ1ZfQkdSMlJHQgorCisjZGVmaW5lICBDVl9CR1JBMlJHQkEgICA1CisjZGVmaW5lICBDVl9SR0JBMkJHUkEgICBDVl9CR1JBMlJHQkEKKworI2RlZmluZSAgQ1ZfQkdSMkdSQVkgICAgNgorI2RlZmluZSAgQ1ZfUkdCMkdSQVkgICAgNworI2RlZmluZSAgQ1ZfR1JBWTJCR1IgICAgOAorI2RlZmluZSAgQ1ZfR1JBWTJSR0IgICAgQ1ZfR1JBWTJCR1IKKyNkZWZpbmUgIENWX0dSQVkyQkdSQSAgIDkKKyNkZWZpbmUgIENWX0dSQVkyUkdCQSAgIENWX0dSQVkyQkdSQQorI2RlZmluZSAgQ1ZfQkdSQTJHUkFZICAgMTAKKyNkZWZpbmUgIENWX1JHQkEyR1JBWSAgIDExCisKKyNkZWZpbmUgIENWX0JHUjJCR1I1NjUgIDEyCisjZGVmaW5lICBDVl9SR0IyQkdSNTY1ICAxMworI2RlZmluZSAgQ1ZfQkdSNTY1MkJHUiAgMTQKKyNkZWZpbmUgIENWX0JHUjU2NTJSR0IgIDE1CisjZGVmaW5lICBDVl9CR1JBMkJHUjU2NSAxNgorI2RlZmluZSAgQ1ZfUkdCQTJCR1I1NjUgMTcKKyNkZWZpbmUgIENWX0JHUjU2NTJCR1JBIDE4CisjZGVmaW5lICBDVl9CR1I1NjUyUkdCQSAxOQorCisjZGVmaW5lICBDVl9HUkFZMkJHUjU2NSAyMAorI2RlZmluZSAgQ1ZfQkdSNTY1MkdSQVkgMjEKKworI2RlZmluZSAgQ1ZfQkdSMkJHUjU1NSAgMjIKKyNkZWZpbmUgIENWX1JHQjJCR1I1NTUgIDIzCisjZGVmaW5lICBDVl9CR1I1NTUyQkdSICAyNAorI2RlZmluZSAgQ1ZfQkdSNTU1MlJHQiAgMjUKKyNkZWZpbmUgIENWX0JHUkEyQkdSNTU1IDI2CisjZGVmaW5lICBDVl9SR0JBMkJHUjU1NSAyNworI2RlZmluZSAgQ1ZfQkdSNTU1MkJHUkEgMjgKKyNkZWZpbmUgIENWX0JHUjU1NTJSR0JBIDI5CisKKyNkZWZpbmUgIENWX0dSQVkyQkdSNTU1IDMwCisjZGVmaW5lICBDVl9CR1I1NTUyR1JBWSAzMQorCisjZGVmaW5lICBDVl9CR1IyWFlaICAgICAzMgorI2RlZmluZSAgQ1ZfUkdCMlhZWiAgICAgMzMKKyNkZWZpbmUgIENWX1hZWjJCR1IgICAgIDM0CisjZGVmaW5lICBDVl9YWVoyUkdCICAgICAzNQorCisjZGVmaW5lICBDVl9CR1IyWUNyQ2IgICAzNgorI2RlZmluZSAgQ1ZfUkdCMllDckNiICAgMzcKKyNkZWZpbmUgIENWX1lDckNiMkJHUiAgIDM4CisjZGVmaW5lICBDVl9ZQ3JDYjJSR0IgICAzOQorCisjZGVmaW5lICBDVl9CR1IySFNWICAgICA0MAorI2RlZmluZSAgQ1ZfUkdCMkhTViAgICAgNDEKKworI2RlZmluZSAgQ1ZfQkdSMkxhYiAgICAgNDQKKyNkZWZpbmUgIENWX1JHQjJMYWIgICAgIDQ1CisKKyNkZWZpbmUgIENWX0JheWVyQkcyQkdSIDQ2CisjZGVmaW5lICBDVl9CYXllckdCMkJHUiA0NworI2RlZmluZSAgQ1ZfQmF5ZXJSRzJCR1IgNDgKKyNkZWZpbmUgIENWX0JheWVyR1IyQkdSIDQ5CisKKyNkZWZpbmUgIENWX0JheWVyQkcyUkdCIENWX0JheWVyUkcyQkdSCisjZGVmaW5lICBDVl9CYXllckdCMlJHQiBDVl9CYXllckdSMkJHUgorI2RlZmluZSAgQ1ZfQmF5ZXJSRzJSR0IgQ1ZfQmF5ZXJCRzJCR1IKKyNkZWZpbmUgIENWX0JheWVyR1IyUkdCIENWX0JheWVyR0IyQkdSCisKKyNkZWZpbmUgIENWX0JHUjJMdXYgICAgIDUwCisjZGVmaW5lICBDVl9SR0IyTHV2ICAgICA1MQorI2RlZmluZSAgQ1ZfQkdSMkhMUyAgICAgNTIKKyNkZWZpbmUgIENWX1JHQjJITFMgICAgIDUzCisKKyNkZWZpbmUgIENWX0hTVjJCR1IgICAgIDU0CisjZGVmaW5lICBDVl9IU1YyUkdCICAgICA1NQorCisjZGVmaW5lICBDVl9MYWIyQkdSICAgICA1NgorI2RlZmluZSAgQ1ZfTGFiMlJHQiAgICAgNTcKKyNkZWZpbmUgIENWX0x1djJCR1IgICAgIDU4CisjZGVmaW5lICBDVl9MdXYyUkdCICAgICA1OQorI2RlZmluZSAgQ1ZfSExTMkJHUiAgICAgNjAKKyNkZWZpbmUgIENWX0hMUzJSR0IgICAgIDYxCisKKyNkZWZpbmUgIENWX0NPTE9SQ1ZUX01BWCAgMTAwCisKKy8qIENvbnZlcnRzIGlucHV0IGFycmF5IHBpeGVscyBmcm9tIG9uZSBjb2xvciBzcGFjZSB0byBhbm90aGVyICovCitDVkFQSSh2b2lkKSAgY3ZDdnRDb2xvciggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgaW50IGNvZGUgKTsKKworI2RlZmluZSAgQ1ZfSU5URVJfTk4gICAgICAgIDAKKyNkZWZpbmUgIENWX0lOVEVSX0xJTkVBUiAgICAxCisjZGVmaW5lICBDVl9JTlRFUl9DVUJJQyAgICAgMgorI2RlZmluZSAgQ1ZfSU5URVJfQVJFQSAgICAgIDMKKworI2RlZmluZSAgQ1ZfV0FSUF9GSUxMX09VVExJRVJTIDgKKyNkZWZpbmUgIENWX1dBUlBfSU5WRVJTRV9NQVAgIDE2CisKKy8qIFJlc2l6ZXMgaW1hZ2UgKGlucHV0IGFycmF5IGlzIHJlc2l6ZWQgdG8gZml0IHRoZSBkZXN0aW5hdGlvbiBhcnJheSkgKi8KK0NWQVBJKHZvaWQpICBjdlJlc2l6ZSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGludGVycG9sYXRpb24gQ1ZfREVGQVVMVCggQ1ZfSU5URVJfTElORUFSICkpOworCisvKiBXYXJwcyBpbWFnZSB3aXRoIGFmZmluZSB0cmFuc2Zvcm0gKi8gCitDVkFQSSh2b2lkKSAgY3ZXYXJwQWZmaW5lKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LCBjb25zdCBDdk1hdCogbWFwX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKENWX0lOVEVSX0xJTkVBUitDVl9XQVJQX0ZJTExfT1VUTElFUlMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgZmlsbHZhbCBDVl9ERUZBVUxUKGN2U2NhbGFyQWxsKDApKSApOworCisvKiBDb21wdXRlcyBhZmZpbmUgdHJhbnNmb3JtIG1hdHJpeCBmb3IgbWFwcGluZyBzcmNbaV0gdG8gZHN0W2ldIChpPTAsMSwyKSAqLworQ1ZBUEkoQ3ZNYXQqKSBjdkdldEFmZmluZVRyYW5zZm9ybSggY29uc3QgQ3ZQb2ludDJEMzJmICogc3JjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2UG9pbnQyRDMyZiAqIGRzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqIG1hcF9tYXRyaXggKTsKKworLyogQ29tcHV0ZXMgcm90YXRpb25fbWF0cml4IG1hdHJpeCAqLworQ1ZBUEkoQ3ZNYXQqKSAgY3YyRFJvdGF0aW9uTWF0cml4KCBDdlBvaW50MkQzMmYgY2VudGVyLCBkb3VibGUgYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSwgQ3ZNYXQqIG1hcF9tYXRyaXggKTsKKworLyogV2FycHMgaW1hZ2Ugd2l0aCBwZXJzcGVjdGl2ZSAocHJvamVjdGl2ZSkgdHJhbnNmb3JtICovCitDVkFQSSh2b2lkKSAgY3ZXYXJwUGVyc3BlY3RpdmUoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsIGNvbnN0IEN2TWF0KiBtYXBfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgQ1ZfREVGQVVMVChDVl9JTlRFUl9MSU5FQVIrQ1ZfV0FSUF9GSUxMX09VVExJRVJTKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgZmlsbHZhbCBDVl9ERUZBVUxUKGN2U2NhbGFyQWxsKDApKSApOworCisvKiBDb21wdXRlcyBwZXJzcGVjdGl2ZSB0cmFuc2Zvcm0gbWF0cml4IGZvciBtYXBwaW5nIHNyY1tpXSB0byBkc3RbaV0gKGk9MCwxLDIsMykgKi8KK0NWQVBJKEN2TWF0KikgY3ZHZXRQZXJzcGVjdGl2ZVRyYW5zZm9ybSggY29uc3QgQ3ZQb2ludDJEMzJmKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2UG9pbnQyRDMyZiogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogbWFwX21hdHJpeCApOworCisvKiBQZXJmb3JtcyBnZW5lcmljIGdlb21ldHJpYyB0cmFuc2Zvcm1hdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGUgbWFwcyAqLworQ1ZBUEkodm9pZCkgIGN2UmVtYXAoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hcHgsIGNvbnN0IEN2QXJyKiBtYXB5LAorICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKENWX0lOVEVSX0xJTkVBUitDVl9XQVJQX0ZJTExfT1VUTElFUlMpLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIGZpbGx2YWwgQ1ZfREVGQVVMVChjdlNjYWxhckFsbCgwKSkgKTsKKworLyogQ29udmVydHMgbWFweCAmIG1hcHkgZnJvbSBmbG9hdGluZy1wb2ludCB0byBpbnRlZ2VyIGZvcm1hdHMgZm9yIGN2UmVtYXAgKi8KK0NWQVBJKHZvaWQpICBjdkNvbnZlcnRNYXBzKCBjb25zdCBDdkFyciogbWFweCwgY29uc3QgQ3ZBcnIqIG1hcHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIG1hcHh5LCBDdkFyciogbWFwYWxwaGEgKTsKKworLyogUGVyZm9ybXMgZm9yd2FyZCBvciBpbnZlcnNlIGxvZy1wb2xhciBpbWFnZSB0cmFuc2Zvcm0gKi8KK0NWQVBJKHZvaWQpICBjdkxvZ1BvbGFyKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBjZW50ZXIsIGRvdWJsZSBNLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKENWX0lOVEVSX0xJTkVBUitDVl9XQVJQX0ZJTExfT1VUTElFUlMpKTsKKworI2RlZmluZSAgQ1ZfU0hBUEVfUkVDVCAgICAgIDAKKyNkZWZpbmUgIENWX1NIQVBFX0NST1NTICAgICAxCisjZGVmaW5lICBDVl9TSEFQRV9FTExJUFNFICAgMgorI2RlZmluZSAgQ1ZfU0hBUEVfQ1VTVE9NICAgIDEwMAorCisvKiBjcmVhdGVzIHN0cnVjdHVyaW5nIGVsZW1lbnQgdXNlZCBmb3IgbW9ycGhvbG9naWNhbCBvcGVyYXRpb25zICovCitDVkFQSShJcGxDb252S2VybmVsKikgIGN2Q3JlYXRlU3RydWN0dXJpbmdFbGVtZW50RXgoCisgICAgICAgICAgICBpbnQgY29scywgaW50ICByb3dzLCBpbnQgIGFuY2hvcl94LCBpbnQgIGFuY2hvcl95LAorICAgICAgICAgICAgaW50IHNoYXBlLCBpbnQqIHZhbHVlcyBDVl9ERUZBVUxUKE5VTEwpICk7CisKKy8qIHJlbGVhc2VzIHN0cnVjdHVyaW5nIGVsZW1lbnQgKi8KK0NWQVBJKHZvaWQpICBjdlJlbGVhc2VTdHJ1Y3R1cmluZ0VsZW1lbnQoIElwbENvbnZLZXJuZWwqKiBlbGVtZW50ICk7CisKKy8qIGVyb2RlcyBpbnB1dCBpbWFnZSAoYXBwbGllcyBtaW5pbXVtIGZpbHRlcikgb25lIG9yIG1vcmUgdGltZXMuCisgICBJZiBlbGVtZW50IHBvaW50ZXIgaXMgTlVMTCwgM3gzIHJlY3Rhbmd1bGFyIGVsZW1lbnQgaXMgdXNlZCAqLworQ1ZBUEkodm9pZCkgIGN2RXJvZGUoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgSXBsQ29udktlcm5lbCogZWxlbWVudCBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25zIENWX0RFRkFVTFQoMSkgKTsKKworLyogZGlsYXRlcyBpbnB1dCBpbWFnZSAoYXBwbGllcyBtYXhpbXVtIGZpbHRlcikgb25lIG9yIG1vcmUgdGltZXMuCisgICBJZiBlbGVtZW50IHBvaW50ZXIgaXMgTlVMTCwgM3gzIHJlY3Rhbmd1bGFyIGVsZW1lbnQgaXMgdXNlZCAqLworQ1ZBUEkodm9pZCkgIGN2RGlsYXRlKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBJcGxDb252S2VybmVsKiBlbGVtZW50IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpdGVyYXRpb25zIENWX0RFRkFVTFQoMSkgKTsKKworI2RlZmluZSBDVl9NT1BfT1BFTiAgICAgICAgIDIKKyNkZWZpbmUgQ1ZfTU9QX0NMT1NFICAgICAgICAzCisjZGVmaW5lIENWX01PUF9HUkFESUVOVCAgICAgNAorI2RlZmluZSBDVl9NT1BfVE9QSEFUICAgICAgIDUKKyNkZWZpbmUgQ1ZfTU9QX0JMQUNLSEFUICAgICA2CisKKy8qIFBlcmZvcm1zIGNvbXBsZXggbW9ycGhvbG9naWNhbCB0cmFuc2Zvcm1hdGlvbiAqLworQ1ZBUEkodm9pZCkgIGN2TW9ycGhvbG9neUV4KCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogdGVtcCwgSXBsQ29udktlcm5lbCogZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wZXJhdGlvbiwgaW50IGl0ZXJhdGlvbnMgQ1ZfREVGQVVMVCgxKSApOworCisvKiBDYWxjdWxhdGVzIGFsbCBzcGF0aWFsIGFuZCBjZW50cmFsIG1vbWVudHMgdXAgdG8gdGhlIDNyZCBvcmRlciAqLworQ1ZBUEkodm9pZCkgY3ZNb21lbnRzKCBjb25zdCBDdkFyciogYXJyLCBDdk1vbWVudHMqIG1vbWVudHMsIGludCBiaW5hcnkgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIFJldHJpZXZlIHBhcnRpY3VsYXIgc3BhdGlhbCwgY2VudHJhbCBvciBub3JtYWxpemVkIGNlbnRyYWwgbW9tZW50cyAqLworQ1ZBUEkoZG91YmxlKSAgY3ZHZXRTcGF0aWFsTW9tZW50KCBDdk1vbWVudHMqIG1vbWVudHMsIGludCB4X29yZGVyLCBpbnQgeV9vcmRlciApOworQ1ZBUEkoZG91YmxlKSAgY3ZHZXRDZW50cmFsTW9tZW50KCBDdk1vbWVudHMqIG1vbWVudHMsIGludCB4X29yZGVyLCBpbnQgeV9vcmRlciApOworQ1ZBUEkoZG91YmxlKSAgY3ZHZXROb3JtYWxpemVkQ2VudHJhbE1vbWVudCggQ3ZNb21lbnRzKiBtb21lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhfb3JkZXIsIGludCB5X29yZGVyICk7CisKKy8qIENhbGN1bGF0ZXMgNyBIdSdzIGludmFyaWFudHMgZnJvbSBwcmVjYWxjdWxhdGVkIHNwYXRpYWwgYW5kIGNlbnRyYWwgbW9tZW50cyAqLworQ1ZBUEkodm9pZCkgY3ZHZXRIdU1vbWVudHMoIEN2TW9tZW50cyogIG1vbWVudHMsIEN2SHVNb21lbnRzKiAgaHVfbW9tZW50cyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogZGF0YSBzYW1wbGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmV0Y2hlcyBwaXhlbHMgdGhhdCBiZWxvbmcgdG8gdGhlIHNwZWNpZmllZCBsaW5lIHNlZ21lbnQgYW5kIHN0b3JlcyB0aGVtIHRvIHRoZSBidWZmZXIuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmV0cmlldmVkIHBvaW50cy4gKi8KK0NWQVBJKGludCkgIGN2U2FtcGxlTGluZSggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdlBvaW50IHB0MSwgQ3ZQb2ludCBwdDIsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5lY3Rpdml0eSBDVl9ERUZBVUxUKDgpKTsKKworLyogUmV0cmlldmVzIHRoZSByZWN0YW5ndWxhciBpbWFnZSByZWdpb24gd2l0aCBzcGVjaWZpZWQgY2VudGVyIGZyb20gdGhlIGlucHV0IGFycmF5LgorIGRzdCh4LHkpIDwtIHNyYyh4ICsgY2VudGVyLnggLSBkc3Rfd2lkdGgvMiwgeSArIGNlbnRlci55IC0gZHN0X2hlaWdodC8yKS4KKyBWYWx1ZXMgb2YgcGl4ZWxzIHdpdGggZnJhY3Rpb25hbCBjb29yZGluYXRlcyBhcmUgcmV0cmlldmVkIHVzaW5nIGJpbGluZWFyIGludGVycG9sYXRpb24qLworQ1ZBUEkodm9pZCkgIGN2R2V0UmVjdFN1YlBpeCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgQ3ZQb2ludDJEMzJmIGNlbnRlciApOworCisKKy8qIFJldHJpZXZlcyBxdWFkcmFuZ2xlIGZyb20gdGhlIGlucHV0IGFycmF5LgorICAgIG1hdHJpeGFyciA9ICggYTExICBhMTIgfCBiMSApICAgZHN0KHgseSkgPC0gc3JjKEFbeCB5XScgKyBiKQorICAgICAgICAgICAgICAgICggYTIxICBhMjIgfCBiMiApICAgKGJpbGluZWFyIGludGVycG9sYXRpb24gaXMgdXNlZCB0byByZXRyaWV2ZSBwaXhlbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGZyYWN0aW9uYWwgY29vcmRpbmF0ZXMpCisqLworQ1ZBUEkodm9pZCkgIGN2R2V0UXVhZHJhbmdsZVN1YlBpeCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtYXBfbWF0cml4ICk7CisKKy8qIE1ldGhvZHMgZm9yIGNvbXBhcmluZyB0d28gYXJyYXkgKi8KKyNkZWZpbmUgIENWX1RNX1NRRElGRiAgICAgICAgMAorI2RlZmluZSAgQ1ZfVE1fU1FESUZGX05PUk1FRCAxCisjZGVmaW5lICBDVl9UTV9DQ09SUiAgICAgICAgIDIKKyNkZWZpbmUgIENWX1RNX0NDT1JSX05PUk1FRCAgMworI2RlZmluZSAgQ1ZfVE1fQ0NPRUZGICAgICAgICA0CisjZGVmaW5lICBDVl9UTV9DQ09FRkZfTk9STUVEIDUKKworLyogTWVhc3VyZXMgc2ltaWxhcml0eSBiZXR3ZWVuIHRlbXBsYXRlIGFuZCBvdmVybGFwcGVkIHdpbmRvd3MgaW4gdGhlIHNvdXJjZSBpbWFnZQorICAgYW5kIGZpbGxzIHRoZSByZXN1bHRhbnQgaW1hZ2Ugd2l0aCB0aGUgbWVhc3VyZW1lbnRzICovCitDVkFQSSh2b2lkKSAgY3ZNYXRjaFRlbXBsYXRlKCBjb25zdCBDdkFyciogaW1hZ2UsIGNvbnN0IEN2QXJyKiB0ZW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiByZXN1bHQsIGludCBtZXRob2QgKTsKKworLyogQ29tcHV0ZXMgZWFydGggbW92ZXIgZGlzdGFuY2UgYmV0d2VlbgorICAgdHdvIHdlaWdodGVkIHBvaW50IHNldHMgKGNhbGxlZCBzaWduYXR1cmVzKSAqLworQ1ZBUEkoZmxvYXQpICBjdkNhbGNFTUQyKCBjb25zdCBDdkFyciogc2lnbmF0dXJlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHNpZ25hdHVyZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdkRpc3RhbmNlRnVuY3Rpb24gZGlzdGFuY2VfZnVuYyBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogY29zdF9tYXRyaXggQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGZsb3cgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxvd2VyX2JvdW5kIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhIENWX0RFRkFVTFQoTlVMTCkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250b3VycyByZXRyaWV2aW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJldHJpZXZlcyBvdXRlciBhbmQgb3B0aW9uYWxseSBpbm5lciBib3VuZGFyaWVzIG9mIHdoaXRlIChub24temVybykgY29ubmVjdGVkCisgICBjb21wb25lbnRzIGluIHRoZSBibGFjayAoemVybykgYmFja2dyb3VuZCAqLworQ1ZBUEkoaW50KSAgY3ZGaW5kQ29udG91cnMoIEN2QXJyKiBpbWFnZSwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBDdlNlcSoqIGZpcnN0X2NvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRlcl9zaXplIENWX0RFRkFVTFQoc2l6ZW9mKEN2Q29udG91cikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlIENWX0RFRkFVTFQoQ1ZfUkVUUl9MSVNUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kIENWX0RFRkFVTFQoQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBvZmZzZXQgQ1ZfREVGQVVMVChjdlBvaW50KDAsMCkpKTsKKworCisvKiBJbml0YWxpemVzIGNvbnRvdXIgcmV0cmlldmluZyBwcm9jZXNzLgorICAgQ2FsbHMgY3ZTdGFydEZpbmRDb250b3Vycy4KKyAgIENhbGxzIGN2RmluZE5leHRDb250b3VyIHVudGlsIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZAorICAgb3Igc29tZSBvdGhlciBjb25kaXRpb24gYmVjb21lcyB0cnVlLgorICAgQ2FsbHMgY3ZFbmRGaW5kQ29udG91cnMgYXQgdGhlIGVuZC4gKi8KK0NWQVBJKEN2Q29udG91clNjYW5uZXIpICBjdlN0YXJ0RmluZENvbnRvdXJzKCBDdkFyciogaW1hZ2UsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyX3NpemUgQ1ZfREVGQVVMVChzaXplb2YoQ3ZDb250b3VyKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUgQ1ZfREVGQVVMVChDVl9SRVRSX0xJU1QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QgQ1ZfREVGQVVMVChDVl9DSEFJTl9BUFBST1hfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IG9mZnNldCBDVl9ERUZBVUxUKGN2UG9pbnQoMCwwKSkpOworCisvKiBSZXRyaWV2ZXMgbmV4dCBjb250b3VyICovCitDVkFQSShDdlNlcSopICBjdkZpbmROZXh0Q29udG91ciggQ3ZDb250b3VyU2Nhbm5lciBzY2FubmVyICk7CisKKworLyogU3Vic3RpdHV0ZXMgdGhlIGxhc3QgcmV0cmlldmVkIGNvbnRvdXIgd2l0aCB0aGUgbmV3IG9uZQorICAgKGlmIHRoZSBzdWJzdGl0dXRvciBpcyBudWxsLCB0aGUgbGFzdCByZXRyaWV2ZWQgY29udG91ciBpcyByZW1vdmVkIGZyb20gdGhlIHRyZWUpICovCitDVkFQSSh2b2lkKSAgIGN2U3Vic3RpdHV0ZUNvbnRvdXIoIEN2Q29udG91clNjYW5uZXIgc2Nhbm5lciwgQ3ZTZXEqIG5ld19jb250b3VyICk7CisKKworLyogUmVsZWFzZXMgY29udG91ciBzY2FubmVyIGFuZCByZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGZpcnN0IG91dGVyIGNvbnRvdXIgKi8KK0NWQVBJKEN2U2VxKikgIGN2RW5kRmluZENvbnRvdXJzKCBDdkNvbnRvdXJTY2FubmVyKiBzY2FubmVyICk7CisKKy8qIEFwcHJveGltYXRlcyBhIHNpbmdsZSBGcmVlbWFuIGNoYWluIG9yIGEgdHJlZSBvZiBjaGFpbnMgdG8gcG9seWdvbmFsIGN1cnZlcyAqLworQ1ZBUEkoQ3ZTZXEqKSBjdkFwcHJveENoYWlucyggQ3ZTZXEqIHNyY19zZXEsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kIENWX0RFRkFVTFQoQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtZXRlciBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgbWluaW1hbF9wZXJpbWV0ZXIgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIHJlY3Vyc2l2ZSBDVl9ERUZBVUxUKDApKTsKKworCisvKiBJbml0YWxpemVzIEZyZWVtYW4gY2hhaW4gcmVhZGVyLgorICAgVGhlIHJlYWRlciBpcyB1c2VkIHRvIGl0ZXJhdGl2ZWx5IGdldCBjb29yZGluYXRlcyBvZiBhbGwgdGhlIGNoYWluIHBvaW50cy4KKyAgIElmIHRoZSBGcmVlbWFuIGNvZGVzIHNob3VsZCBiZSByZWFkIGFzIGlzLCBhIHNpbXBsZSBzZXF1ZW5jZSByZWFkZXIgc2hvdWxkIGJlIHVzZWQgKi8KK0NWQVBJKHZvaWQpIGN2U3RhcnRSZWFkQ2hhaW5Qb2ludHMoIEN2Q2hhaW4qIGNoYWluLCBDdkNoYWluUHRSZWFkZXIqIHJlYWRlciApOworCisvKiBSZXRyaWV2ZXMgdGhlIG5leHQgY2hhaW4gcG9pbnQgKi8KK0NWQVBJKEN2UG9pbnQpIGN2UmVhZENoYWluUG9pbnQoIEN2Q2hhaW5QdFJlYWRlciogcmVhZGVyICk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbiBBbmFseXNpcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG9wdGljYWwgZmxvdyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENhbGN1bGF0ZXMgb3B0aWNhbCBmbG93IGZvciAyIGltYWdlcyB1c2luZyBjbGFzc2ljYWwgTHVjYXMgJiBLYW5hZGUgYWxnb3JpdGhtICovCitDVkFQSSh2b2lkKSAgY3ZDYWxjT3B0aWNhbEZsb3dMSyggY29uc3QgQ3ZBcnIqIHByZXYsIGNvbnN0IEN2QXJyKiBjdXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSB3aW5fc2l6ZSwgQ3ZBcnIqIHZlbHgsIEN2QXJyKiB2ZWx5ICk7CisKKy8qIENhbGN1bGF0ZXMgb3B0aWNhbCBmbG93IGZvciAyIGltYWdlcyB1c2luZyBibG9jayBtYXRjaGluZyBhbGdvcml0aG0gKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNPcHRpY2FsRmxvd0JNKCBjb25zdCBDdkFyciogcHJldiwgY29uc3QgQ3ZBcnIqIGN1cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGJsb2NrX3NpemUsIEN2U2l6ZSBzaGlmdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBtYXhfcmFuZ2UsIGludCB1c2VfcHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIHZlbHgsIEN2QXJyKiB2ZWx5ICk7CisKKy8qIENhbGN1bGF0ZXMgT3B0aWNhbCBmbG93IGZvciAyIGltYWdlcyB1c2luZyBIb3JuICYgU2NodW5jayBhbGdvcml0aG0gKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNPcHRpY2FsRmxvd0hTKCBjb25zdCBDdkFyciogcHJldiwgY29uc3QgQ3ZBcnIqIGN1cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9wcmV2aW91cywgQ3ZBcnIqIHZlbHgsIEN2QXJyKiB2ZWx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYW1iZGEsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhICk7CisKKyNkZWZpbmUgIENWX0xLRkxPV19QWVJfQV9SRUFEWSAgICAgICAxCisjZGVmaW5lICBDVl9MS0ZMT1dfUFlSX0JfUkVBRFkgICAgICAgMgorI2RlZmluZSAgQ1ZfTEtGTE9XX0lOSVRJQUxfR1VFU1NFUyAgIDQKKyNkZWZpbmUgIENWX0xLRkxPV19HRVRfTUlOX0VJR0VOVkFMUyA4CisKKy8qIEl0IGlzIEx1Y2FzICYgS2FuYWRlIG1ldGhvZCwgbW9kaWZpZWQgdG8gdXNlIHB5cmFtaWRzLgorICAgQWxzbyBpdCBkb2VzIHNldmVyYWwgaXRlcmF0aW9ucyB0byBnZXQgb3B0aWNhbCBmbG93IGZvcgorICAgZXZlcnkgcG9pbnQgYXQgZXZlcnkgcHlyYW1pZCBsZXZlbC4KKyAgIENhbGN1bGF0ZXMgb3B0aWNhbCBmbG93IGJldHdlZW4gdHdvIGltYWdlcyBmb3IgY2VydGFpbiBzZXQgb2YgcG9pbnRzIChpLmUuCisgICBpdCBpcyBhICJzcGFyc2UiIG9wdGljYWwgZmxvdywgd2hpY2ggaXMgb3Bwb3NpdGUgdG8gdGhlIHByZXZpb3VzIDMgbWV0aG9kcykgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNPcHRpY2FsRmxvd1B5ckxLKCBjb25zdCBDdkFyciogIHByZXYsIGNvbnN0IEN2QXJyKiAgY3VyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogIHByZXZfcHlyLCBDdkFyciogIGN1cnJfcHlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2UG9pbnQyRDMyZiogcHJldl9mZWF0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGN1cnJfZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICB3aW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgdHJhY2tfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgY3JpdGVyaWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgIGZsYWdzICk7CisKKworLyogTW9kaWZpY2F0aW9uIG9mIGEgcHJldmlvdXMgc3BhcnNlIG9wdGljYWwgZmxvdyBhbGdvcml0aG0gdG8gY2FsY3VsYXRlCisgICBhZmZpbmUgZmxvdyAqLworQ1ZBUEkodm9pZCkgIGN2Q2FsY0FmZmluZUZsb3dQeXJMSyggY29uc3QgQ3ZBcnIqICBwcmV2LCBjb25zdCBDdkFyciogIGN1cnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogIHByZXZfcHlyLCBDdkFyciogIGN1cnJfcHlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZQb2ludDJEMzJmKiBwcmV2X2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBjdXJyX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG1hdHJpY2VzLCBpbnQgIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHdpbl9zaXplLCBpbnQgIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogc3RhdHVzLCBmbG9hdCogdHJhY2tfZXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwgaW50IGZsYWdzICk7CisKKy8qIEVzdGltYXRlIHJpZ2lkIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gMiBpbWFnZXMgb3IgMiBwb2ludCBzZXRzICovCitDVkFQSShpbnQpICBjdkVzdGltYXRlUmlnaWRUcmFuc2Zvcm0oIGNvbnN0IEN2QXJyKiBBLCBjb25zdCBDdkFyciogQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIE0sIGludCBmdWxsX2FmZmluZSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIG1vdGlvbiB0ZW1wbGF0ZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICBBbGwgdGhlIG1vdGlvbiB0ZW1wbGF0ZSBmdW5jdGlvbnMgd29yayBvbmx5IHdpdGggc2luZ2xlIGNoYW5uZWwgaW1hZ2VzLiAgICAgICAgICoKKyogICAgICAgIFNpbGhvdWV0dGUgaW1hZ2UgbXVzdCBoYXZlIGRlcHRoIElQTF9ERVBUSF84VSBvciBJUExfREVQVEhfOFMgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgTW90aW9uIGhpc3RvcnkgaW1hZ2UgbXVzdCBoYXZlIGRlcHRoIElQTF9ERVBUSF8zMkYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICBHcmFkaWVudCBtYXNrIC0gSVBMX0RFUFRIXzhVIG9yIElQTF9ERVBUSF84UywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgIE1vdGlvbiBvcmllbnRhdGlvbiBpbWFnZSAtIElQTF9ERVBUSF8zMkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICAgU2VnbWVudGF0aW9uIG1hc2sgLSBJUExfREVQVEhfMzJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqICAgICAgICBBbGwgdGhlIGFuZ2xlcyBhcmUgaW4gZGVncmVlcywgYWxsIHRoZSB0aW1lcyBhcmUgaW4gbWlsbGlzZWNvbmRzICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBVcGRhdGVzIG1vdGlvbiBoaXN0b3J5IGltYWdlIGdpdmVuIG1vdGlvbiBzaWxob3VldHRlICovCitDVkFQSSh2b2lkKSAgICBjdlVwZGF0ZU1vdGlvbkhpc3RvcnkoIGNvbnN0IEN2QXJyKiBzaWxob3VldHRlLCBDdkFyciogbWhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZXN0YW1wLCBkb3VibGUgZHVyYXRpb24gKTsKKworLyogQ2FsY3VsYXRlcyBncmFkaWVudCBvZiB0aGUgbW90aW9uIGhpc3RvcnkgaW1hZ2UgYW5kIGZpbGxzCisgICBhIG1hc2sgaW5kaWNhdGluZyB3aGVyZSB0aGUgZ3JhZGllbnQgaXMgdmFsaWQgKi8KK0NWQVBJKHZvaWQpICAgIGN2Q2FsY01vdGlvbkdyYWRpZW50KCBjb25zdCBDdkFyciogbWhpLCBDdkFyciogbWFzaywgQ3ZBcnIqIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWx0YTEsIGRvdWJsZSBkZWx0YTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwZXJ0dXJlX3NpemUgQ1ZfREVGQVVMVCgzKSk7CisKKy8qIENhbGN1bGF0ZXMgYXZlcmFnZSBtb3Rpb24gZGlyZWN0aW9uIHdpdGhpbiBhIHNlbGVjdGVkIG1vdGlvbiByZWdpb24gCisgICAocmVnaW9uIGNhbiBiZSBzZWxlY3RlZCBieSBzZXR0aW5nIFJPSXMgYW5kL29yIGJ5IGNvbXBvc2luZyBhIHZhbGlkIGdyYWRpZW50IG1hc2sKKyAgIHdpdGggdGhlIHJlZ2lvbiBtYXNrKSAqLworQ1ZBUEkoZG91YmxlKSAgY3ZDYWxjR2xvYmFsT3JpZW50YXRpb24oIGNvbnN0IEN2QXJyKiBvcmllbnRhdGlvbiwgY29uc3QgQ3ZBcnIqIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1oaSwgZG91YmxlIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHVyYXRpb24gKTsKKworLyogU3BsaXRzIGEgbW90aW9uIGhpc3RvcnkgaW1hZ2UgaW50byBhIGZldyBwYXJ0cyBjb3JyZXNwb25kaW5nIHRvIHNlcGFyYXRlIGluZGVwZW5kZW50IG1vdGlvbnMKKyAgIChlLmcuIGxlZnQgaGFuZCwgcmlnaHQgaGFuZCkgKi8KK0NWQVBJKEN2U2VxKikgIGN2U2VnbWVudE1vdGlvbiggY29uc3QgQ3ZBcnIqIG1oaSwgQ3ZBcnIqIHNlZ19tYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lc3RhbXAsIGRvdWJsZSBzZWdfdGhyZXNoICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBCYWNrZ3JvdW5kIHN0YXRpc3RpY3MgYWNjdW11bGF0aW9uICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBBZGRzIGltYWdlIHRvIGFjY3VtdWxhdG9yICovCitDVkFQSSh2b2lkKSAgY3ZBY2MoIGNvbnN0IEN2QXJyKiBpbWFnZSwgQ3ZBcnIqIHN1bSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKiBBZGRzIHNxdWFyZWQgaW1hZ2UgdG8gYWNjdW11bGF0b3IgKi8KK0NWQVBJKHZvaWQpICBjdlNxdWFyZUFjYyggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdkFyciogc3FzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogQWRkcyBhIHByb2R1Y3Qgb2YgdHdvIGltYWdlcyB0byBhY2N1bXVsYXRvciAqLworQ1ZBUEkodm9pZCkgIGN2TXVsdGlwbHlBY2MoIGNvbnN0IEN2QXJyKiBpbWFnZTEsIGNvbnN0IEN2QXJyKiBpbWFnZTIsIEN2QXJyKiBhY2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKiBBZGRzIGltYWdlIHRvIGFjY3VtdWxhdG9yIHdpdGggd2VpZ2h0czogYWNjID0gYWNjKigxLWFscGhhKSArIGltYWdlKmFscGhhICovCitDVkFQSSh2b2lkKSAgY3ZSdW5uaW5nQXZnKCBjb25zdCBDdkFyciogaW1hZ2UsIEN2QXJyKiBhY2MsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEltcGxlbWVudHMgQ0FNU0hJRlQgYWxnb3JpdGhtIC0gZGV0ZXJtaW5lcyBvYmplY3QgcG9zaXRpb24sIHNpemUgYW5kIG9yaWVudGF0aW9uCisgICBmcm9tIHRoZSBvYmplY3QgaGlzdG9ncmFtIGJhY2sgcHJvamVjdCAoZXh0ZW5zaW9uIG9mIG1lYW5zaGlmdCkgKi8KK0NWQVBJKGludCkgIGN2Q2FtU2hpZnQoIGNvbnN0IEN2QXJyKiBwcm9iX2ltYWdlLCBDdlJlY3QgIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgY3JpdGVyaWEsIEN2Q29ubmVjdGVkQ29tcCogY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZCb3gyRCogYm94IENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogSW1wbGVtZW50cyBNZWFuU2hpZnQgYWxnb3JpdGhtIC0gZGV0ZXJtaW5lcyBvYmplY3QgcG9zaXRpb24KKyAgIGZyb20gdGhlIG9iamVjdCBoaXN0b2dyYW0gYmFjayBwcm9qZWN0ICovCitDVkFQSShpbnQpICBjdk1lYW5TaGlmdCggY29uc3QgQ3ZBcnIqIHByb2JfaW1hZ2UsIEN2UmVjdCAgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgY3JpdGVyaWEsIEN2Q29ubmVjdGVkQ29tcCogY29tcCApOworCisvKiBDcmVhdGVzIENvbkRlbnNhdGlvbiBmaWx0ZXIgc3RhdGUgKi8KK0NWQVBJKEN2Q29uRGVuc2F0aW9uKikgIGN2Q3JlYXRlQ29uRGVuc2F0aW9uKCBpbnQgZHluYW1fcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lYXN1cmVfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9jb3VudCApOworCisvKiBSZWxlYXNlcyBDb25EZW5zYXRpb24gZmlsdGVyIHN0YXRlICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlQ29uRGVuc2F0aW9uKCBDdkNvbkRlbnNhdGlvbioqIGNvbmRlbnMgKTsKKworLyogVXBkYXRlcyBDb25EZW5zYXRpb24gZmlsdGVyIGJ5IHRpbWUgKHByZWRpY3QgZnV0dXJlIHN0YXRlIG9mIHRoZSBzeXN0ZW0pICovCitDVkFQSSh2b2lkKSAgY3ZDb25EZW5zVXBkYXRlQnlUaW1lKCBDdkNvbkRlbnNhdGlvbiogY29uZGVucyk7CisKKy8qIEluaXRpYWxpemVzIENvbkRlbnNhdGlvbiBmaWx0ZXIgc2FtcGxlcyAgKi8KK0NWQVBJKHZvaWQpICBjdkNvbkRlbnNJbml0U2FtcGxlU2V0KCBDdkNvbkRlbnNhdGlvbiogY29uZGVucywgQ3ZNYXQqIGxvd2VyX2JvdW5kLCBDdk1hdCogdXBwZXJfYm91bmQgKTsKKworLyogQ3JlYXRlcyBLYWxtYW4gZmlsdGVyIGFuZCBzZXRzIEEsIEIsIFEsIFIgYW5kIHN0YXRlIHRvIHNvbWUgaW5pdGlhbCB2YWx1ZXMgKi8KK0NWQVBJKEN2S2FsbWFuKikgY3ZDcmVhdGVLYWxtYW4oIGludCBkeW5hbV9wYXJhbXMsIGludCBtZWFzdXJlX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRyb2xfcGFyYW1zIENWX0RFRkFVTFQoMCkpOworCisvKiBSZWxlYXNlcyBLYWxtYW4gZmlsdGVyIHN0YXRlICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlS2FsbWFuKCBDdkthbG1hbioqIGthbG1hbik7CisKKy8qIFVwZGF0ZXMgS2FsbWFuIGZpbHRlciBieSB0aW1lIChwcmVkaWN0cyBmdXR1cmUgc3RhdGUgb2YgdGhlIHN5c3RlbSkgKi8KK0NWQVBJKGNvbnN0IEN2TWF0KikgIGN2S2FsbWFuUHJlZGljdCggQ3ZLYWxtYW4qIGthbG1hbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogY29udHJvbCBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogVXBkYXRlcyBLYWxtYW4gZmlsdGVyIGJ5IG1lYXN1cmVtZW50CisgICAoY29ycmVjdHMgc3RhdGUgb2YgdGhlIHN5c3RlbSBhbmQgaW50ZXJuYWwgbWF0cmljZXMpICovCitDVkFQSShjb25zdCBDdk1hdCopICBjdkthbG1hbkNvcnJlY3QoIEN2S2FsbWFuKiBrYWxtYW4sIGNvbnN0IEN2TWF0KiBtZWFzdXJlbWVudCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGFuYXIgc3ViZGl2aXNpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEluaXRpYWxpemVzIERlbGF1bmF5IHRyaWFuZ3VsYXRpb24gKi8KK0NWQVBJKHZvaWQpICBjdkluaXRTdWJkaXZEZWxhdW5heTJEKCBDdlN1YmRpdjJEKiBzdWJkaXYsIEN2UmVjdCByZWN0ICk7CisKKy8qIENyZWF0ZXMgbmV3IHN1YmRpdmlzaW9uICovCitDVkFQSShDdlN1YmRpdjJEKikgIGN2Q3JlYXRlU3ViZGl2MkQoIGludCBzdWJkaXZfdHlwZSwgaW50IGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnR4X3NpemUsIGludCBxdWFkZWRnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogaGlnaC1sZXZlbCBzdWJkaXZpc2lvbiBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBTaW1wbGlmaWVkIERlbGF1bmF5IGRpYWdyYW0gY3JlYXRpb24gKi8KK0NWX0lOTElORSAgQ3ZTdWJkaXYyRCogY3ZDcmVhdGVTdWJkaXZEZWxhdW5heTJEKCBDdlJlY3QgcmVjdCwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDdlN1YmRpdjJEKiBzdWJkaXYgPSBjdkNyZWF0ZVN1YmRpdjJEKCBDVl9TRVFfS0lORF9TVUJESVYyRCwgc2l6ZW9mKCpzdWJkaXYpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdlN1YmRpdjJEUG9pbnQpLCBzaXplb2YoQ3ZRdWFkRWRnZTJEKSwgc3RvcmFnZSApOworCisgICAgY3ZJbml0U3ViZGl2RGVsYXVuYXkyRCggc3ViZGl2LCByZWN0ICk7CisgICAgcmV0dXJuIHN1YmRpdjsKK30KKworCisvKiBJbnNlcnRzIG5ldyBwb2ludCB0byB0aGUgRGVsYXVuYXkgdHJpYW5ndWxhdGlvbiAqLworQ1ZBUEkoQ3ZTdWJkaXYyRFBvaW50KikgIGN2U3ViZGl2RGVsYXVuYXkyREluc2VydCggQ3ZTdWJkaXYyRCogc3ViZGl2LCBDdlBvaW50MkQzMmYgcHQpOworCisvKiBMb2NhdGVzIGEgcG9pbnQgd2l0aGluIHRoZSBEZWxhdW5heSB0cmlhbmd1bGF0aW9uIChmaW5kcyB0aGUgZWRnZQorICAgdGhlIHBvaW50IGlzIGxlZnQgdG8gb3IgYmVsb25ncyB0bywgb3IgdGhlIHRyaWFuZ3VsYXRpb24gcG9pbnQgdGhlIGdpdmVuCisgICBwb2ludCBjb2luc2lkZXMgd2l0aCAqLworQ1ZBUEkoQ3ZTdWJkaXYyRFBvaW50TG9jYXRpb24pICBjdlN1YmRpdjJETG9jYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkQqIHN1YmRpdiwgQ3ZQb2ludDJEMzJmIHB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkRFZGdlKiBlZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkRQb2ludCoqIHZlcnRleCBDVl9ERUZBVUxUKE5VTEwpICk7CisKKy8qIENhbGN1bGF0ZXMgVm9yb25vaSB0ZXNzZWxhdGlvbiAoaS5lLiBjb29yZGluYXRlcyBvZiBWb3Jvbm9pIHBvaW50cykgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNTdWJkaXZWb3Jvbm9pMkQoIEN2U3ViZGl2MkQqIHN1YmRpdiApOworCisKKy8qIFJlbW92ZXMgYWxsIFZvcm9ub2kgcG9pbnRzIGZyb20gdGhlIHRlc3NlbGF0aW9uICovCitDVkFQSSh2b2lkKSAgY3ZDbGVhclN1YmRpdlZvcm9ub2kyRCggQ3ZTdWJkaXYyRCogc3ViZGl2ICk7CisKKworLyogRmluZHMgdGhlIG5lYXJlc3QgdG8gdGhlIGdpdmVuIHBvaW50IHZlcnRleCBpbiBzdWJkaXZpc2lvbi4gKi8KK0NWQVBJKEN2U3ViZGl2MkRQb2ludCopIGN2RmluZE5lYXJlc3RQb2ludDJEKCBDdlN1YmRpdjJEKiBzdWJkaXYsIEN2UG9pbnQyRDMyZiBwdCApOworCisKKy8qKioqKioqKioqKiogQmFzaWMgcXVhZC1lZGdlIG5hdmlnYXRpb24gYW5kIG9wZXJhdGlvbnMgKioqKioqKioqKioqLworCitDVl9JTkxJTkUgIEN2U3ViZGl2MkRFZGdlICBjdlN1YmRpdjJETmV4dEVkZ2UoIEN2U3ViZGl2MkRFZGdlIGVkZ2UgKQoreworICAgIHJldHVybiAgQ1ZfU1VCRElWMkRfTkVYVF9FREdFKGVkZ2UpOworfQorCisKK0NWX0lOTElORSAgQ3ZTdWJkaXYyREVkZ2UgIGN2U3ViZGl2MkRSb3RhdGVFZGdlKCBDdlN1YmRpdjJERWRnZSBlZGdlLCBpbnQgcm90YXRlICkKK3sKKyAgICByZXR1cm4gIChlZGdlICYgfjMpICsgKChlZGdlICsgcm90YXRlKSAmIDMpOworfQorCitDVl9JTkxJTkUgIEN2U3ViZGl2MkRFZGdlICBjdlN1YmRpdjJEU3ltRWRnZSggQ3ZTdWJkaXYyREVkZ2UgZWRnZSApCit7CisgICAgcmV0dXJuIGVkZ2UgXiAyOworfQorCitDVl9JTkxJTkUgIEN2U3ViZGl2MkRFZGdlICBjdlN1YmRpdjJER2V0RWRnZSggQ3ZTdWJkaXYyREVkZ2UgZWRnZSwgQ3ZOZXh0RWRnZVR5cGUgdHlwZSApCit7CisgICAgQ3ZRdWFkRWRnZTJEKiBlID0gKEN2UXVhZEVkZ2UyRCopKGVkZ2UgJiB+Myk7CisgICAgZWRnZSA9IGUtPm5leHRbKGVkZ2UgKyAoaW50KXR5cGUpICYgM107CisgICAgcmV0dXJuICAoZWRnZSAmIH4zKSArICgoZWRnZSArICgoaW50KXR5cGUgPj4gNCkpICYgMyk7Cit9CisKKworQ1ZfSU5MSU5FICBDdlN1YmRpdjJEUG9pbnQqICBjdlN1YmRpdjJERWRnZU9yZyggQ3ZTdWJkaXYyREVkZ2UgZWRnZSApCit7CisgICAgQ3ZRdWFkRWRnZTJEKiBlID0gKEN2UXVhZEVkZ2UyRCopKGVkZ2UgJiB+Myk7CisgICAgcmV0dXJuIChDdlN1YmRpdjJEUG9pbnQqKWUtPnB0W2VkZ2UgJiAzXTsKK30KKworCitDVl9JTkxJTkUgIEN2U3ViZGl2MkRQb2ludCogIGN2U3ViZGl2MkRFZGdlRHN0KCBDdlN1YmRpdjJERWRnZSBlZGdlICkKK3sKKyAgICBDdlF1YWRFZGdlMkQqIGUgPSAoQ3ZRdWFkRWRnZTJEKikoZWRnZSAmIH4zKTsKKyAgICByZXR1cm4gKEN2U3ViZGl2MkRQb2ludCopZS0+cHRbKGVkZ2UgKyAyKSAmIDNdOworfQorCisKK0NWX0lOTElORSAgZG91YmxlICBjdlRyaWFuZ2xlQXJlYSggQ3ZQb2ludDJEMzJmIGEsIEN2UG9pbnQyRDMyZiBiLCBDdlBvaW50MkQzMmYgYyApCit7CisgICAgcmV0dXJuIChiLnggLSBhLngpICogKGMueSAtIGEueSkgLSAoYi55IC0gYS55KSAqIChjLnggLSBhLngpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250b3VyIFByb2Nlc3NpbmcgYW5kIFNoYXBlIEFuYWx5c2lzICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9QT0xZX0FQUFJPWF9EUCAwCisKKy8qIEFwcHJveGltYXRlcyBhIHNpbmdsZSBwb2x5Z29uYWwgY3VydmUgKGNvbnRvdXIpIG9yCisgICBhIHRyZWUgb2YgcG9seWdvbmFsIGN1cnZlcyAoY29udG91cnMpICovCitDVkFQSShDdlNlcSopICBjdkFwcHJveFBvbHkoIGNvbnN0IHZvaWQqIHNyY19zZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWFkZXJfc2l6ZSwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLCBkb3VibGUgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW1ldGVyMiBDVl9ERUZBVUxUKDApKTsKKworI2RlZmluZSBDVl9ET01JTkFOVF9JUEFOIDEKKworLyogRmluZHMgaGlnaC1jdXJ2YXR1cmUgcG9pbnRzIG9mIHRoZSBjb250b3VyICovCitDVkFQSShDdlNlcSopIGN2RmluZERvbWluYW50UG9pbnRzKCBDdlNlcSogY29udG91ciwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kIENWX0RFRkFVTFQoQ1ZfRE9NSU5BTlRfSVBBTiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbWV0ZXIxIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbWV0ZXIyIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbWV0ZXIzIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbWV0ZXI0IENWX0RFRkFVTFQoMCkpOworCisvKiBDYWxjdWxhdGVzIHBlcmltZXRlciBvZiBhIGNvbnRvdXIgb3IgbGVuZ3RoIG9mIGEgcGFydCBvZiBjb250b3VyICovCitDVkFQSShkb3VibGUpICBjdkFyY0xlbmd0aCggY29uc3Qgdm9pZCogY3VydmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTbGljZSBzbGljZSBDVl9ERUZBVUxUKENWX1dIT0xFX1NFUSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2Nsb3NlZCBDVl9ERUZBVUxUKC0xKSk7CisjZGVmaW5lIGN2Q29udG91clBlcmltZXRlciggY29udG91ciApIGN2QXJjTGVuZ3RoKCBjb250b3VyLCBDVl9XSE9MRV9TRVEsIDEgKQorCisvKiBDYWxjdWxhdGVzIGNvbnRvdXIgYm91bmRuaW5nIHJlY3RhbmdsZSAodXBkYXRlPTEpIG9yCisgICBqdXN0IHJldHJpZXZlcyBwcmUtY2FsY3VsYXRlZCByZWN0YW5nbGUgKHVwZGF0ZT0wKSAqLworQ1ZBUEkoQ3ZSZWN0KSAgY3ZCb3VuZGluZ1JlY3QoIEN2QXJyKiBwb2ludHMsIGludCB1cGRhdGUgQ1ZfREVGQVVMVCgwKSApOworCisvKiBDYWxjdWxhdGVzIGFyZWEgb2YgYSBjb250b3VyIG9yIGNvbnRvdXIgc2VnbWVudCAqLworQ1ZBUEkoZG91YmxlKSAgY3ZDb250b3VyQXJlYSggY29uc3QgQ3ZBcnIqIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNsaWNlIHNsaWNlIENWX0RFRkFVTFQoQ1ZfV0hPTEVfU0VRKSk7CisKKy8qIEZpbmRzIG1pbmltdW0gYXJlYSByb3RhdGVkIHJlY3RhbmdsZSBib3VuZGluZyBhIHNldCBvZiBwb2ludHMgKi8KK0NWQVBJKEN2Qm94MkQpICBjdk1pbkFyZWFSZWN0MiggY29uc3QgQ3ZBcnIqIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlIENWX0RFRkFVTFQoTlVMTCkpOworCisvKiBGaW5kcyBtaW5pbXVtIGVuY2xvc2luZyBjaXJjbGUgZm9yIGEgc2V0IG9mIHBvaW50cyAqLworQ1ZBUEkoaW50KSAgY3ZNaW5FbmNsb3NpbmdDaXJjbGUoIGNvbnN0IEN2QXJyKiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBjZW50ZXIsIGZsb2F0KiByYWRpdXMgKTsKKworI2RlZmluZSBDVl9DT05UT1VSU19NQVRDSF9JMSAgMQorI2RlZmluZSBDVl9DT05UT1VSU19NQVRDSF9JMiAgMgorI2RlZmluZSBDVl9DT05UT1VSU19NQVRDSF9JMyAgMworCisvKiBDb21wYXJlcyB0d28gY29udG91cnMgYnkgbWF0Y2hpbmcgdGhlaXIgbW9tZW50cyAqLworQ1ZBUEkoZG91YmxlKSAgY3ZNYXRjaFNoYXBlcyggY29uc3Qgdm9pZCogb2JqZWN0MSwgY29uc3Qgdm9pZCogb2JqZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGRvdWJsZSBwYXJhbWV0ZXIgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIEJ1aWxkcyBoaWVyYXJoaWNhbCByZXByZXNlbnRhdGlvbiBvZiBhIGNvbnRvdXIgKi8KK0NWQVBJKEN2Q29udG91clRyZWUqKSAgY3ZDcmVhdGVDb250b3VyVHJlZSggY29uc3QgQ3ZTZXEqIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCApOworCisvKiBSZWNvbnN0cnVjdCAoY29tcGxldGVsbHkgb3IgcGFydGlhbGx5KSBjb250b3VyIGEgZnJvbSBjb250b3VyIHRyZWUgKi8KK0NWQVBJKEN2U2VxKikgIGN2Q29udG91ckZyb21Db250b3VyVHJlZSggY29uc3QgQ3ZDb250b3VyVHJlZSogdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSApOworCisvKiBDb21wYXJlcyB0d28gY29udG91ciB0cmVlcyAqLworI2RlZmluZSAgQ1ZfQ09OVE9VUl9UUkVFU19NQVRDSF9JMSAgMQorCitDVkFQSShkb3VibGUpICBjdk1hdGNoQ29udG91clRyZWVzKCBjb25zdCBDdkNvbnRvdXJUcmVlKiB0cmVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29udG91clRyZWUqIHRyZWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwgZG91YmxlIHRocmVzaG9sZCApOworCisvKiBDYWxjdWxhdGVzIGhpc3RvZ3JhbSBvZiBhIGNvbnRvdXIgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNQR0goIGNvbnN0IEN2U2VxKiBjb250b3VyLCBDdkhpc3RvZ3JhbSogaGlzdCApOworCisjZGVmaW5lIENWX0NMT0NLV0lTRSAgICAgICAgIDEKKyNkZWZpbmUgQ1ZfQ09VTlRFUl9DTE9DS1dJU0UgMgorCisvKiBDYWxjdWxhdGVzIGV4YWN0IGNvbnZleCBodWxsIG9mIDJkIHBvaW50IHNldCAqLworQ1ZBUEkoQ3ZTZXEqKSBjdkNvbnZleEh1bGwyKCBjb25zdCBDdkFyciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGh1bGxfc3RvcmFnZSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24gQ1ZfREVGQVVMVChDVl9DTE9DS1dJU0UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmV0dXJuX3BvaW50cyBDVl9ERUZBVUxUKDApKTsKKworLyogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnRvdXIgaXMgY29udmV4IG9yIG5vdCAocmV0dXJucyAxIGlmIGNvbnZleCwgMCBpZiBub3QpICovCitDVkFQSShpbnQpICBjdkNoZWNrQ29udG91ckNvbnZleGl0eSggY29uc3QgQ3ZBcnIqIGNvbnRvdXIgKTsKKworLyogRmluZHMgY29udmV4aXR5IGRlZmVjdHMgZm9yIHRoZSBjb250b3VyICovCitDVkFQSShDdlNlcSopICBjdkNvbnZleGl0eURlZmVjdHMoIGNvbnN0IEN2QXJyKiBjb250b3VyLCBjb25zdCBDdkFyciogY29udmV4aHVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlIENWX0RFRkFVTFQoTlVMTCkpOworCisvKiBGaXRzIGVsbGlwc2UgaW50byBhIHNldCBvZiAyZCBwb2ludHMgKi8KK0NWQVBJKEN2Qm94MkQpIGN2Rml0RWxsaXBzZTIoIGNvbnN0IEN2QXJyKiBwb2ludHMgKTsKKworLyogRmluZHMgbWluaW11bSByZWN0YW5nbGUgY29udGFpbmluZyB0d28gZ2l2ZW4gcmVjdGFuZ2xlcyAqLworQ1ZBUEkoQ3ZSZWN0KSAgY3ZNYXhSZWN0KCBjb25zdCBDdlJlY3QqIHJlY3QxLCBjb25zdCBDdlJlY3QqIHJlY3QyICk7CisKKy8qIEZpbmRzIGNvb3JkaW5hdGVzIG9mIHRoZSBib3ggdmVydGljZXMgKi8KK0NWQVBJKHZvaWQpIGN2Qm94UG9pbnRzKCBDdkJveDJEIGJveCwgQ3ZQb2ludDJEMzJmIHB0WzRdICk7CisKKy8qIEluaXRpYWxpemVzIHNlcXVlbmNlIGhlYWRlciBmb3IgYSBtYXRyaXggKGNvbHVtbiBvciByb3cgdmVjdG9yKSBvZiBwb2ludHMgLQorICAgYSB3cmFwcGVyIGZvciBjdk1ha2VTZXFIZWFkZXJGb3JBcnJheSAoaXQgZG9lcyBub3QgaW5pdGlhbGl6ZSBib3VuZGluZyByZWN0YW5nbGUhISEpICovCitDVkFQSShDdlNlcSopIGN2UG9pbnRTZXFGcm9tTWF0KCBpbnQgc2VxX2tpbmQsIGNvbnN0IEN2QXJyKiBtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkNvbnRvdXIqIGNvbnRvdXJfaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXFCbG9jayogYmxvY2sgKTsKKworLyogQ2hlY2tzIHdoZXRoZXIgdGhlIHBvaW50IGlzIGluc2lkZSBwb2x5Z29uLCBvdXRzaWRlLCBvbiBhbiBlZGdlIChhdCBhIHZlcnRleCkuCisgICBSZXR1cm5zIHBvc2l0aXZlLCBuZWdhdGl2ZSBvciB6ZXJvIHZhbHVlLCBjb3JyZXNwb25kaW5nbHkuCisgICBPcHRpb25hbGx5LCBtZWFzdXJlcyBhIHNpZ25lZCBkaXN0YW5jZSBiZXR3ZWVuCisgICB0aGUgcG9pbnQgYW5kIHRoZSBuZWFyZXN0IHBvbHlnb24gZWRnZSAobWVhc3VyZV9kaXN0PTEpICovCitDVkFQSShkb3VibGUpIGN2UG9pbnRQb2x5Z29uVGVzdCggY29uc3QgQ3ZBcnIqIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIHB0LCBpbnQgbWVhc3VyZV9kaXN0ICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIaXN0b2dyYW0gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlcyBuZXcgaGlzdG9ncmFtICovCitDVkFQSShDdkhpc3RvZ3JhbSopICBjdkNyZWF0ZUhpc3QoIGludCBkaW1zLCBpbnQqIHNpemVzLCBpbnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqKiByYW5nZXMgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVuaWZvcm0gQ1ZfREVGQVVMVCgxKSk7CisKKy8qIEFzc2lnbmVzIGhpc3RvZ3JhbSBiaW4gcmFuZ2VzICovCitDVkFQSSh2b2lkKSAgY3ZTZXRIaXN0QmluUmFuZ2VzKCBDdkhpc3RvZ3JhbSogaGlzdCwgZmxvYXQqKiByYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bmlmb3JtIENWX0RFRkFVTFQoMSkpOworCisvKiBDcmVhdGVzIGhpc3RvZ3JhbSBoZWFkZXIgZm9yIGFycmF5ICovCitDVkFQSShDdkhpc3RvZ3JhbSopICBjdk1ha2VIaXN0SGVhZGVyRm9yQXJyYXkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICBkaW1zLCBpbnQqIHNpemVzLCBDdkhpc3RvZ3JhbSogaGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGF0YSwgZmxvYXQqKiByYW5nZXMgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5pZm9ybSBDVl9ERUZBVUxUKDEpKTsKKworLyogUmVsZWFzZXMgaGlzdG9ncmFtICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlSGlzdCggQ3ZIaXN0b2dyYW0qKiBoaXN0ICk7CisKKy8qIENsZWFycyBhbGwgdGhlIGhpc3RvZ3JhbSBiaW5zICovCitDVkFQSSh2b2lkKSAgY3ZDbGVhckhpc3QoIEN2SGlzdG9ncmFtKiBoaXN0ICk7CisKKy8qIEZpbmRzIGluZGljZXMgYW5kIHZhbHVlcyBvZiBtaW5pbXVtIGFuZCBtYXhpbXVtIGhpc3RvZ3JhbSBiaW5zICovCitDVkFQSSh2b2lkKSAgY3ZHZXRNaW5NYXhIaXN0VmFsdWUoIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWluX3ZhbHVlLCBmbG9hdCogbWF4X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1pbl9pZHggQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtYXhfaWR4IENWX0RFRkFVTFQoTlVMTCkpOworCisKKy8qIE5vcm1hbGl6ZXMgaGlzdG9ncmFtIGJ5IGRpdmlkaW5nIGFsbCBiaW5zIGJ5IHN1bSBvZiB0aGUgYmlucywgbXVsdGlwbGllZCBieSA8ZmFjdG9yPi4KKyAgIEFmdGVyIHRoYXQgc3VtIG9mIGhpc3RvZ3JhbSBiaW5zIGlzIGVxdWFsIHRvIDxmYWN0b3I+ICovCitDVkFQSSh2b2lkKSAgY3ZOb3JtYWxpemVIaXN0KCBDdkhpc3RvZ3JhbSogaGlzdCwgZG91YmxlIGZhY3RvciApOworCisKKy8qIENsZWFyIGFsbCBoaXN0b2dyYW0gYmlucyB0aGF0IGFyZSBiZWxvdyB0aGUgdGhyZXNob2xkICovCitDVkFQSSh2b2lkKSAgY3ZUaHJlc2hIaXN0KCBDdkhpc3RvZ3JhbSogaGlzdCwgZG91YmxlIHRocmVzaG9sZCApOworCisjZGVmaW5lIENWX0NPTVBfQ09SUkVMICAgICAgICAwCisjZGVmaW5lIENWX0NPTVBfQ0hJU1FSICAgICAgICAxCisjZGVmaW5lIENWX0NPTVBfSU5URVJTRUNUICAgICAyCisjZGVmaW5lIENWX0NPTVBfQkhBVFRBQ0hBUllZQSAzCisKKy8qIENvbXBhcmVzIHR3byBoaXN0b2dyYW0gKi8KK0NWQVBJKGRvdWJsZSkgIGN2Q29tcGFyZUhpc3QoIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QpOworCisvKiBDb3BpZXMgb25lIGhpc3RvZ3JhbSB0byBhbm90aGVyLiBEZXN0aW5hdGlvbiBoaXN0b2dyYW0gaXMgY3JlYXRlZCBpZgorICAgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgaXMgTlVMTCAqLworQ1ZBUEkodm9pZCkgIGN2Q29weUhpc3QoIGNvbnN0IEN2SGlzdG9ncmFtKiBzcmMsIEN2SGlzdG9ncmFtKiogZHN0ICk7CisKKworLyogQ2FsY3VsYXRlcyBiYXllc2lhbiBwcm9iYWJpbGlzdGljIGhpc3RvZ3JhbXMKKyAgIChlYWNoIG9yIHNyYyBhbmQgZHN0IGlzIGFuIGFycmF5IG9mIDxudW1iZXI+IGhpc3RvZ3JhbXMgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNCYXllc2lhblByb2IoIEN2SGlzdG9ncmFtKiogc3JjLCBpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkhpc3RvZ3JhbSoqIGRzdCk7CisKKy8qIENhbGN1bGF0ZXMgYXJyYXkgaGlzdG9ncmFtICovCitDVkFQSSh2b2lkKSAgY3ZDYWxjQXJySGlzdCggQ3ZBcnIqKiBhcnIsIEN2SGlzdG9ncmFtKiBoaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhY2N1bXVsYXRlIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSApOworCitDVl9JTkxJTkUgIHZvaWQgIGN2Q2FsY0hpc3QoIElwbEltYWdlKiogaW1hZ2UsIEN2SGlzdG9ncmFtKiBoaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjdW11bGF0ZSBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpICkKK3sKKyAgICBjdkNhbGNBcnJIaXN0KCAoQ3ZBcnIqKilpbWFnZSwgaGlzdCwgYWNjdW11bGF0ZSwgbWFzayApOworfQorCisvKiBDYWxjdWxhdGVzIGJhY2sgcHJvamVjdCAqLworQ1ZBUEkodm9pZCkgIGN2Q2FsY0FyckJhY2tQcm9qZWN0KCBDdkFycioqIGltYWdlLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkhpc3RvZ3JhbSogaGlzdCApOworI2RlZmluZSAgY3ZDYWxjQmFja1Byb2plY3QoaW1hZ2UsIGRzdCwgaGlzdCkgY3ZDYWxjQXJyQmFja1Byb2plY3QoKEN2QXJyKiopaW1hZ2UsIGRzdCwgaGlzdCkKKworCisvKiBEb2VzIHNvbWUgc29ydCBvZiB0ZW1wbGF0ZSBtYXRjaGluZyBidXQgY29tcGFyZXMgaGlzdG9ncmFtcyBvZgorICAgdGVtcGxhdGUgYW5kIGVhY2ggd2luZG93IGxvY2F0aW9uICovCitDVkFQSSh2b2lkKSAgY3ZDYWxjQXJyQmFja1Byb2plY3RQYXRjaCggQ3ZBcnIqKiBpbWFnZSwgQ3ZBcnIqIGRzdCwgQ3ZTaXplIHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2SGlzdG9ncmFtKiBoaXN0LCBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmYWN0b3IgKTsKKyNkZWZpbmUgIGN2Q2FsY0JhY2tQcm9qZWN0UGF0Y2goIGltYWdlLCBkc3QsIHJhbmdlLCBoaXN0LCBtZXRob2QsIGZhY3RvciApIFwKKyAgICAgY3ZDYWxjQXJyQmFja1Byb2plY3RQYXRjaCggKEN2QXJyKiopaW1hZ2UsIGRzdCwgcmFuZ2UsIGhpc3QsIG1ldGhvZCwgZmFjdG9yICkKKworCisvKiBjYWxjdWxhdGVzIHByb2JhYmlsaXN0aWMgZGVuc2l0eSAoZGl2aWRlcyBvbmUgaGlzdG9ncmFtIGJ5IGFub3RoZXIpICovCitDVkFQSSh2b2lkKSAgY3ZDYWxjUHJvYkRlbnNpdHkoIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0MSwgY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkhpc3RvZ3JhbSogZHN0X2hpc3QsIGRvdWJsZSBzY2FsZSBDVl9ERUZBVUxUKDI1NSkgKTsKKworLyogZXF1YWxpemVzIGhpc3RvZ3JhbSBvZiA4LWJpdCBzaW5nbGUtY2hhbm5lbCBpbWFnZSAqLworQ1ZBUEkodm9pZCkgIGN2RXF1YWxpemVIaXN0KCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0ICk7CisKKworI2RlZmluZSAgQ1ZfVkFMVUUgIDEKKyNkZWZpbmUgIENWX0FSUkFZICAyCisvKiBVcGRhdGVzIGFjdGl2ZSBjb250b3VyIGluIG9yZGVyIHRvIG1pbmltaXplIGl0cyBjdW1tdWxhdGl2ZQorICAgKGludGVybmFsIGFuZCBleHRlcm5hbCkgZW5lcmd5LiAqLworQ1ZBUEkodm9pZCkgIGN2U25ha2VJbWFnZSggY29uc3QgSXBsSW1hZ2UqIGltYWdlLCBDdlBvaW50KiBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGxlbmd0aCwgZmxvYXQqIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGJldGEsIGZsb2F0KiBnYW1tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2VmZl91c2FnZSwgQ3ZTaXplICB3aW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwgaW50IGNhbGNfZ3JhZGllbnQgQ1ZfREVGQVVMVCgxKSk7CisKKy8qIENhbGN1bGF0ZXMgdGhlIGNvb2ZpY2llbnRzIG9mIHRoZSBob21vZ3JhcGh5IG1hdHJpeCAqLworQ1ZBUEkodm9pZCkgIGN2Q2FsY0ltYWdlSG9tb2dyYXBoeSggZmxvYXQqIGxpbmUsIEN2UG9pbnQzRDMyZiogY2VudGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGludHJpbnNpYywgZmxvYXQqIGhvbW9ncmFwaHkgKTsKKworI2RlZmluZSBDVl9ESVNUX01BU0tfMyAgIDMKKyNkZWZpbmUgQ1ZfRElTVF9NQVNLXzUgICA1CisjZGVmaW5lIENWX0RJU1RfTUFTS19QUkVDSVNFIDAKKworLyogQXBwbGllcyBkaXN0YW5jZSB0cmFuc2Zvcm0gdG8gYmluYXJ5IGltYWdlICovCitDVkFQSSh2b2lkKSAgY3ZEaXN0VHJhbnNmb3JtKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpc3RhbmNlX3R5cGUgQ1ZfREVGQVVMVChDVl9ESVNUX0wyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXNrX3NpemUgQ1ZfREVGQVVMVCgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXNrIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogbGFiZWxzIENWX0RFRkFVTFQoTlVMTCkpOworCisKKy8qIFR5cGVzIG9mIHRocmVzaG9sZGluZyAqLworI2RlZmluZSBDVl9USFJFU0hfQklOQVJZICAgICAgMCAgLyogdmFsdWUgPSB2YWx1ZSA+IHRocmVzaG9sZCA/IG1heF92YWx1ZSA6IDAgICAgICAgKi8KKyNkZWZpbmUgQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgIDEgIC8qIHZhbHVlID0gdmFsdWUgPiB0aHJlc2hvbGQgPyAwIDogbWF4X3ZhbHVlICAgICAgICovCisjZGVmaW5lIENWX1RIUkVTSF9UUlVOQyAgICAgICAyICAvKiB2YWx1ZSA9IHZhbHVlID4gdGhyZXNob2xkID8gdGhyZXNob2xkIDogdmFsdWUgICAqLworI2RlZmluZSBDVl9USFJFU0hfVE9aRVJPICAgICAgMyAgLyogdmFsdWUgPSB2YWx1ZSA+IHRocmVzaG9sZCA/IHZhbHVlIDogMCAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1ZfVEhSRVNIX1RPWkVST19JTlYgIDQgIC8qIHZhbHVlID0gdmFsdWUgPiB0aHJlc2hvbGQgPyAwIDogdmFsdWUgICAgICAgICAgICovCisjZGVmaW5lIENWX1RIUkVTSF9NQVNLICAgICAgICA3CisKKyNkZWZpbmUgQ1ZfVEhSRVNIX09UU1UgICAgICAgIDggIC8qIHVzZSBPdHN1IGFsZ29yaXRobSB0byBjaG9vc2UgdGhlIG9wdGltYWwgdGhyZXNob2xkIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZSB0aGUgZmxhZyB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgQ1ZfVEhSRVNIXyogdmFsdWVzICovCisKKy8qIEFwcGxpZXMgZml4ZWQtbGV2ZWwgdGhyZXNob2xkIHRvIGdyYXlzY2FsZSBpbWFnZS4KKyAgIFRoaXMgaXMgYSBiYXNpYyBvcGVyYXRpb24gYXBwbGllZCBiZWZvcmUgcmV0cmlldmluZyBjb250b3VycyAqLworQ1ZBUEkoZG91YmxlKSAgY3ZUaHJlc2hvbGQoIGNvbnN0IEN2QXJyKiAgc3JjLCBDdkFyciogIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIHRocmVzaG9sZCwgZG91YmxlICBtYXhfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaG9sZF90eXBlICk7CisKKyNkZWZpbmUgQ1ZfQURBUFRJVkVfVEhSRVNIX01FQU5fQyAgMAorI2RlZmluZSBDVl9BREFQVElWRV9USFJFU0hfR0FVU1NJQU5fQyAgMQorCisvKiBBcHBsaWVzIGFkYXB0aXZlIHRocmVzaG9sZCB0byBncmF5c2NhbGUgaW1hZ2UuCisgICBUaGUgdHdvIHBhcmFtZXRlcnMgZm9yIG1ldGhvZHMgQ1ZfQURBUFRJVkVfVEhSRVNIX01FQU5fQyBhbmQKKyAgIENWX0FEQVBUSVZFX1RIUkVTSF9HQVVTU0lBTl9DIGFyZToKKyAgIG5laWdoYm9yaG9vZCBzaXplICgzLCA1LCA3IGV0Yy4pLAorICAgYW5kIGEgY29uc3RhbnQgc3VidHJhY3RlZCBmcm9tIG1lYW4gKC4uLiwtMywtMiwtMSwwLDEsMiwzLC4uLikgKi8KK0NWQVBJKHZvaWQpICBjdkFkYXB0aXZlVGhyZXNob2xkKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LCBkb3VibGUgbWF4X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhZGFwdGl2ZV9tZXRob2QgQ1ZfREVGQVVMVChDVl9BREFQVElWRV9USFJFU0hfTUVBTl9DKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZXNob2xkX3R5cGUgQ1ZfREVGQVVMVChDVl9USFJFU0hfQklOQVJZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSBDVl9ERUZBVUxUKDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwYXJhbTEgQ1ZfREVGQVVMVCg1KSk7CisKKyNkZWZpbmUgQ1ZfRkxPT0RGSUxMX0ZJWEVEX1JBTkdFICgxIDw8IDE2KQorI2RlZmluZSBDVl9GTE9PREZJTExfTUFTS19PTkxZICAgKDEgPDwgMTcpCisKKy8qIEZpbGxzIHRoZSBjb25uZWN0ZWQgY29tcG9uZW50IHVudGlsIHRoZSBjb2xvciBkaWZmZXJlbmNlIGdldHMgbGFyZ2UgZW5vdWdoICovCitDVkFQSSh2b2lkKSAgY3ZGbG9vZEZpbGwoIEN2QXJyKiBpbWFnZSwgQ3ZQb2ludCBzZWVkX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBuZXdfdmFsLCBDdlNjYWxhciBsb19kaWZmIENWX0RFRkFVTFQoY3ZTY2FsYXJBbGwoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciB1cF9kaWZmIENWX0RFRkFVTFQoY3ZTY2FsYXJBbGwoMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdkNvbm5lY3RlZENvbXAqIGNvbXAgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzIENWX0RFRkFVTFQoNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVhdHVyZSBkZXRlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfQ0FOTllfTDJfR1JBRElFTlQgICgxIDw8IDMxKQorCisvKiBSdW5zIGNhbm55IGVkZ2UgZGV0ZWN0b3IgKi8KK0NWQVBJKHZvaWQpICBjdkNhbm55KCBjb25zdCBDdkFyciogaW1hZ2UsIEN2QXJyKiBlZGdlcywgZG91YmxlIHRocmVzaG9sZDEsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZDIsIGludCAgYXBlcnR1cmVfc2l6ZSBDVl9ERUZBVUxUKDMpICk7CisKKy8qIENhbGN1bGF0ZXMgY29uc3RyYWludCBpbWFnZSBmb3IgY29ybmVyIGRldGVjdGlvbgorICAgRHheMiAqIER5eSArIER4eCAqIER5XjIgLSAyICogRHggKiBEeSAqIER4eS4KKyAgIEFwcGx5aW5nIHRocmVzaG9sZCB0byB0aGUgcmVzdWx0IGdpdmVzIGNvb3JkaW5hdGVzIG9mIGNvcm5lcnMgKi8KK0NWQVBJKHZvaWQpIGN2UHJlQ29ybmVyRGV0ZWN0KCBjb25zdCBDdkFyciogaW1hZ2UsIEN2QXJyKiBjb3JuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwZXJ0dXJlX3NpemUgQ1ZfREVGQVVMVCgzKSApOworCisvKiBDYWxjdWxhdGVzIGVpZ2VuIHZhbHVlcyBhbmQgdmVjdG9ycyBvZiAyeDIKKyAgIGdyYWRpZW50IGNvdmFyaWF0aW9uIG1hdHJpeCBhdCBldmVyeSBpbWFnZSBwaXhlbCAqLworQ1ZBUEkodm9pZCkgIGN2Q29ybmVyRWlnZW5WYWxzQW5kVmVjcyggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdkFyciogZWlnZW52diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUsIGludCBhcGVydHVyZV9zaXplIENWX0RFRkFVTFQoMykgKTsKKworLyogQ2FsY3VsYXRlcyBtaW5pbWFsIGVpZ2VudmFsdWUgZm9yIDJ4MiBncmFkaWVudCBjb3ZhcmlhdGlvbiBtYXRyaXggYXQKKyAgIGV2ZXJ5IGltYWdlIHBpeGVsICovCitDVkFQSSh2b2lkKSAgY3ZDb3JuZXJNaW5FaWdlblZhbCggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdkFyciogZWlnZW52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSwgaW50IGFwZXJ0dXJlX3NpemUgQ1ZfREVGQVVMVCgzKSApOworCisvKiBIYXJyaXMgY29ybmVyIGRldGVjdG9yOgorICAgQ2FsY3VsYXRlcyBkZXQoTSkgLSBrKih0cmFjZShNKV4yKSwgd2hlcmUgTSBpcyAyeDIgZ3JhZGllbnQgY292YXJpYXRpb24gbWF0cml4IGZvciBlYWNoIHBpeGVsICovCitDVkFQSSh2b2lkKSAgY3ZDb3JuZXJIYXJyaXMoIGNvbnN0IEN2QXJyKiBpbWFnZSwgQ3ZBcnIqIGhhcnJpc19yZXNwb25jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUsIGludCBhcGVydHVyZV9zaXplIENWX0RFRkFVTFQoMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBrIENWX0RFRkFVTFQoMC4wNCkgKTsKKworLyogQWRqdXN0IGNvcm5lciBwb3NpdGlvbiB1c2luZyBzb21lIHNvcnQgb2YgZ3JhZGllbnQgc2VhcmNoICovCitDVkFQSSh2b2lkKSAgY3ZGaW5kQ29ybmVyU3ViUGl4KCBjb25zdCBDdkFyciogaW1hZ2UsIEN2UG9pbnQyRDMyZiogY29ybmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgQ3ZTaXplIHdpbiwgQ3ZTaXplIHplcm9fem9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhICBjcml0ZXJpYSApOworCisvKiBGaW5kcyBhIHNwYXJzZSBzZXQgb2YgcG9pbnRzIHdpdGhpbiB0aGUgc2VsZWN0ZWQgcmVnaW9uCisgICB0aGF0IHNlZW0gdG8gYmUgZWFzeSB0byB0cmFjayAqLworQ1ZBUEkodm9pZCkgIGN2R29vZEZlYXR1cmVzVG9UcmFjayggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdkFyciogZWlnX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogdGVtcF9pbWFnZSwgQ3ZQb2ludDJEMzJmKiBjb3JuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvcm5lcl9jb3VudCwgZG91YmxlICBxdWFsaXR5X2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgIG1pbl9kaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUgQ1ZfREVGQVVMVCgzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9oYXJyaXMgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGsgQ1ZfREVGQVVMVCgwLjA0KSApOworCisjZGVmaW5lIENWX0hPVUdIX1NUQU5EQVJEIDAKKyNkZWZpbmUgQ1ZfSE9VR0hfUFJPQkFCSUxJU1RJQyAxCisjZGVmaW5lIENWX0hPVUdIX01VTFRJX1NDQUxFIDIKKyNkZWZpbmUgQ1ZfSE9VR0hfR1JBRElFTlQgMworCisvKiBGaW5kcyBsaW5lcyBvbiBiaW5hcnkgaW1hZ2UgdXNpbmcgb25lIG9mIHNldmVyYWwgbWV0aG9kcy4KKyAgIGxpbmVfc3RvcmFnZSBpcyBlaXRoZXIgbWVtb3J5IHN0b3JhZ2Ugb3IgMSB4IDxtYXggbnVtYmVyIG9mIGxpbmVzPiBDdk1hdCwgaXRzCisgICBudW1iZXIgb2YgY29sdW1ucyBpcyBjaGFuZ2VkIGJ5IHRoZSBmdW5jdGlvbi4KKyAgIG1ldGhvZCBpcyBvbmUgb2YgQ1ZfSE9VR0hfKjsKKyAgIHJobywgdGhldGEgYW5kIHRocmVzaG9sZCBhcmUgdXNlZCBmb3IgZWFjaCBvZiB0aG9zZSBtZXRob2RzOworICAgcGFyYW0xIH4gbGluZSBsZW5ndGgsIHBhcmFtMiB+IGxpbmUgZ2FwIC0gZm9yIHByb2JhYmlsaXN0aWMsCisgICBwYXJhbTEgfiBzcm4sIHBhcmFtMiB+IHN0biAtIGZvciBtdWx0aS1zY2FsZSAqLworQ1ZBUEkoQ3ZTZXEqKSAgY3ZIb3VnaExpbmVzMiggQ3ZBcnIqIGltYWdlLCB2b2lkKiBsaW5lX3N0b3JhZ2UsIGludCBtZXRob2QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJobywgZG91YmxlIHRoZXRhLCBpbnQgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMSBDVl9ERUZBVUxUKDApLCBkb3VibGUgcGFyYW0yIENWX0RFRkFVTFQoMCkpOworCisvKiBGaW5kcyBjaXJjbGVzIGluIHRoZSBpbWFnZSAqLworQ1ZBUEkoQ3ZTZXEqKSBjdkhvdWdoQ2lyY2xlcyggQ3ZBcnIqIGltYWdlLCB2b2lkKiBjaXJjbGVfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGRvdWJsZSBkcCwgZG91YmxlIG1pbl9kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMSBDVl9ERUZBVUxUKDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0yIENWX0RFRkFVTFQoMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fcmFkaXVzIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JhZGl1cyBDVl9ERUZBVUxUKDApKTsKKworLyogRml0cyBhIGxpbmUgaW50byBzZXQgb2YgMmQgb3IgM2QgcG9pbnRzIGluIGEgcm9idXN0IHdheSAoTS1lc3RpbWF0b3IgdGVjaG5pcXVlKSAqLworQ1ZBUEkodm9pZCkgIGN2Rml0TGluZSggY29uc3QgQ3ZBcnIqIHBvaW50cywgaW50IGRpc3RfdHlwZSwgZG91YmxlIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlcHMsIGRvdWJsZSBhZXBzLCBmbG9hdCogbGluZSApOworCisKKworc3RydWN0IEN2RmVhdHVyZVRyZWU7CisKKy8qIENvbnN0cnVjdHMga2QtdHJlZSBmcm9tIHNldCBvZiBmZWF0dXJlIGRlc2NyaXB0b3JzICovCitDVkFQSShzdHJ1Y3QgQ3ZGZWF0dXJlVHJlZSopIGN2Q3JlYXRlRmVhdHVyZVRyZWUoQ3ZNYXQqIGRlc2MpOworCisvKiBSZWxlYXNlIGtkLXRyZWUgKi8KK0NWQVBJKHZvaWQpIGN2UmVsZWFzZUZlYXR1cmVUcmVlKHN0cnVjdCBDdkZlYXR1cmVUcmVlKiB0cik7CisKKy8qIFNlYXJjaGVzIGtkLXRyZWUgZm9yIGsgbmVhcmVzdCBuZWlnaGJvcnMgb2YgZ2l2ZW4gcmVmZXJlbmNlIHBvaW50cywKKyAgIHNlYXJjaGluZyBhdCBtb3N0IGVtYXggbGVhdmVzLiAqLworQ1ZBUEkodm9pZCkgY3ZGaW5kRmVhdHVyZXMoc3RydWN0IEN2RmVhdHVyZVRyZWUqIHRyLCBDdk1hdCogZGVzYywKKwkJICAgIEN2TWF0KiByZXN1bHRzLCBDdk1hdCogZGlzdCwgaW50IGsgQ1ZfREVGQVVMVCgyKSwgaW50IGVtYXggQ1ZfREVGQVVMVCgyMCkpOworCisvKiBTZWFyY2gga2QtdHJlZSBmb3IgYWxsIHBvaW50cyB0aGF0IGFyZSBpbmxpZXIgdG8gZ2l2ZW4gcmVjdCByZWdpb24uICovCitDVkFQSShpbnQpIGN2RmluZEZlYXR1cmVzQm94ZWQoc3RydWN0IEN2RmVhdHVyZVRyZWUqIHRyLAorCQkgICAgQ3ZNYXQqIGJvdW5kc19taW4sIEN2TWF0KiBib3VuZHNfbWF4LAorCQkgICAgQ3ZNYXQqIHJlc3VsdHMpOworCit0eXBlZGVmIHN0cnVjdCBDdlNVUkZQb2ludAoreworICAgIEN2UG9pbnQyRDMyZiBwdDsKKyAgICBpbnQgbGFwbGFjaWFuOworICAgIGludCBzaXplOworICAgIGZsb2F0IGRpcjsKKyAgICBmbG9hdCBoZXNzaWFuOworfSBDdlNVUkZQb2ludDsKKworQ1ZfSU5MSU5FIEN2U1VSRlBvaW50IGN2U1VSRlBvaW50KCBDdlBvaW50MkQzMmYgcHQsIGludCBsYXBsYWNpYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLCBmbG9hdCBkaXIgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgaGVzc2lhbiBDVl9ERUZBVUxUKDApKQoreworICAgIEN2U1VSRlBvaW50IGtwOworICAgIGtwLnB0ID0gcHQ7CisgICAga3AubGFwbGFjaWFuID0gbGFwbGFjaWFuOworICAgIGtwLnNpemUgPSBzaXplOworICAgIGtwLmRpciA9IGRpcjsKKyAgICBrcC5oZXNzaWFuID0gaGVzc2lhbjsKKyAgICByZXR1cm4ga3A7Cit9CisKK3R5cGVkZWYgc3RydWN0IEN2U1VSRlBhcmFtcworeworICAgIGludCBleHRlbmRlZDsKKyAgICBkb3VibGUgaGVzc2lhblRocmVzaG9sZDsKKworICAgIGludCBuT2N0YXZlczsKKyAgICBpbnQgbk9jdGF2ZUxheWVyczsKK30KK0N2U1VSRlBhcmFtczsKKworQ1ZBUEkoQ3ZTVVJGUGFyYW1zKSBjdlNVUkZQYXJhbXMoIGRvdWJsZSBoZXNzaWFuVGhyZXNob2xkLCBpbnQgZXh0ZW5kZWQgQ1ZfREVGQVVMVCgwKSApOworQ1ZBUEkodm9pZCkgY3ZFeHRyYWN0U1VSRiggY29uc3QgQ3ZBcnIqIGltZywgY29uc3QgQ3ZBcnIqIG1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSoqIGtleXBvaW50cywgQ3ZTZXEqKiBkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTVVJGUGFyYW1zIHBhcmFtcyApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgSGFhci1saWtlIE9iamVjdCBEZXRlY3Rpb24gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIExvYWRzIGhhYXIgY2xhc3NpZmllciBjYXNjYWRlIGZyb20gYSBkaXJlY3RvcnkuCisgICBJdCBpcyBvYnNvbGV0ZTogY29udmVydCB5b3VyIGNhc2NhZGUgdG8geG1sIGFuZCB1c2UgY3ZMb2FkIGluc3RlYWQgKi8KK0NWQVBJKEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKikgY3ZMb2FkSGFhckNsYXNzaWZpZXJDYXNjYWRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkaXJlY3RvcnksIEN2U2l6ZSBvcmlnX3dpbmRvd19zaXplKTsKKworQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSoqIGNhc2NhZGUgKTsKKworI2RlZmluZSBDVl9IQUFSX0RPX0NBTk5ZX1BSVU5JTkcgICAgMQorI2RlZmluZSBDVl9IQUFSX1NDQUxFX0lNQUdFICAgICAgICAgMgorI2RlZmluZSBDVl9IQUFSX0ZJTkRfQklHR0VTVF9PQkpFQ1QgNCAKKyNkZWZpbmUgQ1ZfSEFBUl9ET19ST1VHSF9TRUFSQ0ggICAgIDgKKworQ1ZBUEkoQ3ZTZXEqKSBjdkhhYXJEZXRlY3RPYmplY3RzKCBjb25zdCBDdkFyciogaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgZG91YmxlIHNjYWxlX2ZhY3RvciBDVl9ERUZBVUxUKDEuMSksCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX25laWdoYm9ycyBDVl9ERUZBVUxUKDMpLCBpbnQgZmxhZ3MgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBtaW5fc2l6ZSBDVl9ERUZBVUxUKGN2U2l6ZSgwLDApKSk7CisKKy8qIHNldHMgaW1hZ2VzIGZvciBoYWFyIGNsYXNzaWZpZXIgY2FzY2FkZSAqLworQ1ZBUEkodm9pZCkgY3ZTZXRJbWFnZXNGb3JIYWFyQ2xhc3NpZmllckNhc2NhZGUoIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiBjYXNjYWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHN1bSwgY29uc3QgQ3ZBcnIqIHNxc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHRpbHRlZF9zdW0sIGRvdWJsZSBzY2FsZSApOworCisvKiBydW5zIHRoZSBjYXNjYWRlIG9uIHRoZSBzcGVjaWZpZWQgd2luZG93ICovCitDVkFQSShpbnQpIGN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBwdCwgaW50IHN0YXJ0X3N0YWdlIENWX0RFRkFVTFQoMCkpOworCisKKy8qIEFsdGVybmF0ZSB2ZXJzaW9uIHRoYXQgdXNlcyBpbnRzIGluc3RlYWQgb2YgZmxvYXRzICovCitDVkFQSShDdlNlcSopIG15Y3ZIYWFyRGV0ZWN0T2JqZWN0cyggY29uc3QgQ3ZBcnIqIGltYWdlLAorICAgICAgICAgICAgICAgICAgICAgQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUqIGNhc2NhZGUsCisgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIGRvdWJsZSBzY2FsZV9mYWN0b3IgQ1ZfREVGQVVMVCgxLjEpLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9uZWlnaGJvcnMgQ1ZfREVGQVVMVCgzKSwgaW50IGZsYWdzIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICBDdlNpemUgbWluX3NpemUgQ1ZfREVGQVVMVChjdlNpemUoMCwwKSkpOworCitDVkFQSSh2b2lkKSBteWN2U2V0SW1hZ2VzRm9ySGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzdW0sIGNvbnN0IEN2QXJyKiBzcXN1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiB0aWx0ZWRfc3VtLCBkb3VibGUgc2NhbGUgKTsKKworQ1ZBUEkoaW50KSBteWN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBwdCwgaW50IHN0YXJ0X3N0YWdlIENWX0RFRkFVTFQoMCkpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhIENhbGlicmF0aW9uLCBQb3NlIEVzdGltYXRpb24gYW5kIFN0ZXJlbyAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRyYW5zZm9ybXMgdGhlIGlucHV0IGltYWdlIHRvIGNvbXBlbnNhdGUgbGVucyBkaXN0b3J0aW9uICovCitDVkFQSSh2b2lkKSBjdlVuZGlzdG9ydDIoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBjYW1lcmFfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogZGlzdG9ydGlvbl9jb2VmZnMgKTsKKworLyogQ29tcHV0ZXMgdHJhbnNmb3JtYXRpb24gbWFwIGZyb20gaW50cmluc2ljIGNhbWVyYSBwYXJhbWV0ZXJzCisgICB0aGF0IGNhbiB1c2VkIGJ5IGN2UmVtYXAgKi8KK0NWQVBJKHZvaWQpIGN2SW5pdFVuZGlzdG9ydE1hcCggY29uc3QgQ3ZNYXQqIGNhbWVyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0b3J0aW9uX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIG1hcHgsIEN2QXJyKiBtYXB5ICk7CisKKy8qIENvbXB1dGVzIHVuZGlzdG9ydGlvbityZWN0aWZpY2F0aW9uIG1hcCBmb3IgYSBoZWFkIG9mIHN0ZXJlbyBjYW1lcmEgKi8KK0NWQVBJKHZvaWQpIGN2SW5pdFVuZGlzdG9ydFJlY3RpZnlNYXAoIGNvbnN0IEN2TWF0KiBjYW1lcmFfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGRpc3RfY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQgKlIsIGNvbnN0IEN2TWF0KiBuZXdfY2FtZXJhX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBtYXB4LCBDdkFyciogbWFweSApOworCisvKiBDb21wdXRlcyB0aGUgb3JpZ2luYWwgKHVuZGlzdG9ydGVkKSBmZWF0dXJlIGNvb3JkaW5hdGVzCisgICBmcm9tIHRoZSBvYnNlcnZlZCAoZGlzdG9ydGVkKSBjb29yZGluYXRlcyAqLworQ1ZBUEkodm9pZCkgY3ZVbmRpc3RvcnRQb2ludHMoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGNhbWVyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGRpc3RfY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBSIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIFAgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIENvbnZlcnRzIHJvdGF0aW9uIHZlY3RvciB0byByb3RhdGlvbiBtYXRyaXggb3IgdmljZSB2ZXJzYSAqLworQ1ZBUEkoaW50KSBjdlJvZHJpZ3VlczIoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGphY29iaWFuIENWX0RFRkFVTFQoMCkgKTsKKworI2RlZmluZSBDVl9MTUVEUyA0CisjZGVmaW5lIENWX1JBTlNBQyA4CisKKy8qIEZpbmRzIHBlcnNwZWN0aXZlIHRyYW5zZm9ybWF0aW9uIGJldHdlZW4gdGhlIG9iamVjdCBwbGFuZSBhbmQgaW1hZ2UgKHZpZXcpIHBsYW5lICovCitDVkFQSShpbnQpIGN2RmluZEhvbW9ncmFwaHkoIGNvbnN0IEN2TWF0KiBzcmNfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogZHN0X3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGhvbW9ncmFwaHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJhbnNhY1JlcHJvalRocmVzaG9sZCBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogbWFzayBDVl9ERUZBVUxUKDApKTsKKworLyogQ29tcHV0ZXMgUlEgZGVjb21wb3NpdGlvbiBmb3IgM3gzIG1hdHJpY2VzICovCitDVkFQSSh2b2lkKSBjdlJRRGVjb21wM3gzKCBjb25zdCBDdk1hdCAqbWF0cml4TSwgQ3ZNYXQgKm1hdHJpeFIsIEN2TWF0ICptYXRyaXhRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm1hdHJpeFF4IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqbWF0cml4UXkgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICptYXRyaXhReiBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmICpldWxlckFuZ2xlcyBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogQ29tcHV0ZXMgcHJvamVjdGlvbiBtYXRyaXggZGVjb21wb3NpdGlvbiAqLworQ1ZBUEkodm9pZCkgY3ZEZWNvbXBvc2VQcm9qZWN0aW9uTWF0cml4KCBjb25zdCBDdk1hdCAqcHJvak1hdHIsIEN2TWF0ICpjYWxpYk1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpyb3RNYXRyLCBDdk1hdCAqcG9zVmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKnJvdE1hdHJYIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpyb3RNYXRyWSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqcm90TWF0clogQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmICpldWxlckFuZ2xlcyBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogQ29tcHV0ZXMgZChBQikvZEEgYW5kIGQoQUIpL2RCICovCitDVkFQSSh2b2lkKSBjdkNhbGNNYXRNdWxEZXJpdiggY29uc3QgQ3ZNYXQqIEEsIGNvbnN0IEN2TWF0KiBCLCBDdk1hdCogZEFCZEEsIEN2TWF0KiBkQUJkQiApOworCisvKiBDb21wdXRlcyByMyA9IHJvZHJpZ3Vlcyhyb2RyaWd1ZXMocjIpKnJvZHJpZ3VlcyhyMSkpLAorICAgdDMgPSByb2RyaWd1ZXMocjIpKnQxICsgdDIgYW5kIHRoZSByZXNwZWN0aXZlIGRlcml2YXRpdmVzICovCitDVkFQSSh2b2lkKSBjdkNvbXBvc2VSVCggY29uc3QgQ3ZNYXQqIF9ydmVjMSwgY29uc3QgQ3ZNYXQqIF90dmVjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3J2ZWMyLCBjb25zdCBDdk1hdCogX3R2ZWMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBfcnZlYzMsIEN2TWF0KiBfdHZlYzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGRyM2RyMSBDVl9ERUZBVUxUKDApLCBDdk1hdCogZHIzZHQxIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGRyM2RyMiBDVl9ERUZBVUxUKDApLCBDdk1hdCogZHIzZHQyIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGR0M2RyMSBDVl9ERUZBVUxUKDApLCBDdk1hdCogZHQzZHQxIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGR0M2RyMiBDVl9ERUZBVUxUKDApLCBDdk1hdCogZHQzZHQyIENWX0RFRkFVTFQoMCkgKTsKKworLyogUHJvamVjdHMgb2JqZWN0IHBvaW50cyB0byB0aGUgdmlldyBwbGFuZSB1c2luZworICAgdGhlIHNwZWNpZmllZCBleHRyaW5zaWMgYW5kIGludHJpbnNpYyBjYW1lcmEgcGFyYW1ldGVycyAqLworQ1ZBUEkodm9pZCkgY3ZQcm9qZWN0UG9pbnRzMiggY29uc3QgQ3ZNYXQqIG9iamVjdF9wb2ludHMsIGNvbnN0IEN2TWF0KiByb3RhdGlvbl92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogdHJhbnNsYXRpb25fdmVjdG9yLCBjb25zdCBDdk1hdCogY2FtZXJhX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0b3J0aW9uX2NvZWZmcywgQ3ZNYXQqIGltYWdlX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBkcGRyb3QgQ1ZfREVGQVVMVChOVUxMKSwgQ3ZNYXQqIGRwZHQgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBkcGRmIENWX0RFRkFVTFQoTlVMTCksIEN2TWF0KiBkcGRjIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogZHBkZGlzdCBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFzcGVjdF9yYXRpbyBDVl9ERUZBVUxUKDApKTsKKworLyogRmluZHMgZXh0cmluc2ljIGNhbWVyYSBwYXJhbWV0ZXJzIGZyb20KKyAgIGEgZmV3IGtub3duIGNvcnJlc3BvbmRpbmcgcG9pbnQgcGFpcnMgYW5kIGludHJpbnNpYyBwYXJhbWV0ZXJzICovCitDVkFQSSh2b2lkKSBjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMyKCBjb25zdCBDdk1hdCogb2JqZWN0X3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBpbWFnZV9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogY2FtZXJhX21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0b3J0aW9uX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiByb3RhdGlvbl92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogdHJhbnNsYXRpb25fdmVjdG9yICk7CisKKy8qIENvbXB1dGVzIGluaXRpYWwgZXN0aW1hdGUgb2YgdGhlIGludHJpbnNpYyBjYW1lcmEgcGFyYW1ldGVycworICAgaW4gY2FzZSBvZiBwbGFuYXIgY2FsaWJyYXRpb24gdGFyZ2V0IChlLmcuIGNoZXNzYm9hcmQpICovCitDVkFQSSh2b2lkKSBjdkluaXRJbnRyaW5zaWNQYXJhbXMyRCggY29uc3QgQ3ZNYXQqIG9iamVjdF9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGltYWdlX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbnBvaW50cywgQ3ZTaXplIGltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGNhbWVyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFzcGVjdF9yYXRpbyBDVl9ERUZBVUxUKDEuKSApOworCisjZGVmaW5lIENWX0NBTElCX0NCX0FEQVBUSVZFX1RIUkVTSCAgMQorI2RlZmluZSBDVl9DQUxJQl9DQl9OT1JNQUxJWkVfSU1BR0UgIDIKKyNkZWZpbmUgQ1ZfQ0FMSUJfQ0JfRklMVEVSX1FVQURTICAgICA0IAorCisvKiBEZXRlY3RzIGNvcm5lcnMgb24gYSBjaGVzc2JvYXJkIGNhbGlicmF0aW9uIHBhdHRlcm4gKi8KK0NWQVBJKGludCkgY3ZGaW5kQ2hlc3Nib2FyZENvcm5lcnMoIGNvbnN0IHZvaWQqIGltYWdlLCBDdlNpemUgcGF0dGVybl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBjb3JuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjb3JuZXJfY291bnQgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKENWX0NBTElCX0NCX0FEQVBUSVZFX1RIUkVTSCsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQUxJQl9DQl9OT1JNQUxJWkVfSU1BR0UpICk7CisKKy8qIERyYXdzIGluZGl2aWR1YWwgY2hlc3Nib2FyZCBjb3JuZXJzIG9yIHRoZSB3aG9sZSBjaGVzc2JvYXJkIGRldGVjdGVkICovCitDVkFQSSh2b2lkKSBjdkRyYXdDaGVzc2JvYXJkQ29ybmVycyggQ3ZBcnIqIGltYWdlLCBDdlNpemUgcGF0dGVybl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogY29ybmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCBwYXR0ZXJuX3dhc19mb3VuZCApOworCisjZGVmaW5lIENWX0NBTElCX1VTRV9JTlRSSU5TSUNfR1VFU1MgIDEKKyNkZWZpbmUgQ1ZfQ0FMSUJfRklYX0FTUEVDVF9SQVRJTyAgICAgMgorI2RlZmluZSBDVl9DQUxJQl9GSVhfUFJJTkNJUEFMX1BPSU5UICA0CisjZGVmaW5lIENWX0NBTElCX1pFUk9fVEFOR0VOVF9ESVNUICAgIDgKKyNkZWZpbmUgQ1ZfQ0FMSUJfRklYX0ZPQ0FMX0xFTkdUSCAxNgorI2RlZmluZSBDVl9DQUxJQl9GSVhfSzEgIDMyCisjZGVmaW5lIENWX0NBTElCX0ZJWF9LMiAgNjQKKyNkZWZpbmUgQ1ZfQ0FMSUJfRklYX0szICAxMjgKKworLyogRmluZHMgaW50cmluc2ljIGFuZCBleHRyaW5zaWMgY2FtZXJhIHBhcmFtZXRlcnMKKyAgIGZyb20gYSBmZXcgdmlld3Mgb2Yga25vd24gY2FsaWJyYXRpb24gcGF0dGVybiAqLworQ1ZBUEkodm9pZCkgY3ZDYWxpYnJhdGVDYW1lcmEyKCBjb25zdCBDdk1hdCogb2JqZWN0X3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGltYWdlX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHBvaW50X2NvdW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltYWdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBjYW1lcmFfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogZGlzdG9ydGlvbl9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiByb3RhdGlvbl92ZWN0b3JzIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiB0cmFuc2xhdGlvbl92ZWN0b3JzIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKDApICk7CisKKy8qIENvbXB1dGVzIHZhcmlvdXMgdXNlZnVsIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgY2FtZXJhIGZyb20gdGhlIGRhdGEgY29tcHV0ZWQgYnkKKyAgIGN2Q2FsaWJyYXRlQ2FtZXJhMiAqLworQ1ZBUEkodm9pZCkgY3ZDYWxpYnJhdGlvbk1hdHJpeFZhbHVlcyggY29uc3QgQ3ZNYXQgKmNhbWVyYV9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYXBlcnR1cmVfd2lkdGggQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFwZXJ0dXJlX2hlaWdodCBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmZvdnggQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpmb3Z5IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqZm9jYWxfbGVuZ3RoIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiAqcHJpbmNpcGFsX3BvaW50IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqcGl4ZWxfYXNwZWN0X3JhdGlvIENWX0RFRkFVTFQoTlVMTCkpOworCisjZGVmaW5lIENWX0NBTElCX0ZJWF9JTlRSSU5TSUMgIDI1NgorI2RlZmluZSBDVl9DQUxJQl9TQU1FX0ZPQ0FMX0xFTkdUSCA1MTIKKworLyogQ29tcHV0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gb25lIGNhbWVyYSBjb29yZGluYXRlIHN5c3RlbSB0byBhbm90aGVyIG9uZQorICAgZnJvbSBhIGZldyBjb3JyZXNwb25kZW50IHZpZXdzIG9mIHRoZSBzYW1lIGNhbGlicmF0aW9uIHRhcmdldC4gT3B0aW9uYWxseSwgY2FsaWJyYXRlcworICAgYm90aCBjYW1lcmFzICovCitDVkFQSSh2b2lkKSBjdlN0ZXJlb0NhbGlicmF0ZSggY29uc3QgQ3ZNYXQqIG9iamVjdF9wb2ludHMsIGNvbnN0IEN2TWF0KiBpbWFnZV9wb2ludHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBpbWFnZV9wb2ludHMyLCBjb25zdCBDdk1hdCogbnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogY2FtZXJhX21hdHJpeDEsIEN2TWF0KiBkaXN0X2NvZWZmczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGNhbWVyYV9tYXRyaXgyLCBDdk1hdCogZGlzdF9jb2VmZnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZV9zaXplLCBDdk1hdCogUiwgQ3ZNYXQqIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIEUgQ1ZfREVGQVVMVCgwKSwgQ3ZNYXQqIEYgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQgQ1ZfREVGQVVMVChjdlRlcm1Dcml0ZXJpYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfVEVSTUNSSVRfSVRFUitDVl9URVJNQ1JJVF9FUFMsMzAsMWUtNikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyBDVl9ERUZBVUxUKENWX0NBTElCX0ZJWF9JTlRSSU5TSUMpICk7CisKKyNkZWZpbmUgQ1ZfQ0FMSUJfWkVST19ESVNQQVJJVFkgMTAyNAorCisvKiBDb21wdXRlcyAzRCByb3RhdGlvbnMgKCsgb3B0aW9uYWwgc2hpZnQpIGZvciBlYWNoIGNhbWVyYSBjb29yZGluYXRlIHN5c3RlbSB0byBtYWtlIGJvdGgKKyAgIHZpZXdzIHBhcmFsbGVsICg9PiB0byBtYWtlIGFsbCB0aGUgZXBpcG9sYXIgbGluZXMgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCkgKi8KK0NWQVBJKHZvaWQpIGN2U3RlcmVvUmVjdGlmeSggY29uc3QgQ3ZNYXQqIGNhbWVyYV9tYXRyaXgxLCBjb25zdCBDdk1hdCogY2FtZXJhX21hdHJpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0X2NvZWZmczEsIGNvbnN0IEN2TWF0KiBkaXN0X2NvZWZmczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZV9zaXplLCBjb25zdCBDdk1hdCogUiwgY29uc3QgQ3ZNYXQqIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBSMSwgQ3ZNYXQqIFIyLCBDdk1hdCogUDEsIEN2TWF0KiBQMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIFEgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzIENWX0RFRkFVTFQoQ1ZfQ0FMSUJfWkVST19ESVNQQVJJVFkpICk7CisKKy8qIENvbXB1dGVzIHJlY3RpZmljYXRpb24gdHJhbnNmb3JtYXRpb25zIGZvciB1bmNhbGlicmF0ZWQgcGFpciBvZiBpbWFnZXMgdXNpbmcgYSBzZXQKKyAgIG9mIHBvaW50IGNvcnJlc3BvbmRlbmNlcyAqLworQ1ZBUEkoaW50KSBjdlN0ZXJlb1JlY3RpZnlVbmNhbGlicmF0ZWQoIGNvbnN0IEN2TWF0KiBwb2ludHMxLCBjb25zdCBDdk1hdCogcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogRiwgQ3ZTaXplIGltZ19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBIMSwgQ3ZNYXQqIEgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aHJlc2hvbGQgQ1ZfREVGQVVMVCg1KSk7CisKK3R5cGVkZWYgc3RydWN0IEN2UE9TSVRPYmplY3QgQ3ZQT1NJVE9iamVjdDsKKworLyogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBDdlBPU0lUT2JqZWN0IHN0cnVjdHVyZSBiZWZvcmUgZG9pbmcgY3ZQT1NJVCAqLworQ1ZBUEkoQ3ZQT1NJVE9iamVjdCopICBjdkNyZWF0ZVBPU0lUT2JqZWN0KCBDdlBvaW50M0QzMmYqIHBvaW50cywgaW50IHBvaW50X2NvdW50ICk7CisKKworLyogUnVucyBQT1NJVCAoUE9TZSBmcm9tIElUZXJhdGlvbikgYWxnb3JpdGhtIGZvciBkZXRlcm1pbmluZyAzZCBwb3NpdGlvbiBvZgorICAgYW4gb2JqZWN0IGdpdmVuIGl0cyBtb2RlbCBhbmQgcHJvamVjdGlvbiBpbiBhIHdlYWstcGVyc3BlY3RpdmUgY2FzZSAqLworQ1ZBUEkodm9pZCkgIGN2UE9TSVQoICBDdlBPU0lUT2JqZWN0KiBwb3NpdF9vYmplY3QsIEN2UG9pbnQyRDMyZiogaW1hZ2VfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZm9jYWxfbGVuZ3RoLCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmIHJvdGF0aW9uX21hdHJpeCwgQ3ZWZWN0MzJmIHRyYW5zbGF0aW9uX3ZlY3Rvcik7CisKKy8qIFJlbGVhc2VzIEN2UE9TSVRPYmplY3Qgc3RydWN0dXJlICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlUE9TSVRPYmplY3QoIEN2UE9TSVRPYmplY3QqKiAgcG9zaXRfb2JqZWN0ICk7CisKKy8qIHVwZGF0ZXMgdGhlIG51bWJlciBvZiBSQU5TQUMgaXRlcmF0aW9ucyAqLworQ1ZBUEkoaW50KSBjdlJBTlNBQ1VwZGF0ZU51bUl0ZXJzKCBkb3VibGUgcCwgZG91YmxlIGVycl9wcm9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZWxfcG9pbnRzLCBpbnQgbWF4X2l0ZXJzICk7CisKK0NWQVBJKHZvaWQpIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogZHN0ICk7CisKKy8qIENhbGN1bGF0ZXMgZnVuZGFtZW50YWwgbWF0cml4IGdpdmVuIGEgc2V0IG9mIGNvcnJlc3BvbmRpbmcgcG9pbnRzICovCisjZGVmaW5lIENWX0ZNXzdQT0lOVCAxCisjZGVmaW5lIENWX0ZNXzhQT0lOVCAyCisjZGVmaW5lIENWX0ZNX0xNRURTX09OTFkgIENWX0xNRURTCisjZGVmaW5lIENWX0ZNX1JBTlNBQ19PTkxZIENWX1JBTlNBQworI2RlZmluZSBDVl9GTV9MTUVEUyBDVl9MTUVEUworI2RlZmluZSBDVl9GTV9SQU5TQUMgQ1ZfUkFOU0FDCitDVkFQSShpbnQpIGN2RmluZEZ1bmRhbWVudGFsTWF0KCBjb25zdCBDdk1hdCogcG9pbnRzMSwgY29uc3QgQ3ZNYXQqIHBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogZnVuZGFtZW50YWxfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCBDVl9ERUZBVUxUKENWX0ZNX1JBTlNBQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0xIENWX0RFRkFVTFQoMy4pLCBkb3VibGUgcGFyYW0yIENWX0RFRkFVTFQoMC45OSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogc3RhdHVzIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogRm9yIGVhY2ggaW5wdXQgcG9pbnQgb24gb25lIG9mIGltYWdlcworICAgY29tcHV0ZXMgcGFyYW1ldGVycyBvZiB0aGUgY29ycmVzcG9uZGluZworICAgZXBpcG9sYXIgbGluZSBvbiB0aGUgb3RoZXIgaW1hZ2UgKi8KK0NWQVBJKHZvaWQpIGN2Q29tcHV0ZUNvcnJlc3BvbmRFcGlsaW5lcyggY29uc3QgQ3ZNYXQqIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdoaWNoX2ltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogZnVuZGFtZW50YWxfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogY29ycmVzcG9uZGVudF9saW5lcyApOworCisvKiBzdGVyZW8gY29ycmVzcG9uZGVuY2UgcGFyYW1ldGVycyBhbmQgZnVuY3Rpb25zICovCisKKyNkZWZpbmUgQ1ZfU1RFUkVPX0JNX05PUk1BTElaRURfUkVTUE9OU0UgIDAKKworLyogQmxvY2sgbWF0Y2hpbmcgYWxnb3JpdGhtIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdGVyZW9CTVN0YXRlCit7CisgICAgLy8gcHJlLWZpbHRlcmluZyAobm9ybWFsaXphdGlvbiBvZiBpbnB1dCBpbWFnZXMpCisgICAgaW50IHByZUZpbHRlclR5cGU7IC8vID1DVl9TVEVSRU9fQk1fTk9STUFMSVpFRF9SRVNQT05TRSBub3cKKyAgICBpbnQgcHJlRmlsdGVyU2l6ZTsgLy8gYXZlcmFnaW5nIHdpbmRvdyBzaXplOiB+NXg1Li4yMXgyMQorICAgIGludCBwcmVGaWx0ZXJDYXA7IC8vIHRoZSBvdXRwdXQgb2YgcHJlLWZpbHRlcmluZyBpcyBjbGlwcGVkIGJ5IFstcHJlRmlsdGVyQ2FwLHByZUZpbHRlckNhcF0KKyAgICAKKyAgICAvLyBjb3JyZXNwb25kZW5jZSB1c2luZyBTdW0gb2YgQWJzb2x1dGUgRGlmZmVyZW5jZSAoU0FEKQorICAgIGludCBTQURXaW5kb3dTaXplOyAvLyB+NXg1Li4yMXgyMQorICAgIGludCBtaW5EaXNwYXJpdHk7ICAvLyBtaW5pbXVtIGRpc3Bhcml0eSAoY2FuIGJlIG5lZ2F0aXZlKSAKKyAgICBpbnQgbnVtYmVyT2ZEaXNwYXJpdGllczsgLy8gbWF4aW11bSBkaXNwYXJpdHkgLSBtaW5pbXVtIGRpc3Bhcml0eSAoPiAwKQorICAgIAorICAgIC8vIHBvc3QtZmlsdGVyaW5nCisgICAgaW50IHRleHR1cmVUaHJlc2hvbGQ7ICAvLyB0aGUgZGlzcGFyaXR5IGlzIG9ubHkgY29tcHV0ZWQgZm9yIHBpeGVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCB0ZXh0dXJlZCBlbm91Z2ggbmVpZ2hib3Job29kCisgICAgaW50IHVuaXF1ZW5lc3NSYXRpbzsgICAvLyBhY2NlcHQgdGhlIGNvbXB1dGVkIGRpc3Bhcml0eSBkKiBvbmx5IGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTQUQoZCkgPj0gU0FEKGQqKSooMSArIHVuaXF1ZW5lc3NSYXRpby8xMDAuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGFueSBkICE9IGQqKy8tMSB3aXRoaW4gdGhlIHNlYXJjaCByYW5nZS4KKyAgICBpbnQgc3BlY2tsZVdpbmRvd1NpemU7IC8vIGRpc3Bhcml0eSB2YXJpYXRpb24gd2luZG93CisgICAgaW50IHNwZWNrbGVSYW5nZTsgLy8gYWNjZXB0YWJsZSByYW5nZSBvZiB2YXJpYXRpb24gaW4gd2luZG93CisKKyAgICAvLyB0ZW1wb3JhcnkgYnVmZmVycworICAgIEN2TWF0KiBwcmVGaWx0ZXJlZEltZzA7CisgICAgQ3ZNYXQqIHByZUZpbHRlcmVkSW1nMTsKKyAgICBDdk1hdCogc2xpZGluZ1N1bUJ1ZjsKK30KK0N2U3RlcmVvQk1TdGF0ZTsKKworI2RlZmluZSBDVl9TVEVSRU9fQk1fQkFTSUMgMAorI2RlZmluZSBDVl9TVEVSRU9fQk1fRklTSF9FWUUgMQorI2RlZmluZSBDVl9TVEVSRU9fQk1fTkFSUk9XIDIKKworQ1ZBUEkoQ3ZTdGVyZW9CTVN0YXRlKikgY3ZDcmVhdGVTdGVyZW9CTVN0YXRlKGludCBwcmVzZXQgQ1ZfREVGQVVMVChDVl9TVEVSRU9fQk1fQkFTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXJPZkRpc3Bhcml0aWVzIENWX0RFRkFVTFQoMCkpOworCitDVkFQSSh2b2lkKSBjdlJlbGVhc2VTdGVyZW9CTVN0YXRlKCBDdlN0ZXJlb0JNU3RhdGUqKiBzdGF0ZSApOworCitDVkFQSSh2b2lkKSBjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUJNKCBjb25zdCBDdkFyciogbGVmdCwgY29uc3QgQ3ZBcnIqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRpc3Bhcml0eSwgQ3ZTdGVyZW9CTVN0YXRlKiBzdGF0ZSApOworCisvKiBLb2xtb2dvcm92LVphYmluIHN0ZXJlby1jb3JyZXNwb25kZW5jZSBhbGdvcml0aG0gKGEuay5hLiBLWjEpICovCisjZGVmaW5lIENWX1NURVJFT19HQ19PQ0NMVURFRCAgU0hSVF9NQVgKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdGVyZW9HQ1N0YXRlCit7CisgICAgaW50IEl0aHJlc2hvbGQ7CisgICAgaW50IGludGVyYWN0aW9uUmFkaXVzOworICAgIGZsb2F0IEssIGxhbWJkYSwgbGFtYmRhMSwgbGFtYmRhMjsKKyAgICBpbnQgb2NjbHVzaW9uQ29zdDsKKyAgICBpbnQgbWluRGlzcGFyaXR5OworICAgIGludCBudW1iZXJPZkRpc3Bhcml0aWVzOworICAgIGludCBtYXhJdGVyczsKKworICAgIEN2TWF0KiBsZWZ0OworICAgIEN2TWF0KiByaWdodDsKKyAgICBDdk1hdCogZGlzcExlZnQ7CisgICAgQ3ZNYXQqIGRpc3BSaWdodDsKKyAgICBDdk1hdCogcHRyTGVmdDsKKyAgICBDdk1hdCogcHRyUmlnaHQ7CisgICAgQ3ZNYXQqIHZ0eEJ1ZjsKKyAgICBDdk1hdCogZWRnZUJ1ZjsKK30KK0N2U3RlcmVvR0NTdGF0ZTsKKworQ1ZBUEkoQ3ZTdGVyZW9HQ1N0YXRlKikgY3ZDcmVhdGVTdGVyZW9HQ1N0YXRlKCBpbnQgbnVtYmVyT2ZEaXNwYXJpdGllcywgaW50IG1heEl0ZXJzICk7CitDVkFQSSh2b2lkKSBjdlJlbGVhc2VTdGVyZW9HQ1N0YXRlKCBDdlN0ZXJlb0dDU3RhdGUqKiBzdGF0ZSApOworCitDVkFQSSh2b2lkKSBjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUdDKCBjb25zdCBDdkFyciogbGVmdCwgY29uc3QgQ3ZBcnIqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRpc3Bhcml0eUxlZnQsIEN2QXJyKiBkaXNwYXJpdHlSaWdodCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlN0ZXJlb0dDU3RhdGUqIHN0YXRlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VEaXNwYXJpdHlHdWVzcyBDVl9ERUZBVUxUKDApICk7CisKKy8qIFJlcHJvamVjdHMgdGhlIGNvbXB1dGVkIGRpc3Bhcml0eSBpbWFnZSB0byB0aGUgM0Qgc3BhY2UgdXNpbmcgdGhlIHNwZWNpZmllZCA0eDQgbWF0cml4ICovCitDVkFQSSh2b2lkKSAgY3ZSZXByb2plY3RJbWFnZVRvM0QoIGNvbnN0IEN2QXJyKiBkaXNwYXJpdHlJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIF8zZEltYWdlLCBjb25zdCBDdk1hdCogUSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyNpbmNsdWRlICJjdi5ocHAiCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIENWX05PX0JBQ0tXQVJEX0NPTVBBVElCSUxJVFkKKyNpbmNsdWRlICJjdmNvbXBhdC5oIgorI2VuZGlmCisKKyNlbmRpZiAvKl9DVl9IXyovCmRpZmYgLS1naXQgYS9jdi9pbmNsdWRlL2N2LmhwcCBiL2N2L2luY2x1ZGUvY3YuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MmM5NDYKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9pbmNsdWRlL2N2LmhwcApAQCAtMCwwICsxLDQwOSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NWX0hQUF8KKyNkZWZpbmUgX0NWX0hQUF8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6IEJhc2UgY2xhc3MgZm9yIGZpbHRlcmluZyBvcGVyYXRpb25zICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9XSE9MRSAgIDAKKyNkZWZpbmUgQ1ZfU1RBUlQgICAxCisjZGVmaW5lIENWX0VORCAgICAgMgorI2RlZmluZSBDVl9NSURETEUgIDQKKyNkZWZpbmUgQ1ZfSVNPTEFURURfUk9JIDgKKwordHlwZWRlZiB2b2lkICgqQ3ZSb3dGaWx0ZXJGdW5jKSggY29uc3QgdWNoYXIqIHNyYywgdWNoYXIqIGRzdCwgdm9pZCogcGFyYW1zICk7Cit0eXBlZGVmIHZvaWQgKCpDdkNvbHVtbkZpbHRlckZ1bmMpKCB1Y2hhcioqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworCitjbGFzcyBDVl9FWFBPUlRTIEN2QmFzZUltYWdlRmlsdGVyCit7CitwdWJsaWM6CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXIoKTsKKyAgICAvKiBjYWxscyBpbml0KCkgKi8KKyAgICBDdkJhc2VJbWFnZUZpbHRlciggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisgICAgdmlydHVhbCB+Q3ZCYXNlSW1hZ2VGaWx0ZXIoKTsKKworICAgIC8qIGluaXRpYWxpemVzIHRoZSBjbGFzcyBmb3IgcHJvY2Vzc2luZyBhbiBpbWFnZSBvZiBtYXhpbWFsIHdpZHRoIF9tYXhfd2lkdGgsCisgICAgICAgaW5wdXQgaW1hZ2UgaGFzIGRhdGEgdHlwZSBfc3JjX3R5cGUsIHRoZSBvdXRwdXQgd2lsbCBoYXZlIF9kc3RfdHlwZS4KKyAgICAgICBfaXNfc2VwYXJhYmxlICE9IDAgaWYgdGhlIGZpbHRlciBpcyBzZXBhcmFibGUKKyAgICAgICAoc3BlY2lmaWMgYmVoYXZpb3VyIGlzIGRlZmluZWQgaW4gYSBkZXJpdmVkIGNsYXNzKSwgMCBvdGhlcndpc2UuCisgICAgICAgX2tzaXplIGFuZCBfYW5jaG9yIHNwZWNpZnkgdGhlIGtlcm5lbCBzaXplIGFuZCB0aGUgYW5jaG9yIHBvaW50LiBfYW5jaG9yPSgtMSwtMSkgbWVhbnMKKyAgICAgICB0aGF0IHRoZSBhbmNob3IgaXMgYXQgdGhlIGNlbnRlci4KKyAgICAgICB0byBnZXQgaW50ZXJwb2xhdGUgcGl4ZWwgdmFsdWVzIG91dHNpZGUgdGhlIGltYWdlIF9ib3JkZXJfbW9kZT1JUExfQk9SREVSXyoqKiBpcyB1c2VkLAorICAgICAgIF9ib3JkZXJfdmFsdWUgc3BlY2lmeSB0aGUgcGl4ZWwgdmFsdWUgaW4gY2FzZSBvZiBJUExfQk9SREVSX0NPTlNUQU5UIGJvcmRlciBtb2RlLgorICAgICAgIGJlZm9yZSBpbml0aWFsaXphdGlvbiBjbGVhcigpIGlzIGNhbGxlZCBpZiBuZWNlc3NhcnkuCisgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisgICAgLyogcmVsZWFzZXMgYWxsIHRoZSBpbnRlcm5hbCBidWZmZXJzLgorICAgICAgIGZvciB0aGUgZnVydGhlciB1c2Ugb2YgdGhlIG9iamVjdCwgaW5pdCgpIG5lZWRzIHRvIGJlIGNhbGxlZC4gKi8KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKyAgICAvKiBwcm9jZXNzZXMgaW5wdXQgaW1hZ2Ugb3IgYSBwYXJ0IG9mIGl0LgorICAgICAgIGlucHV0IGlzIHJlcHJlc2VudGVkIGVpdGhlciBhcyBtYXRyaXggKEN2TWF0KiBzcmMpCisgICAgICAgb3IgYSBsaXN0IG9mIHJvdyBwb2ludGVycyAodWNoYXIqKiBzcmMyKS4KKyAgICAgICBpbiB0aGUgbGF0ZXIgY2FzZSB3aWR0aCwgX3NyY195MSBhbmQgX3NyY195MiBhcmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzaXplLgorICAgICAgIF9kc3QgaXMgdGhlIG91dHB1dCBpbWFnZS9tYXRyaXguCisgICAgICAgX3NyY19yb2kgc3BlY2lmaWVzIHRoZSByb2kgaW5zaWRlIHRoZSBpbnB1dCBpbWFnZSB0byBwcm9jZXNzLAorICAgICAgICAgICgwLDAsLTEsLTEpIGRlbm90ZXMgdGhlIHdob2xlIGltYWdlLgorICAgICAgIF9kc3Rfb3JpZ2luIGlzIHRoZSB1cHBlci1sZWZ0IGNvcm5lciBvZiB0aGUgZmlsdGVyZWQgcm9pIHdpdGhpbiB0aGUgb3V0cHV0IGltYWdlLgorICAgICAgIF9waGFzZSBpcyBlaXRoZXIgQ1ZfU1RBUlQsIG9yIENWX0VORCwgb3IgQ1ZfTUlERExFLCBvciBDVl9TVEFSVHxDVl9FTkQsIG9yIENWX1dIT0xFLAorICAgICAgICAgIHdoaWNoIGlzIHRoZSBzYW1lIGFzIENWX1NUQVJUfENWX0VORC4KKyAgICAgICAgICBDVl9TVEFSVCBtZWFucyB0aGF0IHRoZSBpbnB1dCBpcyB0aGUgZmlyc3QgKHRvcCkgc3RyaXBlIG9mIHRoZSBwcm9jZXNzZWQgaW1hZ2UgW3JvaV0sCisgICAgICAgICAgQ1ZfRU5EIC0gdGhlIGlucHV0IGlzIHRoZSBsYXN0IChib3R0b20pIHN0cmlwZSBvZiB0aGUgcHJvY2Vzc2VkIGltYWdlIFtyb2ldLAorICAgICAgICAgIENWX01JRERMRSAtIHRoZSBpbnB1dCBpcyBuZWl0aGVyIGZpcnN0IG5vciBsYXN0IHN0cmlwZS4KKyAgICAgICAgICBDVl9XSE9MRSAtIHRoZSBpbnB1dCBpcyB0aGUgd2hvbGUgcHJvY2Vzc2VkIGltYWdlIFtyb2ldLgorICAgICovCisgICAgdmlydHVhbCBpbnQgcHJvY2VzcyggY29uc3QgQ3ZNYXQqIF9zcmMsIEN2TWF0KiBfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCBfc3JjX3JvaT1jdlJlY3QoMCwwLC0xLC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9kc3Rfb3JpZ2luPWN2UG9pbnQoMCwwKSwgaW50IF9mbGFncz0wICk7CisgICAgLyogcmV0cmlldmUgdmFyaW91cyBwYXJhbWV0ZXJzIG9mIHRoZSBmaWx0ZXJpbmcgb2JqZWN0ICovCisgICAgaW50IGdldF9zcmNfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHNyY190eXBlOyB9CisgICAgaW50IGdldF9kc3RfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIGRzdF90eXBlOyB9CisgICAgaW50IGdldF93b3JrX3R5cGUoKSBjb25zdCB7IHJldHVybiB3b3JrX3R5cGU7IH0KKyAgICBDdlNpemUgZ2V0X2tlcm5lbF9zaXplKCkgY29uc3QgeyByZXR1cm4ga3NpemU7IH0KKyAgICBDdlBvaW50IGdldF9hbmNob3IoKSBjb25zdCB7IHJldHVybiBhbmNob3I7IH0KKyAgICBpbnQgZ2V0X3dpZHRoKCkgY29uc3QgeyByZXR1cm4gcHJldl94X3JhbmdlLmVuZF9pbmRleCAtIHByZXZfeF9yYW5nZS5zdGFydF9pbmRleDsgfQorICAgIEN2Um93RmlsdGVyRnVuYyBnZXRfeF9maWx0ZXJfZnVuYygpIGNvbnN0IHsgcmV0dXJuIHhfZnVuYzsgfQorICAgIEN2Q29sdW1uRmlsdGVyRnVuYyBnZXRfeV9maWx0ZXJfZnVuYygpIGNvbnN0IHsgcmV0dXJuIHlfZnVuYzsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyogaW5pdGlhbGl6ZXMgd29ya190eXBlLCBidWZfc2l6ZSBhbmQgbWF4X3Jvd3MgKi8gCisgICAgdmlydHVhbCB2b2lkIGdldF93b3JrX3BhcmFtcygpOworICAgIC8qIGl0IGlzIGNhbGxlZCAobm90IGFsd2F5cykgZnJvbSBwcm9jZXNzIHdoZW4gX3BoYXNlPUNWX1NUQVJUIG9yIENWX1dIT0xFLgorICAgICAgIHRoZSBtZXRob2QgaW5pdGlhbGl6ZXMgcmluZyBidWZmZXIgKGJ1Zl9lbmQsIGJ1Zl9oZWFkLCBidWZfdGFpbCwgYnVmX2NvdW50LCByb3dzKSwKKyAgICAgICBwcmV2X3dpZHRoLCBwcmV2X3hfcmFuZ2UsIGNvbnN0X3JvdywgYm9yZGVyX3RhYiwgYm9yZGVyX3RhYl9zeiogKi8KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRfcHJvY2VzcyggQ3ZTbGljZSB4X3JhbmdlLCBpbnQgd2lkdGggKTsKKyAgICAvKiBmb3JtcyBwb2ludGVycyB0byAidmlydHVhbCByb3dzIiBhYm92ZSBvciBiZWxvdyB0aGUgcHJvY2Vzc2VkIHJvaSB1c2luZyB0aGUgc3BlY2lmaWVkCisgICAgICAgYm9yZGVyIG1vZGUgKi8KKyAgICB2aXJ0dWFsIHZvaWQgbWFrZV95X2JvcmRlciggaW50IHJvd19jb3VudCwgaW50IHRvcF9yb3dzLCBpbnQgYm90dG9tX3Jvd3MgKTsKKworICAgIHZpcnR1YWwgaW50IGZpbGxfY3ljbGljX2J1ZmZlciggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksIGludCB5MSwgaW50IHkyICk7CisKKyAgICBlbnVtIHsgQUxJR049MzIgfTsKKyAgICAKKyAgICBpbnQgbWF4X3dpZHRoOworICAgIC8qIGN1cnJlbnRseSwgd29ya190eXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgc3JjX3R5cGUgaW4gY2FzZSBvZiBub24tc2VwYXJhYmxlIGZpbHRlcnMgKi8KKyAgICBpbnQgbWluX2RlcHRoLCBzcmNfdHlwZSwgZHN0X3R5cGUsIHdvcmtfdHlwZTsKKworICAgIC8qIHBvaW50ZXJzIHRvIGNvbnZvbHV0aW9uIGZ1bmN0aW9ucywgaW5pdGlhbGl6ZWQgYnkgaW5pdCBtZXRob2QuCisgICAgICAgZm9yIG5vbi1zZXBhcmFibGUgZmlsdGVycyBvbmx5IHlfY29udiBzaG91bGQgYmUgc2V0ICovCisgICAgQ3ZSb3dGaWx0ZXJGdW5jIHhfZnVuYzsKKyAgICBDdkNvbHVtbkZpbHRlckZ1bmMgeV9mdW5jOworCisgICAgdWNoYXIqIGJ1ZmZlcjsKKyAgICB1Y2hhcioqIHJvd3M7CisgICAgaW50IHRvcF9yb3dzLCBib3R0b21fcm93cywgbWF4X3Jvd3M7CisgICAgdWNoYXIgKmJ1Zl9zdGFydCwgKmJ1Zl9lbmQsICpidWZfaGVhZCwgKmJ1Zl90YWlsOworICAgIGludCBidWZfc2l6ZSwgYnVmX3N0ZXAsIGJ1Zl9jb3VudCwgYnVmX21heF9jb3VudDsKKworICAgIGJvb2wgaXNfc2VwYXJhYmxlOworICAgIEN2U2l6ZSBrc2l6ZTsKKyAgICBDdlBvaW50IGFuY2hvcjsKKyAgICBpbnQgbWF4X2t5LCBib3JkZXJfbW9kZTsKKyAgICBDdlNjYWxhciBib3JkZXJfdmFsdWU7CisgICAgdWNoYXIqIGNvbnN0X3JvdzsKKyAgICBpbnQqIGJvcmRlcl90YWI7CisgICAgaW50IGJvcmRlcl90YWJfc3oxLCBib3JkZXJfdGFiX3N6OworCisgICAgQ3ZTbGljZSBwcmV2X3hfcmFuZ2U7CisgICAgaW50IHByZXZfd2lkdGg7Cit9OworCisKKy8qIERlcml2ZWQgY2xhc3MsIGZvciBsaW5lYXIgc2VwYXJhYmxlIGZpbHRlcmluZy4gKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZTZXBGaWx0ZXIgOiBwdWJsaWMgQ3ZCYXNlSW1hZ2VGaWx0ZXIKK3sKK3B1YmxpYzoKKyAgICBDdlNlcEZpbHRlcigpOworICAgIEN2U2VwRmlsdGVyKCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9reCwgY29uc3QgQ3ZNYXQqIF9reSwKKyAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisgICAgdmlydHVhbCB+Q3ZTZXBGaWx0ZXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9reCwgY29uc3QgQ3ZNYXQqIF9reSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisgICAgdmlydHVhbCB2b2lkIGluaXRfZGVyaXYoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHgsIGludCBkeSwgaW50IGFwZXJ0dXJlX3NpemUsIGludCBmbGFncz0wICk7CisgICAgdmlydHVhbCB2b2lkIGluaXRfZ2F1c3NpYW4oIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2F1c3NpYW5fc2l6ZSwgZG91YmxlIHNpZ21hICk7CisKKyAgICAvKiBkdW1teSBtZXRob2QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKyAgICBjb25zdCBDdk1hdCogZ2V0X3hfa2VybmVsKCkgY29uc3QgeyByZXR1cm4ga3g7IH0KKyAgICBjb25zdCBDdk1hdCogZ2V0X3lfa2VybmVsKCkgY29uc3QgeyByZXR1cm4ga3k7IH0KKyAgICBpbnQgZ2V0X3hfa2VybmVsX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4ga3hfZmxhZ3M7IH0KKyAgICBpbnQgZ2V0X3lfa2VybmVsX2ZsYWdzKCkgY29uc3QgeyByZXR1cm4ga3lfZmxhZ3M7IH0KKworICAgIGVudW0geyBHRU5FUklDPTAsIEFTWU1NRVRSSUNBTD0xLCBTWU1NRVRSSUNBTD0yLCBQT1NJVElWRT00LCBTVU1fVE9fMT04LCBJTlRFR0VSPTE2IH07CisgICAgZW51bSB7IE5PUk1BTElaRV9LRVJORUw9MSwgRkxJUF9LRVJORUw9MiB9OworCisgICAgc3RhdGljIHZvaWQgaW5pdF9nYXVzc2lhbl9rZXJuZWwoIEN2TWF0KiBrZXJuZWwsIGRvdWJsZSBzaWdtYT0tMSApOworICAgIHN0YXRpYyB2b2lkIGluaXRfc29iZWxfa2VybmVsKCBDdk1hdCogX2t4LCBDdk1hdCogX2t5LCBpbnQgZHgsIGludCBkeSwgaW50IGZsYWdzPTAgKTsKKyAgICBzdGF0aWMgdm9pZCBpbml0X3NjaGFycl9rZXJuZWwoIEN2TWF0KiBfa3gsIEN2TWF0KiBfa3ksIGludCBkeCwgaW50IGR5LCBpbnQgZmxhZ3M9MCApOworCitwcm90ZWN0ZWQ6CisgICAgQ3ZNYXQgKmt4LCAqa3k7CisgICAgaW50IGt4X2ZsYWdzLCBreV9mbGFnczsKK307CisKKworLyogRGVyaXZlZCBjbGFzcywgZm9yIGxpbmVhciBub24tc2VwYXJhYmxlIGZpbHRlcmluZy4gKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZMaW5lYXJGaWx0ZXIgOiBwdWJsaWMgQ3ZCYXNlSW1hZ2VGaWx0ZXIKK3sKK3B1YmxpYzoKKyAgICBDdkxpbmVhckZpbHRlcigpOworICAgIEN2TGluZWFyRmlsdGVyKCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9rZXJuZWwsCisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvcj1jdlBvaW50KC0xLC0xKSwKKyAgICAgICAgICAgICAgICAgICAgaW50IF9ib3JkZXJfbW9kZT1JUExfQk9SREVSX1JFUExJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZT1jdlNjYWxhckFsbCgwKSApOworICAgIHZpcnR1YWwgfkN2TGluZWFyRmlsdGVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9hbmNob3I9Y3ZQb2ludCgtMSwtMSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBfYm9yZGVyX21vZGU9SVBMX0JPUkRFUl9SRVBMSUNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWU9Y3ZTY2FsYXJBbGwoMCkgKTsKKworICAgIC8qIGR1bW15IG1ldGhvZCB0byBhdm9pZCBjb21waWxlciB3YXJuaW5ncyAqLworICAgIHZpcnR1YWwgdm9pZCBpbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfaXNfc2VwYXJhYmxlLCBDdlNpemUgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9hbmNob3I9Y3ZQb2ludCgtMSwtMSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBfYm9yZGVyX21vZGU9SVBMX0JPUkRFUl9SRVBMSUNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWU9Y3ZTY2FsYXJBbGwoMCkgKTsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpOworICAgIGNvbnN0IEN2TWF0KiBnZXRfa2VybmVsKCkgY29uc3QgeyByZXR1cm4ga2VybmVsOyB9CisgICAgdWNoYXIqIGdldF9rZXJuZWxfc3BhcnNlX2J1ZigpIHsgcmV0dXJuIGtfc3BhcnNlOyB9CisgICAgaW50IGdldF9rZXJuZWxfc3BhcnNlX2NvdW50KCkgY29uc3QgeyByZXR1cm4ga19zcGFyc2VfY291bnQ7IH0KKworcHJvdGVjdGVkOgorICAgIEN2TWF0ICprZXJuZWw7CisgICAgdWNoYXIqIGtfc3BhcnNlOworICAgIGludCBrX3NwYXJzZV9jb3VudDsKK307CisKKworLyogQm94IGZpbHRlciAoImFsbCAxJ3MiLCBvcHRpb25hbGx5IG5vcm1hbGl6ZWQpIGZpbHRlci4gKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZCb3hGaWx0ZXIgOiBwdWJsaWMgQ3ZCYXNlSW1hZ2VGaWx0ZXIKK3sKK3B1YmxpYzoKKyAgICBDdkJveEZpbHRlcigpOworICAgIEN2Qm94RmlsdGVyKCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBfbm9ybWFsaXplZCwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisgICAgdmlydHVhbCB2b2lkIGluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIF9ub3JtYWxpemVkLCBDdlNpemUgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9hbmNob3I9Y3ZQb2ludCgtMSwtMSksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBfYm9yZGVyX21vZGU9SVBMX0JPUkRFUl9SRVBMSUNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWU9Y3ZTY2FsYXJBbGwoMCkgKTsKKworICAgIHZpcnR1YWwgfkN2Qm94RmlsdGVyKCk7CisgICAgYm9vbCBpc19ub3JtYWxpemVkKCkgY29uc3QgeyByZXR1cm4gbm9ybWFsaXplZDsgfQorICAgIGRvdWJsZSBnZXRfc2NhbGUoKSBjb25zdCB7IHJldHVybiBzY2FsZTsgfQorICAgIHVjaGFyKiBnZXRfc3VtX2J1ZigpIHsgcmV0dXJuIHN1bTsgfQorICAgIGludCogZ2V0X3N1bV9jb3VudF9wdHIoKSB7IHJldHVybiAmc3VtX2NvdW50OyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRfcHJvY2VzcyggQ3ZTbGljZSB4X3JhbmdlLCBpbnQgd2lkdGggKTsKKworICAgIHVjaGFyKiBzdW07CisgICAgaW50IHN1bV9jb3VudDsKKyAgICBib29sIG5vcm1hbGl6ZWQ7CisgICAgZG91YmxlIHNjYWxlOworfTsKKworCisvKiBMYXBsYWNpYW4gb3BlcmF0b3I6IChkMi9keCArIGQyL2R5KUkuICovCitjbGFzcyBDVl9FWFBPUlRTIEN2TGFwbGFjZUZpbHRlciA6IHB1YmxpYyBDdlNlcEZpbHRlcgoreworcHVibGljOgorICAgIEN2TGFwbGFjZUZpbHRlcigpOworICAgIEN2TGFwbGFjZUZpbHRlciggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICBib29sIF9ub3JtYWxpemVkLCBpbnQgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgaW50IF9ib3JkZXJfbW9kZT1JUExfQk9SREVSX1JFUExJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWU9Y3ZTY2FsYXJBbGwoMCkgKTsKKyAgICB2aXJ0dWFsIH5DdkxhcGxhY2VGaWx0ZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX25vcm1hbGl6ZWQsIGludCBfa3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBfYm9yZGVyX21vZGU9SVBMX0JPUkRFUl9SRVBMSUNBVEUsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWU9Y3ZTY2FsYXJBbGwoMCkgKTsKKworICAgIC8qIGR1bW15IG1ldGhvZHMgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfa3gsIGNvbnN0IEN2TWF0KiBfa3ksCisgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvcj1jdlBvaW50KC0xLC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IF9ib3JkZXJfbW9kZT1JUExfQk9SREVSX1JFUExJQ0FURSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZT1jdlNjYWxhckFsbCgwKSApOworCisgICAgYm9vbCBpc19ub3JtYWxpemVkKCkgY29uc3QgeyByZXR1cm4gbm9ybWFsaXplZDsgfQorICAgIGJvb2wgaXNfYmFzaWNfbGFwbGFjaWFuKCkgY29uc3QgeyByZXR1cm4gYmFzaWNfbGFwbGFjaWFuOyB9Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBnZXRfd29ya19wYXJhbXMoKTsKKworICAgIGJvb2wgYmFzaWNfbGFwbGFjaWFuOworICAgIGJvb2wgbm9ybWFsaXplZDsKK307CisKKworLyogYmFzaWMgbW9ycGhvbG9naWNhbCBvcGVyYXRpb25zOiBlcm9zaW9uICYgZGlsYXRpb24gKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZNb3JwaG9sb2d5IDogcHVibGljIEN2QmFzZUltYWdlRmlsdGVyCit7CitwdWJsaWM6CisgICAgQ3ZNb3JwaG9sb2d5KCk7CisgICAgQ3ZNb3JwaG9sb2d5KCBpbnQgX29wZXJhdGlvbiwgaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgaW50IF9lbGVtZW50X3NoYXBlLCBDdk1hdCogX2VsZW1lbnQsCisgICAgICAgICAgICAgICAgICBDdlNpemUgX2tzaXplPWN2U2l6ZSgwLDApLCBDdlBvaW50IF9hbmNob3I9Y3ZQb2ludCgtMSwtMSksCisgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZT1jdlNjYWxhckFsbCgwKSApOworICAgIHZpcnR1YWwgfkN2TW9ycGhvbG9neSgpOworICAgIHZpcnR1YWwgdm9pZCBpbml0KCBpbnQgX29wZXJhdGlvbiwgaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2VsZW1lbnRfc2hhcGUsIEN2TWF0KiBfZWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIF9rc2l6ZT1jdlNpemUoMCwwKSwgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisKKyAgICAvKiBkdW1teSBtZXRob2QgdG8gYXZvaWQgY29tcGlsZXIgd2FybmluZ3MgKi8KKyAgICB2aXJ0dWFsIHZvaWQgaW5pdCggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yPWN2UG9pbnQoLTEsLTEpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlPUlQTF9CT1JERVJfUkVQTElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlPWN2U2NhbGFyQWxsKDApICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKyAgICBjb25zdCBDdk1hdCogZ2V0X2VsZW1lbnQoKSBjb25zdCB7IHJldHVybiBlbGVtZW50OyB9CisgICAgaW50IGdldF9lbGVtZW50X3NoYXBlKCkgY29uc3QgeyByZXR1cm4gZWxfc2hhcGU7IH0KKyAgICBpbnQgZ2V0X29wZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdGlvbjsgfQorICAgIHVjaGFyKiBnZXRfZWxlbWVudF9zcGFyc2VfYnVmKCkgeyByZXR1cm4gZWxfc3BhcnNlOyB9CisgICAgaW50IGdldF9lbGVtZW50X3NwYXJzZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGVsX3NwYXJzZV9jb3VudDsgfQorCisgICAgZW51bSB7IFJFQ1Q9MCwgQ1JPU1M9MSwgRUxMSVBTRT0yLCBDVVNUT009MTAwLCBCSU5BUlkgPSAwLCBHUkFZU0NBTEU9MjU2IH07CisgICAgZW51bSB7IEVST0RFPTAsIERJTEFURT0xIH07CisKKyAgICBzdGF0aWMgdm9pZCBpbml0X2JpbmFyeV9lbGVtZW50KCBDdk1hdCogX2VsZW1lbnQsIGludCBfZWxlbWVudF9zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9hbmNob3I9Y3ZQb2ludCgtMSwtMSkgKTsKK3Byb3RlY3RlZDoKKworICAgIHZvaWQgc3RhcnRfcHJvY2VzcyggQ3ZTbGljZSB4X3JhbmdlLCBpbnQgd2lkdGggKTsKKyAgICBpbnQgZmlsbF9jeWNsaWNfYnVmZmVyKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkwLCBpbnQgeTEsIGludCB5MiApOworICAgIHVjaGFyKiBlbF9zcGFyc2U7CisgICAgaW50IGVsX3NwYXJzZV9jb3VudDsKKworICAgIEN2TWF0ICplbGVtZW50OworICAgIGludCBlbF9zaGFwZTsKKyAgICBpbnQgb3BlcmF0aW9uOworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IENWX0VYUE9SVFMgQ3ZMZXZNYXJxCit7CisgICAgQ3ZMZXZNYXJxKCk7CisgICAgQ3ZMZXZNYXJxKCBpbnQgbnBhcmFtcywgaW50IG5lcnJzLCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYT0KKyAgICAgICAgY3ZUZXJtQ3JpdGVyaWEoQ1ZfVEVSTUNSSVRfRVBTK0NWX1RFUk1DUklUX0lURVIsMzAsREJMX0VQU0lMT04pLAorICAgICAgICBib29sIGNvbXBsZXRlU3ltbUZsYWc9ZmFsc2UgKTsKKyAgICB+Q3ZMZXZNYXJxKCk7CisgICAgdm9pZCBpbml0KCBpbnQgbnBhcmFtcywgaW50IG5lcnJzLCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYT0KKyAgICAgICAgY3ZUZXJtQ3JpdGVyaWEoQ1ZfVEVSTUNSSVRfRVBTK0NWX1RFUk1DUklUX0lURVIsMzAsREJMX0VQU0lMT04pLAorICAgICAgICBib29sIGNvbXBsZXRlU3ltbUZsYWc9ZmFsc2UgKTsKKyAgICBib29sIHVwZGF0ZSggY29uc3QgQ3ZNYXQqJiBwYXJhbSwgQ3ZNYXQqJiBKLCBDdk1hdComIGVyciApOworICAgIGJvb2wgdXBkYXRlQWx0KCBjb25zdCBDdk1hdComIHBhcmFtLCBDdk1hdComIEp0SiwgQ3ZNYXQqJiBKdEVyciwgZG91YmxlKiYgZXJyTm9ybSApOworCisgICAgdm9pZCBjbGVhcigpOworICAgIHZvaWQgc3RlcCgpOworICAgIGVudW0geyBET05FPTAsIFNUQVJURUQ9MSwgQ0FMQ19KPTIsIENIRUNLX0VSUj0zIH07CisKKyAgICBDdk1hdCogbWFzazsKKyAgICBDdk1hdCogcHJldlBhcmFtOworICAgIEN2TWF0KiBwYXJhbTsKKyAgICBDdk1hdCogSjsKKyAgICBDdk1hdCogZXJyOworICAgIEN2TWF0KiBKdEo7CisgICAgQ3ZNYXQqIEp0Sk47CisgICAgQ3ZNYXQqIEp0RXJyOworICAgIEN2TWF0KiBKdEpWOworICAgIEN2TWF0KiBKdEpXOworICAgIGRvdWJsZSBwcmV2RXJyTm9ybSwgZXJyTm9ybTsKKyAgICBpbnQgbGFtYmRhTGcxMDsKKyAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYTsKKyAgICBpbnQgc3RhdGU7CisgICAgaW50IGl0ZXJzOworICAgIGJvb2wgY29tcGxldGVTeW1tRmxhZzsKK307CisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0NWX0hQUF8gKi8KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9pbmNsdWRlL2N2Y29tcGF0LmggYi9jdi9pbmNsdWRlL2N2Y29tcGF0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc2YTcxMQotLS0gL2Rldi9udWxsCisrKyBiL2N2L2luY2x1ZGUvY3Zjb21wYXQuaApAQCAtMCwwICsxLDEwODAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0KCBDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyoKKyAgIEEgZmV3IG1hY3JvcyBhbmQgZGVmaW5pdGlvbnMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgIHdpdGggdGhlIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5DVi4gVGhleSBhcmUgb2Jzb2xldGUgYW5kCisgICBhcmUgbGlrZWx5IHRvIGJlIHJlbW92ZWQgaW4gZnV0dXJlLiBUbyBjaGVjayB3aGV0aGVyIHlvdXIgY29kZQorICAgdXNlcyBhbnkgb2YgdGhlc2UsIGRlZmluZSBDVl9OT19CQUNLV0FSRF9DT01QQVRJQklMSVRZIGJlZm9yZQorICAgaW5jbHVkaW5nIGN2LmguCisqLworCisjaWZuZGVmIF9DVkNPTVBBVF9IXworI2RlZmluZSBfQ1ZDT01QQVRfSF8KKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICAjZGVmaW5lIENWX1VOUkVGRVJFTkNFRChhcmcpCisjZWxzZQorICAgICNkZWZpbmUgQ1ZfVU5SRUZFUkVOQ0VEKGFyZykgYXJnCisjZW5kaWYKKworI2RlZmluZSBDdk1hdFR5cGUgaW50CisjZGVmaW5lIEN2RGlzTWFza1R5cGUgaW50CisjZGVmaW5lIEN2TWF0QXJyYXkgQ3ZNYXQKKworI2RlZmluZSBDdlRocmVzaFR5cGUgaW50CisjZGVmaW5lIEN2QWRhcHRpdmVUaHJlc2hNZXRob2QgaW50CisjZGVmaW5lIEN2Q29tcGFyZU1ldGhvZCBpbnQKKyNkZWZpbmUgQ3ZGb250RmFjZSBpbnQKKyNkZWZpbmUgQ3ZQb2x5QXBwcm94TWV0aG9kIGludAorI2RlZmluZSBDdkNvbnRvdXJzTWF0Y2hNZXRob2QgaW50CisjZGVmaW5lIEN2Q29udG91clRyZWVzTWF0Y2hNZXRob2QgaW50CisjZGVmaW5lIEN2Q29lZmZUeXBlIGludAorI2RlZmluZSBDdlJvZHJpZ3Vlc1R5cGUgaW50CisjZGVmaW5lIEN2RWxlbWVudFNoYXBlIGludAorI2RlZmluZSBDdk1vcnBoT3AgaW50CisjZGVmaW5lIEN2VGVtcGxNYXRjaE1ldGhvZCBpbnQKKworI2RlZmluZSBDdlBvaW50MkQ2NGQgQ3ZQb2ludDJENjRmCisjZGVmaW5lIEN2UG9pbnQzRDY0ZCBDdlBvaW50M0Q2NGYKKworI2RlZmluZSAgQ1ZfTUFUMzJGICAgICAgQ1ZfMzJGQzEKKyNkZWZpbmUgIENWX01BVDN4MV8zMkYgIENWXzMyRkMxCisjZGVmaW5lICBDVl9NQVQ0eDFfMzJGICBDVl8zMkZDMQorI2RlZmluZSAgQ1ZfTUFUM3gzXzMyRiAgQ1ZfMzJGQzEKKyNkZWZpbmUgIENWX01BVDR4NF8zMkYgIENWXzMyRkMxCisKKyNkZWZpbmUgIENWX01BVDY0RCAgICAgIENWXzY0RkMxCisjZGVmaW5lICBDVl9NQVQzeDFfNjREICBDVl82NEZDMQorI2RlZmluZSAgQ1ZfTUFUNHgxXzY0RCAgQ1ZfNjRGQzEKKyNkZWZpbmUgIENWX01BVDN4M182NEQgIENWXzY0RkMxCisjZGVmaW5lICBDVl9NQVQ0eDRfNjREICBDVl82NEZDMQorCisjZGVmaW5lICBJUExfR0FVU1NJQU5fNXg1ICAgNworI2RlZmluZSAgQ3ZCb3gyRDMyZiAgICAgQ3ZCb3gyRAorCisvKiBhbGxvY2F0aW9uL2RlYWxsb2NhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgY3ZDcmVhdGVJbWFnZURhdGEgICBjdkNyZWF0ZURhdGEKKyNkZWZpbmUgY3ZSZWxlYXNlSW1hZ2VEYXRhICBjdlJlbGVhc2VEYXRhCisjZGVmaW5lIGN2U2V0SW1hZ2VEYXRhICAgICAgY3ZTZXREYXRhCisjZGVmaW5lIGN2R2V0SW1hZ2VSYXdEYXRhICAgY3ZHZXRSYXdEYXRhCisKKyNkZWZpbmUgY3ZtQWxsb2MgICAgICAgICAgICBjdkNyZWF0ZURhdGEKKyNkZWZpbmUgY3ZtRnJlZSAgICAgICAgICAgICBjdlJlbGVhc2VEYXRhCisjZGVmaW5lIGN2bUFsbG9jQXJyYXkgICAgICAgY3ZDcmVhdGVEYXRhCisjZGVmaW5lIGN2bUZyZWVBcnJheSAgICAgICAgY3ZSZWxlYXNlRGF0YQorCisjZGVmaW5lIGN2SW50ZWdyYWxJbWFnZSAgICAgY3ZJbnRlZ3JhbAorI2RlZmluZSBjdk1hdGNoQ29udG91cnMgICAgIGN2TWF0Y2hTaGFwZXMKKworQ1ZfSU5MSU5FIEN2TWF0IGN2TWF0QXJyYXkoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBkYXRhIENWX0RFRkFVTFQoMCkpCit7CisgICAgcmV0dXJuIGN2TWF0KCByb3dzKmNvdW50LCBjb2xzLCB0eXBlLCBkYXRhICk7Cit9CisKKyNkZWZpbmUgY3ZVcGRhdGVNSElCeVRpbWUgIGN2VXBkYXRlTW90aW9uSGlzdG9yeQorCisjZGVmaW5lIGN2QWNjTWFzayBjdkFjYworI2RlZmluZSBjdlNxdWFyZUFjY01hc2sgY3ZTcXVhcmVBY2MKKyNkZWZpbmUgY3ZNdWx0aXBseUFjY01hc2sgY3ZNdWx0aXBseUFjYworI2RlZmluZSBjdlJ1bm5pbmdBdmdNYXNrKGltZ1ksIGltZ1UsIG1hc2ssIGFscGhhKSBjdlJ1bm5pbmdBdmcoaW1nWSwgaW1nVSwgYWxwaGEsIG1hc2spCisKKyNkZWZpbmUgY3ZTZXRIaXN0VGhyZXNoICBjdlNldEhpc3RCaW5SYW5nZXMKKyNkZWZpbmUgY3ZDYWxjSGlzdE1hc2soaW1nLCBtYXNrLCBoaXN0LCBkb05vdENsZWFyKSBjdkNhbGNIaXN0KGltZywgaGlzdCwgZG9Ob3RDbGVhciwgbWFzaykKKworQ1ZfSU5MSU5FIGRvdWJsZSBjdk1lYW4oIGNvbnN0IEN2QXJyKiBpbWFnZSwgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVCgwKSkKK3sKKyAgICBDdlNjYWxhciBtZWFuID0gY3ZBdmcoIGltYWdlLCBtYXNrICk7CisgICAgcmV0dXJuIG1lYW4udmFsWzBdOworfQorCisKK0NWX0lOTElORSBkb3VibGUgIGN2U3VtUGl4ZWxzKCBjb25zdCBDdkFyciogaW1hZ2UgKQoreworICAgIEN2U2NhbGFyIHNjYWxhciA9IGN2U3VtKCBpbWFnZSApOworICAgIHJldHVybiBzY2FsYXIudmFsWzBdOworfQorCitDVl9JTkxJTkUgdm9pZCAgY3ZNZWFuX1N0ZERldiggY29uc3QgQ3ZBcnIqIGltYWdlLCBkb3VibGUqIG1lYW4sIGRvdWJsZSogc2R2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoMCkpCit7CisgICAgQ3ZTY2FsYXIgX21lYW4sIF9zZHY7CisgICAgY3ZBdmdTZHYoIGltYWdlLCAmX21lYW4sICZfc2R2LCBtYXNrICk7CisKKyAgICBpZiggbWVhbiApCisgICAgICAgICptZWFuID0gX21lYW4udmFsWzBdOworCisgICAgaWYoIHNkdiApCisgICAgICAgICpzZHYgPSBfc2R2LnZhbFswXTsKK30KKworCitDVl9JTkxJTkUgdm9pZCBjdm1QZXJzcGVjdGl2ZVByb2plY3QoIGNvbnN0IEN2TWF0KiBtYXQsIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QgKQoreworICAgIEN2TWF0IHRzcmMsIHRkc3Q7CisKKyAgICBjdlJlc2hhcGUoIHNyYywgJnRzcmMsIDMsIDAgKTsKKyAgICBjdlJlc2hhcGUoIGRzdCwgJnRkc3QsIDMsIDAgKTsKKworICAgIGN2UGVyc3BlY3RpdmVUcmFuc2Zvcm0oICZ0c3JjLCAmdGRzdCwgbWF0ICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgY3ZGaWxsSW1hZ2UoIEN2QXJyKiBtYXQsIGRvdWJsZSBjb2xvciApCit7CisgICAgY3ZTZXQoIG1hdCwgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKG1hdCkpLCAwICk7Cit9CisKKworI2RlZmluZSBjdkN2dFBpeFRvUGxhbmUgY3ZTcGxpdAorI2RlZmluZSBjdkN2dFBsYW5lVG9QaXggY3ZNZXJnZQorCit0eXBlZGVmIHN0cnVjdCBDdlJhbmRTdGF0ZQoreworICAgIEN2Uk5HICAgICBzdGF0ZTsgICAgLyogUk5HIHN0YXRlICh0aGUgY3VycmVudCBzZWVkIGFuZCBjYXJyeSkqLworICAgIGludCAgICAgICBkaXN0dHlwZTsgLyogZGlzdHJpYnV0aW9uIHR5cGUgKi8KKyAgICBDdlNjYWxhciAgcGFyYW1bMl07IC8qIHBhcmFtZXRlcnMgb2YgUk5HICovCit9CitDdlJhbmRTdGF0ZTsKKworCisvKiBDaGFuZ2VzIFJORyByYW5nZSB3aGlsZSBwcmVzZXJ2aW5nIFJORyBzdGF0ZSAqLworQ1ZfSU5MSU5FICB2b2lkICBjdlJhbmRTZXRSYW5nZSggQ3ZSYW5kU3RhdGUqIHN0YXRlLCBkb3VibGUgcGFyYW0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMiwgaW50IGluZGV4IENWX0RFRkFVTFQoLTEpKQoreworICAgIGlmKCAhc3RhdGUgKQorICAgIHsKKyAgICAgICAgY3ZFcnJvciggQ1ZfU3RzTnVsbFB0ciwgImN2UmFuZFNldFJhbmdlIiwgIk51bGwgcG9pbnRlciB0byBSTkcgc3RhdGUiLCAiY3Zjb21wYXQuaCIsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCAodW5zaWduZWQpKGluZGV4ICsgMSkgPiA0ICkKKyAgICB7CisgICAgICAgIGN2RXJyb3IoIENWX1N0c091dE9mUmFuZ2UsICJjdlJhbmRTZXRSYW5nZSIsICJpbmRleCBpcyBub3QgaW4gLTEuLjMiLCAiY3Zjb21wYXQuaCIsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCBpbmRleCA8IDAgKQorICAgIHsKKyAgICAgICAgc3RhdGUtPnBhcmFtWzBdLnZhbFswXSA9IHN0YXRlLT5wYXJhbVswXS52YWxbMV0gPQorICAgICAgICBzdGF0ZS0+cGFyYW1bMF0udmFsWzJdID0gc3RhdGUtPnBhcmFtWzBdLnZhbFszXSA9IHBhcmFtMTsKKyAgICAgICAgc3RhdGUtPnBhcmFtWzFdLnZhbFswXSA9IHN0YXRlLT5wYXJhbVsxXS52YWxbMV0gPQorICAgICAgICBzdGF0ZS0+cGFyYW1bMV0udmFsWzJdID0gc3RhdGUtPnBhcmFtWzFdLnZhbFszXSA9IHBhcmFtMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RhdGUtPnBhcmFtWzBdLnZhbFtpbmRleF0gPSBwYXJhbTE7CisgICAgICAgIHN0YXRlLT5wYXJhbVsxXS52YWxbaW5kZXhdID0gcGFyYW0yOworICAgIH0KK30KKworCitDVl9JTkxJTkUgIHZvaWQgIGN2UmFuZEluaXQoIEN2UmFuZFN0YXRlKiBzdGF0ZSwgZG91YmxlIHBhcmFtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMiwgaW50IHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXN0dHlwZSBDVl9ERUZBVUxUKENWX1JBTkRfVU5JKSkKK3sKKyAgICBpZiggIXN0YXRlICkKKyAgICB7CisgICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlJhbmRJbml0IiwgIk51bGwgcG9pbnRlciB0byBSTkcgc3RhdGUiLCAiY3Zjb21wYXQuaCIsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCBkaXN0dHlwZSAhPSBDVl9SQU5EX1VOSSAmJiBkaXN0dHlwZSAhPSBDVl9SQU5EX05PUk1BTCApCisgICAgeworICAgICAgICBjdkVycm9yKCBDVl9TdHNCYWRGbGFnLCAiY3ZSYW5kSW5pdCIsICJVbmtub3duIGRpc3RyaWJ1dGlvbiB0eXBlIiwgImN2Y29tcGF0LmgiLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0ZS0+c3RhdGUgPSAodWludDY0KShzZWVkID8gc2VlZCA6IC0xKTsKKyAgICBzdGF0ZS0+ZGlzdHR5cGUgPSBkaXN0dHlwZTsKKyAgICBjdlJhbmRTZXRSYW5nZSggc3RhdGUsIHBhcmFtMSwgcGFyYW0yLCAtMSApOworfQorCisKKy8qIEZpbGxzIGFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMgKi8KK0NWX0lOTElORSB2b2lkIGN2UmFuZCggQ3ZSYW5kU3RhdGUqIHN0YXRlLCBDdkFyciogYXJyICkKK3sKKyAgICBpZiggIXN0YXRlICkKKyAgICB7CisgICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlJhbmQiLCAiTnVsbCBwb2ludGVyIHRvIFJORyBzdGF0ZSIsICJjdmNvbXBhdC5oIiwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGN2UmFuZEFyciggJnN0YXRlLT5zdGF0ZSwgYXJyLCBzdGF0ZS0+ZGlzdHR5cGUsIHN0YXRlLT5wYXJhbVswXSwgc3RhdGUtPnBhcmFtWzFdICk7Cit9CisKKyNkZWZpbmUgY3ZSYW5kTmV4dCggX3N0YXRlICkgY3ZSYW5kSW50KCAmKF9zdGF0ZSktPnN0YXRlICkKKworQ1ZfSU5MSU5FIHZvaWQgY3ZiUmFuZCggQ3ZSYW5kU3RhdGUqIHN0YXRlLCBmbG9hdCogZHN0LCBpbnQgbGVuICkKK3sKKyAgICBDdk1hdCBtYXQgPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKilkc3QgKTsKKyAgICBjdlJhbmQoIHN0YXRlLCAmbWF0ICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgIGN2YkNhcnRUb1BvbGFyKCBjb25zdCBmbG9hdCogeSwgY29uc3QgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtYWduaXR1ZGUsIGZsb2F0KiBhbmdsZSwgaW50IGxlbiApCit7CisgICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKil4ICk7CisgICAgQ3ZNYXQgbXkgPSBteDsKKyAgICBDdk1hdCBtbSA9IG14OworICAgIEN2TWF0IG1hID0gbXg7CisKKyAgICBteS5kYXRhLmZsID0gKGZsb2F0Kil5OworICAgIG1tLmRhdGEuZmwgPSAoZmxvYXQqKW1hZ25pdHVkZTsKKyAgICBtYS5kYXRhLmZsID0gKGZsb2F0KilhbmdsZTsKKworICAgIGN2Q2FydFRvUG9sYXIoICZteCwgJm15LCAmbW0sIGFuZ2xlID8gJm1hIDogTlVMTCwgMSApOworfQorCisKK0NWX0lOTElORSB2b2lkICBjdmJGYXN0QXJjdGFuKCBjb25zdCBmbG9hdCogeSwgY29uc3QgZmxvYXQqIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGFuZ2xlLCBpbnQgbGVuICkKK3sKKyAgICBDdk1hdCBteCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKXggKTsKKyAgICBDdk1hdCBteSA9IG14OworICAgIEN2TWF0IG1hID0gbXg7CisKKyAgICBteS5kYXRhLmZsID0gKGZsb2F0Kil5OworICAgIG1hLmRhdGEuZmwgPSAoZmxvYXQqKWFuZ2xlOworCisgICAgY3ZDYXJ0VG9Qb2xhciggJm14LCAmbXksIE5VTEwsICZtYSwgMSApOworfQorCisKK0NWX0lOTElORSAgdm9pZCAgY3ZiU3FydCggY29uc3QgZmxvYXQqIHgsIGZsb2F0KiB5LCBpbnQgbGVuICkKK3sKKyAgICBDdk1hdCBteCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKXggKTsKKyAgICBDdk1hdCBteSA9IG14OworICAgIG15LmRhdGEuZmwgPSAoZmxvYXQqKXk7CisKKyAgICBjdlBvdyggJm14LCAmbXksIDAuNSApOworfQorCisKK0NWX0lOTElORSAgdm9pZCAgY3ZiSW52U3FydCggY29uc3QgZmxvYXQqIHgsIGZsb2F0KiB5LCBpbnQgbGVuICkKK3sKKyAgICBDdk1hdCBteCA9IGN2TWF0KCAxLCBsZW4sIENWXzMyRiwgKHZvaWQqKXggKTsKKyAgICBDdk1hdCBteSA9IG14OworICAgIG15LmRhdGEuZmwgPSAoZmxvYXQqKXk7CisKKyAgICBjdlBvdyggJm14LCAmbXksIC0wLjUgKTsKK30KKworCitDVl9JTkxJTkUgIHZvaWQgIGN2YlJlY2lwcm9jYWwoIGNvbnN0IGZsb2F0KiB4LCBmbG9hdCogeSwgaW50IGxlbiApCit7CisgICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKil4ICk7CisgICAgQ3ZNYXQgbXkgPSBteDsKKyAgICBteS5kYXRhLmZsID0gKGZsb2F0Kil5OworCisgICAgY3ZQb3coICZteCwgJm15LCAtMSApOworfQorCisKK0NWX0lOTElORSAgdm9pZCAgY3ZiRmFzdEV4cCggY29uc3QgZmxvYXQqIHgsIGRvdWJsZSogeSwgaW50IGxlbiApCit7CisgICAgQ3ZNYXQgbXggPSBjdk1hdCggMSwgbGVuLCBDVl8zMkYsICh2b2lkKil4ICk7CisgICAgQ3ZNYXQgbXkgPSBjdk1hdCggMSwgbGVuLCBDVl82NEYsIHkgKTsKKyAgICBjdkV4cCggJm14LCAmbXkgKTsKK30KKworCitDVl9JTkxJTkUgIHZvaWQgIGN2YkZhc3RMb2coIGNvbnN0IGRvdWJsZSogeCwgZmxvYXQqIHksIGludCBsZW4gKQoreworICAgIEN2TWF0IG14ID0gY3ZNYXQoIDEsIGxlbiwgQ1ZfNjRGLCAodm9pZCopeCApOworICAgIEN2TWF0IG15ID0gY3ZNYXQoIDEsIGxlbiwgQ1ZfMzJGLCB5ICk7CisgICAgY3ZMb2coICZteCwgJm15ICk7Cit9CisKKworQ1ZfSU5MSU5FICBDdlJlY3QgIGN2Q29udG91ckJvdW5kaW5nUmVjdCggdm9pZCogcG9pbnRfc2V0LCBpbnQgdXBkYXRlIENWX0RFRkFVTFQoMCkpCit7CisgICAgcmV0dXJuIGN2Qm91bmRpbmdSZWN0KCBwb2ludF9zZXQsIHVwZGF0ZSApOworfQorCisKK0NWX0lOTElORSBkb3VibGUgY3ZQc2V1ZG9JbnZlcnNlKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0ICkKK3sKKyAgICByZXR1cm4gY3ZJbnZlcnQoIHNyYywgZHN0LCBDVl9TVkQgKTsKK30KKworI2RlZmluZSBjdlBzZXVkb0ludiBjdlBzZXVkb0ludmVyc2UKKworI2RlZmluZSBjdkNvbnRvdXJNb21lbnRzKCBjb250b3VyLCBtb21lbnRzICkgXAorICAgIGN2TW9tZW50cyggY29udG91ciwgbW9tZW50cywgMCApCisKKyNkZWZpbmUgY3ZHZXRQdHJBdCAgICAgICAgICAgICAgY3ZQdHIyRAorI2RlZmluZSBjdkdldEF0ICAgICAgICAgICAgICAgICBjdkdldDJECisjZGVmaW5lIGN2U2V0QXQoYXJyLHZhbCx5LHgpICAgIGN2U2V0MkQoKGFyciksKHkpLCh4KSwodmFsKSkKKworI2RlZmluZSBjdk1lYW5NYXNrICBjdk1lYW4KKyNkZWZpbmUgY3ZNZWFuX1N0ZERldk1hc2soaW1nLG1hc2ssbWVhbixzZHYpIGN2TWVhbl9TdGREZXYoaW1nLG1lYW4sc2R2LG1hc2spCisKKyNkZWZpbmUgY3ZOb3JtTWFzayhpbWdBLGltZ0IsbWFzayxub3JtVHlwZSkgY3ZOb3JtKGltZ0EsaW1nQixub3JtVHlwZSxtYXNrKQorCisjZGVmaW5lIGN2TWluTWF4TG9jTWFzayhpbWcsIG1hc2ssIG1pbl92YWwsIG1heF92YWwsIG1pbl9sb2MsIG1heF9sb2MpIFwKKyAgICAgICAgY3ZNaW5NYXhMb2MoaW1nLCBtaW5fdmFsLCBtYXhfdmFsLCBtaW5fbG9jLCBtYXhfbG9jLCBtYXNrKQorCisjZGVmaW5lIGN2UmVtb3ZlTWVtb3J5TWFuYWdlciAgY3ZTZXRNZW1vcnlNYW5hZ2VyCisKKyNkZWZpbmUgY3ZtU2V0WmVybyggbWF0ICkgICAgICAgICAgICAgICBjdlNldFplcm8oIG1hdCApCisjZGVmaW5lIGN2bVNldElkZW50aXR5KCBtYXQgKSAgICAgICAgICAgY3ZTZXRJZGVudGl0eSggbWF0ICkKKyNkZWZpbmUgY3ZtQWRkKCBzcmMxLCBzcmMyLCBkc3QgKSAgICAgICBjdkFkZCggc3JjMSwgc3JjMiwgZHN0LCAwICkKKyNkZWZpbmUgY3ZtU3ViKCBzcmMxLCBzcmMyLCBkc3QgKSAgICAgICBjdlN1Yiggc3JjMSwgc3JjMiwgZHN0LCAwICkKKyNkZWZpbmUgY3ZtQ29weSggc3JjLCBkc3QgKSAgICAgICAgICAgICBjdkNvcHkoIHNyYywgZHN0LCAwICkKKyNkZWZpbmUgY3ZtTXVsKCBzcmMxLCBzcmMyLCBkc3QgKSAgICAgICBjdk1hdE11bEFkZCggc3JjMSwgc3JjMiwgMCwgZHN0ICkKKyNkZWZpbmUgY3ZtVHJhbnNwb3NlKCBzcmMsIGRzdCApICAgICAgICBjdlQoIHNyYywgZHN0ICkKKyNkZWZpbmUgY3ZtSW52ZXJ0KCBzcmMsIGRzdCApICAgICAgICAgICBjdkludiggc3JjLCBkc3QgKQorI2RlZmluZSBjdm1NYWhhbGFub2Jpcyh2ZWMxLCB2ZWMyLCBtYXQpIGN2TWFoYWxhbm9iaXMoIHZlYzEsIHZlYzIsIG1hdCApCisjZGVmaW5lIGN2bURvdFByb2R1Y3QoIHZlYzEsIHZlYzIgKSAgICAgY3ZEb3RQcm9kdWN0KCB2ZWMxLCB2ZWMyICkKKyNkZWZpbmUgY3ZtQ3Jvc3NQcm9kdWN0KHZlYzEsIHZlYzIsZHN0KSBjdkNyb3NzUHJvZHVjdCggdmVjMSwgdmVjMiwgZHN0ICkKKyNkZWZpbmUgY3ZtVHJhY2UoIG1hdCApICAgICAgICAgICAgICAgICAoY3ZUcmFjZSggbWF0ICkpLnZhbFswXQorI2RlZmluZSBjdm1NdWxUcmFuc3Bvc2VkKCBzcmMsIGRzdCwgb3JkZXIgKSBjdk11bFRyYW5zcG9zZWQoIHNyYywgZHN0LCBvcmRlciApCisjZGVmaW5lIGN2bUVpZ2VuVlYoIG1hdCwgZXZlYywgZXZhbCwgZXBzKSAgIGN2RWlnZW5WViggbWF0LCBldmVjLCBldmFsLCBlcHMgKQorI2RlZmluZSBjdm1EZXQoIG1hdCApICAgICAgICAgICAgICAgICAgIGN2RGV0KCBtYXQgKQorI2RlZmluZSBjdm1TY2FsZSggc3JjLCBkc3QsIHNjYWxlICkgICAgIGN2U2NhbGUoIHNyYywgZHN0LCBzY2FsZSApCisKKyNkZWZpbmUgY3ZDb3B5SW1hZ2UoIHNyYywgZHN0ICkgICAgICAgICBjdkNvcHkoIHNyYywgZHN0LCAwICkKKyNkZWZpbmUgY3ZSZWxlYXNlTWF0SGVhZGVyICAgICAgICAgICAgICBjdlJlbGVhc2VNYXQKKworLyogQ2FsY3VsYXRlcyBleGFjdCBjb252ZXggaHVsbCBvZiAyZCBwb2ludCBzZXQgKi8KK0NWX0lOTElORSB2b2lkIGN2Q29udmV4SHVsbCggQ3ZQb2ludCogcG9pbnRzLCBpbnQgbnVtX3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0KiBDVl9VTlJFRkVSRU5DRUQoYm91bmRfcmVjdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwgaW50KiBodWxsLCBpbnQqIGh1bGxzaXplICkKK3sKKyAgICBDdk1hdCBwb2ludHMxID0gY3ZNYXQoIDEsIG51bV9wb2ludHMsIENWXzMyU0MyLCBwb2ludHMgKTsKKyAgICBDdk1hdCBodWxsMSA9IGN2TWF0KCAxLCBudW1fcG9pbnRzLCBDVl8zMlNDMSwgaHVsbCApOworCisgICAgY3ZDb252ZXhIdWxsMiggJnBvaW50czEsICZodWxsMSwgb3JpZW50YXRpb24sIDAgKTsKKyAgICAqaHVsbHNpemUgPSBodWxsMS5jb2xzOworfQorCisvKiBDYWxjdWxhdGVzIGV4YWN0IGNvbnZleCBodWxsIG9mIDJkIHBvaW50IHNldCBzdG9yZWQgaW4gYSBzZXF1ZW5jZSAqLworI2RlZmluZSBjdkNvbnRvdXJDb252ZXhIdWxsKCBjb250b3VyLCBvcmllbnRhdGlvbiwgc3RvcmFnZSApIFwKKyAgICBjdkNvbnZleEh1bGwyKCBjb250b3VyLCBzdG9yYWdlLCBvcmllbnRhdGlvbiApCisKKy8qIENhbGN1bGF0ZXMgYXBwcm94aW1hdGUgY29udmV4IGh1bGwgb2YgMmQgcG9pbnQgc2V0ICovCisjZGVmaW5lIGN2Q29udmV4SHVsbEFwcHJveCggcG9pbnRzLCBudW1fcG9pbnRzLCBib3VuZF9yZWN0LCBiYW5kd2lkdGgsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uLCBodWxsLCBodWxsc2l6ZSApICAgICAgICAgICAgICAgICAgIFwKK2N2Q29udmV4SHVsbCggcG9pbnRzLCBudW1fcG9pbnRzLCBib3VuZF9yZWN0LCBvcmllbnRhdGlvbiwgaHVsbCwgaHVsbHNpemUgKQorCisvKiBDYWxjdWxhdGVzIGFwcHJveGltYXRlIGNvbnZleCBodWxsIG9mIDJkIHBvaW50IHNldCBzdG9yZWQgaW4gYSBzZXF1ZW5jZSAqLworI2RlZmluZSBjdkNvbnRvdXJDb252ZXhIdWxsQXBwcm94KCBjb250b3VyLCBiYW5kd2lkdGgsIG9yaWVudGF0aW9uLCBzdG9yYWdlICkgICBcCisgICAgY3ZDb252ZXhIdWxsMiggY29udG91ciwgc3RvcmFnZSwgb3JpZW50YXRpb24gKQorCisKK0NWX0lOTElORSB2b2lkIGN2TWluQXJlYVJlY3QoIEN2UG9pbnQqIHBvaW50cywgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGxlZnQpLCBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKGJvdHRvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKHJpZ2h0KSwgaW50IENWX1VOUkVGRVJFTkNFRCh0b3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBhbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHZlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiB2ZWN0MiApCit7CisgICAgQ3ZNYXQgbWF0ID0gY3ZNYXQoIDEsIG4sIENWXzMyU0MyLCBwb2ludHMgKTsKKyAgICBDdkJveDJEIGJveCA9IGN2TWluQXJlYVJlY3QyKCAmbWF0LCAwICk7CisgICAgQ3ZQb2ludDJEMzJmIHB0WzRdOworCisgICAgY3ZCb3hQb2ludHMoIGJveCwgcHQgKTsKKyAgICAqYW5jaG9yID0gcHRbMF07CisgICAgdmVjdDEtPnggPSBwdFsxXS54IC0gcHRbMF0ueDsKKyAgICB2ZWN0MS0+eSA9IHB0WzFdLnkgLSBwdFswXS55OworICAgIHZlY3QyLT54ID0gcHRbM10ueCAtIHB0WzBdLng7CisgICAgdmVjdDItPnkgPSBwdFszXS55IC0gcHRbMF0ueTsKKworICAgIENWX1VOUkVGRVJFTkNFRCggKGxlZnQsIGJvdHRvbSwgcmlnaHQsIHRvcCkgKTsKK30KKwordHlwZWRlZiBpbnQgQ3ZEaXNUeXBlOwordHlwZWRlZiBpbnQgQ3ZDaGFpbkFwcHJveE1ldGhvZDsKK3R5cGVkZWYgaW50IEN2Q29udG91clJldHJpZXZhbE1vZGU7CisKK0NWX0lOTElORSAgdm9pZCAgY3ZGaXRMaW5lM0QoIEN2UG9pbnQzRDMyZiogcG9pbnRzLCBpbnQgY291bnQsIGludCBkaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0sIGZsb2F0IHJlcHMsIGZsb2F0IGFlcHMsIGZsb2F0KiBsaW5lICkKK3sKKyAgICBDdk1hdCBtYXQgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMzLCBwb2ludHMgKTsKKyAgICBmbG9hdCBfcGFyYW0gPSBwYXJhbSAhPSBOVUxMID8gKihmbG9hdCopcGFyYW0gOiAwLmY7CisgICAgYXNzZXJ0KCBkaXN0ICE9IENWX0RJU1RfVVNFUiApOworICAgIGN2Rml0TGluZSggJm1hdCwgZGlzdCwgX3BhcmFtLCByZXBzLCBhZXBzLCBsaW5lICk7Cit9CisKKy8qIEZpdHMgYSBsaW5lIGludG8gc2V0IG9mIDJkIHBvaW50cyBpbiBhIHJvYnVzdCB3YXkgKE0tZXN0aW1hdG9yIHRlY2huaXF1ZSkgKi8KK0NWX0lOTElORSAgdm9pZCAgY3ZGaXRMaW5lMkQoIEN2UG9pbnQyRDMyZiogcG9pbnRzLCBpbnQgY291bnQsIGludCBkaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcGFyYW0sIGZsb2F0IHJlcHMsIGZsb2F0IGFlcHMsIGZsb2F0KiBsaW5lICkKK3sKKyAgICBDdk1hdCBtYXQgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMyLCBwb2ludHMgKTsKKyAgICBmbG9hdCBfcGFyYW0gPSBwYXJhbSAhPSBOVUxMID8gKihmbG9hdCopcGFyYW0gOiAwLmY7CisgICAgYXNzZXJ0KCBkaXN0ICE9IENWX0RJU1RfVVNFUiApOworICAgIGN2Rml0TGluZSggJm1hdCwgZGlzdCwgX3BhcmFtLCByZXBzLCBhZXBzLCBsaW5lICk7Cit9CisKKworQ1ZfSU5MSU5FICB2b2lkIGN2Rml0RWxsaXBzZSggY29uc3QgQ3ZQb2ludDJEMzJmKiBwb2ludHMsIGludCBjb3VudCwgQ3ZCb3gyRCogYm94ICkKK3sKKyAgICBDdk1hdCBtYXQgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMyLCAodm9pZCopcG9pbnRzICk7CisgICAgKmJveCA9IGN2Rml0RWxsaXBzZTIoICZtYXQgKTsKK30KKworLyogUHJvamVjdHMgMmQgcG9pbnRzIHRvIG9uZSBvZiBzdGFuZGFyZCBjb29yZGluYXRlIHBsYW5lcworICAgKGkuZS4gcmVtb3ZlcyBvbmUgb2YgY29vcmRpbmF0ZXMpICovCitDVl9JTkxJTkUgIHZvaWQgIGN2UHJvamVjdDNEKCBDdlBvaW50M0QzMmYqIHBvaW50czNELCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHBvaW50czJELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhJbmR4IENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeUluZHggQ1ZfREVGQVVMVCgxKSkKK3sKKyAgICBDdk1hdCBzcmMgPSBjdk1hdCggMSwgY291bnQsIENWXzMyRkMzLCBwb2ludHMzRCApOworICAgIEN2TWF0IGRzdCA9IGN2TWF0KCAxLCBjb3VudCwgQ1ZfMzJGQzIsIHBvaW50czJEICk7CisgICAgZmxvYXQgbVs2XSA9IHswLDAsMCwwLDAsMH07CisgICAgQ3ZNYXQgTSA9IGN2TWF0KCAyLCAzLCBDVl8zMkYsIG0gKTsKKworICAgIGFzc2VydCggKHVuc2lnbmVkKXhJbmR4IDwgMyAmJiAodW5zaWduZWQpeUluZHggPCAzICk7CisgICAgbVt4SW5keF0gPSBtW3lJbmR4KzNdID0gMS5mOworCisgICAgY3ZUcmFuc2Zvcm0oICZzcmMsICZkc3QsICZNLCBOVUxMICk7Cit9CisKKworLyogUmV0cmlldmVzIHZhbHVlIG9mIHRoZSBwYXJ0aWN1bGFyIGJpbgorICAgb2YgeC1kaW1lbnNpb25hbCAoeD0xLDIsMywuLi4pIGhpc3RvZ3JhbSAqLworI2RlZmluZSBjdlF1ZXJ5SGlzdFZhbHVlXzFEKCBoaXN0LCBpZHgwICkgXAorICAgICgoZmxvYXQpY3ZHZXRSZWFsMUQoIChoaXN0KS0+YmlucywgKGlkeDApKSkKKyNkZWZpbmUgY3ZRdWVyeUhpc3RWYWx1ZV8yRCggaGlzdCwgaWR4MCwgaWR4MSApIFwKKyAgICAoKGZsb2F0KWN2R2V0UmVhbDJEKCAoaGlzdCktPmJpbnMsIChpZHgwKSwgKGlkeDEpKSkKKyNkZWZpbmUgY3ZRdWVyeUhpc3RWYWx1ZV8zRCggaGlzdCwgaWR4MCwgaWR4MSwgaWR4MiApIFwKKyAgICAoKGZsb2F0KWN2R2V0UmVhbDNEKCAoaGlzdCktPmJpbnMsIChpZHgwKSwgKGlkeDEpLCAoaWR4MikpKQorI2RlZmluZSBjdlF1ZXJ5SGlzdFZhbHVlX25EKCBoaXN0LCBpZHggKSBcCisgICAgKChmbG9hdCljdkdldFJlYWxORCggKGhpc3QpLT5iaW5zLCAoaWR4KSkpCisKKy8qIFJldHVybnMgcG9pbnRlciB0byB0aGUgcGFydGljdWxhciBiaW4gb2YgeC1kaW1lc2lvbmFsIGhpc3RvZ3JhbS4KKyAgIEZvciBzcGFyc2UgaGlzdG9ncmFtIHRoZSBiaW4gaXMgY3JlYXRlZCBpZiBpdCBkaWRuJ3QgZXhpc3QgYmVmb3JlICovCisjZGVmaW5lIGN2R2V0SGlzdFZhbHVlXzFEKCBoaXN0LCBpZHgwICkgXAorICAgICgoZmxvYXQqKWN2UHRyMUQoIChoaXN0KS0+YmlucywgKGlkeDApLCAwKSkKKyNkZWZpbmUgY3ZHZXRIaXN0VmFsdWVfMkQoIGhpc3QsIGlkeDAsIGlkeDEgKSBcCisgICAgKChmbG9hdCopY3ZQdHIyRCggKGhpc3QpLT5iaW5zLCAoaWR4MCksIChpZHgxKSwgMCkpCisjZGVmaW5lIGN2R2V0SGlzdFZhbHVlXzNEKCBoaXN0LCBpZHgwLCBpZHgxLCBpZHgyICkgXAorICAgICgoZmxvYXQqKWN2UHRyM0QoIChoaXN0KS0+YmlucywgKGlkeDApLCAoaWR4MSksIChpZHgyKSwgMCkpCisjZGVmaW5lIGN2R2V0SGlzdFZhbHVlX25EKCBoaXN0LCBpZHggKSBcCisgICAgKChmbG9hdCopY3ZQdHJORCggKGhpc3QpLT5iaW5zLCAoaWR4KSwgMCkpCisKKworI2RlZmluZSBDVl9JU19TRVRfRUxFTV9FWElTVFMgQ1ZfSVNfU0VUX0VMRU0KKworCitDVl9JTkxJTkUgIGludCAgY3ZIb3VnaExpbmVzKCBDdkFyciogaW1hZ2UsIGRvdWJsZSByaG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhldGEsIGludCB0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGluZXMsIGludCBsaW5lc051bWJlciApCit7CisgICAgQ3ZNYXQgbGluZXNNYXQgPSBjdk1hdCggMSwgbGluZXNOdW1iZXIsIENWXzMyRkMyLCBsaW5lcyApOworICAgIGN2SG91Z2hMaW5lczIoIGltYWdlLCAmbGluZXNNYXQsIENWX0hPVUdIX1NUQU5EQVJELAorICAgICAgICAgICAgICAgICAgIHJobywgdGhldGEsIHRocmVzaG9sZCwgMCwgMCApOworCisgICAgcmV0dXJuIGxpbmVzTWF0LmNvbHM7Cit9CisKKworQ1ZfSU5MSU5FICBpbnQgIGN2SG91Z2hMaW5lc1AoIEN2QXJyKiBpbWFnZSwgZG91YmxlIHJobywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhldGEsIGludCB0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVMZW5ndGgsIGludCBsaW5lR2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGluZXMsIGludCBsaW5lc051bWJlciApCit7CisgICAgQ3ZNYXQgbGluZXNNYXQgPSBjdk1hdCggMSwgbGluZXNOdW1iZXIsIENWXzMyU0M0LCBsaW5lcyApOworICAgIGN2SG91Z2hMaW5lczIoIGltYWdlLCAmbGluZXNNYXQsIENWX0hPVUdIX1BST0JBQklMSVNUSUMsCisgICAgICAgICAgICAgICAgICAgcmhvLCB0aGV0YSwgdGhyZXNob2xkLCBsaW5lTGVuZ3RoLCBsaW5lR2FwICk7CisKKyAgICByZXR1cm4gbGluZXNNYXQuY29sczsKK30KKworCitDVl9JTkxJTkUgIGludCAgY3ZIb3VnaExpbmVzU0RpdiggQ3ZBcnIqIGltYWdlLCBkb3VibGUgcmhvLCBpbnQgc3JuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aGV0YSwgaW50IHN0biwgaW50IHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbGluZXMsIGludCBsaW5lc051bWJlciApCit7CisgICAgQ3ZNYXQgbGluZXNNYXQgPSBjdk1hdCggMSwgbGluZXNOdW1iZXIsIENWXzMyRkMyLCBsaW5lcyApOworICAgIGN2SG91Z2hMaW5lczIoIGltYWdlLCAmbGluZXNNYXQsIENWX0hPVUdIX01VTFRJX1NDQUxFLAorICAgICAgICAgICAgICAgICAgIHJobywgdGhldGEsIHRocmVzaG9sZCwgc3JuLCBzdG4gKTsKKworICAgIHJldHVybiBsaW5lc01hdC5jb2xzOworfQorCisKKy8qIEZpbmQgZnVuZGFtZW50YWwgbWF0cml4ICovCitDVl9JTkxJTkUgIHZvaWQgIGN2RmluZEZ1bmRhbWVudGFsTWF0cml4KCBpbnQqIHBvaW50czEsIGludCogcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtcG9pbnRzLCBpbnQgQ1ZfVU5SRUZFUkVOQ0VEKG1ldGhvZCksIGZsb2F0KiBtYXRyaXggKQoreworICAgIEN2TWF0KiBwb2ludHNNYXQxOworICAgIEN2TWF0KiBwb2ludHNNYXQyOworICAgIEN2TWF0IGZ1bmRNYXRyID0gY3ZNYXQoMywzLENWXzMyRixtYXRyaXgpOworICAgIGludCBpLCBjdXJyID0gMDsKKworICAgIHBvaW50c01hdDEgPSBjdkNyZWF0ZU1hdCgzLG51bXBvaW50cyxDVl82NEYpOworICAgIHBvaW50c01hdDIgPSBjdkNyZWF0ZU1hdCgzLG51bXBvaW50cyxDVl82NEYpOworCisgICAgZm9yKCBpID0gMDsgaSA8IG51bXBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGN2bVNldChwb2ludHNNYXQxLDAsaSxwb2ludHMxW2N1cnJdKTsvL3gKKyAgICAgICAgY3ZtU2V0KHBvaW50c01hdDEsMSxpLHBvaW50czFbY3VycisxXSk7Ly95CisgICAgICAgIGN2bVNldChwb2ludHNNYXQxLDIsaSwxLjApOworCisgICAgICAgIGN2bVNldChwb2ludHNNYXQyLDAsaSxwb2ludHMyW2N1cnJdKTsvL3gKKyAgICAgICAgY3ZtU2V0KHBvaW50c01hdDIsMSxpLHBvaW50czJbY3VycisxXSk7Ly95CisgICAgICAgIGN2bVNldChwb2ludHNNYXQyLDIsaSwxLjApOworICAgICAgICBjdXJyICs9IDI7CisgICAgfQorCisgICAgY3ZGaW5kRnVuZGFtZW50YWxNYXQocG9pbnRzTWF0MSxwb2ludHNNYXQyLCZmdW5kTWF0cixDVl9GTV9SQU5TQUMsMSwwLjk5LDApOworCisgICAgY3ZSZWxlYXNlTWF0KCZwb2ludHNNYXQxKTsKKyAgICBjdlJlbGVhc2VNYXQoJnBvaW50c01hdDIpOworfQorCisKKworQ1ZfSU5MSU5FIGludAorY3ZGaW5kQ2hlc3NCb2FyZENvcm5lckd1ZXNzZXMoIGNvbnN0IHZvaWQqIGFyciwgdm9pZCogQ1ZfVU5SRUZFUkVOQ0VEKHRocmVzaGFyciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlICogQ1ZfVU5SRUZFUkVOQ0VEKHN0b3JhZ2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBwYXR0ZXJuX3NpemUsIEN2UG9pbnQyRDMyZiAqIGNvcm5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpjb3JuZXJfY291bnQgKQoreworICAgIHJldHVybiBjdkZpbmRDaGVzc2JvYXJkQ29ybmVycyggYXJyLCBwYXR0ZXJuX3NpemUsIGNvcm5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JuZXJfY291bnQsIENWX0NBTElCX0NCX0FEQVBUSVZFX1RIUkVTSCApOworfQorCisKKy8qIENhbGlicmF0ZXMgY2FtZXJhIHVzaW5nIG11bHRpcGxlIHZpZXdzIG9mIGNhbGlicmF0aW9uIHBhdHRlcm4gKi8KK0NWX0lOTElORSB2b2lkIGN2Q2FsaWJyYXRlQ2FtZXJhKCBpbnQgaW1hZ2VfY291bnQsIGludCogX3BvaW50X2NvdW50cywKKyAgICBDdlNpemUgaW1hZ2Vfc2l6ZSwgQ3ZQb2ludDJEMzJmKiBfaW1hZ2VfcG9pbnRzLCBDdlBvaW50M0QzMmYqIF9vYmplY3RfcG9pbnRzLAorICAgIGZsb2F0KiBfZGlzdG9ydGlvbl9jb2VmZnMsIGZsb2F0KiBfY2FtZXJhX21hdHJpeCwgZmxvYXQqIF90cmFuc2xhdGlvbl92ZWN0b3JzLAorICAgIGZsb2F0KiBfcm90YXRpb25fbWF0cmljZXMsIGludCBmbGFncyApCit7CisgICAgaW50IGksIHRvdGFsID0gMDsKKyAgICBDdk1hdCBwb2ludF9jb3VudHMgPSBjdk1hdCggaW1hZ2VfY291bnQsIDEsIENWXzMyU0MxLCBfcG9pbnRfY291bnRzICk7CisgICAgQ3ZNYXQgaW1hZ2VfcG9pbnRzLCBvYmplY3RfcG9pbnRzOworICAgIEN2TWF0IGRpc3RfY29lZmZzID0gY3ZNYXQoIDQsIDEsIENWXzMyRkMxLCBfZGlzdG9ydGlvbl9jb2VmZnMgKTsKKyAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzMyRkMxLCBfY2FtZXJhX21hdHJpeCApOworICAgIEN2TWF0IHJvdGF0aW9uX21hdHJpY2VzID0gY3ZNYXQoIGltYWdlX2NvdW50LCA5LCBDVl8zMkZDMSwgX3JvdGF0aW9uX21hdHJpY2VzICk7CisgICAgQ3ZNYXQgdHJhbnNsYXRpb25fdmVjdG9ycyA9IGN2TWF0KCBpbWFnZV9jb3VudCwgMywgQ1ZfMzJGQzEsIF90cmFuc2xhdGlvbl92ZWN0b3JzICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgaW1hZ2VfY291bnQ7IGkrKyApCisgICAgICAgIHRvdGFsICs9IF9wb2ludF9jb3VudHNbaV07CisKKyAgICBpbWFnZV9wb2ludHMgPSBjdk1hdCggdG90YWwsIDEsIENWXzMyRkMyLCBfaW1hZ2VfcG9pbnRzICk7CisgICAgb2JqZWN0X3BvaW50cyA9IGN2TWF0KCB0b3RhbCwgMSwgQ1ZfMzJGQzMsIF9vYmplY3RfcG9pbnRzICk7CisKKyAgICBjdkNhbGlicmF0ZUNhbWVyYTIoICZvYmplY3RfcG9pbnRzLCAmaW1hZ2VfcG9pbnRzLCAmcG9pbnRfY291bnRzLCBpbWFnZV9zaXplLAorICAgICAgICAmY2FtZXJhX21hdHJpeCwgJmRpc3RfY29lZmZzLCAmcm90YXRpb25fbWF0cmljZXMsICZ0cmFuc2xhdGlvbl92ZWN0b3JzLAorICAgICAgICBmbGFncyApOworfQorCisKK0NWX0lOTElORSB2b2lkIGN2Q2FsaWJyYXRlQ2FtZXJhXzY0ZCggaW50IGltYWdlX2NvdW50LCBpbnQqIF9wb2ludF9jb3VudHMsCisgICAgQ3ZTaXplIGltYWdlX3NpemUsIEN2UG9pbnQyRDY0ZiogX2ltYWdlX3BvaW50cywgQ3ZQb2ludDNENjRmKiBfb2JqZWN0X3BvaW50cywKKyAgICBkb3VibGUqIF9kaXN0b3J0aW9uX2NvZWZmcywgZG91YmxlKiBfY2FtZXJhX21hdHJpeCwgZG91YmxlKiBfdHJhbnNsYXRpb25fdmVjdG9ycywKKyAgICBkb3VibGUqIF9yb3RhdGlvbl9tYXRyaWNlcywgaW50IGZsYWdzICkKK3sKKyAgICBpbnQgaSwgdG90YWwgPSAwOworICAgIEN2TWF0IHBvaW50X2NvdW50cyA9IGN2TWF0KCBpbWFnZV9jb3VudCwgMSwgQ1ZfMzJTQzEsIF9wb2ludF9jb3VudHMgKTsKKyAgICBDdk1hdCBpbWFnZV9wb2ludHMsIG9iamVjdF9wb2ludHM7CisgICAgQ3ZNYXQgZGlzdF9jb2VmZnMgPSBjdk1hdCggNCwgMSwgQ1ZfNjRGQzEsIF9kaXN0b3J0aW9uX2NvZWZmcyApOworICAgIEN2TWF0IGNhbWVyYV9tYXRyaXggPSBjdk1hdCggMywgMywgQ1ZfNjRGQzEsIF9jYW1lcmFfbWF0cml4ICk7CisgICAgQ3ZNYXQgcm90YXRpb25fbWF0cmljZXMgPSBjdk1hdCggaW1hZ2VfY291bnQsIDksIENWXzY0RkMxLCBfcm90YXRpb25fbWF0cmljZXMgKTsKKyAgICBDdk1hdCB0cmFuc2xhdGlvbl92ZWN0b3JzID0gY3ZNYXQoIGltYWdlX2NvdW50LCAzLCBDVl82NEZDMSwgX3RyYW5zbGF0aW9uX3ZlY3RvcnMgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBpbWFnZV9jb3VudDsgaSsrICkKKyAgICAgICAgdG90YWwgKz0gX3BvaW50X2NvdW50c1tpXTsKKworICAgIGltYWdlX3BvaW50cyA9IGN2TWF0KCB0b3RhbCwgMSwgQ1ZfNjRGQzIsIF9pbWFnZV9wb2ludHMgKTsKKyAgICBvYmplY3RfcG9pbnRzID0gY3ZNYXQoIHRvdGFsLCAxLCBDVl82NEZDMywgX29iamVjdF9wb2ludHMgKTsKKworICAgIGN2Q2FsaWJyYXRlQ2FtZXJhMiggJm9iamVjdF9wb2ludHMsICZpbWFnZV9wb2ludHMsICZwb2ludF9jb3VudHMsIGltYWdlX3NpemUsCisgICAgICAgICZjYW1lcmFfbWF0cml4LCAmZGlzdF9jb2VmZnMsICZyb3RhdGlvbl9tYXRyaWNlcywgJnRyYW5zbGF0aW9uX3ZlY3RvcnMsCisgICAgICAgIGZsYWdzICk7Cit9CisKKworCisvKiBGaW5kIDNkIHBvc2l0aW9uIG9mIG9iamVjdCBnaXZlbiBpbnRyaW5zaWMgY2FtZXJhIHBhcmFtZXRlcnMsCisgICAzZCBtb2RlbCBvZiB0aGUgb2JqZWN0IGFuZCBwcm9qZWN0aW9uIG9mIHRoZSBvYmplY3QgaW50byB2aWV3IHBsYW5lICovCitDVl9JTkxJTkUgdm9pZCBjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMoIGludCBwb2ludF9jb3VudCwKKyAgICBDdlNpemUgQ1ZfVU5SRUZFUkVOQ0VEKGltYWdlX3NpemUpLCBDdlBvaW50MkQzMmYqIF9pbWFnZV9wb2ludHMsCisgICAgQ3ZQb2ludDNEMzJmKiBfb2JqZWN0X3BvaW50cywgZmxvYXQqIGZvY2FsX2xlbmd0aCwKKyAgICBDdlBvaW50MkQzMmYgcHJpbmNpcGFsX3BvaW50LCBmbG9hdCogX2Rpc3RvcnRpb25fY29lZmZzLAorICAgIGZsb2F0KiBfcm90YXRpb25fdmVjdG9yLCBmbG9hdCogX3RyYW5zbGF0aW9uX3ZlY3RvciApCit7CisgICAgQ3ZNYXQgaW1hZ2VfcG9pbnRzID0gY3ZNYXQoIHBvaW50X2NvdW50LCAxLCBDVl8zMkZDMiwgX2ltYWdlX3BvaW50cyApOworICAgIEN2TWF0IG9iamVjdF9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzMyRkMzLCBfb2JqZWN0X3BvaW50cyApOworICAgIEN2TWF0IGRpc3RfY29lZmZzID0gY3ZNYXQoIDQsIDEsIENWXzMyRkMxLCBfZGlzdG9ydGlvbl9jb2VmZnMgKTsKKyAgICBmbG9hdCBhWzldOworICAgIEN2TWF0IGNhbWVyYV9tYXRyaXggPSBjdk1hdCggMywgMywgQ1ZfMzJGQzEsIGEgKTsKKyAgICBDdk1hdCByb3RhdGlvbl92ZWN0b3IgPSBjdk1hdCggMSwgMSwgQ1ZfMzJGQzMsIF9yb3RhdGlvbl92ZWN0b3IgKTsKKyAgICBDdk1hdCB0cmFuc2xhdGlvbl92ZWN0b3IgPSBjdk1hdCggMSwgMSwgQ1ZfMzJGQzMsIF90cmFuc2xhdGlvbl92ZWN0b3IgKTsKKworICAgIGFbMF0gPSBmb2NhbF9sZW5ndGhbMF07IGFbNF0gPSBmb2NhbF9sZW5ndGhbMV07CisgICAgYVsyXSA9IHByaW5jaXBhbF9wb2ludC54OyBhWzVdID0gcHJpbmNpcGFsX3BvaW50Lnk7CisgICAgYVsxXSA9IGFbM10gPSBhWzZdID0gYVs3XSA9IDAuZjsKKyAgICBhWzhdID0gMS5mOworCisgICAgY3ZGaW5kRXh0cmluc2ljQ2FtZXJhUGFyYW1zMiggJm9iamVjdF9wb2ludHMsICZpbWFnZV9wb2ludHMsICZjYW1lcmFfbWF0cml4LAorICAgICAgICAmZGlzdF9jb2VmZnMsICZyb3RhdGlvbl92ZWN0b3IsICZ0cmFuc2xhdGlvbl92ZWN0b3IgKTsKK30KKworCisvKiBWYXJpYW50IG9mIHRoZSBwcmV2aW91cyBmdW5jdGlvbiB0aGF0IHRha2VzIGRvdWJsZS1wcmVjaXNpb24gcGFyYW1ldGVycyAqLworQ1ZfSU5MSU5FIHZvaWQgY3ZGaW5kRXh0cmluc2ljQ2FtZXJhUGFyYW1zXzY0ZCggaW50IHBvaW50X2NvdW50LAorICAgIEN2U2l6ZSBDVl9VTlJFRkVSRU5DRUQoaW1hZ2Vfc2l6ZSksIEN2UG9pbnQyRDY0ZiogX2ltYWdlX3BvaW50cywKKyAgICBDdlBvaW50M0Q2NGYqIF9vYmplY3RfcG9pbnRzLCBkb3VibGUqIGZvY2FsX2xlbmd0aCwKKyAgICBDdlBvaW50MkQ2NGYgcHJpbmNpcGFsX3BvaW50LCBkb3VibGUqIF9kaXN0b3J0aW9uX2NvZWZmcywKKyAgICBkb3VibGUqIF9yb3RhdGlvbl92ZWN0b3IsIGRvdWJsZSogX3RyYW5zbGF0aW9uX3ZlY3RvciApCit7CisgICAgQ3ZNYXQgaW1hZ2VfcG9pbnRzID0gY3ZNYXQoIHBvaW50X2NvdW50LCAxLCBDVl82NEZDMiwgX2ltYWdlX3BvaW50cyApOworICAgIEN2TWF0IG9iamVjdF9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzY0RkMzLCBfb2JqZWN0X3BvaW50cyApOworICAgIEN2TWF0IGRpc3RfY29lZmZzID0gY3ZNYXQoIDQsIDEsIENWXzY0RkMxLCBfZGlzdG9ydGlvbl9jb2VmZnMgKTsKKyAgICBkb3VibGUgYVs5XTsKKyAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBhICk7CisgICAgQ3ZNYXQgcm90YXRpb25fdmVjdG9yID0gY3ZNYXQoIDEsIDEsIENWXzY0RkMzLCBfcm90YXRpb25fdmVjdG9yICk7CisgICAgQ3ZNYXQgdHJhbnNsYXRpb25fdmVjdG9yID0gY3ZNYXQoIDEsIDEsIENWXzY0RkMzLCBfdHJhbnNsYXRpb25fdmVjdG9yICk7CisKKyAgICBhWzBdID0gZm9jYWxfbGVuZ3RoWzBdOyBhWzRdID0gZm9jYWxfbGVuZ3RoWzFdOworICAgIGFbMl0gPSBwcmluY2lwYWxfcG9pbnQueDsgYVs1XSA9IHByaW5jaXBhbF9wb2ludC55OworICAgIGFbMV0gPSBhWzNdID0gYVs2XSA9IGFbN10gPSAwLjsKKyAgICBhWzhdID0gMS47CisKKyAgICBjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMyKCAmb2JqZWN0X3BvaW50cywgJmltYWdlX3BvaW50cywgJmNhbWVyYV9tYXRyaXgsCisgICAgICAgICZkaXN0X2NvZWZmcywgJnJvdGF0aW9uX3ZlY3RvciwgJnRyYW5zbGF0aW9uX3ZlY3RvciApOworfQorCisKKy8qIFJvZHJpZ3VlcyB0cmFuc2Zvcm0gKi8KKyNkZWZpbmUgQ1ZfUk9EUklHVUVTX00yViAgMAorI2RlZmluZSBDVl9ST0RSSUdVRVNfVjJNICAxCisKKy8qIENvbnZlcnRzIHJvdGF0aW9uX21hdHJpeCBtYXRyaXggdG8gcm90YXRpb25fbWF0cml4IHZlY3RvciBvciB2aWNlIHZlcnNhICovCitDVl9JTkxJTkUgdm9pZCAgY3ZSb2RyaWd1ZXMoIEN2TWF0KiByb3RhdGlvbl9tYXRyaXgsIEN2TWF0KiByb3RhdGlvbl92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBqYWNvYmlhbiwgaW50IGNvbnZfdHlwZSApCit7CisgICAgaWYoIGNvbnZfdHlwZSA9PSBDVl9ST0RSSUdVRVNfVjJNICkKKyAgICAgICAgY3ZSb2RyaWd1ZXMyKCByb3RhdGlvbl92ZWN0b3IsIHJvdGF0aW9uX21hdHJpeCwgamFjb2JpYW4gKTsKKyAgICBlbHNlCisgICAgICAgIGN2Um9kcmlndWVzMiggcm90YXRpb25fbWF0cml4LCByb3RhdGlvbl92ZWN0b3IsIGphY29iaWFuICk7Cit9CisKKworLyogRG9lcyByZXByb2plY3Rpb24gb2YgM2Qgb2JqZWN0IHBvaW50cyB0byB0aGUgdmlldyBwbGFuZSAqLworQ1ZfSU5MSU5FIHZvaWQgIGN2UHJvamVjdFBvaW50cyggaW50IHBvaW50X2NvdW50LCBDdlBvaW50M0Q2NGYqIF9vYmplY3RfcG9pbnRzLAorICAgIGRvdWJsZSogX3JvdGF0aW9uX3ZlY3RvciwgZG91YmxlKiAgX3RyYW5zbGF0aW9uX3ZlY3RvciwKKyAgICBkb3VibGUqIGZvY2FsX2xlbmd0aCwgQ3ZQb2ludDJENjRmIHByaW5jaXBhbF9wb2ludCwKKyAgICBkb3VibGUqIF9kaXN0b3J0aW9uLCBDdlBvaW50MkQ2NGYqIF9pbWFnZV9wb2ludHMsCisgICAgZG91YmxlKiBfZGVyaXZfcG9pbnRzX3JvdGF0aW9uX21hdHJpeCwKKyAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfdHJhbnNsYXRpb25fdmVjdCwKKyAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfZm9jYWwsCisgICAgZG91YmxlKiBfZGVyaXZfcG9pbnRzX3ByaW5jaXBhbF9wb2ludCwKKyAgICBkb3VibGUqIF9kZXJpdl9wb2ludHNfZGlzdG9ydGlvbl9jb2VmZnMgKQoreworICAgIEN2TWF0IG9iamVjdF9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzY0RkMzLCBfb2JqZWN0X3BvaW50cyApOworICAgIEN2TWF0IGltYWdlX3BvaW50cyA9IGN2TWF0KCBwb2ludF9jb3VudCwgMSwgQ1ZfNjRGQzIsIF9pbWFnZV9wb2ludHMgKTsKKyAgICBDdk1hdCByb3RhdGlvbl92ZWN0b3IgPSBjdk1hdCggMywgMSwgQ1ZfNjRGQzEsIF9yb3RhdGlvbl92ZWN0b3IgKTsKKyAgICBDdk1hdCB0cmFuc2xhdGlvbl92ZWN0b3IgPSBjdk1hdCggMywgMSwgQ1ZfNjRGQzEsIF90cmFuc2xhdGlvbl92ZWN0b3IgKTsKKyAgICBkb3VibGUgYVs5XTsKKyAgICBDdk1hdCBjYW1lcmFfbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBhICk7CisgICAgQ3ZNYXQgZGlzdF9jb2VmZnMgPSBjdk1hdCggNCwgMSwgQ1ZfNjRGQzEsIF9kaXN0b3J0aW9uICk7CisgICAgQ3ZNYXQgZHBkciA9IGN2TWF0KCAyKnBvaW50X2NvdW50LCAzLCBDVl82NEZDMSwgX2Rlcml2X3BvaW50c19yb3RhdGlvbl9tYXRyaXggKTsKKyAgICBDdk1hdCBkcGR0ID0gY3ZNYXQoIDIqcG9pbnRfY291bnQsIDMsIENWXzY0RkMxLCBfZGVyaXZfcG9pbnRzX3RyYW5zbGF0aW9uX3ZlY3QgKTsKKyAgICBDdk1hdCBkcGRmID0gY3ZNYXQoIDIqcG9pbnRfY291bnQsIDIsIENWXzY0RkMxLCBfZGVyaXZfcG9pbnRzX2ZvY2FsICk7CisgICAgQ3ZNYXQgZHBkYyA9IGN2TWF0KCAyKnBvaW50X2NvdW50LCAyLCBDVl82NEZDMSwgX2Rlcml2X3BvaW50c19wcmluY2lwYWxfcG9pbnQgKTsKKyAgICBDdk1hdCBkcGRrID0gY3ZNYXQoIDIqcG9pbnRfY291bnQsIDQsIENWXzY0RkMxLCBfZGVyaXZfcG9pbnRzX2Rpc3RvcnRpb25fY29lZmZzICk7CisKKyAgICBhWzBdID0gZm9jYWxfbGVuZ3RoWzBdOyBhWzRdID0gZm9jYWxfbGVuZ3RoWzFdOworICAgIGFbMl0gPSBwcmluY2lwYWxfcG9pbnQueDsgYVs1XSA9IHByaW5jaXBhbF9wb2ludC55OworICAgIGFbMV0gPSBhWzNdID0gYVs2XSA9IGFbN10gPSAwLjsKKyAgICBhWzhdID0gMS47CisKKyAgICBjdlByb2plY3RQb2ludHMyKCAmb2JqZWN0X3BvaW50cywgJnJvdGF0aW9uX3ZlY3RvciwgJnRyYW5zbGF0aW9uX3ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAmY2FtZXJhX21hdHJpeCwgJmRpc3RfY29lZmZzLCAmaW1hZ2VfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICZkcGRyLCAmZHBkdCwgJmRwZGYsICZkcGRjLCAmZHBkaywgMCApOworfQorCisKKy8qIFNpbXBsZXIgdmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgZnVuY3Rpb24gKi8KK0NWX0lOTElORSB2b2lkICBjdlByb2plY3RQb2ludHNTaW1wbGUoIGludCBwb2ludF9jb3VudCwgQ3ZQb2ludDNENjRmKiBfb2JqZWN0X3BvaW50cywKKyAgICBkb3VibGUqIF9yb3RhdGlvbl9tYXRyaXgsIGRvdWJsZSogIF90cmFuc2xhdGlvbl92ZWN0b3IsCisgICAgZG91YmxlKiBfY2FtZXJhX21hdHJpeCwgZG91YmxlKiBfZGlzdG9ydGlvbiwgQ3ZQb2ludDJENjRmKiBfaW1hZ2VfcG9pbnRzICkKK3sKKyAgICBDdk1hdCBvYmplY3RfcG9pbnRzID0gY3ZNYXQoIHBvaW50X2NvdW50LCAxLCBDVl82NEZDMywgX29iamVjdF9wb2ludHMgKTsKKyAgICBDdk1hdCBpbWFnZV9wb2ludHMgPSBjdk1hdCggcG9pbnRfY291bnQsIDEsIENWXzY0RkMyLCBfaW1hZ2VfcG9pbnRzICk7CisgICAgQ3ZNYXQgcm90YXRpb25fbWF0cml4ID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBfcm90YXRpb25fbWF0cml4ICk7CisgICAgQ3ZNYXQgdHJhbnNsYXRpb25fdmVjdG9yID0gY3ZNYXQoIDMsIDEsIENWXzY0RkMxLCBfdHJhbnNsYXRpb25fdmVjdG9yICk7CisgICAgQ3ZNYXQgY2FtZXJhX21hdHJpeCA9IGN2TWF0KCAzLCAzLCBDVl82NEZDMSwgX2NhbWVyYV9tYXRyaXggKTsKKyAgICBDdk1hdCBkaXN0X2NvZWZmcyA9IGN2TWF0KCA0LCAxLCBDVl82NEZDMSwgX2Rpc3RvcnRpb24gKTsKKworICAgIGN2UHJvamVjdFBvaW50czIoICZvYmplY3RfcG9pbnRzLCAmcm90YXRpb25fbWF0cml4LCAmdHJhbnNsYXRpb25fdmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFfbWF0cml4LCAmZGlzdF9jb2VmZnMsICZpbWFnZV9wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCApOworfQorCisKK0NWX0lOTElORSB2b2lkIGN2VW5EaXN0b3J0T25jZSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGludHJpbnNpY19tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkaXN0b3J0aW9uX2NvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENWX1VOUkVGRVJFTkNFRChpbnRlcnBvbGF0ZSkgKQoreworICAgIEN2TWF0IF9hID0gY3ZNYXQoIDMsIDMsIENWXzMyRiwgKHZvaWQqKWludHJpbnNpY19tYXRyaXggKTsKKyAgICBDdk1hdCBfayA9IGN2TWF0KCA0LCAxLCBDVl8zMkYsICh2b2lkKilkaXN0b3J0aW9uX2NvZWZmcyApOworICAgIGN2VW5kaXN0b3J0Miggc3JjLCBkc3QsICZfYSwgJl9rICk7Cit9CisKKworLyogdGhlIHR3byBmdW5jdGlvbnMgYmVsb3cgaGF2ZSBxdWl0ZSBoYWNrZXJpc2ggaW1wbGVtZW50YXRpb25zLCB1c2Ugd2l0aCBjYXJlCisgICAob3IsIHdoaWNoIGlzIGJldHRlciwgc3dpdGNoIHRvIGN2VW5kaXN0b3J0SW5pdE1hcCBhbmQgY3ZSZW1hcCBpbnN0ZWFkICovCitDVl9JTkxJTkUgdm9pZCBjdlVuRGlzdG9ydEluaXQoIGNvbnN0IEN2QXJyKiBDVl9VTlJFRkVSRU5DRUQoc3JjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIHVuZGlzdG9ydGlvbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBBLCBjb25zdCBmbG9hdCogaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IENWX1VOUkVGRVJFTkNFRChpbnRlcnBvbGF0ZSkgKQoreworICAgIHVuaW9uIHsgdWNoYXIqIHB0cjsgZmxvYXQqIGZsOyB9IGRhdGE7CisgICAgQ3ZTaXplIHN6OworICAgIGN2R2V0UmF3RGF0YSggdW5kaXN0b3J0aW9uX21hcCwgJmRhdGEucHRyLCAwLCAmc3ogKTsKKyAgICBhc3NlcnQoIHN6LndpZHRoID49IDggKTsKKyAgICAvKiBqdXN0IHNhdmUgdGhlIGludHJpbnNpYyBwYXJhbWV0ZXJzIHRvIHRoZSBtYXAgKi8KKyAgICBkYXRhLmZsWzBdID0gQVswXTsgZGF0YS5mbFsxXSA9IEFbNF07CisgICAgZGF0YS5mbFsyXSA9IEFbMl07IGRhdGEuZmxbM10gPSBBWzVdOworICAgIGRhdGEuZmxbNF0gPSBrWzBdOyBkYXRhLmZsWzVdID0ga1sxXTsKKyAgICBkYXRhLmZsWzZdID0ga1syXTsgZGF0YS5mbFs3XSA9IGtbM107Cit9CisKK0NWX0lOTElORSB2b2lkICBjdlVuRGlzdG9ydCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHVuZGlzdG9ydGlvbl9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDVl9VTlJFRkVSRU5DRUQoaW50ZXJwb2xhdGUpICkKK3sKKyAgICB1bmlvbiB7IHVjaGFyKiBwdHI7IGZsb2F0KiBmbDsgfSBkYXRhOworICAgIGZsb2F0IGFbXSA9IHswLDAsMCwwLDAsMCwwLDAsMX07CisgICAgQ3ZTaXplIHN6OworICAgIGN2R2V0UmF3RGF0YSggdW5kaXN0b3J0aW9uX21hcCwgJmRhdGEucHRyLCAwLCAmc3ogKTsKKyAgICBhc3NlcnQoIHN6LndpZHRoID49IDggKTsKKyAgICBhWzBdID0gZGF0YS5mbFswXTsgYVs0XSA9IGRhdGEuZmxbMV07CisgICAgYVsyXSA9IGRhdGEuZmxbMl07IGFbNV0gPSBkYXRhLmZsWzNdOworICAgIGN2VW5EaXN0b3J0T25jZSggc3JjLCBkc3QsIGEsIGRhdGEuZmwgKyA0LCAxICk7Cit9CisKKworQ1ZfSU5MSU5FICBmbG9hdCAgY3ZDYWxjRU1EKCBjb25zdCBmbG9hdCogc2lnbmF0dXJlMSwgaW50IHNpemUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc2lnbmF0dXJlMiwgaW50IHNpemUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltcywgaW50IGRpc3RfdHlwZSBDVl9ERUZBVUxUKENWX0RJU1RfTDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkRpc3RhbmNlRnVuY3Rpb24gZGlzdF9mdW5jIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsb3dlcl9ib3VuZCBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyX3BhcmFtIENWX0RFRkFVTFQoMCkpCit7CisgICAgQ3ZNYXQgc2lnbjEgPSBjdk1hdCggc2l6ZTEsIGRpbXMgKyAxLCBDVl8zMkZDMSwgKHZvaWQqKXNpZ25hdHVyZTEgKTsKKyAgICBDdk1hdCBzaWduMiA9IGN2TWF0KCBzaXplMiwgZGltcyArIDEsIENWXzMyRkMxLCAodm9pZCopc2lnbmF0dXJlMiApOworCisgICAgcmV0dXJuIGN2Q2FsY0VNRDIoICZzaWduMSwgJnNpZ24yLCBkaXN0X3R5cGUsIGRpc3RfZnVuYywgMCwgMCwgbG93ZXJfYm91bmQsIHVzZXJfcGFyYW0gKTsKK30KKworCitDVl9JTkxJTkUgIHZvaWQgIGN2S01lYW5zKCBpbnQgbnVtX2NsdXN0ZXJzLCBmbG9hdCoqIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3NhbXBsZXMsIGludCB2ZWNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhIHRlcm1jcml0LCBpbnQqIGNsdXN0ZXJfaWR4ICkKK3sKKyAgICBDdk1hdCogc2FtcGxlc19tYXQgPSBjdkNyZWF0ZU1hdCggbnVtX3NhbXBsZXMsIHZlY19zaXplLCBDVl8zMkZDMSApOworICAgIEN2TWF0IGNsdXN0ZXJfaWR4X21hdCA9IGN2TWF0KCBudW1fc2FtcGxlcywgMSwgQ1ZfMzJTQzEsIGNsdXN0ZXJfaWR4ICk7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKysgKQorICAgICAgICBtZW1jcHkoIHNhbXBsZXNfbWF0LT5kYXRhLmZsICsgaSp2ZWNfc2l6ZSwgc2FtcGxlc1tpXSwgdmVjX3NpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgY3ZLTWVhbnMyKCBzYW1wbGVzX21hdCwgbnVtX2NsdXN0ZXJzLCAmY2x1c3Rlcl9pZHhfbWF0LCB0ZXJtY3JpdCApOworICAgIGN2UmVsZWFzZU1hdCggJnNhbXBsZXNfbWF0ICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgIGN2U3RhcnRTY2FuR3JhcGgoIEN2R3JhcGgqIGdyYXBoLCBDdkdyYXBoU2Nhbm5lciogc2Nhbm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiB2dHggQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayBDVl9ERUZBVUxUKENWX0dSQVBIX0FMTF9JVEVNUykpCit7CisgICAgQ3ZHcmFwaFNjYW5uZXIqIHRlbXBfc2Nhbm5lcjsKKworICAgIGlmKCAhc2Nhbm5lciApCisgICAgICAgIGN2RXJyb3IoIENWX1N0c051bGxQdHIsICJjdlN0YXJ0U2NhbkdyYXBoIiwgIk51bGwgc2Nhbm5lciBwb2ludGVyIiwgImN2Y29tcGF0LmgiLCAwICk7CisKKyAgICB0ZW1wX3NjYW5uZXIgPSBjdkNyZWF0ZUdyYXBoU2Nhbm5lciggZ3JhcGgsIHZ0eCwgbWFzayApOworICAgICpzY2FubmVyID0gKnRlbXBfc2Nhbm5lcjsKKyAgICBjdkZyZWUoICZ0ZW1wX3NjYW5uZXIgKTsKK30KKworCitDVl9JTkxJTkUgIHZvaWQgIGN2RW5kU2NhbkdyYXBoKCBDdkdyYXBoU2Nhbm5lciogc2Nhbm5lciApCit7CisgICAgaWYoICFzY2FubmVyICkKKyAgICAgICAgY3ZFcnJvciggQ1ZfU3RzTnVsbFB0ciwgImN2RW5kU2NhbkdyYXBoIiwgIk51bGwgc2Nhbm5lciBwb2ludGVyIiwgImN2Y29tcGF0LmgiLCAwICk7CisKKyAgICBpZiggc2Nhbm5lci0+c3RhY2sgKQorICAgIHsKKyAgICAgICAgQ3ZHcmFwaFNjYW5uZXIqIHRlbXBfc2Nhbm5lciA9IChDdkdyYXBoU2Nhbm5lciopY3ZBbGxvYyggc2l6ZW9mKCp0ZW1wX3NjYW5uZXIpICk7CisgICAgICAgICp0ZW1wX3NjYW5uZXIgPSAqc2Nhbm5lcjsKKyAgICAgICAgY3ZSZWxlYXNlR3JhcGhTY2FubmVyKCAmdGVtcF9zY2FubmVyICk7CisgICAgICAgIG1lbXNldCggc2Nhbm5lciwgMCwgc2l6ZW9mKCpzY2FubmVyKSApOworICAgIH0KK30KKworCisjZGVmaW5lIGN2S2FsbWFuVXBkYXRlQnlUaW1lICBjdkthbG1hblByZWRpY3QKKyNkZWZpbmUgY3ZLYWxtYW5VcGRhdGVCeU1lYXN1cmVtZW50IGN2S2FsbWFuQ29ycmVjdAorCisvKiBvbGQgZHJhd2luZyBmdW5jdGlvbnMgKi8KK0NWX0lOTElORSAgdm9pZCAgY3ZMaW5lQUEoIEN2QXJyKiBpbWcsIEN2UG9pbnQgcHQxLCBDdlBvaW50IHB0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb2xvciwgaW50IHNjYWxlIENWX0RFRkFVTFQoMCkpCit7CisgICAgY3ZMaW5lKCBpbWcsIHB0MSwgcHQyLCBjdkNvbG9yVG9TY2FsYXIoY29sb3IsIGN2R2V0RWxlbVR5cGUoaW1nKSksIDEsIENWX0FBLCBzY2FsZSApOworfQorCitDVl9JTkxJTkUgIHZvaWQgIGN2Q2lyY2xlQUEoIEN2QXJyKiBpbWcsIEN2UG9pbnQgY2VudGVyLCBpbnQgcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29sb3IsIGludCBzY2FsZSBDVl9ERUZBVUxUKDApICkKK3sKKyAgICBjdkNpcmNsZSggaW1nLCBjZW50ZXIsIHJhZGl1cywgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKGltZykpLCAxLCBDVl9BQSwgc2NhbGUgKTsKK30KKworQ1ZfSU5MSU5FICB2b2lkICBjdkVsbGlwc2VBQSggQ3ZBcnIqIGltZywgQ3ZQb2ludCBjZW50ZXIsIEN2U2l6ZSBheGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFuZ2xlLCBkb3VibGUgc3RhcnRfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZW5kX2FuZ2xlLCBkb3VibGUgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGUgQ1ZfREVGQVVMVCgwKSApCit7CisgICAgY3ZFbGxpcHNlKCBpbWcsIGNlbnRlciwgYXhlcywgYW5nbGUsIHN0YXJ0X2FuZ2xlLCBlbmRfYW5nbGUsCisgICAgICAgICAgICAgICBjdkNvbG9yVG9TY2FsYXIoY29sb3IsIGN2R2V0RWxlbVR5cGUoaW1nKSksIDEsIENWX0FBLCBzY2FsZSApOworfQorCitDVl9JTkxJTkUgIHZvaWQgIGN2UG9seUxpbmVBQSggQ3ZBcnIqIGltZywgQ3ZQb2ludCoqIHB0cywgaW50KiBucHRzLCBpbnQgY29udG91cnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2Nsb3NlZCwgZG91YmxlIGNvbG9yLCBpbnQgc2NhbGUgQ1ZfREVGQVVMVCgwKSApCit7CisgICAgY3ZQb2x5TGluZSggaW1nLCBwdHMsIG5wdHMsIGNvbnRvdXJzLCBpc19jbG9zZWQsCisgICAgICAgICAgICAgICAgY3ZDb2xvclRvU2NhbGFyKGNvbG9yLCBjdkdldEVsZW1UeXBlKGltZykpLAorICAgICAgICAgICAgICAgIDEsIENWX0FBLCBzY2FsZSApOworfQorCisKKyNkZWZpbmUgY3ZNYWtlMkRQb2ludHMgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMKKyNkZWZpbmUgY3ZNYWtlM0RQb2ludHMgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMKKworI2RlZmluZSBjdldhcnBQZXJzcGVjdGl2ZVFNYXRyaXggY3ZHZXRQZXJzcGVjdGl2ZVRyYW5zZm9ybQorCisjZGVmaW5lIGN2Q29udmVydFBvaW50c0hvbW9nZW5pb3VzIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWwgQWNjZXNzIE1hY3JvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0N2UGl4ZWxQb3NpdGlvbjh1Cit7CisgICAgdWNoYXIqICBjdXJybGluZTsgICAgICAvKiBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBwaXhlbCBsaW5lICAgKi8KKyAgICB1Y2hhciogIHRvcGxpbmU7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0b3AgcGl4ZWwgbGluZSAgICAgICAqLworICAgIHVjaGFyKiAgYm90dG9tbGluZTsgICAgLyogcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGZpcnN0IGxpbmUgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGljaCBpcyBiZWxvdyB0aGUgaW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIHg7ICAgICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgeCBjb29yZGluYXRlICggaW4gcGl4ZWxzICkgICAgICAgICAgICAgICAqLworICAgIGludCAgICAgd2lkdGg7ICAgICAgICAgICAgICAgICAgLyogd2lkdGggb2YgdGhlIGltYWdlICAoIGluIHBpeGVscyApICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICBoZWlnaHQ7ICAgICAgICAgICAgICAgICAvKiBoZWlnaHQgb2YgdGhlIGltYWdlICAoIGluIHBpeGVscyApICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgICAgIHN0ZXA7ICAgICAgICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGJldHdlZW4gbGluZXMgKCBpbiBlbGVtZW50cyBvZiBzaW5nbGUgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcGxhbmUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICBzdGVwX2FyclszXTsgICAgICAgICAgICAvKiBhcnJheTogKCAwLCAtc3RlcCwgc3RlcCApLiBJdCBpcyB1c2VkIGZvciAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHZlcnRpY2FsIG1vdmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBDdlBpeGVsUG9zaXRpb244dTsKKworLyogdGhpcyBzdHJ1Y3R1cmUgZGlmZmVycyBmcm9tIHRoZSBhYm92ZSBvbmx5IGluIGRhdGEgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgX0N2UGl4ZWxQb3NpdGlvbjhzCit7CisgICAgc2NoYXIqICBjdXJybGluZTsKKyAgICBzY2hhciogIHRvcGxpbmU7CisgICAgc2NoYXIqICBib3R0b21saW5lOworICAgIGludCAgICAgeDsKKyAgICBpbnQgICAgIHdpZHRoOworICAgIGludCAgICAgaGVpZ2h0OworICAgIGludCAgICAgc3RlcDsKKyAgICBpbnQgICAgIHN0ZXBfYXJyWzNdOworfSBDdlBpeGVsUG9zaXRpb244czsKKworLyogdGhpcyBzdHJ1Y3R1cmUgZGlmZmVycyBmcm9tIHRoZSBDdlBpeGVsUG9zaXRpb244dSBvbmx5IGluIGRhdGEgdHlwZSAqLwordHlwZWRlZiBzdHJ1Y3QgX0N2UGl4ZWxQb3NpdGlvbjMyZgoreworICAgIGZsb2F0KiAgY3VycmxpbmU7CisgICAgZmxvYXQqICB0b3BsaW5lOworICAgIGZsb2F0KiAgYm90dG9tbGluZTsKKyAgICBpbnQgICAgIHg7CisgICAgaW50ICAgICB3aWR0aDsKKyAgICBpbnQgICAgIGhlaWdodDsKKyAgICBpbnQgICAgIHN0ZXA7CisgICAgaW50ICAgICBzdGVwX2FyclszXTsKK30gQ3ZQaXhlbFBvc2l0aW9uMzJmOworCisKKy8qIEluaXRpYWxpemUgb25lIG9mIHRoZSBDdlBpeGVsUG9zaXRpb24gc3RydWN0dXJlcy4gICAqLworLyogIHBvcyAgICAtIGluaXRpYWxpemVkIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3JpZ2luIC0gcG9pbnRlciB0byB0aGUgbGVmdC10b3AgY29ybmVyIG9mIHRoZSBST0kgKi8KKy8qICBzdGVwICAgLSB3aWR0aCBvZiB0aGUgd2hvbGUgaW1hZ2UgaW4gYnl0ZXMgICAgICAgICAqLworLyogIHJvaSAgICAtIHdpZHRoICYgaGVpZ2h0IG9mIHRoZSBST0kgICAgICAgICAgICAgICAgICovCisvKiAgeCwgeSAgIC0gaW5pdGlhbCBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgQ1ZfSU5JVF9QSVhFTF9QT1MocG9zLCBvcmlnaW4sIF9zdGVwLCByb2ksIF94LCBfeSwgb3JpZW50YXRpb24pICAgIFwKKyAgICAoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwb3MpLnN0ZXAgPSAoX3N0ZXApL3NpemVvZigocG9zKS5jdXJybGluZVswXSkgKiAob3JpZW50YXRpb24gPyAtMSA6IDEpLCBcCisgICAgKHBvcykud2lkdGggPSAocm9pKS53aWR0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocG9zKS5oZWlnaHQgPSAocm9pKS5oZWlnaHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwb3MpLmJvdHRvbWxpbmUgPSAob3JpZ2luKSArIChwb3MpLnN0ZXAqKHBvcykuaGVpZ2h0LCAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykudG9wbGluZSA9IChvcmlnaW4pIC0gKHBvcykuc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocG9zKS5zdGVwX2FyclswXSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwb3MpLnN0ZXBfYXJyWzFdID0gLShwb3MpLnN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuc3RlcF9hcnJbMl0gPSAocG9zKS5zdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocG9zKS54ID0gKF94KSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChwb3MpLmN1cnJsaW5lID0gKG9yaWdpbikgKyAocG9zKS5zdGVwKihfeSkgKQorCisKKy8qIE1vdmUgdG8gc3BlY2lmaWVkIHBvaW50ICggYWJzb2x1dGUgc2hpZnQgKSAqLworLyogIHBvcyAgICAtIHBvc2l0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisvKiAgeCwgeSAgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIG5ldyBwb3NpdGlvbiAgKi8KKy8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAqLworI2RlZmluZSBDVl9NT1ZFX1RPKCBwb3MsIF94LCBfeSwgY3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKygocG9zKS5jdXJybGluZSA9IChfeSkgPj0gMCAmJiAoX3kpIDwgKHBvcykuaGVpZ2h0ID8gKHBvcykudG9wbGluZSArICgoX3kpKzEpKihwb3MpLnN0ZXAgOiAwLCBcCisgKHBvcykueCA9IChfeCkgPj0gMCAmJiAoX3gpIDwgKHBvcykud2lkdGggPyAoX3gpIDogMCwgKHBvcykuY3VycmxpbmUgKyAoX3gpICogKGNzKSApCisKKy8qIEdldCBjdXJyZW50IGNvb3JkaW5hdGVzICAgICAgICAgICAgICAgICAgICAqLworLyogIHBvcyAgICAtIHBvc2l0aW9uIHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisvKiAgeCwgeSAgIC0gY29vcmRpbmF0ZXMgb2YgdGhlIG5ldyBwb3NpdGlvbiAgKi8KKy8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAqLworI2RlZmluZSBDVl9HRVRfQ1VSUkVOVCggcG9zLCBjcyApICAoKHBvcykuY3VycmxpbmUgKyAocG9zKS54ICogKGNzKSkKKworLyogTW92ZSBieSBvbmUgcGl4ZWwgcmVsYXRpdmVseSB0byBjdXJyZW50IHBvc2l0aW9uICovCisvKiAgcG9zICAgIC0gcG9zaXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAgICAgICAqLworCisvKiBsZWZ0ICovCisjZGVmaW5lIENWX01PVkVfTEVGVCggcG9zLCBjcyApIFwKKyAoIC0tKHBvcykueCA+PSAwID8gKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgOiAwICkKKworLyogcmlnaHQgKi8KKyNkZWZpbmUgQ1ZfTU9WRV9SSUdIVCggcG9zLCBjcyApIFwKKyAoICsrKHBvcykueCA8IChwb3MpLndpZHRoID8gKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgOiAwICkKKworLyogdXAgKi8KKyNkZWZpbmUgQ1ZfTU9WRV9VUCggcG9zLCBjcyApIFwKKyAoKChwb3MpLmN1cnJsaW5lIC09IChwb3MpLnN0ZXApICE9IChwb3MpLnRvcGxpbmUgPyAocG9zKS5jdXJybGluZSArIChwb3MpLngqKGNzKSA6IDAgKQorCisvKiBkb3duICovCisjZGVmaW5lIENWX01PVkVfRE9XTiggcG9zLCBjcyApIFwKKyAoKChwb3MpLmN1cnJsaW5lICs9IChwb3MpLnN0ZXApICE9IChwb3MpLmJvdHRvbWxpbmUgPyAocG9zKS5jdXJybGluZSArIChwb3MpLngqKGNzKSA6IDAgKQorCisvKiBsZWZ0IHVwICovCisjZGVmaW5lIENWX01PVkVfTFUoIHBvcywgY3MgKSAoIENWX01PVkVfTEVGVChwb3MsIGNzKSwgQ1ZfTU9WRV9VUChwb3MsIGNzKSkKKworLyogcmlnaHQgdXAgKi8KKyNkZWZpbmUgQ1ZfTU9WRV9SVSggcG9zLCBjcyApICggQ1ZfTU9WRV9SSUdIVChwb3MsIGNzKSwgQ1ZfTU9WRV9VUChwb3MsIGNzKSkKKworLyogbGVmdCBkb3duICovCisjZGVmaW5lIENWX01PVkVfTEQoIHBvcywgY3MgKSAoIENWX01PVkVfTEVGVChwb3MsIGNzKSwgQ1ZfTU9WRV9ET1dOKHBvcywgY3MpKQorCisvKiByaWdodCBkb3duICovCisjZGVmaW5lIENWX01PVkVfUkQoIHBvcywgY3MgKSAoIENWX01PVkVfUklHSFQocG9zLCBjcyksIENWX01PVkVfRE9XTihwb3MsIGNzKSkKKworCisKKy8qIE1vdmUgYnkgb25lIHBpeGVsIHJlbGF0aXZlbHkgdG8gY3VycmVudCBwb3NpdGlvbiB3aXRoIHdyYXBwaW5nIHdoZW4gdGhlIHBvc2l0aW9uICAgICAqLworLyogYWNoaWV2ZXMgaW1hZ2UgYm91bmRhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcG9zICAgIC0gcG9zaXRpb24gc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisvKiBsZWZ0ICovCisjZGVmaW5lIENWX01PVkVfTEVGVF9XUkFQKCBwb3MsIGNzICkgXAorICgocG9zKS5jdXJybGluZSArICggLS0ocG9zKS54ID49IDAgPyAocG9zKS54IDogKChwb3MpLnggPSAocG9zKS53aWR0aC0xKSkqKGNzKSkKKworLyogcmlnaHQgKi8KKyNkZWZpbmUgQ1ZfTU9WRV9SSUdIVF9XUkFQKCBwb3MsIGNzICkgXAorICgocG9zKS5jdXJybGluZSArICggKysocG9zKS54IDwgKHBvcykud2lkdGggPyAocG9zKS54IDogKChwb3MpLnggPSAwKSkqKGNzKSApCisKKy8qIHVwICovCisjZGVmaW5lIENWX01PVkVfVVBfV1JBUCggcG9zLCBjcyApIFwKKyAgICAoKCgocG9zKS5jdXJybGluZSAtPSAocG9zKS5zdGVwKSAhPSAocG9zKS50b3BsaW5lID8gXAorICAgIChwb3MpLmN1cnJsaW5lIDogKChwb3MpLmN1cnJsaW5lID0gKHBvcykuYm90dG9tbGluZSAtIChwb3MpLnN0ZXApKSArIChwb3MpLngqKGNzKSApCisKKy8qIGRvd24gKi8KKyNkZWZpbmUgQ1ZfTU9WRV9ET1dOX1dSQVAoIHBvcywgY3MgKSBcCisgICAgKCgoKHBvcykuY3VycmxpbmUgKz0gKHBvcykuc3RlcCkgIT0gKHBvcykuYm90dG9tbGluZSA/IFwKKyAgICAocG9zKS5jdXJybGluZSA6ICgocG9zKS5jdXJybGluZSA9IChwb3MpLnRvcGxpbmUgKyAocG9zKS5zdGVwKSkgKyAocG9zKS54KihjcykgKQorCisvKiBsZWZ0IHVwICovCisjZGVmaW5lIENWX01PVkVfTFVfV1JBUCggcG9zLCBjcyApICggQ1ZfTU9WRV9MRUZUX1dSQVAocG9zLCBjcyksIENWX01PVkVfVVBfV1JBUChwb3MsIGNzKSkKKy8qIHJpZ2h0IHVwICovCisjZGVmaW5lIENWX01PVkVfUlVfV1JBUCggcG9zLCBjcyApICggQ1ZfTU9WRV9SSUdIVF9XUkFQKHBvcywgY3MpLCBDVl9NT1ZFX1VQX1dSQVAocG9zLCBjcykpCisvKiBsZWZ0IGRvd24gKi8KKyNkZWZpbmUgQ1ZfTU9WRV9MRF9XUkFQKCBwb3MsIGNzICkgKCBDVl9NT1ZFX0xFRlRfV1JBUChwb3MsIGNzKSwgQ1ZfTU9WRV9ET1dOX1dSQVAocG9zLCBjcykpCisvKiByaWdodCBkb3duICovCisjZGVmaW5lIENWX01PVkVfUkRfV1JBUCggcG9zLCBjcyApICggQ1ZfTU9WRV9SSUdIVF9XUkFQKHBvcywgY3MpLCBDVl9NT1ZFX0RPV05fV1JBUChwb3MsIGNzKSkKKworLyogTnVtZXJpYyBjb25zdGFudHMgd2hpY2ggdXNlZCBmb3IgbW92aW5nIGluIGFyYml0cmFyeSBkaXJlY3Rpb24gICovCisjZGVmaW5lIENWX1NISUZUX05PTkUgICAyCisjZGVmaW5lIENWX1NISUZUX0xFRlQgICAxCisjZGVmaW5lIENWX1NISUZUX1JJR0hUICAzCisjZGVmaW5lIENWX1NISUZUX1VQICAgICA2CisjZGVmaW5lIENWX1NISUZUX0RPV04gIDEwCisjZGVmaW5lIENWX1NISUZUX0xVICAgICA1CisjZGVmaW5lIENWX1NISUZUX1JVICAgICA3CisjZGVmaW5lIENWX1NISUZUX0xEICAgICA5CisjZGVmaW5lIENWX1NISUZUX1JEICAgIDExCisKKy8qIE1vdmUgYnkgb25lIHBpeGVsIGluIHNwZWNpZmllZCBkaXJlY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwb3MgICAgLSBwb3NpdGlvbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBzaGlmdCAgLSBkaXJlY3Rpb24gKCBpdCdzIHZhbHVlIG11c3QgYmUgb25lIG9mIHRoZSBDVl9TSElGVF+FIGNvbnN0YW50cyApICovCisvKiAgY3MgICAgIC0gbnVtYmVyIG9mIHRoZSBpbWFnZSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENWX01PVkVfUEFSQU0oIHBvcywgc2hpZnQsIGNzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAocG9zKS5jdXJybGluZSArPSAocG9zKS5zdGVwX2Fyclsoc2hpZnQpPj4yXSwgKHBvcykueCArPSAoKHNoaWZ0KSYzKS0yLCAgICAgICBcCisgICAgKChwb3MpLmN1cnJsaW5lICE9IChwb3MpLnRvcGxpbmUgJiYgKHBvcykuY3VycmxpbmUgIT0gKHBvcykuYm90dG9tbGluZSAmJiAgICAgICBcCisgICAgKHBvcykueCA+PSAwICYmIChwb3MpLnggPCAocG9zKS53aWR0aCkgPyAocG9zKS5jdXJybGluZSArIChwb3MpLngqKGNzKSA6IDAgKQorCisvKiBNb3ZlIGJ5IG9uZSBwaXhlbCBpbiBzcGVjaWZpZWQgZGlyZWN0aW9uIHdpdGggd3JhcHBpbmcgd2hlbiB0aGUgICAgICAgICAgICAgICAqLworLyogcG9zaXRpb24gYWNoaWV2ZXMgaW1hZ2UgYm91bmRhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwb3MgICAgLSBwb3NpdGlvbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgc2hpZnQgIC0gZGlyZWN0aW9uICggaXQncyB2YWx1ZSBtdXN0IGJlIG9uZSBvZiB0aGUgQ1ZfU0hJRlRfhSBjb25zdGFudHMgKSAgKi8KKy8qICBjcyAgICAgLSBudW1iZXIgb2YgdGhlIGltYWdlIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIENWX01PVkVfUEFSQU1fV1JBUCggcG9zLCBzaGlmdCwgY3MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAocG9zKS5jdXJybGluZSArPSAocG9zKS5zdGVwX2Fyclsoc2hpZnQpPj4yXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuY3VycmxpbmUgPSAoKHBvcykuY3VycmxpbmUgPT0gKHBvcykudG9wbGluZSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuYm90dG9tbGluZSAtIChwb3MpLnN0ZXAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuY3VycmxpbmUgPT0gKHBvcykuYm90dG9tbGluZSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykudG9wbGluZSArIChwb3MpLnN0ZXAgOiAocG9zKS5jdXJybGluZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykueCArPSAoKHNoaWZ0KSYzKS0yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykueCA9ICgocG9zKS54IDwgMCA/IChwb3MpLndpZHRoLTEgOiAocG9zKS54ID49IChwb3MpLndpZHRoID8gMCA6IChwb3MpLngpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuY3VycmxpbmUgKyAocG9zKS54KihjcykgKQorCisjZW5kaWYvKl9DVkNPTVBBVF9IXyovCmRpZmYgLS1naXQgYS9jdi9pbmNsdWRlL2N2c3RyZWFtcy5oIGIvY3YvaW5jbHVkZS9jdnN0cmVhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmIyMDVkCi0tLSAvZGV2L251bGwKKysrIGIvY3YvaW5jbHVkZS9jdnN0cmVhbXMuaApAQCAtMCwwICsxLDkzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfQ1ZTVFJFQU1TX0hfCisjZGVmaW5lIF9DVlNUUkVBTVNfSF8KKworI2lmZGVmIFdJTjMyCisjaW5jbHVkZSA8c3RyZWFtcy5oPiAgLyogISEhIElGIFlPVSdWRSBHT1QgQU4gRVJST1IgSEVSRSwgUExFQVNFIFJFQUQgQkVMT1cgISEhICovCisvKioqKioqKioqKioqKioqKiogSG93IHRvIGdldCBWaXN1YWwgU3R1ZGlvIHVuZGVyc3RhbmQgc3RyZWFtcy5oICoqKioqKioqKioqKioqKipcCisKK1lvdSBuZWVkIERpcmVjdFNob3cgU0RLIHRoYXQgaXMgbm93IGEgcGFydCBvZiBQbGF0Zm9ybSBTREsKKyhXaW5kb3dzIFNlcnZlciAyMDAzIFNQMSBTREsgb3IgbGF0ZXIpLAorYW5kIERpcmVjdFggU0RLICgyMDA2IEFwcmlsIG9yIGxhdGVyKS4KKworMS4gRG93bmxvYWQgdGhlIFBsYXRmb3JtIFNESyBmcm9tCisgICBodHRwOi8vd3d3Lm1pY3Jvc29mdC5jb20vbXNkb3dubG9hZC9wbGF0Zm9ybXNkay9zZGt1cGRhdGUvCisgICBhbmQgRGlyZWN0WCBTREsgZnJvbSBtc2RuLm1pY3Jvc29mdC5jb20vZGlyZWN0eC8KKyAgIChUaGV5IGFyZSBodWdlLCBidXQgeW91IGNhbiBkb3dubG9hZCBpdCBieSBwYXJ0cykuCisgICBJZiBpdCBkb2Vzbid0IHdvcmsgZm9yIHlvdSwgY29uc2lkZXIgSGlnaEdVSSB0aGF0IGNhbiBjYXB0dXJlIHZpZGVvIHZpYSBWRlcgb3IgTUlMCisKKzIuIEluc3RhbGwgUGxhdGZvcm0gU0RLIHRvZ2V0aGVyIHdpdGggRGlyZWN0U2hvdyBTREsuCisgICBJbnN0YWxsIERpcmVjdFggKHdpdGggb3Igd2l0aG91dCBzYW1wbGUgY29kZSkuCisKKzMuIEJ1aWxkIGJhc2VjbGFzc2VzLgorICAgU2VlIDxQbGF0Zm9ybVNES0luc3RhbGxGb2xkZXI+XHNhbXBsZXNcbXVsdGltZWRpYVxkaXJlY3RzaG93XHJlYWRtZS50eHQuCisKKzQuIENvcHkgdGhlIGJ1aWx0IGxpYnJhcmllcyAoY2FsbGVkIHN0cm1iYXNlLmxpYiBhbmQgc3RybWJhc2QubGliCisgICBpbiBSZWxlYXNlIGFuZCBEZWJ1ZyB2ZXJzaW9ucywgcmVzcGVjdGl2ZWx5KSB0byAKKyAgIDxQbGF0Zm9ybVNES0luc3RhbGxGb2xkZXI+XGxpYi4KKworNS4gSW4gRGV2ZWxvcGVyIFN0dWRpbyBhZGQgdGhlIGZvbGxvd2luZyBwYXRoczoKKyAgICAgIDxEaXJlY3RYU0RLSW5zdGFsbEZvbGRlcj5caW5jbHVkZQorICAgICAgPFBsYXRmb3JtU0RLSW5zdGFsbEZvbGRlcj5caW5jbHVkZQorICAgICAgPFBsYXRmb3JtU0RLSW5zdGFsbEZvbGRlcj5cc2FtcGxlc1xtdWx0aW1lZGlhXGRpcmVjdHNob3dcYmFzZWNsYXNzZXMKKyAgICB0byB0aGUgaW5jbHVkZXMnIHNlYXJjaCBwYXRoCisgICAgKGF0IFRvb2xzLT5PcHRpb25zLT5EaXJlY3Rvcmllcy0+SW5jbHVkZSBmaWxlcyBpbiBjYXNlIG9mIFZpc3VhbCBTdHVkaW8gNi4wLAorICAgICBhdCBUb29scy0+T3B0aW9ucy0+UHJvamVjdHMgYW5kIFNvbHV0aW9ucy0+VkMrKyBEaXJlY3Rvcmllcy0+SW5jbHVkZSBmaWxlcyBpbiBjYXNlCisgICAgIG9mIFZpc3VhbCBTdHVkaW8gMjAwNSkKKyAgIEFkZAorICAgICAgPERpcmVjdFhTREtJbnN0YWxsRm9sZGVyPlxsaWIKKyAgICAgIDxQbGF0Zm9ybVNES0luc3RhbGxGb2xkZXI+XGxpYgorICAgdG8gdGhlIGxpYnJhcmllcycgc2VhcmNoIHBhdGggKGluIHRoZSBzYW1lIGRpYWxvZywgLi4uLT4iTGlicmFyeSBmaWxlcyIgcGFnZSkKKworICAgTk9URTogUFVUIFRIRSBBRERFRCBMSU5FUyBPTiBUSEUgVkVSWSBUT1AgT0YgVEhFIExJU1RTLCBPVEhFUldJU0UgWU9VIE1BWSBTVElMTCBHRVQKKyAgIENPTVBJTEVSIE9SIExJTktFUiBFUlJPUlMuIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIFZpc3VhbCBTdHVkaW8KKyAgIG1heSBpbmNsdWRlIG9sZGVyIHZlcnNpb25zIG9mIHRoZSBzYW1lIGhlYWRlcnMgYW5kIGxpYnJhcmllcy4gCisKKzYuIE5vdyB5b3UgY2FuIGJ1aWxkIE9wZW5DViBEaXJlY3RTaG93IGZpbHRlcnMuCisKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2VuZGlmCisKKyNlbmRpZiAvKl9DVlNUUkVBTVNfSF8qLworCmRpZmYgLS1naXQgYS9jdi9pbmNsdWRlL2N2dHlwZXMuaCBiL2N2L2luY2x1ZGUvY3Z0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NWNhZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9pbmNsdWRlL2N2dHlwZXMuaApAQCAtMCwwICsxLDM4NiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NWVFlQRVNfSF8KKyNkZWZpbmUgX0NWVFlQRVNfSF8KKworI2lmbmRlZiBTS0lQX0lOQ0xVREVTCisgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKKy8qIHNwYXRpYWwgYW5kIGNlbnRyYWwgbW9tZW50cyAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZNb21lbnRzCit7CisgICAgZG91YmxlICBtMDAsIG0xMCwgbTAxLCBtMjAsIG0xMSwgbTAyLCBtMzAsIG0yMSwgbTEyLCBtMDM7IC8qIHNwYXRpYWwgbW9tZW50cyAqLworICAgIGRvdWJsZSAgbXUyMCwgbXUxMSwgbXUwMiwgbXUzMCwgbXUyMSwgbXUxMiwgbXUwMzsgLyogY2VudHJhbCBtb21lbnRzICovCisgICAgZG91YmxlICBpbnZfc3FydF9tMDA7IC8qIG0wMCAhPSAwID8gMS9zcXJ0KG0wMCkgOiAwICovCit9CitDdk1vbWVudHM7CisKKy8qIEh1IGludmFyaWFudHMgKi8KK3R5cGVkZWYgc3RydWN0IEN2SHVNb21lbnRzCit7CisgICAgZG91YmxlIGh1MSwgaHUyLCBodTMsIGh1NCwgaHU1LCBodTYsIGh1NzsgLyogSHUgaW52YXJpYW50cyAqLworfQorQ3ZIdU1vbWVudHM7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvbm5lY3RlZCBDb21wb25lbnQgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBDdkNvbm5lY3RlZENvbXAKK3sKKyAgICBkb3VibGUgYXJlYTsgICAgLyogYXJlYSBvZiB0aGUgY29ubmVjdGVkIGNvbXBvbmVudCAgKi8KKyAgICBDdlNjYWxhciB2YWx1ZTsgLyogYXZlcmFnZSBjb2xvciBvZiB0aGUgY29ubmVjdGVkIGNvbXBvbmVudCAqLworICAgIEN2UmVjdCByZWN0OyAgICAvKiBST0kgb2YgdGhlIGNvbXBvbmVudCAgKi8KKyAgICBDdlNlcSogY29udG91cjsgLyogb3B0aW9uYWwgY29tcG9uZW50IGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgICAgICAgKHRoZSBjb250b3VyIG1pZ2h0IGhhdmUgY2hpbGQgY29udG91cnMgY29ycmVzcG9uZGluZyB0byB0aGUgaG9sZXMpKi8KK30KK0N2Q29ubmVjdGVkQ29tcDsKKworLyoKK0ludGVybmFsIHN0cnVjdHVyZSB0aGF0IGlzIHVzZWQgZm9yIHNlcXVlbnRhbCByZXRyaWV2aW5nIGNvbnRvdXJzIGZyb20gdGhlIGltYWdlLgorSXQgc3VwcG9ydHMgYm90aCBoaWVyYXJjaGljYWwgYW5kIHBsYW5lIHZhcmlhbnRzIG9mIFN1enVraSBhbGdvcml0aG0uCisqLwordHlwZWRlZiBzdHJ1Y3QgX0N2Q29udG91clNjYW5uZXIqIEN2Q29udG91clNjYW5uZXI7CisKKy8qIGNvbnRvdXIgcmV0cmlldmFsIG1vZGUgKi8KKyNkZWZpbmUgQ1ZfUkVUUl9FWFRFUk5BTCAwCisjZGVmaW5lIENWX1JFVFJfTElTVCAgICAgMQorI2RlZmluZSBDVl9SRVRSX0NDT01QICAgIDIKKyNkZWZpbmUgQ1ZfUkVUUl9UUkVFICAgICAzCisKKy8qIGNvbnRvdXIgYXBwcm94aW1hdGlvbiBtZXRob2QgKi8KKyNkZWZpbmUgQ1ZfQ0hBSU5fQ09ERSAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1ZfQ0hBSU5fQVBQUk9YX05PTkUgICAgICAgIDEKKyNkZWZpbmUgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSAgICAgIDIKKyNkZWZpbmUgQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfTDEgICAgIDMKKyNkZWZpbmUgQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfS0NPUyAgIDQKKyNkZWZpbmUgQ1ZfTElOS19SVU5TICAgICAgICAgICAgICAgIDUKKworLyogRnJlZW1hbiBjaGFpbiByZWFkZXIgc3RhdGUgKi8KK3R5cGVkZWYgc3RydWN0IEN2Q2hhaW5QdFJlYWRlcgoreworICAgIENWX1NFUV9SRUFERVJfRklFTERTKCkKKyAgICBjaGFyICAgICAgY29kZTsKKyAgICBDdlBvaW50ICAgcHQ7CisgICAgc2NoYXIgICAgIGRlbHRhc1s4XVsyXTsKK30KK0N2Q2hhaW5QdFJlYWRlcjsKKworLyogaW5pdGlhbGl6ZXMgOC1lbGVtZW50IGFycmF5IGZvciBmYXN0IGFjY2VzcyB0byAzeDMgbmVpZ2hib3Job29kIG9mIGEgcGl4ZWwgKi8KKyNkZWZpbmUgIENWX0lOSVRfM1gzX0RFTFRBUyggZGVsdGFzLCBzdGVwLCBuY2ggKSAgICAgICAgICAgIFwKKyAgICAoKGRlbHRhcylbMF0gPSAgKG5jaCksICAoZGVsdGFzKVsxXSA9IC0oc3RlcCkgKyAobmNoKSwgIFwKKyAgICAgKGRlbHRhcylbMl0gPSAtKHN0ZXApLCAoZGVsdGFzKVszXSA9IC0oc3RlcCkgLSAobmNoKSwgIFwKKyAgICAgKGRlbHRhcylbNF0gPSAtKG5jaCksICAoZGVsdGFzKVs1XSA9ICAoc3RlcCkgLSAobmNoKSwgIFwKKyAgICAgKGRlbHRhcylbNl0gPSAgKHN0ZXApLCAoZGVsdGFzKVs3XSA9ICAoc3RlcCkgKyAobmNoKSkKKworLyogQ29udG91ciB0cmVlIGhlYWRlciAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZDb250b3VyVHJlZQoreworICAgIENWX1NFUVVFTkNFX0ZJRUxEUygpCisgICAgQ3ZQb2ludCBwMTsgICAgICAgICAgICAvKiB0aGUgZmlyc3QgcG9pbnQgb2YgdGhlIGJpbmFyeSB0cmVlIHJvb3Qgc2VnbWVudCAqLworICAgIEN2UG9pbnQgcDI7ICAgICAgICAgICAgLyogdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGJpbmFyeSB0cmVlIHJvb3Qgc2VnbWVudCAqLworfQorQ3ZDb250b3VyVHJlZTsKKworLyogRmluZHMgYSBzZXF1ZW5jZSBvZiBjb252ZXhpdHkgZGVmZWN0cyBvZiBnaXZlbiBjb250b3VyICovCit0eXBlZGVmIHN0cnVjdCBDdkNvbnZleGl0eURlZmVjdAoreworICAgIEN2UG9pbnQqIHN0YXJ0OyAvKiBwb2ludCBvZiB0aGUgY29udG91ciB3aGVyZSB0aGUgZGVmZWN0IGJlZ2lucyAqLworICAgIEN2UG9pbnQqIGVuZDsgLyogcG9pbnQgb2YgdGhlIGNvbnRvdXIgd2hlcmUgdGhlIGRlZmVjdCBlbmRzICovCisgICAgQ3ZQb2ludCogZGVwdGhfcG9pbnQ7IC8qIHRoZSBmYXJ0aGVzdCBmcm9tIHRoZSBjb252ZXggaHVsbCBwb2ludCB3aXRoaW4gdGhlIGRlZmVjdCAqLworICAgIGZsb2F0IGRlcHRoOyAvKiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBmYXJ0aGVzdCBwb2ludCBhbmQgdGhlIGNvbnZleCBodWxsICovCit9CitDdkNvbnZleGl0eURlZmVjdDsKKworLyoqKioqKioqKioqKiBEYXRhIHN0cnVjdHVyZXMgYW5kIHJlbGF0ZWQgZW51bWVyYXRpb25zIGZvciBQbGFuYXIgU3ViZGl2aXNpb25zICoqKioqKioqKioqKi8KKwordHlwZWRlZiBzaXplX3QgQ3ZTdWJkaXYyREVkZ2U7CisKKyNkZWZpbmUgQ1ZfUVVBREVER0UyRF9GSUVMRFMoKSAgICAgXAorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IEN2U3ViZGl2MkRQb2ludCogcHRbNF07IFwKKyAgICBDdlN1YmRpdjJERWRnZSAgbmV4dFs0XTsKKworI2RlZmluZSBDVl9TVUJESVYyRF9QT0lOVF9GSUVMRFMoKVwKKyAgICBpbnQgICAgICAgICAgICBmbGFnczsgICAgICBcCisgICAgQ3ZTdWJkaXYyREVkZ2UgZmlyc3Q7ICAgICAgXAorICAgIEN2UG9pbnQyRDMyZiAgIHB0OworCisjZGVmaW5lIENWX1NVQkRJVjJEX1ZJUlRVQUxfUE9JTlRfRkxBRyAoMSA8PCAzMCkKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZRdWFkRWRnZTJECit7CisgICAgQ1ZfUVVBREVER0UyRF9GSUVMRFMoKQorfQorQ3ZRdWFkRWRnZTJEOworCit0eXBlZGVmIHN0cnVjdCBDdlN1YmRpdjJEUG9pbnQKK3sKKyAgICBDVl9TVUJESVYyRF9QT0lOVF9GSUVMRFMoKQorfQorQ3ZTdWJkaXYyRFBvaW50OworCisjZGVmaW5lIENWX1NVQkRJVjJEX0ZJRUxEUygpICAgIFwKKyAgICBDVl9HUkFQSF9GSUVMRFMoKSAgICAgICAgICAgXAorICAgIGludCAgcXVhZF9lZGdlczsgICAgICAgICAgICBcCisgICAgaW50ICBpc19nZW9tZXRyeV92YWxpZDsgICAgIFwKKyAgICBDdlN1YmRpdjJERWRnZSByZWNlbnRfZWRnZTsgXAorICAgIEN2UG9pbnQyRDMyZiAgdG9wbGVmdDsgICAgICBcCisgICAgQ3ZQb2ludDJEMzJmICBib3R0b21yaWdodDsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdWJkaXYyRAoreworICAgIENWX1NVQkRJVjJEX0ZJRUxEUygpCit9CitDdlN1YmRpdjJEOworCisKK3R5cGVkZWYgZW51bSBDdlN1YmRpdjJEUG9pbnRMb2NhdGlvbgoreworICAgIENWX1BUTE9DX0VSUk9SID0gLTIsCisgICAgQ1ZfUFRMT0NfT1VUU0lERV9SRUNUID0gLTEsCisgICAgQ1ZfUFRMT0NfSU5TSURFID0gMCwKKyAgICBDVl9QVExPQ19WRVJURVggPSAxLAorICAgIENWX1BUTE9DX09OX0VER0UgPSAyCit9CitDdlN1YmRpdjJEUG9pbnRMb2NhdGlvbjsKKwordHlwZWRlZiBlbnVtIEN2TmV4dEVkZ2VUeXBlCit7CisgICAgQ1ZfTkVYVF9BUk9VTkRfT1JHICAgPSAweDAwLAorICAgIENWX05FWFRfQVJPVU5EX0RTVCAgID0gMHgyMiwKKyAgICBDVl9QUkVWX0FST1VORF9PUkcgICA9IDB4MTEsCisgICAgQ1ZfUFJFVl9BUk9VTkRfRFNUICAgPSAweDMzLAorICAgIENWX05FWFRfQVJPVU5EX0xFRlQgID0gMHgxMywKKyAgICBDVl9ORVhUX0FST1VORF9SSUdIVCA9IDB4MzEsCisgICAgQ1ZfUFJFVl9BUk9VTkRfTEVGVCAgPSAweDIwLAorICAgIENWX1BSRVZfQVJPVU5EX1JJR0hUID0gMHgwMgorfQorQ3ZOZXh0RWRnZVR5cGU7CisKKy8qIGdldCB0aGUgbmV4dCBlZGdlIHdpdGggdGhlIHNhbWUgb3JpZ2luIHBvaW50IChjb3VudGVyd2lzZSkgKi8KKyNkZWZpbmUgIENWX1NVQkRJVjJEX05FWFRfRURHRSggZWRnZSApICAoKChDdlF1YWRFZGdlMkQqKSgoZWRnZSkgJiB+MykpLT5uZXh0WyhlZGdlKSYzXSkKKworCisvKiBEZWZpbmVzIGZvciBEaXN0YW5jZSBUcmFuc2Zvcm0gKi8KKyNkZWZpbmUgQ1ZfRElTVF9VU0VSICAgIC0xICAvKiBVc2VyIGRlZmluZWQgZGlzdGFuY2UgKi8KKyNkZWZpbmUgQ1ZfRElTVF9MMSAgICAgIDEgICAvKiBkaXN0YW5jZSA9IHx4MS14MnwgKyB8eTEteTJ8ICovCisjZGVmaW5lIENWX0RJU1RfTDIgICAgICAyICAgLyogdGhlIHNpbXBsZSBldWNsaWRlYW4gZGlzdGFuY2UgKi8KKyNkZWZpbmUgQ1ZfRElTVF9DICAgICAgIDMgICAvKiBkaXN0YW5jZSA9IG1heCh8eDEteDJ8LHx5MS15MnwpICovCisjZGVmaW5lIENWX0RJU1RfTDEyICAgICA0ICAgLyogTDEtTDIgbWV0cmljOiBkaXN0YW5jZSA9IDIoc3FydCgxK3gqeC8yKSAtIDEpKSAqLworI2RlZmluZSBDVl9ESVNUX0ZBSVIgICAgNSAgIC8qIGRpc3RhbmNlID0gY14yKHx4fC9jLWxvZygxK3x4fC9jKSksIGMgPSAxLjM5OTggKi8KKyNkZWZpbmUgQ1ZfRElTVF9XRUxTQ0ggIDYgICAvKiBkaXN0YW5jZSA9IGNeMi8yKDEtZXhwKC0oeC9jKV4yKSksIGMgPSAyLjk4NDYgKi8KKyNkZWZpbmUgQ1ZfRElTVF9IVUJFUiAgIDcgICAvKiBkaXN0YW5jZSA9IHx4fDxjID8geF4yLzIgOiBjKHx4fC1jLzIpLCBjPTEuMzQ1ICovCisKKworLyogRmlsdGVycyB1c2VkIGluIHB5cmFtaWQgZGVjb21wb3NpdGlvbiAqLwordHlwZWRlZiBlbnVtIEN2RmlsdGVyCit7CisgICAgQ1ZfR0FVU1NJQU5fNXg1ID0gNworfQorQ3ZGaWx0ZXI7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbGRlciBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBmbG9hdCogICBDdlZlY3QzMmY7Cit0eXBlZGVmIGZsb2F0KiAgIEN2TWF0cjMyZjsKK3R5cGVkZWYgZG91YmxlKiAgQ3ZWZWN0NjRkOwordHlwZWRlZiBkb3VibGUqICBDdk1hdHI2NGQ7CisKK3R5cGVkZWYgc3RydWN0IEN2TWF0cml4MworeworICAgIGZsb2F0IG1bM11bM107Cit9CitDdk1hdHJpeDM7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit0eXBlZGVmIGZsb2F0IChDVl9DREVDTCAqIEN2RGlzdGFuY2VGdW5jdGlvbikoIGNvbnN0IGZsb2F0KiBhLCBjb25zdCBmbG9hdCogYiwgdm9pZCogdXNlcl9wYXJhbSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDdkNvbkRlbnNhdGlvbgoreworICAgIGludCBNUDsKKyAgICBpbnQgRFA7CisgICAgZmxvYXQqIER5bmFtTWF0cjsgICAgICAgLyogTWF0cml4IG9mIHRoZSBsaW5lYXIgRHluYW1pY3Mgc3lzdGVtICAqLworICAgIGZsb2F0KiBTdGF0ZTsgICAgICAgICAgIC8qIFZlY3RvciBvZiBTdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgU2FtcGxlc051bTsgICAgICAgICAvKiBOdW1iZXIgb2YgdGhlIFNhbXBsZXMgICAgICAgICAgICAgICAgICovCisgICAgZmxvYXQqKiBmbFNhbXBsZXM7ICAgICAgLyogYXJyIG9mIHRoZSBTYW1wbGUgVmVjdG9ycyAgICAgICAgICAgICAqLworICAgIGZsb2F0KiogZmxOZXdTYW1wbGVzOyAgIC8qIHRlbXBvcmFyeSBhcnJheSBvZiB0aGUgU2FtcGxlIFZlY3RvcnMgKi8KKyAgICBmbG9hdCogZmxDb25maWRlbmNlOyAgICAvKiBDb25maWRlbmNlIGZvciBlYWNoIFNhbXBsZSAgICAgICAgICAgICovCisgICAgZmxvYXQqIGZsQ3VtdWxhdGl2ZTsgICAgLyogQ3VtdWxhdGl2ZSBjb25maWRlbmNlICAgICAgICAgICAgICAgICAqLworICAgIGZsb2F0KiBUZW1wOyAgICAgICAgICAgIC8qIFRlbXBvcmFyeSB2ZWN0b3IgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBmbG9hdCogUmFuZG9tU2FtcGxlOyAgICAvKiBSYW5kb21WZWN0b3IgdG8gdXBkYXRlIHNhbXBsZSBzZXQgICAgICovCisgICAgc3RydWN0IEN2UmFuZFN0YXRlKiBSYW5kUzsgLyogQXJyYXkgb2Ygc3RydWN0dXJlcyB0byBnZW5lcmF0ZSByYW5kb20gdmVjdG9ycyAqLworfQorQ3ZDb25EZW5zYXRpb247CisKKy8qCitzdGFuZGFyZCBLYWxtYW4gZmlsdGVyIChpbiBHLiBXZWxjaCcgYW5kIEcuIEJpc2hvcCdzIG5vdGF0aW9uKToKKworICB4KGspPUEqeChrLTEpK0IqdShrKSt3KGspICBwKHcpfk4oMCxRKQorICB6KGspPUgqeChrKSt2KGspLCAgIHAodil+TigwLFIpCisqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZLYWxtYW4KK3sKKyAgICBpbnQgTVA7ICAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG1lYXN1cmVtZW50IHZlY3RvciBkaW1lbnNpb25zICovCisgICAgaW50IERQOyAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBzdGF0ZSB2ZWN0b3IgZGltZW5zaW9ucyAqLworICAgIGludCBDUDsgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29udHJvbCB2ZWN0b3IgZGltZW5zaW9ucyAqLworCisgICAgLyogYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmaWVsZHMgKi8KKyNpZiAxCisgICAgZmxvYXQqIFBvc3RlclN0YXRlOyAgICAgICAgIC8qID1zdGF0ZV9wcmUtPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogUHJpb3JTdGF0ZTsgICAgICAgICAgLyogPXN0YXRlX3Bvc3QtPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogRHluYW1NYXRyOyAgICAgICAgICAgLyogPXRyYW5zaXRpb25fbWF0cml4LT5kYXRhLmZsICovCisgICAgZmxvYXQqIE1lYXN1cmVtZW50TWF0cjsgICAgIC8qID1tZWFzdXJlbWVudF9tYXRyaXgtPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogTU5Db3ZhcmlhbmNlOyAgICAgICAgLyogPW1lYXN1cmVtZW50X25vaXNlX2Nvdi0+ZGF0YS5mbCAqLworICAgIGZsb2F0KiBQTkNvdmFyaWFuY2U7ICAgICAgICAvKiA9cHJvY2Vzc19ub2lzZV9jb3YtPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogS2FsbUdhaW5NYXRyOyAgICAgICAgLyogPWdhaW4tPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogUHJpb3JFcnJvckNvdmFyaWFuY2U7LyogPWVycm9yX2Nvdl9wcmUtPmRhdGEuZmwgKi8KKyAgICBmbG9hdCogUG9zdGVyRXJyb3JDb3ZhcmlhbmNlOy8qID1lcnJvcl9jb3ZfcG9zdC0+ZGF0YS5mbCAqLworICAgIGZsb2F0KiBUZW1wMTsgICAgICAgICAgICAgICAvKiB0ZW1wMS0+ZGF0YS5mbCAqLworICAgIGZsb2F0KiBUZW1wMjsgICAgICAgICAgICAgICAvKiB0ZW1wMi0+ZGF0YS5mbCAqLworI2VuZGlmCisKKyAgICBDdk1hdCogc3RhdGVfcHJlOyAgICAgICAgICAgLyogcHJlZGljdGVkIHN0YXRlICh4JyhrKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4KGspPUEqeChrLTEpK0IqdShrKSAqLworICAgIEN2TWF0KiBzdGF0ZV9wb3N0OyAgICAgICAgICAvKiBjb3JyZWN0ZWQgc3RhdGUgKHgoaykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeChrKT14JyhrKStLKGspKih6KGspLUgqeCcoaykpICovCisgICAgQ3ZNYXQqIHRyYW5zaXRpb25fbWF0cml4OyAgIC8qIHN0YXRlIHRyYW5zaXRpb24gbWF0cml4IChBKSAqLworICAgIEN2TWF0KiBjb250cm9sX21hdHJpeDsgICAgICAvKiBjb250cm9sIG1hdHJpeCAoQikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGl0IGlzIG5vdCB1c2VkIGlmIHRoZXJlIGlzIG5vIGNvbnRyb2wpKi8KKyAgICBDdk1hdCogbWVhc3VyZW1lbnRfbWF0cml4OyAgLyogbWVhc3VyZW1lbnQgbWF0cml4IChIKSAqLworICAgIEN2TWF0KiBwcm9jZXNzX25vaXNlX2NvdjsgICAvKiBwcm9jZXNzIG5vaXNlIGNvdmFyaWFuY2UgbWF0cml4IChRKSAqLworICAgIEN2TWF0KiBtZWFzdXJlbWVudF9ub2lzZV9jb3Y7IC8qIG1lYXN1cmVtZW50IG5vaXNlIGNvdmFyaWFuY2UgbWF0cml4IChSKSAqLworICAgIEN2TWF0KiBlcnJvcl9jb3ZfcHJlOyAgICAgICAvKiBwcmlvcmkgZXJyb3IgZXN0aW1hdGUgY292YXJpYW5jZSBtYXRyaXggKFAnKGspKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAnKGspPUEqUChrLTEpKkF0ICsgUSkqLworICAgIEN2TWF0KiBnYWluOyAgICAgICAgICAgICAgICAvKiBLYWxtYW4gZ2FpbiBtYXRyaXggKEsoaykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSyhrKT1QJyhrKSpIdCppbnYoSCpQJyhrKSpIdCtSKSovCisgICAgQ3ZNYXQqIGVycm9yX2Nvdl9wb3N0OyAgICAgIC8qIHBvc3RlcmlvcmkgZXJyb3IgZXN0aW1hdGUgY292YXJpYW5jZSBtYXRyaXggKFAoaykpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUChrKT0oSS1LKGspKkgpKlAnKGspICovCisgICAgQ3ZNYXQqIHRlbXAxOyAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSBtYXRyaWNlcyAqLworICAgIEN2TWF0KiB0ZW1wMjsKKyAgICBDdk1hdCogdGVtcDM7CisgICAgQ3ZNYXQqIHRlbXA0OworICAgIEN2TWF0KiB0ZW1wNTsKK30KK0N2S2FsbWFuOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKiBIYWFyLWxpa2UgT2JqZWN0IERldGVjdGlvbiBzdHJ1Y3R1cmVzICoqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBDVl9IQUFSX01BR0lDX1ZBTCAgICAweDQyNTAwMDAwCisjZGVmaW5lIENWX1RZUEVfTkFNRV9IQUFSICAgICJvcGVuY3YtaGFhci1jbGFzc2lmaWVyIgorCisjZGVmaW5lIENWX0lTX0hBQVJfQ0xBU1NJRklFUiggaGFhciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKGhhYXIpICE9IE5VTEwgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoKGNvbnN0IEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKikoaGFhcikpLT5mbGFncyAmIENWX01BR0lDX01BU0spPT1DVl9IQUFSX01BR0lDX1ZBTCkKKworI2RlZmluZSBDVl9IQUFSX0ZFQVRVUkVfTUFYICAzCisKK3R5cGVkZWYgc3RydWN0IEN2SGFhckZlYXR1cmUKK3sKKyAgICBpbnQgIHRpbHRlZDsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIEN2UmVjdCByOworICAgICAgICBmbG9hdCB3ZWlnaHQ7CisgICAgfSByZWN0W0NWX0hBQVJfRkVBVFVSRV9NQVhdOworfQorQ3ZIYWFyRmVhdHVyZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZIYWFyQ2xhc3NpZmllcgoreworICAgIGludCBjb3VudDsKKyAgICBDdkhhYXJGZWF0dXJlKiBoYWFyX2ZlYXR1cmU7CisgICAgZmxvYXQqIHRocmVzaG9sZDsKKyAgICBpbnQqIGxlZnQ7CisgICAgaW50KiByaWdodDsKKyAgICBmbG9hdCogYWxwaGE7Cit9CitDdkhhYXJDbGFzc2lmaWVyOworCit0eXBlZGVmIHN0cnVjdCBDdkhhYXJTdGFnZUNsYXNzaWZpZXIKK3sKKyAgICBpbnQgIGNvdW50OworICAgIGZsb2F0IHRocmVzaG9sZDsKKyAgICBDdkhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyOworCisgICAgaW50IG5leHQ7CisgICAgaW50IGNoaWxkOworICAgIGludCBwYXJlbnQ7Cit9CitDdkhhYXJTdGFnZUNsYXNzaWZpZXI7CisKK3R5cGVkZWYgc3RydWN0IEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlOworCit0eXBlZGVmIHN0cnVjdCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZQoreworICAgIGludCAgZmxhZ3M7CisgICAgaW50ICBjb3VudDsKKyAgICBDdlNpemUgb3JpZ193aW5kb3dfc2l6ZTsKKyAgICBDdlNpemUgcmVhbF93aW5kb3dfc2l6ZTsKKyAgICBkb3VibGUgc2NhbGU7CisgICAgQ3ZIYWFyU3RhZ2VDbGFzc2lmaWVyKiBzdGFnZV9jbGFzc2lmaWVyOworICAgIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBoaWRfY2FzY2FkZTsKK30KK0N2SGFhckNsYXNzaWZpZXJDYXNjYWRlOworCit0eXBlZGVmIHN0cnVjdCBDdkF2Z0NvbXAKK3sKKyAgICBDdlJlY3QgcmVjdDsKKyAgICBpbnQgbmVpZ2hib3JzOworfQorQ3ZBdmdDb21wOworCitzdHJ1Y3QgQ3ZGZWF0dXJlVHJlZTsKKworI2VuZGlmIC8qX0NWVFlQRVNfSF8qLworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9fY3YuaCBiL2N2L3NyYy9fY3YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Njg3YmMzCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL19jdi5oCkBAIC0wLDAgKzEsMTE4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfQ1ZfSU5URVJOQUxfSF8KKyNkZWZpbmUgX0NWX0lOVEVSTkFMX0hfCisKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKyAgICAvKiBkaXNhYmxlIHdhcm5pbmdzIHJlbGF0ZWQgdG8gaW5saW5lIGZ1bmN0aW9ucyAqLworICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogNDcxMSA0NzEwIDQ1MTQgKQorI2VuZGlmCisKKyNpbmNsdWRlICJjdi5oIgorI2luY2x1ZGUgImN4bWlzYy5oIgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGZsb2F0Lmg+CisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1Y2hhcjsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OworCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgI2RlZmluZSAgICAgV0lOMzIKKyAgICAjZGVmaW5lICAgICBDVl9ETEwKKyAgICAjdW5kZWYgICAgICBfQ1ZfQUxXQVlTX1BST0ZJTEVfCisgICAgI2RlZmluZSAgICAgX0NWX0FMV0FZU19OT19QUk9GSUxFXworI2VuZGlmCisKKy8qIGhlbHBlciB0YWJsZXMgKi8KK2V4dGVybiBjb25zdCB1Y2hhciBpY3ZTYXR1cmF0ZTh1X2N2W107CisjZGVmaW5lIENWX0ZBU1RfQ0FTVF84VSh0KSAgKGFzc2VydCgtMjU2IDw9ICh0KSB8fCAodCkgPD0gNTEyKSwgaWN2U2F0dXJhdGU4dV9jdlsodCkrMjU2XSkKKyNkZWZpbmUgQ1ZfQ0FMQ19NSU5fOFUoYSxiKSAoYSkgLT0gQ1ZfRkFTVF9DQVNUXzhVKChhKSAtIChiKSkKKyNkZWZpbmUgQ1ZfQ0FMQ19NQVhfOFUoYSxiKSAoYSkgKz0gQ1ZfRkFTVF9DQVNUXzhVKChiKSAtIChhKSkKKworLy8gLTI1Ni5mIC4uLiA1MTEuZgorZXh0ZXJuIGNvbnN0IGZsb2F0IGljdjh4MzJmVGFiX2N2W107CisjZGVmaW5lIENWXzhUTzMyRih4KSAgaWN2OHgzMmZUYWJfY3ZbKHgpKzI1Nl0KKworLy8gKC0xMjguZileMiAuLi4gKDI1NS5mKV4yCitleHRlcm4gY29uc3QgZmxvYXQgaWN2OHgzMmZTcXJUYWJbXTsKKyNkZWZpbmUgQ1ZfOFRPMzJGX1NRUih4KSAgaWN2OHgzMmZTcXJUYWJbKHgpKzEyOF0KKworQ1ZfSU5MSU5FICBDdkRhdGFUeXBlIGljdkRlcHRoVG9EYXRhVHlwZSggaW50IHR5cGUgKTsKK0NWX0lOTElORSAgQ3ZEYXRhVHlwZSBpY3ZEZXB0aFRvRGF0YVR5cGUoIGludCB0eXBlICkKK3sKKyAgICByZXR1cm4gKEN2RGF0YVR5cGUpKAorICAgICAgICAgICAgKCgoKGludCljdjh1KXwoKGludCljdjhzIDw8IDQpfCgoaW50KWN2MTZ1IDw8IDgpfAorICAgICAgICAgICAgICAoKGludCljdjE2cyA8PCAxMil8KChpbnQpY3YzMnMgPDwgMTYpfCgoaW50KWN2MzJmIDw8IDIwKXwKKyAgICAgICAgICAgICAgKChpbnQpY3Y2NGYgPDwgMjQpKSA+PiBDVl9NQVRfREVQVEgodHlwZSkqNCkgJiAxNSk7Cit9CisKKyNkZWZpbmUgQ1ZfSElTVF9ERUZBVUxUX1RZUEUgQ1ZfMzJGCisKK0NWX0VYVEVSTl9DX0ZVTkNQVFIoIHZvaWQgKENWX0NERUNMICogQ3ZXcml0ZU5vZGVGdW5jdGlvbikodm9pZCogc2VxLHZvaWQqIG5vZGUpICkKKworI2RlZmluZSBfQ3ZDb252U3RhdGUgQ3ZGaWx0ZXJTdGF0ZQorCit0eXBlZGVmIHN0cnVjdCBDdlB5cmFtaWQKK3sKKyAgICB1Y2hhciAqKnB0cjsKKyAgICBDdlNpemUgKnN6OworICAgIGRvdWJsZSAqcmF0ZTsKKyAgICBpbnQgKnN0ZXA7CisgICAgdWNoYXIgKnN0YXRlOworICAgIGludCBsZXZlbDsKK30KK0N2UHlyYW1pZDsKKworI2luY2x1ZGUgIl9jdmlwcC5oIgorI2luY2x1ZGUgIl9jdm1hdHJpeC5oIgorI2luY2x1ZGUgIl9jdmdlb20uaCIKKyNpbmNsdWRlICJfY3ZpbWdwcm9jLmgiCisKKy8vIGRlZmF1bHQgZmFjZSBjYXNjYWRlCisvL2V4dGVybiBjb25zdCBjaGFyKiBpY3ZEZWZhdWx0RmFjZUNhc2NhZGVbXTsKKworI2VuZGlmIC8qX0NWX0lOVEVSTkFMX0hfKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9fY3ZnZW9tLmggYi9jdi9zcmMvX2N2Z2VvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyODQ5YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvX2N2Z2VvbS5oCkBAIC0wLDAgKzEsOTMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9DVl9HRU9NX0hfCisjZGVmaW5lIF9DVl9HRU9NX0hfCisKKy8qIEZpbmRzIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cyAqLworQ1ZfSU5MSU5FICBmbG9hdCAgaWN2RGlzdGFuY2VMMl8zMmYoIEN2UG9pbnQyRDMyZiBwdDEsIEN2UG9pbnQyRDMyZiBwdDIgKQoreworICAgIGZsb2F0IGR4ID0gcHQyLnggLSBwdDEueDsKKyAgICBmbG9hdCBkeSA9IHB0Mi55IC0gcHQxLnk7CisKKyAgICByZXR1cm4gY3ZTcXJ0KCBkeCpkeCArIGR5KmR5ICk7Cit9CisKKworaW50ICBpY3ZJbnRlcnNlY3RMaW5lcyggZG91YmxlIHgxLCBkb3VibGUgZHgxLCBkb3VibGUgeTEsIGRvdWJsZSBkeTEsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeDIsIGRvdWJsZSBkeDIsIGRvdWJsZSB5MiwgZG91YmxlIGR5MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogdDIgKTsKKworCit2b2lkIGljdkNyZWF0ZUNlbnRlck5vcm1hbExpbmUoIEN2U3ViZGl2MkRFZGdlIGVkZ2UsIGRvdWJsZSogYSwgZG91YmxlKiBiLCBkb3VibGUqIGMgKTsKKwordm9pZCBpY3ZJbnRlcnNlY3RMaW5lczMoIGRvdWJsZSogYTAsIGRvdWJsZSogYjAsIGRvdWJsZSogYzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhMSwgZG91YmxlKiBiMSwgZG91YmxlKiBjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHBvaW50ICk7CisKKworI2RlZmluZSBfQ1ZfQklOVFJFRV9MSVNUKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICBzdHJ1Y3QgX0N2VHJpYW5BdHRyKiBwcmV2X3Y7ICAgLyogcG9pbnRlciB0byB0aGUgcGFyZW50ICBlbGVtZW50IG9uIHRoZSBwcmV2aW91cyBsZXZlbCBvZiB0aGUgdHJlZSAgKi8gICAgXAorICAgc3RydWN0IF9DdlRyaWFuQXR0ciogbmV4dF92MTsgICAvKiBwb2ludGVyIHRvIHRoZSBjaGlsZCAgZWxlbWVudCBvbiB0aGUgbmV4dCBsZXZlbCBvZiB0aGUgdHJlZSAgKi8gICAgICAgIFwKKyAgIHN0cnVjdCBfQ3ZUcmlhbkF0dHIqIG5leHRfdjI7ICAgLyogcG9pbnRlciB0byB0aGUgY2hpbGQgIGVsZW1lbnQgb24gdGhlIG5leHQgbGV2ZWwgb2YgdGhlIHRyZWUgICovICAgICAgICAKKwordHlwZWRlZiBzdHJ1Y3QgX0N2VHJpYW5BdHRyCit7CisgICBDdlBvaW50IHB0OyAgICAvKiBDb29yZGluYXRlcyB4IGFuZCB5IG9mIHRoZSB2ZXJ0ZXggIHdoaWNoIGRvbid0IGxpZSBvbiB0aGUgYmFzZSBsaW5lIExNSUFUICAqLworICAgY2hhciBzaWduOyAgICAgICAgICAgICAvKiAgc2lnbiBvZiB0aGUgdHJpYW5nbGUgICAqLworICAgZG91YmxlIGFyZWE7ICAgICAgIC8qICAgYXJlYSBvZiB0aGUgdHJpYW5nbGUgICAgKi8KKyAgIGRvdWJsZSByMTsgICAvKiAgVGhlIHJhdGlvIG9mIHRoZSBoZWlnaHQgb2YgdHJpYW5nbGUgdG8gdGhlIGJhc2Ugb2YgdGhlIHRyaWFuZ2xlICAqLworICAgZG91YmxlIHIyOyAgLyogICBUaGUgcmF0aW8gb2YgdGhlIHByb2plY3Rpb24gb2YgdGhlIGxlZnQgc2lkZSBvZiB0aGUgdHJpYW5nbGUgb24gdGhlIGJhc2UgdG8gdGhlIGJhc2UgKi8KKyAgIF9DVl9CSU5UUkVFX0xJU1QoKSAgICAvKiBzdHJ1Y3R1cmUgZG91YmxlIGxpc3QgICAqLworfQorX0N2VHJpYW5BdHRyOworCisKKy8qIGN1cnZhdHVyZTogMCAtIDEtY3VydmF0dXJlLCAxIC0gay1jb3NpbmUgY3VydmF0dXJlLiAqLworQ3ZTdGF0dXMgIGljdkFwcHJveGltYXRlQ2hhaW5UQzg5KCBDdkNoYWluKiAgICAgIGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiAgIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QgKTsKKworI2VuZGlmIC8qX0lQQ1ZHRU9NX0hfKi8KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvX2N2aW1ncHJvYy5oIGIvY3Yvc3JjL19jdmltZ3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2NiODczCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL19jdmltZ3Byb2MuaApAQCAtMCwwICsxLDEyMyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NWX0lNR19QUk9DX0hfCisjZGVmaW5lIF9DVl9JTUdfUFJPQ19IXworCisjZGVmaW5lICBDVl9DT1BZKCBkc3QsIHNyYywgbGVuLCBpZHggKSBcCisgICAgZm9yKCAoaWR4KSA9IDA7IChpZHgpIDwgKGxlbik7IChpZHgpKyspIChkc3QpW2lkeF0gPSAoc3JjKVtpZHhdCisKKyNkZWZpbmUgIENWX1NFVCggZHN0LCB2YWwsIGxlbiwgaWR4ICkgIFwKKyAgICBmb3IoIChpZHgpID0gMDsgKGlkeCkgPCAobGVuKTsgKGlkeCkrKykgKGRzdClbaWR4XSA9ICh2YWwpCisKKy8qIHBlcmZvcm1zIGNvbnZvbHV0aW9uIG9mIDJkIGZsb2F0aW5nLXBvaW50IGFycmF5IHdpdGggM3gxLCAxeDMgb3Igc2VwYXJhYmxlIDN4MyBtYXNrICovCit2b2lkIGljdlNlcENvbnZTbWFsbDNfMzJmKCBmbG9hdCogc3JjLCBpbnQgc3JjX3N0ZXAsIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgIEN2U2l6ZSBzcmNfc2l6ZSwgY29uc3QgZmxvYXQqIGt4LCBjb25zdCBmbG9hdCoga3ksIGZsb2F0KiBidWZmZXIgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2U29iZWxGaXhlZElQUEZ1bmMpCisoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSByb2ksIGludCBhcGVydHVyZSApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZGaWx0ZXJGaXhlZElQUEZ1bmMpCisoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSByb2kgKTsKKworI3VuZGVmICAgQ1ZfQ0FMQ19NSU4KKyNkZWZpbmUgIENWX0NBTENfTUlOKGEsIGIpIGlmKChhKSA+IChiKSkgKGEpID0gKGIpCisKKyN1bmRlZiAgIENWX0NBTENfTUFYCisjZGVmaW5lICBDVl9DQUxDX01BWChhLCBiKSBpZigoYSkgPCAoYikpIChhKSA9IChiKQorCisjZGVmaW5lIENWX01PUlBIX0FMSUdOICA0CisKKyNkZWZpbmUgQ1ZfV0hPTEUgICAwCisjZGVmaW5lIENWX1NUQVJUICAgMQorI2RlZmluZSBDVl9FTkQgICAgIDIKKyNkZWZpbmUgQ1ZfTUlERExFICA0CisKK3ZvaWQKK2ljdkNyb3NzQ29yciggY29uc3QgQ3ZBcnIqIF9pbWcsIGNvbnN0IEN2QXJyKiBfdGVtcGwsCisgICAgICAgICAgICAgIEN2QXJyKiBfY29yciwgQ3ZQb2ludCBhbmNob3I9Y3ZQb2ludCgwLDApICk7CisKK0N2U3RhdHVzIENWX1NURENBTEwKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHUoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3Jjcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc3Ryb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdCwgaW50IHJpZ2h0LCBpbnQgY24sIGNvbnN0IHVjaGFyKiB2YWx1ZSA9IDAgKTsKKworQ3ZNYXQqIGljdklQUEZpbHRlckluaXQoIGNvbnN0IEN2TWF0KiBzcmMsIGludCBzdHJpcGVfc2l6ZSwgQ3ZTaXplIGtzaXplICk7CisKK2ludCBpY3ZJUFBGaWx0ZXJOZXh0U3RyaXBlKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogdGVtcCwgaW50IHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGtzaXplLCBDdlBvaW50IGFuY2hvciApOworCitpbnQgaWN2SVBQU2VwRmlsdGVyKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogZHN0LCBjb25zdCBDdk1hdCoga2VybmVsWCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBrZXJuZWxZLCBDdlBvaW50IGFuY2hvciApOworCisjZGVmaW5lIElDVl9XQVJQX1NISUZUICAgICAgICAgIDEwCisjZGVmaW5lIElDVl9XQVJQX01BU0sgICAgICAgICAgICgoMSA8PCBJQ1ZfV0FSUF9TSElGVCkgLSAxKQorCisjZGVmaW5lIElDVl9MSU5FQVJfVEFCX1NJWkUgICAgIChJQ1ZfV0FSUF9NQVNLKzEpCitleHRlcm4gZmxvYXQgaWN2TGluZWFyQ29lZmZzWyhJQ1ZfTElORUFSX1RBQl9TSVpFKzEpKjJdOwordm9pZCBpY3ZJbml0TGluZWFyQ29lZmZUYWIoKTsKKworI2RlZmluZSBJQ1ZfQ1VCSUNfVEFCX1NJWkUgICAoSUNWX1dBUlBfTUFTSysxKQorZXh0ZXJuIGZsb2F0IGljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUrMSkqMl07CisKK3ZvaWQgaWN2SW5pdEN1YmljQ29lZmZUYWIoKTsKKworQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZHZXRSZWN0U3ViUGl4Xzh1X0MxUgorKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwKKyAgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIEN2UG9pbnQyRDMyZiBjZW50ZXIgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2R2V0UmVjdFN1YlBpeF84dTMyZl9DMVIKKyggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLCBDdlNpemUgc3JjX3NpemUsCisgIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwgQ3ZTaXplIHdpbl9zaXplLCBDdlBvaW50MkQzMmYgY2VudGVyICk7CitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkdldFJlY3RTdWJQaXhfMzJmX0MxUgorKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwKKyAgZmxvYXQqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIEN2UG9pbnQyRDMyZiBjZW50ZXIgKTsKKworQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZHZXRRdWFkcmFuZ2xlU3ViUGl4Xzh1X0MxUgorKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwKKyAgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIGNvbnN0IGZsb2F0ICptYXRyaXggKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2R2V0UXVhZHJhbmdsZVN1YlBpeF84dTMyZl9DMVIKKyggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLCBDdlNpemUgc3JjX3NpemUsCisgIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwgQ3ZTaXplIHdpbl9zaXplLCBjb25zdCBmbG9hdCAqbWF0cml4ICk7CitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkdldFF1YWRyYW5nbGVTdWJQaXhfMzJmX0MxUgorKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwKKyAgZmxvYXQqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIGNvbnN0IGZsb2F0ICptYXRyaXggKTsKKworI2VuZGlmIC8qX0NWX0lOVEVSTkFMX0hfKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9fY3ZpcHAuaCBiL2N2L3NyYy9fY3ZpcHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZkMWM2Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL19jdmlwcC5oCkBAIC0wLDAgKzEsNzU5IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfQ1ZfSVBQX0hfCisjZGVmaW5lIF9DVl9JUFBfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0aW5nIEJvcmRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElQQ1ZfQ09QWV9CT1JERVIoIGJvcmRlcnR5cGUsIGZsYXZvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q29weSMjYm9yZGVydHlwZSMjQm9yZGVyXyMjZmxhdm9yIyNSLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlDb3B5IiAjYm9yZGVydHlwZSAiQm9yZGVyXyIgI2ZsYXZvciAiUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICBcCisgICAgKCBjb25zdCB2b2lkKiBwU3JjLCAgaW50IHNyY1N0ZXAsIEN2U2l6ZSBzcmNSb2lTaXplLCB2b2lkKiBwRHN0LCAgaW50IGRzdFN0ZXAsICBcCisgICAgICBDdlNpemUgZHN0Um9pU2l6ZSwgaW50IHRvcEJvcmRlckhlaWdodCwgaW50IGxlZnRCb3JkZXJXaWR0aCApKSAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q29weSMjYm9yZGVydHlwZSMjQm9yZGVyXyMjZmxhdm9yIyNJUiwgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlDb3B5IiAjYm9yZGVydHlwZSAiQm9yZGVyXyIgI2ZsYXZvciAiSVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICBcCisgICAgKCBjb25zdCB2b2lkKiBwU3JjLCAgaW50IHNyY0RzdFN0ZXAsIEN2U2l6ZSBzcmNSb2lTaXplLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDdlNpemUgZHN0Um9pU2l6ZSwgaW50IHRvcEJvcmRlckhlaWdodCwgaW50IGxlZnRCb3JkZXJXaWR0aCApKQorCitJUENWX0NPUFlfQk9SREVSKCBSZXBsaWNhdGUsIDh1X0MxICkKK0lQQ1ZfQ09QWV9CT1JERVIoIFJlcGxpY2F0ZSwgMTZzX0MxICkKK0lQQ1ZfQ09QWV9CT1JERVIoIFJlcGxpY2F0ZSwgOHVfQzMgKQorSVBDVl9DT1BZX0JPUkRFUiggUmVwbGljYXRlLCAzMnNfQzEgKQorSVBDVl9DT1BZX0JPUkRFUiggUmVwbGljYXRlLCAxNnNfQzMgKQorSVBDVl9DT1BZX0JPUkRFUiggUmVwbGljYXRlLCAxNnNfQzQgKQorSVBDVl9DT1BZX0JPUkRFUiggUmVwbGljYXRlLCAzMnNfQzMgKQorSVBDVl9DT1BZX0JPUkRFUiggUmVwbGljYXRlLCAzMnNfQzQgKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9tZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDVl9NT01FTlRTKCBzdWZmaXgsIGlwcF9zdWZmaXgsIGNuICkgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1vbWVudHMjI3N1ZmZpeCMjX0MjI2NuIyNSLCAgICAgICAgICAgICAgICBcCisiaXBwaU1vbWVudHMiICNpcHBfc3VmZml4ICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLFwKKyggY29uc3Qgdm9pZCogaW1nLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsIHZvaWQqIG1vbWVudHN0YXRlICkpCisKK0lQQ1ZfTU9NRU5UUyggXzh1LCA2NGZfOHUsIDEgKQorSVBDVl9NT01FTlRTKCBfMzJmLCA2NGZfMzJmLCAxICkKKworI3VuZGVmIElQQ1ZfTU9NRU5UUworCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TW9tZW50SW5pdEFsbG9jXzY0ZiwKKyAgICAgICAgICAgICJpcHBpTW9tZW50SW5pdEFsbG9jXzY0ZiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwKKyAgICAgICAgICAgICh2b2lkKiogbW9tZW50c3RhdGUsIEN2SGludEFsZ29yaXRobSBoaW50ICkpCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZNb21lbnRGcmVlXzY0ZiwKKyAgICAgICAgICAgICJpcHBpTW9tZW50RnJlZV82NGYiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksCisgICAgICAgICAgICAodm9pZCogbW9tZW50c3RhdGUgKSkKKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkdldFNwYXRpYWxNb21lbnRfNjRmLAorICAgICAgICAgICAgImlwcGlHZXRTcGF0aWFsTW9tZW50XzY0ZiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwKKyAgICAgICAgICAgIChjb25zdCB2b2lkKiBtb21lbnRzdGF0ZSwgaW50IG1PcmQsIGludCBuT3JkLAorICAgICAgICAgICAgIGludCBuQ2hhbm5lbCwgQ3ZQb2ludCByb2lPZmZzZXQsIGRvdWJsZSogdmFsdWUgKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tncm91bmQgZGlmZmVyZW5jaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBBY2N1bXVsYXRpb24gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJUENWX0FDQ1VNKCBmbGF2b3IsIGFycnR5cGUsIGFjY3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZF8jI2ZsYXZvciMjX0MxSVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkXyIgI2ZsYXZvciAiX0MxSVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFNxdWFyZV8jI2ZsYXZvciMjX0MxSVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkU3F1YXJlXyIgI2ZsYXZvciAiX0MxSVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFByb2R1Y3RfIyNmbGF2b3IjI19DMUlSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkUHJvZHVjdF8iICNmbGF2b3IgIl9DMUlSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3Jjc3RlcDIsICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFdlaWdodGVkXyMjZmxhdm9yIyNfQzFJUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkV2VpZ2h0ZWRfIiAjZmxhdm9yICJfQzFJUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ3ZTaXplIHNpemUsIGFjY3R5cGUgYWxwaGEgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZF8jI2ZsYXZvciMjX0MxSU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkXyIgI2ZsYXZvciAiX0MxSU1SIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFNxdWFyZV8jI2ZsYXZvciMjX0MxSU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkU3F1YXJlXyIgI2ZsYXZvciAiX0MxSU1SIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFByb2R1Y3RfIyNmbGF2b3IjI19DMUlNUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkUHJvZHVjdF8iICNmbGF2b3IgIl9DMUlNUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3Jjc3RlcDIsICAgICAgICAgXAorICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFdlaWdodGVkXyMjZmxhdm9yIyNfQzFJTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkV2VpZ2h0ZWRfIiAjZmxhdm9yICJfQzFJTVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGFjY3R5cGUgYWxwaGEgKSkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZF8jI2ZsYXZvciMjX0MzSU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkXyIgI2ZsYXZvciAiX0MzSU1SIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFNxdWFyZV8jI2ZsYXZvciMjX0MzSU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkU3F1YXJlXyIgI2ZsYXZvciAiX0MzSU1SIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFByb2R1Y3RfIyNmbGF2b3IjI19DM0lNUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkUHJvZHVjdF8iICNmbGF2b3IgIl9DM0lNUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3Jjc3RlcDIsICAgICAgICAgXAorICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkFkZFdlaWdodGVkXyMjZmxhdm9yIyNfQzNJTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQWRkV2VpZ2h0ZWRfIiAjZmxhdm9yICJfQzNJTVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgXAorICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGFjY3R5cGUgYWxwaGEgKSkKKworSVBDVl9BQ0NVTSggOHUzMmYsIHVjaGFyLCBmbG9hdCApCitJUENWX0FDQ1VNKCAzMmYsIGZsb2F0LCBmbG9hdCApCisKKyN1bmRlZiBJUENWX0FDQ1VNCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5cmFtaWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdlB5ckRvd25HZXRCdWZTaXplX0dhdXNzNXg1LAorICAgICAgICAgICAiaXBwaVB5ckRvd25HZXRCdWZTaXplX0dhdXNzNXg1IiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAgICAgICAgICggaW50IHJvaVdpZHRoLCBDdkRhdGFUeXBlIGRhdGFUeXBlLCBpbnQgY2hhbm5lbHMsIGludCogYnVmU2l6ZSApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2UHlyVXBHZXRCdWZTaXplX0dhdXNzNXg1LAorICAgICAgICAgICAiaXBwaVB5clVwR2V0QnVmU2l6ZV9HYXVzczV4NSIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIGludCByb2lXaWR0aCwgQ3ZEYXRhVHlwZSBkYXRhVHlwZSwgaW50IGNoYW5uZWxzLCBpbnQqIGJ1ZlNpemUgKSkKKworI2RlZmluZSBJQ1ZfUFlSRE9XTiggZmxhdm9yLCBjbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZQeXJEb3duX0dhdXNzNXg1XyMjZmxhdm9yIyNfQyMjY24jI1IsICAgICAgICAgICAgICBcCisiaXBwaVB5ckRvd25fR2F1c3M1eDVfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgXAorKCBjb25zdCB2b2lkKiBwU3JjLCBpbnQgc3JjU3RlcCwgdm9pZCogcERzdCwgaW50IGRzdFN0ZXAsICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHJvaVNpemUsIHZvaWQqIHBCdWZmZXIgKSkKKworI2RlZmluZSBJQ1ZfUFlSVVAoIGZsYXZvciwgY24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZQeXJVcF9HYXVzczV4NV8jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgICAgICAgICAgICBcCisiaXBwaVB5clVwX0dhdXNzNXg1XyIgI2ZsYXZvciAiX0MiICNjbiAiUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICAgXAorKCBjb25zdCB2b2lkKiBwU3JjLCBpbnQgc3JjU3RlcCwgdm9pZCogcERzdCwgaW50IGRzdFN0ZXAsICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHJvaVNpemUsIHZvaWQqIHBCdWZmZXIgKSkKKworSUNWX1BZUkRPV04oIDh1LCAxICkKK0lDVl9QWVJET1dOKCA4dSwgMyApCitJQ1ZfUFlSRE9XTiggMzJmLCAxICkKK0lDVl9QWVJET1dOKCAzMmYsIDMgKQorCitJQ1ZfUFlSVVAoIDh1LCAxICkKK0lDVl9QWVJVUCggOHUsIDMgKQorSUNWX1BZUlVQKCAzMmYsIDEgKQorSUNWX1BZUlVQKCAzMmYsIDMgKQorCisjdW5kZWYgSUNWX1BZUkRPV04KKyN1bmRlZiBJQ1ZfUFlSVVAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW9tZXRyaWMgVHJhbnNmb3JtYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElQQ1ZfUkVTSVpFKCBmbGF2b3IsIGNuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdlJlc2l6ZV8jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpUmVzaXplXyIgI2ZsYXZvciAiX0MiICNjbiAiUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSxcCisgICAgICAgICAgIChjb25zdCB2b2lkKiBzcmMsIEN2U2l6ZSBzcmNzaXplLCBpbnQgc3Jjc3RlcCwgQ3ZSZWN0IHNyY3JvaSwgICAgXAorICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzdHJvaSwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSB4ZmFjdG9yLCBkb3VibGUgeWZhY3RvciwgaW50IGludGVycG9sYXRpb24gKSkKKworSVBDVl9SRVNJWkUoIDh1LCAxICkKK0lQQ1ZfUkVTSVpFKCA4dSwgMyApCitJUENWX1JFU0laRSggOHUsIDQgKQorCitJUENWX1JFU0laRSggMTZ1LCAxICkKK0lQQ1ZfUkVTSVpFKCAxNnUsIDMgKQorSVBDVl9SRVNJWkUoIDE2dSwgNCApCisKK0lQQ1ZfUkVTSVpFKCAzMmYsIDEgKQorSVBDVl9SRVNJWkUoIDMyZiwgMyApCitJUENWX1JFU0laRSggMzJmLCA0ICkKKworI3VuZGVmIElQQ1ZfUkVTSVpFCisKKyNkZWZpbmUgSVBDVl9XQVJQQUZGSU5FX0JBQ0soIGZsYXZvciwgY24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2V2FycEFmZmluZUJhY2tfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgXAorICAgICJpcHBpV2FycEFmZmluZUJhY2tfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLFwKKyAgICAoY29uc3Qgdm9pZCogc3JjLCBDdlNpemUgc3Jjc2l6ZSwgaW50IHNyY3N0ZXAsIEN2UmVjdCBzcmNyb2ksICAgICAgICAgICBcCisgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZSZWN0IGRzdHJvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSogY29lZmZzLCBpbnQgaW50ZXJwb2xhdGUgKSkKKworSVBDVl9XQVJQQUZGSU5FX0JBQ0soIDh1LCAxICkKK0lQQ1ZfV0FSUEFGRklORV9CQUNLKCA4dSwgMyApCitJUENWX1dBUlBBRkZJTkVfQkFDSyggOHUsIDQgKQorCitJUENWX1dBUlBBRkZJTkVfQkFDSyggMzJmLCAxICkKK0lQQ1ZfV0FSUEFGRklORV9CQUNLKCAzMmYsIDMgKQorSVBDVl9XQVJQQUZGSU5FX0JBQ0soIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX1dBUlBBRkZJTkVfQkFDSworCisjZGVmaW5lIElQQ1ZfV0FSUFBFUlNQRUNUSVZFX0JBQ0soIGZsYXZvciwgY24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgIFwKKyAgICAiaXBwaVdhcnBQZXJzcGVjdGl2ZUJhY2tfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLFwKKyAgICAoY29uc3Qgdm9pZCogc3JjLCBDdlNpemUgc3Jjc2l6ZSwgaW50IHNyY3N0ZXAsIEN2UmVjdCBzcmNyb2ksICAgICAgICAgICBcCisgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZSZWN0IGRzdHJvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSogY29lZmZzLCBpbnQgaW50ZXJwb2xhdGUgKSkKKworSVBDVl9XQVJQUEVSU1BFQ1RJVkVfQkFDSyggOHUsIDEgKQorSVBDVl9XQVJQUEVSU1BFQ1RJVkVfQkFDSyggOHUsIDMgKQorSVBDVl9XQVJQUEVSU1BFQ1RJVkVfQkFDSyggOHUsIDQgKQorCitJUENWX1dBUlBQRVJTUEVDVElWRV9CQUNLKCAzMmYsIDEgKQorSVBDVl9XQVJQUEVSU1BFQ1RJVkVfQkFDSyggMzJmLCAzICkKK0lQQ1ZfV0FSUFBFUlNQRUNUSVZFX0JBQ0soIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX1dBUlBQRVJTUEVDVElWRV9CQUNLCisKKworI2RlZmluZSBJUENWX1dBUlBQRVJTUEVDVElWRSggZmxhdm9yLCBjbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZXYXJwUGVyc3BlY3RpdmVfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICBcCisgICAgImlwcGlXYXJwUGVyc3BlY3RpdmVfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLFwKKyAgICAoY29uc3Qgdm9pZCogc3JjLCBDdlNpemUgc3Jjc2l6ZSwgaW50IHNyY3N0ZXAsIEN2UmVjdCBzcmNyb2ksICAgICAgICAgICBcCisgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZSZWN0IGRzdHJvaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGRvdWJsZSogY29lZmZzLCBpbnQgaW50ZXJwb2xhdGUgKSkKKworSVBDVl9XQVJQUEVSU1BFQ1RJVkUoIDh1LCAxICkKK0lQQ1ZfV0FSUFBFUlNQRUNUSVZFKCA4dSwgMyApCitJUENWX1dBUlBQRVJTUEVDVElWRSggOHUsIDQgKQorCitJUENWX1dBUlBQRVJTUEVDVElWRSggMzJmLCAxICkKK0lQQ1ZfV0FSUFBFUlNQRUNUSVZFKCAzMmYsIDMgKQorSVBDVl9XQVJQUEVSU1BFQ1RJVkUoIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX1dBUlBQRVJTUEVDVElWRQorCisjZGVmaW5lIElQQ1ZfUkVNQVAoIGZsYXZvciwgY24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2UmVtYXBfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlSZW1hcF8iICNmbGF2b3IgIl9DIiAjY24gIlIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICBcCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIEN2U2l6ZSBzcmNzaXplLCBpbnQgc3Jjc3RlcCwgQ3ZSZWN0IHNyY3JvaSwgICAgICBcCisgICAgICBjb25zdCBmbG9hdCogeG1hcCwgaW50IHhtYXBzdGVwLCBjb25zdCBmbG9hdCogeW1hcCwgaW50IHltYXBzdGVwLCBcCisgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHN0c2l6ZSwgaW50IGludGVycG9sYXRpb24gKSkgCisKK0lQQ1ZfUkVNQVAoIDh1LCAxICkKK0lQQ1ZfUkVNQVAoIDh1LCAzICkKK0lQQ1ZfUkVNQVAoIDh1LCA0ICkKKworSVBDVl9SRU1BUCggMzJmLCAxICkKK0lQQ1ZfUkVNQVAoIDMyZiwgMyApCitJUENWX1JFTUFQKCAzMmYsIDQgKQorCisjdW5kZWYgSVBDVl9SRU1BUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vcnBob2xvZ3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDVl9NT1JQSE9MT0dZKCBtaW5tYXh0eXBlLCBtb3JwaHR5cGUsIGZsYXZvciwgY24gKSAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdiMjbW9ycGh0eXBlIyNSZWN0XyMjZmxhdm9yIyNfQyMjY24jI1IsICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlGaWx0ZXIiICNtaW5tYXh0eXBlICJCb3JkZXJSZXBsaWNhdGVfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgICAgICAgICAgIFwKKyAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgICAgXAorICAgIGludCBkc3RzdGVwLCBDdlNpemUgcm9pLCBDdlNpemUgZXNpemUsIEN2UG9pbnQgYW5jaG9yLCB2b2lkKiBidWZmZXIgKSkgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2IyNtb3JwaHR5cGUjI1JlY3RfR2V0QnVmU2l6ZV8jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgIFwKKyAgICAiaXBwaUZpbHRlciIgI21pbm1heHR5cGUgIkdldEJ1ZmZlclNpemVfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgICAgICAgICAgICAgXAorICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICggaW50IHdpZHRoLCBDdlNpemUgZXNpemUsIGludCogYnVmc2l6ZSApKSAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3YjI21vcnBodHlwZSMjXyMjZmxhdm9yIyNfQyMjY24jI1IsICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpIiAjbW9ycGh0eXBlICJCb3JkZXJSZXBsaWNhdGVfIiAjZmxhdm9yICJfQyIgI2NuICJSIiwgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCAgICAgICAgICAgICAgIFwKKyAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgcm9pLCBpbnQgYm9yZGVydHlwZSwgdm9pZCogbW9ycGhzdGF0ZSApKQorCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDh1LCAxICkKK0lQQ1ZfTU9SUEhPTE9HWSggTWluLCBFcm9kZSwgOHUsIDMgKQorSVBDVl9NT1JQSE9MT0dZKCBNaW4sIEVyb2RlLCA4dSwgNCApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDE2dSwgMSApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDE2dSwgMyApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDE2dSwgNCApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDMyZiwgMSApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDMyZiwgMyApCitJUENWX01PUlBIT0xPR1koIE1pbiwgRXJvZGUsIDMyZiwgNCApCitJUENWX01PUlBIT0xPR1koIE1heCwgRGlsYXRlLCA4dSwgMSApCitJUENWX01PUlBIT0xPR1koIE1heCwgRGlsYXRlLCA4dSwgMyApCitJUENWX01PUlBIT0xPR1koIE1heCwgRGlsYXRlLCA4dSwgNCApCitJUENWX01PUlBIT0xPR1koIE1heCwgRGlsYXRlLCAxNnUsIDEgKQorSVBDVl9NT1JQSE9MT0dZKCBNYXgsIERpbGF0ZSwgMTZ1LCAzICkKK0lQQ1ZfTU9SUEhPTE9HWSggTWF4LCBEaWxhdGUsIDE2dSwgNCApCitJUENWX01PUlBIT0xPR1koIE1heCwgRGlsYXRlLCAzMmYsIDEgKQorSVBDVl9NT1JQSE9MT0dZKCBNYXgsIERpbGF0ZSwgMzJmLCAzICkKK0lQQ1ZfTU9SUEhPTE9HWSggTWF4LCBEaWxhdGUsIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX01PUlBIT0xPR1kKKworI2RlZmluZSBJUENWX01PUlBIT0xPR1lfSU5JVF9BTExPQyggZmxhdm9yLCBjbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZNb3JwaEluaXRBbGxvY18jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgICAgICAgICAgICBcCisgICAgImlwcGlNb3JwaG9sb2d5SW5pdEFsbG9jXyIgI2ZsYXZvciAiX0MiICNjbiAiUiIsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICggaW50IHdpZHRoLCBjb25zdCB1Y2hhciogZWxlbWVudCwgICAgICAgIFwKKyAgICBDdlNpemUgZXNpemUsIEN2UG9pbnQgYW5jaG9yLCB2b2lkKiogbW9ycGhzdGF0ZSApKQorCitJUENWX01PUlBIT0xPR1lfSU5JVF9BTExPQyggOHUsIDEgKQorSVBDVl9NT1JQSE9MT0dZX0lOSVRfQUxMT0MoIDh1LCAzICkKK0lQQ1ZfTU9SUEhPTE9HWV9JTklUX0FMTE9DKCA4dSwgNCApCitJUENWX01PUlBIT0xPR1lfSU5JVF9BTExPQyggMTZ1LCAxICkKK0lQQ1ZfTU9SUEhPTE9HWV9JTklUX0FMTE9DKCAxNnUsIDMgKQorSVBDVl9NT1JQSE9MT0dZX0lOSVRfQUxMT0MoIDE2dSwgNCApCitJUENWX01PUlBIT0xPR1lfSU5JVF9BTExPQyggMzJmLCAxICkKK0lQQ1ZfTU9SUEhPTE9HWV9JTklUX0FMTE9DKCAzMmYsIDMgKQorSVBDVl9NT1JQSE9MT0dZX0lOSVRfQUxMT0MoIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX01PUlBIT0xPR1lfSU5JVF9BTExPQworCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TW9ycGhGcmVlLCAiaXBwaU1vcnBob2xvZ3lGcmVlIiwKKyAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAoIHZvaWQqIG1vcnBoc3RhdGUgKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbW9vdGhpbmcgRmlsdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDVl9GSUxURVJfTUVESUFOKCBmbGF2b3IsIGNuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZGaWx0ZXJNZWRpYW5fIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpRmlsdGVyTWVkaWFuXyIgI2ZsYXZvciAiX0MiICNjbiAiUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgIFwKKyAgICAgICAgICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgQ3ZTaXplIHJvaSwgQ3ZTaXplIGtzaXplLCBDdlBvaW50IGFuY2hvciApKQorCitJUENWX0ZJTFRFUl9NRURJQU4oIDh1LCAxICkKK0lQQ1ZfRklMVEVSX01FRElBTiggOHUsIDMgKQorSVBDVl9GSUxURVJfTUVESUFOKCA4dSwgNCApCisKKyNkZWZpbmUgSVBDVl9GSUxURVJfQk9YKCBmbGF2b3IsIGNuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZGaWx0ZXJCb3hfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpRmlsdGVyQm94XyIgI2ZsYXZvciAiX0MiICNjbiAiUiIsIDAvKkNWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSovLFwKKyAgICAgICAgICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgQ3ZTaXplIHJvaSwgQ3ZTaXplIGtzaXplLCBDdlBvaW50IGFuY2hvciApKQorCitJUENWX0ZJTFRFUl9CT1goIDh1LCAxICkKK0lQQ1ZfRklMVEVSX0JPWCggOHUsIDMgKQorSVBDVl9GSUxURVJfQk9YKCA4dSwgNCApCitJUENWX0ZJTFRFUl9CT1goIDMyZiwgMSApCitJUENWX0ZJTFRFUl9CT1goIDMyZiwgMyApCitJUENWX0ZJTFRFUl9CT1goIDMyZiwgNCApCisKKyN1bmRlZiBJUENWX0ZJTFRFUl9CT1gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVyaXZhdGl2ZSBGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElQQ1ZfRklMVEVSX1NPQkVMX0JPUkRFUiggc3VmZml4LCBmbGF2b3IsIHNyY3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkZpbHRlclNvYmVsIyNzdWZmaXgjI0dldEJ1ZlNpemVfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaUZpbHRlclNvYmVsIiAjc3VmZml4ICJHZXRCdWZmZXJTaXplXyIgI2ZsYXZvciAiX0MxUiIsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgKCBDdlNpemUgcm9pLCBpbnQgbWFza3NpemUsIGludCogYnVmZmVyc2l6ZSApKSAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkZpbHRlclNvYmVsIyNzdWZmaXgjI0JvcmRlcl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaUZpbHRlclNvYmVsIiAjc3VmZml4ICJCb3JkZXJfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICBcCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgcm9pLCBpbnQgbWFza3NpemUsICAgXAorICAgICAgaW50IGJvcmRlcnR5cGUsIHNyY3R5cGUgYm9yZGVydmFsdWUsIHZvaWQqIGJ1ZmZlciApKQorCitJUENWX0ZJTFRFUl9TT0JFTF9CT1JERVIoIE5lZ1ZlcnQsIDh1MTZzLCB1Y2hhciApCitJUENWX0ZJTFRFUl9TT0JFTF9CT1JERVIoIEhvcml6LCA4dTE2cywgdWNoYXIgKQorSVBDVl9GSUxURVJfU09CRUxfQk9SREVSKCBWZXJ0U2Vjb25kLCA4dTE2cywgdWNoYXIgKQorSVBDVl9GSUxURVJfU09CRUxfQk9SREVSKCBIb3JpelNlY29uZCwgOHUxNnMsIHVjaGFyICkKK0lQQ1ZfRklMVEVSX1NPQkVMX0JPUkRFUiggQ3Jvc3MsIDh1MTZzLCB1Y2hhciApCisKK0lQQ1ZfRklMVEVSX1NPQkVMX0JPUkRFUiggTmVnVmVydCwgMzJmLCBmbG9hdCApCitJUENWX0ZJTFRFUl9TT0JFTF9CT1JERVIoIEhvcml6LCAzMmYsIGZsb2F0ICkKK0lQQ1ZfRklMVEVSX1NPQkVMX0JPUkRFUiggVmVydFNlY29uZCwgMzJmLCBmbG9hdCApCitJUENWX0ZJTFRFUl9TT0JFTF9CT1JERVIoIEhvcml6U2Vjb25kLCAzMmYsIGZsb2F0ICkKK0lQQ1ZfRklMVEVSX1NPQkVMX0JPUkRFUiggQ3Jvc3MsIDMyZiwgZmxvYXQgKQorCisjdW5kZWYgSVBDVl9GSUxURVJfU09CRUxfQk9SREVSCisKKyNkZWZpbmUgSVBDVl9GSUxURVJfU0NIQVJSX0JPUkRFUiggc3VmZml4LCBmbGF2b3IsIHNyY3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2RmlsdGVyU2NoYXJyIyNzdWZmaXgjI0dldEJ1ZlNpemVfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgXAorICAgICJpcHBpRmlsdGVyU2NoYXJyIiAjc3VmZml4ICJHZXRCdWZmZXJTaXplXyIgI2ZsYXZvciAiX0MxUiIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAoIEN2U2l6ZSByb2ksIGludCogYnVmZmVyc2l6ZSApKSAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2RmlsdGVyU2NoYXJyIyNzdWZmaXgjI0JvcmRlcl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpRmlsdGVyU2NoYXJyIiAjc3VmZml4ICJCb3JkZXJfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgIFwKKyAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSByb2ksICAgICAgICAgICAgICAgICBcCisgICAgICBpbnQgYm9yZGVydHlwZSwgc3JjdHlwZSBib3JkZXJ2YWx1ZSwgdm9pZCogYnVmZmVyICkpCisKK0lQQ1ZfRklMVEVSX1NDSEFSUl9CT1JERVIoIFZlcnQsIDh1MTZzLCB1Y2hhciApCitJUENWX0ZJTFRFUl9TQ0hBUlJfQk9SREVSKCBIb3JpeiwgOHUxNnMsIHVjaGFyICkKKworSVBDVl9GSUxURVJfU0NIQVJSX0JPUkRFUiggVmVydCwgMzJmLCBmbG9hdCApCitJUENWX0ZJTFRFUl9TQ0hBUlJfQk9SREVSKCBIb3JpeiwgMzJmLCBmbG9hdCApCisKKyN1bmRlZiBJUENWX0ZJTFRFUl9TQ0hBUlJfQk9SREVSCisKKworI2RlZmluZSBJUENWX0ZJTFRFUl9MQVBMQUNJQU5fQk9SREVSKCBmbGF2b3IsIHNyY3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZGaWx0ZXJMYXBsYWNpYW5HZXRCdWZTaXplXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlGaWx0ZXJMYXBsYWNpYW5HZXRCdWZmZXJTaXplXyIgI2ZsYXZvciAiX0MxUiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICggQ3ZTaXplIHJvaSwgaW50IG1hc2tzaXplLCBpbnQqIGJ1ZmZlcnNpemUgKSkgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZGaWx0ZXJMYXBsYWNpYW5Cb3JkZXJfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlGaWx0ZXJMYXBsYWNpYW5Cb3JkZXJfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwgICAgICAgICAgXAorICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHJvaSwgaW50IG1hc2tzaXplLCAgIFwKKyAgICAgIGludCBib3JkZXJ0eXBlLCBzcmN0eXBlIGJvcmRlcnZhbHVlLCB2b2lkKiBidWZmZXIgKSkKKworSVBDVl9GSUxURVJfTEFQTEFDSUFOX0JPUkRFUiggOHUxNnMsIHVjaGFyICkKK0lQQ1ZfRklMVEVSX0xBUExBQ0lBTl9CT1JERVIoIDMyZiwgZmxvYXQgKQorCisjdW5kZWYgSVBDVl9GSUxURVJfTEFQTEFDSUFOX0JPUkRFUgorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSVBDVl9GSUxURVJfU09CRUwoIHN1ZmZpeCwgaXBwX3N1ZmZpeCwgZmxhdm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZGaWx0ZXJTb2JlbCMjc3VmZml4IyNfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaUZpbHRlclNvYmVsIiAjaXBwX3N1ZmZpeCAiXyIgI2ZsYXZvciAiX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgIFwKKyAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSByb2ksIGludCBhcGVydHVyZSApKQorCitJUENWX0ZJTFRFUl9TT0JFTCggVmVydCwgVmVydCwgOHUxNnMgKQorSVBDVl9GSUxURVJfU09CRUwoIEhvcml6LCBIb3JpeiwgOHUxNnMgKQorSVBDVl9GSUxURVJfU09CRUwoIFZlcnRTZWNvbmQsIFZlcnRTZWNvbmQsIDh1MTZzICkKK0lQQ1ZfRklMVEVSX1NPQkVMKCBIb3JpelNlY29uZCwgSG9yaXpTZWNvbmQsIDh1MTZzICkKK0lQQ1ZfRklMVEVSX1NPQkVMKCBDcm9zcywgQ3Jvc3MsIDh1MTZzICkKKworSVBDVl9GSUxURVJfU09CRUwoIFZlcnQsIFZlcnRNYXNrLCAzMmYgKQorSVBDVl9GSUxURVJfU09CRUwoIEhvcml6LCBIb3Jpek1hc2ssIDMyZiApCitJUENWX0ZJTFRFUl9TT0JFTCggVmVydFNlY29uZCwgVmVydFNlY29uZCwgMzJmICkKK0lQQ1ZfRklMVEVSX1NPQkVMKCBIb3JpelNlY29uZCwgSG9yaXpTZWNvbmQsIDMyZiApCitJUENWX0ZJTFRFUl9TT0JFTCggQ3Jvc3MsIENyb3NzLCAzMmYgKQorCisjdW5kZWYgSVBDVl9GSUxURVJfU09CRUwKKworI2RlZmluZSBJUENWX0ZJTFRFUl9TQ0hBUlIoIHN1ZmZpeCwgaXBwX3N1ZmZpeCwgZmxhdm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkZpbHRlclNjaGFyciMjc3VmZml4IyNfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpRmlsdGVyU2NoYXJyIiAjaXBwX3N1ZmZpeCAiXyIgI2ZsYXZvciAiX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgXAorICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHJvaSApKQorCitJUENWX0ZJTFRFUl9TQ0hBUlIoIFZlcnQsIFZlcnQsIDh1MTZzICkKK0lQQ1ZfRklMVEVSX1NDSEFSUiggSG9yaXosIEhvcml6LCA4dTE2cyApCitJUENWX0ZJTFRFUl9TQ0hBUlIoIFZlcnQsIFZlcnQsIDMyZiApCitJUENWX0ZJTFRFUl9TQ0hBUlIoIEhvcml6LCBIb3JpeiwgMzJmICkKKworI3VuZGVmIElQQ1ZfRklMVEVSX1NDSEFSUgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWMgRmlsdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDVl9GSUxURVIoIHN1ZmZpeCwgaXBwX3N1ZmZpeCwgY24sIGtzaXpldHlwZSwgYW5jaG9ydHlwZSApICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2RmlsdGVyIyNzdWZmaXgjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImlwcGlGaWx0ZXIiICNpcHBfc3VmZml4ICJfQyIgI2NuICJSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICBcCisgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrZXJuZWwsIGtzaXpldHlwZSBrc2l6ZSwgYW5jaG9ydHlwZSBhbmNob3IgKSkKKworSVBDVl9GSUxURVIoIF84dSwgMzJmXzh1LCAxLCBDdlNpemUsIEN2UG9pbnQgKQorSVBDVl9GSUxURVIoIF84dSwgMzJmXzh1LCAzLCBDdlNpemUsIEN2UG9pbnQgKQorSVBDVl9GSUxURVIoIF84dSwgMzJmXzh1LCA0LCBDdlNpemUsIEN2UG9pbnQgKQorCitJUENWX0ZJTFRFUiggXzE2cywgMzJmXzE2cywgMSwgQ3ZTaXplLCBDdlBvaW50ICkKK0lQQ1ZfRklMVEVSKCBfMTZzLCAzMmZfMTZzLCAzLCBDdlNpemUsIEN2UG9pbnQgKQorSVBDVl9GSUxURVIoIF8xNnMsIDMyZl8xNnMsIDQsIEN2U2l6ZSwgQ3ZQb2ludCApCisKK0lQQ1ZfRklMVEVSKCBfMzJmLCBfMzJmLCAxLCBDdlNpemUsIEN2UG9pbnQgKQorSVBDVl9GSUxURVIoIF8zMmYsIF8zMmYsIDMsIEN2U2l6ZSwgQ3ZQb2ludCApCitJUENWX0ZJTFRFUiggXzMyZiwgXzMyZiwgNCwgQ3ZTaXplLCBDdlBvaW50ICkKKworSVBDVl9GSUxURVIoIENvbHVtbl84dSwgQ29sdW1uMzJmXzh1LCAxLCBpbnQsIGludCApCitJUENWX0ZJTFRFUiggQ29sdW1uXzh1LCBDb2x1bW4zMmZfOHUsIDMsIGludCwgaW50ICkKK0lQQ1ZfRklMVEVSKCBDb2x1bW5fOHUsIENvbHVtbjMyZl84dSwgNCwgaW50LCBpbnQgKQorCitJUENWX0ZJTFRFUiggQ29sdW1uXzE2cywgQ29sdW1uMzJmXzE2cywgMSwgaW50LCBpbnQgKQorSVBDVl9GSUxURVIoIENvbHVtbl8xNnMsIENvbHVtbjMyZl8xNnMsIDMsIGludCwgaW50ICkKK0lQQ1ZfRklMVEVSKCBDb2x1bW5fMTZzLCBDb2x1bW4zMmZfMTZzLCA0LCBpbnQsIGludCApCisKK0lQQ1ZfRklMVEVSKCBDb2x1bW5fMzJmLCBDb2x1bW5fMzJmLCAxLCBpbnQsIGludCApCitJUENWX0ZJTFRFUiggQ29sdW1uXzMyZiwgQ29sdW1uXzMyZiwgMywgaW50LCBpbnQgKQorSVBDVl9GSUxURVIoIENvbHVtbl8zMmYsIENvbHVtbl8zMmYsIDQsIGludCwgaW50ICkKKworSVBDVl9GSUxURVIoIFJvd184dSwgUm93MzJmXzh1LCAxLCBpbnQsIGludCApCitJUENWX0ZJTFRFUiggUm93Xzh1LCBSb3czMmZfOHUsIDMsIGludCwgaW50ICkKK0lQQ1ZfRklMVEVSKCBSb3dfOHUsIFJvdzMyZl84dSwgNCwgaW50LCBpbnQgKQorCitJUENWX0ZJTFRFUiggUm93XzE2cywgUm93MzJmXzE2cywgMSwgaW50LCBpbnQgKQorSVBDVl9GSUxURVIoIFJvd18xNnMsIFJvdzMyZl8xNnMsIDMsIGludCwgaW50ICkKK0lQQ1ZfRklMVEVSKCBSb3dfMTZzLCBSb3czMmZfMTZzLCA0LCBpbnQsIGludCApCisKK0lQQ1ZfRklMVEVSKCBSb3dfMzJmLCBSb3dfMzJmLCAxLCBpbnQsIGludCApCitJUENWX0ZJTFRFUiggUm93XzMyZiwgUm93XzMyZiwgMywgaW50LCBpbnQgKQorSVBDVl9GSUxURVIoIFJvd18zMmYsIFJvd18zMmYsIDQsIGludCwgaW50ICkKKworI3VuZGVmIElQQ1ZfRklMVEVSCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yIFRyYW5zZm9ybWF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElQQ1ZfQ09MT1IoIGZ1bmNuYW1lLCBpcHBfZnVuY25hbWUsIGZsYXZvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3YjI2Z1bmNuYW1lIyNfIyNmbGF2b3IjI19DM1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAiaXBwaSIgI2lwcF9mdW5jbmFtZSAiXyIgI2ZsYXZvciAiX0MzUiwiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJpcHBpIiAjaXBwX2Z1bmNuYW1lICJfIiAjZmxhdm9yICJfQzNSIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfUExVR0lOUzIoQ1ZfUExVR0lOX0lQUEksQ1ZfUExVR0lOX0lQUENDKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpCisKK0lQQ1ZfQ09MT1IoIFJHQjJYWVosIFJHQlRvWFlaLCA4dSApCitJUENWX0NPTE9SKCBSR0IyWFlaLCBSR0JUb1hZWiwgMTZ1ICkKK0lQQ1ZfQ09MT1IoIFJHQjJYWVosIFJHQlRvWFlaLCAzMmYgKQorSVBDVl9DT0xPUiggWFlaMlJHQiwgWFlaVG9SR0IsIDh1ICkKK0lQQ1ZfQ09MT1IoIFhZWjJSR0IsIFhZWlRvUkdCLCAxNnUgKQorSVBDVl9DT0xPUiggWFlaMlJHQiwgWFlaVG9SR0IsIDMyZiApCisKK0lQQ1ZfQ09MT1IoIFJHQjJIU1YsIFJHQlRvSFNWLCA4dSApCitJUENWX0NPTE9SKCBIU1YyUkdCLCBIU1ZUb1JHQiwgOHUgKQorCitJUENWX0NPTE9SKCBSR0IySExTLCBSR0JUb0hMUywgOHUgKQorSVBDVl9DT0xPUiggUkdCMkhMUywgUkdCVG9ITFMsIDMyZiApCitJUENWX0NPTE9SKCBITFMyUkdCLCBITFNUb1JHQiwgOHUgKQorSVBDVl9DT0xPUiggSExTMlJHQiwgSExTVG9SR0IsIDMyZiApCisKK0lQQ1ZfQ09MT1IoIEJHUjJMYWIsIEJHUlRvTGFiLCA4dSApCitJUENWX0NPTE9SKCBMYWIyQkdSLCBMYWJUb0JHUiwgOHUgKQorCitJUENWX0NPTE9SKCBSR0IyTHV2LCBSR0JUb0xVViwgOHUgKQorLypJUENWX0NPTE9SKCBSR0IyTHV2LCBSR0JUb0xVViwgMzJmICkqLworSVBDVl9DT0xPUiggTHV2MlJHQiwgTFVWVG9SR0IsIDh1ICkKKy8qSVBDVl9DT0xPUiggTHV2MlJHQiwgTFVWVG9SR0IsIDMyZiApKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vdGlvbiBUZW1wbGF0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2VXBkYXRlTW90aW9uSGlzdG9yeV84dTMyZl9DMUlSLAorICAgICJpcHBpVXBkYXRlTW90aW9uSGlzdG9yeV84dTMyZl9DMUlSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAoIGNvbnN0IHVjaGFyKiBzaWxJbSwgaW50IHNpbFN0ZXAsIGZsb2F0KiBtaGlJbSwgaW50IG1oaVN0ZXAsCisgICAgICBDdlNpemUgc2l6ZSxmbG9hdCAgdGltZXN0YW1wLCBmbG9hdCAgbWhpX2R1cmF0aW9uICkpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlIE1hdGNoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfTUFUQ0hURU1QTEFURSggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q3Jvc3NDb3JyVmFsaWRfTm9ybV8jI2ZsYXZvciMjX0MxUiwgICAgICAgIFwKKyAgICAgICAgImlwcGlDcm9zc0NvcnJWYWxpZF9Ob3JtXyIgI2ZsYXZvciAiX0MxUiIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggY29uc3QgYXJydHlwZSogcFNyYywgaW50IHNyY1N0ZXAsIEN2U2l6ZSBzcmNSb2lTaXplLCAgICAgIFwKKyAgICAgICAgY29uc3QgYXJydHlwZSogcFRwbCwgaW50IHRwbFN0ZXAsIEN2U2l6ZSB0cGxSb2lTaXplLCAgICAgICAgXAorICAgICAgICBmbG9hdCogcERzdCwgaW50IGRzdFN0ZXAgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q3Jvc3NDb3JyVmFsaWRfTm9ybUxldmVsXyMjZmxhdm9yIyNfQzFSLCAgIFwKKyAgICAgICAgImlwcGlDcm9zc0NvcnJWYWxpZF9Ob3JtTGV2ZWxfIiAjZmxhdm9yICJfQzFSIiwgICAgICAgICAgICAgXAorICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggY29uc3QgYXJydHlwZSogcFNyYywgaW50IHNyY1N0ZXAsIEN2U2l6ZSBzcmNSb2lTaXplLCAgICAgIFwKKyAgICAgICAgY29uc3QgYXJydHlwZSogcFRwbCwgaW50IHRwbFN0ZXAsIEN2U2l6ZSB0cGxSb2lTaXplLCAgICAgICAgXAorICAgICAgICBmbG9hdCogcERzdCwgaW50IGRzdFN0ZXAgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2U3FyRGlzdGFuY2VWYWxpZF9Ob3JtXyMjZmxhdm9yIyNfQzFSLCAgICAgIFwKKyAgICAgICAgImlwcGlTcXJEaXN0YW5jZVZhbGlkX05vcm1fIiAjZmxhdm9yICJfQzFSIiwgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggY29uc3QgYXJydHlwZSogcFNyYywgaW50IHNyY1N0ZXAsIEN2U2l6ZSBzcmNSb2lTaXplLCAgICAgIFwKKyAgICAgICAgY29uc3QgYXJydHlwZSogcFRwbCwgaW50IHRwbFN0ZXAsIEN2U2l6ZSB0cGxSb2lTaXplLCAgICAgICAgXAorICAgICAgICBmbG9hdCogcERzdCwgaW50IGRzdFN0ZXAgKSkKKworSUNWX01BVENIVEVNUExBVEUoIDh1MzJmLCB1Y2hhciApCitJQ1ZfTUFUQ0hURU1QTEFURSggMzJmLCBmbG9hdCApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3RhbmNlIFRyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSVBDVkFQSV9FWChDdlN0YXR1cywgaWN2RGlzdGFuY2VUcmFuc2Zvcm1fM3gzXzh1MzJmX0MxUiwKKyAgICAiaXBwaURpc3RhbmNlVHJhbnNmb3JtXzN4M184dTMyZl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLAorICAgICggY29uc3QgdWNoYXIqIHBTcmMsIGludCBzcmNTdGVwLCBmbG9hdCogcERzdCwKKyAgICAgIGludCBkc3RTdGVwLCBDdlNpemUgcm9pU2l6ZSwgY29uc3QgZmxvYXQqIHBNZXRyaWNzICkpCisKK0lQQ1ZBUElfRVgoQ3ZTdGF0dXMsIGljdkRpc3RhbmNlVHJhbnNmb3JtXzV4NV84dTMyZl9DMVIsCisgICAgImlwcGlEaXN0YW5jZVRyYW5zZm9ybV81eDVfOHUzMmZfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAoIGNvbnN0IHVjaGFyKiBwU3JjLCBpbnQgc3JjU3RlcCwgZmxvYXQqIHBEc3QsCisgICAgICBpbnQgZHN0U3RlcCwgQ3ZTaXplIHJvaVNpemUsIGNvbnN0IGZsb2F0KiBwTWV0cmljcyApKQorCitJUENWQVBJX0VYKEN2U3RhdHVzLCBpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfOHVfQzFJUiwKKyAgICAiaXBwaURpc3RhbmNlVHJhbnNmb3JtXzN4M184dV9DMUlSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAoIHVjaGFyKiBwU3JjLCBpbnQgc3JjU3RlcCwgQ3ZTaXplIHJvaVNpemUsIGNvbnN0IGludCogcE1ldHJpY3MgKSkKKworSVBDVkFQSV9FWChDdlN0YXR1cywgaWN2RGlzdGFuY2VUcmFuc2Zvcm1fM3gzXzh1X0MxUiwKKyAgICAiaXBwaURpc3RhbmNlVHJhbnNmb3JtXzN4M184dV9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLAorICAgICggY29uc3QgdWNoYXIqIHBTcmMsIGludCBzcmNTdGVwLCB1Y2hhciogcERzdCwKKyAgICAgIGludCBkc3RTdGVwLCBDdlNpemUgcm9pU2l6ZSwgY29uc3QgaW50KiBwTWV0cmljcyApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZXNob2xkaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDb21wYXJlQ184dV9DMVJfY3YsCisgICAgICAgICAgICAiaXBwaUNvbXBhcmVDXzh1X0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwKKyAgICAgICAgICAgICggY29uc3QgdWNoYXIqIHNyYzEsIGludCBzcmNzdGVwMSwgdWNoYXIgc2NhbGFyLAorICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBjbXBfb3AgKSkKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZBbmRDXzh1X0MxUiwKKyAgICAgICAgICAgICJpcHBpQW5kQ184dV9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksCisgICAgICAgICAgICAoIGNvbnN0IHVjaGFyKiBzcmMxLCBpbnQgc3Jjc3RlcDEsIHVjaGFyIHNjYWxhciwKKyAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2VGhyZXNob2xkX0dUVmFsXzh1X0MxUiwKKyAgICAgICAgICAgICJpcHBpVGhyZXNob2xkX0dUVmFsXzh1X0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwKKyAgICAgICAgICAgICggY29uc3QgdWNoYXIqIHBTcmMsIGludCBzcmNzdGVwLCB1Y2hhciogcERzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCB1Y2hhciB0aHJlc2hvbGQsIHVjaGFyIHZhbHVlICkpCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2VGhyZXNob2xkX0dUVmFsXzMyZl9DMVIsCisgICAgICAgICAgICAiaXBwaVRocmVzaG9sZF9HVFZhbF8zMmZfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLAorICAgICAgICAgICAgKCBjb25zdCBmbG9hdCogcFNyYywgaW50IHNyY3N0ZXAsIGZsb2F0KiBwRHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGZsb2F0IHRocmVzaG9sZCwgZmxvYXQgdmFsdWUgKSkKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZUaHJlc2hvbGRfTFRWYWxfOHVfQzFSLAorICAgICAgICAgICAgImlwcGlUaHJlc2hvbGRfTFRWYWxfOHVfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLAorICAgICAgICAgICAgKCBjb25zdCB1Y2hhciogcFNyYywgaW50IHNyY3N0ZXAsIHVjaGFyKiBwRHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIHVjaGFyIHRocmVzaG9sZCwgdWNoYXIgdmFsdWUgKSkKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZUaHJlc2hvbGRfTFRWYWxfMzJmX0MxUiwKKyAgICAgICAgICAgICJpcHBpVGhyZXNob2xkX0xUVmFsXzMyZl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksCisgICAgICAgICAgICAoIGNvbnN0IGZsb2F0KiBwU3JjLCBpbnQgc3Jjc3RlcCwgZmxvYXQqIHBEc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZmxvYXQgdGhyZXNob2xkLCBmbG9hdCB2YWx1ZSApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW5ueSBFZGdlIERldGVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDYW5ueUdldFNpemUsICJpcHBpQ2FubnlHZXRTaXplIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSovLAorICAgICAgICAgICAoIEN2U2l6ZSByb2lTaXplLCBpbnQqIGJ1ZmZlclNpemUgKSkKKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNhbm55XzE2czh1X0MxUiwgImlwcGlDYW5ueV8xNnM4dV9DMVIiLCAwLypDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpKi8sCisgICAgKCBjb25zdCBzaG9ydCogcFNyY0R4LCBpbnQgc3JjRHhTdGVwLCBjb25zdCBzaG9ydCogcFNyY0R5LCBpbnQgc3JjRHlTdGVwLAorICAgICAgdWNoYXIqICBwRHN0RWRnZXMsIGludCBkc3RFZGdlU3RlcCwgQ3ZTaXplIHJvaVNpemUsIGZsb2F0IGxvd1RocmVzaCwKKyAgICAgIGZsb2F0ICBoaWdoVGhyZXNoLCB2b2lkKiBwQnVmZmVyICkpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFkaWFsIERpc3RvcnRpb24gUmVtb3ZhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2VW5kaXN0b3J0R2V0U2l6ZSwgImlwcGlVbmRpc3RvcnRHZXRTaXplIiwKKyAgICAgICAgICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksICggQ3ZTaXplIHJvaVNpemUsIGludCAqcEJ1ZnNpemUgKSkKKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNyZWF0ZU1hcENhbWVyYVVuZGlzdG9ydF8zMmZfQzFSLAorICAgICAgICAgICAgImlwcGlDcmVhdGVNYXBDYW1lcmFVbmRpc3RvcnRfMzJmX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoZmxvYXQgKnB4TWFwLCBpbnQgeFN0ZXAsIGZsb2F0ICpweU1hcCwgaW50IHlTdGVwLCBDdlNpemUgcm9pU2l6ZSwKKyAgICAgICAgICAgIGZsb2F0IGZ4LCBmbG9hdCBmeSwgZmxvYXQgY3gsIGZsb2F0IGN5LCBmbG9hdCBrMSwgZmxvYXQgazIsCisgICAgICAgICAgICBmbG9hdCBwMSwgZmxvYXQgcDIsIHVjaGFyICpwQnVmZmVyICkpCisKKyNkZWZpbmUgSUNWX1VORElTVE9SVF9SQURJQUwoIGZsYXZvciwgY24sIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZVbmRpc3RvcnRSYWRpYWxfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaVVuZGlzdG9ydFJhZGlhbF8iICNmbGF2b3IgIl9DIiAjY24gIlIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgICAgIFwKKyAgICAoIGNvbnN0IGFycnR5cGUqIHBTcmMsIGludCBzcmNTdGVwLCB1Y2hhciogcERzdCwgaW50IGRzdFN0ZXAsIEN2U2l6ZSByb2lTaXplLCAgIFwKKyAgICAgIGZsb2F0IGZ4LCBmbG9hdCBmeSwgZmxvYXQgY3gsIGZsb2F0IGN5LCBmbG9hdCBrMSwgZmxvYXQgazIsIHVjaGFyICpwQnVmZmVyICkpCisKK0lDVl9VTkRJU1RPUlRfUkFESUFMKCA4dSwgMSwgdWNoYXIgKQorSUNWX1VORElTVE9SVF9SQURJQUwoIDh1LCAzLCB1Y2hhciApCisKKyN1bmRlZiBJQ1ZfVU5ESVNUT1JUX1JBRElBTAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VicGl4ZWwtYWNjdXJhdGUgcmVjdGFuZ2xlIGV4dHJhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0NPUFlfU1VCUElYKCBmbGF2b3IsIGNuLCBzcmN0eXBlLCBkc3R0eXBlICkgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q29weVN1YnBpeF8jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weVN1YnBpeF8iICNmbGF2b3IgIl9DIiAjY24gIlIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCAgIFwKKyAgICAoIGNvbnN0IHNyY3R5cGUqIHBTcmMsIGludCBzcmNTdGVwLCBkc3R0eXBlKiBwRHN0LCBpbnQgZHN0U3RlcCwgICAgICAgICBcCisgICAgQ3ZTaXplIHNpemUsIGZsb2F0IGR4LCBmbG9hdCBkeSApKQorCitJQ1ZfQ09QWV9TVUJQSVgoIDh1LCAxLCB1Y2hhciwgdWNoYXIgKQorSUNWX0NPUFlfU1VCUElYKCA4dTMyZiwgMSwgdWNoYXIsIGZsb2F0ICkKKy8vSUNWX0NPUFlfU1VCUElYKCAzMmYsIDEsIGZsb2F0LCBmbG9hdCApCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDb3B5U3VicGl4XzMyZl9DMVIsCisgICAgImlwcGlDb3B5U3VicGl4XzMyZl9DMVIiLCAwLAorICAgICggY29uc3QgZmxvYXQqIHBTcmMsIGludCBzcmNTdGVwLCBmbG9hdCogcERzdCwgaW50IGRzdFN0ZXAsCisgICAgQ3ZTaXplIHNpemUsIGZsb2F0IGR4LCBmbG9hdCBkeSApKQorCisjdW5kZWYgSUNWX0NPUFlfU1VCUElYCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHVjYXMtS2FuYWRlIE9wdGljYWwgRmxvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk9wdGljYWxGbG93UHlyTEtJbml0QWxsb2NfOHVfQzFSLAorICAgICAgICAgICAgImlwcGlPcHRpY2FsRmxvd1B5ckxLSW5pdEFsbG9jXzh1X0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIHZvaWQqKiBwcFN0YXRlLCBDdlNpemUgcm9pU2l6ZSwgaW50IHdpblNpemUsIGludCBoaW50ICkpCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZPcHRpY2FsRmxvd1B5ckxLRnJlZV84dV9DMVIsCisgICAgICAgICAgICAiaXBwaU9wdGljYWxGbG93UHlyTEtGcmVlXzh1X0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIHZvaWQqIHBTdGF0ZSApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2T3B0aWNhbEZsb3dQeXJMS184dV9DMVIsCisgICAgICAgICAgICAiaXBwaU9wdGljYWxGbG93UHlyTEtfOHVfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAgICAgICAgICggQ3ZQeXJhbWlkICpwUHlyMSwgQ3ZQeXJhbWlkICpwUHlyMiwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpwUHJldiwgZmxvYXQqIHBOZXh0LCBjaGFyICpwU3RhdHVzLAorICAgICAgICAgICAgZmxvYXQgKnBFcnJvciwgaW50IG51bUZlYXQsIGludCB3aW5TaXplLAorICAgICAgICAgICAgaW50IG1heExldiwgaW50IG1heEl0ZXIsIGZsb2F0IHRocmVzaG9sZCwgdm9pZCogc3RhdGUgKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYWFyIE9iamVjdCBEZXRlY3RvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZJbnRlZ3JhbF84dTMyc19DMVIsCisgICAgICAgICAgICAiaXBwaUludGVncmFsXzh1MzJzX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIGNvbnN0IHVjaGFyKiBwU3JjLCBpbnQgc3JjU3RlcCwgaW50KiBwRHN0LCBpbnQgZHN0U3RlcCwKKyAgICAgICAgICAgICAgQ3ZTaXplIHJvaVNpemUsIGludCB2YWwgKSkKKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdlNxckludGVncmFsXzh1MzJzNjRmX0MxUiwKKyAgICAgICAgICAgICJpcHBpU3FySW50ZWdyYWxfOHUzMnM2NGZfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAgICAgICAgICggY29uc3QgdWNoYXIqIHBTcmMsIGludCBzcmNTdGVwLAorICAgICAgICAgICAgICBpbnQqIHBEc3QsIGludCBkc3RTdGVwLCBkb3VibGUqIHBTcXIsIGludCBzcXJTdGVwLAorICAgICAgICAgICAgICBDdlNpemUgcm9pU2l6ZSwgaW50IHZhbCwgZG91YmxlIHZhbFNxciApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2UmVjdFN0ZERldl8zMmZfQzFSLAorICAgICAgICAgICAgImlwcGlSZWN0U3RkRGV2XzMyZl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLAorICAgICAgICAgICAgKCBjb25zdCBmbG9hdCogcFNyYywgaW50IHNyY1N0ZXAsCisgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcFNxciwgaW50IHNxclN0ZXAsIGZsb2F0KiBwRHN0LCBpbnQgZHN0U3RlcCwKKyAgICAgICAgICAgICAgQ3ZTaXplIHJvaVNpemUsIEN2UmVjdCByZWN0ICkpCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZIYWFyQ2xhc3NpZmllckluaXRBbGxvY18zMmYsCisgICAgICAgICAgICAiaXBwaUhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIHZvaWQgKipwU3RhdGUsIGNvbnN0IEN2UmVjdCogcEZlYXR1cmUsIGNvbnN0IGZsb2F0KiBwV2VpZ2h0LAorICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcFRocmVzaG9sZCwgY29uc3QgZmxvYXQqIHBWYWwxLAorICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcFZhbDIsIGNvbnN0IGludCogcE51bSwgaW50IGxlbmd0aCApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZiwKKyAgICAgICAgICAgICJpcHBpSGFhckNsYXNzaWZpZXJGcmVlXzMyZiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDViksCisgICAgICAgICAgICAoIHZvaWQgKnBTdGF0ZSApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2QXBwbHlIYWFyQ2xhc3NpZmllcl8zMmZfQzFSLAorICAgICAgICAgICAgImlwcGlBcHBseUhhYXJDbGFzc2lmaWVyXzMyZl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLAorICAgICAgICAgICAgKCBjb25zdCBmbG9hdCogcFNyYywgaW50IHNyY1N0ZXAsIGNvbnN0IGZsb2F0KiBwTm9ybSwKKyAgICAgICAgICAgICAgaW50IG5vcm1TdGVwLCB1Y2hhciogcE1hc2ssIGludCBtYXNrU3RlcCwKKyAgICAgICAgICAgICAgQ3ZTaXplIHJvaSwgaW50ICpwUG9zaXRpdmUsIGZsb2F0IHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgdm9pZCAqcFN0YXRlICkpCisKKyNlbmRpZiAvKl9DVl9JUFBfSF8qLworCmRpZmYgLS1naXQgYS9jdi9zcmMvX2N2a2R0cmVlLmhwcCBiL2N2L3NyYy9fY3ZrZHRyZWUuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMzQ2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvX2N2a2R0cmVlLmhwcApAQCAtMCwwICsxLDQ2MSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIFhhdmllciBEZWxhY291ciwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvLyAyMDA4LTA1LTEzLCBYYXZpZXIgRGVsYWNvdXIgPHhhdmllci5kZWxhY291ckBnbWFpbC5jb20+CisKKyNpZm5kZWYgX19jdl9rZHRyZWVfaF9fCisjZGVmaW5lIF9fY3Zfa2R0cmVlX2hfXworCisjaW5jbHVkZSAiX2N2LmgiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlICJhc3NlcnQuaCIKKyNpbmNsdWRlICJtYXRoLmgiCisKKy8vIEouUy4gQmVpcyBhbmQgRC5HLiBMb3dlLiBTaGFwZSBpbmRleGluZyB1c2luZyBhcHByb3hpbWF0ZSBuZWFyZXN0LW5laWdoYm9yIHNlYXJjaCBpbiBoaWdoZGltZW5zaW9uYWwgc3BhY2VzLiBJbiBQcm9jLiBJRUVFIENvbmYuIENvbXAuIFZpc2lvbiBQYXR0LiBSZWNvZy4sIHBhZ2VzIDEwMDAtLTEwMDYsIDE5OTcuIGh0dHA6Ly9jaXRlc2Vlci5pc3QucHN1LmVkdS9iZWlzOTdzaGFwZS5odG1sIAorI3VuZGVmIF9fZGVyZWYKKyN1bmRlZiBfX3ZhbHVldHlwZQorCit0ZW1wbGF0ZSA8IGNsYXNzIF9fdmFsdWV0eXBlLCBjbGFzcyBfX2RlcmVmID4KK2NsYXNzIEN2S0RUcmVlIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBfX2RlcmVmIGRlcmVmX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXJlZjo6c2NhbGFyX3R5cGUgc2NhbGFyX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgX19kZXJlZjo6YWNjdW1fdHlwZSBhY2N1bV90eXBlOworCitwcml2YXRlOgorICBzdHJ1Y3Qgbm9kZSB7CisgICAgaW50IGRpbTsJCQkvLyBzcGxpdCBkaW1lbnNpb247ID49MCBmb3Igbm9kZXMsIC0xIGZvciBsZWF2ZXMKKyAgICBfX3ZhbHVldHlwZSB2YWx1ZTsJCS8vIGlmIGxlYWYsIHZhbHVlIG9mIGxlYWYKKyAgICBpbnQgbGVmdCwgcmlnaHQ7CQkvLyBub2RlIGluZGljZXMgb2YgbGVmdCBhbmQgcmlnaHQgYnJhbmNoZXMKKyAgICBzY2FsYXJfdHlwZSBib3VuZGFyeTsJLy8gbGVmdCBpZiBkZXJlZih2YWx1ZSxkaW0pPD1ib3VuZGFyeSwgb3RoZXJ3aXNlIHJpZ2h0CisgIH07CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3IgPCBub2RlID4gbm9kZV9hcnJheTsKKworICBfX2RlcmVmIGRlcmVmOwkJLy8gcmVxdWlyZXMgb3BlcmF0b3IoKSAoX192YWx1ZXR5cGUgbGhzLGludCBkaW0pCisKKyAgbm9kZV9hcnJheSBub2RlczsJCS8vIG5vZGUgc3RvcmFnZQorICBpbnQgcG9pbnRfZGltOwkJLy8gZGltZW5zaW9uIG9mIHBvaW50cyAodGhlIGsgaW4ga2QtdHJlZSkKKyAgaW50IHJvb3Rfbm9kZTsJCS8vIGluZGV4IG9mIHJvb3Qgbm9kZSwgLTEgaWYgZW1wdHkgdHJlZQorCisgIC8vIGZvciBnaXZlbiBzZXQgb2YgcG9pbnQgaW5kaWNlcywgY29tcHV0ZSBkaW1lbnNpb24gb2YgaGlnaGVzdCB2YXJpYW5jZQorICB0ZW1wbGF0ZSA8IGNsYXNzIF9faW5zdHlwZSwgY2xhc3MgX192YWx1ZWN0b3IgPgorICBpbnQgZGltZW5zaW9uX29mX2hpZ2hlc3RfdmFyaWFuY2UoX19pbnN0eXBlICogZmlyc3QsIF9faW5zdHlwZSAqIGxhc3QsCisJCQkJICAgIF9fdmFsdWVjdG9yIGN0b3IpIHsKKyAgICBhc3NlcnQobGFzdCAtIGZpcnN0ID4gMCk7CisKKyAgICBhY2N1bV90eXBlIG1heHZhciA9IC1zdGQ6Om51bWVyaWNfbGltaXRzIDwgYWNjdW1fdHlwZSA+OjptYXgoKTsKKyAgICBpbnQgbWF4aiA9IC0xOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcG9pbnRfZGltOyArK2opIHsKKyAgICAgIGFjY3VtX3R5cGUgbWVhbiA9IDA7CisgICAgICBmb3IgKF9faW5zdHlwZSAqIGsgPSBmaXJzdDsgayA8IGxhc3Q7ICsraykKKwltZWFuICs9IGRlcmVmKGN0b3IoKmspLCBqKTsKKyAgICAgIG1lYW4gLz0gbGFzdCAtIGZpcnN0OworICAgICAgYWNjdW1fdHlwZSB2YXIgPSAwOworICAgICAgZm9yIChfX2luc3R5cGUgKiBrID0gZmlyc3Q7IGsgPCBsYXN0OyArK2spIHsKKwlhY2N1bV90eXBlIGRpZmYgPSBhY2N1bV90eXBlKGRlcmVmKGN0b3IoKmspLCBqKSkgLSBtZWFuOworCXZhciArPSBkaWZmICogZGlmZjsKKyAgICAgIH0KKyAgICAgIHZhciAvPSBsYXN0IC0gZmlyc3Q7CisKKyAgICAgIGFzc2VydChtYXhqICE9IC0xIHx8IHZhciA+PSBtYXh2YXIpOworCisgICAgICBpZiAodmFyID49IG1heHZhcikgeworCW1heHZhciA9IHZhcjsKKwltYXhqID0gajsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbWF4ajsKKyAgfQorCisgIC8vIGdpdmVuIHBvaW50IGluZGljZXMgYW5kIGRpbWVuc2lvbiwgZmluZCBpbmRleCBvZiBtZWRpYW47IChhbG1vc3QpIG1vZGlmaWVzIFtmaXJzdCxsYXN0KSAKKyAgLy8gc3VjaCB0aGF0IHBvaW50c19pbltmaXJzdCxtZWRpYW5dPD1wb2ludFttZWRpYW5dLCBwb2ludHNfaW4obWVkaWFuLGxhc3QpPnBvaW50W21lZGlhbl0uCisgIC8vIGltcGxlbWVudGVkIGFzIHBhcnRpYWwgcXVpY2tzb3J0OyBleHBlY3RlZCBsaW5lYXIgcGVyZi4KKyAgdGVtcGxhdGUgPCBjbGFzcyBfX2luc3R5cGUsIGNsYXNzIF9fdmFsdWVjdG9yID4KKyAgX19pbnN0eXBlICogbWVkaWFuX3BhcnRpdGlvbihfX2luc3R5cGUgKiBmaXJzdCwgX19pbnN0eXBlICogbGFzdCwKKwkJCSAgICAgICBpbnQgZGltLCBfX3ZhbHVlY3RvciBjdG9yKSB7CisgICAgYXNzZXJ0KGxhc3QgLSBmaXJzdCA+IDApOworICAgIF9faW5zdHlwZSAqayA9IGZpcnN0ICsgKGxhc3QgLSBmaXJzdCkgLyAyOworICAgIG1lZGlhbl9wYXJ0aXRpb24oZmlyc3QsIGxhc3QsIGssIGRpbSwgY3Rvcik7CisgICAgcmV0dXJuIGs7CisgIH0KKworICB0ZW1wbGF0ZSA8IGNsYXNzIF9faW5zdHlwZSwgY2xhc3MgX192YWx1ZWN0b3IgPgorICBzdHJ1Y3QgbWVkaWFuX3ByIHsKKyAgICBjb25zdCBfX2luc3R5cGUgJiBwaXZvdDsKKyAgICBpbnQgZGltOworICAgIF9fZGVyZWYgZGVyZWY7CisgICAgX192YWx1ZWN0b3IgY3RvcjsKKyAgICBtZWRpYW5fcHIoY29uc3QgX19pbnN0eXBlICYgX3Bpdm90LCBpbnQgX2RpbSwgX19kZXJlZiBfZGVyZWYsIF9fdmFsdWVjdG9yIF9jdG9yKQorICAgICAgOiBwaXZvdChfcGl2b3QpLCBkaW0oX2RpbSksIGRlcmVmKF9kZXJlZiksIGN0b3IoX2N0b3IpIHsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcigpIChjb25zdCBfX2luc3R5cGUgJiBsaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkZXJlZihjdG9yKGxocyksIGRpbSkgPD0gZGVyZWYoY3RvcihwaXZvdCksIGRpbSk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDwgY2xhc3MgX19pbnN0eXBlLCBjbGFzcyBfX3ZhbHVlY3RvciA+CisgIHZvaWQgbWVkaWFuX3BhcnRpdGlvbihfX2luc3R5cGUgKiBmaXJzdCwgX19pbnN0eXBlICogbGFzdCwgCisJCQlfX2luc3R5cGUgKiBrLCBpbnQgZGltLCBfX3ZhbHVlY3RvciBjdG9yKSB7CisgICAgaW50IHBpdm90ID0gKGxhc3QgLSBmaXJzdCkgLyAyOworCisgICAgc3RkOjpzd2FwKGZpcnN0W3Bpdm90XSwgbGFzdFstMV0pOworICAgIF9faW5zdHlwZSAqbWlkZGxlID0gc3RkOjpwYXJ0aXRpb24oZmlyc3QsIGxhc3QgLSAxLAorCQkJCSAgICAgICBtZWRpYW5fcHIgPCBfX2luc3R5cGUsIF9fdmFsdWVjdG9yID4gCisJCQkJICAgICAgIChsYXN0Wy0xXSwgZGltLCBkZXJlZiwgY3RvcikpOworICAgIHN0ZDo6c3dhcCgqbWlkZGxlLCBsYXN0Wy0xXSk7CisKKyAgICBpZiAobWlkZGxlIDwgaykKKyAgICAgIG1lZGlhbl9wYXJ0aXRpb24obWlkZGxlICsgMSwgbGFzdCwgaywgZGltLCBjdG9yKTsKKyAgICBlbHNlIGlmIChtaWRkbGUgPiBrKQorICAgICAgbWVkaWFuX3BhcnRpdGlvbihmaXJzdCwgbWlkZGxlLCBrLCBkaW0sIGN0b3IpOworICB9CisKKyAgLy8gaW5zZXJ0IGdpdmVuIHBvaW50cyBpbnRvIHRoZSB0cmVlOyByZXR1cm4gY3JlYXRlZCBub2RlCisgIHRlbXBsYXRlIDwgY2xhc3MgX19pbnN0eXBlLCBjbGFzcyBfX3ZhbHVlY3RvciA+CisgIGludCBpbnNlcnQoX19pbnN0eXBlICogZmlyc3QsIF9faW5zdHlwZSAqIGxhc3QsIF9fdmFsdWVjdG9yIGN0b3IpIHsKKyAgICBpZiAoZmlyc3QgPT0gbGFzdCkKKyAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlIHsKKworICAgICAgaW50IGRpbSA9IGRpbWVuc2lvbl9vZl9oaWdoZXN0X3ZhcmlhbmNlKGZpcnN0LCBsYXN0LCBjdG9yKTsKKyAgICAgIF9faW5zdHlwZSAqbWVkaWFuID0gbWVkaWFuX3BhcnRpdGlvbihmaXJzdCwgbGFzdCwgZGltLCBjdG9yKTsKKworICAgICAgX19pbnN0eXBlICpzcGxpdCA9IG1lZGlhbjsKKyAgICAgIGZvciAoOyBzcGxpdCAhPSBsYXN0ICYmIGRlcmVmKGN0b3IoKnNwbGl0KSwgZGltKSA9PSAKKwkgICAgIGRlcmVmKGN0b3IoKm1lZGlhbiksIGRpbSk7ICsrc3BsaXQpOworCisgICAgICBpZiAoc3BsaXQgPT0gbGFzdCkgeyAvLyBsZWFmCisJaW50IG5leHRpID0gLTE7CisJZm9yICgtLXNwbGl0OyBzcGxpdCA+PSBmaXJzdDsgLS1zcGxpdCkgeworCSAgaW50IGkgPSBub2Rlcy5zaXplKCk7CisJICBub2RlICYgbiA9ICpub2Rlcy5pbnNlcnQobm9kZXMuZW5kKCksIG5vZGUoKSk7CisJICBuLmRpbSA9IC0xOworCSAgbi52YWx1ZSA9IGN0b3IoKnNwbGl0KTsKKwkgIG4ubGVmdCA9IC0xOworCSAgbi5yaWdodCA9IG5leHRpOworCSAgbmV4dGkgPSBpOworCX0KKworCXJldHVybiBuZXh0aTsKKyAgICAgIH0gZWxzZSB7IC8vIG5vZGUKKwlpbnQgaSA9IG5vZGVzLnNpemUoKTsKKwkvLyBub3RlIHRoYXQgcmVjdXJzaXZlIGluc2VydCBtYXkgaW52YWxpZGF0ZSB0aGlzIHJlZgorCW5vZGUgJiBuID0gKm5vZGVzLmluc2VydChub2Rlcy5lbmQoKSwgbm9kZSgpKTsKKworCW4uZGltID0gZGltOworCW4uYm91bmRhcnkgPSBkZXJlZihjdG9yKCptZWRpYW4pLCBkaW0pOworCisJaW50IGxlZnQgPSBpbnNlcnQoZmlyc3QsIHNwbGl0LCBjdG9yKTsKKwlub2Rlc1tpXS5sZWZ0ID0gbGVmdDsKKwlpbnQgcmlnaHQgPSBpbnNlcnQoc3BsaXQsIGxhc3QsIGN0b3IpOworCW5vZGVzW2ldLnJpZ2h0ID0gcmlnaHQ7CisKKwlyZXR1cm4gaTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBydW4gdG8gbGVhZjsgbGluZWFyIHNlYXJjaCBmb3IgcDsKKyAgLy8gaWYgZm91bmQsIHJlbW92ZSBwYXRocyB0byBlbXB0eSBsZWF2ZXMgb24gdW53aW5kCisgIGJvb2wgcmVtb3ZlKGludCAqaSwgY29uc3QgX192YWx1ZXR5cGUgJiBwKSB7CisgICAgaWYgKCppID09IC0xKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIG5vZGUgJiBuID0gbm9kZXNbKmldOworICAgIGJvb2wgcjsKKworICAgIGlmIChuLmRpbSA+PSAwKSB7IC8vIG5vZGUKKyAgICAgIGlmIChkZXJlZihwLCBuLmRpbSkgPD0gbi5ib3VuZGFyeSkgLy8gbGVmdAorCXIgPSByZW1vdmUoJm4ubGVmdCwgcCk7CisgICAgICBlbHNlIC8vIHJpZ2h0CisJciA9IHJlbW92ZSgmbi5yaWdodCwgcCk7CisKKyAgICAgIC8vIGlmIHRlcm1pbmFsLCByZW1vdmUgdGhpcyBub2RlCisgICAgICBpZiAobi5sZWZ0ID09IC0xICYmIG4ucmlnaHQgPT0gLTEpCisJKmkgPSAtMTsKKworICAgICAgcmV0dXJuIHI7CisgICAgfSBlbHNlIHsgLy8gbGVhZgorICAgICAgaWYgKG4udmFsdWUgPT0gcCkgeworCSppID0gbi5yaWdodDsKKwlyZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZQorCXJldHVybiByZW1vdmUoJm4ucmlnaHQsIHApOworICAgIH0KKyAgfQorCitwdWJsaWM6CisgIHN0cnVjdCBpZGVudGl0eV9jdG9yIHsKKyAgICBjb25zdCBfX3ZhbHVldHlwZSAmIG9wZXJhdG9yKCkgKGNvbnN0IF9fdmFsdWV0eXBlICYgcmhzKSBjb25zdCB7CisgICAgICByZXR1cm4gcmhzOworICAgIH0KKyAgfTsKKworICAvLyBpbml0aWFsaXplIGFuIGVtcHR5IHRyZWUKKyAgQ3ZLRFRyZWUoX19kZXJlZiBfZGVyZWYgPSBfX2RlcmVmKCkpCisgICAgOiBkZXJlZihfZGVyZWYpLCByb290X25vZGUoLTEpIHsKKyAgfQorICAvLyBnaXZlbiBwb2ludHMsIGluaXRpYWxpemUgYSBiYWxhbmNlZCB0cmVlCisgIEN2S0RUcmVlKF9fdmFsdWV0eXBlICogZmlyc3QsIF9fdmFsdWV0eXBlICogbGFzdCwgaW50IF9wb2ludF9kaW0sCisJICAgX19kZXJlZiBfZGVyZWYgPSBfX2RlcmVmKCkpCisgICAgOiBkZXJlZihfZGVyZWYpIHsKKyAgICBzZXRfZGF0YShmaXJzdCwgbGFzdCwgX3BvaW50X2RpbSwgaWRlbnRpdHlfY3RvcigpKTsKKyAgfQorICAvLyBnaXZlbiBwb2ludHMsIGluaXRpYWxpemUgYSBiYWxhbmNlZCB0cmVlCisgIHRlbXBsYXRlIDwgY2xhc3MgX19pbnN0eXBlLCBjbGFzcyBfX3ZhbHVlY3RvciA+CisgIEN2S0RUcmVlKF9faW5zdHlwZSAqIGZpcnN0LCBfX2luc3R5cGUgKiBsYXN0LCBpbnQgX3BvaW50X2RpbSwKKwkgICBfX3ZhbHVlY3RvciBjdG9yLCBfX2RlcmVmIF9kZXJlZiA9IF9fZGVyZWYoKSkKKyAgICA6IGRlcmVmKF9kZXJlZikgeworICAgIHNldF9kYXRhKGZpcnN0LCBsYXN0LCBfcG9pbnRfZGltLCBjdG9yKTsKKyAgfQorCisgIHZvaWQgc2V0X2RlcmVmKF9fZGVyZWYgX2RlcmVmKSB7CisgICAgZGVyZWYgPSBfZGVyZWY7CisgIH0KKworICB2b2lkIHNldF9kYXRhKF9fdmFsdWV0eXBlICogZmlyc3QsIF9fdmFsdWV0eXBlICogbGFzdCwgaW50IF9wb2ludF9kaW0pIHsKKyAgICBzZXRfZGF0YShmaXJzdCwgbGFzdCwgX3BvaW50X2RpbSwgaWRlbnRpdHlfY3RvcigpKTsKKyAgfQorICB0ZW1wbGF0ZSA8IGNsYXNzIF9faW5zdHlwZSwgY2xhc3MgX192YWx1ZWN0b3IgPgorICB2b2lkIHNldF9kYXRhKF9faW5zdHlwZSAqIGZpcnN0LCBfX2luc3R5cGUgKiBsYXN0LCBpbnQgX3BvaW50X2RpbSwKKwkJX192YWx1ZWN0b3IgY3RvcikgeworICAgIHBvaW50X2RpbSA9IF9wb2ludF9kaW07CisgICAgbm9kZXMuY2xlYXIoKTsKKyAgICBub2Rlcy5yZXNlcnZlKGxhc3QgLSBmaXJzdCk7CisgICAgcm9vdF9ub2RlID0gaW5zZXJ0KGZpcnN0LCBsYXN0LCBjdG9yKTsKKyAgfQorCisgIGludCBkaW1zKCkgY29uc3QgeworICAgIHJldHVybiBwb2ludF9kaW07CisgIH0KKworICAvLyByZW1vdmUgdGhlIGdpdmVuIHBvaW50CisgIGJvb2wgcmVtb3ZlKGNvbnN0IF9fdmFsdWV0eXBlICYgcCkgeworICAgIHJldHVybiByZW1vdmUoJnJvb3Rfbm9kZSwgcCk7CisgIH0KKworICB2b2lkIHByaW50KCkgY29uc3QgeworICAgIHByaW50KHJvb3Rfbm9kZSk7CisgIH0KKyAgdm9pZCBwcmludChpbnQgaSwgaW50IGluZGVudCA9IDApIGNvbnN0IHsKKyAgICBpZiAoaSA9PSAtMSkKKyAgICAgIHJldHVybjsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGluZGVudDsgKytqKQorICAgICAgc3RkOjpjb3V0IDw8ICIgIjsKKyAgICBjb25zdCBub2RlICYgbiA9IG5vZGVzW2ldOworICAgIGlmIChuLmRpbSA+PSAwKSB7CisgICAgICBzdGQ6OmNvdXQgPDwgIm5vZGUgIiA8PCBpIDw8ICIsIGxlZnQgIiA8PCBub2Rlc1tpXS5sZWZ0IDw8ICIsIHJpZ2h0ICIgPDwgCisJbm9kZXNbaV0ucmlnaHQgPDwgIiwgZGltICIgPDwgbm9kZXNbaV0uZGltIDw8ICIsIGJvdW5kYXJ5ICIgPDwgCisJbm9kZXNbaV0uYm91bmRhcnkgPDwgc3RkOjplbmRsOworICAgICAgcHJpbnQobi5sZWZ0LCBpbmRlbnQgKyAzKTsKKyAgICAgIHByaW50KG4ucmlnaHQsIGluZGVudCArIDMpOworICAgIH0gZWxzZQorICAgICAgc3RkOjpjb3V0IDw8ICJsZWFmICIgPDwgaSA8PCAiLCB2YWx1ZSA9ICIgPDwgbm9kZXNbaV0udmFsdWUgPDwgc3RkOjplbmRsOworICB9CisKKyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAvLyBiYmYgc2VhcmNoCitwdWJsaWM6CisgIHN0cnVjdCBiYmZfbm4gewkJLy8gaW5mbyBvbiBmb3VuZCBuZWlnaGJvcnMgKGFwcHJveCBrIG5lYXJlc3QpCisgICAgY29uc3QgX192YWx1ZXR5cGUgKnA7CS8vIG5lYXJlc3QgbmVpZ2hib3IKKyAgICBhY2N1bV90eXBlIGRpc3Q7CQkvLyBkaXN0YW5jZSBmcm9tIGQgdG8gcXVlcnkgcG9pbnQKKyAgICBiYmZfbm4oY29uc3QgX192YWx1ZXR5cGUgJiBfcCwgYWNjdW1fdHlwZSBfZGlzdCkKKyAgICAgIDogcCgmX3ApLCBkaXN0KF9kaXN0KSB7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGJiZl9ubiAmIHJocykgY29uc3QgeworICAgICAgcmV0dXJuIGRpc3QgPCByaHMuZGlzdDsKKyAgICB9CisgIH07CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3IgPCBiYmZfbm4gPiBiYmZfbm5fcHF1ZXVlOworcHJpdmF0ZToKKyAgc3RydWN0IGJiZl9ub2RlIHsJCS8vIGluZm8gb24gYnJhbmNoZXMgbm90IHRha2VuCisgICAgaW50IG5vZGU7CQkJLy8gY29ycmVzcG9uZGluZyBub2RlCisgICAgYWNjdW1fdHlwZSBkaXN0OwkJLy8gbWluaW11bSBkaXN0YW5jZSBmcm9tIGJvdW5kcyB0byBxdWVyeSBwb2ludAorICAgIGJiZl9ub2RlKGludCBfbm9kZSwgYWNjdW1fdHlwZSBfZGlzdCkKKyAgICAgIDogbm9kZShfbm9kZSksIGRpc3QoX2Rpc3QpIHsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgYmJmX25vZGUgJiByaHMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBkaXN0ID4gcmhzLmRpc3Q7CisgICAgfQorICB9OworICB0eXBlZGVmIHN0ZDo6dmVjdG9yIDwgYmJmX25vZGUgPiBiYmZfcHF1ZXVlOworICBtdXRhYmxlIGJiZl9wcXVldWUgdG1wX3BxOworCisgIC8vIGNhbGxlZCBmb3IgYnJhbmNoZXMgbm90IHRha2VuLCBhcyBiYmYgd2Fsa3MgdG8gbGVhZjsKKyAgLy8gY29uc3RydWN0IGJiZl9ub2RlIGdpdmVuIG1pbmltdW0gZGlzdGFuY2UgdG8gYm91bmRzIG9mIGFsdGVybmF0ZSBicmFuY2gKKyAgdm9pZCBwcV9hbHRlcm5hdGUoaW50IGFsdF9uLCBiYmZfcHF1ZXVlICYgcHEsIHNjYWxhcl90eXBlIGRpc3QpIGNvbnN0IHsKKyAgICBpZiAoYWx0X24gPT0gLTEpCisgICAgICByZXR1cm47CisKKyAgICAvLyBhZGQgYmJmX25vZGUgZm9yIGFsdGVybmF0ZSBicmFuY2ggaW4gcHJpb3JpdHkgcXVldWUKKyAgICBwcS5wdXNoX2JhY2soYmJmX25vZGUoYWx0X24sIGRpc3QpKTsKKyAgICBwdXNoX2hlYXAocHEuYmVnaW4oKSwgcHEuZW5kKCkpOworICB9CisKKyAgLy8gY2FsbGVkIGJ5IGJiZiB0byB3YWxrIHRvIGxlYWY7CisgIC8vIHRha2VzIG9uZSBzdGVwIGRvd24gdGhlIHRyZWUgdG93YXJkcyBxdWVyeSBwb2ludCBkCisgIHRlbXBsYXRlIDwgY2xhc3MgX19kZXNjdHlwZSA+CisgIGludCBiYmZfYnJhbmNoKGludCBpLCBjb25zdCBfX2Rlc2N0eXBlICogZCwgYmJmX3BxdWV1ZSAmIHBxKSBjb25zdCB7CisgICAgY29uc3Qgbm9kZSAmIG4gPSBub2Rlc1tpXTsKKyAgICAvLyBwdXNoIGJiZl9ub2RlIHdpdGggYm91bmRzIG9mIGFsdGVybmF0ZSBicmFuY2gsIHRoZW4gYnJhbmNoCisgICAgaWYgKGRbbi5kaW1dIDw9IG4uYm91bmRhcnkpIHsJLy8gbGVmdAorICAgICAgcHFfYWx0ZXJuYXRlKG4ucmlnaHQsIHBxLCBuLmJvdW5kYXJ5IC0gZFtuLmRpbV0pOworICAgICAgcmV0dXJuIG4ubGVmdDsKKyAgICB9IGVsc2UgewkJCS8vIHJpZ2h0CisgICAgICBwcV9hbHRlcm5hdGUobi5sZWZ0LCBwcSwgZFtuLmRpbV0gLSBuLmJvdW5kYXJ5KTsKKyAgICAgIHJldHVybiBuLnJpZ2h0OworICAgIH0KKyAgfQorCisgIC8vIGNvbXB1dGUgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cworICB0ZW1wbGF0ZSA8IGNsYXNzIF9fZGVzY3R5cGUgPgorICBhY2N1bV90eXBlIGRpc3RhbmNlKGNvbnN0IF9fZGVzY3R5cGUgKiBkLCBjb25zdCBfX3ZhbHVldHlwZSAmIHApIGNvbnN0IHsKKyAgICBhY2N1bV90eXBlIGRpc3QgPSAwOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcG9pbnRfZGltOyArK2opIHsKKyAgICAgIGFjY3VtX3R5cGUgZGlmZiA9IGFjY3VtX3R5cGUoZFtqXSkgLSBhY2N1bV90eXBlKGRlcmVmKHAsIGopKTsKKyAgICAgIGRpc3QgKz0gZGlmZiAqIGRpZmY7CisgICAgfSByZXR1cm4gKGFjY3VtX3R5cGUpIHNxcnQoZGlzdCk7CisgIH0KKworICAvLyBjYWxsZWQgcGVyIGNhbmRpZGF0ZSBuZWFyZXN0IG5laWdoYm9yOyBjb25zdHJ1Y3RzIG5ldyBiYmZfbm4gZm9yCisgIC8vIGNhbmRpZGF0ZSBhbmQgYWRkcyBpdCB0byBwcmlvcml0eSBxdWV1ZSBvZiBhbGwgY2FuZGlkYXRlczsgaWYgCisgIC8vIHF1ZXVlIGxlbiBleGNlZWRzIGssIGRyb3BzIHRoZSBwb2ludCBmdXJ0aGVzdCBmcm9tIHF1ZXJ5IHBvaW50IGQuCisgIHRlbXBsYXRlIDwgY2xhc3MgX19kZXNjdHlwZSA+CisgIHZvaWQgYmJmX25ld19ubihiYmZfbm5fcHF1ZXVlICYgbm5fcHEsIGludCBrLCAKKwkJICBjb25zdCBfX2Rlc2N0eXBlICogZCwgY29uc3QgX192YWx1ZXR5cGUgJiBwKSBjb25zdCB7CisgICAgYmJmX25uIG5uKHAsIGRpc3RhbmNlKGQsIHApKTsKKyAgICBpZiAoKGludCkgbm5fcHEuc2l6ZSgpIDwgaykgeworICAgICAgbm5fcHEucHVzaF9iYWNrKG5uKTsKKyAgICAgIHB1c2hfaGVhcChubl9wcS5iZWdpbigpLCBubl9wcS5lbmQoKSk7CisgICAgfSBlbHNlIGlmIChubl9wcVswXS5kaXN0ID4gbm4uZGlzdCkgeworICAgICAgcG9wX2hlYXAobm5fcHEuYmVnaW4oKSwgbm5fcHEuZW5kKCkpOworICAgICAgbm5fcHEuZW5kKClbLTFdID0gbm47CisgICAgICBwdXNoX2hlYXAobm5fcHEuYmVnaW4oKSwgbm5fcHEuZW5kKCkpOworICAgIH0KKyAgICBhc3NlcnQobm5fcHEuc2l6ZSgpIDwgMiB8fCBubl9wcVswXS5kaXN0ID49IG5uX3BxWzFdLmRpc3QpOworICB9CisKK3B1YmxpYzoKKyAgLy8gZmluZHMgKHdpdGggaGlnaCBwcm9iYWJpbGl0eSkgdGhlIGsgbmVhcmVzdCBuZWlnaGJvcnMgb2YgZCwgCisgIC8vIHNlYXJjaGluZyBhdCBtb3N0IGVtYXggbGVhdmVzL2JpbnMuCisgIC8vIHJldF9ubl9wcSBpcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSAoYXQgbW9zdCkgayBuZWFyZXN0IG5laWdoYm9ycyAKKyAgLy8gKHNlZSBiYmZfbm4gc3RydWN0dXJlIGRlZiBhYm92ZSkuCisgIHRlbXBsYXRlIDwgY2xhc3MgX19kZXNjdHlwZSA+CisgIGludCBmaW5kX25uX2JiZihjb25zdCBfX2Rlc2N0eXBlICogZCwgCisJCSAgaW50IGssIGludCBlbWF4LCAKKwkJICBiYmZfbm5fcHF1ZXVlICYgcmV0X25uX3BxKSBjb25zdCB7CisgICAgYXNzZXJ0KGsgPiAwKTsKKyAgICByZXRfbm5fcHEuY2xlYXIoKTsKKworICAgIGlmIChyb290X25vZGUgPT0gLTEpCisgICAgICByZXR1cm4gMDsKKworICAgIC8vIGFkZCByb290X25vZGUgdG8gYmJmX25vZGUgcHJpb3JpdHkgcXVldWU7CisgICAgLy8gaXRlcmF0ZSB3aGlsZSBxdWV1ZSBub24tZW1wdHkgYW5kIGVtYXg+MAorICAgIHRtcF9wcS5jbGVhcigpOworICAgIHRtcF9wcS5wdXNoX2JhY2soYmJmX25vZGUocm9vdF9ub2RlLCAwKSk7CisgICAgd2hpbGUgKHRtcF9wcS5zaXplKCkgJiYgZW1heCA+IDApIHsKKworICAgICAgLy8gZnJvbSBub2RlIG5lYXJlc3QgcXVlcnkgcG9pbnQgZCwgcnVuIHRvIGxlYWYKKyAgICAgIHBvcF9oZWFwKHRtcF9wcS5iZWdpbigpLCB0bXBfcHEuZW5kKCkpOworICAgICAgYmJmX25vZGUgYmJmKHRtcF9wcS5lbmQoKVstMV0pOworICAgICAgdG1wX3BxLmVyYXNlKHRtcF9wcS5lbmQoKSAtIDEpOworCisgICAgICBpbnQgaTsKKyAgICAgIGZvciAoaSA9IGJiZi5ub2RlOworCSAgIGkgIT0gLTEgJiYgbm9kZXNbaV0uZGltID49IDA7IAorCSAgIGkgPSBiYmZfYnJhbmNoKGksIGQsIHRtcF9wcSkpOworCisgICAgICBpZiAoaSAhPSAtMSkgeworCisJLy8gYWRkIHBvaW50cyBpbiBsZWFmL2JpbiB0byByZXRfbm5fcHEKKwlkbyB7CisJICBiYmZfbmV3X25uKHJldF9ubl9wcSwgaywgZCwgbm9kZXNbaV0udmFsdWUpOworCX0gd2hpbGUgKC0xICE9IChpID0gbm9kZXNbaV0ucmlnaHQpKTsKKworCS0tZW1heDsKKyAgICAgIH0KKyAgICB9CisKKyAgICB0bXBfcHEuY2xlYXIoKTsKKyAgICByZXR1cm4gcmV0X25uX3BxLnNpemUoKTsKKyAgfQorCisgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgLy8gb3J0aG9nb25hbCByYW5nZSBzZWFyY2gKK3ByaXZhdGU6CisgIHZvaWQgZmluZF9vcnRob19yYW5nZShpbnQgaSwgc2NhbGFyX3R5cGUgKiBib3VuZHNfbWluLAorCQkJc2NhbGFyX3R5cGUgKiBib3VuZHNfbWF4LAorCQkJc3RkOjp2ZWN0b3IgPCBfX3ZhbHVldHlwZSA+ICZpbmJvdW5kcykgY29uc3QgeworICAgIGlmIChpID09IC0xKQorICAgICAgcmV0dXJuOworICAgIGNvbnN0IG5vZGUgJiBuID0gbm9kZXNbaV07CisgICAgaWYgKG4uZGltID49IDApIHsgLy8gbm9kZQorICAgICAgaWYgKGJvdW5kc19taW5bbi5kaW1dIDw9IG4uYm91bmRhcnkpCisJZmluZF9vcnRob19yYW5nZShuLmxlZnQsIGJvdW5kc19taW4sIGJvdW5kc19tYXgsIGluYm91bmRzKTsKKyAgICAgIGlmIChib3VuZHNfbWF4W24uZGltXSA+IG4uYm91bmRhcnkpCisJZmluZF9vcnRob19yYW5nZShuLnJpZ2h0LCBib3VuZHNfbWluLCBib3VuZHNfbWF4LCBpbmJvdW5kcyk7CisgICAgfSBlbHNlIHsgLy8gbGVhZgorICAgICAgZG8geworCWluYm91bmRzLnB1c2hfYmFjayhub2Rlc1tpXS52YWx1ZSk7CisgICAgICB9IHdoaWxlICgtMSAhPSAoaSA9IG5vZGVzW2ldLnJpZ2h0KSk7CisgICAgfQorICB9CitwdWJsaWM6CisgIC8vIHJldHVybiBhbGwgcG9pbnRzIHRoYXQgbGllIHdpdGhpbiB0aGUgZ2l2ZW4gYm91bmRzOyBpbmJvdW5kcyBpcyBjbGVhcmVkCisgIGludCBmaW5kX29ydGhvX3JhbmdlKHNjYWxhcl90eXBlICogYm91bmRzX21pbiwKKwkJICAgICAgIHNjYWxhcl90eXBlICogYm91bmRzX21heCwKKwkJICAgICAgIHN0ZDo6dmVjdG9yIDwgX192YWx1ZXR5cGUgPiAmaW5ib3VuZHMpIGNvbnN0IHsKKyAgICBpbmJvdW5kcy5jbGVhcigpOworICAgIGZpbmRfb3J0aG9fcmFuZ2Uocm9vdF9ub2RlLCBib3VuZHNfbWluLCBib3VuZHNfbWF4LCBpbmJvdW5kcyk7CisgICAgcmV0dXJuIGluYm91bmRzLnNpemUoKTsKKyAgfQorfTsKKworI2VuZGlmIC8vIF9fY3Zfa2R0cmVlX2hfXworCisvLyBMb2NhbCBWYXJpYWJsZXM6CisvLyBtb2RlOkMrKworLy8gRW5kOgpkaWZmIC0tZ2l0IGEvY3Yvc3JjL19jdmxpc3QuaCBiL2N2L3NyYy9fY3ZsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJiNjNlOQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9fY3ZsaXN0LmgKQEAgLTAsMCArMSwzNzMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9DVl9MSVNUX0hfCisjZGVmaW5lIF9DVl9MSVNUX0hfCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBDVl9GT1JDRV9JTkxJTkUgQ1ZfSU5MSU5FCisKKyNpZiAhZGVmaW5lZChfTElTVF9JTkxJTkUpCisjZGVmaW5lIF9MSVNUX0lOTElORSBDVl9GT1JDRV9JTkxJTkUKKyNlbmRpZiAvKl9MSVNUX0lOTElORSovCisKKyNpZiBkZWZpbmVkIERFQ0xBUkVfTElTVAorI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTIwMAorICAgICNwcmFnbWEgd2FybmluZygiREVDTEFSRV9MSVNUIG1hY3JvIGlzIGFscmVhZHkgZGVmaW5lZCEiKQorI2VuZGlmCisjZW5kaWYgLypERUNMQVJFX0xJU1QqLworCitzdGF0aWMgY29uc3QgbG9uZyBkZWZhdWx0X3NpemUgPSAxMDsKK3N0YXRpYyBjb25zdCBsb25nIGRlZmF1bHRfaW5jX3NpemUgPSAxMDsKKworc3RydWN0IF9wb3MKK3sKKyAgICB2b2lkKiBtX3BvczsKKyNpZmRlZiBfREVCVUcKKyAgICBzdHJ1Y3QgX2xpc3QqIG1fbGlzdDsKKyNlbmRpZiAvKl9ERUJVRyovCit9OwordHlwZWRlZiBzdHJ1Y3QgX3BvcyBDVlBPUzsKK3N0cnVjdCBfbGlzdAoreworICAgIHZvaWQqIG1fYnVmZmVyOworICAgIHZvaWQqIG1fZmlyc3RfYnVmZmVyOworICAgIGxvbmcgbV9idWZfc2l6ZTsgLyogVGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworICAgIGxvbmcgbV9zaXplOyAvKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzICovCisgICAgQ1ZQT1MgbV9oZWFkOworICAgIENWUE9TIG1fdGFpbDsKKyAgICBDVlBPUyBtX2hlYWRfZnJlZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9saXN0IF9DVkxJU1Q7CisKKyNkZWZpbmUgREVDTEFSRV9MSVNUKHR5cGUsIHByZWZpeClcCisgICAgLyogQmFzaWMgZWxlbWVudCBvZiBhIGxpc3QqL1wKKyAgICBzdHJ1Y3QgcHJlZml4IyNlbGVtZW50XyMjdHlwZVwKKyAgICB7XAorICAgICAgICBzdHJ1Y3QgcHJlZml4IyNlbGVtZW50XyMjdHlwZSogbV9wcmV2O1wKKyAgICAgICAgc3RydWN0IHByZWZpeCMjZWxlbWVudF8jI3R5cGUqIG1fbmV4dDtcCisgICAgICAgIHR5cGUgbV9kYXRhO1wKKyAgICB9O1wKKyAgICB0eXBlZGVmIHN0cnVjdCBwcmVmaXgjI2VsZW1lbnRfIyN0eXBlIEVMRU1FTlRfIyN0eXBlO1wKKyAgICAvKiBJbml0aWFsaXphdGlvbiBhbmQgZGVzdHJ1Y3Rpb24qL1wKKyAgICBfTElTVF9JTkxJTkUgX0NWTElTVCogcHJlZml4IyNjcmVhdGVfbGlzdF8jI3R5cGUobG9uZyk7XAorICAgIF9MSVNUX0lOTElORSB2b2lkIHByZWZpeCMjZGVzdHJveV9saXN0XyMjdHlwZShfQ1ZMSVNUKik7XAorICAgIC8qIEFjY2VzcyBmdW5jdGlvbnMqL1wKKyAgICBfTElTVF9JTkxJTkUgQ1ZQT1MgcHJlZml4IyNnZXRfaGVhZF9wb3NfIyN0eXBlKF9DVkxJU1QqKTtcCisgICAgX0xJU1RfSU5MSU5FIENWUE9TIHByZWZpeCMjZ2V0X3RhaWxfcG9zXyMjdHlwZShfQ1ZMSVNUKik7XAorICAgIF9MSVNUX0lOTElORSB0eXBlKiBwcmVmaXgjI2dldF9uZXh0XyMjdHlwZShDVlBPUyopO1wKKyAgICBfTElTVF9JTkxJTkUgdHlwZSogcHJlZml4IyNnZXRfcHJldl8jI3R5cGUoQ1ZQT1MqKTtcCisgICAgLyogTW9kaWZpY2F0aW9uIGZ1bmN0aW9ucyovXAorICAgIF9MSVNUX0lOTElORSB2b2lkIHByZWZpeCMjY2xlYXJfbGlzdF8jI3R5cGUoX0NWTElTVCopO1wKKyAgICBfTElTVF9JTkxJTkUgQ1ZQT1MgcHJlZml4IyNhZGRfaGVhZF8jI3R5cGUoX0NWTElTVCosIHR5cGUqKTtcCisgICAgX0xJU1RfSU5MSU5FIENWUE9TIHByZWZpeCMjYWRkX3RhaWxfIyN0eXBlKF9DVkxJU1QqLCB0eXBlKik7XAorICAgIF9MSVNUX0lOTElORSB2b2lkIHByZWZpeCMjcmVtb3ZlX2hlYWRfIyN0eXBlKF9DVkxJU1QqKTtcCisgICAgX0xJU1RfSU5MSU5FIHZvaWQgcHJlZml4IyNyZW1vdmVfdGFpbF8jI3R5cGUoX0NWTElTVCopO1wKKyAgICBfTElTVF9JTkxJTkUgQ1ZQT1MgcHJlZml4IyNpbnNlcnRfYmVmb3JlXyMjdHlwZShfQ1ZMSVNUKiwgQ1ZQT1MsIHR5cGUqKTtcCisgICAgX0xJU1RfSU5MSU5FIENWUE9TIHByZWZpeCMjaW5zZXJ0X2FmdGVyXyMjdHlwZShfQ1ZMSVNUKiwgQ1ZQT1MsIHR5cGUqKTtcCisgICAgX0xJU1RfSU5MSU5FIHZvaWQgcHJlZml4IyNyZW1vdmVfYXRfIyN0eXBlKF9DVkxJU1QqLCBDVlBPUyk7XAorICAgIF9MSVNUX0lOTElORSB2b2lkIHByZWZpeCMjc2V0XyMjdHlwZShDVlBPUywgdHlwZSopO1wKKyAgICBfTElTVF9JTkxJTkUgdHlwZSogcHJlZml4IyNnZXRfIyN0eXBlKENWUE9TKTtcCisgICAgLyogU3RhdGlzdGljcyBmdW5jdGlvbnMqL1wKKyAgICBfTElTVF9JTkxJTkUgaW50IHByZWZpeCMjZ2V0X2NvdW50XyMjdHlwZShfQ1ZMSVNUKik7CisKKy8qIFRoaXMgbWFjcm8gZmluZHMgYSBzcGFjZSBmb3IgYSBuZXcgZWxlbWVudCBhbmQgcHV0cyBpbiBpbnRvICdlbGVtZW50JyBwb2ludGVyICovCisjZGVmaW5lIElOU0VSVF9ORVcoZWxlbWVudF90eXBlLCBsLCBlbGVtZW50KVwKKyAgICBsLT5tX3NpemUrKztcCisgICAgaWYobC0+bV9oZWFkX2ZyZWUubV9wb3MgIT0gTlVMTClcCisgICAge1wKKyAgICAgICAgZWxlbWVudCA9IChlbGVtZW50X3R5cGUqKShsLT5tX2hlYWRfZnJlZS5tX3Bvcyk7XAorICAgICAgICBpZihlbGVtZW50LT5tX25leHQgIT0gTlVMTClcCisgICAgICAgIHtcCisgICAgICAgICAgICBlbGVtZW50LT5tX25leHQtPm1fcHJldiA9IE5VTEw7XAorICAgICAgICAgICAgbC0+bV9oZWFkX2ZyZWUubV9wb3MgPSBlbGVtZW50LT5tX25leHQ7XAorICAgICAgICB9XAorICAgICAgICBlbHNlXAorICAgICAgICB7XAorICAgICAgICAgICAgbC0+bV9oZWFkX2ZyZWUubV9wb3MgPSBOVUxMO1wKKyAgICAgICAgfVwKKyAgICB9XAorICAgIGVsc2VcCisgICAge1wKKyAgICAgICAgaWYobC0+bV9idWZfc2l6ZSA8IGwtPm1fc2l6ZSAmJiBsLT5tX2hlYWRfZnJlZS5tX3BvcyA9PSBOVUxMKVwKKyAgICAgICAge1wKKyAgICAgICAgICAgICoodm9pZCoqKWwtPm1fYnVmZmVyID0gY3ZBbGxvYyhsLT5tX2J1Zl9zaXplKnNpemVvZihlbGVtZW50X3R5cGUpICsgc2l6ZW9mKHZvaWQqKSk7XAorICAgICAgICAgICAgbC0+bV9idWZmZXIgPSAqKHZvaWQqKilsLT5tX2J1ZmZlcjtcCisgICAgICAgICAgICAqKHZvaWQqKilsLT5tX2J1ZmZlciA9IE5VTEw7XAorICAgICAgICAgICAgZWxlbWVudCA9IChlbGVtZW50X3R5cGUqKSgoY2hhciopbC0+bV9idWZmZXIgKyBzaXplb2Yodm9pZCopKTtcCisgICAgICAgIH1cCisgICAgICAgIGVsc2VcCisgICAgICAgIHtcCisgICAgICAgICAgICBlbGVtZW50ID0gKGVsZW1lbnRfdHlwZSopKChjaGFyKilsLT5tX2J1ZmZlciArIHNpemVvZih2b2lkKikpICsgbC0+bV9zaXplIC0gMTtcCisgICAgICAgIH1cCisgICAgfQorCisvKiBUaGlzIG1hY3JvIGFkZHMgJ2VsZW1lbnQnIHRvIHRoZSBsaXN0IG9mIGZyZWUgZWxlbWVudHMqLworI2RlZmluZSBJTlNFUlRfRlJFRShlbGVtZW50X3R5cGUsIGwsIGVsZW1lbnQpXAorICAgIGlmKGwtPm1faGVhZF9mcmVlLm1fcG9zICE9IE5VTEwpXAorICAgIHtcCisgICAgICAgICgoZWxlbWVudF90eXBlKilsLT5tX2hlYWRfZnJlZS5tX3BvcyktPm1fcHJldiA9IGVsZW1lbnQ7XAorICAgIH1cCisgICAgZWxlbWVudC0+bV9uZXh0ID0gKChlbGVtZW50X3R5cGUqKWwtPm1faGVhZF9mcmVlLm1fcG9zKTtcCisgICAgbC0+bV9oZWFkX2ZyZWUubV9wb3MgPSBlbGVtZW50OworICAgIAorICAgIAorLyojZGVmaW5lIEdFVF9GSVJTVF9GUkVFKGwpICgoRUxFTUVOVF8jI3R5cGUqKShsLT5tX2hlYWRfZnJlZS5tX3BvcykpKi8KKworI2RlZmluZSBJTVBMRU1FTlRfTElTVCh0eXBlLCBwcmVmaXgpXAorX0NWTElTVCogcHJlZml4IyNjcmVhdGVfbGlzdF8jI3R5cGUobG9uZyBzaXplKVwKK3tcCisgICAgX0NWTElTVCogcGwgPSAoX0NWTElTVCopY3ZBbGxvYyhzaXplb2YoX0NWTElTVCkpO1wKKyAgICBwbC0+bV9idWZfc2l6ZSA9IHNpemUgPiAwID8gc2l6ZSA6IGRlZmF1bHRfc2l6ZTtcCisgICAgcGwtPm1fZmlyc3RfYnVmZmVyID0gY3ZBbGxvYyhwbC0+bV9idWZfc2l6ZSpzaXplb2YoRUxFTUVOVF8jI3R5cGUpICsgc2l6ZW9mKHZvaWQqKSk7XAorICAgIHBsLT5tX2J1ZmZlciA9IHBsLT5tX2ZpcnN0X2J1ZmZlcjtcCisgICAgKih2b2lkKiopcGwtPm1fYnVmZmVyID0gTlVMTDtcCisgICAgcGwtPm1fc2l6ZSA9IDA7XAorICAgIHBsLT5tX2hlYWQubV9wb3MgPSBOVUxMO1wKKyAgICBwbC0+bV90YWlsLm1fcG9zID0gTlVMTDtcCisgICAgcGwtPm1faGVhZF9mcmVlLm1fcG9zID0gTlVMTDtcCisgICAgcmV0dXJuIHBsO1wKK31cCit2b2lkIHByZWZpeCMjZGVzdHJveV9saXN0XyMjdHlwZShfQ1ZMSVNUKiBsKVwKK3tcCisgICAgdm9pZCogY3VyID0gbC0+bV9maXJzdF9idWZmZXI7XAorICAgIHZvaWQqIG5leHQ7XAorICAgIHdoaWxlKGN1cilcCisgICAge1wKKyAgICAgICAgbmV4dCA9ICoodm9pZCoqKWN1cjtcCisgICAgICAgIGN2RnJlZSgmY3VyKTtcCisgICAgICAgIGN1ciA9IG5leHQ7XAorICAgIH1cCisgICAgY3ZGcmVlKCZsKTtcCit9XAorQ1ZQT1MgcHJlZml4IyNnZXRfaGVhZF9wb3NfIyN0eXBlKF9DVkxJU1QqIGwpXAore1wKKyAgICByZXR1cm4gbC0+bV9oZWFkO1wKK31cCitDVlBPUyBwcmVmaXgjI2dldF90YWlsX3Bvc18jI3R5cGUoX0NWTElTVCogbClcCit7XAorICAgIHJldHVybiBsLT5tX3RhaWw7XAorfVwKK3R5cGUqIHByZWZpeCMjZ2V0X25leHRfIyN0eXBlKENWUE9TKiBwb3MpXAore1wKKyAgICBpZihwb3MtPm1fcG9zKVwKKyAgICB7XAorICAgICAgICBFTEVNRU5UXyMjdHlwZSogZWxlbWVudCA9IChFTEVNRU5UXyMjdHlwZSopKHBvcy0+bV9wb3MpO1wKKyAgICAgICAgcG9zLT5tX3BvcyA9IGVsZW1lbnQtPm1fbmV4dDtcCisgICAgICAgIHJldHVybiAmZWxlbWVudC0+bV9kYXRhO1wKKyAgICB9XAorICAgIGVsc2VcCisgICAge1wKKyAgICAgICAgcmV0dXJuIE5VTEw7XAorICAgIH1cCit9XAordHlwZSogcHJlZml4IyNnZXRfcHJldl8jI3R5cGUoQ1ZQT1MqIHBvcylcCit7XAorICAgIGlmKHBvcy0+bV9wb3MpXAorICAgIHtcCisgICAgICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50ID0gKEVMRU1FTlRfIyN0eXBlKikocG9zLT5tX3Bvcyk7XAorICAgICAgICBwb3MtPm1fcG9zID0gZWxlbWVudC0+bV9wcmV2O1wKKyAgICAgICAgcmV0dXJuICZlbGVtZW50LT5tX2RhdGE7XAorICAgIH1cCisgICAgZWxzZVwKKyAgICB7XAorICAgICAgICByZXR1cm4gTlVMTDtcCisgICAgfVwKK31cCitpbnQgcHJlZml4IyNpc19wb3NfIyN0eXBlKENWUE9TIHBvcylcCit7XAorICAgIHJldHVybiAhIXBvcy5tX3BvcztcCit9XAordm9pZCBwcmVmaXgjI2NsZWFyX2xpc3RfIyN0eXBlKF9DVkxJU1QqIGwpXAore1wKKyAgICBsLT5tX2hlYWQubV9wb3MgPSBOVUxMO1wKKyAgICBsLT5tX3RhaWwubV9wb3MgPSBOVUxMO1wKKyAgICBsLT5tX3NpemUgPSAwO1wKKyAgICBsLT5tX2hlYWRfZnJlZS5tX3BvcyA9IE5VTEw7XAorfVwKK0NWUE9TIHByZWZpeCMjYWRkX2hlYWRfIyN0eXBlKF9DVkxJU1QqIGwsIHR5cGUqIGRhdGEpXAore1wKKyAgICBFTEVNRU5UXyMjdHlwZSogZWxlbWVudDtcCisgICAgSU5TRVJUX05FVyhFTEVNRU5UXyMjdHlwZSwgbCwgZWxlbWVudCk7XAorICAgIGVsZW1lbnQtPm1fcHJldiA9IE5VTEw7XAorICAgIGVsZW1lbnQtPm1fbmV4dCA9IChFTEVNRU5UXyMjdHlwZSopKGwtPm1faGVhZC5tX3Bvcyk7XAorICAgIG1lbWNweSgmKGVsZW1lbnQtPm1fZGF0YSksIGRhdGEsIHNpemVvZigqZGF0YSkpO1wKKyAgICBpZihlbGVtZW50LT5tX25leHQpXAorICAgIHtcCisgICAgICAgIGVsZW1lbnQtPm1fbmV4dC0+bV9wcmV2ID0gZWxlbWVudDtcCisgICAgfVwKKyAgICBlbHNlXAorICAgIHtcCisgICAgICAgIGwtPm1fdGFpbC5tX3BvcyA9IGVsZW1lbnQ7XAorICAgIH1cCisgICAgbC0+bV9oZWFkLm1fcG9zID0gZWxlbWVudDtcCisgICAgcmV0dXJuIGwtPm1faGVhZDtcCit9XAorQ1ZQT1MgcHJlZml4IyNhZGRfdGFpbF8jI3R5cGUoX0NWTElTVCogbCwgdHlwZSogZGF0YSlcCit7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50O1wKKyAgICBJTlNFUlRfTkVXKEVMRU1FTlRfIyN0eXBlLCBsLCBlbGVtZW50KTtcCisgICAgZWxlbWVudC0+bV9uZXh0ID0gTlVMTDtcCisgICAgZWxlbWVudC0+bV9wcmV2ID0gKEVMRU1FTlRfIyN0eXBlKikobC0+bV90YWlsLm1fcG9zKTtcCisgICAgbWVtY3B5KCYoZWxlbWVudC0+bV9kYXRhKSwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7XAorICAgIGlmKGVsZW1lbnQtPm1fcHJldilcCisgICAge1wKKyAgICAgICAgZWxlbWVudC0+bV9wcmV2LT5tX25leHQgPSBlbGVtZW50O1wKKyAgICB9XAorICAgIGVsc2VcCisgICAge1wKKyAgICAgICAgbC0+bV9oZWFkLm1fcG9zID0gZWxlbWVudDtcCisgICAgfVwKKyAgICBsLT5tX3RhaWwubV9wb3MgPSBlbGVtZW50O1wKKyAgICByZXR1cm4gbC0+bV90YWlsO1wKK31cCit2b2lkIHByZWZpeCMjcmVtb3ZlX2hlYWRfIyN0eXBlKF9DVkxJU1QqIGwpXAore1wKKyAgICBFTEVNRU5UXyMjdHlwZSogZWxlbWVudCA9ICgoRUxFTUVOVF8jI3R5cGUqKShsLT5tX2hlYWQubV9wb3MpKTtcCisgICAgaWYoZWxlbWVudC0+bV9uZXh0ICE9IE5VTEwpXAorICAgIHtcCisgICAgICAgIGVsZW1lbnQtPm1fbmV4dC0+bV9wcmV2ID0gTlVMTDtcCisgICAgfVwKKyAgICBsLT5tX2hlYWQubV9wb3MgPSBlbGVtZW50LT5tX25leHQ7XAorICAgIElOU0VSVF9GUkVFKEVMRU1FTlRfIyN0eXBlLCBsLCBlbGVtZW50KTtcCisgICAgbC0+bV9zaXplLS07XAorfVwKK3ZvaWQgcHJlZml4IyNyZW1vdmVfdGFpbF8jI3R5cGUoX0NWTElTVCogbClcCit7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50ID0gKChFTEVNRU5UXyMjdHlwZSopKGwtPm1fdGFpbC5tX3BvcykpO1wKKyAgICBpZihlbGVtZW50LT5tX3ByZXYgIT0gTlVMTClcCisgICAge1wKKyAgICAgICAgZWxlbWVudC0+bV9wcmV2LT5tX25leHQgPSBOVUxMO1wKKyAgICB9XAorICAgIGwtPm1fdGFpbC5tX3BvcyA9IGVsZW1lbnQtPm1fcHJldjtcCisgICAgSU5TRVJUX0ZSRUUoRUxFTUVOVF8jI3R5cGUsIGwsIGVsZW1lbnQpO1wKKyAgICBsLT5tX3NpemUtLTtcCit9XAorQ1ZQT1MgcHJlZml4IyNpbnNlcnRfYWZ0ZXJfIyN0eXBlKF9DVkxJU1QqIGwsIENWUE9TIHBvcywgdHlwZSogZGF0YSlcCit7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50O1wKKyAgICBFTEVNRU5UXyMjdHlwZSogYmVmb3JlO1wKKyAgICBDVlBPUyBuZXdwb3M7XAorICAgIElOU0VSVF9ORVcoRUxFTUVOVF8jI3R5cGUsIGwsIGVsZW1lbnQpO1wKKyAgICBtZW1jcHkoJihlbGVtZW50LT5tX2RhdGEpLCBkYXRhLCBzaXplb2YoKmRhdGEpKTtcCisgICAgYmVmb3JlID0gKEVMRU1FTlRfIyN0eXBlKilwb3MubV9wb3M7XAorICAgIGVsZW1lbnQtPm1fcHJldiA9IGJlZm9yZTtcCisgICAgZWxlbWVudC0+bV9uZXh0ID0gYmVmb3JlLT5tX25leHQ7XAorICAgIGJlZm9yZS0+bV9uZXh0ID0gZWxlbWVudDtcCisgICAgaWYoZWxlbWVudC0+bV9uZXh0ICE9IE5VTEwpXAorICAgICAgICBlbGVtZW50LT5tX25leHQtPm1fcHJldiA9IGVsZW1lbnQ7XAorICAgIGVsc2VcCisgICAgICAgIGwtPm1fdGFpbC5tX3BvcyA9IGVsZW1lbnQ7XAorICAgIG5ld3Bvcy5tX3BvcyA9IGVsZW1lbnQ7XAorICAgIHJldHVybiBuZXdwb3M7XAorfVwKK0NWUE9TIHByZWZpeCMjaW5zZXJ0X2JlZm9yZV8jI3R5cGUoX0NWTElTVCogbCwgQ1ZQT1MgcG9zLCB0eXBlKiBkYXRhKVwKK3tcCisgICAgRUxFTUVOVF8jI3R5cGUqIGVsZW1lbnQ7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBhZnRlcjtcCisgICAgQ1ZQT1MgbmV3cG9zO1wKKyAgICBJTlNFUlRfTkVXKEVMRU1FTlRfIyN0eXBlLCBsLCBlbGVtZW50KTtcCisgICAgbWVtY3B5KCYoZWxlbWVudC0+bV9kYXRhKSwgZGF0YSwgc2l6ZW9mKCpkYXRhKSk7XAorICAgIGFmdGVyID0gKEVMRU1FTlRfIyN0eXBlKilwb3MubV9wb3M7XAorICAgIGVsZW1lbnQtPm1fcHJldiA9IGFmdGVyLT5tX3ByZXY7XAorICAgIGVsZW1lbnQtPm1fbmV4dCA9IGFmdGVyO1wKKyAgICBhZnRlci0+bV9wcmV2ID0gZWxlbWVudDtcCisgICAgaWYoZWxlbWVudC0+bV9wcmV2ICE9IE5VTEwpXAorICAgICAgICBlbGVtZW50LT5tX3ByZXYtPm1fbmV4dCA9IGVsZW1lbnQ7XAorICAgIGVsc2VcCisgICAgICAgIGwtPm1faGVhZC5tX3BvcyA9IGVsZW1lbnQ7XAorICAgIG5ld3Bvcy5tX3BvcyA9IGVsZW1lbnQ7XAorICAgIHJldHVybiBuZXdwb3M7XAorfVwKK3ZvaWQgcHJlZml4IyNyZW1vdmVfYXRfIyN0eXBlKF9DVkxJU1QqIGwsIENWUE9TIHBvcylcCit7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50ID0gKChFTEVNRU5UXyMjdHlwZSopcG9zLm1fcG9zKTtcCisgICAgaWYoZWxlbWVudC0+bV9wcmV2ICE9IE5VTEwpXAorICAgIHtcCisgICAgICAgIGVsZW1lbnQtPm1fcHJldi0+bV9uZXh0ID0gZWxlbWVudC0+bV9uZXh0O1wKKyAgICB9XAorICAgIGVsc2VcCisgICAge1wKKyAgICAgICAgbC0+bV9oZWFkLm1fcG9zID0gZWxlbWVudC0+bV9uZXh0O1wKKyAgICB9XAorICAgIGlmKGVsZW1lbnQtPm1fbmV4dCAhPSBOVUxMKVwKKyAgICB7XAorICAgICAgICBlbGVtZW50LT5tX25leHQtPm1fcHJldiA9IGVsZW1lbnQtPm1fcHJldjtcCisgICAgfVwKKyAgICBlbHNlXAorICAgIHtcCisgICAgICAgIGwtPm1fdGFpbC5tX3BvcyA9IGVsZW1lbnQtPm1fcHJldjtcCisgICAgfVwKKyAgICBJTlNFUlRfRlJFRShFTEVNRU5UXyMjdHlwZSwgbCwgZWxlbWVudCk7XAorICAgIGwtPm1fc2l6ZS0tO1wKK31cCit2b2lkIHByZWZpeCMjc2V0XyMjdHlwZShDVlBPUyBwb3MsIHR5cGUqIGRhdGEpXAore1wKKyAgICBFTEVNRU5UXyMjdHlwZSogZWxlbWVudCA9ICgoRUxFTUVOVF8jI3R5cGUqKShwb3MubV9wb3MpKTtcCisgICAgbWVtY3B5KCYoZWxlbWVudC0+bV9kYXRhKSwgZGF0YSwgc2l6ZW9mKGRhdGEpKTtcCit9XAordHlwZSogcHJlZml4IyNnZXRfIyN0eXBlKENWUE9TIHBvcylcCit7XAorICAgIEVMRU1FTlRfIyN0eXBlKiBlbGVtZW50ID0gKChFTEVNRU5UXyMjdHlwZSopKHBvcy5tX3BvcykpO1wKKyAgICByZXR1cm4gJihlbGVtZW50LT5tX2RhdGEpO1wKK31cCitpbnQgcHJlZml4IyNnZXRfY291bnRfIyN0eXBlKF9DVkxJU1QqIGxpc3QpXAore1wKKyAgICByZXR1cm4gbGlzdC0+bV9zaXplO1wKK30KKworI2RlZmluZSBERUNMQVJFX0FORF9JTVBMRU1FTlRfTElTVCh0eXBlLCBwcmVmaXgpXAorICAgIERFQ0xBUkVfTElTVCh0eXBlLCBwcmVmaXgpXAorICAgIElNUExFTUVOVF9MSVNUKHR5cGUsIHByZWZpeCkKKwordHlwZWRlZiBzdHJ1Y3QgX19pbmRleAoreworICAgIGludCB2YWx1ZTsKKyAgICBmbG9hdCByaG8sIHRoZXRhOworfQorX2luZGV4OworCitERUNMQVJFX0xJU1QoIF9pbmRleCwgaF8gKQorCisjZW5kaWYvKl9DVl9MSVNUX0hfKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9fY3ZtYXRyaXguaCBiL2N2L3NyYy9fY3ZtYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjRjNTkxCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL19jdm1hdHJpeC5oCkBAIC0wLDAgKzEsNDA1IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfQ1ZfTUFUUklYX0hfCisjZGVmaW5lIF9DVl9NQVRSSVhfSF8KKworI2RlZmluZSBpY3ZDb3B5VmVjdG9yKCBzcmMsIGRzdCwgbGVuICkgbWVtY3B5KCAoZHN0KSwgKHNyYyksIChsZW4pKnNpemVvZigoZHN0KVswXSkpCisjZGVmaW5lIGljdlNldFplcm8oIGRzdCwgbGVuICkgbWVtc2V0KCAoZHN0KSwgMCwgKGxlbikqc2l6ZW9mKChkc3QpWzBdKSkKKworI2RlZmluZSBpY3ZDb3B5VmVjdG9yXzMyZiggc3JjLCBsZW4sIGRzdCApIG1lbWNweSgoZHN0KSwoc3JjKSwobGVuKSpzaXplb2YoZmxvYXQpKQorI2RlZmluZSBpY3ZTZXRaZXJvXzMyZiggZHN0LCBjb2xzLCByb3dzICkgbWVtc2V0KChkc3QpLDAsKHJvd3MpKihjb2xzKSpzaXplb2YoZmxvYXQpKQorI2RlZmluZSBpY3ZDb3B5VmVjdG9yXzY0ZCggc3JjLCBsZW4sIGRzdCApIG1lbWNweSgoZHN0KSwoc3JjKSwobGVuKSpzaXplb2YoZG91YmxlKSkKKyNkZWZpbmUgaWN2U2V0WmVyb182NGQoIGRzdCwgY29scywgcm93cyApIG1lbXNldCgoZHN0KSwwLChyb3dzKSooY29scykqc2l6ZW9mKGRvdWJsZSkpCisjZGVmaW5lIGljdkNvcHlNYXRyaXhfMzJmKCBzcmMsIHcsIGgsIGRzdCApIG1lbWNweSgoZHN0KSwoc3JjKSwodykqKGgpKnNpemVvZihmbG9hdCkpCisjZGVmaW5lIGljdkNvcHlNYXRyaXhfNjRkKCBzcmMsIHcsIGgsIGRzdCApIG1lbWNweSgoZHN0KSwoc3JjKSwodykqKGgpKnNpemVvZihkb3VibGUpKQorCisjZGVmaW5lIGljdkNyZWF0ZVZlY3Rvcl8zMmYoIGxlbiApICAoZmxvYXQqKWN2QWxsb2MoIChsZW4pKnNpemVvZihmbG9hdCkpCisjZGVmaW5lIGljdkNyZWF0ZVZlY3Rvcl82NGQoIGxlbiApICAoZG91YmxlKiljdkFsbG9jKCAobGVuKSpzaXplb2YoZG91YmxlKSkKKyNkZWZpbmUgaWN2Q3JlYXRlTWF0cml4XzMyZiggdywgaCApICAoZmxvYXQqKWN2QWxsb2MoICh3KSooaCkqc2l6ZW9mKGZsb2F0KSkKKyNkZWZpbmUgaWN2Q3JlYXRlTWF0cml4XzY0ZCggdywgaCApICAoZG91YmxlKiljdkFsbG9jKCAodykqKGgpKnNpemVvZihkb3VibGUpKQorCisjZGVmaW5lIGljdkRlbGV0ZVZlY3RvciggdmVjICkgIGN2RnJlZSggJih2ZWMpICkKKyNkZWZpbmUgaWN2RGVsZXRlTWF0cml4IGljdkRlbGV0ZVZlY3RvcgorCisjZGVmaW5lIGljdkFkZE1hdHJpeF8zMmYoIHNyYzEsIHNyYzIsIGRzdCwgdywgaCApIFwKKyAgICBpY3ZBZGRWZWN0b3JfMzJmKCAoc3JjMSksIChzcmMyKSwgKGRzdCksICh3KSooaCkpCisKKyNkZWZpbmUgaWN2U3ViTWF0cml4XzMyZiggc3JjMSwgc3JjMiwgZHN0LCB3LCBoICkgXAorICAgIGljdlN1YlZlY3Rvcl8zMmYoIChzcmMxKSwgKHNyYzIpLCAoZHN0KSwgKHcpKihoKSkKKworI2RlZmluZSBpY3ZOb3JtVmVjdG9yXzMyZiggc3JjLCBsZW4gKSAgXAorICAgIHNxcnQoaWN2RG90UHJvZHVjdF8zMmYoIHNyYywgc3JjLCBsZW4gKSkKKworI2RlZmluZSBpY3ZOb3JtVmVjdG9yXzY0ZCggc3JjLCBsZW4gKSAgXAorICAgIHNxcnQoaWN2RG90UHJvZHVjdF82NGQoIHNyYywgc3JjLCBsZW4gKSkKKworCisjZGVmaW5lIGljdkRlbGV0ZU1hdHJpeCBpY3ZEZWxldGVWZWN0b3IKKworI2RlZmluZSBpY3ZDaGVja1ZlY3Rvcl82NGYoIHB0ciwgbGVuICkKKyNkZWZpbmUgaWN2Q2hlY2tWZWN0b3JfMzJmKCBwdHIsIGxlbiApCisKK0NWX0lOTElORSBkb3VibGUgaWN2U3VtXzMyZiggY29uc3QgZmxvYXQqIHNyYywgaW50IGxlbiApCit7CisgICAgZG91YmxlIHMgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSBzICs9IHNyY1tpXTsKKworICAgIGljdkNoZWNrVmVjdG9yXzY0ZiggJnMsIDEgKTsKKworICAgIHJldHVybiBzOworfQorCitDVl9JTkxJTkUgZG91YmxlIGljdkRvdFByb2R1Y3RfMzJmKCBjb25zdCBmbG9hdCogc3JjMSwgY29uc3QgZmxvYXQqIHNyYzIsIGludCBsZW4gKQoreworICAgIGRvdWJsZSBzID0gMDsKKyAgICBmb3IoIGludCBpID0gMDsgaSA8IGxlbjsgaSsrICkgcyArPSBzcmMxW2ldKnNyYzJbaV07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoICZzLCAxICk7CisKKyAgICByZXR1cm4gczsKK30KKworCitDVl9JTkxJTkUgZG91YmxlIGljdkRvdFByb2R1Y3RfNjRmKCBjb25zdCBkb3VibGUqIHNyYzEsIGNvbnN0IGRvdWJsZSogc3JjMiwgaW50IGxlbiApCit7CisgICAgZG91YmxlIHMgPSAwOworICAgIGZvciggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSBzICs9IHNyYzFbaV0qc3JjMltpXTsKKworICAgIGljdkNoZWNrVmVjdG9yXzY0ZiggJnMsIDEgKTsKKworICAgIHJldHVybiBzOworfQorCisKK0NWX0lOTElORSB2b2lkIGljdk11bFZlY3RvcnNfMzJmKCBjb25zdCBmbG9hdCogc3JjMSwgY29uc3QgZmxvYXQqIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRzdCwgaW50IGxlbiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gc3JjMVtpXSAqIHNyYzJbaV07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl8zMmYoIGRzdCwgbGVuICk7Cit9CisKK0NWX0lOTElORSB2b2lkIGljdk11bFZlY3RvcnNfNjRkKCBjb25zdCBkb3VibGUqIHNyYzEsIGNvbnN0IGRvdWJsZSogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRzdCwgaW50IGxlbiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gc3JjMVtpXSAqIHNyYzJbaV07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoIGRzdCwgbGVuICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgaWN2QWRkVmVjdG9yXzMyZiggY29uc3QgZmxvYXQqIHNyYzEsIGNvbnN0IGZsb2F0KiBzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3QsIGludCBsZW4gKQoreworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IHNyYzFbaV0gKyBzcmMyW2ldOworCisgICAgaWN2Q2hlY2tWZWN0b3JfMzJmKCBkc3QsIGxlbiApOworfQorCitDVl9JTkxJTkUgdm9pZCBpY3ZBZGRWZWN0b3JfNjRkKCBjb25zdCBkb3VibGUqIHNyYzEsIGNvbnN0IGRvdWJsZSogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRzdCwgaW50IGxlbiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gc3JjMVtpXSArIHNyYzJbaV07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoIGRzdCwgbGVuICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgaWN2U3ViVmVjdG9yXzMyZiggY29uc3QgZmxvYXQqIHNyYzEsIGNvbnN0IGZsb2F0KiBzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3QsIGludCBsZW4gKQoreworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IHNyYzFbaV0gLSBzcmMyW2ldOworCisgICAgaWN2Q2hlY2tWZWN0b3JfMzJmKCBkc3QsIGxlbiApOworfQorCitDVl9JTkxJTkUgdm9pZCBpY3ZTdWJWZWN0b3JfNjRkKCBjb25zdCBkb3VibGUqIHNyYzEsIGNvbnN0IGRvdWJsZSogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRzdCwgaW50IGxlbiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gc3JjMVtpXSAtIHNyYzJbaV07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoIGRzdCwgbGVuICk7Cit9CisKKworI2RlZmluZSBpY3ZBZGRNYXRyaXhfNjRkKCBzcmMxLCBzcmMyLCBkc3QsIHcsIGggKSBcCisgICAgaWN2QWRkVmVjdG9yXzY0ZCggKHNyYzEpLCAoc3JjMiksIChkc3QpLCAodykqKGgpKQorCisjZGVmaW5lIGljdlN1Yk1hdHJpeF82NGQoIHNyYzEsIHNyYzIsIGRzdCwgdywgaCApIFwKKyAgICBpY3ZTdWJWZWN0b3JfNjRkKCAoc3JjMSksIChzcmMyKSwgKGRzdCksICh3KSooaCkpCisKKworQ1ZfSU5MSU5FIHZvaWQgaWN2U2V0SWRlbnRpdHlfMzJmKCBmbG9hdCogZHN0LCBpbnQgdywgaW50IGggKQoreworICAgIGludCBpLCBsZW4gPSBNSU4oIHcsIGggKTsKKyAgICBpY3ZTZXRaZXJvXzMyZiggZHN0LCB3LCBoICk7CisgICAgZm9yKCBpID0gMDsgbGVuLS07IGkgKz0gdysxICkKKyAgICAgICAgZHN0W2ldID0gMS5mOworfQorCisKK0NWX0lOTElORSB2b2lkIGljdlNldElkZW50aXR5XzY0ZCggZG91YmxlKiBkc3QsIGludCB3LCBpbnQgaCApCit7CisgICAgaW50IGksIGxlbiA9IE1JTiggdywgaCApOworICAgIGljdlNldFplcm9fNjRkKCBkc3QsIHcsIGggKTsKKyAgICBmb3IoIGkgPSAwOyBsZW4tLTsgaSArPSB3KzEgKQorICAgICAgICBkc3RbaV0gPSAxLjsKK30KKworCitDVl9JTkxJTkUgdm9pZCBpY3ZUcmFjZV8zMmYoIGNvbnN0IGZsb2F0KiBzcmMsIGludCB3LCBpbnQgaCwgZmxvYXQqIHRyYWNlICkKK3sKKyAgICBpbnQgaSwgbGVuID0gTUlOKCB3LCBoICk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKCBpID0gMDsgbGVuLS07IGkgKz0gdysxICkKKyAgICAgICAgc3VtICs9IHNyY1tpXTsKKyAgICAqdHJhY2UgPSAoZmxvYXQpc3VtOworCisgICAgaWN2Q2hlY2tWZWN0b3JfNjRmKCAmc3VtLCAxICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgaWN2VHJhY2VfNjRkKCBjb25zdCBkb3VibGUqIHNyYywgaW50IHcsIGludCBoLCBkb3VibGUqIHRyYWNlICkKK3sKKyAgICBpbnQgaSwgbGVuID0gTUlOKCB3LCBoICk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKCBpID0gMDsgbGVuLS07IGkgKz0gdysxICkKKyAgICAgICAgc3VtICs9IHNyY1tpXTsKKyAgICAqdHJhY2UgPSBzdW07CisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoICZzdW0sIDEgKTsKK30KKworCitDVl9JTkxJTkUgdm9pZCBpY3ZTY2FsZVZlY3Rvcl8zMmYoIGNvbnN0IGZsb2F0KiBzcmMsIGZsb2F0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGRvdWJsZSBzY2FsZSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gKGZsb2F0KShzcmNbaV0qc2NhbGUpOworCisgICAgaWN2Q2hlY2tWZWN0b3JfMzJmKCBkc3QsIGxlbiApOworfQorCisKK0NWX0lOTElORSB2b2lkIGljdlNjYWxlVmVjdG9yXzY0ZCggY29uc3QgZG91YmxlKiBzcmMsIGRvdWJsZSogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuLCBkb3VibGUgc2NhbGUgKQoreworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSpzY2FsZTsKKworICAgIGljdkNoZWNrVmVjdG9yXzY0ZiggZHN0LCBsZW4gKTsKK30KKworCitDVl9JTkxJTkUgdm9pZCBpY3ZUcmFuc3Bvc2VNYXRyaXhfMzJmKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgdywgaW50IGgsIGZsb2F0KiBkc3QgKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yKCBpID0gMDsgaSA8IHc7IGkrKyApCisgICAgICAgIGZvciggaiA9IDA7IGogPCBoOyBqKysgKQorICAgICAgICAgICAgKmRzdCsrID0gc3JjW2oqdyArIGldOworICAgICAgICAKKyAgICBpY3ZDaGVja1ZlY3Rvcl8zMmYoIGRzdCwgdypoICk7Cit9CisKK0NWX0lOTElORSB2b2lkIGljdlRyYW5zcG9zZU1hdHJpeF82NGQoIGNvbnN0IGRvdWJsZSogc3JjLCBpbnQgdywgaW50IGgsIGRvdWJsZSogZHN0ICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciggaSA9IDA7IGkgPCB3OyBpKysgKQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgaDsgaisrICkKKyAgICAgICAgICAgICpkc3QrKyA9IHNyY1tqKncgKyBpXTsKKworICAgIGljdkNoZWNrVmVjdG9yXzY0ZiggZHN0LCB3KmggKTsKK30KKworQ1ZfSU5MSU5FIHZvaWQgaWN2RGV0TWF0cml4M3gzXzY0ZCggY29uc3QgZG91YmxlKiBtYXQsIGRvdWJsZSogZGV0ICkKK3sKKyAgICAjZGVmaW5lIG0oeSx4KSBtYXRbKHkpKjMgKyAoeCldCisgICAgCisgICAgKmRldCA9IG0oMCwwKSoobSgxLDEpKm0oMiwyKSAtIG0oMSwyKSptKDIsMSkpIC0KKyAgICAgICAgICAgbSgwLDEpKihtKDEsMCkqbSgyLDIpIC0gbSgxLDIpKm0oMiwwKSkgKworICAgICAgICAgICBtKDAsMikqKG0oMSwwKSptKDIsMSkgLSBtKDEsMSkqbSgyLDApKTsKKworICAgICN1bmRlZiBtCisKKyAgICBpY3ZDaGVja1ZlY3Rvcl82NGYoIGRldCwgMSApOworfQorCisKK0NWX0lOTElORSB2b2lkIGljdk11bE1hdHJpeF8zMmYoIGNvbnN0IGZsb2F0KiBzcmMxLCBpbnQgdzEsIGludCBoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMyLCBpbnQgdzIsIGludCBoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3QgKQoreworICAgIGludCBpLCBqLCBrOworCisgICAgaWYoIHcxICE9IGgyICkKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBoMTsgaSsrLCBzcmMxICs9IHcxLCBkc3QgKz0gdzIgKQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgdzI7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzID0gMDsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCB3MTsgaysrICkKKyAgICAgICAgICAgICAgICBzICs9IHNyYzFba10qc3JjMltqICsgayp3Ml07CisgICAgICAgICAgICBkc3Rbal0gPSAoZmxvYXQpczsKKyAgICAgICAgfQorCisgICAgaWN2Q2hlY2tWZWN0b3JfMzJmKCBkc3QsIGgxKncyICk7Cit9CisKKworQ1ZfSU5MSU5FIHZvaWQgaWN2TXVsTWF0cml4XzY0ZCggY29uc3QgZG91YmxlKiBzcmMxLCBpbnQgdzEsIGludCBoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjMiwgaW50IHcyLCBpbnQgaDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRzdCApCit7CisgICAgaW50IGksIGosIGs7CisKKyAgICBpZiggdzEgIT0gaDIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IGgxOyBpKyssIHNyYzEgKz0gdzEsIGRzdCArPSB3MiApCisgICAgICAgIGZvciggaiA9IDA7IGogPCB3MjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHcxOyBrKysgKQorICAgICAgICAgICAgICAgIHMgKz0gc3JjMVtrXSpzcmMyW2ogKyBrKncyXTsKKyAgICAgICAgICAgIGRzdFtqXSA9IHM7CisgICAgICAgIH0KKworICAgIGljdkNoZWNrVmVjdG9yXzY0ZiggZHN0LCBoMSp3MiApOworfQorCisKKyNkZWZpbmUgaWN2VHJhbnNmb3JtVmVjdG9yXzMyZiggbWF0ciwgc3JjLCBkc3QsIHcsIGggKSBcCisgICAgaWN2TXVsTWF0cml4XzMyZiggbWF0ciwgdywgaCwgc3JjLCAxLCB3LCBkc3QgKQorCisjZGVmaW5lIGljdlRyYW5zZm9ybVZlY3Rvcl82NGQoIG1hdHIsIHNyYywgZHN0LCB3LCBoICkgXAorICAgIGljdk11bE1hdHJpeF82NGQoIG1hdHIsIHcsIGgsIHNyYywgMSwgdywgZHN0ICkKKworCisjZGVmaW5lIGljdlNjYWxlTWF0cml4XzMyZiggc3JjLCBkc3QsIHcsIGgsIHNjYWxlICkgXAorICAgIGljdlNjYWxlVmVjdG9yXzMyZiggKHNyYyksIChkc3QpLCAodykqKGgpLCAoc2NhbGUpICkKKworI2RlZmluZSBpY3ZTY2FsZU1hdHJpeF82NGQoIHNyYywgZHN0LCB3LCBoLCBzY2FsZSApIFwKKyAgICBpY3ZTY2FsZVZlY3Rvcl82NGQoIChzcmMpLCAoZHN0KSwgKHcpKihoKSwgKHNjYWxlKSApCisKKyNkZWZpbmUgaWN2RG90UHJvZHVjdF82NGQgaWN2RG90UHJvZHVjdF82NGYKKworCitDVl9JTkxJTkUgdm9pZCBpY3ZJbnZlcnRNYXRyaXhfNjRkKCBkb3VibGUqIEEsIGludCBuLCBkb3VibGUqIGludkEgKQoreworICAgIEN2TWF0IEFtID0gY3ZNYXQoIG4sIG4sIENWXzY0RiwgQSApOworICAgIEN2TWF0IGludkFtID0gY3ZNYXQoIG4sIG4sIENWXzY0RiwgaW52QSApOworCisgICAgY3ZJbnZlcnQoICZBbSwgJmludkFtLCBDVl9TVkQgKTsKK30KKworQ1ZfSU5MSU5FIHZvaWQgaWN2TXVsVHJhbnNNYXRyaXhSXzY0ZCggZG91YmxlKiBzcmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZG91YmxlKiBkc3QgKQoreworICAgIEN2TWF0IHNyY01hdCA9IGN2TWF0KCBoZWlnaHQsIHdpZHRoLCBDVl82NEYsIHNyYyApOworICAgIEN2TWF0IGRzdE1hdCA9IGN2TWF0KCB3aWR0aCwgd2lkdGgsIENWXzY0RiwgZHN0ICk7CisKKyAgICBjdk11bFRyYW5zcG9zZWQoICZzcmNNYXQsICZkc3RNYXQsIDEgKTsKK30KKworQ1ZfSU5MSU5FIHZvaWQgaWN2TXVsVHJhbnNNYXRyaXhMXzY0ZCggZG91YmxlKiBzcmMsIGludCB3aWR0aCwgaW50IGhlaWdodCwgZG91YmxlKiBkc3QgKQoreworICAgIEN2TWF0IHNyY01hdCA9IGN2TWF0KCBoZWlnaHQsIHdpZHRoLCBDVl82NEYsIHNyYyApOworICAgIEN2TWF0IGRzdE1hdCA9IGN2TWF0KCBoZWlnaHQsIGhlaWdodCwgQ1ZfNjRGLCBkc3QgKTsKKworICAgIGN2TXVsVHJhbnNwb3NlZCggJnNyY01hdCwgJmRzdE1hdCwgMCApOworfQorCitDVl9JTkxJTkUgdm9pZCBpY3ZNdWxUcmFuc01hdHJpeFJfMzJmKCBmbG9hdCogc3JjLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGZsb2F0KiBkc3QgKQoreworICAgIEN2TWF0IHNyY01hdCA9IGN2TWF0KCBoZWlnaHQsIHdpZHRoLCBDVl8zMkYsIHNyYyApOworICAgIEN2TWF0IGRzdE1hdCA9IGN2TWF0KCB3aWR0aCwgd2lkdGgsIENWXzMyRiwgZHN0ICk7CisKKyAgICBjdk11bFRyYW5zcG9zZWQoICZzcmNNYXQsICZkc3RNYXQsIDEgKTsKK30KKworQ1ZfSU5MSU5FIHZvaWQgaWN2TXVsVHJhbnNNYXRyaXhMXzMyZiggZmxvYXQqIHNyYywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBmbG9hdCogZHN0ICkKK3sKKyAgICBDdk1hdCBzcmNNYXQgPSBjdk1hdCggaGVpZ2h0LCB3aWR0aCwgQ1ZfMzJGLCBzcmMgKTsKKyAgICBDdk1hdCBkc3RNYXQgPSBjdk1hdCggaGVpZ2h0LCBoZWlnaHQsIENWXzMyRiwgZHN0ICk7CisKKyAgICBjdk11bFRyYW5zcG9zZWQoICZzcmNNYXQsICZkc3RNYXQsIDAgKTsKK30KKworQ1ZfSU5MSU5FIHZvaWQgaWN2Q3Z0XzMyZl82NGQoIGNvbnN0IGZsb2F0KiBzcmMsIGRvdWJsZSogZHN0LCBpbnQgbGVuICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICBkc3RbaV0gPSBzcmNbaV07Cit9CisKK0NWX0lOTElORSB2b2lkIGljdkN2dF82NGRfMzJmKCBjb25zdCBkb3VibGUqIHNyYywgZmxvYXQqIGRzdCwgaW50IGxlbiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gKGZsb2F0KXNyY1tpXTsKK30KKworI2VuZGlmLypfQ1ZfTUFUUklYX0hfKi8KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZhY2N1bS5jcHAgYi9jdi9zcmMvY3ZhY2N1bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFiNzE1ZgotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmFjY3VtLmNwcApAQCAtMCwwICsxLDc4NiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworI2RlZmluZSAgSUNWX0RFRl9BQ0NfRlVOQyggbmFtZSwgc3JjdHlwZSwgZHN0dHlwZSwgY3Z0bWFjcm8gKSAgICAgICAgICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSwoIGNvbnN0IHNyY3R5cGUgKnNyYywgaW50IHNyY3N0ZXAsIGRzdHR5cGUgKmRzdCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApLCAoc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUgKSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSA0OyB4ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0dHlwZSB0MCA9IGRzdFt4XSArIGN2dG1hY3JvKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0dHlwZSB0MSA9IGRzdFt4ICsgMV0gKyBjdnRtYWNybyhzcmNbeCArIDFdKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3hdID0gdDA7ICBkc3RbeCArIDFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBkc3RbeCArIDJdICsgY3Z0bWFjcm8oc3JjW3ggKyAyXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBkc3RbeCArIDNdICsgY3Z0bWFjcm8oc3JjW3ggKyAzXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3ggKyAyXSA9IHQwOyAgZHN0W3ggKyAzXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3hdICs9IGN2dG1hY3JvKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfQUNDX0ZVTkMoIGljdkFkZF84dTMyZl9DMUlSLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfREVGX0FDQ19GVU5DKCBpY3ZBZGRfMzJmX0MxSVIsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ERUZfQUNDX0ZVTkMoIGljdkFkZFNxdWFyZV84dTMyZl9DMUlSLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRl9TUVIgKQorSUNWX0RFRl9BQ0NfRlVOQyggaWN2QWRkU3F1YXJlXzMyZl9DMUlSLCBmbG9hdCwgZmxvYXQsIENWX1NRUiApCisKKworI2RlZmluZSAgSUNWX0RFRl9BQ0NQUk9EX0ZVTkMoIGZsYXZvciwgc3JjdHlwZSwgZHN0dHlwZSwgY3Z0bWFjcm8gKSAgICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkFkZFByb2R1Y3RfIyNmbGF2b3IjI19DMUlSLCAgICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUgKnNyYzEsIGludCBzdGVwMSwgY29uc3Qgc3JjdHlwZSAqc3JjMiwgaW50IHN0ZXAyLCAgICAgICAgICAgXAorICBkc3R0eXBlICpkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAoc3JjMSwgc3RlcDEsIHNyYzIsIHN0ZXAyLCBkc3QsIGRzdHN0ZXAsIHNpemUpICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMiAvPSBzaXplb2Yoc3JjMlswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgZHN0ICs9IGRzdHN0ZXAgKSAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gNDsgeCArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0dHlwZSB0MCA9IGRzdFt4XSArIGN2dG1hY3JvKHNyYzFbeF0pKmN2dG1hY3JvKHNyYzJbeF0pOyAgICAgIFwKKyAgICAgICAgICAgIGRzdHR5cGUgdDEgPSBkc3RbeCsxXSArIGN2dG1hY3JvKHNyYzFbeCsxXSkqY3Z0bWFjcm8oc3JjMlt4KzFdKTtcCisgICAgICAgICAgICBkc3RbeF0gPSB0MDsgIGRzdFt4ICsgMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gZHN0W3ggKyAyXSArIGN2dG1hY3JvKHNyYzFbeCArIDJdKSpjdnRtYWNybyhzcmMyW3ggKyAyXSk7ICBcCisgICAgICAgICAgICB0MSA9IGRzdFt4ICsgM10gKyBjdnRtYWNybyhzcmMxW3ggKyAzXSkqY3Z0bWFjcm8oc3JjMlt4ICsgM10pOyAgXAorICAgICAgICAgICAgZHN0W3ggKyAyXSA9IHQwOyAgZHN0W3ggKyAzXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSArPSBjdnRtYWNybyhzcmMxW3hdKSpjdnRtYWNybyhzcmMyW3hdKTsgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9BQ0NQUk9EX0ZVTkMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfREVGX0FDQ1BST0RfRlVOQyggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCisKKworI2RlZmluZSAgSUNWX0RFRl9BQ0NXRUlHSFRfRlVOQyggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCBjdnRtYWNybyApICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2QWRkV2VpZ2h0ZWRfIyNmbGF2b3IjI19DMUlSLCAgICAgICAgICAgICAgICAgXAorKCBjb25zdCBzcmN0eXBlICpzcmMsIGludCBzcmNzdGVwLCBkc3R0eXBlICpkc3QsIGludCBkc3RzdGVwLCAgICAgICAgICAgXAorICBDdlNpemUgc2l6ZSwgZHN0dHlwZSBhbHBoYSApLCAoc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsIGFscGhhKSApXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHR5cGUgYmV0YSA9IChkc3R0eXBlKSgxIC0gYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSA0OyB4ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0dHlwZSB0MCA9IGRzdFt4XSpiZXRhICsgY3Z0bWFjcm8oc3JjW3hdKSphbHBoYTsgICAgICAgICAgXAorICAgICAgICAgICAgZHN0dHlwZSB0MSA9IGRzdFt4KzFdKmJldGEgKyBjdnRtYWNybyhzcmNbeCsxXSkqYWxwaGE7ICAgICAgXAorICAgICAgICAgICAgZHN0W3hdID0gdDA7IGRzdFt4ICsgMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBkc3RbeCArIDJdKmJldGEgKyBjdnRtYWNybyhzcmNbeCArIDJdKSphbHBoYTsgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBkc3RbeCArIDNdKmJldGEgKyBjdnRtYWNybyhzcmNbeCArIDNdKSphbHBoYTsgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3ggKyAyXSA9IHQwOyBkc3RbeCArIDNdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3hdID0gZHN0W3hdKmJldGEgKyBjdnRtYWNybyhzcmNbeF0pKmFscGhhOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfQUNDV0VJR0hUX0ZVTkMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfREVGX0FDQ1dFSUdIVF9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKKworCisjZGVmaW5lICBJQ1ZfREVGX0FDQ01BU0tfRlVOQ19DMSggbmFtZSwgc3JjdHlwZSwgZHN0dHlwZSwgY3Z0bWFjcm8gKSAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lLCggY29uc3Qgc3JjdHlwZSAqc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCxcCisgICAgICAgZHN0dHlwZSAqZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKHNyYywgc3Jjc3RlcCwgbWFzaywgbWFza3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSApKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3RzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDA7IHggPD0gc2l6ZS53aWR0aCAtIDI7IHggKz0gMiApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3hdICs9IGN2dG1hY3JvKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbWFza1t4KzFdICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3grMV0gKz0gY3Z0bWFjcm8oc3JjW3grMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3hdICs9IGN2dG1hY3JvKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9BQ0NNQVNLX0ZVTkNfQzEoIGljdkFkZF84dTMyZl9DMUlNUiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0RFRl9BQ0NNQVNLX0ZVTkNfQzEoIGljdkFkZF8zMmZfQzFJTVIsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ERUZfQUNDTUFTS19GVU5DX0MxKCBpY3ZBZGRTcXVhcmVfOHUzMmZfQzFJTVIsIHVjaGFyLCBmbG9hdCwgQ1ZfOFRPMzJGX1NRUiApCitJQ1ZfREVGX0FDQ01BU0tfRlVOQ19DMSggaWN2QWRkU3F1YXJlXzMyZl9DMUlNUiwgZmxvYXQsIGZsb2F0LCBDVl9TUVIgKQorCisKKyNkZWZpbmUgIElDVl9ERUZfQUNDUFJPRFVDVE1BU0tfRlVOQ19DMSggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCBjdnRtYWNybyApICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZBZGRQcm9kdWN0XyMjZmxhdm9yIyNfQzFJTVIsICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUgKnNyYzEsIGludCBzdGVwMSwgY29uc3Qgc3JjdHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICBcCisgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsIGRzdHR5cGUgKmRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICksXAorICAoc3JjMSwgc3RlcDEsIHNyYzIsIHN0ZXAyLCBtYXNrLCBtYXNrc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplICkpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0c3RlcCwgbWFzayArPSBtYXNrc3RlcCApICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSAyOyB4ICs9IDIgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSArPSBjdnRtYWNybyhzcmMxW3hdKSpjdnRtYWNybyhzcmMyW3hdKTsgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeCsxXSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4KzFdICs9IGN2dG1hY3JvKHNyYzFbeCsxXSkqY3Z0bWFjcm8oc3JjMlt4KzFdKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSArPSBjdnRtYWNybyhzcmMxW3hdKSpjdnRtYWNybyhzcmMyW3hdKTsgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfQUNDUFJPRFVDVE1BU0tfRlVOQ19DMSggOHUzMmYsIHVjaGFyLCBmbG9hdCwgQ1ZfOFRPMzJGICkKK0lDVl9ERUZfQUNDUFJPRFVDVE1BU0tfRlVOQ19DMSggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCisKKyNkZWZpbmUgIElDVl9ERUZfQUNDV0VJR0hUTUFTS19GVU5DX0MxKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIGN2dG1hY3JvICkgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2QWRkV2VpZ2h0ZWRfIyNmbGF2b3IjI19DMUlNUiwgICAgICAgICAgICAgICAgXAorKCBjb25zdCBzcmN0eXBlICpzcmMsIGludCBzcmNzdGVwLCBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCAgICAgXAorICBkc3R0eXBlICpkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgZHN0dHlwZSBhbHBoYSApLCAgICAgICAgICAgICAgXAorICAoc3JjLCBzcmNzdGVwLCBtYXNrLCBtYXNrc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLCBhbHBoYSApKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHR5cGUgYmV0YSA9IChkc3R0eXBlKSgxIC0gYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0c3RlcCwgbWFzayArPSBtYXNrc3RlcCApICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSAyOyB4ICs9IDIgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGRzdFt4XSpiZXRhICsgY3Z0bWFjcm8oc3JjW3hdKSphbHBoYTsgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeCsxXSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4KzFdID0gZHN0W3grMV0qYmV0YSArIGN2dG1hY3JvKHNyY1t4KzFdKSphbHBoYTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGRzdFt4XSpiZXRhICsgY3Z0bWFjcm8oc3JjW3hdKSphbHBoYTsgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitJQ1ZfREVGX0FDQ1dFSUdIVE1BU0tfRlVOQ19DMSggOHUzMmYsIHVjaGFyLCBmbG9hdCwgQ1ZfOFRPMzJGICkKK0lDVl9ERUZfQUNDV0VJR0hUTUFTS19GVU5DX0MxKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKKworCisjZGVmaW5lICBJQ1ZfREVGX0FDQ01BU0tfRlVOQ19DMyggbmFtZSwgc3JjdHlwZSwgZHN0dHlwZSwgY3Z0bWFjcm8gKSAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lLCggY29uc3Qgc3JjdHlwZSAqc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCxcCisgICAgICAgZHN0dHlwZSAqZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgKHNyYywgc3Jjc3RlcCwgbWFzaywgbWFza3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSApKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3RzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0dHlwZSB0MCwgdDEsIHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBkc3RbeCozXSArIGN2dG1hY3JvKHNyY1t4KjNdKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDEgPSBkc3RbeCozKzFdICsgY3Z0bWFjcm8oc3JjW3gqMysxXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDIgPSBkc3RbeCozKzJdICsgY3Z0bWFjcm8oc3JjW3gqMysyXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqM10gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqMysxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqMysyXSA9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9BQ0NNQVNLX0ZVTkNfQzMoIGljdkFkZF84dTMyZl9DM0lNUiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0RFRl9BQ0NNQVNLX0ZVTkNfQzMoIGljdkFkZF8zMmZfQzNJTVIsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ERUZfQUNDTUFTS19GVU5DX0MzKCBpY3ZBZGRTcXVhcmVfOHUzMmZfQzNJTVIsIHVjaGFyLCBmbG9hdCwgQ1ZfOFRPMzJGX1NRUiApCitJQ1ZfREVGX0FDQ01BU0tfRlVOQ19DMyggaWN2QWRkU3F1YXJlXzMyZl9DM0lNUiwgZmxvYXQsIGZsb2F0LCBDVl9TUVIgKQorCisKKyNkZWZpbmUgIElDVl9ERUZfQUNDUFJPRFVDVE1BU0tfRlVOQ19DMyggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCBjdnRtYWNybyApICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZBZGRQcm9kdWN0XyMjZmxhdm9yIyNfQzNJTVIsICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUgKnNyYzEsIGludCBzdGVwMSwgY29uc3Qgc3JjdHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICBcCisgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsIGRzdHR5cGUgKmRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICksXAorICAoc3JjMSwgc3RlcDEsIHNyYzIsIHN0ZXAyLCBtYXNrLCBtYXNrc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplICkpICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0c3RlcCwgbWFzayArPSBtYXNrc3RlcCApICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdHR5cGUgdDAsIHQxLCB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQwID0gZHN0W3gqM10rY3Z0bWFjcm8oc3JjMVt4KjNdKSpjdnRtYWNybyhzcmMyW3gqM10pOyAgXAorICAgICAgICAgICAgICAgIHQxID0gZHN0W3gqMysxXStjdnRtYWNybyhzcmMxW3gqMysxXSkqY3Z0bWFjcm8oc3JjMlt4KjMrMV0pO1wKKyAgICAgICAgICAgICAgICB0MiA9IGRzdFt4KjMrMl0rY3Z0bWFjcm8oc3JjMVt4KjMrMl0pKmN2dG1hY3JvKHNyYzJbeCozKzJdKTtcCisgICAgICAgICAgICAgICAgZHN0W3gqM10gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqMysxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqMysyXSA9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9BQ0NQUk9EVUNUTUFTS19GVU5DX0MzKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0RFRl9BQ0NQUk9EVUNUTUFTS19GVU5DX0MzKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKKworCisjZGVmaW5lICBJQ1ZfREVGX0FDQ1dFSUdIVE1BU0tfRlVOQ19DMyggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCBjdnRtYWNybyApIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkFkZFdlaWdodGVkXyMjZmxhdm9yIyNfQzNJTVIsICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSAqc3JjLCBpbnQgc3Jjc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgIFwKKyAgZHN0dHlwZSAqZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGRzdHR5cGUgYWxwaGEgKSwgICAgICAgICAgICAgIFwKKyAgKHNyYywgc3Jjc3RlcCwgbWFzaywgbWFza3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwgYWxwaGEgKSkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3R0eXBlIGJldGEgPSAoZHN0dHlwZSkoMSAtIGFscGhhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IGRzdHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBtYXNrW3hdICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3R0eXBlIHQwLCB0MSwgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IGRzdFt4KjNdKmJldGEgKyBjdnRtYWNybyhzcmNbeCozXSkqYWxwaGE7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9IGRzdFt4KjMrMV0qYmV0YSArIGN2dG1hY3JvKHNyY1t4KjMrMV0pKmFscGhhOyAgICAgIFwKKyAgICAgICAgICAgICAgICB0MiA9IGRzdFt4KjMrMl0qYmV0YSArIGN2dG1hY3JvKHNyY1t4KjMrMl0pKmFscGhhOyAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbeCozXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbeCozKzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbeCozKzJdID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSUNWX0RFRl9BQ0NXRUlHSFRNQVNLX0ZVTkNfQzMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfREVGX0FDQ1dFSUdIVE1BU0tfRlVOQ19DMyggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCisKKworI2RlZmluZSAgSUNWX0RFRl9JTklUX0FDQ19UQUIoIEZVTkNOQU1FICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljICB2b2lkICBpY3ZJbml0IyNGVU5DTkFNRSMjVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIsIEN2QmlnRnVuY1RhYmxlKiBtYXNrdGFiICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dTMyZl9DMUlSOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmX0MxSVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hc2t0YWItPmZuXzJkW0NWXzhVQzFdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dTMyZl9DMUlNUjsgICAgICAgICAgICAgICAgICAgXAorICAgIG1hc2t0YWItPmZuXzJkW0NWXzMyRkMxXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmX0MxSU1SOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hc2t0YWItPmZuXzJkW0NWXzhVQzNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dTMyZl9DM0lNUjsgICAgICAgICAgICAgICAgICAgXAorICAgIG1hc2t0YWItPmZuXzJkW0NWXzMyRkMzXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmX0MzSU1SOyAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfSU5JVF9BQ0NfVEFCKCBBZGQgKQorSUNWX0RFRl9JTklUX0FDQ19UQUIoIEFkZFNxdWFyZSApCitJQ1ZfREVGX0lOSVRfQUNDX1RBQiggQWRkUHJvZHVjdCApCitJQ1ZfREVGX0lOSVRfQUNDX1RBQiggQWRkV2VpZ2h0ZWQgKQorCisKK0NWX0lNUEwgdm9pZAorY3ZBY2MoIGNvbnN0IHZvaWQqIGFyciwgdm9pZCogc3VtYXJyLCBjb25zdCB2b2lkKiBtYXNrYXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgYWNjX3RhYjsKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgYWNjbWFza190YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2QWNjIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIHN1bWRlcHRoOworICAgIGludCBtYXRfc3RlcCwgc3VtX3N0ZXAsIG1hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopYXJyOworICAgIEN2TWF0IHN1bXN0dWIsICpzdW0gPSAoQ3ZNYXQqKXN1bWFycjsKKyAgICBDdk1hdCBtYXNrc3R1YiwgKm1hc2sgPSAoQ3ZNYXQqKW1hc2thcnI7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdEFkZFRhYmxlKCAmYWNjX3RhYiwgJmFjY21hc2tfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBtYXQgKSB8fCAhQ1ZfSVNfTUFUKCBzdW0gKSkKKyAgICB7CisgICAgICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pMSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggc3VtID0gY3ZHZXRNYXQoIHN1bSwgJnN1bXN0dWIsICZjb2kyICkpOworICAgICAgICBpZiggY29pMSArIGNvaTIgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCBDVl9NQVRfREVQVEgoIHN1bS0+dHlwZSApICE9IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX0NOU19FUSggbWF0LCBzdW0gKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBzdW1kZXB0aCA9IENWX01BVF9ERVBUSCggc3VtLT50eXBlICk7CisgICAgaWYoIHN1bWRlcHRoICE9IENWXzMyRiAmJiAobWFza2FyciAhPSAwIHx8IHN1bWRlcHRoICE9IENWXzY0RikpCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIkJhZCBhY2N1bXVsYXRvciB0eXBlIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdCwgc3VtICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0LT50eXBlICk7CisKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKyAgICBzdW1fc3RlcCA9IHN1bS0+c3RlcDsKKworICAgIGlmKCAhbWFzayApCisgICAgeworICAgICAgICBDdkZ1bmMyRF8yQSBmdW5jPShDdkZ1bmMyRF8yQSlhY2NfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIHR5cGUgY29tYmluYXRpb24iICk7CisKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04odHlwZSk7CisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICYgc3VtLT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBtYXRfc3RlcCA9IHN1bV9zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsIHNpemUgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2RnVuYzJEXzNBIGZ1bmMgPSAoQ3ZGdW5jMkRfM0EpYWNjbWFza190YWIuZm5fMmRbdHlwZV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBDVl9DQUxMKCBtYXNrID0gY3ZHZXRNYXQoIG1hc2ssICZtYXNrc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWF0LCBtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7ICAgICAgICAgICAgCisKKyAgICAgICAgbWFza19zdGVwID0gbWFzay0+c3RlcDsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSAmIHN1bS0+dHlwZSAmIG1hc2stPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIG1hdF9zdGVwID0gc3VtX3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBtYXNrLT5kYXRhLnB0ciwgbWFza19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1bS0+ZGF0YS5wdHIsIHN1bV9zdGVwLCBzaXplICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlNxdWFyZUFjYyggY29uc3Qgdm9pZCogYXJyLCB2b2lkKiBzcV9zdW0sIGNvbnN0IHZvaWQqIG1hc2thcnIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBhY2NfdGFiOworICAgIHN0YXRpYyBDdkJpZ0Z1bmNUYWJsZSBhY2NtYXNrX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZTcXVhcmVBY2MiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pMSwgY29pMjsKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgbWF0X3N0ZXAsIHN1bV9zdGVwLCBtYXNrX3N0ZXAgPSAwOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICBDdk1hdCBzdW1zdHViLCAqc3VtID0gKEN2TWF0KilzcV9zdW07CisgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRBZGRTcXVhcmVUYWJsZSggJmFjY190YWIsICZhY2NtYXNrX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaTEgKSk7CisgICAgQ1ZfQ0FMTCggc3VtID0gY3ZHZXRNYXQoIHN1bSwgJnN1bXN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBtYXQsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIHN1bS0+dHlwZSApICE9IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworCisgICAgbWF0X3N0ZXAgPSBtYXQtPnN0ZXA7CisgICAgc3VtX3N0ZXAgPSBzdW0tPnN0ZXA7CisKKyAgICBpZiggIW1hc2sgKQorICAgIHsKKyAgICAgICAgQ3ZGdW5jMkRfMkEgZnVuYyA9IChDdkZ1bmMyRF8yQSlhY2NfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBzaXplLndpZHRoICo9IENWX01BVF9DTih0eXBlKTsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSAmIHN1bS0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgbWF0X3N0ZXAgPSBzdW1fc3RlcCA9IENWX1NUVUJfU1RFUDs7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBzdW0tPmRhdGEucHRyLCBzdW1fc3RlcCwgc2l6ZSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZGdW5jMkRfM0EgZnVuYyA9IChDdkZ1bmMyRF8zQSlhY2NtYXNrX3RhYi5mbl8yZFt0eXBlXTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQsIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsgICAgICAgICAgICAKKworICAgICAgICBtYXNrX3N0ZXAgPSBtYXNrLT5zdGVwOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICYgc3VtLT50eXBlICYgbWFzay0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgbWF0X3N0ZXAgPSBzdW1fc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIG1hc2stPmRhdGEucHRyLCBtYXNrX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsIHNpemUgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2TXVsdGlwbHlBY2MoIGNvbnN0IHZvaWQqIGFyckEsIGNvbnN0IHZvaWQqIGFyckIsCisgICAgICAgICAgICAgICB2b2lkKiBhY2MsIGNvbnN0IHZvaWQqIG1hc2thcnIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBhY2NfdGFiOworICAgIHN0YXRpYyBDdkJpZ0Z1bmNUYWJsZSBhY2NtYXNrX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZNdWx0aXBseUFjYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxLCBjb2kyLCBjb2kzOworICAgIGludCB0eXBlOworICAgIGludCBtYXQxX3N0ZXAsIG1hdDJfc3RlcCwgc3VtX3N0ZXAsIG1hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZNYXQgc3R1YjEsICptYXQxID0gKEN2TWF0KilhcnJBOworICAgIEN2TWF0IHN0dWIyLCAqbWF0MiA9IChDdk1hdCopYXJyQjsKKyAgICBDdk1hdCBzdW1zdHViLCAqc3VtID0gKEN2TWF0KilhY2M7CisgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRBZGRQcm9kdWN0VGFibGUoICZhY2NfdGFiLCAmYWNjbWFza190YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggbWF0MSA9IGN2R2V0TWF0KCBtYXQxLCAmc3R1YjEsICZjb2kxICkpOworICAgIENWX0NBTEwoIG1hdDIgPSBjdkdldE1hdCggbWF0MiwgJnN0dWIyLCAmY29pMiApKTsKKyAgICBDVl9DQUxMKCBzdW0gPSBjdkdldE1hdCggc3VtLCAmc3Vtc3R1YiwgJmNvaTMgKSk7CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCB8fCBjb2kzICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBtYXQxLCBtYXQyICkgfHwgIUNWX0FSRV9DTlNfRVEoIG1hdDEsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIHN1bS0+dHlwZSApICE9IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQxLCBzdW0gKSB8fCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQyLCBzdW0gKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggbWF0MSApOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0MS0+dHlwZSApOworCisgICAgbWF0MV9zdGVwID0gbWF0MS0+c3RlcDsKKyAgICBtYXQyX3N0ZXAgPSBtYXQyLT5zdGVwOworICAgIHN1bV9zdGVwID0gc3VtLT5zdGVwOworCisgICAgaWYoICFtYXNrICkKKyAgICB7CisgICAgICAgIEN2RnVuYzJEXzNBIGZ1bmMgPSAoQ3ZGdW5jMkRfM0EpYWNjX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSldOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04odHlwZSk7CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQxLT50eXBlICYgbWF0Mi0+dHlwZSAmIHN1bS0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgbWF0MV9zdGVwID0gbWF0Ml9zdGVwID0gc3VtX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdDEtPmRhdGEucHRyLCBtYXQxX3N0ZXAsIG1hdDItPmRhdGEucHRyLCBtYXQyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsIHNpemUgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2RnVuYzJEXzRBIGZ1bmMgPSAoQ3ZGdW5jMkRfNEEpYWNjbWFza190YWIuZm5fMmRbdHlwZV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBDVl9DQUxMKCBtYXNrID0gY3ZHZXRNYXQoIG1hc2ssICZtYXNrc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWF0MSwgbWFzayApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgICAgIG1hc2tfc3RlcCA9IG1hc2stPnN0ZXA7CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQxLT50eXBlICYgbWF0Mi0+dHlwZSAmIHN1bS0+dHlwZSAmIG1hc2stPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIG1hdDFfc3RlcCA9IG1hdDJfc3RlcCA9IHN1bV9zdGVwID0gbWFza19zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICB9CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQxLT5kYXRhLnB0ciwgbWF0MV9zdGVwLCBtYXQyLT5kYXRhLnB0ciwgbWF0Ml9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2stPmRhdGEucHRyLCBtYXNrX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsIHNpemUgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkFkZFdlaWdodGVkRnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBmbG9hdCBhbHBoYSApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkFkZFdlaWdodGVkTWFza0Z1bmMpKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIG1hc2ssIGludCBtYXNrc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBmbG9hdCBhbHBoYSApOworCitDVl9JTVBMIHZvaWQKK2N2UnVubmluZ0F2ZyggY29uc3Qgdm9pZCogYXJyWSwgdm9pZCogYXJyVSwKKyAgICAgICAgICAgICAgZG91YmxlIGFscGhhLCBjb25zdCB2b2lkKiBtYXNrYXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgYWNjX3RhYjsKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgYWNjbWFza190YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UnVubmluZ0F2ZyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxLCBjb2kyOworICAgIGludCB0eXBlOworICAgIGludCBtYXRfc3RlcCwgc3VtX3N0ZXAsIG1hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopYXJyWTsKKyAgICBDdk1hdCBzdW1zdHViLCAqc3VtID0gKEN2TWF0KilhcnJVOworICAgIEN2TWF0IG1hc2tzdHViLCAqbWFzayA9IChDdk1hdCopbWFza2FycjsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0QWRkV2VpZ2h0ZWRUYWJsZSggJmFjY190YWIsICZhY2NtYXNrX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaTEgKSk7CisgICAgQ1ZfQ0FMTCggc3VtID0gY3ZHZXRNYXQoIHN1bSwgJnN1bXN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBtYXQsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIHN1bS0+dHlwZSApICE9IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworCisgICAgbWF0X3N0ZXAgPSBtYXQtPnN0ZXA7CisgICAgc3VtX3N0ZXAgPSBzdW0tPnN0ZXA7CisKKyAgICBpZiggIW1hc2sgKQorICAgIHsKKyAgICAgICAgQ3ZBZGRXZWlnaHRlZEZ1bmMgZnVuYyA9IChDdkFkZFdlaWdodGVkRnVuYylhY2NfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBzaXplLndpZHRoICo9IENWX01BVF9DTih0eXBlKTsKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgJiBzdW0tPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIG1hdF9zdGVwID0gc3VtX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1bS0+ZGF0YS5wdHIsIHN1bV9zdGVwLCBzaXplLCAoZmxvYXQpYWxwaGEgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2QWRkV2VpZ2h0ZWRNYXNrRnVuYyBmdW5jID0gKEN2QWRkV2VpZ2h0ZWRNYXNrRnVuYylhY2NtYXNrX3RhYi5mbl8yZFt0eXBlXTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQsIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICBtYXNrX3N0ZXAgPSBtYXNrLT5zdGVwOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICYgc3VtLT50eXBlICYgbWFzay0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgbWF0X3N0ZXAgPSBzdW1fc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIG1hc2stPmRhdGEucHRyLCBtYXNrX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsIHNpemUsIChmbG9hdClhbHBoYSApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2YWRhcHRocmVzaC5jcHAgYi9jdi9zcmMvY3ZhZGFwdGhyZXNoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGQ0NzMzCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2YWRhcHRocmVzaC5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKK3N0YXRpYyB2b2lkCitpY3ZBZGFwdGl2ZVRocmVzaG9sZF9NZWFuQyggY29uc3QgQ3ZNYXQqIHNyYywgQ3ZNYXQqIGRzdCwgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4VmFsdWUsIGludCB0eXBlLCBpbnQgc2l6ZSwgZG91YmxlIGRlbHRhICkKK3sKKyAgICBDdk1hdCogbWVhbiA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZBZGFwdGl2ZVRocmVzaG9sZF9NZWFuQyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBqLCByb3dzLCBjb2xzOworICAgIGludCBpZGVsdGEgPSB0eXBlID09IENWX1RIUkVTSF9CSU5BUlkgPyBjdkNlaWwoZGVsdGEpIDogY3ZGbG9vcihkZWx0YSk7CisgICAgdWNoYXIgdGFiWzc2OF07CisKKyAgICBpZiggc2l6ZSA8PSAxIHx8IChzaXplJjEpID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk5laWdoYm9yaG9vZCBzaXplIG11c3QgYmUgPj0zIGFuZCBvZGQgKDMsIDUsIDcsIC4uLikiICk7CisKKyAgICBpZiggbWF4VmFsdWUgPCAwICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2U2V0WmVybyggZHN0ICkpOworICAgICAgICBFWElUOworICAgIH0KKworICAgIHJvd3MgPSBzcmMtPnJvd3M7CisgICAgY29scyA9IHNyYy0+Y29sczsKKworICAgIGlmKCBzcmMtPmRhdGEucHRyICE9IGRzdC0+ZGF0YS5wdHIgKQorICAgICAgICBtZWFuID0gZHN0OworICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggbWVhbiA9IGN2Q3JlYXRlTWF0KCByb3dzLCBjb2xzLCBDVl84VUMxICkpOworCisgICAgQ1ZfQ0FMTCggY3ZTbW9vdGgoIHNyYywgbWVhbiwgbWV0aG9kID09IENWX0FEQVBUSVZFX1RIUkVTSF9NRUFOX0MgPworICAgICAgICAgICAgICAgICAgICAgICBDVl9CTFVSIDogQ1ZfR0FVU1NJQU4sIHNpemUsIHNpemUgKSk7CisgICAgaWYoIG1heFZhbHVlID4gMjU1ICkKKyAgICAgICAgbWF4VmFsdWUgPSAyNTU7CisKKyAgICBpZiggdHlwZSA9PSBDVl9USFJFU0hfQklOQVJZICkKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDc2ODsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9ICh1Y2hhcikoaSAtIDI1NSA+IC1pZGVsdGEgPyBtYXhWYWx1ZSA6IDApOworICAgIGVsc2UKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDc2ODsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9ICh1Y2hhcikoaSAtIDI1NSA8PSAtaWRlbHRhID8gbWF4VmFsdWUgOiAwKTsKKworICAgIGZvciggaSA9IDA7IGkgPCByb3dzOyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIHMgPSBzcmMtPmRhdGEucHRyICsgaSpzcmMtPnN0ZXA7CisgICAgICAgIGNvbnN0IHVjaGFyKiBtID0gbWVhbi0+ZGF0YS5wdHIgKyBpKm1lYW4tPnN0ZXA7CisgICAgICAgIHVjaGFyKiBkID0gZHN0LT5kYXRhLnB0ciArIGkqZHN0LT5zdGVwOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjb2xzOyBqKysgKQorICAgICAgICAgICAgZFtqXSA9IHRhYltzW2pdIC0gbVtqXSArIDI1NV07CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBtZWFuICE9IGRzdCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJm1lYW4gKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2QWRhcHRpdmVUaHJlc2hvbGQoIGNvbnN0IHZvaWQgKnNyY0ltLCB2b2lkICpkc3RJbSwgZG91YmxlIG1heFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwgaW50IHR5cGUsIGludCBibG9ja1NpemUsIGRvdWJsZSBwYXJhbTEgKQoreworICAgIEN2TWF0IHNyY19zdHViLCBkc3Rfc3R1YjsKKyAgICBDdk1hdCAqc3JjID0gMCwgKmRzdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2QWRhcHRpdmVUaHJlc2hvbGQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggdHlwZSAhPSBDVl9USFJFU0hfQklOQVJZICYmIHR5cGUgIT0gQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25seSBDVl9UUkVTSF9CSU5BUlkgYW5kIENWX1RIUkVTSF9CSU5BUllfSU5WICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVzaG9sZCB0eXBlcyBhcmUgYWNjZXB0YWJsZSIgKTsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNJbSwgJnNyY19zdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3RJbSwgJmRzdF9zdHViICkpOworCisgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShkc3QtPnR5cGUpICE9IENWXzhVQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHN3aXRjaCggbWV0aG9kICkKKyAgICB7CisgICAgY2FzZSBDVl9BREFQVElWRV9USFJFU0hfTUVBTl9DOgorICAgIGNhc2UgQ1ZfQURBUFRJVkVfVEhSRVNIX0dBVVNTSUFOX0M6CisgICAgICAgIENWX0NBTEwoIGljdkFkYXB0aXZlVGhyZXNob2xkX01lYW5DKCBzcmMsIGRzdCwgbWV0aG9kLCBjdlJvdW5kKG1heFZhbHVlKSx0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tTaXplLCBwYXJhbTEgKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9CQURDT0VGX0VSUiwgIiIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmFwcHJveC5jcHAgYi9jdi9zcmMvY3ZhcHByb3guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyNmVjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZhcHByb3guY3BwCkBAIC0wLDAgKzEsMTA2NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFpbiBBcHByb3hpbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgX0N2UHRJbmZvCit7CisgICAgQ3ZQb2ludCBwdDsKKyAgICBpbnQgazsgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcG9ydCByZWdpb24gKi8KKyAgICBpbnQgczsgICAgICAgICAgICAgICAgICAgICAgLyogY3VydmF0dXJlIHZhbHVlICovCisgICAgc3RydWN0IF9DdlB0SW5mbyAqbmV4dDsKK30KK19DdlB0SW5mbzsKKworCisvKiBjdXJ2YXR1cmU6IDAgLSAxLWN1cnZhdHVyZSwgMSAtIGstY29zaW5lIGN1cnZhdHVyZS4gKi8KK0N2U3RhdHVzCitpY3ZBcHByb3hpbWF0ZUNoYWluVEM4OSggQ3ZDaGFpbiogICAgICAgICAgICAgICBjaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogICAgICAgICAgc3RvcmFnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiAgICAgICAgICAgICAgICBjb250b3VyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbWV0aG9kICkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGFic19kaWZmW10gPSB7IDEsIDIsIDMsIDQsIDMsIDIsIDEsIDAsIDEsIDIsIDMsIDQsIDMsIDIsIDEgfTsKKworICAgIGNoYXIgICAgICAgICAgICBsb2NhbF9idWZmZXJbMSA8PCAxNl07CisgICAgY2hhciogICAgICAgICAgIGJ1ZmZlciA9IGxvY2FsX2J1ZmZlcjsKKyAgICBpbnQgICAgICAgICAgICAgYnVmZmVyX3NpemU7CisKKyAgICBfQ3ZQdEluZm8gICAgICAgdGVtcDsKKyAgICBfQ3ZQdEluZm8gICAgICAgKmFycmF5LCAqZmlyc3QgPSAwLCAqY3VycmVudCA9IDAsICpwcmV2X2N1cnJlbnQgPSAwOworICAgIGludCAgICAgICAgICAgICBpLCBqLCBpMSwgaTIsIHMsIGxlbjsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQ7CisKKyAgICBDdkNoYWluUHRSZWFkZXIgcmVhZGVyOworICAgIEN2U2VxV3JpdGVyICAgICB3cml0ZXI7CisgICAgQ3ZQb2ludCAgICAgICAgIHB0ID0gY2hhaW4tPm9yaWdpbjsKKyAgIAorICAgIGFzc2VydCggY2hhaW4gJiYgY29udG91ciAmJiBidWZmZXIgKTsKKworICAgIGJ1ZmZlcl9zaXplID0gKGNoYWluLT50b3RhbCArIDgpICogc2l6ZW9mKCBfQ3ZQdEluZm8gKTsKKworICAgICpjb250b3VyID0gMDsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX0NIQUlOX0NPTlRPVVIoIGNoYWluICkpCisgICAgICAgIHJldHVybiBDVl9CQURGTEFHX0VSUjsKKworICAgIGlmKCBoZWFkZXJfc2l6ZSA8IChpbnQpc2l6ZW9mKEN2Q29udG91cikgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgCisgICAgY3ZTdGFydFdyaXRlU2VxKCAoY2hhaW4tPmZsYWdzICYgfkNWX1NFUV9FTFRZUEVfTUFTSykgfCBDVl9TRVFfRUxUWVBFX1BPSU5ULAorICAgICAgICAgICAgICAgICAgICAgaGVhZGVyX3NpemUsIHNpemVvZiggQ3ZQb2ludCApLCBzdG9yYWdlLCAmd3JpdGVyICk7CisgICAgCisgICAgaWYoIGNoYWluLT50b3RhbCA9PSAwICkKKyAgICB7ICAgICAgICAKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHB0LCB3cml0ZXIgKTsKKyAgICAgICAgZ290byBleGl0X2Z1bmN0aW9uOworICAgIH0KKworICAgIGN2U3RhcnRSZWFkQ2hhaW5Qb2ludHMoIGNoYWluLCAmcmVhZGVyICk7CisKKyAgICBpZiggbWV0aG9kID4gQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSAmJiBidWZmZXJfc2l6ZSA+IChpbnQpc2l6ZW9mKGxvY2FsX2J1ZmZlcikpCisgICAgeworICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBjdkFsbG9jKCBidWZmZXJfc2l6ZSApOworICAgICAgICBpZiggIWJ1ZmZlciApCisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgIH0KKworICAgIGFycmF5ID0gKF9DdlB0SW5mbyAqKSBidWZmZXI7CisgICAgY291bnQgPSBjaGFpbi0+dG90YWw7CisKKyAgICB0ZW1wLm5leHQgPSAwOworICAgIGN1cnJlbnQgPSAmdGVtcDsKKworICAgIC8qIFBhc3MgMC4KKyAgICAgICBSZXN0b3JlcyBhbGwgdGhlIGRpZ2l0YWwgY3VydmUgcG9pbnRzIGZyb20gdGhlIGNoYWluIGNvZGUuCisgICAgICAgUmVtb3ZlcyB0aGUgcG9pbnRzIChmcm9tIHRoZSByZXN1bHRhbnQgcG9seWdvbikKKyAgICAgICB0aGF0IGhhdmUgemVybyAxLWN1cnZhdHVyZSAqLworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBwcmV2X2NvZGUgPSAqcmVhZGVyLnByZXZfZWxlbTsKKworICAgICAgICByZWFkZXIucHJldl9lbGVtID0gcmVhZGVyLnB0cjsKKyAgICAgICAgQ1ZfUkVBRF9DSEFJTl9QT0lOVCggcHQsIHJlYWRlciApOworCisgICAgICAgIC8qIGNhbGMgMS1jdXJ2YXR1cmUgKi8KKyAgICAgICAgcyA9IGFic19kaWZmW3JlYWRlci5jb2RlIC0gcHJldl9jb2RlICsgN107CisKKyAgICAgICAgaWYoIG1ldGhvZCA8PSBDVl9DSEFJTl9BUFBST1hfU0lNUExFICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1ldGhvZCA9PSBDVl9DSEFJTl9BUFBST1hfTk9ORSB8fCBzICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcyAhPSAwICkKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dCA9IGFycmF5ICsgaTsKKyAgICAgICAgICAgIGFycmF5W2ldLnMgPSBzOworICAgICAgICAgICAgYXJyYXlbaV0ucHQgPSBwdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vYXNzZXJ0KCBwdC54ID09IGNoYWluLT5vcmlnaW4ueCAmJiBwdC55ID09IGNoYWluLT5vcmlnaW4ueSApOworCisgICAgaWYoIG1ldGhvZCA8PSBDVl9DSEFJTl9BUFBST1hfU0lNUExFICkKKyAgICAgICAgZ290byBleGl0X2Z1bmN0aW9uOworCisgICAgY3VycmVudC0+bmV4dCA9IDA7CisKKyAgICBsZW4gPSBpOworICAgIGN1cnJlbnQgPSB0ZW1wLm5leHQ7CisKKyAgICBhc3NlcnQoIGN1cnJlbnQgKTsKKworICAgIC8qIFBhc3MgMS4KKyAgICAgICBEZXRlcm1pbmVzIHN1cHBvcnQgcmVnaW9uIGZvciBhbGwgdGhlIHJlbWFpbmVkIHBvaW50cyAqLworICAgIGRvCisgICAgeworICAgICAgICBDdlBvaW50IHB0MDsKKyAgICAgICAgaW50IGssIGwgPSAwLCBkX251bSA9IDA7CisKKyAgICAgICAgaSA9IChpbnQpKGN1cnJlbnQgLSBhcnJheSk7CisgICAgICAgIHB0MCA9IGFycmF5W2ldLnB0OworCisgICAgICAgIC8qIGRldGVybWluZSBzdXBwb3J0IHJlZ2lvbiAqLworICAgICAgICBmb3IoIGsgPSAxOzsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxrLCBka19udW07CisgICAgICAgICAgICBpbnQgZHgsIGR5OworICAgICAgICAgICAgQ3YzMnN1ZiBkOworCisgICAgICAgICAgICBhc3NlcnQoIGsgPD0gbGVuICk7CisKKyAgICAgICAgICAgIC8qIGNhbGMgaW5kaWNlcyAqLworICAgICAgICAgICAgaTEgPSBpIC0gazsKKyAgICAgICAgICAgIGkxICs9IGkxIDwgMCA/IGxlbiA6IDA7CisgICAgICAgICAgICBpMiA9IGkgKyBrOworICAgICAgICAgICAgaTIgLT0gaTIgPj0gbGVuID8gbGVuIDogMDsKKworICAgICAgICAgICAgZHggPSBhcnJheVtpMl0ucHQueCAtIGFycmF5W2kxXS5wdC54OworICAgICAgICAgICAgZHkgPSBhcnJheVtpMl0ucHQueSAtIGFycmF5W2kxXS5wdC55OworCisgICAgICAgICAgICAvKiBkaXN0YW5jZSBiZXR3ZWVuIHBfKGkgLSBrKSBhbmQgcF8oaSArIGspICovCisgICAgICAgICAgICBsayA9IGR4ICogZHggKyBkeSAqIGR5OworCisgICAgICAgICAgICAvKiBkaXN0YW5jZSBiZXR3ZWVuIHBfaSBhbmQgdGhlIGxpbmUgKHBfKGktayksIHBfKGkraykpICovCisgICAgICAgICAgICBka19udW0gPSAocHQwLnggLSBhcnJheVtpMV0ucHQueCkgKiBkeSAtIChwdDAueSAtIGFycmF5W2kxXS5wdC55KSAqIGR4OworICAgICAgICAgICAgZC5mID0gKGZsb2F0KSAoKChkb3VibGUpIGRfbnVtKSAqIGxrIC0gKChkb3VibGUpIGRrX251bSkgKiBsKTsKKworICAgICAgICAgICAgaWYoIGsgPiAxICYmIChsID49IGxrIHx8ICgoZF9udW0gPiAwICYmIGQuaSA8PSAwKSB8fCAoZF9udW0gPCAwICYmIGQuaSA+PSAwKSkpKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkX251bSA9IGRrX251bTsKKyAgICAgICAgICAgIGwgPSBsazsKKyAgICAgICAgfQorCisgICAgICAgIGN1cnJlbnQtPmsgPSAtLWs7CisKKyAgICAgICAgLyogZGV0ZXJtaW5lIGNvc2luZSBjdXJ2YXR1cmUgaWYgaXQgc2hvdWxkIGJlIHVzZWQgKi8KKyAgICAgICAgaWYoIG1ldGhvZCA9PSBDVl9DSEFJTl9BUFBST1hfVEM4OV9LQ09TICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogY2FsYyBrLWNvc2luZSBjdXJ2YXR1cmUgKi8KKyAgICAgICAgICAgIGZvciggaiA9IGssIHMgPSAwOyBqID4gMDsgai0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdGVtcF9udW07CisgICAgICAgICAgICAgICAgaW50IGR4MSwgZHkxLCBkeDIsIGR5MjsKKyAgICAgICAgICAgICAgICBDdjMyc3VmIHNrOworCisgICAgICAgICAgICAgICAgaTEgPSBpIC0gajsKKyAgICAgICAgICAgICAgICBpMSArPSBpMSA8IDAgPyBsZW4gOiAwOworICAgICAgICAgICAgICAgIGkyID0gaSArIGo7CisgICAgICAgICAgICAgICAgaTIgLT0gaTIgPj0gbGVuID8gbGVuIDogMDsKKworICAgICAgICAgICAgICAgIGR4MSA9IGFycmF5W2kxXS5wdC54IC0gcHQwLng7CisgICAgICAgICAgICAgICAgZHkxID0gYXJyYXlbaTFdLnB0LnkgLSBwdDAueTsKKyAgICAgICAgICAgICAgICBkeDIgPSBhcnJheVtpMl0ucHQueCAtIHB0MC54OworICAgICAgICAgICAgICAgIGR5MiA9IGFycmF5W2kyXS5wdC55IC0gcHQwLnk7CisKKyAgICAgICAgICAgICAgICBpZiggKGR4MSB8IGR5MSkgPT0gMCB8fCAoZHgyIHwgZHkyKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICB0ZW1wX251bSA9IGR4MSAqIGR4MiArIGR5MSAqIGR5MjsKKyAgICAgICAgICAgICAgICB0ZW1wX251bSA9CisgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKHRlbXBfbnVtIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FydCggKChkb3VibGUpZHgxICogZHgxICsgKGRvdWJsZSlkeTEgKiBkeTEpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpZHgyICogZHgyICsgKGRvdWJsZSlkeTIgKiBkeTIpICkpOworICAgICAgICAgICAgICAgIHNrLmYgPSAoZmxvYXQpICh0ZW1wX251bSArIDEuMSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIDAgPD0gc2suZiAmJiBzay5mIDw9IDIuMiApOworICAgICAgICAgICAgICAgIGlmKCBqIDwgayAmJiBzay5pIDw9IHMgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHMgPSBzay5pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudC0+cyA9IHM7CisgICAgICAgIH0KKyAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICAgIHdoaWxlKCBjdXJyZW50ICE9IDAgKTsKKworICAgIHByZXZfY3VycmVudCA9ICZ0ZW1wOworICAgIGN1cnJlbnQgPSB0ZW1wLm5leHQ7CisKKyAgICAvKiBQYXNzIDIuCisgICAgICAgUGVyZm9ybXMgbm9uLW1heGltYSBzdXByZXNzaW9uICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBrMiA9IGN1cnJlbnQtPmsgPj4gMTsKKworICAgICAgICBzID0gY3VycmVudC0+czsKKyAgICAgICAgaSA9IChpbnQpKGN1cnJlbnQgLSBhcnJheSk7CisKKyAgICAgICAgZm9yKCBqID0gMTsgaiA8PSBrMjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaTIgPSBpIC0gajsKKyAgICAgICAgICAgIGkyICs9IGkyIDwgMCA/IGxlbiA6IDA7CisKKyAgICAgICAgICAgIGlmKCBhcnJheVtpMl0ucyA+IHMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpMiA9IGkgKyBqOworICAgICAgICAgICAgaTIgLT0gaTIgPj0gbGVuID8gbGVuIDogMDsKKworICAgICAgICAgICAgaWYoIGFycmF5W2kyXS5zID4gcyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggaiA8PSBrMiApICAgICAgICAgICAvKiBleGNsdWRlIHBvaW50ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIHByZXZfY3VycmVudC0+bmV4dCA9IGN1cnJlbnQtPm5leHQ7CisgICAgICAgICAgICBjdXJyZW50LT5zID0gMDsgICAgIC8qICJjbGVhciIgcG9pbnQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBwcmV2X2N1cnJlbnQgPSBjdXJyZW50OworICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICB9CisgICAgd2hpbGUoIGN1cnJlbnQgIT0gMCApOworCisgICAgLyogUGFzcyAzLgorICAgICAgIFJlbW92ZXMgbm9uLWRvbWluYW50IHBvaW50cyB3aXRoIDEtbGVuZ3RoIHN1cHBvcnQgcmVnaW9uICovCisgICAgY3VycmVudCA9IHRlbXAubmV4dDsKKyAgICBhc3NlcnQoIGN1cnJlbnQgKTsKKyAgICBwcmV2X2N1cnJlbnQgPSAmdGVtcDsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiggY3VycmVudC0+ayA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgcyA9IGN1cnJlbnQtPnM7CisgICAgICAgICAgICBpID0gKGludCkoY3VycmVudCAtIGFycmF5KTsKKworICAgICAgICAgICAgaTEgPSBpIC0gMTsKKyAgICAgICAgICAgIGkxICs9IGkxIDwgMCA/IGxlbiA6IDA7CisKKyAgICAgICAgICAgIGkyID0gaSArIDE7CisgICAgICAgICAgICBpMiAtPSBpMiA+PSBsZW4gPyBsZW4gOiAwOworCisgICAgICAgICAgICBpZiggcyA8PSBhcnJheVtpMV0ucyB8fCBzIDw9IGFycmF5W2kyXS5zICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X2N1cnJlbnQtPm5leHQgPSBjdXJyZW50LT5uZXh0OworICAgICAgICAgICAgICAgIGN1cnJlbnQtPnMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHByZXZfY3VycmVudCA9IGN1cnJlbnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcHJldl9jdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICAgIHdoaWxlKCBjdXJyZW50ICE9IDAgKTsKKworICAgIGlmKCBtZXRob2QgPT0gQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfS0NPUyApCisgICAgICAgIGdvdG8gY29weV92ZWN0OworCisgICAgLyogUGFzcyA0LgorICAgICAgIENsZWFucyByZW1haW5lZCBjb3VwbGVzIG9mIHBvaW50cyAqLworICAgIGFzc2VydCggdGVtcC5uZXh0ICk7CisKKyAgICBpZiggYXJyYXlbMF0ucyAhPSAwICYmIGFycmF5W2xlbiAtIDFdLnMgIT0gMCApICAgICAgLyogc3BlY2lmaWMgY2FzZSAqLworICAgIHsKKyAgICAgICAgZm9yKCBpMSA9IDE7IGkxIDwgbGVuICYmIGFycmF5W2kxXS5zICE9IDA7IGkxKysgKQorICAgICAgICB7CisgICAgICAgICAgICBhcnJheVtpMSAtIDFdLnMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmKCBpMSA9PSBsZW4gKQorICAgICAgICAgICAgZ290byBjb3B5X3ZlY3Q7ICAgICAvKiBhbGwgcG9pbnRzIHN1cnZpdmVkICovCisgICAgICAgIGkxLS07CisKKyAgICAgICAgZm9yKCBpMiA9IGxlbiAtIDI7IGkyID4gMCAmJiBhcnJheVtpMl0ucyAhPSAwOyBpMi0tICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJyYXlbaTJdLm5leHQgPSAwOworICAgICAgICAgICAgYXJyYXlbaTIgKyAxXS5zID0gMDsKKyAgICAgICAgfQorICAgICAgICBpMisrOworCisgICAgICAgIGlmKCBpMSA9PSAwICYmIGkyID09IGxlbiAtIDEgKSAgLyogb25seSB0d28gcG9pbnRzICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGkxID0gKGludCkoYXJyYXlbMF0ubmV4dCAtIGFycmF5KTsKKyAgICAgICAgICAgIGFycmF5W2xlbl0gPSBhcnJheVswXTsgICAgICAvKiBtb3ZlIHRvIHRoZSBlbmQgKi8KKyAgICAgICAgICAgIGFycmF5W2xlbl0ubmV4dCA9IDA7CisgICAgICAgICAgICBhcnJheVtsZW4gLSAxXS5uZXh0ID0gYXJyYXkgKyBsZW47CisgICAgICAgIH0KKyAgICAgICAgdGVtcC5uZXh0ID0gYXJyYXkgKyBpMTsKKyAgICB9CisKKyAgICBjdXJyZW50ID0gdGVtcC5uZXh0OworICAgIGZpcnN0ID0gcHJldl9jdXJyZW50ID0gJnRlbXA7CisgICAgY291bnQgPSAxOworCisgICAgLyogZG8gbGFzdCBwYXNzICovCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKCBjdXJyZW50LT5uZXh0ID09IDAgfHwgY3VycmVudC0+bmV4dCAtIGN1cnJlbnQgIT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjb3VudCA+PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY291bnQgPT0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczEgPSBwcmV2X2N1cnJlbnQtPnM7CisgICAgICAgICAgICAgICAgICAgIGludCBzMiA9IGN1cnJlbnQtPnM7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHMxID4gczIgfHwgKHMxID09IHMyICYmIHByZXZfY3VycmVudC0+ayA8PSBjdXJyZW50LT5rKSApCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgc2Vjb25kICovCisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2N1cnJlbnQtPm5leHQgPSBjdXJyZW50LT5uZXh0OworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAvKiByZW1vdmUgZmlyc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LT5uZXh0ID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmaXJzdC0+bmV4dC0+bmV4dCA9IGN1cnJlbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaXJzdCA9IGN1cnJlbnQ7CisgICAgICAgICAgICBjb3VudCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgcHJldl9jdXJyZW50ID0gY3VycmVudDsKKyAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHQ7CisgICAgfQorICAgIHdoaWxlKCBjdXJyZW50ICE9IDAgKTsKKworICBjb3B5X3ZlY3Q6CisKKyAgICAvKiBnYXRoZXIgcG9pbnRzICovCisgICAgY3VycmVudCA9IHRlbXAubmV4dDsKKyAgICBhc3NlcnQoIGN1cnJlbnQgKTsKKworICAgIGRvCisgICAgeworICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY3VycmVudC0+cHQsIHdyaXRlciApOworICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+bmV4dDsKKyAgICB9CisgICAgd2hpbGUoIGN1cnJlbnQgIT0gMCApOworCitleGl0X2Z1bmN0aW9uOgorCisgICAgKmNvbnRvdXIgPSBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisKKyAgICBhc3NlcnQoIHdyaXRlci5zZXEtPnRvdGFsID4gMCApOworCisgICAgaWYoIGJ1ZmZlciAhPSBsb2NhbF9idWZmZXIgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLypBcHBsaWVzIHNvbWUgYXBwcm94aW1hdGlvbiBhbGdvcml0aG0gdG8gY2hhaW4tY29kZWQgY29udG91cihzKSBhbmQKKyAgY29udmVydHMgaXQvdGhlbSB0byBwb2x5Z29uYWwgcmVwcmVzZW50YXRpb24gKi8KK0NWX0lNUEwgQ3ZTZXEqCitjdkFwcHJveENoYWlucyggQ3ZTZXEqICAgICAgICAgICAgICBzcmNfc2VxLAorICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogICAgICAgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgICAgICAgIC8qcGFyYW1ldGVyKi8sIAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgbWluaW1hbF9wZXJpbWV0ZXIsIAorICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgcmVjdXJzaXZlICkKK3sKKyAgICBDdlNlcSAqcHJldl9jb250b3VyID0gMCwgKnBhcmVudCA9IDA7CisgICAgQ3ZTZXEgKmRzdF9zZXEgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZBcHByb3hDaGFpbnMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNyY19zZXEgfHwgIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpZiggbWV0aG9kID4gQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfS0NPUyB8fCBtZXRob2QgPD0gMCB8fCBtaW5pbWFsX3BlcmltZXRlciA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKworICAgIHdoaWxlKCBzcmNfc2VxICE9IDAgKQorICAgIHsKKyAgICAgICAgaW50IGxlbiA9IHNyY19zZXEtPnRvdGFsOworCisgICAgICAgIGlmKCBsZW4gPj0gbWluaW1hbF9wZXJpbWV0ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlNlcSAqY29udG91cjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3dpdGNoKCBtZXRob2QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDVl9DSEFJTl9BUFBST1hfTk9ORToKKyAgICAgICAgICAgIGNhc2UgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRToKKyAgICAgICAgICAgIGNhc2UgQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfTDE6CisgICAgICAgICAgICBjYXNlIENWX0NIQUlOX0FQUFJPWF9UQzg5X0tDT1M6CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZBcHByb3hpbWF0ZUNoYWluVEM4OSggKEN2Q2hhaW4gKikgc3JjX3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIEN2Q29udG91ciApLCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdlNlcSoqKSZjb250b3VyLCBtZXRob2QgKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0KCBjb250b3VyICk7CisKKyAgICAgICAgICAgIGlmKCBjb250b3VyLT50b3RhbCA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Qm91bmRpbmdSZWN0KCBjb250b3VyLCAxICk7CisKKyAgICAgICAgICAgICAgICBjb250b3VyLT52X3ByZXYgPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgY29udG91ci0+aF9wcmV2ID0gcHJldl9jb250b3VyOworCisgICAgICAgICAgICAgICAgaWYoIHByZXZfY29udG91ciApCisgICAgICAgICAgICAgICAgICAgIHByZXZfY29udG91ci0+aF9uZXh0ID0gY29udG91cjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBwYXJlbnQgKQorICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPnZfbmV4dCA9IGNvbnRvdXI7CisgICAgICAgICAgICAgICAgcHJldl9jb250b3VyID0gY29udG91cjsKKyAgICAgICAgICAgICAgICBpZiggIWRzdF9zZXEgKQorICAgICAgICAgICAgICAgICAgICBkc3Rfc2VxID0gcHJldl9jb250b3VyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvKiBpZiByZXN1bHRhbnQgY29udG91ciBoYXMgemVybyBsZW5ndGgsIHNraXAgaXQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZW4gPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhcmVjdXJzaXZlICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmKCBzcmNfc2VxLT52X25leHQgJiYgbGVuID49IG1pbmltYWxfcGVyaW1ldGVyICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBwcmV2X2NvbnRvdXIgIT0gMCApOworICAgICAgICAgICAgcGFyZW50ID0gcHJldl9jb250b3VyOworICAgICAgICAgICAgcHJldl9jb250b3VyID0gMDsKKyAgICAgICAgICAgIHNyY19zZXEgPSBzcmNfc2VxLT52X25leHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSggc3JjX3NlcS0+aF9uZXh0ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNyY19zZXEgPSBzcmNfc2VxLT52X3ByZXY7CisgICAgICAgICAgICAgICAgaWYoIHNyY19zZXEgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHByZXZfY29udG91ciA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT52X3ByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggc3JjX3NlcSApCisgICAgICAgICAgICAgICAgc3JjX3NlcSA9IHNyY19zZXEtPmhfbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZHN0X3NlcTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9seWdvbmFsIEFwcHJveGltYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFJhbWVyLURvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG0gZm9yIHBvbHlnb24gc2ltcGxpZmljYXRpb24gKi8KKworLyogdGhlIHZlcnNpb24gZm9yIGludGVnZXIgcG9pbnQgY29vcmRpbmF0ZXMgKi8KK3N0YXRpYyBDdlN0YXR1cworaWN2QXBwcm94UG9seURQXzMycyggQ3ZTZXEqIHNyY19jb250b3VyLCBpbnQgaGVhZGVyX3NpemUsIAorICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiBkc3RfY29udG91ciwgZmxvYXQgZXBzICkKK3sKKyAgICBpbnQgICAgICAgICAgICAgaW5pdF9pdGVycyA9IDM7CisgICAgQ3ZTbGljZSAgICAgICAgIHNsaWNlID0gezAsIDB9LCByaWdodF9zbGljZSA9IHswLCAwfTsKKyAgICBDdlNlcVJlYWRlciAgICAgcmVhZGVyLCByZWFkZXIyOworICAgIEN2U2VxV3JpdGVyICAgICB3cml0ZXI7CisgICAgQ3ZQb2ludCAgICAgICAgIHN0YXJ0X3B0ID0ge0lOVF9NSU4sIElOVF9NSU59LCBlbmRfcHQgPSB7MCwgMH0sIHB0ID0gezAsMH07CisgICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBqLCBjb3VudCA9IHNyY19jb250b3VyLT50b3RhbCwgbmV3X2NvdW50OworICAgIGludCAgICAgICAgICAgICBpc19jbG9zZWQgPSBDVl9JU19TRVFfQ0xPU0VEKCBzcmNfY29udG91ciApOworICAgIGludCAgICAgICAgICAgICBsZV9lcHMgPSAwOworICAgIEN2TWVtU3RvcmFnZSogICB0ZW1wX3N0b3JhZ2UgPSAwOworICAgIEN2U2VxKiAgICAgICAgICBzdGFjayA9IDA7CisgICAgCisgICAgYXNzZXJ0KCBDVl9TRVFfRUxUWVBFKHNyY19jb250b3VyKSA9PSBDVl8zMlNDMiApOworICAgIGN2U3RhcnRXcml0ZVNlcSggc3JjX2NvbnRvdXItPmZsYWdzLCBoZWFkZXJfc2l6ZSwgc2l6ZW9mKHB0KSwgc3RvcmFnZSwgJndyaXRlciApOworCisgICAgaWYoIHNyY19jb250b3VyLT50b3RhbCA9PSAwICApCisgICAgeworICAgICAgICAqZHN0X2NvbnRvdXIgPSBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisgICAgICAgIHJldHVybiBDVl9PSzsKKyAgICB9CisKKyAgICB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApOworCisgICAgYXNzZXJ0KCBzcmNfY29udG91ci0+Zmlyc3QgIT0gMCApOworICAgIHN0YWNrID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdlNsaWNlKSwgdGVtcF9zdG9yYWdlICk7CisgICAgZXBzICo9IGVwczsKKyAgICBjdlN0YXJ0UmVhZFNlcSggc3JjX2NvbnRvdXIsICZyZWFkZXIsIDAgKTsKKworICAgIGlmKCAhaXNfY2xvc2VkICkKKyAgICB7CisgICAgICAgIHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4ID0gY291bnQ7CisgICAgICAgIGVuZF9wdCA9ICooQ3ZQb2ludCopKHJlYWRlci5wdHIpOworICAgICAgICBzdGFydF9wdCA9ICooQ3ZQb2ludCopY3ZHZXRTZXFFbGVtKCBzcmNfY29udG91ciwgLTEgKTsKKworICAgICAgICBpZiggc3RhcnRfcHQueCAhPSBlbmRfcHQueCB8fCBzdGFydF9wdC55ICE9IGVuZF9wdC55ICkKKyAgICAgICAgeworICAgICAgICAgICAgc2xpY2Uuc3RhcnRfaW5kZXggPSAwOworICAgICAgICAgICAgc2xpY2UuZW5kX2luZGV4ID0gY291bnQgLSAxOworICAgICAgICAgICAgY3ZTZXFQdXNoKCBzdGFjaywgJnNsaWNlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpc19jbG9zZWQgPSAxOworICAgICAgICAgICAgaW5pdF9pdGVycyA9IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYoIGlzX2Nsb3NlZCApCisgICAgeworICAgICAgICAvKiAxLiBGaW5kIGFwcHJveGltYXRlbHkgdHdvIGZhcnRoZXN0IHBvaW50cyBvZiB0aGUgY29udG91ciAqLworICAgICAgICByaWdodF9zbGljZS5zdGFydF9pbmRleCA9IDA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGluaXRfaXRlcnM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXhfZGlzdCA9IDA7CisgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXgsIDEgKTsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHN0YXJ0X3B0LCByZWFkZXIgKTsgICAvKiByZWFkIHRoZSBmaXJzdCBwb2ludCAqLworCisgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGR4LCBkeSwgZGlzdDsKKworICAgICAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICBkeCA9IHB0LnggLSBzdGFydF9wdC54OworICAgICAgICAgICAgICAgIGR5ID0gcHQueSAtIHN0YXJ0X3B0Lnk7CisKKyAgICAgICAgICAgICAgICBkaXN0ID0gZHggKiBkeCArIGR5ICogZHk7CisKKyAgICAgICAgICAgICAgICBpZiggZGlzdCA+IG1heF9kaXN0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heF9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVfZXBzID0gbWF4X2Rpc3QgPD0gZXBzOworICAgICAgICB9CisKKyAgICAgICAgLyogMi4gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgKi8KKyAgICAgICAgaWYoICFsZV9lcHMgKQorICAgICAgICB7CisgICAgICAgICAgICBzbGljZS5zdGFydF9pbmRleCA9IGN2R2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyICk7CisgICAgICAgICAgICBzbGljZS5lbmRfaW5kZXggPSByaWdodF9zbGljZS5zdGFydF9pbmRleCArPSBzbGljZS5zdGFydF9pbmRleDsKKworICAgICAgICAgICAgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggLT0gcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggPj0gY291bnQgPyBjb3VudCA6IDA7CisgICAgICAgICAgICByaWdodF9zbGljZS5lbmRfaW5kZXggPSBzbGljZS5zdGFydF9pbmRleDsKKyAgICAgICAgICAgIGlmKCByaWdodF9zbGljZS5lbmRfaW5kZXggPCByaWdodF9zbGljZS5zdGFydF9pbmRleCApCisgICAgICAgICAgICAgICAgcmlnaHRfc2xpY2UuZW5kX2luZGV4ICs9IGNvdW50OworCisgICAgICAgICAgICBjdlNlcVB1c2goIHN0YWNrLCAmcmlnaHRfc2xpY2UgKTsKKyAgICAgICAgICAgIGN2U2VxUHVzaCggc3RhY2ssICZzbGljZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBzdGFydF9wdCwgd3JpdGVyICk7CisgICAgfQorCisgICAgLyogMy4gcnVuIHJlY3Vyc2l2ZSBwcm9jZXNzICovCisgICAgd2hpbGUoIHN0YWNrLT50b3RhbCAhPSAwICkKKyAgICB7CisgICAgICAgIGN2U2VxUG9wKCBzdGFjaywgJnNsaWNlICk7CisKKyAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHNsaWNlLmVuZF9pbmRleCApOworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBlbmRfcHQsIHJlYWRlciApOworCisgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyLCBzbGljZS5zdGFydF9pbmRleCApOworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBzdGFydF9wdCwgcmVhZGVyICk7CisKKyAgICAgICAgaWYoIHNsaWNlLmVuZF9pbmRleCA+IHNsaWNlLnN0YXJ0X2luZGV4ICsgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkeCwgZHksIGRpc3QsIG1heF9kaXN0ID0gMDsKKworICAgICAgICAgICAgZHggPSBlbmRfcHQueCAtIHN0YXJ0X3B0Lng7CisgICAgICAgICAgICBkeSA9IGVuZF9wdC55IC0gc3RhcnRfcHQueTsKKworICAgICAgICAgICAgYXNzZXJ0KCBkeCAhPSAwIHx8IGR5ICE9IDAgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gc2xpY2Uuc3RhcnRfaW5kZXggKyAxOyBpIDwgc2xpY2UuZW5kX2luZGV4OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICBkaXN0ID0gYWJzKChwdC55IC0gc3RhcnRfcHQueSkgKiBkeCAtIChwdC54IC0gc3RhcnRfcHQueCkgKiBkeSk7CisKKyAgICAgICAgICAgICAgICBpZiggZGlzdCA+IG1heF9kaXN0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heF9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGVfZXBzID0gKGRvdWJsZSltYXhfZGlzdCAqIG1heF9kaXN0IDw9IGVwcyAqICgoZG91YmxlKWR4ICogZHggKyAoZG91YmxlKWR5ICogZHkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBzbGljZS5lbmRfaW5kZXggPiBzbGljZS5zdGFydF9pbmRleCApOworICAgICAgICAgICAgbGVfZXBzID0gMTsKKyAgICAgICAgICAgIC8qIHJlYWQgc3RhcnRpbmcgcG9pbnQgKi8KKyAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyLCBzbGljZS5zdGFydF9pbmRleCApOworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggc3RhcnRfcHQsIHJlYWRlciApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGxlX2VwcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBzdGFydF9wdCwgd3JpdGVyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByaWdodF9zbGljZS5lbmRfaW5kZXggPSBzbGljZS5lbmRfaW5kZXg7CisgICAgICAgICAgICBzbGljZS5lbmRfaW5kZXggPSByaWdodF9zbGljZS5zdGFydF9pbmRleDsKKyAgICAgICAgICAgIGN2U2VxUHVzaCggc3RhY2ssICZyaWdodF9zbGljZSApOworICAgICAgICAgICAgY3ZTZXFQdXNoKCBzdGFjaywgJnNsaWNlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpc19jbG9zZWQgPSBDVl9JU19TRVFfQ0xPU0VEKCBzcmNfY29udG91ciApOworICAgIGlmKCAhaXNfY2xvc2VkICkKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGVuZF9wdCwgd3JpdGVyICk7CisKKyAgICAqZHN0X2NvbnRvdXIgPSBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisgICAgCisgICAgY3ZTdGFydFJlYWRTZXEoICpkc3RfY29udG91ciwgJnJlYWRlciwgaXNfY2xvc2VkICk7CisgICAgQ1ZfUkVBRF9TRVFfRUxFTSggc3RhcnRfcHQsIHJlYWRlciApOworCisgICAgcmVhZGVyMiA9IHJlYWRlcjsKKyAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisKKyAgICBuZXdfY291bnQgPSBjb3VudCA9ICgqZHN0X2NvbnRvdXIpLT50b3RhbDsKKyAgICBmb3IoIGkgPSAhaXNfY2xvc2VkOyBpIDwgY291bnQgLSAhaXNfY2xvc2VkICYmIG5ld19jb3VudCA+IDI7IGkrKyApCisgICAgeworICAgICAgICBpbnQgZHgsIGR5LCBkaXN0OworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBlbmRfcHQsIHJlYWRlciApOworCisgICAgICAgIGR4ID0gZW5kX3B0LnggLSBzdGFydF9wdC54OworICAgICAgICBkeSA9IGVuZF9wdC55IC0gc3RhcnRfcHQueTsKKyAgICAgICAgZGlzdCA9IGFicygocHQueCAtIHN0YXJ0X3B0LngpKmR5IC0gKHB0LnkgLSBzdGFydF9wdC55KSpkeCk7CisgICAgICAgIGlmKCAoZG91YmxlKWRpc3QgKiBkaXN0IDw9IDAuNSplcHMqKChkb3VibGUpZHgqZHggKyAoZG91YmxlKWR5KmR5KSAmJiBkeCAhPSAwICYmIGR5ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfY291bnQtLTsKKyAgICAgICAgICAgICooKEN2UG9pbnQqKXJlYWRlcjIucHRyKSA9IHN0YXJ0X3B0ID0gZW5kX3B0OworICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKHB0KSwgcmVhZGVyMiApOworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQsIHJlYWRlciApOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKigoQ3ZQb2ludCopcmVhZGVyMi5wdHIpID0gc3RhcnRfcHQgPSBwdDsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKHB0KSwgcmVhZGVyMiApOworICAgICAgICBwdCA9IGVuZF9wdDsKKyAgICB9CisKKyAgICBpZiggIWlzX2Nsb3NlZCApCisgICAgICAgICooKEN2UG9pbnQqKXJlYWRlcjIucHRyKSA9IHB0OworCisgICAgaWYoIG5ld19jb3VudCA8IGNvdW50ICkKKyAgICAgICAgY3ZTZXFQb3BNdWx0aSggKmRzdF9jb250b3VyLCAwLCBjb3VudCAtIG5ld19jb3VudCApOworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8qIHRoZSB2ZXJzaW9uIGZvciBpbnRlZ2VyIHBvaW50IGNvb3JkaW5hdGVzICovCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkFwcHJveFBvbHlEUF8zMmYoIEN2U2VxKiBzcmNfY29udG91ciwgaW50IGhlYWRlcl9zaXplLCAKKyAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiogZHN0X2NvbnRvdXIsIGZsb2F0IGVwcyApCit7CisgICAgaW50ICAgICAgICAgICAgIGluaXRfaXRlcnMgPSAzOworICAgIEN2U2xpY2UgICAgICAgICBzbGljZSA9IHswLCAwfSwgcmlnaHRfc2xpY2UgPSB7MCwgMH07CisgICAgQ3ZTZXFSZWFkZXIgICAgIHJlYWRlciwgcmVhZGVyMjsKKyAgICBDdlNlcVdyaXRlciAgICAgd3JpdGVyOworICAgIEN2UG9pbnQyRDMyZiAgICBzdGFydF9wdCA9IHstMWU2ZiwgLTFlNmZ9LCBlbmRfcHQgPSB7MCwgMH0sIHB0ID0gezAsMH07CisgICAgaW50ICAgICAgICAgICAgIGkgPSAwLCBqLCBjb3VudCA9IHNyY19jb250b3VyLT50b3RhbCwgbmV3X2NvdW50OworICAgIGludCAgICAgICAgICAgICBpc19jbG9zZWQgPSBDVl9JU19TRVFfQ0xPU0VEKCBzcmNfY29udG91ciApOworICAgIGludCAgICAgICAgICAgICBsZV9lcHMgPSAwOworICAgIEN2TWVtU3RvcmFnZSogICB0ZW1wX3N0b3JhZ2UgPSAwOworICAgIEN2U2VxKiAgICAgICAgICBzdGFjayA9IDA7CisgICAgCisgICAgYXNzZXJ0KCBDVl9TRVFfRUxUWVBFKHNyY19jb250b3VyKSA9PSBDVl8zMkZDMiApOworICAgIGN2U3RhcnRXcml0ZVNlcSggc3JjX2NvbnRvdXItPmZsYWdzLCBoZWFkZXJfc2l6ZSwgc2l6ZW9mKHB0KSwgc3RvcmFnZSwgJndyaXRlciApOworCisgICAgaWYoIHNyY19jb250b3VyLT50b3RhbCA9PSAwICApCisgICAgeworICAgICAgICAqZHN0X2NvbnRvdXIgPSBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisgICAgICAgIHJldHVybiBDVl9PSzsKKyAgICB9CisKKyAgICB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApOworCisgICAgYXNzZXJ0KCBzcmNfY29udG91ci0+Zmlyc3QgIT0gMCApOworICAgIHN0YWNrID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdlNsaWNlKSwgdGVtcF9zdG9yYWdlICk7CisgICAgZXBzICo9IGVwczsKKyAgICBjdlN0YXJ0UmVhZFNlcSggc3JjX2NvbnRvdXIsICZyZWFkZXIsIDAgKTsKKworICAgIGlmKCAhaXNfY2xvc2VkICkKKyAgICB7CisgICAgICAgIHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4ID0gY291bnQ7CisgICAgICAgIGVuZF9wdCA9ICooQ3ZQb2ludDJEMzJmKikocmVhZGVyLnB0cik7CisgICAgICAgIHN0YXJ0X3B0ID0gKihDdlBvaW50MkQzMmYqKWN2R2V0U2VxRWxlbSggc3JjX2NvbnRvdXIsIC0xICk7CisKKyAgICAgICAgaWYoIGZhYnMoc3RhcnRfcHQueCAtIGVuZF9wdC54KSA+IEZMVF9FUFNJTE9OIHx8CisgICAgICAgICAgICBmYWJzKHN0YXJ0X3B0LnkgLSBlbmRfcHQueSkgPiBGTFRfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNsaWNlLnN0YXJ0X2luZGV4ID0gMDsKKyAgICAgICAgICAgIHNsaWNlLmVuZF9pbmRleCA9IGNvdW50IC0gMTsKKyAgICAgICAgICAgIGN2U2VxUHVzaCggc3RhY2ssICZzbGljZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaXNfY2xvc2VkID0gMTsKKyAgICAgICAgICAgIGluaXRfaXRlcnMgPSAxOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmKCBpc19jbG9zZWQgKQorICAgIHsKKyAgICAgICAgLyogMS4gRmluZCBhcHByb3hpbWF0ZWx5IHR3byBmYXJ0aGVzdCBwb2ludHMgb2YgdGhlIGNvbnRvdXIgKi8KKyAgICAgICAgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggPSAwOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpbml0X2l0ZXJzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgbWF4X2Rpc3QgPSAwOworICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4LCAxICk7CisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBzdGFydF9wdCwgcmVhZGVyICk7ICAgLyogcmVhZCB0aGUgZmlyc3QgcG9pbnQgKi8KKworICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGNvdW50OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkeCwgZHksIGRpc3Q7CisKKyAgICAgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgZHggPSBwdC54IC0gc3RhcnRfcHQueDsKKyAgICAgICAgICAgICAgICBkeSA9IHB0LnkgLSBzdGFydF9wdC55OworCisgICAgICAgICAgICAgICAgZGlzdCA9IGR4ICogZHggKyBkeSAqIGR5OworCisgICAgICAgICAgICAgICAgaWYoIGRpc3QgPiBtYXhfZGlzdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfZGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4ID0gajsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxlX2VwcyA9IG1heF9kaXN0IDw9IGVwczsKKyAgICAgICAgfQorCisgICAgICAgIC8qIDIuIGluaXRpYWxpemUgdGhlIHN0YWNrICovCisgICAgICAgIGlmKCAhbGVfZXBzICkKKyAgICAgICAgeworICAgICAgICAgICAgc2xpY2Uuc3RhcnRfaW5kZXggPSBjdkdldFNlcVJlYWRlclBvcyggJnJlYWRlciApOworICAgICAgICAgICAgc2xpY2UuZW5kX2luZGV4ID0gcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggKz0gc2xpY2Uuc3RhcnRfaW5kZXg7CisKKyAgICAgICAgICAgIHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4IC09IHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4ID49IGNvdW50ID8gY291bnQgOiAwOworICAgICAgICAgICAgcmlnaHRfc2xpY2UuZW5kX2luZGV4ID0gc2xpY2Uuc3RhcnRfaW5kZXg7CisgICAgICAgICAgICBpZiggcmlnaHRfc2xpY2UuZW5kX2luZGV4IDwgcmlnaHRfc2xpY2Uuc3RhcnRfaW5kZXggKQorICAgICAgICAgICAgICAgIHJpZ2h0X3NsaWNlLmVuZF9pbmRleCArPSBjb3VudDsKKworICAgICAgICAgICAgY3ZTZXFQdXNoKCBzdGFjaywgJnJpZ2h0X3NsaWNlICk7CisgICAgICAgICAgICBjdlNlcVB1c2goIHN0YWNrLCAmc2xpY2UgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggc3RhcnRfcHQsIHdyaXRlciApOworICAgIH0KKworICAgIC8qIDMuIHJ1biByZWN1cnNpdmUgcHJvY2VzcyAqLworICAgIHdoaWxlKCBzdGFjay0+dG90YWwgIT0gMCApCisgICAgeworICAgICAgICBjdlNlcVBvcCggc3RhY2ssICZzbGljZSApOworCisgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyLCBzbGljZS5lbmRfaW5kZXggKTsKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggZW5kX3B0LCByZWFkZXIgKTsKKworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggc3RhcnRfcHQsIHJlYWRlciApOworCisgICAgICAgIGlmKCBzbGljZS5lbmRfaW5kZXggPiBzbGljZS5zdGFydF9pbmRleCArIDEgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZHgsIGR5LCBkaXN0LCBtYXhfZGlzdCA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGR4ID0gZW5kX3B0LnggLSBzdGFydF9wdC54OworICAgICAgICAgICAgZHkgPSBlbmRfcHQueSAtIHN0YXJ0X3B0Lnk7CisKKyAgICAgICAgICAgIGFzc2VydCggZHggIT0gMCB8fCBkeSAhPSAwICk7CisKKyAgICAgICAgICAgIGZvciggaSA9IHNsaWNlLnN0YXJ0X2luZGV4ICsgMTsgaSA8IHNsaWNlLmVuZF9pbmRleDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgZGlzdCA9IGZhYnMoKHB0LnkgLSBzdGFydF9wdC55KSAqIGR4IC0gKHB0LnggLSBzdGFydF9wdC54KSAqIGR5KTsKKworICAgICAgICAgICAgICAgIGlmKCBkaXN0ID4gbWF4X2Rpc3QgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgICAgICAgICByaWdodF9zbGljZS5zdGFydF9pbmRleCA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZV9lcHMgPSAoZG91YmxlKW1heF9kaXN0ICogbWF4X2Rpc3QgPD0gZXBzICogKChkb3VibGUpZHggKiBkeCArIChkb3VibGUpZHkgKiBkeSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoIHNsaWNlLmVuZF9pbmRleCA+IHNsaWNlLnN0YXJ0X2luZGV4ICk7CisgICAgICAgICAgICBsZV9lcHMgPSAxOworICAgICAgICAgICAgLyogcmVhZCBzdGFydGluZyBwb2ludCAqLworICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHNsaWNlLnN0YXJ0X2luZGV4ICk7CisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBzdGFydF9wdCwgcmVhZGVyICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggbGVfZXBzICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHN0YXJ0X3B0LCB3cml0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJpZ2h0X3NsaWNlLmVuZF9pbmRleCA9IHNsaWNlLmVuZF9pbmRleDsKKyAgICAgICAgICAgIHNsaWNlLmVuZF9pbmRleCA9IHJpZ2h0X3NsaWNlLnN0YXJ0X2luZGV4OworICAgICAgICAgICAgY3ZTZXFQdXNoKCBzdGFjaywgJnJpZ2h0X3NsaWNlICk7CisgICAgICAgICAgICBjdlNlcVB1c2goIHN0YWNrLCAmc2xpY2UgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlzX2Nsb3NlZCA9IENWX0lTX1NFUV9DTE9TRUQoIHNyY19jb250b3VyICk7CisgICAgaWYoICFpc19jbG9zZWQgKQorICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggZW5kX3B0LCB3cml0ZXIgKTsKKworICAgICpkc3RfY29udG91ciA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKyAgICAKKyAgICBjdlN0YXJ0UmVhZFNlcSggKmRzdF9jb250b3VyLCAmcmVhZGVyLCBpc19jbG9zZWQgKTsKKyAgICBDVl9SRUFEX1NFUV9FTEVNKCBzdGFydF9wdCwgcmVhZGVyICk7CisKKyAgICByZWFkZXIyID0gcmVhZGVyOworICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKworICAgIG5ld19jb3VudCA9IGNvdW50ID0gKCpkc3RfY29udG91ciktPnRvdGFsOworICAgIGZvciggaSA9ICFpc19jbG9zZWQ7IGkgPCBjb3VudCAtICFpc19jbG9zZWQgJiYgbmV3X2NvdW50ID4gMjsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBkeCwgZHksIGRpc3Q7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIGVuZF9wdCwgcmVhZGVyICk7CisKKyAgICAgICAgZHggPSBlbmRfcHQueCAtIHN0YXJ0X3B0Lng7CisgICAgICAgIGR5ID0gZW5kX3B0LnkgLSBzdGFydF9wdC55OworICAgICAgICBkaXN0ID0gZmFicygocHQueCAtIHN0YXJ0X3B0LngpKmR5IC0gKHB0LnkgLSBzdGFydF9wdC55KSpkeCk7CisgICAgICAgIGlmKCAoZG91YmxlKWRpc3QgKiBkaXN0IDw9IDAuNSplcHMqKChkb3VibGUpZHgqZHggKyAoZG91YmxlKWR5KmR5KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5ld19jb3VudC0tOworICAgICAgICAgICAgKigoQ3ZQb2ludDJEMzJmKilyZWFkZXIyLnB0cikgPSBzdGFydF9wdCA9IGVuZF9wdDsKKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihwdCksIHJlYWRlcjIgKTsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICooKEN2UG9pbnQyRDMyZiopcmVhZGVyMi5wdHIpID0gc3RhcnRfcHQgPSBwdDsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKHB0KSwgcmVhZGVyMiApOworICAgICAgICBwdCA9IGVuZF9wdDsKKyAgICB9CisKKyAgICBpZiggIWlzX2Nsb3NlZCApCisgICAgICAgICooKEN2UG9pbnQyRDMyZiopcmVhZGVyMi5wdHIpID0gcHQ7CisKKyAgICBpZiggbmV3X2NvdW50IDwgY291bnQgKQorICAgICAgICBjdlNlcVBvcE11bHRpKCAqZHN0X2NvbnRvdXIsIDAsIGNvdW50IC0gbmV3X2NvdW50ICk7CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworQ1ZfSU1QTCBDdlNlcSoKK2N2QXBwcm94UG9seSggY29uc3Qgdm9pZCogIGFycmF5LCBpbnQgIGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqICBzdG9yYWdlLCBpbnQgIG1ldGhvZCwgCisgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW1ldGVyLCBpbnQgcGFyYW1ldGVyMiApCit7CisgICAgQ3ZTZXEqIGRzdF9zZXEgPSAwOworICAgIEN2U2VxICpwcmV2X2NvbnRvdXIgPSAwLCAqcGFyZW50ID0gMDsKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXEqIHNyY19zZXEgPSAwOworICAgIEN2U2VxQmxvY2sgYmxvY2s7CisgICAgaW50IHJlY3Vyc2l2ZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2QXBwcm94UG9seSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19TRVEoIGFycmF5ICkpCisgICAgeworICAgICAgICBzcmNfc2VxID0gKEN2U2VxKilhcnJheTsKKyAgICAgICAgaWYoICFDVl9JU19TRVFfUE9MWUxJTkUoIHNyY19zZXEgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbnN1cHBvcnRlZCBzZXF1ZW5jZSB0eXBlIiApOworCisgICAgICAgIHJlY3Vyc2l2ZSA9IHBhcmFtZXRlcjI7CisKKyAgICAgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgICAgIHN0b3JhZ2UgPSBzcmNfc2VxLT5zdG9yYWdlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBzcmNfc2VxID0gY3ZQb2ludFNlcUZyb21NYXQoCisgICAgICAgICAgICBDVl9TRVFfS0lORF9DVVJWRSB8IChwYXJhbWV0ZXIyID8gQ1ZfU0VRX0ZMQUdfQ0xPU0VEIDogMCksCisgICAgICAgICAgICBhcnJheSwgJmNvbnRvdXJfaGVhZGVyLCAmYmxvY2sgKSk7CisgICAgfQorCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHN0b3JhZ2UgcG9pbnRlciAiICk7CisKKyAgICBpZiggaGVhZGVyX3NpemUgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJoZWFkZXJfc2l6ZSBpcyBuZWdhdGl2ZS4gIgorICAgICAgICAgICAgICAgICAgIlBhc3MgMCB0byBtYWtlIHRoZSBkZXN0aW5hdGlvbiBoZWFkZXJfc2l6ZSA9PSBpbnB1dCBoZWFkZXJfc2l6ZSIgKTsKKworICAgIGlmKCBoZWFkZXJfc2l6ZSA9PSAwICkKKyAgICAgICAgaGVhZGVyX3NpemUgPSBzcmNfc2VxLT5oZWFkZXJfc2l6ZTsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlMSU5FKCBzcmNfc2VxICkpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfU0VRX0NIQUlOKCBzcmNfc2VxICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnB1dCBjdXJ2ZXMgYXJlIG5vdCBwb2x5Z29uYWwuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc2UgY3ZBcHByb3hDaGFpbnMgZmlyc3QiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5wdXQgY3VydmVzIGhhdmUgdWtub3duIHR5cGUiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaGVhZGVyX3NpemUgPT0gMCApCisgICAgICAgIGhlYWRlcl9zaXplID0gc3JjX3NlcS0+aGVhZGVyX3NpemU7CisKKyAgICBpZiggaGVhZGVyX3NpemUgPCAoaW50KXNpemVvZihDdkNvbnRvdXIpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJOZXcgaGVhZGVyIHNpemUgbXVzdCBiZSBub24tbGVzcyB0aGFuIHNpemVvZihDdkNvbnRvdXIpIiApOworCisgICAgaWYoIG1ldGhvZCAhPSBDVl9QT0xZX0FQUFJPWF9EUCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVW5rbm93biBhcHByb3hpbWF0aW9uIG1ldGhvZCIgKTsKKworICAgIHdoaWxlKCBzcmNfc2VxICE9IDAgKQorICAgIHsKKyAgICAgICAgQ3ZTZXEgKmNvbnRvdXIgPSAwOworCisgICAgICAgIHN3aXRjaCAobWV0aG9kKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfUE9MWV9BUFBST1hfRFA6CisgICAgICAgICAgICBpZiggcGFyYW1ldGVyIDwgMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJBY2N1cmFjeSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIgKTsKKworICAgICAgICAgICAgaWYoIENWX1NFUV9FTFRZUEUoc3JjX3NlcSkgPT0gQ1ZfMzJTQzIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaWN2QXBwcm94UG9seURQXzMycyggc3JjX3NlcSwgaGVhZGVyX3NpemUsIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udG91ciwgKGZsb2F0KXBhcmFtZXRlciApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkFwcHJveFBvbHlEUF8zMmYoIHNyY19zZXEsIGhlYWRlcl9zaXplLCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRvdXIsIChmbG9hdClwYXJhbWV0ZXIgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGFwcHJveGltYXRpb24gbWV0aG9kIiApOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0KCBjb250b3VyICk7CisKKyAgICAgICAgaWYoIGhlYWRlcl9zaXplID49IChpbnQpc2l6ZW9mKEN2Q29udG91cikpCisgICAgICAgICAgICBjdkJvdW5kaW5nUmVjdCggY29udG91ciwgMSApOworCisgICAgICAgIGNvbnRvdXItPnZfcHJldiA9IHBhcmVudDsKKyAgICAgICAgY29udG91ci0+aF9wcmV2ID0gcHJldl9jb250b3VyOworCisgICAgICAgIGlmKCBwcmV2X2NvbnRvdXIgKQorICAgICAgICAgICAgcHJldl9jb250b3VyLT5oX25leHQgPSBjb250b3VyOworICAgICAgICBlbHNlIGlmKCBwYXJlbnQgKQorICAgICAgICAgICAgcGFyZW50LT52X25leHQgPSBjb250b3VyOworICAgICAgICBwcmV2X2NvbnRvdXIgPSBjb250b3VyOworICAgICAgICBpZiggIWRzdF9zZXEgKQorICAgICAgICAgICAgZHN0X3NlcSA9IHByZXZfY29udG91cjsKKworICAgICAgICBpZiggIXJlY3Vyc2l2ZSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggc3JjX3NlcS0+dl9uZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBwcmV2X2NvbnRvdXIgIT0gMCApOworICAgICAgICAgICAgcGFyZW50ID0gcHJldl9jb250b3VyOworICAgICAgICAgICAgcHJldl9jb250b3VyID0gMDsKKyAgICAgICAgICAgIHNyY19zZXEgPSBzcmNfc2VxLT52X25leHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSggc3JjX3NlcS0+aF9uZXh0ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNyY19zZXEgPSBzcmNfc2VxLT52X3ByZXY7CisgICAgICAgICAgICAgICAgaWYoIHNyY19zZXEgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHByZXZfY29udG91ciA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICBpZiggcGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT52X3ByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggc3JjX3NlcSApCisgICAgICAgICAgICAgICAgc3JjX3NlcSA9IHNyY19zZXEtPmhfbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZHN0X3NlcTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZjYWxjY29udHJhc3RoaXN0b2dyYW0uY3BwIGIvY3Yvc3JjL2N2Y2FsY2NvbnRyYXN0aGlzdG9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmE0NGIzCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2Y2FsY2NvbnRyYXN0aGlzdG9ncmFtLmNwcApAQCAtMCwwICsxLDM4NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKyNpZiAwCisKK0lQQ1ZBUEkoQ3ZTdGF0dXMsIGljdkNhbGNDb250cmFzdEhpc3Q4dUMxUiwgKCB1Y2hhcioqIGltZywgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2SGlzdG9ncmFtKiBoaXN0LCBpbnQgZG9udF9jbGVhciApKQorCitJUENWQVBJKEN2U3RhdHVzLCBpY3ZDYWxjQ29udHJhc3RIaXN0TWFzazh1QzFSLCAoIHVjaGFyKiogaW1nLCBpbnQgc3RlcCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgbWFzaywgaW50IG1hc2tfc3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2SGlzdG9ncmFtKiBoaXN0LCBpbnQgZG9udF9jbGVhciApKQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6ICAgICAgIGljdkNhbGNDb250cmFzdEhpc3Q4dUMxUgorLy8gICAgUHVycG9zZTogICAgQ2FsY3VsYXRpbmcgdGhlIGhpc3RvZ3JhbSBvZiBjb250cmFzdCBmcm9tIG9uZS1jaGFubmVsIGltYWdlcworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICBSZXR1cm5zOgorLy8gICAgTm90ZXM6ICAgICAgaWYgZG9udF9jbGVhciBwYXJhbWV0ZXIgaXMgTlVMTCB0aGVuIGhpc3RvZ3JhbSBjbGVhcmluZyBiZWZvcmUKKy8vICAgICAgICAgICAgICAgIGNhbGN1bGF0aW5nIChhbGwgdmFsdWVzIHNldHMgdG8gTlVMTCkKKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2Q2FsY0NvbnRyYXN0SGlzdDh1QzFSKCB1Y2hhcioqIGltZywgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdkhpc3RvZ3JhbSogaGlzdCwgaW50IGRvbnRfY2xlYXIgKQoreworICAgIGludCBpLCBqLCB0LCB4ID0gMCwgeSA9IDA7CisgICAgaW50IGRpbXM7CisKKyAgICBpZiggIWhpc3QgfHwgIWltZyApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGRpbXMgPSBoaXN0LT5jX2RpbXM7CisgICAgaWYoIGRpbXMgIT0gMSApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCBoaXN0LT50eXBlICE9IENWX0hJU1RfQVJSQVkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgaWYoICFpbWdbaV0gKQorICAgICAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZm9yKCBpID0gMDsgaSA8IGhpc3QtPmNfZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAhaGlzdC0+dGhyZXNoW2ldICkKKyAgICAgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICAgICAgYXNzZXJ0KCBoaXN0LT5jaGRpbXNbaV0gKTsKKyAgICB9CisKKyAgICBqID0gaGlzdC0+ZGltc1swXSAqIGhpc3QtPm1kaW1zWzBdOworCisgICAgaW50ICpuID0gKGludCAqKWN2QWxsb2MoIChzaXplX3QpaGlzdC0+ZGltc1swXSAqIHNpemVvZiggaW50ICkpOworCisgICAgaWYoIGhpc3QtPnR5cGUgPT0gQ1ZfSElTVF9BUlJBWSApCisgICAgeworICAgICAgICBpZiggIWRvbnRfY2xlYXIgKQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGo7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaGlzdC0+YXJyYXlbaV0gPSAwOworICAgICAgICAgICAgICAgIG5baV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoaGlzdC0+Y19kaW1zKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciAqZGF0YTAgPSBpbWdbMF07CisgICAgICAgICAgICAgICAgaW50ICphcnJheSA9IChpbnQgKikgaGlzdC0+YXJyYXk7CisgICAgICAgICAgICAgICAgaW50ICpjaGRpbXMgPSBoaXN0LT5jaGRpbXNbMF07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgajsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBjdlJvdW5kKCBoaXN0LT5hcnJheVtpXSApOworCisgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyssIGRhdGEwICs9IHN0ZXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gMTsgeCArPSAyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxX3IgPSBNSU4oIGRhdGEwW3hdLCBkYXRhMFt4ICsgMV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2Ml9yID0gTUFYKCBkYXRhMFt4XSwgZGF0YTBbeCArIDFdICk7CisKKy8vICAgIGNhbGN1bGF0ZSBjb250cmFzdCBmb3IgdGhlIHJpZ2h0LWxlZnQgcGFpciAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggdCA9IHYxX3I7IHQgPCB2Ml9yOyB0KysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwwID0gY2hkaW1zW3QgKyAxMjhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbdmFsMF0gKz0gTUlOKCB0IC0gdjFfciwgdjJfciAtIHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3ZhbDBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB5IDwgc2l6ZS5oZWlnaHQgLSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjFfZCA9IE1JTiggZGF0YTBbeF0sIGRhdGEwW3ggKyBzdGVwXSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2Ml9kID0gTUFYKCBkYXRhMFt4XSwgZGF0YTBbeCArIHN0ZXBdICk7CisKKy8vICAgIGNhbGN1bGF0ZSBjb250cmFzdCBmb3IgdGhlIHRvcC1kb3duIHBhaXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB0ID0gdjFfZDsgdCA8IHYyX2Q7IHQrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsMCA9IGNoZGltc1t0ICsgMTI4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVt2YWwwXSArPSBNSU4oIHQgLSB2MV9kLCB2Ml9kIC0gdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3ZhbDBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisvLyAgY29udmVydCBpbnQgdG8gZmxvYXQgCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGo7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbltpXSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpc3QtPmFycmF5W2ldID0gKGZsb2F0KSBhcnJheVtpXSAvIG5baV07CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpc3QtPmFycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RnJlZSggJm4gKTsKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6ICAgICAgIGljdkNhbGNDb250cmFzdEhpc3RNYXNrOHVDMVIKKy8vICAgIFB1cnBvc2U6ICAgIENhbGN1bGF0aW5nIHRoZSBtYXNrIGhpc3RvZ3JhbSBvZiBjb250cmFzdCBmcm9tIG9uZS1jaGFubmVsIGltYWdlcworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICBSZXR1cm5zOgorLy8gICAgTm90ZXM6ICAgICAgaWYgZG9udF9jbGVhciBwYXJhbWV0ZXIgaXMgTlVMTCB0aGVuIGhpc3RvZ3JhbSBjbGVhcmluZyBiZWZvcmUKKy8vICAgICAgICAgICAgICAgIGNhbGN1bGF0aW5nIChhbGwgdmFsdWVzIHNldHMgdG8gTlVMTCkKKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2Q2FsY0NvbnRyYXN0SGlzdE1hc2s4dUMxUiggdWNoYXIqKiBpbWcsIGludCBzdGVwLCB1Y2hhciogbWFzaywgaW50IG1hc2tfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBDdkhpc3RvZ3JhbSAqIGhpc3QsIGludCBkb250X2NsZWFyICkKK3sKKyAgICBpbnQgaSwgaiwgdCwgeCA9IDAsIHkgPSAwOworICAgIGludCBkaW1zOworCisKKyAgICBpZiggIWhpc3QgfHwgIWltZyB8fCAhbWFzayApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGRpbXMgPSBoaXN0LT5jX2RpbXM7CisgICAgaWYoIGRpbXMgIT0gMSApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCBoaXN0LT50eXBlICE9IENWX0hJU1RfQVJSQVkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgaWYoICFpbWdbaV0gKQorICAgICAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZm9yKCBpID0gMDsgaSA8IGhpc3QtPmNfZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAhaGlzdC0+dGhyZXNoW2ldICkKKyAgICAgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICAgICAgYXNzZXJ0KCBoaXN0LT5jaGRpbXNbaV0gKTsKKyAgICB9CisKKyAgICBqID0gaGlzdC0+ZGltc1swXSAqIGhpc3QtPm1kaW1zWzBdOworCisgICAgaW50ICpuID0gKGludCAqKWN2QWxsb2MoIChzaXplX3QpIGhpc3QtPmRpbXNbMF0gKiBzaXplb2YoIGludCApKTsKKworICAgIGlmKCBoaXN0LT50eXBlID09IENWX0hJU1RfQVJSQVkgKQorICAgIHsKKyAgICAgICAgaWYoICFkb250X2NsZWFyICkKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBqOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhpc3QtPmFycmF5W2ldID0gMDsKKyAgICAgICAgICAgICAgICBuW2ldID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGhpc3QtPmNfZGltcykKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIgKmRhdGEwID0gaW1nWzBdOworICAgICAgICAgICAgICAgIHVjaGFyICptYXNrcCA9IG1hc2s7CisgICAgICAgICAgICAgICAgaW50ICphcnJheSA9IChpbnQgKikgaGlzdC0+YXJyYXk7CisgICAgICAgICAgICAgICAgaW50ICpjaGRpbXMgPSBoaXN0LT5jaGRpbXNbMF07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgajsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSBjdlJvdW5kKCBoaXN0LT5hcnJheVtpXSApOworCisgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyssIGRhdGEwICs9IHN0ZXAsIG1hc2twICs9IG1hc2tfc3RlcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSAyOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza3BbeF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXNrcFt4ICsgMV0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxX3IgPSBNSU4oIGRhdGEwW3hdLCBkYXRhMFt4ICsgMV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYyX3IgPSBNQVgoIGRhdGEwW3hdLCBkYXRhMFt4ICsgMV0gKTsKKworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgIGNhbGN1bGF0ZSBjb250cmFzdCBmb3IgdGhlIHJpZ2h0LWxlZnQgcGFpciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB0ID0gdjFfcjsgdCA8IHYyX3I7IHQrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwwID0gY2hkaW1zW3QgKyAxMjhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheVt2YWwwXSArPSBNSU4oIHQgLSB2MV9yLCB2Ml9yIC0gdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgblt2YWwwXSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeSA8IHNpemUuaGVpZ2h0IC0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza3BbeCArIG1hc2tfc3RlcF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjFfZCA9IE1JTiggZGF0YTBbeF0sIGRhdGEwW3ggKyBzdGVwXSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYyX2QgPSBNQVgoIGRhdGEwW3hdLCBkYXRhMFt4ICsgc3RlcF0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgY2FsY3VsYXRlIGNvbnRyYXN0IGZvciB0aGUgdG9wLWRvd24gcGFpciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggdCA9IHYxX2Q7IHQgPCB2Ml9kOyB0KysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwwID0gY2hkaW1zW3QgKyAxMjhdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlbdmFsMF0gKz0gTUlOKCB0IC0gdjFfZCwgdjJfZCAtIHQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuW3ZhbDBdKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworLy8gIGNvbnZlcnQgaW50IHRvIGZsb2F0IAorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBqOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5baV0gIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0LT5hcnJheVtpXSA9IChmbG9hdCkgYXJyYXlbaV0gLyBuW2ldOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0LT5hcnJheVtpXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkZyZWUoICZuICk7CisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLyoKK0NWX0lNUEwgdm9pZCBjdkNhbGNDb250cmFzdEhpc3QoIElwbEltYWdlKiogaW1nLCBDdkhpc3RvZ3JhbSogaGlzdCwgaW50IGRvbnRfY2xlYXIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjQ29udHJhc3RIaXN0IiApOworICAgIHVjaGFyKiAgIGRhdGFbQ1ZfSElTVF9NQVhfRElNXTsKKyAgICBpbnQgICAgICBzdGVwID0gMDsKKyAgICBDdlNpemUgcm9pID0gezAsMH07CisKKyAgICBfX0JFR0lOX187CisKKyAgICB7Zm9yKCBpbnQgaSA9IDA7IGkgPCBoaXN0LT5jX2RpbXM7IGkrKyApCisgICAgICAgIENWX0NBTEwoIENWX0NIRUNLX0lNQUdFKCBpbWdbaV0gKSApO30KKworICAgIHtmb3IoIGludCBpID0gMDsgaSA8IGhpc3QtPmNfZGltczsgaSsrICkKKyAgICAgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIGltZ1tpXSwgJmRhdGFbaV0sICZzdGVwLCAmcm9pICk7fQorCisgICAgaWYoaW1nWzBdLT5uQ2hhbm5lbHMgIT0gMSkgCisgICAgICAgIENWX0VSUk9SKCBJUExfQmFkTnVtQ2hhbm5lbHMsICJiYWQgY2hhbm5lbHMgbnVtYmVycyIgKTsKKworICAgIGlmKGltZ1swXS0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVKSAKKyAgICAgICAgQ1ZfRVJST1IoIElQTF9CYWREZXB0aCwgImJhZCBpbWFnZSBkZXB0aCIgKTsKKworICAgIHN3aXRjaChpbWdbMF0tPmRlcHRoKQorICAgIHsKKyAgICBjYXNlIElQTF9ERVBUSF84VToKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZDYWxjQ29udHJhc3RIaXN0OHVDMVIoIGRhdGEsIHN0ZXAsIHJvaSwgaGlzdCwgZG9udF9jbGVhciApICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6ICBDVl9FUlJPUiggSVBMX0JhZERlcHRoLCAiYmFkIGltYWdlIGRlcHRoIiApOworICAgIH0KKworICAgIF9fQ0xFQU5VUF9fOworICAgIF9fRU5EX187Cit9CisqLworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY0NvbnRyYXN0SGlzdCggSXBsSW1hZ2UgKiogaW1nLCBDdkhpc3RvZ3JhbSAqIGhpc3QsIGludCBkb250X2NsZWFyLCBJcGxJbWFnZSAqIG1hc2sgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjQ29udHJhc3RIaXN0IiApOworICAgIHVjaGFyICpkYXRhW0NWX0hJU1RfTUFYX0RJTV07CisgICAgdWNoYXIgKm1hc2tfZGF0YSA9IDA7CisgICAgaW50IHN0ZXAgPSAwOworICAgIGludCBtYXNrX3N0ZXAgPSAwOworICAgIEN2U2l6ZSByb2kgPSB7IDAsIDAgfTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBoaXN0LT5jX2RpbXM7IGkrKyApCisgICAgICAgICAgICBDVl9DQUxMKCBDVl9DSEVDS19JTUFHRSggaW1nW2ldICkpOworICAgIH0KKyAgICBpZiggbWFzayApCisgICAgeworICAgICAgICBDVl9DQUxMKCBDVl9DSEVDS19JTUFHRSggbWFzayApKTsKKyAgICAgICAgaWYoIG1hc2stPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsICJiYWQgbWFzayBkZXB0aCIgKTsKKyAgICAgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIG1hc2ssICZtYXNrX2RhdGEsICZtYXNrX3N0ZXAsIDAgKTsKKyAgICB9CisKKworICAgIHsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBoaXN0LT5jX2RpbXM7IGkrKyApCisgICAgICAgICAgICBjdkdldEltYWdlUmF3RGF0YSggaW1nW2ldLCAmZGF0YVtpXSwgJnN0ZXAsICZyb2kgKTsKKyAgICB9CisKKyAgICBpZiggaW1nWzBdLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgImJhZCBjaGFubmVscyBudW1iZXJzIiApOworCisgICAgaWYoIGltZ1swXS0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCAiYmFkIGltYWdlIGRlcHRoIiApOworCisKKyAgICBzd2l0Y2ggKGltZ1swXS0+ZGVwdGgpCisgICAgeworICAgIGNhc2UgSVBMX0RFUFRIXzhVOgorICAgICAgICBpZiggIW1hc2sgKQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkNhbGNDb250cmFzdEhpc3Q4dUMxUiggZGF0YSwgc3RlcCwgcm9pLCBoaXN0LCBkb250X2NsZWFyICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZDYWxjQ29udHJhc3RIaXN0TWFzazh1QzFSKCBkYXRhLCBzdGVwLCBtYXNrX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfc3RlcCwgcm9pLCBoaXN0LCBkb250X2NsZWFyICkpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgImJhZCBpbWFnZSBkZXB0aCIgKTsKKyAgICB9CisKKyAgICBfX0NMRUFOVVBfXzsKKyAgICBfX0VORF9fOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmNhbGNpbWFnZWhvbW9ncmFwaHkuY3BwIGIvY3Yvc3JjL2N2Y2FsY2ltYWdlaG9tb2dyYXBoeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTgyMGRmYwotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmNhbGNpbWFnZWhvbW9ncmFwaHkuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworICAgY2FsY3VsYXRlIGltYWdlIGhvbW9ncmFwaHkgCisgICAKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY0ltYWdlSG9tb2dyYXBoeSggZmxvYXQqIGxpbmUsIEN2UG9pbnQzRDMyZiogX2NlbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIF9pbnRyaW5zaWMsIGZsb2F0KiBfaG9tb2dyYXBoeSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNhbGNJbWFnZUhvbW9ncmFwaHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgbm9ybV94eSwgbm9ybV94eiwgeHlfc2luYSwgeHlfY29zYSwgeHpfc2luYSwgeHpfY29zYSwgbngxLCBwbGFuZV9kaXN0OworICAgIGZsb2F0IF9yeVszXSwgX3J6WzNdLCBfcl90cmFuc1s5XTsKKyAgICBDdk1hdCByeCA9IGN2TWF0KCAxLCAzLCBDVl8zMkYsIGxpbmUgKTsKKyAgICBDdk1hdCByeSA9IGN2TWF0KCAxLCAzLCBDVl8zMkYsIF9yeSApOworICAgIEN2TWF0IHJ6ID0gY3ZNYXQoIDEsIDMsIENWXzMyRiwgX3J6ICk7CisgICAgQ3ZNYXQgcl90cmFucyA9IGN2TWF0KCAzLCAzLCBDVl8zMkYsIF9yX3RyYW5zICk7CisgICAgQ3ZNYXQgY2VudGVyID0gY3ZNYXQoIDMsIDEsIENWXzMyRiwgX2NlbnRlciApOworCisgICAgZmxvYXQgX3N1Yls5XTsKKyAgICBDdk1hdCBzdWIgPSBjdk1hdCggMywgMywgQ1ZfMzJGLCBfc3ViICk7CisgICAgZmxvYXQgX3RfdHJhbnNbM107CisgICAgQ3ZNYXQgdF90cmFucyA9IGN2TWF0KCAzLCAxLCBDVl8zMkYsIF90X3RyYW5zICk7CisKKyAgICBDdk1hdCBpbnRyaW5zaWMgPSBjdk1hdCggMywgMywgQ1ZfMzJGLCBfaW50cmluc2ljICk7CisgICAgQ3ZNYXQgaG9tb2dyYXBoeSA9IGN2TWF0KCAzLCAzLCBDVl8zMkYsIF9ob21vZ3JhcGh5ICk7CisKKyAgICBpZiggIWxpbmUgfHwgIV9jZW50ZXIgfHwgIV9pbnRyaW5zaWMgfHwgIV9ob21vZ3JhcGh5ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBub3JtX3h5ID0gY3ZTcXJ0KCBsaW5lWzBdICogbGluZVswXSArIGxpbmVbMV0gKiBsaW5lWzFdICk7CisgICAgeHlfY29zYSA9IGxpbmVbMF0gLyBub3JtX3h5OworICAgIHh5X3NpbmEgPSBsaW5lWzFdIC8gbm9ybV94eTsKKworICAgIG5vcm1feHogPSBjdlNxcnQoIGxpbmVbMF0gKiBsaW5lWzBdICsgbGluZVsyXSAqIGxpbmVbMl0gKTsKKyAgICB4el9jb3NhID0gbGluZVswXSAvIG5vcm1feHo7CisgICAgeHpfc2luYSA9IGxpbmVbMl0gLyBub3JtX3h6OworCisgICAgbngxID0gLXh6X3NpbmE7CisKKyAgICBfcnpbMF0gPSAoZmxvYXQpKHh5X2Nvc2EgKiBueDEpOworICAgIF9yelsxXSA9IChmbG9hdCkoeHlfc2luYSAqIG54MSk7CisgICAgX3J6WzJdID0gKGZsb2F0KXh6X2Nvc2E7CisgICAgY3ZTY2FsZSggJnJ6LCAmcnosIDEuL2N2Tm9ybSgmcnosMCxDVl9MMikgKTsKKworICAgIC8qICBuZXcgYXhlICB5ICAqLworICAgIGN2Q3Jvc3NQcm9kdWN0KCAmcnosICZyeCwgJnJ5ICk7CisgICAgY3ZTY2FsZSggJnJ5LCAmcnksIDEuL2N2Tm9ybSggJnJ5LCAwLCBDVl9MMiApICk7CisKKyAgICAvKiAgdHJhbnNwb25lIHJvdGF0aW9uIG1hdHJpeCAgICAqLworICAgIG1lbWNweSggJl9yX3RyYW5zWzBdLCBsaW5lLCAzKnNpemVvZihmbG9hdCkpOworICAgIG1lbWNweSggJl9yX3RyYW5zWzNdLCBfcnksIDMqc2l6ZW9mKGZsb2F0KSk7CisgICAgbWVtY3B5KCAmX3JfdHJhbnNbNl0sIF9yeiwgMypzaXplb2YoZmxvYXQpKTsKKworICAgIC8qICBjYWxjdWxhdGUgY2VudGVyIGRpc3RhbnNlIGZyb20gYXJtIHBsYW5lICAqLworICAgIHBsYW5lX2Rpc3QgPSBjdkRvdFByb2R1Y3QoICZjZW50ZXIsICZyeiApOworCisgICAgLyogY2FsY3VsYXRlIChJIC0gcl90cmFucykqY2VudGVyICovCisgICAgY3ZTZXRJZGVudGl0eSggJnN1YiApOworICAgIGN2U3ViKCAmc3ViLCAmcl90cmFucywgJnN1YiApOworICAgIGN2TWF0TXVsKCAmc3ViLCAmY2VudGVyLCAmdF90cmFucyApOyAKKworICAgIGN2TWF0TXVsKCAmdF90cmFucywgJnJ6LCAmc3ViICk7CisgICAgY3ZTY2FsZUFkZCggJnN1YiwgY3ZSZWFsU2NhbGFyKDEuL3BsYW5lX2Rpc3QpLCAmcl90cmFucywgJnN1YiApOyAvKiA/ICovCisKKyAgICBjdk1hdE11bCggJmludHJpbnNpYywgJnN1YiwgJnJfdHJhbnMgKTsKKyAgICBjdkludmVydCggJmludHJpbnNpYywgJnN1YiwgQ1ZfU1ZEICk7CisgICAgY3ZNYXRNdWwoICZyX3RyYW5zLCAmc3ViLCAmaG9tb2dyYXBoeSApOworCisgICAgX19FTkRfXzsKK30KKworLyogRW5kIG9mIGZpbGUuICovCisKZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmNhbGliaW5pdC5jcHAgYi9jdi9zcmMvY3ZjYWxpYmluaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDMyMzgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZjYWxpYmluaXQuY3BwCkBAIC0wLDAgKzEsMjA5MSBAQAorLy9NKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgVGhpcyBpcyBpbXByb3ZlZCB2YXJpYW50IG9mIGNoZXNzYm9hcmQgY29ybmVyIGRldGVjdGlvbiBhbGdvcml0aG0gdGhhdAorICAgIHVzZXMgYSBncmFwaCBvZiBjb25uZWN0ZWQgcXVhZHMuIEl0IGlzIGJhc2VkIG9uIHRoZSBjb2RlIGNvbnRyaWJ1dGVkCisgICAgYnkgVmxhZGltaXIgVmV6aG5ldmV0cyBhbmQgUGhpbGlwIEdydWViZWxlLgorICAgIEhlcmUgaXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZnJvbSB0aGUgb3JpZ2luYWwgVmxhZGltaXIncyBjb2RlOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgVGhlIGFsZ29yaXRobXMgZGV2ZWxvcGVkIGFuZCBpbXBsZW1lbnRlZCBieSBWZXpobmV2ZXRzIFZsZGltaXIKKyAgICBha2EgRGVhZCBNb3JveiAodnZwQGdyYXBoaWNzLmNzLm1zdS5ydSkKKyAgICBTZWUgaHR0cDovL2dyYXBoaWNzLmNzLm1zdS5zdS9lbi9yZXNlYXJjaC9jYWxpYnJhdGlvbi9vcGVuY3YuaHRtbAorICAgIGZvciBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KKworICAgIFJlbGlhYmlsaXR5IGFkZGl0aW9ucyBhbmQgbW9kaWZpY2F0aW9ucyBtYWRlIGJ5IFBoaWxpcCBHcnVlYmVsZS4KKyAgICA8YSBocmVmPSJtYWlsdG86cGdydWViZWxlQGNveC5uZXQiPnBncnVlYmVsZUBjb3gubmV0PC9hPgorCisgICAgU29tZSBmdXJ0aGVyIGltcHJvdmVtZW50cyBmb3IgZGV0ZWN0aW9uIG9mIHBhcnRpYWxseSBvY2x1ZGVkIGJvYXJkcyBhdCBub24taWRlYWwKKyAgICBsaWdodGluZyBjb25kaXRpb25zIGhhdmUgYmVlbiBtYWRlIGJ5IEFsZXggQm92eXJpbiBhbmQgS3VydCBLb2xvbmlnZQorCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiX2N2LmgiCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8vI2RlZmluZSBERUJVR19DSEVTU0JPQVJECisjaWZkZWYgREVCVUdfQ0hFU1NCT0FSRAorc3RhdGljIGludCBQUklOVEYoIGNvbnN0IGNoYXIqIGZtdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICByZXR1cm4gdnByaW50ZihmbXQsIGFyZ3MpOworfQorI2luY2x1ZGUgIi4uLy8uLi8vb3RoZXJsaWJzL2hpZ2hndWkvaGlnaGd1aS5oIgorI2Vsc2UKK3N0YXRpYyBpbnQgUFJJTlRGKCBjb25zdCBjaGFyKiwgLi4uICkKK3sKKyAgICByZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBlbmhhbmNlZCBjYWxpYnJhdGlvbiBvYmplY3QgZGV0ZWN0aW9uCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI2RlZmluZSBNQVhfQ09OVE9VUl9BUFBST1ggIDcKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDb250b3VyRXgKK3sKKyAgICBDVl9DT05UT1VSX0ZJRUxEUygpCisgICAgaW50IGNvdW50ZXI7Cit9CitDdkNvbnRvdXJFeDsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBDb3JuZXIgaW5mbyBzdHJ1Y3R1cmUKKy8qKiBUaGlzIHN0cnVjdHVyZSBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoZXNzYm9hcmQgY29ybmVyLiovCit0eXBlZGVmIHN0cnVjdCBDdkNCQ29ybmVyCit7CisgICAgQ3ZQb2ludDJEMzJmIHB0OyAvLyBDb29yZGluYXRlcyBvZiB0aGUgY29ybmVyCisgICAgaW50IHJvdzsgICAgICAgICAvLyBCb2FyZCByb3cgaW5kZXgKKyAgICBpbnQgY291bnQ7ICAgICAgIC8vIE51bWJlciBvZiBuZWlnaGJvciBjb3JuZXJzCisgICAgc3RydWN0IEN2Q0JDb3JuZXIqIG5laWdoYm9yc1s0XTsgLy8gTmVpZ2hib3IgY29ybmVycworfQorQ3ZDQkNvcm5lcjsKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gUXVhZHJhbmdsZSBjb250b3VyIGluZm8gc3RydWN0dXJlCisvKiogVGhpcyBzdHJ1Y3R1cmUgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGVzc2JvYXJkIHF1YWRyYW5nZS4qLwordHlwZWRlZiBzdHJ1Y3QgQ3ZDQlF1YWQKK3sKKyAgICBpbnQgY291bnQ7ICAgICAgLy8gTnVtYmVyIG9mIHF1YWQgbmVpZ2hib3JzCisgICAgaW50IGdyb3VwX2lkeDsgIC8vIHF1YWQgZ3JvdXAgSUQKKyAgICBpbnQgcm93LCBjb2w7ICAgLy8gcm93IGFuZCBjb2x1bW4gb2YgdGhpcyBxdWFkCisgICAgYm9vbCBvcmRlcmVkOyAgIC8vIHRydWUgaWYgY29ybmVycy9uZWlnaGJvcnMgYXJlIG9yZGVyZWQgY291bnRlci1jbG9ja3dpc2UKKyAgICBmbG9hdCBlZGdlX2xlbjsgLy8gcXVhZCBlZGdlIGxlbiwgaW4gcGl4XjIKKyAgICAvLyBuZWlnaGJvcnMgYW5kIGNvcm5lcnMgYXJlIHN5bmNlZCwgaS5lLiwgbmVpZ2hib3IgMCBzaGFyZXMgY29ybmVyIDAKKyAgICBDdkNCQ29ybmVyICpjb3JuZXJzWzRdOyAvLyBDb29yZGluYXRlcyBvZiBxdWFkIGNvcm5lcnMKKyAgICBzdHJ1Y3QgQ3ZDQlF1YWQgKm5laWdoYm9yc1s0XTsgLy8gUG9pbnRlcnMgb2YgcXVhZCBuZWlnaGJvcnMKK30KK0N2Q0JRdWFkOworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy9zdGF0aWMgQ3ZNYXQqIGRlYnVnX2ltZyA9IDA7CisKK3N0YXRpYyBpbnQgaWN2R2VuZXJhdGVRdWFkcyggQ3ZDQlF1YWQgKipxdWFkcywgQ3ZDQkNvcm5lciAqKmNvcm5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSwgQ3ZNYXQgKmltYWdlLCBpbnQgZmxhZ3MgKTsKKworc3RhdGljIGludAoraWN2R2VuZXJhdGVRdWFkc0V4KCBDdkNCUXVhZCAqKm91dF9xdWFkcywgQ3ZDQkNvcm5lciAqKm91dF9jb3JuZXJzLAorICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSwgQ3ZNYXQgKmltYWdlLCBDdk1hdCAqdGhyZXNoX2ltZywgaW50IGRpbGF0aW9uLCBpbnQgZmxhZ3MgKTsKKworc3RhdGljIHZvaWQgaWN2RmluZFF1YWROZWlnaGJvcnMoIEN2Q0JRdWFkICpxdWFkcywgaW50IHF1YWRfY291bnQgKTsKKworc3RhdGljIGludCBpY3ZGaW5kQ29ubmVjdGVkUXVhZHMoIEN2Q0JRdWFkICpxdWFkcywgaW50IHF1YWRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZDQlF1YWQgKipxdWFkX2dyb3VwLCBpbnQgZ3JvdXBfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCitzdGF0aWMgaW50IGljdkNoZWNrUXVhZEdyb3VwKCBDdkNCUXVhZCAqKnF1YWRfZ3JvdXAsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Q0JDb3JuZXIgKipvdXRfY29ybmVycywgQ3ZTaXplIHBhdHRlcm5fc2l6ZSApOworCitzdGF0aWMgaW50IGljdkNsZWFuRm91bmRDb25uZWN0ZWRRdWFkcyggaW50IHF1YWRfY291bnQsCisgICAgICAgICAgICAgICAgQ3ZDQlF1YWQgKipxdWFkcywgQ3ZTaXplIHBhdHRlcm5fc2l6ZSApOworCitzdGF0aWMgaW50IGljdk9yZGVyRm91bmRDb25uZWN0ZWRRdWFkcyggaW50IHF1YWRfY291bnQsIEN2Q0JRdWFkICoqcXVhZHMsCisgICAgICAgICAgIGludCAqYWxsX2NvdW50LCBDdkNCUXVhZCAqKmFsbF9xdWFkcywgQ3ZDQkNvcm5lciAqKmNvcm5lcnMsCisgICAgICAgICAgIEN2U2l6ZSBwYXR0ZXJuX3NpemUsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCitzdGF0aWMgdm9pZCBpY3ZPcmRlclF1YWQoQ3ZDQlF1YWQgKnF1YWQsIEN2Q0JDb3JuZXIgKmNvcm5lciwgaW50IGNvbW1vbik7CisKK3N0YXRpYyBpbnQgaWN2VHJpbUNvbChDdkNCUXVhZCAqKnF1YWRzLCBpbnQgY291bnQsIGludCBjb2wsIGludCBkaXIpOworCitzdGF0aWMgaW50IGljdlRyaW1Sb3coQ3ZDQlF1YWQgKipxdWFkcywgaW50IGNvdW50LCBpbnQgcm93LCBpbnQgZGlyKTsKKworc3RhdGljIGludCBpY3ZBZGRPdXRlclF1YWQoQ3ZDQlF1YWQgKnF1YWQsIEN2Q0JRdWFkICoqcXVhZHMsIGludCBxdWFkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBDdkNCUXVhZCAqKmFsbF9xdWFkcywgaW50IGFsbF9jb3VudCwgQ3ZDQkNvcm5lciAqKmNvcm5lcnMpOworCitzdGF0aWMgdm9pZCBpY3ZSZW1vdmVRdWFkRnJvbUdyb3VwKEN2Q0JRdWFkICoqcXVhZHMsIGludCBjb3VudCwgQ3ZDQlF1YWQgKnEwKTsKKworc3RhdGljIGludCBpY3ZDaGVja0JvYXJkTW9ub3RvbnkoIEN2UG9pbnQyRDMyZiogY29ybmVycywgQ3ZTaXplIHBhdHRlcm5fc2l6ZSApOworCisjaWYgMAorc3RhdGljIHZvaWQKK2ljdkNhbGNBZmZpbmVUcmFuZjJEMzJmKEN2UG9pbnQyRDMyZiogcHRzMSwgQ3ZQb2ludDJEMzJmKiBwdHMyLCBpbnQgY291bnQsIEN2TWF0KiBhZmZpbmVfdHJhbnMpCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHJlYWxfY291bnQgPSAwOworICAgIGZvciggaiA9IDA7IGogPCBjb3VudDsgaisrICkKKyAgICB7CisgICAgICAgIGlmKCBwdHMxW2pdLnggPj0gMCApIHJlYWxfY291bnQrKzsKKyAgICB9CisgICAgaWYocmVhbF9jb3VudCA8IDMpIHJldHVybjsKKyAgICBDdk1hdCogeHkgPSBjdkNyZWF0ZU1hdCggMipyZWFsX2NvdW50LCA2LCBDVl8zMkZDMSApOworICAgIEN2TWF0KiB1diA9IGN2Q3JlYXRlTWF0KCAyKnJlYWxfY291bnQsIDEsIENWXzMyRkMxICk7CisgICAgLy9lc3RpbWF0ZSBhZmZpbmUgdHJhbnNmcm9tYXRpb24KKyAgICBmb3IoIGkgPSAwLCBqID0gMDsgaiA8IGNvdW50OyBqKysgKQorICAgIHsKKyAgICAgICAgaWYoIHB0czFbal0ueCA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oICp4eSwgZmxvYXQsIGkqMisxLCAyICkgPSBDVl9NQVRfRUxFTSggKnh5LCBmbG9hdCwgaSoyLCAwICkgPSBwdHMyW2pdLng7CisgICAgICAgICAgICBDVl9NQVRfRUxFTSggKnh5LCBmbG9hdCwgaSoyKzEsIDMgKSA9IENWX01BVF9FTEVNKCAqeHksIGZsb2F0LCBpKjIsIDEgKSA9IHB0czJbal0ueTsKKyAgICAgICAgICAgIENWX01BVF9FTEVNKCAqeHksIGZsb2F0LCBpKjIsIDIgKSA9IENWX01BVF9FTEVNKCAqeHksIGZsb2F0LCBpKjIsIDMgKSA9IENWX01BVF9FTEVNKCAqeHksIGZsb2F0LCBpKjIsIDUgKSA9IFwKKyAgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSggKnh5LCBmbG9hdCwgaSoyKzEsIDAgKSA9IENWX01BVF9FTEVNKCAqeHksIGZsb2F0LCBpKjIrMSwgMSApID0gQ1ZfTUFUX0VMRU0oICp4eSwgZmxvYXQsIGkqMisxLCA0ICkgPSAwOworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oICp4eSwgZmxvYXQsIGkqMiwgNCApID0gQ1ZfTUFUX0VMRU0oICp4eSwgZmxvYXQsIGkqMisxLCA1ICkgPSAxOworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oICp1diwgZmxvYXQsIGkqMiwgMCApID0gcHRzMVtqXS54OworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oICp1diwgZmxvYXQsIGkqMisxLCAwICkgPSBwdHMxW2pdLnk7CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdlNvbHZlKCB4eSwgdXYsIGFmZmluZV90cmFucywgQ1ZfU1ZEICk7CisgICAgY3ZSZWxlYXNlTWF0KCZ4eSk7CisgICAgY3ZSZWxlYXNlTWF0KCZ1dik7Cit9CisjZW5kaWYKKworQ1ZfSU1QTAoraW50IGN2RmluZENoZXNzYm9hcmRDb3JuZXJzKCBjb25zdCB2b2lkKiBhcnIsIEN2U2l6ZSBwYXR0ZXJuX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogb3V0X2Nvcm5lcnMsIGludCogb3V0X2Nvcm5lcl9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzICkKK3sKKyAgICBpbnQgayA9IDA7CisgICAgY29uc3QgaW50IG1pbl9kaWxhdGlvbnMgPSAwOworICAgIGNvbnN0IGludCBtYXhfZGlsYXRpb25zID0gMzsKKyAgICBpbnQgZm91bmQgPSAwOworICAgIEN2TWF0KiBub3JtX2ltZyA9IDA7CisgICAgQ3ZNYXQqIHRocmVzaF9pbWcgPSAwOworI2lmZGVmIERFQlVHX0NIRVNTQk9BUkQKKyAgICBJcGxJbWFnZSAqZGJnX2ltZyA9IDA7CisgICAgSXBsSW1hZ2UgKmRiZzFfaW1nID0gMDsKKyAgICBJcGxJbWFnZSAqZGJnMl9pbWcgPSAwOworI2VuZGlmCisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlID0gMDsKKworICAgIEN2Q0JRdWFkICpxdWFkcyA9IDAsICoqcXVhZF9ncm91cCA9IDA7CisgICAgQ3ZDQkNvcm5lciAqY29ybmVycyA9IDAsICoqY29ybmVyX2dyb3VwID0gMDsKKworICAgIGludCBleHBlY3RlZF9jb3JuZXJzX251bSA9IChwYXR0ZXJuX3NpemUud2lkdGgvMisxKSoocGF0dGVybl9zaXplLmhlaWdodC8yKzEpOworCisgICAgaWYoIG91dF9jb3JuZXJfY291bnQgKQorICAgICAgICAqb3V0X2Nvcm5lcl9jb3VudCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZENoZXNzQm9hcmRDb3JuZXJHdWVzc2VzMiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBxdWFkX2NvdW50ID0gMCwgZ3JvdXBfaWR4ID0gMCwgaSA9IDAsIGRpbGF0aW9ucyA9IDA7CisgICAgQ3ZNYXQgc3R1YiwgKmltZyA9IChDdk1hdCopYXJyOworCisgICAgQ1ZfQ0FMTCggaW1nID0gY3ZHZXRNYXQoIGltZywgJnN0dWIgKSk7CisgICAgLy9kZWJ1Z19pbWcgPSBpbWc7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKCBpbWctPnR5cGUgKSAhPSBDVl84VSB8fCBDVl9NQVRfQ04oIGltZy0+dHlwZSApID09IDIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJPbmx5IDgtYml0IGdyYXlzY2FsZSBvciBjb2xvciBpbWFnZXMgYXJlIHN1cHBvcnRlZCIgKTsKKworICAgIGlmKCBwYXR0ZXJuX3NpemUud2lkdGggPD0gMiB8fCBwYXR0ZXJuX3NpemUuaGVpZ2h0IDw9IDIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIkJvdGggd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgcGF0dGVybiBzaG91bGQgaGF2ZSBiaWdnZXIgdGhhbiAyIiApOworCisgICAgaWYoICFvdXRfY29ybmVycyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBwb2ludGVyIHRvIGNvcm5lcnMiICk7CisKKyAgICBDVl9DQUxMKCBzdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKDApICk7CisgICAgQ1ZfQ0FMTCggdGhyZXNoX2ltZyA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MsIGltZy0+Y29scywgQ1ZfOFVDMSApKTsKKworI2lmZGVmIERFQlVHX0NIRVNTQk9BUkQKKyAgICBDVl9DQUxMKCBkYmdfaW1nID0gY3ZDcmVhdGVJbWFnZShjdkdldFNpemUoaW1nKSwgSVBMX0RFUFRIXzhVLCAzICkpOworICAgIENWX0NBTEwoIGRiZzFfaW1nID0gY3ZDcmVhdGVJbWFnZShjdkdldFNpemUoaW1nKSwgSVBMX0RFUFRIXzhVLCAzICkpOworICAgIENWX0NBTEwoIGRiZzJfaW1nID0gY3ZDcmVhdGVJbWFnZShjdkdldFNpemUoaW1nKSwgSVBMX0RFUFRIXzhVLCAzICkpOworI2VuZGlmCisKKyAgICBpZiggQ1ZfTUFUX0NOKGltZy0+dHlwZSkgIT0gMSB8fCAoZmxhZ3MgJiBDVl9DQUxJQl9DQl9OT1JNQUxJWkVfSU1BR0UpICkKKyAgICB7CisgICAgICAgIC8vIGVxdWFsaXplIHRoZSBpbnB1dCBpbWFnZSBoaXN0b2dyYW0gLQorICAgICAgICAvLyB0aGF0IHNob3VsZCBtYWtlIHRoZSBjb250cmFzdCBiZXR3ZWVuICJibGFjayIgYW5kICJ3aGl0ZSIgYXJlYXMgYmlnIGVub3VnaAorICAgICAgICBDVl9DQUxMKCBub3JtX2ltZyA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MsIGltZy0+Y29scywgQ1ZfOFVDMSApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX0NOKGltZy0+dHlwZSkgIT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q3Z0Q29sb3IoIGltZywgbm9ybV9pbWcsIENWX0JHUjJHUkFZICkpOworICAgICAgICAgICAgaW1nID0gbm9ybV9pbWc7CisgICAgICAgIH0KKworICAgICAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9DQl9OT1JNQUxJWkVfSU1BR0UgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkVxdWFsaXplSGlzdCggaW1nLCBub3JtX2ltZyApOworICAgICAgICAgICAgaW1nID0gbm9ybV9pbWc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUcnkgb3VyIHN0YW5kYXJkICIxIiBkaWxhdGlvbiwgYnV0IGlmIHRoZSBwYXR0ZXJuIGlzIG5vdCBmb3VuZCwgaXRlcmF0ZSB0aGUgd2hvbGUgcHJvY2VkdXJlIHdpdGggaGlnaGVyIGRpbGF0aW9ucy4KKyAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHNvbWUgc3F1YXJlcyBzaW1wbHkgZG8gbm90IHNlcGFyYXRlIHByb3Blcmx5IHdpdGggYSBzaW5nbGUgZGlsYXRpb24uICBIb3dldmVyLAorICAgIC8vIHdlIHdhbnQgdG8gdXNlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWxhdGlvbnMgcG9zc2libGUgc2luY2UgZGlsYXRpb25zIGNhdXNlIHRoZSBzcXVhcmVzIHRvIGJlY29tZSBzbWFsbGVyLAorICAgIC8vIG1ha2luZyBpdCBkaWZmaWN1bHQgdG8gZGV0ZWN0IHNtYWxsZXIgc3F1YXJlcy4KKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIGZvciggZGlsYXRpb25zID0gbWluX2RpbGF0aW9uczsgZGlsYXRpb25zIDw9IG1heF9kaWxhdGlvbnM7IGRpbGF0aW9ucysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGZvdW5kKSBicmVhazsJCS8vIGFscmVhZHkgZm91bmQgaXQKKworICAgICAgICAgICAgaWYoIGsgPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9QYXR0ZXJuIHdhcyBub3QgZm91bmQgdXNpbmcgYmluYXJpemF0aW9uCisgICAgICAgICAgICAgICAgLy8gUnVuIG11bHRpLWxldmVsIHF1YWRzIGV4dHJhY3Rpb24KKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIG9uZS1sZXZlbCBiaW5hcml6YXRpb24gZGlkIG5vdCBnaXZlIGVub3VnaCBudW1iZXIgb2YgcXVhZHMKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBxdWFkX2NvdW50ID0gaWN2R2VuZXJhdGVRdWFkc0V4KCAmcXVhZHMsICZjb3JuZXJzLCBzdG9yYWdlLCBpbWcsIHRocmVzaF9pbWcsIGRpbGF0aW9ucywgZmxhZ3MgKSk7CisgICAgICAgICAgICAgICAgUFJJTlRGKCJFWCBxdWFkIGNvdW50OiAlZC8lZFxuIiwgcXVhZF9jb3VudCwgZXhwZWN0ZWRfY29ybmVyc19udW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdGhlIGlucHV0IGdyYXlzY2FsZSBpbWFnZSB0byBiaW5hcnkgKGJsYWNrLW4td2hpdGUpCisgICAgICAgICAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfQ0JfQURBUFRJVkVfVEhSRVNIICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplID0gY3ZSb3VuZChNSU4oaW1nLT5jb2xzLGltZy0+cm93cykqMC4yKXwxOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgdG8gYmluYXJ5CisgICAgICAgICAgICAgICAgICAgIGN2QWRhcHRpdmVUaHJlc2hvbGQoIGltZywgdGhyZXNoX2ltZywgMjU1LAorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQURBUFRJVkVfVEhSRVNIX01FQU5fQywgQ1ZfVEhSRVNIX0JJTkFSWSwgYmxvY2tfc2l6ZSwgMCApOworICAgICAgICAgICAgICAgICAgICBpZiAoZGlsYXRpb25zID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2RGlsYXRlKCB0aHJlc2hfaW1nLCB0aHJlc2hfaW1nLCAwLCBkaWxhdGlvbnMtMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGRpbGF0aW9uIGJlZm9yZSB0aGUgdGhyZXNob2xkaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBJdCBzcGxpdHMgY2hlc3Nib2FyZCBjb3JuZXJzCisgICAgICAgICAgICAgICAgICAgIC8vY3ZEaWxhdGUoIGltZywgdGhyZXNoX2ltZywgMCwgMSApOworCisgICAgICAgICAgICAgICAgICAgIC8vIGVtcGlyaWMgdGhyZXNob2xkIGxldmVsCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gY3ZNZWFuKCBpbWcgKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaF9sZXZlbCA9IGN2Um91bmQoIG1lYW4gLSAxMCApOworICAgICAgICAgICAgICAgICAgICB0aHJlc2hfbGV2ZWwgPSBNQVgoIHRocmVzaF9sZXZlbCwgMTAgKTsKKworICAgICAgICAgICAgICAgICAgICBjdlRocmVzaG9sZCggaW1nLCB0aHJlc2hfaW1nLCB0aHJlc2hfbGV2ZWwsIDI1NSwgQ1ZfVEhSRVNIX0JJTkFSWSApOworICAgICAgICAgICAgICAgICAgICBjdkRpbGF0ZSggdGhyZXNoX2ltZywgdGhyZXNoX2ltZywgMCwgZGlsYXRpb25zICk7CisgICAgICAgICAgICAgICAgfQorCisKKworI2lmZGVmIERFQlVHX0NIRVNTQk9BUkQKKyAgICAgICAgICAgICAgICBjdkN2dENvbG9yKHRocmVzaF9pbWcsZGJnX2ltZyxDVl9HUkFZMkJHUik7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIC8vIFNvIHdlIGNhbiBmaW5kIHJlY3RhbmdsZXMgdGhhdCBnbyB0byB0aGUgZWRnZSwgd2UgZHJhdyBhIHdoaXRlIGxpbmUgYXJvdW5kIHRoZSBpbWFnZSBlZGdlLgorICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBGaW5kQ29udG91cnMgd2lsbCBtaXNzIHRob3NlIGNsaXBwZWQgcmVjdGFuZ2xlIGNvbnRvdXJzLgorICAgICAgICAgICAgICAgIC8vIFRoZSBib3JkZXIgY29sb3Igd2lsbCBiZSB0aGUgaW1hZ2UgbWVhbiwgYmVjYXVzZSBvdGhlcndpc2Ugd2UgcmlzayBzY3Jld2luZyB1cCBmaWx0ZXJzIGxpa2UgY3ZTbW9vdGgoKS4uLgorICAgICAgICAgICAgICAgIGN2UmVjdGFuZ2xlKCB0aHJlc2hfaW1nLCBjdlBvaW50KDAsMCksIGN2UG9pbnQodGhyZXNoX2ltZy0+Y29scy0xLAorICAgICAgICAgICAgICAgICAgICB0aHJlc2hfaW1nLT5yb3dzLTEpLCBDVl9SR0IoMjU1LDI1NSwyNTUpLCAzLCA4KTsKKworICAgICAgICAgICAgICAgIENWX0NBTEwoIHF1YWRfY291bnQgPSBpY3ZHZW5lcmF0ZVF1YWRzKCAmcXVhZHMsICZjb3JuZXJzLCBzdG9yYWdlLCB0aHJlc2hfaW1nLCBmbGFncyApKTsKKworCisgICAgICAgICAgICAgICAgUFJJTlRGKCJRdWFkIGNvdW50OiAlZC8lZFxuIiwgcXVhZF9jb3VudCwgZXhwZWN0ZWRfY29ybmVyc19udW0pOworICAgICAgICAgICAgfQorCisKKyNpZmRlZiBERUJVR19DSEVTU0JPQVJECisgICAgICAgICAgICBjdkNvcHkoZGJnX2ltZywgZGJnMV9pbWcpOworICAgICAgICAgICAgY3ZOYW1lZFdpbmRvdygiYWxsX3F1YWRzIiwgMSk7CisgICAgICAgICAgICAvLyBjb3B5IGNvcm5lcnMgdG8gdGVtcCBhcnJheQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHF1YWRfY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPDQ7IGsrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdDEsIHB0MjsKKyAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgY29sb3IgPSBDVl9SR0IoMzAsMjU1LDMwKTsKKyAgICAgICAgICAgICAgICAgICAgcHQxID0gcXVhZHNbaV0uY29ybmVyc1trXS0+cHQ7CisgICAgICAgICAgICAgICAgICAgIHB0MiA9IHF1YWRzW2ldLmNvcm5lcnNbKGsrMSklNF0tPnB0OworICAgICAgICAgICAgICAgICAgICBwdDIueCA9IChwdDEueCArIHB0Mi54KS8yOworICAgICAgICAgICAgICAgICAgICBwdDIueSA9IChwdDEueSArIHB0Mi55KS8yOworICAgICAgICAgICAgICAgICAgICBpZiAoaz4wKQorICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBDVl9SR0IoMjAwLDIwMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgY3ZMaW5lKCBkYmcxX2ltZywgY3ZQb2ludEZyb20zMmYocHQxKSwgY3ZQb2ludEZyb20zMmYocHQyKSwgY29sb3IsIDMsIDgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisvLyAgICAgICAgICAgIGN2U2hvd0ltYWdlKCJhbGxfcXVhZHMiLCAoSXBsSW1hZ2UqKWRiZzFfaW1nKTsKKyAgICAgICAgICAgIGN2V2FpdEtleSgpOworI2VuZGlmCisKKworICAgICAgICAgICAgaWYoIHF1YWRfY291bnQgPD0gMCApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIC8vIEZpbmQgcXVhZCdzIG5laWdoYm9ycworICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2RmluZFF1YWROZWlnaGJvcnMoIHF1YWRzLCBxdWFkX2NvdW50ICkpOworCisgICAgICAgICAgICAvLyBhbGxvY2F0ZSBleHRyYSBmb3IgYWRkaW5nIGluIGljdk9yZGVyRm91bmRRdWFkcworICAgICAgICAgICAgQ1ZfQ0FMTCggcXVhZF9ncm91cCA9IChDdkNCUXVhZCoqKWN2QWxsb2MoIHNpemVvZihxdWFkX2dyb3VwWzBdKSAqIChxdWFkX2NvdW50K3F1YWRfY291bnQgLyAyKSkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggY29ybmVyX2dyb3VwID0gKEN2Q0JDb3JuZXIqKiljdkFsbG9jKCBzaXplb2YoY29ybmVyX2dyb3VwWzBdKSAqIChxdWFkX2NvdW50K3F1YWRfY291bnQgLyAyKSo0ICkpOworCisgICAgICAgICAgICBmb3IoIGdyb3VwX2lkeCA9IDA7IDsgZ3JvdXBfaWR4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY291bnQgPSBpY3ZGaW5kQ29ubmVjdGVkUXVhZHMoIHF1YWRzLCBxdWFkX2NvdW50LCBxdWFkX2dyb3VwLCBncm91cF9pZHgsIHN0b3JhZ2UgKSk7CisKKyAgICAgICAgICAgICAgICBpbnQgaWNvdW50ID0gY291bnQ7CisgICAgICAgICAgICAgICAgaWYoIGNvdW50ID09IDAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIC8vIG9yZGVyIHRoZSBxdWFkIGNvcm5lcnMgZ2xvYmFsbHkKKyAgICAgICAgICAgICAgICAvLyBtYXliZSBkZWxldGUgb3IgYWRkIHNvbWUKKyAgICAgICAgICAgICAgICBQUklOVEYoIlN0YXJ0aW5nIG9yZGVyaW5nIG9mIGlubmVyIHF1YWRzXG4iKTsKKyAgICAgICAgICAgICAgICBjb3VudCA9IGljdk9yZGVyRm91bmRDb25uZWN0ZWRRdWFkcyhjb3VudCwgcXVhZF9ncm91cCwgJnF1YWRfY291bnQsICZxdWFkcywgJmNvcm5lcnMsCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc2l6ZSwgc3RvcmFnZSApOworICAgICAgICAgICAgICAgIFBSSU5URigiT3JpZyBjb3VudDogJWQgIEFmdGVyIG9yZGVyaW5nOiAlZFxuIiwgaWNvdW50LCBjb3VudCk7CisKKworI2lmZGVmIERFQlVHX0NIRVNTQk9BUkQKKyAgICAgICAgICAgICAgICBjdkNvcHkoZGJnX2ltZyxkYmcyX2ltZyk7CisgICAgICAgICAgICAgICAgY3ZOYW1lZFdpbmRvdygiY29ubmVjdGVkX2dyb3VwIiwgMSk7CisgICAgICAgICAgICAgICAgLy8gY29weSBjb3JuZXJzIHRvIHRlbXAgYXJyYXkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcXVhZF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChxdWFkc1tpXS5ncm91cF9pZHggPT0gZ3JvdXBfaWR4KQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrPDQ7IGsrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgcHQxLCBwdDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgY29sb3IgPSBDVl9SR0IoMzAsMjU1LDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVhZHNbaV0ub3JkZXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBDVl9SR0IoMjU1LDMwLDMwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDEgPSBxdWFkc1tpXS5jb3JuZXJzW2tdLT5wdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIgPSBxdWFkc1tpXS5jb3JuZXJzWyhrKzEpJTRdLT5wdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdDIueCA9IChwdDEueCArIHB0Mi54KS8yOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0Mi55ID0gKHB0MS55ICsgcHQyLnkpLzI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGs+MCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBDVl9SR0IoMjAwLDIwMCwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkxpbmUoIGRiZzJfaW1nLCBjdlBvaW50RnJvbTMyZihwdDEpLCBjdlBvaW50RnJvbTMyZihwdDIpLCBjb2xvciwgMywgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgY3ZTaG93SW1hZ2UoImNvbm5lY3RlZF9ncm91cCIsIChJcGxJbWFnZSopZGJnMl9pbWcpOworICAgICAgICAgICAgICAgIGN2V2FpdEtleSgpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CQkvLyBoYXZlbid0IGZvdW5kIGlubmVyIHF1YWRzCisKKworICAgICAgICAgICAgICAgIC8vIElmIGNvdW50IGlzIG1vcmUgdGhhbiBpdCBzaG91bGQgYmUsIHRoaXMgd2lsbCByZW1vdmUgdGhvc2UgcXVhZHMKKyAgICAgICAgICAgICAgICAvLyB3aGljaCBjYXVzZSBtYXhpbXVtIGRldmlhdGlvbiBmcm9tIGEgbmljZSBzcXVhcmUgcGF0dGVybi4KKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjb3VudCA9IGljdkNsZWFuRm91bmRDb25uZWN0ZWRRdWFkcyggY291bnQsIHF1YWRfZ3JvdXAsIHBhdHRlcm5fc2l6ZSApKTsKKyAgICAgICAgICAgICAgICBQUklOVEYoIkNvbm5lY3RlZCBncm91cDogJWQgIG9yaWcgY291bnQ6ICVkIGNsZWFuZWQ6ICVkXG4iLCBncm91cF9pZHgsIGljb3VudCwgY291bnQpOworCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY291bnQgPSBpY3ZDaGVja1F1YWRHcm91cCggcXVhZF9ncm91cCwgY291bnQsIGNvcm5lcl9ncm91cCwgcGF0dGVybl9zaXplICkpOworICAgICAgICAgICAgICAgIFBSSU5URigiQ29ubmVjdGVkIGdyb3VwOiAlZCAgY291bnQ6ICVkICBjbGVhbmVkOiAlZFxuIiwgZ3JvdXBfaWR4LCBpY291bnQsIGNvdW50KTsKKworICAgICAgICAgICAgICAgIGlmKCBjb3VudCA+IDAgfHwgKG91dF9jb3JuZXJfY291bnQgJiYgLWNvdW50ID4gKm91dF9jb3JuZXJfY291bnQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBuID0gY291bnQgPiAwID8gcGF0dGVybl9zaXplLndpZHRoICogcGF0dGVybl9zaXplLmhlaWdodCA6IC1jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbiA9IE1JTiggbiwgcGF0dGVybl9zaXplLndpZHRoICogcGF0dGVybl9zaXplLmhlaWdodCApOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgY29ybmVycyB0byBvdXRwdXQgYXJyYXkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY29ybmVyc1tpXSA9IGNvcm5lcl9ncm91cFtpXS0+cHQ7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIG91dF9jb3JuZXJfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgKm91dF9jb3JuZXJfY291bnQgPSBuOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjb3VudCA+IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3ZGcmVlKCAmcXVhZHMgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJmNvcm5lcnMgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJnF1YWRfZ3JvdXAgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJmNvcm5lcl9ncm91cCApOworICAgICAgICB9Ly9kaWxhdGlvbnMKKyAgICB9Ly8KKworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmbm9ybV9pbWcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0aHJlc2hfaW1nICk7CisgICAgY3ZGcmVlKCAmcXVhZHMgKTsKKyAgICBjdkZyZWUoICZjb3JuZXJzICk7CisKKyAgICBpZiggZm91bmQgKQorICAgICAgICBmb3VuZCA9IGljdkNoZWNrQm9hcmRNb25vdG9ueSggb3V0X2Nvcm5lcnMsIHBhdHRlcm5fc2l6ZSApOworCisgICAgaWYoIGZvdW5kICYmIHBhdHRlcm5fc2l6ZS5oZWlnaHQgJSAyID09IDAgJiYgcGF0dGVybl9zaXplLndpZHRoICUgMiA9PSAwICkKKyAgICB7CisgICAgICAgIGludCBsYXN0X3JvdyA9IChwYXR0ZXJuX3NpemUuaGVpZ2h0LTEpKnBhdHRlcm5fc2l6ZS53aWR0aDsKKyAgICAgICAgZG91YmxlIGR5MCA9IG91dF9jb3JuZXJzW2xhc3Rfcm93XS55IC0gb3V0X2Nvcm5lcnNbMF0ueTsKKyAgICAgICAgaWYoIGR5MCA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSwgbiA9IHBhdHRlcm5fc2l6ZS53aWR0aCpwYXR0ZXJuX3NpemUuaGVpZ2h0OworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4vMjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgdGVtcDsKKyAgICAgICAgICAgICAgICBDVl9TV0FQKG91dF9jb3JuZXJzW2ldLCBvdXRfY29ybmVyc1tuLWktMV0sIHRlbXApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kOworfQorCisvLworLy8gQ2hlY2tzIHRoYXQgZWFjaCBib2FyZCByb3cgYW5kIGNvbHVtbiBpcyBwcmV0dHkgbXVjaCBtb25vdG9ub3VzIGN1cnZlOgorLy8gSXQgYW5hbHl6ZXMgZWFjaCByb3cgYW5kIGVhY2ggY29sdW1uIG9mIHRoZSBjaGVzc2JvYXJkIGFzIGZvbGxvd2luZzoKKy8vICAgIGZvciBlYWNoIGNvcm5lciBjIGx5aW5nIGJldHdlZW4gZW5kIHBvaW50cyBpbiB0aGUgc2FtZSByb3cvY29sdW1uIGl0IGNoZWNrcyB0aGF0CisvLyAgICB0aGUgcG9pbnQgcHJvamVjdGlvbiB0byB0aGUgbGluZSBzZWdtZW50IChhLGIpIGlzIGx5aW5nIGJldHdlZW4gcHJvamVjdGlvbnMKKy8vICAgIG9mIHRoZSBuZWlnaGJvciBjb3JuZXJzIGluIHRoZSBzYW1lIHJvdy9jb2x1bW4uCisvLworLy8gVGhpcyBmdW5jdGlvbiBoYXMgYmVlbiBjcmVhdGVkIGFzIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0aGUgYnVnIGluIGN1cnJlbnQgaW1wbGVtZW50YXRpb24KKy8vIG9mIGN2RmluZENoZXNzYm9hcmRDb3JuZXMgdGhhdCBwcm9kdWNlcyBhYnNvbHV0ZWx5IHVub3JkZXJlZCBzZXRzIG9mIGNvcm5lcnMuCisvLworCitzdGF0aWMgaW50CitpY3ZDaGVja0JvYXJkTW9ub3RvbnkoIEN2UG9pbnQyRDMyZiogY29ybmVycywgQ3ZTaXplIHBhdHRlcm5fc2l6ZSApCit7CisgICAgaW50IGksIGosIGs7CisgICAgCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgKGsgPT0gMCA/IHBhdHRlcm5fc2l6ZS5oZWlnaHQgOiBwYXR0ZXJuX3NpemUud2lkdGgpOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50MkQzMmYgYSA9IGsgPT0gMCA/IGNvcm5lcnNbaSpwYXR0ZXJuX3NpemUud2lkdGhdIDogY29ybmVyc1tpXTsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBiID0gayA9PSAwID8gY29ybmVyc1soaSsxKSpwYXR0ZXJuX3NpemUud2lkdGgtMV0gOgorICAgICAgICAgICAgICAgIGNvcm5lcnNbKHBhdHRlcm5fc2l6ZS5oZWlnaHQtMSkqcGF0dGVybl9zaXplLndpZHRoICsgaV07CisgICAgICAgICAgICBmbG9hdCBwcmV2dCA9IDAsIGR4MCA9IGIueCAtIGEueCwgZHkwID0gYi55IC0gYS55OworICAgICAgICAgICAgaWYoIGZhYnMoZHgwKSArIGZhYnMoZHkwKSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIGZvciggaiA9IDE7IGogPCAoayA9PSAwID8gcGF0dGVybl9zaXplLndpZHRoIDogcGF0dGVybl9zaXplLmhlaWdodCkgLSAxOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBjID0gayA9PSAwID8gY29ybmVyc1tpKnBhdHRlcm5fc2l6ZS53aWR0aCArIGpdIDoKKyAgICAgICAgICAgICAgICAgICAgY29ybmVyc1tqKnBhdHRlcm5fc2l6ZS53aWR0aCArIGldOworICAgICAgICAgICAgICAgIGZsb2F0IHQgPSAoKGMueCAtIGEueCkqZHgwICsgKGMueSAtIGEueSkqZHkwKS8oZHgwKmR4MCArIGR5MCpkeTApOworICAgICAgICAgICAgICAgIGlmKCB0IDwgcHJldnQgfHwgdCA+IDEgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBwcmV2dCA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKworLy8KKy8vIG9yZGVyIGEgZ3JvdXAgb2YgY29ubmVjdGVkIHF1YWRzCisvLyBvcmRlciBvZiBjb3JuZXJzOgorLy8gICAwIGlzIHRvcCBsZWZ0CisvLyAgIGNsb2Nrd2lzZSBmcm9tIHRoZXJlCisvLyBub3RlOiAidG9wIGxlZnQiIGlzIG5vbWluYWwsIGRlcGVuZHMgb24gaW5pdGlhbCBvcmRlcmluZyBvZiBzdGFydGluZyBxdWFkCisvLyAgIGJ1dCBhbGwgb3RoZXIgcXVhZHMgYXJlIG9yZGVyZWQgY29uc2lzdGVudGx5CisvLworLy8gY2FuIGNoYW5nZSB0aGUgbnVtYmVyIG9mIHF1YWRzIGluIHRoZSBncm91cAorLy8gY2FuIGFkZCBxdWFkcywgc28gd2UgbmVlZCB0byBoYXZlIHF1YWQvY29ybmVyIGFycmF5cyBwYXNzZWQgaW4KKy8vCisKK3N0YXRpYyBpbnQKK2ljdk9yZGVyRm91bmRDb25uZWN0ZWRRdWFkcyggaW50IHF1YWRfY291bnQsIEN2Q0JRdWFkICoqcXVhZHMsCisgICAgICAgIGludCAqYWxsX2NvdW50LCBDdkNCUXVhZCAqKmFsbF9xdWFkcywgQ3ZDQkNvcm5lciAqKmNvcm5lcnMsCisgICAgICAgIEN2U2l6ZSBwYXR0ZXJuX3NpemUsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApOworICAgIEN2U2VxKiBzdGFjayA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoKnN0YWNrKSwgc2l6ZW9mKHZvaWQqKSwgdGVtcF9zdG9yYWdlICk7CisgICAgaW50IGk7CisKKyAgICAvLyBmaXJzdCBmaW5kIGFuIGludGVyaW9yIHF1YWQKKyAgICBDdkNCUXVhZCAqc3RhcnQgPSBOVUxMOworICAgIGZvciAoaT0wOyBpPHF1YWRfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChxdWFkc1tpXS0+Y291bnQgPT0gNCkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhcnQgPSBxdWFkc1tpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXJ0ID09IE5VTEwpCisgICAgeworICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisgICAgICAgIHJldHVybiAwOyAgIC8vIG5vIDQtY29ubmVjdGVkIHF1YWQKKyAgICB9CisKKyAgICAvLyBzdGFydCB3aXRoIGZpcnN0IG9uZSwgYXNzaWduIHJvd3MvY29scworICAgIGludCByb3dfbWluID0gMCwgY29sX21pbiA9IDAsIHJvd19tYXg9MCwgY29sX21heCA9IDA7CisjZGVmaW5lIEhTSVpFIDIwCisgICAgaW50IGNvbF9oaXN0W0hTSVpFKjJdOworICAgIGludCByb3dfaGlzdFtIU0laRSoyXTsgLy8gYmFkIHByb2dyYW1taW5nLCBzaG91bGQgYWxsb3cgdmFyaWFibGUgc2l6ZQorCisgICAgZm9yIChpPTA7IGk8SFNJWkUqMjsgaSsrKSAvLyBpbml0IHRvIHplcm8KKyAgICAgICAgY29sX2hpc3RbaV0gPSByb3dfaGlzdFtpXSA9IDA7CisgICAgY3ZTZXFQdXNoKHN0YWNrLCAmc3RhcnQpOworICAgIHN0YXJ0LT5yb3cgPSAwOworICAgIHN0YXJ0LT5jb2wgPSAwOworICAgIHN0YXJ0LT5vcmRlcmVkID0gdHJ1ZTsKKworICAgIC8vIFJlY3Vyc2l2ZWx5IG9yZGVyIHRoZSBxdWFkcyBzbyB0aGF0IGFsbCBwb3NpdGlvbiBudW1iZXJzIChlLmcuLAorICAgIC8vIDAsMSwyLDMpIGFyZSBpbiB0aGUgYXQgdGhlIHNhbWUgcmVsYXRpdmUgY29ybmVyIChlLmcuLCBsb3dlciByaWdodCkuCisKKyAgICB3aGlsZSggc3RhY2stPnRvdGFsICkKKyAgICB7CisgICAgICAgIEN2Q0JRdWFkKiBxOworICAgICAgICBjdlNlcVBvcCggc3RhY2ssICZxICk7CisgICAgICAgIGludCBjb2wgPSBxLT5jb2w7CisgICAgICAgIGludCByb3cgPSBxLT5yb3c7CisgICAgICAgIGNvbF9oaXN0W2NvbCtIU0laRV0rKzsKKyAgICAgICAgcm93X2hpc3Rbcm93K0hTSVpFXSsrOworCisgICAgICAgIC8vIGNoZWNrIG1pbi9tYXgKKyAgICAgICAgaWYgKHJvdyA+IHJvd19tYXgpIHJvd19tYXggPSByb3c7CisgICAgICAgIGlmIChyb3cgPCByb3dfbWluKSByb3dfbWluID0gcm93OworICAgICAgICBpZiAoY29sID4gY29sX21heCkgY29sX21heCA9IGNvbDsKKyAgICAgICAgaWYgKGNvbCA8IGNvbF9taW4pIGNvbF9taW4gPSBjb2w7CisKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q0JRdWFkICpuZWlnaGJvciA9IHEtPm5laWdoYm9yc1tpXTsKKyAgICAgICAgICAgIHN3aXRjaChpKSAgIC8vIGFkanVzdCBjb2wsIHJvdyBmb3IgdGhpcyBxdWFkCisgICAgICAgICAgICB7ICAgICAgICAgICAvLyBzdGFydCBhdCB0b3AgbGVmdCwgZ28gY2xvY2t3aXNlCisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcm93LS07IGNvbC0tOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjb2wgKz0gMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcm93ICs9IDI7CWJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGNvbCAtPSAyOyBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8ganVzdCBkbyBpbnNpZGUgcXVhZHMKKyAgICAgICAgICAgIGlmIChuZWlnaGJvciAmJiBuZWlnaGJvci0+b3JkZXJlZCA9PSBmYWxzZSAmJiBuZWlnaGJvci0+Y291bnQgPT0gNCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBQUklOVEYoImNvbDogJWQgIHJvdzogJWRcbiIsIGNvbCwgcm93KTsKKyAgICAgICAgICAgICAgICBpY3ZPcmRlclF1YWQobmVpZ2hib3IsIHEtPmNvcm5lcnNbaV0sIChpKzIpJTQpOyAvLyBzZXQgaW4gb3JkZXIKKyAgICAgICAgICAgICAgICBuZWlnaGJvci0+b3JkZXJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbmVpZ2hib3ItPnJvdyA9IHJvdzsKKyAgICAgICAgICAgICAgICBuZWlnaGJvci0+Y29sID0gY29sOworICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggc3RhY2ssICZuZWlnaGJvciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworCisgICAgZm9yIChpPWNvbF9taW47IGk8PWNvbF9tYXg7IGkrKykKKyAgICAgICAgUFJJTlRGKCJISVNUWyVkXSA9ICVkXG4iLCBpLCBjb2xfaGlzdFtpK0hTSVpFXSk7CisKKyAgICAvLyBhbmFseXplIGlubmVyIHF1YWQgc3RydWN0dXJlCisgICAgaW50IHcgPSBwYXR0ZXJuX3NpemUud2lkdGggLSAxOworICAgIGludCBoID0gcGF0dGVybl9zaXplLmhlaWdodCAtIDE7CisgICAgaW50IGRyb3cgPSByb3dfbWF4IC0gcm93X21pbiArIDE7CisgICAgaW50IGRjb2wgPSBjb2xfbWF4IC0gY29sX21pbiArIDE7CisKKyAgICAvLyBub3JtYWxpemUgcGF0dGVybiBhbmQgZm91bmQgcXVhZCBpbmRpY2VzCisgICAgaWYgKCh3ID4gaCAmJiBkY29sIDwgZHJvdykgfHwKKyAgICAgICAgKHcgPCBoICYmIGRyb3cgPCBkY29sKSkKKyAgICB7CisgICAgICAgIGggPSBwYXR0ZXJuX3NpemUud2lkdGggLSAxOworICAgICAgICB3ID0gcGF0dGVybl9zaXplLmhlaWdodCAtIDE7CisgICAgfQorCisgICAgUFJJTlRGKCJTaXplOiAlZHglZCAgUGF0dGVybjogJWR4JWRcbiIsIGRjb2wsIGRyb3csIHcsIGgpOworCisgICAgLy8gY2hlY2sgaWYgdGhlcmUgYXJlIGVub3VnaCBpbm5lciBxdWFkcworICAgIGlmIChkY29sIDwgdyB8fCBkcm93IDwgaCkgICAvLyBmb3VuZCBlbm91Z2ggaW5uZXIgcXVhZHM/CisgICAgeworICAgICAgICBQUklOVEYoIlRvbyBmZXcgaW5uZXIgcXVhZCByb3dzL2NvbHNcbiIpOworICAgICAgICByZXR1cm4gMDsgICAvLyBubywgcmV0dXJuCisgICAgfQorCisgICAgLy8gdG9vIG1hbnkgY29sdW1ucywgbm90IHZlcnkgY29tbW9uCisgICAgaWYgKGRjb2wgPT0gdysxKSAgICAvLyB0b28gbWFueSwgdHJpbQorICAgIHsKKyAgICAgICAgUFJJTlRGKCJUcmltbWluZyBjb2xzXG4iKTsKKyAgICAgICAgaWYgKGNvbF9oaXN0W2NvbF9tYXgrSFNJWkVdID4gY29sX2hpc3RbY29sX21pbitIU0laRV0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBSSU5URigiVHJpbW1pbmcgbGVmdCBjb2xcbiIpOworICAgICAgICAgICAgcXVhZF9jb3VudCA9IGljdlRyaW1Db2wocXVhZHMscXVhZF9jb3VudCxjb2xfbWluLC0xKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBSSU5URigiVHJpbW1pbmcgcmlnaHQgY29sXG4iKTsKKyAgICAgICAgICAgIHF1YWRfY291bnQgPSBpY3ZUcmltQ29sKHF1YWRzLHF1YWRfY291bnQsY29sX21heCwrMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0b28gbWFueSByb3dzLCBub3QgdmVyeSBjb21tb24KKyAgICBpZiAoZHJvdyA9PSBoKzEpICAgIC8vIHRvbyBtYW55LCB0cmltCisgICAgeworICAgICAgICBQUklOVEYoIlRyaW1taW5nIHJvd3NcbiIpOworICAgICAgICBpZiAocm93X2hpc3Rbcm93X21heCtIU0laRV0gPiByb3dfaGlzdFtyb3dfbWluK0hTSVpFXSkKKyAgICAgICAgeworICAgICAgICAgICAgUFJJTlRGKCJUcmltbWluZyB0b3Agcm93XG4iKTsKKyAgICAgICAgICAgIHF1YWRfY291bnQgPSBpY3ZUcmltUm93KHF1YWRzLHF1YWRfY291bnQscm93X21pbiwtMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQUklOVEYoIlRyaW1taW5nIGJvdHRvbSByb3dcbiIpOworICAgICAgICAgICAgcXVhZF9jb3VudCA9IGljdlRyaW1Sb3cocXVhZHMscXVhZF9jb3VudCxyb3dfbWF4LCsxKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gY2hlY2sgZWRnZXMgb2YgaW5uZXIgcXVhZHMKKyAgICAvLyBpZiB0aGVyZSBpcyBhbiBvdXRlciBxdWFkIG1pc3NpbmcsIGZpbGwgaXQgaW4KKyAgICAvLyBmaXJzdCBvcmRlciBhbGwgaW5uZXIgcXVhZHMKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGZvciAoaT0wOyBpPHF1YWRfY291bnQ7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChxdWFkc1tpXS0+Y291bnQgPT0gNCkKKyAgICAgICAgeyAgIC8vIG9rLCBsb29rIGF0IG5laWdoYm9ycworICAgICAgICAgICAgaW50IGNvbCA9IHF1YWRzW2ldLT5jb2w7CisgICAgICAgICAgICBpbnQgcm93ID0gcXVhZHNbaV0tPnJvdzsKKyAgICAgICAgICAgIGZvciAoaW50IGo9MDsgajw0OyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKGopICAgLy8gYWRqdXN0IGNvbCwgcm93IGZvciB0aGlzIHF1YWQKKyAgICAgICAgICAgICAgICB7ICAgICAgIC8vIHN0YXJ0IGF0IHRvcCBsZWZ0LCBnbyBjbG9ja3dpc2UKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHJvdy0tOyBjb2wtLTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICBjb2wgKz0gMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICByb3cgKz0gMjsJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICBjb2wgLT0gMjsgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEN2Q0JRdWFkICpuZWlnaGJvciA9IHF1YWRzW2ldLT5uZWlnaGJvcnNbal07CisgICAgICAgICAgICAgICAgaWYgKG5laWdoYm9yICYmICFuZWlnaGJvci0+b3JkZXJlZCAmJiAvLyBpcyBpdCBhbiBpbm5lciBxdWFkPworICAgICAgICAgICAgICAgICAgICBjb2wgPD0gY29sX21heCAmJiBjb2wgPj0gY29sX21pbiAmJgorICAgICAgICAgICAgICAgICAgICByb3cgPD0gcm93X21heCAmJiByb3cgPj0gcm93X21pbikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHNvLCBzZXQgaW4gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgUFJJTlRGKCJBZGRpbmcgaW5uZXI6IGNvbDogJWQgIHJvdzogJWRcbiIsIGNvbCwgcm93KTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWN2T3JkZXJRdWFkKG5laWdoYm9yLCBxdWFkc1tpXS0+Y29ybmVyc1tqXSwgKGorMiklNCk7CisgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yLT5vcmRlcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3ItPnJvdyA9IHJvdzsKKyAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3ItPmNvbCA9IGNvbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiB3ZSBoYXZlIGZvdW5kIGlubmVyIHF1YWRzLCBhZGQgY29ycmVzcG9uZGluZyBvdXRlciBxdWFkcywKKyAgICAvLyAgIHdoaWNoIGFyZSBtaXNzaW5nCisgICAgaWYgKGZvdW5kID4gMCkKKyAgICB7CisgICAgICAgIFBSSU5URigiRm91bmQgJWQgaW5uZXIgcXVhZHMgbm90IGNvbm5lY3RlZCB0byBvdXRlciBxdWFkcywgcmVwYWlyaW5nXG4iLCBmb3VuZCk7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTxxdWFkX2NvdW50OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChxdWFkc1tpXS0+Y291bnQgPCA0ICYmIHF1YWRzW2ldLT5vcmRlcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBhZGRlZCA9IGljdkFkZE91dGVyUXVhZChxdWFkc1tpXSxxdWFkcyxxdWFkX2NvdW50LGFsbF9xdWFkcywqYWxsX2NvdW50LGNvcm5lcnMpOworICAgICAgICAgICAgICAgICphbGxfY291bnQgKz0gYWRkZWQ7CisgICAgICAgICAgICAgICAgcXVhZF9jb3VudCArPSBhZGRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgLy8gZmluYWwgdHJpbW1pbmcgb2Ygb3V0ZXIgcXVhZHMKKyAgICBpZiAoZGNvbCA9PSB3ICYmIGRyb3cgPT0gaCkJLy8gZm91bmQgY29ycmVjdCBpbm5lciBxdWFkcworICAgIHsKKyAgICAgICAgUFJJTlRGKCJJbm5lciBib3VuZHMgb2ssIGNoZWNrIG91dGVyIHF1YWRzXG4iKTsKKyAgICAgICAgaW50IHJjb3VudCA9IHF1YWRfY291bnQ7CisgICAgICAgIGZvciAoaW50IGk9cXVhZF9jb3VudC0xOyBpPj0wOyBpLS0pIC8vIGVsaW1pbmF0ZSBhbnkgcXVhZCBub3QgY29ubmVjdGVkIHRvCisgICAgICAgICAgICAvLyBhbiBvcmRlcmVkIHF1YWQKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHF1YWRzW2ldLT5vcmRlcmVkID09IGZhbHNlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJvb2wgb3V0ZXIgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqPTA7IGo8NDsgaisrKSAvLyBhbnkgbmVpZ2hib3JzIHRoYXQgYXJlIG9yZGVyZWQ/CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAocXVhZHNbaV0tPm5laWdoYm9yc1tqXSAmJiBxdWFkc1tpXS0+bmVpZ2hib3JzW2pdLT5vcmRlcmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW91dGVyKQkvLyBub3QgYW4gb3V0ZXIgcXVhZCwgZWxpbWluYXRlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBQUklOVEYoIlJlbW92aW5nIHF1YWQgJWRcbiIsIGkpOworICAgICAgICAgICAgICAgICAgICBpY3ZSZW1vdmVRdWFkRnJvbUdyb3VwKHF1YWRzLHJjb3VudCxxdWFkc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIHJjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIHJldHVybiByY291bnQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworLy8gYWRkIGFuIG91dGVyIHF1YWQKKy8vIGxvb2tzIGZvciB0aGUgbmVpZ2hib3Igb2YgPHF1YWQ+IHRoYXQgaXNuJ3QgcHJlc2VudCwKKy8vICAgdHJpZXMgdG8gYWRkIGl0IGluLgorLy8gPHF1YWQ+IGlzIG9yZGVyZWQKKworc3RhdGljIGludAoraWN2QWRkT3V0ZXJRdWFkKCBDdkNCUXVhZCAqcXVhZCwgQ3ZDQlF1YWQgKipxdWFkcywgaW50IHF1YWRfY291bnQsCisgICAgICAgIEN2Q0JRdWFkICoqYWxsX3F1YWRzLCBpbnQgYWxsX2NvdW50LCBDdkNCQ29ybmVyICoqY29ybmVycyApCisKK3sKKyAgICBpbnQgYWRkZWQgPSAwOworICAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIC8vIGZpbmQgbm8tbmVpZ2hib3IgY29ybmVycworICAgIHsKKyAgICAgICAgaWYgKCFxdWFkLT5uZWlnaGJvcnNbaV0pICAgIC8vIG9rLCBjcmVhdGUgYW5kIGFkZCBuZWlnaGJvcgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaiA9IChpKzIpJTQ7CisgICAgICAgICAgICBQUklOVEYoIkFkZGluZyBxdWFkIGFzIG5laWdoYm9yIDJcbiIpOworICAgICAgICAgICAgQ3ZDQlF1YWQgKnEgPSAmKCphbGxfcXVhZHMpW2FsbF9jb3VudF07CisgICAgICAgICAgICBtZW1zZXQoIHEsIDAsIHNpemVvZigqcSkgKTsKKyAgICAgICAgICAgIGFkZGVkKys7CisgICAgICAgICAgICBxdWFkc1txdWFkX2NvdW50XSA9IHE7CisgICAgICAgICAgICBxdWFkX2NvdW50Kys7CisKKyAgICAgICAgICAgIC8vIHNldCBuZWlnaGJvciBhbmQgZ3JvdXAgaWQKKyAgICAgICAgICAgIHF1YWQtPm5laWdoYm9yc1tpXSA9IHE7CisgICAgICAgICAgICBxdWFkLT5jb3VudCArPSAxOworICAgICAgICAgICAgcS0+bmVpZ2hib3JzW2pdID0gcXVhZDsKKyAgICAgICAgICAgIHEtPmdyb3VwX2lkeCA9IHF1YWQtPmdyb3VwX2lkeDsKKyAgICAgICAgICAgIHEtPmNvdW50ID0gMTsJLy8gbnVtYmVyIG9mIG5laWdoYm9ycworICAgICAgICAgICAgcS0+b3JkZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgcS0+ZWRnZV9sZW4gPSBxdWFkLT5lZGdlX2xlbjsKKworICAgICAgICAgICAgLy8gbWFrZSBjb3JuZXJzIG9mIG5ldyBxdWFkCisgICAgICAgICAgICAvLyBzYW1lIGFzIG5laWdoYm9yIHF1YWQsIGJ1dCBvZmZzZXQKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdCA9IHF1YWQtPmNvcm5lcnNbaV0tPnB0OworICAgICAgICAgICAgQ3ZDQkNvcm5lciogY29ybmVyOworICAgICAgICAgICAgZmxvYXQgZHggPSBwdC54IC0gcXVhZC0+Y29ybmVyc1tqXS0+cHQueDsKKyAgICAgICAgICAgIGZsb2F0IGR5ID0gcHQueSAtIHF1YWQtPmNvcm5lcnNbal0tPnB0Lnk7CisgICAgICAgICAgICBmb3IgKGludCBrPTA7IGs8NDsgaysrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvcm5lciA9ICYoKmNvcm5lcnMpW2FsbF9jb3VudCo0K2tdOworICAgICAgICAgICAgICAgIHB0ID0gcXVhZC0+Y29ybmVyc1trXS0+cHQ7CisgICAgICAgICAgICAgICAgbWVtc2V0KCBjb3JuZXIsIDAsIHNpemVvZigqY29ybmVyKSApOworICAgICAgICAgICAgICAgIGNvcm5lci0+cHQgPSBwdDsKKyAgICAgICAgICAgICAgICBxLT5jb3JuZXJzW2tdID0gY29ybmVyOworICAgICAgICAgICAgICAgIGNvcm5lci0+cHQueCArPSBkeDsKKyAgICAgICAgICAgICAgICBjb3JuZXItPnB0LnkgKz0gZHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBoYXZlIHRvIHNldCBleGFjdCBjb3JuZXIKKyAgICAgICAgICAgIHEtPmNvcm5lcnNbal0gPSBxdWFkLT5jb3JuZXJzW2ldOworCisgICAgICAgICAgICAvLyBub3cgZmluZCBvdGhlciBuZWlnaGJvciBhbmQgYWRkIGl0LCBpZiBwb3NzaWJsZQorICAgICAgICAgICAgaWYgKHF1YWQtPm5laWdoYm9yc1soaSszKSU0XSAmJgorICAgICAgICAgICAgICAgIHF1YWQtPm5laWdoYm9yc1soaSszKSU0XS0+b3JkZXJlZCAmJgorICAgICAgICAgICAgICAgIHF1YWQtPm5laWdoYm9yc1soaSszKSU0XS0+bmVpZ2hib3JzW2ldICYmCisgICAgICAgICAgICAgICAgcXVhZC0+bmVpZ2hib3JzWyhpKzMpJTRdLT5uZWlnaGJvcnNbaV0tPm9yZGVyZWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q0JRdWFkICpxbiA9IHF1YWQtPm5laWdoYm9yc1soaSszKSU0XS0+bmVpZ2hib3JzW2ldOworICAgICAgICAgICAgICAgIHEtPmNvdW50ID0gMjsKKyAgICAgICAgICAgICAgICBxLT5uZWlnaGJvcnNbKGorMSklNF0gPSBxbjsKKyAgICAgICAgICAgICAgICBxbi0+bmVpZ2hib3JzWyhpKzEpJTRdID0gcTsKKyAgICAgICAgICAgICAgICBxbi0+Y291bnQgKz0gMTsKKyAgICAgICAgICAgICAgICAvLyBoYXZlIHRvIHNldCBleGFjdCBjb3JuZXIKKyAgICAgICAgICAgICAgICBxLT5jb3JuZXJzWyhqKzEpJTRdID0gcW4tPmNvcm5lcnNbKGkrMSklNF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFsbF9jb3VudCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhZGRlZDsKK30KKworCisvLyB0cmltbWluZyByb3V0aW5lcworCitzdGF0aWMgaW50CitpY3ZUcmltQ29sKEN2Q0JRdWFkICoqcXVhZHMsIGludCBjb3VudCwgaW50IGNvbCwgaW50IGRpcikKK3sKKyAgICBpbnQgcmNvdW50ID0gY291bnQ7CisgICAgLy8gZmluZCB0aGUgcmlnaHQgcXVhZChzKQorICAgIGZvciAoaW50IGk9MDsgaTxjb3VudDsgaSsrKQorICAgIHsKKyNpZmRlZiBERUJVR19DSEVTU0JPQVJECisgICAgICAgIGlmIChxdWFkc1tpXS0+b3JkZXJlZCkKKyAgICAgICAgICAgIFBSSU5URigiaW5kZXg6ICVkICBjdXI6ICVkXG4iLCBjb2wsIHF1YWRzW2ldLT5jb2wpOworI2VuZGlmCisgICAgICAgIGlmIChxdWFkc1tpXS0+b3JkZXJlZCAmJiBxdWFkc1tpXS0+Y29sID09IGNvbCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGRpciA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChxdWFkc1tpXS0+bmVpZ2hib3JzWzFdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2UmVtb3ZlUXVhZEZyb21Hcm91cChxdWFkcyxyY291bnQscXVhZHNbaV0tPm5laWdoYm9yc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIHJjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocXVhZHNbaV0tPm5laWdoYm9yc1syXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGljdlJlbW92ZVF1YWRGcm9tR3JvdXAocXVhZHMscmNvdW50LHF1YWRzW2ldLT5uZWlnaGJvcnNbMl0pOworICAgICAgICAgICAgICAgICAgICByY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHF1YWRzW2ldLT5uZWlnaGJvcnNbMF0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZSZW1vdmVRdWFkRnJvbUdyb3VwKHF1YWRzLHJjb3VudCxxdWFkc1tpXS0+bmVpZ2hib3JzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgcmNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChxdWFkc1tpXS0+bmVpZ2hib3JzWzNdKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2UmVtb3ZlUXVhZEZyb21Hcm91cChxdWFkcyxyY291bnQscXVhZHNbaV0tPm5laWdoYm9yc1szXSk7CisgICAgICAgICAgICAgICAgICAgIHJjb3VudC0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByY291bnQ7Cit9CisKK3N0YXRpYyBpbnQKK2ljdlRyaW1Sb3coQ3ZDQlF1YWQgKipxdWFkcywgaW50IGNvdW50LCBpbnQgcm93LCBpbnQgZGlyKQoreworICAgIGludCBpLCByY291bnQgPSBjb3VudDsKKyAgICAvLyBmaW5kIHRoZSByaWdodCBxdWFkKHMpCisgICAgZm9yIChpPTA7IGk8Y291bnQ7IGkrKykKKyAgICB7CisjaWZkZWYgREVCVUdfQ0hFU1NCT0FSRAorICAgICAgICBpZiAocXVhZHNbaV0tPm9yZGVyZWQpCisgICAgICAgICAgICBQUklOVEYoImluZGV4OiAlZCAgY3VyOiAlZFxuIiwgcm93LCBxdWFkc1tpXS0+cm93KTsKKyNlbmRpZgorICAgICAgICBpZiAocXVhZHNbaV0tPm9yZGVyZWQgJiYgcXVhZHNbaV0tPnJvdyA9PSByb3cpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChkaXIgPT0gMSkgICAvLyByZW1vdmUgZnJvbSBib3R0b20KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocXVhZHNbaV0tPm5laWdoYm9yc1syXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGljdlJlbW92ZVF1YWRGcm9tR3JvdXAocXVhZHMscmNvdW50LHF1YWRzW2ldLT5uZWlnaGJvcnNbMl0pOworICAgICAgICAgICAgICAgICAgICByY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHF1YWRzW2ldLT5uZWlnaGJvcnNbM10pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZSZW1vdmVRdWFkRnJvbUdyb3VwKHF1YWRzLHJjb3VudCxxdWFkc1tpXS0+bmVpZ2hib3JzWzNdKTsKKyAgICAgICAgICAgICAgICAgICAgcmNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAgICAvLyByZW1vdmUgZnJvbSB0b3AKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocXVhZHNbaV0tPm5laWdoYm9yc1swXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGljdlJlbW92ZVF1YWRGcm9tR3JvdXAocXVhZHMscmNvdW50LHF1YWRzW2ldLT5uZWlnaGJvcnNbMF0pOworICAgICAgICAgICAgICAgICAgICByY291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHF1YWRzW2ldLT5uZWlnaGJvcnNbMV0pCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZSZW1vdmVRdWFkRnJvbUdyb3VwKHF1YWRzLHJjb3VudCxxdWFkc1tpXS0+bmVpZ2hib3JzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgcmNvdW50LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJjb3VudDsKK30KKworCisvLworLy8gcmVtb3ZlIHF1YWQgZnJvbSBxdWFkIGdyb3VwCisvLworCitzdGF0aWMgdm9pZAoraWN2UmVtb3ZlUXVhZEZyb21Hcm91cChDdkNCUXVhZCAqKnF1YWRzLCBpbnQgY291bnQsIEN2Q0JRdWFkICpxMCkKK3sKKyAgICBpbnQgaSwgajsKKyAgICAvLyByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBxdWFkIGFzIGEgbmVpZ2hib3IKKyAgICBmb3IoaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2Q0JRdWFkICpxID0gcXVhZHNbaV07CisgICAgICAgIGZvcihqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBxLT5uZWlnaGJvcnNbal0gPT0gcTAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHEtPm5laWdoYm9yc1tqXSA9IDA7CisgICAgICAgICAgICAgICAgcS0+Y291bnQtLTsKKyAgICAgICAgICAgICAgICBmb3IoaW50IGsgPSAwOyBrIDwgNDsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIHEwLT5uZWlnaGJvcnNba10gPT0gcSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHEwLT5uZWlnaGJvcnNba10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcTAtPmNvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlbW92ZSB0aGUgcXVhZAorICAgIGZvcihpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZDQlF1YWQgKnEgPSBxdWFkc1tpXTsKKyAgICAgICAgaWYgKHEgPT0gcTApCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1YWRzW2ldID0gcXVhZHNbY291bnQtMV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8KKy8vIHB1dCBxdWFkIGludG8gY29ycmVjdCBvcmRlciwgd2hlcmUgPGNvcm5lcj4gaGFzIHZhbHVlIDxjb21tb24+CisvLworCitzdGF0aWMgdm9pZAoraWN2T3JkZXJRdWFkKEN2Q0JRdWFkICpxdWFkLCBDdkNCQ29ybmVyICpjb3JuZXIsIGludCBjb21tb24pCit7CisgICAgLy8gZmluZCB0aGUgY29ybmVyCisgICAgaW50IHRjOworICAgIGZvciAodGM9MDsgdGM8NDsgdGMrKykKKyAgICAgICAgaWYgKHF1YWQtPmNvcm5lcnNbdGNdLT5wdC54ID09IGNvcm5lci0+cHQueCAmJgorICAgICAgICAgICAgcXVhZC0+Y29ybmVyc1t0Y10tPnB0LnkgPT0gY29ybmVyLT5wdC55KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAvLyBzZXQgY29ybmVyIG9yZGVyCisgICAgLy8gc2hpZnQKKyAgICB3aGlsZSAodGMgIT0gY29tbW9uKQorICAgIHsKKyAgICAgICAgLy8gc2hpZnQgYnkgb25lCisgICAgICAgIEN2Q0JDb3JuZXIgKnRlbXBjOworICAgICAgICBDdkNCUXVhZCAqdGVtcHE7CisgICAgICAgIHRlbXBjID0gcXVhZC0+Y29ybmVyc1szXTsKKyAgICAgICAgdGVtcHEgPSBxdWFkLT5uZWlnaGJvcnNbM107CisgICAgICAgIGZvciAoaW50IGk9MzsgaT4wOyBpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHF1YWQtPmNvcm5lcnNbaV0gPSBxdWFkLT5jb3JuZXJzW2ktMV07CisgICAgICAgICAgICBxdWFkLT5uZWlnaGJvcnNbaV0gPSBxdWFkLT5uZWlnaGJvcnNbaS0xXTsKKyAgICAgICAgfQorICAgICAgICBxdWFkLT5jb3JuZXJzWzBdID0gdGVtcGM7CisgICAgICAgIHF1YWQtPm5laWdoYm9yc1swXSA9IHRlbXBxOworICAgICAgICB0YysrOworICAgICAgICB0YyA9IHRjJTQ7CisgICAgfQorfQorCisKKy8vIGlmIHdlIGZvdW5kIHRvbyBtYW55IGNvbm5lY3QgcXVhZHMsIHJlbW92ZSB0aG9zZSB3aGljaCBwcm9iYWJseSBkbyBub3QgYmVsb25nLgorc3RhdGljIGludAoraWN2Q2xlYW5Gb3VuZENvbm5lY3RlZFF1YWRzKCBpbnQgcXVhZF9jb3VudCwgQ3ZDQlF1YWQgKipxdWFkX2dyb3VwLCBDdlNpemUgcGF0dGVybl9zaXplICkKK3sKKyAgICBDdk1lbVN0b3JhZ2UgKnRlbXBfc3RvcmFnZSA9IDA7CisgICAgQ3ZQb2ludDJEMzJmICpjZW50ZXJzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q2xlYW5Gb3VuZENvbm5lY3RlZFF1YWRzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZQb2ludDJEMzJmIGNlbnRlciA9IHswLDB9OworICAgIGludCBpLCBqLCBrOworICAgIC8vIG51bWJlciBvZiBxdWFkcyB0aGlzIHBhdHRlcm4gc2hvdWxkIGNvbnRhaW4KKyAgICBpbnQgY291bnQgPSAoKHBhdHRlcm5fc2l6ZS53aWR0aCArIDEpKihwYXR0ZXJuX3NpemUuaGVpZ2h0ICsgMSkgKyAxKS8yOworCisgICAgLy8gaWYgd2UgaGF2ZSBtb3JlIHF1YWRyYW5nbGVzIHRoYW4gd2Ugc2hvdWxkLAorICAgIC8vIHRyeSB0byBlbGltaW5hdGUgZHVwbGljYXRlcyBvciBvbmVzIHdoaWNoIGRvbid0IGJlbG9uZyB0byB0aGUgcGF0dGVybiByZWN0YW5nbGUuLi4KKyAgICBpZiggcXVhZF9jb3VudCA8PSBjb3VudCApCisgICAgICAgIEVYSVQ7CisKKyAgICAvLyBjcmVhdGUgYW4gYXJyYXkgb2YgcXVhZHJhbmdsZSBjZW50ZXJzCisgICAgQ1ZfQ0FMTCggY2VudGVycyA9IChDdlBvaW50MkQzMmYgKiljdkFsbG9jKCBzaXplb2YoY2VudGVyc1swXSkqcXVhZF9jb3VudCApKTsKKyAgICBDVl9DQUxMKCB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoMCkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IHF1YWRfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDdlBvaW50MkQzMmYgY2kgPSB7MCwwfTsKKyAgICAgICAgQ3ZDQlF1YWQqIHEgPSBxdWFkX2dyb3VwW2ldOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCA0OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50MkQzMmYgcHQgPSBxLT5jb3JuZXJzW2pdLT5wdDsKKyAgICAgICAgICAgIGNpLnggKz0gcHQueDsKKyAgICAgICAgICAgIGNpLnkgKz0gcHQueTsKKyAgICAgICAgfQorCisgICAgICAgIGNpLnggKj0gMC4yNWY7CisgICAgICAgIGNpLnkgKj0gMC4yNWY7CisKKyAgICAgICAgY2VudGVyc1tpXSA9IGNpOworICAgICAgICBjZW50ZXIueCArPSBjaS54OworICAgICAgICBjZW50ZXIueSArPSBjaS55OworICAgIH0KKyAgICBjZW50ZXIueCAvPSBxdWFkX2NvdW50OworICAgIGNlbnRlci55IC89IHF1YWRfY291bnQ7CisKKyAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIG1vcmUgcXVhZHJhbmdsZXMgdGhhbiB3ZSBzaG91bGQsCisgICAgLy8gd2UgdHJ5IHRvIGVsaW1pbmF0ZSBiYWQgb25lcyBiYXNlZCBvbiBtaW5pbWl6aW5nIHRoZSBib3VuZGluZyBib3guCisgICAgLy8gV2UgaXRlcmF0aXZlbHkgcmVtb3ZlIHRoZSBwb2ludCB3aGljaCByZWR1Y2VzIHRoZSBzaXplIG9mCisgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgYmxvYnMgdGhlIG1vc3QKKyAgICAvLyAoc2luY2Ugd2Ugd2FudCB0aGUgcmVjdGFuZ2xlIHRvIGJlIGFzIHNtYWxsIGFzIHBvc3NpYmxlKQorICAgIC8vIHJlbW92ZSB0aGUgcXVhZHJhbmdlIHRoYXQgY2F1c2VzIHRoZSBiaWdnZXN0IHJlZHVjdGlvbgorICAgIC8vIGluIHBhdHRlcm4gc2l6ZSB1bnRpbCB3ZSBoYXZlIHRoZSBjb3JyZWN0IG51bWJlcgorICAgIGZvciggOyBxdWFkX2NvdW50ID4gY291bnQ7IHF1YWRfY291bnQtLSApCisgICAgeworICAgICAgICBkb3VibGUgbWluX2JveF9hcmVhID0gREJMX01BWDsKKyAgICAgICAgaW50IHNraXAsIG1pbl9ib3hfYXJlYV9pbmRleCA9IC0xOworICAgICAgICBDdkNCUXVhZCAqcTAsICpxOworCisgICAgICAgIC8vIEZvciBlYWNoIHBvaW50LCBjYWxjdWxhdGUgYm94IGFyZWEgd2l0aG91dCB0aGF0IHBvaW50CisgICAgICAgIGZvciggc2tpcCA9IDA7IHNraXAgPCBxdWFkX2NvdW50OyBza2lwKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBnZXQgYm91bmRpbmcgcmVjdGFuZ2xlCisgICAgICAgICAgICBDdlBvaW50MkQzMmYgdGVtcCA9IGNlbnRlcnNbc2tpcF07IC8vIHRlbXBvcmFyaWx5IG1ha2UgaW5kZXggJ3NraXAnIHRoZSBzYW1lIGFzCisgICAgICAgICAgICBjZW50ZXJzW3NraXBdID0gY2VudGVyOyAgICAgICAgICAgIC8vIHBhdHRlcm4gY2VudGVyIChzbyBpdCBpcyBub3QgY291bnRlZCBmb3IgY29udmV4IGh1bGwpCisgICAgICAgICAgICBDdk1hdCBwb2ludE1hdCA9IGN2TWF0KDEsIHF1YWRfY291bnQsIENWXzMyRkMyLCBjZW50ZXJzKTsKKyAgICAgICAgICAgIEN2U2VxICpodWxsID0gY3ZDb252ZXhIdWxsMiggJnBvaW50TWF0LCB0ZW1wX3N0b3JhZ2UsIENWX0NMT0NLV0lTRSwgMSApOworICAgICAgICAgICAgY2VudGVyc1tza2lwXSA9IHRlbXA7CisgICAgICAgICAgICBkb3VibGUgaHVsbF9hcmVhID0gZmFicyhjdkNvbnRvdXJBcmVhKGh1bGwsIENWX1dIT0xFX1NFUSkpOworCisgICAgICAgICAgICAvLyByZW1lbWJlciBzbWFsbGVzdCBib3ggYXJlYQorICAgICAgICAgICAgaWYoIGh1bGxfYXJlYSA8IG1pbl9ib3hfYXJlYSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWluX2JveF9hcmVhID0gaHVsbF9hcmVhOworICAgICAgICAgICAgICAgIG1pbl9ib3hfYXJlYV9pbmRleCA9IHNraXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdkNsZWFyTWVtU3RvcmFnZSggdGVtcF9zdG9yYWdlICk7CisgICAgICAgIH0KKworICAgICAgICBxMCA9IHF1YWRfZ3JvdXBbbWluX2JveF9hcmVhX2luZGV4XTsKKworICAgICAgICAvLyByZW1vdmUgYW55IHJlZmVyZW5jZXMgdG8gdGhpcyBxdWFkIGFzIGEgbmVpZ2hib3IKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHF1YWRfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHEgPSBxdWFkX2dyb3VwW2ldOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHEtPm5laWdoYm9yc1tqXSA9PSBxMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBxLT5uZWlnaGJvcnNbal0gPSAwOworICAgICAgICAgICAgICAgICAgICBxLT5jb3VudC0tOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgNDsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBxMC0+bmVpZ2hib3JzW2tdID09IHEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEwLT5uZWlnaGJvcnNba10gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHEwLT5jb3VudC0tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmUgdGhlIHF1YWQKKyAgICAgICAgcXVhZF9jb3VudC0tOworICAgICAgICBxdWFkX2dyb3VwW21pbl9ib3hfYXJlYV9pbmRleF0gPSBxdWFkX2dyb3VwW3F1YWRfY291bnRdOworICAgICAgICBjZW50ZXJzW21pbl9ib3hfYXJlYV9pbmRleF0gPSBjZW50ZXJzW3F1YWRfY291bnRdOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisgICAgY3ZGcmVlKCAmY2VudGVycyApOworCisgICAgcmV0dXJuIHF1YWRfY291bnQ7Cit9CisKKy8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzdGF0aWMgaW50CitpY3ZGaW5kQ29ubmVjdGVkUXVhZHMoIEN2Q0JRdWFkICpxdWFkLCBpbnQgcXVhZF9jb3VudCwgQ3ZDQlF1YWQgKipvdXRfZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBncm91cF9pZHgsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApOworICAgIEN2U2VxKiBzdGFjayA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoKnN0YWNrKSwgc2l6ZW9mKHZvaWQqKSwgdGVtcF9zdG9yYWdlICk7CisgICAgaW50IGksIGNvdW50ID0gMDsKKworICAgIC8vIFNjYW4gdGhlIGFycmF5IGZvciBhIGZpcnN0IHVubGFiZWxlZCBxdWFkCisgICAgZm9yKCBpID0gMDsgaSA8IHF1YWRfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiggcXVhZFtpXS5jb3VudCA+IDAgJiYgcXVhZFtpXS5ncm91cF9pZHggPCAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLy8gUmVjdXJzaXZlbHkgZmluZCBhIGdyb3VwIG9mIGNvbm5lY3RlZCBxdWFkcyBzdGFydGluZyBmcm9tIHRoZSBzZWVkIHF1YWRbaV0KKyAgICBpZiggaSA8IHF1YWRfY291bnQgKQorICAgIHsKKyAgICAgICAgQ3ZDQlF1YWQqIHEgPSAmcXVhZFtpXTsKKyAgICAgICAgY3ZTZXFQdXNoKCBzdGFjaywgJnEgKTsKKyAgICAgICAgb3V0X2dyb3VwW2NvdW50KytdID0gcTsKKyAgICAgICAgcS0+Z3JvdXBfaWR4ID0gZ3JvdXBfaWR4OworICAgICAgICBxLT5vcmRlcmVkID0gZmFsc2U7CisKKyAgICAgICAgd2hpbGUoIHN0YWNrLT50b3RhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2U2VxUG9wKCBzdGFjaywgJnEgKTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q0JRdWFkICpuZWlnaGJvciA9IHEtPm5laWdoYm9yc1tpXTsKKyAgICAgICAgICAgICAgICBpZiggbmVpZ2hib3IgJiYgbmVpZ2hib3ItPmNvdW50ID4gMCAmJiBuZWlnaGJvci0+Z3JvdXBfaWR4IDwgMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHN0YWNrLCAmbmVpZ2hib3IgKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0X2dyb3VwW2NvdW50KytdID0gbmVpZ2hib3I7CisgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yLT5ncm91cF9pZHggPSBncm91cF9pZHg7CisgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yLT5vcmRlcmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworICAgIHJldHVybiBjb3VudDsKK30KKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIGludAoraWN2Q2hlY2tRdWFkR3JvdXAoIEN2Q0JRdWFkICoqcXVhZF9ncm91cCwgaW50IHF1YWRfY291bnQsCisgICAgICAgICAgICAgICAgICAgQ3ZDQkNvcm5lciAqKm91dF9jb3JuZXJzLCBDdlNpemUgcGF0dGVybl9zaXplICkKK3sKKyAgICBjb25zdCBpbnQgUk9XMSA9IDEwMDAwMDA7CisgICAgY29uc3QgaW50IFJPVzIgPSAyMDAwMDAwOworICAgIGNvbnN0IGludCBST1dfID0gMzAwMDAwMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgaSwgb3V0X2Nvcm5lcl9jb3VudCA9IDAsIGNvcm5lcl9jb3VudCA9IDA7CisgICAgQ3ZDQkNvcm5lcioqIGNvcm5lcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDaGVja1F1YWRHcm91cCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBqLCBrLCBrazsKKyAgICBpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwOworICAgIGludCBoaXN0WzVdID0gezAsMCwwLDAsMH07CisgICAgQ3ZDQkNvcm5lciogZmlyc3QgPSAwLCAqZmlyc3QyID0gMCwgKnJpZ2h0LCAqY3VyLCAqYmVsb3csICpjOworICAgIENWX0NBTEwoIGNvcm5lcnMgPSAoQ3ZDQkNvcm5lcioqKWN2QWxsb2MoIHF1YWRfY291bnQqNCpzaXplb2YoY29ybmVyc1swXSkgKSk7CisKKyAgICAvLyBidWlsZCBkdWFsIGdyYXBoLCB3aGljaCB2ZXJ0aWNlcyBhcmUgaW50ZXJuYWwgcXVhZCBjb3JuZXJzCisgICAgLy8gYW5kIHR3byB2ZXJ0aWNlcyBhcmUgY29ubmVjdGVkIGlmZiB0aGV5IGxpZSBvbiB0aGUgc2FtZSBxdWFkIGVkZ2UKKyAgICBmb3IoIGkgPSAwOyBpIDwgcXVhZF9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2Q0JRdWFkKiBxID0gcXVhZF9ncm91cFtpXTsKKyAgICAgICAgLypDdlNjYWxhciBjb2xvciA9IHEtPmNvdW50ID09IDAgPyBjdlNjYWxhcigwLDI1NSwyNTUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBxLT5jb3VudCA9PSAxID8gY3ZTY2FsYXIoMCwwLDI1NSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIHEtPmNvdW50ID09IDIgPyBjdlNjYWxhcigwLDI1NSwwKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgcS0+Y291bnQgPT0gMyA/IGN2U2NhbGFyKDI1NSwyNTUsMCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNjYWxhcigyNTUsMCwwKTsqLworCisgICAgICAgIGZvciggaiA9IDA7IGogPCA0OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvL2N2TGluZSggZGVidWdfaW1nLCBjdlBvaW50RnJvbTMyZihxLT5jb3JuZXJzW2pdLT5wdCksIGN2UG9pbnRGcm9tMzJmKHEtPmNvcm5lcnNbKGorMSkmM10tPnB0KSwgY29sb3IsIDEsIENWX0FBLCAwICk7CisgICAgICAgICAgICBpZiggcS0+bmVpZ2hib3JzW2pdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkNCQ29ybmVyICphID0gcS0+Y29ybmVyc1tqXSwgKmIgPSBxLT5jb3JuZXJzWyhqKzEpJjNdOworICAgICAgICAgICAgICAgIC8vIG1hcmsgaW50ZXJuYWwgY29ybmVycyB0aGF0IGJlbG9uZyB0bzoKKyAgICAgICAgICAgICAgICAvLyAgIC0gYSBxdWFkIHdpdGggYSBzaW5nbGUgbmVpZ2hib3IgLSB3aXRoIFJPVzEsCisgICAgICAgICAgICAgICAgLy8gICAtIGEgcXVhZCB3aXRoIHR3byBuZWlnaGJvcnMgICAgIC0gd2l0aCBST1cyCisgICAgICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVzdCBvZiBpbnRlcm5hbCBjb3JuZXJzIHdpdGggUk9XXworICAgICAgICAgICAgICAgIGludCByb3dfZmxhZyA9IHEtPmNvdW50ID09IDEgPyBST1cxIDogcS0+Y291bnQgPT0gMiA/IFJPVzIgOiBST1dfOworCisgICAgICAgICAgICAgICAgaWYoIGEtPnJvdyA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvcm5lcnNbY29ybmVyX2NvdW50KytdID0gYTsKKyAgICAgICAgICAgICAgICAgICAgYS0+cm93ID0gcm93X2ZsYWc7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGEtPnJvdyA+IHJvd19mbGFnICkKKyAgICAgICAgICAgICAgICAgICAgYS0+cm93ID0gcm93X2ZsYWc7CisKKyAgICAgICAgICAgICAgICBpZiggcS0+bmVpZ2hib3JzWyhqKzEpJjNdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBhLT5jb3VudCA+PSA0IHx8IGItPmNvdW50ID49IDQgKQorICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDQ7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhLT5uZWlnaGJvcnNba10gPT0gYiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBiLT5uZWlnaGJvcnNba10gPT0gYSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhLT5uZWlnaGJvcnNbYS0+Y291bnQrK10gPSBiOworICAgICAgICAgICAgICAgICAgICBiLT5uZWlnaGJvcnNbYi0+Y291bnQrK10gPSBhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBjb3JuZXJfY291bnQgIT0gcGF0dGVybl9zaXplLndpZHRoKnBhdHRlcm5fc2l6ZS5oZWlnaHQgKQorICAgICAgICBFWElUOworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvcm5lcl9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBuID0gY29ybmVyc1tpXS0+Y291bnQ7CisgICAgICAgIGFzc2VydCggMCA8PSBuICYmIG4gPD0gNCApOworICAgICAgICBoaXN0W25dKys7CisgICAgICAgIGlmKCAhZmlyc3QgJiYgbiA9PSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNvcm5lcnNbaV0tPnJvdyA9PSBST1cxICkKKyAgICAgICAgICAgICAgICBmaXJzdCA9IGNvcm5lcnNbaV07CisgICAgICAgICAgICBlbHNlIGlmKCAhZmlyc3QyICYmIGNvcm5lcnNbaV0tPnJvdyA9PSBST1cyICkKKyAgICAgICAgICAgICAgICBmaXJzdDIgPSBjb3JuZXJzW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc3RhcnQgd2l0aCBhIGNvcm5lciB0aGF0IGJlbG9uZ3MgdG8gYSBxdWFkIHdpdGggYSBzaWdubGUgbmVpZ2hib3IuCisgICAgLy8gaWYgd2UgZG8gbm90IGhhdmUgc3VjaCwgc3RhcnQgd2l0aCBhIGNvcm5lciBvZiBhIHF1YWQgd2l0aCB0d28gbmVpZ2hib3JzLgorICAgIGlmKCAhZmlyc3QgKQorICAgICAgICBmaXJzdCA9IGZpcnN0MjsKKworICAgIGlmKCAhZmlyc3QgfHwgaGlzdFswXSAhPSAwIHx8IGhpc3RbMV0gIT0gMCB8fCBoaXN0WzJdICE9IDQgfHwKKyAgICAgICAgaGlzdFszXSAhPSAocGF0dGVybl9zaXplLndpZHRoICsgcGF0dGVybl9zaXplLmhlaWdodCkqMiAtIDggKQorICAgICAgICBFWElUOworCisgICAgY3VyID0gZmlyc3Q7CisgICAgcmlnaHQgPSBiZWxvdyA9IDA7CisgICAgb3V0X2Nvcm5lcnNbb3V0X2Nvcm5lcl9jb3VudCsrXSA9IGN1cjsKKworICAgIGZvciggayA9IDA7IGsgPCA0OyBrKysgKQorICAgIHsKKyAgICAgICAgYyA9IGN1ci0+bmVpZ2hib3JzW2tdOworICAgICAgICBpZiggYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhcmlnaHQgKQorICAgICAgICAgICAgICAgIHJpZ2h0ID0gYzsKKyAgICAgICAgICAgIGVsc2UgaWYoICFiZWxvdyApCisgICAgICAgICAgICAgICAgYmVsb3cgPSBjOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFyaWdodCB8fCAocmlnaHQtPmNvdW50ICE9IDIgJiYgcmlnaHQtPmNvdW50ICE9IDMpIHx8CisgICAgICAgICFiZWxvdyB8fCAoYmVsb3ctPmNvdW50ICE9IDIgJiYgYmVsb3ctPmNvdW50ICE9IDMpICkKKyAgICAgICAgRVhJVDsKKworICAgIGN1ci0+cm93ID0gMDsKKyAgICAvL2N2Q2lyY2xlKCBkZWJ1Z19pbWcsIGN2UG9pbnRGcm9tMzJmKGN1ci0+cHQpLCAzLCBjdlNjYWxhcigwLDI1NSwwKSwgLTEsIDgsIDAgKTsKKworICAgIGZpcnN0ID0gYmVsb3c7IC8vIHJlbWVtYmVyIHRoZSBmaXJzdCBjb3JuZXIgaW4gdGhlIG5leHQgcm93CisgICAgLy8gZmluZCBhbmQgc3RvcmUgdGhlIGZpcnN0IHJvdyAob3IgY29sdW1uKQorICAgIGZvcihqPTE7O2orKykKKyAgICB7CisgICAgICAgIHJpZ2h0LT5yb3cgPSAwOworICAgICAgICBvdXRfY29ybmVyc1tvdXRfY29ybmVyX2NvdW50KytdID0gcmlnaHQ7CisgICAgICAgIC8vY3ZDaXJjbGUoIGRlYnVnX2ltZywgY3ZQb2ludEZyb20zMmYocmlnaHQtPnB0KSwgMywgY3ZTY2FsYXIoMCwyNTUtaioxMCwwKSwgLTEsIDgsIDAgKTsKKyAgICAgICAgaWYoIHJpZ2h0LT5jb3VudCA9PSAyICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiggcmlnaHQtPmNvdW50ICE9IDMgfHwgb3V0X2Nvcm5lcl9jb3VudCA+PSBNQVgocGF0dGVybl9zaXplLndpZHRoLHBhdHRlcm5fc2l6ZS5oZWlnaHQpICkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGN1ciA9IHJpZ2h0OworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgNDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgYyA9IGN1ci0+bmVpZ2hib3JzW2tdOworICAgICAgICAgICAgaWYoIGMgJiYgYy0+cm93ID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrayA9IDA7IGtrIDwgNDsga2srKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggYy0+bmVpZ2hib3JzW2trXSA9PSBiZWxvdyApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGtrIDwgNCApCisgICAgICAgICAgICAgICAgICAgIGJlbG93ID0gYzsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHdpZHRoID0gb3V0X2Nvcm5lcl9jb3VudDsKKyAgICBpZiggd2lkdGggPT0gcGF0dGVybl9zaXplLndpZHRoICkKKyAgICAgICAgaGVpZ2h0ID0gcGF0dGVybl9zaXplLmhlaWdodDsKKyAgICBlbHNlIGlmKCB3aWR0aCA9PSBwYXR0ZXJuX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgaGVpZ2h0ID0gcGF0dGVybl9zaXplLndpZHRoOworICAgIGVsc2UKKyAgICAgICAgRVhJVDsKKworICAgIC8vIGZpbmQgYW5kIHN0b3JlIGFsbCB0aGUgb3RoZXIgcm93cworICAgIGZvciggaSA9IDE7IDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAhZmlyc3QgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN1ciA9IGZpcnN0OworICAgICAgICBmaXJzdCA9IDA7CisgICAgICAgIGZvciggaiA9IDA7OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdXItPnJvdyA9IGk7CisgICAgICAgICAgICBvdXRfY29ybmVyc1tvdXRfY29ybmVyX2NvdW50KytdID0gY3VyOworICAgICAgICAgICAgLy9jdkNpcmNsZSggZGVidWdfaW1nLCBjdlBvaW50RnJvbTMyZihjdXItPnB0KSwgMywgY3ZTY2FsYXIoMCwwLDI1NS1qKjEwKSwgLTEsIDgsIDAgKTsKKyAgICAgICAgICAgIGlmKCBjdXItPmNvdW50ID09IDIgKyAoaSA8IGhlaWdodC0xKSAmJiBqID4gMCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIHJpZ2h0ID0gMDsKKworICAgICAgICAgICAgLy8gZmluZCBhIG5laWdoYm9yIHRoYXQgaGFzIG5vdCBiZWVuIHByb2Nlc3NlZCB5ZXQKKyAgICAgICAgICAgIC8vIGFuZCB0aGF0IGhhcyBhIG5laWdoYm9yIGZyb20gdGhlIHByZXZpb3VzIHJvdworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDQ7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IGN1ci0+bmVpZ2hib3JzW2tdOworICAgICAgICAgICAgICAgIGlmKCBjICYmIGMtPnJvdyA+IGkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrayA9IDA7IGtrIDwgNDsga2srKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjLT5uZWlnaGJvcnNba2tdICYmIGMtPm5laWdoYm9yc1tra10tPnJvdyA9PSBpLTEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBrayA8IDQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaiA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGogPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFyaWdodCApCisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIGN1ciA9IHJpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYoIGogIT0gd2lkdGggLSAxICkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIG91dF9jb3JuZXJfY291bnQgIT0gY29ybmVyX2NvdW50ICkKKyAgICAgICAgRVhJVDsKKworICAgIC8vIGNoZWNrIGlmIHdlIG5lZWQgdG8gdHJhbnNwb3NlIHRoZSBib2FyZAorICAgIGlmKCB3aWR0aCAhPSBwYXR0ZXJuX3NpemUud2lkdGggKQorICAgIHsKKyAgICAgICAgQ1ZfU1dBUCggd2lkdGgsIGhlaWdodCwgayApOworCisgICAgICAgIG1lbWNweSggY29ybmVycywgb3V0X2Nvcm5lcnMsIGNvcm5lcl9jb3VudCpzaXplb2YoY29ybmVyc1swXSkgKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhlaWdodDsgaSsrICkKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB3aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICBvdXRfY29ybmVyc1tpKndpZHRoICsgal0gPSBjb3JuZXJzW2oqaGVpZ2h0ICsgaV07CisgICAgfQorCisgICAgLy8gY2hlY2sgaWYgd2UgbmVlZCB0byByZXZlcnQgdGhlIG9yZGVyIGluIGVhY2ggcm93CisgICAgeworICAgICAgICBDdlBvaW50MkQzMmYgcDAgPSBvdXRfY29ybmVyc1swXS0+cHQsIHAxID0gb3V0X2Nvcm5lcnNbcGF0dGVybl9zaXplLndpZHRoLTFdLT5wdCwKKyAgICAgICAgICAgICAgICAgICAgIHAyID0gb3V0X2Nvcm5lcnNbcGF0dGVybl9zaXplLndpZHRoXS0+cHQ7CisgICAgICAgIGlmKCAocDEueCAtIHAwLngpKihwMi55IC0gcDEueSkgLSAocDEueSAtIHAwLnkpKihwMi54IC0gcDEueCkgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHdpZHRoICUgMiA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgd2lkdGgvMjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIG91dF9jb3JuZXJzW2kqd2lkdGgral0sIG91dF9jb3JuZXJzW2kqd2lkdGgrd2lkdGgtai0xXSwgYyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB3aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhlaWdodC8yOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUCggb3V0X2Nvcm5lcnNbaSp3aWR0aCtqXSwgb3V0X2Nvcm5lcnNbKGhlaWdodCAtIGkgLSAxKSp3aWR0aCtqXSwgYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gY29ybmVyX2NvdW50OworCisgICAgX19FTkRfXzsKKworICAgIGlmKCByZXN1bHQgPD0gMCAmJiBjb3JuZXJzICkKKyAgICB7CisgICAgICAgIGNvcm5lcl9jb3VudCA9IE1JTiggY29ybmVyX2NvdW50LCBwYXR0ZXJuX3NpemUud2lkdGgqcGF0dGVybl9zaXplLmhlaWdodCApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY29ybmVyX2NvdW50OyBpKysgKQorICAgICAgICAgICAgb3V0X2Nvcm5lcnNbaV0gPSBjb3JuZXJzW2ldOworICAgICAgICByZXN1bHQgPSAtY29ybmVyX2NvdW50OworCisgICAgICAgIGlmIChyZXN1bHQgPT0gLXBhdHRlcm5fc2l6ZS53aWR0aCpwYXR0ZXJuX3NpemUuaGVpZ2h0KQorICAgICAgICAgICAgcmVzdWx0ID0gLXJlc3VsdDsKKyAgICB9CisKKyAgICBjdkZyZWUoICZjb3JuZXJzICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3RhdGljIHZvaWQgaWN2RmluZFF1YWROZWlnaGJvcnMoIEN2Q0JRdWFkICpxdWFkcywgaW50IHF1YWRfY291bnQgKQoreworICAgIGNvbnN0IGZsb2F0IHRocmVzaF9zY2FsZSA9IDEuZjsKKyAgICBpbnQgaWR4LCBpLCBrLCBqOworICAgIGZsb2F0IGR4LCBkeSwgZGlzdDsKKworICAgIC8vIGZpbmQgcXVhZCBuZWlnaGJvcnMKKyAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IHF1YWRfY291bnQ7IGlkeCsrICkKKyAgICB7CisgICAgICAgIEN2Q0JRdWFkKiBjdXJfcXVhZCA9ICZxdWFkc1tpZHhdOworCisgICAgICAgIC8vIGNob29zZSB0aGUgcG9pbnRzIG9mIHRoZSBjdXJyZW50IHF1YWRyYW5nbGUgdGhhdCBhcmUgY2xvc2UgdG8KKyAgICAgICAgLy8gc29tZSBwb2ludHMgb2YgdGhlIG90aGVyIHF1YWRyYW5nbGVzCisgICAgICAgIC8vIChpdCBjYW4gaGFwcGVuIGZvciBzcGxpdCBjb3JuZXJzIChkdWUgdG8gZGlsYXRpb24pIG9mIHRoZQorICAgICAgICAvLyBjaGVja2VyIGJvYXJkKS4gU2VhcmNoIG9ubHkgaW4gb3RoZXIgcXVhZHJhbmdsZXMhCisKKyAgICAgICAgLy8gZm9yIGVhY2ggY29ybmVyIG9mIHRoaXMgcXVhZHJhbmdsZQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIHB0OworICAgICAgICAgICAgZmxvYXQgbWluX2Rpc3QgPSBGTFRfTUFYOworICAgICAgICAgICAgaW50IGNsb3Nlc3RfY29ybmVyX2lkeCA9IC0xOworICAgICAgICAgICAgQ3ZDQlF1YWQgKmNsb3Nlc3RfcXVhZCA9IDA7CisgICAgICAgICAgICBDdkNCQ29ybmVyICpjbG9zZXN0X2Nvcm5lciA9IDA7CisKKyAgICAgICAgICAgIGlmKCBjdXJfcXVhZC0+bmVpZ2hib3JzW2ldICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgcHQgPSBjdXJfcXVhZC0+Y29ybmVyc1tpXS0+cHQ7CisKKyAgICAgICAgICAgIC8vIGZpbmQgdGhlIGNsb3Nlc3QgY29ybmVyIGluIGFsbCBvdGhlciBxdWFkcmFuZ2xlcworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHF1YWRfY291bnQ7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGsgPT0gaWR4ICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBxdWFkc1trXS5uZWlnaGJvcnNbal0gKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgZHggPSBwdC54IC0gcXVhZHNba10uY29ybmVyc1tqXS0+cHQueDsKKyAgICAgICAgICAgICAgICAgICAgZHkgPSBwdC55IC0gcXVhZHNba10uY29ybmVyc1tqXS0+cHQueTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGR4ICogZHggKyBkeSAqIGR5OworCisgICAgICAgICAgICAgICAgICAgIGlmKCBkaXN0IDwgbWluX2Rpc3QgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPD0gY3VyX3F1YWQtPmVkZ2VfbGVuKnRocmVzaF9zY2FsZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCA8PSBxdWFkc1trXS5lZGdlX2xlbip0aHJlc2hfc2NhbGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBlZGdlIGxlbmd0aHMsIG1ha2Ugc3VyZSB0aGV5J3JlIGNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVkZ2VzIHRoYXQgYXJlIGRpZmZlcmVudCBieSBtb3JlIHRoYW4gMTo0IGFyZSByZWplY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZWRpZmYgPSBjdXJfcXVhZC0+ZWRnZV9sZW4gLSBxdWFkc1trXS5lZGdlX2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlZGlmZiA+IDMyKmN1cl9xdWFkLT5lZGdlX2xlbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVkaWZmID4gMzIqcXVhZHNba10uZWRnZV9sZW4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJJTlRGKCJJbmNvbXBhdGlibGUgZWRnZSBsZW5ndGhzXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb3Nlc3RfY29ybmVyX2lkeCA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0X3F1YWQgPSAmcXVhZHNba107CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHdlIGZvdW5kIGEgbWF0Y2hpbmcgY29ybmVyIHBvaW50PworICAgICAgICAgICAgaWYoIGNsb3Nlc3RfY29ybmVyX2lkeCA+PSAwICYmIG1pbl9kaXN0IDwgRkxUX01BWCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gSWYgYW5vdGhlciBwb2ludCBmcm9tIG91ciBjdXJyZW50IHF1YWQgaXMgY2xvc2VyIHRvIHRoZSBmb3VuZCBjb3JuZXIKKyAgICAgICAgICAgICAgICAvLyB0aGFuIHRoZSBjdXJyZW50IG9uZSwgdGhlbiB3ZSBkb24ndCBjb3VudCB0aGlzIG9uZSBhZnRlciBhbGwuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gc3VwcG9ydCBzbWFsbCBzcXVhcmVzIHdoZXJlIG90aGVyd2lzZSB0aGUgd3JvbmcKKyAgICAgICAgICAgICAgICAvLyBjb3JuZXIgd2lsbCBnZXQgbWF0Y2hlZCB0byBjbG9zZXN0X3F1YWQ7CisgICAgICAgICAgICAgICAgY2xvc2VzdF9jb3JuZXIgPSBjbG9zZXN0X3F1YWQtPmNvcm5lcnNbY2xvc2VzdF9jb3JuZXJfaWR4XTsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCA0OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGN1cl9xdWFkLT5uZWlnaGJvcnNbal0gPT0gY2xvc2VzdF9xdWFkICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGR4ID0gY2xvc2VzdF9jb3JuZXItPnB0LnggLSBjdXJfcXVhZC0+Y29ybmVyc1tqXS0+cHQueDsKKyAgICAgICAgICAgICAgICAgICAgZHkgPSBjbG9zZXN0X2Nvcm5lci0+cHQueSAtIGN1cl9xdWFkLT5jb3JuZXJzW2pdLT5wdC55OworCisgICAgICAgICAgICAgICAgICAgIGlmKCBkeCAqIGR4ICsgZHkgKiBkeSA8IG1pbl9kaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBqIDwgNCB8fCBjdXJfcXVhZC0+Y291bnQgPj0gNCB8fCBjbG9zZXN0X3F1YWQtPmNvdW50ID49IDQgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgZWFjaCBjb3JuZXIgaXMgYSBuZWlnaGJvciBvZiBkaWZmZXJlbnQgcXVhZHMKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY2xvc2VzdF9xdWFkLT5jb3VudDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjbG9zZXN0X3F1YWQtPm5laWdoYm9yc1tqXSA9PSBjdXJfcXVhZCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGogPCBjbG9zZXN0X3F1YWQtPmNvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSBjbG9zZXN0IGNvcm5lciB0byBjbG9zZXN0X2Nvcm5lcgorICAgICAgICAgICAgICAgIC8vIGlzIGRpZmZlcmVudCBmcm9tIGN1cl9xdWFkLT5jb3JuZXJzW2ldLT5wdAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBxdWFkX2NvdW50OyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDQlF1YWQqIHEgPSAmcXVhZHNba107CisgICAgICAgICAgICAgICAgICAgIGlmKCBrID09IGlkeCB8fCBxID09IGNsb3Nlc3RfcXVhZCApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcS0+bmVpZ2hib3JzW2pdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeCA9IGNsb3Nlc3RfY29ybmVyLT5wdC54IC0gcS0+Y29ybmVyc1tqXS0+cHQueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeSA9IGNsb3Nlc3RfY29ybmVyLT5wdC55IC0gcS0+Y29ybmVyc1tqXS0+cHQueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gZHgqZHggKyBkeSpkeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZGlzdCA8IG1pbl9kaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBqIDwgNCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggayA8IHF1YWRfY291bnQgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNsb3Nlc3RfY29ybmVyLT5wdC54ID0gKHB0LnggKyBjbG9zZXN0X2Nvcm5lci0+cHQueCkgKiAwLjVmOworICAgICAgICAgICAgICAgIGNsb3Nlc3RfY29ybmVyLT5wdC55ID0gKHB0LnkgKyBjbG9zZXN0X2Nvcm5lci0+cHQueSkgKiAwLjVmOworCisgICAgICAgICAgICAgICAgLy8gV2UndmUgZm91bmQgb25lIG1vcmUgY29ybmVyIC0gcmVtZW1iZXIgaXQKKyAgICAgICAgICAgICAgICBjdXJfcXVhZC0+Y291bnQrKzsKKyAgICAgICAgICAgICAgICBjdXJfcXVhZC0+bmVpZ2hib3JzW2ldID0gY2xvc2VzdF9xdWFkOworICAgICAgICAgICAgICAgIGN1cl9xdWFkLT5jb3JuZXJzW2ldID0gY2xvc2VzdF9jb3JuZXI7CisKKyAgICAgICAgICAgICAgICBjbG9zZXN0X3F1YWQtPmNvdW50Kys7CisgICAgICAgICAgICAgICAgY2xvc2VzdF9xdWFkLT5uZWlnaGJvcnNbY2xvc2VzdF9jb3JuZXJfaWR4XSA9IGN1cl9xdWFkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gcmV0dXJucyBjb3JuZXJzIGluIGNsb2Nrd2lzZSBvcmRlcgorLy8gY29ybmVycyBkb24ndCBuZWNlc3NhcmlseSBzdGFydCBhdCBzYW1lIHBvc2l0aW9uIG9uIHF1YWQgKGUuZy4sCisvLyAgIHRvcCBsZWZ0IGNvcm5lcikKKworc3RhdGljIGludAoraWN2R2VuZXJhdGVRdWFkcyggQ3ZDQlF1YWQgKipvdXRfcXVhZHMsIEN2Q0JDb3JuZXIgKipvdXRfY29ybmVycywKKyAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSwgQ3ZNYXQgKmltYWdlLCBpbnQgZmxhZ3MgKQoreworICAgIGludCBxdWFkX2NvdW50ID0gMDsKKyAgICBDdk1lbVN0b3JhZ2UgKnRlbXBfc3RvcmFnZSA9IDA7CisKKyAgICBpZiggb3V0X3F1YWRzICkKKyAgICAgICAgKm91dF9xdWFkcyA9IDA7CisKKyAgICBpZiggb3V0X2Nvcm5lcnMgKQorICAgICAgICAqb3V0X2Nvcm5lcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZHZW5lcmF0ZVF1YWRzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXEgKnNyY19jb250b3VyID0gMDsKKyAgICBDdlNlcSAqcm9vdDsKKyAgICBDdkNvbnRvdXJFeCogYm9hcmQgPSAwOworICAgIEN2Q29udG91clNjYW5uZXIgc2Nhbm5lcjsKKyAgICBpbnQgaSwgaWR4LCBtaW5fc2l6ZTsKKworICAgIENWX0FTU0VSVCggb3V0X2Nvcm5lcnMgJiYgb3V0X3F1YWRzICk7CisKKyAgICAvLyBlbXBpcmljIGJvdW5kIGZvciBtaW5pbWFsIGFsbG93ZWQgcGVyaW1ldGVyIGZvciBzcXVhcmVzCisgICAgbWluX3NpemUgPSBjdlJvdW5kKCBpbWFnZS0+Y29scyAqIGltYWdlLT5yb3dzICogLjAzICogMC4wMSAqIDAuOTIgKTsKKworICAgIC8vIGNyZWF0ZSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgY29udG91cnMgYW5kIHRoZSBzZXF1ZW5jZSBvZiBwb2ludGVycyB0byBmb3VuZCBxdWFkcmFuZ2xlcworICAgIENWX0NBTEwoIHRlbXBfc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBzdG9yYWdlICkpOworICAgIENWX0NBTEwoIHJvb3QgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2U2VxKiksIHRlbXBfc3RvcmFnZSApKTsKKworICAgIC8vIGluaXRpYWxpemUgY29udG91ciByZXRyaWV2aW5nIHJvdXRpbmUKKyAgICBDVl9DQUxMKCBzY2FubmVyID0gY3ZTdGFydEZpbmRDb250b3VycyggaW1hZ2UsIHRlbXBfc3RvcmFnZSwgc2l6ZW9mKEN2Q29udG91ckV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUkVUUl9DQ09NUCwgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSApKTsKKworICAgIC8vIGdldCBhbGwgdGhlIGNvbnRvdXJzIG9uZSBieSBvbmUKKyAgICB3aGlsZSggKHNyY19jb250b3VyID0gY3ZGaW5kTmV4dENvbnRvdXIoIHNjYW5uZXIgKSkgIT0gMCApCisgICAgeworICAgICAgICBDdlNlcSAqZHN0X2NvbnRvdXIgPSAwOworICAgICAgICBDdlJlY3QgcmVjdCA9ICgoQ3ZDb250b3VyKilzcmNfY29udG91ciktPnJlY3Q7CisKKyAgICAgICAgLy8gcmVqZWN0IGNvbnRvdXJzIHdpdGggdG9vIHNtYWxsIHBlcmltZXRlcgorICAgICAgICBpZiggQ1ZfSVNfU0VRX0hPTEUoc3JjX2NvbnRvdXIpICYmIHJlY3Qud2lkdGgqcmVjdC5oZWlnaHQgPj0gbWluX3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQgbWluX2FwcHJveF9sZXZlbCA9IDIsIG1heF9hcHByb3hfbGV2ZWwgPSBNQVhfQ09OVE9VUl9BUFBST1g7CisgICAgICAgICAgICBpbnQgYXBwcm94X2xldmVsOworICAgICAgICAgICAgZm9yKCBhcHByb3hfbGV2ZWwgPSBtaW5fYXBwcm94X2xldmVsOyBhcHByb3hfbGV2ZWwgPD0gbWF4X2FwcHJveF9sZXZlbDsgYXBwcm94X2xldmVsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdF9jb250b3VyID0gY3ZBcHByb3hQb2x5KCBzcmNfY29udG91ciwgc2l6ZW9mKEN2Q29udG91ciksIHRlbXBfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUE9MWV9BUFBST1hfRFAsIChmbG9hdClhcHByb3hfbGV2ZWwgKTsKKyAgICAgICAgICAgICAgICAvLyB3ZSBjYWxsIHRoaXMgYWdhaW4gb24gaXRzIG93biBvdXRwdXQsIGJlY2F1c2Ugc29tZXRpbWVzCisgICAgICAgICAgICAgICAgLy8gY3ZBcHByb3hQb2x5KCkgZG9lcyBub3Qgc2ltcGxpZnkgYXMgbXVjaCBhcyBpdCBzaG91bGQuCisgICAgICAgICAgICAgICAgZHN0X2NvbnRvdXIgPSBjdkFwcHJveFBvbHkoIGRzdF9jb250b3VyLCBzaXplb2YoQ3ZDb250b3VyKSwgdGVtcF9zdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QT0xZX0FQUFJPWF9EUCwgKGZsb2F0KWFwcHJveF9sZXZlbCApOworCisgICAgICAgICAgICAgICAgaWYoIGRzdF9jb250b3VyLT50b3RhbCA9PSA0ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlamVjdCBub24tcXVhZHJhbmdsZXMKKyAgICAgICAgICAgIGlmKCBkc3RfY29udG91ci0+dG90YWwgPT0gNCAmJiBjdkNoZWNrQ29udG91ckNvbnZleGl0eShkc3RfY29udG91cikgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2UG9pbnQgcHRbNF07CisgICAgICAgICAgICAgICAgZG91YmxlIGQxLCBkMiwgcCA9IGN2Q29udG91clBlcmltZXRlcihkc3RfY29udG91cik7CisgICAgICAgICAgICAgICAgZG91YmxlIGFyZWEgPSBmYWJzKGN2Q29udG91ckFyZWEoZHN0X2NvbnRvdXIsIENWX1dIT0xFX1NFUSkpOworICAgICAgICAgICAgICAgIGRvdWJsZSBkeCwgZHk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgcHRbaV0gPSAqKEN2UG9pbnQqKWN2R2V0U2VxRWxlbShkc3RfY29udG91ciwgaSk7CisKKyAgICAgICAgICAgICAgICBkeCA9IHB0WzBdLnggLSBwdFsyXS54OworICAgICAgICAgICAgICAgIGR5ID0gcHRbMF0ueSAtIHB0WzJdLnk7CisgICAgICAgICAgICAgICAgZDEgPSBzcXJ0KGR4KmR4ICsgZHkqZHkpOworCisgICAgICAgICAgICAgICAgZHggPSBwdFsxXS54IC0gcHRbM10ueDsKKyAgICAgICAgICAgICAgICBkeSA9IHB0WzFdLnkgLSBwdFszXS55OworICAgICAgICAgICAgICAgIGQyID0gc3FydChkeCpkeCArIGR5KmR5KTsKKworICAgICAgICAgICAgICAgIC8vIHBoaWxpcGcuICBPbmx5IGFjY2VwdCB0aG9zZSBxdWFkcmFuZ2xlcyB3aGljaCBhcmUgbW9yZSBzcXVhcmUKKyAgICAgICAgICAgICAgICAvLyB0aGFuIHJlY3Rhbmd1bGFyIGFuZCB3aGljaCBhcmUgYmlnIGVub3VnaAorICAgICAgICAgICAgICAgIGRvdWJsZSBkMywgZDQ7CisgICAgICAgICAgICAgICAgZHggPSBwdFswXS54IC0gcHRbMV0ueDsKKyAgICAgICAgICAgICAgICBkeSA9IHB0WzBdLnkgLSBwdFsxXS55OworICAgICAgICAgICAgICAgIGQzID0gc3FydChkeCpkeCArIGR5KmR5KTsKKyAgICAgICAgICAgICAgICBkeCA9IHB0WzFdLnggLSBwdFsyXS54OworICAgICAgICAgICAgICAgIGR5ID0gcHRbMV0ueSAtIHB0WzJdLnk7CisgICAgICAgICAgICAgICAgZDQgPSBzcXJ0KGR4KmR4ICsgZHkqZHkpOworICAgICAgICAgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfQ0FMSUJfQ0JfRklMVEVSX1FVQURTKSB8fAorICAgICAgICAgICAgICAgICAgICAoZDMqNCA+IGQ0ICYmIGQ0KjQgPiBkMyAmJiBkMypkNCA8IGFyZWEqMS41ICYmIGFyZWEgPiBtaW5fc2l6ZSAmJgorICAgICAgICAgICAgICAgICAgICBkMSA+PSAwLjE1ICogcCAmJiBkMiA+PSAwLjE1ICogcCkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb250b3VyRXgqIHBhcmVudCA9IChDdkNvbnRvdXJFeCopKHNyY19jb250b3VyLT52X3ByZXYpOworICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPmNvdW50ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFib2FyZCB8fCBib2FyZC0+Y291bnRlciA8IHBhcmVudC0+Y291bnRlciApCisgICAgICAgICAgICAgICAgICAgICAgICBib2FyZCA9IHBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgZHN0X2NvbnRvdXItPnZfcHJldiA9IChDdlNlcSopcGFyZW50OworICAgICAgICAgICAgICAgICAgICAvL2ZvciggaSA9IDA7IGkgPCA0OyBpKysgKSBjdkxpbmUoIGRlYnVnX2ltZywgcHRbaV0sIHB0WyhpKzEpJjNdLCBjdlNjYWxhcigyMDAsMjU1LDI1NSksIDEsIENWX0FBLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggcm9vdCwgJmRzdF9jb250b3VyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZmluaXNoIGNvbnRvdXIgcmV0cmlldmluZworICAgIGN2RW5kRmluZENvbnRvdXJzKCAmc2Nhbm5lciApOworCisgICAgLy8gYWxsb2NhdGUgcXVhZCAmIGNvcm5lciBidWZmZXJzCisgICAgQ1ZfQ0FMTCggKm91dF9xdWFkcyA9IChDdkNCUXVhZCopY3ZBbGxvYygocm9vdC0+dG90YWwrcm9vdC0+dG90YWwgLyAyKSAqIHNpemVvZigoKm91dF9xdWFkcylbMF0pKSk7CisgICAgQ1ZfQ0FMTCggKm91dF9jb3JuZXJzID0gKEN2Q0JDb3JuZXIqKWN2QWxsb2MoKHJvb3QtPnRvdGFsK3Jvb3QtPnRvdGFsIC8gMikgKiA0ICogc2l6ZW9mKCgqb3V0X2Nvcm5lcnMpWzBdKSkpOworCisgICAgLy8gQ3JlYXRlIGFycmF5IG9mIHF1YWRzIHN0cnVjdHVyZXMKKyAgICBmb3IoIGlkeCA9IDA7IGlkeCA8IHJvb3QtPnRvdGFsOyBpZHgrKyApCisgICAgeworICAgICAgICBDdkNCUXVhZCogcSA9ICYoKm91dF9xdWFkcylbcXVhZF9jb3VudF07CisgICAgICAgIHNyY19jb250b3VyID0gKihDdlNlcSoqKWN2R2V0U2VxRWxlbSggcm9vdCwgaWR4ICk7CisgICAgICAgIGlmKCAoZmxhZ3MgJiBDVl9DQUxJQl9DQl9GSUxURVJfUVVBRFMpICYmIHNyY19jb250b3VyLT52X3ByZXYgIT0gKEN2U2VxKilib2FyZCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyByZXNldCBncm91cCBJRAorICAgICAgICBtZW1zZXQoIHEsIDAsIHNpemVvZigqcSkgKTsKKyAgICAgICAgcS0+Z3JvdXBfaWR4ID0gLTE7CisgICAgICAgIGFzc2VydCggc3JjX2NvbnRvdXItPnRvdGFsID09IDQgKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdCA9IGN2UG9pbnRUbzMyZigqKEN2UG9pbnQqKWN2R2V0U2VxRWxlbShzcmNfY29udG91ciwgaSkpOworICAgICAgICAgICAgQ3ZDQkNvcm5lciogY29ybmVyID0gJigqb3V0X2Nvcm5lcnMpW3F1YWRfY291bnQqNCArIGldOworCisgICAgICAgICAgICBtZW1zZXQoIGNvcm5lciwgMCwgc2l6ZW9mKCpjb3JuZXIpICk7CisgICAgICAgICAgICBjb3JuZXItPnB0ID0gcHQ7CisgICAgICAgICAgICBxLT5jb3JuZXJzW2ldID0gY29ybmVyOworICAgICAgICB9CisgICAgICAgIHEtPmVkZ2VfbGVuID0gRkxUX01BWDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGR4ID0gcS0+Y29ybmVyc1tpXS0+cHQueCAtIHEtPmNvcm5lcnNbKGkrMSkmM10tPnB0Lng7CisgICAgICAgICAgICBmbG9hdCBkeSA9IHEtPmNvcm5lcnNbaV0tPnB0LnkgLSBxLT5jb3JuZXJzWyhpKzEpJjNdLT5wdC55OworICAgICAgICAgICAgZmxvYXQgZCA9IGR4KmR4ICsgZHkqZHk7CisgICAgICAgICAgICBpZiggcS0+ZWRnZV9sZW4gPiBkICkKKyAgICAgICAgICAgICAgICBxLT5lZGdlX2xlbiA9IGQ7CisgICAgICAgIH0KKyAgICAgICAgcXVhZF9jb3VudCsrOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgIHsKKyAgICAgICAgaWYoIG91dF9xdWFkcyApCisgICAgICAgICAgICBjdkZyZWUoIG91dF9xdWFkcyApOworICAgICAgICBpZiggb3V0X2Nvcm5lcnMgKQorICAgICAgICAgICAgY3ZGcmVlKCBvdXRfY29ybmVycyApOworICAgICAgICBxdWFkX2NvdW50ID0gMDsKKyAgICB9CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisgICAgcmV0dXJuIHF1YWRfY291bnQ7Cit9CisKKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3N0YXRpYyBpbnQgaXNfZXF1YWxfcXVhZCggY29uc3Qgdm9pZCogX2EsIGNvbnN0IHZvaWQqIF9iLCB2b2lkKiApCit7CisgICAgQ3ZSZWN0IGEgPSAoKigoQ3ZDb250b3VyKiopX2EpKS0+cmVjdDsKKyAgICBDdlJlY3QgYiA9ICgqKChDdkNvbnRvdXIqKilfYikpLT5yZWN0OworCisgICAgaW50IGR4ID0gIE1JTiggYi54ICsgYi53aWR0aCAtIDEsIGEueCArIGEud2lkdGggLSAxKSAtIE1BWCggYi54LCBhLngpOworICAgIGludCBkeSA9ICBNSU4oIGIueSArIGIuaGVpZ2h0IC0gMSwgYS55ICsgYS5oZWlnaHQgLSAxKSAtIE1BWCggYi55LCBhLnkpOworICAgIGludCB3ID0gKGEud2lkdGggKyBiLndpZHRoKT4+MTsKKyAgICBpbnQgaCA9IChhLmhlaWdodCArIGIuaGVpZ2h0KT4+MTsKKworICAgIGlmKCBkeCA+IHcqMC43NSAmJiBkeSA+IGgqMC43NSAmJiBkeCA8IHcqMS4yNSAmJiBkeSA8IGgqMS4yNSApIHJldHVybiAxOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2ljdkdlbmVyYXRlUXVhZHNFeCggQ3ZDQlF1YWQgKipvdXRfcXVhZHMsIEN2Q0JDb3JuZXIgKipvdXRfY29ybmVycywKKyAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSwgQ3ZNYXQgKmltYWdlLCBDdk1hdCAqdGhyZXNoX2ltZywgaW50IGRpbGF0aW9ucywgaW50IGZsYWdzICkKK3sKKyAgICBpbnQgbDsKKyAgICBpbnQgcXVhZF9jb3VudCA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlICp0ZW1wX3N0b3JhZ2UgPSAwOworCisgICAgaWYoIG91dF9xdWFkcyApCisgICAgICAqb3V0X3F1YWRzID0gMDsKKworICAgIGlmKCBvdXRfY29ybmVycyApCisgICAgICAqb3V0X2Nvcm5lcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZHZW5lcmF0ZVF1YWRzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXEgKnNyY19jb250b3VyID0gMDsKKyAgICBDdlNlcSAqcm9vdCwgKnJvb3RfdG1wOworICAgIEN2Q29udG91ckV4KiBib2FyZCA9IDA7CisgICAgQ3ZDb250b3VyU2Nhbm5lciBzY2FubmVyOworICAgIGludCBpLCBpZHgsIG1pbl9zaXplOworICAgIGludCBzdGVwX2xldmVsID0gMjU7CisKKyAgICBDVl9BU1NFUlQoIG91dF9jb3JuZXJzICYmIG91dF9xdWFkcyApOworCisgICAgLy8gZW1waXJpYyBib3VuZCBmb3IgbWluaW1hbCBhbGxvd2VkIHBlcmltZXRlciBmb3Igc3F1YXJlcworICAgIG1pbl9zaXplID0gY3ZSb3VuZCggaW1hZ2UtPmNvbHMgKiBpbWFnZS0+cm93cyAqIC4wMyAqIDAuMDEgKiAwLjkyICk7CisKKyAgICAvLyBjcmVhdGUgdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvbnRvdXJzIGFuZCB0aGUgc2VxdWVuY2Ugb2YgcG9pbnRlcnMgdG8gZm91bmQgcXVhZHJhbmdsZXMKKyAgICBDVl9DQUxMKCB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApKTsKKyAgICBDVl9DQUxMKCByb290X3RtcCA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZTZXEqKSwgdGVtcF9zdG9yYWdlICkpOworICAgIENWX0NBTEwoIHJvb3QgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2U2VxKiksIHRlbXBfc3RvcmFnZSApKTsKKworICAgIC8vcGVyZm9ybSBjb250b3VycyBzbGljaW5nCisgICAgY3ZFcXVhbGl6ZUhpc3QoaW1hZ2UsaW1hZ2UpOworICAgIGZvcihsID0gc3RlcF9sZXZlbDsgbCA8IDI1Ni1zdGVwX2xldmVsOyBsKz0gc3RlcF9sZXZlbCkKKyAgICB7CisgICAgICAgIGN2VGhyZXNob2xkKCBpbWFnZSwgdGhyZXNoX2ltZywgbCwgMjU1LCBDVl9USFJFU0hfQklOQVJZICk7CisgICAgICAgIGN2RGlsYXRlKCB0aHJlc2hfaW1nLCB0aHJlc2hfaW1nLCAwLCBkaWxhdGlvbnMgKTsKKworICAgICAgICAvL2RyYXcgZnJhbWUgdG8gZXh0cmFjdCBlZGdlIHF1YWRzCisgICAgICAgIGN2UmVjdGFuZ2xlKCB0aHJlc2hfaW1nLCBjdlBvaW50KDAsMCksIGN2UG9pbnQodGhyZXNoX2ltZy0+Y29scy0xLAorICAgICAgICAgICAgdGhyZXNoX2ltZy0+cm93cy0xKSwgQ1ZfUkdCKDI1NSwyNTUsMjU1KSwgMywgOCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBjb250b3VyIHJldHJpZXZpbmcgcm91dGluZQorICAgICAgICBDVl9DQUxMKCBzY2FubmVyID0gY3ZTdGFydEZpbmRDb250b3VycyggdGhyZXNoX2ltZywgdGVtcF9zdG9yYWdlLCBzaXplb2YoQ3ZDb250b3VyRXgpLAorICAgICAgICAgICAgQ1ZfUkVUUl9DQ09NUCwgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSApKTsKKworICAgICAgICAvLyBnZXQgYWxsIHRoZSBjb250b3VycyBvbmUgYnkgb25lCisgICAgICAgIHdoaWxlKCAoc3JjX2NvbnRvdXIgPSBjdkZpbmROZXh0Q29udG91ciggc2Nhbm5lciApKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTZXEgKmRzdF9jb250b3VyID0gMDsKKyAgICAgICAgICAgIEN2UmVjdCByZWN0ID0gKChDdkNvbnRvdXIqKXNyY19jb250b3VyKS0+cmVjdDsKKworICAgICAgICAgICAgLy8gcmVqZWN0IGNvbnRvdXJzIHdpdGggdG9vIHNtYWxsIHBlcmltZXRlcgorICAgICAgICAgICAgaWYoIENWX0lTX1NFUV9IT0xFKHNyY19jb250b3VyKSAmJiByZWN0LndpZHRoKnJlY3QuaGVpZ2h0ID49IG1pbl9zaXplICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgbWluX2FwcHJveF9sZXZlbCA9IDIsIG1heF9hcHByb3hfbGV2ZWwgPSBNQVhfQ09OVE9VUl9BUFBST1g7CisgICAgICAgICAgICAgICAgaW50IGFwcHJveF9sZXZlbDsKKyAgICAgICAgICAgICAgICBmb3IoIGFwcHJveF9sZXZlbCA9IG1pbl9hcHByb3hfbGV2ZWw7IGFwcHJveF9sZXZlbCA8PSBtYXhfYXBwcm94X2xldmVsOyBhcHByb3hfbGV2ZWwrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RfY29udG91ciA9IGN2QXBwcm94UG9seSggc3JjX2NvbnRvdXIsIHNpemVvZihDdkNvbnRvdXIpLCB0ZW1wX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9QT0xZX0FQUFJPWF9EUCwgKGZsb2F0KWFwcHJveF9sZXZlbCApOworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYWxsIHRoaXMgYWdhaW4gb24gaXRzIG93biBvdXRwdXQsIGJlY2F1c2Ugc29tZXRpbWVzCisgICAgICAgICAgICAgICAgICAgIC8vIGN2QXBwcm94UG9seSgpIGRvZXMgbm90IHNpbXBsaWZ5IGFzIG11Y2ggYXMgaXQgc2hvdWxkLgorICAgICAgICAgICAgICAgICAgICBkc3RfY29udG91ciA9IGN2QXBwcm94UG9seSggZHN0X2NvbnRvdXIsIHNpemVvZihDdkNvbnRvdXIpLCB0ZW1wX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9QT0xZX0FQUFJPWF9EUCwgKGZsb2F0KWFwcHJveF9sZXZlbCApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBkc3RfY29udG91ci0+dG90YWwgPT0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWplY3Qgbm9uLXF1YWRyYW5nbGVzCisgICAgICAgICAgICAgICAgaWYoIGRzdF9jb250b3VyLT50b3RhbCA9PSA0ICYmIGN2Q2hlY2tDb250b3VyQ29udmV4aXR5KGRzdF9jb250b3VyKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdlBvaW50IHB0WzRdOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZDEsIGQyLCBwID0gY3ZDb250b3VyUGVyaW1ldGVyKGRzdF9jb250b3VyKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFyZWEgPSBmYWJzKGN2Q29udG91ckFyZWEoZHN0X2NvbnRvdXIsIENWX1dIT0xFX1NFUSkpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHgsIGR5OworCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHRbaV0gPSAqKEN2UG9pbnQqKWN2R2V0U2VxRWxlbShkc3RfY29udG91ciwgaSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBib3JkZXIgY29uZGl0aW9uLiBpZiB0aGlzIGlzIGVkZ2Ugc3F1YXJlIHdlIHdpbGwgYWRkIHRoaXMgYXMgaXMKKyAgICAgICAgICAgICAgICAgICAgaW50IGVkZ2VfZmxhZyA9IDAsIGVwcyA9IDI7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHB0W2ldLnggPD0gZXBzIHx8IHB0W2ldLnkgPD0gZXBzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRbaV0ueCA+PSBpbWFnZS0+d2lkdGggLSBlcHMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdFtpXS55ID49IGltYWdlLT5oZWlnaHQgLSBlcHMgKSBlZGdlX2ZsYWcgPSAxOworCisgICAgICAgICAgICAgICAgICAgIGR4ID0gcHRbMF0ueCAtIHB0WzJdLng7CisgICAgICAgICAgICAgICAgICAgIGR5ID0gcHRbMF0ueSAtIHB0WzJdLnk7CisgICAgICAgICAgICAgICAgICAgIGQxID0gc3FydChkeCpkeCArIGR5KmR5KTsKKworICAgICAgICAgICAgICAgICAgICBkeCA9IHB0WzFdLnggLSBwdFszXS54OworICAgICAgICAgICAgICAgICAgICBkeSA9IHB0WzFdLnkgLSBwdFszXS55OworICAgICAgICAgICAgICAgICAgICBkMiA9IHNxcnQoZHgqZHggKyBkeSpkeSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcGhpbGlwZy4gIE9ubHkgYWNjZXB0IHRob3NlIHF1YWRyYW5nbGVzIHdoaWNoIGFyZSBtb3JlIHNxdWFyZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGFuIHJlY3Rhbmd1bGFyIGFuZCB3aGljaCBhcmUgYmlnIGVub3VnaAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgZDMsIGQ0OworICAgICAgICAgICAgICAgICAgICBkeCA9IHB0WzBdLnggLSBwdFsxXS54OworICAgICAgICAgICAgICAgICAgICBkeSA9IHB0WzBdLnkgLSBwdFsxXS55OworICAgICAgICAgICAgICAgICAgICBkMyA9IHNxcnQoZHgqZHggKyBkeSpkeSk7CisgICAgICAgICAgICAgICAgICAgIGR4ID0gcHRbMV0ueCAtIHB0WzJdLng7CisgICAgICAgICAgICAgICAgICAgIGR5ID0gcHRbMV0ueSAtIHB0WzJdLnk7CisgICAgICAgICAgICAgICAgICAgIGQ0ID0gc3FydChkeCpkeCArIGR5KmR5KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGVkZ2VfZmxhZyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKCEoZmxhZ3MgJiBDVl9DQUxJQl9DQl9GSUxURVJfUVVBRFMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZDMqNCA+IGQ0ICYmIGQ0KjQgPiBkMyAmJiBkMypkNCA8IGFyZWEqMS41ICYmIGFyZWEgPiBtaW5fc2l6ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZDEgPj0gMC4xNSAqIHAgJiYgZDIgPj0gMC4xNSAqIHApKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2Q29udG91ckV4KiBwYXJlbnQgPSAoQ3ZDb250b3VyRXgqKShzcmNfY29udG91ci0+dl9wcmV2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+Y291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFib2FyZCB8fCBib2FyZC0+Y291bnRlciA8IHBhcmVudC0+Y291bnRlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmQgPSBwYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY29udG91ci0+dl9wcmV2ID0gKEN2U2VxKilwYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2ZvciggaSA9IDA7IGkgPCA0OyBpKysgKSBjdkxpbmUoIGRlYnVnX2ltZywgcHRbaV0sIHB0WyhpKzEpJjNdLCBjdlNjYWxhcigyMDAsMjU1LDI1NSksIDEsIENWX0FBLCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHJvb3RfdG1wLCAmZHN0X2NvbnRvdXIgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBmaW5pc2ggY29udG91ciByZXRyaWV2aW5nCisgICAgICAgIGN2RW5kRmluZENvbnRvdXJzKCAmc2Nhbm5lciApOworICAgIH0KKworCisgICAgLy8gUGVyZm9ybSBjbHVzdGVyaW5nIG9mIGV4dHJhY3RlZCBxdWFkcworICAgIC8vIFNhbWUgcXVhZCBjYW4gYmUgZXh0cmFjdGVkIGZyb20gZGlmZmVyZW50IGJpbmFyaXphdGlvbiBsZXZlbHMKKyAgICBpZiggcm9vdF90bXAtPnRvdGFsICkKKyAgICB7CisgICAgICAgIEN2U2VxKiBpZHhfc2VxID0gMDsKKyAgICAgICAgaW50IG5fcXVhZHMgPSBjdlNlcVBhcnRpdGlvbiggcm9vdF90bXAsIHRlbXBfc3RvcmFnZSwgJmlkeF9zZXEsIGlzX2VxdWFsX3F1YWQsIDAgKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5fcXVhZHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZXh0cmFjdCBiaWdnZXN0IHF1YWQgaW4gZ3JvdXAKKyAgICAgICAgICAgIGludCBtYXhfc2l6ZSA9IDA7CisgICAgICAgICAgICBDdlNlcSogbWF4X3NlcSA9IDA7CisgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IHJvb3RfdG1wLT50b3RhbDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSAqKGludCopY3ZHZXRTZXFFbGVtKGlkeF9zZXEsIGopOworICAgICAgICAgICAgICAgIGlmKGluZGV4IT1pKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBDdkNvbnRvdXIqIGNudCA9ICooQ3ZDb250b3VyKiopY3ZHZXRTZXFFbGVtKHJvb3RfdG1wLCBqKTsKKyAgICAgICAgICAgICAgICBpZihjbnQtPnJlY3Qud2lkdGggPiBtYXhfc2l6ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heF9zaXplID0gY250LT5yZWN0LndpZHRoOworICAgICAgICAgICAgICAgICAgICBtYXhfc2VxID0gKEN2U2VxKiljbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3ZTZXFQdXNoKCByb290LCAmbWF4X3NlcSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhbGxvY2F0ZSBxdWFkICYgY29ybmVyIGJ1ZmZlcnMKKyAgICBDVl9DQUxMKCAqb3V0X3F1YWRzID0gKEN2Q0JRdWFkKiljdkFsbG9jKChyb290LT50b3RhbCtyb290LT50b3RhbCAvIDIpICogc2l6ZW9mKCgqb3V0X3F1YWRzKVswXSkpKTsKKyAgICBDVl9DQUxMKCAqb3V0X2Nvcm5lcnMgPSAoQ3ZDQkNvcm5lciopY3ZBbGxvYygocm9vdC0+dG90YWwrcm9vdC0+dG90YWwgLyAyKSAqIDQgKiBzaXplb2YoKCpvdXRfY29ybmVycylbMF0pKSk7CisKKyAgICAvLyBDcmVhdGUgYXJyYXkgb2YgcXVhZHMgc3RydWN0dXJlcworICAgIGZvciggaWR4ID0gMDsgaWR4IDwgcm9vdC0+dG90YWw7IGlkeCsrICkKKyAgICB7CisgICAgICAgIEN2Q0JRdWFkKiBxID0gJigqb3V0X3F1YWRzKVtxdWFkX2NvdW50XTsKKyAgICAgICAgc3JjX2NvbnRvdXIgPSAqKEN2U2VxKiopY3ZHZXRTZXFFbGVtKCByb290LCBpZHggKTsKKyAgICAgICAgaWYoIChmbGFncyAmIENWX0NBTElCX0NCX0ZJTFRFUl9RVUFEUykgJiYgc3JjX2NvbnRvdXItPnZfcHJldiAhPSAoQ3ZTZXEqKWJvYXJkICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIHJlc2V0IGdyb3VwIElECisgICAgICAgIG1lbXNldCggcSwgMCwgc2l6ZW9mKCpxKSApOworICAgICAgICBxLT5ncm91cF9pZHggPSAtMTsKKyAgICAgICAgYXNzZXJ0KCBzcmNfY29udG91ci0+dG90YWwgPT0gNCApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIHB0ID0gY3ZQb2ludFRvMzJmKCooQ3ZQb2ludCopY3ZHZXRTZXFFbGVtKHNyY19jb250b3VyLCBpKSk7CisgICAgICAgICAgICBDdkNCQ29ybmVyKiBjb3JuZXIgPSAmKCpvdXRfY29ybmVycylbcXVhZF9jb3VudCo0ICsgaV07CisKKyAgICAgICAgICAgIG1lbXNldCggY29ybmVyLCAwLCBzaXplb2YoKmNvcm5lcikgKTsKKyAgICAgICAgICAgIGNvcm5lci0+cHQgPSBwdDsKKyAgICAgICAgICAgIHEtPmNvcm5lcnNbaV0gPSBjb3JuZXI7CisgICAgICAgIH0KKyAgICAgICAgcS0+ZWRnZV9sZW4gPSBGTFRfTUFYOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZHggPSBxLT5jb3JuZXJzW2ldLT5wdC54IC0gcS0+Y29ybmVyc1soaSsxKSYzXS0+cHQueDsKKyAgICAgICAgICAgIGZsb2F0IGR5ID0gcS0+Y29ybmVyc1tpXS0+cHQueSAtIHEtPmNvcm5lcnNbKGkrMSkmM10tPnB0Lnk7CisgICAgICAgICAgICBmbG9hdCBkID0gZHgqZHggKyBkeSpkeTsKKyAgICAgICAgICAgIGlmKCBxLT5lZGdlX2xlbiA+IGQgKQorICAgICAgICAgICAgICAgIHEtPmVkZ2VfbGVuID0gZDsKKyAgICAgICAgfQorICAgICAgICBxdWFkX2NvdW50Kys7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBpZiggb3V0X3F1YWRzICkKKyAgICAgICAgICAgIGN2RnJlZSggb3V0X3F1YWRzICk7CisgICAgICAgIGlmKCBvdXRfY29ybmVycyApCisgICAgICAgICAgICBjdkZyZWUoIG91dF9jb3JuZXJzICk7CisgICAgICAgIHF1YWRfY291bnQgPSAwOworICAgIH0KKworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZ0ZW1wX3N0b3JhZ2UgKTsKKyAgICByZXR1cm4gcXVhZF9jb3VudDsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2RHJhd0NoZXNzYm9hcmRDb3JuZXJzKCBDdkFyciogX2ltYWdlLCBDdlNpemUgcGF0dGVybl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogY29ybmVycywgaW50IGNvdW50LCBpbnQgZm91bmQgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZEcmF3Q2hlc3Nib2FyZENvcm5lcnMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBpbnQgc2hpZnQgPSAwOworICAgIGNvbnN0IGludCByYWRpdXMgPSA0OworICAgIGNvbnN0IGludCByID0gcmFkaXVzKigxIDw8IHNoaWZ0KTsKKyAgICBpbnQgaTsKKyAgICBDdk1hdCBzdHViLCAqaW1hZ2U7CisgICAgZG91YmxlIHNjYWxlID0gMTsKKyAgICBpbnQgdHlwZSwgY24sIGxpbmVfdHlwZTsKKworICAgIENWX0NBTEwoIGltYWdlID0gY3ZHZXRNYXQoIF9pbWFnZSwgJnN0dWIgKSk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaW1hZ2UtPnR5cGUpOworICAgIGNuID0gQ1ZfTUFUX0NOKHR5cGUpOworICAgIGlmKCBjbiAhPSAxICYmIGNuICE9IDMgJiYgY24gIT0gNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIk51bWJlciBvZiBjaGFubmVscyBtdXN0IGJlIDEsIDMgb3IgNCIgKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKGltYWdlLT50eXBlKSApCisgICAgeworICAgIGNhc2UgQ1ZfOFU6CisgICAgICAgIHNjYWxlID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8xNlU6CisgICAgICAgIHNjYWxlID0gMjU2OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRjoKKyAgICAgICAgc2NhbGUgPSAxLi8yNTU7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJPbmx5IDgtYml0LCAxNi1iaXQgb3IgZmxvYXRpbmctcG9pbnQgMzItYml0IGltYWdlcyBhcmUgc3VwcG9ydGVkIiApOworICAgIH0KKworICAgIGxpbmVfdHlwZSA9IHR5cGUgPT0gQ1ZfOFVDMSB8fCB0eXBlID09IENWXzhVQzMgPyBDVl9BQSA6IDg7CisKKyAgICBpZiggIWZvdW5kICkKKyAgICB7CisgICAgICAgIEN2U2NhbGFyIGNvbG9yID0ge3swLDAsMjU1fX07CisgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgICAgIGNvbG9yID0gY3ZTY2FsYXJBbGwoMjAwKTsKKyAgICAgICAgY29sb3IudmFsWzBdICo9IHNjYWxlOworICAgICAgICBjb2xvci52YWxbMV0gKj0gc2NhbGU7CisgICAgICAgIGNvbG9yLnZhbFsyXSAqPSBzY2FsZTsKKyAgICAgICAgY29sb3IudmFsWzNdICo9IHNjYWxlOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludCBwdDsKKyAgICAgICAgICAgIHB0LnggPSBjdlJvdW5kKGNvcm5lcnNbaV0ueCooMSA8PCBzaGlmdCkpOworICAgICAgICAgICAgcHQueSA9IGN2Um91bmQoY29ybmVyc1tpXS55KigxIDw8IHNoaWZ0KSk7CisgICAgICAgICAgICBjdkxpbmUoIGltYWdlLCBjdlBvaW50KCBwdC54IC0gciwgcHQueSAtIHIgKSwKKyAgICAgICAgICAgICAgICAgICAgY3ZQb2ludCggcHQueCArIHIsIHB0LnkgKyByICksIGNvbG9yLCAxLCBsaW5lX3R5cGUsIHNoaWZ0ICk7CisgICAgICAgICAgICBjdkxpbmUoIGltYWdlLCBjdlBvaW50KCBwdC54IC0gciwgcHQueSArIHIpLAorICAgICAgICAgICAgICAgICAgICBjdlBvaW50KCBwdC54ICsgciwgcHQueSAtIHIpLCBjb2xvciwgMSwgbGluZV90eXBlLCBzaGlmdCApOworICAgICAgICAgICAgY3ZDaXJjbGUoIGltYWdlLCBwdCwgcisoMTw8c2hpZnQpLCBjb2xvciwgMSwgbGluZV90eXBlLCBzaGlmdCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCB4LCB5OworICAgICAgICBDdlBvaW50IHByZXZfcHQgPSB7MCwgMH07CisgICAgICAgIGNvbnN0IGludCBsaW5lX21heCA9IDc7CisgICAgICAgIHN0YXRpYyBjb25zdCBDdlNjYWxhciBsaW5lX2NvbG9yc1tsaW5lX21heF0gPQorICAgICAgICB7CisgICAgICAgICAgICB7ezAsMCwyNTV9fSwKKyAgICAgICAgICAgIHt7MCwxMjgsMjU1fX0sCisgICAgICAgICAgICB7ezAsMjAwLDIwMH19LAorICAgICAgICAgICAge3swLDI1NSwwfX0sCisgICAgICAgICAgICB7ezIwMCwyMDAsMH19LAorICAgICAgICAgICAge3syNTUsMCwwfX0sCisgICAgICAgICAgICB7ezI1NSwwLDI1NX19CisgICAgICAgIH07CisKKyAgICAgICAgZm9yKCB5ID0gMCwgaSA9IDA7IHkgPCBwYXR0ZXJuX3NpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlNjYWxhciBjb2xvciA9IGxpbmVfY29sb3JzW3kgJSBsaW5lX21heF07CisgICAgICAgICAgICBpZiggY24gPT0gMSApCisgICAgICAgICAgICAgICAgY29sb3IgPSBjdlNjYWxhckFsbCgyMDApOworICAgICAgICAgICAgY29sb3IudmFsWzBdICo9IHNjYWxlOworICAgICAgICAgICAgY29sb3IudmFsWzFdICo9IHNjYWxlOworICAgICAgICAgICAgY29sb3IudmFsWzJdICo9IHNjYWxlOworICAgICAgICAgICAgY29sb3IudmFsWzNdICo9IHNjYWxlOworCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgcGF0dGVybl9zaXplLndpZHRoOyB4KyssIGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZQb2ludCBwdDsKKyAgICAgICAgICAgICAgICBwdC54ID0gY3ZSb3VuZChjb3JuZXJzW2ldLngqKDEgPDwgc2hpZnQpKTsKKyAgICAgICAgICAgICAgICBwdC55ID0gY3ZSb3VuZChjb3JuZXJzW2ldLnkqKDEgPDwgc2hpZnQpKTsKKworICAgICAgICAgICAgICAgIGlmKCBpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBjdkxpbmUoIGltYWdlLCBwcmV2X3B0LCBwdCwgY29sb3IsIDEsIGxpbmVfdHlwZSwgc2hpZnQgKTsKKworICAgICAgICAgICAgICAgIGN2TGluZSggaW1hZ2UsIGN2UG9pbnQocHQueCAtIHIsIHB0LnkgLSByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2UG9pbnQocHQueCArIHIsIHB0LnkgKyByKSwgY29sb3IsIDEsIGxpbmVfdHlwZSwgc2hpZnQgKTsKKyAgICAgICAgICAgICAgICBjdkxpbmUoIGltYWdlLCBjdlBvaW50KHB0LnggLSByLCBwdC55ICsgciksCisgICAgICAgICAgICAgICAgICAgICAgICBjdlBvaW50KHB0LnggKyByLCBwdC55IC0gciksIGNvbG9yLCAxLCBsaW5lX3R5cGUsIHNoaWZ0ICk7CisgICAgICAgICAgICAgICAgY3ZDaXJjbGUoIGltYWdlLCBwdCwgcisoMTw8c2hpZnQpLCBjb2xvciwgMSwgbGluZV90eXBlLCBzaGlmdCApOworICAgICAgICAgICAgICAgIHByZXZfcHQgPSBwdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZjYWxpYnJhdGlvbi5jcHAgYi9jdi9zcmMvY3ZjYWxpYnJhdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyYmEzMgotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmNhbGlicmF0aW9uLmNwcApAQCAtMCwwICsxLDI2ODMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qCisgICAgVGhpcyBpcyBzdHJpZ2h0LWZvcndhcmQgcG9ydCB2MyBvZiBNYXRsYWIgY2FsaWJyYXRpb24gZW5naW5lIGJ5IEplYW4tWXZlcyBCb3VndWV0CisgICAgdGhhdCBpcyAoaW4gYSBsYXJnZSBleHRlbnQpIGJhc2VkIG9uIHRoZSBwYXBlcjoKKyAgICBaLiBaaGFuZy4gIkEgZmxleGlibGUgbmV3IHRlY2huaXF1ZSBmb3IgY2FtZXJhIGNhbGlicmF0aW9uIi4KKyAgICBJRUVFIFRyYW5zYWN0aW9ucyBvbiBQYXR0ZXJuIEFuYWx5c2lzIGFuZCBNYWNoaW5lIEludGVsbGlnZW5jZSwgMjIoMTEpOjEzMzAtMTMzNCwgMjAwMC4KKworICAgIFRoZSAxc3QgaW5pdGlhbCBwb3J0IHdhcyBkb25lIGJ5IFZhbGVyeSBNb3N5YWdpbi4KKyovCisKK0N2TGV2TWFycTo6Q3ZMZXZNYXJxKCkKK3sKKyAgICBtYXNrID0gcHJldlBhcmFtID0gcGFyYW0gPSBKID0gZXJyID0gSnRKID0gSnRKTiA9IEp0RXJyID0gSnRKViA9IEp0SlcgPSAwOworICAgIGxhbWJkYUxnMTAgPSAwOyBzdGF0ZSA9IERPTkU7CisgICAgY3JpdGVyaWEgPSBjdlRlcm1Dcml0ZXJpYSgwLDAsMCk7CisgICAgaXRlcnMgPSAwOworICAgIGNvbXBsZXRlU3ltbUZsYWcgPSBmYWxzZTsKK30KKworQ3ZMZXZNYXJxOjpDdkxldk1hcnEoIGludCBucGFyYW1zLCBpbnQgbmVycnMsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhMCwgYm9vbCBfY29tcGxldGVTeW1tRmxhZyApCit7CisgICAgbWFzayA9IHByZXZQYXJhbSA9IHBhcmFtID0gSiA9IGVyciA9IEp0SiA9IEp0Sk4gPSBKdEVyciA9IEp0SlYgPSBKdEpXID0gMDsKKyAgICBpbml0KG5wYXJhbXMsIG5lcnJzLCBjcml0ZXJpYTAsIF9jb21wbGV0ZVN5bW1GbGFnKTsKK30KKwordm9pZCBDdkxldk1hcnE6OmNsZWFyKCkKK3sKKyAgICBjdlJlbGVhc2VNYXQoJm1hc2spOworICAgIGN2UmVsZWFzZU1hdCgmcHJldlBhcmFtKTsKKyAgICBjdlJlbGVhc2VNYXQoJnBhcmFtKTsKKyAgICBjdlJlbGVhc2VNYXQoJkopOworICAgIGN2UmVsZWFzZU1hdCgmZXJyKTsKKyAgICBjdlJlbGVhc2VNYXQoJkp0Sik7CisgICAgY3ZSZWxlYXNlTWF0KCZKdEpOKTsKKyAgICBjdlJlbGVhc2VNYXQoJkp0RXJyKTsKKyAgICBjdlJlbGVhc2VNYXQoJkp0SlYpOworICAgIGN2UmVsZWFzZU1hdCgmSnRKVyk7Cit9CisKK0N2TGV2TWFycTo6fkN2TGV2TWFycSgpCit7CisgICAgY2xlYXIoKTsKK30KKwordm9pZCBDdkxldk1hcnE6OmluaXQoIGludCBucGFyYW1zLCBpbnQgbmVycnMsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhMCwgYm9vbCBfY29tcGxldGVTeW1tRmxhZyApCit7CisgICAgaWYoICFwYXJhbSB8fCBwYXJhbS0+cm93cyAhPSBucGFyYW1zIHx8IG5lcnJzICE9IChlcnIgPyBlcnItPnJvd3MgOiAwKSApCisgICAgICAgIGNsZWFyKCk7CisgICAgbWFzayA9IGN2Q3JlYXRlTWF0KCBucGFyYW1zLCAxLCBDVl84VSApOworICAgIGN2U2V0KG1hc2ssIGN2U2NhbGFyQWxsKDEpKTsKKyAgICBwcmV2UGFyYW0gPSBjdkNyZWF0ZU1hdCggbnBhcmFtcywgMSwgQ1ZfNjRGICk7CisgICAgcGFyYW0gPSBjdkNyZWF0ZU1hdCggbnBhcmFtcywgMSwgQ1ZfNjRGICk7CisgICAgSnRKID0gY3ZDcmVhdGVNYXQoIG5wYXJhbXMsIG5wYXJhbXMsIENWXzY0RiApOworICAgIEp0Sk4gPSBjdkNyZWF0ZU1hdCggbnBhcmFtcywgbnBhcmFtcywgQ1ZfNjRGICk7CisgICAgSnRKViA9IGN2Q3JlYXRlTWF0KCBucGFyYW1zLCBucGFyYW1zLCBDVl82NEYgKTsKKyAgICBKdEpXID0gY3ZDcmVhdGVNYXQoIG5wYXJhbXMsIDEsIENWXzY0RiApOworICAgIEp0RXJyID0gY3ZDcmVhdGVNYXQoIG5wYXJhbXMsIDEsIENWXzY0RiApOworICAgIGlmKCBuZXJycyA+IDAgKQorICAgIHsKKyAgICAgICAgSiA9IGN2Q3JlYXRlTWF0KCBuZXJycywgbnBhcmFtcywgQ1ZfNjRGICk7CisgICAgICAgIGVyciA9IGN2Q3JlYXRlTWF0KCBuZXJycywgMSwgQ1ZfNjRGICk7CisgICAgfQorICAgIHByZXZFcnJOb3JtID0gREJMX01BWDsKKyAgICBsYW1iZGFMZzEwID0gLTM7CisgICAgY3JpdGVyaWEgPSBjcml0ZXJpYTA7CisgICAgaWYoIGNyaXRlcmlhLnR5cGUgJiBDVl9URVJNQ1JJVF9JVEVSICkKKyAgICAgICAgY3JpdGVyaWEubWF4X2l0ZXIgPSBNSU4oTUFYKGNyaXRlcmlhLm1heF9pdGVyLDEpLDEwMDApOworICAgIGVsc2UKKyAgICAgICAgY3JpdGVyaWEubWF4X2l0ZXIgPSAzMDsKKyAgICBpZiggY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0VQUyApCisgICAgICAgIGNyaXRlcmlhLmVwc2lsb24gPSBNQVgoY3JpdGVyaWEuZXBzaWxvbiwgMCk7CisgICAgZWxzZQorICAgICAgICBjcml0ZXJpYS5lcHNpbG9uID0gREJMX0VQU0lMT047CisgICAgc3RhdGUgPSBTVEFSVEVEOworICAgIGl0ZXJzID0gMDsKKyAgICBjb21wbGV0ZVN5bW1GbGFnID0gX2NvbXBsZXRlU3ltbUZsYWc7Cit9CisKK2Jvb2wgQ3ZMZXZNYXJxOjp1cGRhdGUoIGNvbnN0IEN2TWF0KiYgX3BhcmFtLCBDdk1hdComIF9KLCBDdk1hdComIF9lcnIgKQoreworICAgIGRvdWJsZSBjaGFuZ2U7CisKKyAgICBhc3NlcnQoIGVyciAhPSAwICk7CisgICAgaWYoIHN0YXRlID09IERPTkUgKQorICAgIHsKKyAgICAgICAgX3BhcmFtID0gcGFyYW07CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiggc3RhdGUgPT0gU1RBUlRFRCApCisgICAgeworICAgICAgICBfcGFyYW0gPSBwYXJhbTsKKyAgICAgICAgY3ZaZXJvKCBKICk7CisgICAgICAgIGN2WmVybyggZXJyICk7CisgICAgICAgIF9KID0gSjsKKyAgICAgICAgX2VyciA9IGVycjsKKyAgICAgICAgc3RhdGUgPSBDQUxDX0o7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmKCBzdGF0ZSA9PSBDQUxDX0ogKQorICAgIHsKKyAgICAgICAgY3ZNdWxUcmFuc3Bvc2VkKCBKLCBKdEosIDEgKTsKKyAgICAgICAgY3ZHRU1NKCBKLCBlcnIsIDEsIDAsIDAsIEp0RXJyLCBDVl9HRU1NX0FfVCApOworICAgICAgICBjdkNvcHkoIHBhcmFtLCBwcmV2UGFyYW0gKTsKKyAgICAgICAgc3RlcCgpOworICAgICAgICBpZiggaXRlcnMgPT0gMCApCisgICAgICAgICAgICBwcmV2RXJyTm9ybSA9IGN2Tm9ybShlcnIsIDAsIENWX0wyKTsKKyAgICAgICAgX3BhcmFtID0gcGFyYW07CisgICAgICAgIGN2WmVybyggZXJyICk7CisgICAgICAgIF9lcnIgPSBlcnI7CisgICAgICAgIHN0YXRlID0gQ0hFQ0tfRVJSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhc3NlcnQoIHN0YXRlID09IENIRUNLX0VSUiApOworICAgIGVyck5vcm0gPSBjdk5vcm0oIGVyciwgMCwgQ1ZfTDIgKTsKKyAgICBpZiggZXJyTm9ybSA+IHByZXZFcnJOb3JtICkKKyAgICB7CisgICAgICAgIGxhbWJkYUxnMTArKzsKKyAgICAgICAgc3RlcCgpOworICAgICAgICBfcGFyYW0gPSBwYXJhbTsKKyAgICAgICAgY3ZaZXJvKCBlcnIgKTsKKyAgICAgICAgX2VyciA9IGVycjsKKyAgICAgICAgc3RhdGUgPSBDSEVDS19FUlI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGxhbWJkYUxnMTAgPSBNQVgobGFtYmRhTGcxMC0xLCAtMTYpOworICAgIGlmKCArK2l0ZXJzID49IGNyaXRlcmlhLm1heF9pdGVyIHx8CisgICAgICAgIChjaGFuZ2UgPSBjdk5vcm0ocGFyYW0sIHByZXZQYXJhbSwgQ1ZfUkVMQVRJVkVfTDIpKSA8IGNyaXRlcmlhLmVwc2lsb24gKQorICAgIHsKKyAgICAgICAgX3BhcmFtID0gcGFyYW07CisgICAgICAgIHN0YXRlID0gRE9ORTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJldkVyck5vcm0gPSBlcnJOb3JtOworICAgIF9wYXJhbSA9IHBhcmFtOworICAgIGN2WmVybyhKKTsKKyAgICBfSiA9IEo7CisgICAgc3RhdGUgPSBDQUxDX0o7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgQ3ZMZXZNYXJxOjp1cGRhdGVBbHQoIGNvbnN0IEN2TWF0KiYgX3BhcmFtLCBDdk1hdComIF9KdEosIEN2TWF0KiYgX0p0RXJyLCBkb3VibGUqJiBfZXJyTm9ybSApCit7CisgICAgZG91YmxlIGNoYW5nZTsKKworICAgIGFzc2VydCggZXJyID09IDAgKTsKKyAgICBpZiggc3RhdGUgPT0gRE9ORSApCisgICAgeworICAgICAgICBfcGFyYW0gPSBwYXJhbTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmKCBzdGF0ZSA9PSBTVEFSVEVEICkKKyAgICB7CisgICAgICAgIF9wYXJhbSA9IHBhcmFtOworICAgICAgICBjdlplcm8oIEp0SiApOworICAgICAgICBjdlplcm8oIEp0RXJyICk7CisgICAgICAgIGVyck5vcm0gPSAwOworICAgICAgICBfSnRKID0gSnRKOworICAgICAgICBfSnRFcnIgPSBKdEVycjsKKyAgICAgICAgX2Vyck5vcm0gPSAmZXJyTm9ybTsKKyAgICAgICAgc3RhdGUgPSBDQUxDX0o7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmKCBzdGF0ZSA9PSBDQUxDX0ogKQorICAgIHsKKyAgICAgICAgY3ZDb3B5KCBwYXJhbSwgcHJldlBhcmFtICk7CisgICAgICAgIHN0ZXAoKTsKKyAgICAgICAgX3BhcmFtID0gcGFyYW07CisgICAgICAgIHByZXZFcnJOb3JtID0gZXJyTm9ybTsKKyAgICAgICAgZXJyTm9ybSA9IDA7CisgICAgICAgIF9lcnJOb3JtID0gJmVyck5vcm07CisgICAgICAgIHN0YXRlID0gQ0hFQ0tfRVJSOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBhc3NlcnQoIHN0YXRlID09IENIRUNLX0VSUiApOworICAgIGlmKCBlcnJOb3JtID4gcHJldkVyck5vcm0gKQorICAgIHsKKyAgICAgICAgbGFtYmRhTGcxMCsrOworICAgICAgICBzdGVwKCk7CisgICAgICAgIF9wYXJhbSA9IHBhcmFtOworICAgICAgICBlcnJOb3JtID0gMDsKKyAgICAgICAgX2Vyck5vcm0gPSAmZXJyTm9ybTsKKyAgICAgICAgc3RhdGUgPSBDSEVDS19FUlI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGxhbWJkYUxnMTAgPSBNQVgobGFtYmRhTGcxMC0xLCAtMTYpOworICAgIGlmKCArK2l0ZXJzID49IGNyaXRlcmlhLm1heF9pdGVyIHx8CisgICAgICAgIChjaGFuZ2UgPSBjdk5vcm0ocGFyYW0sIHByZXZQYXJhbSwgQ1ZfUkVMQVRJVkVfTDIpKSA8IGNyaXRlcmlhLmVwc2lsb24gKQorICAgIHsKKyAgICAgICAgX3BhcmFtID0gcGFyYW07CisgICAgICAgIHN0YXRlID0gRE9ORTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByZXZFcnJOb3JtID0gZXJyTm9ybTsKKyAgICBjdlplcm8oIEp0SiApOworICAgIGN2WmVybyggSnRFcnIgKTsKKyAgICBfcGFyYW0gPSBwYXJhbTsKKyAgICBfSnRKID0gSnRKOworICAgIF9KdEVyciA9IEp0RXJyOworICAgIHN0YXRlID0gQ0FMQ19KOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEN2TGV2TWFycTo6c3RlcCgpCit7CisgICAgY29uc3QgZG91YmxlIExPRzEwID0gbG9nKDEwLik7CisgICAgZG91YmxlIGxhbWJkYSA9IGV4cChsYW1iZGFMZzEwKkxPRzEwKTsKKyAgICBpbnQgaSwgaiwgbnBhcmFtcyA9IHBhcmFtLT5yb3dzOworCisgICAgZm9yKCBpID0gMDsgaSA8IG5wYXJhbXM7IGkrKyApCisgICAgICAgIGlmKCBtYXNrLT5kYXRhLnB0cltpXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlICpyb3cgPSBKdEotPmRhdGEuZGIgKyBpKm5wYXJhbXMsICpjb2wgPSBKdEotPmRhdGEuZGIgKyBpOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG5wYXJhbXM7IGorKyApCisgICAgICAgICAgICAgICAgcm93W2pdID0gY29sW2oqbnBhcmFtc10gPSAwOworICAgICAgICAgICAgSnRFcnItPmRhdGEuZGJbaV0gPSAwOworICAgICAgICB9CisKKyAgICBpZiggIWVyciApCisgICAgICAgIGN2Q29tcGxldGVTeW1tKCBKdEosIGNvbXBsZXRlU3ltbUZsYWcgKTsKKyAgICBjdlNldElkZW50aXR5KCBKdEpOLCBjdlJlYWxTY2FsYXIobGFtYmRhKSApOworICAgIGN2QWRkKCBKdEosIEp0Sk4sIEp0Sk4gKTsKKyAgICBjdlNWRCggSnRKTiwgSnRKVywgMCwgSnRKViwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1VfVCArIENWX1NWRF9WX1QgKTsKKyAgICBjdlNWQmtTYiggSnRKVywgSnRKViwgSnRKViwgSnRFcnIsIHBhcmFtLCBDVl9TVkRfVV9UICsgQ1ZfU1ZEX1ZfVCApOworICAgIGZvciggaSA9IDA7IGkgPCBucGFyYW1zOyBpKysgKQorICAgICAgICBwYXJhbS0+ZGF0YS5kYltpXSA9IHByZXZQYXJhbS0+ZGF0YS5kYltpXSAtIChtYXNrLT5kYXRhLnB0cltpXSA/IHBhcmFtLT5kYXRhLmRiW2ldIDogMCk7Cit9CisKKy8vIHJlaW1wbGVtZW50YXRpb24gb2YgZEFCLm0KK0NWX0lNUEwgdm9pZAorY3ZDYWxjTWF0TXVsRGVyaXYoIGNvbnN0IEN2TWF0KiBBLCBjb25zdCBDdk1hdCogQiwgQ3ZNYXQqIGRBQmRBLCBDdk1hdCogZEFCZEIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjTWF0TXVsRGVyaXYiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiwgTSwgTiwgTDsKKyAgICBpbnQgYnN0ZXA7CisKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChBKSAmJiBDVl9JU19NQVQoQikgKTsKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9UWVBFU19FUShBLCBCKSAmJgorICAgICAgICAoQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgPT0gQ1ZfMzJGIHx8IENWX01BVF9UWVBFKEEtPnR5cGUpID09IENWXzY0RikgKTsKKyAgICBDVl9BU1NFUlQoIEEtPmNvbHMgPT0gQi0+cm93cyApOworCisgICAgTSA9IEEtPnJvd3M7CisgICAgTCA9IEEtPmNvbHM7CisgICAgTiA9IEItPmNvbHM7CisgICAgYnN0ZXAgPSBCLT5zdGVwL0NWX0VMRU1fU0laRShCLT50eXBlKTsKKworICAgIGlmKCBkQUJkQSApCisgICAgeworICAgICAgICBDVl9BU1NFUlQoIENWX0FSRV9UWVBFU19FUShBLCBkQUJkQSkgJiYKKyAgICAgICAgICAgIGRBQmRBLT5yb3dzID09IEEtPnJvd3MqQi0+Y29scyAmJiBkQUJkQS0+Y29scyA9PSBBLT5yb3dzKkEtPmNvbHMgKTsKKyAgICB9CisKKyAgICBpZiggZEFCZEIgKQorICAgIHsKKyAgICAgICAgQ1ZfQVNTRVJUKCBDVl9BUkVfVFlQRVNfRVEoQSwgZEFCZEIpICYmCisgICAgICAgICAgICBkQUJkQi0+cm93cyA9PSBBLT5yb3dzKkItPmNvbHMgJiYgZEFCZEItPmNvbHMgPT0gQi0+cm93cypCLT5jb2xzICk7CisgICAgfQorCisgICAgaWYoIENWX01BVF9UWVBFKEEtPnR5cGUpID09IENWXzMyRiApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTSpOOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTEgPSBpIC8gTiwgIGkyID0gaSAlIE47CisKKyAgICAgICAgICAgIGlmKCBkQUJkQSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQqIGRjZGEgPSAoZmxvYXQqKShkQUJkQS0+ZGF0YS5wdHIgKyBkQUJkQS0+c3RlcCppKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYiA9IChjb25zdCBmbG9hdCopQi0+ZGF0YS5wdHIgKyBpMjsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBNKkw7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRjZGFbal0gPSAwOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBMOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBkY2RhW2kxKkwgKyBqXSA9IGJbaipic3RlcF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkQUJkQiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQqIGRjZGIgPSAoZmxvYXQqKShkQUJkQi0+ZGF0YS5wdHIgKyBkQUJkQi0+c3RlcCppKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSA9IChjb25zdCBmbG9hdCopKEEtPmRhdGEucHRyICsgQS0+c3RlcCppMSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgTCpOOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBkY2RiW2pdID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgTDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZGNkYltqKk4gKyBpMl0gPSBhW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBNKk47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpMSA9IGkgLyBOLCAgaTIgPSBpICUgTjsKKworICAgICAgICAgICAgaWYoIGRBQmRBICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUqIGRjZGEgPSAoZG91YmxlKikoZEFCZEEtPmRhdGEucHRyICsgZEFCZEEtPnN0ZXAqaSk7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiID0gKGNvbnN0IGRvdWJsZSopQi0+ZGF0YS5wdHIgKyBpMjsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBNKkw7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRjZGFbal0gPSAwOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBMOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBkY2RhW2kxKkwgKyBqXSA9IGJbaipic3RlcF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkQUJkQiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiBkY2RiID0gKGRvdWJsZSopKGRBQmRCLT5kYXRhLnB0ciArIGRBQmRCLT5zdGVwKmkpOworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSA9IChjb25zdCBkb3VibGUqKShBLT5kYXRhLnB0ciArIEEtPnN0ZXAqaTEpOworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IEwqTjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZGNkYltqXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IEw7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRjZGJbaipOICsgaTJdID0gYVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8vIHJlaW1wbGVtZW50YXRpb24gb2YgY29tcG9zZV9tb3Rpb24ubQorQ1ZfSU1QTCB2b2lkCitjdkNvbXBvc2VSVCggY29uc3QgQ3ZNYXQqIF9ydmVjMSwgY29uc3QgQ3ZNYXQqIF90dmVjMSwKKyAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3J2ZWMyLCBjb25zdCBDdk1hdCogX3R2ZWMyLAorICAgICAgICAgICAgIEN2TWF0KiBfcnZlYzMsIEN2TWF0KiBfdHZlYzMsCisgICAgICAgICAgICAgQ3ZNYXQqIGRyM2RyMSwgQ3ZNYXQqIGRyM2R0MSwKKyAgICAgICAgICAgICBDdk1hdCogZHIzZHIyLCBDdk1hdCogZHIzZHQyLAorICAgICAgICAgICAgIEN2TWF0KiBkdDNkcjEsIEN2TWF0KiBkdDNkdDEsCisgICAgICAgICAgICAgQ3ZNYXQqIGR0M2RyMiwgQ3ZNYXQqIGR0M2R0MiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbXBvc2VSVCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBfcjFbM10sIF9yMlszXTsKKyAgICBkb3VibGUgX1IxWzldLCBfZDFbOSozXSwgX1IyWzldLCBfZDJbOSozXTsKKyAgICBDdk1hdCByMSA9IGN2TWF0KDMsMSxDVl82NEYsX3IxKSwgcjIgPSBjdk1hdCgzLDEsQ1ZfNjRGLF9yMik7CisgICAgQ3ZNYXQgUjEgPSBjdk1hdCgzLDMsQ1ZfNjRGLF9SMSksIFIyID0gY3ZNYXQoMywzLENWXzY0RixfUjIpOworICAgIEN2TWF0IGRSMWRyMSA9IGN2TWF0KDksMyxDVl82NEYsX2QxKSwgZFIyZHIyID0gY3ZNYXQoOSwzLENWXzY0RixfZDIpOworCisgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQoX3J2ZWMxKSAmJiBDVl9JU19NQVQoX3J2ZWMyKSApOworCisgICAgQ1ZfQVNTRVJUKCBDVl9NQVRfVFlQRShfcnZlYzEtPnR5cGUpID09IENWXzMyRiB8fAorICAgICAgICAgICAgICAgQ1ZfTUFUX1RZUEUoX3J2ZWMxLT50eXBlKSA9PSBDVl82NEYgKTsKKworICAgIENWX0FTU0VSVCggX3J2ZWMxLT5yb3dzID09IDMgJiYgX3J2ZWMxLT5jb2xzID09IDEgJiYgQ1ZfQVJFX1NJWkVTX0VRKF9ydmVjMSwgX3J2ZWMyKSApOworCisgICAgY3ZDb252ZXJ0KCBfcnZlYzEsICZyMSApOworICAgIGN2Q29udmVydCggX3J2ZWMyLCAmcjIgKTsKKworICAgIGN2Um9kcmlndWVzMiggJnIxLCAmUjEsICZkUjFkcjEgKTsKKyAgICBjdlJvZHJpZ3VlczIoICZyMiwgJlIyLCAmZFIyZHIyICk7CisKKyAgICBpZiggX3J2ZWMzIHx8IGRyM2RyMSB8fCBkcjNkcjEgKQorICAgIHsKKyAgICAgICAgZG91YmxlIF9yM1szXSwgX1IzWzldLCBfZFIzZFIxWzkqOV0sIF9kUjNkUjJbOSo5XSwgX2RyM2RSM1s5KjNdOworICAgICAgICBkb3VibGUgX1cxWzkqM10sIF9XMlszKjNdOworICAgICAgICBDdk1hdCByMyA9IGN2TWF0KDMsMSxDVl82NEYsX3IzKSwgUjMgPSBjdk1hdCgzLDMsQ1ZfNjRGLF9SMyk7CisgICAgICAgIEN2TWF0IGRSM2RSMSA9IGN2TWF0KDksOSxDVl82NEYsX2RSM2RSMSksIGRSM2RSMiA9IGN2TWF0KDksOSxDVl82NEYsX2RSM2RSMik7CisgICAgICAgIEN2TWF0IGRyM2RSMyA9IGN2TWF0KDMsOSxDVl82NEYsX2RyM2RSMyk7CisgICAgICAgIEN2TWF0IFcxID0gY3ZNYXQoMyw5LENWXzY0RixfVzEpLCBXMiA9IGN2TWF0KDMsMyxDVl82NEYsX1cyKTsKKworICAgICAgICBjdk1hdE11bCggJlIyLCAmUjEsICZSMyApOworICAgICAgICBjdkNhbGNNYXRNdWxEZXJpdiggJlIyLCAmUjEsICZkUjNkUjIsICZkUjNkUjEgKTsKKworICAgICAgICBjdlJvZHJpZ3VlczIoICZSMywgJnIzLCAmZHIzZFIzICk7CisKKyAgICAgICAgaWYoIF9ydmVjMyApCisgICAgICAgICAgICBjdkNvbnZlcnQoICZyMywgX3J2ZWMzICk7CisKKyAgICAgICAgaWYoIGRyM2RyMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2TWF0TXVsKCAmZHIzZFIzLCAmZFIzZFIxLCAmVzEgKTsKKyAgICAgICAgICAgIGN2TWF0TXVsKCAmVzEsICZkUjFkcjEsICZXMiApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCAmVzIsIGRyM2RyMSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGRyM2RyMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2TWF0TXVsKCAmZHIzZFIzLCAmZFIzZFIyLCAmVzEgKTsKKyAgICAgICAgICAgIGN2TWF0TXVsKCAmVzEsICZkUjJkcjIsICZXMiApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCAmVzIsIGRyM2RyMiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGRyM2R0MSApCisgICAgICAgIGN2WmVybyggZHIzZHQxICk7CisgICAgaWYoIGRyM2R0MiApCisgICAgICAgIGN2WmVybyggZHIzZHQyICk7CisKKyAgICBpZiggX3R2ZWMzIHx8IGR0M2RyMiB8fCBkdDNkdDEgKQorICAgIHsKKyAgICAgICAgZG91YmxlIF90MVszXSwgX3QyWzNdLCBfdDNbM10sIF9keGRSMlszKjldLCBfZHhkdDFbMyozXSwgX1czWzMqM107CisgICAgICAgIEN2TWF0IHQxID0gY3ZNYXQoMywxLENWXzY0RixfdDEpLCB0MiA9IGN2TWF0KDMsMSxDVl82NEYsX3QyKTsKKyAgICAgICAgQ3ZNYXQgdDMgPSBjdk1hdCgzLDEsQ1ZfNjRGLF90Myk7CisgICAgICAgIEN2TWF0IGR4ZFIyID0gY3ZNYXQoMywgOSwgQ1ZfNjRGLCBfZHhkUjIpOworICAgICAgICBDdk1hdCBkeGR0MSA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX2R4ZHQxKTsKKyAgICAgICAgQ3ZNYXQgVzMgPSBjdk1hdCgzLCAzLCBDVl82NEYsIF9XMyk7CisKKyAgICAgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQoX3R2ZWMxKSAmJiBDVl9JU19NQVQoX3R2ZWMyKSApOworICAgICAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUShfdHZlYzEsIF90dmVjMikgJiYgQ1ZfQVJFX1NJWkVTX0VRKF90dmVjMSwgX3J2ZWMxKSApOworCisgICAgICAgIGN2Q29udmVydCggX3R2ZWMxLCAmdDEgKTsKKyAgICAgICAgY3ZDb252ZXJ0KCBfdHZlYzIsICZ0MiApOworICAgICAgICBjdk1hdE11bEFkZCggJlIyLCAmdDEsICZ0MiwgJnQzICk7CisKKyAgICAgICAgaWYoIF90dmVjMyApCisgICAgICAgICAgICBjdkNvbnZlcnQoICZ0MywgX3R2ZWMzICk7CisKKyAgICAgICAgaWYoIGR0M2RyMiB8fCBkdDNkdDEgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkNhbGNNYXRNdWxEZXJpdiggJlIyLCAmdDEsICZkeGRSMiwgJmR4ZHQxICk7CisgICAgICAgICAgICBpZiggZHQzZHIyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdk1hdE11bCggJmR4ZFIyLCAmZFIyZHIyLCAmVzMgKTsKKyAgICAgICAgICAgICAgICBjdkNvbnZlcnQoICZXMywgZHQzZHIyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggZHQzZHQxICkKKyAgICAgICAgICAgICAgICBjdkNvbnZlcnQoICZkeGR0MSwgZHQzZHQxICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggZHQzZHQyICkKKyAgICAgICAgY3ZTZXRJZGVudGl0eSggZHQzZHQyICk7CisgICAgaWYoIGR0M2RyMSApCisgICAgICAgIGN2WmVybyggZHQzZHIxICk7CisKKyAgICBfX0VORF9fOworfQorCitDVl9JTVBMIGludAorY3ZSb2RyaWd1ZXMyKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogZHN0LCBDdk1hdCogamFjb2JpYW4gKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlJvZ3JpZ3VlczIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgZGVwdGgsIGVsZW1fc2l6ZTsKKyAgICBpbnQgaSwgazsKKyAgICBkb3VibGUgSlsyN107CisgICAgQ3ZNYXQgX0ogPSBjdk1hdCggMywgOSwgQ1ZfNjRGLCBKICk7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICAgICAgQ1ZfRVJST1IoICFzcmMgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW5wdXQgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgbWF0cml4IiApOworCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgICAgIENWX0VSUk9SKCAhZHN0ID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywKKyAgICAgICAgIlRoZSBmaXJzdCBvdXRwdXQgYXJndW1lbnQgaXMgbm90IGEgdmFsaWQgbWF0cml4IiApOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoc3JjLT50eXBlKTsKKyAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUoZGVwdGgpOworCisgICAgaWYoIGRlcHRoICE9IENWXzMyRiAmJiBkZXB0aCAhPSBDVl82NEYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgbWF0cmljZXMgbXVzdCBoYXZlIDMyZiBvciA2NGYgZGF0YSB0eXBlIiApOworCisgICAgaWYoICFDVl9BUkVfREVQVEhTX0VRKHNyYywgZHN0KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiQWxsIHRoZSBtYXRyaWNlcyBtdXN0IGhhdmUgdGhlIHNhbWUgZGF0YSB0eXBlIiApOworCisgICAgaWYoIGphY29iaWFuICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGphY29iaWFuKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSmFjb2JpYW4gaXMgbm90IGEgdmFsaWQgbWF0cml4IiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX0RFUFRIU19FUShzcmMsIGphY29iaWFuKSB8fCBDVl9NQVRfQ04oamFjb2JpYW4tPnR5cGUpICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJKYWNvYmlhbiBtdXN0IGhhdmUgMzJmQzEgb3IgNjRmQzEgZGF0YXR5cGUiICk7CisKKyAgICAgICAgaWYoIChqYWNvYmlhbi0+cm93cyAhPSA5IHx8IGphY29iaWFuLT5jb2xzICE9IDMpICYmCisgICAgICAgICAgICAoamFjb2JpYW4tPnJvd3MgIT0gMyB8fCBqYWNvYmlhbi0+Y29scyAhPSA5KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiSmFjb2JpYW4gbXVzdCBiZSAzeDkgb3IgOXgzIiApOworICAgIH0KKworICAgIGlmKCBzcmMtPmNvbHMgPT0gMSB8fCBzcmMtPnJvd3MgPT0gMSApCisgICAgeworICAgICAgICBkb3VibGUgcngsIHJ5LCByeiwgdGhldGE7CisgICAgICAgIGludCBzdGVwID0gc3JjLT5yb3dzID4gMSA/IHNyYy0+c3RlcCAvIGVsZW1fc2l6ZSA6IDE7CisKKyAgICAgICAgaWYoIHNyYy0+cm93cyArIHNyYy0+Y29scypDVl9NQVRfQ04oc3JjLT50eXBlKSAtIDEgIT0gMyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIklucHV0IG1hdHJpeCBtdXN0IGJlIDF4MywgM3gxIG9yIDN4MyIgKTsKKworICAgICAgICBpZiggZHN0LT5yb3dzICE9IDMgfHwgZHN0LT5jb2xzICE9IDMgfHwgQ1ZfTUFUX0NOKGRzdC0+dHlwZSkgIT0gMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIk91dHB1dCBtYXRyaXggbXVzdCBiZSAzeDMsIHNpbmdsZS1jaGFubmVsIGZsb2F0aW5nIHBvaW50IG1hdHJpeCIgKTsKKworICAgICAgICBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgeworICAgICAgICAgICAgcnggPSBzcmMtPmRhdGEuZmxbMF07CisgICAgICAgICAgICByeSA9IHNyYy0+ZGF0YS5mbFtzdGVwXTsKKyAgICAgICAgICAgIHJ6ID0gc3JjLT5kYXRhLmZsW3N0ZXAqMl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByeCA9IHNyYy0+ZGF0YS5kYlswXTsKKyAgICAgICAgICAgIHJ5ID0gc3JjLT5kYXRhLmRiW3N0ZXBdOworICAgICAgICAgICAgcnogPSBzcmMtPmRhdGEuZGJbc3RlcCoyXTsKKyAgICAgICAgfQorICAgICAgICB0aGV0YSA9IHNxcnQocngqcnggKyByeSpyeSArIHJ6KnJ6KTsKKworICAgICAgICBpZiggdGhldGEgPCBEQkxfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2U2V0SWRlbnRpdHkoIGRzdCApOworCisgICAgICAgICAgICBpZiggamFjb2JpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbXNldCggSiwgMCwgc2l6ZW9mKEopICk7CisgICAgICAgICAgICAgICAgSls1XSA9IEpbMTVdID0gSlsxOV0gPSAtMTsKKyAgICAgICAgICAgICAgICBKWzddID0gSlsxMV0gPSBKWzIxXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgSVtdID0geyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxIH07CisKKyAgICAgICAgICAgIGRvdWJsZSBjID0gY29zKHRoZXRhKTsKKyAgICAgICAgICAgIGRvdWJsZSBzID0gc2luKHRoZXRhKTsKKyAgICAgICAgICAgIGRvdWJsZSBjMSA9IDEuIC0gYzsKKyAgICAgICAgICAgIGRvdWJsZSBpdGhldGEgPSB0aGV0YSA/IDEuL3RoZXRhIDogMC47CisKKyAgICAgICAgICAgIHJ4ICo9IGl0aGV0YTsgcnkgKj0gaXRoZXRhOyByeiAqPSBpdGhldGE7CisKKyAgICAgICAgICAgIGRvdWJsZSBycnRbXSA9IHsgcngqcngsIHJ4KnJ5LCByeCpyeiwgcngqcnksIHJ5KnJ5LCByeSpyeiwgcngqcnosIHJ5KnJ6LCByeipyeiB9OworICAgICAgICAgICAgZG91YmxlIF9yX3hfW10gPSB7IDAsIC1yeiwgcnksIHJ6LCAwLCAtcngsIC1yeSwgcngsIDAgfTsKKyAgICAgICAgICAgIGRvdWJsZSBSWzldOworICAgICAgICAgICAgQ3ZNYXQgX1IgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBSICk7CisKKyAgICAgICAgICAgIC8vIFIgPSBjb3ModGhldGEpKkkgKyAoMSAtIGNvcyh0aGV0YSkpKnIqclQgKyBzaW4odGhldGEpKltyX3hdCisgICAgICAgICAgICAvLyB3aGVyZSBbcl94XSBpcyBbMCAtcnogcnk7IHJ6IDAgLXJ4OyAtcnkgcnggMF0KKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCA5OyBrKysgKQorICAgICAgICAgICAgICAgIFJba10gPSBjKklba10gKyBjMSpycnRba10gKyBzKl9yX3hfW2tdOworCisgICAgICAgICAgICBjdkNvbnZlcnQoICZfUiwgZHN0ICk7CisKKyAgICAgICAgICAgIGlmKCBqYWNvYmlhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRycnRbXSA9IHsgcngrcngsIHJ5LCByeiwgcnksIDAsIDAsIHJ6LCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIHJ4LCAwLCByeCwgcnkrcnksIHJ6LCAwLCByeiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCByeCwgMCwgMCwgcnksIHJ4LCByeSwgcnorcnogfTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZF9yX3hfW10gPSB7IDAsIDAsIDAsIDAsIDAsIC0xLCAwLCAxLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMSwgMCwgMCwgMCwgLTEsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAtMSwgMCwgMSwgMCwgMCwgMCwgMCwgMCB9OworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJpID0gaSA9PSAwID8gcnggOiBpID09IDEgPyByeSA6IHJ6OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYTAgPSAtcypyaSwgYTEgPSAocyAtIDIqYzEqaXRoZXRhKSpyaSwgYTIgPSBjMSppdGhldGE7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhMyA9IChjIC0gcyppdGhldGEpKnJpLCBhNCA9IHMqaXRoZXRhOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgOTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEpbaSo5K2tdID0gYTAqSVtrXSArIGExKnJydFtrXSArIGEyKmRycnRbaSo5K2tdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTMqX3JfeF9ba10gKyBhNCpkX3JfeF9baSo5K2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBzcmMtPmNvbHMgPT0gMyAmJiBzcmMtPnJvd3MgPT0gMyApCisgICAgeworICAgICAgICBkb3VibGUgUls5XSwgVVs5XSwgVls5XSwgV1szXSwgcngsIHJ5LCByejsKKyAgICAgICAgQ3ZNYXQgX1IgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBSICk7CisgICAgICAgIEN2TWF0IF9VID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgVSApOworICAgICAgICBDdk1hdCBfViA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIFYgKTsKKyAgICAgICAgQ3ZNYXQgX1cgPSBjdk1hdCggMywgMSwgQ1ZfNjRGLCBXICk7CisgICAgICAgIGRvdWJsZSB0aGV0YSwgcywgYzsKKyAgICAgICAgaW50IHN0ZXAgPSBkc3QtPnJvd3MgPiAxID8gZHN0LT5zdGVwIC8gZWxlbV9zaXplIDogMTsKKworICAgICAgICBpZiggKGRzdC0+cm93cyAhPSAxIHx8IGRzdC0+Y29scypDVl9NQVRfQ04oZHN0LT50eXBlKSAhPSAzKSAmJgorICAgICAgICAgICAgKGRzdC0+cm93cyAhPSAzIHx8IGRzdC0+Y29scyAhPSAxIHx8IENWX01BVF9DTihkc3QtPnR5cGUpICE9IDEpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJPdXRwdXQgbWF0cml4IG11c3QgYmUgMXgzIG9yIDN4MSIgKTsKKworICAgICAgICBjdkNvbnZlcnQoIHNyYywgJl9SICk7CisgICAgICAgIGlmKCAhY3ZDaGVja0FyciggJl9SLCBDVl9DSEVDS19SQU5HRStDVl9DSEVDS19RVUlFVCwgLTEwMCwgMTAwICkgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlplcm8oZHN0KTsKKyAgICAgICAgICAgIGlmKCBqYWNvYmlhbiApCisgICAgICAgICAgICAgICAgY3ZaZXJvKGphY29iaWFuKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBjdlNWRCggJl9SLCAmX1csICZfVSwgJl9WLCBDVl9TVkRfTU9ESUZZX0EgKyBDVl9TVkRfVV9UICsgQ1ZfU1ZEX1ZfVCApOworICAgICAgICBjdkdFTU0oICZfVSwgJl9WLCAxLCAwLCAwLCAmX1IsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgcnggPSBSWzddIC0gUls1XTsKKyAgICAgICAgcnkgPSBSWzJdIC0gUls2XTsKKyAgICAgICAgcnogPSBSWzNdIC0gUlsxXTsKKworICAgICAgICBzID0gc3FydCgocngqcnggKyByeSpyeSArIHJ6KnJ6KSowLjI1KTsKKyAgICAgICAgYyA9IChSWzBdICsgUls0XSArIFJbOF0gLSAxKSowLjU7CisgICAgICAgIGMgPSBjID4gMS4gPyAxLiA6IGMgPCAtMS4gPyAtMS4gOiBjOworICAgICAgICB0aGV0YSA9IGFjb3MoYyk7CisKKyAgICAgICAgaWYoIHMgPCAxZS01ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQ7CisKKyAgICAgICAgICAgIGlmKCBjID4gMCApCisgICAgICAgICAgICAgICAgcnggPSByeSA9IHJ6ID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gKFJbMF0gKyAxKSowLjU7CisgICAgICAgICAgICAgICAgcnggPSB0aGV0YSpzcXJ0KE1BWCh0LDAuKSk7CisgICAgICAgICAgICAgICAgdCA9IChSWzRdICsgMSkqMC41OworICAgICAgICAgICAgICAgIHJ5ID0gdGhldGEqc3FydChNQVgodCwwLikpKihSWzFdIDwgMCA/IC0xLiA6IDEuKTsKKyAgICAgICAgICAgICAgICB0ID0gKFJbOF0gKyAxKSowLjU7CisgICAgICAgICAgICAgICAgcnogPSB0aGV0YSpzcXJ0KE1BWCh0LDAuKSkqKFJbMl0gPCAwID8gLTEuIDogMS4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggamFjb2JpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbXNldCggSiwgMCwgc2l6ZW9mKEopICk7CisgICAgICAgICAgICAgICAgaWYoIGMgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEpbNV0gPSBKWzE1XSA9IEpbMTldID0gLTAuNTsKKyAgICAgICAgICAgICAgICAgICAgSls3XSA9IEpbMTFdID0gSlsyMV0gPSAwLjU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZ0aCA9IDEvKDIqcyk7CisKKyAgICAgICAgICAgIGlmKCBqYWNvYmlhbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQsIGR0aGV0YV9kdHIgPSAtMS4vczsKKyAgICAgICAgICAgICAgICAvLyB2YXIxID0gW3Z0aDt0aGV0YV0KKyAgICAgICAgICAgICAgICAvLyB2YXIgPSBbb20xO3ZhcjFdID0gW29tMTt2dGg7dGhldGFdCisgICAgICAgICAgICAgICAgZG91YmxlIGR2dGhfZHRoZXRhID0gLXZ0aCpjL3M7CisgICAgICAgICAgICAgICAgZG91YmxlIGQxID0gMC41KmR2dGhfZHRoZXRhKmR0aGV0YV9kdHI7CisgICAgICAgICAgICAgICAgZG91YmxlIGQyID0gMC41KmR0aGV0YV9kdHI7CisgICAgICAgICAgICAgICAgLy8gZHZhcjEvZFIgPSBkdmFyMS9kdGhldGEqZHRoZXRhL2RSID0gW2R2dGgvZHRoZXRhOyAxXSAqIGR0aGV0YS9kdHIgKiBkdHIvZFIKKyAgICAgICAgICAgICAgICBkb3VibGUgZHZhcmRSWzUqOV0gPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMSwgMCwgLTEsIDAsCisgICAgICAgICAgICAgICAgICAgIDAsIDAsIC0xLCAwLCAwLCAwLCAxLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAtMSwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgZDEsIDAsIDAsIDAsIGQxLCAwLCAwLCAwLCBkMSwKKyAgICAgICAgICAgICAgICAgICAgZDIsIDAsIDAsIDAsIGQyLCAwLCAwLCAwLCBkMgorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgLy8gdmFyMiA9IFtvbTt0aGV0YV0KKyAgICAgICAgICAgICAgICBkb3VibGUgZHZhcjJkdmFyW10gPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdnRoLCAwLCAwLCByeCwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgdnRoLCAwLCByeSwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgdnRoLCByeiwgMCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgZG91YmxlIGRvbWVnYWR2YXIyW10gPQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdGhldGEsIDAsIDAsIHJ4KnZ0aCwKKyAgICAgICAgICAgICAgICAgICAgMCwgdGhldGEsIDAsIHJ5KnZ0aCwKKyAgICAgICAgICAgICAgICAgICAgMCwgMCwgdGhldGEsIHJ6KnZ0aAorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBDdk1hdCBfZHZhcmRSID0gY3ZNYXQoIDUsIDksIENWXzY0RkMxLCBkdmFyZFIgKTsKKyAgICAgICAgICAgICAgICBDdk1hdCBfZHZhcjJkdmFyID0gY3ZNYXQoIDQsIDUsIENWXzY0RkMxLCBkdmFyMmR2YXIgKTsKKyAgICAgICAgICAgICAgICBDdk1hdCBfZG9tZWdhZHZhcjIgPSBjdk1hdCggMywgNCwgQ1ZfNjRGQzEsIGRvbWVnYWR2YXIyICk7CisgICAgICAgICAgICAgICAgZG91YmxlIHQwWzMqNV07CisgICAgICAgICAgICAgICAgQ3ZNYXQgX3QwID0gY3ZNYXQoIDMsIDUsIENWXzY0RkMxLCB0MCApOworCisgICAgICAgICAgICAgICAgY3ZNYXRNdWwoICZfZG9tZWdhZHZhcjIsICZfZHZhcjJkdmFyLCAmX3QwICk7CisgICAgICAgICAgICAgICAgY3ZNYXRNdWwoICZfdDAsICZfZHZhcmRSLCAmX0ogKTsKKworICAgICAgICAgICAgICAgIC8vIHRyYW5zcG9zZSBldmVyeSByb3cgb2YgX0ogKHRyZWF0IHRoZSByb3dzIGFzIDN4MyBtYXRyaWNlcykKKyAgICAgICAgICAgICAgICBDVl9TV0FQKEpbMV0sIEpbM10sIHQpOyBDVl9TV0FQKEpbMl0sIEpbNl0sIHQpOyBDVl9TV0FQKEpbNV0sIEpbN10sIHQpOworICAgICAgICAgICAgICAgIENWX1NXQVAoSlsxMF0sIEpbMTJdLCB0KTsgQ1ZfU1dBUChKWzExXSwgSlsxNV0sIHQpOyBDVl9TV0FQKEpbMTRdLCBKWzE2XSwgdCk7CisgICAgICAgICAgICAgICAgQ1ZfU1dBUChKWzE5XSwgSlsyMV0sIHQpOyBDVl9TV0FQKEpbMjBdLCBKWzI0XSwgdCk7IENWX1NXQVAoSlsyM10sIEpbMjVdLCB0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdnRoICo9IHRoZXRhOworICAgICAgICAgICAgcnggKj0gdnRoOyByeSAqPSB2dGg7IHJ6ICo9IHZ0aDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QtPmRhdGEuZmxbMF0gPSAoZmxvYXQpcng7CisgICAgICAgICAgICBkc3QtPmRhdGEuZmxbc3RlcF0gPSAoZmxvYXQpcnk7CisgICAgICAgICAgICBkc3QtPmRhdGEuZmxbc3RlcCoyXSA9IChmbG9hdClyejsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdC0+ZGF0YS5kYlswXSA9IHJ4OworICAgICAgICAgICAgZHN0LT5kYXRhLmRiW3N0ZXBdID0gcnk7CisgICAgICAgICAgICBkc3QtPmRhdGEuZGJbc3RlcCoyXSA9IHJ6OworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGphY29iaWFuICkKKyAgICB7CisgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggamFjb2JpYW4tPnJvd3MgPT0gX0oucm93cyApCisgICAgICAgICAgICAgICAgY3ZDb252ZXJ0KCAmX0osIGphY29iaWFuICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgSmZbMyo5XTsKKyAgICAgICAgICAgICAgICBDdk1hdCBfSmYgPSBjdk1hdCggX0oucm93cywgX0ouY29scywgQ1ZfMzJGQzEsIEpmICk7CisgICAgICAgICAgICAgICAgY3ZDb252ZXJ0KCAmX0osICZfSmYgKTsKKyAgICAgICAgICAgICAgICBjdlRyYW5zcG9zZSggJl9KZiwgamFjb2JpYW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBqYWNvYmlhbi0+cm93cyA9PSBfSi5yb3dzICkKKyAgICAgICAgICAgIGN2Q29weSggJl9KLCBqYWNvYmlhbiApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdlRyYW5zcG9zZSggJl9KLCBqYWNvYmlhbiApOworICAgIH0KKworICAgIHJlc3VsdCA9IDE7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UHJvamVjdFBvaW50czIoIGNvbnN0IEN2TWF0KiBvYmplY3RQb2ludHMsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogcl92ZWMsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogdF92ZWMsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogQSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0Q29lZmZzLAorICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGltYWdlUG9pbnRzLCBDdk1hdCogZHBkciwKKyAgICAgICAgICAgICAgICAgIEN2TWF0KiBkcGR0LCBDdk1hdCogZHBkZiwKKyAgICAgICAgICAgICAgICAgIEN2TWF0KiBkcGRjLCBDdk1hdCogZHBkaywKKyAgICAgICAgICAgICAgICAgIGRvdWJsZSBhc3BlY3RSYXRpbyApCit7CisgICAgQ3ZNYXQgKl9NID0gMCwgKl9tID0gMDsKKyAgICBDdk1hdCAqX2RwZHIgPSAwLCAqX2RwZHQgPSAwLCAqX2RwZGMgPSAwLCAqX2RwZGYgPSAwLCAqX2RwZGsgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByb2plY3RQb2ludHMyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGosIGNvdW50OworICAgIGludCBjYWxjX2Rlcml2YXRpdmVzOworICAgIGNvbnN0IEN2UG9pbnQzRDY0ZiogTTsKKyAgICBDdlBvaW50MkQ2NGYqIG07CisgICAgZG91YmxlIHJbM10sIFJbOV0sIGRSZHJbMjddLCB0WzNdLCBhWzldLCBrWzVdID0gezAsMCwwLDAsMH0sIGZ4LCBmeSwgY3gsIGN5OworICAgIEN2TWF0IF9yLCBfdCwgX2EgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBhICksIF9rOworICAgIEN2TWF0IF9SID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgUiApLCBfZFJkciA9IGN2TWF0KCAzLCA5LCBDVl82NEYsIGRSZHIgKTsKKyAgICBkb3VibGUgKmRwZHJfcCA9IDAsICpkcGR0X3AgPSAwLCAqZHBka19wID0gMCwgKmRwZGZfcCA9IDAsICpkcGRjX3AgPSAwOworICAgIGludCBkcGRyX3N0ZXAgPSAwLCBkcGR0X3N0ZXAgPSAwLCBkcGRrX3N0ZXAgPSAwLCBkcGRmX3N0ZXAgPSAwLCBkcGRjX3N0ZXAgPSAwOworICAgIGJvb2wgZml4ZWRBc3BlY3RSYXRpbyA9IGFzcGVjdFJhdGlvID4gRkxUX0VQU0lMT047CisKKyAgICBpZiggIUNWX0lTX01BVChvYmplY3RQb2ludHMpIHx8ICFDVl9JU19NQVQocl92ZWMpIHx8CisgICAgICAgICFDVl9JU19NQVQodF92ZWMpIHx8ICFDVl9JU19NQVQoQSkgfHwKKyAgICAgICAgLyohQ1ZfSVNfTUFUKGRpc3RDb2VmZnMpIHx8Ki8gIUNWX0lTX01BVChpbWFnZVBvaW50cykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25lIG9mIHJlcXVpcmVkIGFyZ3VtZW50cyBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBjb3VudCA9IE1BWChvYmplY3RQb2ludHMtPnJvd3MsIG9iamVjdFBvaW50cy0+Y29scyk7CisKKyAgICBpZiggQ1ZfSVNfQ09OVF9NQVQob2JqZWN0UG9pbnRzLT50eXBlKSAmJiBDVl9NQVRfREVQVEgob2JqZWN0UG9pbnRzLT50eXBlKSA9PSBDVl82NEYgJiYKKyAgICAgICAgKChvYmplY3RQb2ludHMtPnJvd3MgPT0gMSAmJiBDVl9NQVRfQ04ob2JqZWN0UG9pbnRzLT50eXBlKSA9PSAzKSB8fAorICAgICAgICAob2JqZWN0UG9pbnRzLT5yb3dzID09IGNvdW50ICYmIENWX01BVF9DTihvYmplY3RQb2ludHMtPnR5cGUpKm9iamVjdFBvaW50cy0+Y29scyA9PSAzKSkpCisgICAgICAgIF9NID0gKEN2TWF0KilvYmplY3RQb2ludHM7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggX00gPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzY0RkMzICkpOworICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnRQb2ludHNIb21vZ2VuZW91cyggb2JqZWN0UG9pbnRzLCBfTSApKTsKKyAgICB9CisKKyAgICBpZiggQ1ZfSVNfQ09OVF9NQVQoaW1hZ2VQb2ludHMtPnR5cGUpICYmIENWX01BVF9ERVBUSChpbWFnZVBvaW50cy0+dHlwZSkgPT0gQ1ZfNjRGICYmCisgICAgICAgICgoaW1hZ2VQb2ludHMtPnJvd3MgPT0gMSAmJiBDVl9NQVRfQ04oaW1hZ2VQb2ludHMtPnR5cGUpID09IDIpIHx8CisgICAgICAgIChpbWFnZVBvaW50cy0+cm93cyA9PSBjb3VudCAmJiBDVl9NQVRfQ04oaW1hZ2VQb2ludHMtPnR5cGUpKmltYWdlUG9pbnRzLT5jb2xzID09IDIpKSkKKyAgICAgICAgX20gPSBpbWFnZVBvaW50czsKKyAgICBlbHNlCisgICAgICAgIENWX0NBTEwoIF9tID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl82NEZDMiApKTsKKworICAgIE0gPSAoQ3ZQb2ludDNENjRmKilfTS0+ZGF0YS5kYjsKKyAgICBtID0gKEN2UG9pbnQyRDY0ZiopX20tPmRhdGEuZGI7CisKKyAgICBpZiggKENWX01BVF9ERVBUSChyX3ZlYy0+dHlwZSkgIT0gQ1ZfNjRGICYmIENWX01BVF9ERVBUSChyX3ZlYy0+dHlwZSkgIT0gQ1ZfMzJGKSB8fAorICAgICAgICAoKChyX3ZlYy0+cm93cyAhPSAxICYmIHJfdmVjLT5jb2xzICE9IDEpIHx8CisgICAgICAgIHJfdmVjLT5yb3dzKnJfdmVjLT5jb2xzKkNWX01BVF9DTihyX3ZlYy0+dHlwZSkgIT0gMykgJiYKKyAgICAgICAgKChyX3ZlYy0+cm93cyAhPSAzICYmIHJfdmVjLT5jb2xzICE9IDMpIHx8IENWX01BVF9DTihyX3ZlYy0+dHlwZSkgIT0gMSkpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiUm90YXRpb24gbXVzdCBiZSByZXByZXNlbnRlZCBieSAxeDMgb3IgM3gxICIKKyAgICAgICAgICAgICAgICAgICJmbG9hdGluZy1wb2ludCByb3RhdGlvbiB2ZWN0b3IsIG9yIDN4MyByb3RhdGlvbiBtYXRyaXgiICk7CisKKyAgICBpZiggcl92ZWMtPnJvd3MgPT0gMyAmJiByX3ZlYy0+Y29scyA9PSAzICkKKyAgICB7CisgICAgICAgIF9yID0gY3ZNYXQoIDMsIDEsIENWXzY0RkMxLCByICk7CisgICAgICAgIENWX0NBTEwoIGN2Um9kcmlndWVzMiggcl92ZWMsICZfciApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZSb2RyaWd1ZXMyKCAmX3IsICZfUiwgJl9kUmRyICkpOworICAgICAgICBjdkNvcHkoIHJfdmVjLCAmX1IgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgX3IgPSBjdk1hdCggcl92ZWMtPnJvd3MsIHJfdmVjLT5jb2xzLCBDVl9NQUtFVFlQRShDVl82NEYsQ1ZfTUFUX0NOKHJfdmVjLT50eXBlKSksIHIgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCByX3ZlYywgJl9yICkpOworICAgICAgICBDVl9DQUxMKCBjdlJvZHJpZ3VlczIoICZfciwgJl9SLCAmX2RSZHIgKSApOworICAgIH0KKworICAgIGlmKCAoQ1ZfTUFUX0RFUFRIKHRfdmVjLT50eXBlKSAhPSBDVl82NEYgJiYgQ1ZfTUFUX0RFUFRIKHRfdmVjLT50eXBlKSAhPSBDVl8zMkYpIHx8CisgICAgICAgICh0X3ZlYy0+cm93cyAhPSAxICYmIHRfdmVjLT5jb2xzICE9IDEpIHx8CisgICAgICAgIHRfdmVjLT5yb3dzKnRfdmVjLT5jb2xzKkNWX01BVF9DTih0X3ZlYy0+dHlwZSkgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiVHJhbnNsYXRpb24gdmVjdG9yIG11c3QgYmUgMXgzIG9yIDN4MSBmbG9hdGluZy1wb2ludCB2ZWN0b3IiICk7CisKKyAgICBfdCA9IGN2TWF0KCB0X3ZlYy0+cm93cywgdF92ZWMtPmNvbHMsIENWX01BS0VUWVBFKENWXzY0RixDVl9NQVRfQ04odF92ZWMtPnR5cGUpKSwgdCApOworICAgIENWX0NBTEwoIGN2Q29udmVydCggdF92ZWMsICZfdCApKTsKKworICAgIGlmKCAoQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgIT0gQ1ZfNjRGQzEgJiYgQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgIT0gQ1ZfMzJGQzEpIHx8CisgICAgICAgIEEtPnJvd3MgIT0gMyB8fCBBLT5jb2xzICE9IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5zdHJpbnNpYyBwYXJhbWV0ZXJzIG11c3QgYmUgM3gzIGZsb2F0aW5nLXBvaW50IG1hdHJpeCIgKTsKKworICAgIENWX0NBTEwoIGN2Q29udmVydCggQSwgJl9hICkpOworICAgIGZ4ID0gYVswXTsgZnkgPSBhWzRdOworICAgIGN4ID0gYVsyXTsgY3kgPSBhWzVdOworCisgICAgaWYoIGZpeGVkQXNwZWN0UmF0aW8gKQorICAgICAgICBmeCA9IGZ5KmFzcGVjdFJhdGlvOworCisgICAgaWYoIGRpc3RDb2VmZnMgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoZGlzdENvZWZmcykgfHwKKyAgICAgICAgICAgIChDVl9NQVRfREVQVEgoZGlzdENvZWZmcy0+dHlwZSkgIT0gQ1ZfNjRGICYmCisgICAgICAgICAgICBDVl9NQVRfREVQVEgoZGlzdENvZWZmcy0+dHlwZSkgIT0gQ1ZfMzJGKSB8fAorICAgICAgICAgICAgKGRpc3RDb2VmZnMtPnJvd3MgIT0gMSAmJiBkaXN0Q29lZmZzLT5jb2xzICE9IDEpIHx8CisgICAgICAgICAgICAoZGlzdENvZWZmcy0+cm93cypkaXN0Q29lZmZzLT5jb2xzKkNWX01BVF9DTihkaXN0Q29lZmZzLT50eXBlKSAhPSA0ICYmCisgICAgICAgICAgICBkaXN0Q29lZmZzLT5yb3dzKmRpc3RDb2VmZnMtPmNvbHMqQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpICE9IDUpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgIkRpc3RvcnRpb24gY29lZmZpY2llbnRzIG11c3QgYmUgMXg0LCA0eDEsIDF4NSBvciA1eDEgZmxvYXRpbmctcG9pbnQgdmVjdG9yIiApOworCisgICAgICAgIF9rID0gY3ZNYXQoIGRpc3RDb2VmZnMtPnJvd3MsIGRpc3RDb2VmZnMtPmNvbHMsCisgICAgICAgICAgICAgICAgICAgIENWX01BS0VUWVBFKENWXzY0RixDVl9NQVRfQ04oZGlzdENvZWZmcy0+dHlwZSkpLCBrICk7CisgICAgICAgIENWX0NBTEwoIGN2Q29udmVydCggZGlzdENvZWZmcywgJl9rICkpOworICAgIH0KKworICAgIGlmKCBkcGRyICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGRwZHIpIHx8CisgICAgICAgICAgICAoQ1ZfTUFUX1RZUEUoZHBkci0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYKKyAgICAgICAgICAgIENWX01BVF9UWVBFKGRwZHItPnR5cGUpICE9IENWXzY0RkMxKSB8fAorICAgICAgICAgICAgZHBkci0+cm93cyAhPSBjb3VudCoyIHx8IGRwZHItPmNvbHMgIT0gMyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZHAvZHJvdCBtdXN0IGJlIDJOeDMgZmxvYXRpbmctcG9pbnQgbWF0cml4IiApOworCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShkcGRyLT50eXBlKSA9PSBDVl82NEZDMSApCisgICAgICAgICAgICBfZHBkciA9IGRwZHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0NBTEwoIF9kcGRyID0gY3ZDcmVhdGVNYXQoIDIqY291bnQsIDMsIENWXzY0RkMxICkpOworICAgICAgICBkcGRyX3AgPSBfZHBkci0+ZGF0YS5kYjsKKyAgICAgICAgZHBkcl9zdGVwID0gX2RwZHItPnN0ZXAvc2l6ZW9mKGRwZHJfcFswXSk7CisgICAgfQorCisgICAgaWYoIGRwZHQgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoZHBkdCkgfHwKKyAgICAgICAgICAgIChDVl9NQVRfVFlQRShkcGR0LT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICAgICAgQ1ZfTUFUX1RZUEUoZHBkdC0+dHlwZSkgIT0gQ1ZfNjRGQzEpIHx8CisgICAgICAgICAgICBkcGR0LT5yb3dzICE9IGNvdW50KjIgfHwgZHBkdC0+Y29scyAhPSAzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJkcC9kVCBtdXN0IGJlIDJOeDMgZmxvYXRpbmctcG9pbnQgbWF0cml4IiApOworCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShkcGR0LT50eXBlKSA9PSBDVl82NEZDMSApCisgICAgICAgICAgICBfZHBkdCA9IGRwZHQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0NBTEwoIF9kcGR0ID0gY3ZDcmVhdGVNYXQoIDIqY291bnQsIDMsIENWXzY0RkMxICkpOworICAgICAgICBkcGR0X3AgPSBfZHBkdC0+ZGF0YS5kYjsKKyAgICAgICAgZHBkdF9zdGVwID0gX2RwZHQtPnN0ZXAvc2l6ZW9mKGRwZHRfcFswXSk7CisgICAgfQorCisgICAgaWYoIGRwZGYgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoZHBkZikgfHwKKyAgICAgICAgICAgIChDVl9NQVRfVFlQRShkcGRmLT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShkcGRmLT50eXBlKSAhPSBDVl82NEZDMSkgfHwKKyAgICAgICAgICAgIGRwZGYtPnJvd3MgIT0gY291bnQqMiB8fCBkcGRmLT5jb2xzICE9IDIgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImRwL2RmIG11c3QgYmUgMk54MiBmbG9hdGluZy1wb2ludCBtYXRyaXgiICk7CisKKyAgICAgICAgaWYoIENWX01BVF9UWVBFKGRwZGYtPnR5cGUpID09IENWXzY0RkMxICkKKyAgICAgICAgICAgIF9kcGRmID0gZHBkZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggX2RwZGYgPSBjdkNyZWF0ZU1hdCggMipjb3VudCwgMiwgQ1ZfNjRGQzEgKSk7CisgICAgICAgIGRwZGZfcCA9IF9kcGRmLT5kYXRhLmRiOworICAgICAgICBkcGRmX3N0ZXAgPSBfZHBkZi0+c3RlcC9zaXplb2YoZHBkZl9wWzBdKTsKKyAgICB9CisKKyAgICBpZiggZHBkYyApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChkcGRjKSB8fAorICAgICAgICAgICAgKENWX01BVF9UWVBFKGRwZGMtPnR5cGUpICE9IENWXzMyRkMxICYmIENWX01BVF9UWVBFKGRwZGMtPnR5cGUpICE9IENWXzY0RkMxKSB8fAorICAgICAgICAgICAgZHBkYy0+cm93cyAhPSBjb3VudCoyIHx8IGRwZGMtPmNvbHMgIT0gMiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZHAvZGMgbXVzdCBiZSAyTngyIGZsb2F0aW5nLXBvaW50IG1hdHJpeCIgKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoZHBkYy0+dHlwZSkgPT0gQ1ZfNjRGQzEgKQorICAgICAgICAgICAgX2RwZGMgPSBkcGRjOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9DQUxMKCBfZHBkYyA9IGN2Q3JlYXRlTWF0KCAyKmNvdW50LCAyLCBDVl82NEZDMSApKTsKKyAgICAgICAgZHBkY19wID0gX2RwZGMtPmRhdGEuZGI7CisgICAgICAgIGRwZGNfc3RlcCA9IF9kcGRjLT5zdGVwL3NpemVvZihkcGRjX3BbMF0pOworICAgIH0KKworICAgIGlmKCBkcGRrICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGRwZGspIHx8CisgICAgICAgICAgICAoQ1ZfTUFUX1RZUEUoZHBkay0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYgQ1ZfTUFUX1RZUEUoZHBkay0+dHlwZSkgIT0gQ1ZfNjRGQzEpIHx8CisgICAgICAgICAgICBkcGRrLT5yb3dzICE9IGNvdW50KjIgfHwgKGRwZGstPmNvbHMgIT0gNSAmJiBkcGRrLT5jb2xzICE9IDQgJiYgZHBkay0+Y29scyAhPSAyKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZHAvZGYgbXVzdCBiZSAyTng1LCAyTng0IG9yIDJOeDIgZmxvYXRpbmctcG9pbnQgbWF0cml4IiApOworCisgICAgICAgIGlmKCAhZGlzdENvZWZmcyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgImRpc3RDb2VmZnMgaXMgTlVMTCB3aGlsZSBkcGRrIGlzIG5vdCIgKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoZHBkay0+dHlwZSkgPT0gQ1ZfNjRGQzEgKQorICAgICAgICAgICAgX2RwZGsgPSBkcGRrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9DQUxMKCBfZHBkayA9IGN2Q3JlYXRlTWF0KCBkcGRrLT5yb3dzLCBkcGRrLT5jb2xzLCBDVl82NEZDMSApKTsKKyAgICAgICAgZHBka19wID0gX2RwZGstPmRhdGEuZGI7CisgICAgICAgIGRwZGtfc3RlcCA9IF9kcGRrLT5zdGVwL3NpemVvZihkcGRrX3BbMF0pOworICAgIH0KKworICAgIGNhbGNfZGVyaXZhdGl2ZXMgPSBkcGRyIHx8IGRwZHQgfHwgZHBkZiB8fCBkcGRjIHx8IGRwZGs7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgWCA9IE1baV0ueCwgWSA9IE1baV0ueSwgWiA9IE1baV0uejsKKyAgICAgICAgZG91YmxlIHggPSBSWzBdKlggKyBSWzFdKlkgKyBSWzJdKlogKyB0WzBdOworICAgICAgICBkb3VibGUgeSA9IFJbM10qWCArIFJbNF0qWSArIFJbNV0qWiArIHRbMV07CisgICAgICAgIGRvdWJsZSB6ID0gUls2XSpYICsgUls3XSpZICsgUls4XSpaICsgdFsyXTsKKyAgICAgICAgZG91YmxlIHIyLCByNCwgcjYsIGExLCBhMiwgYTMsIGNkaXN0OworICAgICAgICBkb3VibGUgeGQsIHlkOworCisgICAgICAgIHogPSB6ID8gMS4veiA6IDE7CisgICAgICAgIHggKj0gejsgeSAqPSB6OworCisgICAgICAgIHIyID0geCp4ICsgeSp5OworICAgICAgICByNCA9IHIyKnIyOworICAgICAgICByNiA9IHI0KnIyOworICAgICAgICBhMSA9IDIqeCp5OworICAgICAgICBhMiA9IHIyICsgMip4Kng7CisgICAgICAgIGEzID0gcjIgKyAyKnkqeTsKKyAgICAgICAgY2Rpc3QgPSAxICsga1swXSpyMiArIGtbMV0qcjQgKyBrWzRdKnI2OworICAgICAgICB4ZCA9IHgqY2Rpc3QgKyBrWzJdKmExICsga1szXSphMjsKKyAgICAgICAgeWQgPSB5KmNkaXN0ICsga1syXSphMyArIGtbM10qYTE7CisKKyAgICAgICAgbVtpXS54ID0geGQqZnggKyBjeDsKKyAgICAgICAgbVtpXS55ID0geWQqZnkgKyBjeTsKKworICAgICAgICBpZiggY2FsY19kZXJpdmF0aXZlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkcGRjX3AgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRwZGNfcFswXSA9IDE7IGRwZGNfcFsxXSA9IDA7CisgICAgICAgICAgICAgICAgZHBkY19wW2RwZGNfc3RlcF0gPSAwOworICAgICAgICAgICAgICAgIGRwZGNfcFtkcGRjX3N0ZXArMV0gPSAxOworICAgICAgICAgICAgICAgIGRwZGNfcCArPSBkcGRjX3N0ZXAqMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGRwZGZfcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGZpeGVkQXNwZWN0UmF0aW8gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHBkZl9wWzBdID0gMDsgZHBkZl9wWzFdID0geGQqYXNwZWN0UmF0aW87CisgICAgICAgICAgICAgICAgICAgIGRwZGZfcFtkcGRmX3N0ZXBdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZHBkZl9wW2RwZGZfc3RlcCsxXSA9IHlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkcGRmX3BbMF0gPSB4ZDsgZHBkZl9wWzFdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZHBkZl9wW2RwZGZfc3RlcF0gPSAwOworICAgICAgICAgICAgICAgICAgICBkcGRmX3BbZHBkZl9zdGVwKzFdID0geWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRwZGZfcCArPSBkcGRmX3N0ZXAqMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGRwZGtfcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHBka19wWzBdID0gZngqeCpyMjsKKyAgICAgICAgICAgICAgICBkcGRrX3BbMV0gPSBmeCp4KnI0OworICAgICAgICAgICAgICAgIGRwZGtfcFtkcGRrX3N0ZXBdID0gZnkqeSpyMjsKKyAgICAgICAgICAgICAgICBkcGRrX3BbZHBka19zdGVwKzFdID0gZnkqeSpyNDsKKyAgICAgICAgICAgICAgICBpZiggX2RwZGstPmNvbHMgPiAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRwZGtfcFsyXSA9IGZ4KmExOworICAgICAgICAgICAgICAgICAgICBkcGRrX3BbM10gPSBmeCphMjsKKyAgICAgICAgICAgICAgICAgICAgZHBka19wW2RwZGtfc3RlcCsyXSA9IGZ5KmEzOworICAgICAgICAgICAgICAgICAgICBkcGRrX3BbZHBka19zdGVwKzNdID0gZnkqYTE7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfZHBkay0+Y29scyA+IDQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkcGRrX3BbNF0gPSBmeCp4KnI2OworICAgICAgICAgICAgICAgICAgICAgICAgZHBka19wW2RwZGtfc3RlcCs0XSA9IGZ5KnkqcjY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHBka19wICs9IGRwZGtfc3RlcCoyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggZHBkdF9wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHhkdFtdID0geyB6LCAwLCAteCp6IH0sIGR5ZHRbXSA9IHsgMCwgeiwgLXkqeiB9OworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRyMmR0ID0gMip4KmR4ZHRbal0gKyAyKnkqZHlkdFtqXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRjZGlzdF9kdCA9IGtbMF0qZHIyZHQgKyAyKmtbMV0qcjIqZHIyZHQgKyAzKmtbNF0qcjQqZHIyZHQ7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkYTFkdCA9IDIqKHgqZHlkdFtqXSArIHkqZHhkdFtqXSk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkbXhkdCA9IGZ4KihkeGR0W2pdKmNkaXN0ICsgeCpkY2Rpc3RfZHQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrWzJdKmRhMWR0ICsga1szXSooZHIyZHQgKyAyKngqZHhkdFtqXSkpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZG15ZHQgPSBmeSooZHlkdFtqXSpjZGlzdCArIHkqZGNkaXN0X2R0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1syXSooZHIyZHQgKyAyKnkqZHlkdFtqXSkgKyBrWzNdKmRhMWR0KTsKKyAgICAgICAgICAgICAgICAgICAgZHBkdF9wW2pdID0gZG14ZHQ7CisgICAgICAgICAgICAgICAgICAgIGRwZHRfcFtkcGR0X3N0ZXAral0gPSBkbXlkdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZHBkdF9wICs9IGRwZHRfc3RlcCoyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggZHBkcl9wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHgwZHJbXSA9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBYKmRSZHJbMF0gKyBZKmRSZHJbMV0gKyBaKmRSZHJbMl0sCisgICAgICAgICAgICAgICAgICAgIFgqZFJkcls5XSArIFkqZFJkclsxMF0gKyBaKmRSZHJbMTFdLAorICAgICAgICAgICAgICAgICAgICBYKmRSZHJbMThdICsgWSpkUmRyWzE5XSArIFoqZFJkclsyMF0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGRvdWJsZSBkeTBkcltdID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFgqZFJkclszXSArIFkqZFJkcls0XSArIFoqZFJkcls1XSwKKyAgICAgICAgICAgICAgICAgICAgWCpkUmRyWzEyXSArIFkqZFJkclsxM10gKyBaKmRSZHJbMTRdLAorICAgICAgICAgICAgICAgICAgICBYKmRSZHJbMjFdICsgWSpkUmRyWzIyXSArIFoqZFJkclsyM10KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGRvdWJsZSBkejBkcltdID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFgqZFJkcls2XSArIFkqZFJkcls3XSArIFoqZFJkcls4XSwKKyAgICAgICAgICAgICAgICAgICAgWCpkUmRyWzE1XSArIFkqZFJkclsxNl0gKyBaKmRSZHJbMTddLAorICAgICAgICAgICAgICAgICAgICBYKmRSZHJbMjRdICsgWSpkUmRyWzI1XSArIFoqZFJkclsyNl0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR4ZHIgPSB6KihkeDBkcltqXSAtIHgqZHowZHJbal0pOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHlkciA9IHoqKGR5MGRyW2pdIC0geSpkejBkcltqXSk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkcjJkciA9IDIqeCpkeGRyICsgMip5KmR5ZHI7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkY2Rpc3RfZHIgPSBrWzBdKmRyMmRyICsgMiprWzFdKnIyKmRyMmRyICsgMyprWzRdKnI0KmRyMmRyOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGExZHIgPSAyKih4KmR5ZHIgKyB5KmR4ZHIpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZG14ZHIgPSBmeCooZHhkcipjZGlzdCArIHgqZGNkaXN0X2RyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1syXSpkYTFkciArIGtbM10qKGRyMmRyICsgMip4KmR4ZHIpKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRteWRyID0gZnkqKGR5ZHIqY2Rpc3QgKyB5KmRjZGlzdF9kciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtbMl0qKGRyMmRyICsgMip5KmR5ZHIpICsga1szXSpkYTFkcik7CisgICAgICAgICAgICAgICAgICAgIGRwZHJfcFtqXSA9IGRteGRyOworICAgICAgICAgICAgICAgICAgICBkcGRyX3BbZHBkcl9zdGVwK2pdID0gZG15ZHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRwZHJfcCArPSBkcGRyX3N0ZXAqMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBfbSAhPSBpbWFnZVBvaW50cyApCisgICAgICAgIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzKCBfbSwgaW1hZ2VQb2ludHMgKTsKKyAgICBpZiggX2RwZHIgIT0gZHBkciApCisgICAgICAgIGN2Q29udmVydCggX2RwZHIsIGRwZHIgKTsKKyAgICBpZiggX2RwZHQgIT0gZHBkdCApCisgICAgICAgIGN2Q29udmVydCggX2RwZHQsIGRwZHQgKTsKKyAgICBpZiggX2RwZGYgIT0gZHBkZiApCisgICAgICAgIGN2Q29udmVydCggX2RwZGYsIGRwZGYgKTsKKyAgICBpZiggX2RwZGMgIT0gZHBkYyApCisgICAgICAgIGN2Q29udmVydCggX2RwZGMsIGRwZGMgKTsKKyAgICBpZiggX2RwZGsgIT0gZHBkayApCisgICAgICAgIGN2Q29udmVydCggX2RwZGssIGRwZGsgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggX00gIT0gb2JqZWN0UG9pbnRzICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmX00gKTsKKyAgICBpZiggX20gIT0gaW1hZ2VQb2ludHMgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZfbSApOworICAgIGlmKCBfZHBkciAhPSBkcGRyICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmX2RwZHIgKTsKKyAgICBpZiggX2RwZHQgIT0gZHBkdCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJl9kcGR0ICk7CisgICAgaWYoIF9kcGRmICE9IGRwZGYgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZfZHBkZiApOworICAgIGlmKCBfZHBkYyAhPSBkcGRjICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmX2RwZGMgKTsKKyAgICBpZiggX2RwZGsgIT0gZHBkayApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJl9kcGRrICk7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMyKCBjb25zdCBDdk1hdCogb2JqZWN0UG9pbnRzLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGltYWdlUG9pbnRzLCBjb25zdCBDdk1hdCogQSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBkaXN0Q29lZmZzLAorICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHJ2ZWMsIEN2TWF0KiB0dmVjICkKK3sKKyAgICBjb25zdCBpbnQgbWF4X2l0ZXIgPSAyMDsKKyAgICBDdk1hdCAqX00gPSAwLCAqX014eSA9IDAsICpfbSA9IDAsICpfbW4gPSAwLCAqX0wgPSAwLCAqX0ogPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGNvdW50OworICAgIGRvdWJsZSBhWzldLCBhcls5XT17MSwwLDAsMCwxLDAsMCwwLDF9LCBSWzldOworICAgIGRvdWJsZSBNTVs5XSwgVVs5XSwgVls5XSwgV1szXTsKKyAgICBDdlNjYWxhciBNYzsKKyAgICBkb3VibGUgSnRKWzYqNl0sIEp0RXJyWzZdLCBKdEpXWzZdLCBKdEpWWzYqNl0sIGRlbHRhWzZdLCBwYXJhbVs2XTsKKyAgICBDdk1hdCBfQSA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIGEgKTsKKyAgICBDdk1hdCBfQXIgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBhciApOworICAgIEN2TWF0IF9SID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgUiApOworICAgIEN2TWF0IF9yID0gY3ZNYXQoIDMsIDEsIENWXzY0RiwgcGFyYW0gKTsKKyAgICBDdk1hdCBfdCA9IGN2TWF0KCAzLCAxLCBDVl82NEYsIHBhcmFtICsgMyApOworICAgIEN2TWF0IF9NYyA9IGN2TWF0KCAxLCAzLCBDVl82NEYsIE1jLnZhbCApOworICAgIEN2TWF0IF9NTSA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIE1NICk7CisgICAgQ3ZNYXQgX1UgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBVICk7CisgICAgQ3ZNYXQgX1YgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBWICk7CisgICAgQ3ZNYXQgX1cgPSBjdk1hdCggMywgMSwgQ1ZfNjRGLCBXICk7CisgICAgQ3ZNYXQgX0p0SiA9IGN2TWF0KCA2LCA2LCBDVl82NEYsIEp0SiApOworICAgIEN2TWF0IF9KdEVyciA9IGN2TWF0KCA2LCAxLCBDVl82NEYsIEp0RXJyICk7CisgICAgQ3ZNYXQgX0p0SlcgPSBjdk1hdCggNiwgMSwgQ1ZfNjRGLCBKdEpXICk7CisgICAgQ3ZNYXQgX0p0SlYgPSBjdk1hdCggNiwgNiwgQ1ZfNjRGLCBKdEpWICk7CisgICAgQ3ZNYXQgX2RlbHRhID0gY3ZNYXQoIDYsIDEsIENWXzY0RiwgZGVsdGEgKTsKKyAgICBDdk1hdCBfcGFyYW0gPSBjdk1hdCggNiwgMSwgQ1ZfNjRGLCBwYXJhbSApOworICAgIEN2TWF0IF9kcGRyLCBfZHBkdDsKKworICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKG9iamVjdFBvaW50cykgJiYgQ1ZfSVNfTUFUKGltYWdlUG9pbnRzKSAmJgorICAgICAgICBDVl9JU19NQVQoQSkgJiYgQ1ZfSVNfTUFUKHJ2ZWMpICYmIENWX0lTX01BVCh0dmVjKSApOworCisgICAgY291bnQgPSBNQVgob2JqZWN0UG9pbnRzLT5jb2xzLCBvYmplY3RQb2ludHMtPnJvd3MpOworICAgIENWX0NBTEwoIF9NID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl82NEZDMyApKTsKKyAgICBDVl9DQUxMKCBfbSA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGQzIgKSk7CisKKyAgICBDVl9DQUxMKCBjdkNvbnZlcnRQb2ludHNIb21vZ2VuZW91cyggb2JqZWN0UG9pbnRzLCBfTSApKTsKKyAgICBDVl9DQUxMKCBjdkNvbnZlcnRQb2ludHNIb21vZ2VuZW91cyggaW1hZ2VQb2ludHMsIF9tICkpOworICAgIENWX0NBTEwoIGN2Q29udmVydCggQSwgJl9BICkpOworCisgICAgQ1ZfQVNTRVJUKCAoQ1ZfTUFUX0RFUFRIKHJ2ZWMtPnR5cGUpID09IENWXzY0RiB8fCBDVl9NQVRfREVQVEgocnZlYy0+dHlwZSkgPT0gQ1ZfMzJGKSAmJgorICAgICAgICAocnZlYy0+cm93cyA9PSAxIHx8IHJ2ZWMtPmNvbHMgPT0gMSkgJiYgcnZlYy0+cm93cypydmVjLT5jb2xzKkNWX01BVF9DTihydmVjLT50eXBlKSA9PSAzICk7CisKKyAgICBDVl9BU1NFUlQoIChDVl9NQVRfREVQVEgodHZlYy0+dHlwZSkgPT0gQ1ZfNjRGIHx8IENWX01BVF9ERVBUSCh0dmVjLT50eXBlKSA9PSBDVl8zMkYpICYmCisgICAgICAgICh0dmVjLT5yb3dzID09IDEgfHwgdHZlYy0+Y29scyA9PSAxKSAmJiB0dmVjLT5yb3dzKnR2ZWMtPmNvbHMqQ1ZfTUFUX0NOKHR2ZWMtPnR5cGUpID09IDMgKTsKKworICAgIENWX0NBTEwoIF9tbiA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGQzIgKSk7CisgICAgQ1ZfQ0FMTCggX014eSA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGQzIgKSk7CisKKyAgICAvLyBub3JtYWxpemUgaW1hZ2UgcG9pbnRzCisgICAgLy8gKHVuYXBwbHkgdGhlIGludHJpbnNpYyBtYXRyaXggdHJhbnNmb3JtYXRpb24gYW5kIGRpc3RvcnRpb24pCisgICAgY3ZVbmRpc3RvcnRQb2ludHMoIF9tLCBfbW4sICZfQSwgZGlzdENvZWZmcywgMCwgJl9BciApOworCisgICAgTWMgPSBjdkF2ZyhfTSk7CisgICAgY3ZSZXNoYXBlKCBfTSwgX00sIDEsIGNvdW50ICk7CisgICAgY3ZNdWxUcmFuc3Bvc2VkKCBfTSwgJl9NTSwgMSwgJl9NYyApOworICAgIGN2U1ZEKCAmX01NLCAmX1csIDAsICZfViwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1ZfVCApOworCisgICAgLy8gaW5pdGlhbGl6ZSBleHRyaW5zaWMgcGFyYW1ldGVycworICAgIGlmKCBXWzJdL1dbMV0gPCAxZS0zIHx8IGNvdW50IDwgNCApCisgICAgeworICAgICAgICAvLyBhIHBsYW5hciBzdHJ1Y3R1cmUgY2FzZSAoYWxsIE0ncyBsaWUgaW4gdGhlIHNhbWUgcGxhbmUpCisgICAgICAgIGRvdWJsZSB0dFszXSwgaFs5XSwgaDFfbm9ybSwgaDJfbm9ybTsKKyAgICAgICAgQ3ZNYXQqIFJfdHJhbnNmb3JtID0gJl9WOworICAgICAgICBDdk1hdCBUX3RyYW5zZm9ybSA9IGN2TWF0KCAzLCAxLCBDVl82NEYsIHR0ICk7CisgICAgICAgIEN2TWF0IF9IID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgaCApOworICAgICAgICBDdk1hdCBfaDEsIF9oMiwgX2gzOworCisgICAgICAgIGlmKCBWWzJdKlZbMl0gKyBWWzVdKlZbNV0gPCAxZS0xMCApCisgICAgICAgICAgICBjdlNldElkZW50aXR5KCBSX3RyYW5zZm9ybSApOworCisgICAgICAgIGlmKCBjdkRldChSX3RyYW5zZm9ybSkgPCAwICkKKyAgICAgICAgICAgIGN2U2NhbGUoIFJfdHJhbnNmb3JtLCBSX3RyYW5zZm9ybSwgLTEgKTsKKworICAgICAgICBjdkdFTU0oIFJfdHJhbnNmb3JtLCAmX01jLCAtMSwgMCwgMCwgJlRfdHJhbnNmb3JtLCBDVl9HRU1NX0JfVCApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZG91YmxlKiBScCA9IFJfdHJhbnNmb3JtLT5kYXRhLmRiOworICAgICAgICAgICAgY29uc3QgZG91YmxlKiBUcCA9IFRfdHJhbnNmb3JtLmRhdGEuZGI7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYyA9IF9NLT5kYXRhLmRiICsgaSozOworICAgICAgICAgICAgZG91YmxlKiBkc3QgPSBfTXh5LT5kYXRhLmRiICsgaSoyOworCisgICAgICAgICAgICBkc3RbMF0gPSBScFswXSpzcmNbMF0gKyBScFsxXSpzcmNbMV0gKyBScFsyXSpzcmNbMl0gKyBUcFswXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IFJwWzNdKnNyY1swXSArIFJwWzRdKnNyY1sxXSArIFJwWzVdKnNyY1syXSArIFRwWzFdOworICAgICAgICB9CisKKyAgICAgICAgY3ZGaW5kSG9tb2dyYXBoeSggX014eSwgX21uLCAmX0ggKTsKKworICAgICAgICBjdkdldENvbCggJl9ILCAmX2gxLCAwICk7CisgICAgICAgIF9oMiA9IF9oMTsgX2gyLmRhdGEuZGIrKzsKKyAgICAgICAgX2gzID0gX2gyOyBfaDMuZGF0YS5kYisrOworICAgICAgICBoMV9ub3JtID0gc3FydChoWzBdKmhbMF0gKyBoWzNdKmhbM10gKyBoWzZdKmhbNl0pOworICAgICAgICBoMl9ub3JtID0gc3FydChoWzFdKmhbMV0gKyBoWzRdKmhbNF0gKyBoWzddKmhbN10pOworCisgICAgICAgIGN2U2NhbGUoICZfaDEsICZfaDEsIDEuL2gxX25vcm0gKTsKKyAgICAgICAgY3ZTY2FsZSggJl9oMiwgJl9oMiwgMS4vaDJfbm9ybSApOworICAgICAgICBjdlNjYWxlKCAmX2gzLCAmX3QsIDIuLyhoMV9ub3JtICsgaDJfbm9ybSkpOworICAgICAgICBjdkNyb3NzUHJvZHVjdCggJl9oMSwgJl9oMiwgJl9oMyApOworCisgICAgICAgIGN2Um9kcmlndWVzMiggJl9ILCAmX3IgKTsKKyAgICAgICAgY3ZSb2RyaWd1ZXMyKCAmX3IsICZfSCApOworICAgICAgICBjdk1hdE11bEFkZCggJl9ILCAmVF90cmFuc2Zvcm0sICZfdCwgJl90ICk7CisgICAgICAgIGN2TWF0TXVsKCAmX0gsIFJfdHJhbnNmb3JtLCAmX1IgKTsKKyAgICAgICAgY3ZSb2RyaWd1ZXMyKCAmX1IsICZfciApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBub24tcGxhbmFyIHN0cnVjdHVyZS4gVXNlIERMVCBtZXRob2QKKyAgICAgICAgZG91YmxlKiBMOworICAgICAgICBkb3VibGUgTExbMTIqMTJdLCBMV1sxMl0sIExWWzEyKjEyXSwgc2M7CisgICAgICAgIEN2TWF0IF9MTCA9IGN2TWF0KCAxMiwgMTIsIENWXzY0RiwgTEwgKTsKKyAgICAgICAgQ3ZNYXQgX0xXID0gY3ZNYXQoIDEyLCAxLCBDVl82NEYsIExXICk7CisgICAgICAgIEN2TWF0IF9MViA9IGN2TWF0KCAxMiwgMTIsIENWXzY0RiwgTFYgKTsKKyAgICAgICAgQ3ZNYXQgX1JSdCwgX1JSLCBfdHQ7CisgICAgICAgIEN2UG9pbnQzRDY0ZiogTSA9IChDdlBvaW50M0Q2NGYqKV9NLT5kYXRhLmRiOworICAgICAgICBDdlBvaW50MkQ2NGYqIG1uID0gKEN2UG9pbnQyRDY0ZiopX21uLT5kYXRhLmRiOworCisgICAgICAgIENWX0NBTEwoIF9MID0gY3ZDcmVhdGVNYXQoIDIqY291bnQsIDEyLCBDVl82NEYgKSk7CisgICAgICAgIEwgPSBfTC0+ZGF0YS5kYjsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKywgTCArPSAyNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gLW1uW2ldLngsIHkgPSAtbW5baV0ueTsKKyAgICAgICAgICAgIExbMF0gPSBMWzE2XSA9IE1baV0ueDsKKyAgICAgICAgICAgIExbMV0gPSBMWzE3XSA9IE1baV0ueTsKKyAgICAgICAgICAgIExbMl0gPSBMWzE4XSA9IE1baV0uejsKKyAgICAgICAgICAgIExbM10gPSBMWzE5XSA9IDEuOworICAgICAgICAgICAgTFs0XSA9IExbNV0gPSBMWzZdID0gTFs3XSA9IDAuOworICAgICAgICAgICAgTFsxMl0gPSBMWzEzXSA9IExbMTRdID0gTFsxNV0gPSAwLjsKKyAgICAgICAgICAgIExbOF0gPSB4Kk1baV0ueDsKKyAgICAgICAgICAgIExbOV0gPSB4Kk1baV0ueTsKKyAgICAgICAgICAgIExbMTBdID0geCpNW2ldLno7CisgICAgICAgICAgICBMWzExXSA9IHg7CisgICAgICAgICAgICBMWzIwXSA9IHkqTVtpXS54OworICAgICAgICAgICAgTFsyMV0gPSB5Kk1baV0ueTsKKyAgICAgICAgICAgIExbMjJdID0geSpNW2ldLno7CisgICAgICAgICAgICBMWzIzXSA9IHk7CisgICAgICAgIH0KKworICAgICAgICBjdk11bFRyYW5zcG9zZWQoIF9MLCAmX0xMLCAxICk7CisgICAgICAgIGN2U1ZEKCAmX0xMLCAmX0xXLCAwLCAmX0xWLCBDVl9TVkRfTU9ESUZZX0EgKyBDVl9TVkRfVl9UICk7CisgICAgICAgIF9SUnQgPSBjdk1hdCggMywgNCwgQ1ZfNjRGLCBMViArIDExKjEyICk7CisgICAgICAgIGN2R2V0Q29scyggJl9SUnQsICZfUlIsIDAsIDMgKTsKKyAgICAgICAgY3ZHZXRDb2woICZfUlJ0LCAmX3R0LCAzICk7CisgICAgICAgIGlmKCBjdkRldCgmX1JSKSA8IDAgKQorICAgICAgICAgICAgY3ZTY2FsZSggJl9SUnQsICZfUlJ0LCAtMSApOworICAgICAgICBzYyA9IGN2Tm9ybSgmX1JSKTsKKyAgICAgICAgY3ZTVkQoICZfUlIsICZfVywgJl9VLCAmX1YsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICk7CisgICAgICAgIGN2R0VNTSggJl9VLCAmX1YsIDEsIDAsIDAsICZfUiwgQ1ZfR0VNTV9BX1QgKTsKKyAgICAgICAgY3ZTY2FsZSggJl90dCwgJl90LCBjdk5vcm0oJl9SKS9zYyApOworICAgICAgICBjdlJvZHJpZ3VlczIoICZfUiwgJl9yICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJl9MICk7CisgICAgfQorCisgICAgY3ZSZXNoYXBlKCBfTSwgX00sIDMsIDEgKTsKKyAgICBjdlJlc2hhcGUoIF9tbiwgX21uLCAyLCAxICk7CisKKyAgICBDVl9DQUxMKCBfSiA9IGN2Q3JlYXRlTWF0KCAyKmNvdW50LCA2LCBDVl82NEZDMSApKTsKKyAgICBjdkdldENvbHMoIF9KLCAmX2RwZHIsIDAsIDMgKTsKKyAgICBjdkdldENvbHMoIF9KLCAmX2RwZHQsIDMsIDYgKTsKKworICAgIC8vIHJlZmluZSBleHRyaW5zaWMgcGFyYW1ldGVycyB1c2luZyBpdGVyYXRpdmUgYWxnb3JpdGhtCisgICAgZm9yKCBpID0gMDsgaSA8IG1heF9pdGVyOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIG4xLCBuMjsKKyAgICAgICAgY3ZSZXNoYXBlKCBfbW4sIF9tbiwgMiwgMSApOworICAgICAgICBjdlByb2plY3RQb2ludHMyKCBfTSwgJl9yLCAmX3QsICZfQSwgZGlzdENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX21uLCAmX2RwZHIsICZfZHBkdCwgMCwgMCwgMCApOworICAgICAgICBjdlN1YiggX20sIF9tbiwgX21uICk7CisgICAgICAgIGN2UmVzaGFwZSggX21uLCBfbW4sIDEsIDIqY291bnQgKTsKKworICAgICAgICBjdk11bFRyYW5zcG9zZWQoIF9KLCAmX0p0SiwgMSApOworICAgICAgICBjdkdFTU0oIF9KLCBfbW4sIDEsIDAsIDAsICZfSnRFcnIsIENWX0dFTU1fQV9UICk7CisgICAgICAgIGN2U1ZEKCAmX0p0SiwgJl9KdEpXLCAwLCAmX0p0SlYsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9WX1QgKTsKKyAgICAgICAgaWYoIEp0SldbNV0vSnRKV1swXSA8IDFlLTEyICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjdlNWQmtTYiggJl9KdEpXLCAmX0p0SlYsICZfSnRKViwgJl9KdEVyciwKKyAgICAgICAgICAgICAgICAgICZfZGVsdGEsIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICk7CisgICAgICAgIGN2QWRkKCAmX2RlbHRhLCAmX3BhcmFtLCAmX3BhcmFtICk7CisgICAgICAgIG4xID0gY3ZOb3JtKCAmX2RlbHRhICk7CisgICAgICAgIG4yID0gY3ZOb3JtKCAmX3BhcmFtICk7CisgICAgICAgIGlmKCBuMS9uMiA8IDFlLTEwICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9yID0gY3ZNYXQoIHJ2ZWMtPnJvd3MsIHJ2ZWMtPmNvbHMsCisgICAgICAgIENWX01BS0VUWVBFKENWXzY0RixDVl9NQVRfQ04ocnZlYy0+dHlwZSkpLCBwYXJhbSApOworICAgIF90ID0gY3ZNYXQoIHR2ZWMtPnJvd3MsIHR2ZWMtPmNvbHMsCisgICAgICAgIENWX01BS0VUWVBFKENWXzY0RixDVl9NQVRfQ04odHZlYy0+dHlwZSkpLCBwYXJhbSArIDMgKTsKKworICAgIGN2Q29udmVydCggJl9yLCBydmVjICk7CisgICAgY3ZDb252ZXJ0KCAmX3QsIHR2ZWMgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZfTSApOworICAgIGN2UmVsZWFzZU1hdCggJl9NeHkgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfbSApOworICAgIGN2UmVsZWFzZU1hdCggJl9tbiApOworICAgIGN2UmVsZWFzZU1hdCggJl9MICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmX0ogKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2SW5pdEludHJpbnNpY1BhcmFtczJEKCBjb25zdCBDdk1hdCogb2JqZWN0UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBpbWFnZVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbnBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBjYW1lcmFNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFzcGVjdFJhdGlvICkKK3sKKyAgICBDdk1hdCAqX0EgPSAwLCAqX2IgPSAwLCAqX2FsbEggPSAwLCAqX2FsbEsgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkluaXRJbnRyaW5zaWNQYXJhbXMyRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBqLCBwb3MsIG5pbWFnZXMsIHRvdGFsLCBuaSA9IDA7CisgICAgZG91YmxlIGFbOV0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICBkb3VibGUgSFs5XSwgZlsyXTsKKyAgICBDdk1hdCBfYSA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIGEgKTsKKyAgICBDdk1hdCBfSCA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIEggKTsKKyAgICBDdk1hdCBfZiA9IGN2TWF0KCAyLCAxLCBDVl82NEYsIGYgKTsKKworICAgIGFzc2VydCggQ1ZfTUFUX1RZUEUobnBvaW50cy0+dHlwZSkgPT0gQ1ZfMzJTQzEgJiYKKyAgICAgICAgICAgIENWX0lTX01BVF9DT05UKG5wb2ludHMtPnR5cGUpICk7CisgICAgbmltYWdlcyA9IG5wb2ludHMtPnJvd3MgKyBucG9pbnRzLT5jb2xzIC0gMTsKKworICAgIGlmKCAoQ1ZfTUFUX1RZUEUob2JqZWN0UG9pbnRzLT50eXBlKSAhPSBDVl8zMkZDMyAmJgorICAgICAgICBDVl9NQVRfVFlQRShvYmplY3RQb2ludHMtPnR5cGUpICE9IENWXzY0RkMzKSB8fAorICAgICAgICAoQ1ZfTUFUX1RZUEUoaW1hZ2VQb2ludHMtPnR5cGUpICE9IENWXzMyRkMyICYmCisgICAgICAgIENWX01BVF9UWVBFKGltYWdlUG9pbnRzLT50eXBlKSAhPSBDVl82NEZDMikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJCb3RoIG9iamVjdCBwb2ludHMgYW5kIGltYWdlIHBvaW50cyBtdXN0IGJlIDJEIiApOworCisgICAgaWYoIG9iamVjdFBvaW50cy0+cm93cyAhPSAxIHx8IGltYWdlUG9pbnRzLT5yb3dzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIm9iamVjdCBwb2ludHMgYW5kIGltYWdlIHBvaW50cyBtdXN0IGJlIGEgc2luZ2xlLXJvdyBtYXRyaWNlcyIgKTsKKworICAgIF9BID0gY3ZDcmVhdGVNYXQoIDIqbmltYWdlcywgMiwgQ1ZfNjRGICk7CisgICAgX2IgPSBjdkNyZWF0ZU1hdCggMipuaW1hZ2VzLCAxLCBDVl82NEYgKTsKKyAgICBhWzJdID0gKGltYWdlU2l6ZS53aWR0aCAtIDEpKjAuNTsKKyAgICBhWzVdID0gKGltYWdlU2l6ZS5oZWlnaHQgLSAxKSowLjU7CisgICAgX2FsbEggPSBjdkNyZWF0ZU1hdCggbmltYWdlcywgOSwgQ1ZfNjRGICk7CisKKyAgICB0b3RhbCA9IGN2Um91bmQoY3ZTdW0obnBvaW50cykudmFsWzBdKTsKKworICAgIC8vIGV4dHJhY3QgdmFuaXNoaW5nIHBvaW50cyBpbiBvcmRlciB0byBvYnRhaW4gaW5pdGlhbCB2YWx1ZSBmb3IgdGhlIGZvY2FsIGxlbmd0aAorICAgIGZvciggaSA9IDAsIHBvcyA9IDA7IGkgPCBuaW1hZ2VzOyBpKyssIHBvcyArPSBuaSApCisgICAgeworICAgICAgICBkb3VibGUqIEFwID0gX0EtPmRhdGEuZGIgKyBpKjQ7CisgICAgICAgIGRvdWJsZSogYnAgPSBfYi0+ZGF0YS5kYiArIGkqMjsKKyAgICAgICAgbmkgPSBucG9pbnRzLT5kYXRhLmlbaV07CisgICAgICAgIGRvdWJsZSBoWzNdLCB2WzNdLCBkMVszXSwgZDJbM107CisgICAgICAgIGRvdWJsZSBuWzRdID0gezAsMCwwLDB9OworICAgICAgICBDdk1hdCBfbSwgX007CisgICAgICAgIGN2R2V0Q29scyggb2JqZWN0UG9pbnRzLCAmX00sIHBvcywgcG9zICsgbmkgKTsKKyAgICAgICAgY3ZHZXRDb2xzKCBpbWFnZVBvaW50cywgJl9tLCBwb3MsIHBvcyArIG5pICk7CisKKyAgICAgICAgY3ZGaW5kSG9tb2dyYXBoeSggJl9NLCAmX20sICZfSCApOworICAgICAgICBtZW1jcHkoIF9hbGxILT5kYXRhLmRiICsgaSo5LCBILCBzaXplb2YoSCkgKTsKKworICAgICAgICBIWzBdIC09IEhbNl0qYVsyXTsgSFsxXSAtPSBIWzddKmFbMl07IEhbMl0gLT0gSFs4XSphWzJdOworICAgICAgICBIWzNdIC09IEhbNl0qYVs1XTsgSFs0XSAtPSBIWzddKmFbNV07IEhbNV0gLT0gSFs4XSphWzVdOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdDAgPSBIW2oqM10sIHQxID0gSFtqKjMrMV07CisgICAgICAgICAgICBoW2pdID0gdDA7IHZbal0gPSB0MTsKKyAgICAgICAgICAgIGQxW2pdID0gKHQwICsgdDEpKjAuNTsKKyAgICAgICAgICAgIGQyW2pdID0gKHQwIC0gdDEpKjAuNTsKKyAgICAgICAgICAgIG5bMF0gKz0gdDAqdDA7IG5bMV0gKz0gdDEqdDE7CisgICAgICAgICAgICBuWzJdICs9IGQxW2pdKmQxW2pdOyBuWzNdICs9IGQyW2pdKmQyW2pdOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICBuW2pdID0gMS4vc3FydChuW2pdKTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgMzsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaFtqXSAqPSBuWzBdOyB2W2pdICo9IG5bMV07CisgICAgICAgICAgICBkMVtqXSAqPSBuWzJdOyBkMltqXSAqPSBuWzNdOworICAgICAgICB9CisKKyAgICAgICAgQXBbMF0gPSBoWzBdKnZbMF07IEFwWzFdID0gaFsxXSp2WzFdOworICAgICAgICBBcFsyXSA9IGQxWzBdKmQyWzBdOyBBcFszXSA9IGQxWzFdKmQyWzFdOworICAgICAgICBicFswXSA9IC1oWzJdKnZbMl07IGJwWzFdID0gLWQxWzJdKmQyWzJdOworICAgIH0KKworICAgIGN2U29sdmUoIF9BLCBfYiwgJl9mLCBDVl9MU1EgfCBDVl9TVkQgKTsKKyAgICBhWzBdID0gc3FydChmYWJzKDEuL2ZbMF0pKTsKKyAgICBhWzRdID0gc3FydChmYWJzKDEuL2ZbMV0pKTsKKyAgICBpZiggYXNwZWN0UmF0aW8gIT0gMCApCisgICAgeworICAgICAgICBkb3VibGUgdGYgPSAoYVswXSArIGFbNF0pLyhhc3BlY3RSYXRpbyArIDEuKTsKKyAgICAgICAgYVswXSA9IGFzcGVjdFJhdGlvKnRmOworICAgICAgICBhWzRdID0gdGY7CisgICAgfQorCisgICAgY3ZDb252ZXJ0KCAmX2EsIGNhbWVyYU1hdHJpeCApOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJl9BICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmX2IgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfYWxsSCApOworICAgIGN2UmVsZWFzZU1hdCggJl9hbGxLICk7Cit9CisKKworLyogZmluZHMgaW50cmluc2ljIGFuZCBleHRyaW5zaWMgY2FtZXJhIHBhcmFtZXRlcnMKKyAgIGZyb20gYSBmZXcgdmlld3Mgb2Yga25vd24gY2FsaWJyYXRpb24gcGF0dGVybiAqLworQ1ZfSU1QTCB2b2lkCitjdkNhbGlicmF0ZUNhbWVyYTIoIGNvbnN0IEN2TWF0KiBvYmplY3RQb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBpbWFnZVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIG5wb2ludHMsCisgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBjYW1lcmFNYXRyaXgsIEN2TWF0KiBkaXN0Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICBDdk1hdCogcnZlY3MsIEN2TWF0KiB0dmVjcywKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzICkKK3sKKyAgICBjb25zdCBpbnQgTklOVFJJTlNJQyA9IDk7CisgICAgQ3ZNYXQgKl9NID0gMCwgKl9tID0gMCwgKl9KaSA9IDAsICpfSmUgPSAwLCAqX2VyciA9IDA7CisgICAgQ3ZMZXZNYXJxIHNvbHZlcjsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxpYnJhdGVDYW1lcmEyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIEFbOV0sIGtbNV0gPSB7MCwwLDAsMCwwfTsKKyAgICBDdk1hdCBfQSA9IGN2TWF0KDMsIDMsIENWXzY0RiwgQSksIF9rOworICAgIGludCBpLCBuaW1hZ2VzLCBtYXhQb2ludHMgPSAwLCBuaSA9IDAsIHBvcywgdG90YWwgPSAwLCBucGFyYW1zLCBucHN0ZXAsIGNuOworICAgIGRvdWJsZSBhc3BlY3RSYXRpbyA9IDAuOworCisgICAgLy8gMC4gY2hlY2sgdGhlIHBhcmFtZXRlcnMgJiBhbGxvY2F0ZSBidWZmZXJzCisgICAgaWYoICFDVl9JU19NQVQob2JqZWN0UG9pbnRzKSB8fCAhQ1ZfSVNfTUFUKGltYWdlUG9pbnRzKSB8fAorICAgICAgICAhQ1ZfSVNfTUFUKG5wb2ludHMpIHx8ICFDVl9JU19NQVQoY2FtZXJhTWF0cml4KSB8fCAhQ1ZfSVNfTUFUKGRpc3RDb2VmZnMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk9uZSBvZiByZXF1aXJlZCB2ZWN0b3IgYXJndW1lbnRzIGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCBpbWFnZVNpemUud2lkdGggPD0gMCB8fCBpbWFnZVNpemUuaGVpZ2h0IDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImltYWdlIHdpZHRoIGFuZCBoZWlnaHQgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShucG9pbnRzLT50eXBlKSAhPSBDVl8zMlNDMSB8fAorICAgICAgICAobnBvaW50cy0+cm93cyAhPSAxICYmIG5wb2ludHMtPmNvbHMgIT0gMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAidGhlIGFycmF5IG9mIHBvaW50IGNvdW50ZXJzIG11c3QgYmUgMS1kaW1lbnNpb25hbCBpbnRlZ2VyIHZlY3RvciIgKTsKKworICAgIG5pbWFnZXMgPSBucG9pbnRzLT5yb3dzKm5wb2ludHMtPmNvbHM7CisgICAgbnBzdGVwID0gbnBvaW50cy0+cm93cyA9PSAxID8gMSA6IG5wb2ludHMtPnN0ZXAvQ1ZfRUxFTV9TSVpFKG5wb2ludHMtPnR5cGUpOworCisgICAgaWYoIHJ2ZWNzICkKKyAgICB7CisgICAgICAgIGNuID0gQ1ZfTUFUX0NOKHJ2ZWNzLT50eXBlKTsKKyAgICAgICAgaWYoICFDVl9JU19NQVQocnZlY3MpIHx8CisgICAgICAgICAgICAoQ1ZfTUFUX0RFUFRIKHJ2ZWNzLT50eXBlKSAhPSBDVl8zMkYgJiYgQ1ZfTUFUX0RFUFRIKHJ2ZWNzLT50eXBlKSAhPSBDVl82NEYpIHx8CisgICAgICAgICAgICAoKHJ2ZWNzLT5yb3dzICE9IG5pbWFnZXMgfHwgKHJ2ZWNzLT5jb2xzKmNuICE9IDMgJiYgcnZlY3MtPmNvbHMqY24gIT0gOSkpICYmCisgICAgICAgICAgICAocnZlY3MtPnJvd3MgIT0gMSB8fCBydmVjcy0+Y29scyAhPSBuaW1hZ2VzIHx8IGNuICE9IDMpKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAidGhlIG91dHB1dCBhcnJheSBvZiByb3RhdGlvbiB2ZWN0b3JzIG11c3QgYmUgMy1jaGFubmVsICIKKyAgICAgICAgICAgICAgICAiMXhuIG9yIG54MSBhcnJheSBvciAxLWNoYW5uZWwgbngzIG9yIG54OSBhcnJheSwgd2hlcmUgbiBpcyB0aGUgbnVtYmVyIG9mIHZpZXdzIiApOworICAgIH0KKworICAgIGlmKCB0dmVjcyApCisgICAgeworICAgICAgICBjbiA9IENWX01BVF9DTih0dmVjcy0+dHlwZSk7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHR2ZWNzKSB8fAorICAgICAgICAgICAgKENWX01BVF9ERVBUSCh0dmVjcy0+dHlwZSkgIT0gQ1ZfMzJGICYmIENWX01BVF9ERVBUSCh0dmVjcy0+dHlwZSkgIT0gQ1ZfNjRGKSB8fAorICAgICAgICAgICAgKCh0dmVjcy0+cm93cyAhPSBuaW1hZ2VzIHx8IHR2ZWNzLT5jb2xzKmNuICE9IDMpICYmCisgICAgICAgICAgICAodHZlY3MtPnJvd3MgIT0gMSB8fCB0dmVjcy0+Y29scyAhPSBuaW1hZ2VzIHx8IGNuICE9IDMpKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAidGhlIG91dHB1dCBhcnJheSBvZiB0cmFuc2xhdGlvbiB2ZWN0b3JzIG11c3QgYmUgMy1jaGFubmVsICIKKyAgICAgICAgICAgICAgICAiMXhuIG9yIG54MSBhcnJheSBvciAxLWNoYW5uZWwgbngzIGFycmF5LCB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2Ygdmlld3MiICk7CisgICAgfQorCisgICAgaWYoIChDVl9NQVRfVFlQRShjYW1lcmFNYXRyaXgtPnR5cGUpICE9IENWXzMyRkMxICYmCisgICAgICAgIENWX01BVF9UWVBFKGNhbWVyYU1hdHJpeC0+dHlwZSkgIT0gQ1ZfNjRGQzEpIHx8CisgICAgICAgIGNhbWVyYU1hdHJpeC0+cm93cyAhPSAzIHx8IGNhbWVyYU1hdHJpeC0+Y29scyAhPSAzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJJbnRyaW5zaWMgcGFyYW1ldGVycyBtdXN0IGJlIDN4MyBmbG9hdGluZy1wb2ludCBtYXRyaXgiICk7CisKKyAgICBpZiggKENWX01BVF9UWVBFKGRpc3RDb2VmZnMtPnR5cGUpICE9IENWXzMyRkMxICYmCisgICAgICAgIENWX01BVF9UWVBFKGRpc3RDb2VmZnMtPnR5cGUpICE9IENWXzY0RkMxKSB8fAorICAgICAgICAoZGlzdENvZWZmcy0+Y29scyAhPSAxICYmIGRpc3RDb2VmZnMtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgKGRpc3RDb2VmZnMtPmNvbHMqZGlzdENvZWZmcy0+cm93cyAhPSA0ICYmCisgICAgICAgIGRpc3RDb2VmZnMtPmNvbHMqZGlzdENvZWZmcy0+cm93cyAhPSA1KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiRGlzdG9ydGlvbiBjb2VmZmljaWVudHMgbXVzdCBiZSA0eDEsIDF4NCwgNXgxIG9yIDF4NSBmbG9hdGluZy1wb2ludCBtYXRyaXgiICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmltYWdlczsgaSsrICkKKyAgICB7CisgICAgICAgIG5pID0gbnBvaW50cy0+ZGF0YS5pW2kqbnBzdGVwXTsKKyAgICAgICAgaWYoIG5pIDwgNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgYnVmWzEwMF07CisgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJUaGUgbnVtYmVyIG9mIHBvaW50cyBpbiB0aGUgdmlldyAjJWQgaXMgPCA0IiwgaSApOworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsIGJ1ZiApOworICAgICAgICB9CisgICAgICAgIG1heFBvaW50cyA9IE1BWCggbWF4UG9pbnRzLCBuaSApOworICAgICAgICB0b3RhbCArPSBuaTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBfTSA9IGN2Q3JlYXRlTWF0KCAxLCB0b3RhbCwgQ1ZfNjRGQzMgKSk7CisgICAgQ1ZfQ0FMTCggX20gPSBjdkNyZWF0ZU1hdCggMSwgdG90YWwsIENWXzY0RkMyICkpOworCisgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMoIG9iamVjdFBvaW50cywgX00gKSk7CisgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMoIGltYWdlUG9pbnRzLCBfbSApKTsKKworICAgIG5wYXJhbXMgPSBOSU5UUklOU0lDICsgbmltYWdlcyo2OworICAgIENWX0NBTEwoIF9KaSA9IGN2Q3JlYXRlTWF0KCBtYXhQb2ludHMqMiwgTklOVFJJTlNJQywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggX0plID0gY3ZDcmVhdGVNYXQoIG1heFBvaW50cyoyLCA2LCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBfZXJyID0gY3ZDcmVhdGVNYXQoIG1heFBvaW50cyoyLCAxLCBDVl82NEZDMSApKTsKKyAgICBjdlplcm8oIF9KaSApOworCisgICAgX2sgPSBjdk1hdCggZGlzdENvZWZmcy0+cm93cywgZGlzdENvZWZmcy0+Y29scywgQ1ZfTUFLRVRZUEUoQ1ZfNjRGLENWX01BVF9DTihkaXN0Q29lZmZzLT50eXBlKSksIGspOworICAgIGlmKCBkaXN0Q29lZmZzLT5yb3dzKmRpc3RDb2VmZnMtPmNvbHMqQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpID09IDQgKQorICAgICAgICBmbGFncyB8PSBDVl9DQUxJQl9GSVhfSzM7CisKKyAgICAvLyAxLiBpbml0aWFsaXplIGludHJpbnNpYyBwYXJhbWV0ZXJzICYgTE0gc29sdmVyCisgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfVVNFX0lOVFJJTlNJQ19HVUVTUyApCisgICAgeworICAgICAgICBjdkNvbnZlcnQoIGNhbWVyYU1hdHJpeCwgJl9BICk7CisgICAgICAgIGlmKCBBWzBdIDw9IDAgfHwgQVs0XSA8PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiRm9jYWwgbGVuZ3RoIChmeCBhbmQgZnkpIG11c3QgYmUgcG9zaXRpdmUiICk7CisgICAgICAgIGlmKCBBWzJdIDwgMCB8fCBBWzJdID49IGltYWdlU2l6ZS53aWR0aCB8fAorICAgICAgICAgICAgQVs1XSA8IDAgfHwgQVs1XSA+PSBpbWFnZVNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiUHJpbmNpcGFsIHBvaW50IG11c3QgYmUgd2l0aGluIHRoZSBpbWFnZSIgKTsKKyAgICAgICAgaWYoIGZhYnMoQVsxXSkgPiAxZS01ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTm9uLXplcm8gc2tldyBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBmdW5jdGlvbiIgKTsKKyAgICAgICAgaWYoIGZhYnMoQVszXSkgPiAxZS01IHx8IGZhYnMoQVs2XSkgPiAxZS01IHx8CisgICAgICAgICAgICBmYWJzKEFbN10pID4gMWUtNSB8fCBmYWJzKEFbOF0tMSkgPiAxZS01ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgICAgICJUaGUgaW50cmluc2ljIG1hdHJpeCBtdXN0IGhhdmUgW2Z4IDAgY3g7IDAgZnkgY3k7IDAgMCAxXSBzaGFwZSIgKTsKKyAgICAgICAgQVsxXSA9IEFbM10gPSBBWzZdID0gQVs3XSA9IDAuOworICAgICAgICBBWzhdID0gMS47CisKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX0FTUEVDVF9SQVRJTyApCisgICAgICAgICAgICBhc3BlY3RSYXRpbyA9IEFbMF0vQVs0XTsKKyAgICAgICAgY3ZDb252ZXJ0KCBkaXN0Q29lZmZzLCAmX2sgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTY2FsYXIgbWVhbiwgc2R2OworICAgICAgICBjdkF2Z1NkdiggX00sICZtZWFuLCAmc2R2ICk7CisgICAgICAgIGlmKCAoZmFicyhtZWFuLnZhbFsyXSkgPiAxZS01ICYmIGZhYnMobWVhbi52YWxbMl0gLSAxKSA+IDFlLTUpIHx8IGZhYnMoc2R2LnZhbFsyXSkgPiAxZS01ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiRm9yIG5vbi1wbGFuYXIgY2FsaWJyYXRpb24gcmlncyB0aGUgaW5pdGlhbCBpbnRyaW5zaWMgbWF0cml4IG11c3QgYmUgc3BlY2lmaWVkIiApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgICAgICAoKEN2UG9pbnQzRDY0ZiopX00tPmRhdGEuZGIpW2ldLnogPSAwLjsKKworICAgICAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9GSVhfQVNQRUNUX1JBVElPICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNwZWN0UmF0aW8gPSBjdm1HZXQoY2FtZXJhTWF0cml4LDAsMCk7CisgICAgICAgICAgICBhc3BlY3RSYXRpbyAvPSBjdm1HZXQoY2FtZXJhTWF0cml4LDEsMSk7CisgICAgICAgICAgICBpZiggYXNwZWN0UmF0aW8gPCAwLjAxIHx8IGFzcGVjdFJhdGlvID4gMTAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgIlRoZSBzcGVjaWZpZWQgYXNwZWN0IHJhdGlvICg9QVswXVswXS9BWzFdWzFdKSBpcyBpbmNvcnJlY3QiICk7CisgICAgICAgIH0KKyAgICAgICAgY3ZJbml0SW50cmluc2ljUGFyYW1zMkQoIF9NLCBfbSwgbnBvaW50cywgaW1hZ2VTaXplLCAmX0EsIGFzcGVjdFJhdGlvICk7CisgICAgfQorCisgICAgc29sdmVyLmluaXQoIG5wYXJhbXMsIDAsIGN2VGVybUNyaXRlcmlhKENWX1RFUk1DUklUX0lURVIrQ1ZfVEVSTUNSSVRfRVBTLDMwLERCTF9FUFNJTE9OKSApOworCisgICAgeworICAgIGRvdWJsZSogcGFyYW0gPSBzb2x2ZXIucGFyYW0tPmRhdGEuZGI7CisgICAgdWNoYXIqIG1hc2sgPSBzb2x2ZXIubWFzay0+ZGF0YS5wdHI7CisKKyAgICBwYXJhbVswXSA9IEFbMF07IHBhcmFtWzFdID0gQVs0XTsgcGFyYW1bMl0gPSBBWzJdOyBwYXJhbVszXSA9IEFbNV07CisgICAgcGFyYW1bNF0gPSBrWzBdOyBwYXJhbVs1XSA9IGtbMV07IHBhcmFtWzZdID0ga1syXTsgcGFyYW1bN10gPSBrWzNdOworICAgIHBhcmFtWzhdID0ga1s0XTsKKworICAgIGlmKCBmbGFncyAmIENWX0NBTElCX0ZJWF9GT0NBTF9MRU5HVEggKQorICAgICAgICBtYXNrWzBdID0gbWFza1sxXSA9IDA7CisgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX1BSSU5DSVBBTF9QT0lOVCApCisgICAgICAgIG1hc2tbMl0gPSBtYXNrWzNdID0gMDsKKyAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9aRVJPX1RBTkdFTlRfRElTVCApCisgICAgeworICAgICAgICBwYXJhbVs2XSA9IHBhcmFtWzddID0gMDsKKyAgICAgICAgbWFza1s2XSA9IG1hc2tbN10gPSAwOworICAgIH0KKyAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9GSVhfSzEgKQorICAgICAgICBtYXNrWzRdID0gMDsKKyAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9GSVhfSzIgKQorICAgICAgICBtYXNrWzVdID0gMDsKKyAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9GSVhfSzMgKQorICAgICAgICBtYXNrWzhdID0gMDsKKyAgICB9CisKKyAgICAvLyAyLiBpbml0aWFsaXplIGV4dHJpbnNpYyBwYXJhbWV0ZXJzCisgICAgZm9yKCBpID0gMCwgcG9zID0gMDsgaSA8IG5pbWFnZXM7IGkrKywgcG9zICs9IG5pICkKKyAgICB7CisgICAgICAgIEN2TWF0IF9NaSwgX21pLCBfcmksIF90aTsKKyAgICAgICAgbmkgPSBucG9pbnRzLT5kYXRhLmlbaSpucHN0ZXBdOworCisgICAgICAgIGN2R2V0Um93cyggc29sdmVyLnBhcmFtLCAmX3JpLCBOSU5UUklOU0lDICsgaSo2LCBOSU5UUklOU0lDICsgaSo2ICsgMyApOworICAgICAgICBjdkdldFJvd3MoIHNvbHZlci5wYXJhbSwgJl90aSwgTklOVFJJTlNJQyArIGkqNiArIDMsIE5JTlRSSU5TSUMgKyBpKjYgKyA2ICk7CisKKyAgICAgICAgY3ZHZXRDb2xzKCBfTSwgJl9NaSwgcG9zLCBwb3MgKyBuaSApOworICAgICAgICBjdkdldENvbHMoIF9tLCAmX21pLCBwb3MsIHBvcyArIG5pICk7CisKKyAgICAgICAgY3ZGaW5kRXh0cmluc2ljQ2FtZXJhUGFyYW1zMiggJl9NaSwgJl9taSwgJl9BLCAmX2ssICZfcmksICZfdGkgKTsKKyAgICB9CisKKyAgICAvLyAzLiBydW4gdGhlIG9wdGltaXphdGlvbgorICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGNvbnN0IEN2TWF0KiBfcGFyYW0gPSAwOworICAgICAgICBDdk1hdCAqX0p0SiA9IDAsICpfSnRFcnIgPSAwOworICAgICAgICBkb3VibGUqIF9lcnJOb3JtID0gMDsKKyAgICAgICAgYm9vbCBwcm9jZWVkID0gc29sdmVyLnVwZGF0ZUFsdCggX3BhcmFtLCBfSnRKLCBfSnRFcnIsIF9lcnJOb3JtICk7CisgICAgICAgIGRvdWJsZSAqcGFyYW0gPSBzb2x2ZXIucGFyYW0tPmRhdGEuZGIsICpwcGFyYW0gPSBzb2x2ZXIucHJldlBhcmFtLT5kYXRhLmRiOworCisgICAgICAgIGlmKCBmbGFncyAmIENWX0NBTElCX0ZJWF9BU1BFQ1RfUkFUSU8gKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJhbVswXSA9IHBhcmFtWzFdKmFzcGVjdFJhdGlvOworICAgICAgICAgICAgcHBhcmFtWzBdID0gcHBhcmFtWzFdKmFzcGVjdFJhdGlvOworICAgICAgICB9CisKKyAgICAgICAgQVswXSA9IHBhcmFtWzBdOyBBWzRdID0gcGFyYW1bMV07CisgICAgICAgIEFbMl0gPSBwYXJhbVsyXTsgQVs1XSA9IHBhcmFtWzNdOworICAgICAgICBrWzBdID0gcGFyYW1bNF07IGtbMV0gPSBwYXJhbVs1XTsga1syXSA9IHBhcmFtWzZdOworICAgICAgICBrWzNdID0gcGFyYW1bN107CisgICAgICAgIGtbNF0gPSBwYXJhbVs4XTsKKworICAgICAgICBpZiggIXByb2NlZWQgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9yKCBpID0gMCwgcG9zID0gMDsgaSA8IG5pbWFnZXM7IGkrKywgcG9zICs9IG5pICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgX01pLCBfbWksIF9yaSwgX3RpLCBfZHBkciwgX2RwZHQsIF9kcGRmLCBfZHBkYywgX2RwZGssIF9tcCwgX3BhcnQ7CisgICAgICAgICAgICBuaSA9IG5wb2ludHMtPmRhdGEuaVtpKm5wc3RlcF07CisKKyAgICAgICAgICAgIGN2R2V0Um93cyggc29sdmVyLnBhcmFtLCAmX3JpLCBOSU5UUklOU0lDICsgaSo2LCBOSU5UUklOU0lDICsgaSo2ICsgMyApOworICAgICAgICAgICAgY3ZHZXRSb3dzKCBzb2x2ZXIucGFyYW0sICZfdGksIE5JTlRSSU5TSUMgKyBpKjYgKyAzLCBOSU5UUklOU0lDICsgaSo2ICsgNiApOworCisgICAgICAgICAgICBjdkdldENvbHMoIF9NLCAmX01pLCBwb3MsIHBvcyArIG5pICk7CisgICAgICAgICAgICBjdkdldENvbHMoIF9tLCAmX21pLCBwb3MsIHBvcyArIG5pICk7CisKKyAgICAgICAgICAgIF9KZS0+cm93cyA9IF9KaS0+cm93cyA9IF9lcnItPnJvd3MgPSBuaSoyOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBfSmUsICZfZHBkciwgMCwgMyApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBfSmUsICZfZHBkdCwgMywgNiApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBfSmksICZfZHBkZiwgMCwgMiApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBfSmksICZfZHBkYywgMiwgNCApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBfSmksICZfZHBkaywgNCwgTklOVFJJTlNJQyApOworICAgICAgICAgICAgY3ZSZXNoYXBlKCBfZXJyLCAmX21wLCAyLCAxICk7CisKKyAgICAgICAgICAgIGlmKCBfSnRKIHx8IF9KdEVyciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZQcm9qZWN0UG9pbnRzMiggJl9NaSwgJl9yaSwgJl90aSwgJl9BLCAmX2ssICZfbXAsICZfZHBkciwgJl9kcGR0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIENWX0NBTElCX0ZJWF9GT0NBTF9MRU5HVEgpID8gMCA6ICZfZHBkZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBDVl9DQUxJQl9GSVhfUFJJTkNJUEFMX1BPSU5UKSA/IDAgOiAmX2RwZGMsICZfZHBkaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBDVl9DQUxJQl9GSVhfQVNQRUNUX1JBVElPKSA/IGFzcGVjdFJhdGlvIDogMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3ZQcm9qZWN0UG9pbnRzMiggJl9NaSwgJl9yaSwgJl90aSwgJl9BLCAmX2ssICZfbXAgKTsKKworICAgICAgICAgICAgY3ZTdWIoICZfbXAsICZfbWksICZfbXAgKTsKKworICAgICAgICAgICAgaWYoIF9KdEogfHwgX0p0RXJyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoIF9KdEosICZfcGFydCwgY3ZSZWN0KDAsMCxOSU5UUklOU0lDLE5JTlRSSU5TSUMpICk7CisgICAgICAgICAgICAgICAgY3ZHRU1NKCBfSmksIF9KaSwgMSwgJl9wYXJ0LCAxLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoIF9KdEosICZfcGFydCwgY3ZSZWN0KE5JTlRSSU5TSUMraSo2LE5JTlRSSU5TSUMraSo2LDYsNikgKTsKKyAgICAgICAgICAgICAgICBjdkdFTU0oIF9KZSwgX0plLCAxLCAwLCAwLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoIF9KdEosICZfcGFydCwgY3ZSZWN0KE5JTlRSSU5TSUMraSo2LDAsNixOSU5UUklOU0lDKSApOworICAgICAgICAgICAgICAgIGN2R0VNTSggX0ppLCBfSmUsIDEsIDAsIDAsICZfcGFydCwgQ1ZfR0VNTV9BX1QgKTsKKworICAgICAgICAgICAgICAgIGN2R2V0Um93cyggX0p0RXJyLCAmX3BhcnQsIDAsIE5JTlRSSU5TSUMgKTsKKyAgICAgICAgICAgICAgICBjdkdFTU0oIF9KaSwgX2VyciwgMSwgJl9wYXJ0LCAxLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgICAgICAgICBjdkdldFJvd3MoIF9KdEVyciwgJl9wYXJ0LCBOSU5UUklOU0lDICsgaSo2LCBOSU5UUklOU0lDICsgKGkrMSkqNiApOworICAgICAgICAgICAgICAgIGN2R0VNTSggX0plLCBfZXJyLCAxLCAwLCAwLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBfZXJyTm9ybSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGVyck5vcm0gPSBjdk5vcm0oICZfbXAsIDAsIENWX0wyICk7CisgICAgICAgICAgICAgICAgKl9lcnJOb3JtICs9IGVyck5vcm0qZXJyTm9ybTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDQuIHN0b3JlIHRoZSByZXN1bHRzCisgICAgY3ZDb252ZXJ0KCAmX0EsIGNhbWVyYU1hdHJpeCApOworICAgIGN2Q29udmVydCggJl9rLCBkaXN0Q29lZmZzICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmltYWdlczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2TWF0IHNyYywgZHN0OworICAgICAgICBpZiggcnZlY3MgKQorICAgICAgICB7CisgICAgICAgICAgICBzcmMgPSBjdk1hdCggMywgMSwgQ1ZfNjRGLCBzb2x2ZXIucGFyYW0tPmRhdGEuZGIgKyBOSU5UUklOU0lDICsgaSo2ICk7CisgICAgICAgICAgICBpZiggcnZlY3MtPnJvd3MgPT0gbmltYWdlcyAmJiBydmVjcy0+Y29scypDVl9NQVRfQ04ocnZlY3MtPnR5cGUpID09IDkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdCA9IGN2TWF0KCAzLCAzLCBDVl9NQVRfREVQVEgocnZlY3MtPnR5cGUpLAorICAgICAgICAgICAgICAgICAgICBydmVjcy0+ZGF0YS5wdHIgKyBydmVjcy0+c3RlcCppICk7CisgICAgICAgICAgICAgICAgY3ZSb2RyaWd1ZXMyKCAmc3JjLCAmX0EgKTsKKyAgICAgICAgICAgICAgICBjdkNvbnZlcnQoICZfQSwgJmRzdCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdCA9IGN2TWF0KCAzLCAxLCBDVl9NQVRfREVQVEgocnZlY3MtPnR5cGUpLCBydmVjcy0+cm93cyA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgcnZlY3MtPmRhdGEucHRyICsgaSpDVl9FTEVNX1NJWkUocnZlY3MtPnR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgcnZlY3MtPmRhdGEucHRyICsgcnZlY3MtPnN0ZXAqaSApOworICAgICAgICAgICAgICAgIGN2Q29udmVydCggJnNyYywgJmRzdCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB0dmVjcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYyA9IGN2TWF0KCAzLCAxLCBDVl82NEYsIHNvbHZlci5wYXJhbS0+ZGF0YS5kYiArIE5JTlRSSU5TSUMgKyBpKjYgKyAzICk7CisgICAgICAgICAgICBkc3QgPSBjdk1hdCggMywgMSwgQ1ZfTUFUX1RZUEUodHZlY3MtPnR5cGUpLCB0dmVjcy0+cm93cyA9PSAxID8KKyAgICAgICAgICAgICAgICAgICAgdHZlY3MtPmRhdGEucHRyICsgaSpDVl9FTEVNX1NJWkUodHZlY3MtPnR5cGUpIDoKKyAgICAgICAgICAgICAgICAgICAgdHZlY3MtPmRhdGEucHRyICsgdHZlY3MtPnN0ZXAqaSApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCAmc3JjLCAmZHN0ICk7CisgICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJl9NICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmX20gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfSmkgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfSmUgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfZXJyICk7Cit9CisKKwordm9pZCBjdkNhbGlicmF0aW9uTWF0cml4VmFsdWVzKCBjb25zdCBDdk1hdCAqY2FsaWJNYXRyLCBDdlNpemUgaW1nU2l6ZSwKKyAgICBkb3VibGUgYXBlcnR1cmVXaWR0aCwgZG91YmxlIGFwZXJ0dXJlSGVpZ2h0LCBkb3VibGUgKmZvdngsIGRvdWJsZSAqZm92eSwKKyAgICBkb3VibGUgKmZvY2FsTGVuZ3RoLCBDdlBvaW50MkQ2NGYgKnByaW5jaXBhbFBvaW50LCBkb3VibGUgKnBhc3AgKQoreworICAgIGRvdWJsZSBhbHBoYXgsIGFscGhheSwgbXgsIG15OworICAgIGludCBpbWdXaWR0aCA9IGltZ1NpemUud2lkdGgsIGltZ0hlaWdodCA9IGltZ1NpemUuaGVpZ2h0OworCisgICAgQ1ZfRlVOQ05BTUUoImN2Q2FsaWJyYXRpb25NYXRyaXhWYWx1ZXMiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBWYWxpZGF0ZSBwYXJhbWV0ZXJzLiAqLworCisgICAgaWYoY2FsaWJNYXRyID09IDApCisgICAgICAgIENWX0VSUk9SKENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIhIik7CisKKyAgICBpZighQ1ZfSVNfTUFUKGNhbGliTWF0cikpCisgICAgICAgIENWX0VSUk9SKENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyBtdXN0IGJlIGEgbWF0cmljZXMhIik7CisKKyAgICBpZihjYWxpYk1hdHItPmNvbHMgIT0gMyB8fCBjYWxpYk1hdHItPnJvd3MgIT0gMykKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIG1hdHJpY2VzIG11c3QgYmUgM3gzISIpOworCisgICAgYWxwaGF4ID0gY3ZtR2V0KGNhbGliTWF0ciwgMCwgMCk7CisgICAgYWxwaGF5ID0gY3ZtR2V0KGNhbGliTWF0ciwgMSwgMSk7CisgICAgYXNzZXJ0KGltZ1dpZHRoICE9IDAgJiYgaW1nSGVpZ2h0ICE9IDAgJiYgYWxwaGF4ICE9IDAuMCAmJiBhbHBoYXkgIT0gMC4wKTsKKworICAgIC8qIENhbGN1bGF0ZSBwaXhlbCBhc3BlY3QgcmF0aW8uICovCisgICAgaWYocGFzcCkKKyAgICAgICAgKnBhc3AgPSBhbHBoYXkgLyBhbHBoYXg7CisKKyAgICAvKiBDYWxjdWxhdGUgbnVtYmVyIG9mIHBpeGVsIHBlciByZWFsd29ybGQgdW5pdC4gKi8KKworICAgIGlmKGFwZXJ0dXJlV2lkdGggIT0gMC4wICYmIGFwZXJ0dXJlSGVpZ2h0ICE9IDAuMCkgeworICAgICAgICBteCA9IGltZ1dpZHRoIC8gYXBlcnR1cmVXaWR0aDsKKyAgICAgICAgbXkgPSBpbWdIZWlnaHQgLyBhcGVydHVyZUhlaWdodDsKKyAgICB9IGVsc2UgeworICAgICAgICBteCA9IDEuMDsKKyAgICAgICAgbXkgPSAqcGFzcDsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGUgZm92eCBhbmQgZm92eS4gKi8KKworICAgIGlmKGZvdngpCisgICAgICAgICpmb3Z4ID0gMiAqIGF0YW4oaW1nV2lkdGggLyAoMiAqIGFscGhheCkpICogMTgwLjAgLyBDVl9QSTsKKworICAgIGlmKGZvdnkpCisgICAgICAgICpmb3Z5ID0gMiAqIGF0YW4oaW1nSGVpZ2h0IC8gKDIgKiBhbHBoYXkpKSAqIDE4MC4wIC8gQ1ZfUEk7CisKKyAgICAvKiBDYWxjdWxhdGUgZm9jYWwgbGVuZ3RoLiAqLworCisgICAgaWYoZm9jYWxMZW5ndGgpCisgICAgICAgICpmb2NhbExlbmd0aCA9IGFscGhheCAvIG14OworCisgICAgLyogQ2FsY3VsYXRlIHByaW5jaXBsZSBwb2ludC4gKi8KKworICAgIGlmKHByaW5jaXBhbFBvaW50KQorICAgICAgICAqcHJpbmNpcGFsUG9pbnQgPSBjdlBvaW50MkQ2NGYoY3ZtR2V0KGNhbGliTWF0ciwgMCwgMikgLyBteCwgY3ZtR2V0KGNhbGliTWF0ciwgMSwgMikgLyBteSk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFN0ZXJlbyBDYWxpYnJhdGlvbiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdGF0aWMgaW50IGRiQ21wKCBjb25zdCB2b2lkKiBfYSwgY29uc3Qgdm9pZCogX2IgKQoreworICAgIGRvdWJsZSBhID0gKihjb25zdCBkb3VibGUqKV9hOworICAgIGRvdWJsZSBiID0gKihjb25zdCBkb3VibGUqKV9iOworCisgICAgcmV0dXJuIChhID4gYikgLSAoYSA8IGIpOworfQorCisKK3ZvaWQgY3ZTdGVyZW9DYWxpYnJhdGUoIGNvbnN0IEN2TWF0KiBfb2JqZWN0UG9pbnRzLCBjb25zdCBDdk1hdCogX2ltYWdlUG9pbnRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfaW1hZ2VQb2ludHMyLCBjb25zdCBDdk1hdCogX25wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogX2NhbWVyYU1hdHJpeDEsIEN2TWF0KiBfZGlzdENvZWZmczEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogX2NhbWVyYU1hdHJpeDIsIEN2TWF0KiBfZGlzdENvZWZmczIsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgaW1hZ2VTaXplLCBDdk1hdCogX1IsIEN2TWF0KiBfVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBfRSwgQ3ZNYXQqIF9GLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgdGVybUNyaXQsIGludCBmbGFncyApCit7CisgICAgY29uc3QgaW50IE5JTlRSSU5TSUMgPSA5OworICAgIEN2TWF0KiBucG9pbnRzID0gMDsKKyAgICBDdk1hdCogZXJyID0gMDsKKyAgICBDdk1hdCogSl9MUiA9IDA7CisgICAgQ3ZNYXQqIEplID0gMDsKKyAgICBDdk1hdCogSmkgPSAwOworICAgIEN2TWF0KiBpbWFnZVBvaW50c1syXSA9IHswLDB9OworICAgIEN2TWF0KiBvYmplY3RQb2ludHMgPSAwOworICAgIEN2TWF0KiBSVDAgPSAwOworICAgIEN2TGV2TWFycSBzb2x2ZXI7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U3RlcmVvQ2FsaWJyYXRlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIEFbMl1bOV0sIGRrWzJdWzVdPXt7MCwwLDAsMCwwfSx7MCwwLDAsMCwwfX0sIHJscls5XTsKKyAgICBDdk1hdCBLWzJdLCBEaXN0WzJdLCBvbV9MUiwgVF9MUjsKKyAgICBDdk1hdCBSX0xSID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBybHIpOworICAgIGludCBpLCBrLCBwLCBuaSA9IDAsIG9mcywgbmltYWdlcywgcG9pbnRzVG90YWwsIG1heFBvaW50cyA9IDA7CisgICAgaW50IG5wYXJhbXM7CisgICAgYm9vbCByZWNvbXB1dGVJbnRyaW5zaWNzID0gZmFsc2U7CisgICAgZG91YmxlIGFzcGVjdFJhdGlvWzJdID0gezAsMH07CisKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChfaW1hZ2VQb2ludHMxKSAmJiBDVl9JU19NQVQoX2ltYWdlUG9pbnRzMikgJiYKKyAgICAgICAgICAgICAgIENWX0lTX01BVChfb2JqZWN0UG9pbnRzKSAmJiBDVl9JU19NQVQoX25wb2ludHMpICYmCisgICAgICAgICAgICAgICBDVl9JU19NQVQoX1IpICYmIENWX0lTX01BVChfVCkgKTsKKworICAgIENWX0FTU0VSVCggQ1ZfQVJFX1RZUEVTX0VRKF9pbWFnZVBvaW50czEsIF9pbWFnZVBvaW50czIpICYmCisgICAgICAgICAgICAgICBDVl9BUkVfREVQVEhTX0VRKF9pbWFnZVBvaW50czEsIF9vYmplY3RQb2ludHMpICk7CisKKyAgICBDVl9BU1NFUlQoIChfbnBvaW50cy0+Y29scyA9PSAxIHx8IF9ucG9pbnRzLT5yb3dzID09IDEpICYmCisgICAgICAgICAgICAgICBDVl9NQVRfVFlQRShfbnBvaW50cy0+dHlwZSkgPT0gQ1ZfMzJTQzEgKTsKKworICAgIG5pbWFnZXMgPSBfbnBvaW50cy0+Y29scyArIF9ucG9pbnRzLT5yb3dzIC0gMTsKKyAgICBucG9pbnRzID0gY3ZDcmVhdGVNYXQoIF9ucG9pbnRzLT5yb3dzLCBfbnBvaW50cy0+Y29scywgX25wb2ludHMtPnR5cGUgKTsKKyAgICBjdkNvcHkoIF9ucG9pbnRzLCBucG9pbnRzICk7CisKKyAgICBmb3IoIGkgPSAwLCBwb2ludHNUb3RhbCA9IDA7IGkgPCBuaW1hZ2VzOyBpKysgKQorICAgIHsKKyAgICAgICAgbWF4UG9pbnRzID0gTUFYKG1heFBvaW50cywgbnBvaW50cy0+ZGF0YS5pW2ldKTsKKyAgICAgICAgcG9pbnRzVG90YWwgKz0gbnBvaW50cy0+ZGF0YS5pW2ldOworICAgIH0KKworICAgIG9iamVjdFBvaW50cyA9IGN2Q3JlYXRlTWF0KCBfb2JqZWN0UG9pbnRzLT5yb3dzLCBfb2JqZWN0UG9pbnRzLT5jb2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl82NEZDKENWX01BVF9DTihfb2JqZWN0UG9pbnRzLT50eXBlKSkpOworICAgIGN2Q29udmVydCggX29iamVjdFBvaW50cywgb2JqZWN0UG9pbnRzICk7CisgICAgY3ZSZXNoYXBlKCBvYmplY3RQb2ludHMsIG9iamVjdFBvaW50cywgMywgMSApOworCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBjb25zdCBDdk1hdCogcG9pbnRzID0gayA9PSAwID8gX2ltYWdlUG9pbnRzMSA6IF9pbWFnZVBvaW50czI7CisgICAgICAgIGNvbnN0IEN2TWF0KiBjYW1lcmFNYXRyaXggPSBrID09IDAgPyBfY2FtZXJhTWF0cml4MSA6IF9jYW1lcmFNYXRyaXgyOworICAgICAgICBjb25zdCBDdk1hdCogZGlzdENvZWZmcyA9IGsgPT0gMCA/IF9kaXN0Q29lZmZzMSA6IF9kaXN0Q29lZmZzMjsKKworICAgICAgICBpbnQgY24gPSBDVl9NQVRfQ04oX2ltYWdlUG9pbnRzMS0+dHlwZSk7CisgICAgICAgIENWX0FTU0VSVCggKENWX01BVF9ERVBUSChfaW1hZ2VQb2ludHMxLT50eXBlKSA9PSBDVl8zMkYgfHwKKyAgICAgICAgICAgICAgICBDVl9NQVRfREVQVEgoX2ltYWdlUG9pbnRzMS0+dHlwZSkgPT0gQ1ZfNjRGKSAmJgorICAgICAgICAgICAgICAgKChfaW1hZ2VQb2ludHMxLT5yb3dzID09IHBvaW50c1RvdGFsICYmIF9pbWFnZVBvaW50czEtPmNvbHMqY24gPT0gMikgfHwKKyAgICAgICAgICAgICAgICAoX2ltYWdlUG9pbnRzMS0+cm93cyA9PSAxICYmIF9pbWFnZVBvaW50czEtPmNvbHMgPT0gcG9pbnRzVG90YWwgJiYgY24gPT0gMikpICk7CisKKyAgICAgICAgS1trXSA9IGN2TWF0KDMsMyxDVl82NEYsQVtrXSk7CisgICAgICAgIERpc3Rba10gPSBjdk1hdCgxLDUsQ1ZfNjRGLGRrW2tdKTsKKworICAgICAgICBpbWFnZVBvaW50c1trXSA9IGN2Q3JlYXRlTWF0KCBwb2ludHMtPnJvd3MsIHBvaW50cy0+Y29scywgQ1ZfNjRGQyhDVl9NQVRfQ04ocG9pbnRzLT50eXBlKSkpOworICAgICAgICBjdkNvbnZlcnQoIHBvaW50cywgaW1hZ2VQb2ludHNba10gKTsKKyAgICAgICAgY3ZSZXNoYXBlKCBpbWFnZVBvaW50c1trXSwgaW1hZ2VQb2ludHNba10sIDIsIDEgKTsKKworICAgICAgICBpZiggZmxhZ3MgJiAoQ1ZfQ0FMSUJfRklYX0lOVFJJTlNJQ3xDVl9DQUxJQl9VU0VfSU5UUklOU0lDX0dVRVNTfAorICAgICAgICAgICAgQ1ZfQ0FMSUJfRklYX0FTUEVDVF9SQVRJT3xDVl9DQUxJQl9GSVhfRk9DQUxfTEVOR1RIKSApCisgICAgICAgICAgICBjdkNvbnZlcnQoIGNhbWVyYU1hdHJpeCwgJktba10gKTsKKworICAgICAgICBpZiggZmxhZ3MgJiAoQ1ZfQ0FMSUJfRklYX0lOVFJJTlNJQ3xDVl9DQUxJQl9VU0VfSU5UUklOU0lDX0dVRVNTfAorICAgICAgICAgICAgQ1ZfQ0FMSUJfRklYX0sxfENWX0NBTElCX0ZJWF9LMnxDVl9DQUxJQl9GSVhfSzMpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgdGRpc3QgPSBjdk1hdCggZGlzdENvZWZmcy0+cm93cywgZGlzdENvZWZmcy0+Y29scywKKyAgICAgICAgICAgICAgICBDVl9NQUtFVFlQRShDVl82NEYsQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpKSwgRGlzdFtrXS5kYXRhLmRiICk7CisgICAgICAgICAgICBjdkNvbnZlcnQoIGRpc3RDb2VmZnMsICZ0ZGlzdCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEoZmxhZ3MgJiAoQ1ZfQ0FMSUJfRklYX0lOVFJJTlNJQ3xDVl9DQUxJQl9VU0VfSU5UUklOU0lDX0dVRVNTKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Q2FsaWJyYXRlQ2FtZXJhMiggb2JqZWN0UG9pbnRzLCBpbWFnZVBvaW50c1trXSwKKyAgICAgICAgICAgICAgICBucG9pbnRzLCBpbWFnZVNpemUsICZLW2tdLCAmRGlzdFtrXSwgMCwgMCwgZmxhZ3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBmbGFncyAmIENWX0NBTElCX1NBTUVfRk9DQUxfTEVOR1RIICkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYXZnX2lkeFtdID0geyAwLCA0LCAyLCA1LCAtMSB9OworICAgICAgICBmb3IoIGsgPSAwOyBhdmdfaWR4W2tdID49IDA7IGsrKyApCisgICAgICAgICAgICBBWzBdW2F2Z19pZHhba11dID0gQVsxXVthdmdfaWR4W2tdXSA9IChBWzBdW2F2Z19pZHhba11dICsgQVsxXVthdmdfaWR4W2tdXSkqMC41OworICAgIH0KKworICAgIGlmKCBmbGFncyAmIENWX0NBTElCX0ZJWF9BU1BFQ1RfUkFUSU8gKQorICAgIHsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgICAgICBhc3BlY3RSYXRpb1trXSA9IEFba11bMF0vQVtrXVs0XTsKKyAgICB9CisKKyAgICByZWNvbXB1dGVJbnRyaW5zaWNzID0gKGZsYWdzICYgQ1ZfQ0FMSUJfRklYX0lOVFJJTlNJQykgPT0gMDsKKworICAgIGVyciA9IGN2Q3JlYXRlTWF0KCBtYXhQb2ludHMqMiwgMSwgQ1ZfNjRGICk7CisgICAgSmUgPSBjdkNyZWF0ZU1hdCggbWF4UG9pbnRzKjIsIDYsIENWXzY0RiApOworICAgIEpfTFIgPSBjdkNyZWF0ZU1hdCggbWF4UG9pbnRzKjIsIDYsIENWXzY0RiApOworICAgIEppID0gY3ZDcmVhdGVNYXQoIG1heFBvaW50cyoyLCBOSU5UUklOU0lDLCBDVl82NEYgKTsKKyAgICBjdlplcm8oIEppICk7CisKKyAgICAvLyB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGludGVyLWNhbWVyYSBSKDMpLHQoMyksIHRoZW4sIG9wdGlvbmFsbHksCisgICAgLy8gZm9yIGludHJpbmlzaWMgcGFyYW1ldGVycyBvZiBlYWNoIGNhbWVyYSAoKGZ4LGZ5LGN4LGN5LGsxLGsyLHAxLHAyKSB+IDggcGFyYW1ldGVycykuCisgICAgbnBhcmFtcyA9IDYqKG5pbWFnZXMrMSkgKyAocmVjb21wdXRlSW50cmluc2ljcyA/IE5JTlRSSU5TSUMqMiA6IDApOworCisgICAgLy8gc3RvcmFnZSBmb3IgaW5pdGlhbCBbb20oUil7aX18dHtpfV0gKGluIG9yZGVyIHRvIGNvbXB1dGUgdGhlIG1lZGlhbiBmb3IgZWFjaCBjb21wb25lbnQpCisgICAgUlQwID0gY3ZDcmVhdGVNYXQoIDYsIG5pbWFnZXMsIENWXzY0RiApOworCisgICAgc29sdmVyLmluaXQoIG5wYXJhbXMsIDAsIHRlcm1Dcml0ICk7CisgICAgaWYoIHJlY29tcHV0ZUludHJpbnNpY3MgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIGltYXNrID0gc29sdmVyLm1hc2stPmRhdGEucHRyICsgbnBhcmFtcyAtIE5JTlRSSU5TSUMqMjsKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX0FTUEVDVF9SQVRJTyApCisgICAgICAgICAgICBpbWFza1swXSA9IGltYXNrW05JTlRSSU5TSUNdID0gMDsKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX0ZPQ0FMX0xFTkdUSCApCisgICAgICAgICAgICBpbWFza1swXSA9IGltYXNrWzFdID0gaW1hc2tbTklOVFJJTlNJQ10gPSBpbWFza1tOSU5UUklOU0lDKzFdID0gMDsKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX1BSSU5DSVBBTF9QT0lOVCApCisgICAgICAgICAgICBpbWFza1syXSA9IGltYXNrWzNdID0gaW1hc2tbTklOVFJJTlNJQysyXSA9IGltYXNrW05JTlRSSU5TSUMrM10gPSAwOworICAgICAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9aRVJPX1RBTkdFTlRfRElTVCApCisgICAgICAgICAgICBpbWFza1s2XSA9IGltYXNrWzddID0gaW1hc2tbTklOVFJJTlNJQys2XSA9IGltYXNrW05JTlRSSU5TSUMrN10gPSAwOworICAgICAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9GSVhfSzEgKQorICAgICAgICAgICAgaW1hc2tbNF0gPSBpbWFza1tOSU5UUklOU0lDKzRdID0gMDsKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfRklYX0syICkKKyAgICAgICAgICAgIGltYXNrWzVdID0gaW1hc2tbTklOVFJJTlNJQys1XSA9IDA7CisgICAgICAgIGlmKCBmbGFncyAmIENWX0NBTElCX0ZJWF9LMyApCisgICAgICAgICAgICBpbWFza1s4XSA9IGltYXNrW05JTlRSSU5TSUMrOF0gPSAwOworICAgIH0KKworICAgIC8qCisgICAgICAgQ29tcHV0ZSBpbml0aWFsIGVzdGltYXRlIG9mIHBvc2UKKworICAgICAgIEZvciBlYWNoIGltYWdlLCBjb21wdXRlOgorICAgICAgICAgIFIob20pIGlzIHRoZSByb3RhdGlvbiBtYXRyaXggb2Ygb20KKyAgICAgICAgICBvbShSKSBpcyB0aGUgcm90YXRpb24gdmVjdG9yIG9mIFIKKyAgICAgICAgICBSX3JlZiA9IFIob21fcmlnaHQpICogUihvbV9sZWZ0KScKKyAgICAgICAgICBUX3JlZl9saXN0ID0gW1RfcmVmX2xpc3Q7IFRfcmlnaHQgLSBSX3JlZiAqIFRfbGVmdF0KKyAgICAgICAgICBvbV9yZWZfbGlzdCA9IHtvbV9yZWZfbGlzdDsgb20oUl9yZWYpXQorCisgICAgICAgb20gPSBtZWRpYW4ob21fcmVmX2xpc3QpCisgICAgICAgVCA9IG1lZGlhbihUX3JlZl9saXN0KQorICAgICovCisgICAgZm9yKCBpID0gb2ZzID0gMDsgaSA8IG5pbWFnZXM7IG9mcyArPSBuaSwgaSsrICkKKyAgICB7CisgICAgICAgIG5pID0gbnBvaW50cy0+ZGF0YS5pW2ldOworICAgICAgICBDdk1hdCBvYmpwdF9pOworICAgICAgICBkb3VibGUgX29tWzJdWzNdLCByWzJdWzldLCB0WzJdWzNdOworICAgICAgICBDdk1hdCBvbVsyXSwgUlsyXSwgVFsyXSwgaW1ncHRfaVsyXTsKKworICAgICAgICBvYmpwdF9pID0gY3ZNYXQoMSwgbmksIENWXzY0RkMzLCBvYmplY3RQb2ludHMtPmRhdGEuZGIgKyBvZnMqMyk7CisgICAgICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbWdwdF9pW2tdID0gY3ZNYXQoMSwgbmksIENWXzY0RkMyLCBpbWFnZVBvaW50c1trXS0+ZGF0YS5kYiArIG9mcyoyKTsKKyAgICAgICAgICAgIG9tW2tdID0gY3ZNYXQoMywgMSwgQ1ZfNjRGLCBfb21ba10pOworICAgICAgICAgICAgUltrXSA9IGN2TWF0KDMsIDMsIENWXzY0RiwgcltrXSk7CisgICAgICAgICAgICBUW2tdID0gY3ZNYXQoMywgMSwgQ1ZfNjRGLCB0W2tdKTsKKworICAgICAgICAgICAgLy8gRklYTUU6IGhlcmUgd2UgaWdub3JlIGFjdGl2ZVBvaW50c1trXSBiZWNhdXNlIG9mCisgICAgICAgICAgICAvLyB0aGUgbGltaXRlZCBBUEkgb2YgY3ZGaW5kRXh0cm5pc2ljQ2FtZXJhUGFyYW1zMgorICAgICAgICAgICAgY3ZGaW5kRXh0cmluc2ljQ2FtZXJhUGFyYW1zMiggJm9ianB0X2ksICZpbWdwdF9pW2tdLCAmS1trXSwgJkRpc3Rba10sICZvbVtrXSwgJlRba10gKTsKKyAgICAgICAgICAgIGN2Um9kcmlndWVzMiggJm9tW2tdLCAmUltrXSApOworICAgICAgICAgICAgaWYoIGsgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gc2F2ZSBpbml0aWFsIG9tX2xlZnQgYW5kIFRfbGVmdAorICAgICAgICAgICAgICAgIHNvbHZlci5wYXJhbS0+ZGF0YS5kYlsoaSsxKSo2XSA9IF9vbVswXVswXTsKKyAgICAgICAgICAgICAgICBzb2x2ZXIucGFyYW0tPmRhdGEuZGJbKGkrMSkqNiArIDFdID0gX29tWzBdWzFdOworICAgICAgICAgICAgICAgIHNvbHZlci5wYXJhbS0+ZGF0YS5kYlsoaSsxKSo2ICsgMl0gPSBfb21bMF1bMl07CisgICAgICAgICAgICAgICAgc29sdmVyLnBhcmFtLT5kYXRhLmRiWyhpKzEpKjYgKyAzXSA9IHRbMF1bMF07CisgICAgICAgICAgICAgICAgc29sdmVyLnBhcmFtLT5kYXRhLmRiWyhpKzEpKjYgKyA0XSA9IHRbMF1bMV07CisgICAgICAgICAgICAgICAgc29sdmVyLnBhcmFtLT5kYXRhLmRiWyhpKzEpKjYgKyA1XSA9IHRbMF1bMl07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY3ZHRU1NKCAmUlsxXSwgJlJbMF0sIDEsIDAsIDAsICZSWzBdLCBDVl9HRU1NX0JfVCApOworICAgICAgICBjdkdFTU0oICZSWzBdLCAmVFswXSwgLTEsICZUWzFdLCAxLCAmVFsxXSApOworICAgICAgICBjdlJvZHJpZ3VlczIoICZSWzBdLCAmVFswXSApOworICAgICAgICBSVDAtPmRhdGEuZGJbaV0gPSB0WzBdWzBdOworICAgICAgICBSVDAtPmRhdGEuZGJbaSArIG5pbWFnZXNdID0gdFswXVsxXTsKKyAgICAgICAgUlQwLT5kYXRhLmRiW2kgKyBuaW1hZ2VzKjJdID0gdFswXVsyXTsKKyAgICAgICAgUlQwLT5kYXRhLmRiW2kgKyBuaW1hZ2VzKjNdID0gdFsxXVswXTsKKyAgICAgICAgUlQwLT5kYXRhLmRiW2kgKyBuaW1hZ2VzKjRdID0gdFsxXVsxXTsKKyAgICAgICAgUlQwLT5kYXRhLmRiW2kgKyBuaW1hZ2VzKjVdID0gdFsxXVsyXTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBtZWRpYW5zIGFuZCBzYXZlIHRoZSBmaXJzdCA2IHBhcmFtZXRlcnMKKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIHFzb3J0KCBSVDAtPmRhdGEuZGIgKyBpKm5pbWFnZXMsIG5pbWFnZXMsIENWX0VMRU1fU0laRShSVDAtPnR5cGUpLCBkYkNtcCApOworICAgICAgICBzb2x2ZXIucGFyYW0tPmRhdGEuZGJbaV0gPSBuaW1hZ2VzICUgMiAhPSAwID8gUlQwLT5kYXRhLmRiW2kqbmltYWdlcyArIG5pbWFnZXMvMl0gOgorICAgICAgICAgICAgKFJUMC0+ZGF0YS5kYltpKm5pbWFnZXMgKyBuaW1hZ2VzLzIgLSAxXSArIFJUMC0+ZGF0YS5kYltpKm5pbWFnZXMgKyBuaW1hZ2VzLzJdKSowLjU7CisgICAgfQorCisgICAgaWYoIHJlY29tcHV0ZUludHJpbnNpY3MgKQorICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlKiBpcGFyYW0gPSBzb2x2ZXIucGFyYW0tPmRhdGEuZGIgKyAobmltYWdlcysxKSo2ICsgaypOSU5UUklOU0lDOworICAgICAgICAgICAgaWYoIGZsYWdzICYgQ1ZfQ0FMSUJfWkVST19UQU5HRU5UX0RJU1QgKQorICAgICAgICAgICAgICAgIGRrW2tdWzJdID0gZGtba11bM10gPSAwOworICAgICAgICAgICAgaXBhcmFtWzBdID0gQVtrXVswXTsgaXBhcmFtWzFdID0gQVtrXVs0XTsgaXBhcmFtWzJdID0gQVtrXVsyXTsgaXBhcmFtWzNdID0gQVtrXVs1XTsKKyAgICAgICAgICAgIGlwYXJhbVs0XSA9IGRrW2tdWzBdOyBpcGFyYW1bNV0gPSBka1trXVsxXTsgaXBhcmFtWzZdID0gZGtba11bMl07CisgICAgICAgICAgICBpcGFyYW1bN10gPSBka1trXVszXTsgaXBhcmFtWzhdID0gZGtba11bNF07CisgICAgICAgIH0KKworICAgIG9tX0xSID0gY3ZNYXQoMywgMSwgQ1ZfNjRGLCBzb2x2ZXIucGFyYW0tPmRhdGEuZGIpOworICAgIFRfTFIgPSBjdk1hdCgzLCAxLCBDVl82NEYsIHNvbHZlci5wYXJhbS0+ZGF0YS5kYiArIDMpOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZNYXQqIHBhcmFtID0gMDsKKyAgICAgICAgQ3ZNYXQgdG1waW1hZ2VQb2ludHM7CisgICAgICAgIEN2TWF0ICpKdEogPSAwLCAqSnRFcnIgPSAwOworICAgICAgICBkb3VibGUqIGVyck5vcm0gPSAwOworICAgICAgICBkb3VibGUgX29tUlszXSwgX3RSWzNdOworICAgICAgICBkb3VibGUgX2RyM2RyMVs5XSwgX2RyM2RyMls5XSwgLypfZHQzZHIxWzldLCovIF9kdDNkcjJbOV0sIF9kdDNkdDFbOV0sIF9kdDNkdDJbOV07CisgICAgICAgIEN2TWF0IGRyM2RyMSA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX2RyM2RyMSk7CisgICAgICAgIEN2TWF0IGRyM2RyMiA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX2RyM2RyMik7CisgICAgICAgIC8vQ3ZNYXQgZHQzZHIxID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfZHQzZHIxKTsKKyAgICAgICAgQ3ZNYXQgZHQzZHIyID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfZHQzZHIyKTsKKyAgICAgICAgQ3ZNYXQgZHQzZHQxID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfZHQzZHQxKTsKKyAgICAgICAgQ3ZNYXQgZHQzZHQyID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfZHQzZHQyKTsKKyAgICAgICAgQ3ZNYXQgb21bMl0sIFRbMl0sIGltZ3B0X2lbMl07CisgICAgICAgIEN2TWF0IGRwZHJvdF9oZHIsIGRwZHRfaGRyLCBkcGRmX2hkciwgZHBkY19oZHIsIGRwZGtfaGRyOworICAgICAgICBDdk1hdCAqZHBkcm90ID0gJmRwZHJvdF9oZHIsICpkcGR0ID0gJmRwZHRfaGRyLCAqZHBkZiA9IDAsICpkcGRjID0gMCwgKmRwZGsgPSAwOworCisgICAgICAgIGlmKCAhc29sdmVyLnVwZGF0ZUFsdCggcGFyYW0sIEp0SiwgSnRFcnIsIGVyck5vcm0gKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGN2Um9kcmlndWVzMiggJm9tX0xSLCAmUl9MUiApOworICAgICAgICBvbVsxXSA9IGN2TWF0KDMsMSxDVl82NEYsX29tUik7CisgICAgICAgIFRbMV0gPSBjdk1hdCgzLDEsQ1ZfNjRGLF90Uik7CisKKyAgICAgICAgaWYoIHJlY29tcHV0ZUludHJpbnNpY3MgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIGlwYXJhbSA9IHNvbHZlci5wYXJhbS0+ZGF0YS5kYiArIChuaW1hZ2VzKzEpKjY7CisgICAgICAgICAgICBkb3VibGUqIGlwcGFyYW0gPSBzb2x2ZXIucHJldlBhcmFtLT5kYXRhLmRiICsgKG5pbWFnZXMrMSkqNjsKKyAgICAgICAgICAgIGRwZGYgPSAmZHBkZl9oZHI7CisgICAgICAgICAgICBkcGRjID0gJmRwZGNfaGRyOworICAgICAgICAgICAgZHBkayA9ICZkcGRrX2hkcjsKKyAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX0NBTElCX1NBTUVfRk9DQUxfTEVOR1RIICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpcGFyYW1bTklOVFJJTlNJQ10gPSBpcGFyYW1bMF07CisgICAgICAgICAgICAgICAgaXBhcmFtW05JTlRSSU5TSUMrMV0gPSBpcGFyYW1bMV07CisgICAgICAgICAgICAgICAgaXBwYXJhbVtOSU5UUklOU0lDXSA9IGlwcGFyYW1bMF07CisgICAgICAgICAgICAgICAgaXBwYXJhbVtOSU5UUklOU0lDKzFdID0gaXBwYXJhbVsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX0NBTElCX0ZJWF9BU1BFQ1RfUkFUSU8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlwYXJhbVswXSA9IGlwYXJhbVsxXSphc3BlY3RSYXRpb1swXTsKKyAgICAgICAgICAgICAgICBpcGFyYW1bTklOVFJJTlNJQ10gPSBpcGFyYW1bTklOVFJJTlNJQysxXSphc3BlY3RSYXRpb1sxXTsKKyAgICAgICAgICAgICAgICBpcHBhcmFtWzBdID0gaXBwYXJhbVsxXSphc3BlY3RSYXRpb1swXTsKKyAgICAgICAgICAgICAgICBpcHBhcmFtW05JTlRSSU5TSUNdID0gaXBwYXJhbVtOSU5UUklOU0lDKzFdKmFzcGVjdFJhdGlvWzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQVtrXVswXSA9IGlwYXJhbVtrKk5JTlRSSU5TSUMrMF07CisgICAgICAgICAgICAgICAgQVtrXVs0XSA9IGlwYXJhbVtrKk5JTlRSSU5TSUMrMV07CisgICAgICAgICAgICAgICAgQVtrXVsyXSA9IGlwYXJhbVtrKk5JTlRSSU5TSUMrMl07CisgICAgICAgICAgICAgICAgQVtrXVs1XSA9IGlwYXJhbVtrKk5JTlRSSU5TSUMrM107CisgICAgICAgICAgICAgICAgZGtba11bMF0gPSBpcGFyYW1baypOSU5UUklOU0lDKzRdOworICAgICAgICAgICAgICAgIGRrW2tdWzFdID0gaXBhcmFtW2sqTklOVFJJTlNJQys1XTsKKyAgICAgICAgICAgICAgICBka1trXVsyXSA9IGlwYXJhbVtrKk5JTlRSSU5TSUMrNl07CisgICAgICAgICAgICAgICAgZGtba11bM10gPSBpcGFyYW1baypOSU5UUklOU0lDKzddOworICAgICAgICAgICAgICAgIGRrW2tdWzRdID0gaXBhcmFtW2sqTklOVFJJTlNJQys4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IG9mcyA9IDA7IGkgPCBuaW1hZ2VzOyBvZnMgKz0gbmksIGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG5pID0gbnBvaW50cy0+ZGF0YS5pW2ldOworICAgICAgICAgICAgQ3ZNYXQgb2JqcHRfaSwgX3BhcnQ7CisKKyAgICAgICAgICAgIG9tWzBdID0gY3ZNYXQoMywxLENWXzY0Rixzb2x2ZXIucGFyYW0tPmRhdGEuZGIrKGkrMSkqNik7CisgICAgICAgICAgICBUWzBdID0gY3ZNYXQoMywxLENWXzY0Rixzb2x2ZXIucGFyYW0tPmRhdGEuZGIrKGkrMSkqNiszKTsKKworICAgICAgICAgICAgaWYoIEp0SiB8fCBKdEVyciApCisgICAgICAgICAgICAgICAgY3ZDb21wb3NlUlQoICZvbVswXSwgJlRbMF0sICZvbV9MUiwgJlRfTFIsICZvbVsxXSwgJlRbMV0sICZkcjNkcjEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcjNkcjIsIDAsIDAsICZkdDNkdDEsICZkdDNkcjIsICZkdDNkdDIgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdkNvbXBvc2VSVCggJm9tWzBdLCAmVFswXSwgJm9tX0xSLCAmVF9MUiwgJm9tWzFdLCAmVFsxXSApOworCisgICAgICAgICAgICBvYmpwdF9pID0gY3ZNYXQoMSwgbmksIENWXzY0RkMzLCBvYmplY3RQb2ludHMtPmRhdGEuZGIgKyBvZnMqMyk7CisgICAgICAgICAgICBlcnItPnJvd3MgPSBKZS0+cm93cyA9IEpfTFItPnJvd3MgPSBKaS0+cm93cyA9IG5pKjI7CisgICAgICAgICAgICBjdlJlc2hhcGUoIGVyciwgJnRtcGltYWdlUG9pbnRzLCAyLCAxICk7CisKKyAgICAgICAgICAgIGN2R2V0Q29scyggSmksICZkcGRmX2hkciwgMCwgMiApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCBKaSwgJmRwZGNfaGRyLCAyLCA0ICk7CisgICAgICAgICAgICBjdkdldENvbHMoIEppLCAmZHBka19oZHIsIDQsIE5JTlRSSU5TSUMgKTsKKyAgICAgICAgICAgIGN2R2V0Q29scyggSmUsICZkcGRyb3RfaGRyLCAwLCAzICk7CisgICAgICAgICAgICBjdkdldENvbHMoIEplLCAmZHBkdF9oZHIsIDMsIDYgKTsKKworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIG1heEVyciwgbDJlcnI7CisgICAgICAgICAgICAgICAgaW1ncHRfaVtrXSA9IGN2TWF0KDEsIG5pLCBDVl82NEZDMiwgaW1hZ2VQb2ludHNba10tPmRhdGEuZGIgKyBvZnMqMik7CisKKyAgICAgICAgICAgICAgICBpZiggSnRKIHx8IEp0RXJyICkKKyAgICAgICAgICAgICAgICAgICAgY3ZQcm9qZWN0UG9pbnRzMiggJm9ianB0X2ksICZvbVtrXSwgJlRba10sICZLW2tdLCAmRGlzdFtrXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1waW1hZ2VQb2ludHMsIGRwZHJvdCwgZHBkdCwgZHBkZiwgZHBkYywgZHBkaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBDVl9DQUxJQl9GSVhfQVNQRUNUX1JBVElPKSA/IGFzcGVjdFJhdGlvW2tdIDogMCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBjdlByb2plY3RQb2ludHMyKCAmb2JqcHRfaSwgJm9tW2tdLCAmVFtrXSwgJktba10sICZEaXN0W2tdLCAmdG1waW1hZ2VQb2ludHMgKTsKKyAgICAgICAgICAgICAgICBjdlN1YiggJnRtcGltYWdlUG9pbnRzLCAmaW1ncHRfaVtrXSwgJnRtcGltYWdlUG9pbnRzICk7CisKKyAgICAgICAgICAgICAgICBsMmVyciA9IGN2Tm9ybSggJnRtcGltYWdlUG9pbnRzLCAwLCBDVl9MMiApOworICAgICAgICAgICAgICAgIG1heEVyciA9IGN2Tm9ybSggJnRtcGltYWdlUG9pbnRzLCAwLCBDVl9DICk7CisKKyAgICAgICAgICAgICAgICBpZiggSnRKIHx8IEp0RXJyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpb2ZzID0gKG5pbWFnZXMrMSkqNiArIGsqTklOVFJJTlNJQywgZW9mcyA9IChpKzEpKjY7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggSnRKICYmIEp0RXJyICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGsgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGQoZXJyX3t4fHl9UikgfiBkZTMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnZlcnQgZGUzL3tkcjMsZHQzfSA9PiBkZTN7ZHIxLGR0MX0gJiBkZTN7ZHIyLGR0Mn0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggcCA9IDA7IHAgPCBuaSoyOyBwKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0IGRlM2RyMyA9IGN2TWF0KCAxLCAzLCBDVl82NEYsIEplLT5kYXRhLnB0ciArIEplLT5zdGVwKnAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCBkZTNkdDMgPSBjdk1hdCggMSwgMywgQ1ZfNjRGLCBkZTNkcjMuZGF0YS5kYiArIDMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCBkZTNkcjIgPSBjdk1hdCggMSwgMywgQ1ZfNjRGLCBKX0xSLT5kYXRhLnB0ciArIEpfTFItPnN0ZXAqcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0IGRlM2R0MiA9IGN2TWF0KCAxLCAzLCBDVl82NEYsIGRlM2RyMi5kYXRhLmRiICsgMyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZGUzZHIxWzNdLCBfZGUzZHQxWzNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0IGRlM2RyMSA9IGN2TWF0KCAxLCAzLCBDVl82NEYsIF9kZTNkcjEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCBkZTNkdDEgPSBjdk1hdCggMSwgMywgQ1ZfNjRGLCBfZGUzZHQxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdk1hdE11bCggJmRlM2RyMywgJmRyM2RyMSwgJmRlM2RyMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2TWF0TXVsKCAmZGUzZHQzLCAmZHQzZHQxLCAmZGUzZHQxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdk1hdE11bCggJmRlM2RyMywgJmRyM2RyMiwgJmRlM2RyMiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2TWF0TXVsQWRkKCAmZGUzZHQzLCAmZHQzZHIyLCAmZGUzZHIyLCAmZGUzZHIyICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdk1hdE11bCggJmRlM2R0MywgJmR0M2R0MiwgJmRlM2R0MiApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZDb3B5KCAmZGUzZHIxLCAmZGUzZHIzICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZDb3B5KCAmZGUzZHQxLCAmZGUzZHQzICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdCggSnRKLCAmX3BhcnQsIGN2UmVjdCgwLCAwLCA2LCA2KSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZHRU1NKCBKX0xSLCBKX0xSLCAxLCAmX3BhcnQsIDEsICZfcGFydCwgQ1ZfR0VNTV9BX1QgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY3ZHZXRTdWJSZWN0KCBKdEosICZfcGFydCwgY3ZSZWN0KGVvZnMsIDAsIDYsIDYpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkdFTU0oIEpfTFIsIEplLCAxLCAwLCAwLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2R2V0Um93cyggSnRFcnIsICZfcGFydCwgMCwgNiApOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZHRU1NKCBKX0xSLCBlcnIsIDEsICZfcGFydCwgMSwgJl9wYXJ0LCBDVl9HRU1NX0FfVCApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3ZHZXRTdWJSZWN0KCBKdEosICZfcGFydCwgY3ZSZWN0KGVvZnMsIGVvZnMsIDYsIDYpICk7CisgICAgICAgICAgICAgICAgICAgIGN2R0VNTSggSmUsIEplLCAxLCAmX3BhcnQsIDEsICZfcGFydCwgQ1ZfR0VNTV9BX1QgKTsKKworICAgICAgICAgICAgICAgICAgICBjdkdldFJvd3MoIEp0RXJyLCAmX3BhcnQsIGVvZnMsIGVvZnMgKyA2ICk7CisgICAgICAgICAgICAgICAgICAgIGN2R0VNTSggSmUsIGVyciwgMSwgJl9wYXJ0LCAxLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlY29tcHV0ZUludHJpbnNpY3MgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoIEp0SiwgJl9wYXJ0LCBjdlJlY3QoaW9mcywgaW9mcywgTklOVFJJTlNJQywgTklOVFJJTlNJQykgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2R0VNTSggSmksIEppLCAxLCAmX3BhcnQsIDEsICZfcGFydCwgQ1ZfR0VNTV9BX1QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdCggSnRKLCAmX3BhcnQsIGN2UmVjdChpb2ZzLCBlb2ZzLCBOSU5UUklOU0lDLCA2KSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZHRU1NKCBKZSwgSmksIDEsICZfcGFydCwgMSwgJl9wYXJ0LCBDVl9HRU1NX0FfVCApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGsgPT0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZHZXRTdWJSZWN0KCBKdEosICZfcGFydCwgY3ZSZWN0KGlvZnMsIDAsIE5JTlRSSU5TSUMsIDYpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZHRU1NKCBKX0xSLCBKaSwgMSwgJl9wYXJ0LCAxLCAmX3BhcnQsIENWX0dFTU1fQV9UICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjdkdldFJvd3MoIEp0RXJyLCAmX3BhcnQsIGlvZnMsIGlvZnMgKyBOSU5UUklOU0lDICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkdFTU0oIEppLCBlcnIsIDEsICZfcGFydCwgMSwgJl9wYXJ0LCBDVl9HRU1NX0FfVCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGVyck5vcm0gKQorICAgICAgICAgICAgICAgICAgICAqZXJyTm9ybSArPSBsMmVycipsMmVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2Um9kcmlndWVzMiggJm9tX0xSLCAmUl9MUiApOworICAgIGlmKCBfUi0+cm93cyA9PSAxIHx8IF9SLT5jb2xzID09IDEgKQorICAgICAgICBjdkNvbnZlcnQoICZvbV9MUiwgX1IgKTsKKyAgICBlbHNlCisgICAgICAgIGN2Q29udmVydCggJlJfTFIsIF9SICk7CisgICAgY3ZDb252ZXJ0KCAmVF9MUiwgX1QgKTsKKworICAgIGlmKCByZWNvbXB1dGVJbnRyaW5zaWNzICkKKyAgICB7CisgICAgICAgIGN2Q29udmVydCggJktbMF0sIF9jYW1lcmFNYXRyaXgxICk7CisgICAgICAgIGN2Q29udmVydCggJktbMV0sIF9jYW1lcmFNYXRyaXgyICk7CisKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0KiBkaXN0Q29lZmZzID0gayA9PSAwID8gX2Rpc3RDb2VmZnMxIDogX2Rpc3RDb2VmZnMyOworICAgICAgICAgICAgQ3ZNYXQgdGRpc3QgPSBjdk1hdCggZGlzdENvZWZmcy0+cm93cywgZGlzdENvZWZmcy0+Y29scywKKyAgICAgICAgICAgICAgICBDVl9NQUtFVFlQRShDVl82NEYsQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpKSwgRGlzdFtrXS5kYXRhLmRiICk7CisgICAgICAgICAgICBjdkNvbnZlcnQoICZ0ZGlzdCwgZGlzdENvZWZmcyApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIF9FIHx8IF9GICkKKyAgICB7CisgICAgICAgIGRvdWJsZSogdCA9IFRfTFIuZGF0YS5kYjsKKyAgICAgICAgZG91YmxlIHR4W10gPQorICAgICAgICB7CisgICAgICAgICAgICAwLCAtdFsyXSwgdFsxXSwKKyAgICAgICAgICAgIHRbMl0sIDAsIC10WzBdLAorICAgICAgICAgICAgLXRbMV0sIHRbMF0sIDAKKyAgICAgICAgfTsKKyAgICAgICAgQ3ZNYXQgVHggPSBjdk1hdCgzLCAzLCBDVl82NEYsIHR4KTsKKyAgICAgICAgZG91YmxlIGVbOV0sIGZbOV07CisgICAgICAgIEN2TWF0IEUgPSBjdk1hdCgzLCAzLCBDVl82NEYsIGUpOworICAgICAgICBDdk1hdCBGID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBmKTsKKyAgICAgICAgY3ZNYXRNdWwoICZUeCwgJlJfTFIsICZFICk7CisgICAgICAgIGlmKCBfRSApCisgICAgICAgICAgICBjdkNvbnZlcnQoICZFLCBfRSApOworICAgICAgICBpZiggX0YgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgaWtbOV07CisgICAgICAgICAgICBDdk1hdCBpSyA9IGN2TWF0KDMsIDMsIENWXzY0RiwgaWspOworICAgICAgICAgICAgY3ZJbnZlcnQoJktbMV0sICZpSyk7CisgICAgICAgICAgICBjdkdFTU0oICZpSywgJkUsIDEsIDAsIDAsICZFLCBDVl9HRU1NX0FfVCApOworICAgICAgICAgICAgY3ZJbnZlcnQoJktbMF0sICZpSyk7CisgICAgICAgICAgICBjdk1hdE11bCgmRSwgJmlLLCAmRik7CisgICAgICAgICAgICBjdkNvbnZlcnRTY2FsZSggJkYsIF9GLCBmYWJzKGZbOF0pID4gMCA/IDEuL2ZbOF0gOiAxICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmbnBvaW50cyApOworICAgIGN2UmVsZWFzZU1hdCggJmVyciApOworICAgIGN2UmVsZWFzZU1hdCggJkpfTFIgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZKZSApOworICAgIGN2UmVsZWFzZU1hdCggJkppICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmUlQwICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmb2JqZWN0UG9pbnRzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmaW1hZ2VQb2ludHNbMF0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZpbWFnZVBvaW50c1sxXSApOworfQorCisKK3ZvaWQgY3ZTdGVyZW9SZWN0aWZ5KCBjb25zdCBDdk1hdCogX2NhbWVyYU1hdHJpeDEsIGNvbnN0IEN2TWF0KiBfY2FtZXJhTWF0cml4MiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX2Rpc3RDb2VmZnMxLCBjb25zdCBDdk1hdCogX2Rpc3RDb2VmZnMyLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZVNpemUsIGNvbnN0IEN2TWF0KiBfUiwgY29uc3QgQ3ZNYXQqIF9ULAorICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBfUjEsIEN2TWF0KiBfUjIsIEN2TWF0KiBfUDEsIEN2TWF0KiBfUDIsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIF9RLCBpbnQgZmxhZ3MgKQoreworICAgIGRvdWJsZSBfb21bM10sIF90WzNdLCBfdXVbM109ezAsMCwwfSwgX3JfclszXVszXSwgX3BwWzNdWzRdOworICAgIGRvdWJsZSBfd3dbM10sIF93clszXVszXSwgX3pbM10gPSB7MCwwLDB9LCBfcmlbM11bM107CisgICAgQ3ZNYXQgb20gID0gY3ZNYXQoMywgMSwgQ1ZfNjRGLCBfb20pOworICAgIEN2TWF0IHQgICA9IGN2TWF0KDMsIDEsIENWXzY0RiwgX3QpOworICAgIEN2TWF0IHV1ICA9IGN2TWF0KDMsIDEsIENWXzY0RiwgX3V1KTsKKyAgICBDdk1hdCByX3IgPSBjdk1hdCgzLCAzLCBDVl82NEYsIF9yX3IpOworICAgIEN2TWF0IHBwICA9IGN2TWF0KDMsIDQsIENWXzY0RiwgX3BwKTsKKyAgICBDdk1hdCB3dyAgPSBjdk1hdCgzLCAxLCBDVl82NEYsIF93dyk7IC8vIHRlbXBzCisgICAgQ3ZNYXQgd1IgID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfd3IpOworICAgIEN2TWF0IFogICA9IGN2TWF0KDMsIDEsIENWXzY0RiwgX3opOworICAgIEN2TWF0IFJpICA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX3JpKTsKKyAgICBkb3VibGUgbnggPSBpbWFnZVNpemUud2lkdGgsIG55ID0gaW1hZ2VTaXplLmhlaWdodDsKKyAgICBpbnQgaSwgazsKKworICAgIGlmKCBfUi0+cm93cyA9PSAzICYmIF9SLT5jb2xzID09IDMgKQorICAgICAgICBjdlJvZHJpZ3VlczIoX1IsICZvbSk7ICAgICAgICAgIC8vIGdldCB2ZWN0b3Igcm90YXRpb24KKyAgICBlbHNlCisgICAgICAgIGN2Q29udmVydChfUiwgJm9tKTsgLy8gaXQncyBhbHJlYWR5IGEgcm90YXRpb24gdmVjdG9yCisgICAgY3ZDb252ZXJ0U2NhbGUoJm9tLCAmb20sIC0wLjUpOyAvLyBnZXQgYXZlcmFnZSByb3RhdGlvbgorICAgIGN2Um9kcmlndWVzMigmb20sICZyX3IpOyAgICAgICAgLy8gcm90YXRlIGNhbWVyYXMgdG8gc2FtZSBvcmllbnRhdGlvbiBieSBhdmVyYWdpbmcKKyAgICBjdk1hdE11bCgmcl9yLCBfVCwgJnQpOworCisgICAgaW50IGlkeCA9IGZhYnMoX3RbMF0pID4gZmFicyhfdFsxXSkgPyAwIDogMTsKKyAgICBkb3VibGUgYyA9IF90W2lkeF0sIG50ID0gY3ZOb3JtKCZ0LCAwLCBDVl9MMik7CisgICAgX3V1W2lkeF0gPSBjID4gMCA/IDEgOiAtMTsKKworICAgIC8vIGNhbGN1bGF0ZSBnbG9iYWwgWiByb3RhdGlvbgorICAgIGN2Q3Jvc3NQcm9kdWN0KCZ0LCZ1dSwmd3cpOworICAgIGRvdWJsZSBudyA9IGN2Tm9ybSgmd3csIDAsIENWX0wyKTsKKyAgICBjdkNvbnZlcnRTY2FsZSgmd3csICZ3dywgYWNvcyhmYWJzKGMpL250KS9udyk7CisgICAgY3ZSb2RyaWd1ZXMyKCZ3dywgJndSKTsKKworICAgIC8vIGFwcGx5IHRvIGJvdGggdmlld3MKKyAgICBjdkdFTU0oJndSLCAmcl9yLCAxLCAwLCAwLCAmUmksIENWX0dFTU1fQl9UKTsKKyAgICBjdkNvbnZlcnQoICZSaSwgX1IxICk7CisgICAgY3ZHRU1NKCZ3UiwgJnJfciwgMSwgMCwgMCwgJlJpLCAwKTsKKyAgICBjdkNvbnZlcnQoICZSaSwgX1IyICk7CisgICAgY3ZNYXRNdWwoJnJfciwgX1QsICZ0KTsKKworICAgIC8vIGNhbGN1bGF0ZSBwcm9qZWN0aW9uL2NhbWVyYSBtYXRyaWNlcworICAgIC8vIHRoZXNlIGNvbnRhaW4gdGhlIHJlbGV2YW50IHJlY3RpZmllZCBpbWFnZSBpbnRlcm5hbCBwYXJhbXMgKGZ4LCBmeT1meCwgY3gsIGN5KQorICAgIGRvdWJsZSBmY19uZXcgPSBEQkxfTUFYOworICAgIEN2UG9pbnQyRDY0ZiBjY19uZXdbMl0gPSB7ezAsMH0sIHswLDB9fTsKKworICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZNYXQqIEEgPSBrID09IDAgPyBfY2FtZXJhTWF0cml4MSA6IF9jYW1lcmFNYXRyaXgyOworICAgICAgICBjb25zdCBDdk1hdCogRGsgPSBrID09IDAgPyBfZGlzdENvZWZmczEgOiBfZGlzdENvZWZmczI7CisgICAgICAgIEN2UG9pbnQyRDMyZiBfcHRzWzRdOworICAgICAgICBDdlBvaW50M0QzMmYgX3B0c18zWzRdOworICAgICAgICBDdk1hdCBwdHMgPSBjdk1hdCgxLCA0LCBDVl8zMkZDMiwgX3B0cyk7CisgICAgICAgIEN2TWF0IHB0c18zID0gY3ZNYXQoMSwgNCwgQ1ZfMzJGQzMsIF9wdHNfMyk7CisgICAgICAgIGRvdWJsZSBmYywgZGsxID0gRGsgPyBjdm1HZXQoRGssIDAsIDApIDogMDsKKworICAgICAgICBmYyA9IGN2bUdldChBLGlkeF4xLGlkeF4xKTsKKyAgICAgICAgaWYoIGRrMSA8IDAgKQorICAgICAgICAgICAgZmMgKj0gMSArIDAuMipkazEqKG54Km54ICsgbnkqbnkpLyg4KmZjKmZjKTsKKyAgICAgICAgZmNfbmV3ID0gTUlOKGZjX25ldywgZmMpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBfcHRzW2ldLnggPSAoZmxvYXQpKCgoaSAlIDIpICsgMC41KSpueCowLjUpOworICAgICAgICAgICAgX3B0c1tpXS55ID0gKGZsb2F0KSgoKGkgLyAyKSArIDAuNSkqbnkqMC41KTsKKyAgICAgICAgfQorICAgICAgICBjdlVuZGlzdG9ydFBvaW50cyggJnB0cywgJnB0cywgQSwgRGssIDAsIDAgKTsKKyAgICAgICAgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMoICZwdHMsICZwdHNfMyApOworICAgICAgICBjdlByb2plY3RQb2ludHMyKCAmcHRzXzMsIGsgPT0gMCA/IF9SMSA6IF9SMiwgJlosIEEsIDAsICZwdHMgKTsKKyAgICAgICAgQ3ZTY2FsYXIgYXZnID0gY3ZBdmcoJnB0cyk7CisgICAgICAgIGNjX25ld1trXS54ID0gYXZnLnZhbFswXTsKKyAgICAgICAgY2NfbmV3W2tdLnkgPSBhdmcudmFsWzFdOworICAgIH0KKworICAgIC8vIHZlcnRpY2FsIGZvY2FsIGxlbmd0aCBtdXN0IGJlIHRoZSBzYW1lIGZvciBib3RoIGltYWdlcyB0byBrZWVwIHRoZSBlcGlwb2xhciBjb25zdHJhaW50CisgICAgLy8gKGZvciBob3Jpem9udGFsIGVwaXBvbGFyIGxpbmVzIC0tIFRCRDogY2hlY2sgZm9yIHZlcnRpY2FsIGVwaXBvbGFyIGxpbmVzKQorICAgIC8vIHVzZSBmeSBmb3IgZnggYWxzbywgZm9yIHNpbXBsaWNpdHkKKworICAgIC8vIEZvciBzaW1wbGljaXR5LCBzZXQgdGhlIHByaW5jaXBhbCBwb2ludHMgZm9yIGJvdGggY2FtZXJhcyB0byBiZSB0aGUgYXZlcmFnZQorICAgIC8vIG9mIHRoZSB0d28gcHJpbmNpcGFsIHBvaW50cyAoZWl0aGVyIG9uZSBvZiBvciBib3RoIHgtIGFuZCB5LSBjb29yZGluYXRlcykKKyAgICBpZiggZmxhZ3MgJiBDVl9DQUxJQl9aRVJPX0RJU1BBUklUWSApCisgICAgeworICAgICAgICBjY19uZXdbMF0ueCA9IGNjX25ld1sxXS54ID0gKGNjX25ld1swXS54ICsgY2NfbmV3WzFdLngpKjAuNTsKKyAgICAgICAgY2NfbmV3WzBdLnkgPSBjY19uZXdbMV0ueSA9IChjY19uZXdbMF0ueSArIGNjX25ld1sxXS55KSowLjU7CisgICAgfQorICAgIGVsc2UgaWYoIGlkeCA9PSAwICkgLy8gaG9yaXpvbnRhbCBzdGVyZW8KKyAgICAgICAgY2NfbmV3WzBdLnkgPSBjY19uZXdbMV0ueSA9IChjY19uZXdbMF0ueSArIGNjX25ld1sxXS55KSowLjU7CisgICAgZWxzZSAvLyB2ZXJ0aWNhbCBzdGVyZW8KKyAgICAgICAgY2NfbmV3WzBdLnggPSBjY19uZXdbMV0ueCA9IChjY19uZXdbMF0ueCArIGNjX25ld1sxXS54KSowLjU7CisKKyAgICBjdlplcm8oICZwcCApOworICAgIF9wcFswXVswXSA9IF9wcFsxXVsxXSA9IGZjX25ldzsKKyAgICBfcHBbMF1bMl0gPSBjY19uZXdbMF0ueDsKKyAgICBfcHBbMV1bMl0gPSBjY19uZXdbMF0ueTsKKyAgICBfcHBbMl1bMl0gPSAxOworICAgIGN2Q29udmVydCgmcHAsIF9QMSk7CisKKyAgICBfcHBbMF1bMl0gPSBjY19uZXdbMV0ueDsKKyAgICBfcHBbMV1bMl0gPSBjY19uZXdbMV0ueTsKKyAgICBfcHBbaWR4XVszXSA9IF90W2lkeF0qZmNfbmV3OyAvLyBiYXNlbGluZSAqIGZvY2FsIGxlbmd0aAorICAgIGN2Q29udmVydCgmcHAsIF9QMik7CisKKyAgICBpZiggX1EgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDEsIDAsIDAsIC1jY19uZXdbMF0ueCwKKyAgICAgICAgICAgIDAsIDEsIDAsIC1jY19uZXdbMF0ueSwKKyAgICAgICAgICAgIDAsIDAsIDAsIGZjX25ldywKKyAgICAgICAgICAgIDAsIDAsIDEuL190W2lkeF0sCisgICAgICAgICAgICAoaWR4ID09IDAgPyBjY19uZXdbMF0ueCAtIGNjX25ld1sxXS54IDogY2NfbmV3WzBdLnkgLSBjY19uZXdbMV0ueSkvX3RbaWR4XQorICAgICAgICB9OworICAgICAgICBDdk1hdCBRID0gY3ZNYXQoNCwgNCwgQ1ZfNjRGLCBxKTsKKyAgICAgICAgY3ZDb252ZXJ0KCAmUSwgX1EgKTsKKyAgICB9Cit9CisKKworQ1ZfSU1QTCBpbnQKK2N2U3RlcmVvUmVjdGlmeVVuY2FsaWJyYXRlZCgKKyAgICBjb25zdCBDdk1hdCogX3BvaW50czEsIGNvbnN0IEN2TWF0KiBfcG9pbnRzMiwKKyAgICBjb25zdCBDdk1hdCogRjAsIEN2U2l6ZSBpbWdTaXplLCBDdk1hdCogX0gxLCBDdk1hdCogX0gyLCBkb3VibGUgdGhyZXNob2xkICkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBDdk1hdCogX20xID0gMDsKKyAgICBDdk1hdCogX20yID0gMDsKKyAgICBDdk1hdCogX2xpbmVzMSA9IDA7CisgICAgQ3ZNYXQqIF9saW5lczIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlN0ZXJlb0NhbGNIb21vZ3JhcGhpZXNGcm9tRiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBqLCBucG9pbnRzOworICAgIGRvdWJsZSBjeCwgY3k7CisgICAgZG91YmxlIHVbOV0sIHZbOV0sIHdbOV0sIGZbOV0sIGgxWzldLCBoMls5XSwgaDBbOV0sIGUyWzNdOworICAgIEN2TWF0IEUyID0gY3ZNYXQoIDMsIDEsIENWXzY0RiwgZTIgKTsKKyAgICBDdk1hdCBVID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgdSApOworICAgIEN2TWF0IFYgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCB2ICk7CisgICAgQ3ZNYXQgVyA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIHcgKTsKKyAgICBDdk1hdCBGID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgZiApOworICAgIEN2TWF0IEgxID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgaDEgKTsKKyAgICBDdk1hdCBIMiA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIGgyICk7CisgICAgQ3ZNYXQgSDAgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBoMCApOworCisgICAgQ3ZQb2ludDJENjRmKiBtMTsKKyAgICBDdlBvaW50MkQ2NGYqIG0yOworICAgIEN2UG9pbnQzRDY0ZiogbGluZXMxOworICAgIEN2UG9pbnQzRDY0ZiogbGluZXMyOworCisgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQoX3BvaW50czEpICYmIENWX0lTX01BVChfcG9pbnRzMikgJiYKKyAgICAgICAgKF9wb2ludHMxLT5yb3dzID09IDEgfHwgX3BvaW50czEtPmNvbHMgPT0gMSkgJiYKKyAgICAgICAgKF9wb2ludHMyLT5yb3dzID09IDEgfHwgX3BvaW50czItPmNvbHMgPT0gMSkgJiYKKyAgICAgICAgQ1ZfQVJFX1NJWkVTX0VRKF9wb2ludHMxLCBfcG9pbnRzMikgKTsKKworICAgIG5wb2ludHMgPSBfcG9pbnRzMS0+cm93cyAqIF9wb2ludHMxLT5jb2xzICogQ1ZfTUFUX0NOKF9wb2ludHMxLT50eXBlKSAvIDI7CisKKyAgICBfbTEgPSBjdkNyZWF0ZU1hdCggX3BvaW50czEtPnJvd3MsIF9wb2ludHMxLT5jb2xzLCBDVl82NEZDKENWX01BVF9DTihfcG9pbnRzMS0+dHlwZSkpICk7CisgICAgX20yID0gY3ZDcmVhdGVNYXQoIF9wb2ludHMyLT5yb3dzLCBfcG9pbnRzMi0+Y29scywgQ1ZfNjRGQyhDVl9NQVRfQ04oX3BvaW50czItPnR5cGUpKSApOworICAgIF9saW5lczEgPSBjdkNyZWF0ZU1hdCggMSwgbnBvaW50cywgQ1ZfNjRGQzMgKTsKKyAgICBfbGluZXMyID0gY3ZDcmVhdGVNYXQoIDEsIG5wb2ludHMsIENWXzY0RkMzICk7CisKKyAgICBjdkNvbnZlcnQoIEYwLCAmRiApOworCisgICAgY3ZTVkQoIChDdk1hdCopJkYsICZXLCAmVSwgJlYsIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICk7CisgICAgVy5kYXRhLmRiWzhdID0gMC47CisgICAgY3ZHRU1NKCAmVSwgJlcsIDEsIDAsIDAsICZXLCBDVl9HRU1NX0FfVCApOworICAgIGN2TWF0TXVsKCAmVywgJlYsICZGICk7CisKKyAgICBjeCA9IGN2Um91bmQoIChpbWdTaXplLndpZHRoLTEpKjAuNSApOworICAgIGN5ID0gY3ZSb3VuZCggKGltZ1NpemUuaGVpZ2h0LTEpKjAuNSApOworCisgICAgY3ZaZXJvKCBfSDEgKTsKKyAgICBjdlplcm8oIF9IMiApOworCisgICAgY3ZDb252ZXJ0KCBfcG9pbnRzMSwgX20xICk7CisgICAgY3ZDb252ZXJ0KCBfcG9pbnRzMiwgX20yICk7CisgICAgY3ZSZXNoYXBlKCBfbTEsIF9tMSwgMiwgMSApOworICAgIGN2UmVzaGFwZSggX20xLCBfbTEsIDIsIDEgKTsKKworICAgIG0xID0gKEN2UG9pbnQyRDY0ZiopX20xLT5kYXRhLnB0cjsKKyAgICBtMiA9IChDdlBvaW50MkQ2NGYqKV9tMi0+ZGF0YS5wdHI7CisgICAgbGluZXMxID0gKEN2UG9pbnQzRDY0ZiopX2xpbmVzMS0+ZGF0YS5wdHI7CisgICAgbGluZXMyID0gKEN2UG9pbnQzRDY0ZiopX2xpbmVzMi0+ZGF0YS5wdHI7CisKKyAgICBpZiggdGhyZXNob2xkID4gMCApCisgICAgeworICAgICAgICBjdkNvbXB1dGVDb3JyZXNwb25kRXBpbGluZXMoIF9tMSwgMSwgJkYsIF9saW5lczEgKTsKKyAgICAgICAgY3ZDb21wdXRlQ29ycmVzcG9uZEVwaWxpbmVzKCBfbTIsIDIsICZGLCBfbGluZXMyICk7CisKKyAgICAgICAgLy8gbWVhc3VyZSBkaXN0YW5jZSBmcm9tIHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyBlcGlsaW5lcywgbWFyayBvdXRsaWVycworICAgICAgICBmb3IoIGkgPSBqID0gMDsgaSA8IG5wb2ludHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmYWJzKG0xW2ldLngqbGluZXMyW2ldLnggKworICAgICAgICAgICAgICAgICAgICAgbTFbaV0ueSpsaW5lczJbaV0ueSArCisgICAgICAgICAgICAgICAgICAgICBsaW5lczJbaV0ueikgPD0gdGhyZXNob2xkICYmCisgICAgICAgICAgICAgICAgZmFicyhtMltpXS54KmxpbmVzMVtpXS54ICsKKyAgICAgICAgICAgICAgICAgICAgIG0yW2ldLnkqbGluZXMxW2ldLnkgKworICAgICAgICAgICAgICAgICAgICAgbGluZXMxW2ldLnopIDw9IHRocmVzaG9sZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGogPiBpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG0xW2pdID0gbTFbaV07CisgICAgICAgICAgICAgICAgICAgIG0yW2pdID0gbTJbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5wb2ludHMgPSBqOworICAgICAgICBpZiggbnBvaW50cyA9PSAwICkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgeworICAgIF9tMS0+Y29scyA9IF9tMi0+Y29scyA9IG5wb2ludHM7CisgICAgbWVtY3B5KCBFMi5kYXRhLmRiLCBVLmRhdGEuZGIgKyA2LCBzaXplb2YoZTIpKTsKKyAgICBjdlNjYWxlKCAmRTIsICZFMiwgZTJbMl0gPiAwID8gMSA6IC0xICk7CisKKyAgICBkb3VibGUgdFtdID0KKyAgICB7CisgICAgICAgIDEsIDAsIC1jeCwKKyAgICAgICAgMCwgMSwgLWN5LAorICAgICAgICAwLCAwLCAxCisgICAgfTsKKyAgICBDdk1hdCBUID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCB0KTsKKyAgICBjdk1hdE11bCggJlQsICZFMiwgJkUyICk7CisKKyAgICBpbnQgbWlycm9yID0gZTJbMF0gPCAwOworICAgIGRvdWJsZSBkID0gTUFYKHNxcnQoZTJbMF0qZTJbMF0gKyBlMlsxXSplMlsxXSksREJMX0VQU0lMT04pOworICAgIGRvdWJsZSBhbHBoYSA9IGUyWzBdL2Q7CisgICAgZG91YmxlIGJldGEgPSBlMlsxXS9kOworICAgIGRvdWJsZSByW10gPQorICAgIHsKKyAgICAgICAgYWxwaGEsIGJldGEsIDAsCisgICAgICAgIC1iZXRhLCBhbHBoYSwgMCwKKyAgICAgICAgMCwgMCwgMQorICAgIH07CisgICAgQ3ZNYXQgUiA9IGN2TWF0KDMsIDMsIENWXzY0Riwgcik7CisgICAgY3ZNYXRNdWwoICZSLCAmVCwgJlQgKTsKKyAgICBjdk1hdE11bCggJlIsICZFMiwgJkUyICk7CisgICAgZG91YmxlIGludmYgPSBmYWJzKGUyWzJdKSA8IDFlLTYqZmFicyhlMlswXSkgPyAwIDogLWUyWzJdL2UyWzBdOworICAgIGRvdWJsZSBrW10gPQorICAgIHsKKyAgICAgICAgMSwgMCwgMCwKKyAgICAgICAgMCwgMSwgMCwKKyAgICAgICAgaW52ZiwgMCwgMQorICAgIH07CisgICAgQ3ZNYXQgSyA9IGN2TWF0KDMsIDMsIENWXzY0Riwgayk7CisgICAgY3ZNYXRNdWwoICZLLCAmVCwgJkgyICk7CisgICAgY3ZNYXRNdWwoICZLLCAmRTIsICZFMiApOworCisgICAgZG91YmxlIGl0W10gPQorICAgIHsKKyAgICAgICAgMSwgMCwgY3gsCisgICAgICAgIDAsIDEsIGN5LAorICAgICAgICAwLCAwLCAxCisgICAgfTsKKyAgICBDdk1hdCBpVCA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIGl0ICk7CisgICAgY3ZNYXRNdWwoICZpVCwgJkgyLCAmSDIgKTsKKworICAgIG1lbWNweSggRTIuZGF0YS5kYiwgVS5kYXRhLmRiICsgNiwgc2l6ZW9mKGUyKSk7CisgICAgY3ZTY2FsZSggJkUyLCAmRTIsIGUyWzJdID4gMCA/IDEgOiAtMSApOworCisgICAgZG91YmxlIGUyX3hbXSA9CisgICAgeworICAgICAgICAwLCAtZTJbMl0sIGUyWzFdLAorICAgICAgIGUyWzJdLCAwLCAtZTJbMF0sCisgICAgICAgLWUyWzFdLCBlMlswXSwgMAorICAgIH07CisgICAgZG91YmxlIGUyXzExMVtdID0KKyAgICB7CisgICAgICAgIGUyWzBdLCBlMlswXSwgZTJbMF0sCisgICAgICAgIGUyWzFdLCBlMlsxXSwgZTJbMV0sCisgICAgICAgIGUyWzJdLCBlMlsyXSwgZTJbMl0sCisgICAgfTsKKyAgICBDdk1hdCBFMl94ID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBlMl94KTsKKyAgICBDdk1hdCBFMl8xMTEgPSBjdk1hdCgzLCAzLCBDVl82NEYsIGUyXzExMSk7CisgICAgY3ZNYXRNdWxBZGQoJkUyX3gsICZGLCAmRTJfMTExLCAmSDAgKTsKKyAgICBjdk1hdE11bCgmSDIsICZIMCwgJkgwKTsKKyAgICBDdk1hdCBFMT1jdk1hdCgzLCAxLCBDVl82NEYsIFYuZGF0YS5kYis2KTsKKyAgICBjdk1hdE11bCgmSDAsICZFMSwgJkUxKTsKKworICAgIGN2UGVyc3BlY3RpdmVUcmFuc2Zvcm0oIF9tMSwgX20xLCAmSDAgKTsKKyAgICBjdlBlcnNwZWN0aXZlVHJhbnNmb3JtKCBfbTIsIF9tMiwgJkgyICk7CisgICAgQ3ZNYXQgQSA9IGN2TWF0KCAxLCBucG9pbnRzLCBDVl82NEZDMywgbGluZXMxICksIEJ4QnksIEI7CisgICAgZG91YmxlIGFbOV0sIGF0YlszXSwgeFszXTsKKyAgICBDdk1hdCBBdEEgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBhICk7CisgICAgQ3ZNYXQgQXRCID0gY3ZNYXQoIDMsIDEsIENWXzY0RiwgYXRiICk7CisgICAgQ3ZNYXQgWCA9IGN2TWF0KCAzLCAxLCBDVl82NEYsIHggKTsKKyAgICBjdkNvbnZlcnRQb2ludHNIb21vZ2VuZW91cyggX20xLCAmQSApOworICAgIGN2UmVzaGFwZSggJkEsICZBLCAxLCBucG9pbnRzICk7CisgICAgY3ZSZXNoYXBlKCBfbTIsICZCeEJ5LCAxLCBucG9pbnRzICk7CisgICAgY3ZHZXRDb2woICZCeEJ5LCAmQiwgMCApOworICAgIGN2R0VNTSggJkEsICZBLCAxLCAwLCAwLCAmQXRBLCBDVl9HRU1NX0FfVCApOworICAgIGN2R0VNTSggJkEsICZCLCAxLCAwLCAwLCAmQXRCLCBDVl9HRU1NX0FfVCApOworICAgIGN2U29sdmUoICZBdEEsICZBdEIsICZYLCBDVl9TVkRfU1lNICk7CisKKyAgICBkb3VibGUgaGFbXSA9CisgICAgeworICAgICAgICB4WzBdLCB4WzFdLCB4WzJdLAorICAgICAgICAwLCAxLCAwLAorICAgICAgICAwLCAwLCAxCisgICAgfTsKKyAgICBDdk1hdCBIYSA9IGN2TWF0KDMsIDMsIENWXzY0RiwgaGEpOworICAgIGN2TWF0TXVsKCAmSGEsICZIMCwgJkgxICk7CisgICAgY3ZQZXJzcGVjdGl2ZVRyYW5zZm9ybSggX20xLCBfbTEsICZIYSApOworCisgICAgaWYoIG1pcnJvciApCisgICAgeworICAgICAgICBkb3VibGUgbW1bXSA9IHsgLTEsIDAsIGN4KjIsIDAsIC0xLCBjeSoyLCAwLCAwLCAxIH07CisgICAgICAgIEN2TWF0IE1NID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBtbSk7CisgICAgICAgIGN2TWF0TXVsKCAmTU0sICZIMSwgJkgxICk7CisgICAgICAgIGN2TWF0TXVsKCAmTU0sICZIMiwgJkgyICk7CisgICAgfQorCisgICAgY3ZDb252ZXJ0KCAmSDEsIF9IMSApOworICAgIGN2Q29udmVydCggJkgyLCBfSDIgKTsKKworICAgIHJlc3VsdCA9IDE7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJl9tMSApOworICAgIGN2UmVsZWFzZU1hdCggJl9tMiApOworICAgIGN2UmVsZWFzZU1hdCggJl9saW5lczEgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfbGluZXMyICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZXByb2plY3RJbWFnZVRvM0QoCisgICAgY29uc3QgQ3ZBcnIqIGRpc3Bhcml0eUltYWdlLAorICAgIEN2QXJyKiBfM2RJbWFnZSwgY29uc3QgQ3ZNYXQqIF9RICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVwcm9qZWN0SW1hZ2VUbzNEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIHFbNF1bNF07CisgICAgQ3ZNYXQgUSA9IGN2TWF0KDQsIDQsIENWXzY0RiwgcSk7CisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSBjdkdldE1hdCggZGlzcGFyaXR5SW1hZ2UsICZzc3R1YiApOworICAgIEN2TWF0IGRzdHViLCAqZHN0ID0gY3ZHZXRNYXQoIF8zZEltYWdlLCAmZHN0dWIgKTsKKyAgICBpbnQgc3R5cGUgPSBDVl9NQVRfVFlQRShzcmMtPnR5cGUpLCBkdHlwZSA9IENWX01BVF9UWVBFKGRzdC0+dHlwZSk7CisgICAgaW50IHgsIHksIHJvd3MgPSBzcmMtPnJvd3MsIGNvbHMgPSBzcmMtPmNvbHM7CisgICAgZmxvYXQqIHNidWYgPSAoZmxvYXQqKWN2U3RhY2tBbGxvYyggY29scypzaXplb2Yoc2J1ZlswXSkgKTsKKyAgICBmbG9hdCogZGJ1ZiA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBjb2xzKjMqc2l6ZW9mKGRidWZbMF0pICk7CisKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUShzcmMsIGRzdCkgJiYKKyAgICAgICAgKENWX01BVF9UWVBFKHN0eXBlKSA9PSBDVl8xNlNDMSB8fCBDVl9NQVRfVFlQRShzdHlwZSkgPT0gQ1ZfMzJGQzEpICYmCisgICAgICAgIChDVl9NQVRfVFlQRShkdHlwZSkgPT0gQ1ZfMTZTQzMgfHwgQ1ZfTUFUX1RZUEUoZHR5cGUpID09IENWXzMyRkMzKSApOworCisgICAgY3ZDb252ZXJ0KCBfUSwgJlEgKTsKKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNwdHIgPSAoY29uc3QgZmxvYXQqKShzcmMtPmRhdGEucHRyICsgc3JjLT5zdGVwKnkpOworICAgICAgICBmbG9hdCogZHB0cjAgPSAoZmxvYXQqKShkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKnkpLCAqZHB0ciA9IGRwdHIwOworICAgICAgICBkb3VibGUgcXggPSBxWzBdWzFdKnkgKyBxWzBdWzNdLCBxeSA9IHFbMV1bMV0qeSArIHFbMV1bM107CisgICAgICAgIGRvdWJsZSBxeiA9IHFbMl1bMV0qeSArIHFbMl1bM10sIHF3ID0gcVszXVsxXSp5ICsgcVszXVszXTsKKworICAgICAgICBpZiggc3R5cGUgPT0gQ1ZfMTZTQzEgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBzaG9ydCogc3B0cjAgPSAoY29uc3Qgc2hvcnQqKXNwdHI7CisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgY29sczsgeCsrICkKKyAgICAgICAgICAgICAgICBzYnVmW3hdID0gKGZsb2F0KXNwdHIwW3hdOworICAgICAgICAgICAgc3B0ciA9IHNidWY7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGR0eXBlICE9IENWXzMyRkMzICkKKyAgICAgICAgICAgIGRwdHIgPSBkYnVmOworCisgICAgICAgIGZvciggeCA9IDA7IHggPCBjb2xzOyB4KyssIHF4ICs9IHFbMF1bMF0sIHF5ICs9IHFbMV1bMF0sIHF6ICs9IHFbMl1bMF0sIHF3ICs9IHFbM11bMF0gKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZCA9IHNwdHJbeF07CisgICAgICAgICAgICBkb3VibGUgaVcgPSAxLi8ocXcgKyBxWzNdWzJdKmQpOworICAgICAgICAgICAgZG91YmxlIFggPSAocXggKyBxWzBdWzJdKmQpKmlXOworICAgICAgICAgICAgZG91YmxlIFkgPSAocXkgKyBxWzFdWzJdKmQpKmlXOworICAgICAgICAgICAgZG91YmxlIFogPSAocXogKyBxWzJdWzJdKmQpKmlXOworCisgICAgICAgICAgICBkcHRyW3gqM10gPSAoZmxvYXQpWDsKKyAgICAgICAgICAgIGRwdHJbeCozKzFdID0gKGZsb2F0KVk7CisgICAgICAgICAgICBkcHRyW3gqMysyXSA9IChmbG9hdClaOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGR0eXBlID09IENWXzE2U0MzICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGNvbHMqMzsgeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaXZhbCA9IGN2Um91bmQoZHB0clt4XSk7CisgICAgICAgICAgICAgICAgKChzaG9ydCopZHB0cjApW3hdID0gQ1ZfQ0FTVF8xNlMoaXZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2Y2Ftc2hpZnQuY3BwIGIvY3Yvc3JjL2N2Y2Ftc2hpZnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZmJlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZjYW1zaGlmdC5jcHAKQEAgLTAsMCArMSwzMDAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZNZWFuU2hpZnQKKy8vICAgIFB1cnBvc2U6IE1lYW5TaGlmdCBhbGdvcml0aG0KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBpbWdQcm9iICAgICAtIDJEIG9iamVjdCBwcm9iYWJpbGl0eSBkaXN0cmlidXRpb24KKy8vICAgICAgd2luZG93SW4gICAgLSBDdlJlY3Qgb2YgQ0FNU0hJRlQgV2luZG93IGludGlhbCBzaXplCisvLyAgICAgIG51bUl0ZXJzICAgIC0gSWYgQ0FNU0hJRlQgaXRlcmF0ZXMgdGhpcyBtYW55IHRpbWVzLCBzdG9wCisvLyAgICAgIHdpbmRvd091dCAgIC0gTG9jYXRpb24sIGhlaWdodCBhbmQgd2lkdGggb2YgY29udmVyZ2VkIENBTVNISUZUIHdpbmRvdworLy8gICAgICBsZW4gICAgICAgICAtIElmICE9IE5VTEwsIHJldHVybiBlcXVpdmFsZW50IGxlbgorLy8gICAgICB3aWR0aCAgICAgICAtIElmICE9IE5VTEwsIHJldHVybiBlcXVpdmFsZW50IHdpZHRoCisvLyAgICAgIGl0ZXJzVXNlZCAgIC0gUmV0dXJucyBudW1iZXIgb2YgaXRlcmF0aW9ucyBDQU1TSElGVCB0b29rIHRvIGNvbnZlcmdlCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBUaGUgZnVuY3Rpb24gaXRzZWxmIHJldHVybnMgdGhlIGFyZWEgZm91bmQKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgaW50Citjdk1lYW5TaGlmdCggY29uc3Qgdm9pZCogaW1nUHJvYiwgQ3ZSZWN0IHdpbmRvd0luLAorICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhLCBDdkNvbm5lY3RlZENvbXAqIGNvbXAgKQoreworICAgIEN2TW9tZW50cyBtb21lbnRzOworICAgIGludCAgICBpID0gMCwgZXBzOworICAgIEN2TWF0ICBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWdQcm9iOworICAgIEN2TWF0ICBjdXJfd2luOworICAgIEN2UmVjdCBjdXJfcmVjdCA9IHdpbmRvd0luOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1lYW5TaGlmdCIgKTsKKworICAgIGlmKCBjb21wICkKKyAgICAgICAgY29tcC0+cmVjdCA9IHdpbmRvd0luOworCisgICAgbW9tZW50cy5tMDAgPSBtb21lbnRzLm0xMCA9IG1vbWVudHMubTAxID0gMDsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgaWYoIENWX01BVF9DTiggbWF0LT50eXBlICkgPiAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggd2luZG93SW4uaGVpZ2h0IDw9IDAgfHwgd2luZG93SW4ud2lkdGggPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnB1dCB3aW5kb3cgaGFzIG5vbi1wb3NpdGl2ZSBzaXplcyIgKTsKKworICAgIGlmKCB3aW5kb3dJbi54IDwgMCB8fCB3aW5kb3dJbi54ICsgd2luZG93SW4ud2lkdGggPiBtYXQtPmNvbHMgfHwKKyAgICAgICAgd2luZG93SW4ueSA8IDAgfHwgd2luZG93SW4ueSArIHdpbmRvd0luLmhlaWdodCA+IG1hdC0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbml0aWFsIHdpbmRvdyBpcyBub3QgaW5zaWRlIHRoZSBpbWFnZSBST0kiICk7CisKKyAgICBDVl9DQUxMKCBjcml0ZXJpYSA9IGN2Q2hlY2tUZXJtQ3JpdGVyaWEoIGNyaXRlcmlhLCAxLiwgMTAwICkpOworCisgICAgZXBzID0gY3ZSb3VuZCggY3JpdGVyaWEuZXBzaWxvbiAqIGNyaXRlcmlhLmVwc2lsb24gKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBjcml0ZXJpYS5tYXhfaXRlcjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBkeCwgZHksIG54LCBueTsKKyAgICAgICAgZG91YmxlIGludl9tMDA7CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZHZXRTdWJSZWN0KCBtYXQsICZjdXJfd2luLCBjdXJfcmVjdCApKTsgCisgICAgICAgIENWX0NBTEwoIGN2TW9tZW50cyggJmN1cl93aW4sICZtb21lbnRzICkpOworCisgICAgICAgIC8qIENhbGN1bGF0aW5nIGNlbnRlciBvZiBtYXNzICovCisgICAgICAgIGlmKCBmYWJzKG1vbWVudHMubTAwKSA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGludl9tMDAgPSBtb21lbnRzLmludl9zcXJ0X20wMCptb21lbnRzLmludl9zcXJ0X20wMDsKKyAgICAgICAgZHggPSBjdlJvdW5kKCBtb21lbnRzLm0xMCAqIGludl9tMDAgLSB3aW5kb3dJbi53aWR0aCowLjUgKTsKKyAgICAgICAgZHkgPSBjdlJvdW5kKCBtb21lbnRzLm0wMSAqIGludl9tMDAgLSB3aW5kb3dJbi5oZWlnaHQqMC41ICk7CisKKyAgICAgICAgbnggPSBjdXJfcmVjdC54ICsgZHg7CisgICAgICAgIG55ID0gY3VyX3JlY3QueSArIGR5OworCisgICAgICAgIGlmKCBueCA8IDAgKQorICAgICAgICAgICAgbnggPSAwOworICAgICAgICBlbHNlIGlmKCBueCArIGN1cl9yZWN0LndpZHRoID4gbWF0LT5jb2xzICkKKyAgICAgICAgICAgIG54ID0gbWF0LT5jb2xzIC0gY3VyX3JlY3Qud2lkdGg7CisKKyAgICAgICAgaWYoIG55IDwgMCApCisgICAgICAgICAgICBueSA9IDA7CisgICAgICAgIGVsc2UgaWYoIG55ICsgY3VyX3JlY3QuaGVpZ2h0ID4gbWF0LT5yb3dzICkKKyAgICAgICAgICAgIG55ID0gbWF0LT5yb3dzIC0gY3VyX3JlY3QuaGVpZ2h0OworCisgICAgICAgIGR4ID0gbnggLSBjdXJfcmVjdC54OworICAgICAgICBkeSA9IG55IC0gY3VyX3JlY3QueTsKKyAgICAgICAgY3VyX3JlY3QueCA9IG54OworICAgICAgICBjdXJfcmVjdC55ID0gbnk7CisKKyAgICAgICAgLyogQ2hlY2sgZm9yIGNvdmVyYWdlIGNlbnRlcnMgbWFzcyAmIHdpbmRvdyAqLworICAgICAgICBpZiggZHgqZHggKyBkeSpkeSA8IGVwcyApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGNvbXAgKQorICAgIHsKKyAgICAgICAgY29tcC0+cmVjdCA9IGN1cl9yZWN0OworICAgICAgICBjb21wLT5hcmVhID0gKGZsb2F0KW1vbWVudHMubTAwOworICAgIH0KKworICAgIHJldHVybiBpOworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZDYW1TaGlmdAorLy8gICAgUHVycG9zZTogQ0FNU0hJRlQgYWxnb3JpdGhtCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgaW1nUHJvYiAgICAgLSAyRCBvYmplY3QgcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uCisvLyAgICAgIHdpbmRvd0luICAgIC0gQ3ZSZWN0IG9mIENBTVNISUZUIFdpbmRvdyBpbnRpYWwgc2l6ZQorLy8gICAgICBjcml0ZXJpYSAgICAtIGNyaXRlcmlhIG9mIHN0b3AgZmluZGluZyB3aW5kb3cKKy8vICAgICAgd2luZG93T3V0ICAgLSBMb2NhdGlvbiwgaGVpZ2h0IGFuZCB3aWR0aCBvZiBjb252ZXJnZWQgQ0FNU0hJRlQgd2luZG93CisvLyAgICAgIG9yaWVudGF0aW9uIC0gSWYgIT0gTlVMTCwgcmV0dXJuIGRpc3RyaWJ1dGlvbiBvcmllbnRhdGlvbgorLy8gICAgICBsZW4gICAgICAgICAtIElmICE9IE5VTEwsIHJldHVybiBlcXVpdmFsZW50IGxlbgorLy8gICAgICB3aWR0aCAgICAgICAtIElmICE9IE5VTEwsIHJldHVybiBlcXVpdmFsZW50IHdpZHRoCisvLyAgICAgIGFyZWEgICAgICAgIC0gc3VtIG9mIGFsbCBlbGVtZW50cyBpbiByZXN1bHQgd2luZG93CisvLyAgICAgIGl0ZXJzVXNlZCAgIC0gUmV0dXJucyBudW1iZXIgb2YgaXRlcmF0aW9ucyBDQU1TSElGVCB0b29rIHRvIGNvbnZlcmdlCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBUaGUgZnVuY3Rpb24gaXRzZWxmIHJldHVybnMgdGhlIGFyZWEgZm91bmQKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgaW50CitjdkNhbVNoaWZ0KCBjb25zdCB2b2lkKiBpbWdQcm9iLCBDdlJlY3Qgd2luZG93SW4sCisgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwKKyAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCogX2NvbXAsCisgICAgICAgICAgICBDdkJveDJEKiBib3ggKQoreworICAgIGNvbnN0IGludCBUT0xFUkFOQ0UgPSAxMDsKKyAgICBDdk1vbWVudHMgbW9tZW50czsKKyAgICBkb3VibGUgbTAwID0gMCwgbTEwLCBtMDEsIG11MjAsIG11MTEsIG11MDIsIGludl9tMDA7CisgICAgZG91YmxlIGEsIGIsIGMsIHhjLCB5YzsKKyAgICBkb3VibGUgcm90YXRlX2EsIHJvdGF0ZV9jOworICAgIGRvdWJsZSB0aGV0YSA9IDAsIHNxdWFyZTsKKyAgICBkb3VibGUgY3MsIHNuOworICAgIGRvdWJsZSBsZW5ndGggPSAwLCB3aWR0aCA9IDA7CisgICAgaW50IGl0ZXJzVXNlZCA9IDA7CisgICAgQ3ZDb25uZWN0ZWRDb21wIGNvbXA7CisgICAgQ3ZNYXQgIGN1cl93aW4sIHN0dWIsICptYXQgPSAoQ3ZNYXQqKWltZ1Byb2I7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FtU2hpZnQiICk7CisKKyAgICBjb21wLnJlY3QgPSB3aW5kb3dJbjsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgQ1ZfQ0FMTCggaXRlcnNVc2VkID0gY3ZNZWFuU2hpZnQoIG1hdCwgd2luZG93SW4sIGNyaXRlcmlhLCAmY29tcCApKTsKKyAgICB3aW5kb3dJbiA9IGNvbXAucmVjdDsKKworICAgIHdpbmRvd0luLnggLT0gVE9MRVJBTkNFOworICAgIGlmKCB3aW5kb3dJbi54IDwgMCApCisgICAgICAgIHdpbmRvd0luLnggPSAwOworCisgICAgd2luZG93SW4ueSAtPSBUT0xFUkFOQ0U7CisgICAgaWYoIHdpbmRvd0luLnkgPCAwICkKKyAgICAgICAgd2luZG93SW4ueSA9IDA7CisKKyAgICB3aW5kb3dJbi53aWR0aCArPSAyICogVE9MRVJBTkNFOworICAgIGlmKCB3aW5kb3dJbi54ICsgd2luZG93SW4ud2lkdGggPiBtYXQtPndpZHRoICkKKyAgICAgICAgd2luZG93SW4ud2lkdGggPSBtYXQtPndpZHRoIC0gd2luZG93SW4ueDsKKworICAgIHdpbmRvd0luLmhlaWdodCArPSAyICogVE9MRVJBTkNFOworICAgIGlmKCB3aW5kb3dJbi55ICsgd2luZG93SW4uaGVpZ2h0ID4gbWF0LT5oZWlnaHQgKQorICAgICAgICB3aW5kb3dJbi5oZWlnaHQgPSBtYXQtPmhlaWdodCAtIHdpbmRvd0luLnk7CisKKyAgICBDVl9DQUxMKCBjdkdldFN1YlJlY3QoIG1hdCwgJmN1cl93aW4sIHdpbmRvd0luICkpOworCisgICAgLyogQ2FsY3VsYXRpbmcgbW9tZW50cyBpbiBuZXcgY2VudGVyIG1hc3MgKi8KKyAgICBDVl9DQUxMKCBjdk1vbWVudHMoICZjdXJfd2luLCAmbW9tZW50cyApKTsKKworICAgIG0wMCA9IG1vbWVudHMubTAwOworICAgIG0xMCA9IG1vbWVudHMubTEwOworICAgIG0wMSA9IG1vbWVudHMubTAxOworICAgIG11MTEgPSBtb21lbnRzLm11MTE7CisgICAgbXUyMCA9IG1vbWVudHMubXUyMDsKKyAgICBtdTAyID0gbW9tZW50cy5tdTAyOworCisgICAgaWYoIGZhYnMobTAwKSA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgRVhJVDsKKworICAgIGludl9tMDAgPSAxLiAvIG0wMDsKKyAgICB4YyA9IGN2Um91bmQoIG0xMCAqIGludl9tMDAgKyB3aW5kb3dJbi54ICk7CisgICAgeWMgPSBjdlJvdW5kKCBtMDEgKiBpbnZfbTAwICsgd2luZG93SW4ueSApOworICAgIGEgPSBtdTIwICogaW52X20wMDsKKyAgICBiID0gbXUxMSAqIGludl9tMDA7CisgICAgYyA9IG11MDIgKiBpbnZfbTAwOworCisgICAgLyogQ2FsY3VsYXRpbmcgd2lkdGggJiBoZWlnaHQgKi8KKyAgICBzcXVhcmUgPSBzcXJ0KCA0ICogYiAqIGIgKyAoYSAtIGMpICogKGEgLSBjKSApOworCisgICAgLyogQ2FsY3VsYXRpbmcgb3JpZW50YXRpb24gKi8KKyAgICB0aGV0YSA9IGF0YW4yKCAyICogYiwgYSAtIGMgKyBzcXVhcmUgKTsKKworICAgIC8qIENhbGN1bGF0aW5nIHdpZHRoICYgbGVuZ3RoIG9mIGZpZ3VyZSAqLworICAgIGNzID0gY29zKCB0aGV0YSApOworICAgIHNuID0gc2luKCB0aGV0YSApOworCisgICAgcm90YXRlX2EgPSBjcyAqIGNzICogbXUyMCArIDIgKiBjcyAqIHNuICogbXUxMSArIHNuICogc24gKiBtdTAyOworICAgIHJvdGF0ZV9jID0gc24gKiBzbiAqIG11MjAgLSAyICogY3MgKiBzbiAqIG11MTEgKyBjcyAqIGNzICogbXUwMjsKKyAgICBsZW5ndGggPSBzcXJ0KCByb3RhdGVfYSAqIGludl9tMDAgKSAqIDQ7CisgICAgd2lkdGggPSBzcXJ0KCByb3RhdGVfYyAqIGludl9tMDAgKSAqIDQ7CisKKyAgICAvKiBJbiBjYXNlLCB3aGVuIHRldHRhIGlzIDAgb3IgMS41Ny4uLiB0aGUgTGVuZ3RoICYgV2lkdGggbWF5IGJlIGV4Y2hhbmdlZCAqLworICAgIGlmKCBsZW5ndGggPCB3aWR0aCApCisgICAgeworICAgICAgICBkb3VibGUgdDsKKyAgICAgICAgCisgICAgICAgIENWX1NXQVAoIGxlbmd0aCwgd2lkdGgsIHQgKTsKKyAgICAgICAgQ1ZfU1dBUCggY3MsIHNuLCB0ICk7CisgICAgICAgIHRoZXRhID0gQ1ZfUEkqMC41IC0gdGhldGE7CisgICAgfQorCisgICAgLyogU2F2aW5nIHJlc3VsdHMgKi8KKyAgICBpZiggX2NvbXAgfHwgYm94ICkKKyAgICB7CisgICAgICAgIGludCB0MCwgdDE7CisgICAgICAgIGludCBfeGMgPSBjdlJvdW5kKCB4YyApOworICAgICAgICBpbnQgX3ljID0gY3ZSb3VuZCggeWMgKTsKKworICAgICAgICB0MCA9IGN2Um91bmQoIGZhYnMoIGxlbmd0aCAqIGNzICkpOworICAgICAgICB0MSA9IGN2Um91bmQoIGZhYnMoIHdpZHRoICogc24gKSk7CisKKyAgICAgICAgdDAgPSBNQVgoIHQwLCB0MSApICsgMjsKKyAgICAgICAgY29tcC5yZWN0LndpZHRoID0gTUlOKCB0MCwgKG1hdC0+d2lkdGggLSBfeGMpICogMiApOworCisgICAgICAgIHQwID0gY3ZSb3VuZCggZmFicyggbGVuZ3RoICogc24gKSk7CisgICAgICAgIHQxID0gY3ZSb3VuZCggZmFicyggd2lkdGggKiBjcyApKTsKKworICAgICAgICB0MCA9IE1BWCggdDAsIHQxICkgKyAyOworICAgICAgICBjb21wLnJlY3QuaGVpZ2h0ID0gTUlOKCB0MCwgKG1hdC0+aGVpZ2h0IC0gX3ljKSAqIDIgKTsKKworICAgICAgICBjb21wLnJlY3QueCA9IE1BWCggMCwgX3hjIC0gY29tcC5yZWN0LndpZHRoIC8gMiApOworICAgICAgICBjb21wLnJlY3QueSA9IE1BWCggMCwgX3ljIC0gY29tcC5yZWN0LmhlaWdodCAvIDIgKTsKKworICAgICAgICBjb21wLnJlY3Qud2lkdGggPSBNSU4oIG1hdC0+d2lkdGggLSBjb21wLnJlY3QueCwgY29tcC5yZWN0LndpZHRoICk7CisgICAgICAgIGNvbXAucmVjdC5oZWlnaHQgPSBNSU4oIG1hdC0+aGVpZ2h0IC0gY29tcC5yZWN0LnksIGNvbXAucmVjdC5oZWlnaHQgKTsKKyAgICAgICAgY29tcC5hcmVhID0gKGZsb2F0KSBtMDA7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBfY29tcCApCisgICAgICAgICpfY29tcCA9IGNvbXA7CisgICAgCisgICAgaWYoIGJveCApCisgICAgeworICAgICAgICBib3gtPnNpemUuaGVpZ2h0ID0gKGZsb2F0KWxlbmd0aDsKKyAgICAgICAgYm94LT5zaXplLndpZHRoID0gKGZsb2F0KXdpZHRoOworICAgICAgICBib3gtPmFuZ2xlID0gKGZsb2F0KSh0aGV0YSoxODAuL0NWX1BJKTsKKyAgICAgICAgYm94LT5jZW50ZXIgPSBjdlBvaW50MkQzMmYoIGNvbXAucmVjdC54ICsgY29tcC5yZWN0LndpZHRoKjAuNWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3QueSArIGNvbXAucmVjdC5oZWlnaHQqMC41Zik7CisgICAgfQorCisgICAgcmV0dXJuIGl0ZXJzVXNlZDsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZjYW5ueS5jcHAgYi9jdi9zcmMvY3ZjYW5ueS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiNmRjMwotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmNhbm55LmNwcApAQCAtMCwwICsxLDM1NyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworaWN2Q2FubnlHZXRTaXplX3QgaWN2Q2FubnlHZXRTaXplX3AgPSAwOworaWN2Q2FubnlfMTZzOHVfQzFSX3QgaWN2Q2FubnlfMTZzOHVfQzFSX3AgPSAwOworCitDVl9JTVBMIHZvaWQKK2N2Q2FubnkoIGNvbnN0IHZvaWQqIHNyY2Fyciwgdm9pZCogZHN0YXJyLAorICAgICAgICAgZG91YmxlIGxvd190aHJlc2gsIGRvdWJsZSBoaWdoX3RocmVzaCwgaW50IGFwZXJ0dXJlX3NpemUgKQoreworICAgIEN2TWF0ICpkeCA9IDAsICpkeSA9IDA7CisgICAgdm9pZCAqYnVmZmVyID0gMDsKKyAgICB1Y2hhciAqKnN0YWNrX3RvcCwgKipzdGFja19ib3R0b20gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNhbm55IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgZmxhZ3MgPSBhcGVydHVyZV9zaXplOworICAgIGludCBsb3csIGhpZ2g7CisgICAgaW50KiBtYWdfYnVmWzNdOworICAgIHVjaGFyKiBtYXA7CisgICAgaW50IG1hcHN0ZXAsIG1heHNpemU7CisgICAgaW50IGksIGo7CisgICAgQ3ZNYXQgbWFnX3JvdzsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViICkpOworCisgICAgaWYoIENWX01BVF9UWVBFKCBzcmMtPnR5cGUgKSAhPSBDVl84VUMxIHx8CisgICAgICAgIENWX01BVF9UWVBFKCBkc3QtPnR5cGUgKSAhPSBDVl84VUMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBsb3dfdGhyZXNoID4gaGlnaF90aHJlc2ggKQorICAgIHsKKyAgICAgICAgZG91YmxlIHQ7CisgICAgICAgIENWX1NXQVAoIGxvd190aHJlc2gsIGhpZ2hfdGhyZXNoLCB0ICk7CisgICAgfQorCisgICAgYXBlcnR1cmVfc2l6ZSAmPSBJTlRfTUFYOworICAgIGlmKCAoYXBlcnR1cmVfc2l6ZSAmIDEpID09IDAgfHwgYXBlcnR1cmVfc2l6ZSA8IDMgfHwgYXBlcnR1cmVfc2l6ZSA+IDcgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkRmxhZywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworCisgICAgZHggPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIENWXzE2U0MxICk7CisgICAgZHkgPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIENWXzE2U0MxICk7CisgICAgY3ZTb2JlbCggc3JjLCBkeCwgMSwgMCwgYXBlcnR1cmVfc2l6ZSApOworICAgIGN2U29iZWwoIHNyYywgZHksIDAsIDEsIGFwZXJ0dXJlX3NpemUgKTsKKworICAgIGlmKCBpY3ZDYW5ueUdldFNpemVfcCAmJiBpY3ZDYW5ueV8xNnM4dV9DMVJfcCAmJiAhKGZsYWdzICYgQ1ZfQ0FOTllfTDJfR1JBRElFTlQpICkKKyAgICB7CisgICAgICAgIGludCBidWZfc2l6ZT0gIDA7CisgICAgICAgIElQUElfQ0FMTCggaWN2Q2FubnlHZXRTaXplX3AoIHNpemUsICZidWZfc2l6ZSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgIElQUElfQ0FMTCggaWN2Q2FubnlfMTZzOHVfQzFSX3AoIChzaG9ydCopZHgtPmRhdGEucHRyLCBkeC0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2hvcnQqKWR5LT5kYXRhLnB0ciwgZHktPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIChmbG9hdClsb3dfdGhyZXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCloaWdoX3RocmVzaCwgYnVmZmVyICkpOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCBmbGFncyAmIENWX0NBTk5ZX0wyX0dSQURJRU5UICkKKyAgICB7CisgICAgICAgIEN2MzJzdWYgdWwsIHVoOworICAgICAgICB1bC5mID0gKGZsb2F0KWxvd190aHJlc2g7CisgICAgICAgIHVoLmYgPSAoZmxvYXQpaGlnaF90aHJlc2g7CisKKyAgICAgICAgbG93ID0gdWwuaTsKKyAgICAgICAgaGlnaCA9IHVoLmk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxvdyA9IGN2Rmxvb3IoIGxvd190aHJlc2ggKTsKKyAgICAgICAgaGlnaCA9IGN2Rmxvb3IoIGhpZ2hfdGhyZXNoICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyggKHNpemUud2lkdGgrMikqKHNpemUuaGVpZ2h0KzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemUud2lkdGgrMikqMypzaXplb2YoaW50KSkgKTsKKworICAgIG1hZ19idWZbMF0gPSAoaW50KilidWZmZXI7CisgICAgbWFnX2J1ZlsxXSA9IG1hZ19idWZbMF0gKyBzaXplLndpZHRoICsgMjsKKyAgICBtYWdfYnVmWzJdID0gbWFnX2J1ZlsxXSArIHNpemUud2lkdGggKyAyOworICAgIG1hcCA9ICh1Y2hhciopKG1hZ19idWZbMl0gKyBzaXplLndpZHRoICsgMik7CisgICAgbWFwc3RlcCA9IHNpemUud2lkdGggKyAyOworCisgICAgbWF4c2l6ZSA9IE1BWCggMSA8PCAxMCwgc2l6ZS53aWR0aCpzaXplLmhlaWdodC8xMCApOworICAgIENWX0NBTEwoIHN0YWNrX3RvcCA9IHN0YWNrX2JvdHRvbSA9ICh1Y2hhcioqKWN2QWxsb2MoIG1heHNpemUqc2l6ZW9mKHN0YWNrX3RvcFswXSkgKSk7CisKKyAgICBtZW1zZXQoIG1hZ19idWZbMF0sIDAsIChzaXplLndpZHRoKzIpKnNpemVvZihpbnQpICk7CisgICAgbWVtc2V0KCBtYXAsIDEsIG1hcHN0ZXAgKTsKKyAgICBtZW1zZXQoIG1hcCArIG1hcHN0ZXAqKHNpemUuaGVpZ2h0ICsgMSksIDEsIG1hcHN0ZXAgKTsKKworICAgIC8qIHNlY3RvciBudW1iZXJzIAorICAgICAgIChUb3AtTGVmdCBPcmlnaW4pCisKKyAgICAgICAgMSAgIDIgICAzCisgICAgICAgICAqICAqICAqIAorICAgICAgICAgICogKiAqICAKKyAgICAgICAgMCoqKioqKiowCisgICAgICAgICAgKiAqICogIAorICAgICAgICAgKiAgKiAgKiAKKyAgICAgICAgMyAgIDIgICAxCisgICAgKi8KKworICAgICNkZWZpbmUgQ0FOTllfUFVTSChkKSAgICAqKGQpID0gKHVjaGFyKTIsICpzdGFja190b3ArKyA9IChkKQorICAgICNkZWZpbmUgQ0FOTllfUE9QKGQpICAgICAoZCkgPSAqLS1zdGFja190b3AKKworICAgIG1hZ19yb3cgPSBjdk1hdCggMSwgc2l6ZS53aWR0aCwgQ1ZfMzJGICk7CisKKyAgICAvLyBjYWxjdWxhdGUgbWFnbml0dWRlIGFuZCBhbmdsZSBvZiBncmFkaWVudCwgcGVyZm9ybSBub24tbWF4aW1hIHN1cHJlc3Npb24uCisgICAgLy8gZmlsbCB0aGUgbWFwIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorICAgIC8vICAgMCAtIHRoZSBwaXhlbCBtaWdodCBiZWxvbmcgdG8gYW4gZWRnZQorICAgIC8vICAgMSAtIHRoZSBwaXhlbCBjYW4gbm90IGJlbG9uZyB0byBhbiBlZGdlCisgICAgLy8gICAyIC0gdGhlIHBpeGVsIGRvZXMgYmVsb25nIHRvIGFuIGVkZ2UKKyAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgaW50KiBfbWFnID0gbWFnX2J1ZlsoaSA+IDApICsgMV0gKyAxOworICAgICAgICBmbG9hdCogX21hZ2YgPSAoZmxvYXQqKV9tYWc7CisgICAgICAgIGNvbnN0IHNob3J0KiBfZHggPSAoc2hvcnQqKShkeC0+ZGF0YS5wdHIgKyBkeC0+c3RlcCppKTsKKyAgICAgICAgY29uc3Qgc2hvcnQqIF9keSA9IChzaG9ydCopKGR5LT5kYXRhLnB0ciArIGR5LT5zdGVwKmkpOworICAgICAgICB1Y2hhciogX21hcDsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIGludCBtYWdzdGVwMSwgbWFnc3RlcDI7CisgICAgICAgIGludCBwcmV2X2ZsYWcgPSAwOworCisgICAgICAgIGlmKCBpIDwgc2l6ZS5oZWlnaHQgKQorICAgICAgICB7CisgICAgICAgICAgICBfbWFnWy0xXSA9IF9tYWdbc2l6ZS53aWR0aF0gPSAwOworCisgICAgICAgICAgICBpZiggIShmbGFncyAmIENWX0NBTk5ZX0wyX0dSQURJRU5UKSApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIF9tYWdbal0gPSBhYnMoX2R4W2pdKSArIGFicyhfZHlbal0pOworICAgICAgICAgICAgZWxzZSBpZiggaWN2RmlsdGVyU29iZWxWZXJ0Xzh1MTZzX0MxUl9wICE9IDAgKSAvLyBjaGVjayBmb3IgSVBQCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdXNlIHZlY3Rvcml6ZWQgc3FydAorICAgICAgICAgICAgICAgIG1hZ19yb3cuZGF0YS5mbCA9IF9tYWdmOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeCA9IF9keFtqXTsgeSA9IF9keVtqXTsKKyAgICAgICAgICAgICAgICAgICAgX21hZ2Zbal0gPSAoZmxvYXQpKChkb3VibGUpeCp4ICsgKGRvdWJsZSl5KnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdlBvdyggJm1hZ19yb3csICZtYWdfcm93LCAwLjUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHggPSBfZHhbal07IHkgPSBfZHlbal07CisgICAgICAgICAgICAgICAgICAgIF9tYWdmW2pdID0gKGZsb2F0KXNxcnQoKGRvdWJsZSl4KnggKyAoZG91YmxlKXkqeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1lbXNldCggX21hZy0xLCAwLCAoc2l6ZS53aWR0aCArIDIpKnNpemVvZihpbnQpICk7CisKKyAgICAgICAgLy8gYXQgdGhlIHZlcnkgYmVnaW5uaW5nIHdlIGRvIG5vdCBoYXZlIGEgY29tcGxldGUgcmluZworICAgICAgICAvLyBidWZmZXIgb2YgMyBtYWduaXR1ZGUgcm93cyBmb3Igbm9uLW1heGltYSBzdXBwcmVzc2lvbgorICAgICAgICBpZiggaSA9PSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIF9tYXAgPSBtYXAgKyBtYXBzdGVwKmkgKyAxOworICAgICAgICBfbWFwWy0xXSA9IF9tYXBbc2l6ZS53aWR0aF0gPSAxOworICAgICAgICAKKyAgICAgICAgX21hZyA9IG1hZ19idWZbMV0gKyAxOyAvLyB0YWtlIHRoZSBjZW50cmFsIHJvdworICAgICAgICBfZHggPSAoc2hvcnQqKShkeC0+ZGF0YS5wdHIgKyBkeC0+c3RlcCooaS0xKSk7CisgICAgICAgIF9keSA9IChzaG9ydCopKGR5LT5kYXRhLnB0ciArIGR5LT5zdGVwKihpLTEpKTsKKyAgICAgICAgCisgICAgICAgIG1hZ3N0ZXAxID0gKGludCkobWFnX2J1ZlsyXSAtIG1hZ19idWZbMV0pOworICAgICAgICBtYWdzdGVwMiA9IChpbnQpKG1hZ19idWZbMF0gLSBtYWdfYnVmWzFdKTsKKworICAgICAgICBpZiggKHN0YWNrX3RvcCAtIHN0YWNrX2JvdHRvbSkgKyBzaXplLndpZHRoID4gbWF4c2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyKiogbmV3X3N0YWNrX2JvdHRvbTsKKyAgICAgICAgICAgIG1heHNpemUgPSBNQVgoIG1heHNpemUgKiAzLzIsIG1heHNpemUgKyBzaXplLndpZHRoICk7CisgICAgICAgICAgICBDVl9DQUxMKCBuZXdfc3RhY2tfYm90dG9tID0gKHVjaGFyKiopY3ZBbGxvYyggbWF4c2l6ZSAqIHNpemVvZihzdGFja190b3BbMF0pKSApOworICAgICAgICAgICAgbWVtY3B5KCBuZXdfc3RhY2tfYm90dG9tLCBzdGFja19ib3R0b20sIChzdGFja190b3AgLSBzdGFja19ib3R0b20pKnNpemVvZihzdGFja190b3BbMF0pICk7CisgICAgICAgICAgICBzdGFja190b3AgPSBuZXdfc3RhY2tfYm90dG9tICsgKHN0YWNrX3RvcCAtIHN0YWNrX2JvdHRvbSk7CisgICAgICAgICAgICBjdkZyZWUoICZzdGFja19ib3R0b20gKTsKKyAgICAgICAgICAgIHN0YWNrX2JvdHRvbSA9IG5ld19zdGFja19ib3R0b207CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgI2RlZmluZSBDQU5OWV9TSElGVCAxNQorICAgICAgICAgICAgI2RlZmluZSBURzIyICAoaW50KSgwLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTcqKDE8PENBTk5ZX1NISUZUKSArIDAuNSkKKworICAgICAgICAgICAgeCA9IF9keFtqXTsKKyAgICAgICAgICAgIHkgPSBfZHlbal07CisgICAgICAgICAgICBpbnQgcyA9IHggXiB5OworICAgICAgICAgICAgaW50IG0gPSBfbWFnW2pdOworCisgICAgICAgICAgICB4ID0gYWJzKHgpOworICAgICAgICAgICAgeSA9IGFicyh5KTsKKyAgICAgICAgICAgIGlmKCBtID4gbG93ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGcyMnggPSB4ICogVEcyMjsKKyAgICAgICAgICAgICAgICBpbnQgdGc2N3ggPSB0ZzIyeCArICgoeCArIHgpIDw8IENBTk5ZX1NISUZUKTsKKworICAgICAgICAgICAgICAgIHkgPDw9IENBTk5ZX1NISUZUOworCisgICAgICAgICAgICAgICAgaWYoIHkgPCB0ZzIyeCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbSA+IF9tYWdbai0xXSAmJiBtID49IF9tYWdbaisxXSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtID4gaGlnaCAmJiAhcHJldl9mbGFnICYmIF9tYXBbai1tYXBzdGVwXSAhPSAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5OWV9QVVNIKCBfbWFwICsgaiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21hcFtqXSA9ICh1Y2hhcikwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggeSA+IHRnNjd4ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBtID4gX21hZ1tqK21hZ3N0ZXAyXSAmJiBtID49IF9tYWdbaittYWdzdGVwMV0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbSA+IGhpZ2ggJiYgIXByZXZfZmxhZyAmJiBfbWFwW2otbWFwc3RlcF0gIT0gMiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FOTllfUFVTSCggX21hcCArIGogKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X2ZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tYXBbal0gPSAodWNoYXIpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBzIDwgMCA/IC0xIDogMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG0gPiBfbWFnW2orbWFnc3RlcDItc10gJiYgbSA+IF9tYWdbaittYWdzdGVwMStzXSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtID4gaGlnaCAmJiAhcHJldl9mbGFnICYmIF9tYXBbai1tYXBzdGVwXSAhPSAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQU5OWV9QVVNIKCBfbWFwICsgaiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21hcFtqXSA9ICh1Y2hhcikwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2ZsYWcgPSAwOworICAgICAgICAgICAgX21hcFtqXSA9ICh1Y2hhcikxOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2Nyb2xsIHRoZSByaW5nIGJ1ZmZlcgorICAgICAgICBfbWFnID0gbWFnX2J1ZlswXTsKKyAgICAgICAgbWFnX2J1ZlswXSA9IG1hZ19idWZbMV07CisgICAgICAgIG1hZ19idWZbMV0gPSBtYWdfYnVmWzJdOworICAgICAgICBtYWdfYnVmWzJdID0gX21hZzsKKyAgICB9CisKKyAgICAvLyBub3cgdHJhY2sgdGhlIGVkZ2VzIChoeXN0ZXJlc2lzIHRocmVzaG9sZGluZykKKyAgICB3aGlsZSggc3RhY2tfdG9wID4gc3RhY2tfYm90dG9tICkKKyAgICB7CisgICAgICAgIHVjaGFyKiBtOworICAgICAgICBpZiggKHN0YWNrX3RvcCAtIHN0YWNrX2JvdHRvbSkgKyA4ID4gbWF4c2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyKiogbmV3X3N0YWNrX2JvdHRvbTsKKyAgICAgICAgICAgIG1heHNpemUgPSBNQVgoIG1heHNpemUgKiAzLzIsIG1heHNpemUgKyA4ICk7CisgICAgICAgICAgICBDVl9DQUxMKCBuZXdfc3RhY2tfYm90dG9tID0gKHVjaGFyKiopY3ZBbGxvYyggbWF4c2l6ZSAqIHNpemVvZihzdGFja190b3BbMF0pKSApOworICAgICAgICAgICAgbWVtY3B5KCBuZXdfc3RhY2tfYm90dG9tLCBzdGFja19ib3R0b20sIChzdGFja190b3AgLSBzdGFja19ib3R0b20pKnNpemVvZihzdGFja190b3BbMF0pICk7CisgICAgICAgICAgICBzdGFja190b3AgPSBuZXdfc3RhY2tfYm90dG9tICsgKHN0YWNrX3RvcCAtIHN0YWNrX2JvdHRvbSk7CisgICAgICAgICAgICBjdkZyZWUoICZzdGFja19ib3R0b20gKTsKKyAgICAgICAgICAgIHN0YWNrX2JvdHRvbSA9IG5ld19zdGFja19ib3R0b207CisgICAgICAgIH0KKworICAgICAgICBDQU5OWV9QT1AobSk7CisgICAgCisgICAgICAgIGlmKCAhbVstMV0gKQorICAgICAgICAgICAgQ0FOTllfUFVTSCggbSAtIDEgKTsKKyAgICAgICAgaWYoICFtWzFdICkKKyAgICAgICAgICAgIENBTk5ZX1BVU0goIG0gKyAxICk7CisgICAgICAgIGlmKCAhbVstbWFwc3RlcC0xXSApCisgICAgICAgICAgICBDQU5OWV9QVVNIKCBtIC0gbWFwc3RlcCAtIDEgKTsKKyAgICAgICAgaWYoICFtWy1tYXBzdGVwXSApCisgICAgICAgICAgICBDQU5OWV9QVVNIKCBtIC0gbWFwc3RlcCApOworICAgICAgICBpZiggIW1bLW1hcHN0ZXArMV0gKQorICAgICAgICAgICAgQ0FOTllfUFVTSCggbSAtIG1hcHN0ZXAgKyAxICk7CisgICAgICAgIGlmKCAhbVttYXBzdGVwLTFdICkKKyAgICAgICAgICAgIENBTk5ZX1BVU0goIG0gKyBtYXBzdGVwIC0gMSApOworICAgICAgICBpZiggIW1bbWFwc3RlcF0gKQorICAgICAgICAgICAgQ0FOTllfUFVTSCggbSArIG1hcHN0ZXAgKTsKKyAgICAgICAgaWYoICFtW21hcHN0ZXArMV0gKQorICAgICAgICAgICAgQ0FOTllfUFVTSCggbSArIG1hcHN0ZXAgKyAxICk7CisgICAgfQorCisgICAgLy8gdGhlIGZpbmFsIHBhc3MsIGZvcm0gdGhlIGZpbmFsIGltYWdlCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIF9tYXAgPSBtYXAgKyBtYXBzdGVwKihpKzEpICsgMTsKKyAgICAgICAgdWNoYXIqIF9kc3QgPSBkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKmk7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgIF9kc3Rbal0gPSAodWNoYXIpLShfbWFwW2pdID4+IDEpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZkeCApOworICAgIGN2UmVsZWFzZU1hdCggJmR5ICk7CisgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisgICAgY3ZGcmVlKCAmc3RhY2tfYm90dG9tICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2Y29sb3IuY3BwIGIvY3Yvc3JjL2N2Y29sb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YmFhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zjb2xvci5jcHAKQEAgLTAsMCArMSwyNTUxIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPUFlSSUdIVCBOT1RJQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgVGhlIGZ1bmN0aW9uIGZvciBSR0IgdG8gTGFiIGNvbnZlcnNpb24gaXMgYmFzZWQgb24gdGhlIE1BVExBQiBzY3JpcHQKKyAgUkdCMkxhYi5tIHRyYW5zbGF0ZWQgYnkgTWFyayBSdXpvbiBmcm9tIEMgY29kZSBieSBZb3NzaSBSdWJuZXIsIDIzIFNlcHRlbWJlciAxOTk3LgorICBTZWUgdGhlIHBhZ2UgW2h0dHA6Ly92aXNpb24uc3RhbmZvcmQuZWR1L35ydXpvbi9zb2Z0d2FyZS9yZ2JsYWIuaHRtbF0KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENPUFlSSUdIVCBOT1RJQ0UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgT3JpZ2luYWwgY29kZSBmb3IgQmF5ZXItPkJHUi9SR0IgY29udmVyc2lvbiBpcyBwcm92aWRlZCBieSBEaXJrIFNjaGFlZmVyCisgIGZyb20gTUQtTWF0aGVtYXRpc2NoZSBEaWVuc3RlIEdtYkguIEJlbG93IGlzIHRoZSBjb3B5cmlnaHQgbm90aWNlOgorCisgICAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKyAgICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlCisgICAgdG8gdGhpcyBsaWNlbnNlLiBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLAorICAgIGluc3RhbGwsIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKworICAgIENvbnRyaWJ1dG9ycyBMaWNlbnNlIEFncmVlbWVudDoKKworICAgICAgQ29weXJpZ2h0IChjKSAyMDAyLAorICAgICAgTUQtTWF0aGVtYXRpc2NoZSBEaWVuc3RlIEdtYkgKKyAgICAgIEltIERlZmRhaGwgNS0xMAorICAgICAgNDQxNDEgRG9ydG11bmQKKyAgICAgIEdlcm1hbnkKKyAgICAgIHd3dy5tZC1pdC5kZQorICAKKyAgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLAorICAgIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQKKyAgICB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OiAKKworICAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbgorICAgIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAgICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAgICBUaGUgbmFtZSBvZiBDb250cmlidXRvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgICAgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgICAgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICAgIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICAgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAgICBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICAgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKKyAgICBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICAgIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiX2N2LmgiCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkNvbG9yQ3Z0RnVuYzApKAorICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkNvbG9yQ3Z0RnVuYzEpKAorICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgQ3ZTaXplIHNpemUsIGludCBwYXJhbTAgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2Q29sb3JDdnRGdW5jMikoCisgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICBDdlNpemUgc2l6ZSwgaW50IHBhcmFtMCwgaW50IHBhcmFtMSApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZDb2xvckN2dEZ1bmMzKSgKKyAgICBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLAorICAgIEN2U2l6ZSBzaXplLCBpbnQgcGFyYW0wLCBpbnQgcGFyYW0xLCBpbnQgcGFyYW0yICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgVmFyaW91cyAzLzQtY2hhbm5lbCB0byAzLzQtY2hhbm5lbCBSR0IgdHJhbnNmb3JtYXRpb25zICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9JTVBMX0JHUlgyQkdSKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2QkdSeDJCR1JfIyNmbGF2b3IjI19DbkMzUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sIGludCBibHVlX2lkeCApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBzcmMgKz0gc3JjX2NuICkgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJydHlwZSB0MD1zcmNbYmx1ZV9pZHhdLCB0MT1zcmNbMV0sIHQyPXNyY1tibHVlX2lkeF4yXTsgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMl0gPSB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgQ1ZfSU1QTF9CR1IyQkdSWCggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkJHUjJCR1J4XyMjZmxhdm9yIyNfQzNDNFIoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgYmx1ZV9pZHggKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gNCwgc3JjICs9IDMgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDA9c3JjW2JsdWVfaWR4XSwgdDE9c3JjWzFdLCB0Mj1zcmNbYmx1ZV9pZHheMl07ICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzNdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIENWX0lNUExfQkdSQTJSR0JBKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZCR1JBMlJHQkFfIyNmbGF2b3IjI19DNFIoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQwID0gc3JjWzJdLCB0MSA9IHNyY1sxXSwgdDIgPSBzcmNbMF0sIHQzID0gc3JjWzNdOyBcCisgICAgICAgICAgICBkc3RbaV0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsyXSA9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSszXSA9IHQzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworQ1ZfSU1QTF9CR1JYMkJHUiggOHUsIHVjaGFyICkKK0NWX0lNUExfQkdSWDJCR1IoIDE2dSwgdXNob3J0ICkKK0NWX0lNUExfQkdSWDJCR1IoIDMyZiwgaW50ICkKK0NWX0lNUExfQkdSMkJHUlgoIDh1LCB1Y2hhciApCitDVl9JTVBMX0JHUjJCR1JYKCAxNnUsIHVzaG9ydCApCitDVl9JTVBMX0JHUjJCR1JYKCAzMmYsIGludCApCitDVl9JTVBMX0JHUkEyUkdCQSggOHUsIHVjaGFyICkKK0NWX0lNUExfQkdSQTJSR0JBKCAxNnUsIHVzaG9ydCApCitDVl9JTVBMX0JHUkEyUkdCQSggMzJmLCBpbnQgKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgVHJhbnNmb3JtaW5nIDE2LWJpdCAoNTY1IG9yIDU1NSkgUkdCIHRvL2Zyb20gMjQvMzItYml0ICg4ODhbOF0pIFJHQiAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUjV4NTJCR1J4Xzh1X0MyQ25SKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGRzdF9jbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmx1ZV9pZHgsIGludCBncmVlbl9iaXRzICkKK3sKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQoIGdyZWVuX2JpdHMgPT0gNSB8fCBncmVlbl9iaXRzID09IDYgKTsKKyAgICBkc3RzdGVwIC09IHNpemUud2lkdGgqZHN0X2NuOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBpZiggZ3JlZW5fYml0cyA9PSA2ICkKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIGRzdCArPSBkc3RfY24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHQgPSAoKGNvbnN0IHVzaG9ydCopc3JjKVtpXTsKKyAgICAgICAgICAgICAgICBkc3RbYmx1ZV9pZHhdID0gKHVjaGFyKSh0IDw8IDMpOworICAgICAgICAgICAgICAgIGRzdFsxXSA9ICh1Y2hhcikoKHQgPj4gMykgJiB+Myk7CisgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4IF4gMl0gPSAodWNoYXIpKCh0ID4+IDgpICYgfjcpOworICAgICAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIGRzdCArPSBkc3RfY24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHQgPSAoKGNvbnN0IHVzaG9ydCopc3JjKVtpXTsKKyAgICAgICAgICAgICAgICBkc3RbYmx1ZV9pZHhdID0gKHVjaGFyKSh0IDw8IDMpOworICAgICAgICAgICAgICAgIGRzdFsxXSA9ICh1Y2hhcikoKHQgPj4gMikgJiB+Nyk7CisgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4IF4gMl0gPSAodWNoYXIpKCh0ID4+IDcpICYgfjcpOworICAgICAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZCR1J4MkJHUjV4NV84dV9DbkMyUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsdWVfaWR4LCBpbnQgZ3JlZW5fYml0cyApCit7CisgICAgaW50IGk7CisgICAgc3Jjc3RlcCAtPSBzaXplLndpZHRoKnNyY19jbjsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgaWYoIGdyZWVuX2JpdHMgPT0gNiApCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBzcmMgKz0gc3JjX2NuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IChzcmNbYmx1ZV9pZHhdID4+IDMpfCgoc3JjWzFdJn4zKSA8PCAzKXwoKHNyY1tibHVlX2lkeF4yXSZ+NykgPDwgOCk7CisgICAgICAgICAgICAgICAgKCh1c2hvcnQqKWRzdClbaV0gPSAodXNob3J0KXQ7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIHNyYyArPSBzcmNfY24gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gKHNyY1tibHVlX2lkeF0gPj4gMyl8KChzcmNbMV0mfjcpIDw8IDIpfCgoc3JjW2JsdWVfaWR4XjJdJn43KSA8PCA3KTsKKyAgICAgICAgICAgICAgICAoKHVzaG9ydCopZHN0KVtpXSA9ICh1c2hvcnQpdDsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSVBQIENvbG9yIENvbnZlcnNpb24gRnVuY3Rpb25zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpY3ZSR0IyWFlaXzh1X0MzUl90ICBpY3ZSR0IyWFlaXzh1X0MzUl9wID0gMDsKK2ljdlJHQjJYWVpfMTZ1X0MzUl90IGljdlJHQjJYWVpfMTZ1X0MzUl9wID0gMDsKK2ljdlJHQjJYWVpfMzJmX0MzUl90IGljdlJHQjJYWVpfMzJmX0MzUl9wID0gMDsKK2ljdlhZWjJSR0JfOHVfQzNSX3QgIGljdlhZWjJSR0JfOHVfQzNSX3AgPSAwOworaWN2WFlaMlJHQl8xNnVfQzNSX3QgaWN2WFlaMlJHQl8xNnVfQzNSX3AgPSAwOworaWN2WFlaMlJHQl8zMmZfQzNSX3QgaWN2WFlaMlJHQl8zMmZfQzNSX3AgPSAwOworCitpY3ZSR0IySFNWXzh1X0MzUl90ICBpY3ZSR0IySFNWXzh1X0MzUl9wID0gMDsKK2ljdkhTVjJSR0JfOHVfQzNSX3QgIGljdkhTVjJSR0JfOHVfQzNSX3AgPSAwOworCitpY3ZCR1IyTGFiXzh1X0MzUl90ICBpY3ZCR1IyTGFiXzh1X0MzUl9wID0gMDsKK2ljdkxhYjJCR1JfOHVfQzNSX3QgIGljdkxhYjJCR1JfOHVfQzNSX3AgPSAwOworCitpY3ZSR0IySExTXzh1X0MzUl90ICBpY3ZSR0IySExTXzh1X0MzUl9wID0gMDsKK2ljdlJHQjJITFNfMzJmX0MzUl90IGljdlJHQjJITFNfMzJmX0MzUl9wID0gMDsKK2ljdkhMUzJSR0JfOHVfQzNSX3QgIGljdkhMUzJSR0JfOHVfQzNSX3AgPSAwOworaWN2SExTMlJHQl8zMmZfQzNSX3QgaWN2SExTMlJHQl8zMmZfQzNSX3AgPSAwOworCitpY3ZSR0IyTHV2Xzh1X0MzUl90ICBpY3ZSR0IyTHV2Xzh1X0MzUl9wID0gMDsKK2ljdkx1djJSR0JfOHVfQzNSX3QgIGljdkx1djJSR0JfOHVfQzNSX3AgPSAwOworCisvL2ljdlJHQjJMdXZfMzJmX0MzUl90IGljdlJHQjJMdXZfMzJmX0MzUl9wID0gMDsKKy8vaWN2THV2MlJHQl8zMmZfQzNSX3QgaWN2THV2MlJHQl8zMmZfQzNSX3AgPSAwOworLy9pY3ZSR0IyTHV2XzMyZl9DM1JfdCBpY3ZSR0IyTHV2XzMyZl9DM1JfcCA9IDA7CisvL2ljdkx1djJSR0JfMzJmX0MzUl90IGljdkx1djJSR0JfMzJmX0MzUl9wID0gMDsKKworCisjZGVmaW5lIENWX0lNUExfQkdSeDJBQkNfSVBQKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZCR1J4MkFCQ19JUFBfIyNmbGF2b3IjI19DbkMzUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICBcCisgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJsdWVfaWR4LCBDdkNvbG9yQ3Z0RnVuYzAgaXBwX2Z1bmMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJsb2NrX3NpemUgPSBNSU4oMSA8PCAxNCwgc2l6ZS53aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSogYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGRpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGRvX2NvcHkgPSBzcmNfY24gPiAzIHx8IGJsdWVfaWR4ICE9IDIgfHwgc3JjID09IGRzdDsgICAgICAgICAgICBcCisgICAgQ3ZTdGF0dXMgc3RhdHVzID0gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICFkb19jb3B5ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBpcHBfZnVuYyggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUgKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmZmVyID0gKGFycnR5cGUqKWN2U3RhY2tBbGxvYyggYmxvY2tfc2l6ZSozKnNpemVvZihidWZmZXJbMF0pICk7ICBcCisgICAgc3Jjc3RlcCAtPSBzaXplLndpZHRoKnNyY19jbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlKiBkc3QxID0gZHN0ICsgaSozOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkaSA9IE1JTihibG9ja19zaXplLCBzaXplLndpZHRoIC0gaSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzLCBzcmMgKz0gc3JjX2NuICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSBiID0gc3JjW2JsdWVfaWR4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSBnID0gc3JjWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSByID0gc3JjW2JsdWVfaWR4XjJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmZmVyW2tdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmZmVyW2srMV0gPSBnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmZmVyW2srMl0gPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBpcHBfZnVuYyggYnVmZmVyLCBDVl9TVFVCX1NURVAsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MSwgQ1ZfU1RVQl9TVEVQLCBjdlNpemUoZGksMSkgKTsgICAgICBcCisgICAgICAgICAgICBpZiggc3RhdHVzIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUngyQUJDX0lQUF84dV9DbkMzUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCBpbnQgc3JjX2NuLAorICAgIGludCBibHVlX2lkeCwgQ3ZDb2xvckN2dEZ1bmMwIGlwcF9mdW5jICkKK3sKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IE1JTigxIDw8IDE0LCBzaXplLndpZHRoKTsKKyAgICB1Y2hhciogYnVmZmVyOworICAgIGludCBpLCBkaSwgazsKKyAgICBpbnQgZG9fY29weSA9IHNyY19jbiA+IDMgfHwgYmx1ZV9pZHggIT0gMiB8fCBzcmMgPT0gZHN0OworICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworCisgICAgaWYoICFkb19jb3B5ICkKKyAgICAgICAgcmV0dXJuIGlwcF9mdW5jKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSApOworCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOworCisgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqMypzaXplb2YoYnVmZmVyWzBdKSApOworICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247CisKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IGJsb2NrX3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICB1Y2hhciogZHN0MSA9IGRzdCArIGkqMzsKKyAgICAgICAgICAgIGRpID0gTUlOKGJsb2NrX3NpemUsIHNpemUud2lkdGggLSBpKTsKKworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIgYiA9IHNyY1tibHVlX2lkeF07CisgICAgICAgICAgICAgICAgdWNoYXIgZyA9IHNyY1sxXTsKKyAgICAgICAgICAgICAgICB1Y2hhciByID0gc3JjW2JsdWVfaWR4XjJdOworICAgICAgICAgICAgICAgIGJ1ZmZlcltrXSA9IHI7CisgICAgICAgICAgICAgICAgYnVmZmVyW2srMV0gPSBnOworICAgICAgICAgICAgICAgIGJ1ZmZlcltrKzJdID0gYjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gaXBwX2Z1bmMoIGJ1ZmZlciwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEsIENWX1NUVUJfU1RFUCwgY3ZTaXplKGRpLDEpICk7CisgICAgICAgICAgICBpZiggc3RhdHVzIDwgMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisKKy8vQ1ZfSU1QTF9CR1J4MkFCQ19JUFAoIDh1LCB1Y2hhciApCitDVl9JTVBMX0JHUngyQUJDX0lQUCggMTZ1LCB1c2hvcnQgKQorQ1ZfSU1QTF9CR1J4MkFCQ19JUFAoIDMyZiwgZmxvYXQgKQorCisjZGVmaW5lIENWX0lNUExfQUJDMkJHUnhfSVBQKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZBQkMyQkdSeF9JUFBfIyNmbGF2b3IjI19DM0NuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICBcCisgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBkc3RfY24sICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJsdWVfaWR4LCBDdkNvbG9yQ3Z0RnVuYzAgaXBwX2Z1bmMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJsb2NrX3NpemUgPSBNSU4oMSA8PCAxMCwgc2l6ZS53aWR0aCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSogYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGRpLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGRvX2NvcHkgPSBkc3RfY24gPiAzIHx8IGJsdWVfaWR4ICE9IDIgfHwgc3JjID09IGRzdDsgICAgICAgICAgICBcCisgICAgQ3ZTdGF0dXMgc3RhdHVzID0gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICFkb19jb3B5ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBpcHBfZnVuYyggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUgKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYnVmZmVyID0gKGFycnR5cGUqKWN2U3RhY2tBbGxvYyggYmxvY2tfc2l6ZSozKnNpemVvZihidWZmZXJbMF0pICk7ICBcCisgICAgZHN0c3RlcCAtPSBzaXplLndpZHRoKmRzdF9jbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzcmMxID0gc3JjICsgaSozOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkaSA9IE1JTihibG9ja19zaXplLCBzaXplLndpZHRoIC0gaSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBpcHBfZnVuYyggc3JjMSwgQ1ZfU1RVQl9TVEVQLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBDVl9TVFVCX1NURVAsIGN2U2l6ZShkaSwxKSApOyAgICBcCisgICAgICAgICAgICBpZiggc3RhdHVzIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzLCBkc3QgKz0gZHN0X2NuICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSByID0gYnVmZmVyW2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSBnID0gYnVmZmVyW2srMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSBiID0gYnVmZmVyW2srMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4XSA9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0WzFdID0gZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4XjJdID0gcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIGRzdF9jbiA9PSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0NWX0lNUExfQUJDMkJHUnhfSVBQKCA4dSwgdWNoYXIgKQorQ1ZfSU1QTF9BQkMyQkdSeF9JUFAoIDE2dSwgdXNob3J0ICkKK0NWX0lNUExfQUJDMkJHUnhfSVBQKCAzMmYsIGZsb2F0ICkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yIHRvL2Zyb20gR3JheXNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBmaXgoeCxuKSAgICAgIChpbnQpKCh4KSooMSA8PCAobikpICsgMC41KQorI2RlZmluZSBkZXNjYWxlICAgICAgIENWX0RFU0NBTEUKKworI2RlZmluZSBjc2NHcl8zMmYgIDAuMjk5ZgorI2RlZmluZSBjc2NHZ18zMmYgIDAuNTg3ZgorI2RlZmluZSBjc2NHYl8zMmYgIDAuMTE0ZgorCisvKiBCR1IvUkdCIC0+IEdyYXkgKi8KKyNkZWZpbmUgY3NjX3NoaWZ0ICAxNAorI2RlZmluZSBjc2NHciAgZml4KGNzY0dyXzMyZixjc2Nfc2hpZnQpIAorI2RlZmluZSBjc2NHZyAgZml4KGNzY0dnXzMyZixjc2Nfc2hpZnQpCisjZGVmaW5lIGNzY0diICAvKmZpeChjc2NHYl8zMmYsY3NjX3NoaWZ0KSovICgoMSA8PCBjc2Nfc2hpZnQpIC0gY3NjR3IgLSBjc2NHZykKKworI2RlZmluZSBDVl9JTVBMX0dSQVkyQkdSWCggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZHcmF5MkJHUnhfIyNmbGF2b3IjI19DMUNuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgXAorICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9jbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLT0gc2l6ZS53aWR0aCpkc3RfY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGRzdF9jbiA9PSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBkc3QgKz0gMyApICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFswXSA9IGRzdFsxXSA9IGRzdFsyXSA9IHNyY1tpXTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBkc3QgKz0gNCApICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSBkc3RbMV0gPSBkc3RbMl0gPSBzcmNbaV07ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0WzNdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitDVl9JTVBMX0dSQVkyQkdSWCggOHUsIHVjaGFyICkKK0NWX0lNUExfR1JBWTJCR1JYKCAxNnUsIHVzaG9ydCApCitDVl9JTVBMX0dSQVkyQkdSWCggMzJmLCBmbG9hdCApCisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUjV4NTJHcmF5Xzh1X0MyQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGdyZWVuX2JpdHMgKQoreworICAgIGludCBpOworICAgIGFzc2VydCggZ3JlZW5fYml0cyA9PSA1IHx8IGdyZWVuX2JpdHMgPT0gNiApOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBpZiggZ3JlZW5fYml0cyA9PSA2ICkKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gKCh1c2hvcnQqKXNyYylbaV07CisgICAgICAgICAgICAgICAgdCA9ICgodCA8PCAzKSAmIDB4ZjgpKmNzY0diICsgKCh0ID4+IDMpICYgMHhmYykqY3NjR2cgKworICAgICAgICAgICAgICAgICAgICAoKHQgPj4gOCkgJiAweGY4KSpjc2NHcjsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAodWNoYXIpQ1ZfREVTQ0FMRSh0LGNzY19zaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gKCh1c2hvcnQqKXNyYylbaV07CisgICAgICAgICAgICAgICAgdCA9ICgodCA8PCAzKSAmIDB4ZjgpKmNzY0diICsgKCh0ID4+IDIpICYgMHhmOCkqY3NjR2cgKworICAgICAgICAgICAgICAgICAgICAoKHQgPj4gNykgJiAweGY4KSpjc2NHcjsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAodWNoYXIpQ1ZfREVTQ0FMRSh0LGNzY19zaGlmdCk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZHcmF5MkJHUjV4NV84dV9DMUMyUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBncmVlbl9iaXRzICkKK3sKKyAgICBpbnQgaTsKKyAgICBhc3NlcnQoIGdyZWVuX2JpdHMgPT0gNSB8fCBncmVlbl9iaXRzID09IDYgKTsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgaWYoIGdyZWVuX2JpdHMgPT0gNiApCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHNyY1tpXTsKKyAgICAgICAgICAgICAgICAoKHVzaG9ydCopZHN0KVtpXSA9ICh1c2hvcnQpKCh0ID4+IDMpfCgodCAmIH4zKSA8PCAzKXwoKHQgJiB+NykgPDwgOCkpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHNyY1tpXSA+PiAzOworICAgICAgICAgICAgICAgICgodXNob3J0Kilkc3QpW2ldID0gKHVzaG9ydCkodHwodCA8PCA1KXwodCA8PCAxMCkpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJHcmF5Xzh1X0NuQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIGludCBpOworICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247CisKKyAgICBpZiggc2l6ZS53aWR0aCpzaXplLmhlaWdodCA+PSAxMDI0ICkKKyAgICB7CisgICAgICAgIGludCogdGFiID0gKGludCopY3ZTdGFja0FsbG9jKCAyNTYqMypzaXplb2YodGFiWzBdKSApOworICAgICAgICBpbnQgciA9IDAsIGcgPSAwLCBiID0gKDEgPDwgKGNzY19zaGlmdC0xKSk7CisgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAyNTY7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRhYltpXSA9IGI7CisgICAgICAgICAgICB0YWJbaSsyNTZdID0gZzsKKyAgICAgICAgICAgIHRhYltpKzUxMl0gPSByOworICAgICAgICAgICAgZyArPSBjc2NHZzsKKyAgICAgICAgICAgIGlmKCAhYmx1ZV9pZHggKQorICAgICAgICAgICAgICAgIGIgKz0gY3NjR2IsIHIgKz0gY3NjR3I7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYiArPSBjc2NHciwgciArPSBjc2NHYjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBzcmMgKz0gc3JjX2NuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdDAgPSB0YWJbc3JjWzBdXSArIHRhYltzcmNbMV0gKyAyNTZdICsgdGFiW3NyY1syXSArIDUxMl07CisgICAgICAgICAgICAgICAgZHN0W2ldID0gKHVjaGFyKSh0MCA+PiBjc2Nfc2hpZnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBzcmMgKz0gc3JjX2NuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdDAgPSBzcmNbYmx1ZV9pZHhdKmNzY0diICsgc3JjWzFdKmNzY0dnICsgc3JjW2JsdWVfaWR4XjJdKmNzY0dyOworICAgICAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcilDVl9ERVNDQUxFKHQwLCBjc2Nfc2hpZnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJHcmF5XzE2dV9DbkMxUiggY29uc3QgdXNob3J0KiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0KiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzcmNfY24sIGludCBibHVlX2lkeCApCit7CisgICAgaW50IGk7CisgICAgaW50IGNiID0gY3NjR2IsIGNyID0gY3NjR3I7CisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOworICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247CisKKyAgICBpZiggYmx1ZV9pZHggKQorICAgICAgICBjYiA9IGNzY0dyLCBjciA9IGNzY0diOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIHNyYyArPSBzcmNfY24gKQorICAgICAgICAgICAgZHN0W2ldID0gKHVzaG9ydClDVl9ERVNDQUxFKCh1bnNpZ25lZCkoc3JjWzBdKmNiICsKKyAgICAgICAgICAgICAgICAgICAgc3JjWzFdKmNzY0dnICsgc3JjWzJdKmNyKSwgY3NjX3NoaWZ0KTsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJHcmF5XzMyZl9DbkMxUiggY29uc3QgZmxvYXQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIGludCBpOworICAgIGZsb2F0IGNiID0gY3NjR2JfMzJmLCBjciA9IGNzY0dyXzMyZjsKKyAgICBpZiggYmx1ZV9pZHggKQorICAgICAgICBjYiA9IGNzY0dyXzMyZiwgY3IgPSBjc2NHYl8zMmY7CisKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOworICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisgICAgc3Jjc3RlcCAtPSBzaXplLndpZHRoKnNyY19jbjsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgc3JjICs9IHNyY19jbiApCisgICAgICAgICAgICBkc3RbaV0gPSBzcmNbMF0qY2IgKyBzcmNbMV0qY3NjR2dfMzJmICsgc3JjWzJdKmNyOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IgPC0+IFlDckNiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQkdSL1JHQiAtPiBZQ3JDYiAqLworI2RlZmluZSB5dXZZcl8zMmYgY3NjR3JfMzJmCisjZGVmaW5lIHl1dllnXzMyZiBjc2NHZ18zMmYKKyNkZWZpbmUgeXV2WWJfMzJmIGNzY0diXzMyZgorI2RlZmluZSB5dXZDcl8zMmYgMC43MTNmCisjZGVmaW5lIHl1dkNiXzMyZiAwLjU2NGYKKworI2RlZmluZSB5dXZfc2hpZnQgMTQKKyNkZWZpbmUgeXV2WXIgIGZpeCh5dXZZcl8zMmYseXV2X3NoaWZ0KQorI2RlZmluZSB5dXZZZyAgZml4KHl1dllnXzMyZix5dXZfc2hpZnQpCisjZGVmaW5lIHl1dlliICBmaXgoeXV2WWJfMzJmLHl1dl9zaGlmdCkKKyNkZWZpbmUgeXV2Q3IgIGZpeCh5dXZDcl8zMmYseXV2X3NoaWZ0KQorI2RlZmluZSB5dXZDYiAgZml4KHl1dkNiXzMyZix5dXZfc2hpZnQpCisKKyNkZWZpbmUgeXV2X2Rlc2NhbGUoeCkgIENWX0RFU0NBTEUoKHgpLCB5dXZfc2hpZnQpCisjZGVmaW5lIHl1dl9wcmVzY2FsZSh4KSAoKHgpIDw8IHl1dl9zaGlmdCkKKworI2RlZmluZSAgeXV2UkNyXzMyZiAgIDEuNDAzZgorI2RlZmluZSAgeXV2R0NyXzMyZiAgICgtMC43MTRmKQorI2RlZmluZSAgeXV2R0NiXzMyZiAgICgtMC4zNDRmKQorI2RlZmluZSAgeXV2QkNiXzMyZiAgIDEuNzczZgorCisjZGVmaW5lICB5dXZSQ3IgICBmaXgoeXV2UkNyXzMyZix5dXZfc2hpZnQpCisjZGVmaW5lICB5dXZHQ3IgICAoLWZpeCgteXV2R0NyXzMyZix5dXZfc2hpZnQpKQorI2RlZmluZSAgeXV2R0NiICAgKC1maXgoLXl1dkdDYl8zMmYseXV2X3NoaWZ0KSkKKyNkZWZpbmUgIHl1dkJDYiAgIGZpeCh5dXZCQ2JfMzJmLHl1dl9zaGlmdCkKKworI2RlZmluZSBDVl9JTVBMX0JHUngyWUNyQ2IoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIHNjYWxlX21hY3JvLCBjYXN0X21hY3JvLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVl9ZQiwgWVVWX1lHLCBZVVZfWVIsIFlVVl9DUiwgWVVWX0NCLCBZVVZfQ3hfQklBUyApICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkJHUngyWUNyQ2JfIyNmbGF2b3IjI19DbkMzUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICBcCisgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sIGludCBibHVlX2lkeCApICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqc3JjX2NuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBzcmMgKz0gc3JjX2NuICkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBiID0gc3JjW2JsdWVfaWR4XSwgciA9IHNyY1syXmJsdWVfaWR4XSwgeTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgeSA9IHNjYWxlX21hY3JvKGIqWVVWX1lCICsgc3JjWzFdKllVVl9ZRyArIHIqWVVWX1lSKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHIgPSBzY2FsZV9tYWNybygociAtIHkpKllVVl9DUikgKyBZVVZfQ3hfQklBUzsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiID0gc2NhbGVfbWFjcm8oKGIgLSB5KSpZVVZfQ0IpICsgWVVWX0N4X0JJQVM7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gY2FzdF9tYWNybyh5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gY2FzdF9tYWNybyhyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsyXSA9IGNhc3RfbWFjcm8oYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitDVl9JTVBMX0JHUngyWUNyQ2IoIDh1LCB1Y2hhciwgaW50LCB5dXZfZGVzY2FsZSwgQ1ZfQ0FTVF84VSwKKyAgICAgICAgICAgICAgICAgICAgeXV2WWIsIHl1dllnLCB5dXZZciwgeXV2Q3IsIHl1dkNiLCAxMjggKQorCitDVl9JTVBMX0JHUngyWUNyQ2IoIDE2dSwgdXNob3J0LCBpbnQsIHl1dl9kZXNjYWxlLCBDVl9DQVNUXzE2VSwKKyAgICAgICAgICAgICAgICAgICAgeXV2WWIsIHl1dllnLCB5dXZZciwgeXV2Q3IsIHl1dkNiLCAzMjc2OCApCisKK0NWX0lNUExfQkdSeDJZQ3JDYiggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICB5dXZZYl8zMmYsIHl1dllnXzMyZiwgeXV2WXJfMzJmLCB5dXZDcl8zMmYsIHl1dkNiXzMyZiwgMC41ZiApCisKKworI2RlZmluZSBDVl9JTVBMX1lDckNiMkJHUngoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIHByZXNjYWxlX21hY3JvLCAgICAgIFwKKyAgICBzY2FsZV9tYWNybywgY2FzdF9tYWNybywgWVVWX0JDYiwgWVVWX0dDciwgWVVWX0dDYiwgWVVWX1JDciwgWVVWX0N4X0JJQVMpXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdllDckNiMkJHUnhfIyNmbGF2b3IjI19DM0NuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X2NuLCBpbnQgYmx1ZV9pZHggKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAtPSBzaXplLndpZHRoKmRzdF9jbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgZHN0ICs9IGRzdF9jbiApICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgWSA9IHByZXNjYWxlX21hY3JvKHNyY1tpXSksICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIENyID0gc3JjW2krMV0gLSBZVVZfQ3hfQklBUywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBDYiA9IHNyY1tpKzJdIC0gWVVWX0N4X0JJQVM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgYiwgZywgcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGIgPSBzY2FsZV9tYWNybyggWSArIFlVVl9CQ2IqQ2IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBnID0gc2NhbGVfbWFjcm8oIFkgKyBZVVZfR0NyKkNyICsgWVVWX0dDYipDYiApOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgciA9IHNjYWxlX21hY3JvKCBZICsgWVVWX1JDcipDciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbYmx1ZV9pZHhdID0gY2FzdF9tYWNybyhiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzFdID0gY2FzdF9tYWNybyhnKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF4yXSA9IGNhc3RfbWFjcm8ocik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggZHN0X2NuID09IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworQ1ZfSU1QTF9ZQ3JDYjJCR1J4KCA4dSwgdWNoYXIsIGludCwgeXV2X3ByZXNjYWxlLCB5dXZfZGVzY2FsZSwgQ1ZfQ0FTVF84VSwKKyAgICAgICAgICAgICAgICAgICAgeXV2QkNiLCB5dXZHQ3IsIHl1dkdDYiwgeXV2UkNyLCAxMjggKQorCitDVl9JTVBMX1lDckNiMkJHUngoIDE2dSwgdXNob3J0LCBpbnQsIHl1dl9wcmVzY2FsZSwgeXV2X2Rlc2NhbGUsIENWX0NBU1RfMTZVLAorICAgICAgICAgICAgICAgICAgICB5dXZCQ2IsIHl1dkdDciwgeXV2R0NiLCB5dXZSQ3IsIDMyNzY4ICkKKworQ1ZfSU1QTF9ZQ3JDYjJCR1J4KCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QLCBDVl9OT1AsIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgeXV2QkNiXzMyZiwgeXV2R0NyXzMyZiwgeXV2R0NiXzMyZiwgeXV2UkNyXzMyZiwgMC41ZiApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IgPC0+IFhZWiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIHh5elhyXzMyZiAgMC40MTI0NTNmCisjZGVmaW5lIHh5elhnXzMyZiAgMC4zNTc1ODBmCisjZGVmaW5lIHh5elhiXzMyZiAgMC4xODA0MjNmCisKKyNkZWZpbmUgeHl6WXJfMzJmICAwLjIxMjY3MWYKKyNkZWZpbmUgeHl6WWdfMzJmICAwLjcxNTE2MGYKKyNkZWZpbmUgeHl6WWJfMzJmICAwLjA3MjE2OWYKKworI2RlZmluZSB4eXpacl8zMmYgIDAuMDE5MzM0ZgorI2RlZmluZSB4eXpaZ18zMmYgIDAuMTE5MTkzZgorI2RlZmluZSB4eXpaYl8zMmYgIDAuOTUwMjI3ZgorCisjZGVmaW5lIHh5elJ4XzMyZiAgMy4yNDA0NzlmCisjZGVmaW5lIHh5elJ5XzMyZiAgKC0xLjUzNzE1ZikKKyNkZWZpbmUgeHl6UnpfMzJmICAoLTAuNDk4NTM1ZikKKworI2RlZmluZSB4eXpHeF8zMmYgICgtMC45NjkyNTZmKQorI2RlZmluZSB4eXpHeV8zMmYgIDEuODc1OTkxZgorI2RlZmluZSB4eXpHel8zMmYgIDAuMDQxNTU2ZgorCisjZGVmaW5lIHh5ekJ4XzMyZiAgMC4wNTU2NDhmCisjZGVmaW5lIHh5ekJ5XzMyZiAgKC0wLjIwNDA0M2YpCisjZGVmaW5lIHh5ekJ6XzMyZiAgMS4wNTczMTFmCisKKyNkZWZpbmUgeHl6X3NoaWZ0ICAxMAorI2RlZmluZSB4eXpYcl8zMnMgIGZpeCh4eXpYcl8zMmYsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5elhnXzMycyAgZml4KHh5elhnXzMyZiwgeHl6X3NoaWZ0ICkKKyNkZWZpbmUgeHl6WGJfMzJzICBmaXgoeHl6WGJfMzJmLCB4eXpfc2hpZnQgKQorCisjZGVmaW5lIHh5ellyXzMycyAgZml4KHh5ellyXzMyZiwgeHl6X3NoaWZ0ICkKKyNkZWZpbmUgeHl6WWdfMzJzICBmaXgoeHl6WWdfMzJmLCB4eXpfc2hpZnQgKQorI2RlZmluZSB4eXpZYl8zMnMgIGZpeCh4eXpZYl8zMmYsIHh5el9zaGlmdCApCisKKyNkZWZpbmUgeHl6WnJfMzJzICBmaXgoeHl6WnJfMzJmLCB4eXpfc2hpZnQgKQorI2RlZmluZSB4eXpaZ18zMnMgIGZpeCh4eXpaZ18zMmYsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5elpiXzMycyAgZml4KHh5elpiXzMyZiwgeHl6X3NoaWZ0ICkKKworI2RlZmluZSB4eXpSeF8zMnMgIGZpeCgzLjI0MDQ3OWYsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5elJ5XzMycyAgLWZpeCgxLjUzNzE1ZiwgeHl6X3NoaWZ0ICkKKyNkZWZpbmUgeHl6UnpfMzJzICAtZml4KDAuNDk4NTM1ZiwgeHl6X3NoaWZ0ICkKKworI2RlZmluZSB4eXpHeF8zMnMgIC1maXgoMC45NjkyNTZmLCB4eXpfc2hpZnQgKQorI2RlZmluZSB4eXpHeV8zMnMgIGZpeCgxLjg3NTk5MWYsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5ekd6XzMycyAgZml4KDAuMDQxNTU2ZiwgeHl6X3NoaWZ0ICkKKworI2RlZmluZSB4eXpCeF8zMnMgIGZpeCgwLjA1NTY0OGYsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5ekJ5XzMycyAgLWZpeCgwLjIwNDA0M2YsIHh5el9zaGlmdCApCisjZGVmaW5lIHh5ekJ6XzMycyAgZml4KDEuMDU3MzExZiwgeHl6X3NoaWZ0ICkKKworI2RlZmluZSB4eXpfZGVzY2FsZSh4KSBDVl9ERVNDQUxFKCh4KSx4eXpfc2hpZnQpCisKKyNkZWZpbmUgQ1ZfSU1QTF9CR1J4MlhZWiggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlX21hY3JvLCBjYXN0X21hY3JvLCBzdWZmaXggKSAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkJHUngyWFlaXyMjZmxhdm9yIyNfQ25DM1IoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY19jbiwgaW50IGJsdWVfaWR4ICkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHQsIG1hdHJpeFtdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHh5elhiIyNzdWZmaXgsIHh5elhnIyNzdWZmaXgsIHh5elhyIyNzdWZmaXgsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4eXpZYiMjc3VmZml4LCB4eXpZZyMjc3VmZml4LCB4eXpZciMjc3VmZml4LCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeHl6WmIjI3N1ZmZpeCwgeHl6WmcjI3N1ZmZpeCwgeHl6WnIjI3N1ZmZpeCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggaWN2UkdCMlhZWl8jI2ZsYXZvciMjX0MzUl9wICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBpY3ZCR1J4MkFCQ19JUFBfIyNmbGF2b3IjI19DbkMzUiggc3JjLCBzcmNzdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0LCBkc3RzdGVwLCBzaXplLCBzcmNfY24sIGJsdWVfaWR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGljdlJHQjJYWVpfIyNmbGF2b3IjI19DM1JfcCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAtPSBzaXplLndpZHRoKnNyY19jbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGJsdWVfaWR4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfU1dBUCggbWF0cml4WzBdLCBtYXRyaXhbMl0sIHQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX1NXQVAoIG1hdHJpeFszXSwgbWF0cml4WzVdLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9TV0FQKCBtYXRyaXhbNl0sIG1hdHJpeFs4XSwgdCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IDMsIHNyYyArPSBzcmNfY24gKSAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHggPSBzY2FsZV9tYWNybyhzcmNbMF0qbWF0cml4WzBdICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNyY1sxXSptYXRyaXhbMV0gKyBzcmNbMl0qbWF0cml4WzJdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgeSA9IHNjYWxlX21hY3JvKHNyY1swXSptYXRyaXhbM10gKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3JjWzFdKm1hdHJpeFs0XSArIHNyY1syXSptYXRyaXhbNV0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB6ID0gc2NhbGVfbWFjcm8oc3JjWzBdKm1hdHJpeFs2XSArICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzcmNbMV0qbWF0cml4WzddICsgc3JjWzJdKm1hdHJpeFs4XSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSAoYXJydHlwZSkoeCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMV0gPSAoYXJydHlwZSkoeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gY2FzdF9tYWNybyh6KTsgLypzdW0gb2Ygd2VpZ2h0cyBmb3IgeiA+IDEqLyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0NWX0lNUExfQkdSeDJYWVooIDh1LCB1Y2hhciwgaW50LCB4eXpfZGVzY2FsZSwgQ1ZfQ0FTVF84VSwgXzMycyApCitDVl9JTVBMX0JHUngyWFlaKCAxNnUsIHVzaG9ydCwgaW50LCB4eXpfZGVzY2FsZSwgQ1ZfQ0FTVF8xNlUsIF8zMnMgKQorQ1ZfSU1QTF9CR1J4MlhZWiggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCwgQ1ZfTk9QLCBfMzJmICkKKworCisjZGVmaW5lIENWX0lNUExfWFlaMkJHUngoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIHNjYWxlX21hY3JvLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzdWZmaXggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZYWVoyQkdSeF8jI2ZsYXZvciMjX0MzQ25SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RfY24sIGludCBibHVlX2lkeCApICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSB0LCBtYXRyaXhbXSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB4eXpCeCMjc3VmZml4LCB4eXpCeSMjc3VmZml4LCB4eXpCeiMjc3VmZml4LCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeHl6R3gjI3N1ZmZpeCwgeHl6R3kjI3N1ZmZpeCwgeHl6R3ojI3N1ZmZpeCwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHh5elJ4IyNzdWZmaXgsIHh5elJ5IyNzdWZmaXgsIHh5elJ6IyNzdWZmaXggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGljdlhZWjJSR0JfIyNmbGF2b3IjI19DM1JfcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gaWN2QUJDMkJHUnhfSVBQXyMjZmxhdm9yIyNfQzNDblIoIHNyYywgc3Jjc3RlcCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdCwgZHN0c3RlcCwgc2l6ZSwgZHN0X2NuLCBibHVlX2lkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpY3ZYWVoyUkdCXyMjZmxhdm9yIyNfQzNSX3AgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLT0gc2l6ZS53aWR0aCpkc3RfY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBibHVlX2lkeCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX1NXQVAoIG1hdHJpeFswXSwgbWF0cml4WzZdLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9TV0FQKCBtYXRyaXhbMV0sIG1hdHJpeFs3XSwgdCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfU1dBUCggbWF0cml4WzJdLCBtYXRyaXhbOF0sIHQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBkc3QgKz0gZHN0X2NuICkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBiID0gc2NhbGVfbWFjcm8oc3JjW2ldKm1hdHJpeFswXSArICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzcmNbaSsxXSptYXRyaXhbMV0gKyBzcmNbaSsyXSptYXRyaXhbMl0pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGcgPSBzY2FsZV9tYWNybyhzcmNbaV0qbWF0cml4WzNdICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNyY1tpKzFdKm1hdHJpeFs0XSArIHNyY1tpKzJdKm1hdHJpeFs1XSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgciA9IHNjYWxlX21hY3JvKHNyY1tpXSptYXRyaXhbNl0gKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3JjW2krMV0qbWF0cml4WzddICsgc3JjW2krMl0qbWF0cml4WzhdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzBdID0gY2FzdF9tYWNybyhiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFsxXSA9IGNhc3RfbWFjcm8oZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbMl0gPSBjYXN0X21hY3JvKHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0WzNdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworQ1ZfSU1QTF9YWVoyQkdSeCggOHUsIHVjaGFyLCBpbnQsIHh5el9kZXNjYWxlLCBDVl9DQVNUXzhVLCBfMzJzICkKK0NWX0lNUExfWFlaMkJHUngoIDE2dSwgdXNob3J0LCBpbnQsIHh5el9kZXNjYWxlLCBDVl9DQVNUXzE2VSwgXzMycyApCitDVl9JTVBMX1hZWjJCR1J4KCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QLCBDVl9OT1AsIF8zMmYgKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uLWxpbmVhciBDb2xvciBTcGFjZSBUcmFuc2Zvcm1hdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gZHJpdmVyIGNvbG9yIHNwYWNlIGNvbnZlcnNpb24gZnVuY3Rpb24gZm9yIDh1IGFycmF5cyB0aGF0IHVzZXMgMzJmIGZ1bmN0aW9uCisvLyB3aXRoIGFwcHJvcHJpYXRlIHByZS0gYW5kIHBvc3Qtc2NhbGluZy4KK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZBQkMyQkdSeF84dV9DM0NuUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZHN0X2NuLCBpbnQgYmx1ZV9pZHgsIEN2Q29sb3JDdnRGdW5jMiBjdnRmdW5jXzMyZiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwcmVfY29lZmZzLCBpbnQgcG9zdHNjYWxlICkKK3sKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IE1JTigxIDw8IDgsIHNpemUud2lkdGgpOworICAgIGZsb2F0KiBidWZmZXIgPSAoZmxvYXQqKWN2U3RhY2tBbGxvYyggYmxvY2tfc2l6ZSozKnNpemVvZihidWZmZXJbMF0pICk7CisgICAgaW50IGksIGRpLCBrOworICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworCisgICAgZHN0c3RlcCAtPSBzaXplLndpZHRoKmRzdF9jbjsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gYmxvY2tfc2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcmMxID0gc3JjICsgaSozOworICAgICAgICAgICAgZGkgPSBNSU4oYmxvY2tfc2l6ZSwgc2l6ZS53aWR0aCAtIGkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBhID0gQ1ZfOFRPMzJGKHNyYzFba10pKnByZV9jb2VmZnNbMF0gKyBwcmVfY29lZmZzWzFdOworICAgICAgICAgICAgICAgIGZsb2F0IGIgPSBDVl84VE8zMkYoc3JjMVtrKzFdKSpwcmVfY29lZmZzWzJdICsgcHJlX2NvZWZmc1szXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBjID0gQ1ZfOFRPMzJGKHNyYzFbaysyXSkqcHJlX2NvZWZmc1s0XSArIHByZV9jb2VmZnNbNV07CisgICAgICAgICAgICAgICAgYnVmZmVyW2tdID0gYTsKKyAgICAgICAgICAgICAgICBidWZmZXJbaysxXSA9IGI7CisgICAgICAgICAgICAgICAgYnVmZmVyW2srMl0gPSBjOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGF0dXMgPSBjdnRmdW5jXzMyZiggYnVmZmVyLCAwLCBidWZmZXIsIDAsIGN2U2l6ZShkaSwxKSwgMywgYmx1ZV9pZHggKTsKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPCAwICkKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggcG9zdHNjYWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzLCBkc3QgKz0gZHN0X2NuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gY3ZSb3VuZChidWZmZXJba10qMjU1Lik7CisgICAgICAgICAgICAgICAgICAgIGludCBnID0gY3ZSb3VuZChidWZmZXJbaysxXSoyNTUuKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHIgPSBjdlJvdW5kKGJ1ZmZlcltrKzJdKjI1NS4pOworCisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IENWX0NBU1RfOFUoYik7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IENWX0NBU1RfOFUoZyk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IENWX0NBU1RfOFUocik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzLCBkc3QgKz0gZHN0X2NuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gY3ZSb3VuZChidWZmZXJba10pOworICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IGN2Um91bmQoYnVmZmVyW2srMV0pOworICAgICAgICAgICAgICAgICAgICBpbnQgciA9IGN2Um91bmQoYnVmZmVyW2srMl0pOworCisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IENWX0NBU1RfOFUoYik7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IENWX0NBU1RfOFUoZyk7CisgICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IENWX0NBU1RfOFUocik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvLyBkcml2ZXIgY29sb3Igc3BhY2UgY29udmVyc2lvbiBmdW5jdGlvbiBmb3IgOHUgYXJyYXlzIHRoYXQgdXNlcyAzMmYgZnVuY3Rpb24KKy8vIHdpdGggYXBwcm9wcmlhdGUgcHJlLSBhbmQgcG9zdC1zY2FsaW5nLgorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUngyQUJDXzh1X0NuQzNSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sIGludCBibHVlX2lkeCwgQ3ZDb2xvckN2dEZ1bmMyIGN2dGZ1bmNfMzJmLAorICAgICAgICAgICAgICAgICAgICAgIGludCBwcmVzY2FsZSwgY29uc3QgZmxvYXQqIHBvc3RfY29lZmZzICkKK3sKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IE1JTigxIDw8IDgsIHNpemUud2lkdGgpOworICAgIGZsb2F0KiBidWZmZXIgPSAoZmxvYXQqKWN2U3RhY2tBbGxvYyggYmxvY2tfc2l6ZSozKnNpemVvZihidWZmZXJbMF0pICk7CisgICAgaW50IGksIGRpLCBrOworICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworCisgICAgc3Jjc3RlcCAtPSBzaXplLndpZHRoKnNyY19jbjsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gYmxvY2tfc2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyKiBkc3QxID0gZHN0ICsgaSozOworICAgICAgICAgICAgZGkgPSBNSU4oYmxvY2tfc2l6ZSwgc2l6ZS53aWR0aCAtIGkpOworCisgICAgICAgICAgICBpZiggcHJlc2NhbGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkaSozOyBrICs9IDMsIHNyYyArPSBzcmNfY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYiA9IENWXzhUTzMyRihzcmNbMF0pKjAuMDAzOTIxNTY4NjI3NDUwOTgwM2Y7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGcgPSBDVl84VE8zMkYoc3JjWzFdKSowLjAwMzkyMTU2ODYyNzQ1MDk4MDNmOworICAgICAgICAgICAgICAgICAgICBmbG9hdCByID0gQ1ZfOFRPMzJGKHNyY1syXSkqMC4wMDM5MjE1Njg2Mjc0NTA5ODAzZjsKKworICAgICAgICAgICAgICAgICAgICBidWZmZXJba10gPSBiOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbaysxXSA9IGc7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrKzJdID0gcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBiID0gQ1ZfOFRPMzJGKHNyY1swXSk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGcgPSBDVl84VE8zMkYoc3JjWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IENWXzhUTzMyRihzcmNbMl0pOworCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrXSA9IGI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrKzFdID0gZzsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2srMl0gPSByOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3RhdHVzID0gY3Z0ZnVuY18zMmYoIGJ1ZmZlciwgMCwgYnVmZmVyLCAwLCBjdlNpemUoZGksMSksIDMsIGJsdWVfaWR4ICk7CisgICAgICAgICAgICBpZiggc3RhdHVzIDwgMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGEgPSBjdlJvdW5kKCBidWZmZXJba10qcG9zdF9jb2VmZnNbMF0gKyBwb3N0X2NvZWZmc1sxXSApOworICAgICAgICAgICAgICAgIGludCBiID0gY3ZSb3VuZCggYnVmZmVyW2srMV0qcG9zdF9jb2VmZnNbMl0gKyBwb3N0X2NvZWZmc1szXSApOworICAgICAgICAgICAgICAgIGludCBjID0gY3ZSb3VuZCggYnVmZmVyW2srMl0qcG9zdF9jb2VmZnNbNF0gKyBwb3N0X2NvZWZmc1s1XSApOworICAgICAgICAgICAgICAgIGRzdDFba10gPSBDVl9DQVNUXzhVKGEpOworICAgICAgICAgICAgICAgIGRzdDFbaysxXSA9IENWX0NBU1RfOFUoYik7CisgICAgICAgICAgICAgICAgZHN0MVtrKzJdID0gQ1ZfQ0FTVF84VShjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQiA8LT4gSFNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBjb25zdCB1Y2hhciBpY3ZIdWUyNTVUbzE4MFtdID0KK3sKKyAgICAgIDAsICAgMSwgICAxLCAgIDIsICAgMywgICA0LCAgIDQsICAgNSwgICA2LCAgIDYsICAgNywgICA4LCAgIDgsICAgOSwgIDEwLCAgMTEsCisgICAgIDExLCAgMTIsICAxMywgIDEzLCAgMTQsICAxNSwgIDE2LCAgMTYsICAxNywgIDE4LCAgMTgsICAxOSwgIDIwLCAgMjAsICAyMSwgIDIyLAorICAgICAyMywgIDIzLCAgMjQsICAyNSwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjgsICAyOSwgIDMwLCAgMzAsICAzMSwgIDMyLCAgMzIsICAzMywKKyAgICAgMzQsICAzNSwgIDM1LCAgMzYsICAzNywgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDAsICA0MSwgIDQyLCAgNDIsICA0MywgIDQ0LCAgNDQsCisgICAgIDQ1LCAgNDYsICA0NywgIDQ3LCAgNDgsICA0OSwgIDQ5LCAgNTAsICA1MSwgIDUyLCAgNTIsICA1MywgIDU0LCAgNTQsICA1NSwgIDU2LAorICAgICA1NiwgIDU3LCAgNTgsICA1OSwgIDU5LCAgNjAsICA2MSwgIDYxLCAgNjIsICA2MywgIDY0LCAgNjQsICA2NSwgIDY2LCAgNjYsICA2NywKKyAgICAgNjgsICA2OCwgIDY5LCAgNzAsICA3MSwgIDcxLCAgNzIsICA3MywgIDczLCAgNzQsICA3NSwgIDc2LCAgNzYsICA3NywgIDc4LCAgNzgsCisgICAgIDc5LCAgODAsICA4MCwgIDgxLCAgODIsICA4MywgIDgzLCAgODQsICA4NSwgIDg1LCAgODYsICA4NywgIDg4LCAgODgsICA4OSwgIDkwLAorICAgICA5MCwgIDkxLCAgOTIsICA5MiwgIDkzLCAgOTQsICA5NSwgIDk1LCAgOTYsICA5NywgIDk3LCAgOTgsICA5OSwgMTAwLCAxMDAsIDEwMSwKKyAgICAxMDIsIDEwMiwgMTAzLCAxMDQsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA3LCAxMDgsIDEwOSwgMTA5LCAxMTAsIDExMSwgMTEyLCAxMTIsCisgICAgMTEzLCAxMTQsIDExNCwgMTE1LCAxMTYsIDExNiwgMTE3LCAxMTgsIDExOSwgMTE5LCAxMjAsIDEyMSwgMTIxLCAxMjIsIDEyMywgMTI0LAorICAgIDEyNCwgMTI1LCAxMjYsIDEyNiwgMTI3LCAxMjgsIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMxLCAxMzIsIDEzMywgMTMzLCAxMzQsIDEzNSwKKyAgICAxMzYsIDEzNiwgMTM3LCAxMzgsIDEzOCwgMTM5LCAxNDAsIDE0MCwgMTQxLCAxNDIsIDE0MywgMTQzLCAxNDQsIDE0NSwgMTQ1LCAxNDYsCisgICAgMTQ3LCAxNDgsIDE0OCwgMTQ5LCAxNTAsIDE1MCwgMTUxLCAxNTIsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU1LCAxNTYsIDE1NywgMTU3LAorICAgIDE1OCwgMTU5LCAxNjAsIDE2MCwgMTYxLCAxNjIsIDE2MiwgMTYzLCAxNjQsIDE2NCwgMTY1LCAxNjYsIDE2NywgMTY3LCAxNjgsIDE2OSwKKyAgICAxNjksIDE3MCwgMTcxLCAxNzIsIDE3MiwgMTczLCAxNzQsIDE3NCwgMTc1LCAxNzYsIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTc5LCAxODAKK307CisKKworc3RhdGljIGNvbnN0IHVjaGFyIGljdkh1ZTE4MFRvMjU1W10gPQoreworICAgICAgMCwgICAxLCAgIDMsICAgNCwgICA2LCAgIDcsICAgOSwgIDEwLCAgMTEsICAxMywgIDE0LCAgMTYsICAxNywgIDE4LCAgMjAsICAyMSwKKyAgICAgMjMsICAyNCwgIDI2LCAgMjcsICAyOCwgIDMwLCAgMzEsICAzMywgIDM0LCAgMzUsICAzNywgIDM4LCAgNDAsICA0MSwgIDQzLCAgNDQsCisgICAgIDQ1LCAgNDcsICA0OCwgIDUwLCAgNTEsICA1MiwgIDU0LCAgNTUsICA1NywgIDU4LCAgNjAsICA2MSwgIDYyLCAgNjQsICA2NSwgIDY3LAorICAgICA2OCwgIDY5LCAgNzEsICA3MiwgIDc0LCAgNzUsICA3NywgIDc4LCAgNzksICA4MSwgIDgyLCAgODQsICA4NSwgIDg2LCAgODgsICA4OSwKKyAgICAgOTEsICA5MiwgIDk0LCAgOTUsICA5NiwgIDk4LCAgOTksIDEwMSwgMTAyLCAxMDMsIDEwNSwgMTA2LCAxMDgsIDEwOSwgMTExLCAxMTIsCisgICAgMTEzLCAxMTUsIDExNiwgMTE4LCAxMTksIDEyMCwgMTIyLCAxMjMsIDEyNSwgMTI2LCAxMjgsIDEyOSwgMTMwLCAxMzIsIDEzMywgMTM1LAorICAgIDEzNiwgMTM3LCAxMzksIDE0MCwgMTQyLCAxNDMsIDE0NSwgMTQ2LCAxNDcsIDE0OSwgMTUwLCAxNTIsIDE1MywgMTU0LCAxNTYsIDE1NywKKyAgICAxNTksIDE2MCwgMTYyLCAxNjMsIDE2NCwgMTY2LCAxNjcsIDE2OSwgMTcwLCAxNzEsIDE3MywgMTc0LCAxNzYsIDE3NywgMTc5LCAxODAsCisgICAgMTgxLCAxODMsIDE4NCwgMTg2LCAxODcsIDE4OCwgMTkwLCAxOTEsIDE5MywgMTk0LCAxOTYsIDE5NywgMTk4LCAyMDAsIDIwMSwgMjAzLAorICAgIDIwNCwgMjA1LCAyMDcsIDIwOCwgMjEwLCAyMTEsIDIxMywgMjE0LCAyMTUsIDIxNywgMjE4LCAyMjAsIDIyMSwgMjIyLCAyMjQsIDIyNSwKKyAgICAyMjcsIDIyOCwgMjMwLCAyMzEsIDIzMiwgMjM0LCAyMzUsIDIzNywgMjM4LCAyMzksIDI0MSwgMjQyLCAyNDQsIDI0NSwgMjQ3LCAyNDgsCisgICAgMjQ5LCAyNTEsIDI1MiwgMjU0LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKK307CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUngySFNWXzh1X0NuQzNSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sIGludCBibHVlX2lkeCApCit7CisgICAgY29uc3QgaW50IGhzdl9zaGlmdCA9IDEyOworCisgICAgc3RhdGljIGNvbnN0IGludCBkaXZfdGFibGVbXSA9IHsKKyAgICAgICAgMCwgMTA0NDQ4MCwgNTIyMjQwLCAzNDgxNjAsIDI2MTEyMCwgMjA4ODk2LCAxNzQwODAsIDE0OTIxMSwKKyAgICAgICAgMTMwNTYwLCAxMTYwNTMsIDEwNDQ0OCwgOTQ5NTMsIDg3MDQwLCA4MDM0NSwgNzQ2MDYsIDY5NjMyLAorICAgICAgICA2NTI4MCwgNjE0NDAsIDU4MDI3LCA1NDk3MywgNTIyMjQsIDQ5NzM3LCA0NzQ3NiwgNDU0MTIsCisgICAgICAgIDQzNTIwLCA0MTc3OSwgNDAxNzIsIDM4Njg0LCAzNzMwMywgMzYwMTcsIDM0ODE2LCAzMzY5MywKKyAgICAgICAgMzI2NDAsIDMxNjUxLCAzMDcyMCwgMjk4NDIsIDI5MDEzLCAyODIyOSwgMjc0ODYsIDI2NzgyLAorICAgICAgICAyNjExMiwgMjU0NzUsIDI0ODY5LCAyNDI5MCwgMjM3MzgsIDIzMjExLCAyMjcwNiwgMjIyMjMsCisgICAgICAgIDIxNzYwLCAyMTMxNiwgMjA4OTAsIDIwNDgwLCAyMDA4NiwgMTk3MDcsIDE5MzQyLCAxODk5MSwKKyAgICAgICAgMTg2NTEsIDE4MzI0LCAxODAwOCwgMTc3MDMsIDE3NDA4LCAxNzEyMywgMTY4NDYsIDE2NTc5LAorICAgICAgICAxNjMyMCwgMTYwNjksIDE1ODI1LCAxNTU4OSwgMTUzNjAsIDE1MTM3LCAxNDkyMSwgMTQ3MTEsCisgICAgICAgIDE0NTA3LCAxNDMwOCwgMTQxMTUsIDEzOTI2LCAxMzc0MywgMTM1NjUsIDEzMzkxLCAxMzIyMSwKKyAgICAgICAgMTMwNTYsIDEyODk1LCAxMjczOCwgMTI1ODQsIDEyNDM0LCAxMjI4OCwgMTIxNDUsIDEyMDA2LAorICAgICAgICAxMTg2OSwgMTE3MzYsIDExNjA1LCAxMTQ3OCwgMTEzNTMsIDExMjMxLCAxMTExMSwgMTA5OTUsCisgICAgICAgIDEwODgwLCAxMDc2OCwgMTA2NTgsIDEwNTUwLCAxMDQ0NSwgMTAzNDEsIDEwMjQwLCAxMDE0MSwKKyAgICAgICAgMTAwNDMsIDk5NDcsIDk4NTQsIDk3NjEsIDk2NzEsIDk1ODIsIDk0OTUsIDk0MTAsCisgICAgICAgIDkzMjYsIDkyNDMsIDkxNjIsIDkwODIsIDkwMDQsIDg5MjcsIDg4NTIsIDg3NzcsCisgICAgICAgIDg3MDQsIDg2MzIsIDg1NjEsIDg0OTIsIDg0MjMsIDgzNTYsIDgyOTAsIDgyMjQsCisgICAgICAgIDgxNjAsIDgwOTcsIDgwMzQsIDc5NzMsIDc5MTMsIDc4NTMsIDc3OTUsIDc3MzcsCisgICAgICAgIDc2ODAsIDc2MjQsIDc1NjksIDc1MTQsIDc0NjEsIDc0MDgsIDczNTUsIDczMDQsCisgICAgICAgIDcyNTMsIDcyMDMsIDcxNTQsIDcxMDUsIDcwNTcsIDcwMTAsIDY5NjMsIDY5MTcsCisgICAgICAgIDY4NzIsIDY4MjcsIDY3ODIsIDY3MzksIDY2OTUsIDY2NTMsIDY2MTEsIDY1NjksCisgICAgICAgIDY1MjgsIDY0ODcsIDY0NDcsIDY0MDgsIDYzNjksIDYzMzAsIDYyOTIsIDYyNTQsCisgICAgICAgIDYyMTcsIDYxODAsIDYxNDQsIDYxMDgsIDYwNzMsIDYwMzcsIDYwMDMsIDU5NjgsCisgICAgICAgIDU5MzUsIDU5MDEsIDU4NjgsIDU4MzUsIDU4MDMsIDU3NzEsIDU3MzksIDU3MDgsCisgICAgICAgIDU2NzcsIDU2NDYsIDU2MTUsIDU1ODUsIDU1NTYsIDU1MjYsIDU0OTcsIDU0NjgsCisgICAgICAgIDU0NDAsIDU0MTIsIDUzODQsIDUzNTYsIDUzMjksIDUzMDIsIDUyNzUsIDUyNDksCisgICAgICAgIDUyMjIsIDUxOTYsIDUxNzEsIDUxNDUsIDUxMjAsIDUwOTUsIDUwNzAsIDUwNDYsCisgICAgICAgIDUwMjIsIDQ5OTgsIDQ5NzQsIDQ5NTAsIDQ5MjcsIDQ5MDQsIDQ4ODEsIDQ4NTgsCisgICAgICAgIDQ4MzYsIDQ4MTMsIDQ3OTEsIDQ3NjksIDQ3NDgsIDQ3MjYsIDQ3MDUsIDQ2ODQsCisgICAgICAgIDQ2NjMsIDQ2NDIsIDQ2MjIsIDQ2MDEsIDQ1ODEsIDQ1NjEsIDQ1NDEsIDQ1MjIsCisgICAgICAgIDQ1MDIsIDQ0ODMsIDQ0NjQsIDQ0NDUsIDQ0MjYsIDQ0MDcsIDQzODksIDQzNzAsCisgICAgICAgIDQzNTIsIDQzMzQsIDQzMTYsIDQyOTgsIDQyODEsIDQyNjMsIDQyNDYsIDQyMjksCisgICAgICAgIDQyMTIsIDQxOTUsIDQxNzgsIDQxNjEsIDQxNDUsIDQxMjgsIDQxMTIsIDQwOTYKKyAgICB9OworCisgICAgaW50IGk7CisgICAgaWYoIGljdlJHQjJIU1ZfOHVfQzNSX3AgKQorICAgIHsKKyAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzID0gaWN2QkdSeDJBQkNfSVBQXzh1X0NuQzNSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jbiwgYmx1ZV9pZHgsIGljdlJHQjJIU1ZfOHVfQzNSX3AgKTsKKyAgICAgICAgaWYoIHN0YXR1cyA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSAzOworICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGRzdCArPSBkc3RzdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSAxMjsgaSArPSAxMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciB0MCA9IGljdkh1ZTI1NVRvMTgwW2RzdFtpXV0sIHQxID0gaWN2SHVlMjU1VG8xODBbZHN0W2krM11dOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSB0MDsgZHN0W2krM10gPSB0MTsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSBpY3ZIdWUyNTVUbzE4MFtkc3RbaSs2XV07IHQxID0gaWN2SHVlMjU1VG8xODBbZHN0W2krOV1dOworICAgICAgICAgICAgICAgICAgICBkc3RbaSs2XSA9IHQwOyBkc3RbaSs5XSA9IHQxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMyApCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IGljdkh1ZTI1NVRvMTgwW2RzdFtpXV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqc3JjX2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiID0gKHNyYylbYmx1ZV9pZHhdLCBnID0gKHNyYylbMV0sIHIgPSAoc3JjKVsyXmJsdWVfaWR4XTsKKyAgICAgICAgICAgIGludCBoLCBzLCB2ID0gYjsKKyAgICAgICAgICAgIGludCB2bWluID0gYiwgZGlmZjsKKyAgICAgICAgICAgIGludCB2ciwgdmc7CisKKyAgICAgICAgICAgIENWX0NBTENfTUFYXzhVKCB2LCBnICk7CisgICAgICAgICAgICBDVl9DQUxDX01BWF84VSggdiwgciApOworICAgICAgICAgICAgQ1ZfQ0FMQ19NSU5fOFUoIHZtaW4sIGcgKTsKKyAgICAgICAgICAgIENWX0NBTENfTUlOXzhVKCB2bWluLCByICk7CisKKyAgICAgICAgICAgIGRpZmYgPSB2IC0gdm1pbjsKKyAgICAgICAgICAgIHZyID0gdiA9PSByID8gLTEgOiAwOworICAgICAgICAgICAgdmcgPSB2ID09IGcgPyAtMSA6IDA7CisKKyAgICAgICAgICAgIHMgPSBkaWZmICogZGl2X3RhYmxlW3ZdID4+IGhzdl9zaGlmdDsKKyAgICAgICAgICAgIGggPSAodnIgJiAoZyAtIGIpKSArCisgICAgICAgICAgICAgICAgKH52ciAmICgodmcgJiAoYiAtIHIgKyAyICogZGlmZikpICsgKCh+dmcpICYgKHIgLSBnICsgNCAqIGRpZmYpKSkpOworICAgICAgICAgICAgaCA9ICgoaCAqIGRpdl90YWJsZVtkaWZmXSAqIDE1ICsgKDEgPDwgKGhzdl9zaGlmdCArIDYpKSkgPj4gKDcgKyBoc3Zfc2hpZnQpKVwKKyAgICAgICAgICAgICAgICArIChoIDwgMCA/IDMwKjYgOiAwKTsKKworICAgICAgICAgICAgZHN0W2ldID0gKHVjaGFyKWg7CisgICAgICAgICAgICBkc3RbaSsxXSA9ICh1Y2hhcilzOworICAgICAgICAgICAgZHN0W2krMl0gPSAodWNoYXIpdjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJIU1ZfMzJmX0NuQzNSKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3JjX2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIGludCBpOworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqc3JjX2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGIgPSBzcmNbYmx1ZV9pZHhdLCBnID0gc3JjWzFdLCByID0gc3JjWzJeYmx1ZV9pZHhdOworICAgICAgICAgICAgZmxvYXQgaCwgcywgdjsKKworICAgICAgICAgICAgZmxvYXQgdm1pbiwgZGlmZjsKKworICAgICAgICAgICAgdiA9IHZtaW4gPSByOworICAgICAgICAgICAgaWYoIHYgPCBnICkgdiA9IGc7CisgICAgICAgICAgICBpZiggdiA8IGIgKSB2ID0gYjsKKyAgICAgICAgICAgIGlmKCB2bWluID4gZyApIHZtaW4gPSBnOworICAgICAgICAgICAgaWYoIHZtaW4gPiBiICkgdm1pbiA9IGI7CisKKyAgICAgICAgICAgIGRpZmYgPSB2IC0gdm1pbjsKKyAgICAgICAgICAgIHMgPSBkaWZmLyhmbG9hdCkoZmFicyh2KSArIEZMVF9FUFNJTE9OKTsKKyAgICAgICAgICAgIGRpZmYgPSAoZmxvYXQpKDYwLi8oZGlmZiArIEZMVF9FUFNJTE9OKSk7CisgICAgICAgICAgICBpZiggdiA9PSByICkKKyAgICAgICAgICAgICAgICBoID0gKGcgLSBiKSpkaWZmOworICAgICAgICAgICAgZWxzZSBpZiggdiA9PSBnICkKKyAgICAgICAgICAgICAgICBoID0gKGIgLSByKSpkaWZmICsgMTIwLmY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaCA9IChyIC0gZykqZGlmZiArIDI0MC5mOworCisgICAgICAgICAgICBpZiggaCA8IDAgKSBoICs9IDM2MC5mOworCisgICAgICAgICAgICBkc3RbaV0gPSBoOworICAgICAgICAgICAgZHN0W2krMV0gPSBzOworICAgICAgICAgICAgZHN0W2krMl0gPSB2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZIU1YyQkdSeF8zMmZfQzNDblIoIGNvbnN0IGZsb2F0KiBzcmMsIGludCBzcmNzdGVwLCBmbG9hdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBkc3RfY24sIGludCBibHVlX2lkeCApCit7CisgICAgaW50IGk7CisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOworICAgIGRzdHN0ZXAgLT0gc2l6ZS53aWR0aCpkc3RfY247CisgICAgc2l6ZS53aWR0aCAqPSAzOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBkc3QgKz0gZHN0X2NuICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgaCA9IHNyY1tpXSwgcyA9IHNyY1tpKzFdLCB2ID0gc3JjW2krMl07CisgICAgICAgICAgICBmbG9hdCBiLCBnLCByOworCisgICAgICAgICAgICBpZiggcyA9PSAwICkKKyAgICAgICAgICAgICAgICBiID0gZyA9IHIgPSB2OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2VjdG9yX2RhdGFbXVszXT0KKyAgICAgICAgICAgICAgICAgICAge3sxLDMsMH0sIHsxLDAsMn0sIHszLDAsMX0sIHswLDIsMX0sIHswLDEsM30sIHsyLDEsMH19OworICAgICAgICAgICAgICAgIGZsb2F0IHRhYls0XTsKKyAgICAgICAgICAgICAgICBpbnQgc2VjdG9yOworICAgICAgICAgICAgICAgIGggKj0gMC4wMTY2NjY2NjY2NjY2NjY2NjZmOyAvLyBoIC89IDYwOworICAgICAgICAgICAgICAgIGlmKCBoIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGRvIGggKz0gNjsgd2hpbGUoIGggPCAwICk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggaCA+PSA2ICkKKyAgICAgICAgICAgICAgICAgICAgZG8gaCAtPSA2OyB3aGlsZSggaCA+PSA2ICk7CisgICAgICAgICAgICAgICAgc2VjdG9yID0gY3ZGbG9vcihoKTsKKyAgICAgICAgICAgICAgICBoIC09IHNlY3RvcjsKKworICAgICAgICAgICAgICAgIHRhYlswXSA9IHY7CisgICAgICAgICAgICAgICAgdGFiWzFdID0gdiooMS5mIC0gcyk7CisgICAgICAgICAgICAgICAgdGFiWzJdID0gdiooMS5mIC0gcypoKTsKKyAgICAgICAgICAgICAgICB0YWJbM10gPSB2KigxLmYgLSBzKigxLmYgLSBoKSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYiA9IHRhYltzZWN0b3JfZGF0YVtzZWN0b3JdWzBdXTsKKyAgICAgICAgICAgICAgICBnID0gdGFiW3NlY3Rvcl9kYXRhW3NlY3Rvcl1bMV1dOworICAgICAgICAgICAgICAgIHIgPSB0YWJbc2VjdG9yX2RhdGFbc2VjdG9yXVsyXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF0gPSBiOworICAgICAgICAgICAgZHN0WzFdID0gZzsKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF4yXSA9IHI7CisgICAgICAgICAgICBpZiggZHN0X2NuID09IDQgKQorICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkhTVjJCR1J4Xzh1X0MzQ25SKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBkc3RfY24sIGludCBibHVlX2lkeCApCit7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHByZV9jb2VmZnNbXSA9IHsgMi5mLCAwLmYsIDAuMDAzOTIxNTY4NjI3NDUwOTgwM2YsIDAuZiwgMS5mLCAwLmYgfTsKKworICAgIGlmKCBpY3ZIU1YyUkdCXzh1X0MzUl9wICkKKyAgICB7CisgICAgICAgIGludCBibG9ja19zaXplID0gTUlOKDEgPDwgMTQsIHNpemUud2lkdGgpOworICAgICAgICB1Y2hhciogYnVmZmVyOworICAgICAgICBpbnQgaSwgZGksIGs7CisgICAgICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworCisgICAgICAgIGJ1ZmZlciA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBibG9ja19zaXplKjMqc2l6ZW9mKGJ1ZmZlclswXSkgKTsKKyAgICAgICAgZHN0c3RlcCAtPSBzaXplLndpZHRoKmRzdF9jbjsKKworICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gYmxvY2tfc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNyYzEgPSBzcmMgKyBpKjM7CisgICAgICAgICAgICAgICAgZGkgPSBNSU4oYmxvY2tfc2l6ZSwgc2l6ZS53aWR0aCAtIGkpOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkaSozOyBrICs9IDMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgaCA9IGljdkh1ZTE4MFRvMjU1W3NyYzFba11dOworICAgICAgICAgICAgICAgICAgICB1Y2hhciBzID0gc3JjMVtrKzFdOworICAgICAgICAgICAgICAgICAgICB1Y2hhciB2ID0gc3JjMVtrKzJdOworICAgICAgICAgICAgICAgICAgICBidWZmZXJba10gPSBoOworICAgICAgICAgICAgICAgICAgICBidWZmZXJbaysxXSA9IHM7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrKzJdID0gdjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpY3ZIU1YyUkdCXzh1X0MzUl9wKCBidWZmZXIsIGRpKjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgZGkqMywgY3ZTaXplKGRpLDEpICk7CisgICAgICAgICAgICAgICAgaWYoIHN0YXR1cyA8IDAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMywgZHN0ICs9IGRzdF9jbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciByID0gYnVmZmVyW2tdOworICAgICAgICAgICAgICAgICAgICB1Y2hhciBnID0gYnVmZmVyW2srMV07CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIGIgPSBidWZmZXJbaysyXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4XSA9IGI7CisgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IGc7CisgICAgICAgICAgICAgICAgICAgIGRzdFtibHVlX2lkeF4yXSA9IHI7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbM10gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDVl9PSzsKKyAgICB9CisKKyAgICByZXR1cm4gaWN2QUJDMkJHUnhfOHVfQzNDblIoIHNyYywgc3Jjc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLCBkc3RfY24sIGJsdWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN2Q29sb3JDdnRGdW5jMilpY3ZIU1YyQkdSeF8zMmZfQzNDblIsIHByZV9jb2VmZnMsIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkdCIDwtPiBITFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZCR1J4MkhMU18zMmZfQ25DM1IoIGNvbnN0IGZsb2F0KiBzcmMsIGludCBzcmNzdGVwLCBmbG9hdCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzcmNfY24sIGludCBibHVlX2lkeCApCit7CisgICAgaW50IGk7CisKKyAgICBpZiggaWN2UkdCMkhMU18zMmZfQzNSX3AgKQorICAgIHsKKyAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzID0gaWN2QkdSeDJBQkNfSVBQXzMyZl9DbkMzUiggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19jbiwgYmx1ZV9pZHgsIGljdlJHQjJITFNfMzJmX0MzUl9wICk7CisgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gMzsKKyAgICAgICAgICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICAgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBkc3QgKz0gZHN0c3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gMTI7IGkgKz0gMTIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSBkc3RbaV0qMzYwLmYsIHQxID0gZHN0W2krM10qMzYwLmY7CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHQwOyBkc3RbaSszXSA9IHQxOworICAgICAgICAgICAgICAgICAgICB0MCA9IGRzdFtpKzZdKjM2MC5mOyB0MSA9IGRzdFtpKzldKjM2MC5mOworICAgICAgICAgICAgICAgICAgICBkc3RbaSs2XSA9IHQwOyBkc3RbaSs5XSA9IHQxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMyApCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IGRzdFtpXSozNjAuZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqc3JjX2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGIgPSBzcmNbYmx1ZV9pZHhdLCBnID0gc3JjWzFdLCByID0gc3JjWzJeYmx1ZV9pZHhdOworICAgICAgICAgICAgZmxvYXQgaCA9IDAuZiwgcyA9IDAuZiwgbDsKKyAgICAgICAgICAgIGZsb2F0IHZtaW4sIHZtYXgsIGRpZmY7CisKKyAgICAgICAgICAgIHZtYXggPSB2bWluID0gcjsKKyAgICAgICAgICAgIGlmKCB2bWF4IDwgZyApIHZtYXggPSBnOworICAgICAgICAgICAgaWYoIHZtYXggPCBiICkgdm1heCA9IGI7CisgICAgICAgICAgICBpZiggdm1pbiA+IGcgKSB2bWluID0gZzsKKyAgICAgICAgICAgIGlmKCB2bWluID4gYiApIHZtaW4gPSBiOworCisgICAgICAgICAgICBkaWZmID0gdm1heCAtIHZtaW47CisgICAgICAgICAgICBsID0gKHZtYXggKyB2bWluKSowLjVmOworCisgICAgICAgICAgICBpZiggZGlmZiA+IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gbCA8IDAuNWYgPyBkaWZmLyh2bWF4ICsgdm1pbikgOiBkaWZmLygyIC0gdm1heCAtIHZtaW4pOworICAgICAgICAgICAgICAgIGRpZmYgPSA2MC5mL2RpZmY7CisKKyAgICAgICAgICAgICAgICBpZiggdm1heCA9PSByICkKKyAgICAgICAgICAgICAgICAgICAgaCA9IChnIC0gYikqZGlmZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCB2bWF4ID09IGcgKQorICAgICAgICAgICAgICAgICAgICBoID0gKGIgLSByKSpkaWZmICsgMTIwLmY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoID0gKHIgLSBnKSpkaWZmICsgMjQwLmY7CisKKyAgICAgICAgICAgICAgICBpZiggaCA8IDAuZiApIGggKz0gMzYwLmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtpXSA9IGg7CisgICAgICAgICAgICBkc3RbaSsxXSA9IGw7CisgICAgICAgICAgICBkc3RbaSsyXSA9IHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkhMUzJCR1J4XzMyZl9DM0NuUiggY29uc3QgZmxvYXQqIHNyYywgaW50IHNyY3N0ZXAsIGZsb2F0KiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGRzdF9jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICBpbnQgaTsKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOworICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBpZiggaWN2SExTMlJHQl8zMmZfQzNSX3AgKQorICAgIHsKKyAgICAgICAgaW50IGJsb2NrX3NpemUgPSBNSU4oMSA8PCAxMCwgc2l6ZS53aWR0aCk7CisgICAgICAgIGZsb2F0KiBidWZmZXI7CisgICAgICAgIGludCBkaSwgazsKKyAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzID0gQ1ZfT0s7CisKKyAgICAgICAgYnVmZmVyID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqMypzaXplb2YoYnVmZmVyWzBdKSApOworICAgICAgICBkc3RzdGVwIC09IHNpemUud2lkdGgqZHN0X2NuOworCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSBibG9ja19zaXplICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjMSA9IHNyYyArIGkqMzsKKyAgICAgICAgICAgICAgICBkaSA9IE1JTihibG9ja19zaXplLCBzaXplLndpZHRoIC0gaSk7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBoID0gc3JjMVtrXSowLjAwMjc3Nzc3Nzc3Nzc3Nzc3NzlmOyAvLyAvMzYwLgorICAgICAgICAgICAgICAgICAgICBmbG9hdCBzID0gc3JjMVtrKzFdLCB2ID0gc3JjMVtrKzJdOworICAgICAgICAgICAgICAgICAgICBidWZmZXJba10gPSBoOyBidWZmZXJbaysxXSA9IHM7IGJ1ZmZlcltrKzJdID0gdjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpY3ZITFMyUkdCXzMyZl9DM1JfcCggYnVmZmVyLCBkaSozKnNpemVvZihkc3RbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGRpKjMqc2l6ZW9mKGRzdFswXSksIGN2U2l6ZShkaSwxKSApOworICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkaSozOyBrICs9IDMsIGRzdCArPSBkc3RfY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgciA9IGJ1ZmZlcltrXSwgZyA9IGJ1ZmZlcltrKzFdLCBiID0gYnVmZmVyW2srMl07CisgICAgICAgICAgICAgICAgICAgIGRzdFtibHVlX2lkeF0gPSBiOyBkc3RbMV0gPSBnOyBkc3RbYmx1ZV9pZHheMl0gPSByOworICAgICAgICAgICAgICAgICAgICBpZiggZHN0X2NuID09IDQgKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzNdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ1ZfT0s7CisgICAgfQorICAgIAorICAgIGRzdHN0ZXAgLT0gc2l6ZS53aWR0aCpkc3RfY247CisgICAgc2l6ZS53aWR0aCAqPSAzOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBkc3QgKz0gZHN0X2NuICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgaCA9IHNyY1tpXSwgbCA9IHNyY1tpKzFdLCBzID0gc3JjW2krMl07CisgICAgICAgICAgICBmbG9hdCBiLCBnLCByOworCisgICAgICAgICAgICBpZiggcyA9PSAwICkKKyAgICAgICAgICAgICAgICBiID0gZyA9IHIgPSBsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgc2VjdG9yX2RhdGFbXVszXT0KKyAgICAgICAgICAgICAgICAgICAge3sxLDMsMH0sIHsxLDAsMn0sIHszLDAsMX0sIHswLDIsMX0sIHswLDEsM30sIHsyLDEsMH19OworICAgICAgICAgICAgICAgIGZsb2F0IHRhYls0XTsKKyAgICAgICAgICAgICAgICBpbnQgc2VjdG9yOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZsb2F0IHAyID0gbCA8PSAwLjVmID8gbCooMSArIHMpIDogbCArIHMgLSBsKnM7CisgICAgICAgICAgICAgICAgZmxvYXQgcDEgPSAyKmwgLSBwMjsKKworICAgICAgICAgICAgICAgIGggKj0gMC4wMTY2NjY2NjY2NjY2NjY2NjZmOyAvLyBoIC89IDYwOworICAgICAgICAgICAgICAgIGlmKCBoIDwgMCApCisgICAgICAgICAgICAgICAgICAgIGRvIGggKz0gNjsgd2hpbGUoIGggPCAwICk7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggaCA+PSA2ICkKKyAgICAgICAgICAgICAgICAgICAgZG8gaCAtPSA2OyB3aGlsZSggaCA+PSA2ICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIDAgPD0gaCAmJiBoIDwgNiApOworICAgICAgICAgICAgICAgIHNlY3RvciA9IGN2Rmxvb3IoaCk7CisgICAgICAgICAgICAgICAgaCAtPSBzZWN0b3I7CisKKyAgICAgICAgICAgICAgICB0YWJbMF0gPSBwMjsKKyAgICAgICAgICAgICAgICB0YWJbMV0gPSBwMTsKKyAgICAgICAgICAgICAgICB0YWJbMl0gPSBwMSArIChwMiAtIHAxKSooMS1oKTsKKyAgICAgICAgICAgICAgICB0YWJbM10gPSBwMSArIChwMiAtIHAxKSpoOworCisgICAgICAgICAgICAgICAgYiA9IHRhYltzZWN0b3JfZGF0YVtzZWN0b3JdWzBdXTsKKyAgICAgICAgICAgICAgICBnID0gdGFiW3NlY3Rvcl9kYXRhW3NlY3Rvcl1bMV1dOworICAgICAgICAgICAgICAgIHIgPSB0YWJbc2VjdG9yX2RhdGFbc2VjdG9yXVsyXV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF0gPSBiOworICAgICAgICAgICAgZHN0WzFdID0gZzsKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF4yXSA9IHI7CisgICAgICAgICAgICBpZiggZHN0X2NuID09IDQgKQorICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZCR1J4MkhMU184dV9DbkMzUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3JjX2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBwb3N0X2NvZWZmc1tdID0geyAwLjVmLCAwLmYsIDI1NS5mLCAwLmYsIDI1NS5mLCAwLmYgfTsKKworICAgIGlmKCBpY3ZSR0IySExTXzh1X0MzUl9wICkKKyAgICB7CisgICAgICAgIEN2U3RhdHVzIHN0YXR1cyA9IGljdkJHUngyQUJDX0lQUF84dV9DbkMzUiggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NuLCBibHVlX2lkeCwgaWN2UkdCMkhMU184dV9DM1JfcCApOworICAgICAgICBpZiggc3RhdHVzID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IDM7CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDEyOyBpICs9IDEyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIHQwID0gaWN2SHVlMjU1VG8xODBbZHN0W2ldXSwgdDEgPSBpY3ZIdWUyNTVUbzE4MFtkc3RbaSszXV07CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHQwOyBkc3RbaSszXSA9IHQxOworICAgICAgICAgICAgICAgICAgICB0MCA9IGljdkh1ZTI1NVRvMTgwW2RzdFtpKzZdXTsgdDEgPSBpY3ZIdWUyNTVUbzE4MFtkc3RbaSs5XV07CisgICAgICAgICAgICAgICAgICAgIGRzdFtpKzZdID0gdDA7IGRzdFtpKzldID0gdDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciggOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gaWN2SHVlMjU1VG8xODBbZHN0W2ldXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBpY3ZCR1J4MkFCQ184dV9DbkMzUiggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsIHNyY19jbiwgYmx1ZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3ZDb2xvckN2dEZ1bmMyKWljdkJHUngySExTXzMyZl9DbkMzUiwgMSwgcG9zdF9jb2VmZnMgKTsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2SExTMkJHUnhfOHVfQzNDblIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGRzdF9jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcHJlX2NvZWZmc1tdID0geyAyLmYsIDAuZiwgMC4wMDM5MjE1Njg2Mjc0NTA5ODAzZiwgMC5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAzOTIxNTY4NjI3NDUwOTgwM2YsIDAuZiB9OworCisgICAgaWYoIGljdkhMUzJSR0JfOHVfQzNSX3AgKQorICAgIHsKKyAgICAgICAgaW50IGJsb2NrX3NpemUgPSBNSU4oMSA8PCAxNCwgc2l6ZS53aWR0aCk7CisgICAgICAgIHVjaGFyKiBidWZmZXI7CisgICAgICAgIGludCBpLCBkaSwgazsKKyAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzID0gQ1ZfT0s7CisKKyAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqMypzaXplb2YoYnVmZmVyWzBdKSApOworICAgICAgICBkc3RzdGVwIC09IHNpemUud2lkdGgqZHN0X2NuOworCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSBibG9ja19zaXplICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogc3JjMSA9IHNyYyArIGkqMzsKKyAgICAgICAgICAgICAgICBkaSA9IE1JTihibG9ja19zaXplLCBzaXplLndpZHRoIC0gaSk7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRpKjM7IGsgKz0gMyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciBoID0gaWN2SHVlMTgwVG8yNTVbc3JjMVtrXV07CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIGwgPSBzcmMxW2srMV07CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIHMgPSBzcmMxW2srMl07CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrXSA9IGg7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltrKzFdID0gbDsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2srMl0gPSBzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGljdkhMUzJSR0JfOHVfQzNSX3AoIGJ1ZmZlciwgZGkqMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBkaSozLCBjdlNpemUoZGksMSkgKTsKKyAgICAgICAgICAgICAgICBpZiggc3RhdHVzIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZGkqMzsgayArPSAzLCBkc3QgKz0gZHN0X2NuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIHIgPSBidWZmZXJba107CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIGcgPSBidWZmZXJbaysxXTsKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgYiA9IGJ1ZmZlcltrKzJdOworICAgICAgICAgICAgICAgICAgICBkc3RbYmx1ZV9pZHhdID0gYjsKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gZzsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2JsdWVfaWR4XjJdID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRzdF9jbiA9PSA0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFszXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENWX09LOworICAgIH0KKworICAgIHJldHVybiBpY3ZBQkMyQkdSeF84dV9DM0NuUiggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsIGRzdF9jbiwgYmx1ZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3ZDb2xvckN2dEZ1bmMyKWljdkhMUzJCR1J4XzMyZl9DM0NuUiwgcHJlX2NvZWZmcywgMSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSR0IgPC0+IEwqYSpiKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgbGFiWHJfMzJmICAwLjQzMzk1M2YgLyogPSB4eXpYcl8zMmYgLyAwLjk1MDQ1NiAqLworI2RlZmluZSAgbGFiWGdfMzJmICAwLjM3NjIxOWYgLyogPSB4eXpYZ18zMmYgLyAwLjk1MDQ1NiAqLworI2RlZmluZSAgbGFiWGJfMzJmICAwLjE4OTgyOGYgLyogPSB4eXpYYl8zMmYgLyAwLjk1MDQ1NiAqLworCisjZGVmaW5lICBsYWJZcl8zMmYgIDAuMjEyNjcxZiAvKiA9IHh5ellyXzMyZiAqLworI2RlZmluZSAgbGFiWWdfMzJmICAwLjcxNTE2MGYgLyogPSB4eXpZZ18zMmYgKi8gCisjZGVmaW5lICBsYWJZYl8zMmYgIDAuMDcyMTY5ZiAvKiA9IHh5elliXzMyZiAqLyAKKworI2RlZmluZSAgbGFiWnJfMzJmICAwLjAxNzc1OGYgLyogPSB4eXpacl8zMmYgLyAxLjA4ODc1NCAqLworI2RlZmluZSAgbGFiWmdfMzJmICAwLjEwOTQ3N2YgLyogPSB4eXpaZ18zMmYgLyAxLjA4ODc1NCAqLworI2RlZmluZSAgbGFiWmJfMzJmICAwLjg3Mjc2NmYgLyogPSB4eXpaYl8zMmYgLyAxLjA4ODc1NCAqLworCisjZGVmaW5lICBsYWJSeF8zMmYgIDMuMDc5OTMyN2YgIC8qID0geHl6UnhfMzJmICogMC45NTA0NTYgKi8KKyNkZWZpbmUgIGxhYlJ5XzMyZiAgKC0xLjUzNzE1ZikgLyogPSB4eXpSeV8zMmYgKi8KKyNkZWZpbmUgIGxhYlJ6XzMyZiAgKC0wLjU0Mjc4MmYpLyogPSB4eXpSel8zMmYgKiAxLjA4ODc1NCAqLworCisjZGVmaW5lICBsYWJHeF8zMmYgICgtMC45MjEyMzVmKS8qID0geHl6R3hfMzJmICogMC45NTA0NTYgKi8KKyNkZWZpbmUgIGxhYkd5XzMyZiAgMS44NzU5OTFmICAgLyogPSB4eXpHeV8zMmYgKi8gCisjZGVmaW5lICBsYWJHel8zMmYgIDAuMDQ1MjQ0MjZmIC8qID0geHl6R3pfMzJmICogMS4wODg3NTQgKi8KKworI2RlZmluZSAgbGFiQnhfMzJmICAwLjA1Mjg5MDk3NTVmIC8qID0geHl6QnhfMzJmICogMC45NTA0NTYgKi8KKyNkZWZpbmUgIGxhYkJ5XzMyZiAgKC0wLjIwNDA0M2YpICAvKiA9IHh5ekJ5XzMyZiAqLworI2RlZmluZSAgbGFiQnpfMzJmICAxLjE1MTE1MTU4ZiAgIC8qID0geHl6QnpfMzJmICogMS4wODg3NTQgKi8KKworI2RlZmluZSAgbGFiVF8zMmYgICAwLjAwODg1NmYKKworI2RlZmluZSBsYWJUICAgZml4KGxhYlRfMzJmKjI1NSxsYWJfc2hpZnQpCisKKyN1bmRlZiBsYWJfc2hpZnQKKyNkZWZpbmUgbGFiX3NoaWZ0IDEwCisjZGVmaW5lIGxhYlhyICBmaXgobGFiWHJfMzJmLGxhYl9zaGlmdCkKKyNkZWZpbmUgbGFiWGcgIGZpeChsYWJYZ18zMmYsbGFiX3NoaWZ0KQorI2RlZmluZSBsYWJYYiAgZml4KGxhYlhiXzMyZixsYWJfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIGxhYllyICBmaXgobGFiWXJfMzJmLGxhYl9zaGlmdCkKKyNkZWZpbmUgbGFiWWcgIGZpeChsYWJZZ18zMmYsbGFiX3NoaWZ0KQorI2RlZmluZSBsYWJZYiAgZml4KGxhYlliXzMyZixsYWJfc2hpZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisjZGVmaW5lIGxhYlpyICBmaXgobGFiWnJfMzJmLGxhYl9zaGlmdCkKKyNkZWZpbmUgbGFiWmcgIGZpeChsYWJaZ18zMmYsbGFiX3NoaWZ0KQorI2RlZmluZSBsYWJaYiAgZml4KGxhYlpiXzMyZixsYWJfc2hpZnQpCisKKyNkZWZpbmUgbGFiU21hbGxTY2FsZV8zMmYgIDcuNzg3ZgorI2RlZmluZSBsYWJTbWFsbFNoaWZ0XzMyZiAgMC4xMzc5MzEwMzQ0ODI3NTg2MmYgIC8qIDE2LzExNiAqLworI2RlZmluZSBsYWJMU2NhbGVfMzJmICAgICAgMTE2LmYKKyNkZWZpbmUgbGFiTFNoaWZ0XzMyZiAgICAgIDE2LmYKKyNkZWZpbmUgbGFiTFNjYWxlMl8zMmYgICAgIDkwMy4zZgorCisjZGVmaW5lIGxhYlNtYWxsU2NhbGUgZml4KDMxLjI3IC8qIGxhYlNtYWxsU2NhbGVfMzJmKigxPDxsYWJfc2hpZnQpLzI1NSAqLyxsYWJfc2hpZnQpCisjZGVmaW5lIGxhYlNtYWxsU2hpZnQgZml4KDE0MS4yNDEzOCAvKiBsYWJTbWFsbFNjYWxlXzMyZiooMTw8bGFiKSAqLyxsYWJfc2hpZnQpCisjZGVmaW5lIGxhYkxTY2FsZSBmaXgoMjk1LjggLyogbGFiTFNjYWxlXzMyZioyNTUvMTAwICovLGxhYl9zaGlmdCkKKyNkZWZpbmUgbGFiTFNoaWZ0IGZpeCg0MTc3OS4yIC8qIGxhYkxTaGlmdF8zMmYqMTAyNCoyNTUvMTAwICovLGxhYl9zaGlmdCkKKyNkZWZpbmUgbGFiTFNjYWxlMiBmaXgobGFiTFNjYWxlMl8zMmYqMC4wMSxsYWJfc2hpZnQpCisKKy8qIDEwMjQqKChbMC4uNTExXS4vMjU1KSoqKDEuLzMpKSAqLworc3RhdGljIHVzaG9ydCBpY3ZMYWJDdWJlUm9vdFRhYltdID0geworICAgICAgIDAsICAxNjEsICAyMDMsICAyMzIsICAyNTYsICAyNzYsICAyOTMsICAzMDgsICAzMjIsICAzMzUsICAzNDcsICAzNTksICAzNjksICAzNzksICAzODksICAzOTgsCisgICAgIDQwNiwgIDQxNSwgIDQyMywgIDQzMCwgIDQzOCwgIDQ0NSwgIDQ1MiwgIDQ1OSwgIDQ2NSwgIDQ3MiwgIDQ3OCwgIDQ4NCwgIDQ5MCwgIDQ5NiwgIDUwMSwgIDUwNywKKyAgICAgNTEyLCAgNTE3LCAgNTIzLCAgNTI4LCAgNTMzLCAgNTM4LCAgNTQyLCAgNTQ3LCAgNTUyLCAgNTU2LCAgNTYxLCAgNTY1LCAgNTcwLCAgNTc0LCAgNTc4LCAgNTgyLAorICAgICA1ODYsICA1OTAsICA1OTQsICA1OTgsICA2MDIsICA2MDYsICA2MTAsICA2MTQsICA2MTcsICA2MjEsICA2MjUsICA2MjgsICA2MzIsICA2MzUsICA2MzksICA2NDIsCisgICAgIDY0NSwgIDY0OSwgIDY1MiwgIDY1NSwgIDY1OSwgIDY2MiwgIDY2NSwgIDY2OCwgIDY3MSwgIDY3NCwgIDY3NywgIDY4MCwgIDY4NCwgIDY4NiwgIDY4OSwgIDY5MiwKKyAgICAgNjk1LCAgNjk4LCAgNzAxLCAgNzA0LCAgNzA3LCAgNzEwLCAgNzEyLCAgNzE1LCAgNzE4LCAgNzIwLCAgNzIzLCAgNzI2LCAgNzI4LCAgNzMxLCAgNzM0LCAgNzM2LAorICAgICA3MzksICA3NDEsICA3NDQsICA3NDcsICA3NDksICA3NTIsICA3NTQsICA3NTYsICA3NTksICA3NjEsICA3NjQsICA3NjYsICA3NjksICA3NzEsICA3NzMsICA3NzYsCisgICAgIDc3OCwgIDc4MCwgIDc4MiwgIDc4NSwgIDc4NywgIDc4OSwgIDc5MiwgIDc5NCwgIDc5NiwgIDc5OCwgIDgwMCwgIDgwMywgIDgwNSwgIDgwNywgIDgwOSwgIDgxMSwKKyAgICAgODEzLCAgODE1LCAgODE4LCAgODIwLCAgODIyLCAgODI0LCAgODI2LCAgODI4LCAgODMwLCAgODMyLCAgODM0LCAgODM2LCAgODM4LCAgODQwLCAgODQyLCAgODQ0LAorICAgICA4NDYsICA4NDgsICA4NTAsICA4NTIsICA4NTQsICA4NTYsICA4NTcsICA4NTksICA4NjEsICA4NjMsICA4NjUsICA4NjcsICA4NjksICA4NzEsICA4NzIsICA4NzQsCisgICAgIDg3NiwgIDg3OCwgIDg4MCwgIDg4MiwgIDg4MywgIDg4NSwgIDg4NywgIDg4OSwgIDg5MSwgIDg5MiwgIDg5NCwgIDg5NiwgIDg5OCwgIDg5OSwgIDkwMSwgIDkwMywKKyAgICAgOTA0LCAgOTA2LCAgOTA4LCAgOTEwLCAgOTExLCAgOTEzLCAgOTE1LCAgOTE2LCAgOTE4LCAgOTIwLCAgOTIxLCAgOTIzLCAgOTI1LCAgOTI2LCAgOTI4LCAgOTI5LAorICAgICA5MzEsICA5MzMsICA5MzQsICA5MzYsICA5MzgsICA5MzksICA5NDEsICA5NDIsICA5NDQsICA5NDUsICA5NDcsICA5NDksICA5NTAsICA5NTIsICA5NTMsICA5NTUsCisgICAgIDk1NiwgIDk1OCwgIDk1OSwgIDk2MSwgIDk2MiwgIDk2NCwgIDk2NSwgIDk2NywgIDk2OCwgIDk3MCwgIDk3MSwgIDk3MywgIDk3NCwgIDk3NiwgIDk3NywgIDk3OSwKKyAgICAgOTgwLCAgOTgyLCAgOTgzLCAgOTg1LCAgOTg2LCAgOTg3LCAgOTg5LCAgOTkwLCAgOTkyLCAgOTkzLCAgOTk1LCAgOTk2LCAgOTk3LCAgOTk5LCAxMDAwLCAxMDAyLAorICAgIDEwMDMsIDEwMDQsIDEwMDYsIDEwMDcsIDEwMDksIDEwMTAsIDEwMTEsIDEwMTMsIDEwMTQsIDEwMTUsIDEwMTcsIDEwMTgsIDEwMTksIDEwMjEsIDEwMjIsIDEwMjQsCisgICAgMTAyNSwgMTAyNiwgMTAyOCwgMTAyOSwgMTAzMCwgMTAzMSwgMTAzMywgMTAzNCwgMTAzNSwgMTAzNywgMTAzOCwgMTAzOSwgMTA0MSwgMTA0MiwgMTA0MywgMTA0NCwKKyAgICAxMDQ2LCAxMDQ3LCAxMDQ4LCAxMDUwLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLCAxMDY1LAorICAgIDEwNjYsIDEwNjcsIDEwNjgsIDEwNzAsIDEwNzEsIDEwNzIsIDEwNzMsIDEwNzQsIDEwNzYsIDEwNzcsIDEwNzgsIDEwNzksIDEwODEsIDEwODIsIDEwODMsIDEwODQsCisgICAgMTA4NSwgMTA4NiwgMTA4OCwgMTA4OSwgMTA5MCwgMTA5MSwgMTA5MiwgMTA5NCwgMTA5NSwgMTA5NiwgMTA5NywgMTA5OCwgMTA5OSwgMTEwMSwgMTEwMiwgMTEwMywKKyAgICAxMTA0LCAxMTA1LCAxMTA2LCAxMTA3LCAxMTA5LCAxMTEwLCAxMTExLCAxMTEyLCAxMTEzLCAxMTE0LCAxMTE1LCAxMTE3LCAxMTE4LCAxMTE5LCAxMTIwLCAxMTIxLAorICAgIDExMjIsIDExMjMsIDExMjQsIDExMjUsIDExMjcsIDExMjgsIDExMjksIDExMzAsIDExMzEsIDExMzIsIDExMzMsIDExMzQsIDExMzUsIDExMzYsIDExMzgsIDExMzksCisgICAgMTE0MCwgMTE0MSwgMTE0MiwgMTE0MywgMTE0NCwgMTE0NSwgMTE0NiwgMTE0NywgMTE0OCwgMTE0OSwgMTE1MCwgMTE1MSwgMTE1MiwgMTE1NCwgMTE1NSwgMTE1NiwKKyAgICAxMTU3LCAxMTU4LCAxMTU5LCAxMTYwLCAxMTYxLCAxMTYyLCAxMTYzLCAxMTY0LCAxMTY1LCAxMTY2LCAxMTY3LCAxMTY4LCAxMTY5LCAxMTcwLCAxMTcxLCAxMTcyLAorICAgIDExNzMsIDExNzQsIDExNzUsIDExNzYsIDExNzcsIDExNzgsIDExNzksIDExODAsIDExODEsIDExODIsIDExODMsIDExODQsIDExODUsIDExODYsIDExODcsIDExODgsCisgICAgMTE4OSwgMTE5MCwgMTE5MSwgMTE5MiwgMTE5MywgMTE5NCwgMTE5NSwgMTE5NiwgMTE5NywgMTE5OCwgMTE5OSwgMTIwMCwgMTIwMSwgMTIwMiwgMTIwMywgMTIwNCwKKyAgICAxMjA1LCAxMjA2LCAxMjA3LCAxMjA4LCAxMjA5LCAxMjEwLCAxMjExLCAxMjEyLCAxMjEzLCAxMjE0LCAxMjE1LCAxMjE1LCAxMjE2LCAxMjE3LCAxMjE4LCAxMjE5LAorICAgIDEyMjAsIDEyMjEsIDEyMjIsIDEyMjMsIDEyMjQsIDEyMjUsIDEyMjYsIDEyMjcsIDEyMjgsIDEyMjksIDEyMzAsIDEyMzAsIDEyMzEsIDEyMzIsIDEyMzMsIDEyMzQsCisgICAgMTIzNSwgMTIzNiwgMTIzNywgMTIzOCwgMTIzOSwgMTI0MCwgMTI0MSwgMTI0MiwgMTI0MiwgMTI0MywgMTI0NCwgMTI0NSwgMTI0NiwgMTI0NywgMTI0OCwgMTI0OSwKKyAgICAxMjUwLCAxMjUxLCAxMjUxLCAxMjUyLCAxMjUzLCAxMjU0LCAxMjU1LCAxMjU2LCAxMjU3LCAxMjU4LCAxMjU5LCAxMjU5LCAxMjYwLCAxMjYxLCAxMjYyLCAxMjYzLAorICAgIDEyNjQsIDEyNjUsIDEyNjYsIDEyNjYsIDEyNjcsIDEyNjgsIDEyNjksIDEyNzAsIDEyNzEsIDEyNzIsIDEyNzMsIDEyNzMsIDEyNzQsIDEyNzUsIDEyNzYsIDEyNzcsCisgICAgMTI3OCwgMTI3OSwgMTI3OSwgMTI4MCwgMTI4MSwgMTI4MiwgMTI4MywgMTI4NCwgMTI4NSwgMTI4NSwgMTI4NiwgMTI4NywgMTI4OCwgMTI4OSwgMTI5MCwgMTI5MQorfTsKKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJMYWJfOHVfQ25DM1IoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IHNyY19jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qaWYoIGljdkJHUjJMYWJfOHVfQzNSX3AgKQorICAgICAgICByZXR1cm4gaWN2QkdSeDJBQkNfSVBQXzh1X0NuQzNSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NuLCBibHVlX2lkeF4yLCBpY3ZCR1IyTGFiXzh1X0MzUl9wICk7Ki8KKworICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247CisgICAgc2l6ZS53aWR0aCAqPSAzOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBzcmMgKz0gc3JjX2NuICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGIgPSBzcmNbYmx1ZV9pZHhdLCBnID0gc3JjWzFdLCByID0gc3JjWzJeYmx1ZV9pZHhdOworICAgICAgICAgICAgaW50IHgsIHksIHosIGY7CisgICAgICAgICAgICBpbnQgTCwgYTsKKworICAgICAgICAgICAgeCA9IGIqbGFiWGIgKyBnKmxhYlhnICsgcipsYWJYcjsKKyAgICAgICAgICAgIHkgPSBiKmxhYlliICsgZypsYWJZZyArIHIqbGFiWXI7CisgICAgICAgICAgICB6ID0gYipsYWJaYiArIGcqbGFiWmcgKyByKmxhYlpyOworCisgICAgICAgICAgICBmID0geCA+IGxhYlQ7CisgICAgICAgICAgICB4ID0gQ1ZfREVTQ0FMRSggeCwgbGFiX3NoaWZ0ICk7CisKKyAgICAgICAgICAgIGlmKCBmICkKKyAgICAgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZCl4IDwgNTEyICksIHggPSBpY3ZMYWJDdWJlUm9vdFRhYlt4XTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4ID0gQ1ZfREVTQ0FMRSh4KmxhYlNtYWxsU2NhbGUgKyBsYWJTbWFsbFNoaWZ0LGxhYl9zaGlmdCk7CisKKyAgICAgICAgICAgIGYgPSB6ID4gbGFiVDsKKyAgICAgICAgICAgIHogPSBDVl9ERVNDQUxFKCB6LCBsYWJfc2hpZnQgKTsKKworICAgICAgICAgICAgaWYoIGYgKQorICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKXogPCA1MTIgKSwgeiA9IGljdkxhYkN1YmVSb290VGFiW3pdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHogPSBDVl9ERVNDQUxFKHoqbGFiU21hbGxTY2FsZSArIGxhYlNtYWxsU2hpZnQsbGFiX3NoaWZ0KTsKKworICAgICAgICAgICAgZiA9IHkgPiBsYWJUOworICAgICAgICAgICAgeSA9IENWX0RFU0NBTEUoIHksIGxhYl9zaGlmdCApOworCisgICAgICAgICAgICBpZiggZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpeSA8IDUxMiApLCB5ID0gaWN2TGFiQ3ViZVJvb3RUYWJbeV07CisgICAgICAgICAgICAgICAgTCA9IENWX0RFU0NBTEUoeSpsYWJMU2NhbGUgLSBsYWJMU2hpZnQsIDIqbGFiX3NoaWZ0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTCA9IENWX0RFU0NBTEUoeSpsYWJMU2NhbGUyLGxhYl9zaGlmdCk7CisgICAgICAgICAgICAgICAgeSA9IENWX0RFU0NBTEUoeSpsYWJTbWFsbFNjYWxlICsgbGFiU21hbGxTaGlmdCxsYWJfc2hpZnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhID0gQ1ZfREVTQ0FMRSggNTAwKih4IC0geSksIGxhYl9zaGlmdCApICsgMTI4OworICAgICAgICAgICAgYiA9IENWX0RFU0NBTEUoIDIwMCooeSAtIHopLCBsYWJfc2hpZnQgKSArIDEyODsKKworICAgICAgICAgICAgZHN0W2ldID0gQ1ZfQ0FTVF84VShMKTsKKyAgICAgICAgICAgIGRzdFtpKzFdID0gQ1ZfQ0FTVF84VShhKTsKKyAgICAgICAgICAgIGRzdFtpKzJdID0gQ1ZfQ0FTVF84VShiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJMYWJfMzJmX0NuQzNSKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3Jjc3RlcCwgZmxvYXQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3JjX2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIGludCBpOworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKyAgICBzcmNzdGVwIC09IHNpemUud2lkdGgqc3JjX2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgc3JjICs9IHNyY19jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGIgPSBzcmNbYmx1ZV9pZHhdLCBnID0gc3JjWzFdLCByID0gc3JjWzJeYmx1ZV9pZHhdOworICAgICAgICAgICAgZmxvYXQgeCwgeSwgejsKKyAgICAgICAgICAgIGZsb2F0IEwsIGE7CisKKyAgICAgICAgICAgIHggPSBiKmxhYlhiXzMyZiArIGcqbGFiWGdfMzJmICsgcipsYWJYcl8zMmY7CisgICAgICAgICAgICB5ID0gYipsYWJZYl8zMmYgKyBnKmxhYllnXzMyZiArIHIqbGFiWXJfMzJmOworICAgICAgICAgICAgeiA9IGIqbGFiWmJfMzJmICsgZypsYWJaZ18zMmYgKyByKmxhYlpyXzMyZjsKKworICAgICAgICAgICAgaWYoIHggPiBsYWJUXzMyZiApCisgICAgICAgICAgICAgICAgeCA9IGN2Q2JydCh4KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB4ID0geCpsYWJTbWFsbFNjYWxlXzMyZiArIGxhYlNtYWxsU2hpZnRfMzJmOworCisgICAgICAgICAgICBpZiggeiA+IGxhYlRfMzJmICkKKyAgICAgICAgICAgICAgICB6ID0gY3ZDYnJ0KHopOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHogPSB6KmxhYlNtYWxsU2NhbGVfMzJmICsgbGFiU21hbGxTaGlmdF8zMmY7CisKKyAgICAgICAgICAgIGlmKCB5ID4gbGFiVF8zMmYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHkgPSBjdkNicnQoeSk7CisgICAgICAgICAgICAgICAgTCA9IHkqbGFiTFNjYWxlXzMyZiAtIGxhYkxTaGlmdF8zMmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTCA9IHkqbGFiTFNjYWxlMl8zMmY7CisgICAgICAgICAgICAgICAgeSA9IHkqbGFiU21hbGxTY2FsZV8zMmYgKyBsYWJTbWFsbFNoaWZ0XzMyZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYSA9IDUwMC5mKih4IC0geSk7CisgICAgICAgICAgICBiID0gMjAwLmYqKHkgLSB6KTsKKworICAgICAgICAgICAgZHN0W2ldID0gTDsKKyAgICAgICAgICAgIGRzdFtpKzFdID0gYTsKKyAgICAgICAgICAgIGRzdFtpKzJdID0gYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2TGFiMkJHUnhfMzJmX0MzQ25SKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3Jjc3RlcCwgZmxvYXQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZHN0X2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIGludCBpOworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKyAgICBkc3RzdGVwIC09IHNpemUud2lkdGgqZHN0X2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgZHN0ICs9IGRzdF9jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IEwgPSBzcmNbaV0sIGEgPSBzcmNbaSsxXSwgYiA9IHNyY1tpKzJdOworICAgICAgICAgICAgZmxvYXQgeCwgeSwgejsKKyAgICAgICAgICAgIGZsb2F0IGcsIHI7CisKKyAgICAgICAgICAgIEwgPSAoTCArIGxhYkxTaGlmdF8zMmYpKigxLmYvbGFiTFNjYWxlXzMyZik7CisgICAgICAgICAgICB4ID0gKEwgKyBhKjAuMDAyZik7CisgICAgICAgICAgICB6ID0gKEwgLSBiKjAuMDA1Zik7CisgICAgICAgICAgICB5ID0gTCpMKkw7CisgICAgICAgICAgICB4ID0geCp4Kng7CisgICAgICAgICAgICB6ID0geip6Kno7CisKKyAgICAgICAgICAgIGIgPSB4KmxhYkJ4XzMyZiArIHkqbGFiQnlfMzJmICsgeipsYWJCel8zMmY7CisgICAgICAgICAgICBnID0geCpsYWJHeF8zMmYgKyB5KmxhYkd5XzMyZiArIHoqbGFiR3pfMzJmOworICAgICAgICAgICAgciA9IHgqbGFiUnhfMzJmICsgeSpsYWJSeV8zMmYgKyB6KmxhYlJ6XzMyZjsKKworICAgICAgICAgICAgZHN0W2JsdWVfaWR4XSA9IGI7CisgICAgICAgICAgICBkc3RbMV0gPSBnOworICAgICAgICAgICAgZHN0W2JsdWVfaWR4XjJdID0gcjsKKyAgICAgICAgICAgIGlmKCBkc3RfY24gPT0gNCApCisgICAgICAgICAgICAgICAgZHN0WzNdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2TGFiMkJHUnhfOHVfQzNDblIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGRzdF9jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICAvLyBMOiBbMC4uMjU1XSAtPiBbMC4uMTAwXQorICAgIC8vIGE6IFswLi4yNTVdIC0+IFstMTI4Li4xMjddCisgICAgLy8gYjogWzAuLjI1NV0gLT4gWy0xMjguLjEyN10KKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcHJlX2NvZWZmc1tdID0geyAwLjM5MjE1Njg2Mjc0NTA5ODA5ZiwgMC5mLCAxLmYsIC0xMjguZiwgMS5mLCAtMTI4LmYgfTsKKworICAgIGlmKCBpY3ZMYWIyQkdSXzh1X0MzUl9wICkKKyAgICAgICAgcmV0dXJuIGljdkFCQzJCR1J4X0lQUF84dV9DM0NuUiggc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9jbiwgYmx1ZV9pZHheMiwgaWN2TGFiMkJHUl84dV9DM1JfcCApOworCisgICAgcmV0dXJuIGljdkFCQzJCR1J4Xzh1X0MzQ25SKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwgZHN0X2NuLCBibHVlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdkNvbG9yQ3Z0RnVuYzIpaWN2TGFiMkJHUnhfMzJmX0MzQ25SLCBwcmVfY29lZmZzLCAxICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJHQiA8LT4gTCp1KnYqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGx1dlVuXzMyZiAgMC4xOTc5Mzk0M2YgCisjZGVmaW5lIGx1dlZuXzMyZiAgMC40NjgzMTA5NmYgCisjZGVmaW5lIGx1dlltaW5fMzJmICAwLjA1ODgyMzUzZiAvKiAxNS8yNTUgKi8KKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkJHUngyTHV2XzMyZl9DbkMzUiggY29uc3QgZmxvYXQqIHNyYywgaW50IHNyY3N0ZXAsIGZsb2F0KiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IHNyY19jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qaWYoIGljdlJHQjJMdXZfMzJmX0MzUl9wICkKKyAgICAgICAgcmV0dXJuIGljdkJHUngyQUJDX0lQUF8zMmZfQ25DM1IoIHNyYywgc3Jjc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NuLCBibHVlX2lkeCwgaWN2UkdCMkx1dl8zMmZfQzNSX3AgKTsqLworCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOworICAgIHNyY3N0ZXAgLT0gc2l6ZS53aWR0aCpzcmNfY247CisgICAgc2l6ZS53aWR0aCAqPSAzOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzLCBzcmMgKz0gc3JjX2NuICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgYiA9IHNyY1tibHVlX2lkeF0sIGcgPSBzcmNbMV0sIHIgPSBzcmNbMl5ibHVlX2lkeF07CisgICAgICAgICAgICBmbG9hdCB4LCB5LCB6OworICAgICAgICAgICAgZmxvYXQgTCwgdSwgdiwgdDsKKworICAgICAgICAgICAgeCA9IGIqeHl6WGJfMzJmICsgZyp4eXpYZ18zMmYgKyByKnh5elhyXzMyZjsKKyAgICAgICAgICAgIHkgPSBiKnh5elliXzMyZiArIGcqeHl6WWdfMzJmICsgcip4eXpZcl8zMmY7CisgICAgICAgICAgICB6ID0gYip4eXpaYl8zMmYgKyBnKnh5elpnXzMyZiArIHIqeHl6WnJfMzJmOworCisgICAgICAgICAgICBpZiggIXggJiYgIXkgJiYgIXogKQorICAgICAgICAgICAgICAgIEwgPSB1ID0gdiA9IDAuZjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggeSA+IGxhYlRfMzJmICkKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxhYkxTY2FsZV8zMmYgKiBjdkNicnQoeSkgLSBsYWJMU2hpZnRfMzJmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgTCA9IGxhYkxTY2FsZTJfMzJmICogeTsKKworICAgICAgICAgICAgICAgIHQgPSAxLmYgLyAoeCArIDE1ICogeSArIDMgKiB6KTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB1ID0gNC4wZiAqIHggKiB0OworICAgICAgICAgICAgICAgIHYgPSA5LjBmICogeSAqIHQ7CisKKyAgICAgICAgICAgICAgICB1ID0gMTMqTCoodSAtIGx1dlVuXzMyZik7CisgICAgICAgICAgICAgICAgdiA9IDEzKkwqKHYgLSBsdXZWbl8zMmYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3RbaV0gPSBMOworICAgICAgICAgICAgZHN0W2krMV0gPSB1OworICAgICAgICAgICAgZHN0W2krMl0gPSB2OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZMdXYyQkdSeF8zMmZfQzNDblIoIGNvbnN0IGZsb2F0KiBzcmMsIGludCBzcmNzdGVwLCBmbG9hdCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBkc3RfY24sIGludCBibHVlX2lkeCApCit7CisgICAgaW50IGk7CisKKyAgICAvKmlmKCBpY3ZMdXYyUkdCXzMyZl9DM1JfcCApCisgICAgICAgIHJldHVybiBpY3ZBQkMyQkdSeF9JUFBfMzJmX0MzQ25SKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9jbiwgYmx1ZV9pZHgsIGljdkx1djJSR0JfMzJmX0MzUl9wICk7Ki8KKworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKyAgICBkc3RzdGVwIC09IHNpemUud2lkdGgqZHN0X2NuOworICAgIHNpemUud2lkdGggKj0gMzsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMywgZHN0ICs9IGRzdF9jbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IEwgPSBzcmNbaV0sIHUgPSBzcmNbaSsxXSwgdiA9IHNyY1tpKzJdOworICAgICAgICAgICAgZmxvYXQgeCwgeSwgeiwgdCwgdTEsIHYxLCBiLCBnLCByOworCisgICAgICAgICAgICBpZiggTCA+PSA4ICkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdCA9IChMICsgbGFiTFNoaWZ0XzMyZikgKiAoMS5mL2xhYkxTY2FsZV8zMmYpOworICAgICAgICAgICAgICAgIHkgPSB0KnQqdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5ID0gTCAqICgxLmYvbGFiTFNjYWxlMl8zMmYpOworICAgICAgICAgICAgICAgIEwgPSBNQVgoIEwsIDAuMDAxZiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ID0gMS5mLygxMy5mICogTCk7CisgICAgICAgICAgICB1MSA9IHUqdCArIGx1dlVuXzMyZjsKKyAgICAgICAgICAgIHYxID0gdip0ICsgbHV2Vm5fMzJmOworICAgICAgICAgICAgeCA9IDIuMjVmICogdTEgKiB5IC8gdjEgOworICAgICAgICAgICAgeiA9ICgxMiAtIDMgKiB1MSAtIDIwICogdjEpICogeSAvICg0ICogdjEpOyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBiID0geHl6QnhfMzJmKnggKyB4eXpCeV8zMmYqeSArIHh5ekJ6XzMyZip6OworICAgICAgICAgICAgZyA9IHh5ekd4XzMyZip4ICsgeHl6R3lfMzJmKnkgKyB4eXpHel8zMmYqejsKKyAgICAgICAgICAgIHIgPSB4eXpSeF8zMmYqeCArIHh5elJ5XzMyZip5ICsgeHl6UnpfMzJmKno7CisKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF0gPSBiOworICAgICAgICAgICAgZHN0WzFdID0gZzsKKyAgICAgICAgICAgIGRzdFtibHVlX2lkeF4yXSA9IHI7CisgICAgICAgICAgICBpZiggZHN0X2NuID09IDQgKQorICAgICAgICAgICAgICAgIGRzdFszXSA9IDAuZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QkdSeDJMdXZfOHVfQ25DM1IoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IHNyY19jbiwgaW50IGJsdWVfaWR4ICkKK3sKKyAgICAvLyBMOiBbMC4uMTAwXSAtPiBbMC4uMjU1XQorICAgIC8vIHU6IFstMTM0Li4yMjBdIC0+IFswLi4yNTVdCisgICAgLy8gdjogWy0xNDAuLjEyMl0gLT4gWzAuLjI1NV0KKyAgICAvL3N0YXRpYyBjb25zdCBmbG9hdCBwb3N0X2NvZWZmc1tdID0geyAyLjU1ZiwgMC5mLCAxLmYsIDgzLmYsIDEuZiwgMTQwLmYgfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9zdF9jb2VmZnNbXSA9IHsgMi41NWYsIDAuZiwgMC43MjAzMzg5ODMwNTA4NDc0M2YsIDk2LjUyNTQyMzcyODgxMzU2NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDkzNzVmLCAxMzkuNDUzMTI1ZiB9OworCisgICAgaWYoIGljdlJHQjJMdXZfOHVfQzNSX3AgKQorICAgICAgICByZXR1cm4gaWN2QkdSeDJBQkNfSVBQXzh1X0NuQzNSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2NuLCBibHVlX2lkeCwgaWN2UkdCMkx1dl84dV9DM1JfcCApOworCisgICAgcmV0dXJuIGljdkJHUngyQUJDXzh1X0NuQzNSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwgc3JjX2NuLCBibHVlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJMdXZfMzJmX0NuQzNSLCAxLCBwb3N0X2NvZWZmcyApOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZMdXYyQkdSeF84dV9DM0NuUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZHN0X2NuLCBpbnQgYmx1ZV9pZHggKQoreworICAgIC8vIEw6IFswLi4yNTVdIC0+IFswLi4xMDBdCisgICAgLy8gdTogWzAuLjI1NV0gLT4gWy0xMzQuLjIyMF0KKyAgICAvLyB2OiBbMC4uMjU1XSAtPiBbLTE0MC4uMTIyXQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBwcmVfY29lZmZzW10gPSB7IDAuMzkyMTU2ODYyNzQ1MDk4MDlmLCAwLmYsIDEuMzg4MjM1Mjk0MTE3NjQ3ZiwgLTEzNC5mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDAzOTIxNTY4NjI3NDUxZiwgLTE0MC5mIH07CisKKyAgICBpZiggaWN2THV2MlJHQl84dV9DM1JfcCApCisgICAgICAgIHJldHVybiBpY3ZBQkMyQkdSeF9JUFBfOHVfQzNDblIoIHNyYywgc3Jjc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfY24sIGJsdWVfaWR4LCBpY3ZMdXYyUkdCXzh1X0MzUl9wICk7CisKKyAgICByZXR1cm4gaWN2QUJDMkJHUnhfOHVfQzNDblIoIHNyYywgc3Jjc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLCBkc3RfY24sIGJsdWVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN2Q29sb3JDdnRGdW5jMilpY3ZMdXYyQkdSeF8zMmZfQzNDblIsIHByZV9jb2VmZnMsIDEgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJheWVyIFBhdHRlcm4gLT4gUkdCIGNvbnZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2QmF5ZXIyQkdSXzh1X0MxQzNSKCBjb25zdCB1Y2hhciogYmF5ZXIwLCBpbnQgYmF5ZXJfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmRzdDAsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBjb2RlICkKK3sKKyAgICBpbnQgYmx1ZSA9IGNvZGUgPT0gQ1ZfQmF5ZXJCRzJCR1IgfHwgY29kZSA9PSBDVl9CYXllckdCMkJHUiA/IC0xIDogMTsKKyAgICBpbnQgc3RhcnRfd2l0aF9ncmVlbiA9IGNvZGUgPT0gQ1ZfQmF5ZXJHQjJCR1IgfHwgY29kZSA9PSBDVl9CYXllckdSMkJHUjsKKworICAgIG1lbXNldCggZHN0MCwgMCwgc2l6ZS53aWR0aCozKnNpemVvZihkc3QwWzBdKSApOworICAgIG1lbXNldCggZHN0MCArIChzaXplLmhlaWdodCAtIDEpKmRzdF9zdGVwLCAwLCBzaXplLndpZHRoKjMqc2l6ZW9mKGRzdDBbMF0pICk7CisgICAgZHN0MCArPSBkc3Rfc3RlcCArIDMgKyAxOworICAgIHNpemUuaGVpZ2h0IC09IDI7CisgICAgc2l6ZS53aWR0aCAtPSAyOworCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS0gPiAwOyBiYXllcjAgKz0gYmF5ZXJfc3RlcCwgZHN0MCArPSBkc3Rfc3RlcCApCisgICAgeworICAgICAgICBpbnQgdDAsIHQxOworICAgICAgICBjb25zdCB1Y2hhciogYmF5ZXIgPSBiYXllcjA7CisgICAgICAgIHVjaGFyKiBkc3QgPSBkc3QwOworICAgICAgICBjb25zdCB1Y2hhciogYmF5ZXJfZW5kID0gYmF5ZXIgKyBzaXplLndpZHRoOworCisgICAgICAgIGRzdFstNF0gPSBkc3RbLTNdID0gZHN0Wy0yXSA9IGRzdFtzaXplLndpZHRoKjMtMV0gPQorICAgICAgICAgICAgZHN0W3NpemUud2lkdGgqM10gPSBkc3Rbc2l6ZS53aWR0aCozKzFdID0gMDsKKworICAgICAgICBpZiggc2l6ZS53aWR0aCA8PSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmKCBzdGFydF93aXRoX2dyZWVuICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAgPSAoYmF5ZXJbMV0gKyBiYXllcltiYXllcl9zdGVwKjIrMV0gKyAxKSA+PiAxOworICAgICAgICAgICAgdDEgPSAoYmF5ZXJbYmF5ZXJfc3RlcF0gKyBiYXllcltiYXllcl9zdGVwKzJdICsgMSkgPj4gMTsKKyAgICAgICAgICAgIGRzdFstYmx1ZV0gPSAodWNoYXIpdDA7CisgICAgICAgICAgICBkc3RbMF0gPSBiYXllcltiYXllcl9zdGVwKzFdOworICAgICAgICAgICAgZHN0W2JsdWVdID0gKHVjaGFyKXQxOworICAgICAgICAgICAgYmF5ZXIrKzsKKyAgICAgICAgICAgIGRzdCArPSAzOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGJsdWUgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCA7IGJheWVyIDw9IGJheWVyX2VuZCAtIDI7IGJheWVyICs9IDIsIGRzdCArPSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0MCA9IChiYXllclswXSArIGJheWVyWzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyXSArCisgICAgICAgICAgICAgICAgICAgICAgYmF5ZXJbYmF5ZXJfc3RlcCoyKzJdICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICB0MSA9IChiYXllclsxXSArIGJheWVyW2JheWVyX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICBiYXllcltiYXllcl9zdGVwKzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyKzFdKzIpID4+IDI7CisgICAgICAgICAgICAgICAgZHN0Wy0xXSA9ICh1Y2hhcil0MDsKKyAgICAgICAgICAgICAgICBkc3RbMF0gPSAodWNoYXIpdDE7CisgICAgICAgICAgICAgICAgZHN0WzFdID0gYmF5ZXJbYmF5ZXJfc3RlcCsxXTsKKworICAgICAgICAgICAgICAgIHQwID0gKGJheWVyWzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyKzJdICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICB0MSA9IChiYXllcltiYXllcl9zdGVwKzFdICsgYmF5ZXJbYmF5ZXJfc3RlcCszXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgZHN0WzJdID0gKHVjaGFyKXQwOworICAgICAgICAgICAgICAgIGRzdFszXSA9IGJheWVyW2JheWVyX3N0ZXArMl07CisgICAgICAgICAgICAgICAgZHN0WzRdID0gKHVjaGFyKXQxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCA7IGJheWVyIDw9IGJheWVyX2VuZCAtIDI7IGJheWVyICs9IDIsIGRzdCArPSA2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0MCA9IChiYXllclswXSArIGJheWVyWzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyXSArCisgICAgICAgICAgICAgICAgICAgICAgYmF5ZXJbYmF5ZXJfc3RlcCoyKzJdICsgMikgPj4gMjsKKyAgICAgICAgICAgICAgICB0MSA9IChiYXllclsxXSArIGJheWVyW2JheWVyX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICBiYXllcltiYXllcl9zdGVwKzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyKzFdKzIpID4+IDI7CisgICAgICAgICAgICAgICAgZHN0WzFdID0gKHVjaGFyKXQwOworICAgICAgICAgICAgICAgIGRzdFswXSA9ICh1Y2hhcil0MTsKKyAgICAgICAgICAgICAgICBkc3RbLTFdID0gYmF5ZXJbYmF5ZXJfc3RlcCsxXTsKKworICAgICAgICAgICAgICAgIHQwID0gKGJheWVyWzJdICsgYmF5ZXJbYmF5ZXJfc3RlcCoyKzJdICsgMSkgPj4gMTsKKyAgICAgICAgICAgICAgICB0MSA9IChiYXllcltiYXllcl9zdGVwKzFdICsgYmF5ZXJbYmF5ZXJfc3RlcCszXSArIDEpID4+IDE7CisgICAgICAgICAgICAgICAgZHN0WzRdID0gKHVjaGFyKXQwOworICAgICAgICAgICAgICAgIGRzdFszXSA9IGJheWVyW2JheWVyX3N0ZXArMl07CisgICAgICAgICAgICAgICAgZHN0WzJdID0gKHVjaGFyKXQxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGJheWVyIDwgYmF5ZXJfZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAgPSAoYmF5ZXJbMF0gKyBiYXllclsyXSArIGJheWVyW2JheWVyX3N0ZXAqMl0gKworICAgICAgICAgICAgICAgICAgYmF5ZXJbYmF5ZXJfc3RlcCoyKzJdICsgMikgPj4gMjsKKyAgICAgICAgICAgIHQxID0gKGJheWVyWzFdICsgYmF5ZXJbYmF5ZXJfc3RlcF0gKworICAgICAgICAgICAgICAgICAgYmF5ZXJbYmF5ZXJfc3RlcCsyXSArIGJheWVyW2JheWVyX3N0ZXAqMisxXSsyKSA+PiAyOworICAgICAgICAgICAgZHN0Wy1ibHVlXSA9ICh1Y2hhcil0MDsKKyAgICAgICAgICAgIGRzdFswXSA9ICh1Y2hhcil0MTsKKyAgICAgICAgICAgIGRzdFtibHVlXSA9IGJheWVyW2JheWVyX3N0ZXArMV07CisgICAgICAgICAgICBiYXllcisrOworICAgICAgICAgICAgZHN0ICs9IDM7CisgICAgICAgIH0KKworICAgICAgICBibHVlID0gLWJsdWU7CisgICAgICAgIHN0YXJ0X3dpdGhfZ3JlZW4gPSAhc3RhcnRfd2l0aF9ncmVlbjsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWFpbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2Q3Z0Q29sb3IoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGludCBjb2RlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q3Z0Q29sb3IiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgc3JjX3N0ZXAsIGRzdF9zdGVwOworICAgIGludCBzcmNfY24sIGRzdF9jbiwgZGVwdGg7CisgICAgQ3ZDb2xvckN2dEZ1bmMwIGZ1bmMwID0gMDsKKyAgICBDdkNvbG9yQ3Z0RnVuYzEgZnVuYzEgPSAwOworICAgIEN2Q29sb3JDdnRGdW5jMiBmdW5jMiA9IDA7CisgICAgQ3ZDb2xvckN2dEZ1bmMzIGZ1bmMzID0gMDsKKyAgICBpbnQgcGFyYW1bXSA9IHsgMCwgMCwgMCwgMCB9OworICAgIAorICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzcmNzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3RhcnIsICZkc3RzdHViICkpOworICAgIAorICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoc3JjLT50eXBlKTsKKyAgICBpZiggZGVwdGggIT0gQ1ZfOFUgJiYgZGVwdGggIT0gQ1ZfMTZVICYmIGRlcHRoICE9IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIHNyY19jbiA9IENWX01BVF9DTiggc3JjLT50eXBlICk7CisgICAgZHN0X2NuID0gQ1ZfTUFUX0NOKCBkc3QtPnR5cGUgKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICBzcmNfc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVChzcmMtPnR5cGUgJiBkc3QtPnR5cGUpICYmCisgICAgICAgIGNvZGUgIT0gQ1ZfQmF5ZXJCRzJCR1IgJiYgY29kZSAhPSBDVl9CYXllckdCMkJHUiAmJgorICAgICAgICBjb2RlICE9IENWX0JheWVyUkcyQkdSICYmIGNvZGUgIT0gQ1ZfQmF5ZXJHUjJCR1IgKSAKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgc3JjX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICB9CisKKyAgICBzd2l0Y2goIGNvZGUgKQorICAgIHsKKyAgICBjYXNlIENWX0JHUjJCR1JBOgorICAgIGNhc2UgQ1ZfUkdCMkJHUkE6CisgICAgICAgIGlmKCBzcmNfY24gIT0gMyB8fCBkc3RfY24gIT0gNCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhpcyBjb252ZXJzaW9uIGNvZGUiICk7CisKKyAgICAgICAgZnVuYzEgPSBkZXB0aCA9PSBDVl84VSA/IChDdkNvbG9yQ3Z0RnVuYzEpaWN2QkdSMkJHUnhfOHVfQzNDNFIgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzE2VSA/IChDdkNvbG9yQ3Z0RnVuYzEpaWN2QkdSMkJHUnhfMTZ1X0MzQzRSIDoKKyAgICAgICAgICAgICAgICBkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZDb2xvckN2dEZ1bmMxKWljdkJHUjJCR1J4XzMyZl9DM0M0UiA6IDA7CisgICAgICAgIHBhcmFtWzBdID0gY29kZSA9PSBDVl9CR1IyQkdSQSA/IDAgOiAyOyAvLyBibHVlX2lkeAorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQkdSQTJCR1I6CisgICAgY2FzZSBDVl9SR0JBMkJHUjoKKyAgICBjYXNlIENWX1JHQjJCR1I6CisgICAgICAgIGlmKCAoc3JjX2NuICE9IDMgJiYgc3JjX2NuICE9IDQpIHx8IGRzdF9jbiAhPSAzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywKKyAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGNvbnZlcnNpb24gY29kZSIgKTsKKworICAgICAgICBmdW5jMiA9IGRlcHRoID09IENWXzhVID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkJHUl84dV9DbkMzUiA6CisgICAgICAgICAgICAgICAgZGVwdGggPT0gQ1ZfMTZVID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkJHUl8xNnVfQ25DM1IgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzMyRiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJCR1JfMzJmX0NuQzNSIDogMDsKKyAgICAgICAgcGFyYW1bMF0gPSBzcmNfY247CisgICAgICAgIHBhcmFtWzFdID0gY29kZSA9PSBDVl9CR1JBMkJHUiA/IDAgOiAyOyAvLyBibHVlX2lkeAorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQkdSQTJSR0JBOgorICAgICAgICBpZiggc3JjX2NuICE9IDQgfHwgZHN0X2NuICE9IDQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLAorICAgICAgICAgICAgIkluY29ycmVjdCBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoaXMgY29udmVyc2lvbiBjb2RlIiApOworCisgICAgICAgIGZ1bmMwID0gZGVwdGggPT0gQ1ZfOFUgPyAoQ3ZDb2xvckN2dEZ1bmMwKWljdkJHUkEyUkdCQV84dV9DNFIgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzE2VSA/IChDdkNvbG9yQ3Z0RnVuYzApaWN2QkdSQTJSR0JBXzE2dV9DNFIgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzMyRiA/IChDdkNvbG9yQ3Z0RnVuYzApaWN2QkdSQTJSR0JBXzMyZl9DNFIgOiAwOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQkdSMkJHUjU2NToKKyAgICBjYXNlIENWX0JHUjJCR1I1NTU6CisgICAgY2FzZSBDVl9SR0IyQkdSNTY1OgorICAgIGNhc2UgQ1ZfUkdCMkJHUjU1NToKKyAgICBjYXNlIENWX0JHUkEyQkdSNTY1OgorICAgIGNhc2UgQ1ZfQkdSQTJCR1I1NTU6CisgICAgY2FzZSBDVl9SR0JBMkJHUjU2NToKKyAgICBjYXNlIENWX1JHQkEyQkdSNTU1OgorICAgICAgICBpZiggKHNyY19jbiAhPSAzICYmIHNyY19jbiAhPSA0KSB8fCBkc3RfY24gIT0gMiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhpcyBjb252ZXJzaW9uIGNvZGUiICk7CisKKyAgICAgICAgaWYoIGRlcHRoICE9IENWXzhVICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwKKyAgICAgICAgICAgICJDb252ZXJzaW9uIHRvL2Zyb20gMTYtYml0IHBhY2tlZCBSR0IgZm9ybWF0ICIKKyAgICAgICAgICAgICJpcyBvbmx5IHBvc3NpYmxlIGZvciA4LWJpdCBpbWFnZXMgKDgtYml0IGdyYXlzY2FsZSwgODg4IEJHUi9SR0Igb3IgODg4OCBCR1JBL1JHQkEpIiApOworCisgICAgICAgIGZ1bmMzID0gKEN2Q29sb3JDdnRGdW5jMylpY3ZCR1J4MkJHUjV4NV84dV9DbkMyUjsKKyAgICAgICAgcGFyYW1bMF0gPSBzcmNfY247CisgICAgICAgIHBhcmFtWzFdID0gY29kZSA9PSBDVl9CR1IyQkdSNTY1IHx8IGNvZGUgPT0gQ1ZfQkdSMkJHUjU1NSB8fAorICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfQkdSQTJCR1I1NjUgfHwgY29kZSA9PSBDVl9CR1JBMkJHUjU1NSA/IDAgOiAyOyAvLyBibHVlX2lkeAorICAgICAgICBwYXJhbVsyXSA9IGNvZGUgPT0gQ1ZfQkdSMkJHUjU2NSB8fCBjb2RlID09IENWX1JHQjJCR1I1NjUgfHwKKyAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUkEyQkdSNTY1IHx8IGNvZGUgPT0gQ1ZfUkdCQTJCR1I1NjUgPyA2IDogNTsgLy8gZ3JlZW5fYml0cworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQkdSNTY1MkJHUjoKKyAgICBjYXNlIENWX0JHUjU1NTJCR1I6CisgICAgY2FzZSBDVl9CR1I1NjUyUkdCOgorICAgIGNhc2UgQ1ZfQkdSNTU1MlJHQjoKKyAgICBjYXNlIENWX0JHUjU2NTJCR1JBOgorICAgIGNhc2UgQ1ZfQkdSNTU1MkJHUkE6CisgICAgY2FzZSBDVl9CR1I1NjUyUkdCQToKKyAgICBjYXNlIENWX0JHUjU1NTJSR0JBOgorICAgICAgICBpZiggc3JjX2NuICE9IDIgfHwgKGRzdF9jbiAhPSAzICYmIGRzdF9jbiAhPSA0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywKKyAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGNvbnZlcnNpb24gY29kZSIgKTsKKworICAgICAgICBpZiggZGVwdGggIT0gQ1ZfOFUgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLAorICAgICAgICAgICAgIkNvbnZlcnNpb24gdG8vZnJvbSAxNi1iaXQgcGFja2VkIEJHUiBmb3JtYXQgIgorICAgICAgICAgICAgImlzIG9ubHkgcG9zc2libGUgZm9yIDgtYml0IGltYWdlcyAoOC1iaXQgZ3JheXNjYWxlLCA4ODggQkdSL0JHUiBvciA4ODg4IEJHUkEvQkdSQSkiICk7CisKKyAgICAgICAgZnVuYzMgPSAoQ3ZDb2xvckN2dEZ1bmMzKWljdkJHUjV4NTJCR1J4Xzh1X0MyQ25SOworICAgICAgICBwYXJhbVswXSA9IGRzdF9jbjsKKyAgICAgICAgcGFyYW1bMV0gPSBjb2RlID09IENWX0JHUjU2NTJCR1IgfHwgY29kZSA9PSBDVl9CR1I1NTUyQkdSIHx8CisgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9CR1I1NjUyQkdSQSB8fCBjb2RlID09IENWX0JHUjU1NTJCR1JBID8gMCA6IDI7IC8vIGJsdWVfaWR4CisgICAgICAgIHBhcmFtWzJdID0gY29kZSA9PSBDVl9CR1I1NjUyQkdSIHx8IGNvZGUgPT0gQ1ZfQkdSNTY1MlJHQiB8fAorICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfQkdSNTY1MkJHUkEgfHwgY29kZSA9PSBDVl9CR1I1NjUyUkdCQSA/IDYgOiA1OyAvLyBncmVlbl9iaXRzCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9CR1IyR1JBWToKKyAgICBjYXNlIENWX0JHUkEyR1JBWToKKyAgICBjYXNlIENWX1JHQjJHUkFZOgorICAgIGNhc2UgQ1ZfUkdCQTJHUkFZOgorICAgICAgICBpZiggKHNyY19jbiAhPSAzICYmIHNyY19jbiAhPSA0KSB8fCBkc3RfY24gIT0gMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhpcyBjb252ZXJzaW9uIGNvZGUiICk7CisKKyAgICAgICAgZnVuYzIgPSBkZXB0aCA9PSBDVl84VSA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJHcmF5Xzh1X0NuQzFSIDoKKyAgICAgICAgICAgICAgICBkZXB0aCA9PSBDVl8xNlUgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdkJHUngyR3JheV8xNnVfQ25DMVIgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzMyRiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJHcmF5XzMyZl9DbkMxUiA6IDA7CisgICAgICAgIAorICAgICAgICBwYXJhbVswXSA9IHNyY19jbjsKKyAgICAgICAgcGFyYW1bMV0gPSBjb2RlID09IENWX0JHUjJHUkFZIHx8IGNvZGUgPT0gQ1ZfQkdSQTJHUkFZID8gMCA6IDI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9CR1I1NjUyR1JBWToKKyAgICBjYXNlIENWX0JHUjU1NTJHUkFZOgorICAgICAgICBpZiggc3JjX2NuICE9IDIgfHwgZHN0X2NuICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLAorICAgICAgICAgICAgIkluY29ycmVjdCBudW1iZXIgb2YgY2hhbm5lbHMgZm9yIHRoaXMgY29udmVyc2lvbiBjb2RlIiApOworCisgICAgICAgIGlmKCBkZXB0aCAhPSBDVl84VSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsCisgICAgICAgICAgICAiQ29udmVyc2lvbiB0by9mcm9tIDE2LWJpdCBwYWNrZWQgQkdSIGZvcm1hdCAiCisgICAgICAgICAgICAiaXMgb25seSBwb3NzaWJsZSBmb3IgOC1iaXQgaW1hZ2VzICg4ODggQkdSL0JHUiBvciA4ODg4IEJHUkEvQkdSQSkiICk7CisKKyAgICAgICAgZnVuYzIgPSAoQ3ZDb2xvckN2dEZ1bmMyKWljdkJHUjV4NTJHcmF5Xzh1X0MyQzFSOworICAgICAgICAKKyAgICAgICAgcGFyYW1bMF0gPSBjb2RlID09IENWX0JHUjU2NTJHUkFZID8gNiA6IDU7IC8vIGdyZWVuX2JpdHMKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENWX0dSQVkyQkdSOgorICAgIGNhc2UgQ1ZfR1JBWTJCR1JBOgorICAgICAgICBpZiggc3JjX2NuICE9IDEgfHwgKGRzdF9jbiAhPSAzICYmIGRzdF9jbiAhPSA0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywKKyAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGNvbnZlcnNpb24gY29kZSIgKTsKKworICAgICAgICBmdW5jMSA9IGRlcHRoID09IENWXzhVID8gKEN2Q29sb3JDdnRGdW5jMSlpY3ZHcmF5MkJHUnhfOHVfQzFDblIgOgorICAgICAgICAgICAgICAgIGRlcHRoID09IENWXzE2VSA/IChDdkNvbG9yQ3Z0RnVuYzEpaWN2R3JheTJCR1J4XzE2dV9DMUNuUiA6CisgICAgICAgICAgICAgICAgZGVwdGggPT0gQ1ZfMzJGID8gKEN2Q29sb3JDdnRGdW5jMSlpY3ZHcmF5MkJHUnhfMzJmX0MxQ25SIDogMDsKKyAgICAgICAgCisgICAgICAgIHBhcmFtWzBdID0gZHN0X2NuOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfR1JBWTJCR1I1NjU6CisgICAgY2FzZSBDVl9HUkFZMkJHUjU1NToKKyAgICAgICAgaWYoIHNyY19jbiAhPSAxIHx8IGRzdF9jbiAhPSAyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywKKyAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGNvbnZlcnNpb24gY29kZSIgKTsKKworICAgICAgICBpZiggZGVwdGggIT0gQ1ZfOFUgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLAorICAgICAgICAgICAgIkNvbnZlcnNpb24gdG8vZnJvbSAxNi1iaXQgcGFja2VkIEJHUiBmb3JtYXQgIgorICAgICAgICAgICAgImlzIG9ubHkgcG9zc2libGUgZm9yIDgtYml0IGltYWdlcyAoODg4IEJHUi9CR1Igb3IgODg4OCBCR1JBL0JHUkEpIiApOworCisgICAgICAgIGZ1bmMyID0gKEN2Q29sb3JDdnRGdW5jMilpY3ZHcmF5MkJHUjV4NV84dV9DMUMyUjsKKyAgICAgICAgcGFyYW1bMF0gPSBjb2RlID09IENWX0dSQVkyQkdSNTY1ID8gNiA6IDU7IC8vIGdyZWVuX2JpdHMKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENWX0JHUjJZQ3JDYjoKKyAgICBjYXNlIENWX1JHQjJZQ3JDYjoKKyAgICBjYXNlIENWX0JHUjJYWVo6CisgICAgY2FzZSBDVl9SR0IyWFlaOgorICAgIGNhc2UgQ1ZfQkdSMkhTVjoKKyAgICBjYXNlIENWX1JHQjJIU1Y6CisgICAgY2FzZSBDVl9CR1IyTGFiOgorICAgIGNhc2UgQ1ZfUkdCMkxhYjoKKyAgICBjYXNlIENWX0JHUjJMdXY6CisgICAgY2FzZSBDVl9SR0IyTHV2OgorICAgIGNhc2UgQ1ZfQkdSMkhMUzoKKyAgICBjYXNlIENWX1JHQjJITFM6CisgICAgICAgIGlmKCAoc3JjX2NuICE9IDMgJiYgc3JjX2NuICE9IDQpIHx8IGRzdF9jbiAhPSAzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywKKyAgICAgICAgICAgICJJbmNvcnJlY3QgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGlzIGNvbnZlcnNpb24gY29kZSIgKTsKKworICAgICAgICBpZiggZGVwdGggPT0gQ1ZfOFUgKQorICAgICAgICAgICAgZnVuYzIgPSBjb2RlID09IENWX0JHUjJZQ3JDYiB8fCBjb2RlID09IENWX1JHQjJZQ3JDYiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJZQ3JDYl84dV9DbkMzUiA6CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfQkdSMlhZWiB8fCBjb2RlID09IENWX1JHQjJYWVogPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdkJHUngyWFlaXzh1X0NuQzNSIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9CR1IySFNWIHx8IGNvZGUgPT0gQ1ZfUkdCMkhTViA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJIU1ZfOHVfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJMYWIgfHwgY29kZSA9PSBDVl9SR0IyTGFiID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkxhYl84dV9DbkMzUiA6CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfQkdSMkx1diB8fCBjb2RlID09IENWX1JHQjJMdXYgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdkJHUngyTHV2Xzh1X0NuQzNSIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9CR1IySExTIHx8IGNvZGUgPT0gQ1ZfUkdCMkhMUyA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJITFNfOHVfQ25DM1IgOiAwOworICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8xNlUgKQorICAgICAgICAgICAgZnVuYzIgPSBjb2RlID09IENWX0JHUjJZQ3JDYiB8fCBjb2RlID09IENWX1JHQjJZQ3JDYiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJZQ3JDYl8xNnVfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJYWVogfHwgY29kZSA9PSBDVl9SR0IyWFlaID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MlhZWl8xNnVfQ25DM1IgOiAwOworICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgZnVuYzIgPSBjb2RlID09IENWX0JHUjJZQ3JDYiB8fCBjb2RlID09IENWX1JHQjJZQ3JDYiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2QkdSeDJZQ3JDYl8zMmZfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJYWVogfHwgY29kZSA9PSBDVl9SR0IyWFlaID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MlhZWl8zMmZfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJIU1YgfHwgY29kZSA9PSBDVl9SR0IySFNWID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkhTVl8zMmZfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJMYWIgfHwgY29kZSA9PSBDVl9SR0IyTGFiID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkxhYl8zMmZfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJMdXYgfHwgY29kZSA9PSBDVl9SR0IyTHV2ID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4Mkx1dl8zMmZfQ25DM1IgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0JHUjJITFMgfHwgY29kZSA9PSBDVl9SR0IySExTID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZCR1J4MkhMU18zMmZfQ25DM1IgOiAwOworICAgICAgICAKKyAgICAgICAgcGFyYW1bMF0gPSBzcmNfY247CisgICAgICAgIHBhcmFtWzFdID0gY29kZSA9PSBDVl9CR1IyWFlaIHx8IGNvZGUgPT0gQ1ZfQkdSMllDckNiIHx8IGNvZGUgPT0gQ1ZfQkdSMkhTViB8fAorICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfQkdSMkxhYiB8fCBjb2RlID09IENWX0JHUjJMdXYgfHwgY29kZSA9PSBDVl9CR1IySExTID8gMCA6IDI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9ZQ3JDYjJCR1I6CisgICAgY2FzZSBDVl9ZQ3JDYjJSR0I6CisgICAgY2FzZSBDVl9YWVoyQkdSOgorICAgIGNhc2UgQ1ZfWFlaMlJHQjoKKyAgICBjYXNlIENWX0hTVjJCR1I6CisgICAgY2FzZSBDVl9IU1YyUkdCOgorICAgIGNhc2UgQ1ZfTGFiMkJHUjoKKyAgICBjYXNlIENWX0xhYjJSR0I6CisgICAgY2FzZSBDVl9MdXYyQkdSOgorICAgIGNhc2UgQ1ZfTHV2MlJHQjoKKyAgICBjYXNlIENWX0hMUzJCR1I6CisgICAgY2FzZSBDVl9ITFMyUkdCOgorICAgICAgICBpZiggc3JjX2NuICE9IDMgfHwgKGRzdF9jbiAhPSAzICYmIGRzdF9jbiAhPSA0KSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhpcyBjb252ZXJzaW9uIGNvZGUiICk7CisKKyAgICAgICAgaWYoIGRlcHRoID09IENWXzhVICkKKyAgICAgICAgICAgIGZ1bmMyID0gY29kZSA9PSBDVl9ZQ3JDYjJCR1IgfHwgY29kZSA9PSBDVl9ZQ3JDYjJSR0IgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdllDckNiMkJHUnhfOHVfQzNDblIgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX1hZWjJCR1IgfHwgY29kZSA9PSBDVl9YWVoyUkdCID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZYWVoyQkdSeF84dV9DM0NuUiA6CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfSFNWMkJHUiB8fCBjb2RlID09IENWX0hTVjJSR0IgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdkhTVjJCR1J4Xzh1X0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9ITFMyQkdSIHx8IGNvZGUgPT0gQ1ZfSExTMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2SExTMkJHUnhfOHVfQzNDblIgOgorICAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0xhYjJCR1IgfHwgY29kZSA9PSBDVl9MYWIyUkdCID8gKEN2Q29sb3JDdnRGdW5jMilpY3ZMYWIyQkdSeF84dV9DM0NuUiA6CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPT0gQ1ZfTHV2MkJHUiB8fCBjb2RlID09IENWX0x1djJSR0IgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdkx1djJCR1J4Xzh1X0MzQ25SIDogMDsKKyAgICAgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMTZVICkKKyAgICAgICAgICAgIGZ1bmMyID0gY29kZSA9PSBDVl9ZQ3JDYjJCR1IgfHwgY29kZSA9PSBDVl9ZQ3JDYjJSR0IgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdllDckNiMkJHUnhfMTZ1X0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9YWVoyQkdSIHx8IGNvZGUgPT0gQ1ZfWFlaMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2WFlaMkJHUnhfMTZ1X0MzQ25SIDogMDsKKyAgICAgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgIGZ1bmMyID0gY29kZSA9PSBDVl9ZQ3JDYjJCR1IgfHwgY29kZSA9PSBDVl9ZQ3JDYjJSR0IgPyAoQ3ZDb2xvckN2dEZ1bmMyKWljdllDckNiMkJHUnhfMzJmX0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9YWVoyQkdSIHx8IGNvZGUgPT0gQ1ZfWFlaMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2WFlaMkJHUnhfMzJmX0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9IU1YyQkdSIHx8IGNvZGUgPT0gQ1ZfSFNWMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2SFNWMkJHUnhfMzJmX0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9ITFMyQkdSIHx8IGNvZGUgPT0gQ1ZfSExTMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2SExTMkJHUnhfMzJmX0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9MYWIyQkdSIHx8IGNvZGUgPT0gQ1ZfTGFiMlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2TGFiMkJHUnhfMzJmX0MzQ25SIDoKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9PSBDVl9MdXYyQkdSIHx8IGNvZGUgPT0gQ1ZfTHV2MlJHQiA/IChDdkNvbG9yQ3Z0RnVuYzIpaWN2THV2MkJHUnhfMzJmX0MzQ25SIDogMDsKKyAgICAgICAgCisgICAgICAgIHBhcmFtWzBdID0gZHN0X2NuOworICAgICAgICBwYXJhbVsxXSA9IGNvZGUgPT0gQ1ZfWFlaMkJHUiB8fCBjb2RlID09IENWX1lDckNiMkJHUiB8fCBjb2RlID09IENWX0hTVjJCR1IgfHwKKyAgICAgICAgICAgICAgICAgICBjb2RlID09IENWX0xhYjJCR1IgfHwgY29kZSA9PSBDVl9MdXYyQkdSIHx8IGNvZGUgPT0gQ1ZfSExTMkJHUiA/IDAgOiAyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQmF5ZXJCRzJCR1I6CisgICAgY2FzZSBDVl9CYXllckdCMkJHUjoKKyAgICBjYXNlIENWX0JheWVyUkcyQkdSOgorICAgIGNhc2UgQ1ZfQmF5ZXJHUjJCR1I6CisgICAgICAgIGlmKCBzcmNfY24gIT0gMSB8fCBkc3RfY24gIT0gMyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiSW5jb3JyZWN0IG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhpcyBjb252ZXJzaW9uIGNvZGUiICk7CisgICAgICAgIAorICAgICAgICBpZiggZGVwdGggIT0gQ1ZfOFUgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLAorICAgICAgICAgICAgIkJheWVyIHBhdHRlcm4gY2FuIGJlIGNvbnZlcnRlZCBvbmx5IHRvIDgtYml0IDMtY2hhbm5lbCBCR1IvUkdCIGltYWdlIiApOworCisgICAgICAgIGZ1bmMxID0gKEN2Q29sb3JDdnRGdW5jMSlpY3ZCYXllcjJCR1JfOHVfQzFDM1I7CisgICAgICAgIHBhcmFtWzBdID0gY29kZTsgLy8gY29udmVyc2lvbiBjb2RlCisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiVW5rbm93bi91bnN1cHBvcnRlZCBjb2xvciBjb252ZXJzaW9uIGNvZGUiICk7CisgICAgfQorCisgICAgaWYoIGZ1bmMwICkKKyAgICB7CisgICAgICAgIElQUElfQ0FMTCggZnVuYzAoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKyAgICB9CisgICAgZWxzZSBpZiggZnVuYzEgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jMSggc3JjLT5kYXRhLnB0ciwgc3JjX3N0ZXAsCisgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwgcGFyYW1bMF0gKSk7CisgICAgfQorICAgIGVsc2UgaWYoIGZ1bmMyICkKKyAgICB7CisgICAgICAgIElQUElfQ0FMTCggZnVuYzIoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLAorICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsIHNpemUsIHBhcmFtWzBdLCBwYXJhbVsxXSApKTsKKyAgICB9CisgICAgZWxzZSBpZiggZnVuYzMgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jMyggc3JjLT5kYXRhLnB0ciwgc3JjX3N0ZXAsCisgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwgcGFyYW1bMF0sIHBhcmFtWzFdLCBwYXJhbVsyXSApKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgaW1hZ2UgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKworCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zjb25kZW5zLmNwcCBiL2N2L3NyYy9jdmNvbmRlbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMGQyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zjb25kZW5zLmNwcApAQCAtMCwwICsxLDI4NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZDcmVhdGVDb25EZW5zYXRpb24KKy8vICAgIFB1cnBvc2U6IENyZWF0aW5nIEN2Q29uRGVuc2F0aW9uIHN0cnVjdHVyZSBhbmQgYWxsb2NhdGluZyBtZW1vcnkgZm9yIGl0CisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgS2FsbWFuICAgICAtIGRvdWJsZSBwb2ludGVyIHRvIEN2Q29uRGVuc2F0aW9uIHN0cnVjdHVyZQorLy8gICAgICBEUCAgICAgICAgIC0gZGltZW5zaW9uIG9mIHRoZSBkeW5hbWljYWwgdmVjdG9yCisvLyAgICAgIE1QICAgICAgICAgLSBkaW1lbnNpb24gb2YgdGhlIG1lYXN1cmVtZW50IHZlY3RvcgorLy8gICAgICBTYW1wbGVzTnVtIC0gbnVtYmVyIG9mIHNhbXBsZXMgaW4gc2FtcGxlIHNldCB1c2VkIGluIGFsZ29yaXRobSAKKy8vICAgIFJldHVybnM6CisvLyAgICBOb3RlczoKKy8vICAgICAgCisvL0YqLworCitDVl9JTVBMIEN2Q29uRGVuc2F0aW9uKiBjdkNyZWF0ZUNvbkRlbnNhdGlvbiggaW50IERQLCBpbnQgTVAsIGludCBTYW1wbGVzTnVtICkKK3sKKyAgICBpbnQgaTsKKyAgICBDdkNvbkRlbnNhdGlvbiAqQ0QgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUNvbkRlbnNhdGlvbiIgKTsKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgaWYoIERQIDwgMCB8fCBNUCA8IDAgfHwgU2FtcGxlc051bSA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKyAgICAKKyAgICAvKiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworICAgIENWX0NBTEwoIENEID0gKEN2Q29uRGVuc2F0aW9uICopIGN2QWxsb2MoIHNpemVvZiggQ3ZDb25EZW5zYXRpb24gKSkpOworICAgIC8qIHNldHRpbmcgc3RydWN0dXJlIHBhcmFtcyAqLworICAgIENELT5TYW1wbGVzTnVtID0gU2FtcGxlc051bTsKKyAgICBDRC0+RFAgPSBEUDsKKyAgICBDRC0+TVAgPSBNUDsKKyAgICAvKiBhbGxvY2F0aW5nIG1lbW9yeSBmb3Igc3RydWN0dXJlIGZpZWxkcyAqLworICAgIENWX0NBTEwoIENELT5mbFNhbXBsZXMgPSAoZmxvYXQgKiopIGN2QWxsb2MoIHNpemVvZiggZmxvYXQgKiApICogU2FtcGxlc051bSApKTsKKyAgICBDVl9DQUxMKCBDRC0+ZmxOZXdTYW1wbGVzID0gKGZsb2F0ICoqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICogKSAqIFNhbXBsZXNOdW0gKSk7CisgICAgQ1ZfQ0FMTCggQ0QtPmZsU2FtcGxlc1swXSA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBTYW1wbGVzTnVtICogRFAgKSk7CisgICAgQ1ZfQ0FMTCggQ0QtPmZsTmV3U2FtcGxlc1swXSA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBTYW1wbGVzTnVtICogRFAgKSk7CisKKyAgICAvKiBzZXR0aW5nIHBvaW50ZXJzIGluIHBvaW50ZXIncyBhcnJheXMgKi8KKyAgICBmb3IoIGkgPSAxOyBpIDwgU2FtcGxlc051bTsgaSsrICkKKyAgICB7CisgICAgICAgIENELT5mbFNhbXBsZXNbaV0gPSBDRC0+ZmxTYW1wbGVzW2kgLSAxXSArIERQOworICAgICAgICBDRC0+ZmxOZXdTYW1wbGVzW2ldID0gQ0QtPmZsTmV3U2FtcGxlc1tpIC0gMV0gKyBEUDsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBDRC0+U3RhdGUgPSAoZmxvYXQgKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCApICogRFAgKSk7CisgICAgQ1ZfQ0FMTCggQ0QtPkR5bmFtTWF0ciA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBEUCAqIERQICkpOworICAgIENWX0NBTEwoIENELT5mbENvbmZpZGVuY2UgPSAoZmxvYXQgKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCApICogU2FtcGxlc051bSApKTsKKyAgICBDVl9DQUxMKCBDRC0+ZmxDdW11bGF0aXZlID0gKGZsb2F0ICopIGN2QWxsb2MoIHNpemVvZiggZmxvYXQgKSAqIFNhbXBsZXNOdW0gKSk7CisKKyAgICBDVl9DQUxMKCBDRC0+UmFuZFMgPSAoQ3ZSYW5kU3RhdGUgKikgY3ZBbGxvYyggc2l6ZW9mKCBDdlJhbmRTdGF0ZSApICogRFAgKSk7CisgICAgQ1ZfQ0FMTCggQ0QtPlRlbXAgPSAoZmxvYXQgKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCApICogRFAgKSk7CisgICAgQ1ZfQ0FMTCggQ0QtPlJhbmRvbVNhbXBsZSA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBEUCApKTsKKworICAgIC8qIFJldHVybmluZyBjcmVhdGVkIHN0cnVjdHVyZSAqLworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gQ0Q7Cit9CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZSZWxlYXNlQ29uRGVuc2F0aW9uCisvLyAgICBQdXJwb3NlOiBSZWxlYXNlcyBDdkNvbkRlbnNhdGlvbiBzdHJ1Y3R1cmUgYW5kIGZyZWVzIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGl0CisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgS2FsbWFuICAgICAtIGRvdWJsZSBwb2ludGVyIHRvIEN2Q29uRGVuc2F0aW9uIHN0cnVjdHVyZQorLy8gICAgICBEUCAgICAgICAgIC0gZGltZW5zaW9uIG9mIHRoZSBkeW5hbWljYWwgdmVjdG9yCisvLyAgICAgIE1QICAgICAgICAgLSBkaW1lbnNpb24gb2YgdGhlIG1lYXN1cmVtZW50IHZlY3RvcgorLy8gICAgICBTYW1wbGVzTnVtIC0gbnVtYmVyIG9mIHNhbXBsZXMgaW4gc2FtcGxlIHNldCB1c2VkIGluIGFsZ29yaXRobSAKKy8vICAgIFJldHVybnM6CisvLyAgICBOb3RlczoKKy8vICAgICAgCisvL0YqLworQ1ZfSU1QTCB2b2lkCitjdlJlbGVhc2VDb25EZW5zYXRpb24oIEN2Q29uRGVuc2F0aW9uICoqIENvbkRlbnNhdGlvbiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VDb25EZW5zYXRpb24iICk7CisgICAgX19CRUdJTl9fOworICAgIAorICAgIEN2Q29uRGVuc2F0aW9uICpDRCA9ICpDb25EZW5zYXRpb247CisgICAgCisgICAgaWYoICFDb25EZW5zYXRpb24gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhQ0QgKQorICAgICAgICBFWElUOworCisgICAgLyogZnJlZWluZyB0aGUgbWVtb3J5ICovCisJY3ZGcmVlKCAmQ0QtPlN0YXRlICk7CisgICAgY3ZGcmVlKCAmQ0QtPkR5bmFtTWF0cik7CisgICAgY3ZGcmVlKCAmQ0QtPmZsQ29uZmlkZW5jZSApOworICAgIGN2RnJlZSggJkNELT5mbEN1bXVsYXRpdmUgKTsKKyAgICBjdkZyZWUoICZDRC0+ZmxTYW1wbGVzWzBdICk7CisgICAgY3ZGcmVlKCAmQ0QtPmZsTmV3U2FtcGxlc1swXSApOworICAgIGN2RnJlZSggJkNELT5mbFNhbXBsZXMgKTsKKyAgICBjdkZyZWUoICZDRC0+ZmxOZXdTYW1wbGVzICk7CisgICAgY3ZGcmVlKCAmQ0QtPlRlbXAgKTsKKyAgICBjdkZyZWUoICZDRC0+UmFuZFMgKTsKKyAgICBjdkZyZWUoICZDRC0+UmFuZG9tU2FtcGxlICk7CisgICAgLyogcmVsZWFzZSBzdHJ1Y3R1cmUgKi8KKyAgICBjdkZyZWUoIENvbkRlbnNhdGlvbiApOworICAgIAorICAgIF9fRU5EX187CisKK30KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICBjdkNvbkRlbnNVcGRhdGVCeVRpbWUKKy8vICAgIFB1cnBvc2U6IFBlcmZvcm1pbmcgVGltZSBVcGRhdGUgcm91dGluZSBmb3IgQ29uRGVuc2F0aW9uIGFsZ29yaXRobQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIEthbG1hbiAgICAgLSBwb2ludGVyIHRvIEN2Q29uRGVuc2F0aW9uIHN0cnVjdHVyZQorLy8gICAgUmV0dXJuczoKKy8vICAgIE5vdGVzOgorLy8gICAgICAKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2Q29uRGVuc1VwZGF0ZUJ5VGltZSggQ3ZDb25EZW5zYXRpb24gKiBDb25EZW5zICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBTdW0gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbkRlbnNVcGRhdGVCeVRpbWUiICk7CisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCAhQ29uRGVucyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgLyogU2V0cyBUZW1wIHRvIFplcm8gKi8KKyAgICBpY3ZTZXRaZXJvXzMyZiggQ29uRGVucy0+VGVtcCwgQ29uRGVucy0+RFAsIDEgKTsKKworICAgIC8qIENhbGN1bGF0aW5nIHRoZSBNZWFuICovCisgICAgZm9yKCBpID0gMDsgaSA8IENvbkRlbnMtPlNhbXBsZXNOdW07IGkrKyApCisgICAgeworICAgICAgICBpY3ZTY2FsZVZlY3Rvcl8zMmYoIENvbkRlbnMtPmZsU2FtcGxlc1tpXSwgQ29uRGVucy0+U3RhdGUsIENvbkRlbnMtPkRQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25EZW5zLT5mbENvbmZpZGVuY2VbaV0gKTsKKyAgICAgICAgaWN2QWRkVmVjdG9yXzMyZiggQ29uRGVucy0+VGVtcCwgQ29uRGVucy0+U3RhdGUsIENvbkRlbnMtPlRlbXAsIENvbkRlbnMtPkRQICk7CisgICAgICAgIFN1bSArPSBDb25EZW5zLT5mbENvbmZpZGVuY2VbaV07CisgICAgICAgIENvbkRlbnMtPmZsQ3VtdWxhdGl2ZVtpXSA9IFN1bTsKKyAgICB9CisKKyAgICAvKiBUYWtpbmcgdGhlIG5ldyB2ZWN0b3IgZnJvbSB0cmFuc2Zvcm1hdGlvbiBvZiBtZWFuIGJ5IGR5bmFtaWNzIG1hdHJpeCAqLworCisgICAgaWN2U2NhbGVWZWN0b3JfMzJmKCBDb25EZW5zLT5UZW1wLCBDb25EZW5zLT5UZW1wLCBDb25EZW5zLT5EUCwgMS5mIC8gU3VtICk7CisgICAgaWN2VHJhbnNmb3JtVmVjdG9yXzMyZiggQ29uRGVucy0+RHluYW1NYXRyLCBDb25EZW5zLT5UZW1wLCBDb25EZW5zLT5TdGF0ZSwgQ29uRGVucy0+RFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbkRlbnMtPkRQICk7CisgICAgU3VtID0gU3VtIC8gQ29uRGVucy0+U2FtcGxlc051bTsKKworICAgIC8qIFVwZGF0aW5nIHRoZSBzZXQgb2YgcmFuZG9tIHNhbXBsZXMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgQ29uRGVucy0+U2FtcGxlc051bTsgaSsrICkKKyAgICB7CisgICAgICAgIGogPSAwOworICAgICAgICB3aGlsZSggKENvbkRlbnMtPmZsQ3VtdWxhdGl2ZVtqXSA8PSAoZmxvYXQpIGkgKiBTdW0pJiYoajxDb25EZW5zLT5TYW1wbGVzTnVtLTEpKQorICAgICAgICB7CisgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICAgICAgaWN2Q29weVZlY3Rvcl8zMmYoIENvbkRlbnMtPmZsU2FtcGxlc1tqXSwgQ29uRGVucy0+RFAsIENvbkRlbnMtPmZsTmV3U2FtcGxlc1tpXSApOworICAgIH0KKworICAgIC8qIEFkZGluZyB0aGUgcmFuZG9tLWdlbmVyYXRlZCB2ZWN0b3IgdG8gZXZlcnkgdmVjdG9yIGluIHNhbXBsZSBzZXQgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgQ29uRGVucy0+U2FtcGxlc051bTsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBDb25EZW5zLT5EUDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZiUmFuZCggQ29uRGVucy0+UmFuZFMgKyBqLCBDb25EZW5zLT5SYW5kb21TYW1wbGUgKyBqLCAxICk7CisgICAgICAgIH0KKworICAgICAgICBpY3ZUcmFuc2Zvcm1WZWN0b3JfMzJmKCBDb25EZW5zLT5EeW5hbU1hdHIsIENvbkRlbnMtPmZsTmV3U2FtcGxlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbkRlbnMtPmZsU2FtcGxlc1tpXSwgQ29uRGVucy0+RFAsIENvbkRlbnMtPkRQICk7CisgICAgICAgIGljdkFkZFZlY3Rvcl8zMmYoIENvbkRlbnMtPmZsU2FtcGxlc1tpXSwgQ29uRGVucy0+UmFuZG9tU2FtcGxlLCBDb25EZW5zLT5mbFNhbXBsZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25EZW5zLT5EUCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZDb25EZW5zSW5pdFNhbXBsU2V0CisvLyAgICBQdXJwb3NlOiBQZXJmb3JtaW5nIFRpbWUgVXBkYXRlIHJvdXRpbmUgZm9yIENvbkRlbnNhdGlvbiBhbGdvcml0aG0KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgY29uRGVucyAgICAgLSBwb2ludGVyIHRvIEN2Q29uRGVuc2F0aW9uIHN0cnVjdHVyZQorLy8gICAgbG93ZXJCb3VuZCAgLSB2ZWN0b3Igb2YgbG93ZXIgYm91bmRzIHVzZWQgdG8gcmFuZG9tIHVwZGF0ZSBvZiBzYW1wbGUgc2V0CisvLyAgICBsb3dlckJvdW5kICAtIHZlY3RvciBvZiB1cHBlciBib3VuZHMgdXNlZCB0byByYW5kb20gdXBkYXRlIG9mIHNhbXBsZSBzZXQKKy8vICAgIFJldHVybnM6CisvLyAgICBOb3RlczoKKy8vICAgICAgCisvL0YqLworCitDVl9JTVBMIHZvaWQKK2N2Q29uRGVuc0luaXRTYW1wbGVTZXQoIEN2Q29uRGVuc2F0aW9uICogY29uRGVucywgQ3ZNYXQgKiBsb3dlckJvdW5kLCBDdk1hdCAqIHVwcGVyQm91bmQgKQoreworICAgIGludCBpLCBqOworICAgIGZsb2F0ICpMQm91bmQ7CisgICAgZmxvYXQgKlVCb3VuZDsKKyAgICBmbG9hdCBQcm9iID0gMS5mIC8gY29uRGVucy0+U2FtcGxlc051bTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb25EZW5zSW5pdFNhbXBsZVNldCIgKTsKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgaWYoICFjb25EZW5zIHx8ICFsb3dlckJvdW5kIHx8ICF1cHBlckJvdW5kICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUobG93ZXJCb3VuZC0+dHlwZSkgIT0gQ1ZfMzJGQzEgfHwKKyAgICAgICAgIUNWX0FSRV9UWVBFU19FUShsb3dlckJvdW5kLHVwcGVyQm91bmQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInNvdXJjZSAgaGFzIG5vdCBhcHByb3ByaWF0ZSBmb3JtYXQiICk7CisKKyAgICBpZiggKGxvd2VyQm91bmQtPmNvbHMgIT0gMSkgfHwgKHVwcGVyQm91bmQtPmNvbHMgIT0gMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAic291cmNlICBoYXMgbm90IGFwcHJvcHJpYXRlIHNpemUiICk7CisKKyAgICBpZiggKGxvd2VyQm91bmQtPnJvd3MgIT0gY29uRGVucy0+RFApIHx8ICh1cHBlckJvdW5kLT5yb3dzICE9IGNvbkRlbnMtPkRQKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJzb3VyY2UgIGhhcyBub3QgYXBwcm9wcmlhdGUgc2l6ZSIgKTsKKworICAgIExCb3VuZCA9IGxvd2VyQm91bmQtPmRhdGEuZmw7CisgICAgVUJvdW5kID0gdXBwZXJCb3VuZC0+ZGF0YS5mbDsKKyAgICAvKiBJbml0aWFsaXppbmcgdGhlIHN0cnVjdHVyZXMgdG8gY3JlYXRlIGluaXRpYWwgU2FtcGxlIHNldCAqLworICAgIGZvciggaSA9IDA7IGkgPCBjb25EZW5zLT5EUDsgaSsrICkKKyAgICB7CisgICAgICAgIGN2UmFuZEluaXQoICYoY29uRGVucy0+UmFuZFNbaV0pLAorICAgICAgICAgICAgICAgICAgICBMQm91bmRbaV0sCisgICAgICAgICAgICAgICAgICAgIFVCb3VuZFtpXSwKKyAgICAgICAgICAgICAgICAgICAgaSApOworICAgIH0KKyAgICAvKiBHZW5lcmF0aW5nIHRoZSBzYW1wbGVzICovCisgICAgZm9yKCBqID0gMDsgaiA8IGNvbkRlbnMtPlNhbXBsZXNOdW07IGorKyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY29uRGVucy0+RFA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2YlJhbmQoIGNvbkRlbnMtPlJhbmRTICsgaSwgY29uRGVucy0+ZmxTYW1wbGVzW2pdICsgaSwgMSApOworICAgICAgICB9CisgICAgICAgIGNvbkRlbnMtPmZsQ29uZmlkZW5jZVtqXSA9IFByb2I7CisgICAgfQorICAgIC8qIFJlaW5pdGlhbGl6ZXMgdGhlIHN0cnVjdHVyZXMgdG8gdXBkYXRlIHNhbXBsZXMgcmFuZG9tbHkgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgY29uRGVucy0+RFA7IGkrKyApCisgICAgeworICAgICAgICBjdlJhbmRJbml0KCAmKGNvbkRlbnMtPlJhbmRTW2ldKSwKKyAgICAgICAgICAgICAgICAgICAgKExCb3VuZFtpXSAtIFVCb3VuZFtpXSkgLyA1LAorICAgICAgICAgICAgICAgICAgICAoVUJvdW5kW2ldIC0gTEJvdW5kW2ldKSAvIDUsCisgICAgICAgICAgICAgICAgICAgIGkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zjb250b3Vycy5jcHAgYi9jdi9zcmMvY3Zjb250b3Vycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM2NTJiOQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmNvbnRvdXJzLmNwcApAQCAtMCwwICsxLDE1NTcgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisvKiBpbml0aWFsaXplcyA4LWVsZW1lbnQgYXJyYXkgZm9yIGZhc3QgYWNjZXNzIHRvIDN4MyBuZWlnaGJvcmhvb2Qgb2YgYSBwaXhlbCAqLworI2RlZmluZSAgQ1ZfSU5JVF8zWDNfREVMVEFTKCBkZWx0YXMsIHN0ZXAsIG5jaCApICAgICAgICAgICAgXAorICAgICgoZGVsdGFzKVswXSA9ICAobmNoKSwgIChkZWx0YXMpWzFdID0gLShzdGVwKSArIChuY2gpLCAgXAorICAgICAoZGVsdGFzKVsyXSA9IC0oc3RlcCksIChkZWx0YXMpWzNdID0gLShzdGVwKSAtIChuY2gpLCAgXAorICAgICAoZGVsdGFzKVs0XSA9IC0obmNoKSwgIChkZWx0YXMpWzVdID0gIChzdGVwKSAtIChuY2gpLCAgXAorICAgICAoZGVsdGFzKVs2XSA9ICAoc3RlcCksIChkZWx0YXMpWzddID0gIChzdGVwKSArIChuY2gpKQorCitzdGF0aWMgY29uc3QgQ3ZQb2ludCBpY3ZDb2RlRGVsdGFzWzhdID0KKyAgICB7IHsxLCAwfSwgezEsIC0xfSwgezAsIC0xfSwgey0xLCAtMX0sIHstMSwgMH0sIHstMSwgMX0sIHswLCAxfSwgezEsIDF9IH07CisKK0NWX0lNUEwgdm9pZAorY3ZTdGFydFJlYWRDaGFpblBvaW50cyggQ3ZDaGFpbiAqIGNoYWluLCBDdkNoYWluUHRSZWFkZXIgKiByZWFkZXIgKQoreworICAgIGludCBpOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlN0YXJ0UmVhZENoYWluUG9pbnRzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFjaGFpbiB8fCAhcmVhZGVyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggY2hhaW4tPmVsZW1fc2l6ZSAhPSAxIHx8IGNoYWluLT5oZWFkZXJfc2l6ZSA8IChpbnQpc2l6ZW9mKEN2Q2hhaW4pKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFEU0laRV9FUlIgKTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCAoQ3ZTZXEgKikgY2hhaW4sIChDdlNlcVJlYWRlciAqKSByZWFkZXIsIDAgKTsKKyAgICBDVl9DSEVDSygpOworCisgICAgcmVhZGVyLT5wdCA9IGNoYWluLT5vcmlnaW47CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICB7CisgICAgICAgIHJlYWRlci0+ZGVsdGFzW2ldWzBdID0gKHNjaGFyKSBpY3ZDb2RlRGVsdGFzW2ldLng7CisgICAgICAgIHJlYWRlci0+ZGVsdGFzW2ldWzFdID0gKHNjaGFyKSBpY3ZDb2RlRGVsdGFzW2ldLnk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKiByZXRyaWV2ZXMgbmV4dCBwb2ludCBvZiB0aGUgY2hhaW4gY3VydmUgYW5kIHVwZGF0ZXMgcmVhZGVyICovCitDVl9JTVBMIEN2UG9pbnQKK2N2UmVhZENoYWluUG9pbnQoIEN2Q2hhaW5QdFJlYWRlciAqIHJlYWRlciApCit7CisgICAgc2NoYXIgKnB0cjsKKyAgICBpbnQgY29kZTsKKyAgICBDdlBvaW50IHB0ID0geyAwLCAwIH07CisKKyAgICBDVl9GVU5DTkFNRSggImN2UmVhZENoYWluUG9pbnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXJlYWRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgcHQgPSByZWFkZXItPnB0OworCisgICAgcHRyID0gcmVhZGVyLT5wdHI7CisgICAgaWYoIHB0ciApCisgICAgeworICAgICAgICBjb2RlID0gKnB0cisrOworCisgICAgICAgIGlmKCBwdHIgPj0gcmVhZGVyLT5ibG9ja19tYXggKQorICAgICAgICB7CisgICAgICAgICAgICBjdkNoYW5nZVNlcUJsb2NrKCAoQ3ZTZXFSZWFkZXIgKikgcmVhZGVyLCAxICk7CisgICAgICAgICAgICBwdHIgPSByZWFkZXItPnB0cjsKKyAgICAgICAgfQorCisgICAgICAgIHJlYWRlci0+cHRyID0gcHRyOworICAgICAgICByZWFkZXItPmNvZGUgPSAoc2NoYXIpY29kZTsKKyAgICAgICAgYXNzZXJ0KCAoY29kZSAmIH43KSA9PSAwICk7CisgICAgICAgIHJlYWRlci0+cHQueCA9IHB0LnggKyBpY3ZDb2RlRGVsdGFzW2NvZGVdLng7CisgICAgICAgIHJlYWRlci0+cHQueSA9IHB0LnkgKyBpY3ZDb2RlRGVsdGFzW2NvZGVdLnk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgUmFzdGVyLT5DaGFpbiBUcmVlIChTdXp1a2kgYWxnb3JpdGhtcykgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IF9DdkNvbnRvdXJJbmZvCit7CisgICAgaW50IGZsYWdzOworICAgIHN0cnVjdCBfQ3ZDb250b3VySW5mbyAqbmV4dDsgICAgICAgIC8qIG5leHQgY29udG91ciB3aXRoIHRoZSBzYW1lIG1hcmsgdmFsdWUgKi8KKyAgICBzdHJ1Y3QgX0N2Q29udG91ckluZm8gKnBhcmVudDsgICAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCBwYXJlbnQgY29udG91ciAqLworICAgIEN2U2VxICpjb250b3VyOyAgICAgICAgICAgICAvKiBjb3JyZXNwb25kaW5nIGNvbnRvdXIgKG1heSBiZSAwLCBpZiByZWplY3RlZCkgKi8KKyAgICBDdlJlY3QgcmVjdDsgICAgICAgICAgICAgICAgLyogYm91bmRpbmcgcmVjdGFuZ2xlICovCisgICAgQ3ZQb2ludCBvcmlnaW47ICAgICAgICAgICAgIC8qIG9yaWdpbiBwb2ludCAod2hlcmUgdGhlIGNvbnRvdXIgd2FzIHRyYWNlZCBmcm9tKSAqLworICAgIGludCBpc19ob2xlOyAgICAgICAgICAgICAgICAvKiBob2xlIGZsYWcgKi8KK30KK19DdkNvbnRvdXJJbmZvOworCisKKy8qCisgIFN0cnVjdHVyZSB0aGF0IGlzIHVzZWQgZm9yIHNlcXVlbnRhbCByZXRyaWV2aW5nIGNvbnRvdXJzIGZyb20gdGhlIGltYWdlLgorICBJdCBzdXBwb3J0cyBib3RoIGhpZXJhcmNoaWNhbCBhbmQgcGxhbmUgdmFyaWFudHMgb2YgU3V6dWtpIGFsZ29yaXRobS4KKyovCit0eXBlZGVmIHN0cnVjdCBfQ3ZDb250b3VyU2Nhbm5lcgoreworICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZTE7ICAgICAvKiBjb250YWlucyBmZXRjaGVkIGNvbnRvdXJzICovCisgICAgQ3ZNZW1TdG9yYWdlICpzdG9yYWdlMjsgICAgIC8qIGNvbnRhaW5zIGFwcHJveGltYXRlZCBjb250b3VycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIT1zdG9yYWdlMSBpZiBhcHByb3hfbWV0aG9kMiAhPSBhcHByb3hfbWV0aG9kMSkgKi8KKyAgICBDdk1lbVN0b3JhZ2UgKmNpbmZvX3N0b3JhZ2U7ICAgICAgICAvKiBjb250YWlucyBfQ3ZDb250b3VySW5mbyBub2RlcyAqLworICAgIEN2U2V0ICpjaW5mb19zZXQ7ICAgICAgICAgICAvKiBzZXQgb2YgX0N2Q29udG91ckluZm8gbm9kZXMgKi8KKyAgICBDdk1lbVN0b3JhZ2VQb3MgaW5pdGlhbF9wb3M7ICAgICAgICAvKiBzdGFydGluZyBzdG9yYWdlIHBvcyAqLworICAgIEN2TWVtU3RvcmFnZVBvcyBiYWNrdXBfcG9zOyAvKiBiZWdpbm5pbmcgb2YgdGhlIGxhdGVzdCBhcHByb3guIGNvbnRvdXIgKi8KKyAgICBDdk1lbVN0b3JhZ2VQb3MgYmFja3VwX3BvczI7ICAgICAgICAvKiBlbmRpbmcgb2YgdGhlIGxhdGVzdCBhcHByb3guIGNvbnRvdXIgKi8KKyAgICBzY2hhciAqaW1nMDsgICAgICAgICAgICAgICAgLyogaW1hZ2Ugb3JpZ2luICovCisgICAgc2NoYXIgKmltZzsgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW1hZ2Ugcm93ICovCisgICAgaW50IGltZ19zdGVwOyAgICAgICAgICAgICAgIC8qIGltYWdlIHN0ZXAgKi8KKyAgICBDdlNpemUgaW1nX3NpemU7ICAgICAgICAgICAgLyogUk9JIHNpemUgKi8KKyAgICBDdlBvaW50IG9mZnNldDsgICAgICAgICAgICAgLyogUk9JIG9mZnNldDogY29vcmRpbmF0ZXMsIGFkZGVkIHRvIGVhY2ggY29udG91ciBwb2ludCAqLworICAgIEN2UG9pbnQgcHQ7ICAgICAgICAgICAgICAgICAvKiBjdXJyZW50IHNjYW5uZXIgcG9zaXRpb24gKi8KKyAgICBDdlBvaW50IGxuYmQ7ICAgICAgICAgICAgICAgLyogcG9zaXRpb24gb2YgdGhlIGxhc3QgbWV0IGNvbnRvdXIgKi8KKyAgICBpbnQgbmJkOyAgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBtYXJrIHZhbCAqLworICAgIF9DdkNvbnRvdXJJbmZvICpsX2NpbmZvOyAgICAvKiBpbmZvcm1hdGlvbiBhYm91dCBsYXRlc3QgYXBwcm94LiBjb250b3VyICovCisgICAgX0N2Q29udG91ckluZm8gY2luZm9fdGVtcDsgIC8qIHRlbXBvcmFyeSB2YXIgd2hpY2ggaXMgdXNlZCBpbiBzaW1wbGUgbW9kZXMgKi8KKyAgICBfQ3ZDb250b3VySW5mbyBmcmFtZV9pbmZvOyAgLyogaW5mb3JtYXRpb24gYWJvdXQgZnJhbWUgKi8KKyAgICBDdlNlcSBmcmFtZTsgICAgICAgICAgICAgICAgLyogZnJhbWUgaXRzZWxmICovCisgICAgaW50IGFwcHJveF9tZXRob2QxOyAgICAgICAgIC8qIGFwcHJveCBtZXRob2Qgd2hlbiB0cmFjaW5nICovCisgICAgaW50IGFwcHJveF9tZXRob2QyOyAgICAgICAgIC8qIGZpbmFsIGFwcHJveCBtZXRob2QgKi8KKyAgICBpbnQgbW9kZTsgICAgICAgICAgICAgICAgICAgLyogY29udG91ciBzY2FubmluZyBtb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gZXh0ZXJuYWwgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC0gYWxsIHRoZSBjb250b3VycyB3L28gYW55IGhpZXJhcmNoeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gY29ubmVjdGVkIGNvbXBvbmVudHMgKGkuZS4gdHdvLWxldmVsIHN0cnVjdHVyZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbnRvdXJzIGFuZCBob2xlcykgKi8KKyAgICBpbnQgc3Vic3RfZmxhZzsKKyAgICBpbnQgc2VxX3R5cGUxOyAgICAgICAgICAgICAgLyogdHlwZSBvZiBmZXRjaGVkIGNvbnRvdXJzICovCisgICAgaW50IGhlYWRlcl9zaXplMTsgICAgICAgICAgIC8qIGhkciBzaXplIG9mIGZldGNoZWQgY29udG91cnMgKi8KKyAgICBpbnQgZWxlbV9zaXplMTsgICAgICAgICAgICAgLyogZWxlbSBzaXplIG9mIGZldGNoZWQgY29udG91cnMgKi8KKyAgICBpbnQgc2VxX3R5cGUyOyAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBoZWFkZXJfc2l6ZTI7ICAgICAgICAgICAvKiAgICAgICAgdGhlIHNhbWUgZm9yIGFwcHJveC4gY29udG91cnMgICovCisgICAgaW50IGVsZW1fc2l6ZTI7ICAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBfQ3ZDb250b3VySW5mbyAqY2luZm9fdGFibGVbMTI2XTsKK30KK19DdkNvbnRvdXJTY2FubmVyOworCisjZGVmaW5lIF9DVl9GSU5EX0NPTlRPVVJTX0ZMQUdTX0VYVEVSTkFMX09OTFkgICAgMQorI2RlZmluZSBfQ1ZfRklORF9DT05UT1VSU19GTEFHU19ISUVSQVJDSElDICAgICAgIDIKKworLyoKKyAgIEluaXRpYWxpemVzIHNjYW5uZXIgc3RydWN0dXJlLgorICAgUHJlcGFyZSBpbWFnZSBmb3Igc2Nhbm5pbmcgKCBjbGVhciBib3JkZXJzIGFuZCBjb252ZXJ0IGFsbCBwaXhlbHMgdG8gMC0xLgorKi8KK0NWX0lNUEwgQ3ZDb250b3VyU2Nhbm5lcgorY3ZTdGFydEZpbmRDb250b3Vycyggdm9pZCogX2ltZywgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgaW50ICBoZWFkZXJfc2l6ZSwgaW50IG1vZGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgIG1ldGhvZCwgQ3ZQb2ludCBvZmZzZXQgKQoreworICAgIGludCB5OworICAgIGludCBzdGVwOworICAgIEN2U2l6ZSBzaXplOworICAgIHVjaGFyICppbWcgPSAwOworICAgIEN2Q29udG91clNjYW5uZXIgc2Nhbm5lciA9IDA7CisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopX2ltZzsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdGFydEZpbmRDb250b3VycyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXQgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiW1N0YXJ0XUZpbmRDb250b3VycyBzdXBwb3J0IG9ubHkgOHVDMSBpbWFnZXMiICk7CisKKyAgICBzaXplID0gY3ZTaXplKCBtYXQtPndpZHRoLCBtYXQtPmhlaWdodCApOworICAgIHN0ZXAgPSBtYXQtPnN0ZXA7CisgICAgaW1nID0gKHVjaGFyKikobWF0LT5kYXRhLnB0cik7CisKKyAgICBpZiggbWV0aG9kIDwgMCB8fCBtZXRob2QgPiBDVl9DSEFJTl9BUFBST1hfVEM4OV9LQ09TICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBRFJBTkdFX0VSUiApOworCisgICAgaWYoIGhlYWRlcl9zaXplIDwgKGludCkgKG1ldGhvZCA9PSBDVl9DSEFJTl9DT0RFID8gc2l6ZW9mKCBDdkNoYWluICkgOiBzaXplb2YoIEN2Q29udG91ciApKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBRFNJWkVfRVJSICk7CisKKyAgICBzY2FubmVyID0gKEN2Q29udG91clNjYW5uZXIpY3ZBbGxvYyggc2l6ZW9mKCAqc2Nhbm5lciApKTsKKyAgICBpZiggIXNjYW5uZXIgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfT1VUT0ZNRU1fRVJSICk7CisKKyAgICBtZW1zZXQoIHNjYW5uZXIsIDAsIHNpemVvZiggKnNjYW5uZXIgKSk7CisKKyAgICBzY2FubmVyLT5zdG9yYWdlMSA9IHNjYW5uZXItPnN0b3JhZ2UyID0gc3RvcmFnZTsKKyAgICBzY2FubmVyLT5pbWcwID0gKHNjaGFyICopIGltZzsKKyAgICBzY2FubmVyLT5pbWcgPSAoc2NoYXIgKikgKGltZyArIHN0ZXApOworICAgIHNjYW5uZXItPmltZ19zdGVwID0gc3RlcDsKKyAgICBzY2FubmVyLT5pbWdfc2l6ZS53aWR0aCA9IHNpemUud2lkdGggLSAxOyAgIC8qIGV4Y2x1ZGUgcmlnaHRlc3QgY29sdW1uICovCisgICAgc2Nhbm5lci0+aW1nX3NpemUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSAxOyAvKiBleGNsdWRlIGJvdHRvbW9zdCByb3cgKi8KKyAgICBzY2FubmVyLT5tb2RlID0gbW9kZTsKKyAgICBzY2FubmVyLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc2Nhbm5lci0+cHQueCA9IHNjYW5uZXItPnB0LnkgPSAxOworICAgIHNjYW5uZXItPmxuYmQueCA9IDA7CisgICAgc2Nhbm5lci0+bG5iZC55ID0gMTsKKyAgICBzY2FubmVyLT5uYmQgPSAyOworICAgIHNjYW5uZXItPm1vZGUgPSAoaW50KSBtb2RlOworICAgIHNjYW5uZXItPmZyYW1lX2luZm8uY29udG91ciA9ICYoc2Nhbm5lci0+ZnJhbWUpOworICAgIHNjYW5uZXItPmZyYW1lX2luZm8uaXNfaG9sZSA9IDE7CisgICAgc2Nhbm5lci0+ZnJhbWVfaW5mby5uZXh0ID0gMDsKKyAgICBzY2FubmVyLT5mcmFtZV9pbmZvLnBhcmVudCA9IDA7CisgICAgc2Nhbm5lci0+ZnJhbWVfaW5mby5yZWN0ID0gY3ZSZWN0KCAwLCAwLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApOworICAgIHNjYW5uZXItPmxfY2luZm8gPSAwOworICAgIHNjYW5uZXItPnN1YnN0X2ZsYWcgPSAwOworCisgICAgc2Nhbm5lci0+ZnJhbWUuZmxhZ3MgPSBDVl9TRVFfRkxBR19IT0xFOworCisgICAgc2Nhbm5lci0+YXBwcm94X21ldGhvZDIgPSBzY2FubmVyLT5hcHByb3hfbWV0aG9kMSA9IG1ldGhvZDsKKworICAgIGlmKCBtZXRob2QgPT0gQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfTDEgfHwgbWV0aG9kID09IENWX0NIQUlOX0FQUFJPWF9UQzg5X0tDT1MgKQorICAgICAgICBzY2FubmVyLT5hcHByb3hfbWV0aG9kMSA9IENWX0NIQUlOX0NPREU7CisKKyAgICBpZiggc2Nhbm5lci0+YXBwcm94X21ldGhvZDEgPT0gQ1ZfQ0hBSU5fQ09ERSApCisgICAgeworICAgICAgICBzY2FubmVyLT5zZXFfdHlwZTEgPSBDVl9TRVFfQ0hBSU5fQ09OVE9VUjsKKyAgICAgICAgc2Nhbm5lci0+aGVhZGVyX3NpemUxID0gc2Nhbm5lci0+YXBwcm94X21ldGhvZDEgPT0gc2Nhbm5lci0+YXBwcm94X21ldGhvZDIgPworICAgICAgICAgICAgaGVhZGVyX3NpemUgOiBzaXplb2YoIEN2Q2hhaW4gKTsKKyAgICAgICAgc2Nhbm5lci0+ZWxlbV9zaXplMSA9IHNpemVvZiggY2hhciApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzY2FubmVyLT5zZXFfdHlwZTEgPSBDVl9TRVFfUE9MWUdPTjsKKyAgICAgICAgc2Nhbm5lci0+aGVhZGVyX3NpemUxID0gc2Nhbm5lci0+YXBwcm94X21ldGhvZDEgPT0gc2Nhbm5lci0+YXBwcm94X21ldGhvZDIgPworICAgICAgICAgICAgaGVhZGVyX3NpemUgOiBzaXplb2YoIEN2Q29udG91ciApOworICAgICAgICBzY2FubmVyLT5lbGVtX3NpemUxID0gc2l6ZW9mKCBDdlBvaW50ICk7CisgICAgfQorCisgICAgc2Nhbm5lci0+aGVhZGVyX3NpemUyID0gaGVhZGVyX3NpemU7CisKKyAgICBpZiggc2Nhbm5lci0+YXBwcm94X21ldGhvZDIgPT0gQ1ZfQ0hBSU5fQ09ERSApCisgICAgeworICAgICAgICBzY2FubmVyLT5zZXFfdHlwZTIgPSBzY2FubmVyLT5zZXFfdHlwZTE7CisgICAgICAgIHNjYW5uZXItPmVsZW1fc2l6ZTIgPSBzY2FubmVyLT5lbGVtX3NpemUxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzY2FubmVyLT5zZXFfdHlwZTIgPSBDVl9TRVFfUE9MWUdPTjsKKyAgICAgICAgc2Nhbm5lci0+ZWxlbV9zaXplMiA9IHNpemVvZiggQ3ZQb2ludCApOworICAgIH0KKworICAgIHNjYW5uZXItPnNlcV90eXBlMSA9IHNjYW5uZXItPmFwcHJveF9tZXRob2QxID09IENWX0NIQUlOX0NPREUgPworICAgICAgICBDVl9TRVFfQ0hBSU5fQ09OVE9VUiA6IENWX1NFUV9QT0xZR09OOworCisgICAgc2Nhbm5lci0+c2VxX3R5cGUyID0gc2Nhbm5lci0+YXBwcm94X21ldGhvZDIgPT0gQ1ZfQ0hBSU5fQ09ERSA/CisgICAgICAgIENWX1NFUV9DSEFJTl9DT05UT1VSIDogQ1ZfU0VRX1BPTFlHT047CisKKyAgICBjdlNhdmVNZW1TdG9yYWdlUG9zKCBzdG9yYWdlLCAmKHNjYW5uZXItPmluaXRpYWxfcG9zKSApOworCisgICAgaWYoIG1ldGhvZCA+IENWX0NIQUlOX0FQUFJPWF9TSU1QTEUgKQorICAgIHsKKyAgICAgICAgc2Nhbm5lci0+c3RvcmFnZTEgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc2Nhbm5lci0+c3RvcmFnZTIgKTsKKyAgICB9CisKKyAgICBpZiggbW9kZSA+IENWX1JFVFJfTElTVCApCisgICAgeworICAgICAgICBzY2FubmVyLT5jaW5mb19zdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoIHNjYW5uZXItPnN0b3JhZ2UyICk7CisgICAgICAgIHNjYW5uZXItPmNpbmZvX3NldCA9IGN2Q3JlYXRlU2V0KCAwLCBzaXplb2YoIEN2U2V0ICksIHNpemVvZiggX0N2Q29udG91ckluZm8gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmNpbmZvX3N0b3JhZ2UgKTsKKyAgICAgICAgaWYoIHNjYW5uZXItPmNpbmZvX3N0b3JhZ2UgPT0gMCB8fCBzY2FubmVyLT5jaW5mb19zZXQgPT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfT1VUT0ZNRU1fRVJSICk7CisgICAgfQorCisgICAgLyogbWFrZSB6ZXJvIGJvcmRlcnMgKi8KKyAgICBtZW1zZXQoIGltZywgMCwgc2l6ZS53aWR0aCApOworICAgIG1lbXNldCggaW1nICsgc3RlcCAqIChzaXplLmhlaWdodCAtIDEpLCAwLCBzaXplLndpZHRoICk7CisKKyAgICBmb3IoIHkgPSAxLCBpbWcgKz0gc3RlcDsgeSA8IHNpemUuaGVpZ2h0IC0gMTsgeSsrLCBpbWcgKz0gc3RlcCApCisgICAgeworICAgICAgICBpbWdbMF0gPSBpbWdbc2l6ZS53aWR0aCAtIDFdID0gMDsKKyAgICB9CisKKyAgICAvKiBjb252ZXJ0cyBhbGwgcGl4ZWxzIHRvIDAgb3IgMSAqLworICAgIGN2VGhyZXNob2xkKCBtYXQsIG1hdCwgMCwgMSwgQ1ZfVEhSRVNIX0JJTkFSWSApOworICAgIENWX0NIRUNLKCk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZGcmVlKCAmc2Nhbm5lciApOworCisgICAgcmV0dXJuIHNjYW5uZXI7Cit9CisKKy8qCisgICBGaW5hbCBzdGFnZSBvZiBjb250b3VyIHByb2Nlc3NpbmcuCisgICBUaHJlZSB2YXJpYW50cyBwb3NzaWJsZToKKyAgICAgIDEuIENvbnRvdXIsIHdoaWNoIHdhcyByZXRyaWV2ZWQgdXNpbmcgYm9yZGVyIGZvbGxvd2luZywgaXMgYWRkZWQgdG8KKyAgICAgICAgIHRoZSBjb250b3VyIHRyZWUuIEl0IGlzIHRoZSBjYXNlIHdoZW4gdGhlIGljdlN1YnN0aXR1dGVDb250b3VyIGZ1bmN0aW9uCisgICAgICAgICB3YXMgbm90IGNhbGxlZCBhZnRlciByZXRyaWV2aW5nIHRoZSBjb250b3VyLgorCisgICAgICAyLiBOZXcgY29udG91ciwgYXNzaWduZWQgYnkgaWN2U3Vic3RpdHV0ZUNvbnRvdXIgZnVuY3Rpb24sIGlzIGFkZGVkIHRvIHRoZQorICAgICAgICAgdHJlZS4gVGhlIHJldHJpZXZlZCBjb250b3VyIGl0c2VsZiBpcyByZW1vdmVkIGZyb20gdGhlIHN0b3JhZ2UuCisgICAgICAgICBIZXJlIHR3byBjYXNlcyBhcmUgcG9zc2libGU6CisgICAgICAgICAgICAyYS4gSWYgb25lIGRlYWxzIHdpdGggcGxhbmUgdmFyaWFudCBvZiBhbGdvcml0aG0KKyAgICAgICAgICAgICAgICAoaGllcmFyY2hpY2FsIHN0cnVjdXRyZSBpcyBub3QgcmVjb25zdHJ1Y3RlZCksCisgICAgICAgICAgICAgICAgdGhlIGNvbnRvdXIgaXMgcmVtb3ZlZCBjb21wbGV0ZWx5LgorICAgICAgICAgICAgMmIuIEluIGhpZXJhcmNoaWNhbCBjYXNlLCB0aGUgaGVhZGVyIG9mIHRoZSBjb250b3VyIGlzIG5vdCByZW1vdmVkLgorICAgICAgICAgICAgICAgIEl0J3MgbWFya2VkIGFzICJsaW5rIHRvIGNvbnRvdXIiIGFuZCBoX25leHQgcG9pbnRlciBvZiBpdCBpcyBzZXQgdG8KKyAgICAgICAgICAgICAgICBuZXcsIHN1YnN0aXR1dGluZyBjb250b3VyLgorCisgICAgICAzLiBUaGUgc2ltaWxhciB0byAyLCBidXQgd2hlbiBOVUxMIHBvaW50ZXIgd2FzIGFzc2lnbmVkIGJ5CisgICAgICAgICBpY3ZTdWJzdGl0dXRlQ29udG91ciBmdW5jdGlvbi4gSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcworICAgICAgICAgcmV0cmlldmVkIGNvbnRvdXIgY29tcGxldGVseSBpZiBwbGFuZSBjYXNlIGFuZAorICAgICAgICAgbGVhdmVzIGhlYWRlciBpZiBoaWVyYXJjaGljYWwgKGJ1dCBkb2Vzbid0IG1hcmsgaGVhZGVyIGFzICJsaW5rIikuCisgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFRoZSAxc3QgdmFyaWFudCBjYW4gYmUgdXNlZCB0byByZXRyaWV2ZSBhbmQgc3RvcmUgYWxsIHRoZSBjb250b3VycyBmcm9tIHRoZSBpbWFnZQorICAgICAgKHdpdGggb3B0aW9uYWwgY29udmVydGlvbiBmcm9tIGNoYWlucyB0byBjb250b3VycyB1c2luZyBzb21lIGFwcHJveGltYXRpb24gZnJvbQorICAgICAgcmVzdHJpY2VkIHNldCBvZiBtZXRob2RzKS4gU29tZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29udG91ciBjYW4gYmUgY29tcHV0ZWQgaW4gdGhlCisgICAgICBzYW1lIHBhc3MuCisKKyAgICAgIFRoZSB1c2FnZSBzY2hlbWUgY2FuIGxvb2sgbGlrZToKKworICAgICAgaWN2Q29udG91clNjYW5uZXIgc2Nhbm5lcjsKKyAgICAgIEN2TWVtU3RvcmFnZSogIGNvbnRvdXJfc3RvcmFnZTsKKyAgICAgIEN2U2VxKiAgZmlyc3RfY29udG91cjsKKyAgICAgIEN2U3RhdHVzICByZXN1bHQ7CisKKyAgICAgIC4uLgorCisgICAgICBpY3ZDcmVhdGVNZW1TdG9yYWdlKCAmY29udG91cl9zdG9yYWdlLCBibG9ja19zaXplLzAgKTsKKworICAgICAgLi4uCisKKyAgICAgIGN2U3RhcnRGaW5kQ29udG91cnMKKyAgICAgICAgICAgICAgKCBpbWcsIGNvbnRvdXJfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICBoZWFkZXJfc2l6ZSwgYXBwcm94X21ldGhvZCwKKyAgICAgICAgICAgICAgICBbZXh0ZXJuYWxfb25seSxdCisgICAgICAgICAgICAgICAgJnNjYW5uZXIgKTsKKworICAgICAgZm9yKDs7KQorICAgICAgeworICAgICAgICAgIFtDdlNlcSogY29udG91cjtdCisgICAgICAgICAgcmVzdWx0ID0gaWN2RmluZE5leHRDb250b3VyKCAmc2Nhbm5lciwgJmNvbnRvdXIvMCApOworCisgICAgICAgICAgaWYoIHJlc3VsdCAhPSBDVl9PSyApIGJyZWFrOworCisgICAgICAgICAgLy8gY2FsY3VsYXRlIHNvbWUgY2hhcmFjdGVyaXN0aWNzCisgICAgICAgICAgLi4uCisgICAgICB9CisKKyAgICAgIGlmKCByZXN1bHQgPCAwICkgZ290byBlcnJvcl9wcm9jZXNzaW5nOworCisgICAgICBjdkVuZEZpbmRDb250b3VycyggJnNjYW5uZXIsICZmaXJzdF9jb250b3VyICk7CisgICAgICAuLi4KKworICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgICAgU2Vjb25kIHZhcmlhbnQgaXMgbW9yZSBjb21wbGV4IGFuZCBjYW4gYmUgdXNlZCB3aGVuIHNvbWVvbmUgd2FudHMgc3RvcmUgbm90CisgICAgICB0aGUgcmV0cmlldmVkIGNvbnRvdXJzIGJ1dCB0cmFuc2Zvcm1lZCBvbmVzLiAoZS5nLiBhcHByb3hpbWF0ZWQgd2l0aCBzb21lCisgICAgICBub24tZGVmYXVsdCBhbGdvcml0aG0gKS4KKworICAgICAgVGhlIHNjaGVtZSBjYW4gYmUgdGhlIGFzIGZvbGxvd2luZzoKKworICAgICAgaWN2Q29udG91clNjYW5uZXIgc2Nhbm5lcjsKKyAgICAgIEN2TWVtU3RvcmFnZSogIGNvbnRvdXJfc3RvcmFnZTsKKyAgICAgIEN2TWVtU3RvcmFnZSogIHRlbXBfc3RvcmFnZTsKKyAgICAgIEN2U2VxKiAgZmlyc3RfY29udG91cjsKKyAgICAgIEN2U3RhdHVzICByZXN1bHQ7CisKKyAgICAgIC4uLgorCisgICAgICBpY3ZDcmVhdGVNZW1TdG9yYWdlKCAmY29udG91cl9zdG9yYWdlLCBibG9ja19zaXplLzAgKTsKKyAgICAgIGljdkNyZWF0ZU1lbVN0b3JhZ2UoICZ0ZW1wX3N0b3JhZ2UsIGJsb2NrX3NpemUvMCApOworCisgICAgICAuLi4KKworICAgICAgaWN2U3RhcnRGaW5kQ29udG91cnM4dUMxUgorICAgICAgICAgICAgICAoIDxpbWdfcGFyYW1zPiwgdGVtcF9zdG9yYWdlLAorICAgICAgICAgICAgICAgIGhlYWRlcl9zaXplLCBhcHByb3hfbWV0aG9kLAorICAgICAgICAgICAgICAgIFtyZXRyaXZhbF9tb2RlXSwKKyAgICAgICAgICAgICAgICAmc2Nhbm5lciApOworCisgICAgICBmb3IoOzspCisgICAgICB7CisgICAgICAgICAgQ3ZTZXEqIHRlbXBfY29udG91cjsKKyAgICAgICAgICBDdlNlcSogbmV3X2NvbnRvdXI7CisgICAgICAgICAgcmVzdWx0ID0gaWN2RmluZE5leHRDb250b3VyKCBzY2FubmVyLCAmdGVtcF9jb250b3VyICk7CisKKyAgICAgICAgICBpZiggcmVzdWx0ICE9IENWX09LICkgYnJlYWs7CisKKyAgICAgICAgICA8YXBwcm94aW1hdGlvbl9mdW5jdGlvbj4oIHRlbXBfY29udG91ciwgY29udG91cl9zdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19jb250b3VyLCA8cGFyYW1ldGVycy4uLj4gKTsKKworICAgICAgICAgIGljdlN1YnN0aXR1dGVDb250b3VyKCBzY2FubmVyLCBuZXdfY29udG91ciApOworICAgICAgICAgIC4uLgorICAgICAgfQorCisgICAgICBpZiggcmVzdWx0IDwgMCApIGdvdG8gZXJyb3JfcHJvY2Vzc2luZzsKKworICAgICAgY3ZFbmRGaW5kQ29udG91cnMoICZzY2FubmVyLCAmZmlyc3RfY29udG91ciApOworICAgICAgLi4uCisKKyAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgIFRoaXJkIG1ldGhvZCB0byByZXRyaWV2ZSBjb250b3VycyBtYXkgYmUgYXBwbGllZCBpZiBjb250b3VycyBhcmUgaXJyZWxldmFudAorICAgICAgdGhlbXNlbHZlcyBidXQgc29tZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlbSBhcmUgdXNlZCBvbmx5LgorICAgICAgVGhlIHVzYWdlIGlzIHNpbWlsYXIgdG8gc2Vjb25kIGV4Y2VwdCBzbGlnaHRseSBkaWZmZXJlbnQgaW50ZXJuYWwgbG9vcAorCisgICAgICBmb3IoOzspCisgICAgICB7CisgICAgICAgICAgQ3ZTZXEqIHRlbXBfY29udG91cjsKKyAgICAgICAgICByZXN1bHQgPSBpY3ZGaW5kTmV4dENvbnRvdXIoICZzY2FubmVyLCAmdGVtcF9jb250b3VyICk7CisKKyAgICAgICAgICBpZiggcmVzdWx0ICE9IENWX09LICkgYnJlYWs7CisKKyAgICAgICAgICAvLyBjYWxjdWxhdGUgc29tZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgdGVtcF9jb250b3VyCisKKyAgICAgICAgICBpY3ZTdWJzdGl0dXRlQ29udG91ciggc2Nhbm5lciwgMCApOworICAgICAgICAgIC4uLgorICAgICAgfQorCisgICAgICBuZXdfc3RvcmFnZSB2YXJpYWJsZSBpcyBub3QgbmVlZGVkIGhlcmUuCisKKyAgICAgIFR3byBub3Rlcy4KKyAgICAgIDEuIFNlY29uZCBhbmQgdGhpcmQgbWV0aG9kIGNhbiBpbnRlcmxlYXZlLiBJLmUuIGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgICByZW1haW4gY29udG91cnMgdGhhdCBzYXRpc2Z5IHdpdGggc29tZSBjcml0ZXJpYSBhbmQgcmVqZWN0IG90aGVycy4KKyAgICAgICAgIEluIGhpZXJhcmNoaWMgY2FzZSB0aGUgcmVzdWx0aW5nIHRyZWUgaXMgdGhlIHBhcnQgb2Ygb3JpZ2luYWwgdHJlZSB3aXRoCisgICAgICAgICBzb21lIG5vZGVzIGFic2VudC4gQnV0IGluIHRoZSByZXN1bHRpbmcgdHJlZSB0aGUgY29udG91cjEgaXMgYSBjaGlsZAorICAgICAgICAgKG1heSBiZSBpbmRpcmVjdCkgb2YgY29udG91cjIgaWZmIGluIHRoZSBvcmlnaW5hbCB0cmVlIHRoZSBjb250b3VyMQorICAgICAgICAgaXMgYSBjaGlsZCAobWF5IGJlIGluZGlyZWN0KSBvZiBjb250b3VyMi4KKyovCitzdGF0aWMgdm9pZAoraWN2RW5kUHJvY2Vzc0NvbnRvdXIoIEN2Q29udG91clNjYW5uZXIgc2Nhbm5lciApCit7CisgICAgX0N2Q29udG91ckluZm8gKmxfY2luZm8gPSBzY2FubmVyLT5sX2NpbmZvOworCisgICAgaWYoIGxfY2luZm8gKQorICAgIHsKKyAgICAgICAgaWYoIHNjYW5uZXItPnN1YnN0X2ZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICBDdk1lbVN0b3JhZ2VQb3MgdGVtcDsKKworICAgICAgICAgICAgY3ZTYXZlTWVtU3RvcmFnZVBvcyggc2Nhbm5lci0+c3RvcmFnZTIsICZ0ZW1wICk7CisKKyAgICAgICAgICAgIGlmKCB0ZW1wLnRvcCA9PSBzY2FubmVyLT5iYWNrdXBfcG9zMi50b3AgJiYKKyAgICAgICAgICAgICAgICB0ZW1wLmZyZWVfc3BhY2UgPT0gc2Nhbm5lci0+YmFja3VwX3BvczIuZnJlZV9zcGFjZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZSZXN0b3JlTWVtU3RvcmFnZVBvcyggc2Nhbm5lci0+c3RvcmFnZTIsICZzY2FubmVyLT5iYWNrdXBfcG9zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FubmVyLT5zdWJzdF9mbGFnID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBsX2NpbmZvLT5jb250b3VyICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZJbnNlcnROb2RlSW50b1RyZWUoIGxfY2luZm8tPmNvbnRvdXIsIGxfY2luZm8tPnBhcmVudC0+Y29udG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNjYW5uZXItPmZyYW1lKSApOworICAgICAgICB9CisgICAgICAgIHNjYW5uZXItPmxfY2luZm8gPSAwOworICAgIH0KK30KKworLyogcmVwbGFjZXMgb25lIGNvbnRvdXIgd2l0aCBhbm90aGVyICovCitDVl9JTVBMIHZvaWQKK2N2U3Vic3RpdHV0ZUNvbnRvdXIoIEN2Q29udG91clNjYW5uZXIgc2Nhbm5lciwgQ3ZTZXEgKiBuZXdfY29udG91ciApCit7CisgICAgX0N2Q29udG91ckluZm8gKmxfY2luZm87CisKKyAgICBDVl9GVU5DTkFNRSggImN2U3Vic3RpdHV0ZUNvbnRvdXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNjYW5uZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGxfY2luZm8gPSBzY2FubmVyLT5sX2NpbmZvOworICAgIGlmKCBsX2NpbmZvICYmIGxfY2luZm8tPmNvbnRvdXIgJiYgbF9jaW5mby0+Y29udG91ciAhPSBuZXdfY29udG91ciApCisgICAgeworICAgICAgICBsX2NpbmZvLT5jb250b3VyID0gbmV3X2NvbnRvdXI7CisgICAgICAgIHNjYW5uZXItPnN1YnN0X2ZsYWcgPSAxOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyoKKyAgICBtYXJrcyBkb21haW4gYm9yZGVyIHdpdGggKy8tPGNvbnN0YW50PiBhbmQgc3RvcmVzIHRoZSBjb250b3VyIGludG8gQ3ZTZXEuCisgICAgICAgIG1ldGhvZDoKKyAgICAgICAgICAgIDwwICAtIGNoYWluCisgICAgICAgICAgICA9PTAgLSBkaXJlY3QKKyAgICAgICAgICAgID4wICAtIHNpbXBsZSBhcHByb3hpbWF0aW9uCisqLworc3RhdGljIEN2U3RhdHVzCitpY3ZGZXRjaENvbnRvdXIoIHNjaGFyICAgICAgICAgICAgICAgICAgKnB0ciwKKyAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICBzdGVwLAorICAgICAgICAgICAgICAgICBDdlBvaW50ICAgICAgICAgICAgICAgIHB0LAorICAgICAgICAgICAgICAgICBDdlNlcSogICAgICAgICAgICAgICAgIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgIGludCAgICBfbWV0aG9kICkKK3sKKyAgICBjb25zdCBzY2hhciAgICAgbmJkID0gMjsKKyAgICBpbnQgICAgICAgICAgICAgZGVsdGFzWzE2XTsKKyAgICBDdlNlcVdyaXRlciAgICAgd3JpdGVyOworICAgIHNjaGFyICAgICAgICAgICAqaTAgPSBwdHIsICppMSwgKmkzLCAqaTQgPSAwOworICAgIGludCAgICAgICAgICAgICBwcmV2X3MgPSAtMSwgcywgc19lbmQ7CisgICAgaW50ICAgICAgICAgICAgIG1ldGhvZCA9IF9tZXRob2QgLSAxOworCisgICAgYXNzZXJ0KCAodW5zaWduZWQpIF9tZXRob2QgPD0gQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSApOworCisgICAgLyogaW5pdGlhbGl6ZSBsb2NhbCBzdGF0ZSAqLworICAgIENWX0lOSVRfM1gzX0RFTFRBUyggZGVsdGFzLCBzdGVwLCAxICk7CisgICAgbWVtY3B5KCBkZWx0YXMgKyA4LCBkZWx0YXMsIDggKiBzaXplb2YoIGRlbHRhc1swXSApKTsKKworICAgIC8qIGluaXRpYWxpemUgd3JpdGVyICovCisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBjb250b3VyLCAmd3JpdGVyICk7CisKKyAgICBpZiggbWV0aG9kIDwgMCApCisgICAgICAgICgoQ3ZDaGFpbiAqKSBjb250b3VyKS0+b3JpZ2luID0gcHQ7CisKKyAgICBzX2VuZCA9IHMgPSBDVl9JU19TRVFfSE9MRSggY29udG91ciApID8gMCA6IDQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcyA9IChzIC0gMSkgJiA3OworICAgICAgICBpMSA9IGkwICsgZGVsdGFzW3NdOworICAgICAgICBpZiggKmkxICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlKCBzICE9IHNfZW5kICk7CisKKyAgICBpZiggcyA9PSBzX2VuZCApICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsIGRvbWFpbiAqLworICAgIHsKKyAgICAgICAgKmkwID0gKHNjaGFyKSAobmJkIHwgLTEyOCk7CisgICAgICAgIGlmKCBtZXRob2QgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaTMgPSBpMDsKKyAgICAgICAgcHJldl9zID0gcyBeIDQ7CisKKyAgICAgICAgLyogZm9sbG93IGJvcmRlciAqLworICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgeworICAgICAgICAgICAgc19lbmQgPSBzOworCisgICAgICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpNCA9IGkzICsgZGVsdGFzWysrc107CisgICAgICAgICAgICAgICAgaWYoICppNCAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzICY9IDc7CisKKyAgICAgICAgICAgIC8qIGNoZWNrICJyaWdodCIgYm91bmQgKi8KKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpIChzIC0gMSkgPCAodW5zaWduZWQpIHNfZW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqaTMgPSAoc2NoYXIpIChuYmQgfCAtMTI4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICppMyA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqaTMgPSBuYmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBtZXRob2QgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzY2hhciBfcyA9IChzY2hhcikgczsKKworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBfcywgd3JpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHMgIT0gcHJldl9zIHx8IG1ldGhvZCA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgICAgIHByZXZfcyA9IHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHQueCArPSBpY3ZDb2RlRGVsdGFzW3NdLng7CisgICAgICAgICAgICAgICAgcHQueSArPSBpY3ZDb2RlRGVsdGFzW3NdLnk7CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGk0ID09IGkwICYmIGkzID09IGkxICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaTMgPSBpNDsKKyAgICAgICAgICAgIHMgPSAocyArIDQpICYgNzsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJvcmRlciBmb2xsb3dpbmcgbG9vcCAqLworICAgIH0KKworICAgIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKworICAgIGlmKCBfbWV0aG9kICE9IENWX0NIQUlOX0NPREUgKQorICAgICAgICBjdkJvdW5kaW5nUmVjdCggY29udG91ciwgMSApOworCisgICAgYXNzZXJ0KCB3cml0ZXIuc2VxLT50b3RhbCA9PSAwICYmIHdyaXRlci5zZXEtPmZpcnN0ID09IDAgfHwKKyAgICAgICAgICAgIHdyaXRlci5zZXEtPnRvdGFsID4gd3JpdGVyLnNlcS0+Zmlyc3QtPmNvdW50IHx8CisgICAgICAgICAgICAod3JpdGVyLnNlcS0+Zmlyc3QtPnByZXYgPT0gd3JpdGVyLnNlcS0+Zmlyc3QgJiYKKyAgICAgICAgICAgICB3cml0ZXIuc2VxLT5maXJzdC0+bmV4dCA9PSB3cml0ZXIuc2VxLT5maXJzdCkgKTsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisKKy8qCisgICB0cmFjZSBjb250b3VyIHVudGlsIGNlcnRhaW4gcG9pbnQgaXMgbWV0LgorICAgcmV0dXJucyAxIGlmIG1ldCwgMCBlbHNlLgorKi8KK3N0YXRpYyBpbnQKK2ljdlRyYWNlQ29udG91ciggc2NoYXIgKnB0ciwgaW50IHN0ZXAsIHNjaGFyICpzdG9wX3B0ciwgaW50IGlzX2hvbGUgKQoreworICAgIGludCBkZWx0YXNbMTZdOworICAgIHNjaGFyICppMCA9IHB0ciwgKmkxLCAqaTMsICppNDsKKyAgICBpbnQgcywgc19lbmQ7CisKKyAgICAvKiBpbml0aWFsaXplIGxvY2FsIHN0YXRlICovCisgICAgQ1ZfSU5JVF8zWDNfREVMVEFTKCBkZWx0YXMsIHN0ZXAsIDEgKTsKKyAgICBtZW1jcHkoIGRlbHRhcyArIDgsIGRlbHRhcywgOCAqIHNpemVvZiggZGVsdGFzWzBdICkpOworCisgICAgYXNzZXJ0KCAoKmkwICYgLTIpICE9IDAgKTsKKworICAgIHNfZW5kID0gcyA9IGlzX2hvbGUgPyAwIDogNDsKKworICAgIGRvCisgICAgeworICAgICAgICBzID0gKHMgLSAxKSAmIDc7CisgICAgICAgIGkxID0gaTAgKyBkZWx0YXNbc107CisgICAgICAgIGlmKCAqaTEgIT0gMCApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgd2hpbGUoIHMgIT0gc19lbmQgKTsKKworICAgIGkzID0gaTA7CisKKyAgICAvKiBjaGVjayBzaW5nbGUgcGl4ZWwgZG9tYWluICovCisgICAgaWYoIHMgIT0gc19lbmQgKQorICAgIHsKKyAgICAgICAgLyogZm9sbG93IGJvcmRlciAqLworICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgeworICAgICAgICAgICAgc19lbmQgPSBzOworCisgICAgICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpNCA9IGkzICsgZGVsdGFzWysrc107CisgICAgICAgICAgICAgICAgaWYoICppNCAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpMyA9PSBzdG9wX3B0ciB8fCAoaTQgPT0gaTAgJiYgaTMgPT0gaTEpICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgaTMgPSBpNDsKKyAgICAgICAgICAgIHMgPSAocyArIDQpICYgNzsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGJvcmRlciBmb2xsb3dpbmcgbG9vcCAqLworICAgIH0KKyAgICByZXR1cm4gaTMgPT0gc3RvcF9wdHI7Cit9CisKKworc3RhdGljIEN2U3RhdHVzCitpY3ZGZXRjaENvbnRvdXJFeCggc2NoYXIqICAgICAgICAgICAgICAgcHRyLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgICAgIHN0ZXAsCisgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCAgICAgICAgICAgICAgcHQsCisgICAgICAgICAgICAgICAgICAgQ3ZTZXEqICAgICAgICAgICAgICAgY29udG91ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgIF9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgbmJkLAorICAgICAgICAgICAgICAgICAgIEN2UmVjdCogICAgICAgICAgICAgIF9yZWN0ICkKK3sKKyAgICBpbnQgICAgICAgICBkZWx0YXNbMTZdOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBzY2hhciAgICAgICAgKmkwID0gcHRyLCAqaTEsICppMywgKmk0OworICAgIEN2UmVjdCAgICAgIHJlY3Q7CisgICAgaW50ICAgICAgICAgcHJldl9zID0gLTEsIHMsIHNfZW5kOworICAgIGludCAgICAgICAgIG1ldGhvZCA9IF9tZXRob2QgLSAxOworCisgICAgYXNzZXJ0KCAodW5zaWduZWQpIF9tZXRob2QgPD0gQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSApOworICAgIGFzc2VydCggMSA8IG5iZCAmJiBuYmQgPCAxMjggKTsKKworICAgIC8qIGluaXRpYWxpemUgbG9jYWwgc3RhdGUgKi8KKyAgICBDVl9JTklUXzNYM19ERUxUQVMoIGRlbHRhcywgc3RlcCwgMSApOworICAgIG1lbWNweSggZGVsdGFzICsgOCwgZGVsdGFzLCA4ICogc2l6ZW9mKCBkZWx0YXNbMF0gKSk7CisKKyAgICAvKiBpbml0aWFsaXplIHdyaXRlciAqLworICAgIGN2U3RhcnRBcHBlbmRUb1NlcSggY29udG91ciwgJndyaXRlciApOworCisgICAgaWYoIG1ldGhvZCA8IDAgKQorICAgICAgICAoKEN2Q2hhaW4gKiljb250b3VyKS0+b3JpZ2luID0gcHQ7CisKKyAgICByZWN0LnggPSByZWN0LndpZHRoID0gcHQueDsKKyAgICByZWN0LnkgPSByZWN0LmhlaWdodCA9IHB0Lnk7CisKKyAgICBzX2VuZCA9IHMgPSBDVl9JU19TRVFfSE9MRSggY29udG91ciApID8gMCA6IDQ7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgcyA9IChzIC0gMSkgJiA3OworICAgICAgICBpMSA9IGkwICsgZGVsdGFzW3NdOworICAgICAgICBpZiggKmkxICE9IDAgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHdoaWxlKCBzICE9IHNfZW5kICk7CisKKyAgICBpZiggcyA9PSBzX2VuZCApICAgICAgICAgICAgLyogc2luZ2xlIHBpeGVsIGRvbWFpbiAqLworICAgIHsKKyAgICAgICAgKmkwID0gKHNjaGFyKSAobmJkIHwgMHg4MCk7CisgICAgICAgIGlmKCBtZXRob2QgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaTMgPSBpMDsKKworICAgICAgICBwcmV2X3MgPSBzIF4gNDsKKworICAgICAgICAvKiBmb2xsb3cgYm9yZGVyICovCisgICAgICAgIGZvciggOzsgKQorICAgICAgICB7CisgICAgICAgICAgICBzX2VuZCA9IHM7CisKKyAgICAgICAgICAgIGZvciggOzsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGk0ID0gaTMgKyBkZWx0YXNbKytzXTsKKyAgICAgICAgICAgICAgICBpZiggKmk0ICE9IDAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMgJj0gNzsKKworICAgICAgICAgICAgLyogY2hlY2sgInJpZ2h0IiBib3VuZCAqLworICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkgKHMgLSAxKSA8ICh1bnNpZ25lZCkgc19lbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICppMyA9IChzY2hhcikgKG5iZCB8IDB4ODApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggKmkzID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICppMyA9IChzY2hhcikgbmJkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbWV0aG9kIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2NoYXIgX3MgPSAoc2NoYXIpIHM7CisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIF9zLCB3cml0ZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHMgIT0gcHJldl9zIHx8IG1ldGhvZCA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggcHQsIHdyaXRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcyAhPSBwcmV2X3MgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHVwZGF0ZSBib3VuZHMgKi8KKyAgICAgICAgICAgICAgICBpZiggcHQueCA8IHJlY3QueCApCisgICAgICAgICAgICAgICAgICAgIHJlY3QueCA9IHB0Lng7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggcHQueCA+IHJlY3Qud2lkdGggKQorICAgICAgICAgICAgICAgICAgICByZWN0LndpZHRoID0gcHQueDsKKworICAgICAgICAgICAgICAgIGlmKCBwdC55IDwgcmVjdC55ICkKKyAgICAgICAgICAgICAgICAgICAgcmVjdC55ID0gcHQueTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBwdC55ID4gcmVjdC5oZWlnaHQgKQorICAgICAgICAgICAgICAgICAgICByZWN0LmhlaWdodCA9IHB0Lnk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByZXZfcyA9IHM7CisgICAgICAgICAgICBwdC54ICs9IGljdkNvZGVEZWx0YXNbc10ueDsKKyAgICAgICAgICAgIHB0LnkgKz0gaWN2Q29kZURlbHRhc1tzXS55OworCisgICAgICAgICAgICBpZiggaTQgPT0gaTAgJiYgaTMgPT0gaTEgKSAgYnJlYWs7CisKKyAgICAgICAgICAgIGkzID0gaTQ7CisgICAgICAgICAgICBzID0gKHMgKyA0KSAmIDc7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBib3JkZXIgZm9sbG93aW5nIGxvb3AgKi8KKyAgICB9CisKKyAgICByZWN0LndpZHRoIC09IHJlY3QueCAtIDE7CisgICAgcmVjdC5oZWlnaHQgLT0gcmVjdC55IC0gMTsKKworICAgIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKworICAgIGlmKCBfbWV0aG9kICE9IENWX0NIQUlOX0NPREUgKQorICAgICAgICAoKEN2Q29udG91ciopY29udG91ciktPnJlY3QgPSByZWN0OworCisgICAgYXNzZXJ0KCB3cml0ZXIuc2VxLT50b3RhbCA9PSAwICYmIHdyaXRlci5zZXEtPmZpcnN0ID09IDAgfHwKKyAgICAgICAgICAgIHdyaXRlci5zZXEtPnRvdGFsID4gd3JpdGVyLnNlcS0+Zmlyc3QtPmNvdW50IHx8CisgICAgICAgICAgICAod3JpdGVyLnNlcS0+Zmlyc3QtPnByZXYgPT0gd3JpdGVyLnNlcS0+Zmlyc3QgJiYKKyAgICAgICAgICAgICB3cml0ZXIuc2VxLT5maXJzdC0+bmV4dCA9PSB3cml0ZXIuc2VxLT5maXJzdCkgKTsKKworICAgIGlmKCBfcmVjdCApICAqX3JlY3QgPSByZWN0OworCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0N2U2VxICoKK2N2RmluZE5leHRDb250b3VyKCBDdkNvbnRvdXJTY2FubmVyIHNjYW5uZXIgKQoreworICAgIHNjaGFyICppbWcwOworICAgIHNjaGFyICppbWc7CisgICAgaW50IHN0ZXA7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50IHgsIHk7CisgICAgaW50IHByZXY7CisgICAgQ3ZQb2ludCBsbmJkOworICAgIEN2U2VxICpjb250b3VyID0gMDsKKyAgICBpbnQgbmJkOworICAgIGludCBtb2RlOworICAgIEN2U3RhdHVzIHJlc3VsdCA9IChDdlN0YXR1cykgMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZGaW5kTmV4dENvbnRvdXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNjYW5uZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpY3ZFbmRQcm9jZXNzQ29udG91ciggc2Nhbm5lciApOworCisgICAgLyogaW5pdGlhbGl6ZSBsb2NhbCBzdGF0ZSAqLworICAgIGltZzAgPSBzY2FubmVyLT5pbWcwOworICAgIGltZyA9IHNjYW5uZXItPmltZzsKKyAgICBzdGVwID0gc2Nhbm5lci0+aW1nX3N0ZXA7CisgICAgeCA9IHNjYW5uZXItPnB0Lng7CisgICAgeSA9IHNjYW5uZXItPnB0Lnk7CisgICAgd2lkdGggPSBzY2FubmVyLT5pbWdfc2l6ZS53aWR0aDsKKyAgICBoZWlnaHQgPSBzY2FubmVyLT5pbWdfc2l6ZS5oZWlnaHQ7CisgICAgbW9kZSA9IHNjYW5uZXItPm1vZGU7CisgICAgbG5iZCA9IHNjYW5uZXItPmxuYmQ7CisgICAgbmJkID0gc2Nhbm5lci0+bmJkOworCisgICAgcHJldiA9IGltZ1t4IC0gMV07CisKKyAgICBmb3IoIDsgeSA8IGhlaWdodDsgeSsrLCBpbWcgKz0gc3RlcCApCisgICAgeworICAgICAgICBmb3IoIDsgeCA8IHdpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcCA9IGltZ1t4XTsKKworICAgICAgICAgICAgaWYoIHAgIT0gcHJldiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0N2Q29udG91ckluZm8gKnBhcl9pbmZvID0gMDsKKyAgICAgICAgICAgICAgICBfQ3ZDb250b3VySW5mbyAqbF9jaW5mbyA9IDA7CisgICAgICAgICAgICAgICAgQ3ZTZXEgKnNlcSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGlzX2hvbGUgPSAwOworICAgICAgICAgICAgICAgIEN2UG9pbnQgb3JpZ2luOworCisgICAgICAgICAgICAgICAgaWYoICEocHJldiA9PSAwICYmIHAgPT0gMSkgKSAgICAvKiBpZiBub3QgZXh0ZXJuYWwgY29udG91ciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaG9sZSAqLworICAgICAgICAgICAgICAgICAgICBpZiggcCAhPSAwIHx8IHByZXYgPCAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzdW1lX3NjYW47CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByZXYgJiAtMiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxuYmQueCA9IHggLSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlzX2hvbGUgPSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBtb2RlID09IDAgJiYgKGlzX2hvbGUgfHwgaW1nMFtsbmJkLnkgKiBzdGVwICsgbG5iZC54XSA+IDApICkKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXN1bWVfc2NhbjsKKworICAgICAgICAgICAgICAgIG9yaWdpbi55ID0geTsKKyAgICAgICAgICAgICAgICBvcmlnaW4ueCA9IHggLSBpc19ob2xlOworCisgICAgICAgICAgICAgICAgLyogZmluZCBjb250b3VyIHBhcmVudCAqLworICAgICAgICAgICAgICAgIGlmKCBtb2RlIDw9IDEgfHwgKCFpc19ob2xlICYmIG1vZGUgPT0gMikgfHwgbG5iZC54IDw9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyX2luZm8gPSAmKHNjYW5uZXItPmZyYW1lX2luZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbHZhbCA9IGltZzBbbG5iZC55ICogc3RlcCArIGxuYmQueF0gJiAweDdmOworICAgICAgICAgICAgICAgICAgICBfQ3ZDb250b3VySW5mbyAqY3VyID0gc2Nhbm5lci0+Y2luZm9fdGFibGVbbHZhbCAtIDJdOworCisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggbHZhbCA+PSAyICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZmluZCB0aGUgZmlyc3QgYm91bmRpbmcgY29udG91ciAqLworICAgICAgICAgICAgICAgICAgICB3aGlsZSggY3VyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkgKGxuYmQueCAtIGN1ci0+cmVjdC54KSA8ICh1bnNpZ25lZCkgY3VyLT5yZWN0LndpZHRoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKSAobG5iZC55IC0gY3VyLT5yZWN0LnkpIDwgKHVuc2lnbmVkKSBjdXItPnJlY3QuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGFyX2luZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGljdlRyYWNlQ29udG91ciggc2Nhbm5lci0+aW1nMCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcl9pbmZvLT5vcmlnaW4ueSAqIHN0ZXAgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJfaW5mby0+b3JpZ2luLngsIHN0ZXAsIGltZyArIGxuYmQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyX2luZm8tPmlzX2hvbGUgKSA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcl9pbmZvID0gY3VyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBwYXJfaW5mbyAhPSAwICk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgY3VycmVudCBjb250b3VyIGlzIGEgaG9sZSBhbmQgcHJldmlvdXMgY29udG91ciBpcyBhIGhvbGUgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBjb250b3VyIGlzIGV4dGVybmFsIGFuZCBwcmV2aW91cyBjb250b3VyIGlzIGV4dGVybmFsIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBvZiB0aGUgY29udG91ciBpcyB0aGUgcGFyZW50IG9mIHRoZSBwcmV2aW91cyBjb250b3VyIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhcmVudCBpcyB0aGUgcHJldmlvdXMgY29udG91ciBpdHNlbGYuICovCisgICAgICAgICAgICAgICAgICAgIGlmKCBwYXJfaW5mby0+aXNfaG9sZSA9PSBpc19ob2xlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyX2luZm8gPSBwYXJfaW5mby0+cGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZlcnkgY29udG91ciBtdXN0IGhhdmUgYSBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdCBsZWFzdCwgdGhlIGZyYW1lIG9mIHRoZSBpbWFnZSkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcGFyX2luZm8gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcl9pbmZvID0gJihzY2FubmVyLT5mcmFtZV9pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8qIGhvbGUgZmxhZyBvZiB0aGUgcGFyZW50IG11c3QgZGlmZmVyIGZyb20gdGhlIGZsYWcgb2YgdGhlIGNvbnRvdXIgKi8KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBwYXJfaW5mby0+aXNfaG9sZSAhPSBpc19ob2xlICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwYXJfaW5mby0+Y29udG91ciA9PSAwICkgICAgICAgIC8qIHJlbW92ZWQgY29udG91ciAqLworICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXN1bWVfc2NhbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsbmJkLnggPSB4IC0gaXNfaG9sZTsKKworICAgICAgICAgICAgICAgIGN2U2F2ZU1lbVN0b3JhZ2VQb3MoIHNjYW5uZXItPnN0b3JhZ2UyLCAmKHNjYW5uZXItPmJhY2t1cF9wb3MpICk7CisKKyAgICAgICAgICAgICAgICBzZXEgPSBjdkNyZWF0ZVNlcSggc2Nhbm5lci0+c2VxX3R5cGUxLCBzY2FubmVyLT5oZWFkZXJfc2l6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmVsZW1fc2l6ZTEsIHNjYW5uZXItPnN0b3JhZ2UxICk7CisgICAgICAgICAgICAgICAgaWYoICFzZXEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQ1ZfT1VUT0ZNRU1fRVJSOworICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfZnVuYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VxLT5mbGFncyB8PSBpc19ob2xlID8gQ1ZfU0VRX0ZMQUdfSE9MRSA6IDA7CisKKyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIGhlYWRlciAqLworICAgICAgICAgICAgICAgIGlmKCBtb2RlIDw9IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbF9jaW5mbyA9ICYoc2Nhbm5lci0+Y2luZm9fdGVtcCk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGljdkZldGNoQ29udG91ciggaW1nICsgeCAtIGlzX2hvbGUsIHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZQb2ludCggb3JpZ2luLnggKyBzY2FubmVyLT5vZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW4ueSArIHNjYW5uZXItPm9mZnNldC55KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXEsIHNjYW5uZXItPmFwcHJveF9tZXRob2QxICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9mdW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bmlvbiB7IF9DdkNvbnRvdXJJbmZvKiBjaTsgQ3ZTZXRFbGVtKiBzZTsgfSB2OworICAgICAgICAgICAgICAgICAgICB2LmNpID0gbF9jaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRBZGQoIHNjYW5uZXItPmNpbmZvX3NldCwgMCwgJnYuc2UgKTsKKyAgICAgICAgICAgICAgICAgICAgbF9jaW5mbyA9IHYuY2k7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaWN2RmV0Y2hDb250b3VyRXgoIGltZyArIHggLSBpc19ob2xlLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZQb2ludCggb3JpZ2luLnggKyBzY2FubmVyLT5vZmZzZXQueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbi55ICsgc2Nhbm5lci0+b2Zmc2V0LnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VxLCBzY2FubmVyLT5hcHByb3hfbWV0aG9kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iZCwgJihsX2NpbmZvLT5yZWN0KSApOworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0IDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgbF9jaW5mby0+cmVjdC54IC09IHNjYW5uZXItPm9mZnNldC54OworICAgICAgICAgICAgICAgICAgICBsX2NpbmZvLT5yZWN0LnkgLT0gc2Nhbm5lci0+b2Zmc2V0Lnk7CisKKyAgICAgICAgICAgICAgICAgICAgbF9jaW5mby0+bmV4dCA9IHNjYW5uZXItPmNpbmZvX3RhYmxlW25iZCAtIDJdOworICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5jaW5mb190YWJsZVtuYmQgLSAyXSA9IGxfY2luZm87CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlIG5iZCAqLworICAgICAgICAgICAgICAgICAgICBuYmQgPSAobmJkICsgMSkgJiAxMjc7CisgICAgICAgICAgICAgICAgICAgIG5iZCArPSBuYmQgPT0gMCA/IDMgOiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxfY2luZm8tPmlzX2hvbGUgPSBpc19ob2xlOworICAgICAgICAgICAgICAgIGxfY2luZm8tPmNvbnRvdXIgPSBzZXE7CisgICAgICAgICAgICAgICAgbF9jaW5mby0+b3JpZ2luID0gb3JpZ2luOworICAgICAgICAgICAgICAgIGxfY2luZm8tPnBhcmVudCA9IHBhcl9pbmZvOworCisgICAgICAgICAgICAgICAgaWYoIHNjYW5uZXItPmFwcHJveF9tZXRob2QxICE9IHNjYW5uZXItPmFwcHJveF9tZXRob2QyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGljdkFwcHJveGltYXRlQ2hhaW5UQzg5KCAoQ3ZDaGFpbiAqKSBzZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5oZWFkZXJfc2l6ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5zdG9yYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYobF9jaW5mby0+Y29udG91ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5hcHByb3hfbWV0aG9kMiApOworICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0IDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXRfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgY3ZDbGVhck1lbVN0b3JhZ2UoIHNjYW5uZXItPnN0b3JhZ2UxICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbF9jaW5mby0+Y29udG91ci0+dl9wcmV2ID0gbF9jaW5mby0+cGFyZW50LT5jb250b3VyOworCisgICAgICAgICAgICAgICAgaWYoIHBhcl9pbmZvLT5jb250b3VyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbF9jaW5mby0+Y29udG91ciA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzY2FubmVyLT5zdG9yYWdlMSA9PSBzY2FubmVyLT5zdG9yYWdlMiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MoIHNjYW5uZXItPnN0b3JhZ2UxLCAmKHNjYW5uZXItPmJhY2t1cF9wb3MpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkNsZWFyTWVtU3RvcmFnZSggc2Nhbm5lci0+c3RvcmFnZTEgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwID0gaW1nW3hdOworICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc3VtZV9zY2FuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN2U2F2ZU1lbVN0b3JhZ2VQb3MoIHNjYW5uZXItPnN0b3JhZ2UyLCAmKHNjYW5uZXItPmJhY2t1cF9wb3MyKSApOworICAgICAgICAgICAgICAgIHNjYW5uZXItPmxfY2luZm8gPSBsX2NpbmZvOworICAgICAgICAgICAgICAgIHNjYW5uZXItPnB0LnggPSB4ICsgMTsKKyAgICAgICAgICAgICAgICBzY2FubmVyLT5wdC55ID0geTsKKyAgICAgICAgICAgICAgICBzY2FubmVyLT5sbmJkID0gbG5iZDsKKyAgICAgICAgICAgICAgICBzY2FubmVyLT5pbWcgPSAoc2NoYXIgKikgaW1nOworICAgICAgICAgICAgICAgIHNjYW5uZXItPm5iZCA9IG5iZDsKKyAgICAgICAgICAgICAgICBjb250b3VyID0gbF9jaW5mby0+Y29udG91cjsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IENWX09LOworICAgICAgICAgICAgICAgIGdvdG8gZXhpdF9mdW5jOworICAgICAgICAgICAgICByZXN1bWVfc2NhbjoKKyAgICAgICAgICAgICAgICBwcmV2ID0gcDsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgbG5iZCAqLworICAgICAgICAgICAgICAgIGlmKCBwcmV2ICYgLTIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG5iZC54ID0geDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBwcmV2ICE9IHAgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGxvb3Agb24geCAqLworCisgICAgICAgIGxuYmQueCA9IDA7CisgICAgICAgIGxuYmQueSA9IHkgKyAxOworICAgICAgICB4ID0gMTsKKyAgICAgICAgcHJldiA9IDA7CisKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGxvb3Agb24geSAqLworCisgIGV4aXRfZnVuYzoKKworICAgIGlmKCByZXN1bHQgIT0gMCApCisgICAgICAgIGNvbnRvdXIgPSAwOworICAgIGlmKCByZXN1bHQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIHJlc3VsdCApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjb250b3VyOworfQorCisKKy8qCisgICBUaGUgZnVuY3Rpb24gYWRkIHRvIHRyZWUgdGhlIGxhc3QgcmV0cmlldmVkL3N1YnN0aXR1dGVkIGNvbnRvdXIsCisgICByZWxlYXNlcyB0ZW1wX3N0b3JhZ2UsIHJlc3RvcmVzIHN0YXRlIG9mIGRzdF9zdG9yYWdlIChpZiBuZWVkZWQpLCBhbmQKKyAgIHJldHVybnMgcG9pbnRlciB0byByb290IG9mIHRoZSBjb250b3VyIHRyZWUgKi8KK0NWX0lNUEwgQ3ZTZXEgKgorY3ZFbmRGaW5kQ29udG91cnMoIEN2Q29udG91clNjYW5uZXIgKiBfc2Nhbm5lciApCit7CisgICAgQ3ZDb250b3VyU2Nhbm5lciBzY2FubmVyOworICAgIEN2U2VxICpmaXJzdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZE5leHRDb250b3VyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFfc2Nhbm5lciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworICAgIHNjYW5uZXIgPSAqX3NjYW5uZXI7CisKKyAgICBpZiggc2Nhbm5lciApCisgICAgeworICAgICAgICBpY3ZFbmRQcm9jZXNzQ29udG91ciggc2Nhbm5lciApOworCisgICAgICAgIGlmKCBzY2FubmVyLT5zdG9yYWdlMSAhPSBzY2FubmVyLT5zdG9yYWdlMiApCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmKHNjYW5uZXItPnN0b3JhZ2UxKSApOworCisgICAgICAgIGlmKCBzY2FubmVyLT5jaW5mb19zdG9yYWdlICkKKyAgICAgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICYoc2Nhbm5lci0+Y2luZm9fc3RvcmFnZSkgKTsKKworICAgICAgICBmaXJzdCA9IHNjYW5uZXItPmZyYW1lLnZfbmV4dDsKKyAgICAgICAgY3ZGcmVlKCBfc2Nhbm5lciApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZmlyc3Q7Cit9CisKKworI2RlZmluZSBJQ1ZfU0lOR0xFICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJQ1ZfQ09OTkVDVElOR19BQk9WRSAgICAgICAgMQorI2RlZmluZSBJQ1ZfQ09OTkVDVElOR19CRUxPVyAgICAgICAgLTEKKyNkZWZpbmUgSUNWX0lTX0NPTVBPTkVOVF9QT0lOVCh2YWwpICgodmFsKSAhPSAwKQorCisjZGVmaW5lIENWX0dFVF9XUklUVEVOX0VMRU0oIHdyaXRlciApICgod3JpdGVyKS5wdHIgLSAod3JpdGVyKS5zZXEtPmVsZW1fc2l6ZSkKKwordHlwZWRlZiAgc3RydWN0IEN2TGlua2VkUnVuUG9pbnQKK3sKKyAgICBzdHJ1Y3QgQ3ZMaW5rZWRSdW5Qb2ludCogbGluazsKKyAgICBzdHJ1Y3QgQ3ZMaW5rZWRSdW5Qb2ludCogbmV4dDsKKyAgICBDdlBvaW50IHB0OworfQorQ3ZMaW5rZWRSdW5Qb2ludDsKKworCitzdGF0aWMgaW50CitpY3ZGaW5kQ29udG91cnNJbkludGVydmFsKCBjb25zdCBDdkFyciogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgLyppbnQgbWluVmFsdWUsIGludCBtYXhWYWx1ZSwqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiByZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udG91ckhlYWRlclNpemUgKQoreworICAgIGludCBjb3VudCA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlMDAgPSAwOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZTAxID0gMDsKKyAgICBDdlNlcSogZmlyc3QgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZGaW5kQ29udG91cnNJbkludGVydmFsIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGosIGssIG47CisKKyAgICB1Y2hhciogIHNyY19kYXRhID0gMDsKKyAgICBpbnQgIGltZ19zdGVwID0gMDsKKyAgICBDdlNpemUgIGltZ19zaXplOworCisgICAgaW50ICBjb25uZWN0X2ZsYWc7CisgICAgaW50ICBsb3dlcl90b3RhbDsKKyAgICBpbnQgIHVwcGVyX3RvdGFsOworICAgIGludCAgYWxsX3RvdGFsOworCisgICAgQ3ZTZXEqICBydW5zOworICAgIEN2TGlua2VkUnVuUG9pbnQgIHRtcDsKKyAgICBDdkxpbmtlZFJ1blBvaW50KiAgdG1wX3ByZXY7CisgICAgQ3ZMaW5rZWRSdW5Qb2ludCogIHVwcGVyX2xpbmUgPSAwOworICAgIEN2TGlua2VkUnVuUG9pbnQqICBsb3dlcl9saW5lID0gMDsKKyAgICBDdkxpbmtlZFJ1blBvaW50KiAgbGFzdF9lbGVtOworCisgICAgQ3ZMaW5rZWRSdW5Qb2ludCogIHVwcGVyX3J1biA9IDA7CisgICAgQ3ZMaW5rZWRSdW5Qb2ludCogIGxvd2VyX3J1biA9IDA7CisgICAgQ3ZMaW5rZWRSdW5Qb2ludCogIHByZXZfcG9pbnQgPSAwOworCisgICAgQ3ZTZXFXcml0ZXIgIHdyaXRlcl9leHQ7CisgICAgQ3ZTZXFXcml0ZXIgIHdyaXRlcl9pbnQ7CisgICAgQ3ZTZXFXcml0ZXIgIHdyaXRlcjsKKyAgICBDdlNlcVJlYWRlciAgcmVhZGVyOworCisgICAgQ3ZTZXEqIGV4dGVybmFsX2NvbnRvdXJzOworICAgIEN2U2VxKiBpbnRlcm5hbF9jb250b3VyczsKKyAgICBDdlNlcSogcHJldiA9IDA7CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgc3RvcmFnZSBwb2ludGVyIiApOworCisgICAgaWYoICFyZXN1bHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgZG91YmxlIEN2U2VxIHBvaW50ZXIiICk7CisKKyAgICBpZiggY29udG91ckhlYWRlclNpemUgPCAoaW50KXNpemVvZihDdkNvbnRvdXIpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkNvbnRvdXIgaGVhZGVyIHNpemUgbXVzdCBiZSA+PSBzaXplb2YoQ3ZDb250b3VyKSIgKTsKKworICAgIENWX0NBTEwoIHN0b3JhZ2UwMCA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKHN0b3JhZ2UpKTsKKyAgICBDVl9DQUxMKCBzdG9yYWdlMDEgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZShzdG9yYWdlKSk7CisKKyAgICB7CisgICAgICAgIEN2TWF0IHN0dWIsICptYXQ7CisKKyAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIHNyYywgJnN0dWIgKSk7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIobWF0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnB1dCBhcnJheSBtdXN0IGJlIDh1QzEgb3IgOHNDMSIgKTsKKyAgICAgICAgc3JjX2RhdGEgPSBtYXQtPmRhdGEucHRyOworICAgICAgICBpbWdfc3RlcCA9IG1hdC0+c3RlcDsKKyAgICAgICAgaW1nX3NpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0ZW1wb3Jhcnkgc2VxdWVuY2VzCisgICAgcnVucyA9IGN2Q3JlYXRlU2VxKDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdkxpbmtlZFJ1blBvaW50KSwgc3RvcmFnZTAwICk7CisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBydW5zLCAmd3JpdGVyICk7CisKKyAgICBjdlN0YXJ0V3JpdGVTZXEoIDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdkxpbmtlZFJ1blBvaW50KiksIHN0b3JhZ2UwMSwgJndyaXRlcl9leHQgKTsKKyAgICBjdlN0YXJ0V3JpdGVTZXEoIDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdkxpbmtlZFJ1blBvaW50KiksIHN0b3JhZ2UwMSwgJndyaXRlcl9pbnQgKTsKKworICAgIHRtcF9wcmV2ID0gJih0bXApOworICAgIHRtcF9wcmV2LT5uZXh0ID0gMDsKKyAgICB0bXBfcHJldi0+bGluayA9IDA7CisKKyAgICAvLyBGaXJzdCBsaW5lLiBOb25lIG9mIHJ1bnMgaXMgYmluZGVkCisgICAgdG1wLnB0LnkgPSAwOworICAgIGkgPSAwOworICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0bXAsIHdyaXRlciApOworICAgIHVwcGVyX2xpbmUgPSAoQ3ZMaW5rZWRSdW5Qb2ludCopQ1ZfR0VUX1dSSVRURU5fRUxFTSggd3JpdGVyICk7CisKKyAgICB0bXBfcHJldiA9IHVwcGVyX2xpbmU7CisgICAgZm9yKCBqID0gMDsgaiA8IGltZ19zaXplLndpZHRoOyApCisgICAgeworICAgICAgICBmb3IoIDsgaiA8IGltZ19zaXplLndpZHRoICYmICFJQ1ZfSVNfQ09NUE9ORU5UX1BPSU5UKHNyY19kYXRhW2pdKTsgaisrICkKKyAgICAgICAgICAgIDsKKyAgICAgICAgaWYoIGogPT0gaW1nX3NpemUud2lkdGggKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgdG1wLnB0LnggPSBqOworICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdG1wLCB3cml0ZXIgKTsKKyAgICAgICAgdG1wX3ByZXYtPm5leHQgPSAoQ3ZMaW5rZWRSdW5Qb2ludCopQ1ZfR0VUX1dSSVRURU5fRUxFTSggd3JpdGVyICk7CisgICAgICAgIHRtcF9wcmV2ID0gdG1wX3ByZXYtPm5leHQ7CisKKyAgICAgICAgZm9yKCA7IGogPCBpbWdfc2l6ZS53aWR0aCAmJiBJQ1ZfSVNfQ09NUE9ORU5UX1BPSU5UKHNyY19kYXRhW2pdKTsgaisrICkKKyAgICAgICAgICAgIDsKKworICAgICAgICB0bXAucHQueCA9IGotMTsKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRtcCwgd3JpdGVyICk7CisgICAgICAgIHRtcF9wcmV2LT5uZXh0ID0gKEN2TGlua2VkUnVuUG9pbnQqKUNWX0dFVF9XUklUVEVOX0VMRU0oIHdyaXRlciApOworICAgICAgICB0bXBfcHJldi0+bGluayA9IHRtcF9wcmV2LT5uZXh0OworICAgICAgICAvLyBGaXJzdCBwb2ludCBvZiBjb250b3VyCisgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0bXBfcHJldiwgd3JpdGVyX2V4dCApOworICAgICAgICB0bXBfcHJldiA9IHRtcF9wcmV2LT5uZXh0OworICAgIH0KKyAgICBjdkZsdXNoU2VxV3JpdGVyKCAmd3JpdGVyICk7CisgICAgdXBwZXJfbGluZSA9IHVwcGVyX2xpbmUtPm5leHQ7CisgICAgdXBwZXJfdG90YWwgPSBydW5zLT50b3RhbCAtIDE7CisgICAgbGFzdF9lbGVtID0gdG1wX3ByZXY7CisgICAgdG1wX3ByZXYtPm5leHQgPSAwOworCisgICAgZm9yKCBpID0gMTsgaSA8IGltZ19zaXplLmhlaWdodDsgaSsrICkKKyAgICB7CisvLy0tLS0tLS8vIEZpbmQgcnVucyBpbiBuZXh0IGxpbmUKKyAgICAgICAgc3JjX2RhdGEgKz0gaW1nX3N0ZXA7CisgICAgICAgIHRtcC5wdC55ID0gaTsKKyAgICAgICAgYWxsX3RvdGFsID0gcnVucy0+dG90YWw7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBpbWdfc2l6ZS53aWR0aDsgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIDsgaiA8IGltZ19zaXplLndpZHRoICYmICFJQ1ZfSVNfQ09NUE9ORU5UX1BPSU5UKHNyY19kYXRhW2pdKTsgaisrICkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZiggaiA9PSBpbWdfc2l6ZS53aWR0aCApIGJyZWFrOworCisgICAgICAgICAgICB0bXAucHQueCA9IGo7CisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdG1wLCB3cml0ZXIgKTsKKyAgICAgICAgICAgIHRtcF9wcmV2LT5uZXh0ID0gKEN2TGlua2VkUnVuUG9pbnQqKUNWX0dFVF9XUklUVEVOX0VMRU0oIHdyaXRlciApOworICAgICAgICAgICAgdG1wX3ByZXYgPSB0bXBfcHJldi0+bmV4dDsKKworICAgICAgICAgICAgZm9yKCA7IGogPCBpbWdfc2l6ZS53aWR0aCAmJiBJQ1ZfSVNfQ09NUE9ORU5UX1BPSU5UKHNyY19kYXRhW2pdKTsgaisrICkKKyAgICAgICAgICAgICAgICA7CisKKyAgICAgICAgICAgIHRtcC5wdC54ID0gai0xOworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRtcCwgd3JpdGVyICk7CisgICAgICAgICAgICB0bXBfcHJldiA9IHRtcF9wcmV2LT5uZXh0ID0gKEN2TGlua2VkUnVuUG9pbnQqKUNWX0dFVF9XUklUVEVOX0VMRU0oIHdyaXRlciApOworICAgICAgICB9Ly9qCisgICAgICAgIGN2Rmx1c2hTZXFXcml0ZXIoICZ3cml0ZXIgKTsKKyAgICAgICAgbG93ZXJfbGluZSA9IGxhc3RfZWxlbS0+bmV4dDsKKyAgICAgICAgbG93ZXJfdG90YWwgPSBydW5zLT50b3RhbCAtIGFsbF90b3RhbDsKKyAgICAgICAgbGFzdF9lbGVtID0gdG1wX3ByZXY7CisgICAgICAgIHRtcF9wcmV2LT5uZXh0ID0gMDsKKy8vLS0tLS0tLy8KKy8vLS0tLS0tLy8gRmluZCBsaW5rcyBiZXR3ZWVuIHJ1bnMgb2YgbG93ZXJfbGluZSBhbmQgdXBwZXJfbGluZQorICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9saW5lOworICAgICAgICBsb3dlcl9ydW4gPSBsb3dlcl9saW5lOworICAgICAgICBjb25uZWN0X2ZsYWcgPSBJQ1ZfU0lOR0xFOworCisgICAgICAgIGZvciggayA9IDAsIG4gPSAwOyBrIDwgdXBwZXJfdG90YWwvMiAmJiBuIDwgbG93ZXJfdG90YWwvMjsgKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIGNvbm5lY3RfZmxhZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIElDVl9TSU5HTEU6CisgICAgICAgICAgICAgICAgaWYoIHVwcGVyX3J1bi0+bmV4dC0+cHQueCA8IGxvd2VyX3J1bi0+bmV4dC0+cHQueCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggdXBwZXJfcnVuLT5uZXh0LT5wdC54ID49IGxvd2VyX3J1bi0+cHQueCAgLTEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9ydW4tPmxpbmsgPSB1cHBlcl9ydW47CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2ZsYWcgPSBJQ1ZfQ09OTkVDVElOR19BQk9WRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfcG9pbnQgPSB1cHBlcl9ydW4tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfcnVuLT5uZXh0LT5saW5rID0gdXBwZXJfcnVuOworICAgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgICAgICAgIHVwcGVyX3J1biA9IHVwcGVyX3J1bi0+bmV4dC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHVwcGVyX3J1bi0+cHQueCA8PSBsb3dlcl9ydW4tPm5leHQtPnB0LnggICsxICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfcnVuLT5saW5rID0gdXBwZXJfcnVuOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9mbGFnID0gSUNWX0NPTk5FQ1RJTkdfQkVMT1c7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3BvaW50ID0gbG93ZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfcnVuLT5saW5rID0gbG93ZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgcG9pbnQgb2YgY29udG91cgorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGxvd2VyX3J1biwgd3JpdGVyX2V4dCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG4rKzsKKyAgICAgICAgICAgICAgICAgICAgbG93ZXJfcnVuID0gbG93ZXJfcnVuLT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSUNWX0NPTk5FQ1RJTkdfQUJPVkU6CisgICAgICAgICAgICAgICAgaWYoIHVwcGVyX3J1bi0+cHQueCA+IGxvd2VyX3J1bi0+bmV4dC0+cHQueCArMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X3BvaW50LT5saW5rID0gbG93ZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2ZsYWcgPSBJQ1ZfU0lOR0xFOworICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgIGxvd2VyX3J1biA9IGxvd2VyX3J1bi0+bmV4dC0+bmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9wb2ludC0+bGluayA9IHVwcGVyX3J1bjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHVwcGVyX3J1bi0+bmV4dC0+cHQueCA8IGxvd2VyX3J1bi0+bmV4dC0+cHQueCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfcG9pbnQgPSB1cHBlcl9ydW4tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0X2ZsYWcgPSBJQ1ZfQ09OTkVDVElOR19CRUxPVzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfcG9pbnQgPSBsb3dlcl9ydW4tPm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgICAgICBsb3dlcl9ydW4gPSBsb3dlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIElDVl9DT05ORUNUSU5HX0JFTE9XOgorICAgICAgICAgICAgICAgIGlmKCBsb3dlcl9ydW4tPnB0LnggPiB1cHBlcl9ydW4tPm5leHQtPnB0LnggKzEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdXBwZXJfcnVuLT5uZXh0LT5saW5rID0gcHJldl9wb2ludDsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9mbGFnID0gSUNWX1NJTkdMRTsKKyAgICAgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHBvaW50IG9mIGNvbnRvdXIKKyAgICAgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGxvd2VyX3J1biwgd3JpdGVyX2ludCApOworCisgICAgICAgICAgICAgICAgICAgIGxvd2VyX3J1bi0+bGluayA9IHByZXZfcG9pbnQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCBsb3dlcl9ydW4tPm5leHQtPnB0LnggPCB1cHBlcl9ydW4tPm5leHQtPnB0LnggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBuKys7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3BvaW50ID0gbG93ZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJfcnVuID0gbG93ZXJfcnVuLT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdF9mbGFnID0gSUNWX0NPTk5FQ1RJTkdfQUJPVkU7CisgICAgICAgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3BvaW50ID0gdXBwZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXJfcnVuID0gdXBwZXJfcnVuLT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Ly8gaywgbgorCisgICAgICAgIGZvciggOyBuIDwgbG93ZXJfdG90YWwvMjsgbisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNvbm5lY3RfZmxhZyAhPSBJQ1ZfU0lOR0xFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3BvaW50LT5saW5rID0gbG93ZXJfcnVuLT5uZXh0OworICAgICAgICAgICAgICAgIGNvbm5lY3RfZmxhZyA9IElDVl9TSU5HTEU7CisgICAgICAgICAgICAgICAgbG93ZXJfcnVuID0gbG93ZXJfcnVuLT5uZXh0LT5uZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG93ZXJfcnVuLT5saW5rID0gbG93ZXJfcnVuLT5uZXh0OworCisgICAgICAgICAgICAvL0ZpcnN0IHBvaW50IG9mIGNvbnRvdXIKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBsb3dlcl9ydW4sIHdyaXRlcl9leHQgKTsKKworICAgICAgICAgICAgbG93ZXJfcnVuID0gbG93ZXJfcnVuLT5uZXh0LT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGsgPCB1cHBlcl90b3RhbC8yOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29ubmVjdF9mbGFnICE9IElDVl9TSU5HTEUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVwcGVyX3J1bi0+bmV4dC0+bGluayA9IHByZXZfcG9pbnQ7CisgICAgICAgICAgICAgICAgY29ubmVjdF9mbGFnID0gSUNWX1NJTkdMRTsKKyAgICAgICAgICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1cHBlcl9ydW4tPm5leHQtPmxpbmsgPSB1cHBlcl9ydW47CisgICAgICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgdXBwZXJfbGluZSA9IGxvd2VyX2xpbmU7CisgICAgICAgIHVwcGVyX3RvdGFsID0gbG93ZXJfdG90YWw7CisgICAgfS8vaQorCisgICAgdXBwZXJfcnVuID0gdXBwZXJfbGluZTsKKworICAgIC8vdGhlIGxhc3QgbGluZSBvZiBpbWFnZQorICAgIGZvciggayA9IDA7IGsgPCB1cHBlcl90b3RhbC8yOyBrKysgKQorICAgIHsKKyAgICAgICAgdXBwZXJfcnVuLT5uZXh0LT5saW5rID0gdXBwZXJfcnVuOworICAgICAgICB1cHBlcl9ydW4gPSB1cHBlcl9ydW4tPm5leHQtPm5leHQ7CisgICAgfQorCisvLy0tLS0tLS8vCisvLy0tLS0tLS8vRmluZCBlbmQgcmVhZCBjb250b3VycworICAgIGV4dGVybmFsX2NvbnRvdXJzID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlcl9leHQgKTsKKyAgICBpbnRlcm5hbF9jb250b3VycyA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXJfaW50ICk7CisKKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIEN2U2VxKiBjb250b3VycyA9IGsgPT0gMCA/IGV4dGVybmFsX2NvbnRvdXJzIDogaW50ZXJuYWxfY29udG91cnM7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIGNvbnRvdXJzLCAmcmVhZGVyICk7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbnRvdXJzLT50b3RhbDsgaisrLCBjb3VudCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZMaW5rZWRSdW5Qb2ludCogcF90ZW1wOworICAgICAgICAgICAgQ3ZMaW5rZWRSdW5Qb2ludCogcDAwOworICAgICAgICAgICAgQ3ZMaW5rZWRSdW5Qb2ludCogcDAxOworICAgICAgICAgICAgQ3ZTZXEqIGNvbnRvdXI7CisKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHAwMCwgcmVhZGVyICk7CisgICAgICAgICAgICBwMDEgPSBwMDA7CisKKyAgICAgICAgICAgIGlmKCAhcDAwLT5saW5rICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY3ZTdGFydFdyaXRlU2VxKCBDVl9TRVFfRUxUWVBFX1BPSU5UIHwgQ1ZfU0VRX1BPTFlMSU5FIHwgQ1ZfU0VRX0ZMQUdfQ0xPU0VELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250b3VySGVhZGVyU2l6ZSwgc2l6ZW9mKEN2UG9pbnQpLCBzdG9yYWdlLCAmd3JpdGVyICk7CisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwMDAtPnB0LCB3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICBwX3RlbXAgPSBwMDA7CisgICAgICAgICAgICAgICAgcDAwID0gcDAwLT5saW5rOworICAgICAgICAgICAgICAgIHBfdGVtcC0+bGluayA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggcDAwICE9IHAwMSApOworCisgICAgICAgICAgICBjb250b3VyID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgICAgICAgICAgY3ZCb3VuZGluZ1JlY3QoIGNvbnRvdXIsIDEgKTsKKworICAgICAgICAgICAgaWYoIGsgIT0gMCApCisgICAgICAgICAgICAgICAgY29udG91ci0+ZmxhZ3MgfD0gQ1ZfU0VRX0ZMQUdfSE9MRTsKKworICAgICAgICAgICAgaWYoICFmaXJzdCApCisgICAgICAgICAgICAgICAgcHJldiA9IGZpcnN0ID0gY29udG91cjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250b3VyLT5oX3ByZXYgPSBwcmV2OworICAgICAgICAgICAgICAgIHByZXYgPSBwcmV2LT5oX25leHQgPSBjb250b3VyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCAhZmlyc3QgKQorICAgICAgICBjb3VudCA9IC0xOworCisgICAgaWYoIHJlc3VsdCApCisgICAgICAgICpyZXN1bHQgPSBmaXJzdDsKKworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJnN0b3JhZ2UwMCk7CisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmc3RvcmFnZTAxKTsKKworICAgIHJldHVybiBjb3VudDsKK30KKworCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZGaW5kQ29udG91cnMKKy8vICAgIFB1cnBvc2U6CisvLyAgICAgIEZpbmRzIGFsbCB0aGUgY29udG91cnMgb24gdGhlIGJpLWxldmVsIGltYWdlLgorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIGltZyAgLSBzb3VyY2UgaW1hZ2UuCisvLyAgICAgICAgICAgICBOb24temVybyBwaXhlbHMgYXJlIGNvbnNpZGVyZWQgYXMgMS1waXhlbHMKKy8vICAgICAgICAgICAgIGFuZCB6ZXJvIHBpeGVscyBhcyAwLXBpeGVscy4KKy8vICAgICAgc3RlcCAtIGZ1bGwgd2lkdGggb2Ygc291cmNlIGltYWdlIGluIGJ5dGVzLgorLy8gICAgICBzaXplIC0gd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgaW1hZ2UgaW4gcGl4ZWxzCisvLyAgICAgIHN0b3JhZ2UgLSBwb2ludGVyIHRvIHN0b3JhZ2Ugd2hlcmUgd2lsbCB0aGUgb3V0cHV0IGNvbnRvdXJzIGJlIHBsYWNlZC4KKy8vICAgICAgaGVhZGVyX3NpemUgLSBoZWFkZXIgc2l6ZSBvZiByZXN1bHRpbmcgY29udG91cnMKKy8vICAgICAgbW9kZSAtIG1vZGUgb2YgY29udG91ciByZXRyaWV2YWwuCisvLyAgICAgIG1ldGhvZCAtIG1ldGhvZCBvZiBhcHByb3hpbWF0aW9uIHRoYXQgaXMgYXBwbGllZCB0byBjb250b3VycworLy8gICAgICBmaXJzdF9jb250b3VyIC0gcG9pbnRlciB0byBmaXJzdCBjb250b3VyIHBvaW50ZXIKKy8vICAgIFJldHVybnM6CisvLyAgICAgIENWX09LIG9yIGVycm9yIGNvZGUKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgaW50CitjdkZpbmRDb250b3Vycyggdm9pZCogIGltZywgIEN2TWVtU3RvcmFnZSogIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgQ3ZTZXEqKiAgZmlyc3RDb250b3VyLCBpbnQgIGNudEhlYWRlclNpemUsCisgICAgICAgICAgICAgICAgaW50ICBtb2RlLAorICAgICAgICAgICAgICAgIGludCAgbWV0aG9kLCBDdlBvaW50IG9mZnNldCApCit7CisgICAgQ3ZDb250b3VyU2Nhbm5lciBzY2FubmVyID0gMDsKKyAgICBDdlNlcSAqY29udG91ciA9IDA7CisgICAgaW50IGNvdW50ID0gLTE7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZENvbnRvdXJzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFmaXJzdENvbnRvdXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgZG91YmxlIEN2U2VxIHBvaW50ZXIiICk7CisKKyAgICBpZiggbWV0aG9kID09IENWX0xJTktfUlVOUyApCisgICAgeworICAgICAgICBpZiggb2Zmc2V0LnggIT0gMCB8fCBvZmZzZXQueSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgIk5vbnplcm8gb2Zmc2V0IGlzIG5vdCBzdXBwb3J0ZWQgaW4gQ1ZfTElOS19SVU5TIHlldCIgKTsKKworICAgICAgICBDVl9DQUxMKCBjb3VudCA9IGljdkZpbmRDb250b3Vyc0luSW50ZXJ2YWwoIGltZywgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q29udG91ciwgY250SGVhZGVyU2l6ZSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc2Nhbm5lciA9IGN2U3RhcnRGaW5kQ29udG91cnMoIGltZywgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudEhlYWRlclNpemUsIG1vZGUsIG1ldGhvZCwgb2Zmc2V0ICkpOworICAgICAgICBhc3NlcnQoIHNjYW5uZXIgKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgY29udG91ciA9IGN2RmluZE5leHRDb250b3VyKCBzY2FubmVyICk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGNvbnRvdXIgIT0gMCApOworCisgICAgICAgICpmaXJzdENvbnRvdXIgPSBjdkVuZEZpbmRDb250b3VycyggJnNjYW5uZXIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGNvdW50OworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2Y29udG91cnRyZWUuY3BwIGIvY3Yvc3JjL2N2Y29udG91cnRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZDk5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zjb250b3VydHJlZS5jcHAKQEAgLTAsMCArMSw4MDQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisjZGVmaW5lIENWX01BVENIX0NIRUNLKCBzdGF0dXMsIGN2RnVuICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdHVzID0gY3ZGdW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIHN0YXR1cyAhPSBDVl9PSyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIGdvdG8gTV9FTkQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RhdGljIEN2U3RhdHVzCitpY3ZDYWxjVHJpQXR0ciggY29uc3QgQ3ZTZXEgKiBjb250b3VyLCBDdlBvaW50IHQyLCBDdlBvaW50IHQxLCBpbnQgbjEsCisgICAgICAgICAgICAgICAgQ3ZQb2ludCB0MywgaW50IG4zLCBkb3VibGUgKnMsIGRvdWJsZSAqc19jLAorICAgICAgICAgICAgICAgIGRvdWJsZSAqaCwgZG91YmxlICphLCBkb3VibGUgKmIgKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDcmVhdGVDb250b3VyVHJlZQorLy8gICAgUHVycG9zZToKKy8vICAgIENyZWF0ZSBiaW5hcnkgdHJlZSByZXByZXNlbnRhdGlvbiBmb3IgdGhlIGNvbnRvdXIgCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgY29udG91ciAtIHBvaW50ZXIgdG8gaW5wdXQgY29udG91ciBvYmplY3QuCisvLyAgICAgIHN0b3JhZ2UgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0b3JhZ2UgYmxvY2sKKy8vICAgICAgdHJlZSAgIC0gIG91dHB1dCBwb2ludGVyIHRvIHRoZSBiaW5hcnkgdHJlZSByZXByZXNlbnRhdGlvbiAKKy8vICAgICAgdGhyZXNob2xkIC0gdGhyZXNob2xkIGZvciB0aGUgYmluYXJ5IHRyZWUgYnVpbGRpbmcgCisvLworLy9GKi8KK3N0YXRpYyBDdlN0YXR1cworaWN2Q3JlYXRlQ29udG91clRyZWUoIGNvbnN0IEN2U2VxICogY29udG91ciwgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBDdkNvbnRvdXJUcmVlICoqIHRyZWUsIGRvdWJsZSB0aHJlc2hvbGQgKQoreworICAgIEN2UG9pbnQgKnB0X3A7ICAgICAgICAgICAgICAvKiAgcG9pbnRlciB0byBwcmV2aW9zIHBvaW50cyAgICovCisgICAgQ3ZQb2ludCAqcHRfbjsgICAgICAgICAgICAgIC8qICBwb2ludGVyIHRvIG5leHQgcG9pbnRzICAgICAgKi8KKyAgICBDdlBvaW50ICpwdDEsICpwdDI7ICAgICAgICAgLyogIHBvaW50ZXIgdG8gY3VycmVudCBwb2ludHMgICAqLworCisgICAgQ3ZQb2ludCB0LCB0cDEsIHRwMiwgdHAzLCB0bjEsIHRuMiwgdG4zOworICAgIGludCBscHQsIGZsYWcsIGksIGosIGlfdHJlZSwgal8xLCBqXzMsIGlfYnVmOworICAgIGRvdWJsZSBzLCBzcDEsIHNwMiwgc24xLCBzbjIsIHNfYywgc3AxX2MsIHNwMl9jLCBzbjFfYywgc24yX2MsIGgsIGhwMSwgaHAyLCBobjEsIGhuMiwKKyAgICAgICAgYSwgYXAxLCBhcDIsIGFuMSwgYW4yLCBiLCBicDEsIGJwMiwgYm4xLCBibjI7CisgICAgZG91YmxlIGFfc19jLCBhX3NwMV9jOworCisgICAgX0N2VHJpYW5BdHRyICoqcHRyX3AsICoqcHRyX24sICoqcHRyMSwgKipwdHIyOyAgICAgIC8qICBwb2ludGVycyB0byBwb2ludGVycyBvZiB0cmlhbmdsZXMgICovCisgICAgX0N2VHJpYW5BdHRyICpjdXJfYWRyOworCisgICAgaW50ICpudW1fcCwgKm51bV9uLCAqbnVtMSwgKm51bTI7ICAgLyogICBudW1iZXJzIG9mIGlucHV0IGNvbnRvdXIgcG9pbnRzICAgKi8KKyAgICBpbnQgbm0sIG5tcDEsIG5tcDIsIG5tcDMsIG5tbjEsIG5tbjIsIG5tbjM7CisgICAgaW50IHNlcV9mbGFncyA9IDEsIGlfZW5kLCBwcmV2X251bGwsIHByZXYyX251bGw7CisgICAgZG91YmxlIGtvZWYgPSAxLjU7CisgICAgZG91YmxlIGVwcyA9IDEuZS03OworICAgIGRvdWJsZSBlOworICAgIEN2U3RhdHVzIHN0YXR1czsKKyAgICBpbnQgaGVhcmRlcl9zaXplOworICAgIF9DdlRyaWFuQXR0ciB0cmVlX29uZSwgdHJlZV90d28sICp0cmVlX2VuZCwgKnRyZWVfcm9vdDsKKworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKworICAgIGFzc2VydCggY29udG91ciAhPSBOVUxMICYmIGNvbnRvdXItPnRvdGFsID49IDQgKTsKKyAgICBzdGF0dXMgPSBDVl9PSzsKKworICAgIGlmKCBjb250b3VyID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIGNvbnRvdXItPnRvdGFsIDwgNCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT04oIGNvbnRvdXIgKSkKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworCisKKy8qICAgQ29udmVydCBTZXF1ZW5jZSB0byBhcnJheSAgICAqLworICAgIGxwdCA9IGNvbnRvdXItPnRvdGFsOworICAgIHB0X3AgPSBwdF9uID0gTlVMTDsKKyAgICBudW1fcCA9IG51bV9uID0gTlVMTDsKKyAgICBwdHJfcCA9IHB0cl9uID0gcHRyMSA9IHB0cjIgPSBOVUxMOworICAgIHRyZWVfZW5kID0gTlVMTDsKKworICAgIHB0X3AgPSAoQ3ZQb2ludCAqKSBjdkFsbG9jKCBscHQgKiBzaXplb2YoIEN2UG9pbnQgKSk7CisgICAgcHRfbiA9IChDdlBvaW50ICopIGN2QWxsb2MoIGxwdCAqIHNpemVvZiggQ3ZQb2ludCApKTsKKworICAgIG51bV9wID0gKGludCAqKSBjdkFsbG9jKCBscHQgKiBzaXplb2YoIGludCApKTsKKyAgICBudW1fbiA9IChpbnQgKikgY3ZBbGxvYyggbHB0ICogc2l6ZW9mKCBpbnQgKSk7CisKKyAgICBoZWFyZGVyX3NpemUgPSBzaXplb2YoIEN2Q29udG91clRyZWUgKTsKKyAgICBzZXFfZmxhZ3MgPSBDVl9TRVFfUE9MWUdPTl9UUkVFOworICAgIGN2U3RhcnRXcml0ZVNlcSggc2VxX2ZsYWdzLCBoZWFyZGVyX3NpemUsIHNpemVvZiggX0N2VHJpYW5BdHRyICksIHN0b3JhZ2UsICZ3cml0ZXIgKTsKKworICAgIHB0cl9wID0gKF9DdlRyaWFuQXR0ciAqKikgY3ZBbGxvYyggbHB0ICogc2l6ZW9mKCBfQ3ZUcmlhbkF0dHIgKiApKTsKKyAgICBwdHJfbiA9IChfQ3ZUcmlhbkF0dHIgKiopIGN2QWxsb2MoIGxwdCAqIHNpemVvZiggX0N2VHJpYW5BdHRyICogKSk7CisKKyAgICBtZW1zZXQoIHB0cl9wLCAwLCBscHQgKiBzaXplb2YoIF9DdlRyaWFuQXR0ciAqICkpOworICAgIG1lbXNldCggcHRyX24sIDAsIGxwdCAqIHNpemVvZiggX0N2VHJpYW5BdHRyICogKSk7CisKKyAgICBpZiggcHRfcCA9PSBOVUxMIHx8IHB0X24gPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgaWYoIHB0cl9wID09IE5VTEwgfHwgcHRyX24gPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisKKy8qICAgICB3cml0ZSBmaWxkIGZvciB0aGUgYmluYXJ5IHRyZWUgcm9vdCAgICovCisvKiAgc3RhcnRfd3JpdGVyID0gd3JpdGVyOyAgICovCisKKyAgICB0cmVlX29uZS5wdC54ID0gdHJlZV9vbmUucHQueSA9IDA7CisgICAgdHJlZV9vbmUuc2lnbiA9IDA7CisgICAgdHJlZV9vbmUuYXJlYSA9IDA7CisgICAgdHJlZV9vbmUucjEgPSB0cmVlX29uZS5yMiA9IDA7CisgICAgdHJlZV9vbmUubmV4dF92MSA9IHRyZWVfb25lLm5leHRfdjIgPSB0cmVlX29uZS5wcmV2X3YgPSBOVUxMOworCisgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRyZWVfb25lLCB3cml0ZXIgKTsKKyAgICB0cmVlX3Jvb3QgPSAoX0N2VHJpYW5BdHRyICopICh3cml0ZXIucHRyIC0gd3JpdGVyLnNlcS0+ZWxlbV9zaXplKTsKKworICAgIGlmKCBjdkN2dFNlcVRvQXJyYXkoIGNvbnRvdXIsIChjaGFyICopIHB0X3AgKSA9PSAoY2hhciAqKSBjb250b3VyICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFBPSU5UX0VSUjsKKworICAgIGZvciggaSA9IDA7IGkgPCBscHQ7IGkrKyApCisgICAgICAgIG51bV9wW2ldID0gaTsKKworICAgIGkgPSBscHQ7CisgICAgZmxhZyA9IDA7CisgICAgaV90cmVlID0gMDsKKyAgICBlID0gMjAuOyAgICAgICAgICAgICAgICAgICAgLyogIGluaXRpYWwgdGhyZXNob2xkIHZhbHVlICAgKi8KKyAgICBwdHIxID0gcHRyX3A7CisgICAgcHRyMiA9IHB0cl9uOworICAgIHB0MSA9IHB0X3A7CisgICAgcHQyID0gcHRfbjsKKyAgICBudW0xID0gbnVtX3A7CisgICAgbnVtMiA9IG51bV9uOworLyogIGJpbmFyeSB0cmVlIGNvbnN0cmFjdGlvbiAgICAqLworICAgIHdoaWxlKCBpID4gNCApCisgICAgeworICAgICAgICBpZiggZmxhZyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyMSA9IHB0cl9wOworICAgICAgICAgICAgcHRyMiA9IHB0cl9uOworICAgICAgICAgICAgcHQxID0gcHRfcDsKKyAgICAgICAgICAgIHB0MiA9IHB0X247CisgICAgICAgICAgICBudW0xID0gbnVtX3A7CisgICAgICAgICAgICBudW0yID0gbnVtX247CisgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cjEgPSBwdHJfbjsKKyAgICAgICAgICAgIHB0cjIgPSBwdHJfcDsKKyAgICAgICAgICAgIHB0MSA9IHB0X247CisgICAgICAgICAgICBwdDIgPSBwdF9wOworICAgICAgICAgICAgbnVtMSA9IG51bV9uOworICAgICAgICAgICAgbnVtMiA9IG51bV9wOworICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgdCA9IHB0MVswXTsKKyAgICAgICAgbm0gPSBudW0xWzBdOworICAgICAgICB0cDEgPSBwdDFbaSAtIDFdOworICAgICAgICBubXAxID0gbnVtMVtpIC0gMV07CisgICAgICAgIHRwMiA9IHB0MVtpIC0gMl07CisgICAgICAgIG5tcDIgPSBudW0xW2kgLSAyXTsKKyAgICAgICAgdHAzID0gcHQxW2kgLSAzXTsKKyAgICAgICAgbm1wMyA9IG51bTFbaSAtIDNdOworICAgICAgICB0bjEgPSBwdDFbMV07CisgICAgICAgIG5tbjEgPSBudW0xWzFdOworICAgICAgICB0bjIgPSBwdDFbMl07CisgICAgICAgIG5tbjIgPSBudW0xWzJdOworCisgICAgICAgIGlfYnVmID0gMDsKKyAgICAgICAgaV9lbmQgPSAtMTsKKyAgICAgICAgQ1ZfTUFUQ0hfQ0hFQ0soIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkNhbGNUcmlBdHRyKCBjb250b3VyLCB0LCB0cDEsIG5tcDEsIHRuMSwgbm1uMSwgJnMsICZzX2MsICZoLCAmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYiApKTsKKyAgICAgICAgQ1ZfTUFUQ0hfQ0hFQ0soIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkNhbGNUcmlBdHRyKCBjb250b3VyLCB0cDEsIHRwMiwgbm1wMiwgdCwgbm0sICZzcDEsICZzcDFfYywgJmhwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXAxLCAmYnAxICkpOworICAgICAgICBDVl9NQVRDSF9DSEVDSyggc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q2FsY1RyaUF0dHIoIGNvbnRvdXIsIHRwMiwgdHAzLCBubXAzLCB0cDEsIG5tcDEsICZzcDIsICZzcDJfYywgJmhwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXAyLCAmYnAyICkpOworICAgICAgICBDVl9NQVRDSF9DSEVDSyggc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q2FsY1RyaUF0dHIoIGNvbnRvdXIsIHRuMSwgdCwgbm0sIHRuMiwgbm1uMiwgJnNuMSwgJnNuMV9jLCAmaG4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbjEsICZibjEgKSk7CisKKworICAgICAgICBqXzMgPSAzOworICAgICAgICBwcmV2X251bGwgPSBwcmV2Ml9udWxsID0gMDsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGk7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRuMyA9IHB0MVtqXzNdOworICAgICAgICAgICAgbm1uMyA9IG51bTFbal8zXTsKKyAgICAgICAgICAgIGlmKCBqID09IDAgKQorICAgICAgICAgICAgICAgIGpfMSA9IGkgLSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGpfMSA9IGogLSAxOworCisgICAgICAgICAgICBDVl9NQVRDSF9DSEVDSyggc3RhdHVzLCBpY3ZDYWxjVHJpQXR0ciggY29udG91ciwgdG4yLCB0bjEsIG5tbjEsIHRuMywgbm1uMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc24yLCAmc24yX2MsICZobjIsICZhbjIsICZibjIgKSk7CisKKyAgICAgICAgICAgIGlmKCAoc19jIDwgc3AxX2MgJiYgc19jIDwgc3AyX2MgJiYgc19jIDw9IHNuMV9jICYmIHNfYyA8PSBzbjJfYyAmJiBzX2MgPCBlKSB8fAorICAgICAgICAgICAgICAgICgoKHNfYyA9PSBzcDFfYyAmJiBzX2MgPD0gc3AyX2MpIHx8IChzX2MgPT0gc3AyX2MgJiYgc19jIDw9IHNwMV9jKSkgJiYKKyAgICAgICAgICAgICAgICBzX2MgPD0gc24xX2MgJiYgc19jIDw9IHNuMl9jICYmIHNfYyA8IGUgJiYgaiA+IDEgJiYgcHJldjJfbnVsbCA9PSAwKSB8fAorICAgICAgICAgICAgICAgIChzX2MgPCBlcHMgJiYgaiA+IDAgJiYgcHJldl9udWxsID09IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X251bGwgPSBwcmV2Ml9udWxsID0gMTsKKyAgICAgICAgICAgICAgICBpZiggc19jIDwgdGhyZXNob2xkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwdHIxW2pfMV0gPT0gTlVMTCAmJiBwdHIxW2pdID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaV9idWYgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIyW2lfYnVmIC0gMV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlfZW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKy8qICAgZm9ybSBuZXh0IHZlcnRleCAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVfb25lLnB0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVfb25lLnNpZ24gPSAoY2hhcikgKENWX1NJR04oIHMgKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX29uZS5yMSA9IGggLyBhOworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUucjIgPSBiIC8gYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyZWVfb25lLmFyZWEgPSBmYWJzKCBzICk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX29uZS5uZXh0X3YxID0gcHRyMVtqXzFdOworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUubmV4dF92MiA9IHB0cjFbal07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0cmVlX29uZSwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfYWRyID0gKF9DdlRyaWFuQXR0ciAqKSAod3JpdGVyLnB0ciAtIHdyaXRlci5zZXEtPmVsZW1fc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwdHIxW2pfMV0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyMVtqXzFdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHB0cjFbal0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyMVtqXS0+cHJldl92ID0gY3VyX2FkcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlfYnVmID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyMltpX2J1ZiAtIDFdID0gY3VyX2FkcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmVlX2VuZCA9IChfQ3ZUcmlhbkF0dHIgKikgd3JpdGVyLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpX2VuZCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpX3RyZWUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisvKiAgIGZvcm0gbmV4dCB2ZXJ0ZXggICAgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRyZWVfb25lLnB0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUuc2lnbiA9IChjaGFyKSAoQ1ZfU0lHTiggcyApKTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUuYXJlYSA9IGZhYnMoIHMgKTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUucjEgPSBoIC8gYTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUucjIgPSBiIC8gYTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUubmV4dF92MSA9IHB0cjFbal8xXTsKKyAgICAgICAgICAgICAgICAgICAgdHJlZV9vbmUubmV4dF92MiA9IHB0cjFbal07CisKKyAgICAgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRyZWVfb25lLCB3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2FkciA9IChfQ3ZUcmlhbkF0dHIgKikgKHdyaXRlci5wdHIgLSB3cml0ZXIuc2VxLT5lbGVtX3NpemUpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBwdHIxW2pfMV0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICBwdHIxW2pfMV0tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwdHIxW2pdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgcHRyMVtqXS0+cHJldl92ID0gY3VyX2FkcjsKKworICAgICAgICAgICAgICAgICAgICBpZiggaV9idWYgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cjJbaV9idWYgLSAxXSA9IGN1cl9hZHI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJlZV9lbmQgPSBjdXJfYWRyOworICAgICAgICAgICAgICAgICAgICAgICAgaV9lbmQgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlfdHJlZSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKy8qICAgdGhlIGN1cnJlbnQgdHJpYW5nbGUgaXMnbm90IExNSUFUICAgICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJldl9udWxsID0gMDsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHByZXYyX251bGwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Ml9udWxsID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Ml9udWxsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBqICE9IGkgLSAxIHx8IGlfZW5kID09IC0xICkKKyAgICAgICAgICAgICAgICAgICAgcHRyMltpX2J1Zl0gPSBwdHIxW2pdOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGlfZW5kID09IDAgKQorICAgICAgICAgICAgICAgICAgICBwdHIyW2lfYnVmXSA9IE5VTEw7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwdHIyW2lfYnVmXSA9IHRyZWVfZW5kOworICAgICAgICAgICAgICAgIHB0MltpX2J1Zl0gPSB0OworICAgICAgICAgICAgICAgIG51bTJbaV9idWZdID0gbnVtMVtqXTsKKyAgICAgICAgICAgICAgICBpX2J1ZisrOworICAgICAgICAgICAgfQorLyogICAgZ28gdG8gbmV4dCB2ZXJ0ZXggICAgKi8KKyAgICAgICAgICAgIHRwMyA9IHRwMjsKKyAgICAgICAgICAgIHRwMiA9IHRwMTsKKyAgICAgICAgICAgIHRwMSA9IHQ7CisgICAgICAgICAgICB0ID0gdG4xOworICAgICAgICAgICAgdG4xID0gdG4yOworICAgICAgICAgICAgdG4yID0gdG4zOworICAgICAgICAgICAgbm1wMyA9IG5tcDI7CisgICAgICAgICAgICBubXAyID0gbm1wMTsKKyAgICAgICAgICAgIG5tcDEgPSBubTsKKyAgICAgICAgICAgIG5tID0gbm1uMTsKKyAgICAgICAgICAgIG5tbjEgPSBubW4yOworICAgICAgICAgICAgbm1uMiA9IG5tbjM7CisKKyAgICAgICAgICAgIHNwMiA9IHNwMTsKKyAgICAgICAgICAgIHNwMSA9IHM7CisgICAgICAgICAgICBzID0gc24xOworICAgICAgICAgICAgc24xID0gc24yOworICAgICAgICAgICAgc3AyX2MgPSBzcDFfYzsKKyAgICAgICAgICAgIHNwMV9jID0gc19jOworICAgICAgICAgICAgc19jID0gc24xX2M7CisgICAgICAgICAgICBzbjFfYyA9IHNuMl9jOworCisgICAgICAgICAgICBhcDIgPSBhcDE7CisgICAgICAgICAgICBhcDEgPSBhOworICAgICAgICAgICAgYSA9IGFuMTsKKyAgICAgICAgICAgIGFuMSA9IGFuMjsKKyAgICAgICAgICAgIGJwMiA9IGJwMTsKKyAgICAgICAgICAgIGJwMSA9IGI7CisgICAgICAgICAgICBiID0gYm4xOworICAgICAgICAgICAgYm4xID0gYm4yOworICAgICAgICAgICAgaHAyID0gaHAxOworICAgICAgICAgICAgaHAxID0gaDsKKyAgICAgICAgICAgIGggPSBobjE7CisgICAgICAgICAgICBobjEgPSBobjI7CisgICAgICAgICAgICBqXzMrKzsKKyAgICAgICAgICAgIGlmKCBqXzMgPj0gaSApCisgICAgICAgICAgICAgICAgal8zID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGkgPSBpX2J1ZjsKKyAgICAgICAgZSA9IGUgKiBrb2VmOworICAgIH0KKworLyogIGNvbnN0cmFjdCB0cmVlIHJvb3QgICovCisgICAgaWYoIGkgIT0gNCApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgdCA9IHB0MlswXTsKKyAgICB0bjEgPSBwdDJbMV07CisgICAgdG4yID0gcHQyWzJdOworICAgIHRwMSA9IHB0MlszXTsKKyAgICBubSA9IG51bTJbMF07CisgICAgbm1uMSA9IG51bTJbMV07CisgICAgbm1uMiA9IG51bTJbMl07CisgICAgbm1wMSA9IG51bTJbM107CisvKiAgIGZpcnN0IHBhaXIgb2YgdGhlIHRyaWFuZ2xlcyAgICovCisgICAgQ1ZfTUFUQ0hfQ0hFQ0soIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgaWN2Q2FsY1RyaUF0dHIoIGNvbnRvdXIsIHQsIHRwMSwgbm1wMSwgdG4xLCBubW4xLCAmcywgJnNfYywgJmgsICZhLCAmYiApKTsKKyAgICBDVl9NQVRDSF9DSEVDSyggc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBpY3ZDYWxjVHJpQXR0ciggY29udG91ciwgdG4yLCB0bjEsIG5tbjEsIHRwMSwgbm1wMSwgJnNuMiwgJnNuMl9jLCAmaG4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFuMiwgJmJuMiApKTsKKy8qICAgc2Vjb25kIHBhaXIgb2YgdGhlIHRyaWFuZ2xlcyAgICovCisgICAgQ1ZfTUFUQ0hfQ0hFQ0soIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgaWN2Q2FsY1RyaUF0dHIoIGNvbnRvdXIsIHRuMSwgdCwgbm0sIHRuMiwgbm1uMiwgJnNuMSwgJnNuMV9jLCAmaG4xLCAmYW4xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJuMSApKTsKKyAgICBDVl9NQVRDSF9DSEVDSyggc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBpY3ZDYWxjVHJpQXR0ciggY29udG91ciwgdHAxLCB0bjIsIG5tbjIsIHQsIG5tLCAmc3AxLCAmc3AxX2MsICZocDEsICZhcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnAxICkpOworCisgICAgYV9zX2MgPSBmYWJzKCBzX2MgLSBzbjJfYyApOworICAgIGFfc3AxX2MgPSBmYWJzKCBzcDFfYyAtIHNuMV9jICk7CisKKyAgICBpZiggYV9zX2MgPiBhX3NwMV9jICkKKy8qICAgZm9ybSBjaGlsZCB2ZXJ0ZXhzIGZvciB0aGUgcm9vdCAgICAgKi8KKyAgICB7CisgICAgICAgIHRyZWVfb25lLnB0ID0gdDsKKyAgICAgICAgdHJlZV9vbmUuc2lnbiA9IChjaGFyKSAoQ1ZfU0lHTiggcyApKTsKKyAgICAgICAgdHJlZV9vbmUuYXJlYSA9IGZhYnMoIHMgKTsKKyAgICAgICAgdHJlZV9vbmUucjEgPSBoIC8gYTsKKyAgICAgICAgdHJlZV9vbmUucjIgPSBiIC8gYTsKKyAgICAgICAgdHJlZV9vbmUubmV4dF92MSA9IHB0cjJbM107CisgICAgICAgIHRyZWVfb25lLm5leHRfdjIgPSBwdHIyWzBdOworCisgICAgICAgIHRyZWVfdHdvLnB0ID0gdG4yOworICAgICAgICB0cmVlX3R3by5zaWduID0gKGNoYXIpIChDVl9TSUdOKCBzbjIgKSk7CisgICAgICAgIHRyZWVfdHdvLmFyZWEgPSBmYWJzKCBzbjIgKTsKKyAgICAgICAgdHJlZV90d28ucjEgPSBobjIgLyBhbjI7CisgICAgICAgIHRyZWVfdHdvLnIyID0gYm4yIC8gYW4yOworICAgICAgICB0cmVlX3R3by5uZXh0X3YxID0gcHRyMlsxXTsKKyAgICAgICAgdHJlZV90d28ubmV4dF92MiA9IHB0cjJbMl07CisKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRyZWVfb25lLCB3cml0ZXIgKTsKKyAgICAgICAgY3VyX2FkciA9IChfQ3ZUcmlhbkF0dHIgKikgKHdyaXRlci5wdHIgLSB3cml0ZXIuc2VxLT5lbGVtX3NpemUpOworCisgICAgICAgIGlmKCBzX2MgPiBzbjJfYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwdHIyWzNdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHB0cjJbM10tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICBpZiggcHRyMlswXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzBdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgcHRyMVswXSA9IGN1cl9hZHI7CisKKyAgICAgICAgICAgIGlfdHJlZSsrOworCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdHJlZV90d28sIHdyaXRlciApOworICAgICAgICAgICAgY3VyX2FkciA9IChfQ3ZUcmlhbkF0dHIgKikgKHdyaXRlci5wdHIgLSB3cml0ZXIuc2VxLT5lbGVtX3NpemUpOworCisgICAgICAgICAgICBpZiggcHRyMlsxXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzFdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgaWYoIHB0cjJbMl0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcHRyMlsyXS0+cHJldl92ID0gY3VyX2FkcjsKKyAgICAgICAgICAgIHB0cjFbMV0gPSBjdXJfYWRyOworCisgICAgICAgICAgICBpX3RyZWUrKzsKKworICAgICAgICAgICAgcHQxWzBdID0gdHAxOworICAgICAgICAgICAgcHQxWzFdID0gdG4xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRyZWVfdHdvLCB3cml0ZXIgKTsKKyAgICAgICAgICAgIGN1cl9hZHIgPSAoX0N2VHJpYW5BdHRyICopICh3cml0ZXIucHRyIC0gd3JpdGVyLnNlcS0+ZWxlbV9zaXplKTsKKworICAgICAgICAgICAgaWYoIHB0cjJbMV0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcHRyMlsxXS0+cHJldl92ID0gY3VyX2FkcjsKKyAgICAgICAgICAgIGlmKCBwdHIyWzJdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHB0cjJbMl0tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICBwdHIxWzBdID0gY3VyX2FkcjsKKworICAgICAgICAgICAgaV90cmVlKys7CisKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0cmVlX29uZSwgd3JpdGVyICk7CisgICAgICAgICAgICBjdXJfYWRyID0gKF9DdlRyaWFuQXR0ciAqKSAod3JpdGVyLnB0ciAtIHdyaXRlci5zZXEtPmVsZW1fc2l6ZSk7CisKKyAgICAgICAgICAgIGlmKCBwdHIyWzNdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHB0cjJbM10tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICBpZiggcHRyMlswXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzBdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgcHRyMVsxXSA9IGN1cl9hZHI7CisKKyAgICAgICAgICAgIGlfdHJlZSsrOworCisgICAgICAgICAgICBwdDFbMF0gPSB0bjE7CisgICAgICAgICAgICBwdDFbMV0gPSB0cDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdHJlZV9vbmUucHQgPSB0cDE7CisgICAgICAgIHRyZWVfb25lLnNpZ24gPSAoY2hhcikgKENWX1NJR04oIHNwMSApKTsKKyAgICAgICAgdHJlZV9vbmUuYXJlYSA9IGZhYnMoIHNwMSApOworICAgICAgICB0cmVlX29uZS5yMSA9IGhwMSAvIGFwMTsKKyAgICAgICAgdHJlZV9vbmUucjIgPSBicDEgLyBhcDE7CisgICAgICAgIHRyZWVfb25lLm5leHRfdjEgPSBwdHIyWzJdOworICAgICAgICB0cmVlX29uZS5uZXh0X3YyID0gcHRyMlszXTsKKworICAgICAgICB0cmVlX3R3by5wdCA9IHRuMTsKKyAgICAgICAgdHJlZV90d28uc2lnbiA9IChjaGFyKSAoQ1ZfU0lHTiggc24xICkpOworICAgICAgICB0cmVlX3R3by5hcmVhID0gZmFicyggc24xICk7CisgICAgICAgIHRyZWVfdHdvLnIxID0gaG4xIC8gYW4xOworICAgICAgICB0cmVlX3R3by5yMiA9IGJuMSAvIGFuMTsKKyAgICAgICAgdHJlZV90d28ubmV4dF92MSA9IHB0cjJbMF07CisgICAgICAgIHRyZWVfdHdvLm5leHRfdjIgPSBwdHIyWzFdOworCisgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0cmVlX29uZSwgd3JpdGVyICk7CisgICAgICAgIGN1cl9hZHIgPSAoX0N2VHJpYW5BdHRyICopICh3cml0ZXIucHRyIC0gd3JpdGVyLnNlcS0+ZWxlbV9zaXplKTsKKworICAgICAgICBpZiggc3AxX2MgPiBzbjFfYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwdHIyWzJdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHB0cjJbMl0tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICBpZiggcHRyMlszXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzNdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgcHRyMVswXSA9IGN1cl9hZHI7CisKKyAgICAgICAgICAgIGlfdHJlZSsrOworCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdHJlZV90d28sIHdyaXRlciApOworICAgICAgICAgICAgY3VyX2FkciA9IChfQ3ZUcmlhbkF0dHIgKikgKHdyaXRlci5wdHIgLSB3cml0ZXIuc2VxLT5lbGVtX3NpemUpOworCisgICAgICAgICAgICBpZiggcHRyMlswXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzBdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgaWYoIHB0cjJbMV0gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcHRyMlsxXS0+cHJldl92ID0gY3VyX2FkcjsKKyAgICAgICAgICAgIHB0cjFbMV0gPSBjdXJfYWRyOworCisgICAgICAgICAgICBpX3RyZWUrKzsKKworICAgICAgICAgICAgcHQxWzBdID0gdG4yOworICAgICAgICAgICAgcHQxWzFdID0gdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0cmVlX3R3bywgd3JpdGVyICk7CisgICAgICAgICAgICBjdXJfYWRyID0gKF9DdlRyaWFuQXR0ciAqKSAod3JpdGVyLnB0ciAtIHdyaXRlci5zZXEtPmVsZW1fc2l6ZSk7CisKKyAgICAgICAgICAgIGlmKCBwdHIyWzBdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHB0cjJbMF0tPnByZXZfdiA9IGN1cl9hZHI7CisgICAgICAgICAgICBpZiggcHRyMlsxXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzFdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgcHRyMVswXSA9IGN1cl9hZHI7CisKKyAgICAgICAgICAgIGlfdHJlZSsrOworCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdHJlZV9vbmUsIHdyaXRlciApOworICAgICAgICAgICAgY3VyX2FkciA9IChfQ3ZUcmlhbkF0dHIgKikgKHdyaXRlci5wdHIgLSB3cml0ZXIuc2VxLT5lbGVtX3NpemUpOworCisgICAgICAgICAgICBpZiggcHRyMlsyXSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBwdHIyWzJdLT5wcmV2X3YgPSBjdXJfYWRyOworICAgICAgICAgICAgaWYoIHB0cjJbM10gIT0gTlVMTCApCisgICAgICAgICAgICAgICAgcHRyMlszXS0+cHJldl92ID0gY3VyX2FkcjsKKyAgICAgICAgICAgIHB0cjFbMV0gPSBjdXJfYWRyOworCisgICAgICAgICAgICBpX3RyZWUrKzsKKworICAgICAgICAgICAgcHQxWzBdID0gdDsKKyAgICAgICAgICAgIHB0MVsxXSA9IHRuMjsKKworICAgICAgICB9CisgICAgfQorCisvKiAgICBmb3JtIHJvb3QgICAqLworICAgIHMgPSBjdkNvbnRvdXJBcmVhKCBjb250b3VyICk7CisKKyAgICB0cmVlX3Jvb3QtPnB0ID0gcHQxWzFdOworICAgIHRyZWVfcm9vdC0+c2lnbiA9IDA7CisgICAgdHJlZV9yb290LT5hcmVhID0gZmFicyggcyApOworICAgIHRyZWVfcm9vdC0+cjEgPSAwOworICAgIHRyZWVfcm9vdC0+cjIgPSAwOworICAgIHRyZWVfcm9vdC0+bmV4dF92MSA9IHB0cjFbMF07CisgICAgdHJlZV9yb290LT5uZXh0X3YyID0gcHRyMVsxXTsKKyAgICB0cmVlX3Jvb3QtPnByZXZfdiA9IE5VTEw7CisKKyAgICBwdHIxWzBdLT5wcmV2X3YgPSAoX0N2VHJpYW5BdHRyICopIHRyZWVfcm9vdDsKKyAgICBwdHIxWzFdLT5wcmV2X3YgPSAoX0N2VHJpYW5BdHRyICopIHRyZWVfcm9vdDsKKworLyogICAgIHdyaXRlIGJpbmFyeSB0cmVlIHJvb3QgICAqLworLyogICAgQ1ZfV1JJVEVfU0VRX0VMRU0gKHRyZWVfb25lLCBzdGFydF93cml0ZXIpOyAgICovCisgICAgaV90cmVlKys7CisvKiAgY3JlYXRlIFNlcXVlbmNlIGhlYXJkZXIgICAgICovCisgICAgKigoQ3ZTZXEgKiopIHRyZWUpID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworLyogICB3cml0ZSBwb2ludHMgZm9yIHRoZSBtYWluIHNlZ21lbnQgaW50byBzZXF1ZW5jZSBoZWFkZXIgICAqLworICAgICgqdHJlZSktPnAxID0gcHQxWzBdOworCisgIE1fRU5EOgorCisgICAgY3ZGcmVlKCAmcHRyX24gKTsKKyAgICBjdkZyZWUoICZwdHJfcCApOworICAgIGN2RnJlZSggJm51bV9uICk7CisgICAgY3ZGcmVlKCAmbnVtX3AgKTsKKyAgICBjdkZyZWUoICZwdF9uICk7CisgICAgY3ZGcmVlKCAmcHRfcCApOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKyB0cmlhbmdsZSBhdHRyaWJ1dGVzIGNhbGN1bGF0aW9ucyAKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkNhbGNUcmlBdHRyKCBjb25zdCBDdlNlcSAqIGNvbnRvdXIsIEN2UG9pbnQgdDIsIEN2UG9pbnQgdDEsIGludCBuMSwKKyAgICAgICAgICAgICAgICBDdlBvaW50IHQzLCBpbnQgbjMsIGRvdWJsZSAqcywgZG91YmxlICpzX2MsCisgICAgICAgICAgICAgICAgZG91YmxlICpoLCBkb3VibGUgKmEsIGRvdWJsZSAqYiApCit7CisgICAgZG91YmxlIHgxMywgeTEzLCB4MTIsIHkxMiwgbF9iYXNlLCBueCwgbnksIHFxOworICAgIGRvdWJsZSBlcHMgPSAxLmUtNTsKKworICAgIHgxMyA9IHQzLnggLSB0MS54OworICAgIHkxMyA9IHQzLnkgLSB0MS55OworICAgIHgxMiA9IHQyLnggLSB0MS54OworICAgIHkxMiA9IHQyLnkgLSB0MS55OworICAgIHFxID0geDEzICogeDEzICsgeTEzICogeTEzOworICAgIGxfYmFzZSA9IGN2U3FydCggKGZsb2F0KSAocXEpICk7CisgICAgaWYoIGxfYmFzZSA+IGVwcyApCisgICAgeworICAgICAgICBueCA9IHkxMyAvIGxfYmFzZTsKKyAgICAgICAgbnkgPSAteDEzIC8gbF9iYXNlOworCisgICAgICAgICpoID0gbnggKiB4MTIgKyBueSAqIHkxMjsKKworICAgICAgICAqcyA9ICgqaCkgKiBsX2Jhc2UgLyAyLjsKKworICAgICAgICAqYiA9IG54ICogeTEyIC0gbnkgKiB4MTI7CisKKyAgICAgICAgKmEgPSBsX2Jhc2U7CisvKiAgIGNhbGN1bGF0ZSBpbnRlcmNlcHRpdmUgYXJlYSAgICovCisgICAgICAgICpzX2MgPSBjdkNvbnRvdXJBcmVhKCBjb250b3VyLCBjdlNsaWNlKG4xLCBuMysxKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpoID0gMDsKKyAgICAgICAgKnMgPSAwOworICAgICAgICAqc19jID0gMDsKKyAgICAgICAgKmIgPSAwOworICAgICAgICAqYSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2Q3JlYXRlQ29udG91clRyZWUKKy8vICAgIFB1cnBvc2U6CisvLyAgICBDcmVhdGUgYmluYXJ5IHRyZWUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjb250b3VyIAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIGNvbnRvdXIgLSBwb2ludGVyIHRvIGlucHV0IGNvbnRvdXIgb2JqZWN0LgorLy8gICAgICBzdG9yYWdlIC0gcG9pbnRlciB0byB0aGUgY3VycmVudCBzdG9yYWdlIGJsb2NrCisvLyAgICAgIHRyZWUgICAtICBvdXRwdXQgcG9pbnRlciB0byB0aGUgYmluYXJ5IHRyZWUgcmVwcmVzZW50YXRpb24gCisvLyAgICAgIHRocmVzaG9sZCAtIHRocmVzaG9sZCBmb3IgdGhlIGJpbmFyeSB0cmVlIGJ1aWxkaW5nIAorLy8KKy8vRiovCitDVl9JTVBMIEN2Q29udG91clRyZWUqCitjdkNyZWF0ZUNvbnRvdXJUcmVlKCBjb25zdCBDdlNlcSogY29udG91ciwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBkb3VibGUgdGhyZXNob2xkICkKK3sKKyAgICBDdkNvbnRvdXJUcmVlKiB0cmVlID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlQ29udG91clRyZWUiICk7CisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZDcmVhdGVDb250b3VyVHJlZSggY29udG91ciwgc3RvcmFnZSwgJnRyZWUsIHRocmVzaG9sZCApKTsKKworICAgIF9fQ0xFQU5VUF9fOworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gdHJlZTsKK30KKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkNvbnRvdXJGcm9tQ29udG91clRyZWUKKy8vICAgIFB1cnBvc2U6CisvLyAgICByZWNvbnN0cmFjdHMgY29udG91ciBmcm9tIGJpbmFyeSB0cmVlIHJlcHJlc2VudGF0aW9uICAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICB0cmVlICAgLSAgcG9pbnRlciB0byB0aGUgaW5wdXQgYmluYXJ5IHRyZWUgcmVwcmVzZW50YXRpb24gCisvLyAgICAgIHN0b3JhZ2UgLSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHN0b3JhZ2UgYmxvY2sKKy8vICAgICAgY29udG91ciAtIHBvaW50ZXIgdG8gb3V0cHV0IGNvbnRvdXIgb2JqZWN0LgorLy8gICAgICBjcml0ZXJpYSAtIGNyaXRlcmlhIGZvciB0aGUgZGVmaW5pdGlvbiB0aHJlc2hvbGQgdmFsdWUKKy8vICAgICAgICAgICAgICAgICBmb3IgdGhlIGNvbnRvdXIgcmVjb25zdHJhY3RpbmcgKGxldmVsIG9yIHByZWNpc2lvbikKKy8vRiovCitDVl9JTVBMIEN2U2VxKgorY3ZDb250b3VyRnJvbUNvbnRvdXJUcmVlKCBjb25zdCBDdkNvbnRvdXJUcmVlKiAgdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiAgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgIGNyaXRlcmlhICkKK3sKKyAgICBDdlNlcSogY29udG91ciA9IDA7CisgICAgX0N2VHJpYW5BdHRyICoqcHRyX2J1ZiA9IDA7ICAgICAvKiAgcG9pbnRlciB0byB0aGUgcG9pbnRlcidzIGJ1ZmZlciAgKi8KKyAgICBpbnQgKmxldmVsX2J1ZiA9IDA7CisgICAgaW50IGlfYnVmOworCisgICAgaW50IGxwdDsKKyAgICBkb3VibGUgYXJlYV9hbGw7CisgICAgZG91YmxlIHRocmVzaG9sZDsKKyAgICBpbnQgY3VyX2xldmVsOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgc2VxX2ZsYWdzOworICAgIGNoYXIgbG9nX2l0ZXIsIGxvZ19lcHM7CisgICAgaW50IG91dF9oZWFyZGVyX3NpemU7CisgICAgX0N2VHJpYW5BdHRyICp0cmVlX29uZSA9IDAsIHRyZWVfcm9vdDsgIC8qICBjdXJyZW50IHZlcnRleCAgKi8KKworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZDb250b3VyRnJvbUNvbnRvdXJUcmVlIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXRyZWUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT05fVFJFRSggdHJlZSApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFERkxBR19FUlIgKTsKKworICAgIGNyaXRlcmlhID0gY3ZDaGVja1Rlcm1Dcml0ZXJpYSggY3JpdGVyaWEsIDAuLCAxMDAgKTsKKworICAgIGxwdCA9IHRyZWUtPnRvdGFsOworICAgIHB0cl9idWYgPSBOVUxMOworICAgIGxldmVsX2J1ZiA9IE5VTEw7CisgICAgaV9idWYgPSAwOworICAgIGN1cl9sZXZlbCA9IDA7CisgICAgbG9nX2l0ZXIgPSAoY2hhcikgKGNyaXRlcmlhLnR5cGUgPT0gQ1ZfVEVSTUNSSVRfSVRFUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAoY3JpdGVyaWEudHlwZSA9PSBDVl9URVJNQ1JJVF9JVEVSICsgQ1ZfVEVSTUNSSVRfRVBTKSk7CisgICAgbG9nX2VwcyA9IChjaGFyKSAoY3JpdGVyaWEudHlwZSA9PSBDVl9URVJNQ1JJVF9FUFMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAoY3JpdGVyaWEudHlwZSA9PSBDVl9URVJNQ1JJVF9JVEVSICsgQ1ZfVEVSTUNSSVRfRVBTKSk7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxICopIHRyZWUsICZyZWFkZXIsIDAgKTsKKworICAgIG91dF9oZWFyZGVyX3NpemUgPSBzaXplb2YoIEN2Q29udG91ciApOworCisgICAgc2VxX2ZsYWdzID0gQ1ZfU0VRX1BPTFlHT047CisgICAgY3ZTdGFydFdyaXRlU2VxKCBzZXFfZmxhZ3MsIG91dF9oZWFyZGVyX3NpemUsIHNpemVvZiggQ3ZQb2ludCApLCBzdG9yYWdlLCAmd3JpdGVyICk7CisKKyAgICBwdHJfYnVmID0gKF9DdlRyaWFuQXR0ciAqKikgY3ZBbGxvYyggbHB0ICogc2l6ZW9mKCBfQ3ZUcmlhbkF0dHIgKiApKTsKKyAgICBpZiggcHRyX2J1ZiA9PSBOVUxMICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX09VVE9GTUVNX0VSUiApOworICAgIGlmKCBsb2dfaXRlciApCisgICAgeworICAgICAgICBsZXZlbF9idWYgPSAoaW50ICopIGN2QWxsb2MoIGxwdCAqIChzaXplb2YoIGludCApKSk7CisKKyAgICAgICAgaWYoIGxldmVsX2J1ZiA9PSBOVUxMICkKKyAgICAgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9PVVRPRk1FTV9FUlIgKTsKKyAgICB9CisKKyAgICBtZW1zZXQoIHB0cl9idWYsIDAsIGxwdCAqIHNpemVvZiggX0N2VHJpYW5BdHRyICogKSk7CisKKy8qICAgICB3cml0ZSB0aGUgZmlyc3QgdHJlZSByb290J3MgcG9pbnQgYXMgYSBzdGFydCBwb2ludCBvZiB0aGUgcmVzdWx0IGNvbnRvdXIgICovCisgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHRyZWUtPnAxLCB3cml0ZXIgKTsKKy8qICAgICB3cml0ZSB0aGUgc2Vjb25kIHRyZWUgcm9vdCJzIHBvaW50IGludG8gYnVmZmVyICAgICovCisKKy8qICAgICByZWFkIHRoZSByb290IG9mIHRoZSB0cmVlICAgKi8KKyAgICBDVl9SRUFEX1NFUV9FTEVNKCB0cmVlX3Jvb3QsIHJlYWRlciApOworCisgICAgdHJlZV9vbmUgPSAmdHJlZV9yb290OworICAgIGFyZWFfYWxsID0gdHJlZV9vbmUtPmFyZWE7CisKKyAgICBpZiggbG9nX2VwcyApCisgICAgICAgIHRocmVzaG9sZCA9IGNyaXRlcmlhLmVwc2lsb24gKiBhcmVhX2FsbDsKKyAgICBlbHNlCisgICAgICAgIHRocmVzaG9sZCA9IDEwICogYXJlYV9hbGw7CisKKyAgICBpZiggbG9nX2l0ZXIgKQorICAgICAgICBsZXZlbCA9IGNyaXRlcmlhLm1heF9pdGVyOworICAgIGVsc2UKKyAgICAgICAgbGV2ZWwgPSAtMTsKKworLyogIGNvbnRvdXIgZnJvbSBiaW5hcnkgdHJlZSBjb25zdHJhY3Rpb24gICAgKi8KKyAgICB3aGlsZSggaV9idWYgPj0gMCApCisgICAgeworICAgICAgICBpZiggdHJlZV9vbmUgIT0gTlVMTCAmJiAoY3VyX2xldmVsIDw9IGxldmVsIHx8IHRyZWVfb25lLT5hcmVhID49IHRocmVzaG9sZCkgKQorLyogICBnbyB0byBsZWZ0IHN1YiB0cmVlIGZvciB0aGUgdmVydGV4IGFuZCBzYXZlIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IHZlcnRleCAgICovCisvKiAgIGludG8gdGhlIGJ1ZmZlciAgICAgKi8KKyAgICAgICAgeworICAgICAgICAgICAgcHRyX2J1ZltpX2J1Zl0gPSB0cmVlX29uZTsKKyAgICAgICAgICAgIGlmKCBsb2dfaXRlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGV2ZWxfYnVmW2lfYnVmXSA9IGN1cl9sZXZlbDsKKyAgICAgICAgICAgICAgICBjdXJfbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlfYnVmKys7CisgICAgICAgICAgICB0cmVlX29uZSA9IHRyZWVfb25lLT5uZXh0X3YxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaV9idWYtLTsKKyAgICAgICAgICAgIGlmKCBpX2J1ZiA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlBvaW50IHB0ID0gcHRyX2J1ZltpX2J1Zl0tPnB0OworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgdHJlZV9vbmUgPSBwdHJfYnVmW2lfYnVmXS0+bmV4dF92MjsKKyAgICAgICAgICAgICAgICBpZiggbG9nX2l0ZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3VyX2xldmVsID0gbGV2ZWxfYnVmW2lfYnVmXSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgY29udG91ciA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKyAgICBjdkJvdW5kaW5nUmVjdCggY29udG91ciwgMSApOworCisgICAgX19DTEVBTlVQX187CisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJmxldmVsX2J1ZiApOworICAgIGN2RnJlZSggJnB0cl9idWYgKTsKKworICAgIHJldHVybiBjb250b3VyOworfQorCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zjb252aHVsbC5jcHAgYi9jdi9zcmMvY3Zjb252aHVsbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFmYzU2OAotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmNvbnZodWxsLmNwcApAQCAtMCwwICsxLDg1MSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworc3RhdGljIGludAoraWN2U2tsYW5za3lfMzJzKCBDdlBvaW50KiogYXJyYXksIGludCBzdGFydCwgaW50IGVuZCwgaW50KiBzdGFjaywgaW50IG5zaWduLCBpbnQgc2lnbjIgKQoreworICAgIGludCBpbmNyID0gZW5kID4gc3RhcnQgPyAxIDogLTE7CisgICAgLyogcHJlcGFyZSBmaXJzdCB0cmlhbmdsZSAqLworICAgIGludCBwcHJldiA9IHN0YXJ0LCBwY3VyID0gcHByZXYgKyBpbmNyLCBwbmV4dCA9IHBjdXIgKyBpbmNyOworICAgIGludCBzdGFja3NpemUgPSAzOworCisgICAgaWYoIHN0YXJ0ID09IGVuZCB8fAorICAgICAgICAoYXJyYXlbc3RhcnRdLT54ID09IGFycmF5W2VuZF0tPnggJiYKKyAgICAgICAgIGFycmF5W3N0YXJ0XS0+eSA9PSBhcnJheVtlbmRdLT55KSApCisgICAgeworICAgICAgICBzdGFja1swXSA9IHN0YXJ0OworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGFja1swXSA9IHBwcmV2OworICAgIHN0YWNrWzFdID0gcGN1cjsKKyAgICBzdGFja1syXSA9IHBuZXh0OworCisgICAgZW5kICs9IGluY3I7IC8qIG1ha2UgZW5kID0gYWZ0ZXJlbmQgKi8KKworICAgIHdoaWxlKCBwbmV4dCAhPSBlbmQgKQorICAgIHsKKyAgICAgICAgLyogY2hlY2sgdGhlIGFuZ2xlIHAxLHAyLHAzICovCisgICAgICAgIGludCBjdXJ5ID0gYXJyYXlbcGN1cl0tPnk7CisgICAgICAgIGludCBuZXh0eSA9IGFycmF5W3BuZXh0XS0+eTsKKyAgICAgICAgaW50IGJ5ID0gbmV4dHkgLSBjdXJ5OworCisgICAgICAgIGlmKCBDVl9TSUdOKGJ5KSAhPSBuc2lnbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBheCA9IGFycmF5W3BjdXJdLT54IC0gYXJyYXlbcHByZXZdLT54OworICAgICAgICAgICAgaW50IGJ4ID0gYXJyYXlbcG5leHRdLT54IC0gYXJyYXlbcGN1cl0tPng7CisgICAgICAgICAgICBpbnQgYXkgPSBjdXJ5IC0gYXJyYXlbcHByZXZdLT55OworICAgICAgICAgICAgaW50IGNvbnZleGl0eSA9IGF5KmJ4IC0gYXgqYnk7LyogaWYgPjAgdGhlbiBjb252ZXggYW5nbGUgKi8KKworICAgICAgICAgICAgaWYoIENWX1NJR04oY29udmV4aXR5KSA9PSBzaWduMiAmJiAoYXggIT0gMCB8fCBheSAhPSAwKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHByZXYgPSBwY3VyOworICAgICAgICAgICAgICAgIHBjdXIgPSBwbmV4dDsKKyAgICAgICAgICAgICAgICBwbmV4dCArPSBpbmNyOworICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrc2l6ZV0gPSBwbmV4dDsKKyAgICAgICAgICAgICAgICBzdGFja3NpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggcHByZXYgPT0gc3RhcnQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcGN1ciA9IHBuZXh0OworICAgICAgICAgICAgICAgICAgICBzdGFja1sxXSA9IHBjdXI7CisgICAgICAgICAgICAgICAgICAgIHBuZXh0ICs9IGluY3I7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrWzJdID0gcG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrW3N0YWNrc2l6ZS0yXSA9IHBuZXh0OworICAgICAgICAgICAgICAgICAgICBwY3VyID0gcHByZXY7CisgICAgICAgICAgICAgICAgICAgIHBwcmV2ID0gc3RhY2tbc3RhY2tzaXplLTRdOworICAgICAgICAgICAgICAgICAgICBzdGFja3NpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwbmV4dCArPSBpbmNyOworICAgICAgICAgICAgc3RhY2tbc3RhY2tzaXplLTFdID0gcG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLS1zdGFja3NpemU7Cit9CisKKworc3RhdGljIGludAoraWN2U2tsYW5za3lfMzJmKCBDdlBvaW50MkQzMmYqKiBhcnJheSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQqIHN0YWNrLCBpbnQgbnNpZ24sIGludCBzaWduMiApCit7CisgICAgaW50IGluY3IgPSBlbmQgPiBzdGFydCA/IDEgOiAtMTsKKyAgICAvKiBwcmVwYXJlIGZpcnN0IHRyaWFuZ2xlICovCisgICAgaW50IHBwcmV2ID0gc3RhcnQsIHBjdXIgPSBwcHJldiArIGluY3IsIHBuZXh0ID0gcGN1ciArIGluY3I7CisgICAgaW50IHN0YWNrc2l6ZSA9IDM7CisKKyAgICBpZiggc3RhcnQgPT0gZW5kIHx8CisgICAgICAgIChhcnJheVtzdGFydF0tPnggPT0gYXJyYXlbZW5kXS0+eCAmJgorICAgICAgICAgYXJyYXlbc3RhcnRdLT55ID09IGFycmF5W2VuZF0tPnkpICkKKyAgICB7CisgICAgICAgIHN0YWNrWzBdID0gc3RhcnQ7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHN0YWNrWzBdID0gcHByZXY7CisgICAgc3RhY2tbMV0gPSBwY3VyOworICAgIHN0YWNrWzJdID0gcG5leHQ7CisKKyAgICBlbmQgKz0gaW5jcjsgLyogbWFrZSBlbmQgPSBhZnRlcmVuZCAqLworCisgICAgd2hpbGUoIHBuZXh0ICE9IGVuZCApCisgICAgeworICAgICAgICAvKiBjaGVjayB0aGUgYW5nbGUgcDEscDIscDMgKi8KKyAgICAgICAgZmxvYXQgY3VyeSA9IGFycmF5W3BjdXJdLT55OworICAgICAgICBmbG9hdCBuZXh0eSA9IGFycmF5W3BuZXh0XS0+eTsKKyAgICAgICAgZmxvYXQgYnkgPSBuZXh0eSAtIGN1cnk7CisKKyAgICAgICAgaWYoIENWX1NJR04oIGJ5ICkgIT0gbnNpZ24gKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBheCA9IGFycmF5W3BjdXJdLT54IC0gYXJyYXlbcHByZXZdLT54OworICAgICAgICAgICAgZmxvYXQgYnggPSBhcnJheVtwbmV4dF0tPnggLSBhcnJheVtwY3VyXS0+eDsKKyAgICAgICAgICAgIGZsb2F0IGF5ID0gY3VyeSAtIGFycmF5W3BwcmV2XS0+eTsKKyAgICAgICAgICAgIGZsb2F0IGNvbnZleGl0eSA9IGF5KmJ4IC0gYXgqYnk7LyogaWYgPjAgdGhlbiBjb252ZXggYW5nbGUgKi8KKworICAgICAgICAgICAgaWYoIENWX1NJR04oIGNvbnZleGl0eSApID09IHNpZ24yICYmIChheCAhPSAwIHx8IGF5ICE9IDApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcHJldiA9IHBjdXI7CisgICAgICAgICAgICAgICAgcGN1ciA9IHBuZXh0OworICAgICAgICAgICAgICAgIHBuZXh0ICs9IGluY3I7CisgICAgICAgICAgICAgICAgc3RhY2tbc3RhY2tzaXplXSA9IHBuZXh0OworICAgICAgICAgICAgICAgIHN0YWNrc2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBwcHJldiA9PSBzdGFydCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwY3VyID0gcG5leHQ7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrWzFdID0gcGN1cjsKKyAgICAgICAgICAgICAgICAgICAgcG5leHQgKz0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tbMl0gPSBwbmV4dDsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGFja1tzdGFja3NpemUtMl0gPSBwbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgcGN1ciA9IHBwcmV2OworICAgICAgICAgICAgICAgICAgICBwcHJldiA9IHN0YWNrW3N0YWNrc2l6ZS00XTsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tzaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcG5leHQgKz0gaW5jcjsKKyAgICAgICAgICAgIHN0YWNrW3N0YWNrc2l6ZS0xXSA9IHBuZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIC0tc3RhY2tzaXplOworfQorCit0eXBlZGVmIGludCAoKnNrbGFuc2t5X2Z1bmMpKCBDdlBvaW50KiogcG9pbnRzLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YWNrLCBpbnQgc2lnbiwgaW50IHNpZ24yICk7CisKKyNkZWZpbmUgY21wX3B0cyggcHQxLCBwdDIgKSAgXAorICAgICgocHQxKS0+eCA8IChwdDIpLT54IHx8ICgocHQxKS0+eCA8PSAocHQyKS0+eCAmJiAocHQxKS0+eSA8IChwdDIpLT55KSkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlQoIGljdlNvcnRQb2ludHNCeVBvaW50ZXJzXzMycywgQ3ZQb2ludCosIGNtcF9wdHMgKQorc3RhdGljIENWX0lNUExFTUVOVF9RU09SVCggaWN2U29ydFBvaW50c0J5UG9pbnRlcnNfMzJmLCBDdlBvaW50MkQzMmYqLCBjbXBfcHRzICkKKworc3RhdGljIHZvaWQKK2ljdkNhbGNBbmRXcml0ZVB0SW5kaWNlcyggQ3ZQb2ludCoqIHBvaW50ZXIsIGludCogc3RhY2ssIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIHB0c2VxLCBDdlNlcVdyaXRlciogd3JpdGVyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkNhbGNBbmRXcml0ZVB0SW5kaWNlcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBpbmNyID0gc3RhcnQgPCBlbmQgPyAxIDogLTE7CisgICAgaW50IGlkeCwgZmlyc3RfaWR4ID0gcHRzZXEtPmZpcnN0LT5zdGFydF9pbmRleDsKKworICAgIGZvciggaSA9IHN0YXJ0OyBpICE9IGVuZDsgaSArPSBpbmNyICkKKyAgICB7CisgICAgICAgIEN2UG9pbnQqIHB0ciA9IChDdlBvaW50Kilwb2ludGVyW3N0YWNrW2ldXTsKKyAgICAgICAgQ3ZTZXFCbG9jayogYmxvY2sgPSBwdHNlcS0+Zmlyc3Q7CisgICAgICAgIHdoaWxlKCAodW5zaWduZWQpKGlkeCA9IChpbnQpKHB0ciAtIChDdlBvaW50KilibG9jay0+ZGF0YSkpID49ICh1bnNpZ25lZClibG9jay0+Y291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgaWYoIGJsb2NrID09IHB0c2VxLT5maXJzdCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiSW50ZXJuYWwgZXJyb3IiICk7CisgICAgICAgIH0KKyAgICAgICAgaWR4ICs9IGJsb2NrLT5zdGFydF9pbmRleCAtIGZpcnN0X2lkeDsKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGlkeCwgKndyaXRlciApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCBDdlNlcSoKK2N2Q29udmV4SHVsbDIoIGNvbnN0IEN2QXJyKiBhcnJheSwgdm9pZCogaHVsbF9zdG9yYWdlLAorICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uLCBpbnQgcmV0dXJuX3BvaW50cyApCit7CisgICAgdW5pb24geyBDdkNvbnRvdXIqIGM7IEN2U2VxKiBzOyB9IGh1bGw7CisgICAgQ3ZQb2ludCoqIHBvaW50ZXIgPSAwOworICAgIEN2UG9pbnQyRDMyZioqIHBvaW50ZXJmID0gMDsKKyAgICBpbnQqIHN0YWNrID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb252ZXhIdWxsMiIgKTsKKworICAgIGh1bGwucyA9IDA7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCogbWF0ID0gMDsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyOworICAgIEN2Q29udG91ciBjb250b3VyX2hlYWRlcjsKKyAgICB1bmlvbiB7IEN2Q29udG91ciBjOyBDdlNlcSBzOyB9IGh1bGxfaGVhZGVyOworICAgIEN2U2VxQmxvY2sgYmxvY2ssIGh1bGxibG9jazsKKyAgICBDdlNlcSogcHRzZXEgPSAwOworICAgIEN2U2VxKiBodWxsc2VxID0gMDsKKyAgICBpbnQgaXNfZmxvYXQ7CisgICAgaW50KiB0X3N0YWNrOworICAgIGludCB0X2NvdW50OworICAgIGludCBpLCBtaW55X2luZCA9IDAsIG1heHlfaW5kID0gMCwgdG90YWw7CisgICAgaW50IGh1bGx0eXBlOworICAgIGludCBzdG9wX2lkeDsKKyAgICBza2xhbnNreV9mdW5jIHNrbGFuc2t5OworCisgICAgaWYoIENWX0lTX1NFUSggYXJyYXkgKSkKKyAgICB7CisgICAgICAgIHB0c2VxID0gKEN2U2VxKilhcnJheTsKKyAgICAgICAgaWYoICFDVl9JU19TRVFfUE9JTlRfU0VUKCBwdHNlcSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVuc3VwcG9ydGVkIHNlcXVlbmNlIHR5cGUiICk7CisgICAgICAgIGlmKCBodWxsX3N0b3JhZ2UgPT0gMCApCisgICAgICAgICAgICBodWxsX3N0b3JhZ2UgPSBwdHNlcS0+c3RvcmFnZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcHRzZXEgPSBjdlBvaW50U2VxRnJvbU1hdCgKKyAgICAgICAgICAgIENWX1NFUV9LSU5EX0dFTkVSSUMsIGFycmF5LCAmY29udG91cl9oZWFkZXIsICZibG9jayApKTsKKyAgICB9CisKKyAgICBpZiggQ1ZfSVNfU1RPUkFHRSggaHVsbF9zdG9yYWdlICkpCisgICAgeworICAgICAgICBpZiggcmV0dXJuX3BvaW50cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGh1bGxzZXEgPSBjdkNyZWF0ZVNlcSgKKyAgICAgICAgICAgICAgICBDVl9TRVFfS0lORF9DVVJWRXxDVl9TRVFfRUxUWVBFKHB0c2VxKXwKKyAgICAgICAgICAgICAgICBDVl9TRVFfRkxBR19DTE9TRUR8Q1ZfU0VRX0ZMQUdfQ09OVkVYLAorICAgICAgICAgICAgICAgIHNpemVvZihDdkNvbnRvdXIpLCBzaXplb2YoQ3ZQb2ludCksKEN2TWVtU3RvcmFnZSopaHVsbF9zdG9yYWdlICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggaHVsbHNlcSA9IGN2Q3JlYXRlU2VxKAorICAgICAgICAgICAgICAgIENWX1NFUV9LSU5EX0NVUlZFfENWX1NFUV9FTFRZUEVfUFBPSU5UfAorICAgICAgICAgICAgICAgIENWX1NFUV9GTEFHX0NMT1NFRHxDVl9TRVFfRkxBR19DT05WRVgsCisgICAgICAgICAgICAgICAgc2l6ZW9mKEN2Q29udG91ciksIHNpemVvZihDdlBvaW50KiksIChDdk1lbVN0b3JhZ2UqKWh1bGxfc3RvcmFnZSApKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVCggaHVsbF9zdG9yYWdlICkpCisgICAgICAgICAgICBDVl9FUlJPUihDVl9TdHNCYWRBcmcsICJEZXN0aW5hdGlvbiBtdXN0IGJlIHZhbGlkIG1lbW9yeSBzdG9yYWdlIG9yIG1hdHJpeCIpOworCisgICAgICAgIG1hdCA9IChDdk1hdCopaHVsbF9zdG9yYWdlOworCisgICAgICAgIGlmKCAobWF0LT5jb2xzICE9IDEgJiYgbWF0LT5yb3dzICE9IDEpIHx8ICFDVl9JU19NQVRfQ09OVChtYXQtPnR5cGUpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUaGUgaHVsbCBtYXRyaXggc2hvdWxkIGJlIGNvbnRpbnVvdXMgYW5kIGhhdmUgYSBzaW5nbGUgcm93IG9yIGEgc2luZ2xlIGNvbHVtbiIgKTsKKworICAgICAgICBpZiggbWF0LT5jb2xzICsgbWF0LT5yb3dzIC0gMSA8IHB0c2VxLT50b3RhbCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBodWxsIG1hdHJpeCBzaXplIG1pZ2h0IGJlIG5vdCBlbm91Z2ggdG8gZml0IHRoZSBodWxsIiApOworCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShtYXQtPnR5cGUpICE9IENWX1NFUV9FTFRZUEUocHRzZXEpICYmCisgICAgICAgICAgICBDVl9NQVRfVFlQRShtYXQtPnR5cGUpICE9IENWXzMyU0MxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJUaGUgaHVsbCBtYXRyaXggbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgaW5wdXQgb3IgMzJzQzEgKGludGVnZXJzKSIgKTsKKworICAgICAgICBDVl9DQUxMKCBodWxsc2VxID0gY3ZNYWtlU2VxSGVhZGVyRm9yQXJyYXkoCisgICAgICAgICAgICBDVl9TRVFfS0lORF9DVVJWRXxDVl9NQVRfVFlQRShtYXQtPnR5cGUpfENWX1NFUV9GTEFHX0NMT1NFRCwKKyAgICAgICAgICAgIHNpemVvZihjb250b3VyX2hlYWRlciksIENWX0VMRU1fU0laRShtYXQtPnR5cGUpLCBtYXQtPmRhdGEucHRyLAorICAgICAgICAgICAgbWF0LT5jb2xzICsgbWF0LT5yb3dzIC0gMSwgJmh1bGxfaGVhZGVyLnMsICZodWxsYmxvY2sgKSk7CisKKyAgICAgICAgY3ZDbGVhclNlcSggaHVsbHNlcSApOworICAgIH0KKworICAgIHRvdGFsID0gcHRzZXEtPnRvdGFsOworICAgIGlmKCB0b3RhbCA9PSAwICkKKyAgICB7CisgICAgICAgIGlmKCBtYXQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICAgICAiUG9pbnQgc2VxdWVuY2UgY2FuIG5vdCBiZSBlbXB0eSBpZiB0aGUgb3V0cHV0IGlzIG1hdHJpeCIgKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIGh1bGxzZXEsICZ3cml0ZXIgKTsKKworICAgIGlzX2Zsb2F0ID0gQ1ZfU0VRX0VMVFlQRShwdHNlcSkgPT0gQ1ZfMzJGQzI7CisgICAgaHVsbHR5cGUgPSBDVl9TRVFfRUxUWVBFKGh1bGxzZXEpOworICAgIHNrbGFuc2t5ID0gIWlzX2Zsb2F0ID8gKHNrbGFuc2t5X2Z1bmMpaWN2U2tsYW5za3lfMzJzIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChza2xhbnNreV9mdW5jKWljdlNrbGFuc2t5XzMyZjsKKworICAgIENWX0NBTEwoIHBvaW50ZXIgPSAoQ3ZQb2ludCoqKWN2QWxsb2MoIHB0c2VxLT50b3RhbCpzaXplb2YocG9pbnRlclswXSkgKSk7CisgICAgQ1ZfQ0FMTCggc3RhY2sgPSAoaW50KiljdkFsbG9jKCAocHRzZXEtPnRvdGFsICsgMikqc2l6ZW9mKHN0YWNrWzBdKSApKTsKKyAgICBwb2ludGVyZiA9IChDdlBvaW50MkQzMmYqKilwb2ludGVyOworCisgICAgY3ZTdGFydFJlYWRTZXEoIHB0c2VxLCAmcmVhZGVyICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgeworICAgICAgICBwb2ludGVyW2ldID0gKEN2UG9pbnQqKXJlYWRlci5wdHI7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHB0c2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIC8vIHNvcnQgdGhlIHBvaW50IHNldCBieSB4LWNvb3JkaW5hdGUsIGZpbmQgbWluIGFuZCBtYXggeQorICAgIGlmKCAhaXNfZmxvYXQgKQorICAgIHsKKyAgICAgICAgaWN2U29ydFBvaW50c0J5UG9pbnRlcnNfMzJzKCBwb2ludGVyLCB0b3RhbCwgMCApOworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB5ID0gcG9pbnRlcltpXS0+eTsKKyAgICAgICAgICAgIGlmKCBwb2ludGVyW21pbnlfaW5kXS0+eSA+IHkgKQorICAgICAgICAgICAgICAgIG1pbnlfaW5kID0gaTsKKyAgICAgICAgICAgIGlmKCBwb2ludGVyW21heHlfaW5kXS0+eSA8IHkgKQorICAgICAgICAgICAgICAgIG1heHlfaW5kID0gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpY3ZTb3J0UG9pbnRzQnlQb2ludGVyc18zMmYoIHBvaW50ZXJmLCB0b3RhbCwgMCApOworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHkgPSBwb2ludGVyZltpXS0+eTsKKyAgICAgICAgICAgIGlmKCBwb2ludGVyZlttaW55X2luZF0tPnkgPiB5ICkKKyAgICAgICAgICAgICAgICBtaW55X2luZCA9IGk7CisgICAgICAgICAgICBpZiggcG9pbnRlcmZbbWF4eV9pbmRdLT55IDwgeSApCisgICAgICAgICAgICAgICAgbWF4eV9pbmQgPSBpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHBvaW50ZXJbMF0tPnggPT0gcG9pbnRlclt0b3RhbC0xXS0+eCAmJgorICAgICAgICBwb2ludGVyWzBdLT55ID09IHBvaW50ZXJbdG90YWwtMV0tPnkgKQorICAgIHsKKyAgICAgICAgaWYoIGh1bGx0eXBlID09IENWX1NFUV9FTFRZUEVfUFBPSU5UICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHBvaW50ZXJbMF0sIHdyaXRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGh1bGx0eXBlID09IENWX1NFUV9FTFRZUEVfSU5ERVggKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGluZGV4LCB3cml0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQgcHQgPSBwb2ludGVyWzBdWzBdOworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHB0LCB3cml0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBnb3RvIGZpbmlzaF9odWxsOworICAgIH0KKworICAgIC8qdXBwZXIgaGFsZiAqLworICAgIHsKKyAgICAgICAgaW50ICp0bF9zdGFjayA9IHN0YWNrOworICAgICAgICBpbnQgdGxfY291bnQgPSBza2xhbnNreSggcG9pbnRlciwgMCwgbWF4eV9pbmQsIHRsX3N0YWNrLCAtMSwgMSApOworICAgICAgICBpbnQgKnRyX3N0YWNrID0gdGxfc3RhY2sgKyB0bF9jb3VudDsKKyAgICAgICAgaW50IHRyX2NvdW50ID0gc2tsYW5za3koIHBvaW50ZXIsIHB0c2VxLT50b3RhbCAtIDEsIG1heHlfaW5kLCB0cl9zdGFjaywgLTEsIC0xICk7CisKKyAgICAgICAgLyogZ2F0aGVyIHVwcGVyIHBhcnQgb2YgY29udmV4IGh1bGwgdG8gb3V0cHV0ICovCisgICAgICAgIGlmKCBvcmllbnRhdGlvbiA9PSBDVl9DT1VOVEVSX0NMT0NLV0lTRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1NXQVAoIHRsX3N0YWNrLCB0cl9zdGFjaywgdF9zdGFjayApOworICAgICAgICAgICAgQ1ZfU1dBUCggdGxfY291bnQsIHRyX2NvdW50LCB0X2NvdW50ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggaHVsbHR5cGUgPT0gQ1ZfU0VRX0VMVFlQRV9QUE9JTlQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdGxfY291bnQgLSAxOyBpKysgKQorICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwb2ludGVyW3RsX3N0YWNrW2ldXSwgd3JpdGVyICk7CisKKyAgICAgICAgICAgIGZvciggaSA9IHRyX2NvdW50IC0gMTsgaSA+IDA7IGktLSApCisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHBvaW50ZXJbdHJfc3RhY2tbaV1dLCB3cml0ZXIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBodWxsdHlwZSA9PSBDVl9TRVFfRUxUWVBFX0lOREVYICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2Q2FsY0FuZFdyaXRlUHRJbmRpY2VzKCBwb2ludGVyLCB0bF9zdGFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgdGxfY291bnQtMSwgcHRzZXEsICZ3cml0ZXIgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBpY3ZDYWxjQW5kV3JpdGVQdEluZGljZXMoIHBvaW50ZXIsIHRyX3N0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cl9jb3VudC0xLCAwLCBwdHNlcSwgJndyaXRlciApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0bF9jb3VudCAtIDE7IGkrKyApCisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHBvaW50ZXJbdGxfc3RhY2tbaV1dWzBdLCB3cml0ZXIgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gdHJfY291bnQgLSAxOyBpID4gMDsgaS0tICkKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggcG9pbnRlclt0cl9zdGFja1tpXV1bMF0sIHdyaXRlciApOworICAgICAgICB9CisgICAgICAgIHN0b3BfaWR4ID0gdHJfY291bnQgPiAyID8gdHJfc3RhY2tbMV0gOiB0bF9jb3VudCA+IDIgPyB0bF9zdGFja1t0bF9jb3VudCAtIDJdIDogLTE7CisgICAgfQorCisgICAgLyogbG93ZXIgaGFsZiAqLworICAgIHsKKyAgICAgICAgaW50ICpibF9zdGFjayA9IHN0YWNrOworICAgICAgICBpbnQgYmxfY291bnQgPSBza2xhbnNreSggcG9pbnRlciwgMCwgbWlueV9pbmQsIGJsX3N0YWNrLCAxLCAtMSApOworICAgICAgICBpbnQgKmJyX3N0YWNrID0gc3RhY2sgKyBibF9jb3VudDsKKyAgICAgICAgaW50IGJyX2NvdW50ID0gc2tsYW5za3koIHBvaW50ZXIsIHB0c2VxLT50b3RhbCAtIDEsIG1pbnlfaW5kLCBicl9zdGFjaywgMSwgMSApOworCisgICAgICAgIGlmKCBvcmllbnRhdGlvbiAhPSBDVl9DT1VOVEVSX0NMT0NLV0lTRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1NXQVAoIGJsX3N0YWNrLCBicl9zdGFjaywgdF9zdGFjayApOworICAgICAgICAgICAgQ1ZfU1dBUCggYmxfY291bnQsIGJyX2NvdW50LCB0X2NvdW50ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3RvcF9pZHggPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaGVja19pZHggPSBibF9jb3VudCA+IDIgPyBibF9zdGFja1sxXSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxfY291bnQgKyBicl9jb3VudCA+IDIgPyBicl9zdGFja1syLWJsX2NvdW50XSA6IC0xOworICAgICAgICAgICAgaWYoIGNoZWNrX2lkeCA9PSBzdG9wX2lkeCB8fCAoY2hlY2tfaWR4ID49IDAgJiYKKyAgICAgICAgICAgICAgICBwb2ludGVyW2NoZWNrX2lkeF0tPnggPT0gcG9pbnRlcltzdG9wX2lkeF0tPnggJiYKKyAgICAgICAgICAgICAgICBwb2ludGVyW2NoZWNrX2lkeF0tPnkgPT0gcG9pbnRlcltzdG9wX2lkeF0tPnkpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpZiBhbGwgdGhlIHBvaW50cyBsaWUgb24gdGhlIHNhbWUgbGluZSwgdGhlbgorICAgICAgICAgICAgICAgICAgIHRoZSBib3R0b20gcGFydCBvZiB0aGUgY29udmV4IGh1bGwgaXMgdGhlIG1pcnJvcmVkIHRvcCBwYXJ0CisgICAgICAgICAgICAgICAgICAgKGV4Y2VwdCB0aGUgZXh0ZW1lIHBvaW50cykuKi8KKyAgICAgICAgICAgICAgICBibF9jb3VudCA9IE1JTiggYmxfY291bnQsIDIgKTsKKyAgICAgICAgICAgICAgICBicl9jb3VudCA9IE1JTiggYnJfY291bnQsIDIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBodWxsdHlwZSA9PSBDVl9TRVFfRUxUWVBFX1BQT0lOVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBibF9jb3VudCAtIDE7IGkrKyApCisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHBvaW50ZXJbYmxfc3RhY2tbaV1dLCB3cml0ZXIgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gYnJfY291bnQgLSAxOyBpID4gMDsgaS0tICkKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggcG9pbnRlclticl9zdGFja1tpXV0sIHdyaXRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGh1bGx0eXBlID09IENWX1NFUV9FTFRZUEVfSU5ERVggKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBpY3ZDYWxjQW5kV3JpdGVQdEluZGljZXMoIHBvaW50ZXIsIGJsX3N0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBibF9jb3VudC0xLCBwdHNlcSwgJndyaXRlciApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGljdkNhbGNBbmRXcml0ZVB0SW5kaWNlcyggcG9pbnRlciwgYnJfc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyX2NvdW50LTEsIDAsIHB0c2VxLCAmd3JpdGVyICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGJsX2NvdW50IC0gMTsgaSsrICkKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggcG9pbnRlcltibF9zdGFja1tpXV1bMF0sIHdyaXRlciApOworCisgICAgICAgICAgICBmb3IoIGkgPSBicl9jb3VudCAtIDE7IGkgPiAwOyBpLS0gKQorICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwb2ludGVyW2JyX3N0YWNrW2ldXVswXSwgd3JpdGVyICk7CisgICAgICAgIH0KKyAgICB9CisKK2ZpbmlzaF9odWxsOgorICAgIENWX0NBTEwoIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKSk7CisKKyAgICBpZiggbWF0ICkKKyAgICB7CisgICAgICAgIGlmKCBtYXQtPnJvd3MgPiBtYXQtPmNvbHMgKQorICAgICAgICAgICAgbWF0LT5yb3dzID0gaHVsbHNlcS0+dG90YWw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1hdC0+Y29scyA9IGh1bGxzZXEtPnRvdGFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBodWxsLnMgPSBodWxsc2VxOworICAgICAgICBodWxsLmMtPnJlY3QgPSBjdkJvdW5kaW5nUmVjdCggcHRzZXEsCisgICAgICAgICAgICBwdHNlcS0+aGVhZGVyX3NpemUgPCAoaW50KXNpemVvZihDdkNvbnRvdXIpIHx8CisgICAgICAgICAgICAmcHRzZXEtPmZsYWdzID09ICZjb250b3VyX2hlYWRlci5mbGFncyApOworCisgICAgICAgIC8qaWYoIHB0c2VxICE9IChDdlNlcSopJmNvbnRvdXJfaGVhZGVyICkKKyAgICAgICAgICAgIGh1bGxzZXEtPnZfcHJldiA9IHB0c2VxOyovCisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnBvaW50ZXIgKTsKKyAgICBjdkZyZWUoICZzdGFjayApOworCisgICAgcmV0dXJuIGh1bGwuczsKK30KKworCisvKiBjb250b3VyIG11c3QgYmUgYSBzaW1wbGUgcG9seWdvbiAqLworLyogaXQgbXVzdCBoYXZlIG1vcmUgdGhhbiAzIHBvaW50cyAgKi8KK0NWX0lNUEwgQ3ZTZXEqCitjdkNvbnZleGl0eURlZmVjdHMoIGNvbnN0IEN2QXJyKiBhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIGh1bGxhcnJheSwKKyAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDdlNlcSogZGVmZWN0cyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q29udmV4aXR5RGVmZWN0cyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBpbmRleDsKKyAgICBDdlBvaW50KiBodWxsX2N1cjsKKworICAgIC8qIGlzIG9yaWVudGF0aW9uIG9mIGh1bGwgZGlmZmVyZW50IGZyb20gY29udG91ciBvbmUgKi8KKyAgICBpbnQgcmV2X29yaWVudGF0aW9uOworCisgICAgQ3ZDb250b3VyIGNvbnRvdXJfaGVhZGVyOworICAgIHVuaW9uIHsgQ3ZDb250b3VyIGM7IEN2U2VxIHM7IH0gaHVsbF9oZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBibG9jaywgaHVsbGJsb2NrOworICAgIEN2U2VxICpwdHNlcSA9IChDdlNlcSopYXJyYXksICpodWxsID0gKEN2U2VxKilodWxsYXJyYXk7CisKKyAgICBDdlNlcVJlYWRlciBodWxsX3JlYWRlcjsKKyAgICBDdlNlcVJlYWRlciBwdHNlcV9yZWFkZXI7CisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyOworICAgIGludCBpc19pbmRleDsKKworICAgIGlmKCBDVl9JU19TRVEoIHB0c2VxICkpCisgICAgeworICAgICAgICBpZiggIUNWX0lTX1NFUV9QT0lOVF9TRVQoIHB0c2VxICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgIklucHV0IHNlcXVlbmNlIGlzIG5vdCBhIHNlcXVlbmNlIG9mIHBvaW50cyIgKTsKKyAgICAgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgICAgIHN0b3JhZ2UgPSBwdHNlcS0+c3RvcmFnZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcHRzZXEgPSBjdlBvaW50U2VxRnJvbU1hdCgKKyAgICAgICAgICAgIENWX1NFUV9LSU5EX0dFTkVSSUMsIGFycmF5LCAmY29udG91cl9oZWFkZXIsICZibG9jayApKTsKKyAgICB9CisKKyAgICBpZiggQ1ZfU0VRX0VMVFlQRSggcHRzZXEgKSAhPSBDVl8zMlNDMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJGbG9hdGluZy1wb2ludCBjb29yZGluYXRlcyBhcmUgbm90IHN1cHBvcnRlZCBoZXJlIiApOworCisgICAgaWYoIENWX0lTX1NFUSggaHVsbCApKQorICAgIHsKKyAgICAgICAgaW50IGh1bGx0eXBlID0gQ1ZfU0VRX0VMVFlQRSggaHVsbCApOworICAgICAgICBpZiggaHVsbHR5cGUgIT0gQ1ZfU0VRX0VMVFlQRV9QUE9JTlQgJiYgaHVsbHR5cGUgIT0gQ1ZfU0VRX0VMVFlQRV9JTkRFWCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgIkNvbnZleCBodWxsIG11c3QgcmVwcmVzZW50ZWQgYXMgYSBzZXF1ZW5jZSAiCisgICAgICAgICAgICAgICAgIm9mIGluZGljZXMgb3Igc2VxdWVuY2Ugb2YgcG9pbnRlcnMiICk7CisgICAgICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgICAgICBzdG9yYWdlID0gaHVsbC0+c3RvcmFnZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopaHVsbDsKKworICAgICAgICBpZiggIUNWX0lTX01BVCggaHVsbCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzQmFkQXJnLCAiQ29udmV4IGh1bGwgaXMgbmVpdGhlciBzZXF1ZW5jZSBub3IgbWF0cml4Iik7CisKKyAgICAgICAgaWYoIChtYXQtPmNvbHMgIT0gMSAmJiBtYXQtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgICAgICFDVl9JU19NQVRfQ09OVChtYXQtPnR5cGUpIHx8IENWX01BVF9UWVBFKG1hdC0+dHlwZSkgIT0gQ1ZfMzJTQzEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUaGUgbWF0cml4IHNob3VsZCBiZSAxLWRpbWVuc2lvbmFsIGFuZCBjb250aW51b3VzIGFycmF5IG9mIGludCdzIiApOworCisgICAgICAgIGlmKCBtYXQtPmNvbHMgKyBtYXQtPnJvd3MgLSAxID4gcHRzZXEtPnRvdGFsICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiQ29udmV4IGh1bGwgaXMgbGFyZ2VyIHRoYW4gdGhlIHBvaW50IHNlcXVlbmNlIiApOworCisgICAgICAgIENWX0NBTEwoIGh1bGwgPSBjdk1ha2VTZXFIZWFkZXJGb3JBcnJheSgKKyAgICAgICAgICAgIENWX1NFUV9LSU5EX0NVUlZFfENWX01BVF9UWVBFKG1hdC0+dHlwZSl8Q1ZfU0VRX0ZMQUdfQ0xPU0VELAorICAgICAgICAgICAgc2l6ZW9mKEN2Q29udG91ciksIENWX0VMRU1fU0laRShtYXQtPnR5cGUpLCBtYXQtPmRhdGEucHRyLAorICAgICAgICAgICAgbWF0LT5jb2xzICsgbWF0LT5yb3dzIC0gMSwgJmh1bGxfaGVhZGVyLnMsICZodWxsYmxvY2sgKSk7CisgICAgfQorCisgICAgaXNfaW5kZXggPSBDVl9TRVFfRUxUWVBFKGh1bGwpID09IENWX1NFUV9FTFRZUEVfSU5ERVg7CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgc3RvcmFnZSBwb2ludGVyIiApOworCisgICAgQ1ZfQ0FMTCggZGVmZWN0cyA9IGN2Q3JlYXRlU2VxKCBDVl9TRVFfS0lORF9HRU5FUklDLCBzaXplb2YoQ3ZTZXEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2Q29udmV4aXR5RGVmZWN0KSwgc3RvcmFnZSApKTsKKworICAgIGlmKCBwdHNlcS0+dG90YWwgPCA0IHx8IGh1bGwtPnRvdGFsIDwgMykKKyAgICB7CisgICAgICAgIC8vQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgIC8vICAgICJwb2ludCBzZXEgc2l6ZSBtdXN0IGJlID49IDQsIGNvbnZleCBodWxsIHNpemUgbXVzdCBiZSA+PSAzIiApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIC8qIHJlY29nbml6ZSBjby1vcmllbnRhdGlvbiBvZiBwdHNlcSBhbmQgaXRzIGh1bGwgKi8KKyAgICB7CisgICAgICAgIGludCBzaWduID0gMDsKKyAgICAgICAgaW50IGluZGV4MSwgaW5kZXgyLCBpbmRleDM7CisKKyAgICAgICAgaWYoICFpc19pbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQqIHBvcyA9ICpDVl9TRVFfRUxFTSggaHVsbCwgQ3ZQb2ludCosIDAgKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGluZGV4MSA9IGN2U2VxRWxlbUlkeCggcHRzZXEsIHBvcyApKTsKKworICAgICAgICAgICAgcG9zID0gKkNWX1NFUV9FTEVNKCBodWxsLCBDdlBvaW50KiwgMSApOworICAgICAgICAgICAgQ1ZfQ0FMTCggaW5kZXgyID0gY3ZTZXFFbGVtSWR4KCBwdHNlcSwgcG9zICkpOworCisgICAgICAgICAgICBwb3MgPSAqQ1ZfU0VRX0VMRU0oIGh1bGwsIEN2UG9pbnQqLCAyICk7CisgICAgICAgICAgICBDVl9DQUxMKCBpbmRleDMgPSBjdlNlcUVsZW1JZHgoIHB0c2VxLCBwb3MgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleDEgPSAqQ1ZfU0VRX0VMRU0oIGh1bGwsIGludCwgMCApOworICAgICAgICAgICAgaW5kZXgyID0gKkNWX1NFUV9FTEVNKCBodWxsLCBpbnQsIDEgKTsKKyAgICAgICAgICAgIGluZGV4MyA9ICpDVl9TRVFfRUxFTSggaHVsbCwgaW50LCAyICk7CisgICAgICAgIH0KKworICAgICAgICBzaWduICs9IChpbmRleDIgPiBpbmRleDEpID8gMSA6IDA7CisgICAgICAgIHNpZ24gKz0gKGluZGV4MyA+IGluZGV4MikgPyAxIDogMDsKKyAgICAgICAgc2lnbiArPSAoaW5kZXgxID4gaW5kZXgzKSA/IDEgOiAwOworCisgICAgICAgIHJldl9vcmllbnRhdGlvbiA9IChzaWduID09IDIpID8gMCA6IDE7CisgICAgfQorCisgICAgY3ZTdGFydFJlYWRTZXEoIHB0c2VxLCAmcHRzZXFfcmVhZGVyLCAwICk7CisgICAgY3ZTdGFydFJlYWRTZXEoIGh1bGwsICZodWxsX3JlYWRlciwgcmV2X29yaWVudGF0aW9uICk7CisKKyAgICBpZiggIWlzX2luZGV4ICkKKyAgICB7CisgICAgICAgIGh1bGxfY3VyID0gKihDdlBvaW50KiopaHVsbF9yZWFkZXIucHJldl9lbGVtOworICAgICAgICBpbmRleCA9IGN2U2VxRWxlbUlkeCggcHRzZXEsIChjaGFyKilodWxsX2N1ciwgMCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbmRleCA9ICooaW50KilodWxsX3JlYWRlci5wcmV2X2VsZW07CisgICAgICAgIGh1bGxfY3VyID0gQ1ZfR0VUX1NFUV9FTEVNKCBDdlBvaW50LCBwdHNlcSwgaW5kZXggKTsKKyAgICB9CisgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZwdHNlcV9yZWFkZXIsIGluZGV4ICk7CisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBkZWZlY3RzLCAmd3JpdGVyICk7CisKKyAgICAvKiBjeWNsZSB0aHJvdWdoIHB0c2VxIGFuZCBodWxsIHdpdGggY29tcHV0aW5nIGRlZmVjdHMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgaHVsbC0+dG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdkNvbnZleGl0eURlZmVjdCBkZWZlY3Q7CisgICAgICAgIGludCBpc19kZWZlY3QgPSAwOworICAgICAgICBkb3VibGUgZHgwLCBkeTA7CisgICAgICAgIGRvdWJsZSBkZXB0aCA9IDAsIHNjYWxlOworICAgICAgICBDdlBvaW50KiBodWxsX25leHQ7CisKKyAgICAgICAgaWYoICFpc19pbmRleCApCisgICAgICAgICAgICBodWxsX25leHQgPSAqKEN2UG9pbnQqKilodWxsX3JlYWRlci5wdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSAqKGludCopaHVsbF9yZWFkZXIucHRyOworICAgICAgICAgICAgaHVsbF9uZXh0ID0gQ1ZfR0VUX1NFUV9FTEVNKCBDdlBvaW50LCBwdHNlcSwgdCApOworICAgICAgICB9CisKKyAgICAgICAgZHgwID0gKGRvdWJsZSlodWxsX25leHQtPnggLSAoZG91YmxlKWh1bGxfY3VyLT54OworICAgICAgICBkeTAgPSAoZG91YmxlKWh1bGxfbmV4dC0+eSAtIChkb3VibGUpaHVsbF9jdXItPnk7CisgICAgICAgIGFzc2VydCggZHgwICE9IDAgfHwgZHkwICE9IDAgKTsKKyAgICAgICAgc2NhbGUgPSAxLi9zcXJ0KGR4MCpkeDAgKyBkeTAqZHkwKTsKKworICAgICAgICBkZWZlY3Quc3RhcnQgPSBodWxsX2N1cjsKKyAgICAgICAgZGVmZWN0LmVuZCA9IGh1bGxfbmV4dDsKKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGdvIHRocm91Z2ggcHRzZXEgdG8gYWNoaWV2ZSBuZXh0IGh1bGwgcG9pbnQgKi8KKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihDdlBvaW50KSwgcHRzZXFfcmVhZGVyICk7CisKKyAgICAgICAgICAgIGlmKCBwdHNlcV9yZWFkZXIucHRyID09IChzY2hhciopaHVsbF9uZXh0ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlBvaW50KiBjdXIgPSAoQ3ZQb2ludCopcHRzZXFfcmVhZGVyLnB0cjsKKworICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgZGlzdGFuY2UgZnJvbSBjdXJyZW50IHBvaW50IHRvIGh1bGwgZWRnZSAqLworICAgICAgICAgICAgICAgIGRvdWJsZSBkeCA9IChkb3VibGUpY3VyLT54IC0gKGRvdWJsZSlodWxsX2N1ci0+eDsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHkgPSAoZG91YmxlKWN1ci0+eSAtIChkb3VibGUpaHVsbF9jdXItPnk7CisKKyAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGRlcHRoICovCisgICAgICAgICAgICAgICAgZG91YmxlIGRpc3QgPSBmYWJzKC1keTAqZHggKyBkeDAqZHkpICogc2NhbGU7CisKKyAgICAgICAgICAgICAgICBpZiggZGlzdCA+IGRlcHRoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlcHRoID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0LmRlcHRoX3BvaW50ID0gY3VyOworICAgICAgICAgICAgICAgICAgICBkZWZlY3QuZGVwdGggPSAoZmxvYXQpZGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlzX2RlZmVjdCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCBpc19kZWZlY3QgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggZGVmZWN0LCB3cml0ZXIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGh1bGxfY3VyID0gaHVsbF9uZXh0OworICAgICAgICBpZiggcmV2X29yaWVudGF0aW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUFJFVl9TRVFfRUxFTSggaHVsbC0+ZWxlbV9zaXplLCBodWxsX3JlYWRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggaHVsbC0+ZWxlbV9zaXplLCBodWxsX3JlYWRlciApOworICAgICAgICB9CisgICAgfQorCisgICAgZGVmZWN0cyA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZGVmZWN0czsKK30KKworCitDVl9JTVBMIGludAorY3ZDaGVja0NvbnRvdXJDb252ZXhpdHkoIGNvbnN0IEN2QXJyKiBhcnJheSApCit7CisgICAgaW50IGZsYWcgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDaGVja0NvbnRvdXJDb252ZXhpdHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaTsKKyAgICBpbnQgb3JpZW50YXRpb24gPSAwOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBibG9jazsKKyAgICBDdlNlcSogY29udG91ciA9IChDdlNlcSopYXJyYXk7CisKKyAgICBpZiggQ1ZfSVNfU0VRKGNvbnRvdXIpICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT04oY29udG91cikpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgIklucHV0IHNlcXVlbmNlIG11c3QgYmUgcG9seWdvbiAoY2xvc2VkIDJkIGN1cnZlKSIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY29udG91ciA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfQ1VSVkV8Q1ZfU0VRX0ZMQUdfQ0xPU0VELCBhcnJheSwgJmNvbnRvdXJfaGVhZGVyLCAmYmxvY2sgKSk7CisgICAgfQorCisgICAgaWYoIGNvbnRvdXItPnRvdGFsID09IDAgKQorICAgICAgICBFWElUOworCisgICAgY3ZTdGFydFJlYWRTZXEoIGNvbnRvdXIsICZyZWFkZXIsIDAgKTsKKworICAgIGZsYWcgPSAxOworCisgICAgaWYoIENWX1NFUV9FTFRZUEUoIGNvbnRvdXIgKSA9PSBDVl8zMlNDMiApCisgICAgeworICAgICAgICBDdlBvaW50ICpwcmV2X3B0ID0gKEN2UG9pbnQqKXJlYWRlci5wcmV2X2VsZW07CisgICAgICAgIEN2UG9pbnQgKmN1cl9wdCA9IChDdlBvaW50KilyZWFkZXIucHRyOworCisgICAgICAgIGludCBkeDAgPSBjdXJfcHQtPnggLSBwcmV2X3B0LT54OworICAgICAgICBpbnQgZHkwID0gY3VyX3B0LT55IC0gcHJldl9wdC0+eTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY29udG91ci0+dG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkeGR5MCwgZHlkeDA7CisgICAgICAgICAgICBpbnQgZHgsIGR5OworCisgICAgICAgICAgICAvKmludCBvcmllbnQ7ICovCisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoQ3ZQb2ludCksIHJlYWRlciApOworICAgICAgICAgICAgcHJldl9wdCA9IGN1cl9wdDsKKyAgICAgICAgICAgIGN1cl9wdCA9IChDdlBvaW50ICopIHJlYWRlci5wdHI7CisKKyAgICAgICAgICAgIGR4ID0gY3VyX3B0LT54IC0gcHJldl9wdC0+eDsKKyAgICAgICAgICAgIGR5ID0gY3VyX3B0LT55IC0gcHJldl9wdC0+eTsKKyAgICAgICAgICAgIGR4ZHkwID0gZHggKiBkeTA7CisgICAgICAgICAgICBkeWR4MCA9IGR5ICogZHgwOworCisgICAgICAgICAgICAvKiBmaW5kIG9yaWVudGF0aW9uICovCisgICAgICAgICAgICAvKm9yaWVudCA9IC1keTAgKiBkeCArIGR4MCAqIGR5OworICAgICAgICAgICAgICAgb3JpZW50YXRpb24gfD0gKG9yaWVudCA+IDApID8gMSA6IDI7CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG9yaWVudGF0aW9uIHw9IChkeWR4MCA+IGR4ZHkwKSA/IDEgOiAoKGR5ZHgwIDwgZHhkeTApID8gMiA6IDMpOworCisgICAgICAgICAgICBpZiggb3JpZW50YXRpb24gPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGR4MCA9IGR4OworICAgICAgICAgICAgZHkwID0gZHk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBDVl9TRVFfRUxUWVBFKGNvbnRvdXIpID09IENWXzMyRkMyICk7CisKKyAgICAgICAgQ3ZQb2ludDJEMzJmICpwcmV2X3B0ID0gKEN2UG9pbnQyRDMyZiopcmVhZGVyLnByZXZfZWxlbTsKKyAgICAgICAgQ3ZQb2ludDJEMzJmICpjdXJfcHQgPSAoQ3ZQb2ludDJEMzJmKilyZWFkZXIucHRyOworCisgICAgICAgIGZsb2F0IGR4MCA9IGN1cl9wdC0+eCAtIHByZXZfcHQtPng7CisgICAgICAgIGZsb2F0IGR5MCA9IGN1cl9wdC0+eSAtIHByZXZfcHQtPnk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvbnRvdXItPnRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkeGR5MCwgZHlkeDA7CisgICAgICAgICAgICBmbG9hdCBkeCwgZHk7CisKKyAgICAgICAgICAgIC8qaW50IG9yaWVudDsgKi8KKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihDdlBvaW50MkQzMmYpLCByZWFkZXIgKTsKKyAgICAgICAgICAgIHByZXZfcHQgPSBjdXJfcHQ7CisgICAgICAgICAgICBjdXJfcHQgPSAoQ3ZQb2ludDJEMzJmKikgcmVhZGVyLnB0cjsKKworICAgICAgICAgICAgZHggPSBjdXJfcHQtPnggLSBwcmV2X3B0LT54OworICAgICAgICAgICAgZHkgPSBjdXJfcHQtPnkgLSBwcmV2X3B0LT55OworICAgICAgICAgICAgZHhkeTAgPSBkeCAqIGR5MDsKKyAgICAgICAgICAgIGR5ZHgwID0gZHkgKiBkeDA7CisKKyAgICAgICAgICAgIC8qIGZpbmQgb3JpZW50YXRpb24gKi8KKyAgICAgICAgICAgIC8qb3JpZW50ID0gLWR5MCAqIGR4ICsgZHgwICogZHk7CisgICAgICAgICAgICAgICBvcmllbnRhdGlvbiB8PSAob3JpZW50ID4gMCkgPyAxIDogMjsKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgb3JpZW50YXRpb24gfD0gKGR5ZHgwID4gZHhkeTApID8gMSA6ICgoZHlkeDAgPCBkeGR5MCkgPyAyIDogMyk7CisKKyAgICAgICAgICAgIGlmKCBvcmllbnRhdGlvbiA9PSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbGFnID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHgwID0gZHg7CisgICAgICAgICAgICBkeTAgPSBkeTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZmxhZzsKK30KKworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmNvcm5lci5jcHAgYi9jdi9zcmMvY3Zjb3JuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyY2U1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zjb3JuZXIuY3BwCkBAIC0wLDAgKzEsNzA2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworc3RhdGljIHZvaWQKK2ljdkNhbGNNaW5FaWdlblZhbCggY29uc3QgZmxvYXQqIGNvdiwgaW50IGNvdl9zdGVwLCBmbG9hdCogZHN0LAorICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSBzaXplLCBDdk1hdCogYnVmZmVyICkKK3sKKyAgICBpbnQgajsKKyAgICBmbG9hdCogYnVmID0gYnVmZmVyLT5kYXRhLmZsOworICAgIGNvdl9zdGVwIC89IHNpemVvZihjb3ZbMF0pOworICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3RbMF0pOworICAgIGJ1ZmZlci0+cm93cyA9IDE7CisKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgY292ICs9IGNvdl9zdGVwLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gY292W2oqM10qMC41OworICAgICAgICAgICAgZG91YmxlIGIgPSBjb3ZbaiozKzFdOworICAgICAgICAgICAgZG91YmxlIGMgPSBjb3ZbaiozKzJdKjAuNTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgYnVmW2ogKyBzaXplLndpZHRoXSA9IChmbG9hdCkoYSArIGMpOworICAgICAgICAgICAgYnVmW2pdID0gKGZsb2F0KSgoYSAtIGMpKihhIC0gYykgKyBiKmIpOworICAgICAgICB9CisKKyAgICAgICAgY3ZQb3coIGJ1ZmZlciwgYnVmZmVyLCAwLjUgKTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aCA7IGorKyApCisgICAgICAgICAgICBkc3Rbal0gPSAoZmxvYXQpKGJ1ZltqICsgc2l6ZS53aWR0aF0gLSBidWZbal0pOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2Q2FsY0hhcnJpcyggY29uc3QgZmxvYXQqIGNvdiwgaW50IGNvdl9zdGVwLCBmbG9hdCogZHN0LAorICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBDdlNpemUgc2l6ZSwgQ3ZNYXQqIC8qYnVmZmVyKi8sIGRvdWJsZSBrICkKK3sKKyAgICBpbnQgajsKKyAgICBjb3Zfc3RlcCAvPSBzaXplb2YoY292WzBdKTsKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBjb3YgKz0gY292X3N0ZXAsIGRzdCArPSBkc3Rfc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGEgPSBjb3ZbaiozXTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gY292W2oqMysxXTsKKyAgICAgICAgICAgIGRvdWJsZSBjID0gY292W2oqMysyXTsKKyAgICAgICAgICAgIGRzdFtqXSA9IChmbG9hdCkoYSpjIC0gYipiIC0gayooYSArIGMpKihhICsgYykpOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZDYWxjRWlnZW5WYWxzVmVjcyggY29uc3QgZmxvYXQqIGNvdiwgaW50IGNvdl9zdGVwLCBmbG9hdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwgQ3ZTaXplIHNpemUsIEN2TWF0KiBidWZmZXIgKQoreworICAgIHN0YXRpYyBpbnQgeTAgPSAwOworICAgIAorICAgIGludCBqOworICAgIGZsb2F0KiBidWYgPSBidWZmZXItPmRhdGEuZmw7CisgICAgY292X3N0ZXAgLz0gc2l6ZW9mKGNvdlswXSk7CisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgY292ICs9IGNvdl9zdGVwLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBhID0gY292W2oqM10qMC41OworICAgICAgICAgICAgZG91YmxlIGIgPSBjb3ZbaiozKzFdOworICAgICAgICAgICAgZG91YmxlIGMgPSBjb3ZbaiozKzJdKjAuNTsKKworICAgICAgICAgICAgYnVmW2ogKyBzaXplLndpZHRoXSA9IChmbG9hdCkoYSArIGMpOworICAgICAgICAgICAgYnVmW2pdID0gKGZsb2F0KSgoYSAtIGMpKihhIC0gYykgKyBiKmIpOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyLT5yb3dzID0gMTsKKyAgICAgICAgY3ZQb3coIGJ1ZmZlciwgYnVmZmVyLCAwLjUgKTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGEgPSBjb3ZbaiozXTsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gY292W2oqMysxXTsKKyAgICAgICAgICAgIGRvdWJsZSBjID0gY292W2oqMysyXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZG91YmxlIGwxID0gYnVmW2ogKyBzaXplLndpZHRoXSArIGJ1ZltqXTsKKyAgICAgICAgICAgIGRvdWJsZSBsMiA9IGJ1ZltqICsgc2l6ZS53aWR0aF0gLSBidWZbal07CisKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gYjsKKyAgICAgICAgICAgIGRvdWJsZSB5ID0gbDEgLSBhOworICAgICAgICAgICAgZG91YmxlIGUgPSBmYWJzKHgpOworCisgICAgICAgICAgICBpZiggZSArIGZhYnMoeSkgPCAxZS00ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5ID0gYjsKKyAgICAgICAgICAgICAgICB4ID0gbDEgLSBjOworICAgICAgICAgICAgICAgIGUgPSBmYWJzKHgpOworICAgICAgICAgICAgICAgIGlmKCBlICsgZmFicyh5KSA8IDFlLTQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZSA9IDEuLyhlICsgZmFicyh5KSArIEZMVF9FUFNJTE9OKTsKKyAgICAgICAgICAgICAgICAgICAgeCAqPSBlLCB5ICo9IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBidWZbal0gPSAoZmxvYXQpKHgqeCArIHkqeSArIERCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgIGRzdFs2KmpdID0gKGZsb2F0KWwxOworICAgICAgICAgICAgZHN0WzYqaiArIDJdID0gKGZsb2F0KXg7CisgICAgICAgICAgICBkc3RbNipqICsgM10gPSAoZmxvYXQpeTsKKworICAgICAgICAgICAgeCA9IGI7CisgICAgICAgICAgICB5ID0gbDIgLSBhOworICAgICAgICAgICAgZSA9IGZhYnMoeCk7CisKKyAgICAgICAgICAgIGlmKCBlICsgZmFicyh5KSA8IDFlLTQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHkgPSBiOworICAgICAgICAgICAgICAgIHggPSBsMiAtIGM7CisgICAgICAgICAgICAgICAgZSA9IGZhYnMoeCk7CisgICAgICAgICAgICAgICAgaWYoIGUgKyBmYWJzKHkpIDwgMWUtNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlID0gMS4vKGUgKyBmYWJzKHkpICsgRkxUX0VQU0lMT04pOworICAgICAgICAgICAgICAgICAgICB4ICo9IGUsIHkgKj0gZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZltqICsgc2l6ZS53aWR0aF0gPSAoZmxvYXQpKHgqeCArIHkqeSArIERCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgIGRzdFs2KmogKyAxXSA9IChmbG9hdClsMjsKKyAgICAgICAgICAgIGRzdFs2KmogKyA0XSA9IChmbG9hdCl4OworICAgICAgICAgICAgZHN0WzYqaiArIDVdID0gKGZsb2F0KXk7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXItPnJvd3MgPSAyOworICAgICAgICBjdlBvdyggYnVmZmVyLCBidWZmZXIsIC0wLjUgKTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gYnVmW2pdKmRzdFs2KmogKyAyXTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IGJ1ZltqXSpkc3RbNipqICsgM107CisKKyAgICAgICAgICAgIGRzdFs2KmogKyAyXSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgIGRzdFs2KmogKyAzXSA9IChmbG9hdCl0MTsKKworICAgICAgICAgICAgdDAgPSBidWZbaiArIHNpemUud2lkdGhdKmRzdFs2KmogKyA0XTsKKyAgICAgICAgICAgIHQxID0gYnVmW2ogKyBzaXplLndpZHRoXSpkc3RbNipqICsgNV07CisKKyAgICAgICAgICAgIGRzdFs2KmogKyA0XSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgIGRzdFs2KmogKyA1XSA9IChmbG9hdCl0MTsKKyAgICAgICAgfQorCisgICAgICAgIHkwKys7CisgICAgfQorfQorCisKKyNkZWZpbmUgSUNWX01JTkVJR0VOVkFMICAgICAwCisjZGVmaW5lIElDVl9IQVJSSVMgICAgICAgICAgMQorI2RlZmluZSBJQ1ZfRUlHRU5WQUxTVkVDUyAgIDIKKworc3RhdGljIHZvaWQKK2ljdkNvcm5lckVpZ2VuVmFsc1ZlY3MoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBlaWdlbnYsIGludCBibG9ja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwZXJ0dXJlX3NpemUsIGludCBvcF90eXBlLCBkb3VibGUgaz0wLiApCit7CisgICAgQ3ZTZXBGaWx0ZXIgZHhfZmlsdGVyLCBkeV9maWx0ZXI7CisgICAgQ3ZCb3hGaWx0ZXIgYmx1cl9maWx0ZXI7CisgICAgQ3ZNYXQgKnRlbXBzcmMgPSAwOworICAgIEN2TWF0ICpEeCA9IDAsICpEeSA9IDAsICpjb3YgPSAwOworICAgIEN2TWF0ICpzcXJ0X2J1ZiA9IDA7CisKKyAgICBpbnQgYnVmX3NpemUgPSAxIDw8IDEyOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29ybmVyRWlnZW5WYWxzVmVjcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBqLCB5LCBkc3RfeSA9IDAsIG1heF9keSwgZGVsdGEgPSAwOworICAgIGludCBhcGVydHVyZV9zaXplMCA9IGFwZXJ0dXJlX3NpemU7CisgICAgaW50IHRlbXBfc3RlcCA9IDAsIGRfc3RlcDsKKyAgICB1Y2hhciogc2hpZnRlZF9wdHIgPSAwOworICAgIGludCBkZXB0aCwgZF9kZXB0aDsKKyAgICBpbnQgc3RhZ2UgPSBDVl9TVEFSVDsKKyAgICBDdlNvYmVsRml4ZWRJUFBGdW5jIGlwcF9zb2JlbF92ZXJ0ID0gMCwgaXBwX3NvYmVsX2hvcml6ID0gMDsKKyAgICBDdkZpbHRlckZpeGVkSVBQRnVuYyBpcHBfc2NoYXJyX3ZlcnQgPSAwLCBpcHBfc2NoYXJyX2hvcml6ID0gMDsKKyAgICBDdlNpemUgZWxfc2l6ZSwgc2l6ZSwgc3RyaXBlX3NpemU7CisgICAgaW50IGFsaWduZWRfd2lkdGg7CisgICAgQ3ZQb2ludCBlbF9hbmNob3I7CisgICAgZG91YmxlIGZhY3RvcngsIGZhY3Rvcnk7CisgICAgYm9vbCB1c2VfaXBwID0gZmFsc2U7CisKKyAgICBpZiggYmxvY2tfc2l6ZSA8IDMgfHwgIShibG9ja19zaXplICYgMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImF2ZXJhZ2luZyB3aW5kb3cgc2l6ZSBtdXN0IGJlIGFuIG9kZCBudW1iZXIgPj0gMyIgKTsKKworICAgIGlmKCAoYXBlcnR1cmVfc2l6ZSA8IDMgJiYgYXBlcnR1cmVfc2l6ZSAhPSBDVl9TQ0hBUlIpIHx8ICEoYXBlcnR1cmVfc2l6ZSAmIDEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJEZXJpdmF0aXZlIGZpbHRlciBhcGVydHVyZSBzaXplIG11c3QgYmUgYSBwb3NpdGl2ZSBvZGQgbnVtYmVyID49MyBvciBDVl9TQ0hBUlIiICk7CisKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSChzcmMtPnR5cGUpOworICAgIGRfZGVwdGggPSBkZXB0aCA9PSBDVl84VSA/IENWXzE2UyA6IENWXzMyRjsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBhbGlnbmVkX3dpZHRoID0gY3ZBbGlnbihzaXplLndpZHRoLCA0KTsKKworICAgIGFwZXJ0dXJlX3NpemUgPSBhcGVydHVyZV9zaXplID09IENWX1NDSEFSUiA/IDMgOiBhcGVydHVyZV9zaXplOworICAgIGVsX3NpemUgPSBjdlNpemUoIGFwZXJ0dXJlX3NpemUsIGFwZXJ0dXJlX3NpemUgKTsKKyAgICBlbF9hbmNob3IgPSBjdlBvaW50KCBhcGVydHVyZV9zaXplLzIsIGFwZXJ0dXJlX3NpemUvMiApOworCisgICAgaWYoIGFwZXJ0dXJlX3NpemUgPD0gNSAmJiBpY3ZGaWx0ZXJTb2JlbFZlcnRfOHUxNnNfQzFSX3AgKQorICAgIHsKKyAgICAgICAgaWYoIGRlcHRoID09IENWXzhVICYmIGFwZXJ0dXJlX3NpemUwID09IENWX1NDSEFSUiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlwcF9zY2hhcnJfdmVydCA9IGljdkZpbHRlclNjaGFyclZlcnRfOHUxNnNfQzFSX3A7CisgICAgICAgICAgICBpcHBfc2NoYXJyX2hvcml6ID0gaWN2RmlsdGVyU2NoYXJySG9yaXpfOHUxNnNfQzFSX3A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMzJGICYmIGFwZXJ0dXJlX3NpemUwID09IENWX1NDSEFSUiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlwcF9zY2hhcnJfdmVydCA9IGljdkZpbHRlclNjaGFyclZlcnRfMzJmX0MxUl9wOworICAgICAgICAgICAgaXBwX3NjaGFycl9ob3JpeiA9IGljdkZpbHRlclNjaGFyckhvcml6XzMyZl9DMVJfcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlwcF9zb2JlbF92ZXJ0ID0gaWN2RmlsdGVyU29iZWxWZXJ0Xzh1MTZzX0MxUl9wOworICAgICAgICAgICAgaXBwX3NvYmVsX2hvcml6ID0gaWN2RmlsdGVyU29iZWxIb3Jpel84dTE2c19DMVJfcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBpcHBfc29iZWxfdmVydCA9IGljdkZpbHRlclNvYmVsVmVydF8zMmZfQzFSX3A7CisgICAgICAgICAgICBpcHBfc29iZWxfaG9yaXogPSBpY3ZGaWx0ZXJTb2JlbEhvcml6XzMyZl9DMVJfcDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiggKGlwcF9zb2JlbF92ZXJ0ICYmIGlwcF9zb2JlbF9ob3JpeikgfHwKKyAgICAgICAgKGlwcF9zY2hhcnJfdmVydCAmJiBpcHBfc2NoYXJyX2hvcml6KSApCisgICAgeworICAgICAgICBDVl9DQUxMKCB0ZW1wc3JjID0gaWN2SVBQRmlsdGVySW5pdCggc3JjLCBidWZfc2l6ZSwKKyAgICAgICAgICAgIGN2U2l6ZShlbF9zaXplLndpZHRoLGVsX3NpemUuaGVpZ2h0ICsgYmxvY2tfc2l6ZSkpKTsKKyAgICAgICAgc2hpZnRlZF9wdHIgPSB0ZW1wc3JjLT5kYXRhLnB0ciArIGVsX2FuY2hvci55KnRlbXBzcmMtPnN0ZXAgKworICAgICAgICAgICAgICAgICAgICAgIGVsX2FuY2hvci54KkNWX0VMRU1fU0laRShkZXB0aCk7CisgICAgICAgIHRlbXBfc3RlcCA9IHRlbXBzcmMtPnN0ZXAgPyB0ZW1wc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICBtYXhfZHkgPSB0ZW1wc3JjLT5yb3dzIC0gYXBlcnR1cmVfc2l6ZSArIDE7CisgICAgICAgIHVzZV9pcHAgPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpcHBfc29iZWxfdmVydCA9IGlwcF9zb2JlbF9ob3JpeiA9IDA7CisgICAgICAgIGlwcF9zY2hhcnJfdmVydCA9IGlwcF9zY2hhcnJfaG9yaXogPSAwOworCisgICAgICAgIENWX0NBTEwoIGR4X2ZpbHRlci5pbml0X2Rlcml2KCBzaXplLndpZHRoLCBkZXB0aCwgZF9kZXB0aCwgMSwgMCwgYXBlcnR1cmVfc2l6ZTAgKSk7CisgICAgICAgIENWX0NBTEwoIGR5X2ZpbHRlci5pbml0X2Rlcml2KCBzaXplLndpZHRoLCBkZXB0aCwgZF9kZXB0aCwgMCwgMSwgYXBlcnR1cmVfc2l6ZTAgKSk7CisgICAgICAgIG1heF9keSA9IGJ1Zl9zaXplIC8gc3JjLT5jb2xzOworICAgICAgICBtYXhfZHkgPSBNQVgoIG1heF9keSwgYXBlcnR1cmVfc2l6ZSArIGJsb2NrX3NpemUgKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBEeCA9IGN2Q3JlYXRlTWF0KCBtYXhfZHksIGFsaWduZWRfd2lkdGgsIGRfZGVwdGggKSk7CisgICAgQ1ZfQ0FMTCggRHkgPSBjdkNyZWF0ZU1hdCggbWF4X2R5LCBhbGlnbmVkX3dpZHRoLCBkX2RlcHRoICkpOworICAgIENWX0NBTEwoIGNvdiA9IGN2Q3JlYXRlTWF0KCBtYXhfZHkgKyBibG9ja19zaXplICsgMSwgc2l6ZS53aWR0aCwgQ1ZfMzJGQzMgKSk7CisgICAgQ1ZfQ0FMTCggc3FydF9idWYgPSBjdkNyZWF0ZU1hdCggMiwgc2l6ZS53aWR0aCwgQ1ZfMzJGICkpOworICAgIER4LT5jb2xzID0gRHktPmNvbHMgPSBzaXplLndpZHRoOworCisgICAgaWYoICF1c2VfaXBwICkKKyAgICAgICAgbWF4X2R5IC09IGFwZXJ0dXJlX3NpemUgLSAxOworICAgIGRfc3RlcCA9IER4LT5zdGVwID8gRHgtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisKKyAgICBDVl9DQUxMKGJsdXJfZmlsdGVyLmluaXQoc2l6ZS53aWR0aCwgQ1ZfMzJGQzMsIENWXzMyRkMzLCAwLCBjdlNpemUoYmxvY2tfc2l6ZSxibG9ja19zaXplKSkpOworICAgIHN0cmlwZV9zaXplID0gc2l6ZTsKKworICAgIGZhY3RvcnggPSAoZG91YmxlKSgxIDw8IChhcGVydHVyZV9zaXplIC0gMSkpICogYmxvY2tfc2l6ZTsKKyAgICBpZiggYXBlcnR1cmVfc2l6ZTAgPT0gQ1ZfU0NIQVJSICkKKyAgICAgICAgZmFjdG9yeCAqPSAyOworICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgIGZhY3RvcnggKj0gMjU1LjsKKyAgICBmYWN0b3J5ID0gZmFjdG9yeCA9IDEuL2ZhY3Rvcng7CisgICAgaWYoIGlwcF9zb2JlbF92ZXJ0ICkKKyAgICAgICAgZmFjdG9yeSA9IC1mYWN0b3J5OworCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5ICs9IGRlbHRhICkKKyAgICB7CisgICAgICAgIGlmKCAhdXNlX2lwcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhID0gTUlOKCBzaXplLmhlaWdodCAtIHksIG1heF9keSApOworICAgICAgICAgICAgaWYoIHkgKyBkZWx0YSA9PSBzaXplLmhlaWdodCApCisgICAgICAgICAgICAgICAgc3RhZ2UgPSBzdGFnZSAmIENWX1NUQVJUID8gQ1ZfU1RBUlQgKyBDVl9FTkQgOiBDVl9FTkQ7CisgICAgICAgICAgICBkeF9maWx0ZXIucHJvY2Vzcyggc3JjLCBEeCwgY3ZSZWN0KDAseSwtMSxkZWx0YSksIGN2UG9pbnQoMCwwKSwgc3RhZ2UgKTsKKyAgICAgICAgICAgIHN0cmlwZV9zaXplLmhlaWdodCA9IGR5X2ZpbHRlci5wcm9jZXNzKCBzcmMsIER5LCBjdlJlY3QoMCx5LC0xLGRlbHRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlBvaW50KDAsMCksIHN0YWdlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZWx0YSA9IGljdklQUEZpbHRlck5leHRTdHJpcGUoIHNyYywgdGVtcHNyYywgeSwgZWxfc2l6ZSwgZWxfYW5jaG9yICk7CisgICAgICAgICAgICBzdHJpcGVfc2l6ZS5oZWlnaHQgPSBkZWx0YTsKKworICAgICAgICAgICAgaWYoIGlwcF9zb2JlbF92ZXJ0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGlwcF9zb2JlbF92ZXJ0KCBzaGlmdGVkX3B0ciwgdGVtcF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgRHgtPmRhdGEucHRyLCBkX3N0ZXAsIHN0cmlwZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgYXBlcnR1cmVfc2l6ZSoxMCArIGFwZXJ0dXJlX3NpemUgKSk7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpcHBfc29iZWxfaG9yaXooIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBEeS0+ZGF0YS5wdHIsIGRfc3RlcCwgc3RyaXBlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBhcGVydHVyZV9zaXplKjEwICsgYXBlcnR1cmVfc2l6ZSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyppZiggaXBwX3NjaGFycl92ZXJ0ICkqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX3NjaGFycl92ZXJ0KCBzaGlmdGVkX3B0ciwgdGVtcF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgRHgtPmRhdGEucHRyLCBkX3N0ZXAsIHN0cmlwZV9zaXplICkpOworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX3NjaGFycl9ob3Jpeiggc2hpZnRlZF9wdHIsIHRlbXBfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIER5LT5kYXRhLnB0ciwgZF9zdGVwLCBzdHJpcGVfc2l6ZSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdHJpcGVfc2l6ZS5oZWlnaHQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiBjb3ZfZGF0YSA9IChmbG9hdCopKGNvdi0+ZGF0YS5wdHIgKyBpKmNvdi0+c3RlcCk7CisgICAgICAgICAgICBpZiggZF9kZXB0aCA9PSBDVl8xNlMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0KiBkeGRhdGEgPSAoY29uc3Qgc2hvcnQqKShEeC0+ZGF0YS5wdHIgKyBpKkR4LT5zdGVwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCogZHlkYXRhID0gKGNvbnN0IHNob3J0KikoRHktPmRhdGEucHRyICsgaSpEeS0+c3RlcCk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeCA9IGR4ZGF0YVtqXSpmYWN0b3J4OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHkgPSBkeWRhdGFbal0qZmFjdG9yeTsKKworICAgICAgICAgICAgICAgICAgICBjb3ZfZGF0YVtqKjNdID0gKGZsb2F0KShkeCpkeCk7CisgICAgICAgICAgICAgICAgICAgIGNvdl9kYXRhW2oqMysxXSA9IChmbG9hdCkoZHgqZHkpOworICAgICAgICAgICAgICAgICAgICBjb3ZfZGF0YVtqKjMrMl0gPSAoZmxvYXQpKGR5KmR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR4ZGF0YSA9IChjb25zdCBmbG9hdCopKER4LT5kYXRhLnB0ciArIGkqRHgtPnN0ZXApOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkeWRhdGEgPSAoY29uc3QgZmxvYXQqKShEeS0+ZGF0YS5wdHIgKyBpKkR5LT5zdGVwKTsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR4ID0gZHhkYXRhW2pdKmZhY3Rvcng7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeSA9IGR5ZGF0YVtqXSpmYWN0b3J5OworCisgICAgICAgICAgICAgICAgICAgIGNvdl9kYXRhW2oqM10gPSAoZmxvYXQpKGR4KmR4KTsKKyAgICAgICAgICAgICAgICAgICAgY292X2RhdGFbaiozKzFdID0gKGZsb2F0KShkeCpkeSk7CisgICAgICAgICAgICAgICAgICAgIGNvdl9kYXRhW2oqMysyXSA9IChmbG9hdCkoZHkqZHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCB5ICsgc3RyaXBlX3NpemUuaGVpZ2h0ID49IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHN0YWdlID0gc3RhZ2UgJiBDVl9TVEFSVCA/IENWX1NUQVJUICsgQ1ZfRU5EIDogQ1ZfRU5EOworCisgICAgICAgIHN0cmlwZV9zaXplLmhlaWdodCA9IGJsdXJfZmlsdGVyLnByb2Nlc3MoY292LGNvdiwKKyAgICAgICAgICAgIGN2UmVjdCgwLDAsLTEsc3RyaXBlX3NpemUuaGVpZ2h0KSxjdlBvaW50KDAsMCksc3RhZ2UrQ1ZfSVNPTEFURURfUk9JKTsKKworICAgICAgICBpZiggb3BfdHlwZSA9PSBJQ1ZfTUlORUlHRU5WQUwgKQorICAgICAgICAgICAgaWN2Q2FsY01pbkVpZ2VuVmFsKCBjb3YtPmRhdGEuZmwsIGNvdi0+c3RlcCwKKyAgICAgICAgICAgICAgICAoZmxvYXQqKShlaWdlbnYtPmRhdGEucHRyICsgZHN0X3kqZWlnZW52LT5zdGVwKSwgZWlnZW52LT5zdGVwLAorICAgICAgICAgICAgICAgIHN0cmlwZV9zaXplLCBzcXJ0X2J1ZiApOworICAgICAgICBlbHNlIGlmKCBvcF90eXBlID09IElDVl9IQVJSSVMgKQorICAgICAgICAgICAgaWN2Q2FsY0hhcnJpcyggY292LT5kYXRhLmZsLCBjb3YtPnN0ZXAsCisgICAgICAgICAgICAgICAgKGZsb2F0KikoZWlnZW52LT5kYXRhLnB0ciArIGRzdF95KmVpZ2Vudi0+c3RlcCksIGVpZ2Vudi0+c3RlcCwKKyAgICAgICAgICAgICAgICBzdHJpcGVfc2l6ZSwgc3FydF9idWYsIGsgKTsKKyAgICAgICAgZWxzZSBpZiggb3BfdHlwZSA9PSBJQ1ZfRUlHRU5WQUxTVkVDUyApCisgICAgICAgICAgICBpY3ZDYWxjRWlnZW5WYWxzVmVjcyggY292LT5kYXRhLmZsLCBjb3YtPnN0ZXAsCisgICAgICAgICAgICAgICAgKGZsb2F0KikoZWlnZW52LT5kYXRhLnB0ciArIGRzdF95KmVpZ2Vudi0+c3RlcCksIGVpZ2Vudi0+c3RlcCwKKyAgICAgICAgICAgICAgICBzdHJpcGVfc2l6ZSwgc3FydF9idWYgKTsKKworICAgICAgICBkc3RfeSArPSBzdHJpcGVfc2l6ZS5oZWlnaHQ7CisgICAgICAgIHN0YWdlID0gQ1ZfTUlERExFOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZEeCApOworICAgIGN2UmVsZWFzZU1hdCggJkR5ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY292ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc3FydF9idWYgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wc3JjICk7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNvcm5lck1pbkVpZ2VuVmFsKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGVpZ2VudmFyciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplLCBpbnQgYXBlcnR1cmVfc2l6ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvcm5lck1pbkVpZ2VuVmFsIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGVpZ3N0dWIsICplaWdlbnYgPSAoQ3ZNYXQqKWVpZ2VudmFycjsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzdHViICkpOworICAgIENWX0NBTEwoIGVpZ2VudiA9IGN2R2V0TWF0KCBlaWdlbnYsICZlaWdzdHViICkpOworCisgICAgaWYoIChDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzEgJiYgQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSAhPSBDVl8zMkZDMSkgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoZWlnZW52LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IG11c3QgYmUgOHVDMSBvciAzMmZDMSwgb3V0cHV0IG11c3QgYmUgMzJmQzEiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBlaWdlbnYgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgQ1ZfQ0FMTCggaWN2Q29ybmVyRWlnZW5WYWxzVmVjcyggc3JjLCBlaWdlbnYsIGJsb2NrX3NpemUsIGFwZXJ0dXJlX3NpemUsIElDVl9NSU5FSUdFTlZBTCApKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNvcm5lckhhcnJpcyggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGhhcnJpc19yZXNwb25jZSwKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSwgaW50IGFwZXJ0dXJlX3NpemUsIGRvdWJsZSBrICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q29ybmVySGFycmlzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGVpZ3N0dWIsICplaWdlbnYgPSAoQ3ZNYXQqKWhhcnJpc19yZXNwb25jZTsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzdHViICkpOworICAgIENWX0NBTEwoIGVpZ2VudiA9IGN2R2V0TWF0KCBlaWdlbnYsICZlaWdzdHViICkpOworCisgICAgaWYoIChDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzEgJiYgQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSAhPSBDVl8zMkZDMSkgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoZWlnZW52LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IG11c3QgYmUgOHVDMSBvciAzMmZDMSwgb3V0cHV0IG11c3QgYmUgMzJmQzEiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBlaWdlbnYgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgQ1ZfQ0FMTCggaWN2Q29ybmVyRWlnZW5WYWxzVmVjcyggc3JjLCBlaWdlbnYsIGJsb2NrX3NpemUsIGFwZXJ0dXJlX3NpemUsIElDVl9IQVJSSVMsIGsgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZDb3JuZXJFaWdlblZhbHNBbmRWZWNzKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGVpZ2VudmFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUsIGludCBhcGVydHVyZV9zaXplICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q29ybmVyRWlnZW5WYWxzQW5kVmVjcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBlaWdzdHViLCAqZWlnZW52ID0gKEN2TWF0KillaWdlbnZhcnI7CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjYXJyLCAmc3R1YiApKTsKKyAgICBDVl9DQUxMKCBlaWdlbnYgPSBjdkdldE1hdCggZWlnZW52LCAmZWlnc3R1YiApKTsKKworICAgIGlmKCBDVl9NQVRfQ04oZWlnZW52LT50eXBlKSplaWdlbnYtPmNvbHMgIT0gc3JjLT5jb2xzKjYgfHwKKyAgICAgICAgZWlnZW52LT5yb3dzICE9IHNyYy0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk91dHB1dCBhcnJheSBzaG91bGQgYmUgNiB0aW1lcyAiCisgICAgICAgICAgICAid2lkZXIgdGhhbiB0aGUgaW5wdXQgYXJyYXkgYW5kIHRoZXkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgaGVpZ2h0Iik7CisKKyAgICBpZiggKENWX01BVF9UWVBFKHNyYy0+dHlwZSkgIT0gQ1ZfOFVDMSAmJiBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzMyRkMxKSB8fAorICAgICAgICBDVl9NQVRfVFlQRShlaWdlbnYtPnR5cGUpICE9IENWXzMyRkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgbXVzdCBiZSA4dUMxIG9yIDMyZkMxLCBvdXRwdXQgbXVzdCBiZSAzMmZDMSIgKTsKKworICAgIENWX0NBTEwoIGljdkNvcm5lckVpZ2VuVmFsc1ZlY3MoIHNyYywgZWlnZW52LCBibG9ja19zaXplLCBhcGVydHVyZV9zaXplLCBJQ1ZfRUlHRU5WQUxTVkVDUyApKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlByZUNvcm5lckRldGVjdCggY29uc3Qgdm9pZCogc3JjYXJyLCB2b2lkKiBkc3RhcnIsIGludCBhcGVydHVyZV9zaXplICkKK3sKKyAgICBDdlNlcEZpbHRlciBkeF9maWx0ZXIsIGR5X2ZpbHRlciwgZDJ4X2ZpbHRlciwgZDJ5X2ZpbHRlciwgZHh5X2ZpbHRlcjsKKyAgICBDdk1hdCAqRHggPSAwLCAqRHkgPSAwLCAqRDJ4ID0gMCwgKkQyeSA9IDAsICpEeHkgPSAwOworICAgIEN2TWF0ICp0ZW1wc3JjID0gMDsKKyAgICAKKyAgICBpbnQgYnVmX3NpemUgPSAxIDw8IDEyOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByZUNvcm5lckRldGVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBqLCB5LCBkc3RfeSA9IDAsIG1heF9keSwgZGVsdGEgPSAwOworICAgIGludCB0ZW1wX3N0ZXAgPSAwLCBkX3N0ZXA7CisgICAgdWNoYXIqIHNoaWZ0ZWRfcHRyID0gMDsKKyAgICBpbnQgZGVwdGgsIGRfZGVwdGg7CisgICAgaW50IHN0YWdlID0gQ1ZfU1RBUlQ7CisgICAgQ3ZTb2JlbEZpeGVkSVBQRnVuYyBpcHBfc29iZWxfdmVydCA9IDAsIGlwcF9zb2JlbF9ob3JpeiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfdmVydF9zZWNvbmQgPSAwLCBpcHBfc29iZWxfaG9yaXpfc2Vjb25kID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9jcm9zcyA9IDA7CisgICAgQ3ZTaXplIGVsX3NpemUsIHNpemUsIHN0cmlwZV9zaXplOworICAgIGludCBhbGlnbmVkX3dpZHRoOworICAgIEN2UG9pbnQgZWxfYW5jaG9yOworICAgIGRvdWJsZSBmYWN0b3I7CisgICAgQ3ZNYXQgc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBib29sIHVzZV9pcHAgPSBmYWxzZTsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViICkpOworCisgICAgaWYoIChDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzEgJiYgQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSAhPSBDVl8zMkZDMSkgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoZHN0LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IG11c3QgYmUgOHVDMSBvciAzMmZDMSwgb3V0cHV0IG11c3QgYmUgMzJmQzEiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoIGFwZXJ0dXJlX3NpemUgPT0gQ1ZfU0NIQVJSICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJDVl9TQ0hBUlIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGZ1bmN0aW9uIiApOworCisgICAgaWYoIGFwZXJ0dXJlX3NpemUgPCAzIHx8IGFwZXJ0dXJlX3NpemUgPiA3IHx8ICEoYXBlcnR1cmVfc2l6ZSAmIDEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJEZXJpdmF0aXZlIGZpbHRlciBhcGVydHVyZSBzaXplIG11c3QgYmUgMywgNSBvciA3IiApOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoc3JjLT50eXBlKTsKKyAgICBkX2RlcHRoID0gZGVwdGggPT0gQ1ZfOFUgPyBDVl8xNlMgOiBDVl8zMkY7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisgICAgYWxpZ25lZF93aWR0aCA9IGN2QWxpZ24oc2l6ZS53aWR0aCwgNCk7CisKKyAgICBlbF9zaXplID0gY3ZTaXplKCBhcGVydHVyZV9zaXplLCBhcGVydHVyZV9zaXplICk7CisgICAgZWxfYW5jaG9yID0gY3ZQb2ludCggYXBlcnR1cmVfc2l6ZS8yLCBhcGVydHVyZV9zaXplLzIgKTsKKworICAgIGlmKCBhcGVydHVyZV9zaXplIDw9IDUgJiYgaWN2RmlsdGVyU29iZWxWZXJ0Xzh1MTZzX0MxUl9wICkKKyAgICB7CisgICAgICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlwcF9zb2JlbF92ZXJ0ID0gaWN2RmlsdGVyU29iZWxWZXJ0Xzh1MTZzX0MxUl9wOworICAgICAgICAgICAgaXBwX3NvYmVsX2hvcml6ID0gaWN2RmlsdGVyU29iZWxIb3Jpel84dTE2c19DMVJfcDsKKyAgICAgICAgICAgIGlwcF9zb2JlbF92ZXJ0X3NlY29uZCA9IGljdkZpbHRlclNvYmVsVmVydFNlY29uZF84dTE2c19DMVJfcDsKKyAgICAgICAgICAgIGlwcF9zb2JlbF9ob3Jpel9zZWNvbmQgPSBpY3ZGaWx0ZXJTb2JlbEhvcml6U2Vjb25kXzh1MTZzX0MxUl9wOworICAgICAgICAgICAgaXBwX3NvYmVsX2Nyb3NzID0gaWN2RmlsdGVyU29iZWxDcm9zc184dTE2c19DMVJfcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBpcHBfc29iZWxfdmVydCA9IGljdkZpbHRlclNvYmVsVmVydF8zMmZfQzFSX3A7CisgICAgICAgICAgICBpcHBfc29iZWxfaG9yaXogPSBpY3ZGaWx0ZXJTb2JlbEhvcml6XzMyZl9DMVJfcDsKKyAgICAgICAgICAgIGlwcF9zb2JlbF92ZXJ0X3NlY29uZCA9IGljdkZpbHRlclNvYmVsVmVydFNlY29uZF8zMmZfQzFSX3A7CisgICAgICAgICAgICBpcHBfc29iZWxfaG9yaXpfc2Vjb25kID0gaWN2RmlsdGVyU29iZWxIb3JpelNlY29uZF8zMmZfQzFSX3A7CisgICAgICAgICAgICBpcHBfc29iZWxfY3Jvc3MgPSBpY3ZGaWx0ZXJTb2JlbENyb3NzXzMyZl9DMVJfcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpcHBfc29iZWxfdmVydCAmJiBpcHBfc29iZWxfaG9yaXogJiYgaXBwX3NvYmVsX3ZlcnRfc2Vjb25kICYmCisgICAgICAgIGlwcF9zb2JlbF9ob3Jpel9zZWNvbmQgJiYgaXBwX3NvYmVsX2Nyb3NzICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHRlbXBzcmMgPSBpY3ZJUFBGaWx0ZXJJbml0KCBzcmMsIGJ1Zl9zaXplLCBlbF9zaXplICkpOworICAgICAgICBzaGlmdGVkX3B0ciA9IHRlbXBzcmMtPmRhdGEucHRyICsgZWxfYW5jaG9yLnkqdGVtcHNyYy0+c3RlcCArCisgICAgICAgICAgICAgICAgICAgICAgZWxfYW5jaG9yLngqQ1ZfRUxFTV9TSVpFKGRlcHRoKTsKKyAgICAgICAgdGVtcF9zdGVwID0gdGVtcHNyYy0+c3RlcCA/IHRlbXBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgIG1heF9keSA9IHRlbXBzcmMtPnJvd3MgLSBhcGVydHVyZV9zaXplICsgMTsKKyAgICAgICAgdXNlX2lwcCA9IHRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlwcF9zb2JlbF92ZXJ0ID0gaXBwX3NvYmVsX2hvcml6ID0gMDsKKyAgICAgICAgaXBwX3NvYmVsX3ZlcnRfc2Vjb25kID0gaXBwX3NvYmVsX2hvcml6X3NlY29uZCA9IGlwcF9zb2JlbF9jcm9zcyA9IDA7CisgICAgICAgIGR4X2ZpbHRlci5pbml0X2Rlcml2KCBzaXplLndpZHRoLCBkZXB0aCwgZF9kZXB0aCwgMSwgMCwgYXBlcnR1cmVfc2l6ZSApOworICAgICAgICBkeV9maWx0ZXIuaW5pdF9kZXJpdiggc2l6ZS53aWR0aCwgZGVwdGgsIGRfZGVwdGgsIDAsIDEsIGFwZXJ0dXJlX3NpemUgKTsKKyAgICAgICAgZDJ4X2ZpbHRlci5pbml0X2Rlcml2KCBzaXplLndpZHRoLCBkZXB0aCwgZF9kZXB0aCwgMiwgMCwgYXBlcnR1cmVfc2l6ZSApOworICAgICAgICBkMnlfZmlsdGVyLmluaXRfZGVyaXYoIHNpemUud2lkdGgsIGRlcHRoLCBkX2RlcHRoLCAwLCAyLCBhcGVydHVyZV9zaXplICk7CisgICAgICAgIGR4eV9maWx0ZXIuaW5pdF9kZXJpdiggc2l6ZS53aWR0aCwgZGVwdGgsIGRfZGVwdGgsIDEsIDEsIGFwZXJ0dXJlX3NpemUgKTsKKyAgICAgICAgbWF4X2R5ID0gYnVmX3NpemUgLyBzcmMtPmNvbHM7CisgICAgICAgIG1heF9keSA9IE1BWCggbWF4X2R5LCBhcGVydHVyZV9zaXplICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggRHggPSBjdkNyZWF0ZU1hdCggbWF4X2R5LCBhbGlnbmVkX3dpZHRoLCBkX2RlcHRoICkpOworICAgIENWX0NBTEwoIER5ID0gY3ZDcmVhdGVNYXQoIG1heF9keSwgYWxpZ25lZF93aWR0aCwgZF9kZXB0aCApKTsKKyAgICBDVl9DQUxMKCBEMnggPSBjdkNyZWF0ZU1hdCggbWF4X2R5LCBhbGlnbmVkX3dpZHRoLCBkX2RlcHRoICkpOworICAgIENWX0NBTEwoIEQyeSA9IGN2Q3JlYXRlTWF0KCBtYXhfZHksIGFsaWduZWRfd2lkdGgsIGRfZGVwdGggKSk7CisgICAgQ1ZfQ0FMTCggRHh5ID0gY3ZDcmVhdGVNYXQoIG1heF9keSwgYWxpZ25lZF93aWR0aCwgZF9kZXB0aCApKTsKKyAgICBEeC0+Y29scyA9IER5LT5jb2xzID0gRDJ4LT5jb2xzID0gRDJ5LT5jb2xzID0gRHh5LT5jb2xzID0gc2l6ZS53aWR0aDsKKworICAgIGlmKCAhdXNlX2lwcCApCisgICAgICAgIG1heF9keSAtPSBhcGVydHVyZV9zaXplIC0gMTsKKyAgICBkX3N0ZXAgPSBEeC0+c3RlcCA/IER4LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgc3RyaXBlX3NpemUgPSBzaXplOworCisgICAgZmFjdG9yID0gMSA8PCAoYXBlcnR1cmVfc2l6ZSAtIDEpOworICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgIGZhY3RvciAqPSAyNTU7CisgICAgZmFjdG9yID0gMS4vKGZhY3RvciAqIGZhY3RvciAqIGZhY3Rvcik7CisKKyAgICBhcGVydHVyZV9zaXplID0gYXBlcnR1cmVfc2l6ZSAqIDEwICsgYXBlcnR1cmVfc2l6ZTsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSBkZWx0YSApCisgICAgeworICAgICAgICBpZiggIXVzZV9pcHAgKQorICAgICAgICB7CisgICAgICAgICAgICBkZWx0YSA9IE1JTiggc2l6ZS5oZWlnaHQgLSB5LCBtYXhfZHkgKTsKKyAgICAgICAgICAgIEN2UmVjdCByb2kgPSBjdlJlY3QoMCx5LHNpemUud2lkdGgsZGVsdGEpOworICAgICAgICAgICAgQ3ZQb2ludCBvcmlnaW49Y3ZQb2ludCgwLDApOworCisgICAgICAgICAgICBpZiggeSArIGRlbHRhID09IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICBzdGFnZSA9IHN0YWdlICYgQ1ZfU1RBUlQgPyBDVl9TVEFSVCArIENWX0VORCA6IENWX0VORDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZHhfZmlsdGVyLnByb2Nlc3Moc3JjLER4LHJvaSxvcmlnaW4sc3RhZ2UpOworICAgICAgICAgICAgZHlfZmlsdGVyLnByb2Nlc3Moc3JjLER5LHJvaSxvcmlnaW4sc3RhZ2UpOworICAgICAgICAgICAgZDJ4X2ZpbHRlci5wcm9jZXNzKHNyYyxEMngscm9pLG9yaWdpbixzdGFnZSk7CisgICAgICAgICAgICBkMnlfZmlsdGVyLnByb2Nlc3Moc3JjLEQyeSxyb2ksb3JpZ2luLHN0YWdlKTsKKyAgICAgICAgICAgIHN0cmlwZV9zaXplLmhlaWdodCA9IGR4eV9maWx0ZXIucHJvY2VzcyhzcmMsRHh5LHJvaSxvcmlnaW4sc3RhZ2UpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZGVsdGEgPSBpY3ZJUFBGaWx0ZXJOZXh0U3RyaXBlKCBzcmMsIHRlbXBzcmMsIHksIGVsX3NpemUsIGVsX2FuY2hvciApOworICAgICAgICAgICAgc3RyaXBlX3NpemUuaGVpZ2h0ID0gZGVsdGE7CisKKyAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX3NvYmVsX3ZlcnQoIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgRHgtPmRhdGEucHRyLCBkX3N0ZXAsIHN0cmlwZV9zaXplLCBhcGVydHVyZV9zaXplICkpOworICAgICAgICAgICAgSVBQSV9DQUxMKCBpcHBfc29iZWxfaG9yaXooIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgRHktPmRhdGEucHRyLCBkX3N0ZXAsIHN0cmlwZV9zaXplLCBhcGVydHVyZV9zaXplICkpOworICAgICAgICAgICAgSVBQSV9DQUxMKCBpcHBfc29iZWxfdmVydF9zZWNvbmQoIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgRDJ4LT5kYXRhLnB0ciwgZF9zdGVwLCBzdHJpcGVfc2l6ZSwgYXBlcnR1cmVfc2l6ZSApKTsKKyAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX3NvYmVsX2hvcml6X3NlY29uZCggc2hpZnRlZF9wdHIsIHRlbXBfc3RlcCwKKyAgICAgICAgICAgICAgICBEMnktPmRhdGEucHRyLCBkX3N0ZXAsIHN0cmlwZV9zaXplLCBhcGVydHVyZV9zaXplICkpOworICAgICAgICAgICAgSVBQSV9DQUxMKCBpcHBfc29iZWxfY3Jvc3MoIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgRHh5LT5kYXRhLnB0ciwgZF9zdGVwLCBzdHJpcGVfc2l6ZSwgYXBlcnR1cmVfc2l6ZSApKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdHJpcGVfc2l6ZS5oZWlnaHQ7IGkrKywgZHN0X3krKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiBkc3RkYXRhID0gKGZsb2F0KikoZHN0LT5kYXRhLnB0ciArIGRzdF95KmRzdC0+c3RlcCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBkX2RlcHRoID09IENWXzE2UyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQqIGR4ZGF0YSA9IChjb25zdCBzaG9ydCopKER4LT5kYXRhLnB0ciArIGkqRHgtPnN0ZXApOworICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0KiBkeWRhdGEgPSAoY29uc3Qgc2hvcnQqKShEeS0+ZGF0YS5wdHIgKyBpKkR5LT5zdGVwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCogZDJ4ZGF0YSA9IChjb25zdCBzaG9ydCopKEQyeC0+ZGF0YS5wdHIgKyBpKkQyeC0+c3RlcCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc2hvcnQqIGQyeWRhdGEgPSAoY29uc3Qgc2hvcnQqKShEMnktPmRhdGEucHRyICsgaSpEMnktPnN0ZXApOworICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0KiBkeHlkYXRhID0gKGNvbnN0IHNob3J0KikoRHh5LT5kYXRhLnB0ciArIGkqRHh5LT5zdGVwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc3RyaXBlX3NpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHggPSBkeGRhdGFbal07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeDIgPSBkeCAqIGR4OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHkgPSBkeWRhdGFbal07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeTIgPSBkeSAqIGR5OworCisgICAgICAgICAgICAgICAgICAgIGRzdGRhdGFbal0gPSAoZmxvYXQpKGZhY3RvciooZHgyKmQyeWRhdGFbal0gKyBkeTIqZDJ4ZGF0YVtqXSAtIDIqZHgqZHkqZHh5ZGF0YVtqXSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZHhkYXRhID0gKGNvbnN0IGZsb2F0KikoRHgtPmRhdGEucHRyICsgaSpEeC0+c3RlcCk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR5ZGF0YSA9IChjb25zdCBmbG9hdCopKER5LT5kYXRhLnB0ciArIGkqRHktPnN0ZXApOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBkMnhkYXRhID0gKGNvbnN0IGZsb2F0KikoRDJ4LT5kYXRhLnB0ciArIGkqRDJ4LT5zdGVwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZDJ5ZGF0YSA9IChjb25zdCBmbG9hdCopKEQyeS0+ZGF0YS5wdHIgKyBpKkQyeS0+c3RlcCk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGR4eWRhdGEgPSAoY29uc3QgZmxvYXQqKShEeHktPmRhdGEucHRyICsgaSpEeHktPnN0ZXApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzdHJpcGVfc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeCA9IGR4ZGF0YVtqXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR5ID0gZHlkYXRhW2pdOworICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2pdID0gKGZsb2F0KShmYWN0b3IqKGR4KmR4KmQyeWRhdGFbal0gKyBkeSpkeSpkMnhkYXRhW2pdIC0gMipkeCpkeSpkeHlkYXRhW2pdKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhZ2UgPSBDVl9NSURETEU7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJkR4ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmRHkgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZEMnggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZEMnkgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZEeHkgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wc3JjICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zjb3JuZXJzdWJwaXguY3BwIGIvY3Yvc3JjL2N2Y29ybmVyc3VicGl4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWIyODJjCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2Y29ybmVyc3VicGl4LmNwcApAQCAtMCwwICsxLDI2OCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKK0NWX0lNUEwgdm9pZAorY3ZGaW5kQ29ybmVyU3ViUGl4KCBjb25zdCB2b2lkKiBzcmNhcnIsIEN2UG9pbnQyRDMyZiogY29ybmVycywKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBDdlNpemUgd2luLCBDdlNpemUgemVyb1pvbmUsCisgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhICkKK3sKKyAgICBmbG9hdCogYnVmZmVyID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZENvcm5lclN1YlBpeCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGludCBNQVhfSVRFUlMgPSAxMDA7CisgICAgY29uc3QgZmxvYXQgZHJ2X3hbXSA9IHsgLTEuZiwgMC5mLCAxLmYgfTsKKyAgICBjb25zdCBmbG9hdCBkcnZfeVtdID0geyAwLmYsIDAuNWYsIDAuZiB9OworICAgIGZsb2F0ICptYXNrWDsKKyAgICBmbG9hdCAqbWFza1k7CisgICAgZmxvYXQgKm1hc2s7CisgICAgZmxvYXQgKnNyY19idWZmZXI7CisgICAgZmxvYXQgKmd4X2J1ZmZlcjsKKyAgICBmbG9hdCAqZ3lfYnVmZmVyOworICAgIGludCB3aW5fdyA9IHdpbi53aWR0aCAqIDIgKyAxLCB3aW5faCA9IHdpbi5oZWlnaHQgKiAyICsgMTsKKyAgICBpbnQgd2luX3JlY3Rfc2l6ZSA9ICh3aW5fdyArIDQpICogKHdpbl9oICsgNCk7CisgICAgZG91YmxlIGNvZWZmOworICAgIEN2U2l6ZSBzaXplLCBzcmNfYnVmX3NpemU7CisgICAgaW50IGksIGosIGssIHB0X2k7CisgICAgaW50IG1heF9pdGVycywgYnVmZmVyX3NpemU7CisgICAgZG91YmxlIGVwczsKKworICAgIEN2TWF0IHN0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjYXJyLCAmc3R1YiApKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRSggc3JjLT50eXBlICkgIT0gQ1ZfOFVDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgaWYoICFjb3JuZXJzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggY291bnQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICBpZiggY291bnQgPT0gMCApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggd2luLndpZHRoIDw9IDAgfHwgd2luLmhlaWdodCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKworICAgIGlmKCBzaXplLndpZHRoIDwgd2luX3cgKyA0IHx8IHNpemUuaGVpZ2h0IDwgd2luX2ggKyA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICAvKiBpbml0aWFsaXplIHZhcmlhYmxlcywgY29udHJvbGxpbmcgbG9vcCB0ZXJtaW5hdGlvbiAqLworICAgIHN3aXRjaCggY3JpdGVyaWEudHlwZSApCisgICAgeworICAgIGNhc2UgQ1ZfVEVSTUNSSVRfSVRFUjoKKyAgICAgICAgZXBzID0gMC5mOworICAgICAgICBtYXhfaXRlcnMgPSBjcml0ZXJpYS5tYXhfaXRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9URVJNQ1JJVF9FUFM6CisgICAgICAgIGVwcyA9IGNyaXRlcmlhLmVwc2lsb247CisgICAgICAgIG1heF9pdGVycyA9IE1BWF9JVEVSUzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9URVJNQ1JJVF9JVEVSIHwgQ1ZfVEVSTUNSSVRfRVBTOgorICAgICAgICBlcHMgPSBjcml0ZXJpYS5lcHNpbG9uOworICAgICAgICBtYXhfaXRlcnMgPSBjcml0ZXJpYS5tYXhfaXRlcjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCAwICk7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiIiApOworICAgIH0KKworICAgIGVwcyA9IE1BWCggZXBzLCAwICk7CisgICAgZXBzICo9IGVwczsgICAgICAgICAgICAgICAgIC8qIHVzZSBzcXVhcmUgb2YgZXJyb3IgaW4gY29tcGFyc2lvbiBvcGVyYXRpb25zLiAqLworCisgICAgbWF4X2l0ZXJzID0gTUFYKCBtYXhfaXRlcnMsIDEgKTsKKyAgICBtYXhfaXRlcnMgPSBNSU4oIG1heF9pdGVycywgTUFYX0lURVJTICk7CisKKyAgICAvKiBzZXR1cCBidWZmZXIgKi8KKyAgICBidWZmZXJfc2l6ZSA9ICh3aW5fcmVjdF9zaXplICogNSArIHdpbl93ICsgd2luX2ggKyAzMikgKiBzaXplb2YoZmxvYXQpOworICAgIGJ1ZmZlciA9IChmbG9hdCopY3ZBbGxvYyggYnVmZmVyX3NpemUgKTsKKworICAgIC8qIGFzc2lnbiBwb2ludGVycyAqLworICAgIG1hc2tYID0gYnVmZmVyOworICAgIG1hc2tZID0gbWFza1ggKyB3aW5fdyArIDQ7CisgICAgbWFzayA9IG1hc2tZICsgd2luX2ggKyA0OworICAgIHNyY19idWZmZXIgPSBtYXNrICsgd2luX3cgKiB3aW5faDsKKyAgICBneF9idWZmZXIgPSBzcmNfYnVmZmVyICsgd2luX3JlY3Rfc2l6ZTsKKyAgICBneV9idWZmZXIgPSBneF9idWZmZXIgKyB3aW5fcmVjdF9zaXplOworCisgICAgY29lZmYgPSAxLiAvICh3aW4ud2lkdGggKiB3aW4ud2lkdGgpOworCisgICAgLyogY2FsY3VsYXRlIG1hc2sgKi8KKyAgICBmb3IoIGkgPSAtd2luLndpZHRoLCBrID0gMDsgaSA8PSB3aW4ud2lkdGg7IGkrKywgaysrICkKKyAgICB7CisgICAgICAgIG1hc2tYW2tdID0gKGZsb2F0KWV4cCggLWkgKiBpICogY29lZmYgKTsKKyAgICB9CisKKyAgICBpZiggd2luLndpZHRoID09IHdpbi5oZWlnaHQgKQorICAgIHsKKyAgICAgICAgbWFza1kgPSBtYXNrWDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29lZmYgPSAxLiAvICh3aW4uaGVpZ2h0ICogd2luLmhlaWdodCk7CisgICAgICAgIGZvciggaSA9IC13aW4uaGVpZ2h0LCBrID0gMDsgaSA8PSB3aW4uaGVpZ2h0OyBpKyssIGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2tZW2tdID0gKGZsb2F0KSBleHAoIC1pICogaSAqIGNvZWZmICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgd2luX2g7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgd2luX3c7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hc2tbaSAqIHdpbl93ICsgal0gPSBtYXNrWFtqXSAqIG1hc2tZW2ldOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKiBtYWtlIHplcm9fem9uZSAqLworICAgIGlmKCB6ZXJvWm9uZS53aWR0aCA+PSAwICYmIHplcm9ab25lLmhlaWdodCA+PSAwICYmCisgICAgICAgIHplcm9ab25lLndpZHRoICogMiArIDEgPCB3aW5fdyAmJiB6ZXJvWm9uZS5oZWlnaHQgKiAyICsgMSA8IHdpbl9oICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IHdpbi5oZWlnaHQgLSB6ZXJvWm9uZS5oZWlnaHQ7IGkgPD0gd2luLmhlaWdodCArIHplcm9ab25lLmhlaWdodDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gd2luLndpZHRoIC0gemVyb1pvbmUud2lkdGg7IGogPD0gd2luLndpZHRoICsgemVyb1pvbmUud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFza1tpICogd2luX3cgKyBqXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBzZXQgc2l6ZXMgb2YgaW1hZ2UgcmVjdGFuZ2xlcywgdXNlZCBpbiBjb252b2x1dGlvbnMgKi8KKyAgICBzcmNfYnVmX3NpemUud2lkdGggPSB3aW5fdyArIDI7CisgICAgc3JjX2J1Zl9zaXplLmhlaWdodCA9IHdpbl9oICsgMjsKKworICAgIC8qIGRvIG9wdGltaXphdGlvbiBsb29wIGZvciBhbGwgdGhlIHBvaW50cyAqLworICAgIGZvciggcHRfaSA9IDA7IHB0X2kgPCBjb3VudDsgcHRfaSsrICkKKyAgICB7CisgICAgICAgIEN2UG9pbnQyRDMyZiBjVCA9IGNvcm5lcnNbcHRfaV0sIGNJID0gY1Q7CisgICAgICAgIGludCBpdGVyID0gMDsKKyAgICAgICAgZG91YmxlIGVycjsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50MkQzMmYgY0kyOworICAgICAgICAgICAgZG91YmxlIGEsIGIsIGMsIGJiMSwgYmIyOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkdldFJlY3RTdWJQaXhfOHUzMmZfQzFSKCAodWNoYXIqKXNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfYnVmZmVyLCAod2luX3cgKyAyKSAqIHNpemVvZiggc3JjX2J1ZmZlclswXSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSggd2luX3cgKyAyLCB3aW5faCArIDIgKSwgY0kgKSk7CisKKyAgICAgICAgICAgIC8qIGNhbGMgZGVyaXZhdGl2ZXMgKi8KKyAgICAgICAgICAgIGljdlNlcENvbnZTbWFsbDNfMzJmKCBzcmNfYnVmZmVyLCBzcmNfYnVmX3NpemUud2lkdGggKiBzaXplb2Yoc3JjX2J1ZmZlclswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3hfYnVmZmVyLCB3aW5fdyAqIHNpemVvZihneF9idWZmZXJbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19idWZfc2l6ZSwgZHJ2X3gsIGRydl95LCBidWZmZXIgKTsKKworICAgICAgICAgICAgaWN2U2VwQ29udlNtYWxsM18zMmYoIHNyY19idWZmZXIsIHNyY19idWZfc2l6ZS53aWR0aCAqIHNpemVvZihzcmNfYnVmZmVyWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBneV9idWZmZXIsIHdpbl93ICogc2l6ZW9mKGd5X2J1ZmZlclswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2J1Zl9zaXplLCBkcnZfeSwgZHJ2X3gsIGJ1ZmZlciApOworCisgICAgICAgICAgICBhID0gYiA9IGMgPSBiYjEgPSBiYjIgPSAwOworCisgICAgICAgICAgICAvKiBwcm9jZXNzIGdyYWRpZW50ICovCisgICAgICAgICAgICBmb3IoIGkgPSAwLCBrID0gMDsgaSA8IHdpbl9oOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBweSA9IGkgLSB3aW4uaGVpZ2h0OworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHdpbl93OyBqKyssIGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgbSA9IG1hc2tba107CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0Z3ggPSBneF9idWZmZXJba107CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0Z3kgPSBneV9idWZmZXJba107CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBneHggPSB0Z3ggKiB0Z3ggKiBtOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ3h5ID0gdGd4ICogdGd5ICogbTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGd5eSA9IHRneSAqIHRneSAqIG07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBweCA9IGogLSB3aW4ud2lkdGg7CisKKyAgICAgICAgICAgICAgICAgICAgYSArPSBneHg7CisgICAgICAgICAgICAgICAgICAgIGIgKz0gZ3h5OworICAgICAgICAgICAgICAgICAgICBjICs9IGd5eTsKKworICAgICAgICAgICAgICAgICAgICBiYjEgKz0gZ3h4ICogcHggKyBneHkgKiBweTsKKyAgICAgICAgICAgICAgICAgICAgYmIyICs9IGd4eSAqIHB4ICsgZ3l5ICogcHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIEFbNF07CisgICAgICAgICAgICAgICAgZG91YmxlIEludkFbNF07CisgICAgICAgICAgICAgICAgQ3ZNYXQgbWF0QSwgbWF0SW52QTsKKworICAgICAgICAgICAgICAgIEFbMF0gPSBhOworICAgICAgICAgICAgICAgIEFbMV0gPSBBWzJdID0gYjsKKyAgICAgICAgICAgICAgICBBWzNdID0gYzsKKworICAgICAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJm1hdEEsIDIsIDIsIENWXzY0RiwgQSApOworICAgICAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJm1hdEludkEsIDIsIDIsIENWXzY0RkMxLCBJbnZBICk7CisKKyAgICAgICAgICAgICAgICBjdkludmVydCggJm1hdEEsICZtYXRJbnZBLCBDVl9TVkQgKTsKKyAgICAgICAgICAgICAgICBjSTIueCA9IChmbG9hdCkoY0kueCArIEludkFbMF0qYmIxICsgSW52QVsxXSpiYjIpOworICAgICAgICAgICAgICAgIGNJMi55ID0gKGZsb2F0KShjSS55ICsgSW52QVsyXSpiYjEgKyBJbnZBWzNdKmJiMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVyciA9IChjSTIueCAtIGNJLngpICogKGNJMi54IC0gY0kueCkgKyAoY0kyLnkgLSBjSS55KSAqIChjSTIueSAtIGNJLnkpOworICAgICAgICAgICAgY0kgPSBjSTI7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoICsraXRlciA8IG1heF9pdGVycyAmJiBlcnIgPiBlcHMgKTsKKworICAgICAgICAvKiBpZiBuZXcgcG9pbnQgaXMgdG9vIGZhciBmcm9tIGluaXRpYWwsIGl0IG1lYW5zIHBvb3IgY29udmVyZ2VuY2UuCisgICAgICAgICAgIGxlYXZlIGluaXRpYWwgcG9pbnQgYXMgdGhlIHJlc3VsdCAqLworICAgICAgICBpZiggZmFicyggY0kueCAtIGNULnggKSA+IHdpbi53aWR0aCB8fCBmYWJzKCBjSS55IC0gY1QueSApID4gd2luLmhlaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNJID0gY1Q7CisgICAgICAgIH0KKworICAgICAgICBjb3JuZXJzW3B0X2ldID0gY0k7ICAgICAvKiBzdG9yZSByZXN1bHQgKi8KKyAgICB9CisKKyAgICBfX0NMRUFOVVBfXzsKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2ZGVyaXYuY3BwIGIvY3Yvc3JjL2N2ZGVyaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzNmODMKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZkZXJpdi5jcHAKQEAgLTAsMCArMSw4NzkgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBsaWdodHdlaWdodCBjb252b2x1dGlvbiB3aXRoIDN4MyBrZXJuZWwgKi8KK3ZvaWQgaWN2U2VwQ29udlNtYWxsM18zMmYoIGZsb2F0KiBzcmMsIGludCBzcmNfc3RlcCwgZmxvYXQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgQ3ZTaXplIHNyY19zaXplLCBjb25zdCBmbG9hdCoga3gsIGNvbnN0IGZsb2F0KiBreSwgZmxvYXQqIGJ1ZmZlciApCit7CisgICAgaW50ICBkc3Rfd2lkdGgsIGJ1ZmZlcl9zdGVwID0gMDsKKyAgICBpbnQgIHgsIHk7CisKKyAgICBhc3NlcnQoIHNyYyAmJiBkc3QgJiYgc3JjX3NpemUud2lkdGggPiAyICYmIHNyY19zaXplLmhlaWdodCA+IDIgJiYKKyAgICAgICAgICAgIChzcmNfc3RlcCAmIDMpID09IDAgJiYgKGRzdF9zdGVwICYgMykgPT0gMCAmJgorICAgICAgICAgICAgKGt4IHx8IGt5KSAmJiAoYnVmZmVyIHx8ICFreCB8fCAha3kpKTsKKworICAgIHNyY19zdGVwIC89IHNpemVvZihzcmNbMF0pOworICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3RbMF0pOworCisgICAgZHN0X3dpZHRoID0gc3JjX3NpemUud2lkdGggLSAyOworCisgICAgaWYoICFreCApCisgICAgeworICAgICAgICAvKiBzZXQgdmFycywgc28gdGhhdCB2ZXJ0aWNhbCBjb252b2x1dGlvbgorICAgICAgICAgICB3aWxsIHdyaXRlIHJlc3VsdHMgaW50byBkZXN0aW5hdGlvbiBST0kgYW5kCisgICAgICAgICAgIGhvcml6b250YWwgY29udm9sdXRpb24gd29uJ3QgcnVuICovCisgICAgICAgIHNyY19zaXplLndpZHRoID0gZHN0X3dpZHRoOworICAgICAgICBidWZmZXJfc3RlcCA9IGRzdF9zdGVwOworICAgICAgICBidWZmZXIgPSBkc3Q7CisgICAgICAgIGRzdF93aWR0aCA9IDA7CisgICAgfQorCisgICAgYXNzZXJ0KCBzcmNfc3RlcCA+PSBzcmNfc2l6ZS53aWR0aCAmJiBkc3Rfc3RlcCA+PSBkc3Rfd2lkdGggKTsKKworICAgIHNyY19zaXplLmhlaWdodCAtPSAzOworICAgIGlmKCAha3kgKQorICAgIHsKKyAgICAgICAgLyogc2V0IHZhcnMsIHNvIHRoYXQgdmVydGljYWwgY29udm9sdXRpb24gd29uJ3QgcnVuIGFuZAorICAgICAgICAgICBob3Jpem9udGFsIGNvbnZvbHV0aW9uIHdpbGwgd3JpdGUgcmVzdWx0cyBpbnRvIGRlc3RpbmF0aW9uIFJPSSAqLworICAgICAgICBzcmNfc2l6ZS5oZWlnaHQgKz0gMzsKKyAgICAgICAgYnVmZmVyX3N0ZXAgPSBzcmNfc3RlcDsKKyAgICAgICAgYnVmZmVyID0gc3JjOworICAgICAgICBzcmNfc2l6ZS53aWR0aCA9IDA7CisgICAgfQorCisgICAgZm9yKCB5ID0gMDsgeSA8PSBzcmNfc2l6ZS5oZWlnaHQ7IHkrKywgc3JjICs9IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKz0gYnVmZmVyX3N0ZXAgKQorICAgIHsKKyAgICAgICAgZmxvYXQqIHNyYzIgPSBzcmMgKyBzcmNfc3RlcDsKKyAgICAgICAgZmxvYXQqIHNyYzMgPSBzcmMgKyBzcmNfc3RlcCoyOworICAgICAgICBmb3IoIHggPSAwOyB4IDwgc3JjX3NpemUud2lkdGg7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZmZlclt4XSA9IChmbG9hdCkoa3lbMF0qc3JjW3hdICsga3lbMV0qc3JjMlt4XSArIGt5WzJdKnNyYzNbeF0pOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGRzdF93aWR0aDsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W3hdID0gKGZsb2F0KShreFswXSpidWZmZXJbeF0gKyBreFsxXSpidWZmZXJbeCsxXSArIGt4WzJdKmJ1ZmZlclt4KzJdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29iZWwgJiBTY2hhcnIgRGVyaXZhdGl2ZSBGaWx0ZXJzCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBPbGQgSVBQIGRlcml2YXRpdmUgZmlsdGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBzdGlsbCB1c2VkIGluIGNvcm5lciBkZXRlY3RvcnMgKHNlZSBjdmNvcm5lci5jcHApCisKK2ljdkZpbHRlclNvYmVsVmVydF84dTE2c19DMVJfdCBpY3ZGaWx0ZXJTb2JlbFZlcnRfOHUxNnNfQzFSX3AgPSAwOworaWN2RmlsdGVyU29iZWxIb3Jpel84dTE2c19DMVJfdCBpY3ZGaWx0ZXJTb2JlbEhvcml6Xzh1MTZzX0MxUl9wID0gMDsKK2ljdkZpbHRlclNvYmVsVmVydFNlY29uZF84dTE2c19DMVJfdCBpY3ZGaWx0ZXJTb2JlbFZlcnRTZWNvbmRfOHUxNnNfQzFSX3AgPSAwOworaWN2RmlsdGVyU29iZWxIb3JpelNlY29uZF84dTE2c19DMVJfdCBpY3ZGaWx0ZXJTb2JlbEhvcml6U2Vjb25kXzh1MTZzX0MxUl9wID0gMDsKK2ljdkZpbHRlclNvYmVsQ3Jvc3NfOHUxNnNfQzFSX3QgaWN2RmlsdGVyU29iZWxDcm9zc184dTE2c19DMVJfcCA9IDA7CisKK2ljdkZpbHRlclNvYmVsVmVydF8zMmZfQzFSX3QgaWN2RmlsdGVyU29iZWxWZXJ0XzMyZl9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJTb2JlbEhvcml6XzMyZl9DMVJfdCBpY3ZGaWx0ZXJTb2JlbEhvcml6XzMyZl9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJTb2JlbFZlcnRTZWNvbmRfMzJmX0MxUl90IGljdkZpbHRlclNvYmVsVmVydFNlY29uZF8zMmZfQzFSX3AgPSAwOworaWN2RmlsdGVyU29iZWxIb3JpelNlY29uZF8zMmZfQzFSX3QgaWN2RmlsdGVyU29iZWxIb3JpelNlY29uZF8zMmZfQzFSX3AgPSAwOworaWN2RmlsdGVyU29iZWxDcm9zc18zMmZfQzFSX3QgaWN2RmlsdGVyU29iZWxDcm9zc18zMmZfQzFSX3AgPSAwOworCitpY3ZGaWx0ZXJTY2hhcnJWZXJ0Xzh1MTZzX0MxUl90IGljdkZpbHRlclNjaGFyclZlcnRfOHUxNnNfQzFSX3AgPSAwOworaWN2RmlsdGVyU2NoYXJySG9yaXpfOHUxNnNfQzFSX3QgaWN2RmlsdGVyU2NoYXJySG9yaXpfOHUxNnNfQzFSX3AgPSAwOworaWN2RmlsdGVyU2NoYXJyVmVydF8zMmZfQzFSX3QgaWN2RmlsdGVyU2NoYXJyVmVydF8zMmZfQzFSX3AgPSAwOworaWN2RmlsdGVyU2NoYXJySG9yaXpfMzJmX0MxUl90IGljdkZpbHRlclNjaGFyckhvcml6XzMyZl9DMVJfcCA9IDA7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBOZXcgSVBQIGRlcml2YXRpdmUgZmlsdGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElQQ1ZfRklMVEVSX1BUUlMoIG5hbWUgKSAgICAgICAgICAgICAgICAgICAgXAoraWN2RmlsdGVyIyNuYW1lIyNHZXRCdWZTaXplXzh1MTZzX0MxUl90ICAgICAgICAgICAgIFwKKyAgICBpY3ZGaWx0ZXIjI25hbWUjI0dldEJ1ZlNpemVfOHUxNnNfQzFSX3AgPSAwOyAgICBcCitpY3ZGaWx0ZXIjI25hbWUjI0JvcmRlcl84dTE2c19DMVJfdCAgICAgICAgICAgICAgICAgXAorICAgIGljdkZpbHRlciMjbmFtZSMjQm9yZGVyXzh1MTZzX0MxUl9wID0gMDsgICAgICAgIFwKK2ljdkZpbHRlciMjbmFtZSMjR2V0QnVmU2l6ZV8zMmZfQzFSX3QgICAgICAgICAgICAgICBcCisgICAgaWN2RmlsdGVyIyNuYW1lIyNHZXRCdWZTaXplXzMyZl9DMVJfcCA9IDA7ICAgICAgXAoraWN2RmlsdGVyIyNuYW1lIyNCb3JkZXJfMzJmX0MxUl90ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpY3ZGaWx0ZXIjI25hbWUjI0JvcmRlcl8zMmZfQzFSX3AgPSAwOworCitJUENWX0ZJTFRFUl9QVFJTKCBTY2hhcnJIb3JpeiApCitJUENWX0ZJTFRFUl9QVFJTKCBTY2hhcnJWZXJ0ICkKK0lQQ1ZfRklMVEVSX1BUUlMoIFNvYmVsSG9yaXogKQorSVBDVl9GSUxURVJfUFRSUyggU29iZWxOZWdWZXJ0ICkKK0lQQ1ZfRklMVEVSX1BUUlMoIFNvYmVsSG9yaXpTZWNvbmQgKQorSVBDVl9GSUxURVJfUFRSUyggU29iZWxWZXJ0U2Vjb25kICkKK0lQQ1ZfRklMVEVSX1BUUlMoIFNvYmVsQ3Jvc3MgKQorSVBDVl9GSUxURVJfUFRSUyggTGFwbGFjaWFuICkKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2RGVyaXYzeDNHZXRCdWZTaXplSVBQRnVuYykKKyAgICAoIEN2U2l6ZSByb2ksIGludCogYnVmc2l6ZSApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZEZXJpdkdldEJ1ZlNpemVJUFBGdW5jKQorICAgICggQ3ZTaXplIHJvaSwgaW50IG1hc2tzaXplLCBpbnQqIGJ1ZnNpemUgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2RGVyaXYzeDNJUFBGdW5jXzh1ICkKKyAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICBDdlNpemUgc2l6ZSwgaW50IGJvcmRlcnR5cGUsIHVjaGFyIGJvcmRlcnZhbHVlLCB2b2lkKiBidWZmZXIgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2RGVyaXYzeDNJUFBGdW5jXzMyZiApCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgQ3ZTaXplIHNpemUsIGludCBib3JkZXJ0eXBlLCBmbG9hdCBib3JkZXJ2YWx1ZSwgdm9pZCogYnVmZmVyICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkRlcml2SVBQRnVuY184dSApCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgQ3ZTaXplIHNpemUsIGludCBtYXNrc2l6ZSwgaW50IGJvcmRlcnR5cGUsCisgICAgICB1Y2hhciBib3JkZXJ2YWx1ZSwgdm9pZCogYnVmZmVyICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkRlcml2SVBQRnVuY18zMmYgKQorICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgIEN2U2l6ZSBzaXplLCBpbnQgbWFza3NpemUsIGludCBib3JkZXJ0eXBlLAorICAgICAgZmxvYXQgYm9yZGVydmFsdWUsIHZvaWQqIGJ1ZmZlciApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ1ZfSU1QTCB2b2lkCitjdlNvYmVsKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgaW50IGR4LCBpbnQgZHksIGludCBhcGVydHVyZV9zaXplICkKK3sKKyAgICBDdlNlcEZpbHRlciBmaWx0ZXI7CisgICAgdm9pZCogYnVmZmVyID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNvYmVsIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG9yaWdpbiA9IDA7CisgICAgaW50IHNyY190eXBlLCBkc3RfdHlwZTsKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjKSApCisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViICkpOworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiApKTsKKworICAgIGlmKCBDVl9JU19JTUFHRV9IRFIoIHNyY2FyciApKQorICAgICAgICBvcmlnaW4gPSAoKElwbEltYWdlKilzcmNhcnIpLT5vcmlnaW47CisKKyAgICBzcmNfdHlwZSA9IENWX01BVF9UWVBFKCBzcmMtPnR5cGUgKTsKKyAgICBkc3RfdHlwZSA9IENWX01BVF9UWVBFKCBkc3QtPnR5cGUgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAic3JjIGFuZCBkc3QgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMiICk7CisKKyAgICBpZiggKChhcGVydHVyZV9zaXplID09IENWX1NDSEFSUiB8fCBhcGVydHVyZV9zaXplID09IDMgfHwgYXBlcnR1cmVfc2l6ZSA9PSA1KSAmJgorICAgICAgICBkeCA8PSAyICYmIGR5IDw9IDIgJiYgZHggKyBkeSA8PSAyICYmIGljdkZpbHRlclNvYmVsTmVnVmVydEJvcmRlcl84dTE2c19DMVJfcCkgJiYKKyAgICAgICAgKHNyY190eXBlID09IENWXzhVQzEgJiYgZHN0X3R5cGUgPT0gQ1ZfMTZTQzEvKiB8fAorICAgICAgICBzcmNfdHlwZSA9PSBDVl8zMkZDMSAmJiBkc3RfdHlwZSA9PSBDVl8zMkZDMSovKSApCisgICAgeworICAgICAgICBDdkRlcml2R2V0QnVmU2l6ZUlQUEZ1bmMgaXBwX3NvYmVsX2dldGJ1ZnNpemVfZnVuYyA9IDA7CisgICAgICAgIEN2RGVyaXZJUFBGdW5jXzh1IGlwcF9zb2JlbF9mdW5jXzh1ID0gMDsKKyAgICAgICAgQ3ZEZXJpdklQUEZ1bmNfMzJmIGlwcF9zb2JlbF9mdW5jXzMyZiA9IDA7CisKKyAgICAgICAgQ3ZEZXJpdjN4M0dldEJ1ZlNpemVJUFBGdW5jIGlwcF9zY2hhcnJfZ2V0YnVmc2l6ZV9mdW5jID0gMDsKKyAgICAgICAgQ3ZEZXJpdjN4M0lQUEZ1bmNfOHUgaXBwX3NjaGFycl9mdW5jXzh1ID0gMDsKKyAgICAgICAgQ3ZEZXJpdjN4M0lQUEZ1bmNfMzJmIGlwcF9zY2hhcnJfZnVuY18zMmYgPSAwOworCisgICAgICAgIGlmKCBhcGVydHVyZV9zaXplID09IENWX1NDSEFSUiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkeCA9PSAxICYmIGR5ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBzcmNfdHlwZSA9PSBDVl84VSApCisgICAgICAgICAgICAgICAgICAgIGlwcF9zY2hhcnJfZnVuY184dSA9IGljdkZpbHRlclNjaGFyclZlcnRCb3JkZXJfOHUxNnNfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zY2hhcnJfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU2NoYXJyVmVydEdldEJ1ZlNpemVfOHUxNnNfQzFSX3A7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpcHBfc2NoYXJyX2Z1bmNfMzJmID0gaWN2RmlsdGVyU2NoYXJyVmVydEJvcmRlcl8zMmZfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zY2hhcnJfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU2NoYXJyVmVydEdldEJ1ZlNpemVfMzJmX0MxUl9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZHggPT0gMCAmJiBkeSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggc3JjX3R5cGUgPT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgICAgICBpcHBfc2NoYXJyX2Z1bmNfOHUgPSBpY3ZGaWx0ZXJTY2hhcnJIb3JpekJvcmRlcl84dTE2c19DMVJfcCwKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NjaGFycl9nZXRidWZzaXplX2Z1bmMgPSBpY3ZGaWx0ZXJTY2hhcnJIb3JpekdldEJ1ZlNpemVfOHUxNnNfQzFSX3A7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpcHBfc2NoYXJyX2Z1bmNfMzJmID0gaWN2RmlsdGVyU2NoYXJySG9yaXpCb3JkZXJfMzJmX0MxUl9wLAorICAgICAgICAgICAgICAgICAgICBpcHBfc2NoYXJyX2dldGJ1ZnNpemVfZnVuYyA9IGljdkZpbHRlclNjaGFyckhvcml6R2V0QnVmU2l6ZV8zMmZfQzFSX3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlNjaGFyciBmaWx0ZXIgY2FuIG9ubHkgYmUgdXNlZCB0byBjb21wdXRlIDFzdCBpbWFnZSBkZXJpdmF0aXZlcyIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkeCA9PSAxICYmIGR5ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBzcmNfdHlwZSA9PSBDVl84VSApCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9mdW5jXzh1ID0gaWN2RmlsdGVyU29iZWxOZWdWZXJ0Qm9yZGVyXzh1MTZzX0MxUl9wLAorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU29iZWxOZWdWZXJ0R2V0QnVmU2l6ZV84dTE2c19DMVJfcDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9mdW5jXzMyZiA9IGljdkZpbHRlclNvYmVsTmVnVmVydEJvcmRlcl8zMmZfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZGaWx0ZXJTb2JlbE5lZ1ZlcnRHZXRCdWZTaXplXzMyZl9DMVJfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGR4ID09IDAgJiYgZHkgPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHNyY190eXBlID09IENWXzhVICkKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2Z1bmNfOHUgPSBpY3ZGaWx0ZXJTb2JlbEhvcml6Qm9yZGVyXzh1MTZzX0MxUl9wLAorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU29iZWxIb3JpekdldEJ1ZlNpemVfOHUxNnNfQzFSX3A7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZnVuY18zMmYgPSBpY3ZGaWx0ZXJTb2JlbEhvcml6Qm9yZGVyXzMyZl9DMVJfcCwKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2dldGJ1ZnNpemVfZnVuYyA9IGljdkZpbHRlclNvYmVsSG9yaXpHZXRCdWZTaXplXzMyZl9DMVJfcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGR4ID09IDIgJiYgZHkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHNyY190eXBlID09IENWXzhVICkKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2Z1bmNfOHUgPSBpY3ZGaWx0ZXJTb2JlbFZlcnRTZWNvbmRCb3JkZXJfOHUxNnNfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZGaWx0ZXJTb2JlbFZlcnRTZWNvbmRHZXRCdWZTaXplXzh1MTZzX0MxUl9wOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2Z1bmNfMzJmID0gaWN2RmlsdGVyU29iZWxWZXJ0U2Vjb25kQm9yZGVyXzMyZl9DMVJfcCwKKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2dldGJ1ZnNpemVfZnVuYyA9IGljdkZpbHRlclNvYmVsVmVydFNlY29uZEdldEJ1ZlNpemVfMzJmX0MxUl9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZHggPT0gMCAmJiBkeSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggc3JjX3R5cGUgPT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZnVuY184dSA9IGljdkZpbHRlclNvYmVsSG9yaXpTZWNvbmRCb3JkZXJfOHUxNnNfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZGaWx0ZXJTb2JlbEhvcml6U2Vjb25kR2V0QnVmU2l6ZV84dTE2c19DMVJfcDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9mdW5jXzMyZiA9IGljdkZpbHRlclNvYmVsSG9yaXpTZWNvbmRCb3JkZXJfMzJmX0MxUl9wLAorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU29iZWxIb3JpelNlY29uZEdldEJ1ZlNpemVfMzJmX0MxUl9wOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZHggPT0gMSAmJiBkeSA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggc3JjX3R5cGUgPT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZnVuY184dSA9IGljdkZpbHRlclNvYmVsQ3Jvc3NCb3JkZXJfOHUxNnNfQzFSX3AsCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZGaWx0ZXJTb2JlbENyb3NzR2V0QnVmU2l6ZV84dTE2c19DMVJfcDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlwcF9zb2JlbF9mdW5jXzMyZiA9IGljdkZpbHRlclNvYmVsQ3Jvc3NCb3JkZXJfMzJmX0MxUl9wLAorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RmlsdGVyU29iZWxDcm9zc0dldEJ1ZlNpemVfMzJmX0MxUl9wOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoICgoaXBwX3NvYmVsX2Z1bmNfOHUgfHwgaXBwX3NvYmVsX2Z1bmNfMzJmKSAmJiBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jKSB8fAorICAgICAgICAgICAgKChpcHBfc2NoYXJyX2Z1bmNfOHUgfHwgaXBwX3NjaGFycl9mdW5jXzMyZikgJiYgaXBwX3NjaGFycl9nZXRidWZzaXplX2Z1bmMpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ1ZnNpemUgPSAwLCBtYXNrc2l6ZSA9IGFwZXJ0dXJlX3NpemUgPT0gMyA/IDMzIDogNTU7CisgICAgICAgICAgICBDdlNpemUgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgICAgICAgICB1Y2hhciogc3JjX3B0ciA9IHNyYy0+ZGF0YS5wdHI7CisgICAgICAgICAgICB1Y2hhciogZHN0X3B0ciA9IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgICAgICBpbnQgc3JjX3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBpbnQgZHN0X3N0ZXAgPSBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBjb25zdCBpbnQgYm9yZGVydHlwZSA9IDE7IC8vIHJlcGxpY2F0aW9uIGJvcmRlcgorICAgICAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzOworCisgICAgICAgICAgICBzdGF0dXMgPSBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jID8KKyAgICAgICAgICAgICAgICBpcHBfc29iZWxfZ2V0YnVmc2l6ZV9mdW5jKCBzaXplLCBtYXNrc2l6ZSwgJmJ1ZnNpemUgKSA6CisgICAgICAgICAgICAgICAgaXBwX3NjaGFycl9nZXRidWZzaXplX2Z1bmMoIHNpemUsICZidWZzaXplICk7CisKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGJ1ZnNpemUgPD0gQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gY3ZTdGFja0FsbG9jKCBidWZzaXplICk7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSBjdkFsbG9jKCBidWZzaXplICkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAgICAgaXBwX3NvYmVsX2Z1bmNfOHUgPyBpcHBfc29iZWxfZnVuY184dSggc3JjX3B0ciwgc3JjX3N0ZXAsIGRzdF9wdHIsIGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBtYXNrc2l6ZSwgYm9yZGVydHlwZSwgMCwgYnVmZmVyICkgOgorICAgICAgICAgICAgICAgICAgICBpcHBfc29iZWxfZnVuY18zMmYgPyBpcHBfc29iZWxfZnVuY18zMmYoIHNyY19wdHIsIHNyY19zdGVwLCBkc3RfcHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBtYXNrc2l6ZSwgYm9yZGVydHlwZSwgMCwgYnVmZmVyICkgOgorICAgICAgICAgICAgICAgICAgICBpcHBfc2NoYXJyX2Z1bmNfOHUgPyBpcHBfc2NoYXJyX2Z1bmNfOHUoIHNyY19wdHIsIHNyY19zdGVwLCBkc3RfcHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBib3JkZXJ0eXBlLCAwLCBidWZmZXIgKSA6CisgICAgICAgICAgICAgICAgICAgIGlwcF9zY2hhcnJfZnVuY18zMmYgPyBpcHBfc2NoYXJyX2Z1bmNfMzJmKCBzcmNfcHRyLCBzcmNfc3RlcCwgZHN0X3B0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBib3JkZXJ0eXBlLCAwLCBidWZmZXIgKSA6IAorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTk9UREVGSU5FRF9FUlI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCAmJgorICAgICAgICAgICAgICAgICgoZHggPT0gMCAmJiBkeSA9PSAxICYmIG9yaWdpbikgfHwgKGR4ID09IDEgJiYgZHkgPT0gMSAmJiAhb3JpZ2luKSkpIC8vIG5lZ2F0ZSB0aGUgb3V0cHV0CisgICAgICAgICAgICAgICAgY3ZTdWJSUyggZHN0LCBjdlNjYWxhckFsbCgwKSwgZHN0ICk7CisKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIENWX0NBTEwoIGZpbHRlci5pbml0X2Rlcml2KCBzcmMtPmNvbHMsIHNyY190eXBlLCBkc3RfdHlwZSwgZHgsIGR5LAorICAgICAgICAgICAgICAgIGFwZXJ0dXJlX3NpemUsIG9yaWdpbiA/IEN2U2VwRmlsdGVyOjpGTElQX0tFUk5FTCA6IDApKTsKKyAgICBDVl9DQUxMKCBmaWx0ZXIucHJvY2Vzcyggc3JjLCBkc3QgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXBsYWNpYW4gRmlsdGVyCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgaWN2TGFwbGFjZVJvd184dTMycyggY29uc3QgdWNoYXIqIHNyYywgaW50KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2TGFwbGFjZVJvd184dTMyZiggY29uc3QgdWNoYXIqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZMYXBsYWNlUm93XzMyZiggY29uc3QgZmxvYXQqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZMYXBsYWNlQ29sXzMyczE2cyggY29uc3QgaW50Kiogc3JjLCBzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkxhcGxhY2VDb2xfMzJmKCBjb25zdCBmbG9hdCoqIHNyYywgZmxvYXQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CisKK0N2TGFwbGFjZUZpbHRlcjo6Q3ZMYXBsYWNlRmlsdGVyKCkKK3sKKyAgICBub3JtYWxpemVkID0gYmFzaWNfbGFwbGFjaWFuID0gZmFsc2U7Cit9CisKKworQ3ZMYXBsYWNlRmlsdGVyOjpDdkxhcGxhY2VGaWx0ZXIoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLCBib29sIF9ub3JtYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfa3NpemUsIGludCBfYm9yZGVyX21vZGUsIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWUgKQoreworICAgIG5vcm1hbGl6ZWQgPSBiYXNpY19sYXBsYWNpYW4gPSBmYWxzZTsKKyAgICBpbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgX25vcm1hbGl6ZWQsIF9rc2l6ZSwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7Cit9CisKKworQ3ZMYXBsYWNlRmlsdGVyOjp+Q3ZMYXBsYWNlRmlsdGVyKCkKK3sKKyAgICBjbGVhcigpOworfQorCisKK3ZvaWQgQ3ZMYXBsYWNlRmlsdGVyOjpnZXRfd29ya19wYXJhbXMoKQoreworICAgIGludCBtaW5fcm93cyA9IG1heF9reSoyICsgMywgcm93cyA9IE1BWChtaW5fcm93cywxMCksIHJvd19zejsKKyAgICBpbnQgd2lkdGggPSBtYXhfd2lkdGgsIHRyb3dfc3ogPSAwOworICAgIGludCBkc3RfZGVwdGggPSBDVl9NQVRfREVQVEgoZHN0X3R5cGUpOworICAgIGludCB3b3JrX2RlcHRoID0gZHN0X2RlcHRoIDwgQ1ZfMzJGID8gQ1ZfMzJTIDogQ1ZfMzJGOworICAgIHdvcmtfdHlwZSA9IENWX01BS0VUWVBFKCB3b3JrX2RlcHRoLCBDVl9NQVRfQ04oZHN0X3R5cGUpKjIgKTsKKyAgICB0cm93X3N6ID0gY3ZBbGlnbiggKG1heF93aWR0aCArIGtzaXplLndpZHRoIC0gMSkqQ1ZfRUxFTV9TSVpFKHNyY190eXBlKSwgQUxJR04gKTsKKyAgICByb3dfc3ogPSBjdkFsaWduKCB3aWR0aCpDVl9FTEVNX1NJWkUod29ya190eXBlKSwgQUxJR04gKTsKKyAgICBidWZfc2l6ZSA9IHJvd3Mqcm93X3N6OworICAgIGJ1Zl9zaXplID0gTUlOKCBidWZfc2l6ZSwgMSA8PCAxNiApOworICAgIGJ1Zl9zaXplID0gTUFYKCBidWZfc2l6ZSwgbWluX3Jvd3Mqcm93X3N6ICk7CisgICAgbWF4X3Jvd3MgPSAoYnVmX3NpemUvcm93X3N6KSozICsgbWF4X2t5KjIgKyA4OworICAgIGJ1Zl9zaXplICs9IHRyb3dfc3o7Cit9CisKKwordm9pZCBDdkxhcGxhY2VGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLCBib29sIF9ub3JtYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfa3NpemUwLCBpbnQgX2JvcmRlcl9tb2RlLCBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBDdk1hdCAqa3ggPSAwLCAqa3kgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdkxhcGxhY2VGaWx0ZXI6OmluaXQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc3JjX2RlcHRoID0gQ1ZfTUFUX0RFUFRIKF9zcmNfdHlwZSksIGRzdF9kZXB0aCA9IENWX01BVF9ERVBUSChfZHN0X3R5cGUpOworICAgIGludCBfa3NpemUgPSBNQVgoIF9rc2l6ZTAsIDMgKTsKKworICAgIG5vcm1hbGl6ZWQgPSBfbm9ybWFsaXplZDsKKyAgICBiYXNpY19sYXBsYWNpYW4gPSBfa3NpemUwID09IDE7CisKKyAgICBpZiggKChzcmNfZGVwdGggIT0gQ1ZfOFUgfHwgKGRzdF9kZXB0aCAhPSBDVl8xNlMgJiYgZHN0X2RlcHRoICE9IENWXzMyRikpICYmCisgICAgICAgIChzcmNfZGVwdGggIT0gQ1ZfMzJGIHx8IGRzdF9kZXB0aCAhPSBDVl8zMkYpKSB8fAorICAgICAgICBDVl9NQVRfQ04oX3NyY190eXBlKSAhPSBDVl9NQVRfQ04oX2RzdF90eXBlKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAiTGFwbGFjaWFuIGNhbiBlaXRoZXIgdHJhbnNmb3JtIDh1LT4xNnMsIG9yIDh1LT4zMmYsIG9yIDMyZi0+MzJmLlxuIgorICAgICAgICAiVGhlIG51bWJlciBvZiBjaGFubmVscyBtdXN0IGJlIHRoZSBzYW1lLiIgKTsKKworICAgIGlmKCBfa3NpemUgPCAxIHx8IF9rc2l6ZSA+IENWX01BWF9TT0JFTF9LU0laRSB8fCBfa3NpemUgJSAyID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImtlcm5lbCBzaXplIG11c3QgYmUgd2l0aGluIDEuLjcgYW5kIG9kZCIgKTsKKworICAgIENWX0NBTEwoIGt4ID0gY3ZDcmVhdGVNYXQoIDEsIF9rc2l6ZSwgQ1ZfMzJGICkpOworICAgIENWX0NBTEwoIGt5ID0gY3ZDcmVhdGVNYXQoIDEsIF9rc2l6ZSwgQ1ZfMzJGICkpOworCisgICAgQ3ZTZXBGaWx0ZXI6OmluaXRfc29iZWxfa2VybmVsKCBreCwga3ksIDIsIDAsIDAgKTsKKyAgICBDdlNlcEZpbHRlcjo6aW5pdCggX21heF93aWR0aCwgX3NyY190eXBlLCBfZHN0X3R5cGUsIGt4LCBreSwKKyAgICAgICAgICAgICAgICAgICAgICAgY3ZQb2ludCgtMSwtMSksIF9ib3JkZXJfbW9kZSwgX2JvcmRlcl92YWx1ZSApOworCisgICAgeF9mdW5jID0gMDsKKyAgICB5X2Z1bmMgPSAwOworCisgICAgaWYoIHNyY19kZXB0aCA9PSBDVl84VSApCisgICAgeworICAgICAgICBpZiggZHN0X2RlcHRoID09IENWXzE2UyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2TGFwbGFjZVJvd184dTMyczsKKyAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2TGFwbGFjZUNvbF8zMnMxNnM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggZHN0X2RlcHRoID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2TGFwbGFjZVJvd184dTMyZjsKKyAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2TGFwbGFjZUNvbF8zMmY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggc3JjX2RlcHRoID09IENWXzMyRiApCisgICAgeworICAgICAgICBpZiggZHN0X2RlcHRoID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2TGFwbGFjZVJvd18zMmY7CisgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkxhcGxhY2VDb2xfMzJmOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICF4X2Z1bmMgfHwgIXlfZnVuYyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZreCApOworICAgIGN2UmVsZWFzZU1hdCggJmt5ICk7Cit9CisKKwordm9pZCBDdkxhcGxhY2VGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50IF9hbmNob3IsIGludCBfYm9yZGVyX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAgQ3ZTZXBGaWx0ZXI6OmluaXQoIF9tYXhfd2lkdGgsIF9zcmNfdHlwZSwgX2RzdF90eXBlLCBfaXNfc2VwYXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICBfa3NpemUsIF9hbmNob3IsIF9ib3JkZXJfbW9kZSwgX2JvcmRlcl92YWx1ZSApOworfQorCisKK3ZvaWQgQ3ZMYXBsYWNlRmlsdGVyOjppbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX2t4LCBjb25zdCBDdk1hdCogX2t5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvciwgaW50IF9ib3JkZXJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBDdlNlcEZpbHRlcjo6aW5pdCggX21heF93aWR0aCwgX3NyY190eXBlLCBfZHN0X3R5cGUsIF9reCwgX2t5LAorICAgICAgICAgICAgICAgICAgICAgICBfYW5jaG9yLCBfYm9yZGVyX21vZGUsIF9ib3JkZXJfdmFsdWUgKTsKK30KKworCisjZGVmaW5lIElDVl9MQVBMQUNFX1JPVyggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCBsb2FkX21hY3JvICkgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZMYXBsYWNlUm93XyMjZmxhdm9yKCBjb25zdCBzcmN0eXBlKiBzcmMsIGRzdHR5cGUqIGRzdCwgdm9pZCogcGFyYW1zIClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgQ3ZMYXBsYWNlRmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdkxhcGxhY2VGaWx0ZXIqKXBhcmFtczsgICAgICBcCisgICAgY29uc3QgQ3ZNYXQqIF9reCA9IHN0YXRlLT5nZXRfeF9rZXJuZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgQ3ZNYXQqIF9reSA9IHN0YXRlLT5nZXRfeV9rZXJuZWwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZHN0dHlwZSoga3ggPSAoZHN0dHlwZSopX2t4LT5kYXRhLnB0cjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZHN0dHlwZSoga3kgPSAoZHN0dHlwZSopX2t5LT5kYXRhLnB0cjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGtzaXplID0gX2t4LT5jb2xzICsgX2t4LT5yb3dzIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGkgPSAwLCBqLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGtzaXplMiA9IGtzaXplLzIsIGtzaXplMm4gPSBrc2l6ZTIqY247ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3Qgc3JjdHlwZSogcyA9IHNyYyArIGtzaXplMm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYm9vbCBiYXNpY19sYXBsYWNpYW4gPSBzdGF0ZS0+aXNfYmFzaWNfbGFwbGFjaWFuKCk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga3ggKz0ga3NpemUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga3kgKz0ga3NpemUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2lkdGggKj0gY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGJhc2ljX2xhcGxhY2lhbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3R0eXBlIHMwID0gbG9hZF9tYWNybyhzW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3R0eXBlIHMxID0gKGRzdHR5cGUpKHNbaS1jbl0gLSBzMCoyICsgc1tpK2NuXSk7ICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krd2lkdGhdID0gczE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigga3NpemUgPT0gMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3R0eXBlIHMwID0gKGRzdHR5cGUpKHNbaS1jbl0gKyBzW2ldKjIgKyBzW2krY25dKTsgICAgICAgICBcCisgICAgICAgICAgICBkc3R0eXBlIHMxID0gKGRzdHR5cGUpKHNbaS1jbl0gLSBzW2ldKjIgKyBzW2krY25dKTsgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krd2lkdGhdID0gczE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZigga3NpemUgPT0gNSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3R0eXBlIHMwID0gKGRzdHR5cGUpKHNbaS0yKmNuXSsoc1tpLWNuXStzW2krY25dKSo0K3NbaV0qNitzW2krMipjbl0pO1wKKyAgICAgICAgICAgIGRzdHR5cGUgczEgPSAoZHN0dHlwZSkoc1tpLTIqY25dLXNbaV0qMitzW2krMipjbl0pOyAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSt3aWR0aF0gPSBzMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdpZHRoOyBpKyssIHMrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdHR5cGUgczAgPSBreVswXSpsb2FkX21hY3JvKHNbMF0pLCBzMSA9IGt4WzBdKmxvYWRfbWFjcm8oc1swXSk7XAorICAgICAgICAgICAgZm9yKCBrID0gMSwgaiA9IGNuOyBrIDw9IGtzaXplMjsgaysrLCBqICs9IGNuICkgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdHR5cGUgdCA9IGxvYWRfbWFjcm8oc1tqXSArIHNbLWpdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IGt5W2tdKnQ7IHMxICs9IGt4W2tdKnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpK3dpZHRoXSA9IHMxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitJQ1ZfTEFQTEFDRV9ST1coIDh1MzJzLCB1Y2hhciwgaW50LCBDVl9OT1AgKQorSUNWX0xBUExBQ0VfUk9XKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0xBUExBQ0VfUk9XKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKKworc3RhdGljIHZvaWQKK2ljdkxhcGxhY2VDb2xfMzJzMTZzKCBjb25zdCBpbnQqKiBzcmMsIHNob3J0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApCit7CisgICAgY29uc3QgQ3ZMYXBsYWNlRmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdkxhcGxhY2VGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t4ID0gc3RhdGUtPmdldF94X2tlcm5lbCgpOworICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7CisgICAgY29uc3QgaW50KiBreCA9IChjb25zdCBpbnQqKV9reC0+ZGF0YS5wdHI7CisgICAgY29uc3QgaW50KiBreSA9IChjb25zdCBpbnQqKV9reS0+ZGF0YS5wdHI7CisgICAgaW50IGtzaXplID0gX2t4LT5jb2xzICsgX2t4LT5yb3dzIC0gMSwga3NpemUyID0ga3NpemUvMjsKKyAgICBpbnQgaSA9IDAsIGssIHdpZHRoID0gc3RhdGUtPmdldF93aWR0aCgpOworICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOworICAgIGJvb2wgYmFzaWNfbGFwbGFjaWFuID0gc3RhdGUtPmlzX2Jhc2ljX2xhcGxhY2lhbigpOworICAgIGJvb2wgbm9ybWFsaXplZCA9IHN0YXRlLT5pc19ub3JtYWxpemVkKCk7CisgICAgaW50IHNoaWZ0ID0ga3NpemUgLSAxLCBkZWx0YSA9ICgxIDw8IHNoaWZ0KSA+PiAxOworICAgIAorICAgIHdpZHRoICo9IGNuOworICAgIHNyYyArPSBrc2l6ZTI7CisgICAga3ggKz0ga3NpemUyOworICAgIGt5ICs9IGtzaXplMjsKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKworICAgIGlmKCBiYXNpY19sYXBsYWNpYW4gfHwgIW5vcm1hbGl6ZWQgKQorICAgIHsKKyAgICAgICAgbm9ybWFsaXplZCA9IGZhbHNlOworICAgICAgICBzaGlmdCA9IGRlbHRhID0gMDsKKyAgICB9CisKKyAgICBmb3IoIDsgY291bnQtLTsgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApCisgICAgeworICAgICAgICBpZigga3NpemUgPT0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCAqc3JjMCA9IHNyY1stMV0sICpzcmMxID0gc3JjWzBdLCAqc3JjMiA9IHNyY1sxXTsKKyAgICAgICAgICAgIGlmKCBiYXNpY19sYXBsYWNpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMwID0gc3JjMFtpXSAtIHNyYzFbaV0qMiArIHNyYzJbaV0gKyBzcmMxW2krd2lkdGhdOworICAgICAgICAgICAgICAgICAgICBpbnQgczEgPSBzcmMwW2krMV0gLSBzcmMxW2krMV0qMiArIHNyYzJbaSsxXSArIHNyYzFbaSt3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKHNob3J0KXMwOyBkc3RbaSsxXSA9IChzaG9ydClzMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpKHNyYzBbaV0gLSBzcmMxW2ldKjIgKyBzcmMyW2ldICsgc3JjMVtpK3dpZHRoXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhbm9ybWFsaXplZCApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSBzcmMwW2ldIC0gc3JjMVtpXSoyICsgc3JjMltpXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzBbaSt3aWR0aF0gKyBzcmMxW2krd2lkdGhdKjIgKyBzcmMyW2krd2lkdGhdOworICAgICAgICAgICAgICAgICAgICBpbnQgczEgPSBzcmMwW2krMV0gLSBzcmMxW2krMV0qMiArIHNyYzJbaSsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzBbaSt3aWR0aCsxXSArIHNyYzFbaSt3aWR0aCsxXSoyICsgc3JjMltpK3dpZHRoKzFdOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IENWX0RFU0NBTEUoc3JjMFtpXSAtIHNyYzFbaV0qMiArIHNyYzJbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGhdICsgc3JjMVtpK3dpZHRoXSoyICsgc3JjMltpK3dpZHRoXSwgMik7CisgICAgICAgICAgICAgICAgICAgIGludCBzMSA9IENWX0RFU0NBTEUoc3JjMFtpKzFdIC0gc3JjMVtpKzFdKjIgKyBzcmMyW2krMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGgrMV0gKyBzcmMxW2krd2lkdGgrMV0qMiArIHNyYzJbaSt3aWR0aCsxXSwyKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKHNob3J0KXMwOyBkc3RbaSsxXSA9IChzaG9ydClzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigga3NpemUgPT0gNSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCAqc3JjMCA9IHNyY1stMl0sICpzcmMxID0gc3JjWy0xXSwgKnNyYzIgPSBzcmNbMF0sICpzcmMzID0gc3JjWzFdLCAqc3JjNCA9IHNyY1syXTsKKworICAgICAgICAgICAgaWYoICFub3JtYWxpemVkICkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNyYzBbaV0gLSBzcmMyW2ldKjIgKyBzcmM0W2ldICsgc3JjMFtpK3dpZHRoXSArIHNyYzRbaSt3aWR0aF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjMVtpK3dpZHRoXSArIHNyYzNbaSt3aWR0aF0pKjQgKyBzcmMyW2krd2lkdGhdKjY7CisgICAgICAgICAgICAgICAgICAgIGludCBzMSA9IHNyYzBbaSsxXSAtIHNyYzJbaSsxXSoyICsgc3JjNFtpKzFdICsgc3JjMFtpK3dpZHRoKzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjNFtpK3dpZHRoKzFdICsgKHNyYzFbaSt3aWR0aCsxXSArIHNyYzNbaSt3aWR0aCsxXSkqNCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJbaSt3aWR0aCsxXSo2OworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IENWX0RFU0NBTEUoc3JjMFtpXSAtIHNyYzJbaV0qMiArIHNyYzRbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGhdICsgc3JjNFtpK3dpZHRoXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMxW2krd2lkdGhdICsgc3JjM1tpK3dpZHRoXSkqNCArIHNyYzJbaSt3aWR0aF0qNiwgNCk7CisgICAgICAgICAgICAgICAgICAgIGludCBzMSA9IENWX0RFU0NBTEUoc3JjMFtpKzFdIC0gc3JjMltpKzFdKjIgKyBzcmM0W2krMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGgrMV0gKyBzcmM0W2krd2lkdGgrMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjMVtpK3dpZHRoKzFdICsgc3JjM1tpK3dpZHRoKzFdKSo0ICsgc3JjMltpK3dpZHRoKzFdKjYsIDQpOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhbm9ybWFsaXplZCApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSBreFswXSpzcmNbMF1baV0gKyBreVswXSpzcmNbMF1baSt3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIGludCBzMSA9IGt4WzBdKnNyY1swXVtpKzFdICsga3lbMF0qc3JjWzBdW2krd2lkdGgrMV07CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMTsgayA8PSBrc2l6ZTI7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogc3JjMSA9IHNyY1trXSArIGksICpzcmMyID0gc3JjWy1rXSArIGk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnggPSBreFtrXSwgZnkgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IGZ4KihzcmMxWzBdICsgc3JjMlswXSkgKyBmeSooc3JjMVt3aWR0aF0gKyBzcmMyW3dpZHRoXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzMSArPSBmeCooc3JjMVsxXSArIHNyYzJbMV0pICsgZnkqKHNyYzFbd2lkdGgrMV0gKyBzcmMyW3dpZHRoKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IENWX0NBU1RfMTZTKHMwKTsgZHN0W2krMV0gPSBDVl9DQVNUXzE2UyhzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMwID0ga3hbMF0qc3JjWzBdW2ldICsga3lbMF0qc3JjWzBdW2krd2lkdGhdOworICAgICAgICAgICAgICAgICAgICBpbnQgczEgPSBreFswXSpzcmNbMF1baSsxXSArIGt5WzBdKnNyY1swXVtpK3dpZHRoKzFdOworCisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHNyYzEgPSBzcmNba10gKyBpLCAqc3JjMiA9IHNyY1sta10gKyBpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZ4ID0ga3hba10sIGZ5ID0ga3lba107CisgICAgICAgICAgICAgICAgICAgICAgICBzMCArPSBmeCooc3JjMVswXSArIHNyYzJbMF0pICsgZnkqKHNyYzFbd2lkdGhdICsgc3JjMlt3aWR0aF0pOworICAgICAgICAgICAgICAgICAgICAgICAgczEgKz0gZngqKHNyYzFbMV0gKyBzcmMyWzFdKSArIGZ5KihzcmMxW3dpZHRoKzFdICsgc3JjMlt3aWR0aCsxXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzMCA9IENWX0RFU0NBTEUoIHMwLCBzaGlmdCApOyBzMSA9IENWX0RFU0NBTEUoIHMxLCBzaGlmdCApOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzMCA9IGt4WzBdKnNyY1swXVtpXSArIGt5WzBdKnNyY1swXVtpK3dpZHRoXTsKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGludCogc3JjMSA9IHNyY1trXSArIGksICpzcmMyID0gc3JjWy1rXSArIGk7CisgICAgICAgICAgICAgICAgczAgKz0ga3hba10qKHNyYzFbMF0gKyBzcmMyWzBdKSArIGt5W2tdKihzcmMxW3dpZHRoXSArIHNyYzJbd2lkdGhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMwID0gKHMwICsgZGVsdGEpID4+IHNoaWZ0OworICAgICAgICAgICAgZHN0W2ldID0gQ1ZfQ0FTVF8xNlMoczApOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZMYXBsYWNlQ29sXzMyZiggY29uc3QgZmxvYXQqKiBzcmMsIGZsb2F0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApCit7CisgICAgY29uc3QgQ3ZMYXBsYWNlRmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdkxhcGxhY2VGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t4ID0gc3RhdGUtPmdldF94X2tlcm5lbCgpOworICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7CisgICAgY29uc3QgZmxvYXQqIGt4ID0gKGNvbnN0IGZsb2F0Kilfa3gtPmRhdGEucHRyOworICAgIGNvbnN0IGZsb2F0KiBreSA9IChjb25zdCBmbG9hdCopX2t5LT5kYXRhLnB0cjsKKyAgICBpbnQga3NpemUgPSBfa3gtPmNvbHMgKyBfa3gtPnJvd3MgLSAxLCBrc2l6ZTIgPSBrc2l6ZS8yOworICAgIGludCBpID0gMCwgaywgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7CisgICAgYm9vbCBiYXNpY19sYXBsYWNpYW4gPSBzdGF0ZS0+aXNfYmFzaWNfbGFwbGFjaWFuKCk7CisgICAgYm9vbCBub3JtYWxpemVkID0gc3RhdGUtPmlzX25vcm1hbGl6ZWQoKTsKKyAgICBmbG9hdCBzY2FsZSA9IDEuZi8oMSA8PCAoa3NpemUgLSAxKSk7CisgICAgCisgICAgd2lkdGggKj0gY247CisgICAgc3JjICs9IGtzaXplMjsKKyAgICBreCArPSBrc2l6ZTI7CisgICAga3kgKz0ga3NpemUyOworICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3RbMF0pOworCisgICAgaWYoIGJhc2ljX2xhcGxhY2lhbiB8fCAhbm9ybWFsaXplZCApCisgICAgeworICAgICAgICBub3JtYWxpemVkID0gZmFsc2U7CisgICAgICAgIHNjYWxlID0gMS5mOworICAgIH0KKworICAgIGZvciggOyBjb3VudC0tOyBkc3QgKz0gZHN0X3N0ZXAsIHNyYysrICkKKyAgICB7CisgICAgICAgIGlmKCBrc2l6ZSA9PSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzAgPSBzcmNbLTFdLCAqc3JjMSA9IHNyY1swXSwgKnNyYzIgPSBzcmNbMV07CisgICAgICAgICAgICBpZiggYmFzaWNfbGFwbGFjaWFuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHMwID0gc3JjMFtpXSAtIHNyYzFbaV0qMiArIHNyYzJbaV0gKyBzcmMxW2krd2lkdGhdOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBzMSA9IHNyYzBbaSsxXSAtIHNyYzFbaSsxXSoyICsgc3JjMltpKzFdICsgc3JjMVtpK3dpZHRoKzFdOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzcmMwW2ldIC0gc3JjMVtpXSoyICsgc3JjMltpXSArIHNyYzFbaSt3aWR0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCAhbm9ybWFsaXplZCApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBzMCA9IHNyYzBbaV0gLSBzcmMxW2ldKjIgKyBzcmMyW2ldICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMFtpK3dpZHRoXSArIHNyYzFbaSt3aWR0aF0qMiArIHNyYzJbaSt3aWR0aF07CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHMxID0gc3JjMFtpKzFdIC0gc3JjMVtpKzFdKjIgKyBzcmMyW2krMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGgrMV0gKyBzcmMxW2krd2lkdGgrMV0qMiArIHNyYzJbaSt3aWR0aCsxXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgczAgPSAoc3JjMFtpXSAtIHNyYzFbaV0qMiArIHNyYzJbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGhdICsgc3JjMVtpK3dpZHRoXSoyICsgc3JjMltpK3dpZHRoXSkqc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHMxID0gKHNyYzBbaSsxXSAtIHNyYzFbaSsxXSoyICsgc3JjMltpKzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMFtpK3dpZHRoKzFdICsgc3JjMVtpK3dpZHRoKzFdKjIgKyBzcmMyW2krd2lkdGgrMV0pKnNjYWxlOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigga3NpemUgPT0gNSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpzcmMwID0gc3JjWy0yXSwgKnNyYzEgPSBzcmNbLTFdLCAqc3JjMiA9IHNyY1swXSwgKnNyYzMgPSBzcmNbMV0sICpzcmM0ID0gc3JjWzJdOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgczAgPSAoc3JjMFtpXSAtIHNyYzJbaV0qMiArIHNyYzRbaV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzBbaSt3aWR0aF0gKyBzcmM0W2krd2lkdGhdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjMVtpK3dpZHRoXSArIHNyYzNbaSt3aWR0aF0pKjQgKyBzcmMyW2krd2lkdGhdKjYpKnNjYWxlOworICAgICAgICAgICAgICAgIGZsb2F0IHMxID0gKHNyYzBbaSsxXSAtIHNyYzJbaSsxXSoyICsgc3JjNFtpKzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmMwW2krd2lkdGgrMV0gKyBzcmM0W2krd2lkdGgrMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMxW2krd2lkdGgrMV0gKyBzcmMzW2krd2lkdGgrMV0pKjQgKyBzcmMyW2krd2lkdGgrMV0qNikqc2NhbGU7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBzMCA9IGt4WzBdKnNyY1swXVtpXSArIGt5WzBdKnNyY1swXVtpK3dpZHRoXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBzMSA9IGt4WzBdKnNyY1swXVtpKzFdICsga3lbMF0qc3JjWzBdW2krd2lkdGgrMV07CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMxID0gc3JjW2tdICsgaSwgKnNyYzIgPSBzcmNbLWtdICsgaTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZnggPSBreFtrXSwgZnkgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gZngqKHNyYzFbMF0gKyBzcmMyWzBdKSArIGZ5KihzcmMxW3dpZHRoXSArIHNyYzJbd2lkdGhdKTsKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gZngqKHNyYzFbMV0gKyBzcmMyWzFdKSArIGZ5KihzcmMxW3dpZHRoKzFdICsgc3JjMlt3aWR0aCsxXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgczAgKj0gc2NhbGU7IHMxICo9IHNjYWxlOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgczAgPSBreFswXSpzcmNbMF1baV0gKyBreVswXSpzcmNbMF1baSt3aWR0aF07CisgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjMSA9IHNyY1trXSArIGksICpzcmMyID0gc3JjWy1rXSArIGk7CisgICAgICAgICAgICAgICAgczAgKz0ga3hba10qKHNyYzFbMF0gKyBzcmMyWzBdKSArIGt5W2tdKihzcmMxW3dpZHRoXSArIHNyYzJbd2lkdGhdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFtpXSA9IHMwKnNjYWxlOworICAgICAgICB9CisgICAgfQorfQorCisKK0NWX0lNUEwgdm9pZAorY3ZMYXBsYWNlKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgaW50IGFwZXJ0dXJlX3NpemUgKQoreworICAgIEN2TGFwbGFjZUZpbHRlciBsYXBsYWNpYW47CisgICAgdm9pZCogYnVmZmVyID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZMYXBsYWNlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBpbnQgc3JjX3R5cGUsIGRzdF90eXBlOworCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIgKSk7CisKKyAgICBzcmNfdHlwZSA9IENWX01BVF9UWVBFKHNyYy0+dHlwZSk7CisgICAgZHN0X3R5cGUgPSBDVl9NQVRfVFlQRShkc3QtPnR5cGUpOworCisgICAgaWYoIChhcGVydHVyZV9zaXplID09IDMgfHwgYXBlcnR1cmVfc2l6ZSA9PSA1KSAmJgorICAgICAgICAoc3JjX3R5cGUgPT0gQ1ZfOFVDMSAmJiBkc3RfdHlwZSA9PSBDVl8xNlNDMS8qIHx8CisgICAgICAgIHNyY190eXBlID09IENWXzMyRkMxICYmIGRzdF90eXBlID09IENWXzMyRkMxKi8pICkKKyAgICB7CisgICAgICAgIEN2RGVyaXZHZXRCdWZTaXplSVBQRnVuYyBpcHBfbGFwbGFjZV9nZXRidWZzaXplX2Z1bmMgPSAwOworICAgICAgICBDdkRlcml2SVBQRnVuY184dSBpcHBfbGFwbGFjZV9mdW5jXzh1ID0gMDsKKyAgICAgICAgQ3ZEZXJpdklQUEZ1bmNfMzJmIGlwcF9sYXBsYWNlX2Z1bmNfMzJmID0gMDsKKworICAgICAgICBpZiggc3JjX3R5cGUgPT0gQ1ZfOFUgKQorICAgICAgICAgICAgaXBwX2xhcGxhY2VfZnVuY184dSA9IGljdkZpbHRlckxhcGxhY2lhbkJvcmRlcl84dTE2c19DMVJfcCwKKyAgICAgICAgICAgIGlwcF9sYXBsYWNlX2dldGJ1ZnNpemVfZnVuYyA9IGljdkZpbHRlckxhcGxhY2lhbkdldEJ1ZlNpemVfOHUxNnNfQzFSX3A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlwcF9sYXBsYWNlX2Z1bmNfMzJmID0gaWN2RmlsdGVyTGFwbGFjaWFuQm9yZGVyXzMyZl9DMVJfcCwKKyAgICAgICAgICAgIGlwcF9sYXBsYWNlX2dldGJ1ZnNpemVfZnVuYyA9IGljdkZpbHRlckxhcGxhY2lhbkdldEJ1ZlNpemVfMzJmX0MxUl9wOworCisgICAgICAgIGlmKCAoaXBwX2xhcGxhY2VfZnVuY184dSB8fCBpcHBfbGFwbGFjZV9mdW5jXzMyZikgJiYgaXBwX2xhcGxhY2VfZ2V0YnVmc2l6ZV9mdW5jICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ1ZnNpemUgPSAwLCBtYXNrc2l6ZSA9IGFwZXJ0dXJlX3NpemUgPT0gMyA/IDMzIDogNTU7CisgICAgICAgICAgICBDdlNpemUgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgICAgICAgICB1Y2hhciogc3JjX3B0ciA9IHNyYy0+ZGF0YS5wdHI7CisgICAgICAgICAgICB1Y2hhciogZHN0X3B0ciA9IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgICAgICBpbnQgc3JjX3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBpbnQgZHN0X3N0ZXAgPSBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBjb25zdCBpbnQgYm9yZGVydHlwZSA9IDE7IC8vIHJlcGxpY2F0aW9uIGJvcmRlcgorICAgICAgICAgICAgQ3ZTdGF0dXMgc3RhdHVzOworCisgICAgICAgICAgICBzdGF0dXMgPSBpcHBfbGFwbGFjZV9nZXRidWZzaXplX2Z1bmMoIHNpemUsIG1hc2tzaXplLCAmYnVmc2l6ZSApOworCisgICAgICAgICAgICBpZiggc3RhdHVzID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBidWZzaXplIDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyggYnVmc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyggYnVmc2l6ZSApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICAgIGlwcF9sYXBsYWNlX2Z1bmNfOHUgPyBpcHBfbGFwbGFjZV9mdW5jXzh1KCBzcmNfcHRyLCBzcmNfc3RlcCwgZHN0X3B0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBtYXNrc2l6ZSwgYm9yZGVydHlwZSwgMCwgYnVmZmVyICkgOgorICAgICAgICAgICAgICAgICAgICBpcHBfbGFwbGFjZV9mdW5jXzMyZiA/IGlwcF9sYXBsYWNlX2Z1bmNfMzJmKCBzcmNfcHRyLCBzcmNfc3RlcCwgZHN0X3B0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIG1hc2tzaXplLCBib3JkZXJ0eXBlLCAwLCBidWZmZXIgKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9OT1RERUZJTkVEX0VSUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YXR1cyA+PSAwICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgQ1ZfQ0FMTCggbGFwbGFjaWFuLmluaXQoIHNyYy0+Y29scywgc3JjX3R5cGUsIGRzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwgYXBlcnR1cmVfc2l6ZSApKTsKKyAgICBDVl9DQUxMKCBsYXBsYWNpYW4ucHJvY2Vzcyggc3JjLCBkc3QgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZkaXN0cmFuc2Zvcm0uY3BwIGIvY3Yvc3JjL2N2ZGlzdHJhbnNmb3JtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQ1MmY1Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2ZGlzdHJhbnNmb3JtLmNwcApAQCAtMCwwICsxLDg1OSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKyNkZWZpbmUgSUNWX0RJU1RfU0hJRlQgIDE2CisjZGVmaW5lIElDVl9JTklUX0RJU1QwICAoSU5UX01BWCA+PiAyKQorCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkluaXRUb3BCb3R0b20oIGludCogdGVtcCwgaW50IHRlbXBzdGVwLCBDdlNpemUgc2l6ZSwgaW50IGJvcmRlciApCit7CisgICAgaW50IGksIGo7CisgICAgZm9yKCBpID0gMDsgaSA8IGJvcmRlcjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCogdHRvcCA9IChpbnQqKSh0ZW1wICsgaSp0ZW1wc3RlcCk7CisgICAgICAgIGludCogdGJvdHRvbSA9IChpbnQqKSh0ZW1wICsgKHNpemUuaGVpZ2h0ICsgYm9yZGVyKjIgLSBpIC0gMSkqdGVtcHN0ZXApOworICAgICAgICAKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGggKyBib3JkZXIqMjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgdHRvcFtqXSA9IElDVl9JTklUX0RJU1QwOworICAgICAgICAgICAgdGJvdHRvbVtqXSA9IElDVl9JTklUX0RJU1QwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgaW50KiB0ZW1wLAorICAgICAgICBpbnQgc3RlcCwgZmxvYXQqIGRpc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgZmxvYXQqIG1ldHJpY3MgKQoreworICAgIGNvbnN0IGludCBCT1JERVIgPSAxOworICAgIGludCBpLCBqOworICAgIGNvbnN0IGludCBIVl9ESVNUID0gQ1ZfRkxUX1RPX0ZJWCggbWV0cmljc1swXSwgSUNWX0RJU1RfU0hJRlQgKTsKKyAgICBjb25zdCBpbnQgRElBR19ESVNUID0gQ1ZfRkxUX1RPX0ZJWCggbWV0cmljc1sxXSwgSUNWX0RJU1RfU0hJRlQgKTsKKyAgICBjb25zdCBmbG9hdCBzY2FsZSA9IDEuZi8oMSA8PCBJQ1ZfRElTVF9TSElGVCk7CisKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOworICAgIHN0ZXAgLz0gc2l6ZW9mKHRlbXBbMF0pOworICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRpc3RbMF0pOworCisgICAgaWN2SW5pdFRvcEJvdHRvbSggdGVtcCwgc3RlcCwgc2l6ZSwgQk9SREVSICk7CisKKyAgICAvLyBmb3J3YXJkIHBhc3MKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKyApCisgICAgeworICAgICAgICBjb25zdCB1Y2hhciogcyA9IHNyYyArIGkqc3Jjc3RlcDsKKyAgICAgICAgaW50KiB0bXAgPSAoaW50KikodGVtcCArIChpK0JPUkRFUikqc3RlcCkgKyBCT1JERVI7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IEJPUkRFUjsgaisrICkKKyAgICAgICAgICAgIHRtcFstai0xXSA9IHRtcFtzaXplLndpZHRoICsgal0gPSBJQ1ZfSU5JVF9ESVNUMDsKKyAgICAgICAgCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIXNbal0gKQorICAgICAgICAgICAgICAgIHRtcFtqXSA9IDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gdG1wW2otc3RlcC0xXSArIERJQUdfRElTVDsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHRtcFtqLXN0ZXBdICsgSFZfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHQgPSB0bXBbai1zdGVwKzFdICsgRElBR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLTFdICsgSFZfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHRtcFtqXSA9IHQwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gYmFja3dhcmQgcGFzcworICAgIGZvciggaSA9IHNpemUuaGVpZ2h0IC0gMTsgaSA+PSAwOyBpLS0gKQorICAgIHsKKyAgICAgICAgZmxvYXQqIGQgPSAoZmxvYXQqKShkaXN0ICsgaSpkc3RzdGVwKTsKKyAgICAgICAgaW50KiB0bXAgPSAoaW50KikodGVtcCArIChpK0JPUkRFUikqc3RlcCkgKyBCT1JERVI7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSBzaXplLndpZHRoIC0gMTsgaiA+PSAwOyBqLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdDAgPSB0bXBbal07CisgICAgICAgICAgICBpZiggdDAgPiBIVl9ESVNUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHRtcFtqK3N0ZXArMV0gKyBESUFHX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcF0gKyBIVl9ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqK3N0ZXAtMV0gKyBESUFHX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orMV0gKyBIVl9ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdG1wW2pdID0gdDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkW2pdID0gKGZsb2F0KSh0MCAqIHNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2RGlzdGFuY2VUcmFuc2Zvcm1fNXg1X0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIGludCogdGVtcCwKKyAgICAgICAgaW50IHN0ZXAsIGZsb2F0KiBkaXN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IGZsb2F0KiBtZXRyaWNzICkKK3sKKyAgICBjb25zdCBpbnQgQk9SREVSID0gMjsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgSFZfRElTVCA9IENWX0ZMVF9UT19GSVgoIG1ldHJpY3NbMF0sIElDVl9ESVNUX1NISUZUICk7CisgICAgY29uc3QgaW50IERJQUdfRElTVCA9IENWX0ZMVF9UT19GSVgoIG1ldHJpY3NbMV0sIElDVl9ESVNUX1NISUZUICk7CisgICAgY29uc3QgaW50IExPTkdfRElTVCA9IENWX0ZMVF9UT19GSVgoIG1ldHJpY3NbMl0sIElDVl9ESVNUX1NISUZUICk7CisgICAgY29uc3QgZmxvYXQgc2NhbGUgPSAxLmYvKDEgPDwgSUNWX0RJU1RfU0hJRlQpOworCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBzdGVwIC89IHNpemVvZih0ZW1wWzBdKTsKKyAgICBkc3RzdGVwIC89IHNpemVvZihkaXN0WzBdKTsKKworICAgIGljdkluaXRUb3BCb3R0b20oIHRlbXAsIHN0ZXAsIHNpemUsIEJPUkRFUiApOworCisgICAgLy8gZm9yd2FyZCBwYXNzCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIHMgPSBzcmMgKyBpKnNyY3N0ZXA7CisgICAgICAgIGludCogdG1wID0gKGludCopKHRlbXAgKyAoaStCT1JERVIpKnN0ZXApICsgQk9SREVSOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBCT1JERVI7IGorKyApCisgICAgICAgICAgICB0bXBbLWotMV0gPSB0bXBbc2l6ZS53aWR0aCArIGpdID0gSUNWX0lOSVRfRElTVDA7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFzW2pdICkKKyAgICAgICAgICAgICAgICB0bXBbal0gPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0MCA9IHRtcFtqLXN0ZXAqMi0xXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHRtcFtqLXN0ZXAqMisxXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHQgPSB0bXBbai1zdGVwLTJdICsgTE9OR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLXN0ZXAtMV0gKyBESUFHX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2otc3RlcF0gKyBIVl9ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLXN0ZXArMV0gKyBESUFHX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2otc3RlcCsyXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHQgPSB0bXBbai0xXSArIEhWX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0bXBbal0gPSB0MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGJhY2t3YXJkIHBhc3MKKyAgICBmb3IoIGkgPSBzaXplLmhlaWdodCAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICB7CisgICAgICAgIGZsb2F0KiBkID0gKGZsb2F0KikoZGlzdCArIGkqZHN0c3RlcCk7CisgICAgICAgIGludCogdG1wID0gKGludCopKHRlbXAgKyAoaStCT1JERVIpKnN0ZXApICsgQk9SREVSOworICAgICAgICAKKyAgICAgICAgZm9yKCBqID0gc2l6ZS53aWR0aCAtIDE7IGogPj0gMDsgai0tICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQwID0gdG1wW2pdOworICAgICAgICAgICAgaWYoIHQwID4gSFZfRElTVCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSB0bXBbaitzdGVwKjIrMV0gKyBMT05HX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcCoyLTFdICsgTE9OR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqK3N0ZXArMl0gKyBMT05HX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcCsxXSArIERJQUdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHQgPSB0bXBbaitzdGVwXSArIEhWX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApIHQwID0gdDsKKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcC0xXSArIERJQUdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHQgPSB0bXBbaitzdGVwLTJdICsgTE9OR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKSB0MCA9IHQ7CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqKzFdICsgSFZfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkgdDAgPSB0OworICAgICAgICAgICAgICAgIHRtcFtqXSA9IHQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZFtqXSA9IChmbG9hdCkodDAgKiBzY2FsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkRpc3RhbmNlVHJhbnNmb3JtRXhfNXg1X0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIGludCogdGVtcCwKKyAgICAgICAgICAgICAgICBpbnQgc3RlcCwgZmxvYXQqIGRpc3QsIGludCBkc3RzdGVwLCBpbnQqIGxhYmVscywgaW50IGxzdGVwLAorICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBjb25zdCBmbG9hdCogbWV0cmljcyApCit7CisgICAgY29uc3QgaW50IEJPUkRFUiA9IDI7CisgICAgCisgICAgaW50IGksIGo7CisgICAgY29uc3QgaW50IEhWX0RJU1QgPSBDVl9GTFRfVE9fRklYKCBtZXRyaWNzWzBdLCBJQ1ZfRElTVF9TSElGVCApOworICAgIGNvbnN0IGludCBESUFHX0RJU1QgPSBDVl9GTFRfVE9fRklYKCBtZXRyaWNzWzFdLCBJQ1ZfRElTVF9TSElGVCApOworICAgIGNvbnN0IGludCBMT05HX0RJU1QgPSBDVl9GTFRfVE9fRklYKCBtZXRyaWNzWzJdLCBJQ1ZfRElTVF9TSElGVCApOworICAgIGNvbnN0IGZsb2F0IHNjYWxlID0gMS5mLygxIDw8IElDVl9ESVNUX1NISUZUKTsKKworICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgc3RlcCAvPSBzaXplb2YodGVtcFswXSk7CisgICAgZHN0c3RlcCAvPSBzaXplb2YoZGlzdFswXSk7CisgICAgbHN0ZXAgLz0gc2l6ZW9mKGxhYmVsc1swXSk7CisKKyAgICBpY3ZJbml0VG9wQm90dG9tKCB0ZW1wLCBzdGVwLCBzaXplLCBCT1JERVIgKTsKKworICAgIC8vIGZvcndhcmQgcGFzcworICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVjaGFyKiBzID0gc3JjICsgaSpzcmNzdGVwOworICAgICAgICBpbnQqIHRtcCA9IChpbnQqKSh0ZW1wICsgKGkrQk9SREVSKSpzdGVwKSArIEJPUkRFUjsKKyAgICAgICAgaW50KiBsbHMgPSAoaW50KikobGFiZWxzICsgaSpsc3RlcCk7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IEJPUkRFUjsgaisrICkKKyAgICAgICAgICAgIHRtcFstai0xXSA9IHRtcFtzaXplLndpZHRoICsgal0gPSBJQ1ZfSU5JVF9ESVNUMDsKKyAgICAgICAgCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIXNbal0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcFtqXSA9IDA7CisgICAgICAgICAgICAgICAgLy9hc3NlcnQoIGxsc1tqXSAhPSAwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gSUNWX0lOSVRfRElTVDAsIHQ7CisgICAgICAgICAgICAgICAgaW50IGwwID0gMDsKKworICAgICAgICAgICAgICAgIHQgPSB0bXBbai1zdGVwKjItMV0gKyBMT05HX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0MCA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGwwID0gbGxzW2otbHN0ZXAqMi0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLXN0ZXAqMisxXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbai1sc3RlcCoyKzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gdG1wW2otc3RlcC0yXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbai1sc3RlcC0yXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLXN0ZXAtMV0gKyBESUFHX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0MCA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGwwID0gbGxzW2otbHN0ZXAtMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSB0bXBbai1zdGVwXSArIEhWX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0MCA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGwwID0gbGxzW2otbHN0ZXBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gdG1wW2otc3RlcCsxXSArIERJQUdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbai1sc3RlcCsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqLXN0ZXArMl0gKyBMT05HX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0MCA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGwwID0gbGxzW2otbHN0ZXArMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSB0bXBbai0xXSArIEhWX0RJU1Q7CisgICAgICAgICAgICAgICAgaWYoIHQwID4gdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0MCA9IHQ7CisgICAgICAgICAgICAgICAgICAgIGwwID0gbGxzW2otMV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdG1wW2pdID0gdDA7CisgICAgICAgICAgICAgICAgbGxzW2pdID0gbDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBiYWNrd2FyZCBwYXNzCisgICAgZm9yKCBpID0gc2l6ZS5oZWlnaHQgLSAxOyBpID49IDA7IGktLSApCisgICAgeworICAgICAgICBmbG9hdCogZCA9IChmbG9hdCopKGRpc3QgKyBpKmRzdHN0ZXApOworICAgICAgICBpbnQqIHRtcCA9IChpbnQqKSh0ZW1wICsgKGkrQk9SREVSKSpzdGVwKSArIEJPUkRFUjsKKyAgICAgICAgaW50KiBsbHMgPSAoaW50KikobGFiZWxzICsgaSpsc3RlcCk7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSBzaXplLndpZHRoIC0gMTsgaiA+PSAwOyBqLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdDAgPSB0bXBbal07CisgICAgICAgICAgICBpbnQgbDAgPSBsbHNbal07CisgICAgICAgICAgICBpZiggdDAgPiBIVl9ESVNUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHRtcFtqK3N0ZXAqMisxXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbaitsc3RlcCoyKzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcCoyLTFdICsgTE9OR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSB0OworICAgICAgICAgICAgICAgICAgICBsMCA9IGxsc1tqK2xzdGVwKjItMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSB0bXBbaitzdGVwKzJdICsgTE9OR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSB0OworICAgICAgICAgICAgICAgICAgICBsMCA9IGxsc1tqK2xzdGVwKzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcCsxXSArIERJQUdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbaitsc3RlcCsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqK3N0ZXBdICsgSFZfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbaitsc3RlcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHQgPSB0bXBbaitzdGVwLTFdICsgRElBR19ESVNUOworICAgICAgICAgICAgICAgIGlmKCB0MCA+IHQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSB0OworICAgICAgICAgICAgICAgICAgICBsMCA9IGxsc1tqK2xzdGVwLTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ID0gdG1wW2orc3RlcC0yXSArIExPTkdfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbaitsc3RlcC0yXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdCA9IHRtcFtqKzFdICsgSFZfRElTVDsKKyAgICAgICAgICAgICAgICBpZiggdDAgPiB0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQwID0gdDsKKyAgICAgICAgICAgICAgICAgICAgbDAgPSBsbHNbaisxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wW2pdID0gdDA7CisgICAgICAgICAgICAgICAgbGxzW2pdID0gbDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkW2pdID0gKGZsb2F0KSh0MCAqIHNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkdldERpc3RhbmNlVHJhbnNmb3JtTWFzayggaW50IG1hc2tUeXBlLCBmbG9hdCAqbWV0cmljcyApCit7CisgICAgaWYoICFtZXRyaWNzICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgc3dpdGNoIChtYXNrVHlwZSkKKyAgICB7CisgICAgY2FzZSAzMDoKKyAgICAgICAgbWV0cmljc1swXSA9IDEuMGY7CisgICAgICAgIG1ldHJpY3NbMV0gPSAxLjBmOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgMzE6CisgICAgICAgIG1ldHJpY3NbMF0gPSAxLjBmOworICAgICAgICBtZXRyaWNzWzFdID0gMi4wZjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDMyOgorICAgICAgICBtZXRyaWNzWzBdID0gMC45NTVmOworICAgICAgICBtZXRyaWNzWzFdID0gMS4zNjkzZjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDUwOgorICAgICAgICBtZXRyaWNzWzBdID0gMS4wZjsKKyAgICAgICAgbWV0cmljc1sxXSA9IDEuMGY7CisgICAgICAgIG1ldHJpY3NbMl0gPSAyLjBmOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgNTE6CisgICAgICAgIG1ldHJpY3NbMF0gPSAxLjBmOworICAgICAgICBtZXRyaWNzWzFdID0gMi4wZjsKKyAgICAgICAgbWV0cmljc1syXSA9IDMuMGY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSA1MjoKKyAgICAgICAgbWV0cmljc1swXSA9IDEuMGY7CisgICAgICAgIG1ldHJpY3NbMV0gPSAxLjRmOworICAgICAgICBtZXRyaWNzWzJdID0gMi4xOTY5ZjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlRydWVEaXN0VHJhbnMoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QgKQoreworICAgIEN2TWF0KiBidWZmZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkRpc3RUcmFuc2Zvcm0yIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIG0sIG47CisgICAgaW50IHNzdGVwLCBkc3RlcDsKKyAgICBjb25zdCBmbG9hdCBpbmYgPSAxZTZmOworICAgIGludCB0aHJlYWRfY291bnQgPSBjdkdldE51bVRocmVhZHMoKTsKKyAgICBpbnQgcGFzczFfc3osIHBhc3MyX3N6OworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzEgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoZHN0LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIlRoZSBpbnB1dCBpbWFnZSBtdXN0IGhhdmUgOHVDMSB0eXBlIGFuZCB0aGUgb3V0cHV0IG9uZSBtdXN0IGhhdmUgMzJmQzEgdHlwZSIgKTsKKworICAgIG0gPSBzcmMtPnJvd3M7CisgICAgbiA9IHNyYy0+Y29sczsKKworICAgIC8vIChzZWUgc3RhZ2UgMSBiZWxvdyk6CisgICAgLy8gc3FyX3RhYjogMiptLCBzYXRfdGFiOiAzKm0gKyAxLCBkOiBtKnRocmVhZF9jb3VudCwKKyAgICBwYXNzMV9zeiA9IHNyYy0+cm93cyooNSArIHRocmVhZF9jb3VudCkgKyAxOworICAgIC8vIChzZWUgc3RhZ2UgMik6CisgICAgLy8gc3FyX3RhYiAmIGludl90YWI6IG4gZWFjaDsgZiAmIHY6IG4qdGhyZWFkX2NvdW50IGVhY2g7IHo6IChuKzEpKnRocmVhZF9jb3VudAorICAgIHBhc3MyX3N6ID0gc3JjLT5jb2xzKigyICsgdGhyZWFkX2NvdW50KjMpICsgdGhyZWFkX2NvdW50OworICAgIENWX0NBTEwoIGJ1ZmZlciA9IGN2Q3JlYXRlTWF0KCAxLCBNQVgocGFzczFfc3osIHBhc3MyX3N6KSwgQ1ZfMzJGQzEgKSk7CisKKyAgICBzc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3RlcCA9IGRzdC0+c3RlcCAvIHNpemVvZihmbG9hdCk7CisKKyAgICAvLyBzdGFnZSAxOiBjb21wdXRlIDFkIGRpc3RhbmNlIHRyYW5zZm9ybSBvZiBlYWNoIGNvbHVtbgorICAgIHsKKyAgICBmbG9hdCogc3FyX3RhYiA9IGJ1ZmZlci0+ZGF0YS5mbDsKKyAgICBpbnQqIHNhdF90YWIgPSAoaW50Kikoc3FyX3RhYiArIG0qMik7CisgICAgY29uc3QgaW50IHNoaWZ0ID0gbSoyOworCisgICAgZm9yKCBpID0gMDsgaSA8IG07IGkrKyApCisgICAgICAgIHNxcl90YWJbaV0gPSAoZmxvYXQpKGkqaSk7CisgICAgZm9yKCBpID0gbTsgaSA8IG0qMjsgaSsrICkKKyAgICAgICAgc3FyX3RhYltpXSA9IGluZjsKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2hpZnQ7IGkrKyApCisgICAgICAgIHNhdF90YWJbaV0gPSAwOworICAgIGZvciggOyBpIDw9IG0qMzsgaSsrICkKKyAgICAgICAgc2F0X3RhYltpXSA9IGkgLSBzaGlmdDsKKworI2lmZGVmIF9PUEVOTVAKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHModGhyZWFkX2NvdW50KQorI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBjb25zdCB1Y2hhciogc3B0ciA9IHNyYy0+ZGF0YS5wdHIgKyBpICsgKG0tMSkqc3N0ZXA7CisgICAgICAgIGZsb2F0KiBkcHRyID0gZHN0LT5kYXRhLmZsICsgaTsKKyAgICAgICAgaW50KiBkID0gKGludCopKHNhdF90YWIgKyBtKjMrMSttKmN2R2V0VGhyZWFkTnVtKCkpOworICAgICAgICBpbnQgaiwgZGlzdCA9IG0tMTsKKworICAgICAgICBmb3IoIGogPSBtLTE7IGogPj0gMDsgai0tLCBzcHRyIC09IHNzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzdCA9IChkaXN0ICsgMSkgJiAoc3B0clswXSA9PSAwID8gMCA6IC0xKTsKKyAgICAgICAgICAgIGRbal0gPSBkaXN0OworICAgICAgICB9CisKKyAgICAgICAgZGlzdCA9IG0tMTsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKywgZHB0ciArPSBkc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3QgPSBkaXN0ICsgMSAtIHNhdF90YWJbZGlzdCArIDEgLSBkW2pdICsgc2hpZnRdOworICAgICAgICAgICAgZFtqXSA9IGRpc3Q7CisgICAgICAgICAgICBkcHRyWzBdID0gc3FyX3RhYltkaXN0XTsKKyAgICAgICAgfQorICAgIH0KKyAgICB9CisKKyAgICAvLyBzdGFnZSAyOiBjb21wdXRlIG1vZGlmaWVkIGRpc3RhbmNlIHRyYW5zZm9ybSBmb3IgZWFjaCByb3cKKyAgICB7CisgICAgZmxvYXQqIGludl90YWIgPSBidWZmZXItPmRhdGEuZmw7CisgICAgZmxvYXQqIHNxcl90YWIgPSBpbnZfdGFiICsgbjsKKworICAgIGludl90YWJbMF0gPSBzcXJfdGFiWzBdID0gMC5mOworICAgIGZvciggaSA9IDE7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW52X3RhYltpXSA9IChmbG9hdCkoMC41L2kpOworICAgICAgICBzcXJfdGFiW2ldID0gKGZsb2F0KShpKmkpOworICAgIH0KKworI2lmZGVmIF9PUEVOTVAKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHModGhyZWFkX2NvdW50KSBzY2hlZHVsZShkeW5hbWljKQorI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IG07IGkrKyApCisgICAgeworICAgICAgICBmbG9hdCogZCA9IChmbG9hdCopKGRzdC0+ZGF0YS5wdHIgKyBpKmRzdC0+c3RlcCk7CisgICAgICAgIGZsb2F0KiBmID0gc3FyX3RhYiArIG4gKyAobiozKzEpKmN2R2V0VGhyZWFkTnVtKCk7CisgICAgICAgIGZsb2F0KiB6ID0gZiArIG47CisgICAgICAgIGludCogdiA9IChpbnQqKSh6ICsgbiArIDEpOworICAgICAgICBpbnQgcCwgcSwgazsKKworICAgICAgICB2WzBdID0gMDsKKyAgICAgICAgelswXSA9IC1pbmY7CisgICAgICAgIHpbMV0gPSBpbmY7CisgICAgICAgIGZbMF0gPSBkWzBdOworCisgICAgICAgIGZvciggcSA9IDEsIGsgPSAwOyBxIDwgbjsgcSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnEgPSBkW3FdOworICAgICAgICAgICAgZltxXSA9IGZxOworCisgICAgICAgICAgICBmb3IoOztrLS0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCA9IHZba107CisgICAgICAgICAgICAgICAgZmxvYXQgcyA9IChmcSArIHNxcl90YWJbcV0gLSBkW3BdIC0gc3FyX3RhYltwXSkqaW52X3RhYltxIC0gcF07CisgICAgICAgICAgICAgICAgaWYoIHMgPiB6W2tdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgICAgICAgICAgdltrXSA9IHE7CisgICAgICAgICAgICAgICAgICAgIHpba10gPSBzOworICAgICAgICAgICAgICAgICAgICB6W2srMV0gPSBpbmY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggcSA9IDAsIGsgPSAwOyBxIDwgbjsgcSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUoIHpbaysxXSA8IHEgKQorICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIHAgPSB2W2tdOworICAgICAgICAgICAgZFtxXSA9IHNxcl90YWJbYWJzKHEgLSBwKV0gKyBmW3BdOworICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGN2UG93KCBkc3QsIGRzdCwgMC41ICk7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmYnVmZmVyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElQUCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfOHUzMmZfQzFSX3QgaWN2RGlzdGFuY2VUcmFuc2Zvcm1fM3gzXzh1MzJmX0MxUl9wID0gMDsKK2ljdkRpc3RhbmNlVHJhbnNmb3JtXzV4NV84dTMyZl9DMVJfdCBpY3ZEaXN0YW5jZVRyYW5zZm9ybV81eDVfOHUzMmZfQzFSX3AgPSAwOworaWN2RGlzdGFuY2VUcmFuc2Zvcm1fM3gzXzh1X0MxSVJfdCBpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfOHVfQzFJUl9wID0gMDsKK2ljdkRpc3RhbmNlVHJhbnNmb3JtXzN4M184dV9DMVJfdCBpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfOHVfQzFSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZJUFBEaXN0VHJhbnNGdW5jKSggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3Qgdm9pZCogbWV0cmljcyApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZJUFBEaXN0VHJhbnNGdW5jMikoIHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgaW50KiBtZXRyaWNzICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2RGlzdFRyYW5zRnVuYykoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogdGVtcCwgaW50IHRlbXBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBjb25zdCBmbG9hdCogbWV0cmljcyApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorIFVzZXItY29udHJpYnV0ZWQgY29kZToKKworIE5vbi1pbnBsYWNlIGFuZCBJbnBsYWNlIDh1LT44dSBEaXN0YW5jZSBUcmFuc2Zvcm0gZm9yIENpdHlCbG9jayAoYS5rLmEuIEwxKSBtZXRyaWMKKyAoQykgMjAwNiBieSBKYXkgU3Rhdmluemt5LgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vQkVHSU4gQVRTIEFERElUSU9OCisvKiA4LWJpdCBncmF5c2NhbGUgZGlzdGFuY2UgdHJhbnNmb3JtIGZ1bmN0aW9uICovCitzdGF0aWMgdm9pZAoraWN2RGlzdGFuY2VBVFNfTDFfOHUoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZEaXN0YW5jZUFUUyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB3aWR0aCA9IHNyYy0+Y29scywgaGVpZ2h0ID0gc3JjLT5yb3dzOworCisgICAgaW50IGE7CisgICAgdWNoYXIgbHV0WzI1Nl07CisgICAgaW50IHgsIHk7CisgICAgCisgICAgY29uc3QgdWNoYXIgKnNiYXNlID0gc3JjLT5kYXRhLnB0cjsKKyAgICB1Y2hhciAqZGJhc2UgPSBkc3QtPmRhdGEucHRyOworICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwOworICAgIGludCBkc3RzdGVwID0gZHN0LT5zdGVwOworCisgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVNLX0FSUiggc3JjICkgJiYgQ1ZfTUFUX1RZUEUoIGRzdC0+dHlwZSApID09IENWXzhVQzEgKTsKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSk7CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGZvcndhcmQgc2NhbiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICBmb3IoIHggPSAwOyB4IDwgMjU2OyB4KysgKQorICAgICAgICBsdXRbeF0gPSBDVl9DQVNUXzhVKHgrMSk7CisKKyAgICAvL2luaXQgZmlyc3QgcGl4ZWwgdG8gbWF4ICh3ZSdyZSBnb2luZyB0byBiZSBza2lwcGluZyBpdCkKKyAgICBkYmFzZVswXSA9ICh1Y2hhcikoc2Jhc2VbMF0gPT0gMCA/IDAgOiAyNTUpOworCisgICAgLy9maXJzdCByb3cgKHNjYW4gd2VzdCBvbmx5LCBza2lwIGZpcnN0IHBpeGVsKQorICAgIGZvciggeCA9IDE7IHggPCB3aWR0aDsgeCsrICkKKyAgICAgICAgZGJhc2VbeF0gPSAodWNoYXIpKHNiYXNlW3hdID09IDAgPyAwIDogbHV0W2RiYXNlW3gtMV1dKTsKKworICAgIGZvciggeSA9IDE7IHkgPCBoZWlnaHQ7IHkrKyApCisgICAgeworICAgICAgICBzYmFzZSArPSBzcmNzdGVwOworICAgICAgICBkYmFzZSArPSBkc3RzdGVwOworCisgICAgICAgIC8vZm9yIGxlZnQgZWRnZSwgc2NhbiBub3J0aCBvbmx5CisgICAgICAgIGEgPSBzYmFzZVswXSA9PSAwID8gMCA6IGx1dFtkYmFzZVstZHN0c3RlcF1dOworICAgICAgICBkYmFzZVswXSA9ICh1Y2hhcilhOworCisgICAgICAgIGZvciggeCA9IDE7IHggPCB3aWR0aDsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IHNiYXNlW3hdID09IDAgPyAwIDogbHV0W01JTihhLCBkYmFzZVt4IC0gZHN0c3RlcF0pXTsKKyAgICAgICAgICAgIGRiYXNlW3hdID0gKHVjaGFyKWE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGJhY2t3YXJkIHNjYW4gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIGEgPSBkYmFzZVt3aWR0aC0xXTsKKworICAgIC8vIGRvIGxhc3Qgcm93IGVhc3QgcGl4ZWwgc2NhbiBoZXJlIChza2lwIGJvdHRvbSByaWdodCBwaXhlbCkKKyAgICBmb3IoIHggPSB3aWR0aCAtIDI7IHggPj0gMDsgeC0tICkKKyAgICB7CisgICAgICAgIGEgPSBsdXRbYV07CisgICAgICAgIGRiYXNlW3hdID0gKHVjaGFyKShDVl9DQUxDX01JTl84VShhLCBkYmFzZVt4XSkpOworICAgIH0KKworICAgIC8vIHJpZ2h0IGVkZ2UgaXMgdGhlIG9ubHkgZXJyb3IgY2FzZQorICAgIGZvciggeSA9IGhlaWdodCAtIDI7IHkgPj0gMDsgeS0tICkKKyAgICB7CisgICAgICAgIGRiYXNlIC09IGRzdHN0ZXA7CisKKyAgICAgICAgLy8gZG8gcmlnaHQgZWRnZQorICAgICAgICBhID0gbHV0W2RiYXNlW3dpZHRoLTErZHN0c3RlcF1dOworICAgICAgICBkYmFzZVt3aWR0aC0xXSA9ICh1Y2hhcikoTUlOKGEsIGRiYXNlW3dpZHRoLTFdKSk7CisKKyAgICAgICAgZm9yKCB4ID0gd2lkdGggLSAyOyB4ID49IDA7IHgtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBiID0gZGJhc2VbeCtkc3RzdGVwXTsKKyAgICAgICAgICAgIGEgPSBsdXRbTUlOKGEsIGIpXTsKKyAgICAgICAgICAgIGRiYXNlW3hdID0gKHVjaGFyKShNSU4oYSwgZGJhc2VbeF0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisvL0VORCBBVFMgQURESVRJT04KKworCisvKiBXcmFwcGVyIGZ1bmN0aW9uIGZvciBkaXN0YW5jZSB0cmFuc2Zvcm0gZ3JvdXAgKi8KK0NWX0lNUEwgdm9pZAorY3ZEaXN0VHJhbnNmb3JtKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwKKyAgICAgICAgICAgICAgICAgaW50IGRpc3RUeXBlLCBpbnQgbWFza1NpemUsCisgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICptYXNrLAorICAgICAgICAgICAgICAgICB2b2lkKiBsYWJlbHNhcnIgKQoreworICAgIEN2TWF0KiB0ZW1wID0gMDsKKyAgICBDdk1hdCogc3JjX2NvcHkgPSAwOworICAgIEN2TWVtU3RvcmFnZSogc3QgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZEaXN0VHJhbnNmb3JtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZmxvYXQgX21hc2tbNV0gPSB7MH07CisgICAgaW50IF9pbWFza1szXTsKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2TWF0IGxzdHViLCAqbGFiZWxzID0gKEN2TWF0KilsYWJlbHNhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZJUFBEaXN0VHJhbnNGdW5jIGlwcF9mdW5jID0gMDsKKyAgICBDdklQUERpc3RUcmFuc0Z1bmMyIGlwcF9pbnBfZnVuYyA9IDA7CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiApKTsKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIHNyYyApIHx8IChDVl9NQVRfVFlQRSggZHN0LT50eXBlICkgIT0gQ1ZfMzJGQzEgJiYKKyAgICAgICAgKENWX01BVF9UWVBFKGRzdC0+dHlwZSkgIT0gQ1ZfOFVDMSB8fCBkaXN0VHlwZSAhPSBDVl9ESVNUX0wxIHx8IGxhYmVscykpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAic291cmNlIGltYWdlIG11c3QgYmUgOHVDMSBhbmQgdGhlIGRpc3RhbmNlIG1hcCBtdXN0IGJlIDMyZkMxICIKKyAgICAgICAgIihvciA4dUMxIGluIGNhc2Ugb2Ygc2ltcGxlIEwxIGRpc3RhbmNlIHRyYW5zZm9ybSkiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAidGhlIHNvdXJjZSBhbmQgdGhlIGRlc3RpbmF0aW9uIGltYWdlcyBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUiICk7CisKKyAgICBpZiggbWFza1NpemUgIT0gQ1ZfRElTVF9NQVNLXzMgJiYgbWFza1NpemUgIT0gQ1ZfRElTVF9NQVNLXzUgJiYgbWFza1NpemUgIT0gQ1ZfRElTVF9NQVNLX1BSRUNJU0UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIk1hc2sgc2l6ZSBzaG91bGQgYmUgMyBvciA1IG9yIDAgKHByZXNpemUpIiApOworCisgICAgaWYoIGRpc3RUeXBlID09IENWX0RJU1RfQyB8fCBkaXN0VHlwZSA9PSBDVl9ESVNUX0wxICkKKyAgICAgICAgbWFza1NpemUgPSAhbGFiZWxzID8gQ1ZfRElTVF9NQVNLXzMgOiBDVl9ESVNUX01BU0tfNTsKKyAgICBlbHNlIGlmKCBkaXN0VHlwZSA9PSBDVl9ESVNUX0wyICYmIGxhYmVscyApCisgICAgICAgIG1hc2tTaXplID0gQ1ZfRElTVF9NQVNLXzU7CisKKyAgICBpZiggbWFza1NpemUgPT0gQ1ZfRElTVF9NQVNLX1BSRUNJU0UgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaWN2VHJ1ZURpc3RUcmFucyggc3JjLCBkc3QgKSk7CisgICAgICAgIEVYSVQ7CisgICAgfQorICAgIAorICAgIGlmKCBsYWJlbHMgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggbGFiZWxzID0gY3ZHZXRNYXQoIGxhYmVscywgJmxzdHViICkpOworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoIGxhYmVscy0+dHlwZSApICE9IENWXzMyU0MxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgInRoZSBvdXRwdXQgYXJyYXkgb2YgbGFiZWxzIG11c3QgYmUgMzJzQzEiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIGxhYmVscywgZHN0ICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJ0aGUgYXJyYXkgb2YgbGFiZWxzIGhhcyBhIGRpZmZlcmVudCBzaXplIiApOworCisgICAgICAgIGlmKCBtYXNrU2l6ZSA9PSBDVl9ESVNUX01BU0tfMyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsCisgICAgICAgICAgICAiM3gzIG1hc2sgY2FuIG5vdCBiZSB1c2VkIGZvciBcImxhYmVsZWRcIiBkaXN0YW5jZSB0cmFuc2Zvcm0uIFVzZSA1eDUgbWFzayIgKTsKKyAgICB9CisKKyAgICBpZiggZGlzdFR5cGUgPT0gQ1ZfRElTVF9DIHx8IGRpc3RUeXBlID09IENWX0RJU1RfTDEgfHwgZGlzdFR5cGUgPT0gQ1ZfRElTVF9MMiApCisgICAgeworICAgICAgICBpY3ZHZXREaXN0YW5jZVRyYW5zZm9ybU1hc2soIChkaXN0VHlwZSA9PSBDVl9ESVNUX0MgPyAwIDoKKyAgICAgICAgICAgIGRpc3RUeXBlID09IENWX0RJU1RfTDEgPyAxIDogMikgKyBtYXNrU2l6ZSoxMCwgX21hc2sgKTsKKyAgICB9CisgICAgZWxzZSBpZiggZGlzdFR5cGUgPT0gQ1ZfRElTVF9VU0VSICkKKyAgICB7CisgICAgICAgIGlmKCAhbWFzayApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgICAgICBtZW1jcHkoIF9tYXNrLCBtYXNrLCAobWFza1NpemUvMiArIDEpKnNpemVvZihmbG9hdCkpOworICAgIH0KKworICAgIGlmKCAhbGFiZWxzICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShkc3QtPnR5cGUpID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIGlwcF9mdW5jID0gKEN2SVBQRGlzdFRyYW5zRnVuYykobWFza1NpemUgPT0gQ1ZfRElTVF9NQVNLXzMgPworICAgICAgICAgICAgICAgIGljdkRpc3RhbmNlVHJhbnNmb3JtXzN4M184dTMyZl9DMVJfcCA6IGljdkRpc3RhbmNlVHJhbnNmb3JtXzV4NV84dTMyZl9DMVJfcCk7CisgICAgICAgIGVsc2UgaWYoIHNyYy0+ZGF0YS5wdHIgIT0gZHN0LT5kYXRhLnB0ciApCisgICAgICAgICAgICBpcHBfZnVuYyA9IChDdklQUERpc3RUcmFuc0Z1bmMpaWN2RGlzdGFuY2VUcmFuc2Zvcm1fM3gzXzh1X0MxUl9wOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpcHBfaW5wX2Z1bmMgPSBpY3ZEaXN0YW5jZVRyYW5zZm9ybV8zeDNfOHVfQzFJUl9wOworICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKworICAgIGlmKCAoaXBwX2Z1bmMgfHwgaXBwX2lucF9mdW5jKSAmJiBzcmMtPmNvbHMgPj0gNCAmJiBzcmMtPnJvd3MgPj0gMiApCisgICAgeworICAgICAgICBfaW1hc2tbMF0gPSBjdlJvdW5kKF9tYXNrWzBdKTsKKyAgICAgICAgX2ltYXNrWzFdID0gY3ZSb3VuZChfbWFza1sxXSk7CisgICAgICAgIF9pbWFza1syXSA9IGN2Um91bmQoX21hc2tbMl0pOworCisgICAgICAgIGlmKCBpcHBfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLmZsLCBkc3QtPnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgIENWX01BVF9UWVBFKGRzdC0+dHlwZSkgPT0gQ1ZfOFVDMSA/CisgICAgICAgICAgICAgICAgICAgICh2b2lkKilfaW1hc2sgOiAodm9pZCopX21hc2sgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGlwcF9pbnBfZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLCBzaXplLCBfaW1hc2sgKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX1RZUEUoZHN0LT50eXBlKSA9PSBDVl84VUMxICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGljdkRpc3RhbmNlQVRTX0wxXzh1KCBzcmMsIGRzdCApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGJvcmRlciA9IG1hc2tTaXplID09IENWX0RJU1RfTUFTS18zID8gMSA6IDI7CisgICAgICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQgKyBib3JkZXIqMiwgc2l6ZS53aWR0aCArIGJvcmRlcioyLCBDVl8zMlNDMSApKTsKKworICAgICAgICBpZiggIWxhYmVscyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RGlzdFRyYW5zRnVuYyBmdW5jID0gbWFza1NpemUgPT0gQ1ZfRElTVF9NQVNLXzMgPworICAgICAgICAgICAgICAgIGljdkRpc3RhbmNlVHJhbnNmb3JtXzN4M19DMVIgOgorICAgICAgICAgICAgICAgIGljdkRpc3RhbmNlVHJhbnNmb3JtXzV4NV9DMVI7CisKKyAgICAgICAgICAgIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgdGVtcC0+ZGF0YS5pLCB0ZW1wLT5zdGVwLAorICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLmZsLCBkc3QtPnN0ZXAsIHNpemUsIF9tYXNrICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdlNlcSAqY29udG91cnMgPSAwOworICAgICAgICAgICAgQ3ZQb2ludCB0b3BfbGVmdCA9IHswLDB9LCBib3R0b21fcmlnaHQgPSB7c2l6ZS53aWR0aC0xLHNpemUuaGVpZ2h0LTF9OworICAgICAgICAgICAgaW50IGxhYmVsOworCisgICAgICAgICAgICBDVl9DQUxMKCBzdCA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpICk7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmNfY29weSA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgc3JjLT50eXBlICkpOworICAgICAgICAgICAgY3ZDbXBTKCBzcmMsIDAsIHNyY19jb3B5LCBDVl9DTVBfRVEgKTsKKyAgICAgICAgICAgIGN2RmluZENvbnRvdXJzKCBzcmNfY29weSwgc3QsICZjb250b3Vycywgc2l6ZW9mKEN2Q29udG91ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUkVUUl9DQ09NUCwgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSApOworICAgICAgICAgICAgY3ZaZXJvKCBsYWJlbHMgKTsKKyAgICAgICAgICAgIGZvciggbGFiZWwgPSAxOyBjb250b3VycyAhPSAwOyBjb250b3VycyA9IGNvbnRvdXJzLT5oX25leHQsIGxhYmVsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U2NhbGFyIGFyZWFfY29sb3IgPSBjdlNjYWxhckFsbChsYWJlbCk7CisgICAgICAgICAgICAgICAgY3ZEcmF3Q29udG91cnMoIGxhYmVscywgY29udG91cnMsIGFyZWFfY29sb3IsIGFyZWFfY29sb3IsIC0yNTUsIC0xLCA4ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2Q29weSggc3JjLCBzcmNfY29weSApOworICAgICAgICAgICAgY3ZSZWN0YW5nbGUoIHNyY19jb3B5LCB0b3BfbGVmdCwgYm90dG9tX3JpZ2h0LCBjdlNjYWxhckFsbCgyNTUpLCAxLCA4ICk7CisKKyAgICAgICAgICAgIGljdkRpc3RhbmNlVHJhbnNmb3JtRXhfNXg1X0MxUiggc3JjX2NvcHktPmRhdGEucHRyLCBzcmNfY29weS0+c3RlcCwgdGVtcC0+ZGF0YS5pLCB0ZW1wLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLmZsLCBkc3QtPnN0ZXAsIGxhYmVscy0+ZGF0YS5pLCBsYWJlbHMtPnN0ZXAsIHNpemUsIF9tYXNrICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworICAgIGN2UmVsZWFzZU1hdCggJnNyY19jb3B5ICk7CisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0ICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2ZG9taW5hbnRzLmNwcCBiL2N2L3NyYy9jdmRvbWluYW50cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFjNmY2OQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmRvbWluYW50cy5jcHAKQEAgLTAsMCArMSw0MDcgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCit0eXBlZGVmIHN0cnVjdCBfUG9pbnRJbmZvCit7CisgICAgQ3ZQb2ludCBwdDsKKyAgICBpbnQgbGVmdF9uZWlnaDsKKyAgICBpbnQgcmlnaHRfbmVpZ2g7CisKK30KK2ljdlBvaW50SW5mbzsKKworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkZpbmREb21pbmFudFBvaW50c0lQQU4oIEN2U2VxICogY29udG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSAqIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSAqKiBjb3JuZXJzLCBpbnQgZG1pbjIsIGludCBkbWF4MiwgaW50IGRuZWlnaDIsIGZsb2F0IGFtYXggKQoreworICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworCisgICAgLyogdmFyaWFibGVzICovCisgICAgaW50IG4gPSBjb250b3VyLT50b3RhbDsKKworICAgIGZsb2F0ICpzaGFycG5lc3M7CisgICAgZmxvYXQgKmRpc3RhbmNlOworICAgIGljdlBvaW50SW5mbyAqcHRJbmY7CisKKyAgICBpbnQgaSwgaiwgazsKKworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKworICAgIGZsb2F0IG1pbmNvcyA9IChmbG9hdCkgY29zKCAzLjE0MTU5MjY1MzU5ICogYW1heCAvIDE4MCApOworCisgICAgLyogY2hlY2sgYmFkIGFyZ3VtZW50cyAqLworICAgIGlmKCBjb250b3VyID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIHN0b3JhZ2UgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggY29ybmVycyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBkbWluMiA8IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIGRtYXgyIDwgZG1pbjIgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIChkbmVpZ2gyID4gZG1heDIpIHx8IChkbmVpZ2gyIDwgMCkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIChhbWF4IDwgMCkgfHwgKGFtYXggPiAxODApICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgc2hhcnBuZXNzID0gKGZsb2F0ICopIGN2QWxsb2MoIG4gKiBzaXplb2YoIGZsb2F0ICkpOworICAgIGRpc3RhbmNlID0gKGZsb2F0ICopIGN2QWxsb2MoIG4gKiBzaXplb2YoIGZsb2F0ICkpOworCisgICAgcHRJbmYgPSAoaWN2UG9pbnRJbmZvICopIGN2QWxsb2MoIG4gKiBzaXplb2YoIGljdlBvaW50SW5mbyApKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdCBwYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYoIENWX0lTX1NFUV9DSEFJTl9DT05UT1VSKCBjb250b3VyICkpCisgICAgeworICAgICAgICBDdkNoYWluUHRSZWFkZXIgcmVhZGVyOworCisgICAgICAgIGN2U3RhcnRSZWFkQ2hhaW5Qb2ludHMoIChDdkNoYWluICopIGNvbnRvdXIsICZyZWFkZXIgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9DSEFJTl9QT0lOVCggcHRJbmZbaV0ucHQsIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX1NFUV9QT0xZR09OKCBjb250b3VyICkpCisgICAgeworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIGNvbnRvdXIsICZyZWFkZXIsIDAgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHRJbmZbaV0ucHQsIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiBDVl9CQURGTEFHX0VSUjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIC8qIGZpbmQgbmVhcmVzdCBzdWl0YWJsZSBwb2ludHMKKyAgICAgICAgICAgd2hpY2ggc2F0aXNmeSBkaXN0YW5jZSBjb25zdHJhaW50ID5kbWluICovCisgICAgICAgIGludCBsZWZ0X25lYXIgPSAwOworICAgICAgICBpbnQgcmlnaHRfbmVhciA9IDA7CisgICAgICAgIGludCBsZWZ0X2ZhciwgcmlnaHRfZmFyOworCisgICAgICAgIGZsb2F0IGRpc3RfbCA9IDA7CisgICAgICAgIGZsb2F0IGRpc3RfciA9IDA7CisKKyAgICAgICAgaW50IGlfcGx1cyA9IDA7CisgICAgICAgIGludCBpX21pbnVzID0gMDsKKworICAgICAgICBmbG9hdCBtYXhfY29zX2FscGhhOworCisgICAgICAgIC8qIGZpbmQgIHJpZ2h0IG1pbmltdW0gKi8KKyAgICAgICAgd2hpbGUoIGRpc3RfciA8IGRtaW4yICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZHgsIGR5OworICAgICAgICAgICAgaW50IGluZDsKKworICAgICAgICAgICAgaWYoIGlfcGx1cyA+PSBuICkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICByaWdodF9uZWFyID0gaV9wbHVzOworCisgICAgICAgICAgICBpZiggZGlzdF9yIDwgZG5laWdoMiApCisgICAgICAgICAgICAgICAgcHRJbmZbaV0ucmlnaHRfbmVpZ2ggPSBpX3BsdXM7CisKKyAgICAgICAgICAgIGlfcGx1cysrOworCisgICAgICAgICAgICBpbmQgPSAoaSArIGlfcGx1cykgJSBuOworICAgICAgICAgICAgZHggPSAoZmxvYXQpIChwdEluZltpXS5wdC54IC0gcHRJbmZbaW5kXS5wdC54KTsKKyAgICAgICAgICAgIGR5ID0gKGZsb2F0KSAocHRJbmZbaV0ucHQueSAtIHB0SW5mW2luZF0ucHQueSk7CisgICAgICAgICAgICBkaXN0X3IgPSBkeCAqIGR4ICsgZHkgKiBkeTsKKyAgICAgICAgfQorICAgICAgICAvKiBmaW5kIHJpZ2h0IG1heGltdW0gKi8KKyAgICAgICAgd2hpbGUoIGRpc3RfciA8PSBkbWF4MiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGR4LCBkeTsKKyAgICAgICAgICAgIGludCBpbmQ7CisKKyAgICAgICAgICAgIGlmKCBpX3BsdXMgPj0gbiApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgZGlzdGFuY2VbKGkgKyBpX3BsdXMpICUgbl0gPSBjdlNxcnQoIGRpc3RfciApOworCisgICAgICAgICAgICBpZiggZGlzdF9yIDwgZG5laWdoMiApCisgICAgICAgICAgICAgICAgcHRJbmZbaV0ucmlnaHRfbmVpZ2ggPSBpX3BsdXM7CisKKyAgICAgICAgICAgIGlfcGx1cysrOworCisgICAgICAgICAgICByaWdodF9mYXIgPSBpX3BsdXM7CisKKyAgICAgICAgICAgIGluZCA9IChpICsgaV9wbHVzKSAlIG47CisKKyAgICAgICAgICAgIGR4ID0gKGZsb2F0KSAocHRJbmZbaV0ucHQueCAtIHB0SW5mW2luZF0ucHQueCk7CisgICAgICAgICAgICBkeSA9IChmbG9hdCkgKHB0SW5mW2ldLnB0LnkgLSBwdEluZltpbmRdLnB0LnkpOworICAgICAgICAgICAgZGlzdF9yID0gZHggKiBkeCArIGR5ICogZHk7CisgICAgICAgIH0KKyAgICAgICAgcmlnaHRfZmFyID0gaV9wbHVzOworCisgICAgICAgIC8qIGxlZnQgbWluaW11bSAqLworICAgICAgICB3aGlsZSggZGlzdF9sIDwgZG1pbjIgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkeCwgZHk7CisgICAgICAgICAgICBpbnQgaW5kOworCisgICAgICAgICAgICBpZiggaV9taW51cyA8PSAtbiApCisgICAgICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICAgICAgbGVmdF9uZWFyID0gaV9taW51czsKKworICAgICAgICAgICAgaWYoIGRpc3RfbCA8IGRuZWlnaDIgKQorICAgICAgICAgICAgICAgIHB0SW5mW2ldLmxlZnRfbmVpZ2ggPSBpX21pbnVzOworCisgICAgICAgICAgICBpX21pbnVzLS07CisKKyAgICAgICAgICAgIGluZCA9IGkgKyBpX21pbnVzOworICAgICAgICAgICAgaW5kID0gKGluZCA8IDApID8gKG4gKyBpbmQpIDogaW5kOworCisgICAgICAgICAgICBkeCA9IChmbG9hdCkgKHB0SW5mW2ldLnB0LnggLSBwdEluZltpbmRdLnB0LngpOworICAgICAgICAgICAgZHkgPSAoZmxvYXQpIChwdEluZltpXS5wdC55IC0gcHRJbmZbaW5kXS5wdC55KTsKKyAgICAgICAgICAgIGRpc3RfbCA9IGR4ICogZHggKyBkeSAqIGR5OworICAgICAgICB9CisKKyAgICAgICAgLyogZmluZCBsZWZ0IG1heGltdW0gKi8KKyAgICAgICAgd2hpbGUoIGRpc3RfbCA8PSBkbWF4MiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGR4LCBkeTsKKyAgICAgICAgICAgIGludCBpbmQ7CisKKyAgICAgICAgICAgIGlmKCBpX21pbnVzIDw9IC1uICkKKyAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworCisgICAgICAgICAgICBpbmQgPSBpICsgaV9taW51czsKKyAgICAgICAgICAgIGluZCA9IChpbmQgPCAwKSA/IChuICsgaW5kKSA6IGluZDsKKworICAgICAgICAgICAgZGlzdGFuY2VbaW5kXSA9IGN2U3FydCggZGlzdF9sICk7CisKKyAgICAgICAgICAgIGlmKCBkaXN0X2wgPCBkbmVpZ2gyICkKKyAgICAgICAgICAgICAgICBwdEluZltpXS5sZWZ0X25laWdoID0gaV9taW51czsKKworICAgICAgICAgICAgaV9taW51cy0tOworCisgICAgICAgICAgICBsZWZ0X2ZhciA9IGlfbWludXM7CisKKyAgICAgICAgICAgIGluZCA9IGkgKyBpX21pbnVzOworICAgICAgICAgICAgaW5kID0gKGluZCA8IDApID8gKG4gKyBpbmQpIDogaW5kOworCisgICAgICAgICAgICBkeCA9IChmbG9hdCkgKHB0SW5mW2ldLnB0LnggLSBwdEluZltpbmRdLnB0LngpOworICAgICAgICAgICAgZHkgPSAoZmxvYXQpIChwdEluZltpXS5wdC55IC0gcHRJbmZbaW5kXS5wdC55KTsKKyAgICAgICAgICAgIGRpc3RfbCA9IGR4ICogZHggKyBkeSAqIGR5OworICAgICAgICB9CisgICAgICAgIGxlZnRfZmFyID0gaV9taW51czsKKworICAgICAgICBpZiggKGlfcGx1cyAtIGlfbWludXMpID4gbiArIDIgKQorICAgICAgICAgICAgZ290byBlcnJvcjsKKworICAgICAgICBtYXhfY29zX2FscGhhID0gLTE7CisgICAgICAgIGZvciggaiA9IGxlZnRfZmFyICsgMTsgaiA8IGxlZnRfbmVhcjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZHgsIGR5OworICAgICAgICAgICAgZmxvYXQgYSwgYTI7CisgICAgICAgICAgICBpbnQgbGVmdGluZCA9IGkgKyBqOworCisgICAgICAgICAgICBsZWZ0aW5kID0gKGxlZnRpbmQgPCAwKSA/IChuICsgbGVmdGluZCkgOiBsZWZ0aW5kOworCisgICAgICAgICAgICBhID0gZGlzdGFuY2VbbGVmdGluZF07CisgICAgICAgICAgICBhMiA9IGEgKiBhOworCisgICAgICAgICAgICBmb3IoIGsgPSByaWdodF9uZWFyICsgMTsgayA8IHJpZ2h0X2ZhcjsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaW5kID0gKGkgKyBrKSAlIG47CisgICAgICAgICAgICAgICAgZmxvYXQgYzIsIGNvc2FscGhhOworICAgICAgICAgICAgICAgIGZsb2F0IGIgPSBkaXN0YW5jZVtpbmRdOworICAgICAgICAgICAgICAgIGZsb2F0IGIyID0gYiAqIGI7CisKKyAgICAgICAgICAgICAgICAvKiBjb21wdXRlIGNvc2ludXMgKi8KKyAgICAgICAgICAgICAgICBkeCA9IChmbG9hdCkgKHB0SW5mW2xlZnRpbmRdLnB0LnggLSBwdEluZltpbmRdLnB0LngpOworICAgICAgICAgICAgICAgIGR5ID0gKGZsb2F0KSAocHRJbmZbbGVmdGluZF0ucHQueSAtIHB0SW5mW2luZF0ucHQueSk7CisKKyAgICAgICAgICAgICAgICBjMiA9IGR4ICogZHggKyBkeSAqIGR5OworICAgICAgICAgICAgICAgIGNvc2FscGhhID0gKGEyICsgYjIgLSBjMikgLyAoMiAqIGEgKiBiKTsKKworICAgICAgICAgICAgICAgIG1heF9jb3NfYWxwaGEgPSBNQVgoIG1heF9jb3NfYWxwaGEsIGNvc2FscGhhICk7CisKKyAgICAgICAgICAgICAgICBpZiggbWF4X2Nvc19hbHBoYSA8IG1pbmNvcyApCisgICAgICAgICAgICAgICAgICAgIG1heF9jb3NfYWxwaGEgPSAtMTsKKworICAgICAgICAgICAgICAgIHNoYXJwbmVzc1tpXSA9IG1heF9jb3NfYWxwaGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZCBwYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBjdlN0YXJ0V3JpdGVTZXEoIChjb250b3VyLT5mbGFncyAmIH5DVl9TRVFfRUxUWVBFX01BU0spIHwgQ1ZfU0VRX0VMVFlQRV9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZTZXEgKSwgc2l6ZW9mKCBpbnQgKSwgc3RvcmFnZSwgJndyaXRlciApOworCisgICAgLyogc2Vjb25kIHBhc3MgLSBub25tYXhpbWEgc3VwcHJlc3Npb24gKi8KKyAgICAvKiBuZWlnaGJvcmhvb2Qgb2YgcG9pbnQgPCBkbmVpZ2gyICovCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgc3VwcHJlc3NlZCA9IDA7CisgICAgICAgIGlmKCBzaGFycG5lc3NbaV0gPT0gLTEgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yKCBqID0gMTsgKGogPD0gcHRJbmZbaV0ucmlnaHRfbmVpZ2gpICYmIChzdXBwcmVzc2VkID09IDApOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc2hhcnBuZXNzW2ldIDwgc2hhcnBuZXNzWyhpICsgaikgJSBuXSApCisgICAgICAgICAgICAgICAgc3VwcHJlc3NlZCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGogPSAtMTsgKGogPj0gcHRJbmZbaV0ubGVmdF9uZWlnaCkgJiYgKHN1cHByZXNzZWQgPT0gMCk7IGotLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbmQgPSBpICsgajsKKworICAgICAgICAgICAgaW5kID0gKGluZCA8IDApID8gKG4gKyBpbmQpIDogaW5kOworICAgICAgICAgICAgaWYoIHNoYXJwbmVzc1tpXSA8IHNoYXJwbmVzc1tpbmRdICkKKyAgICAgICAgICAgICAgICBzdXBwcmVzc2VkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhc3VwcHJlc3NlZCApCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggaSwgd3JpdGVyICk7CisgICAgfQorCisgICAgKmNvcm5lcnMgPSBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisKKyAgICBjdkZyZWUoICZzaGFycG5lc3MgKTsKKyAgICBjdkZyZWUoICZkaXN0YW5jZSApOworICAgIGN2RnJlZSggJnB0SW5mICk7CisKKyAgICByZXR1cm4gc3RhdHVzOworCisgIGVycm9yOgorICAgIC8qIGRtYXggaXMgc28gYmlnIChtb3JlIHRoYW4gY29udG91ciBkaWFtZXRlcikKKyAgICAgICB0aGF0IGFsZ29yaXRobSBjb3VsZCBiZWNvbWUgaW5maW5pdGUgY3ljbGUgKi8KKyAgICBjdkZyZWUoICZzaGFycG5lc3MgKTsKKyAgICBjdkZyZWUoICZkaXN0YW5jZSApOworICAgIGN2RnJlZSggJnB0SW5mICk7CisKKyAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogaWN2RmluZERvbWluYW50UG9pbnRzCisvLyAgICBQdXJwb3NlOgorLy8gICAgICBBcHBsaWVzIHNvbWUgYWxnb3JpdGhtIHRvIGZpbmQgZG9taW5hbnQgcG9pbnRzICggY29ybmVycyApIG9mIGNvbnRvdXIKKy8vICAgICAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBjb250b3VycyAtIHBvaW50ZXIgdG8gaW5wdXQgY29udG91ciBvYmplY3QuCisvLyAgICAgIG91dF9udW1iZXJzIC0gYXJyYXkgb2YgZG9taW5hbnQgcG9pbnRzIGluZGljZXMKKy8vICAgICAgY291bnQgLSBsZW5ndGggb2Ygb3V0X251bWJlcnMgYXJyYXkgb24gaW5wdXQKKy8vICAgICAgICAgICAgICBhbmQgbnVtYmVycyBvZiBmb3VuZGVkIGRvbWluYW50IHBvaW50cyBvbiBvdXRwdXQgICAKKy8vICAgICAgICAgICAgICAgICAgCisvLyAgICAgIG1ldGhvZCAtIG9ubHkgQ1ZfRE9NSU5BTlRfSVBBTiBub3cKKy8vICAgICAgcGFyYW1ldGVycyAtIGFycmF5IG9mIHBhcmFtZXRlcnMKKy8vICAgICAgICAgICAgICAgICAgIGZvciBJUEFOIGFsZ29yaXRobQorLy8gICAgICAgICAgICAgICAgICAgWzBdIC0gbWluaW1hbCBkaXN0YW5jZQorLy8gICAgICAgICAgICAgICAgICAgWzFdIC0gbWF4aW1hbCBkaXN0YW5jZQorLy8gICAgICAgICAgICAgICAgICAgWzJdIC0gbmVpZ2hib3Job29kIGRpc3RhbmNlIChtdXN0IGJlIG5vdCBncmVhdGVyIHRoYW4gZG1heGltYWwgZGlzdGFuY2UpCisvLyAgICAgICAgICAgICAgICAgICBbM10gLSBtYXhpbWFsIHBvc3NpYmxlIGFuZ2xlIG9mIGN1cnZhdHVyZQorLy8gICAgUmV0dXJuczoKKy8vICAgICAgQ1ZfT0sgb3IgZXJyb3IgY29kZQorLy8gICAgTm90ZXM6CisvLyAgICAgIFVzZXIgbXVzdCBhbGxvY2F0ZSBvdXRfbnVtYmVycyBhcnJheS4gSWYgaXQgaXMgc21hbGwgLSBmdW5jdGlvbiBmaWxscyBhcnJheSAKKy8vICAgICAgd2l0aCBwYXJ0IG9mIHBvaW50cyBhbmQgcmV0dXJucyAgZXJyb3IKKy8vRiovCitDVl9JTVBMIEN2U2VxKgorY3ZGaW5kRG9taW5hbnRQb2ludHMoIEN2U2VxICogY29udG91ciwgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSwgaW50IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW1ldGVyMSwgZG91YmxlIHBhcmFtZXRlcjIsIGRvdWJsZSBwYXJhbWV0ZXIzLCBkb3VibGUgcGFyYW1ldGVyNCApCit7CisgICAgQ3ZTZXEqIGNvcm5lcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkZpbmREb21pbmFudFBvaW50cyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWNvbnRvdXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgIHN0b3JhZ2UgPSBjb250b3VyLT5zdG9yYWdlOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBzd2l0Y2ggKG1ldGhvZCkKKyAgICB7CisgICAgY2FzZSBDVl9ET01JTkFOVF9JUEFOOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZG1pbiA9IGN2Um91bmQocGFyYW1ldGVyMSk7CisgICAgICAgICAgICBpbnQgZG1heCA9IGN2Um91bmQocGFyYW1ldGVyMik7CisgICAgICAgICAgICBpbnQgZG5laWdoID0gY3ZSb3VuZChwYXJhbWV0ZXIzKTsKKyAgICAgICAgICAgIGludCBhbWF4ID0gY3ZSb3VuZChwYXJhbWV0ZXI0KTsKKworICAgICAgICAgICAgaWYoIGFtYXggPT0gMCApCisgICAgICAgICAgICAgICAgYW1heCA9IDE1MDsKKyAgICAgICAgICAgIGlmKCBkbWluID09IDAgKQorICAgICAgICAgICAgICAgIGRtaW4gPSA3OworICAgICAgICAgICAgaWYoIGRtYXggPT0gMCApCisgICAgICAgICAgICAgICAgZG1heCA9IGRtaW4gKyAyOworICAgICAgICAgICAgaWYoIGRuZWlnaCA9PSAwICkKKyAgICAgICAgICAgICAgICBkbmVpZ2ggPSBkbWluOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkZpbmREb21pbmFudFBvaW50c0lQQU4oIGNvbnRvdXIsIHN0b3JhZ2UsICZjb3JuZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbWluKmRtaW4sIGRtYXgqZG1heCwgZG5laWdoKmRuZWlnaCwgKGZsb2F0KWFtYXggKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBREZMQUdfRVJSICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjb3JuZXJzOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmVtZC5jcHAgYi9jdi9zcmMvY3ZlbWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYmUzNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZlbWQuY3BwCkBAIC0wLDAgKzEsMTE2NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qCisgICAgUGFydGlhbGx5IGJhc2VkIG9uIFlvc3NpIFJ1Ym5lciBjb2RlOgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBlbWQuYworCisgICAgTGFzdCB1cGRhdGU6IDMvMTQvOTgKKworICAgIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBFYXJ0aCBNb3ZlcnMgRGlzdGFuY2UuCisgICAgQmFzZWQgb2YgdGhlIHNvbHV0aW9uIGZvciB0aGUgVHJhbnNwb3J0YXRpb24gcHJvYmxlbSBhcyBkZXNjcmliZWQgaW4KKyAgICAiSW50cm9kdWN0aW9uIHRvIE1hdGhlbWF0aWNhbCBQcm9ncmFtbWluZyIgYnkgRi4gUy4gSGlsbGllciBhbmQgCisgICAgRy4gSi4gTGllYmVybWFuLCBNY0dyYXctSGlsbCwgMTk5MC4KKworICAgIENvcHlyaWdodCAoQykgMTk5OCBZb3NzaSBSdWJuZXIKKyAgICBDb21wdXRlciBTY2llbmNlIERlcGFydG1lbnQsIFN0YW5mb3JkIFVuaXZlcnNpdHkKKyAgICBFLU1haWw6IHJ1Ym5lckBjcy5zdGFuZm9yZC5lZHUgICBVUkw6IGh0dHA6Ly92aXNpb24uc3RhbmZvcmQuZWR1L35ydWJuZXIKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKyNpbmNsdWRlICJfY3YuaCIKKworI2RlZmluZSBNQVhfSVRFUkFUSU9OUyA1MDAKKyNkZWZpbmUgQ1ZfRU1EX0lORiAgICgoZmxvYXQpMWUyMCkKKyNkZWZpbmUgQ1ZfRU1EX0VQUyAgICgoZmxvYXQpMWUtNSkKKworLyogQ3ZOb2RlMUQgaXMgdXNlZCBmb3IgbGlzdHMsIHJlcHJlc2VudGluZyAxRCBzcGFyc2UgYXJyYXkgKi8KK3R5cGVkZWYgc3RydWN0IEN2Tm9kZTFECit7CisgICAgZmxvYXQgdmFsOworICAgIHN0cnVjdCBDdk5vZGUxRCAqbmV4dDsKK30KK0N2Tm9kZTFEOworCisvKiBDdk5vZGUyRCBpcyB1c2VkIGZvciBsaXN0cywgcmVwcmVzZW50aW5nIDJEIHNwYXJzZSBtYXRyaXggKi8KK3R5cGVkZWYgc3RydWN0IEN2Tm9kZTJECit7CisgICAgZmxvYXQgdmFsOworICAgIHN0cnVjdCBDdk5vZGUyRCAqbmV4dFsyXTsgIC8qIG5leHQgcm93ICYgbmV4dCBjb2x1bW4gKi8KKyAgICBpbnQgaSwgajsKK30KK0N2Tm9kZTJEOworCisKK3R5cGVkZWYgc3RydWN0IEN2RU1EU3RhdGUKK3sKKyAgICBpbnQgc3NpemUsIGRzaXplOworCisgICAgZmxvYXQgKipjb3N0OworICAgIEN2Tm9kZTJEICpfeDsKKyAgICBDdk5vZGUyRCAqZW5kX3g7CisgICAgQ3ZOb2RlMkQgKmVudGVyX3g7CisgICAgY2hhciAqKmlzX3g7CisKKyAgICBDdk5vZGUyRCAqKnJvd3NfeDsKKyAgICBDdk5vZGUyRCAqKmNvbHNfeDsKKworICAgIEN2Tm9kZTFEICp1OworICAgIEN2Tm9kZTFEICp2OworCisgICAgaW50KiBpZHgxOworICAgIGludCogaWR4MjsKKworICAgIC8qIGZpbmRfbG9vcCBidWZmZXJzICovCisgICAgQ3ZOb2RlMkQgKipsb29wOworICAgIGNoYXIgKmlzX3VzZWQ7CisKKyAgICAvKiBydXNzZWwgYnVmZmVycyAqLworICAgIGZsb2F0ICpzOworICAgIGZsb2F0ICpkOworICAgIGZsb2F0ICoqZGVsdGE7CisKKyAgICBmbG9hdCB3ZWlnaHQsIG1heF9jb3N0OworICAgIGNoYXIgKmJ1ZmZlcjsKK30KK0N2RU1EU3RhdGU7CisKKy8qIHN0YXRpYyBmdW5jdGlvbiBkZWNsYXJhdGlvbiAqLworc3RhdGljIEN2U3RhdHVzIGljdkluaXRFTUQoIGNvbnN0IGZsb2F0ICpzaWduYXR1cmUxLCBpbnQgc2l6ZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hdHVyZTIsIGludCBzaXplMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltcywgQ3ZEaXN0YW5jZUZ1bmN0aW9uIGRpc3RfZnVuYywgdm9pZCAqdXNlcl9wYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogY29zdCwgaW50IGNvc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkVNRFN0YXRlICogc3RhdGUsIGZsb2F0ICpsb3dlcl9ib3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpsb2NhbF9idWZmZXIsIGludCBsb2NhbF9idWZmZXJfc2l6ZSApOworCitzdGF0aWMgQ3ZTdGF0dXMgaWN2RmluZEJhc2ljVmFyaWFibGVzKCBmbG9hdCAqKmNvc3QsIGNoYXIgKippc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZOb2RlMUQgKiB1LCBDdk5vZGUxRCAqIHYsIGludCBzc2l6ZSwgaW50IGRzaXplICk7CisKK3N0YXRpYyBmbG9hdCBpY3ZJc09wdGltYWwoIGZsb2F0ICoqY29zdCwgY2hhciAqKmlzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk5vZGUxRCAqIHUsIEN2Tm9kZTFEICogdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzc2l6ZSwgaW50IGRzaXplLCBDdk5vZGUyRCAqIGVudGVyX3ggKTsKKworc3RhdGljIHZvaWQgaWN2UnVzc2VsKCBDdkVNRFN0YXRlICogc3RhdGUgKTsKKworCitzdGF0aWMgQ3ZTdGF0dXMgaWN2TmV3U29sdXRpb24oIEN2RU1EU3RhdGUgKiBzdGF0ZSApOworc3RhdGljIGludCBpY3ZGaW5kTG9vcCggQ3ZFTURTdGF0ZSAqIHN0YXRlICk7CisKK3N0YXRpYyB2b2lkIGljdkFkZEJhc2ljVmFyaWFibGUoIEN2RU1EU3RhdGUgKiBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5faSwgaW50IG1pbl9qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZOb2RlMUQgKiBwcmV2X3VfbWluX2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk5vZGUxRCAqIHByZXZfdl9taW5faiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Tm9kZTFEICogdV9oZWFkICk7CisKK3N0YXRpYyBmbG9hdCBpY3ZEaXN0TDIoIGNvbnN0IGZsb2F0ICp4LCBjb25zdCBmbG9hdCAqeSwgdm9pZCAqdXNlcl9wYXJhbSApOworc3RhdGljIGZsb2F0IGljdkRpc3RMMSggY29uc3QgZmxvYXQgKngsIGNvbnN0IGZsb2F0ICp5LCB2b2lkICp1c2VyX3BhcmFtICk7CitzdGF0aWMgZmxvYXQgaWN2RGlzdEMoIGNvbnN0IGZsb2F0ICp4LCBjb25zdCBmbG9hdCAqeSwgdm9pZCAqdXNlcl9wYXJhbSApOworCisvKiBUaGUgbWFpbiBmdW5jdGlvbiAqLworQ1ZfSU1QTCBmbG9hdAorY3ZDYWxjRU1EMiggY29uc3QgQ3ZBcnIqIHNpZ25hdHVyZV9hcnIxLAorICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHNpZ25hdHVyZV9hcnIyLAorICAgICAgICAgICAgaW50IGRpc3RfdHlwZSwKKyAgICAgICAgICAgIEN2RGlzdGFuY2VGdW5jdGlvbiBkaXN0X2Z1bmMsCisgICAgICAgICAgICBjb25zdCBDdkFyciogY29zdF9tYXRyaXgsCisgICAgICAgICAgICBDdkFyciogZmxvd19tYXRyaXgsCisgICAgICAgICAgICBmbG9hdCAqbG93ZXJfYm91bmQsCisgICAgICAgICAgICB2b2lkICp1c2VyX3BhcmFtICkKK3sKKyAgICBjaGFyIGxvY2FsX2J1ZmZlclsxNjM4NF07CisgICAgY2hhciAqbG9jYWxfYnVmZmVyX3B0ciA9IChjaGFyICopY3ZBbGlnblB0cihsb2NhbF9idWZmZXIsMTYpOworICAgIEN2RU1EU3RhdGUgc3RhdGU7CisgICAgZmxvYXQgZW1kID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjRU1EMiIgKTsKKworICAgIG1lbXNldCggJnN0YXRlLCAwLCBzaXplb2Yoc3RhdGUpKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSB0b3RhbF9jb3N0ID0gMDsKKyAgICBDdlN0YXR1cyByZXN1bHQgPSBDVl9OT19FUlI7CisgICAgZmxvYXQgZXBzLCBtaW5fZGVsdGE7CisgICAgQ3ZOb2RlMkQgKnhwID0gMDsKKyAgICBDdk1hdCBzaWduX3N0dWIxLCAqc2lnbmF0dXJlMSA9IChDdk1hdCopc2lnbmF0dXJlX2FycjE7CisgICAgQ3ZNYXQgc2lnbl9zdHViMiwgKnNpZ25hdHVyZTIgPSAoQ3ZNYXQqKXNpZ25hdHVyZV9hcnIyOworICAgIEN2TWF0IGNvc3Rfc3R1YiwgKmNvc3QgPSAmY29zdF9zdHViOworICAgIEN2TWF0IGZsb3dfc3R1YiwgKmZsb3cgPSAoQ3ZNYXQqKWZsb3dfbWF0cml4OworICAgIGludCBkaW1zLCBzaXplMSwgc2l6ZTI7CisKKyAgICBDVl9DQUxMKCBzaWduYXR1cmUxID0gY3ZHZXRNYXQoIHNpZ25hdHVyZTEsICZzaWduX3N0dWIxICkpOworICAgIENWX0NBTEwoIHNpZ25hdHVyZTIgPSBjdkdldE1hdCggc2lnbmF0dXJlMiwgJnNpZ25fc3R1YjIgKSk7CisKKyAgICBpZiggc2lnbmF0dXJlMS0+Y29scyAhPSBzaWduYXR1cmUyLT5jb2xzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVGhlIGFycmF5cyBtdXN0IGhhdmUgZXF1YWwgbnVtYmVyIG9mIGNvbHVtbnMgKHdoaWNoIGlzIG51bWJlciBvZiBkaW1lbnNpb25zIGJ1dCAxKSIgKTsKKworICAgIGRpbXMgPSBzaWduYXR1cmUxLT5jb2xzIC0gMTsKKyAgICBzaXplMSA9IHNpZ25hdHVyZTEtPnJvd3M7CisgICAgc2l6ZTIgPSBzaWduYXR1cmUyLT5yb3dzOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNpZ25hdHVyZTEsIHNpZ25hdHVyZTIgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJUaGUgYXJyYXkgbXVzdCBoYXZlIGVxdWFsIHR5cGVzIiApOworCisgICAgaWYoIENWX01BVF9UWVBFKCBzaWduYXR1cmUxLT50eXBlICkgIT0gQ1ZfMzJGQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgc2lnbmF0dXJlcyBtdXN0IGJlIDMyZkMxIiApOworCisgICAgaWYoIGZsb3cgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZmxvdyA9IGN2R2V0TWF0KCBmbG93LCAmZmxvd19zdHViICkpOworCisgICAgICAgIGlmKCBmbG93LT5yb3dzICE9IHNpemUxIHx8IGZsb3ctPmNvbHMgIT0gc2l6ZTIgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgIlRoZSBmbG93IG1hdHJpeCBzaXplIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBzaWduYXR1cmVzJyBzaXplcyIgKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoIGZsb3ctPnR5cGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgZmxvdyBtYXRyaXggbXVzdCBiZSAzMmZDMSIgKTsKKyAgICB9CisKKyAgICBjb3N0LT5kYXRhLmZsID0gMDsKKyAgICBjb3N0LT5zdGVwID0gMDsKKworICAgIGlmKCBkaXN0X3R5cGUgPCAwICkKKyAgICB7CisgICAgICAgIGlmKCBjb3N0X21hdHJpeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkaXN0X2Z1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgIk9ubHkgb25lIG9mIGNvc3QgbWF0cml4IG9yIGRpc3RhbmNlIGZ1bmN0aW9uIHNob3VsZCBiZSBub24tTlVMTCBpbiBjYXNlIG9mIHVzZXItZGVmaW5lZCBkaXN0YW5jZSIgKTsKKworICAgICAgICAgICAgaWYoIGxvd2VyX2JvdW5kICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICJUaGUgbG93ZXIgYm91bmRhcnkgY2FuIG5vdCBiZSBjYWxjdWxhdGVkIGlmIHRoZSBjb3N0IG1hdHJpeCBpcyB1c2VkIiApOworCisgICAgICAgICAgICBDVl9DQUxMKCBjb3N0ID0gY3ZHZXRNYXQoIGNvc3RfbWF0cml4LCAmY29zdF9zdHViICkpOworICAgICAgICAgICAgaWYoIGNvc3QtPnJvd3MgIT0gc2l6ZTEgfHwgY29zdC0+Y29scyAhPSBzaXplMiApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICJUaGUgY29zdCBtYXRyaXggc2l6ZSBkb2VzIG5vdCBtYXRjaCB0byB0aGUgc2lnbmF0dXJlcycgc2l6ZXMiICk7CisKKyAgICAgICAgICAgIGlmKCBDVl9NQVRfVFlQRSggY29zdC0+dHlwZSApICE9IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgY29zdCBtYXRyaXggbXVzdCBiZSAzMmZDMSIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAhZGlzdF9mdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiSW4gY2FzZSBvZiB1c2VyLWRlZmluZWQgZGlzdGFuY2UgRGlzdGFuY2UgZnVuY3Rpb24gaXMgdW5kZWZpbmVkIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggZGltcyA9PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIk51bWJlciBvZiBkaW1lbnNpb25zIGNhbiBiZSAwIG9ubHkgaWYgYSB1c2VyLWRlZmluZWQgbWV0cmljIGlzIHVzZWQiICk7CisgICAgICAgIHVzZXJfcGFyYW0gPSAodm9pZCAqKSAoc2l6ZV90KWRpbXM7CisgICAgICAgIHN3aXRjaCAoZGlzdF90eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfRElTVF9MMToKKyAgICAgICAgICAgIGRpc3RfZnVuYyA9IGljdkRpc3RMMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWX0RJU1RfTDI6CisgICAgICAgICAgICBkaXN0X2Z1bmMgPSBpY3ZEaXN0TDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl9ESVNUX0M6CisgICAgICAgICAgICBkaXN0X2Z1bmMgPSBpY3ZEaXN0QzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJCYWQgb3IgdW5zdXBwb3J0ZWQgbWV0cmljIHR5cGUiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJUFBJX0NBTEwoIHJlc3VsdCA9IGljdkluaXRFTUQoIHNpZ25hdHVyZTEtPmRhdGEuZmwsIHNpemUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlMi0+ZGF0YS5mbCwgc2l6ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaW1zLCBkaXN0X2Z1bmMsIHVzZXJfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3N0LT5kYXRhLmZsLCBjb3N0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRlLCBsb3dlcl9ib3VuZCwgbG9jYWxfYnVmZmVyX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggbG9jYWxfYnVmZmVyICkgLSAxNiApKTsKKworICAgIGlmKCByZXN1bHQgPiAwICYmIGxvd2VyX2JvdW5kICkKKyAgICB7CisgICAgICAgIGVtZCA9ICpsb3dlcl9ib3VuZDsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBlcHMgPSBDVl9FTURfRVBTICogc3RhdGUubWF4X2Nvc3Q7CisKKyAgICAvKiBpZiBzc2l6ZSA9IDEgb3IgZHNpemUgPSAxIHRoZW4gd2UgYXJlIGRvbmUsIGVsc2UgLi4uICovCisgICAgaWYoIHN0YXRlLnNzaXplID4gMSAmJiBzdGF0ZS5kc2l6ZSA+IDEgKQorICAgIHsKKyAgICAgICAgaW50IGl0cjsKKworICAgICAgICBmb3IoIGl0ciA9IDE7IGl0ciA8IE1BWF9JVEVSQVRJT05TOyBpdHIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgYmFzaWMgdmFyaWFibGVzICovCisgICAgICAgICAgICByZXN1bHQgPSBpY3ZGaW5kQmFzaWNWYXJpYWJsZXMoIHN0YXRlLmNvc3QsIHN0YXRlLmlzX3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnUsIHN0YXRlLnYsIHN0YXRlLnNzaXplLCBzdGF0ZS5kc2l6ZSApOworICAgICAgICAgICAgaWYoIHJlc3VsdCA8IDAgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBjaGVjayBmb3Igb3B0aW1hbGl0eSAqLworICAgICAgICAgICAgbWluX2RlbHRhID0gaWN2SXNPcHRpbWFsKCBzdGF0ZS5jb3N0LCBzdGF0ZS5pc194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS51LCBzdGF0ZS52LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zc2l6ZSwgc3RhdGUuZHNpemUsIHN0YXRlLmVudGVyX3ggKTsKKworICAgICAgICAgICAgaWYoIG1pbl9kZWx0YSA9PSBDVl9FTURfSU5GICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm9Db252LCAiIiApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBpZiBubyBuZWdhdGl2ZSBkZWx0YW1pbiwgd2UgZm91bmQgdGhlIG9wdGltYWwgc29sdXRpb24gKi8KKyAgICAgICAgICAgIGlmKCBtaW5fZGVsdGEgPj0gLWVwcyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIGltcHJvdmUgc29sdXRpb24gKi8KKyAgICAgICAgICAgIElQUElfQ0FMTCggaWN2TmV3U29sdXRpb24oICZzdGF0ZSApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNvbXB1dGUgdGhlIHRvdGFsIGZsb3cgKi8KKyAgICBmb3IoIHhwID0gc3RhdGUuX3g7IHhwIDwgc3RhdGUuZW5kX3g7IHhwKysgKQorICAgIHsKKyAgICAgICAgZmxvYXQgdmFsID0geHAtPnZhbDsKKyAgICAgICAgaW50IGkgPSB4cC0+aTsKKyAgICAgICAgaW50IGogPSB4cC0+ajsKKyAgICAgICAgaW50IGNpID0gc3RhdGUuaWR4MVtpXTsKKyAgICAgICAgaW50IGNqID0gc3RhdGUuaWR4MltqXTsKKworICAgICAgICBpZiggeHAgIT0gc3RhdGUuZW50ZXJfeCAmJiBjaSA+PSAwICYmIGNqID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICB0b3RhbF9jb3N0ICs9IChkb3VibGUpdmFsICogc3RhdGUuY29zdFtpXVtqXTsKKyAgICAgICAgICAgIGlmKCBmbG93ICkKKyAgICAgICAgICAgICAgICAoKGZsb2F0KikoZmxvdy0+ZGF0YS5wdHIgKyBmbG93LT5zdGVwKmNpKSlbY2pdID0gdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgZW1kID0gKGZsb2F0KSAodG90YWxfY29zdCAvIHN0YXRlLndlaWdodCk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIHN0YXRlLmJ1ZmZlciAmJiBzdGF0ZS5idWZmZXIgIT0gbG9jYWxfYnVmZmVyX3B0ciApCisgICAgICAgIGN2RnJlZSggJnN0YXRlLmJ1ZmZlciApOworCisgICAgcmV0dXJuIGVtZDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICBpbml0aWFsaXplIHN0cnVjdHVyZSwgYWxsb2NhdGUgYnVmZmVycyBhbmQgZ2VuZXJhdGUgaW5pdGlhbCBnb2x1dGlvbiAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkluaXRFTUQoIGNvbnN0IGZsb2F0KiBzaWduYXR1cmUxLCBpbnQgc2l6ZTEsCisgICAgICAgICAgICBjb25zdCBmbG9hdCogc2lnbmF0dXJlMiwgaW50IHNpemUyLAorICAgICAgICAgICAgaW50IGRpbXMsIEN2RGlzdGFuY2VGdW5jdGlvbiBkaXN0X2Z1bmMsIHZvaWQqIHVzZXJfcGFyYW0sCisgICAgICAgICAgICBjb25zdCBmbG9hdCogY29zdCwgaW50IGNvc3Rfc3RlcCwKKyAgICAgICAgICAgIEN2RU1EU3RhdGUqIHN0YXRlLCBmbG9hdCogbG93ZXJfYm91bmQsCisgICAgICAgICAgICBjaGFyKiBsb2NhbF9idWZmZXIsIGludCBsb2NhbF9idWZmZXJfc2l6ZSApCit7CisgICAgZmxvYXQgc19zdW0gPSAwLCBkX3N1bSA9IDAsIGRpZmY7CisgICAgaW50IGksIGo7CisgICAgaW50IHNzaXplID0gMCwgZHNpemUgPSAwOworICAgIGludCBlcXVhbF9zdW1zID0gMTsKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgZmxvYXQgbWF4X2Nvc3QgPSAwOworICAgIGNoYXIgKmJ1ZmZlciwgKmJ1ZmZlcl9lbmQ7CisKKyAgICBtZW1zZXQoIHN0YXRlLCAwLCBzaXplb2YoICpzdGF0ZSApKTsKKyAgICBhc3NlcnQoIGNvc3Rfc3RlcCAlIHNpemVvZihmbG9hdCkgPT0gMCApOworICAgIGNvc3Rfc3RlcCAvPSBzaXplb2YoZmxvYXQpOworCisgICAgLyogY2FsY3VsYXRlIGJ1ZmZlciBzaXplICovCisgICAgYnVmZmVyX3NpemUgPSAoc2l6ZTErMSkgKiAoc2l6ZTIrMSkgKiAoc2l6ZW9mKCBmbG9hdCApICsgICAgLyogY29zdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGNoYXIgKSArICAgICAvKiBpc194ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggZmxvYXQgKSkgKyAgIC8qIGRlbHRhIG1hdHJpeCAqLworICAgICAgICAoc2l6ZTEgKyBzaXplMiArIDIpICogKHNpemVvZiggQ3ZOb2RlMkQgKSArIC8qIF94ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIEN2Tm9kZTJEICogKSArICAvKiBjb2xzX3ggJiByb3dzX3ggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZOb2RlMUQgKSArIC8qIHUgJiB2ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGZsb2F0ICkgKyAvKiBzICYgZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBpbnQgKSArIHNpemVvZihDdk5vZGUyRCopKSArICAvKiBpZHgxICYgaWR4MiAqLyAKKyAgICAgICAgKHNpemUxKzEpICogKHNpemVvZiggZmxvYXQgKiApICsgc2l6ZW9mKCBjaGFyICogKSArIC8qIHJvd3MgcG9pbnRlcnMgZm9yICovCisgICAgICAgICAgICAgICAgIHNpemVvZiggZmxvYXQgKiApKSArIDI1NjsgICAgICAvKiAgY29zdCwgaXNfeCBhbmQgZGVsdGEgKi8KKworICAgIGlmKCBidWZmZXJfc2l6ZSA8IChpbnQpIChkaW1zICogMiAqIHNpemVvZiggZmxvYXQgKSkpCisgICAgeworICAgICAgICBidWZmZXJfc2l6ZSA9IGRpbXMgKiAyICogc2l6ZW9mKCBmbG9hdCApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIGJ1ZmZlcnMgKi8KKyAgICBpZiggbG9jYWxfYnVmZmVyICE9IDAgJiYgbG9jYWxfYnVmZmVyX3NpemUgPj0gYnVmZmVyX3NpemUgKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gbG9jYWxfYnVmZmVyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBidWZmZXIgPSAoY2hhciopY3ZBbGxvYyggYnVmZmVyX3NpemUgKTsKKyAgICAgICAgaWYoICFidWZmZXIgKQorICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKyAgICB9CisKKyAgICBzdGF0ZS0+YnVmZmVyID0gYnVmZmVyOworICAgIGJ1ZmZlcl9lbmQgPSBidWZmZXIgKyBidWZmZXJfc2l6ZTsKKworICAgIHN0YXRlLT5pZHgxID0gKGludCopIGJ1ZmZlcjsKKyAgICBidWZmZXIgKz0gKHNpemUxICsgMSkgKiBzaXplb2YoIGludCApOworCisgICAgc3RhdGUtPmlkeDIgPSAoaW50KikgYnVmZmVyOworICAgIGJ1ZmZlciArPSAoc2l6ZTIgKyAxKSAqIHNpemVvZiggaW50ICk7CisKKyAgICBzdGF0ZS0+cyA9IChmbG9hdCAqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IChzaXplMSArIDEpICogc2l6ZW9mKCBmbG9hdCApOworCisgICAgc3RhdGUtPmQgPSAoZmxvYXQgKikgYnVmZmVyOworICAgIGJ1ZmZlciArPSAoc2l6ZTIgKyAxKSAqIHNpemVvZiggZmxvYXQgKTsKKworICAgIC8qIHN1bSB1cCB0aGUgc3VwcGx5IGFuZCBkZW1hbmQgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZTE7IGkrKyApCisgICAgeworICAgICAgICBmbG9hdCB3ZWlnaHQgPSBzaWduYXR1cmUxW2kgKiAoZGltcyArIDEpXTsKKworICAgICAgICBpZiggd2VpZ2h0ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNfc3VtICs9IHdlaWdodDsKKyAgICAgICAgICAgIHN0YXRlLT5zW3NzaXplXSA9IHdlaWdodDsKKyAgICAgICAgICAgIHN0YXRlLT5pZHgxW3NzaXplKytdID0gaTsKKyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHdlaWdodCA8IDAgKQorICAgICAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZTI7IGkrKyApCisgICAgeworICAgICAgICBmbG9hdCB3ZWlnaHQgPSBzaWduYXR1cmUyW2kgKiAoZGltcyArIDEpXTsKKworICAgICAgICBpZiggd2VpZ2h0ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRfc3VtICs9IHdlaWdodDsKKyAgICAgICAgICAgIHN0YXRlLT5kW2RzaXplXSA9IHdlaWdodDsKKyAgICAgICAgICAgIHN0YXRlLT5pZHgyW2RzaXplKytdID0gaTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB3ZWlnaHQgPCAwICkKKyAgICAgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisgICAgfQorCisgICAgaWYoIHNzaXplID09IDAgfHwgZHNpemUgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICAvKiBpZiBzdXBwbHkgZGlmZmVyZW50IHRoYW4gdGhlIGRlbWFuZCwgYWRkIGEgemVyby1jb3N0IGR1bW15IGNsdXN0ZXIgKi8KKyAgICBkaWZmID0gc19zdW0gLSBkX3N1bTsKKyAgICBpZiggZmFicyggZGlmZiApID49IENWX0VNRF9FUFMgKiBzX3N1bSApCisgICAgeworICAgICAgICBlcXVhbF9zdW1zID0gMDsKKyAgICAgICAgaWYoIGRpZmYgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGUtPnNbc3NpemVdID0gLWRpZmY7CisgICAgICAgICAgICBzdGF0ZS0+aWR4MVtzc2l6ZSsrXSA9IC0xOworICAgICAgICB9ICAgIAorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXRlLT5kW2RzaXplXSA9IGRpZmY7CisgICAgICAgICAgICBzdGF0ZS0+aWR4Mltkc2l6ZSsrXSA9IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGUtPnNzaXplID0gc3NpemU7CisgICAgc3RhdGUtPmRzaXplID0gZHNpemU7CisgICAgc3RhdGUtPndlaWdodCA9IHNfc3VtID4gZF9zdW0gPyBzX3N1bSA6IGRfc3VtOworCisgICAgaWYoIGxvd2VyX2JvdW5kICYmIGVxdWFsX3N1bXMgKSAgICAgLyogY2hlY2sgbG93ZXIgYm91bmQgKi8KKyAgICB7CisgICAgICAgIGludCBzejEgPSBzaXplMSAqIChkaW1zICsgMSksIHN6MiA9IHNpemUyICogKGRpbXMgKyAxKTsKKyAgICAgICAgZmxvYXQgbGIgPSAwOworCisgICAgICAgIGZsb2F0KiB4cyA9IChmbG9hdCAqKSBidWZmZXI7CisgICAgICAgIGZsb2F0KiB4ZCA9IHhzICsgZGltczsKKworICAgICAgICBtZW1zZXQoIHhzLCAwLCBkaW1zKnNpemVvZih4c1swXSkpOworICAgICAgICBtZW1zZXQoIHhkLCAwLCBkaW1zKnNpemVvZih4ZFswXSkpOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzejE7IGogKz0gZGltcyArIDEgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB3ZWlnaHQgPSBzaWduYXR1cmUxW2pdOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgeHNbaV0gKz0gc2lnbmF0dXJlMVtqICsgaSArIDFdICogd2VpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHN6MjsgaiArPSBkaW1zICsgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHdlaWdodCA9IHNpZ25hdHVyZTJbal07CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICB4ZFtpXSArPSBzaWduYXR1cmUyW2ogKyBpICsgMV0gKiB3ZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBsYiA9IGRpc3RfZnVuYyggeHMsIHhkLCB1c2VyX3BhcmFtICkgLyBzdGF0ZS0+d2VpZ2h0OworICAgICAgICBpID0gKmxvd2VyX2JvdW5kIDw9IGxiOworICAgICAgICAqbG93ZXJfYm91bmQgPSBsYjsKKyAgICAgICAgaWYoIGkgKQorICAgICAgICAgICAgcmV0dXJuICggQ3ZTdGF0dXMgKSAxOworICAgIH0KKworICAgIC8qIGFzc2lnbiBwb2ludGVycyAqLworICAgIHN0YXRlLT5pc191c2VkID0gKGNoYXIgKikgYnVmZmVyOworICAgIC8qIGluaXQgZGVsdGEgbWF0cml4ICovCisgICAgc3RhdGUtPmRlbHRhID0gKGZsb2F0ICoqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IHNzaXplICogc2l6ZW9mKCBmbG9hdCAqICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc3NpemU7IGkrKyApCisgICAgeworICAgICAgICBzdGF0ZS0+ZGVsdGFbaV0gPSAoZmxvYXQgKikgYnVmZmVyOworICAgICAgICBidWZmZXIgKz0gZHNpemUgKiBzaXplb2YoIGZsb2F0ICk7CisgICAgfQorCisgICAgc3RhdGUtPmxvb3AgPSAoQ3ZOb2RlMkQgKiopIGJ1ZmZlcjsKKyAgICBidWZmZXIgKz0gKHNzaXplICsgZHNpemUgKyAxKSAqIHNpemVvZihDdk5vZGUyRCopOworCisgICAgc3RhdGUtPl94ID0gc3RhdGUtPmVuZF94ID0gKEN2Tm9kZTJEICopIGJ1ZmZlcjsKKyAgICBidWZmZXIgKz0gKHNzaXplICsgZHNpemUpICogc2l6ZW9mKCBDdk5vZGUyRCApOworCisgICAgLyogaW5pdCBjb3N0IG1hdHJpeCAqLworICAgIHN0YXRlLT5jb3N0ID0gKGZsb2F0ICoqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IHNzaXplICogc2l6ZW9mKCBmbG9hdCAqICk7CisKKyAgICAvKiBjb21wdXRlIHRoZSBkaXN0YW5jZSBtYXRyaXggKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgc3NpemU7IGkrKyApCisgICAgeworICAgICAgICBpbnQgY2kgPSBzdGF0ZS0+aWR4MVtpXTsKKworICAgICAgICBzdGF0ZS0+Y29zdFtpXSA9IChmbG9hdCAqKSBidWZmZXI7CisgICAgICAgIGJ1ZmZlciArPSBkc2l6ZSAqIHNpemVvZiggZmxvYXQgKTsKKworICAgICAgICBpZiggY2kgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkc2l6ZTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2ogPSBzdGF0ZS0+aWR4MltqXTsKKyAgICAgICAgICAgICAgICBpZiggY2ogPCAwICkKKyAgICAgICAgICAgICAgICAgICAgc3RhdGUtPmNvc3RbaV1bal0gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRpc3RfZnVuYyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGRpc3RfZnVuYyggc2lnbmF0dXJlMSArIGNpICogKGRpbXMgKyAxKSArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZTIgKyBjaiAqIChkaW1zICsgMSkgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyX3BhcmFtICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNvc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGNvc3RbY29zdF9zdGVwKmNpICsgY2pdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5jb3N0W2ldW2pdID0gdmFsOworICAgICAgICAgICAgICAgICAgICBpZiggbWF4X2Nvc3QgPCB2YWwgKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Nvc3QgPSB2YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRzaXplOyBqKysgKQorICAgICAgICAgICAgICAgIHN0YXRlLT5jb3N0W2ldW2pdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRlLT5tYXhfY29zdCA9IG1heF9jb3N0OworICAgIAorICAgIG1lbXNldCggYnVmZmVyLCAwLCBidWZmZXJfZW5kIC0gYnVmZmVyICk7CisKKyAgICBzdGF0ZS0+cm93c194ID0gKEN2Tm9kZTJEICoqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IHNzaXplICogc2l6ZW9mKCBDdk5vZGUyRCAqICk7CisKKyAgICBzdGF0ZS0+Y29sc194ID0gKEN2Tm9kZTJEICoqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IGRzaXplICogc2l6ZW9mKCBDdk5vZGUyRCAqICk7CisKKyAgICBzdGF0ZS0+dSA9IChDdk5vZGUxRCAqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IHNzaXplICogc2l6ZW9mKCBDdk5vZGUxRCApOworCisgICAgc3RhdGUtPnYgPSAoQ3ZOb2RlMUQgKikgYnVmZmVyOworICAgIGJ1ZmZlciArPSBkc2l6ZSAqIHNpemVvZiggQ3ZOb2RlMUQgKTsKKworICAgIC8qIGluaXQgaXNfeCBtYXRyaXggKi8KKyAgICBzdGF0ZS0+aXNfeCA9IChjaGFyICoqKSBidWZmZXI7CisgICAgYnVmZmVyICs9IHNzaXplICogc2l6ZW9mKCBjaGFyICogKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBzc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIHN0YXRlLT5pc194W2ldID0gYnVmZmVyOworICAgICAgICBidWZmZXIgKz0gZHNpemU7CisgICAgfQorCisgICAgYXNzZXJ0KCBidWZmZXIgPD0gYnVmZmVyX2VuZCApOworCisgICAgaWN2UnVzc2VsKCBzdGF0ZSApOworCisgICAgc3RhdGUtPmVudGVyX3ggPSAoc3RhdGUtPmVuZF94KSsrOworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2RmluZEJhc2ljVmFyaWFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDdlN0YXR1cworaWN2RmluZEJhc2ljVmFyaWFibGVzKCBmbG9hdCAqKmNvc3QsIGNoYXIgKippc194LAorICAgICAgICAgICAgICAgICAgICAgICBDdk5vZGUxRCAqIHUsIEN2Tm9kZTFEICogdiwgaW50IHNzaXplLCBpbnQgZHNpemUgKQoreworICAgIGludCBpLCBqLCBmb3VuZDsKKyAgICBpbnQgdV9jZm91bmQsIHZfY2ZvdW5kOworICAgIEN2Tm9kZTFEIHUwX2hlYWQsIHUxX2hlYWQsICpjdXJfdSwgKnByZXZfdTsKKyAgICBDdk5vZGUxRCB2MF9oZWFkLCB2MV9oZWFkLCAqY3VyX3YsICpwcmV2X3Y7CisKKyAgICAvKiBpbml0aWFsaXplIHRoZSByb3dzIGxpc3QgKHUpIGFuZCB0aGUgY29sdW1ucyBsaXN0ICh2KSAqLworICAgIHUwX2hlYWQubmV4dCA9IHU7CisgICAgZm9yKCBpID0gMDsgaSA8IHNzaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgdVtpXS5uZXh0ID0gdSArIGkgKyAxOworICAgIH0KKyAgICB1W3NzaXplIC0gMV0ubmV4dCA9IDA7CisgICAgdTFfaGVhZC5uZXh0ID0gMDsKKworICAgIHYwX2hlYWQubmV4dCA9IHNzaXplID4gMSA/IHYgKyAxIDogMDsKKyAgICBmb3IoIGkgPSAxOyBpIDwgZHNpemU7IGkrKyApCisgICAgeworICAgICAgICB2W2ldLm5leHQgPSB2ICsgaSArIDE7CisgICAgfQorICAgIHZbZHNpemUgLSAxXS5uZXh0ID0gMDsKKyAgICB2MV9oZWFkLm5leHQgPSAwOworCisgICAgLyogdGhlcmUgYXJlIHNzaXplK2RzaXplIHZhcmlhYmxlcyBidXQgb25seSBzc2l6ZStkc2l6ZS0xIGluZGVwZW5kZW50IGVxdWF0aW9ucywKKyAgICAgICBzbyBzZXQgdlswXT0wICovCisgICAgdlswXS52YWwgPSAwOworICAgIHYxX2hlYWQubmV4dCA9IHY7CisgICAgdjFfaGVhZC5uZXh0LT5uZXh0ID0gMDsKKworICAgIC8qIGxvb3AgdW50aWwgYWxsIHZhcmlhYmxlcyBhcmUgZm91bmQgKi8KKyAgICB1X2Nmb3VuZCA9IHZfY2ZvdW5kID0gMDsKKyAgICB3aGlsZSggdV9jZm91bmQgPCBzc2l6ZSB8fCB2X2Nmb3VuZCA8IGRzaXplICkKKyAgICB7CisgICAgICAgIGZvdW5kID0gMDsKKyAgICAgICAgaWYoIHZfY2ZvdW5kIDwgZHNpemUgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBsb29wIG92ZXIgYWxsIG1hcmtlZCBjb2x1bW5zICovCisgICAgICAgICAgICBwcmV2X3YgPSAmdjFfaGVhZDsKKworICAgICAgICAgICAgZm9yKCBmb3VuZCB8PSAoY3VyX3YgPSB2MV9oZWFkLm5leHQpICE9IDA7IGN1cl92ICE9IDA7IGN1cl92ID0gY3VyX3YtPm5leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IGN1cl92X3ZhbCA9IGN1cl92LT52YWw7CisKKyAgICAgICAgICAgICAgICBqID0gKGludCkoY3VyX3YgLSB2KTsKKyAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSB2YXJpYWJsZXMgaW4gY29sdW1uIGogKi8KKyAgICAgICAgICAgICAgICBwcmV2X3UgPSAmdTBfaGVhZDsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cl91ID0gdTBfaGVhZC5uZXh0OyBjdXJfdSAhPSAwOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpID0gKGludCkoY3VyX3UgLSB1KTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGlzX3hbaV1bal0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIHVbaV0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl91LT52YWwgPSBjb3N0W2ldW2pdIC0gY3VyX3ZfdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uYW5kIGFkZCBpdCB0byB0aGUgbWFya2VkIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfdS0+bmV4dCA9IGN1cl91LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3UtPm5leHQgPSB1MV9oZWFkLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1MV9oZWFkLm5leHQgPSBjdXJfdTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl91ID0gcHJldl91LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl91ID0gY3VyX3U7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdSA9IGN1cl91LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZfdi0+bmV4dCA9IGN1cl92LT5uZXh0OworICAgICAgICAgICAgICAgIHZfY2ZvdW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdV9jZm91bmQgPCBzc2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGxvb3Agb3ZlciBhbGwgbWFya2VkIHJvd3MgKi8KKyAgICAgICAgICAgIHByZXZfdSA9ICZ1MV9oZWFkOworICAgICAgICAgICAgZm9yKCBmb3VuZCB8PSAoY3VyX3UgPSB1MV9oZWFkLm5leHQpICE9IDA7IGN1cl91ICE9IDA7IGN1cl91ID0gY3VyX3UtPm5leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IGN1cl91X3ZhbCA9IGN1cl91LT52YWw7CisgICAgICAgICAgICAgICAgZmxvYXQgKl9jb3N0OworICAgICAgICAgICAgICAgIGNoYXIgKl9pc194OworCisgICAgICAgICAgICAgICAgaSA9IChpbnQpKGN1cl91IC0gdSk7CisgICAgICAgICAgICAgICAgX2Nvc3QgPSBjb3N0W2ldOworICAgICAgICAgICAgICAgIF9pc194ID0gaXNfeFtpXTsKKyAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSB2YXJpYWJsZXMgaW4gcm93cyBpICovCisgICAgICAgICAgICAgICAgcHJldl92ID0gJnYwX2hlYWQ7CisgICAgICAgICAgICAgICAgZm9yKCBjdXJfdiA9IHYwX2hlYWQubmV4dDsgY3VyX3YgIT0gMDsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IChpbnQpKGN1cl92IC0gdik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfaXNfeFtqXSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgdltqXSAqLworICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3YtPnZhbCA9IF9jb3N0W2pdIC0gY3VyX3VfdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgLyogLi4uYW5kIGFkZCBpdCB0byB0aGUgbWFya2VkIGxpc3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfdi0+bmV4dCA9IGN1cl92LT5uZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgY3VyX3YtPm5leHQgPSB2MV9oZWFkLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB2MV9oZWFkLm5leHQgPSBjdXJfdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl92ID0gcHJldl92LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldl92ID0gY3VyX3Y7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJfdiA9IGN1cl92LT5uZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByZXZfdS0+bmV4dCA9IGN1cl91LT5uZXh0OworICAgICAgICAgICAgICAgIHVfY2ZvdW5kKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggIWZvdW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIENWX05PVERFRklORURfRVJSOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdklzT3B0aW1hbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGZsb2F0CitpY3ZJc09wdGltYWwoIGZsb2F0ICoqY29zdCwgY2hhciAqKmlzX3gsCisgICAgICAgICAgICAgIEN2Tm9kZTFEICogdSwgQ3ZOb2RlMUQgKiB2LCBpbnQgc3NpemUsIGludCBkc2l6ZSwgQ3ZOb2RlMkQgKiBlbnRlcl94ICkKK3sKKyAgICBmbG9hdCBkZWx0YSwgbWluX2RlbHRhID0gQ1ZfRU1EX0lORjsKKyAgICBpbnQgaSwgaiwgbWluX2kgPSAwLCBtaW5faiA9IDA7CisKKyAgICAvKiBmaW5kIHRoZSBtaW5pbWFsIGNpai11aS12aiBvdmVyIGFsbCBpLGogKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgc3NpemU7IGkrKyApCisgICAgeworICAgICAgICBmbG9hdCB1X3ZhbCA9IHVbaV0udmFsOworICAgICAgICBmbG9hdCAqX2Nvc3QgPSBjb3N0W2ldOworICAgICAgICBjaGFyICpfaXNfeCA9IGlzX3hbaV07CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRzaXplOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIV9pc194W2pdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZWx0YSA9IF9jb3N0W2pdIC0gdV92YWwgLSB2W2pdLnZhbDsKKyAgICAgICAgICAgICAgICBpZiggbWluX2RlbHRhID4gZGVsdGEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2RlbHRhID0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgIG1pbl9pID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbWluX2ogPSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudGVyX3gtPmkgPSBtaW5faTsKKyAgICBlbnRlcl94LT5qID0gbWluX2o7CisKKyAgICByZXR1cm4gbWluX2RlbHRhOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdk5ld1NvbHV0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEN2U3RhdHVzCitpY3ZOZXdTb2x1dGlvbiggQ3ZFTURTdGF0ZSAqIHN0YXRlICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBtaW5fdmFsID0gQ1ZfRU1EX0lORjsKKyAgICBpbnQgc3RlcHM7CisgICAgQ3ZOb2RlMkQgaGVhZCwgKmN1cl94LCAqbmV4dF94LCAqbGVhdmVfeCA9IDA7CisgICAgQ3ZOb2RlMkQgKmVudGVyX3ggPSBzdGF0ZS0+ZW50ZXJfeDsKKyAgICBDdk5vZGUyRCAqKmxvb3AgPSBzdGF0ZS0+bG9vcDsKKworICAgIC8qIGVudGVyIHRoZSBuZXcgYmFzaWMgdmFyaWFibGUgKi8KKyAgICBpID0gZW50ZXJfeC0+aTsKKyAgICBqID0gZW50ZXJfeC0+ajsKKyAgICBzdGF0ZS0+aXNfeFtpXVtqXSA9IDE7CisgICAgZW50ZXJfeC0+bmV4dFswXSA9IHN0YXRlLT5yb3dzX3hbaV07CisgICAgZW50ZXJfeC0+bmV4dFsxXSA9IHN0YXRlLT5jb2xzX3hbal07CisgICAgZW50ZXJfeC0+dmFsID0gMDsKKyAgICBzdGF0ZS0+cm93c194W2ldID0gZW50ZXJfeDsKKyAgICBzdGF0ZS0+Y29sc194W2pdID0gZW50ZXJfeDsKKworICAgIC8qIGZpbmQgYSBjaGFpbiByZWFjdGlvbiAqLworICAgIHN0ZXBzID0gaWN2RmluZExvb3AoIHN0YXRlICk7CisKKyAgICBpZiggc3RlcHMgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9OT1RERUZJTkVEX0VSUjsKKworICAgIC8qIGZpbmQgdGhlIGxhcmdlc3QgdmFsdWUgaW4gdGhlIGxvb3AgKi8KKyAgICBmb3IoIGkgPSAxOyBpIDwgc3RlcHM7IGkgKz0gMiApCisgICAgeworICAgICAgICBmbG9hdCB0ZW1wID0gbG9vcFtpXS0+dmFsOworCisgICAgICAgIGlmKCBtaW5fdmFsID4gdGVtcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlYXZlX3ggPSBsb29wW2ldOworICAgICAgICAgICAgbWluX3ZhbCA9IHRlbXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1cGRhdGUgdGhlIGxvb3AgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgc3RlcHM7IGkgKz0gMiApCisgICAgeworICAgICAgICBmbG9hdCB0ZW1wMCA9IGxvb3BbaV0tPnZhbCArIG1pbl92YWw7CisgICAgICAgIGZsb2F0IHRlbXAxID0gbG9vcFtpICsgMV0tPnZhbCAtIG1pbl92YWw7CisKKyAgICAgICAgbG9vcFtpXS0+dmFsID0gdGVtcDA7CisgICAgICAgIGxvb3BbaSArIDFdLT52YWwgPSB0ZW1wMTsKKyAgICB9CisKKyAgICAvKiByZW1vdmUgdGhlIGxlYXZpbmcgYmFzaWMgdmFyaWFibGUgKi8KKyAgICBpID0gbGVhdmVfeC0+aTsKKyAgICBqID0gbGVhdmVfeC0+ajsKKyAgICBzdGF0ZS0+aXNfeFtpXVtqXSA9IDA7CisKKyAgICBoZWFkLm5leHRbMF0gPSBzdGF0ZS0+cm93c194W2ldOworICAgIGN1cl94ID0gJmhlYWQ7CisgICAgd2hpbGUoIChuZXh0X3ggPSBjdXJfeC0+bmV4dFswXSkgIT0gbGVhdmVfeCApCisgICAgeworICAgICAgICBjdXJfeCA9IG5leHRfeDsKKyAgICAgICAgYXNzZXJ0KCBjdXJfeCApOworICAgIH0KKyAgICBjdXJfeC0+bmV4dFswXSA9IG5leHRfeC0+bmV4dFswXTsKKyAgICBzdGF0ZS0+cm93c194W2ldID0gaGVhZC5uZXh0WzBdOworCisgICAgaGVhZC5uZXh0WzFdID0gc3RhdGUtPmNvbHNfeFtqXTsKKyAgICBjdXJfeCA9ICZoZWFkOworICAgIHdoaWxlKCAobmV4dF94ID0gY3VyX3gtPm5leHRbMV0pICE9IGxlYXZlX3ggKQorICAgIHsKKyAgICAgICAgY3VyX3ggPSBuZXh0X3g7CisgICAgICAgIGFzc2VydCggY3VyX3ggKTsKKyAgICB9CisgICAgY3VyX3gtPm5leHRbMV0gPSBuZXh0X3gtPm5leHRbMV07CisgICAgc3RhdGUtPmNvbHNfeFtqXSA9IGhlYWQubmV4dFsxXTsKKworICAgIC8qIHNldCBlbnRlcl94IHRvIGJlIHRoZSBuZXcgZW1wdHkgc2xvdCAqLworICAgIHN0YXRlLT5lbnRlcl94ID0gbGVhdmVfeDsKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZGaW5kTG9vcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludAoraWN2RmluZExvb3AoIEN2RU1EU3RhdGUgKiBzdGF0ZSApCit7CisgICAgaW50IGksIHN0ZXBzID0gMTsKKyAgICBDdk5vZGUyRCAqbmV3X3g7CisgICAgQ3ZOb2RlMkQgKipsb29wID0gc3RhdGUtPmxvb3A7CisgICAgQ3ZOb2RlMkQgKmVudGVyX3ggPSBzdGF0ZS0+ZW50ZXJfeCwgKl94ID0gc3RhdGUtPl94OworICAgIGNoYXIgKmlzX3VzZWQgPSBzdGF0ZS0+aXNfdXNlZDsKKworICAgIG1lbXNldCggaXNfdXNlZCwgMCwgc3RhdGUtPnNzaXplICsgc3RhdGUtPmRzaXplICk7CisKKyAgICBuZXdfeCA9IGxvb3BbMF0gPSBlbnRlcl94OworICAgIGlzX3VzZWRbZW50ZXJfeCAtIF94XSA9IDE7CisgICAgc3RlcHMgPSAxOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKCAoc3RlcHMgJiAxKSA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZmluZCBhbiB1bnVzZWQgeCBpbiB0aGUgcm93ICovCisgICAgICAgICAgICBuZXdfeCA9IHN0YXRlLT5yb3dzX3hbbmV3X3gtPmldOworICAgICAgICAgICAgd2hpbGUoIG5ld194ICE9IDAgJiYgaXNfdXNlZFtuZXdfeCAtIF94XSApCisgICAgICAgICAgICAgICAgbmV3X3ggPSBuZXdfeC0+bmV4dFswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGZpbmQgYW4gdW51c2VkIHggaW4gdGhlIGNvbHVtbiwgb3IgdGhlIGVudGVyaW5nIHggKi8KKyAgICAgICAgICAgIG5ld194ID0gc3RhdGUtPmNvbHNfeFtuZXdfeC0+al07CisgICAgICAgICAgICB3aGlsZSggbmV3X3ggIT0gMCAmJiBpc191c2VkW25ld194IC0gX3hdICYmIG5ld194ICE9IGVudGVyX3ggKQorICAgICAgICAgICAgICAgIG5ld194ID0gbmV3X3gtPm5leHRbMV07CisgICAgICAgICAgICBpZiggbmV3X3ggPT0gZW50ZXJfeCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggbmV3X3ggIT0gMCApICAgICAgICAvKiBmb3VuZCB0aGUgbmV4dCB4ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGFkZCB4IHRvIHRoZSBsb29wICovCisgICAgICAgICAgICBsb29wW3N0ZXBzKytdID0gbmV3X3g7CisgICAgICAgICAgICBpc191c2VkW25ld194IC0gX3hdID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAvKiBkaWRuJ3QgZmluZCB0aGUgbmV4dCB4ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGJhY2t0cmFjayAqLworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpID0gc3RlcHMgJiAxOworICAgICAgICAgICAgICAgIG5ld194ID0gbG9vcFtzdGVwcyAtIDFdOworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdfeCA9IG5ld194LT5uZXh0W2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggbmV3X3ggIT0gMCAmJiBpc191c2VkW25ld194IC0gX3hdICk7CisKKyAgICAgICAgICAgICAgICBpZiggbmV3X3ggPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpc191c2VkW2xvb3BbLS1zdGVwc10gLSBfeF0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlKCBuZXdfeCA9PSAwICYmIHN0ZXBzID4gMCApOworCisgICAgICAgICAgICBpc191c2VkW2xvb3Bbc3RlcHMgLSAxXSAtIF94XSA9IDA7CisgICAgICAgICAgICBsb29wW3N0ZXBzIC0gMV0gPSBuZXdfeDsKKyAgICAgICAgICAgIGlzX3VzZWRbbmV3X3ggLSBfeF0gPSAxOworICAgICAgICB9CisgICAgfQorICAgIHdoaWxlKCBzdGVwcyA+IDAgKTsKKworICAgIHJldHVybiBzdGVwczsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZSdXNzZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZAoraWN2UnVzc2VsKCBDdkVNRFN0YXRlICogc3RhdGUgKQoreworICAgIGludCBpLCBqLCBtaW5faSA9IC0xLCBtaW5faiA9IC0xOworICAgIGZsb2F0IG1pbl9kZWx0YSwgZGlmZjsKKyAgICBDdk5vZGUxRCB1X2hlYWQsICpjdXJfdSwgKnByZXZfdTsKKyAgICBDdk5vZGUxRCB2X2hlYWQsICpjdXJfdiwgKnByZXZfdjsKKyAgICBDdk5vZGUxRCAqcHJldl91X21pbl9pID0gMCwgKnByZXZfdl9taW5faiA9IDAsICpyZW1lbWJlcjsKKyAgICBDdk5vZGUxRCAqdSA9IHN0YXRlLT51LCAqdiA9IHN0YXRlLT52OworICAgIGludCBzc2l6ZSA9IHN0YXRlLT5zc2l6ZSwgZHNpemUgPSBzdGF0ZS0+ZHNpemU7CisgICAgZmxvYXQgZXBzID0gQ1ZfRU1EX0VQUyAqIHN0YXRlLT5tYXhfY29zdDsKKyAgICBmbG9hdCAqKmNvc3QgPSBzdGF0ZS0+Y29zdDsKKyAgICBmbG9hdCAqKmRlbHRhID0gc3RhdGUtPmRlbHRhOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgcm93cyBsaXN0ICh1ciksIGFuZCB0aGUgY29sdW1ucyBsaXN0ICh2cikgKi8KKyAgICB1X2hlYWQubmV4dCA9IHU7CisgICAgZm9yKCBpID0gMDsgaSA8IHNzaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgdVtpXS5uZXh0ID0gdSArIGkgKyAxOworICAgIH0KKyAgICB1W3NzaXplIC0gMV0ubmV4dCA9IDA7CisKKyAgICB2X2hlYWQubmV4dCA9IHY7CisgICAgZm9yKCBpID0gMDsgaSA8IGRzaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgdltpXS52YWwgPSAtQ1ZfRU1EX0lORjsKKyAgICAgICAgdltpXS5uZXh0ID0gdiArIGkgKyAxOworICAgIH0KKyAgICB2W2RzaXplIC0gMV0ubmV4dCA9IDA7CisKKyAgICAvKiBmaW5kIHRoZSBtYXhpbXVtIHJvdyBhbmQgY29sdW1uIHZhbHVlcyAodXJbaV0gYW5kIHZyW2pdKSAqLworICAgIGZvciggaSA9IDA7IGkgPCBzc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIGZsb2F0IHVfdmFsID0gLUNWX0VNRF9JTkY7CisgICAgICAgIGZsb2F0ICpjb3N0X3JvdyA9IGNvc3RbaV07CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRzaXplOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB0ZW1wID0gY29zdF9yb3dbal07CisKKyAgICAgICAgICAgIGlmKCB1X3ZhbCA8IHRlbXAgKQorICAgICAgICAgICAgICAgIHVfdmFsID0gdGVtcDsKKyAgICAgICAgICAgIGlmKCB2W2pdLnZhbCA8IHRlbXAgKQorICAgICAgICAgICAgICAgIHZbal0udmFsID0gdGVtcDsKKyAgICAgICAgfQorICAgICAgICB1W2ldLnZhbCA9IHVfdmFsOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdGhlIGRlbHRhIG1hdHJpeCAqLworICAgIGZvciggaSA9IDA7IGkgPCBzc2l6ZTsgaSsrICkKKyAgICB7CisgICAgICAgIGZsb2F0IHVfdmFsID0gdVtpXS52YWw7CisgICAgICAgIGZsb2F0ICpkZWx0YV9yb3cgPSBkZWx0YVtpXTsKKyAgICAgICAgZmxvYXQgKmNvc3Rfcm93ID0gY29zdFtpXTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgZHNpemU7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRlbHRhX3Jvd1tqXSA9IGNvc3Rfcm93W2pdIC0gdV92YWwgLSB2W2pdLnZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZpbmQgdGhlIGJhc2ljIHZhcmlhYmxlcyAqLworICAgIGRvCisgICAgeworICAgICAgICAvKiBmaW5kIHRoZSBzbWFsbGVzdCBkZWx0YVtpXVtqXSAqLworICAgICAgICBtaW5faSA9IC0xOworICAgICAgICBtaW5fZGVsdGEgPSBDVl9FTURfSU5GOworICAgICAgICBwcmV2X3UgPSAmdV9oZWFkOworICAgICAgICBmb3IoIGN1cl91ID0gdV9oZWFkLm5leHQ7IGN1cl91ICE9IDA7IGN1cl91ID0gY3VyX3UtPm5leHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpID0gKGludCkoY3VyX3UgLSB1KTsKKyAgICAgICAgICAgIGZsb2F0ICpkZWx0YV9yb3cgPSBkZWx0YVtpXTsKKworICAgICAgICAgICAgcHJldl92ID0gJnZfaGVhZDsKKyAgICAgICAgICAgIGZvciggY3VyX3YgPSB2X2hlYWQubmV4dDsgY3VyX3YgIT0gMDsgY3VyX3YgPSBjdXJfdi0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaiA9IChpbnQpKGN1cl92IC0gdik7CisgICAgICAgICAgICAgICAgaWYoIG1pbl9kZWx0YSA+IGRlbHRhX3Jvd1tqXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5fZGVsdGEgPSBkZWx0YV9yb3dbal07CisgICAgICAgICAgICAgICAgICAgIG1pbl9pID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbWluX2ogPSBqOworICAgICAgICAgICAgICAgICAgICBwcmV2X3VfbWluX2kgPSBwcmV2X3U7CisgICAgICAgICAgICAgICAgICAgIHByZXZfdl9taW5faiA9IHByZXZfdjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldl92ID0gY3VyX3Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X3UgPSBjdXJfdTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtaW5faSA8IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyogYWRkIHhbbWluX2ldW21pbl9qXSB0byB0aGUgYmFzaXMsIGFuZCBhZGp1c3Qgc3VwcGxpZXMgYW5kIGNvc3QgKi8KKyAgICAgICAgcmVtZW1iZXIgPSBwcmV2X3VfbWluX2ktPm5leHQ7CisgICAgICAgIGljdkFkZEJhc2ljVmFyaWFibGUoIHN0YXRlLCBtaW5faSwgbWluX2osIHByZXZfdV9taW5faSwgcHJldl92X21pbl9qLCAmdV9oZWFkICk7CisKKyAgICAgICAgLyogdXBkYXRlIHRoZSBuZWNlc3NhcnkgZGVsdGFbXVtdICovCisgICAgICAgIGlmKCByZW1lbWJlciA9PSBwcmV2X3VfbWluX2ktPm5leHQgKSAgICAvKiBsaW5lIG1pbl9pIHdhcyBkZWxldGVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggY3VyX3YgPSB2X2hlYWQubmV4dDsgY3VyX3YgIT0gMDsgY3VyX3YgPSBjdXJfdi0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaiA9IChpbnQpKGN1cl92IC0gdik7CisgICAgICAgICAgICAgICAgaWYoIGN1cl92LT52YWwgPT0gY29zdFttaW5faV1bal0gKSAgICAgIC8qIGNvbHVtbiBqIG5lZWRzIHVwZGF0aW5nICovCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYXhfdmFsID0gLUNWX0VNRF9JTkY7CisKKyAgICAgICAgICAgICAgICAgICAgLyogZmluZCB0aGUgbmV3IG1heGltdW0gdmFsdWUgaW4gdGhlIGNvbHVtbiAqLworICAgICAgICAgICAgICAgICAgICBmb3IoIGN1cl91ID0gdV9oZWFkLm5leHQ7IGN1cl91ICE9IDA7IGN1cl91ID0gY3VyX3UtPm5leHQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ZW1wID0gY29zdFtjdXJfdSAtIHVdW2pdOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWF4X3ZhbCA8IHRlbXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSB0ZW1wOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogaWYgbmVlZGVkLCBhZGp1c3QgdGhlIHJlbGV2YW50IGRlbHRhWypdW2pdICovCisgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBtYXhfdmFsIC0gY3VyX3YtPnZhbDsKKyAgICAgICAgICAgICAgICAgICAgY3VyX3YtPnZhbCA9IG1heF92YWw7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKCBkaWZmICkgPCBlcHMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGN1cl91ID0gdV9oZWFkLm5leHQ7IGN1cl91ICE9IDA7IGN1cl91ID0gY3VyX3UtPm5leHQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhW2N1cl91IC0gdV1bal0gKz0gZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAvKiBjb2x1bW4gbWluX2ogd2FzIGRlbGV0ZWQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBjdXJfdSA9IHVfaGVhZC5uZXh0OyBjdXJfdSAhPSAwOyBjdXJfdSA9IGN1cl91LT5uZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpID0gKGludCkoY3VyX3UgLSB1KTsKKyAgICAgICAgICAgICAgICBpZiggY3VyX3UtPnZhbCA9PSBjb3N0W2ldW21pbl9qXSApICAgICAgLyogcm93IGkgbmVlZHMgdXBkYXRpbmcgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heF92YWwgPSAtQ1ZfRU1EX0lORjsKKworICAgICAgICAgICAgICAgICAgICAvKiBmaW5kIHRoZSBuZXcgbWF4aW11bSB2YWx1ZSBpbiB0aGUgcm93ICovCisgICAgICAgICAgICAgICAgICAgIGZvciggY3VyX3YgPSB2X2hlYWQubmV4dDsgY3VyX3YgIT0gMDsgY3VyX3YgPSBjdXJfdi0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSBjb3N0W2ldW2N1cl92IC0gdl07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXhfdmFsIDwgdGVtcCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IHRlbXA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBpZiBuZWVkZWQsIGFkanVzdCB0aGUgcmVsZXZhbnQgZGVsdGFbaV1bKl0gKi8KKyAgICAgICAgICAgICAgICAgICAgZGlmZiA9IG1heF92YWwgLSBjdXJfdS0+dmFsOworICAgICAgICAgICAgICAgICAgICBjdXJfdS0+dmFsID0gbWF4X3ZhbDsKKworICAgICAgICAgICAgICAgICAgICBpZiggZmFicyggZGlmZiApIDwgZXBzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBjdXJfdiA9IHZfaGVhZC5uZXh0OyBjdXJfdiAhPSAwOyBjdXJfdiA9IGN1cl92LT5uZXh0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVtpXVtjdXJfdiAtIHZdICs9IGRpZmY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoIHVfaGVhZC5uZXh0ICE9IDAgfHwgdl9oZWFkLm5leHQgIT0gMCApOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZBZGRCYXNpY1ZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkCitpY3ZBZGRCYXNpY1ZhcmlhYmxlKCBDdkVNRFN0YXRlICogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX2ksIGludCBtaW5faiwKKyAgICAgICAgICAgICAgICAgICAgIEN2Tm9kZTFEICogcHJldl91X21pbl9pLCBDdk5vZGUxRCAqIHByZXZfdl9taW5faiwgQ3ZOb2RlMUQgKiB1X2hlYWQgKQoreworICAgIGZsb2F0IHRlbXA7CisgICAgQ3ZOb2RlMkQgKmVuZF94ID0gc3RhdGUtPmVuZF94OworCisgICAgaWYoIHN0YXRlLT5zW21pbl9pXSA8IHN0YXRlLT5kW21pbl9qXSArIHN0YXRlLT53ZWlnaHQgKiBDVl9FTURfRVBTICkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VwcGx5IGV4aGF1c3RlZCAqLworICAgICAgICB0ZW1wID0gc3RhdGUtPnNbbWluX2ldOworICAgICAgICBzdGF0ZS0+c1ttaW5faV0gPSAwOworICAgICAgICBzdGF0ZS0+ZFttaW5fal0gLT0gdGVtcDsKKyAgICB9CisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbWFuZCBleGhhdXN0ZWQgKi8KKyAgICB7CisgICAgICAgIHRlbXAgPSBzdGF0ZS0+ZFttaW5fal07CisgICAgICAgIHN0YXRlLT5kW21pbl9qXSA9IDA7CisgICAgICAgIHN0YXRlLT5zW21pbl9pXSAtPSB0ZW1wOworICAgIH0KKworICAgIC8qIHgobWluX2ksbWluX2opIGlzIGEgYmFzaWMgdmFyaWFibGUgKi8KKyAgICBzdGF0ZS0+aXNfeFttaW5faV1bbWluX2pdID0gMTsKKworICAgIGVuZF94LT52YWwgPSB0ZW1wOworICAgIGVuZF94LT5pID0gbWluX2k7CisgICAgZW5kX3gtPmogPSBtaW5fajsKKyAgICBlbmRfeC0+bmV4dFswXSA9IHN0YXRlLT5yb3dzX3hbbWluX2ldOworICAgIGVuZF94LT5uZXh0WzFdID0gc3RhdGUtPmNvbHNfeFttaW5fal07CisgICAgc3RhdGUtPnJvd3NfeFttaW5faV0gPSBlbmRfeDsKKyAgICBzdGF0ZS0+Y29sc194W21pbl9qXSA9IGVuZF94OworICAgIHN0YXRlLT5lbmRfeCA9IGVuZF94ICsgMTsKKworICAgIC8qIGRlbGV0ZSBzdXBwbHkgcm93IG9ubHkgaWYgdGhlIGVtcHR5LCBhbmQgaWYgbm90IGxhc3Qgcm93ICovCisgICAgaWYoIHN0YXRlLT5zW21pbl9pXSA9PSAwICYmIHVfaGVhZC0+bmV4dC0+bmV4dCAhPSAwICkKKyAgICAgICAgcHJldl91X21pbl9pLT5uZXh0ID0gcHJldl91X21pbl9pLT5uZXh0LT5uZXh0OyAgLyogcmVtb3ZlIHJvdyBmcm9tIGxpc3QgKi8KKyAgICBlbHNlCisgICAgICAgIHByZXZfdl9taW5fai0+bmV4dCA9IHByZXZfdl9taW5fai0+bmV4dC0+bmV4dDsgIC8qIHJlbW92ZSBjb2x1bW4gZnJvbSBsaXN0ICovCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YW5kYXJkICBtZXRyaWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGZsb2F0CitpY3ZEaXN0TDEoIGNvbnN0IGZsb2F0ICp4LCBjb25zdCBmbG9hdCAqeSwgdm9pZCAqdXNlcl9wYXJhbSApCit7CisgICAgaW50IGksIGRpbXMgPSAoaW50KShzaXplX3QpdXNlcl9wYXJhbTsKKyAgICBkb3VibGUgcyA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0ID0geFtpXSAtIHlbaV07CisKKyAgICAgICAgcyArPSBmYWJzKCB0ICk7CisgICAgfQorICAgIHJldHVybiAoZmxvYXQpczsKK30KKworc3RhdGljIGZsb2F0CitpY3ZEaXN0TDIoIGNvbnN0IGZsb2F0ICp4LCBjb25zdCBmbG9hdCAqeSwgdm9pZCAqdXNlcl9wYXJhbSApCit7CisgICAgaW50IGksIGRpbXMgPSAoaW50KShzaXplX3QpdXNlcl9wYXJhbTsKKyAgICBkb3VibGUgcyA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0ID0geFtpXSAtIHlbaV07CisKKyAgICAgICAgcyArPSB0ICogdDsKKyAgICB9CisgICAgcmV0dXJuIGN2U3FydCggKGZsb2F0KXMgKTsKK30KKworc3RhdGljIGZsb2F0CitpY3ZEaXN0QyggY29uc3QgZmxvYXQgKngsIGNvbnN0IGZsb2F0ICp5LCB2b2lkICp1c2VyX3BhcmFtICkKK3sKKyAgICBpbnQgaSwgZGltcyA9IChpbnQpKHNpemVfdCl1c2VyX3BhcmFtOworICAgIGRvdWJsZSBzID0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHQgPSBmYWJzKCB4W2ldIC0geVtpXSApOworCisgICAgICAgIGlmKCBzIDwgdCApCisgICAgICAgICAgICBzID0gdDsKKyAgICB9CisgICAgcmV0dXJuIChmbG9hdClzOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2ZmVhdHVyZXNlbGVjdC5jcHAgYi9jdi9zcmMvY3ZmZWF0dXJlc2VsZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2RhM2ZjCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2ZmVhdHVyZXNlbGVjdC5jcHAKQEAgLTAsMCArMSwyMzQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisjZGVmaW5lICBjbXBfZmVhdHVyZXMoIGYxLCBmMiApICAoKihmMSkgPiAqKGYyKSkKKworc3RhdGljIENWX0lNUExFTUVOVF9RU09SVCggaWN2U29ydEZlYXR1cmVzLCBpbnQgKiwgY21wX2ZlYXR1cmVzICkKKworQ1ZfSU1QTCB2b2lkCitjdkdvb2RGZWF0dXJlc1RvVHJhY2soIGNvbnN0IHZvaWQqIGltYWdlLCB2b2lkKiBlaWdJbWFnZSwgdm9pZCogdGVtcEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGNvcm5lcnMsIGludCAqY29ybmVyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhbGl0eV9sZXZlbCwgZG91YmxlIG1pbl9kaXN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbWFza0ltYWdlLCBpbnQgYmxvY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHVzZV9oYXJyaXMsIGRvdWJsZSBoYXJyaXNfayApCit7CisgICAgQ3ZNYXQqIF9laWdJbWcgPSAwOworICAgIEN2TWF0KiBfdG1wSW1nID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2R29vZEZlYXR1cmVzVG9UcmFjayIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBtYXhfdmFsID0gMDsKKyAgICBpbnQgbWF4X2NvdW50ID0gMDsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGludCB4LCB5LCBpLCBrID0gMDsKKyAgICBpbnQgbWluX2Rpc3Q7CisgICAgaW50IGVpZ19zdGVwLCB0bXBfc3RlcDsKKworICAgIC8qIHdoZW4gc2VsZWN0aW5nIHBvaW50cywgdXNlIGludGVnZXIgY29vcmRpbmF0ZXMgKi8KKyAgICBDdlBvaW50ICpwdHIgPSAoQ3ZQb2ludCAqKSBjb3JuZXJzOworCisgICAgLyogcHJvY2VzcyBmbG9hdGluZy1wb2ludCBpbWFnZXMgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljcyAqLworICAgIGludCAqZWlnX2RhdGEgPSAwOworICAgIGludCAqdG1wX2RhdGEgPSAwOworICAgIGludCAqKnB0cl9kYXRhID0gMDsKKyAgICB1Y2hhciAqbWFza19kYXRhID0gMDsKKyAgICBpbnQgIG1hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpbnQgICAgY29pMSA9IDAsIGNvaTIgPSAwLCBjb2kzID0gMDsKKyAgICBDdk1hdCAgc3R1YiwgKmltZyA9IChDdk1hdCopaW1hZ2U7CisgICAgQ3ZNYXQgIGVpZ19zdHViLCAqZWlnID0gKEN2TWF0KillaWdJbWFnZTsKKyAgICBDdk1hdCAgdG1wX3N0dWIsICp0bXAgPSAoQ3ZNYXQqKXRlbXBJbWFnZTsKKyAgICBDdk1hdCAgbWFza19zdHViLCAqbWFzayA9IChDdk1hdCopbWFza0ltYWdlOworCisgICAgaWYoIGNvcm5lcl9jb3VudCApCisgICAgeworICAgICAgICBtYXhfY291bnQgPSAqY29ybmVyX2NvdW50OworICAgICAgICAqY29ybmVyX2NvdW50ID0gMDsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBpbWcgPSBjdkdldE1hdCggaW1nLCAmc3R1YiwgJmNvaTEgKSk7CisgICAgaWYoIGVpZyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBlaWcgPSBjdkdldE1hdCggZWlnLCAmZWlnX3N0dWIsICZjb2kyICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBfZWlnSW1nID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl8zMkZDMSApKTsKKyAgICAgICAgZWlnID0gX2VpZ0ltZzsKKyAgICB9CisKKyAgICBpZiggdG1wICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHRtcCA9IGN2R2V0TWF0KCB0bXAsICZ0bXBfc3R1YiwgJmNvaTMgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIF90bXBJbWcgPSBjdkNyZWF0ZU1hdCggaW1nLT5yb3dzLCBpbWctPmNvbHMsIENWXzMyRkMxICkpOworICAgICAgICB0bXAgPSBfdG1wSW1nOworICAgIH0KKworICAgIGlmKCBtYXNrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tfc3R1YiApKTsKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUiggbWFzayApKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwIHx8IGNvaTMgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX0NOKGltZy0+dHlwZSkgIT0gMSB8fAorICAgICAgICBDVl9NQVRfQ04oZWlnLT50eXBlKSAhPSAxIHx8CisgICAgICAgIENWX01BVF9DTih0bXAtPnR5cGUpICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgodG1wLT50eXBlKSAhPSBDVl8zMkYgfHwKKyAgICAgICAgQ1ZfTUFUX0RFUFRIKGVpZy0+dHlwZSkgIT0gQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggIWNvcm5lcnMgfHwgIWNvcm5lcl9jb3VudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIG1heF9jb3VudCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIm1heGltYWwgY29ybmVycyBudW1iZXIgaXMgbm9uIHBvc2l0aXZlIiApOworCisgICAgaWYoIHF1YWxpdHlfbGV2ZWwgPD0gMCB8fCBtaW5fZGlzdGFuY2UgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInF1YWxpdHkgbGV2ZWwgb3IgbWluIGRpc3RhbmNlIGFyZSBub24gcG9zaXRpdmUiICk7CisKKyAgICBpZiggdXNlX2hhcnJpcyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjdkNvcm5lckhhcnJpcyggaW1nLCBlaWcsIGJsb2NrX3NpemUsIDMsIGhhcnJpc19rICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBjdkNvcm5lck1pbkVpZ2VuVmFsKCBpbWcsIGVpZywgYmxvY2tfc2l6ZSwgMyApKTsKKyAgICB9CisgICAgQ1ZfQ0FMTCggY3ZNaW5NYXhMb2MoIGVpZywgMCwgJm1heF92YWwsIDAsIDAsIG1hc2sgKSk7CisgICAgQ1ZfQ0FMTCggY3ZUaHJlc2hvbGQoIGVpZywgZWlnLCBtYXhfdmFsICogcXVhbGl0eV9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgQ1ZfVEhSRVNIX1RPWkVSTyApKTsKKyAgICBDVl9DQUxMKCBjdkRpbGF0ZSggZWlnLCB0bXAgKSk7CisKKyAgICBtaW5fZGlzdCA9IGN2Um91bmQoIG1pbl9kaXN0YW5jZSAqIG1pbl9kaXN0YW5jZSApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggaW1nICk7CisgICAgcHRyX2RhdGEgPSAoaW50KiopKHRtcC0+ZGF0YS5wdHIpOworICAgIGVpZ19kYXRhID0gKGludCopKGVpZy0+ZGF0YS5wdHIpOworICAgIHRtcF9kYXRhID0gKGludCopKHRtcC0+ZGF0YS5wdHIpOworICAgIGlmKCBtYXNrICkKKyAgICB7CisgICAgICAgIG1hc2tfZGF0YSA9ICh1Y2hhciopKG1hc2stPmRhdGEucHRyKTsKKyAgICAgICAgbWFza19zdGVwID0gbWFzay0+c3RlcDsKKyAgICB9CisKKyAgICBlaWdfc3RlcCA9IGVpZy0+c3RlcCAvIHNpemVvZihlaWdfZGF0YVswXSk7CisgICAgdG1wX3N0ZXAgPSB0bXAtPnN0ZXAgLyBzaXplb2YodG1wX2RhdGFbMF0pOworCisgICAgLyogY29sbGVjdCBsaXN0IG9mIHBvaW50ZXJzIHRvIGZlYXR1cmVzIC0gcHV0IHRoZW0gaW50byB0ZW1wb3JhcnkgaW1hZ2UgKi8KKyAgICBmb3IoIHkgPSAxLCBrID0gMDsgeSA8IHNpemUuaGVpZ2h0IC0gMTsgeSsrICkKKyAgICB7CisgICAgICAgIGVpZ19kYXRhICs9IGVpZ19zdGVwOworICAgICAgICB0bXBfZGF0YSArPSB0bXBfc3RlcDsKKyAgICAgICAgbWFza19kYXRhICs9IG1hc2tfc3RlcDsKKworICAgICAgICBmb3IoIHggPSAxOyB4IDwgc2l6ZS53aWR0aCAtIDE7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBlaWdfZGF0YVt4XTsKKyAgICAgICAgICAgIGlmKCB2YWwgIT0gMCAmJiB2YWwgPT0gdG1wX2RhdGFbeF0gJiYgKCFtYXNrIHx8IG1hc2tfZGF0YVt4XSkgKQorICAgICAgICAgICAgICAgIHB0cl9kYXRhW2srK10gPSBlaWdfZGF0YSArIHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpY3ZTb3J0RmVhdHVyZXMoIHB0cl9kYXRhLCBrLCAwICk7CisKKyAgICAvKiBzZWxlY3QgdGhlIHN0cm9uZ2VzdCBmZWF0dXJlcyAqLworICAgIGZvciggaSA9IDA7IGkgPCBrOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGogPSBjb3VudCwgb2ZzID0gKGludCkoKHVjaGFyKikocHRyX2RhdGFbaV0pIC0gZWlnLT5kYXRhLnB0cik7CisgICAgICAgIHkgPSBvZnMgLyBlaWctPnN0ZXA7CisgICAgICAgIHggPSAob2ZzIC0geSAqIGVpZy0+c3RlcCkvc2l6ZW9mKGZsb2F0KTsKKworICAgICAgICBpZiggbWluX2Rpc3QgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjb3VudDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZHggPSB4IC0gcHRyW2pdLng7CisgICAgICAgICAgICAgICAgaW50IGR5ID0geSAtIHB0cltqXS55OworICAgICAgICAgICAgICAgIGludCBkaXN0ID0gZHggKiBkeCArIGR5ICogZHk7CisKKyAgICAgICAgICAgICAgICBpZiggZGlzdCA8IG1pbl9kaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggaiA9PSBjb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cltjb3VudF0ueCA9IHg7CisgICAgICAgICAgICBwdHJbY291bnRdLnkgPSB5OworICAgICAgICAgICAgaWYoICsrY291bnQgPj0gbWF4X2NvdW50ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBjb252ZXJ0IHBvaW50cyB0byBmbG9hdGluZy1wb2ludCBmb3JtYXQgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClwdHJbaV0ueCA8ICh1bnNpZ25lZClzaXplLndpZHRoICYmCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXB0cltpXS55IDwgKHVuc2lnbmVkKXNpemUuaGVpZ2h0ICk7CisKKyAgICAgICAgY29ybmVyc1tpXS54ID0gKGZsb2F0KXB0cltpXS54OworICAgICAgICBjb3JuZXJzW2ldLnkgPSAoZmxvYXQpcHRyW2ldLnk7CisgICAgfQorCisgICAgKmNvcm5lcl9jb3VudCA9IGNvdW50OworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJl9laWdJbWcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfdG1wSW1nICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2ZmlsdGVyLmNwcCBiL2N2L3NyYy9jdmZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk1ZmNjYQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmZpbHRlci5jcHAKQEAgLTAsMCArMSwyNzEwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZSBJbWFnZSBGaWx0ZXIKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBkZWZhdWx0X3hfZmlsdGVyX2Z1bmMoIGNvbnN0IHVjaGFyKiwgdWNoYXIqLCB2b2lkKiApCit7Cit9CisKK3N0YXRpYyB2b2lkIGRlZmF1bHRfeV9maWx0ZXJfZnVuYyggdWNoYXIqKiwgdWNoYXIqLCBpbnQsIGludCwgdm9pZCogKQoreworfQorCitDdkJhc2VJbWFnZUZpbHRlcjo6Q3ZCYXNlSW1hZ2VGaWx0ZXIoKQoreworICAgIG1pbl9kZXB0aCA9IENWXzhVOworICAgIGJ1ZmZlciA9IDA7CisgICAgcm93cyA9IDA7CisgICAgbWF4X3dpZHRoID0gMDsKKyAgICB4X2Z1bmMgPSBkZWZhdWx0X3hfZmlsdGVyX2Z1bmM7CisgICAgeV9mdW5jID0gZGVmYXVsdF95X2ZpbHRlcl9mdW5jOworfQorCisKK0N2QmFzZUltYWdlRmlsdGVyOjpDdkJhc2VJbWFnZUZpbHRlciggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwgQ3ZQb2ludCBfYW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlLCBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBtaW5fZGVwdGggPSBDVl84VTsKKyAgICBidWZmZXIgPSAwOworICAgIHJvd3MgPSAwOworICAgIG1heF93aWR0aCA9IDA7CisgICAgeF9mdW5jID0gZGVmYXVsdF94X2ZpbHRlcl9mdW5jOworICAgIHlfZnVuYyA9IGRlZmF1bHRfeV9maWx0ZXJfZnVuYzsKKworICAgIGluaXQoIF9tYXhfd2lkdGgsIF9zcmNfdHlwZSwgX2RzdF90eXBlLCBfaXNfc2VwYXJhYmxlLAorICAgICAgICAgIF9rc2l6ZSwgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7Cit9CisKKwordm9pZCBDdkJhc2VJbWFnZUZpbHRlcjo6Y2xlYXIoKQoreworICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIHJvd3MgPSAwOworfQorCisKK0N2QmFzZUltYWdlRmlsdGVyOjp+Q3ZCYXNlSW1hZ2VGaWx0ZXIoKQoreworICAgIGNsZWFyKCk7Cit9CisKKwordm9pZCBDdkJhc2VJbWFnZUZpbHRlcjo6Z2V0X3dvcmtfcGFyYW1zKCkKK3sKKyAgICBpbnQgbWluX3Jvd3MgPSBtYXhfa3kqMiArIDMsIHJvd3MgPSBNQVgobWluX3Jvd3MsMTApLCByb3dfc3o7CisgICAgaW50IHdpZHRoID0gbWF4X3dpZHRoLCB0cm93X3N6ID0gMDsKKworICAgIGlmKCBpc19zZXBhcmFibGUgKQorICAgIHsKKyAgICAgICAgaW50IG1heF9kZXB0aCA9IE1BWChDVl9NQVRfREVQVEgoc3JjX3R5cGUpLCBDVl9NQVRfREVQVEgoZHN0X3R5cGUpKTsKKyAgICAgICAgaW50IG1heF9jbiA9IE1BWChDVl9NQVRfQ04oc3JjX3R5cGUpLCBDVl9NQVRfQ04oZHN0X3R5cGUpKTsKKyAgICAgICAgbWF4X2RlcHRoID0gTUFYKCBtYXhfZGVwdGgsIG1pbl9kZXB0aCApOworICAgICAgICB3b3JrX3R5cGUgPSBDVl9NQUtFVFlQRSggbWF4X2RlcHRoLCBtYXhfY24gKTsKKyAgICAgICAgdHJvd19zeiA9IGN2QWxpZ24oIChtYXhfd2lkdGggKyBrc2l6ZS53aWR0aCAtIDEpKkNWX0VMRU1fU0laRShzcmNfdHlwZSksIEFMSUdOICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHdvcmtfdHlwZSA9IHNyY190eXBlOworICAgICAgICB3aWR0aCArPSBrc2l6ZS53aWR0aCAtIDE7CisgICAgfQorICAgIHJvd19zeiA9IGN2QWxpZ24oIHdpZHRoKkNWX0VMRU1fU0laRSh3b3JrX3R5cGUpLCBBTElHTiApOworICAgIGJ1Zl9zaXplID0gcm93cypyb3dfc3o7CisgICAgYnVmX3NpemUgPSBNSU4oIGJ1Zl9zaXplLCAxIDw8IDE2ICk7CisgICAgYnVmX3NpemUgPSBNQVgoIGJ1Zl9zaXplLCBtaW5fcm93cypyb3dfc3ogKTsKKyAgICBtYXhfcm93cyA9IChidWZfc2l6ZS9yb3dfc3opKjMgKyBtYXhfa3kqMiArIDg7CisgICAgYnVmX3NpemUgKz0gdHJvd19zejsKK30KKworCit2b2lkIEN2QmFzZUltYWdlRmlsdGVyOjppbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX2lzX3NlcGFyYWJsZSwgQ3ZTaXplIF9rc2l6ZSwgQ3ZQb2ludCBfYW5jaG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9ib3JkZXJfbW9kZSwgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJDdkJhc2VJbWFnZUZpbHRlcjo6aW5pdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0b3RhbF9idWZfc3osIHNyY19waXhfc3osIHJvd190YWJfc3osIGJzejsKKyAgICB1Y2hhciogcHRyOworCisgICAgaWYoICEoYnVmZmVyICYmIF9tYXhfd2lkdGggPD0gbWF4X3dpZHRoICYmIF9zcmNfdHlwZSA9PSBzcmNfdHlwZSAmJgorICAgICAgICBfZHN0X3R5cGUgPT0gZHN0X3R5cGUgJiYgX2lzX3NlcGFyYWJsZSA9PSBpc19zZXBhcmFibGUgJiYKKyAgICAgICAgX2tzaXplLndpZHRoID09IGtzaXplLndpZHRoICYmIF9rc2l6ZS5oZWlnaHQgPT0ga3NpemUuaGVpZ2h0ICYmCisgICAgICAgIF9hbmNob3IueCA9PSBhbmNob3IueCAmJiBfYW5jaG9yLnkgPT0gYW5jaG9yLnkpICkKKyAgICAgICAgY2xlYXIoKTsKKworICAgIGlzX3NlcGFyYWJsZSA9IF9pc19zZXBhcmFibGUgIT0gMDsKKyAgICBtYXhfd2lkdGggPSBfbWF4X3dpZHRoOyAvL01BWChfbWF4X3dpZHRoLF9rc2l6ZS53aWR0aCk7CisgICAgc3JjX3R5cGUgPSBDVl9NQVRfVFlQRShfc3JjX3R5cGUpOworICAgIGRzdF90eXBlID0gQ1ZfTUFUX1RZUEUoX2RzdF90eXBlKTsKKyAgICBrc2l6ZSA9IF9rc2l6ZTsKKyAgICBhbmNob3IgPSBfYW5jaG9yOworCisgICAgaWYoIGFuY2hvci54ID09IC0xICkKKyAgICAgICAgYW5jaG9yLnggPSBrc2l6ZS53aWR0aCAvIDI7CisgICAgaWYoIGFuY2hvci55ID09IC0xICkKKyAgICAgICAgYW5jaG9yLnkgPSBrc2l6ZS5oZWlnaHQgLyAyOworCisgICAgbWF4X2t5ID0gTUFYKCBhbmNob3IueSwga3NpemUuaGVpZ2h0IC0gYW5jaG9yLnkgLSAxICk7IAorICAgIGJvcmRlcl9tb2RlID0gX2JvcmRlcl9tb2RlOworICAgIGJvcmRlcl92YWx1ZSA9IF9ib3JkZXJfdmFsdWU7CisKKyAgICBpZigga3NpemUud2lkdGggPD0gMCB8fCBrc2l6ZS5oZWlnaHQgPD0gMCB8fAorICAgICAgICAodW5zaWduZWQpYW5jaG9yLnggPj0gKHVuc2lnbmVkKWtzaXplLndpZHRoIHx8CisgICAgICAgICh1bnNpZ25lZClhbmNob3IueSA+PSAodW5zaWduZWQpa3NpemUuaGVpZ2h0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbnZhbGlkIGtlcm5lbCBzaXplIGFuZC9vciBhbmNob3IgcG9zaXRpb24iICk7CisKKyAgICBpZiggYm9yZGVyX21vZGUgIT0gSVBMX0JPUkRFUl9DT05TVEFOVCAmJiBib3JkZXJfbW9kZSAhPSBJUExfQk9SREVSX1JFUExJQ0FURSAmJgorICAgICAgICBib3JkZXJfbW9kZSAhPSBJUExfQk9SREVSX1JFRkxFQ1QgJiYgYm9yZGVyX21vZGUgIT0gSVBMX0JPUkRFUl9SRUZMRUNUXzEwMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkL3Vuc3VwcG9ydGVkIGJvcmRlciBtb2RlIiApOworCisgICAgZ2V0X3dvcmtfcGFyYW1zKCk7CisKKyAgICBwcmV2X3dpZHRoID0gMDsKKyAgICBwcmV2X3hfcmFuZ2UgPSBjdlNsaWNlKDAsMCk7CisKKyAgICBidWZfc2l6ZSA9IGN2QWxpZ24oIGJ1Zl9zaXplLCBBTElHTiApOworCisgICAgc3JjX3BpeF9zeiA9IENWX0VMRU1fU0laRShzcmNfdHlwZSk7CisgICAgYm9yZGVyX3RhYl9zejEgPSBhbmNob3IueCpzcmNfcGl4X3N6OworICAgIGJvcmRlcl90YWJfc3ogPSAoa3NpemUud2lkdGgtMSkqc3JjX3BpeF9zejsKKyAgICBic3ogPSBjdkFsaWduKCBib3JkZXJfdGFiX3N6KnNpemVvZihpbnQpLCBBTElHTiApOworCisgICAgYXNzZXJ0KCBtYXhfcm93cyA+IG1heF9reSoyICk7CisgICAgcm93X3RhYl9zeiA9IGN2QWxpZ24oIG1heF9yb3dzKnNpemVvZih1Y2hhciopLCBBTElHTiApOworICAgIHRvdGFsX2J1Zl9zeiA9IGJ1Zl9zaXplICsgcm93X3RhYl9zeiArIGJzejsKKworICAgIENWX0NBTEwoIHB0ciA9IGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggdG90YWxfYnVmX3N6ICkpOworICAgIAorICAgIHJvd3MgPSAodWNoYXIqKilwdHI7CisgICAgcHRyICs9IHJvd190YWJfc3o7CisgICAgYm9yZGVyX3RhYiA9IChpbnQqKXB0cjsKKyAgICBwdHIgKz0gYnN6OworCisgICAgYnVmX3N0YXJ0ID0gcHRyOworICAgIGNvbnN0X3JvdyA9IDA7CisKKyAgICBpZiggYm9yZGVyX21vZGUgPT0gSVBMX0JPUkRFUl9DT05TVEFOVCApCisgICAgICAgIGN2U2NhbGFyVG9SYXdEYXRhKCAmYm9yZGVyX3ZhbHVlLCBib3JkZXJfdGFiLCBzcmNfdHlwZSwgMCApOworCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2QmFzZUltYWdlRmlsdGVyOjpzdGFydF9wcm9jZXNzKCBDdlNsaWNlIHhfcmFuZ2UsIGludCB3aWR0aCApCit7CisgICAgaW50IG1vZGUgPSBib3JkZXJfbW9kZTsKKyAgICBpbnQgcGl4X3N6ID0gQ1ZfRUxFTV9TSVpFKHNyY190eXBlKSwgd29ya19waXhfc3ogPSBDVl9FTEVNX1NJWkUod29ya190eXBlKTsKKyAgICBpbnQgYnN6ID0gYnVmX3NpemUsIGJ3ID0geF9yYW5nZS5lbmRfaW5kZXggLSB4X3JhbmdlLnN0YXJ0X2luZGV4LCBidzEgPSBidyArIGtzaXplLndpZHRoIC0gMTsKKyAgICBpbnQgdHJfc3RlcCA9IGN2QWxpZ24oYncxKnBpeF9zeiwgQUxJR04gKTsKKyAgICBpbnQgaSwgaiwgaywgb2ZzOworICAgIAorICAgIGlmKCB4X3JhbmdlLnN0YXJ0X2luZGV4ID09IHByZXZfeF9yYW5nZS5zdGFydF9pbmRleCAmJgorICAgICAgICB4X3JhbmdlLmVuZF9pbmRleCA9PSBwcmV2X3hfcmFuZ2UuZW5kX2luZGV4ICYmCisgICAgICAgIHdpZHRoID09IHByZXZfd2lkdGggKQorICAgICAgICByZXR1cm47CisKKyAgICBwcmV2X3hfcmFuZ2UgPSB4X3JhbmdlOworICAgIHByZXZfd2lkdGggPSB3aWR0aDsKKworICAgIGlmKCAhaXNfc2VwYXJhYmxlICkKKyAgICAgICAgYncgPSBidzE7CisgICAgZWxzZQorICAgICAgICBic3ogLT0gdHJfc3RlcDsKKworICAgIGJ1Zl9zdGVwID0gY3ZBbGlnbihidyp3b3JrX3BpeF9zeiwgQUxJR04pOworCisgICAgaWYoIG1vZGUgPT0gSVBMX0JPUkRFUl9DT05TVEFOVCApCisgICAgICAgIGJzeiAtPSBidWZfc3RlcDsKKyAgICBidWZfbWF4X2NvdW50ID0gYnN6L2J1Zl9zdGVwOworICAgIGJ1Zl9tYXhfY291bnQgPSBNSU4oIGJ1Zl9tYXhfY291bnQsIG1heF9yb3dzIC0gbWF4X2t5KjIgKTsKKyAgICBidWZfZW5kID0gYnVmX3N0YXJ0ICsgYnVmX21heF9jb3VudCpidWZfc3RlcDsKKworICAgIGlmKCBtb2RlID09IElQTF9CT1JERVJfQ09OU1RBTlQgKQorICAgIHsKKyAgICAgICAgaW50IGksIHRhYl9sZW4gPSBrc2l6ZS53aWR0aCpwaXhfc3o7CisgICAgICAgIHVjaGFyKiBidCA9ICh1Y2hhciopYm9yZGVyX3RhYjsKKyAgICAgICAgdWNoYXIqIHRyb3cgPSBidWZfZW5kOworICAgICAgICBjb25zdF9yb3cgPSBidWZfZW5kICsgKGlzX3NlcGFyYWJsZSA/IDEgOiAwKSp0cl9zdGVwOworCisgICAgICAgIGZvciggaSA9IHBpeF9zejsgaSA8IHRhYl9sZW47IGkrKyApCisgICAgICAgICAgICBidFtpXSA9IGJ0W2kgLSBwaXhfc3pdOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcGl4X3N6OyBpKysgKQorICAgICAgICAgICAgdHJvd1tpXSA9IGJ0W2ldOworICAgICAgICBmb3IoIGkgPSBwaXhfc3o7IGkgPCB0cl9zdGVwOyBpKysgKQorICAgICAgICAgICAgdHJvd1tpXSA9IHRyb3dbaSAtIHBpeF9zel07CisgICAgICAgIGlmKCBpc19zZXBhcmFibGUgKQorICAgICAgICAgICAgeF9mdW5jKCB0cm93LCBjb25zdF9yb3csIHRoaXMgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCB4X3JhbmdlLmVuZF9pbmRleCAtIHhfcmFuZ2Uuc3RhcnRfaW5kZXggPD0gMSApCisgICAgICAgIG1vZGUgPSBJUExfQk9SREVSX1JFUExJQ0FURTsKKworICAgIHdpZHRoID0gKHdpZHRoIC0gMSkqcGl4X3N6OworICAgIG9mcyA9IChhbmNob3IueC14X3JhbmdlLnN0YXJ0X2luZGV4KSpwaXhfc3o7CisKKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIGludCBpZHgsIGRlbHRhOworICAgICAgICBpbnQgaTEsIGkyLCBkaTsKKworICAgICAgICBpZiggayA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4ID0gKHhfcmFuZ2Uuc3RhcnRfaW5kZXggLSAxKSpwaXhfc3o7CisgICAgICAgICAgICBkZWx0YSA9IGRpID0gLXBpeF9zejsKKyAgICAgICAgICAgIGkxID0gYm9yZGVyX3RhYl9zejEgLSBwaXhfc3o7CisgICAgICAgICAgICBpMiA9IC1waXhfc3o7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZHggPSB4X3JhbmdlLmVuZF9pbmRleCpwaXhfc3o7CisgICAgICAgICAgICBkZWx0YSA9IGRpID0gcGl4X3N6OworICAgICAgICAgICAgaTEgPSBib3JkZXJfdGFiX3N6MTsKKyAgICAgICAgICAgIGkyID0gYm9yZGVyX3RhYl9zejsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAodW5zaWduZWQpaWR4ID4gKHVuc2lnbmVkKXdpZHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNoaWZ0ID0gbW9kZSA9PSBJUExfQk9SREVSX1JFRkxFQ1RfMTAxID8gcGl4X3N6IDogMDsKKyAgICAgICAgICAgIGlkeCA9IGsgPT0gMCA/IHNoaWZ0IDogd2lkdGggLSBzaGlmdDsKKyAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gaTE7IGkgIT0gaTI7IGkgKz0gZGkgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgcGl4X3N6OyBqKysgKQorICAgICAgICAgICAgICAgIGJvcmRlcl90YWJbaSArIGpdID0gaWR4ICsgb2ZzICsgajsKKyAgICAgICAgICAgIGlmKCBtb2RlICE9IElQTF9CT1JERVJfUkVQTElDQVRFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggKGRlbHRhID4gMCAmJiBpZHggPT0gd2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgIChkZWx0YSA8IDAgJiYgaWR4ID09IDApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBtb2RlID09IElQTF9CT1JERVJfUkVGTEVDVF8xMDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWR4IC09IGRlbHRhKjI7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWRlbHRhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlkeCArPSBkZWx0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEN2QmFzZUltYWdlRmlsdGVyOjptYWtlX3lfYm9yZGVyKCBpbnQgcm93X2NvdW50LCBpbnQgdG9wX3Jvd3MsIGludCBib3R0b21fcm93cyApCit7CisgICAgaW50IGk7CisgICAgCisgICAgaWYoIGJvcmRlcl9tb2RlID09IElQTF9CT1JERVJfQ09OU1RBTlQgfHwKKyAgICAgICAgYm9yZGVyX21vZGUgPT0gSVBMX0JPUkRFUl9SRVBMSUNBVEUgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIHJvdzEgPSBib3JkZXJfbW9kZSA9PSBJUExfQk9SREVSX0NPTlNUQU5UID8gY29uc3Rfcm93IDogcm93c1ttYXhfa3ldOworICAgICAgICAKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvcF9yb3dzICYmIHJvd3NbaV0gPT0gMDsgaSsrICkKKyAgICAgICAgICAgIHJvd3NbaV0gPSByb3cxOworCisgICAgICAgIHJvdzEgPSBib3JkZXJfbW9kZSA9PSBJUExfQk9SREVSX0NPTlNUQU5UID8gY29uc3Rfcm93IDogcm93c1tyb3dfY291bnQtMV07CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBib3R0b21fcm93czsgaSsrICkKKyAgICAgICAgICAgIHJvd3NbaSArIHJvd19jb3VudF0gPSByb3cxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaiwgZGogPSAxLCBzaGlmdCA9IGJvcmRlcl9tb2RlID09IElQTF9CT1JERVJfUkVGTEVDVF8xMDE7CisKKyAgICAgICAgZm9yKCBpID0gdG9wX3Jvd3MtMSwgaiA9IHRvcF9yb3dzK3NoaWZ0OyBpID49IDA7IGktLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCByb3dzW2ldID09IDAgKQorICAgICAgICAgICAgICAgIHJvd3NbaV0gPSByb3dzW2pdOworICAgICAgICAgICAgaiArPSBkajsKKyAgICAgICAgICAgIGlmKCBkaiA+IDAgJiYgaiA+PSByb3dfY291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhYm90dG9tX3Jvd3MgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBqIC09IDEgKyBzaGlmdDsKKyAgICAgICAgICAgICAgICBkaiA9IC1kajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDAsIGogPSByb3dfY291bnQtMS1zaGlmdDsgaSA8IGJvdHRvbV9yb3dzOyBpKyssIGotLSApCisgICAgICAgICAgICByb3dzW2kgKyByb3dfY291bnRdID0gcm93c1tqXTsKKyAgICB9Cit9CisKKworaW50IEN2QmFzZUltYWdlRmlsdGVyOjpmaWxsX2N5Y2xpY19idWZmZXIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTAsIGludCB5MSwgaW50IHkyICkKK3sKKyAgICBpbnQgaSwgeSA9IHkwLCBic3oxID0gYm9yZGVyX3RhYl9zejEsIGJzeiA9IGJvcmRlcl90YWJfc3o7CisgICAgaW50IHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyY190eXBlKTsKKyAgICBpbnQgd2lkdGggPSBwcmV2X3hfcmFuZ2UuZW5kX2luZGV4IC0gcHJldl94X3JhbmdlLnN0YXJ0X2luZGV4LCB3aWR0aF9uID0gd2lkdGgqcGl4X3NpemU7CisgICAgYm9vbCBjYW5fdXNlX3NyY19hc190cm93ID0gZmFsc2U7IC8vaXNfc2VwYXJhYmxlICYmIHdpZHRoID49IGtzaXplLndpZHRoOworCisgICAgLy8gZmlsbCB0aGUgY3ljbGljIGJ1ZmZlcgorICAgIGZvciggOyBidWZfY291bnQgPCBidWZfbWF4X2NvdW50ICYmIHkgPCB5MjsgYnVmX2NvdW50KyssIHkrKywgc3JjICs9IHNyY19zdGVwICkKKyAgICB7CisgICAgICAgIHVjaGFyKiB0cm93ID0gaXNfc2VwYXJhYmxlID8gYnVmX2VuZCA6IGJ1Zl90YWlsOworICAgICAgICB1Y2hhciogYnB0ciA9IGNhbl91c2Vfc3JjX2FzX3Ryb3cgJiYgeTEgPCB5ICYmIHkrMSA8IHkyID8gKHVjaGFyKikoc3JjIC0gYnN6MSkgOiB0cm93OworCisgICAgICAgIGlmKCBicHRyICE9IHRyb3cgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYnN6MTsgaSsrICkKKyAgICAgICAgICAgICAgICB0cm93W2ldID0gYnB0cltpXTsKKyAgICAgICAgICAgIGZvciggOyBpIDwgYnN6OyBpKysgKQorICAgICAgICAgICAgICAgIHRyb3dbaV0gPSBicHRyW2kgKyB3aWR0aF9uXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAhKCgoc2l6ZV90KShicHRyICsgYnN6MSl8KHNpemVfdClzcmN8d2lkdGhfbikgJiAoc2l6ZW9mKGludCktMSkpICkKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aF9uOyBpICs9IHNpemVvZihpbnQpICkKKyAgICAgICAgICAgICAgICAqKGludCopKGJwdHIgKyBpICsgYnN6MSkgPSAqKGludCopKHNyYyArIGkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2lkdGhfbjsgaSsrICkKKyAgICAgICAgICAgICAgICBicHRyW2kgKyBic3oxXSA9IHNyY1tpXTsKKworICAgICAgICBpZiggYm9yZGVyX21vZGUgIT0gSVBMX0JPUkRFUl9DT05TVEFOVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBic3oxOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqID0gYm9yZGVyX3RhYltpXTsKKyAgICAgICAgICAgICAgICBicHRyW2ldID0gYnB0cltqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggOyBpIDwgYnN6OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqID0gYm9yZGVyX3RhYltpXTsKKyAgICAgICAgICAgICAgICBicHRyW2kgKyB3aWR0aF9uXSA9IGJwdHJbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1Y2hhciAqYnQgPSAodWNoYXIqKWJvcmRlcl90YWI7IAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGJzejE7IGkrKyApCisgICAgICAgICAgICAgICAgYnB0cltpXSA9IGJ0W2ldOworCisgICAgICAgICAgICBmb3IoIDsgaSA8IGJzejsgaSsrICkKKyAgICAgICAgICAgICAgICBicHRyW2kgKyB3aWR0aF9uXSA9IGJ0W2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGlzX3NlcGFyYWJsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhfZnVuYyggYnB0ciwgYnVmX3RhaWwsIHRoaXMgKTsKKyAgICAgICAgICAgIGlmKCBicHRyICE9IHRyb3cgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBic3oxOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBicHRyW2ldID0gdHJvd1tpXTsKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IGJzejsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYnB0cltpICsgd2lkdGhfbl0gPSB0cm93W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYnVmX3RhaWwgKz0gYnVmX3N0ZXA7CisgICAgICAgIGlmKCBidWZfdGFpbCA+PSBidWZfZW5kICkKKyAgICAgICAgICAgIGJ1Zl90YWlsID0gYnVmX3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiB5IC0geTA7Cit9CisKK2ludCBDdkJhc2VJbWFnZUZpbHRlcjo6cHJvY2VzcyggY29uc3QgQ3ZNYXQqIHNyYywgQ3ZNYXQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHNyY19yb2ksIEN2UG9pbnQgZHN0X29yaWdpbiwgaW50IGZsYWdzICkKK3sKKyAgICBpbnQgcm93c19wcm9jZXNzZWQgPSAwOworCisgICAgLyoKKyAgICAgICAgY2hlY2tfcGFyYW1ldGVycworICAgICAgICBpbml0aWFsaXplX2hvcml6b250YWxfYm9yZGVyX3JlbG9jX3RhYl9pZl9ub3RfaW5pdGlhbGl6ZWRfeWV0CisgICAgICAgIAorICAgICAgICBmb3JfZWFjaF9zb3VyY2Vfcm93OiBzcmMgc3RhcnRzIGZyb20gc3JjX3JvaS55LCBidWYgc3RhcnRzIHdpdGggdGhlIGZpcnN0IGF2YWlsYWJsZSByb3cKKyAgICAgICAgICAgIDEpIGlmIHNlcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAxYS4xKSBjb3B5IHNvdXJjZSByb3cgdG8gdGVtcG9yYXJ5IGJ1ZmZlciwgZm9ybSBhIGJvcmRlciB1c2luZyBib3JkZXIgcmVsb2MgdGFiLgorICAgICAgICAgICAgICAgICAgIDFhLjIpIGFwcGx5IHJvdy13aXNlIGZpbHRlciAoc3ltbWV0cmljLCBhc3ltbWV0cmljIG9yIGdlbmVyaWMpCisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgMWIuMSkgY29weSBzb3VyY2Ugcm93IHRvIHRoZSBidWZmZXIsIGZvcm0gYSBib3JkZXIKKyAgICAgICAgICAgIDIpIGlmIHRoZSBidWZmZXIgaXMgZnVsbCwgb3IgaXQgaXMgdGhlIGxhc3Qgc291cmNlIHJvdzoKKyAgICAgICAgICAgICAgICAgMi4xKSBpZiBzdGFnZSAhPSBtaWRkbGUsIGZvcm0gdGhlIHBvaW50ZXJzIHRvIG90aGVyICJ2aXJ0dWFsIiByb3dzLgorICAgICAgICAgICAgICAgICBpZiBzZXBhcmFibGUKKyAgICAgICAgICAgICAgICAgICAgMmEuMikgYXBwbHkgY29sdW1uLXdpc2UgZmlsdGVyLCBzdG9yZSB0aGUgcmVzdWx0cy4KKyAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAyYi4yKSBmb3JtIGEgc3BhcnNlIChvZmZzZXQsd2VpZ2h0KSB0YWIKKyAgICAgICAgICAgICAgICAgICAgMmIuMykgYXBwbHkgZ2VuZXJpYyBub24tc2VwYXJhYmxlIGZpbHRlciwgc3RvcmUgdGhlIHJlc3VsdHMKKyAgICAgICAgICAgIDMpIHVwZGF0ZSByb3cgcG9pbnRlcnMgZXRjLgorICAgICovCisKKyAgICBDVl9GVU5DTkFNRSggIkN2QmFzZUltYWdlRmlsdGVyOjpwcm9jZXNzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIHdpZHRoLCBfc3JjX3kxLCBfc3JjX3kyOworICAgIGludCBzcmNfeCwgc3JjX3ksIHNyY195MSwgc3JjX3kyLCBkc3RfeTsKKyAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUoc3JjX3R5cGUpOworICAgIHVjaGFyICpzcHRyID0gMCwgKmRwdHI7CisgICAgaW50IHBoYXNlID0gZmxhZ3MgJiAoQ1ZfU1RBUlR8Q1ZfRU5EfENWX01JRERMRSk7CisgICAgYm9vbCBpc29sYXRlZF9yb2kgPSAoZmxhZ3MgJiBDVl9JU09MQVRFRF9ST0kpICE9IDA7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IHNyY190eXBlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICB3aWR0aCA9IHNyYy0+Y29sczsKKworICAgIGlmKCBzcmNfcm9pLndpZHRoID09IC0xICYmIHNyY19yb2kueCA9PSAwICkKKyAgICAgICAgc3JjX3JvaS53aWR0aCA9IHdpZHRoOworCisgICAgaWYoIHNyY19yb2kuaGVpZ2h0ID09IC0xICYmIHNyY19yb2kueSA9PSAwICkKKyAgICB7CisgICAgICAgIHNyY19yb2kueSA9IDA7CisgICAgICAgIHNyY19yb2kuaGVpZ2h0ID0gc3JjLT5yb3dzOworICAgIH0KKworICAgIGlmKCBzcmNfcm9pLndpZHRoID4gbWF4X3dpZHRoIHx8CisgICAgICAgIHNyY19yb2kueCA8IDAgfHwgc3JjX3JvaS53aWR0aCA8IDAgfHwKKyAgICAgICAgc3JjX3JvaS55IDwgMCB8fCBzcmNfcm9pLmhlaWdodCA8IDAgfHwKKyAgICAgICAgc3JjX3JvaS54ICsgc3JjX3JvaS53aWR0aCA+IHdpZHRoIHx8CisgICAgICAgIHNyY19yb2kueSArIHNyY19yb2kuaGVpZ2h0ID4gc3JjLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUb28gbGFyZ2Ugc291cmNlIGltYWdlIG9yIGl0cyBST0kiICk7CisKKyAgICBzcmNfeCA9IHNyY19yb2kueDsKKyAgICBfc3JjX3kxID0gMDsKKyAgICBfc3JjX3kyID0gc3JjLT5yb3dzOworCisgICAgaWYoIGlzb2xhdGVkX3JvaSApCisgICAgeworICAgICAgICBzcmNfcm9pLnggPSAwOworICAgICAgICB3aWR0aCA9IHNyY19yb2kud2lkdGg7CisgICAgICAgIF9zcmNfeTEgPSBzcmNfcm9pLnk7CisgICAgICAgIF9zcmNfeTIgPSBzcmNfcm9pLnkgKyBzcmNfcm9pLmhlaWdodDsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShkc3QtPnR5cGUpICE9IGRzdF90eXBlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggZHN0X29yaWdpbi54IDwgMCB8fCBkc3Rfb3JpZ2luLnkgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJJbmNvcnJlY3QgZGVzdGluYXRpb24gUk9JIG9yaWdpbiIgKTsKKworICAgIGlmKCBwaGFzZSA9PSBDVl9XSE9MRSApCisgICAgICAgIHBoYXNlID0gQ1ZfU1RBUlQgfCBDVl9FTkQ7CisgICAgcGhhc2UgJj0gQ1ZfU1RBUlQgfCBDVl9FTkQgfCBDVl9NSURETEU7CisKKyAgICAvLyBpbml0aWFsaXplIGhvcml6b250YWwgYm9yZGVyIHJlbG9jYXRpb24gdGFiIGlmIGl0IGlzIG5vdCBpbml0aWFsaXplZCB5ZXQKKyAgICBpZiggcGhhc2UgJiBDVl9TVEFSVCApCisgICAgICAgIHN0YXJ0X3Byb2Nlc3MoIGN2U2xpY2Uoc3JjX3JvaS54LCBzcmNfcm9pLnggKyBzcmNfcm9pLndpZHRoKSwgd2lkdGggKTsKKyAgICBlbHNlIGlmKCBwcmV2X3dpZHRoICE9IHdpZHRoIHx8IHByZXZfeF9yYW5nZS5zdGFydF9pbmRleCAhPSBzcmNfcm9pLnggfHwKKyAgICAgICAgcHJldl94X3JhbmdlLmVuZF9pbmRleCAhPSBzcmNfcm9pLnggKyBzcmNfcm9pLndpZHRoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJJbiBhIG1pZGRsZSBvciBhdCB0aGUgZW5kIHRoZSBob3Jpem9udGFsIHBsYWNlbWVudCBvZiB0aGUgc3RyaXBlIGNhbiBub3QgYmUgY2hhbmdlZCIgKTsKKworICAgIGRzdF95ID0gZHN0X29yaWdpbi55OworICAgIHNyY195MSA9IHNyY19yb2kueTsKKyAgICBzcmNfeTIgPSBzcmNfcm9pLnkgKyBzcmNfcm9pLmhlaWdodDsKKworICAgIGlmKCBwaGFzZSAmIENWX1NUQVJUICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbWF4X2t5KjI7IGkrKyApCisgICAgICAgICAgICByb3dzW2ldID0gMDsKKyAgICAgICAgCisgICAgICAgIHNyY195MSAtPSBtYXhfa3k7CisgICAgICAgIHRvcF9yb3dzID0gYm90dG9tX3Jvd3MgPSAwOworCisgICAgICAgIGlmKCBzcmNfeTEgPCBfc3JjX3kxICkKKyAgICAgICAgeworICAgICAgICAgICAgdG9wX3Jvd3MgPSBfc3JjX3kxIC0gc3JjX3kxOworICAgICAgICAgICAgc3JjX3kxID0gX3NyY195MTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zl9oZWFkID0gYnVmX3RhaWwgPSBidWZfc3RhcnQ7CisgICAgICAgIGJ1Zl9jb3VudCA9IDA7CisgICAgfQorCisgICAgaWYoIHBoYXNlICYgQ1ZfRU5EICkKKyAgICB7CisgICAgICAgIHNyY195MiArPSBtYXhfa3k7CisKKyAgICAgICAgaWYoIHNyY195MiA+IF9zcmNfeTIgKQorICAgICAgICB7CisgICAgICAgICAgICBib3R0b21fcm93cyA9IHNyY195MiAtIF9zcmNfeTI7CisgICAgICAgICAgICBzcmNfeTIgPSBfc3JjX3kyOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGRwdHIgPSBkc3QtPmRhdGEucHRyICsgZHN0X29yaWdpbi55KmRzdC0+c3RlcCArIGRzdF9vcmlnaW4ueCpDVl9FTEVNX1NJWkUoZHN0X3R5cGUpOworICAgIHNwdHIgPSBzcmMtPmRhdGEucHRyICsgc3JjX3kxKnNyYy0+c3RlcCArIHNyY194KnBpeF9zaXplOworICAgICAgICAKKyAgICBmb3IoIHNyY195ID0gc3JjX3kxOyBzcmNfeSA8IHNyY195MjsgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIGJwdHI7CisgICAgICAgIGludCByb3dfY291bnQsIGRlbHRhOworCisgICAgICAgIGRlbHRhID0gZmlsbF9jeWNsaWNfYnVmZmVyKCBzcHRyLCBzcmMtPnN0ZXAsIHNyY195LCBzcmNfeTEsIHNyY195MiApOworCisgICAgICAgIHNyY195ICs9IGRlbHRhOworICAgICAgICBzcHRyICs9IHNyYy0+c3RlcCpkZWx0YTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHRoZSBjeWNsaWMgYnVmZmVyIHJvdyBwb2ludGVycworICAgICAgICBicHRyID0gYnVmX2hlYWQ7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBidWZfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJvd3NbaSt0b3Bfcm93c10gPSBicHRyOworICAgICAgICAgICAgYnB0ciArPSBidWZfc3RlcDsKKyAgICAgICAgICAgIGlmKCBicHRyID49IGJ1Zl9lbmQgKQorICAgICAgICAgICAgICAgIGJwdHIgPSBidWZfc3RhcnQ7CisgICAgICAgIH0KKworICAgICAgICByb3dfY291bnQgPSB0b3Bfcm93cyArIGJ1Zl9jb3VudDsKKyAgICAgICAgCisgICAgICAgIGlmKCAhcm93c1swXSB8fCAoKHBoYXNlICYgQ1ZfRU5EKSAmJiBzcmNfeSA9PSBzcmNfeTIpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJyID0gKHBoYXNlICYgQ1ZfRU5EKSAmJiBzcmNfeSA9PSBzcmNfeTIgPyBib3R0b21fcm93cyA6IDA7CisgICAgICAgICAgICBtYWtlX3lfYm9yZGVyKCByb3dfY291bnQsIHRvcF9yb3dzLCBiciApOworICAgICAgICAgICAgcm93X2NvdW50ICs9IGJyOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHJvd3NbMF0gJiYgcm93X2NvdW50ID4gbWF4X2t5KjIgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnQgPSByb3dfY291bnQgLSBtYXhfa3kqMjsKKyAgICAgICAgICAgIGlmKCBkc3RfeSArIGNvdW50ID4gZHN0LT5yb3dzICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBkZXN0aW5hdGlvbiBpbWFnZSBjYW4gbm90IGZpdCB0aGUgcmVzdWx0IiApOworCisgICAgICAgICAgICBhc3NlcnQoIGNvdW50ID49IDAgKTsKKyAgICAgICAgICAgIHlfZnVuYyggcm93cyArIG1heF9reSAtIGFuY2hvci55LCBkcHRyLCBkc3QtPnN0ZXAsIGNvdW50LCB0aGlzICk7CisgICAgICAgICAgICByb3dfY291bnQgLT0gY291bnQ7CisgICAgICAgICAgICBkc3RfeSArPSBjb3VudDsKKyAgICAgICAgICAgIGRwdHIgKz0gZHN0LT5zdGVwKmNvdW50OworICAgICAgICAgICAgZm9yKCBicHRyID0gcm93X2NvdW50ID4gMCA/cm93c1tjb3VudF0gOiAwOyBidWZfaGVhZCAhPSBicHRyICYmIGJ1Zl9jb3VudCA+IDA7IGJ1Zl9jb3VudC0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZfaGVhZCArPSBidWZfc3RlcDsKKyAgICAgICAgICAgICAgICBpZiggYnVmX2hlYWQgPj0gYnVmX2VuZCApCisgICAgICAgICAgICAgICAgICAgIGJ1Zl9oZWFkID0gYnVmX3N0YXJ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcm93c19wcm9jZXNzZWQgKz0gY291bnQ7CisgICAgICAgICAgICB0b3Bfcm93cyA9IE1BWCh0b3Bfcm93cyAtIGNvdW50LCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcm93c19wcm9jZXNzZWQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXBhcmFibGUgTGluZWFyIEZpbHRlcgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGljdkZpbHRlclJvd1N5bW1fOHUzMnMoIGNvbnN0IHVjaGFyKiBzcmMsIGludCogZHN0LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkZpbHRlckNvbFN5bW1fMzJzOHUoIGNvbnN0IGludCoqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkZpbHRlckNvbFN5bW1fMzJzMTZzKCBjb25zdCBpbnQqKiBzcmMsIHNob3J0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93U3ltbV84dTMyZiggY29uc3QgdWNoYXIqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZGaWx0ZXJSb3dfOHUzMmYoIGNvbnN0IHVjaGFyKiBzcmMsIGZsb2F0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93U3ltbV8xNnMzMmYoIGNvbnN0IHNob3J0KiBzcmMsIGZsb2F0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93XzE2czMyZiggY29uc3Qgc2hvcnQqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZGaWx0ZXJSb3dTeW1tXzE2dTMyZiggY29uc3QgdXNob3J0KiBzcmMsIGZsb2F0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93XzE2dTMyZiggY29uc3QgdXNob3J0KiBzcmMsIGZsb2F0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93U3ltbV8zMmYoIGNvbnN0IGZsb2F0KiBzcmMsIGZsb2F0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyUm93XzMyZiggY29uc3QgZmxvYXQqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICk7CisKK3N0YXRpYyB2b2lkIGljdkZpbHRlckNvbFN5bW1fMzJmOHUoIGNvbnN0IGZsb2F0Kiogc3JjLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyQ29sXzMyZjh1KCBjb25zdCBmbG9hdCoqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyQ29sU3ltbV8zMmYxNnMoIGNvbnN0IGZsb2F0Kiogc3JjLCBzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkZpbHRlckNvbF8zMmYxNnMoIGNvbnN0IGZsb2F0Kiogc3JjLCBzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyQ29sU3ltbV8zMmYxNnUoIGNvbnN0IGZsb2F0Kiogc3JjLCB1c2hvcnQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZGaWx0ZXJDb2xfMzJmMTZ1KCBjb25zdCBmbG9hdCoqIHNyYywgdXNob3J0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZGaWx0ZXJDb2xTeW1tXzMyZiggY29uc3QgZmxvYXQqKiBzcmMsIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RmlsdGVyQ29sXzMyZiggY29uc3QgZmxvYXQqKiBzcmMsIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CisKK0N2U2VwRmlsdGVyOjpDdlNlcEZpbHRlcigpCit7CisgICAgbWluX2RlcHRoID0gQ1ZfMzJGOworICAgIGt4ID0ga3kgPSAwOworICAgIGt4X2ZsYWdzID0ga3lfZmxhZ3MgPSAwOworfQorCisKK0N2U2VwRmlsdGVyOjpDdlNlcEZpbHRlciggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfa3gsIGNvbnN0IEN2TWF0KiBfa3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvciwgaW50IF9ib3JkZXJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAgbWluX2RlcHRoID0gQ1ZfMzJGOworICAgIGt4ID0ga3kgPSAwOworICAgIGluaXQoIF9tYXhfd2lkdGgsIF9zcmNfdHlwZSwgX2RzdF90eXBlLCBfa3gsIF9reSwgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7Cit9CisKKwordm9pZCBDdlNlcEZpbHRlcjo6Y2xlYXIoKQoreworICAgIGN2UmVsZWFzZU1hdCggJmt4ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAma3kgKTsKKyAgICBDdkJhc2VJbWFnZUZpbHRlcjo6Y2xlYXIoKTsKK30KKworCitDdlNlcEZpbHRlcjo6fkN2U2VwRmlsdGVyKCkKK3sKKyAgICBjbGVhcigpOworfQorCisKKyN1bmRlZiBGSUxURVJfQklUUworI2RlZmluZSBGSUxURVJfQklUUyA4CisKK3ZvaWQgQ3ZTZXBGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9reCwgY29uc3QgQ3ZNYXQqIF9reSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvciwgaW50IF9ib3JkZXJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTZXBGaWx0ZXI6OmluaXQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUgX2tzaXplOworICAgIGludCBmaWx0ZXJfdHlwZTsKKyAgICBpbnQgaSwgeHN6LCB5c3o7CisgICAgaW50IGNvbnZlcnRfZmlsdGVycyA9IDA7CisgICAgZG91YmxlIHhzdW0gPSAwLCB5c3VtID0gMDsKKyAgICBjb25zdCBmbG9hdCBlcHMgPSBGTFRfRVBTSUxPTioxMDAuZjsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKF9reCkgfHwgIUNWX0lTX01BVChfa3kpIHx8CisgICAgICAgIChfa3gtPmNvbHMgIT0gMSAmJiBfa3gtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgKF9reS0+Y29scyAhPSAxICYmIF9reS0+cm93cyAhPSAxKSB8fAorICAgICAgICBDVl9NQVRfQ04oX2t4LT50eXBlKSAhPSAxIHx8IENWX01BVF9DTihfa3ktPnR5cGUpICE9IDEgfHwKKyAgICAgICAgIUNWX0FSRV9UWVBFU19FUShfa3gsX2t5KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJCb3RoIGtlcm5lbHMgbXVzdCBiZSB2YWxpZCAxZCBzaW5nbGUtY2hhbm5lbCB2ZWN0b3JzIG9mIHRoZSBzYW1lIHR5cGVzIiApOworCisgICAgaWYoIENWX01BVF9DTihfc3JjX3R5cGUpICE9IENWX01BVF9DTihfZHN0X3R5cGUpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJJbnB1dCBhbmQgb3V0cHV0IG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMiICk7CisKKyAgICBmaWx0ZXJfdHlwZSA9IE1BWCggQ1ZfMzJGLCBDVl9NQVRfREVQVEgoX2t4LT50eXBlKSApOworCisgICAgX2tzaXplLndpZHRoID0gX2t4LT5yb3dzICsgX2t4LT5jb2xzIC0gMTsKKyAgICBfa3NpemUuaGVpZ2h0ID0gX2t5LT5yb3dzICsgX2t5LT5jb2xzIC0gMTsKKworICAgIENWX0NBTEwoIEN2QmFzZUltYWdlRmlsdGVyOjppbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgMSwgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfYW5jaG9yLCBfYm9yZGVyX21vZGUsIF9ib3JkZXJfdmFsdWUgKSk7CisKKyAgICBpZiggIShreCAmJiBDVl9BUkVfU0laRVNfRVEoa3gsX2t4KSkgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAma3ggKTsKKyAgICAgICAgQ1ZfQ0FMTCgga3ggPSBjdkNyZWF0ZU1hdCggX2t4LT5yb3dzLCBfa3gtPmNvbHMsIGZpbHRlcl90eXBlICkpOworICAgIH0KKworICAgIGlmKCAhKGt5ICYmIENWX0FSRV9TSVpFU19FUShreSxfa3kpKSApCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZreSApOworICAgICAgICBDVl9DQUxMKCBreSA9IGN2Q3JlYXRlTWF0KCBfa3ktPnJvd3MsIF9reS0+Y29scywgZmlsdGVyX3R5cGUgKSk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCBfa3gsIGt4ICkpOworICAgIENWX0NBTEwoIGN2Q29udmVydCggX2t5LCBreSApKTsKKworICAgIHhzeiA9IGt4LT5yb3dzICsga3gtPmNvbHMgLSAxOworICAgIHlzeiA9IGt5LT5yb3dzICsga3ktPmNvbHMgLSAxOworICAgIGt4X2ZsYWdzID0ga3lfZmxhZ3MgPSBBU1lNTUVUUklDQUwgKyBTWU1NRVRSSUNBTCArIFBPU0lUSVZFICsgU1VNX1RPXzEgKyBJTlRFR0VSOworICAgIAorICAgIGlmKCAhKHhzeiAmIDEpICkKKyAgICAgICAga3hfZmxhZ3MgJj0gfihBU1lNTUVUUklDQUwgKyBTWU1NRVRSSUNBTCk7CisgICAgaWYoICEoeXN6ICYgMSkgKQorICAgICAgICBreV9mbGFncyAmPSB+KEFTWU1NRVRSSUNBTCArIFNZTU1FVFJJQ0FMKTsKKworICAgIGZvciggaSA9IDA7IGkgPCB4c3o7IGkrKyApCisgICAgeworICAgICAgICBmbG9hdCB2ID0ga3gtPmRhdGEuZmxbaV07CisgICAgICAgIHhzdW0gKz0gdjsKKyAgICAgICAgaWYoIHYgPCAwICkKKyAgICAgICAgICAgIGt4X2ZsYWdzICY9IH5QT1NJVElWRTsKKyAgICAgICAgaWYoIGZhYnModiAtIGN2Um91bmQodikpID4gZXBzICkKKyAgICAgICAgICAgIGt4X2ZsYWdzICY9IH5JTlRFR0VSOworICAgICAgICBpZiggZmFicyh2IC0ga3gtPmRhdGEuZmxbeHN6IC0gaSAtIDFdKSA+IGVwcyApCisgICAgICAgICAgICBreF9mbGFncyAmPSB+U1lNTUVUUklDQUw7CisgICAgICAgIGlmKCBmYWJzKHYgKyBreC0+ZGF0YS5mbFt4c3ogLSBpIC0gMV0pID4gZXBzICkKKyAgICAgICAgICAgIGt4X2ZsYWdzICY9IH5BU1lNTUVUUklDQUw7CisgICAgfQorCisgICAgaWYoIGZhYnMoeHN1bSAtIDEuKSA+IGVwcyApCisgICAgICAgIGt4X2ZsYWdzICY9IH5TVU1fVE9fMTsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyBpIDwgeXN6OyBpKysgKQorICAgIHsKKyAgICAgICAgZmxvYXQgdiA9IGt5LT5kYXRhLmZsW2ldOworICAgICAgICB5c3VtICs9IHY7CisgICAgICAgIGlmKCB2IDwgMCApCisgICAgICAgICAgICBreV9mbGFncyAmPSB+UE9TSVRJVkU7CisgICAgICAgIGlmKCBmYWJzKHYgLSBjdlJvdW5kKHYpKSA+IGVwcyApCisgICAgICAgICAgICBreV9mbGFncyAmPSB+SU5URUdFUjsKKyAgICAgICAgaWYoIGZhYnModiAtIGt5LT5kYXRhLmZsW3lzeiAtIGkgLSAxXSkgPiBlcHMgKQorICAgICAgICAgICAga3lfZmxhZ3MgJj0gflNZTU1FVFJJQ0FMOworICAgICAgICBpZiggZmFicyh2ICsga3ktPmRhdGEuZmxbeXN6IC0gaSAtIDFdKSA+IGVwcyApCisgICAgICAgICAgICBreV9mbGFncyAmPSB+QVNZTU1FVFJJQ0FMOworICAgIH0KKworICAgIGlmKCBmYWJzKHlzdW0gLSAxLikgPiBlcHMgKQorICAgICAgICBreV9mbGFncyAmPSB+U1VNX1RPXzE7CisKKyAgICB4X2Z1bmMgPSAwOworICAgIHlfZnVuYyA9IDA7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKHNyY190eXBlKSA9PSBDVl84VSApCisgICAgeworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA9PSBDVl84VSAmJgorICAgICAgICAgICAgKChreF9mbGFncyZreV9mbGFncykgJiAoU1lNTUVUUklDQUwgKyBQT1NJVElWRSArIFNVTV9UT18xKSkgPT0gU1lNTUVUUklDQUwgKyBQT1NJVElWRSArIFNVTV9UT18xICkKKyAgICAgICAgeworICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZGaWx0ZXJSb3dTeW1tXzh1MzJzOworICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZGaWx0ZXJDb2xTeW1tXzMyczh1OworICAgICAgICAgICAga3hfZmxhZ3MgJj0gfklOVEVHRVI7CisgICAgICAgICAgICBreV9mbGFncyAmPSB+SU5URUdFUjsKKyAgICAgICAgICAgIGNvbnZlcnRfZmlsdGVycyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA9PSBDVl8xNlMgJiYKKyAgICAgICAgICAgIChreF9mbGFncyAmIChTWU1NRVRSSUNBTCArIEFTWU1NRVRSSUNBTCkpICYmIChreF9mbGFncyAmIElOVEVHRVIpICYmCisgICAgICAgICAgICAoa3lfZmxhZ3MgJiAoU1lNTUVUUklDQUwgKyBBU1lNTUVUUklDQUwpKSAmJiAoa3lfZmxhZ3MgJiBJTlRFR0VSKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2RmlsdGVyUm93U3ltbV84dTMyczsKKyAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RmlsdGVyQ29sU3ltbV8zMnMxNnM7CisgICAgICAgICAgICBjb252ZXJ0X2ZpbHRlcnMgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIENWX01BVF9ERVBUSChkc3RfdHlwZSkgPiBDVl8zMkYgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIjh1LT42NGYgc2VwYXJhYmxlIGZpbHRlcmluZyBpcyBub3Qgc3VwcG9ydGVkIiApOworCisgICAgICAgICAgICBpZigga3hfZmxhZ3MgJiAoU1lNTUVUUklDQUwgKyBBU1lNTUVUUklDQUwpICkKKyAgICAgICAgICAgICAgICB4X2Z1bmMgPSAoQ3ZSb3dGaWx0ZXJGdW5jKWljdkZpbHRlclJvd1N5bW1fOHUzMmY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZGaWx0ZXJSb3dfOHUzMmY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHNyY190eXBlKSA9PSBDVl8xNlUgKQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9ERVBUSChkc3RfdHlwZSkgPiBDVl8zMkYgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiMTZ1LT42NGYgc2VwYXJhYmxlIGZpbHRlcmluZyBpcyBub3Qgc3VwcG9ydGVkIiApOworCisgICAgICAgIGlmKCBreF9mbGFncyAmIChTWU1NRVRSSUNBTCArIEFTWU1NRVRSSUNBTCkgKQorICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZGaWx0ZXJSb3dTeW1tXzE2dTMyZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZGaWx0ZXJSb3dfMTZ1MzJmOworICAgIH0KKyAgICBlbHNlIGlmKCBDVl9NQVRfREVQVEgoc3JjX3R5cGUpID09IENWXzE2UyApCisgICAgeworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA+IENWXzMyRiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIxNnMtPjY0ZiBzZXBhcmFibGUgZmlsdGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICAgICAgaWYoIGt4X2ZsYWdzICYgKFNZTU1FVFJJQ0FMICsgQVNZTU1FVFJJQ0FMKSApCisgICAgICAgICAgICB4X2Z1bmMgPSAoQ3ZSb3dGaWx0ZXJGdW5jKWljdkZpbHRlclJvd1N5bW1fMTZzMzJmOworICAgICAgICBlbHNlCisgICAgICAgICAgICB4X2Z1bmMgPSAoQ3ZSb3dGaWx0ZXJGdW5jKWljdkZpbHRlclJvd18xNnMzMmY7CisgICAgfQorICAgIGVsc2UgaWYoIENWX01BVF9ERVBUSChzcmNfdHlwZSkgPT0gQ1ZfMzJGICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfREVQVEgoZHN0X3R5cGUpICE9IENWXzMyRiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJXaGVuIHRoZSBpbnB1dCBoYXMgMzJmIGRhdGEgdHlwZSwgdGhlIG91dHB1dCBtdXN0IGFsc28gaGF2ZSAzMmYgdHlwZSIgKTsKKworICAgICAgICBpZigga3hfZmxhZ3MgJiAoU1lNTUVUUklDQUwgKyBBU1lNTUVUUklDQUwpICkKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2RmlsdGVyUm93U3ltbV8zMmY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2RmlsdGVyUm93XzMyZjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIGlucHV0IGRhdGEgdHlwZSIgKTsKKworICAgIGlmKCAheV9mdW5jICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfREVQVEgoZHN0X3R5cGUpID09IENWXzhVICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGt5X2ZsYWdzICYgKFNZTU1FVFJJQ0FMICsgQVNZTU1FVFJJQ0FMKSApCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZGaWx0ZXJDb2xTeW1tXzMyZjh1OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RmlsdGVyQ29sXzMyZjh1OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIENWX01BVF9ERVBUSChkc3RfdHlwZSkgPT0gQ1ZfMTZVICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGt5X2ZsYWdzICYgKFNZTU1FVFJJQ0FMICsgQVNZTU1FVFJJQ0FMKSApCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZGaWx0ZXJDb2xTeW1tXzMyZjE2dTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkZpbHRlckNvbF8zMmYxNnU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA9PSBDVl8xNlMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZigga3lfZmxhZ3MgJiAoU1lNTUVUUklDQUwgKyBBU1lNTUVUUklDQUwpICkKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkZpbHRlckNvbFN5bW1fMzJmMTZzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RmlsdGVyQ29sXzMyZjE2czsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBDVl9NQVRfREVQVEgoZHN0X3R5cGUpID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBreV9mbGFncyAmIChTWU1NRVRSSUNBTCArIEFTWU1NRVRSSUNBTCkgKQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RmlsdGVyQ29sU3ltbV8zMmY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZGaWx0ZXJDb2xfMzJmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgaW5wdXQgZGF0YSB0eXBlIiApOworICAgIH0KKworICAgIGlmKCBjb252ZXJ0X2ZpbHRlcnMgKQorICAgIHsKKyAgICAgICAgaW50IHNjYWxlID0ga3hfZmxhZ3MgJiBreV9mbGFncyAmIElOVEVHRVIgPyAxIDogKDEgPDwgRklMVEVSX0JJVFMpOworICAgICAgICBpbnQgc3VtOworICAgICAgICAKKyAgICAgICAgZm9yKCBpID0gc3VtID0gMDsgaSA8IHhzejsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKGt4LT5kYXRhLmZsW2ldKnNjYWxlKTsKKyAgICAgICAgICAgIGt4LT5kYXRhLmlbaV0gPSB0OworICAgICAgICAgICAgc3VtICs9IHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHNjYWxlID4gMSApCisgICAgICAgICAgICBreC0+ZGF0YS5pW3hzei8yXSArPSBzY2FsZSAtIHN1bTsKKworICAgICAgICBmb3IoIGkgPSBzdW0gPSAwOyBpIDwgeXN6OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IGN2Um91bmQoa3ktPmRhdGEuZmxbaV0qc2NhbGUpOworICAgICAgICAgICAga3ktPmRhdGEuaVtpXSA9IHQ7CisgICAgICAgICAgICBzdW0gKz0gdDsKKyAgICAgICAgfQorICAgICAgICBpZiggc2NhbGUgPiAxICkKKyAgICAgICAgICAgIGt5LT5kYXRhLmlbeXN6LzJdICs9IHNjYWxlIC0gc3VtOworICAgICAgICBreC0+dHlwZSA9IChreC0+dHlwZSAmIH5DVl9NQVRfREVQVEhfTUFTSykgfCBDVl8zMlM7CisgICAgICAgIGt5LT50eXBlID0gKGt5LT50eXBlICYgfkNWX01BVF9ERVBUSF9NQVNLKSB8IENWXzMyUzsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZTZXBGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfaXNfc2VwYXJhYmxlLCBDdlNpemUgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yLCBpbnQgX2JvcmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6OmluaXQoIF9tYXhfd2lkdGgsIF9zcmNfdHlwZSwgX2RzdF90eXBlLCBfaXNfc2VwYXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa3NpemUsIF9hbmNob3IsIF9ib3JkZXJfbW9kZSwgX2JvcmRlcl92YWx1ZSApOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZGaWx0ZXJSb3dTeW1tXzh1MzJzKCBjb25zdCB1Y2hhciogc3JjLCBpbnQqIGRzdCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t4ID0gc3RhdGUtPmdldF94X2tlcm5lbCgpOworICAgIGNvbnN0IGludCoga3ggPSBfa3gtPmRhdGEuaTsKKyAgICBpbnQga3NpemUgPSBfa3gtPmNvbHMgKyBfa3gtPnJvd3MgLSAxOworICAgIGludCBpID0gMCwgaiwgaywgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7CisgICAgaW50IGtzaXplMiA9IGtzaXplLzIsIGtzaXplMm4gPSBrc2l6ZTIqY247CisgICAgaW50IGlzX3N5bW0gPSBzdGF0ZS0+Z2V0X3hfa2VybmVsX2ZsYWdzKCkgJiBDdlNlcEZpbHRlcjo6U1lNTUVUUklDQUw7CisgICAgY29uc3QgdWNoYXIqIHMgPSBzcmMgKyBrc2l6ZTJuOworCisgICAga3ggKz0ga3NpemUyOworICAgIHdpZHRoICo9IGNuOworCisgICAgaWYoIGlzX3N5bW0gKQorICAgIHsKKyAgICAgICAgaWYoIGtzaXplID09IDEgJiYga3hbMF0gPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IHNbaV0sIHMxID0gc1tpKzFdOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyArPSBpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGtzaXplID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZigga3hbMF0gPT0gMiAmJiBreFsxXSA9PSAxICkKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiwgcyArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNbLWNuXSArIHNbMF0qMiArIHNbY25dLCBzMSA9IHNbMS1jbl0gKyBzWzFdKjIgKyBzWzErY25dOworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBreFswXSA9PSAxMCAmJiBreFsxXSA9PSAzICkKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiwgcyArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNbMF0qMTAgKyAoc1stY25dICsgc1tjbl0pKjMsIHMxID0gc1sxXSoxMCArIChzWzEtY25dICsgc1sxK2NuXSkqMzsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZigga3hbMF0gPT0gMio2NCAmJiBreFsxXSA9PSAxKjY0ICkKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiwgcyArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IChzWzBdKjIgKyBzWy1jbl0gKyBzW2NuXSkgPDwgNjsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMxID0gKHNbMV0qMiArIHNbMS1jbl0gKyBzWzErY25dKSA8PCA2OworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGswID0ga3hbMF0sIGsxID0ga3hbMV07CisgICAgICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIsIHMgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSBzWzBdKmswICsgKHNbLWNuXSArIHNbY25dKSprMSwgczEgPSBzWzFdKmswICsgKHNbMS1jbl0gKyBzWzErY25dKSprMTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGtzaXplID09IDUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgazAgPSBreFswXSwgazEgPSBreFsxXSwgazIgPSBreFsyXTsKKyAgICAgICAgICAgIGlmKCBrMCA9PSA2KjE2ICYmIGsxID09IDQqMTYgJiYgazIgPT0gMSoxNiApCisgICAgICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIsIHMgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSAoc1swXSo2ICsgKHNbLWNuXSArIHNbY25dKSo0ICsgKHNbLWNuKjJdICsgc1tjbioyXSkqMSkgPDwgNDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMxID0gKHNbMV0qNiArIChzWzEtY25dICsgc1sxK2NuXSkqNCArIChzWzEtY24qMl0gKyBzWzErY24qMl0pKjEpIDw8IDQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiwgcyArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNbMF0qazAgKyAoc1stY25dICsgc1tjbl0pKmsxICsgKHNbLWNuKjJdICsgc1tjbioyXSkqazI7CisgICAgICAgICAgICAgICAgICAgIGludCBzMSA9IHNbMV0qazAgKyAoc1sxLWNuXSArIHNbMStjbl0pKmsxICsgKHNbMS1jbioyXSArIHNbMStjbioyXSkqazI7CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCwgcyArPSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZiA9IGt4WzBdOworICAgICAgICAgICAgICAgIGludCBzMCA9IGYqc1swXSwgczEgPSBmKnNbMV0sIHMyID0gZipzWzJdLCBzMyA9IGYqc1szXTsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxLCBqID0gY247IGsgPD0ga3NpemUyOyBrKyssIGogKz0gY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZiA9IGt4W2tdOworICAgICAgICAgICAgICAgICAgICBzMCArPSBmKihzW2pdICsgc1stal0pOyBzMSArPSBmKihzW2orMV0gKyBzWy1qKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gZiooc1tqKzJdICsgc1staisyXSk7IHMzICs9IGYqKHNbaiszXSArIHNbLWorM10pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gczI7IGRzdFtpKzNdID0gczM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrLCBzKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgczAgPSBreFswXSpzWzBdOworICAgICAgICAgICAgZm9yKCBrID0gMSwgaiA9IGNuOyBrIDw9IGtzaXplMjsgaysrLCBqICs9IGNuICkKKyAgICAgICAgICAgICAgICBzMCArPSBreFtrXSooc1tqXSArIHNbLWpdKTsKKyAgICAgICAgICAgIGRzdFtpXSA9IHMwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBrc2l6ZSA9PSAzICYmIGt4WzBdID09IDAgJiYga3hbMV0gPT0gMSApCisgICAgICAgICAgICBmb3IoIDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiwgcyArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzW2NuXSAtIHNbLWNuXSwgczEgPSBzWzErY25dIC0gc1sxLWNuXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQsIHMgKz0gNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxLCBqID0gY247IGsgPD0ga3NpemUyOyBrKyssIGogKz0gY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGYgPSBreFtrXTsKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gZiooc1tqXSAtIHNbLWpdKTsgczEgKz0gZiooc1tqKzFdIC0gc1staisxXSk7CisgICAgICAgICAgICAgICAgICAgIHMyICs9IGYqKHNbaisyXSAtIHNbLWorMl0pOyBzMyArPSBmKihzW2orM10gLSBzWy1qKzNdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IHMyOyBkc3RbaSszXSA9IHMzOworICAgICAgICAgICAgfQorCisgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKywgcysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHMwID0ga3hbMF0qc1swXTsKKyAgICAgICAgICAgIGZvciggayA9IDEsIGogPSBjbjsgayA8PSBrc2l6ZTI7IGsrKywgaiArPSBjbiApCisgICAgICAgICAgICAgICAgczAgKz0ga3hba10qKHNbal0gLSBzWy1qXSk7CisgICAgICAgICAgICBkc3RbaV0gPSBzMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCisjZGVmaW5lIElDVl9GSUxURVJfUk9XKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIGxvYWRfbWFjcm8gKSAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2RmlsdGVyUm93XyMjZmxhdm9yKGNvbnN0IHNyY3R5cGUqIHNyYywgZHN0dHlwZSogZHN0LCB2b2lkKnBhcmFtcylcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsgICAgICAgICAgXAorICAgIGNvbnN0IEN2TWF0KiBfa3ggPSBzdGF0ZS0+Z2V0X3hfa2VybmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZHN0dHlwZSoga3ggPSAoY29uc3QgZHN0dHlwZSopKF9reC0+ZGF0YS5wdHIpOyAgICAgICAgICAgIFwKKyAgICBpbnQga3NpemUgPSBfa3gtPmNvbHMgKyBfa3gtPnJvd3MgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpID0gMCwgaywgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBzcmN0eXBlKiBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2lkdGggKj0gY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIGYgPSBreFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgczA9Zipsb2FkX21hY3JvKHNyY1tpXSksIHMxPWYqbG9hZF9tYWNybyhzcmNbaSsxXSksICBcCisgICAgICAgICAgICAgICAgczI9Zipsb2FkX21hY3JvKHNyY1tpKzJdKSwgczM9Zipsb2FkX21hY3JvKHNyY1tpKzNdKTtcCisgICAgICAgIGZvciggayA9IDEsIHMgPSBzcmMgKyBpICsgY247IGsgPCBrc2l6ZTsgaysrLCBzICs9IGNuICkgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZiA9IGt4W2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMCArPSBmKmxvYWRfbWFjcm8oc1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMxICs9IGYqbG9hZF9tYWNybyhzWzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczIgKz0gZipsb2FkX21hY3JvKHNbMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMyArPSBmKmxvYWRfbWFjcm8oc1szXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSAoZHN0dHlwZSlzMDsgZHN0W2krMV0gPSAoZHN0dHlwZSlzMTsgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzJdID0gKGRzdHR5cGUpczI7IGRzdFtpKzNdID0gKGRzdHR5cGUpczM7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgczAgPSAoZG91YmxlKWt4WzBdKmxvYWRfbWFjcm8oc3JjW2ldKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggayA9IDEsIHMgPSBzcmMgKyBpICsgY247IGsgPCBrc2l6ZTsgaysrLCBzICs9IGNuICkgICAgIFwKKyAgICAgICAgICAgIHMwICs9IChkb3VibGUpa3hba10qbG9hZF9tYWNybyhzWzBdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSAoZHN0dHlwZSlzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfRklMVEVSX1JPVyggOHUzMmYsIHVjaGFyLCBmbG9hdCwgQ1ZfOFRPMzJGICkKK0lDVl9GSUxURVJfUk9XKCAxNnMzMmYsIHNob3J0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9GSUxURVJfUk9XKCAxNnUzMmYsIHVzaG9ydCwgZmxvYXQsIENWX05PUCApCitJQ1ZfRklMVEVSX1JPVyggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCisKKworI2RlZmluZSBJQ1ZfRklMVEVSX1JPV19TWU1NKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIGxvYWRfbWFjcm8gKSBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkZpbHRlclJvd1N5bW1fIyNmbGF2b3IoIGNvbnN0IHNyY3R5cGUqIHNyYywgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSogZHN0LCB2b2lkKiBwYXJhbXMgKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsgICAgICAgICAgXAorICAgIGNvbnN0IEN2TWF0KiBfa3ggPSBzdGF0ZS0+Z2V0X3hfa2VybmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZHN0dHlwZSoga3ggPSAoY29uc3QgZHN0dHlwZSopKF9reC0+ZGF0YS5wdHIpOyAgICAgICAgICAgIFwKKyAgICBpbnQga3NpemUgPSBfa3gtPmNvbHMgKyBfa3gtPnJvd3MgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpID0gMCwgaiwgaywgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaXNfc3ltbT1zdGF0ZS0+Z2V0X3hfa2VybmVsX2ZsYWdzKCkmQ3ZTZXBGaWx0ZXI6OlNZTU1FVFJJQ0FMO1wKKyAgICBpbnQga3NpemUyID0ga3NpemUvMiwga3NpemUybiA9IGtzaXplMipjbjsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHNyY3R5cGUqIHMgPSBzcmMgKyBrc2l6ZTJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBreCArPSBrc2l6ZTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggaXNfc3ltbSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0LCBzICs9IDQgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIGYgPSBreFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgczA9Zipsb2FkX21hY3JvKHNbMF0pLCBzMT1mKmxvYWRfbWFjcm8oc1sxXSksICAgIFwKKyAgICAgICAgICAgICAgICAgICBzMj1mKmxvYWRfbWFjcm8oc1syXSksIHMzPWYqbG9hZF9tYWNybyhzWzNdKTsgICAgXAorICAgICAgICAgICAgZm9yKCBrID0gMSwgaiA9IGNuOyBrIDw9IGtzaXplMjsgaysrLCBqICs9IGNuICkgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmID0ga3hba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IGYqbG9hZF9tYWNybyhzW2pdICsgc1stal0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczEgKz0gZipsb2FkX21hY3JvKHNbaisxXSArIHNbLWorMV0pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMiArPSBmKmxvYWRfbWFjcm8oc1tqKzJdICsgc1staisyXSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMzICs9IGYqbG9hZF9tYWNybyhzW2orM10gKyBzWy1qKzNdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gKGRzdHR5cGUpczA7IGRzdFtpKzFdID0gKGRzdHR5cGUpczE7ICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsyXSA9IChkc3R0eXBlKXMyOyBkc3RbaSszXSA9IChkc3R0eXBlKXMzOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKywgcysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHMwID0gKGRvdWJsZSlreFswXSpsb2FkX21hY3JvKHNbMF0pOyAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAxLCBqID0gY247IGsgPD0ga3NpemUyOyBrKyssIGogKz0gY24gKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCArPSAoZG91YmxlKWt4W2tdKmxvYWRfbWFjcm8oc1tqXSArIHNbLWpdKTsgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gKGRzdHR5cGUpczA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQsIHMgKz0gNCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgczAgPSAwLCBzMSA9IDAsIHMyID0gMCwgczMgPSAwOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDEsIGogPSBjbjsgayA8PSBrc2l6ZTI7IGsrKywgaiArPSBjbiApICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGYgPSBreFtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCArPSBmKmxvYWRfbWFjcm8oc1tqXSAtIHNbLWpdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMxICs9IGYqbG9hZF9tYWNybyhzW2orMV0gLSBzWy1qKzFdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczIgKz0gZipsb2FkX21hY3JvKHNbaisyXSAtIHNbLWorMl0pOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMyArPSBmKmxvYWRfbWFjcm8oc1tqKzNdIC0gc1staiszXSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChkc3R0eXBlKXMwOyBkc3RbaSsxXSA9IChkc3R0eXBlKXMxOyAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMl0gPSAoZHN0dHlwZSlzMjsgZHN0W2krM10gPSAoZHN0dHlwZSlzMzsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKyssIHMrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSBzMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBrID0gMSwgaiA9IGNuOyBrIDw9IGtzaXplMjsgaysrLCBqICs9IGNuICkgICAgICAgICBcCisgICAgICAgICAgICAgICAgczAgKz0gKGRvdWJsZSlreFtrXSpsb2FkX21hY3JvKHNbal0gLSBzWy1qXSk7ICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChkc3R0eXBlKXMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfRklMVEVSX1JPV19TWU1NKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0ZJTFRFUl9ST1dfU1lNTSggMTZzMzJmLCBzaG9ydCwgZmxvYXQsIENWX05PUCApCitJQ1ZfRklMVEVSX1JPV19TWU1NKCAxNnUzMmYsIHVzaG9ydCwgZmxvYXQsIENWX05PUCApCisKK3N0YXRpYyB2b2lkCitpY3ZGaWx0ZXJSb3dTeW1tXzMyZiggY29uc3QgZmxvYXQqIHNyYywgZmxvYXQqIGRzdCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t4ID0gc3RhdGUtPmdldF94X2tlcm5lbCgpOworICAgIGNvbnN0IGZsb2F0KiBreCA9IF9reC0+ZGF0YS5mbDsKKyAgICBpbnQga3NpemUgPSBfa3gtPmNvbHMgKyBfa3gtPnJvd3MgLSAxOworICAgIGludCBpID0gMCwgaiwgaywgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7CisgICAgaW50IGtzaXplMiA9IGtzaXplLzIsIGtzaXplMm4gPSBrc2l6ZTIqY247CisgICAgaW50IGlzX3N5bW0gPSBzdGF0ZS0+Z2V0X3hfa2VybmVsX2ZsYWdzKCkgJiBDdlNlcEZpbHRlcjo6U1lNTUVUUklDQUw7CisgICAgY29uc3QgZmxvYXQqIHMgPSBzcmMgKyBrc2l6ZTJuOworCisgICAga3ggKz0ga3NpemUyOworICAgIHdpZHRoICo9IGNuOworCisgICAgaWYoIGlzX3N5bW0gKQorICAgIHsKKyAgICAgICAgaWYoIGtzaXplID09IDMgJiYgZmFicyhreFswXS0yLikgPD0gRkxUX0VQU0lMT04gJiYgZmFicyhreFsxXS0xLikgPD0gRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIsIHMgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgczAgPSBzWy1jbl0gKyBzWzBdKjIgKyBzW2NuXSwgczEgPSBzWzEtY25dICsgc1sxXSoyICsgc1sxK2NuXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZigga3NpemUgPT0gMyAmJiBmYWJzKGt4WzBdLTEwLikgPD0gRkxUX0VQU0lMT04gJiYgZmFicyhreFsxXS0zLikgPD0gRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIsIHMgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgczAgPSBzWzBdKjEwICsgKHNbLWNuXSArIHNbY25dKSozLCBzMSA9IHNbMV0qMTAgKyAoc1sxLWNuXSArIHNbMStjbl0pKjM7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0LCBzICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBmID0ga3hbMF07CisgICAgICAgICAgICAgICAgZG91YmxlIHMwID0gZipzWzBdLCBzMSA9IGYqc1sxXSwgczIgPSBmKnNbMl0sIHMzID0gZipzWzNdOworICAgICAgICAgICAgICAgIGZvciggayA9IDEsIGogPSBjbjsgayA8PSBrc2l6ZTI7IGsrKywgaiArPSBjbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmID0ga3hba107CisgICAgICAgICAgICAgICAgICAgIHMwICs9IGYqKHNbal0gKyBzWy1qXSk7IHMxICs9IGYqKHNbaisxXSArIHNbLWorMV0pOworICAgICAgICAgICAgICAgICAgICBzMiArPSBmKihzW2orMl0gKyBzWy1qKzJdKTsgczMgKz0gZiooc1tqKzNdICsgc1staiszXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOyBkc3RbaSsxXSA9IChmbG9hdClzMTsKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IChmbG9hdClzMjsgZHN0W2krM10gPSAoZmxvYXQpczM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrLCBzKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgczAgPSAoZG91YmxlKWt4WzBdKnNbMF07CisgICAgICAgICAgICBmb3IoIGsgPSAxLCBqID0gY247IGsgPD0ga3NpemUyOyBrKyssIGogKz0gY24gKQorICAgICAgICAgICAgICAgIHMwICs9IChkb3VibGUpa3hba10qKHNbal0gKyBzWy1qXSk7CisgICAgICAgICAgICBkc3RbaV0gPSAoZmxvYXQpczA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGtzaXplID09IDMgJiYgZmFicyhreFswXSkgPD0gRkxUX0VQU0lMT04gJiYgZmFicyhreFsxXS0xLikgPD0gRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIsIHMgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgczAgPSBzW2NuXSAtIHNbLWNuXSwgczEgPSBzWzErY25dIC0gc1sxLWNuXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQsIHMgKz0gNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxLCBqID0gY247IGsgPD0ga3NpemUyOyBrKyssIGogKz0gY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGYgPSBreFtrXTsKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gZiooc1tqXSAtIHNbLWpdKTsgczEgKz0gZiooc1tqKzFdIC0gc1staisxXSk7CisgICAgICAgICAgICAgICAgICAgIHMyICs9IGYqKHNbaisyXSAtIHNbLWorMl0pOyBzMyArPSBmKihzW2orM10gLSBzWy1qKzNdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAoZmxvYXQpczA7IGRzdFtpKzFdID0gKGZsb2F0KXMxOworICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gKGZsb2F0KXMyOyBkc3RbaSszXSA9IChmbG9hdClzMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKyssIHMrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzMCA9IChkb3VibGUpa3hbMF0qc1swXTsKKyAgICAgICAgICAgIGZvciggayA9IDEsIGogPSBjbjsgayA8PSBrc2l6ZTI7IGsrKywgaiArPSBjbiApCisgICAgICAgICAgICAgICAgczAgKz0gKGRvdWJsZSlreFtrXSooc1tqXSAtIHNbLWpdKTsKKyAgICAgICAgICAgIGRzdFtpXSA9IChmbG9hdClzMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2RmlsdGVyQ29sU3ltbV8zMnM4dSggY29uc3QgaW50Kiogc3JjLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t5ID0gc3RhdGUtPmdldF95X2tlcm5lbCgpOworICAgIGNvbnN0IGludCoga3kgPSBfa3ktPmRhdGEuaTsKKyAgICBpbnQga3NpemUgPSBfa3ktPmNvbHMgKyBfa3ktPnJvd3MgLSAxLCBrc2l6ZTIgPSBrc2l6ZS8yOworICAgIGludCBpLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsKKworICAgIHdpZHRoICo9IGNuOworICAgIHNyYyArPSBrc2l6ZTI7CisgICAga3kgKz0ga3NpemUyOworCisgICAgZm9yKCA7IGNvdW50LS07IGRzdCArPSBkc3Rfc3RlcCwgc3JjKysgKQorICAgIHsKKyAgICAgICAgaWYoIGtzaXplID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQqIHNwdHIwID0gc3JjWy0xXSwgKnNwdHIxID0gc3JjWzBdLCAqc3B0cjIgPSBzcmNbMV07CisgICAgICAgICAgICBpbnQgazAgPSBreVswXSwgazEgPSBreVsxXTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IHNwdHIxW2ldKmswICsgKHNwdHIwW2ldICsgc3B0cjJbaV0pKmsxOworICAgICAgICAgICAgICAgIGludCBzMSA9IHNwdHIxW2krMV0qazAgKyAoc3B0cjBbaSsxXSArIHNwdHIyW2krMV0pKmsxOworICAgICAgICAgICAgICAgIHMwID0gQ1ZfREVTQ0FMRShzMCwgRklMVEVSX0JJVFMqMik7CisgICAgICAgICAgICAgICAgczEgPSBDVl9ERVNDQUxFKHMxLCBGSUxURVJfQklUUyoyKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAodWNoYXIpczA7IGRzdFtpKzFdID0gKHVjaGFyKXMxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGtzaXplID09IDUgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQqIHNwdHIwID0gc3JjWy0yXSwgKnNwdHIxID0gc3JjWy0xXSwKKyAgICAgICAgICAgICAgICAqc3B0cjIgPSBzcmNbMF0sICpzcHRyMyA9IHNyY1sxXSwgKnNwdHI0ID0gc3JjWzJdOworICAgICAgICAgICAgaW50IGswID0ga3lbMF0sIGsxID0ga3lbMV0sIGsyID0ga3lbMl07CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzcHRyMltpXSprMCArIChzcHRyMVtpXSArIHNwdHIzW2ldKSprMSArIChzcHRyMFtpXSArIHNwdHI0W2ldKSprMjsKKyAgICAgICAgICAgICAgICBpbnQgczEgPSBzcHRyMltpKzFdKmswICsgKHNwdHIxW2krMV0gKyBzcHRyM1tpKzFdKSprMSArIChzcHRyMFtpKzFdICsgc3B0cjRbaSsxXSkqazI7CisgICAgICAgICAgICAgICAgczAgPSBDVl9ERVNDQUxFKHMwLCBGSUxURVJfQklUUyoyKTsKKyAgICAgICAgICAgICAgICBzMSA9IENWX0RFU0NBTEUoczEsIEZJTFRFUl9CSVRTKjIpOworICAgICAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcilzMDsgZHN0W2krMV0gPSAodWNoYXIpczE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGYgPSBreVswXTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHNwdHIgPSBzcmNbMF0gKyBpLCAqc3B0cjI7CisgICAgICAgICAgICAgICAgaW50IHMwID0gZipzcHRyWzBdLCBzMSA9IGYqc3B0clsxXSwgczIgPSBmKnNwdHJbMl0sIHMzID0gZipzcHRyWzNdOworICAgICAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7CisgICAgICAgICAgICAgICAgICAgIHNwdHIyID0gc3JjWy1rXSArIGk7CisgICAgICAgICAgICAgICAgICAgIGYgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gZiooc3B0clswXSArIHNwdHIyWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gZiooc3B0clsxXSArIHNwdHIyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gZiooc3B0clsyXSArIHNwdHIyWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgczMgKz0gZiooc3B0clszXSArIHNwdHIyWzNdKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzMCA9IENWX0RFU0NBTEUoczAsIEZJTFRFUl9CSVRTKjIpOworICAgICAgICAgICAgICAgIHMxID0gQ1ZfREVTQ0FMRShzMSwgRklMVEVSX0JJVFMqMik7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gKHVjaGFyKXMwOyBkc3RbaSsxXSA9ICh1Y2hhcilzMTsKKyAgICAgICAgICAgICAgICBzMiA9IENWX0RFU0NBTEUoczIsIEZJTFRFUl9CSVRTKjIpOworICAgICAgICAgICAgICAgIHMzID0gQ1ZfREVTQ0FMRShzMywgRklMVEVSX0JJVFMqMik7CisgICAgICAgICAgICAgICAgZHN0W2krMl0gPSAodWNoYXIpczI7IGRzdFtpKzNdID0gKHVjaGFyKXMzOworICAgICAgICAgICAgfQorCisgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzMCA9IGt5WzBdKnNyY1swXVtpXTsKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKQorICAgICAgICAgICAgICAgIHMwICs9IGt5W2tdKihzcmNba11baV0gKyBzcmNbLWtdW2ldKTsKKworICAgICAgICAgICAgczAgPSBDVl9ERVNDQUxFKHMwLCBGSUxURVJfQklUUyoyKTsKKyAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcilzMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2RmlsdGVyQ29sU3ltbV8zMnMxNnMoIGNvbnN0IGludCoqIHNyYywgc2hvcnQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsKKyAgICBjb25zdCBDdk1hdCogX2t5ID0gc3RhdGUtPmdldF95X2tlcm5lbCgpOworICAgIGNvbnN0IGludCoga3kgPSAoY29uc3QgaW50Kilfa3ktPmRhdGEucHRyOworICAgIGludCBrc2l6ZSA9IF9reS0+Y29scyArIF9reS0+cm93cyAtIDEsIGtzaXplMiA9IGtzaXplLzI7CisgICAgaW50IGkgPSAwLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsKKyAgICBpbnQgaXNfc3ltbSA9IHN0YXRlLT5nZXRfeV9rZXJuZWxfZmxhZ3MoKSAmIEN2U2VwRmlsdGVyOjpTWU1NRVRSSUNBTDsKKyAgICBpbnQgaXNfMV8yXzEgPSBpc19zeW1tICYmIGtzaXplID09IDMgJiYga3lbMV0gPT0gMiAmJiBreVsyXSA9PSAxOworICAgIGludCBpc18zXzEwXzMgPSBpc19zeW1tICYmIGtzaXplID09IDMgJiYga3lbMV0gPT0gMTAgJiYga3lbMl0gPT0gMzsKKyAgICBpbnQgaXNfbTFfMF8xID0gIWlzX3N5bW0gJiYga3NpemUgPT0gMyAmJiBreVsxXSA9PSAwICYmCisgICAgICAgIGt5WzJdKmt5WzJdID09IDEgPyAoa3lbMl0gPiAwID8gMSA6IC0xKSA6IDA7CisKKyAgICB3aWR0aCAqPSBjbjsKKyAgICBzcmMgKz0ga3NpemUyOworICAgIGt5ICs9IGtzaXplMjsKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKworICAgIGlmKCBpc19zeW1tICkKKyAgICB7CisgICAgICAgIGZvciggOyBjb3VudC0tOyBkc3QgKz0gZHN0X3N0ZXAsIHNyYysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlzXzFfMl8xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnNyYzAgPSBzcmNbLTFdLCAqc3JjMSA9IHNyY1swXSwgKnNyYzIgPSBzcmNbMV07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNyYzBbaV0gKyBzcmMxW2ldKjIgKyBzcmMyW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBzcmMwW2krMV0gKyBzcmMxW2krMV0qMiArIHNyYzJbaSsxXTsKKworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGlzXzNfMTBfMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50ICpzcmMwID0gc3JjWy0xXSwgKnNyYzEgPSBzcmNbMF0sICpzcmMyID0gc3JjWzFdOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSBzcmMxW2ldKjEwICsgKHNyYzBbaV0gKyBzcmMyW2ldKSozLAorICAgICAgICAgICAgICAgICAgICAgICAgczEgPSBzcmMxW2krMV0qMTAgKyAoc3JjMFtpKzFdICsgc3JjMltpKzFdKSozOworCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IChzaG9ydClzMDsgZHN0W2krMV0gPSAoc2hvcnQpczE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGYgPSBreVswXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzcHRyID0gc3JjWzBdICsgaSwgKnNwdHIyOworICAgICAgICAgICAgICAgICAgICBpbnQgczAgPSBmKnNwdHJbMF0sIHMxID0gZipzcHRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgczIgPSBmKnNwdHJbMl0sIHMzID0gZipzcHRyWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7IHNwdHIyID0gc3JjWy1rXSArIGk7IGYgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IGYqKHNwdHJbMF0gKyBzcHRyMlswXSk7IHMxICs9IGYqKHNwdHJbMV0gKyBzcHRyMlsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiArPSBmKihzcHRyWzJdICsgc3B0cjJbMl0pOyBzMyArPSBmKihzcHRyWzNdICsgc3B0cjJbM10pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gQ1ZfQ0FTVF8xNlMoczApOyBkc3RbaSsxXSA9IENWX0NBU1RfMTZTKHMxKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2krMl0gPSBDVl9DQVNUXzE2UyhzMik7IGRzdFtpKzNdID0gQ1ZfQ0FTVF8xNlMoczMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBreVswXSpzcmNbMF1baV07CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMTsgayA8PSBrc2l6ZTI7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHMwICs9IGt5W2tdKihzcmNba11baV0gKyBzcmNbLWtdW2ldKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBDVl9DQVNUXzE2UyhzMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCA7IGNvdW50LS07IGRzdCArPSBkc3Rfc3RlcCwgc3JjKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaXNfbTFfMF8xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgKnNyYzAgPSBzcmNbLWlzX20xXzBfMV0sICpzcmMyID0gc3JjW2lzX20xXzBfMV07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IHNyYzJbaV0gLSBzcmMwW2ldLCBzMSA9IHNyYzJbaSsxXSAtIHNyYzBbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKHNob3J0KXMwOyBkc3RbaSsxXSA9IChzaG9ydClzMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgZiA9IGt5WzBdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHNwdHIgPSBzcmNbMF0gKyBpLCAqc3B0cjI7CisgICAgICAgICAgICAgICAgICAgIGludCBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHRyID0gc3JjW2tdICsgaTsgc3B0cjIgPSBzcmNbLWtdICsgaTsgZiA9IGt5W2tdOworICAgICAgICAgICAgICAgICAgICAgICAgczAgKz0gZiooc3B0clswXSAtIHNwdHIyWzBdKTsgczEgKz0gZiooc3B0clsxXSAtIHNwdHIyWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMyICs9IGYqKHNwdHJbMl0gLSBzcHRyMlsyXSk7IHMzICs9IGYqKHNwdHJbM10gLSBzcHRyMlszXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSBDVl9DQVNUXzE2UyhzMCk7IGRzdFtpKzFdID0gQ1ZfQ0FTVF8xNlMoczEpOworICAgICAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IENWX0NBU1RfMTZTKHMyKTsgZHN0W2krM10gPSBDVl9DQVNUXzE2UyhzMyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IGt5WzBdKnNyY1swXVtpXTsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgczAgKz0ga3lba10qKHNyY1trXVtpXSAtIHNyY1sta11baV0pOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IENWX0NBU1RfMTZTKHMwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCisjZGVmaW5lIElDVl9GSUxURVJfQ09MKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIHdvcmt0eXBlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybzEsIGNhc3RfbWFjcm8yICkgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZGaWx0ZXJDb2xfIyNmbGF2b3IoIGNvbnN0IHNyY3R5cGUqKiBzcmMsIGRzdHR5cGUqIGRzdCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgQ3ZTZXBGaWx0ZXIqIHN0YXRlID0gKGNvbnN0IEN2U2VwRmlsdGVyKilwYXJhbXM7ICAgICAgXAorICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBzcmN0eXBlKiBreSA9IChjb25zdCBzcmN0eXBlKilfa3ktPmRhdGEucHRyOyAgICAgICAgICBcCisgICAgaW50IGtzaXplID0gX2t5LT5jb2xzICsgX2t5LT5yb3dzIC0gMTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBjb3VudC0tOyBkc3QgKz0gZHN0X3N0ZXAsIHNyYysrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSBmID0ga3lbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBzcmN0eXBlKiBzcHRyID0gc3JjWzBdICsgaTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHMwID0gZipzcHRyWzBdLCBzMSA9IGYqc3B0clsxXSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBzMiA9IGYqc3B0clsyXSwgczMgPSBmKnNwdHJbM107ICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBrID0gMTsgayA8IGtzaXplOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7IGYgPSBreVtrXTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IGYqc3B0clswXTsgczEgKz0gZipzcHRyWzFdOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMiArPSBmKnNwdHJbMl07IHMzICs9IGYqc3B0clszXTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEoczApOyB0MSA9IGNhc3RfbWFjcm8xKHMxKTsgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV09Y2FzdF9tYWNybzIodDApOyBkc3RbaSsxXT1jYXN0X21hY3JvMih0MSk7ICAgXAorICAgICAgICAgICAgdDAgPSBjYXN0X21hY3JvMShzMik7IHQxID0gY2FzdF9tYWNybzEoczMpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdPWNhc3RfbWFjcm8yKHQwKTsgZHN0W2krM109Y2FzdF9tYWNybzIodDEpOyBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHMwID0gKGRvdWJsZSlreVswXSpzcmNbMF1baV07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDwga3NpemU7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IChkb3VibGUpa3lba10qc3JjW2tdW2ldOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvMih0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0ZJTFRFUl9DT0woIDMyZjh1LCBmbG9hdCwgdWNoYXIsIGludCwgY3ZSb3VuZCwgQ1ZfQ0FTVF84VSApCitJQ1ZfRklMVEVSX0NPTCggMzJmMTZzLCBmbG9hdCwgc2hvcnQsIGludCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMgKQorSUNWX0ZJTFRFUl9DT0woIDMyZjE2dSwgZmxvYXQsIHVzaG9ydCwgaW50LCBjdlJvdW5kLCBDVl9DQVNUXzE2VSApCisKKyNkZWZpbmUgSUNWX0ZJTFRFUl9DT0xfU1lNTSggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCB3b3JrdHlwZSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvMSwgY2FzdF9tYWNybzIgKSAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkZpbHRlckNvbFN5bW1fIyNmbGF2b3IoIGNvbnN0IHNyY3R5cGUqKiBzcmMsIGRzdHR5cGUqIGRzdCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBDdlNlcEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZTZXBGaWx0ZXIqKXBhcmFtczsgICAgICAgICAgXAorICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3Qgc3JjdHlwZSoga3kgPSAoY29uc3Qgc3JjdHlwZSopX2t5LT5kYXRhLnB0cjsgICAgICAgICAgICAgIFwKKyAgICBpbnQga3NpemUgPSBfa3ktPmNvbHMgKyBfa3ktPnJvd3MgLSAxLCBrc2l6ZTIgPSBrc2l6ZS8yOyAgICAgICAgXAorICAgIGludCBpLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaXNfc3ltbSA9IHN0YXRlLT5nZXRfeV9rZXJuZWxfZmxhZ3MoKSAmIEN2U2VwRmlsdGVyOjpTWU1NRVRSSUNBTDtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBrc2l6ZTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga3kgKz0ga3NpemUyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGlzX3N5bW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgY291bnQtLTsgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGYgPSBreVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlKiBzcHRyID0gc3JjWzBdICsgaSwgKnNwdHIyOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IGYqc3B0clswXSwgczEgPSBmKnNwdHJbMV0sICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHMyID0gZipzcHRyWzJdLCBzMyA9IGYqc3B0clszXTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzcHRyMiA9IHNyY1sta10gKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGYgPSBreVtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gZiooc3B0clswXSArIHNwdHIyWzBdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMSArPSBmKihzcHRyWzFdICsgc3B0cjJbMV0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMyICs9IGYqKHNwdHJbMl0gKyBzcHRyMlsyXSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczMgKz0gZiooc3B0clszXSArIHNwdHIyWzNdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IGNhc3RfbWFjcm8xKHMwKTsgdDEgPSBjYXN0X21hY3JvMShzMSk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpXT1jYXN0X21hY3JvMih0MCk7IGRzdFtpKzFdPWNhc3RfbWFjcm8yKHQxKTsgICBcCisgICAgICAgICAgICAgICAgdDAgPSBjYXN0X21hY3JvMShzMik7IHQxID0gY2FzdF9tYWNybzEoczMpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsyXT1jYXN0X21hY3JvMih0MCk7IGRzdFtpKzNdPWNhc3RfbWFjcm8yKHQxKTsgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIHMwID0gKGRvdWJsZSlreVswXSpzcmNbMF1baV07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDE7IGsgPD0ga3NpemUyOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IChkb3VibGUpa3lba10qKHNyY1trXVtpXSArIHNyY1sta11baV0pOyAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IGNhc3RfbWFjcm8xKHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8yKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgY291bnQtLTsgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGYgPSBreVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlKiBzcHRyID0gc3JjWzBdICsgaSwgKnNwdHIyOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdDAsIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNwdHIgPSBzcmNba10gKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3B0cjIgPSBzcmNbLWtdICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmID0ga3lba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IGYqKHNwdHJbMF0gLSBzcHRyMlswXSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gZiooc3B0clsxXSAtIHNwdHIyWzFdKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiArPSBmKihzcHRyWzJdIC0gc3B0cjJbMl0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMzICs9IGYqKHNwdHJbM10gLSBzcHRyMlszXSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBjYXN0X21hY3JvMShzMCk7IHQxID0gY2FzdF9tYWNybzEoczEpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV09Y2FzdF9tYWNybzIodDApOyBkc3RbaSsxXT1jYXN0X21hY3JvMih0MSk7ICAgXAorICAgICAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEoczIpOyB0MSA9IGNhc3RfbWFjcm8xKHMzKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMl09Y2FzdF9tYWNybzIodDApOyBkc3RbaSszXT1jYXN0X21hY3JvMih0MSk7IFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IChkb3VibGUpa3lbMF0qc3JjWzBdW2ldOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCArPSAoZG91YmxlKWt5W2tdKihzcmNba11baV0gLSBzcmNbLWtdW2ldKTsgICBcCisgICAgICAgICAgICAgICAgdDAgPSBjYXN0X21hY3JvMShzMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvMih0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9GSUxURVJfQ09MX1NZTU0oIDMyZjh1LCBmbG9hdCwgdWNoYXIsIGludCwgY3ZSb3VuZCwgQ1ZfQ0FTVF84VSApCitJQ1ZfRklMVEVSX0NPTF9TWU1NKCAzMmYxNnMsIGZsb2F0LCBzaG9ydCwgaW50LCBjdlJvdW5kLCBDVl9DQVNUXzE2UyApCitJQ1ZfRklMVEVSX0NPTF9TWU1NKCAzMmYxNnUsIGZsb2F0LCB1c2hvcnQsIGludCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUgKQorCisKK3N0YXRpYyB2b2lkCitpY3ZGaWx0ZXJDb2xfMzJmKCBjb25zdCBmbG9hdCoqIHNyYywgZmxvYXQqIGRzdCwKKyAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKQoreworICAgIGNvbnN0IEN2U2VwRmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdlNlcEZpbHRlciopcGFyYW1zOworICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7CisgICAgY29uc3QgZmxvYXQqIGt5ID0gKGNvbnN0IGZsb2F0Kilfa3ktPmRhdGEucHRyOworICAgIGludCBrc2l6ZSA9IF9reS0+Y29scyArIF9reS0+cm93cyAtIDE7CisgICAgaW50IGksIGssIHdpZHRoID0gc3RhdGUtPmdldF93aWR0aCgpOworICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOworCisgICAgd2lkdGggKj0gY247CisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBmb3IoIDsgY291bnQtLTsgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGYgPSBreVswXTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcHRyID0gc3JjWzBdICsgaTsKKyAgICAgICAgICAgIGRvdWJsZSBzMCA9IGYqc3B0clswXSwgczEgPSBmKnNwdHJbMV0sCisgICAgICAgICAgICAgICAgICAgczIgPSBmKnNwdHJbMl0sIHMzID0gZipzcHRyWzNdOworICAgICAgICAgICAgZm9yKCBrID0gMTsgayA8IGtzaXplOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwdHIgPSBzcmNba10gKyBpOyBmID0ga3lba107CisgICAgICAgICAgICAgICAgczAgKz0gZipzcHRyWzBdOyBzMSArPSBmKnNwdHJbMV07CisgICAgICAgICAgICAgICAgczIgKz0gZipzcHRyWzJdOyBzMyArPSBmKnNwdHJbM107CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdFtpXSA9IChmbG9hdClzMDsgZHN0W2krMV0gPSAoZmxvYXQpczE7CisgICAgICAgICAgICBkc3RbaSsyXSA9IChmbG9hdClzMjsgZHN0W2krM10gPSAoZmxvYXQpczM7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgczAgPSAoZG91YmxlKWt5WzBdKnNyY1swXVtpXTsKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPCBrc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICBzMCArPSAoZG91YmxlKWt5W2tdKnNyY1trXVtpXTsKKyAgICAgICAgICAgIGRzdFtpXSA9IChmbG9hdClzMDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2RmlsdGVyQ29sU3ltbV8zMmYoIGNvbnN0IGZsb2F0Kiogc3JjLCBmbG9hdCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKQoreworICAgIGNvbnN0IEN2U2VwRmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdlNlcEZpbHRlciopcGFyYW1zOworICAgIGNvbnN0IEN2TWF0KiBfa3kgPSBzdGF0ZS0+Z2V0X3lfa2VybmVsKCk7CisgICAgY29uc3QgZmxvYXQqIGt5ID0gKGNvbnN0IGZsb2F0Kilfa3ktPmRhdGEucHRyOworICAgIGludCBrc2l6ZSA9IF9reS0+Y29scyArIF9reS0+cm93cyAtIDEsIGtzaXplMiA9IGtzaXplLzI7CisgICAgaW50IGkgPSAwLCBrLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsKKyAgICBpbnQgaXNfc3ltbSA9IHN0YXRlLT5nZXRfeV9rZXJuZWxfZmxhZ3MoKSAmIEN2U2VwRmlsdGVyOjpTWU1NRVRSSUNBTDsKKyAgICBpbnQgaXNfMV8yXzEgPSBpc19zeW1tICYmIGtzaXplID09IDMgJiYKKyAgICAgICAgZmFicyhreVsxXSAtIDIuKSA8PSBGTFRfRVBTSUxPTiAmJiBmYWJzKGt5WzJdIC0gMS4pIDw9IEZMVF9FUFNJTE9OOworICAgIGludCBpc18zXzEwXzMgPSBpc19zeW1tICYmIGtzaXplID09IDMgJiYKKyAgICAgICAgICAgIGZhYnMoa3lbMV0gLSAxMC4pIDw9IEZMVF9FUFNJTE9OICYmIGZhYnMoa3lbMl0gLSAzLikgPD0gRkxUX0VQU0lMT047CisgICAgaW50IGlzX20xXzBfMSA9ICFpc19zeW1tICYmIGtzaXplID09IDMgJiYKKyAgICAgICAgICAgIGZhYnMoa3lbMV0pIDw9IEZMVF9FUFNJTE9OICYmIGZhYnMoa3lbMl0qa3lbMl0gLSAxLikgPD0gRkxUX0VQU0lMT04gPworICAgICAgICAgICAgKGt5WzJdID4gMCA/IDEgOiAtMSkgOiAwOworCisgICAgd2lkdGggKj0gY247CisgICAgc3JjICs9IGtzaXplMjsKKyAgICBreSArPSBrc2l6ZTI7CisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBpZiggaXNfc3ltbSApCisgICAgeworICAgICAgICBmb3IoIDsgY291bnQtLTsgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpc18xXzJfMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzAgPSBzcmNbLTFdLCAqc3JjMSA9IHNyY1swXSwgKnNyYzIgPSBzcmNbMV07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHMwID0gc3JjMFtpXSArIHNyYzFbaV0qMiArIHNyYzJbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMxID0gc3JjMFtpKzFdICsgc3JjMVtpKzFdKjIgKyBzcmMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gc3JjMFtpKzJdICsgc3JjMVtpKzJdKjIgKyBzcmMyW2krMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMzID0gc3JjMFtpKzNdICsgc3JjMVtpKzNdKjIgKyBzcmMyW2krM107CisKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gczA7IGRzdFtpKzFdID0gczE7CisgICAgICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gczI7IGRzdFtpKzNdID0gczM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggaXNfM18xMF8zICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqc3JjMCA9IHNyY1stMV0sICpzcmMxID0gc3JjWzBdLCAqc3JjMiA9IHNyY1sxXTsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgczAgPSBzcmMxW2ldKjEwICsgKHNyYzBbaV0gKyBzcmMyW2ldKSozLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHNyYzFbaSsxXSoxMCArIChzcmMwW2krMV0gKyBzcmMyW2krMV0pKjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHMyID0gc3JjMVtpKzJdKjEwICsgKHNyYzBbaSsyXSArIHNyYzJbaSsyXSkqMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgczMgPSBzcmMxW2krM10qMTAgKyAoc3JjMFtpKzNdICsgc3JjMltpKzNdKSozOworCisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IHMyOyBkc3RbaSszXSA9IHMzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmID0ga3lbMF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcHRyID0gc3JjWzBdICsgaSwgKnNwdHIyOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgczAgPSBmKnNwdHJbMF0sIHMxID0gZipzcHRyWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgczIgPSBmKnNwdHJbMl0sIHMzID0gZipzcHRyWzNdOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7IHNwdHIyID0gc3JjWy1rXSArIGk7IGYgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IGYqKHNwdHJbMF0gKyBzcHRyMlswXSk7IHMxICs9IGYqKHNwdHJbMV0gKyBzcHRyMlsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiArPSBmKihzcHRyWzJdICsgc3B0cjJbMl0pOyBzMyArPSBmKihzcHRyWzNdICsgc3B0cjJbM10pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOyBkc3RbaSsxXSA9IChmbG9hdClzMTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2krMl0gPSAoZmxvYXQpczI7IGRzdFtpKzNdID0gKGZsb2F0KXMzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgczAgPSAoZG91YmxlKWt5WzBdKnNyY1swXVtpXTsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gKGRvdWJsZSlreVtrXSooc3JjW2tdW2ldICsgc3JjWy1rXVtpXSk7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciggOyBjb3VudC0tOyBkc3QgKz0gZHN0X3N0ZXAsIHNyYysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlzX20xXzBfMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKnNyYzAgPSBzcmNbLWlzX20xXzBfMV0sICpzcmMyID0gc3JjW2lzX20xXzBfMV07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHMwID0gc3JjMltpXSAtIHNyYzBbaV0sIHMxID0gc3JjMltpKzFdIC0gc3JjMFtpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzMiA9IHNyYzJbaSsyXSAtIHNyYzBbaSsyXSwgczMgPSBzcmMyW2krM10gLSBzcmMwW2krM107CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IHMwOyBkc3RbaSsxXSA9IHMxOworICAgICAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IHMyOyBkc3RbaSszXSA9IHMzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmID0ga3lbMF07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcHRyID0gc3JjWzBdICsgaSwgKnNwdHIyOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgczAgPSAwLCBzMSA9IDAsIHMyID0gMCwgczMgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3B0ciA9IHNyY1trXSArIGk7IHNwdHIyID0gc3JjWy1rXSArIGk7IGYgPSBreVtrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IGYqKHNwdHJbMF0gLSBzcHRyMlswXSk7IHMxICs9IGYqKHNwdHJbMV0gLSBzcHRyMlsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzMiArPSBmKihzcHRyWzJdIC0gc3B0cjJbMl0pOyBzMyArPSBmKihzcHRyWzNdIC0gc3B0cjJbM10pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOyBkc3RbaSsxXSA9IChmbG9hdClzMTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2krMl0gPSAoZmxvYXQpczI7IGRzdFtpKzNdID0gKGZsb2F0KXMzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgczAgPSAoZG91YmxlKWt5WzBdKnNyY1swXVtpXTsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDw9IGtzaXplMjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gKGRvdWJsZSlreVtrXSooc3JjW2tdW2ldIC0gc3JjWy1rXVtpXSk7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKyNkZWZpbmUgU01BTExfR0FVU1NJQU5fU0laRSAgNworCit2b2lkIEN2U2VwRmlsdGVyOjppbml0X2dhdXNzaWFuX2tlcm5lbCggQ3ZNYXQqIGtlcm5lbCwgZG91YmxlIHNpZ21hICkKK3sKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc21hbGxfZ2F1c3NpYW5fdGFiW11bU01BTExfR0FVU1NJQU5fU0laRS8yKzFdID0KKyAgICB7CisgICAgICAgIHsxLmZ9LAorICAgICAgICB7MC41ZiwgMC4yNWZ9LAorICAgICAgICB7MC4zNzVmLCAwLjI1ZiwgMC4wNjI1Zn0sCisgICAgICAgIHswLjI4MTI1ZiwgMC4yMTg3NWYsIDAuMTA5Mzc1ZiwgMC4wMzEyNWZ9CisgICAgfTsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTZXBGaWx0ZXI6OmluaXRfZ2F1c3NpYW5fa2VybmVsIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGksIG4sIHN0ZXA7CisgICAgY29uc3QgZmxvYXQqIGZpeGVkX2tlcm5lbCA9IDA7CisgICAgZG91YmxlIHNpZ21hWCwgc2NhbGUyWCwgc3VtOworICAgIGZsb2F0KiBjZjsKKyAgICBkb3VibGUqIGNkOworCisgICAgaWYoICFDVl9JU19NQVQoa2VybmVsKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJrZXJuZWwgaXMgbm90IGEgdmFsaWQgbWF0cml4IiApOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKGtlcm5lbC0+dHlwZSk7CisgICAgCisgICAgaWYoIChrZXJuZWwtPmNvbHMgIT0gMSAmJiBrZXJuZWwtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgKGtlcm5lbC0+Y29scyArIGtlcm5lbC0+cm93cyAtIDEpICUgMiA9PSAwIHx8CisgICAgICAgICh0eXBlICE9IENWXzMyRkMxICYmIHR5cGUgIT0gQ1ZfNjRGQzEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJrZXJuZWwgc2hvdWxkIGJlIDFEIGZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiBvZGQgKDIqaysxKSBzaXplIiApOworCisgICAgbiA9IGtlcm5lbC0+Y29scyArIGtlcm5lbC0+cm93cyAtIDE7CisKKyAgICBpZiggbiA8PSBTTUFMTF9HQVVTU0lBTl9TSVpFICYmIHNpZ21hIDw9IDAgKQorICAgICAgICBmaXhlZF9rZXJuZWwgPSBzbWFsbF9nYXVzc2lhbl90YWJbbj4+MV07CisKKyAgICBzaWdtYVggPSBzaWdtYSA+IDAgPyBzaWdtYSA6IChuLzIgLSAxKSowLjMgKyAwLjg7CisgICAgc2NhbGUyWCA9IC0wLjUvKHNpZ21hWCpzaWdtYVgpOworICAgIHN0ZXAgPSBrZXJuZWwtPnJvd3MgPT0gMSA/IDEgOiBrZXJuZWwtPnN0ZXAvQ1ZfRUxFTV9TSVpFMSh0eXBlKTsKKyAgICBjZiA9IGtlcm5lbC0+ZGF0YS5mbDsKKyAgICBjZCA9IGtlcm5lbC0+ZGF0YS5kYjsKKworICAgIHN1bSA9IGZpeGVkX2tlcm5lbCA/IC1maXhlZF9rZXJuZWxbMF0gOiAtMS47CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IG4vMjsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0ID0gZml4ZWRfa2VybmVsID8gKGRvdWJsZSlmaXhlZF9rZXJuZWxbaV0gOiBleHAoc2NhbGUyWCppKmkpOworICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNmWyhuLzIraSkqc3RlcF0gPSAoZmxvYXQpdDsKKyAgICAgICAgICAgIHN1bSArPSBjZlsobi8yK2kpKnN0ZXBdKjI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjZFsobi8yK2kpKnN0ZXBdID0gdDsKKyAgICAgICAgICAgIHN1bSArPSBjZFsobi8yK2kpKnN0ZXBdKjI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdW0gPSAxLi9zdW07CisgICAgZm9yKCBpID0gMDsgaSA8PSBuLzI7IGkrKyApCisgICAgeworICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICBjZlsobi8yK2kpKnN0ZXBdID0gY2ZbKG4vMi1pKSpzdGVwXSA9IChmbG9hdCkoY2ZbKG4vMitpKSpzdGVwXSpzdW0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjZFsobi8yK2kpKnN0ZXBdID0gY2RbKG4vMi1pKSpzdGVwXSA9IGNkWyhuLzIraSkqc3RlcF0qc3VtOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdlNlcEZpbHRlcjo6aW5pdF9zb2JlbF9rZXJuZWwoIEN2TWF0KiBfa3gsIEN2TWF0KiBfa3ksIGludCBkeCwgaW50IGR5LCBpbnQgZmxhZ3MgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTZXBGaWx0ZXI6OmluaXRfc29iZWxfa2VybmVsIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGosIGssIG1zejsKKyAgICBpbnQqIGtlckk7CisgICAgYm9vbCBub3JtYWxpemUgPSAoZmxhZ3MgJiBOT1JNQUxJWkVfS0VSTkVMKSAhPSAwOworICAgIGJvb2wgZmxpcCA9IChmbGFncyAmIEZMSVBfS0VSTkVMKSAhPSAwOworCisgICAgaWYoICFDVl9JU19NQVQoX2t4KSB8fCAhQ1ZfSVNfTUFUKF9reSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25lIG9mIHRoZSBrZXJuZWwgbWF0cmljZXMgaXMgbm90IHZhbGlkIiApOworCisgICAgbXN6ID0gTUFYKCBfa3gtPmNvbHMgKyBfa3gtPnJvd3MsIF9reS0+Y29scyArIF9reS0+cm93cyApOworICAgIGlmKCBtc3ogPiAzMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVG9vIGxhcmdlIGtlcm5lbCBzaXplIiApOworCisgICAga2VySSA9IChpbnQqKWN2U3RhY2tBbGxvYyggbXN6KnNpemVvZihrZXJJWzBdKSApOworCisgICAgaWYoIGR4IDwgMCB8fCBkeSA8IDAgfHwgZHgrZHkgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgIkJvdGggZGVyaXZhdGl2ZSBvcmRlcnMgKGR4IGFuZCBkeSkgbXVzdCBiZSBub24tbmVnYXRpdmUgIgorICAgICAgICAgICAgImFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlbSBtdXN0IGJlIHBvc2l0aXZlLiIgKTsKKworICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIGtlcm5lbCA9IGsgPT0gMCA/IF9reCA6IF9reTsKKyAgICAgICAgaW50IG9yZGVyID0gayA9PSAwID8gZHggOiBkeTsKKyAgICAgICAgaW50IG4gPSBrZXJuZWwtPmNvbHMgKyBrZXJuZWwtPnJvd3MgLSAxLCBzdGVwOworICAgICAgICBpbnQgdHlwZSA9IENWX01BVF9UWVBFKGtlcm5lbC0+dHlwZSk7CisgICAgICAgIGRvdWJsZSBzY2FsZSA9ICFub3JtYWxpemUgPyAxLiA6IDEuLygxIDw8IChuLW9yZGVyLTEpKTsKKyAgICAgICAgaW50IGlzY2FsZSA9IDE7CisKKyAgICAgICAgaWYoIChrZXJuZWwtPmNvbHMgIT0gMSAmJiBrZXJuZWwtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgICAgIChrZXJuZWwtPmNvbHMgKyBrZXJuZWwtPnJvd3MgLSAxKSAlIDIgPT0gMCB8fAorICAgICAgICAgICAgKHR5cGUgIT0gQ1ZfMzJGQzEgJiYgdHlwZSAhPSBDVl82NEZDMSAmJiB0eXBlICE9IENWXzMyU0MxKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICJCb3RoIGtlcm5lbHMgbXVzdCBiZSAxRCBmbG9hdGluZy1wb2ludCBvciBpbnRlZ2VyIHZlY3RvcnMgb2Ygb2RkICgyKmsrMSkgc2l6ZS4iICk7CisKKyAgICAgICAgaWYoIG5vcm1hbGl6ZSAmJiBuID4gMSAmJiB0eXBlID09IENWXzMyU0MxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnRlZ2VyIGtlcm5lbCBjYW4gbm90IGJlIG5vcm1hbGl6ZWQiICk7CisKKyAgICAgICAgaWYoIG4gPD0gb3JkZXIgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICAgICAiRGVyaXZhdGl2ZSBvcmRlciBtdXN0IGJlIHNtYWxsZXIgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBrZXJuZWwgc2l6ZSIgKTsKKworICAgICAgICBpZiggbiA9PSAxICkKKyAgICAgICAgICAgIGtlcklbMF0gPSAxOworICAgICAgICBlbHNlIGlmKCBuID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggb3JkZXIgPT0gMCApCisgICAgICAgICAgICAgICAga2VySVswXSA9IDEsIGtlcklbMV0gPSAyLCBrZXJJWzJdID0gMTsKKyAgICAgICAgICAgIGVsc2UgaWYoIG9yZGVyID09IDEgKQorICAgICAgICAgICAgICAgIGtlcklbMF0gPSAtMSwga2VySVsxXSA9IDAsIGtlcklbMl0gPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGtlcklbMF0gPSAxLCBrZXJJWzFdID0gLTIsIGtlcklbMl0gPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG9sZHZhbCwgbmV3dmFsOworICAgICAgICAgICAga2VySVswXSA9IDE7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICBrZXJJW2krMV0gPSAwOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbiAtIG9yZGVyIC0gMTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvbGR2YWwgPSBrZXJJWzBdOworICAgICAgICAgICAgICAgIGZvciggaiA9IDE7IGogPD0gbjsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld3ZhbCA9IGtlcklbal0ra2VySVtqLTFdOworICAgICAgICAgICAgICAgICAgICBrZXJJW2otMV0gPSBvbGR2YWw7CisgICAgICAgICAgICAgICAgICAgIG9sZHZhbCA9IG5ld3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBvcmRlcjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvbGR2YWwgPSAta2VySVswXTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDw9IG47IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXd2YWwgPSBrZXJJW2otMV0gLSBrZXJJW2pdOworICAgICAgICAgICAgICAgICAgICBrZXJJW2otMV0gPSBvbGR2YWw7CisgICAgICAgICAgICAgICAgICAgIG9sZHZhbCA9IG5ld3ZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGVwID0ga2VybmVsLT5yb3dzID09IDEgPyAxIDoga2VybmVsLT5zdGVwL0NWX0VMRU1fU0laRTEodHlwZSk7CisgICAgICAgIGlmKCBmbGlwICYmIChvcmRlciAmIDEpICYmIGsgKQorICAgICAgICAgICAgaXNjYWxlID0gLWlzY2FsZSwgc2NhbGUgPSAtc2NhbGU7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyU0MxICkKKyAgICAgICAgICAgICAgICBrZXJuZWwtPmRhdGEuaVtpKnN0ZXBdID0ga2VySVtpXSppc2NhbGU7CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICBrZXJuZWwtPmRhdGEuZmxbaSpzdGVwXSA9IChmbG9hdCkoa2VySVtpXSpzY2FsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2VybmVsLT5kYXRhLmRiW2kqc3RlcF0gPSBrZXJJW2ldKnNjYWxlOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2U2VwRmlsdGVyOjppbml0X3NjaGFycl9rZXJuZWwoIEN2TWF0KiBfa3gsIEN2TWF0KiBfa3ksIGludCBkeCwgaW50IGR5LCBpbnQgZmxhZ3MgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTZXBGaWx0ZXI6OmluaXRfc2NoYXJyX2tlcm5lbCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBrOworICAgIGludCBrZXJJWzNdOworICAgIGJvb2wgbm9ybWFsaXplID0gKGZsYWdzICYgTk9STUFMSVpFX0tFUk5FTCkgIT0gMDsKKyAgICBib29sIGZsaXAgPSAoZmxhZ3MgJiBGTElQX0tFUk5FTCkgIT0gMDsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKF9reCkgfHwgIUNWX0lTX01BVChfa3kpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk9uZSBvZiB0aGUga2VybmVsIG1hdHJpY2VzIGlzIG5vdCB2YWxpZCIgKTsKKworICAgIGlmKCAoKGR4fGR5KSZ+MSkgfHwgZHgrZHkgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgIlNjaGFyciBrZXJuZWwgY2FuIG9ubHkgYmUgdXNlZCBmb3IgMXN0IG9yZGVyIGRlcml2YXRpdmVzIiApOworCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBDdk1hdCoga2VybmVsID0gayA9PSAwID8gX2t4IDogX2t5OworICAgICAgICBpbnQgb3JkZXIgPSBrID09IDAgPyBkeCA6IGR5OworICAgICAgICBpbnQgbiA9IGtlcm5lbC0+Y29scyArIGtlcm5lbC0+cm93cyAtIDEsIHN0ZXA7CisgICAgICAgIGludCB0eXBlID0gQ1ZfTUFUX1RZUEUoa2VybmVsLT50eXBlKTsKKyAgICAgICAgZG91YmxlIHNjYWxlID0gIW5vcm1hbGl6ZSA/IDEuIDogb3JkZXIgPT0gMCA/IDEuLzE2IDogMS4vMjsKKyAgICAgICAgaW50IGlzY2FsZSA9IDE7CisKKyAgICAgICAgaWYoIChrZXJuZWwtPmNvbHMgIT0gMSAmJiBrZXJuZWwtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgICAgIGtlcm5lbC0+Y29scyArIGtlcm5lbC0+cm93cyAtIDEgIT0gMyB8fAorICAgICAgICAgICAgKHR5cGUgIT0gQ1ZfMzJGQzEgJiYgdHlwZSAhPSBDVl82NEZDMSAmJiB0eXBlICE9IENWXzMyU0MxKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICJCb3RoIGtlcm5lbHMgbXVzdCBiZSAxRCBmbG9hdGluZy1wb2ludCBvciBpbnRlZ2VyIHZlY3RvcnMgY29udGFpbmluZyAzIGVsZW1lbnRzIGVhY2guIiApOworCisgICAgICAgIGlmKCBub3JtYWxpemUgJiYgdHlwZSA9PSBDVl8zMlNDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW50ZWdlciBrZXJuZWwgY2FuIG5vdCBiZSBub3JtYWxpemVkIiApOworCisgICAgICAgIGlmKCBvcmRlciA9PSAwICkKKyAgICAgICAgICAgIGtlcklbMF0gPSAzLCBrZXJJWzFdID0gMTAsIGtlcklbMl0gPSAzOworICAgICAgICBlbHNlCisgICAgICAgICAgICBrZXJJWzBdID0gLTEsIGtlcklbMV0gPSAwLCBrZXJJWzJdID0gMTsKKworICAgICAgICBzdGVwID0ga2VybmVsLT5yb3dzID09IDEgPyAxIDoga2VybmVsLT5zdGVwL0NWX0VMRU1fU0laRTEodHlwZSk7CisgICAgICAgIGlmKCBmbGlwICYmIChvcmRlciAmIDEpICYmIGsgKQorICAgICAgICAgICAgaXNjYWxlID0gLWlzY2FsZSwgc2NhbGUgPSAtc2NhbGU7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyU0MxICkKKyAgICAgICAgICAgICAgICBrZXJuZWwtPmRhdGEuaVtpKnN0ZXBdID0ga2VySVtpXSppc2NhbGU7CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICBrZXJuZWwtPmRhdGEuZmxbaSpzdGVwXSA9IChmbG9hdCkoa2VySVtpXSpzY2FsZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAga2VybmVsLT5kYXRhLmRiW2kqc3RlcF0gPSBrZXJJW2ldKnNjYWxlOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2U2VwRmlsdGVyOjppbml0X2Rlcml2KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkeCwgaW50IGR5LCBpbnQgYXBlcnR1cmVfc2l6ZSwgaW50IGZsYWdzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2U2VwRmlsdGVyOjppbml0X2Rlcml2IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGt4X3NpemUgPSBhcGVydHVyZV9zaXplID09IENWX1NDSEFSUiA/IDMgOiBhcGVydHVyZV9zaXplLCBreV9zaXplID0ga3hfc2l6ZTsKKyAgICBmbG9hdCBreF9kYXRhW0NWX01BWF9TT0JFTF9LU0laRV0sIGt5X2RhdGFbQ1ZfTUFYX1NPQkVMX0tTSVpFXTsKKyAgICBDdk1hdCBfa3gsIF9reTsKKworICAgIGlmKCBreF9zaXplIDw9IDAgfHwga3lfc2l6ZSA+IENWX01BWF9TT0JFTF9LU0laRSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiSW5jb3JyZWN0IGFwZXJ0dXJlX3NpemUiICk7CisKKyAgICBpZigga3hfc2l6ZSA9PSAxICYmIGR4ICkKKyAgICAgICAga3hfc2l6ZSA9IDM7CisgICAgaWYoIGt5X3NpemUgPT0gMSAmJiBkeSApCisgICAgICAgIGt5X3NpemUgPSAzOworCisgICAgX2t4ID0gY3ZNYXQoIDEsIGt4X3NpemUsIENWXzMyRkMxLCBreF9kYXRhICk7CisgICAgX2t5ID0gY3ZNYXQoIDEsIGt5X3NpemUsIENWXzMyRkMxLCBreV9kYXRhICk7CisKKyAgICBpZiggYXBlcnR1cmVfc2l6ZSA9PSBDVl9TQ0hBUlIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaW5pdF9zY2hhcnJfa2VybmVsKCAmX2t4LCAmX2t5LCBkeCwgZHksIGZsYWdzICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBpbml0X3NvYmVsX2tlcm5lbCggJl9reCwgJl9reSwgZHgsIGR5LCBmbGFncyApKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBpbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgJl9reCwgJl9reSApKTsKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdlNlcEZpbHRlcjo6aW5pdF9nYXVzc2lhbiggaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX3R5cGUsIGludCBfZHN0X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ2F1c3NpYW5fc2l6ZSwgZG91YmxlIHNpZ21hICkKK3sKKyAgICBmbG9hdCoga2RhdGEgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiQ3ZTZXBGaWx0ZXI6OmluaXRfZ2F1c3NpYW4iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBfa2VybmVsOworCisgICAgaWYoIGdhdXNzaWFuX3NpemUgPD0gMCB8fCBnYXVzc2lhbl9zaXplID4gMTAyNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiSW5jb3JyZWN0IHNpemUgb2YgZ2F1c3NpYW4ga2VybmVsIiApOworCisgICAga2RhdGEgPSAoZmxvYXQqKWN2U3RhY2tBbGxvYyhnYXVzc2lhbl9zaXplKnNpemVvZihrZGF0YVswXSkpOworICAgIF9rZXJuZWwgPSBjdk1hdCggMSwgZ2F1c3NpYW5fc2l6ZSwgQ1ZfMzJGLCBrZGF0YSApOworCisgICAgQ1ZfQ0FMTCggaW5pdF9nYXVzc2lhbl9rZXJuZWwoICZfa2VybmVsLCBzaWdtYSApKTsKKyAgICBDVl9DQUxMKCBpbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgJl9rZXJuZWwsICZfa2VybmVsICkpOyAKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb24tc2VwYXJhYmxlIExpbmVhciBGaWx0ZXIKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBpY3ZMaW5lYXJGaWx0ZXJfOHUoIGNvbnN0IHVjaGFyKiogc3JjLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZMaW5lYXJGaWx0ZXJfMTZzKCBjb25zdCBzaG9ydCoqIHNyYywgc2hvcnQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkxpbmVhckZpbHRlcl8xNnUoIGNvbnN0IHVzaG9ydCoqIHNyYywgdXNob3J0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZMaW5lYXJGaWx0ZXJfMzJmKCBjb25zdCBmbG9hdCoqIHNyYywgZmxvYXQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKKworQ3ZMaW5lYXJGaWx0ZXI6OkN2TGluZWFyRmlsdGVyKCkKK3sKKyAgICBrZXJuZWwgPSAwOworICAgIGtfc3BhcnNlID0gMDsKK30KKworQ3ZMaW5lYXJGaWx0ZXI6OkN2TGluZWFyRmlsdGVyKCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9rZXJuZWwsIEN2UG9pbnQgX2FuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9ib3JkZXJfbW9kZSwgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAga2VybmVsID0gMDsKKyAgICBrX3NwYXJzZSA9IDA7CisgICAgaW5pdCggX21heF93aWR0aCwgX3NyY190eXBlLCBfZHN0X3R5cGUsIF9rZXJuZWwsCisgICAgICAgICAgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7Cit9CisKKwordm9pZCBDdkxpbmVhckZpbHRlcjo6Y2xlYXIoKQoreworICAgIGN2UmVsZWFzZU1hdCggJmtlcm5lbCApOworICAgIGN2RnJlZSggJmtfc3BhcnNlICk7CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6OmNsZWFyKCk7Cit9CisKKworQ3ZMaW5lYXJGaWx0ZXI6On5DdkxpbmVhckZpbHRlcigpCit7CisgICAgY2xlYXIoKTsKK30KKworCit2b2lkIEN2TGluZWFyRmlsdGVyOjppbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfa2VybmVsLCBDdlBvaW50IF9hbmNob3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlLCBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2TGluZWFyRmlsdGVyOjppbml0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGRlcHRoID0gQ1ZfTUFUX0RFUFRIKF9zcmNfdHlwZSk7CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKF9zcmNfdHlwZSk7CisgICAgQ3ZQb2ludCogbnpfbG9jOworICAgIGZsb2F0KiBjb2VmZnM7CisgICAgaW50IGksIGosIGsgPSAwOworCisgICAgaWYoICFDVl9JU19NQVQoX2tlcm5lbCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAia2VybmVsIGlzIG5vdCB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBfc3JjX3R5cGUgPSBDVl9NQVRfVFlQRShfc3JjX3R5cGUpOworICAgIF9kc3RfdHlwZSA9IENWX01BVF9UWVBFKF9kc3RfdHlwZSk7CisKKyAgICBpZiggX3NyY190eXBlICE9IF9kc3RfdHlwZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAiVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gaW1hZ2UgdHlwZXMgbXVzdCBiZSB0aGUgc2FtZSIgKTsKKworICAgIENWX0NBTEwoIEN2QmFzZUltYWdlRmlsdGVyOjppbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwKKyAgICAgICAgZmFsc2UsIGN2R2V0TWF0U2l6ZShfa2VybmVsKSwgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICkpOworCisgICAgaWYoICEoa2VybmVsICYmIGtfc3BhcnNlICYmIGtzaXplLndpZHRoID09IGtlcm5lbC0+Y29scyAmJiBrc2l6ZS5oZWlnaHQgPT0ga2VybmVsLT5yb3dzICkpCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZrZXJuZWwgKTsKKyAgICAgICAgY3ZGcmVlKCAma19zcGFyc2UgKTsKKyAgICAgICAgQ1ZfQ0FMTCgga2VybmVsID0gY3ZDcmVhdGVNYXQoIGtzaXplLmhlaWdodCwga3NpemUud2lkdGgsIENWXzMyRkMxICkpOworICAgICAgICBDVl9DQUxMKCBrX3NwYXJzZSA9ICh1Y2hhciopY3ZBbGxvYygKKyAgICAgICAgICAgIGtzaXplLndpZHRoKmtzaXplLmhlaWdodCooMipzaXplb2YoaW50KSArIHNpemVvZih1Y2hhciopICsgc2l6ZW9mKGZsb2F0KSkpKTsKKyAgICB9CisgICAgCisgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCBfa2VybmVsLCBrZXJuZWwgKSk7CisgICAgCisgICAgbnpfbG9jID0gKEN2UG9pbnQqKWtfc3BhcnNlOworICAgIGZvciggaSA9IDA7IGkgPCBrc2l6ZS5oZWlnaHQ7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwga3NpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICBpZiggZmFicygoKGZsb2F0Kikoa2VybmVsLT5kYXRhLnB0ciArIGkqa2VybmVsLT5zdGVwKSlbal0pPkZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICBuel9sb2NbaysrXSA9IGN2UG9pbnQoaixpKTsKKyAgICB9CisgICAgaWYoIGsgPT0gMCApCisgICAgICAgIG56X2xvY1trKytdID0gYW5jaG9yOworICAgIGtfc3BhcnNlX2NvdW50ID0gazsKKyAgICBjb2VmZnMgPSAoZmxvYXQqKSgodWNoYXIqKikobnpfbG9jICsga19zcGFyc2VfY291bnQpICsga19zcGFyc2VfY291bnQpOworCisgICAgZm9yKCBrID0gMDsgayA8IGtfc3BhcnNlX2NvdW50OyBrKysgKQorICAgIHsKKyAgICAgICAgY29lZmZzW2tdID0gQ1ZfTUFUX0VMRU0oICprZXJuZWwsIGZsb2F0LCBuel9sb2Nba10ueSwgbnpfbG9jW2tdLnggKTsKKyAgICAgICAgbnpfbG9jW2tdLnggKj0gY247CisgICAgfQorCisgICAgeF9mdW5jID0gMDsKKyAgICBpZiggZGVwdGggPT0gQ1ZfOFUgKQorICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkxpbmVhckZpbHRlcl84dTsKKyAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8xNlMgKQorICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkxpbmVhckZpbHRlcl8xNnM7CisgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMTZVICkKKyAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZMaW5lYXJGaWx0ZXJfMTZ1OworICAgIGVsc2UgaWYoIGRlcHRoID09IENWXzMyRiApCisgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2TGluZWFyRmlsdGVyXzMyZjsKKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIGltYWdlIHR5cGUiICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZMaW5lYXJGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfaXNfc2VwYXJhYmxlLCBDdlNpemUgX2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yLCBpbnQgX2JvcmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX2JvcmRlcl92YWx1ZSApCit7CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6OmluaXQoIF9tYXhfd2lkdGgsIF9zcmNfdHlwZSwgX2RzdF90eXBlLCBfaXNfc2VwYXJhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfa3NpemUsIF9hbmNob3IsIF9ib3JkZXJfbW9kZSwgX2JvcmRlcl92YWx1ZSApOworfQorCisKKyNkZWZpbmUgSUNWX0ZJTFRFUiggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgbG9hZF9tYWNybywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvMSwgY2FzdF9tYWNybzIgKSAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkxpbmVhckZpbHRlcl8jI2ZsYXZvciggY29uc3QgYXJydHlwZSoqIHNyYywgYXJydHlwZSogZHN0LCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdkxpbmVhckZpbHRlciogc3RhdGUgPSAoQ3ZMaW5lYXJGaWx0ZXIqKXBhcmFtczsgICAgICAgICAgICAgICAgXAorICAgIGludCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2UG9pbnQqIGtfc3BhcnNlID0gKEN2UG9pbnQqKXN0YXRlLT5nZXRfa2VybmVsX3NwYXJzZV9idWYoKTsgICBcCisgICAgaW50IGtfY291bnQgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zcGFyc2VfY291bnQoKTsgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBhcnJ0eXBlKioga19wdHIgPSAoY29uc3QgYXJydHlwZSoqKShrX3NwYXJzZSArIGtfY291bnQpOyAgXAorICAgIGNvbnN0IGFycnR5cGUqKiBrX2VuZCA9IGtfcHRyICsga19jb3VudDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZmxvYXQqIGtfY29lZmZzID0gKGNvbnN0IGZsb2F0Kikoa19wdHIgKyBrX2NvdW50KTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBjb3VudCA+IDA7IGNvdW50LS0sIGRzdCArPSBkc3Rfc3RlcCwgc3JjKysgKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IGtfY291bnQ7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga19wdHJba10gPSBzcmNba19zcGFyc2Vba10ueV0gKyBrX3NwYXJzZVtrXS54OyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKioga3AgPSBrX3B0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBrYyA9IGtfY29lZmZzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUoIGtwICE9IGtfZW5kICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzcHRyID0gKCprcCsrKSArIGk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZsb2F0IGYgPSAqa2MrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczAgKz0gZipsb2FkX21hY3JvKHNwdHJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBmKmxvYWRfbWFjcm8oc3B0clsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMyICs9IGYqbG9hZF9tYWNybyhzcHRyWzJdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczMgKz0gZipsb2FkX21hY3JvKHNwdHJbM10pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IGNhc3RfbWFjcm8xKHMwKTsgdDEgPSBjYXN0X21hY3JvMShzMSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8yKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMV0gPSBjYXN0X21hY3JvMih0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IGNhc3RfbWFjcm8xKHMyKTsgdDEgPSBjYXN0X21hY3JvMShzMyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gY2FzdF9tYWNybzIodDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krM10gPSBjYXN0X21hY3JvMih0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqKiBrcCA9IGtfcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgZmxvYXQqIGtjID0ga19jb2VmZnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgczAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSgga3AgIT0ga19lbmQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNwdHIgPSAqa3ArKzsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgZiA9ICprYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCArPSBmKmxvYWRfbWFjcm8oc3B0cltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gY2FzdF9tYWNybzIodDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9GSUxURVIoIDh1LCB1Y2hhciwgaW50LCBDVl84VE8zMkYsIGN2Um91bmQsIENWX0NBU1RfOFUgKQorSUNWX0ZJTFRFUiggMTZ1LCB1c2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2VSApCitJQ1ZfRklMVEVSKCAxNnMsIHNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMgKQorSUNWX0ZJTFRFUiggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCwgQ1ZfQ0FTVF8zMkYsIENWX05PUCApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gY29tbW9uIGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIElQUCBmaWx0ZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0N2TWF0KiBpY3ZJUFBGaWx0ZXJJbml0KCBjb25zdCBDdk1hdCogc3JjLCBpbnQgc3RyaXBlX3NpemUsIEN2U2l6ZSBrc2l6ZSApCit7CisgICAgQ3ZTaXplIHRlbXBfc2l6ZTsKKyAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUoc3JjLT50eXBlKTsKKyAgICB0ZW1wX3NpemUud2lkdGggPSBjdkFsaWduKHNyYy0+Y29scyArIGtzaXplLndpZHRoIC0gMSw4L0NWX0VMRU1fU0laRShzcmMtPnR5cGUgJiBDVl9NQVRfREVQVEhfTUFTSykpOworICAgIC8vdGVtcF9zaXplLndpZHRoID0gc3JjLT5jb2xzICsga3NpemUud2lkdGggLSAxOworICAgIHRlbXBfc2l6ZS5oZWlnaHQgPSAoc3RyaXBlX3NpemUqMiArIHRlbXBfc2l6ZS53aWR0aCpwaXhfc2l6ZSkgLyAodGVtcF9zaXplLndpZHRoKnBpeF9zaXplKjIpOworICAgIHRlbXBfc2l6ZS5oZWlnaHQgPSBNQVgoIHRlbXBfc2l6ZS5oZWlnaHQsIGtzaXplLmhlaWdodCApOworICAgIHRlbXBfc2l6ZS5oZWlnaHQgPSBNSU4oIHRlbXBfc2l6ZS5oZWlnaHQsIHNyYy0+cm93cyArIGtzaXplLmhlaWdodCAtIDEgKTsKKworICAgIHJldHVybiBjdkNyZWF0ZU1hdCggdGVtcF9zaXplLmhlaWdodCwgdGVtcF9zaXplLndpZHRoLCBzcmMtPnR5cGUgKTsKK30KKworCitpbnQgaWN2SVBQRmlsdGVyTmV4dFN0cmlwZSggY29uc3QgQ3ZNYXQqIHNyYywgQ3ZNYXQqIHRlbXAsIGludCB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBrc2l6ZSwgQ3ZQb2ludCBhbmNob3IgKQoreworICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRShzcmMtPnR5cGUpOworICAgIGludCBzcmNfc3RlcCA9IHNyYy0+c3RlcCA/IHNyYy0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICBpbnQgdGVtcF9zdGVwID0gdGVtcC0+c3RlcCA/IHRlbXAtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgaW50IGksIGR5LCBzcmNfeTEgPSAwLCBzcmNfeTI7CisgICAgaW50IHRlbXBfcm93czsKKyAgICB1Y2hhciogdGVtcF9wdHIgPSB0ZW1wLT5kYXRhLnB0cjsKKyAgICBDdlNpemUgc3RyaXBlX3NpemUsIHRlbXBfc2l6ZTsKKworICAgIGR5ID0gTUlOKCB0ZW1wLT5yb3dzIC0ga3NpemUuaGVpZ2h0ICsgMSwgc3JjLT5yb3dzIC0geSApOworICAgIGlmKCB5ID4gMCApCisgICAgeworICAgICAgICBpbnQgdGVtcF9yZWFkeSA9IGtzaXplLmhlaWdodCAtIDE7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdGVtcF9yZWFkeTsgaSsrICkKKyAgICAgICAgICAgIG1lbWNweSggdGVtcF9wdHIgKyB0ZW1wX3N0ZXAqaSwgdGVtcF9wdHIgKworICAgICAgICAgICAgICAgICAgICB0ZW1wX3N0ZXAqKHRlbXAtPnJvd3MgLSB0ZW1wX3JlYWR5ICsgaSksIHRlbXBfc3RlcCApOworCisgICAgICAgIHRlbXBfcHRyICs9IHRlbXBfcmVhZHkqdGVtcF9zdGVwOworICAgICAgICB0ZW1wX3Jvd3MgPSBkeTsKKyAgICAgICAgc3JjX3kxID0geSArIHRlbXBfcmVhZHkgLSBhbmNob3IueTsKKyAgICAgICAgc3JjX3kyID0gc3JjX3kxICsgZHk7CisgICAgICAgIGlmKCBzcmNfeTEgPj0gc3JjLT5yb3dzICkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjX3kxID0gc3JjLT5yb3dzIC0gMTsKKyAgICAgICAgICAgIHNyY195MiA9IHNyYy0+cm93czsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB0ZW1wX3Jvd3MgPSBkeSArIGtzaXplLmhlaWdodCAtIDE7CisgICAgICAgIHNyY195MiA9IHRlbXBfcm93cyAtIGFuY2hvci55OworICAgIH0KKworICAgIHNyY195MiA9IE1JTiggc3JjX3kyLCBzcmMtPnJvd3MgKTsKKworICAgIHN0cmlwZV9zaXplID0gY3ZTaXplKHNyYy0+Y29scywgc3JjX3kyIC0gc3JjX3kxKTsKKyAgICB0ZW1wX3NpemUgPSBjdlNpemUodGVtcC0+Y29scywgdGVtcF9yb3dzKTsKKyAgICBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1KCBzcmMtPmRhdGEucHRyICsgc3JjX3kxKnNyY19zdGVwLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpcGVfc2l6ZSwgdGVtcF9wdHIsIHRlbXBfc3RlcCwgdGVtcF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICh5ID09IDAgPyBhbmNob3IueSA6IDApLCBhbmNob3IueCwgcGl4X3NpemUgKTsKKyAgICByZXR1cm4gZHk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJUFAgc2VwYXJhYmxlIGZpbHRlciBmdW5jdGlvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ljdkZpbHRlclJvd184dV9DMVJfdCBpY3ZGaWx0ZXJSb3dfOHVfQzFSX3AgPSAwOworaWN2RmlsdGVyUm93Xzh1X0MzUl90IGljdkZpbHRlclJvd184dV9DM1JfcCA9IDA7CitpY3ZGaWx0ZXJSb3dfOHVfQzRSX3QgaWN2RmlsdGVyUm93Xzh1X0M0Ul9wID0gMDsKK2ljdkZpbHRlclJvd18xNnNfQzFSX3QgaWN2RmlsdGVyUm93XzE2c19DMVJfcCA9IDA7CitpY3ZGaWx0ZXJSb3dfMTZzX0MzUl90IGljdkZpbHRlclJvd18xNnNfQzNSX3AgPSAwOworaWN2RmlsdGVyUm93XzE2c19DNFJfdCBpY3ZGaWx0ZXJSb3dfMTZzX0M0Ul9wID0gMDsKK2ljdkZpbHRlclJvd18zMmZfQzFSX3QgaWN2RmlsdGVyUm93XzMyZl9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJSb3dfMzJmX0MzUl90IGljdkZpbHRlclJvd18zMmZfQzNSX3AgPSAwOworaWN2RmlsdGVyUm93XzMyZl9DNFJfdCBpY3ZGaWx0ZXJSb3dfMzJmX0M0Ul9wID0gMDsKKworaWN2RmlsdGVyQ29sdW1uXzh1X0MxUl90IGljdkZpbHRlckNvbHVtbl84dV9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJDb2x1bW5fOHVfQzNSX3QgaWN2RmlsdGVyQ29sdW1uXzh1X0MzUl9wID0gMDsKK2ljdkZpbHRlckNvbHVtbl84dV9DNFJfdCBpY3ZGaWx0ZXJDb2x1bW5fOHVfQzRSX3AgPSAwOworaWN2RmlsdGVyQ29sdW1uXzE2c19DMVJfdCBpY3ZGaWx0ZXJDb2x1bW5fMTZzX0MxUl9wID0gMDsKK2ljdkZpbHRlckNvbHVtbl8xNnNfQzNSX3QgaWN2RmlsdGVyQ29sdW1uXzE2c19DM1JfcCA9IDA7CitpY3ZGaWx0ZXJDb2x1bW5fMTZzX0M0Ul90IGljdkZpbHRlckNvbHVtbl8xNnNfQzRSX3AgPSAwOworaWN2RmlsdGVyQ29sdW1uXzMyZl9DMVJfdCBpY3ZGaWx0ZXJDb2x1bW5fMzJmX0MxUl9wID0gMDsKK2ljdkZpbHRlckNvbHVtbl8zMmZfQzNSX3QgaWN2RmlsdGVyQ29sdW1uXzMyZl9DM1JfcCA9IDA7CitpY3ZGaWx0ZXJDb2x1bW5fMzJmX0M0Ul90IGljdkZpbHRlckNvbHVtbl8zMmZfQzRSX3AgPSAwOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2SVBQU2VwRmlsdGVyRnVuYykKKyAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgZmxvYXQqIGtlcm5lbCwgaW50IGtzaXplLCBpbnQgYW5jaG9yICk7CisKK2ludCBpY3ZJUFBTZXBGaWx0ZXIoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsIGNvbnN0IEN2TWF0KiBrZXJuZWxYLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGtlcm5lbFksIEN2UG9pbnQgYW5jaG9yICkKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICAKKyAgICBDdk1hdCogdG9wX2JvdHRvbSA9IDA7CisgICAgQ3ZNYXQqIHZvdXRfaGluID0gMDsKKyAgICBDdk1hdCogZHN0X2J1ZiA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZJUFBTZXBGaWx0ZXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUga3NpemU7CisgICAgQ3ZQb2ludCBlbF9hbmNob3I7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IHR5cGUsIGRlcHRoLCBwaXhfc2l6ZTsKKyAgICBpbnQgaSwgeCwgeSwgZHkgPSAwLCBwcmV2X2R5ID0gMCwgbWF4X2R5OworICAgIEN2TWF0IHZvdXQ7CisgICAgQ3ZJUFBTZXBGaWx0ZXJGdW5jIHhfZnVuYyA9IDAsIHlfZnVuYyA9IDA7CisgICAgaW50IHNyY19zdGVwLCB0b3BfYm90dG9tX3N0ZXA7CisgICAgZmxvYXQgKmt4LCAqa3k7CisgICAgaW50IGFsaWduLCBzdHJpcGVfc2l6ZTsKKworICAgIGlmKCAhaWN2RmlsdGVyUm93Xzh1X0MxUl9wICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApIHx8ICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkgfHwKKyAgICAgICAgIUNWX0lTX01BVF9DT05UKGtlcm5lbFgtPnR5cGUgJiBrZXJuZWxZLT50eXBlKSB8fAorICAgICAgICBDVl9NQVRfVFlQRShrZXJuZWxYLT50eXBlKSAhPSBDVl8zMkZDMSB8fAorICAgICAgICBDVl9NQVRfVFlQRShrZXJuZWxZLT50eXBlKSAhPSBDVl8zMkZDMSB8fAorICAgICAgICAoa2VybmVsWC0+Y29scyAhPSAxICYmIGtlcm5lbFgtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgKGtlcm5lbFktPmNvbHMgIT0gMSAmJiBrZXJuZWxZLT5yb3dzICE9IDEpIHx8CisgICAgICAgICh1bnNpZ25lZClhbmNob3IueCA+PSAodW5zaWduZWQpKGtlcm5lbFgtPmNvbHMgKyBrZXJuZWxYLT5yb3dzIC0gMSkgfHwKKyAgICAgICAgKHVuc2lnbmVkKWFuY2hvci55ID49ICh1bnNpZ25lZCkoa2VybmVsWS0+Y29scyArIGtlcm5lbFktPnJvd3MgLSAxKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIkludGVybmFsIEVycm9yOiBpbmNvcnJlY3QgcGFyYW1ldGVycyIgKTsKKworICAgIGtzaXplLndpZHRoID0ga2VybmVsWC0+Y29scyArIGtlcm5lbFgtPnJvd3MgLSAxOworICAgIGtzaXplLmhlaWdodCA9IGtlcm5lbFktPmNvbHMgKyBrZXJuZWxZLT5yb3dzIC0gMTsKKworICAgIC8qaWYoIGtzaXplLndpZHRoIDw9IDUgJiYga3NpemUuaGVpZ2h0IDw9IDUgKQorICAgIHsKKyAgICAgICAgZmxvYXQqIGtlciA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBrc2l6ZS53aWR0aCprc2l6ZS5oZWlnaHQqc2l6ZW9mKGtlclswXSkpOworICAgICAgICBDdk1hdCBrZXJuZWwgPSBjdk1hdCgga3NpemUuaGVpZ2h0LCBrc2l6ZS53aWR0aCwgQ1ZfMzJGLCBrZXIgKTsKKyAgICAgICAgZm9yKCB5ID0gMCwgaSA9IDA7IHkgPCBrc2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwga3NpemUud2lkdGg7IHgrKywgaSsrICkKKyAgICAgICAgICAgICAgICBrZXJbaV0gPSBrZXJuZWxZLT5kYXRhLmZsW3ldKmtlcm5lbFgtPmRhdGEuZmxbeF07CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZGaWx0ZXIyRCggc3JjLCBkc3QsICZrZXJuZWwsIGFuY2hvciApKTsKKyAgICAgICAgRVhJVDsKKyAgICB9Ki8KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMtPnR5cGUpOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHR5cGUpOworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgaWYoIHR5cGUgPT0gQ1ZfOFVDMSApCisgICAgICAgIHhfZnVuYyA9IGljdkZpbHRlclJvd184dV9DMVJfcCwgeV9mdW5jID0gaWN2RmlsdGVyQ29sdW1uXzh1X0MxUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfOFVDMyApCisgICAgICAgIHhfZnVuYyA9IGljdkZpbHRlclJvd184dV9DM1JfcCwgeV9mdW5jID0gaWN2RmlsdGVyQ29sdW1uXzh1X0MzUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfOFVDNCApCisgICAgICAgIHhfZnVuYyA9IGljdkZpbHRlclJvd184dV9DNFJfcCwgeV9mdW5jID0gaWN2RmlsdGVyQ29sdW1uXzh1X0M0Ul9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZTQzEgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMTZzX0MxUl9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMTZzX0MxUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZTQzMgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMTZzX0MzUl9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMTZzX0MzUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZTQzQgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMTZzX0M0Ul9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMTZzX0M0Ul9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMzJmX0MxUl9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMzJmX0MxUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzMgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMzJmX0MzUl9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMzJmX0MzUl9wOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzQgKQorICAgICAgICB4X2Z1bmMgPSBpY3ZGaWx0ZXJSb3dfMzJmX0M0Ul9wLCB5X2Z1bmMgPSBpY3ZGaWx0ZXJDb2x1bW5fMzJmX0M0Ul9wOworICAgIGVsc2UKKyAgICAgICAgRVhJVDsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBzdHJpcGVfc2l6ZSA9IHNyYy0+ZGF0YS5wdHIgPT0gZHN0LT5kYXRhLnB0ciA/IDEgPDwgMTUgOiAxIDw8IDE2OworICAgIG1heF9keSA9IE1BWCgga3NpemUuaGVpZ2h0IC0gMSwgc3RyaXBlX3NpemUvKHNpemUud2lkdGggKyBrc2l6ZS53aWR0aCAtIDEpKTsKKyAgICBtYXhfZHkgPSBNSU4oIG1heF9keSwgc2l6ZS5oZWlnaHQgKyBrc2l6ZS5oZWlnaHQgLSAxICk7CisgICAgCisgICAgYWxpZ24gPSA4L0NWX0VMRU1fU0laRShkZXB0aCk7CisKKyAgICBDVl9DQUxMKCB0b3BfYm90dG9tID0gY3ZDcmVhdGVNYXQoIGtzaXplLmhlaWdodCoyLCBjdkFsaWduKHNpemUud2lkdGgsYWxpZ24pLCB0eXBlICkpOworCisgICAgQ1ZfQ0FMTCggdm91dF9oaW4gPSBjdkNyZWF0ZU1hdCggbWF4X2R5ICsga3NpemUuaGVpZ2h0LAorICAgICAgICBjdkFsaWduKHNpemUud2lkdGggKyBrc2l6ZS53aWR0aCAtIDEsIGFsaWduKSwgdHlwZSApKTsKKyAgICAKKyAgICBpZiggc3JjLT5kYXRhLnB0ciA9PSBkc3QtPmRhdGEucHRyICYmIHNpemUuaGVpZ2h0ICkKKyAgICAgICAgQ1ZfQ0FMTCggZHN0X2J1ZiA9IGN2Q3JlYXRlTWF0KCBtYXhfZHkgKyBrc2l6ZS5oZWlnaHQsCisgICAgICAgICAgICBjdkFsaWduKHNpemUud2lkdGgsIGFsaWduKSwgdHlwZSApKTsKKworICAgIGt4ID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGtzaXplLndpZHRoKnNpemVvZihreFswXSkgKTsKKyAgICBreSA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBrc2l6ZS5oZWlnaHQqc2l6ZW9mKGt5WzBdKSApOworCisgICAgLy8gbWlycm9yIHRoZSBrZXJuZWxzCisgICAgZm9yKCBpID0gMDsgaSA8IGtzaXplLndpZHRoOyBpKysgKQorICAgICAgICBreFtpXSA9IGtlcm5lbFgtPmRhdGEuZmxba3NpemUud2lkdGggLSBpIC0gMV07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwga3NpemUuaGVpZ2h0OyBpKysgKQorICAgICAgICBreVtpXSA9IGtlcm5lbFktPmRhdGEuZmxba3NpemUuaGVpZ2h0IC0gaSAtIDFdOworCisgICAgZWxfYW5jaG9yID0gY3ZQb2ludCgga3NpemUud2lkdGggLSBhbmNob3IueCAtIDEsIGtzaXplLmhlaWdodCAtIGFuY2hvci55IC0gMSApOworCisgICAgY3ZHZXRDb2xzKCB2b3V0X2hpbiwgJnZvdXQsIGFuY2hvci54LCBhbmNob3IueCArIHNpemUud2lkdGggKTsKKworICAgIHNyY19zdGVwID0gc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgIHRvcF9ib3R0b21fc3RlcCA9IHRvcF9ib3R0b20tPnN0ZXAgPyB0b3BfYm90dG9tLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgIHZvdXQuc3RlcCA9IHZvdXQuc3RlcCA/IHZvdXQuc3RlcCA6IENWX1NUVUJfU1RFUDsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSBkeSApCisgICAgeworICAgICAgICBjb25zdCBDdk1hdCAqdmluID0gc3JjLCAqaG91dCA9IGRzdDsKKyAgICAgICAgaW50IHNyY195ID0geSwgZHN0X3kgPSB5OworICAgICAgICBkeSA9IE1JTiggbWF4X2R5LCBzaXplLmhlaWdodCAtIChrc2l6ZS5oZWlnaHQgLSBhbmNob3IueSAtIDEpIC0geSApOworCisgICAgICAgIGlmKCB5IDwgYW5jaG9yLnkgfHwgZHkgPCBhbmNob3IueSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBheSA9IGFuY2hvci55OworICAgICAgICAgICAgQ3ZTaXplIHNyY19zdHJpcGVfc2l6ZSA9IHNpemU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCB5IDwgYW5jaG9yLnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNyY195ID0gMDsKKyAgICAgICAgICAgICAgICBkeSA9IE1JTiggYW5jaG9yLnksIHNpemUuaGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgc3JjX3N0cmlwZV9zaXplLmhlaWdodCA9IE1JTiggZHkgKyBrc2l6ZS5oZWlnaHQgLSBhbmNob3IueSAtIDEsIHNpemUuaGVpZ2h0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3JjX3kgPSBNQVgoIHkgLSBhbmNob3IueSwgMCApOworICAgICAgICAgICAgICAgIGR5ID0gc2l6ZS5oZWlnaHQgLSB5OworICAgICAgICAgICAgICAgIHNyY19zdHJpcGVfc2l6ZS5oZWlnaHQgPSBNSU4oIGR5ICsgYW5jaG9yLnksIHNpemUuaGVpZ2h0ICk7CisgICAgICAgICAgICAgICAgYXkgPSBNQVgoIGFuY2hvci55IC0geSwgMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1KCBzcmMtPmRhdGEucHRyICsgc3JjX3kqc3JjX3N0ZXAsIHNyY19zdGVwLAorICAgICAgICAgICAgICAgIHNyY19zdHJpcGVfc2l6ZSwgdG9wX2JvdHRvbS0+ZGF0YS5wdHIsIHRvcF9ib3R0b21fc3RlcCwKKyAgICAgICAgICAgICAgICBjdlNpemUoc2l6ZS53aWR0aCwgZHkgKyBrc2l6ZS5oZWlnaHQgLSAxKSwgYXksIDAsIHBpeF9zaXplICk7CisgICAgICAgICAgICB2aW4gPSB0b3BfYm90dG9tOworICAgICAgICAgICAgc3JjX3kgPSBhbmNob3IueTsgICAgICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIHZlcnRpY2FsIGNvbnZvbHV0aW9uCisgICAgICAgIElQUElfQ0FMTCggeV9mdW5jKCB2aW4tPmRhdGEucHRyICsgc3JjX3kqdmluLT5zdGVwLCB2aW4tPnN0ZXAgPyB2aW4tPnN0ZXAgOiBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3V0LmRhdGEucHRyLCB2b3V0LnN0ZXAsIGN2U2l6ZShzaXplLndpZHRoLCBkeSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBreSwga3NpemUuaGVpZ2h0LCBlbF9hbmNob3IueSApKTsKKworICAgICAgICAvLyBub3cgaXQncyB0aW1lIHRvIGNvcHkgdGhlIHByZXZpb3VzbHkgcHJvY2Vzc2VkIHN0cmlwZSB0byB0aGUgaW5wdXQvb3V0cHV0IGltYWdlCisgICAgICAgIGlmKCBzcmMtPmRhdGEucHRyID09IGRzdC0+ZGF0YS5wdHIgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcHJldl9keTsgaSsrICkKKyAgICAgICAgICAgICAgICBtZW1jcHkoIGRzdC0+ZGF0YS5wdHIgKyAoeSAtIHByZXZfZHkgKyBpKSpkc3QtPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLT5kYXRhLnB0ciArIGkqZHN0X2J1Zi0+c3RlcCwgc2l6ZS53aWR0aCpwaXhfc2l6ZSApOworICAgICAgICAgICAgaWYoIHkgKyBkeSA8IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBob3V0ID0gZHN0X2J1ZjsKKyAgICAgICAgICAgICAgICBkc3RfeSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjcmVhdGUgYSBib3JkZXIgZm9yIGV2ZXJ5IGxpbmUgYnkgcmVwbGljYXRpbmcgdGhlIGxlZnQtbW9zdC9yaWdodC1tb3N0IGVsZW1lbnRzCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkeTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHB0ciA9IHZvdXQuZGF0YS5wdHIgKyBpKnZvdXQuc3RlcDsKKyAgICAgICAgICAgIGZvciggeCA9IC0xOyB4ID49IC1hbmNob3IueCpwaXhfc2l6ZTsgeC0tICkKKyAgICAgICAgICAgICAgICBwdHJbeF0gPSBwdHJbeCArIHBpeF9zaXplXTsKKyAgICAgICAgICAgIGZvciggeCA9IHNpemUud2lkdGgqcGl4X3NpemU7IHggPCAoc2l6ZS53aWR0aCtrc2l6ZS53aWR0aC1hbmNob3IueC0xKSpwaXhfc2l6ZTsgeCsrICkKKyAgICAgICAgICAgICAgICBwdHJbeF0gPSBwdHJbeCAtIHBpeF9zaXplXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvIGhvcml6b250YWwgY29udm9sdXRpb24KKyAgICAgICAgSVBQSV9DQUxMKCB4X2Z1bmMoIHZvdXQuZGF0YS5wdHIsIHZvdXQuc3RlcCwgaG91dC0+ZGF0YS5wdHIgKyBkc3RfeSpob3V0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91dC0+c3RlcCA/IGhvdXQtPnN0ZXAgOiBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoc2l6ZS53aWR0aCwgZHkpLCBreCwga3NpemUud2lkdGgsIGVsX2FuY2hvci54ICkpOworICAgICAgICBwcmV2X2R5ID0gZHk7CisgICAgfQorCisgICAgcmVzdWx0ID0gMTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZ2b3V0X2hpbiApOworICAgIGN2UmVsZWFzZU1hdCggJmRzdF9idWYgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0b3BfYm90dG9tICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSVBQIGdlbmVyaWMgZmlsdGVyIGZ1bmN0aW9ucyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ljdkZpbHRlcl84dV9DMVJfdCBpY3ZGaWx0ZXJfOHVfQzFSX3AgPSAwOworaWN2RmlsdGVyXzh1X0MzUl90IGljdkZpbHRlcl84dV9DM1JfcCA9IDA7CitpY3ZGaWx0ZXJfOHVfQzRSX3QgaWN2RmlsdGVyXzh1X0M0Ul9wID0gMDsKK2ljdkZpbHRlcl8xNnNfQzFSX3QgaWN2RmlsdGVyXzE2c19DMVJfcCA9IDA7CitpY3ZGaWx0ZXJfMTZzX0MzUl90IGljdkZpbHRlcl8xNnNfQzNSX3AgPSAwOworaWN2RmlsdGVyXzE2c19DNFJfdCBpY3ZGaWx0ZXJfMTZzX0M0Ul9wID0gMDsKK2ljdkZpbHRlcl8zMmZfQzFSX3QgaWN2RmlsdGVyXzMyZl9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJfMzJmX0MzUl90IGljdkZpbHRlcl8zMmZfQzNSX3AgPSAwOworaWN2RmlsdGVyXzMyZl9DNFJfdCBpY3ZGaWx0ZXJfMzJmX0M0Ul9wID0gMDsKKworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZGaWx0ZXJJUFBGdW5jKQorKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwKKyAgY29uc3QgZmxvYXQqIGtlcm5lbCwgQ3ZTaXplIGtzaXplLCBDdlBvaW50IGFuY2hvciApOworCitDVl9JTVBMIHZvaWQKK2N2RmlsdGVyMkQoIGNvbnN0IEN2QXJyKiBfc3JjLCBDdkFyciogX2RzdCwgY29uc3QgQ3ZNYXQqIGtlcm5lbCwgQ3ZQb2ludCBhbmNob3IgKQoreworICAgIGNvbnN0IGludCBkZnRfZmlsdGVyX3NpemUgPSAxMDA7CisKKyAgICBDdkxpbmVhckZpbHRlciBmaWx0ZXI7CisgICAgQ3ZNYXQqIGlwcF9rZXJuZWwgPSAwOworICAgIAorICAgIC8vIGJlbG93IHRoYXQgYXBwcm94aW1hdGUgc2l6ZSBPcGVuQ1YgaXMgZmFzdGVyCisgICAgY29uc3QgaW50IGlwcF9sb3dlcl9saW1pdCA9IDIwOworICAgIEN2TWF0KiB0ZW1wID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZGaWx0ZXIyRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopX3NyYzsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0KilfZHN0OworICAgIGludCB0eXBlOworCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoIGFuY2hvci54ID09IC0xICYmIGFuY2hvci55ID09IC0xICkKKyAgICAgICAgYW5jaG9yID0gY3ZQb2ludChrZXJuZWwtPmNvbHMvMixrZXJuZWwtPnJvd3MvMik7CisKKyAgICBpZigga2VybmVsLT5jb2xzKmtlcm5lbC0+cm93cyA+PSBkZnRfZmlsdGVyX3NpemUgJiYKKyAgICAgICAga2VybmVsLT5jb2xzIDw9IHNyYy0+Y29scyAmJiBrZXJuZWwtPnJvd3MgPD0gc3JjLT5yb3dzICkKKyAgICB7CisgICAgICAgIGlmKCBzcmMtPmRhdGEucHRyID09IGRzdC0+ZGF0YS5wdHIgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gY3ZDbG9uZU1hdCggc3JjICk7CisgICAgICAgICAgICBzcmMgPSB0ZW1wOworICAgICAgICB9CisgICAgICAgIGljdkNyb3NzQ29yciggc3JjLCBrZXJuZWwsIGRzdCwgYW5jaG9yICk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIGljdkZpbHRlcl84dV9DMVJfcCAmJiAoc3JjLT5yb3dzID49IGlwcF9sb3dlcl9saW1pdCB8fCBzcmMtPmNvbHMgPj0gaXBwX2xvd2VyX2xpbWl0KSApCisgICAgeworICAgICAgICBDdkZpbHRlcklQUEZ1bmMgaXBwX2Z1bmMgPSAKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzhVQzEgPyAoQ3ZGaWx0ZXJJUFBGdW5jKWljdkZpbHRlcl84dV9DMVJfcCA6CisgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMzID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfOHVfQzNSX3AgOgorICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfOFVDNCA/IChDdkZpbHRlcklQUEZ1bmMpaWN2RmlsdGVyXzh1X0M0Ul9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzE2U0MxID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMTZzX0MxUl9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzE2U0MzID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMTZzX0MzUl9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzE2U0M0ID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMTZzX0M0Ul9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMxID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMzJmX0MxUl9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMzJmX0MzUl9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkM0ID8gKEN2RmlsdGVySVBQRnVuYylpY3ZGaWx0ZXJfMzJmX0M0Ul9wIDogMDsKKyAgICAgICAgCisgICAgICAgIGlmKCBpcHBfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U2l6ZSBlbF9zaXplID0geyBrZXJuZWwtPmNvbHMsIGtlcm5lbC0+cm93cyB9OworICAgICAgICAgICAgQ3ZQb2ludCBlbF9hbmNob3I7CisgICAgICAgICAgICBpbnQgc3RyaXBlX3NpemUgPSAxIDw8IDE2OyAvLyB0aGUgb3B0aW1hbCB2YWx1ZSBtYXkgZGVwZW5kIG9uIENQVSBjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG92ZXJoZWFkIG9mIGN1cnJlbnQgSVBQIGNvZGUgZXRjLgorICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNoaWZ0ZWRfcHRyOworICAgICAgICAgICAgaW50IGksIGosIHksIGR5ID0gMDsKKyAgICAgICAgICAgIGludCB0ZW1wX3N0ZXAsIGRzdF9zdGVwID0gZHN0LT5zdGVwID8gZHN0LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWFuY2hvci54ID49ICh1bnNpZ25lZClrZXJuZWwtPmNvbHMgfHwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpYW5jaG9yLnkgPj0gKHVuc2lnbmVkKWtlcm5lbC0+cm93cyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJhbmNob3IgcG9pbnQgaXMgb3V0IG9mIGtlcm5lbCIgKTsKKworICAgICAgICAgICAgZWxfYW5jaG9yID0gY3ZQb2ludCggZWxfc2l6ZS53aWR0aCAtIGFuY2hvci54IC0gMSwgZWxfc2l6ZS5oZWlnaHQgLSBhbmNob3IueSAtIDEgKTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggaXBwX2tlcm5lbCA9IGN2Q3JlYXRlTWF0KCBrZXJuZWwtPnJvd3MsIGtlcm5lbC0+Y29scywgQ1ZfMzJGQzEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnQoIGtlcm5lbCwgaXBwX2tlcm5lbCApKTsKKworICAgICAgICAgICAgLy8gbWlycm9yIHRoZSBrZXJuZWwgYXJvdW5kIHRoZSBjZW50ZXIKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAoZWxfc2l6ZS5oZWlnaHQrMSkvMjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCogdG9wX3JvdyA9IGlwcF9rZXJuZWwtPmRhdGEuZmwgKyBlbF9zaXplLndpZHRoKmk7CisgICAgICAgICAgICAgICAgZmxvYXQqIGJvdHRvbV9yb3cgPSBpcHBfa2VybmVsLT5kYXRhLmZsICsgZWxfc2l6ZS53aWR0aCooZWxfc2l6ZS5oZWlnaHQgLSBpIC0gMSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgKGVsX3NpemUud2lkdGgrMSkvMjsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGEgPSB0b3Bfcm93W2pdLCBiID0gdG9wX3Jvd1tlbF9zaXplLndpZHRoIC0gaiAtIDFdOworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjID0gYm90dG9tX3Jvd1tqXSwgZCA9IGJvdHRvbV9yb3dbZWxfc2l6ZS53aWR0aCAtIGogLSAxXTsKKyAgICAgICAgICAgICAgICAgICAgdG9wX3Jvd1tqXSA9IGQ7CisgICAgICAgICAgICAgICAgICAgIHRvcF9yb3dbZWxfc2l6ZS53aWR0aCAtIGogLSAxXSA9IGM7CisgICAgICAgICAgICAgICAgICAgIGJvdHRvbV9yb3dbal0gPSBiOworICAgICAgICAgICAgICAgICAgICBib3R0b21fcm93W2VsX3NpemUud2lkdGggLSBqIC0gMV0gPSBhOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcCA9IGljdklQUEZpbHRlckluaXQoIHNyYywgc3RyaXBlX3NpemUsIGVsX3NpemUgKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNoaWZ0ZWRfcHRyID0gdGVtcC0+ZGF0YS5wdHIgKworICAgICAgICAgICAgICAgIGFuY2hvci55KnRlbXAtPnN0ZXAgKyBhbmNob3IueCpDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgICAgICAgICB0ZW1wX3N0ZXAgPSB0ZW1wLT5zdGVwID8gdGVtcC0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKworICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNyYy0+cm93czsgeSArPSBkeSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHkgPSBpY3ZJUFBGaWx0ZXJOZXh0U3RyaXBlKCBzcmMsIHRlbXAsIHksIGVsX3NpemUsIGFuY2hvciApOworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX2Z1bmMoIHNoaWZ0ZWRfcHRyLCB0ZW1wX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIgKyB5KmRzdF9zdGVwLCBkc3Rfc3RlcCwgY3ZTaXplKHNyYy0+Y29scywgZHkpLAorICAgICAgICAgICAgICAgICAgICBpcHBfa2VybmVsLT5kYXRhLmZsLCBlbF9zaXplLCBlbF9hbmNob3IgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgQ1ZfQ0FMTCggZmlsdGVyLmluaXQoIHNyYy0+Y29scywgdHlwZSwgdHlwZSwga2VybmVsLCBhbmNob3IgKSk7CisgICAgQ1ZfQ0FMTCggZmlsdGVyLnByb2Nlc3MoIHNyYywgZHN0ICkpOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJnRlbXAgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZpcHBfa2VybmVsICk7Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZmbG9vZGZpbGwuY3BwIGIvY3Yvc3JjL2N2Zmxvb2RmaWxsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTY0MjVhCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2Zmxvb2RmaWxsLmNwcApAQCAtMCwwICsxLDExNjAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKK3R5cGVkZWYgc3RydWN0IEN2RkZpbGxTZWdtZW50Cit7CisgICAgdXNob3J0IHk7CisgICAgdXNob3J0IGw7CisgICAgdXNob3J0IHI7CisgICAgdXNob3J0IHByZXZsOworICAgIHVzaG9ydCBwcmV2cjsKKyAgICBzaG9ydCBkaXI7Cit9CitDdkZGaWxsU2VnbWVudDsKKworI2RlZmluZSBVUCAxCisjZGVmaW5lIERPV04gLTEgICAgICAgICAgICAgCisKKyNkZWZpbmUgSUNWX1BVU0goIFksIEwsIFIsIFBSRVZfTCwgUFJFVl9SLCBESVIgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWlsLT55ID0gKHVzaG9ydCkoWSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWlsLT5sID0gKHVzaG9ydCkoTCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWlsLT5yID0gKHVzaG9ydCkoUik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWlsLT5wcmV2bCA9ICh1c2hvcnQpKFBSRVZfTCk7ICAgICAgICAgICAgIFwKKyAgICB0YWlsLT5wcmV2ciA9ICh1c2hvcnQpKFBSRVZfUik7ICAgICAgICAgICAgIFwKKyAgICB0YWlsLT5kaXIgPSAoc2hvcnQpKERJUik7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggKyt0YWlsID49IGJ1ZmZlcl9lbmQgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGFpbCA9IGJ1ZmZlcjsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9QT1AoIFksIEwsIFIsIFBSRVZfTCwgUFJFVl9SLCBESVIgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgWSA9IGhlYWQtPnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTCA9IGhlYWQtPmw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUiA9IGhlYWQtPnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFVl9MID0gaGVhZC0+cHJldmw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUFJFVl9SID0gaGVhZC0+cHJldnI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRElSID0gaGVhZC0+ZGlyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICsraGVhZCA+PSBidWZmZXJfZW5kICkgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhlYWQgPSBidWZmZXI7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfRVFfQzMoIHAxLCBwMiApIFwKKyAgICAoKHAxKVswXSA9PSAocDIpWzBdICYmIChwMSlbMV0gPT0gKHAyKVsxXSAmJiAocDEpWzJdID09IChwMilbMl0pCisKKyNkZWZpbmUgSUNWX1NFVF9DMyggcCwgcSApIFwKKyAgICAoKHApWzBdID0gKHEpWzBdLCAocClbMV0gPSAocSlbMV0sIChwKVsyXSA9IChxKVsyXSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICBTaW1wbGUgRmxvb2RmaWxsIChyZXBhaW50aW5nIHNpbmdsZS1jb2xvciBjb25uZWN0ZWQgY29tcG9uZW50KSAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkZsb29kRmlsbF84dV9DbklSKCB1Y2hhciogcEltYWdlLCBpbnQgc3RlcCwgQ3ZTaXplIHJvaSwgQ3ZQb2ludCBzZWVkLAorICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBfbmV3VmFsLCBDdkNvbm5lY3RlZENvbXAqIHJlZ2lvbiwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgaW50IGNuICkKK3sKKyAgICB1Y2hhciogaW1nID0gcEltYWdlICsgc3RlcCAqIHNlZWQueTsKKyAgICBpbnQgaSwgTCwgUjsgCisgICAgaW50IGFyZWEgPSAwOworICAgIGludCB2YWwwW10gPSB7MCwwLDB9OworICAgIHVjaGFyIG5ld1ZhbFtdID0gezAsMCwwfTsKKyAgICBpbnQgWE1pbiwgWE1heCwgWU1pbiA9IHNlZWQueSwgWU1heCA9IHNlZWQueTsKKyAgICBpbnQgXzhfY29ubmVjdGl2aXR5ID0gKGZsYWdzICYgMjU1KSA9PSA4OworICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXJfZW5kID0gYnVmZmVyICsgYnVmZmVyX3NpemUsICpoZWFkID0gYnVmZmVyLCAqdGFpbCA9IGJ1ZmZlcjsKKworICAgIEwgPSBSID0gWE1pbiA9IFhNYXggPSBzZWVkLng7CisKKyAgICBpZiggY24gPT0gMSApCisgICAgeworICAgICAgICB2YWwwWzBdID0gaW1nW0xdOworICAgICAgICBuZXdWYWxbMF0gPSBfbmV3VmFsWzBdOworCisgICAgICAgIGltZ1tMXSA9IG5ld1ZhbFswXTsKKworICAgICAgICB3aGlsZSggKytSIDwgcm9pLndpZHRoICYmIGltZ1tSXSA9PSB2YWwwWzBdICkKKyAgICAgICAgICAgIGltZ1tSXSA9IG5ld1ZhbFswXTsKKworICAgICAgICB3aGlsZSggLS1MID49IDAgJiYgaW1nW0xdID09IHZhbDBbMF0gKQorICAgICAgICAgICAgaW1nW0xdID0gbmV3VmFsWzBdOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoIGNuID09IDMgKTsKKyAgICAgICAgSUNWX1NFVF9DMyggdmFsMCwgaW1nICsgTCozICk7CisgICAgICAgIElDVl9TRVRfQzMoIG5ld1ZhbCwgX25ld1ZhbCApOworICAgICAgICAKKyAgICAgICAgSUNWX1NFVF9DMyggaW1nICsgTCozLCBuZXdWYWwgKTsKKyAgICAKKyAgICAgICAgd2hpbGUoIC0tTCA+PSAwICYmIElDVl9FUV9DMyggaW1nICsgTCozLCB2YWwwICkpCisgICAgICAgICAgICBJQ1ZfU0VUX0MzKCBpbWcgKyBMKjMsIG5ld1ZhbCApOworICAgIAorICAgICAgICB3aGlsZSggKytSIDwgcm9pLndpZHRoICYmIElDVl9FUV9DMyggaW1nICsgUiozLCB2YWwwICkpCisgICAgICAgICAgICBJQ1ZfU0VUX0MzKCBpbWcgKyBSKjMsIG5ld1ZhbCApOworICAgIH0KKworICAgIFhNYXggPSAtLVI7CisgICAgWE1pbiA9ICsrTDsKKyAgICBJQ1ZfUFVTSCggc2VlZC55LCBMLCBSLCBSICsgMSwgUiwgVVAgKTsKKworICAgIHdoaWxlKCBoZWFkICE9IHRhaWwgKQorICAgIHsKKyAgICAgICAgaW50IGssIFlDLCBQTCwgUFIsIGRpcjsKKyAgICAgICAgSUNWX1BPUCggWUMsIEwsIFIsIFBMLCBQUiwgZGlyICk7CisKKyAgICAgICAgaW50IGRhdGFbXVszXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHstZGlyLCBMIC0gXzhfY29ubmVjdGl2aXR5LCBSICsgXzhfY29ubmVjdGl2aXR5fSwKKyAgICAgICAgICAgIHtkaXIsIEwgLSBfOF9jb25uZWN0aXZpdHksIFBMIC0gMX0sCisgICAgICAgICAgICB7ZGlyLCBQUiArIDEsIFIgKyBfOF9jb25uZWN0aXZpdHl9CisgICAgICAgIH07CisKKyAgICAgICAgaWYoIHJlZ2lvbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFyZWEgKz0gUiAtIEwgKyAxOworCisgICAgICAgICAgICBpZiggWE1heCA8IFIgKSBYTWF4ID0gUjsKKyAgICAgICAgICAgIGlmKCBYTWluID4gTCApIFhNaW4gPSBMOworICAgICAgICAgICAgaWYoIFlNYXggPCBZQyApIFlNYXggPSBZQzsKKyAgICAgICAgICAgIGlmKCBZTWluID4gWUMgKSBZTWluID0gWUM7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGsgPSAwLyoodW5zaWduZWQpKFlDIC0gZGlyKSA+PSAodW5zaWduZWQpcm9pLmhlaWdodCovOyBrIDwgMzsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlyID0gZGF0YVtrXVswXTsKKyAgICAgICAgICAgIGltZyA9IHBJbWFnZSArIChZQyArIGRpcikgKiBzdGVwOworICAgICAgICAgICAgaW50IGxlZnQgPSBkYXRhW2tdWzFdOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gZGF0YVtrXVsyXTsKKworICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoWUMgKyBkaXIpID49ICh1bnNpZ25lZClyb2kuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYoIGNuID09IDEgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWkgPCAodW5zaWduZWQpcm9pLndpZHRoICYmIGltZ1tpXSA9PSB2YWwwWzBdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gbmV3VmFsWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIC0taiA+PSAwICYmIGltZ1tqXSA9PSB2YWwwWzBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdbal0gPSBuZXdWYWxbMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCArK2kgPCByb2kud2lkdGggJiYgaW1nW2ldID09IHZhbDBbMF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1tpXSA9IG5ld1ZhbFswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWkgPCAodW5zaWduZWQpcm9pLndpZHRoICYmIElDVl9FUV9DMyggaW1nICsgaSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIElDVl9TRVRfQzMoIGltZyArIGkqMywgbmV3VmFsICk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1qID49IDAgJiYgSUNWX0VRX0MzKCBpbWcgKyBqKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfU0VUX0MzKCBpbWcgKyBqKjMsIG5ld1ZhbCApOworCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggKytpIDwgcm9pLndpZHRoICYmIElDVl9FUV9DMyggaW1nICsgaSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1NFVF9DMyggaW1nICsgaSozLCBuZXdWYWwgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHJlZ2lvbiApCisgICAgeworICAgICAgICByZWdpb24tPmFyZWEgPSBhcmVhOworICAgICAgICByZWdpb24tPnJlY3QueCA9IFhNaW47CisgICAgICAgIHJlZ2lvbi0+cmVjdC55ID0gWU1pbjsKKyAgICAgICAgcmVnaW9uLT5yZWN0LndpZHRoID0gWE1heCAtIFhNaW4gKyAxOworICAgICAgICByZWdpb24tPnJlY3QuaGVpZ2h0ID0gWU1heCAtIFlNaW4gKyAxOworICAgICAgICByZWdpb24tPnZhbHVlID0gY3ZTY2FsYXIobmV3VmFsWzBdLCBuZXdWYWxbMV0sIG5ld1ZhbFsyXSwgMCk7CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworCisvKiBiZWNhdXNlIGFsbCB0aGUgb3BlcmF0aW9ucyBvbiBmbG9hdHMgdGhhdCBhcmUgZG9uZSBkdXJpbmcgbm9uLWdyYWRpZW50IGZsb29kZmlsbAorICAgYXJlIGp1c3QgY29weWluZyBhbmQgY29tcGFyaXNvbiBvbiBlcXVhbGl0eSwKKyAgIHdlIGNhbiBkbyB0aGUgd2hvbGUgb3Agb24gMzItYml0IGludGVnZXJzIGluc3RlYWQgKi8KK3N0YXRpYyBDdlN0YXR1cworaWN2Rmxvb2RGaWxsXzMyZl9DbklSKCBpbnQqIHBJbWFnZSwgaW50IHN0ZXAsIEN2U2l6ZSByb2ksIEN2UG9pbnQgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiBfbmV3VmFsLCBDdkNvbm5lY3RlZENvbXAqIHJlZ2lvbiwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICBDdkZGaWxsU2VnbWVudCogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIGludCBjbiApCit7CisgICAgaW50KiBpbWcgPSBwSW1hZ2UgKyAoc3RlcCAvPSBzaXplb2YocEltYWdlWzBdKSkgKiBzZWVkLnk7CisgICAgaW50IGksIEwsIFI7IAorICAgIGludCBhcmVhID0gMDsKKyAgICBpbnQgdmFsMFtdID0gezAsMCwwfTsKKyAgICBpbnQgbmV3VmFsW10gPSB7MCwwLDB9OworICAgIGludCBYTWluLCBYTWF4LCBZTWluID0gc2VlZC55LCBZTWF4ID0gc2VlZC55OworICAgIGludCBfOF9jb25uZWN0aXZpdHkgPSAoZmxhZ3MgJiAyNTUpID09IDg7CisgICAgQ3ZGRmlsbFNlZ21lbnQqIGJ1ZmZlcl9lbmQgPSBidWZmZXIgKyBidWZmZXJfc2l6ZSwgKmhlYWQgPSBidWZmZXIsICp0YWlsID0gYnVmZmVyOworCisgICAgTCA9IFIgPSBYTWluID0gWE1heCA9IHNlZWQueDsKKworICAgIGlmKCBjbiA9PSAxICkKKyAgICB7CisgICAgICAgIHZhbDBbMF0gPSBpbWdbTF07CisgICAgICAgIG5ld1ZhbFswXSA9IF9uZXdWYWxbMF07CisKKyAgICAgICAgaW1nW0xdID0gbmV3VmFsWzBdOworCisgICAgICAgIHdoaWxlKCArK1IgPCByb2kud2lkdGggJiYgaW1nW1JdID09IHZhbDBbMF0gKQorICAgICAgICAgICAgaW1nW1JdID0gbmV3VmFsWzBdOworCisgICAgICAgIHdoaWxlKCAtLUwgPj0gMCAmJiBpbWdbTF0gPT0gdmFsMFswXSApCisgICAgICAgICAgICBpbWdbTF0gPSBuZXdWYWxbMF07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFzc2VydCggY24gPT0gMyApOworICAgICAgICBJQ1ZfU0VUX0MzKCB2YWwwLCBpbWcgKyBMKjMgKTsKKyAgICAgICAgSUNWX1NFVF9DMyggbmV3VmFsLCBfbmV3VmFsICk7CisgICAgICAgIAorICAgICAgICBJQ1ZfU0VUX0MzKCBpbWcgKyBMKjMsIG5ld1ZhbCApOworICAgIAorICAgICAgICB3aGlsZSggLS1MID49IDAgJiYgSUNWX0VRX0MzKCBpbWcgKyBMKjMsIHZhbDAgKSkKKyAgICAgICAgICAgIElDVl9TRVRfQzMoIGltZyArIEwqMywgbmV3VmFsICk7CisgICAgCisgICAgICAgIHdoaWxlKCArK1IgPCByb2kud2lkdGggJiYgSUNWX0VRX0MzKCBpbWcgKyBSKjMsIHZhbDAgKSkKKyAgICAgICAgICAgIElDVl9TRVRfQzMoIGltZyArIFIqMywgbmV3VmFsICk7CisgICAgfQorCisgICAgWE1heCA9IC0tUjsKKyAgICBYTWluID0gKytMOworICAgIElDVl9QVVNIKCBzZWVkLnksIEwsIFIsIFIgKyAxLCBSLCBVUCApOworCisgICAgd2hpbGUoIGhlYWQgIT0gdGFpbCApCisgICAgeworICAgICAgICBpbnQgaywgWUMsIFBMLCBQUiwgZGlyOworICAgICAgICBJQ1ZfUE9QKCBZQywgTCwgUiwgUEwsIFBSLCBkaXIgKTsKKworICAgICAgICBpbnQgZGF0YVtdWzNdID0KKyAgICAgICAgeworICAgICAgICAgICAgey1kaXIsIEwgLSBfOF9jb25uZWN0aXZpdHksIFIgKyBfOF9jb25uZWN0aXZpdHl9LAorICAgICAgICAgICAge2RpciwgTCAtIF84X2Nvbm5lY3Rpdml0eSwgUEwgLSAxfSwKKyAgICAgICAgICAgIHtkaXIsIFBSICsgMSwgUiArIF84X2Nvbm5lY3Rpdml0eX0KKyAgICAgICAgfTsKKworICAgICAgICBpZiggcmVnaW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJlYSArPSBSIC0gTCArIDE7CisKKyAgICAgICAgICAgIGlmKCBYTWF4IDwgUiApIFhNYXggPSBSOworICAgICAgICAgICAgaWYoIFhNaW4gPiBMICkgWE1pbiA9IEw7CisgICAgICAgICAgICBpZiggWU1heCA8IFlDICkgWU1heCA9IFlDOworICAgICAgICAgICAgaWYoIFlNaW4gPiBZQyApIFlNaW4gPSBZQzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggayA9IDAvKih1bnNpZ25lZCkoWUMgLSBkaXIpID49ICh1bnNpZ25lZClyb2kuaGVpZ2h0Ki87IGsgPCAzOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXIgPSBkYXRhW2tdWzBdOworICAgICAgICAgICAgaW1nID0gcEltYWdlICsgKFlDICsgZGlyKSAqIHN0ZXA7CisgICAgICAgICAgICBpbnQgbGVmdCA9IGRhdGFba11bMV07CisgICAgICAgICAgICBpbnQgcmlnaHQgPSBkYXRhW2tdWzJdOworCisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKShZQyArIGRpcikgPj0gKHVuc2lnbmVkKXJvaS5oZWlnaHQgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiggY24gPT0gMSApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaSA8ICh1bnNpZ25lZClyb2kud2lkdGggJiYgaW1nW2ldID09IHZhbDBbMF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbWdbaV0gPSBuZXdWYWxbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1qID49IDAgJiYgaW1nW2pdID09IHZhbDBbMF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1tqXSA9IG5ld1ZhbFswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICsraSA8IHJvaS53aWR0aCAmJiBpbWdbaV0gPT0gdmFsMFswXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gbmV3VmFsWzBdOworCisgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVTSCggWUMgKyBkaXIsIGorMSwgaS0xLCBMLCBSLCAtZGlyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaSA8ICh1bnNpZ25lZClyb2kud2lkdGggJiYgSUNWX0VRX0MzKCBpbWcgKyBpKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1NFVF9DMyggaW1nICsgaSozLCBuZXdWYWwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLWogPj0gMCAmJiBJQ1ZfRVFfQzMoIGltZyArIGoqMywgdmFsMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9TRVRfQzMoIGltZyArIGoqMywgbmV3VmFsICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCArK2kgPCByb2kud2lkdGggJiYgSUNWX0VRX0MzKCBpbWcgKyBpKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfU0VUX0MzKCBpbWcgKyBpKjMsIG5ld1ZhbCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVTSCggWUMgKyBkaXIsIGorMSwgaS0xLCBMLCBSLCAtZGlyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggcmVnaW9uICkKKyAgICB7CisgICAgICAgIEN2MzJzdWYgdjAsIHYxLCB2MjsKKyAgICAgICAgcmVnaW9uLT5hcmVhID0gYXJlYTsKKyAgICAgICAgcmVnaW9uLT5yZWN0LnggPSBYTWluOworICAgICAgICByZWdpb24tPnJlY3QueSA9IFlNaW47CisgICAgICAgIHJlZ2lvbi0+cmVjdC53aWR0aCA9IFhNYXggLSBYTWluICsgMTsKKyAgICAgICAgcmVnaW9uLT5yZWN0LmhlaWdodCA9IFlNYXggLSBZTWluICsgMTsKKyAgICAgICAgdjAuaSA9IG5ld1ZhbFswXTsgdjEuaSA9IG5ld1ZhbFsxXTsgdjIuaSA9IG5ld1ZhbFsyXTsKKyAgICAgICAgcmVnaW9uLT52YWx1ZSA9IGN2U2NhbGFyKCB2MC5mLCB2MS5mLCB2Mi5mICk7CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFkaWVudCBGbG9vZGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERJRkZfSU5UX0MxKHAxLHAyKSAoKHVuc2lnbmVkKSgocDEpWzBdIC0gKHAyKVswXSArIGRfbHdbMF0pIDw9IGludGVydmFsWzBdKQorCisjZGVmaW5lIERJRkZfSU5UX0MzKHAxLHAyKSAoKHVuc2lnbmVkKSgocDEpWzBdIC0gKHAyKVswXSArIGRfbHdbMF0pPD0gaW50ZXJ2YWxbMF0gJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoKHAxKVsxXSAtIChwMilbMV0gKyBkX2x3WzFdKTw9IGludGVydmFsWzFdICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKChwMSlbMl0gLSAocDIpWzJdICsgZF9sd1syXSk8PSBpbnRlcnZhbFsyXSkKKworI2RlZmluZSBESUZGX0ZMVF9DMShwMSxwMikgKGZhYnMoKHAxKVswXSAtIChwMilbMF0gKyBkX2x3WzBdKSA8PSBpbnRlcnZhbFswXSkKKworI2RlZmluZSBESUZGX0ZMVF9DMyhwMSxwMikgKGZhYnMoKHAxKVswXSAtIChwMilbMF0gKyBkX2x3WzBdKSA8PSBpbnRlcnZhbFswXSAmJiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFicygocDEpWzFdIC0gKHAyKVsxXSArIGRfbHdbMV0pIDw9IGludGVydmFsWzFdICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWJzKChwMSlbMl0gLSAocDIpWzJdICsgZF9sd1syXSkgPD0gaW50ZXJ2YWxbMl0pCisKK3N0YXRpYyBDdlN0YXR1cworaWN2Rmxvb2RGaWxsX0dyYWRfOHVfQ25JUiggdWNoYXIqIHBJbWFnZSwgaW50IHN0ZXAsIHVjaGFyKiBwTWFzaywgaW50IG1hc2tTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIC8qcm9pKi8sIEN2UG9pbnQgc2VlZCwgdWNoYXIqIF9uZXdWYWwsIHVjaGFyKiBfZF9sdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBfZF91cCwgQ3ZDb25uZWN0ZWRDb21wKiByZWdpb24sIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgaW50IGNuICkKK3sKKyAgICB1Y2hhciogaW1nID0gcEltYWdlICsgc3RlcCpzZWVkLnk7CisgICAgdWNoYXIqIG1hc2sgPSAocE1hc2sgKz0gbWFza1N0ZXAgKyAxKSArIG1hc2tTdGVwKnNlZWQueTsKKyAgICBpbnQgaSwgTCwgUjsKKyAgICBpbnQgYXJlYSA9IDA7CisgICAgaW50IHN1bVtdID0gezAsMCwwfSwgdmFsMFtdID0gezAsMCwwfTsKKyAgICB1Y2hhciBuZXdWYWxbXSA9IHswLDAsMH07CisgICAgaW50IGRfbHdbXSA9IHswLDAsMH07CisgICAgdW5zaWduZWQgaW50ZXJ2YWxbXSA9IHswLDAsMH07CisgICAgaW50IFhNaW4sIFhNYXgsIFlNaW4gPSBzZWVkLnksIFlNYXggPSBzZWVkLnk7CisgICAgaW50IF84X2Nvbm5lY3Rpdml0eSA9IChmbGFncyAmIDI1NSkgPT0gODsKKyAgICBpbnQgZml4ZWRSYW5nZSA9IGZsYWdzICYgQ1ZfRkxPT0RGSUxMX0ZJWEVEX1JBTkdFOworICAgIGludCBmaWxsSW1hZ2UgPSAoZmxhZ3MgJiBDVl9GTE9PREZJTExfTUFTS19PTkxZKSA9PSAwOworICAgIHVjaGFyIG5ld01hc2tWYWwgPSAodWNoYXIpKGZsYWdzICYgMHhmZjAwID8gZmxhZ3MgPj4gOCA6IDEpOworICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXJfZW5kID0gYnVmZmVyICsgYnVmZmVyX3NpemUsICpoZWFkID0gYnVmZmVyLCAqdGFpbCA9IGJ1ZmZlcjsKKworICAgIEwgPSBSID0gc2VlZC54OworICAgIGlmKCBtYXNrW0xdICkKKyAgICAgICAgcmV0dXJuIENWX09LOworCisgICAgbWFza1tMXSA9IG5ld01hc2tWYWw7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY247IGkrKyApCisgICAgeworICAgICAgICBuZXdWYWxbaV0gPSBfbmV3VmFsW2ldOworICAgICAgICBkX2x3W2ldID0gX2RfbHdbaV07CisgICAgICAgIGludGVydmFsW2ldID0gKHVuc2lnbmVkKShfZF91cFtpXSArIF9kX2x3W2ldKTsKKyAgICAgICAgaWYoIGZpeGVkUmFuZ2UgKQorICAgICAgICAgICAgdmFsMFtpXSA9IGltZ1tMKmNuK2ldOworICAgIH0KKworICAgIGlmKCBjbiA9PSAxICkKKyAgICB7CisgICAgICAgIGlmKCBmaXhlZFJhbmdlICkKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUoICFtYXNrW1IgKyAxXSAmJiBESUZGX0lOVF9DMSggaW1nICsgKFIrMSksIHZhbDAgKSkKKyAgICAgICAgICAgICAgICBtYXNrWysrUl0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICB3aGlsZSggIW1hc2tbTCAtIDFdICYmIERJRkZfSU5UX0MxKCBpbWcgKyAoTC0xKSwgdmFsMCApKQorICAgICAgICAgICAgICAgIG1hc2tbLS1MXSA9IG5ld01hc2tWYWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSggIW1hc2tbUiArIDFdICYmIERJRkZfSU5UX0MxKCBpbWcgKyAoUisxKSwgaW1nICsgUiApKQorICAgICAgICAgICAgICAgIG1hc2tbKytSXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgIHdoaWxlKCAhbWFza1tMIC0gMV0gJiYgRElGRl9JTlRfQzEoIGltZyArIChMLTEpLCBpbWcgKyBMICkpCisgICAgICAgICAgICAgICAgbWFza1stLUxdID0gbmV3TWFza1ZhbDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggZml4ZWRSYW5nZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbWFza1tSICsgMV0gJiYgRElGRl9JTlRfQzMoIGltZyArIChSKzEpKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICBtYXNrWysrUl0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICB3aGlsZSggIW1hc2tbTCAtIDFdICYmIERJRkZfSU5UX0MzKCBpbWcgKyAoTC0xKSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgbWFza1stLUxdID0gbmV3TWFza1ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbWFza1tSICsgMV0gJiYgRElGRl9JTlRfQzMoIGltZyArIChSKzEpKjMsIGltZyArIFIqMyApKQorICAgICAgICAgICAgICAgIG1hc2tbKytSXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgIHdoaWxlKCAhbWFza1tMIC0gMV0gJiYgRElGRl9JTlRfQzMoIGltZyArIChMLTEpKjMsIGltZyArIEwqMyApKQorICAgICAgICAgICAgICAgIG1hc2tbLS1MXSA9IG5ld01hc2tWYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBYTWF4ID0gUjsKKyAgICBYTWluID0gTDsKKyAgICBJQ1ZfUFVTSCggc2VlZC55LCBMLCBSLCBSICsgMSwgUiwgVVAgKTsKKworICAgIHdoaWxlKCBoZWFkICE9IHRhaWwgKQorICAgIHsKKyAgICAgICAgaW50IGssIFlDLCBQTCwgUFIsIGRpciwgY3Vyc3RlcDsKKyAgICAgICAgSUNWX1BPUCggWUMsIEwsIFIsIFBMLCBQUiwgZGlyICk7CisKKyAgICAgICAgaW50IGRhdGFbXVszXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIHstZGlyLCBMIC0gXzhfY29ubmVjdGl2aXR5LCBSICsgXzhfY29ubmVjdGl2aXR5fSwKKyAgICAgICAgICAgIHtkaXIsIEwgLSBfOF9jb25uZWN0aXZpdHksIFBMIC0gMX0sCisgICAgICAgICAgICB7ZGlyLCBQUiArIDEsIFIgKyBfOF9jb25uZWN0aXZpdHl9CisgICAgICAgIH07CisKKyAgICAgICAgdW5zaWduZWQgbGVuZ3RoID0gKHVuc2lnbmVkKShSLUwpOworCisgICAgICAgIGlmKCByZWdpb24gKQorICAgICAgICB7CisgICAgICAgICAgICBhcmVhICs9IChpbnQpbGVuZ3RoICsgMTsKKworICAgICAgICAgICAgaWYoIFhNYXggPCBSICkgWE1heCA9IFI7CisgICAgICAgICAgICBpZiggWE1pbiA+IEwgKSBYTWluID0gTDsKKyAgICAgICAgICAgIGlmKCBZTWF4IDwgWUMgKSBZTWF4ID0gWUM7CisgICAgICAgICAgICBpZiggWU1pbiA+IFlDICkgWU1pbiA9IFlDOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGNuID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMzsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXIgPSBkYXRhW2tdWzBdOworICAgICAgICAgICAgICAgIGN1cnN0ZXAgPSBkaXIgKiBzdGVwOworICAgICAgICAgICAgICAgIGltZyA9IHBJbWFnZSArIChZQyArIGRpcikgKiBzdGVwOworICAgICAgICAgICAgICAgIG1hc2sgPSBwTWFzayArIChZQyArIGRpcikgKiBtYXNrU3RlcDsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdCA9IGRhdGFba11bMV07CisgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gZGF0YVtrXVsyXTsKKworICAgICAgICAgICAgICAgIGlmKCBmaXhlZFJhbmdlICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmIERJRkZfSU5UX0MxKCBpbWcgKyBpLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1stLWpdICYmIERJRkZfSU5UX0MxKCBpbWcgKyBqLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbal0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWysraV0gJiYgRElGRl9JTlRfQzEoIGltZyArIGksIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVTSCggWUMgKyBkaXIsIGorMSwgaS0xLCBMLCBSLCAtZGlyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCAhXzhfY29ubmVjdGl2aXR5ICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmIERJRkZfSU5UX0MxKCBpbWcgKyBpLCBpbWcgLSBjdXJzdGVwICsgaSApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbLS1qXSAmJiBESUZGX0lOVF9DMSggaW1nICsgaiwgaW1nICsgKGorMSkgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tqXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbKytpXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRElGRl9JTlRfQzEoIGltZyArIGksIGltZyArIChpLTEpICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERJRkZfSU5UX0MxKCBpbWcgKyBpLCBpbWcgKyBpIC0gY3Vyc3RlcCkgJiYgaSA8PSBSKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSBsZWZ0OyBpIDw9IHJpZ2h0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4LCB2YWxbMV07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIW1hc2tbaV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh2YWxbMF0gPSBpbWdbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShpZHggPSBpLUwtMSkgPD0gbGVuZ3RoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MxKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaS0xKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MxKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyBpICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MxKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaSsxKSApKSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1stLWpdICYmIERJRkZfSU5UX0MxKCBpbWcgKyBqLCBpbWcgKyAoaisxKSApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2pdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1srK2ldICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodmFsWzBdID0gaW1nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0lOVF9DMSggdmFsLCBpbWcgKyAoaS0xKSApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCkoaWR4ID0gaS1MLTEpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0lOVF9DMSggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGktMSkgKSkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpKCsraWR4KSA8PSBsZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9JTlRfQzEoIHZhbCwgaW1nIC0gY3Vyc3RlcCArIGkgKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0lOVF9DMSggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGkrMSkgKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVNIKCBZQyArIGRpciwgaisxLCBpLTEsIEwsIFIsIC1kaXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWcgPSBwSW1hZ2UgKyBZQyAqIHN0ZXA7CisgICAgICAgICAgICBpZiggZmlsbEltYWdlICkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSBMOyBpIDw9IFI7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGltZ1tpXSA9IG5ld1ZhbFswXTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHJlZ2lvbiApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gTDsgaSA8PSBSOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBzdW1bMF0gKz0gaW1nW2ldOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDM7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlyID0gZGF0YVtrXVswXTsKKyAgICAgICAgICAgICAgICBjdXJzdGVwID0gZGlyICogc3RlcDsKKyAgICAgICAgICAgICAgICBpbWcgPSBwSW1hZ2UgKyAoWUMgKyBkaXIpICogc3RlcDsKKyAgICAgICAgICAgICAgICBtYXNrID0gcE1hc2sgKyAoWUMgKyBkaXIpICogbWFza1N0ZXA7CisgICAgICAgICAgICAgICAgaW50IGxlZnQgPSBkYXRhW2tdWzFdOworICAgICAgICAgICAgICAgIGludCByaWdodCA9IGRhdGFba11bMl07CisKKyAgICAgICAgICAgICAgICBpZiggZml4ZWRSYW5nZSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFza1tpXSAmJiBESUZGX0lOVF9DMyggaW1nICsgaSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1stLWpdICYmIERJRkZfSU5UX0MzKCBpbWcgKyBqKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tqXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbKytpXSAmJiBESUZGX0lOVF9DMyggaW1nICsgaSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggIV84X2Nvbm5lY3Rpdml0eSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFza1tpXSAmJiBESUZGX0lOVF9DMyggaW1nICsgaSozLCBpbWcgLSBjdXJzdGVwICsgaSozICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGogPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1stLWpdICYmIERJRkZfSU5UX0MzKCBpbWcgKyBqKjMsIGltZyArIChqKzEpKjMgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tqXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbKytpXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRElGRl9JTlRfQzMoIGltZyArIGkqMywgaW1nICsgKGktMSkqMyApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChESUZGX0lOVF9DMyggaW1nICsgaSozLCBpbWcgKyBpKjMgLSBjdXJzdGVwKSAmJiBpIDw9IFIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVTSCggWUMgKyBkaXIsIGorMSwgaS0xLCBMLCBSLCAtZGlyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHgsIHZhbFszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoSUNWX1NFVF9DMyggdmFsLCBpbWcraSozICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShpZHggPSBpLUwtMSkgPD0gbGVuZ3RoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MzKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaS0xKSozICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MzKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyBpKjMgKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSgrK2lkeCkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9JTlRfQzMoIHZhbCwgaW1nIC0gY3Vyc3RlcCArIChpKzEpKjMgKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbLS1qXSAmJiBESUZGX0lOVF9DMyggaW1nICsgaiozLCBpbWcgKyAoaisxKSozICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbal0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWysraV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChJQ1ZfU0VUX0MzKCB2YWwsIGltZyArIGkqMyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0lOVF9DMyggdmFsLCBpbWcgKyAoaS0xKSozICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkKShpZHggPSBpLUwtMSkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MzKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaS0xKSozICkpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSgrK2lkeCkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfSU5UX0MzKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyBpKjMgKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0lOVF9DMyggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGkrMSkqMyApKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltZyA9IHBJbWFnZSArIFlDICogc3RlcDsKKyAgICAgICAgICAgIGlmKCBmaWxsSW1hZ2UgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IEw7IGkgPD0gUjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgSUNWX1NFVF9DMyggaW1nICsgaSozLCBuZXdWYWwgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHJlZ2lvbiApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gTDsgaSA8PSBSOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtWzBdICs9IGltZ1tpKjNdOworICAgICAgICAgICAgICAgICAgICBzdW1bMV0gKz0gaW1nW2kqMysxXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtWzJdICs9IGltZ1tpKjMrMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHJlZ2lvbiApCisgICAgeworICAgICAgICByZWdpb24tPmFyZWEgPSBhcmVhOworICAgICAgICByZWdpb24tPnJlY3QueCA9IFhNaW47CisgICAgICAgIHJlZ2lvbi0+cmVjdC55ID0gWU1pbjsKKyAgICAgICAgcmVnaW9uLT5yZWN0LndpZHRoID0gWE1heCAtIFhNaW4gKyAxOworICAgICAgICByZWdpb24tPnJlY3QuaGVpZ2h0ID0gWU1heCAtIFlNaW4gKyAxOworCisgICAgICAgIGlmKCBmaWxsSW1hZ2UgKQorICAgICAgICAgICAgcmVnaW9uLT52YWx1ZSA9IGN2U2NhbGFyKG5ld1ZhbFswXSwgbmV3VmFsWzFdLCBuZXdWYWxbMl0pOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBpYXJlYSA9IGFyZWEgPyAxLi9hcmVhIDogMDsKKyAgICAgICAgICAgIHJlZ2lvbi0+dmFsdWUgPSBjdlNjYWxhcihzdW1bMF0qaWFyZWEsIHN1bVsxXSppYXJlYSwgc3VtWzJdKmlhcmVhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworc3RhdGljIEN2U3RhdHVzCitpY3ZGbG9vZEZpbGxfR3JhZF8zMmZfQ25JUiggZmxvYXQqIHBJbWFnZSwgaW50IHN0ZXAsIHVjaGFyKiBwTWFzaywgaW50IG1hc2tTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIC8qcm9pKi8sIEN2UG9pbnQgc2VlZCwgZmxvYXQqIF9uZXdWYWwsIGZsb2F0KiBfZF9sdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBfZF91cCwgQ3ZDb25uZWN0ZWRDb21wKiByZWdpb24sIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXIsIGludCBidWZmZXJfc2l6ZSwgaW50IGNuICkKK3sKKyAgICBmbG9hdCogaW1nID0gcEltYWdlICsgKHN0ZXAgLz0gc2l6ZW9mKGZsb2F0KSkqc2VlZC55OworICAgIHVjaGFyKiBtYXNrID0gKHBNYXNrICs9IG1hc2tTdGVwICsgMSkgKyBtYXNrU3RlcCpzZWVkLnk7CisgICAgaW50IGksIEwsIFI7CisgICAgaW50IGFyZWEgPSAwOworICAgIGRvdWJsZSBzdW1bXSA9IHswLDAsMH0sIHZhbDBbXSA9IHswLDAsMH07CisgICAgZmxvYXQgbmV3VmFsW10gPSB7MCwwLDB9OworICAgIGZsb2F0IGRfbHdbXSA9IHswLDAsMH07CisgICAgZmxvYXQgaW50ZXJ2YWxbXSA9IHswLDAsMH07CisgICAgaW50IFhNaW4sIFhNYXgsIFlNaW4gPSBzZWVkLnksIFlNYXggPSBzZWVkLnk7CisgICAgaW50IF84X2Nvbm5lY3Rpdml0eSA9IChmbGFncyAmIDI1NSkgPT0gODsKKyAgICBpbnQgZml4ZWRSYW5nZSA9IGZsYWdzICYgQ1ZfRkxPT0RGSUxMX0ZJWEVEX1JBTkdFOworICAgIGludCBmaWxsSW1hZ2UgPSAoZmxhZ3MgJiBDVl9GTE9PREZJTExfTUFTS19PTkxZKSA9PSAwOworICAgIHVjaGFyIG5ld01hc2tWYWwgPSAodWNoYXIpKGZsYWdzICYgMHhmZjAwID8gZmxhZ3MgPj4gOCA6IDEpOworICAgIEN2RkZpbGxTZWdtZW50KiBidWZmZXJfZW5kID0gYnVmZmVyICsgYnVmZmVyX3NpemUsICpoZWFkID0gYnVmZmVyLCAqdGFpbCA9IGJ1ZmZlcjsKKworICAgIEwgPSBSID0gc2VlZC54OworICAgIGlmKCBtYXNrW0xdICkKKyAgICAgICAgcmV0dXJuIENWX09LOworCisgICAgbWFza1tMXSA9IG5ld01hc2tWYWw7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY247IGkrKyApCisgICAgeworICAgICAgICBuZXdWYWxbaV0gPSBfbmV3VmFsW2ldOworICAgICAgICBkX2x3W2ldID0gMC41ZiooX2RfbHdbaV0gLSBfZF91cFtpXSk7CisgICAgICAgIGludGVydmFsW2ldID0gMC41ZiooX2RfbHdbaV0gKyBfZF91cFtpXSk7CisgICAgICAgIGlmKCBmaXhlZFJhbmdlICkKKyAgICAgICAgICAgIHZhbDBbaV0gPSBpbWdbTCpjbitpXTsKKyAgICB9CisKKyAgICBpZiggY24gPT0gMSApCisgICAgeworICAgICAgICBpZiggZml4ZWRSYW5nZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCAhbWFza1tSICsgMV0gJiYgRElGRl9GTFRfQzEoIGltZyArIChSKzEpLCB2YWwwICkpCisgICAgICAgICAgICAgICAgbWFza1srK1JdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgd2hpbGUoICFtYXNrW0wgLSAxXSAmJiBESUZGX0ZMVF9DMSggaW1nICsgKEwtMSksIHZhbDAgKSkKKyAgICAgICAgICAgICAgICBtYXNrWy0tTF0gPSBuZXdNYXNrVmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUoICFtYXNrW1IgKyAxXSAmJiBESUZGX0ZMVF9DMSggaW1nICsgKFIrMSksIGltZyArIFIgKSkKKyAgICAgICAgICAgICAgICBtYXNrWysrUl0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICB3aGlsZSggIW1hc2tbTCAtIDFdICYmIERJRkZfRkxUX0MxKCBpbWcgKyAoTC0xKSwgaW1nICsgTCApKQorICAgICAgICAgICAgICAgIG1hc2tbLS1MXSA9IG5ld01hc2tWYWw7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGZpeGVkUmFuZ2UgKQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSggIW1hc2tbUiArIDFdICYmIERJRkZfRkxUX0MzKCBpbWcgKyAoUisxKSozLCB2YWwwICkpCisgICAgICAgICAgICAgICAgbWFza1srK1JdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgd2hpbGUoICFtYXNrW0wgLSAxXSAmJiBESUZGX0ZMVF9DMyggaW1nICsgKEwtMSkqMywgdmFsMCApKQorICAgICAgICAgICAgICAgIG1hc2tbLS1MXSA9IG5ld01hc2tWYWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSggIW1hc2tbUiArIDFdICYmIERJRkZfRkxUX0MzKCBpbWcgKyAoUisxKSozLCBpbWcgKyBSKjMgKSkKKyAgICAgICAgICAgICAgICBtYXNrWysrUl0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICB3aGlsZSggIW1hc2tbTCAtIDFdICYmIERJRkZfRkxUX0MzKCBpbWcgKyAoTC0xKSozLCBpbWcgKyBMKjMgKSkKKyAgICAgICAgICAgICAgICBtYXNrWy0tTF0gPSBuZXdNYXNrVmFsOworICAgICAgICB9CisgICAgfQorCisgICAgWE1heCA9IFI7CisgICAgWE1pbiA9IEw7CisgICAgSUNWX1BVU0goIHNlZWQueSwgTCwgUiwgUiArIDEsIFIsIFVQICk7CisKKyAgICB3aGlsZSggaGVhZCAhPSB0YWlsICkKKyAgICB7CisgICAgICAgIGludCBrLCBZQywgUEwsIFBSLCBkaXIsIGN1cnN0ZXA7CisgICAgICAgIElDVl9QT1AoIFlDLCBMLCBSLCBQTCwgUFIsIGRpciApOworCisgICAgICAgIGludCBkYXRhW11bM10gPQorICAgICAgICB7CisgICAgICAgICAgICB7LWRpciwgTCAtIF84X2Nvbm5lY3Rpdml0eSwgUiArIF84X2Nvbm5lY3Rpdml0eX0sCisgICAgICAgICAgICB7ZGlyLCBMIC0gXzhfY29ubmVjdGl2aXR5LCBQTCAtIDF9LAorICAgICAgICAgICAge2RpciwgUFIgKyAxLCBSICsgXzhfY29ubmVjdGl2aXR5fQorICAgICAgICB9OworCisgICAgICAgIHVuc2lnbmVkIGxlbmd0aCA9ICh1bnNpZ25lZCkoUi1MKTsKKworICAgICAgICBpZiggcmVnaW9uICkKKyAgICAgICAgeworICAgICAgICAgICAgYXJlYSArPSAoaW50KWxlbmd0aCArIDE7CisKKyAgICAgICAgICAgIGlmKCBYTWF4IDwgUiApIFhNYXggPSBSOworICAgICAgICAgICAgaWYoIFhNaW4gPiBMICkgWE1pbiA9IEw7CisgICAgICAgICAgICBpZiggWU1heCA8IFlDICkgWU1heCA9IFlDOworICAgICAgICAgICAgaWYoIFlNaW4gPiBZQyApIFlNaW4gPSBZQzsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IDM7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlyID0gZGF0YVtrXVswXTsKKyAgICAgICAgICAgICAgICBjdXJzdGVwID0gZGlyICogc3RlcDsKKyAgICAgICAgICAgICAgICBpbWcgPSBwSW1hZ2UgKyAoWUMgKyBkaXIpICogc3RlcDsKKyAgICAgICAgICAgICAgICBtYXNrID0gcE1hc2sgKyAoWUMgKyBkaXIpICogbWFza1N0ZXA7CisgICAgICAgICAgICAgICAgaW50IGxlZnQgPSBkYXRhW2tdWzFdOworICAgICAgICAgICAgICAgIGludCByaWdodCA9IGRhdGFba11bMl07CisKKyAgICAgICAgICAgICAgICBpZiggZml4ZWRSYW5nZSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFza1tpXSAmJiBESUZGX0ZMVF9DMSggaW1nICsgaSwgdmFsMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbLS1qXSAmJiBESUZGX0ZMVF9DMSggaW1nICsgaiwgdmFsMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2pdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1srK2ldICYmIERJRkZfRkxUX0MxKCBpbWcgKyBpLCB2YWwwICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggIV84X2Nvbm5lY3Rpdml0eSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IGxlZnQ7IGkgPD0gcmlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFza1tpXSAmJiBESUZGX0ZMVF9DMSggaW1nICsgaSwgaW1nIC0gY3Vyc3RlcCArIGkgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWy0tal0gJiYgRElGRl9GTFRfQzEoIGltZyArIGosIGltZyArIChqKzEpICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbal0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWysraV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERJRkZfRkxUX0MxKCBpbWcgKyBpLCBpbWcgKyAoaS0xKSApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChESUZGX0ZMVF9DMSggaW1nICsgaSwgaW1nICsgaSAtIGN1cnN0ZXApICYmIGkgPD0gUikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVNIKCBZQyArIGRpciwgaisxLCBpLTEsIEwsIFIsIC1kaXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbFsxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgodmFsWzBdID0gaW1nW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoaWR4ID0gaS1MLTEpIDw9IGxlbmd0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMSggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGktMSkgKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSgrK2lkeCkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9GTFRfQzEoIHZhbCwgaW1nIC0gY3Vyc3RlcCArIGkgKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSgrK2lkeCkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9GTFRfQzEoIHZhbCwgaW1nIC0gY3Vyc3RlcCArIChpKzEpICkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWy0tal0gJiYgRElGRl9GTFRfQzEoIGltZyArIGosIGltZyArIChqKzEpICkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbal0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWysraV0gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh2YWxbMF0gPSBpbWdbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRkxUX0MxKCB2YWwsIGltZyArIChpLTEpICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKHVuc2lnbmVkKShpZHggPSBpLUwtMSkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRkxUX0MxKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaS0xKSApKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMSggdmFsLCBpbWcgLSBjdXJzdGVwICsgaSApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKSgrK2lkeCkgPD0gbGVuZ3RoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRkxUX0MxKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaSsxKSApKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tbaV0gPSBuZXdNYXNrVmFsOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVU0goIFlDICsgZGlyLCBqKzEsIGktMSwgTCwgUiwgLWRpciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGltZyA9IHBJbWFnZSArIFlDICogc3RlcDsKKyAgICAgICAgICAgIGlmKCBmaWxsSW1hZ2UgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IEw7IGkgPD0gUjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgaW1nW2ldID0gbmV3VmFsWzBdOworICAgICAgICAgICAgZWxzZSBpZiggcmVnaW9uICkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSBMOyBpIDw9IFI7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHN1bVswXSArPSBpbWdbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMzsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXIgPSBkYXRhW2tdWzBdOworICAgICAgICAgICAgICAgIGN1cnN0ZXAgPSBkaXIgKiBzdGVwOworICAgICAgICAgICAgICAgIGltZyA9IHBJbWFnZSArIChZQyArIGRpcikgKiBzdGVwOworICAgICAgICAgICAgICAgIG1hc2sgPSBwTWFzayArIChZQyArIGRpcikgKiBtYXNrU3RlcDsKKyAgICAgICAgICAgICAgICBpbnQgbGVmdCA9IGRhdGFba11bMV07CisgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gZGF0YVtrXVsyXTsKKworICAgICAgICAgICAgICAgIGlmKCBmaXhlZFJhbmdlICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmIERJRkZfRkxUX0MzKCBpbWcgKyBpKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWy0tal0gJiYgRElGRl9GTFRfQzMoIGltZyArIGoqMywgdmFsMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2pdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1srK2ldICYmIERJRkZfRkxUX0MzKCBpbWcgKyBpKjMsIHZhbDAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVTSCggWUMgKyBkaXIsIGorMSwgaS0xLCBMLCBSLCAtZGlyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCAhXzhfY29ubmVjdGl2aXR5ICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrW2ldICYmIERJRkZfRkxUX0MzKCBpbWcgKyBpKjMsIGltZyAtIGN1cnN0ZXAgKyBpKjMgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWy0tal0gJiYgRElGRl9GTFRfQzMoIGltZyArIGoqMywgaW1nICsgKGorMSkqMyApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2pdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1srK2ldICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChESUZGX0ZMVF9DMyggaW1nICsgaSozLCBpbWcgKyAoaS0xKSozICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKERJRkZfRkxUX0MzKCBpbWcgKyBpKjMsIGltZyArIGkqMyAtIGN1cnN0ZXApICYmIGkgPD0gUikpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVNIKCBZQyArIGRpciwgaisxLCBpLTEsIEwsIFIsIC1kaXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbFszXTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFza1tpXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKElDVl9TRVRfQzMoIHZhbCwgaW1nK2kqMyApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoaWR4ID0gaS1MLTEpIDw9IGxlbmd0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMyggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGktMSkqMyApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpKCsraWR4KSA8PSBsZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMyggdmFsLCBpbWcgLSBjdXJzdGVwICsgaSozICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRkZfRkxUX0MzKCB2YWwsIGltZyAtIGN1cnN0ZXAgKyAoaSsxKSozICkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IG5ld01hc2tWYWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICFtYXNrWy0tal0gJiYgRElGRl9GTFRfQzMoIGltZyArIGoqMywgaW1nICsgKGorMSkqMyApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2pdID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1srK2ldICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSUNWX1NFVF9DMyggdmFsLCBpbWcgKyBpKjMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9GTFRfQzMoIHZhbCwgaW1nICsgKGktMSkqMyApKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCh1bnNpZ25lZCkoaWR4ID0gaS1MLTEpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMyggdmFsLCBpbWcgLSBjdXJzdGVwICsgKGktMSkqMyApKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCkoKytpZHgpIDw9IGxlbmd0aCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZGX0ZMVF9DMyggdmFsLCBpbWcgLSBjdXJzdGVwICsgaSozICkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpKCsraWR4KSA8PSBsZW5ndGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGRl9GTFRfQzMoIHZhbCwgaW1nIC0gY3Vyc3RlcCArIChpKzEpKjMgKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrW2ldID0gbmV3TWFza1ZhbDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVNIKCBZQyArIGRpciwgaisxLCBpLTEsIEwsIFIsIC1kaXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbWcgPSBwSW1hZ2UgKyBZQyAqIHN0ZXA7CisgICAgICAgICAgICBpZiggZmlsbEltYWdlICkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSBMOyBpIDw9IFI7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIElDVl9TRVRfQzMoIGltZyArIGkqMywgbmV3VmFsICk7CisgICAgICAgICAgICBlbHNlIGlmKCByZWdpb24gKQorICAgICAgICAgICAgICAgIGZvciggaSA9IEw7IGkgPD0gUjsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bVswXSArPSBpbWdbaSozXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtWzFdICs9IGltZ1tpKjMrMV07CisgICAgICAgICAgICAgICAgICAgIHN1bVsyXSArPSBpbWdbaSozKzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZiggcmVnaW9uICkKKyAgICB7CisgICAgICAgIHJlZ2lvbi0+YXJlYSA9IGFyZWE7CisgICAgICAgIHJlZ2lvbi0+cmVjdC54ID0gWE1pbjsKKyAgICAgICAgcmVnaW9uLT5yZWN0LnkgPSBZTWluOworICAgICAgICByZWdpb24tPnJlY3Qud2lkdGggPSBYTWF4IC0gWE1pbiArIDE7CisgICAgICAgIHJlZ2lvbi0+cmVjdC5oZWlnaHQgPSBZTWF4IC0gWU1pbiArIDE7CisgICAgCisgICAgICAgIGlmKCBmaWxsSW1hZ2UgKQorICAgICAgICAgICAgcmVnaW9uLT52YWx1ZSA9IGN2U2NhbGFyKG5ld1ZhbFswXSwgbmV3VmFsWzFdLCBuZXdWYWxbMl0pOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBpYXJlYSA9IGFyZWEgPyAxLi9hcmVhIDogMDsKKyAgICAgICAgICAgIHJlZ2lvbi0+dmFsdWUgPSBjdlNjYWxhcihzdW1bMF0qaWFyZWEsIHN1bVsxXSppYXJlYSwgc3VtWzJdKmlhcmVhKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmICBDdlN0YXR1cyAoQ1ZfQ0RFQ0wqIEN2Rmxvb2RGaWxsRnVuYykoCisgICAgICAgICAgICAgICB2b2lkKiBpbWcsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgQ3ZQb2ludCBzZWVkLCB2b2lkKiBuZXd2YWwsCisgICAgICAgICAgICAgICBDdkNvbm5lY3RlZENvbXAqIGNvbXAsIGludCBmbGFncywgdm9pZCogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUsIGludCBjbiApOworCit0eXBlZGVmICBDdlN0YXR1cyAoQ1ZfQ0RFQ0wqIEN2Rmxvb2RGaWxsR3JhZEZ1bmMpKAorICAgICAgICAgICAgICAgdm9pZCogaW1nLCBpbnQgc3RlcCwgdWNoYXIqIG1hc2ssIGludCBtYXNrU3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICBDdlBvaW50IHNlZWQsIHZvaWQqIG5ld3ZhbCwgdm9pZCogZF9sdywgdm9pZCogZF91cCwgdm9pZCogY2NvbXAsCisgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIHZvaWQqIGJ1ZmZlciwgaW50IGJ1ZmZlcl9zaXplLCBpbnQgY24gKTsKKworc3RhdGljICB2b2lkICBpY3ZJbml0Rmxvb2RGaWxsKCB2b2lkKiogZmZpbGxfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogZmZpbGxncmFkX3RhYiApCit7CisgICAgZmZpbGxfdGFiWzBdID0gKHZvaWQqKWljdkZsb29kRmlsbF84dV9DbklSOworICAgIGZmaWxsX3RhYlsxXSA9ICh2b2lkKilpY3ZGbG9vZEZpbGxfMzJmX0NuSVI7CisKKyAgICBmZmlsbGdyYWRfdGFiWzBdID0gKHZvaWQqKWljdkZsb29kRmlsbF9HcmFkXzh1X0NuSVI7CisgICAgZmZpbGxncmFkX3RhYlsxXSA9ICh2b2lkKilpY3ZGbG9vZEZpbGxfR3JhZF8zMmZfQ25JUjsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Rmxvb2RGaWxsKCBDdkFyciogYXJyLCBDdlBvaW50IHNlZWRfcG9pbnQsCisgICAgICAgICAgICAgQ3ZTY2FsYXIgbmV3VmFsLCBDdlNjYWxhciBsb19kaWZmLCBDdlNjYWxhciB1cF9kaWZmLAorICAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCogY29tcCwgaW50IGZsYWdzLCBDdkFyciogbWFza2FyciApCit7CisgICAgc3RhdGljIHZvaWQqIGZmaWxsX3RhYls0XTsKKyAgICBzdGF0aWMgdm9pZCogZmZpbGxncmFkX3RhYls0XTsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ3ZNYXQqIHRlbXBNYXNrID0gMDsKKyAgICBDdkZGaWxsU2VnbWVudCogYnVmZmVyID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2Rmxvb2RGaWxsIiApOworCisgICAgaWYoIGNvbXAgKQorICAgICAgICBtZW1zZXQoIGNvbXAsIDAsIHNpemVvZigqY29tcCkgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCB0eXBlLCBkZXB0aCwgY24sIGlzX3NpbXBsZSwgaWR4OworICAgIGludCBidWZmZXJfc2l6ZSwgY29ubmVjdGl2aXR5ID0gZmxhZ3MgJiAyNTU7CisgICAgZG91YmxlIG52X2J1Zls0XSA9IHswLDAsMCwwfTsKKyAgICB1bmlvbiB7IHVjaGFyIGJbNF07IGZsb2F0IGZbNF07IH0gbGRfYnVmLCB1ZF9idWY7CisgICAgQ3ZNYXQgc3R1YiwgKmltZyA9IChDdk1hdCopYXJyOworICAgIEN2TWF0IG1hc2tzdHViLCAqbWFzayA9IChDdk1hdCopbWFza2FycjsKKyAgICBDdlNpemUgc2l6ZTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0Rmxvb2RGaWxsKCBmZmlsbF90YWIsIGZmaWxsZ3JhZF90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggaW1nID0gY3ZHZXRNYXQoIGltZywgJnN0dWIgKSk7CisgICAgdHlwZSA9IENWX01BVF9UWVBFKCBpbWctPnR5cGUgKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKworICAgIGlkeCA9IHR5cGUgPT0gQ1ZfOFVDMSB8fCB0eXBlID09IENWXzhVQzMgPyAwIDoKKyAgICAgICAgICB0eXBlID09IENWXzMyRkMxIHx8IHR5cGUgPT0gQ1ZfMzJGQzMgPyAxIDogLTE7CisKKyAgICBpZiggaWR4IDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCBjb25uZWN0aXZpdHkgPT0gMCApCisgICAgICAgIGNvbm5lY3Rpdml0eSA9IDQ7CisgICAgZWxzZSBpZiggY29ubmVjdGl2aXR5ICE9IDQgJiYgY29ubmVjdGl2aXR5ICE9IDggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkRmxhZywgIkNvbm5lY3Rpdml0eSBtdXN0IGJlIDQsIDAoPTQpIG9yIDgiICk7CisKKyAgICBpc19zaW1wbGUgPSBtYXNrID09IDAgJiYgKGZsYWdzICYgQ1ZfRkxPT0RGSUxMX01BU0tfT05MWSkgPT0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPCBjbjsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBsb19kaWZmLnZhbFtpXSA8IDAgfHwgdXBfZGlmZi52YWxbaV0gPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJsb19kaWZmIGFuZCB1cF9kaWZmIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiApOworICAgICAgICBpc19zaW1wbGUgJj0gZmFicyhsb19kaWZmLnZhbFtpXSkgPCBEQkxfRVBTSUxPTiAmJiBmYWJzKHVwX2RpZmYudmFsW2ldKSA8IERCTF9FUFNJTE9OOworICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIGltZyApOworCisgICAgaWYoICh1bnNpZ25lZClzZWVkX3BvaW50LnggPj0gKHVuc2lnbmVkKXNpemUud2lkdGggfHwKKyAgICAgICAgKHVuc2lnbmVkKXNlZWRfcG9pbnQueSA+PSAodW5zaWduZWQpc2l6ZS5oZWlnaHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNlZWQgcG9pbnQgaXMgb3V0c2lkZSBvZiBpbWFnZSIgKTsKKworICAgIGN2U2NhbGFyVG9SYXdEYXRhKCAmbmV3VmFsLCAmbnZfYnVmLCB0eXBlLCAwICk7CisgICAgYnVmZmVyX3NpemUgPSBNQVgoIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICkqMjsKKyAgICBDVl9DQUxMKCBidWZmZXIgPSAoQ3ZGRmlsbFNlZ21lbnQqKWN2QWxsb2MoIGJ1ZmZlcl9zaXplKnNpemVvZihidWZmZXJbMF0pKSk7CisKKyAgICBpZiggaXNfc2ltcGxlICkKKyAgICB7CisgICAgICAgIGludCBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgICAgIGNvbnN0IHVjaGFyKiBzZWVkX3B0ciA9IGltZy0+ZGF0YS5wdHIgKyBpbWctPnN0ZXAqc2VlZF9wb2ludC55ICsgZWxlbV9zaXplKnNlZWRfcG9pbnQueDsKKyAgICAgICAgQ3ZGbG9vZEZpbGxGdW5jIGZ1bmMgPSAoQ3ZGbG9vZEZpbGxGdW5jKWZmaWxsX3RhYltpZHhdOworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgICAgICAvLyBjaGVjayBpZiB0aGUgbmV3IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjdXJyZW50IHZhbHVlIGF0IHRoZSBzZWVkIHBvaW50LgorICAgICAgICAvLyBpZiB0aGV5IGFyZSBleGFjdGx5IHRoZSBzYW1lLCB1c2UgdGhlIGdlbmVyaWMgdmVyc2lvbiB3aXRoIG1hc2sgdG8gYXZvaWQgaW5maW5pdGUgbG9vcHMuCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBlbGVtX3NpemU7IGkrKyApCisgICAgICAgICAgICBpZiggc2VlZF9wdHJbaV0gIT0gKCh1Y2hhciopbnZfYnVmKVtpXSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCBpIDwgZWxlbV9zaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpbWctPmRhdGEucHRyLCBpbWctPnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWRfcG9pbnQsICZudl9idWYsIGNvbXAsIGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlcl9zaXplLCBjbiApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7CisgICAgICAgIEN2Rmxvb2RGaWxsR3JhZEZ1bmMgZnVuYyA9IChDdkZsb29kRmlsbEdyYWRGdW5jKWZmaWxsZ3JhZF90YWJbaWR4XTsKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhbWFzayApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNyZWF0ZWQgbWFzayB3aWxsIGJlIDgtYnl0ZSBhbGlnbmVkICovCisgICAgICAgICAgICB0ZW1wTWFzayA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCArIDIsIChzaXplLndpZHRoICsgOSkgJiAtOCwgQ1ZfOFVDMSApOworICAgICAgICAgICAgbWFzayA9IHRlbXBNYXNrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisgICAgICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXNrICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssICIiICk7CisKKyAgICAgICAgICAgIGlmKCBtYXNrLT53aWR0aCAhPSBzaXplLndpZHRoICsgMiB8fCBtYXNrLT5oZWlnaHQgIT0gc2l6ZS5oZWlnaHQgKyAyICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJtYXNrIG11c3QgYmUgMiBwaXhlbCB3aWRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIDIgcGl4ZWwgdGFsbGVyIHRoYW4gZmlsbGVkIGltYWdlIiApOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHdpZHRoID0gdGVtcE1hc2sgPyBtYXNrLT5zdGVwIDogc2l6ZS53aWR0aCArIDI7CisgICAgICAgICAgICB1Y2hhciogbWFza19yb3cgPSBtYXNrLT5kYXRhLnB0ciArIG1hc2stPnN0ZXA7CisgICAgICAgICAgICBtZW1zZXQoIG1hc2tfcm93IC0gbWFzay0+c3RlcCwgMSwgd2lkdGggKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8PSBzaXplLmhlaWdodDsgaSsrLCBtYXNrX3JvdyArPSBtYXNrLT5zdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggdGVtcE1hc2sgKQorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIG1hc2tfcm93LCAwLCB3aWR0aCApOworICAgICAgICAgICAgICAgIG1hc2tfcm93WzBdID0gbWFza19yb3dbc2l6ZS53aWR0aCsxXSA9ICh1Y2hhcikxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtc2V0KCBtYXNrX3JvdywgMSwgd2lkdGggKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY247IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBjdkZsb29yKGxvX2RpZmYudmFsW2ldKTsKKyAgICAgICAgICAgICAgICBsZF9idWYuYltpXSA9IENWX0NBU1RfOFUodCk7CisgICAgICAgICAgICAgICAgdCA9IGN2Rmxvb3IodXBfZGlmZi52YWxbaV0pOworICAgICAgICAgICAgICAgIHVkX2J1Zi5iW2ldID0gQ1ZfQ0FTVF84VSh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxkX2J1Zi5mW2ldID0gKGZsb2F0KWxvX2RpZmYudmFsW2ldOworICAgICAgICAgICAgICAgIHVkX2J1Zi5mW2ldID0gKGZsb2F0KXVwX2RpZmYudmFsW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggaW1nLT5kYXRhLnB0ciwgaW1nLT5zdGVwLCBtYXNrLT5kYXRhLnB0ciwgbWFzay0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzZWVkX3BvaW50LCAmbnZfYnVmLCBsZF9idWYuZiwgdWRfYnVmLmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29tcCwgZmxhZ3MsIGJ1ZmZlciwgYnVmZmVyX3NpemUsIGNuICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wTWFzayApOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmZ1bmRhbS5jcHAgYi9jdi9zcmMvY3ZmdW5kYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYWRhYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZmdW5kYW0uY3BwCkBAIC0wLDAgKzEsMTQzOCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGljdkNvbXByZXNzUG9pbnRzKCBUKiBwdHIsIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbXN0ZXAsIGludCBjb3VudCApCit7CisgICAgaW50IGksIGo7CisgICAgZm9yKCBpID0gaiA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgaWYoIG1hc2tbaSptc3RlcF0gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaSA+IGogKQorICAgICAgICAgICAgICAgIHB0cltqXSA9IHB0cltpXTsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIHJldHVybiBqOworfQorCitjbGFzcyBDdk1vZGVsRXN0aW1hdG9yMgoreworcHVibGljOgorICAgIEN2TW9kZWxFc3RpbWF0b3IyKGludCBfbW9kZWxQb2ludHMsIEN2U2l6ZSBfbW9kZWxTaXplLCBpbnQgX21heEJhc2ljU29sdXRpb25zKTsKKyAgICB2aXJ0dWFsIH5Ddk1vZGVsRXN0aW1hdG9yMigpOworCisgICAgdmlydHVhbCBpbnQgcnVuS2VybmVsKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwgQ3ZNYXQqIG1vZGVsICk9MDsKKyAgICB2aXJ0dWFsIGJvb2wgcnVuTE1lRFMoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLCBDdk1hdCogbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogbWFzaywgZG91YmxlIGNvbmZpZGVuY2U9MC45OSwgaW50IG1heEl0ZXJzPTEwMDAgKTsKKyAgICB2aXJ0dWFsIGJvb2wgcnVuUkFOU0FDKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwgQ3ZNYXQqIG1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBtYXNrLCBkb3VibGUgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb25maWRlbmNlPTAuOTksIGludCBtYXhJdGVycz0xMDAwICk7CisgICAgdmlydHVhbCBib29sIHJlZmluZSggY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCosIEN2TWF0KiwgaW50ICkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHZpcnR1YWwgdm9pZCBzZXRTZWVkKCBpbnQ2NCBzZWVkICk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgY29tcHV0ZVJlcHJvakVycm9yKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbW9kZWwsIEN2TWF0KiBlcnJvciApID0gMDsKKyAgICB2aXJ0dWFsIGludCBmaW5kSW5saWVycyggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtb2RlbCwgQ3ZNYXQqIGVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogbWFzaywgZG91YmxlIHRocmVzaG9sZCApOworICAgIHZpcnR1YWwgYm9vbCBnZXRTdWJzZXQoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBtczEsIEN2TWF0KiBtczIsIGludCBtYXhBdHRlbXB0cz0xMDAwICk7CisgICAgdmlydHVhbCBib29sIGNoZWNrU3Vic2V0KCBjb25zdCBDdk1hdCogbXMxLCBpbnQgY291bnQgKTsKKworICAgIEN2Uk5HIHJuZzsKKyAgICBpbnQgbW9kZWxQb2ludHM7CisgICAgQ3ZTaXplIG1vZGVsU2l6ZTsKKyAgICBpbnQgbWF4QmFzaWNTb2x1dGlvbnM7CisgICAgYm9vbCBjaGVja1BhcnRpYWxTdWJzZXRzOworfTsKKworCitDdk1vZGVsRXN0aW1hdG9yMjo6Q3ZNb2RlbEVzdGltYXRvcjIoaW50IF9tb2RlbFBvaW50cywgQ3ZTaXplIF9tb2RlbFNpemUsIGludCBfbWF4QmFzaWNTb2x1dGlvbnMpCit7CisgICAgbW9kZWxQb2ludHMgPSBfbW9kZWxQb2ludHM7CisgICAgbW9kZWxTaXplID0gX21vZGVsU2l6ZTsKKyAgICBtYXhCYXNpY1NvbHV0aW9ucyA9IF9tYXhCYXNpY1NvbHV0aW9uczsKKyAgICBjaGVja1BhcnRpYWxTdWJzZXRzID0gdHJ1ZTsKKyAgICBybmcgPSBjdlJORygtMSk7Cit9CisKK0N2TW9kZWxFc3RpbWF0b3IyOjp+Q3ZNb2RlbEVzdGltYXRvcjIoKQoreworfQorCit2b2lkIEN2TW9kZWxFc3RpbWF0b3IyOjpzZXRTZWVkKCBpbnQ2NCBzZWVkICkKK3sKKyAgICBybmcgPSBjdlJORyhzZWVkKTsKK30KKworCitpbnQgQ3ZNb2RlbEVzdGltYXRvcjI6OmZpbmRJbmxpZXJzKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtb2RlbCwgQ3ZNYXQqIF9lcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogX21hc2ssIGRvdWJsZSB0aHJlc2hvbGQgKQoreworICAgIGludCBpLCBjb3VudCA9IF9lcnItPnJvd3MqX2Vyci0+Y29scywgZ29vZENvdW50ID0gMDsKKyAgICBjb25zdCBmbG9hdCogZXJyID0gX2Vyci0+ZGF0YS5mbDsKKyAgICB1Y2hhciogbWFzayA9IF9tYXNrLT5kYXRhLnB0cjsKKworICAgIGNvbXB1dGVSZXByb2pFcnJvciggbTEsIG0yLCBtb2RlbCwgX2VyciApOworICAgIHRocmVzaG9sZCAqPSB0aHJlc2hvbGQ7CisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICBnb29kQ291bnQgKz0gbWFza1tpXSA9IGVycltpXSA8PSB0aHJlc2hvbGQ7CisgICAgcmV0dXJuIGdvb2RDb3VudDsKK30KKworCitDVl9JTVBMIGludAorY3ZSQU5TQUNVcGRhdGVOdW1JdGVycyggZG91YmxlIHAsIGRvdWJsZSBlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlbF9wb2ludHMsIGludCBtYXhfaXRlcnMgKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZSQU5TQUNVcGRhdGVOdW1JdGVycyIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBkb3VibGUgbnVtLCBkZW5vbTsKKyAgICAKKyAgICBpZiggbW9kZWxfcG9pbnRzIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInRoZSBudW1iZXIgb2YgbW9kZWwgcG9pbnRzIHNob3VsZCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIHAgPSBNQVgocCwgMC4pOworICAgIHAgPSBNSU4ocCwgMS4pOworICAgIGVwID0gTUFYKGVwLCAwLik7CisgICAgZXAgPSBNSU4oZXAsIDEuKTsKKworICAgIC8vIGF2b2lkIGluZidzICYgbmFuJ3MKKyAgICBudW0gPSBNQVgoMS4gLSBwLCBEQkxfTUlOKTsKKyAgICBkZW5vbSA9IDEuIC0gcG93KDEuIC0gZXAsbW9kZWxfcG9pbnRzKTsKKyAgICBpZiggZGVub20gPCBEQkxfTUlOICkKKyAgICAgICAgRVhJVDsKKworICAgIG51bSA9IGxvZyhudW0pOworICAgIGRlbm9tID0gbG9nKGRlbm9tKTsKKyAgICAKKyAgICByZXN1bHQgPSBkZW5vbSA+PSAwIHx8IC1udW0gPj0gbWF4X2l0ZXJzKigtZGVub20pID8KKyAgICAgICAgbWF4X2l0ZXJzIDogY3ZSb3VuZChudW0vZGVub20pOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2Jvb2wgQ3ZNb2RlbEVzdGltYXRvcjI6OnJ1blJBTlNBQyggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsIEN2TWF0KiBtb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogbWFzaywgZG91YmxlIHJlcHJvalRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29uZmlkZW5jZSwgaW50IG1heEl0ZXJzICkKK3sKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIEN2TWF0KiBtYXNrMCA9IG1hc2ssICp0bWFzayA9IDAsICp0OworICAgIEN2TWF0KiBtb2RlbHMgPSAwLCAqZXJyID0gMDsKKyAgICBDdk1hdCAqbXMxID0gMCwgKm1zMiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2TW9kZWxFc3RpbWF0b3IyOjplc3RpbWF0ZVJhbnNhYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpdGVyLCBuaXRlcnMgPSBtYXhJdGVyczsKKyAgICBpbnQgY291bnQgPSBtMS0+cm93cyptMS0+Y29scywgbWF4R29vZENvdW50ID0gMDsKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUShtMSwgbTIpICYmIENWX0FSRV9TSVpFU19FUShtMSwgbWFzaykgKTsKKworICAgIGlmKCBjb3VudCA8IG1vZGVsUG9pbnRzICkKKyAgICAgICAgRVhJVDsKKworICAgIG1vZGVscyA9IGN2Q3JlYXRlTWF0KCBtb2RlbFNpemUuaGVpZ2h0Km1heEJhc2ljU29sdXRpb25zLCBtb2RlbFNpemUud2lkdGgsIENWXzY0RkMxICk7CisgICAgZXJyID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl8zMkZDMSApOworICAgIHRtYXNrID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl84VUMxICk7CisgICAgCisgICAgaWYoIGNvdW50ID4gbW9kZWxQb2ludHMgKQorICAgIHsKKyAgICAgICAgbXMxID0gY3ZDcmVhdGVNYXQoIDEsIG1vZGVsUG9pbnRzLCBtMS0+dHlwZSApOworICAgICAgICBtczIgPSBjdkNyZWF0ZU1hdCggMSwgbW9kZWxQb2ludHMsIG0yLT50eXBlICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5pdGVycyA9IDE7CisgICAgICAgIG1zMSA9IChDdk1hdCopbTE7CisgICAgICAgIG1zMiA9IChDdk1hdCopbTI7CisgICAgfQorCisgICAgZm9yKCBpdGVyID0gMDsgaXRlciA8IG5pdGVyczsgaXRlcisrICkKKyAgICB7CisgICAgICAgIGludCBpLCBnb29kQ291bnQsIG5tb2RlbHM7CisgICAgICAgIGlmKCBjb3VudCA+IG1vZGVsUG9pbnRzICkKKyAgICAgICAgeworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGdldFN1YnNldCggbTEsIG0yLCBtczEsIG1zMiwgbW9kZWxQb2ludHMgKTsKKyAgICAgICAgICAgIGlmKCAhZm91bmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBpdGVyID09IDAgKQorICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbm1vZGVscyA9IHJ1bktlcm5lbCggbXMxLCBtczIsIG1vZGVscyApOworICAgICAgICBpZiggbm1vZGVscyA8PSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbm1vZGVsczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgbW9kZWxfaTsKKyAgICAgICAgICAgIGN2R2V0Um93cyggbW9kZWxzLCAmbW9kZWxfaSwgaSptb2RlbFNpemUuaGVpZ2h0LCAoaSsxKSptb2RlbFNpemUuaGVpZ2h0ICk7CisgICAgICAgICAgICBnb29kQ291bnQgPSBmaW5kSW5saWVycyggbTEsIG0yLCAmbW9kZWxfaSwgZXJyLCB0bWFzaywgcmVwcm9qVGhyZXNob2xkICk7CisKKyAgICAgICAgICAgIGlmKCBnb29kQ291bnQgPiBNQVgobWF4R29vZENvdW50LCBtb2RlbFBvaW50cy0xKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfU1dBUCggdG1hc2ssIG1hc2ssIHQgKTsKKyAgICAgICAgICAgICAgICBjdkNvcHkoICZtb2RlbF9pLCBtb2RlbCApOworICAgICAgICAgICAgICAgIG1heEdvb2RDb3VudCA9IGdvb2RDb3VudDsKKyAgICAgICAgICAgICAgICBuaXRlcnMgPSBjdlJBTlNBQ1VwZGF0ZU51bUl0ZXJzKCBjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShjb3VudCAtIGdvb2RDb3VudCkvY291bnQsIG1vZGVsUG9pbnRzLCBuaXRlcnMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBtYXhHb29kQ291bnQgPiAwICkKKyAgICB7CisgICAgICAgIGlmKCBtYXNrICE9IG1hc2swICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfU1dBUCggdG1hc2ssIG1hc2ssIHQgKTsKKyAgICAgICAgICAgIGN2Q29weSggdG1hc2ssIG1hc2sgKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggbXMxICE9IG0xICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmbXMxICk7CisgICAgaWYoIG1zMiAhPSBtMiApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJm1zMiApOworICAgIGN2UmVsZWFzZU1hdCggJm1vZGVscyApOworICAgIGN2UmVsZWFzZU1hdCggJmVyciApOworICAgIGN2UmVsZWFzZU1hdCggJnRtYXNrICk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUKCBpY3ZTb3J0RGlzdGFuY2VzLCBpbnQsIENWX0xUICkKKworYm9vbCBDdk1vZGVsRXN0aW1hdG9yMjo6cnVuTE1lRFMoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLCBDdk1hdCogbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIG1hc2ssIGRvdWJsZSBjb25maWRlbmNlLCBpbnQgbWF4SXRlcnMgKQoreworICAgIGNvbnN0IGRvdWJsZSBvdXRsaWVyUmF0aW8gPSAwLjQ1OworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgQ3ZNYXQqIG1vZGVscyA9IDA7CisgICAgQ3ZNYXQgKm1zMSA9IDAsICptczIgPSAwOworICAgIEN2TWF0KiBlcnIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdk1vZGVsRXN0aW1hdG9yMjo6ZXN0aW1hdGVMTWVEUyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpdGVyLCBuaXRlcnMgPSBtYXhJdGVyczsKKyAgICBpbnQgY291bnQgPSBtMS0+cm93cyptMS0+Y29sczsKKyAgICBkb3VibGUgbWluTWVkaWFuID0gREJMX01BWCwgc2lnbWE7CisKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUShtMSwgbTIpICYmIENWX0FSRV9TSVpFU19FUShtMSwgbWFzaykgKTsKKworICAgIGlmKCBjb3VudCA8IG1vZGVsUG9pbnRzICkKKyAgICAgICAgRVhJVDsKKworICAgIG1vZGVscyA9IGN2Q3JlYXRlTWF0KCBtb2RlbFNpemUuaGVpZ2h0Km1heEJhc2ljU29sdXRpb25zLCBtb2RlbFNpemUud2lkdGgsIENWXzY0RkMxICk7CisgICAgZXJyID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl8zMkZDMSApOworICAgIAorICAgIGlmKCBjb3VudCA+IG1vZGVsUG9pbnRzICkKKyAgICB7CisgICAgICAgIG1zMSA9IGN2Q3JlYXRlTWF0KCAxLCBtb2RlbFBvaW50cywgbTEtPnR5cGUgKTsKKyAgICAgICAgbXMyID0gY3ZDcmVhdGVNYXQoIDEsIG1vZGVsUG9pbnRzLCBtMi0+dHlwZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBuaXRlcnMgPSAxOworICAgICAgICBtczEgPSAoQ3ZNYXQqKW0xOworICAgICAgICBtczIgPSAoQ3ZNYXQqKW0yOworICAgIH0KKworICAgIG5pdGVycyA9IGN2Um91bmQobG9nKDEtY29uZmlkZW5jZSkvbG9nKDEtcG93KDEtb3V0bGllclJhdGlvLChkb3VibGUpbW9kZWxQb2ludHMpKSk7CisgICAgbml0ZXJzID0gTUlOKCBNQVgobml0ZXJzLCAzKSwgbWF4SXRlcnMgKTsKKworICAgIGZvciggaXRlciA9IDA7IGl0ZXIgPCBuaXRlcnM7IGl0ZXIrKyApCisgICAgeworICAgICAgICBpbnQgaSwgbm1vZGVsczsKKyAgICAgICAgaWYoIGNvdW50ID4gbW9kZWxQb2ludHMgKQorICAgICAgICB7CisgICAgICAgICAgICBib29sIGZvdW5kID0gZ2V0U3Vic2V0KCBtMSwgbTIsIG1zMSwgbXMyLCAzMDAgKTsKKyAgICAgICAgICAgIGlmKCAhZm91bmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBpdGVyID09IDAgKQorICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbm1vZGVscyA9IHJ1bktlcm5lbCggbXMxLCBtczIsIG1vZGVscyApOworICAgICAgICBpZiggbm1vZGVscyA8PSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbm1vZGVsczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgbW9kZWxfaTsKKyAgICAgICAgICAgIGN2R2V0Um93cyggbW9kZWxzLCAmbW9kZWxfaSwgaSptb2RlbFNpemUuaGVpZ2h0LCAoaSsxKSptb2RlbFNpemUuaGVpZ2h0ICk7CisgICAgICAgICAgICBjb21wdXRlUmVwcm9qRXJyb3IoIG0xLCBtMiwgJm1vZGVsX2ksIGVyciApOworICAgICAgICAgICAgaWN2U29ydERpc3RhbmNlcyggZXJyLT5kYXRhLmksIGNvdW50LCAwICk7CisKKyAgICAgICAgICAgIGRvdWJsZSBtZWRpYW4gPSBjb3VudCAlIDIgIT0gMCA/CisgICAgICAgICAgICAgICAgZXJyLT5kYXRhLmZsW2NvdW50LzJdIDogKGVyci0+ZGF0YS5mbFtjb3VudC8yLTFdICsgZXJyLT5kYXRhLmZsW2NvdW50LzJdKSowLjU7CisKKyAgICAgICAgICAgIGlmKCBtZWRpYW4gPCBtaW5NZWRpYW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pbk1lZGlhbiA9IG1lZGlhbjsKKyAgICAgICAgICAgICAgICBjdkNvcHkoICZtb2RlbF9pLCBtb2RlbCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIG1pbk1lZGlhbiA8IERCTF9NQVggKQorICAgIHsKKyAgICAgICAgc2lnbWEgPSAyLjUqMS40ODI2KigxICsgNS4vKGNvdW50IC0gbW9kZWxQb2ludHMpKSpzcXJ0KG1pbk1lZGlhbik7CisgICAgICAgIHNpZ21hID0gTUFYKCBzaWdtYSwgRkxUX0VQU0lMT04qMTAwICk7CisKKyAgICAgICAgY291bnQgPSBmaW5kSW5saWVycyggbTEsIG0yLCBtb2RlbCwgZXJyLCBtYXNrLCBzaWdtYSApOworICAgICAgICByZXN1bHQgPSBjb3VudCA+PSBtb2RlbFBvaW50czsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIG1zMSAhPSBtMSApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJm1zMSApOworICAgIGlmKCBtczIgIT0gbTIgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZtczIgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZtb2RlbHMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZlcnIgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgQ3ZNb2RlbEVzdGltYXRvcjI6OmdldFN1YnNldCggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBtczEsIEN2TWF0KiBtczIsIGludCBtYXhBdHRlbXB0cyApCit7CisgICAgaW50KiBpZHggPSAoaW50KiljdlN0YWNrQWxsb2MoIG1vZGVsUG9pbnRzKnNpemVvZihpZHhbMF0pICk7CisgICAgaW50IGksIGosIGssIGlkeF9pLCBpdGVycyA9IDA7CisgICAgaW50IHR5cGUgPSBDVl9NQVRfVFlQRShtMS0+dHlwZSksIGVsZW1TaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgIGNvbnN0IGludCAqbTFwdHIgPSBtMS0+ZGF0YS5pLCAqbTJwdHIgPSBtMi0+ZGF0YS5pOworICAgIGludCAqbXMxcHRyID0gbXMxLT5kYXRhLmksICptczJwdHIgPSBtczItPmRhdGEuaTsKKyAgICBpbnQgY291bnQgPSBtMS0+Y29scyptMS0+cm93czsKKworICAgIGFzc2VydCggQ1ZfSVNfTUFUX0NPTlQobTEtPnR5cGUgJiBtMi0+dHlwZSkgJiYgKGVsZW1TaXplICUgc2l6ZW9mKGludCkgPT0gMCkgKTsKKyAgICBlbGVtU2l6ZSAvPSBzaXplb2YoaW50KTsKKworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtb2RlbFBvaW50cyAmJiBpdGVycyA8IG1heEF0dGVtcHRzOyBpdGVycysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4W2ldID0gaWR4X2kgPSBjdlJhbmRJbnQoJnJuZykgJSBjb3VudDsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBpOyBqKysgKQorICAgICAgICAgICAgICAgIGlmKCBpZHhfaSA9PSBpZHhbal0gKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKCBqIDwgaSApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZWxlbVNpemU7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXMxcHRyW2kqZWxlbVNpemUgKyBrXSA9IG0xcHRyW2lkeF9pKmVsZW1TaXplICsga107CisgICAgICAgICAgICAgICAgbXMycHRyW2kqZWxlbVNpemUgKyBrXSA9IG0ycHRyW2lkeF9pKmVsZW1TaXplICsga107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggY2hlY2tQYXJ0aWFsU3Vic2V0cyAmJiAoIWNoZWNrU3Vic2V0KCBtczEsIGkrMSApIHx8ICFjaGVja1N1YnNldCggbXMyLCBpKzEgKSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBpdGVycyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYoICFjaGVja1BhcnRpYWxTdWJzZXRzICYmIGkgPT0gbW9kZWxQb2ludHMgJiYKKyAgICAgICAgICAgICghY2hlY2tTdWJzZXQoIG1zMSwgaSsxICkgfHwgIWNoZWNrU3Vic2V0KCBtczIsIGkrMSApKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gaSA9PSBtb2RlbFBvaW50czsKK30KKworCitib29sIEN2TW9kZWxFc3RpbWF0b3IyOjpjaGVja1N1YnNldCggY29uc3QgQ3ZNYXQqIG0sIGludCBjb3VudCApCit7CisgICAgaW50IGosIGssIGkgPSBjb3VudC0xOworICAgIEN2UG9pbnQyRDY0ZiogcHRyID0gKEN2UG9pbnQyRDY0ZiopbS0+ZGF0YS5wdHI7CisKKyAgICBhc3NlcnQoIENWX01BVF9UWVBFKG0tPnR5cGUpID09IENWXzY0RkMyICk7CisgICAgCisgICAgLy8gY2hlY2sgdGhhdCB0aGUgaS10aCBzZWxlY3RlZCBwb2ludCBkb2VzIG5vdCBiZWxvbmcKKyAgICAvLyB0byBhIGxpbmUgY29ubmVjdGluZyBzb21lIHByZXZpb3VzbHkgc2VsZWN0ZWQgcG9pbnRzCisgICAgZm9yKCBqID0gMDsgaiA8IGk7IGorKyApCisgICAgeworICAgICAgICBkb3VibGUgZHgxID0gcHRyW2pdLnggLSBwdHJbaV0ueDsKKyAgICAgICAgZG91YmxlIGR5MSA9IHB0cltqXS55IC0gcHRyW2ldLnk7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBqOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZHgyID0gcHRyW2tdLnggLSBwdHJbaV0ueDsKKyAgICAgICAgICAgIGRvdWJsZSBkeTIgPSBwdHJba10ueSAtIHB0cltpXS55OworICAgICAgICAgICAgaWYoIGZhYnMoZHgyKmR5MSAtIGR5MipkeDEpIDwgRkxUX0VQU0lMT04qKGZhYnMoZHgxKSArIGZhYnMoZHkxKSArIGZhYnMoZHgyKSArIGZhYnMoZHkyKSkpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGsgPCBqICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBqID09IGk7Cit9CisKKworY2xhc3MgQ3ZIb21vZ3JhcGh5RXN0aW1hdG9yIDogcHVibGljIEN2TW9kZWxFc3RpbWF0b3IyCit7CitwdWJsaWM6CisgICAgQ3ZIb21vZ3JhcGh5RXN0aW1hdG9yKCBpbnQgbW9kZWxQb2ludHMgKTsKKworICAgIHZpcnR1YWwgaW50IHJ1bktlcm5lbCggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsIEN2TWF0KiBtb2RlbCApOworICAgIHZpcnR1YWwgYm9vbCByZWZpbmUoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBtb2RlbCwgaW50IG1heEl0ZXJzICk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIGNvbXB1dGVSZXByb2pFcnJvciggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIG1vZGVsLCBDdk1hdCogZXJyb3IgKTsKK307CisKKworQ3ZIb21vZ3JhcGh5RXN0aW1hdG9yOjpDdkhvbW9ncmFwaHlFc3RpbWF0b3IoaW50IF9tb2RlbFBvaW50cykKKyAgICA6IEN2TW9kZWxFc3RpbWF0b3IyKF9tb2RlbFBvaW50cywgY3ZTaXplKDMsMyksIDEpCit7CisgICAgYXNzZXJ0KCBfbW9kZWxQb2ludHMgPT0gNCB8fCBfbW9kZWxQb2ludHMgPT0gNSApOworfQorCitpbnQgQ3ZIb21vZ3JhcGh5RXN0aW1hdG9yOjpydW5LZXJuZWwoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLCBDdk1hdCogSCApCit7CisgICAgaW50IGksIGNvdW50ID0gbTEtPnJvd3MqbTEtPmNvbHM7CisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBNID0gKGNvbnN0IEN2UG9pbnQyRDY0ZiopbTEtPmRhdGEucHRyOworICAgIGNvbnN0IEN2UG9pbnQyRDY0ZiogbSA9IChjb25zdCBDdlBvaW50MkQ2NGYqKW0yLT5kYXRhLnB0cjsKKworICAgIGRvdWJsZSBMdExbOV1bOV0sIFdbOV1bOV0sIFZbOV1bOV07CisgICAgQ3ZNYXQgX0x0TCA9IGN2TWF0KCA5LCA5LCBDVl82NEYsIEx0TCApOworICAgIEN2TWF0IF9XID0gY3ZNYXQoIDksIDksIENWXzY0RiwgVyApOworICAgIEN2TWF0IF9WID0gY3ZNYXQoIDksIDksIENWXzY0RiwgViApOworICAgIEN2TWF0IF9IMCA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIFZbOF0gKTsKKyAgICBDdk1hdCBfSHRlbXAgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBWWzddICk7CisgICAgQ3ZQb2ludDJENjRmIGNNPXswLDB9LCBjbT17MCwwfSwgc009ezAsMH0sIHNtPXswLDB9OworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgY20ueCArPSBtW2ldLng7IGNtLnkgKz0gbVtpXS55OworICAgICAgICBjTS54ICs9IE1baV0ueDsgY00ueSArPSBNW2ldLnk7CisgICAgfQorCisgICAgY20ueCAvPSBjb3VudDsgY20ueSAvPSBjb3VudDsKKyAgICBjTS54IC89IGNvdW50OyBjTS55IC89IGNvdW50OworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgc20ueCArPSBmYWJzKG1baV0ueCAtIGNtLngpOworICAgICAgICBzbS55ICs9IGZhYnMobVtpXS55IC0gY20ueSk7CisgICAgICAgIHNNLnggKz0gZmFicyhNW2ldLnggLSBjTS54KTsKKyAgICAgICAgc00ueSArPSBmYWJzKE1baV0ueSAtIGNNLnkpOworICAgIH0KKworICAgIHNtLnggPSBjb3VudC9zbS54OyBzbS55ID0gY291bnQvc20ueTsKKyAgICBzTS54ID0gY291bnQvc00ueDsgc00ueSA9IGNvdW50L3NNLnk7CisKKyAgICBkb3VibGUgaW52SG5vcm1bOV0gPSB7IDEuL3NtLngsIDAsIGNtLngsIDAsIDEuL3NtLnksIGNtLnksIDAsIDAsIDEgfTsKKyAgICBkb3VibGUgSG5vcm0yWzldID0geyBzTS54LCAwLCAtY00ueCpzTS54LCAwLCBzTS55LCAtY00ueSpzTS55LCAwLCAwLCAxIH07CisgICAgQ3ZNYXQgX2ludkhub3JtID0gY3ZNYXQoIDMsIDMsIENWXzY0RkMxLCBpbnZIbm9ybSApOworICAgIEN2TWF0IF9Ibm9ybTIgPSBjdk1hdCggMywgMywgQ1ZfNjRGQzEsIEhub3JtMiApOworCisgICAgY3ZaZXJvKCAmX0x0TCApOworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4ID0gKG1baV0ueCAtIGNtLngpKnNtLngsIHkgPSAobVtpXS55IC0gY20ueSkqc20ueTsKKyAgICAgICAgZG91YmxlIFggPSAoTVtpXS54IC0gY00ueCkqc00ueCwgWSA9IChNW2ldLnkgLSBjTS55KSpzTS55OworICAgICAgICBkb3VibGUgTHhbXSA9IHsgWCwgWSwgMSwgMCwgMCwgMCwgLXgqWCwgLXgqWSwgLXggfTsKKyAgICAgICAgZG91YmxlIEx5W10gPSB7IDAsIDAsIDAsIFgsIFksIDEsIC15KlgsIC15KlksIC15IH07CisgICAgICAgIGludCBqLCBrOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgOTsgaisrICkKKyAgICAgICAgICAgIGZvciggayA9IGo7IGsgPCA5OyBrKysgKQorICAgICAgICAgICAgICAgIEx0TFtqXVtrXSArPSBMeFtqXSpMeFtrXSArIEx5W2pdKkx5W2tdOworICAgIH0KKyAgICBjdkNvbXBsZXRlU3ltbSggJl9MdEwgKTsKKworICAgIGN2U1ZEKCAmX0x0TCwgJl9XLCAwLCAmX1YsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9WX1QgKTsKKyAgICBjdk1hdE11bCggJl9pbnZIbm9ybSwgJl9IMCwgJl9IdGVtcCApOworICAgIGN2TWF0TXVsKCAmX0h0ZW1wLCAmX0hub3JtMiwgJl9IMCApOworICAgIGN2Q29udmVydFNjYWxlKCAmX0gwLCBILCAxLi9fSDAuZGF0YS5kYls4XSApOworCisgICAgcmV0dXJuIDE7Cit9CisKKwordm9pZCBDdkhvbW9ncmFwaHlFc3RpbWF0b3I6OmNvbXB1dGVSZXByb2pFcnJvciggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbW9kZWwsIEN2TWF0KiBfZXJyICkKK3sKKyAgICBpbnQgaSwgY291bnQgPSBtMS0+cm93cyptMS0+Y29sczsKKyAgICBjb25zdCBDdlBvaW50MkQ2NGYqIE0gPSAoY29uc3QgQ3ZQb2ludDJENjRmKiltMS0+ZGF0YS5wdHI7CisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBtID0gKGNvbnN0IEN2UG9pbnQyRDY0ZiopbTItPmRhdGEucHRyOworICAgIGNvbnN0IGRvdWJsZSogSCA9IG1vZGVsLT5kYXRhLmRiOworICAgIGZsb2F0KiBlcnIgPSBfZXJyLT5kYXRhLmZsOworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHd3ID0gMS4vKEhbNl0qTVtpXS54ICsgSFs3XSpNW2ldLnkgKyAxLik7CisgICAgICAgIGRvdWJsZSBkeCA9IChIWzBdKk1baV0ueCArIEhbMV0qTVtpXS55ICsgSFsyXSkqd3cgLSBtW2ldLng7CisgICAgICAgIGRvdWJsZSBkeSA9IChIWzNdKk1baV0ueCArIEhbNF0qTVtpXS55ICsgSFs1XSkqd3cgLSBtW2ldLnk7CisgICAgICAgIGVycltpXSA9IChmbG9hdCkoZHgqZHggKyBkeSpkeSk7CisgICAgfQorfQorCitib29sIEN2SG9tb2dyYXBoeUVzdGltYXRvcjo6cmVmaW5lKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwgQ3ZNYXQqIG1vZGVsLCBpbnQgbWF4SXRlcnMgKQoreworICAgIEN2TGV2TWFycSBzb2x2ZXIoOCwgMCwgY3ZUZXJtQ3JpdGVyaWEoQ1ZfVEVSTUNSSVRfSVRFUitDVl9URVJNQ1JJVF9FUFMsIG1heEl0ZXJzLCBEQkxfRVBTSUxPTikpOworICAgIGludCBpLCBqLCBrLCBjb3VudCA9IG0xLT5yb3dzKm0xLT5jb2xzOworICAgIGNvbnN0IEN2UG9pbnQyRDY0ZiogTSA9IChjb25zdCBDdlBvaW50MkQ2NGYqKW0xLT5kYXRhLnB0cjsKKyAgICBjb25zdCBDdlBvaW50MkQ2NGYqIG0gPSAoY29uc3QgQ3ZQb2ludDJENjRmKiltMi0+ZGF0YS5wdHI7CisgICAgQ3ZNYXQgbW9kZWxQYXJ0ID0gY3ZNYXQoIHNvbHZlci5wYXJhbS0+cm93cywgc29sdmVyLnBhcmFtLT5jb2xzLCBtb2RlbC0+dHlwZSwgbW9kZWwtPmRhdGEucHRyICk7CisgICAgY3ZDb3B5KCAmbW9kZWxQYXJ0LCBzb2x2ZXIucGFyYW0gKTsKKworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGNvbnN0IEN2TWF0KiBfcGFyYW0gPSAwOworICAgICAgICBDdk1hdCAqX0p0SiA9IDAsICpfSnRFcnIgPSAwOworICAgICAgICBkb3VibGUqIF9lcnJOb3JtID0gMDsKKworICAgICAgICBpZiggIXNvbHZlci51cGRhdGVBbHQoIF9wYXJhbSwgX0p0SiwgX0p0RXJyLCBfZXJyTm9ybSApKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIGggPSBfcGFyYW0tPmRhdGEuZGI7CisgICAgICAgICAgICBkb3VibGUgTXggPSBNW2ldLngsIE15ID0gTVtpXS55OworICAgICAgICAgICAgZG91YmxlIHd3ID0gMS4vKGhbNl0qTXggKyBoWzddKk15ICsgMS4pOworICAgICAgICAgICAgZG91YmxlIF94aSA9IChoWzBdKk14ICsgaFsxXSpNeSArIGhbMl0pKnd3OworICAgICAgICAgICAgZG91YmxlIF95aSA9IChoWzNdKk14ICsgaFs0XSpNeSArIGhbNV0pKnd3OworICAgICAgICAgICAgZG91YmxlIGVycltdID0geyBfeGkgLSBtW2ldLngsIF95aSAtIG1baV0ueSB9OworICAgICAgICAgICAgaWYoIF9KdEogfHwgX0p0RXJyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgSltdWzhdID0KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHsgTXgqd3csIE15Knd3LCB3dywgMCwgMCwgMCwgLU14Knd3Kl94aSwgLU15Knd3Kl94aSB9LAorICAgICAgICAgICAgICAgICAgICB7IDAsIDAsIDAsIE14Knd3LCBNeSp3dywgd3csIC1NeCp3dypfeWksIC1NeSp3dypfeWkgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgODsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IGo7IGsgPCA4OyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgX0p0Si0+ZGF0YS5kYltqKjgra10gKz0gSlswXVtqXSpKWzBdW2tdICsgSlsxXVtqXSpKWzFdW2tdOworICAgICAgICAgICAgICAgICAgICBfSnRFcnItPmRhdGEuZGJbal0gKz0gSlswXVtqXSplcnJbMF0gKyBKWzFdW2pdKmVyclsxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggX2Vyck5vcm0gKQorICAgICAgICAgICAgICAgICpfZXJyTm9ybSArPSBlcnJbMF0qZXJyWzBdICsgZXJyWzFdKmVyclsxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN2Q29weSggc29sdmVyLnBhcmFtLCAmbW9kZWxQYXJ0ICk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworQ1ZfSU1QTCBpbnQKK2N2RmluZEhvbW9ncmFwaHkoIGNvbnN0IEN2TWF0KiBvYmplY3RQb2ludHMsIGNvbnN0IEN2TWF0KiBpbWFnZVBvaW50cywKKyAgICAgICAgICAgICAgICAgIEN2TWF0KiBfX0gsIGludCBtZXRob2QsIGRvdWJsZSByYW5zYWNSZXByb2pUaHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICBDdk1hdCogbWFzayApCit7CisgICAgY29uc3QgZG91YmxlIGNvbmZpZGVuY2UgPSAwLjk5OworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgQ3ZNYXQgKm0gPSAwLCAqTSA9IDAsICp0ZW1wTWFzayA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZEhvbW9ncmFwaHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgSFs5XTsKKyAgICBDdk1hdCBfSCA9IGN2TWF0KCAzLCAzLCBDVl82NEZDMSwgSCApOworICAgIGludCBjb3VudDsKKworICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKGltYWdlUG9pbnRzKSAmJiBDVl9JU19NQVQob2JqZWN0UG9pbnRzKSApOworCisgICAgY291bnQgPSBNQVgoaW1hZ2VQb2ludHMtPmNvbHMsIGltYWdlUG9pbnRzLT5yb3dzKTsKKyAgICBDVl9BU1NFUlQoIGNvdW50ID49IDQgKTsKKworICAgIG0gPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzY0RkMyICk7CisgICAgY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMoIGltYWdlUG9pbnRzLCBtICk7CisKKyAgICBNID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl82NEZDMiApOworICAgIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzKCBvYmplY3RQb2ludHMsIE0gKTsKKworICAgIGlmKCBtYXNrICkKKyAgICB7CisgICAgICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFTS19BUlIobWFzaykgJiYgQ1ZfSVNfTUFUX0NPTlQobWFzay0+dHlwZSkgJiYKKyAgICAgICAgICAgIChtYXNrLT5yb3dzID09IDEgfHwgbWFzay0+Y29scyA9PSAxKSAmJgorICAgICAgICAgICAgbWFzay0+cm93cyptYXNrLT5jb2xzID09IGNvdW50ICk7CisgICAgICAgIHRlbXBNYXNrID0gbWFzazsKKyAgICB9CisgICAgZWxzZSBpZiggY291bnQgPiA0ICkKKyAgICAgICAgdGVtcE1hc2sgPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzhVICk7CisgICAgaWYoIHRlbXBNYXNrICkKKyAgICAgICAgY3ZTZXQoIHRlbXBNYXNrLCBjdlNjYWxhckFsbCgxLikgKTsKKworICAgIHsKKyAgICBDdkhvbW9ncmFwaHlFc3RpbWF0b3IgZXN0aW1hdG9yKCBNSU4oY291bnQsIDUpICk7CisgICAgaWYoIGNvdW50ID09IDQgKQorICAgICAgICBtZXRob2QgPSAwOworICAgIGlmKCBtZXRob2QgPT0gQ1ZfTE1FRFMgKQorICAgICAgICByZXN1bHQgPSBlc3RpbWF0b3IucnVuTE1lRFMoIE0sIG0sICZfSCwgdGVtcE1hc2ssIGNvbmZpZGVuY2UgKTsKKyAgICBlbHNlIGlmKCBtZXRob2QgPT0gQ1ZfUkFOU0FDICkKKyAgICAgICAgcmVzdWx0ID0gZXN0aW1hdG9yLnJ1blJBTlNBQyggTSwgbSwgJl9ILCB0ZW1wTWFzaywgcmFuc2FjUmVwcm9qVGhyZXNob2xkLCBjb25maWRlbmNlICk7CisgICAgZWxzZQorICAgICAgICByZXN1bHQgPSBlc3RpbWF0b3IucnVuS2VybmVsKCBNLCBtLCAmX0ggKSA+IDA7CisKKyAgICBpZiggcmVzdWx0ICYmIGNvdW50ID4gNCApCisgICAgeworICAgICAgICBpY3ZDb21wcmVzc1BvaW50cyggKEN2UG9pbnQyRDY0ZiopTS0+ZGF0YS5wdHIsIHRlbXBNYXNrLT5kYXRhLnB0ciwgMSwgY291bnQgKTsKKyAgICAgICAgY291bnQgPSBpY3ZDb21wcmVzc1BvaW50cyggKEN2UG9pbnQyRDY0ZiopbS0+ZGF0YS5wdHIsIHRlbXBNYXNrLT5kYXRhLnB0ciwgMSwgY291bnQgKTsKKyAgICAgICAgTS0+Y29scyA9IG0tPmNvbHMgPSBjb3VudDsKKyAgICAgICAgZXN0aW1hdG9yLnJlZmluZSggTSwgbSwgJl9ILCAxMCApOworICAgIH0KKyAgICB9CisKKyAgICBpZiggcmVzdWx0ICkKKyAgICAgICAgY3ZDb252ZXJ0KCAmX0gsIF9fSCApOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJm0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZNICk7CisgICAgaWYoIHRlbXBNYXNrICE9IG1hc2sgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wTWFzayApOworCisgICAgcmV0dXJuIChpbnQpcmVzdWx0OworfQorCisKKy8qIEV2YWx1YXRpb24gb2YgRnVuZGFtZW50YWwgTWF0cml4IGZyb20gcG9pbnQgY29ycmVzcG9uZGVuY2VzLgorICAgVGhlIG9yaWdpbmFsIGNvZGUgaGFzIGJlZW4gd3JpdHRlbiBieSBWYWxlcnkgTW9zeWFnaW4gKi8KKworLyogVGhlIGFsZ29yaXRobXMgKGV4Y2VwdCBmb3IgUkFOU0FDKSBhbmQgdGhlIG5vdGF0aW9uIGhhdmUgYmVlbiB0YWtlbiBmcm9tCisgICBaaGVuZ3lvdSBaaGFuZydzIHJlc2VhcmNoIHJlcG9ydAorICAgIkRldGVybWluaW5nIHRoZSBFcGlwb2xhciBHZW9tZXRyeSBhbmQgaXRzIFVuY2VydGFpbnR5OiBBIFJldmlldyIKKyAgIHRoYXQgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly93d3ctc29wLmlucmlhLmZyL3JvYm90dmlzL3BlcnNvbm5lbC96emhhbmcvenpoYW5nLWVuZy5odG1sICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiA3LXBvaW50IGFsZ29yaXRobSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY2xhc3MgQ3ZGTUVzdGltYXRvciA6IHB1YmxpYyBDdk1vZGVsRXN0aW1hdG9yMgoreworcHVibGljOgorICAgIEN2Rk1Fc3RpbWF0b3IoIGludCBfbW9kZWxQb2ludHMgKTsKKworICAgIHZpcnR1YWwgaW50IHJ1bktlcm5lbCggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsIEN2TWF0KiBtb2RlbCApOworICAgIHZpcnR1YWwgaW50IHJ1bjdQb2ludCggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsIEN2TWF0KiBtb2RlbCApOworICAgIHZpcnR1YWwgaW50IHJ1bjhQb2ludCggY29uc3QgQ3ZNYXQqIG0xLCBjb25zdCBDdk1hdCogbTIsIEN2TWF0KiBtb2RlbCApOworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBjb21wdXRlUmVwcm9qRXJyb3IoIGNvbnN0IEN2TWF0KiBtMSwgY29uc3QgQ3ZNYXQqIG0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtb2RlbCwgQ3ZNYXQqIGVycm9yICk7Cit9OworCitDdkZNRXN0aW1hdG9yOjpDdkZNRXN0aW1hdG9yKCBpbnQgX21vZGVsUG9pbnRzICkKKzogQ3ZNb2RlbEVzdGltYXRvcjIoIF9tb2RlbFBvaW50cywgY3ZTaXplKDMsMyksIF9tb2RlbFBvaW50cyA9PSA3ID8gMyA6IDEgKQoreworICAgIGFzc2VydCggX21vZGVsUG9pbnRzID09IDcgfHwgX21vZGVsUG9pbnRzID09IDggKTsKK30KKworCitpbnQgQ3ZGTUVzdGltYXRvcjo6cnVuS2VybmVsKCBjb25zdCBDdk1hdCogbTEsIGNvbnN0IEN2TWF0KiBtMiwgQ3ZNYXQqIG1vZGVsICkKK3sKKyAgICByZXR1cm4gbW9kZWxQb2ludHMgPT0gNyA/IHJ1bjdQb2ludCggbTEsIG0yLCBtb2RlbCApIDogcnVuOFBvaW50KCBtMSwgbTIsIG1vZGVsICk7Cit9CisKK2ludCBDdkZNRXN0aW1hdG9yOjpydW43UG9pbnQoIGNvbnN0IEN2TWF0KiBfbTEsIGNvbnN0IEN2TWF0KiBfbTIsIEN2TWF0KiBfZm1hdHJpeCApCit7CisgICAgZG91YmxlIGFbNyo5XSwgd1s3XSwgdls5KjldLCBjWzRdLCByWzNdOworICAgIGRvdWJsZSogZjEsICpmMjsKKyAgICBkb3VibGUgdDAsIHQxLCB0MjsKKyAgICBDdk1hdCBBID0gY3ZNYXQoIDcsIDksIENWXzY0RiwgYSApOworICAgIEN2TWF0IFYgPSBjdk1hdCggOSwgOSwgQ1ZfNjRGLCB2ICk7CisgICAgQ3ZNYXQgVyA9IGN2TWF0KCA3LCAxLCBDVl82NEYsIHcgKTsKKyAgICBDdk1hdCBjb2VmZnMgPSBjdk1hdCggMSwgNCwgQ1ZfNjRGLCBjICk7CisgICAgQ3ZNYXQgcm9vdHMgPSBjdk1hdCggMSwgMywgQ1ZfNjRGLCByICk7CisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBtMSA9IChjb25zdCBDdlBvaW50MkQ2NGYqKV9tMS0+ZGF0YS5wdHI7CisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBtMiA9IChjb25zdCBDdlBvaW50MkQ2NGYqKV9tMi0+ZGF0YS5wdHI7CisgICAgZG91YmxlKiBmbWF0cml4ID0gX2ZtYXRyaXgtPmRhdGEuZGI7CisgICAgaW50IGksIGssIG47CisKKyAgICAvLyBmb3JtIGEgbGluZWFyIHN5c3RlbTogaS10aCByb3cgb2YgQSg9YSkgcmVwcmVzZW50cworICAgIC8vIHRoZSBlcXVhdGlvbjogKG0yW2ldLCAxKScqRioobTFbaV0sIDEpID0gMAorICAgIGZvciggaSA9IDA7IGkgPCA3OyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHgwID0gbTFbaV0ueCwgeTAgPSBtMVtpXS55OworICAgICAgICBkb3VibGUgeDEgPSBtMltpXS54LCB5MSA9IG0yW2ldLnk7CisKKyAgICAgICAgYVtpKjkrMF0gPSB4MSp4MDsKKyAgICAgICAgYVtpKjkrMV0gPSB4MSp5MDsKKyAgICAgICAgYVtpKjkrMl0gPSB4MTsKKyAgICAgICAgYVtpKjkrM10gPSB5MSp4MDsKKyAgICAgICAgYVtpKjkrNF0gPSB5MSp5MDsKKyAgICAgICAgYVtpKjkrNV0gPSB5MTsKKyAgICAgICAgYVtpKjkrNl0gPSB4MDsKKyAgICAgICAgYVtpKjkrN10gPSB5MDsKKyAgICAgICAgYVtpKjkrOF0gPSAxOworICAgIH0KKworICAgIC8vIEEqKGYxMSBmMTIgLi4uIGYzMyknID0gMCBpcyBzaW5ndWxhciAoNyBlcXVhdGlvbnMgZm9yIDkgdmFyaWFibGVzKSwgc28KKyAgICAvLyB0aGUgc29sdXRpb24gaXMgbGluZWFyIHN1YnNwYWNlIG9mIGRpbWVuc2lvbmFsaXR5IDIuCisgICAgLy8gPT4gdXNlIHRoZSBsYXN0IHR3byBzaW5ndWxhciB2ZWN0b3JzIGFzIGEgYmFzaXMgb2YgdGhlIHNwYWNlCisgICAgLy8gKGFjY29yZGluZyB0byBTVkQgcHJvcGVydGllcykKKyAgICBjdlNWRCggJkEsICZXLCAwLCAmViwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1ZfVCApOworICAgIGYxID0gdiArIDcqOTsKKyAgICBmMiA9IHYgKyA4Kjk7CisKKyAgICAvLyBmMSwgZjIgaXMgYSBiYXNpcyA9PiBsYW1iZGEqZjEgKyBtdSpmMiBpcyBhbiBhcmJpdHJhcnkgZi4gbWF0cml4LgorICAgIC8vIGFzIGl0IGlzIGRldGVybWluZWQgdXAgdG8gYSBzY2FsZSwgbm9ybWFsaXplIGxhbWJkYSAmIG11IChsYW1iZGEgKyBtdSA9IDEpLAorICAgIC8vIHNvIGYgfiBsYW1iZGEqZjEgKyAoMSAtIGxhbWJkYSkqZjIuCisgICAgLy8gdXNlIHRoZSBhZGRpdGlvbmFsIGNvbnN0cmFpbnQgZGV0KGYpID0gZGV0KGxhbWJkYSpmMSArICgxLWxhbWJkYSkqZjIpIHRvIGZpbmQgbGFtYmRhLgorICAgIC8vIGl0IHdpbGwgYmUgYSBjdWJpYyBlcXVhdGlvbi4KKyAgICAvLyBmaW5kIGMgLSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cy4KKyAgICBmb3IoIGkgPSAwOyBpIDwgOTsgaSsrICkKKyAgICAgICAgZjFbaV0gLT0gZjJbaV07CisKKyAgICB0MCA9IGYyWzRdKmYyWzhdIC0gZjJbNV0qZjJbN107CisgICAgdDEgPSBmMlszXSpmMls4XSAtIGYyWzVdKmYyWzZdOworICAgIHQyID0gZjJbM10qZjJbN10gLSBmMls0XSpmMls2XTsKKworICAgIGNbM10gPSBmMlswXSp0MCAtIGYyWzFdKnQxICsgZjJbMl0qdDI7CisKKyAgICBjWzJdID0gZjFbMF0qdDAgLSBmMVsxXSp0MSArIGYxWzJdKnQyIC0KKyAgICAgICAgICAgZjFbM10qKGYyWzFdKmYyWzhdIC0gZjJbMl0qZjJbN10pICsKKyAgICAgICAgICAgZjFbNF0qKGYyWzBdKmYyWzhdIC0gZjJbMl0qZjJbNl0pIC0KKyAgICAgICAgICAgZjFbNV0qKGYyWzBdKmYyWzddIC0gZjJbMV0qZjJbNl0pICsKKyAgICAgICAgICAgZjFbNl0qKGYyWzFdKmYyWzVdIC0gZjJbMl0qZjJbNF0pIC0KKyAgICAgICAgICAgZjFbN10qKGYyWzBdKmYyWzVdIC0gZjJbMl0qZjJbM10pICsKKyAgICAgICAgICAgZjFbOF0qKGYyWzBdKmYyWzRdIC0gZjJbMV0qZjJbM10pOworCisgICAgdDAgPSBmMVs0XSpmMVs4XSAtIGYxWzVdKmYxWzddOworICAgIHQxID0gZjFbM10qZjFbOF0gLSBmMVs1XSpmMVs2XTsKKyAgICB0MiA9IGYxWzNdKmYxWzddIC0gZjFbNF0qZjFbNl07CisKKyAgICBjWzFdID0gZjJbMF0qdDAgLSBmMlsxXSp0MSArIGYyWzJdKnQyIC0KKyAgICAgICAgICAgZjJbM10qKGYxWzFdKmYxWzhdIC0gZjFbMl0qZjFbN10pICsKKyAgICAgICAgICAgZjJbNF0qKGYxWzBdKmYxWzhdIC0gZjFbMl0qZjFbNl0pIC0KKyAgICAgICAgICAgZjJbNV0qKGYxWzBdKmYxWzddIC0gZjFbMV0qZjFbNl0pICsKKyAgICAgICAgICAgZjJbNl0qKGYxWzFdKmYxWzVdIC0gZjFbMl0qZjFbNF0pIC0KKyAgICAgICAgICAgZjJbN10qKGYxWzBdKmYxWzVdIC0gZjFbMl0qZjFbM10pICsKKyAgICAgICAgICAgZjJbOF0qKGYxWzBdKmYxWzRdIC0gZjFbMV0qZjFbM10pOworCisgICAgY1swXSA9IGYxWzBdKnQwIC0gZjFbMV0qdDEgKyBmMVsyXSp0MjsKKworICAgIC8vIHNvbHZlIHRoZSBjdWJpYyBlcXVhdGlvbjsgdGhlcmUgY2FuIGJlIDEgdG8gMyByb290cyAuLi4KKyAgICBuID0gY3ZTb2x2ZUN1YmljKCAmY29lZmZzLCAmcm9vdHMgKTsKKworICAgIGlmKCBuIDwgMSB8fCBuID4gMyApCisgICAgICAgIHJldHVybiBuOworCisgICAgZm9yKCBrID0gMDsgayA8IG47IGsrKywgZm1hdHJpeCArPSA5ICkKKyAgICB7CisgICAgICAgIC8vIGZvciBlYWNoIHJvb3QgZm9ybSB0aGUgZnVuZGFtZW50YWwgbWF0cml4CisgICAgICAgIGRvdWJsZSBsYW1iZGEgPSByW2tdLCBtdSA9IDEuOworICAgICAgICBkb3VibGUgcyA9IGYxWzhdKnJba10gKyBmMls4XTsKKworICAgICAgICAvLyBub3JtYWxpemUgZWFjaCBtYXRyaXgsIHNvIHRoYXQgRigzLDMpICh+Zm1hdHJpeFs4XSkgPT0gMQorICAgICAgICBpZiggZmFicyhzKSA+IERCTF9FUFNJTE9OICkKKyAgICAgICAgeworICAgICAgICAgICAgbXUgPSAxLi9zOworICAgICAgICAgICAgbGFtYmRhICo9IG11OworICAgICAgICAgICAgZm1hdHJpeFs4XSA9IDEuOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZtYXRyaXhbOF0gPSAwLjsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgODsgaSsrICkKKyAgICAgICAgICAgIGZtYXRyaXhbaV0gPSBmMVtpXSpsYW1iZGEgKyBmMltpXSptdTsKKyAgICB9CisKKyAgICByZXR1cm4gbjsKK30KKworCitpbnQgQ3ZGTUVzdGltYXRvcjo6cnVuOFBvaW50KCBjb25zdCBDdk1hdCogX20xLCBjb25zdCBDdk1hdCogX20yLCBDdk1hdCogX2ZtYXRyaXggKQoreworICAgIGRvdWJsZSBhWzkqOV0sIHdbOV0sIHZbOSo5XTsKKyAgICBDdk1hdCBXID0gY3ZNYXQoIDEsIDksIENWXzY0RiwgdyApOworICAgIEN2TWF0IFYgPSBjdk1hdCggOSwgOSwgQ1ZfNjRGLCB2ICk7CisgICAgQ3ZNYXQgQSA9IGN2TWF0KCA5LCA5LCBDVl82NEYsIGEgKTsKKyAgICBDdk1hdCBVLCBGMCwgVEY7CisKKyAgICBDdlBvaW50MkQ2NGYgbTBjID0gezAsMH0sIG0xYyA9IHswLDB9OworICAgIGRvdWJsZSB0LCBzY2FsZTAgPSAwLCBzY2FsZTEgPSAwOworCisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBtMSA9IChjb25zdCBDdlBvaW50MkQ2NGYqKV9tMS0+ZGF0YS5wdHI7CisgICAgY29uc3QgQ3ZQb2ludDJENjRmKiBtMiA9IChjb25zdCBDdlBvaW50MkQ2NGYqKV9tMi0+ZGF0YS5wdHI7CisgICAgZG91YmxlKiBmbWF0cml4ID0gX2ZtYXRyaXgtPmRhdGEuZGI7CisgICAgaW50IGksIGosIGssIGNvdW50ID0gX20xLT5jb2xzKl9tMS0+cm93czsKKworICAgIC8vIGNvbXB1dGUgY2VudGVycyBhbmQgYXZlcmFnZSBkaXN0YW5jZXMgZm9yIGVhY2ggb2YgdGhlIHR3byBwb2ludCBzZXRzCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHggPSBtMVtpXS54LCB5ID0gbTFbaV0ueTsKKyAgICAgICAgbTBjLnggKz0geDsgbTBjLnkgKz0geTsKKworICAgICAgICB4ID0gbTJbaV0ueCwgeSA9IG0yW2ldLnk7CisgICAgICAgIG0xYy54ICs9IHg7IG0xYy55ICs9IHk7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHRoZSBub3JtYWxpemluZyB0cmFuc2Zvcm1hdGlvbnMgZm9yIGVhY2ggb2YgdGhlIHBvaW50IHNldHM6CisgICAgLy8gYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uIGVhY2ggc2V0IHdpbGwgaGF2ZSB0aGUgbWFzcyBjZW50ZXIgYXQgdGhlIGNvb3JkaW5hdGUgb3JpZ2luCisgICAgLy8gYW5kIHRoZSBhdmVyYWdlIGRpc3RhbmNlIGZyb20gdGhlIG9yaWdpbiB3aWxsIGJlIH5zcXJ0KDIpLgorICAgIHQgPSAxLi9jb3VudDsKKyAgICBtMGMueCAqPSB0OyBtMGMueSAqPSB0OworICAgIG0xYy54ICo9IHQ7IG0xYy55ICo9IHQ7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgeCA9IG0xW2ldLnggLSBtMGMueCwgeSA9IG0xW2ldLnkgLSBtMGMueTsKKyAgICAgICAgc2NhbGUwICs9IHNxcnQoeCp4ICsgeSp5KTsKKworICAgICAgICB4ID0gZmFicyhtMltpXS54IC0gbTFjLngpLCB5ID0gZmFicyhtMltpXS55IC0gbTFjLnkpOworICAgICAgICBzY2FsZTEgKz0gc3FydCh4KnggKyB5KnkpOworICAgIH0KKworICAgIHNjYWxlMCAqPSB0OworICAgIHNjYWxlMSAqPSB0OworCisgICAgaWYoIHNjYWxlMCA8IEZMVF9FUFNJTE9OIHx8IHNjYWxlMSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzY2FsZTAgPSBzcXJ0KDIuKS9zY2FsZTA7CisgICAgc2NhbGUxID0gc3FydCgyLikvc2NhbGUxOworICAgIAorICAgIGN2WmVybyggJkEgKTsKKworICAgIC8vIGZvcm0gYSBsaW5lYXIgc3lzdGVtIEF4PTA6IGZvciBlYWNoIHNlbGVjdGVkIHBhaXIgb2YgcG9pbnRzIG0xICYgbTIsCisgICAgLy8gdGhlIHJvdyBvZiBBKD1hKSByZXByZXNlbnRzIHRoZSBjb2VmZmljaWVudHMgb2YgZXF1YXRpb246IChtMiwgMSknKkYqKG0xLCAxKSA9IDAKKyAgICAvLyB0byBzYXZlIGNvbXB1dGF0aW9uIHRpbWUsIHdlIGNvbXB1dGUgKEF0KkEpIGluc3RlYWQgb2YgQSBhbmQgdGhlbiBzb2x2ZSAoQXQqQSl4PTAuIAorICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4MCA9IChtMVtpXS54IC0gbTBjLngpKnNjYWxlMDsKKyAgICAgICAgZG91YmxlIHkwID0gKG0xW2ldLnkgLSBtMGMueSkqc2NhbGUwOworICAgICAgICBkb3VibGUgeDEgPSAobTJbaV0ueCAtIG0xYy54KSpzY2FsZTE7CisgICAgICAgIGRvdWJsZSB5MSA9IChtMltpXS55IC0gbTFjLnkpKnNjYWxlMTsKKyAgICAgICAgZG91YmxlIHJbOV0gPSB7IHgxKngwLCB4MSp5MCwgeDEsIHkxKngwLCB5MSp5MCwgeTEsIHgwLCB5MCwgMSB9OworICAgICAgICBmb3IoIGogPSAwOyBqIDwgOTsgaisrICkKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCA5OyBrKysgKQorICAgICAgICAgICAgICAgIGFbaio5K2tdICs9IHJbal0qcltrXTsKKyAgICB9CisKKyAgICBjdlNWRCggJkEsICZXLCAwLCAmViwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1ZfVCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDg7IGkrKyApCisgICAgeworICAgICAgICBpZiggZmFicyh3W2ldKSA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKCBpIDwgNyApCisgICAgICAgIHJldHVybiAwOworCisgICAgRjAgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCB2ICsgOSo4ICk7IC8vIHRha2UgdGhlIGxhc3QgY29sdW1uIG9mIHYgYXMgYSBzb2x1dGlvbiBvZiBBZiA9IDAKKworICAgIC8vIG1ha2UgRjAgc2luZ3VsYXIgKG9mIHJhbmsgMikgYnkgZGVjb21wb3NpbmcgaXQgd2l0aCBTVkQsCisgICAgLy8gemVyb2luZyB0aGUgbGFzdCBkaWFnb25hbCBlbGVtZW50IG9mIFcgYW5kIHRoZW4gY29tcG9zaW5nIHRoZSBtYXRyaWNlcyBiYWNrLgorCisgICAgLy8gdXNlIHYgYXMgYSB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IgZGlmZmVyZW50IDN4MyBtYXRyaWNlcworICAgIFcgPSBVID0gViA9IFRGID0gRjA7CisgICAgVy5kYXRhLmRiID0gdjsKKyAgICBVLmRhdGEuZGIgPSB2ICsgOTsKKyAgICBWLmRhdGEuZGIgPSB2ICsgMTg7CisgICAgVEYuZGF0YS5kYiA9IHYgKyAyNzsKKworICAgIGN2U1ZEKCAmRjAsICZXLCAmVSwgJlYsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICk7CisgICAgVy5kYXRhLmRiWzhdID0gMC47CisKKyAgICAvLyBGMCA8LSBVKmRpYWcoW1coMSksIFcoMiksIDBdKSpWJworICAgIGN2R0VNTSggJlUsICZXLCAxLiwgMCwgMC4sICZURiwgQ1ZfR0VNTV9BX1QgKTsKKyAgICBjdkdFTU0oICZURiwgJlYsIDEuLCAwLCAwLiwgJkYwLCAwLypDVl9HRU1NX0JfVCovICk7CisKKyAgICAvLyBhcHBseSB0aGUgdHJhbnNmb3JtYXRpb24gdGhhdCBpcyBpbnZlcnNlCisgICAgLy8gdG8gd2hhdCB3ZSB1c2VkIHRvIG5vcm1hbGl6ZSB0aGUgcG9pbnQgY29vcmRpbmF0ZXMKKyAgICB7CisgICAgICAgIGRvdWJsZSB0dDBbXSA9IHsgc2NhbGUwLCAwLCAtc2NhbGUwKm0wYy54LCAwLCBzY2FsZTAsIC1zY2FsZTAqbTBjLnksIDAsIDAsIDEgfTsKKyAgICAgICAgZG91YmxlIHR0MVtdID0geyBzY2FsZTEsIDAsIC1zY2FsZTEqbTFjLngsIDAsIHNjYWxlMSwgLXNjYWxlMSptMWMueSwgMCwgMCwgMSB9OworICAgICAgICBDdk1hdCBUMCwgVDE7CisgICAgICAgIFQwID0gVDEgPSBGMDsKKyAgICAgICAgVDAuZGF0YS5kYiA9IHR0MDsKKyAgICAgICAgVDEuZGF0YS5kYiA9IHR0MTsKKworICAgICAgICAvLyBGMCA8LSBUMScqRjAqVDAKKyAgICAgICAgY3ZHRU1NKCAmVDEsICZGMCwgMS4sIDAsIDAuLCAmVEYsIENWX0dFTU1fQV9UICk7CisgICAgICAgIEYwLmRhdGEuZGIgPSBmbWF0cml4OworICAgICAgICBjdkdFTU0oICZURiwgJlQwLCAxLiwgMCwgMC4sICZGMCwgMCApOworCisgICAgICAgIC8vIG1ha2UgRigzLDMpID0gMQorICAgICAgICBpZiggZmFicyhGMC5kYXRhLmRiWzhdKSA+IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIGN2U2NhbGUoICZGMCwgJkYwLCAxLi9GMC5kYXRhLmRiWzhdICk7CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKwordm9pZCBDdkZNRXN0aW1hdG9yOjpjb21wdXRlUmVwcm9qRXJyb3IoIGNvbnN0IEN2TWF0KiBfbTEsIGNvbnN0IEN2TWF0KiBfbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIG1vZGVsLCBDdk1hdCogX2VyciApCit7CisgICAgaW50IGksIGNvdW50ID0gX20xLT5yb3dzKl9tMS0+Y29sczsKKyAgICBjb25zdCBDdlBvaW50MkQ2NGYqIG0xID0gKGNvbnN0IEN2UG9pbnQyRDY0ZiopX20xLT5kYXRhLnB0cjsKKyAgICBjb25zdCBDdlBvaW50MkQ2NGYqIG0yID0gKGNvbnN0IEN2UG9pbnQyRDY0ZiopX20yLT5kYXRhLnB0cjsKKyAgICBjb25zdCBkb3VibGUqIEYgPSBtb2RlbC0+ZGF0YS5kYjsKKyAgICBmbG9hdCogZXJyID0gX2Vyci0+ZGF0YS5mbDsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgYSwgYiwgYywgZDEsIGQyLCBzMSwgczI7CisKKyAgICAgICAgYSA9IEZbMF0qbTFbaV0ueCArIEZbMV0qbTFbaV0ueSArIEZbMl07CisgICAgICAgIGIgPSBGWzNdKm0xW2ldLnggKyBGWzRdKm0xW2ldLnkgKyBGWzVdOworICAgICAgICBjID0gRls2XSptMVtpXS54ICsgRls3XSptMVtpXS55ICsgRls4XTsKKworICAgICAgICBzMiA9IDEuLyhhKmEgKyBiKmIpOworICAgICAgICBkMiA9IG0yW2ldLngqYSArIG0yW2ldLnkqYiArIGM7CisKKyAgICAgICAgYSA9IEZbMF0qbTJbaV0ueCArIEZbM10qbTJbaV0ueSArIEZbNl07CisgICAgICAgIGIgPSBGWzFdKm0yW2ldLnggKyBGWzRdKm0yW2ldLnkgKyBGWzddOworICAgICAgICBjID0gRlsyXSptMltpXS54ICsgRls1XSptMltpXS55ICsgRls4XTsKKworICAgICAgICBzMSA9IDEuLyhhKmEgKyBiKmIpOworICAgICAgICBkMSA9IG0xW2ldLngqYSArIG0xW2ldLnkqYiArIGM7CisKKyAgICAgICAgZXJyW2ldID0gKGZsb2F0KShkMSpkMSpzMSArIGQyKmQyKnMyKTsKKyAgICB9Cit9CisKKworQ1ZfSU1QTCBpbnQKK2N2RmluZEZ1bmRhbWVudGFsTWF0KCBjb25zdCBDdk1hdCogcG9pbnRzMSwgY29uc3QgQ3ZNYXQqIHBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGZtYXRyaXgsIGludCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMSwgZG91YmxlIHBhcmFtMiwgQ3ZNYXQqIG1hc2sgKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIEN2TWF0ICptMSA9IDAsICptMiA9IDAsICp0ZW1wTWFzayA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZEZ1bmRhbWVudGFsTWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIEZbMyo5XTsKKyAgICBDdk1hdCBfRjN4MyA9IGN2TWF0KCAzLCAzLCBDVl82NEZDMSwgRiApLCBfRjl4MyA9IGN2TWF0KCA5LCAzLCBDVl82NEZDMSwgRiApOworICAgIGludCBjb3VudDsKKworICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKHBvaW50czEpICYmIENWX0lTX01BVChwb2ludHMyKSAmJiBDVl9BUkVfU0laRVNfRVEocG9pbnRzMSwgcG9pbnRzMikgKTsKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChmbWF0cml4KSAmJiBmbWF0cml4LT5jb2xzID09IDMgJiYKKyAgICAgICAgKGZtYXRyaXgtPnJvd3MgPT0gMyB8fCAoZm1hdHJpeC0+cm93cyA9PSA5ICYmIG1ldGhvZCA9PSBDVl9GTV83UE9JTlQpKSApOworCisgICAgY291bnQgPSBNQVgocG9pbnRzMS0+Y29scywgcG9pbnRzMS0+cm93cyk7CisgICAgaWYoIGNvdW50IDwgNyApCisgICAgICAgIEVYSVQ7CisKKyAgICBtMSA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGQzIgKTsKKyAgICBjdkNvbnZlcnRQb2ludHNIb21vZ2VuZW91cyggcG9pbnRzMSwgbTEgKTsKKworICAgIG0yID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl82NEZDMiApOworICAgIGN2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzKCBwb2ludHMyLCBtMiApOworCisgICAgaWYoIG1hc2sgKQorICAgIHsKKyAgICAgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVNLX0FSUihtYXNrKSAmJiBDVl9JU19NQVRfQ09OVChtYXNrLT50eXBlKSAmJgorICAgICAgICAgICAgKG1hc2stPnJvd3MgPT0gMSB8fCBtYXNrLT5jb2xzID09IDEpICYmCisgICAgICAgICAgICBtYXNrLT5yb3dzKm1hc2stPmNvbHMgPT0gY291bnQgKTsKKyAgICAgICAgdGVtcE1hc2sgPSBtYXNrOworICAgIH0KKyAgICBlbHNlIGlmKCBjb3VudCA+IDggKQorICAgICAgICB0ZW1wTWFzayA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfOFUgKTsKKyAgICBpZiggdGVtcE1hc2sgKQorICAgICAgICBjdlNldCggdGVtcE1hc2ssIGN2U2NhbGFyQWxsKDEuKSApOworCisgICAgeworICAgIEN2Rk1Fc3RpbWF0b3IgZXN0aW1hdG9yKCBNSU4oY291bnQsIChtZXRob2QgJiAzKSA9PSBDVl9GTV83UE9JTlQgPyA3IDogOCkgKTsKKyAgICBpZiggY291bnQgPT0gNyApCisgICAgICAgIHJlc3VsdCA9IGVzdGltYXRvci5ydW43UG9pbnQobTEsIG0yLCAmX0Y5eDMpOworICAgIGVsc2UgaWYoIGNvdW50ID09IDggfHwgbWV0aG9kID09IENWX0ZNXzhQT0lOVCApCisgICAgICAgIHJlc3VsdCA9IGVzdGltYXRvci5ydW44UG9pbnQobTEsIG0yLCAmX0YzeDMpOworICAgIGVsc2UgaWYoIGNvdW50ID4gOCApCisgICAgeworICAgICAgICBpZiggcGFyYW0xIDw9IDAgKQorICAgICAgICAgICAgcGFyYW0xID0gMzsKKyAgICAgICAgaWYoIHBhcmFtMiA8IERCTF9FUFNJTE9OIHx8IHBhcmFtMiA+IDEgLSBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICBwYXJhbTIgPSAwLjk5OworICAgICAgICAKKyAgICAgICAgaWYoIChtZXRob2QgJiB+MykgPT0gQ1ZfUkFOU0FDICkKKyAgICAgICAgICAgIHJlc3VsdCA9IGVzdGltYXRvci5ydW5SQU5TQUMobTEsIG0yLCAmX0YzeDMsIHRlbXBNYXNrLCBwYXJhbTEsIHBhcmFtMiApOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSBlc3RpbWF0b3IucnVuTE1lRFMobTEsIG0yLCAmX0YzeDMsIHRlbXBNYXNrLCBwYXJhbTIgKTsKKyAgICAgICAgaWYoIHJlc3VsdCA8PSAwICkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGljdkNvbXByZXNzUG9pbnRzKCAoQ3ZQb2ludDJENjRmKiltMS0+ZGF0YS5wdHIsIHRlbXBNYXNrLT5kYXRhLnB0ciwgMSwgY291bnQgKTsKKyAgICAgICAgY291bnQgPSBpY3ZDb21wcmVzc1BvaW50cyggKEN2UG9pbnQyRDY0ZiopbTItPmRhdGEucHRyLCB0ZW1wTWFzay0+ZGF0YS5wdHIsIDEsIGNvdW50ICk7CisgICAgICAgIGFzc2VydCggY291bnQgPj0gOCApOworICAgICAgICBtMS0+Y29scyA9IG0yLT5jb2xzID0gY291bnQ7CisgICAgICAgIGVzdGltYXRvci5ydW44UG9pbnQobTEsIG0yLCAmX0YzeDMpOworICAgIH0KKyAgICB9CisKKyAgICBpZiggcmVzdWx0ICkKKyAgICAgICAgY3ZDb252ZXJ0KCBmbWF0cml4LT5yb3dzID09IDMgPyAmX0YzeDMgOiAmX0Y5eDMsIGZtYXRyaXggKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZtMSApOworICAgIGN2UmVsZWFzZU1hdCggJm0yICk7CisgICAgaWYoIHRlbXBNYXNrICE9IG1hc2sgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wTWFzayApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q29tcHV0ZUNvcnJlc3BvbmRFcGlsaW5lcyggY29uc3QgQ3ZNYXQqIHBvaW50cywgaW50IHBvaW50SW1hZ2VJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGZtYXRyaXgsIEN2TWF0KiBsaW5lcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbXB1dGVDb3JyZXNwb25kRXBpbGluZXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgYWJjX3N0cmlkZSwgYWJjX3BsYW5lX3N0cmlkZSwgYWJjX2VsZW1fc2l6ZTsKKyAgICBpbnQgcGxhbmVfc3RyaWRlLCBzdHJpZGUsIGVsZW1fc2l6ZTsKKyAgICBpbnQgaSwgZGltcywgY291bnQsIGRlcHRoLCBjbiwgYWJjX2RpbXMsIGFiY19jb3VudCwgYWJjX2RlcHRoLCBhYmNfY247CisgICAgdWNoYXIgKmFwLCAqYnAsICpjcDsKKyAgICBjb25zdCB1Y2hhciAqeHAsICp5cCwgKnpwOworICAgIGRvdWJsZSBmWzldOworICAgIEN2TWF0IEYgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCBmICk7CisKKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMpICkKKyAgICAgICAgQ1ZfRVJST1IoICFwb2ludHMgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAicG9pbnRzIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSChwb2ludHMtPnR5cGUpOworICAgIGNuID0gQ1ZfTUFUX0NOKHBvaW50cy0+dHlwZSk7CisgICAgaWYoIChkZXB0aCAhPSBDVl8zMkYgJiYgZGVwdGggIT0gQ1ZfNjRGKSB8fCAoY24gIT0gMSAmJiBjbiAhPSAyICYmIGNuICE9IDMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiVGhlIGZvcm1hdCBvZiBwb2ludCBtYXRyaXggaXMgdW5zdXBwb3J0ZWQiICk7CisKKyAgICBpZiggcG9pbnRzLT5yb3dzID4gcG9pbnRzLT5jb2xzICkKKyAgICB7CisgICAgICAgIGRpbXMgPSBjbipwb2ludHMtPmNvbHM7CisgICAgICAgIGNvdW50ID0gcG9pbnRzLT5yb3dzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggKHBvaW50cy0+cm93cyA+IDEgJiYgY24gPiAxKSB8fCAocG9pbnRzLT5yb3dzID09IDEgJiYgY24gPT0gMSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUaGUgcG9pbnQgbWF0cml4IGRvZXMgbm90IGhhdmUgYSBwcm9wZXIgbGF5b3V0ICgyeG4sIDN4biwgbngyIG9yIG54MykiICk7CisgICAgICAgIGRpbXMgPSBjbiAqIHBvaW50cy0+cm93czsKKyAgICAgICAgY291bnQgPSBwb2ludHMtPmNvbHM7CisgICAgfQorCisgICAgaWYoIGRpbXMgIT0gMiAmJiBkaW1zICE9IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBkaW1lbnNpb25hbGl0eSBvZiBwb2ludHMgbXVzdCBiZSAyIG9yIDMiICk7CisKKyAgICBpZiggIUNWX0lTX01BVChmbWF0cml4KSApCisgICAgICAgIENWX0VSUk9SKCAhZm1hdHJpeCA/IENWX1N0c051bGxQdHIgOiBDVl9TdHNCYWRBcmcsICJmbWF0cml4IGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShmbWF0cml4LT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShmbWF0cml4LT50eXBlKSAhPSBDVl82NEZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImZ1bmRhbWVudGFsIG1hdHJpeCBtdXN0IGhhdmUgMzJmQzEgb3IgNjRmQzEgdHlwZSIgKTsKKworICAgIGlmKCBmbWF0cml4LT5jb2xzICE9IDMgfHwgZm1hdHJpeC0+cm93cyAhPSAzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJmdW5kYW1lbnRhbCBtYXRyaXggbXVzdCBiZSAzeDMiICk7CisKKyAgICBpZiggIUNWX0lTX01BVChsaW5lcykgKQorICAgICAgICBDVl9FUlJPUiggIWxpbmVzID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywgImxpbmVzIHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBhYmNfZGVwdGggPSBDVl9NQVRfREVQVEgobGluZXMtPnR5cGUpOworICAgIGFiY19jbiA9IENWX01BVF9DTihsaW5lcy0+dHlwZSk7CisgICAgaWYoIChhYmNfZGVwdGggIT0gQ1ZfMzJGICYmIGFiY19kZXB0aCAhPSBDVl82NEYpIHx8IChhYmNfY24gIT0gMSAmJiBhYmNfY24gIT0gMykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgZm9ybWF0IG9mIHRoZSBtYXRyaXggb2YgbGluZXMgaXMgdW5zdXBwb3J0ZWQiICk7CisKKyAgICBpZiggbGluZXMtPnJvd3MgPiBsaW5lcy0+Y29scyApCisgICAgeworICAgICAgICBhYmNfZGltcyA9IGFiY19jbipsaW5lcy0+Y29sczsKKyAgICAgICAgYWJjX2NvdW50ID0gbGluZXMtPnJvd3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAobGluZXMtPnJvd3MgPiAxICYmIGFiY19jbiA+IDEpIHx8IChsaW5lcy0+cm93cyA9PSAxICYmIGFiY19jbiA9PSAxKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBsaW5lcyBtYXRyaXggZG9lcyBub3QgaGF2ZSBhIHByb3BlciBsYXlvdXQgKDN4biBvciBueDMpIiApOworICAgICAgICBhYmNfZGltcyA9IGFiY19jbiAqIGxpbmVzLT5yb3dzOworICAgICAgICBhYmNfY291bnQgPSBsaW5lcy0+Y29sczsKKyAgICB9CisKKyAgICBpZiggYWJjX2RpbXMgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIGxpbmVzIG1hdHJpeCBkb2VzIG5vdCBoYXZlIGEgcHJvcGVyIGxheW91dCAoM3huIG9yIG54MykiICk7CisKKyAgICBpZiggYWJjX2NvdW50ICE9IGNvdW50ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVGhlIG51bWJlcnMgb2YgcG9pbnRzIGFuZCBsaW5lcyBhcmUgZGlmZmVyZW50IiApOworCisgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKGRlcHRoKTsKKyAgICBhYmNfZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKGFiY19kZXB0aCk7CisKKyAgICBpZiggcG9pbnRzLT5yb3dzID09IGRpbXMgKQorICAgIHsKKyAgICAgICAgcGxhbmVfc3RyaWRlID0gcG9pbnRzLT5zdGVwOworICAgICAgICBzdHJpZGUgPSBlbGVtX3NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBsYW5lX3N0cmlkZSA9IGVsZW1fc2l6ZTsKKyAgICAgICAgc3RyaWRlID0gcG9pbnRzLT5yb3dzID09IDEgPyBkaW1zKmVsZW1fc2l6ZSA6IHBvaW50cy0+c3RlcDsKKyAgICB9CisKKyAgICBpZiggbGluZXMtPnJvd3MgPT0gMyApCisgICAgeworICAgICAgICBhYmNfcGxhbmVfc3RyaWRlID0gbGluZXMtPnN0ZXA7CisgICAgICAgIGFiY19zdHJpZGUgPSBhYmNfZWxlbV9zaXplOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhYmNfcGxhbmVfc3RyaWRlID0gYWJjX2VsZW1fc2l6ZTsKKyAgICAgICAgYWJjX3N0cmlkZSA9IGxpbmVzLT5yb3dzID09IDEgPyAzKmFiY19lbGVtX3NpemUgOiBsaW5lcy0+c3RlcDsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBjdkNvbnZlcnQoIGZtYXRyaXgsICZGICkpOworICAgIGlmKCBwb2ludEltYWdlSUQgPT0gMiApCisgICAgICAgIGN2VHJhbnNwb3NlKCAmRiwgJkYgKTsKKworICAgIHhwID0gcG9pbnRzLT5kYXRhLnB0cjsKKyAgICB5cCA9IHhwICsgcGxhbmVfc3RyaWRlOworICAgIHpwID0gZGltcyA9PSAzID8geXAgKyBwbGFuZV9zdHJpZGUgOiAwOworCisgICAgYXAgPSBsaW5lcy0+ZGF0YS5wdHI7CisgICAgYnAgPSBhcCArIGFiY19wbGFuZV9zdHJpZGU7CisgICAgY3AgPSBicCArIGFiY19wbGFuZV9zdHJpZGU7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgeCwgeSwgeiA9IDEuOworICAgICAgICBkb3VibGUgYSwgYiwgYywgbnU7CisKKyAgICAgICAgaWYoIGRlcHRoID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHggPSAqKGZsb2F0Kil4cDsgeSA9ICooZmxvYXQqKXlwOworICAgICAgICAgICAgaWYoIHpwICkKKyAgICAgICAgICAgICAgICB6ID0gKihmbG9hdCopenAsIHpwICs9IHN0cmlkZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHggPSAqKGRvdWJsZSopeHA7IHkgPSAqKGRvdWJsZSopeXA7CisgICAgICAgICAgICBpZiggenAgKQorICAgICAgICAgICAgICAgIHogPSAqKGRvdWJsZSopenAsIHpwICs9IHN0cmlkZTsKKyAgICAgICAgfQorCisgICAgICAgIHhwICs9IHN0cmlkZTsgeXAgKz0gc3RyaWRlOworCisgICAgICAgIGEgPSBmWzBdKnggKyBmWzFdKnkgKyBmWzJdKno7CisgICAgICAgIGIgPSBmWzNdKnggKyBmWzRdKnkgKyBmWzVdKno7CisgICAgICAgIGMgPSBmWzZdKnggKyBmWzddKnkgKyBmWzhdKno7CisgICAgICAgIG51ID0gYSphICsgYipiOworICAgICAgICBudSA9IG51ID8gMS4vc3FydChudSkgOiAxLjsKKyAgICAgICAgYSAqPSBudTsgYiAqPSBudTsgYyAqPSBudTsKKworICAgICAgICBpZiggYWJjX2RlcHRoID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgICooZmxvYXQqKWFwID0gKGZsb2F0KWE7CisgICAgICAgICAgICAqKGZsb2F0KilicCA9IChmbG9hdCliOworICAgICAgICAgICAgKihmbG9hdCopY3AgPSAoZmxvYXQpYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICooZG91YmxlKilhcCA9IGE7CisgICAgICAgICAgICAqKGRvdWJsZSopYnAgPSBiOworICAgICAgICAgICAgKihkb3VibGUqKWNwID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIGFwICs9IGFiY19zdHJpZGU7CisgICAgICAgIGJwICs9IGFiY19zdHJpZGU7CisgICAgICAgIGNwICs9IGFiY19zdHJpZGU7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q29udmVydFBvaW50c0hvbW9nZW5lb3VzKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogZHN0ICkKK3sKKyAgICBDdk1hdCogdGVtcCA9IDA7CisgICAgQ3ZNYXQqIGRlbm9tID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb252ZXJ0UG9pbnRzSG9tb2dlbmVvdXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgc19jb3VudCwgc19kaW1zLCBkX2NvdW50LCBkX2RpbXM7CisgICAgQ3ZNYXQgX3NyYywgX2RzdCwgX29uZXM7CisgICAgQ3ZNYXQqIG9uZXMgPSAwOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjKSApCisgICAgICAgIENWX0VSUk9SKCAhc3JjID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywKKyAgICAgICAgIlRoZSBpbnB1dCBwYXJhbWV0ZXIgaXMgbm90IGEgdmFsaWQgbWF0cml4IiApOworCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgICAgIENWX0VSUk9SKCAhZHN0ID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywKKyAgICAgICAgIlRoZSBvdXRwdXQgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCBzcmMgPT0gZHN0IHx8IHNyYy0+ZGF0YS5wdHIgPT0gZHN0LT5kYXRhLnB0ciApCisgICAgeworICAgICAgICBpZiggc3JjICE9IGRzdCAmJiAoIUNWX0FSRV9UWVBFU19FUShzcmMsIGRzdCkgfHwgIUNWX0FSRV9TSVpFU19FUShzcmMsZHN0KSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaW5wbGFjZSBvcGVyYXRpb24iICk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIHNyYy0+cm93cyA+IHNyYy0+Y29scyApCisgICAgeworICAgICAgICBpZiggISgoc3JjLT5jb2xzID4gMSkgXiAoQ1ZfTUFUX0NOKHNyYy0+dHlwZSkgPiAxKSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJFaXRoZXIgdGhlIG51bWJlciBvZiBjaGFubmVscyBvciBjb2x1bW5zIG9yIHJvd3MgbXVzdCBiZSA9MSIgKTsKKworICAgICAgICBzX2RpbXMgPSBDVl9NQVRfQ04oc3JjLT50eXBlKSpzcmMtPmNvbHM7CisgICAgICAgIHNfY291bnQgPSBzcmMtPnJvd3M7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAhKChzcmMtPnJvd3MgPiAxKSBeIChDVl9NQVRfQ04oc3JjLT50eXBlKSA+IDEpKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkVpdGhlciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGNvbHVtbnMgb3Igcm93cyBtdXN0IGJlID0xIiApOworCisgICAgICAgIHNfZGltcyA9IENWX01BVF9DTihzcmMtPnR5cGUpKnNyYy0+cm93czsKKyAgICAgICAgc19jb3VudCA9IHNyYy0+Y29sczsKKyAgICB9CisKKyAgICBpZiggc3JjLT5yb3dzID09IDEgfHwgc3JjLT5jb2xzID09IDEgKQorICAgICAgICBzcmMgPSBjdlJlc2hhcGUoIHNyYywgJl9zcmMsIDEsIHNfY291bnQgKTsKKworICAgIGlmKCBkc3QtPnJvd3MgPiBkc3QtPmNvbHMgKQorICAgIHsKKyAgICAgICAgaWYoICEoKGRzdC0+Y29scyA+IDEpIF4gKENWX01BVF9DTihkc3QtPnR5cGUpID4gMSkpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIkVpdGhlciB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9yIGNvbHVtbnMgb3Igcm93cyBpbiB0aGUgaW5wdXQgbWF0cml4IG11c3QgYmUgPTEiICk7CisKKyAgICAgICAgZF9kaW1zID0gQ1ZfTUFUX0NOKGRzdC0+dHlwZSkqZHN0LT5jb2xzOworICAgICAgICBkX2NvdW50ID0gZHN0LT5yb3dzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggISgoZHN0LT5yb3dzID4gMSkgXiAoQ1ZfTUFUX0NOKGRzdC0+dHlwZSkgPiAxKSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICAgICAiRWl0aGVyIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb3IgY29sdW1ucyBvciByb3dzIGluIHRoZSBvdXRwdXQgbWF0cml4IG11c3QgYmUgPTEiICk7CisKKyAgICAgICAgZF9kaW1zID0gQ1ZfTUFUX0NOKGRzdC0+dHlwZSkqZHN0LT5yb3dzOworICAgICAgICBkX2NvdW50ID0gZHN0LT5jb2xzOworICAgIH0KKworICAgIGlmKCBkc3QtPnJvd3MgPT0gMSB8fCBkc3QtPmNvbHMgPT0gMSApCisgICAgICAgIGRzdCA9IGN2UmVzaGFwZSggZHN0LCAmX2RzdCwgMSwgZF9jb3VudCApOworCisgICAgaWYoIHNfY291bnQgIT0gZF9jb3VudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIkJvdGggbWF0cmljZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwb2ludHMiICk7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKHNyYy0+dHlwZSkgPCBDVl8zMkYgfHwgQ1ZfTUFUX0RFUFRIKGRzdC0+dHlwZSkgPCBDVl8zMkYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJCb3RoIG1hdHJpY2VzIG11c3QgYmUgZmxvYXRpbmctcG9pbnQgKHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uKSIgKTsKKworICAgIGlmKCBzX2RpbXMgPCAyIHx8IHNfZGltcyA+IDQgfHwgZF9kaW1zIDwgMiB8fCBkX2RpbXMgPiA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJCb3RoIGlucHV0IGFuZCBvdXRwdXQgcG9pbnQgZGltZW5zaW9uYWxpdHkgbXVzdCBiZSAyLCAzIG9yIDQiICk7CisKKyAgICBpZiggc19kaW1zIDwgZF9kaW1zIC0gMSB8fCBzX2RpbXMgPiBkX2RpbXMgKyAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiVGhlIGRpbWVuc2lvbmFsaXRpZXMgb2YgaW5wdXQgYW5kIG91dHB1dCBwb2ludCBzZXRzIGRpZmZlciB0b28gbXVjaCIgKTsKKworICAgIGlmKCBzX2RpbXMgPT0gZF9kaW1zIC0gMSApCisgICAgeworICAgICAgICBpZiggZF9jb3VudCA9PSBkc3QtPnJvd3MgKQorICAgICAgICB7CisgICAgICAgICAgICBvbmVzID0gY3ZHZXRTdWJSZWN0KCBkc3QsICZfb25lcywgY3ZSZWN0KCBzX2RpbXMsIDAsIDEsIGRfY291bnQgKSk7CisgICAgICAgICAgICBkc3QgPSBjdkdldFN1YlJlY3QoIGRzdCwgJl9kc3QsIGN2UmVjdCggMCwgMCwgc19kaW1zLCBkX2NvdW50ICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb25lcyA9IGN2R2V0U3ViUmVjdCggZHN0LCAmX29uZXMsIGN2UmVjdCggMCwgc19kaW1zLCBkX2NvdW50LCAxICkpOworICAgICAgICAgICAgZHN0ID0gY3ZHZXRTdWJSZWN0KCBkc3QsICZfZHN0LCBjdlJlY3QoIDAsIDAsIGRfY291bnQsIHNfZGltcyApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzX2RpbXMgPD0gZF9kaW1zICkKKyAgICB7CisgICAgICAgIGlmKCBzcmMtPnJvd3MgPT0gZHN0LT5yb3dzICYmIHNyYy0+Y29scyA9PSBkc3QtPmNvbHMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApICkKKyAgICAgICAgICAgICAgICBjdkNvcHkoIHNyYywgZHN0ICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3ZDb252ZXJ0KCBzcmMsIGRzdCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcCA9IGN2Q3JlYXRlTWF0KCBzcmMtPnJvd3MsIHNyYy0+Y29scywgZHN0LT50eXBlICkpOworICAgICAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCB0ZW1wICk7CisgICAgICAgICAgICAgICAgc3JjID0gdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN2VHJhbnNwb3NlKCBzcmMsIGRzdCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIG9uZXMgKQorICAgICAgICAgICAgY3ZTZXQoIG9uZXMsIGN2UmVhbFNjYWxhcigxLikgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHNfcGxhbmVfc3RyaWRlLCBzX3N0cmlkZSwgZF9wbGFuZV9zdHJpZGUsIGRfc3RyaWRlLCBlbGVtX3NpemU7CisKKyAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggc3JjLT5yb3dzLCBzcmMtPmNvbHMsIGRzdC0+dHlwZSApKTsKKyAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCB0ZW1wICk7CisgICAgICAgICAgICBzcmMgPSB0ZW1wOworICAgICAgICB9CisKKyAgICAgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyYy0+dHlwZSk7CisKKyAgICAgICAgaWYoIHNfY291bnQgPT0gc3JjLT5jb2xzICkKKyAgICAgICAgICAgIHNfcGxhbmVfc3RyaWRlID0gc3JjLT5zdGVwIC8gZWxlbV9zaXplLCBzX3N0cmlkZSA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHNfc3RyaWRlID0gc3JjLT5zdGVwIC8gZWxlbV9zaXplLCBzX3BsYW5lX3N0cmlkZSA9IDE7CisKKyAgICAgICAgaWYoIGRfY291bnQgPT0gZHN0LT5jb2xzICkKKyAgICAgICAgICAgIGRfcGxhbmVfc3RyaWRlID0gZHN0LT5zdGVwIC8gZWxlbV9zaXplLCBkX3N0cmlkZSA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRfc3RyaWRlID0gZHN0LT5zdGVwIC8gZWxlbV9zaXplLCBkX3BsYW5lX3N0cmlkZSA9IDE7CisKKyAgICAgICAgQ1ZfQ0FMTCggZGVub20gPSBjdkNyZWF0ZU1hdCggMSwgZF9jb3VudCwgZHN0LT50eXBlICkpOworCisgICAgICAgIGlmKCBDVl9NQVRfREVQVEgoZHN0LT50eXBlKSA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogeHMgPSBzcmMtPmRhdGEuZmw7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogeXMgPSB4cyArIHNfcGxhbmVfc3RyaWRlOworICAgICAgICAgICAgY29uc3QgZmxvYXQqIHpzID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB3cyA9IHhzICsgKHNfZGltcyAtIDEpKnNfcGxhbmVfc3RyaWRlOworCisgICAgICAgICAgICBmbG9hdCogaXcgPSBkZW5vbS0+ZGF0YS5mbDsKKworICAgICAgICAgICAgZmxvYXQqIHhkID0gZHN0LT5kYXRhLmZsOworICAgICAgICAgICAgZmxvYXQqIHlkID0geGQgKyBkX3BsYW5lX3N0cmlkZTsKKyAgICAgICAgICAgIGZsb2F0KiB6ZCA9IDA7CisKKyAgICAgICAgICAgIGlmKCBkX2RpbXMgPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgenMgPSB5cyArIHNfcGxhbmVfc3RyaWRlOworICAgICAgICAgICAgICAgIHpkID0geWQgKyBkX3BsYW5lX3N0cmlkZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfY291bnQ7IGkrKywgd3MgKz0gc19zdHJpZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHQgPSAqd3M7CisgICAgICAgICAgICAgICAgaXdbaV0gPSB0ID8gdCA6IDEuZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3ZEaXYoIDAsIGRlbm9tLCBkZW5vbSApOworCisgICAgICAgICAgICBpZiggZF9kaW1zID09IDMgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX2NvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdyA9IGl3W2ldOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4ID0gKnhzICogdywgeSA9ICp5cyAqIHcsIHogPSAqenMgKiB3OworICAgICAgICAgICAgICAgICAgICB4cyArPSBzX3N0cmlkZTsgeXMgKz0gc19zdHJpZGU7IHpzICs9IHNfc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAqeGQgPSB4OyAqeWQgPSB5OyAqemQgPSB6OworICAgICAgICAgICAgICAgICAgICB4ZCArPSBkX3N0cmlkZTsgeWQgKz0gZF9zdHJpZGU7IHpkICs9IGRfc3RyaWRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBpd1tpXTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCA9ICp4cyAqIHcsIHkgPSAqeXMgKiB3OworICAgICAgICAgICAgICAgICAgICB4cyArPSBzX3N0cmlkZTsgeXMgKz0gc19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICp4ZCA9IHg7ICp5ZCA9IHk7CisgICAgICAgICAgICAgICAgICAgIHhkICs9IGRfc3RyaWRlOyB5ZCArPSBkX3N0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIHhzID0gc3JjLT5kYXRhLmRiOworICAgICAgICAgICAgY29uc3QgZG91YmxlKiB5cyA9IHhzICsgc19wbGFuZV9zdHJpZGU7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIHpzID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogd3MgPSB4cyArIChzX2RpbXMgLSAxKSpzX3BsYW5lX3N0cmlkZTsKKworICAgICAgICAgICAgZG91YmxlKiBpdyA9IGRlbm9tLT5kYXRhLmRiOworCisgICAgICAgICAgICBkb3VibGUqIHhkID0gZHN0LT5kYXRhLmRiOworICAgICAgICAgICAgZG91YmxlKiB5ZCA9IHhkICsgZF9wbGFuZV9zdHJpZGU7CisgICAgICAgICAgICBkb3VibGUqIHpkID0gMDsKKworICAgICAgICAgICAgaWYoIGRfZGltcyA9PSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB6cyA9IHlzICsgc19wbGFuZV9zdHJpZGU7CisgICAgICAgICAgICAgICAgemQgPSB5ZCArIGRfcGxhbmVfc3RyaWRlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9jb3VudDsgaSsrLCB3cyArPSBzX3N0cmlkZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSAqd3M7CisgICAgICAgICAgICAgICAgaXdbaV0gPSB0ID8gdCA6IDEuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkRpdiggMCwgZGVub20sIGRlbm9tICk7CisKKyAgICAgICAgICAgIGlmKCBkX2RpbXMgPT0gMyApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdyA9IGl3W2ldOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICp4cyAqIHcsIHkgPSAqeXMgKiB3LCB6ID0gKnpzICogdzsKKyAgICAgICAgICAgICAgICAgICAgeHMgKz0gc19zdHJpZGU7IHlzICs9IHNfc3RyaWRlOyB6cyArPSBzX3N0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgKnhkID0geDsgKnlkID0geTsgKnpkID0gejsKKyAgICAgICAgICAgICAgICAgICAgeGQgKz0gZF9zdHJpZGU7IHlkICs9IGRfc3RyaWRlOyB6ZCArPSBkX3N0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdyA9IGl3W2ldOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCA9ICp4cyAqIHcsIHkgPSAqeXMgKiB3OworICAgICAgICAgICAgICAgICAgICB4cyArPSBzX3N0cmlkZTsgeXMgKz0gc19zdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICp4ZCA9IHg7ICp5ZCA9IHk7CisgICAgICAgICAgICAgICAgICAgIHhkICs9IGRfc3RyaWRlOyB5ZCArPSBkX3N0cmlkZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmZGVub20gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2Z2VvbWV0cnkuY3BwIGIvY3Yvc3JjL2N2Z2VvbWV0cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMWMwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZnZW9tZXRyeS5jcHAKQEAgLTAsMCArMSw1OTMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisKK0NWX0lNUEwgQ3ZSZWN0Citjdk1heFJlY3QoIGNvbnN0IEN2UmVjdCogcmVjdDEsIGNvbnN0IEN2UmVjdCogcmVjdDIgKQoreworICAgIGlmKCByZWN0MSAmJiByZWN0MiApCisgICAgeworICAgICAgICBDdlJlY3QgbWF4X3JlY3Q7CisgICAgICAgIGludCBhLCBiOworCisgICAgICAgIG1heF9yZWN0LnggPSBhID0gcmVjdDEtPng7CisgICAgICAgIGIgPSByZWN0Mi0+eDsKKyAgICAgICAgaWYoIG1heF9yZWN0LnggPiBiICkKKyAgICAgICAgICAgIG1heF9yZWN0LnggPSBiOworCisgICAgICAgIG1heF9yZWN0LndpZHRoID0gYSArPSByZWN0MS0+d2lkdGg7CisgICAgICAgIGIgKz0gcmVjdDItPndpZHRoOworCisgICAgICAgIGlmKCBtYXhfcmVjdC53aWR0aCA8IGIgKQorICAgICAgICAgICAgbWF4X3JlY3Qud2lkdGggPSBiOworICAgICAgICBtYXhfcmVjdC53aWR0aCAtPSBtYXhfcmVjdC54OworCisgICAgICAgIG1heF9yZWN0LnkgPSBhID0gcmVjdDEtPnk7CisgICAgICAgIGIgPSByZWN0Mi0+eTsKKyAgICAgICAgaWYoIG1heF9yZWN0LnkgPiBiICkKKyAgICAgICAgICAgIG1heF9yZWN0LnkgPSBiOworCisgICAgICAgIG1heF9yZWN0LmhlaWdodCA9IGEgKz0gcmVjdDEtPmhlaWdodDsKKyAgICAgICAgYiArPSByZWN0Mi0+aGVpZ2h0OworCisgICAgICAgIGlmKCBtYXhfcmVjdC5oZWlnaHQgPCBiICkKKyAgICAgICAgICAgIG1heF9yZWN0LmhlaWdodCA9IGI7CisgICAgICAgIG1heF9yZWN0LmhlaWdodCAtPSBtYXhfcmVjdC55OworICAgICAgICByZXR1cm4gbWF4X3JlY3Q7CisgICAgfQorICAgIGVsc2UgaWYoIHJlY3QxICkKKyAgICAgICAgcmV0dXJuICpyZWN0MTsKKyAgICBlbHNlIGlmKCByZWN0MiApCisgICAgICAgIHJldHVybiAqcmVjdDI7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gY3ZSZWN0KDAsMCwwLDApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZCb3hQb2ludHMoIEN2Qm94MkQgYm94LCBDdlBvaW50MkQzMmYgcHRbNF0gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZCb3hQb2ludHMiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgZG91YmxlIGFuZ2xlID0gYm94LmFuZ2xlKkNWX1BJLzE4MC47CisgICAgZmxvYXQgYSA9IChmbG9hdCljb3MoYW5nbGUpKjAuNWY7CisgICAgZmxvYXQgYiA9IChmbG9hdClzaW4oYW5nbGUpKjAuNWY7CisKKyAgICBpZiggIXB0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHZlcnRleCBhcnJheSBwb2ludGVyIiApOworCisgICAgcHRbMF0ueCA9IGJveC5jZW50ZXIueCAtIGEqYm94LnNpemUuaGVpZ2h0IC0gYipib3guc2l6ZS53aWR0aDsKKyAgICBwdFswXS55ID0gYm94LmNlbnRlci55ICsgYipib3guc2l6ZS5oZWlnaHQgLSBhKmJveC5zaXplLndpZHRoOworICAgIHB0WzFdLnggPSBib3guY2VudGVyLnggKyBhKmJveC5zaXplLmhlaWdodCAtIGIqYm94LnNpemUud2lkdGg7CisgICAgcHRbMV0ueSA9IGJveC5jZW50ZXIueSAtIGIqYm94LnNpemUuaGVpZ2h0IC0gYSpib3guc2l6ZS53aWR0aDsKKyAgICBwdFsyXS54ID0gMipib3guY2VudGVyLnggLSBwdFswXS54OworICAgIHB0WzJdLnkgPSAyKmJveC5jZW50ZXIueSAtIHB0WzBdLnk7CisgICAgcHRbM10ueCA9IDIqYm94LmNlbnRlci54IC0gcHRbMV0ueDsKKyAgICBwdFszXS55ID0gMipib3guY2VudGVyLnkgLSBwdFsxXS55OworCisgICAgX19FTkRfXzsKK30KKworCitpbnQKK2ljdkludGVyc2VjdExpbmVzKCBkb3VibGUgeDEsIGRvdWJsZSBkeDEsIGRvdWJsZSB5MSwgZG91YmxlIGR5MSwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgeDIsIGRvdWJsZSBkeDIsIGRvdWJsZSB5MiwgZG91YmxlIGR5MiwgZG91YmxlICp0MiApCit7CisgICAgZG91YmxlIGQgPSBkeDEgKiBkeTIgLSBkeDIgKiBkeTE7CisgICAgaW50IHJlc3VsdCA9IC0xOworCisgICAgaWYoIGQgIT0gMCApCisgICAgeworICAgICAgICAqdDIgPSAoKHgyIC0geDEpICogZHkxIC0gKHkyIC0geTEpICogZHgxKSAvIGQ7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZAoraWN2Q3JlYXRlQ2VudGVyTm9ybWFsTGluZSggQ3ZTdWJkaXYyREVkZ2UgZWRnZSwgZG91YmxlICpfYSwgZG91YmxlICpfYiwgZG91YmxlICpfYyApCit7CisgICAgQ3ZQb2ludDJEMzJmIG9yZyA9IGN2U3ViZGl2MkRFZGdlT3JnKCBlZGdlICktPnB0OworICAgIEN2UG9pbnQyRDMyZiBkc3QgPSBjdlN1YmRpdjJERWRnZURzdCggZWRnZSApLT5wdDsKKworICAgIGRvdWJsZSBhID0gZHN0LnggLSBvcmcueDsKKyAgICBkb3VibGUgYiA9IGRzdC55IC0gb3JnLnk7CisgICAgZG91YmxlIGMgPSAtKGEgKiAoZHN0LnggKyBvcmcueCkgKyBiICogKGRzdC55ICsgb3JnLnkpKTsKKworICAgICpfYSA9IGEgKyBhOworICAgICpfYiA9IGIgKyBiOworICAgICpfYyA9IGM7Cit9CisKKwordm9pZAoraWN2SW50ZXJzZWN0TGluZXMzKCBkb3VibGUgKmEwLCBkb3VibGUgKmIwLCBkb3VibGUgKmMwLAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmExLCBkb3VibGUgKmIxLCBkb3VibGUgKmMxLCBDdlBvaW50MkQzMmYgKiBwb2ludCApCit7CisgICAgZG91YmxlIGRldCA9IGEwWzBdICogYjFbMF0gLSBhMVswXSAqIGIwWzBdOworCisgICAgaWYoIGRldCAhPSAwICkKKyAgICB7CisgICAgICAgIGRldCA9IDEuIC8gZGV0OworICAgICAgICBwb2ludC0+eCA9IChmbG9hdCkgKChiMFswXSAqIGMxWzBdIC0gYjFbMF0gKiBjMFswXSkgKiBkZXQpOworICAgICAgICBwb2ludC0+eSA9IChmbG9hdCkgKChhMVswXSAqIGMwWzBdIC0gYTBbMF0gKiBjMVswXSkgKiBkZXQpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwb2ludC0+eCA9IHBvaW50LT55ID0gRkxUX01BWDsKKyAgICB9Cit9CisKKworQ1ZfSU1QTCBkb3VibGUKK2N2UG9pbnRQb2x5Z29uVGVzdCggY29uc3QgQ3ZBcnIqIF9jb250b3VyLCBDdlBvaW50MkQzMmYgcHQsIGludCBtZWFzdXJlX2Rpc3QgKQoreworICAgIGRvdWJsZSByZXN1bHQgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZDaGVja1BvaW50UG9seWdvbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBDdlNlcUJsb2NrIGJsb2NrOworICAgIEN2Q29udG91ciBoZWFkZXI7CisgICAgQ3ZTZXEqIGNvbnRvdXIgPSAoQ3ZTZXEqKV9jb250b3VyOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgdG90YWwsIGNvdW50ZXIgPSAwOworICAgIGludCBpc19mbG9hdDsKKyAgICBkb3VibGUgbWluX2Rpc3RfbnVtID0gRkxUX01BWCwgbWluX2Rpc3RfZGVub20gPSAxOworICAgIEN2UG9pbnQgaXAgPSB7MCwwfTsKKworICAgIGlmKCAhQ1ZfSVNfU0VRKGNvbnRvdXIpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGNvbnRvdXIgPSBjdlBvaW50U2VxRnJvbU1hdCggQ1ZfU0VRX0tJTkRfQ1VSVkUgKyBDVl9TRVFfRkxBR19DTE9TRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRvdXIsICZoZWFkZXIsICZibG9jayApKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfU0VRX1BPTFlHT04oY29udG91cikgKQorICAgIHsKKyAgICAgICAgaWYoIGNvbnRvdXItPmhlYWRlcl9zaXplID09IHNpemVvZihDdkNvbnRvdXIpICYmICFtZWFzdXJlX2Rpc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlJlY3QgciA9ICgoQ3ZDb250b3VyKiljb250b3VyKS0+cmVjdDsKKyAgICAgICAgICAgIGlmKCBwdC54IDwgci54IHx8IHB0LnkgPCByLnkgfHwKKyAgICAgICAgICAgICAgICBwdC54ID49IHIueCArIHIud2lkdGggfHwgcHQueSA+PSByLnkgKyByLmhlaWdodCApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xMDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfU0VRX0NIQUlOKGNvbnRvdXIpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiQ2hhaW5zIGFyZSBub3Qgc3VwcG9ydGVkLiBDb252ZXJ0IHRoZW0gdG8gcG9seWdvbmFsIHJlcHJlc2VudGF0aW9uIHVzaW5nIGN2QXBwcm94Q2hhaW5zKCkiICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIklucHV0IGNvbnRvdXIgaXMgbmVpdGhlciBhIHZhbGlkIHNlcXVlbmNlIG5vciBhIG1hdHJpeCIgKTsKKworICAgIHRvdGFsID0gY29udG91ci0+dG90YWw7CisgICAgaXNfZmxvYXQgPSBDVl9TRVFfRUxUWVBFKGNvbnRvdXIpID09IENWXzMyRkMyOworICAgIGN2U3RhcnRSZWFkU2VxKCBjb250b3VyLCAmcmVhZGVyLCAtMSApOworCisgICAgaWYoICFpc19mbG9hdCAmJiAhbWVhc3VyZV9kaXN0ICYmIChpcC54ID0gY3ZSb3VuZChwdC54KSkgPT0gcHQueCAmJiAoaXAueSA9IGN2Um91bmQocHQueSkpID09IHB0LnkgKQorICAgIHsKKyAgICAgICAgLy8gdGhlIGZhc3Rlc3QgInB1cmUgaW50ZWdlciIgYnJhbmNoCisgICAgICAgIEN2UG9pbnQgdjAsIHY7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHYsIHJlYWRlciApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRpc3Q7CisgICAgICAgICAgICB2MCA9IHY7CisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCB2LCByZWFkZXIgKTsKKworICAgICAgICAgICAgaWYoICh2MC55IDw9IGlwLnkgJiYgdi55IDw9IGlwLnkpIHx8CisgICAgICAgICAgICAgICAgKHYwLnkgPiBpcC55ICYmIHYueSA+IGlwLnkpIHx8CisgICAgICAgICAgICAgICAgKHYwLnggPCBpcC54ICYmIHYueCA8IGlwLngpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaXAueSA9PSB2LnkgJiYgKGlwLnggPT0gdi54IHx8IChpcC55ID09IHYwLnkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCh2MC54IDw9IGlwLnggJiYgaXAueCA8PSB2LngpIHx8ICh2LnggPD0gaXAueCAmJiBpcC54IDw9IHYwLngpKSkpICkKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzdCA9IChpcC55IC0gdjAueSkqKHYueCAtIHYwLngpIC0gKGlwLnggLSB2MC54KSoodi55IC0gdjAueSk7CisgICAgICAgICAgICBpZiggZGlzdCA9PSAwICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgaWYoIHYueSA8IHYwLnkgKQorICAgICAgICAgICAgICAgIGRpc3QgPSAtZGlzdDsKKyAgICAgICAgICAgIGNvdW50ZXIgKz0gZGlzdCA+IDA7CisgICAgICAgIH0KKworICAgICAgICByZXN1bHQgPSBjb3VudGVyICUgMiA9PSAwID8gLTEwMCA6IDEwMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHYwLCB2OworICAgICAgICBDdlBvaW50IGl2OworCisgICAgICAgIGlmKCBpc19mbG9hdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHYsIHJlYWRlciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggaXYsIHJlYWRlciApOworICAgICAgICAgICAgdiA9IGN2UG9pbnRUbzMyZiggaXYgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhbWVhc3VyZV9kaXN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0OworICAgICAgICAgICAgICAgIHYwID0gdjsKKyAgICAgICAgICAgICAgICBpZiggaXNfZmxvYXQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggdiwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIGl2LCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGN2UG9pbnRUbzMyZiggaXYgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggKHYwLnkgPD0gcHQueSAmJiB2LnkgPD0gcHQueSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHYwLnkgPiBwdC55ICYmIHYueSA+IHB0LnkpIHx8CisgICAgICAgICAgICAgICAgICAgICh2MC54IDwgcHQueCAmJiB2LnggPCBwdC54KSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggcHQueSA9PSB2LnkgJiYgKHB0LnggPT0gdi54IHx8IChwdC55ID09IHYwLnkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgodjAueCA8PSBwdC54ICYmIHB0LnggPD0gdi54KSB8fCAodi54IDw9IHB0LnggJiYgcHQueCA8PSB2MC54KSkpKSApCisgICAgICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkaXN0ID0gKGRvdWJsZSkocHQueSAtIHYwLnkpKih2LnggLSB2MC54KSAtIChkb3VibGUpKHB0LnggLSB2MC54KSoodi55IC0gdjAueSk7CisgICAgICAgICAgICAgICAgaWYoIGRpc3QgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgaWYoIHYueSA8IHYwLnkgKQorICAgICAgICAgICAgICAgICAgICBkaXN0ID0gLWRpc3Q7CisgICAgICAgICAgICAgICAgY291bnRlciArPSBkaXN0ID4gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzdWx0ID0gY291bnRlciAlIDIgPT0gMCA/IC0xMDAgOiAxMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGR4LCBkeSwgZHgxLCBkeTEsIGR4MiwgZHkyLCBkaXN0X251bSwgZGlzdF9kZW5vbSA9IDE7CisgICAgICAgIAorICAgICAgICAgICAgICAgIHYwID0gdjsKKyAgICAgICAgICAgICAgICBpZiggaXNfZmxvYXQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggdiwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIGl2LCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGN2UG9pbnRUbzMyZiggaXYgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgICAgIGR4ID0gdi54IC0gdjAueDsgZHkgPSB2LnkgLSB2MC55OworICAgICAgICAgICAgICAgIGR4MSA9IHB0LnggLSB2MC54OyBkeTEgPSBwdC55IC0gdjAueTsKKyAgICAgICAgICAgICAgICBkeDIgPSBwdC54IC0gdi54OyBkeTIgPSBwdC55IC0gdi55OworICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggZHgxKmR4ICsgZHkxKmR5IDw9IDAgKQorICAgICAgICAgICAgICAgICAgICBkaXN0X251bSA9IGR4MSpkeDEgKyBkeTEqZHkxOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGR4MipkeCArIGR5MipkeSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9udW0gPSBkeDIqZHgyICsgZHkyKmR5MjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaXN0X251bSA9IChkeTEqZHggLSBkeDEqZHkpOworICAgICAgICAgICAgICAgICAgICBkaXN0X251bSAqPSBkaXN0X251bTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9kZW5vbSA9IGR4KmR4ICsgZHkqZHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGRpc3RfbnVtKm1pbl9kaXN0X2Rlbm9tIDwgbWluX2Rpc3RfbnVtKmRpc3RfZGVub20gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3RfbnVtID0gZGlzdF9udW07CisgICAgICAgICAgICAgICAgICAgIG1pbl9kaXN0X2Rlbm9tID0gZGlzdF9kZW5vbTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1pbl9kaXN0X251bSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCAodjAueSA8PSBwdC55ICYmIHYueSA8PSBwdC55KSB8fAorICAgICAgICAgICAgICAgICAgICAodjAueSA+IHB0LnkgJiYgdi55ID4gcHQueSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHYwLnggPCBwdC54ICYmIHYueCA8IHB0LngpICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBkaXN0X251bSA9IGR5MSpkeCAtIGR4MSpkeTsKKyAgICAgICAgICAgICAgICBpZiggZHkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9udW0gPSAtZGlzdF9udW07CisgICAgICAgICAgICAgICAgY291bnRlciArPSBkaXN0X251bSA+IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IHNxcnQobWluX2Rpc3RfbnVtL21pbl9kaXN0X2Rlbm9tKTsKKyAgICAgICAgICAgIGlmKCBjb3VudGVyICUgMiA9PSAwICkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlJRRGVjb21wM3gzKCBjb25zdCBDdk1hdCAqbWF0cml4TSwgQ3ZNYXQgKm1hdHJpeFIsIEN2TWF0ICptYXRyaXhRLAorICAgICAgICAgICAgICAgQ3ZNYXQgKm1hdHJpeFF4LCBDdk1hdCAqbWF0cml4UXksIEN2TWF0ICptYXRyaXhReiwKKyAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiAqZXVsZXJBbmdsZXMpCit7CisgICAgQ1ZfRlVOQ05BTUUoImN2UlFEZWNvbXAzeDMiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgX01bM11bM10sIF9SWzNdWzNdLCBfUVszXVszXTsKKyAgICBDdk1hdCBNID0gY3ZNYXQoMywgMywgQ1ZfNjRGLCBfTSk7CisgICAgQ3ZNYXQgUiA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX1IpOworICAgIEN2TWF0IFEgPSBjdk1hdCgzLCAzLCBDVl82NEYsIF9RKTsKKyAgICBkb3VibGUgeiwgYywgczsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMuICovCisgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQobWF0cml4TSkgJiYgQ1ZfSVNfTUFUKG1hdHJpeFIpICYmIENWX0lTX01BVChtYXRyaXhRKSAmJgorICAgICAgICBtYXRyaXhNLT5jb2xzID09IDMgJiYgbWF0cml4TS0+cm93cyA9PSAzICYmCisgICAgICAgIENWX0FSRV9TSVpFU19FUShtYXRyaXhNLCBtYXRyaXhSKSAmJiBDVl9BUkVfU0laRVNfRVEobWF0cml4TSwgbWF0cml4USkpOworCisgICAgY3ZDb252ZXJ0KG1hdHJpeE0sICZNKTsKKworICAgIHsKKyAgICAvKiBGaW5kIEdpdmVucyByb3RhdGlvbiBRX3ggZm9yIHggYXhpcyAobGVmdCBtdWx0aXBsaWNhdGlvbikuICovCisgICAgLyoKKyAgICAgICAgICggMSAgMCAgMCApCisgICAgUXggPSAoIDAgIGMgIHMgKSwgYyA9IG0zMy9zcXJ0KG0zMl4yICsgbTMzXjIpLCBzID0gbTMyL3NxcnQobTMyXjIgKyBtMzNeMikKKyAgICAgICAgICggMCAtcyAgYyApCisgICAgKi8KKyAgICBzID0gX01bMl1bMV07CisgICAgYyA9IF9NWzJdWzJdOworICAgIHogPSAxLi9zcXJ0KGMgKiBjICsgcyAqIHMgKyBEQkxfRVBTSUxPTik7CisgICAgYyAqPSB6OworICAgIHMgKj0gejsKKworICAgIGRvdWJsZSBfUXhbM11bM10gPSB7IHsxLCAwLCAwfSwgezAsIGMsIHN9LCB7MCwgLXMsIGN9IH07CisgICAgQ3ZNYXQgUXggPSBjdk1hdCgzLCAzLCBDVl82NEYsIF9ReCk7CisKKyAgICBjdk1hdE11bCgmTSwgJlF4LCAmUik7CisgICAgYXNzZXJ0KGZhYnMoX1JbMl1bMV0pIDwgRkxUX0VQU0lMT04pOworICAgIF9SWzJdWzFdID0gMDsKKworICAgIC8qIEZpbmQgR2l2ZW5zIHJvdGF0aW9uIGZvciB5IGF4aXMuICovCisgICAgLyoKKyAgICAgICAgICggYyAgMCAgcyApCisgICAgUXkgPSAoIDAgIDEgIDAgKSwgYyA9IG0zMy9zcXJ0KG0zMV4yICsgbTMzXjIpLCBzID0gbTMxL3NxcnQobTMxXjIgKyBtMzNeMikKKyAgICAgICAgICgtcyAgMCAgYyApCisgICAgKi8KKyAgICBzID0gX1JbMl1bMF07CisgICAgYyA9IF9SWzJdWzJdOworICAgIHogPSAxLi9zcXJ0KGMgKiBjICsgcyAqIHMgKyBEQkxfRVBTSUxPTik7CisgICAgYyAqPSB6OworICAgIHMgKj0gejsKKworICAgIGRvdWJsZSBfUXlbM11bM10gPSB7IHtjLCAwLCBzfSwgezAsIDEsIDB9LCB7LXMsIDAsIGN9IH07CisgICAgQ3ZNYXQgUXkgPSBjdk1hdCgzLCAzLCBDVl82NEYsIF9ReSk7CisgICAgY3ZNYXRNdWwoJlIsICZReSwgJk0pOworCisgICAgYXNzZXJ0KGZhYnMoX01bMl1bMF0pIDwgRkxUX0VQU0lMT04pOworICAgIF9NWzJdWzBdID0gMDsKKworICAgIC8qIEZpbmQgR2l2ZW5zIHJvdGF0aW9uIGZvciB6IGF4aXMuICovCisgICAgLyoKKyAgICAgICAgICggYyAgcyAgMCApCisgICAgUXogPSAoLXMgIGMgIDAgKSwgYyA9IG0yMi9zcXJ0KG0yMV4yICsgbTIyXjIpLCBzID0gbTIxL3NxcnQobTIxXjIgKyBtMjJeMikKKyAgICAgICAgICggMCAgMCAgMSApCisgICAgKi8KKworICAgIHMgPSBfTVsxXVswXTsKKyAgICBjID0gX01bMV1bMV07CisgICAgeiA9IDEuL3NxcnQoYyAqIGMgKyBzICogcyArIERCTF9FUFNJTE9OKTsKKyAgICBjICo9IHo7CisgICAgcyAqPSB6OworCisgICAgZG91YmxlIF9RelszXVszXSA9IHsge2MsIHMsIDB9LCB7LXMsIGMsIDB9LCB7MCwgMCwgMX0gfTsKKyAgICBDdk1hdCBReiA9IGN2TWF0KDMsIDMsIENWXzY0RiwgX1F6KTsKKworICAgIGN2TWF0TXVsKCZNLCAmUXosICZSKTsKKyAgICBhc3NlcnQoZmFicyhfUlsxXVswXSkgPCBGTFRfRVBTSUxPTik7CisgICAgX1JbMV1bMF0gPSAwOworCisgICAgLy8gU29sdmUgdGhlIGRlY29tcG9zaXRpb24gYW1iaWd1aXR5LgorICAgIC8vIERpYWdvbmFsIGVudHJpZXMgb2YgUiwgZXhjZXB0IHRoZSBsYXN0IG9uZSwgc2hhbGwgYmUgcG9zaXRpdmUuCisgICAgLy8gRnVydGhlciByb3RhdGUgUiBieSAxODAgZGVncmVlIGlmIG5lY2Vzc2FyeQorICAgIGlmKCBfUlswXVswXSA8IDAgKQorICAgIHsKKyAgICAgICAgaWYoIF9SWzFdWzFdIDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJvdGF0ZSBhcm91bmQgeiBmb3IgMTgwIGRlZ3JlZSwgaS5lLiBhIHJvdGF0aW9uIG1hdHJpeCBvZgorICAgICAgICAgICAgLy8gWy0xLCAgMCwgIDBdLAorICAgICAgICAgICAgLy8gWyAwLCAtMSwgIDBdLAorICAgICAgICAgICAgLy8gWyAwLCAgMCwgIDFdCisgICAgICAgICAgICBfUlswXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9SWzBdWzFdICo9IC0xOworICAgICAgICAgICAgX1JbMV1bMV0gKj0gLTE7CisKKyAgICAgICAgICAgIF9RelswXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9RelswXVsxXSAqPSAtMTsKKyAgICAgICAgICAgIF9RelsxXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9RelsxXVsxXSAqPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJvdGF0ZSBhcm91bmQgeSBmb3IgMTgwIGRlZ3JlZSwgaS5lLiBhIHJvdGF0aW9uIG1hdHJpeCBvZgorICAgICAgICAgICAgLy8gWy0xLCAgMCwgIDBdLAorICAgICAgICAgICAgLy8gWyAwLCAgMSwgIDBdLAorICAgICAgICAgICAgLy8gWyAwLCAgMCwgLTFdCisgICAgICAgICAgICBfUlswXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9SWzBdWzJdICo9IC0xOworICAgICAgICAgICAgX1JbMV1bMl0gKj0gLTE7CisgICAgICAgICAgICBfUlsyXVsyXSAqPSAtMTsKKworICAgICAgICAgICAgY3ZUcmFuc3Bvc2UoICZReiwgJlF6ICk7CisKKyAgICAgICAgICAgIF9ReVswXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9ReVswXVsyXSAqPSAtMTsKKyAgICAgICAgICAgIF9ReVsyXVswXSAqPSAtMTsKKyAgICAgICAgICAgIF9ReVsyXVsyXSAqPSAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBfUlsxXVsxXSA8IDAgKQorICAgIHsKKyAgICAgICAgLy8gPz8/IGZvciBzb21lIHJlYXNvbiwgd2UgbmV2ZXIgZ2V0IGhlcmUgPz8/CisKKyAgICAgICAgLy8gcm90YXRlIGFyb3VuZCB4IGZvciAxODAgZGVncmVlLCBpLmUuIGEgcm90YXRpb24gbWF0cml4IG9mCisgICAgICAgIC8vIFsgMSwgIDAsICAwXSwKKyAgICAgICAgLy8gWyAwLCAtMSwgIDBdLAorICAgICAgICAvLyBbIDAsICAwLCAtMV0KKyAgICAgICAgX1JbMF1bMV0gKj0gLTE7CisgICAgICAgIF9SWzBdWzJdICo9IC0xOworICAgICAgICBfUlsxXVsxXSAqPSAtMTsKKyAgICAgICAgX1JbMV1bMl0gKj0gLTE7CisgICAgICAgIF9SWzJdWzJdICo9IC0xOworCisgICAgICAgIGN2VHJhbnNwb3NlKCAmUXosICZReiApOworICAgICAgICBjdlRyYW5zcG9zZSggJlF5LCAmUXkgKTsKKworICAgICAgICBfUXhbMV1bMV0gKj0gLTE7CisgICAgICAgIF9ReFsxXVsyXSAqPSAtMTsKKyAgICAgICAgX1F4WzJdWzFdICo9IC0xOworICAgICAgICBfUXhbMl1bMl0gKj0gLTE7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHRoZSBldWxlciBhbmdsZQorICAgIGlmKCBldWxlckFuZ2xlcyApCisgICAgeworICAgICAgICBldWxlckFuZ2xlcy0+eCA9IGFjb3MoX1F4WzFdWzFdKSAqIChfUXhbMV1bMl0gPj0gMCA/IDEgOiAtMSkgKiAoMTgwLjAgLyBDVl9QSSk7CisgICAgICAgIGV1bGVyQW5nbGVzLT55ID0gYWNvcyhfUXlbMF1bMF0pICogKF9ReVswXVsyXSA+PSAwID8gMSA6IC0xKSAqICgxODAuMCAvIENWX1BJKTsKKyAgICAgICAgZXVsZXJBbmdsZXMtPnogPSBhY29zKF9RelswXVswXSkgKiAoX1F6WzBdWzFdID49IDAgPyAxIDogLTEpICogKDE4MC4wIC8gQ1ZfUEkpOworICAgIH0KKworICAgIC8qIENhbHVsYXRlIG9ydGhvZ29uYWwgbWF0cml4LiAqLworICAgIC8qCisgICAgUSA9IFF6VCAqIFF5VCAqIFF4VAorICAgICovCisgICAgY3ZHRU1NKCAmUXosICZReSwgMSwgMCwgMCwgJk0sIENWX0dFTU1fQV9UICsgQ1ZfR0VNTV9CX1QgKTsKKyAgICBjdkdFTU0oICZNLCAmUXgsIDEsIDAsIDAsICZRLCBDVl9HRU1NX0JfVCApOworCisgICAgLyogU2F2ZSBSIGFuZCBRIG1hdHJpY2VzLiAqLworICAgIGN2Q29udmVydCggJlIsIG1hdHJpeFIgKTsKKyAgICBjdkNvbnZlcnQoICZRLCBtYXRyaXhRICk7CisKKyAgICBpZiggbWF0cml4UXggKQorICAgICAgICBjdkNvbnZlcnQoJlF4LCBtYXRyaXhReCk7CisgICAgaWYoIG1hdHJpeFF5ICkKKyAgICAgICAgY3ZDb252ZXJ0KCZReSwgbWF0cml4UXkpOworICAgIGlmKCBtYXRyaXhReiApCisgICAgICAgIGN2Q29udmVydCgmUXosIG1hdHJpeFF6KTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZEZWNvbXBvc2VQcm9qZWN0aW9uTWF0cml4KCBjb25zdCBDdk1hdCAqcHJvak1hdHIsIEN2TWF0ICpjYWxpYk1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpyb3RNYXRyLCBDdk1hdCAqcG9zVmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKnJvdE1hdHJYLCBDdk1hdCAqcm90TWF0clksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpyb3RNYXRyWiwgQ3ZQb2ludDNENjRmICpldWxlckFuZ2xlcykKK3sKKyAgICBDdk1hdCAqdG1wUHJvak1hdHIgPSAwOworICAgIEN2TWF0ICp0bXBNYXRyaXhEID0gMDsKKyAgICBDdk1hdCAqdG1wTWF0cml4ViA9IDA7CisgICAgQ3ZNYXQgKnRtcE1hdHJpeE0gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2RGVjb21wb3NlUHJvamVjdGlvbk1hdHJpeCIpOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIFZhbGlkYXRlIHBhcmFtZXRlcnMuICovCisgICAgaWYocHJvak1hdHIgPT0gMCB8fCBjYWxpYk1hdHIgPT0gMCB8fCByb3RNYXRyID09IDAgfHwgcG9zVmVjdCA9PSAwKQorICAgICAgICBDVl9FUlJPUihDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyISIpOworCisgICAgaWYoIUNWX0lTX01BVChwcm9qTWF0cikgfHwgIUNWX0lTX01BVChjYWxpYk1hdHIpIHx8ICFDVl9JU19NQVQocm90TWF0cikgfHwgIUNWX0lTX01BVChwb3NWZWN0KSkKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnB1dCBwYXJhbWV0ZXJzIG11c3QgYmUgYSBtYXRyaWNlcyEiKTsKKworICAgIGlmKHByb2pNYXRyLT5jb2xzICE9IDQgfHwgcHJvak1hdHItPnJvd3MgIT0gMykKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHByb2plY3Rpb24gbWF0cml4IG11c3QgYmUgM3g0ISIpOworCisgICAgaWYoY2FsaWJNYXRyLT5jb2xzICE9IDMgfHwgY2FsaWJNYXRyLT5yb3dzICE9IDMgfHwgcm90TWF0ci0+Y29scyAhPSAzIHx8IHJvdE1hdHItPnJvd3MgIT0gMykKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIGNhbGlicmF0aW9uIGFuZCByb3RhdGlvbiBtYXRyaWNlcyBtdXN0IGJlIDN4MyEiKTsKKworICAgIGlmKHBvc1ZlY3QtPmNvbHMgIT0gMSB8fCBwb3NWZWN0LT5yb3dzICE9IDQpCisgICAgICAgIENWX0VSUk9SKENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwb3NpdGlvbiB2ZWN0b3IgbXVzdCBiZSA0eDEhIik7CisKKyAgICBDVl9DQUxMKHRtcFByb2pNYXRyID0gY3ZDcmVhdGVNYXQoNCwgNCwgQ1ZfNjRGKSk7CisgICAgQ1ZfQ0FMTCh0bXBNYXRyaXhEID0gY3ZDcmVhdGVNYXQoNCwgNCwgQ1ZfNjRGKSk7CisgICAgQ1ZfQ0FMTCh0bXBNYXRyaXhWID0gY3ZDcmVhdGVNYXQoNCwgNCwgQ1ZfNjRGKSk7CisgICAgQ1ZfQ0FMTCh0bXBNYXRyaXhNID0gY3ZDcmVhdGVNYXQoMywgMywgQ1ZfNjRGKSk7CisKKyAgICAvKiBDb21wdXRlIHBvc2l0aW9uIHZlY3Rvci4gKi8KKworICAgIGN2U2V0WmVybyh0bXBQcm9qTWF0cik7IC8vIEFkZCB6ZXJvIHJvdyB0byBtYWtlIG1hdHJpeCBzcXVhcmUuCisgICAgaW50IGksIGs7CisgICAgZm9yKGkgPSAwOyBpIDwgMzsgaSsrKQorICAgICAgICBmb3IoayA9IDA7IGsgPCA0OyBrKyspCisgICAgICAgICAgICBjdm1TZXQodG1wUHJvak1hdHIsIGksIGssIGN2bUdldChwcm9qTWF0ciwgaSwgaykpOworCisgICAgQ1ZfQ0FMTChjdlNWRCh0bXBQcm9qTWF0ciwgdG1wTWF0cml4RCwgTlVMTCwgdG1wTWF0cml4ViwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1ZfVCkpOworCisgICAgLyogU2F2ZSBwb3NpdGlvbiB2ZWN0b3IuICovCisKKyAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCisgICAgICAgIGN2bVNldChwb3NWZWN0LCBpLCAwLCBjdm1HZXQodG1wTWF0cml4ViwgMywgaSkpOyAvLyBTb2x1dGlvbiBpcyBsYXN0IHJvdyBvZiBWLgorCisgICAgLyogQ29tcHV0ZSBjYWxpYnJhdGlvbiBhbmQgcm90YXRpb24gbWF0cmljZXMgdmlhIFJRIGRlY29tcG9zaXRpb24uICovCisKKyAgICBjdkdldENvbHMocHJvak1hdHIsIHRtcE1hdHJpeE0sIDAsIDMpOyAvLyBNIGlzIGZpcnN0IHNxdWFyZSBtYXRyaXggb2YgUC4KKworICAgIGFzc2VydChjdkRldCh0bXBNYXRyaXhNKSAhPSAwLjApOyAvLyBTbyBmYXIgb25seSBmaW5pdGUgY2FtZXJhcyBjb3VsZCBiZSBkZWNvbXBvc2VkLCBzbyBNIGhhcyB0byBiZSBub25zaW5ndWxhciBbZGV0KE0pICE9IDBdLgorCisgICAgQ1ZfQ0FMTChjdlJRRGVjb21wM3gzKHRtcE1hdHJpeE0sIGNhbGliTWF0ciwgcm90TWF0ciwgcm90TWF0clgsIHJvdE1hdHJZLCByb3RNYXRyWiwgZXVsZXJBbmdsZXMpKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoJnRtcFByb2pNYXRyKTsKKyAgICBjdlJlbGVhc2VNYXQoJnRtcE1hdHJpeEQpOworICAgIGN2UmVsZWFzZU1hdCgmdG1wTWF0cml4Vik7CisgICAgY3ZSZWxlYXNlTWF0KCZ0bXBNYXRyaXhNKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZoYWFyLmNwcCBiL2N2L3NyYy9jdmhhYXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2ZmE1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZoYWFyLmNwcApAQCAtMCwwICsxLDIzMjggQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKiBIYWFyIGZlYXR1cmVzIGNhbGN1bGF0aW9uICovCisKKyNpbmNsdWRlICJfY3YuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiB0aGVzZSBzZXR0aW5ncyBhZmZlY3QgdGhlIHF1YWxpdHkgb2YgZGV0ZWN0aW9uOiBjaGFuZ2Ugd2l0aCBjYXJlICovCisjZGVmaW5lIENWX0FESlVTVF9GRUFUVVJFUyAxCisjZGVmaW5lIENWX0FESlVTVF9XRUlHSFRTICAwCisKK3R5cGVkZWYgaW50IHN1bXR5cGU7Cit0eXBlZGVmIGRvdWJsZSBzcXN1bXR5cGU7CisKK3R5cGVkZWYgc3RydWN0IEN2SGlkSGFhckZlYXR1cmUKK3sKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIHN1bXR5cGUgKnAwLCAqcDEsICpwMiwgKnAzOworICAgICAgICBmbG9hdCB3ZWlnaHQ7CisgICAgfQorICAgIHJlY3RbQ1ZfSEFBUl9GRUFUVVJFX01BWF07Cit9CitDdkhpZEhhYXJGZWF0dXJlOworCisKK3R5cGVkZWYgc3RydWN0IEN2SGlkSGFhclRyZWVOb2RlCit7CisgICAgQ3ZIaWRIYWFyRmVhdHVyZSBmZWF0dXJlOworICAgIGZsb2F0IHRocmVzaG9sZDsKKyAgICBpbnQgbGVmdDsKKyAgICBpbnQgcmlnaHQ7Cit9CitDdkhpZEhhYXJUcmVlTm9kZTsKKworCit0eXBlZGVmIHN0cnVjdCBDdkhpZEhhYXJDbGFzc2lmaWVyCit7CisgICAgaW50IGNvdW50OworICAgIC8vQ3ZIYWFyRmVhdHVyZSogb3JpZ19mZWF0dXJlOworICAgIEN2SGlkSGFhclRyZWVOb2RlKiBub2RlOworICAgIGZsb2F0KiBhbHBoYTsKK30KK0N2SGlkSGFhckNsYXNzaWZpZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyCit7CisgICAgaW50ICBjb3VudDsKKyAgICBmbG9hdCB0aHJlc2hvbGQ7CisgICAgQ3ZIaWRIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllcjsKKyAgICBpbnQgdHdvX3JlY3RzOworCisgICAgc3RydWN0IEN2SGlkSGFhclN0YWdlQ2xhc3NpZmllciogbmV4dDsKKyAgICBzdHJ1Y3QgQ3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKiBjaGlsZDsKKyAgICBzdHJ1Y3QgQ3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKiBwYXJlbnQ7Cit9CitDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXI7CisKKworc3RydWN0IEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlCit7CisgICAgaW50ICBjb3VudDsKKyAgICBpbnQgIGlzX3N0dW1wX2Jhc2VkOworICAgIGludCAgaGFzX3RpbHRlZF9mZWF0dXJlczsKKyAgICBpbnQgIGlzX3RyZWU7CisgICAgZG91YmxlIGludl93aW5kb3dfYXJlYTsKKyAgICBDdk1hdCBzdW0sIHNxc3VtLCB0aWx0ZWQ7CisgICAgQ3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKiBzdGFnZV9jbGFzc2lmaWVyOworICAgIHNxc3VtdHlwZSAqcHEwLCAqcHExLCAqcHEyLCAqcHEzOworICAgIHN1bXR5cGUgKnAwLCAqcDEsICpwMiwgKnAzOworCisgICAgdm9pZCoqIGlwcF9zdGFnZXM7Cit9OworCisKKy8qIElQUCBmdW5jdGlvbnMgZm9yIG9iamVjdCBkZXRlY3Rpb24gKi8KK2ljdkhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZl90IGljdkhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZl9wID0gMDsKK2ljdkhhYXJDbGFzc2lmaWVyRnJlZV8zMmZfdCBpY3ZIYWFyQ2xhc3NpZmllckZyZWVfMzJmX3AgPSAwOworaWN2QXBwbHlIYWFyQ2xhc3NpZmllcl8zMmZfQzFSX3QgaWN2QXBwbHlIYWFyQ2xhc3NpZmllcl8zMmZfQzFSX3AgPSAwOworaWN2UmVjdFN0ZERldl8zMmZfQzFSX3QgaWN2UmVjdFN0ZERldl8zMmZfQzFSX3AgPSAwOworCitjb25zdCBpbnQgaWN2X29iamVjdF93aW5fYm9yZGVyID0gMTsKK2NvbnN0IGZsb2F0IGljdl9zdGFnZV90aHJlc2hvbGRfYmlhcyA9IDAuMDAwMWY7CisKK3N0YXRpYyBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSoKK2ljdkNyZWF0ZUhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggaW50IHN0YWdlX2NvdW50ICkKK3sKKyAgICBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNyZWF0ZUhhYXJDbGFzc2lmaWVyQ2FzY2FkZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBibG9ja19zaXplID0gc2l6ZW9mKCpjYXNjYWRlKSArIHN0YWdlX2NvdW50KnNpemVvZigqY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcik7CisKKyAgICBpZiggc3RhZ2VfY291bnQgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIHN0YWdlcyBzaG91bGQgYmUgcG9zaXRpdmUiICk7CisKKyAgICBDVl9DQUxMKCBjYXNjYWRlID0gKEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiljdkFsbG9jKCBibG9ja19zaXplICkpOworICAgIG1lbXNldCggY2FzY2FkZSwgMCwgYmxvY2tfc2l6ZSApOworCisgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllciA9IChDdkhhYXJTdGFnZUNsYXNzaWZpZXIqKShjYXNjYWRlICsgMSk7CisgICAgY2FzY2FkZS0+ZmxhZ3MgPSBDVl9IQUFSX01BR0lDX1ZBTDsKKyAgICBjYXNjYWRlLT5jb3VudCA9IHN0YWdlX2NvdW50OworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjYXNjYWRlOworfQorCitzdGF0aWMgdm9pZAoraWN2UmVsZWFzZUhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggQ3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKiBfY2FzY2FkZSApCit7CisgICAgaWYoIF9jYXNjYWRlICYmICpfY2FzY2FkZSApCisgICAgeworICAgICAgICBDdkhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSA9ICpfY2FzY2FkZTsKKyAgICAgICAgaWYoIGNhc2NhZGUtPmlwcF9zdGFnZXMgJiYgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZl9wICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FzY2FkZS0+Y291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGNhc2NhZGUtPmlwcF9zdGFnZXNbaV0gKQorICAgICAgICAgICAgICAgICAgICBpY3ZIYWFyQ2xhc3NpZmllckZyZWVfMzJmX3AoIGNhc2NhZGUtPmlwcF9zdGFnZXNbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjdkZyZWUoICZjYXNjYWRlLT5pcHBfc3RhZ2VzICk7CisgICAgICAgIGN2RnJlZSggX2Nhc2NhZGUgKTsKKyAgICB9Cit9CisKKy8qIGNyZWF0ZSBtb3JlIGVmZmljaWVudCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBoYWFyIGNsYXNzaWZpZXIgY2FzY2FkZSAqLworc3RhdGljIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKgoraWN2Q3JlYXRlSGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSApCit7CisgICAgQ3ZSZWN0KiBpcHBfZmVhdHVyZXMgPSAwOworICAgIGZsb2F0ICppcHBfd2VpZ2h0cyA9IDAsICppcHBfdGhyZXNob2xkcyA9IDAsICppcHBfdmFsMSA9IDAsICppcHBfdmFsMiA9IDA7CisgICAgaW50KiBpcHBfY291bnRzID0gMDsKKworICAgIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBvdXQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDcmVhdGVIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiwgaywgbDsKKyAgICBpbnQgZGF0YXNpemU7CisgICAgaW50IHRvdGFsX2NsYXNzaWZpZXJzID0gMDsKKyAgICBpbnQgdG90YWxfbm9kZXMgPSAwOworICAgIGNoYXIgZXJyb3JzdHJbMTAwXTsKKyAgICBDdkhpZEhhYXJDbGFzc2lmaWVyKiBoYWFyX2NsYXNzaWZpZXJfcHRyOworICAgIEN2SGlkSGFhclRyZWVOb2RlKiBoYWFyX25vZGVfcHRyOworICAgIEN2U2l6ZSBvcmlnX3dpbmRvd19zaXplOworICAgIGludCBoYXNfdGlsdGVkX2ZlYXR1cmVzID0gMDsKKyAgICBpbnQgbWF4X2NvdW50ID0gMDsKKworICAgIGlmKCAhQ1ZfSVNfSEFBUl9DTEFTU0lGSUVSKGNhc2NhZGUpICkKKyAgICAgICAgQ1ZfRVJST1IoICFjYXNjYWRlID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywgIkludmFsaWQgY2xhc3NpZmllciBwb2ludGVyIiApOworCisgICAgaWYoIGNhc2NhZGUtPmhpZF9jYXNjYWRlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiaGlkX2Nhc2NhZGUgaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkIiApOworCisgICAgaWYoICFjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggY2FzY2FkZS0+Y291bnQgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTmVnYXRpdmUgbnVtYmVyIG9mIGNhc2NhZGUgc3RhZ2VzIiApOworCisgICAgb3JpZ193aW5kb3dfc2l6ZSA9IGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemU7CisKKyAgICAvKiBjaGVjayBpbnB1dCBzdHJ1Y3R1cmUgY29ycmVjdG5lc3MgYW5kIGNhbGN1bGF0ZSB0b3RhbCBtZW1vcnkgc2l6ZSBuZWVkZWQgZm9yCisgICAgICAgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzaWZpZXIgY2FzY2FkZSAqLworICAgIGZvciggaSA9IDA7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2SGFhclN0YWdlQ2xhc3NpZmllciogc3RhZ2VfY2xhc3NpZmllciA9IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXIgKyBpOworCisgICAgICAgIGlmKCAhc3RhZ2VfY2xhc3NpZmllci0+Y2xhc3NpZmllciB8fAorICAgICAgICAgICAgc3RhZ2VfY2xhc3NpZmllci0+Y291bnQgPD0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIGVycm9yc3RyLCAiaGVhZGVyIG9mIHRoZSBzdGFnZSBjbGFzc2lmaWVyICMlZCBpcyBpbnZhbGlkICIKKyAgICAgICAgICAgICAgICAgICAgICIoaGFzIG51bGwgcG9pbnRlcnMgb3Igbm9uLXBvc2l0aXZlIGNsYXNzZmllciBjb3VudCkiLCBpICk7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGVycm9yc3RyICk7CisgICAgICAgIH0KKworICAgICAgICBtYXhfY291bnQgPSBNQVgoIG1heF9jb3VudCwgc3RhZ2VfY2xhc3NpZmllci0+Y291bnQgKTsKKyAgICAgICAgdG90YWxfY2xhc3NpZmllcnMgKz0gc3RhZ2VfY2xhc3NpZmllci0+Y291bnQ7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHN0YWdlX2NsYXNzaWZpZXItPmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0gc3RhZ2VfY2xhc3NpZmllci0+Y2xhc3NpZmllciArIGo7CisKKyAgICAgICAgICAgIHRvdGFsX25vZGVzICs9IGNsYXNzaWZpZXItPmNvdW50OworICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IGNsYXNzaWZpZXItPmNvdW50OyBsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBDVl9IQUFSX0ZFQVRVUkVfTUFYOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS5yZWN0W2tdLnIud2lkdGggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgciA9IGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS5yZWN0W2tdLnI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsdGVkID0gY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2xdLnRpbHRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc190aWx0ZWRfZmVhdHVyZXMgfD0gdGlsdGVkICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggci53aWR0aCA8IDAgfHwgci5oZWlnaHQgPCAwIHx8IHIueSA8IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnggKyByLndpZHRoID4gb3JpZ193aW5kb3dfc2l6ZS53aWR0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCF0aWx0ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci54IDwgMCB8fCByLnkgKyByLmhlaWdodCA+IG9yaWdfd2luZG93X3NpemUuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aWx0ZWQgJiYgKHIueCAtIHIuaGVpZ2h0IDwgMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueSArIHIud2lkdGggKyByLmhlaWdodCA+IG9yaWdfd2luZG93X3NpemUuaGVpZ2h0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggZXJyb3JzdHIsICJyZWN0YW5nbGUgIyVkIG9mIHRoZSBjbGFzc2lmaWVyICMlZCBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBzdGFnZSBjbGFzc2lmaWVyICMlZCBpcyBub3QgaW5zaWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHJlZmVyZW5jZSAob3JpZ2luYWwpIGNhc2NhZGUgd2luZG93IiwgaywgaiwgaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCBlcnJvcnN0ciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyBhbiB1cHBlciBib3VuZGFyeSBmb3IgdGhlIHdob2xlIGhpZGRlbiBjYXNjYWRlIHNpemUKKyAgICBkYXRhc2l6ZSA9IHNpemVvZihDdkhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSkgKworICAgICAgICAgICAgICAgc2l6ZW9mKEN2SGlkSGFhclN0YWdlQ2xhc3NpZmllcikqY2FzY2FkZS0+Y291bnQgKworICAgICAgICAgICAgICAgc2l6ZW9mKEN2SGlkSGFhckNsYXNzaWZpZXIpICogdG90YWxfY2xhc3NpZmllcnMgKworICAgICAgICAgICAgICAgc2l6ZW9mKEN2SGlkSGFhclRyZWVOb2RlKSAqIHRvdGFsX25vZGVzICsKKyAgICAgICAgICAgICAgIHNpemVvZih2b2lkKikqKHRvdGFsX25vZGVzICsgdG90YWxfY2xhc3NpZmllcnMpOworCisgICAgQ1ZfQ0FMTCggb3V0ID0gKEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiljdkFsbG9jKCBkYXRhc2l6ZSApKTsKKyAgICBtZW1zZXQoIG91dCwgMCwgc2l6ZW9mKCpvdXQpICk7CisKKyAgICAvKiBpbml0IGhlYWRlciAqLworICAgIG91dC0+Y291bnQgPSBjYXNjYWRlLT5jb3VudDsKKyAgICBvdXQtPnN0YWdlX2NsYXNzaWZpZXIgPSAoQ3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKikob3V0ICsgMSk7CisgICAgaGFhcl9jbGFzc2lmaWVyX3B0ciA9IChDdkhpZEhhYXJDbGFzc2lmaWVyKikob3V0LT5zdGFnZV9jbGFzc2lmaWVyICsgY2FzY2FkZS0+Y291bnQpOworICAgIGhhYXJfbm9kZV9wdHIgPSAoQ3ZIaWRIYWFyVHJlZU5vZGUqKShoYWFyX2NsYXNzaWZpZXJfcHRyICsgdG90YWxfY2xhc3NpZmllcnMpOworCisgICAgb3V0LT5pc19zdHVtcF9iYXNlZCA9IDE7CisgICAgb3V0LT5oYXNfdGlsdGVkX2ZlYXR1cmVzID0gaGFzX3RpbHRlZF9mZWF0dXJlczsKKyAgICBvdXQtPmlzX3RyZWUgPSAwOworCisgICAgLyogaW5pdGlhbGl6ZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiAqLworICAgIGZvciggaSA9IDA7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2SGFhclN0YWdlQ2xhc3NpZmllciogc3RhZ2VfY2xhc3NpZmllciA9IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXIgKyBpOworICAgICAgICBDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIqIGhpZF9zdGFnZV9jbGFzc2lmaWVyID0gb3V0LT5zdGFnZV9jbGFzc2lmaWVyICsgaTsKKworICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+Y291bnQgPSBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsKKyAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPnRocmVzaG9sZCA9IHN0YWdlX2NsYXNzaWZpZXItPnRocmVzaG9sZCAtIGljdl9zdGFnZV90aHJlc2hvbGRfYmlhczsKKyAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPmNsYXNzaWZpZXIgPSBoYWFyX2NsYXNzaWZpZXJfcHRyOworICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+dHdvX3JlY3RzID0gMTsKKyAgICAgICAgaGFhcl9jbGFzc2lmaWVyX3B0ciArPSBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsKKworICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+cGFyZW50ID0gKHN0YWdlX2NsYXNzaWZpZXItPnBhcmVudCA9PSAtMSkKKyAgICAgICAgICAgID8gTlVMTCA6IG91dC0+c3RhZ2VfY2xhc3NpZmllciArIHN0YWdlX2NsYXNzaWZpZXItPnBhcmVudDsKKyAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPm5leHQgPSAoc3RhZ2VfY2xhc3NpZmllci0+bmV4dCA9PSAtMSkKKyAgICAgICAgICAgID8gTlVMTCA6IG91dC0+c3RhZ2VfY2xhc3NpZmllciArIHN0YWdlX2NsYXNzaWZpZXItPm5leHQ7CisgICAgICAgIGhpZF9zdGFnZV9jbGFzc2lmaWVyLT5jaGlsZCA9IChzdGFnZV9jbGFzc2lmaWVyLT5jaGlsZCA9PSAtMSkKKyAgICAgICAgICAgID8gTlVMTCA6IG91dC0+c3RhZ2VfY2xhc3NpZmllciArIHN0YWdlX2NsYXNzaWZpZXItPmNoaWxkOworCisgICAgICAgIG91dC0+aXNfdHJlZSB8PSBoaWRfc3RhZ2VfY2xhc3NpZmllci0+bmV4dCAhPSBOVUxMOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9IHN0YWdlX2NsYXNzaWZpZXItPmNsYXNzaWZpZXIgKyBqOworICAgICAgICAgICAgQ3ZIaWRIYWFyQ2xhc3NpZmllciogaGlkX2NsYXNzaWZpZXIgPSBoaWRfc3RhZ2VfY2xhc3NpZmllci0+Y2xhc3NpZmllciArIGo7CisgICAgICAgICAgICBpbnQgbm9kZV9jb3VudCA9IGNsYXNzaWZpZXItPmNvdW50OworICAgICAgICAgICAgZmxvYXQqIGFscGhhX3B0ciA9IChmbG9hdCopKGhhYXJfbm9kZV9wdHIgKyBub2RlX2NvdW50KTsKKworICAgICAgICAgICAgaGlkX2NsYXNzaWZpZXItPmNvdW50ID0gbm9kZV9jb3VudDsKKyAgICAgICAgICAgIGhpZF9jbGFzc2lmaWVyLT5ub2RlID0gaGFhcl9ub2RlX3B0cjsKKyAgICAgICAgICAgIGhpZF9jbGFzc2lmaWVyLT5hbHBoYSA9IGFscGhhX3B0cjsKKworICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IG5vZGVfY291bnQ7IGwrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZIaWRIYWFyVHJlZU5vZGUqIG5vZGUgPSBoaWRfY2xhc3NpZmllci0+bm9kZSArIGw7CisgICAgICAgICAgICAgICAgQ3ZIYWFyRmVhdHVyZSogZmVhdHVyZSA9IGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZSArIGw7CisgICAgICAgICAgICAgICAgbWVtc2V0KCBub2RlLCAtMSwgc2l6ZW9mKCpub2RlKSApOworICAgICAgICAgICAgICAgIG5vZGUtPnRocmVzaG9sZCA9IGNsYXNzaWZpZXItPnRocmVzaG9sZFtsXTsKKyAgICAgICAgICAgICAgICBub2RlLT5sZWZ0ID0gY2xhc3NpZmllci0+bGVmdFtsXTsKKyAgICAgICAgICAgICAgICBub2RlLT5yaWdodCA9IGNsYXNzaWZpZXItPnJpZ2h0W2xdOworCisgICAgICAgICAgICAgICAgaWYoIGZhYnMoZmVhdHVyZS0+cmVjdFsyXS53ZWlnaHQpIDwgREJMX0VQU0lMT04gfHwKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS0+cmVjdFsyXS5yLndpZHRoID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZS0+cmVjdFsyXS5yLmhlaWdodCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCAmKG5vZGUtPmZlYXR1cmUucmVjdFsyXSksIDAsIHNpemVvZihub2RlLT5mZWF0dXJlLnJlY3RbMl0pICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+dHdvX3JlY3RzID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtY3B5KCBhbHBoYV9wdHIsIGNsYXNzaWZpZXItPmFscGhhLCAobm9kZV9jb3VudCsxKSpzaXplb2YoYWxwaGFfcHRyWzBdKSk7CisgICAgICAgICAgICBoYWFyX25vZGVfcHRyID0KKyAgICAgICAgICAgICAgICAoQ3ZIaWRIYWFyVHJlZU5vZGUqKWN2QWxpZ25QdHIoYWxwaGFfcHRyK25vZGVfY291bnQrMSwgc2l6ZW9mKHZvaWQqKSk7CisKKyAgICAgICAgICAgIG91dC0+aXNfc3R1bXBfYmFzZWQgJj0gbm9kZV9jb3VudCA9PSAxOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgIGludCBjYW5fdXNlX2lwcCA9IGljdkhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZl9wICE9IDAgJiYKKyAgICAgICAgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZl9wICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICBpY3ZBcHBseUhhYXJDbGFzc2lmaWVyXzMyZl9DMVJfcCAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgaWN2UmVjdFN0ZERldl8zMmZfQzFSX3AgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICFvdXQtPmhhc190aWx0ZWRfZmVhdHVyZXMgJiYgIW91dC0+aXNfdHJlZSAmJiBvdXQtPmlzX3N0dW1wX2Jhc2VkOworCisgICAgaWYoIGNhbl91c2VfaXBwICkKKyAgICB7CisgICAgICAgIGludCBpcHBfZGF0YXNpemUgPSBjYXNjYWRlLT5jb3VudCpzaXplb2Yob3V0LT5pcHBfc3RhZ2VzWzBdKTsKKyAgICAgICAgZmxvYXQgaXBwX3dlaWdodF9zY2FsZT0oZmxvYXQpKDEuLygob3JpZ193aW5kb3dfc2l6ZS53aWR0aC1pY3Zfb2JqZWN0X3dpbl9ib3JkZXIqMikqCisgICAgICAgICAgICAob3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQtaWN2X29iamVjdF93aW5fYm9yZGVyKjIpKSk7CisKKyAgICAgICAgQ1ZfQ0FMTCggb3V0LT5pcHBfc3RhZ2VzID0gKHZvaWQqKiljdkFsbG9jKCBpcHBfZGF0YXNpemUgKSk7CisgICAgICAgIG1lbXNldCggb3V0LT5pcHBfc3RhZ2VzLCAwLCBpcHBfZGF0YXNpemUgKTsKKworICAgICAgICBDVl9DQUxMKCBpcHBfZmVhdHVyZXMgPSAoQ3ZSZWN0KiljdkFsbG9jKCBtYXhfY291bnQqMypzaXplb2YoaXBwX2ZlYXR1cmVzWzBdKSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggaXBwX3dlaWdodHMgPSAoZmxvYXQqKWN2QWxsb2MoIG1heF9jb3VudCozKnNpemVvZihpcHBfd2VpZ2h0c1swXSkgKSk7CisgICAgICAgIENWX0NBTEwoIGlwcF90aHJlc2hvbGRzID0gKGZsb2F0KiljdkFsbG9jKCBtYXhfY291bnQqc2l6ZW9mKGlwcF90aHJlc2hvbGRzWzBdKSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggaXBwX3ZhbDEgPSAoZmxvYXQqKWN2QWxsb2MoIG1heF9jb3VudCpzaXplb2YoaXBwX3ZhbDFbMF0pICkpOworICAgICAgICBDVl9DQUxMKCBpcHBfdmFsMiA9IChmbG9hdCopY3ZBbGxvYyggbWF4X2NvdW50KnNpemVvZihpcHBfdmFsMlswXSkgKSk7CisgICAgICAgIENWX0NBTEwoIGlwcF9jb3VudHMgPSAoaW50KiljdkFsbG9jKCBtYXhfY291bnQqc2l6ZW9mKGlwcF9jb3VudHNbMF0pICkpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZIYWFyU3RhZ2VDbGFzc2lmaWVyKiBzdGFnZV9jbGFzc2lmaWVyID0gY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllciArIGk7CisgICAgICAgICAgICBmb3IoIGogPSAwLCBrID0gMDsgaiA8IHN0YWdlX2NsYXNzaWZpZXItPmNvdW50OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2SGFhckNsYXNzaWZpZXIqIGNsYXNzaWZpZXIgPSBzdGFnZV9jbGFzc2lmaWVyLT5jbGFzc2lmaWVyICsgajsKKyAgICAgICAgICAgICAgICBpbnQgcmVjdF9jb3VudCA9IDIgKyAoY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlLT5yZWN0WzJdLnIud2lkdGggIT0gMCk7CisKKyAgICAgICAgICAgICAgICBpcHBfdGhyZXNob2xkc1tqXSA9IGNsYXNzaWZpZXItPnRocmVzaG9sZFswXTsKKyAgICAgICAgICAgICAgICBpcHBfdmFsMVtqXSA9IGNsYXNzaWZpZXItPmFscGhhWzBdOworICAgICAgICAgICAgICAgIGlwcF92YWwyW2pdID0gY2xhc3NpZmllci0+YWxwaGFbMV07CisgICAgICAgICAgICAgICAgaXBwX2NvdW50c1tqXSA9IHJlY3RfY291bnQ7CisKKyAgICAgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgcmVjdF9jb3VudDsgbCsrLCBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXBwX2ZlYXR1cmVzW2tdID0gY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlLT5yZWN0W2xdLnI7CisgICAgICAgICAgICAgICAgICAgIC8vaXBwX2ZlYXR1cmVzW2tdLnkgPSBvcmlnX3dpbmRvd19zaXplLmhlaWdodCAtIGlwcF9mZWF0dXJlc1trXS55IC0gaXBwX2ZlYXR1cmVzW2tdLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaXBwX3dlaWdodHNba10gPSBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUtPnJlY3RbbF0ud2VpZ2h0KmlwcF93ZWlnaHRfc2NhbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggaWN2SGFhckNsYXNzaWZpZXJJbml0QWxsb2NfMzJmX3AoICZvdXQtPmlwcF9zdGFnZXNbaV0sCisgICAgICAgICAgICAgICAgaXBwX2ZlYXR1cmVzLCBpcHBfd2VpZ2h0cywgaXBwX3RocmVzaG9sZHMsCisgICAgICAgICAgICAgICAgaXBwX3ZhbDEsIGlwcF92YWwyLCBpcHBfY291bnRzLCBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudCApIDwgMCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggaSA8IGNhc2NhZGUtPmNvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGk7IGorKyApCisgICAgICAgICAgICAgICAgaWYoIGljdkhhYXJDbGFzc2lmaWVyRnJlZV8zMmZfcCAmJiBvdXQtPmlwcF9zdGFnZXNbaV0gKQorICAgICAgICAgICAgICAgICAgICBpY3ZIYWFyQ2xhc3NpZmllckZyZWVfMzJmX3AoIG91dC0+aXBwX3N0YWdlc1tpXSApOworICAgICAgICAgICAgY3ZGcmVlKCAmb3V0LT5pcHBfc3RhZ2VzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgY2FzY2FkZS0+aGlkX2Nhc2NhZGUgPSBvdXQ7CisgICAgYXNzZXJ0KCAoY2hhciopaGFhcl9ub2RlX3B0ciAtIChjaGFyKilvdXQgPD0gZGF0YXNpemUgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBpY3ZSZWxlYXNlSGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKCAmb3V0ICk7CisKKyAgICBjdkZyZWUoICZpcHBfZmVhdHVyZXMgKTsKKyAgICBjdkZyZWUoICZpcHBfd2VpZ2h0cyApOworICAgIGN2RnJlZSggJmlwcF90aHJlc2hvbGRzICk7CisgICAgY3ZGcmVlKCAmaXBwX3ZhbDEgKTsKKyAgICBjdkZyZWUoICZpcHBfdmFsMiApOworICAgIGN2RnJlZSggJmlwcF9jb3VudHMgKTsKKworICAgIHJldHVybiBvdXQ7Cit9CisKKworI2RlZmluZSBzdW1fZWxlbV9wdHIoc3VtLHJvdyxjb2wpICBcCisgICAgKChzdW10eXBlKilDVl9NQVRfRUxFTV9QVFJfRkFTVCgoc3VtKSwocm93KSwoY29sKSxzaXplb2Yoc3VtdHlwZSkpKQorCisjZGVmaW5lIHNxc3VtX2VsZW1fcHRyKHNxc3VtLHJvdyxjb2wpICBcCisgICAgKChzcXN1bXR5cGUqKUNWX01BVF9FTEVNX1BUUl9GQVNUKChzcXN1bSksKHJvdyksKGNvbCksc2l6ZW9mKHNxc3VtdHlwZSkpKQorCisjZGVmaW5lIGNhbGNfc3VtKHJlY3Qsb2Zmc2V0KSBcCisgICAgKChyZWN0KS5wMFtvZmZzZXRdIC0gKHJlY3QpLnAxW29mZnNldF0gLSAocmVjdCkucDJbb2Zmc2V0XSArIChyZWN0KS5wM1tvZmZzZXRdKQorCisKK0NWX0lNUEwgdm9pZAorY3ZTZXRJbWFnZXNGb3JIYWFyQ2xhc3NpZmllckNhc2NhZGUoIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiBfY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogX3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogX3Nxc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBfdGlsdGVkX3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUgKQoreworICAgIENWX0ZVTkNOQU1FKCJjdlNldEltYWdlc0ZvckhhYXJDbGFzc2lmaWVyQ2FzY2FkZSIpOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3VtX3N0dWIsICpzdW0gPSAoQ3ZNYXQqKV9zdW07CisgICAgQ3ZNYXQgc3FzdW1fc3R1YiwgKnNxc3VtID0gKEN2TWF0Kilfc3FzdW07CisgICAgQ3ZNYXQgdGlsdGVkX3N0dWIsICp0aWx0ZWQgPSAoQ3ZNYXQqKV90aWx0ZWRfc3VtOworICAgIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBjYXNjYWRlOworICAgIGludCBjb2kwID0gMCwgY29pMSA9IDA7CisgICAgaW50IGk7CisgICAgQ3ZSZWN0IGVxdV9yZWN0OworICAgIGRvdWJsZSB3ZWlnaHRfc2NhbGU7CisKKyAgICBpZiggIUNWX0lTX0hBQVJfQ0xBU1NJRklFUihfY2FzY2FkZSkgKQorICAgICAgICBDVl9FUlJPUiggIV9jYXNjYWRlID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywgIkludmFsaWQgY2xhc3NpZmllciBwb2ludGVyIiApOworCisgICAgaWYoIHNjYWxlIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNjYWxlIG11c3QgYmUgcG9zaXRpdmUiICk7CisKKyAgICBDVl9DQUxMKCBzdW0gPSBjdkdldE1hdCggc3VtLCAmc3VtX3N0dWIsICZjb2kwICkpOworICAgIENWX0NBTEwoIHNxc3VtID0gY3ZHZXRNYXQoIHNxc3VtLCAmc3FzdW1fc3R1YiwgJmNvaTEgKSk7CisKKyAgICBpZiggY29pMCB8fCBjb2kxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIkNPSSBpcyBub3Qgc3VwcG9ydGVkIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHN1bSwgc3FzdW0gKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQWxsIGludGVncmFsIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcXN1bS0+dHlwZSkgIT0gQ1ZfNjRGQzEgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoc3VtLT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIk9ubHkgKDMycywgNjRmLCAzMnMpIGNvbWJpbmF0aW9uIG9mIChzdW0sc3FzdW0sdGlsdGVkX3N1bSkgZm9ybWF0cyBpcyBhbGxvd2VkIiApOworCisgICAgaWYoICFfY2FzY2FkZS0+aGlkX2Nhc2NhZGUgKQorICAgICAgICBDVl9DQUxMKCBpY3ZDcmVhdGVIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUoX2Nhc2NhZGUpICk7CisKKyAgICBjYXNjYWRlID0gX2Nhc2NhZGUtPmhpZF9jYXNjYWRlOworCisgICAgaWYoIGNhc2NhZGUtPmhhc190aWx0ZWRfZmVhdHVyZXMgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggdGlsdGVkID0gY3ZHZXRNYXQoIHRpbHRlZCwgJnRpbHRlZF9zdHViLCAmY29pMSApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUodGlsdGVkLT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAiT25seSAoMzJzLCA2NGYsIDMycykgY29tYmluYXRpb24gb2YgKHN1bSxzcXN1bSx0aWx0ZWRfc3VtKSBmb3JtYXRzIGlzIGFsbG93ZWQiICk7CisKKyAgICAgICAgaWYoIHN1bS0+c3RlcCAhPSB0aWx0ZWQtPnN0ZXAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgIlN1bSBhbmQgdGlsdGVkX3N1bSBtdXN0IGhhdmUgdGhlIHNhbWUgc3RyaWRlIChzdGVwLCB3aWR0aFN0ZXApIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzdW0sIHRpbHRlZCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQWxsIGludGVncmFsIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIgKTsKKyAgICAgICAgY2FzY2FkZS0+dGlsdGVkID0gKnRpbHRlZDsKKyAgICB9CisKKyAgICBfY2FzY2FkZS0+c2NhbGUgPSBzY2FsZTsKKyAgICBfY2FzY2FkZS0+cmVhbF93aW5kb3dfc2l6ZS53aWR0aCA9IGN2Um91bmQoIF9jYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLndpZHRoICogc2NhbGUgKTsKKyAgICBfY2FzY2FkZS0+cmVhbF93aW5kb3dfc2l6ZS5oZWlnaHQgPSBjdlJvdW5kKCBfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQgKiBzY2FsZSApOworCisgICAgY2FzY2FkZS0+c3VtID0gKnN1bTsKKyAgICBjYXNjYWRlLT5zcXN1bSA9ICpzcXN1bTsKKworICAgIGVxdV9yZWN0LnggPSBlcXVfcmVjdC55ID0gY3ZSb3VuZChzY2FsZSk7CisgICAgZXF1X3JlY3Qud2lkdGggPSBjdlJvdW5kKChfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS53aWR0aC0yKSpzY2FsZSk7CisgICAgZXF1X3JlY3QuaGVpZ2h0ID0gY3ZSb3VuZCgoX2Nhc2NhZGUtPm9yaWdfd2luZG93X3NpemUuaGVpZ2h0LTIpKnNjYWxlKTsKKyAgICB3ZWlnaHRfc2NhbGUgPSAxLi8oZXF1X3JlY3Qud2lkdGgqZXF1X3JlY3QuaGVpZ2h0KTsKKyAgICBjYXNjYWRlLT5pbnZfd2luZG93X2FyZWEgPSB3ZWlnaHRfc2NhbGU7CisKKyAgICBjYXNjYWRlLT5wMCA9IHN1bV9lbGVtX3B0cigqc3VtLCBlcXVfcmVjdC55LCBlcXVfcmVjdC54KTsKKyAgICBjYXNjYWRlLT5wMSA9IHN1bV9lbGVtX3B0cigqc3VtLCBlcXVfcmVjdC55LCBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGggKTsKKyAgICBjYXNjYWRlLT5wMiA9IHN1bV9lbGVtX3B0cigqc3VtLCBlcXVfcmVjdC55ICsgZXF1X3JlY3QuaGVpZ2h0LCBlcXVfcmVjdC54ICk7CisgICAgY2FzY2FkZS0+cDMgPSBzdW1fZWxlbV9wdHIoKnN1bSwgZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGggKTsKKworICAgIGNhc2NhZGUtPnBxMCA9IHNxc3VtX2VsZW1fcHRyKCpzcXN1bSwgZXF1X3JlY3QueSwgZXF1X3JlY3QueCk7CisgICAgY2FzY2FkZS0+cHExID0gc3FzdW1fZWxlbV9wdHIoKnNxc3VtLCBlcXVfcmVjdC55LCBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGggKTsKKyAgICBjYXNjYWRlLT5wcTIgPSBzcXN1bV9lbGVtX3B0cigqc3FzdW0sIGVxdV9yZWN0LnkgKyBlcXVfcmVjdC5oZWlnaHQsIGVxdV9yZWN0LnggKTsKKyAgICBjYXNjYWRlLT5wcTMgPSBzcXN1bV9lbGVtX3B0cigqc3FzdW0sIGVxdV9yZWN0LnkgKyBlcXVfcmVjdC5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGggKTsKKworICAgIC8qIGluaXQgcG9pbnRlcnMgaW4gaGFhciBmZWF0dXJlcyBhY2NvcmRpbmcgdG8gcmVhbCB3aW5kb3cgc2l6ZSBhbmQKKyAgICAgICBnaXZlbiBpbWFnZSBwb2ludGVycyAqLworICAgIHsKKyNpZmRlZiBfT1BFTk1QCisgICAgaW50IG1heF90aHJlYWRzID0gY3ZHZXROdW1UaHJlYWRzKCk7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKG1heF90aHJlYWRzKSBzY2hlZHVsZShkeW5hbWljKQorI2VuZGlmIC8vIF9PUEVOTVAKKyAgICBmb3IoIGkgPSAwOyBpIDwgX2Nhc2NhZGUtPmNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGosIGssIGw7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyW2pdLmNvdW50OyBsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2SGFhckZlYXR1cmUqIGZlYXR1cmUgPQorICAgICAgICAgICAgICAgICAgICAmX2Nhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllcltqXS5oYWFyX2ZlYXR1cmVbbF07CisgICAgICAgICAgICAgICAgLyogQ3ZIaWRIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9CisgICAgICAgICAgICAgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciArIGo7ICovCisgICAgICAgICAgICAgICAgQ3ZIaWRIYWFyRmVhdHVyZSogaGlkZmVhdHVyZSA9CisgICAgICAgICAgICAgICAgICAgICZjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXJbal0ubm9kZVtsXS5mZWF0dXJlOworICAgICAgICAgICAgICAgIGRvdWJsZSBzdW0wID0gMCwgYXJlYTAgPSAwOworICAgICAgICAgICAgICAgIEN2UmVjdCByWzNdOworI2lmIENWX0FESlVTVF9GRUFUVVJFUworICAgICAgICAgICAgICAgIGludCBiYXNlX3cgPSAtMSwgYmFzZV9oID0gLTE7CisgICAgICAgICAgICAgICAgaW50IG5ld19iYXNlX3cgPSAwLCBuZXdfYmFzZV9oID0gMDsKKyAgICAgICAgICAgICAgICBpbnQga3gsIGt5OworICAgICAgICAgICAgICAgIGludCBmbGFneCA9IDAsIGZsYWd5ID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgeDAgPSAwLCB5MCA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpbnQgbnI7CisKKyAgICAgICAgICAgICAgICAvKiBhbGlnbiBibG9ja3MgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgQ1ZfSEFBUl9GRUFUVVJFX01BWDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhaGlkZmVhdHVyZS0+cmVjdFtrXS5wMCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyNpZiBDVl9BREpVU1RfRkVBVFVSRVMKKyAgICAgICAgICAgICAgICAgICAgcltrXSA9IGZlYXR1cmUtPnJlY3Rba10ucjsKKyAgICAgICAgICAgICAgICAgICAgYmFzZV93ID0gKGludClDVl9JTUlOKCAodW5zaWduZWQpYmFzZV93LCAodW5zaWduZWQpKHJba10ud2lkdGgtMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZV93ID0gKGludClDVl9JTUlOKCAodW5zaWduZWQpYmFzZV93LCAodW5zaWduZWQpKHJba10ueCAtIHJbMF0ueC0xKSApOworICAgICAgICAgICAgICAgICAgICBiYXNlX2ggPSAoaW50KUNWX0lNSU4oICh1bnNpZ25lZCliYXNlX2gsICh1bnNpZ25lZCkocltrXS5oZWlnaHQtMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgYmFzZV9oID0gKGludClDVl9JTUlOKCAodW5zaWduZWQpYmFzZV9oLCAodW5zaWduZWQpKHJba10ueSAtIHJbMF0ueS0xKSApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbnIgPSBrOworCisjaWYgQ1ZfQURKVVNUX0ZFQVRVUkVTCisgICAgICAgICAgICAgICAgYmFzZV93ICs9IDE7CisgICAgICAgICAgICAgICAgYmFzZV9oICs9IDE7CisgICAgICAgICAgICAgICAga3ggPSByWzBdLndpZHRoIC8gYmFzZV93OworICAgICAgICAgICAgICAgIGt5ID0gclswXS5oZWlnaHQgLyBiYXNlX2g7CisKKyAgICAgICAgICAgICAgICBpZigga3ggPD0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbGFneCA9IDE7CisgICAgICAgICAgICAgICAgICAgIG5ld19iYXNlX3cgPSBjdlJvdW5kKCByWzBdLndpZHRoICogc2NhbGUgKSAvIGt4OworICAgICAgICAgICAgICAgICAgICB4MCA9IGN2Um91bmQoIHJbMF0ueCAqIHNjYWxlICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGt5IDw9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3kgPSAxOworICAgICAgICAgICAgICAgICAgICBuZXdfYmFzZV9oID0gY3ZSb3VuZCggclswXS5oZWlnaHQgKiBzY2FsZSApIC8ga3k7CisgICAgICAgICAgICAgICAgICAgIHkwID0gY3ZSb3VuZCggclswXS55ICogc2NhbGUgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBucjsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2UmVjdCB0cjsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNvcnJlY3Rpb25fcmF0aW87CisKKyNpZiBDVl9BREpVU1RfRkVBVFVSRVMKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWd4ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHIueCA9IChyW2tdLnggLSByWzBdLngpICogbmV3X2Jhc2VfdyAvIGJhc2VfdyArIHgwOworICAgICAgICAgICAgICAgICAgICAgICAgdHIud2lkdGggPSByW2tdLndpZHRoICogbmV3X2Jhc2VfdyAvIGJhc2VfdzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHIueCA9IGN2Um91bmQoIHJba10ueCAqIHNjYWxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICB0ci53aWR0aCA9IGN2Um91bmQoIHJba10ud2lkdGggKiBzY2FsZSApOworICAgICAgICAgICAgICAgICAgICB9CisKKyNpZiBDVl9BREpVU1RfRkVBVFVSRVMKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWd5ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHIueSA9IChyW2tdLnkgLSByWzBdLnkpICogbmV3X2Jhc2VfaCAvIGJhc2VfaCArIHkwOworICAgICAgICAgICAgICAgICAgICAgICAgdHIuaGVpZ2h0ID0gcltrXS5oZWlnaHQgKiBuZXdfYmFzZV9oIC8gYmFzZV9oOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ci55ID0gY3ZSb3VuZCggcltrXS55ICogc2NhbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyLmhlaWdodCA9IGN2Um91bmQoIHJba10uaGVpZ2h0ICogc2NhbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisjaWYgQ1ZfQURKVVNUX1dFSUdIVFMKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBSQUlORVIgU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgb3JpZ19mZWF0dXJlX3NpemUgPSAgKGZsb2F0KShmZWF0dXJlLT5yZWN0W2tdLnIud2lkdGgpKmZlYXR1cmUtPnJlY3Rba10uci5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IG9yaWdfbm9ybV9zaXplID0gKGZsb2F0KShfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS53aWR0aCkqKF9jYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGZlYXR1cmVfc2l6ZSA9IGZsb2F0KHRyLndpZHRoKnRyLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgZmxvYXQgbm9ybVNpemUgICAgPSBmbG9hdChlcXVfcmVjdC53aWR0aCplcXVfcmVjdC5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB0YXJnZXRfcmF0aW8gPSBvcmlnX2ZlYXR1cmVfc2l6ZSAvIG9yaWdfbm9ybV9zaXplOworICAgICAgICAgICAgICAgICAgICAvL2Zsb2F0IGlzUmF0aW8gPSBmZWF0dXJlU2l6ZSAvIG5vcm1TaXplOworICAgICAgICAgICAgICAgICAgICAvL2NvcnJlY3Rpb25SYXRpbyA9IHRhcmdldFJhdGlvIC8gaXNSYXRpbyAvIG5vcm1TaXplOworICAgICAgICAgICAgICAgICAgICBjb3JyZWN0aW9uX3JhdGlvID0gdGFyZ2V0X3JhdGlvIC8gZmVhdHVyZV9zaXplOworICAgICAgICAgICAgICAgICAgICAvLyBSQUlORVIgRU5ECisgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGNvcnJlY3Rpb25fcmF0aW8gPSB3ZWlnaHRfc2NhbGUgKiAoIWZlYXR1cmUtPnRpbHRlZCA/IDEgOiAwLjUpOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFmZWF0dXJlLT50aWx0ZWQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBoaWRmZWF0dXJlLT5yZWN0W2tdLnAwID0gc3VtX2VsZW1fcHRyKCpzdW0sIHRyLnksIHRyLngpOworICAgICAgICAgICAgICAgICAgICAgICAgaGlkZmVhdHVyZS0+cmVjdFtrXS5wMSA9IHN1bV9lbGVtX3B0cigqc3VtLCB0ci55LCB0ci54ICsgdHIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaGlkZmVhdHVyZS0+cmVjdFtrXS5wMiA9IHN1bV9lbGVtX3B0cigqc3VtLCB0ci55ICsgdHIuaGVpZ2h0LCB0ci54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGZlYXR1cmUtPnJlY3Rba10ucDMgPSBzdW1fZWxlbV9wdHIoKnN1bSwgdHIueSArIHRyLmhlaWdodCwgdHIueCArIHRyLndpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGZlYXR1cmUtPnJlY3Rba10ucDIgPSBzdW1fZWxlbV9wdHIoKnRpbHRlZCwgdHIueSArIHRyLndpZHRoLCB0ci54ICsgdHIud2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgaGlkZmVhdHVyZS0+cmVjdFtrXS5wMyA9IHN1bV9lbGVtX3B0cigqdGlsdGVkLCB0ci55ICsgdHIud2lkdGggKyB0ci5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyLnggKyB0ci53aWR0aCAtIHRyLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoaWRmZWF0dXJlLT5yZWN0W2tdLnAwID0gc3VtX2VsZW1fcHRyKCp0aWx0ZWQsIHRyLnksIHRyLngpOworICAgICAgICAgICAgICAgICAgICAgICAgaGlkZmVhdHVyZS0+cmVjdFtrXS5wMSA9IHN1bV9lbGVtX3B0cigqdGlsdGVkLCB0ci55ICsgdHIuaGVpZ2h0LCB0ci54IC0gdHIuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhpZGZlYXR1cmUtPnJlY3Rba10ud2VpZ2h0ID0gKGZsb2F0KShmZWF0dXJlLT5yZWN0W2tdLndlaWdodCAqIGNvcnJlY3Rpb25fcmF0aW8pOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBrID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgYXJlYTAgPSB0ci53aWR0aCAqIHRyLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3VtMCArPSBoaWRmZWF0dXJlLT5yZWN0W2tdLndlaWdodCAqIHRyLndpZHRoICogdHIuaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhpZGZlYXR1cmUtPnJlY3RbMF0ud2VpZ2h0ID0gKGZsb2F0KSgtc3VtMC9hcmVhMCk7CisgICAgICAgICAgICB9IC8qIGwgKi8KKyAgICAgICAgfSAvKiBqICovCisgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU5MSU5FCitkb3VibGUgaWN2RXZhbEhpZEhhYXJDbGFzc2lmaWVyKCBDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhcmlhbmNlX25vcm1fZmFjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBfb2Zmc2V0ICkKK3sKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgQ3ZIaWRIYWFyVHJlZU5vZGUqIG5vZGUgPSBjbGFzc2lmaWVyLT5ub2RlICsgaWR4OworICAgICAgICBkb3VibGUgdCA9IG5vZGUtPnRocmVzaG9sZCAqIHZhcmlhbmNlX25vcm1fZmFjdG9yOworCisgICAgICAgIGRvdWJsZSBzdW0gPSBjYWxjX3N1bShub2RlLT5mZWF0dXJlLnJlY3RbMF0scF9vZmZzZXQpICogbm9kZS0+ZmVhdHVyZS5yZWN0WzBdLndlaWdodDsKKyAgICAgICAgc3VtICs9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFsxXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMV0ud2VpZ2h0OworCisgICAgICAgIGlmKCBub2RlLT5mZWF0dXJlLnJlY3RbMl0ucDAgKQorICAgICAgICAgICAgc3VtICs9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFsyXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMl0ud2VpZ2h0OworCisgICAgICAgIGlkeCA9IHN1bSA8IHQgPyBub2RlLT5sZWZ0IDogbm9kZS0+cmlnaHQ7CisgICAgfQorICAgIHdoaWxlKCBpZHggPiAwICk7CisgICAgcmV0dXJuIGNsYXNzaWZpZXItPmFscGhhWy1pZHhdOworfQorCisKK0NWX0lNUEwgaW50CitjdlJ1bkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUqIF9jYXNjYWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgcHQsIGludCBzdGFydF9zdGFnZSApCit7CisgICAgaW50IHJlc3VsdCA9IC0xOworICAgIENWX0ZVTkNOQU1FKCJjdlJ1bkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHBfb2Zmc2V0LCBwcV9vZmZzZXQ7CisgICAgaW50IGksIGo7CisgICAgZG91YmxlIG1lYW4sIHZhcmlhbmNlX25vcm1fZmFjdG9yOworICAgIEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBjYXNjYWRlOworCisgICAgaWYoICFDVl9JU19IQUFSX0NMQVNTSUZJRVIoX2Nhc2NhZGUpICkKKyAgICAgICAgQ1ZfRVJST1IoICFfY2FzY2FkZSA/IENWX1N0c051bGxQdHIgOiBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGNhc2NhZGUgcG9pbnRlciIgKTsKKworICAgIGNhc2NhZGUgPSBfY2FzY2FkZS0+aGlkX2Nhc2NhZGU7CisgICAgaWYoICFjYXNjYWRlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJIaWRkZW4gY2FzY2FkZSBoYXMgbm90IGJlZW4gY3JlYXRlZC5cbiIKKyAgICAgICAgICAgICJVc2UgY3ZTZXRJbWFnZXNGb3JIYWFyQ2xhc3NpZmllckNhc2NhZGUiICk7CisKKyAgICBpZiggcHQueCA8IDAgfHwgcHQueSA8IDAgfHwKKyAgICAgICAgcHQueCArIF9jYXNjYWRlLT5yZWFsX3dpbmRvd19zaXplLndpZHRoID49IGNhc2NhZGUtPnN1bS53aWR0aC0yIHx8CisgICAgICAgIHB0LnkgKyBfY2FzY2FkZS0+cmVhbF93aW5kb3dfc2l6ZS5oZWlnaHQgPj0gY2FzY2FkZS0+c3VtLmhlaWdodC0yICkKKyAgICAgICAgRVhJVDsKKworICAgIHBfb2Zmc2V0ID0gcHQueSAqIChjYXNjYWRlLT5zdW0uc3RlcC9zaXplb2Yoc3VtdHlwZSkpICsgcHQueDsKKyAgICBwcV9vZmZzZXQgPSBwdC55ICogKGNhc2NhZGUtPnNxc3VtLnN0ZXAvc2l6ZW9mKHNxc3VtdHlwZSkpICsgcHQueDsKKyAgICBtZWFuID0gY2FsY19zdW0oKmNhc2NhZGUscF9vZmZzZXQpKmNhc2NhZGUtPmludl93aW5kb3dfYXJlYTsKKyAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciA9IGNhc2NhZGUtPnBxMFtwcV9vZmZzZXRdIC0gY2FzY2FkZS0+cHExW3BxX29mZnNldF0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZS0+cHEyW3BxX29mZnNldF0gKyBjYXNjYWRlLT5wcTNbcHFfb2Zmc2V0XTsKKyAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciA9IHZhcmlhbmNlX25vcm1fZmFjdG9yKmNhc2NhZGUtPmludl93aW5kb3dfYXJlYSAtIG1lYW4qbWVhbjsKKyAgICBpZiggdmFyaWFuY2Vfbm9ybV9mYWN0b3IgPj0gMC4gKQorICAgICAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciA9IHNxcnQodmFyaWFuY2Vfbm9ybV9mYWN0b3IpOworICAgIGVsc2UKKyAgICAgICAgdmFyaWFuY2Vfbm9ybV9mYWN0b3IgPSAxLjsKKworICAgIGlmKCBjYXNjYWRlLT5pc190cmVlICkKKyAgICB7CisgICAgICAgIEN2SGlkSGFhclN0YWdlQ2xhc3NpZmllciogcHRyOworICAgICAgICBhc3NlcnQoIHN0YXJ0X3N0YWdlID09IDAgKTsKKworICAgICAgICByZXN1bHQgPSAxOworICAgICAgICBwdHIgPSBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyOworCisgICAgICAgIHdoaWxlKCBwdHIgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgc3RhZ2Vfc3VtID0gMDsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHB0ci0+Y291bnQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhZ2Vfc3VtICs9IGljdkV2YWxIaWRIYWFyQ2xhc3NpZmllciggcHRyLT5jbGFzc2lmaWVyICsgaiwKKyAgICAgICAgICAgICAgICAgICAgdmFyaWFuY2Vfbm9ybV9mYWN0b3IsIHBfb2Zmc2V0ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzdGFnZV9zdW0gPj0gcHRyLT50aHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB0ciA9IHB0ci0+Y2hpbGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUoIHB0ciAmJiBwdHItPm5leHQgPT0gTlVMTCApIHB0ciA9IHB0ci0+cGFyZW50OworICAgICAgICAgICAgICAgIGlmKCBwdHIgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHIgPSBwdHItPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggY2FzY2FkZS0+aXNfc3R1bXBfYmFzZWQgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gc3RhcnRfc3RhZ2U7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHN0YWdlX3N1bSA9IDA7CisKKyAgICAgICAgICAgIGlmKCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnR3b19yZWN0cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0gY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyICsgajsKKyAgICAgICAgICAgICAgICAgICAgQ3ZIaWRIYWFyVHJlZU5vZGUqIG5vZGUgPSBjbGFzc2lmaWVyLT5ub2RlOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3VtLCB0ID0gbm9kZS0+dGhyZXNob2xkKnZhcmlhbmNlX25vcm1fZmFjdG9yLCBhLCBiOworCisgICAgICAgICAgICAgICAgICAgIHN1bSA9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFswXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMF0ud2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY2FsY19zdW0obm9kZS0+ZmVhdHVyZS5yZWN0WzFdLHBfb2Zmc2V0KSAqIG5vZGUtPmZlYXR1cmUucmVjdFsxXS53ZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgYSA9IGNsYXNzaWZpZXItPmFscGhhWzBdOworICAgICAgICAgICAgICAgICAgICBiID0gY2xhc3NpZmllci0+YWxwaGFbMV07CisgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bSArPSBzdW0gPCB0ID8gYSA6IGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZIaWRIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciArIGo7CisgICAgICAgICAgICAgICAgICAgIEN2SGlkSGFhclRyZWVOb2RlKiBub2RlID0gY2xhc3NpZmllci0+bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN1bSwgdCA9IG5vZGUtPnRocmVzaG9sZCp2YXJpYW5jZV9ub3JtX2ZhY3RvciwgYSwgYjsKKworICAgICAgICAgICAgICAgICAgICBzdW0gPSBjYWxjX3N1bShub2RlLT5mZWF0dXJlLnJlY3RbMF0scF9vZmZzZXQpICogbm9kZS0+ZmVhdHVyZS5yZWN0WzBdLndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFsxXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMV0ud2VpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIGlmKCBub2RlLT5mZWF0dXJlLnJlY3RbMl0ucDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFsyXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMl0ud2VpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIGEgPSBjbGFzc2lmaWVyLT5hbHBoYVswXTsKKyAgICAgICAgICAgICAgICAgICAgYiA9IGNsYXNzaWZpZXItPmFscGhhWzFdOworICAgICAgICAgICAgICAgICAgICBzdGFnZV9zdW0gKz0gc3VtIDwgdCA/IGEgOiBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YWdlX3N1bSA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0udGhyZXNob2xkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtaTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZvciggaSA9IHN0YXJ0X3N0YWdlOyBpIDwgY2FzY2FkZS0+Y291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdGFnZV9zdW0gPSAwOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jb3VudDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGFnZV9zdW0gKz0gaWN2RXZhbEhpZEhhYXJDbGFzc2lmaWVyKAorICAgICAgICAgICAgICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXIgKyBqLAorICAgICAgICAgICAgICAgICAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciwgcF9vZmZzZXQgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YWdlX3N1bSA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0udGhyZXNob2xkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAtaTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gMTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3N0YXRpYyBpbnQgaXNfZXF1YWwoIGNvbnN0IHZvaWQqIF9yMSwgY29uc3Qgdm9pZCogX3IyLCB2b2lkKiApCit7CisgICAgY29uc3QgQ3ZSZWN0KiByMSA9IChjb25zdCBDdlJlY3QqKV9yMTsKKyAgICBjb25zdCBDdlJlY3QqIHIyID0gKGNvbnN0IEN2UmVjdCopX3IyOworICAgIGludCBkaXN0YW5jZSA9IGN2Um91bmQocjEtPndpZHRoKjAuMik7CisKKyAgICByZXR1cm4gcjItPnggPD0gcjEtPnggKyBkaXN0YW5jZSAmJgorICAgICAgICAgICByMi0+eCA+PSByMS0+eCAtIGRpc3RhbmNlICYmCisgICAgICAgICAgIHIyLT55IDw9IHIxLT55ICsgZGlzdGFuY2UgJiYKKyAgICAgICAgICAgcjItPnkgPj0gcjEtPnkgLSBkaXN0YW5jZSAmJgorICAgICAgICAgICByMi0+d2lkdGggPD0gY3ZSb3VuZCggcjEtPndpZHRoICogMS4yICkgJiYKKyAgICAgICAgICAgY3ZSb3VuZCggcjItPndpZHRoICogMS4yICkgPj0gcjEtPndpZHRoOworfQorCisKKyNkZWZpbmUgVkVSWV9ST1VHSF9TRUFSQ0ggMAorCitDVl9JTVBMIEN2U2VxKgorY3ZIYWFyRGV0ZWN0T2JqZWN0cyggY29uc3QgQ3ZBcnIqIF9pbWcsCisgICAgICAgICAgICAgICAgICAgICBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgZG91YmxlIHNjYWxlX2ZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fbmVpZ2hib3JzLCBpbnQgZmxhZ3MsIEN2U2l6ZSBtaW5fc2l6ZSApCit7CisgICAgaW50IHNwbGl0X3N0YWdlID0gMjsKKworICAgIEN2TWF0IHN0dWIsICppbWcgPSAoQ3ZNYXQqKV9pbWc7CisgICAgQ3ZNYXQgKnRlbXAgPSAwLCAqc3VtID0gMCwgKnRpbHRlZCA9IDAsICpzcXN1bSA9IDAsICpub3JtX2ltZyA9IDAsICpzdW1jYW5ueSA9IDAsICppbWdfc21hbGwgPSAwOworICAgIEN2U2VxKiByZXN1bHRfc2VxID0gMDsKKyAgICBDdk1lbVN0b3JhZ2UqIHRlbXBfc3RvcmFnZSA9IDA7CisgICAgQ3ZBdmdDb21wKiBjb21wcyA9IDA7CisgICAgQ3ZTZXEqIHNlcV90aHJlYWRbQ1ZfTUFYX1RIUkVBRFNdID0gezB9OworICAgIGludCBpLCBtYXhfdGhyZWFkcyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2SGFhckRldGVjdE9iamVjdHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcSAqc2VxID0gMCwgKnNlcTIgPSAwLCAqaWR4X3NlcSA9IDAsICpiaWdfc2VxID0gMDsKKyAgICBDdkF2Z0NvbXAgcmVzdWx0X2NvbXAgPSB7ezAsMCwwLDB9LDB9OworICAgIGRvdWJsZSBmYWN0b3I7CisgICAgaW50IG5wYXNzID0gMiwgY29pOworICAgIGJvb2wgZG9fY2FubnlfcHJ1bmluZyA9IChmbGFncyAmIENWX0hBQVJfRE9fQ0FOTllfUFJVTklORykgIT0gMDsKKyAgICBib29sIGZpbmRfYmlnZ2VzdF9vYmplY3QgPSAoZmxhZ3MgJiBDVl9IQUFSX0ZJTkRfQklHR0VTVF9PQkpFQ1QpICE9IDA7CisgICAgYm9vbCByb3VnaF9zZWFyY2ggPSAoZmxhZ3MgJiBDVl9IQUFSX0RPX1JPVUdIX1NFQVJDSCkgIT0gMDsKKworICAgIGlmKCAhQ1ZfSVNfSEFBUl9DTEFTU0lGSUVSKGNhc2NhZGUpICkKKyAgICAgICAgQ1ZfRVJST1IoICFjYXNjYWRlID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywgIkludmFsaWQgY2xhc3NpZmllciBjYXNjYWRlIiApOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHN0b3JhZ2UgcG9pbnRlciIgKTsKKworICAgIENWX0NBTEwoIGltZyA9IGN2R2V0TWF0KCBpbWcsICZzdHViLCAmY29pICkpOworICAgIGlmKCBjb2kgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKGltZy0+dHlwZSkgIT0gQ1ZfOFUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJPbmx5IDgtYml0IGltYWdlcyBhcmUgc3VwcG9ydGVkIiApOworCisgICAgaWYoIGZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICBmbGFncyAmPSB+Q1ZfSEFBUl9TQ0FMRV9JTUFHRTsKKworICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggaW1nLT5yb3dzLCBpbWctPmNvbHMsIENWXzhVQzEgKSk7CisgICAgQ1ZfQ0FMTCggc3VtID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzMyU0MxICkpOworICAgIENWX0NBTEwoIHNxc3VtID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIHRlbXBfc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBzdG9yYWdlICkpOworCisgICAgaWYoICFjYXNjYWRlLT5oaWRfY2FzY2FkZSApCisgICAgICAgIENWX0NBTEwoIGljdkNyZWF0ZUhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZShjYXNjYWRlKSApOworCisgICAgaWYoIGNhc2NhZGUtPmhpZF9jYXNjYWRlLT5oYXNfdGlsdGVkX2ZlYXR1cmVzICkKKyAgICAgICAgdGlsdGVkID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzMyU0MxICk7CisKKyAgICBzZXEgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2UmVjdCksIHRlbXBfc3RvcmFnZSApOworICAgIHNlcTIgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2QXZnQ29tcCksIHRlbXBfc3RvcmFnZSApOworICAgIHJlc3VsdF9zZXEgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2QXZnQ29tcCksIHN0b3JhZ2UgKTsKKworICAgIG1heF90aHJlYWRzID0gY3ZHZXROdW1UaHJlYWRzKCk7CisgICAgaWYoIG1heF90aHJlYWRzID4gMSApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtYXhfdGhyZWFkczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2VfdGhyZWFkOworICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcF9zdG9yYWdlX3RocmVhZCA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBzZXFfdGhyZWFkW2ldID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdlNlcSksCisgICAgICAgICAgICAgICAgc2l6ZW9mKEN2UmVjdCksIHRlbXBfc3RvcmFnZV90aHJlYWQgKSk7CisgICAgICAgIH0KKyAgICBlbHNlCisgICAgICAgIHNlcV90aHJlYWRbMF0gPSBzZXE7CisKKyAgICBpZiggQ1ZfTUFUX0NOKGltZy0+dHlwZSkgPiAxICkKKyAgICB7CisgICAgICAgIGN2Q3Z0Q29sb3IoIGltZywgdGVtcCwgQ1ZfQkdSMkdSQVkgKTsKKyAgICAgICAgaW1nID0gdGVtcDsKKyAgICB9CisKKyAgICBpZiggZmxhZ3MgJiBDVl9IQUFSX0ZJTkRfQklHR0VTVF9PQkpFQ1QgKQorICAgICAgICBmbGFncyAmPSB+KENWX0hBQVJfU0NBTEVfSU1BR0V8Q1ZfSEFBUl9ET19DQU5OWV9QUlVOSU5HKTsKKworICAgIGlmKCBmbGFncyAmIENWX0hBQVJfU0NBTEVfSU1BR0UgKQorICAgIHsKKyAgICAgICAgQ3ZTaXplIHdpbl9zaXplMCA9IGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemU7CisgICAgICAgIGludCB1c2VfaXBwID0gY2FzY2FkZS0+aGlkX2Nhc2NhZGUtPmlwcF9zdGFnZXMgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBpY3ZBcHBseUhhYXJDbGFzc2lmaWVyXzMyZl9DMVJfcCAhPSAwOworCisgICAgICAgIGlmKCB1c2VfaXBwICkKKyAgICAgICAgICAgIENWX0NBTEwoIG5vcm1faW1nID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl8zMkZDMSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggaW1nX3NtYWxsID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzhVQzEgKSk7CisKKyAgICAgICAgZm9yKCBmYWN0b3IgPSAxOyA7IGZhY3RvciAqPSBzY2FsZV9mYWN0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RyaXBfY291bnQsIHN0cmlwX3NpemU7CisgICAgICAgICAgICBpbnQgeXN0ZXAgPSBmYWN0b3IgPiAyLiA/IDEgOiAyOworICAgICAgICAgICAgQ3ZTaXplIHdpbl9zaXplID0geyBjdlJvdW5kKHdpbl9zaXplMC53aWR0aCpmYWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJvdW5kKHdpbl9zaXplMC5oZWlnaHQqZmFjdG9yKSB9OworICAgICAgICAgICAgQ3ZTaXplIHN6ID0geyBjdlJvdW5kKCBpbWctPmNvbHMvZmFjdG9yICksIGN2Um91bmQoIGltZy0+cm93cy9mYWN0b3IgKSB9OworICAgICAgICAgICAgQ3ZTaXplIHN6MSA9IHsgc3oud2lkdGggLSB3aW5fc2l6ZTAud2lkdGgsIHN6LmhlaWdodCAtIHdpbl9zaXplMC5oZWlnaHQgfTsKKyAgICAgICAgICAgIEN2UmVjdCBlcXVfcmVjdCA9IHsgaWN2X29iamVjdF93aW5fYm9yZGVyLCBpY3Zfb2JqZWN0X3dpbl9ib3JkZXIsCisgICAgICAgICAgICAgICAgd2luX3NpemUwLndpZHRoIC0gaWN2X29iamVjdF93aW5fYm9yZGVyKjIsCisgICAgICAgICAgICAgICAgd2luX3NpemUwLmhlaWdodCAtIGljdl9vYmplY3Rfd2luX2JvcmRlcioyIH07CisgICAgICAgICAgICBDdk1hdCBpbWcxLCBzdW0xLCBzcXN1bTEsIG5vcm0xLCB0aWx0ZWQxLCBtYXNrMTsKKyAgICAgICAgICAgIEN2TWF0KiBfdGlsdGVkID0gMDsKKworICAgICAgICAgICAgaWYoIHN6MS53aWR0aCA8PSAwIHx8IHN6MS5oZWlnaHQgPD0gMCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBpZiggd2luX3NpemUud2lkdGggPCBtaW5fc2l6ZS53aWR0aCB8fCB3aW5fc2l6ZS5oZWlnaHQgPCBtaW5fc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpbWcxID0gY3ZNYXQoIHN6LmhlaWdodCwgc3oud2lkdGgsIENWXzhVQzEsIGltZ19zbWFsbC0+ZGF0YS5wdHIgKTsKKyAgICAgICAgICAgIHN1bTEgPSBjdk1hdCggc3ouaGVpZ2h0KzEsIHN6LndpZHRoKzEsIENWXzMyU0MxLCBzdW0tPmRhdGEucHRyICk7CisgICAgICAgICAgICBzcXN1bTEgPSBjdk1hdCggc3ouaGVpZ2h0KzEsIHN6LndpZHRoKzEsIENWXzY0RkMxLCBzcXN1bS0+ZGF0YS5wdHIgKTsKKyAgICAgICAgICAgIGlmKCB0aWx0ZWQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRpbHRlZDEgPSBjdk1hdCggc3ouaGVpZ2h0KzEsIHN6LndpZHRoKzEsIENWXzMyU0MxLCB0aWx0ZWQtPmRhdGEucHRyICk7CisgICAgICAgICAgICAgICAgX3RpbHRlZCA9ICZ0aWx0ZWQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9ybTEgPSBjdk1hdCggc3oxLmhlaWdodCwgc3oxLndpZHRoLCBDVl8zMkZDMSwgbm9ybV9pbWcgPyBub3JtX2ltZy0+ZGF0YS5wdHIgOiAwICk7CisgICAgICAgICAgICBtYXNrMSA9IGN2TWF0KCBzejEuaGVpZ2h0LCBzejEud2lkdGgsIENWXzhVQzEsIHRlbXAtPmRhdGEucHRyICk7CisKKyAgICAgICAgICAgIGN2UmVzaXplKCBpbWcsICZpbWcxLCBDVl9JTlRFUl9MSU5FQVIgKTsKKyAgICAgICAgICAgIGN2SW50ZWdyYWwoICZpbWcxLCAmc3VtMSwgJnNxc3VtMSwgX3RpbHRlZCApOworCisgICAgICAgICAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJpcF9jb3VudCA9IE1BWChNSU4oc3oxLmhlaWdodC95c3RlcCwgbWF4X3RocmVhZHMqMyksIDEpOworICAgICAgICAgICAgICAgIHN0cmlwX3NpemUgPSAoc3oxLmhlaWdodCArIHN0cmlwX2NvdW50IC0gMSkvc3RyaXBfY291bnQ7CisgICAgICAgICAgICAgICAgc3RyaXBfc2l6ZSA9IChzdHJpcF9zaXplIC8geXN0ZXApKnlzdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmlwX2NvdW50ID0gMTsKKyAgICAgICAgICAgICAgICBzdHJpcF9zaXplID0gc3oxLmhlaWdodDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICF1c2VfaXBwICkKKyAgICAgICAgICAgICAgICBjdlNldEltYWdlc0ZvckhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggY2FzY2FkZSwgJnN1bTEsICZzcXN1bTEsIDAsIDEuICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzei5oZWlnaHQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGlzdW0gPSAoaW50Kikoc3VtMS5kYXRhLnB0ciArIHN1bTEuc3RlcCppKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZzdW0gPSAoZmxvYXQqKWlzdW07CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBGTFRfREVMVEEgPSAtKDEgPDwgMjQpOworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzei53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZzdW1bal0gPSAoZmxvYXQpKGlzdW1bal0gKyBGTFRfREVMVEEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAjaWZkZWYgX09QRU5NUAorICAgICAgICAgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKG1heF90aHJlYWRzKSBzY2hlZHVsZShkeW5hbWljKQorICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdHJpcF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGhyZWFkX2lkID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgICAgICAgICBpbnQgcG9zaXRpdmUgPSAwOworICAgICAgICAgICAgICAgIGludCB5MSA9IGkqc3RyaXBfc2l6ZSwgeTIgPSAoaSsxKSpzdHJpcF9zaXplLyogLSB5c3RlcCArIDEqLzsKKyAgICAgICAgICAgICAgICBDdlNpemUgc3N6OworICAgICAgICAgICAgICAgIGludCB4LCB5LCBqOworICAgICAgICAgICAgICAgIGlmKCBpID09IHN0cmlwX2NvdW50IC0gMSB8fCB5MiA+IHN6MS5oZWlnaHQgKQorICAgICAgICAgICAgICAgICAgICB5MiA9IHN6MS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgc3N6ID0gY3ZTaXplKHN6MS53aWR0aCwgeTIgLSB5MSk7CisKKyAgICAgICAgICAgICAgICBpZiggdXNlX2lwcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZSZWN0U3RkRGV2XzMyZl9DMVJfcCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCopKHN1bTEuZGF0YS5wdHIgKyB5MSpzdW0xLnN0ZXApLCBzdW0xLnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKikoc3FzdW0xLmRhdGEucHRyICsgeTEqc3FzdW0xLnN0ZXApLCBzcXN1bTEuc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCopKG5vcm0xLmRhdGEucHRyICsgeTEqbm9ybTEuc3RlcCksIG5vcm0xLnN0ZXAsIHNzeiwgZXF1X3JlY3QgKTsKKworICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZSA9IChzc3oud2lkdGgveXN0ZXApKigoc3N6LmhlaWdodCArIHlzdGVwLTEpL3lzdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCBtYXNrMS5kYXRhLnB0ciArIHkxKm1hc2sxLnN0ZXAsIHlzdGVwID09IDEsIG1hc2sxLmhlaWdodCptYXNrMS5zdGVwKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKCB5c3RlcCA+IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSB5MSwgcG9zaXRpdmUgPSAwOyB5IDwgeTI7IHkgKz0geXN0ZXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzc3oud2lkdGg7IHggKz0geXN0ZXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrMS5kYXRhLnB0clttYXNrMS5zdGVwKnkgKyB4XSA9ICh1Y2hhcikxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNhc2NhZGUtPmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWN2QXBwbHlIYWFyQ2xhc3NpZmllcl8zMmZfQzFSX3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0Kikoc3VtMS5kYXRhLnB0ciArIHkxKnN1bTEuc3RlcCksIHN1bTEuc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQqKShub3JtMS5kYXRhLnB0ciArIHkxKm5vcm0xLnN0ZXApLCBub3JtMS5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sxLmRhdGEucHRyICsgeTEqbWFzazEuc3RlcCwgbWFzazEuc3RlcCwgc3N6LCAmcG9zaXRpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZS0+aGlkX2Nhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbal0udGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2NhZGUtPmhpZF9jYXNjYWRlLT5pcHBfc3RhZ2VzW2pdKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb3NpdGl2ZSA8PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSB5MSwgcG9zaXRpdmUgPSAwOyB5IDwgeTI7IHkgKz0geXN0ZXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNzei53aWR0aDsgeCArPSB5c3RlcCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazEuZGF0YS5wdHJbbWFzazEuc3RlcCp5ICsgeF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJ1bkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggY2FzY2FkZSwgY3ZQb2ludCh4LHkpLCAwICkgPiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlICs9IG1hc2sxLmRhdGEucHRyW21hc2sxLnN0ZXAqeSArIHhdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBwb3NpdGl2ZSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB5ID0geTE7IHkgPCB5MjsgeSArPSB5c3RlcCApCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc3N6LndpZHRoOyB4ICs9IHlzdGVwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFzazEuZGF0YS5wdHJbbWFzazEuc3RlcCp5ICsgeF0gIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3Qgb2JqX3JlY3QgPSB7IGN2Um91bmQoeCpmYWN0b3IpLCBjdlJvdW5kKHkqZmFjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fc2l6ZS53aWR0aCwgd2luX3NpemUuaGVpZ2h0IH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggc2VxX3RocmVhZFt0aHJlYWRfaWRdLCAmb2JqX3JlY3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnYXRoZXIgdGhlIHJlc3VsdHMKKyAgICAgICAgICAgIGlmKCBtYXhfdGhyZWFkcyA+IDEgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBtYXhfdGhyZWFkczsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBzID0gc2VxX3RocmVhZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGosIHRvdGFsID0gcy0+dG90YWw7CisgICAgICAgICAgICAgICAgICAgIEN2U2VxQmxvY2sqIGIgPSBzLT5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHRvdGFsOyBqICs9IGItPmNvdW50LCBiID0gYi0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2hNdWx0aSggc2VxLCBiLT5kYXRhLCBiLT5jb3VudCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgbl9mYWN0b3JzID0gMDsKKyAgICAgICAgQ3ZSZWN0IHNjYW5fcm9pX3JlY3QgPSB7MCwwLDAsMH07CisgICAgICAgIGJvb2wgaXNfZm91bmQgPSBmYWxzZSwgc2Nhbl9yb2kgPSBmYWxzZTsKKworICAgICAgICBjdkludGVncmFsKCBpbWcsIHN1bSwgc3FzdW0sIHRpbHRlZCApOworCisgICAgICAgIGlmKCBkb19jYW5ueV9wcnVuaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtY2FubnkgPSBjdkNyZWF0ZU1hdCggaW1nLT5yb3dzICsgMSwgaW1nLT5jb2xzICsgMSwgQ1ZfMzJTQzEgKTsKKyAgICAgICAgICAgIGN2Q2FubnkoIGltZywgdGVtcCwgMCwgNTAsIDMgKTsKKyAgICAgICAgICAgIGN2SW50ZWdyYWwoIHRlbXAsIHN1bWNhbm55ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggKHVuc2lnbmVkKXNwbGl0X3N0YWdlID49ICh1bnNpZ25lZCljYXNjYWRlLT5jb3VudCB8fAorICAgICAgICAgICAgY2FzY2FkZS0+aGlkX2Nhc2NhZGUtPmlzX3RyZWUgKQorICAgICAgICB7CisgICAgICAgICAgICBzcGxpdF9zdGFnZSA9IGNhc2NhZGUtPmNvdW50OworICAgICAgICAgICAgbnBhc3MgPSAxOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBuX2ZhY3RvcnMgPSAwLCBmYWN0b3IgPSAxOworICAgICAgICAgICAgIGZhY3RvcipjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLndpZHRoIDwgaW1nLT5jb2xzIC0gMTAgJiYKKyAgICAgICAgICAgICBmYWN0b3IqY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQgPCBpbWctPnJvd3MgLSAxMDsKKyAgICAgICAgICAgICBuX2ZhY3RvcnMrKywgZmFjdG9yICo9IHNjYWxlX2ZhY3RvciApCisgICAgICAgICAgICA7CisKKyAgICAgICAgaWYoIGZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICB7CisgICAgICAgICAgICBzY2FsZV9mYWN0b3IgPSAxLi9zY2FsZV9mYWN0b3I7CisgICAgICAgICAgICBmYWN0b3IgKj0gc2NhbGVfZmFjdG9yOworICAgICAgICAgICAgYmlnX3NlcSA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZSZWN0KSwgdGVtcF9zdG9yYWdlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFjdG9yID0gMTsKKworICAgICAgICBmb3IoIDsgbl9mYWN0b3JzLS0gPiAwICYmICFpc19mb3VuZDsgZmFjdG9yICo9IHNjYWxlX2ZhY3RvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB5c3RlcCA9IE1BWCggMiwgZmFjdG9yICk7CisgICAgICAgICAgICBDdlNpemUgd2luX3NpemUgPSB7IGN2Um91bmQoIGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemUud2lkdGggKiBmYWN0b3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCggY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQgKiBmYWN0b3IgKX07CisgICAgICAgICAgICBDdlJlY3QgZXF1X3JlY3QgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgICAgIGludCAqcDAgPSAwLCAqcDEgPSAwLCAqcDIgPSAwLCAqcDMgPSAwOworICAgICAgICAgICAgaW50ICpwcTAgPSAwLCAqcHExID0gMCwgKnBxMiA9IDAsICpwcTMgPSAwOworICAgICAgICAgICAgaW50IHBhc3MsIHN0YWdlX29mZnNldCA9IDA7CisgICAgICAgICAgICBpbnQgc3RhcnRfeCA9IDAsIHN0YXJ0X3kgPSAwOworICAgICAgICAgICAgaW50IGVuZF94ID0gY3ZSb3VuZCgoaW1nLT5jb2xzIC0gd2luX3NpemUud2lkdGgpIC8geXN0ZXApOworICAgICAgICAgICAgaW50IGVuZF95ID0gY3ZSb3VuZCgoaW1nLT5yb3dzIC0gd2luX3NpemUuaGVpZ2h0KSAvIHlzdGVwKTsKKworICAgICAgICAgICAgaWYoIHdpbl9zaXplLndpZHRoIDwgbWluX3NpemUud2lkdGggfHwgd2luX3NpemUuaGVpZ2h0IDwgbWluX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZmluZF9iaWdnZXN0X29iamVjdCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdlNldEltYWdlc0ZvckhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggY2FzY2FkZSwgc3VtLCBzcXN1bSwgdGlsdGVkLCBmYWN0b3IgKTsKKyAgICAgICAgICAgIGN2WmVybyggdGVtcCApOworCisgICAgICAgICAgICBpZiggZG9fY2FubnlfcHJ1bmluZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZXF1X3JlY3QueCA9IGN2Um91bmQod2luX3NpemUud2lkdGgqMC4xNSk7CisgICAgICAgICAgICAgICAgZXF1X3JlY3QueSA9IGN2Um91bmQod2luX3NpemUuaGVpZ2h0KjAuMTUpOworICAgICAgICAgICAgICAgIGVxdV9yZWN0LndpZHRoID0gY3ZSb3VuZCh3aW5fc2l6ZS53aWR0aCowLjcpOworICAgICAgICAgICAgICAgIGVxdV9yZWN0LmhlaWdodCA9IGN2Um91bmQod2luX3NpemUuaGVpZ2h0KjAuNyk7CisKKyAgICAgICAgICAgICAgICBwMCA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyBlcXVfcmVjdC55KnN1bWNhbm55LT5zdGVwKSArIGVxdV9yZWN0Lng7CisgICAgICAgICAgICAgICAgcDEgPSAoaW50Kikoc3VtY2FubnktPmRhdGEucHRyICsgZXF1X3JlY3QueSpzdW1jYW5ueS0+c3RlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVxdV9yZWN0LnggKyBlcXVfcmVjdC53aWR0aDsKKyAgICAgICAgICAgICAgICBwMiA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyAoZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCkqc3VtY2FubnktPnN0ZXApICsgZXF1X3JlY3QueDsKKyAgICAgICAgICAgICAgICBwMyA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyAoZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCkqc3VtY2FubnktPnN0ZXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGg7CisKKyAgICAgICAgICAgICAgICBwcTAgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIGVxdV9yZWN0Lnkqc3VtLT5zdGVwKSArIGVxdV9yZWN0Lng7CisgICAgICAgICAgICAgICAgcHExID0gKGludCopKHN1bS0+ZGF0YS5wdHIgKyBlcXVfcmVjdC55KnN1bS0+c3RlcCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGVxdV9yZWN0LnggKyBlcXVfcmVjdC53aWR0aDsKKyAgICAgICAgICAgICAgICBwcTIgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIChlcXVfcmVjdC55ICsgZXF1X3JlY3QuaGVpZ2h0KSpzdW0tPnN0ZXApICsgZXF1X3JlY3QueDsKKyAgICAgICAgICAgICAgICBwcTMgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIChlcXVfcmVjdC55ICsgZXF1X3JlY3QuaGVpZ2h0KSpzdW0tPnN0ZXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzY2FuX3JvaSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9hZGp1c3Qgc3RhcnRfaGVpZ2h0IGFuZCBzdG9wX2hlaWdodAorICAgICAgICAgICAgICAgIHN0YXJ0X3kgPSBjdlJvdW5kKHNjYW5fcm9pX3JlY3QueSAvIHlzdGVwKTsKKyAgICAgICAgICAgICAgICBlbmRfeSA9IGN2Um91bmQoKHNjYW5fcm9pX3JlY3QueSArIHNjYW5fcm9pX3JlY3QuaGVpZ2h0IC0gd2luX3NpemUuaGVpZ2h0KSAvIHlzdGVwKTsKKworICAgICAgICAgICAgICAgIHN0YXJ0X3ggPSBjdlJvdW5kKHNjYW5fcm9pX3JlY3QueCAvIHlzdGVwKTsKKyAgICAgICAgICAgICAgICBlbmRfeCA9IGN2Um91bmQoKHNjYW5fcm9pX3JlY3QueCArIHNjYW5fcm9pX3JlY3Qud2lkdGggLSB3aW5fc2l6ZS53aWR0aCkgLyB5c3RlcCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2NhZGUtPmhpZF9jYXNjYWRlLT5jb3VudCA9IHNwbGl0X3N0YWdlOworCisgICAgICAgICAgICBmb3IoIHBhc3MgPSAwOyBwYXNzIDwgbnBhc3M7IHBhc3MrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAjaWZkZWYgX09QRU5NUAorICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBudW1fdGhyZWFkcyhtYXhfdGhyZWFkcykgc2NoZWR1bGUoZHluYW1pYykKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGZvciggaW50IF9peSA9IHN0YXJ0X3k7IF9peSA8IGVuZF95OyBfaXkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZWFkX2lkID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl5ID0gY3ZSb3VuZChfaXkqeXN0ZXApOworICAgICAgICAgICAgICAgICAgICBpbnQgX2l4LCBfeHN0ZXAgPSAxOworICAgICAgICAgICAgICAgICAgICB1Y2hhciogbWFza19yb3cgPSB0ZW1wLT5kYXRhLnB0ciArIHRlbXAtPnN0ZXAgKiBpeTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIF9peCA9IHN0YXJ0X3g7IF9peCA8IGVuZF94OyBfaXggKz0gX3hzdGVwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGl4ID0gY3ZSb3VuZChfaXgqeXN0ZXApOyAvLyBpdCByZWFsbHkgc2hvdWxkIGJlIHlzdGVwCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwYXNzID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzdGVwID0gMjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkb19jYW5ueV9wcnVuaW5nICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzLCBzcTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBpeSooc3VtLT5zdGVwL3NpemVvZihwMFswXSkpICsgaXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBwMFtvZmZzZXRdIC0gcDFbb2Zmc2V0XSAtIHAyW29mZnNldF0gKyBwM1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcSA9IHBxMFtvZmZzZXRdIC0gcHExW29mZnNldF0gLSBwcTJbb2Zmc2V0XSArIHBxM1tvZmZzZXRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcyA8IDEwMCB8fCBzcSA8IDIwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBjYXNjYWRlLCBjdlBvaW50KGl4LGl5KSwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwYXNzIDwgbnBhc3MgLSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcm93W2l4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHJlY3QgPSBjdlJlY3QoaXgsaXksd2luX3NpemUud2lkdGgsd2luX3NpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggc2VxX3RocmVhZFt0aHJlYWRfaWRdLCAmcmVjdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzdGVwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG1hc2tfcm93W2l4XSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBjYXNjYWRlLCBjdlBvaW50KGl4LGl5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlX29mZnNldCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwYXNzID09IG5wYXNzIC0gMSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCByZWN0ID0gY3ZSZWN0KGl4LGl5LHdpbl9zaXplLndpZHRoLHdpbl9zaXplLmhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHNlcV90aHJlYWRbdGhyZWFkX2lkXSwgJnJlY3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcm93W2l4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhZ2Vfb2Zmc2V0ID0gY2FzY2FkZS0+aGlkX2Nhc2NhZGUtPmNvdW50OworICAgICAgICAgICAgICAgIGNhc2NhZGUtPmhpZF9jYXNjYWRlLT5jb3VudCA9IGNhc2NhZGUtPmNvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBnYXRoZXIgdGhlIHJlc3VsdHMKKyAgICAgICAgICAgIGlmKCBtYXhfdGhyZWFkcyA+IDEgKQorCSAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBtYXhfdGhyZWFkczsgaSsrICkKKwkgICAgICAgICAgICB7CisJCSAgICAgICAgICAgIEN2U2VxKiBzID0gc2VxX3RocmVhZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGosIHRvdGFsID0gcy0+dG90YWw7CisgICAgICAgICAgICAgICAgICAgIEN2U2VxQmxvY2sqIGIgPSBzLT5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHRvdGFsOyBqICs9IGItPmNvdW50LCBiID0gYi0+bmV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2hNdWx0aSggc2VxLCBiLT5kYXRhLCBiLT5jb3VudCApOworCSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U2VxKiBic2VxID0gbWluX25laWdoYm9ycyA+IDAgPyBiaWdfc2VxIDogc2VxOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBtaW5fbmVpZ2hib3JzID4gMCAmJiAhc2Nhbl9yb2kgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXAgcmV0cmlldmVkIHJlY3RhbmdsZXMgaW4gb3JkZXIgdG8gZmlsdGVyIG91dCBub2lzZQorICAgICAgICAgICAgICAgICAgICBpbnQgbmNvbXAgPSBjdlNlcVBhcnRpdGlvbiggc2VxLCAwLCAmaWR4X3NlcSwgaXNfZXF1YWwsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY29tcHMgPSAoQ3ZBdmdDb21wKiljdkFsbG9jKCAobmNvbXArMSkqc2l6ZW9mKGNvbXBzWzBdKSkpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGNvbXBzLCAwLCAobmNvbXArMSkqc2l6ZW9mKGNvbXBzWzBdKSk7CisKKyAgICAgICAgICAgICAgICAjaWYgVkVSWV9ST1VHSF9TRUFSQ0gKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJvdWdoX3NlYXJjaCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzZXEtPnRvdGFsOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCByMSA9ICooQ3ZSZWN0KiljdkdldFNlcUVsZW0oIHNlcSwgaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAqKGludCopY3ZHZXRTZXFFbGVtKCBpZHhfc2VxLCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpaWR4IDwgKHVuc2lnbmVkKW5jb21wICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLm5laWdoYm9ycysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC54ICs9IHIxLng7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnkgKz0gcjEueTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3Qud2lkdGggKz0gcjEud2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LmhlaWdodCArPSByMS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSBhdmVyYWdlIGJvdW5kaW5nIGJveAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5jb21wOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gY29tcHNbaV0ubmVpZ2hib3JzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBuID49IG1pbl9uZWlnaGJvcnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBdmdDb21wIGNvbXA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC54ID0gKGNvbXBzW2ldLnJlY3QueCoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC55ID0gKGNvbXBzW2ldLnJlY3QueSoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC53aWR0aCA9IChjb21wc1tpXS5yZWN0LndpZHRoKjIgKyBuKS8oMipuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IChjb21wc1tpXS5yZWN0LmhlaWdodCoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAubmVpZ2hib3JzID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKCBic2VxLCAmY29tcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDAgOyBpIDw9IG5jb21wOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2ldLnJlY3QueCA9IGNvbXBzW2ldLnJlY3QueSA9IElOVF9NQVg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50IG51bWJlciBvZiBuZWlnaGJvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzZXEtPnRvdGFsOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCByMSA9ICooQ3ZSZWN0KiljdkdldFNlcUVsZW0oIHNlcSwgaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAqKGludCopY3ZHZXRTZXFFbGVtKCBpZHhfc2VxLCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpaWR4IDwgKHVuc2lnbmVkKW5jb21wICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLm5laWdoYm9ycysrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdC53aWR0aCBhbmQgcmVjdC5oZWlnaHQgd2lsbCBzdG9yZSBjb29yZGluYXRlIG9mIHJpZ2h0LWJvdHRvbSBjb3JuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QueCA9IE1JTihjb21wc1tpZHhdLnJlY3QueCwgcjEueCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnkgPSBNSU4oY29tcHNbaWR4XS5yZWN0LnksIHIxLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC53aWR0aCA9IE1BWChjb21wc1tpZHhdLnJlY3Qud2lkdGgsIHIxLngrcjEud2lkdGgtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LmhlaWdodCA9IE1BWChjb21wc1tpZHhdLnJlY3QuaGVpZ2h0LCByMS55K3IxLmhlaWdodC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGVuY2xvc2luZyBib3gKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY29tcDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGNvbXBzW2ldLm5laWdoYm9yczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbiA+PSBtaW5fbmVpZ2hib3JzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXZnQ29tcCBjb21wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl9zY2FsZSA9IHJvdWdoX3NlYXJjaCA/IDAuNiA6IDAuNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LnggPSBjb21wc1tpXS5yZWN0Lng7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC55ID0gY29tcHNbaV0ucmVjdC55OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSBjb21wc1tpXS5yZWN0LndpZHRoIC0gY29tcHNbaV0ucmVjdC54ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IGNvbXBzW2ldLnJlY3QuaGVpZ2h0IC0gY29tcHNbaV0ucmVjdC55ICsgMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbWluX3NpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGN2Um91bmQoIGNvbXAucmVjdC53aWR0aCptaW5fc2NhbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX3NpemUud2lkdGggPSBNQVgoIG1pbl9zaXplLndpZHRoLCB0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IGN2Um91bmQoIGNvbXAucmVjdC5oZWlnaHQqbWluX3NjYWxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9zaXplLmhlaWdodCA9IE1BWCggbWluX3NpemUuaGVpZ2h0LCB0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leHBhbmQgdGhlIGJveCBieSAyMCUgYmVjYXVzZSB3ZSBjb3VsZCBtaXNzIHNvbWUgbmVpZ2hib3VycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlZSAnaXNfZXF1YWwnIGZ1bmN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCA9IGN2Um91bmQoY29tcC5yZWN0LndpZHRoICogMC4yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJpZ2h0ID0gTUlOKCBpbWctPmNvbHMtMSwgY29tcC5yZWN0LngrY29tcC5yZWN0LndpZHRoLTEgKyBvZmZzZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJvdHRvbSA9IE1JTiggaW1nLT5yb3dzLTEsIGNvbXAucmVjdC55K2NvbXAucmVjdC5oZWlnaHQtMSArIG9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC54ID0gTUFYKCBjb21wLnJlY3QueCAtIG9mZnNldCwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3QueSA9IE1BWCggY29tcC5yZWN0LnkgLSBvZmZzZXQsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LndpZHRoID0gcmlnaHQgLSBjb21wLnJlY3QueCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC5oZWlnaHQgPSBib3R0b20gLSBjb21wLnJlY3QueSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5uZWlnaGJvcnMgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIGJzZXEsICZjb21wICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3ZGcmVlKCAmY29tcHMgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBiaWdnZXN0IHJlY3QKKyAgICAgICAgICAgICAgICBpZiggYnNlcS0+dG90YWwgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYXJlYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBic2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBdmdDb21wKiBjb21wID0gKEN2QXZnQ29tcCopY3ZHZXRTZXFFbGVtKCBic2VxLCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJlYSA9IGNvbXAtPnJlY3Qud2lkdGggKiBjb21wLT5yZWN0LmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXhfYXJlYSA8IGFyZWEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhID0gYXJlYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfY29tcC5yZWN0ID0gY29tcC0+cmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfY29tcC5uZWlnaGJvcnMgPSBic2VxID09IHNlcSA/IDEgOiBjb21wLT5uZWlnaGJvcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL1ByZXBhcmUgaW5mb3JtYXRpb24gZm9yIGZ1cnRoZXIgc2Nhbm5pbmcgaW5zaWRlIHRoZSBiaWdnZXN0IHJlY3RhbmdsZQorCisgICAgICAgICAgICAgICAgI2lmIFZFUllfUk9VR0hfU0VBUkNICisgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBzY2FuIHJhbmdlcyB0byByb2kgaW4gY2FzZSBvZiByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICBpZiggIXJvdWdoX3NlYXJjaCAmJiAhc2Nhbl9yb2kgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaV9yZWN0ID0gcmVzdWx0X2NvbXAucmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2Q2xlYXJTZXEoYnNlcSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcm91Z2hfc2VhcmNoICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBpZiggIXNjYW5fcm9pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9yb2kgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbl9yb2lfcmVjdCA9IHJlc3VsdF9jb21wLnJlY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkNsZWFyU2VxKGJzZXEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIG1pbl9uZWlnaGJvcnMgPT0gMCAmJiAhZmluZF9iaWdnZXN0X29iamVjdCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZSZWN0KiByZWN0ID0gKEN2UmVjdCopY3ZHZXRTZXFFbGVtKCBzZXEsIGkgKTsKKyAgICAgICAgICAgIEN2QXZnQ29tcCBjb21wOworICAgICAgICAgICAgY29tcC5yZWN0ID0gKnJlY3Q7CisgICAgICAgICAgICBjb21wLm5laWdoYm9ycyA9IDE7CisgICAgICAgICAgICBjdlNlcVB1c2goIHJlc3VsdF9zZXEsICZjb21wICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbWluX25laWdoYm9ycyAhPSAwCisjaWYgVkVSWV9ST1VHSF9TRUFSQ0ggICAgICAgIAorICAgICAgICAmJiAoIWZpbmRfYmlnZ2VzdF9vYmplY3QgfHwgIXJvdWdoX3NlYXJjaCkKKyNlbmRpZiAgICAgICAgCisgICAgICAgICkKKyAgICB7CisgICAgICAgIC8vIGdyb3VwIHJldHJpZXZlZCByZWN0YW5nbGVzIGluIG9yZGVyIHRvIGZpbHRlciBvdXQgbm9pc2UKKyAgICAgICAgaW50IG5jb21wID0gY3ZTZXFQYXJ0aXRpb24oIHNlcSwgMCwgJmlkeF9zZXEsIGlzX2VxdWFsLCAwICk7CisgICAgICAgIENWX0NBTEwoIGNvbXBzID0gKEN2QXZnQ29tcCopY3ZBbGxvYyggKG5jb21wKzEpKnNpemVvZihjb21wc1swXSkpKTsKKyAgICAgICAgbWVtc2V0KCBjb21wcywgMCwgKG5jb21wKzEpKnNpemVvZihjb21wc1swXSkpOworCisgICAgICAgIC8vIGNvdW50IG51bWJlciBvZiBuZWlnaGJvcnMKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNlcS0+dG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UmVjdCByMSA9ICooQ3ZSZWN0KiljdkdldFNlcUVsZW0oIHNlcSwgaSApOworICAgICAgICAgICAgaW50IGlkeCA9ICooaW50KiljdkdldFNlcUVsZW0oIGlkeF9zZXEsIGkgKTsKKyAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZCluY29tcCApOworCisgICAgICAgICAgICBjb21wc1tpZHhdLm5laWdoYm9ycysrOworCisgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QueCArPSByMS54OworICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnkgKz0gcjEueTsKKyAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC53aWR0aCArPSByMS53aWR0aDsKKyAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC5oZWlnaHQgKz0gcjEuaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgYm91bmRpbmcgYm94CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY29tcDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBjb21wc1tpXS5uZWlnaGJvcnM7CisgICAgICAgICAgICBpZiggbiA+PSBtaW5fbmVpZ2hib3JzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkF2Z0NvbXAgY29tcDsKKyAgICAgICAgICAgICAgICBjb21wLnJlY3QueCA9IChjb21wc1tpXS5yZWN0LngqMiArIG4pLygyKm4pOworICAgICAgICAgICAgICAgIGNvbXAucmVjdC55ID0gKGNvbXBzW2ldLnJlY3QueSoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgY29tcC5yZWN0LndpZHRoID0gKGNvbXBzW2ldLnJlY3Qud2lkdGgqMiArIG4pLygyKm4pOworICAgICAgICAgICAgICAgIGNvbXAucmVjdC5oZWlnaHQgPSAoY29tcHNbaV0ucmVjdC5oZWlnaHQqMiArIG4pLygyKm4pOworICAgICAgICAgICAgICAgIGNvbXAubmVpZ2hib3JzID0gY29tcHNbaV0ubmVpZ2hib3JzOworCisgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKCBzZXEyLCAmY29tcCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoICFmaW5kX2JpZ2dlc3Rfb2JqZWN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBzbWFsbCBmYWNlIHJlY3RhbmdsZXMgaW5zaWRlIGxhcmdlIGZhY2UgcmVjdGFuZ2xlcworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNlcTItPnRvdGFsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2QXZnQ29tcCByMSA9ICooQ3ZBdmdDb21wKiljdkdldFNlcUVsZW0oIHNlcTIsIGkgKTsKKyAgICAgICAgICAgICAgICBpbnQgaiwgZmxhZyA9IDE7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2VxMi0+dG90YWw7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkF2Z0NvbXAgcjIgPSAqKEN2QXZnQ29tcCopY3ZHZXRTZXFFbGVtKCBzZXEyLCBqICk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IGN2Um91bmQoIHIyLnJlY3Qud2lkdGggKiAwLjIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSBqICYmCisgICAgICAgICAgICAgICAgICAgICAgICByMS5yZWN0LnggPj0gcjIucmVjdC54IC0gZGlzdGFuY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxLnJlY3QueSA+PSByMi5yZWN0LnkgLSBkaXN0YW5jZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcjEucmVjdC54ICsgcjEucmVjdC53aWR0aCA8PSByMi5yZWN0LnggKyByMi5yZWN0LndpZHRoICsgZGlzdGFuY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHIxLnJlY3QueSArIHIxLnJlY3QuaGVpZ2h0IDw9IHIyLnJlY3QueSArIHIyLnJlY3QuaGVpZ2h0ICsgZGlzdGFuY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChyMi5uZWlnaGJvcnMgPiBNQVgoIDMsIHIxLm5laWdoYm9ycyApIHx8IHIxLm5laWdoYm9ycyA8IDMpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBmbGFnICkKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKCByZXN1bHRfc2VxLCAmcjEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXhfYXJlYSA9IDA7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxMi0+dG90YWw7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZBdmdDb21wKiBjb21wID0gKEN2QXZnQ29tcCopY3ZHZXRTZXFFbGVtKCBzZXEyLCBpICk7CisgICAgICAgICAgICAgICAgaW50IGFyZWEgPSBjb21wLT5yZWN0LndpZHRoICogY29tcC0+cmVjdC5oZWlnaHQ7CisgICAgICAgICAgICAgICAgaWYoIG1heF9hcmVhIDwgYXJlYSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfYXJlYSA9IGFyZWE7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9jb21wID0gKmNvbXA7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBmaW5kX2JpZ2dlc3Rfb2JqZWN0ICYmIHJlc3VsdF9jb21wLnJlY3Qud2lkdGggPiAwICkKKyAgICAgICAgY3ZTZXFQdXNoKCByZXN1bHRfc2VxLCAmcmVzdWx0X2NvbXAgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKwkgICAgZm9yKCBpID0gMDsgaSA8IG1heF90aHJlYWRzOyBpKysgKQorCSAgICB7CisJCSAgICBpZiggc2VxX3RocmVhZFtpXSApCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnNlcV90aHJlYWRbaV0tPnN0b3JhZ2UgKTsKKwkgICAgfQorCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworICAgIGN2UmVsZWFzZU1hdCggJnN1bSApOworICAgIGN2UmVsZWFzZU1hdCggJnNxc3VtICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdGlsdGVkICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworICAgIGN2UmVsZWFzZU1hdCggJnN1bWNhbm55ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmbm9ybV9pbWcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZpbWdfc21hbGwgKTsKKyAgICBjdkZyZWUoICZjb21wcyApOworCisgICAgcmV0dXJuIHJlc3VsdF9zZXE7Cit9CisKKworc3RhdGljIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKgoraWN2TG9hZENhc2NhZGVDQVJUKCBjb25zdCBjaGFyKiogaW5wdXRfY2FzY2FkZSwgaW50IG4sIEN2U2l6ZSBvcmlnX3dpbmRvd19zaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSA9IGljdkNyZWF0ZUhhYXJDbGFzc2lmaWVyQ2FzY2FkZShuKTsKKyAgICBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplID0gb3JpZ193aW5kb3dfc2l6ZTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGosIGNvdW50LCBsOworICAgICAgICBmbG9hdCB0aHJlc2hvbGQgPSAwOworICAgICAgICBjb25zdCBjaGFyKiBzdGFnZSA9IGlucHV0X2Nhc2NhZGVbaV07CisgICAgICAgIGludCBkbCA9IDA7CisKKyAgICAgICAgLyogdHJlZSBsaW5rcyAqLworICAgICAgICBpbnQgcGFyZW50ID0gLTE7CisgICAgICAgIGludCBuZXh0ID0gLTE7CisKKyAgICAgICAgc3NjYW5mKCBzdGFnZSwgIiVkJW4iLCAmY291bnQsICZkbCApOworICAgICAgICBzdGFnZSArPSBkbDsKKworICAgICAgICBhc3NlcnQoIGNvdW50ID4gMCApOworICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50ID0gY291bnQ7CisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciA9CisgICAgICAgICAgICAoQ3ZIYWFyQ2xhc3NpZmllciopY3ZBbGxvYyggY291bnQqc2l6ZW9mKGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllclswXSkpOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciArIGo7CisgICAgICAgICAgICBpbnQgaywgcmVjdHMgPSAwOworICAgICAgICAgICAgY2hhciBzdHJbMTAwXTsKKworICAgICAgICAgICAgc3NjYW5mKCBzdGFnZSwgIiVkJW4iLCAmY2xhc3NpZmllci0+Y291bnQsICZkbCApOworICAgICAgICAgICAgc3RhZ2UgKz0gZGw7CisKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZSA9IChDdkhhYXJGZWF0dXJlKikgY3ZBbGxvYygKKyAgICAgICAgICAgICAgICBjbGFzc2lmaWVyLT5jb3VudCAqICggc2l6ZW9mKCAqY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoICpjbGFzc2lmaWVyLT50aHJlc2hvbGQgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggKmNsYXNzaWZpZXItPmxlZnQgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggKmNsYXNzaWZpZXItPnJpZ2h0ICkgKSArCisgICAgICAgICAgICAgICAgKGNsYXNzaWZpZXItPmNvdW50ICsgMSkgKiBzaXplb2YoICpjbGFzc2lmaWVyLT5hbHBoYSApICk7CisgICAgICAgICAgICBjbGFzc2lmaWVyLT50aHJlc2hvbGQgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlK2NsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnQgPSAoaW50KikgKGNsYXNzaWZpZXItPnRocmVzaG9sZCArIGNsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPnJpZ2h0ID0gKGludCopIChjbGFzc2lmaWVyLT5sZWZ0ICsgY2xhc3NpZmllci0+Y291bnQpOworICAgICAgICAgICAgY2xhc3NpZmllci0+YWxwaGEgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+cmlnaHQgKyBjbGFzc2lmaWVyLT5jb3VudCk7CisKKyAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBjbGFzc2lmaWVyLT5jb3VudDsgbCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc2NhbmYoIHN0YWdlLCAiJWQlbiIsICZyZWN0cywgJmRsICk7CisgICAgICAgICAgICAgICAgc3RhZ2UgKz0gZGw7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHJlY3RzID49IDIgJiYgcmVjdHMgPD0gQ1ZfSEFBUl9GRUFUVVJFX01BWCApOworCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHJlY3RzOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHI7CisgICAgICAgICAgICAgICAgICAgIGludCBiYW5kID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3NjYW5mKCBzdGFnZSwgIiVkJWQlZCVkJWQlZiVuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmci54LCAmci55LCAmci53aWR0aCwgJnIuaGVpZ2h0LCAmYmFuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS5yZWN0W2tdLndlaWdodCksICZkbCApOworICAgICAgICAgICAgICAgICAgICBzdGFnZSArPSBkbDsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2xdLnJlY3Rba10uciA9IHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNzY2FuZiggc3RhZ2UsICIlcyVuIiwgc3RyLCAmZGwgKTsKKyAgICAgICAgICAgICAgICBzdGFnZSArPSBkbDsKKworICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS50aWx0ZWQgPSBzdHJuY21wKCBzdHIsICJ0aWx0ZWQiLCA2ICkgPT0gMDsKKworICAgICAgICAgICAgICAgIGZvciggayA9IHJlY3RzOyBrIDwgQ1ZfSEFBUl9GRUFUVVJFX01BWDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2xdLnJlY3QgKyBrLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmVbbF0ucmVjdFtrXSkgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzc2NhbmYoIHN0YWdlLCAiJWYlZCVkJW4iLCAmKGNsYXNzaWZpZXItPnRocmVzaG9sZFtsXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGNsYXNzaWZpZXItPmxlZnRbbF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihjbGFzc2lmaWVyLT5yaWdodFtsXSksICZkbCApOworICAgICAgICAgICAgICAgIHN0YWdlICs9IGRsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8PSBjbGFzc2lmaWVyLT5jb3VudDsgbCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzc2NhbmYoIHN0YWdlLCAiJWYlbiIsICYoY2xhc3NpZmllci0+YWxwaGFbbF0pLCAmZGwgKTsKKyAgICAgICAgICAgICAgICBzdGFnZSArPSBkbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNzY2FuZiggc3RhZ2UsICIlZiVuIiwgJnRocmVzaG9sZCwgJmRsICk7CisgICAgICAgIHN0YWdlICs9IGRsOworCisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0udGhyZXNob2xkID0gdGhyZXNob2xkOworCisgICAgICAgIC8qIGxvYWQgdHJlZSBsaW5rcyAqLworICAgICAgICBpZiggc3NjYW5mKCBzdGFnZSwgIiVkJWQlbiIsICZwYXJlbnQsICZuZXh0LCAmZGwgKSAhPSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyZW50ID0gaSAtIDE7CisgICAgICAgICAgICBuZXh0ID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgc3RhZ2UgKz0gZGw7CisKKyAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0ubmV4dCA9IG5leHQ7CisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2hpbGQgPSAtMTsKKworICAgICAgICBpZiggcGFyZW50ICE9IC0xICYmIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbcGFyZW50XS5jaGlsZCA9PSAtMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbcGFyZW50XS5jaGlsZCA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2FzY2FkZTsKK30KKworI2lmbmRlZiBfTUFYX1BBVEgKKyNkZWZpbmUgX01BWF9QQVRIIDEwMjQKKyNlbmRpZgorCitDVl9JTVBMIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKgorY3ZMb2FkSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBjb25zdCBjaGFyKiBkaXJlY3RvcnksIEN2U2l6ZSBvcmlnX3dpbmRvd19zaXplICkKK3sKKyAgICBjb25zdCBjaGFyKiogaW5wdXRfY2FzY2FkZSA9IDA7CisgICAgQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUgKmNhc2NhZGUgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkxvYWRIYWFyQ2xhc3NpZmllckNhc2NhZGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgbjsKKyAgICBjb25zdCBjaGFyKiBzbGFzaDsKKyAgICBjaGFyIG5hbWVbX01BWF9QQVRIXTsKKyAgICBpbnQgc2l6ZSA9IDA7CisgICAgY2hhciogcHRyID0gMDsKKworICAgIGlmKCAhZGlyZWN0b3J5ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHBhdGggaXMgcGFzc2VkIiApOworCisgICAgbiA9IChpbnQpc3RybGVuKGRpcmVjdG9yeSktMTsKKyAgICBzbGFzaCA9IGRpcmVjdG9yeVtuXSA9PSAnXFwnIHx8IGRpcmVjdG9yeVtuXSA9PSAnLycgPyAiIiA6ICIvIjsKKworICAgIC8qIHRyeSB0byByZWFkIHRoZSBjbGFzc2lmaWVyIGZyb20gZGlyZWN0b3J5ICovCisgICAgZm9yKCBuID0gMDsgOyBuKysgKQorICAgIHsKKyAgICAgICAgc3ByaW50ZiggbmFtZSwgIiVzJXMlZC9BZGFCb29zdENBUlRIYWFyQ2xhc3NpZmllci50eHQiLCBkaXJlY3RvcnksIHNsYXNoLCBuICk7CisgICAgICAgIEZJTEUqIGYgPSBmb3BlbiggbmFtZSwgInJiIiApOworICAgICAgICBpZiggIWYgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZzZWVrKCBmLCAwLCBTRUVLX0VORCApOworICAgICAgICBzaXplICs9IGZ0ZWxsKCBmICkgKyAxOworICAgICAgICBmY2xvc2UoZik7CisgICAgfQorCisgICAgaWYoIG4gPT0gMCAmJiBzbGFzaFswXSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjYXNjYWRlID0gKEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiljdkxvYWQoIGRpcmVjdG9yeSApKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisgICAgZWxzZSBpZiggbiA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgcGF0aCIgKTsKKworICAgIHNpemUgKz0gKG4rMSkqc2l6ZW9mKGNoYXIqKTsKKyAgICBDVl9DQUxMKCBpbnB1dF9jYXNjYWRlID0gKGNvbnN0IGNoYXIqKiljdkFsbG9jKCBzaXplICkpOworICAgIHB0ciA9IChjaGFyKikoaW5wdXRfY2FzY2FkZSArIG4gKyAxKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgc3ByaW50ZiggbmFtZSwgIiVzLyVkL0FkYUJvb3N0Q0FSVEhhYXJDbGFzc2lmaWVyLnR4dCIsIGRpcmVjdG9yeSwgaSApOworICAgICAgICBGSUxFKiBmID0gZm9wZW4oIG5hbWUsICJyYiIgKTsKKyAgICAgICAgaWYoICFmICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIiIgKTsKKyAgICAgICAgZnNlZWsoIGYsIDAsIFNFRUtfRU5EICk7CisgICAgICAgIHNpemUgPSBmdGVsbCggZiApOworICAgICAgICBmc2VlayggZiwgMCwgU0VFS19TRVQgKTsKKyAgICAgICAgZnJlYWQoIHB0ciwgMSwgc2l6ZSwgZiApOworICAgICAgICBmY2xvc2UoZik7CisgICAgICAgIGlucHV0X2Nhc2NhZGVbaV0gPSBwdHI7CisgICAgICAgIHB0ciArPSBzaXplOworICAgICAgICAqcHRyKysgPSAnXDAnOworICAgIH0KKworICAgIGlucHV0X2Nhc2NhZGVbbl0gPSAwOworICAgIGNhc2NhZGUgPSBpY3ZMb2FkQ2FzY2FkZUNBUlQoIGlucHV0X2Nhc2NhZGUsIG4sIG9yaWdfd2luZG93X3NpemUgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggaW5wdXRfY2FzY2FkZSApCisgICAgICAgIGN2RnJlZSggJmlucHV0X2Nhc2NhZGUgKTsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2UmVsZWFzZUhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggJmNhc2NhZGUgKTsKKworICAgIHJldHVybiBjYXNjYWRlOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSoqIF9jYXNjYWRlICkKK3sKKyAgICBpZiggX2Nhc2NhZGUgJiYgKl9jYXNjYWRlICkKKyAgICB7CisgICAgICAgIGludCBpLCBqOworICAgICAgICBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSA9ICpfY2FzY2FkZTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FzY2FkZS0+Y291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIGN2RnJlZSggJmNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllcltqXS5oYWFyX2ZlYXR1cmUgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJmNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciApOworICAgICAgICB9CisgICAgICAgIGljdlJlbGVhc2VIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUoICZjYXNjYWRlLT5oaWRfY2FzY2FkZSApOworICAgICAgICBjdkZyZWUoIF9jYXNjYWRlICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQZXJzaXN0ZW5jZSBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZmllbGQgbmFtZXMgKi8KKworI2RlZmluZSBJQ1ZfSEFBUl9TSVpFX05BTUUgICAgICAgICAgICAic2l6ZSIKKyNkZWZpbmUgSUNWX0hBQVJfU1RBR0VTX05BTUUgICAgICAgICAgInN0YWdlcyIKKyNkZWZpbmUgSUNWX0hBQVJfVFJFRVNfTkFNRSAgICAgICAgICAgICAidHJlZXMiCisjZGVmaW5lIElDVl9IQUFSX0ZFQVRVUkVfTkFNRSAgICAgICAgICAgICAiZmVhdHVyZSIKKyNkZWZpbmUgSUNWX0hBQVJfUkVDVFNfTkFNRSAgICAgICAgICAgICAgICAgInJlY3RzIgorI2RlZmluZSBJQ1ZfSEFBUl9USUxURURfTkFNRSAgICAgICAgICAgICAgICAidGlsdGVkIgorI2RlZmluZSBJQ1ZfSEFBUl9USFJFU0hPTERfTkFNRSAgICAgICAgICAgInRocmVzaG9sZCIKKyNkZWZpbmUgSUNWX0hBQVJfTEVGVF9OT0RFX05BTUUgICAgICAgICAgICJsZWZ0X25vZGUiCisjZGVmaW5lIElDVl9IQUFSX0xFRlRfVkFMX05BTUUgICAgICAgICAgICAibGVmdF92YWwiCisjZGVmaW5lIElDVl9IQUFSX1JJR0hUX05PREVfTkFNRSAgICAgICAgICAicmlnaHRfbm9kZSIKKyNkZWZpbmUgSUNWX0hBQVJfUklHSFRfVkFMX05BTUUgICAgICAgICAgICJyaWdodF92YWwiCisjZGVmaW5lIElDVl9IQUFSX1NUQUdFX1RIUkVTSE9MRF9OQU1FICAgInN0YWdlX3RocmVzaG9sZCIKKyNkZWZpbmUgSUNWX0hBQVJfUEFSRU5UX05BTUUgICAgICAgICAgICAicGFyZW50IgorI2RlZmluZSBJQ1ZfSEFBUl9ORVhUX05BTUUgICAgICAgICAgICAgICJuZXh0IgorCitzdGF0aWMgaW50CitpY3ZJc0hhYXJDbGFzc2lmaWVyKCBjb25zdCB2b2lkKiBzdHJ1Y3RfcHRyICkKK3sKKyAgICByZXR1cm4gQ1ZfSVNfSEFBUl9DTEFTU0lGSUVSKCBzdHJ1Y3RfcHRyICk7Cit9CisKK3N0YXRpYyB2b2lkKgoraWN2UmVhZEhhYXJDbGFzc2lmaWVyKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApCit7CisgICAgQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUqIGNhc2NhZGUgPSBOVUxMOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlYWRIYWFyQ2xhc3NpZmllciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNoYXIgYnVmWzI1Nl07CisgICAgQ3ZGaWxlTm9kZSogc2VxX2ZuID0gTlVMTDsgLyogc2VxdWVuY2UgKi8KKyAgICBDdkZpbGVOb2RlKiBmbiA9IE5VTEw7CisgICAgQ3ZGaWxlTm9kZSogc3RhZ2VzX2ZuID0gTlVMTDsKKyAgICBDdlNlcVJlYWRlciBzdGFnZXNfcmVhZGVyOworICAgIGludCBuOworICAgIGludCBpLCBqLCBrLCBsOworICAgIGludCBwYXJlbnQsIG5leHQ7CisKKyAgICBDVl9DQUxMKCBzdGFnZXNfZm4gPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgSUNWX0hBQVJfU1RBR0VTX05BTUUgKSApOworICAgIGlmKCAhc3RhZ2VzX2ZuIHx8ICFDVl9OT0RFX0lTX1NFUSggc3RhZ2VzX2ZuLT50YWcpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiSW52YWxpZCBzdGFnZXMgbm9kZSIgKTsKKworICAgIG4gPSBzdGFnZXNfZm4tPmRhdGEuc2VxLT50b3RhbDsKKyAgICBDVl9DQUxMKCBjYXNjYWRlID0gaWN2Q3JlYXRlSGFhckNsYXNzaWZpZXJDYXNjYWRlKG4pICk7CisKKyAgICAvKiByZWFkIHNpemUgKi8KKyAgICBDVl9DQUxMKCBzZXFfZm4gPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgSUNWX0hBQVJfU0laRV9OQU1FICkgKTsKKyAgICBpZiggIXNlcV9mbiB8fCAhQ1ZfTk9ERV9JU19TRVEoIHNlcV9mbi0+dGFnICkgfHwgc2VxX2ZuLT5kYXRhLnNlcS0+dG90YWwgIT0gMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgInNpemUgbm9kZSBpcyBub3QgYSB2YWxpZCBzZXF1ZW5jZS4iICk7CisgICAgQ1ZfQ0FMTCggZm4gPSAoQ3ZGaWxlTm9kZSopIGN2R2V0U2VxRWxlbSggc2VxX2ZuLT5kYXRhLnNlcSwgMCApICk7CisgICAgaWYoICFDVl9OT0RFX0lTX0lOVCggZm4tPnRhZyApIHx8IGZuLT5kYXRhLmkgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIkludmFsaWQgc2l6ZSBub2RlOiB3aWR0aCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIiICk7CisgICAgY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS53aWR0aCA9IGZuLT5kYXRhLmk7CisgICAgQ1ZfQ0FMTCggZm4gPSAoQ3ZGaWxlTm9kZSopIGN2R2V0U2VxRWxlbSggc2VxX2ZuLT5kYXRhLnNlcSwgMSApICk7CisgICAgaWYoICFDVl9OT0RFX0lTX0lOVCggZm4tPnRhZyApIHx8IGZuLT5kYXRhLmkgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIkludmFsaWQgc2l6ZSBub2RlOiBoZWlnaHQgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2VyIiApOworICAgIGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemUuaGVpZ2h0ID0gZm4tPmRhdGEuaTsKKworICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCBzdGFnZXNfZm4tPmRhdGEuc2VxLCAmc3RhZ2VzX3JlYWRlciApICk7CisgICAgZm9yKCBpID0gMDsgaSA8IG47ICsraSApCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBzdGFnZV9mbjsKKyAgICAgICAgQ3ZGaWxlTm9kZSogdHJlZXNfZm47CisgICAgICAgIEN2U2VxUmVhZGVyIHRyZWVzX3JlYWRlcjsKKworICAgICAgICBzdGFnZV9mbiA9IChDdkZpbGVOb2RlKikgc3RhZ2VzX3JlYWRlci5wdHI7CisgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19NQVAoIHN0YWdlX2ZuLT50YWcgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgIkludmFsaWQgc3RhZ2UgJWQiLCBpICk7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICB9CisKKyAgICAgICAgQ1ZfQ0FMTCggdHJlZXNfZm4gPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgc3RhZ2VfZm4sIElDVl9IQUFSX1RSRUVTX05BTUUgKSApOworICAgICAgICBpZiggIXRyZWVzX2ZuIHx8ICFDVl9OT0RFX0lTX1NFUSggdHJlZXNfZm4tPnRhZyApCisgICAgICAgICAgICB8fCB0cmVlc19mbi0+ZGF0YS5zZXEtPnRvdGFsIDw9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJUcmVlcyBub2RlIGlzIG5vdCBhIHZhbGlkIHNlcXVlbmNlLiAoc3RhZ2UgJWQpIiwgaSApOworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCBidWYgKTsKKyAgICAgICAgfQorCisgICAgICAgIENWX0NBTEwoIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciA9CisgICAgICAgICAgICAoQ3ZIYWFyQ2xhc3NpZmllciopIGN2QWxsb2MoIHRyZWVzX2ZuLT5kYXRhLnNlcS0+dG90YWwKKyAgICAgICAgICAgICAgICAqIHNpemVvZiggY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyWzBdICkgKSApOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgdHJlZXNfZm4tPmRhdGEuc2VxLT50b3RhbDsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyW2pdLmhhYXJfZmVhdHVyZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jb3VudCA9IHRyZWVzX2ZuLT5kYXRhLnNlcS0+dG90YWw7CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHRyZWVzX2ZuLT5kYXRhLnNlcSwgJnRyZWVzX3JlYWRlciApICk7CisgICAgICAgIGZvciggaiA9IDA7IGogPCB0cmVlc19mbi0+ZGF0YS5zZXEtPnRvdGFsOyArK2ogKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZpbGVOb2RlKiB0cmVlX2ZuOworICAgICAgICAgICAgQ3ZTZXFSZWFkZXIgdHJlZV9yZWFkZXI7CisgICAgICAgICAgICBDdkhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyOworICAgICAgICAgICAgaW50IGxhc3RfaWR4OworCisgICAgICAgICAgICBjbGFzc2lmaWVyID0gJmNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllcltqXTsKKyAgICAgICAgICAgIHRyZWVfZm4gPSAoQ3ZGaWxlTm9kZSopIHRyZWVzX3JlYWRlci5wdHI7CisgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfU0VRKCB0cmVlX2ZuLT50YWcgKSB8fCB0cmVlX2ZuLT5kYXRhLnNlcS0+dG90YWwgPD0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAiVHJlZSBub2RlIGlzIG5vdCBhIHZhbGlkIHNlcXVlbmNlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIChzdGFnZSAlZCwgdHJlZSAlZCkiLCBpLCBqICk7CisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCBidWYgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xhc3NpZmllci0+Y291bnQgPSB0cmVlX2ZuLT5kYXRhLnNlcS0+dG90YWw7CisgICAgICAgICAgICBDVl9DQUxMKCBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUgPSAoQ3ZIYWFyRmVhdHVyZSopIGN2QWxsb2MoCisgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+Y291bnQgKiAoIHNpemVvZiggKmNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCAqY2xhc3NpZmllci0+dGhyZXNob2xkICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoICpjbGFzc2lmaWVyLT5sZWZ0ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoICpjbGFzc2lmaWVyLT5yaWdodCApICkgKworICAgICAgICAgICAgICAgIChjbGFzc2lmaWVyLT5jb3VudCArIDEpICogc2l6ZW9mKCAqY2xhc3NpZmllci0+YWxwaGEgKSApICk7CisgICAgICAgICAgICBjbGFzc2lmaWVyLT50aHJlc2hvbGQgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlK2NsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnQgPSAoaW50KikgKGNsYXNzaWZpZXItPnRocmVzaG9sZCArIGNsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPnJpZ2h0ID0gKGludCopIChjbGFzc2lmaWVyLT5sZWZ0ICsgY2xhc3NpZmllci0+Y291bnQpOworICAgICAgICAgICAgY2xhc3NpZmllci0+YWxwaGEgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+cmlnaHQgKyBjbGFzc2lmaWVyLT5jb3VudCk7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCB0cmVlX2ZuLT5kYXRhLnNlcSwgJnRyZWVfcmVhZGVyICkgKTsKKyAgICAgICAgICAgIGZvciggayA9IDAsIGxhc3RfaWR4ID0gMDsgayA8IHRyZWVfZm4tPmRhdGEuc2VxLT50b3RhbDsgKytrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZpbGVOb2RlKiBub2RlX2ZuOworICAgICAgICAgICAgICAgIEN2RmlsZU5vZGUqIGZlYXR1cmVfZm47CisgICAgICAgICAgICAgICAgQ3ZGaWxlTm9kZSogcmVjdHNfZm47CisgICAgICAgICAgICAgICAgQ3ZTZXFSZWFkZXIgcmVjdHNfcmVhZGVyOworCisgICAgICAgICAgICAgICAgbm9kZV9mbiA9IChDdkZpbGVOb2RlKikgdHJlZV9yZWFkZXIucHRyOworICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19NQVAoIG5vZGVfZm4tPnRhZyApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgIlRyZWUgbm9kZSAlZCBpcyBub3QgYSB2YWxpZCBtYXAuIChzdGFnZSAlZCwgdHJlZSAlZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrLCBpLCBqICk7CisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENWX0NBTEwoIGZlYXR1cmVfZm4gPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZV9mbiwKKyAgICAgICAgICAgICAgICAgICAgSUNWX0hBQVJfRkVBVFVSRV9OQU1FICkgKTsKKyAgICAgICAgICAgICAgICBpZiggIWZlYXR1cmVfZm4gfHwgIUNWX05PREVfSVNfTUFQKCBmZWF0dXJlX2ZuLT50YWcgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJGZWF0dXJlIG5vZGUgaXMgbm90IGEgdmFsaWQgbWFwLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc3RhZ2UgJWQsIHRyZWUgJWQsIG5vZGUgJWQpIiwgaSwgaiwgayApOworICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDVl9DQUxMKCByZWN0c19mbiA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBmZWF0dXJlX2ZuLAorICAgICAgICAgICAgICAgICAgICBJQ1ZfSEFBUl9SRUNUU19OQU1FICkgKTsKKyAgICAgICAgICAgICAgICBpZiggIXJlY3RzX2ZuIHx8ICFDVl9OT0RFX0lTX1NFUSggcmVjdHNfZm4tPnRhZyApCisgICAgICAgICAgICAgICAgICAgIHx8IHJlY3RzX2ZuLT5kYXRhLnNlcS0+dG90YWwgPCAxCisgICAgICAgICAgICAgICAgICAgIHx8IHJlY3RzX2ZuLT5kYXRhLnNlcS0+dG90YWwgPiBDVl9IQUFSX0ZFQVRVUkVfTUFYICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgIlJlY3RzIG5vZGUgaXMgbm90IGEgdmFsaWQgc2VxdWVuY2UuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCByZWN0c19mbi0+ZGF0YS5zZXEsICZyZWN0c19yZWFkZXIgKSApOworICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCByZWN0c19mbi0+ZGF0YS5zZXEtPnRvdGFsOyArK2wgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZGaWxlTm9kZSogcmVjdF9mbjsKKyAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHI7CisKKyAgICAgICAgICAgICAgICAgICAgcmVjdF9mbiA9IChDdkZpbGVOb2RlKikgcmVjdHNfcmVhZGVyLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFDVl9OT0RFX0lTX1NFUSggcmVjdF9mbi0+dGFnICkgfHwgcmVjdF9mbi0+ZGF0YS5zZXEtPnRvdGFsICE9IDUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJSZWN0ICVkIGlzIG5vdCBhIHZhbGlkIHNlcXVlbmNlLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkKSIsIGwsIGksIGosIGsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmbiA9IENWX1NFUV9FTEVNKCByZWN0X2ZuLT5kYXRhLnNlcSwgQ3ZGaWxlTm9kZSwgMCApOworICAgICAgICAgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfSU5UKCBmbi0+dGFnICkgfHwgZm4tPmRhdGEuaSA8IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJ4IGNvb3JkaW5hdGUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCwgcmVjdCAlZCkiLCBpLCBqLCBrLCBsICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHIueCA9IGZuLT5kYXRhLmk7CisgICAgICAgICAgICAgICAgICAgIGZuID0gQ1ZfU0VRX0VMRU0oIHJlY3RfZm4tPmRhdGEuc2VxLCBDdkZpbGVOb2RlLCAxICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19JTlQoIGZuLT50YWcgKSB8fCBmbi0+ZGF0YS5pIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgInkgY29vcmRpbmF0ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkLCByZWN0ICVkKSIsIGksIGosIGssIGwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci55ID0gZm4tPmRhdGEuaTsKKyAgICAgICAgICAgICAgICAgICAgZm4gPSBDVl9TRVFfRUxFTSggcmVjdF9mbi0+ZGF0YS5zZXEsIEN2RmlsZU5vZGUsIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFDVl9OT0RFX0lTX0lOVCggZm4tPnRhZyApIHx8IGZuLT5kYXRhLmkgPD0gMAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgci54ICsgZm4tPmRhdGEuaSA+IGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJ3aWR0aCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoeCArIHdpZHRoKSBtdXN0IG5vdCBleGNlZWQgd2luZG93IHdpZHRoLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkLCByZWN0ICVkKSIsIGksIGosIGssIGwgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgci53aWR0aCA9IGZuLT5kYXRhLmk7CisgICAgICAgICAgICAgICAgICAgIGZuID0gQ1ZfU0VRX0VMRU0oIHJlY3RfZm4tPmRhdGEuc2VxLCBDdkZpbGVOb2RlLCAzICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19JTlQoIGZuLT50YWcgKSB8fCBmbi0+ZGF0YS5pIDw9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHIueSArIGZuLT5kYXRhLmkgPiBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLmhlaWdodCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgImhlaWdodCBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXIgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoeSArIGhlaWdodCkgbXVzdCBub3QgZXhjZWVkIHdpbmRvdyBoZWlnaHQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc3RhZ2UgJWQsIHRyZWUgJWQsIG5vZGUgJWQsIHJlY3QgJWQpIiwgaSwgaiwgaywgbCApOworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCBidWYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByLmhlaWdodCA9IGZuLT5kYXRhLmk7CisgICAgICAgICAgICAgICAgICAgIGZuID0gQ1ZfU0VRX0VMRU0oIHJlY3RfZm4tPmRhdGEuc2VxLCBDdkZpbGVOb2RlLCA0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19SRUFMKCBmbi0+dGFnICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJ3ZWlnaHQgbXVzdCBiZSByZWFsIG51bWJlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCwgcmVjdCAlZCkiLCBpLCBqLCBrLCBsICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2tdLnJlY3RbbF0ud2VpZ2h0ID0gKGZsb2F0KSBmbi0+ZGF0YS5mOworICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmVba10ucmVjdFtsXS5yID0gcjsKKworICAgICAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoICpyZWN0X2ZuICksIHJlY3RzX3JlYWRlciApOworICAgICAgICAgICAgICAgIH0gLyogZm9yIGVhY2ggcmVjdCAqLworICAgICAgICAgICAgICAgIGZvciggbCA9IHJlY3RzX2ZuLT5kYXRhLnNlcS0+dG90YWw7IGwgPCBDVl9IQUFSX0ZFQVRVUkVfTUFYOyArK2wgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2tdLnJlY3RbbF0ud2VpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2tdLnJlY3RbbF0uciA9IGN2UmVjdCggMCwgMCwgMCwgMCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENWX0NBTEwoIGZuID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIGZlYXR1cmVfZm4sIElDVl9IQUFSX1RJTFRFRF9OQU1FKSk7CisgICAgICAgICAgICAgICAgaWYoICFmbiB8fCAhQ1ZfTk9ERV9JU19JTlQoIGZuLT50YWcgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJ0aWx0ZWQgbXVzdCBiZSAwIG9yIDEuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtrXS50aWx0ZWQgPSAoIGZuLT5kYXRhLmkgIT0gMCApOworICAgICAgICAgICAgICAgIENWX0NBTEwoIGZuID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGVfZm4sIElDVl9IQUFSX1RIUkVTSE9MRF9OQU1FKSk7CisgICAgICAgICAgICAgICAgaWYoICFmbiB8fCAhQ1ZfTk9ERV9JU19SRUFMKCBmbi0+dGFnICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAidGhyZXNob2xkIG11c3QgYmUgcmVhbCBudW1iZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPnRocmVzaG9sZFtrXSA9IChmbG9hdCkgZm4tPmRhdGEuZjsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBmbiA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlX2ZuLCBJQ1ZfSEFBUl9MRUZUX05PREVfTkFNRSkpOworICAgICAgICAgICAgICAgIGlmKCBmbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfSU5UKCBmbi0+dGFnICkgfHwgZm4tPmRhdGEuaSA8PSBrCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBmbi0+ZGF0YS5pID49IHRyZWVfZm4tPmRhdGEuc2VxLT50b3RhbCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgImxlZnQgbm9kZSBtdXN0IGJlIHZhbGlkIG5vZGUgbnVtYmVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkKSIsIGksIGosIGsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBub2RlICovCisgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnRba10gPSBmbi0+ZGF0YS5pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBmbiA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlX2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgSUNWX0hBQVJfTEVGVF9WQUxfTkFNRSApICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhZm4gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJsZWZ0IG5vZGUgb3IgbGVmdCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19SRUFMKCBmbi0+dGFnICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJsZWZ0IHZhbHVlIG11c3QgYmUgcmVhbCBudW1iZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoc3RhZ2UgJWQsIHRyZWUgJWQsIG5vZGUgJWQpIiwgaSwgaiwgayApOworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCBidWYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0IHZhbHVlICovCisgICAgICAgICAgICAgICAgICAgIGlmKCBsYXN0X2lkeCA+PSBjbGFzc2lmaWVyLT5jb3VudCArIDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJUcmVlIHN0cnVjdHVyZSBpcyBicm9rZW46IHRvbyBtYW55IHZhbHVlcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnRba10gPSAtbGFzdF9pZHg7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmFscGhhW2xhc3RfaWR4KytdID0gKGZsb2F0KSBmbi0+ZGF0YS5mOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBmbiA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlX2ZuLElDVl9IQUFSX1JJR0hUX05PREVfTkFNRSkpOworICAgICAgICAgICAgICAgIGlmKCBmbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfSU5UKCBmbi0+dGFnICkgfHwgZm4tPmRhdGEuaSA8PSBrCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBmbi0+ZGF0YS5pID49IHRyZWVfZm4tPmRhdGEuc2VxLT50b3RhbCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgInJpZ2h0IG5vZGUgbXVzdCBiZSB2YWxpZCBub2RlIG51bWJlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0IG5vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+cmlnaHRba10gPSBmbi0+ZGF0YS5pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBmbiA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlX2ZuLAorICAgICAgICAgICAgICAgICAgICAgICAgSUNWX0hBQVJfUklHSFRfVkFMX05BTUUgKSApOworICAgICAgICAgICAgICAgICAgICBpZiggIWZuICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAicmlnaHQgbm9kZSBvciByaWdodCB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihzdGFnZSAlZCwgdHJlZSAlZCwgbm9kZSAlZCkiLCBpLCBqLCBrICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19SRUFMKCBmbi0+dGFnICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJyaWdodCB2YWx1ZSBtdXN0IGJlIHJlYWwgbnVtYmVyLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkKSIsIGksIGosIGsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogcmlnaHQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIGxhc3RfaWR4ID49IGNsYXNzaWZpZXItPmNvdW50ICsgMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgIlRyZWUgc3RydWN0dXJlIGlzIGJyb2tlbjogdG9vIG1hbnkgdmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHN0YWdlICVkLCB0cmVlICVkLCBub2RlICVkKSIsIGksIGosIGsgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+cmlnaHRba10gPSAtbGFzdF9pZHg7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmFscGhhW2xhc3RfaWR4KytdID0gKGZsb2F0KSBmbi0+ZGF0YS5mOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZiggKm5vZGVfZm4gKSwgdHJlZV9yZWFkZXIgKTsKKyAgICAgICAgICAgIH0gLyogZm9yIGVhY2ggbm9kZSAqLworICAgICAgICAgICAgaWYoIGxhc3RfaWR4ICE9IGNsYXNzaWZpZXItPmNvdW50ICsgMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAiVHJlZSBzdHJ1Y3R1cmUgaXMgYnJva2VuOiB0b28gZmV3IHZhbHVlcy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICIoc3RhZ2UgJWQsIHRyZWUgJWQpIiwgaSwgaiApOworICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZiggKnRyZWVfZm4gKSwgdHJlZXNfcmVhZGVyICk7CisgICAgICAgIH0gLyogZm9yIGVhY2ggdHJlZSAqLworCisgICAgICAgIENWX0NBTEwoIGZuID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHN0YWdlX2ZuLCBJQ1ZfSEFBUl9TVEFHRV9USFJFU0hPTERfTkFNRSkpOworICAgICAgICBpZiggIWZuIHx8ICFDVl9OT0RFX0lTX1JFQUwoIGZuLT50YWcgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgInN0YWdlIHRocmVzaG9sZCBtdXN0IGJlIHJlYWwgbnVtYmVyLiAoc3RhZ2UgJWQpIiwgaSApOworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCBidWYgKTsKKyAgICAgICAgfQorICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnRocmVzaG9sZCA9IChmbG9hdCkgZm4tPmRhdGEuZjsKKworICAgICAgICBwYXJlbnQgPSBpIC0gMTsKKyAgICAgICAgbmV4dCA9IC0xOworCisgICAgICAgIENWX0NBTEwoIGZuID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHN0YWdlX2ZuLCBJQ1ZfSEFBUl9QQVJFTlRfTkFNRSApICk7CisgICAgICAgIGlmKCAhZm4gfHwgIUNWX05PREVfSVNfSU5UKCBmbi0+dGFnICkKKyAgICAgICAgICAgIHx8IGZuLT5kYXRhLmkgPCAtMSB8fCBmbi0+ZGF0YS5pID49IGNhc2NhZGUtPmNvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAicGFyZW50IG11c3QgYmUgaW50ZWdlciBudW1iZXIuIChzdGFnZSAlZCkiLCBpICk7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsIGJ1ZiApOworICAgICAgICB9CisgICAgICAgIHBhcmVudCA9IGZuLT5kYXRhLmk7CisgICAgICAgIENWX0NBTEwoIGZuID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHN0YWdlX2ZuLCBJQ1ZfSEFBUl9ORVhUX05BTUUgKSApOworICAgICAgICBpZiggIWZuIHx8ICFDVl9OT0RFX0lTX0lOVCggZm4tPnRhZyApCisgICAgICAgICAgICB8fCBmbi0+ZGF0YS5pIDwgLTEgfHwgZm4tPmRhdGEuaSA+PSBjYXNjYWRlLT5jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgIm5leHQgbXVzdCBiZSBpbnRlZ2VyIG51bWJlci4gKHN0YWdlICVkKSIsIGkgKTsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgYnVmICk7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IGZuLT5kYXRhLmk7CisKKyAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0ubmV4dCA9IG5leHQ7CisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2hpbGQgPSAtMTsKKworICAgICAgICBpZiggcGFyZW50ICE9IC0xICYmIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbcGFyZW50XS5jaGlsZCA9PSAtMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbcGFyZW50XS5jaGlsZCA9IGk7CisgICAgICAgIH0KKworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoICpzdGFnZV9mbiApLCBzdGFnZXNfcmVhZGVyICk7CisgICAgfSAvKiBmb3IgZWFjaCBzdGFnZSAqLworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBjdlJlbGVhc2VIYWFyQ2xhc3NpZmllckNhc2NhZGUoICZjYXNjYWRlICk7CisgICAgICAgIGNhc2NhZGUgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBjYXNjYWRlOworfQorCitzdGF0aWMgdm9pZAoraWN2V3JpdGVIYWFyQ2xhc3NpZmllciggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkF0dHJMaXN0IGF0dHJpYnV0ZXMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZXcml0ZUhhYXJDbGFzc2lmaWVyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGosIGssIGw7CisgICAgY2hhciBidWZbMjU2XTsKKyAgICBjb25zdCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSA9IChjb25zdCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSopIHN0cnVjdF9wdHI7CisKKyAgICAvKiBUT0RPOiBwYXJhbWV0ZXJzIGNoZWNrICovCisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBuYW1lLCBDVl9OT0RFX01BUCwgQ1ZfVFlQRV9OQU1FX0hBQVIsIGF0dHJpYnV0ZXMgKSApOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgSUNWX0hBQVJfU0laRV9OQU1FLCBDVl9OT0RFX1NFUSB8IENWX05PREVfRkxPVyApICk7CisgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggZnMsIE5VTEwsIGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemUud2lkdGggKSApOworICAgIENWX0NBTEwoIGN2V3JpdGVJbnQoIGZzLCBOVUxMLCBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLmhlaWdodCApICk7CisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSApOyAvKiBzaXplICovCisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBJQ1ZfSEFBUl9TVEFHRVNfTkFNRSwgQ1ZfTk9ERV9TRVEgKSApOworICAgIGZvciggaSA9IDA7IGkgPCBjYXNjYWRlLT5jb3VudDsgKytpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIE5VTEwsIENWX05PREVfTUFQICkgKTsKKyAgICAgICAgc3ByaW50ZiggYnVmLCAic3RhZ2UgJWQiLCBpICk7CisgICAgICAgIENWX0NBTEwoIGN2V3JpdGVDb21tZW50KCBmcywgYnVmLCAxICkgKTsKKworICAgICAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBJQ1ZfSEFBUl9UUkVFU19OQU1FLCBDVl9OT0RFX1NFUSApICk7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQ7ICsraiApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2SGFhckNsYXNzaWZpZXIqIHRyZWUgPSAmY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyW2pdOworCisgICAgICAgICAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBOVUxMLCBDVl9OT0RFX1NFUSApICk7CisgICAgICAgICAgICBzcHJpbnRmKCBidWYsICJ0cmVlICVkIiwgaiApOworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZUNvbW1lbnQoIGZzLCBidWYsIDEgKSApOworCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgdHJlZS0+Y291bnQ7ICsrayApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZIYWFyRmVhdHVyZSogZmVhdHVyZSA9ICZ0cmVlLT5oYWFyX2ZlYXR1cmVba107CisKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBOVUxMLCBDVl9OT0RFX01BUCApICk7CisgICAgICAgICAgICAgICAgaWYoIGsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAibm9kZSAlZCIsIGsgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAicm9vdCBub2RlIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdldyaXRlQ29tbWVudCggZnMsIGJ1ZiwgMSApICk7CisKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBJQ1ZfSEFBUl9GRUFUVVJFX05BTUUsIENWX05PREVfTUFQICkgKTsKKworICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIElDVl9IQUFSX1JFQ1RTX05BTUUsIENWX05PREVfU0VRICkgKTsKKyAgICAgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgQ1ZfSEFBUl9GRUFUVVJFX01BWCAmJiBmZWF0dXJlLT5yZWN0W2xdLnIud2lkdGggIT0gMDsgKytsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIE5VTEwsIENWX05PREVfU0VRIHwgQ1ZfTk9ERV9GTE9XICkgKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggIGZzLCBOVUxMLCBmZWF0dXJlLT5yZWN0W2xdLnIueCApICk7CisgICAgICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2V3JpdGVJbnQoICBmcywgTlVMTCwgZmVhdHVyZS0+cmVjdFtsXS5yLnkgKSApOworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdldyaXRlSW50KCAgZnMsIE5VTEwsIGZlYXR1cmUtPnJlY3RbbF0uci53aWR0aCApICk7CisgICAgICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2V3JpdGVJbnQoICBmcywgTlVMTCwgZmVhdHVyZS0+cmVjdFtsXS5yLmhlaWdodCApICk7CisgICAgICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2V3JpdGVSZWFsKCBmcywgTlVMTCwgZmVhdHVyZS0+cmVjdFtsXS53ZWlnaHQgKSApOworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApICk7IC8qIHJlY3QgKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSApOyAvKiByZWN0cyAqLworICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2V3JpdGVJbnQoIGZzLCBJQ1ZfSEFBUl9USUxURURfTkFNRSwgZmVhdHVyZS0+dGlsdGVkICkgKTsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApICk7IC8qIGZlYXR1cmUgKi8KKworICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2V3JpdGVSZWFsKCBmcywgSUNWX0hBQVJfVEhSRVNIT0xEX05BTUUsIHRyZWUtPnRocmVzaG9sZFtrXSkgKTsKKworICAgICAgICAgICAgICAgIGlmKCB0cmVlLT5sZWZ0W2tdID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdldyaXRlSW50KCBmcywgSUNWX0hBQVJfTEVGVF9OT0RFX05BTUUsIHRyZWUtPmxlZnRba10gKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdldyaXRlUmVhbCggZnMsIElDVl9IQUFSX0xFRlRfVkFMX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlLT5hbHBoYVstdHJlZS0+bGVmdFtrXV0gKSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB0cmVlLT5yaWdodFtrXSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggZnMsIElDVl9IQUFSX1JJR0hUX05PREVfTkFNRSwgdHJlZS0+cmlnaHRba10gKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdldyaXRlUmVhbCggZnMsIElDVl9IQUFSX1JJR0hUX1ZBTF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJlZS0+YWxwaGFbLXRyZWUtPnJpZ2h0W2tdXSApICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSApOyAvKiBzcGxpdCAqLworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApICk7IC8qIHRyZWUgKi8KKyAgICAgICAgfQorCisgICAgICAgIENWX0NBTEwoIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICkgKTsgLyogdHJlZXMgKi8KKworICAgICAgICBDVl9DQUxMKCBjdldyaXRlUmVhbCggZnMsIElDVl9IQUFSX1NUQUdFX1RIUkVTSE9MRF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS50aHJlc2hvbGQpICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggZnMsIElDVl9IQUFSX1BBUkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5wYXJlbnQgKSApOworICAgICAgICBDVl9DQUxMKCBjdldyaXRlSW50KCBmcywgSUNWX0hBQVJfTkVYVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5uZXh0ICkgKTsKKworICAgICAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApICk7IC8qIHN0YWdlICovCisgICAgfSAvKiBmb3IgZWFjaCBzdGFnZSAqLworCisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSApOyAvKiBzdGFnZXMgKi8KKyAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApICk7IC8qIHJvb3QgKi8KKworICAgIF9fRU5EX187Cit9CisKK3N0YXRpYyB2b2lkKgoraWN2Q2xvbmVIYWFyQ2xhc3NpZmllciggY29uc3Qgdm9pZCogc3RydWN0X3B0ciApCit7CisgICAgQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUqIGNhc2NhZGUgPSBOVUxMOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsb25lSGFhckNsYXNzaWZpZXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiwgaywgbjsKKyAgICBjb25zdCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZV9zcmMgPQorICAgICAgICAoY29uc3QgQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUqKSBzdHJ1Y3RfcHRyOworCisgICAgbiA9IGNhc2NhZGVfc3JjLT5jb3VudDsKKyAgICBDVl9DQUxMKCBjYXNjYWRlID0gaWN2Q3JlYXRlSGFhckNsYXNzaWZpZXJDYXNjYWRlKG4pICk7CisgICAgY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZSA9IGNhc2NhZGVfc3JjLT5vcmlnX3dpbmRvd19zaXplOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47ICsraSApCisgICAgeworICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnBhcmVudCA9IGNhc2NhZGVfc3JjLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnBhcmVudDsKKyAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5uZXh0ID0gY2FzY2FkZV9zcmMtPnN0YWdlX2NsYXNzaWZpZXJbaV0ubmV4dDsKKyAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jaGlsZCA9IGNhc2NhZGVfc3JjLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNoaWxkOworICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnRocmVzaG9sZCA9IGNhc2NhZGVfc3JjLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnRocmVzaG9sZDsKKworICAgICAgICBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50ID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyID0KKyAgICAgICAgICAgIChDdkhhYXJDbGFzc2lmaWVyKikgY3ZBbGxvYyggY2FzY2FkZV9zcmMtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQKKyAgICAgICAgICAgICAgICAqIHNpemVvZiggY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyWzBdICkgKSApOworCisgICAgICAgIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQgPSBjYXNjYWRlX3NyYy0+c3RhZ2VfY2xhc3NpZmllcltpXS5jb3VudDsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jb3VudDsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyW2pdLmhhYXJfZmVhdHVyZSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jb3VudDsgKytqICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgQ3ZIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllcl9zcmMgPQorICAgICAgICAgICAgICAgICZjYXNjYWRlX3NyYy0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyW2pdOworICAgICAgICAgICAgQ3ZIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9CisgICAgICAgICAgICAgICAgJmNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllcltqXTsKKworICAgICAgICAgICAgY2xhc3NpZmllci0+Y291bnQgPSBjbGFzc2lmaWVyX3NyYy0+Y291bnQ7CisgICAgICAgICAgICBDVl9DQUxMKCBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUgPSAoQ3ZIYWFyRmVhdHVyZSopIGN2QWxsb2MoCisgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+Y291bnQgKiAoIHNpemVvZiggKmNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCAqY2xhc3NpZmllci0+dGhyZXNob2xkICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoICpjbGFzc2lmaWVyLT5sZWZ0ICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoICpjbGFzc2lmaWVyLT5yaWdodCApICkgKworICAgICAgICAgICAgICAgIChjbGFzc2lmaWVyLT5jb3VudCArIDEpICogc2l6ZW9mKCAqY2xhc3NpZmllci0+YWxwaGEgKSApICk7CisgICAgICAgICAgICBjbGFzc2lmaWVyLT50aHJlc2hvbGQgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlK2NsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnQgPSAoaW50KikgKGNsYXNzaWZpZXItPnRocmVzaG9sZCArIGNsYXNzaWZpZXItPmNvdW50KTsKKyAgICAgICAgICAgIGNsYXNzaWZpZXItPnJpZ2h0ID0gKGludCopIChjbGFzc2lmaWVyLT5sZWZ0ICsgY2xhc3NpZmllci0+Y291bnQpOworICAgICAgICAgICAgY2xhc3NpZmllci0+YWxwaGEgPSAoZmxvYXQqKSAoY2xhc3NpZmllci0+cmlnaHQgKyBjbGFzc2lmaWVyLT5jb3VudCk7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY2xhc3NpZmllci0+Y291bnQ7ICsrayApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2tdID0gY2xhc3NpZmllcl9zcmMtPmhhYXJfZmVhdHVyZVtrXTsKKyAgICAgICAgICAgICAgICBjbGFzc2lmaWVyLT50aHJlc2hvbGRba10gPSBjbGFzc2lmaWVyX3NyYy0+dGhyZXNob2xkW2tdOworICAgICAgICAgICAgICAgIGNsYXNzaWZpZXItPmxlZnRba10gPSBjbGFzc2lmaWVyX3NyYy0+bGVmdFtrXTsKKyAgICAgICAgICAgICAgICBjbGFzc2lmaWVyLT5yaWdodFtrXSA9IGNsYXNzaWZpZXJfc3JjLT5yaWdodFtrXTsKKyAgICAgICAgICAgICAgICBjbGFzc2lmaWVyLT5hbHBoYVtrXSA9IGNsYXNzaWZpZXJfc3JjLT5hbHBoYVtrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzaWZpZXItPmFscGhhW2NsYXNzaWZpZXItPmNvdW50XSA9CisgICAgICAgICAgICAgICAgY2xhc3NpZmllcl9zcmMtPmFscGhhW2NsYXNzaWZpZXItPmNvdW50XTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gY2FzY2FkZTsKK30KKworCitDdlR5cGUgaGFhcl90eXBlKCBDVl9UWVBFX05BTUVfSEFBUiwgaWN2SXNIYWFyQ2xhc3NpZmllciwKKyAgICAgICAgICAgICAgICAgIChDdlJlbGVhc2VGdW5jKWN2UmVsZWFzZUhhYXJDbGFzc2lmaWVyQ2FzY2FkZSwKKyAgICAgICAgICAgICAgICAgIGljdlJlYWRIYWFyQ2xhc3NpZmllciwgaWN2V3JpdGVIYWFyQ2xhc3NpZmllciwKKyAgICAgICAgICAgICAgICAgIGljdkNsb25lSGFhckNsYXNzaWZpZXIgKTsKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZoaXN0b2dyYW0uY3BwIGIvY3Yvc3JjL2N2aGlzdG9ncmFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjk1NTJiCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2aGlzdG9ncmFtLmNwcApAQCAtMCwwICsxLDI1MTMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8JCQkgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLwkJICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qIENyZWF0ZXMgbmV3IGhpc3RvZ3JhbSAqLworQ3ZIaXN0b2dyYW0gKgorY3ZDcmVhdGVIaXN0KCBpbnQgZGltcywgaW50ICpzaXplcywgQ3ZIaXN0VHlwZSB0eXBlLCBmbG9hdCoqIHJhbmdlcywgaW50IHVuaWZvcm0gKQoreworICAgIEN2SGlzdG9ncmFtICpoaXN0ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVIaXN0IiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAodW5zaWduZWQpZGltcyA+IENWX01BWF9ESU0gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkT3JkZXIsICJOdW1iZXIgb2YgZGltZW5zaW9ucyBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICBpZiggIXNpemVzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0hlYWRlcklzTnVsbCwgIk51bGwgPHNpemVzPiBwb2ludGVyIiApOworCisgICAgQ1ZfQ0FMTCggaGlzdCA9IChDdkhpc3RvZ3JhbSAqKWN2QWxsb2MoIHNpemVvZiggQ3ZIaXN0b2dyYW0gKSkpOworCisgICAgaGlzdC0+dHlwZSA9IENWX0hJU1RfTUFHSUNfVkFMOworICAgIGhpc3QtPnRocmVzaDIgPSAwOworICAgIGhpc3QtPmJpbnMgPSAwOworICAgIGlmKCB0eXBlID09IENWX0hJU1RfQVJSQVkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaGlzdC0+YmlucyA9IGN2SW5pdE1hdE5ESGVhZGVyKCAmaGlzdC0+bWF0LCBkaW1zLCBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9ISVNUX0RFRkFVTFRfVFlQRSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDcmVhdGVEYXRhKCBoaXN0LT5iaW5zICkpOworICAgIH0KKyAgICBlbHNlIGlmKCB0eXBlID09IENWX0hJU1RfU1BBUlNFICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGhpc3QtPmJpbnMgPSBjdkNyZWF0ZVNwYXJzZU1hdCggZGltcywgc2l6ZXMsIENWX0hJU1RfREVGQVVMVF9UWVBFICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBoaXN0b2dyYW0gdHlwZSIgKTsKKyAgICB9CisKKyAgICBpZiggcmFuZ2VzICkKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTZXRIaXN0QmluUmFuZ2VzKCBoaXN0LCByYW5nZXMsIHVuaWZvcm0gKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlSGlzdCggJmhpc3QgKTsKKworICAgIHJldHVybiBoaXN0OworfQorCisKKy8qIENyZWF0ZXMgaGlzdG9ncmFtIHdyYXBwaW5nIGhlYWRlciBmb3IgZ2l2ZW4gYXJyYXkgKi8KK0NWX0lNUEwgQ3ZIaXN0b2dyYW0qCitjdk1ha2VIaXN0SGVhZGVyRm9yQXJyYXkoIGludCBkaW1zLCBpbnQgKnNpemVzLCBDdkhpc3RvZ3JhbSAqaGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRhdGEsIGZsb2F0ICoqcmFuZ2VzLCBpbnQgdW5pZm9ybSApCit7CisgICAgQ3ZIaXN0b2dyYW0qIHJlc3VsdCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1ha2VIaXN0SGVhZGVyRm9yQXJyYXkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWhpc3QgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgaGlzdG9ncmFtIGhlYWRlciBwb2ludGVyIiApOworCisgICAgaWYoICFkYXRhICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGRhdGEgcG9pbnRlciIgKTsKKworICAgIGhpc3QtPnRocmVzaDIgPSAwOworICAgIGhpc3QtPnR5cGUgPSBDVl9ISVNUX01BR0lDX1ZBTDsKKyAgICBDVl9DQUxMKCBoaXN0LT5iaW5zID0gY3ZJbml0TWF0TkRIZWFkZXIoICZoaXN0LT5tYXQsIGRpbXMsIHNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfSElTVF9ERUZBVUxUX1RZUEUsIGRhdGEgKSk7CisKKyAgICBpZiggcmFuZ2VzICkKKyAgICB7CisgICAgICAgIGlmKCAhdW5pZm9ybSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25seSB1bmlmb3JtIGJpbiByYW5nZXMgY2FuIGJlIHVzZWQgaGVyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHRvIGF2b2lkIG1lbW9yeSBhbGxvY2F0aW9uKSIgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTZXRIaXN0QmluUmFuZ2VzKCBoaXN0LCByYW5nZXMsIHVuaWZvcm0gKSk7CisgICAgfQorCisgICAgcmVzdWx0ID0gaGlzdDsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgJiYgaGlzdCApCisgICAgeworICAgICAgICBoaXN0LT50eXBlID0gMDsKKyAgICAgICAgaGlzdC0+YmlucyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZUhpc3QoIEN2SGlzdG9ncmFtICoqaGlzdCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VIaXN0IiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhaGlzdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICpoaXN0ICkKKyAgICB7CisgICAgICAgIEN2SGlzdG9ncmFtKiB0ZW1wID0gKmhpc3Q7CisKKyAgICAgICAgaWYoICFDVl9JU19ISVNUKHRlbXApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaGlzdG9ncmFtIGhlYWRlciIgKTsKKworICAgICAgICAqaGlzdCA9IDA7CisKKyAgICAgICAgaWYoIENWX0lTX1NQQVJTRV9ISVNUKCB0ZW1wICkpCisgICAgICAgICAgICBjdlJlbGVhc2UoICZ0ZW1wLT5iaW5zICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3ZSZWxlYXNlRGF0YSggdGVtcC0+YmlucyApOworICAgICAgICAgICAgdGVtcC0+YmlucyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCB0ZW1wLT50aHJlc2gyICkKKyAgICAgICAgICAgIGN2RnJlZSggJnRlbXAtPnRocmVzaDIgKTsKKworICAgICAgICBjdkZyZWUoICZ0ZW1wICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworQ1ZfSU1QTCB2b2lkCitjdkNsZWFySGlzdCggQ3ZIaXN0b2dyYW0gKmhpc3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDbGVhckhpc3QiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFDVl9JU19ISVNUKGhpc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaGlzdG9ncmFtIGhlYWRlciIgKTsKKworICAgIGN2WmVybyggaGlzdC0+YmlucyApOworCisgICAgX19FTkRfXzsKK30KKworCisvLyBDbGVhcnMgaGlzdG9ncmFtIGJpbnMgdGhhdCBhcmUgYmVsb3cgdGhhbiB0aHJlc2hvbGQKK0NWX0lNUEwgdm9pZAorY3ZUaHJlc2hIaXN0KCBDdkhpc3RvZ3JhbSogaGlzdCwgZG91YmxlIHRocmVzaCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlRocmVzaEhpc3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIUNWX0lTX0hJU1QoaGlzdCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBoaXN0b2dyYW0gaGVhZGVyIiApOworCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKGhpc3QtPmJpbnMpICkKKyAgICB7CisgICAgICAgIEN2TWF0IG1hdDsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZHZXRNYXQoIGhpc3QtPmJpbnMsICZtYXQsIDAsIDEgKSk7CisgICAgICAgIENWX0NBTEwoIGN2VGhyZXNob2xkKCAmbWF0LCAmbWF0LCB0aHJlc2gsIDAsIENWX1RIUkVTSF9UT1pFUk8gKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2U3BhcnNlTWF0KiBtYXQgPSAoQ3ZTcGFyc2VNYXQqKWhpc3QtPmJpbnM7CisgICAgICAgIEN2U3BhcnNlTWF0SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIEN2U3BhcnNlTm9kZSAqbm9kZTsKKyAgICAgICAgCisgICAgICAgIGZvciggbm9kZSA9IGN2SW5pdFNwYXJzZU1hdEl0ZXJhdG9yKCBtYXQsICZpdGVyYXRvciApOworICAgICAgICAgICAgIG5vZGUgIT0gMDsgbm9kZSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogdmFsID0gKGZsb2F0KilDVl9OT0RFX1ZBTCggbWF0LCBub2RlICk7CisgICAgICAgICAgICBpZiggKnZhbCA8PSB0aHJlc2ggKQorICAgICAgICAgICAgICAgICp2YWwgPSAwOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIF9fRU5EX187Cit9CisKKworLy8gTm9ybWFsaXplcyBoaXN0b2dyYW0gKG1ha2Ugc3VtIG9mIHRoZSBoaXN0b2dyYW0gYmlucyA9PSBmYWN0b3IpCitDVl9JTVBMIHZvaWQKK2N2Tm9ybWFsaXplSGlzdCggQ3ZIaXN0b2dyYW0qIGhpc3QsIGRvdWJsZSBmYWN0b3IgKQoreworICAgIGRvdWJsZSBzdW0gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk5vcm1hbGl6ZUhpc3QiICk7CisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFDVl9JU19ISVNUKGhpc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaGlzdG9ncmFtIGhlYWRlciIgKTsKKworICAgIGlmKCAhQ1ZfSVNfU1BBUlNFX0hJU1QoaGlzdCkgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgbWF0OworICAgICAgICBDVl9DQUxMKCBjdkdldE1hdCggaGlzdC0+YmlucywgJm1hdCwgMCwgMSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggc3VtID0gY3ZTdW0oICZtYXQgKS52YWxbMF0gKTsKKyAgICAgICAgaWYoIGZhYnMoc3VtKSA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgICAgIHN1bSA9IDE7CisgICAgICAgIENWX0NBTEwoIGN2U2NhbGUoICZtYXQsICZtYXQsIGZhY3Rvci9zdW0sIDAgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2U3BhcnNlTWF0KiBtYXQgPSAoQ3ZTcGFyc2VNYXQqKWhpc3QtPmJpbnM7CisgICAgICAgIEN2U3BhcnNlTWF0SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIEN2U3BhcnNlTm9kZSAqbm9kZTsKKyAgICAgICAgZmxvYXQgc2NhbGU7CisgICAgICAgIAorICAgICAgICBmb3IoIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggbWF0LCAmaXRlcmF0b3IgKTsKKyAgICAgICAgICAgICBub2RlICE9IDA7IG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtICs9ICooZmxvYXQqKUNWX05PREVfVkFMKG1hdCxub2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBmYWJzKHN1bSkgPCBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICBzdW0gPSAxOworICAgICAgICBzY2FsZSA9IChmbG9hdCkoZmFjdG9yL3N1bSk7CisKKyAgICAgICAgZm9yKCBub2RlID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdCwgJml0ZXJhdG9yICk7CisgICAgICAgICAgICAgbm9kZSAhPSAwOyBub2RlID0gY3ZHZXROZXh0U3BhcnNlTm9kZSggJml0ZXJhdG9yICkpCisgICAgICAgIHsKKyAgICAgICAgICAgICooZmxvYXQqKUNWX05PREVfVkFMKG1hdCxub2RlKSAqPSBzY2FsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gUmV0cmlldmVzIGhpc3RvZ3JhbSBnbG9iYWwgbWluLCBtYXggYW5kIHRoZWlyIHBvc2l0aW9ucworQ1ZfSU1QTCB2b2lkCitjdkdldE1pbk1heEhpc3RWYWx1ZSggY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3QsCisgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnZhbHVlX21pbiwgZmxvYXQqIHZhbHVlX21heCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQqIGlkeF9taW4sIGludCogaWR4X21heCApCit7CisgICAgZG91YmxlIG1pblZhbCwgbWF4VmFsOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldE1pbk1heEhpc3RWYWx1ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBkaW1zLCBzaXplW0NWX01BWF9ESU1dOworCisgICAgaWYoICFDVl9JU19ISVNUKGhpc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaGlzdG9ncmFtIGhlYWRlciIgKTsKKworICAgIGRpbXMgPSBjdkdldERpbXMoIGhpc3QtPmJpbnMsIHNpemUgKTsKKworICAgIGlmKCAhQ1ZfSVNfU1BBUlNFX0hJU1QoaGlzdCkgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgbWF0OworICAgICAgICBDdlBvaW50IG1pblB0LCBtYXhQdDsKKworICAgICAgICBDVl9DQUxMKCBjdkdldE1hdCggaGlzdC0+YmlucywgJm1hdCwgMCwgMSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZNaW5NYXhMb2MoICZtYXQsICZtaW5WYWwsICZtYXhWYWwsICZtaW5QdCwgJm1heFB0ICkpOworCisgICAgICAgIGlmKCBkaW1zID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaWR4X21pbiApCisgICAgICAgICAgICAgICAgKmlkeF9taW4gPSBtaW5QdC55ICsgbWluUHQueDsKKyAgICAgICAgICAgIGlmKCBpZHhfbWF4ICkKKyAgICAgICAgICAgICAgICAqaWR4X21heCA9IG1heFB0LnkgKyBtYXhQdC54OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGRpbXMgPT0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpZHhfbWluICkKKyAgICAgICAgICAgICAgICBpZHhfbWluWzBdID0gbWluUHQueSwgaWR4X21pblsxXSA9IG1pblB0Lng7CisgICAgICAgICAgICBpZiggaWR4X21heCApCisgICAgICAgICAgICAgICAgaWR4X21heFswXSA9IG1heFB0LnksIGlkeF9tYXhbMV0gPSBtYXhQdC54OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGlkeF9taW4gfHwgaWR4X21heCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpbWluID0gbWluUHQueSptYXQuY29scyArIG1pblB0Lng7CisgICAgICAgICAgICBpbnQgaW1heCA9IG1heFB0LnkqbWF0LmNvbHMgKyBtYXhQdC54OworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gZGltcyAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaWR4X21pbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGltaW4gLyBzaXplW2ldOworICAgICAgICAgICAgICAgICAgICBpZHhfbWluW2ldID0gaW1pbiAtIHQqc2l6ZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaW1pbiA9IHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGlkeF9tYXggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHQgPSBpbWF4IC8gc2l6ZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgaWR4X21heFtpXSA9IGltYXggLSB0KnNpemVbaV07CisgICAgICAgICAgICAgICAgICAgIGltYXggPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlNwYXJzZU1hdCogbWF0ID0gKEN2U3BhcnNlTWF0KiloaXN0LT5iaW5zOworICAgICAgICBDdlNwYXJzZU1hdEl0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICBDdlNwYXJzZU5vZGUgKm5vZGU7CisgICAgICAgIGludCBtaW52ID0gSU5UX01BWDsKKyAgICAgICAgaW50IG1heHYgPSBJTlRfTUlOOworICAgICAgICBDdlNwYXJzZU5vZGUqIG1pbk5vZGUgPSAwOworICAgICAgICBDdlNwYXJzZU5vZGUqIG1heE5vZGUgPSAwOworICAgICAgICBjb25zdCBpbnQgKl9pZHhfbWluID0gMCwgKl9pZHhfbWF4ID0gMDsKKyAgICAgICAgQ3YzMnN1ZiBtOworCisgICAgICAgIGZvciggbm9kZSA9IGN2SW5pdFNwYXJzZU1hdEl0ZXJhdG9yKCBtYXQsICZpdGVyYXRvciApOworICAgICAgICAgICAgIG5vZGUgIT0gMDsgbm9kZSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsdWUgPSAqKGludCopQ1ZfTk9ERV9WQUwobWF0LG5vZGUpOworICAgICAgICAgICAgdmFsdWUgPSBDVl9UT0dHTEVfRkxUKHZhbHVlKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZSA8IG1pbnYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pbnYgPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtaW5Ob2RlID0gbm9kZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHZhbHVlID4gbWF4diApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4diA9IHZhbHVlOworICAgICAgICAgICAgICAgIG1heE5vZGUgPSBub2RlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIG1pbk5vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICBfaWR4X21pbiA9IENWX05PREVfSURYKG1hdCxtaW5Ob2RlKTsKKyAgICAgICAgICAgIF9pZHhfbWF4ID0gQ1ZfTk9ERV9JRFgobWF0LG1heE5vZGUpOworICAgICAgICAgICAgbS5pID0gQ1ZfVE9HR0xFX0ZMVChtaW52KTsgbWluVmFsID0gbS5mOworICAgICAgICAgICAgbS5pID0gQ1ZfVE9HR0xFX0ZMVChtYXh2KTsgbWF4VmFsID0gbS5mOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbWluVmFsID0gbWF4VmFsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaWR4X21pbiApCisgICAgICAgICAgICAgICAgaWR4X21pbltpXSA9IF9pZHhfbWluID8gX2lkeF9taW5baV0gOiAtMTsKKyAgICAgICAgICAgIGlmKCBpZHhfbWF4ICkKKyAgICAgICAgICAgICAgICBpZHhfbWF4W2ldID0gX2lkeF9tYXggPyBfaWR4X21heFtpXSA6IC0xOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHZhbHVlX21pbiApCisgICAgICAgICp2YWx1ZV9taW4gPSAoZmxvYXQpbWluVmFsOworCisgICAgaWYoIHZhbHVlX21heCApCisgICAgICAgICp2YWx1ZV9tYXggPSAoZmxvYXQpbWF4VmFsOworCisgICAgX19FTkRfXzsKK30KKworCisvLyBDb21wYXJlcyB0d28gaGlzdG9ncmFtcyB1c2luZyBvbmUgb2YgYSBmZXcgbWV0aG9kcworQ1ZfSU1QTCBkb3VibGUKK2N2Q29tcGFyZUhpc3QoIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0MSwKKyAgICAgICAgICAgICAgIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0MiwKKyAgICAgICAgICAgICAgIGludCBtZXRob2QgKQoreworICAgIGRvdWJsZSBfcmVzdWx0ID0gLTE7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbXBhcmVIaXN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGRpbXMxLCBkaW1zMjsKKyAgICBpbnQgc2l6ZTFbQ1ZfTUFYX0RJTV0sIHNpemUyW0NWX01BWF9ESU1dLCB0b3RhbCA9IDE7CisgICAgZG91YmxlIHJlc3VsdCA9IDA7CisgICAgICAgIAorICAgIGlmKCAhQ1ZfSVNfSElTVChoaXN0MSkgfHwgIUNWX0lTX0hJU1QoaGlzdDIpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaGlzdG9ncmFtIGhlYWRlcltzXSIgKTsKKworICAgIGlmKCBDVl9JU19TUEFSU0VfTUFUKGhpc3QxLT5iaW5zKSAhPSBDVl9JU19TUEFSU0VfTUFUKGhpc3QyLT5iaW5zKSkKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIk9uZSBvZiBoaXN0b2dyYW1zIGlzIHNwYXJzZSBhbmQgb3RoZXIgaXMgbm90Iik7CisKKyAgICBDVl9DQUxMKCBkaW1zMSA9IGN2R2V0RGltcyggaGlzdDEtPmJpbnMsIHNpemUxICkpOworICAgIENWX0NBTEwoIGRpbXMyID0gY3ZHZXREaW1zKCBoaXN0Mi0+Ymlucywgc2l6ZTIgKSk7CisgICAgCisgICAgaWYoIGRpbXMxICE9IGRpbXMyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICAgIlRoZSBoaXN0b2dyYW1zIGhhdmUgZGlmZmVyZW50IG51bWJlcnMgb2YgZGltZW5zaW9ucyIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zMTsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBzaXplMVtpXSAhPSBzaXplMltpXSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJUaGUgaGlzdG9ncmFtcyBoYXZlIGRpZmZlcmVudCBzaXplcyIgKTsKKyAgICAgICAgdG90YWwgKj0gc2l6ZTFbaV07CisgICAgfQorCisKKyAgICBpZiggIUNWX0lTX1NQQVJTRV9NQVQoaGlzdDEtPmJpbnMpKQorICAgIHsKKyAgICAgICAgdW5pb24geyBmbG9hdCogZmw7IHVjaGFyKiBwdHI7IH0gdjsKKyAgICAgICAgZmxvYXQgKnB0cjEsICpwdHIyOworICAgICAgICB2LmZsID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZHZXRSYXdEYXRhKCBoaXN0MS0+YmlucywgJnYucHRyICkpOworICAgICAgICBwdHIxID0gdi5mbDsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZHZXRSYXdEYXRhKCBoaXN0Mi0+YmlucywgJnYucHRyICkpOworICAgICAgICBwdHIyID0gdi5mbDsKKworICAgICAgICBzd2l0Y2goIG1ldGhvZCApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBDVl9DT01QX0NISVNRUjoKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYSA9IHB0cjFbaV0gLSBwdHIyW2ldOworICAgICAgICAgICAgICAgIGRvdWJsZSBiID0gcHRyMVtpXSArIHB0cjJbaV07CisgICAgICAgICAgICAgICAgaWYoIGZhYnMoYikgPiBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBhKmEvYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWX0NPTVBfQ09SUkVMOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IDAsIHMxMSA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHMyID0gMCwgczIyID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgczEyID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgbnVtLCBkZW5vbTIsIHNjYWxlID0gMS4vdG90YWw7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEgPSBwdHIxW2ldOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYiA9IHB0cjJbaV07CisKKyAgICAgICAgICAgICAgICAgICAgczEyICs9IGEqYjsKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gYTsKKyAgICAgICAgICAgICAgICAgICAgczExICs9IGEqYTsKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gYjsKKyAgICAgICAgICAgICAgICAgICAgczIyICs9IGIqYjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBudW0gPSBzMTIgLSBzMSpzMipzY2FsZTsKKyAgICAgICAgICAgICAgICBkZW5vbTIgPSAoczExIC0gczEqczEqc2NhbGUpKihzMjIgLSBzMipzMipzY2FsZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFicyhkZW5vbTIpID4gREJMX0VQU0lMT04gPyBudW0vc3FydChkZW5vbTIpIDogMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWX0NPTVBfSU5URVJTRUNUOgorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IGEgPSBwdHIxW2ldOworICAgICAgICAgICAgICAgIGZsb2F0IGIgPSBwdHIyW2ldOworICAgICAgICAgICAgICAgIGlmKCBhIDw9IGIgKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfQ09NUF9CSEFUVEFDSEFSWVlBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IDAsIHMyID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSA9IHB0cjFbaV07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiID0gcHRyMltpXTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNxcnQoYSpiKTsKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gYTsKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gYjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgczEgKj0gczI7CisgICAgICAgICAgICAgICAgczEgPSBmYWJzKHMxKSA+IEZMVF9FUFNJTE9OID8gMS4vc3FydChzMSkgOiAxLjsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAxLiAtIHJlc3VsdCpzMTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBzcXJ0KE1BWChyZXN1bHQsMC4pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24gY29tcGFyaXNvbiBtZXRob2QiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VNYXQqIG1hdDEgPSAoQ3ZTcGFyc2VNYXQqKShoaXN0MS0+Ymlucyk7CisgICAgICAgIEN2U3BhcnNlTWF0KiBtYXQyID0gKEN2U3BhcnNlTWF0KikoaGlzdDItPmJpbnMpOworICAgICAgICBDdlNwYXJzZU1hdEl0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICBDdlNwYXJzZU5vZGUgKm5vZGUxLCAqbm9kZTI7CisKKyAgICAgICAgaWYoIG1hdDEtPmhlYXAtPmFjdGl2ZV9jb3VudCA+IG1hdDItPmhlYXAtPmFjdGl2ZV9jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U3BhcnNlTWF0KiB0OworICAgICAgICAgICAgQ1ZfU1dBUCggbWF0MSwgbWF0MiwgdCApOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoKCBtZXRob2QgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfQ09NUF9DSElTUVI6CisgICAgICAgICAgICBmb3IoIG5vZGUxID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdDEsICZpdGVyYXRvciApOworICAgICAgICAgICAgICAgICBub2RlMSAhPSAwOyBub2RlMSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2MSA9ICooZmxvYXQqKUNWX05PREVfVkFMKG1hdDEsbm9kZTEpOworICAgICAgICAgICAgICAgIHVjaGFyKiBub2RlMl9kYXRhID0gY3ZQdHJORCggbWF0MiwgQ1ZfTk9ERV9JRFgobWF0MSxub2RlMSksIDAsIDAsICZub2RlMS0+aGFzaHZhbCApOworICAgICAgICAgICAgICAgIGlmKCAhbm9kZTJfZGF0YSApCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSB2MTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdjIgPSAqKGZsb2F0Kilub2RlMl9kYXRhOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSA9IHYxIC0gdjI7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiID0gdjEgKyB2MjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMoYikgPiBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gYSphL2I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIG5vZGUyID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdDIsICZpdGVyYXRvciApOworICAgICAgICAgICAgICAgICBub2RlMiAhPSAwOyBub2RlMiA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2MiA9ICooZmxvYXQqKUNWX05PREVfVkFMKG1hdDIsbm9kZTIpOworICAgICAgICAgICAgICAgIGlmKCAhY3ZQdHJORCggbWF0MSwgQ1ZfTk9ERV9JRFgobWF0Mixub2RlMiksIDAsIDAsICZub2RlMi0+aGFzaHZhbCApKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl9DT01QX0NPUlJFTDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgczEgPSAwLCBzMTEgPSAwOworICAgICAgICAgICAgICAgIGRvdWJsZSBzMiA9IDAsIHMyMiA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIHMxMiA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlIG51bSwgZGVub20yLCBzY2FsZSA9IDEuL3RvdGFsOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciggbm9kZTEgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggbWF0MSwgJml0ZXJhdG9yICk7CisgICAgICAgICAgICAgICAgICAgICBub2RlMSAhPSAwOyBub2RlMSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYxID0gKihmbG9hdCopQ1ZfTk9ERV9WQUwobWF0MSxub2RlMSk7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBub2RlMl9kYXRhID0gY3ZQdHJORCggbWF0MiwgQ1ZfTk9ERV9JRFgobWF0MSxub2RlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgJm5vZGUxLT5oYXNodmFsICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBub2RlMl9kYXRhICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYyID0gKihmbG9hdCopbm9kZTJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMxMiArPSB2MSp2MjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzMSArPSB2MTsKKyAgICAgICAgICAgICAgICAgICAgczExICs9IHYxKnYxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggbm9kZTIgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggbWF0MiwgJml0ZXJhdG9yICk7CisgICAgICAgICAgICAgICAgICAgICBub2RlMiAhPSAwOyBub2RlMiA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHYyID0gKihmbG9hdCopQ1ZfTk9ERV9WQUwobWF0Mixub2RlMik7CisgICAgICAgICAgICAgICAgICAgIHMyICs9IHYyOworICAgICAgICAgICAgICAgICAgICBzMjIgKz0gdjIqdjI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbnVtID0gczEyIC0gczEqczIqc2NhbGU7CisgICAgICAgICAgICAgICAgZGVub20yID0gKHMxMSAtIHMxKnMxKnNjYWxlKSooczIyIC0gczIqczIqc2NhbGUpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhYnMoZGVub20yKSA+IERCTF9FUFNJTE9OID8gbnVtL3NxcnQoZGVub20yKSA6IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl9DT01QX0lOVEVSU0VDVDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIG5vZGUxID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdDEsICZpdGVyYXRvciApOworICAgICAgICAgICAgICAgICAgICAgbm9kZTEgIT0gMDsgbm9kZTEgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHYxID0gKihmbG9hdCopQ1ZfTk9ERV9WQUwobWF0MSxub2RlMSk7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBub2RlMl9kYXRhID0gY3ZQdHJORCggbWF0MiwgQ1ZfTk9ERV9JRFgobWF0MSxub2RlMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgJm5vZGUxLT5oYXNodmFsICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBub2RlMl9kYXRhICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdjIgPSAqKGZsb2F0Kilub2RlMl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHYxIDw9IHYyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gdjE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHYyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfQ09NUF9CSEFUVEFDSEFSWVlBOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzMSA9IDAsIHMyID0gMDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IoIG5vZGUxID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdDEsICZpdGVyYXRvciApOworICAgICAgICAgICAgICAgICAgICAgbm9kZTEgIT0gMDsgbm9kZTEgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2MSA9ICooZmxvYXQqKUNWX05PREVfVkFMKG1hdDEsbm9kZTEpOworICAgICAgICAgICAgICAgICAgICB1Y2hhciogbm9kZTJfZGF0YSA9IGN2UHRyTkQoIG1hdDIsIENWX05PREVfSURYKG1hdDEsbm9kZTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsICZub2RlMS0+aGFzaHZhbCApOworICAgICAgICAgICAgICAgICAgICBzMSArPSB2MTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5vZGUyX2RhdGEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdjIgPSAqKGZsb2F0Kilub2RlMl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICs9IHNxcnQodjEgKiB2Mik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIG5vZGUxID0gY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIG1hdDIsICZpdGVyYXRvciApOworICAgICAgICAgICAgICAgICAgICAgbm9kZTEgIT0gMDsgbm9kZTEgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2MiA9ICooZmxvYXQqKUNWX05PREVfVkFMKG1hdDIsbm9kZTEpOworICAgICAgICAgICAgICAgICAgICBzMiArPSB2MjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzMSAqPSBzMjsKKyAgICAgICAgICAgICAgICBzMSA9IGZhYnMoczEpID4gRkxUX0VQU0lMT04gPyAxLi9zcXJ0KHMxKSA6IDEuOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IDEuIC0gcmVzdWx0KnMxOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNxcnQoTUFYKHJlc3VsdCwwLikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93biBjb21wYXJpc29uIG1ldGhvZCIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9yZXN1bHQgPSByZXN1bHQ7CisgICAgCisgICAgX19FTkRfXzsKKyAgICAKKyAgICByZXR1cm4gX3Jlc3VsdDsKK30KKworLy8gY29waWVzIG9uZSBoaXN0b2dyYW0gdG8gYW5vdGhlcgorQ1ZfSU1QTCB2b2lkCitjdkNvcHlIaXN0KCBjb25zdCBDdkhpc3RvZ3JhbSogc3JjLCBDdkhpc3RvZ3JhbSoqIF9kc3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb3B5SGlzdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBlcSA9IDA7CisgICAgaW50IGlzX3NwYXJzZTsKKyAgICBpbnQgaSwgZGltczEsIGRpbXMyOworICAgIGludCBzaXplMVtDVl9NQVhfRElNXSwgc2l6ZTJbQ1ZfTUFYX0RJTV0sIHRvdGFsID0gMTsKKyAgICBmbG9hdCogcmFuZ2VzW0NWX01BWF9ESU1dOworICAgIGZsb2F0KiogdGhyZXNoID0gMDsKKyAgICBDdkhpc3RvZ3JhbSogZHN0OworICAgIAorICAgIGlmKCAhX2RzdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiRGVzdGluYXRpb24gZG91YmxlIHBvaW50ZXIgaXMgTlVMTCIgKTsKKworICAgIGRzdCA9ICpfZHN0OworCisgICAgaWYoICFDVl9JU19ISVNUKHNyYykgfHwgKGRzdCAmJiAhQ1ZfSVNfSElTVChkc3QpKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGhpc3RvZ3JhbSBoZWFkZXJbc10iICk7CisKKyAgICBpc19zcGFyc2UgPSBDVl9JU19TUEFSU0VfTUFUKHNyYy0+Ymlucyk7CisgICAgQ1ZfQ0FMTCggZGltczEgPSBjdkdldERpbXMoIHNyYy0+Ymlucywgc2l6ZTEgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IGRpbXMxOyBpKysgKQorICAgICAgICB0b3RhbCAqPSBzaXplMVtpXTsKKworICAgIGlmKCBkc3QgJiYgaXNfc3BhcnNlID09IENWX0lTX1NQQVJTRV9NQVQoZHN0LT5iaW5zKSkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRpbXMyID0gY3ZHZXREaW1zKCBkc3QtPmJpbnMsIHNpemUyICkpOworICAgIAorICAgICAgICBpZiggZGltczEgPT0gZGltczIgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczE7IGkrKyApCisgICAgICAgICAgICAgICAgaWYoIHNpemUxW2ldICE9IHNpemUyW2ldICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBlcSA9IGkgPT0gZGltczE7CisgICAgfQorCisgICAgaWYoICFlcSApCisgICAgeworICAgICAgICBjdlJlbGVhc2VIaXN0KCBfZHN0ICk7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2Q3JlYXRlSGlzdCggZGltczEsIHNpemUxLAorICAgICAgICAgICAgICAgICAhaXNfc3BhcnNlID8gQ1ZfSElTVF9BUlJBWSA6IENWX0hJU1RfU1BBUlNFLCAwLCAwICkpOworICAgICAgICAqX2RzdCA9IGRzdDsKKyAgICB9CisKKyAgICBpZiggQ1ZfSElTVF9IQVNfUkFOR0VTKCBzcmMgKSkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19VTklGT1JNX0hJU1QoIHNyYyApKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczE7IGkrKyApCisgICAgICAgICAgICAgICAgcmFuZ2VzW2ldID0gKGZsb2F0KilzcmMtPnRocmVzaFtpXTsKKyAgICAgICAgICAgIHRocmVzaCA9IHJhbmdlczsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJlc2ggPSBzcmMtPnRocmVzaDI7CisgICAgICAgIENWX0NBTEwoIGN2U2V0SGlzdEJpblJhbmdlcyggZHN0LCB0aHJlc2gsIENWX0lTX1VOSUZPUk1fSElTVChzcmMpKSk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggY3ZDb3B5KCBzcmMtPmJpbnMsIGRzdC0+YmlucyApKTsKKyAgICAKKyAgICBfX0VORF9fOworfQorCisKKy8vIFNldHMgYSB2YWx1ZSByYW5nZSBmb3IgZXZlcnkgaGlzdG9ncmFtIGJpbgorQ1ZfSU1QTCB2b2lkCitjdlNldEhpc3RCaW5SYW5nZXMoIEN2SGlzdG9ncmFtKiBoaXN0LCBmbG9hdCoqIHJhbmdlcywgaW50IHVuaWZvcm0gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRIaXN0QmluUmFuZ2VzIiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGludCBkaW1zLCBzaXplW0NWX01BWF9ESU1dLCB0b3RhbCA9IDA7CisgICAgaW50IGksIGo7CisKKyAgICBpZiggIXJhbmdlcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCByYW5nZXMgcG9pbnRlciIgKTsKKworICAgIGlmKCAhQ1ZfSVNfSElTVChoaXN0KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGhpc3RvZ3JhbSBoZWFkZXIiICk7CisKKyAgICBDVl9DQUxMKCBkaW1zID0gY3ZHZXREaW1zKCBoaXN0LT5iaW5zLCBzaXplICkpOworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICB0b3RhbCArPSBzaXplW2ldKzE7CisgICAgCisgICAgaWYoIHVuaWZvcm0gKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhcmFuZ2VzW2ldICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk9uZSBvZiA8cmFuZ2VzPiBlbGVtZW50cyBpcyBOVUxMIiApOworICAgICAgICAgICAgaGlzdC0+dGhyZXNoW2ldWzBdID0gcmFuZ2VzW2ldWzBdOworICAgICAgICAgICAgaGlzdC0+dGhyZXNoW2ldWzFdID0gcmFuZ2VzW2ldWzFdOworICAgICAgICB9CisKKyAgICAgICAgaGlzdC0+dHlwZSB8PSBDVl9ISVNUX1VOSUZPUk1fRkxBRyArIENWX0hJU1RfUkFOR0VTX0ZMQUc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZsb2F0KiBkaW1fcmFuZ2VzOworCisgICAgICAgIGlmKCAhaGlzdC0+dGhyZXNoMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGhpc3QtPnRocmVzaDIgPSAoZmxvYXQqKiljdkFsbG9jKAorICAgICAgICAgICAgICAgICAgICAgICAgZGltcypzaXplb2YoaGlzdC0+dGhyZXNoMlswXSkrCisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCpzaXplb2YoaGlzdC0+dGhyZXNoMlswXVswXSkpKTsKKyAgICAgICAgfQorICAgICAgICBkaW1fcmFuZ2VzID0gKGZsb2F0KikoaGlzdC0+dGhyZXNoMiArIGRpbXMpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB2YWwwID0gLUZMVF9NQVg7CisKKyAgICAgICAgICAgIGlmKCAhcmFuZ2VzW2ldICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk9uZSBvZiA8cmFuZ2VzPiBlbGVtZW50cyBpcyBOVUxMIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemVbaV07IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gcmFuZ2VzW2ldW2pdOworICAgICAgICAgICAgICAgIGlmKCB2YWwgPD0gdmFsMCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKENWX1N0c091dE9mUmFuZ2UsICJCaW4gcmFuZ2VzIHNob3VsZCBnbyBpbiBhc2NlbnRpbmcgb3JkZXIiKTsKKyAgICAgICAgICAgICAgICB2YWwwID0gZGltX3Jhbmdlc1tqXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGlzdC0+dGhyZXNoMltpXSA9IGRpbV9yYW5nZXM7CisgICAgICAgICAgICBkaW1fcmFuZ2VzICs9IHNpemVbaV0gKyAxOworICAgICAgICB9CisKKyAgICAgICAgaGlzdC0+dHlwZSB8PSBDVl9ISVNUX1JBTkdFU19GTEFHOworICAgICAgICBoaXN0LT50eXBlICY9IH5DVl9ISVNUX1VOSUZPUk1fRkxBRzsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKyNkZWZpbmUgIElDVl9ISVNUX0RVTU1ZX0lEWCAgKElOVF9NSU4vMykKKworc3RhdGljIEN2U3RhdHVzCitpY3ZDYWxjSGlzdExvb2t1cFRhYmxlczh1KCBjb25zdCBDdkhpc3RvZ3JhbSogaGlzdCwgaW50IGRpbXMsIGludCogc2l6ZSwgaW50KiB0YWIgKQoreworICAgIGNvbnN0IGludCBsbyA9IDAsIGhpID0gMjU2OworICAgIGludCBpc19zcGFyc2UgPSBDVl9JU19TUEFSU0VfSElTVCggaGlzdCApOworICAgIGludCBoYXZlX3JhbmdlID0gQ1ZfSElTVF9IQVNfUkFOR0VTKGhpc3QpOworICAgIGludCBpLCBqOworICAgIAorICAgIGlmKCAhaGF2ZV9yYW5nZSB8fCBDVl9JU19VTklGT1JNX0hJU1QoaGlzdCkpCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGEgPSBoYXZlX3JhbmdlID8gaGlzdC0+dGhyZXNoW2ldWzBdIDogMDsKKyAgICAgICAgICAgIGRvdWJsZSBiID0gaGF2ZV9yYW5nZSA/IGhpc3QtPnRocmVzaFtpXVsxXSA6IDI1NjsKKyAgICAgICAgICAgIGludCBzeiA9IHNpemVbaV07CisgICAgICAgICAgICBkb3VibGUgc2NhbGUgPSBzei8oYiAtIGEpOworICAgICAgICAgICAgaW50IHN0ZXAgPSAxOworCisgICAgICAgICAgICBpZiggIWlzX3NwYXJzZSApCisgICAgICAgICAgICAgICAgc3RlcCA9ICgoQ3ZNYXRORCopKGhpc3QtPmJpbnMpKS0+ZGltW2ldLnN0ZXAvc2l6ZW9mKGZsb2F0KTsKKworICAgICAgICAgICAgZm9yKCBqID0gbG87IGogPCBoaTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gY3ZGbG9vcigoaiAtIGEpKnNjYWxlKTsKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgIGlkeCAqPSBzdGVwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gSUNWX0hJU1RfRFVNTVlfSURYOworCisgICAgICAgICAgICAgICAgdGFiW2kqKGhpIC0gbG8pICsgaiAtIGxvXSA9IGlkeDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGxpbWl0ID0gaGlzdC0+dGhyZXNoMltpXVswXTsKKyAgICAgICAgICAgIGludCBpZHggPSAtMSwgd3JpdGVfaWR4ID0gSUNWX0hJU1RfRFVNTVlfSURYLCBzeiA9IHNpemVbaV07CisgICAgICAgICAgICBpbnQgc3RlcCA9IDE7CisKKyAgICAgICAgICAgIGlmKCAhaXNfc3BhcnNlICkKKyAgICAgICAgICAgICAgICBzdGVwID0gKChDdk1hdE5EKikoaGlzdC0+YmlucykpLT5kaW1baV0uc3RlcC9zaXplb2YoZmxvYXQpOworCisgICAgICAgICAgICBpZiggbGltaXQgPiBoaSApCisgICAgICAgICAgICAgICAgbGltaXQgPSBoaTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaiA9IGxvOworICAgICAgICAgICAgZm9yKDs7KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggOyBqIDwgbGltaXQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHRhYltpKihoaSAtIGxvKSArIGogLSBsb10gPSB3cml0ZV9pZHg7CisKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKSgrK2lkeCkgPCAodW5zaWduZWQpc3ogKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBoaXN0LT50aHJlc2gyW2ldW2lkeCsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxpbWl0ID4gaGkgKQorICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBoaTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVfaWR4ID0gaWR4KnN0ZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggOyBqIDwgaGk7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJbaSooaGkgLSBsbykgKyBqIC0gbG9dID0gSUNWX0hJU1RfRFVNTVlfSURYOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEMgQSBMIEMgICBIIEkgUyBUIE8gRyBSIEEgTSAqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBDYWxjdWxhdGVzIGhpc3RvZ3JhbSBmb3Igb25lIG9yIG1vcmUgOHUgYXJyYXlzCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAorICAgIGljdkNhbGNIaXN0Xzh1X0MxUiggdWNoYXIqKiBpbWcsIGludCBzdGVwLCB1Y2hhciogbWFzaywgaW50IG1hc2tTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIEN2SGlzdG9ncmFtKiBoaXN0ICkKK3sKKyAgICBpbnQqIHRhYjsKKyAgICBpbnQgaXNfc3BhcnNlID0gQ1ZfSVNfU1BBUlNFX0hJU1QoaGlzdCk7CisgICAgaW50IGRpbXMsIGhpc3RzaXplW0NWX01BWF9ESU1dOworICAgIGludCBpLCB4OworICAgIEN2U3RhdHVzIHN0YXR1czsKKworICAgIGRpbXMgPSBjdkdldERpbXMoIGhpc3QtPmJpbnMsIGhpc3RzaXplICk7CisKKyAgICB0YWIgPSAoaW50KiljdlN0YWNrQWxsb2MoIGRpbXMqMjU2KnNpemVvZihpbnQpKTsKKyAgICBzdGF0dXMgPSBpY3ZDYWxjSGlzdExvb2t1cFRhYmxlczh1KCBoaXN0LCBkaW1zLCBoaXN0c2l6ZSwgdGFiICk7CisKKyAgICBpZiggc3RhdHVzIDwgMCApCisgICAgICAgIHJldHVybiBzdGF0dXM7CisKKyAgICBpZiggIWlzX3NwYXJzZSApCisgICAgeworICAgICAgICBpbnQgdG90YWwgPSAxOworICAgICAgICBpbnQqIGJpbnMgPSAoKEN2TWF0TkQqKShoaXN0LT5iaW5zKSktPmRhdGEuaTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgIHRvdGFsICo9IGhpc3RzaXplW2ldOworCisgICAgICAgIGlmKCBkaW1zIDw9IDMgJiYgdG90YWwgPj0gLUlDVl9ISVNUX0RVTU1ZX0lEWCApCisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7IC8vIHRvbyBiaWcgaGlzdG9ncmFtCisKKyAgICAgICAgc3dpdGNoKCBkaW1zICkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGFiMWRbMjU2XTsKKyAgICAgICAgICAgIG1lbXNldCggdGFiMWQsIDAsIHNpemVvZih0YWIxZCkpOworCisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaW1nWzBdICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyKiBwdHIgPSBpbWdbMF07CisgICAgICAgICAgICAgICAgaWYoICFtYXNrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPD0gc2l6ZS53aWR0aCAtIDQ7IHggKz0gNCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MCA9IHB0clt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MSA9IHB0clt4KzFdOworCisgICAgICAgICAgICAgICAgICAgICAgICB0YWIxZFt2MF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYjFkW3YxXSsrOworCisgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IHB0clt4KzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdjEgPSBwdHJbeCszXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdGFiMWRbdjBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWIxZFt2MV0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYjFkW3B0clt4XV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza1t4XSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiMWRbcHRyW3hdXSsrOworICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW2ldOworICAgICAgICAgICAgICAgIGlmKCBpZHggPj0gMCApCisgICAgICAgICAgICAgICAgICAgIGJpbnNbaWR4XSArPSB0YWIxZFtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaW1nWzBdICs9IHN0ZXAsIGltZ1sxXSArPSBzdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyMCA9IGltZ1swXTsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyMSA9IGltZ1sxXTsKKyAgICAgICAgICAgICAgICBpZiggIW1hc2sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MCA9IHB0cjBbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjEgPSBwdHIxW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHRhYlt2MF0gKyB0YWJbMjU2K3YxXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlkeCA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW2lkeF0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MCA9IHB0cjBbeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gcHRyMVt4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbdjBdICsgdGFiWzI1Nit2MV07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4ID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW2lkeF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaW1nWzBdICs9IHN0ZXAsIGltZ1sxXSArPSBzdGVwLCBpbWdbMl0gKz0gc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0cjAgPSBpbWdbMF07CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0cjEgPSBpbWdbMV07CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0cjIgPSBpbWdbMl07CisgICAgICAgICAgICAgICAgaWYoICFtYXNrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBwdHIwW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gcHRyMVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MiA9IHB0cjJbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW3YwXSArIHRhYlsyNTYrdjFdICsgdGFiWzUxMit2Ml07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluc1tpZHhdKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXNrW3hdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBwdHIwW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MSA9IHB0cjFbeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYyID0gcHRyMlt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW3YwXSArIHRhYlsyNTYrdjFdICsgdGFiWzUxMit2Ml07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4ID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW2lkeF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIW1hc2sgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmlucHRyID0gYmluczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbaSoyNTYgKyBpbWdbaV1beF1dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyICs9IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnB0clswXSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza1t4XSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBiaW5wdHIgPSBiaW5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IHRhYltpKjI1NiArIGltZ1tpXVt4XV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5wdHIgKz0gaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSBkaW1zICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyWzBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWFzayArPSBtYXNrU3RlcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VNYXQqIG1hdCA9IChDdlNwYXJzZU1hdCopKGhpc3QtPmJpbnMpOworICAgICAgICBpbnQgbm9kZV9pZHhbQ1ZfTUFYX0RJTV07CisKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFtYXNrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW2kqMjU2ICsgaW1nW2ldW3hdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfaWR4W2ldID0gaWR4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJpbiA9IChpbnQqKWN2UHRyTkQoIG1hdCwgbm9kZV9pZHgsIDAsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpblswXSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW2kqMjU2ICsgaW1nW2ldW3hdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4IDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfaWR4W2ldID0gaWR4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gZGltcyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBiaW4gPSAoaW50KiljdlB0ck5EKCBtYXQsIG5vZGVfaWR4LCAwLCAxLCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluWzBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWFzayArPSBtYXNrU3RlcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLy8gQ2FsY3VsYXRlcyBoaXN0b2dyYW0gZm9yIG9uZSBvciBtb3JlIDMyZiBhcnJheXMKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCisgICAgaWN2Q2FsY0hpc3RfMzJmX0MxUiggZmxvYXQqKiBpbWcsIGludCBzdGVwLCB1Y2hhciogbWFzaywgaW50IG1hc2tTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBDdkhpc3RvZ3JhbSogaGlzdCApCit7CisgICAgaW50IGlzX3NwYXJzZSA9IENWX0lTX1NQQVJTRV9ISVNUKGhpc3QpOworICAgIGludCB1bmlmb3JtID0gQ1ZfSVNfVU5JRk9STV9ISVNUKGhpc3QpOworICAgIGludCBkaW1zLCBoaXN0c2l6ZVtDVl9NQVhfRElNXTsKKyAgICBkb3VibGUgdW5pX3JhbmdlW0NWX01BWF9ESU1dWzJdOworICAgIGludCBpLCB4OworCisgICAgZGltcyA9IGN2R2V0RGltcyggaGlzdC0+YmlucywgaGlzdHNpemUgKTsKKyAgICBzdGVwIC89IHNpemVvZihpbWdbMF1bMF0pOworCisgICAgaWYoIHVuaWZvcm0gKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0ID0gaGlzdHNpemVbaV0vKChkb3VibGUpaGlzdC0+dGhyZXNoW2ldWzFdIC0gaGlzdC0+dGhyZXNoW2ldWzBdKTsKKyAgICAgICAgICAgIHVuaV9yYW5nZVtpXVswXSA9IHQ7CisgICAgICAgICAgICB1bmlfcmFuZ2VbaV1bMV0gPSAtdCpoaXN0LT50aHJlc2hbaV1bMF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIWlzX3NwYXJzZSApCisgICAgeworICAgICAgICBDdk1hdE5EKiBtYXQgPSAoQ3ZNYXRORCopKGhpc3QtPmJpbnMpOworICAgICAgICBpbnQqIGJpbnMgPSBtYXQtPmRhdGEuaTsKKworICAgICAgICBpZiggdW5pZm9ybSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN3aXRjaCggZGltcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBhID0gdW5pX3JhbmdlWzBdWzBdLCBiID0gdW5pX3JhbmdlWzBdWzFdOworICAgICAgICAgICAgICAgIGludCBzeiA9IGhpc3RzaXplWzBdOworCisgICAgICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGltZ1swXSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwdHIgPSBpbWdbMF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gNDsgeCArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBjdkZsb29yKHB0clt4XSphICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gY3ZGbG9vcihwdHJbeCsxXSphICsgYik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXYwIDwgKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluc1t2MF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXYxIDwgKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluc1t2MV0rKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwID0gY3ZGbG9vcihwdHJbeCsyXSphICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdjEgPSBjdkZsb29yKHB0clt4KzNdKmEgKyBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpdjAgPCAodW5zaWduZWQpc3ogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW3YwXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpdjEgPCAodW5zaWduZWQpc3ogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW3YxXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gY3ZGbG9vcihwdHJbeF0qYSArIGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpdjAgPCAodW5zaWduZWQpc3ogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5zW3YwXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gY3ZGbG9vcihwdHJbeF0qYSArIGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXYwIDwgKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnNbdjBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbWFzayArPSBtYXNrU3RlcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSAgYTAgPSB1bmlfcmFuZ2VbMF1bMF0sIGIwID0gdW5pX3JhbmdlWzBdWzFdOworICAgICAgICAgICAgICAgIGRvdWJsZSAgYTEgPSB1bmlfcmFuZ2VbMV1bMF0sIGIxID0gdW5pX3JhbmdlWzFdWzFdOworICAgICAgICAgICAgICAgIGludCBzejAgPSBoaXN0c2l6ZVswXSwgc3oxID0gaGlzdHNpemVbMV07CisgICAgICAgICAgICAgICAgaW50IHN0ZXAwID0gKChDdk1hdE5EKikoaGlzdC0+YmlucykpLT5kaW1bMF0uc3RlcC9zaXplb2YoZmxvYXQpOworCisgICAgICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGltZ1swXSArPSBzdGVwLCBpbWdbMV0gKz0gc3RlcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCogcHRyMCA9IGltZ1swXTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHB0cjEgPSBpbWdbMV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gY3ZGbG9vciggcHRyMFt4XSphMCArIGIwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gY3ZGbG9vciggcHRyMVt4XSphMSArIGIxICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXYwIDwgKHVuc2lnbmVkKXN6MCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpdjEgPCAodW5zaWduZWQpc3oxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluc1t2MCpzdGVwMCArIHYxXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gY3ZGbG9vciggcHRyMFt4XSphMCArIGIwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MSA9IGN2Rmxvb3IoIHB0cjFbeF0qYTEgKyBiMSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpdjAgPCAodW5zaWduZWQpc3owICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpdjEgPCAodW5zaWduZWQpc3oxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnNbdjAqc3RlcDAgKyB2MV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhbWFzayApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmlucHRyID0gYmluczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBjdkZsb29yKChkb3VibGUpaW1nW2ldW3hdKnVuaV9yYW5nZVtpXVswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5pX3JhbmdlW2ldWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKWhpc3RzaXplW2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5wdHIgKz0gaWR4KihtYXQtPmRpbVtpXS5zdGVwL3NpemVvZihmbG9hdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSBkaW1zICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyWzBdKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza1t4XSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJpbnB0ciA9IGJpbnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gY3ZGbG9vcigoZG91YmxlKWltZ1tpXVt4XSp1bmlfcmFuZ2VbaV1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bmlfcmFuZ2VbaV1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKWhpc3RzaXplW2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnB0ciArPSBpZHgqKG1hdC0+ZGltW2ldLnN0ZXAvc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gZGltcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5wdHJbMF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdbaV0gKz0gc3RlcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrIHx8IG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJpbnB0ciA9IGJpbnM7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2ID0gaW1nW2ldW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aHJlc2ggPSBoaXN0LT50aHJlc2gyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAtMSwgc3ogPSBoaXN0c2l6ZVtpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCB2ID49IHRocmVzaFtpZHgrMV0gJiYgKytpZHggPCBzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcCAqLzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyICs9IGlkeCoobWF0LT5kaW1baV0uc3RlcC9zaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnB0clswXSsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGltZ1tpXSArPSBzdGVwOworICAgICAgICAgICAgICAgIGlmKCBtYXNrICkKKyAgICAgICAgICAgICAgICAgICAgbWFzayArPSBtYXNrU3RlcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlNwYXJzZU1hdCogbWF0ID0gKEN2U3BhcnNlTWF0KikoaGlzdC0+Ymlucyk7CisgICAgICAgIGludCBub2RlX2lkeFtDVl9NQVhfRElNXTsKKworICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdW5pZm9ybSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggIW1hc2sgfHwgbWFza1t4XSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBjdkZsb29yKGltZ1tpXVt4XSp1bmlfcmFuZ2VbaV1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5pX3JhbmdlW2ldWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpaGlzdHNpemVbaV0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2lkeFtpXSA9IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYmluID0gKGludCopY3ZQdHJORCggbWF0LCBub2RlX2lkeCwgMCwgMSwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpblswXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFtYXNrIHx8IG1hc2tbeF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2ID0gaW1nW2ldW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aHJlc2ggPSBoaXN0LT50aHJlc2gyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSAtMSwgc3ogPSBoaXN0c2l6ZVtpXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCB2ID49IHRocmVzaFtpZHgrMV0gJiYgKytpZHggPCBzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcCAqLzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9pZHhbaV0gPSBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSBkaW1zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJpbiA9IChpbnQqKWN2UHRyTkQoIG1hdCwgbm9kZV9pZHgsIDAsIDEsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5bMF0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisKKyAgICAgICAgICAgIGlmKCBtYXNrICkKKyAgICAgICAgICAgICAgICBtYXNrICs9IG1hc2tTdGVwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZDYWxjQXJySGlzdCggQ3ZBcnIqKiBpbWcsIEN2SGlzdG9ncmFtKiBoaXN0LAorICAgICAgICAgICAgICAgaW50IGRvX25vdF9jbGVhciwgY29uc3QgQ3ZBcnIqIG1hc2sgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjSGlzdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHVjaGFyKiBwdHJbQ1ZfTUFYX0RJTV07CisgICAgdWNoYXIqIG1hc2twdHIgPSAwOworICAgIGludCBtYXNrc3RlcCA9IDAsIHN0ZXAgPSAwOworICAgIGludCBpLCBkaW1zOworICAgIGludCBjb250X2ZsYWcgPSAtMTsKKyAgICBDdk1hdCBzdHViMCwgKm1hdDAgPSAwOworICAgIEN2TWF0TkQgZGVuc2U7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIUNWX0lTX0hJU1QoaGlzdCkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJCYWQgaGlzdG9ncmFtIHBvaW50ZXIiICk7CisKKyAgICBpZiggIWltZyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBkb3VibGUgYXJyYXkgcG9pbnRlciIgKTsKKworICAgIENWX0NBTEwoIGRpbXMgPSBjdkdldERpbXMoIGhpc3QtPmJpbnMgKSk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgeworICAgICAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWdbaV07CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsIGkgPT0gMCA/ICZzdHViMCA6ICZzdHViLCAwLCAxICkpOworCisgICAgICAgIGlmKCBDVl9NQVRfQ04oIG1hdC0+dHlwZSApICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiT25seSAxLWNoYW5uZWwgYXJyYXlzIGFyZSBhbGxvd2VkIGhlcmUiICk7CisKKyAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdDAgPSBtYXQ7CisgICAgICAgICAgICBzdGVwID0gbWF0MC0+c3RlcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQwLCBtYXQgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOb3QgYWxsIHRoZSBwbGFuZXMgaGF2ZSBlcXVhbCBzaXplcyIgKTsKKworICAgICAgICAgICAgaWYoIG1hdDAtPnN0ZXAgIT0gbWF0LT5zdGVwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOb3QgYWxsIHRoZSBwbGFuZXMgaGF2ZSBlcXVhbCBzdGVwcyIgKTsKKworICAgICAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIG1hdDAsIG1hdCApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiTm90IGFsbCB0aGUgcGxhbmVzIGhhdmUgZXF1YWwgdHlwZXMiICk7CisgICAgICAgIH0KKworICAgICAgICBjb250X2ZsYWcgJj0gbWF0LT50eXBlOworICAgICAgICBwdHJbaV0gPSBtYXQtPmRhdGEucHRyOworICAgIH0KKworICAgIGlmKCBtYXNrICkKKyAgICB7CisgICAgICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKW1hc2s7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAwLCAxICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIobWF0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiQmFkIG1hc2sgYXJyYXkiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdDAsIG1hdCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICJNYXNrIHNpemUgZG9lcyBub3QgbWF0Y2ggdG8gb3RoZXIgYXJyYXlzXCcgc2l6ZSIgKTsKKyAgICAgICAgbWFza3B0ciA9IG1hdC0+ZGF0YS5wdHI7CisgICAgICAgIG1hc2tzdGVwID0gbWF0LT5zdGVwOworICAgICAgICBjb250X2ZsYWcgJj0gbWF0LT50eXBlOworICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUobWF0MCk7CisgICAgaWYoIENWX0lTX01BVF9DT05UKCBjb250X2ZsYWcgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgbWFza3N0ZXAgPSBzdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfU1BBUlNFX0hJU1QoaGlzdCkpCisgICAgeworICAgICAgICBkZW5zZSA9ICooQ3ZNYXRORCopaGlzdC0+YmluczsKKyAgICAgICAgZGVuc2UudHlwZSA9IChkZW5zZS50eXBlICYgfkNWX01BVF9UWVBFX01BU0spIHwgQ1ZfMzJTQzE7CisgICAgfQorCisgICAgaWYoICFkb19ub3RfY2xlYXIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZaZXJvKCBoaXN0LT5iaW5zICkpOworICAgIH0KKyAgICBlbHNlIGlmKCAhQ1ZfSVNfU1BBUlNFX0hJU1QoaGlzdCkpCisgICAgeworICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnQoIChDdk1hdE5EKiloaXN0LT5iaW5zLCAmZGVuc2UgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2U3BhcnNlTWF0KiBtYXQgPSAoQ3ZTcGFyc2VNYXQqKShoaXN0LT5iaW5zKTsKKyAgICAgICAgQ3ZTcGFyc2VNYXRJdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgQ3ZTcGFyc2VOb2RlKiBub2RlOworCisgICAgICAgIGZvciggbm9kZSA9IGN2SW5pdFNwYXJzZU1hdEl0ZXJhdG9yKCBtYXQsICZpdGVyYXRvciApOworICAgICAgICAgICAgIG5vZGUgIT0gMDsgbm9kZSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICB7CisgICAgICAgICAgICBDdjMyc3VmKiB2YWwgPSAoQ3YzMnN1ZiopQ1ZfTk9ERV9WQUwoIG1hdCwgbm9kZSApOworICAgICAgICAgICAgdmFsLT5pID0gY3ZSb3VuZCggdmFsLT5mICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKG1hdDAtPnR5cGUpID4gQ1ZfOFMgJiYgIUNWX0hJU1RfSEFTX1JBTkdFUyhoaXN0KSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImhpc3RvZ3JhbSByYW5nZXMgbXVzdCBiZSBzZXQgKHZpYSBjdlNldEhpc3RCaW5SYW5nZXMpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZSBjYWxsaW5nIHRoZSBmdW5jdGlvbiIgKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKG1hdDAtPnR5cGUpICkKKyAgICB7CisgICAgY2FzZSBDVl84VToKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZDYWxjSGlzdF84dV9DMVIoIHB0ciwgc3RlcCwgbWFza3B0ciwgbWFza3N0ZXAsIHNpemUsIGhpc3QgKSk7CisJICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICB7CisgICAgICAgIHVuaW9uIHsgdWNoYXIqKiBwdHI7IGZsb2F0KiogZmw7IH0gdjsKKyAgICAgICAgdi5wdHIgPSBwdHI7CisJICAgIElQUElfQ0FMTCggaWN2Q2FsY0hpc3RfMzJmX0MxUiggdi5mbCwgc3RlcCwgbWFza3B0ciwgbWFza3N0ZXAsIHNpemUsIGhpc3QgKSk7CisgICAgICAgIH0KKwkgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiVW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX1NQQVJTRV9ISVNUKGhpc3QpKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCAmZGVuc2UsIChDdk1hdE5EKiloaXN0LT5iaW5zICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlNwYXJzZU1hdCogbWF0ID0gKEN2U3BhcnNlTWF0KikoaGlzdC0+Ymlucyk7CisgICAgICAgIEN2U3BhcnNlTWF0SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIEN2U3BhcnNlTm9kZSogbm9kZTsKKworICAgICAgICBmb3IoIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggbWF0LCAmaXRlcmF0b3IgKTsKKyAgICAgICAgICAgICBub2RlICE9IDA7IG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ3YzMnN1ZiogdmFsID0gKEN2MzJzdWYqKUNWX05PREVfVkFMKCBtYXQsIG5vZGUgKTsKKyAgICAgICAgICAgIHZhbC0+ZiA9IChmbG9hdCl2YWwtPmk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQiBBIEMgSyAgIFAgUiBPIEogRSBDIFQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIENhbGN1bGF0ZXMgYmFjayBwcm9qZWN0IGZvciBvbmUgb3IgbW9yZSA4dSBhcnJheXMKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCisgICAgaWN2Q2FsY0JhY2tQcm9qZWN0Xzh1X0MxUiggdWNoYXIqKiBpbWcsIGludCBzdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0U3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3QgKQoreworICAgIGNvbnN0IGludCBzbWFsbF9oaXN0X3NpemUgPSAxPDwxMjsKKyAgICBpbnQqIHRhYiA9IDA7CisgICAgaW50IGlzX3NwYXJzZSA9IENWX0lTX1NQQVJTRV9ISVNUKGhpc3QpOworICAgIGludCBkaW1zLCBoaXN0c2l6ZVtDVl9NQVhfRElNXTsKKyAgICBpbnQgaSwgeDsKKyAgICBDdlN0YXR1cyBzdGF0dXM7CisKKyAgICBkaW1zID0gY3ZHZXREaW1zKCBoaXN0LT5iaW5zLCBoaXN0c2l6ZSApOworCisgICAgdGFiID0gKGludCopY3ZTdGFja0FsbG9jKCBkaW1zKjI1NipzaXplb2YoaW50KSk7CisgICAgc3RhdHVzID0gaWN2Q2FsY0hpc3RMb29rdXBUYWJsZXM4dSggaGlzdCwgZGltcywgaGlzdHNpemUsIHRhYiApOworICAgIGlmKCBzdGF0dXMgPCAwICkKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKworICAgIGlmKCAhaXNfc3BhcnNlICkKKyAgICB7CisgICAgICAgIGludCB0b3RhbCA9IDE7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKikoaGlzdC0+Ymlucyk7CisgICAgICAgIGZsb2F0KiBiaW5zID0gbWF0LT5kYXRhLmZsOworICAgICAgICB1Y2hhciogYnVmZmVyID0gMDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgIHRvdGFsICo9IGhpc3RzaXplW2ldOworCisgICAgICAgIGlmKCBkaW1zIDw9IDMgJiYgdG90YWwgPj0gLUlDVl9ISVNUX0RVTU1ZX0lEWCApCisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7IC8vIHRvbyBiaWcgaGlzdG9ncmFtCisKKyAgICAgICAgaWYoIGRpbXMgPiAxICYmIHRvdGFsIDw9IHNtYWxsX2hpc3Rfc2l6ZSAmJiBDVl9JU19NQVRfQ09OVChtYXQtPnR5cGUpKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2QWxsb2ModG90YWwpOworICAgICAgICAgICAgaWYoICFidWZmZXIgKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHYgPSBjdlJvdW5kKGJpbnNbaV0pOworICAgICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IENWX0NBU1RfOFUodik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2goIGRpbXMgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyIHRhYjFkWzI1Nl07CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbaV07CisgICAgICAgICAgICAgICAgaWYoIGlkeCA+PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gY3ZSb3VuZChiaW5zW2lkeF0pOworICAgICAgICAgICAgICAgICAgICB0YWIxZFtpXSA9IENWX0NBU1RfOFUodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdGFiMWRbaV0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaW1nWzBdICs9IHN0ZXAsIGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyID0gaW1nWzBdOworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPD0gc2l6ZS53aWR0aCAtIDQ7IHggKz0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciB2MCA9IHRhYjFkW3B0clt4XV07CisgICAgICAgICAgICAgICAgICAgIHVjaGFyIHYxID0gdGFiMWRbcHRyW3grMV1dOworCisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IHYwOworICAgICAgICAgICAgICAgICAgICBkc3RbeCsxXSA9IHYxOworCisgICAgICAgICAgICAgICAgICAgIHYwID0gdGFiMWRbcHRyW3grMl1dOworICAgICAgICAgICAgICAgICAgICB2MSA9IHRhYjFkW3B0clt4KzNdXTsKKworICAgICAgICAgICAgICAgICAgICBkc3RbeCsyXSA9IHYwOworICAgICAgICAgICAgICAgICAgICBkc3RbeCszXSA9IHYxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gdGFiMWRbcHRyW3hdXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaW1nWzBdICs9IHN0ZXAsIGltZ1sxXSArPSBzdGVwLCBkc3QgKz0gZHN0U3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0cjAgPSBpbWdbMF07CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0cjEgPSBpbWdbMV07CisKKyAgICAgICAgICAgICAgICBpZiggYnVmZmVyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBwdHIwW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gcHRyMVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbdjBdICsgdGFiWzI1Nit2MV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGJ1ZmZlcltpZHhdOworCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodWNoYXIpdjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gcHRyMFt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MSA9IHB0cjFbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW3YwXSArIHRhYlsyNTYrdjFdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4ID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBjdlJvdW5kKGJpbnNbaWR4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IENWX0NBU1RfOFUodik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9ICh1Y2hhcil2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBpbWdbMF0gKz0gc3RlcCwgaW1nWzFdICs9IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nWzJdICs9IHN0ZXAsIGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyMCA9IGltZ1swXTsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyMSA9IGltZ1sxXTsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyMiA9IGltZ1syXTsKKworICAgICAgICAgICAgICAgIGlmKCBidWZmZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MCA9IHB0cjBbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjEgPSBwdHIxW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYyID0gcHRyMlt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbdjBdICsgdGFiWzI1Nit2MV0gKyB0YWJbNTEyK3YyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlkeCA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gYnVmZmVyW2lkeF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9ICh1Y2hhcil2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBwdHIwW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYxID0gcHRyMVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MiA9IHB0cjJbeF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW3YwXSArIHRhYlsyNTYrdjFdICsgdGFiWzUxMit2Ml07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGN2Um91bmQoYmluc1tpZHhdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gQ1ZfQ0FTVF84VSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9ICh1Y2hhcil2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZHN0ICs9IGRzdFN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBidWZmZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBiaW5wdHIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSB0YWJbaSoyNTYgKyBpbWdbaV1beF1dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyICs9IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gZGltcyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGJpbnB0clswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gKHVjaGFyKXY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiaW5wdHIgPSBiaW5zOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW2kqMjU2ICsgaW1nW2ldW3hdXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4IDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbnB0ciArPSBpZHg7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBjdlJvdW5kKCBiaW5wdHJbMF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gQ1ZfQ0FTVF84VSh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gKHVjaGFyKXY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VNYXQqIG1hdCA9IChDdlNwYXJzZU1hdCopKGhpc3QtPmJpbnMpOworICAgICAgICBpbnQgbm9kZV9pZHhbQ1ZfTUFYX0RJTV07CisKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHYgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gdGFiW2kqMjU2ICsgaW1nW2ldW3hdXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGlkeCA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIG5vZGVfaWR4W2ldID0gaWR4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaSA9PSBkaW1zICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiaW4gPSAoZmxvYXQqKWN2UHRyTkQoIG1hdCwgbm9kZV9pZHgsIDAsIDEsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGN2Um91bmQoYmluWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgdiA9IENWX0NBU1RfOFUodik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZHN0W3hdID0gKHVjaGFyKXY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgIGltZ1tpXSArPSBzdGVwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8vIENhbGN1bGF0ZXMgYmFjayBwcm9qZWN0IGZvciBvbmUgb3IgbW9yZSAzMmYgYXJyYXlzCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAorICAgIGljdkNhbGNCYWNrUHJvamVjdF8zMmZfQzFSKCBmbG9hdCoqIGltZywgaW50IHN0ZXAsIGZsb2F0KiBkc3QsIGludCBkc3RTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3QgKQoreworICAgIGludCBpc19zcGFyc2UgPSBDVl9JU19TUEFSU0VfSElTVChoaXN0KTsKKyAgICBpbnQgdW5pZm9ybSA9IENWX0lTX1VOSUZPUk1fSElTVChoaXN0KTsKKyAgICBpbnQgZGltcywgaGlzdHNpemVbQ1ZfTUFYX0RJTV07CisgICAgZG91YmxlIHVuaV9yYW5nZVtDVl9NQVhfRElNXVsyXTsKKyAgICBpbnQgaSwgeDsKKworICAgIGRpbXMgPSBjdkdldERpbXMoIGhpc3QtPmJpbnMsIGhpc3RzaXplICk7CisgICAgc3RlcCAvPSBzaXplb2YoaW1nWzBdWzBdKTsKKyAgICBkc3RTdGVwIC89IHNpemVvZihkc3RbMF0pOworCisgICAgaWYoIHVuaWZvcm0gKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0ID0gKChkb3VibGUpaGlzdHNpemVbaV0pLworICAgICAgICAgICAgICAgICgoZG91YmxlKWhpc3QtPnRocmVzaFtpXVsxXSAtIGhpc3QtPnRocmVzaFtpXVswXSk7CisgICAgICAgICAgICB1bmlfcmFuZ2VbaV1bMF0gPSB0OworICAgICAgICAgICAgdW5pX3JhbmdlW2ldWzFdID0gLXQqaGlzdC0+dGhyZXNoW2ldWzBdOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFpc19zcGFyc2UgKQorICAgIHsKKyAgICAgICAgQ3ZNYXRORCogbWF0ID0gKEN2TWF0TkQqKShoaXN0LT5iaW5zKTsKKyAgICAgICAgZmxvYXQqIGJpbnMgPSBtYXQtPmRhdGEuZmw7CisKKyAgICAgICAgaWYoIHVuaWZvcm0gKQorICAgICAgICB7CisgICAgICAgICAgICBzd2l0Y2goIGRpbXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYSA9IHVuaV9yYW5nZVswXVswXSwgYiA9IHVuaV9yYW5nZVswXVsxXTsKKyAgICAgICAgICAgICAgICBpbnQgc3ogPSBoaXN0c2l6ZVswXTsKKworICAgICAgICAgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBpbWdbMF0gKz0gc3RlcCwgZHN0ICs9IGRzdFN0ZXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHB0ciA9IGltZ1swXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSA0OyB4ICs9IDQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjAgPSBjdkZsb29yKHB0clt4XSphICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjEgPSBjdkZsb29yKHB0clt4KzFdKmEgKyBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2MCA8ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gYmluc1t2MF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2MSA8ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3grMV0gPSBiaW5zW3YxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCsxXSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHYwID0gY3ZGbG9vcihwdHJbeCsyXSphICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICB2MSA9IGN2Rmxvb3IocHRyW3grM10qYSArIGIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXYwIDwgKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCsyXSA9IGJpbnNbdjBdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4KzJdID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2MSA8ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3grM10gPSBiaW5zW3YxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeCszXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2MCA9IGN2Rmxvb3IocHRyW3hdKmEgKyBiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2MCA8ICh1bnNpZ25lZClzeiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gYmluc1t2MF07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBhMCA9IHVuaV9yYW5nZVswXVswXSwgYjAgPSB1bmlfcmFuZ2VbMF1bMV07CisgICAgICAgICAgICAgICAgZG91YmxlIGExID0gdW5pX3JhbmdlWzFdWzBdLCBiMSA9IHVuaV9yYW5nZVsxXVsxXTsKKyAgICAgICAgICAgICAgICBpbnQgc3owID0gaGlzdHNpemVbMF0sIHN6MSA9IGhpc3RzaXplWzFdOworICAgICAgICAgICAgICAgIGludCBzdGVwMCA9ICgoQ3ZNYXRORCopKGhpc3QtPmJpbnMpKS0+ZGltWzBdLnN0ZXAvc2l6ZW9mKGZsb2F0KTsKKworICAgICAgICAgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBpbWdbMF0gKz0gc3RlcCwgaW1nWzFdICs9IHN0ZXAsIGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwdHIwID0gaW1nWzBdOworICAgICAgICAgICAgICAgICAgICBmbG9hdCogcHRyMSA9IGltZ1sxXTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHYwID0gY3ZGbG9vciggcHRyMFt4XSphMCArIGIwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdjEgPSBjdkZsb29yKCBwdHIxW3hdKmExICsgYjEgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2MCA8ICh1bnNpZ25lZClzejAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpdjEgPCAodW5zaWduZWQpc3oxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBiaW5zW3YwKnN0ZXAwICsgdjFdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZHN0ICs9IGRzdFN0ZXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiaW5wdHIgPSBiaW5zOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gY3ZGbG9vcihpbWdbaV1beF0qdW5pX3JhbmdlW2ldWzBdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVuaV9yYW5nZVtpXVsxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKWhpc3RzaXplW2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyICs9IGlkeCoobWF0LT5kaW1baV0uc3RlcC9zaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJpbnB0clswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGltZ1tpXSArPSBzdGVwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiaW5wdHIgPSBiaW5zOworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdiA9IGltZ1tpXVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aHJlc2ggPSBoaXN0LT50aHJlc2gyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IC0xLCBzeiA9IGhpc3RzaXplW2ldOworCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggdiA+PSB0aHJlc2hbaWR4KzFdICYmICsraWR4IDwgc3ogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcCAqLzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgYmlucHRyICs9IGlkeCoobWF0LT5kaW1baV0uc3RlcC9zaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggaSA9PSBkaW1zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJpbnB0clswXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VNYXQqIG1hdCA9IChDdlNwYXJzZU1hdCopKGhpc3QtPmJpbnMpOworICAgICAgICBpbnQgbm9kZV9pZHhbQ1ZfTUFYX0RJTV07CisKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGRzdCArPSBkc3RTdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHVuaWZvcm0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBjdkZsb29yKGltZ1tpXVt4XSp1bmlfcmFuZ2VbaV1bMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bmlfcmFuZ2VbaV1bMV0pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKWhpc3RzaXplW2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfaWR4W2ldID0gaWR4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IGRpbXMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogYmluID0gKGZsb2F0KiljdlB0ck5EKCBtYXQsIG5vZGVfaWR4LCAwLCAxLCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBiaW5bMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdiA9IGltZ1tpXVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0aHJlc2ggPSBoaXN0LT50aHJlc2gyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IC0xLCBzeiA9IGhpc3RzaXplW2ldOworCisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggdiA+PSB0aHJlc2hbaWR4KzFdICYmICsraWR4IDwgc3ogKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vcCAqLzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKXN6ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9pZHhbaV0gPSBpZHg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gZGltcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBiaW4gPSAoZmxvYXQqKWN2UHRyTkQoIG1hdCwgbm9kZV9pZHgsIDAsIDEsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IGJpblswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgaW1nW2ldICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNhbGNBcnJCYWNrUHJvamVjdCggQ3ZBcnIqKiBpbWcsIEN2QXJyKiBkc3QsIGNvbnN0IEN2SGlzdG9ncmFtKiBoaXN0ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FsY0FyckJhY2tQcm9qZWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgdWNoYXIqIHB0cltDVl9NQVhfRElNXTsKKyAgICB1Y2hhciogZHN0cHRyID0gMDsKKyAgICBpbnQgZHN0c3RlcCA9IDAsIHN0ZXAgPSAwOworICAgIGludCBpLCBkaW1zOworICAgIGludCBjb250X2ZsYWcgPSAtMTsKKyAgICBDdk1hdCBzdHViMCwgKm1hdDAgPSAwOworICAgIEN2U2l6ZSBzaXplOworCisgICAgaWYoICFDVl9JU19ISVNUKGhpc3QpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiQmFkIGhpc3RvZ3JhbSBwb2ludGVyIiApOworCisgICAgaWYoICFpbWcgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgZG91YmxlIGFycmF5IHBvaW50ZXIiICk7CisKKyAgICBDVl9DQUxMKCBkaW1zID0gY3ZHZXREaW1zKCBoaXN0LT5iaW5zICkpOworICAgIAorICAgIGZvciggaSA9IDA7IGkgPD0gZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKShpIDwgZGltcyA/IGltZ1tpXSA6IGRzdCk7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsIGkgPT0gMCA/ICZzdHViMCA6ICZzdHViLCAwLCAxICkpOworCisgICAgICAgIGlmKCBDVl9NQVRfQ04oIG1hdC0+dHlwZSApICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiT25seSAxLWNoYW5uZWwgYXJyYXlzIGFyZSBhbGxvd2VkIGhlcmUiICk7CisKKyAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdDAgPSBtYXQ7CisgICAgICAgICAgICBzdGVwID0gbWF0MC0+c3RlcDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXQwLCBtYXQgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOb3QgYWxsIHRoZSBwbGFuZXMgaGF2ZSBlcXVhbCBzaXplcyIgKTsKKworICAgICAgICAgICAgaWYoIG1hdDAtPnN0ZXAgIT0gbWF0LT5zdGVwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOb3QgYWxsIHRoZSBwbGFuZXMgaGF2ZSBlcXVhbCBzdGVwcyIgKTsKKworICAgICAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIG1hdDAsIG1hdCApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiTm90IGFsbCB0aGUgcGxhbmVzIGhhdmUgZXF1YWwgdHlwZXMiICk7CisgICAgICAgIH0KKworICAgICAgICBjb250X2ZsYWcgJj0gbWF0LT50eXBlOworICAgICAgICBpZiggaSA8IGRpbXMgKQorICAgICAgICAgICAgcHRyW2ldID0gbWF0LT5kYXRhLnB0cjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkc3RwdHIgPSBtYXQtPmRhdGEucHRyOworICAgICAgICAgICAgZHN0c3RlcCA9IG1hdC0+c3RlcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUobWF0MCk7CisgICAgaWYoIENWX0lTX01BVF9DT05UKCBjb250X2ZsYWcgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgZHN0c3RlcCA9IHN0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgfQorCisgICAgaWYoIENWX01BVF9ERVBUSChtYXQwLT50eXBlKSA+IENWXzhTICYmICFDVl9ISVNUX0hBU19SQU5HRVMoaGlzdCkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJoaXN0b2dyYW0gcmFuZ2VzIG11c3QgYmUgc2V0ICh2aWEgY3ZTZXRIaXN0QmluUmFuZ2VzKSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmUgY2FsbGluZyB0aGUgZnVuY3Rpb24iICk7CisKKyAgICBzd2l0Y2goIENWX01BVF9ERVBUSChtYXQwLT50eXBlKSApCisgICAgeworICAgIGNhc2UgQ1ZfOFU6CisgICAgICAgIElQUElfQ0FMTCggaWN2Q2FsY0JhY2tQcm9qZWN0Xzh1X0MxUiggcHRyLCBzdGVwLCBkc3RwdHIsIGRzdHN0ZXAsIHNpemUsIGhpc3QgKSk7CisJICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICB7CisgICAgICAgIHVuaW9uIHsgdWNoYXIqKiBwdHI7IGZsb2F0KiogZmw7IH0gdjsKKyAgICAgICAgdi5wdHIgPSBwdHI7CisJICAgIElQUElfQ0FMTCggaWN2Q2FsY0JhY2tQcm9qZWN0XzMyZl9DMVIoIHYuZmwsIHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCopZHN0cHRyLCBkc3RzdGVwLCBzaXplLCBoaXN0ICkpOworICAgICAgICB9CisJICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIGFycmF5IHR5cGUiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEIgQSBDIEsgICBQIFIgTyBKIEUgQyBUICAgUCBBIFQgQyBIIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ1ZfSU1QTCB2b2lkCitjdkNhbGNBcnJCYWNrUHJvamVjdFBhdGNoKCBDdkFycioqIGFyciwgQ3ZBcnIqIGRzdCwgQ3ZTaXplIHBhdGNoX3NpemUsIEN2SGlzdG9ncmFtKiBoaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1ldGhvZCwgZG91YmxlIG5vcm1fZmFjdG9yICkKK3sKKyAgICBDdkhpc3RvZ3JhbSogbW9kZWwgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNhbGNBcnJCYWNrUHJvamVjdFBhdGNoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSXBsSW1hZ2UgaW1nc3R1YltDVl9NQVhfRElNXSwgKmltZ1tDVl9NQVhfRElNXTsKKyAgICBJcGxST0kgcm9pOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3RtYXQ7CisgICAgaW50IGksIGRpbXM7CisgICAgaW50IHgsIHk7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIUNWX0lTX0hJU1QoaGlzdCkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJCYWQgaGlzdG9ncmFtIHBvaW50ZXIiICk7CisKKyAgICBpZiggIWFyciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBkb3VibGUgYXJyYXkgcG9pbnRlciIgKTsKKworICAgIGlmKCBub3JtX2ZhY3RvciA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAiQmFkIG5vcm1hbGl6YXRpb24gZmFjdG9yIChzZXQgaXQgdG8gMS4wIGlmIHVuc3VyZSkiICk7CisKKyAgICBpZiggcGF0Y2hfc2l6ZS53aWR0aCA8PSAwIHx8IHBhdGNoX3NpemUuaGVpZ2h0IDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBwYXRjaCB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgcG9zaXRpdmUiICk7CisKKyAgICBDVl9DQUxMKCBkaW1zID0gY3ZHZXREaW1zKCBoaXN0LT5iaW5zICkpOworICAgIENWX0NBTEwoIGN2Q29weUhpc3QoIGhpc3QsICZtb2RlbCApKTsKKyAgICBDVl9DQUxMKCBjdk5vcm1hbGl6ZUhpc3QoIGhpc3QsIG5vcm1fZmFjdG9yICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgeworICAgICAgICBDdk1hdCBzdHViLCAqbWF0OworICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggYXJyW2ldLCAmc3R1YiwgMCwgMCApKTsKKyAgICAgICAgQ1ZfQ0FMTCggaW1nW2ldID0gY3ZHZXRJbWFnZSggbWF0LCAmaW1nc3R1YltpXSApKTsKKyAgICAgICAgaW1nW2ldLT5yb2kgPSAmcm9pOworICAgIH0KKworICAgIENWX0NBTEwoIGRzdG1hdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAwLCAwICkpOworICAgIGlmKCBDVl9NQVRfVFlQRSggZHN0bWF0LT50eXBlICkgIT0gQ1ZfMzJGQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJSZXN1bHRhbnQgaW1hZ2UgbXVzdCBoYXZlIDMyZkMxIHR5cGUiICk7CisKKyAgICBpZiggZHN0bWF0LT5jb2xzICE9IGltZ1swXS0+d2lkdGggLSBwYXRjaF9zaXplLndpZHRoICsgMSB8fAorICAgICAgICBkc3RtYXQtPnJvd3MgIT0gaW1nWzBdLT5oZWlnaHQgLSBwYXRjaF9zaXplLmhlaWdodCArIDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAiVGhlIG91dHB1dCBtYXAgbXVzdCBiZSAoVy13KzEgeCBILWgrMSksICIKKyAgICAgICAgICAgICJ3aGVyZSB0aGUgaW5wdXQgaW1hZ2VzIGFyZSAoVyB4IEgpIGVhY2ggYW5kIHRoZSBwYXRjaCBpcyAodyB4IGgpIiApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZShkc3RtYXQpOworICAgIHJvaS5jb2kgPSAwOworICAgIHJvaS53aWR0aCA9IHBhdGNoX3NpemUud2lkdGg7CisgICAgcm9pLmhlaWdodCA9IHBhdGNoX3NpemUuaGVpZ2h0OworCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSByZXN1bHQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJvaS54T2Zmc2V0ID0geDsKKyAgICAgICAgICAgIHJvaS55T2Zmc2V0ID0geTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDYWxjSGlzdCggaW1nLCBtb2RlbCApKTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZOb3JtYWxpemVIaXN0KCBtb2RlbCwgbm9ybV9mYWN0b3IgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCByZXN1bHQgPSBjdkNvbXBhcmVIaXN0KCBtb2RlbCwgaGlzdCwgbWV0aG9kICkpOworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oICpkc3RtYXQsIGZsb2F0LCB5LCB4ICkgPSAoZmxvYXQpcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZUhpc3QoICZtb2RlbCApOworfQorCisKKy8vIENhbGN1bGF0ZXMgQmF5ZXMgcHJvYmFiaWxpc3RpYyBoaXN0b2dyYW1zCitDVl9JTVBMIHZvaWQKK2N2Q2FsY0JheWVzaWFuUHJvYiggQ3ZIaXN0b2dyYW0qKiBzcmMsIGludCBjb3VudCwgQ3ZIaXN0b2dyYW0qKiBkc3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjQmF5ZXNpYW5Qcm9iIiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpOworICAgIAorICAgIGlmKCAhc3JjIHx8ICFkc3QgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgaGlzdG9ncmFtIGFycmF5IHBvaW50ZXIiICk7CisKKyAgICBpZiggY291bnQgPCAyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUb28gc21hbGwgbnVtYmVyIG9mIGhpc3RvZ3JhbXMiICk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19ISVNUKHNyY1tpXSkgfHwgIUNWX0lTX0hJU1QoZHN0W2ldKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBoaXN0b2dyYW0gaGVhZGVyIiApOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUTkQoc3JjW2ldLT5iaW5zKSB8fCAhQ1ZfSVNfTUFUTkQoZHN0W2ldLT5iaW5zKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIGRlbnNlIGhpc3RvZ3JhbXMgb25seSIgKTsKKyAgICB9CisgICAgCisgICAgY3ZaZXJvKCBkc3RbMF0tPmJpbnMgKTsKKyAgICAvLyBkc3RbMF0gPSBzcmNbMF0gKyAuLi4gKyBzcmNbY291bnQtMV0KKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIENWX0NBTEwoIGN2QWRkKCBzcmNbaV0tPmJpbnMsIGRzdFswXS0+YmlucywgZHN0WzBdLT5iaW5zICkpOworCisgICAgQ1ZfQ0FMTCggY3ZEaXYoIDAsIGRzdFswXS0+YmlucywgZHN0WzBdLT5iaW5zICkpOworCisgICAgLy8gZHN0W2ldID0gc3JjW2ldKigxL2RzdFswXSkKKyAgICBmb3IoIGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgQ1ZfQ0FMTCggY3ZNdWwoIHNyY1tpXS0+YmlucywgZHN0WzBdLT5iaW5zLCBkc3RbaV0tPmJpbnMgKSk7CisgICAgCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY1Byb2JEZW5zaXR5KCBjb25zdCBDdkhpc3RvZ3JhbSogaGlzdCwgY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3RfbWFzaywKKyAgICAgICAgICAgICAgICAgICBDdkhpc3RvZ3JhbSogaGlzdF9kZW5zLCBkb3VibGUgc2NhbGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjUHJvYkRlbnNpdHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggc2NhbGUgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAic2NhbGUgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCAhQ1ZfSVNfSElTVChoaXN0KSB8fCAhQ1ZfSVNfSElTVChoaXN0X21hc2spIHx8ICFDVl9JU19ISVNUKGhpc3RfZGVucykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBoaXN0b2dyYW0gcG9pbnRlcltzXSIgKTsKKworICAgIHsKKyAgICAgICAgQ3ZBcnIqIGFycnNbXSA9IHsgaGlzdC0+YmlucywgaGlzdF9tYXNrLT5iaW5zLCBoaXN0X2RlbnMtPmJpbnMgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMywgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJBbGwgaGlzdG9ncmFtcyBtdXN0IGhhdmUgMzJmQzEgdHlwZSIgKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjZGF0YSA9IChjb25zdCBmbG9hdCopKGl0ZXJhdG9yLnB0clswXSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFza2RhdGEgPSAoY29uc3QgZmxvYXQqKShpdGVyYXRvci5wdHJbMV0pOworICAgICAgICAgICAgZmxvYXQqIGRzdGRhdGEgPSAoZmxvYXQqKShpdGVyYXRvci5wdHJbMl0pOworICAgICAgICAgICAgaW50IGk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBpdGVyYXRvci5zaXplLndpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHMgPSBzcmNkYXRhW2ldOworICAgICAgICAgICAgICAgIGZsb2F0IG0gPSBtYXNrZGF0YVtpXTsKKyAgICAgICAgICAgICAgICBpZiggcyA+IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIG0gPD0gcyApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2ldID0gKGZsb2F0KShtKnNjYWxlL3MpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2ldID0gKGZsb2F0KXNjYWxlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZHN0ZGF0YVtpXSA9IChmbG9hdCkwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkIGN2RXF1YWxpemVIaXN0KCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0ICkKK3sKKyAgICBDdkhpc3RvZ3JhbSogaGlzdCA9IDA7CisgICAgQ3ZNYXQqIGx1dCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkVxdWFsaXplSGlzdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBoaXN0X3N6ID0gMjU2OworICAgIEN2U2l6ZSBpbWdfc3o7CisgICAgZmxvYXQgc2NhbGU7CisgICAgZmxvYXQqIGg7CisgICAgaW50IHN1bSA9IDA7CisgICAgaW50IHR5cGU7CisgICAgCisgICAgQ1ZfQ0FMTCggdHlwZSA9IGN2R2V0RWxlbVR5cGUoIHNyYyApKTsKKyAgICBpZiggdHlwZSAhPSBDVl84VUMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiT25seSA4dUMxIGltYWdlcyBhcmUgc3VwcG9ydGVkIiApOworCisgICAgQ1ZfQ0FMTCggaGlzdCA9IGN2Q3JlYXRlSGlzdCggMSwgJmhpc3Rfc3osIENWX0hJU1RfQVJSQVkgKSk7CisgICAgQ1ZfQ0FMTCggbHV0ID0gY3ZDcmVhdGVNYXQoIDEsIDI1NiwgQ1ZfOFVDMSApKTsKKyAgICBDVl9DQUxMKCBjdkNhbGNBcnJIaXN0KCAoQ3ZBcnIqKikmc3JjLCBoaXN0ICkpOworICAgIENWX0NBTEwoIGltZ19zeiA9IGN2R2V0U2l6ZSggc3JjICkpOworICAgIHNjYWxlID0gMjU1LmYvKGltZ19zei53aWR0aCppbWdfc3ouaGVpZ2h0KTsKKyAgICBoID0gKGZsb2F0KiljdlB0cjFEKCBoaXN0LT5iaW5zLCAwICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgaGlzdF9zejsgaSsrICkKKyAgICB7CisgICAgICAgIHN1bSArPSBjdlJvdW5kKGhbaV0pOworICAgICAgICBsdXQtPmRhdGEucHRyW2ldID0gKHVjaGFyKWN2Um91bmQoc3VtKnNjYWxlKTsKKyAgICB9CisKKyAgICBsdXQtPmRhdGEucHRyWzBdID0gMDsKKyAgICBDVl9DQUxMKCBjdkxVVCggc3JjLCBkc3QsIGx1dCApKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VIaXN0KCZoaXN0KTsKKyAgICBjdlJlbGVhc2VNYXQoJmx1dCk7Cit9CisKKy8qIEltcGxlbWVudGF0aW9uIG9mIFJUVEkgYW5kIEdlbmVyaWMgRnVuY3Rpb25zIGZvciBDdkhpc3RvZ3JhbSAqLworI2RlZmluZSBDVl9UWVBFX05BTUVfSElTVCAib3BlbmN2LWhpc3QiCisKK3N0YXRpYyBpbnQgaWN2SXNIaXN0KCBjb25zdCB2b2lkICogcHRyICl7CisJcmV0dXJuIENWX0lTX0hJU1QoICgoQ3ZIaXN0b2dyYW0qKXB0cikgKTsKK30KKworc3RhdGljIEN2SGlzdG9ncmFtICogaWN2Q2xvbmVIaXN0KCBjb25zdCBDdkhpc3RvZ3JhbSAqIHNyYyApeworCUN2SGlzdG9ncmFtICogZHN0PU5VTEw7CisJY3ZDb3B5SGlzdChzcmMsICZkc3QpOworCXJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyB2b2lkICppY3ZSZWFkSGlzdCggQ3ZGaWxlU3RvcmFnZSAqIGZzLCBDdkZpbGVOb2RlICogbm9kZSApeworCUN2SGlzdG9ncmFtICogaCA9IDA7CisJaW50IGlzX3VuaWZvcm0gPSAwOworCWludCBoYXZlX3JhbmdlcyA9IDA7CisKKwlDVl9GVU5DTkFNRSgiaWN2UmVhZEhpc3QiKTsKKwlfX0JFR0lOX187CisKKyAgICBDVl9DQUxMKCBoID0gKEN2SGlzdG9ncmFtICopIGN2QWxsb2MoIHNpemVvZihDdkhpc3RvZ3JhbSkgKSk7CisKKwlpc191bmlmb3JtID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgImlzX3VuaWZvcm0iLCAwICk7CisJaGF2ZV9yYW5nZXMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiaGF2ZV9yYW5nZXMiLCAwKTsKKwloLT50eXBlID0gQ1ZfSElTVF9NQUdJQ19WQUwgfCAKKwkJICAgICAgKGlzX3VuaWZvcm0gPyBDVl9ISVNUX1VOSUZPUk1fRkxBRyA6IDApIHwKKwkJCSAgKGhhdmVfcmFuZ2VzID8gQ1ZfSElTVF9SQU5HRVNfRkxBRyA6IDApOworCisJaWYoaXNfdW5pZm9ybSl7CisJCS8vIHJlYWQgaGlzdG9ncmFtIGJpbnMKKwkJQ3ZNYXRORCAqIG1hdCA9IChDdk1hdE5EICopIGN2UmVhZEJ5TmFtZSggZnMsIG5vZGUsICJtYXQiICk7CisJCWludCBzaXplc1tDVl9NQVhfRElNXTsKKwkJaW50IGk7CisJCWlmKCFDVl9JU19NQVRORChtYXQpKXsKKwkJCUNWX0VSUk9SKCBDVl9TdHNFcnJvciwgIkV4cGVjdGVkIEN2TWF0TkQiKTsKKwkJfQorCQlmb3IoaT0wOyBpPG1hdC0+ZGltczsgaSsrKXsKKwkJCXNpemVzW2ldID0gbWF0LT5kaW1baV0uc2l6ZTsKKwkJfQorCisJCWN2SW5pdE1hdE5ESGVhZGVyKCAmKGgtPm1hdCksIG1hdC0+ZGltcywgc2l6ZXMsIG1hdC0+dHlwZSwgbWF0LT5kYXRhLnB0ciApOworCQloLT5iaW5zID0gJihoLT5tYXQpOworCQkKKwkJLy8gdGFrZSBvd25lcnNoaXAgb2YgcmVmY291bnQgcG9pbnRlciBhcyB3ZWxsCisJCWgtPm1hdC5yZWZjb3VudCA9IG1hdC0+cmVmY291bnQ7CisKKwkJLy8gaW5jcmVhc2UgcmVmY291bnQgc28gZnJlZWluZyB0ZW1wIGhlYWRlciBkb2Vzbid0IGZyZWUgZGF0YQorCQljdkluY1JlZkRhdGEoIG1hdCApOyAKKwkJCisJCS8vIGZyZWUgdGVtcG9yYXJ5IGhlYWRlcgorCQljdlJlbGVhc2VNYXRORCggJm1hdCApOworCX0KKwllbHNleworCQloLT5iaW5zID0gY3ZSZWFkQnlOYW1lKCBmcywgbm9kZSwgImJpbnMiICk7CisJCWlmKCFDVl9JU19TUEFSU0VfTUFUKGgtPmJpbnMpKXsKKwkJCUNWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlVua25vd24gSGlzdG9ncmFtIHR5cGUiKTsKKwkJfQorCX0KKworCS8vIHJlYWQgdGhyZXNob2xkcworCWlmKGhhdmVfcmFuZ2VzKXsKKwkJaW50IGk7CisJCWludCBkaW1zOworCQlpbnQgc2l6ZVtDVl9NQVhfRElNXTsKKwkJaW50IHRvdGFsID0gMDsKKwkJQ3ZTZXFSZWFkZXIgcmVhZGVyOworCQlDdkZpbGVOb2RlICogdGhyZXNoX25vZGU7CisKKwkJQ1ZfQ0FMTCggZGltcyA9IGN2R2V0RGltcyggaC0+Ymlucywgc2l6ZSApKTsKKwkJZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApeworCQkJdG90YWwgKz0gc2l6ZVtpXSsxOworCQl9CisKKwkJdGhyZXNoX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInRocmVzaCIgKTsKKwkJaWYoIXRocmVzaF9ub2RlKXsKKwkJCUNWX0VSUk9SKCBDVl9TdHNFcnJvciwgIid0aHJlc2gnIG5vZGUgaXMgbWlzc2luZyIpOworCQl9CisJCWN2U3RhcnRSZWFkUmF3RGF0YSggZnMsIHRocmVzaF9ub2RlLCAmcmVhZGVyICk7CisKKwkJaWYoaXNfdW5pZm9ybSl7CisJCQlmb3IoaT0wOyBpPGRpbXM7IGkrKyl7CisJCQkJY3ZSZWFkUmF3RGF0YVNsaWNlKCBmcywgJnJlYWRlciwgMiwgaC0+dGhyZXNoW2ldLCAiZiIgKTsKKwkJCX0KKyAgICAgICAgICAgIGgtPnRocmVzaDIgPSBOVUxMOworCQl9CisJCWVsc2V7CisJCQlmbG9hdCogZGltX3JhbmdlczsKKwkJCUNWX0NBTEwoIGgtPnRocmVzaDIgPSAoZmxvYXQqKiljdkFsbG9jKAorCQkJCQkJZGltcypzaXplb2YoaC0+dGhyZXNoMlswXSkrCisJCQkJCQl0b3RhbCpzaXplb2YoaC0+dGhyZXNoMlswXVswXSkpKTsKKwkJCWRpbV9yYW5nZXMgPSAoZmxvYXQqKShoLT50aHJlc2gyICsgZGltcyk7CisJCQlmb3IoaT0wOyBpIDwgZGltczsgaSsrKXsKKwkJCQloLT50aHJlc2gyW2ldID0gZGltX3JhbmdlczsKKwkJCQljdlJlYWRSYXdEYXRhU2xpY2UoIGZzLCAmcmVhZGVyLCBzaXplW2ldKzEsIGRpbV9yYW5nZXMsICJmIiApOworCQkJCWRpbV9yYW5nZXMgKz0gc2l6ZVtpXSArIDE7CisJCQl9CisJCX0KKworCX0KKwkKKwlfX0VORF9fOworCisJcmV0dXJuIGg7Cit9CisKK3N0YXRpYyB2b2lkIGljdldyaXRlSGlzdCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIsIAorCQlDdkF0dHJMaXN0IC8qYXR0cmlidXRlcyovICl7CisJY29uc3QgQ3ZIaXN0b2dyYW0gKiBoaXN0ID0gKGNvbnN0IEN2SGlzdG9ncmFtICopIHN0cnVjdF9wdHI7CisJaW50IHNpemVzW0NWX01BWF9ESU1dOworCWludCBkaW1zOworCWludCBpOworCWludCBpc191bmlmb3JtLCBoYXZlX3JhbmdlczsKKworCUNWX0ZVTkNOQU1FKCJpY3ZXcml0ZUhpc3QiKTsKKwlfX0JFR0lOX187CisgCisJY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9ISVNUICk7CisKKwlpc191bmlmb3JtID0gKENWX0lTX1VOSUZPUk1fSElTVChoaXN0KSA/IDEgOiAwKTsKKwloYXZlX3JhbmdlcyA9IChoaXN0LT50eXBlICYgQ1ZfSElTVF9SQU5HRVNfRkxBRyA/IDEgOiAwKTsKKwkKKwljdldyaXRlSW50KCBmcywgImlzX3VuaWZvcm0iLCBpc191bmlmb3JtICk7CisJY3ZXcml0ZUludCggZnMsICJoYXZlX3JhbmdlcyIsIGhhdmVfcmFuZ2VzICk7CisJaWYoQ1ZfSVNfVU5JRk9STV9ISVNUKGhpc3QpKXsKKwkJY3ZXcml0ZSggZnMsICJtYXQiLCAmKGhpc3QtPm1hdCkgKTsKKwl9CisJZWxzZSBpZihDVl9JU19TUEFSU0VfSElTVChoaXN0KSl7CisJCWN2V3JpdGUoIGZzLCAiYmlucyIsIGhpc3QtPmJpbnMgKTsKKwl9CisJZWxzZXsKKwkJQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVW5rbm93biBIaXN0b2dyYW0gVHlwZSIgKTsKKwl9CisKKwkvLyB3cml0ZSB0aHJlc2hvbGRzCisJaWYoaGF2ZV9yYW5nZXMpeworCQlkaW1zID0gY3ZHZXREaW1zKCBoaXN0LT5iaW5zLCBzaXplcyApOworCQljdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAidGhyZXNoIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKwkJaWYoaXNfdW5pZm9ybSl7CisJCQlmb3IoaT0wOyBpPGRpbXM7IGkrKyl7CisJCQkJY3ZXcml0ZVJhd0RhdGEoIGZzLCBoaXN0LT50aHJlc2hbaV0sIDIsICJmIiApOworCQkJfQorCQl9CisJCWVsc2V7CisJCQlmb3IoaT0wOyBpPGRpbXM7IGkrKyl7CisJCQkJY3ZXcml0ZVJhd0RhdGEoIGZzLCBoaXN0LT50aHJlc2gyW2ldLCBzaXplc1tpXSsxLCAiZiIgKTsKKwkJCX0KKwkJfQorCQljdkVuZFdyaXRlU3RydWN0KCBmcyApOworCX0KKworCWN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisJX19FTkRfXzsKK30KKworCitDdlR5cGUgaGlzdF90eXBlKCBDVl9UWVBFX05BTUVfSElTVCwgaWN2SXNIaXN0LCAoQ3ZSZWxlYXNlRnVuYyljdlJlbGVhc2VIaXN0LAorICAgICAgICAgICAgICAgICAgaWN2UmVhZEhpc3QsIGljdldyaXRlSGlzdCwgKEN2Q2xvbmVGdW5jKWljdkNsb25lSGlzdCApOworCisvKiBFbmQgb2YgZmlsZS4gKi8KKwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2aG91Z2guY3BwIGIvY3Yvc3JjL2N2aG91Z2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMmQ0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zob3VnaC5jcHAKQEAgLTAsMCArMSwxMTYxIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorI2luY2x1ZGUgIl9jdmxpc3QuaCIKKworI2RlZmluZSBoYWxmUGkgKChmbG9hdCkoQ1ZfUEkqMC41KSkKKyNkZWZpbmUgUGkgICAgICgoZmxvYXQpQ1ZfUEkpCisjZGVmaW5lIGEwICAwIC8qLTQuMTcyMzI1ZS03ZiovICAgLyooLShmbG9hdCkweDcpLygoZmxvYXQpMHgxMDAwMDAwKTsgKi8KKyNkZWZpbmUgYTEgMS4wMDAwMjVmICAgICAgICAvKigoZmxvYXQpMHgxOTIyMjUzKS8oKGZsb2F0KTB4MTAwMDAwMCkqMi9QaTsgKi8KKyNkZWZpbmUgYTIgLTIuNjUyOTA1ZS00ZiAgICAvKigtKGZsb2F0KTB4MmFlNikvKChmbG9hdCkweDEwMDAwMDApKjQvKFBpKlBpKTsgKi8KKyNkZWZpbmUgYTMgLTAuMTY1NjI0ZiAgICAgICAvKigtKGZsb2F0KTB4YTQ1NTExKS8oKGZsb2F0KTB4MTAwMDAwMCkqOC8oUGkqUGkqUGkpOyAqLworI2RlZmluZSBhNCAtMS45NjQ1MzJlLTNmICAgIC8qKC0oZmxvYXQpMHgzMGZkMykvKChmbG9hdCkweDEwMDAwMDApKjE2LyhQaSpQaSpQaSpQaSk7ICovCisjZGVmaW5lIGE1IDEuMDI1NzVlLTJmICAgICAgLyooKGZsb2F0KTB4MTkxY2FjKS8oKGZsb2F0KTB4MTAwMDAwMCkqMzIvKFBpKlBpKlBpKlBpKlBpKTsgKi8KKyNkZWZpbmUgYTYgLTkuNTgwMzc4ZS00ZiAgICAvKigtKGZsb2F0KTB4M2FmMjcpLygoZmxvYXQpMHgxMDAwMDAwKSo2NC8oUGkqUGkqUGkqUGkqUGkqUGkpOyAqLworCisjZGVmaW5lIF9zaW4oeCkgKCgoKCgoYTYqKHgpICsgYTUpKih4KSArIGE0KSooeCkgKyBhMykqKHgpICsgYTIpKih4KSArIGExKSooeCkgKyBhMCkKKyNkZWZpbmUgX2Nvcyh4KSBfc2luKGhhbGZQaSAtICh4KSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzaWNhbCBIb3VnaCBUcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBDdkxpbmVQb2xhcgoreworICAgIGZsb2F0IHJobzsKKyAgICBmbG9hdCBhbmdsZTsKK30KK0N2TGluZVBvbGFyOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjZGVmaW5lIGhvdWdoX2NtcF9ndChsMSxsMikgKGF1eFtsMV0gPiBhdXhbbDJdKQorCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZIb3VnaFNvcnREZXNjZW50MzJzLCBpbnQsIGhvdWdoX2NtcF9ndCwgY29uc3QgaW50KiApCisKKy8qCitIZXJlIGltYWdlIGlzIGFuIGlucHV0IHJhc3RlcjsKK3N0ZXAgaXMgaXQncyBzdGVwOyBzaXplIGNoYXJhY3Rlcml6ZXMgaXQncyBST0k7CityaG8gYW5kIHRoZXRhIGFyZSBkaXNjcmV0aXphdGlvbiBzdGVwcyAoaW4gcGl4ZWxzIGFuZCByYWRpYW5zIGNvcnJlc3BvbmRpbmdseSkuCit0aHJlc2hvbGQgaXMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHBpeGVscyBpbiB0aGUgZmVhdHVyZSBmb3IgaXQKK3RvIGJlIGEgY2FuZGlkYXRlIGZvciBsaW5lLiBsaW5lcyBpcyB0aGUgb3V0cHV0CithcnJheSBvZiAocmhvLCB0aGV0YSkgcGFpcnMuIGxpbmVzTWF4IGlzIHRoZSBidWZmZXIgc2l6ZSAobnVtYmVyIG9mIHBhaXJzKS4KK0Z1bmN0aW9ucyByZXR1cm4gdGhlIGFjdHVhbCBudW1iZXIgb2YgZm91bmQgbGluZXMuCisqLworc3RhdGljIHZvaWQKK2ljdkhvdWdoTGluZXNTdGFuZGFyZCggY29uc3QgQ3ZNYXQqIGltZywgZmxvYXQgcmhvLCBmbG9hdCB0aGV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHRocmVzaG9sZCwgQ3ZTZXEgKmxpbmVzLCBpbnQgbGluZXNNYXggKQoreworICAgIGludCAqYWNjdW0gPSAwOworICAgIGludCAqc29ydF9idWY9MDsKKyAgICBmbG9hdCAqdGFiU2luID0gMDsKKyAgICBmbG9hdCAqdGFiQ29zID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2SG91Z2hMaW5lc1N0YW5kYXJkIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGNvbnN0IHVjaGFyKiBpbWFnZTsKKyAgICBpbnQgc3RlcCwgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgbnVtYW5nbGUsIG51bXJobzsKKyAgICBpbnQgdG90YWwgPSAwOworICAgIGZsb2F0IGFuZzsKKyAgICBpbnQgciwgbjsKKyAgICBpbnQgaSwgajsKKyAgICBmbG9hdCBpcmhvID0gMSAvIHJobzsKKyAgICBkb3VibGUgc2NhbGU7CisKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChpbWcpICYmIENWX01BVF9UWVBFKGltZy0+dHlwZSkgPT0gQ1ZfOFVDMSApOworCisgICAgaW1hZ2UgPSBpbWctPmRhdGEucHRyOworICAgIHN0ZXAgPSBpbWctPnN0ZXA7CisgICAgd2lkdGggPSBpbWctPmNvbHM7CisgICAgaGVpZ2h0ID0gaW1nLT5yb3dzOworCisgICAgbnVtYW5nbGUgPSBjdlJvdW5kKENWX1BJIC8gdGhldGEpOworICAgIG51bXJobyA9IGN2Um91bmQoKCh3aWR0aCArIGhlaWdodCkgKiAyICsgMSkgLyByaG8pOworCisgICAgQ1ZfQ0FMTCggYWNjdW0gPSAoaW50KiljdkFsbG9jKCBzaXplb2YoYWNjdW1bMF0pICogKG51bWFuZ2xlKzIpICogKG51bXJobysyKSApKTsKKyAgICBDVl9DQUxMKCBzb3J0X2J1ZiA9IChpbnQqKWN2QWxsb2MoIHNpemVvZihhY2N1bVswXSkgKiBudW1hbmdsZSAqIG51bXJobyApKTsKKyAgICBDVl9DQUxMKCB0YWJTaW4gPSAoZmxvYXQqKWN2QWxsb2MoIHNpemVvZih0YWJTaW5bMF0pICogbnVtYW5nbGUgKSk7CisgICAgQ1ZfQ0FMTCggdGFiQ29zID0gKGZsb2F0KiljdkFsbG9jKCBzaXplb2YodGFiQ29zWzBdKSAqIG51bWFuZ2xlICkpOworICAgIG1lbXNldCggYWNjdW0sIDAsIHNpemVvZihhY2N1bVswXSkgKiAobnVtYW5nbGUrMikgKiAobnVtcmhvKzIpICk7CisKKyAgICBmb3IoIGFuZyA9IDAsIG4gPSAwOyBuIDwgbnVtYW5nbGU7IGFuZyArPSB0aGV0YSwgbisrICkKKyAgICB7CisgICAgICAgIHRhYlNpbltuXSA9IChmbG9hdCkoc2luKGFuZykgKiBpcmhvKTsKKyAgICAgICAgdGFiQ29zW25dID0gKGZsb2F0KShjb3MoYW5nKSAqIGlyaG8pOworICAgIH0KKworICAgIC8vIHN0YWdlIDEuIGZpbGwgYWNjdW11bGF0b3IKKyAgICBmb3IoIGkgPSAwOyBpIDwgaGVpZ2h0OyBpKysgKQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgd2lkdGg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpbWFnZVtpICogc3RlcCArIGpdICE9IDAgKQorICAgICAgICAgICAgICAgIGZvciggbiA9IDA7IG4gPCBudW1hbmdsZTsgbisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHIgPSBjdlJvdW5kKCBqICogdGFiQ29zW25dICsgaSAqIHRhYlNpbltuXSApOworICAgICAgICAgICAgICAgICAgICByICs9IChudW1yaG8gLSAxKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIGFjY3VtWyhuKzEpICogKG51bXJobysyKSArIHIrMV0rKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIC8vIHN0YWdlIDIuIGZpbmQgbG9jYWwgbWF4aW11bXMgCisgICAgZm9yKCByID0gMDsgciA8IG51bXJobzsgcisrICkKKyAgICAgICAgZm9yKCBuID0gMDsgbiA8IG51bWFuZ2xlOyBuKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYmFzZSA9IChuKzEpICogKG51bXJobysyKSArIHIrMTsKKyAgICAgICAgICAgIGlmKCBhY2N1bVtiYXNlXSA+IHRocmVzaG9sZCAmJgorICAgICAgICAgICAgICAgIGFjY3VtW2Jhc2VdID4gYWNjdW1bYmFzZSAtIDFdICYmIGFjY3VtW2Jhc2VdID49IGFjY3VtW2Jhc2UgKyAxXSAmJgorICAgICAgICAgICAgICAgIGFjY3VtW2Jhc2VdID4gYWNjdW1bYmFzZSAtIG51bXJobyAtIDJdICYmIGFjY3VtW2Jhc2VdID49IGFjY3VtW2Jhc2UgKyBudW1yaG8gKyAyXSApCisgICAgICAgICAgICAgICAgc29ydF9idWZbdG90YWwrK10gPSBiYXNlOworICAgICAgICB9CisKKyAgICAvLyBzdGFnZSAzLiBzb3J0IHRoZSBkZXRlY3RlZCBsaW5lcyBieSBhY2N1bXVsYXRvciB2YWx1ZQorICAgIGljdkhvdWdoU29ydERlc2NlbnQzMnMoIHNvcnRfYnVmLCB0b3RhbCwgYWNjdW0gKTsKKyAgICAKKyAgICAvLyBzdGFnZSA0LiBzdG9yZSB0aGUgZmlyc3QgbWluKHRvdGFsLGxpbmVzTWF4KSBsaW5lcyB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgIGxpbmVzTWF4ID0gTUlOKGxpbmVzTWF4LCB0b3RhbCk7CisgICAgc2NhbGUgPSAxLi8obnVtcmhvKzIpOworICAgIGZvciggaSA9IDA7IGkgPCBsaW5lc01heDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2TGluZVBvbGFyIGxpbmU7CisgICAgICAgIGludCBpZHggPSBzb3J0X2J1ZltpXTsKKyAgICAgICAgaW50IG4gPSBjdkZsb29yKGlkeCpzY2FsZSkgLSAxOworICAgICAgICBpbnQgciA9IGlkeCAtIChuKzEpKihudW1yaG8rMikgLSAxOworICAgICAgICBsaW5lLnJobyA9IChyIC0gKG51bXJobyAtIDEpKjAuNWYpICogcmhvOworICAgICAgICBsaW5lLmFuZ2xlID0gbiAqIHRoZXRhOworICAgICAgICBjdlNlcVB1c2goIGxpbmVzLCAmbGluZSApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdkZyZWUoICZzb3J0X2J1ZiApOworICAgIGN2RnJlZSggJnRhYlNpbiApOworICAgIGN2RnJlZSggJnRhYkNvcyApOworICAgIGN2RnJlZSggJmFjY3VtICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgTXVsdGktU2NhbGUgdmFyaWFudCBvZiBDbGFzc2ljYWwgSG91Z2ggVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQ3MTQgKQorI2VuZGlmCisKKy8vREVDTEFSRV9BTkRfSU1QTEVNRU5UX0xJU1QoIF9pbmRleCwgaF8gKTsKK0lNUExFTUVOVF9MSVNUKCBfaW5kZXgsIGhfICkKKworc3RhdGljIHZvaWQKK2ljdkhvdWdoTGluZXNTRGl2KCBjb25zdCBDdk1hdCogaW1nLAorICAgICAgICAgICAgICAgICAgIGZsb2F0IHJobywgZmxvYXQgdGhldGEsIGludCB0aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgaW50IHNybiwgaW50IHN0biwKKyAgICAgICAgICAgICAgICAgICBDdlNlcSogbGluZXMsIGludCBsaW5lc01heCApCit7CisgICAgdWNoYXIgKmNhY2N1bSA9IDA7CisgICAgdWNoYXIgKmJ1ZmZlciA9IDA7CisgICAgZmxvYXQgKnNpblRhYmxlID0gMDsKKyAgICBpbnQgKnggPSAwOworICAgIGludCAqeSA9IDA7CisgICAgX0NWTElTVCAqbGlzdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkhvdWdoTGluZXNTRGl2IiApOworCisgICAgX19CRUdJTl9fOworCisjZGVmaW5lIF9QT0lOVChyb3csIGNvbHVtbilcCisgICAgKGltYWdlX3NyY1socm93KSpzdGVwKyhjb2x1bW4pXSkKKworICAgIHVjaGFyICptY2FjY3VtID0gMDsKKyAgICBpbnQgcm4sIHRuOyAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHJobyBhbmQgdGhldGEgZGlzY3JldGUgdmFsdWVzICovCisgICAgaW50IGluZGV4LCBpOworICAgIGludCByaSwgdGksIHRpMSwgdGkwOworICAgIGludCByb3csIGNvbDsKKyAgICBmbG9hdCByLCB0OyAgICAgICAgICAgICAgICAgLyogQ3VycmVudCByaG8gYW5kIHRoZXRhICovCisgICAgZmxvYXQgcnY7ICAgICAgICAgICAgICAgICAgIC8qIFNvbWUgdGVtcG9yYXJ5IHJobyB2YWx1ZSAqLworICAgIGZsb2F0IGlyaG87CisgICAgZmxvYXQgaXRoZXRhOworICAgIGZsb2F0IHNyaG8sIHN0aGV0YTsKKyAgICBmbG9hdCBpc3JobywgaXN0aGV0YTsKKworICAgIGNvbnN0IHVjaGFyKiBpbWFnZV9zcmM7CisgICAgaW50IHcsIGgsIHN0ZXA7CisgICAgaW50IGZuID0gMDsKKyAgICBmbG9hdCB4YywgeWM7CisKKyAgICBjb25zdCBmbG9hdCBkMnIgPSAoZmxvYXQpKFBpIC8gMTgwKTsKKyAgICBpbnQgc2ZuID0gc3JuICogc3RuOworICAgIGludCBmaTsKKyAgICBpbnQgY291bnQ7CisgICAgaW50IGNtYXggPSAwOworICAgIAorICAgIENWUE9TIHBvczsKKyAgICBfaW5kZXggKnBpbmRleDsKKyAgICBfaW5kZXggdmk7CisKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChpbWcpICYmIENWX01BVF9UWVBFKGltZy0+dHlwZSkgPT0gQ1ZfOFVDMSApOworICAgIENWX0FTU0VSVCggbGluZXNNYXggPiAwICYmIHJobyA+IDAgJiYgdGhldGEgPiAwICk7CisgICAgCisgICAgdGhyZXNob2xkID0gTUlOKCB0aHJlc2hvbGQsIDI1NSApOworCisgICAgaW1hZ2Vfc3JjID0gaW1nLT5kYXRhLnB0cjsKKyAgICBzdGVwID0gaW1nLT5zdGVwOworICAgIHcgPSBpbWctPmNvbHM7CisgICAgaCA9IGltZy0+cm93czsKKworICAgIGlyaG8gPSAxIC8gcmhvOworICAgIGl0aGV0YSA9IDEgLyB0aGV0YTsKKyAgICBzcmhvID0gcmhvIC8gc3JuOworICAgIHN0aGV0YSA9IHRoZXRhIC8gc3RuOworICAgIGlzcmhvID0gMSAvIHNyaG87CisgICAgaXN0aGV0YSA9IDEgLyBzdGhldGE7CisKKyAgICBybiA9IGN2Rmxvb3IoIHNxcnQoIChkb3VibGUpdyAqIHcgKyAoZG91YmxlKWggKiBoICkgKiBpcmhvICk7CisgICAgdG4gPSBjdkZsb29yKCAyICogUGkgKiBpdGhldGEgKTsKKworICAgIGxpc3QgPSBoX2NyZWF0ZV9saXN0X19pbmRleCggbGluZXNNYXggPCAxMDAwID8gbGluZXNNYXggOiAxMDAwICk7CisgICAgdmkudmFsdWUgPSB0aHJlc2hvbGQ7CisgICAgdmkucmhvID0gLTE7CisgICAgaF9hZGRfaGVhZF9faW5kZXgoIGxpc3QsICZ2aSApOworCisgICAgLyogUHJlY2FsY3VsYXRpbmcgc2luICovCisgICAgQ1ZfQ0FMTCggc2luVGFibGUgPSAoZmxvYXQqKWN2QWxsb2MoIDUgKiB0biAqIHN0biAqIHNpemVvZiggZmxvYXQgKSkpOworCisgICAgZm9yKCBpbmRleCA9IDA7IGluZGV4IDwgNSAqIHRuICogc3RuOyBpbmRleCsrICkKKyAgICB7CisgICAgICAgIHNpblRhYmxlW2luZGV4XSA9IChmbG9hdCljb3MoIHN0aGV0YSAqIGluZGV4ICogMC4yZiApOworICAgIH0KKworICAgIENWX0NBTEwoIGNhY2N1bSA9ICh1Y2hhciopY3ZBbGxvYyggcm4gKiB0biAqIHNpemVvZiggY2FjY3VtWzBdICkpKTsKKyAgICBtZW1zZXQoIGNhY2N1bSwgMCwgcm4gKiB0biAqIHNpemVvZiggY2FjY3VtWzBdICkpOworCisgICAgLyogQ291bnRpbmcgYWxsIGZlYXR1cmUgcGl4ZWxzICovCisgICAgZm9yKCByb3cgPSAwOyByb3cgPCBoOyByb3crKyApCisgICAgICAgIGZvciggY29sID0gMDsgY29sIDwgdzsgY29sKysgKQorICAgICAgICAgICAgZm4gKz0gX1BPSU5UKCByb3csIGNvbCApICE9IDA7CisKKyAgICBDVl9DQUxMKCB4ID0gKGludCopY3ZBbGxvYyggZm4gKiBzaXplb2YoeFswXSkpKTsKKyAgICBDVl9DQUxMKCB5ID0gKGludCopY3ZBbGxvYyggZm4gKiBzaXplb2YoeVswXSkpKTsKKworICAgIC8qIEZ1bGwgSG91Z2ggVHJhbnNmb3JtIChpdCdzIGFjY3VtdWxhdG9yIHVwZGF0ZSBwYXJ0KSAqLworICAgIGZpID0gMDsKKyAgICBmb3IoIHJvdyA9IDA7IHJvdyA8IGg7IHJvdysrICkKKyAgICB7CisgICAgICAgIGZvciggY29sID0gMDsgY29sIDwgdzsgY29sKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggX1BPSU5UKCByb3csIGNvbCApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBoYWxmdG47CisgICAgICAgICAgICAgICAgZmxvYXQgcjA7CisgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGVfZmFjdG9yOworICAgICAgICAgICAgICAgIGludCBpcHJldiA9IC0xOworICAgICAgICAgICAgICAgIGZsb2F0IHBoaSwgcGhpMTsKKyAgICAgICAgICAgICAgICBmbG9hdCB0aGV0YV9pdDsgICAgIC8qIFZhbHVlIG9mIHRoZXRhIGZvciBpdGVyYXRpbmcgKi8KKworICAgICAgICAgICAgICAgIC8qIFJlbWVtYmVyIHRoZSBmZWF0dXJlIHBvaW50ICovCisgICAgICAgICAgICAgICAgeFtmaV0gPSBjb2w7CisgICAgICAgICAgICAgICAgeVtmaV0gPSByb3c7CisgICAgICAgICAgICAgICAgZmkrKzsKKworICAgICAgICAgICAgICAgIHljID0gKGZsb2F0KSByb3cgKyAwLjVmOworICAgICAgICAgICAgICAgIHhjID0gKGZsb2F0KSBjb2wgKyAwLjVmOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBhY2N1bXVsYXRvciAqLworICAgICAgICAgICAgICAgIHQgPSAoZmxvYXQpIGZhYnMoIGN2RmFzdEFyY3RhbiggeWMsIHhjICkgKiBkMnIgKTsKKyAgICAgICAgICAgICAgICByID0gKGZsb2F0KSBzcXJ0KCAoZG91YmxlKXhjICogeGMgKyAoZG91YmxlKXljICogeWMgKTsKKyAgICAgICAgICAgICAgICByMCA9IHIgKiBpcmhvOworICAgICAgICAgICAgICAgIHRpMCA9IGN2Rmxvb3IoICh0ICsgUGkgLyAyKSAqIGl0aGV0YSApOworCisgICAgICAgICAgICAgICAgY2FjY3VtW3RpMF0rKzsKKworICAgICAgICAgICAgICAgIHRoZXRhX2l0ID0gcmhvIC8gcjsKKyAgICAgICAgICAgICAgICB0aGV0YV9pdCA9IHRoZXRhX2l0IDwgdGhldGEgPyB0aGV0YV9pdCA6IHRoZXRhOworICAgICAgICAgICAgICAgIHNjYWxlX2ZhY3RvciA9IHRoZXRhX2l0ICogaXRoZXRhOworICAgICAgICAgICAgICAgIGhhbGZ0biA9IGN2Rmxvb3IoIFBpIC8gdGhldGFfaXQgKTsKKyAgICAgICAgICAgICAgICBmb3IoIHRpMSA9IDEsIHBoaSA9IHRoZXRhX2l0IC0gaGFsZlBpLCBwaGkxID0gKHRoZXRhX2l0ICsgdCkgKiBpdGhldGE7CisgICAgICAgICAgICAgICAgICAgICB0aTEgPCBoYWxmdG47IHRpMSsrLCBwaGkgKz0gdGhldGFfaXQsIHBoaTEgKz0gc2NhbGVfZmFjdG9yICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gcjAgKiBfY29zKCBwaGkgKTsKKyAgICAgICAgICAgICAgICAgICAgaSA9IGN2Rmxvb3IoIHJ2ICkgKiB0bjsKKyAgICAgICAgICAgICAgICAgICAgaSArPSBjdkZsb29yKCBwaGkxICk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggaSA+PSAwICk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggaSA8IHJuICogdG4gKTsKKyAgICAgICAgICAgICAgICAgICAgY2FjY3VtW2ldID0gKHVjaGFyKSAoY2FjY3VtW2ldICsgKChpIF4gaXByZXYpICE9IDApKTsKKyAgICAgICAgICAgICAgICAgICAgaXByZXYgPSBpOworICAgICAgICAgICAgICAgICAgICBpZiggY21heCA8IGNhY2N1bVtpXSApCisgICAgICAgICAgICAgICAgICAgICAgICBjbWF4ID0gY2FjY3VtW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFN0YXJ0aW5nIGFkZGl0aW9uYWwgYW5hbHlzaXMgKi8KKyAgICBjb3VudCA9IDA7CisgICAgZm9yKCByaSA9IDA7IHJpIDwgcm47IHJpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCB0aSA9IDA7IHRpIDwgdG47IHRpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY2FjY3VtW3JpICogdG4gKyB0aSA+IHRocmVzaG9sZF0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggY291bnQgKiAxMDAgPiBybiAqIHRuICkKKyAgICB7CisgICAgICAgIGljdkhvdWdoTGluZXNTdGFuZGFyZCggaW1nLCByaG8sIHRoZXRhLCB0aHJlc2hvbGQsIGxpbmVzLCBsaW5lc01heCApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciAqKSBjdkFsbG9jKHNybiAqIHN0biArIDIpKTsKKyAgICBtY2FjY3VtID0gYnVmZmVyICsgMTsKKworICAgIGNvdW50ID0gMDsKKyAgICBmb3IoIHJpID0gMDsgcmkgPCBybjsgcmkrKyApCisgICAgeworICAgICAgICBmb3IoIHRpID0gMDsgdGkgPCB0bjsgdGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjYWNjdW1bcmkgKiB0biArIHRpXSA+IHRocmVzaG9sZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBtZW1zZXQoIG1jYWNjdW0sIDAsIHNmbiAqIHNpemVvZiggdWNoYXIgKSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGluZGV4ID0gMDsgaW5kZXggPCBmbjsgaW5kZXgrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdGkyOworICAgICAgICAgICAgICAgICAgICBmbG9hdCByMDsKKworICAgICAgICAgICAgICAgICAgICB5YyA9IChmbG9hdCkgeVtpbmRleF0gKyAwLjVmOworICAgICAgICAgICAgICAgICAgICB4YyA9IChmbG9hdCkgeFtpbmRleF0gKyAwLjVmOworCisgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYWNjdW11bGF0b3IgKi8KKyAgICAgICAgICAgICAgICAgICAgdCA9IChmbG9hdCkgZmFicyggY3ZGYXN0QXJjdGFuKCB5YywgeGMgKSAqIGQyciApOworICAgICAgICAgICAgICAgICAgICByID0gKGZsb2F0KSBzcXJ0KCAoZG91YmxlKXhjICogeGMgKyAoZG91YmxlKXljICogeWMgKSAqIGlzcmhvOworICAgICAgICAgICAgICAgICAgICB0aTAgPSBjdkZsb29yKCAodCArIFBpICogMC41ZikgKiBpc3RoZXRhICk7CisgICAgICAgICAgICAgICAgICAgIHRpMiA9ICh0aSAqIHN0biAtIHRpMCkgKiA1OworICAgICAgICAgICAgICAgICAgICByMCA9IChmbG9hdCkgcmkgKnNybjsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHRpMSA9IDAgLyosIHBoaSA9IHRpKnRoZXRhIC0gUGkvMiAtIHQgKi8gOyB0aTEgPCBzdG47IHRpMSsrLCB0aTIgKz0gNQorICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGhpICs9IHN0aGV0YSAqLyAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKnJ2ID0gcipfY29zKHBoaSkgLSByMDsgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJ2ID0gciAqIHNpblRhYmxlWyhpbnQpIChhYnMoIHRpMiApKV0gLSByMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBjdkZsb29yKCBydiApICogc3RuICsgdGkxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpID0gQ1ZfSU1BWCggaSwgLTEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBDVl9JTUlOKCBpLCBzZm4gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1jYWNjdW1baV0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggaSA+PSAtMSApOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBpIDw9IHNmbiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogRmluZCBwZWFrcyBpbiBtYWNjdW0uLi4gKi8KKyAgICAgICAgICAgICAgICBmb3IoIGluZGV4ID0gMDsgaW5kZXggPCBzZm47IGluZGV4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IGhfZ2V0X3RhaWxfcG9zX19pbmRleCggbGlzdCApOworICAgICAgICAgICAgICAgICAgICBpZiggaF9nZXRfcHJldl9faW5kZXgoICZwb3MgKS0+dmFsdWUgPCBtY2FjY3VtW2luZGV4XSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpLnZhbHVlID0gbWNhY2N1bVtpbmRleF07CisgICAgICAgICAgICAgICAgICAgICAgICB2aS5yaG8gPSBpbmRleCAvIHN0biAqIHNyaG8gKyByaSAqIHJobzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpLnRoZXRhID0gaW5kZXggJSBzdG4gKiBzdGhldGEgKyB0aSAqIHRoZXRhIC0gaGFsZlBpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGhfaXNfcG9zX19pbmRleCggcG9zICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGhfZ2V0X19pbmRleCggcG9zICktPnZhbHVlID4gbWNhY2N1bVtpbmRleF0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9pbnNlcnRfYWZ0ZXJfX2luZGV4KCBsaXN0LCBwb3MsICZ2aSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaF9nZXRfY291bnRfX2luZGV4KCBsaXN0ICkgPiBsaW5lc01heCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfcmVtb3ZlX3RhaWxfX2luZGV4KCBsaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfZ2V0X3ByZXZfX2luZGV4KCAmcG9zICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIWhfaXNfcG9zX19pbmRleCggcG9zICkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaF9hZGRfaGVhZF9faW5kZXgoIGxpc3QsICZ2aSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBoX2dldF9jb3VudF9faW5kZXgoIGxpc3QgKSA+IGxpbmVzTWF4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhfcmVtb3ZlX3RhaWxfX2luZGV4KCBsaXN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcG9zID0gaF9nZXRfaGVhZF9wb3NfX2luZGV4KCBsaXN0ICk7CisgICAgaWYoIGhfZ2V0X2NvdW50X19pbmRleCggbGlzdCApID09IDEgKQorICAgIHsKKyAgICAgICAgaWYoIGhfZ2V0X19pbmRleCggcG9zICktPnJobyA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBoX2NsZWFyX2xpc3RfX2luZGV4KCBsaXN0ICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2hpbGUoIGhfaXNfcG9zX19pbmRleCggcG9zICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TGluZVBvbGFyIGxpbmU7CisgICAgICAgICAgICBwaW5kZXggPSBoX2dldF9faW5kZXgoIHBvcyApOworICAgICAgICAgICAgaWYoIHBpbmRleC0+cmhvIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgYmUgdGhlIGxhc3QgZWxlbWVudC4uLiAqLworICAgICAgICAgICAgICAgIGhfZ2V0X25leHRfX2luZGV4KCAmcG9zICk7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCAhaF9pc19wb3NfX2luZGV4KCBwb3MgKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaW5lLnJobyA9IHBpbmRleC0+cmhvOworICAgICAgICAgICAgbGluZS5hbmdsZSA9IHBpbmRleC0+dGhldGE7CisgICAgICAgICAgICBjdlNlcVB1c2goIGxpbmVzLCAmbGluZSApOworCisgICAgICAgICAgICBpZiggbGluZXMtPnRvdGFsID49IGxpbmVzTWF4ICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgaF9nZXRfbmV4dF9faW5kZXgoICZwb3MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBoX2Rlc3Ryb3lfbGlzdF9faW5kZXgoIGxpc3QgKTsKKyAgICBjdkZyZWUoICZzaW5UYWJsZSApOworICAgIGN2RnJlZSggJnggKTsKKyAgICBjdkZyZWUoICZ5ICk7CisgICAgY3ZGcmVlKCAmY2FjY3VtICk7CisgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYmFiaWxpc3RpYyBIb3VnaCBUcmFuc2Zvcm0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgZGVmaW5lZCBXSU42NCAmJiBkZWZpbmVkIEVNNjRUICYmIF9NU0NfVkVSID09IDE0MDAgJiYgIWRlZmluZWQgQ1ZfSUNDCisjcHJhZ21hIG9wdGltaXplKCIiLG9mZikKKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraWN2SG91Z2hMaW5lc1Byb2JhYmFsaXN0aWMoIEN2TWF0KiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByaG8sIGZsb2F0IHRoZXRhLCBpbnQgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lTGVuZ3RoLCBpbnQgbGluZUdhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSAqbGluZXMsIGludCBsaW5lc01heCApCit7CisgICAgQ3ZNYXQqIGFjY3VtID0gMDsKKyAgICBDdk1hdCogbWFzayA9IDA7CisgICAgQ3ZNYXQqIHRyaWd0YWIgPSAwOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkhvdWdoTGluZXNQcm9iYWxpc3RpYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBDdlNlcSogc2VxOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBpbnQgbnVtYW5nbGUsIG51bXJobzsKKyAgICBmbG9hdCBhbmc7CisgICAgaW50IHIsIG4sIGNvdW50OworICAgIEN2UG9pbnQgcHQ7CisgICAgZmxvYXQgaXJobyA9IDEgLyByaG87CisgICAgQ3ZSTkcgcm5nID0gY3ZSTkcoLTEpOworICAgIGNvbnN0IGZsb2F0KiB0dGFiOworICAgIHVjaGFyKiBtZGF0YTA7CisKKyAgICBDVl9BU1NFUlQoIENWX0lTX01BVChpbWFnZSkgJiYgQ1ZfTUFUX1RZUEUoaW1hZ2UtPnR5cGUpID09IENWXzhVQzEgKTsKKworICAgIHdpZHRoID0gaW1hZ2UtPmNvbHM7CisgICAgaGVpZ2h0ID0gaW1hZ2UtPnJvd3M7CisKKyAgICBudW1hbmdsZSA9IGN2Um91bmQoQ1ZfUEkgLyB0aGV0YSk7CisgICAgbnVtcmhvID0gY3ZSb3VuZCgoKHdpZHRoICsgaGVpZ2h0KSAqIDIgKyAxKSAvIHJobyk7CisKKyAgICBDVl9DQUxMKCBhY2N1bSA9IGN2Q3JlYXRlTWF0KCBudW1hbmdsZSwgbnVtcmhvLCBDVl8zMlNDMSApKTsKKyAgICBDVl9DQUxMKCBtYXNrID0gY3ZDcmVhdGVNYXQoIGhlaWdodCwgd2lkdGgsIENWXzhVQzEgKSk7CisgICAgQ1ZfQ0FMTCggdHJpZ3RhYiA9IGN2Q3JlYXRlTWF0KCAxLCBudW1hbmdsZSwgQ1ZfMzJGQzIgKSk7CisgICAgY3ZaZXJvKCBhY2N1bSApOworICAgIAorICAgIENWX0NBTEwoIHN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoMCkgKTsKKyAgICAKKyAgICBmb3IoIGFuZyA9IDAsIG4gPSAwOyBuIDwgbnVtYW5nbGU7IGFuZyArPSB0aGV0YSwgbisrICkKKyAgICB7CisgICAgICAgIHRyaWd0YWItPmRhdGEuZmxbbioyXSA9IChmbG9hdCkoY29zKGFuZykgKiBpcmhvKTsKKyAgICAgICAgdHJpZ3RhYi0+ZGF0YS5mbFtuKjIrMV0gPSAoZmxvYXQpKHNpbihhbmcpICogaXJobyk7CisgICAgfQorICAgIHR0YWIgPSB0cmlndGFiLT5kYXRhLmZsOworICAgIG1kYXRhMCA9IG1hc2stPmRhdGEucHRyOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU2VxKCBDVl8zMlNDMiwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2UG9pbnQpLCBzdG9yYWdlLCAmd3JpdGVyICkpOyAKKworICAgIC8vIHN0YWdlIDEuIGNvbGxlY3Qgbm9uLXplcm8gaW1hZ2UgcG9pbnRzCisgICAgZm9yKCBwdC55ID0gMCwgY291bnQgPSAwOyBwdC55IDwgaGVpZ2h0OyBwdC55KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIGRhdGEgPSBpbWFnZS0+ZGF0YS5wdHIgKyBwdC55KmltYWdlLT5zdGVwOworICAgICAgICB1Y2hhciogbWRhdGEgPSBtZGF0YTAgKyBwdC55KndpZHRoOworICAgICAgICBmb3IoIHB0LnggPSAwOyBwdC54IDwgd2lkdGg7IHB0LngrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkYXRhW3B0LnhdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZGF0YVtwdC54XSA9ICh1Y2hhcikxOworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbWRhdGFbcHQueF0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgc2VxID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgIGNvdW50ID0gc2VxLT50b3RhbDsKKworICAgIC8vIHN0YWdlIDIuIHByb2Nlc3MgYWxsIHRoZSBwb2ludHMgaW4gcmFuZG9tIG9yZGVyCisgICAgZm9yKCA7IGNvdW50ID4gMDsgY291bnQtLSApCisgICAgeworICAgICAgICAvLyBjaG9vc2UgcmFuZG9tIHBvaW50IG91dCBvZiB0aGUgcmVtYWluaW5nIG9uZXMKKyAgICAgICAgaW50IGlkeCA9IGN2UmFuZEludCgmcm5nKSAlIGNvdW50OworICAgICAgICBpbnQgbWF4X3ZhbCA9IHRocmVzaG9sZC0xLCBtYXhfbiA9IDA7CisgICAgICAgIEN2UG9pbnQqIHB0ID0gKEN2UG9pbnQqKWN2R2V0U2VxRWxlbSggc2VxLCBpZHggKTsKKyAgICAgICAgQ3ZQb2ludCBsaW5lX2VuZFsyXSA9IHt7MCwwfSwgezAsMH19OworICAgICAgICBmbG9hdCBhLCBiOworICAgICAgICBpbnQqIGFkYXRhID0gYWNjdW0tPmRhdGEuaTsKKyAgICAgICAgaW50IGksIGosIGssIHgwLCB5MCwgZHgwLCBkeTAsIHhmbGFnOworICAgICAgICBpbnQgZ29vZF9saW5lOworICAgICAgICBjb25zdCBpbnQgc2hpZnQgPSAxNjsKKworICAgICAgICBpID0gcHQtPnk7CisgICAgICAgIGogPSBwdC0+eDsKKworICAgICAgICAvLyAicmVtb3ZlIiBpdCBieSBvdmVycmlkaW5nIGl0IHdpdGggdGhlIGxhc3QgZWxlbWVudAorICAgICAgICAqcHQgPSAqKEN2UG9pbnQqKWN2R2V0U2VxRWxlbSggc2VxLCBjb3VudC0xICk7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgaXQgaGFzIGJlZW4gZXhjbHVkZWQgYWxyZWFkeSAoaS5lLiBiZWxvbmdzIHRvIHNvbWUgb3RoZXIgbGluZSkKKyAgICAgICAgaWYoICFtZGF0YTBbaSp3aWR0aCArIGpdICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIHVwZGF0ZSBhY2N1bXVsYXRvciwgZmluZCB0aGUgbW9zdCBwcm9iYWJsZSBsaW5lCisgICAgICAgIGZvciggbiA9IDA7IG4gPCBudW1hbmdsZTsgbisrLCBhZGF0YSArPSBudW1yaG8gKQorICAgICAgICB7CisgICAgICAgICAgICByID0gY3ZSb3VuZCggaiAqIHR0YWJbbioyXSArIGkgKiB0dGFiW24qMisxXSApOworICAgICAgICAgICAgciArPSAobnVtcmhvIC0gMSkgLyAyOworICAgICAgICAgICAgaW50IHZhbCA9ICsrYWRhdGFbcl07CisgICAgICAgICAgICBpZiggbWF4X3ZhbCA8IHZhbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4X3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBtYXhfbiA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiBpdCBpcyB0b28gIndlYWsiIGNhbmRpZGF0ZSwgY29udGludWUgd2l0aCBhbm90aGVyIHBvaW50CisgICAgICAgIGlmKCBtYXhfdmFsIDwgdGhyZXNob2xkICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQgd2FsayBpbiBlYWNoIGRpcmVjdGlvbgorICAgICAgICAvLyBhbG9uZyB0aGUgZm91bmQgbGluZSBhbmQgZXh0cmFjdCB0aGUgbGluZSBzZWdtZW50CisgICAgICAgIGEgPSAtdHRhYlttYXhfbioyKzFdOworICAgICAgICBiID0gdHRhYlttYXhfbioyXTsKKyAgICAgICAgeDAgPSBqOworICAgICAgICB5MCA9IGk7CisgICAgICAgIGlmKCBmYWJzKGEpID4gZmFicyhiKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHhmbGFnID0gMTsKKyAgICAgICAgICAgIGR4MCA9IGEgPiAwID8gMSA6IC0xOworICAgICAgICAgICAgZHkwID0gY3ZSb3VuZCggYiooMSA8PCBzaGlmdCkvZmFicyhhKSApOworICAgICAgICAgICAgeTAgPSAoeTAgPDwgc2hpZnQpICsgKDEgPDwgKHNoaWZ0LTEpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHhmbGFnID0gMDsKKyAgICAgICAgICAgIGR5MCA9IGIgPiAwID8gMSA6IC0xOworICAgICAgICAgICAgZHgwID0gY3ZSb3VuZCggYSooMSA8PCBzaGlmdCkvZmFicyhiKSApOworICAgICAgICAgICAgeDAgPSAoeDAgPDwgc2hpZnQpICsgKDEgPDwgKHNoaWZ0LTEpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ2FwID0gMCwgeCA9IHgwLCB5ID0geTAsIGR4ID0gZHgwLCBkeSA9IGR5MDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGsgPiAwICkKKyAgICAgICAgICAgICAgICBkeCA9IC1keCwgZHkgPSAtZHk7CisKKyAgICAgICAgICAgIC8vIHdhbGsgYWxvbmcgdGhlIGxpbmUgdXNpbmcgZml4ZWQtcG9pbnQgYXJpdGhtZXRpY3MsCisgICAgICAgICAgICAvLyBzdG9wIGF0IHRoZSBpbWFnZSBib3JkZXIgb3IgaW4gY2FzZSBvZiB0b28gYmlnIGdhcAorICAgICAgICAgICAgZm9yKCA7OyB4ICs9IGR4LCB5ICs9IGR5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogbWRhdGE7CisgICAgICAgICAgICAgICAgaW50IGkxLCBqMTsKKworICAgICAgICAgICAgICAgIGlmKCB4ZmxhZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqMSA9IHg7CisgICAgICAgICAgICAgICAgICAgIGkxID0geSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgajEgPSB4ID4+IHNoaWZ0OworICAgICAgICAgICAgICAgICAgICBpMSA9IHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGoxIDwgMCB8fCBqMSA+PSB3aWR0aCB8fCBpMSA8IDAgfHwgaTEgPj0gaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBtZGF0YSA9IG1kYXRhMCArIGkxKndpZHRoICsgajE7CisKKyAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBub24temVybyBwb2ludDoKKyAgICAgICAgICAgICAgICAvLyAgICB1cGRhdGUgbGluZSBlbmQsCisgICAgICAgICAgICAgICAgLy8gICAgY2xlYXIgdGhlIG1hc2sgZWxlbWVudAorICAgICAgICAgICAgICAgIC8vICAgIHJlc2V0IHRoZSBnYXAKKyAgICAgICAgICAgICAgICBpZiggKm1kYXRhICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGdhcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbmVfZW5kW2tdLnkgPSBpMTsKKyAgICAgICAgICAgICAgICAgICAgbGluZV9lbmRba10ueCA9IGoxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCArK2dhcCA+IGxpbmVHYXAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdvb2RfbGluZSA9IGFicyhsaW5lX2VuZFsxXS54IC0gbGluZV9lbmRbMF0ueCkgPj0gbGluZUxlbmd0aCB8fAorICAgICAgICAgICAgICAgICAgICBhYnMobGluZV9lbmRbMV0ueSAtIGxpbmVfZW5kWzBdLnkpID49IGxpbmVMZW5ndGg7CisKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB4ID0geDAsIHkgPSB5MCwgZHggPSBkeDAsIGR5ID0gZHkwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggayA+IDAgKQorICAgICAgICAgICAgICAgIGR4ID0gLWR4LCBkeSA9IC1keTsKKworICAgICAgICAgICAgLy8gd2FsayBhbG9uZyB0aGUgbGluZSB1c2luZyBmaXhlZC1wb2ludCBhcml0aG1ldGljcywKKyAgICAgICAgICAgIC8vIHN0b3AgYXQgdGhlIGltYWdlIGJvcmRlciBvciBpbiBjYXNlIG9mIHRvbyBiaWcgZ2FwCisgICAgICAgICAgICBmb3IoIDs7IHggKz0gZHgsIHkgKz0gZHkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyKiBtZGF0YTsKKyAgICAgICAgICAgICAgICBpbnQgaTEsIGoxOworCisgICAgICAgICAgICAgICAgaWYoIHhmbGFnICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGoxID0geDsKKyAgICAgICAgICAgICAgICAgICAgaTEgPSB5ID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqMSA9IHggPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGkxID0geTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZGF0YSA9IG1kYXRhMCArIGkxKndpZHRoICsgajE7CisKKyAgICAgICAgICAgICAgICAvLyBmb3IgZWFjaCBub24temVybyBwb2ludDoKKyAgICAgICAgICAgICAgICAvLyAgICB1cGRhdGUgbGluZSBlbmQsCisgICAgICAgICAgICAgICAgLy8gICAgY2xlYXIgdGhlIG1hc2sgZWxlbWVudAorICAgICAgICAgICAgICAgIC8vICAgIHJlc2V0IHRoZSBnYXAKKyAgICAgICAgICAgICAgICBpZiggKm1kYXRhICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBnb29kX2xpbmUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZGF0YSA9IGFjY3VtLT5kYXRhLmk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIG4gPSAwOyBuIDwgbnVtYW5nbGU7IG4rKywgYWRhdGEgKz0gbnVtcmhvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0gY3ZSb3VuZCggajEgKiB0dGFiW24qMl0gKyBpMSAqIHR0YWJbbioyKzFdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciArPSAobnVtcmhvIC0gMSkgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYXRhW3JdLS07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKm1kYXRhID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggaTEgPT0gbGluZV9lbmRba10ueSAmJiBqMSA9PSBsaW5lX2VuZFtrXS54ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggZ29vZF9saW5lICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZSZWN0IGxyID0geyBsaW5lX2VuZFswXS54LCBsaW5lX2VuZFswXS55LCBsaW5lX2VuZFsxXS54LCBsaW5lX2VuZFsxXS55IH07CisgICAgICAgICAgICBjdlNlcVB1c2goIGxpbmVzLCAmbHIgKTsKKyAgICAgICAgICAgIGlmKCBsaW5lcy0+dG90YWwgPj0gbGluZXNNYXggKQorICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmYWNjdW0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZtYXNrICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdHJpZ3RhYiApOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7Cit9CisKKworI2lmIGRlZmluZWQgV0lONjQgJiYgZGVmaW5lZCBFTTY0VCAmJiBfTVNDX1ZFUiA9PSAxNDAwICYmICFkZWZpbmVkIENWX0lDQworI3ByYWdtYSBvcHRpbWl6ZSgiIixvbikKKyNlbmRpZgorCisKKy8qIFdyYXBwZXIgZnVuY3Rpb24gZm9yIHN0YW5kYXJkIGhvdWdoIHRyYW5zZm9ybSAqLworQ1ZfSU1QTCBDdlNlcSoKK2N2SG91Z2hMaW5lczIoIEN2QXJyKiBzcmNfaW1hZ2UsIHZvaWQqIGxpbmVTdG9yYWdlLCBpbnQgbWV0aG9kLAorICAgICAgICAgICAgICAgZG91YmxlIHJobywgZG91YmxlIHRoZXRhLCBpbnQgdGhyZXNob2xkLAorICAgICAgICAgICAgICAgZG91YmxlIHBhcmFtMSwgZG91YmxlIHBhcmFtMiApCit7CisgICAgQ3ZTZXEqIHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2SG91Z2hMaW5lcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBDdk1hdCBzdHViLCAqaW1nID0gKEN2TWF0KilzcmNfaW1hZ2U7CisgICAgQ3ZNYXQqIG1hdCA9IDA7CisgICAgQ3ZTZXEqIGxpbmVzID0gMDsKKyAgICBDdlNlcSBsaW5lc19oZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBsaW5lc19ibG9jazsKKyAgICBpbnQgbGluZVR5cGUsIGVsZW1TaXplOworICAgIGludCBsaW5lc01heCA9IElOVF9NQVg7CisgICAgaW50IGlwYXJhbTEsIGlwYXJhbTI7CisKKyAgICBDVl9DQUxMKCBpbWcgPSBjdkdldE1hdCggaW1nLCAmc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoaW1nKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBzb3VyY2UgaW1hZ2UgbXVzdCBiZSA4LWJpdCwgc2luZ2xlLWNoYW5uZWwiICk7CisKKyAgICBpZiggIWxpbmVTdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGRlc3RpbmF0aW9uIiApOworCisgICAgaWYoIHJobyA8PSAwIHx8IHRoZXRhIDw9IDAgfHwgdGhyZXNob2xkIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInJobywgdGhldGEgYW5kIHRocmVzaG9sZCBtdXN0IGJlIHBvc2l0aXZlIiApOworCisgICAgaWYoIG1ldGhvZCAhPSBDVl9IT1VHSF9QUk9CQUJJTElTVElDICkKKyAgICB7CisgICAgICAgIGxpbmVUeXBlID0gQ1ZfMzJGQzI7CisgICAgICAgIGVsZW1TaXplID0gc2l6ZW9mKGZsb2F0KSoyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsaW5lVHlwZSA9IENWXzMyU0M0OworICAgICAgICBlbGVtU2l6ZSA9IHNpemVvZihpbnQpKjQ7CisgICAgfQorCisgICAgaWYoIENWX0lTX1NUT1JBR0UoIGxpbmVTdG9yYWdlICkpCisgICAgeworICAgICAgICBDVl9DQUxMKCBsaW5lcyA9IGN2Q3JlYXRlU2VxKCBsaW5lVHlwZSwgc2l6ZW9mKEN2U2VxKSwgZWxlbVNpemUsIChDdk1lbVN0b3JhZ2UqKWxpbmVTdG9yYWdlICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19NQVQoIGxpbmVTdG9yYWdlICkpCisgICAgeworICAgICAgICBtYXQgPSAoQ3ZNYXQqKWxpbmVTdG9yYWdlOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSApIHx8IChtYXQtPnJvd3MgIT0gMSAmJiBtYXQtPmNvbHMgIT0gMSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUaGUgZGVzdGluYXRpb24gbWF0cml4IHNob3VsZCBiZSBjb250aW51b3VzIGFuZCBoYXZlIGEgc2luZ2xlIHJvdyBvciBhIHNpbmdsZSBjb2x1bW4iICk7CisKKyAgICAgICAgaWYoIENWX01BVF9UWVBFKCBtYXQtPnR5cGUgKSAhPSBsaW5lVHlwZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgIlRoZSBkZXN0aW5hdGlvbiBtYXRyaXggZGF0YSB0eXBlIGlzIGluYXBwcm9wcmlhdGUsIHNlZSB0aGUgbWFudWFsIiApOworCisgICAgICAgIENWX0NBTEwoIGxpbmVzID0gY3ZNYWtlU2VxSGVhZGVyRm9yQXJyYXkoIGxpbmVUeXBlLCBzaXplb2YoQ3ZTZXEpLCBlbGVtU2l6ZSwgbWF0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LT5yb3dzICsgbWF0LT5jb2xzIC0gMSwgJmxpbmVzX2hlYWRlciwgJmxpbmVzX2Jsb2NrICkpOworICAgICAgICBsaW5lc01heCA9IGxpbmVzLT50b3RhbDsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDbGVhclNlcSggbGluZXMgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEZXN0aW5hdGlvbiBpcyBub3QgQ3ZNZW1TdG9yYWdlKiBub3IgQ3ZNYXQqIiApOworICAgIH0KKworICAgIGlwYXJhbTEgPSBjdlJvdW5kKHBhcmFtMSk7CisgICAgaXBhcmFtMiA9IGN2Um91bmQocGFyYW0yKTsKKworICAgIHN3aXRjaCggbWV0aG9kICkKKyAgICB7CisgICAgY2FzZSBDVl9IT1VHSF9TVEFOREFSRDoKKyAgICAgICAgICBDVl9DQUxMKCBpY3ZIb3VnaExpbmVzU3RhbmRhcmQoIGltZywgKGZsb2F0KXJobywKKyAgICAgICAgICAgICAgICAoZmxvYXQpdGhldGEsIHRocmVzaG9sZCwgbGluZXMsIGxpbmVzTWF4ICkpOworICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfSE9VR0hfTVVMVElfU0NBTEU6CisgICAgICAgICAgQ1ZfQ0FMTCggaWN2SG91Z2hMaW5lc1NEaXYoIGltZywgKGZsb2F0KXJobywgKGZsb2F0KXRoZXRhLAorICAgICAgICAgICAgICAgIHRocmVzaG9sZCwgaXBhcmFtMSwgaXBhcmFtMiwgbGluZXMsIGxpbmVzTWF4ICkpOworICAgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfSE9VR0hfUFJPQkFCSUxJU1RJQzoKKyAgICAgICAgICBDVl9DQUxMKCBpY3ZIb3VnaExpbmVzUHJvYmFiYWxpc3RpYyggaW1nLCAoZmxvYXQpcmhvLCAoZmxvYXQpdGhldGEsCisgICAgICAgICAgICAgICAgdGhyZXNob2xkLCBpcGFyYW0xLCBpcGFyYW0yLCBsaW5lcywgbGluZXNNYXggKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVucmVjb2duaXplZCBtZXRob2QgaWQiICk7CisgICAgfQorCisgICAgaWYoIG1hdCApCisgICAgeworICAgICAgICBpZiggbWF0LT5jb2xzID4gbWF0LT5yb3dzICkKKyAgICAgICAgICAgIG1hdC0+Y29scyA9IGxpbmVzLT50b3RhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF0LT5yb3dzID0gbGluZXMtPnRvdGFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSBsaW5lczsKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIAorICAgIHJldHVybiByZXN1bHQ7ICAgIAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaXJjbGUgRGV0ZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2ljdkhvdWdoQ2lyY2xlc0dyYWRpZW50KCBDdk1hdCogaW1nLCBmbG9hdCBkcCwgZmxvYXQgbWluX2Rpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9yYWRpdXMsIGludCBtYXhfcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW5ueV90aHJlc2hvbGQsIGludCBhY2NfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBjaXJjbGVzLCBpbnQgY2lyY2xlc19tYXggKQoreworICAgIGNvbnN0IGludCBTSElGVCA9IDEwLCBPTkUgPSAxIDw8IFNISUZULCBSX1RIUkVTSCA9IDMwOworICAgIEN2TWF0ICpkeCA9IDAsICpkeSA9IDA7CisgICAgQ3ZNYXQgKmVkZ2VzID0gMDsKKyAgICBDdk1hdCAqYWNjdW0gPSAwOworICAgIGludCogc29ydF9idWYgPSAwOworICAgIEN2TWF0KiBkaXN0X2J1ZiA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImljdkhvdWdoQ2lyY2xlc0dyYWRpZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHgsIHksIGksIGosIGNlbnRlcl9jb3VudCwgbnpfY291bnQ7CisgICAgaW50IHJvd3MsIGNvbHMsIGFyb3dzLCBhY29sczsKKyAgICBpbnQgYXN0ZXAsICphZGF0YTsKKyAgICBmbG9hdCogZGRhdGE7CisgICAgQ3ZTZXEgKm56LCAqY2VudGVyczsKKyAgICBmbG9hdCBpZHAsIGRyOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgIENWX0NBTEwoIGVkZ2VzID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl84VUMxICkpOworICAgIENWX0NBTEwoIGN2Q2FubnkoIGltZywgZWRnZXMsIE1BWChjYW5ueV90aHJlc2hvbGQvMiwxKSwgY2FubnlfdGhyZXNob2xkLCAzICkpOworCisgICAgQ1ZfQ0FMTCggZHggPSBjdkNyZWF0ZU1hdCggaW1nLT5yb3dzLCBpbWctPmNvbHMsIENWXzE2U0MxICkpOworICAgIENWX0NBTEwoIGR5ID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl8xNlNDMSApKTsKKyAgICBDVl9DQUxMKCBjdlNvYmVsKCBpbWcsIGR4LCAxLCAwLCAzICkpOworICAgIENWX0NBTEwoIGN2U29iZWwoIGltZywgZHksIDAsIDEsIDMgKSk7CisKKyAgICBpZiggZHAgPCAxLmYgKQorICAgICAgICBkcCA9IDEuZjsKKyAgICBpZHAgPSAxLmYvZHA7CisgICAgQ1ZfQ0FMTCggYWNjdW0gPSBjdkNyZWF0ZU1hdCggY3ZDZWlsKGltZy0+cm93cyppZHApKzIsIGN2Q2VpbChpbWctPmNvbHMqaWRwKSsyLCBDVl8zMlNDMSApKTsKKyAgICBDVl9DQUxMKCBjdlplcm8oYWNjdW0pKTsKKworICAgIENWX0NBTEwoIHN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoKSApOworICAgIENWX0NBTEwoIG56ID0gY3ZDcmVhdGVTZXEoIENWXzMyU0MyLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZQb2ludCksIHN0b3JhZ2UgKSk7CisgICAgQ1ZfQ0FMTCggY2VudGVycyA9IGN2Q3JlYXRlU2VxKCBDVl8zMlNDMSwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKGludCksIHN0b3JhZ2UgKSk7CisKKyAgICByb3dzID0gaW1nLT5yb3dzOworICAgIGNvbHMgPSBpbWctPmNvbHM7CisgICAgYXJvd3MgPSBhY2N1bS0+cm93cyAtIDI7CisgICAgYWNvbHMgPSBhY2N1bS0+Y29scyAtIDI7CisgICAgYWRhdGEgPSBhY2N1bS0+ZGF0YS5pOworICAgIGFzdGVwID0gYWNjdW0tPnN0ZXAvc2l6ZW9mKGFkYXRhWzBdKTsKKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIGVkZ2VzX3JvdyA9IGVkZ2VzLT5kYXRhLnB0ciArIHkqZWRnZXMtPnN0ZXA7CisgICAgICAgIGNvbnN0IHNob3J0KiBkeF9yb3cgPSAoY29uc3Qgc2hvcnQqKShkeC0+ZGF0YS5wdHIgKyB5KmR4LT5zdGVwKTsKKyAgICAgICAgY29uc3Qgc2hvcnQqIGR5X3JvdyA9IChjb25zdCBzaG9ydCopKGR5LT5kYXRhLnB0ciArIHkqZHktPnN0ZXApOworCisgICAgICAgIGZvciggeCA9IDA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB2eCwgdnk7CisgICAgICAgICAgICBpbnQgc3gsIHN5LCB4MCwgeTAsIHgxLCB5MSwgciwgazsKKyAgICAgICAgICAgIEN2UG9pbnQgcHQ7CisKKyAgICAgICAgICAgIHZ4ID0gZHhfcm93W3hdOworICAgICAgICAgICAgdnkgPSBkeV9yb3dbeF07CisKKyAgICAgICAgICAgIGlmKCAhZWRnZXNfcm93W3hdIHx8ICh2eCA9PSAwICYmIHZ5ID09IDApICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYoIGZhYnModngpIDwgZmFicyh2eSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN4ID0gY3ZSb3VuZCh2eCpPTkUvZmFicyh2eSkpOworICAgICAgICAgICAgICAgIHN5ID0gdnkgPCAwID8gLU9ORSA6IE9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHZ4ICE9IDAgKTsKKyAgICAgICAgICAgICAgICBzeSA9IGN2Um91bmQodnkqT05FL2ZhYnModngpKTsKKyAgICAgICAgICAgICAgICBzeCA9IHZ4IDwgMCA/IC1PTkUgOiBPTkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHgwID0gY3ZSb3VuZCgoeCppZHApKk9ORSkgKyBPTkUgKyAoT05FLzIpOworICAgICAgICAgICAgeTAgPSBjdlJvdW5kKCh5KmlkcCkqT05FKSArIE9ORSArIChPTkUvMik7CisKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHgwICs9IG1pbl9yYWRpdXMgKiBzeDsKKyAgICAgICAgICAgICAgICB5MCArPSBtaW5fcmFkaXVzICogc3k7CisKKyAgICAgICAgICAgICAgICBmb3IoIHgxID0geDAsIHkxID0geTAsIHIgPSBtaW5fcmFkaXVzOyByIDw9IG1heF9yYWRpdXM7IHgxICs9IHN4LCB5MSArPSBzeSwgcisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB4MiA9IHgxID4+IFNISUZULCB5MiA9IHkxID4+IFNISUZUOworICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXgyID49ICh1bnNpZ25lZClhY29scyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXkyID49ICh1bnNpZ25lZClhcm93cyApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYWRhdGFbeTIqYXN0ZXAgKyB4Ml0rKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB4MCAtPSBtaW5fcmFkaXVzICogc3g7CisgICAgICAgICAgICAgICAgeTAgLT0gbWluX3JhZGl1cyAqIHN5OworICAgICAgICAgICAgICAgIHN4ID0gLXN4OyBzeSA9IC1zeTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHQueCA9IHg7IHB0LnkgPSB5OworICAgICAgICAgICAgY3ZTZXFQdXNoKCBueiwgJnB0ICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuel9jb3VudCA9IG56LT50b3RhbDsKKyAgICBpZiggIW56X2NvdW50ICkKKyAgICAgICAgRVhJVDsKKworICAgIGZvciggeSA9IDE7IHkgPCBhcm93cyAtIDE7IHkrKyApCisgICAgeworICAgICAgICBmb3IoIHggPSAxOyB4IDwgYWNvbHMgLSAxOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYmFzZSA9IHkqKGFjb2xzKzIpICsgeDsKKyAgICAgICAgICAgIGlmKCBhZGF0YVtiYXNlXSA+IGFjY190aHJlc2hvbGQgJiYKKyAgICAgICAgICAgICAgICBhZGF0YVtiYXNlXSA+IGFkYXRhW2Jhc2UtMV0gJiYgYWRhdGFbYmFzZV0gPiBhZGF0YVtiYXNlKzFdICYmCisgICAgICAgICAgICAgICAgYWRhdGFbYmFzZV0gPiBhZGF0YVtiYXNlLWFjb2xzLTJdICYmIGFkYXRhW2Jhc2VdID4gYWRhdGFbYmFzZSthY29scysyXSApCisgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKGNlbnRlcnMsICZiYXNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNlbnRlcl9jb3VudCA9IGNlbnRlcnMtPnRvdGFsOworICAgIGlmKCAhY2VudGVyX2NvdW50ICkKKyAgICAgICAgRVhJVDsKKworICAgIENWX0NBTEwoIHNvcnRfYnVmID0gKGludCopY3ZBbGxvYyggTUFYKGNlbnRlcl9jb3VudCxuel9jb3VudCkqc2l6ZW9mKHNvcnRfYnVmWzBdKSApKTsKKyAgICBjdkN2dFNlcVRvQXJyYXkoIGNlbnRlcnMsIHNvcnRfYnVmICk7CisKKyAgICBpY3ZIb3VnaFNvcnREZXNjZW50MzJzKCBzb3J0X2J1ZiwgY2VudGVyX2NvdW50LCBhZGF0YSApOworICAgIGN2Q2xlYXJTZXEoIGNlbnRlcnMgKTsKKyAgICBjdlNlcVB1c2hNdWx0aSggY2VudGVycywgc29ydF9idWYsIGNlbnRlcl9jb3VudCApOworCisgICAgQ1ZfQ0FMTCggZGlzdF9idWYgPSBjdkNyZWF0ZU1hdCggMSwgbnpfY291bnQsIENWXzMyRkMxICkpOworICAgIGRkYXRhID0gZGlzdF9idWYtPmRhdGEuZmw7CisKKyAgICBkciA9IGRwOworICAgIG1pbl9kaXN0ID0gTUFYKCBtaW5fZGlzdCwgZHAgKTsKKyAgICBtaW5fZGlzdCAqPSBtaW5fZGlzdDsKKworICAgIGZvciggaSA9IDA7IGkgPCBjZW50ZXJzLT50b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBvZnMgPSAqKGludCopY3ZHZXRTZXFFbGVtKCBjZW50ZXJzLCBpICk7CisgICAgICAgIHkgPSBvZnMvKGFjb2xzKzIpIC0gMTsKKyAgICAgICAgeCA9IG9mcyAtICh5KzEpKihhY29scysyKSAtIDE7CisgICAgICAgIGZsb2F0IGN4ID0gKGZsb2F0KSh4KmRwKSwgY3kgPSAoZmxvYXQpKHkqZHApOworICAgICAgICBpbnQgc3RhcnRfaWR4ID0gbnpfY291bnQgLSAxOworICAgICAgICBmbG9hdCBzdGFydF9kaXN0LCBkaXN0X3N1bTsKKyAgICAgICAgZmxvYXQgcl9iZXN0ID0gMCwgY1szXTsKKyAgICAgICAgaW50IG1heF9jb3VudCA9IFJfVEhSRVNIOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjaXJjbGVzLT50b3RhbDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIGMgPSAoZmxvYXQqKWN2R2V0U2VxRWxlbSggY2lyY2xlcywgaiApOworICAgICAgICAgICAgaWYoIChjWzBdIC0gY3gpKihjWzBdIC0gY3gpICsgKGNbMV0gLSBjeSkqKGNbMV0gLSBjeSkgPCBtaW5fZGlzdCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggaiA8IGNpcmNsZXMtPnRvdGFsICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBueiwgJnJlYWRlciApOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgbnpfY291bnQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQgcHQ7CisgICAgICAgICAgICBmbG9hdCBfZHgsIF9keTsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKyAgICAgICAgICAgIF9keCA9IGN4IC0gcHQueDsgX2R5ID0gY3kgLSBwdC55OworICAgICAgICAgICAgZGRhdGFbal0gPSBfZHgqX2R4ICsgX2R5Kl9keTsKKyAgICAgICAgICAgIHNvcnRfYnVmW2pdID0gajsKKyAgICAgICAgfQorCisgICAgICAgIGN2UG93KCBkaXN0X2J1ZiwgZGlzdF9idWYsIDAuNSApOworICAgICAgICBpY3ZIb3VnaFNvcnREZXNjZW50MzJzKCBzb3J0X2J1ZiwgbnpfY291bnQsIChpbnQqKWRkYXRhICk7CisgICAgICAgIAorICAgICAgICBkaXN0X3N1bSA9IHN0YXJ0X2Rpc3QgPSBkZGF0YVtzb3J0X2J1Zltuel9jb3VudC0xXV07CisgICAgICAgIGZvciggaiA9IG56X2NvdW50IC0gMjsgaiA+PSAwOyBqLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkID0gZGRhdGFbc29ydF9idWZbal1dOworCisgICAgICAgICAgICBpZiggZCA+IG1heF9yYWRpdXMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiggZCAtIHN0YXJ0X2Rpc3QgPiBkciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgcl9jdXIgPSBkZGF0YVtzb3J0X2J1ZlsoaiArIHN0YXJ0X2lkeCkvMl1dOworICAgICAgICAgICAgICAgIGlmKCAoc3RhcnRfaWR4IC0gaikqcl9iZXN0ID49IG1heF9jb3VudCpyX2N1ciB8fAorICAgICAgICAgICAgICAgICAgICAocl9iZXN0IDwgRkxUX0VQU0lMT04gJiYgc3RhcnRfaWR4IC0gaiA+PSBtYXhfY291bnQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJfYmVzdCA9IHJfY3VyOworICAgICAgICAgICAgICAgICAgICBtYXhfY291bnQgPSBzdGFydF9pZHggLSBqOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGFydF9kaXN0ID0gZDsKKyAgICAgICAgICAgICAgICBzdGFydF9pZHggPSBqOworICAgICAgICAgICAgICAgIGRpc3Rfc3VtID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpc3Rfc3VtICs9IGQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggbWF4X2NvdW50ID4gUl9USFJFU0ggKQorICAgICAgICB7CisgICAgICAgICAgICBjWzBdID0gY3g7CisgICAgICAgICAgICBjWzFdID0gY3k7CisgICAgICAgICAgICBjWzJdID0gKGZsb2F0KXJfYmVzdDsKKyAgICAgICAgICAgIGN2U2VxUHVzaCggY2lyY2xlcywgYyApOworICAgICAgICAgICAgaWYoIGNpcmNsZXMtPnRvdGFsID4gY2lyY2xlc19tYXggKQorICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmZGlzdF9idWYgKTsKKyAgICBjdkZyZWUoICZzb3J0X2J1ZiApOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmZWRnZXMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZkeCApOworICAgIGN2UmVsZWFzZU1hdCggJmR5ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmYWNjdW0gKTsKK30KKworQ1ZfSU1QTCBDdlNlcSoKK2N2SG91Z2hDaXJjbGVzKCBDdkFyciogc3JjX2ltYWdlLCB2b2lkKiBjaXJjbGVfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICBpbnQgbWV0aG9kLCBkb3VibGUgZHAsIGRvdWJsZSBtaW5fZGlzdCwKKyAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0xLCBkb3VibGUgcGFyYW0yLAorICAgICAgICAgICAgICAgIGludCBtaW5fcmFkaXVzLCBpbnQgbWF4X3JhZGl1cyApCit7CisgICAgQ3ZTZXEqIHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2SG91Z2hDaXJjbGVzIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIEN2TWF0IHN0dWIsICppbWcgPSAoQ3ZNYXQqKXNyY19pbWFnZTsKKyAgICBDdk1hdCogbWF0ID0gMDsKKyAgICBDdlNlcSogY2lyY2xlcyA9IDA7CisgICAgQ3ZTZXEgY2lyY2xlc19oZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBjaXJjbGVzX2Jsb2NrOworICAgIGludCBjaXJjbGVzX21heCA9IElOVF9NQVg7CisgICAgaW50IGNhbm55X3RocmVzaG9sZCA9IGN2Um91bmQocGFyYW0xKTsKKyAgICBpbnQgYWNjX3RocmVzaG9sZCA9IGN2Um91bmQocGFyYW0yKTsKKworICAgIENWX0NBTEwoIGltZyA9IGN2R2V0TWF0KCBpbWcsICZzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVNLX0FSUihpbWcpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIHNvdXJjZSBpbWFnZSBtdXN0IGJlIDgtYml0LCBzaW5nbGUtY2hhbm5lbCIgKTsKKworICAgIGlmKCAhY2lyY2xlX3N0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgZGVzdGluYXRpb24iICk7CisKKyAgICBpZiggZHAgPD0gMCB8fCBtaW5fZGlzdCA8PSAwIHx8IGNhbm55X3RocmVzaG9sZCA8PSAwIHx8IGFjY190aHJlc2hvbGQgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiZHAsIG1pbl9kaXN0LCBjYW5ueV90aHJlc2hvbGQgYW5kIGFjY190aHJlc2hvbGQgbXVzdCBiZSBhbGwgcG9zaXRpdmUgbnVtYmVycyIgKTsKKworICAgIG1pbl9yYWRpdXMgPSBNQVgoIG1pbl9yYWRpdXMsIDAgKTsKKyAgICBpZiggbWF4X3JhZGl1cyA8PSAwICkKKyAgICAgICAgbWF4X3JhZGl1cyA9IE1BWCggaW1nLT5yb3dzLCBpbWctPmNvbHMgKTsKKyAgICBlbHNlIGlmKCBtYXhfcmFkaXVzIDw9IG1pbl9yYWRpdXMgKQorICAgICAgICBtYXhfcmFkaXVzID0gbWluX3JhZGl1cyArIDI7CisKKyAgICBpZiggQ1ZfSVNfU1RPUkFHRSggY2lyY2xlX3N0b3JhZ2UgKSkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGNpcmNsZXMgPSBjdkNyZWF0ZVNlcSggQ1ZfMzJGQzMsIHNpemVvZihDdlNlcSksCisgICAgICAgICAgICBzaXplb2YoZmxvYXQpKjMsIChDdk1lbVN0b3JhZ2UqKWNpcmNsZV9zdG9yYWdlICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19NQVQoIGNpcmNsZV9zdG9yYWdlICkpCisgICAgeworICAgICAgICBtYXQgPSAoQ3ZNYXQqKWNpcmNsZV9zdG9yYWdlOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSApIHx8IChtYXQtPnJvd3MgIT0gMSAmJiBtYXQtPmNvbHMgIT0gMSkgfHwKKyAgICAgICAgICAgIENWX01BVF9UWVBFKG1hdC0+dHlwZSkgIT0gQ1ZfMzJGQzMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUaGUgZGVzdGluYXRpb24gbWF0cml4IHNob3VsZCBiZSBjb250aW51b3VzIGFuZCBoYXZlIGEgc2luZ2xlIHJvdyBvciBhIHNpbmdsZSBjb2x1bW4iICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggY2lyY2xlcyA9IGN2TWFrZVNlcUhlYWRlckZvckFycmF5KCBDVl8zMkZDMywgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKGZsb2F0KSozLAorICAgICAgICAgICAgICAgIG1hdC0+ZGF0YS5wdHIsIG1hdC0+cm93cyArIG1hdC0+Y29scyAtIDEsICZjaXJjbGVzX2hlYWRlciwgJmNpcmNsZXNfYmxvY2sgKSk7CisgICAgICAgIGNpcmNsZXNfbWF4ID0gY2lyY2xlcy0+dG90YWw7CisgICAgICAgIENWX0NBTEwoIGN2Q2xlYXJTZXEoIGNpcmNsZXMgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEZXN0aW5hdGlvbiBpcyBub3QgQ3ZNZW1TdG9yYWdlKiBub3IgQ3ZNYXQqIiApOworICAgIH0KKworICAgIHN3aXRjaCggbWV0aG9kICkKKyAgICB7CisgICAgY2FzZSBDVl9IT1VHSF9HUkFESUVOVDoKKyAgICAgICAgICBDVl9DQUxMKCBpY3ZIb3VnaENpcmNsZXNHcmFkaWVudCggaW1nLCAoZmxvYXQpZHAsIChmbG9hdCltaW5fZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9yYWRpdXMsIG1heF9yYWRpdXMsIGNhbm55X3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY190aHJlc2hvbGQsIGNpcmNsZXMsIGNpcmNsZXNfbWF4ICkpOworICAgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbnJlY29nbml6ZWQgbWV0aG9kIGlkIiApOworICAgIH0KKworICAgIGlmKCBtYXQgKQorICAgIHsKKyAgICAgICAgaWYoIG1hdC0+Y29scyA+IG1hdC0+cm93cyApCisgICAgICAgICAgICBtYXQtPmNvbHMgPSBjaXJjbGVzLT50b3RhbDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF0LT5yb3dzID0gY2lyY2xlcy0+dG90YWw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gY2lyY2xlczsKKworICAgIF9fRU5EX187CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsgICAgCit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2aW1nd2FycC5jcHAgYi9jdi9zcmMvY3ZpbWd3YXJwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMwZDhmCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2aW1nd2FycC5jcHAKQEAgLTAsMCArMSwyMjcyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgR2VvbWV0cmljYWwgdHJhbnNmb3JtcyBvbiBpbWFnZXMgYW5kIG1hdHJpY2VzOiByb3RhdGlvbiwgem9vbSBldGMuCisvLworLy8gKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisKKy8qKioqKioqKioqKioqKiBpbnRlcnBvbGF0aW9uIGNvbnN0YW50cyBhbmQgdGFibGVzICoqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfV0FSUF9NVUxfT05FXzhVKHgpICAoKHgpIDw8IElDVl9XQVJQX1NISUZUKQorI2RlZmluZSBJQ1ZfV0FSUF9ERVNDQUxFXzhVKHgpICBDVl9ERVNDQUxFKCh4KSwgSUNWX1dBUlBfU0hJRlQqMikKKyNkZWZpbmUgSUNWX1dBUlBfQ0xJUF9YKHgpICAgICAgKCh1bnNpZ25lZCkoeCkgPCAodW5zaWduZWQpc3NpemUud2lkdGggPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh4KSA6ICh4KSA8IDAgPyAwIDogc3NpemUud2lkdGggLSAxKQorI2RlZmluZSBJQ1ZfV0FSUF9DTElQX1koeSkgICAgICAoKHVuc2lnbmVkKSh5KSA8ICh1bnNpZ25lZClzc2l6ZS5oZWlnaHQgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5KSA6ICh5KSA8IDAgPyAwIDogc3NpemUuaGVpZ2h0IC0gMSkKKworZmxvYXQgaWN2TGluZWFyQ29lZmZzWyhJQ1ZfTElORUFSX1RBQl9TSVpFKzEpKjJdOworCit2b2lkIGljdkluaXRMaW5lYXJDb2VmZlRhYigpCit7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPD0gSUNWX0xJTkVBUl9UQUJfU0laRTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdClpL0lDVl9MSU5FQVJfVEFCX1NJWkU7CisgICAgICAgICAgICBpY3ZMaW5lYXJDb2VmZnNbaSoyXSA9IHg7CisgICAgICAgICAgICBpY3ZMaW5lYXJDb2VmZnNbaSoyKzFdID0gMS5mIC0geDsKKyAgICAgICAgfQorCisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KK30KKworCitmbG9hdCBpY3ZDdWJpY0NvZWZmc1soSUNWX0NVQklDX1RBQl9TSVpFKzEpKjJdOworCit2b2lkIGljdkluaXRDdWJpY0NvZWZmVGFiKCkKK3sKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworI2lmIDAKKyAgICAgICAgLy8gY2xhc3NpY2FsIE1pdGNoZWxsLU5ldHJhdmFsaSBmaWx0ZXIKKyAgICAgICAgY29uc3QgZG91YmxlIEIgPSAxLi8zOworICAgICAgICBjb25zdCBkb3VibGUgQyA9IDEuLzM7CisgICAgICAgIGNvbnN0IGRvdWJsZSBwMCA9ICg2IC0gMipCKS82LjsKKyAgICAgICAgY29uc3QgZG91YmxlIHAyID0gKC0xOCArIDEyKkIgKyA2KkMpLzYuOworICAgICAgICBjb25zdCBkb3VibGUgcDMgPSAoMTIgLSA5KkIgLSA2KkMpLzYuOworICAgICAgICBjb25zdCBkb3VibGUgcTAgPSAoOCpCICsgMjQqQykvNi47CisgICAgICAgIGNvbnN0IGRvdWJsZSBxMSA9ICgtMTIqQiAtIDQ4KkMpLzYuOworICAgICAgICBjb25zdCBkb3VibGUgcTIgPSAoNipCICsgMzAqQykvNi47CisgICAgICAgIGNvbnN0IGRvdWJsZSBxMyA9ICgtQiAtIDYqQykvNi47CisKKyAgICAgICAgI2RlZmluZSBJQ1ZfQ1VCSUNfMSh4KSAgKCgoeCkqcDMgKyBwMikqKHgpKih4KSArIHAwKQorICAgICAgICAjZGVmaW5lIElDVl9DVUJJQ18yKHgpICAoKCgoeCkqcTMgKyBxMikqKHgpICsgcTEpKih4KSArIHEwKQorI2Vsc2UKKyAgICAgICAgLy8gYWx0ZXJuYXRpdmUgInNoYXJwIiBmaWx0ZXIKKyAgICAgICAgY29uc3QgZG91YmxlIEEgPSAtMC43NTsKKyAgICAgICAgI2RlZmluZSBJQ1ZfQ1VCSUNfMSh4KSAgKCgoQSArIDIpKih4KSAtIChBICsgMykpKih4KSooeCkgKyAxKQorICAgICAgICAjZGVmaW5lIElDVl9DVUJJQ18yKHgpICAoKChBKih4KSAtIDUqQSkqKHgpICsgOCpBKSooeCkgLSA0KkEpCisjZW5kaWYKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPD0gSUNWX0NVQklDX1RBQl9TSVpFOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB4ID0gKGZsb2F0KWkvSUNWX0NVQklDX1RBQl9TSVpFOworICAgICAgICAgICAgaWN2Q3ViaWNDb2VmZnNbaSoyXSA9IChmbG9hdClJQ1ZfQ1VCSUNfMSh4KTsKKyAgICAgICAgICAgIHggKz0gMS5mOworICAgICAgICAgICAgaWN2Q3ViaWNDb2VmZnNbaSoyKzFdID0gKGZsb2F0KUlDVl9DVUJJQ18yKHgpOworICAgICAgICB9CisKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdlJlc2l6ZV9OTl84dV9DMVIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3NpemUsCisgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzaXplLCBpbnQgcGl4X3NpemUgKQoreworICAgIGludCogeF9vZnMgPSAoaW50KiljdlN0YWNrQWxsb2MoIGRzaXplLndpZHRoICogc2l6ZW9mKHhfb2ZzWzBdKSApOworICAgIGludCBwaXhfc2l6ZTQgPSBwaXhfc2l6ZSAvIHNpemVvZihpbnQpOworICAgIGludCB4LCB5LCB0OworCisgICAgZm9yKCB4ID0gMDsgeCA8IGRzaXplLndpZHRoOyB4KysgKQorICAgIHsKKyAgICAgICAgdCA9IChzc2l6ZS53aWR0aCp4KjIgKyBNSU4oc3NpemUud2lkdGgsIGRzaXplLndpZHRoKSAtIDEpLyhkc2l6ZS53aWR0aCoyKTsKKyAgICAgICAgdCAtPSB0ID49IHNzaXplLndpZHRoOworICAgICAgICB4X29mc1t4XSA9IHQqcGl4X3NpemU7CisgICAgfQorCisgICAgZm9yKCB5ID0gMDsgeSA8IGRzaXplLmhlaWdodDsgeSsrLCBkc3QgKz0gZHN0c3RlcCApCisgICAgeworICAgICAgICBjb25zdCB1Y2hhciogdHNyYzsKKyAgICAgICAgdCA9IChzc2l6ZS5oZWlnaHQqeSoyICsgTUlOKHNzaXplLmhlaWdodCwgZHNpemUuaGVpZ2h0KSAtIDEpLyhkc2l6ZS5oZWlnaHQqMik7CisgICAgICAgIHQgLT0gdCA+PSBzc2l6ZS5oZWlnaHQ7CisgICAgICAgIHRzcmMgPSBzcmMgKyBzcmNzdGVwKnQ7CisKKyAgICAgICAgc3dpdGNoKCBwaXhfc2l6ZSApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBkc2l6ZS53aWR0aCAtIDI7IHggKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIgdDAgPSB0c3JjW3hfb2ZzW3hdXTsKKyAgICAgICAgICAgICAgICB1Y2hhciB0MSA9IHRzcmNbeF9vZnNbeCsxXV07CisKKyAgICAgICAgICAgICAgICBkc3RbeF0gPSB0MDsKKyAgICAgICAgICAgICAgICBkc3RbeCsxXSA9IHQxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgeCA8IGRzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIGRzdFt4XSA9IHRzcmNbeF9vZnNbeF1dOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBkc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAqKHVzaG9ydCopKGRzdCArIHgqMikgPSAqKHVzaG9ydCopKHRzcmMgKyB4X29mc1t4XSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGRzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBfdHNyYyA9IHRzcmMgKyB4X29mc1t4XTsKKyAgICAgICAgICAgICAgICBkc3RbeCozXSA9IF90c3JjWzBdOyBkc3RbeCozKzFdID0gX3RzcmNbMV07IGRzdFt4KjMrMl0gPSBfdHNyY1syXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgKihpbnQqKShkc3QgKyB4KjQpID0gKihpbnQqKSh0c3JjICsgeF9vZnNbeF0pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjoKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBkc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1c2hvcnQqIF90c3JjID0gKGNvbnN0IHVzaG9ydCopKHRzcmMgKyB4X29mc1t4XSk7CisgICAgICAgICAgICAgICAgdXNob3J0KiBfdGRzdCA9ICh1c2hvcnQqKShkc3QgKyB4KjYpOworICAgICAgICAgICAgICAgIF90ZHN0WzBdID0gX3RzcmNbMF07IF90ZHN0WzFdID0gX3RzcmNbMV07IF90ZHN0WzJdID0gX3RzcmNbMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBkc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICBDVl9NRU1DUFlfSU5UKCBkc3QgKyB4KnBpeF9zaXplLCB0c3JjICsgeF9vZnNbeF0sIHBpeF9zaXplNCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3R5cGVkZWYgc3RydWN0IEN2UmVzaXplQWxwaGEKK3sKKyAgICBpbnQgaWR4OworICAgIHVuaW9uCisgICAgeworICAgICAgICBmbG9hdCBhbHBoYTsKKyAgICAgICAgaW50IGlhbHBoYTsKKyAgICB9OworfQorQ3ZSZXNpemVBbHBoYTsKKworCisjZGVmaW5lICBJQ1ZfREVGX1JFU0laRV9CSUxJTkVBUl9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBhbHBoYV9maWVsZCwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bF9vbmVfbWFjcm8sIGRlc2NhbGVfbWFjcm8gKSAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZSZXNpemVfQmlsaW5lYXJfIyNmbGF2b3IjI19DblIoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzc2l6ZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc2l6ZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBpbnQgeG1heCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdlJlc2l6ZUFscGhhKiB4b2ZzLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2UmVzaXplQWxwaGEqIHlvZnMsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUqIGJ1ZjAsIHdvcmt0eXBlKiBidWYxICkgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHByZXZfc3kwID0gLTEsIHByZXZfc3kxID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaywgZHgsIGR5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzaXplLndpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeG1heCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggZHkgPSAwOyBkeSA8IGRzaXplLmhlaWdodDsgZHkrKywgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgZnkgPSB5b2ZzW2R5XS5hbHBoYV9maWVsZCwgKnN3YXBfdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3kwID0geW9mc1tkeV0uaWR4LCBzeTEgPSBzeTAgKyAoZnkgPiAwICYmIHN5MCA8IHNzaXplLmhlaWdodC0xKTsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHN5MCA9PSBwcmV2X3N5MCAmJiBzeTEgPT0gcHJldl9zeTEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgayA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIHN5MCA9PSBwcmV2X3N5MSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQ1ZfU1dBUCggYnVmMCwgYnVmMSwgc3dhcF90ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgayA8IDI7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlKiBfYnVmID0gayA9PSAwID8gYnVmMCA6IGJ1ZjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgYXJydHlwZSogX3NyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgc3kgPSBrID09IDAgPyBzeTAgOiBzeTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBrID09IDEgJiYgc3kxID09IHN5MCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWVtY3B5KCBidWYxLCBidWYwLCBkc2l6ZS53aWR0aCpzaXplb2YoYnVmMFswXSkgKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9zcmMgPSBzcmMgKyBzeSpzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBkeCA9IDA7IGR4IDwgeG1heDsgZHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgc3ggPSB4b2ZzW2R4XS5pZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIGZ4ID0geG9mc1tkeF0uYWxwaGFfZmllbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdCA9IF9zcmNbc3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfYnVmW2R4XSA9IG11bF9vbmVfbWFjcm8odCkgKyBmeCooX3NyY1tzeCtjbl0gLSB0KTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9idWZbZHhdID0gbXVsX29uZV9tYWNybyhfc3JjW3hvZnNbZHhdLmlkeF0pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcmV2X3N5MCA9IHN5MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHByZXZfc3kxID0gc3kxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggc3kwID09IHN5MSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGR4ID0gMDsgZHggPCBkc2l6ZS53aWR0aDsgZHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbZHhdID0gKGFycnR5cGUpZGVzY2FsZV9tYWNybyggbXVsX29uZV9tYWNybyhidWYwW2R4XSkpOyAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGR4ID0gMDsgZHggPCBkc2l6ZS53aWR0aDsgZHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbZHhdID0gKGFycnR5cGUpZGVzY2FsZV9tYWNybyggbXVsX29uZV9tYWNybyhidWYwW2R4XSkgKyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmeSooYnVmMVtkeF0gLSBidWYwW2R4XSkpOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZEZWNpbWF0ZUFscGhhCit7CisgICAgaW50IHNpLCBkaTsKKyAgICBmbG9hdCBhbHBoYTsKK30KK0N2RGVjaW1hdGVBbHBoYTsKKworCisjZGVmaW5lICBJQ1ZfREVGX1JFU0laRV9BUkVBX0ZBU1RfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgY2FzdF9tYWNybyApIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2UmVzaXplX0FyZWFGYXN0XyMjZmxhdm9yIyNfQ25SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3NpemUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzaXplLCBpbnQgY24sICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIG9mcywgY29uc3QgaW50KiB4b2ZzICkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBkeSwgZHgsIGsgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNjYWxlX3ggPSBzc2l6ZS53aWR0aC9kc2l6ZS53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc2NhbGVfeSA9IHNzaXplLmhlaWdodC9kc2l6ZS5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBhcmVhID0gc2NhbGVfeCpzY2FsZV95OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgc2NhbGUgPSAxLmYvKHNjYWxlX3gqc2NhbGVfeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBkeSA9IDA7IGR5IDwgZHNpemUuaGVpZ2h0OyBkeSsrLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBkeCA9IDA7IGR4IDwgZHNpemUud2lkdGg7IGR4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBfc3JjID0gc3JjICsgZHkqc2NhbGVfeSpzcmNzdGVwICsgeG9mc1tkeF07ICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDw9IGFyZWEgLSA0OyBrICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW0gKz0gX3NyY1tvZnNba11dICsgX3NyY1tvZnNbaysxXV0gKyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBfc3JjW29mc1trKzJdXSArIF9zcmNbb2ZzW2srM11dOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBrIDwgYXJlYTsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSArPSBfc3JjW29mc1trXV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtkeF0gPSAoYXJydHlwZSljYXN0X21hY3JvKCBzdW0qc2NhbGUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfUkVTSVpFX0FSRUFfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCBsb2FkX21hY3JvLCBjYXN0X21hY3JvICkgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZSZXNpemVfQXJlYV8jI2ZsYXZvciMjX0NuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNzaXplLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbiwgY29uc3QgQ3ZEZWNpbWF0ZUFscGhhKiB4b2ZzLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhvZnNfY291bnQsIGZsb2F0KiBidWYsIGZsb2F0KiBzdW0gKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBrLCBzeSwgZHgsIGN1cl9keSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZmxvYXQgc2NhbGVfeSA9IChmbG9hdClzc2l6ZS5oZWlnaHQvZHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBzeSA9IDA7IHN5IDwgc3NpemUuaGVpZ2h0OyBzeSsrLCBzcmMgKz0gc3Jjc3RlcCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggY24gPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgeG9mc19jb3VudDsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBkeG4gPSB4b2ZzW2tdLmRpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB4b2ZzW2tdLmFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBidWZbZHhuXSA9IGJ1ZltkeG5dICsgbG9hZF9tYWNybyhzcmNbeG9mc1trXS5zaV0pKmFscGhhOyAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIGNuID09IDIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCB4b2ZzX2NvdW50OyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHN4biA9IHhvZnNba10uc2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgZHhuID0geG9mc1trXS5kaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0geG9mc1trXS5hbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSBidWZbZHhuXSArIGxvYWRfbWFjcm8oc3JjW3N4bl0pKmFscGhhOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGJ1ZltkeG4rMV0gKyBsb2FkX21hY3JvKHNyY1tzeG4rMV0pKmFscGhhOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltkeG5dID0gdDA7IGJ1ZltkeG4rMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBpZiggY24gPT0gMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHhvZnNfY291bnQ7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgc3huID0geG9mc1trXS5zaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBkeG4gPSB4b2ZzW2tdLmRpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSB4b2ZzW2tdLmFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGJ1ZltkeG5dICsgbG9hZF9tYWNybyhzcmNbc3huXSkqYWxwaGE7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gYnVmW2R4bisxXSArIGxvYWRfbWFjcm8oc3JjW3N4bisxXSkqYWxwaGE7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDIgPSBidWZbZHhuKzJdICsgbG9hZF9tYWNybyhzcmNbc3huKzJdKSphbHBoYTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBidWZbZHhuXSA9IHQwOyBidWZbZHhuKzFdID0gdDE7IGJ1ZltkeG4rMl0gPSB0MjsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCB4b2ZzX2NvdW50OyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHN4biA9IHhvZnNba10uc2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgZHhuID0geG9mc1trXS5kaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhID0geG9mc1trXS5hbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSBidWZbZHhuXSArIGxvYWRfbWFjcm8oc3JjW3N4bl0pKmFscGhhOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGJ1ZltkeG4rMV0gKyBsb2FkX21hY3JvKHNyY1tzeG4rMV0pKmFscGhhOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltkeG5dID0gdDA7IGJ1ZltkeG4rMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBidWZbZHhuKzJdICsgbG9hZF9tYWNybyhzcmNbc3huKzJdKSphbHBoYTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9IGJ1ZltkeG4rM10gKyBsb2FkX21hY3JvKHNyY1tzeG4rM10pKmFscGhhOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltkeG4rMl0gPSB0MDsgYnVmW2R4biszXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggKGN1cl9keSArIDEpKnNjYWxlX3kgPD0gc3kgKyAxIHx8IHN5ID09IHNzaXplLmhlaWdodCAtIDEgKSAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsb2F0IGJldGEgPSBzeSArIDEgLSAoY3VyX2R5KzEpKnNjYWxlX3ksIGJldGExOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYmV0YSA9IE1BWCggYmV0YSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiZXRhMSA9IDEgLSBiZXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBmYWJzKGJldGEpIDwgMWUtMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggZHggPSAwOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2R4XSA9IChhcnJ0eXBlKWNhc3RfbWFjcm8oc3VtW2R4XSArIGJ1ZltkeF0pOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzdW1bZHhdID0gYnVmW2R4XSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggZHggPSAwOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2R4XSA9IChhcnJ0eXBlKWNhc3RfbWFjcm8oc3VtW2R4XSArIGJ1ZltkeF0qYmV0YTEpOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBzdW1bZHhdID0gYnVmW2R4XSpiZXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZltkeF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0ICs9IGRzdHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjdXJfZHkrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGR4ID0gMDsgZHggPCBkc2l6ZS53aWR0aDsgZHggKz0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gc3VtW2R4XSArIGJ1ZltkeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZmxvYXQgdDEgPSBzdW1bZHgrMV0gKyBidWZbZHgrMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1bZHhdID0gdDA7IHN1bVtkeCsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1ZltkeF0gPSBidWZbZHgrMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX1JFU0laRV9CSUNVQklDX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIGxvYWRfbWFjcm8sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybzEsIGNhc3RfbWFjcm8yICkgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZSZXNpemVfQmljdWJpY18jI2ZsYXZvciMjX0NuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNzaXplLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbiwgaW50IHhtaW4sIGludCB4bWF4LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZSZXNpemVBbHBoYSogeG9mcywgZmxvYXQqKiBidWYgKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IHNjYWxlX3kgPSAoZmxvYXQpc3NpemUuaGVpZ2h0L2RzaXplLmhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGR4LCBkeSwgc3gsIHN5LCBzeTIsIGlmeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcHJldl9zeTIgPSAtMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeG1pbiAqPSBjbjsgeG1heCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNzaXplLndpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBkeSA9IDA7IGR5IDwgZHNpemUuaGVpZ2h0OyBkeSsrLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmbG9hdCB3MCwgdzEsIHcyLCB3MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IGZ5LCB4LCBzdW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgKnJvdywgKnJvdzAsICpyb3cxLCAqcm93MiwgKnJvdzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgazEsIGsgPSA0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnkgPSBkeSpzY2FsZV95OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzeSA9IGN2Rmxvb3IoZnkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ5IC09IHN5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWZ5ID0gY3ZSb3VuZChmeSpJQ1ZfQ1VCSUNfVEFCX1NJWkUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzeTIgPSBzeSArIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHN5MiA+IHByZXZfc3kyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZGVsdGEgPSBwcmV2X3N5MiAtIHN5ICsgMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkZWx0YTsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENWX1NXQVAoIGJ1ZltrXSwgYnVmW2srNC1kZWx0YV0sIHJvdyApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHN5ICs9IGsgLSAxOyBrIDwgNDsgaysrLCBzeSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIF9zcmMgPSBzcmMgKyBzeSpzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByb3cgPSBidWZba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBzeSA8IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggc3kgPj0gc3NpemUuaGVpZ2h0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFzc2VydCggayA+IDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWVtY3B5KCByb3csIGJ1ZltrLTFdLCBkc2l6ZS53aWR0aCpzaXplb2Yocm93WzBdKSApOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggZHggPSAwOyBkeCA8IHhtaW47IGR4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IGlmeCA9IHhvZnNbZHhdLmlhbHBoYSwgc3gwID0geG9mc1tkeF0uaWR4OyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzeCA9IHN4MCArIGNuKjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdoaWxlKCBzeCA+PSBzc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHN4IC09IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB4ID0gbG9hZF9tYWNybyhfc3JjW3N4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSA9IHgqaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRSAtIGlmeCkqMiArIDFdOyAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDAgKyBjbikgPCAodW5zaWduZWQpc3NpemUud2lkdGggKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSArPSB4KmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUgLSBpZngpKjJdOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDApIDwgKHVuc2lnbmVkKXNzaXplLndpZHRoICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSArPSB4KmljdkN1YmljQ29lZmZzW2lmeCoyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDAgLSBjbikgPCAodW5zaWduZWQpc3NpemUud2lkdGggKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJvd1tkeF0gPSBzdW0gKyB4KmljdkN1YmljQ29lZmZzW2lmeCoyICsgMV07ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGR4IDwgeG1heDsgZHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgaWZ4ID0geG9mc1tkeF0uaWFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBzeDAgPSB4b2ZzW2R4XS5pZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcm93W2R4XSA9IF9zcmNbc3gwIC0gY25dKmljdkN1YmljQ29lZmZzW2lmeCoyICsgMV0gKyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX3NyY1tzeDBdKmljdkN1YmljQ29lZmZzW2lmeCoyXSArICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBfc3JjW3N4MCArIGNuXSppY3ZDdWJpY0NvZWZmc1soSUNWX0NVQklDX1RBQl9TSVpFLWlmeCkqMl0gKyBcCisgICAgICAgICAgICAgICAgICAgIF9zcmNbc3gwICsgY24qMl0qaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRS1pZngpKjIrMV07XAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IGlmeCA9IHhvZnNbZHhdLmlhbHBoYSwgc3gwID0geG9mc1tkeF0uaWR4OyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB4ID0gbG9hZF9tYWNybyhfc3JjW3N4MCAtIGNuXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSA9IHgqaWN2Q3ViaWNDb2VmZnNbaWZ4KjIgKyAxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDApIDwgKHVuc2lnbmVkKXNzaXplLndpZHRoICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSArPSB4KmljdkN1YmljQ29lZmZzW2lmeCoyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDAgKyBjbikgPCAodW5zaWduZWQpc3NpemUud2lkdGggKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bSArPSB4KmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUgLSBpZngpKjJdOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoc3ggPSBzeDAgKyBjbioyKSA8ICh1bnNpZ25lZClzc2l6ZS53aWR0aCApICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeCA9IGxvYWRfbWFjcm8oX3NyY1tzeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJvd1tkeF0gPSBzdW0gKyB4KmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUtaWZ4KSoyKzFdOyBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHN5ID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrMSA9IDA7IGsxIDwgazsgazErKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBidWZbazFdLCByb3csIGRzaXplLndpZHRoKnNpemVvZihyb3dbMF0pKTsgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHJldl9zeTIgPSBzeTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJvdzAgPSBidWZbMF07IHJvdzEgPSBidWZbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcm93MiA9IGJ1ZlsyXTsgcm93MyA9IGJ1ZlszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHcwID0gaWN2Q3ViaWNDb2VmZnNbaWZ5KjIrMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdzEgPSBpY3ZDdWJpY0NvZWZmc1tpZnkqMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3MiA9IGljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUgLSBpZnkpKjJdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHczID0gaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRSAtIGlmeSkqMiArIDFdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGR4ID0gMDsgZHggPCBkc2l6ZS53aWR0aDsgZHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHZhbCA9IGNhc3RfbWFjcm8xKCByb3cwW2R4XSp3MCArIHJvdzFbZHhdKncxICsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdzJbZHhdKncyICsgcm93M1tkeF0qdzMgKTsgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbZHhdID0gY2FzdF9tYWNybzIodmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfUkVTSVpFX0JJTElORUFSX0ZVTkMoIDh1LCB1Y2hhciwgaW50LCBpYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfV0FSUF9NVUxfT05FXzhVLCBJQ1ZfV0FSUF9ERVNDQUxFXzhVICkKK0lDVl9ERUZfUkVTSVpFX0JJTElORUFSX0ZVTkMoIDE2dSwgdXNob3J0LCBmbG9hdCwgYWxwaGEsIENWX05PUCwgY3ZSb3VuZCApCitJQ1ZfREVGX1JFU0laRV9CSUxJTkVBUl9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgYWxwaGEsIENWX05PUCwgQ1ZfTk9QICkKKworSUNWX0RFRl9SRVNJWkVfQklDVUJJQ19GVU5DKCA4dSwgdWNoYXIsIGludCwgQ1ZfOFRPMzJGLCBjdlJvdW5kLCBDVl9DQVNUXzhVICkKK0lDVl9ERUZfUkVTSVpFX0JJQ1VCSUNfRlVOQyggMTZ1LCB1c2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2VSApCitJQ1ZfREVGX1JFU0laRV9CSUNVQklDX0ZVTkMoIDMyZiwgZmxvYXQsIGZsb2F0LCBDVl9OT1AsIENWX05PUCwgQ1ZfTk9QICkKKworSUNWX0RFRl9SRVNJWkVfQVJFQV9GQVNUX0ZVTkMoIDh1LCB1Y2hhciwgaW50LCBjdlJvdW5kICkKK0lDVl9ERUZfUkVTSVpFX0FSRUFfRkFTVF9GVU5DKCAxNnUsIHVzaG9ydCwgaW50LCBjdlJvdW5kICkKK0lDVl9ERUZfUkVTSVpFX0FSRUFfRkFTVF9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKKworSUNWX0RFRl9SRVNJWkVfQVJFQV9GVU5DKCA4dSwgdWNoYXIsIENWXzhUTzMyRiwgY3ZSb3VuZCApCitJQ1ZfREVGX1JFU0laRV9BUkVBX0ZVTkMoIDE2dSwgdXNob3J0LCBDVl9OT1AsIGN2Um91bmQgKQorSUNWX0RFRl9SRVNJWkVfQVJFQV9GVU5DKCAzMmYsIGZsb2F0LCBDVl9OT1AsIENWX05PUCApCisKKworc3RhdGljIHZvaWQgaWN2SW5pdFJlc2l6ZVRhYiggQ3ZGdW5jVGFibGUqIGJpbGluX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RnVuY1RhYmxlKiBiaWN1YmVfdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZGdW5jVGFibGUqIGFyZWFmYXN0X3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RnVuY1RhYmxlKiBhcmVhX3RhYiApCit7CisgICAgYmlsaW5fdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2UmVzaXplX0JpbGluZWFyXzh1X0NuUjsKKyAgICBiaWxpbl90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmVzaXplX0JpbGluZWFyXzE2dV9DblI7CisgICAgYmlsaW5fdGFiLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdlJlc2l6ZV9CaWxpbmVhcl8zMmZfQ25SOworCisgICAgYmljdWJlX3RhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdlJlc2l6ZV9CaWN1YmljXzh1X0NuUjsKKyAgICBiaWN1YmVfdGFiLT5mbl8yZFtDVl8xNlVdID0gKHZvaWQqKWljdlJlc2l6ZV9CaWN1YmljXzE2dV9DblI7CisgICAgYmljdWJlX3RhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZSZXNpemVfQmljdWJpY18zMmZfQ25SOworCisgICAgYXJlYWZhc3RfdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2UmVzaXplX0FyZWFGYXN0Xzh1X0NuUjsKKyAgICBhcmVhZmFzdF90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmVzaXplX0FyZWFGYXN0XzE2dV9DblI7CisgICAgYXJlYWZhc3RfdGFiLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdlJlc2l6ZV9BcmVhRmFzdF8zMmZfQ25SOworCisgICAgYXJlYV90YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZSZXNpemVfQXJlYV84dV9DblI7CisgICAgYXJlYV90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmVzaXplX0FyZWFfMTZ1X0NuUjsKKyAgICBhcmVhX3RhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZSZXNpemVfQXJlYV8zMmZfQ25SOworfQorCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlc2l6ZUJpbGluZWFyRnVuYykKKyAgICAgICAgICAgICAgICAgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjbiwgaW50IHhtYXgsIGNvbnN0IEN2UmVzaXplQWxwaGEqIHhvZnMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZSZXNpemVBbHBoYSogeW9mcywgZmxvYXQqIGJ1ZjAsIGZsb2F0KiBidWYxICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlc2l6ZUJpY3ViaWNGdW5jKQorICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBpbnQgeG1pbiwgaW50IHhtYXgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZSZXNpemVBbHBoYSogeG9mcywgZmxvYXQqKiBidWYgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2UmVzaXplQXJlYUZhc3RGdW5jKQorICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBjb25zdCBpbnQqIG9mcywgY29uc3QgaW50ICp4b2ZzICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlc2l6ZUFyZWFGdW5jKQorICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBjb25zdCBDdkRlY2ltYXRlQWxwaGEqIHhvZnMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHhvZnNfY291bnQsIGZsb2F0KiBidWYsIGZsb2F0KiBzdW0gKTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElQUCByZXNpemUgZnVuY3Rpb25zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaWN2UmVzaXplXzh1X0MxUl90IGljdlJlc2l6ZV84dV9DMVJfcCA9IDA7CitpY3ZSZXNpemVfOHVfQzNSX3QgaWN2UmVzaXplXzh1X0MzUl9wID0gMDsKK2ljdlJlc2l6ZV84dV9DNFJfdCBpY3ZSZXNpemVfOHVfQzRSX3AgPSAwOworaWN2UmVzaXplXzE2dV9DMVJfdCBpY3ZSZXNpemVfMTZ1X0MxUl9wID0gMDsKK2ljdlJlc2l6ZV8xNnVfQzNSX3QgaWN2UmVzaXplXzE2dV9DM1JfcCA9IDA7CitpY3ZSZXNpemVfMTZ1X0M0Ul90IGljdlJlc2l6ZV8xNnVfQzRSX3AgPSAwOworaWN2UmVzaXplXzMyZl9DMVJfdCBpY3ZSZXNpemVfMzJmX0MxUl9wID0gMDsKK2ljdlJlc2l6ZV8zMmZfQzNSX3QgaWN2UmVzaXplXzMyZl9DM1JfcCA9IDA7CitpY3ZSZXNpemVfMzJmX0M0Ul90IGljdlJlc2l6ZV8zMmZfQzRSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZSZXNpemVJUFBGdW5jKQorKCBjb25zdCB2b2lkKiBzcmMsIEN2U2l6ZSBzcmNzaXplLCBpbnQgc3Jjc3RlcCwgQ3ZSZWN0IHNyY3JvaSwKKyAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzdHJvaSwKKyAgZG91YmxlIHhmYWN0b3IsIGRvdWJsZSB5ZmFjdG9yLCBpbnQgaW50ZXJwb2xhdGlvbiApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ1ZfSU1QTCB2b2lkCitjdlJlc2l6ZSggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwgaW50IG1ldGhvZCApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGJpbGluX3RhYiwgYmljdWJlX3RhYiwgYXJlYWZhc3RfdGFiLCBhcmVhX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIHZvaWQqIHRlbXBfYnVmID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZXNpemUiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc3NpemUsIGRzaXplOworICAgIGZsb2F0IHNjYWxlX3gsIHNjYWxlX3k7CisgICAgaW50IGssIHN4LCBzeSwgZHgsIGR5OworICAgIGludCB0eXBlLCBkZXB0aCwgY247CisgICAgCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyY2FyciwgJnNyY3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdGFyciwgJmRzdHN0dWIgKSk7CisgICAgCisgICAgaWYoIENWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2Q29weSggc3JjLCBkc3QgKSk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRSZXNpemVUYWIoICZiaWxpbl90YWIsICZiaWN1YmVfdGFiLCAmYXJlYWZhc3RfdGFiLCAmYXJlYV90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgc3NpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIGRzaXplID0gY3ZHZXRNYXRTaXplKCBkc3QgKTsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKyAgICBzY2FsZV94ID0gKGZsb2F0KXNzaXplLndpZHRoL2RzaXplLndpZHRoOworICAgIHNjYWxlX3kgPSAoZmxvYXQpc3NpemUuaGVpZ2h0L2RzaXplLmhlaWdodDsKKworICAgIGlmKCBtZXRob2QgPT0gQ1ZfSU5URVJfQ1VCSUMgJiYKKyAgICAgICAgKE1JTihzc2l6ZS53aWR0aCwgZHNpemUud2lkdGgpIDw9IDQgfHwKKyAgICAgICAgTUlOKHNzaXplLmhlaWdodCwgZHNpemUuaGVpZ2h0KSA8PSA0KSApCisgICAgICAgIG1ldGhvZCA9IENWX0lOVEVSX0xJTkVBUjsKKworICAgIGlmKCBpY3ZSZXNpemVfOHVfQzFSX3AgJiYKKyAgICAgICAgTUlOKHNzaXplLndpZHRoLCBkc2l6ZS53aWR0aCkgPiA0ICYmCisgICAgICAgIE1JTihzc2l6ZS5oZWlnaHQsIGRzaXplLmhlaWdodCkgPiA0ICkKKyAgICB7CisgICAgICAgIEN2UmVzaXplSVBQRnVuYyBpcHBfZnVuYyA9CisgICAgICAgICAgICB0eXBlID09IENWXzhVQzEgPyBpY3ZSZXNpemVfOHVfQzFSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMzID8gaWN2UmVzaXplXzh1X0MzUl9wIDoKKyAgICAgICAgICAgIHR5cGUgPT0gQ1ZfOFVDNCA/IGljdlJlc2l6ZV84dV9DNFJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzE2VUMxID8gaWN2UmVzaXplXzE2dV9DMVJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzE2VUMzID8gaWN2UmVzaXplXzE2dV9DM1JfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzE2VUM0ID8gaWN2UmVzaXplXzE2dV9DNFJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkMxID8gaWN2UmVzaXplXzMyZl9DMVJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gaWN2UmVzaXplXzMyZl9DM1JfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkM0ID8gaWN2UmVzaXplXzMyZl9DNFJfcCA6IDA7CisgICAgICAgIGlmKCBpcHBfZnVuYyAmJiAoQ1ZfSU5URVJfTk4gPCBtZXRob2QgJiYgbWV0aG9kIDwgQ1ZfSU5URVJfQVJFQSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgaW50IGRzdHN0ZXAgPSBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGlwcF9mdW5jKCBzcmMtPmRhdGEucHRyLCBzc2l6ZSwgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2UmVjdCgwLDAsc3NpemUud2lkdGgsc3NpemUuaGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdHN0ZXAsIGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlkc2l6ZS53aWR0aC9zc2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZHNpemUuaGVpZ2h0L3NzaXplLmhlaWdodCwgMSA8PCBtZXRob2QgKSk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIG1ldGhvZCA9PSBDVl9JTlRFUl9OTiApCisgICAgeworICAgICAgICBJUFBJX0NBTEwoIGljdlJlc2l6ZV9OTl84dV9DMVIoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBkc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FTEVNX1NJWkUoc3JjLT50eXBlKSkpOworICAgIH0KKyAgICBlbHNlIGlmKCBtZXRob2QgPT0gQ1ZfSU5URVJfTElORUFSIHx8IG1ldGhvZCA9PSBDVl9JTlRFUl9BUkVBICkKKyAgICB7CisgICAgICAgIGlmKCBtZXRob2QgPT0gQ1ZfSU5URVJfQVJFQSAmJgorICAgICAgICAgICAgc3NpemUud2lkdGggPj0gZHNpemUud2lkdGggJiYgc3NpemUuaGVpZ2h0ID49IGRzaXplLmhlaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vICJhcmVhIiBtZXRob2QgZm9yIChzY2FsZV94ID4gMSAmIHNjYWxlX3kgPiAxKQorICAgICAgICAgICAgaW50IGlzY2FsZV94ID0gY3ZSb3VuZChzY2FsZV94KTsKKyAgICAgICAgICAgIGludCBpc2NhbGVfeSA9IGN2Um91bmQoc2NhbGVfeSk7CisKKyAgICAgICAgICAgIGlmKCBmYWJzKHNjYWxlX3ggLSBpc2NhbGVfeCkgPCBEQkxfRVBTSUxPTiAmJgorICAgICAgICAgICAgICAgIGZhYnMoc2NhbGVfeSAtIGlzY2FsZV95KSA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYXJlYSA9IGlzY2FsZV94KmlzY2FsZV95OworICAgICAgICAgICAgICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwIC8gQ1ZfRUxFTV9TSVpFKGRlcHRoKTsKKyAgICAgICAgICAgICAgICBpbnQqIG9mcyA9IChpbnQqKWN2U3RhY2tBbGxvYyggKGFyZWEgKyBkc2l6ZS53aWR0aCpjbikqc2l6ZW9mKGludCkgKTsKKyAgICAgICAgICAgICAgICBpbnQqIHhvZnMgPSBvZnMgKyBhcmVhOworICAgICAgICAgICAgICAgIEN2UmVzaXplQXJlYUZhc3RGdW5jIGZ1bmMgPSAoQ3ZSZXNpemVBcmVhRmFzdEZ1bmMpYXJlYWZhc3RfdGFiLmZuXzJkW2RlcHRoXTsKKworICAgICAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IoIHN5ID0gMCwgayA9IDA7IHN5IDwgaXNjYWxlX3k7IHN5KysgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIHN4ID0gMDsgc3ggPCBpc2NhbGVfeDsgc3grKyApCisgICAgICAgICAgICAgICAgICAgICAgICBvZnNbaysrXSA9IHN5KnNyY3N0ZXAgKyBzeCpjbjsKKworICAgICAgICAgICAgICAgIGZvciggZHggPSAwOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN4ID0gZHgqaXNjYWxlX3gqY247CisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHhvZnNbZHgqY24gKyBrXSA9IHN4ICsgazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc3NpemUsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIGRzaXplLCBjbiwgb2ZzLCB4b2ZzICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBidWZfbGVuID0gZHNpemUud2lkdGgqY24gKyA0LCBidWZfc2l6ZSwgeG9mc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSAxLmYvKHNjYWxlX3gqc2NhbGVfeSk7CisgICAgICAgICAgICAgICAgZmxvYXQgKmJ1ZiwgKnN1bTsKKyAgICAgICAgICAgICAgICBDdkRlY2ltYXRlQWxwaGEqIHhvZnM7CisgICAgICAgICAgICAgICAgQ3ZSZXNpemVBcmVhRnVuYyBmdW5jID0gKEN2UmVzaXplQXJlYUZ1bmMpYXJlYV90YWIuZm5fMmRbZGVwdGhdOworCisgICAgICAgICAgICAgICAgaWYoICFmdW5jIHx8IGNuID4gNCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gYnVmX2xlbioyKnNpemVvZihmbG9hdCkgKyBzc2l6ZS53aWR0aCoyKnNpemVvZihDdkRlY2ltYXRlQWxwaGEpOworICAgICAgICAgICAgICAgIGlmKCBidWZfc2l6ZSA8IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgICAgICAgICAgICAgYnVmID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoYnVmX3NpemUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcF9idWYgPSBidWYgPSAoZmxvYXQqKWN2QWxsb2MoYnVmX3NpemUpKTsKKyAgICAgICAgICAgICAgICBzdW0gPSBidWYgKyBidWZfbGVuOworICAgICAgICAgICAgICAgIHhvZnMgPSAoQ3ZEZWNpbWF0ZUFscGhhKikoc3VtICsgYnVmX2xlbik7CisKKyAgICAgICAgICAgICAgICBmb3IoIGR4ID0gMCwgayA9IDA7IGR4IDwgZHNpemUud2lkdGg7IGR4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZnN4MSA9IGR4KnNjYWxlX3gsIGZzeDIgPSBmc3gxICsgc2NhbGVfeDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN4MSA9IGN2Q2VpbChmc3gxKSwgc3gyID0gY3ZGbG9vcihmc3gyKTsKKworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClzeDEgPCAodW5zaWduZWQpc3NpemUud2lkdGggKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggc3gxID4gZnN4MSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggayA8IHNzaXplLndpZHRoKjIgKTsgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHhvZnNba10uZGkgPSBkeCpjbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhvZnNba10uc2kgPSAoc3gxLTEpKmNuOworICAgICAgICAgICAgICAgICAgICAgICAgeG9mc1trKytdLmFscGhhID0gKHN4MSAtIGZzeDEpKnNjYWxlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBzeCA9IHN4MTsgc3ggPCBzeDI7IHN4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGsgPCBzc2l6ZS53aWR0aCoyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB4b2ZzW2tdLmRpID0gZHgqY247CisgICAgICAgICAgICAgICAgICAgICAgICB4b2ZzW2tdLnNpID0gc3gqY247CisgICAgICAgICAgICAgICAgICAgICAgICB4b2ZzW2srK10uYWxwaGEgPSBzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCBmc3gyIC0gc3gyID4gMWUtMyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggayA8IHNzaXplLndpZHRoKjIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCgodW5zaWduZWQpc3gyIDwgKHVuc2lnbmVkKXNzaXplLndpZHRoICk7CisgICAgICAgICAgICAgICAgICAgICAgICB4b2ZzW2tdLmRpID0gZHgqY247CisgICAgICAgICAgICAgICAgICAgICAgICB4b2ZzW2tdLnNpID0gc3gyKmNuOworICAgICAgICAgICAgICAgICAgICAgICAgeG9mc1trKytdLmFscGhhID0gKGZzeDIgLSBzeDIpKnNjYWxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeG9mc19jb3VudCA9IGs7CisgICAgICAgICAgICAgICAgbWVtc2V0KCBzdW0sIDAsIGJ1Zl9sZW4qc2l6ZW9mKGZsb2F0KSApOworICAgICAgICAgICAgICAgIG1lbXNldCggYnVmLCAwLCBidWZfbGVuKnNpemVvZihmbG9hdCkgKTsKKworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLCBzc2l6ZSwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgZHNpemUsIGNuLCB4b2ZzLCB4b2ZzX2NvdW50LCBidWYsIHN1bSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIHRydWUgImFyZWEiIG1ldGhvZCBmb3IgdGhlIGNhc2VzIChzY2FsZV94ID4gMSAmIHNjYWxlX3kgPCAxKSBhbmQKKyAgICAgICAgICAgICAvLyAoc2NhbGVfeCA8IDEgJiBzY2FsZV95ID4gMSkgaXMgbm90IGltcGxlbWVudGVkLgorICAgICAgICAgICAgIC8vIGluc3RlYWQsIGl0IGlzIGVtdWxhdGVkIHZpYSBzb21lIHZhcmlhbnQgb2YgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbi4KKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgaW52X3NjYWxlX3ggPSAoZmxvYXQpZHNpemUud2lkdGgvc3NpemUud2lkdGg7CisgICAgICAgICAgICBmbG9hdCBpbnZfc2NhbGVfeSA9IChmbG9hdClkc2l6ZS5oZWlnaHQvc3NpemUuaGVpZ2h0OworICAgICAgICAgICAgaW50IHhtYXggPSBkc2l6ZS53aWR0aCwgd2lkdGggPSBkc2l6ZS53aWR0aCpjbiwgYnVmX3NpemU7CisgICAgICAgICAgICBmbG9hdCAqYnVmMCwgKmJ1ZjE7CisgICAgICAgICAgICBDdlJlc2l6ZUFscGhhICp4b2ZzLCAqeW9mczsKKyAgICAgICAgICAgIGludCBhcmVhX21vZGUgPSBtZXRob2QgPT0gQ1ZfSU5URVJfQVJFQTsKKyAgICAgICAgICAgIGZsb2F0IGZ4LCBmeTsKKyAgICAgICAgICAgIEN2UmVzaXplQmlsaW5lYXJGdW5jIGZ1bmMgPSAoQ3ZSZXNpemVCaWxpbmVhckZ1bmMpYmlsaW5fdGFiLmZuXzJkW2RlcHRoXTsKKworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgICAgIGJ1Zl9zaXplID0gd2lkdGgqMipzaXplb2YoZmxvYXQpICsgKHdpZHRoICsgZHNpemUuaGVpZ2h0KSpzaXplb2YoQ3ZSZXNpemVBbHBoYSk7CisgICAgICAgICAgICBpZiggYnVmX3NpemUgPCBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgICAgICAgICAgYnVmMCA9IChmbG9hdCopY3ZTdGFja0FsbG9jKGJ1Zl9zaXplKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCB0ZW1wX2J1ZiA9IGJ1ZjAgPSAoZmxvYXQqKWN2QWxsb2MoYnVmX3NpemUpKTsKKyAgICAgICAgICAgIGJ1ZjEgPSBidWYwICsgd2lkdGg7CisgICAgICAgICAgICB4b2ZzID0gKEN2UmVzaXplQWxwaGEqKShidWYxICsgd2lkdGgpOworICAgICAgICAgICAgeW9mcyA9IHhvZnMgKyB3aWR0aDsKKworICAgICAgICAgICAgZm9yKCBkeCA9IDA7IGR4IDwgZHNpemUud2lkdGg7IGR4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhYXJlYV9tb2RlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZ4ID0gKGZsb2F0KSgoZHgrMC41KSpzY2FsZV94IC0gMC41KTsKKyAgICAgICAgICAgICAgICAgICAgc3ggPSBjdkZsb29yKGZ4KTsKKyAgICAgICAgICAgICAgICAgICAgZnggLT0gc3g7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN4ID0gY3ZGbG9vcihkeCpzY2FsZV94KTsKKyAgICAgICAgICAgICAgICAgICAgZnggPSAoZHgrMSkgLSAoc3grMSkqaW52X3NjYWxlX3g7CisgICAgICAgICAgICAgICAgICAgIGZ4ID0gZnggPD0gMCA/IDAuZiA6IGZ4IC0gY3ZGbG9vcihmeCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHN4IDwgMCApCisgICAgICAgICAgICAgICAgICAgIGZ4ID0gMCwgc3ggPSAwOworCisgICAgICAgICAgICAgICAgaWYoIHN4ID49IHNzaXplLndpZHRoLTEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnggPSAwLCBzeCA9IHNzaXplLndpZHRoLTE7CisgICAgICAgICAgICAgICAgICAgIGlmKCB4bWF4ID49IGRzaXplLndpZHRoICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtYXggPSBkeDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggIT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwLCBzeCAqPSBjbjsgayA8IGNuOyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeG9mc1tkeCpjbiArIGtdLmlkeCA9IHN4ICsgaywgeG9mc1tkeCpjbiArIGtdLmFscGhhID0gZng7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwLCBzeCAqPSBjbjsgayA8IGNuOyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeG9mc1tkeCpjbiArIGtdLmlkeCA9IHN4ICsgaywKKyAgICAgICAgICAgICAgICAgICAgICAgIHhvZnNbZHgqY24gKyBrXS5pYWxwaGEgPSBDVl9GTFRfVE9fRklYKGZ4LCBJQ1ZfV0FSUF9TSElGVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggZHkgPSAwOyBkeSA8IGRzaXplLmhlaWdodDsgZHkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFhcmVhX21vZGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnkgPSAoZmxvYXQpKChkeSswLjUpKnNjYWxlX3kgLSAwLjUpOworICAgICAgICAgICAgICAgICAgICBzeSA9IGN2Rmxvb3IoZnkpOworICAgICAgICAgICAgICAgICAgICBmeSAtPSBzeTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN5IDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICBzeSA9IDAsIGZ5ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3kgPSBjdkZsb29yKGR5KnNjYWxlX3kpOworICAgICAgICAgICAgICAgICAgICBmeSA9IChkeSsxKSAtIChzeSsxKSppbnZfc2NhbGVfeTsKKyAgICAgICAgICAgICAgICAgICAgZnkgPSBmeSA8PSAwID8gMC5mIDogZnkgLSBjdkZsb29yKGZ5KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB5b2ZzW2R5XS5pZHggPSBzeTsKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggIT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgICAgICB5b2ZzW2R5XS5hbHBoYSA9IGZ5OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeW9mc1tkeV0uaWFscGhhID0gQ1ZfRkxUX1RPX0ZJWChmeSwgSUNWX1dBUlBfU0hJRlQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc3NpemUsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgZHNpemUsIGNuLCB4bWF4LCB4b2ZzLCB5b2ZzLCBidWYwLCBidWYxICkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIG1ldGhvZCA9PSBDVl9JTlRFUl9DVUJJQyApCisgICAgeworICAgICAgICBpbnQgd2lkdGggPSBkc2l6ZS53aWR0aCpjbiwgYnVmX3NpemU7CisgICAgICAgIGludCB4bWluID0gZHNpemUud2lkdGgsIHhtYXggPSAtMTsKKyAgICAgICAgQ3ZSZXNpemVBbHBoYSogeG9mczsKKyAgICAgICAgZmxvYXQqIGJ1Zls0XTsKKyAgICAgICAgQ3ZSZXNpemVCaWN1YmljRnVuYyBmdW5jID0gKEN2UmVzaXplQmljdWJpY0Z1bmMpYmljdWJlX3RhYi5mbl8yZFtkZXB0aF07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgCisgICAgICAgIGJ1Zl9zaXplID0gd2lkdGgqKDQqc2l6ZW9mKGZsb2F0KSArIHNpemVvZih4b2ZzWzBdKSk7CisgICAgICAgIGlmKCBidWZfc2l6ZSA8IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgICAgIGJ1ZlswXSA9IChmbG9hdCopY3ZTdGFja0FsbG9jKGJ1Zl9zaXplKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcF9idWYgPSBidWZbMF0gPSAoZmxvYXQqKWN2QWxsb2MoYnVmX3NpemUpKTsKKworICAgICAgICBmb3IoIGsgPSAxOyBrIDwgNDsgaysrICkKKyAgICAgICAgICAgIGJ1ZltrXSA9IGJ1ZltrLTFdICsgd2lkdGg7CisgICAgICAgIHhvZnMgPSAoQ3ZSZXNpemVBbHBoYSopKGJ1ZlszXSArIHdpZHRoKTsKKworICAgICAgICBpY3ZJbml0Q3ViaWNDb2VmZlRhYigpOworCisgICAgICAgIGZvciggZHggPSAwOyBkeCA8IGRzaXplLndpZHRoOyBkeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZnggPSBkeCpzY2FsZV94OworICAgICAgICAgICAgc3ggPSBjdkZsb29yKGZ4KTsKKyAgICAgICAgICAgIGZ4IC09IHN4OworICAgICAgICAgICAgaW50IGlmeCA9IGN2Um91bmQoZngqSUNWX0NVQklDX1RBQl9TSVpFKTsKKyAgICAgICAgICAgIGlmKCBzeC0xID49IDAgJiYgeG1pbiA+IGR4ICkKKyAgICAgICAgICAgICAgICB4bWluID0gZHg7CisgICAgICAgICAgICBpZiggc3grMiA8IHNzaXplLndpZHRoICkKKyAgICAgICAgICAgICAgICB4bWF4ID0gZHggKyAxOworICAgICAgICAKKyAgICAgICAgICAgIC8vIGF0IGxlYXN0IG9uZSBvZiA0IHBvaW50cyBzaG91bGQgYmUgd2l0aGluIHRoZSBpbWFnZSAtIHRvCisgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIHNldCBvdGhlciBwb2ludHMgdG8gdGhlIHNhbWUgdmFsdWUuIHNlZSB0aGUgbG9vcHMKKyAgICAgICAgICAgIC8vIGZvciggZHggPSAwOyBkeCA8IHhtaW47IGR4KysgKSAuLi4gYW5kIGZvciggOyBkeCA8IHdpZHRoOyBkeCsrICkgLi4uCisgICAgICAgICAgICBpZiggc3ggPCAtMiApCisgICAgICAgICAgICAgICAgc3ggPSAtMjsKKyAgICAgICAgICAgIGVsc2UgaWYoIHN4ID4gc3NpemUud2lkdGggKQorICAgICAgICAgICAgICAgIHN4ID0gc3NpemUud2lkdGg7CisKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4b2ZzW2R4KmNuICsga10uaWR4ID0gc3gqY24gKyBrOworICAgICAgICAgICAgICAgIHhvZnNbZHgqY24gKyBrXS5pYWxwaGEgPSBpZng7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIHNzaXplLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgZHNpemUsIGNuLCB4bWluLCB4bWF4LCB4b2ZzLCBidWYgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJVbmtub3duL3Vuc3VwcG9ydGVkIGludGVycG9sYXRpb24gbWV0aG9kIiApOworCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnRlbXBfYnVmICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhcnBBZmZpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfV0FSUF9BRkZJTkVfQklMSU5FQVJfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgICAgICAgXAorICAgICAgICAgICAgc2NhbGVfYWxwaGFfbWFjcm8sIG11bF9vbmVfbWFjcm8sIGRlc2NhbGVfbWFjcm8sIGNhc3RfbWFjcm8gKSAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZXYXJwQWZmaW5lX0JpbGluZWFyXyMjZmxhdm9yIyNfQ25SKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsIEN2U2l6ZSBzc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZG91YmxlKiBtYXRyaXgsIGludCBjbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUqIGZpbGx2YWwsIGNvbnN0IGludCogb2ZzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIHksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSAgQTEyID0gbWF0cml4WzFdLCBiMSA9IG1hdHJpeFsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgIEEyMiA9IG1hdHJpeFs0XSwgYjIgPSBtYXRyaXhbNV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBkc2l6ZS5oZWlnaHQ7IHkrKywgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4cyA9IENWX0ZMVF9UT19GSVgoIEExMip5ICsgYjEsIElDVl9XQVJQX1NISUZUICk7ICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeXMgPSBDVl9GTFRfVE9fRklYKCBBMjIqeSArIGIyLCBJQ1ZfV0FSUF9TSElGVCApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDA7IHggPCBkc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpeHMgPSB4cyArIG9mc1t4KjJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXlzID0geXMgKyBvZnNbeCoyKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgYSA9IHNjYWxlX2FscGhhX21hY3JvKCBpeHMgJiBJQ1ZfV0FSUF9NQVNLICk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGIgPSBzY2FsZV9hbHBoYV9tYWNybyggaXlzICYgSUNWX1dBUlBfTUFTSyApOyAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBwMCwgcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXhzID4+PSBJQ1ZfV0FSUF9TSElGVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGl5cyA+Pj0gSUNWX1dBUlBfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpeHMgPCAodW5zaWduZWQpKHNzaXplLndpZHRoIC0gMSkgJiYgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAodW5zaWduZWQpaXlzIDwgKHVuc2lnbmVkKShzc2l6ZS5oZWlnaHQgLSAxKSApICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHB0ciA9IHNyYyArIHN0ZXAqaXlzICsgaXhzKmNuOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDAgPSBtdWxfb25lX21hY3JvKHB0cltrXSkgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhICogKHB0cltrK2NuXSAtIHB0cltrXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwMSA9IG11bF9vbmVfbWFjcm8ocHRyW2src3RlcF0pICsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgKiAocHRyW2srY24rc3RlcF0gLSBwdHJbaytzdGVwXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAwID0gZGVzY2FsZV9tYWNybyhtdWxfb25lX21hY3JvKHAwKSArIGIqKHAxIC0gcDApKTsgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeCpjbitrXSA9IChhcnJ0eXBlKWNhc3RfbWFjcm8ocDApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSBpZiggKHVuc2lnbmVkKShpeHMrMSkgPCAodW5zaWduZWQpKHNzaXplLndpZHRoKzEpICYmICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoaXlzKzEpIDwgKHVuc2lnbmVkKShzc2l6ZS5oZWlnaHQrMSkpICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCB4MCA9IElDVl9XQVJQX0NMSVBfWCggaXhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgeTAgPSBJQ1ZfV0FSUF9DTElQX1koIGl5cyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHgxID0gSUNWX1dBUlBfQ0xJUF9YKCBpeHMgKyAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCB5MSA9IElDVl9XQVJQX0NMSVBfWSggaXlzICsgMSApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBwdHIwLCAqcHRyMSwgKnB0cjIsICpwdHIzOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHB0cjAgPSBzcmMgKyB5MCpzdGVwICsgeDAqY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwdHIxID0gc3JjICsgeTAqc3RlcCArIHgxKmNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHRyMiA9IHNyYyArIHkxKnN0ZXAgKyB4MCpjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHB0cjMgPSBzcmMgKyB5MSpzdGVwICsgeDEqY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDAgPSBtdWxfb25lX21hY3JvKHB0cjBba10pICsgYSAqIChwdHIxW2tdIC0gcHRyMFtrXSk7ICBcCisgICAgICAgICAgICAgICAgICAgIHAxID0gbXVsX29uZV9tYWNybyhwdHIyW2tdKSArIGEgKiAocHRyM1trXSAtIHB0cjJba10pOyAgXAorICAgICAgICAgICAgICAgICAgICBwMCA9IGRlc2NhbGVfbWFjcm8oIG11bF9vbmVfbWFjcm8ocDApICsgYioocDEgLSBwMCkgKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqY24ra10gPSAoYXJydHlwZSljYXN0X21hY3JvKHAwKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgaWYoIGZpbGx2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeCpjbitrXSA9IGZpbGx2YWxba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfV0FSUF9TQ0FMRV9BTFBIQSh4KSAoKHgpKigxLi8oSUNWX1dBUlBfTUFTSysxKSkpCisKK0lDVl9ERUZfV0FSUF9BRkZJTkVfQklMSU5FQVJfRlVOQyggOHUsIHVjaGFyLCBpbnQsIENWX05PUCwgSUNWX1dBUlBfTVVMX09ORV84VSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1dBUlBfREVTQ0FMRV84VSwgQ1ZfTk9QICkKKy8vSUNWX0RFRl9XQVJQX0FGRklORV9CSUxJTkVBUl9GVU5DKCA4dSwgdWNoYXIsIGRvdWJsZSwgSUNWX1dBUlBfU0NBTEVfQUxQSEEsIENWX05PUCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9OT1AsIElDVl9XQVJQX0NBU1RfOFUgKQorSUNWX0RFRl9XQVJQX0FGRklORV9CSUxJTkVBUl9GVU5DKCAxNnUsIHVzaG9ydCwgZG91YmxlLCBJQ1ZfV0FSUF9TQ0FMRV9BTFBIQSwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9OT1AsIGN2Um91bmQgKQorSUNWX0RFRl9XQVJQX0FGRklORV9CSUxJTkVBUl9GVU5DKCAzMmYsIGZsb2F0LCBkb3VibGUsIElDVl9XQVJQX1NDQUxFX0FMUEhBLCBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX05PUCwgQ1ZfTk9QICkKKworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZXYXJwQWZmaW5lRnVuYykoCisgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNzaXplLAorICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc2l6ZSwKKyAgICBjb25zdCBkb3VibGUqIG1hdHJpeCwgaW50IGNuLAorICAgIGNvbnN0IHZvaWQqIGZpbGx2YWwsIGNvbnN0IGludCogb2ZzICk7CisKK3N0YXRpYyB2b2lkIGljdkluaXRXYXJwQWZmaW5lVGFiKCBDdkZ1bmNUYWJsZSogYmlsaW5fdGFiICkKK3sKKyAgICBiaWxpbl90YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZXYXJwQWZmaW5lX0JpbGluZWFyXzh1X0NuUjsKKyAgICBiaWxpbl90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2V2FycEFmZmluZV9CaWxpbmVhcl8xNnVfQ25SOworICAgIGJpbGluX3RhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZXYXJwQWZmaW5lX0JpbGluZWFyXzMyZl9DblI7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJUFAgd2FycGFmZmluZSBmdW5jdGlvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ljdldhcnBBZmZpbmVCYWNrXzh1X0MxUl90IGljdldhcnBBZmZpbmVCYWNrXzh1X0MxUl9wID0gMDsKK2ljdldhcnBBZmZpbmVCYWNrXzh1X0MzUl90IGljdldhcnBBZmZpbmVCYWNrXzh1X0MzUl9wID0gMDsKK2ljdldhcnBBZmZpbmVCYWNrXzh1X0M0Ul90IGljdldhcnBBZmZpbmVCYWNrXzh1X0M0Ul9wID0gMDsKK2ljdldhcnBBZmZpbmVCYWNrXzMyZl9DMVJfdCBpY3ZXYXJwQWZmaW5lQmFja18zMmZfQzFSX3AgPSAwOworaWN2V2FycEFmZmluZUJhY2tfMzJmX0MzUl90IGljdldhcnBBZmZpbmVCYWNrXzMyZl9DM1JfcCA9IDA7CitpY3ZXYXJwQWZmaW5lQmFja18zMmZfQzRSX3QgaWN2V2FycEFmZmluZUJhY2tfMzJmX0M0Ul9wID0gMDsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2V2FycEFmZmluZUJhY2tJUFBGdW5jKQorKCBjb25zdCB2b2lkKiBzcmMsIEN2U2l6ZSBzcmNzaXplLCBpbnQgc3Jjc3RlcCwgQ3ZSZWN0IHNyY3JvaSwKKyAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZSZWN0IGRzdHJvaSwKKyAgY29uc3QgZG91YmxlKiBjb2VmZnMsIGludCBpbnRlcnBvbGF0aW9uICk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDVl9JTVBMIHZvaWQKK2N2V2FycEFmZmluZSggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwgY29uc3QgQ3ZNYXQqIG1hdHJpeCwKKyAgICAgICAgICAgICAgaW50IGZsYWdzLCBDdlNjYWxhciBmaWxsdmFsICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgYmlsaW5fdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2V2FycEFmZmluZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIGludCBrLCB0eXBlLCBkZXB0aCwgY24sICpvZnMgPSAwOworICAgIGRvdWJsZSBzcmNfbWF0cml4WzZdLCBkc3RfbWF0cml4WzZdOworICAgIGRvdWJsZSBmaWxsYnVmWzRdOworICAgIGludCBtZXRob2QgPSBmbGFncyAmIDM7CisgICAgQ3ZNYXQgc3JjQWIgPSBjdk1hdCggMiwgMywgQ1ZfNjRGLCBzcmNfbWF0cml4ICksCisgICAgICAgICAgZHN0QWIgPSBjdk1hdCggMiwgMywgQ1ZfNjRGLCBkc3RfbWF0cml4ICksCisgICAgICAgICAgQSwgYiwgaW52QSwgaW52QWI7CisgICAgQ3ZXYXJwQWZmaW5lRnVuYyBmdW5jOworICAgIEN2U2l6ZSBzc2l6ZSwgZHNpemU7CisgICAgCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRXYXJwQWZmaW5lVGFiKCAmYmlsaW5fdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzcmNzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3RhcnIsICZkc3RzdHViICkpOworICAgIAorICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKG1hdHJpeCkgfHwgQ1ZfTUFUX0NOKG1hdHJpeC0+dHlwZSkgIT0gMSB8fAorICAgICAgICBDVl9NQVRfREVQVEgobWF0cml4LT50eXBlKSA8IENWXzMyRiB8fCBtYXRyaXgtPnJvd3MgIT0gMiB8fCBtYXRyaXgtPmNvbHMgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJUcmFuc2Zvcm1hdGlvbiBtYXRyaXggc2hvdWxkIGJlIDJ4MyBmbG9hdGluZy1wb2ludCBzaW5nbGUtY2hhbm5lbCBtYXRyaXgiICk7CisKKyAgICBpZiggZmxhZ3MgJiBDVl9XQVJQX0lOVkVSU0VfTUFQICkKKyAgICAgICAgY3ZDb252ZXJ0U2NhbGUoIG1hdHJpeCwgJmRzdEFiICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gW1J8dF0gLT4gW1JeLTEgfCAtKFJeLTEpKnRdCisgICAgICAgIGN2Q29udmVydFNjYWxlKCBtYXRyaXgsICZzcmNBYiApOworICAgICAgICBjdkdldENvbHMoICZzcmNBYiwgJkEsIDAsIDIgKTsKKyAgICAgICAgY3ZHZXRDb2woICZzcmNBYiwgJmIsIDIgKTsKKyAgICAgICAgY3ZHZXRDb2xzKCAmZHN0QWIsICZpbnZBLCAwLCAyICk7CisgICAgICAgIGN2R2V0Q29sKCAmZHN0QWIsICZpbnZBYiwgMiApOworICAgICAgICBjdkludmVydCggJkEsICZpbnZBLCBDVl9TVkQgKTsKKyAgICAgICAgY3ZHRU1NKCAmaW52QSwgJmIsIC0xLCAwLCAwLCAmaW52QWIgKTsKKyAgICB9CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKyAgICBpZiggY24gPiA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiIiApOworCisgICAgc3NpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBkc2l6ZSA9IGN2R2V0TWF0U2l6ZShkc3QpOworCisgICAgaWYoIGljdldhcnBBZmZpbmVCYWNrXzh1X0MxUl9wICYmIE1JTiggc3NpemUud2lkdGgsIGRzaXplLndpZHRoICkgPj0gNCAmJgorICAgICAgICBNSU4oIHNzaXplLmhlaWdodCwgZHNpemUuaGVpZ2h0ICkgPj0gNCApCisgICAgeworICAgICAgICBDdldhcnBBZmZpbmVCYWNrSVBQRnVuYyBpcHBfZnVuYyA9CisgICAgICAgICAgICB0eXBlID09IENWXzhVQzEgPyBpY3ZXYXJwQWZmaW5lQmFja184dV9DMVJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzhVQzMgPyBpY3ZXYXJwQWZmaW5lQmFja184dV9DM1JfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzhVQzQgPyBpY3ZXYXJwQWZmaW5lQmFja184dV9DNFJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkMxID8gaWN2V2FycEFmZmluZUJhY2tfMzJmX0MxUl9wIDoKKyAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMzJGQzMgPyBpY3ZXYXJwQWZmaW5lQmFja18zMmZfQzNSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDNCA/IGljdldhcnBBZmZpbmVCYWNrXzMyZl9DNFJfcCA6IDA7CisgICAgICAgIAorICAgICAgICBpZiggaXBwX2Z1bmMgJiYgQ1ZfSU5URVJfTk4gPD0gbWV0aG9kICYmIG1ldGhvZCA8PSBDVl9JTlRFUl9BUkVBICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNyY3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBpbnQgZHN0c3RlcCA9IGRzdC0+c3RlcCA/IGRzdC0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIEN2UmVjdCBzcmNyb2kgPSB7MCwgMCwgc3NpemUud2lkdGgsIHNzaXplLmhlaWdodH07CisgICAgICAgICAgICBDdlJlY3QgZHN0cm9pID0gezAsIDAsIGRzaXplLndpZHRoLCBkc2l6ZS5oZWlnaHR9OworCisgICAgICAgICAgICAvLyB0aGlzIGlzIG5vdCB0aGUgbW9zdCBlZmZpY2llbnQgd2F5IHRvIGZpbGwgb3V0bGllcnMKKyAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX1dBUlBfRklMTF9PVVRMSUVSUyApCisgICAgICAgICAgICAgICAgY3ZTZXQoIGRzdCwgZmlsbHZhbCApOworCisgICAgICAgICAgICBpZiggaXBwX2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNzaXplLCBzcmNzdGVwLCBzcmNyb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdHN0ZXAsIGRzdHJvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0QWIuZGF0YS5kYiwgMSA8PCBtZXRob2QgKSA+PSAwICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgY3ZTY2FsYXJUb1Jhd0RhdGEoICZmaWxsdmFsLCBmaWxsYnVmLCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpLCAwICk7CisgICAgb2ZzID0gKGludCopY3ZTdGFja0FsbG9jKCBkc3QtPmNvbHMqMipzaXplb2Yob2ZzWzBdKSApOworICAgIGZvciggayA9IDA7IGsgPCBkc3QtPmNvbHM7IGsrKyApCisgICAgeworICAgICAgICBvZnNbMiprXSA9IENWX0ZMVF9UT19GSVgoIGRzdF9tYXRyaXhbMF0qaywgSUNWX1dBUlBfU0hJRlQgKTsKKyAgICAgICAgb2ZzWzIqaysxXSA9IENWX0ZMVF9UT19GSVgoIGRzdF9tYXRyaXhbM10qaywgSUNWX1dBUlBfU0hJRlQgKTsKKyAgICB9CisKKyAgICAvKmlmKCBtZXRob2QgPT0gQ1ZfSU5URVJfTElORUFSICkqLworICAgIHsKKyAgICAgICAgZnVuYyA9IChDdldhcnBBZmZpbmVGdW5jKWJpbGluX3RhYi5mbl8yZFtkZXB0aF07CisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIHNzaXplLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgZHNpemUsIGRzdF9tYXRyaXgsIGNuLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgQ1ZfV0FSUF9GSUxMX09VVExJRVJTID8gZmlsbGJ1ZiA6IDAsIG9mcyApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgQ3ZNYXQqCitjdjJEUm90YXRpb25NYXRyaXgoIEN2UG9pbnQyRDMyZiBjZW50ZXIsIGRvdWJsZSBhbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlLCBDdk1hdCogbWF0cml4ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0Um90YXRpb25NYXRyaXgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgbVsyXVszXTsKKyAgICBDdk1hdCBNID0gY3ZNYXQoIDIsIDMsIENWXzY0RkMxLCBtICk7CisgICAgZG91YmxlIGFscGhhLCBiZXRhOworCisgICAgaWYoICFtYXRyaXggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGFuZ2xlICo9IENWX1BJLzE4MDsKKyAgICBhbHBoYSA9IGNvcyhhbmdsZSkqc2NhbGU7CisgICAgYmV0YSA9IHNpbihhbmdsZSkqc2NhbGU7CisKKyAgICBtWzBdWzBdID0gYWxwaGE7CisgICAgbVswXVsxXSA9IGJldGE7CisgICAgbVswXVsyXSA9ICgxLWFscGhhKSpjZW50ZXIueCAtIGJldGEqY2VudGVyLnk7CisgICAgbVsxXVswXSA9IC1iZXRhOworICAgIG1bMV1bMV0gPSBhbHBoYTsKKyAgICBtWzFdWzJdID0gYmV0YSpjZW50ZXIueCArICgxLWFscGhhKSpjZW50ZXIueTsKKworICAgIGN2Q29udmVydCggJk0sIG1hdHJpeCApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBtYXRyaXg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FycFBlcnNwZWN0aXZlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfV0FSUF9QRVJTUEVDVElWRV9CSUxJTkVBUl9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIGxvYWRfbWFjcm8sIGNhc3RfbWFjcm8gKVwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZXYXJwUGVyc3BlY3RpdmVfQmlsaW5lYXJfIyNmbGF2b3IjI19DblIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsIEN2U2l6ZSBzc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZG91YmxlKiBtYXRyaXgsIGludCBjbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUqIGZpbGx2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIHksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IEExMSA9IChmbG9hdCltYXRyaXhbMF0sIEExMiA9IChmbG9hdCltYXRyaXhbMV0sIEExMyA9IChmbG9hdCltYXRyaXhbMl07XAorICAgIGZsb2F0IEEyMSA9IChmbG9hdCltYXRyaXhbM10sIEEyMiA9IChmbG9hdCltYXRyaXhbNF0sIEEyMyA9IChmbG9hdCltYXRyaXhbNV07XAorICAgIGZsb2F0IEEzMSA9IChmbG9hdCltYXRyaXhbNl0sIEEzMiA9IChmbG9hdCltYXRyaXhbN10sIEEzMyA9IChmbG9hdCltYXRyaXhbOF07XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIHkgPSAwOyB5IDwgZHNpemUuaGVpZ2h0OyB5KyssIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmbG9hdCB4czAgPSBBMTIqeSArIEExMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmxvYXQgeXMwID0gQTIyKnkgKyBBMjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZsb2F0IHdzID0gQTMyKnkgKyBBMzM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGRzaXplLndpZHRoOyB4KyssIHhzMCArPSBBMTEsIHlzMCArPSBBMjEsIHdzICs9IEEzMSApXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsb2F0IGludl93cyA9IDEuZi93czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCB4cyA9IHhzMCppbnZfd3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmxvYXQgeXMgPSB5czAqaW52X3dzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpeHMgPSBjdkZsb29yKHhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXlzID0gY3ZGbG9vcih5cyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmxvYXQgYSA9IHhzIC0gaXhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsb2F0IGIgPSB5cyAtIGl5czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmbG9hdCBwMCwgcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaXhzIDwgKHVuc2lnbmVkKShzc2l6ZS53aWR0aCAtIDEpICYmICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWl5cyA8ICh1bnNpZ25lZCkoc3NpemUuaGVpZ2h0IC0gMSkgKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBwdHIgPSBzcmMgKyBzdGVwKml5cyArIGl4cypjbjsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAwID0gbG9hZF9tYWNybyhwdHJba10pICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgYSAqIChsb2FkX21hY3JvKHB0cltrK2NuXSkgLSBsb2FkX21hY3JvKHB0cltrXSkpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDEgPSBsb2FkX21hY3JvKHB0cltrK3N0ZXBdKSArICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhICogKGxvYWRfbWFjcm8ocHRyW2srY24rc3RlcF0pIC0gICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKHB0cltrK3N0ZXBdKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqY24ra10gPSAoYXJydHlwZSljYXN0X21hY3JvKHAwICsgYioocDEgLSBwMCkpOyAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgaWYoICh1bnNpZ25lZCkoaXhzKzEpIDwgKHVuc2lnbmVkKShzc2l6ZS53aWR0aCsxKSAmJiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKGl5cysxKSA8ICh1bnNpZ25lZCkoc3NpemUuaGVpZ2h0KzEpKSAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgeDAgPSBJQ1ZfV0FSUF9DTElQX1goIGl4cyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHkwID0gSUNWX1dBUlBfQ0xJUF9ZKCBpeXMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCB4MSA9IElDVl9XQVJQX0NMSVBfWCggaXhzICsgMSApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgeTEgPSBJQ1ZfV0FSUF9DTElQX1koIGl5cyArIDEgKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogcHRyMCwgKnB0cjEsICpwdHIyLCAqcHRyMzsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwdHIwID0gc3JjICsgeTAqc3RlcCArIHgwKmNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcHRyMSA9IHNyYyArIHkwKnN0ZXAgKyB4MSpjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHB0cjIgPSBzcmMgKyB5MSpzdGVwICsgeDAqY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwdHIzID0gc3JjICsgeTEqc3RlcCArIHgxKmNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAwID0gbG9hZF9tYWNybyhwdHIwW2tdKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgYSAqIChsb2FkX21hY3JvKHB0cjFba10pIC0gbG9hZF9tYWNybyhwdHIwW2tdKSk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDEgPSBsb2FkX21hY3JvKHB0cjJba10pICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhICogKGxvYWRfbWFjcm8ocHRyM1trXSkgLSBsb2FkX21hY3JvKHB0cjJba10pKTsgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeCpjbitrXSA9IChhcnJ0eXBlKWNhc3RfbWFjcm8ocDAgKyBiKihwMSAtIHAwKSk7ICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSBpZiggZmlsbHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFt4KmNuK2tdID0gZmlsbHZhbFtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9XQVJQX1NDQUxFX0FMUEhBKHgpICgoeCkqKDEuLyhJQ1ZfV0FSUF9NQVNLKzEpKSkKKworSUNWX0RFRl9XQVJQX1BFUlNQRUNUSVZFX0JJTElORUFSX0ZVTkMoIDh1LCB1Y2hhciwgQ1ZfOFRPMzJGLCBjdlJvdW5kICkKK0lDVl9ERUZfV0FSUF9QRVJTUEVDVElWRV9CSUxJTkVBUl9GVU5DKCAxNnUsIHVzaG9ydCwgQ1ZfTk9QLCBjdlJvdW5kICkKK0lDVl9ERUZfV0FSUF9QRVJTUEVDVElWRV9CSUxJTkVBUl9GVU5DKCAzMmYsIGZsb2F0LCBDVl9OT1AsIENWX05PUCApCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdldhcnBQZXJzcGVjdGl2ZUZ1bmMpKAorICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzc2l6ZSwKKyAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHNpemUsCisgICAgY29uc3QgZG91YmxlKiBtYXRyaXgsIGludCBjbiwgY29uc3Qgdm9pZCogZmlsbHZhbCApOworCitzdGF0aWMgdm9pZCBpY3ZJbml0V2FycFBlcnNwZWN0aXZlVGFiKCBDdkZ1bmNUYWJsZSogYmlsaW5fdGFiICkKK3sKKyAgICBiaWxpbl90YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZXYXJwUGVyc3BlY3RpdmVfQmlsaW5lYXJfOHVfQ25SOworICAgIGJpbGluX3RhYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3ZXYXJwUGVyc3BlY3RpdmVfQmlsaW5lYXJfMTZ1X0NuUjsKKyAgICBiaWxpbl90YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2V2FycFBlcnNwZWN0aXZlX0JpbGluZWFyXzMyZl9DblI7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElQUCB3YXJwcGVyc3BlY3RpdmUgZnVuY3Rpb25zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ljdldhcnBQZXJzcGVjdGl2ZUJhY2tfOHVfQzFSX3QgaWN2V2FycFBlcnNwZWN0aXZlQmFja184dV9DMVJfcCA9IDA7CitpY3ZXYXJwUGVyc3BlY3RpdmVCYWNrXzh1X0MzUl90IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfOHVfQzNSX3AgPSAwOworaWN2V2FycFBlcnNwZWN0aXZlQmFja184dV9DNFJfdCBpY3ZXYXJwUGVyc3BlY3RpdmVCYWNrXzh1X0M0Ul9wID0gMDsKK2ljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0MxUl90IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0MxUl9wID0gMDsKK2ljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0MzUl90IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0MzUl9wID0gMDsKK2ljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0M0Ul90IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0M0Ul9wID0gMDsKKworaWN2V2FycFBlcnNwZWN0aXZlXzh1X0MxUl90IGljdldhcnBQZXJzcGVjdGl2ZV84dV9DMVJfcCA9IDA7CitpY3ZXYXJwUGVyc3BlY3RpdmVfOHVfQzNSX3QgaWN2V2FycFBlcnNwZWN0aXZlXzh1X0MzUl9wID0gMDsKK2ljdldhcnBQZXJzcGVjdGl2ZV84dV9DNFJfdCBpY3ZXYXJwUGVyc3BlY3RpdmVfOHVfQzRSX3AgPSAwOworaWN2V2FycFBlcnNwZWN0aXZlXzMyZl9DMVJfdCBpY3ZXYXJwUGVyc3BlY3RpdmVfMzJmX0MxUl9wID0gMDsKK2ljdldhcnBQZXJzcGVjdGl2ZV8zMmZfQzNSX3QgaWN2V2FycFBlcnNwZWN0aXZlXzMyZl9DM1JfcCA9IDA7CitpY3ZXYXJwUGVyc3BlY3RpdmVfMzJmX0M0Ul90IGljdldhcnBQZXJzcGVjdGl2ZV8zMmZfQzRSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZXYXJwUGVyc3BlY3RpdmVCYWNrSVBQRnVuYykKKyggY29uc3Qgdm9pZCogc3JjLCBDdlNpemUgc3Jjc2l6ZSwgaW50IHNyY3N0ZXAsIEN2UmVjdCBzcmNyb2ksCisgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2UmVjdCBkc3Ryb2ksCisgIGNvbnN0IGRvdWJsZSogY29lZmZzLCBpbnQgaW50ZXJwb2xhdGlvbiApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ1ZfSU1QTCB2b2lkCitjdldhcnBQZXJzcGVjdGl2ZSggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbWF0cml4LCBpbnQgZmxhZ3MsIEN2U2NhbGFyIGZpbGx2YWwgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBiaWxpbl90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZXYXJwUGVyc3BlY3RpdmUiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBpbnQgdHlwZSwgZGVwdGgsIGNuOworICAgIGludCBtZXRob2QgPSBmbGFncyAmIDM7CisgICAgZG91YmxlIHNyY19tYXRyaXhbOV0sIGRzdF9tYXRyaXhbOV07CisgICAgZG91YmxlIGZpbGxidWZbNF07CisgICAgQ3ZNYXQgQSA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIHNyY19tYXRyaXggKSwKKyAgICAgICAgICBpbnZBID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgZHN0X21hdHJpeCApOworICAgIEN2V2FycFBlcnNwZWN0aXZlRnVuYyBmdW5jOworICAgIEN2U2l6ZSBzc2l6ZSwgZHNpemU7CisKKyAgICBpZiggbWV0aG9kID09IENWX0lOVEVSX05OIHx8IG1ldGhvZCA9PSBDVl9JTlRFUl9BUkVBICkKKyAgICAgICAgbWV0aG9kID0gQ1ZfSU5URVJfTElORUFSOworICAgIAorICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0V2FycFBlcnNwZWN0aXZlVGFiKCAmYmlsaW5fdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzcmNzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3RhcnIsICZkc3RzdHViICkpOworICAgIAorICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKG1hdHJpeCkgfHwgQ1ZfTUFUX0NOKG1hdHJpeC0+dHlwZSkgIT0gMSB8fAorICAgICAgICBDVl9NQVRfREVQVEgobWF0cml4LT50eXBlKSA8IENWXzMyRiB8fCBtYXRyaXgtPnJvd3MgIT0gMyB8fCBtYXRyaXgtPmNvbHMgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJUcmFuc2Zvcm1hdGlvbiBtYXRyaXggc2hvdWxkIGJlIDN4MyBmbG9hdGluZy1wb2ludCBzaW5nbGUtY2hhbm5lbCBtYXRyaXgiICk7CisKKyAgICBpZiggZmxhZ3MgJiBDVl9XQVJQX0lOVkVSU0VfTUFQICkKKyAgICAgICAgY3ZDb252ZXJ0U2NhbGUoIG1hdHJpeCwgJmludkEgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBjdkNvbnZlcnRTY2FsZSggbWF0cml4LCAmQSApOworICAgICAgICBjdkludmVydCggJkEsICZpbnZBLCBDVl9TVkQgKTsKKyAgICB9CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKyAgICBpZiggY24gPiA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiIiApOworICAgIAorICAgIHNzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisgICAgZHNpemUgPSBjdkdldE1hdFNpemUoZHN0KTsKKyAgICAKKyAgICBpZiggaWN2V2FycFBlcnNwZWN0aXZlQmFja184dV9DMVJfcCApCisgICAgeworICAgICAgICBDdldhcnBQZXJzcGVjdGl2ZUJhY2tJUFBGdW5jIGlwcF9mdW5jID0KKyAgICAgICAgICAgIHR5cGUgPT0gQ1ZfOFVDMSA/IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfOHVfQzFSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMzID8gaWN2V2FycFBlcnNwZWN0aXZlQmFja184dV9DM1JfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzhVQzQgPyBpY3ZXYXJwUGVyc3BlY3RpdmVCYWNrXzh1X0M0Ul9wIDoKKyAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMzJGQzEgPyBpY3ZXYXJwUGVyc3BlY3RpdmVCYWNrXzMyZl9DMVJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gaWN2V2FycFBlcnNwZWN0aXZlQmFja18zMmZfQzNSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDNCA/IGljdldhcnBQZXJzcGVjdGl2ZUJhY2tfMzJmX0M0Ul9wIDogMDsKKyAgICAgICAgCisgICAgICAgIGlmKCBpcHBfZnVuYyAmJiBDVl9JTlRFUl9OTiA8PSBtZXRob2QgJiYgbWV0aG9kIDw9IENWX0lOVEVSX0FSRUEgJiYKKyAgICAgICAgICAgIE1JTihzc2l6ZS53aWR0aCxzc2l6ZS5oZWlnaHQpID49IDQgJiYgTUlOKGRzaXplLndpZHRoLGRzaXplLmhlaWdodCkgPj0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgaW50IGRzdHN0ZXAgPSBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBDdlN0YXR1cyBzdGF0dXM7CisgICAgICAgICAgICBDdlJlY3Qgc3Jjcm9pID0gezAsIDAsIHNzaXplLndpZHRoLCBzc2l6ZS5oZWlnaHR9OworICAgICAgICAgICAgQ3ZSZWN0IGRzdHJvaSA9IHswLCAwLCBkc2l6ZS53aWR0aCwgZHNpemUuaGVpZ2h0fTsKKworICAgICAgICAgICAgLy8gdGhpcyBpcyBub3QgdGhlIG1vc3QgZWZmaWNpZW50IHdheSB0byBmaWxsIG91dGxpZXJzCisgICAgICAgICAgICBpZiggZmxhZ3MgJiBDVl9XQVJQX0ZJTExfT1VUTElFUlMgKQorICAgICAgICAgICAgICAgIGN2U2V0KCBkc3QsIGZpbGx2YWwgKTsKKworICAgICAgICAgICAgc3RhdHVzID0gaXBwX2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNzaXplLCBzcmNzdGVwLCBzcmNyb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0c3RlcCwgZHN0cm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludkEuZGF0YS5kYiwgMSA8PCBtZXRob2QgKTsKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgICAgICAgICAgRVhJVDsKKworICAgICAgICAgICAgaXBwX2Z1bmMgPSB0eXBlID09IENWXzhVQzEgPyBpY3ZXYXJwUGVyc3BlY3RpdmVfOHVfQzFSX3AgOgorICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfOFVDMyA/IGljdldhcnBQZXJzcGVjdGl2ZV84dV9DM1JfcCA6CisgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl84VUM0ID8gaWN2V2FycFBlcnNwZWN0aXZlXzh1X0M0Ul9wIDoKKyAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMxID8gaWN2V2FycFBlcnNwZWN0aXZlXzMyZl9DMVJfcCA6CisgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDMyA/IGljdldhcnBQZXJzcGVjdGl2ZV8zMmZfQzNSX3AgOgorICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMzJGQzQgPyBpY3ZXYXJwUGVyc3BlY3RpdmVfMzJmX0M0Ul9wIDogMDsKKworICAgICAgICAgICAgaWYoIGlwcF9mdW5jICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZmxhZ3MgJiBDVl9XQVJQX0lOVkVSU0VfTUFQICkKKyAgICAgICAgICAgICAgICAgICAgY3ZJbnZlcnQoICZpbnZBLCAmQSwgQ1ZfU1ZEICk7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBpcHBfZnVuYyggc3JjLT5kYXRhLnB0ciwgc3NpemUsIHNyY3N0ZXAsIHNyY3JvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3RzdGVwLCBkc3Ryb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS5kYXRhLmRiLCAxIDw8IG1ldGhvZCApOworICAgICAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdlNjYWxhclRvUmF3RGF0YSggJmZpbGx2YWwsIGZpbGxidWYsIENWX01BVF9UWVBFKHNyYy0+dHlwZSksIDAgKTsKKworICAgIC8qaWYoIG1ldGhvZCA9PSBDVl9JTlRFUl9MSU5FQVIgKSovCisgICAgeworICAgICAgICBmdW5jID0gKEN2V2FycFBlcnNwZWN0aXZlRnVuYyliaWxpbl90YWIuZm5fMmRbZGVwdGhdOworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLCBzc2l6ZSwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIGRzaXplLCBkc3RfbWF0cml4LCBjbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIENWX1dBUlBfRklMTF9PVVRMSUVSUyA/IGZpbGxidWYgOiAwICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogQ2FsY3VsYXRlcyBjb2VmZmljaWVudHMgb2YgcGVyc3BlY3RpdmUgdHJhbnNmb3JtYXRpb24KKyAqIHdoaWNoIG1hcHMgKHhpLHlpKSB0byAodWksdmkpLCAoaT0xLDIsMyw0KToKKyAqCisgKiAgICAgIGMwMCp4aSArIGMwMSp5aSArIGMwMgorICogdWkgPSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICAgYzIwKnhpICsgYzIxKnlpICsgYzIyCisgKgorICogICAgICBjMTAqeGkgKyBjMTEqeWkgKyBjMTIKKyAqIHZpID0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgIGMyMCp4aSArIGMyMSp5aSArIGMyMgorICoKKyAqIENvZWZmaWNpZW50cyBhcmUgY2FsY3VsYXRlZCBieSBzb2x2aW5nIGxpbmVhciBzeXN0ZW06CisgKiAvIHgwIHkwICAxICAwICAwICAwIC14MCp1MCAteTAqdTAgXCAvYzAwXCAvdTBcCisgKiB8IHgxIHkxICAxICAwICAwICAwIC14MSp1MSAteTEqdTEgfCB8YzAxfCB8dTF8CisgKiB8IHgyIHkyICAxICAwICAwICAwIC14Mip1MiAteTIqdTIgfCB8YzAyfCB8dTJ8CisgKiB8IHgzIHkzICAxICAwICAwICAwIC14Myp1MyAteTMqdTMgfC58YzEwfD18dTN8LAorICogfCAgMCAgMCAgMCB4MCB5MCAgMSAteDAqdjAgLXkwKnYwIHwgfGMxMXwgfHYwfAorICogfCAgMCAgMCAgMCB4MSB5MSAgMSAteDEqdjEgLXkxKnYxIHwgfGMxMnwgfHYxfAorICogfCAgMCAgMCAgMCB4MiB5MiAgMSAteDIqdjIgLXkyKnYyIHwgfGMyMHwgfHYyfAorICogXCAgMCAgMCAgMCB4MyB5MyAgMSAteDMqdjMgLXkzKnYzIC8gXGMyMS8gXHYzLworICoKKyAqIHdoZXJlOgorICogICBjaWogLSBtYXRyaXggY29lZmZpY2llbnRzLCBjMjIgPSAxCisgKi8KK0NWX0lNUEwgQ3ZNYXQqCitjdkdldFBlcnNwZWN0aXZlVHJhbnNmb3JtKCBjb25zdCBDdlBvaW50MkQzMmYqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZQb2ludDJEMzJmKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBtYXRyaXggKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRQZXJzcGVjdGl2ZVRyYW5zZm9ybSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBhWzhdWzhdOworICAgIGRvdWJsZSBiWzhdLCB4WzldOworCisgICAgQ3ZNYXQgQSA9IGN2TWF0KCA4LCA4LCBDVl82NEZDMSwgYSApOworICAgIEN2TWF0IEIgPSBjdk1hdCggOCwgMSwgQ1ZfNjRGQzEsIGIgKTsKKyAgICBDdk1hdCBYID0gY3ZNYXQoIDgsIDEsIENWXzY0RkMxLCB4ICk7CisKKyAgICBpbnQgaTsKKworICAgIGlmKCAhc3JjIHx8ICFkc3QgfHwgIW1hdHJpeCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDQ7ICsraSApCisgICAgeworICAgICAgICBhW2ldWzBdID0gYVtpKzRdWzNdID0gc3JjW2ldLng7CisgICAgICAgIGFbaV1bMV0gPSBhW2krNF1bNF0gPSBzcmNbaV0ueTsKKyAgICAgICAgYVtpXVsyXSA9IGFbaSs0XVs1XSA9IDE7CisgICAgICAgIGFbaV1bM10gPSBhW2ldWzRdID0gYVtpXVs1XSA9CisgICAgICAgIGFbaSs0XVswXSA9IGFbaSs0XVsxXSA9IGFbaSs0XVsyXSA9IDA7CisgICAgICAgIGFbaV1bNl0gPSAtc3JjW2ldLngqZHN0W2ldLng7CisgICAgICAgIGFbaV1bN10gPSAtc3JjW2ldLnkqZHN0W2ldLng7CisgICAgICAgIGFbaSs0XVs2XSA9IC1zcmNbaV0ueCpkc3RbaV0ueTsKKyAgICAgICAgYVtpKzRdWzddID0gLXNyY1tpXS55KmRzdFtpXS55OworICAgICAgICBiW2ldID0gZHN0W2ldLng7CisgICAgICAgIGJbaSs0XSA9IGRzdFtpXS55OworICAgIH0KKworICAgIGN2U29sdmUoICZBLCAmQiwgJlgsIENWX1NWRCApOworICAgIHhbOF0gPSAxOworICAgIAorICAgIFggPSBjdk1hdCggMywgMywgQ1ZfNjRGQzEsIHggKTsKKyAgICBjdkNvbnZlcnQoICZYLCBtYXRyaXggKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbWF0cml4OworfQorCisvKiBDYWxjdWxhdGVzIGNvZWZmaWNpZW50cyBvZiBhZmZpbmUgdHJhbnNmb3JtYXRpb24KKyAqIHdoaWNoIG1hcHMgKHhpLHlpKSB0byAodWksdmkpLCAoaT0xLDIsMyk6CisgKiAgICAgIAorICogdWkgPSBjMDAqeGkgKyBjMDEqeWkgKyBjMDIKKyAqCisgKiB2aSA9IGMxMCp4aSArIGMxMSp5aSArIGMxMgorICoKKyAqIENvZWZmaWNpZW50cyBhcmUgY2FsY3VsYXRlZCBieSBzb2x2aW5nIGxpbmVhciBzeXN0ZW06CisgKiAvIHgwIHkwICAxICAwICAwICAwIFwgL2MwMFwgL3UwXAorICogfCB4MSB5MSAgMSAgMCAgMCAgMCB8IHxjMDF8IHx1MXwKKyAqIHwgeDIgeTIgIDEgIDAgIDAgIDAgfCB8YzAyfCB8dTJ8CisgKiB8ICAwICAwICAwIHgwIHkwICAxIHwgfGMxMHwgfHYwfAorICogfCAgMCAgMCAgMCB4MSB5MSAgMSB8IHxjMTF8IHx2MXwKKyAqIFwgIDAgIDAgIDAgeDIgeTIgIDEgLyB8YzEyfCB8djJ8CisgKgorICogd2hlcmU6CisgKiAgIGNpaiAtIG1hdHJpeCBjb2VmZmljaWVudHMKKyAqLworQ1ZfSU1QTCBDdk1hdCoKK2N2R2V0QWZmaW5lVHJhbnNmb3JtKCBjb25zdCBDdlBvaW50MkQzMmYgKiBzcmMsIGNvbnN0IEN2UG9pbnQyRDMyZiAqIGRzdCwgQ3ZNYXQgKiBtYXBfbWF0cml4ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0QWZmaW5lVHJhbnNmb3JtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgbUEsIG1YLCBtQjsKKyAgICBkb3VibGUgQVs2KjZdOworICAgIGRvdWJsZSBCWzZdOworCWRvdWJsZSB4WzZdOworICAgIGludCBpOworCisgICAgY3ZJbml0TWF0SGVhZGVyKCZtQSwgNiwgNiwgQ1ZfNjRGLCBBKTsKKyAgICBjdkluaXRNYXRIZWFkZXIoJm1CLCA2LCAxLCBDVl82NEYsIEIpOworCWN2SW5pdE1hdEhlYWRlcigmbVgsIDYsIDEsIENWXzY0RiwgeCk7CisKKwlpZiggIXNyYyB8fCAhZHN0IHx8ICFtYXBfbWF0cml4ICkKKwkJQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBqID0gaSoxMjsKKyAgICAgICAgaW50IGsgPSBpKjEyKzY7CisgICAgICAgIEFbal0gPSBBW2srM10gPSBzcmNbaV0ueDsKKyAgICAgICAgQVtqKzFdID0gQVtrKzRdID0gc3JjW2ldLnk7CisgICAgICAgIEFbaisyXSA9IEFbays1XSA9IDE7CisgICAgICAgIEFbaiszXSA9IEFbais0XSA9IEFbais1XSA9IDA7CisgICAgICAgIEFba10gPSBBW2srMV0gPSBBW2srMl0gPSAwOworICAgICAgICBCW2kqMl0gPSBkc3RbaV0ueDsKKyAgICAgICAgQltpKjIrMV0gPSBkc3RbaV0ueTsKKyAgICB9CisgICAgY3ZTb2x2ZSgmbUEsICZtQiwgJm1YKTsKKworICAgIG1YID0gY3ZNYXQoIDIsIDMsIENWXzY0RkMxLCB4ICk7CisJY3ZDb252ZXJ0KCAmbVgsIG1hcF9tYXRyaXggKTsKKworCV9fRU5EX187CisgICAgcmV0dXJuIG1hcF9tYXRyaXg7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJpYyBHZW9tZXRyaWMgVHJhbnNmb3JtYXRpb246IFJlbWFwICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgSUNWX0RFRl9SRU1BUF9CSUxJTkVBUl9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIGxvYWRfbWFjcm8sIGNhc3RfbWFjcm8gKSBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlJlbWFwX0JpbGluZWFyXyMjZmxhdm9yIyNfQ25SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3NpemUsXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc2l6ZSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFweCwgaW50IG14c3RlcCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG1hcHksIGludCBteXN0ZXAsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbiwgY29uc3QgYXJydHlwZSogZmlsbHZhbCApICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGosIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNzaXplLndpZHRoLS07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzc2l6ZS5oZWlnaHQtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXhzdGVwIC89IHNpemVvZihtYXB4WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG15c3RlcCAvPSBzaXplb2YobWFweVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IGRzaXplLmhlaWdodDsgaSsrLCBkc3QgKz0gZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHggKz0gbXhzdGVwLCBtYXB5ICs9IG15c3RlcCApICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaiA9IDA7IGogPCBkc2l6ZS53aWR0aDsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZsb2F0IF94ID0gbWFweFtqXSwgX3kgPSBtYXB5W2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXggPSBjdkZsb29yKF94KSwgaXkgPSBjdkZsb29yKF95KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpaXggPCAodW5zaWduZWQpc3NpemUud2lkdGggJiYgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWl5IDwgKHVuc2lnbmVkKXNzaXplLmhlaWdodCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzID0gc3JjICsgaXkqc3Jjc3RlcCArIGl4KmNuOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX3ggLT0gaXg7IF95IC09IGl5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrLCBzKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gbG9hZF9tYWNybyhzWzBdKSwgdDEgPSBsb2FkX21hY3JvKHNbc3Jjc3RlcF0pOyBcCisgICAgICAgICAgICAgICAgICAgIHQwICs9IF94Kihsb2FkX21hY3JvKHNbY25dKSAtIHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0MSArPSBfeCoobG9hZF9tYWNybyhzW3NyY3N0ZXAgKyBjbl0pIC0gdDEpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2oqY24gKyBrXSA9IChhcnJ0eXBlKWNhc3RfbWFjcm8odDAgKyBfeSoodDEgLSB0MCkpOyBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgaWYoIGZpbGx2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbaipjbiArIGtdID0gZmlsbHZhbFtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9SRU1BUF9CSUNVQklDX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybywgY2FzdF9tYWNybzEsIGNhc3RfbWFjcm8yICkgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2UmVtYXBfQmljdWJpY18jI2ZsYXZvciMjX0NuUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNzaXplLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzaXplLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbWFweCwgaW50IG14c3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBtYXB5LCBpbnQgbXlzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBjb25zdCBhcnJ0eXBlKiBmaWxsdmFsICkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3NpemUud2lkdGggPSBNQVgoIHNzaXplLndpZHRoIC0gMywgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzc2l6ZS5oZWlnaHQgPSBNQVgoIHNzaXplLmhlaWdodCAtIDMsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG14c3RlcCAvPSBzaXplb2YobWFweFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbXlzdGVwIC89IHNpemVvZihtYXB5WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBkc2l6ZS5oZWlnaHQ7IGkrKywgZHN0ICs9IGRzdHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFweCArPSBteHN0ZXAsIG1hcHkgKz0gbXlzdGVwICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgZHNpemUud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpeCA9IGN2Um91bmQobWFweFtqXSooMSA8PCBJQ1ZfV0FSUF9TSElGVCkpOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGl5ID0gY3ZSb3VuZChtYXB5W2pdKigxIDw8IElDVl9XQVJQX1NISUZUKSk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaWZ4ID0gaXggJiBJQ1ZfV0FSUF9NQVNLOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpZnkgPSBpeSAmIElDVl9XQVJQX01BU0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaXggPj49IElDVl9XQVJQX1NISUZUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpeSA+Pj0gSUNWX1dBUlBfU0hJRlQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkoaXgtMSkgPCAodW5zaWduZWQpc3NpemUud2lkdGggJiYgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKShpeS0xKSA8ICh1bnNpZ25lZClzc2l6ZS5oZWlnaHQgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogcyA9IHNyYyArIChpeS0xKSpzcmNzdGVwICsgaXgqY24gKyBrOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gbG9hZF9tYWNybyhzWy1jbl0pKmljdkN1YmljQ29lZmZzW2lmeCoyICsgMV0gKyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKHNbMF0pKmljdkN1YmljQ29lZmZzW2lmeCoyXSArICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oc1tjbl0pKmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUtaWZ4KSoyXSArXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oc1tjbioyXSkqaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRS1pZngpKjIrMV07XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMgKz0gc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGxvYWRfbWFjcm8oc1stY25dKSppY3ZDdWJpY0NvZWZmc1tpZngqMiArIDFdICsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybyhzWzBdKSppY3ZDdWJpY0NvZWZmc1tpZngqMl0gKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKHNbY25dKSppY3ZDdWJpY0NvZWZmc1soSUNWX0NVQklDX1RBQl9TSVpFLWlmeCkqMl0gK1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKHNbY24qMl0pKmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUtaWZ4KSoyKzFdO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzICs9IHNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDIgPSBsb2FkX21hY3JvKHNbLWNuXSkqaWN2Q3ViaWNDb2VmZnNbaWZ4KjIgKyAxXSArICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oc1swXSkqaWN2Q3ViaWNDb2VmZnNbaWZ4KjJdICsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybyhzW2NuXSkqaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRS1pZngpKjJdICtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybyhzW2NuKjJdKSppY3ZDdWJpY0NvZWZmc1soSUNWX0NVQklDX1RBQl9TSVpFLWlmeCkqMisxXTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcyArPSBzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQzID0gbG9hZF9tYWNybyhzWy1jbl0pKmljdkN1YmljQ29lZmZzW2lmeCoyICsgMV0gKyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKHNbMF0pKmljdkN1YmljQ29lZmZzW2lmeCoyXSArICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oc1tjbl0pKmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUtaWZ4KSoyXSArXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oc1tjbioyXSkqaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRS1pZngpKjIrMV07XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQgPSBjYXN0X21hY3JvMSggdDAqaWN2Q3ViaWNDb2VmZnNbaWZ5KjIgKyAxXSArICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MSppY3ZDdWJpY0NvZWZmc1tpZnkqMl0gKyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQyKmljdkN1YmljQ29lZmZzWyhJQ1ZfQ1VCSUNfVEFCX1NJWkUtaWZ5KSoyXSArICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdDMqaWN2Q3ViaWNDb2VmZnNbKElDVl9DVUJJQ19UQUJfU0laRS1pZnkpKjIrMV0gKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2oqY24gKyBrXSA9IGNhc3RfbWFjcm8yKHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgaWYoIGZpbGx2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFtqKmNuICsga10gPSBmaWxsdmFsW2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfUkVNQVBfQklMSU5FQVJfRlVOQyggOHUsIHVjaGFyLCBDVl84VE8zMkYsIGN2Um91bmQgKQorSUNWX0RFRl9SRU1BUF9CSUxJTkVBUl9GVU5DKCAxNnUsIHVzaG9ydCwgQ1ZfTk9QLCBjdlJvdW5kICkKK0lDVl9ERUZfUkVNQVBfQklMSU5FQVJfRlVOQyggMzJmLCBmbG9hdCwgQ1ZfTk9QLCBDVl9OT1AgKQorCitJQ1ZfREVGX1JFTUFQX0JJQ1VCSUNfRlVOQyggOHUsIHVjaGFyLCBpbnQsIENWXzhUTzMyRiwgY3ZSb3VuZCwgQ1ZfRkFTVF9DQVNUXzhVICkKK0lDVl9ERUZfUkVNQVBfQklDVUJJQ19GVU5DKCAxNnUsIHVzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZVICkKK0lDVl9ERUZfUkVNQVBfQklDVUJJQ19GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QLCBDVl9OT1AsIENWX05PUCApCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlbWFwRnVuYykoCisgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNzaXplLAorICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc2l6ZSwKKyAgICBjb25zdCBmbG9hdCogbWFweCwgaW50IG14c3RlcCwKKyAgICBjb25zdCBmbG9hdCogbWFweSwgaW50IG15c3RlcCwKKyAgICBpbnQgY24sIGNvbnN0IHZvaWQqIGZpbGx2YWwgKTsKKworc3RhdGljIHZvaWQgaWN2SW5pdFJlbWFwVGFiKCBDdkZ1bmNUYWJsZSogYmlsaW5lYXJfdGFiLCBDdkZ1bmNUYWJsZSogYmljdWJpY190YWIgKQoreworICAgIGJpbGluZWFyX3RhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdlJlbWFwX0JpbGluZWFyXzh1X0NuUjsKKyAgICBiaWxpbmVhcl90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmVtYXBfQmlsaW5lYXJfMTZ1X0NuUjsKKyAgICBiaWxpbmVhcl90YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2UmVtYXBfQmlsaW5lYXJfMzJmX0NuUjsKKworICAgIGJpY3ViaWNfdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2UmVtYXBfQmljdWJpY184dV9DblI7CisgICAgYmljdWJpY190YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmVtYXBfQmljdWJpY18xNnVfQ25SOworICAgIGJpY3ViaWNfdGFiLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdlJlbWFwX0JpY3ViaWNfMzJmX0NuUjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKiogSVBQIHJlbWFwIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlbWFwSVBQRnVuYykoCisgICAgY29uc3Qgdm9pZCogc3JjLCBDdlNpemUgc3Jjc2l6ZSwgaW50IHNyY3N0ZXAsIEN2UmVjdCBzcmNyb2ksCisgICAgY29uc3QgZmxvYXQqIHhtYXAsIGludCB4bWFwc3RlcCwgY29uc3QgZmxvYXQqIHltYXAsIGludCB5bWFwc3RlcCwKKyAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHN0c2l6ZSwgaW50IGludGVycG9sYXRpb24gKTsgCisKK2ljdlJlbWFwXzh1X0MxUl90IGljdlJlbWFwXzh1X0MxUl9wID0gMDsKK2ljdlJlbWFwXzh1X0MzUl90IGljdlJlbWFwXzh1X0MzUl9wID0gMDsKK2ljdlJlbWFwXzh1X0M0Ul90IGljdlJlbWFwXzh1X0M0Ul9wID0gMDsKKworaWN2UmVtYXBfMzJmX0MxUl90IGljdlJlbWFwXzMyZl9DMVJfcCA9IDA7CitpY3ZSZW1hcF8zMmZfQzNSX3QgaWN2UmVtYXBfMzJmX0MzUl9wID0gMDsKK2ljdlJlbWFwXzMyZl9DNFJfdCBpY3ZSZW1hcF8zMmZfQzRSX3AgPSAwOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfUkVNQVBfU0hJRlQgNQorI2RlZmluZSBDVl9SRU1BUF9NQVNLICgoMSA8PCBDVl9SRU1BUF9TSElGVCkgLSAxKQorCisjaWYgQ1ZfU1NFMiAmJiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBhbGlnbih4KSBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoeCkpKQorI2VsaWYgQ1ZfU1NFMiAmJiAoZGVmaW5lZChfX0lDTCkgfHwgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMzAwKQorI2RlZmluZSBhbGlnbih4KSBfX2RlY2xzcGVjKGFsaWduKHgpKQorI2Vsc2UKKyNkZWZpbmUgYWxpZ24oeCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpY3ZSZW1hcEZpeGVkUHRfOHUoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsCisgICAgY29uc3QgQ3ZNYXQqIHh5bWFwLCBjb25zdCBDdk1hdCogYW1hcCwgY29uc3QgdWNoYXIqIGZpbGx2YWwgKQoreworICAgIGNvbnN0IGludCBUQUJTWiA9IDEgPDwgKENWX1JFTUFQX1NISUZUKjIpOworICAgIHN0YXRpYyB1c2hvcnQgYWxpZ24oOCkgYXRhYltUQUJTWl1bNF07CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIGludCB4LCB5LCBjb2xzID0gc3JjLT5jb2xzLCByb3dzID0gc3JjLT5yb3dzOworICAgIGNvbnN0IHVjaGFyKiBzcHRyMCA9IHNyYy0+ZGF0YS5wdHI7CisgICAgaW50IHNzdGVwID0gc3JjLT5zdGVwOworICAgIHVjaGFyIGZ2MCA9IGZpbGx2YWxbMF0sIGZ2MSA9IGZpbGx2YWxbMV0sIGZ2MiA9IGZpbGx2YWxbMl0sIGZ2MyA9IGZpbGx2YWxbM107CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHNyYy0+dHlwZSk7CisjaWYgQ1ZfU1NFMgorICAgIGNvbnN0IHVjaGFyKiBzcHRyMSA9IHNwdHIwICsgc3N0ZXA7CisgICAgX19tMTI4aSBiciA9IF9tbV9zZXQxX2VwaTMyKChjb2xzLTIpICsgKChyb3dzLTIpPDwxNikpOworICAgIF9fbTEyOGkgeHkyb2ZzID0gX21tX3NldDFfZXBpMzIoMSArIChzc3RlcCA8PCAxNikpOworICAgIF9fbTEyOGkgeiA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgaW50IGFsaWduKDE2KSBpb2ZzMFs0XSwgaW9mczFbNF07CisjZW5kaWYKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBmb3IoIHkgPSAwOyB5IDw9IENWX1JFTUFQX01BU0s7IHkrKyApCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDw9IENWX1JFTUFQX01BU0s7IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGsgPSAoeSA8PCBDVl9SRU1BUF9TSElGVCkgKyB4OworICAgICAgICAgICAgICAgIGF0YWJba11bMF0gPSAodXNob3J0KSgoQ1ZfUkVNQVBfTUFTSysxIC0geSkqKENWX1JFTUFQX01BU0srMSAtIHgpKTsKKyAgICAgICAgICAgICAgICBhdGFiW2tdWzFdID0gKHVzaG9ydCkoKENWX1JFTUFQX01BU0srMSAtIHkpKngpOworICAgICAgICAgICAgICAgIGF0YWJba11bMl0gPSAodXNob3J0KSh5KihDVl9SRU1BUF9NQVNLKzEgLSB4KSk7CisgICAgICAgICAgICAgICAgYXRhYltrXVszXSA9ICh1c2hvcnQpKHkqeCk7CisgICAgICAgICAgICB9CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3Qgc2hvcnQqIHh5ID0gKGNvbnN0IHNob3J0KikoeHltYXAtPmRhdGEucHRyICsgeHltYXAtPnN0ZXAqeSk7CisgICAgICAgIGNvbnN0IHVzaG9ydCogYWxwaGEgPSAoY29uc3QgdXNob3J0KikoYW1hcC0+ZGF0YS5wdHIgKyBhbWFwLT5zdGVwKnkpOworICAgICAgICB1Y2hhciogZHB0ciA9ICh1Y2hhciopKGRzdC0+ZGF0YS5wdHIgKyBkc3QtPnN0ZXAqeSk7CisgICAgICAgIGludCB4ID0gMDsKKworICAgICAgICBpZiggY24gPT0gMSApCisgICAgICAgIHsKKyAgICAjaWYgQ1ZfU1NFMgorICAgICAgICAgICAgZm9yKCA7IHggPD0gY29scyAtIDg7IHggKz0gOCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19tMTI4aSB4eTAgPSBfbW1fbG9hZF9zaTEyOCggKGNvbnN0IF9fbTEyOGkqKSh4eSArIHgqMikpOworICAgICAgICAgICAgICAgIF9fbTEyOGkgeHkxID0gX21tX2xvYWRfc2kxMjgoIChjb25zdCBfX20xMjhpKikoeHkgKyB4KjIgKyA4KSk7CisgICAgICAgICAgICAgICAgLy8gMHwwfDB8MHwuLi4gPD0geDB8eTB8eDF8eTF8Li4uIDwgY29scy0xfHJvd3MtMXxjb2xzLTF8cm93cy0xfC4uLiA/CisgICAgICAgICAgICAgICAgX19tMTI4aSBtYXNrMCA9IF9tbV9jbXBlcV9lcGkzMihfbW1fb3Jfc2kxMjgoX21tX2NtcGd0X2VwaTE2KHosIHh5MCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbW1fY21wZ3RfZXBpMTYoeHkwLGJyKSksIHopOworICAgICAgICAgICAgICAgIF9fbTEyOGkgbWFzazEgPSBfbW1fY21wZXFfZXBpMzIoX21tX29yX3NpMTI4KF9tbV9jbXBndF9lcGkxNih6LCB4eTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2NtcGd0X2VwaTE2KHh5MSxicikpLCB6KTsKKyAgICAgICAgICAgICAgICBfX20xMjhpIG9mczAgPSBfbW1fYW5kX3NpMTI4KF9tbV9tYWRkX2VwaTE2KCB4eTAsIHh5Mm9mcyApLCBtYXNrMCApOworICAgICAgICAgICAgICAgIF9fbTEyOGkgb2ZzMSA9IF9tbV9hbmRfc2kxMjgoX21tX21hZGRfZXBpMTYoIHh5MSwgeHkyb2ZzICksIG1hc2sxICk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaTAsIGkxOworICAgICAgICAgICAgICAgIF9fbTEyOGkgdjAsIHYxLCB2MiwgdjMsIGEwLCBhMSwgYjAsIGIxOworICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCggKF9fbTEyOGkqKWlvZnMwLCBvZnMwICk7CisgICAgICAgICAgICAgICAgX21tX3N0b3JlX3NpMTI4KCAoX19tMTI4aSopaW9mczEsIG9mczEgKTsKKyAgICAgICAgICAgICAgICBpMCA9ICoodXNob3J0Kikoc3B0cjAgKyBpb2ZzMFswXSkgKyAoKih1c2hvcnQqKShzcHRyMCArIGlvZnMwWzFdKSA8PCAxNik7CisgICAgICAgICAgICAgICAgaTEgPSAqKHVzaG9ydCopKHNwdHIwICsgaW9mczBbMl0pICsgKCoodXNob3J0Kikoc3B0cjAgKyBpb2ZzMFszXSkgPDwgMTYpOworICAgICAgICAgICAgICAgIHYwID0gX21tX3VucGFja2xvX2VwaTMyKF9tbV9jdnRzaTMyX3NpMTI4KGkwKSwgX21tX2N2dHNpMzJfc2kxMjgoaTEpKTsKKyAgICAgICAgICAgICAgICBpMCA9ICoodXNob3J0Kikoc3B0cjEgKyBpb2ZzMFswXSkgKyAoKih1c2hvcnQqKShzcHRyMSArIGlvZnMwWzFdKSA8PCAxNik7CisgICAgICAgICAgICAgICAgaTEgPSAqKHVzaG9ydCopKHNwdHIxICsgaW9mczBbMl0pICsgKCoodXNob3J0Kikoc3B0cjEgKyBpb2ZzMFszXSkgPDwgMTYpOworICAgICAgICAgICAgICAgIHYxID0gX21tX3VucGFja2xvX2VwaTMyKF9tbV9jdnRzaTMyX3NpMTI4KGkwKSwgX21tX2N2dHNpMzJfc2kxMjgoaTEpKTsKKyAgICAgICAgICAgICAgICB2MCA9IF9tbV91bnBhY2tsb19lcGk4KHYwLCB6KTsKKyAgICAgICAgICAgICAgICB2MSA9IF9tbV91bnBhY2tsb19lcGk4KHYxLCB6KTsKKworICAgICAgICAgICAgICAgIGEwID0gX21tX3VucGFja2xvX2VwaTMyKF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopYXRhYlthbHBoYVt4XV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopYXRhYlthbHBoYVt4KzFdXSkpOworICAgICAgICAgICAgICAgIGExID0gX21tX3VucGFja2xvX2VwaTMyKF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopYXRhYlthbHBoYVt4KzJdXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKilhdGFiW2FscGhhW3grM11dKSk7CisgICAgICAgICAgICAgICAgYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYTAsIGExKTsKKyAgICAgICAgICAgICAgICBiMSA9IF9tbV91bnBhY2toaV9lcGk2NChhMCwgYTEpOworICAgICAgICAgICAgICAgIHYwID0gX21tX21hZGRfZXBpMTYodjAsIGIwKTsKKyAgICAgICAgICAgICAgICB2MSA9IF9tbV9tYWRkX2VwaTE2KHYxLCBiMSk7CisgICAgICAgICAgICAgICAgdjAgPSBfbW1fYW5kX3NpMTI4KF9tbV9hZGRfZXBpMzIodjAsIHYxKSwgbWFzazApOworCisgICAgICAgICAgICAgICAgaTAgPSAqKHVzaG9ydCopKHNwdHIwICsgaW9mczFbMF0pICsgKCoodXNob3J0Kikoc3B0cjAgKyBpb2ZzMVsxXSkgPDwgMTYpOworICAgICAgICAgICAgICAgIGkxID0gKih1c2hvcnQqKShzcHRyMCArIGlvZnMxWzJdKSArICgqKHVzaG9ydCopKHNwdHIwICsgaW9mczFbM10pIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB2MiA9IF9tbV91bnBhY2tsb19lcGkzMihfbW1fY3Z0c2kzMl9zaTEyOChpMCksIF9tbV9jdnRzaTMyX3NpMTI4KGkxKSk7CisgICAgICAgICAgICAgICAgaTAgPSAqKHVzaG9ydCopKHNwdHIxICsgaW9mczFbMF0pICsgKCoodXNob3J0Kikoc3B0cjEgKyBpb2ZzMVsxXSkgPDwgMTYpOworICAgICAgICAgICAgICAgIGkxID0gKih1c2hvcnQqKShzcHRyMSArIGlvZnMxWzJdKSArICgqKHVzaG9ydCopKHNwdHIxICsgaW9mczFbM10pIDw8IDE2KTsKKyAgICAgICAgICAgICAgICB2MyA9IF9tbV91bnBhY2tsb19lcGkzMihfbW1fY3Z0c2kzMl9zaTEyOChpMCksIF9tbV9jdnRzaTMyX3NpMTI4KGkxKSk7CisgICAgICAgICAgICAgICAgdjIgPSBfbW1fdW5wYWNrbG9fZXBpOCh2Miwgeik7CisgICAgICAgICAgICAgICAgdjMgPSBfbW1fdW5wYWNrbG9fZXBpOCh2Mywgeik7CisKKyAgICAgICAgICAgICAgICBhMCA9IF9tbV91bnBhY2tsb19lcGkzMihfbW1fbG9hZGxfZXBpNjQoKF9fbTEyOGkqKWF0YWJbYWxwaGFbeCs0XV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopYXRhYlthbHBoYVt4KzVdXSkpOworICAgICAgICAgICAgICAgIGExID0gX21tX3VucGFja2xvX2VwaTMyKF9tbV9sb2FkbF9lcGk2NCgoX19tMTI4aSopYXRhYlthbHBoYVt4KzZdXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21tX2xvYWRsX2VwaTY0KChfX20xMjhpKilhdGFiW2FscGhhW3grN11dKSk7CisgICAgICAgICAgICAgICAgYjAgPSBfbW1fdW5wYWNrbG9fZXBpNjQoYTAsIGExKTsKKyAgICAgICAgICAgICAgICBiMSA9IF9tbV91bnBhY2toaV9lcGk2NChhMCwgYTEpOworICAgICAgICAgICAgICAgIHYyID0gX21tX21hZGRfZXBpMTYodjIsIGIwKTsKKyAgICAgICAgICAgICAgICB2MyA9IF9tbV9tYWRkX2VwaTE2KHYzLCBiMSk7CisgICAgICAgICAgICAgICAgdjIgPSBfbW1fYW5kX3NpMTI4KF9tbV9hZGRfZXBpMzIodjIsIHYzKSwgbWFzazEpOworCisgICAgICAgICAgICAgICAgdjAgPSBfbW1fc3JhaV9lcGkzMih2MCwgQ1ZfUkVNQVBfU0hJRlQqMik7CisgICAgICAgICAgICAgICAgdjIgPSBfbW1fc3JhaV9lcGkzMih2MiwgQ1ZfUkVNQVBfU0hJRlQqMik7CisgICAgICAgICAgICAgICAgdjAgPSBfbW1fcGFja3VzX2VwaTE2KF9tbV9wYWNrc19lcGkzMih2MCwgdjIpLCB6KTsKKyAgICAgICAgICAgICAgICBfbW1fc3RvcmVsX2VwaTY0KCAoX19tMTI4aSopKGRwdHIgKyB4KSwgdjAgKTsKKyAgICAgICAgICAgIH0KKyAgICAjZW5kaWYKKworICAgICAgICAgICAgZm9yKCA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4aSA9IHh5W3gqMl0sIHlpID0geHlbeCoyKzFdOworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeWkgPj0gKHVuc2lnbmVkKShyb3dzIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXhpID49ICh1bnNpZ25lZCkoY29scyAtIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHB0clt4XSA9IGZ2MDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNwdHIgPSBzcHRyMCArIHNzdGVwKnlpICsgeGk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzaG9ydCogYSA9IGF0YWJbYWxwaGFbeF1dOworICAgICAgICAgICAgICAgICAgICBkcHRyW3hdID0gKHVjaGFyKSgoc3B0clswXSphWzBdICsgc3B0clsxXSphWzFdICsgc3B0cltzc3RlcF0qYVsyXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwdHJbc3N0ZXArMV0qYVszXSk+PkNWX1JFTUFQX1NISUZUKjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjbiA9PSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4aSA9IHh5W3gqMl0sIHlpID0geHlbeCoyKzFdOworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeWkgPj0gKHVuc2lnbmVkKShyb3dzIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXhpID49ICh1bnNpZ25lZCkoY29scyAtIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHB0clt4KjNdID0gZnYwOyBkcHRyW3gqMysxXSA9IGZ2MTsgZHB0clt4KjMrMl0gPSBmdjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcHRyID0gc3B0cjAgKyBzc3RlcCp5aSArIHhpKjM7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzaG9ydCogYSA9IGF0YWJbYWxwaGFbeF1dOworICAgICAgICAgICAgICAgICAgICBpbnQgdjAsIHYxLCB2MjsKKyAgICAgICAgICAgICAgICAgICAgdjAgPSAoc3B0clswXSphWzBdICsgc3B0clszXSphWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwdHJbc3N0ZXBdKmFbMl0gKyBzcHRyW3NzdGVwKzNdKmFbM10pPj5DVl9SRU1BUF9TSElGVCoyOworICAgICAgICAgICAgICAgICAgICB2MSA9IChzcHRyWzFdKmFbMF0gKyBzcHRyWzRdKmFbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgc3B0cltzc3RlcCsxXSphWzJdICsgc3B0cltzc3RlcCs0XSphWzNdKT4+Q1ZfUkVNQVBfU0hJRlQqMjsKKyAgICAgICAgICAgICAgICAgICAgdjIgPSAoc3B0clsyXSphWzBdICsgc3B0cls1XSphWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwdHJbc3N0ZXArMl0qYVsyXSArIHNwdHJbc3N0ZXArNV0qYVszXSk+PkNWX1JFTUFQX1NISUZUKjI7CisgICAgICAgICAgICAgICAgICAgIGRwdHJbeCozXSA9ICh1Y2hhcil2MDsgZHB0clt4KjMrMV0gPSAodWNoYXIpdjE7IGRwdHJbeCozKzJdID0gKHVjaGFyKXYyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggY24gPT0gNCApOworICAgICAgICAgICAgZm9yKCA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4aSA9IHh5W3gqMl0sIHlpID0geHlbeCoyKzFdOworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeWkgPj0gKHVuc2lnbmVkKShyb3dzIC0gMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXhpID49ICh1bnNpZ25lZCkoY29scyAtIDEpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHB0clt4KjRdID0gZnYwOyBkcHRyW3gqNCsxXSA9IGZ2MTsKKyAgICAgICAgICAgICAgICAgICAgZHB0clt4KjQrMl0gPSBmdjI7IGRwdHJbeCo0KzNdID0gZnYzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogc3B0ciA9IHNwdHIwICsgc3N0ZXAqeWkgKyB4aSozOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2hvcnQqIGEgPSBhdGFiW2FscGhhW3hdXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYwLCB2MTsKKyAgICAgICAgICAgICAgICAgICAgdjAgPSAoc3B0clswXSphWzBdICsgc3B0cls0XSphWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwdHJbc3N0ZXBdKmFbMl0gKyBzcHRyW3NzdGVwKzNdKmFbM10pPj5DVl9SRU1BUF9TSElGVCoyOworICAgICAgICAgICAgICAgICAgICB2MSA9IChzcHRyWzFdKmFbMF0gKyBzcHRyWzVdKmFbMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgc3B0cltzc3RlcCsxXSphWzJdICsgc3B0cltzc3RlcCs1XSphWzNdKT4+Q1ZfUkVNQVBfU0hJRlQqMjsKKyAgICAgICAgICAgICAgICAgICAgZHB0clt4KjRdID0gKHVjaGFyKXYwOyBkcHRyW3gqNCsxXSA9ICh1Y2hhcil2MTsKKyAgICAgICAgICAgICAgICAgICAgdjAgPSAoc3B0clsyXSphWzBdICsgc3B0cls2XSphWzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwdHJbc3N0ZXArMl0qYVsyXSArIHNwdHJbc3N0ZXArNl0qYVszXSk+PkNWX1JFTUFQX1NISUZUKjI7CisgICAgICAgICAgICAgICAgICAgIHYxID0gKHNwdHJbM10qYVswXSArIHNwdHJbN10qYVsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICBzcHRyW3NzdGVwKzNdKmFbMl0gKyBzcHRyW3NzdGVwKzddKmFbM10pPj5DVl9SRU1BUF9TSElGVCoyOworICAgICAgICAgICAgICAgICAgICBkcHRyW3gqNCsyXSA9ICh1Y2hhcil2MDsgZHB0clt4KjQrM10gPSAodWNoYXIpdjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZW1hcCggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwKKyAgICAgICAgIGNvbnN0IEN2QXJyKiBfbWFweCwgY29uc3QgQ3ZBcnIqIF9tYXB5LAorICAgICAgICAgaW50IGZsYWdzLCBDdlNjYWxhciBmaWxsdmFsICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgYmlsaW5lYXJfdGFiOworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBiaWN1YmljX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbWFwIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgbXhzdHViLCAqbWFweCA9IChDdk1hdCopX21hcHg7CisgICAgQ3ZNYXQgbXlzdHViLCAqbWFweSA9IChDdk1hdCopX21hcHk7CisgICAgaW50IHR5cGUsIGRlcHRoLCBjbjsKKyAgICBib29sIGZsdHJlbWFwOworICAgIGludCBtZXRob2QgPSBmbGFncyAmIDM7CisgICAgZG91YmxlIGZpbGxidWZbNF07CisgICAgQ3ZTaXplIHNzaXplLCBkc2l6ZTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0UmVtYXBUYWIoICZiaWxpbmVhcl90YWIsICZiaWN1YmljX3RhYiApOworICAgICAgICBpY3ZJbml0TGluZWFyQ29lZmZUYWIoKTsKKyAgICAgICAgaWN2SW5pdEN1YmljQ29lZmZUYWIoKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyY2FyciwgJnNyY3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdGFyciwgJmRzdHN0dWIgKSk7CisgICAgQ1ZfQ0FMTCggbWFweCA9IGN2R2V0TWF0KCBtYXB4LCAmbXhzdHViICkpOworICAgIENWX0NBTEwoIG1hcHkgPSBjdkdldE1hdCggbWFweSwgJm15c3R1YiApKTsKKyAgICAKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUobWFweC0+dHlwZSkgPT0gQ1ZfMTZTQzEgJiYgQ1ZfTUFUX1RZUEUobWFweS0+dHlwZSkgPT0gQ1ZfMTZTQzIgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIHRlbXA7CisgICAgICAgIENWX1NXQVAobWFweCwgbWFweSwgdGVtcCk7CisgICAgfQorCisgICAgaWYoIChDVl9NQVRfVFlQRShtYXB4LT50eXBlKSAhPSBDVl8zMkZDMSB8fCBDVl9NQVRfVFlQRShtYXB5LT50eXBlKSAhPSBDVl8zMkZDMSkgJiYKKyAgICAgICAgKENWX01BVF9UWVBFKG1hcHgtPnR5cGUpICE9IENWXzE2U0MyIHx8IENWX01BVF9UWVBFKG1hcHktPnR5cGUpICE9IENWXzE2U0MxKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJFaXRoZXIgYm90aCBtYXAgYXJyYXlzIG11c3QgaGF2ZSAzMmZDMSB0eXBlLCAiCisgICAgICAgICJvciBvbmUgb2YgdGhlbSBtdXN0IGJlIDE2c0MyIGFuZCB0aGUgb3RoZXIgb25lIG11c3QgYmUgMTZzQzEiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWFweCwgbWFweSApIHx8ICFDVl9BUkVfU0laRVNfRVEoIG1hcHgsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICJCb3RoIG1hcCBhcnJheXMgYW5kIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIgKTsKKworICAgIGZsdHJlbWFwID0gQ1ZfTUFUX1RZUEUobWFweC0+dHlwZSkgPT0gQ1ZfMzJGQzE7CisgICAgdHlwZSA9IENWX01BVF9UWVBFKHNyYy0+dHlwZSk7CisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgY24gPSBDVl9NQVRfQ04odHlwZSk7CisgICAgaWYoIGNuID4gNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIiIgKTsKKyAgICAKKyAgICBzc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworICAgIGRzaXplID0gY3ZHZXRNYXRTaXplKGRzdCk7CisgICAgCisgICAgY3ZTY2FsYXJUb1Jhd0RhdGEoICZmaWxsdmFsLCBmaWxsYnVmLCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpLCAwICk7CisKKyAgICBpZiggIWZsdHJlbWFwICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzEgJiYgQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSAhPSBDVl84VUMzICYmCisgICAgICAgICAgICBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAgICAgIk9ubHkgOC1iaXQgaW5wdXQvb3V0cHV0IGlzIHN1cHBvcnRlZCBieSB0aGUgZml4ZWQtcG9pbnQgdmFyaWFudCBvZiBjdlJlbWFwIiApOworICAgICAgICBpY3ZSZW1hcEZpeGVkUHRfOHUoIHNyYywgZHN0LCBtYXB4LCBtYXB5LCAodWNoYXIqKWZpbGxidWYgKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggaWN2UmVtYXBfOHVfQzFSX3AgKQorICAgIHsKKyAgICAgICAgQ3ZSZW1hcElQUEZ1bmMgaXBwX2Z1bmMgPQorICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMxID8gaWN2UmVtYXBfOHVfQzFSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMzID8gaWN2UmVtYXBfOHVfQzNSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl84VUM0ID8gaWN2UmVtYXBfOHVfQzRSX3AgOgorICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDMSA/IGljdlJlbWFwXzMyZl9DMVJfcCA6CisgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gaWN2UmVtYXBfMzJmX0MzUl9wIDoKKyAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMzJGQzQgPyBpY3ZSZW1hcF8zMmZfQzRSX3AgOiAwOworICAgICAgICAKKyAgICAgICAgaWYoIGlwcF9mdW5jICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHNyY3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisgICAgICAgICAgICBpbnQgZHN0c3RlcCA9IGRzdC0+c3RlcCA/IGRzdC0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIGludCBteHN0ZXAgPSBtYXB4LT5zdGVwID8gbWFweC0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIGludCBteXN0ZXAgPSBtYXB5LT5zdGVwID8gbWFweS0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIEN2U3RhdHVzIHN0YXR1czsKKyAgICAgICAgICAgIEN2UmVjdCBzcmNyb2kgPSB7MCwgMCwgc3NpemUud2lkdGgsIHNzaXplLmhlaWdodH07CisKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHRoZSBtb3N0IGVmZmljaWVudCB3YXkgdG8gZmlsbCBvdXRsaWVycworICAgICAgICAgICAgaWYoIGZsYWdzICYgQ1ZfV0FSUF9GSUxMX09VVExJRVJTICkKKyAgICAgICAgICAgICAgICBjdlNldCggZHN0LCBmaWxsdmFsICk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGlwcF9mdW5jKCBzcmMtPmRhdGEucHRyLCBzc2l6ZSwgc3Jjc3RlcCwgc3Jjcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHgtPmRhdGEuZmwsIG14c3RlcCwgbWFweS0+ZGF0YS5mbCwgbXlzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdHN0ZXAsIGRzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgPDwgKG1ldGhvZCA9PSBDVl9JTlRFUl9OTiB8fCBtZXRob2QgPT0gQ1ZfSU5URVJfTElORUFSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kID09IENWX0lOVEVSX0NVQklDID8gbWV0aG9kIDogQ1ZfSU5URVJfTElORUFSKSApOworICAgICAgICAgICAgaWYoIHN0YXR1cyA+PSAwICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBDdlJlbWFwRnVuYyBmdW5jID0gbWV0aG9kID09IENWX0lOVEVSX0NVQklDID8KKyAgICAgICAgICAgIChDdlJlbWFwRnVuYyliaWN1YmljX3RhYi5mbl8yZFtkZXB0aF0gOgorICAgICAgICAgICAgKEN2UmVtYXBGdW5jKWJpbGluZWFyX3RhYi5mbl8yZFtkZXB0aF07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIHNzaXplLCBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAsIGRzaXplLAorICAgICAgICAgICAgICBtYXB4LT5kYXRhLmZsLCBtYXB4LT5zdGVwLCBtYXB5LT5kYXRhLmZsLCBtYXB5LT5zdGVwLAorICAgICAgICAgICAgICBjbiwgZmxhZ3MgJiBDVl9XQVJQX0ZJTExfT1VUTElFUlMgPyBmaWxsYnVmIDogMCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZDb252ZXJ0TWFwcyggY29uc3QgQ3ZBcnIqIGFycngsIGNvbnN0IEN2QXJyKiBhcnJ5LAorICAgICAgICAgICAgICAgQ3ZBcnIqIGFycnh5LCBDdkFyciogYXJyYSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbnZlcnRNYXBzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgeHN0dWIsICptYXB4ID0gY3ZHZXRNYXQoIGFycngsICZ4c3R1YiApOworICAgIEN2TWF0IHlzdHViLCAqbWFweSA9IGN2R2V0TWF0KCBhcnJ5LCAmeXN0dWIgKTsKKyAgICBDdk1hdCB4eXN0dWIsICptYXB4eSA9IGN2R2V0TWF0KCBhcnJ4eSwgJnh5c3R1YiApOworICAgIEN2TWF0IGFzdHViLCAqbWFwYSA9IGN2R2V0TWF0KCBhcnJhLCAmYXN0dWIgKTsKKyAgICBpbnQgeCwgeSwgY29scyA9IG1hcHgtPmNvbHMsIHJvd3MgPSBtYXB4LT5yb3dzOworCisgICAgQ1ZfQVNTRVJUKCBDVl9BUkVfU0laRVNfRVEobWFweCwgbWFweSkgJiYgQ1ZfQVJFX1RZUEVTX0VRKG1hcHgsIG1hcHkpICYmCisgICAgICAgIENWX01BVF9UWVBFKG1hcHgtPnR5cGUpID09IENWXzMyRkMxICYmCisgICAgICAgIENWX0FSRV9TSVpFU19FUShtYXB4eSwgbWFweCkgJiYgQ1ZfQVJFX1NJWkVTX0VRKG1hcHh5LCBtYXBhKSAmJgorICAgICAgICBDVl9NQVRfVFlQRShtYXB4eS0+dHlwZSkgPT0gQ1ZfMTZTQzIgJiYKKyAgICAgICAgQ1ZfTUFUX1RZUEUobWFwYS0+dHlwZSkgPT0gQ1ZfMTZTQzEgKTsKKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgZmxvYXQqIHhyb3cgPSAoY29uc3QgZmxvYXQqKShtYXB4LT5kYXRhLnB0ciArIG1hcHgtPnN0ZXAqeSk7CisgICAgICAgIGNvbnN0IGZsb2F0KiB5cm93ID0gKGNvbnN0IGZsb2F0KikobWFweS0+ZGF0YS5wdHIgKyBtYXB5LT5zdGVwKnkpOworICAgICAgICBzaG9ydCogeHkgPSAoc2hvcnQqKShtYXB4eS0+ZGF0YS5wdHIgKyBtYXB4eS0+c3RlcCp5KTsKKyAgICAgICAgc2hvcnQqIGFscGhhID0gKHNob3J0KikobWFwYS0+ZGF0YS5wdHIgKyBtYXBhLT5zdGVwKnkpOworCisgICAgICAgIGZvciggeCA9IDA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeGkgPSBjdlJvdW5kKHhyb3dbeF0qKDEgPDwgQ1ZfUkVNQVBfU0hJRlQpKTsKKyAgICAgICAgICAgIGludCB5aSA9IGN2Um91bmQoeXJvd1t4XSooMSA8PCBDVl9SRU1BUF9TSElGVCkpOworICAgICAgICAgICAgeHlbeCoyXSA9IChzaG9ydCkoeGkgPj4gQ1ZfUkVNQVBfU0hJRlQpOworICAgICAgICAgICAgeHlbeCoyKzFdID0gKHNob3J0KSh5aSA+PiBDVl9SRU1BUF9TSElGVCk7CisgICAgICAgICAgICBhbHBoYVt4XSA9IChzaG9ydCkoKHhpICYgQ1ZfUkVNQVBfTUFTSykgKyAoKHlpICYgQ1ZfUkVNQVBfTUFTSyk8PENWX1JFTUFQX1NISUZUKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLVBvbGFyIFRyYW5zZm9ybSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbm93IGl0IGlzIGRvbmUgdmlhIFJlbWFwOyBtb3JlIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gc2hvdWxkIHVzZQorICAgc29tZSBzdXBlci1zYW1wbGluZyB0ZWNobmlxdWUgb3V0c2lkZSBvZiB0aGUgImZvdmVhIiBjaXJjbGUgKi8KK0NWX0lNUEwgdm9pZAorY3ZMb2dQb2xhciggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBjZW50ZXIsIGRvdWJsZSBNLCBpbnQgZmxhZ3MgKQoreworICAgIEN2TWF0KiBtYXB4ID0gMDsKKyAgICBDdk1hdCogbWFweSA9IDA7CisgICAgZG91YmxlKiBleHBfdGFiID0gMDsKKyAgICBmbG9hdCogYnVmID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2TG9nUG9sYXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzc2l6ZSwgZHNpemU7CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjYXJyLCAmc3Jjc3R1YiApKTsKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0YXJyLCAmZHN0c3R1YiApKTsKKyAgICAKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggTSA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJNIHNob3VsZCBiZSA+MCIgKTsKKworICAgIHNzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisgICAgZHNpemUgPSBjdkdldE1hdFNpemUoZHN0KTsKKworICAgIENWX0NBTEwoIG1hcHggPSBjdkNyZWF0ZU1hdCggZHNpemUuaGVpZ2h0LCBkc2l6ZS53aWR0aCwgQ1ZfMzJGICkpOworICAgIENWX0NBTEwoIG1hcHkgPSBjdkNyZWF0ZU1hdCggZHNpemUuaGVpZ2h0LCBkc2l6ZS53aWR0aCwgQ1ZfMzJGICkpOworCisgICAgaWYoICEoZmxhZ3MgJiBDVl9XQVJQX0lOVkVSU0VfTUFQKSApCisgICAgeworICAgICAgICBpbnQgcGhpLCByaG87CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBleHBfdGFiID0gKGRvdWJsZSopY3ZBbGxvYyggZHNpemUud2lkdGgqc2l6ZW9mKGV4cF90YWJbMF0pKSApOworCisgICAgICAgIGZvciggcmhvID0gMDsgcmhvIDwgZHN0LT53aWR0aDsgcmhvKysgKQorICAgICAgICAgICAgZXhwX3RhYltyaG9dID0gZXhwKHJoby9NKTsKKyAgICAKKyAgICAgICAgZm9yKCBwaGkgPSAwOyBwaGkgPCBkc2l6ZS5oZWlnaHQ7IHBoaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGNwID0gY29zKHBoaSoyKkNWX1BJL2RzaXplLmhlaWdodCk7CisgICAgICAgICAgICBkb3VibGUgc3AgPSBzaW4ocGhpKjIqQ1ZfUEkvZHNpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgIGZsb2F0KiBteCA9IChmbG9hdCopKG1hcHgtPmRhdGEucHRyICsgcGhpKm1hcHgtPnN0ZXApOworICAgICAgICAgICAgZmxvYXQqIG15ID0gKGZsb2F0KikobWFweS0+ZGF0YS5wdHIgKyBwaGkqbWFweS0+c3RlcCk7CisKKyAgICAgICAgICAgIGZvciggcmhvID0gMDsgcmhvIDwgZHNpemUud2lkdGg7IHJobysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgciA9IGV4cF90YWJbcmhvXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgeCA9IHIqY3AgKyBjZW50ZXIueDsKKyAgICAgICAgICAgICAgICBkb3VibGUgeSA9IHIqc3AgKyBjZW50ZXIueTsKKworICAgICAgICAgICAgICAgIG14W3Job10gPSAoZmxvYXQpeDsKKyAgICAgICAgICAgICAgICBteVtyaG9dID0gKGZsb2F0KXk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHgsIHk7CisgICAgICAgIEN2TWF0IGJ1ZngsIGJ1ZnksIGJ1ZnAsIGJ1ZmE7CisgICAgICAgIGRvdWJsZSBhc2NhbGUgPSAoc3NpemUud2lkdGgtMSkvKDIqQ1ZfUEkpOworCisgICAgICAgIENWX0NBTEwoIGJ1ZiA9IChmbG9hdCopY3ZBbGxvYyggNCpkc2l6ZS53aWR0aCpzaXplb2YoYnVmWzBdKSApKTsKKworICAgICAgICBidWZ4ID0gY3ZNYXQoIDEsIGRzaXplLndpZHRoLCBDVl8zMkYsIGJ1ZiApOworICAgICAgICBidWZ5ID0gY3ZNYXQoIDEsIGRzaXplLndpZHRoLCBDVl8zMkYsIGJ1ZiArIGRzaXplLndpZHRoICk7CisgICAgICAgIGJ1ZnAgPSBjdk1hdCggMSwgZHNpemUud2lkdGgsIENWXzMyRiwgYnVmICsgZHNpemUud2lkdGgqMiApOworICAgICAgICBidWZhID0gY3ZNYXQoIDEsIGRzaXplLndpZHRoLCBDVl8zMkYsIGJ1ZiArIGRzaXplLndpZHRoKjMgKTsKKworICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICBidWZ4LmRhdGEuZmxbeF0gPSAoZmxvYXQpeCAtIGNlbnRlci54OworCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBkc2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiBteCA9IChmbG9hdCopKG1hcHgtPmRhdGEucHRyICsgeSptYXB4LT5zdGVwKTsKKyAgICAgICAgICAgIGZsb2F0KiBteSA9IChmbG9hdCopKG1hcHktPmRhdGEucHRyICsgeSptYXB5LT5zdGVwKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGRzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgICAgIGJ1ZnkuZGF0YS5mbFt4XSA9IChmbG9hdCl5IC0gY2VudGVyLnk7CisKKyNpZiAxCisgICAgICAgICAgICBjdkNhcnRUb1BvbGFyKCAmYnVmeCwgJmJ1ZnksICZidWZwLCAmYnVmYSApOworCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgYnVmcC5kYXRhLmZsW3hdICs9IDEuZjsKKworICAgICAgICAgICAgY3ZMb2coICZidWZwLCAmYnVmcCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHJobyA9IGJ1ZnAuZGF0YS5mbFt4XSpNOworICAgICAgICAgICAgICAgIGRvdWJsZSBwaGkgPSBidWZhLmRhdGEuZmxbeF0qYXNjYWxlOworCisgICAgICAgICAgICAgICAgbXhbeF0gPSAoZmxvYXQpcmhvOworICAgICAgICAgICAgICAgIG15W3hdID0gKGZsb2F0KXBoaTsKKyAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHh4ID0gYnVmeC5kYXRhLmZsW3hdOworICAgICAgICAgICAgICAgIGRvdWJsZSB5eSA9IGJ1ZnkuZGF0YS5mbFt4XTsKKworICAgICAgICAgICAgICAgIGRvdWJsZSBwID0gbG9nKHNxcnQoeHgqeHggKyB5eSp5eSkgKyAxLikqTTsKKyAgICAgICAgICAgICAgICBkb3VibGUgYSA9IGF0YW4yKHl5LHh4KTsKKyAgICAgICAgICAgICAgICBpZiggYSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBhID0gMipDVl9QSSArIGE7CisgICAgICAgICAgICAgICAgYSAqPSBhc2NhbGU7CisKKyAgICAgICAgICAgICAgICBteFt4XSA9IChmbG9hdClwOworICAgICAgICAgICAgICAgIG15W3hdID0gKGZsb2F0KWE7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGN2UmVtYXAoIHNyYywgZHN0LCBtYXB4LCBtYXB5LCBmbGFncywgY3ZTY2FsYXJBbGwoMCkgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdkZyZWUoICZleHBfdGFiICk7CisgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmbWFweCApOworICAgIGN2UmVsZWFzZU1hdCggJm1hcHkgKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZpbnBhaW50LmNwcCBiL2N2L3NyYy9jdmlucGFpbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjQ3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZpbnBhaW50LmNwcApAQCAtMCwwICsxLDgyMSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBpY3ZlcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEdlb21ldHJpY2FsIHRyYW5zZm9ybXMgb24gaW1hZ2VzIGFuZCBtYXRyaWNlczogcm90YXRpb24sIHpvb20gZXRjLgorLy8KKy8vICovCisKKyNpbmNsdWRlICJfY3YuaCIKKworI3VuZGVmIENWX01BVF9FTEVNX1BUUl9GQVNUCisjZGVmaW5lIENWX01BVF9FTEVNX1BUUl9GQVNUKCBtYXQsIHJvdywgY29sLCBwaXhfc2l6ZSApICBcCisgICAgICgobWF0KS5kYXRhLnB0ciArIChzaXplX3QpKG1hdCkuc3RlcCoocm93KSArIChwaXhfc2l6ZSkqKGNvbCkpCisKK2lubGluZSBmbG9hdAorbWluNCggZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgYywgZmxvYXQgZCApCit7CisgICAgYSA9IE1JTihhLGIpOworICAgIGMgPSBNSU4oYyxkKTsKKyAgICByZXR1cm4gTUlOKGEsYyk7Cit9CisKKyNkZWZpbmUgQ1ZfTUFUXzNDT0xPUl9FTEVNKGltZyx0eXBlLHkseCxjKSBDVl9NQVRfRUxFTShpbWcsdHlwZSx5LCh4KSozKyhjKSkKKyNkZWZpbmUgS05PV04gIDAgIC8va25vd24gb3V0c2lkZSBuYXJyb3cgYmFuZAorI2RlZmluZSBCQU5EICAgMSAgLy9uYXJyb3cgYmFuZCAoa25vd24pCisjZGVmaW5lIElOU0lERSAyICAvL3Vua25vd24KKyNkZWZpbmUgQ0hBTkdFIDMgIC8vc2VydmlzZQorCit0eXBlZGVmIHN0cnVjdCBDdkhlYXBFbGVtCit7CisgICAgZmxvYXQgVDsKKyAgICBpbnQgaSxqOworICAgIHN0cnVjdCBDdkhlYXBFbGVtKiBwcmV2OworICAgIHN0cnVjdCBDdkhlYXBFbGVtKiBuZXh0OworfQorQ3ZIZWFwRWxlbTsKKworCitjbGFzcyBDdlByaW9yaXR5UXVldWVGbG9hdAoreworcHJvdGVjdGVkOgorICAgIEN2SGVhcEVsZW0gKm1lbSwqZW1wdHksKmhlYWQsKnRhaWw7CisgICAgaW50IG51bSxpbjsKKworcHVibGljOgorICAgIGJvb2wgSW5pdCggY29uc3QgQ3ZNYXQqIGYgKQorICAgIHsKKyAgICAgICAgaW50IGksajsKKyAgICAgICAgZm9yKCBpID0gbnVtID0gMDsgaSA8IGYtPnJvd3M7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBmLT5jb2xzOyBqKysgKQorICAgICAgICAgICAgICAgIG51bSArPSBDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGopIT0wOworICAgICAgICB9CisgICAgICAgIGlmIChudW08PTApIHJldHVybiBmYWxzZTsKKyAgICAgICAgbWVtID0gKEN2SGVhcEVsZW0qKWN2QWxsb2MoKG51bSsyKSpzaXplb2YoQ3ZIZWFwRWxlbSkpOworICAgICAgICBpZiAobWVtPT1OVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaGVhZCAgICAgICA9IG1lbTsKKyAgICAgICAgaGVhZC0+aSAgICA9IGhlYWQtPmogPSAtMTsKKyAgICAgICAgaGVhZC0+cHJldiA9IE5VTEw7CisgICAgICAgIGhlYWQtPm5leHQgPSBtZW0rMTsKKyAgICAgICAgaGVhZC0+VCAgICA9IC1GTFRfTUFYOworICAgICAgICBlbXB0eSAgICAgID0gbWVtKzE7CisgICAgICAgIGZvciAoaT0xOyBpPD1udW07IGkrKykgeworICAgICAgICAgICAgbWVtW2ldLnByZXYgICA9IG1lbStpLTE7CisgICAgICAgICAgICBtZW1baV0ubmV4dCAgID0gbWVtK2krMTsKKyAgICAgICAgICAgIG1lbVtpXS5pICAgICAgPSBtZW1baV0uaSA9IC0xOworICAgICAgICAgICAgbWVtW2ldLlQgICAgICA9IEZMVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgdGFpbCAgICAgICA9IG1lbStpOworICAgICAgICB0YWlsLT5pICAgID0gdGFpbC0+aiA9IC0xOworICAgICAgICB0YWlsLT5wcmV2ID0gbWVtK2ktMTsKKyAgICAgICAgdGFpbC0+bmV4dCA9IE5VTEw7CisgICAgICAgIHRhaWwtPlQgICAgPSBGTFRfTUFYOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBib29sIEFkZChjb25zdCBDdk1hdCogZikgeworICAgICAgICBpbnQgaSxqOworICAgICAgICBmb3IgKGk9MDsgaTxmLT5yb3dzOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaj0wOyBqPGYtPmNvbHM7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGopIT0wKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghUHVzaChpLGosMCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBQdXNoKGludCBpLCBpbnQgaiwgZmxvYXQgVCkgeworICAgICAgICBDdkhlYXBFbGVtICp0bXA9ZW1wdHksKmFkZD1lbXB0eTsKKyAgICAgICAgaWYgKGVtcHR5PT10YWlsKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHdoaWxlICh0bXAtPnByZXYtPlQ+VCkgdG1wID0gdG1wLT5wcmV2OworICAgICAgICBpZiAodG1wIT1lbXB0eSkgeworICAgICAgICAgICAgYWRkLT5wcmV2LT5uZXh0ID0gYWRkLT5uZXh0OworICAgICAgICAgICAgYWRkLT5uZXh0LT5wcmV2ID0gYWRkLT5wcmV2OworICAgICAgICAgICAgZW1wdHkgPSBhZGQtPm5leHQ7CisgICAgICAgICAgICBhZGQtPnByZXYgPSB0bXAtPnByZXY7CisgICAgICAgICAgICBhZGQtPm5leHQgPSB0bXA7CisgICAgICAgICAgICBhZGQtPnByZXYtPm5leHQgPSBhZGQ7CisgICAgICAgICAgICBhZGQtPm5leHQtPnByZXYgPSBhZGQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbXB0eSA9IGVtcHR5LT5uZXh0OworICAgICAgICB9CisgICAgICAgIGFkZC0+aSA9IGk7CisgICAgICAgIGFkZC0+aiA9IGo7CisgICAgICAgIGFkZC0+VCA9IFQ7CisgICAgICAgIGluKys7CisgICAgICAgIC8vICAgICAgcHJpbnRmKCJwdXNoIGkgJTNkICBqICUzZCAgVCAlMTIuNGUgIGluICU0ZFxuIixpLGosVCxpbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgUG9wKGludCAqaSwgaW50ICpqKSB7CisgICAgICAgIEN2SGVhcEVsZW0gKnRtcD1oZWFkLT5uZXh0OworICAgICAgICBpZiAoZW1wdHk9PXRtcCkgcmV0dXJuIGZhbHNlOworICAgICAgICAqaSA9IHRtcC0+aTsKKyAgICAgICAgKmogPSB0bXAtPmo7CisgICAgICAgIHRtcC0+cHJldi0+bmV4dCA9IHRtcC0+bmV4dDsKKyAgICAgICAgdG1wLT5uZXh0LT5wcmV2ID0gdG1wLT5wcmV2OworICAgICAgICB0bXAtPnByZXYgPSBlbXB0eS0+cHJldjsKKyAgICAgICAgdG1wLT5uZXh0ID0gZW1wdHk7CisgICAgICAgIHRtcC0+cHJldi0+bmV4dCA9IHRtcDsKKyAgICAgICAgdG1wLT5uZXh0LT5wcmV2ID0gdG1wOworICAgICAgICBlbXB0eSA9IHRtcDsKKyAgICAgICAgaW4tLTsKKyAgICAgICAgLy8gICAgICBwcmludGYoInBvcCAgaSAlM2QgIGogJTNkICBUICUxMi40ZSAgaW4gJTRkXG4iLHRtcC0+aSx0bXAtPmosdG1wLT5ULGluKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBQb3AoaW50ICppLCBpbnQgKmosIGZsb2F0ICpUKSB7CisgICAgICAgIEN2SGVhcEVsZW0gKnRtcD1oZWFkLT5uZXh0OworICAgICAgICBpZiAoZW1wdHk9PXRtcCkgcmV0dXJuIGZhbHNlOworICAgICAgICAqaSA9IHRtcC0+aTsKKyAgICAgICAgKmogPSB0bXAtPmo7CisgICAgICAgICpUID0gdG1wLT5UOworICAgICAgICB0bXAtPnByZXYtPm5leHQgPSB0bXAtPm5leHQ7CisgICAgICAgIHRtcC0+bmV4dC0+cHJldiA9IHRtcC0+cHJldjsKKyAgICAgICAgdG1wLT5wcmV2ID0gZW1wdHktPnByZXY7CisgICAgICAgIHRtcC0+bmV4dCA9IGVtcHR5OworICAgICAgICB0bXAtPnByZXYtPm5leHQgPSB0bXA7CisgICAgICAgIHRtcC0+bmV4dC0+cHJldiA9IHRtcDsKKyAgICAgICAgZW1wdHkgPSB0bXA7CisgICAgICAgIGluLS07CisgICAgICAgIC8vICAgICAgcHJpbnRmKCJwb3AgIGkgJTNkICBqICUzZCAgVCAlMTIuNGUgIGluICU0ZFxuIix0bXAtPmksdG1wLT5qLHRtcC0+VCxpbik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEN2UHJpb3JpdHlRdWV1ZUZsb2F0KHZvaWQpIHsKKyAgICAgICAgbnVtPWluPTA7CisgICAgICAgIG1lbT1lbXB0eT1oZWFkPXRhaWw9TlVMTDsKKyAgICB9CisKKyAgICB+Q3ZQcmlvcml0eVF1ZXVlRmxvYXQodm9pZCkKKyAgICB7CisgICAgICAgIGN2RnJlZSggJm1lbSApOworICAgIH0KK307CisKK2lubGluZSBmbG9hdCBWZWN0b3JTY2FsTXVsdChDdlBvaW50MkQzMmYgdjEsQ3ZQb2ludDJEMzJmIHYyKSB7CisgICByZXR1cm4gdjEueCp2Mi54K3YxLnkqdjIueTsKK30KKworaW5saW5lIGZsb2F0IFZlY3Rvckxlbmd0aChDdlBvaW50MkQzMmYgdjEpIHsKKyAgIHJldHVybiB2MS54KnYxLngrdjEueSp2MS55OworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvL0hFQVA6Oml0ZXJhdG9yIEhlYXBfSXRlcmF0b3I7CisvL0hFQVAgSGVhcDsKKworZmxvYXQgRmFzdE1hcmNoaW5nX3NvbHZlKGludCBpMSxpbnQgajEsaW50IGkyLGludCBqMiwgY29uc3QgQ3ZNYXQqIGYsIGNvbnN0IEN2TWF0KiB0KQoreworICAgIGRvdWJsZSBzb2wsIGExMSwgYTIyLCBtMTI7CisgICAgYTExPUNWX01BVF9FTEVNKCp0LGZsb2F0LGkxLGoxKTsKKyAgICBhMjI9Q1ZfTUFUX0VMRU0oKnQsZmxvYXQsaTIsajIpOworICAgIG0xMj1NSU4oYTExLGEyMik7CisgICAgCisgICAgaWYoIENWX01BVF9FTEVNKCpmLHVjaGFyLGkxLGoxKSAhPSBJTlNJREUgKQorICAgICAgICBpZiggQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaTIsajIpICE9IElOU0lERSApCisgICAgICAgICAgICBpZiggZmFicyhhMTEtYTIyKSA+PSAxLjAgKQorICAgICAgICAgICAgICAgIHNvbCA9IDErbTEyOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNvbCA9IChhMTErYTIyK3NxcnQoKGRvdWJsZSkoMi0oYTExLWEyMikqKGExMS1hMjIpKSkpKjAuNTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc29sID0gMSthMTE7CisgICAgZWxzZSBpZiggQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaTIsajIpICE9IElOU0lERSApCisgICAgICAgIHNvbCA9IDErYTIyOworICAgIGVsc2UKKyAgICAgICAgc29sID0gMSttMTI7CisgICAgICAgICAgICAKKyAgICByZXR1cm4gKGZsb2F0KXNvbDsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK3N0YXRpYyB2b2lkCitpY3ZDYWxjRk1NKGNvbnN0IEN2TWF0ICpmLCBDdk1hdCAqdCwgQ3ZQcmlvcml0eVF1ZXVlRmxvYXQgKkhlYXAsIGJvb2wgbmVnYXRlKSB7CisgICBpbnQgaSwgaiwgaWkgPSAwLCBqaiA9IDAsIHE7CisgICBmbG9hdCBkaXN0OworCisgICB3aGlsZSAoSGVhcC0+UG9wKCZpaSwmamopKSB7CisKKyAgICAgIHVuc2lnbmVkIGtub3duPShuZWdhdGUpP0NIQU5HRTpLTk9XTjsKKyAgICAgIENWX01BVF9FTEVNKCpmLHVjaGFyLGlpLGpqKSA9ICh1Y2hhcilrbm93bjsKKworICAgICAgZm9yIChxPTA7IHE8NDsgcSsrKSB7CisgICAgICAgICBpPTA7IGo9MDsKKyAgICAgICAgIGlmICAgICAocT09MCkge2k9aWktMTsgaj1qajt9CisgICAgICAgICBlbHNlIGlmKHE9PTEpIHtpPWlpOyAgIGo9amotMTt9CisgICAgICAgICBlbHNlIGlmKHE9PTIpIHtpPWlpKzE7IGo9amo7fQorICAgICAgICAgZWxzZSB7aT1paTsgICBqPWpqKzE7fQorICAgICAgICAgaWYgKChpPD0wKXx8KGo8PTApfHwoaT5mLT5yb3dzKXx8KGo+Zi0+Y29scykpIGNvbnRpbnVlOworCisgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqKT09SU5TSURFKSB7CisgICAgICAgICAgICBkaXN0ID0gbWluNChGYXN0TWFyY2hpbmdfc29sdmUoaS0xLGosaSxqLTEsZix0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXJjaGluZ19zb2x2ZShpKzEsaixpLGotMSxmLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hcmNoaW5nX3NvbHZlKGktMSxqLGksaisxLGYsdCksCisgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWFyY2hpbmdfc29sdmUoaSsxLGosaSxqKzEsZix0KSk7CisgICAgICAgICAgICBDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGopID0gZGlzdDsKKyAgICAgICAgICAgIENWX01BVF9FTEVNKCpmLHVjaGFyLGksaikgPSBCQU5EOworICAgICAgICAgICAgSGVhcC0+UHVzaChpLGosZGlzdCk7CisgICAgICAgICB9CisgICAgICB9CisgICB9CisKKyAgIGlmIChuZWdhdGUpIHsKKyAgICAgIGZvciAoaT0wOyBpPGYtPnJvd3M7IGkrKykgeworICAgICAgICAgZm9yKGo9MDsgajxmLT5jb2xzOyBqKyspIHsKKyAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGopID09IENIQU5HRSkgeworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqKSA9IEtOT1dOOworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSA9IC1DVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGopOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZUZWxlYUlucGFpbnRGTU0oY29uc3QgQ3ZNYXQgKmYsIEN2TWF0ICp0LCBDdk1hdCAqb3V0LCBpbnQgcmFuZ2UsIEN2UHJpb3JpdHlRdWV1ZUZsb2F0ICpIZWFwICkgeworICAgaW50IGkgPSAwLCBqID0gMCwgaWkgPSAwLCBqaiA9IDAsIGssIGwsIHEsIGNvbG9yID0gMDsKKyAgIGZsb2F0IGRpc3Q7CisKKyAgIGlmIChDVl9NQVRfQ04ob3V0LT50eXBlKT09MykgeworCisgICAgICB3aGlsZSAoSGVhcC0+UG9wKCZpaSwmamopKSB7CisKKyAgICAgICAgIENWX01BVF9FTEVNKCpmLHVjaGFyLGlpLGpqKSA9IEtOT1dOOworICAgICAgICAgZm9yKHE9MDsgcTw0OyBxKyspIHsKKyAgICAgICAgICAgIGlmICAgICAocT09MCkge2k9aWktMTsgaj1qajt9CisgICAgICAgICAgICBlbHNlIGlmKHE9PTEpIHtpPWlpOyAgIGo9amotMTt9CisgICAgICAgICAgICBlbHNlIGlmKHE9PTIpIHtpPWlpKzE7IGo9amo7fQorICAgICAgICAgICAgZWxzZSBpZihxPT0zKSB7aT1paTsgICBqPWpqKzE7fQorICAgICAgICAgICAgaWYgKChpPD0xKXx8KGo8PTEpfHwoaT50LT5yb3dzLTEpfHwoaj50LT5jb2xzLTEpKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGksaik9PUlOU0lERSkgeworICAgICAgICAgICAgICAgZGlzdCA9IG1pbjQoRmFzdE1hcmNoaW5nX3NvbHZlKGktMSxqLGksai0xLGYsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWFyY2hpbmdfc29sdmUoaSsxLGosaSxqLTEsZix0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXJjaGluZ19zb2x2ZShpLTEsaixpLGorMSxmLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hcmNoaW5nX3NvbHZlKGkrMSxqLGksaisxLGYsdCkpOworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSA9IGRpc3Q7CisKKyAgICAgICAgICAgICAgIGZvciAoY29sb3I9MDsgY29sb3I8PTI7IGNvbG9yKyspIHsKKyAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBncmFkSSxncmFkVCxyOworICAgICAgICAgICAgICAgICAgZmxvYXQgSWE9MCxKeD0wLEp5PTAscz0xLjBlLTIwZix3LGRzdCxsZXYsZGlyLHNhdDsKKworICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGksaisxKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqLTEpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULng9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKzEpLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksai0xKSkpKjAuNWY7CisgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZFQueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGorMSktQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSkpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGotMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZFQueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGopLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksai0xKSkpOworICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULng9MDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpKzEsaikhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGktMSxqKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncmFkVC55PShmbG9hdCkoKENWX01BVF9FTEVNKCp0LGZsb2F0LGkrMSxqKS1DVl9NQVRfRUxFTSgqdCxmbG9hdCxpLTEsaikpKSowLjVmOworICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSsxLGopLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksaikpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaS0xLGopIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKS1DVl9NQVRfRUxFTSgqdCxmbG9hdCxpLTEsaikpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncmFkVC55PTA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBmb3IgKGs9aS1yYW5nZTsgazw9aStyYW5nZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQga209ay0xKyhrPT0xKSxrcD1rLTEtKGs9PXQtPnJvd3MtMik7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGw9ai1yYW5nZTsgbDw9aityYW5nZTsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG09bC0xKyhsPT0xKSxscD1sLTEtKGw9PXQtPmNvbHMtMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaz4wJiZsPjAmJms8dC0+cm93cy0xJiZsPHQtPmNvbHMtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwpIT1JTlNJREUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGwtaikqKGwtaikrKGstaSkqKGstaSk8PXJhbmdlKnJhbmdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci55ICAgICA9IChmbG9hdCkoaS1rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueCAgICAgPSAoZmxvYXQpKGotbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9IChmbG9hdCkoMS4vKFZlY3Rvckxlbmd0aChyKSpzcXJ0KChkb3VibGUpVmVjdG9yTGVuZ3RoKHIpKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ID0gKGZsb2F0KSgxLi8oMStmYWJzKENWX01BVF9FTEVNKCp0LGZsb2F0LGssbCktQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSkpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPVZlY3RvclNjYWxNdWx0KHIsZ3JhZFQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhYnMoZGlyKTw9MC4wMSkgZGlyPTAuMDAwMDAxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSAoZmxvYXQpZmFicyhkc3QqbGV2KmRpcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwrMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGssbC0xKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PShmbG9hdCkoKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxwKzEsY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLTEsY29sb3IpKSkqMi4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PShmbG9hdCkoKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxwKzEsY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLGNvbG9yKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwtMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0oZmxvYXQpKChDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxscCxjb2xvciktQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa20sbG0tMSxjb2xvcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaysxLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLTEsbCkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0oZmxvYXQpKChDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrcCsxLGxtLGNvbG9yKS1DVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbS0xLGxtLGNvbG9yKSkpKjIuMGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0oZmxvYXQpKChDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrcCsxLGxtLGNvbG9yKS1DVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxsbSxjb2xvcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsay0xLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9KGZsb2F0KSgoQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa3AsbG0sY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLTEsbG0sY29sb3IpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWEgKz0gKGZsb2F0KXcgKiAoZmxvYXQpKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLGNvbG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKeCAtPSAoZmxvYXQpdyAqIChmbG9hdCkoZ3JhZEkueCpyLngpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnkgLT0gKGZsb2F0KXcgKiAoZmxvYXQpKGdyYWRJLnkqci55KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgICs9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzYXQgPSAoZmxvYXQpKChJYS9zKyhKeCtKeSkvKHNxcnQoSngqSngrSnkqSnkpKzEuMGUtMjBmKSswLjVmKSk7CisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgaXNhdCA9IGN2Um91bmQoc2F0KTsKKyAgICAgICAgICAgICAgICAgIENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGktMSxqLTEsY29sb3IpID0gQ1ZfQ0FTVF84VShpc2F0KTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqKSA9IEJBTkQ7CisgICAgICAgICAgICAgICBIZWFwLT5QdXNoKGksaixkaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgfSBlbHNlIGlmIChDVl9NQVRfQ04ob3V0LT50eXBlKT09MSkgeworCisgICAgICB3aGlsZSAoSGVhcC0+UG9wKCZpaSwmamopKSB7CisKKyAgICAgICAgIENWX01BVF9FTEVNKCpmLHVjaGFyLGlpLGpqKSA9IEtOT1dOOworICAgICAgICAgZm9yKHE9MDsgcTw0OyBxKyspIHsKKyAgICAgICAgICAgIGlmICAgICAocT09MCkge2k9aWktMTsgaj1qajt9CisgICAgICAgICAgICBlbHNlIGlmKHE9PTEpIHtpPWlpOyAgIGo9amotMTt9CisgICAgICAgICAgICBlbHNlIGlmKHE9PTIpIHtpPWlpKzE7IGo9amo7fQorICAgICAgICAgICAgZWxzZSBpZihxPT0zKSB7aT1paTsgICBqPWpqKzE7fQorICAgICAgICAgICAgaWYgKChpPD0xKXx8KGo8PTEpfHwoaT50LT5yb3dzLTEpfHwoaj50LT5jb2xzLTEpKSBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGksaik9PUlOU0lERSkgeworICAgICAgICAgICAgICAgZGlzdCA9IG1pbjQoRmFzdE1hcmNoaW5nX3NvbHZlKGktMSxqLGksai0xLGYsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWFyY2hpbmdfc29sdmUoaSsxLGosaSxqLTEsZix0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXJjaGluZ19zb2x2ZShpLTEsaixpLGorMSxmLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hcmNoaW5nX3NvbHZlKGkrMSxqLGksaisxLGYsdCkpOworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSA9IGRpc3Q7CisKKyAgICAgICAgICAgICAgIGZvciAoY29sb3I9MDsgY29sb3I8PTA7IGNvbG9yKyspIHsKKyAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBncmFkSSxncmFkVCxyOworICAgICAgICAgICAgICAgICAgZmxvYXQgSWE9MCxKeD0wLEp5PTAscz0xLjBlLTIwZix3LGRzdCxsZXYsZGlyLHNhdDsKKworICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGksaisxKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqLTEpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULng9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKzEpLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksai0xKSkpKjAuNWY7CisgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZFQueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGorMSktQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKSkpOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGotMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZFQueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGopLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksai0xKSkpOworICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULng9MDsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpKzEsaikhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGktMSxqKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncmFkVC55PShmbG9hdCkoKENWX01BVF9FTEVNKCp0LGZsb2F0LGkrMSxqKS1DVl9NQVRfRUxFTSgqdCxmbG9hdCxpLTEsaikpKSowLjVmOworICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSsxLGopLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksaikpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaS0xLGopIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRULnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKnQsZmxvYXQsaSxqKS1DVl9NQVRfRUxFTSgqdCxmbG9hdCxpLTEsaikpKTsKKyAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBncmFkVC55PTA7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBmb3IgKGs9aS1yYW5nZTsgazw9aStyYW5nZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQga209ay0xKyhrPT0xKSxrcD1rLTEtKGs9PXQtPnJvd3MtMik7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGw9ai1yYW5nZTsgbDw9aityYW5nZTsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG09bC0xKyhsPT0xKSxscD1sLTEtKGw9PXQtPmNvbHMtMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaz4wJiZsPjAmJms8dC0+cm93cy0xJiZsPHQtPmNvbHMtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwpIT1JTlNJREUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGwtaikqKGwtaikrKGstaSkqKGstaSk8PXJhbmdlKnJhbmdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci55ICAgICA9IChmbG9hdCkoaS1rKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueCAgICAgPSAoZmxvYXQpKGotbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9IChmbG9hdCkoMS4vKFZlY3Rvckxlbmd0aChyKSpzcXJ0KFZlY3Rvckxlbmd0aChyKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldiA9IChmbG9hdCkoMS4vKDErZmFicyhDVl9NQVRfRUxFTSgqdCxmbG9hdCxrLGwpLUNWX01BVF9FTEVNKCp0LGZsb2F0LGksaikpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj1WZWN0b3JTY2FsTXVsdChyLGdyYWRUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWJzKGRpcik8PTAuMDEpIGRpcj0wLjAwMDAwMWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gKGZsb2F0KWZhYnMoZHN0KmxldipkaXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsayxsKzEpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwtMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxwKzEpLUNWX01BVF9FTEVNKCpvdXQsdWNoYXIsa20sbG0tMSkpKSoyLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLng9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbSxscCsxKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxtKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwtMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0oZmxvYXQpKChDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxwKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxtLTEpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGsrMSxsKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsay0xLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrcCsxLGxtKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLTEsbG0pKSkqMi4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS55PShmbG9hdCkoKENWX01BVF9FTEVNKCpvdXQsdWNoYXIsa3ArMSxsbSktQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbSxsbSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsay0xLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9KGZsb2F0KSgoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrcCxsbSktQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbS0xLGxtKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElhICs9IChmbG9hdCl3ICogKGZsb2F0KShDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKeCAtPSAoZmxvYXQpdyAqIChmbG9hdCkoZ3JhZEkueCpyLngpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSnkgLT0gKGZsb2F0KXcgKiAoZmxvYXQpKGdyYWRJLnkqci55KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgICs9IHc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICBzYXQgPSAoZmxvYXQpKChJYS9zKyhKeCtKeSkvKHNxcnQoSngqSngrSnkqSnkpKzEuMGUtMjBmKSswLjVmKSk7CisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBpbnQgaXNhdCA9IGN2Um91bmQoc2F0KTsKKyAgICAgICAgICAgICAgICAgIENWX01BVF9FTEVNKCpvdXQsdWNoYXIsaS0xLGotMSkgPSBDVl9DQVNUXzhVKGlzYXQpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGopID0gQkFORDsKKyAgICAgICAgICAgICAgIEhlYXAtPlB1c2goaSxqLGRpc3QpOworICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgfQorICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZOU0lucGFpbnRGTU0oY29uc3QgQ3ZNYXQgKmYsIEN2TWF0ICp0LCBDdk1hdCAqb3V0LCBpbnQgcmFuZ2UsIEN2UHJpb3JpdHlRdWV1ZUZsb2F0ICpIZWFwKSB7CisgICBpbnQgaSA9IDAsIGogPSAwLCBpaSA9IDAsIGpqID0gMCwgaywgbCwgcSwgY29sb3IgPSAwOworICAgZmxvYXQgZGlzdDsKKworICAgaWYgKENWX01BVF9DTihvdXQtPnR5cGUpPT0zKSB7CisKKyAgICAgIHdoaWxlIChIZWFwLT5Qb3AoJmlpLCZqaikpIHsKKworICAgICAgICAgQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaWksamopID0gS05PV047CisgICAgICAgICBmb3IocT0wOyBxPDQ7IHErKykgeworICAgICAgICAgICAgaWYgICAgIChxPT0wKSB7aT1paS0xOyBqPWpqO30KKyAgICAgICAgICAgIGVsc2UgaWYocT09MSkge2k9aWk7ICAgaj1qai0xO30KKyAgICAgICAgICAgIGVsc2UgaWYocT09Mikge2k9aWkrMTsgaj1qajt9CisgICAgICAgICAgICBlbHNlIGlmKHE9PTMpIHtpPWlpOyAgIGo9amorMTt9CisgICAgICAgICAgICBpZiAoKGk8PTEpfHwoajw9MSl8fChpPnQtPnJvd3MtMSl8fChqPnQtPmNvbHMtMSkpIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqKT09SU5TSURFKSB7CisgICAgICAgICAgICAgICBkaXN0ID0gbWluNChGYXN0TWFyY2hpbmdfc29sdmUoaS0xLGosaSxqLTEsZix0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXJjaGluZ19zb2x2ZShpKzEsaixpLGotMSxmLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hcmNoaW5nX3NvbHZlKGktMSxqLGksaisxLGYsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWFyY2hpbmdfc29sdmUoaSsxLGosaSxqKzEsZix0KSk7CisgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSgqdCxmbG9hdCxpLGopID0gZGlzdDsKKworICAgICAgICAgICAgICAgZm9yIChjb2xvcj0wOyBjb2xvcjw9MjsgY29sb3IrKykgeworICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIGdyYWRJLHI7CisgICAgICAgICAgICAgICAgICBmbG9hdCBJYT0wLHM9MS4wZS0yMGYsdyxkc3QsZGlyOworCisgICAgICAgICAgICAgICAgICBmb3IgKGs9aS1yYW5nZTsgazw9aStyYW5nZTsgaysrKSB7CisgICAgICAgICAgICAgICAgICAgICBpbnQga209ay0xKyhrPT0xKSxrcD1rLTEtKGs9PWYtPnJvd3MtMik7CisgICAgICAgICAgICAgICAgICAgICBmb3IgKGw9ai1yYW5nZTsgbDw9aityYW5nZTsgbCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG09bC0xKyhsPT0xKSxscD1sLTEtKGw9PWYtPmNvbHMtMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaz4wJiZsPjAmJms8Zi0+cm93cy0xJiZsPGYtPmNvbHMtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwpIT1JTlNJREUpJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGwtaikqKGwtaikrKGstaSkqKGstaSk8PXJhbmdlKnJhbmdlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci55PShmbG9hdCkoay1pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIueD0oZmxvYXQpKGwtaik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCA9IDEvKFZlY3Rvckxlbmd0aChyKSpWZWN0b3JMZW5ndGgocikrMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrKzEsbCkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGstMSxsKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PShmbG9hdCkoYWJzKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGtwKzEsbG0sY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGtwLGxtLGNvbG9yKSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGtwLGxtLGNvbG9yKS1DVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbS0xLGxtLGNvbG9yKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLng9KGZsb2F0KShhYnMoQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa3ArMSxsbSxjb2xvciktQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa3AsbG0sY29sb3IpKSkqMi4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsay0xLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLng9KGZsb2F0KShhYnMoQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa3AsbG0sY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLTEsbG0sY29sb3IpKSkqMi4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsayxsKzEpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwtMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0oZmxvYXQpKGFicyhDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxscCsxLGNvbG9yKS1DVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxsbSxjb2xvcikpKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyhDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxsbSxjb2xvciktQ1ZfTUFUXzNDT0xPUl9FTEVNKCpvdXQsdWNoYXIsa20sbG0tMSxjb2xvcikpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS55PShmbG9hdCkoYWJzKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxwKzEsY29sb3IpLUNWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLGNvbG9yKSkpKjIuMGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGssbC0xKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS55PShmbG9hdCkoYWJzKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLGNvbG9yKS1DVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixrbSxsbS0xLGNvbG9yKSkpKjIuMGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PS1ncmFkSS54OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPVZlY3RvclNjYWxNdWx0KHIsZ3JhZEkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFicyhkaXIpPD0wLjAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI9MC4wMDAwMDFmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IChmbG9hdClmYWJzKFZlY3RvclNjYWxNdWx0KHIsZ3JhZEkpL3NxcnQoVmVjdG9yTGVuZ3RoKHIpKlZlY3Rvckxlbmd0aChncmFkSSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgPSBkc3QqZGlyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWEgKz0gKGZsb2F0KXcgKiAoZmxvYXQpKENWX01BVF8zQ09MT1JfRUxFTSgqb3V0LHVjaGFyLGttLGxtLGNvbG9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICArPSB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IG91dF92YWwgPSBjdlJvdW5kKChkb3VibGUpSWEvcyk7CisgICAgICAgICAgICAgICAgICBDVl9NQVRfM0NPTE9SX0VMRU0oKm91dCx1Y2hhcixpLTEsai0xLGNvbG9yKSA9IENWX0NBU1RfOFUob3V0X3ZhbCk7CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgIENWX01BVF9FTEVNKCpmLHVjaGFyLGksaikgPSBCQU5EOworICAgICAgICAgICAgICAgSGVhcC0+UHVzaChpLGosZGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgICB9CisgICAgICB9CisKKyAgIH0gZWxzZSBpZiAoQ1ZfTUFUX0NOKG91dC0+dHlwZSk9PTEpIHsKKworICAgICAgd2hpbGUgKEhlYXAtPlBvcCgmaWksJmpqKSkgeworCisgICAgICAgICBDVl9NQVRfRUxFTSgqZix1Y2hhcixpaSxqaikgPSBLTk9XTjsKKyAgICAgICAgIGZvcihxPTA7IHE8NDsgcSsrKSB7CisgICAgICAgICAgICBpZiAgICAgKHE9PTApIHtpPWlpLTE7IGo9amo7fQorICAgICAgICAgICAgZWxzZSBpZihxPT0xKSB7aT1paTsgICBqPWpqLTE7fQorICAgICAgICAgICAgZWxzZSBpZihxPT0yKSB7aT1paSsxOyBqPWpqO30KKyAgICAgICAgICAgIGVsc2UgaWYocT09Mykge2k9aWk7ICAgaj1qaisxO30KKyAgICAgICAgICAgIGlmICgoaTw9MSl8fChqPD0xKXx8KGk+dC0+cm93cy0xKXx8KGo+dC0+Y29scy0xKSkgY29udGludWU7CisKKyAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixpLGopPT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgIGRpc3QgPSBtaW40KEZhc3RNYXJjaGluZ19zb2x2ZShpLTEsaixpLGotMSxmLHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hcmNoaW5nX3NvbHZlKGkrMSxqLGksai0xLGYsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBGYXN0TWFyY2hpbmdfc29sdmUoaS0xLGosaSxqKzEsZix0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXJjaGluZ19zb2x2ZShpKzEsaixpLGorMSxmLHQpKTsKKyAgICAgICAgICAgICAgIENWX01BVF9FTEVNKCp0LGZsb2F0LGksaikgPSBkaXN0OworCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgZ3JhZEkscjsKKyAgICAgICAgICAgICAgICAgIGZsb2F0IElhPTAscz0xLjBlLTIwZix3LGRzdCxkaXI7CisKKyAgICAgICAgICAgICAgICAgIGZvciAoaz1pLXJhbmdlOyBrPD1pK3JhbmdlOyBrKyspIHsKKyAgICAgICAgICAgICAgICAgICAgIGludCBrbT1rLTErKGs9PTEpLGtwPWstMS0oaz09dC0+cm93cy0yKTsKKyAgICAgICAgICAgICAgICAgICAgIGZvciAobD1qLXJhbmdlOyBsPD1qK3JhbmdlOyBsKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsbT1sLTErKGw9PTEpLGxwPWwtMS0obD09dC0+Y29scy0yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrPjAmJmw+MCYmazx0LT5yb3dzLTEmJmw8dC0+Y29scy0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKENWX01BVF9FTEVNKCpmLHVjaGFyLGssbCkhPUlOU0lERSkmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobC1qKSoobC1qKSsoay1pKSooay1pKTw9cmFuZ2UqcmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnk9KGZsb2F0KShpLWspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci54PShmbG9hdCkoai1sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ID0gMS8oVmVjdG9yTGVuZ3RoKHIpKlZlY3Rvckxlbmd0aChyKSsxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGsrMSxsKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsay0xLGwpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLng9KGZsb2F0KShhYnMoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrcCsxLGxtKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGtwLGxtKSkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKENWX01BVF9FTEVNKCpvdXQsdWNoYXIsa3AsbG0pLUNWX01BVF9FTEVNKCpvdXQsdWNoYXIsa20tMSxsbSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PShmbG9hdCkoYWJzKENWX01BVF9FTEVNKCpvdXQsdWNoYXIsa3ArMSxsbSktQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrcCxsbSkpKSoyLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLTEsbCkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0oZmxvYXQpKGFicyhDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGtwLGxtKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLTEsbG0pKSkqMi4wZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS54PTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsayxsKzEpIT1JTlNJREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDVl9NQVRfRUxFTSgqZix1Y2hhcixrLGwtMSkhPUlOU0lERSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueT0oZmxvYXQpKGFicyhDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxwKzEpLUNWX01BVF9FTEVNKCpvdXQsdWNoYXIsa20sbG0pKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbSxsbSktQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbSxsbS0xKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9KGZsb2F0KShhYnMoQ1ZfTUFUX0VMRU0oKm91dCx1Y2hhcixrbSxscCsxKS1DVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxtKSkpKjIuMGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENWX01BVF9FTEVNKCpmLHVjaGFyLGssbC0xKSE9SU5TSURFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkSS55PShmbG9hdCkoYWJzKENWX01BVF9FTEVNKCpvdXQsdWNoYXIsa20sbG0pLUNWX01BVF9FTEVNKCpvdXQsdWNoYXIsa20sbG0tMSkpKSoyLjBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRJLnk9MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZEkueD0tZ3JhZEkueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcj1WZWN0b3JTY2FsTXVsdChyLGdyYWRJKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZhYnMoZGlyKTw9MC4wMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyPTAuMDAwMDAxZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXIgPSAoZmxvYXQpZmFicyhWZWN0b3JTY2FsTXVsdChyLGdyYWRJKS9zcXJ0KFZlY3Rvckxlbmd0aChyKSpWZWN0b3JMZW5ndGgoZ3JhZEkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ID0gZHN0KmRpcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElhICs9IChmbG9hdCl3ICogKGZsb2F0KShDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGttLGxtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICArPSB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgaW50IG91dF92YWwgPSBjdlJvdW5kKChkb3VibGUpSWEvcyk7CisgICAgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSgqb3V0LHVjaGFyLGktMSxqLTEpID0gQ1ZfQ0FTVF84VShvdXRfdmFsKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKmYsdWNoYXIsaSxqKSA9IEJBTkQ7CisgICAgICAgICAgICAgICBIZWFwLT5QdXNoKGksaixkaXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgIH0KKworICAgfQorfQorCisjZGVmaW5lIFNFVF9CT1JERVIxX0MxKGltYWdlLHR5cGUsdmFsdWUpIHtcCisgICAgICBpbnQgaSxqO1wKKyAgICAgIGZvcihqPTA7IGo8aW1hZ2UtPmNvbHM7IGorKykge1wKKyAgICAgICAgIENWX01BVF9FTEVNKCppbWFnZSx0eXBlLDAsaikgPSB2YWx1ZTtcCisgICAgICB9XAorICAgICAgZm9yIChpPTE7IGk8aW1hZ2UtPnJvd3MtMTsgaSsrKSB7XAorICAgICAgICAgQ1ZfTUFUX0VMRU0oKmltYWdlLHR5cGUsaSwwKSA9IENWX01BVF9FTEVNKCppbWFnZSx0eXBlLGksaW1hZ2UtPmNvbHMtMSkgPSB2YWx1ZTtcCisgICAgICB9XAorICAgICAgZm9yKGo9MDsgajxpbWFnZS0+Y29sczsgaisrKSB7XAorICAgICAgICAgQ1ZfTUFUX0VMRU0oKmltYWdlLHR5cGUsZXJvd3MtMSxqKSA9IHZhbHVlO1wKKyAgICAgIH1cCisgICB9CisKKyNkZWZpbmUgQ09QWV9NQVNLX0JPUkRFUjFfQzEoc3JjLGRzdCx0eXBlKSB7XAorICAgICAgaW50IGksajtcCisgICAgICBmb3IgKGk9MDsgaTxzcmMtPnJvd3M7IGkrKykge1wKKyAgICAgICAgIGZvcihqPTA7IGo8c3JjLT5jb2xzOyBqKyspIHtcCisgICAgICAgICAgICBpZiAoQ1ZfTUFUX0VMRU0oKnNyYyx0eXBlLGksaikhPTApXAorICAgICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKmRzdCx0eXBlLGkrMSxqKzEpID0gSU5TSURFO1wKKyAgICAgICAgIH1cCisgICAgICB9XAorICAgfQorCisKK0NWX0lNUEwgdm9pZAorY3ZJbnBhaW50KCBjb25zdCBDdkFyciogX2lucHV0X2ltZywgY29uc3QgQ3ZBcnIqIF9pbnBhaW50X21hc2ssIEN2QXJyKiBfb3V0cHV0X2ltZywKKyAgICAgICAgICAgZG91YmxlIGlucGFpbnRSYW5nZSwgaW50IGZsYWdzICkKK3sKKyAgICBDdk1hdCAqbWFzayA9IDAsICpiYW5kID0gMCwgKmYgPSAwLCAqdCA9IDAsICpvdXQgPSAwOworICAgIEN2UHJpb3JpdHlRdWV1ZUZsb2F0ICpIZWFwID0gMCwgKk91dCA9IDA7CisgICAgSXBsQ29udktlcm5lbCAqZWxfY3Jvc3MgPSAwLCAqZWxfcmFuZ2UgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZJbnBhaW50IiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IGlucHV0X2hkciwgbWFza19oZHIsIG91dHB1dF9oZHI7CisgICAgQ3ZNYXQqIGlucHV0X2ltZywgKmlucGFpbnRfbWFzaywgKm91dHB1dF9pbWc7CisgICAgaW50IHJhbmdlPWN2Um91bmQoaW5wYWludFJhbmdlKTsgICAgCisgICAgaW50IGVyb3dzLCBlY29sczsKKworICAgIENWX0NBTEwoIGlucHV0X2ltZyA9IGN2R2V0TWF0KCBfaW5wdXRfaW1nLCAmaW5wdXRfaGRyICkpOworICAgIENWX0NBTEwoIGlucGFpbnRfbWFzayA9IGN2R2V0TWF0KCBfaW5wYWludF9tYXNrLCAmbWFza19oZHIgKSk7CisgICAgQ1ZfQ0FMTCggb3V0cHV0X2ltZyA9IGN2R2V0TWF0KCBfb3V0cHV0X2ltZywgJm91dHB1dF9oZHIgKSk7CisgICAgCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoaW5wdXRfaW1nLG91dHB1dF9pbWcpIHx8ICFDVl9BUkVfU0laRVNfRVEoaW5wdXRfaW1nLGlucGFpbnRfbWFzaykpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIkFsbCB0aGUgaW5wdXQgYW5kIG91dHB1dCBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUiICk7CisgICAgCisgICAgaWYoIChDVl9NQVRfVFlQRShpbnB1dF9pbWctPnR5cGUpICE9IENWXzhVQzEgJiYKKyAgICAgICAgQ1ZfTUFUX1RZUEUoaW5wdXRfaW1nLT50eXBlKSAhPSBDVl84VUMzKSB8fAorICAgICAgICAhQ1ZfQVJFX1RZUEVTX0VRKGlucHV0X2ltZyxvdXRwdXRfaW1nKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIk9ubHkgOC1iaXQgMS1jaGFubmVsIGFuZCAzLWNoYW5uZWwgaW5wdXQvb3V0cHV0IGltYWdlcyBhcmUgc3VwcG9ydGVkIiApOworCisgICAgaWYoIENWX01BVF9UWVBFKGlucGFpbnRfbWFzay0+dHlwZSkgIT0gQ1ZfOFVDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBtYXNrIG11c3QgYmUgOC1iaXQgMS1jaGFubmVsIGltYWdlIiApOworCisgICAgcmFuZ2UgPSBNQVgocmFuZ2UsMSk7CisgICAgcmFuZ2UgPSBNSU4ocmFuZ2UsMTAwKTsKKworICAgIGVjb2xzID0gaW5wdXRfaW1nLT5jb2xzICsgMjsKKyAgICBlcm93cyA9IGlucHV0X2ltZy0+cm93cyArIDI7CisKKyAgICBDVl9DQUxMKCBmID0gY3ZDcmVhdGVNYXQoZXJvd3MsIGVjb2xzLCBDVl84VUMxKSk7CisgICAgQ1ZfQ0FMTCggdCA9IGN2Q3JlYXRlTWF0KGVyb3dzLCBlY29scywgQ1ZfMzJGQzEpKTsKKyAgICBDVl9DQUxMKCBiYW5kID0gY3ZDcmVhdGVNYXQoZXJvd3MsIGVjb2xzLCBDVl84VUMxKSk7CisgICAgQ1ZfQ0FMTCggbWFzayA9IGN2Q3JlYXRlTWF0KGVyb3dzLCBlY29scywgQ1ZfOFVDMSkpOworICAgIENWX0NBTEwoIGVsX2Nyb3NzID0gY3ZDcmVhdGVTdHJ1Y3R1cmluZ0VsZW1lbnRFeCgzLDMsMSwxLENWX1NIQVBFX0NST1NTLE5VTEwpKTsKKyAgICAKKyAgICBjdkNvcHkoIGlucHV0X2ltZywgb3V0cHV0X2ltZyApOworICAgIGN2U2V0KG1hc2ssY3ZTY2FsYXIoS05PV04sMCwwLDApKTsKKyAgICBDT1BZX01BU0tfQk9SREVSMV9DMShpbnBhaW50X21hc2ssbWFzayx1Y2hhcik7CisgICAgU0VUX0JPUkRFUjFfQzEobWFzayx1Y2hhciwwKTsKKyAgICBjdlNldChmLGN2U2NhbGFyKEtOT1dOLDAsMCwwKSk7CisgICAgY3ZTZXQodCxjdlNjYWxhcigxLjBlNmYsMCwwLDApKTsKKyAgICBjdkRpbGF0ZShtYXNrLGJhbmQsZWxfY3Jvc3MsMSk7ICAgLy8gaW1hZ2Ugd2l0aCBuYXJyb3cgYmFuZAorICAgIEhlYXA9bmV3IEN2UHJpb3JpdHlRdWV1ZUZsb2F0OworICAgIGlmICghSGVhcC0+SW5pdChiYW5kKSkKKyAgICAgICAgRVhJVDsKKyAgICBjdlN1YihiYW5kLG1hc2ssYmFuZCxOVUxMKTsKKyAgICBTRVRfQk9SREVSMV9DMShiYW5kLHVjaGFyLDApOworICAgIGlmICghSGVhcC0+QWRkKGJhbmQpKQorICAgICAgICBFWElUOworICAgIGN2U2V0KGYsY3ZTY2FsYXIoQkFORCwwLDAsMCksYmFuZCk7CisgICAgY3ZTZXQoZixjdlNjYWxhcihJTlNJREUsMCwwLDApLG1hc2spOworICAgIGN2U2V0KHQsY3ZTY2FsYXIoMCwwLDAsMCksYmFuZCk7CisgICAgCisgICAgaWYoIGZsYWdzID09IENWX0lOUEFJTlRfVEVMRUEgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggb3V0ID0gY3ZDcmVhdGVNYXQoZXJvd3MsIGVjb2xzLCBDVl84VUMxKSk7CisgICAgICAgIENWX0NBTEwoIGVsX3JhbmdlID0gY3ZDcmVhdGVTdHJ1Y3R1cmluZ0VsZW1lbnRFeCgyKnJhbmdlKzEsMipyYW5nZSsxLAorICAgICAgICAgICAgcmFuZ2UscmFuZ2UsQ1ZfU0hBUEVfUkVDVCxOVUxMKSk7CisgICAgICAgIGN2RGlsYXRlKG1hc2ssb3V0LGVsX3JhbmdlLDEpOworICAgICAgICBjdlN1YihvdXQsbWFzayxvdXQsTlVMTCk7CisgICAgICAgIE91dD1uZXcgQ3ZQcmlvcml0eVF1ZXVlRmxvYXQ7CisgICAgICAgIGlmICghT3V0LT5Jbml0KG91dCkpCisgICAgICAgICAgICBFWElUOworICAgICAgICBpZiAoIU91dC0+QWRkKGJhbmQpKQorICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgY3ZTdWIob3V0LGJhbmQsb3V0LE5VTEwpOworICAgICAgICBTRVRfQk9SREVSMV9DMShvdXQsdWNoYXIsMCk7CisgICAgICAgIGljdkNhbGNGTU0ob3V0LHQsT3V0LHRydWUpOworICAgICAgICBpY3ZUZWxlYUlucGFpbnRGTU0obWFzayx0LG91dHB1dF9pbWcscmFuZ2UsSGVhcCk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgaWN2TlNJbnBhaW50Rk1NKG1hc2ssdCxvdXRwdXRfaW1nLHJhbmdlLEhlYXApOworICAgIAorICAgIF9fRU5EX187CisgICAgCisgICAgZGVsZXRlIE91dDsKKyAgICBkZWxldGUgSGVhcDsKKyAgICBjdlJlbGVhc2VTdHJ1Y3R1cmluZ0VsZW1lbnQoJmVsX2Nyb3NzKTsKKyAgICBjdlJlbGVhc2VTdHJ1Y3R1cmluZ0VsZW1lbnQoJmVsX3JhbmdlKTsKKyAgICBjdlJlbGVhc2VNYXQoJm91dCk7CisgICAgY3ZSZWxlYXNlTWF0KCZtYXNrKTsKKyAgICBjdlJlbGVhc2VNYXQoJmJhbmQpOworICAgIGN2UmVsZWFzZU1hdCgmdCk7CisgICAgY3ZSZWxlYXNlTWF0KCZmKTsKK30KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmthbG1hbi5jcHAgYi9jdi9zcmMvY3ZrYWxtYW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4MjIxNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZrYWxtYW4uY3BwCkBAIC0wLDAgKzEsMjQxIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKworCitDVl9JTVBMIEN2S2FsbWFuKgorY3ZDcmVhdGVLYWxtYW4oIGludCBEUCwgaW50IE1QLCBpbnQgQ1AgKQoreworICAgIEN2S2FsbWFuICprYWxtYW4gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUthbG1hbiIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggRFAgPD0gMCB8fCBNUCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJzdGF0ZSBhbmQgbWVhc3VyZW1lbnQgdmVjdG9ycyBtdXN0IGhhdmUgcG9zaXRpdmUgbnVtYmVyIG9mIGRpbWVuc2lvbnMiICk7CisKKyAgICBpZiggQ1AgPCAwICkKKyAgICAgICAgQ1AgPSBEUDsKKyAgICAKKyAgICAvKiBhbGxvY2F0aW5nIG1lbW9yeSBmb3IgdGhlIHN0cnVjdHVyZSAqLworICAgIENWX0NBTEwoIGthbG1hbiA9IChDdkthbG1hbiAqKWN2QWxsb2MoIHNpemVvZiggQ3ZLYWxtYW4gKSkpOworICAgIG1lbXNldCgga2FsbWFuLCAwLCBzaXplb2YoKmthbG1hbikpOworICAgIAorICAgIGthbG1hbi0+RFAgPSBEUDsKKyAgICBrYWxtYW4tPk1QID0gTVA7CisgICAga2FsbWFuLT5DUCA9IENQOworCisgICAgQ1ZfQ0FMTCgga2FsbWFuLT5zdGF0ZV9wcmUgPSBjdkNyZWF0ZU1hdCggRFAsIDEsIENWXzMyRkMxICkpOworICAgIGN2WmVybygga2FsbWFuLT5zdGF0ZV9wcmUgKTsKKyAgICAKKyAgICBDVl9DQUxMKCBrYWxtYW4tPnN0YXRlX3Bvc3QgPSBjdkNyZWF0ZU1hdCggRFAsIDEsIENWXzMyRkMxICkpOworICAgIGN2WmVybygga2FsbWFuLT5zdGF0ZV9wb3N0ICk7CisgICAgCisgICAgQ1ZfQ0FMTCgga2FsbWFuLT50cmFuc2l0aW9uX21hdHJpeCA9IGN2Q3JlYXRlTWF0KCBEUCwgRFAsIENWXzMyRkMxICkpOworICAgIGN2U2V0SWRlbnRpdHkoIGthbG1hbi0+dHJhbnNpdGlvbl9tYXRyaXggKTsKKworICAgIENWX0NBTEwoIGthbG1hbi0+cHJvY2Vzc19ub2lzZV9jb3YgPSBjdkNyZWF0ZU1hdCggRFAsIERQLCBDVl8zMkZDMSApKTsKKyAgICBjdlNldElkZW50aXR5KCBrYWxtYW4tPnByb2Nlc3Nfbm9pc2VfY292ICk7CisgICAgCisgICAgQ1ZfQ0FMTCgga2FsbWFuLT5tZWFzdXJlbWVudF9tYXRyaXggPSBjdkNyZWF0ZU1hdCggTVAsIERQLCBDVl8zMkZDMSApKTsKKyAgICBjdlplcm8oIGthbG1hbi0+bWVhc3VyZW1lbnRfbWF0cml4ICk7CisKKyAgICBDVl9DQUxMKCBrYWxtYW4tPm1lYXN1cmVtZW50X25vaXNlX2NvdiA9IGN2Q3JlYXRlTWF0KCBNUCwgTVAsIENWXzMyRkMxICkpOworICAgIGN2U2V0SWRlbnRpdHkoIGthbG1hbi0+bWVhc3VyZW1lbnRfbm9pc2VfY292ICk7CisKKyAgICBDVl9DQUxMKCBrYWxtYW4tPmVycm9yX2Nvdl9wcmUgPSBjdkNyZWF0ZU1hdCggRFAsIERQLCBDVl8zMkZDMSApKTsKKyAgICAKKyAgICBDVl9DQUxMKCBrYWxtYW4tPmVycm9yX2Nvdl9wb3N0ID0gY3ZDcmVhdGVNYXQoIERQLCBEUCwgQ1ZfMzJGQzEgKSk7CisgICAgY3ZaZXJvKCBrYWxtYW4tPmVycm9yX2Nvdl9wb3N0ICk7CisKKyAgICBDVl9DQUxMKCBrYWxtYW4tPmdhaW4gPSBjdkNyZWF0ZU1hdCggRFAsIE1QLCBDVl8zMkZDMSApKTsKKworICAgIGlmKCBDUCA+IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCgga2FsbWFuLT5jb250cm9sX21hdHJpeCA9IGN2Q3JlYXRlTWF0KCBEUCwgQ1AsIENWXzMyRkMxICkpOworICAgICAgICBjdlplcm8oIGthbG1hbi0+Y29udHJvbF9tYXRyaXggKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBrYWxtYW4tPnRlbXAxID0gY3ZDcmVhdGVNYXQoIERQLCBEUCwgQ1ZfMzJGQzEgKSk7CisgICAgQ1ZfQ0FMTCgga2FsbWFuLT50ZW1wMiA9IGN2Q3JlYXRlTWF0KCBNUCwgRFAsIENWXzMyRkMxICkpOworICAgIENWX0NBTEwoIGthbG1hbi0+dGVtcDMgPSBjdkNyZWF0ZU1hdCggTVAsIE1QLCBDVl8zMkZDMSApKTsKKyAgICBDVl9DQUxMKCBrYWxtYW4tPnRlbXA0ID0gY3ZDcmVhdGVNYXQoIE1QLCBEUCwgQ1ZfMzJGQzEgKSk7CisgICAgQ1ZfQ0FMTCgga2FsbWFuLT50ZW1wNSA9IGN2Q3JlYXRlTWF0KCBNUCwgMSwgQ1ZfMzJGQzEgKSk7CisKKyNpZiAxCisgICAga2FsbWFuLT5Qb3N0ZXJTdGF0ZSA9IGthbG1hbi0+c3RhdGVfcHJlLT5kYXRhLmZsOworICAgIGthbG1hbi0+UHJpb3JTdGF0ZSA9IGthbG1hbi0+c3RhdGVfcG9zdC0+ZGF0YS5mbDsKKyAgICBrYWxtYW4tPkR5bmFtTWF0ciA9IGthbG1hbi0+dHJhbnNpdGlvbl9tYXRyaXgtPmRhdGEuZmw7CisgICAga2FsbWFuLT5NZWFzdXJlbWVudE1hdHIgPSBrYWxtYW4tPm1lYXN1cmVtZW50X21hdHJpeC0+ZGF0YS5mbDsKKyAgICBrYWxtYW4tPk1OQ292YXJpYW5jZSA9IGthbG1hbi0+bWVhc3VyZW1lbnRfbm9pc2VfY292LT5kYXRhLmZsOworICAgIGthbG1hbi0+UE5Db3ZhcmlhbmNlID0ga2FsbWFuLT5wcm9jZXNzX25vaXNlX2Nvdi0+ZGF0YS5mbDsKKyAgICBrYWxtYW4tPkthbG1HYWluTWF0ciA9IGthbG1hbi0+Z2Fpbi0+ZGF0YS5mbDsKKyAgICBrYWxtYW4tPlByaW9yRXJyb3JDb3ZhcmlhbmNlID0ga2FsbWFuLT5lcnJvcl9jb3ZfcHJlLT5kYXRhLmZsOworICAgIGthbG1hbi0+UG9zdGVyRXJyb3JDb3ZhcmlhbmNlID0ga2FsbWFuLT5lcnJvcl9jb3ZfcG9zdC0+ZGF0YS5mbDsKKyNlbmRpZiAgICAKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdlJlbGVhc2VLYWxtYW4oICZrYWxtYW4gKTsKKworICAgIHJldHVybiBrYWxtYW47Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlJlbGVhc2VLYWxtYW4oIEN2S2FsbWFuKiogX2thbG1hbiApCit7CisgICAgQ3ZLYWxtYW4gKmthbG1hbjsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlS2FsbWFuIiApOworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpZiggIV9rYWxtYW4gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICAKKyAgICBrYWxtYW4gPSAqX2thbG1hbjsKKyAgICAKKyAgICAvKiBmcmVlaW5nIHRoZSBtZW1vcnkgKi8KKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPnN0YXRlX3ByZSApOworICAgIGN2UmVsZWFzZU1hdCggJmthbG1hbi0+c3RhdGVfcG9zdCApOworICAgIGN2UmVsZWFzZU1hdCggJmthbG1hbi0+dHJhbnNpdGlvbl9tYXRyaXggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPmNvbnRyb2xfbWF0cml4ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAma2FsbWFuLT5tZWFzdXJlbWVudF9tYXRyaXggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPnByb2Nlc3Nfbm9pc2VfY292ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAma2FsbWFuLT5tZWFzdXJlbWVudF9ub2lzZV9jb3YgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPmVycm9yX2Nvdl9wcmUgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPmdhaW4gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPmVycm9yX2Nvdl9wb3N0ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAma2FsbWFuLT50ZW1wMSApOworICAgIGN2UmVsZWFzZU1hdCggJmthbG1hbi0+dGVtcDIgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZrYWxtYW4tPnRlbXAzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAma2FsbWFuLT50ZW1wNCApOworICAgIGN2UmVsZWFzZU1hdCggJmthbG1hbi0+dGVtcDUgKTsKKworICAgIG1lbXNldCgga2FsbWFuLCAwLCBzaXplb2YoKmthbG1hbikpOworCisgICAgLyogZGVhbGxvY2F0aW5nIHRoZSBzdHJ1Y3R1cmUgKi8KKyAgICBjdkZyZWUoIF9rYWxtYW4gKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCBjb25zdCBDdk1hdCoKK2N2S2FsbWFuUHJlZGljdCggQ3ZLYWxtYW4qIGthbG1hbiwgY29uc3QgQ3ZNYXQqIGNvbnRyb2wgKQoreworICAgIEN2TWF0KiByZXN1bHQgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZLYWxtYW5QcmVkaWN0IiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCAha2FsbWFuICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICAvKiB1cGRhdGUgdGhlIHN0YXRlICovCisgICAgLyogeCcoaykgPSBBKngoaykgKi8KKyAgICBDVl9DQUxMKCBjdk1hdE11bEFkZCgga2FsbWFuLT50cmFuc2l0aW9uX21hdHJpeCwga2FsbWFuLT5zdGF0ZV9wb3N0LCAwLCBrYWxtYW4tPnN0YXRlX3ByZSApKTsKKworICAgIGlmKCBjb250cm9sICYmIGthbG1hbi0+Q1AgPiAwICkKKyAgICAgICAgLyogeCcoaykgPSB4JyhrKSArIEIqdShrKSAqLworICAgICAgICBDVl9DQUxMKCBjdk1hdE11bEFkZCgga2FsbWFuLT5jb250cm9sX21hdHJpeCwgY29udHJvbCwga2FsbWFuLT5zdGF0ZV9wcmUsIGthbG1hbi0+c3RhdGVfcHJlICkpOworICAgIAorICAgIC8qIHVwZGF0ZSBlcnJvciBjb3ZhcmlhbmNlIG1hdHJpY2VzICovCisgICAgLyogdGVtcDEgPSBBKlAoaykgKi8KKyAgICBDVl9DQUxMKCBjdk1hdE11bEFkZCgga2FsbWFuLT50cmFuc2l0aW9uX21hdHJpeCwga2FsbWFuLT5lcnJvcl9jb3ZfcG9zdCwgMCwga2FsbWFuLT50ZW1wMSApKTsKKyAgICAKKyAgICAvKiBQJyhrKSA9IHRlbXAxKkF0ICsgUSAqLworICAgIENWX0NBTEwoIGN2R0VNTSgga2FsbWFuLT50ZW1wMSwga2FsbWFuLT50cmFuc2l0aW9uX21hdHJpeCwgMSwga2FsbWFuLT5wcm9jZXNzX25vaXNlX2NvdiwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGthbG1hbi0+ZXJyb3JfY292X3ByZSwgQ1ZfR0VNTV9CX1QgKSk7CisKKyAgICByZXN1bHQgPSBrYWxtYW4tPnN0YXRlX3ByZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0NWX0lNUEwgY29uc3QgQ3ZNYXQqCitjdkthbG1hbkNvcnJlY3QoIEN2S2FsbWFuKiBrYWxtYW4sIGNvbnN0IEN2TWF0KiBtZWFzdXJlbWVudCApCit7CisgICAgQ3ZNYXQqIHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2S2FsbWFuQ29ycmVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpZiggIWthbG1hbiB8fCAhbWVhc3VyZW1lbnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIC8qIHRlbXAyID0gSCpQJyhrKSAqLworICAgIENWX0NBTEwoIGN2TWF0TXVsQWRkKCBrYWxtYW4tPm1lYXN1cmVtZW50X21hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAga2FsbWFuLT5lcnJvcl9jb3ZfcHJlLCAwLCBrYWxtYW4tPnRlbXAyICkpOworICAgIC8qIHRlbXAzID0gdGVtcDIqSHQgKyBSICovCisgICAgQ1ZfQ0FMTCggY3ZHRU1NKCBrYWxtYW4tPnRlbXAyLCBrYWxtYW4tPm1lYXN1cmVtZW50X21hdHJpeCwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGthbG1hbi0+bWVhc3VyZW1lbnRfbm9pc2VfY292LCAxLCBrYWxtYW4tPnRlbXAzLCBDVl9HRU1NX0JfVCApKTsKKworICAgIC8qIHRlbXA0ID0gaW52KHRlbXAzKSp0ZW1wMiA9IEt0KGspICovCisgICAgQ1ZfQ0FMTCggY3ZTb2x2ZSgga2FsbWFuLT50ZW1wMywga2FsbWFuLT50ZW1wMiwga2FsbWFuLT50ZW1wNCwgQ1ZfU1ZEICkpOworCisgICAgLyogSyhrKSAqLworICAgIENWX0NBTEwoIGN2VHJhbnNwb3NlKCBrYWxtYW4tPnRlbXA0LCBrYWxtYW4tPmdhaW4gKSk7CisgICAgCisgICAgLyogdGVtcDUgPSB6KGspIC0gSCp4JyhrKSAqLworICAgIENWX0NBTEwoIGN2R0VNTSgga2FsbWFuLT5tZWFzdXJlbWVudF9tYXRyaXgsIGthbG1hbi0+c3RhdGVfcHJlLCAtMSwgbWVhc3VyZW1lbnQsIDEsIGthbG1hbi0+dGVtcDUgKSk7CisKKyAgICAvKiB4KGspID0geCcoaykgKyBLKGspKnRlbXA1ICovCisgICAgQ1ZfQ0FMTCggY3ZNYXRNdWxBZGQoIGthbG1hbi0+Z2Fpbiwga2FsbWFuLT50ZW1wNSwga2FsbWFuLT5zdGF0ZV9wcmUsIGthbG1hbi0+c3RhdGVfcG9zdCApKTsKKworICAgIC8qIFAoaykgPSBQJyhrKSAtIEsoaykqdGVtcDIgKi8KKyAgICBDVl9DQUxMKCBjdkdFTU0oIGthbG1hbi0+Z2Fpbiwga2FsbWFuLT50ZW1wMiwgLTEsIGthbG1hbi0+ZXJyb3JfY292X3ByZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgIGthbG1hbi0+ZXJyb3JfY292X3Bvc3QsIDAgKSk7CisKKyAgICByZXN1bHQgPSBrYWxtYW4tPnN0YXRlX3Bvc3Q7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdmtkdHJlZS5jcHAgYi9jdi9zcmMvY3ZrZHRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDcwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZrZHRyZWUuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwOCwgWGF2aWVyIERlbGFjb3VyLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8vIDIwMDgtMDUtMTMsIFhhdmllciBEZWxhY291ciA8eGF2aWVyLmRlbGFjb3VyQGdtYWlsLmNvbT4KKworI2luY2x1ZGUgIl9jdi5oIgorCisjaWYgIWRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX0lDTCB8fCBfTVNDX1ZFUiA+PSAxNDAwCisjaW5jbHVkZSAiX2N2a2R0cmVlLmhwcCIKKworLy8gKiB3cml0ZSB1cCBzb21lIGRvY3MKKworLy8gKiByZW1vdmluZyBfX3ZhbHVldHlwZSBwYXJhbWV0ZXIgZnJvbSBDdktEVHJlZSBhbmQgdXNpbmcgdmlydHVhbHMgaW5zdGVhZCAKKy8vICogb2Ygdm9pZCogZGF0YSBoZXJlIGNvdWxkIHNpbXBsaWZ5IHRoaW5ncy4KKworc3RydWN0IEN2RmVhdHVyZVRyZWUgeworCisgIHRlbXBsYXRlIDxjbGFzcyBfX3NjYWxhcnR5cGUsIGludCBfX2N2dHlwZT4KKyAgc3RydWN0IGRlcmVmIHsKKyAgICB0eXBlZGVmIF9fc2NhbGFydHlwZSBzY2FsYXJfdHlwZTsKKyAgICB0eXBlZGVmIGRvdWJsZSBhY2N1bV90eXBlOworCisgICAgQ3ZNYXQqIG1hdDsKKyAgICBkZXJlZihDdk1hdCogX21hdCkgOiBtYXQoX21hdCkgeworICAgICAgYXNzZXJ0KENWX0VMRU1fU0laRTEoX19jdnR5cGUpID09IHNpemVvZihfX3NjYWxhcnR5cGUpKTsKKyAgICB9CisgICAgc2NhbGFyX3R5cGUgb3BlcmF0b3IoKSAoaW50IGksIGludCBqKSBjb25zdCB7CisgICAgICByZXR1cm4gKigoc2NhbGFyX3R5cGUqKShtYXQtPmRhdGEucHRyICsgaSAqIG1hdC0+c3RlcCkgKyBqKTsKKyAgICB9CisgIH07CisKKyNkZWZpbmUgZGlzcGF0Y2hfY3Z0eXBlKG1hdCwgYykgXAorICAgIHN3aXRjaCAoQ1ZfTUFUX0RFUFRIKChtYXQpLT50eXBlKSkgeyBcCisgICAgY2FzZSBDVl8zMkY6IFwKKyAgICAgIHsgdHlwZWRlZiBDdktEVHJlZTxpbnQsIGRlcmVmPGZsb2F0LCBDVl8zMkY+ID4gdHJlZV90eXBlOyBjOyBicmVhazsgfSBcCisgICAgY2FzZSBDVl82NEY6IFwKKyAgICAgIHsgdHlwZWRlZiBDdktEVHJlZTxpbnQsIGRlcmVmPGRvdWJsZSwgQ1ZfNjRGPiA+IHRyZWVfdHlwZTsgYzsgYnJlYWs7IH0gXAorICAgIGRlZmF1bHQ6IGFzc2VydCgwKTsgXAorICAgIH0KKworICBDdk1hdCogbWF0OworICB2b2lkKiBkYXRhOworCisgIHRlbXBsYXRlIDxjbGFzcyBfX3RyZWV0eXBlPgorICB2b2lkIGZpbmRfbm4oQ3ZNYXQqIGQsIGludCBrLCBpbnQgZW1heCwgQ3ZNYXQqIHJlc3VsdHMsIEN2TWF0KiBkaXN0KSB7CisgICAgX190cmVldHlwZSogdHIgPSAoX190cmVldHlwZSopIGRhdGE7CisgICAgdWNoYXIqIGRwdHIgPSBkLT5kYXRhLnB0cjsKKyAgICB1Y2hhciogcmVzdWx0c3B0ciA9IHJlc3VsdHMtPmRhdGEucHRyOworICAgIHVjaGFyKiBkaXN0cHRyID0gZGlzdC0+ZGF0YS5wdHI7CisgICAgdHlwZW5hbWUgX190cmVldHlwZTo6YmJmX25uX3BxdWV1ZSBubjsKKworICAgIGFzc2VydChkLT5jb2xzID09IHRyLT5kaW1zKCkpOworICAgIGFzc2VydChyZXN1bHRzLT5yb3dzID09IGQtPnJvd3MpOworICAgIGFzc2VydChyZXN1bHRzLT5yb3dzID09IGRpc3QtPnJvd3MpOworICAgIGFzc2VydChyZXN1bHRzLT5jb2xzID09IGspOworICAgIGFzc2VydChkaXN0LT5jb2xzID09IGspOworCisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkLT5yb3dzOyArK2opIHsKKyAgICAgIHR5cGVuYW1lIF9fdHJlZXR5cGU6OnNjYWxhcl90eXBlKiBkaiA9ICh0eXBlbmFtZSBfX3RyZWV0eXBlOjpzY2FsYXJfdHlwZSopIGRwdHI7CisKKyAgICAgIGludCogcmVzdWx0c2ogPSAoaW50KikgcmVzdWx0c3B0cjsKKyAgICAgIGRvdWJsZSogZGlzdGogPSAoZG91YmxlKikgZGlzdHB0cjsKKyAgICAgIHRyLT5maW5kX25uX2JiZihkaiwgaywgZW1heCwgbm4pOworCisgICAgICBhc3NlcnQoKGludClubi5zaXplKCkgPD0gayk7CisgICAgICBmb3IgKHVuc2lnbmVkIGludCBqID0gMDsgaiA8IG5uLnNpemUoKTsgKytqKSB7CisJKnJlc3VsdHNqKysgPSAqbm5bal0ucDsKKwkqZGlzdGorKyA9IG5uW2pdLmRpc3Q7CisgICAgICB9CisgICAgICBzdGQ6OmZpbGwocmVzdWx0c2osIHJlc3VsdHNqICsgayAtIG5uLnNpemUoKSwgLTEpOworICAgICAgc3RkOjpmaWxsKGRpc3RqLCBkaXN0aiArIGsgLSBubi5zaXplKCksIDApOworCisgICAgICBkcHRyICs9IGQtPnN0ZXA7CisgICAgICByZXN1bHRzcHRyICs9IHJlc3VsdHMtPnN0ZXA7CisgICAgICBkaXN0cHRyICs9IGRpc3QtPnN0ZXA7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIF9fdHJlZXR5cGU+CisgIGludCBmaW5kX29ydGhvX3JhbmdlKEN2TWF0KiBib3VuZHNfbWluLCBDdk1hdCogYm91bmRzX21heCwKKwkJICAgICAgIEN2TWF0KiByZXN1bHRzKSB7CisgICAgaW50IHJuID0gcmVzdWx0cy0+cm93cyAqIHJlc3VsdHMtPmNvbHM7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBpbmJvdW5kczsKKyAgICBkaXNwYXRjaF9jdnR5cGUobWF0LCAoKF9fdHJlZXR5cGUqKWRhdGEpLT4KKwkJICAgIGZpbmRfb3J0aG9fcmFuZ2UoKHR5cGVuYW1lIF9fdHJlZXR5cGU6OnNjYWxhcl90eXBlKilib3VuZHNfbWluLT5kYXRhLnB0ciwgCisJCQkJICAgICAodHlwZW5hbWUgX190cmVldHlwZTo6c2NhbGFyX3R5cGUqKWJvdW5kc19tYXgtPmRhdGEucHRyLCAKKwkJCQkgICAgIGluYm91bmRzKSk7CisgICAgc3RkOjpjb3B5KGluYm91bmRzLmJlZ2luKCksCisJICAgICAgaW5ib3VuZHMuYmVnaW4oKSArIHN0ZDo6bWluKChpbnQpaW5ib3VuZHMuc2l6ZSgpLCBybiksCisJICAgICAgKGludCopIHJlc3VsdHMtPmRhdGEucHRyKTsKKyAgICByZXR1cm4gaW5ib3VuZHMuc2l6ZSgpOworICB9CisKKyAgQ3ZGZWF0dXJlVHJlZShjb25zdCBDdkZlYXR1cmVUcmVlJiB4KTsKKyAgQ3ZGZWF0dXJlVHJlZSYgb3BlcmF0b3I9IChjb25zdCBDdkZlYXR1cmVUcmVlJiByaHMpOworcHVibGljOgorICBDdkZlYXR1cmVUcmVlKEN2TWF0KiBfbWF0KSA6IG1hdChfbWF0KSB7CisgICAgLy8gKiBhIGZsYWcgcGFyYW1ldGVyIHNob3VsZCB0ZWxsIHVzIHdoZXRoZXIKKyAgICAvLyAqIChhKSB1c2VyIGVuc3VyZXMgKm1hdCBvdXRsaXZlcyAqdGhpcyBhbmQgaXMgdW5jaGFuZ2VkLCAKKyAgICAvLyAqIChiKSB3ZSB0YWtlIHJlZmVyZW5jZSBhbmQgdXNlciBlbnN1cmVzIG1hdCBpcyB1bmNoYW5nZWQsCisgICAgLy8gKiAoYykgd2UgY29weSBkYXRhLCAoZCkgd2Ugb3duIGFuZCByZWxlYXNlIGRhdGEuCisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHRtcChtYXQtPnJvd3MpOworICAgIGZvciAodW5zaWduZWQgaW50IGogPSAwOyBqIDwgdG1wLnNpemUoKTsgKytqKQorICAgICAgdG1wW2pdID0gajsKKworICAgIGRpc3BhdGNoX2N2dHlwZShtYXQsIGRhdGEgPSBuZXcgdHJlZV90eXBlCisJCSAgICAoJnRtcFswXSwgJnRtcFswXSArIHRtcC5zaXplKCksIG1hdC0+Y29scywKKwkJICAgICB0cmVlX3R5cGU6OmRlcmVmX3R5cGUobWF0KSkpOworICB9CisgIH5DdkZlYXR1cmVUcmVlKCkgeworICAgIGRpc3BhdGNoX2N2dHlwZShtYXQsIGRlbGV0ZSAodHJlZV90eXBlKikgZGF0YSk7CisgIH0KKworICBpbnQgZGltcygpIHsKKyAgICBpbnQgZCA9IDA7CisgICAgZGlzcGF0Y2hfY3Z0eXBlKG1hdCwgZCA9ICgodHJlZV90eXBlKikgZGF0YSktPmRpbXMoKSk7CisgICAgcmV0dXJuIGQ7CisgIH0KKyAgaW50IHR5cGUoKSB7CisgICAgcmV0dXJuIG1hdC0+dHlwZTsKKyAgfQorCisgIHZvaWQgZmluZF9ubihDdk1hdCogZCwgaW50IGssIGludCBlbWF4LCBDdk1hdCogcmVzdWx0cywgQ3ZNYXQqIGRpc3QpIHsKKyAgICBhc3NlcnQoQ1ZfTUFUX1RZUEUoZC0+dHlwZSkgPT0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKSk7CisgICAgYXNzZXJ0KENWX01BVF9UWVBFKGRpc3QtPnR5cGUpID09IENWXzY0RkMxKTsKKyAgICBhc3NlcnQoQ1ZfTUFUX1RZUEUocmVzdWx0cy0+dHlwZSkgPT0gQ1ZfMzJTQzEpOworCisgICAgZGlzcGF0Y2hfY3Z0eXBlKG1hdCwgZmluZF9ubjx0cmVlX3R5cGU+CisJCSAgICAoZCwgaywgZW1heCwgcmVzdWx0cywgZGlzdCkpOworICB9CisgIGludCBmaW5kX29ydGhvX3JhbmdlKEN2TWF0KiBib3VuZHNfbWluLCBDdk1hdCogYm91bmRzX21heCwKKwkJCUN2TWF0KiByZXN1bHRzKSB7CisgICAgYXNzZXJ0KENWX01BVF9UWVBFKGJvdW5kc19taW4tPnR5cGUpID09IENWX01BVF9UWVBFKG1hdC0+dHlwZSkpOworICAgIGFzc2VydChDVl9NQVRfVFlQRShib3VuZHNfbWluLT50eXBlKSA9PSBDVl9NQVRfVFlQRShib3VuZHNfbWF4LT50eXBlKSk7CisgICAgYXNzZXJ0KGJvdW5kc19taW4tPnJvd3MgKiBib3VuZHNfbWluLT5jb2xzID09IGRpbXMoKSk7CisgICAgYXNzZXJ0KGJvdW5kc19tYXgtPnJvd3MgKiBib3VuZHNfbWF4LT5jb2xzID09IGRpbXMoKSk7CisKKyAgICBpbnQgY291bnQgPSAwOworICAgIGRpc3BhdGNoX2N2dHlwZShtYXQsIGNvdW50ID0gZmluZF9vcnRob19yYW5nZTx0cmVlX3R5cGU+CisJCSAgICAoYm91bmRzX21pbiwgYm91bmRzX21heCxyZXN1bHRzKSk7CisgICAgcmV0dXJuIGNvdW50OworICB9Cit9OworCisKKworQ3ZGZWF0dXJlVHJlZSogY3ZDcmVhdGVGZWF0dXJlVHJlZShDdk1hdCogZGVzYykgeworICBfX0JFR0lOX187CisgIENWX0ZVTkNOQU1FKCJjdkNyZWF0ZUZlYXR1cmVUcmVlIik7CisKKyAgaWYgKENWX01BVF9UWVBFKGRlc2MtPnR5cGUpICE9IENWXzMyRkMxICYmCisgICAgICBDVl9NQVRfVFlQRShkZXNjLT50eXBlKSAhPSBDVl82NEZDMSkKKyAgICBDVl9FUlJPUihDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImRlc2NyaXB0b3JzIG11c3QgYmUgZWl0aGVyIENWXzMyRkMxIG9yIENWXzY0RkMxIik7CisKKyAgcmV0dXJuIG5ldyBDdkZlYXR1cmVUcmVlKGRlc2MpOworICBfX0VORF9fOworCisgIHJldHVybiAwOworfQorCit2b2lkIGN2UmVsZWFzZUZlYXR1cmVUcmVlKEN2RmVhdHVyZVRyZWUqIHRyKSB7CisgIGRlbGV0ZSB0cjsKK30KKworLy8gZGVzYyBpcyBtIHggZCBzZXQgb2YgY2FuZGlkYXRlIHBvaW50cy4KKy8vIHJlc3VsdHMgaXMgbSB4IGsgc2V0IG9mIHJvdyBpbmRpY2VzIG9mIG1hdGNoaW5nIHBvaW50cy4KKy8vIGRpc3QgaXMgbSB4IGsgZGlzdGFuY2UgdG8gbWF0Y2hpbmcgcG9pbnRzLgordm9pZCBjdkZpbmRGZWF0dXJlcyhDdkZlYXR1cmVUcmVlKiB0ciwgQ3ZNYXQqIGRlc2MsCisJCSAgICBDdk1hdCogcmVzdWx0cywgQ3ZNYXQqIGRpc3QsIGludCBrLCBpbnQgZW1heCkgeworICBib29sIGZyZWVfZGVzYyA9IGZhbHNlOworICBpbnQgZGltcyA9IHRyLT5kaW1zKCk7CisgIGludCB0eXBlID0gdHItPnR5cGUoKTsKKworICBfX0JFR0lOX187CisgIENWX0ZVTkNOQU1FKCJjdkZpbmRGZWF0dXJlcyIpOworICAKKyAgaWYgKGRlc2MtPmNvbHMgIT0gZGltcykKKyAgICBDVl9FUlJPUihDVl9TdHNVbm1hdGNoZWRTaXplcywgImRlc2MgY29sdW1ucyBiZSBlcXVhbCBmZWF0dXJlIGRpbWVuc2lvbnMiKTsKKyAgaWYgKHJlc3VsdHMtPnJvd3MgIT0gZGVzYy0+cm93cyAmJiByZXN1bHRzLT5jb2xzICE9IGspCisgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJyZXN1bHRzIGFuZCBkZXNjIG11c3QgYmUgc2FtZSBoZWlnaHQiKTsKKyAgaWYgKGRpc3QtPnJvd3MgIT0gZGVzYy0+cm93cyAmJiBkaXN0LT5jb2xzICE9IGspCisgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJkaXN0IGFuZCBkZXNjIG11c3QgYmUgc2FtZSBoZWlnaHQiKTsKKyAgaWYgKENWX01BVF9UWVBFKHJlc3VsdHMtPnR5cGUpICE9IENWXzMyU0MxKQorICAgIENWX0VSUk9SKENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAicmVzdWx0cyBtdXN0IGJlIENWXzMyU0MxIik7CisgIGlmIChDVl9NQVRfVFlQRShkaXN0LT50eXBlKSAhPSBDVl82NEZDMSkKKyAgICBDVl9FUlJPUihDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImRpc3QgbXVzdCBiZSBDVl82NEZDMSIpOworCisgIGlmIChDVl9NQVRfVFlQRSh0eXBlKSAhPSBDVl9NQVRfVFlQRShkZXNjLT50eXBlKSkgeworICAgIEN2TWF0KiBvbGRfZGVzYyA9IGRlc2M7CisgICAgZGVzYyA9IGN2Q3JlYXRlTWF0KGRlc2MtPnJvd3MsIGRlc2MtPmNvbHMsIHR5cGUpOworICAgIGN2Q29udmVydChvbGRfZGVzYywgZGVzYyk7CisgICAgZnJlZV9kZXNjID0gdHJ1ZTsKKyAgfQorCisgIHRyLT5maW5kX25uKGRlc2MsIGssIGVtYXgsIHJlc3VsdHMsIGRpc3QpOworCisgIF9fRU5EX187CisKKyAgaWYgKGZyZWVfZGVzYykKKyAgICBjdlJlbGVhc2VNYXQoJmRlc2MpOworfQorCitpbnQgY3ZGaW5kRmVhdHVyZXNCb3hlZChDdkZlYXR1cmVUcmVlKiB0ciwKKwkJCUN2TWF0KiBib3VuZHNfbWluLCBDdk1hdCogYm91bmRzX21heCwKKwkJCUN2TWF0KiByZXN1bHRzKSB7CisgIGludCBuciA9IC0xOworICBib29sIGZyZWVfYm91bmRzID0gZmFsc2U7CisgIGludCBkaW1zID0gdHItPmRpbXMoKTsKKyAgaW50IHR5cGUgPSB0ci0+dHlwZSgpOworCisgIF9fQkVHSU5fXzsKKyAgQ1ZfRlVOQ05BTUUoImN2RmluZEZlYXR1cmVzQm94ZWQiKTsKKworICBpZiAoYm91bmRzX21pbi0+Y29scyAqIGJvdW5kc19taW4tPnJvd3MgIT0gZGltcyB8fAorICAgICAgYm91bmRzX21heC0+Y29scyAqIGJvdW5kc19tYXgtPnJvd3MgIT0gZGltcykKKyAgICBDVl9FUlJPUihDVl9TdHNVbm1hdGNoZWRTaXplcywgImJvdW5kc197bWluLG1heH0gbXVzdCAxIHggZGltcyBvciBkaW1zIHggMSIpOworICBpZiAoQ1ZfTUFUX1RZUEUoYm91bmRzX21pbi0+dHlwZSkgIT0gQ1ZfTUFUX1RZUEUoYm91bmRzX21heC0+dHlwZSkpCisgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgImJvdW5kc197bWluLG1heH0gbXVzdCBoYXZlIHNhbWUgdHlwZSIpOworICBpZiAoQ1ZfTUFUX1RZUEUocmVzdWx0cy0+dHlwZSkgIT0gQ1ZfMzJTQzEpCisgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJyZXN1bHRzIG11c3QgYmUgQ1ZfMzJTQzEiKTsKKworICBpZiAoQ1ZfTUFUX1RZUEUoYm91bmRzX21pbi0+dHlwZSkgIT0gQ1ZfTUFUX1RZUEUodHlwZSkpIHsKKyAgICBmcmVlX2JvdW5kcyA9IHRydWU7CisKKyAgICBDdk1hdCogb2xkX2JvdW5kc19taW4gPSBib3VuZHNfbWluOworICAgIGJvdW5kc19taW4gPSBjdkNyZWF0ZU1hdChib3VuZHNfbWluLT5yb3dzLCBib3VuZHNfbWluLT5jb2xzLCB0eXBlKTsKKyAgICBjdkNvbnZlcnQob2xkX2JvdW5kc19taW4sIGJvdW5kc19taW4pOworCisgICAgQ3ZNYXQqIG9sZF9ib3VuZHNfbWF4ID0gYm91bmRzX21heDsKKyAgICBib3VuZHNfbWF4ID0gY3ZDcmVhdGVNYXQoYm91bmRzX21heC0+cm93cywgYm91bmRzX21heC0+Y29scywgdHlwZSk7CisgICAgY3ZDb252ZXJ0KG9sZF9ib3VuZHNfbWF4LCBib3VuZHNfbWF4KTsKKyAgfQorCisgIG5yID0gdHItPmZpbmRfb3J0aG9fcmFuZ2UoYm91bmRzX21pbiwgYm91bmRzX21heCwgcmVzdWx0cyk7CisKKyAgX19FTkRfXzsKKyAgaWYgKGZyZWVfYm91bmRzKSB7CisgICAgY3ZSZWxlYXNlTWF0KCZib3VuZHNfbWluKTsKKyAgICBjdlJlbGVhc2VNYXQoJmJvdW5kc19tYXgpOworICB9CisKKyAgcmV0dXJuIG5yOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZsaW5lZml0LmNwcCBiL2N2L3NyYy9jdmxpbmVmaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTVjODAKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZsaW5lZml0LmNwcApAQCAtMCwwICsxLDcyNyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKK3N0YXRpYyBjb25zdCBkb3VibGUgZXBzID0gMWUtNjsKKworc3RhdGljIEN2U3RhdHVzCitpY3ZGaXRMaW5lMkRfd29kcyggQ3ZQb2ludDJEMzJmICogcG9pbnRzLCBpbnQgX2NvdW50LCBmbG9hdCAqd2VpZ2h0cywgZmxvYXQgKmxpbmUgKQoreworICAgIGRvdWJsZSB4ID0gMCwgeSA9IDAsIHgyID0gMCwgeTIgPSAwLCB4eSA9IDAsIHcgPSAwOworICAgIGRvdWJsZSBkeDIsIGR5MiwgZHh5OworICAgIGludCBpOworICAgIGludCBjb3VudCA9IF9jb3VudDsKKyAgICBmbG9hdCB0OworCisgICAgLyogQ2FsY3VsYXRpbmcgdGhlIGF2ZXJhZ2Ugb2YgeCBhbmQgeS4uLiAqLworCisgICAgaWYoIHdlaWdodHMgPT0gMCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0gcG9pbnRzW2ldLng7CisgICAgICAgICAgICB5ICs9IHBvaW50c1tpXS55OworICAgICAgICAgICAgeDIgKz0gcG9pbnRzW2ldLnggKiBwb2ludHNbaV0ueDsKKyAgICAgICAgICAgIHkyICs9IHBvaW50c1tpXS55ICogcG9pbnRzW2ldLnk7CisgICAgICAgICAgICB4eSArPSBwb2ludHNbaV0ueCAqIHBvaW50c1tpXS55OworICAgICAgICB9CisgICAgICAgIHcgPSAoZmxvYXQpIGNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkgKz0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHggKz0gd2VpZ2h0c1tpXSAqIHBvaW50c1tpXS54OworICAgICAgICAgICAgeSArPSB3ZWlnaHRzW2ldICogcG9pbnRzW2ldLnk7CisgICAgICAgICAgICB4MiArPSB3ZWlnaHRzW2ldICogcG9pbnRzW2ldLnggKiBwb2ludHNbaV0ueDsKKyAgICAgICAgICAgIHkyICs9IHdlaWdodHNbaV0gKiBwb2ludHNbaV0ueSAqIHBvaW50c1tpXS55OworICAgICAgICAgICAgeHkgKz0gd2VpZ2h0c1tpXSAqIHBvaW50c1tpXS54ICogcG9pbnRzW2ldLnk7CisgICAgICAgICAgICB3ICs9IHdlaWdodHNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICB4IC89IHc7CisgICAgeSAvPSB3OworICAgIHgyIC89IHc7CisgICAgeTIgLz0gdzsKKyAgICB4eSAvPSB3OworCisgICAgZHgyID0geDIgLSB4ICogeDsKKyAgICBkeTIgPSB5MiAtIHkgKiB5OworICAgIGR4eSA9IHh5IC0geCAqIHk7CisKKyAgICB0ID0gKGZsb2F0KSBhdGFuMiggMiAqIGR4eSwgZHgyIC0gZHkyICkgLyAyOworICAgIGxpbmVbMF0gPSAoZmxvYXQpIGNvcyggdCApOworICAgIGxpbmVbMV0gPSAoZmxvYXQpIHNpbiggdCApOworCisgICAgbGluZVsyXSA9IChmbG9hdCkgeDsKKyAgICBsaW5lWzNdID0gKGZsb2F0KSB5OworCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworc3RhdGljIEN2U3RhdHVzCitpY3ZGaXRMaW5lM0Rfd29kcyggQ3ZQb2ludDNEMzJmICogcG9pbnRzLCBpbnQgY291bnQsIGZsb2F0ICp3ZWlnaHRzLCBmbG9hdCAqbGluZSApCit7CisgICAgaW50IGk7CisgICAgZmxvYXQgdzAgPSAwOworICAgIGZsb2F0IHgwID0gMCwgeTAgPSAwLCB6MCA9IDA7CisgICAgZmxvYXQgeDIgPSAwLCB5MiA9IDAsIHoyID0gMCwgeHkgPSAwLCB5eiA9IDAsIHh6ID0gMDsKKyAgICBmbG9hdCBkeDIsIGR5MiwgZHoyLCBkeHksIGR4eiwgZHl6OworICAgIGZsb2F0ICp2OworICAgIGZsb2F0IG47CisgICAgZmxvYXQgZGV0WzldLCBldmNbOV0sIGV2bFszXTsKKworICAgIG1lbXNldCggZXZsLCAwLCAzKnNpemVvZihldmxbMF0pKTsKKyAgICBtZW1zZXQoIGV2YywgMCwgOSpzaXplb2YoZXZsWzBdKSk7CisKKyAgICBpZiggd2VpZ2h0cyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHggPSBwb2ludHNbaV0ueDsKKyAgICAgICAgICAgIGZsb2F0IHkgPSBwb2ludHNbaV0ueTsKKyAgICAgICAgICAgIGZsb2F0IHogPSBwb2ludHNbaV0uejsKKyAgICAgICAgICAgIGZsb2F0IHcgPSB3ZWlnaHRzW2ldOworCisKKyAgICAgICAgICAgIHgyICs9IHggKiB4ICogdzsKKyAgICAgICAgICAgIHh5ICs9IHggKiB5ICogdzsKKyAgICAgICAgICAgIHh6ICs9IHggKiB6ICogdzsKKyAgICAgICAgICAgIHkyICs9IHkgKiB5ICogdzsKKyAgICAgICAgICAgIHl6ICs9IHkgKiB6ICogdzsKKyAgICAgICAgICAgIHoyICs9IHogKiB6ICogdzsKKyAgICAgICAgICAgIHgwICs9IHggKiB3OworICAgICAgICAgICAgeTAgKz0geSAqIHc7CisgICAgICAgICAgICB6MCArPSB6ICogdzsKKyAgICAgICAgICAgIHcwICs9IHc7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB4ID0gcG9pbnRzW2ldLng7CisgICAgICAgICAgICBmbG9hdCB5ID0gcG9pbnRzW2ldLnk7CisgICAgICAgICAgICBmbG9hdCB6ID0gcG9pbnRzW2ldLno7CisKKyAgICAgICAgICAgIHgyICs9IHggKiB4OworICAgICAgICAgICAgeHkgKz0geCAqIHk7CisgICAgICAgICAgICB4eiArPSB4ICogejsKKyAgICAgICAgICAgIHkyICs9IHkgKiB5OworICAgICAgICAgICAgeXogKz0geSAqIHo7CisgICAgICAgICAgICB6MiArPSB6ICogejsKKyAgICAgICAgICAgIHgwICs9IHg7CisgICAgICAgICAgICB5MCArPSB5OworICAgICAgICAgICAgejAgKz0gejsKKyAgICAgICAgfQorICAgICAgICB3MCA9IChmbG9hdCkgY291bnQ7CisgICAgfQorCisgICAgeDIgLz0gdzA7CisgICAgeHkgLz0gdzA7CisgICAgeHogLz0gdzA7CisgICAgeTIgLz0gdzA7CisgICAgeXogLz0gdzA7CisgICAgejIgLz0gdzA7CisKKyAgICB4MCAvPSB3MDsKKyAgICB5MCAvPSB3MDsKKyAgICB6MCAvPSB3MDsKKworICAgIGR4MiA9IHgyIC0geDAgKiB4MDsKKyAgICBkeHkgPSB4eSAtIHgwICogeTA7CisgICAgZHh6ID0geHogLSB4MCAqIHowOworICAgIGR5MiA9IHkyIC0geTAgKiB5MDsKKyAgICBkeXogPSB5eiAtIHkwICogejA7CisgICAgZHoyID0gejIgLSB6MCAqIHowOworCisgICAgZGV0WzBdID0gZHoyICsgZHkyOworICAgIGRldFsxXSA9IC1keHk7CisgICAgZGV0WzJdID0gLWR4ejsKKyAgICBkZXRbM10gPSBkZXRbMV07CisgICAgZGV0WzRdID0gZHgyICsgZHoyOworICAgIGRldFs1XSA9IC1keXo7CisgICAgZGV0WzZdID0gZGV0WzJdOworICAgIGRldFs3XSA9IGRldFs1XTsKKyAgICBkZXRbOF0gPSBkeTIgKyBkeDI7CisKKyAgICAvKiBTZWFyY2hpbmcgZm9yIGEgZWlnZW52ZWN0b3Igb2YgZGV0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1pbmltYWwgZWlnZW52YWx1ZSAqLworI2lmIDEKKyAgICB7CisgICAgQ3ZNYXQgX2RldCA9IGN2TWF0KCAzLCAzLCBDVl8zMkYsIGRldCApOworICAgIEN2TWF0IF9ldmMgPSBjdk1hdCggMywgMywgQ1ZfMzJGLCBldmMgKTsKKyAgICBDdk1hdCBfZXZsID0gY3ZNYXQoIDMsIDEsIENWXzMyRiwgZXZsICk7CisgICAgY3ZFaWdlblZWKCAmX2RldCwgJl9ldmMsICZfZXZsLCAwICk7CisgICAgaSA9IGV2bFswXSA8IGV2bFsxXSA/IChldmxbMF0gPCBldmxbMl0gPyAwIDogMikgOiAoZXZsWzFdIDwgZXZsWzJdID8gMSA6IDIpOworICAgIH0KKyNlbHNlCisgICAgeworICAgICAgICBDdk1hdCBfZGV0ID0gY3ZNYXQoIDMsIDMsIENWXzMyRiwgZGV0ICk7CisgICAgICAgIEN2TWF0IF9ldmMgPSBjdk1hdCggMywgMywgQ1ZfMzJGLCBldmMgKTsKKyAgICAgICAgQ3ZNYXQgX2V2bCA9IGN2TWF0KCAxLCAzLCBDVl8zMkYsIGV2bCApOworCisgICAgICAgIGN2U1ZEKCAmX2RldCwgJl9ldmwsICZfZXZjLCAwLCBDVl9TVkRfTU9ESUZZX0ErQ1ZfU1ZEX1VfVCApOworICAgIH0KKyAgICBpID0gMjsKKyNlbmRpZgorICAgIHYgPSAmZXZjW2kgKiAzXTsKKyAgICBuID0gKGZsb2F0KSBzcXJ0KCAoZG91YmxlKXZbMF0gKiB2WzBdICsgKGRvdWJsZSl2WzFdICogdlsxXSArIChkb3VibGUpdlsyXSAqIHZbMl0gKTsKKyAgICBuID0gKGZsb2F0KU1BWChuLCBlcHMpOworICAgIGxpbmVbMF0gPSB2WzBdIC8gbjsKKyAgICBsaW5lWzFdID0gdlsxXSAvIG47CisgICAgbGluZVsyXSA9IHZbMl0gLyBuOworICAgIGxpbmVbM10gPSB4MDsKKyAgICBsaW5lWzRdID0geTA7CisgICAgbGluZVs1XSA9IHowOworCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworc3RhdGljIGRvdWJsZQoraWN2Q2FsY0Rpc3QyRCggQ3ZQb2ludDJEMzJmICogcG9pbnRzLCBpbnQgY291bnQsIGZsb2F0ICpfbGluZSwgZmxvYXQgKmRpc3QgKQoreworICAgIGludCBqOworICAgIGZsb2F0IHB4ID0gX2xpbmVbMl0sIHB5ID0gX2xpbmVbM107CisgICAgZmxvYXQgbnggPSBfbGluZVsxXSwgbnkgPSAtX2xpbmVbMF07CisgICAgZG91YmxlIHN1bV9kaXN0ID0gMC47CisKKyAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgeworICAgICAgICBmbG9hdCB4LCB5OworCisgICAgICAgIHggPSBwb2ludHNbal0ueCAtIHB4OworICAgICAgICB5ID0gcG9pbnRzW2pdLnkgLSBweTsKKworICAgICAgICBkaXN0W2pdID0gKGZsb2F0KSBmYWJzKCBueCAqIHggKyBueSAqIHkgKTsKKyAgICAgICAgc3VtX2Rpc3QgKz0gZGlzdFtqXTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VtX2Rpc3Q7Cit9CisKK3N0YXRpYyBkb3VibGUKK2ljdkNhbGNEaXN0M0QoIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IGNvdW50LCBmbG9hdCAqX2xpbmUsIGZsb2F0ICpkaXN0ICkKK3sKKyAgICBpbnQgajsKKyAgICBmbG9hdCBweCA9IF9saW5lWzNdLCBweSA9IF9saW5lWzRdLCBweiA9IF9saW5lWzVdOworICAgIGZsb2F0IHZ4ID0gX2xpbmVbMF0sIHZ5ID0gX2xpbmVbMV0sIHZ6ID0gX2xpbmVbMl07CisgICAgZG91YmxlIHN1bV9kaXN0ID0gMC47CisKKyAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgeworICAgICAgICBmbG9hdCB4LCB5LCB6OworICAgICAgICBkb3VibGUgcDEsIHAyLCBwMzsKKworICAgICAgICB4ID0gcG9pbnRzW2pdLnggLSBweDsKKyAgICAgICAgeSA9IHBvaW50c1tqXS55IC0gcHk7CisgICAgICAgIHogPSBwb2ludHNbal0ueiAtIHB6OworCisgICAgICAgIHAxID0gdnkgKiB6IC0gdnogKiB5OworICAgICAgICBwMiA9IHZ6ICogeCAtIHZ4ICogejsKKyAgICAgICAgcDMgPSB2eCAqIHkgLSB2eSAqIHg7CisKKyAgICAgICAgZGlzdFtqXSA9IChmbG9hdCkgc3FydCggcDEqcDEgKyBwMipwMiArIHAzKnAzICk7CisgICAgICAgIHN1bV9kaXN0ICs9IGRpc3Rbal07CisgICAgfQorCisgICAgcmV0dXJuIHN1bV9kaXN0OworfQorCitzdGF0aWMgdm9pZAoraWN2V2VpZ2h0TDEoIGZsb2F0ICpkLCBpbnQgY291bnQsIGZsb2F0ICp3ICkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0ID0gZmFicyggKGRvdWJsZSkgZFtpXSApOworICAgICAgICB3W2ldID0gKGZsb2F0KSgxLiAvIE1BWCh0LCBlcHMpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitpY3ZXZWlnaHRMMTIoIGZsb2F0ICpkLCBpbnQgY291bnQsIGZsb2F0ICp3ICkKK3sKKyAgICBpbnQgaTsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIHdbaV0gPSAxLjBmIC8gKGZsb2F0KSBzcXJ0KCAxICsgKGRvdWJsZSkgKGRbaV0gKiBkW2ldICogMC41KSApOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2V2VpZ2h0SHViZXIoIGZsb2F0ICpkLCBpbnQgY291bnQsIGZsb2F0ICp3LCBmbG9hdCBfYyApCit7CisgICAgaW50IGk7CisgICAgY29uc3QgZmxvYXQgYyA9IF9jIDw9IDAgPyAxLjM0NWYgOiBfYzsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBkW2ldIDwgYyApCisgICAgICAgICAgICB3W2ldID0gMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgd1tpXSA9IGMvZFtpXTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdldlaWdodEZhaXIoIGZsb2F0ICpkLCBpbnQgY291bnQsIGZsb2F0ICp3LCBmbG9hdCBfYyApCit7CisgICAgaW50IGk7CisgICAgY29uc3QgZmxvYXQgYyA9IF9jID09IDAgPyAxIC8gMS4zOTk4ZiA6IDEgLyBfYzsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIHdbaV0gPSAxIC8gKDEgKyBkW2ldICogYyk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraWN2V2VpZ2h0V2Vsc2NoKCBmbG9hdCAqZCwgaW50IGNvdW50LCBmbG9hdCAqdywgZmxvYXQgX2MgKQoreworICAgIGludCBpOworICAgIGNvbnN0IGZsb2F0IGMgPSBfYyA9PSAwID8gMSAvIDIuOTg0NmYgOiAxIC8gX2M7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICB3W2ldID0gKGZsb2F0KSBleHAoIC1kW2ldICogZFtpXSAqIGMgKiBjICk7CisgICAgfQorfQorCisKKy8qIFRha2VzIGFuIGFycmF5IG9mIDJEIHBvaW50cywgdHlwZSBvZiBkaXN0YW5jZSAoaW5jbHVkaW5nIHVzZXItZGVmaW5lZAorZGlzdGFuY2Ugc3BlY2lmaWVkIGJ5IGNhbGxiYWNrcywgZmlsbHMgdGhlIGFycmF5IG9mIGZvdXIgZmxvYXRzIHdpdGggbGluZQorcGFyYW1ldGVycyBBLCBCLCBDLCBELCB3aGVyZSAoQSwgQikgaXMgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciwKKyhDLCBEKSBpcyB0aGUgcG9pbnQgdGhhdCBiZWxvbmdzIHRvIHRoZSBsaW5lLiAqLworCitzdGF0aWMgQ3ZTdGF0dXMgIGljdkZpdExpbmUyRCggQ3ZQb2ludDJEMzJmICogcG9pbnRzLCBpbnQgY291bnQsIGludCBkaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IF9wYXJhbSwgZmxvYXQgcmVwcywgZmxvYXQgYWVwcywgZmxvYXQgKmxpbmUgKQoreworICAgIGRvdWJsZSBFUFMgPSBjb3VudCpGTFRfRVBTSUxPTjsKKyAgICB2b2lkICgqY2FsY193ZWlnaHRzKSAoZmxvYXQgKiwgaW50LCBmbG9hdCAqKSA9IDA7CisgICAgdm9pZCAoKmNhbGNfd2VpZ2h0c19wYXJhbSkgKGZsb2F0ICosIGludCwgZmxvYXQgKiwgZmxvYXQpID0gMDsKKyAgICBmbG9hdCAqdzsgICAgICAgICAgICAgICAgICAgLyogd2VpZ2h0cyAqLworICAgIGZsb2F0ICpyOyAgICAgICAgICAgICAgICAgICAvKiBzcXVhcmUgZGlzdGFuY2VzICovCisgICAgaW50IGksIGosIGs7CisgICAgZmxvYXQgX2xpbmVbNl0sIF9saW5lcHJldls2XTsKKyAgICBmbG9hdCByZGVsdGEgPSByZXBzICE9IDAgPyByZXBzIDogMS4wZjsKKyAgICBmbG9hdCBhZGVsdGEgPSBhZXBzICE9IDAgPyBhZXBzIDogMC4wMWY7CisgICAgZG91YmxlIG1pbl9lcnIgPSBEQkxfTUFYLCBlcnIgPSAwOworICAgIEN2Uk5HIHJuZyA9IGN2Uk5HKC0xKTsKKworICAgIG1lbXNldCggbGluZSwgMCwgNCpzaXplb2YobGluZVswXSkgKTsKKworICAgIHN3aXRjaCAoZGlzdCkKKyAgICB7CisgICAgY2FzZSBDVl9ESVNUX0wyOgorICAgICAgICByZXR1cm4gaWN2Rml0TGluZTJEX3dvZHMoIHBvaW50cywgY291bnQsIDAsIGxpbmUgKTsKKworICAgIGNhc2UgQ1ZfRElTVF9MMToKKyAgICAgICAgY2FsY193ZWlnaHRzID0gaWN2V2VpZ2h0TDE7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9ESVNUX0wxMjoKKyAgICAgICAgY2FsY193ZWlnaHRzID0gaWN2V2VpZ2h0TDEyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfRElTVF9GQUlSOgorICAgICAgICBjYWxjX3dlaWdodHNfcGFyYW0gPSBpY3ZXZWlnaHRGYWlyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfRElTVF9XRUxTQ0g6CisgICAgICAgIGNhbGNfd2VpZ2h0c19wYXJhbSA9IGljdldlaWdodFdlbHNjaDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENWX0RJU1RfSFVCRVI6CisgICAgICAgIGNhbGNfd2VpZ2h0c19wYXJhbSA9IGljdldlaWdodEh1YmVyOworICAgICAgICBicmVhazsKKworICAgIC8qY2FzZSBDVl9ESVNUX1VTRVI6CisgICAgICAgIGNhbGNfd2VpZ2h0cyA9ICh2b2lkICggKiApKGZsb2F0ICosIGludCwgZmxvYXQgKikpIF9QRlAuZnA7CisgICAgICAgIGJyZWFrOyovCisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICB9CisKKyAgICB3ID0gKGZsb2F0ICopIGN2QWxsb2MoIGNvdW50ICogc2l6ZW9mKCBmbG9hdCApKTsKKyAgICByID0gKGZsb2F0ICopIGN2QWxsb2MoIGNvdW50ICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgIGZvciggayA9IDA7IGsgPCAyMDsgaysrICkKKyAgICB7CisgICAgICAgIGludCBmaXJzdCA9IDE7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHdbaV0gPSAwLmY7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTUlOKGNvdW50LDEwKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBqID0gY3ZSYW5kSW50KCZybmcpICUgY291bnQ7CisgICAgICAgICAgICBpZiggd1tqXSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3W2pdID0gMS5mOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGljdkZpdExpbmUyRF93b2RzKCBwb2ludHMsIGNvdW50LCB3LCBfbGluZSApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMzA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fdyA9IDA7CisKKyAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gX2xpbmVbMF0gKiBfbGluZXByZXZbMF0gKyBfbGluZVsxXSAqIF9saW5lcHJldlsxXTsKKyAgICAgICAgICAgICAgICB0ID0gTUFYKHQsLTEuKTsKKyAgICAgICAgICAgICAgICB0ID0gTUlOKHQsMS4pOworICAgICAgICAgICAgICAgIGlmKCBmYWJzKGFjb3ModCkpIDwgYWRlbHRhICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHgsIHksIGQ7CisKKyAgICAgICAgICAgICAgICAgICAgeCA9IChmbG9hdCkgZmFicyggX2xpbmVbMl0gLSBfbGluZXByZXZbMl0gKTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IChmbG9hdCkgZmFicyggX2xpbmVbM10gLSBfbGluZXByZXZbM10gKTsKKworICAgICAgICAgICAgICAgICAgICBkID0geCA+IHkgPyB4IDogeTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGQgPCByZGVsdGEgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogY2FsY3VsYXRlIGRpc3RhbmNlcyAqLworICAgICAgICAgICAgZXJyID0gaWN2Q2FsY0Rpc3QyRCggcG9pbnRzLCBjb3VudCwgX2xpbmUsIHIgKTsKKyAgICAgICAgICAgIGlmKCBlcnIgPCBFUFMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgd2VpZ2h0cyAqLworICAgICAgICAgICAgaWYoIGNhbGNfd2VpZ2h0cyApCisgICAgICAgICAgICAgICAgY2FsY193ZWlnaHRzKCByLCBjb3VudCwgdyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNhbGNfd2VpZ2h0c19wYXJhbSggciwgY291bnQsIHcsIF9wYXJhbSApOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgc3VtX3cgKz0gd1tqXTsKKworICAgICAgICAgICAgaWYoIGZhYnMoc3VtX3cpID4gRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bV93ID0gMS4vc3VtX3c7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB3W2pdID0gKGZsb2F0KSh3W2pdKnN1bV93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHdbal0gPSAxLmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNhdmUgdGhlIGxpbmUgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgbWVtY3B5KCBfbGluZXByZXYsIF9saW5lLCA0ICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICAgICAgLyogUnVuIGFnYWluLi4uICovCisgICAgICAgICAgICBpY3ZGaXRMaW5lMkRfd29kcyggcG9pbnRzLCBjb3VudCwgdywgX2xpbmUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBlcnIgPCBtaW5fZXJyICkKKyAgICAgICAgeworICAgICAgICAgICAgbWluX2VyciA9IGVycjsKKyAgICAgICAgICAgIG1lbWNweSggbGluZSwgX2xpbmUsIDQgKiBzaXplb2YobGluZVswXSkpOworICAgICAgICAgICAgaWYoIGVyciA8IEVQUyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkZyZWUoICZ3ICk7CisgICAgY3ZGcmVlKCAmciApOworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKiBUYWtlcyBhbiBhcnJheSBvZiAzRCBwb2ludHMsIHR5cGUgb2YgZGlzdGFuY2UgKGluY2x1ZGluZyB1c2VyLWRlZmluZWQKK2Rpc3RhbmNlIHNwZWNpZmllZCBieSBjYWxsYmFja3MsIGZpbGxzIHRoZSBhcnJheSBvZiBmb3VyIGZsb2F0cyB3aXRoIGxpbmUKK3BhcmFtZXRlcnMgQSwgQiwgQywgRCwgRSwgRiwgd2hlcmUgKEEsIEIsIEMpIGlzIHRoZSBub3JtYWxpemVkIGRpcmVjdGlvbiB2ZWN0b3IsCisoRCwgRSwgRikgaXMgdGhlIHBvaW50IHRoYXQgYmVsb25ncyB0byB0aGUgbGluZS4gKi8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZGaXRMaW5lM0QoIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IGNvdW50LCBpbnQgZGlzdCwKKyAgICAgICAgICAgICAgZmxvYXQgX3BhcmFtLCBmbG9hdCByZXBzLCBmbG9hdCBhZXBzLCBmbG9hdCAqbGluZSApCit7CisgICAgZG91YmxlIEVQUyA9IGNvdW50KkZMVF9FUFNJTE9OOworICAgIHZvaWQgKCpjYWxjX3dlaWdodHMpIChmbG9hdCAqLCBpbnQsIGZsb2F0ICopID0gMDsKKyAgICB2b2lkICgqY2FsY193ZWlnaHRzX3BhcmFtKSAoZmxvYXQgKiwgaW50LCBmbG9hdCAqLCBmbG9hdCkgPSAwOworICAgIGZsb2F0ICp3OyAgICAgICAgICAgICAgICAgICAvKiB3ZWlnaHRzICovCisgICAgZmxvYXQgKnI7ICAgICAgICAgICAgICAgICAgIC8qIHNxdWFyZSBkaXN0YW5jZXMgKi8KKyAgICBpbnQgaSwgaiwgazsKKyAgICBmbG9hdCBfbGluZVs2XSwgX2xpbmVwcmV2WzZdOworICAgIGZsb2F0IHJkZWx0YSA9IHJlcHMgIT0gMCA/IHJlcHMgOiAxLjBmOworICAgIGZsb2F0IGFkZWx0YSA9IGFlcHMgIT0gMCA/IGFlcHMgOiAwLjAxZjsKKyAgICBkb3VibGUgbWluX2VyciA9IERCTF9NQVgsIGVyciA9IDA7CisgICAgQ3ZSTkcgcm5nID0gY3ZSTkcoLTEpOworCisgICAgbWVtc2V0KCBsaW5lLCAwLCA2KnNpemVvZihsaW5lWzBdKSApOworCisgICAgc3dpdGNoIChkaXN0KQorICAgIHsKKyAgICBjYXNlIENWX0RJU1RfTDI6CisgICAgICAgIHJldHVybiBpY3ZGaXRMaW5lM0Rfd29kcyggcG9pbnRzLCBjb3VudCwgMCwgbGluZSApOworCisgICAgY2FzZSBDVl9ESVNUX0wxOgorICAgICAgICBjYWxjX3dlaWdodHMgPSBpY3ZXZWlnaHRMMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENWX0RJU1RfTDEyOgorICAgICAgICBjYWxjX3dlaWdodHMgPSBpY3ZXZWlnaHRMMTI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9ESVNUX0ZBSVI6CisgICAgICAgIGNhbGNfd2VpZ2h0c19wYXJhbSA9IGljdldlaWdodEZhaXI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9ESVNUX1dFTFNDSDoKKyAgICAgICAgY2FsY193ZWlnaHRzX3BhcmFtID0gaWN2V2VpZ2h0V2Vsc2NoOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfRElTVF9IVUJFUjoKKyAgICAgICAgY2FsY193ZWlnaHRzX3BhcmFtID0gaWN2V2VpZ2h0SHViZXI7CisgICAgICAgIGJyZWFrOworCisgICAgLypjYXNlIENWX0RJU1RfVVNFUjoKKyAgICAgICAgX1BGUC5wID0gcGFyYW07CisgICAgICAgIGNhbGNfd2VpZ2h0cyA9ICh2b2lkICggKiApKGZsb2F0ICosIGludCwgZmxvYXQgKikpIF9QRlAuZnA7CisgICAgICAgIGJyZWFrOyovCisKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICB9CisKKyAgICB3ID0gKGZsb2F0ICopIGN2QWxsb2MoIGNvdW50ICogc2l6ZW9mKCBmbG9hdCApKTsKKyAgICByID0gKGZsb2F0ICopIGN2QWxsb2MoIGNvdW50ICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgIGZvciggayA9IDA7IGsgPCAyMDsgaysrICkKKyAgICB7CisgICAgICAgIGludCBmaXJzdCA9IDE7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHdbaV0gPSAwLmY7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTUlOKGNvdW50LDEwKTsgKQorICAgICAgICB7CisgICAgICAgICAgICBqID0gY3ZSYW5kSW50KCZybmcpICUgY291bnQ7CisgICAgICAgICAgICBpZiggd1tqXSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3W2pdID0gMS5mOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGljdkZpdExpbmUzRF93b2RzKCBwb2ludHMsIGNvdW50LCB3LCBfbGluZSApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMzA7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW1fdyA9IDA7CisKKyAgICAgICAgICAgIGlmKCBmaXJzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlyc3QgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gX2xpbmVbMF0gKiBfbGluZXByZXZbMF0gKyBfbGluZVsxXSAqIF9saW5lcHJldlsxXSArIF9saW5lWzJdICogX2xpbmVwcmV2WzJdOworICAgICAgICAgICAgICAgIHQgPSBNQVgodCwtMS4pOworICAgICAgICAgICAgICAgIHQgPSBNSU4odCwxLik7CisgICAgICAgICAgICAgICAgaWYoIGZhYnMoYWNvcyh0KSkgPCBhZGVsdGEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCwgeSwgeiwgYXgsIGF5LCBheiwgZHgsIGR5LCBkeiwgZDsKKworICAgICAgICAgICAgICAgICAgICB4ID0gX2xpbmVbM10gLSBfbGluZXByZXZbM107CisgICAgICAgICAgICAgICAgICAgIHkgPSBfbGluZVs0XSAtIF9saW5lcHJldls0XTsKKyAgICAgICAgICAgICAgICAgICAgeiA9IF9saW5lWzVdIC0gX2xpbmVwcmV2WzVdOworICAgICAgICAgICAgICAgICAgICBheCA9IF9saW5lWzBdIC0gX2xpbmVwcmV2WzBdOworICAgICAgICAgICAgICAgICAgICBheSA9IF9saW5lWzFdIC0gX2xpbmVwcmV2WzFdOworICAgICAgICAgICAgICAgICAgICBheiA9IF9saW5lWzJdIC0gX2xpbmVwcmV2WzJdOworICAgICAgICAgICAgICAgICAgICBkeCA9IChmbG9hdCkgZmFicyggeSAqIGF6IC0geiAqIGF5ICk7CisgICAgICAgICAgICAgICAgICAgIGR5ID0gKGZsb2F0KSBmYWJzKCB6ICogYXggLSB4ICogYXogKTsKKyAgICAgICAgICAgICAgICAgICAgZHogPSAoZmxvYXQpIGZhYnMoIHggKiBheSAtIHkgKiBheCApOworCisgICAgICAgICAgICAgICAgICAgIGQgPSBkeCA+IGR5ID8gKGR4ID4gZHogPyBkeCA6IGR6KSA6IChkeSA+IGR6ID8gZHkgOiBkeik7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkIDwgcmRlbHRhICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIGNhbGN1bGF0ZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgICAgIGlmKCBpY3ZDYWxjRGlzdDNEKCBwb2ludHMsIGNvdW50LCBfbGluZSwgciApIDwgRkxUX0VQU0lMT04qY291bnQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgd2VpZ2h0cyAqLworICAgICAgICAgICAgaWYoIGNhbGNfd2VpZ2h0cyApCisgICAgICAgICAgICAgICAgY2FsY193ZWlnaHRzKCByLCBjb3VudCwgdyApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGNhbGNfd2VpZ2h0c19wYXJhbSggciwgY291bnQsIHcsIF9wYXJhbSApOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgc3VtX3cgKz0gd1tqXTsKKworICAgICAgICAgICAgaWYoIGZhYnMoc3VtX3cpID4gRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bV93ID0gMS4vc3VtX3c7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB3W2pdID0gKGZsb2F0KSh3W2pdKnN1bV93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHdbal0gPSAxLmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNhdmUgdGhlIGxpbmUgcGFyYW1ldGVycyAqLworICAgICAgICAgICAgbWVtY3B5KCBfbGluZXByZXYsIF9saW5lLCA2ICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICAgICAgLyogUnVuIGFnYWluLi4uICovCisgICAgICAgICAgICBpY3ZGaXRMaW5lM0Rfd29kcyggcG9pbnRzLCBjb3VudCwgdywgX2xpbmUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBlcnIgPCBtaW5fZXJyICkKKyAgICAgICAgeworICAgICAgICAgICAgbWluX2VyciA9IGVycjsKKyAgICAgICAgICAgIG1lbWNweSggbGluZSwgX2xpbmUsIDYgKiBzaXplb2YobGluZVswXSkpOworICAgICAgICAgICAgaWYoIGVyciA8IEVQUyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXR1cm4uLi4KKyAgICBjdkZyZWUoICZ3ICk7CisgICAgY3ZGcmVlKCAmciApOworICAgIHJldHVybiBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Rml0TGluZSggY29uc3QgQ3ZBcnIqIGFycmF5LCBpbnQgZGlzdCwgZG91YmxlIHBhcmFtLAorICAgICAgICAgICBkb3VibGUgcmVwcywgZG91YmxlIGFlcHMsIGZsb2F0ICpsaW5lICkKK3sKKyAgICBzY2hhciogYnVmZmVyID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2Rml0TGluZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHNjaGFyKiBwb2ludHMgPSAwOworICAgIHVuaW9uIHsgQ3ZDb250b3VyIGNvbnRvdXI7IEN2U2VxIHNlcTsgfSBoZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBibG9jazsKKyAgICBDdlNlcSogcHRzZXEgPSAoQ3ZTZXEqKWFycmF5OworICAgIGludCB0eXBlOworCisgICAgaWYoICFsaW5lICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHBvaW50ZXIgdG8gbGluZSBwYXJhbWV0ZXJzIiApOworCisgICAgaWYoIENWX0lTX1NFUShwdHNlcSkgKQorICAgIHsKKyAgICAgICAgdHlwZSA9IENWX1NFUV9FTFRZUEUocHRzZXEpOworICAgICAgICBpZiggcHRzZXEtPnRvdGFsID09IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUaGUgc2VxdWVuY2UgaGFzIG5vIHBvaW50cyIgKTsKKyAgICAgICAgaWYoICh0eXBlIT1DVl8zMkZDMiAmJiB0eXBlIT1DVl8zMkZDMyAmJiB0eXBlIT1DVl8zMlNDMiAmJiB0eXBlIT1DVl8zMlNDMykgfHwKKyAgICAgICAgICAgIENWX0VMRU1fU0laRSh0eXBlKSAhPSBwdHNlcS0+ZWxlbV9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAiSW5wdXQgc2VxdWVuY2UgbXVzdCBjb25zaXN0IG9mIDJkIHBvaW50cyBvciAzZCBwb2ludHMiICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycmF5OworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICAgICAgaWYoICFDVl9JU19NQVQobWF0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnB1dCBhcnJheSBpcyBub3QgYSBzZXF1ZW5jZSBub3IgbWF0cml4IiApOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQobWF0LT50eXBlKSB8fAorICAgICAgICAgICAgKHR5cGUhPUNWXzMyRkMyICYmIHR5cGUhPUNWXzMyRkMzICYmIHR5cGUhPUNWXzMyU0MyICYmIHR5cGUhPUNWXzMyU0MzKSB8fAorICAgICAgICAgICAgKG1hdC0+d2lkdGggIT0gMSAmJiBtYXQtPmhlaWdodCAhPSAxKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiSW5wdXQgYXJyYXkgbXVzdCBiZSAxZCBjb250aW51b3VzIGFycmF5IG9mIDJkIG9yIDNkIHBvaW50cyIgKTsKKworICAgICAgICBDVl9DQUxMKCBwdHNlcSA9IGN2TWFrZVNlcUhlYWRlckZvckFycmF5KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfR0VORVJJQ3x0eXBlLCBzaXplb2YoQ3ZDb250b3VyKSwgQ1ZfRUxFTV9TSVpFKHR5cGUpLCBtYXQtPmRhdGEucHRyLAorICAgICAgICAgICAgbWF0LT53aWR0aCArIG1hdC0+aGVpZ2h0IC0gMSwgJmhlYWRlci5zZXEsICZibG9jayApKTsKKyAgICB9CisKKyAgICBpZiggcmVwcyA8IDAgfHwgYWVwcyA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIkJvdGggcmVwcyBhbmQgYWVwcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIgKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgodHlwZSkgPT0gQ1ZfMzJGICYmIHB0c2VxLT5maXJzdC0+bmV4dCA9PSBwdHNlcS0+Zmlyc3QgKQorICAgIHsKKyAgICAgICAgLyogbm8gbmVlZCB0byBjb3B5IGRhdGEgaW4gdGhpcyBjYXNlICovCisgICAgICAgIHBvaW50cyA9IHB0c2VxLT5maXJzdC0+ZGF0YTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gcG9pbnRzID0gKHNjaGFyKiljdkFsbG9jKCBwdHNlcS0+dG90YWwqQ1ZfRUxFTV9TSVpFKHR5cGUpICkpOworICAgICAgICBDVl9DQUxMKCBjdkN2dFNlcVRvQXJyYXkoIHB0c2VxLCBwb2ludHMsIENWX1dIT0xFX1NFUSApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpICE9IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCB0b3RhbCA9IHB0c2VxLT50b3RhbCpDVl9NQVRfQ04odHlwZSk7CisgICAgICAgICAgICBhc3NlcnQoIENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl8zMlMgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICAgICAgICAgICgoZmxvYXQqKXBvaW50cylbaV0gPSAoZmxvYXQpKChpbnQqKXBvaW50cylbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggZGlzdCA9PSBDVl9ESVNUX1VTRVIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVXNlci1kZWZpbmVkIGRpc3RhbmNlIGlzIG5vdCBhbGxvd2VkIiApOworCisgICAgaWYoIENWX01BVF9DTih0eXBlKSA9PSAyICkKKyAgICB7CisgICAgICAgIElQUElfQ0FMTCggaWN2Rml0TGluZTJEKCAoQ3ZQb2ludDJEMzJmKilwb2ludHMsIHB0c2VxLT50b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QsIChmbG9hdClwYXJhbSwgKGZsb2F0KXJlcHMsIChmbG9hdClhZXBzLCBsaW5lICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBJUFBJX0NBTEwoIGljdkZpdExpbmUzRCggKEN2UG9pbnQzRDMyZiopcG9pbnRzLCBwdHNlcS0+dG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0LCAoZmxvYXQpcGFyYW0sIChmbG9hdClyZXBzLCAoZmxvYXQpYWVwcywgbGluZSApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2bGtweXJhbWlkLmNwcCBiL2N2L3NyYy9jdmxrcHlyYW1pZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVhZDQyZAotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdmxrcHlyYW1pZC5jcHAKQEAgLTAsMCArMSwxMzk0IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyB2b2lkCitpbnRlcnNlY3QoIEN2UG9pbnQyRDMyZiBwdCwgQ3ZTaXplIHdpbl9zaXplLCBDdlNpemUgaW1nU2l6ZSwKKyAgICAgICAgICAgQ3ZQb2ludCogbWluX3B0LCBDdlBvaW50KiBtYXhfcHQgKQoreworICAgIEN2UG9pbnQgaXB0OworCisgICAgaXB0LnggPSBjdkZsb29yKCBwdC54ICk7CisgICAgaXB0LnkgPSBjdkZsb29yKCBwdC55ICk7CisKKyAgICBpcHQueCAtPSB3aW5fc2l6ZS53aWR0aDsKKyAgICBpcHQueSAtPSB3aW5fc2l6ZS5oZWlnaHQ7CisKKyAgICB3aW5fc2l6ZS53aWR0aCA9IHdpbl9zaXplLndpZHRoICogMiArIDE7CisgICAgd2luX3NpemUuaGVpZ2h0ID0gd2luX3NpemUuaGVpZ2h0ICogMiArIDE7CisKKyAgICBtaW5fcHQtPnggPSBNQVgoIDAsIC1pcHQueCApOworICAgIG1pbl9wdC0+eSA9IE1BWCggMCwgLWlwdC55ICk7CisgICAgbWF4X3B0LT54ID0gTUlOKCB3aW5fc2l6ZS53aWR0aCwgaW1nU2l6ZS53aWR0aCAtIGlwdC54ICk7CisgICAgbWF4X3B0LT55ID0gTUlOKCB3aW5fc2l6ZS5oZWlnaHQsIGltZ1NpemUuaGVpZ2h0IC0gaXB0LnkgKTsKK30KKworCitzdGF0aWMgaW50IGljdk1pbmltYWxQeXJhbWlkU2l6ZSggQ3ZTaXplIGltZ1NpemUgKQoreworICAgIHJldHVybiBjdkFsaWduKGltZ1NpemUud2lkdGgsOCkgKiBpbWdTaXplLmhlaWdodCAvIDM7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkluaXRQeXJhbWlkYWxBbGdvcml0aG0oIGNvbnN0IEN2TWF0KiBpbWdBLCBjb25zdCBDdk1hdCogaW1nQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBweXJBLCBDdk1hdCogcHlyQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgQ3ZUZXJtQ3JpdGVyaWEgKiBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfaXRlcnMsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICoqKiBpbWdJLCB1Y2hhciAqKiogaW1nSiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKnN0ZXAsIEN2U2l6ZSoqIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKipzY2FsZSwgdWNoYXIgKiogYnVmZmVyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkluaXRQeXJhbWlkYWxBbGdvcml0aG0iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBpbnQgQUxJR04gPSA4OworICAgIGludCBweXJCeXRlcywgYnVmZmVyQnl0ZXMgPSAwLCBlbGVtX3NpemU7CisgICAgaW50IGxldmVsMSA9IGxldmVsICsgMTsKKworICAgIGludCBpOworICAgIEN2U2l6ZSBpbWdTaXplLCBsZXZlbFNpemU7CisKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqaW1nSSA9ICppbWdKID0gMDsKKyAgICAqc3RlcCA9IDA7CisgICAgKnNjYWxlID0gMDsKKyAgICAqc2l6ZSA9IDA7CisKKyAgICAvKiBjaGVjayBpbnB1dCBhcmd1bWVudHMgKi8KKyAgICBpZiggKChmbGFncyAmIENWX0xLRkxPV19QWVJfQV9SRUFEWSkgIT0gMCAmJiAhcHlyQSkgfHwKKyAgICAgICAgKChmbGFncyAmIENWX0xLRkxPV19QWVJfQl9SRUFEWSkgIT0gMCAmJiAhcHlyQikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgdGhlIHByZWNvbXB1dGVkIHB5cmFtaWRzIGFyZSBtaXNzaW5nIiApOworCisgICAgaWYoIGxldmVsIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIG51bWJlciBvZiBweXJhbWlkIGxheWVycyBpcyBuZWdhdGl2ZSIgKTsKKworICAgIHN3aXRjaCggY3JpdGVyaWEtPnR5cGUgKQorICAgIHsKKyAgICBjYXNlIENWX1RFUk1DUklUX0lURVI6CisgICAgICAgIGNyaXRlcmlhLT5lcHNpbG9uID0gMC5mOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX1RFUk1DUklUX0VQUzoKKyAgICAgICAgY3JpdGVyaWEtPm1heF9pdGVyID0gbWF4X2l0ZXJzOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX1RFUk1DUklUX0lURVIgfCBDVl9URVJNQ1JJVF9FUFM6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCggMCApOworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCB0ZXJtaW5hdGlvbiBjcml0ZXJpYSIgKTsKKyAgICB9CisKKyAgICAvKiBjb21wYXJlIHNxdWFyZWQgdmFsdWVzICovCisgICAgY3JpdGVyaWEtPmVwc2lsb24gKj0gY3JpdGVyaWEtPmVwc2lsb247CisKKyAgICAvKiBzZXQgcG9pbnRlcnMgYW5kIHN0ZXAgZm9yIGV2ZXJ5IGxldmVsICovCisgICAgcHlyQnl0ZXMgPSAwOworCisgICAgaW1nU2l6ZSA9IGN2R2V0U2l6ZShpbWdBKTsKKyAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUoaW1nQS0+dHlwZSk7CisgICAgbGV2ZWxTaXplID0gaW1nU2l6ZTsKKworICAgIGZvciggaSA9IDE7IGkgPCBsZXZlbDE7IGkrKyApCisgICAgeworICAgICAgICBsZXZlbFNpemUud2lkdGggPSAobGV2ZWxTaXplLndpZHRoICsgMSkgPj4gMTsKKyAgICAgICAgbGV2ZWxTaXplLmhlaWdodCA9IChsZXZlbFNpemUuaGVpZ2h0ICsgMSkgPj4gMTsKKworICAgICAgICBpbnQgdHN0ZXAgPSBjdkFsaWduKGxldmVsU2l6ZS53aWR0aCxBTElHTikgKiBlbGVtX3NpemU7CisgICAgICAgIHB5ckJ5dGVzICs9IHRzdGVwICogbGV2ZWxTaXplLmhlaWdodDsKKyAgICB9CisKKyAgICBhc3NlcnQoIHB5ckJ5dGVzIDw9IGltZ1NpemUud2lkdGggKiBpbWdTaXplLmhlaWdodCAqIGVsZW1fc2l6ZSAqIDQgLyAzICk7CisKKyAgICAvKiBidWZmZXJfc2l6ZSA9IDxzaXplIGZvciBwYXRjaGVzPiArIDxzaXplIGZvciBweXJhbWlkcz4gKi8KKyAgICBidWZmZXJCeXRlcyA9IChpbnQpKChsZXZlbDEgPj0gMCkgKiAoKHB5ckEtPmRhdGEucHRyID09IDApICsKKyAgICAgICAgKHB5ckItPmRhdGEucHRyID09IDApKSAqIHB5ckJ5dGVzICsKKyAgICAgICAgKHNpemVvZihpbWdJWzBdWzBdKSAqIDIgKyBzaXplb2Yoc3RlcFswXVswXSkgKworICAgICAgICAgc2l6ZW9mKHNpemVbMF1bMF0pICsgc2l6ZW9mKHNjYWxlWzBdWzBdKSkgKiBsZXZlbDEpOworCisgICAgQ1ZfQ0FMTCggKmJ1ZmZlciA9ICh1Y2hhciAqKWN2QWxsb2MoIGJ1ZmZlckJ5dGVzICkpOworCisgICAgKmltZ0kgPSAodWNoYXIgKiopIGJ1ZmZlclswXTsKKyAgICAqaW1nSiA9ICppbWdJICsgbGV2ZWwxOworICAgICpzdGVwID0gKGludCAqKSAoKmltZ0ogKyBsZXZlbDEpOworICAgICpzY2FsZSA9IChkb3VibGUgKikgKCpzdGVwICsgbGV2ZWwxKTsKKyAgICAqc2l6ZSA9IChDdlNpemUgKikoKnNjYWxlICsgbGV2ZWwxKTsKKworICAgIGltZ0lbMF1bMF0gPSBpbWdBLT5kYXRhLnB0cjsKKyAgICBpbWdKWzBdWzBdID0gaW1nQi0+ZGF0YS5wdHI7CisgICAgc3RlcFswXVswXSA9IGltZ0EtPnN0ZXA7CisgICAgc2NhbGVbMF1bMF0gPSAxOworICAgIHNpemVbMF1bMF0gPSBpbWdTaXplOworCisgICAgaWYoIGxldmVsID4gMCApCisgICAgeworICAgICAgICB1Y2hhciAqYnVmUHRyID0gKHVjaGFyICopICgqc2l6ZSArIGxldmVsMSk7CisgICAgICAgIHVjaGFyICpwdHJBID0gcHlyQS0+ZGF0YS5wdHI7CisgICAgICAgIHVjaGFyICpwdHJCID0gcHlyQi0+ZGF0YS5wdHI7CisKKyAgICAgICAgaWYoICFwdHJBICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyQSA9IGJ1ZlB0cjsKKyAgICAgICAgICAgIGJ1ZlB0ciArPSBweXJCeXRlczsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhcHRyQiApCisgICAgICAgICAgICBwdHJCID0gYnVmUHRyOworCisgICAgICAgIGxldmVsU2l6ZSA9IGltZ1NpemU7CisKKyAgICAgICAgLyogYnVpbGQgcHlyYW1pZHMgZm9yIGJvdGggZnJhbWVzICovCisgICAgICAgIGZvciggaSA9IDE7IGkgPD0gbGV2ZWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZXZlbEJ5dGVzOworICAgICAgICAgICAgQ3ZNYXQgcHJldl9sZXZlbCwgbmV4dF9sZXZlbDsKKworICAgICAgICAgICAgbGV2ZWxTaXplLndpZHRoID0gKGxldmVsU2l6ZS53aWR0aCArIDEpID4+IDE7CisgICAgICAgICAgICBsZXZlbFNpemUuaGVpZ2h0ID0gKGxldmVsU2l6ZS5oZWlnaHQgKyAxKSA+PiAxOworCisgICAgICAgICAgICBzaXplWzBdW2ldID0gbGV2ZWxTaXplOworICAgICAgICAgICAgc3RlcFswXVtpXSA9IGN2QWxpZ24oIGxldmVsU2l6ZS53aWR0aCwgQUxJR04gKSAqIGVsZW1fc2l6ZTsKKyAgICAgICAgICAgIHNjYWxlWzBdW2ldID0gc2NhbGVbMF1baSAtIDFdICogMC41OworCisgICAgICAgICAgICBsZXZlbEJ5dGVzID0gc3RlcFswXVtpXSAqIGxldmVsU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBpbWdJWzBdW2ldID0gKHVjaGFyICopIHB0ckE7CisgICAgICAgICAgICBwdHJBICs9IGxldmVsQnl0ZXM7CisKKyAgICAgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfTEtGTE9XX1BZUl9BX1JFQURZKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHJldl9sZXZlbCA9IGN2TWF0KCBzaXplWzBdW2ktMV0uaGVpZ2h0LCBzaXplWzBdW2ktMV0ud2lkdGgsIENWXzhVQzEgKTsKKyAgICAgICAgICAgICAgICBuZXh0X2xldmVsID0gY3ZNYXQoIHNpemVbMF1baV0uaGVpZ2h0LCBzaXplWzBdW2ldLndpZHRoLCBDVl84VUMxICk7CisgICAgICAgICAgICAgICAgY3ZTZXREYXRhKCAmcHJldl9sZXZlbCwgaW1nSVswXVtpLTFdLCBzdGVwWzBdW2ktMV0gKTsKKyAgICAgICAgICAgICAgICBjdlNldERhdGEoICZuZXh0X2xldmVsLCBpbWdJWzBdW2ldLCBzdGVwWzBdW2ldICk7CisgICAgICAgICAgICAgICAgY3ZQeXJEb3duKCAmcHJldl9sZXZlbCwgJm5leHRfbGV2ZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW1nSlswXVtpXSA9ICh1Y2hhciAqKSBwdHJCOworICAgICAgICAgICAgcHRyQiArPSBsZXZlbEJ5dGVzOworCisgICAgICAgICAgICBpZiggIShmbGFncyAmIENWX0xLRkxPV19QWVJfQl9SRUFEWSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByZXZfbGV2ZWwgPSBjdk1hdCggc2l6ZVswXVtpLTFdLmhlaWdodCwgc2l6ZVswXVtpLTFdLndpZHRoLCBDVl84VUMxICk7CisgICAgICAgICAgICAgICAgbmV4dF9sZXZlbCA9IGN2TWF0KCBzaXplWzBdW2ldLmhlaWdodCwgc2l6ZVswXVtpXS53aWR0aCwgQ1ZfOFVDMSApOworICAgICAgICAgICAgICAgIGN2U2V0RGF0YSggJnByZXZfbGV2ZWwsIGltZ0pbMF1baS0xXSwgc3RlcFswXVtpLTFdICk7CisgICAgICAgICAgICAgICAgY3ZTZXREYXRhKCAmbmV4dF9sZXZlbCwgaW1nSlswXVtpXSwgc3RlcFswXVtpXSApOworICAgICAgICAgICAgICAgIGN2UHlyRG93biggJnByZXZfbGV2ZWwsICZuZXh0X2xldmVsICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIGNvbXB1dGUgZEkvZHggYW5kIGRJL2R5ICovCitzdGF0aWMgdm9pZAoraWN2Q2FsY0l4SXlfMzJmKCBjb25zdCBmbG9hdCogc3JjLCBpbnQgc3JjX3N0ZXAsIGZsb2F0KiBkc3RYLCBmbG9hdCogZHN0WSwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICBDdlNpemUgc3JjX3NpemUsIGNvbnN0IGZsb2F0KiBzbW9vdGhfaywgZmxvYXQqIGJ1ZmZlcjAgKQoreworICAgIGludCBzcmNfd2lkdGggPSBzcmNfc2l6ZS53aWR0aCwgZHN0X3dpZHRoID0gc3JjX3NpemUud2lkdGgtMjsKKyAgICBpbnQgeCwgaGVpZ2h0ID0gc3JjX3NpemUuaGVpZ2h0IC0gMjsKKyAgICBmbG9hdCogYnVmZmVyMSA9IGJ1ZmZlcjAgKyBzcmNfd2lkdGg7CisKKyAgICBzcmNfc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WFswXSk7CisKKyAgICBmb3IoIDsgaGVpZ2h0LS07IHNyYyArPSBzcmNfc3RlcCwgZHN0WCArPSBkc3Rfc3RlcCwgZHN0WSArPSBkc3Rfc3RlcCApCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCogc3JjMiA9IHNyYyArIHNyY19zdGVwOworICAgICAgICBjb25zdCBmbG9hdCogc3JjMyA9IHNyYyArIHNyY19zdGVwKjI7CisKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNyY193aWR0aDsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgdDAgPSAoc3JjM1t4XSArIHNyY1t4XSkqc21vb3RoX2tbMF0gKyBzcmMyW3hdKnNtb290aF9rWzFdOworICAgICAgICAgICAgZmxvYXQgdDEgPSBzcmMzW3hdIC0gc3JjW3hdOworICAgICAgICAgICAgYnVmZmVyMFt4XSA9IHQwOyBidWZmZXIxW3hdID0gdDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHggPSAwOyB4IDwgZHN0X3dpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB0MCA9IGJ1ZmZlcjBbeCsyXSAtIGJ1ZmZlcjBbeF07CisgICAgICAgICAgICBmbG9hdCB0MSA9IChidWZmZXIxW3hdICsgYnVmZmVyMVt4KzJdKSpzbW9vdGhfa1swXSArIGJ1ZmZlcjFbeCsxXSpzbW9vdGhfa1sxXTsKKyAgICAgICAgICAgIGRzdFhbeF0gPSB0MDsgZHN0WVt4XSA9IHQxOworICAgICAgICB9CisgICAgfQorfQorCisKK2ljdk9wdGljYWxGbG93UHlyTEtJbml0QWxsb2NfOHVfQzFSX3QgaWN2T3B0aWNhbEZsb3dQeXJMS0luaXRBbGxvY184dV9DMVJfcCA9IDA7CitpY3ZPcHRpY2FsRmxvd1B5ckxLRnJlZV84dV9DMVJfdCBpY3ZPcHRpY2FsRmxvd1B5ckxLRnJlZV84dV9DMVJfcCA9IDA7CitpY3ZPcHRpY2FsRmxvd1B5ckxLXzh1X0MxUl90IGljdk9wdGljYWxGbG93UHlyTEtfOHVfQzFSX3AgPSAwOworCisKK0NWX0lNUEwgdm9pZAorY3ZDYWxjT3B0aWNhbEZsb3dQeXJMSyggY29uc3Qgdm9pZCogYXJyQSwgY29uc3Qgdm9pZCogYXJyQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB5cmFyckEsIHZvaWQqIHB5cmFyckIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdlBvaW50MkQzMmYgKiBmZWF0dXJlc0EsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgKiBmZWF0dXJlc0IsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIEN2U2l6ZSB3aW5TaXplLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpzdGF0dXMsIGZsb2F0ICplcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhLCBpbnQgZmxhZ3MgKQoreworICAgIHVjaGFyICpweXJCdWZmZXIgPSAwOworICAgIHVjaGFyICpidWZmZXIgPSAwOworICAgIGZsb2F0KiBfZXJyb3IgPSAwOworICAgIGNoYXIqIF9zdGF0dXMgPSAwOworCisgICAgdm9pZCogaXBwX29wdGZsb3dfc3RhdGUgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjT3B0aWNhbEZsb3dQeXJMSyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGludCBNQVhfSVRFUlMgPSAxMDA7CisKKyAgICBDdk1hdCBzdHViQSwgKmltZ0EgPSAoQ3ZNYXQqKWFyckE7CisgICAgQ3ZNYXQgc3R1YkIsICppbWdCID0gKEN2TWF0KilhcnJCOworICAgIEN2TWF0IHBzdHViQSwgKnB5ckEgPSAoQ3ZNYXQqKXB5cmFyckE7CisgICAgQ3ZNYXQgcHN0dWJCLCAqcHlyQiA9IChDdk1hdCopcHlyYXJyQjsKKyAgICBDdlNpemUgaW1nU2l6ZTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgc21vb3RoS2VybmVsW10gPSB7IDAuMDkzNzUsIDAuMzEyNSwgMC4wOTM3NSB9OyAgLyogMy8zMiwgMTAvMzIsIDMvMzIgKi8KKyAgICAKKyAgICBpbnQgYnVmZmVyQnl0ZXMgPSAwOworICAgIHVjaGFyICoqaW1nSSA9IDA7CisgICAgdWNoYXIgKippbWdKID0gMDsKKyAgICBpbnQgKnN0ZXAgPSAwOworICAgIGRvdWJsZSAqc2NhbGUgPSAwOworICAgIEN2U2l6ZSogc2l6ZSA9IDA7CisKKyAgICBpbnQgdGhyZWFkQ291bnQgPSBjdkdldE51bVRocmVhZHMoKTsKKyAgICBmbG9hdCogX3BhdGNoSVtDVl9NQVhfVEhSRUFEU107CisgICAgZmxvYXQqIF9wYXRjaEpbQ1ZfTUFYX1RIUkVBRFNdOworICAgIGZsb2F0KiBfSXhbQ1ZfTUFYX1RIUkVBRFNdOworICAgIGZsb2F0KiBfSXlbQ1ZfTUFYX1RIUkVBRFNdOworCisgICAgaW50IGksIGw7CisKKyAgICBDdlNpemUgcGF0Y2hTaXplID0gY3ZTaXplKCB3aW5TaXplLndpZHRoICogMiArIDEsIHdpblNpemUuaGVpZ2h0ICogMiArIDEgKTsKKyAgICBpbnQgcGF0Y2hMZW4gPSBwYXRjaFNpemUud2lkdGggKiBwYXRjaFNpemUuaGVpZ2h0OworICAgIGludCBzcmNQYXRjaExlbiA9IChwYXRjaFNpemUud2lkdGggKyAyKSoocGF0Y2hTaXplLmhlaWdodCArIDIpOworCisgICAgQ1ZfQ0FMTCggaW1nQSA9IGN2R2V0TWF0KCBpbWdBLCAmc3R1YkEgKSk7CisgICAgQ1ZfQ0FMTCggaW1nQiA9IGN2R2V0TWF0KCBpbWdCLCAmc3R1YkIgKSk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIGltZ0EtPnR5cGUgKSAhPSBDVl84VUMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIGltZ0EsIGltZ0IgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggaW1nQSwgaW1nQiApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggaW1nQS0+c3RlcCAhPSBpbWdCLT5zdGVwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiaW1nQSBhbmQgaW1nQiBtdXN0IGhhdmUgZXF1YWwgc3RlcHMiICk7CisKKyAgICBpbWdTaXplID0gY3ZHZXRNYXRTaXplKCBpbWdBICk7CisKKyAgICBpZiggcHlyQSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBweXJBID0gY3ZHZXRNYXQoIHB5ckEsICZwc3R1YkEgKSk7CisKKyAgICAgICAgaWYoIHB5ckEtPnN0ZXAqcHlyQS0+aGVpZ2h0IDwgaWN2TWluaW1hbFB5cmFtaWRTaXplKCBpbWdTaXplICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInB5cmFtaWQgQSBoYXMgaW5zdWZmaWNpZW50IHNpemUiICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHB5ckEgPSAmcHN0dWJBOworICAgICAgICBweXJBLT5kYXRhLnB0ciA9IDA7CisgICAgfQorCisgICAgaWYoIHB5ckIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcHlyQiA9IGN2R2V0TWF0KCBweXJCLCAmcHN0dWJCICkpOworCisgICAgICAgIGlmKCBweXJCLT5zdGVwKnB5ckItPmhlaWdodCA8IGljdk1pbmltYWxQeXJhbWlkU2l6ZSggaW1nU2l6ZSApICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJweXJhbWlkIEIgaGFzIGluc3VmZmljaWVudCBzaXplIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBweXJCID0gJnBzdHViQjsKKyAgICAgICAgcHlyQi0+ZGF0YS5wdHIgPSAwOworICAgIH0KKworICAgIGlmKCBjb3VudCA9PSAwICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCAhZmVhdHVyZXNBIHx8ICFmZWF0dXJlc0IgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgYXJyYXlzIG9mIHBvaW50IGNvb3JkaW5hdGVzIGFyZSBtaXNzaW5nIiApOworCisgICAgaWYoIGNvdW50IDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIG51bWJlciBvZiB0cmFja2VkIHBvaW50cyBpcyBuZWdhdGl2ZSBvciB6ZXJvIiApOworCisgICAgaWYoIHdpblNpemUud2lkdGggPD0gMSB8fCB3aW5TaXplLmhlaWdodCA8PSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJJbnZhbGlkIHNlYXJjaCB3aW5kb3cgc2l6ZSIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCB0aHJlYWRDb3VudDsgaSsrICkKKyAgICAgICAgX3BhdGNoSVtpXSA9IF9wYXRjaEpbaV0gPSBfSXhbaV0gPSBfSXlbaV0gPSAwOworCisgICAgQ1ZfQ0FMTCggaWN2SW5pdFB5cmFtaWRhbEFsZ29yaXRobSggaW1nQSwgaW1nQiwgcHlyQSwgcHlyQiwKKyAgICAgICAgbGV2ZWwsICZjcml0ZXJpYSwgTUFYX0lURVJTLCBmbGFncywKKyAgICAgICAgJmltZ0ksICZpbWdKLCAmc3RlcCwgJnNpemUsICZzY2FsZSwgJnB5ckJ1ZmZlciApKTsKKworICAgIGlmKCAhc3RhdHVzICkKKyAgICAgICAgQ1ZfQ0FMTCggc3RhdHVzID0gX3N0YXR1cyA9IChjaGFyKiljdkFsbG9jKCBjb3VudCpzaXplb2YoX3N0YXR1c1swXSkgKSk7CisKKyNpZiAwCisgICAgaWYoIGljdk9wdGljYWxGbG93UHlyTEtJbml0QWxsb2NfOHVfQzFSX3AgJiYKKyAgICAgICAgaWN2T3B0aWNhbEZsb3dQeXJMS0ZyZWVfOHVfQzFSX3AgJiYKKyAgICAgICAgaWN2T3B0aWNhbEZsb3dQeXJMS184dV9DMVJfcCAmJgorICAgICAgICB3aW5TaXplLndpZHRoID09IHdpblNpemUuaGVpZ2h0ICYmCisgICAgICAgIGljdk9wdGljYWxGbG93UHlyTEtJbml0QWxsb2NfOHVfQzFSX3AoICZpcHBfb3B0Zmxvd19zdGF0ZSwgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luU2l6ZS53aWR0aCoyKzEsIGN2QWxnSGludEFjY3VyYXRlICkgPj0gMCApCisgICAgeworICAgICAgICBDdlB5cmFtaWQgaXBwX3B5ckEsIGlwcF9weXJCOworICAgICAgICBzdGF0aWMgY29uc3QgZG91YmxlIHJhdGVbXSA9IHsgMSwgMC41LCAwLjI1LCAwLjEyNSwgMC4wNjI1LCAwLjAzMTI1LCAwLjAxNTYyNSwgMC4wMDc4MTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDM5MDYyNSwgMC4wMDE5NTMxMjUsIDAuMDAwOTc2NTYyNSwgMC4wMDA0ODgyODEyNSwgMC4wMDAyNDQxNDA2MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEyMjA3MDMxMjUgfTsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBweXJhbWlkIHN0cnVjdHVyZXMKKyAgICAgICAgYXNzZXJ0KCBsZXZlbCA8IDE0ICk7CisgICAgICAgIGlwcF9weXJBLnB0ciA9IGltZ0k7CisgICAgICAgIGlwcF9weXJCLnB0ciA9IGltZ0o7CisgICAgICAgIGlwcF9weXJBLnN6ID0gaXBwX3B5ckIuc3ogPSBzaXplOworICAgICAgICBpcHBfcHlyQS5yYXRlID0gaXBwX3B5ckIucmF0ZSA9IChkb3VibGUqKXJhdGU7CisgICAgICAgIGlwcF9weXJBLnN0ZXAgPSBpcHBfcHlyQi5zdGVwID0gc3RlcDsKKyAgICAgICAgaXBwX3B5ckEuc3RhdGUgPSBpcHBfcHlyQi5zdGF0ZSA9IDA7CisgICAgICAgIGlwcF9weXJBLmxldmVsID0gaXBwX3B5ckIubGV2ZWwgPSBsZXZlbDsKKworICAgICAgICBpZiggIWVycm9yICkKKyAgICAgICAgICAgIENWX0NBTEwoIGVycm9yID0gX2Vycm9yID0gKGZsb2F0KiljdkFsbG9jKCBjb3VudCpzaXplb2YoX2Vycm9yWzBdKSApKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICBmZWF0dXJlc0JbaV0gPSBmZWF0dXJlc0FbaV07CisKKyAgICAgICAgaWYoIGljdk9wdGljYWxGbG93UHlyTEtfOHVfQzFSX3AoICZpcHBfcHlyQSwgJmlwcF9weXJCLAorICAgICAgICAgICAgKGNvbnN0IGZsb2F0KilmZWF0dXJlc0EsIChmbG9hdCopZmVhdHVyZXNCLCBzdGF0dXMsIGVycm9yLCBjb3VudCwKKyAgICAgICAgICAgIHdpblNpemUud2lkdGgqMiArIDEsIGxldmVsLCBjcml0ZXJpYS5tYXhfaXRlciwKKyAgICAgICAgICAgIChmbG9hdCljcml0ZXJpYS5lcHNpbG9uLCBpcHBfb3B0Zmxvd19zdGF0ZSApID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgc3RhdHVzW2ldID0gc3RhdHVzW2ldID09IDA7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBidWZmZXJfc2l6ZSA9IDxzaXplIGZvciBwYXRjaGVzPiArIDxzaXplIGZvciBweXJhbWlkcz4gKi8KKyAgICBidWZmZXJCeXRlcyA9IChzcmNQYXRjaExlbiArIHBhdGNoTGVuICogMykgKiBzaXplb2YoIF9wYXRjaElbMF1bMF0gKSAqIHRocmVhZENvdW50OworICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmZmVyQnl0ZXMgKSk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgdGhyZWFkQ291bnQ7IGkrKyApCisgICAgeworICAgICAgICBfcGF0Y2hJW2ldID0gaSA9PSAwID8gKGZsb2F0KilidWZmZXIgOiBfSXlbaS0xXSArIHBhdGNoTGVuOworICAgICAgICBfcGF0Y2hKW2ldID0gX3BhdGNoSVtpXSArIHNyY1BhdGNoTGVuOworICAgICAgICBfSXhbaV0gPSBfcGF0Y2hKW2ldICsgcGF0Y2hMZW47CisgICAgICAgIF9JeVtpXSA9IF9JeFtpXSArIHBhdGNoTGVuOworICAgIH0KKworICAgIG1lbXNldCggc3RhdHVzLCAxLCBjb3VudCApOworICAgIGlmKCBlcnJvciApCisgICAgICAgIG1lbXNldCggZXJyb3IsIDAsIGNvdW50KnNpemVvZihlcnJvclswXSkgKTsKKworICAgIGlmKCAhKGZsYWdzICYgQ1ZfTEtGTE9XX0lOSVRJQUxfR1VFU1NFUykgKQorICAgICAgICBtZW1jcHkoIGZlYXR1cmVzQiwgZmVhdHVyZXNBLCBjb3VudCpzaXplb2YoZmVhdHVyZXNBWzBdKSk7CisKKyAgICAvKiBkbyBwcm9jZXNzaW5nIGZyb20gdG9wIHB5cmFtaWQgbGV2ZWwgKHNtYWxsZXN0IGltYWdlKQorICAgICAgIHRvIHRoZSBib3R0b20gKG9yaWdpbmFsIGltYWdlKSAqLworICAgIGZvciggbCA9IGxldmVsOyBsID49IDA7IGwtLSApCisgICAgeworICAgICAgICBDdlNpemUgbGV2ZWxTaXplID0gc2l6ZVtsXTsKKyAgICAgICAgaW50IGxldmVsU3RlcCA9IHN0ZXBbbF07CisKKyAgICAgICAgeworI2lmZGVmIF9PUEVOTVAKKyAgICAgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKHRocmVhZENvdW50KSBzY2hlZHVsZShkeW5hbWljKSAKKyNlbmRpZiAvLyBfT1BFTk1QCisgICAgICAgIC8qIGZpbmQgZmxvdyBmb3IgZWFjaCBnaXZlbiBwb2ludCAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiB2OworICAgICAgICAgICAgQ3ZQb2ludCBtaW5JLCBtYXhJLCBtaW5KLCBtYXhKOworICAgICAgICAgICAgQ3ZTaXplIGlzeiwganN6OworICAgICAgICAgICAgaW50IHB0X3N0YXR1czsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiB1OworICAgICAgICAgICAgQ3ZQb2ludCBwcmV2X21pbkogPSB7IC0xLCAtMSB9LCBwcmV2X21heEogPSB7IC0xLCAtMSB9OworICAgICAgICAgICAgZG91YmxlIEd4eCA9IDAsIEd4eSA9IDAsIEd5eSA9IDAsIEQgPSAwLCBtaW5FaWcgPSAwOworICAgICAgICAgICAgZmxvYXQgcHJldl9teCA9IDAsIHByZXZfbXkgPSAwOworICAgICAgICAgICAgaW50IGosIHgsIHk7CisgICAgICAgICAgICBpbnQgdGhyZWFkSWR4ID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgICAgIGZsb2F0KiBwYXRjaEkgPSBfcGF0Y2hJW3RocmVhZElkeF07CisgICAgICAgICAgICBmbG9hdCogcGF0Y2hKID0gX3BhdGNoSlt0aHJlYWRJZHhdOworICAgICAgICAgICAgZmxvYXQqIEl4ID0gX0l4W3RocmVhZElkeF07CisgICAgICAgICAgICBmbG9hdCogSXkgPSBfSXlbdGhyZWFkSWR4XTsKKworICAgICAgICAgICAgdi54ID0gZmVhdHVyZXNCW2ldLng7CisgICAgICAgICAgICB2LnkgPSBmZWF0dXJlc0JbaV0ueTsKKyAgICAgICAgICAgIGlmKCBsIDwgbGV2ZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHYueCArPSB2Lng7CisgICAgICAgICAgICAgICAgdi55ICs9IHYueTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2LnggPSAoZmxvYXQpKHYueCAqIHNjYWxlW2xdKTsKKyAgICAgICAgICAgICAgICB2LnkgPSAoZmxvYXQpKHYueSAqIHNjYWxlW2xdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHRfc3RhdHVzID0gc3RhdHVzW2ldOworICAgICAgICAgICAgaWYoICFwdF9zdGF0dXMgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBtaW5JID0gbWF4SSA9IG1pbkogPSBtYXhKID0gY3ZQb2ludCggMCwgMCApOworCisgICAgICAgICAgICB1LnggPSAoZmxvYXQpIChmZWF0dXJlc0FbaV0ueCAqIHNjYWxlW2xdKTsKKyAgICAgICAgICAgIHUueSA9IChmbG9hdCkgKGZlYXR1cmVzQVtpXS55ICogc2NhbGVbbF0pOworCisgICAgICAgICAgICBpbnRlcnNlY3QoIHUsIHdpblNpemUsIGxldmVsU2l6ZSwgJm1pbkksICZtYXhJICk7CisgICAgICAgICAgICBpc3ogPSBqc3ogPSBjdlNpemUobWF4SS54IC0gbWluSS54ICsgMiwgbWF4SS55IC0gbWluSS55ICsgMik7CisgICAgICAgICAgICB1LnggKz0gKG1pbkkueCAtIChwYXRjaFNpemUud2lkdGggLSBtYXhJLnggKyAxKSkqMC41ZjsKKyAgICAgICAgICAgIHUueSArPSAobWluSS55IC0gKHBhdGNoU2l6ZS5oZWlnaHQgLSBtYXhJLnkgKyAxKSkqMC41ZjsKKworICAgICAgICAgICAgaWYoIGlzei53aWR0aCA8IDMgfHwgaXN6LmhlaWdodCA8IDMgfHwKKyAgICAgICAgICAgICAgICBpY3ZHZXRSZWN0U3ViUGl4Xzh1MzJmX0MxUiggaW1nSVtsXSwgbGV2ZWxTdGVwLCBsZXZlbFNpemUsCisgICAgICAgICAgICAgICAgICAgIHBhdGNoSSwgaXN6LndpZHRoKnNpemVvZihwYXRjaElbMF0pLCBpc3osIHUgKSA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHBvaW50IGlzIG91dHNpZGUgdGhlIGltYWdlLiB0YWtlIHRoZSBuZXh0ICovCisgICAgICAgICAgICAgICAgc3RhdHVzW2ldID0gMDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWN2Q2FsY0l4SXlfMzJmKCBwYXRjaEksIGlzei53aWR0aCpzaXplb2YocGF0Y2hJWzBdKSwgSXgsIEl5LAorICAgICAgICAgICAgICAgIChpc3oud2lkdGgtMikqc2l6ZW9mKHBhdGNoSVswXSksIGlzeiwgc21vb3RoS2VybmVsLCBwYXRjaEogKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNyaXRlcmlhLm1heF9pdGVyOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBieCA9IDAsIGJ5ID0gMDsKKyAgICAgICAgICAgICAgICBmbG9hdCBteCwgbXk7CisgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIF92OworCisgICAgICAgICAgICAgICAgaW50ZXJzZWN0KCB2LCB3aW5TaXplLCBsZXZlbFNpemUsICZtaW5KLCAmbWF4SiApOworCisgICAgICAgICAgICAgICAgbWluSi54ID0gTUFYKCBtaW5KLngsIG1pbkkueCApOworICAgICAgICAgICAgICAgIG1pbkoueSA9IE1BWCggbWluSi55LCBtaW5JLnkgKTsKKworICAgICAgICAgICAgICAgIG1heEoueCA9IE1JTiggbWF4Si54LCBtYXhJLnggKTsKKyAgICAgICAgICAgICAgICBtYXhKLnkgPSBNSU4oIG1heEoueSwgbWF4SS55ICk7CisKKyAgICAgICAgICAgICAgICBqc3ogPSBjdlNpemUobWF4Si54IC0gbWluSi54LCBtYXhKLnkgLSBtaW5KLnkpOworCisgICAgICAgICAgICAgICAgX3YueCA9IHYueCArIChtaW5KLnggLSAocGF0Y2hTaXplLndpZHRoIC0gbWF4Si54ICsgMSkpKjAuNWY7CisgICAgICAgICAgICAgICAgX3YueSA9IHYueSArIChtaW5KLnkgLSAocGF0Y2hTaXplLmhlaWdodCAtIG1heEoueSArIDEpKSowLjVmOworCisgICAgICAgICAgICAgICAgaWYoIGpzei53aWR0aCA8IDEgfHwganN6LmhlaWdodCA8IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgaWN2R2V0UmVjdFN1YlBpeF84dTMyZl9DMVIoIGltZ0pbbF0sIGxldmVsU3RlcCwgbGV2ZWxTaXplLCBwYXRjaEosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3oud2lkdGgqc2l6ZW9mKHBhdGNoSlswXSksIGpzeiwgX3YgKSA8IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcG9pbnQgaXMgb3V0c2lkZSBpbWFnZS4gdGFrZSB0aGUgbmV4dCAqLworICAgICAgICAgICAgICAgICAgICBwdF9zdGF0dXMgPSAwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggbWF4Si54ID09IHByZXZfbWF4Si54ICYmIG1heEoueSA9PSBwcmV2X21heEoueSAmJgorICAgICAgICAgICAgICAgICAgICBtaW5KLnggPT0gcHJldl9taW5KLnggJiYgbWluSi55ID09IHByZXZfbWluSi55ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBqc3ouaGVpZ2h0OyB5KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcGkgPSBwYXRjaEkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ICsgbWluSi55IC0gbWluSS55ICsgMSkqaXN6LndpZHRoICsgbWluSi54IC0gbWluSS54ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwaiA9IHBhdGNoSiArIHkqanN6LndpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGl4ID0gSXggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh5ICsgbWluSi55IC0gbWluSS55KSooaXN6LndpZHRoLTIpICsgbWluSi54IC0gbWluSS54OworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGl5ID0gSXkgKyAoaXggLSBJeCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBqc3oud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gcGlbeF0gLSBwalt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieCArPSB0MCAqIGl4W3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5ICs9IHQwICogaXlbeF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR3h4ID0gR3l5ID0gR3h5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IGpzei5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwaSA9IHBhdGNoSSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgKyBtaW5KLnkgLSBtaW5JLnkgKyAxKSppc3oud2lkdGggKyBtaW5KLnggLSBtaW5JLnggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHBqID0gcGF0Y2hKICsgeSpqc3oud2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogaXggPSBJeCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgKyBtaW5KLnkgLSBtaW5JLnkpKihpc3oud2lkdGgtMikgKyBtaW5KLnggLSBtaW5JLng7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogaXkgPSBJeSArIChpeCAtIEl4KTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGpzei53aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHBpW3hdIC0gcGpbeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnggKz0gKGRvdWJsZSkgKHQgKiBpeFt4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgKz0gKGRvdWJsZSkgKHQgKiBpeVt4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3h4ICs9IGl4W3hdICogaXhbeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3h5ICs9IGl4W3hdICogaXlbeF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3l5ICs9IGl5W3hdICogaXlbeF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBEID0gR3h4ICogR3l5IC0gR3h5ICogR3h5OworICAgICAgICAgICAgICAgICAgICBpZiggRCA8IERCTF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQWRpIFNoYXZpdCAtIDIwMDguMDUKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWdzICYgQ1ZfTEtGTE9XX0dFVF9NSU5fRUlHRU5WQUxTICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbkVpZyA9IChHeXkgKyBHeHggLSBzcXJ0KChHeHgtR3l5KSooR3h4LUd5eSkgKyA0LipHeHkqR3h5KSkvKDIqanN6LmhlaWdodCpqc3oud2lkdGgpOworCisgICAgICAgICAgICAgICAgICAgIEQgPSAxLiAvIEQ7CisKKyAgICAgICAgICAgICAgICAgICAgcHJldl9taW5KID0gbWluSjsKKyAgICAgICAgICAgICAgICAgICAgcHJldl9tYXhKID0gbWF4SjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteCA9IChmbG9hdCkgKChHeXkgKiBieCAtIEd4eSAqIGJ5KSAqIEQpOworICAgICAgICAgICAgICAgIG15ID0gKGZsb2F0KSAoKEd4eCAqIGJ5IC0gR3h5ICogYngpICogRCk7CisKKyAgICAgICAgICAgICAgICB2LnggKz0gbXg7CisgICAgICAgICAgICAgICAgdi55ICs9IG15OworCisgICAgICAgICAgICAgICAgaWYoIG14ICogbXggKyBteSAqIG15IDwgY3JpdGVyaWEuZXBzaWxvbiApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgaWYoIGogPiAwICYmIGZhYnMobXggKyBwcmV2X214KSA8IDAuMDEgJiYgZmFicyhteSArIHByZXZfbXkpIDwgMC4wMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2LnggLT0gbXgqMC41ZjsKKyAgICAgICAgICAgICAgICAgICAgdi55IC09IG15KjAuNWY7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmV2X214ID0gbXg7CisgICAgICAgICAgICAgICAgcHJldl9teSA9IG15OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmZWF0dXJlc0JbaV0gPSB2OworICAgICAgICAgICAgc3RhdHVzW2ldID0gKGNoYXIpcHRfc3RhdHVzOworICAgICAgICAgICAgaWYoIGwgPT0gMCAmJiBlcnJvciAmJiBwdF9zdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNhbGMgZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBkb3VibGUgZXJyID0gMDsKKyAgICAgICAgICAgICAgICBpZiggZmxhZ3MgJiBDVl9MS0ZMT1dfR0VUX01JTl9FSUdFTlZBTFMgKQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBtaW5FaWc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IGpzei5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBwaSA9IHBhdGNoSSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHkgKyBtaW5KLnkgLSBtaW5JLnkgKyAxKSppc3oud2lkdGggKyBtaW5KLnggLSBtaW5JLnggKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHBqID0gcGF0Y2hKICsgeSpqc3oud2lkdGg7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBqc3oud2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSBwaVt4XSAtIHBqW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciArPSB0ICogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSBzcXJ0KGVycik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVycm9yW2ldID0gKGZsb2F0KWVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBlbmQgb2YgcG9pbnQgcHJvY2Vzc2luZyBsb29wIChpKQorICAgICAgICB9CisgICAgfSAvLyBlbmQgb2YgcHlyYW1pZCBsZXZlbHMgbG9vcCAobCkKKworICAgIF9fRU5EX187CisKKyAgICBpZiggaXBwX29wdGZsb3dfc3RhdGUgKQorICAgICAgICBpY3ZPcHRpY2FsRmxvd1B5ckxLRnJlZV84dV9DMVJfcCggaXBwX29wdGZsb3dfc3RhdGUgKTsKKworICAgIGN2RnJlZSggJnB5ckJ1ZmZlciApOworICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIGN2RnJlZSggJl9lcnJvciApOworICAgIGN2RnJlZSggJl9zdGF0dXMgKTsKK30KKworCisvKiBBZmZpbmUgdHJhY2tpbmcgYWxnb3JpdGhtICovCisKK0NWX0lNUEwgdm9pZAorY3ZDYWxjQWZmaW5lRmxvd1B5ckxLKCBjb25zdCB2b2lkKiBhcnJBLCBjb25zdCB2b2lkKiBhcnJCLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBweXJhcnJBLCB2b2lkKiBweXJhcnJCLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdlBvaW50MkQzMmYgKiBmZWF0dXJlc0EsCisgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiAqIGZlYXR1cmVzQiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm1hdHJpY2VzLCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSB3aW5TaXplLCBpbnQgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnN0YXR1cywgZmxvYXQgKmVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwgaW50IGZsYWdzICkKK3sKKyAgICBjb25zdCBpbnQgTUFYX0lURVJTID0gMTAwOworCisgICAgY2hhciogX3N0YXR1cyA9IDA7CisgICAgdWNoYXIgKmJ1ZmZlciA9IDA7CisgICAgdWNoYXIgKnB5cl9idWZmZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNhbGNBZmZpbmVGbG93UHlyTEsiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViQSwgKmltZ0EgPSAoQ3ZNYXQqKWFyckE7CisgICAgQ3ZNYXQgc3R1YkIsICppbWdCID0gKEN2TWF0KilhcnJCOworICAgIEN2TWF0IHBzdHViQSwgKnB5ckEgPSAoQ3ZNYXQqKXB5cmFyckE7CisgICAgQ3ZNYXQgcHN0dWJCLCAqcHlyQiA9IChDdk1hdCopcHlyYXJyQjsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzbW9vdGhLZXJuZWxbXSA9IHsgMC4wOTM3NSwgMC4zMTI1LCAwLjA5Mzc1IH07ICAvKiAzLzMyLCAxMC8zMiwgMy8zMiAqLworCisgICAgaW50IGJ1ZmZlckJ5dGVzID0gMDsKKworICAgIHVjaGFyICoqaW1nSSA9IDA7CisgICAgdWNoYXIgKippbWdKID0gMDsKKyAgICBpbnQgKnN0ZXAgPSAwOworICAgIGRvdWJsZSAqc2NhbGUgPSAwOworICAgIEN2U2l6ZSogc2l6ZSA9IDA7CisKKyAgICBmbG9hdCAqcGF0Y2hJOworICAgIGZsb2F0ICpwYXRjaEo7CisgICAgZmxvYXQgKkl4OworICAgIGZsb2F0ICpJeTsKKworICAgIGludCBpLCBqLCBrLCBsOworCisgICAgQ3ZTaXplIHBhdGNoU2l6ZSA9IGN2U2l6ZSggd2luU2l6ZS53aWR0aCAqIDIgKyAxLCB3aW5TaXplLmhlaWdodCAqIDIgKyAxICk7CisgICAgaW50IHBhdGNoTGVuID0gcGF0Y2hTaXplLndpZHRoICogcGF0Y2hTaXplLmhlaWdodDsKKyAgICBpbnQgcGF0Y2hTdGVwID0gcGF0Y2hTaXplLndpZHRoICogc2l6ZW9mKCBwYXRjaElbMF0gKTsKKworICAgIEN2U2l6ZSBzcmNQYXRjaFNpemUgPSBjdlNpemUoIHBhdGNoU2l6ZS53aWR0aCArIDIsIHBhdGNoU2l6ZS5oZWlnaHQgKyAyICk7CisgICAgaW50IHNyY1BhdGNoTGVuID0gc3JjUGF0Y2hTaXplLndpZHRoICogc3JjUGF0Y2hTaXplLmhlaWdodDsKKyAgICBpbnQgc3JjUGF0Y2hTdGVwID0gc3JjUGF0Y2hTaXplLndpZHRoICogc2l6ZW9mKCBwYXRjaElbMF0gKTsKKyAgICBDdlNpemUgaW1nU2l6ZTsKKyAgICBmbG9hdCBlcHMgPSAoZmxvYXQpTUlOKHdpblNpemUud2lkdGgsIHdpblNpemUuaGVpZ2h0KTsKKworICAgIENWX0NBTEwoIGltZ0EgPSBjdkdldE1hdCggaW1nQSwgJnN0dWJBICkpOworICAgIENWX0NBTEwoIGltZ0IgPSBjdkdldE1hdCggaW1nQiwgJnN0dWJCICkpOworCisgICAgaWYoIENWX01BVF9UWVBFKCBpbWdBLT50eXBlICkgIT0gQ1ZfOFVDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBpbWdBLCBpbWdCICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIGltZ0EsIGltZ0IgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoIGltZ0EtPnN0ZXAgIT0gaW1nQi0+c3RlcCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgImltZ0EgYW5kIGltZ0IgbXVzdCBoYXZlIGVxdWFsIHN0ZXBzIiApOworCisgICAgaWYoICFtYXRyaWNlcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaW1nU2l6ZSA9IGN2R2V0TWF0U2l6ZSggaW1nQSApOworCisgICAgaWYoIHB5ckEgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcHlyQSA9IGN2R2V0TWF0KCBweXJBLCAmcHN0dWJBICkpOworCisgICAgICAgIGlmKCBweXJBLT5zdGVwKnB5ckEtPmhlaWdodCA8IGljdk1pbmltYWxQeXJhbWlkU2l6ZSggaW1nU2l6ZSApICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJweXJhbWlkIEEgaGFzIGluc3VmZmljaWVudCBzaXplIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBweXJBID0gJnBzdHViQTsKKyAgICAgICAgcHlyQS0+ZGF0YS5wdHIgPSAwOworICAgIH0KKworICAgIGlmKCBweXJCICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHB5ckIgPSBjdkdldE1hdCggcHlyQiwgJnBzdHViQiApKTsKKworICAgICAgICBpZiggcHlyQi0+c3RlcCpweXJCLT5oZWlnaHQgPCBpY3ZNaW5pbWFsUHlyYW1pZFNpemUoIGltZ1NpemUgKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAicHlyYW1pZCBCIGhhcyBpbnN1ZmZpY2llbnQgc2l6ZSIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcHlyQiA9ICZwc3R1YkI7CisgICAgICAgIHB5ckItPmRhdGEucHRyID0gMDsKKyAgICB9CisKKyAgICBpZiggY291bnQgPT0gMCApCisgICAgICAgIEVYSVQ7CisKKyAgICAvKiBjaGVjayBpbnB1dCBhcmd1bWVudHMgKi8KKyAgICBpZiggIWZlYXR1cmVzQSB8fCAhZmVhdHVyZXNCIHx8ICFtYXRyaWNlcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIHdpblNpemUud2lkdGggPD0gMSB8fCB3aW5TaXplLmhlaWdodCA8PSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJ0aGUgc2VhcmNoIHdpbmRvdyBpcyB0b28gc21hbGwiICk7CisKKyAgICBpZiggY291bnQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBDVl9DQUxMKCBpY3ZJbml0UHlyYW1pZGFsQWxnb3JpdGhtKCBpbWdBLCBpbWdCLAorICAgICAgICBweXJBLCBweXJCLCBsZXZlbCwgJmNyaXRlcmlhLCBNQVhfSVRFUlMsIGZsYWdzLAorICAgICAgICAmaW1nSSwgJmltZ0osICZzdGVwLCAmc2l6ZSwgJnNjYWxlLCAmcHlyX2J1ZmZlciApKTsKKworICAgIC8qIGJ1ZmZlcl9zaXplID0gPHNpemUgZm9yIHBhdGNoZXM+ICsgPHNpemUgZm9yIHB5cmFtaWRzPiAqLworICAgIGJ1ZmZlckJ5dGVzID0gKHNyY1BhdGNoTGVuICsgcGF0Y2hMZW4qMykqc2l6ZW9mKHBhdGNoSVswXSkgKyAoMzYqMiArIDYpKnNpemVvZihkb3VibGUpOworCisgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKGJ1ZmZlckJ5dGVzKSk7CisKKyAgICBpZiggIXN0YXR1cyApCisgICAgICAgIENWX0NBTEwoIHN0YXR1cyA9IF9zdGF0dXMgPSAoY2hhciopY3ZBbGxvYyhjb3VudCkgKTsKKworICAgIHBhdGNoSSA9IChmbG9hdCAqKSBidWZmZXI7CisgICAgcGF0Y2hKID0gcGF0Y2hJICsgc3JjUGF0Y2hMZW47CisgICAgSXggPSBwYXRjaEogKyBwYXRjaExlbjsKKyAgICBJeSA9IEl4ICsgcGF0Y2hMZW47CisKKyAgICBpZiggc3RhdHVzICkKKyAgICAgICAgbWVtc2V0KCBzdGF0dXMsIDEsIGNvdW50ICk7CisKKyAgICBpZiggIShmbGFncyAmIENWX0xLRkxPV19JTklUSUFMX0dVRVNTRVMpICkKKyAgICB7CisgICAgICAgIG1lbWNweSggZmVhdHVyZXNCLCBmZWF0dXJlc0EsIGNvdW50ICogc2l6ZW9mKCBmZWF0dXJlc0FbMF0gKSk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudCAqIDQ7IGkgKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdHJpY2VzW2ldID0gbWF0cmljZXNbaSArIDNdID0gMS5mOworICAgICAgICAgICAgbWF0cmljZXNbaSArIDFdID0gbWF0cmljZXNbaSArIDJdID0gMC5mOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZmVhdHVyZXNCW2ldLnggPSAoZmxvYXQpKGZlYXR1cmVzQltpXS54ICogc2NhbGVbbGV2ZWxdICogMC41KTsKKyAgICAgICAgZmVhdHVyZXNCW2ldLnkgPSAoZmxvYXQpKGZlYXR1cmVzQltpXS55ICogc2NhbGVbbGV2ZWxdICogMC41KTsKKyAgICB9CisKKyAgICAvKiBkbyBwcm9jZXNzaW5nIGZyb20gdG9wIHB5cmFtaWQgbGV2ZWwgKHNtYWxsZXN0IGltYWdlKQorICAgICAgIHRvIHRoZSBib3R0b20gKG9yaWdpbmFsIGltYWdlKSAqLworICAgIGZvciggbCA9IGxldmVsOyBsID49IDA7IGwtLSApCisgICAgeworICAgICAgICBDdlNpemUgbGV2ZWxTaXplID0gc2l6ZVtsXTsKKyAgICAgICAgaW50IGxldmVsU3RlcCA9IHN0ZXBbbF07CisKKyAgICAgICAgLyogZmluZCBmbG93IGZvciBlYWNoIGdpdmVuIHBvaW50IGF0IHRoZSBwYXJ0aWN1bGFyIGxldmVsICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIHU7CisgICAgICAgICAgICBmbG9hdCBBdls2XTsKKyAgICAgICAgICAgIGRvdWJsZSBHWzM2XTsKKyAgICAgICAgICAgIGRvdWJsZSBtZWFuSSA9IDAsIG1lYW5KID0gMDsKKyAgICAgICAgICAgIGludCB4LCB5OworICAgICAgICAgICAgaW50IHB0X3N0YXR1cyA9IHN0YXR1c1tpXTsKKyAgICAgICAgICAgIEN2TWF0IG1hdDsKKworICAgICAgICAgICAgaWYoICFwdF9zdGF0dXMgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBBdlswXSA9IG1hdHJpY2VzW2kqNF07CisgICAgICAgICAgICBBdlsxXSA9IG1hdHJpY2VzW2kqNCsxXTsKKyAgICAgICAgICAgIEF2WzNdID0gbWF0cmljZXNbaSo0KzJdOworICAgICAgICAgICAgQXZbNF0gPSBtYXRyaWNlc1tpKjQrM107CisKKyAgICAgICAgICAgIEF2WzJdID0gZmVhdHVyZXNCW2ldLnggKz0gZmVhdHVyZXNCW2ldLng7CisgICAgICAgICAgICBBdls1XSA9IGZlYXR1cmVzQltpXS55ICs9IGZlYXR1cmVzQltpXS55OworCisgICAgICAgICAgICB1LnggPSAoZmxvYXQpIChmZWF0dXJlc0FbaV0ueCAqIHNjYWxlW2xdKTsKKyAgICAgICAgICAgIHUueSA9IChmbG9hdCkgKGZlYXR1cmVzQVtpXS55ICogc2NhbGVbbF0pOworCisgICAgICAgICAgICBpZiggdS54IDwgLWVwcyB8fCB1LnggPj0gbGV2ZWxTaXplLndpZHRoK2VwcyB8fAorICAgICAgICAgICAgICAgIHUueSA8IC1lcHMgfHwgdS55ID49IGxldmVsU2l6ZS5oZWlnaHQrZXBzIHx8CisgICAgICAgICAgICAgICAgaWN2R2V0UmVjdFN1YlBpeF84dTMyZl9DMVIoIGltZ0lbbF0sIGxldmVsU3RlcCwKKyAgICAgICAgICAgICAgICBsZXZlbFNpemUsIHBhdGNoSSwgc3JjUGF0Y2hTdGVwLCBzcmNQYXRjaFNpemUsIHUgKSA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHBvaW50IGlzIG91dHNpZGUgdGhlIGltYWdlLiB0YWtlIHRoZSBuZXh0ICovCisgICAgICAgICAgICAgICAgaWYoIGwgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c1tpXSA9IDA7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGljdkNhbGNJeEl5XzMyZiggcGF0Y2hJLCBzcmNQYXRjaFN0ZXAsIEl4LCBJeSwKKyAgICAgICAgICAgICAgICAoc3JjUGF0Y2hTaXplLndpZHRoLTIpKnNpemVvZihwYXRjaElbMF0pLCBzcmNQYXRjaFNpemUsCisgICAgICAgICAgICAgICAgc21vb3RoS2VybmVsLCBwYXRjaEogKTsKKworICAgICAgICAgICAgLyogcmVwYWNrIHBhdGNoSSAocmVtb3ZlIGJvcmRlcnMpICovCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgcGF0Y2hTaXplLmhlaWdodDsgaysrICkKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHBhdGNoSSArIGsgKiBwYXRjaFNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaEkgKyAoayArIDEpICogc3JjUGF0Y2hTaXplLndpZHRoICsgMSwgcGF0Y2hTdGVwICk7CisKKyAgICAgICAgICAgIG1lbXNldCggRywgMCwgc2l6ZW9mKCBHICkpOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgRyBtYXRyaXggKi8KKyAgICAgICAgICAgIGZvciggeSA9IC13aW5TaXplLmhlaWdodCwgayA9IDA7IHkgPD0gd2luU2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCB4ID0gLXdpblNpemUud2lkdGg7IHggPD0gd2luU2l6ZS53aWR0aDsgeCsrLCBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGl4aXggPSAoKGRvdWJsZSkgSXhba10pICogSXhba107CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpeGl5ID0gKChkb3VibGUpIEl4W2tdKSAqIEl5W2tdOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgaXlpeSA9ICgoZG91YmxlKSBJeVtrXSkgKiBJeVtrXTsKKworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeHgsIHh5LCB5eTsKKworICAgICAgICAgICAgICAgICAgICBHWzBdICs9IGl4aXg7CisgICAgICAgICAgICAgICAgICAgIEdbMV0gKz0gaXhpeTsKKyAgICAgICAgICAgICAgICAgICAgR1syXSArPSB4ICogaXhpeDsKKyAgICAgICAgICAgICAgICAgICAgR1szXSArPSB5ICogaXhpeDsKKyAgICAgICAgICAgICAgICAgICAgR1s0XSArPSB4ICogaXhpeTsKKyAgICAgICAgICAgICAgICAgICAgR1s1XSArPSB5ICogaXhpeTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHWzZdID09IEdbMV0KKyAgICAgICAgICAgICAgICAgICAgR1s3XSArPSBpeWl5OworICAgICAgICAgICAgICAgICAgICAvLyBHWzhdID09IEdbNF0KKyAgICAgICAgICAgICAgICAgICAgLy8gR1s5XSA9PSBHWzVdCisgICAgICAgICAgICAgICAgICAgIEdbMTBdICs9IHggKiBpeWl5OworICAgICAgICAgICAgICAgICAgICBHWzExXSArPSB5ICogaXlpeTsKKworICAgICAgICAgICAgICAgICAgICB4eCA9IHggKiB4OworICAgICAgICAgICAgICAgICAgICB4eSA9IHggKiB5OworICAgICAgICAgICAgICAgICAgICB5eSA9IHkgKiB5OworCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMTJdID09IEdbMl0KKyAgICAgICAgICAgICAgICAgICAgLy8gR1sxM10gPT0gR1s4XSA9PSBHWzRdCisgICAgICAgICAgICAgICAgICAgIEdbMTRdICs9IHh4ICogaXhpeDsKKyAgICAgICAgICAgICAgICAgICAgR1sxNV0gKz0geHkgKiBpeGl4OworICAgICAgICAgICAgICAgICAgICBHWzE2XSArPSB4eCAqIGl4aXk7CisgICAgICAgICAgICAgICAgICAgIEdbMTddICs9IHh5ICogaXhpeTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHWzE4XSA9PSBHWzNdCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMTldID09IEdbOV0KKyAgICAgICAgICAgICAgICAgICAgLy8gR1syMF0gPT0gR1sxNV0KKyAgICAgICAgICAgICAgICAgICAgR1syMV0gKz0geXkgKiBpeGl4OworICAgICAgICAgICAgICAgICAgICAvLyBHWzIyXSA9PSBHWzE3XQorICAgICAgICAgICAgICAgICAgICBHWzIzXSArPSB5eSAqIGl4aXk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gR1syNF0gPT0gR1s0XQorICAgICAgICAgICAgICAgICAgICAvLyBHWzI1XSA9PSBHWzEwXQorICAgICAgICAgICAgICAgICAgICAvLyBHWzI2XSA9PSBHWzE2XQorICAgICAgICAgICAgICAgICAgICAvLyBHWzI3XSA9PSBHWzIyXQorICAgICAgICAgICAgICAgICAgICBHWzI4XSArPSB4eCAqIGl5aXk7CisgICAgICAgICAgICAgICAgICAgIEdbMjldICs9IHh5ICogaXlpeTsKKworICAgICAgICAgICAgICAgICAgICAvLyBHWzMwXSA9PSBHWzVdCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMzFdID09IEdbMTFdCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMzJdID09IEdbMTddCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMzNdID09IEdbMjNdCisgICAgICAgICAgICAgICAgICAgIC8vIEdbMzRdID09IEdbMjldCisgICAgICAgICAgICAgICAgICAgIEdbMzVdICs9IHl5ICogaXlpeTsKKworICAgICAgICAgICAgICAgICAgICBtZWFuSSArPSBwYXRjaElba107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZWFuSSAvPSBwYXRjaFNpemUud2lkdGgqcGF0Y2hTaXplLmhlaWdodDsKKworICAgICAgICAgICAgR1s4XSA9IEdbNF07CisgICAgICAgICAgICBHWzldID0gR1s1XTsKKyAgICAgICAgICAgIEdbMjJdID0gR1sxN107CisKKyAgICAgICAgICAgIC8vIGZpbGwgcGFydCBvZiBHIGJlbG93IGl0cyBkaWFnb25hbAorICAgICAgICAgICAgZm9yKCB5ID0gMTsgeSA8IDY7IHkrKyApCisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHk7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIEdbeSAqIDYgKyB4XSA9IEdbeCAqIDYgKyB5XTsKKworICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmbWF0LCA2LCA2LCBDVl82NEZDMSwgRyApOworCisgICAgICAgICAgICBpZiggY3ZJbnZlcnQoICZtYXQsICZtYXQsIENWX1NWRCApIDwgMWUtNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogYmFkIG1hdHJpeC4gdGFrZSB0aGUgbmV4dCBwb2ludCAqLworICAgICAgICAgICAgICAgIGlmKCBsID09IDAgKQorICAgICAgICAgICAgICAgICAgICBzdGF0dXNbaV0gPSAwOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY3JpdGVyaWEubWF4X2l0ZXI7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGJbNl0gPSB7MCwwLDAsMCwwLDB9LCBldGFbNl07CisgICAgICAgICAgICAgICAgZG91YmxlIHQwLCB0MSwgcyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiggQXZbMl0gPCAtZXBzIHx8IEF2WzJdID49IGxldmVsU2l6ZS53aWR0aCtlcHMgfHwKKyAgICAgICAgICAgICAgICAgICAgQXZbNV0gPCAtZXBzIHx8IEF2WzVdID49IGxldmVsU2l6ZS5oZWlnaHQrZXBzIHx8CisgICAgICAgICAgICAgICAgICAgIGljdkdldFF1YWRyYW5nbGVTdWJQaXhfOHUzMmZfQzFSKCBpbWdKW2xdLCBsZXZlbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgIGxldmVsU2l6ZSwgcGF0Y2hKLCBwYXRjaFN0ZXAsIHBhdGNoU2l6ZSwgQXYgKSA8IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRfc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKCB5ID0gLXdpblNpemUuaGVpZ2h0LCBrID0gMCwgbWVhbkogPSAwOyB5IDw9IHdpblNpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAtd2luU2l6ZS53aWR0aDsgeCA8PSB3aW5TaXplLndpZHRoOyB4KyssIGsrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBtZWFuSiArPSBwYXRjaEpba107CisKKyAgICAgICAgICAgICAgICBtZWFuSiA9IG1lYW5KIC8gKHBhdGNoU2l6ZS53aWR0aCAqIHBhdGNoU2l6ZS5oZWlnaHQpIC0gbWVhbkk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAtd2luU2l6ZS5oZWlnaHQsIGsgPSAwOyB5IDw9IHdpblNpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gLXdpblNpemUud2lkdGg7IHggPD0gd2luU2l6ZS53aWR0aDsgeCsrLCBrKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHBhdGNoSVtrXSAtIHBhdGNoSltrXSArIG1lYW5KOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGl4dCA9IEl4W2tdICogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpeXQgPSBJeVtrXSAqIHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgYlswXSArPSBpeHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBiWzFdICs9IGl5dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJbMl0gKz0geCAqIGl4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJbM10gKz0geSAqIGl4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJbNF0gKz0geCAqIGl5dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJbNV0gKz0geSAqIGl5dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGljdlRyYW5zZm9ybVZlY3Rvcl82NGQoIEcsIGIsIGV0YSwgNiwgNiApOworCisgICAgICAgICAgICAgICAgQXZbMl0gPSAoZmxvYXQpKEF2WzJdICsgQXZbMF0gKiBldGFbMF0gKyBBdlsxXSAqIGV0YVsxXSk7CisgICAgICAgICAgICAgICAgQXZbNV0gPSAoZmxvYXQpKEF2WzVdICsgQXZbM10gKiBldGFbMF0gKyBBdls0XSAqIGV0YVsxXSk7CisKKyAgICAgICAgICAgICAgICB0MCA9IEF2WzBdICogKDEgKyBldGFbMl0pICsgQXZbMV0gKiBldGFbNF07CisgICAgICAgICAgICAgICAgdDEgPSBBdlswXSAqIGV0YVszXSArIEF2WzFdICogKDEgKyBldGFbNV0pOworICAgICAgICAgICAgICAgIEF2WzBdID0gKGZsb2F0KXQwOworICAgICAgICAgICAgICAgIEF2WzFdID0gKGZsb2F0KXQxOworCisgICAgICAgICAgICAgICAgdDAgPSBBdlszXSAqICgxICsgZXRhWzJdKSArIEF2WzRdICogZXRhWzRdOworICAgICAgICAgICAgICAgIHQxID0gQXZbM10gKiBldGFbM10gKyBBdls0XSAqICgxICsgZXRhWzVdKTsKKyAgICAgICAgICAgICAgICBBdlszXSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgICAgICBBdls0XSA9IChmbG9hdCl0MTsKKworICAgICAgICAgICAgICAgIGlmKCBldGFbMF0gKiBldGFbMF0gKyBldGFbMV0gKiBldGFbMV0gPCBjcml0ZXJpYS5lcHNpbG9uICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBwdF9zdGF0dXMgIT0gMCB8fCBsID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXR1c1tpXSA9IChjaGFyKXB0X3N0YXR1czsKKyAgICAgICAgICAgICAgICBmZWF0dXJlc0JbaV0ueCA9IEF2WzJdOworICAgICAgICAgICAgICAgIGZlYXR1cmVzQltpXS55ID0gQXZbNV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtYXRyaWNlc1tpKjRdID0gQXZbMF07CisgICAgICAgICAgICAgICAgbWF0cmljZXNbaSo0KzFdID0gQXZbMV07CisgICAgICAgICAgICAgICAgbWF0cmljZXNbaSo0KzJdID0gQXZbM107CisgICAgICAgICAgICAgICAgbWF0cmljZXNbaSo0KzNdID0gQXZbNF07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBwdF9zdGF0dXMgJiYgbCA9PSAwICYmIGVycm9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBjYWxjIGVycm9yICovCisgICAgICAgICAgICAgICAgZG91YmxlIGVyciA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwLCBrID0gMDsgeSA8IHBhdGNoU2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgcGF0Y2hTaXplLndpZHRoOyB4KyssIGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gcGF0Y2hJW2tdIC0gcGF0Y2hKW2tdICsgbWVhbko7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgKz0gdCAqIHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZXJyb3JbaV0gPSAoZmxvYXQpc3FydChlcnIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnB5cl9idWZmZXIgKTsKKyAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBjdkZyZWUoICZfc3RhdHVzICk7Cit9CisKKworCitzdGF0aWMgdm9pZAoraWN2R2V0UlRNYXRyaXgoIGNvbnN0IEN2UG9pbnQyRDMyZiogYSwgY29uc3QgQ3ZQb2ludDJEMzJmKiBiLAorICAgICAgICAgICAgICAgIGludCBjb3VudCwgQ3ZNYXQqIE0sIGludCBmdWxsX2FmZmluZSApCit7CisgICAgaWYoIGZ1bGxfYWZmaW5lICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzYVszNl0sIHNiWzZdOworICAgICAgICBDdk1hdCBBID0gY3ZNYXQoIDYsIDYsIENWXzY0Riwgc2EgKSwgQiA9IGN2TWF0KCA2LCAxLCBDVl82NEYsIHNiICk7CisgICAgICAgIEN2TWF0IE1NID0gY3ZNYXQoIDYsIDEsIENWXzY0RiwgTS0+ZGF0YS5kYiApOworCisgICAgICAgIGludCBpOworCisgICAgICAgIG1lbXNldCggc2EsIDAsIHNpemVvZihzYSkgKTsKKyAgICAgICAgbWVtc2V0KCBzYiwgMCwgc2l6ZW9mKHNiKSApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc2FbMF0gKz0gYVtpXS54KmFbaV0ueDsKKyAgICAgICAgICAgIHNhWzFdICs9IGFbaV0ueSphW2ldLng7CisgICAgICAgICAgICBzYVsyXSArPSBhW2ldLng7CisKKyAgICAgICAgICAgIHNhWzZdICs9IGFbaV0ueCphW2ldLnk7CisgICAgICAgICAgICBzYVs3XSArPSBhW2ldLnkqYVtpXS55OworICAgICAgICAgICAgc2FbOF0gKz0gYVtpXS55OworCisgICAgICAgICAgICBzYVsxMl0gKz0gYVtpXS54OworICAgICAgICAgICAgc2FbMTNdICs9IGFbaV0ueTsKKyAgICAgICAgICAgIHNhWzE0XSArPSAxOworCisgICAgICAgICAgICBzYlswXSArPSBhW2ldLngqYltpXS54OworICAgICAgICAgICAgc2JbMV0gKz0gYVtpXS55KmJbaV0ueDsKKyAgICAgICAgICAgIHNiWzJdICs9IGJbaV0ueDsKKyAgICAgICAgICAgIHNiWzNdICs9IGFbaV0ueCpiW2ldLnk7CisgICAgICAgICAgICBzYls0XSArPSBhW2ldLnkqYltpXS55OworICAgICAgICAgICAgc2JbNV0gKz0gYltpXS55OworICAgICAgICB9CisKKyAgICAgICAgc2FbMjFdID0gc2FbMF07CisgICAgICAgIHNhWzIyXSA9IHNhWzFdOworICAgICAgICBzYVsyM10gPSBzYVsyXTsKKyAgICAgICAgc2FbMjddID0gc2FbNl07CisgICAgICAgIHNhWzI4XSA9IHNhWzddOworICAgICAgICBzYVsyOV0gPSBzYVs4XTsKKyAgICAgICAgc2FbMzNdID0gc2FbMTJdOworICAgICAgICBzYVszNF0gPSBzYVsxM107CisgICAgICAgIHNhWzM1XSA9IHNhWzE0XTsKKworICAgICAgICBjdlNvbHZlKCAmQSwgJkIsICZNTSwgQ1ZfU1ZEICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRvdWJsZSBzYVsxNl0sIHNiWzRdLCBtWzRdLCAqb20gPSBNLT5kYXRhLmRiOworICAgICAgICBDdk1hdCBBID0gY3ZNYXQoIDQsIDQsIENWXzY0Riwgc2EgKSwgQiA9IGN2TWF0KCA0LCAxLCBDVl82NEYsIHNiICk7CisgICAgICAgIEN2TWF0IE1NID0gY3ZNYXQoIDQsIDEsIENWXzY0RiwgbSApOworCisgICAgICAgIGludCBpOworCisgICAgICAgIG1lbXNldCggc2EsIDAsIHNpemVvZihzYSkgKTsKKyAgICAgICAgbWVtc2V0KCBzYiwgMCwgc2l6ZW9mKHNiKSApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc2FbMF0gKz0gYVtpXS54KmFbaV0ueCArIGFbaV0ueSphW2ldLnk7CisgICAgICAgICAgICBzYVsxXSArPSAwOworICAgICAgICAgICAgc2FbMl0gKz0gYVtpXS54OworICAgICAgICAgICAgc2FbM10gKz0gYVtpXS55OworCisgICAgICAgICAgICBzYVs0XSArPSAwOworICAgICAgICAgICAgc2FbNV0gKz0gYVtpXS54KmFbaV0ueCArIGFbaV0ueSphW2ldLnk7CisgICAgICAgICAgICBzYVs2XSArPSAtYVtpXS55OworICAgICAgICAgICAgc2FbN10gKz0gYVtpXS54OworCisgICAgICAgICAgICBzYVs4XSArPSBhW2ldLng7CisgICAgICAgICAgICBzYVs5XSArPSAtYVtpXS55OworICAgICAgICAgICAgc2FbMTBdICs9IDE7CisgICAgICAgICAgICBzYVsxMV0gKz0gMDsKKworICAgICAgICAgICAgc2FbMTJdICs9IGFbaV0ueTsKKyAgICAgICAgICAgIHNhWzEzXSArPSBhW2ldLng7CisgICAgICAgICAgICBzYVsxNF0gKz0gMDsKKyAgICAgICAgICAgIHNhWzE1XSArPSAxOworCisgICAgICAgICAgICBzYlswXSArPSBhW2ldLngqYltpXS54ICsgYVtpXS55KmJbaV0ueTsKKyAgICAgICAgICAgIHNiWzFdICs9IGFbaV0ueCpiW2ldLnkgLSBhW2ldLnkqYltpXS54OworICAgICAgICAgICAgc2JbMl0gKz0gYltpXS54OworICAgICAgICAgICAgc2JbM10gKz0gYltpXS55OworICAgICAgICB9CisKKyAgICAgICAgY3ZTb2x2ZSggJkEsICZCLCAmTU0sIENWX1NWRCApOworCisgICAgICAgIG9tWzBdID0gb21bNF0gPSBtWzBdOworICAgICAgICBvbVsxXSA9IC1tWzFdOworICAgICAgICBvbVszXSA9IG1bMV07CisgICAgICAgIG9tWzJdID0gbVsyXTsKKyAgICAgICAgb21bNV0gPSBtWzNdOworICAgIH0KK30KKworCitDVl9JTVBMIGludAorY3ZFc3RpbWF0ZVJpZ2lkVHJhbnNmb3JtKCBjb25zdCBDdkFyciogX0EsIGNvbnN0IEN2QXJyKiBfQiwgQ3ZNYXQqIF9NLCBpbnQgZnVsbF9hZmZpbmUgKQoreworICAgIGludCByZXN1bHQgPSAwOworICAgIAorICAgIGNvbnN0IGludCBDT1VOVCA9IDE1OworICAgIGNvbnN0IGludCBXSURUSCA9IDE2MCwgSEVJR0hUID0gMTIwOworICAgIGNvbnN0IGludCBSQU5TQUNfTUFYX0lURVJTID0gMTAwOworICAgIGNvbnN0IGludCBSQU5TQUNfU0laRTAgPSAzOworICAgIGNvbnN0IGRvdWJsZSBNSU5fVFJJQU5HTEVfU0lERSA9IDIwOworICAgIGNvbnN0IGRvdWJsZSBSQU5TQUNfR09PRF9SQVRJTyA9IDAuNTsKKworICAgIGludCBhbGxvY2F0ZWQgPSAxOworICAgIEN2TWF0ICpzQSA9IDAsICpzQiA9IDA7CisgICAgQ3ZQb2ludDJEMzJmICpwQSA9IDAsICpwQiA9IDA7CisgICAgaW50KiBnb29kX2lkeCA9IDA7CisgICAgY2hhciAqc3RhdHVzID0gMDsKKyAgICBDdk1hdCogZ3JheSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RXN0aW1hdGVSaWdpZFRyYW5zZm9ybSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWJBLCAqQTsKKyAgICBDdk1hdCBzdHViQiwgKkI7CisgICAgQ3ZTaXplIHN6MCwgc3oxOworICAgIGludCBjbiwgZXF1YWxfc2l6ZXM7CisgICAgaW50IGksIGosIGssIGsxOworICAgIGludCBjb3VudF94LCBjb3VudF95LCBjb3VudDsKKyAgICBkb3VibGUgc2NhbGUgPSAxOworICAgIEN2Uk5HIHJuZyA9IGN2Uk5HKC0xKTsKKyAgICBkb3VibGUgbVs2XT17MH07CisgICAgQ3ZNYXQgTSA9IGN2TWF0KCAyLCAzLCBDVl82NEYsIG0gKTsKKyAgICBpbnQgZ29vZF9jb3VudCA9IDA7CisKKyAgICBDVl9DQUxMKCBBID0gY3ZHZXRNYXQoIF9BLCAmc3R1YkEgKSk7CisgICAgQ1ZfQ0FMTCggQiA9IGN2R2V0TWF0KCBfQiwgJnN0dWJCICkpOworCisgICAgaWYoICFDVl9JU19NQVQoX00pICkKKyAgICAgICAgQ1ZfRVJST1IoIF9NID8gQ1ZfU3RzQmFkQXJnIDogQ1ZfU3RzTnVsbFB0ciwgIk91dHB1dCBwYXJhbWV0ZXIgTSBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggQSwgQiApICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQm90aCBpbnB1dCBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggQSwgQiApICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJCb3RoIGlucHV0IGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgZGF0YSB0eXBlIiApOworCisgICAgaWYoIENWX01BVF9UWVBFKEEtPnR5cGUpID09IENWXzhVQzEgfHwgQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgPT0gQ1ZfOFVDMyApCisgICAgeworICAgICAgICBjbiA9IENWX01BVF9DTihBLT50eXBlKTsKKyAgICAgICAgc3owID0gY3ZHZXRTaXplKEEpOworICAgICAgICBzejEgPSBjdlNpemUoV0lEVEgsIEhFSUdIVCk7CisKKyAgICAgICAgc2NhbGUgPSBNQVgoIChkb3VibGUpc3oxLndpZHRoL3N6MC53aWR0aCwgKGRvdWJsZSlzejEuaGVpZ2h0L3N6MC5oZWlnaHQgKTsKKyAgICAgICAgc2NhbGUgPSBNSU4oIHNjYWxlLCAxLiApOworICAgICAgICBzejEud2lkdGggPSBjdlJvdW5kKCBzejAud2lkdGggKiBzY2FsZSApOworICAgICAgICBzejEuaGVpZ2h0ID0gY3ZSb3VuZCggc3owLmhlaWdodCAqIHNjYWxlICk7CisKKyAgICAgICAgZXF1YWxfc2l6ZXMgPSBzejEud2lkdGggPT0gc3owLndpZHRoICYmIHN6MS5oZWlnaHQgPT0gc3owLmhlaWdodDsKKworICAgICAgICBpZiggIWVxdWFsX3NpemVzIHx8IGNuICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBzQSA9IGN2Q3JlYXRlTWF0KCBzejEuaGVpZ2h0LCBzejEud2lkdGgsIENWXzhVQzEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBzQiA9IGN2Q3JlYXRlTWF0KCBzejEuaGVpZ2h0LCBzejEud2lkdGgsIENWXzhVQzEgKSk7CisKKyAgICAgICAgICAgIGlmKCAhZXF1YWxfc2l6ZXMgJiYgY24gIT0gMSApCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggZ3JheSA9IGN2Q3JlYXRlTWF0KCBzejAuaGVpZ2h0LCBzejAud2lkdGgsIENWXzhVQzEgKSk7CisKKyAgICAgICAgICAgIGlmKCBncmF5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkN2dENvbG9yKCBBLCBncmF5LCBDVl9CR1IyR1JBWSApOworICAgICAgICAgICAgICAgIGN2UmVzaXplKCBncmF5LCBzQSwgQ1ZfSU5URVJfQVJFQSApOworICAgICAgICAgICAgICAgIGN2Q3Z0Q29sb3IoIEIsIGdyYXksIENWX0JHUjJHUkFZICk7CisgICAgICAgICAgICAgICAgY3ZSZXNpemUoIGdyYXksIHNCLCBDVl9JTlRFUl9BUkVBICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBjbiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdlJlc2l6ZSggZ3JheSwgc0EsIENWX0lOVEVSX0FSRUEgKTsKKyAgICAgICAgICAgICAgICBjdlJlc2l6ZSggZ3JheSwgc0IsIENWX0lOVEVSX0FSRUEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkN2dENvbG9yKCBBLCBncmF5LCBDVl9CR1IyR1JBWSApOworICAgICAgICAgICAgICAgIGN2UmVzaXplKCBncmF5LCBzQSwgQ1ZfSU5URVJfQVJFQSApOworICAgICAgICAgICAgICAgIGN2Q3Z0Q29sb3IoIEIsIGdyYXksIENWX0JHUjJHUkFZICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJmdyYXkgKTsKKyAgICAgICAgICAgIEEgPSBzQTsKKyAgICAgICAgICAgIEIgPSBzQjsKKyAgICAgICAgfQorCisgICAgICAgIGNvdW50X3kgPSBDT1VOVDsKKyAgICAgICAgY291bnRfeCA9IGN2Um91bmQoKGRvdWJsZSlDT1VOVCpzejEud2lkdGgvc3oxLmhlaWdodCk7CisgICAgICAgIGNvdW50ID0gY291bnRfeCAqIGNvdW50X3k7CisKKyAgICAgICAgQ1ZfQ0FMTCggcEEgPSAoQ3ZQb2ludDJEMzJmKiljdkFsbG9jKCBjb3VudCpzaXplb2YocEFbMF0pICkpOworICAgICAgICBDVl9DQUxMKCBwQiA9IChDdlBvaW50MkQzMmYqKWN2QWxsb2MoIGNvdW50KnNpemVvZihwQlswXSkgKSk7CisgICAgICAgIENWX0NBTEwoIHN0YXR1cyA9IChjaGFyKiljdkFsbG9jKCBjb3VudCpzaXplb2Yoc3RhdHVzWzBdKSApKTsKKworICAgICAgICBmb3IoIGkgPSAwLCBrID0gMDsgaSA8IGNvdW50X3k7IGkrKyApCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnRfeDsgaisrLCBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBBW2tdLnggPSAoaiswLjVmKSpzejEud2lkdGgvY291bnRfeDsKKyAgICAgICAgICAgICAgICBwQVtrXS55ID0gKGkrMC41Zikqc3oxLmhlaWdodC9jb3VudF95OworICAgICAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnRzIGluIEIKKyAgICAgICAgY3ZDYWxjT3B0aWNhbEZsb3dQeXJMSyggQSwgQiwgMCwgMCwgcEEsIHBCLCBjb3VudCwgY3ZTaXplKDEwLDEwKSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCAwLCBjdlRlcm1Dcml0ZXJpYShDVl9URVJNQ1JJVF9JVEVSLDQwLDAuMSksIDAgKTsKKworICAgICAgICAvLyByZXBhY2sgdGhlIHJlbWFpbmVkIHBvaW50cworICAgICAgICBmb3IoIGkgPSAwLCBrID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgaWYoIHN0YXR1c1tpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGkgPiBrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBBW2tdID0gcEFbaV07CisgICAgICAgICAgICAgICAgICAgIHBCW2tdID0gcEJbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGsrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICBjb3VudCA9IGs7CisgICAgfQorICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKEEtPnR5cGUpID09IENWXzMyRkMyIHx8IENWX01BVF9UWVBFKEEtPnR5cGUpID09IENWXzMyU0MyICkKKyAgICB7CisgICAgICAgIGNvdW50ID0gQS0+Y29scypBLT5yb3dzOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVChBLT50eXBlICYgQi0+dHlwZSkgJiYgQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgPT0gQ1ZfMzJGQzIgKQorICAgICAgICB7CisgICAgICAgICAgICBwQSA9IChDdlBvaW50MkQzMmYqKUEtPmRhdGEucHRyOworICAgICAgICAgICAgcEIgPSAoQ3ZQb2ludDJEMzJmKilCLT5kYXRhLnB0cjsKKyAgICAgICAgICAgIGFsbG9jYXRlZCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdk1hdCBfcEEsIF9wQjsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggcEEgPSAoQ3ZQb2ludDJEMzJmKiljdkFsbG9jKCBjb3VudCpzaXplb2YocEFbMF0pICkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggcEIgPSAoQ3ZQb2ludDJEMzJmKiljdkFsbG9jKCBjb3VudCpzaXplb2YocEJbMF0pICkpOworICAgICAgICAgICAgX3BBID0gY3ZNYXQoIEEtPnJvd3MsIEEtPmNvbHMsIENWXzMyRkMyLCBwQSApOworICAgICAgICAgICAgX3BCID0gY3ZNYXQoIEItPnJvd3MsIEItPmNvbHMsIENWXzMyRkMyLCBwQiApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCBBLCAmX3BBICk7CisgICAgICAgICAgICBjdkNvbnZlcnQoIEIsICZfcEIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIkJvdGggaW5wdXQgaW1hZ2VzIG11c3QgaGF2ZSBlaXRoZXIgOHVDMSBvciA4dUMzIHR5cGUiICk7CisKKyAgICBDVl9DQUxMKCBnb29kX2lkeCA9IChpbnQqKWN2QWxsb2MoIGNvdW50KnNpemVvZihnb29kX2lkeFswXSkgKSk7CisKKyAgICBpZiggY291bnQgPCBSQU5TQUNfU0laRTAgKQorICAgICAgICBFWElUOworCisgICAgLy8gUkFOU0FDIHN0dWZmOgorICAgIC8vIDEuIGZpbmQgdGhlIGNvbnNlbnN1cworICAgIGZvciggayA9IDA7IGsgPCBSQU5TQUNfTUFYX0lURVJTOyBrKysgKQorICAgIHsKKyAgICAgICAgaW50IGlkeFtSQU5TQUNfU0laRTBdOworICAgICAgICBDdlBvaW50MkQzMmYgYVszXTsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIGJbM107CisKKyAgICAgICAgbWVtc2V0KCBhLCAwLCBzaXplb2YoYSkgKTsKKyAgICAgICAgbWVtc2V0KCBiLCAwLCBzaXplb2YoYikgKTsKKworICAgICAgICAvLyBjaG9vc2UgcmFuZG9tIDMgbm9uLWNvbXBsYW5hciBwb2ludHMgZnJvbSBBICYgQgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgUkFOU0FDX1NJWkUwOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGsxID0gMDsgazEgPCBSQU5TQUNfTUFYX0lURVJTOyBrMSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZHhbaV0gPSBjdlJhbmRJbnQoJnJuZykgJSBjb3VudDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgaTsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpZHhbal0gPT0gaWR4W2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBwb2ludHMgYXJlIG5vdCB2ZXJ5IGNsb3NlIG9uZSBlYWNoIG90aGVyCisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKHBBW2lkeFtpXV0ueCAtIHBBW2lkeFtqXV0ueCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZmFicyhwQVtpZHhbaV1dLnkgLSBwQVtpZHhbal1dLnkpIDwgTUlOX1RSSUFOR0xFX1NJREUgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKHBCW2lkeFtpXV0ueCAtIHBCW2lkeFtqXV0ueCkgKworICAgICAgICAgICAgICAgICAgICAgICAgZmFicyhwQltpZHhbaV1dLnkgLSBwQltpZHhbal1dLnkpIDwgTUlOX1RSSUFOR0xFX1NJREUgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGogPCBpICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICBpZiggaSsxID09IFJBTlNBQ19TSVpFMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBhZGRpdGlvbmFsIGNoZWNrIGZvciBub24tY29tcGxhbmFyIHZlY3RvcnMKKyAgICAgICAgICAgICAgICAgICAgYVswXSA9IHBBW2lkeFswXV07CisgICAgICAgICAgICAgICAgICAgIGFbMV0gPSBwQVtpZHhbMV1dOworICAgICAgICAgICAgICAgICAgICBhWzJdID0gcEFbaWR4WzJdXTsKKworICAgICAgICAgICAgICAgICAgICBiWzBdID0gcEJbaWR4WzBdXTsKKyAgICAgICAgICAgICAgICAgICAgYlsxXSA9IHBCW2lkeFsxXV07CisgICAgICAgICAgICAgICAgICAgIGJbMl0gPSBwQltpZHhbMl1dOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKChhWzFdLnggLSBhWzBdLngpKihhWzJdLnkgLSBhWzBdLnkpIC0gKGFbMV0ueSAtIGFbMF0ueSkqKGFbMl0ueCAtIGFbMF0ueCkpIDwgMSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZmFicygoYlsxXS54IC0gYlswXS54KSooYlsyXS55IC0gYlswXS55KSAtIChiWzFdLnkgLSBiWzBdLnkpKihiWzJdLnggLSBiWzBdLngpKSA8IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggazEgPj0gUkFOU0FDX01BWF9JVEVSUyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggaSA8IFJBTlNBQ19TSVpFMCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAvLyBlc3RpbWF0ZSB0aGUgdHJhbnNmb3JtYXRpb24gdXNpbmcgMyBwb2ludHMKKyAgICAgICAgaWN2R2V0UlRNYXRyaXgoIGEsIGIsIDMsICZNLCBmdWxsX2FmZmluZSApOworCisgICAgICAgIGZvciggaSA9IDAsIGdvb2RfY291bnQgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmYWJzKCBtWzBdKnBBW2ldLnggKyBtWzFdKnBBW2ldLnkgKyBtWzJdIC0gcEJbaV0ueCApICsKKyAgICAgICAgICAgICAgICBmYWJzKCBtWzNdKnBBW2ldLnggKyBtWzRdKnBBW2ldLnkgKyBtWzVdIC0gcEJbaV0ueSApIDwgOCApCisgICAgICAgICAgICAgICAgZ29vZF9pZHhbZ29vZF9jb3VudCsrXSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBpZiggZ29vZF9jb3VudCA+PSBjb3VudCpSQU5TQUNfR09PRF9SQVRJTyApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiggayA+PSBSQU5TQUNfTUFYX0lURVJTICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCBnb29kX2NvdW50IDwgY291bnQgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGdvb2RfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGogPSBnb29kX2lkeFtpXTsKKyAgICAgICAgICAgIHBBW2ldID0gcEFbal07CisgICAgICAgICAgICBwQltpXSA9IHBCW2pdOworICAgICAgICB9CisgICAgfQorCisgICAgaWN2R2V0UlRNYXRyaXgoIHBBLCBwQiwgZ29vZF9jb3VudCwgJk0sIGZ1bGxfYWZmaW5lICk7CisgICAgbVsyXSAvPSBzY2FsZTsKKyAgICBtWzVdIC89IHNjYWxlOworICAgIENWX0NBTEwoIGN2Q29udmVydCggJk0sIF9NICkpOworICAgIHJlc3VsdCA9IDE7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmc0EgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzQiApOworICAgIGN2RnJlZSggJnBBICk7CisgICAgY3ZGcmVlKCAmcEIgKTsKKyAgICBjdkZyZWUoICZzdGF0dXMgKTsKKyAgICBjdkZyZWUoICZnb29kX2lkeCApOworICAgIGN2UmVsZWFzZU1hdCggJmdyYXkgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZtYXRjaGNvbnRvdXJzLmNwcCBiL2N2L3NyYy9jdm1hdGNoY29udG91cnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTY5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZtYXRjaGNvbnRvdXJzLmNwcApAQCAtMCwwICsxLDM5OCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZNYXRjaENvbnRvdXJzCisvLyAgICBQdXJwb3NlOgorLy8gICAgICBDYWxjdWxhdGVzIG1hdGNoaW5nIG9mIHRoZSB0d28gY29udG91cnMKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBjb250b3VyXzEgLSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpbnB1dCBjb250b3VyIG9iamVjdC4KKy8vICAgICAgY29udG91cl8yIC0gcG9pbnRlciB0byB0aGUgc2Vjb25kIGlucHV0IGNvbnRvdXIgb2JqZWN0LgorLy8gICAgICBtZXRob2QgLSBtZXRob2QgZm9yIHRoZSBtYXRjaGluZyBjYWxjdWxhdGlvbgorLy8gICAgICAobm93IENWX0lQUElfQ09OVE9VUlNfTUFUQ0hfSTEsIENWX0NPTlRPVVJTX01BVENIX0kyIG9yCisvLyAgICAgIENWX0NPTlRPVVJTX01BVENIX0kzIG9ubHkgICkKKy8vICAgICAgcmV6dWx0IC0gb3V0cHV0IGNhbGN1bGF0ZWQgbWVhc3VyZSAKKy8vCisvL0YqLworQ1ZfSU1QTCAgZG91YmxlCitjdk1hdGNoU2hhcGVzKCBjb25zdCB2b2lkKiBjb250b3VyMSwgY29uc3Qgdm9pZCogY29udG91cjIsCisgICAgICAgICAgICAgICBpbnQgbWV0aG9kLCBkb3VibGUgLypwYXJhbWV0ZXIqLyApCit7CisgICAgQ3ZNb21lbnRzIG1vbWVudHM7CisgICAgQ3ZIdU1vbWVudHMgaHVNb21lbnRzOworICAgIGRvdWJsZSBtYVs3XSwgbWJbN107CisgICAgaW50IGksIHNtYSwgc21iOworICAgIGRvdWJsZSBlcHMgPSAxLmUtNTsKKyAgICBkb3VibGUgbW1tOworICAgIGRvdWJsZSByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1hdGNoU2hhcGVzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFjb250b3VyMSB8fCAhY29udG91cjIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworLyogICBmaXJzdCBtb21lbnRzIGNhbGN1bGF0aW9uICovCisgICAgQ1ZfQ0FMTCggY3ZNb21lbnRzKCBjb250b3VyMSwgJm1vbWVudHMgKSk7CisKKy8qICBIdSBtb21lbnRzIGNhbGN1bGF0aW9uICAgKi8KKyAgICBDVl9DQUxMKCBjdkdldEh1TW9tZW50cyggJm1vbWVudHMsICZodU1vbWVudHMgKSk7CisKKyAgICBtYVswXSA9IGh1TW9tZW50cy5odTE7CisgICAgbWFbMV0gPSBodU1vbWVudHMuaHUyOworICAgIG1hWzJdID0gaHVNb21lbnRzLmh1MzsKKyAgICBtYVszXSA9IGh1TW9tZW50cy5odTQ7CisgICAgbWFbNF0gPSBodU1vbWVudHMuaHU1OworICAgIG1hWzVdID0gaHVNb21lbnRzLmh1NjsKKyAgICBtYVs2XSA9IGh1TW9tZW50cy5odTc7CisKKworLyogICBzZWNvbmQgbW9tZW50cyBjYWxjdWxhdGlvbiAgKi8KKyAgICBDVl9DQUxMKCBjdk1vbWVudHMoIGNvbnRvdXIyLCAmbW9tZW50cyApKTsKKworLyogIEh1IG1vbWVudHMgY2FsY3VsYXRpb24gICAqLworICAgIENWX0NBTEwoIGN2R2V0SHVNb21lbnRzKCAmbW9tZW50cywgJmh1TW9tZW50cyApKTsKKworICAgIG1iWzBdID0gaHVNb21lbnRzLmh1MTsKKyAgICBtYlsxXSA9IGh1TW9tZW50cy5odTI7CisgICAgbWJbMl0gPSBodU1vbWVudHMuaHUzOworICAgIG1iWzNdID0gaHVNb21lbnRzLmh1NDsKKyAgICBtYls0XSA9IGh1TW9tZW50cy5odTU7CisgICAgbWJbNV0gPSBodU1vbWVudHMuaHU2OworICAgIG1iWzZdID0gaHVNb21lbnRzLmh1NzsKKworICAgIHN3aXRjaCAobWV0aG9kKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA3OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBhbWEgPSBmYWJzKCBtYVtpXSApOworICAgICAgICAgICAgICAgIGRvdWJsZSBhbWIgPSBmYWJzKCBtYltpXSApOworCisgICAgICAgICAgICAgICAgaWYoIG1hW2ldID4gMCApCisgICAgICAgICAgICAgICAgICAgIHNtYSA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbWFbaV0gPCAwICkKKyAgICAgICAgICAgICAgICAgICAgc21hID0gLTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbWEgPSAwOworICAgICAgICAgICAgICAgIGlmKCBtYltpXSA+IDAgKQorICAgICAgICAgICAgICAgICAgICBzbWIgPSAxOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIG1iW2ldIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHNtYiA9IC0xOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgc21iID0gMDsKKworICAgICAgICAgICAgICAgIGlmKCBhbWEgPiBlcHMgJiYgYW1iID4gZXBzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFtYSA9IDEuIC8gKHNtYSAqIGxvZzEwKCBhbWEgKSk7CisgICAgICAgICAgICAgICAgICAgIGFtYiA9IDEuIC8gKHNtYiAqIGxvZzEwKCBhbWIgKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmYWJzKCAtYW1hICsgYW1iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgMjoKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDc7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGFtYSA9IGZhYnMoIG1hW2ldICk7CisgICAgICAgICAgICAgICAgZG91YmxlIGFtYiA9IGZhYnMoIG1iW2ldICk7CisKKyAgICAgICAgICAgICAgICBpZiggbWFbaV0gPiAwICkKKyAgICAgICAgICAgICAgICAgICAgc21hID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtYVtpXSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBzbWEgPSAtMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNtYSA9IDA7CisgICAgICAgICAgICAgICAgaWYoIG1iW2ldID4gMCApCisgICAgICAgICAgICAgICAgICAgIHNtYiA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbWJbaV0gPCAwICkKKyAgICAgICAgICAgICAgICAgICAgc21iID0gLTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbWIgPSAwOworCisgICAgICAgICAgICAgICAgaWYoIGFtYSA+IGVwcyAmJiBhbWIgPiBlcHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYW1hID0gc21hICogbG9nMTAoIGFtYSApOworICAgICAgICAgICAgICAgICAgICBhbWIgPSBzbWIgKiBsb2cxMCggYW1iICk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBmYWJzKCAtYW1hICsgYW1iICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgMzoKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDc7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGFtYSA9IGZhYnMoIG1hW2ldICk7CisgICAgICAgICAgICAgICAgZG91YmxlIGFtYiA9IGZhYnMoIG1iW2ldICk7CisKKyAgICAgICAgICAgICAgICBpZiggbWFbaV0gPiAwICkKKyAgICAgICAgICAgICAgICAgICAgc21hID0gMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtYVtpXSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBzbWEgPSAtMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHNtYSA9IDA7CisgICAgICAgICAgICAgICAgaWYoIG1iW2ldID4gMCApCisgICAgICAgICAgICAgICAgICAgIHNtYiA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbWJbaV0gPCAwICkKKyAgICAgICAgICAgICAgICAgICAgc21iID0gLTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzbWIgPSAwOworCisgICAgICAgICAgICAgICAgaWYoIGFtYSA+IGVwcyAmJiBhbWIgPiBlcHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYW1hID0gc21hICogbG9nMTAoIGFtYSApOworICAgICAgICAgICAgICAgICAgICBhbWIgPSBzbWIgKiBsb2cxMCggYW1iICk7CisgICAgICAgICAgICAgICAgICAgIG1tbSA9IGZhYnMoIChhbWEgLSBhbWIpIC8gYW1hICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPCBtbW0gKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbW1tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBRENPRUZfRVJSICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdk1hdGNoQ29udG91clRyZWVzCisvLyAgICBQdXJwb3NlOgorLy8gICAgICBDYWxjdWxhdGVzIG1hdGNoaW5nIG9mIHRoZSB0d28gY29udG91ciB0cmVlcworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIHRyZWUxIC0gcG9pbnRlciB0byB0aGUgZmlyc3QgaW5wdXQgY29udG91ciB0cmVlIG9iamVjdC4KKy8vICAgICAgdHJlZTIgLSBwb2ludGVyIHRvIHRoZSBzZWNvbmQgaW5wdXQgY29udG91ciB0cmVlIG9iamVjdC4KKy8vICAgICAgbWV0aG9kIC0gbWV0aG9kIGZvciB0aGUgbWF0Y2hpbmcgY2FsY3VsYXRpb24KKy8vICAgICAgKG5vdyBDVl9DT05UT1VSX1RSRUVTX01BVENIX0kxIG9ubHkgICkKKy8vICAgICAgdGhyZXNob2xkIC0gdGhyZXNob2xkIGZvciB0aGUgY29udG91ciB0cmVlcyBtYXRjaGluZyAKKy8vICAgICAgcmVzdWx0IC0gb3V0cHV0IGNhbGN1bGF0ZWQgbWVhc3VyZSAKKy8vRiovCitDVl9JTVBMICBkb3VibGUKK2N2TWF0Y2hDb250b3VyVHJlZXMoIGNvbnN0IEN2Q29udG91clRyZWUqIHRyZWUxLCBjb25zdCBDdkNvbnRvdXJUcmVlKiB0cmVlMiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBtZXRob2QsIGRvdWJsZSB0aHJlc2hvbGQgKQoreworICAgIF9DdlRyaWFuQXR0ciAqKnB0cl9wMSA9IDAsICoqcHRyX3AyID0gMDsgICAgLypwb2ludGVycyB0byB0aGUgcG9pbnRlcidzIGJ1ZmZlciAqLworICAgIF9DdlRyaWFuQXR0ciAqKnB0cl9uMSA9IDAsICoqcHRyX24yID0gMDsgICAgLypwb2ludGVycyB0byB0aGUgcG9pbnRlcidzIGJ1ZmZlciAqLworICAgIF9DdlRyaWFuQXR0ciAqKnB0cjExLCAqKnB0cjEyLCAqKnB0cjIxLCAqKnB0cjIyOworCisgICAgaW50IGxwdDEsIGxwdDIsIGxwdCwgZmxhZywgZmxhZ19uLCBpLCBqLCBpYnVmLCBpYnVmMTsKKyAgICBkb3VibGUgbWF0Y2hfdiwgZDEyLCBhcmVhMSwgYXJlYTIsIHIxMSwgcjEyLCByMjEsIHIyMiwgdzEsIHcyOworICAgIGRvdWJsZSBlcHMgPSAxLmUtNTsKKyAgICBjaGFyIHMxLCBzMjsKKyAgICBfQ3ZUcmlhbkF0dHIgdHJlZV8xLCB0cmVlXzI7ICAgICAgICAvKmN1cnJlbnQgdmVydGV4IDEgYW5kIDIgdHJlZSAqLworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjEsIHJlYWRlcjI7CisgICAgZG91YmxlIHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZNYXRjaENvbnRvdXJUcmVlcyIpOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhdHJlZTEgfHwgIXRyZWUyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggbWV0aG9kICE9IENWX0NPTlRPVVJfVFJFRVNfTUFUQ0hfSTEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93bi91bnN1cHBvcnRlZCBjb21wYXJpc29uIG1ldGhvZCIgKTsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT05fVFJFRSggdHJlZTEgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBmaXJzdCBhcmd1bWVudCBpcyBub3QgYSB2YWxpZCBjb250b3VyIHRyZWUiICk7CisKKyAgICBpZiggIUNWX0lTX1NFUV9QT0xZR09OX1RSRUUoIHRyZWUyICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIG5vdCBhIHZhbGlkIGNvbnRvdXIgdHJlZSIgKTsKKworICAgIGxwdDEgPSB0cmVlMS0+dG90YWw7CisgICAgbHB0MiA9IHRyZWUyLT50b3RhbDsKKyAgICBscHQgPSBscHQxID4gbHB0MiA/IGxwdDEgOiBscHQyOworCisgICAgcHRyX3AxID0gcHRyX24xID0gcHRyX3AyID0gcHRyX24yID0gTlVMTDsKKyAgICBDVl9DQUxMKCBwdHJfcDEgPSAoX0N2VHJpYW5BdHRyICoqKSBjdkFsbG9jKCBscHQgKiBzaXplb2YoIF9DdlRyaWFuQXR0ciAqICkpKTsKKyAgICBDVl9DQUxMKCBwdHJfcDIgPSAoX0N2VHJpYW5BdHRyICoqKSBjdkFsbG9jKCBscHQgKiBzaXplb2YoIF9DdlRyaWFuQXR0ciAqICkpKTsKKworICAgIENWX0NBTEwoIHB0cl9uMSA9IChfQ3ZUcmlhbkF0dHIgKiopIGN2QWxsb2MoIGxwdCAqIHNpemVvZiggX0N2VHJpYW5BdHRyICogKSkpOworICAgIENWX0NBTEwoIHB0cl9uMiA9IChfQ3ZUcmlhbkF0dHIgKiopIGN2QWxsb2MoIGxwdCAqIHNpemVvZiggX0N2VHJpYW5BdHRyICogKSkpOworCisgICAgY3ZTdGFydFJlYWRTZXEoIChDdlNlcSAqKSB0cmVlMSwgJnJlYWRlcjEsIDAgKTsKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxICopIHRyZWUyLCAmcmVhZGVyMiwgMCApOworCisvKnJlYWQgdGhlIHJvb3Qgb2YgdGhlIGZpcnN0IGFuZCBzZWNvbmQgdHJlZSovCisgICAgQ1ZfUkVBRF9TRVFfRUxFTSggdHJlZV8xLCByZWFkZXIxICk7CisgICAgQ1ZfUkVBRF9TRVFfRUxFTSggdHJlZV8yLCByZWFkZXIyICk7CisKKy8qd3JpdGUgdG8gYnVmZmVyIHBvaW50ZXJzIHRvIHJvb3QncyBjaGlsZHMgdmVydGV4cyovCisgICAgcHRyX3AxWzBdID0gdHJlZV8xLm5leHRfdjE7CisgICAgcHRyX3AxWzFdID0gdHJlZV8xLm5leHRfdjI7CisgICAgcHRyX3AyWzBdID0gdHJlZV8yLm5leHRfdjE7CisgICAgcHRyX3AyWzFdID0gdHJlZV8yLm5leHRfdjI7CisgICAgaSA9IDI7CisgICAgbWF0Y2hfdiA9IDAuOworICAgIGFyZWExID0gdHJlZV8xLmFyZWE7CisgICAgYXJlYTIgPSB0cmVlXzIuYXJlYTsKKworICAgIGlmKCBhcmVhMSA8IGVwcyB8fCBhcmVhMiA8IGVwcyB8fCBscHQgPCA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICByMTEgPSByMTIgPSByMjEgPSByMjIgPSB3MSA9IHcyID0gZDEyID0gMDsKKyAgICBmbGFnID0gMDsKKyAgICBzMSA9IHMyID0gMDsKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoIGZsYWcgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0cjExID0gcHRyX3AxOworICAgICAgICAgICAgcHRyMTIgPSBwdHJfbjE7CisgICAgICAgICAgICBwdHIyMSA9IHB0cl9wMjsKKyAgICAgICAgICAgIHB0cjIyID0gcHRyX24yOworICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwdHIxMSA9IHB0cl9uMTsKKyAgICAgICAgICAgIHB0cjEyID0gcHRyX3AxOworICAgICAgICAgICAgcHRyMjEgPSBwdHJfbjI7CisgICAgICAgICAgICBwdHIyMiA9IHB0cl9wMjsKKyAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICB9CisgICAgICAgIGlidWYgPSAwOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgaTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxhZ19uID0gMDsKKyAgICAgICAgICAgIGlmKCBwdHIxMVtqXSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMTEgPSBwdHIxMVtqXS0+cjE7CisgICAgICAgICAgICAgICAgcjEyID0gcHRyMTFbal0tPnIyOworICAgICAgICAgICAgICAgIGZsYWdfbiA9IDE7CisgICAgICAgICAgICAgICAgdzEgPSBwdHIxMVtqXS0+YXJlYSAvIGFyZWExOworICAgICAgICAgICAgICAgIHMxID0gcHRyMTFbal0tPnNpZ247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjExID0gcjIxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBwdHIyMVtqXSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByMjEgPSBwdHIyMVtqXS0+cjE7CisgICAgICAgICAgICAgICAgcjIyID0gcHRyMjFbal0tPnIyOworICAgICAgICAgICAgICAgIGZsYWdfbiA9IDE7CisgICAgICAgICAgICAgICAgdzIgPSBwdHIyMVtqXS0+YXJlYSAvIGFyZWEyOworICAgICAgICAgICAgICAgIHMyID0gcHRyMjFbal0tPnNpZ247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcjIxID0gcjIyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBmbGFnX24gIT0gMCApCisvKiBjYWxjdWxhdGUgbm9kZSBkaXN0YW5jZSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobWV0aG9kKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCwgdDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggczEgIT0gczIgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQwID0gZmFicyggcjExICogdzEgKyByMjEgKiB3MiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gZmFicyggcjEyICogdzEgKyByMjIgKiB3MiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQwID0gZmFicyggcjExICogdzEgLSByMjEgKiB3MiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gZmFicyggcjEyICogdzEgLSByMjIgKiB3MiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZDEyID0gdDAgKyB0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hdGNoX3YgKz0gZDEyOworICAgICAgICAgICAgICAgIGlidWYxID0gaWJ1ZiArIDE7CisvKndyaXRlIHRvIGJ1ZmZlciB0aGUgcG9pbnRlciB0byBjaGlsZCB2ZXJ0ZXhlcyovCisgICAgICAgICAgICAgICAgaWYoIHB0cjExW2pdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyMTJbaWJ1Zl0gPSBwdHIxMVtqXS0+bmV4dF92MTsKKyAgICAgICAgICAgICAgICAgICAgcHRyMTJbaWJ1ZjFdID0gcHRyMTFbal0tPm5leHRfdjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB0cjEyW2lidWZdID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcHRyMTJbaWJ1ZjFdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHB0cjIxW2pdICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyMjJbaWJ1Zl0gPSBwdHIyMVtqXS0+bmV4dF92MTsKKyAgICAgICAgICAgICAgICAgICAgcHRyMjJbaWJ1ZjFdID0gcHRyMjFbal0tPm5leHRfdjI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB0cjIyW2lidWZdID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcHRyMjJbaWJ1ZjFdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWJ1ZiArPSAyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGkgPSBpYnVmOworICAgIH0KKyAgICB3aGlsZSggaSA+IDAgJiYgbWF0Y2hfdiA8IHRocmVzaG9sZCApOworCisgICAgcmVzdWx0ID0gbWF0Y2hfdjsKKworICAgIF9fRU5EX187CisKKyAgICBjdkZyZWUoICZwdHJfbjIgKTsKKyAgICBjdkZyZWUoICZwdHJfbjEgKTsKKyAgICBjdkZyZWUoICZwdHJfcDIgKTsKKyAgICBjdkZyZWUoICZwdHJfcDEgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Ztb21lbnRzLmNwcCBiL2N2L3NyYy9jdm1vbWVudHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNjZkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Ztb21lbnRzLmNwcApAQCAtMCwwICsxLDY4NyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qIFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGNlbnRlciBvZiBncmF2aXR5IGFuZCBjZW50cmFsIHNlY29uZCBvcmRlciBtb21lbnRzICovCitzdGF0aWMgdm9pZAoraWN2Q29tcGxldGVNb21lbnRTdGF0ZSggQ3ZNb21lbnRzKiBtb21lbnRzICkKK3sKKyAgICBkb3VibGUgY3ggPSAwLCBjeSA9IDA7CisgICAgZG91YmxlIG11MjAsIG11MTEsIG11MDI7CisKKyAgICBhc3NlcnQoIG1vbWVudHMgIT0gMCApOworICAgIG1vbWVudHMtPmludl9zcXJ0X20wMCA9IDA7CisKKyAgICBpZiggZmFicyhtb21lbnRzLT5tMDApID4gREJMX0VQU0lMT04gKQorICAgIHsKKyAgICAgICAgZG91YmxlIGludl9tMDAgPSAxLiAvIG1vbWVudHMtPm0wMDsKKyAgICAgICAgY3ggPSBtb21lbnRzLT5tMTAgKiBpbnZfbTAwOworICAgICAgICBjeSA9IG1vbWVudHMtPm0wMSAqIGludl9tMDA7CisgICAgICAgIG1vbWVudHMtPmludl9zcXJ0X20wMCA9IHNxcnQoIGZhYnMoaW52X20wMCkgKTsKKyAgICB9CisKKyAgICAvKiBtdTIwID0gbTIwIC0gbTEwKmN4ICovCisgICAgbXUyMCA9IG1vbWVudHMtPm0yMCAtIG1vbWVudHMtPm0xMCAqIGN4OworICAgIC8qIG11MTEgPSBtMTEgLSBtMTAqY3kgKi8KKyAgICBtdTExID0gbW9tZW50cy0+bTExIC0gbW9tZW50cy0+bTEwICogY3k7CisgICAgLyogbXUwMiA9IG0wMiAtIG0wMSpjeSAqLworICAgIG11MDIgPSBtb21lbnRzLT5tMDIgLSBtb21lbnRzLT5tMDEgKiBjeTsKKworICAgIG1vbWVudHMtPm11MjAgPSBtdTIwOworICAgIG1vbWVudHMtPm11MTEgPSBtdTExOworICAgIG1vbWVudHMtPm11MDIgPSBtdTAyOworCisgICAgLyogbXUzMCA9IG0zMCAtIGN4KigzKm11MjAgKyBjeCptMTApICovCisgICAgbW9tZW50cy0+bXUzMCA9IG1vbWVudHMtPm0zMCAtIGN4ICogKDMgKiBtdTIwICsgY3ggKiBtb21lbnRzLT5tMTApOworICAgIG11MTEgKz0gbXUxMTsKKyAgICAvKiBtdTIxID0gbTIxIC0gY3gqKDIqbXUxMSArIGN4Km0wMSkgLSBjeSptdTIwICovCisgICAgbW9tZW50cy0+bXUyMSA9IG1vbWVudHMtPm0yMSAtIGN4ICogKG11MTEgKyBjeCAqIG1vbWVudHMtPm0wMSkgLSBjeSAqIG11MjA7CisgICAgLyogbXUxMiA9IG0xMiAtIGN5KigyKm11MTEgKyBjeSptMTApIC0gY3gqbXUwMiAqLworICAgIG1vbWVudHMtPm11MTIgPSBtb21lbnRzLT5tMTIgLSBjeSAqIChtdTExICsgY3kgKiBtb21lbnRzLT5tMTApIC0gY3ggKiBtdTAyOworICAgIC8qIG11MDMgPSBtMDMgLSBjeSooMyptdTAyICsgY3kqbTAxKSAqLworICAgIG1vbWVudHMtPm11MDMgPSBtb21lbnRzLT5tMDMgLSBjeSAqICgzICogbXUwMiArIGN5ICogbW9tZW50cy0+bTAxKTsKK30KKworCitzdGF0aWMgdm9pZAoraWN2Q29udG91ck1vbWVudHMoIEN2U2VxKiBjb250b3VyLCBDdk1vbWVudHMqIG1vbWVudHMgKQoreworICAgIGludCBpc19mbG9hdCA9IENWX1NFUV9FTFRZUEUoY29udG91cikgPT0gQ1ZfMzJGQzI7CisKKyAgICBpZiggY29udG91ci0+dG90YWwgKQorICAgIHsKKyAgICAgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgICAgICBkb3VibGUgYTAwLCBhMTAsIGEwMSwgYTIwLCBhMTEsIGEwMiwgYTMwLCBhMjEsIGExMiwgYTAzOworICAgICAgICBkb3VibGUgeGksIHlpLCB4aTIsIHlpMiwgeGlfMSwgeWlfMSwgeGlfMTIsIHlpXzEyLCBkeHksIHhpaV8xLCB5aWlfMTsKKyAgICAgICAgaW50IGxwdCA9IGNvbnRvdXItPnRvdGFsOworCisgICAgICAgIGEwMCA9IGExMCA9IGEwMSA9IGEyMCA9IGExMSA9IGEwMiA9IGEzMCA9IGEyMSA9IGExMiA9IGEwMyA9IDA7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIGNvbnRvdXIsICZyZWFkZXIsIDAgKTsKKworICAgICAgICBpZiggIWlzX2Zsb2F0ICkKKyAgICAgICAgeworICAgICAgICAgICAgeGlfMSA9ICgoQ3ZQb2ludCopKHJlYWRlci5wdHIpKS0+eDsKKyAgICAgICAgICAgIHlpXzEgPSAoKEN2UG9pbnQqKShyZWFkZXIucHRyKSktPnk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB4aV8xID0gKChDdlBvaW50MkQzMmYqKShyZWFkZXIucHRyKSktPng7CisgICAgICAgICAgICB5aV8xID0gKChDdlBvaW50MkQzMmYqKShyZWFkZXIucHRyKSktPnk7CisgICAgICAgIH0KKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggY29udG91ci0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgCisgICAgICAgIHhpXzEyID0geGlfMSAqIHhpXzE7CisgICAgICAgIHlpXzEyID0geWlfMSAqIHlpXzE7CisKKyAgICAgICAgd2hpbGUoIGxwdC0tID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhaXNfZmxvYXQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhpID0gKChDdlBvaW50KikocmVhZGVyLnB0cikpLT54OworICAgICAgICAgICAgICAgIHlpID0gKChDdlBvaW50KikocmVhZGVyLnB0cikpLT55OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhpID0gKChDdlBvaW50MkQzMmYqKShyZWFkZXIucHRyKSktPng7CisgICAgICAgICAgICAgICAgeWkgPSAoKEN2UG9pbnQyRDMyZiopKHJlYWRlci5wdHIpKS0+eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGNvbnRvdXItPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisKKyAgICAgICAgICAgIHhpMiA9IHhpICogeGk7CisgICAgICAgICAgICB5aTIgPSB5aSAqIHlpOworICAgICAgICAgICAgZHh5ID0geGlfMSAqIHlpIC0geGkgKiB5aV8xOworICAgICAgICAgICAgeGlpXzEgPSB4aV8xICsgeGk7CisgICAgICAgICAgICB5aWlfMSA9IHlpXzEgKyB5aTsKKworICAgICAgICAgICAgYTAwICs9IGR4eTsKKyAgICAgICAgICAgIGExMCArPSBkeHkgKiB4aWlfMTsKKyAgICAgICAgICAgIGEwMSArPSBkeHkgKiB5aWlfMTsKKyAgICAgICAgICAgIGEyMCArPSBkeHkgKiAoeGlfMSAqIHhpaV8xICsgeGkyKTsKKyAgICAgICAgICAgIGExMSArPSBkeHkgKiAoeGlfMSAqICh5aWlfMSArIHlpXzEpICsgeGkgKiAoeWlpXzEgKyB5aSkpOworICAgICAgICAgICAgYTAyICs9IGR4eSAqICh5aV8xICogeWlpXzEgKyB5aTIpOworICAgICAgICAgICAgYTMwICs9IGR4eSAqIHhpaV8xICogKHhpXzEyICsgeGkyKTsKKyAgICAgICAgICAgIGEwMyArPSBkeHkgKiB5aWlfMSAqICh5aV8xMiArIHlpMik7CisgICAgICAgICAgICBhMjEgKz0KKyAgICAgICAgICAgICAgICBkeHkgKiAoeGlfMTIgKiAoMyAqIHlpXzEgKyB5aSkgKyAyICogeGkgKiB4aV8xICogeWlpXzEgKworICAgICAgICAgICAgICAgICAgICAgICB4aTIgKiAoeWlfMSArIDMgKiB5aSkpOworICAgICAgICAgICAgYTEyICs9CisgICAgICAgICAgICAgICAgZHh5ICogKHlpXzEyICogKDMgKiB4aV8xICsgeGkpICsgMiAqIHlpICogeWlfMSAqIHhpaV8xICsKKyAgICAgICAgICAgICAgICAgICAgICAgeWkyICogKHhpXzEgKyAzICogeGkpKTsKKworICAgICAgICAgICAgeGlfMSA9IHhpOworICAgICAgICAgICAgeWlfMSA9IHlpOworICAgICAgICAgICAgeGlfMTIgPSB4aTI7CisgICAgICAgICAgICB5aV8xMiA9IHlpMjsKKyAgICAgICAgfQorCisgICAgICAgIGRvdWJsZSBkYjFfMiwgZGIxXzYsIGRiMV8xMiwgZGIxXzI0LCBkYjFfMjAsIGRiMV82MDsKKworICAgICAgICBpZiggZmFicyhhMDApID4gRkxUX0VQU0lMT04gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYTAwID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGIxXzIgPSAwLjU7CisgICAgICAgICAgICAgICAgZGIxXzYgPSAwLjE2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3OworICAgICAgICAgICAgICAgIGRiMV8xMiA9IDAuMDgzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzOworICAgICAgICAgICAgICAgIGRiMV8yNCA9IDAuMDQxNjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY3OworICAgICAgICAgICAgICAgIGRiMV8yMCA9IDAuMDU7CisgICAgICAgICAgICAgICAgZGIxXzYwID0gMC4wMTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGIxXzIgPSAtMC41OworICAgICAgICAgICAgICAgIGRiMV82ID0gLTAuMTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njc7CisgICAgICAgICAgICAgICAgZGIxXzEyID0gLTAuMDgzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzOworICAgICAgICAgICAgICAgIGRiMV8yNCA9IC0wLjA0MTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NzsKKyAgICAgICAgICAgICAgICBkYjFfMjAgPSAtMC4wNTsKKyAgICAgICAgICAgICAgICBkYjFfNjAgPSAtMC4wMTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2Njc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qICBzcGF0aWFsIG1vbWVudHMgICAgKi8KKyAgICAgICAgICAgIG1vbWVudHMtPm0wMCA9IGEwMCAqIGRiMV8yOworICAgICAgICAgICAgbW9tZW50cy0+bTEwID0gYTEwICogZGIxXzY7CisgICAgICAgICAgICBtb21lbnRzLT5tMDEgPSBhMDEgKiBkYjFfNjsKKyAgICAgICAgICAgIG1vbWVudHMtPm0yMCA9IGEyMCAqIGRiMV8xMjsKKyAgICAgICAgICAgIG1vbWVudHMtPm0xMSA9IGExMSAqIGRiMV8yNDsKKyAgICAgICAgICAgIG1vbWVudHMtPm0wMiA9IGEwMiAqIGRiMV8xMjsKKyAgICAgICAgICAgIG1vbWVudHMtPm0zMCA9IGEzMCAqIGRiMV8yMDsKKyAgICAgICAgICAgIG1vbWVudHMtPm0yMSA9IGEyMSAqIGRiMV82MDsKKyAgICAgICAgICAgIG1vbWVudHMtPm0xMiA9IGExMiAqIGRiMV82MDsKKyAgICAgICAgICAgIG1vbWVudHMtPm0wMyA9IGEwMyAqIGRiMV8yMDsKKworICAgICAgICAgICAgaWN2Q29tcGxldGVNb21lbnRTdGF0ZSggbW9tZW50cyApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIHN1bW1hcml6ZXMgbW9tZW50IHZhbHVlcyBmb3IgYWxsIHRpbGVzICovCitzdGF0aWMgdm9pZAoraWN2QWNjdW11bGF0ZU1vbWVudHMoIGRvdWJsZSAqdGlsZXMsIEN2U2l6ZSBzaXplLCBDdlNpemUgdGlsZV9zaXplLCBDdk1vbWVudHMgKiBtb21lbnRzICkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSB0aWxlX3NpemUuaGVpZ2h0ICkKKyAgICB7CisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4ICs9IHRpbGVfc2l6ZS53aWR0aCwgdGlsZXMgKz0gMTAgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZHggPSB4LCBkeSA9IHk7CisgICAgICAgICAgICBkb3VibGUgZHhtID0gZHggKiB0aWxlc1swXSwgZHltID0gZHkgKiB0aWxlc1swXTsKKworICAgICAgICAgICAgLyogKyBtMDAgKCA9IG0wMCcgKSAqLworICAgICAgICAgICAgbW9tZW50cy0+bTAwICs9IHRpbGVzWzBdOworCisgICAgICAgICAgICAvKiArIG0xMCAoID0gbTEwJyArIGR4Km0wMCcgKSAqLworICAgICAgICAgICAgbW9tZW50cy0+bTEwICs9IHRpbGVzWzFdICsgZHhtOworCisgICAgICAgICAgICAvKiArIG0wMSAoID0gbTAxJyArIGR5Km0wMCcgKSAqLworICAgICAgICAgICAgbW9tZW50cy0+bTAxICs9IHRpbGVzWzJdICsgZHltOworCisgICAgICAgICAgICAvKiArIG0yMCAoID0gbTIwJyArIDIqZHgqbTEwJyArIGR4KmR4Km0wMCcgKSAqLworICAgICAgICAgICAgbW9tZW50cy0+bTIwICs9IHRpbGVzWzNdICsgZHggKiAodGlsZXNbMV0gKiAyICsgZHhtKTsKKworICAgICAgICAgICAgLyogKyBtMTEgKCA9IG0xMScgKyBkeCptMDEnICsgZHkqbTEwJyArIGR4KmR5Km0wMCcgKSAqLworICAgICAgICAgICAgbW9tZW50cy0+bTExICs9IHRpbGVzWzRdICsgZHggKiAodGlsZXNbMl0gKyBkeW0pICsgZHkgKiB0aWxlc1sxXTsKKworICAgICAgICAgICAgLyogKyBtMDIgKCA9IG0wMicgKyAyKmR5Km0wMScgKyBkeSpkeSptMDAnICkgKi8KKyAgICAgICAgICAgIG1vbWVudHMtPm0wMiArPSB0aWxlc1s1XSArIGR5ICogKHRpbGVzWzJdICogMiArIGR5bSk7CisKKyAgICAgICAgICAgIC8qICsgbTMwICggPSBtMzAnICsgMypkeCptMjAnICsgMypkeCpkeCptMTAnICsgZHgqZHgqZHgqbTAwJyApICovCisgICAgICAgICAgICBtb21lbnRzLT5tMzAgKz0gdGlsZXNbNl0gKyBkeCAqICgzLiAqIHRpbGVzWzNdICsgZHggKiAoMy4gKiB0aWxlc1sxXSArIGR4bSkpOworCisgICAgICAgICAgICAvKiArIG0yMSAoPSBtMjEnICsgZHgqKDIqbTExJyArIDIqZHkqbTEwJyArIGR4Km0wMScgKyBkeCpkeSptMDAnKSArIGR5Km0yMCcpICovCisgICAgICAgICAgICBtb21lbnRzLT5tMjEgKz0gdGlsZXNbN10gKyBkeCAqICgyICogKHRpbGVzWzRdICsgZHkgKiB0aWxlc1sxXSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHggKiAodGlsZXNbMl0gKyBkeW0pKSArIGR5ICogdGlsZXNbM107CisKKyAgICAgICAgICAgIC8qICsgbTEyICg9IG0xMicgKyBkeSooMiptMTEnICsgMipkeCptMDEnICsgZHkqbTEwJyArIGR4KmR5Km0wMCcpICsgZHgqbTAyJykgKi8KKyAgICAgICAgICAgIG1vbWVudHMtPm0xMiArPSB0aWxlc1s4XSArIGR5ICogKDIgKiAodGlsZXNbNF0gKyBkeCAqIHRpbGVzWzJdKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeSAqICh0aWxlc1sxXSArIGR4bSkpICsgZHggKiB0aWxlc1s1XTsKKworICAgICAgICAgICAgLyogKyBtMDMgKCA9IG0wMycgKyAzKmR5Km0wMicgKyAzKmR5KmR5Km0wMScgKyBkeSpkeSpkeSptMDAnICkgKi8KKyAgICAgICAgICAgIG1vbWVudHMtPm0wMyArPSB0aWxlc1s5XSArIGR5ICogKDMuICogdGlsZXNbNV0gKyBkeSAqICgzLiAqIHRpbGVzWzJdICsgZHltKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpY3ZDb21wbGV0ZU1vbWVudFN0YXRlKCBtb21lbnRzICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGF0aWFsIE1vbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfQ0FMQ19NT01FTlRTX0lOX1RJTEUoIF9fb3BfXywgbmFtZSwgZmxhdm9yLCBzcmN0eXBlLCB0ZW1wdHlwZSwgbW9tdHlwZSApIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIGljdiMjbmFtZSMjXyMjZmxhdm9yIyNfQ25DUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCBkb3VibGUgKm1vbWVudHMgKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeSwgc3hfaW5pdCA9IChzaXplLndpZHRoICYgLTQpICogKHNpemUud2lkdGggJiAtNCksIHN5ID0gMDsgICAgICAgICAgICAgICAgICAgXAorICAgIG1vbXR5cGUgbW9tWzEwXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIGltZyAmJiBzaXplLndpZHRoICYmIChzaXplLndpZHRoIHwgc2l6ZS5oZWlnaHQpID49IDAgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCggbW9tLCAwLCAxMCAqIHNpemVvZiggbW9tWzBdICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggY29pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbWcgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2YoaW1nWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgc3kgKz0gMiAqIHkgKyAxLCB5KyssIGltZyArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgIHgwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wdHlwZSAgeDEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlICB4MiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbW9tdHlwZSAgIHgzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3ggPSBzeF9pbml0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IHNyY3R5cGUqIHB0ciA9IGltZzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aCAtIDM7IHggKz0gNCwgcHRyICs9IGNuKjQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIHAwID0gX19vcF9fKHB0clswXSksIHAxID0gX19vcF9fKHB0cltjbl0pLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgcDIgPSBfX29wX18ocHRyWzIqY25dKSwgcDMgPSBfX29wX18ocHRyWzMqY25dKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSB0ID0gcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIGEsIGIsIGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwMCArPSBwMSArIHAyICsgcDM7IC8qIHAwICsgcDEgKyBwMiArIHAzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHAxICs9IDIgKiBwMiArIDMgKiBwMzsgICAgICAvKiBwMSArIHAyKjIgKyBwMyozICovICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcDIgPSBwMSArIDIgKiBwMiArIDYgKiBwMzsgIC8qIHAxICsgcDIqNCArIHAzKjkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwMyA9IDIgKiBwMiAtIHQgKyA5ICogcDM7ICAgLyogcDEgKyBwMio4ICsgcDMqMjcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYSA9IHggKiBwMCArIHAxOyAgICAvKiB4KnAwICsgKHgrMSkqcDEgKyAoeCsyKSpwMiArICh4KzMpKnAzICovICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiID0geCAqIHAxICsgcDI7ICAgIC8qICh4KzEpKnAxICsgMiooeCsyKSpwMiArIDMqKHgrMykqcDMgKi8gICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGMgPSB4ICogcDIgKyBwMzsgICAgLyogKHgrMSkqcDEgKyA0Kih4KzIpKnAyICsgOSooeCszKSpwMyAqLyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB4MCArPSBwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHgxICs9IGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYSA9IGEgKiB4ICsgYjsgICAgICAvKih4XjIpKnAwKygoeCsxKV4yKSpwMSsoKHgrMileMikqcDIrKCh4KzMpXjIpKnAzICovICAgICBcCisgICAgICAgICAgICB4MiArPSBhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHgzICs9ICgobW9tdHlwZSkoYSArIGIpKSAqIHggKyBjOyAgLyp4MyArPSAoeF4zKSpwMCsoKHgrMSleMykqcDEgKyAgKi8gICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKCh4KzIpXjMpKnAyKygoeCszKV4zKSpwMyAgICovICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBwcm9jZXNzIHRoZSByZXN0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgc3ggKz0gMiAqIHggKyAxLCB4KyssIHB0ciArPSBjbiApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcHR5cGUgcCA9IF9fb3BfXyhwdHJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSB4cCA9IHggKiBwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeDAgKz0gcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB4MSArPSB4cDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHgyICs9IHN4ICogcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeDMgKz0gKChtb210eXBlKXN4KSAqIHhwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSBweSA9IHkgKiB4MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbW9tWzldICs9ICgobW9tdHlwZSlweSkgKiBzeTsgIC8qIG0wMyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtb21bOF0gKz0gKChtb210eXBlKXgxKSAqIHN5OyAgLyogbTEyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1vbVs3XSArPSAoKG1vbXR5cGUpeDIpICogeTsgICAvKiBtMjEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbW9tWzZdICs9IHgzOyAgICAgICAgICAgICAgICAgIC8qIG0zMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtb21bNV0gKz0geDAgKiBzeTsgICAgICAgICAgICAgLyogbTAyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1vbVs0XSArPSB4MSAqIHk7ICAgICAgICAgICAgICAvKiBtMTEgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbW9tWzNdICs9IHgyOyAgICAgICAgICAgICAgICAgIC8qIG0yMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtb21bMl0gKz0gcHk7ICAgICAgICAgICAgICAgICAgLyogbTAxICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1vbVsxXSArPSB4MTsgICAgICAgICAgICAgICAgICAvKiBtMTAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbW9tWzBdICs9IHgwOyAgICAgICAgICAgICAgICAgIC8qIG0wMCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCB4ID0gMDsgeCA8IDEwOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbW9tZW50c1t4XSA9IChkb3VibGUpbW9tW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX0NBTENfTU9NRU5UU19JTl9USUxFKCBDVl9OT1AsIE1vbWVudHNJblRpbGUsIDh1LCB1Y2hhciwgaW50LCBpbnQgKQorSUNWX0RFRl9DQUxDX01PTUVOVFNfSU5fVElMRSggQ1ZfTk9QLCBNb21lbnRzSW5UaWxlLCAxNnUsIHVzaG9ydCwgaW50LCBpbnQ2NCApCitJQ1ZfREVGX0NBTENfTU9NRU5UU19JTl9USUxFKCBDVl9OT1AsIE1vbWVudHNJblRpbGUsIDE2cywgc2hvcnQsIGludCwgaW50NjQgKQorSUNWX0RFRl9DQUxDX01PTUVOVFNfSU5fVElMRSggQ1ZfTk9QLCBNb21lbnRzSW5UaWxlLCAzMmYsIGZsb2F0LCBkb3VibGUsIGRvdWJsZSApCitJQ1ZfREVGX0NBTENfTU9NRU5UU19JTl9USUxFKCBDVl9OT1AsIE1vbWVudHNJblRpbGUsIDY0ZiwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSApCisKK0lDVl9ERUZfQ0FMQ19NT01FTlRTX0lOX1RJTEUoIENWX05PTlpFUk8sIE1vbWVudHNJblRpbGVCaW4sIDh1LCB1Y2hhciwgaW50LCBpbnQgKQorSUNWX0RFRl9DQUxDX01PTUVOVFNfSU5fVElMRSggQ1ZfTk9OWkVSTywgTW9tZW50c0luVGlsZUJpbiwgMTZzLCB1c2hvcnQsIGludCwgaW50ICkKK0lDVl9ERUZfQ0FMQ19NT01FTlRTX0lOX1RJTEUoIENWX05PTlpFUk9fRkxULCBNb21lbnRzSW5UaWxlQmluLCAzMmYsIGludCwgaW50LCBpbnQgKQorSUNWX0RFRl9DQUxDX01PTUVOVFNfSU5fVElMRSggQ1ZfTk9OWkVST19GTFQsIE1vbWVudHNJblRpbGVCaW4sIDY0ZiwgaW50NjQsIGRvdWJsZSwgZG91YmxlICkKKworI2RlZmluZSBpY3ZNb21lbnRzSW5UaWxlXzhzX0NuQ1IgIDAKKyNkZWZpbmUgaWN2TW9tZW50c0luVGlsZV8zMnNfQ25DUiAgMAorI2RlZmluZSBpY3ZNb21lbnRzSW5UaWxlQmluXzhzX0NuQ1IgICBpY3ZNb21lbnRzSW5UaWxlQmluXzh1X0NuQ1IKKyNkZWZpbmUgaWN2TW9tZW50c0luVGlsZUJpbl8xNnVfQ25DUiAgIGljdk1vbWVudHNJblRpbGVCaW5fMTZzX0NuQ1IKKyNkZWZpbmUgaWN2TW9tZW50c0luVGlsZUJpbl8zMnNfQ25DUiAgMAorCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTW9tZW50c0luVGlsZSwgQ25DUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTW9tZW50c0luVGlsZUJpbiwgQ25DUiApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSVBQIG1vbWVudCBmdW5jdGlvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitpY3ZNb21lbnRzXzh1X0MxUl90IGljdk1vbWVudHNfOHVfQzFSX3AgPSAwOworaWN2TW9tZW50c18zMmZfQzFSX3QgaWN2TW9tZW50c18zMmZfQzFSX3AgPSAwOworaWN2TW9tZW50SW5pdEFsbG9jXzY0Zl90IGljdk1vbWVudEluaXRBbGxvY182NGZfcCA9IDA7CitpY3ZNb21lbnRGcmVlXzY0Zl90IGljdk1vbWVudEZyZWVfNjRmX3AgPSAwOworaWN2R2V0U3BhdGlhbE1vbWVudF82NGZfdCBpY3ZHZXRTcGF0aWFsTW9tZW50XzY0Zl9wID0gMDsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2TW9tZW50SVBQRnVuYykKKyAgICAoIGNvbnN0IHZvaWQqIGltZywgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLCB2b2lkKiBtb21lbnRzdGF0ZSApOworCitDVl9JTVBMIHZvaWQKK2N2TW9tZW50cyggY29uc3Qgdm9pZCogYXJyYXksIEN2TW9tZW50cyogbW9tZW50cywgaW50IGJpbmFyeSApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG1vbV90YWI7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG1vbWJpbl90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBkb3VibGUqIHRpbGVzID0gMDsKKyAgICB2b2lkKiBpcHBtb21lbnRzdGF0ZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZNb21lbnRzIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDAsIGRlcHRoLCBjbiwgcGl4X3NpemU7CisgICAgaW50IGNvaSA9IDA7CisgICAgaW50IHgsIHksIGssIHRpbGVfbnVtID0gMTsKKyAgICBDdlNpemUgc2l6ZSwgdGlsZV9zaXplID0geyAzMiwgMzIgfTsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnJheTsKKyAgICBDdkZ1bmMyRG5DXzFBMVAgZnVuYyA9IDA7CisgICAgQ3ZNb21lbnRJUFBGdW5jIGlwcF9mdW5jID0gMDsKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXEqIGNvbnRvdXIgPSAwOworICAgIEN2U2VxQmxvY2sgYmxvY2s7CisKKyAgICBpZiggQ1ZfSVNfU0VRKCBhcnJheSApKQorICAgIHsKKyAgICAgICAgY29udG91ciA9IChDdlNlcSopYXJyYXk7CisgICAgICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT04oIGNvbnRvdXIgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgcGFzc2VkIHNlcXVlbmNlIGlzIG5vdCBhIHZhbGlkIGNvbnRvdXIiICk7CisgICAgfQorCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRNb21lbnRzSW5UaWxlQ25DUlRhYmxlKCAmbW9tX3RhYiApOworICAgICAgICBpY3ZJbml0TW9tZW50c0luVGlsZUJpbkNuQ1JUYWJsZSggJm1vbWJpbl90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorICAgIAorICAgIGlmKCAhbW9tZW50cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgbWVtc2V0KCBtb21lbnRzLCAwLCBzaXplb2YoKm1vbWVudHMpKTsKKworICAgIGlmKCAhY29udG91ciApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaSApKTsKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKCBtYXQtPnR5cGUgKTsKKworICAgICAgICBpZiggdHlwZSA9PSBDVl8zMlNDMiB8fCB0eXBlID09IENWXzMyRkMyICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggY29udG91ciA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgICAgIENWX1NFUV9LSU5EX0NVUlZFIHwgQ1ZfU0VRX0ZMQUdfQ0xPU0VELAorICAgICAgICAgICAgICAgIG1hdCwgJmNvbnRvdXJfaGVhZGVyLCAmYmxvY2sgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggY29udG91ciApCisgICAgeworICAgICAgICBpY3ZDb250b3VyTW9tZW50cyggY29udG91ciwgbW9tZW50cyApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0LT50eXBlICk7CisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoIHR5cGUgKTsKKyAgICBjbiA9IENWX01BVF9DTiggdHlwZSApOworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworCisgICAgaWYoIGNuID4gMSAmJiBjb2kgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGltYWdlIHR5cGUiICk7CisKKyAgICBpZiggc2l6ZS53aWR0aCA8PSAwIHx8IHNpemUuaGVpZ2h0IDw9IDAgKQorICAgIHsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggdHlwZSA9PSBDVl84VUMxICkKKyAgICAgICAgaXBwX2Z1bmMgPSAoQ3ZNb21lbnRJUFBGdW5jKWljdk1vbWVudHNfOHVfQzFSX3A7CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgIGlwcF9mdW5jID0gKEN2TW9tZW50SVBQRnVuYylpY3ZNb21lbnRzXzMyZl9DMVJfcDsKKworICAgIGlmKCBpcHBfZnVuYyAmJiAhYmluYXJ5ICkKKyAgICB7CisgICAgICAgIGludCBtYXRzdGVwID0gbWF0LT5zdGVwID8gbWF0LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICBJUFBJX0NBTEwoIGljdk1vbWVudEluaXRBbGxvY182NGZfcCggJmlwcG1vbWVudHN0YXRlLCBjdkFsZ0hpbnRBY2N1cmF0ZSApKTsKKyAgICAgICAgSVBQSV9DQUxMKCBpcHBfZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0c3RlcCwgc2l6ZSwgaXBwbW9tZW50c3RhdGUgKSk7CisgICAgICAgIGljdkdldFNwYXRpYWxNb21lbnRfNjRmX3AoIGlwcG1vbWVudHN0YXRlLCAwLCAwLCAwLCBjdlBvaW50KDAsMCksICZtb21lbnRzLT5tMDAgKTsKKyAgICAgICAgaWN2R2V0U3BhdGlhbE1vbWVudF82NGZfcCggaXBwbW9tZW50c3RhdGUsIDEsIDAsIDAsIGN2UG9pbnQoMCwwKSwgJm1vbWVudHMtPm0xMCApOworICAgICAgICBpY3ZHZXRTcGF0aWFsTW9tZW50XzY0Zl9wKCBpcHBtb21lbnRzdGF0ZSwgMCwgMSwgMCwgY3ZQb2ludCgwLDApLCAmbW9tZW50cy0+bTAxICk7CisgICAgICAgIGljdkdldFNwYXRpYWxNb21lbnRfNjRmX3AoIGlwcG1vbWVudHN0YXRlLCAyLCAwLCAwLCBjdlBvaW50KDAsMCksICZtb21lbnRzLT5tMjAgKTsKKyAgICAgICAgaWN2R2V0U3BhdGlhbE1vbWVudF82NGZfcCggaXBwbW9tZW50c3RhdGUsIDEsIDEsIDAsIGN2UG9pbnQoMCwwKSwgJm1vbWVudHMtPm0xMSApOworICAgICAgICBpY3ZHZXRTcGF0aWFsTW9tZW50XzY0Zl9wKCBpcHBtb21lbnRzdGF0ZSwgMCwgMiwgMCwgY3ZQb2ludCgwLDApLCAmbW9tZW50cy0+bTAyICk7CisgICAgICAgIGljdkdldFNwYXRpYWxNb21lbnRfNjRmX3AoIGlwcG1vbWVudHN0YXRlLCAzLCAwLCAwLCBjdlBvaW50KDAsMCksICZtb21lbnRzLT5tMzAgKTsKKyAgICAgICAgaWN2R2V0U3BhdGlhbE1vbWVudF82NGZfcCggaXBwbW9tZW50c3RhdGUsIDIsIDEsIDAsIGN2UG9pbnQoMCwwKSwgJm1vbWVudHMtPm0yMSApOworICAgICAgICBpY3ZHZXRTcGF0aWFsTW9tZW50XzY0Zl9wKCBpcHBtb21lbnRzdGF0ZSwgMSwgMiwgMCwgY3ZQb2ludCgwLDApLCAmbW9tZW50cy0+bTEyICk7CisgICAgICAgIGljdkdldFNwYXRpYWxNb21lbnRfNjRmX3AoIGlwcG1vbWVudHN0YXRlLCAwLCAzLCAwLCBjdlBvaW50KDAsMCksICZtb21lbnRzLT5tMDMgKTsKKyAgICAgICAgaWN2Q29tcGxldGVNb21lbnRTdGF0ZSggbW9tZW50cyApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGZ1bmMgPSAoQ3ZGdW5jMkRuQ18xQTFQKSghYmluYXJ5ID8gbW9tX3RhYi5mbl8yZFtkZXB0aF0gOiBtb21iaW5fdGFiLmZuXzJkW2RlcHRoXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggZGVwdGggPj0gQ1ZfMzJTICYmICFiaW5hcnkgKQorICAgICAgICB0aWxlX3NpemUgPSBzaXplOworICAgIGVsc2UKKyAgICAgICAgdGlsZV9udW0gPSAoKHNpemUud2lkdGggKyB0aWxlX3NpemUud2lkdGggLSAxKS90aWxlX3NpemUud2lkdGgpKgorICAgICAgICAgICAgICAgICAgICgoc2l6ZS5oZWlnaHQgKyB0aWxlX3NpemUuaGVpZ2h0IC0gMSkvdGlsZV9zaXplLmhlaWdodCk7CisKKyAgICBDVl9DQUxMKCB0aWxlcyA9IChkb3VibGUqKWN2QWxsb2MoIHRpbGVfbnVtKjEwKnNpemVvZihkb3VibGUpKSk7CisKKyAgICBmb3IoIHkgPSAwLCBrID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5ICs9IHRpbGVfc2l6ZS5oZWlnaHQgKQorICAgIHsKKyAgICAgICAgQ3ZTaXplIGN1cl90aWxlX3NpemUgPSB0aWxlX3NpemU7CisgICAgICAgIGlmKCB5ICsgY3VyX3RpbGVfc2l6ZS5oZWlnaHQgPiBzaXplLmhlaWdodCApCisgICAgICAgICAgICBjdXJfdGlsZV9zaXplLmhlaWdodCA9IHNpemUuaGVpZ2h0IC0geTsKKyAgICAgICAgCisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4ICs9IHRpbGVfc2l6ZS53aWR0aCwgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHggKyBjdXJfdGlsZV9zaXplLndpZHRoID4gc2l6ZS53aWR0aCApCisgICAgICAgICAgICAgICAgY3VyX3RpbGVfc2l6ZS53aWR0aCA9IHNpemUud2lkdGggLSB4OworCisgICAgICAgICAgICBhc3NlcnQoIGsgPCB0aWxlX251bSApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIgKyB5Km1hdC0+c3RlcCArIHgqcGl4X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdC0+c3RlcCwgY3VyX3RpbGVfc2l6ZSwgY24sIGNvaSwgdGlsZXMgKyBrKjEwICkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWN2QWNjdW11bGF0ZU1vbWVudHMoIHRpbGVzLCBzaXplLCB0aWxlX3NpemUsIG1vbWVudHMgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggaXBwbW9tZW50c3RhdGUgKQorICAgICAgICBpY3ZNb21lbnRGcmVlXzY0Zl9wKCBpcHBtb21lbnRzdGF0ZSApOworCisgICAgY3ZGcmVlKCAmdGlsZXMgKTsKK30KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBjdkdldEh1TW9tZW50cworLy8gICAgUHVycG9zZTogUmV0dXJucyBIdSBtb21lbnRzCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgbVN0YXRlICAtIG1vbWVudCBzdHJ1Y3R1cmUgZmlsbGVkIGJ5IG9uZSBvZiB0aGUgaWN2TW9tZW50c1tCaW5hcnldKioqIGZ1bmN0aW9uCisvLyAgICAgIEh1U3RhdGUgLSBwb2ludGVyIHRvIG91dHB1dCBzdHJ1Y3R1cmUgY29udGFpbmluZyBzZXZlbiBIdSBtb21lbnRzCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBDVl9OT19FUlIgaWYgc3VjY2VzcyBvciBlcnJvciBjb2RlCisvLyAgICBOb3RlczoKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2R2V0SHVNb21lbnRzKCBDdk1vbWVudHMgKiBtU3RhdGUsIEN2SHVNb21lbnRzICogSHVTdGF0ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldEh1TW9tZW50cyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhbVN0YXRlIHx8ICFIdVN0YXRlICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX05VTExQVFJfRVJSICk7CisKKyAgICB7CisgICAgICAgIGRvdWJsZSBtMDBzID0gbVN0YXRlLT5pbnZfc3FydF9tMDAsIG0wMCA9IG0wMHMgKiBtMDBzLCBzMiA9IG0wMCAqIG0wMCwgczMgPSBzMiAqIG0wMHM7CisKKyAgICAgICAgZG91YmxlIG51MjAgPSBtU3RhdGUtPm11MjAgKiBzMiwKKyAgICAgICAgICAgIG51MTEgPSBtU3RhdGUtPm11MTEgKiBzMiwKKyAgICAgICAgICAgIG51MDIgPSBtU3RhdGUtPm11MDIgKiBzMiwKKyAgICAgICAgICAgIG51MzAgPSBtU3RhdGUtPm11MzAgKiBzMywKKyAgICAgICAgICAgIG51MjEgPSBtU3RhdGUtPm11MjEgKiBzMywgbnUxMiA9IG1TdGF0ZS0+bXUxMiAqIHMzLCBudTAzID0gbVN0YXRlLT5tdTAzICogczM7CisKKyAgICAgICAgZG91YmxlIHQwID0gbnUzMCArIG51MTI7CisgICAgICAgIGRvdWJsZSB0MSA9IG51MjEgKyBudTAzOworCisgICAgICAgIGRvdWJsZSBxMCA9IHQwICogdDAsIHExID0gdDEgKiB0MTsKKworICAgICAgICBkb3VibGUgbjQgPSA0ICogbnUxMTsKKyAgICAgICAgZG91YmxlIHMgPSBudTIwICsgbnUwMjsKKyAgICAgICAgZG91YmxlIGQgPSBudTIwIC0gbnUwMjsKKworICAgICAgICBIdVN0YXRlLT5odTEgPSBzOworICAgICAgICBIdVN0YXRlLT5odTIgPSBkICogZCArIG40ICogbnUxMTsKKyAgICAgICAgSHVTdGF0ZS0+aHU0ID0gcTAgKyBxMTsKKyAgICAgICAgSHVTdGF0ZS0+aHU2ID0gZCAqIChxMCAtIHExKSArIG40ICogdDAgKiB0MTsKKworICAgICAgICB0MCAqPSBxMCAtIDMgKiBxMTsKKyAgICAgICAgdDEgKj0gMyAqIHEwIC0gcTE7CisKKyAgICAgICAgcTAgPSBudTMwIC0gMyAqIG51MTI7CisgICAgICAgIHExID0gMyAqIG51MjEgLSBudTAzOworCisgICAgICAgIEh1U3RhdGUtPmh1MyA9IHEwICogcTAgKyBxMSAqIHExOworICAgICAgICBIdVN0YXRlLT5odTUgPSBxMCAqIHQwICsgcTEgKiB0MTsKKyAgICAgICAgSHVTdGF0ZS0+aHU3ID0gcTEgKiB0MCAtIHEwICogdDE7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2R2V0U3BhdGlhbE1vbWVudAorLy8gICAgUHVycG9zZTogIFJldHVybnMgc3BhdGlhbCBtb21lbnQoeF9vcmRlciwgeV9vcmRlcikgd2hpY2ggaXMgZGV0ZXJtaW5lZCBhczoKKy8vICAgICAgICAgICAgICBtKHhfbyx5X28pID0gc3VtICh4IF4geF9vKSooeSBeIHlfbykqSSh4LHkpCisvLyAgICAgICAgICAgICAgMCA8PSB4X28sIHlfbzsgeF9vICsgeV9vIDw9IDMKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBtb20gIC0gbW9tZW50IHN0cnVjdHVyZSBmaWxsZWQgYnkgb25lIG9mIHRoZSBpY3ZNb21lbnRzW0JpbmFyeV0qKiogZnVuY3Rpb24KKy8vICAgICAgeF9vcmRlciAtIHggb3JkZXIgb2YgdGhlIG1vbWVudAorLy8gICAgICB5X29yZGVyIC0geSBvcmRlciBvZiB0aGUgbW9tZW50CisvLyAgICBSZXR1cm5zOgorLy8gICAgICBtb21lbnQgdmFsdWUgb3IgbGFyZ2UgbmVnYXRpdmUgbnVtYmVyICgtREJMX01BWCkgaWYgZXJyb3IKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgZG91YmxlCitjdkdldFNwYXRpYWxNb21lbnQoIEN2TW9tZW50cyAqIG1vbWVudHMsIGludCB4X29yZGVyLCBpbnQgeV9vcmRlciApCit7CisgICAgaW50IG9yZGVyID0geF9vcmRlciArIHlfb3JkZXI7CisgICAgZG91YmxlIG1vbWVudCA9IC1EQkxfTUFYOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldFNwYXRpYWxNb21lbnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIW1vbWVudHMgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfTlVMTFBUUl9FUlIgKTsKKyAgICBpZiggKHhfb3JkZXIgfCB5X29yZGVyKSA8IDAgfHwgb3JkZXIgPiAzICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBRFJBTkdFX0VSUiApOworCisgICAgbW9tZW50ID0gKCYobW9tZW50cy0+bTAwKSlbb3JkZXIgKyAob3JkZXIgPj4gMSkgKyAob3JkZXIgPiAyKSAqIDIgKyB5X29yZGVyXTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbW9tZW50OworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZHZXRDZW50cmFsTW9tZW50CisvLyAgICBQdXJwb3NlOiAgUmV0dXJucyBjZW50cmFsIG1vbWVudCh4X29yZGVyLCB5X29yZGVyKSB3aGljaCBpcyBkZXRlcm1pbmVkIGFzOgorLy8gICAgICAgICAgICAgIG11KHhfbyx5X28pID0gc3VtICgoeCAtIHhjKV4geF9vKSooKHkgLSB5YykgXiB5X28pKkkoeCx5KQorLy8gICAgICAgICAgICAgIDAgPD0geF9vLCB5X287IHhfbyArIHlfbyA8PSAzLAorLy8gICAgICAgICAgICAgICh4YywgeWMpID0gKG0xMC9tMDAsbTAxL20wMCkgLSBjZW50ZXIgb2YgZ3Jhdml0eSAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBtb20gIC0gbW9tZW50IHN0cnVjdHVyZSBmaWxsZWQgYnkgb25lIG9mIHRoZSBpY3ZNb21lbnRzW0JpbmFyeV0qKiogZnVuY3Rpb24KKy8vICAgICAgeF9vcmRlciAtIHggb3JkZXIgb2YgdGhlIG1vbWVudAorLy8gICAgICB5X29yZGVyIC0geSBvcmRlciBvZiB0aGUgbW9tZW50CisvLyAgICBSZXR1cm5zOgorLy8gICAgICBtb21lbnQgdmFsdWUgb3IgbGFyZ2UgbmVnYXRpdmUgbnVtYmVyICgtREJMX01BWCkgaWYgZXJyb3IKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgZG91YmxlCitjdkdldENlbnRyYWxNb21lbnQoIEN2TW9tZW50cyAqIG1vbWVudHMsIGludCB4X29yZGVyLCBpbnQgeV9vcmRlciApCit7CisgICAgaW50IG9yZGVyID0geF9vcmRlciArIHlfb3JkZXI7CisgICAgZG91YmxlIG11ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRDZW50cmFsTW9tZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFtb21lbnRzICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX05VTExQVFJfRVJSICk7CisgICAgaWYoICh4X29yZGVyIHwgeV9vcmRlcikgPCAwIHx8IG9yZGVyID4gMyApCisgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9CQURSQU5HRV9FUlIgKTsKKworICAgIGlmKCBvcmRlciA+PSAyICkKKyAgICB7CisgICAgICAgIG11ID0gKCYobW9tZW50cy0+bTAwKSlbNCArIG9yZGVyICogMyArIHlfb3JkZXJdOworICAgIH0KKyAgICBlbHNlIGlmKCBvcmRlciA9PSAwICkKKyAgICAgICAgbXUgPSBtb21lbnRzLT5tMDA7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG11OworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZHZXROb3JtYWxpemVkQ2VudHJhbE1vbWVudAorLy8gICAgUHVycG9zZTogUmV0dXJucyBub3JtYWxpemVkIGNlbnRyYWwgbW9tZW50KHhfb3JkZXIseV9vcmRlcikgd2hpY2ggaXMgZGV0ZXJtaW5lZCBhczoKKy8vICAgICAgICAgICAgIG51KHhfbyx5X28pID0gbXUoeF9vLCB5X28pLyhtMDAgXiAoKCh4X28gKyB5X28pLzIpICsgMSkpCisvLyAgICAgICAgICAgICAwIDw9IHhfbywgeV9vOyB4X28gKyB5X28gPD0gMywKKy8vICAgICAgICAgICAgICh4YywgeWMpID0gKG0xMC9tMDAsbTAxL20wMCkgLSBjZW50ZXIgb2YgZ3Jhdml0eSAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBtb20gIC0gbW9tZW50IHN0cnVjdHVyZSBmaWxsZWQgYnkgb25lIG9mIHRoZSBpY3ZNb21lbnRzW0JpbmFyeV0qKiogZnVuY3Rpb24KKy8vICAgICAgeF9vcmRlciAtIHggb3JkZXIgb2YgdGhlIG1vbWVudAorLy8gICAgICB5X29yZGVyIC0geSBvcmRlciBvZiB0aGUgbW9tZW50CisvLyAgICBSZXR1cm5zOgorLy8gICAgICBtb21lbnQgdmFsdWUgb3IgbGFyZ2UgbmVnYXRpdmUgbnVtYmVyICgtREJMX01BWCkgaWYgZXJyb3IKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgZG91YmxlCitjdkdldE5vcm1hbGl6ZWRDZW50cmFsTW9tZW50KCBDdk1vbWVudHMgKiBtb21lbnRzLCBpbnQgeF9vcmRlciwgaW50IHlfb3JkZXIgKQoreworICAgIGludCBvcmRlciA9IHhfb3JkZXIgKyB5X29yZGVyOworICAgIGRvdWJsZSBtdSA9IDA7CisgICAgZG91YmxlIG0wMHMsIG0wMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRDZW50cmFsTm9ybWFsaXplZE1vbWVudCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIG11ID0gY3ZHZXRDZW50cmFsTW9tZW50KCBtb21lbnRzLCB4X29yZGVyLCB5X29yZGVyICk7CisgICAgQ1ZfQ0hFQ0soKTsKKworICAgIG0wMHMgPSBtb21lbnRzLT5pbnZfc3FydF9tMDA7CisgICAgbTAwID0gbTAwcyAqIG0wMHM7CisKKyAgICB3aGlsZSggLS1vcmRlciA+PSAwICkKKyAgICAgICAgbTAwICo9IG0wMHM7CisgICAgbXUgKj0gbTAwOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBtdTsKK30KKworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdm1vcnBoLmNwcCBiL2N2L3NyYy9jdm1vcnBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTI4OTllCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2bW9ycGguY3BwCkBAIC0wLDAgKzEsMTE3MyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIElQQ1ZfTU9SUEhPTE9HWV9QVFJTKCBtb3JwaHR5cGUsIGZsYXZvciApICAgICAgICAgICAgICAgXAorICAgIGljdiMjbW9ycGh0eXBlIyNSZWN0XyMjZmxhdm9yIyNfQzFSX3QgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2IyNtb3JwaHR5cGUjI1JlY3RfIyNmbGF2b3IjI19DMVJfcCA9IDA7ICAgICAgICAgICAgICBcCisgICAgaWN2IyNtb3JwaHR5cGUjI1JlY3RfR2V0QnVmU2l6ZV8jI2ZsYXZvciMjX0MxUl90ICAgICAgICAgICAgXAorICAgICAgICBpY3YjI21vcnBodHlwZSMjUmVjdF9HZXRCdWZTaXplXyMjZmxhdm9yIyNfQzFSX3AgPSAwOyAgIFwKKyAgICBpY3YjI21vcnBodHlwZSMjUmVjdF8jI2ZsYXZvciMjX0MzUl90ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGljdiMjbW9ycGh0eXBlIyNSZWN0XyMjZmxhdm9yIyNfQzNSX3AgPSAwOyAgICAgICAgICAgICAgXAorICAgIGljdiMjbW9ycGh0eXBlIyNSZWN0X0dldEJ1ZlNpemVfIyNmbGF2b3IjI19DM1JfdCAgICAgICAgICAgIFwKKyAgICAgICAgaWN2IyNtb3JwaHR5cGUjI1JlY3RfR2V0QnVmU2l6ZV8jI2ZsYXZvciMjX0MzUl9wID0gMDsgICBcCisgICAgaWN2IyNtb3JwaHR5cGUjI1JlY3RfIyNmbGF2b3IjI19DNFJfdCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3YjI21vcnBodHlwZSMjUmVjdF8jI2ZsYXZvciMjX0M0Ul9wID0gMDsgICAgICAgICAgICAgIFwKKyAgICBpY3YjI21vcnBodHlwZSMjUmVjdF9HZXRCdWZTaXplXyMjZmxhdm9yIyNfQzRSX3QgICAgICAgICAgICBcCisgICAgICAgIGljdiMjbW9ycGh0eXBlIyNSZWN0X0dldEJ1ZlNpemVfIyNmbGF2b3IjI19DNFJfcCA9IDA7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpY3YjI21vcnBodHlwZSMjXyMjZmxhdm9yIyNfQzFSX3QgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGljdiMjbW9ycGh0eXBlIyNfIyNmbGF2b3IjI19DMVJfcCA9IDA7ICAgICAgICAgICAgICAgICAgXAorICAgIGljdiMjbW9ycGh0eXBlIyNfIyNmbGF2b3IjI19DM1JfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2IyNtb3JwaHR5cGUjI18jI2ZsYXZvciMjX0MzUl9wID0gMDsgICAgICAgICAgICAgICAgICBcCisgICAgaWN2IyNtb3JwaHR5cGUjI18jI2ZsYXZvciMjX0M0Ul90ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3YjI21vcnBodHlwZSMjXyMjZmxhdm9yIyNfQzRSX3AgPSAwOworCisjZGVmaW5lIElQQ1ZfTU9SUEhPTE9HWV9JTklUQUxMT0NfUFRSUyggZmxhdm9yICkgICAgICAgICAgICAgICAgXAorICAgIGljdk1vcnBoSW5pdEFsbG9jXyMjZmxhdm9yIyNfQzFSX3QgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2TW9ycGhJbml0QWxsb2NfIyNmbGF2b3IjI19DMVJfcCA9IDA7ICAgICAgICAgICAgICAgICBcCisgICAgaWN2TW9ycGhJbml0QWxsb2NfIyNmbGF2b3IjI19DM1JfdCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3ZNb3JwaEluaXRBbGxvY18jI2ZsYXZvciMjX0MzUl9wID0gMDsgICAgICAgICAgICAgICAgIFwKKyAgICBpY3ZNb3JwaEluaXRBbGxvY18jI2ZsYXZvciMjX0M0Ul90ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGljdk1vcnBoSW5pdEFsbG9jXyMjZmxhdm9yIyNfQzRSX3AgPSAwOworCitJUENWX01PUlBIT0xPR1lfUFRSUyggRXJvZGUsIDh1ICkKK0lQQ1ZfTU9SUEhPTE9HWV9QVFJTKCBFcm9kZSwgMTZ1ICkKK0lQQ1ZfTU9SUEhPTE9HWV9QVFJTKCBFcm9kZSwgMzJmICkKK0lQQ1ZfTU9SUEhPTE9HWV9QVFJTKCBEaWxhdGUsIDh1ICkKK0lQQ1ZfTU9SUEhPTE9HWV9QVFJTKCBEaWxhdGUsIDE2dSApCitJUENWX01PUlBIT0xPR1lfUFRSUyggRGlsYXRlLCAzMmYgKQorSVBDVl9NT1JQSE9MT0dZX0lOSVRBTExPQ19QVFJTKCA4dSApCitJUENWX01PUlBIT0xPR1lfSU5JVEFMTE9DX1BUUlMoIDE2dSApCitJUENWX01PUlBIT0xPR1lfSU5JVEFMTE9DX1BUUlMoIDMyZiApCisKK2ljdk1vcnBoRnJlZV90IGljdk1vcnBoRnJlZV9wID0gMDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICBCYXNpYyBNb3JwaG9sb2dpY2FsIE9wZXJhdGlvbnM6IEVyb3Npb24gJiBEaWxhdGlvbgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGljdkVyb2RlUmVjdFJvd184dSggY29uc3QgdWNoYXIqIHNyYywgdWNoYXIqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZFcm9kZVJlY3RSb3dfMTZ1KCBjb25zdCB1c2hvcnQqIHNyYywgdXNob3J0KiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RXJvZGVSZWN0Um93XzMyZiggY29uc3QgaW50KiBzcmMsIGludCogZHN0LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkRpbGF0ZVJlY3RSb3dfOHUoIGNvbnN0IHVjaGFyKiBzcmMsIHVjaGFyKiBkc3QsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RGlsYXRlUmVjdFJvd18xNnUoIGNvbnN0IHVzaG9ydCogc3JjLCB1c2hvcnQqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZEaWxhdGVSZWN0Um93XzMyZiggY29uc3QgaW50KiBzcmMsIGludCogZHN0LCB2b2lkKiBwYXJhbXMgKTsKKworc3RhdGljIHZvaWQgaWN2RXJvZGVSZWN0Q29sXzh1KCBjb25zdCB1Y2hhcioqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RXJvZGVSZWN0Q29sXzE2dSggY29uc3QgdXNob3J0Kiogc3JjLCB1c2hvcnQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkVyb2RlUmVjdENvbF8zMmYoIGNvbnN0IGludCoqIHNyYywgaW50KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZEaWxhdGVSZWN0Q29sXzh1KCBjb25zdCB1Y2hhcioqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkRpbGF0ZVJlY3RDb2xfMTZ1KCBjb25zdCB1c2hvcnQqKiBzcmMsIHVzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkRpbGF0ZVJlY3RDb2xfMzJmKCBjb25zdCBpbnQqKiBzcmMsIGludCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKKworc3RhdGljIHZvaWQgaWN2RXJvZGVBbnlfOHUoIGNvbnN0IHVjaGFyKiogc3JjLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdkVyb2RlQW55XzE2dSggY29uc3QgdXNob3J0Kiogc3JjLCB1c2hvcnQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RXJvZGVBbnlfMzJmKCBjb25zdCBpbnQqKiBzcmMsIGludCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZEaWxhdGVBbnlfOHUoIGNvbnN0IHVjaGFyKiogc3JjLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZEaWxhdGVBbnlfMTZ1KCBjb25zdCB1c2hvcnQqKiBzcmMsIHVzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2RGlsYXRlQW55XzMyZiggY29uc3QgaW50Kiogc3JjLCBpbnQqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKTsKKworQ3ZNb3JwaG9sb2d5OjpDdk1vcnBob2xvZ3koKQoreworICAgIGVsZW1lbnQgPSAwOworICAgIGVsX3NwYXJzZSA9IDA7Cit9CisKK0N2TW9ycGhvbG9neTo6Q3ZNb3JwaG9sb2d5KCBpbnQgX29wZXJhdGlvbiwgaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfZWxlbWVudF9zaGFwZSwgQ3ZNYXQqIF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBfa3NpemUsIEN2UG9pbnQgX2FuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlLCBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBlbGVtZW50ID0gMDsKKyAgICBlbF9zcGFyc2UgPSAwOworICAgIGluaXQoIF9vcGVyYXRpb24sIF9tYXhfd2lkdGgsIF9zcmNfZHN0X3R5cGUsCisgICAgICAgICAgX2VsZW1lbnRfc2hhcGUsIF9lbGVtZW50LCBfa3NpemUsIF9hbmNob3IsCisgICAgICAgICAgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7Cit9CisKKwordm9pZCBDdk1vcnBob2xvZ3k6OmNsZWFyKCkKK3sKKyAgICBjdlJlbGVhc2VNYXQoICZlbGVtZW50ICk7CisgICAgY3ZGcmVlKCAmZWxfc3BhcnNlICk7CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6OmNsZWFyKCk7Cit9CisKKworQ3ZNb3JwaG9sb2d5Ojp+Q3ZNb3JwaG9sb2d5KCkKK3sKKyAgICBjbGVhcigpOworfQorCisKK3ZvaWQgQ3ZNb3JwaG9sb2d5Ojppbml0KCBpbnQgX29wZXJhdGlvbiwgaW50IF9tYXhfd2lkdGgsIGludCBfc3JjX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfZWxlbWVudF9zaGFwZSwgQ3ZNYXQqIF9lbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBfa3NpemUsIEN2UG9pbnQgX2FuY2hvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX2JvcmRlcl9tb2RlLCBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2TW9ycGhvbG9neTo6aW5pdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBkZXB0aCA9IENWX01BVF9ERVBUSChfc3JjX2RzdF90eXBlKTsKKyAgICBpbnQgZWxfdHlwZSA9IDAsIG56ID0gLTE7CisgICAgCisgICAgaWYoIF9vcGVyYXRpb24gIT0gRVJPREUgJiYgX29wZXJhdGlvbiAhPSBESUxBVEUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93bi91bnN1cHBvcnRlZCBtb3JwaG9sb2dpY2FsIG9wZXJhdGlvbiIgKTsKKworICAgIGlmKCBfZWxlbWVudF9zaGFwZSA9PSBDVVNUT00gKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoX2VsZW1lbnQpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAic3RydWN0dXJpbmcgZWxlbWVudCBzaG91bGQgYmUgdmFsaWQgbWF0cml4IGlmIENVU1RPTSBlbGVtZW50IHNoYXBlIGlzIHNwZWNpZmllZCIgKTsKKworICAgICAgICBlbF90eXBlID0gQ1ZfTUFUX1RZUEUoX2VsZW1lbnQtPnR5cGUpOworICAgICAgICBpZiggZWxfdHlwZSAhPSBDVl84VUMxICYmIGVsX3R5cGUgIT0gQ1ZfMzJTQzEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAidGhlIHN0cnVjdHVyaW5nIGVsZW1lbnQgbXVzdCBoYXZlIDh1QzEgb3IgMzJzQzEgdHlwZSIgKTsKKworICAgICAgICBfa3NpemUgPSBjdkdldE1hdFNpemUoX2VsZW1lbnQpOworICAgICAgICBDVl9DQUxMKCBueiA9IGN2Q291bnROb25aZXJvKF9lbGVtZW50KSk7CisgICAgICAgIGlmKCBueiA9PSBfa3NpemUud2lkdGgqX2tzaXplLmhlaWdodCApCisgICAgICAgICAgICBfZWxlbWVudF9zaGFwZSA9IFJFQ1Q7CisgICAgfQorCisgICAgb3BlcmF0aW9uID0gX29wZXJhdGlvbjsKKyAgICBlbF9zaGFwZSA9IF9lbGVtZW50X3NoYXBlOworCisgICAgQ1ZfQ0FMTCggQ3ZCYXNlSW1hZ2VGaWx0ZXI6OmluaXQoIF9tYXhfd2lkdGgsIF9zcmNfZHN0X3R5cGUsIF9zcmNfZHN0X3R5cGUsCisgICAgICAgIF9lbGVtZW50X3NoYXBlID09IFJFQ1QsIF9rc2l6ZSwgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICkpOworCisgICAgaWYoIGVsX3NoYXBlID09IFJFQ1QgKQorICAgIHsKKyAgICAgICAgaWYoIG9wZXJhdGlvbiA9PSBFUk9ERSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZFcm9kZVJlY3RSb3dfOHUsCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZFcm9kZVJlY3RDb2xfOHU7CisgICAgICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8xNlUgKQorICAgICAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2RXJvZGVSZWN0Um93XzE2dSwKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkVyb2RlUmVjdENvbF8xNnU7CisgICAgICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2RXJvZGVSZWN0Um93XzMyZiwKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkVyb2RlUmVjdENvbF8zMmY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoIG9wZXJhdGlvbiA9PSBESUxBVEUgKTsKKyAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZEaWxhdGVSZWN0Um93Xzh1LAorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RGlsYXRlUmVjdENvbF84dTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGRlcHRoID09IENWXzE2VSApCisgICAgICAgICAgICAgICAgeF9mdW5jID0gKEN2Um93RmlsdGVyRnVuYylpY3ZEaWxhdGVSZWN0Um93XzE2dSwKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkRpbGF0ZVJlY3RDb2xfMTZ1OworICAgICAgICAgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgICAgICB4X2Z1bmMgPSAoQ3ZSb3dGaWx0ZXJGdW5jKWljdkRpbGF0ZVJlY3RSb3dfMzJmLAorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RGlsYXRlUmVjdENvbF8zMmY7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGksIGosIGsgPSAwOworICAgICAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3JjX3R5cGUpOworICAgICAgICBDdlBvaW50KiBuel9sb2M7CisKKyAgICAgICAgaWYoICEoZWxlbWVudCAmJiBlbF9zcGFyc2UgJiYKKyAgICAgICAgICAgIF9rc2l6ZS53aWR0aCA9PSBlbGVtZW50LT5jb2xzICYmIF9rc2l6ZS5oZWlnaHQgPT0gZWxlbWVudC0+cm93cykgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZlbGVtZW50ICk7CisgICAgICAgICAgICBjdkZyZWUoICZlbF9zcGFyc2UgKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGVsZW1lbnQgPSBjdkNyZWF0ZU1hdCggX2tzaXplLmhlaWdodCwgX2tzaXplLndpZHRoLCBDVl84VUMxICkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggZWxfc3BhcnNlID0gKHVjaGFyKiljdkFsbG9jKAorICAgICAgICAgICAgICAgIGtzaXplLndpZHRoKmtzaXplLmhlaWdodCooMipzaXplb2YoaW50KSArIHNpemVvZih1Y2hhciopKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGVsX3NoYXBlID09IENVU1RPTSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q29udmVydCggX2VsZW1lbnQsIGVsZW1lbnQgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBpbml0X2JpbmFyeV9lbGVtZW50KCBlbGVtZW50LCBlbF9zaGFwZSwgYW5jaG9yICkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIG9wZXJhdGlvbiA9PSBFUk9ERSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl84VSApCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZFcm9kZUFueV84dTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGRlcHRoID09IENWXzE2VSApCisgICAgICAgICAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZFcm9kZUFueV8xNnU7CisgICAgICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RXJvZGVBbnlfMzJmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBvcGVyYXRpb24gPT0gRElMQVRFICk7CisgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RGlsYXRlQW55Xzh1OworICAgICAgICAgICAgZWxzZSBpZiggZGVwdGggPT0gQ1ZfMTZVICkKKyAgICAgICAgICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdkRpbGF0ZUFueV8xNnU7CisgICAgICAgICAgICBlbHNlIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2RGlsYXRlQW55XzMyZjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbnpfbG9jID0gKEN2UG9pbnQqKWVsX3NwYXJzZTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwga3NpemUuaGVpZ2h0OyBpKysgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGtzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBlbGVtZW50LT5kYXRhLnB0cltpKmVsZW1lbnQtPnN0ZXAral0gKQorICAgICAgICAgICAgICAgICAgICBuel9sb2NbaysrXSA9IGN2UG9pbnQoaipjbixpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYoIGsgPT0gMCApCisgICAgICAgICAgICBuel9sb2NbaysrXSA9IGN2UG9pbnQoYW5jaG9yLngqY24sYW5jaG9yLnkpOworICAgICAgICBlbF9zcGFyc2VfY291bnQgPSBrOworICAgIH0KKworICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgJiYgYm9yZGVyX21vZGUgPT0gSVBMX0JPUkRFUl9DT05TVEFOVCApCisgICAgeworICAgICAgICBpbnQgaSwgY24gPSBDVl9NQVRfQ04oc3JjX3R5cGUpOworICAgICAgICBpbnQqIGJ0ID0gKGludCopYm9yZGVyX3RhYjsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNuOyBpKysgKQorICAgICAgICAgICAgYnRbaV0gPSBDVl9UT0dHTEVfRkxUKGJ0W2ldKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZNb3JwaG9sb2d5Ojppbml0KCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9pc19zZXBhcmFibGUsIEN2U2l6ZSBfa3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yLCBpbnQgX2JvcmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWUgKQoreworICAgIEN2QmFzZUltYWdlRmlsdGVyOjppbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgX2lzX3NlcGFyYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2tzaXplLCBfYW5jaG9yLCBfYm9yZGVyX21vZGUsIF9ib3JkZXJfdmFsdWUgKTsKK30KKworCit2b2lkIEN2TW9ycGhvbG9neTo6c3RhcnRfcHJvY2VzcyggQ3ZTbGljZSB4X3JhbmdlLCBpbnQgd2lkdGggKQoreworICAgIEN2QmFzZUltYWdlRmlsdGVyOjpzdGFydF9wcm9jZXNzKCB4X3JhbmdlLCB3aWR0aCApOworICAgIGlmKCBlbF9zaGFwZSA9PSBSRUNUICkKKyAgICB7CisgICAgICAgIC8vIGN1dCB0aGUgY3ljbGljIGJ1ZmZlciBvZmYgYnkgMSBsaW5lIGlmIG5lZWQsIHRvIG1ha2UKKyAgICAgICAgLy8gdGhlIHZlcnRpY2FsIHBhcnQgb2Ygc2VwYXJhYmxlIG1vcnBob2xvZ2ljYWwgZmlsdGVyCisgICAgICAgIC8vIGFsd2F5cyBwcm9jZXNzIDIgcm93cyBhdCBvbmNlIChleGNlcHQsIG1heSBiZSwKKyAgICAgICAgLy8gZm9yIHRoZSBsYXN0IG9uZSBpbiBhIHN0cmlwZSkuCisgICAgICAgIGludCB0ID0gYnVmX21heF9jb3VudCAtIG1heF9reSoyOworICAgICAgICBpZiggdCA+IDEgJiYgdCAlIDIgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1Zl9tYXhfY291bnQtLTsKKyAgICAgICAgICAgIGJ1Zl9lbmQgLT0gYnVmX3N0ZXA7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworaW50IEN2TW9ycGhvbG9neTo6ZmlsbF9jeWNsaWNfYnVmZmVyKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MCwgaW50IHkxLCBpbnQgeTIgKQoreworICAgIGludCBpLCB5ID0geTAsIGJzejEgPSBib3JkZXJfdGFiX3N6MSwgYnN6ID0gYm9yZGVyX3RhYl9zejsKKyAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUoc3JjX3R5cGUpOworICAgIGludCB3aWR0aF9uID0gKHByZXZfeF9yYW5nZS5lbmRfaW5kZXggLSBwcmV2X3hfcmFuZ2Uuc3RhcnRfaW5kZXgpKnBpeF9zaXplOworCisgICAgaWYoIENWX01BVF9ERVBUSChzcmNfdHlwZSkgIT0gQ1ZfMzJGICkKKyAgICAgICAgcmV0dXJuIEN2QmFzZUltYWdlRmlsdGVyOjpmaWxsX2N5Y2xpY19idWZmZXIoIHNyYywgc3JjX3N0ZXAsIHkwLCB5MSwgeTIgKTsKKworICAgIC8vIGZpbGwgdGhlIGN5Y2xpYyBidWZmZXIKKyAgICBmb3IoIDsgYnVmX2NvdW50IDwgYnVmX21heF9jb3VudCAmJiB5IDwgeTI7IGJ1Zl9jb3VudCsrLCB5KyssIHNyYyArPSBzcmNfc3RlcCApCisgICAgeworICAgICAgICB1Y2hhciogdHJvdyA9IGlzX3NlcGFyYWJsZSA/IGJ1Zl9lbmQgOiBidWZfdGFpbDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2lkdGhfbjsgaSArPSBzaXplb2YoaW50KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ID0gKihpbnQqKShzcmMgKyBpKTsKKyAgICAgICAgICAgICooaW50KikodHJvdyArIGkgKyBic3oxKSA9IENWX1RPR0dMRV9GTFQodCk7CisgICAgICAgIH0KKworICAgICAgICBpZiggYm9yZGVyX21vZGUgIT0gSVBMX0JPUkRFUl9DT05TVEFOVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBic3oxOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqID0gYm9yZGVyX3RhYltpXTsKKyAgICAgICAgICAgICAgICB0cm93W2ldID0gdHJvd1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggOyBpIDwgYnN6OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqID0gYm9yZGVyX3RhYltpXTsKKyAgICAgICAgICAgICAgICB0cm93W2kgKyB3aWR0aF9uXSA9IHRyb3dbal07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCB1Y2hhciAqYnQgPSAodWNoYXIqKWJvcmRlcl90YWI7IAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGJzejE7IGkrKyApCisgICAgICAgICAgICAgICAgdHJvd1tpXSA9IGJ0W2ldOworCisgICAgICAgICAgICBmb3IoIDsgaSA8IGJzejsgaSsrICkKKyAgICAgICAgICAgICAgICB0cm93W2kgKyB3aWR0aF9uXSA9IGJ0W2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGlzX3NlcGFyYWJsZSApCisgICAgICAgICAgICB4X2Z1bmMoIHRyb3csIGJ1Zl90YWlsLCB0aGlzICk7CisKKyAgICAgICAgYnVmX3RhaWwgKz0gYnVmX3N0ZXA7CisgICAgICAgIGlmKCBidWZfdGFpbCA+PSBidWZfZW5kICkKKyAgICAgICAgICAgIGJ1Zl90YWlsID0gYnVmX3N0YXJ0OworICAgIH0KKworICAgIHJldHVybiB5IC0geTA7Cit9CisKKwordm9pZCBDdk1vcnBob2xvZ3k6OmluaXRfYmluYXJ5X2VsZW1lbnQoIEN2TWF0KiBlbGVtZW50LCBpbnQgZWxlbWVudF9zaGFwZSwgQ3ZQb2ludCBhbmNob3IgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZNb3JwaG9sb2d5Ojppbml0X2JpbmFyeV9lbGVtZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGU7CisgICAgaW50IGksIGosIGNvbHMsIHJvd3M7CisgICAgaW50IHIgPSAwLCBjID0gMDsKKyAgICBkb3VibGUgaW52X3IyID0gMDsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGVsZW1lbnQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImVsZW1lbnQgbXVzdCBiZSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoZWxlbWVudC0+dHlwZSk7CisgICAgaWYoIHR5cGUgIT0gQ1ZfOFVDMSAmJiB0eXBlICE9IENWXzMyU0MxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiZWxlbWVudCBtdXN0IGhhdmUgOHVDMSBvciAzMnNDMSB0eXBlIiApOworCisgICAgaWYoIGFuY2hvci54ID09IC0xICkKKyAgICAgICAgYW5jaG9yLnggPSBlbGVtZW50LT5jb2xzLzI7CisKKyAgICBpZiggYW5jaG9yLnkgPT0gLTEgKQorICAgICAgICBhbmNob3IueSA9IGVsZW1lbnQtPnJvd3MvMjsKKworICAgIGlmKCAodW5zaWduZWQpYW5jaG9yLnggPj0gKHVuc2lnbmVkKWVsZW1lbnQtPmNvbHMgfHwKKyAgICAgICAgKHVuc2lnbmVkKWFuY2hvci55ID49ICh1bnNpZ25lZCllbGVtZW50LT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJhbmNob3IgaXMgb3V0c2lkZSBvZiBlbGVtZW50IiApOworCisgICAgaWYoIGVsZW1lbnRfc2hhcGUgIT0gUkVDVCAmJiBlbGVtZW50X3NoYXBlICE9IENST1NTICYmIGVsZW1lbnRfc2hhcGUgIT0gRUxMSVBTRSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duL3Vuc3VwcG9ydGVkIGVsZW1lbnQgc2hhcGUiICk7CisKKyAgICByb3dzID0gZWxlbWVudC0+cm93czsKKyAgICBjb2xzID0gZWxlbWVudC0+Y29sczsKKworICAgIGlmKCByb3dzID09IDEgfHwgY29scyA9PSAxICkKKyAgICAgICAgZWxlbWVudF9zaGFwZSA9IFJFQ1Q7CisKKyAgICBpZiggZWxlbWVudF9zaGFwZSA9PSBFTExJUFNFICkKKyAgICB7CisgICAgICAgIHIgPSByb3dzLzI7CisgICAgICAgIGMgPSBjb2xzLzI7CisgICAgICAgIGludl9yMiA9IHIgPyAxLi8oKGRvdWJsZSlyKnIpIDogMDsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgcm93czsgaSsrICkKKyAgICB7CisgICAgICAgIHVjaGFyKiBwdHIgPSBlbGVtZW50LT5kYXRhLnB0ciArIGkqZWxlbWVudC0+c3RlcDsKKyAgICAgICAgaW50IGoxID0gMCwgajIgPSAwLCBqeCwgdCA9IDA7CisKKyAgICAgICAgaWYoIGVsZW1lbnRfc2hhcGUgPT0gUkVDVCB8fCAoZWxlbWVudF9zaGFwZSA9PSBDUk9TUyAmJiBpID09IGFuY2hvci55KSApCisgICAgICAgICAgICBqMiA9IGNvbHM7CisgICAgICAgIGVsc2UgaWYoIGVsZW1lbnRfc2hhcGUgPT0gQ1JPU1MgKQorICAgICAgICAgICAgajEgPSBhbmNob3IueCwgajIgPSBqMSArIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGR5ID0gaSAtIHI7CisgICAgICAgICAgICBpZiggYWJzKGR5KSA8PSByICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZHggPSBjdlJvdW5kKGMqc3FydCgoKGRvdWJsZSlyKnIgLSBkeSpkeSkqaW52X3IyKSk7CisgICAgICAgICAgICAgICAgajEgPSBNQVgoIGMgLSBkeCwgMCApOworICAgICAgICAgICAgICAgIGoyID0gTUlOKCBjICsgZHggKyAxLCBjb2xzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGogPSAwLCBqeCA9IGoxOyBqIDwgY29sczsgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIDsgaiA8IGp4OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzhVQzEgKQorICAgICAgICAgICAgICAgICAgICBwdHJbal0gPSAodWNoYXIpdDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICgoaW50KilwdHIpW2pdID0gdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBqeCA9PSBqMiApCisgICAgICAgICAgICAgICAganggPSBjb2xzLCB0ID0gMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBqeCA9IGoyLCB0ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworI2RlZmluZSBJQ1ZfTU9SUEhfUkVDVF9ST1coIG5hbWUsIGZsYXZvciwgYXJydHlwZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCB1cGRhdGVfZXh0cl9tYWNybyApICAgXAorc3RhdGljIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2IyNuYW1lIyNSZWN0Um93XyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiBzcmMsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIHZvaWQqIHBhcmFtcyApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IEN2TW9ycGhvbG9neSogc3RhdGUgPSAoY29uc3QgQ3ZNb3JwaG9sb2d5KilwYXJhbXM7XAorICAgIGludCBrc2l6ZSA9IHN0YXRlLT5nZXRfa2VybmVsX3NpemUoKS53aWR0aDsgICAgICAgICAgICAgXAorICAgIGludCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOyAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdpZHRoICo9IGNuOyBrc2l6ZSAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBrc2l6ZSA9PSBjbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gc3JjW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrLCBzcmMrKywgZHN0KysgKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gY24qMjsgaSArPSBjbioyICkgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgYXJydHlwZSogcyA9IHNyYyArIGk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgbSA9IHNbY25dLCB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gY24qMjsgaiA8IGtzaXplOyBqICs9IGNuICkgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQgPSBzW2pdOyB1cGRhdGVfZXh0cl9tYWNybyhtLHQpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdCA9IHNbMF07IHVwZGF0ZV9leHRyX21hY3JvKHQsbSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdCA9IHNbal07IHVwZGF0ZV9leHRyX21hY3JvKHQsbSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krY25dID0gKGFycnR5cGUpdDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpICs9IGNuICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgYXJydHlwZSogcyA9IHNyYyArIGk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgbSA9IHNbMF0sIHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gY247IGogPCBrc2l6ZTsgaiArPSBjbiApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQgPSBzW2pdOyB1cGRhdGVfZXh0cl9tYWNybyhtLHQpOyAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9NT1JQSF9SRUNUX1JPVyggRXJvZGUsIDh1LCB1Y2hhciwgaW50LCBDVl9DQUxDX01JTl84VSApCitJQ1ZfTU9SUEhfUkVDVF9ST1coIERpbGF0ZSwgOHUsIHVjaGFyLCBpbnQsIENWX0NBTENfTUFYXzhVICkKK0lDVl9NT1JQSF9SRUNUX1JPVyggRXJvZGUsIDE2dSwgdXNob3J0LCBpbnQsIENWX0NBTENfTUlOICkKK0lDVl9NT1JQSF9SRUNUX1JPVyggRGlsYXRlLCAxNnUsIHVzaG9ydCwgaW50LCBDVl9DQUxDX01BWCApCitJQ1ZfTU9SUEhfUkVDVF9ST1coIEVyb2RlLCAzMmYsIGludCwgaW50LCBDVl9DQUxDX01JTiApCitJQ1ZfTU9SUEhfUkVDVF9ST1coIERpbGF0ZSwgMzJmLCBpbnQsIGludCwgQ1ZfQ0FMQ19NQVggKQorCisKKyNkZWZpbmUgSUNWX01PUlBIX1JFQ1RfQ09MKCBuYW1lLCBmbGF2b3IsIGFycnR5cGUsICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUsIHVwZGF0ZV9leHRyX21hY3JvLCB0b2dnbGVfbWFjcm8gKSAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdiMjbmFtZSMjUmVjdENvbF8jI2ZsYXZvciggY29uc3QgYXJydHlwZSoqIHNyYywgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3Rfc3RlcCwgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBDdk1vcnBob2xvZ3kqIHN0YXRlID0gKGNvbnN0IEN2TW9ycGhvbG9neSopcGFyYW1zO1wKKyAgICBpbnQga3NpemUgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkuaGVpZ2h0OyAgICAgICAgICAgIFwKKyAgICBpbnQgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsga3NpemUgPiAxICYmIGNvdW50ID4gMTsgY291bnQgLT0gMiwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcCoyLCBzcmMgKz0gMiApICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNwdHIgPSBzcmNbMV0gKyBpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gc3B0clswXSwgczEgPSBzcHRyWzFdLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMiA9IHNwdHJbMl0sIHMzID0gc3B0clszXSwgdDAsIHQxOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDI7IGsgPCBrc2l6ZTsgaysrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcHRyID0gc3JjW2tdICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IHNwdHJbMF07IHQxID0gc3B0clsxXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMCx0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMSx0MSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IHNwdHJbMl07IHQxID0gc3B0clszXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMix0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMyx0MSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNwdHIgPSBzcmNbMF0gKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3B0clswXTsgdDEgPSBzcHRyWzFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQxLHMxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyh0MCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQxKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3B0clsyXTsgdDEgPSBzcHRyWzNdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMyKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQxLHMzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQwKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzNdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQxKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNwdHIgPSBzcmNba10gKyBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3B0clswXTsgdDEgPSBzcHRyWzFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQxLHMxKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpK2RzdF9zdGVwXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyh0MCk7ICAgIFwKKyAgICAgICAgICAgIGRzdFtpK2RzdF9zdGVwKzFdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQxKTsgIFwKKyAgICAgICAgICAgIHQwID0gc3B0clsyXTsgdDEgPSBzcHRyWzNdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMyKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQxLHMzKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpK2RzdF9zdGVwKzJdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQwKTsgIFwKKyAgICAgICAgICAgIGRzdFtpK2RzdF9zdGVwKzNdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHQxKTsgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNwdHIgPSBzcmNbMV0gKyBpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gc3B0clswXSwgdDA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDI7IGsgPCBrc2l6ZTsgaysrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcHRyID0gc3JjW2tdICsgaTsgdDAgPSBzcHRyWzBdOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMCx0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNwdHIgPSBzcmNbMF0gKyBpOyB0MCA9IHNwdHJbMF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyh0MCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNwdHIgPSBzcmNba10gKyBpOyB0MCA9IHNwdHJbMF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVwZGF0ZV9leHRyX21hY3JvKHQwLHMwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpK2RzdF9zdGVwXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyh0MCk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgY291bnQgPiAwOyBjb3VudC0tLCBkc3QgKz0gZHN0X3N0ZXAsIHNyYysrICkgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNwdHIgPSBzcmNbMF0gKyBpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gc3B0clswXSwgczEgPSBzcHRyWzFdLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMiA9IHNwdHJbMl0sIHMzID0gc3B0clszXSwgdDAsIHQxOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPCBrc2l6ZTsgaysrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcHRyID0gc3JjW2tdICsgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IHNwdHJbMF07IHQxID0gc3B0clsxXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMCx0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMSx0MSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IHNwdHJbMl07IHQxID0gc3B0clszXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMix0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMyx0MSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyhzMCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHMxKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHMyKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzNdID0gKGFycnR5cGUpdG9nZ2xlX21hY3JvKHMzKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNwdHIgPSBzcmNbMF0gKyBpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gc3B0clswXSwgdDA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPCBrc2l6ZTsgaysrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcHRyID0gc3JjW2tdICsgaTsgdDAgPSBzcHRyWzBdOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1cGRhdGVfZXh0cl9tYWNybyhzMCx0MCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyhzMCk7ICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfTU9SUEhfUkVDVF9DT0woIEVyb2RlLCA4dSwgdWNoYXIsIGludCwgQ1ZfQ0FMQ19NSU5fOFUsIENWX05PUCApCitJQ1ZfTU9SUEhfUkVDVF9DT0woIERpbGF0ZSwgOHUsIHVjaGFyLCBpbnQsIENWX0NBTENfTUFYXzhVLCBDVl9OT1AgKQorSUNWX01PUlBIX1JFQ1RfQ09MKCBFcm9kZSwgMTZ1LCB1c2hvcnQsIGludCwgQ1ZfQ0FMQ19NSU4sIENWX05PUCApCitJQ1ZfTU9SUEhfUkVDVF9DT0woIERpbGF0ZSwgMTZ1LCB1c2hvcnQsIGludCwgQ1ZfQ0FMQ19NQVgsIENWX05PUCApCitJQ1ZfTU9SUEhfUkVDVF9DT0woIEVyb2RlLCAzMmYsIGludCwgaW50LCBDVl9DQUxDX01JTiwgQ1ZfVE9HR0xFX0ZMVCApCitJQ1ZfTU9SUEhfUkVDVF9DT0woIERpbGF0ZSwgMzJmLCBpbnQsIGludCwgQ1ZfQ0FMQ19NQVgsIENWX1RPR0dMRV9GTFQgKQorCisKKyNkZWZpbmUgSUNWX01PUlBIX0FOWSggbmFtZSwgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8sIHRvZ2dsZV9tYWNybyApICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdiMjbmFtZSMjQW55XyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiogc3JjLCBhcnJ0eXBlKiBkc3QsIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdk1vcnBob2xvZ3kqIHN0YXRlID0gKEN2TW9ycGhvbG9neSopcGFyYW1zOyAgICAgICAgICAgIFwKKyAgICBpbnQgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdlBvaW50KiBlbF9zcGFyc2UgPSAoQ3ZQb2ludCopc3RhdGUtPmdldF9lbGVtZW50X3NwYXJzZV9idWYoKTtcCisgICAgaW50IGVsX2NvdW50ID0gc3RhdGUtPmdldF9lbGVtZW50X3NwYXJzZV9jb3VudCgpOyAgICAgICBcCisgICAgY29uc3QgYXJydHlwZSoqIGVsX3B0ciA9IChjb25zdCBhcnJ0eXBlKiopKGVsX3NwYXJzZSArIGVsX2NvdW50KTtcCisgICAgY29uc3QgYXJydHlwZSoqIGVsX2VuZCA9IGVsX3B0ciArIGVsX2NvdW50OyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd2lkdGggKj0gY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGNvdW50ID4gMDsgY291bnQtLSwgZHN0ICs9IGRzdF9zdGVwLCBzcmMrKyApICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggayA9IDA7IGsgPCBlbF9jb3VudDsgaysrICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbF9wdHJba10gPSBzcmNbZWxfc3BhcnNlW2tdLnldK2VsX3NwYXJzZVtrXS54OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiogcHNwdHIgPSBlbF9wdHI7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzcHRyID0gKnBzcHRyKys7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IHNwdHJbaV0sIHMxID0gc3B0cltpKzFdLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICBzMiA9IHNwdHJbaSsyXSwgczMgPSBzcHRyW2krM10sIHQ7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSggcHNwdHIgIT0gZWxfZW5kICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3B0ciA9ICpwc3B0cisrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdCA9IHNwdHJbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8oczAsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdCA9IHNwdHJbaSsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8oczEsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdCA9IHNwdHJbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8oczIsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdCA9IHNwdHJbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8oczMsdCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSAoYXJydHlwZSl0b2dnbGVfbWFjcm8oczApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsxXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyhzMSk7ICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsyXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyhzMik7ICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSszXSA9IChhcnJ0eXBlKXRvZ2dsZV9tYWNybyhzMyk7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzcHRyID0gZWxfcHRyWzBdICsgaTsgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IHNwdHJbMF0sIHQwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDwgZWxfY291bnQ7IGsrKyApICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3B0ciA9IGVsX3B0cltrXSArIGk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBzcHRyWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdXBkYXRlX2V4dHJfbWFjcm8oczAsdDApOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSAoYXJydHlwZSl0b2dnbGVfbWFjcm8oczApOyAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0lDVl9NT1JQSF9BTlkoIEVyb2RlLCA4dSwgdWNoYXIsIGludCwgQ1ZfQ0FMQ19NSU4sIENWX05PUCApCitJQ1ZfTU9SUEhfQU5ZKCBEaWxhdGUsIDh1LCB1Y2hhciwgaW50LCBDVl9DQUxDX01BWCwgQ1ZfTk9QICkKK0lDVl9NT1JQSF9BTlkoIEVyb2RlLCAxNnUsIHVzaG9ydCwgaW50LCBDVl9DQUxDX01JTiwgQ1ZfTk9QICkKK0lDVl9NT1JQSF9BTlkoIERpbGF0ZSwgMTZ1LCB1c2hvcnQsIGludCwgQ1ZfQ0FMQ19NQVgsIENWX05PUCApCitJQ1ZfTU9SUEhfQU5ZKCBFcm9kZSwgMzJmLCBpbnQsIGludCwgQ1ZfQ0FMQ19NSU4sIENWX1RPR0dMRV9GTFQgKQorSUNWX01PUlBIX0FOWSggRGlsYXRlLCAzMmYsIGludCwgaW50LCBDVl9DQUxDX01BWCwgQ1ZfVE9HR0xFX0ZMVCApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEV4dGVybmFsIEludGVyZmFjZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworQ1ZfSU1QTCBJcGxDb252S2VybmVsICoKK2N2Q3JlYXRlU3RydWN0dXJpbmdFbGVtZW50RXgoIGludCBjb2xzLCBpbnQgcm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmNob3JYLCBpbnQgYW5jaG9yWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGFwZSwgaW50ICp2YWx1ZXMgKQoreworICAgIElwbENvbnZLZXJuZWwgKmVsZW1lbnQgPSAwOworICAgIGludCBpLCBzaXplID0gcm93cyAqIGNvbHM7CisgICAgaW50IGVsZW1lbnRfc2l6ZSA9IHNpemVvZigqZWxlbWVudCkgKyBzaXplKnNpemVvZihlbGVtZW50LT52YWx1ZXNbMF0pOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZVN0cnVjdHVyaW5nRWxlbWVudEV4IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICF2YWx1ZXMgJiYgc2hhcGUgPT0gQ1ZfU0hBUEVfQ1VTVE9NICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX05VTExQVFJfRVJSICk7CisKKyAgICBpZiggY29scyA8PSAwIHx8IHJvd3MgPD0gMCB8fAorICAgICAgICAodW5zaWduZWQpIGFuY2hvclggPj0gKHVuc2lnbmVkKSBjb2xzIHx8CisgICAgICAgICh1bnNpZ25lZCkgYW5jaG9yWSA+PSAodW5zaWduZWQpIHJvd3MgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFEU0laRV9FUlIgKTsKKworICAgIENWX0NBTEwoIGVsZW1lbnQgPSAoSXBsQ29udktlcm5lbCAqKWN2QWxsb2MoZWxlbWVudF9zaXplICsgMzIpKTsKKyAgICBpZiggIWVsZW1lbnQgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfT1VUT0ZNRU1fRVJSICk7CisKKyAgICBlbGVtZW50LT5uQ29scyA9IGNvbHM7CisgICAgZWxlbWVudC0+blJvd3MgPSByb3dzOworICAgIGVsZW1lbnQtPmFuY2hvclggPSBhbmNob3JYOworICAgIGVsZW1lbnQtPmFuY2hvclkgPSBhbmNob3JZOworICAgIGVsZW1lbnQtPm5TaGlmdFIgPSBzaGFwZSA8IENWX1NIQVBFX0VMTElQU0UgPyBzaGFwZSA6IENWX1NIQVBFX0NVU1RPTTsKKyAgICBlbGVtZW50LT52YWx1ZXMgPSAoaW50KikoZWxlbWVudCArIDEpOworCisgICAgaWYoIHNoYXBlID09IENWX1NIQVBFX0NVU1RPTSApCisgICAgeworICAgICAgICBpZiggIXZhbHVlcyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgcG9pbnRlciB0byB0aGUgY3VzdG9tIGVsZW1lbnQgbWFzayIgKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemU7IGkrKyApCisgICAgICAgICAgICBlbGVtZW50LT52YWx1ZXNbaV0gPSB2YWx1ZXNbaV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2TWF0IGVsX2hkciA9IGN2TWF0KCByb3dzLCBjb2xzLCBDVl8zMlNDMSwgZWxlbWVudC0+dmFsdWVzICk7CisgICAgICAgIENWX0NBTEwoIEN2TW9ycGhvbG9neTo6aW5pdF9iaW5hcnlfZWxlbWVudCgmZWxfaGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUsIGN2UG9pbnQoYW5jaG9yWCxhbmNob3JZKSkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdlJlbGVhc2VTdHJ1Y3R1cmluZ0VsZW1lbnQoICZlbGVtZW50ICk7CisKKyAgICByZXR1cm4gZWxlbWVudDsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZVN0cnVjdHVyaW5nRWxlbWVudCggSXBsQ29udktlcm5lbCAqKiBlbGVtZW50ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVsZWFzZVN0cnVjdHVyaW5nRWxlbWVudCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZWxlbWVudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworICAgIGN2RnJlZSggZWxlbWVudCApOworCisgICAgX19FTkRfXzsKK30KKworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZNb3JwaFJlY3RHZXRCdWZTaXplRnVuY19JUFApCisgICAgKCBpbnQgd2lkdGgsIEN2U2l6ZSBlbF9zaXplLCBpbnQqIGJ1ZnNpemUgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2TW9ycGhSZWN0RnVuY19JUFApCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgQ3ZTaXplIHJvaSwgQ3ZTaXplIGVsX3NpemUsIEN2UG9pbnQgZWxfYW5jaG9yLCB2b2lkKiBidWZmZXIgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2TW9ycGhDdXN0b21Jbml0QWxsb2NGdW5jX0lQUCkKKyAgICAoIGludCB3aWR0aCwgY29uc3QgdWNoYXIqIGVsZW1lbnQsIEN2U2l6ZSBlbF9zaXplLAorICAgICAgQ3ZQb2ludCBlbF9hbmNob3IsIHZvaWQqKiBtb3JwaHN0YXRlICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdk1vcnBoQ3VzdG9tRnVuY19JUFApCisgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLAorICAgICAgQ3ZTaXplIHJvaSwgaW50IGJvcmRlcnR5cGUsIHZvaWQqIG1vcnBoc3RhdGUgKTsKKworc3RhdGljIHZvaWQKK2ljdk1vcnBoT3AoIGNvbnN0IHZvaWQqIHNyY2Fyciwgdm9pZCogZHN0YXJyLCBJcGxDb252S2VybmVsKiBlbGVtZW50LAorICAgICAgICAgICAgaW50IGl0ZXJhdGlvbnMsIGludCBtb3AgKQoreworICAgIEN2TW9ycGhvbG9neSBtb3JwaG9sb2d5OworICAgIHZvaWQqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKyAgICB2b2lkKiBtb3JwaHN0YXRlID0gMDsKKyAgICBDdk1hdCogdGVtcCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdk1vcnBoT3AiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgY29pMSA9IDAsIGNvaTIgPSAwOworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgZWxfaGRyLCAqZWwgPSAwOworICAgIEN2U2l6ZSBzaXplLCBlbF9zaXplOworICAgIEN2UG9pbnQgZWxfYW5jaG9yOworICAgIGludCBlbF9zaGFwZTsKKyAgICBpbnQgdHlwZTsKKyAgICBib29sIGlucGxhY2U7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIAorICAgIGlmKCBzcmMgIT0gJnNyY3N0dWIgKQorICAgIHsKKyAgICAgICAgc3Jjc3R1YiA9ICpzcmM7CisgICAgICAgIHNyYyA9ICZzcmNzdHViOworICAgIH0KKworICAgIGlmKCBkc3RhcnIgPT0gc3JjYXJyICkKKyAgICAgICAgZHN0ID0gc3JjOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgIH0KKworICAgIGlmKCBkc3QgIT0gJmRzdHN0dWIgKQorICAgIHsKKyAgICAgICAgZHN0c3R1YiA9ICpkc3Q7CisgICAgICAgIGRzdCA9ICZkc3RzdHViOworICAgIH0KKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgaW5wbGFjZSA9IHNyYy0+ZGF0YS5wdHIgPT0gZHN0LT5kYXRhLnB0cjsKKworICAgIGlmKCBpdGVyYXRpb25zID09IDAgfHwgKGVsZW1lbnQgJiYgZWxlbWVudC0+bkNvbHMgPT0gMSAmJiBlbGVtZW50LT5uUm93cyA9PSAxKSkKKyAgICB7CisgICAgICAgIGlmKCBzcmMtPmRhdGEucHRyICE9IGRzdC0+ZGF0YS5wdHIgKQorICAgICAgICAgICAgY3ZDb3B5KCBzcmMsIGRzdCApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCBlbGVtZW50ICkKKyAgICB7CisgICAgICAgIGVsX3NpemUgPSBjdlNpemUoIGVsZW1lbnQtPm5Db2xzLCBlbGVtZW50LT5uUm93cyApOworICAgICAgICBlbF9hbmNob3IgPSBjdlBvaW50KCBlbGVtZW50LT5hbmNob3JYLCBlbGVtZW50LT5hbmNob3JZICk7CisgICAgICAgIGVsX3NoYXBlID0gKGludCkoZWxlbWVudC0+blNoaWZ0Uik7CisgICAgICAgIGVsX3NoYXBlID0gZWxfc2hhcGUgPCBDVl9TSEFQRV9DVVNUT00gPyBlbF9zaGFwZSA6IENWX1NIQVBFX0NVU1RPTTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZWxfc2l6ZSA9IGN2U2l6ZSgzLDMpOworICAgICAgICBlbF9hbmNob3IgPSBjdlBvaW50KDEsMSk7CisgICAgICAgIGVsX3NoYXBlID0gQ1ZfU0hBUEVfUkVDVDsKKyAgICB9CisKKyAgICBpZiggZWxfc2hhcGUgPT0gQ1ZfU0hBUEVfUkVDVCAmJiBpdGVyYXRpb25zID4gMSApCisgICAgeworICAgICAgICBlbF9zaXplLndpZHRoID0gMSArIChlbF9zaXplLndpZHRoLTEpKml0ZXJhdGlvbnM7CisgICAgICAgIGVsX3NpemUuaGVpZ2h0ID0gMSArIChlbF9zaXplLmhlaWdodC0xKSppdGVyYXRpb25zOworICAgICAgICBlbF9hbmNob3IueCAqPSBpdGVyYXRpb25zOworICAgICAgICBlbF9hbmNob3IueSAqPSBpdGVyYXRpb25zOworICAgICAgICBpdGVyYXRpb25zID0gMTsKKyAgICB9CisKKyAgICBpZiggZWxfc2hhcGUgPT0gQ1ZfU0hBUEVfUkVDVCAmJiBpY3ZFcm9kZVJlY3RfR2V0QnVmU2l6ZV84dV9DMVJfcCApCisgICAgeworICAgICAgICBDdk1vcnBoUmVjdEZ1bmNfSVBQIHJlY3RfZnVuYyA9IDA7CisgICAgICAgIEN2TW9ycGhSZWN0R2V0QnVmU2l6ZUZ1bmNfSVBQIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gMDsKKworICAgICAgICBpZiggbW9wID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl84VUMxICkKKyAgICAgICAgICAgICAgICByZWN0X2dldGJ1ZnNpemVfZnVuYyA9IGljdkVyb2RlUmVjdF9HZXRCdWZTaXplXzh1X0MxUl9wLAorICAgICAgICAgICAgICAgIHJlY3RfZnVuYyA9IGljdkVyb2RlUmVjdF84dV9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfOFVDMyApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZFcm9kZVJlY3RfR2V0QnVmU2l6ZV84dV9DM1JfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZFcm9kZVJlY3RfOHVfQzNSX3A7CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzhVQzQgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RXJvZGVSZWN0X0dldEJ1ZlNpemVfOHVfQzRSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RXJvZGVSZWN0Xzh1X0M0Ul9wOworICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8xNlVDMSApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZFcm9kZVJlY3RfR2V0QnVmU2l6ZV8xNnVfQzFSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RXJvZGVSZWN0XzE2dV9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzMgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RXJvZGVSZWN0X0dldEJ1ZlNpemVfMTZ1X0MzUl9wLAorICAgICAgICAgICAgICAgIHJlY3RfZnVuYyA9IGljdkVyb2RlUmVjdF8xNnVfQzNSX3A7CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzE2VUM0ICkKKyAgICAgICAgICAgICAgICByZWN0X2dldGJ1ZnNpemVfZnVuYyA9IGljdkVyb2RlUmVjdF9HZXRCdWZTaXplXzE2dV9DNFJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZFcm9kZVJlY3RfMTZ1X0M0Ul9wOworICAgICAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZFcm9kZVJlY3RfR2V0QnVmU2l6ZV8zMmZfQzFSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RXJvZGVSZWN0XzMyZl9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzMgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RXJvZGVSZWN0X0dldEJ1ZlNpemVfMzJmX0MzUl9wLAorICAgICAgICAgICAgICAgIHJlY3RfZnVuYyA9IGljdkVyb2RlUmVjdF8zMmZfQzNSX3A7CisgICAgICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzMyRkM0ICkKKyAgICAgICAgICAgICAgICByZWN0X2dldGJ1ZnNpemVfZnVuYyA9IGljdkVyb2RlUmVjdF9HZXRCdWZTaXplXzMyZl9DNFJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZFcm9kZVJlY3RfMzJmX0M0Ul9wOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfOFVDMSApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZEaWxhdGVSZWN0X0dldEJ1ZlNpemVfOHVfQzFSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RGlsYXRlUmVjdF84dV9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfOFVDMyApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZEaWxhdGVSZWN0X0dldEJ1ZlNpemVfOHVfQzNSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RGlsYXRlUmVjdF84dV9DM1JfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfOFVDNCApCisgICAgICAgICAgICAgICAgcmVjdF9nZXRidWZzaXplX2Z1bmMgPSBpY3ZEaWxhdGVSZWN0X0dldEJ1ZlNpemVfOHVfQzRSX3AsCisgICAgICAgICAgICAgICAgcmVjdF9mdW5jID0gaWN2RGlsYXRlUmVjdF84dV9DNFJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzEgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzE2dV9DMVJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzE2dV9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzMgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzE2dV9DM1JfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzE2dV9DM1JfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzQgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzE2dV9DNFJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzE2dV9DNFJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzMyZl9DMVJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzMyZl9DMVJfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzMgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzMyZl9DM1JfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzMyZl9DM1JfcDsKKyAgICAgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzQgKQorICAgICAgICAgICAgICAgIHJlY3RfZ2V0YnVmc2l6ZV9mdW5jID0gaWN2RGlsYXRlUmVjdF9HZXRCdWZTaXplXzMyZl9DNFJfcCwKKyAgICAgICAgICAgICAgICByZWN0X2Z1bmMgPSBpY3ZEaWxhdGVSZWN0XzMyZl9DNFJfcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCByZWN0X2dldGJ1ZnNpemVfZnVuYyAmJiByZWN0X2Z1bmMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYnVmc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIEN2U3RhdHVzIHN0YXR1cyA9IHJlY3RfZ2V0YnVmc2l6ZV9mdW5jKCBzaXplLndpZHRoLCBlbF9zaXplLCAmYnVmc2l6ZSApOworICAgICAgICAgICAgaWYoIHN0YXR1cyA+PSAwICYmIGJ1ZnNpemUgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggYnVmc2l6ZSA8IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyggYnVmc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyggYnVmc2l6ZSApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YXR1cyA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3JjX3N0ZXAsIGRzdF9zdGVwID0gZHN0LT5zdGVwID8gZHN0LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgICAgICAgICAgICAgaWYoIGlucGxhY2UgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcCA9IGN2Q2xvbmVNYXQoIGRzdCApKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSByZWN0X2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0ZXAsIHNpemUsIGVsX3NpemUsIGVsX2FuY2hvciwgYnVmZmVyICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgPj0gMCApCisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBlbF9zaGFwZSA9PSBDVl9TSEFQRV9DVVNUT00gJiYgaWN2TW9ycGhJbml0QWxsb2NfOHVfQzFSX3AgJiYgaWN2TW9ycGhGcmVlX3AgJiYKKyAgICAgICAgICAgICBzcmMtPmRhdGEucHRyICE9IGRzdC0+ZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgQ3ZNb3JwaEN1c3RvbUZ1bmNfSVBQIGN1c3RvbV9mdW5jID0gMDsKKyAgICAgICAgQ3ZNb3JwaEN1c3RvbUluaXRBbGxvY0Z1bmNfSVBQIGN1c3RvbV9pbml0YWxsb2NfZnVuYyA9IDA7CisgICAgICAgIGNvbnN0IGludCBib3JkZXJ0eXBlID0gMTsgLy8gcmVwbGljYXRpb24gYm9yZGVyCisKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfOFVDMSApCisgICAgICAgICAgICBjdXN0b21faW5pdGFsbG9jX2Z1bmMgPSBpY3ZNb3JwaEluaXRBbGxvY184dV9DMVJfcCwKKyAgICAgICAgICAgIGN1c3RvbV9mdW5jID0gbW9wID09IDAgPyBpY3ZFcm9kZV84dV9DMVJfcCA6IGljdkRpbGF0ZV84dV9DMVJfcDsKKyAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl84VUMzICkKKyAgICAgICAgICAgIGN1c3RvbV9pbml0YWxsb2NfZnVuYyA9IGljdk1vcnBoSW5pdEFsbG9jXzh1X0MzUl9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzh1X0MzUl9wIDogaWN2RGlsYXRlXzh1X0MzUl9wOworICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzhVQzQgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfOHVfQzRSX3AsCisgICAgICAgICAgICBjdXN0b21fZnVuYyA9IG1vcCA9PSAwID8gaWN2RXJvZGVfOHVfQzRSX3AgOiBpY3ZEaWxhdGVfOHVfQzRSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzEgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMTZ1X0MxUl9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzE2dV9DMVJfcCA6IGljdkRpbGF0ZV8xNnVfQzFSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzMgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMTZ1X0MzUl9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzE2dV9DM1JfcCA6IGljdkRpbGF0ZV8xNnVfQzNSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVQzQgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMTZ1X0M0Ul9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzE2dV9DNFJfcCA6IGljdkRpbGF0ZV8xNnVfQzRSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMzJmX0MxUl9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzMyZl9DMVJfcCA6IGljdkRpbGF0ZV8zMmZfQzFSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzMgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMzJmX0MzUl9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzMyZl9DM1JfcCA6IGljdkRpbGF0ZV8zMmZfQzNSX3A7CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGQzQgKQorICAgICAgICAgICAgY3VzdG9tX2luaXRhbGxvY19mdW5jID0gaWN2TW9ycGhJbml0QWxsb2NfMzJmX0M0Ul9wLAorICAgICAgICAgICAgY3VzdG9tX2Z1bmMgPSBtb3AgPT0gMCA/IGljdkVyb2RlXzMyZl9DNFJfcCA6IGljdkRpbGF0ZV8zMmZfQzRSX3A7CisKKyAgICAgICAgaWYoIGN1c3RvbV9pbml0YWxsb2NfZnVuYyAmJiBjdXN0b21fZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyICpzcmNfcHRyLCAqZHN0X3B0ciA9IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgICAgICBpbnQgc3JjX3N0ZXAsIGRzdF9zdGVwID0gZHN0LT5zdGVwID8gZHN0LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgaW50IGVsX2xlbiA9IGVsX3NpemUud2lkdGgqZWxfc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICB1Y2hhciogZWxfbWFzayA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBlbF9sZW4gKTsKKyAgICAgICAgICAgIEN2U3RhdHVzIHN0YXR1czsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGVsX2xlbjsgaSsrICkKKyAgICAgICAgICAgICAgICBlbF9tYXNrW2ldID0gKHVjaGFyKShlbGVtZW50LT52YWx1ZXNbaV0gIT0gMCk7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IGN1c3RvbV9pbml0YWxsb2NfZnVuYyggc2l6ZS53aWR0aCwgZWxfbWFzaywgZWxfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxfYW5jaG9yLCAmbW9ycGhzdGF0ZSApOworCisgICAgICAgICAgICBpZiggc3RhdHVzID49IDAgJiYgKGlucGxhY2UgfHwgaXRlcmF0aW9ucyA+IDEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCB0ZW1wID0gY3ZDbG9uZU1hdCggc3JjICkpOworICAgICAgICAgICAgICAgIHNyYyA9IHRlbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNyY19wdHIgPSBzcmMtPmRhdGEucHRyOworICAgICAgICAgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVA7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBpdGVyYXRpb25zICYmIHN0YXR1cyA+PSAwICYmIG1vcnBoc3RhdGU7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIHRfcHRyOworICAgICAgICAgICAgICAgIGludCB0X3N0ZXA7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gY3VzdG9tX2Z1bmMoIHNyY19wdHIsIHNyY19zdGVwLCBkc3RfcHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgYm9yZGVydHlwZSwgbW9ycGhzdGF0ZSApOworICAgICAgICAgICAgICAgIENWX1NXQVAoIHNyY19wdHIsIGRzdF9wdHIsIHRfcHRyICk7CisgICAgICAgICAgICAgICAgQ1ZfU1dBUCggc3JjX3N0ZXAsIGRzdF9zdGVwLCB0X3N0ZXAgKTsKKyAgICAgICAgICAgICAgICBpZiggaSA9PSAwICYmIHRlbXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0X3B0ciA9IHRlbXAtPmRhdGEucHRyOworICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCA9IHRlbXAtPnN0ZXAgPyB0ZW1wLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YXR1cyA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaXRlcmF0aW9ucyAlIDIgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGN2Q29weSggdGVtcCwgZHN0ICk7CisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBlbF9zaGFwZSAhPSBDVl9TSEFQRV9SRUNUICkKKyAgICB7CisgICAgICAgIGVsX2hkciA9IGN2TWF0KCBlbGVtZW50LT5uUm93cywgZWxlbWVudC0+bkNvbHMsIENWXzMyU0MxLCBlbGVtZW50LT52YWx1ZXMgKTsKKyAgICAgICAgZWwgPSAmZWxfaGRyOworICAgICAgICBlbF9zaGFwZSA9IENWX1NIQVBFX0NVU1RPTTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBtb3JwaG9sb2d5LmluaXQoIG1vcCwgc3JjLT5jb2xzLCBzcmMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgIGVsX3NoYXBlLCBlbCwgZWxfc2l6ZSwgZWxfYW5jaG9yICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtb3JwaG9sb2d5LnByb2Nlc3MoIHNyYywgZHN0ICkpOworICAgICAgICBzcmMgPSBkc3Q7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBpZiggbW9ycGhzdGF0ZSApCisgICAgICAgIGljdk1vcnBoRnJlZV9wKCBtb3JwaHN0YXRlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZFcm9kZSggY29uc3Qgdm9pZCogc3JjLCB2b2lkKiBkc3QsIElwbENvbnZLZXJuZWwqIGVsZW1lbnQsIGludCBpdGVyYXRpb25zICkKK3sKKyAgICBpY3ZNb3JwaE9wKCBzcmMsIGRzdCwgZWxlbWVudCwgaXRlcmF0aW9ucywgMCApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZEaWxhdGUoIGNvbnN0IHZvaWQqIHNyYywgdm9pZCogZHN0LCBJcGxDb252S2VybmVsKiBlbGVtZW50LCBpbnQgaXRlcmF0aW9ucyApCit7CisgICAgaWN2TW9ycGhPcCggc3JjLCBkc3QsIGVsZW1lbnQsIGl0ZXJhdGlvbnMsIDEgKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2TW9ycGhvbG9neUV4KCBjb25zdCB2b2lkKiBzcmMsIHZvaWQqIGRzdCwKKyAgICAgICAgICAgICAgICB2b2lkKiB0ZW1wLCBJcGxDb252S2VybmVsKiBlbGVtZW50LCBpbnQgb3AsIGludCBpdGVyYXRpb25zICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TW9yaG9sb2d5RXgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggKG9wID09IENWX01PUF9HUkFESUVOVCB8fAorICAgICAgICAoKG9wID09IENWX01PUF9UT1BIQVQgfHwgb3AgPT0gQ1ZfTU9QX0JMQUNLSEFUKSAmJiBzcmMgPT0gZHN0KSkgJiYgdGVtcCA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0hlYWRlcklzTnVsbCwgInRlbXAgaW1hZ2UgcmVxdWlyZWQiICk7CisKKyAgICBpZiggdGVtcCA9PSBzcmMgfHwgdGVtcCA9PSBkc3QgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfSGVhZGVySXNOdWxsLCAidGVtcCBpbWFnZSBpcyBlcXVhbCB0byBzcmMgb3IgZHN0IiApOworCisgICAgc3dpdGNoIChvcCkKKyAgICB7CisgICAgY2FzZSBDVl9NT1BfT1BFTjoKKyAgICAgICAgQ1ZfQ0FMTCggY3ZFcm9kZSggc3JjLCBkc3QsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIENWX0NBTEwoIGN2RGlsYXRlKCBkc3QsIGRzdCwgZWxlbWVudCwgaXRlcmF0aW9ucyApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9NT1BfQ0xPU0U6CisgICAgICAgIENWX0NBTEwoIGN2RGlsYXRlKCBzcmMsIGRzdCwgZWxlbWVudCwgaXRlcmF0aW9ucyApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZFcm9kZSggZHN0LCBkc3QsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfTU9QX0dSQURJRU5UOgorICAgICAgICBDVl9DQUxMKCBjdkVyb2RlKCBzcmMsIHRlbXAsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIENWX0NBTEwoIGN2RGlsYXRlKCBzcmMsIGRzdCwgZWxlbWVudCwgaXRlcmF0aW9ucyApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTdWIoIGRzdCwgdGVtcCwgZHN0ICkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX01PUF9UT1BIQVQ6CisgICAgICAgIGlmKCBzcmMgIT0gZHN0ICkKKyAgICAgICAgICAgIHRlbXAgPSBkc3Q7CisgICAgICAgIENWX0NBTEwoIGN2RXJvZGUoIHNyYywgdGVtcCwgZWxlbWVudCwgaXRlcmF0aW9ucyApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZEaWxhdGUoIHRlbXAsIHRlbXAsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U3ViKCBzcmMsIHRlbXAsIGRzdCApKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9NT1BfQkxBQ0tIQVQ6CisgICAgICAgIGlmKCBzcmMgIT0gZHN0ICkKKyAgICAgICAgICAgIHRlbXAgPSBkc3Q7CisgICAgICAgIENWX0NBTEwoIGN2RGlsYXRlKCBzcmMsIHRlbXAsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIENWX0NBTEwoIGN2RXJvZGUoIHRlbXAsIHRlbXAsIGVsZW1lbnQsIGl0ZXJhdGlvbnMgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U3ViKCB0ZW1wLCBzcmMsIGRzdCApKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVua25vd24gbW9ycGhvbG9naWNhbCBvcGVyYXRpb24iICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Ztb3RlbXBsLmNwcCBiL2N2L3NyYy9jdm1vdGVtcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTI2NzEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Ztb3RlbXBsLmNwcApAQCAtMCwwICsxLDUxNyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2VXBkYXRlTW90aW9uSGlzdG9yeV84dTMyZl9DMUlSLAorICAgIChjb25zdCB1Y2hhciAqIHNpbEltLCBpbnQgc2lsU3RlcCwgZmxvYXQgKm1oaUltLCBpbnQgbWhpU3RlcCwKKyAgICAgQ3ZTaXplIHNpemUsIGZsb2F0IHRpbWVzdGFtcCwgZmxvYXQgbWhpX2R1cmF0aW9uKSwKKyAgICAgKHNpbEltLCBzaWxTdGVwLCBtaGlJbSwgbWhpU3RlcCwgc2l6ZSwgdGltZXN0YW1wLCBtaGlfZHVyYXRpb24pICkKK3sKKyAgICBpbnQgeCwgeTsKKworICAgIC8qIGZ1bmN0aW9uIHByb2Nlc3NlcyBmbG9hdGluZy1wb2ludCBpbWFnZXMgdXNpbmcgaW50ZWdlciBhcml0aG1ldGljcyAqLworICAgIEN2MzJzdWYgdjsKKyAgICBpbnQgdHMsIGRlbGJvdW5kOworICAgIGludCAqbWhpID0gKGludCAqKSBtaGlJbTsKKworICAgIHYuZiA9IHRpbWVzdGFtcDsKKyAgICB0cyA9IHYuaTsKKworICAgIGlmKCAhc2lsSW0gfHwgIW1oaUltICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgaWYoIHNpemUuaGVpZ2h0IDw9IDAgfHwgc2l6ZS53aWR0aCA8PSAwIHx8CisgICAgICAgIHNpbFN0ZXAgPCBzaXplLndpZHRoIHx8IG1oaVN0ZXAgPCBzaXplLndpZHRoICogQ1ZfU0laRU9GX0ZMT0FUIHx8CisgICAgICAgIChtaGlTdGVwICYgKENWX1NJWkVPRl9GTE9BVCAtIDEpKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgaWYoIG1oaV9kdXJhdGlvbiA8IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIG1oaV9kdXJhdGlvbiA9IHRpbWVzdGFtcCAtIG1oaV9kdXJhdGlvbjsKKworICAgIHYuZiA9IG1oaV9kdXJhdGlvbjsKKyAgICBkZWxib3VuZCA9IENWX1RPR0dMRV9GTFQoIHYuaSApOworCisgICAgbWhpU3RlcCAvPSBzaXplb2YobWhpWzBdKTsKKworICAgIGlmKCBtaGlTdGVwID09IHNpemUud2lkdGggJiYgc2lsU3RlcCA9PSBzaXplLndpZHRoICkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBpZiggZGVsYm91bmQgPiAwICkKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyssIHNpbEltICs9IHNpbFN0ZXAsIG1oaSArPSBtaGlTdGVwICkKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2YWwgPSBtaGlbeF07CisKKyAgICAgICAgICAgICAgICAvKiB2YWwgPSBzaWxJbVt4XSA/IHRzIDogdmFsIDwgZGVsYm91bmQgPyAwIDogdmFsOyAqLworICAgICAgICAgICAgICAgIHZhbCAmPSAodmFsIDwgZGVsYm91bmQpIC0gMTsKKyAgICAgICAgICAgICAgICB2YWwgXj0gKHRzIF4gdmFsKSAmICgoc2lsSW1beF0gPT0gMCkgLSAxKTsKKyAgICAgICAgICAgICAgICBtaGlbeF0gPSB2YWw7CisgICAgICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgc2lsSW0gKz0gc2lsU3RlcCwgbWhpICs9IG1oaVN0ZXAgKQorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IG1oaVt4XTsKKworICAgICAgICAgICAgICAgIC8qIHZhbCA9IHNpbEltW3hdID8gdHMgOiB2YWwgPCBkZWxib3VuZCA/IDAgOiB2YWw7ICovCisgICAgICAgICAgICAgICAgdmFsICY9IChDVl9UT0dHTEVfRkxUKCB2YWwgKSA8IGRlbGJvdW5kKSAtIDE7CisgICAgICAgICAgICAgICAgdmFsIF49ICh0cyBeIHZhbCkgJiAoKHNpbEltW3hdID09IDApIC0gMSk7CisgICAgICAgICAgICAgICAgbWhpW3hdID0gdmFsOworICAgICAgICAgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8qIG1vdGlvbiB0ZW1wbGF0ZXMgKi8KK0NWX0lNUEwgdm9pZAorY3ZVcGRhdGVNb3Rpb25IaXN0b3J5KCBjb25zdCB2b2lkKiBzaWxob3VldHRlLCB2b2lkKiBtaGltZywKKyAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVzdGFtcCwgZG91YmxlIG1oaV9kdXJhdGlvbiApCit7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZNYXQgIHNpbGhzdHViLCAqc2lsaCA9IChDdk1hdCopc2lsaG91ZXR0ZTsKKyAgICBDdk1hdCAgbWhpc3R1YiwgKm1oaSA9IChDdk1hdCopbWhpbWc7CisgICAgaW50IG1oaV9zdGVwLCBzaWxoX3N0ZXA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2VXBkYXRlTUhJQnlUaW1lIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0FMTCggc2lsaCA9IGN2R2V0TWF0KCBzaWxoLCAmc2lsaHN0dWIgKSk7CisgICAgQ1ZfQ0FMTCggbWhpID0gY3ZHZXRNYXQoIG1oaSwgJm1oaXN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBzaWxoICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgaWYoIENWX01BVF9DTiggbWhpLT50eXBlICkgPiAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSCggbWhpLT50eXBlICkgIT0gQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1oaSwgc2lsaCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtaGkgKTsKKworICAgIG1oaV9zdGVwID0gbWhpLT5zdGVwOworICAgIHNpbGhfc3RlcCA9IHNpbGgtPnN0ZXA7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1oaS0+dHlwZSAmIHNpbGgtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIG1oaV9zdGVwID0gc2lsaF9zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgSVBQSV9DQUxMKCBpY3ZVcGRhdGVNb3Rpb25IaXN0b3J5Xzh1MzJmX0MxSVIoIChjb25zdCB1Y2hhciopKHNpbGgtPmRhdGEucHRyKSwgc2lsaF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaGktPmRhdGEuZmwsIG1oaV9zdGVwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpdGltZXN0YW1wLCAoZmxvYXQpbWhpX2R1cmF0aW9uICkpOworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNhbGNNb3Rpb25HcmFkaWVudCggY29uc3QgQ3ZBcnIqIG1oaWltZywgQ3ZBcnIqIG1hc2tpbWcsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkZWx0YTEsIGRvdWJsZSBkZWx0YTIsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFwZXJ0dXJlX3NpemUgKQoreworICAgIEN2TWF0ICpkWF9taW4gPSAwLCAqZFlfbWF4ID0gMDsKKyAgICBJcGxDb252S2VybmVsKiBlbCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FsY01vdGlvbkdyYWRpZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgIG1oaXN0dWIsICptaGkgPSAoQ3ZNYXQqKW1oaWltZzsKKyAgICBDdk1hdCAgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNraW1nOworICAgIEN2TWF0ICBvcmllbnRzdHViLCAqb3JpZW50ID0gKEN2TWF0KilvcmllbnRhdGlvbjsKKyAgICBDdk1hdCAgZFhfbWluX3JvdywgZFlfbWF4X3Jvdywgb3JpZW50X3JvdywgbWFza19yb3c7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IHgsIHk7CisKKyAgICBmbG9hdCAgZ3JhZGllbnRfZXBzaWxvbiA9IDFlLTRmICogYXBlcnR1cmVfc2l6ZSAqIGFwZXJ0dXJlX3NpemU7CisgICAgZmxvYXQgIG1pbl9kZWx0YSwgbWF4X2RlbHRhOworCisgICAgQ1ZfQ0FMTCggbWhpID0gY3ZHZXRNYXQoIG1oaSwgJm1oaXN0dWIgKSk7CisgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggb3JpZW50ID0gY3ZHZXRNYXQoIG9yaWVudCwgJm9yaWVudHN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXNrICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgaWYoIGFwZXJ0dXJlX3NpemUgPCAzIHx8IGFwZXJ0dXJlX3NpemUgPiA3IHx8IChhcGVydHVyZV9zaXplICYgMSkgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiYXBlcnR1cmVfc2l6ZSBtdXN0IGJlIDMsIDUgb3IgNyIgKTsKKworICAgIGlmKCBkZWx0YTEgPD0gMCB8fCBkZWx0YTIgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiYm90aCBkZWx0YSdzIG11c3QgYmUgcG9zaXRpdmUiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIG1oaS0+dHlwZSApICE9IENWXzMyRkMxIHx8IENWX01BVF9UWVBFKCBvcmllbnQtPnR5cGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIk1ISSBhbmQgb3JpZW50YXRpb24gbXVzdCBiZSBzaW5nbGUtY2hhbm5lbCBmbG9hdGluZy1wb2ludCBpbWFnZXMiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWhpLCBtYXNrICkgfHwgIUNWX0FSRV9TSVpFU19FUSggb3JpZW50LCBtaGkgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoIG9yaWVudC0+ZGF0YS5wdHIgPT0gbWhpLT5kYXRhLnB0ciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNJbnBsYWNlTm90U3VwcG9ydGVkLCAib3JpZW50YXRpb24gaW1hZ2UgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBNSEkiICk7CisKKyAgICBpZiggZGVsdGExID4gZGVsdGEyICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0OworICAgICAgICBDVl9TV0FQKCBkZWx0YTEsIGRlbHRhMiwgdCApOworICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1oaSApOworICAgIG1pbl9kZWx0YSA9IChmbG9hdClkZWx0YTE7CisgICAgbWF4X2RlbHRhID0gKGZsb2F0KWRlbHRhMjsKKyAgICBDVl9DQUxMKCBkWF9taW4gPSBjdkNyZWF0ZU1hdCggbWhpLT5yb3dzLCBtaGktPmNvbHMsIENWXzMyRiApKTsKKyAgICBDVl9DQUxMKCBkWV9tYXggPSBjdkNyZWF0ZU1hdCggbWhpLT5yb3dzLCBtaGktPmNvbHMsIENWXzMyRiApKTsKKworICAgIC8qIGNhbGMgRHggYW5kIER5ICovCisgICAgQ1ZfQ0FMTCggY3ZTb2JlbCggbWhpLCBkWF9taW4sIDEsIDAsIGFwZXJ0dXJlX3NpemUgKSk7CisgICAgQ1ZfQ0FMTCggY3ZTb2JlbCggbWhpLCBkWV9tYXgsIDAsIDEsIGFwZXJ0dXJlX3NpemUgKSk7CisgICAgY3ZHZXRSb3coIGRYX21pbiwgJmRYX21pbl9yb3csIDAgKTsKKyAgICBjdkdldFJvdyggZFlfbWF4LCAmZFlfbWF4X3JvdywgMCApOworICAgIGN2R2V0Um93KCBvcmllbnQsICZvcmllbnRfcm93LCAwICk7CisgICAgY3ZHZXRSb3coIG1hc2ssICZtYXNrX3JvdywgMCApOworCisgICAgLyogY2FsYyBncmFkaWVudCAqLworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIGRYX21pbl9yb3cuZGF0YS5wdHIgPSBkWF9taW4tPmRhdGEucHRyICsgeSpkWF9taW4tPnN0ZXA7CisgICAgICAgIGRZX21heF9yb3cuZGF0YS5wdHIgPSBkWV9tYXgtPmRhdGEucHRyICsgeSpkWV9tYXgtPnN0ZXA7CisgICAgICAgIG9yaWVudF9yb3cuZGF0YS5wdHIgPSBvcmllbnQtPmRhdGEucHRyICsgeSpvcmllbnQtPnN0ZXA7CisgICAgICAgIG1hc2tfcm93LmRhdGEucHRyID0gbWFzay0+ZGF0YS5wdHIgKyB5Km1hc2stPnN0ZXA7CisgICAgICAgIGN2Q2FydFRvUG9sYXIoICZkWF9taW5fcm93LCAmZFlfbWF4X3JvdywgMCwgJm9yaWVudF9yb3csIDEgKTsKKworICAgICAgICAvKiBtYWtlIG9yaWVudGF0aW9uIHplcm8gd2hlcmUgdGhlIGdyYWRpZW50IGlzIHZlcnkgc21hbGwgKi8KKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGRZID0gZFlfbWF4X3Jvdy5kYXRhLmZsW3hdOworICAgICAgICAgICAgZmxvYXQgZFggPSBkWF9taW5fcm93LmRhdGEuZmxbeF07CisKKyAgICAgICAgICAgIGlmKCBmYWJzKGRYKSA8IGdyYWRpZW50X2Vwc2lsb24gJiYgZmFicyhkWSkgPCBncmFkaWVudF9lcHNpbG9uICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXNrX3Jvdy5kYXRhLnB0clt4XSA9IDA7CisgICAgICAgICAgICAgICAgb3JpZW50X3Jvdy5kYXRhLmlbeF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1hc2tfcm93LmRhdGEucHRyW3hdID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENWX0NBTEwoIGVsID0gY3ZDcmVhdGVTdHJ1Y3R1cmluZ0VsZW1lbnRFeCggYXBlcnR1cmVfc2l6ZSwgYXBlcnR1cmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcGVydHVyZV9zaXplLzIsIGFwZXJ0dXJlX3NpemUvMiwgQ1ZfU0hBUEVfUkVDVCApKTsKKyAgICBjdkVyb2RlKCBtaGksIGRYX21pbiwgZWwgKTsKKyAgICBjdkRpbGF0ZSggbWhpLCBkWV9tYXgsIGVsICk7CisKKyAgICAvKiBtYXNrIG9mZiBwaXhlbHMgd2hpY2ggaGF2ZSBsaXR0bGUgbW90aW9uIGRpZmZlcmVuY2UgaW4gdGhlaXIgbmVpZ2hib3Job29kICovCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgZFhfbWluX3Jvdy5kYXRhLnB0ciA9IGRYX21pbi0+ZGF0YS5wdHIgKyB5KmRYX21pbi0+c3RlcDsKKyAgICAgICAgZFlfbWF4X3Jvdy5kYXRhLnB0ciA9IGRZX21heC0+ZGF0YS5wdHIgKyB5KmRZX21heC0+c3RlcDsKKyAgICAgICAgbWFza19yb3cuZGF0YS5wdHIgPSBtYXNrLT5kYXRhLnB0ciArIHkqbWFzay0+c3RlcDsKKyAgICAgICAgb3JpZW50X3Jvdy5kYXRhLnB0ciA9IG9yaWVudC0+ZGF0YS5wdHIgKyB5Km9yaWVudC0+c3RlcDsKKyAgICAgICAgCisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkMCA9IGRZX21heF9yb3cuZGF0YS5mbFt4XSAtIGRYX21pbl9yb3cuZGF0YS5mbFt4XTsKKworICAgICAgICAgICAgaWYoIG1hc2tfcm93LmRhdGEucHRyW3hdID09IDAgfHwgZDAgPCBtaW5fZGVsdGEgfHwgbWF4X2RlbHRhIDwgZDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hc2tfcm93LmRhdGEucHRyW3hdID0gMDsKKyAgICAgICAgICAgICAgICBvcmllbnRfcm93LmRhdGEuaVt4XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmZFhfbWluICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmZFlfbWF4ICk7CisgICAgY3ZSZWxlYXNlU3RydWN0dXJpbmdFbGVtZW50KCAmZWwgKTsKK30KKworCitDVl9JTVBMIGRvdWJsZQorY3ZDYWxjR2xvYmFsT3JpZW50YXRpb24oIGNvbnN0IHZvaWQqIG9yaWVudGF0aW9uLCBjb25zdCB2b2lkKiBtYXNraW1nLCBjb25zdCB2b2lkKiBtaGlpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGN1cnJfbWhpX3RpbWVzdGFtcCwgZG91YmxlIG1oaV9kdXJhdGlvbiApCit7CisgICAgZG91YmxlICBhbmdsZSA9IDA7CisgICAgaW50IGhpc3Rfc2l6ZSA9IDEyOworICAgIEN2SGlzdG9ncmFtKiBoaXN0ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjR2xvYmFsT3JpZW50YXRpb24iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCAgbWhpc3R1YiwgKm1oaSA9IChDdk1hdCopbWhpaW1nOworICAgIEN2TWF0ICBtYXNrc3R1YiwgKm1hc2sgPSAoQ3ZNYXQqKW1hc2tpbWc7CisgICAgQ3ZNYXQgIG9yaWVudHN0dWIsICpvcmllbnQgPSAoQ3ZNYXQqKW9yaWVudGF0aW9uOworICAgIHZvaWQqICBfb3JpZW50OworICAgIGZsb2F0IF9yYW5nZXNbXSA9IHsgMCwgMzYwIH07CisgICAgZmxvYXQqIHJhbmdlcyA9IF9yYW5nZXM7CisgICAgaW50IGJhc2Vfb3JpZW50OworICAgIGRvdWJsZSBzaGlmdF9vcmllbnQgPSAwLCBzaGlmdF93ZWlnaHQgPSAwLCBmYmFzZV9vcmllbnQ7CisgICAgZG91YmxlIGEsIGI7CisgICAgZmxvYXQgZGVsYm91bmQ7CisgICAgQ3ZNYXQgbWhpX3JvdywgbWFza19yb3csIG9yaWVudF9yb3c7CisgICAgaW50IHgsIHksIG1oaV9yb3dzLCBtaGlfY29sczsKKworICAgIENWX0NBTEwoIG1oaSA9IGN2R2V0TWF0KCBtaGksICZtaGlzdHViICkpOworICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworICAgIENWX0NBTEwoIG9yaWVudCA9IGN2R2V0TWF0KCBvcmllbnQsICZvcmllbnRzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVNLX0FSUiggbWFzayApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRSggbWhpLT50eXBlICkgIT0gQ1ZfMzJGQzEgfHwgQ1ZfTUFUX1RZUEUoIG9yaWVudC0+dHlwZSApICE9IENWXzMyRkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiTUhJIGFuZCBvcmllbnRhdGlvbiBtdXN0IGJlIHNpbmdsZS1jaGFubmVsIGZsb2F0aW5nLXBvaW50IGltYWdlcyIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtaGksIG1hc2sgKSB8fCAhQ1ZfQVJFX1NJWkVTX0VRKCBvcmllbnQsIG1oaSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggbWhpX2R1cmF0aW9uIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk1ISSBkdXJhdGlvbiBtdXN0IGJlIHBvc2l0aXZlIiApOworCisgICAgaWYoIG9yaWVudC0+ZGF0YS5wdHIgPT0gbWhpLT5kYXRhLnB0ciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNJbnBsYWNlTm90U3VwcG9ydGVkLCAib3JpZW50YXRpb24gaW1hZ2UgbXVzdCBiZSBkaWZmZXJlbnQgZnJvbSBNSEkiICk7CisKKyAgICAvLyBjYWxjdWxhdGUgaGlzdG9ncmFtIG9mIGRpZmZlcmVudCBvcmllbnRhdGlvbiB2YWx1ZXMKKyAgICBDVl9DQUxMKCBoaXN0ID0gY3ZDcmVhdGVIaXN0KCAxLCAmaGlzdF9zaXplLCBDVl9ISVNUX0FSUkFZLCAmcmFuZ2VzICkpOworICAgIF9vcmllbnQgPSBvcmllbnQ7CisgICAgY3ZDYWxjQXJySGlzdCggJl9vcmllbnQsIGhpc3QsIDAsIG1hc2sgKTsKKworICAgIC8vIGZpbmQgdGhlIG1heGltdW0gaW5kZXggKHRoZSBkb21pbmFudCBvcmllbnRhdGlvbikKKyAgICBjdkdldE1pbk1heEhpc3RWYWx1ZSggaGlzdCwgMCwgMCwgMCwgJmJhc2Vfb3JpZW50ICk7CisgICAgYmFzZV9vcmllbnQgKj0gMzYwL2hpc3Rfc2l6ZTsKKworICAgIC8vIG92ZXJyaWRlIHRpbWVzdGFtcCB3aXRoIHRoZSBtYXhpbXVtIHZhbHVlIGluIE1ISQorICAgIGN2TWluTWF4TG9jKCBtaGksIDAsICZjdXJyX21oaV90aW1lc3RhbXAsIDAsIDAsIG1hc2sgKTsKKworICAgIC8vIGZpbmQgdGhlIHNoaWZ0IHJlbGF0aXZlIHRvIHRoZSBkb21pbmFudCBvcmllbnRhdGlvbiBhcyB3ZWlnaHRlZCBzdW0gb2YgcmVsYXRpdmUgYW5nbGVzCisgICAgYSA9IDI1NC4gLyAyNTUuIC8gbWhpX2R1cmF0aW9uOworICAgIGIgPSAxLiAtIGN1cnJfbWhpX3RpbWVzdGFtcCAqIGE7CisgICAgZmJhc2Vfb3JpZW50ID0gYmFzZV9vcmllbnQ7CisgICAgZGVsYm91bmQgPSAoZmxvYXQpKGN1cnJfbWhpX3RpbWVzdGFtcCAtIG1oaV9kdXJhdGlvbik7CisgICAgbWhpX3Jvd3MgPSBtaGktPnJvd3M7CisgICAgbWhpX2NvbHMgPSBtaGktPmNvbHM7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1oaS0+dHlwZSAmIG1hc2stPnR5cGUgJiBvcmllbnQtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIG1oaV9jb2xzICo9IG1oaV9yb3dzOworICAgICAgICBtaGlfcm93cyA9IDE7CisgICAgfQorCisgICAgY3ZHZXRSb3coIG1oaSwgJm1oaV9yb3csIDAgKTsKKyAgICBjdkdldFJvdyggbWFzaywgJm1hc2tfcm93LCAwICk7CisgICAgY3ZHZXRSb3coIG9yaWVudCwgJm9yaWVudF9yb3csIDAgKTsKKworICAgIC8qCisgICAgICAgYSA9IDI1NC8oMjU1KmR0KQorICAgICAgIGIgPSAxIC0gdCphID0gMSAtIDI1NCp0LygyNTUqZHVyKSA9CisgICAgICAgKDI1NSpkdCAtIDI1NCp0KS8oMjU1KmR0KSA9CisgICAgICAgKGR0IC0gKHQgLSBkdCkqMjU0KS8oMjU1KmR0KTsKKyAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgIGF4ICsgYiA9IDI1NCp4LygyNTUqZHQpICsgKGR0IC0gKHQgLSBkdCkqMjU0KS8oMjU1KmR0KSA9CisgICAgICAgKDI1NCp4ICsgZHQgLSAodCAtIGR0KSoyNTQpLygyNTUqZHQpID0KKyAgICAgICAoKHggLSAodCAtIGR0KSkqMjU0ICsgZHQpLygyNTUqZHQpID0KKyAgICAgICAoKCh4IC0gKHQgLSBkdCkpL2R0KSoyNTQgKyAxKS8yNTUgPSAoKCh4IC0gbG93X3RpbWUpL2R0KSoyNTQgKyAxKS8yNTUKKyAgICAgKi8KKyAgICBmb3IoIHkgPSAwOyB5IDwgbWhpX3Jvd3M7IHkrKyApCisgICAgeworICAgICAgICBtaGlfcm93LmRhdGEucHRyID0gbWhpLT5kYXRhLnB0ciArIG1oaS0+c3RlcCp5OworICAgICAgICBtYXNrX3Jvdy5kYXRhLnB0ciA9IG1hc2stPmRhdGEucHRyICsgbWFzay0+c3RlcCp5OworICAgICAgICBvcmllbnRfcm93LmRhdGEucHRyID0gb3JpZW50LT5kYXRhLnB0ciArIG9yaWVudC0+c3RlcCp5OworCisgICAgICAgIGZvciggeCA9IDA7IHggPCBtaGlfY29sczsgeCsrICkKKyAgICAgICAgICAgIGlmKCBtYXNrX3Jvdy5kYXRhLnB0clt4XSAhPSAwICYmIG1oaV9yb3cuZGF0YS5mbFt4XSA+IGRlbGJvdW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgIG9yaWVudCBpbiAwLi4zNjAsIGJhc2Vfb3JpZW50IGluIDAuLjM2MAorICAgICAgICAgICAgICAgICAgIC0+IChyZWxfYW5nbGUgPSBvcmllbnQgLSBiYXNlX29yaWVudCkgaW4gLTM2MC4uMzYwLgorICAgICAgICAgICAgICAgICAgIHJlbF9hbmdsZSBpcyB0cmFuc2xhdGVkIHRvIC0xODAuLjE4MAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGRvdWJsZSB3ZWlnaHQgPSBtaGlfcm93LmRhdGEuZmxbeF0gKiBhICsgYjsKKyAgICAgICAgICAgICAgICBpbnQgcmVsX2FuZ2xlID0gY3ZSb3VuZCggb3JpZW50X3Jvdy5kYXRhLmZsW3hdIC0gZmJhc2Vfb3JpZW50ICk7CisKKyAgICAgICAgICAgICAgICByZWxfYW5nbGUgKz0gKHJlbF9hbmdsZSA8IC0xODAgPyAzNjAgOiAwKTsKKyAgICAgICAgICAgICAgICByZWxfYW5nbGUgKz0gKHJlbF9hbmdsZSA+IDE4MCA/IC0zNjAgOiAwKTsKKworICAgICAgICAgICAgICAgIGlmKCBhYnMocmVsX2FuZ2xlKSA8IDkwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNoaWZ0X29yaWVudCArPSB3ZWlnaHQgKiByZWxfYW5nbGU7CisgICAgICAgICAgICAgICAgICAgIHNoaWZ0X3dlaWdodCArPSB3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkZCB0aGUgZG9taW5hbnQgb3JpZW50YXRpb24gYW5kIHRoZSByZWxhdGl2ZSBzaGlmdAorICAgIGlmKCBzaGlmdF93ZWlnaHQgPT0gMCApCisgICAgICAgIHNoaWZ0X3dlaWdodCA9IDAuMDE7CisKKyAgICBiYXNlX29yaWVudCA9IGJhc2Vfb3JpZW50ICsgY3ZSb3VuZCggc2hpZnRfb3JpZW50IC8gc2hpZnRfd2VpZ2h0ICk7CisgICAgYmFzZV9vcmllbnQgLT0gKGJhc2Vfb3JpZW50IDwgMzYwID8gMCA6IDM2MCk7CisgICAgYmFzZV9vcmllbnQgKz0gKGJhc2Vfb3JpZW50ID49IDAgPyAwIDogMzYwKTsKKworICAgIGFuZ2xlID0gYmFzZV9vcmllbnQ7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlSGlzdCggJmhpc3QgKTsKKyAgICByZXR1cm4gYW5nbGU7Cit9CisKKworQ1ZfSU1QTCBDdlNlcSoKK2N2U2VnbWVudE1vdGlvbiggY29uc3QgQ3ZBcnIqIG1oaWltZywgQ3ZBcnIqIHNlZ21hc2ssIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgZG91YmxlIHRpbWVzdGFtcCwgZG91YmxlIHNlZ190aHJlc2ggKQoreworICAgIEN2U2VxKiBjb21wb25lbnRzID0gMDsKKyAgICBDdk1hdCogbWFzazh1ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZWdtZW50TW90aW9uIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgIG1oaXN0dWIsICptaGkgPSAoQ3ZNYXQqKW1oaWltZzsKKyAgICBDdk1hdCAgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KilzZWdtYXNrOworICAgIEN2MzJzdWYgdiwgY29tcF9pZHg7CisgICAgaW50IHN0dWJfdmFsLCB0czsKKyAgICBpbnQgeCwgeTsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBtZW1vcnkgc3RvcmFnZSIgKTsKKworICAgIENWX0NBTEwoIG1oaSA9IGN2R2V0TWF0KCBtaGksICZtaGlzdHViICkpOworICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgaWYoIENWX01BVF9UWVBFKCBtaGktPnR5cGUgKSAhPSBDVl8zMkZDMSB8fCBDVl9NQVRfVFlQRSggbWFzay0+dHlwZSApICE9IENWXzMyRkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCAiQm90aCBNSEkgYW5kIHRoZSBkZXN0aW5hdGlvbiBtYXNrIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1oaSwgbWFzayApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBDVl9DQUxMKCBtYXNrOHUgPSBjdkNyZWF0ZU1hdCggbWhpLT5yb3dzICsgMiwgbWhpLT5jb2xzICsgMiwgQ1ZfOFVDMSApKTsKKyAgICBjdlplcm8oIG1hc2s4dSApOworICAgIGN2WmVybyggbWFzayApOworICAgIENWX0NBTEwoIGNvbXBvbmVudHMgPSBjdkNyZWF0ZVNlcSggQ1ZfU0VRX0tJTkRfR0VORVJJQywgc2l6ZW9mKEN2U2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkNvbm5lY3RlZENvbXApLCBzdG9yYWdlICkpOworICAgIAorICAgIHYuZiA9IChmbG9hdCl0aW1lc3RhbXA7IHRzID0gdi5pOworICAgIHYuZiA9IEZMVF9NQVgqMC4xZjsgc3R1Yl92YWwgPSB2Lmk7CisgICAgY29tcF9pZHguZiA9IDE7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgbWhpLT5yb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgaW50KiBtaGlfcm93ID0gKGludCopKG1oaS0+ZGF0YS5wdHIgKyB5Km1oaS0+c3RlcCk7CisgICAgICAgIGZvciggeCA9IDA7IHggPCBtaGktPmNvbHM7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtaGlfcm93W3hdID09IDAgKQorICAgICAgICAgICAgICAgIG1oaV9yb3dbeF0gPSBzdHViX3ZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciggeSA9IDA7IHkgPCBtaGktPnJvd3M7IHkrKyApCisgICAgeworICAgICAgICBpbnQqIG1oaV9yb3cgPSAoaW50KikobWhpLT5kYXRhLnB0ciArIHkqbWhpLT5zdGVwKTsKKyAgICAgICAgdWNoYXIqIG1hc2s4dV9yb3cgPSBtYXNrOHUtPmRhdGEucHRyICsgKHkrMSkqbWFzazh1LT5zdGVwICsgMTsKKworICAgICAgICBmb3IoIHggPSAwOyB4IDwgbWhpLT5jb2xzOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWhpX3Jvd1t4XSA9PSB0cyAmJiBtYXNrOHVfcm93W3hdID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCBjb21wOworICAgICAgICAgICAgICAgIGludCB4MSwgeTE7CisgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgX3NlZ190aHJlc2ggPSBjdlJlYWxTY2FsYXIoc2VnX3RocmVzaCk7CisgICAgICAgICAgICAgICAgQ3ZQb2ludCBzZWVkID0gY3ZQb2ludCh4LHkpOworCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZGbG9vZEZpbGwoIG1oaSwgc2VlZCwgY3ZSZWFsU2NhbGFyKDApLCBfc2VnX3RocmVzaCwgX3NlZ190aHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21wLCBDVl9GTE9PREZJTExfTUFTS19PTkxZICsgMioyNTYgKyA0LCBtYXNrOHUgKSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHkxID0gMDsgeTEgPCBjb21wLnJlY3QuaGVpZ2h0OyB5MSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCogbWFza19yb3cxID0gKGludCopKG1hc2stPmRhdGEucHRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wLnJlY3QueSArIHkxKSptYXNrLT5zdGVwKSArIGNvbXAucmVjdC54OworICAgICAgICAgICAgICAgICAgICB1Y2hhciogbWFzazh1X3JvdzEgPSBtYXNrOHUtPmRhdGEucHRyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wLnJlY3QueSArIHkxKzEpKm1hc2s4dS0+c3RlcCArIGNvbXAucmVjdC54KzE7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4MSA9IDA7IHgxIDwgY29tcC5yZWN0LndpZHRoOyB4MSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2s4dV9yb3cxW3gxXSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2s4dV9yb3cxW3gxXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19yb3cxW3gxXSA9IGNvbXBfaWR4Lmk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcF9pZHguZisrOworICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggY29tcG9uZW50cywgJmNvbXAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciggeSA9IDA7IHkgPCBtaGktPnJvd3M7IHkrKyApCisgICAgeworICAgICAgICBpbnQqIG1oaV9yb3cgPSAoaW50KikobWhpLT5kYXRhLnB0ciArIHkqbWhpLT5zdGVwKTsKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IG1oaS0+Y29sczsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1oaV9yb3dbeF0gPT0gc3R1Yl92YWwgKQorICAgICAgICAgICAgICAgIG1oaV9yb3dbeF0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJm1hc2s4dSApOworICAgIHJldHVybiBjb21wb25lbnRzOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdm9wdGZsb3dibS5jcHAgYi9jdi9zcmMvY3ZvcHRmbG93Ym0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyM2UzYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZvcHRmbG93Ym0uY3BwCkBAIC0wLDAgKzEsNjEwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisvKiAKKyAgIEZpbmRzIEwxIG5vcm0gYmV0d2VlbiB0d28gYmxvY2tzLgorKi8KK3N0YXRpYyBpbnQKK2ljdkNtcEJsb2Nrc0wxXzh1X0MxKCBjb25zdCB1Y2hhciAqIHZlYzEsIGNvbnN0IHVjaGFyICogdmVjMiwgaW50IGxlbiApCit7CisgICAgaW50IGksIHN1bSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IGxlbiAtIDQ7IGkgKz0gNCApCisgICAgeworICAgICAgICBpbnQgdDAgPSBhYnModmVjMVtpXSAtIHZlYzJbaV0pOworICAgICAgICBpbnQgdDEgPSBhYnModmVjMVtpICsgMV0gLSB2ZWMyW2kgKyAxXSk7CisgICAgICAgIGludCB0MiA9IGFicyh2ZWMxW2kgKyAyXSAtIHZlYzJbaSArIDJdKTsKKyAgICAgICAgaW50IHQzID0gYWJzKHZlYzFbaSArIDNdIC0gdmVjMltpICsgM10pOworCisgICAgICAgIHN1bSArPSB0MCArIHQxICsgdDIgKyB0MzsKKyAgICB9CisKKyAgICBmb3IoIDsgaSA8IGxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCB0MCA9IGFicyh2ZWMxW2ldIC0gdmVjMltpXSk7CisgICAgICAgIHN1bSArPSB0MDsKKyAgICB9CisKKyAgICByZXR1cm4gc3VtOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZDb3B5Qk1fOHVfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY19zdGVwLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgICAgICBtZW1jcHkoIGRzdCwgc3JjLCBzaXplLndpZHRoICk7Cit9CisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDYWxjT3B0aWNhbEZsb3dCTV84dTMyZlIKKy8vICAgIFB1cnBvc2U6IGNhbGN1bGF0ZSBPcHRpY2FsIGZsb3cgZm9yIDIgaW1hZ2VzIHVzaW5nIGJsb2NrIG1hdGNoaW5nIGFsZ29yaXRobQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgIGltZ0EsICAgICAgICAgLy8gcG9pbnRlciB0byBmaXJzdCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nQiwgICAgICAgICAvLyBwb2ludGVyIHRvIHNlY29uZCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nU3RlcCwgICAgICAvLyBmdWxsIHdpZHRoIG9mIGlucHV0IGltYWdlcyBpbiBieXRlcworLy8gICAgICAgICAgICBpbWdTaXplLCAgICAgIC8vIHNpemUgb2YgdGhlIGltYWdlCisvLyAgICAgICAgICAgIGJsb2NrU2l6ZSwgICAgLy8gc2l6ZSBvZiBiYXNpYyBibG9ja3Mgd2hpY2ggYXJlIGNvbXBhcmVkCisvLyAgICAgICAgICAgIHNoaWZ0U2l6ZSwgICAgLy8gY29vcmRpbmF0ZXMgaW5jcmVtZW50cy4KKy8vICAgICAgICAgICAgbWF4UmFuZ2UsICAgICAvLyBzaXplIG9mIHRoZSBzY2FubmVkIG5laWdoYm9yaG9vZC4KKy8vICAgICAgICAgICAgdXNlUHJldmlvdXMsICAvLyBmbGFnIG9mIHVzaW5nIHByZXZpb3VzIHZlbG9jaXR5IGZpZWxkCisvLyAgICAgICAgICAgIHZlbG9jaXR5WCwgICAgLy8gIHBvaW50ZXIgdG8gUk9JIG9mIGhvcml6b250YWwgYW5kCisvLyAgICAgICAgICAgIHZlbG9jaXR5WSwgICAgLy8gIHZlcnRpY2FsIGNvbXBvbmVudHMgb2Ygb3B0aWNhbCBmbG93CisvLyAgICAgICAgICAgIHZlbFN0ZXApOyAgICAgLy8gIGZ1bGwgd2lkdGggb2YgdmVsb2NpdHkgZnJhbWVzIGluIGJ5dGVzCisvLyAgICBSZXR1cm5zOiBDVl9PSyBvciBlcnJvciBjb2RlCisvLyAgICBOb3RlczoKKy8vRiovCisjZGVmaW5lIFNNQUxMX0RJRkYgMgorI2RlZmluZSBCSUdfRElGRiAxMjgKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkNhbGNPcHRpY2FsRmxvd0JNXzh1MzJmUiggdWNoYXIgKiBpbWdBLCB1Y2hhciAqIGltZ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbWdTdGVwLCBDdlNpemUgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGJsb2NrU2l6ZSwgQ3ZTaXplIHNoaWZ0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIG1heFJhbmdlLCBpbnQgdXNlUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnZlbG9jaXR5WCwgZmxvYXQgKnZlbG9jaXR5WSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZlbFN0ZXAgKQoreworICAgIGNvbnN0IGZsb2F0IGJhY2sgPSAxLmYgLyAoZmxvYXQpICgxIDw8IDE2KTsKKworICAgIC8qIHNjYW5uaW5nIHNjaGVtZSBjb29yZGluYXRlcyAqLworCisgICAgQ3ZQb2ludCAqc3MgPSAwOworICAgIGludCBzc19jb3VudCA9IDA7CisKKyAgICBpbnQgc3RhbmRfYWNjZXB0X2xldmVsID0gYmxvY2tTaXplLmhlaWdodCAqIGJsb2NrU2l6ZS53aWR0aCAqIFNNQUxMX0RJRkY7CisgICAgaW50IHN0YW5kX2VzY2FwZV9sZXZlbCA9IGJsb2NrU2l6ZS5oZWlnaHQgKiBibG9ja1NpemUud2lkdGggKiBCSUdfRElGRjsKKworICAgIGludCBpLCBqOworCisgICAgaW50ICppbnRfdmVsb2NpdHlYID0gKGludCAqKSB2ZWxvY2l0eVg7CisgICAgaW50ICppbnRfdmVsb2NpdHlZID0gKGludCAqKSB2ZWxvY2l0eVk7CisKKyAgICAvKiBpZiBpbWFnZSBzaXplcyBjYW4ndCBiZSBkaXZpZGVkIGJ5IGJsb2NrIHNpemVzIHRoZW4gcmlnaHQgYmxvY2tzIHdpbGwgICovCisgICAgLyogaGF2ZSBub3QgZnVsbCB3aWR0aCAgLSBCb3JkZXJXaWR0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIGFuZCBib3R0b20gYmxvY2tzIHdpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBoYXZlIG5vdCBmdWxsIGhlaWdodCAtIEJvcmRlckhlaWdodCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IEJvcmRlcldpZHRoOworICAgIGludCBCb3JkZXJIZWlnaHQ7CisKKyAgICBpbnQgQ3VycmVudFdpZHRoOworICAgIGludCBDdXJyZW50SGVpZ2h0OworCisgICAgaW50IE51bWJlckJsb2Nrc1g7CisgICAgaW50IE51bWJlckJsb2Nrc1k7CisKKyAgICBpbnQgWTEgPSAwOworICAgIGludCBYMSA9IDA7CisKKyAgICBpbnQgRG93blN0ZXAgPSBibG9ja1NpemUuaGVpZ2h0ICogaW1nU3RlcDsKKworICAgIHVjaGFyICpibG9ja0EgPSAwOworICAgIHVjaGFyICpibG9ja0IgPSAwOworICAgIHVjaGFyICpibG9ja1ogPSAwOworICAgIGludCBibFNpemUgPSBibG9ja1NpemUud2lkdGggKiBibG9ja1NpemUuaGVpZ2h0OworICAgIGludCBidWZmZXJTaXplID0gY3ZBbGlnbihibFNpemUgKyA5LDE2KTsKKyAgICBpbnQgY21wU2l6ZSA9IGN2QWxpZ24oYmxTaXplLDQpOworICAgIGludCBwYXRjaF9vZnMgPSBibFNpemUgJiAtODsKKyAgICBpbnQ2NCBwYXRjaF9tYXNrID0gKCgoaW50NjQpIDEpIDw8IChibFNpemUgLSBwYXRjaF9vZnMgKiA4KSkgLSAxOworCisgICAgdmVsU3RlcCAvPSBzaXplb2YodmVsb2NpdHlYWzBdKTsKKworICAgIGlmKCBwYXRjaF9vZnMgPT0gYmxTaXplICkKKyAgICAgICAgcGF0Y2hfbWFzayA9IChpbnQ2NCkgLSAxOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICBDaGVja2luZyBiYWQgYXJndW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoIGltZ0EgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggaW1nQiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICBBbGxvY2F0ZSBidWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgYmxvY2tBID0gKHVjaGFyICopIGN2QWxsb2MoIGJ1ZmZlclNpemUgKiAzICk7CisgICAgaWYoICFibG9ja0EgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgYmxvY2tCID0gYmxvY2tBICsgYnVmZmVyU2l6ZTsKKyAgICBibG9ja1ogPSBibG9ja0IgKyBidWZmZXJTaXplOworCisgICAgbWVtc2V0KCBibG9ja1osIDAsIGJ1ZmZlclNpemUgKTsKKworICAgIHNzID0gKEN2UG9pbnQgKikgY3ZBbGxvYyggKDIgKiBtYXhSYW5nZS53aWR0aCArIDEpICogKDIgKiBtYXhSYW5nZS5oZWlnaHQgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCBDdlBvaW50ICkpOworICAgIGlmKCAhc3MgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmYmxvY2tBICk7CisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICBDYWxjdWxhdGUgc2Nhbm5pbmcgc2NoZW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgeworICAgICAgICBpbnQgWF9zaGlmdF9jb3VudCA9IG1heFJhbmdlLndpZHRoIC8gc2hpZnRTaXplLndpZHRoOworICAgICAgICBpbnQgWV9zaGlmdF9jb3VudCA9IG1heFJhbmdlLmhlaWdodCAvIHNoaWZ0U2l6ZS5oZWlnaHQ7CisgICAgICAgIGludCBtaW5fY291bnQgPSBNSU4oIFhfc2hpZnRfY291bnQsIFlfc2hpZnRfY291bnQgKTsKKworICAgICAgICAvKiBjeWNsZSBieSBuZWlnaGJvcmhvb2QgcmluZ3MgKi8KKyAgICAgICAgLyogc2Nhbm5pbmcgc2NoZW1lIGlzIAorCisgICAgICAgICAgIC4gOSAgMTAgMTEgMTIKKyAgICAgICAgICAgLiA4ICAxICAyICAxMworICAgICAgICAgICAuIDcgICogIDMgIDE0CisgICAgICAgICAgIC4gNiAgNSAgNCAgMTUgICAgICAKKyAgICAgICAgICAgMjAgMTkgMTggMTcgMTYKKyAgICAgICAgICovCisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1pbl9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogZm91ciBjeWNsZXMgYWxvbmcgc2lkZXMgKi8KKyAgICAgICAgICAgIGludCB5ID0gLShpICsgMSkgKiBzaGlmdFNpemUuaGVpZ2h0OworICAgICAgICAgICAgaW50IHggPSAtKGkgKyAxKSAqIHNoaWZ0U2l6ZS53aWR0aDsKKworICAgICAgICAgICAgLyogdXBwZXIgc2lkZSAqLworICAgICAgICAgICAgZm9yKCBqID0gLWk7IGogPD0gaSArIDE7IGorKywgc3NfY291bnQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeCArPSBzaGlmdFNpemUud2lkdGg7CisgICAgICAgICAgICAgICAgc3Nbc3NfY291bnRdLnggPSB4OworICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS55ID0geTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogcmlnaHQgc2lkZSAqLworICAgICAgICAgICAgZm9yKCBqID0gLWk7IGogPD0gaSArIDE7IGorKywgc3NfY291bnQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeSArPSBzaGlmdFNpemUuaGVpZ2h0OworICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS54ID0geDsKKyAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueSA9IHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGJvdHRvbSBzaWRlICovCisgICAgICAgICAgICBmb3IoIGogPSAtaTsgaiA8PSBpICsgMTsgaisrLCBzc19jb3VudCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4IC09IHNoaWZ0U2l6ZS53aWR0aDsKKyAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueCA9IHg7CisgICAgICAgICAgICAgICAgc3Nbc3NfY291bnRdLnkgPSB5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBsZWZ0IHNpZGUgKi8KKyAgICAgICAgICAgIGZvciggaiA9IC1pOyBqIDw9IGkgKyAxOyBqKyssIHNzX2NvdW50KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHkgLT0gc2hpZnRTaXplLmhlaWdodDsKKyAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueCA9IHg7CisgICAgICAgICAgICAgICAgc3Nbc3NfY291bnRdLnkgPSB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogdGhlIHJlc3QgcGFydCAqLworICAgICAgICBpZiggWF9zaGlmdF9jb3VudCA8IFlfc2hpZnRfY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeGxlZnQgPSAtbWluX2NvdW50ICogc2hpZnRTaXplLndpZHRoOworCisgICAgICAgICAgICAvKiBjeWNsZSBieSBuZWlnaGJvciByaW5ncyAqLworICAgICAgICAgICAgZm9yKCBpID0gbWluX2NvdW50OyBpIDwgWV9zaGlmdF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB0d28gY3ljbGVzIGJ5IHggKi8KKyAgICAgICAgICAgICAgICBpbnQgeSA9IC0oaSArIDEpICogc2hpZnRTaXplLmhlaWdodDsKKyAgICAgICAgICAgICAgICBpbnQgeCA9IHhsZWZ0OworCisgICAgICAgICAgICAgICAgLyogdXBwZXIgc2lkZSAqLworICAgICAgICAgICAgICAgIGZvciggaiA9IC1YX3NoaWZ0X2NvdW50OyBqIDw9IFhfc2hpZnRfY291bnQ7IGorKywgc3NfY291bnQrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueCA9IHg7CisgICAgICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS55ID0geTsKKyAgICAgICAgICAgICAgICAgICAgeCArPSBzaGlmdFNpemUud2lkdGg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeCA9IHhsZWZ0OworICAgICAgICAgICAgICAgIHkgPSAteTsKKyAgICAgICAgICAgICAgICAvKiBib3R0b20gc2lkZSAqLworICAgICAgICAgICAgICAgIGZvciggaiA9IC1YX3NoaWZ0X2NvdW50OyBqIDw9IFhfc2hpZnRfY291bnQ7IGorKywgc3NfY291bnQrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueCA9IHg7CisgICAgICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS55ID0geTsKKyAgICAgICAgICAgICAgICAgICAgeCArPSBzaGlmdFNpemUud2lkdGg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIFhfc2hpZnRfY291bnQgPiBZX3NoaWZ0X2NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHl1cHBlciA9IC1taW5fY291bnQgKiBzaGlmdFNpemUuaGVpZ2h0OworCisgICAgICAgICAgICAvKiBjeWNsZSBieSBuZWlnaGJvciByaW5ncyAqLworICAgICAgICAgICAgZm9yKCBpID0gbWluX2NvdW50OyBpIDwgWF9zaGlmdF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB0d28gY3ljbGVzIGJ5IHkgKi8KKyAgICAgICAgICAgICAgICBpbnQgeCA9IC0oaSArIDEpICogc2hpZnRTaXplLndpZHRoOworICAgICAgICAgICAgICAgIGludCB5ID0geXVwcGVyOworCisgICAgICAgICAgICAgICAgLyogbGVmdCBzaWRlICovCisgICAgICAgICAgICAgICAgZm9yKCBqID0gLVlfc2hpZnRfY291bnQ7IGogPD0gWV9zaGlmdF9jb3VudDsgaisrLCBzc19jb3VudCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS54ID0geDsKKyAgICAgICAgICAgICAgICAgICAgc3Nbc3NfY291bnRdLnkgPSB5OworICAgICAgICAgICAgICAgICAgICB5ICs9IHNoaWZ0U2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgeSA9IHl1cHBlcjsKKyAgICAgICAgICAgICAgICB4ID0gLXg7CisgICAgICAgICAgICAgICAgLyogcmlnaHQgc2lkZSAqLworICAgICAgICAgICAgICAgIGZvciggaiA9IC1ZX3NoaWZ0X2NvdW50OyBqIDw9IFlfc2hpZnRfY291bnQ7IGorKywgc3NfY291bnQrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzc1tzc19jb3VudF0ueCA9IHg7CisgICAgICAgICAgICAgICAgICAgIHNzW3NzX2NvdW50XS55ID0geTsKKyAgICAgICAgICAgICAgICAgICAgeSArPSBzaGlmdFNpemUuaGVpZ2h0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICBDYWxjdWxhdGUgc29tZSBuZWVlZGVkIHZhcmlhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsY3VsYXRlIG51bWJlciBvZiBmdWxsIGJsb2NrcyAqLworICAgIE51bWJlckJsb2Nrc1ggPSAoaW50KSBpbWdTaXplLndpZHRoIC8gYmxvY2tTaXplLndpZHRoOworICAgIE51bWJlckJsb2Nrc1kgPSAoaW50KSBpbWdTaXplLmhlaWdodCAvIGJsb2NrU2l6ZS5oZWlnaHQ7CisKKyAgICAvKiBhZGQgMSBpZiBub3QgZnVsbCBib3JkZXIgYmxvY2tzIGV4aXN0ICovCisgICAgQm9yZGVyV2lkdGggPSBpbWdTaXplLndpZHRoICUgYmxvY2tTaXplLndpZHRoOworICAgIGlmKCBCb3JkZXJXaWR0aCApCisgICAgICAgIE51bWJlckJsb2Nrc1grKzsKKyAgICBlbHNlCisgICAgICAgIEJvcmRlcldpZHRoID0gYmxvY2tTaXplLndpZHRoOworCisgICAgQm9yZGVySGVpZ2h0ID0gaW1nU2l6ZS5oZWlnaHQgJSBibG9ja1NpemUuaGVpZ2h0OworICAgIGlmKCBCb3JkZXJIZWlnaHQgKQorICAgICAgICBOdW1iZXJCbG9ja3NZKys7CisgICAgZWxzZQorICAgICAgICBCb3JkZXJIZWlnaHQgPSBibG9ja1NpemUuaGVpZ2h0OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogUm91bmQgaW5wdXQgdmVsb2NpdGllcyBpbnRlZ2VyIHNlYXJjaGluZyBhcmVhIGNlbnRlciBwb3NpdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYoIHVzZVByZXYgKQorICAgIHsKKyAgICAgICAgZmxvYXQgKnZlbHhmID0gdmVsb2NpdHlYLCAqdmVseWYgPSB2ZWxvY2l0eVk7CisgICAgICAgIGludCogdmVseCA9IChpbnQqKXZlbG9jaXR5WCwgKnZlbHkgPSAoaW50Kil2ZWxvY2l0eVk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IE51bWJlckJsb2Nrc1k7IGkrKywgdmVseGYgKz0gdmVsU3RlcCwgdmVseWYgKz0gdmVsU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVseCArPSB2ZWxTdGVwLCB2ZWx5ICs9IHZlbFN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgTnVtYmVyQmxvY2tzWDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdnggPSBjdlJvdW5kKCB2ZWx4ZltqXSApLCB2eSA9IGN2Um91bmQoIHZlbHlmW2pdICk7CisgICAgICAgICAgICAgICAgdmVseFtqXSA9IHZ4OyB2ZWx5W2pdID0gdnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogTWFpbiBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgWTEgPSAwOworICAgIGZvciggaSA9IDA7IGkgPCBOdW1iZXJCbG9ja3NZOyBpKysgKQorICAgIHsKKyAgICAgICAgLyogY2FsY3VsYXRlIGhlaWdodCBvZiBjdXJyZW50IGJsb2NrICovCisgICAgICAgIEN1cnJlbnRIZWlnaHQgPSAoaSA9PSBOdW1iZXJCbG9ja3NZIC0gMSkgPyBCb3JkZXJIZWlnaHQgOiBibG9ja1NpemUuaGVpZ2h0OworICAgICAgICBYMSA9IDA7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IE51bWJlckJsb2Nrc1g7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhY2NlcHRfbGV2ZWw7CisgICAgICAgICAgICBpbnQgZXNjYXBlX2xldmVsOworCisgICAgICAgICAgICBpbnQgYmxEaXN0OworCisgICAgICAgICAgICBpbnQgVmVsb2NpdHlYID0gMDsKKyAgICAgICAgICAgIGludCBWZWxvY2l0eVkgPSAwOworCisgICAgICAgICAgICBpbnQgb2ZmWCA9IDAsIG9mZlkgPSAwOworCisgICAgICAgICAgICBpbnQgQ291bnREaXJlY3Rpb24gPSAxOworCisgICAgICAgICAgICBpbnQgbWFpbl9mbGFnID0gaSA8IE51bWJlckJsb2Nrc1kgLSAxICYmIGogPCBOdW1iZXJCbG9ja3NYIC0gMTsKKyAgICAgICAgICAgIEN2U2l6ZSBDdXJTaXplOworCisgICAgICAgICAgICAvKiBjYWxjdWxhdGUgd2lkdGggb2YgY3VycmVudCBibG9jayAqLworICAgICAgICAgICAgQ3VycmVudFdpZHRoID0gKGogPT0gTnVtYmVyQmxvY2tzWCAtIDEpID8gQm9yZGVyV2lkdGggOiBibG9ja1NpemUud2lkdGg7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgaW5pdGlhbCBvZmZzZXQgKi8KKyAgICAgICAgICAgIGlmKCB1c2VQcmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvZmZYID0gaW50X3ZlbG9jaXR5WFtqXTsKKyAgICAgICAgICAgICAgICBvZmZZID0gaW50X3ZlbG9jaXR5WVtqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ3VyU2l6ZS53aWR0aCA9IEN1cnJlbnRXaWR0aDsKKyAgICAgICAgICAgIEN1clNpemUuaGVpZ2h0ID0gQ3VycmVudEhlaWdodDsKKworICAgICAgICAgICAgaWYoIG1haW5fZmxhZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWN2Q29weUJNXzh1X0MxUiggaW1nQSArIFgxLCBpbWdTdGVwLCBibG9ja0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyU2l6ZS53aWR0aCwgQ3VyU2l6ZSApOworICAgICAgICAgICAgICAgIGljdkNvcHlCTV84dV9DMVIoIGltZ0IgKyAoWTEgKyBvZmZZKSppbWdTdGVwICsgKFgxICsgb2ZmWCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nU3RlcCwgYmxvY2tCLCBDdXJTaXplLndpZHRoLCBDdXJTaXplICk7CisKKyAgICAgICAgICAgICAgICAqKChpbnQ2NCAqKSAoYmxvY2tBICsgcGF0Y2hfb2ZzKSkgJj0gcGF0Y2hfbWFzazsKKyAgICAgICAgICAgICAgICAqKChpbnQ2NCAqKSAoYmxvY2tCICsgcGF0Y2hfb2ZzKSkgJj0gcGF0Y2hfbWFzazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoIGJsb2NrQSwgMCwgYnVmZmVyU2l6ZSApOworICAgICAgICAgICAgICAgIG1lbXNldCggYmxvY2tCLCAwLCBidWZmZXJTaXplICk7CisKKyAgICAgICAgICAgICAgICBpY3ZDb3B5Qk1fOHVfQzFSKCBpbWdBICsgWDEsIGltZ1N0ZXAsIGJsb2NrQSwgYmxvY2tTaXplLndpZHRoLCBDdXJTaXplICk7CisgICAgICAgICAgICAgICAgaWN2Q29weUJNXzh1X0MxUiggaW1nQiArIChZMSArIG9mZlkpICogaW1nU3RlcCArIChYMSArIG9mZlgpLCBpbWdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrQiwgYmxvY2tTaXplLndpZHRoLCBDdXJTaXplICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhbWFpbl9mbGFnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdG1wID0gQ3VyU2l6ZS53aWR0aCAqIEN1clNpemUuaGVpZ2h0OworCisgICAgICAgICAgICAgICAgYWNjZXB0X2xldmVsID0gdG1wICogU01BTExfRElGRjsKKyAgICAgICAgICAgICAgICBlc2NhcGVfbGV2ZWwgPSB0bXAgKiBCSUdfRElGRjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhY2NlcHRfbGV2ZWwgPSBzdGFuZF9hY2NlcHRfbGV2ZWw7CisgICAgICAgICAgICAgICAgZXNjYXBlX2xldmVsID0gc3RhbmRfZXNjYXBlX2xldmVsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBibERpc3QgPSBpY3ZDbXBCbG9ja3NMMV84dV9DMSggYmxvY2tBLCBibG9ja0IsIGNtcFNpemUgKTsKKworICAgICAgICAgICAgaWYoIGJsRGlzdCA+IGFjY2VwdF9sZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICAgICAgaW50IFZlbFggPSAwOworICAgICAgICAgICAgICAgIGludCBWZWxZID0gMDsKKworICAgICAgICAgICAgICAgIC8qIHdhbGsgYXJvdW5kIGJhc2ljIGJsb2NrICovCisKKyAgICAgICAgICAgICAgICAvKiBjeWNsZSBmb3IgbmVpZ2hib3Job29kICovCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHNzX2NvdW50OyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHRtcERpc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IFkyID0gWTEgKyBvZmZZICsgc3Nba10ueTsKKyAgICAgICAgICAgICAgICAgICAgaW50IFgyID0gWDEgKyBvZmZYICsgc3Nba10ueDsKKworICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBicmVhayB1cHBlciBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIFkyIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGJyZWFrIGJvdHRvbSBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIFkyICsgQ3VycmVudEhlaWdodCA+PSBpbWdTaXplLmhlaWdodCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8qIGlmIHdlIGJyZWFrIGxlZnQgYm9yZGVyICovCisgICAgICAgICAgICAgICAgICAgIGlmKCBYMiA8IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBpZiB3ZSBicmVhayByaWdodCBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIFgyICsgQ3VycmVudFdpZHRoID49IGltZ1NpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCBtYWluX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Qk1fOHVfQzFSKCBpbWdCICsgWTIgKiBpbWdTdGVwICsgWDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTdGVwLCBibG9ja0IsIEN1clNpemUud2lkdGgsIEN1clNpemUgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgKigoaW50NjQgKikgKGJsb2NrQiArIHBhdGNoX29mcykpICY9IHBhdGNoX21hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGJsb2NrQiwgMCwgYnVmZmVyU2l6ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q29weUJNXzh1X0MxUiggaW1nQiArIFkxICogaW1nU3RlcCArIFgxLCBpbWdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tCLCBibG9ja1NpemUud2lkdGgsIEN1clNpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHRtcERpc3QgPSBpY3ZDbXBCbG9ja3NMMV84dV9DMSggYmxvY2tBLCBibG9ja0IsIGNtcFNpemUgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggdG1wRGlzdCA8IGFjY2VwdF9sZXZlbCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlbFggPSBzc1trXS54OworICAgICAgICAgICAgICAgICAgICAgICAgVmVsWSA9IHNzW2tdLnk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8qZm9yICovCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggdG1wRGlzdCA8IGJsRGlzdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsRGlzdCA9IHRtcERpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBWZWxYID0gc3Nba10ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlbFkgPSBzc1trXS55OworICAgICAgICAgICAgICAgICAgICAgICAgQ291bnREaXJlY3Rpb24gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIHRtcERpc3QgPT0gYmxEaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgVmVsWCArPSBzc1trXS54OworICAgICAgICAgICAgICAgICAgICAgICAgVmVsWSArPSBzc1trXS55OworICAgICAgICAgICAgICAgICAgICAgICAgQ291bnREaXJlY3Rpb24rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggYmxEaXN0ID4gZXNjYXBlX2xldmVsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFZlbFggPSBWZWxZID0gMDsKKyAgICAgICAgICAgICAgICAgICAgQ291bnREaXJlY3Rpb24gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggQ291bnREaXJlY3Rpb24gPiAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0ZW1wID0gQ291bnREaXJlY3Rpb24gPT0gMiA/IDEgPDwgMTUgOiAoKDEgPDwgMTYpIC8gQ291bnREaXJlY3Rpb24pOworCisgICAgICAgICAgICAgICAgICAgIFZlbG9jaXR5WCA9IFZlbFggKiB0ZW1wOworICAgICAgICAgICAgICAgICAgICBWZWxvY2l0eVkgPSBWZWxZICogdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVmVsb2NpdHlYID0gVmVsWCA8PCAxNjsKKyAgICAgICAgICAgICAgICAgICAgVmVsb2NpdHlZID0gVmVsWSA8PCAxNjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qaWYgKi8KKworICAgICAgICAgICAgaW50X3ZlbG9jaXR5WFtqXSA9IFZlbG9jaXR5WCArIChvZmZYIDw8IDE2KTsKKyAgICAgICAgICAgIGludF92ZWxvY2l0eVlbal0gPSBWZWxvY2l0eVkgKyAob2ZmWSA8PCAxNik7CisKKyAgICAgICAgICAgIFgxICs9IGJsb2NrU2l6ZS53aWR0aDsKKworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKmZvciAqLworICAgICAgICBpbnRfdmVsb2NpdHlYICs9IHZlbFN0ZXA7CisgICAgICAgIGludF92ZWxvY2l0eVkgKz0gdmVsU3RlcDsKKworICAgICAgICBpbWdBICs9IERvd25TdGVwOworICAgICAgICBZMSArPSBibG9ja1NpemUuaGVpZ2h0OworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZvciAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogQ29udmVydGluZyBmaXhlZCBwb2ludCB2ZWxvY2l0aWVzIHRvIGZsb2F0aW5nIHBvaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgeworICAgICAgICBmbG9hdCAqdmVseGYgPSB2ZWxvY2l0eVgsICp2ZWx5ZiA9IHZlbG9jaXR5WTsKKyAgICAgICAgaW50KiB2ZWx4ID0gKGludCopdmVsb2NpdHlYLCAqdmVseSA9IChpbnQqKXZlbG9jaXR5WTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgTnVtYmVyQmxvY2tzWTsgaSsrLCB2ZWx4ZiArPSB2ZWxTdGVwLCB2ZWx5ZiArPSB2ZWxTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWx4ICs9IHZlbFN0ZXAsIHZlbHkgKz0gdmVsU3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBOdW1iZXJCbG9ja3NYOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHZ4ID0gKGZsb2F0KXZlbHhbal0qYmFjaywgdnkgPSAoZmxvYXQpdmVseVtqXSpiYWNrOworICAgICAgICAgICAgICAgIHZlbHhmW2pdID0gdng7IHZlbHlmW2pdID0gdnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkZyZWUoICZzcyApOworICAgIGN2RnJlZSggJmJsb2NrQSApOworICAgIAorICAgIHJldHVybiBDVl9PSzsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjdkNhbGNPcHRpY2FsRmxvd0JNXzh1ICovCisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICBjdkNhbGNPcHRpY2FsRmxvd0JNCisvLyAgICBQdXJwb3NlOiBPcHRpY2FsIGZsb3cgaW1wbGVtZW50YXRpb24KKy8vICAgIENvbnRleHQ6IAorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgICAgICAgIHNyY0EsIHNyY0IgLSBzb3VyY2UgaW1hZ2UKKy8vICAgICAgICAgICAgIHZlbHgsIHZlbHkgLSBkZXN0aW5hdGlvbiBpbWFnZQorLy8gICAgUmV0dXJuczoKKy8vCisvLyAgICBOb3RlczoKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2Q2FsY09wdGljYWxGbG93Qk0oIGNvbnN0IHZvaWQqIHNyY2FyckEsIGNvbnN0IHZvaWQqIHNyY2FyckIsCisgICAgICAgICAgICAgICAgICAgICBDdlNpemUgYmxvY2tTaXplLCBDdlNpemUgc2hpZnRTaXplLAorICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIG1heFJhbmdlLCBpbnQgdXNlUHJldmlvdXMsCisgICAgICAgICAgICAgICAgICAgICB2b2lkKiB2ZWxhcnJ4LCB2b2lkKiB2ZWxhcnJ5ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FsY09wdGljYWxGbG93Qk0iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViQSwgKnNyY0EgPSAoQ3ZNYXQqKXNyY2FyckE7CisgICAgQ3ZNYXQgc3R1YkIsICpzcmNCID0gKEN2TWF0KilzcmNhcnJCOworICAgIEN2TWF0IHN0dWJ4LCAqdmVseCA9IChDdk1hdCopdmVsYXJyeDsKKyAgICBDdk1hdCBzdHVieSwgKnZlbHkgPSAoQ3ZNYXQqKXZlbGFycnk7CisKKyAgICBDVl9DQUxMKCBzcmNBID0gY3ZHZXRNYXQoIHNyY0EsICZzdHViQSApKTsKKyAgICBDVl9DQUxMKCBzcmNCID0gY3ZHZXRNYXQoIHNyY0IsICZzdHViQiApKTsKKworICAgIENWX0NBTEwoIHZlbHggPSBjdkdldE1hdCggdmVseCwgJnN0dWJ4ICkpOworICAgIENWX0NBTEwoIHZlbHkgPSBjdkdldE1hdCggdmVseSwgJnN0dWJ5ICkpOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyY0EsIHNyY0IgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJTb3VyY2UgaW1hZ2VzIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggdmVseCwgdmVseSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIkRlc3RpbmF0aW9uIGltYWdlcyBoYXZlIGRpZmZlcmVudCBmb3JtYXRzIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyY0EsIHNyY0IgKSB8fAorICAgICAgICAhQ1ZfQVJFX1NJWkVTX0VRKCB2ZWx4LCB2ZWx5ICkgfHwKKyAgICAgICAgKHVuc2lnbmVkKSh2ZWx4LT53aWR0aCpibG9ja1NpemUud2lkdGggLSBzcmNBLT53aWR0aCkgPj0gKHVuc2lnbmVkKWJsb2NrU2l6ZS53aWR0aCB8fAorICAgICAgICAodW5zaWduZWQpKHZlbHgtPmhlaWdodCpibG9ja1NpemUuaGVpZ2h0IC0gc3JjQS0+aGVpZ2h0KSA+PSAodW5zaWduZWQpYmxvY2tTaXplLmhlaWdodCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRSggc3JjQS0+dHlwZSApICE9IENWXzhVQzEgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoIHZlbHgtPnR5cGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlNvdXJjZSBpbWFnZXMgbXVzdCBoYXZlIDh1QzEgdHlwZSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBpbWFnZXMgbXVzdCBoYXZlIDMyZkMxIHR5cGUiICk7CisKKyAgICBpZiggc3JjQS0+c3RlcCAhPSBzcmNCLT5zdGVwIHx8IHZlbHgtPnN0ZXAgIT0gdmVseS0+c3RlcCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRTdGVwLCAidHdvIHNvdXJjZSBvciB0d28gZGVzdGluYXRpb24gaW1hZ2VzIGhhdmUgZGlmZmVyZW50IHN0ZXBzIiApOworCisgICAgSVBQSV9DQUxMKCBpY3ZDYWxjT3B0aWNhbEZsb3dCTV84dTMyZlIoICh1Y2hhciopc3JjQS0+ZGF0YS5wdHIsICh1Y2hhciopc3JjQi0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0EtPnN0ZXAsIGN2R2V0TWF0U2l6ZSggc3JjQSApLCBibG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0U2l6ZSwgbWF4UmFuZ2UsIHVzZVByZXZpb3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWx4LT5kYXRhLmZsLCB2ZWx5LT5kYXRhLmZsLCB2ZWx4LT5zdGVwICkpOworICAgIF9fRU5EX187Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZvcHRmbG93aHMuY3BwIGIvY3Yvc3JjL2N2b3B0Zmxvd2hzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2FhNmY5Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2b3B0Zmxvd2hzLmNwcApAQCAtMCwwICsxLDUzNSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKKyNkZWZpbmUgQ09OViggQSwgQiwgQykgICggKGZsb2F0KSggQSArICAoQjw8MSkgICsgQyApICkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBmbG9hdCB4eDsKKyAgICBmbG9hdCB4eTsKKyAgICBmbG9hdCB5eTsKKyAgICBmbG9hdCB4dDsKKyAgICBmbG9hdCB5dDsKKyAgICBmbG9hdCBhbHBoYTsgICAgICAgICAgICAgICAgLyogYWxwaGEgPSAxIC8gKCAxL2xhbWJkYSArIHh4ICsgeXkgKSAqLworfQoraWN2RGVyUHJvZHVjdEV4OworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkNhbGNPcHRpY2FsRmxvd0hTXzh1MzJmUiAoSG9ybiAmIFNjaHVuY2sgbWV0aG9kICkKKy8vICAgIFB1cnBvc2U6IGNhbGN1bGF0ZSBPcHRpY2FsIGZsb3cgZm9yIDIgaW1hZ2VzIHVzaW5nIEhvcm4gJiBTY2h1bmNrIGFsZ29yaXRobQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgIGltZ0EgICAgICAgICAgLSAgcG9pbnRlciB0byBmaXJzdCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nQiAgICAgICAgICAtICBwb2ludGVyIHRvIHNlY29uZCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nU3RlcCAgICAgICAtICB3aWR0aCBvZiBzaW5nbGUgcm93IG9mIHNvdXJjZSBpbWFnZXMgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgaW1nU2l6ZSAgICAgICAtICBzaXplIG9mIHRoZSBzb3VyY2UgaW1hZ2UgUk9JCisvLyAgICAgICAgICAgIHVzZVByZXZpb3VzICAgLSB1c2UgcHJldmlvdXMgKGlucHV0KSB2ZWxvY2l0eSBmaWVsZC4KKy8vICAgICAgICAgICAgdmVsb2NpdHlYICAgICAtIHBvaW50ZXIgdG8gaG9yaXpvbnRhbCBhbmQKKy8vICAgICAgICAgICAgdmVsb2NpdHlZICAgICAtIHZlcnRpY2FsIGNvbXBvbmVudHMgb2Ygb3B0aWNhbCBmbG93IFJPSQorLy8gICAgICAgICAgICB2ZWxTdGVwICAgICAgIC0gd2lkdGggb2Ygc2luZ2xlIHJvdyBvZiB2ZWxvY2l0eSBmcmFtZXMgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgbGFtYmRhICAgICAgICAtIExhZ3JhbmdpYW4gbXVsdGlwbGllcgorLy8gICAgICAgICAgICBjcml0ZXJpYSAgICAgIC0gY3JpdGVyaWEgb2YgdGVybWluYXRpb24gcHJvY2Vzc21heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMKKy8vCisvLyAgICBSZXR1cm5zOiBDVl9PSyAgICAgICAgIC0gYWxsIG9rCisvLyAgICAgICAgICAgICBDVl9PVVRPRk1FTV9FUlIgIC0gaW5zdWZmaWNpZW50IG1lbW9yeSBmb3IgZnVuY3Rpb24gd29yaworLy8gICAgICAgICAgICAgQ1ZfTlVMTFBUUl9FUlIgLSBpZiBvbmUgb2YgaW5wdXQgcG9pbnRlcnMgaXMgTlVMTAorLy8gICAgICAgICAgICAgQ1ZfQkFEU0laRV9FUlIgICAtIHdyb25nIGlucHV0IHNpemVzIGludGVycmVsYXRpb24KKy8vCisvLyAgICBOb3RlczogIDEuT3B0aWNhbCBmbG93IHRvIGJlIGNvbXB1dGVkIGZvciBldmVyeSBwaXhlbCBpbiBST0kKKy8vICAgICAgICAgICAgMi5Gb3IgY2FsY3VsYXRpbmcgc3BhdGlhbCBkZXJpdmF0aXZlcyB3ZSB1c2UgM3gzIFNvYmVsIG9wZXJhdG9yLgorLy8gICAgICAgICAgICAzLldlIHVzZSB0aGUgZm9sbG93aW5nIGJvcmRlciBtb2RlLgorLy8gICAgICAgICAgICAgIFRoZSBsYXN0IHJvdyBvciBjb2x1bW4gaXMgcmVwbGljYXRlZCBmb3IgdGhlIGJvcmRlcgorLy8gICAgICAgICAgICAgICggSVBMX0JPUkRFUl9SRVBMSUNBVEUgaW4gSVBMICkuCisvLworLy8KKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2Q2FsY09wdGljYWxGbG93SFNfOHUzMmZSKCB1Y2hhciogIGltZ0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgaW1nQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBpbWdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICB1c2VQcmV2aW91cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqICB2ZWxvY2l0eVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgdmVsb2NpdHlZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgIHZlbFN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICAgbGFtYmRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSApCit7CisgICAgLyogTG9vcHMgaW5kZXhlcyAqLworICAgIGludCBpLCBqLCBrLCBhZGRyZXNzOworCisgICAgLyogQnVmZmVycyBmb3IgU29iZWwgY2FsY3VsYXRpb25zICovCisgICAgZmxvYXQgKk1lbVhbMl07CisgICAgZmxvYXQgKk1lbVlbMl07CisKKyAgICBmbG9hdCBDb252WCwgQ29udlk7CisgICAgZmxvYXQgR3JhZFgsIEdyYWRZLCBHcmFkVDsKKworICAgIGludCBpbWFnZVdpZHRoID0gaW1nU2l6ZS53aWR0aDsKKyAgICBpbnQgaW1hZ2VIZWlnaHQgPSBpbWdTaXplLmhlaWdodDsKKworICAgIGludCBDb252TGluZTsKKyAgICBpbnQgTGFzdExpbmU7CisKKyAgICBpbnQgQnVmZmVyU2l6ZTsKKworICAgIGZsb2F0IElsYW1iZGEgPSAxIC8gbGFtYmRhOworICAgIGludCBpdGVyID0gMDsKKyAgICBpbnQgU3RvcDsKKworICAgIC8qIGJ1ZmZlcnMgZGVyaXZhdGl2ZXMgcHJvZHVjdCAqLworICAgIGljdkRlclByb2R1Y3RFeCAqSUk7CisKKyAgICBmbG9hdCAqVmVsQnVmWFsyXTsKKyAgICBmbG9hdCAqVmVsQnVmWVsyXTsKKworICAgIC8qIHZhcmlhYmxlcyBmb3Igc3RvcmluZyBudW1iZXIgb2YgZmlyc3QgcGl4ZWwgb2YgaW1hZ2UgbGluZSAqLworICAgIGludCBMaW5lMTsKKyAgICBpbnQgTGluZTI7CisgICAgaW50IExpbmUzOworCisgICAgaW50IHBpeE51bWJlcjsKKworICAgIC8qIGF1eGlsaWFyeSAqLworICAgIGludCBOb01lbSA9IDA7CisKKyAgICAvKiBDaGVja2luZyBiYWQgYXJndW1lbnRzICovCisgICAgaWYoIGltZ0EgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggaW1nQiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgaWYoIGltZ1NpemUud2lkdGggPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggaW1nU2l6ZS5oZWlnaHQgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggaW1nU2l6ZS53aWR0aCA+IGltZ1N0ZXAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBpZiggKHZlbFN0ZXAgJiAzKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgdmVsU3RlcCAvPSA0OworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQWxsb2NhdGluZyBtZW1vcnkgZm9yIGFsbCBidWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBNZW1YW2tdID0gKGZsb2F0ICopIGN2QWxsb2MoIChpbWdTaXplLmhlaWdodCkgKiBzaXplb2YoIGZsb2F0ICkpOworCisgICAgICAgIGlmKCBNZW1YW2tdID09IE5VTEwgKQorICAgICAgICAgICAgTm9NZW0gPSAxOworICAgICAgICBNZW1ZW2tdID0gKGZsb2F0ICopIGN2QWxsb2MoIChpbWdTaXplLndpZHRoKSAqIHNpemVvZiggZmxvYXQgKSk7CisKKyAgICAgICAgaWYoIE1lbVlba10gPT0gTlVMTCApCisgICAgICAgICAgICBOb01lbSA9IDE7CisKKyAgICAgICAgVmVsQnVmWFtrXSA9IChmbG9hdCAqKSBjdkFsbG9jKCBpbWFnZVdpZHRoICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICBpZiggVmVsQnVmWFtrXSA9PSBOVUxMICkKKyAgICAgICAgICAgIE5vTWVtID0gMTsKKyAgICAgICAgVmVsQnVmWVtrXSA9IChmbG9hdCAqKSBjdkFsbG9jKCBpbWFnZVdpZHRoICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICBpZiggVmVsQnVmWVtrXSA9PSBOVUxMICkKKyAgICAgICAgICAgIE5vTWVtID0gMTsKKyAgICB9CisKKyAgICBCdWZmZXJTaXplID0gaW1hZ2VIZWlnaHQgKiBpbWFnZVdpZHRoOworCisgICAgSUkgPSAoaWN2RGVyUHJvZHVjdEV4ICopIGN2QWxsb2MoIEJ1ZmZlclNpemUgKiBzaXplb2YoIGljdkRlclByb2R1Y3RFeCApKTsKKyAgICBpZiggKElJID09IE5VTEwpICkKKyAgICAgICAgTm9NZW0gPSAxOworCisgICAgaWYoIE5vTWVtICkKKyAgICB7CisgICAgICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggTWVtWFtrXSApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmTWVtWFtrXSApOworCisgICAgICAgICAgICBpZiggTWVtWVtrXSApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmTWVtWVtrXSApOworCisgICAgICAgICAgICBpZiggVmVsQnVmWFtrXSApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmVmVsQnVmWFtrXSApOworCisgICAgICAgICAgICBpZiggVmVsQnVmWVtrXSApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmVmVsQnVmWVtrXSApOworICAgICAgICB9CisgICAgICAgIGlmKCBJSSApCisgICAgICAgICAgICBjdkZyZWUoICZJSSApOworICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgIENhbGN1bGF0ZSBmaXJzdCBsaW5lIG9mIG1lbVggYW5kIG1lbVkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBNZW1ZWzBdWzBdID0gTWVtWVsxXVswXSA9IENPTlYoIGltZ0FbMF0sIGltZ0FbMF0sIGltZ0FbMV0gKTsKKyAgICBNZW1YWzBdWzBdID0gTWVtWFsxXVswXSA9IENPTlYoIGltZ0FbMF0sIGltZ0FbMF0sIGltZ0FbaW1nU3RlcF0gKTsKKworICAgIGZvciggaiA9IDE7IGogPCBpbWFnZVdpZHRoIC0gMTsgaisrICkKKyAgICB7CisgICAgICAgIE1lbVlbMF1bal0gPSBNZW1ZWzFdW2pdID0gQ09OViggaW1nQVtqIC0gMV0sIGltZ0Fbal0sIGltZ0FbaiArIDFdICk7CisgICAgfQorCisgICAgcGl4TnVtYmVyID0gaW1nU3RlcDsKKyAgICBmb3IoIGkgPSAxOyBpIDwgaW1hZ2VIZWlnaHQgLSAxOyBpKysgKQorICAgIHsKKyAgICAgICAgTWVtWFswXVtpXSA9IE1lbVhbMV1baV0gPSBDT05WKCBpbWdBW3BpeE51bWJlciAtIGltZ1N0ZXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0FbcGl4TnVtYmVyXSwgaW1nQVtwaXhOdW1iZXIgKyBpbWdTdGVwXSApOworICAgICAgICBwaXhOdW1iZXIgKz0gaW1nU3RlcDsKKyAgICB9CisKKyAgICBNZW1ZWzBdW2ltYWdlV2lkdGggLSAxXSA9CisgICAgICAgIE1lbVlbMV1baW1hZ2VXaWR0aCAtIDFdID0gQ09OViggaW1nQVtpbWFnZVdpZHRoIC0gMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nQVtpbWFnZVdpZHRoIC0gMV0sIGltZ0FbaW1hZ2VXaWR0aCAtIDFdICk7CisKKyAgICBNZW1YWzBdW2ltYWdlSGVpZ2h0IC0gMV0gPQorICAgICAgICBNZW1YWzFdW2ltYWdlSGVpZ2h0IC0gMV0gPSBDT05WKCBpbWdBW3BpeE51bWJlciAtIGltZ1N0ZXBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdBW3BpeE51bWJlcl0sIGltZ0FbcGl4TnVtYmVyXSApOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgYmVnaW4gc2NhbiBpbWFnZSwgY2FsYyBkZXJpdmF0aXZlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIENvbnZMaW5lID0gMDsKKyAgICBMaW5lMiA9IC1pbWdTdGVwOworICAgIGFkZHJlc3MgPSAwOworICAgIExhc3RMaW5lID0gaW1nU3RlcCAqIChpbWFnZUhlaWdodCAtIDEpOworICAgIHdoaWxlKCBDb252TGluZSA8IGltYWdlSGVpZ2h0ICkKKyAgICB7CisgICAgICAgIC8qSGVyZSB3ZSBjYWxjdWxhdGUgZGVyaXZhdGl2ZXMgZm9yIGxpbmUgb2YgaW1hZ2UgKi8KKyAgICAgICAgaW50IG1lbVlsaW5lID0gKENvbnZMaW5lICsgMSkgJiAxOworCisgICAgICAgIExpbmUyICs9IGltZ1N0ZXA7CisgICAgICAgIExpbmUxID0gTGluZTIgLSAoKExpbmUyID09IDApID8gMCA6IGltZ1N0ZXApOworICAgICAgICBMaW5lMyA9IExpbmUyICsgKChMaW5lMiA9PSBMYXN0TGluZSkgPyAwIDogaW1nU3RlcCk7CisKKyAgICAgICAgLyogUHJvY2VzcyBmaXJzdCBwaXhlbCAqLworICAgICAgICBDb252WCA9IENPTlYoIGltZ0FbTGluZTEgKyAxXSwgaW1nQVtMaW5lMiArIDFdLCBpbWdBW0xpbmUzICsgMV0gKTsKKyAgICAgICAgQ29udlkgPSBDT05WKCBpbWdBW0xpbmUzXSwgaW1nQVtMaW5lM10sIGltZ0FbTGluZTMgKyAxXSApOworCisgICAgICAgIEdyYWRZID0gKENvbnZZIC0gTWVtWVttZW1ZbGluZV1bMF0pICogMC4xMjVmOworICAgICAgICBHcmFkWCA9IChDb252WCAtIE1lbVhbMV1bQ29udkxpbmVdKSAqIDAuMTI1ZjsKKworICAgICAgICBNZW1ZW21lbVlsaW5lXVswXSA9IENvbnZZOworICAgICAgICBNZW1YWzFdW0NvbnZMaW5lXSA9IENvbnZYOworCisgICAgICAgIEdyYWRUID0gKGZsb2F0KSAoaW1nQltMaW5lMl0gLSBpbWdBW0xpbmUyXSk7CisKKyAgICAgICAgSUlbYWRkcmVzc10ueHggPSBHcmFkWCAqIEdyYWRYOworICAgICAgICBJSVthZGRyZXNzXS54eSA9IEdyYWRYICogR3JhZFk7CisgICAgICAgIElJW2FkZHJlc3NdLnl5ID0gR3JhZFkgKiBHcmFkWTsKKyAgICAgICAgSUlbYWRkcmVzc10ueHQgPSBHcmFkWCAqIEdyYWRUOworICAgICAgICBJSVthZGRyZXNzXS55dCA9IEdyYWRZICogR3JhZFQ7CisKKyAgICAgICAgSUlbYWRkcmVzc10uYWxwaGEgPSAxIC8gKElsYW1iZGEgKyBJSVthZGRyZXNzXS54eCArIElJW2FkZHJlc3NdLnl5KTsKKyAgICAgICAgYWRkcmVzcysrOworCisgICAgICAgIC8qIFByb2Nlc3MgbWlkZGxlIG9mIGxpbmUgKi8KKyAgICAgICAgZm9yKCBqID0gMTsgaiA8IGltYWdlV2lkdGggLSAxOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDb252WCA9IENPTlYoIGltZ0FbTGluZTEgKyBqICsgMV0sIGltZ0FbTGluZTIgKyBqICsgMV0sIGltZ0FbTGluZTMgKyBqICsgMV0gKTsKKyAgICAgICAgICAgIENvbnZZID0gQ09OViggaW1nQVtMaW5lMyArIGogLSAxXSwgaW1nQVtMaW5lMyArIGpdLCBpbWdBW0xpbmUzICsgaiArIDFdICk7CisKKyAgICAgICAgICAgIEdyYWRZID0gKENvbnZZIC0gTWVtWVttZW1ZbGluZV1bal0pICogMC4xMjVmOworICAgICAgICAgICAgR3JhZFggPSAoQ29udlggLSBNZW1YWyhqIC0gMSkgJiAxXVtDb252TGluZV0pICogMC4xMjVmOworCisgICAgICAgICAgICBNZW1ZW21lbVlsaW5lXVtqXSA9IENvbnZZOworICAgICAgICAgICAgTWVtWFsoaiAtIDEpICYgMV1bQ29udkxpbmVdID0gQ29udlg7CisKKyAgICAgICAgICAgIEdyYWRUID0gKGZsb2F0KSAoaW1nQltMaW5lMiArIGpdIC0gaW1nQVtMaW5lMiArIGpdKTsKKworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHggPSBHcmFkWCAqIEdyYWRYOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHkgPSBHcmFkWCAqIEdyYWRZOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueXkgPSBHcmFkWSAqIEdyYWRZOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHQgPSBHcmFkWCAqIEdyYWRUOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueXQgPSBHcmFkWSAqIEdyYWRUOworCisgICAgICAgICAgICBJSVthZGRyZXNzXS5hbHBoYSA9IDEgLyAoSWxhbWJkYSArIElJW2FkZHJlc3NdLnh4ICsgSUlbYWRkcmVzc10ueXkpOworICAgICAgICAgICAgYWRkcmVzcysrOworICAgICAgICB9CisgICAgICAgIC8qIFByb2Nlc3MgbGFzdCBwaXhlbCBvZiBsaW5lICovCisgICAgICAgIENvbnZYID0gQ09OViggaW1nQVtMaW5lMSArIGltYWdlV2lkdGggLSAxXSwgaW1nQVtMaW5lMiArIGltYWdlV2lkdGggLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICBpbWdBW0xpbmUzICsgaW1hZ2VXaWR0aCAtIDFdICk7CisKKyAgICAgICAgQ29udlkgPSBDT05WKCBpbWdBW0xpbmUzICsgaW1hZ2VXaWR0aCAtIDJdLCBpbWdBW0xpbmUzICsgaW1hZ2VXaWR0aCAtIDFdLAorICAgICAgICAgICAgICAgICAgICAgIGltZ0FbTGluZTMgKyBpbWFnZVdpZHRoIC0gMV0gKTsKKworCisgICAgICAgIEdyYWRZID0gKENvbnZZIC0gTWVtWVttZW1ZbGluZV1baW1hZ2VXaWR0aCAtIDFdKSAqIDAuMTI1ZjsKKyAgICAgICAgR3JhZFggPSAoQ29udlggLSBNZW1YWyhpbWFnZVdpZHRoIC0gMikgJiAxXVtDb252TGluZV0pICogMC4xMjVmOworCisgICAgICAgIE1lbVlbbWVtWWxpbmVdW2ltYWdlV2lkdGggLSAxXSA9IENvbnZZOworCisgICAgICAgIEdyYWRUID0gKGZsb2F0KSAoaW1nQltMaW5lMiArIGltYWdlV2lkdGggLSAxXSAtIGltZ0FbTGluZTIgKyBpbWFnZVdpZHRoIC0gMV0pOworCisgICAgICAgIElJW2FkZHJlc3NdLnh4ID0gR3JhZFggKiBHcmFkWDsKKyAgICAgICAgSUlbYWRkcmVzc10ueHkgPSBHcmFkWCAqIEdyYWRZOworICAgICAgICBJSVthZGRyZXNzXS55eSA9IEdyYWRZICogR3JhZFk7CisgICAgICAgIElJW2FkZHJlc3NdLnh0ID0gR3JhZFggKiBHcmFkVDsKKyAgICAgICAgSUlbYWRkcmVzc10ueXQgPSBHcmFkWSAqIEdyYWRUOworCisgICAgICAgIElJW2FkZHJlc3NdLmFscGhhID0gMSAvIChJbGFtYmRhICsgSUlbYWRkcmVzc10ueHggKyBJSVthZGRyZXNzXS55eSk7CisgICAgICAgIGFkZHJlc3MrKzsKKworICAgICAgICBDb252TGluZSsrOworICAgIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgIFByZXBhcmUgaW5pdGlhbCBhcHByb3hpbWF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiggIXVzZVByZXZpb3VzICkKKyAgICB7CisgICAgICAgIGZsb2F0ICp2eCA9IHZlbG9jaXR5WDsKKyAgICAgICAgZmxvYXQgKnZ5ID0gdmVsb2NpdHlZOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpbWFnZUhlaWdodDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCB2eCwgMCwgaW1hZ2VXaWR0aCAqIHNpemVvZiggZmxvYXQgKSk7CisgICAgICAgICAgICBtZW1zZXQoIHZ5LCAwLCBpbWFnZVdpZHRoICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICAgICAgdnggKz0gdmVsU3RlcDsKKyAgICAgICAgICAgIHZ5ICs9IHZlbFN0ZXA7CisgICAgICAgIH0KKyAgICB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICBQZXJmb3JtIGl0ZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaXRlciA9IDA7CisgICAgU3RvcCA9IDA7CisgICAgTGFzdExpbmUgPSB2ZWxTdGVwICogKGltYWdlSGVpZ2h0IC0gMSk7CisgICAgd2hpbGUoICFTdG9wICkKKyAgICB7CisgICAgICAgIGZsb2F0IEVwcyA9IDA7CisgICAgICAgIGFkZHJlc3MgPSAwOworCisgICAgICAgIGl0ZXIrKzsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgYmVnaW4gc2NhbiB2ZWxvY2l0eSBhbmQgdXBkYXRlIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTGluZTIgPSAtdmVsU3RlcDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGltYWdlSGVpZ2h0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBIZXJlIGF2ZXJhZ2UgdmVsb2NpdHkgKi8KKworICAgICAgICAgICAgZmxvYXQgYXZlcmFnZVg7CisgICAgICAgICAgICBmbG9hdCBhdmVyYWdlWTsKKyAgICAgICAgICAgIGZsb2F0IHRtcDsKKworICAgICAgICAgICAgTGluZTIgKz0gdmVsU3RlcDsKKyAgICAgICAgICAgIExpbmUxID0gTGluZTIgLSAoKExpbmUyID09IDApID8gMCA6IHZlbFN0ZXApOworICAgICAgICAgICAgTGluZTMgPSBMaW5lMiArICgoTGluZTIgPT0gTGFzdExpbmUpID8gMCA6IHZlbFN0ZXApOworICAgICAgICAgICAgLyogUHJvY2VzcyBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgYXZlcmFnZVggPSAodmVsb2NpdHlYW0xpbmUyXSArCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVhbTGluZTIgKyAxXSArIHZlbG9jaXR5WFtMaW5lMV0gKyB2ZWxvY2l0eVhbTGluZTNdKSAvIDQ7CisKKyAgICAgICAgICAgIGF2ZXJhZ2VZID0gKHZlbG9jaXR5WVtMaW5lMl0gKworICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZW0xpbmUyICsgMV0gKyB2ZWxvY2l0eVlbTGluZTFdICsgdmVsb2NpdHlZW0xpbmUzXSkgLyA0OworCisgICAgICAgICAgICBWZWxCdWZYW2kgJiAxXVswXSA9IGF2ZXJhZ2VYIC0KKyAgICAgICAgICAgICAgICAoSUlbYWRkcmVzc10ueHggKiBhdmVyYWdlWCArCisgICAgICAgICAgICAgICAgIElJW2FkZHJlc3NdLnh5ICogYXZlcmFnZVkgKyBJSVthZGRyZXNzXS54dCkgKiBJSVthZGRyZXNzXS5hbHBoYTsKKworICAgICAgICAgICAgVmVsQnVmWVtpICYgMV1bMF0gPSBhdmVyYWdlWSAtCisgICAgICAgICAgICAgICAgKElJW2FkZHJlc3NdLnh5ICogYXZlcmFnZVggKworICAgICAgICAgICAgICAgICBJSVthZGRyZXNzXS55eSAqIGF2ZXJhZ2VZICsgSUlbYWRkcmVzc10ueXQpICogSUlbYWRkcmVzc10uYWxwaGE7CisKKyAgICAgICAgICAgIC8qIHVwZGF0ZSBFcHNpbG9uICovCisgICAgICAgICAgICBpZiggY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0VQUyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wID0gKGZsb2F0KWZhYnModmVsb2NpdHlYW0xpbmUyXSAtIFZlbEJ1ZlhbaSAmIDFdWzBdKTsKKyAgICAgICAgICAgICAgICBFcHMgPSBNQVgoIHRtcCwgRXBzICk7CisgICAgICAgICAgICAgICAgdG1wID0gKGZsb2F0KWZhYnModmVsb2NpdHlZW0xpbmUyXSAtIFZlbEJ1ZllbaSAmIDFdWzBdKTsKKyAgICAgICAgICAgICAgICBFcHMgPSBNQVgoIHRtcCwgRXBzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyZXNzKys7CisgICAgICAgICAgICAvKiBQcm9jZXNzIG1pZGRsZSBvZiBsaW5lICovCisgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDwgaW1hZ2VXaWR0aCAtIDE7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXZlcmFnZVggPSAodmVsb2NpdHlYW0xpbmUyICsgaiAtIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVhbTGluZTIgKyBqICsgMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WFtMaW5lMSArIGpdICsgdmVsb2NpdHlYW0xpbmUzICsgal0pIC8gNDsKKyAgICAgICAgICAgICAgICBhdmVyYWdlWSA9ICh2ZWxvY2l0eVlbTGluZTIgKyBqIC0gMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WVtMaW5lMiArIGogKyAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZW0xpbmUxICsgal0gKyB2ZWxvY2l0eVlbTGluZTMgKyBqXSkgLyA0OworCisgICAgICAgICAgICAgICAgVmVsQnVmWFtpICYgMV1bal0gPSBhdmVyYWdlWCAtCisgICAgICAgICAgICAgICAgICAgIChJSVthZGRyZXNzXS54eCAqIGF2ZXJhZ2VYICsKKyAgICAgICAgICAgICAgICAgICAgIElJW2FkZHJlc3NdLnh5ICogYXZlcmFnZVkgKyBJSVthZGRyZXNzXS54dCkgKiBJSVthZGRyZXNzXS5hbHBoYTsKKworICAgICAgICAgICAgICAgIFZlbEJ1ZllbaSAmIDFdW2pdID0gYXZlcmFnZVkgLQorICAgICAgICAgICAgICAgICAgICAoSUlbYWRkcmVzc10ueHkgKiBhdmVyYWdlWCArCisgICAgICAgICAgICAgICAgICAgICBJSVthZGRyZXNzXS55eSAqIGF2ZXJhZ2VZICsgSUlbYWRkcmVzc10ueXQpICogSUlbYWRkcmVzc10uYWxwaGE7CisgICAgICAgICAgICAgICAgLyogdXBkYXRlIEVwc2lsb24gKi8KKyAgICAgICAgICAgICAgICBpZiggY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0VQUyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSAoZmxvYXQpZmFicyh2ZWxvY2l0eVhbTGluZTIgKyBqXSAtIFZlbEJ1ZlhbaSAmIDFdW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgRXBzID0gTUFYKCB0bXAsIEVwcyApOworICAgICAgICAgICAgICAgICAgICB0bXAgPSAoZmxvYXQpZmFicyh2ZWxvY2l0eVlbTGluZTIgKyBqXSAtIFZlbEJ1ZllbaSAmIDFdW2pdKTsKKyAgICAgICAgICAgICAgICAgICAgRXBzID0gTUFYKCB0bXAsIEVwcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyZXNzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBQcm9jZXNzIGxhc3QgcGl4ZWwgb2YgbGluZSAqLworICAgICAgICAgICAgYXZlcmFnZVggPSAodmVsb2NpdHlYW0xpbmUyICsgaW1hZ2VXaWR0aCAtIDJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WFtMaW5lMiArIGltYWdlV2lkdGggLSAxXSArCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVhbTGluZTEgKyBpbWFnZVdpZHRoIC0gMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlYW0xpbmUzICsgaW1hZ2VXaWR0aCAtIDFdKSAvIDQ7CisKKyAgICAgICAgICAgIGF2ZXJhZ2VZID0gKHZlbG9jaXR5WVtMaW5lMiArIGltYWdlV2lkdGggLSAyXSArCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVlbTGluZTIgKyBpbWFnZVdpZHRoIC0gMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZW0xpbmUxICsgaW1hZ2VXaWR0aCAtIDFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WVtMaW5lMyArIGltYWdlV2lkdGggLSAxXSkgLyA0OworCisKKyAgICAgICAgICAgIFZlbEJ1ZlhbaSAmIDFdW2ltYWdlV2lkdGggLSAxXSA9IGF2ZXJhZ2VYIC0KKyAgICAgICAgICAgICAgICAoSUlbYWRkcmVzc10ueHggKiBhdmVyYWdlWCArCisgICAgICAgICAgICAgICAgIElJW2FkZHJlc3NdLnh5ICogYXZlcmFnZVkgKyBJSVthZGRyZXNzXS54dCkgKiBJSVthZGRyZXNzXS5hbHBoYTsKKworICAgICAgICAgICAgVmVsQnVmWVtpICYgMV1baW1hZ2VXaWR0aCAtIDFdID0gYXZlcmFnZVkgLQorICAgICAgICAgICAgICAgIChJSVthZGRyZXNzXS54eSAqIGF2ZXJhZ2VYICsKKyAgICAgICAgICAgICAgICAgSUlbYWRkcmVzc10ueXkgKiBhdmVyYWdlWSArIElJW2FkZHJlc3NdLnl0KSAqIElJW2FkZHJlc3NdLmFscGhhOworCisgICAgICAgICAgICAvKiB1cGRhdGUgRXBzaWxvbiAqLworICAgICAgICAgICAgaWYoIGNyaXRlcmlhLnR5cGUgJiBDVl9URVJNQ1JJVF9FUFMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcCA9IChmbG9hdClmYWJzKHZlbG9jaXR5WFtMaW5lMiArIGltYWdlV2lkdGggLSAxXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVsQnVmWFtpICYgMV1baW1hZ2VXaWR0aCAtIDFdKTsKKyAgICAgICAgICAgICAgICBFcHMgPSBNQVgoIHRtcCwgRXBzICk7CisgICAgICAgICAgICAgICAgdG1wID0gKGZsb2F0KWZhYnModmVsb2NpdHlZW0xpbmUyICsgaW1hZ2VXaWR0aCAtIDFdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWxCdWZZW2kgJiAxXVtpbWFnZVdpZHRoIC0gMV0pOworICAgICAgICAgICAgICAgIEVwcyA9IE1BWCggdG1wLCBFcHMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJlc3MrKzsKKworICAgICAgICAgICAgLyogc3RvcmUgbmV3IHZlbG9jaXR5IGZyb20gb2xkIGJ1ZmZlciB0byB2ZWxvY2l0eSBmcmFtZSAqLworICAgICAgICAgICAgaWYoIGkgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoICZ2ZWxvY2l0eVhbTGluZTFdLCBWZWxCdWZYWyhpIC0gMSkgJiAxXSwgaW1hZ2VXaWR0aCAqIHNpemVvZiggZmxvYXQgKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCAmdmVsb2NpdHlZW0xpbmUxXSwgVmVsQnVmWVsoaSAtIDEpICYgMV0sIGltYWdlV2lkdGggKiBzaXplb2YoIGZsb2F0ICkpOworICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKmZvciAqLworICAgICAgICAvKiBzdG9yZSBuZXcgdmVsb2NpdHkgZnJvbSBvbGQgYnVmZmVyIHRvIHZlbG9jaXR5IGZyYW1lICovCisgICAgICAgIG1lbWNweSggJnZlbG9jaXR5WFtpbWFnZVdpZHRoICogKGltYWdlSGVpZ2h0IC0gMSldLAorICAgICAgICAgICAgICAgIFZlbEJ1ZlhbKGltYWdlSGVpZ2h0IC0gMSkgJiAxXSwgaW1hZ2VXaWR0aCAqIHNpemVvZiggZmxvYXQgKSk7CisKKyAgICAgICAgbWVtY3B5KCAmdmVsb2NpdHlZW2ltYWdlV2lkdGggKiAoaW1hZ2VIZWlnaHQgLSAxKV0sCisgICAgICAgICAgICAgICAgVmVsQnVmWVsoaW1hZ2VIZWlnaHQgLSAxKSAmIDFdLCBpbWFnZVdpZHRoICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICBpZiggKGNyaXRlcmlhLnR5cGUgJiBDVl9URVJNQ1JJVF9JVEVSKSAmJiAoaXRlciA9PSBjcml0ZXJpYS5tYXhfaXRlcikgKQorICAgICAgICAgICAgU3RvcCA9IDE7CisgICAgICAgIGlmKCAoY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0VQUykgJiYgKEVwcyA8IGNyaXRlcmlhLmVwc2lsb24pICkKKyAgICAgICAgICAgIFN0b3AgPSAxOworICAgIH0KKyAgICAvKiBGcmVlIG1lbW9yeSAqLworICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmTWVtWFtrXSApOworICAgICAgICBjdkZyZWUoICZNZW1ZW2tdICk7CisgICAgICAgIGN2RnJlZSggJlZlbEJ1Zlhba10gKTsKKyAgICAgICAgY3ZGcmVlKCAmVmVsQnVmWVtrXSApOworICAgIH0KKyAgICBjdkZyZWUoICZJSSApOworCisgICAgcmV0dXJuIENWX09LOworfSAvKmljdkNhbGNPcHRpY2FsRmxvd0hTXzh1MzJmUiovCisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICBjdkNhbGNPcHRpY2FsRmxvd0hTCisvLyAgICBQdXJwb3NlOiBPcHRpY2FsIGZsb3cgaW1wbGVtZW50YXRpb24KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICAgICAgICAgc3JjQSwgc3JjQiAtIHNvdXJjZSBpbWFnZQorLy8gICAgICAgICAgICAgdmVseCwgdmVseSAtIGRlc3RpbmF0aW9uIGltYWdlCisvLyAgICBSZXR1cm5zOgorLy8KKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgdm9pZAorY3ZDYWxjT3B0aWNhbEZsb3dIUyggY29uc3Qgdm9pZCogc3JjYXJyQSwgY29uc3Qgdm9pZCogc3JjYXJyQiwgaW50IHVzZVByZXZpb3VzLAorICAgICAgICAgICAgICAgICAgICAgdm9pZCogdmVsYXJyeCwgdm9pZCogdmVsYXJyeSwKKyAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsYW1iZGEsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FsY09wdGljYWxGbG93SFMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViQSwgKnNyY0EgPSAoQ3ZNYXQqKXNyY2FyckE7CisgICAgQ3ZNYXQgc3R1YkIsICpzcmNCID0gKEN2TWF0KilzcmNhcnJCOworICAgIEN2TWF0IHN0dWJ4LCAqdmVseCA9IChDdk1hdCopdmVsYXJyeDsKKyAgICBDdk1hdCBzdHVieSwgKnZlbHkgPSAoQ3ZNYXQqKXZlbGFycnk7CisKKyAgICBDVl9DQUxMKCBzcmNBID0gY3ZHZXRNYXQoIHNyY0EsICZzdHViQSApKTsKKyAgICBDVl9DQUxMKCBzcmNCID0gY3ZHZXRNYXQoIHNyY0IsICZzdHViQiApKTsKKworICAgIENWX0NBTEwoIHZlbHggPSBjdkdldE1hdCggdmVseCwgJnN0dWJ4ICkpOworICAgIENWX0NBTEwoIHZlbHkgPSBjdkdldE1hdCggdmVseSwgJnN0dWJ5ICkpOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyY0EsIHNyY0IgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICJTb3VyY2UgaW1hZ2VzIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggdmVseCwgdmVseSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIkRlc3RpbmF0aW9uIGltYWdlcyBoYXZlIGRpZmZlcmVudCBmb3JtYXRzIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyY0EsIHNyY0IgKSB8fAorICAgICAgICAhQ1ZfQVJFX1NJWkVTX0VRKCB2ZWx4LCB2ZWx5ICkgfHwKKyAgICAgICAgIUNWX0FSRV9TSVpFU19FUSggc3JjQSwgdmVseCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIHNyY0EtPnR5cGUgKSAhPSBDVl84VUMxIHx8CisgICAgICAgIENWX01BVF9UWVBFKCB2ZWx4LT50eXBlICkgIT0gQ1ZfMzJGQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJTb3VyY2UgaW1hZ2VzIG11c3QgaGF2ZSA4dUMxIHR5cGUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gaW1hZ2VzIG11c3QgaGF2ZSAzMmZDMSB0eXBlIiApOworCisgICAgaWYoIHNyY0EtPnN0ZXAgIT0gc3JjQi0+c3RlcCB8fCB2ZWx4LT5zdGVwICE9IHZlbHktPnN0ZXAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkU3RlcCwgInNvdXJjZSBhbmQgZGVzdGluYXRpb24gaW1hZ2VzIGhhdmUgZGlmZmVyZW50IHN0ZXAiICk7CisKKyAgICBJUFBJX0NBTEwoIGljdkNhbGNPcHRpY2FsRmxvd0hTXzh1MzJmUiggKHVjaGFyKilzcmNBLT5kYXRhLnB0ciwgKHVjaGFyKilzcmNCLT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjQS0+c3RlcCwgY3ZHZXRNYXRTaXplKCBzcmNBICksIHVzZVByZXZpb3VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWx4LT5kYXRhLmZsLCB2ZWx5LT5kYXRhLmZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWx4LT5zdGVwLCAoZmxvYXQpbGFtYmRhLCBjcml0ZXJpYSApKTsKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdm9wdGZsb3dsay5jcHAgYi9jdi9zcmMvY3ZvcHRmbG93bGsuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NWJmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZvcHRmbG93bGsuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBmbG9hdCB4eDsKKyAgICBmbG9hdCB4eTsKKyAgICBmbG9hdCB5eTsKKyAgICBmbG9hdCB4dDsKKyAgICBmbG9hdCB5dDsKK30KK2ljdkRlclByb2R1Y3Q7CisKKworI2RlZmluZSBDT05WKCBBLCBCLCBDKSAgKChmbG9hdCkoIEEgKyAgKEI8PDEpICArIEMgKSkKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogaWN2Q2FsY09wdGljYWxGbG93TEtfOHUzMmZSICggTHVjYXMgJiBLYW5hZGUgbWV0aG9kICkKKy8vICAgIFB1cnBvc2U6IGNhbGN1bGF0ZSBPcHRpY2FsIGZsb3cgZm9yIDIgaW1hZ2VzIHVzaW5nIEx1Y2FzICYgS2FuYWRlIGFsZ29yaXRobQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgIGltZ0EsICAgICAgICAgLy8gcG9pbnRlciB0byBmaXJzdCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nQiwgICAgICAgICAvLyBwb2ludGVyIHRvIHNlY29uZCBmcmFtZSBST0kKKy8vICAgICAgICAgICAgaW1nU3RlcCwgICAgICAvLyB3aWR0aCBvZiBzaW5nbGUgcm93IG9mIHNvdXJjZSBpbWFnZXMgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgaW1nU2l6ZSwgICAgICAvLyBzaXplIG9mIHRoZSBzb3VyY2UgaW1hZ2UgUk9JCisvLyAgICAgICAgICAgIHdpblNpemUsICAgICAgLy8gc2l6ZSBvZiB0aGUgYXZlcmFnaW5nIHdpbmRvdyB1c2VkIGZvciBncm91cGluZworLy8gICAgICAgICAgICB2ZWxvY2l0eVgsICAgIC8vIHBvaW50ZXIgdG8gaG9yaXpvbnRhbCBhbmQKKy8vICAgICAgICAgICAgdmVsb2NpdHlZLCAgICAvLyB2ZXJ0aWNhbCBjb21wb25lbnRzIG9mIG9wdGljYWwgZmxvdyBST0kKKy8vICAgICAgICAgICAgdmVsU3RlcCAgICAgICAvLyB3aWR0aCBvZiBzaW5nbGUgcm93IG9mIHZlbG9jaXR5IGZyYW1lcyBpbiBieXRlcworLy8KKy8vICAgIFJldHVybnM6IENWX09LICAgICAgICAgLSBhbGwgb2sKKy8vICAgICAgICAgICAgIENWX09VVE9GTUVNX0VSUiAgLSBpbnN1ZmZpY2llbnQgbWVtb3J5IGZvciBmdW5jdGlvbiB3b3JrCisvLyAgICAgICAgICAgICBDVl9OVUxMUFRSX0VSUiAtIGlmIG9uZSBvZiBpbnB1dCBwb2ludGVycyBpcyBOVUxMCisvLyAgICAgICAgICAgICBDVl9CQURTSVpFX0VSUiAgIC0gd3JvbmcgaW5wdXQgc2l6ZXMgaW50ZXJyZWxhdGlvbgorLy8KKy8vICAgIE5vdGVzOiAgMS5PcHRpY2FsIGZsb3cgdG8gYmUgY29tcHV0ZWQgZm9yIGV2ZXJ5IHBpeGVsIGluIFJPSQorLy8gICAgICAgICAgICAyLkZvciBjYWxjdWxhdGluZyBzcGF0aWFsIGRlcml2YXRpdmVzIHdlIHVzZSAzeDMgU29iZWwgb3BlcmF0b3IuCisvLyAgICAgICAgICAgIDMuV2UgdXNlIHRoZSBmb2xsb3dpbmcgYm9yZGVyIG1vZGUuCisvLyAgICAgICAgICAgICAgVGhlIGxhc3Qgcm93IG9yIGNvbHVtbiBpcyByZXBsaWNhdGVkIGZvciB0aGUgYm9yZGVyCisvLyAgICAgICAgICAgICAgKCBJUExfQk9SREVSX1JFUExJQ0FURSBpbiBJUEwgKS4KKy8vCisvLworLy9GKi8KK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZDYWxjT3B0aWNhbEZsb3dMS184dTMyZlIoIHVjaGFyICogaW1nQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKiBpbWdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW1nU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSB3aW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdmVsb2NpdHlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqdmVsb2NpdHlZLCBpbnQgdmVsU3RlcCApCit7CisgICAgLyogTG9vcHMgaW5kZXhlcyAqLworICAgIGludCBpLCBqLCBrOworCisgICAgLyogR2F1c3NpYW4gc2VwYXJhYmxlIGtlcm5lbHMgKi8KKyAgICBmbG9hdCBHYXVzc1hbMTZdOworICAgIGZsb2F0IEdhdXNzWVsxNl07CisgICAgZmxvYXQgKktlclg7CisgICAgZmxvYXQgKktlclk7CisKKyAgICAvKiBCdWZmZXJzIGZvciBTb2JlbCBjYWxjdWxhdGlvbnMgKi8KKyAgICBmbG9hdCAqTWVtWFsyXTsKKyAgICBmbG9hdCAqTWVtWVsyXTsKKworICAgIGZsb2F0IENvbnZYLCBDb252WTsKKyAgICBmbG9hdCBHcmFkWCwgR3JhZFksIEdyYWRUOworCisgICAgaW50IHdpbldpZHRoID0gd2luU2l6ZS53aWR0aDsKKyAgICBpbnQgd2luSGVpZ2h0ID0gd2luU2l6ZS5oZWlnaHQ7CisKKyAgICBpbnQgaW1hZ2VXaWR0aCA9IGltZ1NpemUud2lkdGg7CisgICAgaW50IGltYWdlSGVpZ2h0ID0gaW1nU2l6ZS5oZWlnaHQ7CisKKyAgICBpbnQgSG9yUmFkaXVzID0gKHdpbldpZHRoIC0gMSkgPj4gMTsKKyAgICBpbnQgVmVyUmFkaXVzID0gKHdpbkhlaWdodCAtIDEpID4+IDE7CisKKyAgICBpbnQgUGl4ZWxMaW5lOworICAgIGludCBDb252TGluZTsKKworICAgIGludCBCdWZmZXJBZGRyZXNzOworCisgICAgaW50IEJ1ZmZlckhlaWdodCA9IDA7CisgICAgaW50IEJ1ZmZlcldpZHRoOworICAgIGludCBCdWZmZXJTaXplOworCisgICAgLyogYnVmZmVycyBkZXJpdmF0aXZlcyBwcm9kdWN0ICovCisgICAgaWN2RGVyUHJvZHVjdCAqSUk7CisKKyAgICAvKiBidWZmZXJzIGZvciBnYXVzc2lhbiBob3Jpc29udGFsIGNvbnZvbHV0aW9uICovCisgICAgaWN2RGVyUHJvZHVjdCAqV0lJOworCisgICAgLyogdmFyaWFibGVzIGZvciBzdG9yaW5nIG51bWJlciBvZiBmaXJzdCBwaXhlbCBvZiBpbWFnZSBsaW5lICovCisgICAgaW50IExpbmUxOworICAgIGludCBMaW5lMjsKKyAgICBpbnQgTGluZTM7CisKKyAgICAvKiB3ZSBtdXN0IGhhdmUgMioyIGxpbmVhciBzeXN0ZW0gY29lZmZzCisgICAgICAgfCBBMUIyICBCMSB8ICB7dX0gICB7QzF9ICAgezB9CisgICAgICAgfCAgICAgICAgICB8ICB7IH0gKyB7ICB9ID0geyB9CisgICAgICAgfCBBMiAgQTFCMiB8ICB7dn0gICB7QzJ9ICAgezB9CisgICAgICovCisgICAgZmxvYXQgQTFCMiwgQTIsIEIxLCBDMSwgQzI7CisKKyAgICBpbnQgcGl4TnVtYmVyOworCisgICAgLyogYXV4aWxpYXJ5ICovCisgICAgaW50IE5vTWVtID0gMDsKKworICAgIHZlbFN0ZXAgLz0gc2l6ZW9mKHZlbG9jaXR5WFswXSk7CisKKyAgICAvKiBDaGVja2luZyBiYWQgYXJndW1lbnRzICovCisgICAgaWYoIGltZ0EgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggaW1nQiA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgaWYoIGltYWdlSGVpZ2h0IDwgd2luSGVpZ2h0ICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCBpbWFnZVdpZHRoIDwgd2luV2lkdGggKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBpZiggd2luSGVpZ2h0ID49IDE2ICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCB3aW5XaWR0aCA+PSAxNiApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCAhKHdpbkhlaWdodCAmIDEpICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCAhKHdpbldpZHRoICYgMSkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBCdWZmZXJIZWlnaHQgPSB3aW5IZWlnaHQ7CisgICAgQnVmZmVyV2lkdGggPSBpbWFnZVdpZHRoOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ29tcHV0aW5nIEdhdXNzaWFuIGNvZWZmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgR2F1c3NYWzBdID0gMTsKKyAgICBHYXVzc1lbMF0gPSAxOworICAgIGZvciggaSA9IDE7IGkgPCB3aW5XaWR0aDsgaSsrICkKKyAgICB7CisgICAgICAgIEdhdXNzWFtpXSA9IDE7CisgICAgICAgIGZvciggaiA9IGkgLSAxOyBqID4gMDsgai0tICkKKyAgICAgICAgeworICAgICAgICAgICAgR2F1c3NYW2pdICs9IEdhdXNzWFtqIC0gMV07CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yKCBpID0gMTsgaSA8IHdpbkhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIEdhdXNzWVtpXSA9IDE7CisgICAgICAgIGZvciggaiA9IGkgLSAxOyBqID4gMDsgai0tICkKKyAgICAgICAgeworICAgICAgICAgICAgR2F1c3NZW2pdICs9IEdhdXNzWVtqIC0gMV07CisgICAgICAgIH0KKyAgICB9CisgICAgS2VyWCA9ICZHYXVzc1hbSG9yUmFkaXVzXTsKKyAgICBLZXJZID0gJkdhdXNzWVtWZXJSYWRpdXNdOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQWxsb2NhdGluZyBtZW1vcnkgZm9yIGFsbCBidWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBNZW1YW2tdID0gKGZsb2F0ICopIGN2QWxsb2MoIChpbWdTaXplLmhlaWdodCkgKiBzaXplb2YoIGZsb2F0ICkpOworCisgICAgICAgIGlmKCBNZW1YW2tdID09IE5VTEwgKQorICAgICAgICAgICAgTm9NZW0gPSAxOworICAgICAgICBNZW1ZW2tdID0gKGZsb2F0ICopIGN2QWxsb2MoIChpbWdTaXplLndpZHRoKSAqIHNpemVvZiggZmxvYXQgKSk7CisKKyAgICAgICAgaWYoIE1lbVlba10gPT0gTlVMTCApCisgICAgICAgICAgICBOb01lbSA9IDE7CisgICAgfQorCisgICAgQnVmZmVyU2l6ZSA9IEJ1ZmZlckhlaWdodCAqIEJ1ZmZlcldpZHRoOworCisgICAgSUkgPSAoaWN2RGVyUHJvZHVjdCAqKSBjdkFsbG9jKCBCdWZmZXJTaXplICogc2l6ZW9mKCBpY3ZEZXJQcm9kdWN0ICkpOworICAgIFdJSSA9IChpY3ZEZXJQcm9kdWN0ICopIGN2QWxsb2MoIEJ1ZmZlclNpemUgKiBzaXplb2YoIGljdkRlclByb2R1Y3QgKSk7CisKKworICAgIGlmKCAoSUkgPT0gTlVMTCkgfHwgKFdJSSA9PSBOVUxMKSApCisgICAgICAgIE5vTWVtID0gMTsKKworICAgIGlmKCBOb01lbSApCisgICAgeworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIE1lbVhba10gKQorICAgICAgICAgICAgICAgIGN2RnJlZSggJk1lbVhba10gKTsKKworICAgICAgICAgICAgaWYoIE1lbVlba10gKQorICAgICAgICAgICAgICAgIGN2RnJlZSggJk1lbVlba10gKTsKKyAgICAgICAgfQorICAgICAgICBpZiggSUkgKQorICAgICAgICAgICAgY3ZGcmVlKCAmSUkgKTsKKyAgICAgICAgaWYoIFdJSSApCisgICAgICAgICAgICBjdkZyZWUoICZXSUkgKTsKKworICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgICAgICBDYWxjdWxhdGUgZmlyc3QgbGluZSBvZiBtZW1YIGFuZCBtZW1ZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIE1lbVlbMF1bMF0gPSBNZW1ZWzFdWzBdID0gQ09OViggaW1nQVswXSwgaW1nQVswXSwgaW1nQVsxXSApOworICAgIE1lbVhbMF1bMF0gPSBNZW1YWzFdWzBdID0gQ09OViggaW1nQVswXSwgaW1nQVswXSwgaW1nQVtpbWdTdGVwXSApOworCisgICAgZm9yKCBqID0gMTsgaiA8IGltYWdlV2lkdGggLSAxOyBqKysgKQorICAgIHsKKyAgICAgICAgTWVtWVswXVtqXSA9IE1lbVlbMV1bal0gPSBDT05WKCBpbWdBW2ogLSAxXSwgaW1nQVtqXSwgaW1nQVtqICsgMV0gKTsKKyAgICB9CisKKyAgICBwaXhOdW1iZXIgPSBpbWdTdGVwOworICAgIGZvciggaSA9IDE7IGkgPCBpbWFnZUhlaWdodCAtIDE7IGkrKyApCisgICAgeworICAgICAgICBNZW1YWzBdW2ldID0gTWVtWFsxXVtpXSA9IENPTlYoIGltZ0FbcGl4TnVtYmVyIC0gaW1nU3RlcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nQVtwaXhOdW1iZXJdLCBpbWdBW3BpeE51bWJlciArIGltZ1N0ZXBdICk7CisgICAgICAgIHBpeE51bWJlciArPSBpbWdTdGVwOworICAgIH0KKworICAgIE1lbVlbMF1baW1hZ2VXaWR0aCAtIDFdID0KKyAgICAgICAgTWVtWVsxXVtpbWFnZVdpZHRoIC0gMV0gPSBDT05WKCBpbWdBW2ltYWdlV2lkdGggLSAyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdBW2ltYWdlV2lkdGggLSAxXSwgaW1nQVtpbWFnZVdpZHRoIC0gMV0gKTsKKworICAgIE1lbVhbMF1baW1hZ2VIZWlnaHQgLSAxXSA9CisgICAgICAgIE1lbVhbMV1baW1hZ2VIZWlnaHQgLSAxXSA9IENPTlYoIGltZ0FbcGl4TnVtYmVyIC0gaW1nU3RlcF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0FbcGl4TnVtYmVyXSwgaW1nQVtwaXhOdW1iZXJdICk7CisKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qICAgIGJlZ2luIHNjYW4gaW1hZ2UsIGNhbGMgZGVyaXZhdGl2ZXMgYW5kIHNvbHZlIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgUGl4ZWxMaW5lID0gLVZlclJhZGl1czsKKyAgICBDb252TGluZSA9IDA7CisgICAgQnVmZmVyQWRkcmVzcyA9IC1CdWZmZXJXaWR0aDsKKworICAgIHdoaWxlKCBQaXhlbExpbmUgPCBpbWFnZUhlaWdodCApCisgICAgeworICAgICAgICBpZiggQ29udkxpbmUgPCBpbWFnZUhlaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qSGVyZSB3ZSBjYWxjdWxhdGUgZGVyaXZhdGl2ZXMgZm9yIGxpbmUgb2YgaW1hZ2UgKi8KKyAgICAgICAgICAgIGludCBhZGRyZXNzOworCisgICAgICAgICAgICBpID0gQ29udkxpbmU7CisgICAgICAgICAgICBpbnQgTDEgPSBpIC0gMTsKKyAgICAgICAgICAgIGludCBMMiA9IGk7CisgICAgICAgICAgICBpbnQgTDMgPSBpICsgMTsKKworICAgICAgICAgICAgaW50IG1lbVlsaW5lID0gTDMgJiAxOworCisgICAgICAgICAgICBpZiggTDEgPCAwICkKKyAgICAgICAgICAgICAgICBMMSA9IDA7CisgICAgICAgICAgICBpZiggTDMgPj0gaW1hZ2VIZWlnaHQgKQorICAgICAgICAgICAgICAgIEwzID0gaW1hZ2VIZWlnaHQgLSAxOworCisgICAgICAgICAgICBCdWZmZXJBZGRyZXNzICs9IEJ1ZmZlcldpZHRoOworICAgICAgICAgICAgQnVmZmVyQWRkcmVzcyAtPSAoKEJ1ZmZlckFkZHJlc3MgPj0gQnVmZmVyU2l6ZSkgPyAweGZmZmZmZmZmIDogMCkgJiBCdWZmZXJTaXplOworCisgICAgICAgICAgICBhZGRyZXNzID0gQnVmZmVyQWRkcmVzczsKKworICAgICAgICAgICAgTGluZTEgPSBMMSAqIGltZ1N0ZXA7CisgICAgICAgICAgICBMaW5lMiA9IEwyICogaW1nU3RlcDsKKyAgICAgICAgICAgIExpbmUzID0gTDMgKiBpbWdTdGVwOworCisgICAgICAgICAgICAvKiBQcm9jZXNzIGZpcnN0IHBpeGVsICovCisgICAgICAgICAgICBDb252WCA9IENPTlYoIGltZ0FbTGluZTEgKyAxXSwgaW1nQVtMaW5lMiArIDFdLCBpbWdBW0xpbmUzICsgMV0gKTsKKyAgICAgICAgICAgIENvbnZZID0gQ09OViggaW1nQVtMaW5lM10sIGltZ0FbTGluZTNdLCBpbWdBW0xpbmUzICsgMV0gKTsKKworICAgICAgICAgICAgR3JhZFkgPSBDb252WSAtIE1lbVlbbWVtWWxpbmVdWzBdOworICAgICAgICAgICAgR3JhZFggPSBDb252WCAtIE1lbVhbMV1bTDJdOworCisgICAgICAgICAgICBNZW1ZW21lbVlsaW5lXVswXSA9IENvbnZZOworICAgICAgICAgICAgTWVtWFsxXVtMMl0gPSBDb252WDsKKworICAgICAgICAgICAgR3JhZFQgPSAoZmxvYXQpIChpbWdCW0xpbmUyXSAtIGltZ0FbTGluZTJdKTsKKworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHggPSBHcmFkWCAqIEdyYWRYOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHkgPSBHcmFkWCAqIEdyYWRZOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueXkgPSBHcmFkWSAqIEdyYWRZOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueHQgPSBHcmFkWCAqIEdyYWRUOworICAgICAgICAgICAgSUlbYWRkcmVzc10ueXQgPSBHcmFkWSAqIEdyYWRUOworICAgICAgICAgICAgYWRkcmVzcysrOworICAgICAgICAgICAgLyogUHJvY2VzcyBtaWRkbGUgb2YgbGluZSAqLworICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGltYWdlV2lkdGggLSAxOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvbnZYID0gQ09OViggaW1nQVtMaW5lMSArIGogKyAxXSwgaW1nQVtMaW5lMiArIGogKyAxXSwgaW1nQVtMaW5lMyArIGogKyAxXSApOworICAgICAgICAgICAgICAgIENvbnZZID0gQ09OViggaW1nQVtMaW5lMyArIGogLSAxXSwgaW1nQVtMaW5lMyArIGpdLCBpbWdBW0xpbmUzICsgaiArIDFdICk7CisKKyAgICAgICAgICAgICAgICBHcmFkWSA9IENvbnZZIC0gTWVtWVttZW1ZbGluZV1bal07CisgICAgICAgICAgICAgICAgR3JhZFggPSBDb252WCAtIE1lbVhbKGogLSAxKSAmIDFdW0wyXTsKKworICAgICAgICAgICAgICAgIE1lbVlbbWVtWWxpbmVdW2pdID0gQ29udlk7CisgICAgICAgICAgICAgICAgTWVtWFsoaiAtIDEpICYgMV1bTDJdID0gQ29udlg7CisKKyAgICAgICAgICAgICAgICBHcmFkVCA9IChmbG9hdCkgKGltZ0JbTGluZTIgKyBqXSAtIGltZ0FbTGluZTIgKyBqXSk7CisKKyAgICAgICAgICAgICAgICBJSVthZGRyZXNzXS54eCA9IEdyYWRYICogR3JhZFg7CisgICAgICAgICAgICAgICAgSUlbYWRkcmVzc10ueHkgPSBHcmFkWCAqIEdyYWRZOworICAgICAgICAgICAgICAgIElJW2FkZHJlc3NdLnl5ID0gR3JhZFkgKiBHcmFkWTsKKyAgICAgICAgICAgICAgICBJSVthZGRyZXNzXS54dCA9IEdyYWRYICogR3JhZFQ7CisgICAgICAgICAgICAgICAgSUlbYWRkcmVzc10ueXQgPSBHcmFkWSAqIEdyYWRUOworCisgICAgICAgICAgICAgICAgYWRkcmVzcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogUHJvY2VzcyBsYXN0IHBpeGVsIG9mIGxpbmUgKi8KKyAgICAgICAgICAgIENvbnZYID0gQ09OViggaW1nQVtMaW5lMSArIGltYWdlV2lkdGggLSAxXSwgaW1nQVtMaW5lMiArIGltYWdlV2lkdGggLSAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nQVtMaW5lMyArIGltYWdlV2lkdGggLSAxXSApOworCisgICAgICAgICAgICBDb252WSA9IENPTlYoIGltZ0FbTGluZTMgKyBpbWFnZVdpZHRoIC0gMl0sIGltZ0FbTGluZTMgKyBpbWFnZVdpZHRoIC0gMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ0FbTGluZTMgKyBpbWFnZVdpZHRoIC0gMV0gKTsKKworCisgICAgICAgICAgICBHcmFkWSA9IENvbnZZIC0gTWVtWVttZW1ZbGluZV1baW1hZ2VXaWR0aCAtIDFdOworICAgICAgICAgICAgR3JhZFggPSBDb252WCAtIE1lbVhbKGltYWdlV2lkdGggLSAyKSAmIDFdW0wyXTsKKworICAgICAgICAgICAgTWVtWVttZW1ZbGluZV1baW1hZ2VXaWR0aCAtIDFdID0gQ29udlk7CisKKyAgICAgICAgICAgIEdyYWRUID0gKGZsb2F0KSAoaW1nQltMaW5lMiArIGltYWdlV2lkdGggLSAxXSAtIGltZ0FbTGluZTIgKyBpbWFnZVdpZHRoIC0gMV0pOworCisgICAgICAgICAgICBJSVthZGRyZXNzXS54eCA9IEdyYWRYICogR3JhZFg7CisgICAgICAgICAgICBJSVthZGRyZXNzXS54eSA9IEdyYWRYICogR3JhZFk7CisgICAgICAgICAgICBJSVthZGRyZXNzXS55eSA9IEdyYWRZICogR3JhZFk7CisgICAgICAgICAgICBJSVthZGRyZXNzXS54dCA9IEdyYWRYICogR3JhZFQ7CisgICAgICAgICAgICBJSVthZGRyZXNzXS55dCA9IEdyYWRZICogR3JhZFQ7CisgICAgICAgICAgICBhZGRyZXNzKys7CisKKyAgICAgICAgICAgIC8qIEVuZCBvZiBkZXJpdmF0aXZlcyBmb3IgbGluZSAqLworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIC0tLS0tLS0tLUNhbGN1bGF0aW5nIGhvcml6b250YWwgY29udm9sdXRpb24gb2YgcHJvY2Vzc2VkIGxpbmUtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBhZGRyZXNzIC09IEJ1ZmZlcldpZHRoOworICAgICAgICAgICAgLyogcHJvY2VzcyBmaXJzdCBIb3JSYWRpdXMgcGl4ZWxzICovCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgSG9yUmFkaXVzOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBqajsKKworICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54eCA9IDA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh5ID0gMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXkgPSAwOworICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54dCA9IDA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnl0ID0gMDsKKworICAgICAgICAgICAgICAgIGZvciggamogPSAtajsgamogPD0gSG9yUmFkaXVzOyBqaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IEtlciA9IEtlclhbampdOworCisgICAgICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54eCArPSBJSVthZGRyZXNzICsgampdLnh4ICogS2VyOworICAgICAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueHkgKz0gSUlbYWRkcmVzcyArIGpqXS54eSAqIEtlcjsKKyAgICAgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnl5ICs9IElJW2FkZHJlc3MgKyBqal0ueXkgKiBLZXI7CisgICAgICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54dCArPSBJSVthZGRyZXNzICsgampdLnh0ICogS2VyOworICAgICAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXQgKz0gSUlbYWRkcmVzcyArIGpqXS55dCAqIEtlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkcmVzcysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcHJvY2VzcyBpbm5lciBwYXJ0IG9mIGxpbmUgKi8KKyAgICAgICAgICAgIGZvciggaiA9IEhvclJhZGl1czsgaiA8IGltYWdlV2lkdGggLSBIb3JSYWRpdXM7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGpqOworICAgICAgICAgICAgICAgIGZsb2F0IEtlcjAgPSBLZXJYWzBdOworCisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh4ID0gMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueHkgPSAwOworICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS55eSA9IDA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh0ID0gMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXQgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBqaiA9IDE7IGpqIDw9IEhvclJhZGl1czsgamorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBLZXIgPSBLZXJYW2pqXTsKKworICAgICAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueHggKz0gKElJW2FkZHJlc3MgLSBqal0ueHggKyBJSVthZGRyZXNzICsgampdLnh4KSAqIEtlcjsKKyAgICAgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh5ICs9IChJSVthZGRyZXNzIC0gampdLnh5ICsgSUlbYWRkcmVzcyArIGpqXS54eSkgKiBLZXI7CisgICAgICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS55eSArPSAoSUlbYWRkcmVzcyAtIGpqXS55eSArIElJW2FkZHJlc3MgKyBqal0ueXkpICogS2VyOworICAgICAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueHQgKz0gKElJW2FkZHJlc3MgLSBqal0ueHQgKyBJSVthZGRyZXNzICsgampdLnh0KSAqIEtlcjsKKyAgICAgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnl0ICs9IChJSVthZGRyZXNzIC0gampdLnl0ICsgSUlbYWRkcmVzcyArIGpqXS55dCkgKiBLZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54eCArPSBJSVthZGRyZXNzXS54eCAqIEtlcjA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh5ICs9IElJW2FkZHJlc3NdLnh5ICogS2VyMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXkgKz0gSUlbYWRkcmVzc10ueXkgKiBLZXIwOworICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54dCArPSBJSVthZGRyZXNzXS54dCAqIEtlcjA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnl0ICs9IElJW2FkZHJlc3NdLnl0ICogS2VyMDsKKworICAgICAgICAgICAgICAgIGFkZHJlc3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHByb2Nlc3MgcmlnaHQgc2lkZSAqLworICAgICAgICAgICAgZm9yKCBqID0gaW1hZ2VXaWR0aCAtIEhvclJhZGl1czsgaiA8IGltYWdlV2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGpqOworCisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh4ID0gMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueHkgPSAwOworICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS55eSA9IDA7CisgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh0ID0gMDsKKyAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXQgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBqaiA9IC1Ib3JSYWRpdXM7IGpqIDwgaW1hZ2VXaWR0aCAtIGo7IGpqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgS2VyID0gS2VyWFtqal07CisKKyAgICAgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh4ICs9IElJW2FkZHJlc3MgKyBqal0ueHggKiBLZXI7CisgICAgICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS54eSArPSBJSVthZGRyZXNzICsgampdLnh5ICogS2VyOworICAgICAgICAgICAgICAgICAgICBXSUlbYWRkcmVzc10ueXkgKz0gSUlbYWRkcmVzcyArIGpqXS55eSAqIEtlcjsKKyAgICAgICAgICAgICAgICAgICAgV0lJW2FkZHJlc3NdLnh0ICs9IElJW2FkZHJlc3MgKyBqal0ueHQgKiBLZXI7CisgICAgICAgICAgICAgICAgICAgIFdJSVthZGRyZXNzXS55dCArPSBJSVthZGRyZXNzICsgampdLnl0ICogS2VyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhZGRyZXNzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgLyogIENhbGN1bGF0aW5nIHZlbG9jaXR5IGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBpZiggUGl4ZWxMaW5lID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgVVNwYWNlOworICAgICAgICAgICAgaW50IEJTcGFjZTsKKyAgICAgICAgICAgIGludCBhZGRyZXNzOworCisgICAgICAgICAgICBpZiggUGl4ZWxMaW5lIDwgVmVyUmFkaXVzICkKKyAgICAgICAgICAgICAgICBVU3BhY2UgPSBQaXhlbExpbmU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgVVNwYWNlID0gVmVyUmFkaXVzOworCisgICAgICAgICAgICBpZiggUGl4ZWxMaW5lID49IGltYWdlSGVpZ2h0IC0gVmVyUmFkaXVzICkKKyAgICAgICAgICAgICAgICBCU3BhY2UgPSBpbWFnZUhlaWdodCAtIFBpeGVsTGluZSAtIDE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQlNwYWNlID0gVmVyUmFkaXVzOworCisgICAgICAgICAgICBhZGRyZXNzID0gKChQaXhlbExpbmUgLSBVU3BhY2UpICUgQnVmZmVySGVpZ2h0KSAqIEJ1ZmZlcldpZHRoOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGltYWdlV2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGFkZHIgPSBhZGRyZXNzOworCisgICAgICAgICAgICAgICAgQTFCMiA9IDA7CisgICAgICAgICAgICAgICAgQTIgPSAwOworICAgICAgICAgICAgICAgIEIxID0gMDsKKyAgICAgICAgICAgICAgICBDMSA9IDA7CisgICAgICAgICAgICAgICAgQzIgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gLVVTcGFjZTsgaSA8PSBCU3BhY2U7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBMiArPSBXSUlbYWRkciArIGpdLnh4ICogS2VyWVtpXTsKKyAgICAgICAgICAgICAgICAgICAgQTFCMiArPSBXSUlbYWRkciArIGpdLnh5ICogS2VyWVtpXTsKKyAgICAgICAgICAgICAgICAgICAgQjEgKz0gV0lJW2FkZHIgKyBqXS55eSAqIEtlcllbaV07CisgICAgICAgICAgICAgICAgICAgIEMyICs9IFdJSVthZGRyICsgal0ueHQgKiBLZXJZW2ldOworICAgICAgICAgICAgICAgICAgICBDMSArPSBXSUlbYWRkciArIGpdLnl0ICogS2VyWVtpXTsKKworICAgICAgICAgICAgICAgICAgICBhZGRyICs9IEJ1ZmZlcldpZHRoOworICAgICAgICAgICAgICAgICAgICBhZGRyIC09ICgoYWRkciA+PSBCdWZmZXJTaXplKSA/IDB4ZmZmZmZmZmYgOiAwKSAmIEJ1ZmZlclNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgICAgICAgICAgICAgICogU29sdmUgTGluZWFyIFN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgIFwqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGVsdGEgPSAoQTFCMiAqIEExQjIgLSBBMiAqIEIxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggZGVsdGEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzeXN0ZW0gaXMgbm90IHNpbmd1bGFyIC0gc29sdmluZyBieSBLcmFtZXIgbWV0aG9kICovCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZWx0YVg7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZWx0YVk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBJZGVsdGEgPSA4IC8gZGVsdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhWCA9IC0oQzEgKiBBMUIyIC0gQzIgKiBCMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVkgPSAtKEExQjIgKiBDMiAtIEEyICogQzEpOworCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVhbal0gPSBkZWx0YVggKiBJZGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0eVlbal0gPSBkZWx0YVkgKiBJZGVsdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaW5ndWxhciBzeXN0ZW0gLSBmaW5kIG9wdGljYWwgZmxvdyBpbiBncmFkaWVudCBkaXJlY3Rpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IE5vcm0gPSAoQTFCMiArIEEyKSAqIChBMUIyICsgQTIpICsgKEIxICsgQTFCMikgKiAoQjEgKyBBMUIyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIE5vcm0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IElHcmFkTm9ybSA9IDggLyBOb3JtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRlbXAgPSAtKEMxICsgQzIpICogSUdyYWROb3JtOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlYW2pdID0gKEExQjIgKyBBMikgKiB0ZW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WVtqXSA9IChCMSArIEExQjIpICogdGVtcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbG9jaXR5WFtqXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVsb2NpdHlZW2pdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAqIEVuZCBvZiBTb2x2aW5nIExpbmVhciBTeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICBcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLypmb3IgKi8KKyAgICAgICAgICAgIHZlbG9jaXR5WCArPSB2ZWxTdGVwOworICAgICAgICAgICAgdmVsb2NpdHlZICs9IHZlbFN0ZXA7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qZm9yICovCisgICAgICAgIFBpeGVsTGluZSsrOworICAgICAgICBDb252TGluZSsrOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5ICovCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBjdkZyZWUoICZNZW1YW2tdICk7CisgICAgICAgIGN2RnJlZSggJk1lbVlba10gKTsKKyAgICB9CisgICAgY3ZGcmVlKCAmSUkgKTsKKyAgICBjdkZyZWUoICZXSUkgKTsKKworICAgIHJldHVybiBDVl9PSzsKK30gLyppY3ZDYWxjT3B0aWNhbEZsb3dMS184dTMyZlIqLworCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZDYWxjT3B0aWNhbEZsb3dMSworLy8gICAgUHVycG9zZTogT3B0aWNhbCBmbG93IGltcGxlbWVudGF0aW9uCisvLyAgICBDb250ZXh0OiAKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgICBzcmNBLCBzcmNCIC0gc291cmNlIGltYWdlCisvLyAgICAgICAgICAgICB2ZWx4LCB2ZWx5IC0gZGVzdGluYXRpb24gaW1hZ2UKKy8vICAgIFJldHVybnM6CisvLworLy8gICAgTm90ZXM6CisvL0YqLworQ1ZfSU1QTCB2b2lkCitjdkNhbGNPcHRpY2FsRmxvd0xLKCBjb25zdCB2b2lkKiBzcmNhcnJBLCBjb25zdCB2b2lkKiBzcmNhcnJCLCBDdlNpemUgd2luU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHZlbGFycngsIHZvaWQqIHZlbGFycnkgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjT3B0aWNhbEZsb3dMSyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWJBLCAqc3JjQSA9IChDdk1hdCopc3JjYXJyQTsKKyAgICBDdk1hdCBzdHViQiwgKnNyY0IgPSAoQ3ZNYXQqKXNyY2FyckI7CisgICAgQ3ZNYXQgc3R1YngsICp2ZWx4ID0gKEN2TWF0Kil2ZWxhcnJ4OworICAgIEN2TWF0IHN0dWJ5LCAqdmVseSA9IChDdk1hdCopdmVsYXJyeTsKKworICAgIENWX0NBTEwoIHNyY0EgPSBjdkdldE1hdCggc3JjQSwgJnN0dWJBICkpOworICAgIENWX0NBTEwoIHNyY0IgPSBjdkdldE1hdCggc3JjQiwgJnN0dWJCICkpOworCisgICAgQ1ZfQ0FMTCggdmVseCA9IGN2R2V0TWF0KCB2ZWx4LCAmc3R1YnggKSk7CisgICAgQ1ZfQ0FMTCggdmVseSA9IGN2R2V0TWF0KCB2ZWx5LCAmc3R1YnkgKSk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjQSwgc3JjQiApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIlNvdXJjZSBpbWFnZXMgaGF2ZSBkaWZmZXJlbnQgZm9ybWF0cyIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCB2ZWx4LCB2ZWx5ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiRGVzdGluYXRpb24gaW1hZ2VzIGhhdmUgZGlmZmVyZW50IGZvcm1hdHMiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjQSwgc3JjQiApIHx8CisgICAgICAgICFDVl9BUkVfU0laRVNfRVEoIHZlbHgsIHZlbHkgKSB8fAorICAgICAgICAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmNBLCB2ZWx4ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRSggc3JjQS0+dHlwZSApICE9IENWXzhVQzEgfHwKKyAgICAgICAgQ1ZfTUFUX1RZUEUoIHZlbHgtPnR5cGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlNvdXJjZSBpbWFnZXMgbXVzdCBoYXZlIDh1QzEgdHlwZSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBpbWFnZXMgbXVzdCBoYXZlIDMyZkMxIHR5cGUiICk7CisKKyAgICBpZiggc3JjQS0+c3RlcCAhPSBzcmNCLT5zdGVwIHx8IHZlbHgtPnN0ZXAgIT0gdmVseS0+c3RlcCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRTdGVwLCAic291cmNlIGFuZCBkZXN0aW5hdGlvbiBpbWFnZXMgaGF2ZSBkaWZmZXJlbnQgc3RlcCIgKTsKKworICAgIElQUElfQ0FMTCggaWN2Q2FsY09wdGljYWxGbG93TEtfOHUzMmZSKCAodWNoYXIqKXNyY0EtPmRhdGEucHRyLCAodWNoYXIqKXNyY0ItPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNBLT5zdGVwLCBjdkdldE1hdFNpemUoIHNyY0EgKSwgd2luU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVseC0+ZGF0YS5mbCwgdmVseS0+ZGF0YS5mbCwgdmVseC0+c3RlcCApKTsKKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2cGdoLmNwcCBiL2N2L3NyYy9jdnBnaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhYWY0ZgotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnBnaC5jcHAKQEAgLTAsMCArMSwzNjMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisjZGVmaW5lIF9DVl9BQ09TX1RBQkxFX1NJWkUgIDUxMworCitzdGF0aWMgY29uc3QgZmxvYXQgaWN2X2Fjb3NfdGFibGVbX0NWX0FDT1NfVEFCTEVfU0laRV0gPSB7CisgICAgMy4xNDE1OTI2NWYsIDMuMDUzMTc1NTFmLCAzLjAxNjUxMTEzZiwgMi45ODgzNDk2NGYsIDIuOTY0NTg0OTdmLCAyLjk0MzYyNzE5ZiwKKyAgICAyLjkyNDY2MTE5ZiwgMi45MDcyMDI4OWYsIDIuODkwOTM2OTlmLCAyLjg3NTY0NDU1ZiwgMi44NjExNjYyMWYsIDIuODQ3MzgxNjlmLAorICAgIDIuODM0MTk3NjBmLCAyLjgyMTUzOTY3ZiwgMi44MDkzNDc3MGYsIDIuNzk3NTcyMTFmLCAyLjc4NjE3MTQ1ZiwgMi43NzUxMTA2OWYsCisgICAgMi43NjQzNTk4OGYsIDIuNzUzODkzMTlmLCAyLjc0MzY4ODE2ZiwgMi43MzM3MjUxMGYsIDIuNzIzOTg2NjVmLCAyLjcxNDQ1NzQxZiwKKyAgICAyLjcwNTEyMzYyZiwgMi42OTU5NzI5OGYsIDIuNjg2OTk0MzhmLCAyLjY3ODE3Nzc4ZiwgMi42Njk1MTQwN2YsIDIuNjYwOTk0OTNmLAorICAgIDIuNjUyNjEyNzlmLCAyLjY0NDM2MDY2ZiwgMi42MzYyMzIxNGYsIDIuNjI4MjIxMzNmLCAyLjYyMDMyMjc3ZiwgMi42MTI1MzEzOGYsCisgICAgMi42MDQ4NDI0OGYsIDIuNTk3MjUxNjdmLCAyLjU4OTc1NDg4ZiwgMi41ODIzNDgyOGYsIDIuNTc1MDI4MzJmLCAyLjU2Nzc5MTY0ZiwKKyAgICAyLjU2MDYzNTA5ZiwgMi41NTM1NTU3MmYsIDIuNTQ2NTUwNzNmLCAyLjUzOTYxNzUwZiwgMi41MzI3NTM1NGYsIDIuNTI1OTU2NTBmLAorICAgIDIuNTE5MjI0MTdmLCAyLjUxMjU1NDQxZiwgMi41MDU5NDUyNWYsIDIuNDk5Mzk0NzZmLCAyLjQ5MjkwMTE1ZiwgMi40ODY0NjI2OWYsCisgICAgMi40ODAwNzc3M2YsIDIuNDczNzQ0NzJmLCAyLjQ2NzQ2MjE1ZiwgMi40NjEyMjg2MGYsIDIuNDU1MDQyNjlmLCAyLjQ0ODkwMzE0ZiwKKyAgICAyLjQ0MjgwODY3ZiwgMi40MzY3NTgwOWYsIDIuNDMwNzUwMjVmLCAyLjQyNDc4NDA0ZiwgMi40MTg4NTg0MWYsIDIuNDEyOTcyMzJmLAorICAgIDIuNDA3MTI0ODBmLCAyLjQwMTMxNDkxZiwgMi4zOTU1NDE3M2YsIDIuMzg5ODA0MzlmLCAyLjM4NDEwMjA0ZiwgMi4zNzg0MzM4OGYsCisgICAgMi4zNzI3OTkxMGYsIDIuMzY3MTk2OTdmLCAyLjM2MTYyNjczZiwgMi4zNTYwODc2OGYsIDIuMzUwNTc5MTRmLCAyLjM0NTEwMDQ0ZiwKKyAgICAyLjMzOTY1MDk0ZiwgMi4zMzQyMzAwM2YsIDIuMzI4ODM3MDlmLCAyLjMyMzQ3MTU1ZiwgMi4zMTgxMzI4NGYsIDIuMzEyODIwNDFmLAorICAgIDIuMzA3NTMzNzNmLCAyLjMwMjI3MjI4ZiwgMi4yOTcwMzU1NmYsIDIuMjkxODIzMDlmLCAyLjI4NjYzNDM5ZiwgMi4yODE0NjkwMGYsCisgICAgMi4yNzYzMjY0N2YsIDIuMjcxMjA2MzdmLCAyLjI2NjEwODI3ZiwgMi4yNjEwMzE3N2YsIDIuMjU1OTc2NDZmLCAyLjI1MDk0MTk1ZiwKKyAgICAyLjI0NTkyNzg2ZiwgMi4yNDA5MzM4MmYsIDIuMjM1OTU5NDZmLCAyLjIzMTAwNDQ0ZiwgMi4yMjYwNjg0MmYsIDIuMjIxMTUxMDRmLAorICAgIDIuMjE2MjUxOTlmLCAyLjIxMTM3MDk2ZiwgMi4yMDY1MDc2MWYsIDIuMjAxNjYxNjZmLCAyLjE5NjgzMjgwZiwgMi4xOTIwMjA3NGYsCisgICAgMi4xODcyMjUyMGYsIDIuMTgyNDQ1OTBmLCAyLjE3NzY4MjU3ZiwgMi4xNzI5MzQ5M2YsIDIuMTY4MjAyNzRmLCAyLjE2MzQ4NTc0ZiwKKyAgICAyLjE1ODc4MzY3ZiwgMi4xNTQwOTYzMGYsIDIuMTQ5NDIzMzhmLCAyLjE0NDc2NDY4ZiwgMi4xNDAxMTk5N2YsIDIuMTM1NDg5MDNmLAorICAgIDIuMTMwODcxNjNmLCAyLjEyNjI2NzU3ZiwgMi4xMjE2NzY2MmYsIDIuMTE3MDk4NTlmLCAyLjExMjUzMzI2ZiwgMi4xMDc5ODA0NGYsCisgICAgMi4xMDM0Mzk5NGYsIDIuMDk4OTExNTZmLCAyLjA5NDM5NTEwZiwgMi4wODk4OTA0MGYsIDIuMDg1Mzk3MjVmLCAyLjA4MDkxNTUwZiwKKyAgICAyLjA3NjQ0NDk1ZiwgMi4wNzE5ODU0NWYsIDIuMDY3NTM2ODFmLCAyLjA2MzA5ODg3ZiwgMi4wNTg2NzE0N2YsIDIuMDU0MjU0NDVmLAorICAgIDIuMDQ5ODQ3NjVmLCAyLjA0NTQ1MDkyZiwgMi4wNDEwNjQwOWYsIDIuMDM2Njg3MDNmLCAyLjAzMjMxOTU3ZiwgMi4wMjc5NjE1OWYsCisgICAgMi4wMjM2MTI5MmYsIDIuMDE5MjczNDRmLCAyLjAxNDk0MzAwZiwgMi4wMTA2MjE0NmYsIDIuMDA2MzA4NzBmLCAyLjAwMjAwNDU3ZiwKKyAgICAxLjk5NzcwODk1ZiwgMS45OTM0MjE3MWYsIDEuOTg5MTQyNzFmLCAxLjk4NDg3MTg1ZiwgMS45ODA2MDg5OGYsIDEuOTc2MzUzOTlmLAorICAgIDEuOTcyMTA2NzZmLCAxLjk2Nzg2NzE4ZiwgMS45NjM2MzUxMWYsIDEuOTU5NDEwNDZmLCAxLjk1NTE5MzEwZiwgMS45NTA5ODI5MmYsCisgICAgMS45NDY3Nzk4MmYsIDEuOTQyNTgzNjhmLCAxLjkzODM5NDM5ZiwgMS45MzQyMTE4NWYsIDEuOTMwMDM1OTVmLCAxLjkyNTg2NjU5ZiwKKyAgICAxLjkyMTcwMzY3ZiwgMS45MTc1NDcwOGYsIDEuOTEzMzk2NzNmLCAxLjkwOTI1MjUwZiwgMS45MDUxMTQzMmYsIDEuOTAwOTgyMDhmLAorICAgIDEuODk2ODU1NjhmLCAxLjg5MjczNTAzZiwgMS44ODg2MjAwM2YsIDEuODg0NTEwNjBmLCAxLjg4MDQwNjY0ZiwgMS44NzYzMDgwNmYsCisgICAgMS44NzIyMTQ3N2YsIDEuODY4MTI2NjhmLCAxLjg2NDA0MzcxZiwgMS44NTk5NjU3N2YsIDEuODU1ODkyNzdmLCAxLjg1MTgyNDYyZiwKKyAgICAxLjg0Nzc2MTI1ZiwgMS44NDM3MDI1NmYsIDEuODM5NjQ4NDhmLCAxLjgzNTU5ODkyZiwgMS44MzE1NTM4MWYsIDEuODI3NTEzMDVmLAorICAgIDEuODIzNDc2NThmLCAxLjgxOTQ0NDMxZiwgMS44MTU0MTYxN2YsIDEuODExMzkyMDdmLCAxLjgwNzM3MTk0ZiwgMS44MDMzNTU3MGYsCisgICAgMS43OTkzNDMyOGYsIDEuNzk1MzM0NjBmLCAxLjc5MTMyOTU5ZiwgMS43ODczMjgxN2YsIDEuNzgzMzMwMjdmLCAxLjc3OTMzNTgxZiwKKyAgICAxLjc3NTM0NDczZiwgMS43NzEzNTY5NWYsIDEuNzY3MzcyNDBmLCAxLjc2MzM5MTAxZiwgMS43NTk0MTI3MWYsIDEuNzU1NDM3NDNmLAorICAgIDEuNzUxNDY1MTBmLCAxLjc0NzQ5NTY1ZiwgMS43NDM1MjkwMGYsIDEuNzM5NTY1MTFmLCAxLjczNTYwMzg5ZiwgMS43MzE2NDUyN2YsCisgICAgMS43Mjc2ODkyMGYsIDEuNzIzNzM1NjBmLCAxLjcxOTc4NDQxZiwgMS43MTU4MzU1NmYsIDEuNzExODg4OTlmLCAxLjcwNzk0NDYyZiwKKyAgICAxLjcwNDAwMjQxZiwgMS43MDAwNjIyOGYsIDEuNjk2MTI0MTZmLCAxLjY5MjE4Nzk5ZiwgMS42ODgyNTM3MmYsIDEuNjg0MzIxMjdmLAorICAgIDEuNjgwMzkwNThmLCAxLjY3NjQ2MTYwZiwgMS42NzI1MzQyNGYsIDEuNjY4NjA4NDdmLCAxLjY2NDY4NDIwZiwgMS42NjA3NjEzOWYsCisgICAgMS42NTY4Mzk5NmYsIDEuNjUyOTE5ODZmLCAxLjY0OTAwMTAyZiwgMS42NDUwODMzOGYsIDEuNjQxMTY2ODlmLCAxLjYzNzI1MTQ4ZiwKKyAgICAxLjYzMzMzNzA5ZiwgMS42Mjk0MjM2NmYsIDEuNjI1NTExMTJmLCAxLjYyMTU5OTQzZiwgMS42MTc2ODg1MWYsIDEuNjEzNzc4MzFmLAorICAgIDEuNjA5ODY4NzdmLCAxLjYwNTk1OTgyZiwgMS42MDIwNTE0MmYsIDEuNTk4MTQzNDlmLCAxLjU5NDIzNTk3ZiwgMS41OTAzMjg4MmYsCisgICAgMS41ODY0MjE5NmYsIDEuNTgyNTE1MzVmLCAxLjU3ODYwODkxZiwgMS41NzQ3MDI1OWYsIDEuNTcwNzk2MzNmLCAxLjU2Njg5MDA3ZiwKKyAgICAxLjU2Mjk4Mzc1ZiwgMS41NTkwNzczMWYsIDEuNTU1MTcwNjlmLCAxLjU1MTI2MzgzZiwgMS41NDczNTY2OGYsIDEuNTQzNDQ5MTdmLAorICAgIDEuNTM5NTQxMjRmLCAxLjUzNTYzMjgzZiwgMS41MzE3MjM4OWYsIDEuNTI3ODE0MzRmLCAxLjUyMzkwNDE0ZiwgMS41MTk5OTMyM2YsCisgICAgMS41MTYwODE1M2YsIDEuNTEyMTY5MDBmLCAxLjUwODI1NTU2ZiwgMS41MDQzNDExN2YsIDEuNTAwNDI1NzZmLCAxLjQ5NjUwOTI3ZiwKKyAgICAxLjQ5MjU5MTYzZiwgMS40ODg2NzI4MGYsIDEuNDg0NzUyNzBmLCAxLjQ4MDgzMTI3ZiwgMS40NzY5MDg0NWYsIDEuNDcyOTg0MTlmLAorICAgIDEuNDY5MDU4NDFmLCAxLjQ2NTEzMTA2ZiwgMS40NjEyMDIwN2YsIDEuNDU3MjcxMzhmLCAxLjQ1MzMzODkzZiwgMS40NDk0MDQ2NmYsCisgICAgMS40NDU0Njg1MGYsIDEuNDQxNTMwMzhmLCAxLjQzNzU5MDI0ZiwgMS40MzM2NDgwM2YsIDEuNDI5NzAzNjdmLCAxLjQyNTc1NzA5ZiwKKyAgICAxLjQyMTgwODI1ZiwgMS40MTc4NTcwNWYsIDEuNDEzOTAzNDZmLCAxLjQwOTk0NzM4ZiwgMS40MDU5ODg3N2YsIDEuNDAyMDI3NTVmLAorICAgIDEuMzk4MDYzNjVmLCAxLjM5NDA5NzAxZiwgMS4zOTAxMjc1NmYsIDEuMzg2MTU1MjJmLCAxLjM4MjE3OTk0ZiwgMS4zNzgyMDE2NGYsCisgICAgMS4zNzQyMjAyNWYsIDEuMzcwMjM1NzBmLCAxLjM2NjI0NzkyZiwgMS4zNjIyNTY4NGYsIDEuMzU4MjYyMzlmLCAxLjM1NDI2NDQ5ZiwKKyAgICAxLjM1MDI2MzA3ZiwgMS4zNDYyNTgwNWYsIDEuMzQyMjQ5MzdmLCAxLjMzODIzNjk1ZiwgMS4zMzQyMjA3MmYsIDEuMzMwMjAwNTlmLAorICAgIDEuMzI2MTc2NDlmLCAxLjMyMjE0ODM0ZiwgMS4zMTgxMTYwN2YsIDEuMzE0MDc5NjBmLCAxLjMxMDAzODg1ZiwgMS4zMDU5OTM3M2YsCisgICAgMS4zMDE5NDQxN2YsIDEuMjk3ODkwMDlmLCAxLjI5MzgzMTQxZiwgMS4yODk3NjgwM2YsIDEuMjg1Njk5ODlmLCAxLjI4MTYyNjg4ZiwKKyAgICAxLjI3NzU0ODk0ZiwgMS4yNzM0NjU5N2YsIDEuMjY5Mzc3ODhmLCAxLjI2NTI4NDU5ZiwgMS4yNjExODYwMmYsIDEuMjU3MDgyMDVmLAorICAgIDEuMjUyOTcyNjJmLCAxLjI0ODg1NzYzZiwgMS4yNDQ3MzY5OGYsIDEuMjQwNjEwNThmLCAxLjIzNjQ3ODMzZiwgMS4yMzIzNDAxNWYsCisgICAgMS4yMjgxOTU5M2YsIDEuMjI0MDQ1NTdmLCAxLjIxOTg4ODk4ZiwgMS4yMTU3MjYwNmYsIDEuMjExNTU2NzBmLCAxLjIwNzM4MDgwZiwKKyAgICAxLjIwMzE5ODI2ZiwgMS4xOTkwMDg5OGYsIDEuMTk0ODEyODNmLCAxLjE5MDYwOTczZiwgMS4xODYzOTk1NWYsIDEuMTgyMTgyMTlmLAorICAgIDEuMTc3OTU3NTRmLCAxLjE3MzcyNTQ4ZiwgMS4xNjk0ODU4OWYsIDEuMTY1MjM4NjZmLCAxLjE2MDk4MzY4ZiwgMS4xNTY3MjA4MWYsCisgICAgMS4xNTI0NDk5NGYsIDEuMTQ4MTcwOTVmLCAxLjE0Mzg4MzcwZiwgMS4xMzk1ODgwOGYsIDEuMTM1MjgzOTZmLCAxLjEzMDk3MTE5ZiwKKyAgICAxLjEyNjY0OTY2ZiwgMS4xMjIzMTkyMWYsIDEuMTE3OTc5NzNmLCAxLjExMzYzMTA3ZiwgMS4xMDkyNzMwOGYsIDEuMTA0OTA1NjNmLAorICAgIDEuMTAwNTI4NTZmLCAxLjA5NjE0MTc0ZiwgMS4wOTE3NDUwMGYsIDEuMDg3MzM4MjBmLCAxLjA4MjkyMTE4ZiwgMS4wNzg0OTM3OGYsCisgICAgMS4wNzQwNTU4NWYsIDEuMDY5NjA3MjFmLCAxLjA2NTE0NzcwZiwgMS4wNjA2NzcxNWYsIDEuMDU2MTk1NDBmLCAxLjA1MTcwMjI2ZiwKKyAgICAxLjA0NzE5NzU1ZiwgMS4wNDI2ODExMGYsIDEuMDM4MTUyNzFmLCAxLjAzMzYxMjIxZiwgMS4wMjkwNTkzOWYsIDEuMDI0NDk0MDdmLAorICAgIDEuMDE5OTE2MDNmLCAxLjAxNTMyNTA5ZiwgMS4wMTA3MjEwMmYsIDEuMDA2MTAzNjNmLCAxLjAwMTQ3MjY4ZiwgMC45OTY4Mjc5OGYsCisgICAgMC45OTIxNjkyOGYsIDAuOTg3NDk2MzZmLCAwLjk4MjgwODk4ZiwgMC45NzgxMDY5MWYsIDAuOTczMzg5OTFmLCAwLjk2ODY1NzcyZiwKKyAgICAwLjk2MzkxMDA5ZiwgMC45NTkxNDY3NWYsIDAuOTU0MzY3NDVmLCAwLjk0OTU3MTkxZiwgMC45NDQ3NTk4NWYsIDAuOTM5OTMwOTlmLAorICAgIDAuOTM1MDg1MDRmLCAwLjkzMDIyMTcwZiwgMC45MjUzNDA2NmYsIDAuOTIwNDQxNjFmLCAwLjkxNTUyNDI0ZiwgMC45MTA1ODgyMWYsCisgICAgMC45MDU2MzMxOWYsIDAuOTAwNjU4ODRmLCAwLjg5NTY2NDc5ZiwgMC44OTA2NTA3MGYsIDAuODg1NjE2MTlmLCAwLjg4MDU2MDg4ZiwKKyAgICAwLjg3NTQ4NDM4ZiwgMC44NzAzODYyOWYsIDAuODY1MjY2MTlmLCAwLjg2MDEyMzY2ZiwgMC44NTQ5NTgyN2YsIDAuODQ5NzY5NTZmLAorICAgIDAuODQ0NTU3MDlmLCAwLjgzOTMyMDM3ZiwgMC44MzQwNTg5M2YsIDAuODI4NzcyMjVmLCAwLjgyMzQ1OTgxZiwgMC44MTgxMjExMGYsCisgICAgMC44MTI3NTU1NmYsIDAuODA3MzYyNjJmLCAwLjgwMTk0MTcxZiwgMC43OTY0OTIyMWYsIDAuNzkxMDEzNTJmLCAwLjc4NTUwNDk3ZiwKKyAgICAwLjc3OTk2NTkzZiwgMC43NzQzOTU2OWYsIDAuNzY4NzkzNTVmLCAwLjc2MzE1ODc4ZiwgMC43NTc0OTA2MWYsIDAuNzUxNzg4MjZmLAorICAgIDAuNzQ2MDUwOTJmLCAwLjc0MDI3Nzc1ZiwgMC43MzQ0Njc4NWYsIDAuNzI4NjIwMzNmLCAwLjcyMjczNDI1ZiwgMC43MTY4MDg2MWYsCisgICAgMC43MTA4NDI0MGYsIDAuNzA0ODM0NTZmLCAwLjY5ODc4Mzk4ZiwgMC42OTI2ODk1MmYsIDAuNjg2NTQ5OTZmLCAwLjY4MDM2NDA2ZiwKKyAgICAwLjY3NDEzMDUxZiwgMC42Njc4NDc5NGYsIDAuNjYxNTE0OTJmLCAwLjY1NTEyOTk3ZiwgMC42NDg2OTE1MWYsIDAuNjQyMTk3ODlmLAorICAgIDAuNjM1NjQ3NDFmLCAwLjYyOTAzODI0ZiwgMC42MjIzNjg0OWYsIDAuNjE1NjM2MTVmLCAwLjYwODgzOTExZiwgMC42MDE5NzUxNWYsCisgICAgMC41OTUwNDE5MmYsIDAuNTg4MDM2OTRmLCAwLjU4MDk1NzU2ZiwgMC41NzM4MDEwMWYsIDAuNTY2NTY0MzNmLCAwLjU1OTI0NDM3ZiwKKyAgICAwLjU1MTgzNzc4ZiwgMC41NDQzNDA5OWYsIDAuNTM2NzUwMThmLCAwLjUyOTA2MTI3ZiwgMC41MjEyNjk4OGYsIDAuNTEzMzcxMzJmLAorICAgIDAuNTA1MzYwNTFmLCAwLjQ5NzIzMjAwZiwgMC40ODg5Nzk4N2YsIDAuNDgwNTk3NzJmLCAwLjQ3MjA3ODU5ZiwgMC40NjM0MTQ4N2YsCisgICAgMC40NTQ1OTgyN2YsIDAuNDQ1NjE5NjdmLCAwLjQzNjQ2OTAzZiwgMC40MjcxMzUyNWYsIDAuNDE3NjA2MDBmLCAwLjQwNzg2NzU1ZiwKKyAgICAwLjM5NzkwNDQ5ZiwgMC4zODc2OTk0NmYsIDAuMzc3MjMyNzdmLCAwLjM2NjQ4MTk2ZiwgMC4zNTU0MjEyMGYsIDAuMzQ0MDIwNTRmLAorICAgIDAuMzMyMjQ0OTVmLCAwLjMyMDA1Mjk4ZiwgMC4zMDczOTUwNWYsIDAuMjk0MjEwOTZmLCAwLjI4MDQyNjQ1ZiwgMC4yNjU5NDgxMGYsCisgICAgMC4yNTA2NTU2NmYsIDAuMjM0Mzg5NzZmLCAwLjIxNjkzMTQ2ZiwgMC4xOTc5NjU0NmYsIDAuMTc3MDA3NjlmLCAwLjE1MzI0MzAxZiwKKyAgICAwLjEyNTA4MTUyZiwgMC4wODg0MTcxNWYsIDAuMDAwMDAwMDBmCit9OworCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogaWN2Q2FsY1BHSAorLy8gICAgUHVycG9zZToKKy8vICAgICAgQ2FsY3VsYXRlcyBQR0gocGFpcndpc2UgZ2VvbWV0cmljIGhpc3RvZ3JhbSkgZm9yIGNvbnRvdXIgZ2l2ZW4uCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgY29udG91ciAgLSBwb2ludGVyIHRvIGlucHV0IGNvbnRvdXIgb2JqZWN0LgorLy8gICAgICBwZ2ggICAgICAtIG91dHB1dCBoaXN0b2dyYW0KKy8vICAgICAgYW5nX2RpbSAgLSBudW1iZXIgb2YgYW5nbGUgYmlucyAodmVydGljYWwgc2l6ZSBvZiBoaXN0b2dyYW0pCisvLyAgICAgIGRpc3RfZGltIC0gbnVtYmVyIG9mIGRpc3RhbmNlIGJpbnMgKGhvcml6b250YWwgc2l6ZSBvZiBoaXN0b2dyYW0pCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBDVl9PSyBvciBlcnJvciBjb2RlCisvLyAgICBOb3RlczoKKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkNhbGNQR0goIGNvbnN0IEN2U2VxICogY29udG91ciwgZmxvYXQgKnBnaCwgaW50IGFuZ2xlX2RpbSwgaW50IGRpc3RfZGltICkKK3sKKyAgICBjaGFyIGxvY2FsX2J1ZmZlclsoMSA8PCAxNCkgKyAzMl07CisgICAgZmxvYXQgKmxvY2FsX2J1ZmZlcl9wdHIgPSAoZmxvYXQgKiljdkFsaWduUHRyKGxvY2FsX2J1ZmZlciwzMik7CisgICAgZmxvYXQgKmJ1ZmZlciA9IGxvY2FsX2J1ZmZlcl9wdHI7CisgICAgZG91YmxlIGFuZ2xlX3NjYWxlID0gKGFuZ2xlX2RpbSAtIDAuNTEpIC8gaWN2X2Fjb3NfdGFibGVbMF07CisgICAgZG91YmxlIGRpc3Rfc2NhbGUgPSBEQkxfRVBTSUxPTjsKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgaW50IGksIGNvdW50LCBwYXNzOworICAgIGludCAqcGdoaSA9IChpbnQgKikgcGdoOworICAgIGludCBoaXN0X3NpemUgPSBhbmdsZV9kaW0gKiBkaXN0X2RpbTsKKyAgICBDdlNlcVJlYWRlciByZWFkZXIxLCByZWFkZXIyOyAgICAgICAvKiBleHRlcm5hbCBhbmQgaW50ZXJuYWwgcmVhZGVycyAqLworCisgICAgaWYoICFjb250b3VyIHx8ICFwZ2ggKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICBpZiggYW5nbGVfZGltIDw9IDAgfHwgYW5nbGVfZGltID4gMTgwIHx8IGRpc3RfZGltIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworCisgICAgaWYoICFDVl9JU19TRVFfUE9MWUdPTiggY29udG91ciApKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisKKyAgICBtZW1zZXQoIHBnaCwgMCwgaGlzdF9zaXplICogc2l6ZW9mKCBwZ2hbMF0gKSk7CisKKyAgICBjb3VudCA9IGNvbnRvdXItPnRvdGFsOworCisgICAgLyogYWxsb2NhdGUgYnVmZmVyIGZvciBkaXN0YW5jZXMgKi8KKyAgICBidWZmZXJfc2l6ZSA9IGNvdW50ICogc2l6ZW9mKCBmbG9hdCApOworCisgICAgaWYoIGJ1ZmZlcl9zaXplID4gKGludClzaXplb2YobG9jYWxfYnVmZmVyKSAtIDMyICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IChmbG9hdCAqKSBjdkFsbG9jKCBidWZmZXJfc2l6ZSApOworICAgICAgICBpZiggIWJ1ZmZlciApCisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgIH0KKworICAgIGN2U3RhcnRSZWFkU2VxKCBjb250b3VyLCAmcmVhZGVyMSwgMCApOworICAgIGN2U3RhcnRSZWFkU2VxKCBjb250b3VyLCAmcmVhZGVyMiwgMCApOworCisgICAgLyogY2FsYyAmIHN0b3JlIHNxdWFyZWQgZWRnZSBsZW5ndGhzLCBjYWxjdWxhdGUgbWF4aW1hbCBkaXN0YW5jZSBiZXR3ZWVuIGVkZ2VzICovCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZQb2ludCBwdDEsIHB0MjsKKyAgICAgICAgZG91YmxlIGR4LCBkeTsKKworICAgICAgICBDVl9SRUFEX0VER0UoIHB0MSwgcHQyLCByZWFkZXIxICk7CisKKyAgICAgICAgZHggPSBwdDIueCAtIHB0MS54OworICAgICAgICBkeSA9IHB0Mi55IC0gcHQxLnk7CisgICAgICAgIGJ1ZmZlcltpXSA9IChmbG9hdCkoMS4vc3FydChkeCAqIGR4ICsgZHkgKiBkeSkpOworICAgIH0KKworICAgIC8qIAorICAgICAgIGRvIDIgcGFzc2VzLiAKKyAgICAgICBGaXJzdCBjYWxjdWxhdGVzIG1heGltYWwgZGlzdGFuY2UuCisgICAgICAgU2Vjb25kIGNhbGN1bGF0ZXMgaGlzdG9ncmFtIGl0c2VsZi4KKyAgICAgKi8KKyAgICBmb3IoIHBhc3MgPSAxOyBwYXNzIDw9IDI7IHBhc3MrKyApCisgICAgeworICAgICAgICBkb3VibGUgZGlzdF9jb2VmZiA9IDAsIGFuZ2xlX2NvZWZmID0gMDsKKworICAgICAgICAvKiBydW4gZXh0ZXJuYWwgbG9vcCAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQgcHQxLCBwdDI7CisgICAgICAgICAgICBpbnQgZHgsIGR5OworICAgICAgICAgICAgaW50IGRpc3QgPSAwOworCisgICAgICAgICAgICBDVl9SRUFEX0VER0UoIHB0MSwgcHQyLCByZWFkZXIxICk7CisKKyAgICAgICAgICAgIGR4ID0gcHQyLnggLSBwdDEueDsKKyAgICAgICAgICAgIGR5ID0gcHQyLnkgLSBwdDEueTsKKworICAgICAgICAgICAgaWYoIChkeCB8IGR5KSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgajsKKworICAgICAgICAgICAgICAgIGlmKCBwYXNzID09IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGlzdF9jb2VmZiA9IGJ1ZmZlcltpXSAqIGRpc3Rfc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGFuZ2xlX2NvZWZmID0gYnVmZmVyW2ldICogKF9DVl9BQ09TX1RBQkxFX1NJWkUgLyAyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBydW4gaW50ZXJuYWwgbG9vcCAoZm9yIGN1cnJlbnQgZWRnZSkgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdlBvaW50IHB0MywgcHQ0OworCisgICAgICAgICAgICAgICAgICAgIENWX1JFQURfRURHRSggcHQzLCBwdDQsIHJlYWRlcjIgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggaSAhPSBqICkgICAgICAgIC8qIHByb2Nlc3MgZWRnZSBwYWlyICovCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkMSA9IChwdDMueSAtIHB0MS55KSAqIGR4IC0gKHB0My54IC0gcHQxLngpICogZHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZDIgPSAocHQ0LnkgLSBwdDEueSkgKiBkeCAtIChwdDIueCAtIHB0MS54KSAqIGR5OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyb3NzX2ZsYWc7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmhpc3Rfcm93ID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhc3MgPT0gMiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRwID0gKHB0NC54IC0gcHQzLngpICogZHggKyAocHQ0LnkgLSBwdDMueSkgKiBkeTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwID0gY3ZSb3VuZCggZHAgKiBhbmdsZV9jb2VmZiAqIGJ1ZmZlcltqXSApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9DVl9BQ09TX1RBQkxFX1NJWkUgLyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCA9IE1BWCggZHAsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcCA9IE1JTiggZHAsIF9DVl9BQ09TX1RBQkxFX1NJWkUgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdF9yb3cgPSBwZ2hpICsgZGlzdF9kaW0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJvdW5kKCBpY3ZfYWNvc190YWJsZVtkcF0gKiBhbmdsZV9zY2FsZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBjdlJvdW5kKCBkMSAqIGRpc3RfY29lZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGN2Um91bmQoIGQyICogZGlzdF9jb2VmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjcm9zc19mbGFnID0gKGQxIF4gZDIpIDwgMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBDVl9JQUJTKCBkMSApOworICAgICAgICAgICAgICAgICAgICAgICAgZDIgPSBDVl9JQUJTKCBkMiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGFzcyA9PSAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZDEgPj0gZGlzdF9kaW0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSA9IGRpc3RfZGltIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZDIgPj0gZGlzdF9kaW0gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMiA9IGRpc3RfZGltIC0gMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhY3Jvc3NfZmxhZyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZDEgPiBkMiApICAgLyogbWFrZSBkMSA8PSBkMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkMSBePSBkMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQyIF49IGQxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgXj0gZDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIDsgZDEgPD0gZDI7IGQxKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlzdF9yb3dbZDFdKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggOyBkMSA+PSAwOyBkMS0tICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3Rfcm93W2QxXSsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIDsgZDIgPj0gMDsgZDItLSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaXN0X3Jvd1tkMl0rKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIDFzdCBwYXNzICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEgPSBDVl9JTUFYKCBkMSwgZDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gQ1ZfSU1BWCggZGlzdCwgZDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgLyogZW5kIG9mIHByb2Nlc3Npbmcgb2YgZWRnZSBwYWlyICovCisKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogZW5kIG9mIGludGVybmFsIGxvb3AgKi8KKworICAgICAgICAgICAgICAgIGlmKCBwYXNzID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlID0gZGlzdCAqIGJ1ZmZlcltpXTsKKworICAgICAgICAgICAgICAgICAgICBkaXN0X3NjYWxlID0gTUFYKCBkaXN0X3NjYWxlLCBzY2FsZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGV4dGVybmFsIGxvb3AgKi8KKworICAgICAgICBpZiggcGFzcyA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgZGlzdF9zY2FsZSA9IChkaXN0X2RpbSAtIDAuNTEpIC8gZGlzdF9zY2FsZTsKKyAgICAgICAgfQorCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBwYXNzIG9uIGxvb3BzICovCisKKworICAgIC8qIGNvbnZlcnQgaGlzdCB0byBmbG9hdHMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgaGlzdF9zaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgKChmbG9hdCAqKSBwZ2hpKVtpXSA9IChmbG9hdCkgcGdoaVtpXTsKKyAgICB9CisKKyAgICBpZiggYnVmZmVyICE9IGxvY2FsX2J1ZmZlcl9wdHIgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY1BHSCggY29uc3QgQ3ZTZXEgKiBjb250b3VyLCBDdkhpc3RvZ3JhbSAqIGhpc3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjUEdIIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHNpemVbQ1ZfTUFYX0RJTV07CisgICAgaW50IGRpbXM7CisgICAgCisgICAgaWYoICFDVl9JU19ISVNUKGhpc3QpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIGhpc3RvZ3JhbSBoZWFkZXIgaXMgaW52YWxpZCAiICk7CisKKyAgICBpZiggQ1ZfSVNfU1BBUlNFX0hJU1QoIGhpc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiU3BhcnNlIGhpc3RvZ3JhbSBhcmUgbm90IHN1cHBvcnRlZCIgKTsKKworICAgIGRpbXMgPSBjdkdldERpbXMoIGhpc3QtPmJpbnMsIHNpemUgKTsgCisKKyAgICBpZiggZGltcyAhPSAyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUaGUgaGlzdG9ncmFtIG11c3QgYmUgdHdvLWRpbWVuc2lvbmFsIiApOworCisgICAgaWYoICFDVl9JU19TRVFfUE9MWUdPTiggY29udG91ciApIHx8IENWX1NFUV9FTFRZUEUoIGNvbnRvdXIgKSAhPSBDVl8zMlNDMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBjb250b3VyIGlzIG5vdCB2YWxpZCBvciB0aGUgcG9pbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIiApOworCisgICAgSVBQSV9DQUxMKCBpY3ZDYWxjUEdIKCBjb250b3VyLCAoKEN2TWF0TkQqKShoaXN0LT5iaW5zKSktPmRhdGEuZmwsIHNpemVbMF0sIHNpemVbMV0gKSk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2cG9zaXQuY3BwIGIvY3Yvc3JjL2N2cG9zaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZGE0NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Zwb3NpdC5jcHAKQEAgLTAsMCArMSwzNzggQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCisvKiBQT1NJVCBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBDdlBPU0lUT2JqZWN0Cit7CisgICAgaW50IE47CisgICAgZmxvYXQqIGludl9tYXRyOworICAgIGZsb2F0KiBvYmpfdmVjczsKKyAgICBmbG9hdCogaW1nX3ZlY3M7Cit9OworCitzdGF0aWMgdm9pZCBpY3ZQc2V1ZG9JbnZlcnNlM0QoIGZsb2F0ICphLCBmbG9hdCAqYiwgaW50IG4sIGludCBtZXRob2QgKTsKKworc3RhdGljICBDdlN0YXR1cyAgaWN2Q3JlYXRlUE9TSVRPYmplY3QoIEN2UG9pbnQzRDMyZiAqcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQT1NJVE9iamVjdCAqKnBwT2JqZWN0ICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIENvbXB1dGUgc2l6ZSBvZiByZXF1aXJlZCBtZW1vcnkgKi8KKyAgICAvKiBidWZmZXIgZm9yIGludmVyc2UgbWF0cml4ID0gTiozKmZsb2F0ICovCisgICAgLyogYnVmZmVyIGZvciBzdG9yaW5nIHdlYWtJbWFnZVBvaW50cyA9IG51bVBvaW50cyAqIDIgKiBmbG9hdCAqLworICAgIC8qIGJ1ZmZlciBmb3Igc3RvcmluZyBvYmplY3QgdmVjdG9ycyA9IE4qMypmbG9hdCAqLworICAgIC8qIGJ1ZmZlciBmb3Igc3RvcmluZyBpbWFnZSB2ZWN0b3JzID0gTioyKmZsb2F0ICovCisKKyAgICBpbnQgTiA9IG51bVBvaW50cyAtIDE7CisgICAgaW50IGludl9tYXRyX3NpemUgPSBOICogMyAqIHNpemVvZiggZmxvYXQgKTsKKyAgICBpbnQgb2JqX3ZlY19zaXplID0gaW52X21hdHJfc2l6ZTsKKyAgICBpbnQgaW1nX3ZlY19zaXplID0gTiAqIDIgKiBzaXplb2YoIGZsb2F0ICk7CisgICAgQ3ZQT1NJVE9iamVjdCAqcE9iamVjdDsKKworICAgIC8qIGNoZWNrIGJhZCBhcmd1bWVudHMgKi8KKyAgICBpZiggcG9pbnRzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIG51bVBvaW50cyA8IDQgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIHBwT2JqZWN0ID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIHBPYmplY3QgPSAoQ3ZQT1NJVE9iamVjdCAqKSBjdkFsbG9jKCBzaXplb2YoIEN2UE9TSVRPYmplY3QgKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludl9tYXRyX3NpemUgKyBvYmpfdmVjX3NpemUgKyBpbWdfdmVjX3NpemUgKTsKKworICAgIGlmKCAhcE9iamVjdCApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisKKyAgICAvKiBwYXJ0IHRoZSBtZW1vcnkgYmV0d2VlbiBhbGwgc3RydWN0dXJlcyAqLworICAgIHBPYmplY3QtPk4gPSBOOworICAgIHBPYmplY3QtPmludl9tYXRyID0gKGZsb2F0ICopICgoY2hhciAqKSBwT2JqZWN0ICsgc2l6ZW9mKCBDdlBPU0lUT2JqZWN0ICkpOworICAgIHBPYmplY3QtPm9ial92ZWNzID0gKGZsb2F0ICopICgoY2hhciAqKSAocE9iamVjdC0+aW52X21hdHIpICsgaW52X21hdHJfc2l6ZSk7CisgICAgcE9iamVjdC0+aW1nX3ZlY3MgPSAoZmxvYXQgKikgKChjaGFyICopIChwT2JqZWN0LT5vYmpfdmVjcykgKyBvYmpfdmVjX3NpemUpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgQ29uc3RydWN0IG9iamVjdCB2ZWN0b3JzIGZyb20gb2JqZWN0IHBvaW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50cyAtIDE7IGkrKyApCisgICAgeworICAgICAgICBwT2JqZWN0LT5vYmpfdmVjc1tpXSA9IHBvaW50c1tpICsgMV0ueCAtIHBvaW50c1swXS54OworICAgICAgICBwT2JqZWN0LT5vYmpfdmVjc1tOICsgaV0gPSBwb2ludHNbaSArIDFdLnkgLSBwb2ludHNbMF0ueTsKKyAgICAgICAgcE9iamVjdC0+b2JqX3ZlY3NbMiAqIE4gKyBpXSA9IHBvaW50c1tpICsgMV0ueiAtIHBvaW50c1swXS56OworICAgIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgIENvbXB1dGUgcHNldWRvaW52ZXJzZSBtYXRyaXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpY3ZQc2V1ZG9JbnZlcnNlM0QoIHBPYmplY3QtPm9ial92ZWNzLCBwT2JqZWN0LT5pbnZfbWF0ciwgTiwgMCApOworCisgICAgKnBwT2JqZWN0ID0gcE9iamVjdDsKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKK3N0YXRpYyAgQ3ZTdGF0dXMgIGljdlBPU0lUKCBDdlBPU0lUT2JqZWN0ICpwT2JqZWN0LCBDdlBvaW50MkQzMmYgKmltYWdlUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZvY2FsTGVuZ3RoLCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgcm90YXRpb24sIEN2VmVjdDMyZiB0cmFuc2xhdGlvbiApCit7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IGNvdW50ID0gMCwgY29udmVyZ2VkID0gMDsKKyAgICBmbG9hdCBpbm9ybSwgam5vcm0sIGludklub3JtLCBpbnZKbm9ybSwgaW52U2NhbGUsIHNjYWxlID0gMCwgaW52X1ogPSAwOworICAgIGZsb2F0IGRpZmYgPSAoZmxvYXQpY3JpdGVyaWEuZXBzaWxvbjsKKyAgICBmbG9hdCBpbnZfZm9jYWxMZW5ndGggPSAxIC8gZm9jYWxMZW5ndGg7CisKKyAgICAvKiBpbml0IHZhcmlhYmxlcyAqLworICAgIGludCBOID0gcE9iamVjdC0+TjsKKyAgICBmbG9hdCAqb2JqZWN0VmVjdG9ycyA9IHBPYmplY3QtPm9ial92ZWNzOworICAgIGZsb2F0ICppbnZNYXRyaXggPSBwT2JqZWN0LT5pbnZfbWF0cjsKKyAgICBmbG9hdCAqaW1nVmVjdG9ycyA9IHBPYmplY3QtPmltZ192ZWNzOworCisgICAgLyogQ2hlY2sgYmFkIGFyZ3VtZW50cyAqLworICAgIGlmKCBpbWFnZVBvaW50cyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBwT2JqZWN0ID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIGZvY2FsTGVuZ3RoIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICBpZiggIXJvdGF0aW9uICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCAhdHJhbnNsYXRpb24gKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIChjcml0ZXJpYS50eXBlID09IDApIHx8IChjcml0ZXJpYS50eXBlID4gKENWX1RFUk1DUklUX0lURVIgfCBDVl9URVJNQ1JJVF9FUFMpKSkKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworICAgIGlmKCAoY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0VQUykgJiYgY3JpdGVyaWEuZXBzaWxvbiA8IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICBpZiggKGNyaXRlcmlhLnR5cGUgJiBDVl9URVJNQ1JJVF9JVEVSKSAmJiBjcml0ZXJpYS5tYXhfaXRlciA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICB3aGlsZSggIWNvbnZlcmdlZCApCisgICAgeworICAgICAgICBpZiggY291bnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIHN1YnRyYWN0IG91dCBvcmlnaW4gdG8gZ2V0IGltYWdlIHZlY3RvcnMgKi8KKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGltZ1ZlY3RvcnNbaV0gPSBpbWFnZVBvaW50c1tpICsgMV0ueCAtIGltYWdlUG9pbnRzWzBdLng7CisgICAgICAgICAgICAgICAgaW1nVmVjdG9yc1tOICsgaV0gPSBpbWFnZVBvaW50c1tpICsgMV0ueSAtIGltYWdlUG9pbnRzWzBdLnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkaWZmID0gMDsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgbmV3IFNPUCAoc2NhbGVkIG9ydGhvZ3JhdGhpYyBwcm9qZWN0aW9uKSBpbWFnZSBmcm9tIHBvc2UgKi8KKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIG9iamVjdFZlY3RvciAqIGsgKi8KKyAgICAgICAgICAgICAgICBmbG9hdCBvbGQ7CisgICAgICAgICAgICAgICAgZmxvYXQgdG1wID0gb2JqZWN0VmVjdG9yc1tpXSAqIHJvdGF0aW9uWzZdIC8qWzJdWzBdKi8gKworICAgICAgICAgICAgICAgICAgICBvYmplY3RWZWN0b3JzW04gKyBpXSAqIHJvdGF0aW9uWzddICAgICAvKlsyXVsxXSovICsKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0VmVjdG9yc1syICogTiArIGldICogcm90YXRpb25bOF0gLypbMl1bMl0qLzsKKworICAgICAgICAgICAgICAgIHRtcCAqPSBpbnZfWjsKKyAgICAgICAgICAgICAgICB0bXAgKz0gMTsKKworICAgICAgICAgICAgICAgIG9sZCA9IGltZ1ZlY3RvcnNbaV07CisgICAgICAgICAgICAgICAgaW1nVmVjdG9yc1tpXSA9IGltYWdlUG9pbnRzW2kgKyAxXS54ICogdG1wIC0gaW1hZ2VQb2ludHNbMF0ueDsKKworICAgICAgICAgICAgICAgIGRpZmYgPSBNQVgoIGRpZmYsIChmbG9hdCkgZmFicyggaW1nVmVjdG9yc1tpXSAtIG9sZCApKTsKKworICAgICAgICAgICAgICAgIG9sZCA9IGltZ1ZlY3RvcnNbTiArIGldOworICAgICAgICAgICAgICAgIGltZ1ZlY3RvcnNbTiArIGldID0gaW1hZ2VQb2ludHNbaSArIDFdLnkgKiB0bXAgLSBpbWFnZVBvaW50c1swXS55OworCisgICAgICAgICAgICAgICAgZGlmZiA9IE1BWCggZGlmZiwgKGZsb2F0KSBmYWJzKCBpbWdWZWN0b3JzW04gKyBpXSAtIG9sZCApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGNhbGN1bGF0ZSBJIGFuZCBKIHZlY3RvcnMgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvdGF0aW9uWzMqaStqXSAvKltpXVtqXSovID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgTjsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uWzMqaStqXSAvKltpXVtqXSovICs9IGludk1hdHJpeFtqICogTiArIGtdICogaW1nVmVjdG9yc1tpICogTiArIGtdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlub3JtID0gcm90YXRpb25bMF0gLypbMF1bMF0qLyAqIHJvdGF0aW9uWzBdIC8qWzBdWzBdKi8gKworICAgICAgICAgICAgICAgIHJvdGF0aW9uWzFdIC8qWzBdWzFdKi8gKiByb3RhdGlvblsxXSAvKlswXVsxXSovICsgCisgICAgICAgICAgICAgICAgcm90YXRpb25bMl0gLypbMF1bMl0qLyAqIHJvdGF0aW9uWzJdIC8qWzBdWzJdKi87CisKKyAgICAgICAgam5vcm0gPSByb3RhdGlvblszXSAvKlsxXVswXSovICogcm90YXRpb25bM10gLypbMV1bMF0qLyArCisgICAgICAgICAgICAgICAgcm90YXRpb25bNF0gLypbMV1bMV0qLyAqIHJvdGF0aW9uWzRdIC8qWzFdWzFdKi8gKyAKKyAgICAgICAgICAgICAgICByb3RhdGlvbls1XSAvKlsxXVsyXSovICogcm90YXRpb25bNV0gLypbMV1bMl0qLzsKKworICAgICAgICBpbnZJbm9ybSA9IGN2SW52U3FydCggaW5vcm0gKTsKKyAgICAgICAgaW52Sm5vcm0gPSBjdkludlNxcnQoIGpub3JtICk7CisKKyAgICAgICAgaW5vcm0gKj0gaW52SW5vcm07CisgICAgICAgIGpub3JtICo9IGludkpub3JtOworCisgICAgICAgIHJvdGF0aW9uWzBdIC8qWzBdWzBdKi8gKj0gaW52SW5vcm07CisgICAgICAgIHJvdGF0aW9uWzFdIC8qWzBdWzFdKi8gKj0gaW52SW5vcm07CisgICAgICAgIHJvdGF0aW9uWzJdIC8qWzBdWzJdKi8gKj0gaW52SW5vcm07CisKKyAgICAgICAgcm90YXRpb25bM10gLypbMV1bMF0qLyAqPSBpbnZKbm9ybTsKKyAgICAgICAgcm90YXRpb25bNF0gLypbMV1bMV0qLyAqPSBpbnZKbm9ybTsKKyAgICAgICAgcm90YXRpb25bNV0gLypbMV1bMl0qLyAqPSBpbnZKbm9ybTsKKworICAgICAgICAvKiByb3cyID0gcm93MCB4IHJvdzEgKGNyb3NzIHByb2R1Y3QpICovCisgICAgICAgIHJvdGF0aW9uWzZdIC8qLT5tWzJdWzBdKi8gPSByb3RhdGlvblsxXSAvKi0+bVswXVsxXSovICogcm90YXRpb25bNV0gLyotPm1bMV1bMl0qLyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblsyXSAvKi0+bVswXVsyXSovICogcm90YXRpb25bNF0gLyotPm1bMV1bMV0qLzsKKyAgICAgICAgCisgICAgICAgIHJvdGF0aW9uWzddIC8qLT5tWzJdWzFdKi8gPSByb3RhdGlvblsyXSAvKi0+bVswXVsyXSovICogcm90YXRpb25bM10gLyotPm1bMV1bMF0qLyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblswXSAvKi0+bVswXVswXSovICogcm90YXRpb25bNV0gLyotPm1bMV1bMl0qLzsKKyAgICAgICAgCisgICAgICAgIHJvdGF0aW9uWzhdIC8qLT5tWzJdWzJdKi8gPSByb3RhdGlvblswXSAvKi0+bVswXVswXSovICogcm90YXRpb25bNF0gLyotPm1bMV1bMV0qLyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvblsxXSAvKi0+bVswXVsxXSovICogcm90YXRpb25bM10gLyotPm1bMV1bMF0qLzsKKworICAgICAgICBzY2FsZSA9IChpbm9ybSArIGpub3JtKSAvIDIuMGY7CisgICAgICAgIGludl9aID0gc2NhbGUgKiBpbnZfZm9jYWxMZW5ndGg7CisKKyAgICAgICAgY291bnQrKzsKKyAgICAgICAgY29udmVyZ2VkID0gKChjcml0ZXJpYS50eXBlICYgQ1ZfVEVSTUNSSVRfRVBTKSAmJiAoZGlmZiA8IGNyaXRlcmlhLmVwc2lsb24pKTsKKyAgICAgICAgY29udmVyZ2VkIHw9ICgoY3JpdGVyaWEudHlwZSAmIENWX1RFUk1DUklUX0lURVIpICYmIChjb3VudCA9PSBjcml0ZXJpYS5tYXhfaXRlcikpOworICAgIH0KKyAgICBpbnZTY2FsZSA9IDEgLyBzY2FsZTsKKyAgICB0cmFuc2xhdGlvblswXSA9IGltYWdlUG9pbnRzWzBdLnggKiBpbnZTY2FsZTsKKyAgICB0cmFuc2xhdGlvblsxXSA9IGltYWdlUG9pbnRzWzBdLnkgKiBpbnZTY2FsZTsKKyAgICB0cmFuc2xhdGlvblsyXSA9IDEgLyBpbnZfWjsKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworc3RhdGljICBDdlN0YXR1cyAgaWN2UmVsZWFzZVBPU0lUT2JqZWN0KCBDdlBPU0lUT2JqZWN0ICoqIHBwT2JqZWN0ICkKK3sKKyAgICBjdkZyZWUoIHBwT2JqZWN0ICk7CisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICAgICBpY3ZQc2V1ZG9JbnZlcnNlM0QgICAgIAorLy8gICAgUHVycG9zZTogICAgUHNldWRvaW52ZXJzZSBOIHggMyBtYXRyaXggICAgIE4gPj0gMworLy8gICAgQ29udGV4dDogICAKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgICAgICBhIC0gaW5wdXQgbWF0cml4CisvLyAgICAgICAgICAgICAgICBiIC0gcHNldWRvaW52ZXJzZWQgYQorLy8gICAgICAgICAgICAgICAgbiAtIG51bWJlciBvZiByb3dzIGluIGEKKy8vICAgICAgICAgICAgICAgIG1ldGhvZCAtIGlmIDAsIHRoZW4gYiA9IGludih0cmFuc3Bvc2UoYSkqYSkgKiB0cmFuc3Bvc2UoYSkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGlmIDEsIHRoZW4gU1ZEIHVzZWQuCisvLyAgICBSZXR1cm5zOiAgIAorLy8gICAgTm90ZXM6ICAgICAgQm90aCBtYXRyaXggYXJlIHN0b3JlZCBieSBuLWRpbWVuc2lvbmFsIHZlY3RvcnMuCisvLyAgICAgICAgICAgICAgICBOb3cgb25seSBtZXRob2QgPT0gMCBzdXBwb3J0ZWQuCisvL0YqLwordm9pZAoraWN2UHNldWRvSW52ZXJzZTNEKCBmbG9hdCAqYSwgZmxvYXQgKmIsIGludCBuLCBpbnQgbWV0aG9kICkKK3sKKyAgICBpbnQgazsKKworICAgIGlmKCBtZXRob2QgPT0gMCApCisgICAgeworICAgICAgICBmbG9hdCBhdGEwMCA9IDA7CisgICAgICAgIGZsb2F0IGF0YTExID0gMDsKKyAgICAgICAgZmxvYXQgYXRhMjIgPSAwOworICAgICAgICBmbG9hdCBhdGEwMSA9IDA7CisgICAgICAgIGZsb2F0IGF0YTAyID0gMDsKKyAgICAgICAgZmxvYXQgYXRhMTIgPSAwOworICAgICAgICBmbG9hdCBkZXQgPSAwOworCisgICAgICAgIC8qIGNvbXB1dGUgbWF0cml4IGF0YSA9IHRyYW5zcG9zZShhKSAqIGEgICovCisgICAgICAgIGZvciggayA9IDA7IGsgPCBuOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBhMCA9IGFba107CisgICAgICAgICAgICBmbG9hdCBhMSA9IGFbbiArIGtdOworICAgICAgICAgICAgZmxvYXQgYTIgPSBhWzIgKiBuICsga107CisKKyAgICAgICAgICAgIGF0YTAwICs9IGEwICogYTA7CisgICAgICAgICAgICBhdGExMSArPSBhMSAqIGExOworICAgICAgICAgICAgYXRhMjIgKz0gYTIgKiBhMjsKKworICAgICAgICAgICAgYXRhMDEgKz0gYTAgKiBhMTsKKyAgICAgICAgICAgIGF0YTAyICs9IGEwICogYTI7CisgICAgICAgICAgICBhdGExMiArPSBhMSAqIGEyOworICAgICAgICB9CisgICAgICAgIC8qIGludmVyc2UgbWF0cml4IGF0YSAqLworICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBpbnZfZGV0OworICAgICAgICAgICAgZmxvYXQgcDAwID0gYXRhMTEgKiBhdGEyMiAtIGF0YTEyICogYXRhMTI7CisgICAgICAgICAgICBmbG9hdCBwMDEgPSAtKGF0YTAxICogYXRhMjIgLSBhdGExMiAqIGF0YTAyKTsKKyAgICAgICAgICAgIGZsb2F0IHAwMiA9IGF0YTEyICogYXRhMDEgLSBhdGExMSAqIGF0YTAyOworCisgICAgICAgICAgICBmbG9hdCBwMTEgPSBhdGEwMCAqIGF0YTIyIC0gYXRhMDIgKiBhdGEwMjsKKyAgICAgICAgICAgIGZsb2F0IHAxMiA9IC0oYXRhMDAgKiBhdGExMiAtIGF0YTAxICogYXRhMDIpOworICAgICAgICAgICAgZmxvYXQgcDIyID0gYXRhMDAgKiBhdGExMSAtIGF0YTAxICogYXRhMDE7CisKKyAgICAgICAgICAgIGRldCArPSBhdGEwMCAqIHAwMDsKKyAgICAgICAgICAgIGRldCArPSBhdGEwMSAqIHAwMTsKKyAgICAgICAgICAgIGRldCArPSBhdGEwMiAqIHAwMjsKKworICAgICAgICAgICAgaW52X2RldCA9IDEgLyBkZXQ7CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgcmVzdWx0YW50IG1hdHJpeCAqLworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG47IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgYTAgPSBhW2tdOworICAgICAgICAgICAgICAgIGZsb2F0IGExID0gYVtuICsga107CisgICAgICAgICAgICAgICAgZmxvYXQgYTIgPSBhWzIgKiBuICsga107CisKKyAgICAgICAgICAgICAgICBiW2tdID0gKHAwMCAqIGEwICsgcDAxICogYTEgKyBwMDIgKiBhMikgKiBpbnZfZGV0OworICAgICAgICAgICAgICAgIGJbbiArIGtdID0gKHAwMSAqIGEwICsgcDExICogYTEgKyBwMTIgKiBhMikgKiBpbnZfZGV0OworICAgICAgICAgICAgICAgIGJbMiAqIG4gKyBrXSA9IChwMDIgKiBhMCArIHAxMiAqIGExICsgcDIyICogYTIpICogaW52X2RldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qaWYgKCBtZXRob2QgPT0gMSApCisgICAgICAgeworICAgICAgIH0KKyAgICAgKi8KKworICAgIHJldHVybjsKK30KKworQ1ZfSU1QTCBDdlBPU0lUT2JqZWN0ICoKK2N2Q3JlYXRlUE9TSVRPYmplY3QoIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IG51bVBvaW50cyApCit7CisgICAgQ3ZQT1NJVE9iamVjdCAqcE9iamVjdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlUE9TSVRPYmplY3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBJUFBJX0NBTEwoIGljdkNyZWF0ZVBPU0lUT2JqZWN0KCBwb2ludHMsIG51bVBvaW50cywgJnBPYmplY3QgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHBPYmplY3Q7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlBPU0lUKCBDdlBPU0lUT2JqZWN0ICogcE9iamVjdCwgQ3ZQb2ludDJEMzJmICogaW1hZ2VQb2ludHMsCisgICAgICAgICBkb3VibGUgZm9jYWxMZW5ndGgsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhLAorICAgICAgICAgQ3ZNYXRyMzJmIHJvdGF0aW9uLCBDdlZlY3QzMmYgdHJhbnNsYXRpb24gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZQT1NJVCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIElQUElfQ0FMTCggaWN2UE9TSVQoIHBPYmplY3QsIGltYWdlUG9pbnRzLChmbG9hdCkgZm9jYWxMZW5ndGgsIGNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLCB0cmFuc2xhdGlvbiApKTsKKworICAgIF9fRU5EX187Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlUE9TSVRPYmplY3QoIEN2UE9TSVRPYmplY3QgKiogcHBPYmplY3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlUE9TSVRPYmplY3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBJUFBJX0NBTEwoIGljdlJlbGVhc2VQT1NJVE9iamVjdCggcHBPYmplY3QgKSk7CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnByZWNvbXAuY3BwIGIvY3Yvc3JjL2N2cHJlY29tcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwNGIxNwotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnByZWNvbXAuY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2cHlyYW1pZHMuY3BwIGIvY3Yvc3JjL2N2cHlyYW1pZHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOWMwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZweXJhbWlkcy5jcHAKQEAgLTAsMCArMSwxMjg0IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICBEb3duLXNhbXBsaW5nIHB5cmFtaWRzIGNvcmUgZnVuY3Rpb25zCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vLy8vLy8vLy8vIEZpbHRlcmluZyBtYWNyb3MgLy8vLy8vLy8vLy8vLworCisvKiBDT01NT04gQ0FTRSAqLworLyogMS8xNlsxICAgIDQgICAgNiAgICA0ICAgIDFdICAgICAgICovCisvKiAuLi58IHgwIHwgeDEgfCB4MiB8IHgzIHwgeDQgfC4uLiAgKi8KKyNkZWZpbmUgIFBEX0ZJTFRFUiggeDAsIHgxLCB4MiwgeDMsIHg0ICkgKCh4MikqNisoKHgxKSsoeDMpKSo0Kyh4MCkrKHg0KSkKKworLyogTUFDUk9TIEZPUiBCT1JERVJTICovCisKKy8qIHwgYiBJIGEgfCBiIHwgcmVmbGVjdGlvbiB1c2VkICgiSSIgZGVub3RlcyB0aGUgaW1hZ2UgYm91bmRhcnkpICovCisKKy8qIExFRlQvVE9QICovCisvKiAxLzE2WzEgICAgNCAgICA2ICAgIDQgICAgMV0gICAgICAgKi8KKy8qICAgIHwgeDIgfCB4MSBJIHgwIHwgeDEgfCB4MiB8Li4uICAqLworI2RlZmluZSAgUERfTFQoeDAseDEseDIpICAgICAgICAgICAgICAgICAoKHgwKSo2ICsgKHgxKSo4ICsgKHgyKSoyKQorCisvKiBSSUdIVC9CT1RUT00gKi8KKy8qIDEvMTZbMSAgICA0ICAgIDYgICAgNCAgICAxXSAgICAgICAqLworLyogLi4ufCB4MCB8IHgxIHwgeDIgfCB4MyBJIHgyIHwgICAgICovCisjZGVmaW5lICBQRF9SQih4MCx4MSx4Mix4MykgICAgICAgICAgICAgICgoeDApICsgKCh4MSkgKyAoeDMpKSo0ICsgKHgyKSo3KQorCisvKiBTSU5HVUxBUiBDQVNFICggd2lkdGggPT0gMiB8fCBoZWlnaHQgPT0gMiApICovCisvKiAxLzE2WzEgICAgNCAgICA2ICAgIDQgICAgMV0gICAgICAgKi8KKy8qICAgIHwgeDAgfCB4MSBJIHgwIHwgeDEgSSB4MCB8ICAgICAqLworI2RlZmluZSAgUERfU0lOR1VMQVIoeDAseDEpICAgICgoKHgwKSArICh4MSkpKjgpCisKKyNkZWZpbmUgIFBEX1NDQUxFX0lOVCh4KSAgICAgICAoKCh4KSArICgxPDw3KSkgPj4gOCkKKyNkZWZpbmUgIFBEX1NDQUxFX0ZMVCh4KSAgICAgICAoKHgpKjAuMDAzOTA2MjVmKQorCisjZGVmaW5lICBQRF9TWiAgNQorCisvLy8vLy8vLy8vIGdlbmVyaWMgbWFjcm8gLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX0RFRl9QWVJfRE9XTl9GVU5DKCBmbGF2b3IsIHR5cGUsIHdvcmt0eXBlLCBfcGRfc2NhbGVfICkgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2UHlyRG93bkc1eDVfIyNmbGF2b3IjI19DblIoIGNvbnN0IHR5cGUqIHNyYywgaW50IHNyY3N0ZXAsIHR5cGUqIGRzdCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIHZvaWQgKmJ1ZiwgaW50IENzICkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlKiAgYnVmZmVyID0gKHdvcmt0eXBlKilidWY7ICAvKiBwb2ludGVyIHRvIHRlbXBvcmFyeSBidWZmZXIgKi8gICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSogIHJvd3NbUERfU1pdOyAvKiBhcnJheSBvZiByb3dzIHBvaW50ZXJzLiBkaW0ocm93cykgaXMgUERfU1ogKi8gICAgICAgICAgICBcCisgICAgaW50ICB5LCB0b3Bfcm93ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgV2QgPSBzaXplLndpZHRoLzIsIFdkbiA9IFdkKkNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgIGJ1ZmZlcl9zdGVwID0gV2RuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICBwZF9zeiA9IChQRF9TWiArIDEpKmJ1ZmZlcl9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgZnN0ID0gMCwgbHN0ID0gc2l6ZS5oZWlnaHQgPD0gUERfU1ovMiA/IHNpemUuaGVpZ2h0IDogUERfU1ovMiArIDE7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCBDcyA9PSAxIHx8IENzID09IDMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7IGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogbWFpbiBsb29wICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSAyLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHNldCBmaXJzdCBhbmQgbGFzdCBpbmRpY2VzIG9mIGJ1ZmZlciByb3dzIHdoaWNoIGFyZSBuZWVkIHRvIGJlIGZpbGxlZCAqLyAgICAgXAorICAgICAgICBpbnQgeCwgeTEsIGsgPSB0b3Bfcm93OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHgxID0gYnVmZmVyX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlICpyb3cwMSwgKnJvdzIzLCAqcm93NDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogYXNzaWduIHJvd3MgcG9pbnRlcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeTEgPSAwOyB5MSA8IFBEX1NaOyB5MSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJvd3NbeTFdID0gYnVmZmVyICsgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBrICs9IGJ1ZmZlcl9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgayAmPSBrIDwgcGRfc3ogPyAtMSA6IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByb3cwMSA9IHJvd3NbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcm93MjMgPSByb3dzWzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJvdzQgID0gcm93c1s0XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogZmlsbCBuZXcgYnVmZmVyIHJvd3Mgd2l0aCBmaWx0ZXJlZCBzb3VyY2UgKGhvcml6b250YWwgY29udikgKi8gICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBDcyA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBzaXplLndpZHRoID4gUERfU1ovMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCB5MSA9IGZzdDsgeTEgPCBsc3Q7IHkxKyssIHNyYyArPSBzcmNzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUgKnJvdyA9IHJvd3NbeTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGxlZnQgJiByaWdodCBib3VuZHMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcm93WzBdICAgID0gUERfTFQoIHNyY1swXSwgc3JjWzFdLCBzcmNbMl0gKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJvd1tXZC0xXSA9IFBEX1JCKCBzcmNbV2QqMi00XSwgc3JjW1dkKjItM10sICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW1dkKjItMl0sIHNyY1tXZCoyLTFdKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXIgcG9pbnRzIChldmVuKSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDE7IHggPCBXZCAtIDE7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1t4XSA9IFBEX0ZJTFRFUiggc3JjWzIqeC0yXSwgc3JjWzIqeC0xXSwgc3JjWzIqeF0sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1syKngrMV0sIHNyY1syKngrMl0gKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggeTEgPSBmc3Q7IHkxIDwgbHN0OyB5MSsrLCBzcmMgKz0gc3Jjc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJvd3NbeTFdWzBdID0gUERfU0lOR1VMQVIoIHNyY1swXSwgc3JjWzFdICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgLyogQ3MgPT0gMyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggeTEgPSBmc3Q7IHkxIDwgbHN0OyB5MSsrLCBzcmMgKz0gc3Jjc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlICpyb3cgPSByb3dzW3kxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIHNpemUud2lkdGggPiBQRF9TWi8yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggYyA9IDA7IGMgPCAzOyBjKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgbGVmdCAmIHJpZ2h0IGJvdW5kcyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbY10gPSBQRF9MVCggc3JjW2NdLCBzcmNbMytjXSwgc3JjWzYrY10gKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm93W1dkbi0zK2NdID0gUERfUkIoIHNyY1tXZG4qMi0xMitjXSwgc3JjW1dkbioyLTkrY10sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbV2RuKjItNitjXSwgc3JjW1dkbioyLTMrY10gKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAvKiBvdGhlciBwb2ludHMgKGV2ZW4pICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMzsgeCA8IFdkbiAtIDM7IHggKz0gMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm93W3hdICAgPSBQRF9GSUxURVIoIHNyY1syKngtNl0sIHNyY1syKngtM10sIHNyY1syKnhdLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbMip4KzNdLCBzcmNbMip4KzZdICk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbeCsxXSA9IFBEX0ZJTFRFUiggc3JjWzIqeC01XSwgc3JjWzIqeC0yXSwgc3JjWzIqeCsxXSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1syKngrNF0sIHNyY1syKngrN10gKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1t4KzJdID0gUERfRklMVEVSKCBzcmNbMip4LTRdLCBzcmNbMip4LTFdLCBzcmNbMip4KzJdLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWzIqeCs1XSwgc3JjWzIqeCs4XSApOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAvKiBzaXplLndpZHRoIDw9IFBEX1NaLzIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcm93WzBdID0gUERfU0lOR1VMQVIoIHNyY1swXSwgc3JjWzNdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJvd1sxXSA9IFBEX1NJTkdVTEFSKCBzcmNbMV0sIHNyY1s0XSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByb3dbMl0gPSBQRF9TSU5HVUxBUiggc3JjWzJdLCBzcmNbNV0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHNlY29uZCBwYXNzLiBEbyB2ZXJ0aWNhbCBjb252IGFuZCB3cml0ZSByZXN1bHRzIGRvIGRlc3RpbmF0aW9uIGltYWdlICovICAgICAgXAorICAgICAgICBpZiggeSA+IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggeSA8IHNpemUuaGVpZ2h0IC0gUERfU1ovMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KyssIHgxKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcGRfc2NhbGVfKCBQRF9GSUxURVIoIHJvdzAxW3hdLCAgcm93MDFbeDFdLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93MjNbeF0sIHJvdzIzW3gxXSwgcm93NFt4XSApKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRvcF9yb3cgKz0gMipidWZmZXJfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3Bfcm93ICY9IHRvcF9yb3cgPCBwZF9zeiA/IC0xIDogMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAvKiBib3R0b20gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KyssIHgxKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9ICh0eXBlKV9wZF9zY2FsZV8oIFBEX1JCKCByb3cwMVt4XSwgcm93MDFbeDFdLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93MjNbeF0sIHJvdzIzW3gxXSkpOyAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBzaXplLmhlaWdodCA+IFBEX1NaLzIgKSAvKiB0b3AgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBXZG47IHgrKywgeDErKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3hdID0gKHR5cGUpX3BkX3NjYWxlXyggUERfTFQoIHJvdzAxW3hdLCByb3cwMVt4MV0sIHJvdzIzW3hdICkpOyBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAvKiBzaXplLmhlaWdodCA8PSBQRF9TWi8yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IFdkbjsgeCsrLCB4MSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcGRfc2NhbGVfKCBQRF9TSU5HVUxBUiggcm93MDFbeF0sIHJvdzAxW3gxXSApKTsgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmc3QgPSBQRF9TWiAtIDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxzdCA9IHkgKyAyICsgUERfU1ovMiA8IHNpemUuaGVpZ2h0ID8gUERfU1ogOiBzaXplLmhlaWdodCAtIHk7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfUFlSX0RPV05fRlVOQyggOHUsIHVjaGFyLCBpbnQsIFBEX1NDQUxFX0lOVCApCitJQ1ZfREVGX1BZUl9ET1dOX0ZVTkMoIDE2cywgc2hvcnQsIGludCwgUERfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX0RPV05fRlVOQyggMTZ1LCB1c2hvcnQsIGludCwgUERfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX0RPV05fRlVOQyggMzJmLCBmbG9hdCwgZmxvYXQsIFBEX1NDQUxFX0ZMVCApCitJQ1ZfREVGX1BZUl9ET1dOX0ZVTkMoIDY0ZiwgZG91YmxlLCBkb3VibGUsIFBEX1NDQUxFX0ZMVCApCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVcC1zYW1wbGluZyBweXJhbWlkcyBjb3JlIGZ1bmN0aW9ucworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLy8vLy8vLy8vIGZpbHRlcmluZyBtYWNyb3MgLy8vLy8vLy8vLy8vLy8KKworLyogQ09NTU9OIENBU0U6IE5PTiBaRVJPICovCisvKiAxLzE2WzEgICAgNCAgIDYgICAgNCAgIDFdICAgICAgICovCisvKiAuLi58IHgwIHwgMCB8IHgxIHwgMCB8IHgyIHwuLi4gICovCisjZGVmaW5lICBQVV9GSUxURVIoIHgwLCB4MSwgeDIgKSAgICAgICAgICgoeDEpKjYgKyAoeDApICsgKHgyKSkKKworLyogWkVSTyBQT0lOVCBBVCBDRU5URVIgKi8KKy8qIDEvMTZbMSAgIDQgICAgNiAgIDQgICAgMV0gICAgICAqLworLyogLi4ufCAwIHwgeDAgfCAwIHwgeDEgfCAwIHwuLi4gICovCisjZGVmaW5lICBQVV9GSUxURVJfWkkoIHgwLCB4MSApICAgICAgICAgICgoKHgwKSArICh4MSkpKjQpCisKKy8qIE1BQ1JPUyBGT1IgQk9SREVSUyAqLworCisvKiB8IGIgSSBhIHwgYiB8IHJlZmxlY3Rpb24gKi8KKworLyogTEVGVC9UT1AgKi8KKy8qIDEvMTZbMSAgICA0ICAgNiAgICA0ICAgMV0gICAgICAgKi8KKy8qICAgIHwgeDEgfCAwIEkgeDAgfCAwIHwgeDEgfC4uLiAgKi8KKyNkZWZpbmUgIFBVX0xUKCB4MCwgeDEgKSAgICAgICAgICAgICAgICAgKCh4MCkqNiArICh4MSkqMikKKworLyogMS8xNlsxICAgNCAgICA2ICAgNCAgICAxXSAgICAgICAqLworLyogICAgfCAwIEkgeDAgfCAwIHwgeDEgfCAwIHwuLi4gICAqLworI2RlZmluZSAgUFVfTFRfWkkoIHgwLCB4MSApICAgICAgICAgICAgICBQVV9GSUxURVJfWkkoKHgwKSwoeDEpKQorCisvKiBSSUdIVC9CT1RUT006IE5PTiBaRVJPICovCisvKiAxLzE2WzEgICAgNCAgIDYgICAgNCAgIDFdICAgICAgICovCisvKiAuLi58IHgwIHwgMCB8IHgxIHwgMCBJIHgxIHwgICAgICovCisjZGVmaW5lICBQVV9SQiggeDAsIHgxICkgICAgICAgICAgICAgICAgICgoeDApICsgKHgxKSo3KQorCisvKiBSSUdIVC9CT1RUT006IFpFUk8gUE9JTlQgQVQgQ0VOVEVSICovCisvKiAxLzE2WzEgICA0ICAgIDYgICA0ICAgIDFdICAgICAgICovCisvKiAuLi58IDAgfCB4MCB8IDAgSSB4MCB8IDAgfCAgICAgICovCisjZGVmaW5lICBQVV9SQl9aSSggeDAgKSAgICAgICAgICAgICAgICAgICgoeDApKjgpCisKKy8qIFNJTkdVTEFSIENBU0UgKi8KKy8qIDEvMTZbMSAgICA0ICAgNiAgICA0ICAgMV0gICAgICAgKi8KKy8qICAgIHwgeDAgfCAwIEkgeDAgfCAwIEkgeDAgfCAgICAgKi8KKyNkZWZpbmUgIFBVX1NJTkdVTEFSKCB4MCApICAgICAgICAgICAgICAgUFVfUkJfWkkoKHgwKSkgLyogPC0tfCB0aGUgc2FtZSBmb3JtdWxhcyAqLworI2RlZmluZSAgUFVfU0lOR1VMQVJfWkkoIHgwICkgICAgICAgICAgICBQVV9SQl9aSSgoeDApKSAvKiA8LS18ICovCisKKy8qIHgvNjQgIC0gc2NhbGluZyBpbiB1cC1zYW1wbGluZyBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgIFBVX1NDQUxFX0lOVCh4KSAgICAgICAgICAgICAgICAgKCgoeCkgKyAoMTw8NSkpID4+IDYpCisjZGVmaW5lICBQVV9TQ0FMRV9GTFQoeCkgICAgICAgICAgICAgICAgICgoeCkqMC4wMTU2MjVmKQorCisjZGVmaW5lICBQVV9TWiAgMworCisvLy8vLy8vLy8vLy8gZ2VuZXJpYyBtYWNybyAvLy8vLy8vLy8vLy8vCisKKworI2RlZmluZSBJQ1ZfREVGX1BZUl9VUF9GVU5DKCBmbGF2b3IsIHR5cGUsIHdvcmt0eXBlLCBfcHVfc2NhbGVfICkgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZQeXJVcEc1eDVfIyNmbGF2b3IjI19DblIoIGNvbnN0IHR5cGUqIHNyYywgaW50IHNyY3N0ZXAsIHR5cGUqIGRzdCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIHZvaWQgKmJ1ZiwgaW50IENzICkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgKmJ1ZmZlciA9ICh3b3JrdHlwZSopYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlICpyb3dzW1BVX1NaXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeSwgdG9wX3JvdyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IFdkID0gc2l6ZS53aWR0aCAqIDIsIFdkbiA9IFdkICogQ3MsIFduID0gc2l6ZS53aWR0aCAqIENzOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBidWZmZXJfc3RlcCA9IFdkbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcHVfc3ogPSBQVV9TWipidWZmZXJfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGZzdCA9IDAsIGxzdCA9IHNpemUuaGVpZ2h0IDw9IFBVX1NaLzIgPyBzaXplLmhlaWdodCA6IFBVX1NaLzIgKyAxOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIENzID09IDEgfHwgQ3MgPT0gMyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtYWluIGxvb3AgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyssIGRzdCArPSAyICogZHN0c3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHgsIHkxLCBrID0gdG9wX3JvdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlICpyb3cwLCAqcm93MSwgKnJvdzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlICpkc3QxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIGFzc2lnbiByb3dzIHBvaW50ZXJzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHkxID0gMDsgeTEgPCBQVV9TWjsgeTErKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByb3dzW3kxXSA9IGJ1ZmZlciArIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgayArPSBidWZmZXJfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGsgJj0gayA8IHB1X3N6ID8gLTEgOiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcm93MCA9IHJvd3NbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJvdzEgPSByb3dzWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByb3cyID0gcm93c1syXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0MSA9IGRzdCArIGRzdHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBmaWxsIG5ldyBidWZmZXIgcm93cyB3aXRoIGZpbHRlcmVkIHNvdXJjZSAoaG9yaXpvbnRhbCBjb252KSAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIENzID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggc2l6ZS53aWR0aCA+IFBVX1NaIC8gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggeTEgPSBmc3Q7IHkxIDwgbHN0OyB5MSsrLCBzcmMgKz0gc3Jjc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlICpyb3cgPSByb3dzW3kxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogcHJvY2VzcyBsZWZ0ICYgcmlnaHQgYm91bmRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJvd1swXSA9IFBVX0xUKCBzcmNbMF0sIHNyY1sxXSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByb3dbMV0gPSBQVV9MVF9aSSggc3JjWzBdLCBzcmNbMV0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcm93W3NpemUud2lkdGggKiAyIC0gMl0gPSBQVV9SQiggc3JjW3NpemUud2lkdGggLSAyXSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1tzaXplLndpZHRoIC0gMV0gKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByb3dbc2l6ZS53aWR0aCAqIDIgLSAxXSA9IFBVX1JCX1pJKCBzcmNbc2l6ZS53aWR0aCAtIDFdICk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXIgcG9pbnRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDE7IHggPCBzaXplLndpZHRoIC0gMTsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1syICogeF0gPSBQVV9GSUxURVIoIHNyY1t4IC0gMV0sIHNyY1t4XSwgc3JjW3ggKyAxXSApOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMiAqIHggKyAxXSA9IFBVX0ZJTFRFUl9aSSggc3JjW3hdLCBzcmNbeCArIDFdICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgIC8qIHNpemUud2lkdGggPD0gUFVfU1ovMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggeTEgPSBmc3Q7IHkxIDwgbHN0OyB5MSsrLCBzcmMgKz0gc3Jjc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlICpyb3cgPSByb3dzW3kxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSB2YWwgPSBzcmNbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHJvd1swXSA9IFBVX1NJTkdVTEFSKCB2YWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByb3dbMV0gPSBQVV9TSU5HVUxBUl9aSSggdmFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgIC8qIENzID09IDMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB5MSA9IGZzdDsgeTEgPCBsc3Q7IHkxKyssIHNyYyArPSBzcmNzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgKnJvdyA9IHJvd3NbeTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggc2l6ZS53aWR0aCA+IFBVX1NaIC8gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbnQgYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggYyA9IDA7IGMgPCAzOyBjKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb2Nlc3MgbGVmdCAmIHJpZ2h0IGJvdW5kcyAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbY10gPSBQVV9MVCggc3JjW2NdLCBzcmNbMyArIGNdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm93WzMgKyBjXSA9IFBVX0xUX1pJKCBzcmNbY10sIHNyY1szICsgY10gKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1tXbiAqIDIgLSA2ICsgY10gPSBQVV9SQiggc3JjW1duIC0gNiArIGNdLCBzcmNbV24gLSAzICsgY10pOyBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbV24gKiAyIC0gMyArIGNdID0gUFVfUkJfWkkoIHNyY1tXbiAtIDMgKyBjXSApOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogb3RoZXIgcG9pbnRzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDM7IHggPCBXbiAtIDM7IHggKz0gMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1syICogeF0gPSBQVV9GSUxURVIoIHNyY1t4IC0gM10sIHNyY1t4XSwgc3JjW3ggKyAzXSApOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMiAqIHggKyAzXSA9IFBVX0ZJTFRFUl9aSSggc3JjW3hdLCBzcmNbeCArIDNdICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1syICogeCArIDFdID0gUFVfRklMVEVSKCBzcmNbeCAtIDJdLCBzcmNbeCArIDFdLCBzcmNbeCArIDRdKTtcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMiAqIHggKyA0XSA9IFBVX0ZJTFRFUl9aSSggc3JjW3ggKyAxXSwgc3JjW3ggKyA0XSApOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd1syICogeCArIDJdID0gUFVfRklMVEVSKCBzcmNbeCAtIDFdLCBzcmNbeCArIDJdLCBzcmNbeCArIDVdKTtcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbMiAqIHggKyA1XSA9IFBVX0ZJTFRFUl9aSSggc3JjW3ggKyAyXSwgc3JjW3ggKyA1XSApOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIC8qIHNpemUud2lkdGggPD0gUFVfU1ovMiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmb3IoIGMgPSAwOyBjIDwgMzsgYysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICByb3dbY10gPSBQVV9TSU5HVUxBUiggc3JjW2NdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcm93WzMgKyBjXSA9IFBVX1NJTkdVTEFSX1pJKCBzcmNbY10gKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIHNlY29uZCBwYXNzLiBEbyB2ZXJ0aWNhbCBjb252IGFuZCB3cml0ZSByZXN1bHRzIGRvIGRlc3RpbmF0aW9uIGltYWdlICovICAgICAgXAorICAgICAgICBpZiggeSA+IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggeSA8IHNpemUuaGVpZ2h0IC0gUFVfU1ogLyAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcHVfc2NhbGVfKCBQVV9GSUxURVIoIHJvdzBbeF0sIHJvdzFbeF0sIHJvdzJbeF0gKSk7IFwKKyAgICAgICAgICAgICAgICAgICAgZHN0MVt4XSA9ICh0eXBlKV9wdV9zY2FsZV8oIFBVX0ZJTFRFUl9aSSggcm93MVt4XSwgcm93Mlt4XSApKTsgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRvcF9yb3cgKz0gYnVmZmVyX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3Bfcm93ICY9IHRvcF9yb3cgPCBwdV9zeiA/IC0xIDogMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvKiBib3R0b20gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcHVfc2NhbGVfKCBQVV9SQiggcm93MFt4XSwgcm93MVt4XSApKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0MVt4XSA9ICh0eXBlKV9wdV9zY2FsZV8oIFBVX1JCX1pJKCByb3cxW3hdICkpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHNpemUuaGVpZ2h0ID4gUFVfU1ogLyAyICkgLyogdG9wICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcHVfc2NhbGVfKCBQVV9MVCggcm93MFt4XSwgcm93MVt4XSApKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0MVt4XSA9ICh0eXBlKV9wdV9zY2FsZV8oIFBVX0xUX1pJKCByb3cwW3hdLCByb3cxW3hdICkpOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAvKiBzaXplLmhlaWdodCA8PSBQVV9TWi8yICovICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgV2RuOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSAodHlwZSlfcHVfc2NhbGVfKCBQVV9TSU5HVUxBUiggcm93MFt4XSApKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0MVt4XSA9ICh0eXBlKV9wdV9zY2FsZV8oIFBVX1NJTkdVTEFSX1pJKCByb3cwW3hdICkpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZnN0ID0gUFVfU1ogLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsc3QgPSB5IDwgc2l6ZS5oZWlnaHQgLSBQVV9TWi8yIC0gMSA/IFBVX1NaIDogc2l6ZS5oZWlnaHQgKyBQVV9TWi8yIC0geSAtIDE7ICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX1BZUl9VUF9GVU5DKCA4dSwgdWNoYXIsIGludCwgUFVfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX1VQX0ZVTkMoIDE2cywgc2hvcnQsIGludCwgUFVfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX1VQX0ZVTkMoIDE2dSwgdXNob3J0LCBpbnQsIFBVX1NDQUxFX0lOVCApCitJQ1ZfREVGX1BZUl9VUF9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgUFVfU0NBTEVfRkxUICkKK0lDVl9ERUZfUFlSX1VQX0ZVTkMoIDY0ZiwgZG91YmxlLCBkb3VibGUsIFBVX1NDQUxFX0ZMVCApCisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdlB5clVwRzV4NV9HZXRCdWZTaXplKCBpbnQgcm9pV2lkdGgsIEN2RGF0YVR5cGUgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgKmJ1ZlNpemUgKQoreworICAgIGludCBidWZTdGVwOworCisgICAgaWYoICFidWZTaXplICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgICpidWZTaXplID0gMDsKKworICAgIGlmKCByb2lXaWR0aCA8IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIGNoYW5uZWxzICE9IDEgJiYgY2hhbm5lbHMgIT0gMyApCisgICAgICAgIHJldHVybiBDVl9VTlNVUFBPUlRFRF9DSEFOTkVMU19FUlI7CisKKyAgICBidWZTdGVwID0gMipyb2lXaWR0aCpjaGFubmVsczsKKworICAgIGlmKCBkYXRhVHlwZSA9PSBjdjY0ZiApCisgICAgICAgIGJ1ZlN0ZXAgKj0gc2l6ZW9mKGRvdWJsZSk7CisgICAgZWxzZQorICAgICAgICBidWZTdGVwICo9IHNpemVvZihpbnQpOworCisgICAgKmJ1ZlNpemUgPSBidWZTdGVwICogUFVfU1o7CisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZQeXJEb3duRzV4NV9HZXRCdWZTaXplKCBpbnQgcm9pV2lkdGgsIEN2RGF0YVR5cGUgZGF0YVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsIGludCAqYnVmU2l6ZSApCit7CisgICAgaW50IGJ1ZlN0ZXA7CisKKyAgICBpZiggIWJ1ZlNpemUgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgKmJ1ZlNpemUgPSAwOworCisgICAgaWYoIHJvaVdpZHRoIDwgMCB8fCAocm9pV2lkdGggJiAxKSAhPSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCBjaGFubmVscyAhPSAxICYmIGNoYW5uZWxzICE9IDMgKQorICAgICAgICByZXR1cm4gQ1ZfVU5TVVBQT1JURURfQ0hBTk5FTFNfRVJSOworCisgICAgYnVmU3RlcCA9IDIqcm9pV2lkdGgqY2hhbm5lbHM7CisKKyAgICBpZiggZGF0YVR5cGUgPT0gY3Y2NGYgKQorICAgICAgICBidWZTdGVwICo9IHNpemVvZihkb3VibGUpOworICAgIGVsc2UKKyAgICAgICAgYnVmU3RlcCAqPSBzaXplb2YoaW50KTsKKworICAgICpidWZTaXplID0gYnVmU3RlcCAqIChQRF9TWiArIDEpOworICAgIHJldHVybiBDVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICAgICBEb3duc2FtcGxlZCBpbWFnZSBib3JkZXIgY29tcGxldGlvbgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9QWVJfQk9SREVSX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF9wZF9zY2FsZV8gKSAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2UHlyRG93bkJvcmRlcl8jI2ZsYXZvciMjX0NuUiggY29uc3QgYXJydHlwZSAqc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSAqZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSBkc3Rfc2l6ZSwgaW50IGNoYW5uZWxzICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsb2NhbF9hbGxvYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSAqYnVmID0gMCwgKmJ1ZjAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgYXJydHlwZSogc3JjMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGUqIGRzdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYnVmX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBXID0gc3JjX3NpemUud2lkdGgsIEggPSBzcmNfc2l6ZS5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgV2QgPSBkc3Rfc2l6ZS53aWR0aCwgSGQgPSBkc3Rfc2l6ZS5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IFdkXywgSGRfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBXbiA9IFcqY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgYnVmVzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNvbHMsIHJvd3M7IC8qIGNvbHVtbnMgYW5kIHJvd3MgdG8gbW9kaWZ5ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJ1Zl9zaXplID0gTUFYKHNyY19zaXplLndpZHRoLHNyY19zaXplLmhlaWdodCkgKiBzaXplb2YoYnVmWzBdKSAqIDIgKiBjaGFubmVsczsgICAgIFwKKyAgICBpZiggYnVmX3NpemUgPiAoMSA8PCAxNCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWYgPSAod29ya3R5cGUqKWN2QWxsb2MoIGJ1Zl9zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFidWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWYgPSAod29ya3R5cGUqKWN2QWxpZ25QdHIoYWxsb2NhKCBidWZfc2l6ZSs4ICksIDgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9jYWxfYWxsb2MgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBidWYwID0gYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY19zdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbHMgPSAoVyAmIDEpICsgKFdkKjIgPiBXKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByb3dzID0gKEggJiAxKSArIChIZCoyID4gSCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYzIgPSBzcmMgKyAoSC0xKSpzcmNfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QyID0gZHN0ICsgKEhkIC0gcm93cykqZHN0X3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IChXIC0gMSkqY2hhbm5lbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdCArPSAoV2QgLSBjb2xzKSpjaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogcGFydCBvZiByb3coY29sdW1uKSBmcm9tIDEgdG8gV2RfKEhkXykgaXMgcHJvY2Vzc2VkIHVzaW5nIFBEX0ZJTFRFUiBtYWNybyAqLyAgICAgXAorICAgIFdkXyA9IFdkIC0gMSArIChjb2xzID09IDEgJiYgKFcgJiAxKSAhPSAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBIZF8gPSBIZCAtIDEgKyAocm93cyA9PSAxICYmIChIICYgMSkgIT0gMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJ1ZlcgPSBjaGFubmVscyAqIGNvbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyoqKioqKioqKioqKioqKioqKiogU1RBR0UgMS4gKioqKioqKioqKioqKioqKioqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBkbyBob3Jpem9udGFsIGNvbnZvbHV0aW9uIG9mIHRoZSAxLTIgcmlnaHQgY29sdW1ucyBhbmQgd3JpdGUgcmVzdWx0cyB0byBidWZmZXIgKi9cCisgICAgaWYoIGNvbHMgPiAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIFcgPD0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzZXJ0KCBXZCA9PSAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBIOyBpKyssIHNyYyArPSBzcmNfc3RlcCwgYnVmICs9IGNoYW5uZWxzICkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBjaGFubmVscyA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzBdID0gUERfU0lOR1VMQVIoIHNyY1sxLVduXSwgc3JjWzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzBdID0gUERfU0lOR1VMQVIoIHNyY1szLVduXSwgc3JjWzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IFBEX1NJTkdVTEFSKCBzcmNbNC1Xbl0sIHNyY1sxXSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMl0gPSBQRF9TSU5HVUxBUiggc3JjWzUtV25dLCBzcmNbMl0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBpZiggKFcgPT0gMyAmJiBXZCA9PSAxKSB8fCAoVyA+IDMgJiYgIShXZCAmIDEpKSApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IEg7IGkrKywgc3JjICs9IHNyY19zdGVwLCBidWYgKz0gY2hhbm5lbHMgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBQRF9MVCggc3JjWy0yXSwgc3JjWy0xXSwgc3JjWzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBQRF9MVCggc3JjWy02XSwgc3JjWy0zXSwgc3JjWzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzFdID0gUERfTFQoIHNyY1stNV0sIHNyY1stMl0sIHNyY1sxXSApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlsyXSA9IFBEX0xUKCBzcmNbLTRdLCBzcmNbLTFdLCBzcmNbMl0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmKCBXID09IDMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgSDsgaSsrLCBzcmMgKz0gc3JjX3N0ZXAsIGJ1ZiArPSBjaGFubmVscyoyICkgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggY2hhbm5lbHMgPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBQRF9MVCggc3JjWy0yXSwgc3JjWy0xXSwgc3JjWzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzFdID0gUERfTFQoIHNyY1swXSwgc3JjWy0xXSwgc3JjWy0yXSApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlswXSA9IFBEX0xUKCBzcmNbLTZdLCBzcmNbLTNdLCBzcmNbMF0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMV0gPSBQRF9MVCggc3JjWy01XSwgc3JjWy0yXSwgc3JjWzFdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzJdID0gUERfTFQoIHNyY1stNF0sIHNyY1stMV0sIHNyY1syXSApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlszXSA9IFBEX0xUKCBzcmNbMF0sIHNyY1stM10sIHNyY1stNl0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbNF0gPSBQRF9MVCggc3JjWzFdLCBzcmNbLTJdLCBzcmNbLTVdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzVdID0gUERfTFQoIHNyY1syXSwgc3JjWy0xXSwgc3JjWy00XSApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIGNvbHMgPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBIOyBpKyssIHNyYyArPSBzcmNfc3RlcCwgYnVmICs9IGNoYW5uZWxzICkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBjaGFubmVscyA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzBdID0gUERfRklMVEVSKCBzcmNbLTRdLCBzcmNbLTNdLCBzcmNbLTJdLCBzcmNbLTFdLCBzcmNbMF0pOyAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzBdID0gUERfRklMVEVSKCBzcmNbLTEyXSwgc3JjWy05XSwgc3JjWy02XSwgc3JjWy0zXSwgc3JjWzBdKTsgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IFBEX0ZJTFRFUiggc3JjWy0xMV0sIHNyY1stOF0sIHNyY1stNV0sIHNyY1stMl0sIHNyY1sxXSk7ICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMl0gPSBQRF9GSUxURVIoIHNyY1stMTBdLCBzcmNbLTddLCBzcmNbLTRdLCBzcmNbLTFdLCBzcmNbMl0pOyAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IEg7IGkrKywgc3JjICs9IHNyY19zdGVwLCBidWYgKz0gY2hhbm5lbHMqMiApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzBdID0gUERfRklMVEVSKCBzcmNbLTRdLCBzcmNbLTNdLCBzcmNbLTJdLCBzcmNbLTFdLCBzcmNbMF0gKTsgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IFBEX0xUKCBzcmNbMF0sIHNyY1stMV0sIHNyY1stMl0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbMF0gPSBQRF9GSUxURVIoIHNyY1stMTJdLCBzcmNbLTldLCBzcmNbLTZdLCBzcmNbLTNdLCBzcmNbMF0gKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzFdID0gUERfRklMVEVSKCBzcmNbLTExXSwgc3JjWy04XSwgc3JjWy01XSwgc3JjWy0yXSwgc3JjWzFdICk7ICBcCisgICAgICAgICAgICAgICAgICAgIGJ1ZlsyXSA9IFBEX0ZJTFRFUiggc3JjWy0xMF0sIHNyY1stN10sIHNyY1stNF0sIHNyY1stMV0sIHNyY1syXSApOyAgXAorICAgICAgICAgICAgICAgICAgICBidWZbM10gPSBQRF9MVCggc3JjWzBdLCBzcmNbLTNdLCBzcmNbLTZdICk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmWzRdID0gUERfTFQoIHNyY1sxXSwgc3JjWy0yXSwgc3JjWy01XSApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGJ1Zls1XSA9IFBEX0xUKCBzcmNbMl0sIHNyY1stMV0sIHNyY1stNF0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWYgPSBidWYwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyA9IHNyYzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyoqKioqKioqKioqKioqKioqKiogU1RBR0UgMi4gKioqKioqKioqKioqKioqKioqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBkbyB2ZXJ0aWNhbCBjb252b2x1dGlvbiBvZiB0aGUgcHJlLXByb2Nlc3NlZCByaWdodCBjb2x1bW5zLCAqLyAgICAgICAgICAgICAgICAgICBcCisgICAgLyogc3RvcmVkIGluIGJ1ZmZlciwgYW5kIHdyaXRlIHJlc3VsdHMgdG8gdGhlIGRlc3RpbmF0aW9uICovICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGRvIHZlcnRpY2FsIGNvbnZvbHV0aW9uIG9mIHRoZSAxLTIgYm90dG9tIHJvd3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBhbmQgd3JpdGUgcmVzdWx0cyB0byB0aGUgYnVmZmVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIEggPD0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGNvbHMgPiAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXNzZXJ0KCBIZCA9PSAxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBidWZXOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfU0lOR1VMQVIoIGJ1ZltqXSwgYnVmW2orKEgtMSkqYnVmV10gKSk7XAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCByb3dzID4gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBXbjsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmW2pdID0gUERfU0lOR1VMQVIoIHNyY1tqLXNyY19zdGVwXSwgc3JjW2pdICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiggSCA9PSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGNvbHMgPiAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGJ1Zlc7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2pdPSAoYXJydHlwZSlfcGRfc2NhbGVfKFBEX0xUKCBidWZbal0sIGJ1ZltqK2J1ZlddLCBidWZbaitidWZXKjJdKSk7XAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBIZCA9PSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgYnVmVzsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbaitidWZXKjJdLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbaitidWZXXSwgYnVmW2pdICkpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIEhkID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IFduOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBidWZbal0gPSBQRF9MVCggc3JjW2otc3JjX3N0ZXAqMl0sIHNyY1tqIC0gc3JjX3N0ZXBdLCBzcmNbal0gKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgV247IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBidWZbal0gPSBQRF9MVCggc3JjW2otc3JjX3N0ZXAqMl0sIHNyY1tqIC0gc3JjX3N0ZXBdLCBzcmNbal0gKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmW2orV25dID0gUERfTFQoIHNyY1tqXSxzcmNbai1zcmNfc3RlcF0sc3JjW2otc3JjX3N0ZXAqMl0gKTsgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBjb2xzID4gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIHRvcCBvZiB0aGUgcmlnaHQgYm9yZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgYnVmVzsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqXT0oYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVCggYnVmW2pdLCBidWZbaitidWZXXSwgYnVmW2orYnVmVyoyXSkpO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAvKiBtaWRkbGUgcGFydCBvZiB0aGUgcmlnaHQgYm9yZGVyICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmICs9IGJ1ZlcqMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgSGRfOyBpKyssIGRzdCArPSBkc3Rfc3RlcCwgYnVmICs9IGJ1ZlcqMiApICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgYnVmVzsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0ZJTFRFUiggYnVmW2otYnVmVyoyXSwgYnVmW2otYnVmV10sXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbal0sIGJ1ZltqK2J1ZlddLCBidWZbaitidWZXKjJdICkpO1wKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgLyogYm90dG9tIG9mIHRoZSByaWdodCBib3JkZXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAhKEggJiAxKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBidWZXOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfUkIoIGJ1ZltqLWJ1ZlcqMl0sIGJ1ZltqLWJ1ZlddLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbal0sIGJ1ZltqK2J1ZlddICkpOyAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgaWYoIHJvd3MgPiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBidWZXOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdPShhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbai1idWZXKjJdLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbai1idWZXXSwgYnVmW2pdKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBidWYgPSBidWYwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCByb3dzID4gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAhKEggJiAxKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBXbjsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gUERfTFQoIHNyY1tqXSwgc3JjW2otc3JjX3N0ZXBdLCBzcmNbai1zcmNfc3RlcCoyXSApOyAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSBpZiggY29scyA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IFduOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbal0gPSBQRF9GSUxURVIoIHNyY1tqLXNyY19zdGVwKjRdLCBzcmNbai1zcmNfc3RlcCozXSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbai1zcmNfc3RlcCoyXSwgc3JjW2otc3JjX3N0ZXBdLCBzcmNbal0gKTsgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IFduOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYnVmW2pdID0gUERfRklMVEVSKCBzcmNbai1zcmNfc3RlcCo0XSwgc3JjW2otc3JjX3N0ZXAqM10sICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW2otc3JjX3N0ZXAqMl0sIHNyY1tqLXNyY19zdGVwXSwgc3JjW2pdICk7ICAgXAorICAgICAgICAgICAgICAgICAgICBidWZbaitXbl0gPSBQRF9MVCggc3JjW2pdLCBzcmNbai1zcmNfc3RlcF0sIHNyY1tqLXNyY19zdGVwKjJdICk7ICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKioqKioqKioqKioqKioqKioqKiBTVEFHRSAzLiAqKioqKioqKioqKioqKioqKiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGRvIGhvcml6b250YWwgY29udm9sdXRpb24gb2YgdGhlIHByZS1wcm9jZXNzZWQgYm90dG9tIHJvd3MsKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBzdG9yZWQgaW4gYnVmZmVyLCBhbmQgd3JpdGUgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIHJvd3MgPiAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0ID0gZHN0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggVyA8PSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhc3NlcnQoIFdkID09IDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IHJvd3MtLTsgZHN0ICs9IGRzdF9zdGVwLCBidWYgKz0gV24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbMF0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9TSU5HVUxBUiggYnVmWzBdLCBidWZbV24tMV0gKSk7ICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbMF0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9TSU5HVUxBUiggYnVmWzBdLCBidWZbV24tM10gKSk7ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0WzFdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfU0lOR1VMQVIoIGJ1ZlsxXSwgYnVmW1duLTJdICkpOyAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFsyXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX1NJTkdVTEFSKCBidWZbMl0sIGJ1ZltXbi0xXSApKTsgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIGlmKCBXID09IDMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggV2QgPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIDsgcm93cy0tOyBkc3QgKz0gZHN0X3N0ZXAsIGJ1ZiArPSBXbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiggY2hhbm5lbHMgPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0gKSk7ICBcCisgICAgICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKGJ1ZlswXSwgYnVmWzNdLCBidWZbNl0gKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVChidWZbMV0sIGJ1Zls0XSwgYnVmWzddICkpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzJdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoYnVmWzJdLCBidWZbNV0sIGJ1Zls4XSApKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggOyByb3dzLS07IGRzdCArPSBkc3Rfc3RlcCwgYnVmICs9IFduICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmKCBjaGFubmVscyA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKGJ1ZlswXSwgYnVmWzFdLCBidWZbMl0gKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMV0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVChidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdICkpOyAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoYnVmWzBdLCBidWZbM10sIGJ1Zls2XSApKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKGJ1ZlsxXSwgYnVmWzRdLCBidWZbN10gKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbMl0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVChidWZbMl0sIGJ1Zls1XSwgYnVmWzhdICkpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0WzNdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoYnVmWzZdLCBidWZbM10sIGJ1ZlswXSApKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFs0XSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKGJ1Zls3XSwgYnVmWzRdLCBidWZbMV0gKSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbNV0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVChidWZbOF0sIGJ1Zls1XSwgYnVmWzJdICkpOyAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IHJvd3MtLTsgZHN0ICs9IGRzdF9zdGVwLCBidWYgKz0gV24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogbGVmdCBwYXJ0IG9mIHRoZSBib3R0b20gcm93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFswXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdICkpOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgLyogbWlkZGxlIHBhcnQgb2YgdGhlIGJvdHRvbSByb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBXZF87IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0ZJTFRFUihidWZbaSoyLTJdLCBidWZbaSoyLTFdLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kqMl0sYnVmW2kqMisxXSwgYnVmW2kqMisyXSApKTsgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIC8qIHJpZ2h0IHBhcnQgb2YgdGhlIGJvdHRvbSByb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiggIShXICYgMSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX1JCKCBidWZbaSoyLTJdLGJ1ZltpKjItMV0sICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kqMl0sIGJ1ZltpKjIrMV0gKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjb2xzID4gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbaSoyLTJdLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kqMi0xXSwgYnVmW2kqMl0gKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0IHBhcnQgb2YgdGhlIGJvdHRvbSByb3cgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0WzBdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoIGJ1ZlswXSwgYnVmWzNdLCBidWZbNl0gKSk7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFsxXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbMV0sIGJ1Zls0XSwgYnVmWzddICkpOyAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbMl0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9MVCggYnVmWzJdLCBidWZbNV0sIGJ1Zls4XSApKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIC8qIG1pZGRsZSBwYXJ0IG9mIHRoZSBib3R0b20gcm93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAzOyBpIDwgV2RfKjM7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAoYXJydHlwZSlfcGRfc2NhbGVfKCBQRF9GSUxURVIoYnVmW2kqMi02XSwgYnVmW2kqMi0zXSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kqMl0sYnVmW2kqMiszXSwgYnVmW2kqMis2XSkpO1wKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAvKiByaWdodCBwYXJ0IG9mIHRoZSBib3R0b20gcm93ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYoICEoVyAmIDEpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfUkIoIGJ1ZltpKjItNl0sYnVmW2kqMi0zXSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbaSoyXSwgYnVmW2kqMiszXSApKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbaSsxXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX1JCKCBidWZbaSoyLTVdLGJ1ZltpKjItMl0sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpKjIrMV0sIGJ1ZltpKjIrNF0gKSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfUkIoIGJ1ZltpKjItNF0sYnVmW2kqMi0xXSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2kqMisyXSwgYnVmW2kqMis1XSApKTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY29scyA+IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoIGJ1ZltpKjItNl0sIGJ1ZltpKjItM10sIGJ1ZltpKjJdICkpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpX3BkX3NjYWxlXyggUERfTFQoIGJ1ZltpKjItNV0sIGJ1ZltpKjItMl0sIGJ1ZltpKjIrMV0pKTtcCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IChhcnJ0eXBlKV9wZF9zY2FsZV8oIFBEX0xUKCBidWZbaSoyLTRdLCBidWZbaSoyLTFdLCBidWZbaSoyKzJdKSk7XAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAhbG9jYWxfYWxsb2MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY3ZGcmVlKCAmYnVmMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfSU5JVF9QWVJfVEFCTEUoIEZVTkNOQU1FICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGljdkluaXQjI0ZVTkNOQU1FIyNUYWJsZSggQ3ZGdW5jVGFibGUqIHRhYiApICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1X0NuUjsgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZTXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZzX0NuUjsgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlVdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnVfQ25SOyAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl9DblI7ICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRmX0NuUjsgICAgICAgICAgICBcCit9CisKK3N0YXRpYyB2b2lkIGljdkluaXRQeXJEb3duQm9yZGVyVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIgKTsKKworSUNWX0RFRl9JTklUX1BZUl9UQUJMRSggUHlyVXBHNXg1ICkKK0lDVl9ERUZfSU5JVF9QWVJfVEFCTEUoIFB5ckRvd25HNXg1ICkKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2UHlyRG93bkJvcmRlckZ1bmMpKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc3Jjc2l6ZSwgdm9pZCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIGRzdHNpemUsIGludCBjbiApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSVBQIHB5cmFtaWQgZnVuY3Rpb25zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworaWN2UHlyRG93bl9HYXVzczV4NV84dV9DMVJfdCBpY3ZQeXJEb3duX0dhdXNzNXg1Xzh1X0MxUl9wID0gMDsgCitpY3ZQeXJEb3duX0dhdXNzNXg1Xzh1X0MzUl90IGljdlB5ckRvd25fR2F1c3M1eDVfOHVfQzNSX3AgPSAwOyAKK2ljdlB5ckRvd25fR2F1c3M1eDVfMzJmX0MxUl90IGljdlB5ckRvd25fR2F1c3M1eDVfMzJmX0MxUl9wID0gMDsgCitpY3ZQeXJEb3duX0dhdXNzNXg1XzMyZl9DM1JfdCBpY3ZQeXJEb3duX0dhdXNzNXg1XzMyZl9DM1JfcCA9IDA7IAorCitpY3ZQeXJVcF9HYXVzczV4NV84dV9DMVJfdCBpY3ZQeXJVcF9HYXVzczV4NV84dV9DMVJfcCA9IDA7IAoraWN2UHlyVXBfR2F1c3M1eDVfOHVfQzNSX3QgaWN2UHlyVXBfR2F1c3M1eDVfOHVfQzNSX3AgPSAwOyAKK2ljdlB5clVwX0dhdXNzNXg1XzMyZl9DMVJfdCBpY3ZQeXJVcF9HYXVzczV4NV8zMmZfQzFSX3AgPSAwOyAKK2ljdlB5clVwX0dhdXNzNXg1XzMyZl9DM1JfdCBpY3ZQeXJVcF9HYXVzczV4NV8zMmZfQzNSX3AgPSAwOyAKKworaWN2UHlyVXBHZXRCdWZTaXplX0dhdXNzNXg1X3QgaWN2UHlyVXBHZXRCdWZTaXplX0dhdXNzNXg1X3AgPSAwOworaWN2UHlyRG93bkdldEJ1ZlNpemVfR2F1c3M1eDVfdCBpY3ZQeXJEb3duR2V0QnVmU2l6ZV9HYXVzczV4NV9wID0gMDsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2UHlyYW1pZEZ1bmMpCisoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwKKyAgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCB2b2lkKiBidWZmZXIsIGludCBjbiApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZQeXJhbWlkSVBQRnVuYykKKyggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIHZvaWQqIGJ1ZmZlciApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2UHlyVXAoIGNvbnN0IHZvaWQqIHNyY2Fyciwgdm9pZCogZHN0YXJyLCBpbnQgX2ZpbHRlciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIHB5cnVwX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIAorICAgIHZvaWQgKmJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZQeXJVcCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKKyAgICBpbnQgdHlwZSwgZGVwdGgsIGNuOworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZGaWx0ZXIgZmlsdGVyID0gKEN2RmlsdGVyKSBfZmlsdGVyOworICAgIEN2UHlyYW1pZEZ1bmMgZnVuYzsKKyAgICBDdlB5cmFtaWRJUFBGdW5jIGlwcF9mdW5jID0gMDsKKyAgICBpbnQgdXNlX2lwcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFB5clVwRzV4NVRhYmxlKCAmcHlydXBfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pMSApKTsKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaTIgKSk7CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBpZiggZmlsdGVyICE9IENWX0dBVVNTSUFOXzV4NSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJ0aGlzIGZpbHRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggc3JjLT5jb2xzKjIgIT0gZHN0LT5jb2xzIHx8IHNyYy0+cm93cyoyICE9IGRzdC0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKworICAgIGlmKCBjbiAhPSAxICYmIGNuICE9IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgaW1hZ2VzIG11c3QgaGF2ZSAxIG9yIDMgY2hhbm5lbCIgKTsKKworICAgIGZ1bmMgPSAoQ3ZQeXJhbWlkRnVuYylweXJ1cF90YWIuZm5fMmRbZGVwdGhdOworCisgICAgaWYoICFmdW5jICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgaWYoIGljdlB5clVwR2V0QnVmU2l6ZV9HYXVzczV4NV9wICkKKyAgICB7CisgICAgICAgIGlwcF9mdW5jID0gdHlwZSA9PSBDVl84VUMxID8gaWN2UHlyVXBfR2F1c3M1eDVfOHVfQzFSX3AgOgorICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfOFVDMyA/IGljdlB5clVwX0dhdXNzNXg1Xzh1X0MzUl9wIDoKKyAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMxID8gaWN2UHlyVXBfR2F1c3M1eDVfMzJmX0MxUl9wIDoKKyAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gaWN2UHlyVXBfR2F1c3M1eDVfMzJmX0MzUl9wIDogMDsKKworICAgICAgICB1c2VfaXBwID0gaXBwX2Z1bmMgJiYgaWN2UHlyVXBHZXRCdWZTaXplX0dhdXNzNXg1X3AoIHNpemUud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGljdkRlcHRoVG9EYXRhVHlwZSh0eXBlKSwgY24sICZidWZmZXJfc2l6ZSApID49IDA7CisgICAgfQorCisgICAgaWYoICF1c2VfaXBwICkKKyAgICAgICAgaWN2UHlyVXBHNXg1X0dldEJ1ZlNpemUoIHNpemUud2lkdGgsIGljdkRlcHRoVG9EYXRhVHlwZSh0eXBlKSwgY24sICZidWZmZXJfc2l6ZSApOworCisgICAgaWYoIGJ1ZmZlcl9zaXplIDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyggYnVmZmVyX3NpemUgKTsKKyAgICAgICAgbG9jYWxfYWxsb2MgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9IGN2QWxsb2MoIGJ1ZmZlcl9zaXplICkpOworCisgICAgaWYoICF1c2VfaXBwICkKKyAgICAgICAgZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAsIHNpemUsIGJ1ZmZlciwgY24gKTsKKyAgICBlbHNlCisgICAgICAgIElQUElfQ0FMTCggaXBwX2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCA/IHNyYy0+c3RlcCA6IENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCA/IGRzdC0+c3RlcCA6IENWX1NUVUJfU1RFUCwgc2l6ZSwgYnVmZmVyICkpOworICAgIF9fRU5EX187CisKKyAgICBpZiggYnVmZmVyICYmICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZQeXJEb3duKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgaW50IF9maWx0ZXIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBweXJkb3duX3RhYjsKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgcHlyZG93bmJvcmRlcl90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICB2b2lkICpidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UHlyRG93biIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgaW50IGJ1ZmZlcl9zaXplID0gMDsKKyAgICBpbnQgdHlwZSwgZGVwdGgsIGNuOworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZGaWx0ZXIgZmlsdGVyID0gKEN2RmlsdGVyKSBfZmlsdGVyOworICAgIEN2UHlyYW1pZEZ1bmMgZnVuYzsKKyAgICBDdlB5cmFtaWRJUFBGdW5jIGlwcF9mdW5jID0gMDsKKyAgICBpbnQgdXNlX2lwcCA9IDA7CisgICAgQ3ZTaXplIHNyY19zaXplLCBzcmNfc2l6ZTIsIGRzdF9zaXplOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRQeXJEb3duRzV4NVRhYmxlKCAmcHlyZG93bl90YWIgKTsKKyAgICAgICAgaWN2SW5pdFB5ckRvd25Cb3JkZXJUYWJsZSggJnB5cmRvd25ib3JkZXJfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pMSApKTsKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaTIgKSk7CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBpZiggZmlsdGVyICE9IENWX0dBVVNTSUFOXzV4NSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJ0aGlzIGZpbHRlciB0eXBlIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBzcmNfc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworICAgIGRzdF9zaXplID0gY3ZHZXRNYXRTaXplKGRzdCk7CisgICAgc3JjX3NpemUyLndpZHRoID0gc3JjX3NpemUud2lkdGggJiAtMjsKKyAgICBzcmNfc2l6ZTIuaGVpZ2h0ID0gc3JjX3NpemUuaGVpZ2h0ICYgLTI7CisKKyAgICBpZiggKHVuc2lnbmVkKShkc3Rfc2l6ZS53aWR0aCAtIHNyY19zaXplLndpZHRoLzIpID4gMSB8fAorICAgICAgICAodW5zaWduZWQpKGRzdF9zaXplLmhlaWdodCAtIHNyY19zaXplLmhlaWdodC8yKSA+IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAvLyBjdXJyZW50IHJlc3RyaWN0aW9uIG9mIFB5ckRvd25Cb3JkZXIqIAorICAgIGlmKCAoc3JjX3NpemUud2lkdGggPD0gMiAmJiBkc3Rfc2l6ZS53aWR0aCAhPSAxKSB8fAorICAgICAgICAoc3JjX3NpemUuaGVpZ2h0IDw9IDIgJiYgZHN0X3NpemUuaGVpZ2h0ICE9IDEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgLyppZiggc3JjLT5kYXRhLnB0ciA9PSBkc3QtPmRhdGEucHRyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0lucGxhY2VOb3RTdXBwb3J0ZWQsICIiICk7Ki8KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMtPnR5cGUpOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHR5cGUpOworICAgIGNuID0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgaWYoIGNuICE9IDEgJiYgY24gIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBpbWFnZXMgbXVzdCBoYXZlIDEgb3IgMyBjaGFubmVsIiApOworCisgICAgZnVuYyA9IChDdlB5cmFtaWRGdW5jKXB5cmRvd25fdGFiLmZuXzJkW2RlcHRoXTsKKworICAgIGlmKCAhZnVuYyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCBpY3ZQeXJEb3duR2V0QnVmU2l6ZV9HYXVzczV4NV9wICkKKyAgICB7CisgICAgICAgIGlwcF9mdW5jID0gdHlwZSA9PSBDVl84VUMxID8gaWN2UHlyRG93bl9HYXVzczV4NV84dV9DMVJfcCA6CisgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl84VUMzID8gaWN2UHlyRG93bl9HYXVzczV4NV84dV9DM1JfcCA6CisgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDMSA/IGljdlB5ckRvd25fR2F1c3M1eDVfMzJmX0MxUl9wIDoKKyAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMzID8gaWN2UHlyRG93bl9HYXVzczV4NV8zMmZfQzNSX3AgOiAwOworCisgICAgICAgIHVzZV9pcHAgPSBpcHBfZnVuYyAmJiBpY3ZQeXJEb3duR2V0QnVmU2l6ZV9HYXVzczV4NV9wKCBzcmNfc2l6ZTIud2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGljdkRlcHRoVG9EYXRhVHlwZSh0eXBlKSwgY24sICZidWZmZXJfc2l6ZSApID49IDA7CisgICAgfQorCisgICAgaWYoICF1c2VfaXBwICkKKyAgICAgICAgaWN2UHlyRG93bkc1eDVfR2V0QnVmU2l6ZSggc3JjX3NpemUyLndpZHRoLAorICAgICAgICAgICAgaWN2RGVwdGhUb0RhdGFUeXBlKHR5cGUpLCBjbiwgJmJ1ZmZlcl9zaXplICk7CisKKyAgICBpZiggYnVmZmVyX3NpemUgPD0gQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gY3ZTdGFja0FsbG9jKCBidWZmZXJfc2l6ZSApOworICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyggYnVmZmVyX3NpemUgKSk7CisKKyAgICBpZiggIXVzZV9pcHAgKQorICAgICAgICBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgIGRzdC0+c3RlcCwgc3JjX3NpemUyLCBidWZmZXIsIGNuICk7CisgICAgZWxzZQorICAgICAgICBJUFBJX0NBTEwoIGlwcF9mdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVAsIHNyY19zaXplMiwgYnVmZmVyICkpOworCisgICAgaWYoIHNyY19zaXplLndpZHRoICE9IGRzdF9zaXplLndpZHRoKjIgfHwgc3JjX3NpemUuaGVpZ2h0ICE9IGRzdF9zaXplLmhlaWdodCoyICkKKyAgICB7CisgICAgICAgIEN2UHlyRG93bkJvcmRlckZ1bmMgYm9yZGVyX2Z1bmMgPSAoQ3ZQeXJEb3duQm9yZGVyRnVuYykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBweXJkb3duYm9yZGVyX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSldOworCisgICAgICAgIGlmKCAhYm9yZGVyX2Z1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIElQUElfQ0FMTCggYm9yZGVyX2Z1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc3JjX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwgZHN0X3NpemUsIENWX01BVF9DTih0eXBlKSApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZVB5cmFtaWQoIEN2TWF0KioqIF9weXJhbWlkLCBpbnQgZXh0cmFfbGF5ZXJzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVsZWFzZVB5cmFtaWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCoqIHB5cmFtaWQ7CisgICAgaW50IGk7CisKKyAgICBpZiggIV9weXJhbWlkICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBweXJhbWlkID0gKl9weXJhbWlkOworICAgIAorICAgIGlmKCBweXJhbWlkICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gZXh0cmFfbGF5ZXJzOyBpKysgKQorICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmcHlyYW1pZFtpXSApOworICAgIH0KKyAgICAKKyAgICBjdkZyZWUoIF9weXJhbWlkICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgQ3ZNYXQqKgorY3ZDcmVhdGVQeXJhbWlkKCBjb25zdCBDdkFyciogc3JjYXJyLCBpbnQgZXh0cmFfbGF5ZXJzLCBkb3VibGUgcmF0ZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTaXplKiBsYXllcl9zaXplcywgQ3ZBcnIqIGJ1ZmFyciwKKyAgICAgICAgICAgICAgICAgaW50IGNhbGMsIGludCBmaWx0ZXIgKQoreworICAgIEN2TWF0KiogcHlyYW1pZCA9IDA7CisgICAgY29uc3QgZmxvYXQgZXBzID0gMC4xZjsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVQeXJhbWlkIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGludCBpLCBlbGVtX3NpemUsIGxheWVyX3N0ZXA7CisgICAgQ3ZNYXQgc3R1YiwgKnNyYzsKKyAgICBDdlNpemUgc2l6ZSwgbGF5ZXJfc2l6ZTsKKyAgICB1Y2hhciogcHRyID0gMDsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnIsICZzdHViICkpOworCisgICAgaWYoIGV4dHJhX2xheWVycyA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBudW1iZXIgb2YgZXh0cmEgbGF5ZXJzIG11c3QgYmUgbm9uIG5lZ2F0aXZlIiApOworCisgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyYy0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworCisgICAgaWYoIGJ1ZmFyciApCisgICAgeworICAgICAgICBDdk1hdCBic3R1YiwgKmJ1ZjsKKyAgICAgICAgaW50IGJ1ZnNpemUgPSAwOworCisgICAgICAgIENWX0NBTEwoIGJ1ZiA9IGN2R2V0TWF0KCBidWZhcnIsICZic3R1YiApKTsKKyAgICAgICAgYnVmc2l6ZSA9IGJ1Zi0+cm93cypidWYtPmNvbHMqQ1ZfRUxFTV9TSVpFKGJ1Zi0+dHlwZSk7CisgICAgICAgIGxheWVyX3NpemUgPSBzaXplOworICAgICAgICBmb3IoIGkgPSAxOyBpIDw9IGV4dHJhX2xheWVyczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFsYXllcl9zaXplcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGF5ZXJfc2l6ZS53aWR0aCA9IGN2Um91bmQobGF5ZXJfc2l6ZS53aWR0aCpyYXRlK2Vwcyk7CisgICAgICAgICAgICAgICAgbGF5ZXJfc2l6ZS5oZWlnaHQgPSBjdlJvdW5kKGxheWVyX3NpemUuaGVpZ2h0KnJhdGUrZXBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYXllcl9zaXplID0gbGF5ZXJfc2l6ZXNbaS0xXTsKKyAgICAgICAgICAgIGxheWVyX3N0ZXAgPSBsYXllcl9zaXplLndpZHRoKmVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGJ1ZnNpemUgLT0gbGF5ZXJfc3RlcCpsYXllcl9zaXplLmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBidWZzaXplIDwgMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBidWZmZXIgaXMgdG9vIHNtYWxsIHRvIGZpdCB0aGUgcHlyYW1pZCIgKTsKKyAgICAgICAgcHRyID0gYnVmLT5kYXRhLnB0cjsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBweXJhbWlkID0gKEN2TWF0KiopY3ZBbGxvYyggKGV4dHJhX2xheWVycysxKSpzaXplb2YocHlyYW1pZFswXSkgKSk7CisgICAgbWVtc2V0KCBweXJhbWlkLCAwLCAoZXh0cmFfbGF5ZXJzKzEpKnNpemVvZihweXJhbWlkWzBdKSApOworCisgICAgcHlyYW1pZFswXSA9IGN2Q3JlYXRlTWF0SGVhZGVyKCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgc3JjLT50eXBlICk7CisgICAgY3ZTZXREYXRhKCBweXJhbWlkWzBdLCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAgKTsKKyAgICBsYXllcl9zaXplID0gc2l6ZTsKKworICAgIGZvciggaSA9IDE7IGkgPD0gZXh0cmFfbGF5ZXJzOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoICFsYXllcl9zaXplcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxheWVyX3NpemUud2lkdGggPSBjdlJvdW5kKGxheWVyX3NpemUud2lkdGgqcmF0ZSArIGVwcyk7CisgICAgICAgICAgICBsYXllcl9zaXplLmhlaWdodCA9IGN2Um91bmQobGF5ZXJfc2l6ZS5oZWlnaHQqcmF0ZSArIGVwcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbGF5ZXJfc2l6ZSA9IGxheWVyX3NpemVzW2ldOworCisgICAgICAgIGlmKCBidWZhcnIgKQorICAgICAgICB7CisgICAgICAgICAgICBweXJhbWlkW2ldID0gY3ZDcmVhdGVNYXRIZWFkZXIoIGxheWVyX3NpemUuaGVpZ2h0LCBsYXllcl9zaXplLndpZHRoLCBzcmMtPnR5cGUgKTsKKyAgICAgICAgICAgIGxheWVyX3N0ZXAgPSBsYXllcl9zaXplLndpZHRoKmVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGN2U2V0RGF0YSggcHlyYW1pZFtpXSwgcHRyLCBsYXllcl9zdGVwICk7CisgICAgICAgICAgICBwdHIgKz0gbGF5ZXJfc3RlcCpsYXllcl9zaXplLmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBweXJhbWlkW2ldID0gY3ZDcmVhdGVNYXQoIGxheWVyX3NpemUuaGVpZ2h0LCBsYXllcl9zaXplLndpZHRoLCBzcmMtPnR5cGUgKTsKKworICAgICAgICBpZiggY2FsYyApCisgICAgICAgICAgICBjdlB5ckRvd24oIHB5cmFtaWRbaS0xXSwgcHlyYW1pZFtpXSwgZmlsdGVyICk7CisgICAgICAgICAgICAvL2N2UmVzaXplKCBweXJhbWlkW2ktMV0sIHB5cmFtaWRbaV0sIENWX0lOVEVSX0xJTkVBUiApOworICAgIH0KKyAgICAKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlUHlyYW1pZCggJnB5cmFtaWQsIGV4dHJhX2xheWVycyApOworCisgICAgcmV0dXJuIHB5cmFtaWQ7Cit9CisKKworLyogTVNWQyAuTkVUIDIwMDMgc3BlbmRzIGEgbG9uZyB0aW1lIGJ1aWxkaW5nIHRoaXMsIHRodXMsIGFzIHRoZSBjb2RlCisgICBpcyBub3QgcGVyZm9ybWFuY2UtY3JpdGljYWwsIHdlIHR1cm4gb2ZmIHRoZSBvcHRpbWl6YXRpb24gaGVyZSAqLworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPiAxMzAwICYmICFkZWZpbmVkIENWX0lDQworI3ByYWdtYSBvcHRpbWl6ZSgiIiwgb2ZmKQorI2VuZGlmCisKK0lDVl9ERUZfUFlSX0JPUkRFUl9GVU5DKCA4dSwgdWNoYXIsIGludCwgUERfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX0JPUkRFUl9GVU5DKCAxNnUsIHVzaG9ydCwgaW50LCBQRF9TQ0FMRV9JTlQgKQorSUNWX0RFRl9QWVJfQk9SREVSX0ZVTkMoIDE2cywgc2hvcnQsIGludCwgUERfU0NBTEVfSU5UICkKK0lDVl9ERUZfUFlSX0JPUkRFUl9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgUERfU0NBTEVfRkxUICkKK0lDVl9ERUZfUFlSX0JPUkRFUl9GVU5DKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBQRF9TQ0FMRV9GTFQgKQorCisjZGVmaW5lIElDVl9ERUZfSU5JVF9QWVJfQk9SREVSX1RBQkxFKCBGVU5DTkFNRSApICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGljdkluaXQjI0ZVTkNOQU1FIyNUYWJsZSggQ3ZGdW5jVGFibGUqIHRhYiApICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1X0NuUjsgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZ1X0NuUjsgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnNfQ25SOyAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl9DblI7ICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRmX0NuUjsgICAgICAgICAgICBcCit9CisKK0lDVl9ERUZfSU5JVF9QWVJfQk9SREVSX1RBQkxFKCBQeXJEb3duQm9yZGVyICkKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZweXJzZWdtZW50YXRpb24uY3BwIGIvY3Yvc3JjL2N2cHlyc2VnbWVudGF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzU5ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2cHlyc2VnbWVudGF0aW9uLmNwcApAQCAtMCwwICsxLDE4ODMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdi5oIgorCit0eXBlZGVmIHN0cnVjdCBfQ3ZSR0JmCit7ICAgZmxvYXQgYmx1ZTsKKyAgICBmbG9hdCBncmVlbjsKKyAgICBmbG9hdCByZWQ7Cit9CitfQ3ZSR0JmOworCit0eXBlZGVmIHN0cnVjdCBfQ3ZSZWN0MTZ1Cit7CisgICAgdXNob3J0IHgxLCB5MSwgeDIsIHkyOworfQorX0N2UmVjdDE2dTsKKwordHlwZWRlZiBzdHJ1Y3QgX0N2UHlyYW1pZAoreworICAgIGZsb2F0IGM7CisgICAgc3RydWN0IF9DdlB5cmFtaWQgKnA7CisgICAgaW50IGE7CisgICAgX0N2UmVjdDE2dSByZWN0OyAgICAgIC8qICBST0kgZm9yIHRoZSBjb25uZWN0ZWQgY29tcG9uZW50ICAgICovCit9IF9DdlB5cmFtaWQ7CisKKy8qIGVsZW1lbnQgb2YgYmFzZSBsYXllciAqLwordHlwZWRlZiBzdHJ1Y3QgX0N2UHlyYW1pZEJhc2UKK3sKKyAgICBmbG9hdCBjOworICAgIHN0cnVjdCBfQ3ZQeXJhbWlkICpwOworfQorX0N2UHlyYW1pZEJhc2U7CisKK3R5cGVkZWYgc3RydWN0IF9DdlB5cmFtaWRDMworeworICAgIF9DdlJHQmYgYzsKKyAgICBzdHJ1Y3QgX0N2UHlyYW1pZEMzICpwOworICAgIGludCBhOworICAgIF9DdlJlY3QxNnUgcmVjdDsgICAgICAvKiAgUk9JIGZvciB0aGUgY29ubmVjdGVkIGNvbXBvbmVudCAgICAqLworfSBfQ3ZQeXJhbWlkQzM7CisKKy8qIGVsZW1lbnQgb2YgYmFzZSBsYXllciAqLwordHlwZWRlZiBzdHJ1Y3QgX0N2UHlyYW1pZEJhc2VDMworeworICAgIF9DdlJHQmYgYzsKKyAgICBzdHJ1Y3QgX0N2UHlyYW1pZEMzICpwOworfQorX0N2UHlyYW1pZEJhc2VDMzsKKwordHlwZWRlZiBzdHJ1Y3QgX0N2TGlzdE5vZGUKK3sKKyAgICBzdHJ1Y3QgX0N2TGlzdE5vZGUqIG5leHQ7CisgICAgdm9pZCogZGF0YTsKK30KK19Ddkxpc3ROb2RlOworCisKK3N0YXRpYyBDdlN0YXR1cyAgaWN2U2VnbWVudENsdXN0ZXJDMSggQ3ZTZXEqIGNtcF9zZXEsIEN2U2VxKiByZXNfc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWQqIGZpcnN0X2xldmVsX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBmaXJzdF9sZXZlbF9zaXplICk7CisKK3N0YXRpYyBDdlN0YXR1cyAgaWN2U2VnbWVudENsdXN0ZXJDMyggQ3ZTZXEqIGNtcF9zZXEsIEN2U2VxKiByZXNfc2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWRDMyogZmlyc3RfbGV2ZWxfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGZpcnN0X2xldmVsX3NpemUgKTsKKworc3RhdGljIEN2U3RhdHVzIGljdlVwZGF0ZVB5ckxpbmtzXzh1X0MxCisgICAgKGludCBsYXllciwgdm9pZCAqbGF5ZXJfZGF0YSwgQ3ZTaXplIHNpemUsIHZvaWQgKnBhcmVudF9sYXllciwKKyAgICAgdm9pZCAqX3dyaXRlciwgZmxvYXQgdGhyZXNob2xkLCBpbnQgaXNfbGFzdF9pdGVyLCB2b2lkICpfc3R1YiwgQ3ZXcml0ZU5vZGVGdW5jdGlvbiAvKmZ1bmMqLyk7CisKK3N0YXRpYyBDdlN0YXR1cyBpY3ZVcGRhdGVQeXJMaW5rc184dV9DMworICAgIChpbnQgbGF5ZXIsIHZvaWQgKmxheWVyX2RhdGEsIEN2U2l6ZSBzaXplLCB2b2lkICpwYXJlbnRfbGF5ZXIsCisgICAgIHZvaWQgKl93cml0ZXIsIGZsb2F0IHRocmVzaG9sZCwgaW50IGlzX2xhc3RfaXRlciwgdm9pZCAqX3N0dWIsIEN2V3JpdGVOb2RlRnVuY3Rpb24gLypmdW5jKi8pOworCitzdGF0aWMgdm9pZCBpY3ZNYXhSb2koIF9DdlJlY3QxNnUgKm1heF9yZWN0LCBfQ3ZSZWN0MTZ1KiBjdXJfcmVjdCApOworc3RhdGljIHZvaWQgaWN2TWF4Um9pMSggX0N2UmVjdDE2dSAqbWF4X3JlY3QsIGludCB4LCBpbnQgeSApOworCisKKyNkZWZpbmUgX0NWX0NIRUNLKCBpY3ZGdW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggaWN2RnVuICE9IENWX09LICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgZ290byBNX0VORDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisKKyNkZWZpbmUgX0NWX01BWDMoIGEsIGIsIGMpICgoYSk+KGIpID8gKChhKT4oYykgPyAoYSkgOiAoYykpIDogKChiKT4oYykgPyAoYikgOiAoYykpKQorCisvKiNkZWZpbmUgX0NWX1JHQl9ESVNUKGEsIGIpICBfQ1ZfTUFYMygoZmxvYXQpZmFicygoYSkucmVkIC0gKGIpLnJlZCksICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWZhYnMoKGEpLmdyZWVuIC0gKGIpLmdyZWVuKSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClmYWJzKChhKS5ibHVlIC0gKGIpLmJsdWUpKSovCisKKyNkZWZpbmUgX0NWX05FWFRfQkFTRV9DMShwLG4pIChfQ3ZQeXJhbWlkKikoKGNoYXIqKShwKSArIChuKSpzaXplb2YoX0N2UHlyYW1pZEJhc2UpKQorI2RlZmluZSBfQ1ZfTkVYVF9CQVNFX0MzKHAsbikgKF9DdlB5cmFtaWRDMyopKChjaGFyKikocCkgKyAobikqc2l6ZW9mKF9DdlB5cmFtaWRCYXNlQzMpKQorCisKK0NWX0lOTElORSBmbG9hdCBpY3ZSR0JEaXN0X01heCggY29uc3QgX0N2UkdCZiYgYSwgY29uc3QgX0N2UkdCZiYgYiApCit7CisgICAgZmxvYXQgdHIgPSAoZmxvYXQpZmFicyhhLnJlZCAtIGIucmVkKTsKKyAgICBmbG9hdCB0ZyA9IChmbG9hdClmYWJzKGEuZ3JlZW4gLSBiLmdyZWVuKTsKKyAgICBmbG9hdCB0YiA9IChmbG9hdClmYWJzKGEuYmx1ZSAtIGIuYmx1ZSk7CisKKyAgICByZXR1cm4gX0NWX01BWDMoIHRyLCB0ZywgdGIgKTsKK30KKworQ1ZfSU5MSU5FIGZsb2F0IGljdlJHQkRpc3RfU3VtKCBjb25zdCBfQ3ZSR0JmJiBhLCBjb25zdCBfQ3ZSR0JmJiBiICkKK3sKKyAgICBmbG9hdCB0ciA9IChmbG9hdClmYWJzKGEucmVkIC0gYi5yZWQpOworICAgIGZsb2F0IHRnID0gKGZsb2F0KWZhYnMoYS5ncmVlbiAtIGIuZ3JlZW4pOworICAgIGZsb2F0IHRiID0gKGZsb2F0KWZhYnMoYS5ibHVlIC0gYi5ibHVlKTsKKyAgICAKKyAgICByZXR1cm4gKHRyICsgdGcgKyB0Yik7Cit9CisKKyNpZiAxCisjZGVmaW5lIF9DVl9SR0JfRElTVCAgaWN2UkdCRGlzdF9NYXgKKyNkZWZpbmUgX0NWX1JHQl9USFJFU0hfU0NBTEUgICAxCisjZWxzZQorI2RlZmluZSBfQ1ZfUkdCX0RJU1QgIGljdlJHQkRpc3RfU3VtCisjZGVmaW5lIF9DVl9SR0JfVEhSRVNIX1NDQUxFICAgMworI2VuZGlmCisKKyNkZWZpbmUgX0NWX0lOVl9UQUJfU0laRSAgIDMyCisKK3N0YXRpYyBjb25zdCBmbG9hdCBpY3ZJbnZUYWJbIC8qX0NWX0lOVl9UQUJfU0laRSovIF0gPQoreworICAgIDEuMDAwMDAwMDBmLCAwLjUwMDAwMDAwZiwgMC4zMzMzMzMzM2YsIDAuMjUwMDAwMDBmLCAwLjIwMDAwMDAwZiwgMC4xNjY2NjY2N2YsCisgICAgMC4xNDI4NTcxNGYsIDAuMTI1MDAwMDBmLCAwLjExMTExMTExZiwgMC4xMDAwMDAwMGYsIDAuMDkwOTA5MDlmLCAwLjA4MzMzMzMzZiwKKyAgICAwLjA3NjkyMzA4ZiwgMC4wNzE0Mjg1N2YsIDAuMDY2NjY2NjdmLCAwLjA2MjUwMDAwZiwgMC4wNTg4MjM1M2YsIDAuMDU1NTU1NTZmLAorICAgIDAuMDUyNjMxNThmLCAwLjA1MDAwMDAwZiwgMC4wNDc2MTkwNWYsIDAuMDQ1NDU0NTVmLCAwLjA0MzQ3ODI2ZiwgMC4wNDE2NjY2N2YsCisgICAgMC4wNDAwMDAwMGYsIDAuMDM4NDYxNTRmLCAwLjAzNzAzNzA0ZiwgMC4wMzU3MTQyOWYsIDAuMDM0NDgyNzZmLCAwLjAzMzMzMzMzZiwKKyAgICAwLjAzMjI1ODA2ZiwgMC4wMzEyNTAwMGYKK307CisKK3N0YXRpYyB2b2lkCitpY3ZXcml0ZVB5ck5vZGUoIHZvaWQgKmVsZW0sIHZvaWQgKndyaXRlciApCit7CisgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oICooX0N2TGlzdE5vZGUgKikgZWxlbSwgKihDdlNlcVdyaXRlciAqKSB3cml0ZXIgKTsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdlB5clNlZ21lbnRhdGlvbjh1QzFSKCB1Y2hhciAqIHNyY19pbWFnZSwgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICogZHN0X2ltYWdlLCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHJvaSwgQ3ZGaWx0ZXIgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxICoqIGRzdF9jb21wLCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCwgaW50IHRocmVzaG9sZDEsIGludCB0aHJlc2hvbGQyICkKK3sKKyAgICBpbnQgaSwgaiwgbDsKKyAgICBpbnQgc3RlcDsKKyAgICBjb25zdCBpbnQgbWF4X2l0ZXIgPSAzOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyAqLworICAgIGludCBjdXJfaXRlciA9IDA7ICAgICAgICAgICAvKiBjdXJyZW50IGl0ZXJhdGlvbiAqLworCisgICAgX0N2UHlyYW1pZCAqcHlyYW1bMTZdOyAgICAgIC8qIHBvaW50ZXJzIHRvIHRoZSBweXJhbWlkIGRvd24gdXAgdG8gbGV2ZWwgKi8KKworICAgIGZsb2F0ICpweXJhbWlkYSA9IDA7CisgICAgX0N2UHlyYW1pZCBzdHViOworCisgICAgX0N2UHlyYW1pZCAqcF9jdXI7CisgICAgX0N2UHlyYW1pZEJhc2UgKnBfYmFzZTsKKyAgICBfQ3ZMaXN0Tm9kZSBjbXBfbm9kZTsKKworICAgIEN2U2VxICpjbXBfc2VxID0gMDsKKyAgICBDdlNlcSAqcmVzX3NlcSA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlICp0ZW1wX3N0b3JhZ2UgPSAwOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2U3RhdHVzIHN0YXR1czsKKyAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgY2hhciAqYnVmZmVyID0gMDsKKworICAgIHN0YXR1cyA9IENWX09LOworCisgICAgLyogY2xlYXIgcG9pbnRlciB0byByZXN1bHRhbnQgc2VxdWVuY2UgKi8KKyAgICBpZiggZHN0X2NvbXAgKQorICAgICAgICAqZHN0X2NvbXAgPSAwOworCisgICAgLyogY2hlY2sgYXJncyAqLworICAgIGlmKCAhc3JjX2ltYWdlIHx8ICFkc3RfaW1hZ2UgfHwgIXN0b3JhZ2UgfHwgIWRzdF9jb21wICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCByb2kud2lkdGggPD0gMCB8fCByb2kuaGVpZ2h0IDw9IDAgfHwgc3JjX3N0ZXAgPCByb2kud2lkdGggfHwgZHN0X3N0ZXAgPCByb2kud2lkdGggKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIGZpbHRlciAhPSBDVl9HQVVTU0lBTl81eDUgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworICAgIGlmKCB0aHJlc2hvbGQxIDwgMCB8fCB0aHJlc2hvbGQyIDwgMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisgICAgaWYoIGxldmVsIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworCisgICAgaWYoICgocm9pLndpZHRoIHwgcm9pLmhlaWdodCkgJiAoKDEgPDwgbGV2ZWwpIC0gMSkpICE9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEQ09FRl9FUlI7CisKKyAgICB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApOworCisgICAgLyogc2VxdWVuY2UgZm9yIHRlbXBvcmFyeSBjb21wb25lbnRzICovCisgICAgY21wX3NlcSA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoIEN2U2VxICksIHNpemVvZiggX0N2TGlzdE5vZGUgKSwgdGVtcF9zdG9yYWdlICk7CisgICAgYXNzZXJ0KCBjbXBfc2VxICE9IDAgKTsKKworICAgIHJlc19zZXEgPSBjdkNyZWF0ZVNlcSggQ1ZfU0VRX0NPTk5FQ1RFRF9DT01QLCBzaXplb2YoIEN2U2VxICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIEN2Q29ubmVjdGVkQ29tcCApLCBzdG9yYWdlICk7CisgICAgYXNzZXJ0KCByZXNfc2VxICE9IDAgKTsKKworICAgIC8qIGNhbGN1bGF0ZSBidWZmZXIgc2l6ZSAqLworICAgIGJ1ZmZlcl9zaXplID0gcm9pLndpZHRoICogcm9pLmhlaWdodCAqIChzaXplb2YoIGZsb2F0ICkgKyBzaXplb2YoIF9DdlB5cmFtaWRCYXNlICkpOworCisgICAgZm9yKCBsID0gMTsgbCA8PSBsZXZlbDsgbCsrICkKKyAgICAgICAgYnVmZmVyX3NpemUgKz0gKChyb2kud2lkdGggPj4gbCkgKyAxKSAqICgocm9pLmhlaWdodCA+PiBsKSArIDEpICogc2l6ZW9mKF9DdlB5cmFtaWQpOworCisgICAgLyogYWxsb2NhdGUgYnVmZmVyICovCisgICAgYnVmZmVyID0gKGNoYXIgKikgY3ZBbGxvYyggYnVmZmVyX3NpemUgKTsKKyAgICBpZiggIWJ1ZmZlciApCisgICAgeworICAgICAgICBzdGF0dXMgPSBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorCisgICAgcHlyYW1pZGEgPSAoZmxvYXQgKikgYnVmZmVyOworCisgICAgLyogaW5pdGlhbGl6YXRpb24gcHlyYW1pZC1saW5raW5nIHByb3BlcnRpZXMgZG93biB1cCB0byBsZXZlbCAqLworICAgIHN0ZXAgPSByb2kud2lkdGggKiBzaXplb2YoIGZsb2F0ICk7CisKKyAgICB7CisgICAgICAgIEN2TWF0IF9zcmM7CisgICAgICAgIEN2TWF0IF9weXJhbWlkYTsKKyAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmX3NyYywgcm9pLmhlaWdodCwgcm9pLndpZHRoLCBDVl84VUMxLCBzcmNfaW1hZ2UsIHNyY19zdGVwICk7CisgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl9weXJhbWlkYSwgcm9pLmhlaWdodCwgcm9pLndpZHRoLCBDVl8zMkZDMSwgcHlyYW1pZGEsIHN0ZXAgKTsKKyAgICAgICAgY3ZDb252ZXJ0KCAmX3NyYywgJl9weXJhbWlkYSApOworICAgICAgICAvKl9DVl9DSEVDSyggaWN2Q3Z0VG9fMzJmX0MxUiggc3JjX2ltYWdlLCBzcmNfc3RlcCwgcHlyYW1pZGEsIHN0ZXAsIHJvaSwgQ1ZfOFVDMSApKTsqLworICAgIH0KKyAgICBwX2Jhc2UgPSAoX0N2UHlyYW1pZEJhc2UgKikgKGJ1ZmZlciArIHN0ZXAgKiByb2kuaGVpZ2h0KTsKKyAgICBweXJhbVswXSA9IChfQ3ZQeXJhbWlkICopIHBfYmFzZTsKKworICAgIC8qIGZpbGwgYmFzZSBsZXZlbCBvZiBweXJhbWlkICovCisgICAgZm9yKCBpID0gMDsgaSA8IHJvaS5oZWlnaHQ7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgcm9pLndpZHRoOyBqKyssIHBfYmFzZSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgcF9iYXNlLT5jID0gcHlyYW1pZGFbaSAqIHJvaS53aWR0aCArIGpdOworICAgICAgICAgICAgcF9iYXNlLT5wID0gJnN0dWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwX2N1ciA9IChfQ3ZQeXJhbWlkICopIHBfYmFzZTsKKyAgICBzaXplID0gcm9pOworCisgICAgLyogY2FsY3VsYXRlIGluaXRpYWwgcHlyYW1pZCAqLworICAgIGZvciggbCA9IDE7IGwgPD0gbGV2ZWw7IGwrKyApCisgICAgeworICAgICAgICBDdlNpemUgZHN0X3NpemUgPSB7IHNpemUud2lkdGgvMisxLCBzaXplLmhlaWdodC8yKzEgfTsKKyAgICAgICAgQ3ZNYXQgcHJldl9sZXZlbCA9IGN2TWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfMzJGQzEgKTsKKyAgICAgICAgQ3ZNYXQgbmV4dF9sZXZlbCA9IGN2TWF0KCBkc3Rfc2l6ZS5oZWlnaHQsIGRzdF9zaXplLndpZHRoLCBDVl8zMkZDMSApOworCisgICAgICAgIGN2U2V0RGF0YSggJnByZXZfbGV2ZWwsIHB5cmFtaWRhLCBzdGVwICk7CisgICAgICAgIGN2U2V0RGF0YSggJm5leHRfbGV2ZWwsIHB5cmFtaWRhLCBzdGVwICk7CisgICAgICAgIGN2UHlyRG93biggJnByZXZfbGV2ZWwsICZuZXh0X2xldmVsICk7CisgICAgICAgIAorICAgICAgICAvL19DVl9DSEVDSyggaWN2UHlyRG93bl9HYXVzczV4NV8zMmZfQzFSKCBweXJhbWlkYSwgc3RlcCwgcHlyYW1pZGEsIHN0ZXAsIHNpemUsIGJ1ZmYgKSk7CisgICAgICAgIC8vX0NWX0NIRUNLKCBpY3ZQeXJEb3duQm9yZGVyXzMyZl9DblIoIHB5cmFtaWRhLCBzdGVwLCBzaXplLCBweXJhbWlkYSwgc3RlcCwgZHN0X3NpemUsIDEgKSk7CisgICAgICAgIHB5cmFtW2xdID0gcF9jdXI7CisKKyAgICAgICAgc2l6ZS53aWR0aCA9IGRzdF9zaXplLndpZHRoIC0gMTsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSBkc3Rfc2l6ZS5oZWlnaHQgLSAxOworCisgICAgICAgIC8qIGZpbGwgbGF5ZXIgI2wgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLmhlaWdodDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzaXplLndpZHRoOyBqKyssIHBfY3VyKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyLT5jID0gcHlyYW1pZGFbaSAqIHJvaS53aWR0aCArIGpdOworICAgICAgICAgICAgICAgIHBfY3VyLT5wID0gJnN0dWI7CisgICAgICAgICAgICAgICAgcF9jdXItPmEgPSAwOworICAgICAgICAgICAgICAgIHBfY3VyLT5yZWN0LngyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2U3RhcnRBcHBlbmRUb1NlcSggY21wX3NlcSwgJndyaXRlciApOworCisgICAgLyogZG8gc2V2ZXJhbCBpdGVyYXRpb25zIHRvIGRldGVybWluZSBzb24tZmF0aGVyIGxpbmtzICovCisgICAgZm9yKCBjdXJfaXRlciA9IDA7IGN1cl9pdGVyIDwgbWF4X2l0ZXI7IGN1cl9pdGVyKysgKQorICAgIHsKKyAgICAgICAgaW50IGlzX2xhc3RfaXRlciA9IGN1cl9pdGVyID09IG1heF9pdGVyIC0gMTsKKworICAgICAgICBzaXplID0gcm9pOworCisgICAgICAgIC8qIGJ1aWxkIHNvbi1mYXRoZXIgbGlua3MgZG93biB1cCB0byBsZXZlbCAqLworICAgICAgICBmb3IoIGwgPSAwOyBsIDwgbGV2ZWw7IGwrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdlVwZGF0ZVB5ckxpbmtzXzh1X0MxKCBsLCBweXJhbVtsXSwgc2l6ZSwgcHlyYW1bbCArIDFdLCAmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHRocmVzaG9sZDEsIGlzX2xhc3RfaXRlciwgJnN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdldyaXRlUHlyTm9kZSApOworCisgICAgICAgICAgICAvKiBjbGVhciBsYXN0IGJvcmRlciByb3cgKi8KKyAgICAgICAgICAgIGlmKCBsID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgPSBweXJhbVtsXSArIChzaXplLndpZHRoICsgMSkgKiBzaXplLmhlaWdodDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplLndpZHRoID4+PSAxOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPj49IDE7CisgICAgICAgIH0KKworLyogIGNsZWFyIHRoZSBvbGQgYyB2YWx1ZSBmb3IgdGhlIGxhc3QgbGV2ZWwgICAgICovCisgICAgICAgIHBfY3VyID0gcHlyYW1bbGV2ZWxdOworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUuaGVpZ2h0OyBpKyssIHBfY3VyICs9IHNpemUud2lkdGggKyAxICkKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICBwX2N1cltqXS5jID0gMDsKKworICAgICAgICBzaXplID0gcm9pOworICAgICAgICBzdGVwID0gcm9pLndpZHRoOworCisvKiBjYWxjdWxhdGUgYXZlcmFnZSBjIHZhbHVlIGZvciB0aGUgMCA8IGwgPD1sZXZlbCAgICovCisgICAgICAgIGZvciggbCA9IDA7IGwgPCBsZXZlbDsgbCsrLCBzdGVwID0gKHN0ZXAgPj4gMSkgKyAxICkKKyAgICAgICAgeworICAgICAgICAgICAgX0N2UHlyYW1pZCAqcF9wcmV2LCAqcF9yb3dfcHJldjsKKworICAgICAgICAgICAgc3R1Yi5jID0gMDsKKworICAgICAgICAgICAgLyogY2FsY3VsYXRlIGF2ZXJhZ2UgYyB2YWx1ZSBmb3IgdGhlIG5leHQgbGV2ZWwgICAqLworICAgICAgICAgICAgaWYoIGwgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9iYXNlID0gKF9DdlB5cmFtaWRCYXNlICopIHB5cmFtWzBdOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCByb2kuaGVpZ2h0OyBpKyssIHBfYmFzZSArPSBzaXplLndpZHRoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqICs9IDIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfQ3ZQeXJhbWlkICpwMSA9IHBfYmFzZVtqXS5wOworICAgICAgICAgICAgICAgICAgICAgICAgX0N2UHlyYW1pZCAqcDIgPSBwX2Jhc2VbaiArIDFdLnA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHAxLT5jICs9IHBfYmFzZVtqXS5jOworICAgICAgICAgICAgICAgICAgICAgICAgcDItPmMgKz0gcF9iYXNlW2ogKyAxXS5jOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyID0gcHlyYW1bbF07CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIHBfY3VyICs9IHNpemUud2lkdGggKyAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqICs9IDIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfQ3ZQeXJhbWlkICpwMSA9IHBfY3VyW2pdLnA7CisgICAgICAgICAgICAgICAgICAgICAgICBfQ3ZQeXJhbWlkICpwMiA9IHBfY3VyW2ogKyAxXS5wOworCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IChmbG9hdCkgcF9jdXJbal0uYSAqIHBfY3VyW2pdLmM7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IChmbG9hdCkgcF9jdXJbaiArIDFdLmEgKiBwX2N1cltqICsgMV0uYzsKKworICAgICAgICAgICAgICAgICAgICAgICAgcDEtPmMgKz0gdDA7CisgICAgICAgICAgICAgICAgICAgICAgICBwMi0+YyArPSB0MTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmEgPSBwX2N1cltqICsgMV0uYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoICFpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbc2l6ZS53aWR0aF0uYSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbal0uYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGFzc2lnbiByYW5kb20gdmFsdWVzIG9mIHRoZSBuZXh0IGxldmVsIG51bGwgYyAgICovCisgICAgICAgICAgICBwX2N1ciA9IHB5cmFtW2wgKyAxXTsKKyAgICAgICAgICAgIHBfcm93X3ByZXYgPSBwX3ByZXYgPSBweXJhbVtsXTsKKworICAgICAgICAgICAgc2l6ZS53aWR0aCA+Pj0gMTsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID4+PSAxOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUuaGVpZ2h0OyBpKyssIHBfY3VyICs9IHNpemUud2lkdGggKyAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaSA8IHNpemUuaGVpZ2h0IHx8ICFpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhID0gcF9jdXJbal0uYTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGEgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGEgPD0gX0NWX0lOVl9UQUJfU0laRSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5jICo9IGljdkludlRhYlthIC0gMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMgLz0gYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbal0uYyA9IHBfcHJldi0+YzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGwgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmV2ID0gX0NWX05FWFRfQkFTRV9DMShwX3ByZXYsMik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmV2ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiggcF9jdXJbc2l6ZS53aWR0aF0uYSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbc2l6ZS53aWR0aF0uYyA9IHBfcHJldlsobCAhPSAwKSAtIDFdLmM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltzaXplLndpZHRoXS5jIC89IHBfY3VyW3NpemUud2lkdGhdLmE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbXBfbm9kZS5kYXRhID0gcF9jdXIgKyBzaXplLndpZHRoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBjbXBfbm9kZSwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IHBfY3VyW2pdLmE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhIDw9IF9DVl9JTlZfVEFCX1NJWkUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbal0uYyAqPSBpY3ZJbnZUYWJbYSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5jIC89IGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wX25vZGUuZGF0YSA9IHBfY3VyICsgajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY21wX25vZGUsIHdyaXRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMgPSBwX3ByZXYtPmM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJldiA9IF9DVl9ORVhUX0JBU0VfQzEocF9wcmV2LCAoaiAqIDIgPCBzdGVwIC0gMiA/IDIgOiAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9wcmV2Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggbCArIDEgPT0gbGV2ZWwgJiYgIWlzX2xhc3RfaXRlciApCisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmEgPSAwOworCisgICAgICAgICAgICAgICAgaWYoICEoaSAmIDEpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfcHJldiA9IHBfcm93X3ByZXY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfcHJldiA9IChfQ3ZQeXJhbWlkKikoKGNoYXIqKXBfcm93X3ByZXYgKyBzdGVwICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChsID09IDAgPyBzaXplb2YoX0N2UHlyYW1pZEJhc2UpIDogc2l6ZW9mKF9DdlB5cmFtaWQpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBlbmQgb2YgdGhlIGl0ZXJhdGlvbiBwcm9jZXNzICAqLworCisgICAgLyogY29uc3RydWN0IGEgY29ubmVjdGVkICBjb21wb25lbnRzICAgKi8KKyAgICBzaXplLndpZHRoID0gcm9pLndpZHRoID4+IGxldmVsOworICAgIHNpemUuaGVpZ2h0ID0gcm9pLmhlaWdodCA+PiBsZXZlbDsKKworICAgIHBfY3VyID0gcHlyYW1bbGV2ZWxdOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIHBfY3VyICs9IHNpemUud2lkdGggKyAxICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcF9jdXJbal0uYSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbXBfbm9kZS5kYXRhID0gcF9jdXIgKyBqOworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBjbXBfbm9kZSwgd3JpdGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkVuZFdyaXRlU2VxKCAmd3JpdGVyICk7CisKKy8qIGNsdXN0ZXJpemF0aW9uIHNlZ21lbnRlZCBjb21wb25lbnRzIGFuZCBjb25zdHJ1Y3Rpb24gCisgICBvdXRwdXQgY29ubmVjdGVkIGNvbXBvbmVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpY3ZTZWdtZW50Q2x1c3RlckMxKCBjbXBfc2VxLCByZXNfc2VxLCB0aHJlc2hvbGQyLCBweXJhbVsxXSwgcm9pICk7CisKKy8qIGNvbnZlcnQgKGlucGxhY2UpIHJlc3VsdGFudCBzZWdtZW50IHZhbHVlcyB0byBpbnQgKHRvcCBsZXZlbCkgKi8KKworLyogcHJvcGFnYXRlIHNlZ21lbnQgdmFsdWVzIHRvcCBkb3duICovCisgICAgZm9yKCBsID0gbGV2ZWwgLSAxOyBsID49IDA7IGwtLSApCisgICAgeworICAgICAgICBwX2N1ciA9IHB5cmFtW2xdOworCisgICAgICAgIHNpemUud2lkdGggPDw9IDE7CisgICAgICAgIHNpemUuaGVpZ2h0IDw8PSAxOworCisgICAgICAgIGlmKCBsID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoLS07CisgICAgICAgICAgICBzaXplLmhlaWdodC0tOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLmhlaWdodDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9DdlB5cmFtaWQgKnAgPSBwX2N1ci0+cDsKKworICAgICAgICAgICAgICAgIGFzc2VydCggcCAhPSAwICk7CisgICAgICAgICAgICAgICAgaWYoIHAgIT0gJnN0dWIgKQorICAgICAgICAgICAgICAgICAgICBwX2N1ci0+YyA9IHAtPmM7CisKKyAgICAgICAgICAgICAgICBpZiggbCA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2MzJzdWYgX2M7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHNlZ21lbnRlZCB2YWx1ZXMgdG8gZGVzdGluYXRpb24gaW1hZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgX2MuZiA9IHBfY3VyLT5jOyBkc3RfaW1hZ2Vbal0gPSAodWNoYXIpX2MuaTsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgPSBfQ1ZfTkVYVF9CQVNFX0MxKHBfY3VyLCAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbCA9PSAwICkKKyAgICAgICAgICAgICAgICBkc3RfaW1hZ2UgKz0gZHN0X3N0ZXA7CisgICAgICAgIH0KKyAgICB9CisgIE1fRU5EOgorCisgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworCisgICAgaWYoIHN0YXR1cyA9PSBDVl9PSyApCisgICAgICAgICpkc3RfY29tcCA9IHJlc19zZXE7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgY29sb3IhISEgIGltYWdlIHNlZ21lbnRhdGlvbiBieSBweXJhbWlkLWxpbmtpbmcgICAKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIEN2U3RhdHVzCitpY3ZQeXJTZWdtZW50YXRpb244dUMzUiggdWNoYXIgKiBzcmNfaW1hZ2UsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIGRzdF9pbWFnZSwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSByb2ksIEN2RmlsdGVyIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSAqKiBkc3RfY29tcCwgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGV2ZWwsIGludCB0aHJlc2hvbGQxLCBpbnQgdGhyZXNob2xkMiApCit7CisgICAgaW50IGksIGosIGw7CisKKyAgICBpbnQgc3RlcDsKKyAgICBjb25zdCBpbnQgbWF4X2l0ZXIgPSAzOyAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgaXRlcmF0aW9ucyAqLworICAgIGludCBjdXJfaXRlciA9IDA7ICAgICAgICAgICAvKiBjdXJyZW50IGl0ZXJhdGlvbiAqLworCisgICAgX0N2UHlyYW1pZEMzICpweXJhbVsxNl07ICAgIC8qIHBvaW50ZXJzIHRvIHRoZSBweXJhbWlkIGRvd24gdXAgdG8gbGV2ZWwgKi8KKworICAgIGZsb2F0ICpweXJhbWlkYSA9IDA7CisgICAgX0N2UHlyYW1pZEMzIHN0dWI7CisKKyAgICBfQ3ZQeXJhbWlkQzMgKnBfY3VyOworICAgIF9DdlB5cmFtaWRCYXNlQzMgKnBfYmFzZTsKKyAgICBfQ3ZMaXN0Tm9kZSBjbXBfbm9kZTsKKworICAgIEN2U2VxICpjbXBfc2VxID0gMDsKKyAgICBDdlNlcSAqcmVzX3NlcSA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlICp0ZW1wX3N0b3JhZ2UgPSAwOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2U3RhdHVzIHN0YXR1czsKKyAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisKKyAgICBpbnQgYnVmZmVyX3NpemU7CisgICAgY2hhciAqYnVmZmVyID0gMDsKKworICAgIHN0YXR1cyA9IENWX09LOworCisgICAgdGhyZXNob2xkMSAqPSBfQ1ZfUkdCX1RIUkVTSF9TQ0FMRTsKKyAgICB0aHJlc2hvbGQyICo9IF9DVl9SR0JfVEhSRVNIX1NDQUxFOworCisgICAgLyogY2xlYXIgcG9pbnRlciB0byByZXN1bHRhbnQgc2VxdWVuY2UgKi8KKyAgICBpZiggZHN0X2NvbXAgKQorICAgICAgICAqZHN0X2NvbXAgPSAwOworCisgICAgLyogY2hlY2sgYXJncyAqLworICAgIGlmKCAhc3JjX2ltYWdlIHx8ICFkc3RfaW1hZ2UgfHwgIXN0b3JhZ2UgfHwgIWRzdF9jb21wICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCByb2kud2lkdGggPD0gMCB8fCByb2kuaGVpZ2h0IDw9IDAgfHwKKyAgICAgICAgc3JjX3N0ZXAgPCByb2kud2lkdGggKiAzIHx8IGRzdF9zdGVwIDwgcm9pLndpZHRoICogMyApIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggZmlsdGVyICE9IENWX0dBVVNTSUFOXzV4NSApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisgICAgaWYoIHRocmVzaG9sZDEgPCAwIHx8IHRocmVzaG9sZDIgPCAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKyAgICBpZiggbGV2ZWwgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBpZiggKChyb2kud2lkdGggfCByb2kuaGVpZ2h0KSAmICgoMSA8PCBsZXZlbCkgLSAxKSkgIT0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURDT0VGX0VSUjsKKworICAgIHRlbXBfc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBzdG9yYWdlICk7CisKKyAgICAvKiBzZXF1ZW5jZSBmb3IgdGVtcG9yYXJ5IGNvbXBvbmVudHMgKi8KKyAgICBjbXBfc2VxID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZiggQ3ZTZXEgKSwgc2l6ZW9mKCBfQ3ZMaXN0Tm9kZSApLCB0ZW1wX3N0b3JhZ2UgKTsKKyAgICBhc3NlcnQoIGNtcF9zZXEgIT0gMCApOworCisgICAgcmVzX3NlcSA9IGN2Q3JlYXRlU2VxKCBDVl9TRVFfQ09OTkVDVEVEX0NPTVAsIHNpemVvZiggQ3ZTZXEgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZDb25uZWN0ZWRDb21wICksIHN0b3JhZ2UgKTsKKyAgICBhc3NlcnQoIHJlc19zZXEgIT0gMCApOworCisgICAgLyogY2FsY3VsYXRlIGJ1ZmZlciBzaXplICovCisgICAgYnVmZmVyX3NpemUgPSByb2kud2lkdGggKiByb2kuaGVpZ2h0ICogKHNpemVvZiggX0N2UkdCZiApICsgc2l6ZW9mKCBfQ3ZQeXJhbWlkQmFzZUMzICkpOworCisgICAgZm9yKCBsID0gMTsgbCA8PSBsZXZlbDsgbCsrICkKKyAgICAgICAgYnVmZmVyX3NpemUgKz0gKChyb2kud2lkdGggPj4gbCkgKyAxKSAqICgocm9pLmhlaWdodCA+PiBsKSArIDEpICogc2l6ZW9mKF9DdlB5cmFtaWRDMyk7CisKKyAgICAvKiBhbGxvY2F0ZSBidWZmZXIgKi8KKyAgICBidWZmZXIgPSAoY2hhciAqKSBjdkFsbG9jKCBidWZmZXJfc2l6ZSApOworICAgIGlmKCAhYnVmZmVyICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IENWX09VVE9GTUVNX0VSUjsKKyAgICAgICAgZ290byBNX0VORDsKKyAgICB9CisKKyAgICBweXJhbWlkYSA9IChmbG9hdCAqKSBidWZmZXI7CisKKyAgICAvKiBpbml0aWFsaXphdGlvbiBweXJhbWlkLWxpbmtpbmcgcHJvcGVydGllcyBkb3duIHVwIHRvIGxldmVsICovCisgICAgc3RlcCA9IHJvaS53aWR0aCAqIHNpemVvZiggX0N2UkdCZiApOworCisgICAgeworICAgICAgICBDdk1hdCBfc3JjOworICAgICAgICBDdk1hdCBfcHlyYW1pZGE7CisgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl9zcmMsIHJvaS5oZWlnaHQsIHJvaS53aWR0aCwgQ1ZfOFVDMywgc3JjX2ltYWdlLCBzcmNfc3RlcCApOworICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZfcHlyYW1pZGEsIHJvaS5oZWlnaHQsIHJvaS53aWR0aCwgQ1ZfMzJGQzMsIHB5cmFtaWRhLCBzdGVwICk7CisgICAgICAgIGN2Q29udmVydCggJl9zcmMsICZfcHlyYW1pZGEgKTsKKyAgICAgICAgLypfQ1ZfQ0hFQ0soIGljdkN2dFRvXzMyZl9DMVIoIHNyY19pbWFnZSwgc3JjX3N0ZXAsIHB5cmFtaWRhLCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTaXplKCByb2kud2lkdGggKiAzLCByb2kuaGVpZ2h0ICksIENWXzhVQzEgKSk7Ki8KKyAgICB9CisKKyAgICBwX2Jhc2UgPSAoX0N2UHlyYW1pZEJhc2VDMyAqKSAoYnVmZmVyICsgc3RlcCAqIHJvaS5oZWlnaHQpOworICAgIHB5cmFtWzBdID0gKF9DdlB5cmFtaWRDMyAqKSBwX2Jhc2U7CisKKyAgICAvKiBmaWxsIGJhc2UgbGV2ZWwgb2YgcHlyYW1pZCAqLworICAgIGZvciggaSA9IDA7IGkgPCByb2kuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHJvaS53aWR0aDsgaisrLCBwX2Jhc2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfYmFzZS0+YyA9ICgoX0N2UkdCZiAqKSBweXJhbWlkYSlbaSAqIHJvaS53aWR0aCArIGpdOworICAgICAgICAgICAgcF9iYXNlLT5wID0gJnN0dWI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwX2N1ciA9IChfQ3ZQeXJhbWlkQzMgKikgcF9iYXNlOworICAgIHNpemUgPSByb2k7CisKKyAgICAvKiBjYWxjdWxhdGUgaW5pdGlhbCBweXJhbWlkICovCisgICAgZm9yKCBsID0gMTsgbCA8PSBsZXZlbDsgbCsrICkKKyAgICB7CisgICAgICAgIEN2U2l6ZSBkc3Rfc2l6ZSA9IHsgc2l6ZS53aWR0aC8yICsgMSwgc2l6ZS5oZWlnaHQvMiArIDEgfTsKKyAgICAgICAgQ3ZNYXQgcHJldl9sZXZlbCA9IGN2TWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfMzJGQzMgKTsKKyAgICAgICAgQ3ZNYXQgbmV4dF9sZXZlbCA9IGN2TWF0KCBkc3Rfc2l6ZS5oZWlnaHQsIGRzdF9zaXplLndpZHRoLCBDVl8zMkZDMyApOworCisgICAgICAgIGN2U2V0RGF0YSggJnByZXZfbGV2ZWwsIHB5cmFtaWRhLCBzdGVwICk7CisgICAgICAgIGN2U2V0RGF0YSggJm5leHRfbGV2ZWwsIHB5cmFtaWRhLCBzdGVwICk7CisgICAgICAgIGN2UHlyRG93biggJnByZXZfbGV2ZWwsICZuZXh0X2xldmVsICk7CisKKyAgICAgICAgLy9fQ1ZfQ0hFQ0soIGljdlB5ckRvd25fR2F1c3M1eDVfMzJmX0MzUiggcHlyYW1pZGEsIHN0ZXAsIHB5cmFtaWRhLCBzdGVwLCBzaXplLCBidWZmICkpOworICAgICAgICAvL19DVl9DSEVDSyggaWN2UHlyRG93bkJvcmRlcl8zMmZfQ25SKCBweXJhbWlkYSwgc3RlcCwgc2l6ZSwgcHlyYW1pZGEsIHN0ZXAsIGRzdF9zaXplLCAzICkpOworICAgICAgICBweXJhbVtsXSA9IHBfY3VyOworCisgICAgICAgIHNpemUud2lkdGggPSBkc3Rfc2l6ZS53aWR0aCAtIDE7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gZHN0X3NpemUuaGVpZ2h0IC0gMTsKKworICAgICAgICAvKiBmaWxsIGxheWVyICNsICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS5oZWlnaHQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggKGNoYXIqKXBfY3VyIC0gYnVmZmVyIDwgYnVmZmVyX3NpemUgKTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gc2l6ZS53aWR0aDsgaisrLCBwX2N1cisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwX2N1ci0+YyA9ICgoX0N2UkdCZiAqKSBweXJhbWlkYSlbaSAqIHJvaS53aWR0aCArIGpdOworICAgICAgICAgICAgICAgIHBfY3VyLT5wID0gJnN0dWI7CisgICAgICAgICAgICAgICAgcF9jdXItPmEgPSAwOworICAgICAgICAgICAgICAgIHBfY3VyLT5yZWN0LngyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2U3RhcnRBcHBlbmRUb1NlcSggY21wX3NlcSwgJndyaXRlciApOworCisgICAgLyogZG8gc2V2ZXJhbCBpdGVyYXRpb25zIHRvIGRldGVybWluZSBzb24tZmF0aGVyIGxpbmtzICovCisgICAgZm9yKCBjdXJfaXRlciA9IDA7IGN1cl9pdGVyIDwgbWF4X2l0ZXI7IGN1cl9pdGVyKysgKQorICAgIHsKKyAgICAgICAgaW50IGlzX2xhc3RfaXRlciA9IGN1cl9pdGVyID09IG1heF9pdGVyIC0gMTsKKworICAgICAgICBzaXplID0gcm9pOworCisgICAgICAgIC8qIGJ1aWxkIHNvbi1mYXRoZXIgbGlua3MgZG93biB1cCB0byBsZXZlbCAqLworICAgICAgICBmb3IoIGwgPSAwOyBsIDwgbGV2ZWw7IGwrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdlVwZGF0ZVB5ckxpbmtzXzh1X0MzKCBsLCBweXJhbVtsXSwgc2l6ZSwgcHlyYW1bbCArIDFdLCAmd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQpIHRocmVzaG9sZDEsIGlzX2xhc3RfaXRlciwgJnN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdldyaXRlUHlyTm9kZSApOworCisgICAgICAgICAgICAvKiBjbGVhciBsYXN0IGJvcmRlciByb3cgKi8KKyAgICAgICAgICAgIGlmKCBsID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgPSBweXJhbVtsXSArIChzaXplLndpZHRoICsgMSkgKiBzaXplLmhlaWdodDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMuYmx1ZSA9IHBfY3VyW2pdLmMuZ3JlZW4gPSBwX2N1cltqXS5jLnJlZCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemUud2lkdGggPj49IDE7CisgICAgICAgICAgICBzaXplLmhlaWdodCA+Pj0gMTsKKyAgICAgICAgfQorCisvKiAgY2xlYXIgdGhlIG9sZCBjIHZhbHVlIGZvciB0aGUgbGFzdCBsZXZlbCAgICAgKi8KKyAgICAgICAgcF9jdXIgPSBweXJhbVtsZXZlbF07CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS5oZWlnaHQ7IGkrKywgcF9jdXIgKz0gc2l6ZS53aWR0aCArIDEgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMuYmx1ZSA9IHBfY3VyW2pdLmMuZ3JlZW4gPSBwX2N1cltqXS5jLnJlZCA9IDA7CisKKyAgICAgICAgc2l6ZSA9IHJvaTsKKyAgICAgICAgc3RlcCA9IHJvaS53aWR0aDsKKworLyogY2FsY3VsYXRlIGF2ZXJhZ2UgYyB2YWx1ZSBmb3IgdGhlIDAgPCBsIDw9bGV2ZWwgICAqLworICAgICAgICBmb3IoIGwgPSAwOyBsIDwgbGV2ZWw7IGwrKywgc3RlcCA9IChzdGVwID4+IDEpICsgMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9DdlB5cmFtaWRDMyAqcF9wcmV2LCAqcF9yb3dfcHJldjsKKworICAgICAgICAgICAgc3R1Yi5jLmJsdWUgPSBzdHViLmMuZ3JlZW4gPSBzdHViLmMucmVkID0gMDsKKworICAgICAgICAgICAgLyogY2FsY3VsYXRlIGF2ZXJhZ2UgYyB2YWx1ZSBmb3IgdGhlIG5leHQgbGV2ZWwgICAqLworICAgICAgICAgICAgaWYoIGwgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9iYXNlID0gKF9DdlB5cmFtaWRCYXNlQzMgKikgcHlyYW1bMF07CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJvaS5oZWlnaHQ7IGkrKywgcF9iYXNlICs9IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWRDMyAqcCA9IHBfYmFzZVtqXS5wOworCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5jLmJsdWUgKz0gcF9iYXNlW2pdLmMuYmx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPmMuZ3JlZW4gKz0gcF9iYXNlW2pdLmMuZ3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5jLnJlZCArPSBwX2Jhc2Vbal0uYy5yZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXIgPSBweXJhbVtsXTsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgcF9jdXIgKz0gc2l6ZS53aWR0aCArIDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWRDMyAqcCA9IHBfY3VyW2pdLnA7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhID0gKGZsb2F0KSBwX2N1cltqXS5hOworCisgICAgICAgICAgICAgICAgICAgICAgICBwLT5jLmJsdWUgKz0gYSAqIHBfY3VyW2pdLmMuYmx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHAtPmMuZ3JlZW4gKz0gYSAqIHBfY3VyW2pdLmMuZ3JlZW47CisgICAgICAgICAgICAgICAgICAgICAgICBwLT5jLnJlZCArPSBhICogcF9jdXJbal0uYy5yZWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5hID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiggIWlzX2xhc3RfaXRlciApCisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltzaXplLndpZHRoXS5hID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoICFpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5hID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogYXNzaWduIHJhbmRvbSB2YWx1ZXMgb2YgdGhlIG5leHQgbGV2ZWwgbnVsbCBjICAgKi8KKyAgICAgICAgICAgIHBfY3VyID0gcHlyYW1bbCArIDFdOworICAgICAgICAgICAgcF9yb3dfcHJldiA9IHBfcHJldiA9IHB5cmFtW2xdOworCisgICAgICAgICAgICBzaXplLndpZHRoID4+PSAxOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPj49IDE7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS5oZWlnaHQ7IGkrKywgcF9jdXIgKz0gc2l6ZS53aWR0aCArIDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBpIDwgc2l6ZS5oZWlnaHQgfHwgIWlzX2xhc3RfaXRlciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBwX2N1cltqXS5hOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBpbnZfYTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhIDw9IF9DVl9JTlZfVEFCX1NJWkUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52X2EgPSBpY3ZJbnZUYWJbYSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZfYSA9IDEuZiAvIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMuYmx1ZSAqPSBpbnZfYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5jLmdyZWVuICo9IGludl9hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMucmVkICo9IGludl9hOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMgPSBwX3ByZXYtPmM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJldiA9IF9DVl9ORVhUX0JBU0VfQzMoIHBfcHJldiwgMiApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJldiArPSAyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBfY3VyW3NpemUud2lkdGhdLmEgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW3NpemUud2lkdGhdLmMgPSBwX3ByZXZbKGwgIT0gMCkgLSAxXS5jOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcF9jdXJbc2l6ZS53aWR0aF0uYy5ibHVlIC89IHBfY3VyW3NpemUud2lkdGhdLmE7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltzaXplLndpZHRoXS5jLmdyZWVuIC89IHBfY3VyW3NpemUud2lkdGhdLmE7CisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltzaXplLndpZHRoXS5jLnJlZCAvPSBwX2N1cltzaXplLndpZHRoXS5hOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlzX2xhc3RfaXRlciApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wX25vZGUuZGF0YSA9IHBfY3VyICsgc2l6ZS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY21wX25vZGUsIHdyaXRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBwX2N1cltqXS5hOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBpbnZfYTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhIDw9IF9DVl9JTlZfVEFCX1NJWkUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52X2EgPSBpY3ZJbnZUYWJbYSAtIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZfYSA9IDEuZiAvIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMuYmx1ZSAqPSBpbnZfYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5jLmdyZWVuICo9IGludl9hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMucmVkICo9IGludl9hOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21wX25vZGUuZGF0YSA9IHBfY3VyICsgajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY21wX25vZGUsIHdyaXRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfY3VyW2pdLmMgPSBwX3ByZXYtPmM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJldiA9IF9DVl9ORVhUX0JBU0VfQzMoIHBfcHJldiwgKGogKiAyIDwgc3RlcCAtIDIgPyAyIDogMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfcHJldisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGwgKyAxID09IGxldmVsICYmICFpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBwX2N1cltqXS5hID0gMDsKKworICAgICAgICAgICAgICAgIGlmKCAhKGkgJiAxKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX3ByZXYgPSBwX3Jvd19wcmV2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX3ByZXYgPSAoX0N2UHlyYW1pZEMzKikoKGNoYXIqKXBfcm93X3ByZXYgKyBzdGVwICoKKyAgICAgICAgICAgICAgICAgICAgICAgIChsID09IDAgPyBzaXplb2YoIF9DdlB5cmFtaWRCYXNlQzMgKSA6IHNpemVvZiggX0N2UHlyYW1pZEMzICkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGVuZCBvZiB0aGUgaXRlcmF0aW9uIHByb2Nlc3MgICovCisKKyAgICAvKiBjb25zdHJ1Y3QgYSBjb25uZWN0ZWQgIGNvbXBvbmVudHMgICAqLworICAgIHNpemUud2lkdGggPSByb2kud2lkdGggPj4gbGV2ZWw7CisgICAgc2l6ZS5oZWlnaHQgPSByb2kuaGVpZ2h0ID4+IGxldmVsOworCisgICAgcF9jdXIgPSBweXJhbVtsZXZlbF07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgcF9jdXIgKz0gc2l6ZS53aWR0aCArIDEgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwX2N1cltqXS5hICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNtcF9ub2RlLmRhdGEgPSBwX2N1ciArIGo7CisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGNtcF9ub2RlLCB3cml0ZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKworLyogY2x1c3Rlcml6YXRpb24gc2VnbWVudGVkIGNvbXBvbmVudHMgYW5kIGNvbnN0cnVjdGlvbiAKKyAgIG91dHB1dCBjb25uZWN0ZWQgY29tcG9uZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGljdlNlZ21lbnRDbHVzdGVyQzMoIGNtcF9zZXEsIHJlc19zZXEsIHRocmVzaG9sZDIsIHB5cmFtWzFdLCByb2kgKTsKKworLyogY29udmVydCAoaW5wbGFjZSkgcmVzdWx0YW50IHNlZ21lbnQgdmFsdWVzIHRvIGludCAodG9wIGxldmVsKSAqLworCisvKiBwcm9wYWdhdGUgc2VnbWVudCB2YWx1ZXMgdG9wIGRvd24gKi8KKyAgICBmb3IoIGwgPSBsZXZlbCAtIDE7IGwgPj0gMDsgbC0tICkKKyAgICB7CisgICAgICAgIHBfY3VyID0gcHlyYW1bbF07CisKKyAgICAgICAgc2l6ZS53aWR0aCA8PD0gMTsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPDw9IDE7CisKKyAgICAgICAgaWYoIGwgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGgtLTsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0LS07CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUuaGVpZ2h0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX0N2UHlyYW1pZEMzICpwID0gcF9jdXItPnA7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHAgIT0gMCApOworICAgICAgICAgICAgICAgIGlmKCBwICE9ICZzdHViICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyLT5jID0gcC0+YzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggbCA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2MzJzdWYgX2M7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvcHkgdGhlIHNlZ21lbnRlZCB2YWx1ZXMgdG8gZGVzdGluYXRpb24gaW1hZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgX2MuZiA9IHBfY3VyLT5jLmJsdWU7IGRzdF9pbWFnZVtqKjNdID0gKHVjaGFyKV9jLmk7CisgICAgICAgICAgICAgICAgICAgIF9jLmYgPSBwX2N1ci0+Yy5ncmVlbjsgZHN0X2ltYWdlW2oqMysxXSA9ICh1Y2hhcilfYy5pOworICAgICAgICAgICAgICAgICAgICBfYy5mID0gcF9jdXItPmMucmVkOyBkc3RfaW1hZ2VbaiozKzJdID0gKHVjaGFyKV9jLmk7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyID0gX0NWX05FWFRfQkFTRV9DMyhwX2N1ciwxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbCA9PSAwICkKKyAgICAgICAgICAgICAgICBkc3RfaW1hZ2UgKz0gZHN0X3N0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgTV9FTkQ6CisKKyAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisKKyAgICBpZiggc3RhdHVzID09IENWX09LICkKKyAgICAgICAgKmRzdF9jb21wID0gcmVzX3NlcTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdGljIEN2U3RhdHVzIGljdlVwZGF0ZVB5ckxpbmtzXzh1X0MxCisgICAgKGludCBsYXllciwgdm9pZCAqbGF5ZXJfZGF0YSwgQ3ZTaXplIHNpemUsIHZvaWQgKnBhcmVudF9sYXllciwKKyAgICAgdm9pZCAqX3dyaXRlciwgZmxvYXQgdGhyZXNob2xkLCBpbnQgaXNfbGFzdF9pdGVyLCB2b2lkICpfc3R1YiwgQ3ZXcml0ZU5vZGVGdW5jdGlvbiAvKmZ1bmMqLykKK3sKKyAgICBpbnQgaSwgajsKKyAgICBfQ3ZMaXN0Tm9kZSBjbXBfbm9kZTsKKworICAgIF9DdlB5cmFtaWQgKnN0dWIgPSAoX0N2UHlyYW1pZCAqKSBfc3R1YjsKKyAgICBfQ3ZQeXJhbWlkICpwX2N1ciA9IChfQ3ZQeXJhbWlkICopIGxheWVyX2RhdGE7CisgICAgX0N2UHlyYW1pZCAqcF9uZXh0MSA9IChfQ3ZQeXJhbWlkICopIHBhcmVudF9sYXllcjsKKyAgICBfQ3ZQeXJhbWlkICpwX25leHQzID0gcF9uZXh0MSArIChzaXplLndpZHRoID4+IDEpICsgMTsKKworICAgIEN2U2VxV3JpdGVyICYgd3JpdGVyID0gKihDdlNlcVdyaXRlciAqKSBfd3JpdGVyOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGogKz0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGMwLCBjMSwgYzIsIGMzLCBjNDsKKyAgICAgICAgICAgIF9DdlB5cmFtaWQgKnA7CisKKy8qIHNvbi1mYXRoZXIgdGhyZXNob2xkIGxpbmtpbmcgZm9yIHRoZSBjdXJyZW50IG5vZGUgZXN0YWJsaXNoICovCisgICAgICAgICAgICBjMCA9IHBfY3VyLT5jOworCisvKiBmaW5kIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgYzEgPSAoZmxvYXQpIGZhYnMoIGMwIC0gcF9uZXh0MVswXS5jICk7CisgICAgICAgICAgICBjMiA9IChmbG9hdCkgZmFicyggYzAgLSBwX25leHQxWzFdLmMgKTsKKyAgICAgICAgICAgIGMzID0gKGZsb2F0KSBmYWJzKCBjMCAtIHBfbmV4dDNbMF0uYyApOworICAgICAgICAgICAgYzQgPSAoZmxvYXQpIGZhYnMoIGMwIC0gcF9uZXh0M1sxXS5jICk7CisKKyAgICAgICAgICAgIHAgPSBwX25leHQxOworCisgICAgICAgICAgICBpZiggYzEgPiBjMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCA9IHBfbmV4dDEgKyAxOworICAgICAgICAgICAgICAgIGMxID0gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggYzEgPiBjMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCA9IHBfbmV4dDM7CisgICAgICAgICAgICAgICAgYzEgPSBjMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBjMSA+IGM0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gcF9uZXh0MyArIDE7CisgICAgICAgICAgICAgICAgYzEgPSBjNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGMxIDw9IHRocmVzaG9sZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXItPnAgPSBwOworCisgICAgICAgICAgICAgICAgaWYoIGxheWVyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+YSsrOworICAgICAgICAgICAgICAgICAgICBwX2N1ciA9IChfQ3ZQeXJhbWlkKikoKGNoYXIqKXBfY3VyICsgc2l6ZW9mKF9DdlB5cmFtaWRCYXNlKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWN2TWF4Um9pMSggJihwLT5yZWN0KSwgaiwgaSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IHBfY3VyLT5hOworCisgICAgICAgICAgICAgICAgICAgIHAtPmEgKz0gYTsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXItPmMgPSAwOworICAgICAgICAgICAgICAgICAgICBwX2N1cisrOworICAgICAgICAgICAgICAgICAgICBpZiggaXNfbGFzdF9pdGVyICYmIGEgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZNYXhSb2koICYocC0+cmVjdCksICYocF9jdXJbLTFdLnJlY3QpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyLT5wID0gc3R1YjsKKyAgICAgICAgICAgICAgICBpZiggaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNtcF9ub2RlLmRhdGEgPSBwX2N1cjsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGNtcF9ub2RlLCB3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGxheWVyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgPSBfQ1ZfTkVYVF9CQVNFX0MxKHBfY3VyLDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX2N1ci0+YyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBmaW5kIHBvaW50ZXIgZm9yIHRoZSBzZWNvbmQgcGl4ZWwgKi8KKyAgICAgICAgICAgIGMwID0gcF9jdXItPmM7CisKKyAgICAgICAgICAgIGMxID0gKGZsb2F0KSBmYWJzKCBjMCAtIHBfbmV4dDFbMF0uYyApOworICAgICAgICAgICAgYzIgPSAoZmxvYXQpIGZhYnMoIGMwIC0gcF9uZXh0MVsxXS5jICk7CisgICAgICAgICAgICBjMyA9IChmbG9hdCkgZmFicyggYzAgLSBwX25leHQzWzBdLmMgKTsKKyAgICAgICAgICAgIGM0ID0gKGZsb2F0KSBmYWJzKCBjMCAtIHBfbmV4dDNbMV0uYyApOworCisgICAgICAgICAgICBwID0gcF9uZXh0MTsKKyAgICAgICAgICAgIHBfbmV4dDErKzsKKworICAgICAgICAgICAgaWYoIGMxID4gYzIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBwX25leHQxOworICAgICAgICAgICAgICAgIGMxID0gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggYzEgPiBjMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCA9IHBfbmV4dDM7CisgICAgICAgICAgICAgICAgYzEgPSBjMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9uZXh0MysrOworICAgICAgICAgICAgaWYoIGMxID4gYzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBwX25leHQzOworICAgICAgICAgICAgICAgIGMxID0gYzQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjMSA8PSB0aHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyLT5wID0gcDsKKworICAgICAgICAgICAgICAgIGlmKCBsYXllciA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHAtPmErKzsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgPSBfQ1ZfTkVYVF9CQVNFX0MxKHBfY3VyLDEpOworICAgICAgICAgICAgICAgICAgICBpZiggaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaTEoICYocC0+cmVjdCksIGogKyAxLCBpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBhID0gcF9jdXItPmE7CisKKyAgICAgICAgICAgICAgICAgICAgcC0+YSArPSBhOworICAgICAgICAgICAgICAgICAgICBwX2N1ci0+YyA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyKys7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgJiYgYSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaSggJihwLT5yZWN0KSwgJihwX2N1clstMV0ucmVjdCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXItPnAgPSBzdHViOworICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY21wX25vZGUuZGF0YSA9IHBfY3VyOworICAgICAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY21wX25vZGUsIHdyaXRlciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbGF5ZXIgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX2N1ciA9IF9DVl9ORVhUX0JBU0VfQzEocF9jdXIsMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyLT5jID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjbGVhciBjJ3MgKi8KKyAgICAgICAgaWYoIGxheWVyID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyLT5jID0gMDsKKyAgICAgICAgICAgIHBfY3VyKys7CisgICAgICAgIH0KKworICAgICAgICBpZiggIShpICYgMSkgKQorICAgICAgICB7CisgICAgICAgICAgICBwX25leHQxIC09IHNpemUud2lkdGggPj4gMTsKKyAgICAgICAgICAgIHBfbmV4dDMgLT0gc2l6ZS53aWR0aCA+PiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcF9uZXh0MSsrOworICAgICAgICAgICAgcF9uZXh0MysrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBpY3ZVcGRhdGVQeXJMaW5rc184dV9DMworICAgIChpbnQgbGF5ZXIsIHZvaWQgKmxheWVyX2RhdGEsIEN2U2l6ZSBzaXplLCB2b2lkICpwYXJlbnRfbGF5ZXIsCisgICAgIHZvaWQgKl93cml0ZXIsIGZsb2F0IHRocmVzaG9sZCwgaW50IGlzX2xhc3RfaXRlciwgdm9pZCAqX3N0dWIsIEN2V3JpdGVOb2RlRnVuY3Rpb24gLypmdW5jKi8pCit7CisgICAgaW50IGksIGo7CisgICAgX0N2TGlzdE5vZGUgY21wX25vZGU7CisKKyAgICBfQ3ZQeXJhbWlkQzMgKnN0dWIgPSAoX0N2UHlyYW1pZEMzICopIF9zdHViOworICAgIF9DdlB5cmFtaWRDMyAqcF9jdXIgPSAoX0N2UHlyYW1pZEMzICopIGxheWVyX2RhdGE7CisgICAgX0N2UHlyYW1pZEMzICpwX25leHQxID0gKF9DdlB5cmFtaWRDMyAqKSBwYXJlbnRfbGF5ZXI7CisgICAgX0N2UHlyYW1pZEMzICpwX25leHQzID0gcF9uZXh0MSArIChzaXplLndpZHRoID4+IDEpICsgMTsKKworICAgIEN2U2VxV3JpdGVyICYgd3JpdGVyID0gKihDdlNlcVdyaXRlciAqKSBfd3JpdGVyOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGogKz0gMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGMxLCBjMiwgYzMsIGM0OworICAgICAgICAgICAgX0N2UHlyYW1pZEMzICpwOworCisvKiBmaW5kIHBvaW50ZXIgZm9yIHRoZSBmaXJzdCBwaXhlbCAqLworICAgICAgICAgICAgYzEgPSBfQ1ZfUkdCX0RJU1QoIHBfY3VyLT5jLCBwX25leHQxWzBdLmMgKTsKKyAgICAgICAgICAgIGMyID0gX0NWX1JHQl9ESVNUKCBwX2N1ci0+YywgcF9uZXh0MVsxXS5jICk7CisgICAgICAgICAgICBjMyA9IF9DVl9SR0JfRElTVCggcF9jdXItPmMsIHBfbmV4dDNbMF0uYyApOworICAgICAgICAgICAgYzQgPSBfQ1ZfUkdCX0RJU1QoIHBfY3VyLT5jLCBwX25leHQzWzFdLmMgKTsKKworICAgICAgICAgICAgcCA9IHBfbmV4dDE7CisKKyAgICAgICAgICAgIGlmKCBjMSA+IGMyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gcF9uZXh0MSArIDE7CisgICAgICAgICAgICAgICAgYzEgPSBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBjMSA+IGMzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwID0gcF9uZXh0MzsKKyAgICAgICAgICAgICAgICBjMSA9IGMzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGMxID4gYzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBwX25leHQzICsgMTsKKyAgICAgICAgICAgICAgICBjMSA9IGM0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggYzEgPCB0aHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBfY3VyLT5wID0gcDsKKworICAgICAgICAgICAgICAgIGlmKCBsYXllciA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHAtPmErKzsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgPSBfQ1ZfTkVYVF9CQVNFX0MzKHBfY3VyLDEpOworICAgICAgICAgICAgICAgICAgICBpZiggaXNfbGFzdF9pdGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaTEoICYocC0+cmVjdCksIGosIGkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBwX2N1ci0+YTsKKworICAgICAgICAgICAgICAgICAgICBwLT5hICs9IGE7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyLT5jLmJsdWUgPSBwX2N1ci0+Yy5ncmVlbiA9IHBfY3VyLT5jLnJlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyKys7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgJiYgYSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaSggJihwLT5yZWN0KSwgJihwX2N1clstMV0ucmVjdCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXItPnAgPSBzdHViOworICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgLyogJiYgKCA9PSAwIHx8IHBfY3VyLT5hICE9IDApICovICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbXBfbm9kZS5kYXRhID0gcF9jdXI7CisgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBjbXBfbm9kZSwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGxheWVyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIgPSBfQ1ZfTkVYVF9CQVNFX0MzKHBfY3VyLDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwX2N1ci0+Yy5ibHVlID0gcF9jdXItPmMuZ3JlZW4gPSBwX2N1ci0+Yy5yZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBwX2N1cisrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmluZCBwb2ludGVyIGZvciB0aGUgc2Vjb25kIHBpeGVsICovCisgICAgICAgICAgICBjMSA9IF9DVl9SR0JfRElTVCggcF9jdXItPmMsIHBfbmV4dDFbMF0uYyApOworICAgICAgICAgICAgYzIgPSBfQ1ZfUkdCX0RJU1QoIHBfY3VyLT5jLCBwX25leHQxWzFdLmMgKTsKKyAgICAgICAgICAgIGMzID0gX0NWX1JHQl9ESVNUKCBwX2N1ci0+YywgcF9uZXh0M1swXS5jICk7CisgICAgICAgICAgICBjNCA9IF9DVl9SR0JfRElTVCggcF9jdXItPmMsIHBfbmV4dDNbMV0uYyApOworCisgICAgICAgICAgICBwID0gcF9uZXh0MTsKKyAgICAgICAgICAgIHBfbmV4dDErKzsKKworICAgICAgICAgICAgaWYoIGMxID4gYzIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBwX25leHQxOworICAgICAgICAgICAgICAgIGMxID0gYzI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggYzEgPiBjMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcCA9IHBfbmV4dDM7CisgICAgICAgICAgICAgICAgYzEgPSBjMzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcF9uZXh0MysrOworICAgICAgICAgICAgaWYoIGMxID4gYzQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAgPSBwX25leHQzOworICAgICAgICAgICAgICAgIGMxID0gYzQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjMSA8IHRocmVzaG9sZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXItPnAgPSBwOworCisgICAgICAgICAgICAgICAgaWYoIGxheWVyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcC0+YSsrOworICAgICAgICAgICAgICAgICAgICBwX2N1ciA9IF9DVl9ORVhUX0JBU0VfQzMocF9jdXIsMSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWN2TWF4Um9pMSggJihwLT5yZWN0KSwgaiArIDEsIGkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGEgPSBwX2N1ci0+YTsKKworICAgICAgICAgICAgICAgICAgICBwLT5hICs9IGE7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyLT5jLmJsdWUgPSBwX2N1ci0+Yy5ncmVlbiA9IHBfY3VyLT5jLnJlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyKys7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgJiYgYSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaSggJihwLT5yZWN0KSwgJihwX2N1clstMV0ucmVjdCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcF9jdXItPnAgPSBzdHViOworICAgICAgICAgICAgICAgIGlmKCBpc19sYXN0X2l0ZXIgLyogJiYgKCA9PSAwIHx8IHBfY3VyLT5hICE9IDApICovICApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbXBfbm9kZS5kYXRhID0gcF9jdXI7CisgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBjbXBfbm9kZSwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBsYXllciA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBfY3VyID0gX0NWX05FWFRfQkFTRV9DMyhwX2N1ciwxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXItPmMuYmx1ZSA9IHBfY3VyLT5jLmdyZWVuID0gcF9jdXItPmMucmVkID0gMDsKKyAgICAgICAgICAgICAgICAgICAgcF9jdXIrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBjbGVhciBjJ3MgKi8KKyAgICAgICAgaWYoIGxheWVyID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfY3VyLT5jLmJsdWUgPSBwX2N1ci0+Yy5ncmVlbiA9IHBfY3VyLT5jLnJlZCA9IDA7CisgICAgICAgICAgICBwX2N1cisrOworICAgICAgICB9CisKKyAgICAgICAgaWYoICEoaSAmIDEpICkKKyAgICAgICAgeworICAgICAgICAgICAgcF9uZXh0MSAtPSBzaXplLndpZHRoID4+IDE7CisgICAgICAgICAgICBwX25leHQzIC09IHNpemUud2lkdGggPj4gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBfbmV4dDErKzsKKyAgICAgICAgICAgIHBfbmV4dDMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCisgICAgY2x1c3Rlcml6YXRpb24gc2VnbWVudGVkIGNvbXBvbmVudHMgICAgCisKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ljdkV4cGFuZEJhc2VMZXZlbEMxKCBfQ3ZQeXJhbWlkICogYmFzZV9wLCBfQ3ZQeXJhbWlkICogcCwgX0N2UHlyYW1pZEJhc2UgKiBzdGFydCwgaW50IHdpZHRoICkKK3sKKyAgICBpbnQgeCA9IChpbnQpKChfQ3ZQeXJhbWlkQmFzZSAqKSBiYXNlX3AgLSBzdGFydCk7CisgICAgaW50IHkgPSB4IC8gd2lkdGg7CisKKyAgICB4IC09IHkgKiB3aWR0aDsKKyAgICBwLT5hID0gMTsKKyAgICBwLT5yZWN0LngxID0gKHVzaG9ydCkgeDsKKyAgICBwLT5yZWN0LnkxID0gKHVzaG9ydCkgeTsKKyAgICBwLT5yZWN0LngyID0gKHVzaG9ydCkgKHggKyAxKTsKKyAgICBwLT5yZWN0LnkyID0gKHVzaG9ydCkgKHkgKyAxKTsKKyAgICBwLT5jID0gYmFzZV9wLT5jOworfQorCitDdlN0YXR1cworaWN2U2VnbWVudENsdXN0ZXJDMSggQ3ZTZXEgKiBjbXBfc2VxLCBDdlNlcSAqIHJlc19zZXEsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhyZXNob2xkLCBfQ3ZQeXJhbWlkICogZmlyc3RfbGV2ZWxfZW5kLCBDdlNpemUgZmlyc3RfbGV2ZWxfc2l6ZSApCit7CisgICAgY29uc3QgZG91YmxlIGVwcyA9IDEuOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgX0N2UHlyYW1pZCB0ZW1wX2NtcDsKKyAgICBfQ3ZQeXJhbWlkQmFzZSAqZmlyc3RfbGV2ZWxfc3RhcnQgPSAoX0N2UHlyYW1pZEJhc2UgKikgZmlyc3RfbGV2ZWxfZW5kIC0KKyAgICAgICAgZmlyc3RfbGV2ZWxfc2l6ZS53aWR0aCAqIGZpcnN0X2xldmVsX3NpemUuaGVpZ2h0OworICAgIGludCBjLCBpLCBjb3VudCA9IGNtcF9zZXEtPnRvdGFsOworCisgICAgY3ZTdGFydFJlYWRTZXEoIGNtcF9zZXEsICZyZWFkZXIsIDAgKTsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIHJlc19zZXEsICZ3cml0ZXIgKTsKKworICAgIGlmKCB0aHJlc2hvbGQgPCBlcHMgKQorICAgIHsKKyAgICAgICAgLyogaWYgdGhyZXNob2xkIGlzIHRvbyBzbWFsbCB0aGVuIHNpbXBseSBjb3B5IGFsbAorICAgICAgICAgICB0aGUgY29tcG9uZW50cyB0byB0aGUgb3V0cHV0IHNlcXVlbmNlICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZDb25uZWN0ZWRDb21wIGNvbXA7CisgICAgICAgICAgICBfQ3ZQeXJhbWlkICpjbXAgPSAoX0N2UHlyYW1pZCAqKSAoKChfQ3ZMaXN0Tm9kZSAqKSByZWFkZXIucHRyKS0+ZGF0YSk7CisgICAgICAgICAgICBDdjMyc3VmIF9jOworCisgICAgICAgICAgICBpZiggY21wIDwgZmlyc3RfbGV2ZWxfZW5kICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpY3ZFeHBhbmRCYXNlTGV2ZWxDMSggY21wLCAmdGVtcF9jbXAsIGZpcnN0X2xldmVsX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9sZXZlbF9zaXplLndpZHRoICk7CisgICAgICAgICAgICAgICAgY21wID0gJnRlbXBfY21wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfYy5pID0gY3ZSb3VuZCggY21wLT5jICk7CisgICAgICAgICAgICBjbXAtPmMgPSBfYy5mOworICAgICAgICAgICAgY29tcC52YWx1ZSA9IGN2UmVhbFNjYWxhcihfYy5pKTsKKyAgICAgICAgICAgIGNvbXAuYXJlYSA9IGNtcC0+YTsKKyAgICAgICAgICAgIGNvbXAucmVjdC54ID0gY21wLT5yZWN0LngxOworICAgICAgICAgICAgY29tcC5yZWN0LnkgPSBjbXAtPnJlY3QueTE7CisgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSBjbXAtPnJlY3QueDIgLSBjbXAtPnJlY3QueDE7CisgICAgICAgICAgICBjb21wLnJlY3QuaGVpZ2h0ID0gY21wLT5yZWN0LnkyIC0gY21wLT5yZWN0LnkxOworICAgICAgICAgICAgY29tcC5jb250b3VyID0gMDsKKworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGNvbXAsIHdyaXRlciApOworICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKCBfQ3ZMaXN0Tm9kZSApLCByZWFkZXIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBfQ3ZMaXN0Tm9kZSBzdHViX25vZGU7CisgICAgICAgIF9Ddkxpc3ROb2RlICpwcmV2ID0gJnN0dWJfbm9kZTsKKworICAgICAgICBzdHViX25vZGUubmV4dCA9IDA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBfQ3ZMaXN0Tm9kZSAqbm9kZSA9IChfQ3ZMaXN0Tm9kZSAqKSByZWFkZXIucHRyOworCisgICAgICAgICAgICBwcmV2LT5uZXh0ID0gbm9kZTsKKyAgICAgICAgICAgIHByZXYgPSBub2RlOworICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKCBfQ3ZMaXN0Tm9kZSApLCByZWFkZXIgKTsKKyAgICAgICAgfQorICAgICAgICBwcmV2LT5uZXh0ID0gMDsKKyAgICAgICAgcHJldiA9IHN0dWJfbm9kZS5uZXh0OworCisgICAgICAgIHdoaWxlKCBwcmV2ICkKKyAgICAgICAgeworICAgICAgICAgICAgX0N2TGlzdE5vZGUgKm5vZGUgPSBwcmV2LT5uZXh0OworICAgICAgICAgICAgX0N2TGlzdE5vZGUgKmFjYyA9IHByZXY7CisgICAgICAgICAgICBfQ3ZQeXJhbWlkICpjbXAgPSAoX0N2UHlyYW1pZCAqKSAoYWNjLT5kYXRhKTsKKyAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCBjb21wOworICAgICAgICAgICAgZmxvYXQgYzAgPSBjbXAtPmM7CisKKyAgICAgICAgICAgIGlmKCBjbXAgPCBmaXJzdF9sZXZlbF9lbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGljdkV4cGFuZEJhc2VMZXZlbEMxKCBjbXAsICZ0ZW1wX2NtcCwgZmlyc3RfbGV2ZWxfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2xldmVsX3NpemUud2lkdGggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wX2NtcCA9ICpjbXA7CisgICAgICAgICAgICAgICAgdGVtcF9jbXAuYyAqPSB0ZW1wX2NtcC5hOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhY2MtPm5leHQgPSAwOworICAgICAgICAgICAgc3R1Yl9ub2RlLm5leHQgPSAwOworICAgICAgICAgICAgcHJldiA9ICZzdHViX25vZGU7CisKKyAgICAgICAgICAgIHdoaWxlKCBub2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbXAgPSAoX0N2UHlyYW1pZCAqKSAobm9kZS0+ZGF0YSk7CisgICAgICAgICAgICAgICAgaWYoIGZhYnMoIGMwIC0gY21wLT5jICkgPCB0aHJlc2hvbGQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX0N2UHlyYW1pZCB0ZW1wOworCisgICAgICAgICAgICAgICAgICAgIC8qIGV4Y2x1ZGUgZnJvbSBnbG9iYWwgbGlzdCBhbmQgYWRkIHRvIGxpc3Qgb2Ygam9pbnQgY29tcG9uZW50ICovCisgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID0gYWNjOworICAgICAgICAgICAgICAgICAgICBhY2MgPSBub2RlOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjbXAgPCBmaXJzdF9sZXZlbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZFeHBhbmRCYXNlTGV2ZWxDMSggY21wLCAmdGVtcCwgZmlyc3RfbGV2ZWxfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGV2ZWxfc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgICAgICAgICAgY21wID0gJnRlbXA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0ZW1wX2NtcC5hICs9IGNtcC0+YTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9jbXAuYyArPSBjbXAtPmMgKiBjbXAtPmE7CisgICAgICAgICAgICAgICAgICAgIGljdk1heFJvaSggJih0ZW1wX2NtcC5yZWN0KSwgJihjbXAtPnJlY3QpICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcmV2ID09ICZzdHViX25vZGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHViX25vZGUubmV4dCA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IG5vZGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGUgPSBwcmV2LT5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggdGVtcF9jbXAuYSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gY3ZSb3VuZCggdGVtcF9jbXAuYyAvIHRlbXBfY21wLmEgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gY3ZSb3VuZCggYzAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBhY2M7CisKKyAgICAgICAgICAgIHdoaWxlKCBub2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdjMyc3VmIF9jOworICAgICAgICAgICAgICAgIGNtcCA9IChfQ3ZQeXJhbWlkICopIChub2RlLT5kYXRhKTsKKyAgICAgICAgICAgICAgICBfYy5pID0gYzsgY21wLT5jID0gX2MuZjsKKyAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29tcC52YWx1ZSA9IGN2UmVhbFNjYWxhcihjKTsKKyAgICAgICAgICAgIGNvbXAuYXJlYSA9IHRlbXBfY21wLmE7CisgICAgICAgICAgICBjb21wLnJlY3QueCA9IHRlbXBfY21wLnJlY3QueDE7CisgICAgICAgICAgICBjb21wLnJlY3QueSA9IHRlbXBfY21wLnJlY3QueTE7CisgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSB0ZW1wX2NtcC5yZWN0LngyIC0gdGVtcF9jbXAucmVjdC54MTsKKyAgICAgICAgICAgIGNvbXAucmVjdC5oZWlnaHQgPSB0ZW1wX2NtcC5yZWN0LnkyIC0gdGVtcF9jbXAucmVjdC55MTsKKyAgICAgICAgICAgIGNvbXAuY29udG91ciA9IDA7CisKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBjb21wLCB3cml0ZXIgKTsKKyAgICAgICAgICAgIHByZXYgPSBzdHViX25vZGUubmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCisgICAgY2x1c3Rlcml6YXRpb24gc2VnbWVudGVkIGNvbXBvbmVudHMgICAgCisKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ljdkV4cGFuZEJhc2VMZXZlbEMzKCBfQ3ZQeXJhbWlkQzMgKiBiYXNlX3AsIF9DdlB5cmFtaWRDMyAqIHAsCisgICAgICAgICAgICAgICAgICAgICAgX0N2UHlyYW1pZEJhc2VDMyAqIHN0YXJ0LCBpbnQgd2lkdGggKQoreworICAgIGludCB4ID0gKGludCkoKF9DdlB5cmFtaWRCYXNlQzMgKikgYmFzZV9wIC0gc3RhcnQpOworICAgIGludCB5ID0geCAvIHdpZHRoOworCisgICAgeCAtPSB5ICogd2lkdGg7CisgICAgcC0+YSA9IDE7CisgICAgcC0+cmVjdC54MSA9ICh1c2hvcnQpIHg7CisgICAgcC0+cmVjdC55MSA9ICh1c2hvcnQpIHk7CisgICAgcC0+cmVjdC54MiA9ICh1c2hvcnQpICh4ICsgMSk7CisgICAgcC0+cmVjdC55MiA9ICh1c2hvcnQpICh5ICsgMSk7CisgICAgcC0+YyA9IGJhc2VfcC0+YzsKK30KKworQ3ZTdGF0dXMKK2ljdlNlZ21lbnRDbHVzdGVyQzMoIEN2U2VxICogY21wX3NlcSwgQ3ZTZXEgKiByZXNfc2VxLAorICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWRDMyAqIGZpcnN0X2xldmVsX2VuZCwgQ3ZTaXplIGZpcnN0X2xldmVsX3NpemUgKQoreworICAgIGNvbnN0IGRvdWJsZSBlcHMgPSAxLjsKKyAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIF9DdlB5cmFtaWRDMyB0ZW1wX2NtcDsKKyAgICBfQ3ZQeXJhbWlkQmFzZUMzICpmaXJzdF9sZXZlbF9zdGFydCA9IChfQ3ZQeXJhbWlkQmFzZUMzICopIGZpcnN0X2xldmVsX2VuZCAtCisgICAgICAgIGZpcnN0X2xldmVsX3NpemUud2lkdGggKiBmaXJzdF9sZXZlbF9zaXplLmhlaWdodDsKKyAgICBpbnQgaSwgY291bnQgPSBjbXBfc2VxLT50b3RhbDsKKyAgICBpbnQgY19ibHVlLCBjX2dyZWVuLCBjX3JlZDsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBjbXBfc2VxLCAmcmVhZGVyLCAwICk7CisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCByZXNfc2VxLCAmd3JpdGVyICk7CisKKyAgICBpZiggdGhyZXNob2xkIDwgZXBzICkKKyAgICB7CisgICAgICAgIC8qIGlmIHRocmVzaG9sZCBpcyB0b28gc21hbGwgdGhlbiBzaW1wbHkgY29weSBhbGwKKyAgICAgICAgICAgdGhlIGNvbXBvbmVudHMgdG8gdGhlIG91dHB1dCBzZXF1ZW5jZSAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCBjb21wOworICAgICAgICAgICAgX0N2UHlyYW1pZEMzICpjbXAgPSAoX0N2UHlyYW1pZEMzICopICgoKF9Ddkxpc3ROb2RlICopIHJlYWRlci5wdHIpLT5kYXRhKTsKKyAgICAgICAgICAgIEN2MzJzdWYgX2M7CisKKyAgICAgICAgICAgIGlmKCBjbXAgPCBmaXJzdF9sZXZlbF9lbmQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGljdkV4cGFuZEJhc2VMZXZlbEMzKCBjbXAsICZ0ZW1wX2NtcCwgZmlyc3RfbGV2ZWxfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X2xldmVsX3NpemUud2lkdGggKTsKKyAgICAgICAgICAgICAgICBjbXAgPSAmdGVtcF9jbXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNfYmx1ZSA9IGN2Um91bmQoIGNtcC0+Yy5ibHVlICk7CisgICAgICAgICAgICBjX2dyZWVuID0gY3ZSb3VuZCggY21wLT5jLmdyZWVuICk7CisgICAgICAgICAgICBjX3JlZCA9IGN2Um91bmQoIGNtcC0+Yy5yZWQgKTsKKyAgICAgICAgICAgIF9jLmkgPSBjX2JsdWU7IGNtcC0+Yy5ibHVlID0gX2MuZjsKKyAgICAgICAgICAgIF9jLmkgPSBjX2dyZWVuOyBjbXAtPmMuZ3JlZW4gPSBfYy5mOworICAgICAgICAgICAgX2MuaSA9IGNfcmVkOyBjbXAtPmMucmVkID0gX2MuZjsKKyAgICAgICAgICAgIGNvbXAudmFsdWUgPSBjdlNjYWxhciggY19ibHVlLCBjX2dyZWVuLCBjX3JlZCApOworICAgICAgICAgICAgY29tcC5hcmVhID0gY21wLT5hOworICAgICAgICAgICAgY29tcC5yZWN0LnggPSBjbXAtPnJlY3QueDE7CisgICAgICAgICAgICBjb21wLnJlY3QueSA9IGNtcC0+cmVjdC55MTsKKyAgICAgICAgICAgIGNvbXAucmVjdC53aWR0aCA9IGNtcC0+cmVjdC54MiAtIGNtcC0+cmVjdC54MTsKKyAgICAgICAgICAgIGNvbXAucmVjdC5oZWlnaHQgPSBjbXAtPnJlY3QueTIgLSBjbXAtPnJlY3QueTE7CisgICAgICAgICAgICBjb21wLmNvbnRvdXIgPSAwOworCisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggY29tcCwgd3JpdGVyICk7CisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoIF9Ddkxpc3ROb2RlICksIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIF9Ddkxpc3ROb2RlIHN0dWJfbm9kZTsKKyAgICAgICAgX0N2TGlzdE5vZGUgKnByZXYgPSAmc3R1Yl9ub2RlOworCisgICAgICAgIHN0dWJfbm9kZS5uZXh0ID0gMDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIF9Ddkxpc3ROb2RlICpub2RlID0gKF9Ddkxpc3ROb2RlICopIHJlYWRlci5wdHI7CisKKyAgICAgICAgICAgIHByZXYtPm5leHQgPSBub2RlOworICAgICAgICAgICAgcHJldiA9IG5vZGU7CisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoIF9Ddkxpc3ROb2RlICksIHJlYWRlciApOworICAgICAgICB9CisgICAgICAgIHByZXYtPm5leHQgPSAwOworICAgICAgICBwcmV2ID0gc3R1Yl9ub2RlLm5leHQ7CisKKyAgICAgICAgd2hpbGUoIHByZXYgKQorICAgICAgICB7CisgICAgICAgICAgICBfQ3ZMaXN0Tm9kZSAqbm9kZSA9IHByZXYtPm5leHQ7CisgICAgICAgICAgICBfQ3ZMaXN0Tm9kZSAqYWNjID0gcHJldjsKKyAgICAgICAgICAgIF9DdlB5cmFtaWRDMyAqY21wID0gKF9DdlB5cmFtaWRDMyAqKSAoYWNjLT5kYXRhKTsKKyAgICAgICAgICAgIEN2Q29ubmVjdGVkQ29tcCBjb21wOworICAgICAgICAgICAgX0N2UkdCZiBjMCA9IGNtcC0+YzsKKworICAgICAgICAgICAgaWYoIGNtcCA8IGZpcnN0X2xldmVsX2VuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWN2RXhwYW5kQmFzZUxldmVsQzMoIGNtcCwgJnRlbXBfY21wLCBmaXJzdF9sZXZlbF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGV2ZWxfc2l6ZS53aWR0aCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXBfY21wID0gKmNtcDsKKyAgICAgICAgICAgICAgICB0ZW1wX2NtcC5jLmJsdWUgKj0gdGVtcF9jbXAuYTsKKyAgICAgICAgICAgICAgICB0ZW1wX2NtcC5jLmdyZWVuICo9IHRlbXBfY21wLmE7CisgICAgICAgICAgICAgICAgdGVtcF9jbXAuYy5yZWQgKj0gdGVtcF9jbXAuYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWNjLT5uZXh0ID0gMDsKKyAgICAgICAgICAgIHN0dWJfbm9kZS5uZXh0ID0gMDsKKyAgICAgICAgICAgIHByZXYgPSAmc3R1Yl9ub2RlOworCisgICAgICAgICAgICB3aGlsZSggbm9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY21wID0gKF9DdlB5cmFtaWRDMyAqKSAobm9kZS0+ZGF0YSk7CisgICAgICAgICAgICAgICAgaWYoIF9DVl9SR0JfRElTVCggYzAsIGNtcC0+YyApIDwgdGhyZXNob2xkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9DdlB5cmFtaWRDMyB0ZW1wOworCisgICAgICAgICAgICAgICAgICAgIC8qIGV4Y2x1ZGUgZnJvbSBnbG9iYWwgbGlzdCBhbmQgYWRkIHRvIGxpc3Qgb2Ygam9pbnQgY29tcG9uZW50ICovCisgICAgICAgICAgICAgICAgICAgIHByZXYtPm5leHQgPSBub2RlLT5uZXh0OworICAgICAgICAgICAgICAgICAgICBub2RlLT5uZXh0ID0gYWNjOworICAgICAgICAgICAgICAgICAgICBhY2MgPSBub2RlOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjbXAgPCBmaXJzdF9sZXZlbF9lbmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZFeHBhbmRCYXNlTGV2ZWxDMyggY21wLCAmdGVtcCwgZmlyc3RfbGV2ZWxfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbGV2ZWxfc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgICAgICAgICAgY21wID0gJnRlbXA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0ZW1wX2NtcC5hICs9IGNtcC0+YTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9jbXAuYy5ibHVlICs9IGNtcC0+Yy5ibHVlICogY21wLT5hOworICAgICAgICAgICAgICAgICAgICB0ZW1wX2NtcC5jLmdyZWVuICs9IGNtcC0+Yy5ncmVlbiAqIGNtcC0+YTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF9jbXAuYy5yZWQgKz0gY21wLT5jLnJlZCAqIGNtcC0+YTsKKyAgICAgICAgICAgICAgICAgICAgaWN2TWF4Um9pKCAmKHRlbXBfY21wLnJlY3QpLCAmKGNtcC0+cmVjdCkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByZXYgPT0gJnN0dWJfbm9kZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0dWJfbm9kZS5uZXh0ID0gbm9kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmV2ID0gbm9kZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm9kZSA9IHByZXYtPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCB0ZW1wX2NtcC5hICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNfYmx1ZSA9IGN2Um91bmQoIHRlbXBfY21wLmMuYmx1ZSAvIHRlbXBfY21wLmEgKTsKKyAgICAgICAgICAgICAgICBjX2dyZWVuID0gY3ZSb3VuZCggdGVtcF9jbXAuYy5ncmVlbiAvIHRlbXBfY21wLmEgKTsKKyAgICAgICAgICAgICAgICBjX3JlZCA9IGN2Um91bmQoIHRlbXBfY21wLmMucmVkIC8gdGVtcF9jbXAuYSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNfYmx1ZSA9IGN2Um91bmQoIGMwLmJsdWUgKTsKKyAgICAgICAgICAgICAgICBjX2dyZWVuID0gY3ZSb3VuZCggYzAuZ3JlZW4gKTsKKyAgICAgICAgICAgICAgICBjX3JlZCA9IGN2Um91bmQoIGMwLnJlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IGFjYzsKKworICAgICAgICAgICAgd2hpbGUoIG5vZGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2MzJzdWYgX2M7CisgICAgICAgICAgICAgICAgY21wID0gKF9DdlB5cmFtaWRDMyAqKSAobm9kZS0+ZGF0YSk7CisgICAgICAgICAgICAgICAgX2MuaSA9IGNfYmx1ZTsgY21wLT5jLmJsdWUgPSBfYy5mOworICAgICAgICAgICAgICAgIF9jLmkgPSBjX2dyZWVuOyBjbXAtPmMuZ3JlZW4gPSBfYy5mOworICAgICAgICAgICAgICAgIF9jLmkgPSBjX3JlZDsgY21wLT5jLnJlZCA9IF9jLmY7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbXAudmFsdWUgPSBjdlNjYWxhciggY19ibHVlLCBjX2dyZWVuLCBjX3JlZCApOworICAgICAgICAgICAgY29tcC5hcmVhID0gdGVtcF9jbXAuYTsKKyAgICAgICAgICAgIGNvbXAucmVjdC54ID0gdGVtcF9jbXAucmVjdC54MTsKKyAgICAgICAgICAgIGNvbXAucmVjdC55ID0gdGVtcF9jbXAucmVjdC55MTsKKyAgICAgICAgICAgIGNvbXAucmVjdC53aWR0aCA9IHRlbXBfY21wLnJlY3QueDIgLSB0ZW1wX2NtcC5yZWN0LngxOworICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IHRlbXBfY21wLnJlY3QueTIgLSB0ZW1wX2NtcC5yZWN0LnkxOworICAgICAgICAgICAgY29tcC5jb250b3VyID0gMDsKKworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGNvbXAsIHdyaXRlciApOworICAgICAgICAgICAgcHJldiA9IHN0dWJfbm9kZS5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgIHJldHVybiBDVl9PSzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKyAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiB0aGUgbWF4aW11bSByb2kgc2l6ZSAKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkCitpY3ZNYXhSb2koIF9DdlJlY3QxNnUgKiBtYXhfcmVjdCwgX0N2UmVjdDE2dSAqIGN1cl9yZWN0ICkKK3sKKyAgICBpZiggbWF4X3JlY3QtPngyID09IDAgKQorICAgICAgICAqbWF4X3JlY3QgPSAqY3VyX3JlY3Q7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIG1heF9yZWN0LT54MSA+IGN1cl9yZWN0LT54MSApCisgICAgICAgICAgICBtYXhfcmVjdC0+eDEgPSBjdXJfcmVjdC0+eDE7CisgICAgICAgIGlmKCBtYXhfcmVjdC0+eTEgPiBjdXJfcmVjdC0+eTEgKQorICAgICAgICAgICAgbWF4X3JlY3QtPnkxID0gY3VyX3JlY3QtPnkxOworCisgICAgICAgIGlmKCBtYXhfcmVjdC0+eDIgPCBjdXJfcmVjdC0+eDIgKQorICAgICAgICAgICAgbWF4X3JlY3QtPngyID0gY3VyX3JlY3QtPngyOworICAgICAgICBpZiggbWF4X3JlY3QtPnkyIDwgY3VyX3JlY3QtPnkyICkKKyAgICAgICAgICAgIG1heF9yZWN0LT55MiA9IGN1cl9yZWN0LT55MjsKKyAgICB9Cit9CisKK3ZvaWQKK2ljdk1heFJvaTEoIF9DdlJlY3QxNnUgKiBtYXhfcmVjdCwgaW50IHgsIGludCB5ICkKK3sKKyAgICBpZiggbWF4X3JlY3QtPngyID09IDAgKQorICAgIHsKKyAgICAgICAgbWF4X3JlY3QtPngxID0gKHVzaG9ydCkgeDsKKyAgICAgICAgbWF4X3JlY3QtPnkxID0gKHVzaG9ydCkgeTsKKworICAgICAgICArK3g7CisgICAgICAgICsreTsKKworICAgICAgICBtYXhfcmVjdC0+eDIgPSAodXNob3J0KSB4OworICAgICAgICBtYXhfcmVjdC0+eTIgPSAodXNob3J0KSB5OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggbWF4X3JlY3QtPngxID4geCApCisgICAgICAgICAgICBtYXhfcmVjdC0+eDEgPSAodXNob3J0KSB4OworICAgICAgICBpZiggbWF4X3JlY3QtPnkxID4geSApCisgICAgICAgICAgICBtYXhfcmVjdC0+eTEgPSAodXNob3J0KSB5OworCisgICAgICAgICsreDsKKyAgICAgICAgKyt5OworCisgICAgICAgIGlmKCBtYXhfcmVjdC0+eDIgPCB4ICkKKyAgICAgICAgICAgIG1heF9yZWN0LT54MiA9ICh1c2hvcnQpIHg7CisgICAgICAgIGlmKCBtYXhfcmVjdC0+eTIgPCB5ICkKKyAgICAgICAgICAgIG1heF9yZWN0LT55MiA9ICh1c2hvcnQpIHk7CisgICAgfQorfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgY3ZQeXJTZWdtZW50YXRpb24KKy8vICAgIFB1cnBvc2U6CisvLyAgICAgIHNlZ21lbnRzIGFuIGltYWdlIHVzaW5nIHB5cmFtaWQtbGlua2luZyB0ZWNobmlxdWUKKy8vICAgIENvbnRleHQ6IAorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgc3JjIC0gc291cmNlIGltYWdlCisvLyAgICAgIGRzdCAtIGRlc3RpbmF0aW9uIGltYWdlCisvLyAgICAgIGNvbXAgLSBwb2ludGVyIHRvIHJldHVybmVkIGNvbm5lY3RlZCBjb21wb25lbnQgc2VxdWVuY2UKKy8vICAgICAgc3RvcmFnZSAtIHdoZXJlIHRoZSBzZXF1ZW5jZSBpcyBzdG9yZWQKKy8vICAgICAgbGV2ZWwgLSBtYXhpbWFsIHB5cmFtaWQgbGV2ZWwKKy8vICAgICAgdGhyZXNob2xkMSAtIGZpcnN0IHRocmVzaG9sZCwgYWZmZWN0aW5nIG9uIGRldGFsaXphdGlvbiBsZXZlbCB3aGVuIHB5cmFtaWQKKy8vICAgICAgICAgICAgICAgICAgIGlzIGJ1aWx0LgorLy8gICAgICB0aHJlc2hvbGQyIC0gc2Vjb25kIHRocmVzaG9sZCAtIGFmZmVjdHMgb24gZmluYWwgY29tcG9uZW50cyBtZXJnaW5nLgorLy8gICAgUmV0dXJuczoKKy8vICAgIE5vdGVzOgorLy8gICAgICBTb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGltYWdlIG11c3QgYmUgZXF1YWwgdHlwZXMgYW5kIGNoYW5uZWxzCisvL0YqLworQ1ZfSU1QTCB2b2lkCitjdlB5clNlZ21lbnRhdGlvbiggSXBsSW1hZ2UgKiBzcmMsCisgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKiBkc3QsCisgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICBDdlNlcSAqKiBjb21wLCBpbnQgbGV2ZWwsIGRvdWJsZSB0aHJlc2hvbGQxLCBkb3VibGUgdGhyZXNob2xkMiApCit7CisgICAgQ3ZTaXplIHNyY19zaXplLCBkc3Rfc2l6ZTsKKyAgICB1Y2hhciAqc3JjX2RhdGEgPSAwOworICAgIHVjaGFyICpkc3RfZGF0YSA9IDA7CisgICAgaW50IHNyY19zdGVwID0gMCwgZHN0X3N0ZXAgPSAwOworICAgIGludCB0aHJlc2gxID0gY3ZSb3VuZCggdGhyZXNob2xkMSApOworICAgIGludCB0aHJlc2gyID0gY3ZSb3VuZCggdGhyZXNob2xkMiApOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlB5clNlZ21lbnRhdGlvbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBzcmMtPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgaWYoIHNyYy0+ZGVwdGggIT0gZHN0LT5kZXB0aCB8fCBzcmMtPm5DaGFubmVscyAhPSBkc3QtPm5DaGFubmVscyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJzcmMgYW5kIGRzdCBoYXZlIGRpZmZlcmVudCBmb3JtYXRzIiApOworCisgICAgY3ZHZXRSYXdEYXRhKCBzcmMsICZzcmNfZGF0YSwgJnNyY19zdGVwLCAmc3JjX3NpemUgKTsKKyAgICBjdkdldFJhd0RhdGEoIGRzdCwgJmRzdF9kYXRhLCAmZHN0X3N0ZXAsICZkc3Rfc2l6ZSApOworCisgICAgaWYoIHNyY19zaXplLndpZHRoICE9IGRzdF9zaXplLndpZHRoIHx8CisgICAgICAgIHNyY19zaXplLmhlaWdodCAhPSBkc3Rfc2l6ZS5oZWlnaHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAic3JjIGFuZCBkc3QgaGF2ZSBkaWZmZXJlbnQgUk9JcyIgKTsKKworICAgIHN3aXRjaCAoc3JjLT5uQ2hhbm5lbHMpCisgICAgeworICAgIGNhc2UgMToKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZQeXJTZWdtZW50YXRpb244dUMxUiggc3JjX2RhdGEsIHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YSwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HQVVTU0lBTl81eDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAsIHN0b3JhZ2UsIGxldmVsLCB0aHJlc2gxLCB0aHJlc2gyICkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIElQUElfQ0FMTCggaWN2UHlyU2VnbWVudGF0aW9uOHVDM1IoIHNyY19kYXRhLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEsIGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfR0FVU1NJQU5fNXg1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLCBzdG9yYWdlLCBsZXZlbCwgdGhyZXNoMSwgdGhyZXNoMiApKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgfQorICAgIF9fRU5EX187Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zyb3RjYWxpcGVycy5jcHAgYi9jdi9zcmMvY3Zyb3RjYWxpcGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1NjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnJvdGNhbGlwZXJzLmNwcApAQCAtMCwwICsxLDQ3NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2LmgiCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50IGJvdHRvbTsKKyAgICBpbnQgbGVmdDsKKyAgICBmbG9hdCBoZWlnaHQ7CisgICAgZmxvYXQgd2lkdGg7CisgICAgZmxvYXQgYmFzZV9hOworICAgIGZsb2F0IGJhc2VfYjsKK30KK2ljdk1pbkFyZWFTdGF0ZTsKKworI2RlZmluZSBDVl9DQUxJUEVSU19NQVhIRUlHSFQgICAgICAwCisjZGVmaW5lIENWX0NBTElQRVJTX01JTkFSRUFSRUNUICAgIDEKKyNkZWZpbmUgQ1ZfQ0FMSVBFUlNfTUFYRElTVCAgICAgICAgMgorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6ICAgIGljdlJvdGF0aW5nQ2FsaXBlcnMKKy8vICAgIFB1cnBvc2U6CisvLyAgICAgIFJvdGF0aW5nIGNhbGlwZXJzIGFsZ29yaXRobSB3aXRoIHNvbWUgYXBwbGljYXRpb25zCisvLworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIHBvaW50cyAgICAgIC0gY29udmV4IGh1bGwgdmVydGljZXMgKCBhbnkgb3JpZW50YXRpb24gKQorLy8gICAgICBuICAgICAgICAgICAtIG51bWJlciBvZiB2ZXJ0aWNlcworLy8gICAgICBtb2RlICAgICAgICAtIGNvbmNyZXRlIGFwcGxpY2F0aW9uIG9mIGFsZ29yaXRobSAKKy8vICAgICAgICAgICAgICAgICAgICBjYW4gYmUgIENWX0NBTElQRVJTX01BWERJU1QgICBvciAgIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMSVBFUlNfTUlOQVJFQVJFQ1QgIAorLy8gICAgICBsZWZ0LCBib3R0b20sIHJpZ2h0LCB0b3AgLSBpbmRleGVzIG9mIGV4dHJlbWFsIHBvaW50cworLy8gICAgICBvdXQgICAgICAgICAtIG91dHB1dCBpbmZvLgorLy8gICAgICAgICAgICAgICAgICAgIEluIGNhc2UgQ1ZfQ0FMSVBFUlNfTUFYRElTVCBpdCBwb2ludHMgdG8gZmxvYXQgdmFsdWUgLSAKKy8vICAgICAgICAgICAgICAgICAgICBtYXhpbWFsIGhlaWdodCBvZiBwb2x5Z29uLgorLy8gICAgICAgICAgICAgICAgICAgIEluIGNhc2UgQ1ZfQ0FMSVBFUlNfTUlOQVJFQVJFQ1QKKy8vICAgICAgICAgICAgICAgICAgICAoKEN2UG9pbnQyRDMyZiopb3V0KVswXSAtIGNvcm5lciAKKy8vICAgICAgICAgICAgICAgICAgICAoKEN2UG9pbnQyRDMyZiopb3V0KVsxXSAtIHZlY3RvcjEKKy8vICAgICAgICAgICAgICAgICAgICAoKEN2UG9pbnQyRDMyZiopb3V0KVswXSAtIGNvcm5lcjIKKy8vICAgICAgICAgICAgICAgICAgICAgIAorLy8gICAgICAgICAgICAgICAgICAgICAgXgorLy8gICAgICAgICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgIHZlY3RvcjIgfAorLy8gICAgICAgICAgICAgICAgICAgICAgfAorLy8gICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19fX1wKKy8vICAgICAgICAgICAgICAgICAgICBjb3JuZXIgICAgICAgICAvCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IxCisvLworLy8gICAgUmV0dXJuczoKKy8vICAgIE5vdGVzOgorLy9GKi8KKworLyogd2Ugd2lsbCB1c2UgdXN1YWwgY2FydGVzaWFuIGNvb3JkaW5hdGVzICovCitzdGF0aWMgdm9pZAoraWN2Um90YXRpbmdDYWxpcGVycyggQ3ZQb2ludDJEMzJmKiBwb2ludHMsIGludCBuLCBpbnQgbW9kZSwgZmxvYXQqIG91dCApCit7CisgICAgZmxvYXQgbWluYXJlYSA9IEZMVF9NQVg7CisgICAgZmxvYXQgbWF4X2Rpc3QgPSAwOworICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICBpbnQgaSwgazsKKyAgICBDdlBvaW50MkQzMmYqIHZlY3QgPSAoQ3ZQb2ludDJEMzJmKiljdkFsbG9jKCBuICogc2l6ZW9mKHZlY3RbMF0pICk7CisgICAgZmxvYXQqIGludl92ZWN0X2xlbmd0aCA9IChmbG9hdCopY3ZBbGxvYyggbiAqIHNpemVvZihpbnZfdmVjdF9sZW5ndGhbMF0pICk7CisgICAgaW50IGxlZnQgPSAwLCBib3R0b20gPSAwLCByaWdodCA9IDAsIHRvcCA9IDA7CisgICAgaW50IHNlcVs0XSA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKKworICAgIC8qIHJvdGF0aW5nIGNhbGlwZXJzIHNpZGVzIHdpbGwgYWx3YXlzIGhhdmUgY29vcmRpbmF0ZXMgICAgCisgICAgICAgKGEsYikgKC1iLGEpICgtYSwtYikgKGIsIC1hKSAgICAgCisgICAgICovCisgICAgLyogdGhpcyBpcyBhIGZpcnN0IGJhc2UgYmVjdG9yIChhLGIpIGluaXRpYWxpemVkIGJ5ICgxLDApICovCisgICAgZmxvYXQgb3JpZW50YXRpb24gPSAwOworICAgIGZsb2F0IGJhc2VfYTsKKyAgICBmbG9hdCBiYXNlX2IgPSAwOworCisgICAgZmxvYXQgbGVmdF94LCByaWdodF94LCB0b3BfeSwgYm90dG9tX3k7CisgICAgQ3ZQb2ludDJEMzJmIHB0MCA9IHBvaW50c1swXTsKKyAgICAKKyAgICBsZWZ0X3ggPSByaWdodF94ID0gcHQwLng7CisgICAgdG9wX3kgPSBib3R0b21feSA9IHB0MC55OworICAgIAorICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIGR4LCBkeTsKKyAgICAgICAgCisgICAgICAgIGlmKCBwdDAueCA8IGxlZnRfeCApCisgICAgICAgICAgICBsZWZ0X3ggPSBwdDAueCwgbGVmdCA9IGk7CisKKyAgICAgICAgaWYoIHB0MC54ID4gcmlnaHRfeCApCisgICAgICAgICAgICByaWdodF94ID0gcHQwLngsIHJpZ2h0ID0gaTsKKworICAgICAgICBpZiggcHQwLnkgPiB0b3BfeSApCisgICAgICAgICAgICB0b3BfeSA9IHB0MC55LCB0b3AgPSBpOworCisgICAgICAgIGlmKCBwdDAueSA8IGJvdHRvbV95ICkKKyAgICAgICAgICAgIGJvdHRvbV95ID0gcHQwLnksIGJvdHRvbSA9IGk7CisKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHB0ID0gcG9pbnRzWyhpKzEpICYgKGkrMSA8IG4gPyAtMSA6IDApXTsKKyAgICAgICAgCisgICAgICAgIGR4ID0gcHQueCAtIHB0MC54OworICAgICAgICBkeSA9IHB0LnkgLSBwdDAueTsKKworICAgICAgICB2ZWN0W2ldLnggPSAoZmxvYXQpZHg7CisgICAgICAgIHZlY3RbaV0ueSA9IChmbG9hdClkeTsKKyAgICAgICAgaW52X3ZlY3RfbGVuZ3RoW2ldID0gKGZsb2F0KSgxLi9zcXJ0KGR4KmR4ICsgZHkqZHkpKTsKKworICAgICAgICBwdDAgPSBwdDsKKyAgICB9CisKKyAgICAvL2N2YkludlNxcnQoIGludl92ZWN0X2xlbmd0aCwgaW52X3ZlY3RfbGVuZ3RoLCBuICk7CisKKyAgICAvKiBmaW5kIGNvbnZleCBodWxsIG9yaWVudGF0aW9uICovCisgICAgeworICAgICAgICBkb3VibGUgYXggPSB2ZWN0W24tMV0ueDsKKyAgICAgICAgZG91YmxlIGF5ID0gdmVjdFtuLTFdLnk7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGJ4ID0gdmVjdFtpXS54OworICAgICAgICAgICAgZG91YmxlIGJ5ID0gdmVjdFtpXS55OworCisgICAgICAgICAgICBkb3VibGUgY29udmV4aXR5ID0gYXggKiBieSAtIGF5ICogYng7CisKKyAgICAgICAgICAgIGlmKCBjb252ZXhpdHkgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSAoY29udmV4aXR5ID4gMCkgPyAxLmYgOiAoLTEuZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBheCA9IGJ4OworICAgICAgICAgICAgYXkgPSBieTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoIG9yaWVudGF0aW9uICE9IDAgKTsKKyAgICB9CisgICAgYmFzZV9hID0gb3JpZW50YXRpb247CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgY2FsaXBlcnMgcG9zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzZXFbMF0gPSBib3R0b207CisgICAgc2VxWzFdID0gcmlnaHQ7CisgICAgc2VxWzJdID0gdG9wOworICAgIHNlcVszXSA9IGxlZnQ7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBNYWluIGxvb3AgLSBldmFsdWF0ZSBhbmdsZXMgYW5kIHJvdGF0ZSBjYWxpcGVycyAgICAgICAgICAgICAgICovCisKKyAgICAvKiBhbGwgb2YgZWRnZXMgd2lsbCBiZSBjaGVja2VkIHdoaWxlIHJvdGF0aW5nIGNhbGlwZXJzIGJ5IDkwIGRlZ3JlZXMgKi8KKyAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkKKyAgICB7CisgICAgICAgIC8qIHNpbnVzIG9mIG1pbmltYWwgYW5nbGUgKi8KKyAgICAgICAgLypmbG9hdCBzaW51czsqLworCisgICAgICAgIC8qIGNvbXB1dGUgY29zaW5lIG9mIGFuZ2xlIGJldHdlZW4gY2FsaXBlcnMgc2lkZSBhbmQgcG9seWdvbiBlZGdlICovCisgICAgICAgIC8qIGRwIC0gZG90IHByb2R1Y3QgKi8KKyAgICAgICAgZmxvYXQgZHAwID0gYmFzZV9hICogdmVjdFtzZXFbMF1dLnggKyBiYXNlX2IgKiB2ZWN0W3NlcVswXV0ueTsKKyAgICAgICAgZmxvYXQgZHAxID0gLWJhc2VfYiAqIHZlY3Rbc2VxWzFdXS54ICsgYmFzZV9hICogdmVjdFtzZXFbMV1dLnk7CisgICAgICAgIGZsb2F0IGRwMiA9IC1iYXNlX2EgKiB2ZWN0W3NlcVsyXV0ueCAtIGJhc2VfYiAqIHZlY3Rbc2VxWzJdXS55OworICAgICAgICBmbG9hdCBkcDMgPSBiYXNlX2IgKiB2ZWN0W3NlcVszXV0ueCAtIGJhc2VfYSAqIHZlY3Rbc2VxWzNdXS55OworCisgICAgICAgIGZsb2F0IGNvc2FscGhhID0gZHAwICogaW52X3ZlY3RfbGVuZ3RoW3NlcVswXV07CisgICAgICAgIGZsb2F0IG1heGNvcyA9IGNvc2FscGhhOworCisgICAgICAgIC8qIG51bWJlciBvZiBjYWxpcGVycyBlZGdlcywgdGhhdCBoYXMgbWluaW1hbCBhbmdsZSB3aXRoIGVkZ2UgKi8KKyAgICAgICAgaW50IG1haW5fZWxlbWVudCA9IDA7CisKKyAgICAgICAgLyogY2hvb3NlIG1pbmltYWwgYW5nbGUgKi8KKyAgICAgICAgY29zYWxwaGEgPSBkcDEgKiBpbnZfdmVjdF9sZW5ndGhbc2VxWzFdXTsKKyAgICAgICAgbWF4Y29zID0gKGNvc2FscGhhID4gbWF4Y29zKSA/IChtYWluX2VsZW1lbnQgPSAxLCBjb3NhbHBoYSkgOiBtYXhjb3M7CisgICAgICAgIGNvc2FscGhhID0gZHAyICogaW52X3ZlY3RfbGVuZ3RoW3NlcVsyXV07CisgICAgICAgIG1heGNvcyA9IChjb3NhbHBoYSA+IG1heGNvcykgPyAobWFpbl9lbGVtZW50ID0gMiwgY29zYWxwaGEpIDogbWF4Y29zOworICAgICAgICBjb3NhbHBoYSA9IGRwMyAqIGludl92ZWN0X2xlbmd0aFtzZXFbM11dOworICAgICAgICBtYXhjb3MgPSAoY29zYWxwaGEgPiBtYXhjb3MpID8gKG1haW5fZWxlbWVudCA9IDMsIGNvc2FscGhhKSA6IG1heGNvczsKKworICAgICAgICAvKnJvdGF0ZSBjYWxpcGVycyovCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZ2V0IG5leHQgYmFzZQorICAgICAgICAgICAgaW50IHBpbmRleCA9IHNlcVttYWluX2VsZW1lbnRdOworICAgICAgICAgICAgZmxvYXQgbGVhZF94ID0gdmVjdFtwaW5kZXhdLngqaW52X3ZlY3RfbGVuZ3RoW3BpbmRleF07CisgICAgICAgICAgICBmbG9hdCBsZWFkX3kgPSB2ZWN0W3BpbmRleF0ueSppbnZfdmVjdF9sZW5ndGhbcGluZGV4XTsKKyAgICAgICAgICAgIHN3aXRjaCggbWFpbl9lbGVtZW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBiYXNlX2EgPSBsZWFkX3g7CisgICAgICAgICAgICAgICAgYmFzZV9iID0gbGVhZF95OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIGJhc2VfYSA9IGxlYWRfeTsgCisgICAgICAgICAgICAgICAgYmFzZV9iID0gLWxlYWRfeDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBiYXNlX2EgPSAtbGVhZF94OworICAgICAgICAgICAgICAgIGJhc2VfYiA9IC1sZWFkX3k7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgYmFzZV9hID0gLWxlYWRfeTsKKyAgICAgICAgICAgICAgICBiYXNlX2IgPSBsZWFkX3g7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiBhc3NlcnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgLyogY2hhbmdlIGJhc2UgcG9pbnQgb2YgbWFpbiBlZGdlICovCisgICAgICAgIHNlcVttYWluX2VsZW1lbnRdICs9IDE7CisgICAgICAgIHNlcVttYWluX2VsZW1lbnRdID0gKHNlcVttYWluX2VsZW1lbnRdID09IG4pID8gMCA6IHNlcVttYWluX2VsZW1lbnRdOworCisgICAgICAgIAorICAgICAgICBzd2l0Y2ggKG1vZGUpCisgICAgICAgIHsKKyAgICAgICAgY2FzZSBDVl9DQUxJUEVSU19NQVhIRUlHSFQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogbm93IG1haW4gZWxlbWVudCBsaWVzIG9uIGVkZ2UgYWxsaWduZWQgdG8gY2FsaXBlcnMgc2lkZSAqLworCisgICAgICAgICAgICAgICAgLyogZmluZCBvcHBvc2l0ZSBlbGVtZW50IGkuZS4gdHJhbnNmb3JtICAqLworICAgICAgICAgICAgICAgIC8qIDAtPjIsIDEtPjMsIDItPjAsIDMtPjEgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpbnQgb3Bwb3NpdGVfZWwgPSBtYWluX2VsZW1lbnQgXiAyOworCisgICAgICAgICAgICAgICAgZmxvYXQgZHggPSBwb2ludHNbc2VxW29wcG9zaXRlX2VsXV0ueCAtIHBvaW50c1tzZXFbbWFpbl9lbGVtZW50XV0ueDsKKyAgICAgICAgICAgICAgICBmbG9hdCBkeSA9IHBvaW50c1tzZXFbb3Bwb3NpdGVfZWxdXS55IC0gcG9pbnRzW3NlcVttYWluX2VsZW1lbnRdXS55OworICAgICAgICAgICAgICAgIGZsb2F0IGRpc3Q7CisKKyAgICAgICAgICAgICAgICBpZiggbWFpbl9lbGVtZW50ICYgMSApCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAoZmxvYXQpZmFicyhkeCAqIGJhc2VfYSArIGR5ICogYmFzZV9iKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAoZmxvYXQpZmFicyhkeCAqICgtYmFzZV9iKSArIGR5ICogYmFzZV9hKTsKKworICAgICAgICAgICAgICAgIGlmKCBkaXN0ID4gbWF4X2Rpc3QgKQorICAgICAgICAgICAgICAgICAgICBtYXhfZGlzdCA9IGRpc3Q7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBDVl9DQUxJUEVSU19NSU5BUkVBUkVDVDoKKyAgICAgICAgICAgIC8qIGZpbmQgYXJlYSBvZiByZWN0YW5nbGUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBoZWlnaHQ7CisgICAgICAgICAgICAgICAgZmxvYXQgYXJlYTsKKworICAgICAgICAgICAgICAgIC8qIGZpbmQgdmVjdG9yIGxlZnQtcmlnaHQgKi8KKyAgICAgICAgICAgICAgICBmbG9hdCBkeCA9IHBvaW50c1tzZXFbMV1dLnggLSBwb2ludHNbc2VxWzNdXS54OworICAgICAgICAgICAgICAgIGZsb2F0IGR5ID0gcG9pbnRzW3NlcVsxXV0ueSAtIHBvaW50c1tzZXFbM11dLnk7CisKKyAgICAgICAgICAgICAgICAvKiBkb3Rwcm9kdWN0ICovCisgICAgICAgICAgICAgICAgZmxvYXQgd2lkdGggPSBkeCAqIGJhc2VfYSArIGR5ICogYmFzZV9iOworCisgICAgICAgICAgICAgICAgLyogZmluZCB2ZWN0b3IgbGVmdC1yaWdodCAqLworICAgICAgICAgICAgICAgIGR4ID0gcG9pbnRzW3NlcVsyXV0ueCAtIHBvaW50c1tzZXFbMF1dLng7CisgICAgICAgICAgICAgICAgZHkgPSBwb2ludHNbc2VxWzJdXS55IC0gcG9pbnRzW3NlcVswXV0ueTsKKworICAgICAgICAgICAgICAgIC8qIGRvdHByb2R1Y3QgKi8KKyAgICAgICAgICAgICAgICBoZWlnaHQgPSAtZHggKiBiYXNlX2IgKyBkeSAqIGJhc2VfYTsKKworICAgICAgICAgICAgICAgIGFyZWEgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgICAgICAgICBpZiggYXJlYSA8PSBtaW5hcmVhICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpidWYgPSAoZmxvYXQgKikgYnVmZmVyOworCisgICAgICAgICAgICAgICAgICAgIG1pbmFyZWEgPSBhcmVhOworICAgICAgICAgICAgICAgICAgICAvKiBsZWZ0aXN0IHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgICgoaW50ICopIGJ1ZilbMF0gPSBzZXFbM107CisgICAgICAgICAgICAgICAgICAgIGJ1ZlsxXSA9IGJhc2VfYTsKKyAgICAgICAgICAgICAgICAgICAgYnVmWzJdID0gd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIGJ1ZlszXSA9IGJhc2VfYjsKKyAgICAgICAgICAgICAgICAgICAgYnVmWzRdID0gaGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAvKiBib3R0b20gcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgKChpbnQgKikgYnVmKVs1XSA9IHNlcVswXTsKKyAgICAgICAgICAgICAgICAgICAgYnVmWzZdID0gYXJlYTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qc3dpdGNoICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgc3dpdGNoIChtb2RlKQorICAgIHsKKyAgICBjYXNlIENWX0NBTElQRVJTX01JTkFSRUFSRUNUOgorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCAqYnVmID0gKGZsb2F0ICopIGJ1ZmZlcjsKKworICAgICAgICAgICAgZmxvYXQgQTEgPSBidWZbMV07CisgICAgICAgICAgICBmbG9hdCBCMSA9IGJ1ZlszXTsKKworICAgICAgICAgICAgZmxvYXQgQTIgPSAtYnVmWzNdOworICAgICAgICAgICAgZmxvYXQgQjIgPSBidWZbMV07CisKKyAgICAgICAgICAgIGZsb2F0IEMxID0gQTEgKiBwb2ludHNbKChpbnQgKikgYnVmKVswXV0ueCArIHBvaW50c1soKGludCAqKSBidWYpWzBdXS55ICogQjE7CisgICAgICAgICAgICBmbG9hdCBDMiA9IEEyICogcG9pbnRzWygoaW50ICopIGJ1ZilbNV1dLnggKyBwb2ludHNbKChpbnQgKikgYnVmKVs1XV0ueSAqIEIyOworCisgICAgICAgICAgICBmbG9hdCBpZGV0ID0gMS5mIC8gKEExICogQjIgLSBBMiAqIEIxKTsKKworICAgICAgICAgICAgZmxvYXQgcHggPSAoQzEgKiBCMiAtIEMyICogQjEpICogaWRldDsKKyAgICAgICAgICAgIGZsb2F0IHB5ID0gKEExICogQzIgLSBBMiAqIEMxKSAqIGlkZXQ7CisKKyAgICAgICAgICAgIG91dFswXSA9IHB4OworICAgICAgICAgICAgb3V0WzFdID0gcHk7CisKKyAgICAgICAgICAgIG91dFsyXSA9IEExICogYnVmWzJdOworICAgICAgICAgICAgb3V0WzNdID0gQjEgKiBidWZbMl07CisKKyAgICAgICAgICAgIG91dFs0XSA9IEEyICogYnVmWzRdOworICAgICAgICAgICAgb3V0WzVdID0gQjIgKiBidWZbNF07CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9DQUxJUEVSU19NQVhIRUlHSFQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIG91dFswXSA9IG1heF9kaXN0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGN2RnJlZSggJnZlY3QgKTsKKyAgICBjdkZyZWUoICZpbnZfdmVjdF9sZW5ndGggKTsKK30KKworCitDVl9JTVBMICBDdkJveDJECitjdk1pbkFyZWFSZWN0MiggY29uc3QgQ3ZBcnIqIGFycmF5LCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgKQoreworICAgIEN2TWVtU3RvcmFnZSogdGVtcF9zdG9yYWdlID0gMDsKKyAgICBDdkJveDJEIGJveDsKKyAgICBDdlBvaW50MkQzMmYqIHBvaW50cyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1pbkFyZWFSZWN0MiIgKTsKKworICAgIG1lbXNldCgmYm94LCAwLCBzaXplb2YoYm94KSk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgbjsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZDb250b3VyIGNvbnRvdXJfaGVhZGVyOworICAgIEN2U2VxQmxvY2sgYmxvY2s7CisgICAgQ3ZTZXEqIHB0c2VxID0gKEN2U2VxKilhcnJheTsKKyAgICBDdlBvaW50MkQzMmYgb3V0WzNdOworCisgICAgaWYoIENWX0lTX1NFUShwdHNlcSkgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19TRVFfUE9JTlRfU0VUKHB0c2VxKSAmJgorICAgICAgICAgICAgKENWX1NFUV9LSU5EKHB0c2VxKSAhPSBDVl9TRVFfS0lORF9DVVJWRSB8fCAhQ1ZfSVNfU0VRX0NPTlZFWChwdHNlcSkgfHwKKyAgICAgICAgICAgIENWX1NFUV9FTFRZUEUocHRzZXEpICE9IENWX1NFUV9FTFRZUEVfUFBPSU5UICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgIklucHV0IHNlcXVlbmNlIG11c3QgY29uc2lzdCBvZiAyZCBwb2ludHMgb3IgcG9pbnRlcnMgdG8gMmQgcG9pbnRzIiApOworICAgICAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICAgICAgc3RvcmFnZSA9IHB0c2VxLT5zdG9yYWdlOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBwdHNlcSA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfR0VORVJJQywgYXJyYXksICZjb250b3VyX2hlYWRlciwgJmJsb2NrICkpOworICAgIH0KKworICAgIGlmKCBzdG9yYWdlICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHRlbXBfc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBzdG9yYWdlICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoMSA8PCAxMCkpOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfU0VRX0NPTlZFWCggcHRzZXEgKSkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHB0c2VxID0gY3ZDb252ZXhIdWxsMiggcHRzZXEsIHRlbXBfc3RvcmFnZSwgQ1ZfQ0xPQ0tXSVNFLCAxICkpOworICAgIH0KKyAgICBlbHNlIGlmKCAhQ1ZfSVNfU0VRX1BPSU5UX1NFVCggcHRzZXEgKSkKKyAgICB7CisgICAgICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfSVNfU0VRKHB0c2VxLT52X3ByZXYpIHx8ICFDVl9JU19TRVFfUE9JTlRfU0VUKHB0c2VxLT52X3ByZXYpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJDb252ZXggaHVsbCBtdXN0IGhhdmUgdmFsaWQgcG9pbnRlciB0byBwb2ludCBzZXF1ZW5jZSBzdG9yZWQgaW4gdl9wcmV2IiApOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggcHRzZXEsICZyZWFkZXIgKTsKKyAgICAgICAgY3ZTdGFydFdyaXRlU2VxKCBDVl9TRVFfS0lORF9DVVJWRXxDVl9TRVFfRkxBR19DT05WRVh8Q1ZfU0VRX0VMVFlQRShwdHNlcS0+dl9wcmV2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ3ZDb250b3VyKSwgQ1ZfRUxFTV9TSVpFKHB0c2VxLT52X3ByZXYtPmZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wX3N0b3JhZ2UsICZ3cml0ZXIgKTsKKyAgICAgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcHRzZXEtPnRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50IHB0ID0gKiooQ3ZQb2ludCoqKShyZWFkZXIucHRyKTsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgIH0KKworICAgICAgICBwdHNlcSA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKyAgICB9CisKKyAgICBuID0gcHRzZXEtPnRvdGFsOworCisgICAgQ1ZfQ0FMTCggcG9pbnRzID0gKEN2UG9pbnQyRDMyZiopY3ZBbGxvYyggbipzaXplb2YocG9pbnRzWzBdKSApKTsKKyAgICBjdlN0YXJ0UmVhZFNlcSggcHRzZXEsICZyZWFkZXIgKTsKKworICAgIGlmKCBDVl9TRVFfRUxUWVBFKCBwdHNlcSApID09IENWXzMyU0MyICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50IHB0OworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQsIHJlYWRlciApOworICAgICAgICAgICAgcG9pbnRzW2ldLnggPSAoZmxvYXQpcHQueDsKKyAgICAgICAgICAgIHBvaW50c1tpXS55ID0gKGZsb2F0KXB0Lnk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHBvaW50c1tpXSwgcmVhZGVyICk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYoIG4gPiAyICkKKyAgICB7CisgICAgICAgIGljdlJvdGF0aW5nQ2FsaXBlcnMoIHBvaW50cywgbiwgQ1ZfQ0FMSVBFUlNfTUlOQVJFQVJFQ1QsIChmbG9hdCopb3V0ICk7CisgICAgICAgIGJveC5jZW50ZXIueCA9IG91dFswXS54ICsgKG91dFsxXS54ICsgb3V0WzJdLngpKjAuNWY7CisgICAgICAgIGJveC5jZW50ZXIueSA9IG91dFswXS55ICsgKG91dFsxXS55ICsgb3V0WzJdLnkpKjAuNWY7CisgICAgICAgIGJveC5zaXplLmhlaWdodCA9IChmbG9hdClzcXJ0KChkb3VibGUpb3V0WzFdLngqb3V0WzFdLnggKyAoZG91YmxlKW91dFsxXS55Km91dFsxXS55KTsKKyAgICAgICAgYm94LnNpemUud2lkdGggPSAoZmxvYXQpc3FydCgoZG91YmxlKW91dFsyXS54Km91dFsyXS54ICsgKGRvdWJsZSlvdXRbMl0ueSpvdXRbMl0ueSk7CisgICAgICAgIGJveC5hbmdsZSA9IChmbG9hdClhdGFuMiggLShkb3VibGUpb3V0WzFdLnksIChkb3VibGUpb3V0WzFdLnggKTsKKyAgICB9CisgICAgZWxzZSBpZiggbiA9PSAyICkKKyAgICB7CisgICAgICAgIGJveC5jZW50ZXIueCA9IChwb2ludHNbMF0ueCArIHBvaW50c1sxXS54KSowLjVmOworICAgICAgICBib3guY2VudGVyLnkgPSAocG9pbnRzWzBdLnkgKyBwb2ludHNbMV0ueSkqMC41ZjsKKyAgICAgICAgZG91YmxlIGR4ID0gcG9pbnRzWzFdLnggLSBwb2ludHNbMF0ueDsKKyAgICAgICAgZG91YmxlIGR5ID0gcG9pbnRzWzFdLnkgLSBwb2ludHNbMF0ueTsKKyAgICAgICAgYm94LnNpemUuaGVpZ2h0ID0gKGZsb2F0KXNxcnQoZHgqZHggKyBkeSpkeSk7CisgICAgICAgIGJveC5zaXplLndpZHRoID0gMDsKKyAgICAgICAgYm94LmFuZ2xlID0gKGZsb2F0KWF0YW4yKCAtZHksIGR4ICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBuID09IDEgKQorICAgICAgICAgICAgYm94LmNlbnRlciA9IHBvaW50c1swXTsKKyAgICB9CisKKyAgICBib3guYW5nbGUgPSAoZmxvYXQpKGJveC5hbmdsZSoxODAvQ1ZfUEkpOworCisgICAgX19FTkRfXzsgCisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdGVtcF9zdG9yYWdlICk7CisgICAgY3ZGcmVlKCAmcG9pbnRzICk7CisKKyAgICByZXR1cm4gYm94OworfQorCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZzYW1wbGVycy5jcHAgYi9jdi9zcmMvY3ZzYW1wbGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ZmFiNwotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnNhbXBsZXJzLmNwcApAQCAtMCwwICsxLDg5NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSBzYW1wbGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIGludAorY3ZTYW1wbGVMaW5lKCBjb25zdCB2b2lkKiBpbWcsIEN2UG9pbnQgcHQxLCBDdlBvaW50IHB0MiwKKyAgICAgICAgICAgICAgdm9pZCogX2J1ZmZlciwgaW50IGNvbm5lY3Rpdml0eSApCit7CisgICAgaW50IGNvdW50ID0gLTE7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNhbXBsZUxpbmUiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgaW50IGksIGNvaSA9IDAsIHBpeF9zaXplOworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWltZzsKKyAgICBDdkxpbmVJdGVyYXRvciBpdGVyYXRvcjsKKyAgICB1Y2hhciogYnVmZmVyID0gKHVjaGFyKilfYnVmZmVyOworCisgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIsICZjb2kgKSk7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFidWZmZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIENWX0NBTEwoIGNvdW50ID0gY3ZJbml0TGluZUl0ZXJhdG9yKCBtYXQsIHB0MSwgcHQyLCAmaXRlcmF0b3IsIGNvbm5lY3Rpdml0eSApKTsKKworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSk7CisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIGJ1ZmZlciwgaXRlcmF0b3IucHRyLCBwaXhfc2l6ZSApOworICAgICAgICBidWZmZXIgKz0gcGl4X3NpemU7CisgICAgICAgIENWX05FWFRfTElORV9QT0lOVCggaXRlcmF0b3IgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGNvdW50OworfQorCisKK3N0YXRpYyBjb25zdCB2b2lkKgoraWN2QWRqdXN0UmVjdCggY29uc3Qgdm9pZCogc3JjcHRyLCBpbnQgc3JjX3N0ZXAsIGludCBwaXhfc2l6ZSwKKyAgICAgICAgICAgICAgIEN2U2l6ZSBzcmNfc2l6ZSwgQ3ZTaXplIHdpbl9zaXplLAorICAgICAgICAgICAgICAgQ3ZQb2ludCBpcCwgQ3ZSZWN0KiBwUmVjdCApCit7CisgICAgQ3ZSZWN0IHJlY3Q7CisgICAgY29uc3QgY2hhciogc3JjID0gKGNvbnN0IGNoYXIqKXNyY3B0cjsKKworICAgIGlmKCBpcC54ID49IDAgKQorICAgIHsKKyAgICAgICAgc3JjICs9IGlwLngqcGl4X3NpemU7CisgICAgICAgIHJlY3QueCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlY3QueCA9IC1pcC54OworICAgICAgICBpZiggcmVjdC54ID4gd2luX3NpemUud2lkdGggKQorICAgICAgICAgICAgcmVjdC54ID0gd2luX3NpemUud2lkdGg7CisgICAgfQorCisgICAgaWYoIGlwLnggKyB3aW5fc2l6ZS53aWR0aCA8IHNyY19zaXplLndpZHRoICkKKyAgICAgICAgcmVjdC53aWR0aCA9IHdpbl9zaXplLndpZHRoOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJlY3Qud2lkdGggPSBzcmNfc2l6ZS53aWR0aCAtIGlwLnggLSAxOworICAgICAgICBpZiggcmVjdC53aWR0aCA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBzcmMgKz0gcmVjdC53aWR0aCpwaXhfc2l6ZTsKKyAgICAgICAgICAgIHJlY3Qud2lkdGggPSAwOworICAgICAgICB9CisgICAgICAgIGFzc2VydCggcmVjdC53aWR0aCA8PSB3aW5fc2l6ZS53aWR0aCApOworICAgIH0KKworICAgIGlmKCBpcC55ID49IDAgKQorICAgIHsKKyAgICAgICAgc3JjICs9IGlwLnkgKiBzcmNfc3RlcDsKKyAgICAgICAgcmVjdC55ID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZWN0LnkgPSAtaXAueTsKKworICAgIGlmKCBpcC55ICsgd2luX3NpemUuaGVpZ2h0IDwgc3JjX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgcmVjdC5oZWlnaHQgPSB3aW5fc2l6ZS5oZWlnaHQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVjdC5oZWlnaHQgPSBzcmNfc2l6ZS5oZWlnaHQgLSBpcC55IC0gMTsKKyAgICAgICAgaWYoIHJlY3QuaGVpZ2h0IDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNyYyArPSByZWN0LmhlaWdodCpzcmNfc3RlcDsKKyAgICAgICAgICAgIHJlY3QuaGVpZ2h0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpwUmVjdCA9IHJlY3Q7CisgICAgcmV0dXJuIHNyYyAtIHJlY3QueCpwaXhfc2l6ZTsKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX0dFVF9SRUNUX1NVQl9QSVhfRlVOQyggZmxhdm9yLCBzcmN0eXBlLCBkc3R0eXBlLCB3b3JrdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8sIHNjYWxlX21hY3JvLCBjYXN0X21hY3JvMiApXAorQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZHZXRSZWN0U3ViUGl4XyMjZmxhdm9yIyNfQzFSICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdHR5cGUqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIEN2UG9pbnQyRDMyZiBjZW50ZXIgKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdlBvaW50IGlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgIGExMSwgYTEyLCBhMjEsIGEyMiwgYjEsIGIyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGEsIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNlbnRlci54IC09ICh3aW5fc2l6ZS53aWR0aC0xKSowLjVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjZW50ZXIueSAtPSAod2luX3NpemUuaGVpZ2h0LTEpKjAuNWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlwLnggPSBjdkZsb29yKCBjZW50ZXIueCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpcC55ID0gY3ZGbG9vciggY2VudGVyLnkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSBjZW50ZXIueCAtIGlwLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gY2VudGVyLnkgLSBpcC55OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTExID0gc2NhbGVfbWFjcm8oKDEuZi1hKSooMS5mLWIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGExMiA9IHNjYWxlX21hY3JvKGEqKDEuZi1iKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMjEgPSBzY2FsZV9tYWNybygoMS5mLWEpKmIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTIyID0gc2NhbGVfbWFjcm8oYSpiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIxID0gc2NhbGVfbWFjcm8oMS5mIC0gYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiMiA9IHNjYWxlX21hY3JvKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY19zdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAwIDw9IGlwLnggJiYgaXAueCArIHdpbl9zaXplLndpZHRoIDwgc3JjX3NpemUud2lkdGggJiYgICAgICAgICAgICAgIFwKKyAgICAgICAgMCA8PSBpcC55ICYmIGlwLnkgKyB3aW5fc2l6ZS5oZWlnaHQgPCBzcmNfc2l6ZS5oZWlnaHQgKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBleHRyYWN0ZWQgcmVjdGFuZ2xlIGlzIHRvdGFsbHkgaW5zaWRlIHRoZSBpbWFnZSAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjICs9IGlwLnkgKiBzcmNfc3RlcCArIGlwLng7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggaWN2Q29weVN1YnBpeF8jI2ZsYXZvciMjX0MxUl9wICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGljdkNvcHlTdWJwaXhfIyNmbGF2b3IjI19DMVJfcCggc3JjLCBzcmNfc3RlcCpzaXplb2Yoc3JjWzBdKSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgZHN0X3N0ZXAqc2l6ZW9mKGRzdFswXSksICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5fc2l6ZSwgYSwgYiApID49IDAgKSAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2luX3NpemUuaGVpZ2h0OyBpKyssIHNyYyArPSBzcmNfc3RlcCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0X3N0ZXAgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSB3aW5fc2l6ZS53aWR0aCAtIDI7IGogKz0gMiApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczAgPSBjYXN0X21hY3JvKHNyY1tqXSkqYTExICsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybyhzcmNbaisxXSkqYTEyICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjW2orc3JjX3N0ZXBdKSphMjEgKyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvKHNyY1tqK3NyY19zdGVwKzFdKSphMjI7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMxID0gY2FzdF9tYWNybyhzcmNbaisxXSkqYTExICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjW2orMl0pKmExMiArICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvKHNyY1tqK3NyY19zdGVwKzFdKSphMjEgKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybyhzcmNbaitzcmNfc3RlcCsyXSkqYTIyOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKGRzdHR5cGUpY2FzdF9tYWNybzIoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqKzFdID0gKGRzdHR5cGUpY2FzdF9tYWNybzIoczEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGogPCB3aW5fc2l6ZS53aWR0aDsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczAgPSBjYXN0X21hY3JvKHNyY1tqXSkqYTExICsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybyhzcmNbaisxXSkqYTEyICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjW2orc3JjX3N0ZXBdKSphMjEgKyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvKHNyY1tqK3NyY19zdGVwKzFdKSphMjI7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSAoZHN0dHlwZSljYXN0X21hY3JvMihzMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ3ZSZWN0IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMgPSAoY29uc3Qgc3JjdHlwZSopaWN2QWRqdXN0UmVjdCggc3JjLCBzcmNfc3RlcCpzaXplb2YoKnNyYyksICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKnNyYyksIHNyY19zaXplLCB3aW5fc2l6ZSxpcCwgJnIpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2luX3NpemUuaGVpZ2h0OyBpKyssIGRzdCArPSBkc3Rfc3RlcCApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBzcmN0eXBlICpzcmMyID0gc3JjICsgc3JjX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBpIDwgci55IHx8IGkgPj0gci5oZWlnaHQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3JjMiAtPSBzcmNfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCByLng7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gY2FzdF9tYWNybyhzcmNbci54XSkqYjEgKyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjMltyLnhdKSpiMjsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqXSA9IChkc3R0eXBlKWNhc3RfbWFjcm8yKHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGogPCByLndpZHRoOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczAgPSBjYXN0X21hY3JvKHNyY1tqXSkqYTExICsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybyhzcmNbaisxXSkqYTEyICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjMltqXSkqYTIxICsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvKHNyYzJbaisxXSkqYTIyOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSAoZHN0dHlwZSljYXN0X21hY3JvMihzMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBqIDwgd2luX3NpemUud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gY2FzdF9tYWNybyhzcmNbci53aWR0aF0pKmIxICsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8oc3JjMltyLndpZHRoXSkqYjI7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqXSA9IChkc3R0eXBlKWNhc3RfbWFjcm8yKHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGkgPCByLmhlaWdodCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcmMgPSBzcmMyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfR0VUX1JFQ1RfU1VCX1BJWF9GVU5DX0MzKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIHdvcmt0eXBlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybywgc2NhbGVfbWFjcm8sIG11bF9tYWNybyApXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2R2V0UmVjdFN1YlBpeF8jI2ZsYXZvciMjX0MzUiAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRzdHR5cGUqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgd2luX3NpemUsIEN2UG9pbnQyRDMyZiBjZW50ZXIgKSAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdlBvaW50IGlwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgYSwgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2VudGVyLnggLT0gKHdpbl9zaXplLndpZHRoLTEpKjAuNWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNlbnRlci55IC09ICh3aW5fc2l6ZS5oZWlnaHQtMSkqMC41ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaXAueCA9IGN2Rmxvb3IoIGNlbnRlci54ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlwLnkgPSBjdkZsb29yKCBjZW50ZXIueSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYSA9IHNjYWxlX21hY3JvKCBjZW50ZXIueCAtIGlwLnggKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGIgPSBzY2FsZV9tYWNybyggY2VudGVyLnkgLSBpcC55ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjX3N0ZXAgLz0gc2l6ZW9mKCBzcmNbMF0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdF9zdGVwIC89IHNpemVvZiggZHN0WzBdICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIDAgPD0gaXAueCAmJiBpcC54ICsgd2luX3NpemUud2lkdGggPCBzcmNfc2l6ZS53aWR0aCAmJiAgICAgICAgICAgICAgXAorICAgICAgICAwIDw9IGlwLnkgJiYgaXAueSArIHdpbl9zaXplLmhlaWdodCA8IHNyY19zaXplLmhlaWdodCApICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIC8qIGV4dHJhY3RlZCByZWN0YW5nbGUgaXMgdG90YWxseSBpbnNpZGUgdGhlIGltYWdlICovICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMgKz0gaXAueSAqIHNyY19zdGVwICsgaXAueCozOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aW5fc2l6ZS5oZWlnaHQ7IGkrKywgc3JjICs9IHNyY19zdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcCApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgd2luX3NpemUud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqM10pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczEgPSBjYXN0X21hY3JvKHNyY1tqKjMgKyBzcmNfc3RlcF0pOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMyszXSkgLSBzMCkpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyY1tqKjMrMytzcmNfc3RlcF0pIC0gczEpKTtcCisgICAgICAgICAgICAgICAgZHN0W2oqM10gPSAoZHN0dHlwZSkoczAgKyBtdWxfbWFjcm8oIGIsIChzMSAtIHMwKSkpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczEgPSBjYXN0X21hY3JvKHNyY1tqKjMrMSArIHNyY19zdGVwXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMys0XSkgLSBzMCkpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyY1tqKjMrNCtzcmNfc3RlcF0pIC0gczEpKTtcCisgICAgICAgICAgICAgICAgZHN0W2oqMysxXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqMysyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczEgPSBjYXN0X21hY3JvKHNyY1tqKjMrMiArIHNyY19zdGVwXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMys1XSkgLSBzMCkpOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyY1tqKjMrNStzcmNfc3RlcF0pIC0gczEpKTtcCisgICAgICAgICAgICAgICAgZHN0W2oqMysyXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEN2UmVjdCByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3JjID0gKGNvbnN0IHNyY3R5cGUqKWljdkFkanVzdFJlY3QoIHNyYywgc3JjX3N0ZXAqc2l6ZW9mKCpzcmMpLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqc3JjKSozLCBzcmNfc2l6ZSwgd2luX3NpemUsIGlwLCAmciApOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHdpbl9zaXplLmhlaWdodDsgaSsrLCBkc3QgKz0gZHN0X3N0ZXAgKSAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqc3JjMiA9IHNyYyArIHNyY19zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggaSA8IHIueSB8fCBpID49IHIuaGVpZ2h0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNyYzIgLT0gc3JjX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgci54OyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IGNhc3RfbWFjcm8oc3JjW3IueCozXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczEgPSBjYXN0X21hY3JvKHNyYzJbci54KjNdKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqKjNdID0gKGRzdHR5cGUpKHMwICsgbXVsX21hY3JvKCBiLCAoczEgLSBzMCkpKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczAgPSBjYXN0X21hY3JvKHNyY1tyLngqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMxID0gY2FzdF9tYWNybyhzcmMyW3IueCozKzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaiozKzFdID0gKGRzdHR5cGUpKHMwICsgbXVsX21hY3JvKCBiLCAoczEgLSBzMCkpKTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwID0gY2FzdF9tYWNybyhzcmNbci54KjMrMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSA9IGNhc3RfbWFjcm8oc3JjMltyLngqMysyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2oqMysyXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IHIud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqM10pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczEgPSBjYXN0X21hY3JvKHNyYzJbaiozXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMyArIDNdKSAtIHMwKSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyYzJbaiozICsgM10pIC0gczEpKTsgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2oqM10gPSAoZHN0dHlwZSkoczAgKyBtdWxfbWFjcm8oIGIsIChzMSAtIHMwKSkpOyAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczEgPSBjYXN0X21hY3JvKHNyYzJbaiozKzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMyArIDRdKSAtIHMwKSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyYzJbaiozICsgNF0pIC0gczEpKTsgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2oqMysxXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCA9IGNhc3RfbWFjcm8oc3JjW2oqMysyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczEgPSBjYXN0X21hY3JvKHNyYzJbaiozKzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwICs9IG11bF9tYWNybyggYSwgKGNhc3RfbWFjcm8oc3JjW2oqMyArIDVdKSAtIHMwKSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSArPSBtdWxfbWFjcm8oIGEsIChjYXN0X21hY3JvKHNyYzJbaiozICsgNV0pIC0gczEpKTsgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2oqMysyXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IHdpbl9zaXplLndpZHRoOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IGNhc3RfbWFjcm8oc3JjW3Iud2lkdGgqM10pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczEgPSBjYXN0X21hY3JvKHNyYzJbci53aWR0aCozXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqKjNdID0gKGRzdHR5cGUpKHMwICsgbXVsX21hY3JvKCBiLCAoczEgLSBzMCkpKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczAgPSBjYXN0X21hY3JvKHNyY1tyLndpZHRoKjMrMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMxID0gY2FzdF9tYWNybyhzcmMyW3Iud2lkdGgqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaiozKzFdID0gKGRzdHR5cGUpKHMwICsgbXVsX21hY3JvKCBiLCAoczEgLSBzMCkpKTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwID0gY2FzdF9tYWNybyhzcmNbci53aWR0aCozKzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMSA9IGNhc3RfbWFjcm8oc3JjMltyLndpZHRoKjMrMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2oqMysyXSA9IChkc3R0eXBlKShzMCArIG11bF9tYWNybyggYiwgKHMxIC0gczApKSk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggaSA8IHIuaGVpZ2h0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNyYyA9IHNyYzI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworCitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkdldFJlY3RTdWJQaXhfOHUzMmZfQzFSCisoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwgQ3ZTaXplIHNyY19zaXplLAorICBmbG9hdCogZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSB3aW5fc2l6ZSwgQ3ZQb2ludDJEMzJmIGNlbnRlciApCit7CisgICAgQ3ZQb2ludCBpcDsKKyAgICBmbG9hdCAgYTEyLCBhMjIsIGIxLCBiMjsKKyAgICBmbG9hdCBhLCBiOworICAgIGRvdWJsZSBzID0gMDsKKyAgICBpbnQgaSwgajsKKworICAgIGNlbnRlci54IC09ICh3aW5fc2l6ZS53aWR0aC0xKSowLjVmOworICAgIGNlbnRlci55IC09ICh3aW5fc2l6ZS5oZWlnaHQtMSkqMC41ZjsKKworICAgIGlwLnggPSBjdkZsb29yKCBjZW50ZXIueCApOworICAgIGlwLnkgPSBjdkZsb29yKCBjZW50ZXIueSApOworCisgICAgaWYoIHdpbl9zaXplLndpZHRoIDw9IDAgfHwgd2luX3NpemUuaGVpZ2h0IDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworCisgICAgYSA9IGNlbnRlci54IC0gaXAueDsKKyAgICBiID0gY2VudGVyLnkgLSBpcC55OworICAgIGEgPSBNQVgoYSwwLjAwMDFmKTsKKyAgICBhMTIgPSBhKigxLmYtYik7CisgICAgYTIyID0gYSpiOworICAgIGIxID0gMS5mIC0gYjsKKyAgICBiMiA9IGI7CisgICAgcyA9ICgxLiAtIGEpL2E7CisKKyAgICBzcmNfc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsKKworICAgIGlmKCAwIDw9IGlwLnggJiYgaXAueCArIHdpbl9zaXplLndpZHRoIDwgc3JjX3NpemUud2lkdGggJiYKKyAgICAgICAgMCA8PSBpcC55ICYmIGlwLnkgKyB3aW5fc2l6ZS5oZWlnaHQgPCBzcmNfc2l6ZS5oZWlnaHQgKQorICAgIHsKKyAgICAgICAgLy8gZXh0cmFjdGVkIHJlY3RhbmdsZSBpcyB0b3RhbGx5IGluc2lkZSB0aGUgaW1hZ2UKKyAgICAgICAgc3JjICs9IGlwLnkgKiBzcmNfc3RlcCArIGlwLng7CisKKyNpZiAwCisgICAgICAgIGlmKCBpY3ZDb3B5U3VicGl4Xzh1MzJmX0MxUl9wICYmCisgICAgICAgICAgICBpY3ZDb3B5U3VicGl4Xzh1MzJmX0MxUl9wKCBzcmMsIHNyY19zdGVwLCBkc3QsCisgICAgICAgICAgICAgICAgZHN0X3N0ZXAqc2l6ZW9mKGRzdFswXSksIHdpbl9zaXplLCBhLCBiICkgPj0gMCApCisgICAgICAgICAgICByZXR1cm4gQ1ZfT0s7CisjZW5kaWYKKworICAgICAgICBmb3IoIDsgd2luX3NpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNfc3RlcCwgZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgcHJldiA9ICgxIC0gYSkqKGIxKkNWXzhUTzMyRihzcmNbMF0pICsgYjIqQ1ZfOFRPMzJGKHNyY1tzcmNfc3RlcF0pKTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB3aW5fc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0ID0gYTEyKkNWXzhUTzMyRihzcmNbaisxXSkgKyBhMjIqQ1ZfOFRPMzJGKHNyY1tqKzErc3JjX3N0ZXBdKTsKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSBwcmV2ICsgdDsKKyAgICAgICAgICAgICAgICBwcmV2ID0gKGZsb2F0KSh0KnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2UmVjdCByOworCisgICAgICAgIHNyYyA9IChjb25zdCB1Y2hhciopaWN2QWRqdXN0UmVjdCggc3JjLCBzcmNfc3RlcCpzaXplb2YoKnNyYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpzcmMpLCBzcmNfc2l6ZSwgd2luX3NpemUsaXAsICZyKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2luX3NpemUuaGVpZ2h0OyBpKyssIGRzdCArPSBkc3Rfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyICpzcmMyID0gc3JjICsgc3JjX3N0ZXA7CisKKyAgICAgICAgICAgIGlmKCBpIDwgci55IHx8IGkgPj0gci5oZWlnaHQgKQorICAgICAgICAgICAgICAgIHNyYzIgLT0gc3JjX3N0ZXA7CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCByLng7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgczAgPSBDVl84VE8zMkYoc3JjW3IueF0pKmIxICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENWXzhUTzMyRihzcmMyW3IueF0pKmIyOworCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKGZsb2F0KShzMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBqIDwgci53aWR0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgcHJldiA9ICgxIC0gYSkqKGIxKkNWXzhUTzMyRihzcmNbal0pICsgYjIqQ1ZfOFRPMzJGKHNyYzJbal0pKTsKKworICAgICAgICAgICAgICAgIGZvciggOyBqIDwgci53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQgPSBhMTIqQ1ZfOFRPMzJGKHNyY1tqKzFdKSArIGEyMipDVl84VE8zMkYoc3JjMltqKzFdKTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gcHJldiArIHQ7CisgICAgICAgICAgICAgICAgICAgIHByZXYgPSAoZmxvYXQpKHQqcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgaiA8IHdpbl9zaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHMwID0gQ1ZfOFRPMzJGKHNyY1tyLndpZHRoXSkqYjEgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfOFRPMzJGKHNyYzJbci53aWR0aF0pKmIyOworCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKGZsb2F0KShzMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpIDwgci5oZWlnaHQgKQorICAgICAgICAgICAgICAgIHNyYyA9IHNyYzI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworCisjZGVmaW5lIElDVl9TSElGVCAgICAgICAgICAgICAxNgorI2RlZmluZSBJQ1ZfU0NBTEUoeCkgICAgICAgICAgY3ZSb3VuZCgoeCkqKDEgPDwgSUNWX1NISUZUKSkKKyNkZWZpbmUgSUNWX01VTF9TQ0FMRSh4LHkpICAgICgoKHgpKih5KSArICgxIDw8IChJQ1ZfU0hJRlQtMSkpKSA+PiBJQ1ZfU0hJRlQpCisjZGVmaW5lIElDVl9ERVNDQUxFKHgpICAgICAgICAoKCh4KSsoMSA8PCAoSUNWX1NISUZULTEpKSkgPj4gSUNWX1NISUZUKQorCitpY3ZDb3B5U3VicGl4Xzh1X0MxUl90IGljdkNvcHlTdWJwaXhfOHVfQzFSX3AgPSAwOworaWN2Q29weVN1YnBpeF84dTMyZl9DMVJfdCBpY3ZDb3B5U3VicGl4Xzh1MzJmX0MxUl9wID0gMDsKK2ljdkNvcHlTdWJwaXhfMzJmX0MxUl90IGljdkNvcHlTdWJwaXhfMzJmX0MxUl9wID0gMDsKKworSUNWX0RFRl9HRVRfUkVDVF9TVUJfUElYX0ZVTkMoIDh1LCB1Y2hhciwgdWNoYXIsIGludCwgQ1ZfTk9QLCBJQ1ZfU0NBTEUsIElDVl9ERVNDQUxFICkKKy8vSUNWX0RFRl9HRVRfUkVDVF9TVUJfUElYX0ZVTkMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIGZsb2F0LCBDVl84VE8zMkYsIENWX05PUCwgQ1ZfTk9QICkKK0lDVl9ERUZfR0VUX1JFQ1RfU1VCX1BJWF9GVU5DKCAzMmYsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIENWX05PUCwgQ1ZfTk9QLCBDVl9OT1AgKQorCitJQ1ZfREVGX0dFVF9SRUNUX1NVQl9QSVhfRlVOQ19DMyggOHUsIHVjaGFyLCB1Y2hhciwgaW50LCBDVl9OT1AsIElDVl9TQ0FMRSwgSUNWX01VTF9TQ0FMRSApCitJQ1ZfREVGX0dFVF9SRUNUX1NVQl9QSVhfRlVOQ19DMyggOHUzMmYsIHVjaGFyLCBmbG9hdCwgZmxvYXQsIENWXzhUTzMyRiwgQ1ZfTk9QLCBDVl9NVUwgKQorSUNWX0RFRl9HRVRfUkVDVF9TVUJfUElYX0ZVTkNfQzMoIDMyZiwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QLCBDVl9OT1AsIENWX01VTCApCisKKworI2RlZmluZSAgSUNWX0RFRl9JTklUX1NVQlBJWF9UQUIoIEZVTkNOQU1FLCBGTEFHICkgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCBpY3ZJbml0IyNGVU5DTkFNRSMjRkxBRyMjVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIgKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV8jI0ZMQUc7ICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMmZfIyNGTEFHOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbMV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1MzJmXyMjRkxBRzsgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9JTklUX1NVQlBJWF9UQUIoIEdldFJlY3RTdWJQaXgsIEMxUiApCitJQ1ZfREVGX0lOSVRfU1VCUElYX1RBQiggR2V0UmVjdFN1YlBpeCwgQzNSICkKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZHZXRSZWN0U3ViUGl4RnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzcmNfc2l6ZSwgdm9pZCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwgQ3ZTaXplIHdpbl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBjZW50ZXIgKTsKKworQ1ZfSU1QTCB2b2lkCitjdkdldFJlY3RTdWJQaXgoIGNvbnN0IHZvaWQqIHNyY2Fyciwgdm9pZCogZHN0YXJyLCBDdlBvaW50MkQzMmYgY2VudGVyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgZ3JfdGFiWzJdOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldFJlY3RTdWJQaXgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzcmNfc2l6ZSwgZHN0X3NpemU7CisgICAgQ3ZHZXRSZWN0U3ViUGl4RnVuYyBmdW5jOworICAgIGludCBjbiwgc3JjX3N0ZXAsIGRzdF9zdGVwOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRHZXRSZWN0U3ViUGl4QzFSVGFibGUoIGdyX3RhYiArIDAgKTsKKyAgICAgICAgaWN2SW5pdEdldFJlY3RTdWJQaXhDM1JUYWJsZSggZ3JfdGFiICsgMSApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpKQorICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViICkpOworCisgICAgY24gPSBDVl9NQVRfQ04oIHNyYy0+dHlwZSApOworCisgICAgaWYoIChjbiAhPSAxICYmIGNuICE9IDMpIHx8ICFDVl9BUkVfQ05TX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBzcmNfc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgZHN0X3NpemUgPSBjdkdldE1hdFNpemUoIGRzdCApOworICAgIHNyY19zdGVwID0gc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwID8gZHN0LT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgaWYoIGRzdF9zaXplLndpZHRoID4gc3JjX3NpemUud2lkdGggfHwgZHN0X3NpemUuaGVpZ2h0ID4gc3JjX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJkZXN0aW5hdGlvbiBST0kgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc291cmNlIFJPSSIgKTsKKworICAgIGlmKCBDVl9BUkVfREVQVEhTX0VRKCBzcmMsIGRzdCApKQorICAgIHsKKyAgICAgICAgZnVuYyA9IChDdkdldFJlY3RTdWJQaXhGdW5jKShncl90YWJbY24gIT0gMV0uZm5fMmRbQ1ZfTUFUX0RFUFRIKHNyYy0+dHlwZSldKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9ERVBUSCggc3JjLT50eXBlICkgIT0gQ1ZfOFUgfHwgQ1ZfTUFUX0RFUFRIKCBkc3QtPnR5cGUgKSAhPSBDVl8zMkYgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIGZ1bmMgPSAoQ3ZHZXRSZWN0U3ViUGl4RnVuYykoZ3JfdGFiW2NuICE9IDFdLmZuXzJkWzFdKTsKKyAgICB9CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBkc3Rfc2l6ZSwgY2VudGVyICkpOworCisgICAgX19FTkRfXzsKK30KKworCisjZGVmaW5lIElDVl8zMkY4VSh4KSAgKCh1Y2hhciljdlJvdW5kKHgpKQorCisjZGVmaW5lIElDVl9ERUZfR0VUX1FVQURSQU5HTEVfU1VCX1BJWF9GVU5DKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGNhc3RfbWFjcm8sIGN2dCApICAgIFwKK0N2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZHZXRRdWFkcmFuZ2xlU3ViUGl4XyMjZmxhdm9yIyNfQzFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCBjb25zdCBzcmN0eXBlICogc3JjLCBpbnQgc3JjX3N0ZXAsIEN2U2l6ZSBzcmNfc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZHN0dHlwZSAqZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSB3aW5fc2l6ZSwgY29uc3QgZmxvYXQgKm1hdHJpeCApICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgZHggPSAod2luX3NpemUud2lkdGggLSAxKSowLjU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGR5ID0gKHdpbl9zaXplLmhlaWdodCAtIDEpKjAuNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSBBMTEgPSBtYXRyaXhbMF0sIEExMiA9IG1hdHJpeFsxXSwgQTEzID0gbWF0cml4WzJdLUExMSpkeC1BMTIqZHk7IFwKKyAgICBkb3VibGUgQTIxID0gbWF0cml4WzNdLCBBMjIgPSBtYXRyaXhbNF0sIEEyMyA9IG1hdHJpeFs1XS1BMjEqZHgtQTIyKmR5OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY19zdGVwIC89IHNpemVvZihzcmN0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0dHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCB3aW5fc2l6ZS5oZWlnaHQ7IHkrKywgZHN0ICs9IGRzdF9zdGVwICkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB4cyA9IEExMip5ICsgQTEzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgeXMgPSBBMjIqeSArIEEyMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHhlID0gQTExKih3aW5fc2l6ZS53aWR0aC0xKSArIEExMip5ICsgQTEzOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB5ZSA9IEEyMSood2luX3NpemUud2lkdGgtMSkgKyBBMjIqeSArIEEyMzsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICh1bnNpZ25lZCkoY3ZGbG9vcih4cyktMSkgPCAodW5zaWduZWQpKHNyY19zaXplLndpZHRoIC0gMykgJiYgICBcCisgICAgICAgICAgICAodW5zaWduZWQpKGN2Rmxvb3IoeXMpLTEpIDwgKHVuc2lnbmVkKShzcmNfc2l6ZS5oZWlnaHQgLSAzKSAmJiAgXAorICAgICAgICAgICAgKHVuc2lnbmVkKShjdkZsb29yKHhlKS0xKSA8ICh1bnNpZ25lZCkoc3JjX3NpemUud2lkdGggLSAzKSAmJiAgIFwKKyAgICAgICAgICAgICh1bnNpZ25lZCkoY3ZGbG9vcih5ZSktMSkgPCAodW5zaWduZWQpKHNyY19zaXplLmhlaWdodCAtIDMpKSAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHdpbl9zaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IGl4cyA9IGN2Rmxvb3IoIHhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBpeXMgPSBjdkZsb29yKCB5cyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlICpwdHIgPSBzcmMgKyBzcmNfc3RlcCppeXMgKyBpeHM7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGEgPSB4cyAtIGl4cywgYiA9IHlzIC0gaXlzLCBhMSA9IDEuZiAtIGE7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHAwID0gY3Z0KHB0clswXSkqYTEgKyBjdnQocHRyWzFdKSphOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBwMSA9IGN2dChwdHJbc3JjX3N0ZXBdKSphMSArIGN2dChwdHJbc3JjX3N0ZXArMV0pKmE7XAorICAgICAgICAgICAgICAgIHhzICs9IEExMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB5cyArPSBBMjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGNhc3RfbWFjcm8ocDAgKyBiICogKHAxIC0gcDApKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2luX3NpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgaXhzID0gY3ZGbG9vciggeHMgKSwgaXlzID0gY3ZGbG9vciggeXMgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGEgPSB4cyAtIGl4cywgYiA9IHlzIC0gaXlzLCBhMSA9IDEuZiAtIGE7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUgKnB0cjAsICpwdHIxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBwMCwgcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeHMgKz0gQTExOyB5cyArPSBBMjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWl5cyA8ICh1bnNpZ25lZCkoc3JjX3NpemUuaGVpZ2h0LTEpICkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHB0cjAgPSBzcmMgKyBzcmNfc3RlcCppeXMsIHB0cjEgPSBwdHIwICsgc3JjX3N0ZXA7ICAgICAgXAorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHRyMCA9IHB0cjEgPSBzcmMgKyAoaXlzIDwgMCA/IDAgOiBzcmNfc2l6ZS5oZWlnaHQtMSkqc3JjX3N0ZXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpeHMgPCAodW5zaWduZWQpKHNyY19zaXplLndpZHRoLTEpICkgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDAgPSBjdnQocHRyMFtpeHNdKSphMSArIGN2dChwdHIwW2l4cysxXSkqYTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAxID0gY3Z0KHB0cjFbaXhzXSkqYTEgKyBjdnQocHRyMVtpeHMrMV0pKmE7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpeHMgPSBpeHMgPCAwID8gMCA6IHNyY19zaXplLndpZHRoIC0gMTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDAgPSBjdnQocHRyMFtpeHNdKTsgcDEgPSBjdnQocHRyMVtpeHNdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4XSA9IGNhc3RfbWFjcm8ocDAgKyBiICogKHAxIC0gcDApKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9HRVRfUVVBRFJBTkdMRV9TVUJfUElYX0ZVTkNfQzMoIGZsYXZvciwgc3JjdHlwZSwgZHN0dHlwZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgY2FzdF9tYWNybywgY3Z0ICkgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkdldFF1YWRyYW5nbGVTdWJQaXhfIyNmbGF2b3IjI19DM1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUgKiBzcmMsIGludCBzcmNfc3RlcCwgQ3ZTaXplIHNyY19zaXplLCAgICAgICAgICAgICAgICAgICAgICAgXAorICBkc3R0eXBlICpkc3QsIGludCBkc3Rfc3RlcCwgQ3ZTaXplIHdpbl9zaXplLCBjb25zdCBmbG9hdCAqbWF0cml4ICkgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSBkeCA9ICh3aW5fc2l6ZS53aWR0aCAtIDEpKjAuNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgZHkgPSAod2luX3NpemUuaGVpZ2h0IC0gMSkqMC41OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIEExMSA9IG1hdHJpeFswXSwgQTEyID0gbWF0cml4WzFdLCBBMTMgPSBtYXRyaXhbMl0tQTExKmR4LUExMipkeTsgXAorICAgIGRvdWJsZSBBMjEgPSBtYXRyaXhbM10sIEEyMiA9IG1hdHJpeFs0XSwgQTIzID0gbWF0cml4WzVdLUEyMSpkeC1BMjIqZHk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjX3N0ZXAgLz0gc2l6ZW9mKHNyY3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3R0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCB5ID0gMDsgeSA8IHdpbl9zaXplLmhlaWdodDsgeSsrLCBkc3QgKz0gZHN0X3N0ZXAgKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHhzID0gQTEyKnkgKyBBMTM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB5cyA9IEEyMip5ICsgQTIzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgeGUgPSBBMTEqKHdpbl9zaXplLndpZHRoLTEpICsgQTEyKnkgKyBBMTM7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHllID0gQTIxKih3aW5fc2l6ZS53aWR0aC0xKSArIEEyMip5ICsgQTIzOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggKHVuc2lnbmVkKShjdkZsb29yKHhzKS0xKSA8ICh1bnNpZ25lZCkoc3JjX3NpemUud2lkdGggLSAzKSAmJiAgIFwKKyAgICAgICAgICAgICh1bnNpZ25lZCkoY3ZGbG9vcih5cyktMSkgPCAodW5zaWduZWQpKHNyY19zaXplLmhlaWdodCAtIDMpICYmICBcCisgICAgICAgICAgICAodW5zaWduZWQpKGN2Rmxvb3IoeGUpLTEpIDwgKHVuc2lnbmVkKShzcmNfc2l6ZS53aWR0aCAtIDMpICYmICAgXAorICAgICAgICAgICAgKHVuc2lnbmVkKShjdkZsb29yKHllKS0xKSA8ICh1bnNpZ25lZCkoc3JjX3NpemUuaGVpZ2h0IC0gMykpICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2luX3NpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgaXhzID0gY3ZGbG9vciggeHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IGl5cyA9IGN2Rmxvb3IoIHlzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUgKnB0ciA9IHNyYyArIHNyY19zdGVwKml5cyArIGl4cyozOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb3VibGUgYSA9IHhzIC0gaXhzLCBiID0geXMgLSBpeXMsIGExID0gMS5mIC0gYTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgcDAsIHAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHhzICs9IEExMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB5cyArPSBBMjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAwID0gY3Z0KHB0clswXSkqYTEgKyBjdnQocHRyWzNdKSphOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwMSA9IGN2dChwdHJbc3JjX3N0ZXBdKSphMSArIGN2dChwdHJbc3JjX3N0ZXArM10pKmE7ICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W3gqM10gPSBjYXN0X21hY3JvKHAwICsgYiAqIChwMSAtIHAwKSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwMCA9IGN2dChwdHJbMV0pKmExICsgY3Z0KHB0cls0XSkqYTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcDEgPSBjdnQocHRyW3NyY19zdGVwKzFdKSphMSArIGN2dChwdHJbc3JjX3N0ZXArNF0pKmE7ICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFt4KjMrMV0gPSBjYXN0X21hY3JvKHAwICsgYiAqIChwMSAtIHAwKSk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcDAgPSBjdnQocHRyWzJdKSphMSArIGN2dChwdHJbNV0pKmE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAxID0gY3Z0KHB0cltzcmNfc3RlcCsyXSkqYTEgKyBjdnQocHRyW3NyY19zdGVwKzVdKSphOyAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbeCozKzJdID0gY2FzdF9tYWNybyhwMCArIGIgKiAocDEgLSBwMCkpOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHdpbl9zaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IGl4cyA9IGN2Rmxvb3IoeHMpLCBpeXMgPSBjdkZsb29yKHlzKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBhID0geHMgLSBpeHMsIGIgPSB5cyAtIGl5czsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlICpwdHIwLCAqcHRyMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeHMgKz0gQTExOyB5cyArPSBBMjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWl5cyA8ICh1bnNpZ25lZCkoc3JjX3NpemUuaGVpZ2h0LTEpICkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHB0cjAgPSBzcmMgKyBzcmNfc3RlcCppeXMsIHB0cjEgPSBwdHIwICsgc3JjX3N0ZXA7ICAgICAgXAorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcHRyMCA9IHB0cjEgPSBzcmMgKyAoaXlzIDwgMCA/IDAgOiBzcmNfc2l6ZS5oZWlnaHQtMSkqc3JjX3N0ZXA7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpeHMgPCAodW5zaWduZWQpKHNyY19zaXplLndpZHRoIC0gMSkgKSAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGExID0gMS5mIC0gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlIHAwLCBwMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwdHIwICs9IGl4cyozOyBwdHIxICs9IGl4cyozOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDAgPSBjdnQocHRyMFswXSkqYTEgKyBjdnQocHRyMFszXSkqYTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAxID0gY3Z0KHB0cjFbMF0pKmExICsgY3Z0KHB0cjFbM10pKmE7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbeCozXSA9IGNhc3RfbWFjcm8ocDAgKyBiICogKHAxIC0gcDApKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHAwID0gY3Z0KHB0cjBbMV0pKmExICsgY3Z0KHB0cjBbNF0pKmE7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwMSA9IGN2dChwdHIxWzFdKSphMSArIGN2dChwdHIxWzRdKSphOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqMysxXSA9IGNhc3RfbWFjcm8ocDAgKyBiICogKHAxIC0gcDApKTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwMCA9IGN2dChwdHIwWzJdKSphMSArIGN2dChwdHIwWzVdKSphOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcDEgPSBjdnQocHRyMVsyXSkqYTEgKyBjdnQocHRyMVs1XSkqYTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFt4KjMrMl0gPSBjYXN0X21hY3JvKHAwICsgYiAqIChwMSAtIHAwKSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgYjEgPSAxLmYgLSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaXhzID0gaXhzIDwgMCA/IDAgOiBzcmNfc2l6ZS53aWR0aCAtIDE7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHB0cjAgKz0gaXhzKjM7IHB0cjEgKz0gaXhzKjM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqM10gPSBjYXN0X21hY3JvKGN2dChwdHIwWzBdKSpiMSArIGN2dChwdHIxWzBdKSpiKTtcCisgICAgICAgICAgICAgICAgICAgIGRzdFt4KjMrMV09Y2FzdF9tYWNybyhjdnQocHRyMFsxXSkqYjEgKyBjdnQocHRyMVsxXSkqYik7XAorICAgICAgICAgICAgICAgICAgICBkc3RbeCozKzJdPWNhc3RfbWFjcm8oY3Z0KHB0cjBbMl0pKmIxICsgY3Z0KHB0cjFbMl0pKmIpO1wKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvKiNkZWZpbmUgc3JjdHlwZSB1Y2hhcgorI2RlZmluZSBkc3R0eXBlIHVjaGFyCisjZGVmaW5lIHdvcmt0eXBlIGZsb2F0CisjZGVmaW5lIGN2dCBDVl84VE8zMkYKKyNkZWZpbmUgY2FzdF9tYWNybyBJQ1ZfMzJGOFUKKworI3VuZGVmIHNyY3R5cGUKKyN1bmRlZiBkc3R0eXBlCisjdW5kZWYgd29ya3R5cGUKKyN1bmRlZiBjdnQKKyN1bmRlZiBjYXN0X21hY3JvKi8KKworSUNWX0RFRl9HRVRfUVVBRFJBTkdMRV9TVUJfUElYX0ZVTkMoIDh1LCB1Y2hhciwgdWNoYXIsIGRvdWJsZSwgSUNWXzMyRjhVLCBDVl84VE8zMkYgKQorSUNWX0RFRl9HRVRfUVVBRFJBTkdMRV9TVUJfUElYX0ZVTkMoIDMyZiwgZmxvYXQsIGZsb2F0LCBkb3VibGUsIENWX0NBU1RfMzJGLCBDVl9OT1AgKQorSUNWX0RFRl9HRVRfUVVBRFJBTkdMRV9TVUJfUElYX0ZVTkMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIGRvdWJsZSwgQ1ZfQ0FTVF8zMkYsIENWXzhUTzMyRiApCisKK0lDVl9ERUZfR0VUX1FVQURSQU5HTEVfU1VCX1BJWF9GVU5DX0MzKCA4dSwgdWNoYXIsIHVjaGFyLCBkb3VibGUsIElDVl8zMkY4VSwgQ1ZfOFRPMzJGICkKK0lDVl9ERUZfR0VUX1FVQURSQU5HTEVfU1VCX1BJWF9GVU5DX0MzKCAzMmYsIGZsb2F0LCBmbG9hdCwgZG91YmxlLCBDVl9DQVNUXzMyRiwgQ1ZfTk9QICkKK0lDVl9ERUZfR0VUX1FVQURSQU5HTEVfU1VCX1BJWF9GVU5DX0MzKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBkb3VibGUsIENWX0NBU1RfMzJGLCBDVl84VE8zMkYgKQorCitJQ1ZfREVGX0lOSVRfU1VCUElYX1RBQiggR2V0UXVhZHJhbmdsZVN1YlBpeCwgQzFSICkKK0lDVl9ERUZfSU5JVF9TVUJQSVhfVEFCKCBHZXRRdWFkcmFuZ2xlU3ViUGl4LCBDM1IgKQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkdldFF1YWRyYW5nbGVTdWJQaXhGdW5jKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzcmNfc2l6ZSwgdm9pZCogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSB3aW5fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIG1hdHJpeCApOworCitDVl9JTVBMIHZvaWQKK2N2R2V0UXVhZHJhbmdsZVN1YlBpeCggY29uc3Qgdm9pZCogc3JjYXJyLCB2b2lkKiBkc3RhcnIsIGNvbnN0IEN2TWF0KiBtYXQgKQoreworICAgIHN0YXRpYyAgQ3ZGdW5jVGFibGUgIGdxX3RhYlsyXTsKKyAgICBzdGF0aWMgIGludCBpbml0dGFiID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0UXVhZHJhbmdsZVN1YlBpeCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNyY19zaXplLCBkc3Rfc2l6ZTsKKyAgICBDdkdldFF1YWRyYW5nbGVTdWJQaXhGdW5jIGZ1bmM7CisgICAgZmxvYXQgbVs2XTsKKyAgICBpbnQgaywgY247CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdEdldFF1YWRyYW5nbGVTdWJQaXhDMVJUYWJsZSggZ3FfdGFiICsgMCApOworICAgICAgICBpY3ZJbml0R2V0UXVhZHJhbmdsZVN1YlBpeEMzUlRhYmxlKCBncV90YWIgKyAxICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYykpCisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSkKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChtYXQpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAibWFwIG1hdHJpeCBpcyBub3QgdmFsaWQiICk7CisKKyAgICBjbiA9IENWX01BVF9DTiggc3JjLT50eXBlICk7CisKKyAgICBpZiggKGNuICE9IDEgJiYgY24gIT0gMykgfHwgIUNWX0FSRV9DTlNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIHNyY19zaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICBkc3Rfc2l6ZSA9IGN2R2V0TWF0U2l6ZSggZHN0ICk7CisKKyAgICAvKmlmKCBkc3Rfc2l6ZS53aWR0aCA+IHNyY19zaXplLndpZHRoIHx8IGRzdF9zaXplLmhlaWdodCA+IHNyY19zaXplLmhlaWdodCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiZGVzdGluYXRpb24gUk9JIG11c3Qgbm90IGJlIGxhcmdlciB0aGFuIHNvdXJjZSBST0kiICk7Ki8KKworICAgIGlmKCBtYXQtPnJvd3MgIT0gMiB8fCBtYXQtPmNvbHMgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJUcmFuc2Zvcm1hdGlvbiBtYXRyaXggbXVzdCBiZSAyeDMiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApID09IENWXzMyRkMxICkKKyAgICB7CisgICAgICAgIGZvciggayA9IDA7IGsgPCAzOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBtW2tdID0gbWF0LT5kYXRhLmZsW2tdOworICAgICAgICAgICAgbVszICsga10gPSAoKGZsb2F0KikobWF0LT5kYXRhLnB0ciArIG1hdC0+c3RlcCkpW2tdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKCBtYXQtPnR5cGUgKSA9PSBDVl82NEZDMSApCisgICAgeworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMzsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgbVtrXSA9IChmbG9hdCltYXQtPmRhdGEuZGJba107CisgICAgICAgICAgICBtWzMgKyBrXSA9IChmbG9hdCkoKGRvdWJsZSopKG1hdC0+ZGF0YS5wdHIgKyBtYXQtPnN0ZXApKVtrXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJUaGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IHNob3VsZCBoYXZlIDMyZkMxIG9yIDY0ZkMxIHR5cGUiICk7CisKKyAgICBpZiggQ1ZfQVJFX0RFUFRIU19FUSggc3JjLCBkc3QgKSkKKyAgICB7CisgICAgICAgIGZ1bmMgPSAoQ3ZHZXRRdWFkcmFuZ2xlU3ViUGl4RnVuYykoZ3FfdGFiW2NuICE9IDFdLmZuXzJkW0NWX01BVF9ERVBUSChzcmMtPnR5cGUpXSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfREVQVEgoIHNyYy0+dHlwZSApICE9IENWXzhVIHx8IENWX01BVF9ERVBUSCggZHN0LT50eXBlICkgIT0gQ1ZfMzJGICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBmdW5jID0gKEN2R2V0UXVhZHJhbmdsZVN1YlBpeEZ1bmMpKGdxX3RhYltjbiAhPSAxXS5mbl8yZFsxXSk7CisgICAgfQorCisgICAgaWYoICFmdW5jICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIHNyY19zaXplLAorICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBkc3Rfc2l6ZSwgbSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZzZWdtZW50YXRpb24uY3BwIGIvY3Yvc3JjL2N2c2VnbWVudGF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmY2NmI4Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2c2VnbWVudGF0aW9uLmNwcApAQCAtMCwwICsxLDU1MiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2F0ZXJzaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdCBDdldTTm9kZQoreworICAgIHN0cnVjdCBDdldTTm9kZSogbmV4dDsKKyAgICBpbnQgbWFza19vZnM7CisgICAgaW50IGltZ19vZnM7Cit9CitDdldTTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZXU1F1ZXVlCit7CisgICAgQ3ZXU05vZGUqIGZpcnN0OworICAgIEN2V1NOb2RlKiBsYXN0OworfQorQ3ZXU1F1ZXVlOworCitzdGF0aWMgQ3ZXU05vZGUqCitpY3ZBbGxvY1dTTm9kZXMoIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgQ3ZXU05vZGUqIG4gPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2QWxsb2NXU05vZGVzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGNvdW50ID0gKHN0b3JhZ2UtPmJsb2NrX3NpemUgLSBzaXplb2YoQ3ZNZW1CbG9jaykpL3NpemVvZigqbikgLSAxOworCisgICAgQ1ZfQ0FMTCggbiA9IChDdldTTm9kZSopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIGNvdW50KnNpemVvZigqbikgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50LTE7IGkrKyApCisgICAgICAgIG5baV0ubmV4dCA9IG4gKyBpICsgMTsKKyAgICBuW2NvdW50LTFdLm5leHQgPSAwOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBuOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZXYXRlcnNoZWQoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIgKQoreworICAgIGNvbnN0IGludCBJTl9RVUVVRSA9IC0yOworICAgIGNvbnN0IGludCBXU0hFRCA9IC0xOworICAgIGNvbnN0IGludCBOUSA9IDI1NjsKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZXYXRlcnNoZWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzc3R1YiwgKnNyYzsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBDdldTTm9kZSogZnJlZV9ub2RlID0gMCwgKm5vZGU7CisgICAgQ3ZXU1F1ZXVlIHFbTlFdOworICAgIGludCBhY3RpdmVfcXVldWU7CisgICAgaW50IGksIGo7CisgICAgaW50IGRiLCBkZywgZHI7CisgICAgaW50KiBtYXNrOworICAgIHVjaGFyKiBpbWc7CisgICAgaW50IG1zdGVwLCBpc3RlcDsKKyAgICBpbnQgc3Vic190YWJbNTEzXTsKKworICAgIC8vIE1BWChhLGIpID0gYiArIE1BWChhLWIsMCkKKyAgICAjZGVmaW5lIHdzX21heChhLGIpICgoYikgKyBzdWJzX3RhYlsoYSktKGIpK05RXSkKKyAgICAvLyBNSU4oYSxiKSA9IGEgLSBNQVgoYS1iLDApCisgICAgI2RlZmluZSB3c19taW4oYSxiKSAoKGEpIC0gc3Vic190YWJbKGEpLShiKStOUV0pCisKKyAgICAjZGVmaW5lIHdzX3B1c2goaWR4LG1vZnMsaW9mcykgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFmcmVlX25vZGUgKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0NBTEwoIGZyZWVfbm9kZSA9IGljdkFsbG9jV1NOb2Rlcyggc3RvcmFnZSApKTtcCisgICAgICAgIG5vZGUgPSBmcmVlX25vZGU7ICAgICAgICAgICBcCisgICAgICAgIGZyZWVfbm9kZSA9IGZyZWVfbm9kZS0+bmV4dDtcCisgICAgICAgIG5vZGUtPm5leHQgPSAwOyAgICAgICAgICAgICBcCisgICAgICAgIG5vZGUtPm1hc2tfb2ZzID0gbW9mczsgICAgICBcCisgICAgICAgIG5vZGUtPmltZ19vZnMgPSBpb2ZzOyAgICAgICBcCisgICAgICAgIGlmKCBxW2lkeF0ubGFzdCApICAgICAgICAgICBcCisgICAgICAgICAgICBxW2lkeF0ubGFzdC0+bmV4dD1ub2RlOyBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBxW2lkeF0uZmlyc3QgPSBub2RlOyAgICBcCisgICAgICAgIHFbaWR4XS5sYXN0ID0gbm9kZTsgICAgICAgICBcCisgICAgfQorCisgICAgI2RlZmluZSB3c19wb3AoaWR4LG1vZnMsaW9mcykgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5vZGUgPSBxW2lkeF0uZmlyc3Q7ICAgICAgICBcCisgICAgICAgIHFbaWR4XS5maXJzdCA9IG5vZGUtPm5leHQ7ICBcCisgICAgICAgIGlmKCAhbm9kZS0+bmV4dCApICAgICAgICAgICBcCisgICAgICAgICAgICBxW2lkeF0ubGFzdCA9IDA7ICAgICAgICBcCisgICAgICAgIG5vZGUtPm5leHQgPSBmcmVlX25vZGU7ICAgICBcCisgICAgICAgIGZyZWVfbm9kZSA9IG5vZGU7ICAgICAgICAgICBcCisgICAgICAgIG1vZnMgPSBub2RlLT5tYXNrX29mczsgICAgICBcCisgICAgICAgIGlvZnMgPSBub2RlLT5pbWdfb2ZzOyAgICAgICBcCisgICAgfQorCisgICAgI2RlZmluZSBjX2RpZmYocHRyMSxwdHIyLGRpZmYpICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGIgPSBhYnMoKHB0cjEpWzBdIC0gKHB0cjIpWzBdKTtcCisgICAgICAgIGRnID0gYWJzKChwdHIxKVsxXSAtIChwdHIyKVsxXSk7XAorICAgICAgICBkciA9IGFicygocHRyMSlbMl0gLSAocHRyMilbMl0pO1wKKyAgICAgICAgZGlmZiA9IHdzX21heChkYixkZyk7ICAgICAgICAgICBcCisgICAgICAgIGRpZmYgPSB3c19tYXgoZGlmZixkcik7ICAgICAgICAgXAorICAgICAgICBhc3NlcnQoIDAgPD0gZGlmZiAmJiBkaWZmIDw9IDI1NSApOyBcCisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyY2FyciwgJnNzdHViICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3RhcnIsICZkc3R1YiApKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJPbmx5IDgtYml0LCAzLWNoYW5uZWwgaW5wdXQgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoZHN0LT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJPbmx5IDMyLWJpdCwgMS1jaGFubmVsIG91dHB1dCBpbWFnZXMgYXJlIHN1cHBvcnRlZCIgKTsKKyAgICAKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVGhlIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIiApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworCisgICAgQ1ZfQ0FMTCggc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpICk7CisKKyAgICBpc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBpbWcgPSBzcmMtPmRhdGEucHRyOworICAgIG1zdGVwID0gZHN0LT5zdGVwIC8gc2l6ZW9mKG1hc2tbMF0pOworICAgIG1hc2sgPSBkc3QtPmRhdGEuaTsKKworICAgIG1lbXNldCggcSwgMCwgTlEqc2l6ZW9mKHFbMF0pICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgICAgICBzdWJzX3RhYltpXSA9IDA7CisgICAgZm9yKCBpID0gMjU2OyBpIDw9IDUxMjsgaSsrICkKKyAgICAgICAgc3Vic190YWJbaV0gPSBpIC0gMjU2OworCisgICAgLy8gZHJhdyBhIHBpeGVsLXdpZGUgYm9yZGVyIG9mIGR1bW15ICJ3YXRlcnNoZWQiIChpLmUuIGJvdW5kYXJ5KSBwaXhlbHMKKyAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgbWFza1tqXSA9IG1hc2tbaiArIG1zdGVwKihzaXplLmhlaWdodC0xKV0gPSBXU0hFRDsKKworICAgIC8vIGluaXRpYWwgcGhhc2U6IHB1dCBhbGwgdGhlIG5laWdoYm9yIHBpeGVscyBvZiBlYWNoIG1hcmtlciB0byB0aGUgb3JkZXJlZCBxdWV1ZSAtCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBpbml0aWFsIGJvdW5kYXJpZXMgb2YgdGhlIGJhc2lucworICAgIGZvciggaSA9IDE7IGkgPCBzaXplLmhlaWdodC0xOyBpKysgKQorICAgIHsKKyAgICAgICAgaW1nICs9IGlzdGVwOyBtYXNrICs9IG1zdGVwOworICAgICAgICBtYXNrWzBdID0gbWFza1tzaXplLndpZHRoLTFdID0gV1NIRUQ7CisKKyAgICAgICAgZm9yKCBqID0gMTsgaiA8IHNpemUud2lkdGgtMTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50KiBtID0gbWFzayArIGo7CisgICAgICAgICAgICBpZiggbVswXSA8IDAgKSBtWzBdID0gMDsKKyAgICAgICAgICAgIGlmKCBtWzBdID09IDAgJiYgKG1bLTFdID4gMCB8fCBtWzFdID4gMCB8fCBtWy1tc3RlcF0gPiAwIHx8IG1bbXN0ZXBdID4gMCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyKiBwdHIgPSBpbWcgKyBqKjM7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IDI1NiwgdDsKKyAgICAgICAgICAgICAgICBpZiggbVstMV0gPiAwICkKKyAgICAgICAgICAgICAgICAgICAgY19kaWZmKCBwdHIsIHB0ciAtIDMsIGlkeCApOworICAgICAgICAgICAgICAgIGlmKCBtWzFdID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjX2RpZmYoIHB0ciwgcHRyICsgMywgdCApOworICAgICAgICAgICAgICAgICAgICBpZHggPSB3c19taW4oIGlkeCwgdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbVstbXN0ZXBdID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjX2RpZmYoIHB0ciwgcHRyIC0gaXN0ZXAsIHQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gd3NfbWluKCBpZHgsIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG1bbXN0ZXBdID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjX2RpZmYoIHB0ciwgcHRyICsgaXN0ZXAsIHQgKTsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gd3NfbWluKCBpZHgsIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0KCAwIDw9IGlkeCAmJiBpZHggPD0gMjU1ICk7CisgICAgICAgICAgICAgICAgd3NfcHVzaCggaWR4LCBpKm1zdGVwICsgaiwgaSppc3RlcCArIGoqMyApOworICAgICAgICAgICAgICAgIG1bMF0gPSBJTl9RVUVVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGZpbmQgdGhlIGZpcnN0IG5vbi1lbXB0eSBxdWV1ZQorICAgIGZvciggaSA9IDA7IGkgPCBOUTsgaSsrICkKKyAgICAgICAgaWYoIHFbaV0uZmlyc3QgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAvLyBpZiB0aGVyZSBpcyBubyBtYXJrZXJzLCBleGl0IGltbWVkaWF0ZWx5CisgICAgaWYoIGkgPT0gTlEgKQorICAgICAgICBFWElUOworCisgICAgYWN0aXZlX3F1ZXVlID0gaTsKKyAgICBpbWcgPSBzcmMtPmRhdGEucHRyOworICAgIG1hc2sgPSBkc3QtPmRhdGEuaTsKKworICAgIC8vIHJlY3Vyc2l2ZWx5IGZpbGwgdGhlIGJhc2lucworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGludCBtb2ZzLCBpb2ZzOworICAgICAgICBpbnQgbGFiID0gMCwgdDsKKyAgICAgICAgaW50KiBtOworICAgICAgICB1Y2hhciogcHRyOworICAgICAgICAKKyAgICAgICAgaWYoIHFbYWN0aXZlX3F1ZXVlXS5maXJzdCA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gYWN0aXZlX3F1ZXVlKzE7IGkgPCBOUTsgaSsrICkKKyAgICAgICAgICAgICAgICBpZiggcVtpXS5maXJzdCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYoIGkgPT0gTlEgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgYWN0aXZlX3F1ZXVlID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIHdzX3BvcCggYWN0aXZlX3F1ZXVlLCBtb2ZzLCBpb2ZzICk7CisKKyAgICAgICAgbSA9IG1hc2sgKyBtb2ZzOworICAgICAgICBwdHIgPSBpbWcgKyBpb2ZzOworICAgICAgICB0ID0gbVstMV07CisgICAgICAgIGlmKCB0ID4gMCApIGxhYiA9IHQ7CisgICAgICAgIHQgPSBtWzFdOworICAgICAgICBpZiggdCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbGFiID09IDAgKSBsYWIgPSB0OworICAgICAgICAgICAgZWxzZSBpZiggdCAhPSBsYWIgKSBsYWIgPSBXU0hFRDsKKyAgICAgICAgfQorICAgICAgICB0ID0gbVstbXN0ZXBdOworICAgICAgICBpZiggdCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbGFiID09IDAgKSBsYWIgPSB0OworICAgICAgICAgICAgZWxzZSBpZiggdCAhPSBsYWIgKSBsYWIgPSBXU0hFRDsKKyAgICAgICAgfQorICAgICAgICB0ID0gbVttc3RlcF07CisgICAgICAgIGlmKCB0ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBsYWIgPT0gMCApIGxhYiA9IHQ7CisgICAgICAgICAgICBlbHNlIGlmKCB0ICE9IGxhYiApIGxhYiA9IFdTSEVEOworICAgICAgICB9CisgICAgICAgIGFzc2VydCggbGFiICE9IDAgKTsKKyAgICAgICAgbVswXSA9IGxhYjsKKyAgICAgICAgaWYoIGxhYiA9PSBXU0hFRCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggbVstMV0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNfZGlmZiggcHRyLCBwdHIgLSAzLCB0ICk7CisgICAgICAgICAgICB3c19wdXNoKCB0LCBtb2ZzIC0gMSwgaW9mcyAtIDMgKTsKKyAgICAgICAgICAgIGFjdGl2ZV9xdWV1ZSA9IHdzX21pbiggYWN0aXZlX3F1ZXVlLCB0ICk7CisgICAgICAgICAgICBtWy0xXSA9IElOX1FVRVVFOworICAgICAgICB9CisgICAgICAgIGlmKCBtWzFdID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjX2RpZmYoIHB0ciwgcHRyICsgMywgdCApOworICAgICAgICAgICAgd3NfcHVzaCggdCwgbW9mcyArIDEsIGlvZnMgKyAzICk7CisgICAgICAgICAgICBhY3RpdmVfcXVldWUgPSB3c19taW4oIGFjdGl2ZV9xdWV1ZSwgdCApOworICAgICAgICAgICAgbVsxXSA9IElOX1FVRVVFOworICAgICAgICB9CisgICAgICAgIGlmKCBtWy1tc3RlcF0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNfZGlmZiggcHRyLCBwdHIgLSBpc3RlcCwgdCApOworICAgICAgICAgICAgd3NfcHVzaCggdCwgbW9mcyAtIG1zdGVwLCBpb2ZzIC0gaXN0ZXAgKTsKKyAgICAgICAgICAgIGFjdGl2ZV9xdWV1ZSA9IHdzX21pbiggYWN0aXZlX3F1ZXVlLCB0ICk7CisgICAgICAgICAgICBtWy1tc3RlcF0gPSBJTl9RVUVVRTsKKyAgICAgICAgfQorICAgICAgICBpZiggbVttc3RlcF0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNfZGlmZiggcHRyLCBwdHIgKyAzLCB0ICk7CisgICAgICAgICAgICB3c19wdXNoKCB0LCBtb2ZzICsgbXN0ZXAsIGlvZnMgKyBpc3RlcCApOworICAgICAgICAgICAgYWN0aXZlX3F1ZXVlID0gd3NfbWluKCBhY3RpdmVfcXVldWUsIHQgKTsKKyAgICAgICAgICAgIG1bbXN0ZXBdID0gSU5fUVVFVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0b3JhZ2UgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lYW5zaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWX0lNUEwgdm9pZAorY3ZQeXJNZWFuU2hpZnRGaWx0ZXJpbmcoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzcDAsIGRvdWJsZSBzciwgaW50IG1heF9sZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSB0ZXJtY3JpdCApCit7CisgICAgY29uc3QgaW50IGNuID0gMzsKKyAgICBjb25zdCBpbnQgTUFYX0xFVkVMUyA9IDg7CisgICAgQ3ZNYXQqIHNyY19weXJhbWlkW01BWF9MRVZFTFMrMV07CisgICAgQ3ZNYXQqIGRzdF9weXJhbWlkW01BWF9MRVZFTFMrMV07CisgICAgQ3ZNYXQqIG1hc2swID0gMDsKKyAgICBpbnQgaSwgaiwgbGV2ZWw7CisgICAgLy91Y2hhciogc3VibWFzayA9IDA7CisKKyAgICAjZGVmaW5lIGNkaWZmKG9mczApICh0YWJbYzAtZHB0cltvZnMwXSsyNTVdICsgXAorICAgICAgICB0YWJbYzEtZHB0clsob2ZzMCkrMV0rMjU1XSArIHRhYltjMi1kcHRyWyhvZnMwKSsyXSsyNTVdID49IGlzcjIyKQorCisgICAgbWVtc2V0KCBzcmNfcHlyYW1pZCwgMCwgc2l6ZW9mKHNyY19weXJhbWlkKSApOworICAgIG1lbXNldCggZHN0X3B5cmFtaWQsIDAsIHNpemVvZihkc3RfcHlyYW1pZCkgKTsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UHlyTWVhblNoaWZ0RmlsdGVyaW5nIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIHNyMiA9IHNyICogc3I7CisgICAgaW50IGlzcjIgPSBjdlJvdW5kKHNyMiksIGlzcjIyID0gTUFYKGlzcjIsMTYpOworICAgIGludCB0YWJbNzY4XTsKKyAgICBDdk1hdCBzc3R1YjAsICpzcmMwOworICAgIEN2TWF0IGRzdHViMCwgKmRzdDA7CisKKyAgICBDVl9DQUxMKCBzcmMwID0gY3ZHZXRNYXQoIHNyY2FyciwgJnNzdHViMCApKTsKKyAgICBDVl9DQUxMKCBkc3QwID0gY3ZHZXRNYXQoIGRzdGFyciwgJmRzdHViMCApKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcmMwLT50eXBlKSAhPSBDVl84VUMzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiT25seSA4LWJpdCwgMy1jaGFubmVsIGltYWdlcyBhcmUgc3VwcG9ydGVkIiApOworICAgIAorICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMwLCBkc3QwICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiVGhlIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzAsIGRzdDAgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVGhlIGlucHV0IGFuZCBvdXRwdXQgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIiApOworCisgICAgaWYoICh1bnNpZ25lZCltYXhfbGV2ZWwgPiAodW5zaWduZWQpTUFYX0xFVkVMUyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIG51bWJlciBvZiBweXJhbWlkIGxldmVscyBpcyB0b28gbGFyZ2Ugb3IgbmVnYXRpdmUiICk7CisKKyAgICBpZiggISh0ZXJtY3JpdC50eXBlICYgQ1ZfVEVSTUNSSVRfSVRFUikgKQorICAgICAgICB0ZXJtY3JpdC5tYXhfaXRlciA9IDU7CisgICAgdGVybWNyaXQubWF4X2l0ZXIgPSBNQVgodGVybWNyaXQubWF4X2l0ZXIsMSk7CisgICAgdGVybWNyaXQubWF4X2l0ZXIgPSBNSU4odGVybWNyaXQubWF4X2l0ZXIsMTAwKTsKKyAgICBpZiggISh0ZXJtY3JpdC50eXBlICYgQ1ZfVEVSTUNSSVRfRVBTKSApCisgICAgICAgIHRlcm1jcml0LmVwc2lsb24gPSAxLmY7CisgICAgdGVybWNyaXQuZXBzaWxvbiA9IE1BWCh0ZXJtY3JpdC5lcHNpbG9uLCAwLmYpOworCisgICAgZm9yKCBpID0gMDsgaSA8IDc2ODsgaSsrICkKKyAgICAgICAgdGFiW2ldID0gKGkgLSAyNTUpKihpIC0gMjU1KTsKKworICAgIC8vIDEuIGNvbnN0cnVjdCBweXJhbWlkCisgICAgc3JjX3B5cmFtaWRbMF0gPSBzcmMwOworICAgIGRzdF9weXJhbWlkWzBdID0gZHN0MDsKKyAgICBmb3IoIGxldmVsID0gMTsgbGV2ZWwgPD0gbWF4X2xldmVsOyBsZXZlbCsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNyY19weXJhbWlkW2xldmVsXSA9IGN2Q3JlYXRlTWF0KCAoc3JjX3B5cmFtaWRbbGV2ZWwtMV0tPnJvd3MrMSkvMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcmNfcHlyYW1pZFtsZXZlbC0xXS0+Y29scysxKS8yLCBzcmNfcHlyYW1pZFtsZXZlbC0xXS0+dHlwZSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0X3B5cmFtaWRbbGV2ZWxdID0gY3ZDcmVhdGVNYXQoIHNyY19weXJhbWlkW2xldmVsXS0+cm93cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY19weXJhbWlkW2xldmVsXS0+Y29scywgc3JjX3B5cmFtaWRbbGV2ZWxdLT50eXBlICkpOworICAgICAgICBDVl9DQUxMKCBjdlB5ckRvd24oIHNyY19weXJhbWlkW2xldmVsLTFdLCBzcmNfcHlyYW1pZFtsZXZlbF0gKSk7CisgICAgICAgIC8vQ1ZfQ0FMTCggY3ZSZXNpemUoIHNyY19weXJhbWlkW2xldmVsLTFdLCBzcmNfcHlyYW1pZFtsZXZlbF0sIENWX0lOVEVSX0FSRUEgKSk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggbWFzazAgPSBjdkNyZWF0ZU1hdCggc3JjMC0+cm93cywgc3JjMC0+Y29scywgQ1ZfOFVDMSApKTsKKyAgICAvL0NWX0NBTEwoIHN1Ym1hc2sgPSAodWNoYXIqKWN2QWxsb2MoIChzcCsyKSooc3ArMikgKSk7CisKKyAgICAvLyAyLiBhcHBseSBtZWFuc2hpZnQsIHN0YXJ0aW5nIGZyb20gdGhlIHB5cmFtaWQgdG9wIChpLmUuIHRoZSBzbWFsbGVzdCBsYXllcikKKyAgICBmb3IoIGxldmVsID0gbWF4X2xldmVsOyBsZXZlbCA+PSAwOyBsZXZlbC0tICkKKyAgICB7CisgICAgICAgIEN2TWF0KiBzcmMgPSBzcmNfcHlyYW1pZFtsZXZlbF07CisgICAgICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisgICAgICAgIHVjaGFyKiBzcHRyID0gc3JjLT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHNzdGVwID0gc3JjLT5zdGVwOworICAgICAgICB1Y2hhciogbWFzayA9IDA7CisgICAgICAgIGludCBtc3RlcCA9IDA7CisgICAgICAgIHVjaGFyKiBkcHRyOworICAgICAgICBpbnQgZHN0ZXA7CisgICAgICAgIGZsb2F0IHNwID0gKGZsb2F0KShzcDAgLyAoMSA8PCBsZXZlbCkpOworICAgICAgICBzcCA9IE1BWCggc3AsIDEgKTsKKworICAgICAgICBpZiggbGV2ZWwgPCBtYXhfbGV2ZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlNpemUgc2l6ZTEgPSBjdkdldE1hdFNpemUoZHN0X3B5cmFtaWRbbGV2ZWwrMV0pOworICAgICAgICAgICAgQ3ZNYXQgbSA9IGN2TWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfOFVDMSwgbWFzazAtPmRhdGEucHRyICk7CisgICAgICAgICAgICBkc3RlcCA9IGRzdF9weXJhbWlkW2xldmVsKzFdLT5zdGVwOworICAgICAgICAgICAgZHB0ciA9IGRzdF9weXJhbWlkW2xldmVsKzFdLT5kYXRhLnB0ciArIGRzdGVwICsgY247CisgICAgICAgICAgICBtc3RlcCA9IG0uc3RlcDsKKyAgICAgICAgICAgIG1hc2sgPSBtLmRhdGEucHRyICsgbXN0ZXA7CisgICAgICAgICAgICAvL2N2UmVzaXplKCBkc3RfcHlyYW1pZFtsZXZlbCsxXSwgZHN0X3B5cmFtaWRbbGV2ZWxdLCBDVl9JTlRFUl9DVUJJQyApOworICAgICAgICAgICAgY3ZQeXJVcCggZHN0X3B5cmFtaWRbbGV2ZWwrMV0sIGRzdF9weXJhbWlkW2xldmVsXSApOworICAgICAgICAgICAgY3ZaZXJvKCAmbSApOworCisgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgc2l6ZTEuaGVpZ2h0LTE7IGkrKywgZHB0ciArPSBkc3RlcCAtIChzaXplMS53aWR0aC0yKSozLCBtYXNrICs9IG1zdGVwKjIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDE7IGogPCBzaXplMS53aWR0aC0xOyBqKyssIGRwdHIgKz0gY24gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGMwID0gZHB0clswXSwgYzEgPSBkcHRyWzFdLCBjMiA9IGRwdHJbMl07CisgICAgICAgICAgICAgICAgICAgIG1hc2tbaioyIC0gMV0gPSBjZGlmZigtMykgfHwgY2RpZmYoMykgfHwgY2RpZmYoLWRzdGVwLTMpIHx8IGNkaWZmKC1kc3RlcCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNkaWZmKC1kc3RlcCszKSB8fCBjZGlmZihkc3RlcC0zKSB8fCBjZGlmZihkc3RlcCkgfHwgY2RpZmYoZHN0ZXArMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkRpbGF0ZSggJm0sICZtLCAwLCAxICk7CisgICAgICAgICAgICBtYXNrID0gbS5kYXRhLnB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGRwdHIgPSBkc3RfcHlyYW1pZFtsZXZlbF0tPmRhdGEucHRyOworICAgICAgICBkc3RlcCA9IGRzdF9weXJhbWlkW2xldmVsXS0+c3RlcDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgc3B0ciArPSBzc3RlcCAtIHNpemUud2lkdGgqMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRwdHIgKz0gZHN0ZXAgLSBzaXplLndpZHRoKjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrICs9IG1zdGVwICkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKywgc3B0ciArPSAzLCBkcHRyICs9IDMgKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGludCB4MCA9IGosIHkwID0gaSwgeDEsIHkxLCBpdGVyOworICAgICAgICAgICAgICAgIGludCBjMCwgYzEsIGMyOworCisgICAgICAgICAgICAgICAgaWYoIG1hc2sgJiYgIW1hc2tbal0gKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGMwID0gc3B0clswXSwgYzEgPSBzcHRyWzFdLCBjMiA9IHNwdHJbMl07CisKKyAgICAgICAgICAgICAgICAvLyBpdGVyYXRlIG1lYW5zaGlmdCBwcm9jZWR1cmUKKyAgICAgICAgICAgICAgICBmb3IoIGl0ZXIgPSAwOyBpdGVyIDwgdGVybWNyaXQubWF4X2l0ZXI7IGl0ZXIrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciogcHRyOworICAgICAgICAgICAgICAgICAgICBpbnQgeCwgeSwgY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICBpbnQgbWlueCwgbWlueSwgbWF4eCwgbWF4eTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHN4ID0gMCwgc3kgPSAwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgaWNvdW50OworICAgICAgICAgICAgICAgICAgICBpbnQgc3RvcF9mbGFnOworCisgICAgICAgICAgICAgICAgICAgIC8vbWVhbiBzaGlmdDogcHJvY2VzcyBwaXhlbHMgaW4gd2luZG93IChwLXNpZ21hU3ApeChwK3NpZ21hU3ApCisgICAgICAgICAgICAgICAgICAgIG1pbnggPSBjdlJvdW5kKHgwIC0gc3ApOyBtaW54ID0gTUFYKG1pbngsIDApOworICAgICAgICAgICAgICAgICAgICBtaW55ID0gY3ZSb3VuZCh5MCAtIHNwKTsgbWlueSA9IE1BWChtaW55LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgbWF4eCA9IGN2Um91bmQoeDAgKyBzcCk7IG1heHggPSBNSU4obWF4eCwgc2l6ZS53aWR0aC0xKTsKKyAgICAgICAgICAgICAgICAgICAgbWF4eSA9IGN2Um91bmQoeTAgKyBzcCk7IG1heHkgPSBNSU4obWF4eSwgc2l6ZS5oZWlnaHQtMSk7CisgICAgICAgICAgICAgICAgICAgIHB0ciA9IHNwdHIgKyAobWlueSAtIGkpKnNzdGVwICsgKG1pbnggLSBqKSozOyAKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSBtaW55OyB5IDw9IG1heHk7IHkrKywgcHRyICs9IHNzdGVwIC0gKG1heHgtbWlueCsxKSozICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvd19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0gbWlueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggOyB4ICsgMyA8PSBtYXh4OyB4ICs9IDQsIHB0ciArPSAxMiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHQwID0gcHRyWzBdLCB0MSA9IHB0clsxXSwgdDIgPSBwdHJbMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlt0MC1jMCsyNTVdICsgdGFiW3QxLWMxKzI1NV0gKyB0YWJbdDItYzIrMjU1XSA8PSBpc3IyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IHQwOyBzMSArPSB0MTsgczIgKz0gdDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4ICs9IHg7IHJvd19jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHB0clszXSwgdDEgPSBwdHJbNF0sIHQyID0gcHRyWzVdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0YWJbdDAtYzArMjU1XSArIHRhYlt0MS1jMSsyNTVdICsgdGFiW3QyLWMyKzI1NV0gPD0gaXNyMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCArPSB0MDsgczEgKz0gdDE7IHMyICs9IHQyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeCArPSB4KzE7IHJvd19jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHB0cls2XSwgdDEgPSBwdHJbN10sIHQyID0gcHRyWzhdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0YWJbdDAtYzArMjU1XSArIHRhYlt0MS1jMSsyNTVdICsgdGFiW3QyLWMyKzI1NV0gPD0gaXNyMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCArPSB0MDsgczEgKz0gdDE7IHMyICs9IHQyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeCArPSB4KzI7IHJvd19jb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHB0cls5XSwgdDEgPSBwdHJbMTBdLCB0MiA9IHB0clsxMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHRhYlt0MC1jMCsyNTVdICsgdGFiW3QxLWMxKzI1NV0gKyB0YWJbdDItYzIrMjU1XSA8PSBpc3IyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwICs9IHQwOyBzMSArPSB0MTsgczIgKz0gdDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN4ICs9IHgrMzsgcm93X2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIDsgeCA8PSBtYXh4OyB4KyssIHB0ciArPSAzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdDAgPSBwdHJbMF0sIHQxID0gcHRyWzFdLCB0MiA9IHB0clsyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdGFiW3QwLWMwKzI1NV0gKyB0YWJbdDEtYzErMjU1XSArIHRhYlt0Mi1jMisyNTVdIDw9IGlzcjIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczAgKz0gdDA7IHMxICs9IHQxOyBzMiArPSB0MjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ggKz0geDsgcm93X2NvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gcm93X2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgc3kgKz0geSpyb3dfY291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiggY291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBpY291bnQgPSAxLi9jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgeDEgPSBjdlJvdW5kKHN4Kmljb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHkxID0gY3ZSb3VuZChzeSppY291bnQpOworICAgICAgICAgICAgICAgICAgICBzMCA9IGN2Um91bmQoczAqaWNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgczEgPSBjdlJvdW5kKHMxKmljb3VudCk7CisgICAgICAgICAgICAgICAgICAgIHMyID0gY3ZSb3VuZChzMippY291bnQpOworCisgICAgICAgICAgICAgICAgICAgIHN0b3BfZmxhZyA9ICh4MCA9PSB4MSAmJiB5MCA9PSB5MSkgfHwgYWJzKHgxLXgwKSArIGFicyh5MS15MCkgKworICAgICAgICAgICAgICAgICAgICAgICAgdGFiW3MwIC0gYzAgKyAyNTVdICsgdGFiW3MxIC0gYzEgKyAyNTVdICsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYltzMiAtIGMyICsgMjU1XSA8PSB0ZXJtY3JpdC5lcHNpbG9uOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICB4MCA9IHgxOyB5MCA9IHkxOworICAgICAgICAgICAgICAgICAgICBjMCA9IHMwOyBjMSA9IHMxOyBjMiA9IHMyOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBzdG9wX2ZsYWcgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZHB0clswXSA9ICh1Y2hhciljMDsKKyAgICAgICAgICAgICAgICBkcHRyWzFdID0gKHVjaGFyKWMxOworICAgICAgICAgICAgICAgIGRwdHJbMl0gPSAodWNoYXIpYzI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9ICAgCisKKyAgICBfX0VORF9fOworCisgICAgZm9yKCBpID0gMTsgaSA8PSBNQVhfTEVWRUxTOyBpKysgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmc3JjX3B5cmFtaWRbaV0gKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmZHN0X3B5cmFtaWRbaV0gKTsKKyAgICB9CisgICAgY3ZSZWxlYXNlTWF0KCAmbWFzazAgKTsKK30KKwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2c2hhcGVkZXNjci5jcHAgYi9jdi9zcmMvY3ZzaGFwZWRlc2NyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGMyZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2c2hhcGVkZXNjci5jcHAKQEAgLTAsMCArMSwxMzU2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKworLyogY2FsY3VsYXRlcyBsZW5ndGggb2YgYSBjdXJ2ZSAoZS5nLiBjb250b3VyIHBlcmltZXRlcikgKi8KK0NWX0lNUEwgIGRvdWJsZQorY3ZBcmNMZW5ndGgoIGNvbnN0IHZvaWQgKmFycmF5LCBDdlNsaWNlIHNsaWNlLCBpbnQgaXNfY2xvc2VkICkKK3sKKyAgICBkb3VibGUgcGVyaW1ldGVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZBcmNMZW5ndGgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiA9IDAsIGNvdW50OworICAgIGNvbnN0IGludCBOID0gMTY7CisgICAgZmxvYXQgYnVmW05dOworICAgIEN2TWF0IGJ1ZmZlciA9IGN2TWF0KCAxLCBOLCBDVl8zMkYsIGJ1ZiApOyAKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZDb250b3VyIGNvbnRvdXJfaGVhZGVyOworICAgIEN2U2VxKiBjb250b3VyID0gMDsKKyAgICBDdlNlcUJsb2NrIGJsb2NrOworCisgICAgaWYoIENWX0lTX1NFUSggYXJyYXkgKSkKKyAgICB7CisgICAgICAgIGNvbnRvdXIgPSAoQ3ZTZXEqKWFycmF5OworICAgICAgICBpZiggIUNWX0lTX1NFUV9QT0xZTElORSggY29udG91ciApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVuc3VwcG9ydGVkIHNlcXVlbmNlIHR5cGUiICk7CisgICAgICAgIGlmKCBpc19jbG9zZWQgPCAwICkKKyAgICAgICAgICAgIGlzX2Nsb3NlZCA9IENWX0lTX1NFUV9DTE9TRUQoIGNvbnRvdXIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaXNfY2xvc2VkID0gaXNfY2xvc2VkID4gMDsKKyAgICAgICAgQ1ZfQ0FMTCggY29udG91ciA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfQ1VSVkUgfCAoaXNfY2xvc2VkID8gQ1ZfU0VRX0ZMQUdfQ0xPU0VEIDogMCksCisgICAgICAgICAgICBhcnJheSwgJmNvbnRvdXJfaGVhZGVyLCAmYmxvY2sgKSk7CisgICAgfQorCisgICAgaWYoIGNvbnRvdXItPnRvdGFsID4gMSApCisgICAgeworICAgICAgICBpbnQgaXNfZmxvYXQgPSBDVl9TRVFfRUxUWVBFKCBjb250b3VyICkgPT0gQ1ZfMzJGQzI7CisgICAgICAgIAorICAgICAgICBjdlN0YXJ0UmVhZFNlcSggY29udG91ciwgJnJlYWRlciwgMCApOworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgY291bnQgPSBjdlNsaWNlTGVuZ3RoKCBzbGljZSwgY29udG91ciApOworCisgICAgICAgIGNvdW50IC09ICFpc19jbG9zZWQgJiYgY291bnQgPT0gY29udG91ci0+dG90YWw7CisKKyAgICAgICAgLyogc2Nyb2xsIHRoZSByZWFkZXIgYnkgMSBwb2ludCAqLworICAgICAgICByZWFkZXIucHJldl9lbGVtID0gcmVhZGVyLnB0cjsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKEN2UG9pbnQpLCByZWFkZXIgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IGR4LCBkeTsKKworICAgICAgICAgICAgaWYoICFpc19mbG9hdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZQb2ludCogcHQgPSAoQ3ZQb2ludCopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgICAgICBDdlBvaW50KiBwcmV2X3B0ID0gKEN2UG9pbnQqKXJlYWRlci5wcmV2X2VsZW07CisKKyAgICAgICAgICAgICAgICBkeCA9IChmbG9hdClwdC0+eCAtIChmbG9hdClwcmV2X3B0LT54OworICAgICAgICAgICAgICAgIGR5ID0gKGZsb2F0KXB0LT55IC0gKGZsb2F0KXByZXZfcHQtPnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwdCA9IChDdlBvaW50MkQzMmYqKXJlYWRlci5wdHI7CisgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwcmV2X3B0ID0gKEN2UG9pbnQyRDMyZiopcmVhZGVyLnByZXZfZWxlbTsKKworICAgICAgICAgICAgICAgIGR4ID0gcHQtPnggLSBwcmV2X3B0LT54OworICAgICAgICAgICAgICAgIGR5ID0gcHQtPnkgLSBwcmV2X3B0LT55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZWFkZXIucHJldl9lbGVtID0gcmVhZGVyLnB0cjsKKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGNvbnRvdXItPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisKKyAgICAgICAgICAgIGJ1ZmZlci5kYXRhLmZsW2pdID0gZHggKiBkeCArIGR5ICogZHk7CisgICAgICAgICAgICBpZiggKytqID09IE4gfHwgaSA9PSBjb3VudCAtIDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5jb2xzID0gajsKKyAgICAgICAgICAgICAgICBjdlBvdyggJmJ1ZmZlciwgJmJ1ZmZlciwgMC41ICk7CisgICAgICAgICAgICAgICAgZm9yKCA7IGogPiAwOyBqLS0gKQorICAgICAgICAgICAgICAgICAgICBwZXJpbWV0ZXIgKz0gYnVmZmVyLmRhdGEuZmxbai0xXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcGVyaW1ldGVyOworfQorCisKK3N0YXRpYyBDdlN0YXR1cworaWN2RmluZENpcmNsZSggQ3ZQb2ludDJEMzJmIHB0MCwgQ3ZQb2ludDJEMzJmIHB0MSwKKyAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdDIsIEN2UG9pbnQyRDMyZiAqIGNlbnRlciwgZmxvYXQgKnJhZGl1cyApCit7CisgICAgZG91YmxlIHgxID0gKHB0MC54ICsgcHQxLngpICogMC41OworICAgIGRvdWJsZSBkeTEgPSBwdDAueCAtIHB0MS54OworICAgIGRvdWJsZSB4MiA9IChwdDEueCArIHB0Mi54KSAqIDAuNTsKKyAgICBkb3VibGUgZHkyID0gcHQxLnggLSBwdDIueDsKKyAgICBkb3VibGUgeTEgPSAocHQwLnkgKyBwdDEueSkgKiAwLjU7CisgICAgZG91YmxlIGR4MSA9IHB0MS55IC0gcHQwLnk7CisgICAgZG91YmxlIHkyID0gKHB0MS55ICsgcHQyLnkpICogMC41OworICAgIGRvdWJsZSBkeDIgPSBwdDIueSAtIHB0MS55OworICAgIGRvdWJsZSB0ID0gMDsKKworICAgIEN2U3RhdHVzIHJlc3VsdCA9IENWX09LOworCisgICAgaWYoIGljdkludGVyc2VjdExpbmVzKCB4MSwgZHgxLCB5MSwgZHkxLCB4MiwgZHgyLCB5MiwgZHkyLCAmdCApID49IDAgKQorICAgIHsKKyAgICAgICAgY2VudGVyLT54ID0gKGZsb2F0KSAoeDIgKyBkeDIgKiB0KTsKKyAgICAgICAgY2VudGVyLT55ID0gKGZsb2F0KSAoeTIgKyBkeTIgKiB0KTsKKyAgICAgICAgKnJhZGl1cyA9IChmbG9hdCkgaWN2RGlzdGFuY2VMMl8zMmYoICpjZW50ZXIsIHB0MCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjZW50ZXItPnggPSBjZW50ZXItPnkgPSAwLmY7CisgICAgICAgIHJhZGl1cyA9IDA7CisgICAgICAgIHJlc3VsdCA9IENWX05PVERFRklORURfRVJSOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworQ1ZfSU5MSU5FIGRvdWJsZSBpY3ZJc1B0SW5DaXJjbGUoIEN2UG9pbnQyRDMyZiBwdCwgQ3ZQb2ludDJEMzJmIGNlbnRlciwgZmxvYXQgcmFkaXVzICkKK3sKKyAgICBkb3VibGUgZHggPSBwdC54IC0gY2VudGVyLng7CisgICAgZG91YmxlIGR5ID0gcHQueSAtIGNlbnRlci55OworICAgIHJldHVybiAoZG91YmxlKXJhZGl1cypyYWRpdXMgLSBkeCpkeCAtIGR5KmR5OworfQorCisKK3N0YXRpYyBpbnQKK2ljdkZpbmRFbnNsb3NpbmdDaWNsZTRwdHNfMzJmKCBDdlBvaW50MkQzMmYgKiBwdHMsIEN2UG9pbnQyRDMyZiAqIF9jZW50ZXIsIGZsb2F0ICpfcmFkaXVzICkKK3sKKyAgICBpbnQgc2h1ZmZsZXNbNF1bNF0gPSB7IHswLCAxLCAyLCAzfSwgezAsIDEsIDMsIDJ9LCB7MiwgMywgMCwgMX0sIHsyLCAzLCAxLCAwfSB9OworCisgICAgaW50IGlkeHNbNF0gPSB7IDAsIDEsIDIsIDMgfTsKKyAgICBpbnQgaSwgaiwgayA9IDEsIG1pID0gMDsKKyAgICBmbG9hdCBtYXhfZGlzdCA9IDA7CisgICAgQ3ZQb2ludDJEMzJmIGNlbnRlcjsKKyAgICBDdlBvaW50MkQzMmYgbWluX2NlbnRlcjsKKyAgICBmbG9hdCByYWRpdXMsIG1pbl9yYWRpdXMgPSBGTFRfTUFYOworICAgIEN2UG9pbnQyRDMyZiByZXNfcHRzWzRdOworCisgICAgY2VudGVyID0gbWluX2NlbnRlciA9IHB0c1swXTsKKyAgICByYWRpdXMgPSAxLmY7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPCA0OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkaXN0ID0gaWN2RGlzdGFuY2VMMl8zMmYoIHB0c1tpXSwgcHRzW2pdICk7CisKKyAgICAgICAgICAgIGlmKCBtYXhfZGlzdCA8IGRpc3QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heF9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICBpZHhzWzBdID0gaTsKKyAgICAgICAgICAgICAgICBpZHhzWzFdID0gajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgaWYoIG1heF9kaXN0ID09IDAgKQorICAgICAgICBnb3RvIGZ1bmN0aW9uX2V4aXQ7CisKKyAgICBrID0gMjsKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBrOyBqKysgKQorICAgICAgICAgICAgaWYoIGkgPT0gaWR4c1tqXSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmKCBqID09IGsgKQorICAgICAgICAgICAgaWR4c1trKytdID0gaTsKKyAgICB9CisKKyAgICBjZW50ZXIgPSBjdlBvaW50MkQzMmYoIChwdHNbaWR4c1swXV0ueCArIHB0c1tpZHhzWzFdXS54KSowLjVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB0c1tpZHhzWzBdXS55ICsgcHRzW2lkeHNbMV1dLnkpKjAuNWYgKTsKKyAgICByYWRpdXMgPSAoZmxvYXQpKGljdkRpc3RhbmNlTDJfMzJmKCBwdHNbaWR4c1swXV0sIGNlbnRlciApKjEuMDMpOworICAgIGlmKCByYWRpdXMgPCAxLmYgKQorICAgICAgICByYWRpdXMgPSAxLmY7CisKKyAgICBpZiggaWN2SXNQdEluQ2lyY2xlKCBwdHNbaWR4c1syXV0sIGNlbnRlciwgcmFkaXVzICkgPj0gMCAmJgorICAgICAgICBpY3ZJc1B0SW5DaXJjbGUoIHB0c1tpZHhzWzNdXSwgY2VudGVyLCByYWRpdXMgKSA+PSAwICkKKyAgICB7CisgICAgICAgIGsgPSAyOyAvL3JhbmQoKSUyKzI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1pID0gLTE7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaWN2RmluZENpcmNsZSggcHRzW3NodWZmbGVzW2ldWzBdXSwgcHRzW3NodWZmbGVzW2ldWzFdXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHNbc2h1ZmZsZXNbaV1bMl1dLCAmY2VudGVyLCAmcmFkaXVzICkgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmFkaXVzICo9IDEuMDNmOworICAgICAgICAgICAgICAgIGlmKCByYWRpdXMgPCAyLmYgKQorICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSAyLmY7CisKKyAgICAgICAgICAgICAgICBpZiggaWN2SXNQdEluQ2lyY2xlKCBwdHNbc2h1ZmZsZXNbaV1bM11dLCBjZW50ZXIsIHJhZGl1cyApID49IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgbWluX3JhZGl1cyA+IHJhZGl1cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5fcmFkaXVzID0gcmFkaXVzOworICAgICAgICAgICAgICAgICAgICBtaW5fY2VudGVyID0gY2VudGVyOworICAgICAgICAgICAgICAgICAgICBtaSA9IGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFzc2VydCggbWkgPj0gMCApOworICAgICAgICBpZiggbWkgPCAwICkKKyAgICAgICAgICAgIG1pID0gMDsKKyAgICAgICAgayA9IDM7CisgICAgICAgIGNlbnRlciA9IG1pbl9jZW50ZXI7CisgICAgICAgIHJhZGl1cyA9IG1pbl9yYWRpdXM7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICAgICAgaWR4c1tpXSA9IHNodWZmbGVzW21pXVtpXTsKKyAgICB9CisKKyAgZnVuY3Rpb25fZXhpdDoKKworICAgICpfY2VudGVyID0gY2VudGVyOworICAgICpfcmFkaXVzID0gcmFkaXVzOworCisgICAgLyogcmVvcmRlciBvdXRwdXQgcG9pbnRzICovCisgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgIHJlc19wdHNbaV0gPSBwdHNbaWR4c1tpXV07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICB7CisgICAgICAgIHB0c1tpXSA9IHJlc19wdHNbaV07CisgICAgICAgIGFzc2VydCggaWN2SXNQdEluQ2lyY2xlKCBwdHNbaV0sIGNlbnRlciwgcmFkaXVzICkgPj0gMCApOworICAgIH0KKworICAgIHJldHVybiBrOworfQorCisKK0NWX0lNUEwgaW50Citjdk1pbkVuY2xvc2luZ0NpcmNsZSggY29uc3Qgdm9pZCogYXJyYXksIEN2UG9pbnQyRDMyZiAqIF9jZW50ZXIsIGZsb2F0ICpfcmFkaXVzICkKK3sKKyAgICBjb25zdCBpbnQgbWF4X2l0ZXJzID0gMTAwOworICAgIGNvbnN0IGZsb2F0IGVwcyA9IEZMVF9FUFNJTE9OKjI7CisgICAgQ3ZQb2ludDJEMzJmIGNlbnRlciA9IHsgMCwgMCB9OworICAgIGZsb2F0IHJhZGl1cyA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBpZiggX2NlbnRlciApCisgICAgICAgIF9jZW50ZXItPnggPSBfY2VudGVyLT55ID0gMC5mOworICAgIGlmKCBfcmFkaXVzICkKKyAgICAgICAgKl9yYWRpdXMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1pbkVuY2xvc2luZ0NpcmNsZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgaywgY291bnQ7CisgICAgQ3ZQb2ludDJEMzJmIHB0c1s4XTsKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXFCbG9jayBibG9jazsKKyAgICBDdlNlcSogc2VxdWVuY2UgPSAwOworICAgIGludCBpc19mbG9hdDsKKworICAgIGlmKCAhX2NlbnRlciB8fCAhX3JhZGl1cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBjZW50ZXIgb3IgcmFkaXVzIHBvaW50ZXJzIiApOworCisgICAgaWYoIENWX0lTX1NFUShhcnJheSkgKQorICAgIHsKKyAgICAgICAgc2VxdWVuY2UgPSAoQ3ZTZXEqKWFycmF5OworICAgICAgICBpZiggIUNWX0lTX1NFUV9QT0lOVF9TRVQoIHNlcXVlbmNlICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIHBhc3NlZCBzZXF1ZW5jZSBpcyBub3QgYSB2YWxpZCBjb250b3VyIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBzZXF1ZW5jZSA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfR0VORVJJQywgYXJyYXksICZjb250b3VyX2hlYWRlciwgJmJsb2NrICkpOworICAgIH0KKworICAgIGlmKCBzZXF1ZW5jZS0+dG90YWwgPD0gMCApCisgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9CQURTSVpFX0VSUiApOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNlcXVlbmNlLCAmcmVhZGVyLCAwICkpOworCisgICAgY291bnQgPSBzZXF1ZW5jZS0+dG90YWw7CisgICAgaXNfZmxvYXQgPSBDVl9TRVFfRUxUWVBFKHNlcXVlbmNlKSA9PSBDVl8zMkZDMjsKKworICAgIGlmKCAhaXNfZmxvYXQgKQorICAgIHsKKyAgICAgICAgQ3ZQb2ludCAqcHRfbGVmdCwgKnB0X3JpZ2h0LCAqcHRfdG9wLCAqcHRfYm90dG9tOworICAgICAgICBDdlBvaW50IHB0OworICAgICAgICBwdF9sZWZ0ID0gcHRfcmlnaHQgPSBwdF90b3AgPSBwdF9ib3R0b20gPSAoQ3ZQb2ludCAqKShyZWFkZXIucHRyKTsKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQsIHJlYWRlciApOworCisgICAgICAgIGZvciggaSA9IDE7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludCogcHRfcHRyID0gKEN2UG9pbnQqKXJlYWRlci5wdHI7CisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisKKyAgICAgICAgICAgIGlmKCBwdC54IDwgcHRfbGVmdC0+eCApCisgICAgICAgICAgICAgICAgcHRfbGVmdCA9IHB0X3B0cjsKKyAgICAgICAgICAgIGlmKCBwdC54ID4gcHRfcmlnaHQtPnggKQorICAgICAgICAgICAgICAgIHB0X3JpZ2h0ID0gcHRfcHRyOworICAgICAgICAgICAgaWYoIHB0LnkgPCBwdF90b3AtPnkgKQorICAgICAgICAgICAgICAgIHB0X3RvcCA9IHB0X3B0cjsKKyAgICAgICAgICAgIGlmKCBwdC55ID4gcHRfYm90dG9tLT55ICkKKyAgICAgICAgICAgICAgICBwdF9ib3R0b20gPSBwdF9wdHI7CisgICAgICAgIH0KKworICAgICAgICBwdHNbMF0gPSBjdlBvaW50VG8zMmYoICpwdF9sZWZ0ICk7CisgICAgICAgIHB0c1sxXSA9IGN2UG9pbnRUbzMyZiggKnB0X3JpZ2h0ICk7CisgICAgICAgIHB0c1syXSA9IGN2UG9pbnRUbzMyZiggKnB0X3RvcCApOworICAgICAgICBwdHNbM10gPSBjdlBvaW50VG8zMmYoICpwdF9ib3R0b20gKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZQb2ludDJEMzJmICpwdF9sZWZ0LCAqcHRfcmlnaHQsICpwdF90b3AsICpwdF9ib3R0b207CisgICAgICAgIEN2UG9pbnQyRDMyZiBwdDsKKyAgICAgICAgcHRfbGVmdCA9IHB0X3JpZ2h0ID0gcHRfdG9wID0gcHRfYm90dG9tID0gKEN2UG9pbnQyRDMyZiAqKSAocmVhZGVyLnB0cik7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogcHRfcHRyID0gKEN2UG9pbnQyRDMyZiopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKworICAgICAgICAgICAgaWYoIHB0LnggPCBwdF9sZWZ0LT54ICkKKyAgICAgICAgICAgICAgICBwdF9sZWZ0ID0gcHRfcHRyOworICAgICAgICAgICAgaWYoIHB0LnggPiBwdF9yaWdodC0+eCApCisgICAgICAgICAgICAgICAgcHRfcmlnaHQgPSBwdF9wdHI7CisgICAgICAgICAgICBpZiggcHQueSA8IHB0X3RvcC0+eSApCisgICAgICAgICAgICAgICAgcHRfdG9wID0gcHRfcHRyOworICAgICAgICAgICAgaWYoIHB0LnkgPiBwdF9ib3R0b20tPnkgKQorICAgICAgICAgICAgICAgIHB0X2JvdHRvbSA9IHB0X3B0cjsKKyAgICAgICAgfQorCisgICAgICAgIHB0c1swXSA9ICpwdF9sZWZ0OworICAgICAgICBwdHNbMV0gPSAqcHRfcmlnaHQ7CisgICAgICAgIHB0c1syXSA9ICpwdF90b3A7CisgICAgICAgIHB0c1szXSA9ICpwdF9ib3R0b207CisgICAgfQorCisgICAgZm9yKCBrID0gMDsgayA8IG1heF9pdGVyczsgaysrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBtaW5fZGVsdGEgPSAwLCBkZWx0YTsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHB0Zmw7CisgICAgICAgIAorICAgICAgICBpY3ZGaW5kRW5zbG9zaW5nQ2ljbGU0cHRzXzMyZiggcHRzLCAmY2VudGVyLCAmcmFkaXVzICk7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBzZXF1ZW5jZSwgJnJlYWRlciwgMCApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFpc19mbG9hdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRmbC54ID0gKGZsb2F0KSgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPng7CisgICAgICAgICAgICAgICAgcHRmbC55ID0gKGZsb2F0KSgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRmbCA9ICooQ3ZQb2ludDJEMzJmKilyZWFkZXIucHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxdWVuY2UtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisKKyAgICAgICAgICAgIGRlbHRhID0gaWN2SXNQdEluQ2lyY2xlKCBwdGZsLCBjZW50ZXIsIHJhZGl1cyApOworICAgICAgICAgICAgaWYoIGRlbHRhIDwgbWluX2RlbHRhICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtaW5fZGVsdGEgPSBkZWx0YTsKKyAgICAgICAgICAgICAgICBwdHNbM10gPSBwdGZsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc3VsdCA9IG1pbl9kZWx0YSA+PSAwOworICAgICAgICBpZiggcmVzdWx0ICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmKCAhcmVzdWx0ICkKKyAgICB7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBzZXF1ZW5jZSwgJnJlYWRlciwgMCApOworICAgICAgICByYWRpdXMgPSAwLmY7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50MkQzMmYgcHRmbDsKKyAgICAgICAgICAgIGZsb2F0IHQsIGR4LCBkeTsKKworICAgICAgICAgICAgaWYoICFpc19mbG9hdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRmbC54ID0gKGZsb2F0KSgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPng7CisgICAgICAgICAgICAgICAgcHRmbC55ID0gKGZsb2F0KSgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRmbCA9ICooQ3ZQb2ludDJEMzJmKilyZWFkZXIucHRyOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzZXF1ZW5jZS0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgICAgIGR4ID0gY2VudGVyLnggLSBwdGZsLng7CisgICAgICAgICAgICBkeSA9IGNlbnRlci55IC0gcHRmbC55OworICAgICAgICAgICAgdCA9IGR4KmR4ICsgZHkqZHk7CisgICAgICAgICAgICByYWRpdXMgPSBNQVgocmFkaXVzLHQpOworICAgICAgICB9CisKKyAgICAgICAgcmFkaXVzID0gKGZsb2F0KShzcXJ0KHJhZGl1cykqKDEgKyBlcHMpKTsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgKl9jZW50ZXIgPSBjZW50ZXI7CisgICAgKl9yYWRpdXMgPSByYWRpdXM7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIGFyZWEgb2YgYSB3aG9sZSBzZXF1ZW5jZSAqLworc3RhdGljIEN2U3RhdHVzCitpY3ZDb250b3VyQXJlYSggY29uc3QgQ3ZTZXEqIGNvbnRvdXIsIGRvdWJsZSAqYXJlYSApCit7CisgICAgaWYoIGNvbnRvdXItPnRvdGFsICkKKyAgICB7CisgICAgICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgaW50IGxwdCA9IGNvbnRvdXItPnRvdGFsOworICAgICAgICBkb3VibGUgYTAwID0gMCwgeGlfMSwgeWlfMTsKKyAgICAgICAgaW50IGlzX2Zsb2F0ID0gQ1ZfU0VRX0VMVFlQRShjb250b3VyKSA9PSBDVl8zMkZDMjsKKworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggY29udG91ciwgJnJlYWRlciwgMCApOworCisgICAgICAgIGlmKCAhaXNfZmxvYXQgKQorICAgICAgICB7CisgICAgICAgICAgICB4aV8xID0gKChDdlBvaW50KikocmVhZGVyLnB0cikpLT54OworICAgICAgICAgICAgeWlfMSA9ICgoQ3ZQb2ludCopKHJlYWRlci5wdHIpKS0+eTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHhpXzEgPSAoKEN2UG9pbnQyRDMyZiopKHJlYWRlci5wdHIpKS0+eDsKKyAgICAgICAgICAgIHlpXzEgPSAoKEN2UG9pbnQyRDMyZiopKHJlYWRlci5wdHIpKS0+eTsKKyAgICAgICAgfQorICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBjb250b3VyLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICAKKyAgICAgICAgd2hpbGUoIGxwdC0tID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBkeHksIHhpLCB5aTsKKworICAgICAgICAgICAgaWYoICFpc19mbG9hdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeGkgPSAoKEN2UG9pbnQqKShyZWFkZXIucHRyKSktPng7CisgICAgICAgICAgICAgICAgeWkgPSAoKEN2UG9pbnQqKShyZWFkZXIucHRyKSktPnk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeGkgPSAoKEN2UG9pbnQyRDMyZiopKHJlYWRlci5wdHIpKS0+eDsKKyAgICAgICAgICAgICAgICB5aSA9ICgoQ3ZQb2ludDJEMzJmKikocmVhZGVyLnB0cikpLT55OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggY29udG91ci0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKworICAgICAgICAgICAgZHh5ID0geGlfMSAqIHlpIC0geGkgKiB5aV8xOworICAgICAgICAgICAgYTAwICs9IGR4eTsKKyAgICAgICAgICAgIHhpXzEgPSB4aTsKKyAgICAgICAgICAgIHlpXzEgPSB5aTsKKyAgICAgICAgfQorCisgICAgICAgICphcmVhID0gYTAwICogMC41OworICAgIH0KKyAgICBlbHNlCisgICAgICAgICphcmVhID0gMDsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworIGNvcHkgZGF0YSBmcm9tIG9uZSBidWZmZXIgdG8gb3RoZXIgYnVmZmVyIAorCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZNZW1Db3B5KCBkb3VibGUgKipidWYxLCBkb3VibGUgKipidWYyLCBkb3VibGUgKipidWYzLCBpbnQgKmJfbWF4ICkKK3sKKyAgICBpbnQgYmI7CisKKyAgICBpZiggKCpidWYxID09IE5VTEwgJiYgKmJ1ZjIgPT0gTlVMTCkgfHwgKmJ1ZjMgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGJiID0gKmJfbWF4OworICAgIGlmKCAqYnVmMiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgICpiX21heCA9IDIgKiAoKmJfbWF4KTsKKyAgICAgICAgKmJ1ZjIgPSAoZG91YmxlICopY3ZBbGxvYyggKCpiX21heCkgKiBzaXplb2YoIGRvdWJsZSApKTsKKworICAgICAgICBpZiggKmJ1ZjIgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgICAgIG1lbWNweSggKmJ1ZjIsICpidWYzLCBiYiAqIHNpemVvZiggZG91YmxlICkpOworCisgICAgICAgICpidWYzID0gKmJ1ZjI7CisgICAgICAgIGN2RnJlZSggYnVmMSApOworICAgICAgICAqYnVmMSA9IE5VTEw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpiX21heCA9IDIgKiAoKmJfbWF4KTsKKyAgICAgICAgKmJ1ZjEgPSAoZG91YmxlICopIGN2QWxsb2MoICgqYl9tYXgpICogc2l6ZW9mKCBkb3VibGUgKSk7CisKKyAgICAgICAgaWYoICpidWYxID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKworICAgICAgICBtZW1jcHkoICpidWYxLCAqYnVmMywgYmIgKiBzaXplb2YoIGRvdWJsZSApKTsKKworICAgICAgICAqYnVmMyA9ICpidWYxOworICAgICAgICBjdkZyZWUoIGJ1ZjIgKTsKKyAgICAgICAgKmJ1ZjIgPSBOVUxMOworICAgIH0KKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLyogYXJlYSBvZiBhIGNvbnRvdXIgc2VjdG9yICovCitzdGF0aWMgQ3ZTdGF0dXMgaWN2Q29udG91clNlY0FyZWEoIEN2U2VxICogY29udG91ciwgQ3ZTbGljZSBzbGljZSwgZG91YmxlICphcmVhICkKK3sKKyAgICBDdlBvaW50IHB0OyAgICAgICAgICAgICAgICAgLyogIHBvaW50ZXIgdG8gcG9pbnRzICAgKi8KKyAgICBDdlBvaW50IHB0X3MsIHB0X2U7ICAgICAgICAgLyogIGZpcnN0IGFuZCBsYXN0IHBvaW50cyAgKi8KKyAgICBDdlNlcVJlYWRlciByZWFkZXI7ICAgICAgICAgLyogIHBvaW50cyByZWFkZXIgb2YgY29udG91ciAgICovCisKKyAgICBpbnQgcF9tYXggPSAyLCBwX2luZDsKKyAgICBpbnQgbHB0LCBmbGFnLCBpOworICAgIGRvdWJsZSBhMDA7ICAgICAgICAgICAgICAgICAvKiB1bm5vcm1hbGl6ZWQgbW9tZW50cyBtMDAgICAgKi8KKyAgICBkb3VibGUgeGksIHlpLCB4aV8xLCB5aV8xLCB4MCwgeTAsIGR4eSwgc2ssIHNrMSwgdDsKKyAgICBkb3VibGUgeF9zLCB5X3MsIG54LCBueSwgZHgsIGR5LCBkdSwgZHY7CisgICAgZG91YmxlIGVwcyA9IDEuZS01OworICAgIGRvdWJsZSAqcF9hcmUxLCAqcF9hcmUyLCAqcF9hcmU7CisKKyAgICBhc3NlcnQoIGNvbnRvdXIgIT0gTlVMTCApOworCisgICAgaWYoIGNvbnRvdXIgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlHT04oIGNvbnRvdXIgKSkKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworCisgICAgbHB0ID0gY3ZTbGljZUxlbmd0aCggc2xpY2UsIGNvbnRvdXIgKTsKKyAgICAvKmlmKCBuMiA+PSBuMSApCisgICAgICAgIGxwdCA9IG4yIC0gbjEgKyAxOworICAgIGVsc2UKKyAgICAgICAgbHB0ID0gY29udG91ci0+dG90YWwgLSBuMSArIG4yICsgMTsqLworCisgICAgaWYoIGNvbnRvdXItPnRvdGFsICYmIGxwdCA+IDIgKQorICAgIHsKKyAgICAgICAgYTAwID0geDAgPSB5MCA9IHhpXzEgPSB5aV8xID0gMDsKKyAgICAgICAgc2sxID0gMDsKKyAgICAgICAgZmxhZyA9IDA7CisgICAgICAgIGR4eSA9IDA7CisgICAgICAgIHBfYXJlMSA9IChkb3VibGUgKikgY3ZBbGxvYyggcF9tYXggKiBzaXplb2YoIGRvdWJsZSApKTsKKworICAgICAgICBpZiggcF9hcmUxID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKworICAgICAgICBwX2FyZSA9IHBfYXJlMTsKKyAgICAgICAgcF9hcmUyID0gTlVMTDsKKworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggY29udG91ciwgJnJlYWRlciwgMCApOworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHRfcywgcmVhZGVyICk7CisgICAgICAgIHBfaW5kID0gMDsKKyAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHNsaWNlLmVuZF9pbmRleCApOworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdF9lLCByZWFkZXIgKTsKKworLyogICAgbm9ybWFsIGNvZWZmaWNpZW50cyAgICAqLworICAgICAgICBueCA9IHB0X3MueSAtIHB0X2UueTsKKyAgICAgICAgbnkgPSBwdF9lLnggLSBwdF9zLng7CisgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyLCBzbGljZS5zdGFydF9pbmRleCApOworCisgICAgICAgIHdoaWxlKCBscHQtLSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisKKyAgICAgICAgICAgIGlmKCBmbGFnID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhpXzEgPSAoZG91YmxlKSBwdC54OworICAgICAgICAgICAgICAgIHlpXzEgPSAoZG91YmxlKSBwdC55OworICAgICAgICAgICAgICAgIHgwID0geGlfMTsKKyAgICAgICAgICAgICAgICB5MCA9IHlpXzE7CisgICAgICAgICAgICAgICAgc2sxID0gMDsKKyAgICAgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4aSA9IChkb3VibGUpIHB0Lng7CisgICAgICAgICAgICAgICAgeWkgPSAoZG91YmxlKSBwdC55OworCisvKioqKioqKioqKioqKioqKiAgIGVkZ2VzIGludGVyc2VjdGlvbiBleGFtaW5hdGlvbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHNrID0gbnggKiAoeGkgLSBwdF9zLngpICsgbnkgKiAoeWkgLSBwdF9zLnkpOworICAgICAgICAgICAgICAgIGlmKCAoZmFicyggc2sgKSA8IGVwcyAmJiBscHQgPiAwKSB8fCBzayAqIHNrMSA8IC1lcHMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMoIHNrICkgPCBlcHMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkeHkgPSB4aV8xICogeWkgLSB4aSAqIHlpXzE7CisgICAgICAgICAgICAgICAgICAgICAgICBhMDAgPSBhMDAgKyBkeHk7CisgICAgICAgICAgICAgICAgICAgICAgICBkeHkgPSB4aSAqIHkwIC0geDAgKiB5aTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGEwMCA9IGEwMCArIGR4eTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBfaW5kID49IHBfbWF4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZNZW1Db3B5KCAmcF9hcmUxLCAmcF9hcmUyLCAmcF9hcmUsICZwX21heCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBwX2FyZVtwX2luZF0gPSBhMDAgLyAyLjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBfaW5kKys7CisgICAgICAgICAgICAgICAgICAgICAgICBhMDAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2sxID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgwID0geGk7CisgICAgICAgICAgICAgICAgICAgICAgICB5MCA9IHlpOworICAgICAgICAgICAgICAgICAgICAgICAgZHh5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKy8qICBkZWZpbmUgaW50ZXJzZWN0aW9uIHBvaW50ICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICBkdiA9IHlpIC0geWlfMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1ID0geGkgLSB4aV8xOworICAgICAgICAgICAgICAgICAgICAgICAgZHggPSBueTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5ID0gLW54OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMoIGR1ICkgPiBlcHMgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoKHlpXzEgLSBwdF9zLnkpICogZHUgKyBkdiAqIChwdF9zLnggLSB4aV8xKSkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHUgKiBkeSAtIGR4ICogZHYpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoeGlfMSAtIHB0X3MueCkgLyBkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0ID4gZXBzICYmIHQgPCAxIC0gZXBzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3MgPSBwdF9zLnggKyB0ICogZHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zID0gcHRfcy55ICsgdCAqIGR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR4eSA9IHhpXzEgKiB5X3MgLSB4X3MgKiB5aV8xOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEwMCArPSBkeHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHh5ID0geF9zICogeTAgLSB4MCAqIHlfczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMDAgKz0gZHh5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwX2luZCA+PSBwX21heCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdk1lbUNvcHkoICZwX2FyZTEsICZwX2FyZTIsICZwX2FyZSwgJnBfbWF4ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2FyZVtwX2luZF0gPSBhMDAgLyAyLjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2luZCsrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTAwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzazEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgwID0geF9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkwID0geV9zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR4eSA9IHhfcyAqIHlpIC0geGkgKiB5X3M7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkeHkgPSB4aV8xICogeWkgLSB4aSAqIHlpXzE7CisKKyAgICAgICAgICAgICAgICBhMDAgKz0gZHh5OworICAgICAgICAgICAgICAgIHhpXzEgPSB4aTsKKyAgICAgICAgICAgICAgICB5aV8xID0geWk7CisgICAgICAgICAgICAgICAgc2sxID0gc2s7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHhpID0geDA7CisgICAgICAgIHlpID0geTA7CisgICAgICAgIGR4eSA9IHhpXzEgKiB5aSAtIHhpICogeWlfMTsKKworICAgICAgICBhMDAgKz0gZHh5OworCisgICAgICAgIGlmKCBwX2luZCA+PSBwX21heCApCisgICAgICAgICAgICBpY3ZNZW1Db3B5KCAmcF9hcmUxLCAmcF9hcmUyLCAmcF9hcmUsICZwX21heCApOworCisgICAgICAgIHBfYXJlW3BfaW5kXSA9IGEwMCAvIDIuOworICAgICAgICBwX2luZCsrOworCisvKiAgICAgY29tbW9uIGFyZWEgY2FsY3VsYXRpb24gICAgKi8KKyAgICAgICAgKmFyZWEgPSAwOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcF9pbmQ7IGkrKyApCisgICAgICAgICAgICAoKmFyZWEpICs9IGZhYnMoIHBfYXJlW2ldICk7CisKKyAgICAgICAgaWYoIHBfYXJlMSAhPSBOVUxMICkKKyAgICAgICAgICAgIGN2RnJlZSggJnBfYXJlMSApOworICAgICAgICBlbHNlIGlmKCBwX2FyZTIgIT0gTlVMTCApCisgICAgICAgICAgICBjdkZyZWUoICZwX2FyZTIgKTsKKworICAgICAgICByZXR1cm4gQ1ZfT0s7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworfQorCisKKy8qIGV4dGVybmFsIGNvbnRvdXIgYXJlYSBmdW5jdGlvbiAqLworQ1ZfSU1QTCBkb3VibGUKK2N2Q29udG91ckFyZWEoIGNvbnN0IHZvaWQgKmFycmF5LCBDdlNsaWNlIHNsaWNlICkKK3sKKyAgICBkb3VibGUgYXJlYSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q29udG91ckFyZWEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXEqIGNvbnRvdXIgPSAwOworICAgIEN2U2VxQmxvY2sgYmxvY2s7CisKKyAgICBpZiggQ1ZfSVNfU0VRKCBhcnJheSApKQorICAgIHsKKyAgICAgICAgY29udG91ciA9IChDdlNlcSopYXJyYXk7CisgICAgICAgIGlmKCAhQ1ZfSVNfU0VRX1BPTFlMSU5FKCBjb250b3VyICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5zdXBwb3J0ZWQgc2VxdWVuY2UgdHlwZSIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY29udG91ciA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfQ1VSVkUsIGFycmF5LCAmY29udG91cl9oZWFkZXIsICZibG9jayApKTsKKyAgICB9CisKKyAgICBpZiggY3ZTbGljZUxlbmd0aCggc2xpY2UsIGNvbnRvdXIgKSA9PSBjb250b3VyLT50b3RhbCApCisgICAgeworICAgICAgICBJUFBJX0NBTEwoIGljdkNvbnRvdXJBcmVhKCBjb250b3VyLCAmYXJlYSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIENWX1NFUV9FTFRZUEUoIGNvbnRvdXIgKSAhPSBDVl8zMlNDMiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAiT25seSBjdXJ2ZXMgd2l0aCBpbnRlZ2VyIGNvb3JkaW5hdGVzIGFyZSBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb250b3VyIHNsaWNlIiApOworICAgICAgICBJUFBJX0NBTEwoIGljdkNvbnRvdXJTZWNBcmVhKCBjb250b3VyLCBzbGljZSwgJmFyZWEgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBhcmVhOworfQorCisKKy8qIGZvciBub3cgdGhpcyBmdW5jdGlvbiB3b3JrcyBiYWQgd2l0aCBzaW5ndWxhciBjYXNlcworICAgWW91IGNhbiBzZWUgaW4gdGhlIGNvZGUsIHRoYXQgd2hlbiBzb21lIHRyb3VibGVzIHdpdGgKKyAgIG1hdHJpY2VzIG9yIHNvbWUgdmFyaWFibGVzIG9jY3VyIC0KKyAgIGJveCBmaWxsZWQgd2l0aCB6ZXJvIHZhbHVlcyBpcyByZXR1cm5lZC4KKyAgIEhvd2V2ZXIgaW4gZ2VuZXJhbCBmdW5jdGlvbiB3b3JrcyBmaW5lLgorKi8KK3N0YXRpYyB2b2lkCitpY3ZGaXRFbGxpcHNlX0YoIEN2U2VxKiBwb2ludHMsIEN2Qm94MkQqIGJveCApCit7CisgICAgQ3ZNYXQqIEQgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2Rml0RWxsaXBzZV9GIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIFNbMzZdLCBDWzM2XSwgVFszNl07CisKKyAgICBpbnQgaSwgajsKKyAgICBkb3VibGUgZWlnZW52YWx1ZXNbNl0sIGVpZ2VudmVjdG9yc1szNl07CisgICAgZG91YmxlIGEsIGIsIGMsIGQsIGUsIGY7CisgICAgZG91YmxlIHgwLCB5MCwgaWRldCwgc2NhbGUsIG9mZnggPSAwLCBvZmZ5ID0gMDsKKworICAgIGludCBuID0gcG9pbnRzLT50b3RhbDsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgaW50IGlzX2Zsb2F0ID0gQ1ZfU0VRX0VMVFlQRShwb2ludHMpID09IENWXzMyRkMyOworCisgICAgQ3ZNYXQgX1MgPSBjdk1hdCg2LDYsQ1ZfNjRGLFMpLCBfQyA9IGN2TWF0KDYsNixDVl82NEYsQyksIF9UID0gY3ZNYXQoNiw2LENWXzY0RixUKTsKKyAgICBDdk1hdCBfRUlHVkVDUyA9IGN2TWF0KDYsNixDVl82NEYsZWlnZW52ZWN0b3JzKSwgX0VJR1ZBTFMgPSBjdk1hdCg2LDEsQ1ZfNjRGLGVpZ2VudmFsdWVzKTsKKworICAgIC8qIGNyZWF0ZSBtYXRyaXggRCBvZiAgaW5wdXQgcG9pbnRzICovCisgICAgQ1ZfQ0FMTCggRCA9IGN2Q3JlYXRlTWF0KCBuLCA2LCBDVl82NEYgKSk7CisgICAgCisgICAgY3ZTdGFydFJlYWRTZXEoIHBvaW50cywgJnJlYWRlciApOworCisgICAgLyogc2hpZnQgYWxsIHBvaW50cyB0byB6ZXJvICovCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpZiggIWlzX2Zsb2F0ICkKKyAgICAgICAgeworICAgICAgICAgICAgb2ZmeCArPSAoKEN2UG9pbnQqKXJlYWRlci5wdHIpLT54OworICAgICAgICAgICAgb2ZmeSArPSAoKEN2UG9pbnQqKXJlYWRlci5wdHIpLT55OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgb2ZmeCArPSAoKEN2UG9pbnQyRDMyZiopcmVhZGVyLnB0ciktPng7CisgICAgICAgICAgICBvZmZ5ICs9ICgoQ3ZQb2ludDJEMzJmKilyZWFkZXIucHRyKS0+eTsKKyAgICAgICAgfQorICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBwb2ludHMtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgb2ZmeCAvPSBuOworICAgIG9mZnkgLz0gbjsKKworICAgIC8vIGZpbGwgbWF0cml4IHJvd3MgYXMgKHgqeCwgeCp5LCB5KnksIHgsIHksIDEgKQorICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHgsIHk7CisgICAgICAgIGRvdWJsZSogRHB0ciA9IEQtPmRhdGEuZGIgKyBpKjY7CisgICAgICAgIAorICAgICAgICBpZiggIWlzX2Zsb2F0ICkKKyAgICAgICAgeworICAgICAgICAgICAgeCA9ICgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPnggLSBvZmZ4OworICAgICAgICAgICAgeSA9ICgoQ3ZQb2ludCopcmVhZGVyLnB0ciktPnkgLSBvZmZ5OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeCA9ICgoQ3ZQb2ludDJEMzJmKilyZWFkZXIucHRyKS0+eCAtIG9mZng7CisgICAgICAgICAgICB5ID0gKChDdlBvaW50MkQzMmYqKXJlYWRlci5wdHIpLT55IC0gb2ZmeTsKKyAgICAgICAgfQorICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBwb2ludHMtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgICAgIAorICAgICAgICBEcHRyWzBdID0geCAqIHg7CisgICAgICAgIERwdHJbMV0gPSB4ICogeTsKKyAgICAgICAgRHB0clsyXSA9IHkgKiB5OworICAgICAgICBEcHRyWzNdID0geDsKKyAgICAgICAgRHB0cls0XSA9IHk7CisgICAgICAgIERwdHJbNV0gPSAxLjsKKyAgICB9CisKKyAgICAvLyBTID0gRF50KkQKKyAgICBjdk11bFRyYW5zcG9zZWQoIEQsICZfUywgMSApOworICAgIGN2U1ZEKCAmX1MsICZfRUlHVkFMUywgJl9FSUdWRUNTLCAwLCBDVl9TVkRfTU9ESUZZX0EgKyBDVl9TVkRfVV9UICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBhID0gZWlnZW52YWx1ZXNbaV07CisgICAgICAgIGEgPSBhIDwgREJMX0VQU0lMT04gPyAwIDogMS4vc3FydChzcXJ0KGEpKTsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IDY7IGorKyApCisgICAgICAgICAgICBlaWdlbnZlY3RvcnNbaSo2ICsgal0gKj0gYTsKKyAgICB9CisKKyAgICAvLyBDID0gUV4tMSA9IHRyYW5zcChJTlZFSUdWKSAqIElOVkVJR1YKKyAgICBjdk11bFRyYW5zcG9zZWQoICZfRUlHVkVDUywgJl9DLCAxICk7CisgICAgCisgICAgY3ZaZXJvKCAmX1MgKTsKKyAgICBTWzJdID0gMi47CisgICAgU1s3XSA9IC0xLjsKKyAgICBTWzEyXSA9IDIuOworCisgICAgLy8gUyA9IFFeLTEqUypRXi0xCisgICAgY3ZNYXRNdWwoICZfQywgJl9TLCAmX1QgKTsKKyAgICBjdk1hdE11bCggJl9ULCAmX0MsICZfUyApOworCisgICAgLy8gYW5kIGZpbmQgaXRzIGVpZ2VudmFsdWVzIGFuZCB2ZWN0b3JzIHRvbworICAgIC8vY3ZTVkQoICZfUywgJl9FSUdWQUxTLCAmX0VJR1ZFQ1MsIDAsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9VX1QgKTsKKyAgICBjdkVpZ2VuVlYoICZfUywgJl9FSUdWRUNTLCAmX0VJR1ZBTFMsIDAgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgICAgICBpZiggZWlnZW52YWx1ZXNbaV0gPiAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgaWYoIGkgPj0gMyAvKmVpZ2VudmFsdWVzWzBdIDwgREJMX0VQU0lMT04qLyApCisgICAgeworICAgICAgICBib3gtPmNlbnRlci54ID0gYm94LT5jZW50ZXIueSA9IAorICAgICAgICBib3gtPnNpemUud2lkdGggPSBib3gtPnNpemUuaGVpZ2h0ID0gCisgICAgICAgIGJveC0+YW5nbGUgPSAwLmY7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgLy8gbm93IGZpbmQgdHJ1dGhmdWwgZWlnZW52ZWN0b3IKKyAgICBfRUlHVkVDUyA9IGN2TWF0KCA2LCAxLCBDVl82NEYsIGVpZ2VudmVjdG9ycyArIDYqaSApOworICAgIF9UID0gY3ZNYXQoIDYsIDEsIENWXzY0RiwgVCApOworICAgIC8vIFFeLTEqZWlnZW52ZWNzWzBdCisgICAgY3ZNYXRNdWwoICZfQywgJl9FSUdWRUNTLCAmX1QgKTsKKyAgICAKKyAgICAvLyBleHRyYWN0IHZlY3RvciBjb21wb25lbnRzCisgICAgYSA9IFRbMF07IGIgPSBUWzFdOyBjID0gVFsyXTsgZCA9IFRbM107IGUgPSBUWzRdOyBmID0gVFs1XTsKKyAgICAKKyAgICAvLy8vLy8vLy8vLy8vLy8vLyBleHRyYWN0IGVsbGlwc2UgYXhlcyBmcm9tIGFib3ZlIHZhbHVlcyAvLy8vLy8vLy8vLy8vLy8vCisKKyAgICAvKiAKKyAgICAgICAxKSBmaW5kIGNlbnRlciBvZiBlbGxpcHNlIAorICAgICAgIGl0IHNhdGlzZnkgZXF1YXRpb24gIAorICAgICAgIHwgYSAgICAgYi8yIHwgKiAgfCB4MCB8ICsgIHwgZC8yIHwgPSB8MCB8CisgICAgICAgfCBiLzIgICAgYyAgfCAgICB8IHkwIHwgICAgfCBlLzIgfCAgIHwwIHwKKworICAgICAqLworICAgIGlkZXQgPSBhICogYyAtIGIgKiBiICogMC4yNTsKKyAgICBpZGV0ID0gaWRldCA+IERCTF9FUFNJTE9OID8gMS4vaWRldCA6IDA7CisKKyAgICAvLyB3ZSBtdXN0IG5vcm1hbGl6ZSAoYSBiIGMgZCBlIGYgKSB0byBmaXQgKDRhYy1iXjI9MSkKKyAgICBzY2FsZSA9IHNxcnQoIDAuMjUgKiBpZGV0ICk7CisKKyAgICBpZiggc2NhbGUgPCBEQkxfRVBTSUxPTiApIAorICAgIHsKKyAgICAgICAgYm94LT5jZW50ZXIueCA9IChmbG9hdClvZmZ4OworICAgICAgICBib3gtPmNlbnRlci55ID0gKGZsb2F0KW9mZnk7CisgICAgICAgIGJveC0+c2l6ZS53aWR0aCA9IGJveC0+c2l6ZS5oZWlnaHQgPSBib3gtPmFuZ2xlID0gMC5mOworICAgICAgICBFWElUOworICAgIH0KKyAgICAgICAKKyAgICBhICo9IHNjYWxlOworICAgIGIgKj0gc2NhbGU7CisgICAgYyAqPSBzY2FsZTsKKyAgICBkICo9IHNjYWxlOworICAgIGUgKj0gc2NhbGU7CisgICAgZiAqPSBzY2FsZTsKKworICAgIHgwID0gKC1kICogYyArIGUgKiBiICogMC41KSAqIDIuOworICAgIHkwID0gKC1hICogZSArIGQgKiBiICogMC41KSAqIDIuOworCisgICAgLy8gcmVjb3ZlciBjZW50ZXIKKyAgICBib3gtPmNlbnRlci54ID0gKGZsb2F0KSh4MCArIG9mZngpOworICAgIGJveC0+Y2VudGVyLnkgPSAoZmxvYXQpKHkwICsgb2ZmeSk7CisKKyAgICAvLyBvZmZzZXQgZWxsaXBzZSB0byAoeDAseTApCisgICAgLy8gbmV3IGYgPT0gRih4MCx5MCkKKyAgICBmICs9IGEgKiB4MCAqIHgwICsgYiAqIHgwICogeTAgKyBjICogeTAgKiB5MCArIGQgKiB4MCArIGUgKiB5MDsKKworICAgIGlmKCBmYWJzKGYpIDwgREJMX0VQU0lMT04gKSAKKyAgICB7CisgICAgICAgIGJveC0+c2l6ZS53aWR0aCA9IGJveC0+c2l6ZS5oZWlnaHQgPSBib3gtPmFuZ2xlID0gMC5mOworICAgICAgICBFWElUOworICAgIH0KKworICAgIHNjYWxlID0gLTEuIC8gZjsKKyAgICAvLyBub3JtYWxpemUgdG8gZiA9IDEKKyAgICBhICo9IHNjYWxlOworICAgIGIgKj0gc2NhbGU7CisgICAgYyAqPSBzY2FsZTsKKworICAgIC8vIGV4dHJhY3QgYXhpcyBvZiBlbGxpcHNlCisgICAgLy8gb25lIG1vcmUgZWlnZW52YWx1ZSBvcGVyYXRpb24KKyAgICBTWzBdID0gYTsKKyAgICBTWzFdID0gU1syXSA9IGIgKiAwLjU7CisgICAgU1szXSA9IGM7CisKKyAgICBfUyA9IGN2TWF0KCAyLCAyLCBDVl82NEYsIFMgKTsKKyAgICBfRUlHVkVDUyA9IGN2TWF0KCAyLCAyLCBDVl82NEYsIGVpZ2VudmVjdG9ycyApOworICAgIF9FSUdWQUxTID0gY3ZNYXQoIDEsIDIsIENWXzY0RiwgZWlnZW52YWx1ZXMgKTsKKyAgICBjdlNWRCggJl9TLCAmX0VJR1ZBTFMsICZfRUlHVkVDUywgMCwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1VfVCApOworCisgICAgLy8gZXh0ZXJhY3QgYXhpcyBsZW5ndGggZnJvbSBlaWdlbnZlY3RvcnMKKyAgICBib3gtPnNpemUud2lkdGggPSAoZmxvYXQpKDIuL3NxcnQoZWlnZW52YWx1ZXNbMF0pKTsKKyAgICBib3gtPnNpemUuaGVpZ2h0ID0gKGZsb2F0KSgyLi9zcXJ0KGVpZ2VudmFsdWVzWzFdKSk7CisKKyAgICAvLyBjYWxjIGFuZ2xlCisgICAgYm94LT5hbmdsZSA9IChmbG9hdCkoMTgwIC0gYXRhbjIoZWlnZW52ZWN0b3JzWzJdLCBlaWdlbnZlY3RvcnNbM10pKjE4MC9DVl9QSSk7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmRCApOworfQorCisKK0NWX0lNUEwgQ3ZCb3gyRAorY3ZGaXRFbGxpcHNlMiggY29uc3QgQ3ZBcnIqIGFycmF5ICkKK3sKKyAgICBDdkJveDJEIGJveDsKKyAgICBkb3VibGUqIEFkID0gMCwgKmJkID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZGaXRFbGxpcHNlMiIgKTsKKworICAgIG1lbXNldCggJmJveCwgMCwgc2l6ZW9mKGJveCkpOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZDb250b3VyIGNvbnRvdXJfaGVhZGVyOworICAgIEN2U2VxKiBwdHNlcSA9IDA7CisgICAgQ3ZTZXFCbG9jayBibG9jazsKKyAgICBpbnQgbjsKKworICAgIGlmKCBDVl9JU19TRVEoIGFycmF5ICkpCisgICAgeworICAgICAgICBwdHNlcSA9IChDdlNlcSopYXJyYXk7CisgICAgICAgIGlmKCAhQ1ZfSVNfU0VRX1BPSU5UX1NFVCggcHRzZXEgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbnN1cHBvcnRlZCBzZXF1ZW5jZSB0eXBlIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9DQUxMKCBwdHNlcSA9IGN2UG9pbnRTZXFGcm9tTWF0KAorICAgICAgICAgICAgQ1ZfU0VRX0tJTkRfR0VORVJJQywgYXJyYXksICZjb250b3VyX2hlYWRlciwgJmJsb2NrICkpOworICAgIH0KKworICAgIG4gPSBwdHNlcS0+dG90YWw7CisgICAgaWYoIG4gPCA1ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJOdW1iZXIgb2YgcG9pbnRzIHNob3VsZCBiZSA+PSA2IiApOworI2lmIDEKKyAgICBpY3ZGaXRFbGxpcHNlX0YoIHB0c2VxLCAmYm94ICk7CisjZWxzZQorICAgIC8qCisgICAgICoJTmV3IGZpdGVsbGlwc2UgYWxnb3JpdGhtLCBjb250cmlidXRlZCBieSBEci4gRGFuaWVsIFdlaXNzCisgICAgICovCisgICAgeworICAgIGRvdWJsZSBnZnBbNV0sIHJwWzVdLCB0OworICAgIEN2TWF0IEEsIGIsIHg7CisgICAgY29uc3QgZG91YmxlIG1pbl9lcHMgPSAxZS02OworICAgIGludCBpLCBpc19mbG9hdDsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisKKyAgICBDVl9DQUxMKCBBZCA9IChkb3VibGUqKWN2QWxsb2MoIG4qNSpzaXplb2YoQWRbMF0pICkpOworICAgIENWX0NBTEwoIGJkID0gKGRvdWJsZSopY3ZBbGxvYyggbipzaXplb2YoYmRbMF0pICkpOworCisgICAgLy8gZmlyc3QgZml0IGZvciBwYXJhbWV0ZXJzIEEgLSBFCisgICAgQSA9IGN2TWF0KCBuLCA1LCBDVl82NEYsIEFkICk7CisgICAgYiA9IGN2TWF0KCBuLCAxLCBDVl82NEYsIGJkICk7CisgICAgeCA9IGN2TWF0KCA1LCAxLCBDVl82NEYsIGdmcCApOworCisgICAgY3ZTdGFydFJlYWRTZXEoIHB0c2VxLCAmcmVhZGVyICk7CisgICAgaXNfZmxvYXQgPSBDVl9TRVFfRUxUWVBFKHB0c2VxKSA9PSBDVl8zMkZDMjsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHA7CisgICAgICAgIGlmKCBpc19mbG9hdCApCisgICAgICAgICAgICBwID0gKihDdlBvaW50MkQzMmYqKShyZWFkZXIucHRyKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwLnggPSAoZmxvYXQpKChpbnQqKXJlYWRlci5wdHIpWzBdOworICAgICAgICAgICAgcC55ID0gKGZsb2F0KSgoaW50KilyZWFkZXIucHRyKVsxXTsKKyAgICAgICAgfQorICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YocCksIHJlYWRlciApOworCisgICAgICAgIGJkW2ldID0gMTAwMDAuMDsgLy8gMS4wPworICAgICAgICBBZFtpKjVdID0gLShkb3VibGUpcC54ICogcC54OyAvLyBBIC0gQyBzaWducyBpbnZlcnRlZCBhcyBwcm9wb3NlZCBieSBBUFAKKyAgICAgICAgQWRbaSo1ICsgMV0gPSAtKGRvdWJsZSlwLnkgKiBwLnk7CisgICAgICAgIEFkW2kqNSArIDJdID0gLShkb3VibGUpcC54ICogcC55OworICAgICAgICBBZFtpKjUgKyAzXSA9IHAueDsKKyAgICAgICAgQWRbaSo1ICsgNF0gPSBwLnk7CisgICAgfQorICAgIAorICAgIGN2U29sdmUoICZBLCAmYiwgJngsIENWX1NWRCApOworCisgICAgLy8gbm93IHVzZSBnZW5lcmFsLWZvcm0gcGFyYW1ldGVycyBBIC0gRSB0byBmaW5kIHRoZSBlbGxpcHNlIGNlbnRlcjoKKyAgICAvLyBkaWZmZXJlbnRpYXRlIGdlbmVyYWwgZm9ybSB3cnQgeC95IHRvIGdldCB0d28gZXF1YXRpb25zIGZvciBjeCBhbmQgY3kKKyAgICBBID0gY3ZNYXQoIDIsIDIsIENWXzY0RiwgQWQgKTsKKyAgICBiID0gY3ZNYXQoIDIsIDEsIENWXzY0RiwgYmQgKTsKKyAgICB4ID0gY3ZNYXQoIDIsIDEsIENWXzY0RiwgcnAgKTsKKyAgICBBZFswXSA9IDIgKiBnZnBbMF07CisgICAgQWRbMV0gPSBBZFsyXSA9IGdmcFsyXTsKKyAgICBBZFszXSA9IDIgKiBnZnBbMV07CisgICAgYmRbMF0gPSBnZnBbM107CisgICAgYmRbMV0gPSBnZnBbNF07CisgICAgY3ZTb2x2ZSggJkEsICZiLCAmeCwgQ1ZfU1ZEICk7CisKKyAgICAvLyByZS1maXQgZm9yIHBhcmFtZXRlcnMgQSAtIEMgd2l0aCB0aG9zZSBjZW50ZXIgY29vcmRpbmF0ZXMKKyAgICBBID0gY3ZNYXQoIG4sIDMsIENWXzY0RiwgQWQgKTsKKyAgICBiID0gY3ZNYXQoIG4sIDEsIENWXzY0RiwgYmQgKTsKKyAgICB4ID0gY3ZNYXQoIDMsIDEsIENWXzY0RiwgZ2ZwICk7CisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBDdlBvaW50MkQzMmYgcDsKKyAgICAgICAgaWYoIGlzX2Zsb2F0ICkKKyAgICAgICAgICAgIHAgPSAqKEN2UG9pbnQyRDMyZiopKHJlYWRlci5wdHIpOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHAueCA9IChmbG9hdCkoKGludCopcmVhZGVyLnB0cilbMF07CisgICAgICAgICAgICBwLnkgPSAoZmxvYXQpKChpbnQqKXJlYWRlci5wdHIpWzFdOworICAgICAgICB9CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihwKSwgcmVhZGVyICk7CisgICAgICAgIGJkW2ldID0gMS4wOworICAgICAgICBBZFtpICogM10gPSAocC54IC0gcnBbMF0pICogKHAueCAtIHJwWzBdKTsKKyAgICAgICAgQWRbaSAqIDMgKyAxXSA9IChwLnkgLSBycFsxXSkgKiAocC55IC0gcnBbMV0pOworICAgICAgICBBZFtpICogMyArIDJdID0gKHAueCAtIHJwWzBdKSAqIChwLnkgLSBycFsxXSk7CisgICAgfQorICAgIGN2U29sdmUoJkEsICZiLCAmeCwgQ1ZfU1ZEKTsKKworICAgIC8vIHN0b3JlIGFuZ2xlIGFuZCByYWRpaQorICAgIHJwWzRdID0gLTAuNSAqIGF0YW4yKGdmcFsyXSwgZ2ZwWzFdIC0gZ2ZwWzBdKTsgLy8gY29udmVydCBmcm9tIEFQUCBhbmdsZSB1c2FnZQorICAgIHQgPSBzaW4oLTIuMCAqIHJwWzRdKTsKKyAgICBpZiggZmFicyh0KSA+IGZhYnMoZ2ZwWzJdKSptaW5fZXBzICkKKyAgICAgICAgdCA9IGdmcFsyXS90OworICAgIGVsc2UKKyAgICAgICAgdCA9IGdmcFsxXSAtIGdmcFswXTsKKyAgICBycFsyXSA9IGZhYnMoZ2ZwWzBdICsgZ2ZwWzFdIC0gdCk7CisgICAgaWYoIHJwWzJdID4gbWluX2VwcyApCisgICAgICAgIHJwWzJdID0gc3FydCgyLjAgLyBycFsyXSk7CisgICAgcnBbM10gPSBmYWJzKGdmcFswXSArIGdmcFsxXSArIHQpOworICAgIGlmKCBycFszXSA+IG1pbl9lcHMgKQorICAgICAgICBycFszXSA9IHNxcnQoMi4wIC8gcnBbM10pOworCisgICAgYm94LmNlbnRlci54ID0gKGZsb2F0KXJwWzBdOworICAgIGJveC5jZW50ZXIueSA9IChmbG9hdClycFsxXTsKKyAgICBib3guc2l6ZS53aWR0aCA9IChmbG9hdCkocnBbMl0qMik7CisgICAgYm94LnNpemUuaGVpZ2h0ID0gKGZsb2F0KShycFszXSoyKTsKKyAgICBpZiggYm94LnNpemUud2lkdGggPiBib3guc2l6ZS5oZWlnaHQgKQorICAgIHsKKyAgICAgICAgZmxvYXQgdG1wOworICAgICAgICBDVl9TV0FQKCBib3guc2l6ZS53aWR0aCwgYm94LnNpemUuaGVpZ2h0LCB0bXAgKTsKKyAgICAgICAgYm94LmFuZ2xlID0gKGZsb2F0KSg5MCArIHJwWzRdKjE4MC9DVl9QSSk7CisgICAgfQorICAgIGlmKCBib3guYW5nbGUgPCAtMTgwICkKKyAgICAgICAgYm94LmFuZ2xlICs9IDM2MDsKKyAgICBpZiggYm94LmFuZ2xlID4gMzYwICkKKyAgICAgICAgYm94LmFuZ2xlIC09IDM2MDsKKyAgICB9CisjZW5kaWYKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmQWQgKTsKKyAgICBjdkZyZWUoICZiZCApOworCisgICAgcmV0dXJuIGJveDsKK30KKworCisvKiBDYWxjdWxhdGVzIGJvdW5kaW5nIHJlY3RhZ25sZSBvZiBhIHBvaW50IHNldCBvciByZXRyaWV2ZXMgYWxyZWFkeSBjYWxjdWxhdGVkICovCitDVl9JTVBMICBDdlJlY3QKK2N2Qm91bmRpbmdSZWN0KCBDdkFyciogYXJyYXksIGludCB1cGRhdGUgKQoreworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdlJlY3QgIHJlY3QgPSB7IDAsIDAsIDAsIDAgfTsKKyAgICBDdkNvbnRvdXIgY29udG91cl9oZWFkZXI7CisgICAgQ3ZTZXEqIHB0c2VxID0gMDsKKyAgICBDdlNlcUJsb2NrIGJsb2NrOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkJvdW5kaW5nUmVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAwOworICAgIGludCAgeG1pbiA9IDAsIHltaW4gPSAwLCB4bWF4ID0gLTEsIHltYXggPSAtMSwgaSwgaiwgazsKKyAgICBpbnQgY2FsY3VsYXRlID0gdXBkYXRlOworCisgICAgaWYoIENWX0lTX1NFUSggYXJyYXkgKSkKKyAgICB7CisgICAgICAgIHB0c2VxID0gKEN2U2VxKilhcnJheTsKKyAgICAgICAgaWYoICFDVl9JU19TRVFfUE9JTlRfU0VUKCBwdHNlcSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVuc3VwcG9ydGVkIHNlcXVlbmNlIHR5cGUiICk7CisKKyAgICAgICAgaWYoIHB0c2VxLT5oZWFkZXJfc2l6ZSA8IChpbnQpc2l6ZW9mKEN2Q29udG91cikpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qaWYoIHVwZGF0ZSA9PSAxICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIGhlYWRlciBpcyB0b28gc21hbGwgdG8gZml0IHRoZSByZWN0YW5nbGUsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic28gaXQgY291bGQgbm90IGJlIHVwZGF0ZWQiICk7Ki8KKyAgICAgICAgICAgIHVwZGF0ZSA9IDA7CisgICAgICAgICAgICBjYWxjdWxhdGUgPSAxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBhcnJheSwgJnN0dWIgKSk7CisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShtYXQtPnR5cGUpID09IENWXzMyU0MyIHx8CisgICAgICAgICAgICBDVl9NQVRfVFlQRShtYXQtPnR5cGUpID09IENWXzMyRkMyICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggcHRzZXEgPSBjdlBvaW50U2VxRnJvbU1hdCgKKyAgICAgICAgICAgICAgICBDVl9TRVFfS0lORF9HRU5FUklDLCBtYXQsICZjb250b3VyX2hlYWRlciwgJmJsb2NrICkpOworICAgICAgICAgICAgbWF0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBDVl9NQVRfVFlQRShtYXQtPnR5cGUpICE9IENWXzhVQzEgJiYKKyAgICAgICAgICAgICAgICBDVl9NQVRfVFlQRShtYXQtPnR5cGUpICE9IENWXzhTQzEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICJUaGUgaW1hZ2UvbWF0cml4IGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBmdW5jdGlvbiIgKTsKKyAgICAgICAgdXBkYXRlID0gMDsKKyAgICAgICAgY2FsY3VsYXRlID0gMTsKKyAgICB9CisKKyAgICBpZiggIWNhbGN1bGF0ZSApCisgICAgeworICAgICAgICByZWN0ID0gKChDdkNvbnRvdXIqKXB0c2VxKS0+cmVjdDsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggbWF0ICkKKyAgICB7CisgICAgICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKG1hdCk7CisgICAgICAgIHhtaW4gPSBzaXplLndpZHRoOworICAgICAgICB5bWluID0gLTE7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICB1Y2hhciogX3B0ciA9IG1hdC0+ZGF0YS5wdHIgKyBpKm1hdC0+c3RlcDsKKyAgICAgICAgICAgIHVjaGFyKiBwdHIgPSAodWNoYXIqKWN2QWxpZ25QdHIoX3B0ciwgNCk7CisgICAgICAgICAgICBpbnQgaGF2ZV9ueiA9IDAsIGtfbWluLCBvZmZzZXQgPSAoaW50KShwdHIgLSBfcHRyKTsKKyAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgb2Zmc2V0ID0gTUlOKG9mZnNldCwgc2l6ZS53aWR0aCk7CisgICAgICAgICAgICBmb3IoIDsgaiA8IG9mZnNldDsgaisrICkKKyAgICAgICAgICAgICAgICBpZiggX3B0cltqXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBoYXZlX256ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGogPCBvZmZzZXQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBqIDwgeG1pbiApCisgICAgICAgICAgICAgICAgICAgIHhtaW4gPSBqOworICAgICAgICAgICAgICAgIGlmKCBqID4geG1heCApCisgICAgICAgICAgICAgICAgICAgIHhtYXggPSBqOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIG9mZnNldCA8IHNpemUud2lkdGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhtaW4gLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHhtYXggLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIHNpemUud2lkdGggLT0gb2Zmc2V0OworICAgICAgICAgICAgICAgIGogPSAwOworICAgICAgICAgICAgICAgIGZvciggOyBqIDw9IHhtaW4gLSA0OyBqICs9IDQgKQorICAgICAgICAgICAgICAgICAgICBpZiggKigoaW50KikocHRyK2opKSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBmb3IoIDsgaiA8IHhtaW47IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlmKCBwdHJbal0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB4bWluID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBqID4geG1heCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1heCA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICBoYXZlX256ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga19taW4gPSBNQVgoai0xLCB4bWF4KTsKKyAgICAgICAgICAgICAgICBrID0gc2l6ZS53aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgZm9yKCA7IGsgPiBrX21pbiAmJiAoayYzKSAhPSAzOyBrLS0gKQorICAgICAgICAgICAgICAgICAgICBpZiggcHRyW2tdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKCBrID4ga19taW4gJiYgKGsmMykgPT0gMyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIDsgayA+IGtfbWluKzM7IGsgLT0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKigoaW50KikocHRyK2stMykpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKCA7IGsgPiBrX21pbjsgay0tICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIHB0cltrXSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhtYXggPSBrOworICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZV9ueiA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCAhaGF2ZV9ueiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqICY9IH4zOworICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaiA8PSBrIC0gMzsgaiArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqKChpbnQqKShwdHIraikpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGogPD0gazsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwdHJbal0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmVfbnogPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWluICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICB4bWF4ICs9IG9mZnNldDsKKyAgICAgICAgICAgICAgICBzaXplLndpZHRoICs9IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBoYXZlX256ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggeW1pbiA8IDAgKQorICAgICAgICAgICAgICAgICAgICB5bWluID0gaTsKKyAgICAgICAgICAgICAgICB5bWF4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCB4bWluID49IHNpemUud2lkdGggKQorICAgICAgICAgICAgeG1pbiA9IHltaW4gPSAwOworICAgIH0KKyAgICBlbHNlIGlmKCBwdHNlcS0+dG90YWwgKQorICAgIHsgICAKKyAgICAgICAgaW50ICBpc19mbG9hdCA9IENWX1NFUV9FTFRZUEUocHRzZXEpID09IENWXzMyRkMyOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggcHRzZXEsICZyZWFkZXIsIDAgKTsKKworICAgICAgICBpZiggIWlzX2Zsb2F0ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludCBwdDsKKyAgICAgICAgICAgIC8qIGluaXQgdmFsdWVzICovCisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisgICAgICAgICAgICB4bWluID0geG1heCA9IHB0Lng7CisgICAgICAgICAgICB5bWluID0geW1heCA9IHB0Lnk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBwdHNlcS0+dG90YWw7IGkrKyApCisgICAgICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQsIHJlYWRlciApOworICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggeG1pbiA+IHB0LnggKQorICAgICAgICAgICAgICAgICAgICB4bWluID0gcHQueDsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIHhtYXggPCBwdC54ICkKKyAgICAgICAgICAgICAgICAgICAgeG1heCA9IHB0Lng7CisKKyAgICAgICAgICAgICAgICBpZiggeW1pbiA+IHB0LnkgKQorICAgICAgICAgICAgICAgICAgICB5bWluID0gcHQueTsKKworICAgICAgICAgICAgICAgIGlmKCB5bWF4IDwgcHQueSApCisgICAgICAgICAgICAgICAgICAgIHltYXggPSBwdC55OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludCBwdDsKKyAgICAgICAgICAgIEN2MzJzdWYgdjsKKyAgICAgICAgICAgIC8qIGluaXQgdmFsdWVzICovCisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdCwgcmVhZGVyICk7CisgICAgICAgICAgICB4bWluID0geG1heCA9IENWX1RPR0dMRV9GTFQocHQueCk7CisgICAgICAgICAgICB5bWluID0geW1heCA9IENWX1RPR0dMRV9GTFQocHQueSk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBwdHNlcS0+dG90YWw7IGkrKyApCisgICAgICAgICAgICB7ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQsIHJlYWRlciApOworICAgICAgICAgICAgICAgIHB0LnggPSBDVl9UT0dHTEVfRkxUKHB0LngpOworICAgICAgICAgICAgICAgIHB0LnkgPSBDVl9UT0dHTEVfRkxUKHB0LnkpOworICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggeG1pbiA+IHB0LnggKQorICAgICAgICAgICAgICAgICAgICB4bWluID0gcHQueDsKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIHhtYXggPCBwdC54ICkKKyAgICAgICAgICAgICAgICAgICAgeG1heCA9IHB0Lng7CisKKyAgICAgICAgICAgICAgICBpZiggeW1pbiA+IHB0LnkgKQorICAgICAgICAgICAgICAgICAgICB5bWluID0gcHQueTsKKworICAgICAgICAgICAgICAgIGlmKCB5bWF4IDwgcHQueSApCisgICAgICAgICAgICAgICAgICAgIHltYXggPSBwdC55OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2LmkgPSBDVl9UT0dHTEVfRkxUKHhtaW4pOyB4bWluID0gY3ZGbG9vcih2LmYpOworICAgICAgICAgICAgdi5pID0gQ1ZfVE9HR0xFX0ZMVCh5bWluKTsgeW1pbiA9IGN2Rmxvb3Iodi5mKTsKKyAgICAgICAgICAgIC8qIGJlY2F1c2UgcmlnaHQgYW5kIGJvdHRvbSBzaWRlcyBvZgorICAgICAgICAgICAgICAgdGhlIGJvdW5kaW5nIHJlY3RhbmdsZSBhcmUgbm90IGluY2x1c2l2ZQorICAgICAgICAgICAgICAgKG5vdGUgKzEgaW4gd2lkdGggYW5kIGhlaWdodCBjYWxjdWxhdGlvbiBiZWxvdyksCisgICAgICAgICAgICAgICBjdkZsb29yIGlzIHVzZWQgaGVyZSBpbnN0ZWFkIG9mIGN2Q2VpbCAqLworICAgICAgICAgICAgdi5pID0gQ1ZfVE9HR0xFX0ZMVCh4bWF4KTsgeG1heCA9IGN2Rmxvb3Iodi5mKTsKKyAgICAgICAgICAgIHYuaSA9IENWX1RPR0dMRV9GTFQoeW1heCk7IHltYXggPSBjdkZsb29yKHYuZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZWN0LnggPSB4bWluOworICAgIHJlY3QueSA9IHltaW47CisgICAgcmVjdC53aWR0aCA9IHhtYXggLSB4bWluICsgMTsKKyAgICByZWN0LmhlaWdodCA9IHltYXggLSB5bWluICsgMTsKKworICAgIGlmKCB1cGRhdGUgKQorICAgICAgICAoKEN2Q29udG91ciopcHRzZXEpLT5yZWN0ID0gcmVjdDsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVjdDsKK30KKworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnNtb290aC5jcHAgYi9jdi9zcmMvY3ZzbW9vdGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ZjhmZWEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZzbW9vdGguY3BwCkBAIC0wLDAgKzEsMTUzMCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworLyoKKyAqIFRoaXMgZmlsZSBpbmNsdWRlcyB0aGUgY29kZSwgY29udHJpYnV0ZWQgYnkgU2ltb24gUGVycmVhdWx0CisgKiAodGhlIGZ1bmN0aW9uIGljdk1lZGlhbkJsdXJfOHVfQ25SX08xKQorICoKKyAqIENvbnN0YW50LXRpbWUgbWVkaWFuIGZpbHRlcmluZyAtLSBodHRwOi8vbm9taXM4MC5vcmcvY3RtZi5odG1sCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2ltb24gUGVycmVhdWx0CisgKgorICogQ29udGFjdDoKKyAqICBMYWJvcmF0b2lyZSBkZSB2aXNpb24gZXQgc3lzdGVtZXMgbnVtZXJpcXVlcworICogIFBhdmlsbG9uIEFkcmllbi1Qb3VsaW90CisgKiAgVW5pdmVyc2l0ZSBMYXZhbAorICogIFNhaW50ZS1Gb3ksIFF1ZWJlYywgQ2FuYWRhCisgKiAgRzFLIDdQNAorICoKKyAqICBwZXJyZWF1bEBnZWwudWxhdmFsLmNhCisgKi8KKworLy8gdW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGZvcmNlIFNTRTIgbW9kZQorLy8jZGVmaW5lIENWX1NTRTIgMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm94IEZpbHRlcgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkIGljdlN1bVJvd184dTMycyggY29uc3QgdWNoYXIqIHNyYzAsIGludCogZHN0LCB2b2lkKiBwYXJhbXMgKTsKK3N0YXRpYyB2b2lkIGljdlN1bVJvd18zMmY2NGYoIGNvbnN0IGZsb2F0KiBzcmMwLCBkb3VibGUqIGRzdCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZTdW1Db2xfMzJzOHUoIGNvbnN0IGludCoqIHNyYywgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApOworc3RhdGljIHZvaWQgaWN2U3VtQ29sXzMyczE2cyggY29uc3QgaW50Kiogc3JjLCBzaG9ydCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZTdW1Db2xfMzJzMzJzKCBjb25zdCBpbnQqKiBzcmMsIGludCogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZTdW1Db2xfNjRmMzJmKCBjb25zdCBkb3VibGUqKiBzcmMsIGZsb2F0KiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogcGFyYW1zICk7CisKK0N2Qm94RmlsdGVyOjpDdkJveEZpbHRlcigpCit7CisgICAgbWluX2RlcHRoID0gQ1ZfMzJTOworICAgIHN1bSA9IDA7CisgICAgc3VtX2NvdW50ID0gMDsKKyAgICBub3JtYWxpemVkID0gZmFsc2U7Cit9CisKKworQ3ZCb3hGaWx0ZXI6OkN2Qm94RmlsdGVyKCBpbnQgX21heF93aWR0aCwgaW50IF9zcmNfdHlwZSwgaW50IF9kc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfbm9ybWFsaXplZCwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBfYW5jaG9yLCBpbnQgX2JvcmRlcl9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBfYm9yZGVyX3ZhbHVlICkKK3sKKyAgICBtaW5fZGVwdGggPSBDVl8zMlM7CisgICAgc3VtID0gMDsKKyAgICBzdW1fY291bnQgPSAwOworICAgIG5vcm1hbGl6ZWQgPSBmYWxzZTsKKyAgICBpbml0KCBfbWF4X3dpZHRoLCBfc3JjX3R5cGUsIF9kc3RfdHlwZSwgX25vcm1hbGl6ZWQsCisgICAgICAgICAgX2tzaXplLCBfYW5jaG9yLCBfYm9yZGVyX21vZGUsIF9ib3JkZXJfdmFsdWUgKTsKK30KKworCitDdkJveEZpbHRlcjo6fkN2Qm94RmlsdGVyKCkKK3sKKyAgICBjbGVhcigpOworfQorCisKK3ZvaWQgQ3ZCb3hGaWx0ZXI6OmluaXQoIGludCBfbWF4X3dpZHRoLCBpbnQgX3NyY190eXBlLCBpbnQgX2RzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBfbm9ybWFsaXplZCwgQ3ZTaXplIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgX2FuY2hvciwgaW50IF9ib3JkZXJfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIF9ib3JkZXJfdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb3hGaWx0ZXI6OmluaXQiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgc3VtID0gMDsKKyAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZWQ7CisKKyAgICBpZiggKG5vcm1hbGl6ZWQgJiYgQ1ZfTUFUX1RZUEUoX3NyY190eXBlKSAhPSBDVl9NQVRfVFlQRShfZHN0X3R5cGUpKSB8fAorICAgICAgICAoIW5vcm1hbGl6ZWQgJiYgQ1ZfTUFUX0NOKF9zcmNfdHlwZSkgIT0gQ1ZfTUFUX0NOKF9kc3RfdHlwZSkpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgIkluIGNhc2Ugb2Ygbm9ybWFsaXplZCBib3ggZmlsdGVyIGlucHV0IGFuZCBvdXRwdXQgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuXG4iCisgICAgICAgICJJbiBjYXNlIG9mIHVubm9ybWFsaXplZCBib3ggZmlsdGVyIHRoZSBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCBjaGFubmVscyBtdXN0IGJlIHRoZSBzYW1lIiApOworCisgICAgbWluX2RlcHRoID0gQ1ZfTUFUX0RFUFRIKF9zcmNfdHlwZSkgPT0gQ1ZfOFUgPyBDVl8zMlMgOiBDVl82NEY7CisKKyAgICBDdkJhc2VJbWFnZUZpbHRlcjo6aW5pdCggX21heF93aWR0aCwgX3NyY190eXBlLCBfZHN0X3R5cGUsIDEsIF9rc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2FuY2hvciwgX2JvcmRlcl9tb2RlLCBfYm9yZGVyX3ZhbHVlICk7CisgICAgCisgICAgc2NhbGUgPSBub3JtYWxpemVkID8gMS4vKGtzaXplLndpZHRoKmtzaXplLmhlaWdodCkgOiAxOworCisgICAgaWYoIENWX01BVF9ERVBUSChzcmNfdHlwZSkgPT0gQ1ZfOFUgKQorICAgICAgICB4X2Z1bmMgPSAoQ3ZSb3dGaWx0ZXJGdW5jKWljdlN1bVJvd184dTMyczsKKyAgICBlbHNlIGlmKCBDVl9NQVRfREVQVEgoc3JjX3R5cGUpID09IENWXzMyRiApCisgICAgICAgIHhfZnVuYyA9IChDdlJvd0ZpbHRlckZ1bmMpaWN2U3VtUm93XzMyZjY0ZjsKKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVua25vd24vdW5zdXBwb3J0ZWQgaW5wdXQgaW1hZ2UgZm9ybWF0IiApOworCisgICAgaWYoIENWX01BVF9ERVBUSChkc3RfdHlwZSkgPT0gQ1ZfOFUgKQorICAgIHsKKyAgICAgICAgaWYoICFub3JtYWxpemVkICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJPbmx5IG5vcm1hbGl6ZWQgYm94IGZpbHRlciBjYW4gYmUgdXNlZCBmb3IgOHUtPjh1IHRyYW5zZm9ybWF0aW9uIiApOworICAgICAgICB5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdlN1bUNvbF8zMnM4dTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA9PSBDVl8xNlMgKQorICAgIHsKKyAgICAgICAgaWYoIG5vcm1hbGl6ZWQgfHwgQ1ZfTUFUX0RFUFRIKHNyY190eXBlKSAhPSBDVl84VSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25seSA4dS0+MTZzIHVubm9ybWFsaXplZCBib3ggZmlsdGVyIGlzIHN1cHBvcnRlZCBpbiBjYXNlIG9mIDE2cyBvdXRwdXQiICk7CisgICAgICAgIHlfZnVuYyA9IChDdkNvbHVtbkZpbHRlckZ1bmMpaWN2U3VtQ29sXzMyczE2czsKKyAgICB9CisJZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKGRzdF90eXBlKSA9PSBDVl8zMlMgKQorCXsKKwkJaWYoIG5vcm1hbGl6ZWQgfHwgQ1ZfTUFUX0RFUFRIKHNyY190eXBlKSAhPSBDVl84VSApCisJCQlDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25seSA4dS0+MzJzIHVubm9ybWFsaXplZCBib3ggZmlsdGVyIGlzIHN1cHBvcnRlZCBpbiBjYXNlIG9mIDMycyBvdXRwdXQiKTsKKworCQl5X2Z1bmMgPSAoQ3ZDb2x1bW5GaWx0ZXJGdW5jKWljdlN1bUNvbF8zMnMzMnM7CisJfQorICAgIGVsc2UgaWYoIENWX01BVF9ERVBUSChkc3RfdHlwZSkgPT0gQ1ZfMzJGICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfREVQVEgoc3JjX3R5cGUpICE9IENWXzMyRiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiT25seSAzMmYtPjMyZiBib3ggZmlsdGVyIChub3JtYWxpemVkIG9yIG5vdCkgaXMgc3VwcG9ydGVkIGluIGNhc2Ugb2YgMzJmIG91dHB1dCIgKTsKKyAgICAgICAgeV9mdW5jID0gKEN2Q29sdW1uRmlsdGVyRnVuYylpY3ZTdW1Db2xfNjRmMzJmOworICAgIH0KKwllbHNleworCQlDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93bi91bnN1cHBvcnRlZCBkZXN0aW5hdGlvbiBpbWFnZSBmb3JtYXQiICk7CisJfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2Qm94RmlsdGVyOjpzdGFydF9wcm9jZXNzKCBDdlNsaWNlIHhfcmFuZ2UsIGludCB3aWR0aCApCit7CisgICAgQ3ZCYXNlSW1hZ2VGaWx0ZXI6OnN0YXJ0X3Byb2Nlc3MoIHhfcmFuZ2UsIHdpZHRoICk7CisgICAgaW50IGksIHBzeiA9IENWX0VMRU1fU0laRSh3b3JrX3R5cGUpOworICAgIHVjaGFyKiBzOworICAgIGJ1Zl9lbmQgLT0gYnVmX3N0ZXA7CisgICAgYnVmX21heF9jb3VudC0tOworICAgIGFzc2VydCggYnVmX21heF9jb3VudCA+PSBtYXhfa3kqMiArIDEgKTsKKyAgICBzID0gc3VtID0gYnVmX2VuZCArIGN2QWxpZ24oKHdpZHRoICsga3NpemUud2lkdGggLSAxKSpDVl9FTEVNX1NJWkUoc3JjX3R5cGUpLCBBTElHTik7CisgICAgc3VtX2NvdW50ID0gMDsKKworICAgIHdpZHRoICo9IHBzejsKKyAgICBmb3IoIGkgPSAwOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgIHNbaV0gPSAodWNoYXIpMDsKK30KKworCitzdGF0aWMgdm9pZAoraWN2U3VtUm93Xzh1MzJzKCBjb25zdCB1Y2hhciogc3JjLCBpbnQqIGRzdCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBjb25zdCBDdkJveEZpbHRlciogc3RhdGUgPSAoY29uc3QgQ3ZCb3hGaWx0ZXIqKXBhcmFtczsKKyAgICBpbnQga3NpemUgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkud2lkdGg7CisgICAgaW50IHdpZHRoID0gc3RhdGUtPmdldF93aWR0aCgpOworICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOworICAgIGludCBpLCBrOworCisgICAgd2lkdGggPSAod2lkdGggLSAxKSpjbjsga3NpemUgKj0gY247CisKKyAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKywgc3JjKyssIGRzdCsrICkKKyAgICB7CisgICAgICAgIGludCBzID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGtzaXplOyBpICs9IGNuICkKKyAgICAgICAgICAgIHMgKz0gc3JjW2ldOworICAgICAgICBkc3RbMF0gPSBzOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gY24gKQorICAgICAgICB7CisgICAgICAgICAgICBzICs9IHNyY1tpK2tzaXplXSAtIHNyY1tpXTsKKyAgICAgICAgICAgIGRzdFtpK2NuXSA9IHM7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlN1bVJvd18zMmY2NGYoIGNvbnN0IGZsb2F0KiBzcmMsIGRvdWJsZSogZHN0LCB2b2lkKiBwYXJhbXMgKQoreworICAgIGNvbnN0IEN2Qm94RmlsdGVyKiBzdGF0ZSA9IChjb25zdCBDdkJveEZpbHRlciopcGFyYW1zOworICAgIGludCBrc2l6ZSA9IHN0YXRlLT5nZXRfa2VybmVsX3NpemUoKS53aWR0aDsKKyAgICBpbnQgd2lkdGggPSBzdGF0ZS0+Z2V0X3dpZHRoKCk7CisgICAgaW50IGNuID0gQ1ZfTUFUX0NOKHN0YXRlLT5nZXRfc3JjX3R5cGUoKSk7CisgICAgaW50IGksIGs7CisKKyAgICB3aWR0aCA9ICh3aWR0aCAtIDEpKmNuOyBrc2l6ZSAqPSBjbjsKKworICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrLCBzcmMrKywgZHN0KysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwga3NpemU7IGkgKz0gY24gKQorICAgICAgICAgICAgcyArPSBzcmNbaV07CisgICAgICAgIGRzdFswXSA9IHM7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSArPSBjbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHMgKz0gKGRvdWJsZSlzcmNbaStrc2l6ZV0gLSBzcmNbaV07CisgICAgICAgICAgICBkc3RbaStjbl0gPSBzOworICAgICAgICB9CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZTdW1Db2xfMzJzOHUoIGNvbnN0IGludCoqIHNyYywgdWNoYXIqIGRzdCwKKyAgICAgICAgICAgICAgICAgaW50IGRzdF9zdGVwLCBpbnQgY291bnQsIHZvaWQqIHBhcmFtcyApCit7CisjZGVmaW5lIEJMVVJfU0hJRlQgMjQKKyAgICBDdkJveEZpbHRlciogc3RhdGUgPSAoQ3ZCb3hGaWx0ZXIqKXBhcmFtczsKKyAgICBpbnQga3NpemUgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkuaGVpZ2h0OworICAgIGludCBpLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsKKyAgICBkb3VibGUgc2NhbGUgPSBzdGF0ZS0+Z2V0X3NjYWxlKCk7CisgICAgaW50IGlzY2FsZSA9IGN2Rmxvb3Ioc2NhbGUqKDEgPDwgQkxVUl9TSElGVCkpOworICAgIGludCogc3VtID0gKGludCopc3RhdGUtPmdldF9zdW1fYnVmKCk7CisgICAgaW50KiBfc3VtX2NvdW50ID0gc3RhdGUtPmdldF9zdW1fY291bnRfcHRyKCk7CisgICAgaW50IHN1bV9jb3VudCA9ICpfc3VtX2NvdW50OworCisgICAgd2lkdGggKj0gY247CisgICAgc3JjICs9IHN1bV9jb3VudDsKKyAgICBjb3VudCArPSBrc2l6ZSAtIDEgLSBzdW1fY291bnQ7CisKKyAgICBmb3IoIDsgY291bnQtLTsgc3JjKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBzcCA9IHNyY1swXTsKKyAgICAgICAgaWYoIHN1bV9jb3VudCsxIDwga3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXSwgczEgPSBzdW1baSsxXSArIHNwW2krMV07CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczA7IHN1bVtpKzFdID0gczE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgICAgICAgICAgc3VtW2ldICs9IHNwW2ldOworCisgICAgICAgICAgICBzdW1fY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCogc20gPSBzcmNbLWtzaXplKzFdOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHMwID0gc3VtW2ldICsgc3BbaV0sIHMxID0gc3VtW2krMV0gKyBzcFtpKzFdOworICAgICAgICAgICAgICAgIGludCB0MCA9IENWX0RFU0NBTEUoczAqaXNjYWxlLCBCTFVSX1NISUZUKSwgdDEgPSBDVl9ERVNDQUxFKHMxKmlzY2FsZSwgQkxVUl9TSElGVCk7CisgICAgICAgICAgICAgICAgczAgLT0gc21baV07IHMxIC09IHNtW2krMV07CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczA7IHN1bVtpKzFdID0gczE7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gKHVjaGFyKXQwOyBkc3RbaSsxXSA9ICh1Y2hhcil0MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXSwgdDAgPSBDVl9ERVNDQUxFKHMwKmlzY2FsZSwgQkxVUl9TSElGVCk7CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczAgLSBzbVtpXTsgZHN0W2ldID0gKHVjaGFyKXQwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGRzdF9zdGVwOworICAgICAgICB9CisgICAgfQorCisgICAgKl9zdW1fY291bnQgPSBzdW1fY291bnQ7CisjdW5kZWYgQkxVUl9TSElGVAorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZTdW1Db2xfMzJzMTZzKCBjb25zdCBpbnQqKiBzcmMsIHNob3J0KiBkc3QsCisgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBDdkJveEZpbHRlciogc3RhdGUgPSAoQ3ZCb3hGaWx0ZXIqKXBhcmFtczsKKyAgICBpbnQga3NpemUgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkuaGVpZ2h0OworICAgIGludCBrdG90YWwgPSBrc2l6ZSpzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkud2lkdGg7CisgICAgaW50IGksIHdpZHRoID0gc3RhdGUtPmdldF93aWR0aCgpOworICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOworICAgIGludCogc3VtID0gKGludCopc3RhdGUtPmdldF9zdW1fYnVmKCk7CisgICAgaW50KiBfc3VtX2NvdW50ID0gc3RhdGUtPmdldF9zdW1fY291bnRfcHRyKCk7CisgICAgaW50IHN1bV9jb3VudCA9ICpfc3VtX2NvdW50OworCisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisgICAgd2lkdGggKj0gY247CisgICAgc3JjICs9IHN1bV9jb3VudDsKKyAgICBjb3VudCArPSBrc2l6ZSAtIDEgLSBzdW1fY291bnQ7CisKKyAgICBmb3IoIDsgY291bnQtLTsgc3JjKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBzcCA9IHNyY1swXTsKKyAgICAgICAgaWYoIHN1bV9jb3VudCsxIDwga3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXSwgczEgPSBzdW1baSsxXSArIHNwW2krMV07CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczA7IHN1bVtpKzFdID0gczE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgICAgICAgICAgc3VtW2ldICs9IHNwW2ldOworCisgICAgICAgICAgICBzdW1fY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBrdG90YWwgPCAxMjggKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQqIHNtID0gc3JjWy1rc2l6ZSsxXTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IHN1bVtpXSArIHNwW2ldLCBzMSA9IHN1bVtpKzFdICsgc3BbaSsxXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAoc2hvcnQpczA7IGRzdFtpKzFdID0gKHNob3J0KXMxOworICAgICAgICAgICAgICAgIHMwIC09IHNtW2ldOyBzMSAtPSBzbVtpKzFdOworICAgICAgICAgICAgICAgIHN1bVtpXSA9IHMwOyBzdW1baSsxXSA9IHMxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IHN1bVtpXSArIHNwW2ldOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IChzaG9ydClzMDsKKyAgICAgICAgICAgICAgICBzdW1baV0gPSBzMCAtIHNtW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGRzdF9zdGVwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50KiBzbSA9IHNyY1sta3NpemUrMV07CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXSwgczEgPSBzdW1baSsxXSArIHNwW2krMV07CisgICAgICAgICAgICAgICAgZHN0W2ldID0gQ1ZfQ0FTVF8xNlMoczApOyBkc3RbaSsxXSA9IENWX0NBU1RfMTZTKHMxKTsKKyAgICAgICAgICAgICAgICBzMCAtPSBzbVtpXTsgczEgLT0gc21baSsxXTsKKyAgICAgICAgICAgICAgICBzdW1baV0gPSBzMDsgc3VtW2krMV0gPSBzMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBDVl9DQVNUXzE2UyhzMCk7CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczAgLSBzbVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcDsKKyAgICAgICAgfQorICAgIH0KKworICAgICpfc3VtX2NvdW50ID0gc3VtX2NvdW50OworfQorCitzdGF0aWMgdm9pZAoraWN2U3VtQ29sXzMyczMycyggY29uc3QgaW50Kiogc3JjLCBpbnQgKiBkc3QsCisgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsIGludCBjb3VudCwgdm9pZCogcGFyYW1zICkKK3sKKyAgICBDdkJveEZpbHRlciogc3RhdGUgPSAoQ3ZCb3hGaWx0ZXIqKXBhcmFtczsKKyAgICBpbnQga3NpemUgPSBzdGF0ZS0+Z2V0X2tlcm5lbF9zaXplKCkuaGVpZ2h0OworICAgIGludCBpLCB3aWR0aCA9IHN0YXRlLT5nZXRfd2lkdGgoKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3RhdGUtPmdldF9zcmNfdHlwZSgpKTsKKyAgICBpbnQqIHN1bSA9IChpbnQqKXN0YXRlLT5nZXRfc3VtX2J1ZigpOworICAgIGludCogX3N1bV9jb3VudCA9IHN0YXRlLT5nZXRfc3VtX2NvdW50X3B0cigpOworICAgIGludCBzdW1fY291bnQgPSAqX3N1bV9jb3VudDsKKworICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3RbMF0pOworICAgIHdpZHRoICo9IGNuOworICAgIHNyYyArPSBzdW1fY291bnQ7CisgICAgY291bnQgKz0ga3NpemUgLSAxIC0gc3VtX2NvdW50OworCisgICAgZm9yKCA7IGNvdW50LS07IHNyYysrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCogc3AgPSBzcmNbMF07CisgICAgICAgIGlmKCBzdW1fY291bnQrMSA8IGtzaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB3aWR0aCAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHMwID0gc3VtW2ldICsgc3BbaV0sIHMxID0gc3VtW2krMV0gKyBzcFtpKzFdOworICAgICAgICAgICAgICAgIHN1bVtpXSA9IHMwOyBzdW1baSsxXSA9IHMxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgaSA8IHdpZHRoOyBpKysgKQorICAgICAgICAgICAgICAgIHN1bVtpXSArPSBzcFtpXTsKKworICAgICAgICAgICAgc3VtX2NvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQqIHNtID0gc3JjWy1rc2l6ZSsxXTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzMCA9IHN1bVtpXSArIHNwW2ldLCBzMSA9IHN1bVtpKzFdICsgc3BbaSsxXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsgZHN0W2krMV0gPSBzMTsKKyAgICAgICAgICAgICAgICBzMCAtPSBzbVtpXTsgczEgLT0gc21baSsxXTsKKyAgICAgICAgICAgICAgICBzdW1baV0gPSBzMDsgc3VtW2krMV0gPSBzMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgczAgPSBzdW1baV0gKyBzcFtpXTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzMDsKKyAgICAgICAgICAgICAgICBzdW1baV0gPSBzMCAtIHNtW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZHN0ICs9IGRzdF9zdGVwOworICAgICAgICB9CisgICAgfQorCisgICAgKl9zdW1fY291bnQgPSBzdW1fY291bnQ7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlN1bUNvbF82NGYzMmYoIGNvbnN0IGRvdWJsZSoqIHNyYywgZmxvYXQqIGRzdCwKKyAgICAgICAgICAgICAgICAgIGludCBkc3Rfc3RlcCwgaW50IGNvdW50LCB2b2lkKiBwYXJhbXMgKQoreworICAgIEN2Qm94RmlsdGVyKiBzdGF0ZSA9IChDdkJveEZpbHRlciopcGFyYW1zOworICAgIGludCBrc2l6ZSA9IHN0YXRlLT5nZXRfa2VybmVsX3NpemUoKS5oZWlnaHQ7CisgICAgaW50IGksIHdpZHRoID0gc3RhdGUtPmdldF93aWR0aCgpOworICAgIGludCBjbiA9IENWX01BVF9DTihzdGF0ZS0+Z2V0X3NyY190eXBlKCkpOworICAgIGRvdWJsZSBzY2FsZSA9IHN0YXRlLT5nZXRfc2NhbGUoKTsKKyAgICBib29sIG5vcm1hbGl6ZWQgPSBzdGF0ZS0+aXNfbm9ybWFsaXplZCgpOworICAgIGRvdWJsZSogc3VtID0gKGRvdWJsZSopc3RhdGUtPmdldF9zdW1fYnVmKCk7CisgICAgaW50KiBfc3VtX2NvdW50ID0gc3RhdGUtPmdldF9zdW1fY291bnRfcHRyKCk7CisgICAgaW50IHN1bV9jb3VudCA9ICpfc3VtX2NvdW50OworCisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisgICAgd2lkdGggKj0gY247CisgICAgc3JjICs9IHN1bV9jb3VudDsKKyAgICBjb3VudCArPSBrc2l6ZSAtIDEgLSBzdW1fY291bnQ7CisKKyAgICBmb3IoIDsgY291bnQtLTsgc3JjKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlKiBzcCA9IHNyY1swXTsKKyAgICAgICAgaWYoIHN1bV9jb3VudCsxIDwga3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgczAgPSBzdW1baV0gKyBzcFtpXSwgczEgPSBzdW1baSsxXSArIHNwW2krMV07CisgICAgICAgICAgICAgICAgc3VtW2ldID0gczA7IHN1bVtpKzFdID0gczE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApCisgICAgICAgICAgICAgICAgc3VtW2ldICs9IHNwW2ldOworCisgICAgICAgICAgICBzdW1fY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc20gPSBzcmNbLWtzaXplKzFdOworICAgICAgICAgICAgaWYoIG5vcm1hbGl6ZWQgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gd2lkdGggLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHMwID0gc3VtW2ldICsgc3BbaV0sIHMxID0gc3VtW2krMV0gKyBzcFtpKzFdOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDAgPSBzMCpzY2FsZSwgdDEgPSBzMSpzY2FsZTsKKyAgICAgICAgICAgICAgICAgICAgczAgLT0gc21baV07IHMxIC09IHNtW2krMV07CisgICAgICAgICAgICAgICAgICAgIGRzdFtpXSA9IChmbG9hdCl0MDsgZHN0W2krMV0gPSAoZmxvYXQpdDE7CisgICAgICAgICAgICAgICAgICAgIHN1bVtpXSA9IHMwOyBzdW1baSsxXSA9IHMxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gMjsgaSArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IHN1bVtpXSArIHNwW2ldLCBzMSA9IHN1bVtpKzFdICsgc3BbaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXMwOyBkc3RbaSsxXSA9IChmbG9hdClzMTsKKyAgICAgICAgICAgICAgICAgICAgczAgLT0gc21baV07IHMxIC09IHNtW2krMV07CisgICAgICAgICAgICAgICAgICAgIHN1bVtpXSA9IHMwOyBzdW1baSsxXSA9IHMxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgczAgPSBzdW1baV0gKyBzcFtpXSwgdDAgPSBzMCpzY2FsZTsKKyAgICAgICAgICAgICAgICBzdW1baV0gPSBzMCAtIHNtW2ldOyBkc3RbaV0gPSAoZmxvYXQpdDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3QgKz0gZHN0X3N0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqX3N1bV9jb3VudCA9IHN1bV9jb3VudDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFuIEZpbHRlcgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfTUlOTUFYXzhVKGEsYikgXAorICAgICh0ID0gQ1ZfRkFTVF9DQVNUXzhVKChhKSAtIChiKSksIChiKSArPSB0LCBhIC09IHQpCisKKyNpZiBDVl9TU0UyICYmICFkZWZpbmVkIF9fU1NFMl9fCisjZGVmaW5lIF9fU1NFMl9fIDEKKyNpbmNsdWRlICJlbW1pbnRyaW4uaCIKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX1ZFQ19fKSB8fCBkZWZpbmVkKF9fQUxUSVZFQ19fKQorI2luY2x1ZGUgPGFsdGl2ZWMuaD4KKyN1bmRlZiBib29sCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19HTlVDX18pCisjZGVmaW5lIGFsaWduKHgpIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICh4KSkpCisjZWxpZiBDVl9TU0UyICYmIChkZWZpbmVkKF9fSUNMKSB8fCAoX01TQ19WRVIgPj0gMTMwMCkpCisjZGVmaW5lIGFsaWduKHgpIF9fZGVjbHNwZWMoYWxpZ24oeCkpCisjZWxzZQorI2RlZmluZSBhbGlnbih4KQorI2VuZGlmCisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQyNDQgKQorI2VuZGlmCisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIHR3by10aWVyIGhpc3RvZ3JhbS4gVGhlIGZpcnN0IHRpZXIgKGtub3duIGFzIHRoZQorICogImNvYXJzZSIgbGV2ZWwpIGlzIDQgYml0IHdpZGUgYW5kIHRoZSBzZWNvbmQgdGllciAoa25vd24gYXMgdGhlICJmaW5lIiBsZXZlbCkKKyAqIGlzIDggYml0IHdpZGUuIFBpeGVscyBpbnNlcnRlZCBpbiB0aGUgZmluZSBsZXZlbCBhbHNvIGdldCBpbnNlcnRlZCBpbnRvIHRoZQorICogY29hcnNlIGJ1Y2tldCBkZXNpZ25hdGVkIGJ5IHRoZSA0IE1TQnMgb2YgdGhlIGZpbmUgYnVja2V0IHZhbHVlLgorICoKKyAqIFRoZSBzdHJ1Y3R1cmUgaXMgYWxpZ25lZCBvbiAxNiBiaXRzLCB3aGljaCBpcyBhIHByZXJlcXVpc2l0ZSBmb3IgU0lNRAorICogaW5zdHJ1Y3Rpb25zLiBFYWNoIGJ1Y2tldCBpcyAxNiBiaXQgd2lkZSwgd2hpY2ggbWVhbnMgdGhhdCBleHRyYSBjYXJlIG11c3QgYmUKKyAqIHRha2VuIHRvIHByZXZlbnQgb3ZlcmZsb3cuCisgKi8KK3R5cGVkZWYgc3RydWN0IGFsaWduKDE2KQoreworICAgIHVzaG9ydCBjb2Fyc2VbMTZdOworICAgIHVzaG9ydCBmaW5lWzE2XVsxNl07Cit9IEhpc3RvZ3JhbTsKKworLyoqCisgKiBIT1AgaXMgc2hvcnQgZm9yIEhpc3RvZ3JhbSBPUGVyYXRpb24uIFRoaXMgbWFjcm8gbWFrZXMgYW4gb3BlcmF0aW9uIFxhIG9wIG9uCisgKiBoaXN0b2dyYW0gXGEgaCBmb3IgcGl4ZWwgdmFsdWUgXGEgeC4gSXQgdGFrZXMgY2FyZSBvZiBoYW5kbGluZyBib3RoIGxldmVscy4KKyAqLworI2RlZmluZSBIT1AoaCx4LG9wKSBcCisgICAgaC5jb2Fyc2VbeD4+NF0gb3A7IFwKKyAgICAqKCh1c2hvcnQqKSBoLmZpbmUgKyB4KSBvcDsKKworI2RlZmluZSBDT1AoYyxqLHgsb3ApIFwKKyAgICBoX2NvYXJzZVsgMTYqKG4qYytqKSArICh4Pj40KSBdIG9wOyBcCisgICAgaF9maW5lWyAxNiAqIChuKigxNipjKyh4Pj40KSkgKyBqKSArICh4ICYgMHhGKSBdIG9wOworCisjaWYgZGVmaW5lZCBfX1NTRTJfXyB8fCBkZWZpbmVkIF9fTU1YX18gfHwgZGVmaW5lZCBfX0FMVElWRUNfXworI2RlZmluZSBNRURJQU5fSEFWRV9TSU1EIDEKKyNlbHNlCisjZGVmaW5lIE1FRElBTl9IQVZFX1NJTUQgMAorI2VuZGlmCisKKy8qKgorICogQWRkcyBoaXN0b2dyYW1zIFxhIHggYW5kIFxhIHkgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIFxhIHkuIE1ha2VzIHVzZSBvZgorICogU1NFMiwgTU1YIG9yIEFsdGl2ZWMsIGlmIGF2YWlsYWJsZS4KKyAqLworI2lmIGRlZmluZWQoX19TU0UyX18pCitzdGF0aWMgaW5saW5lIHZvaWQgaGlzdG9ncmFtX2FkZCggY29uc3QgdXNob3J0IHhbMTZdLCB1c2hvcnQgeVsxNl0gKQoreworICAgIF9tbV9zdG9yZV9zaTEyOCggKF9fbTEyOGkqKSAmeVswXSwgX21tX2FkZF9lcGkxNigKKyAgICAgICAgX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKSAmeVswXSksIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikgJnhbMF0gKSkpOworICAgIF9tbV9zdG9yZV9zaTEyOCggKF9fbTEyOGkqKSAmeVs4XSwgX21tX2FkZF9lcGkxNigKKyAgICAgICAgX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKSAmeVs4XSksIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikgJnhbOF0gKSkpOworfQorI2VsaWYgZGVmaW5lZChfX01NWF9fKQorc3RhdGljIGlubGluZSB2b2lkIGhpc3RvZ3JhbV9hZGQoIGNvbnN0IHVzaG9ydCB4WzE2XSwgdXNob3J0IHlbMTZdICkKK3sKKyAgICAqKF9fbTY0KikgJnlbMF0gID0gX21tX2FkZF9waTE2KCAqKF9fbTY0KikgJnlbMF0sICAqKF9fbTY0KikgJnhbMF0gICk7CisgICAgKihfX202NCopICZ5WzRdICA9IF9tbV9hZGRfcGkxNiggKihfX202NCopICZ5WzRdLCAgKihfX202NCopICZ4WzRdICApOworICAgICooX19tNjQqKSAmeVs4XSAgPSBfbW1fYWRkX3BpMTYoICooX19tNjQqKSAmeVs4XSwgICooX19tNjQqKSAmeFs4XSAgKTsKKyAgICAqKF9fbTY0KikgJnlbMTJdID0gX21tX2FkZF9waTE2KCAqKF9fbTY0KikgJnlbMTJdLCAqKF9fbTY0KikgJnhbMTJdICk7Cit9CisjZWxpZiBkZWZpbmVkKF9fQUxUSVZFQ19fKQorc3RhdGljIGlubGluZSB2b2lkIGhpc3RvZ3JhbV9hZGQoIGNvbnN0IHVzaG9ydCB4WzE2XSwgdXNob3J0IHlbMTZdICkKK3sKKyAgICAqKHZlY3RvciB1c2hvcnQqKSAmeVswXSA9IHZlY19hZGQoICoodmVjdG9yIHVzaG9ydCopICZ5WzBdLCAqKHZlY3RvciB1c2hvcnQqKSAmeFswXSApOworICAgICoodmVjdG9yIHVzaG9ydCopICZ5WzhdID0gdmVjX2FkZCggKih2ZWN0b3IgdXNob3J0KikgJnlbOF0sICoodmVjdG9yIHVzaG9ydCopICZ4WzhdICk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGhpc3RvZ3JhbV9hZGQoIGNvbnN0IHVzaG9ydCB4WzE2XSwgdXNob3J0IHlbMTZdICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgMTY7ICsraSApCisgICAgICAgIHlbaV0gPSAodXNob3J0KSh5W2ldICsgeFtpXSk7Cit9CisjZW5kaWYKKworLyoqCisgKiBTdWJ0cmFjdHMgaGlzdG9ncmFtIFxhIHggZnJvbSBcYSB5IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiBcYSB5LiBNYWtlcyB1c2UKKyAqIG9mIFNTRTIsIE1NWCBvciBBbHRpdmVjLCBpZiBhdmFpbGFibGUuCisgKi8KKyNpZiBkZWZpbmVkKF9fU1NFMl9fKQorc3RhdGljIGlubGluZSB2b2lkIGhpc3RvZ3JhbV9zdWIoIGNvbnN0IHVzaG9ydCB4WzE2XSwgdXNob3J0IHlbMTZdICkKK3sKKyAgICBfbW1fc3RvcmVfc2kxMjgoIChfX20xMjhpKikgJnlbMF0sIF9tbV9zdWJfZXBpMTYoCisgICAgICAgIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikgJnlbMF0pLCBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopICZ4WzBdICkpKTsKKyAgICBfbW1fc3RvcmVfc2kxMjgoIChfX20xMjhpKikgJnlbOF0sIF9tbV9zdWJfZXBpMTYoCisgICAgICAgIF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikgJnlbOF0pLCBfbW1fbG9hZF9zaTEyOCgoX19tMTI4aSopICZ4WzhdICkpKTsKK30KKyNlbGlmIGRlZmluZWQoX19NTVhfXykKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaXN0b2dyYW1fc3ViKCBjb25zdCB1c2hvcnQgeFsxNl0sIHVzaG9ydCB5WzE2XSApCit7CisgICAgKihfX202NCopICZ5WzBdICA9IF9tbV9zdWJfcGkxNiggKihfX202NCopICZ5WzBdLCAgKihfX202NCopICZ4WzBdICApOworICAgICooX19tNjQqKSAmeVs0XSAgPSBfbW1fc3ViX3BpMTYoICooX19tNjQqKSAmeVs0XSwgICooX19tNjQqKSAmeFs0XSAgKTsKKyAgICAqKF9fbTY0KikgJnlbOF0gID0gX21tX3N1Yl9waTE2KCAqKF9fbTY0KikgJnlbOF0sICAqKF9fbTY0KikgJnhbOF0gICk7CisgICAgKihfX202NCopICZ5WzEyXSA9IF9tbV9zdWJfcGkxNiggKihfX202NCopICZ5WzEyXSwgKihfX202NCopICZ4WzEyXSApOworfQorI2VsaWYgZGVmaW5lZChfX0FMVElWRUNfXykKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaXN0b2dyYW1fc3ViKCBjb25zdCB1c2hvcnQgeFsxNl0sIHVzaG9ydCB5WzE2XSApCit7CisgICAgKih2ZWN0b3IgdXNob3J0KikgJnlbMF0gPSB2ZWNfc3ViKCAqKHZlY3RvciB1c2hvcnQqKSAmeVswXSwgKih2ZWN0b3IgdXNob3J0KikgJnhbMF0gKTsKKyAgICAqKHZlY3RvciB1c2hvcnQqKSAmeVs4XSA9IHZlY19zdWIoICoodmVjdG9yIHVzaG9ydCopICZ5WzhdLCAqKHZlY3RvciB1c2hvcnQqKSAmeFs4XSApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaXN0b2dyYW1fc3ViKCBjb25zdCB1c2hvcnQgeFsxNl0sIHVzaG9ydCB5WzE2XSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IDE2OyArK2kgKQorICAgICAgICB5W2ldID0gKHVzaG9ydCkoeVtpXSAtIHhbaV0pOworfQorI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoaXN0b2dyYW1fbXVsYWRkKCBpbnQgYSwgY29uc3QgdXNob3J0IHhbMTZdLAorICAgICAgICB1c2hvcnQgeVsxNl0gKQoreworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgMTY7ICsraSApCisgICAgICAgIHlbaV0gPSAodXNob3J0KSh5W2ldICsgYSAqIHhbaV0pOworfQorCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2TWVkaWFuQmx1cl84dV9DblJfTzEoIHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQga2VybmVsX3NpemUsIGludCBjbiwgaW50IHBhZF9sZWZ0LCBpbnQgcGFkX3JpZ2h0ICkKK3sKKyAgICBpbnQgciA9IChrZXJuZWxfc2l6ZS0xKS8yOworICAgIGNvbnN0IGludCBtID0gc2l6ZS5oZWlnaHQsIG4gPSBzaXplLndpZHRoOworICAgIGludCBpLCBqLCBrLCBjOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAsICpxOworICAgIEhpc3RvZ3JhbSBIWzRdOworICAgIHVzaG9ydCAqaF9jb2Fyc2UsICpoX2ZpbmUsIGx1Y1s0XVsxNl07CisKKyAgICBpZiggc2l6ZS5oZWlnaHQgPCByIHx8IHNpemUud2lkdGggPCByICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgYXNzZXJ0KCBzcmMgKTsKKyAgICBhc3NlcnQoIGRzdCApOworICAgIGFzc2VydCggciA+PSAwICk7CisgICAgYXNzZXJ0KCBzaXplLndpZHRoID49IDIqcisxICk7CisgICAgYXNzZXJ0KCBzaXplLmhlaWdodCA+PSAyKnIrMSApOworICAgIGFzc2VydCggc3JjX3N0ZXAgIT0gMCApOworICAgIGFzc2VydCggZHN0X3N0ZXAgIT0gMCApOworCisgICAgaF9jb2Fyc2UgPSAodXNob3J0KikgY3ZBbGxvYyggIDEgKiAxNiAqIG4gKiBjbiAqIHNpemVvZih1c2hvcnQpICk7CisgICAgaF9maW5lICAgPSAodXNob3J0KikgY3ZBbGxvYyggMTYgKiAxNiAqIG4gKiBjbiAqIHNpemVvZih1c2hvcnQpICk7CisgICAgbWVtc2V0KCBoX2NvYXJzZSwgMCwgIDEgKiAxNiAqIG4gKiBjbiAqIHNpemVvZih1c2hvcnQpICk7CisgICAgbWVtc2V0KCBoX2ZpbmUsICAgMCwgMTYgKiAxNiAqIG4gKiBjbiAqIHNpemVvZih1c2hvcnQpICk7CisKKyAgICAvKiBGaXJzdCByb3cgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBmb3IgKCBqID0gMDsgaiA8IG47ICsraiApIHsKKyAgICAgICAgZm9yICggYyA9IDA7IGMgPCBjbjsgKytjICkgeworICAgICAgICAgICAgQ09QKCBjLCBqLCBzcmNbY24qaitjXSwgKz0gcisxICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yICggaSA9IDA7IGkgPCByOyArK2kgKSB7CisgICAgICAgIGZvciAoIGogPSAwOyBqIDwgbjsgKytqICkgeworICAgICAgICAgICAgZm9yICggYyA9IDA7IGMgPCBjbjsgKytjICkgeworICAgICAgICAgICAgICAgIENPUCggYywgaiwgc3JjW3NyY19zdGVwKmkrY24qaitjXSwgKysgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoIGkgPSAwOyBpIDwgbTsgKytpICkgeworCisgICAgICAgIC8qIFVwZGF0ZSBjb2x1bW4gaGlzdG9ncmFtcyBmb3IgZW50aXJlIHJvdy4gKi8KKyAgICAgICAgcCA9IHNyYyArIHNyY19zdGVwICogTUFYKCAwLCBpLXItMSApOworICAgICAgICBxID0gcCArIGNuICogbjsKKyAgICAgICAgZm9yICggaiA9IDA7IHAgIT0gcTsgKytqICkgeworICAgICAgICAgICAgZm9yICggYyA9IDA7IGMgPCBjbjsgKytjLCArK3AgKSB7CisgICAgICAgICAgICAgICAgQ09QKCBjLCBqLCAqcCwgLS0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHAgPSBzcmMgKyBzcmNfc3RlcCAqIE1JTiggbS0xLCBpK3IgKTsKKyAgICAgICAgcSA9IHAgKyBjbiAqIG47CisgICAgICAgIGZvciAoIGogPSAwOyBwICE9IHE7ICsraiApIHsKKyAgICAgICAgICAgIGZvciAoIGMgPSAwOyBjIDwgY247ICsrYywgKytwICkgeworICAgICAgICAgICAgICAgIENPUCggYywgaiwgKnAsICsrICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBGaXJzdCBjb2x1bW4gaW5pdGlhbGl6YXRpb24gKi8KKyAgICAgICAgbWVtc2V0KCBILCAwLCBjbipzaXplb2YoSFswXSkgKTsKKyAgICAgICAgbWVtc2V0KCBsdWMsIDAsIGNuKnNpemVvZihsdWNbMF0pICk7CisgICAgICAgIGlmICggcGFkX2xlZnQgKSB7CisgICAgICAgICAgICBmb3IgKCBjID0gMDsgYyA8IGNuOyArK2MgKSB7CisgICAgICAgICAgICAgICAgaGlzdG9ncmFtX211bGFkZCggciwgJmhfY29hcnNlWzE2Km4qY10sIEhbY10uY29hcnNlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yICggaiA9IDA7IGogPCAocGFkX2xlZnQgPyByIDogMipyKTsgKytqICkgeworICAgICAgICAgICAgZm9yICggYyA9IDA7IGMgPCBjbjsgKytjICkgeworICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9hZGQoICZoX2NvYXJzZVsxNioobipjK2opXSwgSFtjXS5jb2Fyc2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKCBjID0gMDsgYyA8IGNuOyArK2MgKSB7CisgICAgICAgICAgICBmb3IgKCBrID0gMDsgayA8IDE2OyArK2sgKSB7CisgICAgICAgICAgICAgICAgaGlzdG9ncmFtX211bGFkZCggMipyKzEsICZoX2ZpbmVbMTYqbiooMTYqYytrKV0sICZIW2NdLmZpbmVba11bMF0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoIGogPSBwYWRfbGVmdCA/IDAgOiByOyBqIDwgKHBhZF9yaWdodCA/IG4gOiBuLXIpOyArK2ogKSB7CisgICAgICAgICAgICBmb3IgKCBjID0gMDsgYyA8IGNuOyArK2MgKSB7CisgICAgICAgICAgICAgICAgaW50IHQgPSAyKnIqciArIDIqciwgYiwgc3VtID0gMDsKKyAgICAgICAgICAgICAgICB1c2hvcnQqIHNlZ21lbnQ7CisKKyAgICAgICAgICAgICAgICBoaXN0b2dyYW1fYWRkKCAmaF9jb2Fyc2VbMTYqKG4qYyArIE1JTihqK3Isbi0xKSldLCBIW2NdLmNvYXJzZSApOworCisgICAgICAgICAgICAgICAgLyogRmluZCBtZWRpYW4gYXQgY29hcnNlIGxldmVsICovCisgICAgICAgICAgICAgICAgZm9yICggayA9IDA7IGsgPCAxNiA7ICsrayApIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IEhbY10uY29hcnNlW2tdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN1bSA+IHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gLT0gSFtjXS5jb2Fyc2Vba107CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGsgPCAxNiApOworCisgICAgICAgICAgICAgICAgLyogVXBkYXRlIGNvcnJlc3BvbmRpbmcgaGlzdG9ncmFtIHNlZ21lbnQgKi8KKyAgICAgICAgICAgICAgICBpZiAoIGx1Y1tjXVtrXSA8PSBqLXIgKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggJkhbY10uZmluZVtrXSwgMCwgMTYgKiBzaXplb2YodXNob3J0KSApOworICAgICAgICAgICAgICAgICAgICBmb3IgKCBsdWNbY11ba10gPSBqLXI7IGx1Y1tjXVtrXSA8IE1JTihqK3IrMSxuKTsgKytsdWNbY11ba10gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fYWRkKCAmaF9maW5lWzE2KihuKigxNipjK2spK2x1Y1tjXVtrXSldLCBIW2NdLmZpbmVba10gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIGx1Y1tjXVtrXSA8IGorcisxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGlzdG9ncmFtX211bGFkZCggaityKzEgLSBuLCAmaF9maW5lWzE2KihuKigxNipjK2spKyhuLTEpKV0sICZIW2NdLmZpbmVba11bMF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGx1Y1tjXVtrXSA9ICh1c2hvcnQpKGorcisxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yICggOyBsdWNbY11ba10gPCBqK3IrMTsgKytsdWNbY11ba10gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fc3ViKCAmaF9maW5lWzE2KihuKigxNipjK2spK01BWChsdWNbY11ba10tMipyLTEsMCkpXSwgSFtjXS5maW5lW2tdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1fYWRkKCAmaF9maW5lWzE2KihuKigxNipjK2spK01JTihsdWNbY11ba10sbi0xKSldLCBIW2NdLmZpbmVba10gKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhpc3RvZ3JhbV9zdWIoICZoX2NvYXJzZVsxNioobipjK01BWChqLXIsMCkpXSwgSFtjXS5jb2Fyc2UgKTsKKworICAgICAgICAgICAgICAgIC8qIEZpbmQgbWVkaWFuIGluIHNlZ21lbnQgKi8KKyAgICAgICAgICAgICAgICBzZWdtZW50ID0gSFtjXS5maW5lW2tdOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgMTYgOyArK2IgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBzZWdtZW50W2JdOworICAgICAgICAgICAgICAgICAgICBpZiAoIHN1bSA+IHQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbZHN0X3N0ZXAqaStjbipqK2NdID0gKHVjaGFyKSgxNiprICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGIgPCAxNiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWYgZGVmaW5lZChfX01NWF9fKQorICAgIF9tbV9lbXB0eSgpOworI2VuZGlmCisKKyAgICBjdkZyZWUoJmhfY29hcnNlKTsKKyAgICBjdkZyZWUoJmhfZmluZSk7CisKKyN1bmRlZiBIT1AKKyN1bmRlZiBDT1AKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworI2lmIF9NU0NfVkVSID49IDEyMDAKKyNwcmFnbWEgd2FybmluZyggZGVmYXVsdDogNDI0NCApCisjZW5kaWYKKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2TWVkaWFuQmx1cl84dV9DblJfT20oIHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgbSwgaW50IGNuICkKK3sKKyAgICAjZGVmaW5lIE4gIDE2CisgICAgaW50ICAgICB6b25lMFs0XVtOXTsKKyAgICBpbnQgICAgIHpvbmUxWzRdW04qTl07CisgICAgaW50ICAgICB4LCB5OworICAgIGludCAgICAgbjIgPSBtKm0vMjsKKyAgICBpbnQgICAgIG54ID0gKG0gKyAxKS8yIC0gMTsKKyAgICB1Y2hhciogIHNyY19tYXggPSBzcmMgKyBzaXplLmhlaWdodCpzcmNfc3RlcDsKKyAgICB1Y2hhciogIHNyY19yaWdodCA9IHNyYyArIHNpemUud2lkdGgqY247CisKKyAgICAjZGVmaW5lIFVQREFURV9BQ0MwMSggcGl4LCBjbiwgb3AgKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcCA9IChwaXgpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgem9uZTFbY25dW3BdIG9wOyAgICAgICAgICAgICAgICBcCisgICAgICAgIHpvbmUwW2NuXVtwID4+IDRdIG9wOyAgICAgICAgICAgXAorICAgIH0KKworICAgIGlmKCBzaXplLmhlaWdodCA8IG54IHx8IHNpemUud2lkdGggPCBueCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCBtID09IDMgKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBjbjsKKworICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNyYzAgPSBzcmMgKyBzcmNfc3RlcCooeS0xKTsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcmMxID0gc3JjMCArIHNyY19zdGVwOworICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNyYzIgPSBzcmMxICsgc3JjX3N0ZXA7CisgICAgICAgICAgICBpZiggeSA9PSAwICkKKyAgICAgICAgICAgICAgICBzcmMwID0gc3JjMTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHkgPT0gc2l6ZS5oZWlnaHQgLSAxICkKKyAgICAgICAgICAgICAgICBzcmMyID0gc3JjMTsKKworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IDIqY247IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHgwID0geCA8IGNuID8geCA6IHNpemUud2lkdGggLSAzKmNuICsgeDsKKyAgICAgICAgICAgICAgICBpbnQgeDIgPSB4IDwgY24gPyB4ICsgY24gOiBzaXplLndpZHRoIC0gMipjbiArIHg7CisgICAgICAgICAgICAgICAgaW50IHgxID0geCA8IGNuID8geDAgOiB4MiwgdDsKKworICAgICAgICAgICAgICAgIGludCBwMCA9IHNyYzBbeDBdLCBwMSA9IHNyYzBbeDFdLCBwMiA9IHNyYzBbeDJdOworICAgICAgICAgICAgICAgIGludCBwMyA9IHNyYzFbeDBdLCBwNCA9IHNyYzFbeDFdLCBwNSA9IHNyYzFbeDJdOworICAgICAgICAgICAgICAgIGludCBwNiA9IHNyYzJbeDBdLCBwNyA9IHNyYzJbeDFdLCBwOCA9IHNyYzJbeDJdOworCisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHAxLCBwMik7IENWX01JTk1BWF84VShwNCwgcDUpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwNywgcDgpOyBDVl9NSU5NQVhfOFUocDAsIHAxKTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDMsIHA0KTsgQ1ZfTUlOTUFYXzhVKHA2LCBwNyk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHAxLCBwMik7IENWX01JTk1BWF84VShwNCwgcDUpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwNywgcDgpOyBDVl9NSU5NQVhfOFUocDAsIHAzKTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDUsIHA4KTsgQ1ZfTUlOTUFYXzhVKHA0LCBwNyk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHAzLCBwNik7IENWX01JTk1BWF84VShwMSwgcDQpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwMiwgcDUpOyBDVl9NSU5NQVhfOFUocDQsIHA3KTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDQsIHAyKTsgQ1ZfTUlOTUFYXzhVKHA2LCBwNCk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHA0LCBwMik7CisgICAgICAgICAgICAgICAgZHN0W3gxXSA9ICh1Y2hhcilwNDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCB4ID0gY247IHggPCBzaXplLndpZHRoIC0gY247IHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHAwID0gc3JjMFt4LWNuXSwgcDEgPSBzcmMwW3hdLCBwMiA9IHNyYzBbeCtjbl07CisgICAgICAgICAgICAgICAgaW50IHAzID0gc3JjMVt4LWNuXSwgcDQgPSBzcmMxW3hdLCBwNSA9IHNyYzFbeCtjbl07CisgICAgICAgICAgICAgICAgaW50IHA2ID0gc3JjMlt4LWNuXSwgcDcgPSBzcmMyW3hdLCBwOCA9IHNyYzJbeCtjbl07CisgICAgICAgICAgICAgICAgaW50IHQ7CisKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDEsIHAyKTsgQ1ZfTUlOTUFYXzhVKHA0LCBwNSk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHA3LCBwOCk7IENWX01JTk1BWF84VShwMCwgcDEpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwMywgcDQpOyBDVl9NSU5NQVhfOFUocDYsIHA3KTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDEsIHAyKTsgQ1ZfTUlOTUFYXzhVKHA0LCBwNSk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHA3LCBwOCk7IENWX01JTk1BWF84VShwMCwgcDMpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwNSwgcDgpOyBDVl9NSU5NQVhfOFUocDQsIHA3KTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDMsIHA2KTsgQ1ZfTUlOTUFYXzhVKHAxLCBwNCk7CisgICAgICAgICAgICAgICAgQ1ZfTUlOTUFYXzhVKHAyLCBwNSk7IENWX01JTk1BWF84VShwNCwgcDcpOworICAgICAgICAgICAgICAgIENWX01JTk1BWF84VShwNCwgcDIpOyBDVl9NSU5NQVhfOFUocDYsIHA0KTsKKyAgICAgICAgICAgICAgICBDVl9NSU5NQVhfOFUocDQsIHAyKTsKKworICAgICAgICAgICAgICAgIGRzdFt4XSA9ICh1Y2hhcilwNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDVl9PSzsKKyAgICB9CisKKyAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrLCBkc3QgKz0gY24gKQorICAgIHsKKyAgICAgICAgdWNoYXIqIGRzdF9jdXIgPSBkc3Q7CisgICAgICAgIHVjaGFyKiBzcmNfdG9wID0gc3JjOworICAgICAgICB1Y2hhciogc3JjX2JvdHRvbSA9IHNyYzsKKyAgICAgICAgaW50ICAgIGssIGM7CisgICAgICAgIGludCAgICB4MCA9IC0xOworICAgICAgICBpbnQgICAgc3JjX3N0ZXAxID0gc3JjX3N0ZXAsIGRzdF9zdGVwMSA9IGRzdF9zdGVwOworCisgICAgICAgIGlmKCB4ICUgMiAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjX2JvdHRvbSA9IHNyY190b3AgKz0gc3JjX3N0ZXAqKHNpemUuaGVpZ2h0LTEpOworICAgICAgICAgICAgZHN0X2N1ciArPSBkc3Rfc3RlcCooc2l6ZS5oZWlnaHQtMSk7CisgICAgICAgICAgICBzcmNfc3RlcDEgPSAtc3JjX3N0ZXAxOworICAgICAgICAgICAgZHN0X3N0ZXAxID0gLWRzdF9zdGVwMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB4IDw9IG0vMiApCisgICAgICAgICAgICBueCsrOworCisgICAgICAgIGlmKCBueCA8IG0gKQorICAgICAgICAgICAgeDAgPSB4IDwgbS8yID8gMCA6IChueC0xKSpjbjsKKworICAgICAgICAvLyBpbml0IGFjY3VtdWxhdG9yCisgICAgICAgIG1lbXNldCggem9uZTAsIDAsIHNpemVvZih6b25lMFswXSkqY24gKTsKKyAgICAgICAgbWVtc2V0KCB6b25lMSwgMCwgc2l6ZW9mKHpvbmUxWzBdKSpjbiApOworCisgICAgICAgIGZvciggeSA9IDA7IHkgPD0gbS8yOyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGMgPSAwOyBjIDwgY247IGMrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHkgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB4MCA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX2JvdHRvbVt4MCtjXSwgYywgKz0gKG0gLSBueCkgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG54KmNuOyBrICs9IGNuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX2JvdHRvbVtrK2NdLCBjLCArKyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggeDAgPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY19ib3R0b21beDArY10sIGMsICs9IChtIC0gbngpKihtLzIrMSkgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG54KmNuOyBrICs9IGNuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX2JvdHRvbVtrK2NdLCBjLCArPSBtLzIrMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIChzcmNfc3RlcDEgPiAwICYmIHkgPCBzaXplLmhlaWdodC0xKSB8fAorICAgICAgICAgICAgICAgIChzcmNfc3RlcDEgPCAwICYmIHNpemUuaGVpZ2h0LXktMSA+IDApICkKKyAgICAgICAgICAgICAgICBzcmNfYm90dG9tICs9IHNyY19zdGVwMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrLCBkc3RfY3VyICs9IGRzdF9zdGVwMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGZpbmQgbWVkaWFuCisgICAgICAgICAgICBmb3IoIGMgPSAwOyBjIDwgY247IGMrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHMgPSAwOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0ID0gcyArIHpvbmUwW2NdW2tdOworICAgICAgICAgICAgICAgICAgICBpZiggdCA+IG4yICkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIHMgPSB0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggayAqPSBOOyA7aysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgKz0gem9uZTFbY11ba107CisgICAgICAgICAgICAgICAgICAgIGlmKCBzID4gbjIgKSBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkc3RfY3VyW2NdID0gKHVjaGFyKWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCB5KzEgPT0gc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiggY24gPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG54OyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHAgPSBzcmNfdG9wW2tdOworICAgICAgICAgICAgICAgICAgICBpbnQgcSA9IHNyY19ib3R0b21ba107CisgICAgICAgICAgICAgICAgICAgIHpvbmUxWzBdW3BdLS07CisgICAgICAgICAgICAgICAgICAgIHpvbmUwWzBdW3A+PjRdLS07CisgICAgICAgICAgICAgICAgICAgIHpvbmUxWzBdW3FdKys7CisgICAgICAgICAgICAgICAgICAgIHpvbmUwWzBdW3E+PjRdKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggY24gPT0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG54KjM7IGsgKz0gMyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY190b3Bba10sIDAsIC0tICk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX3RvcFtrKzFdLCAxLCAtLSApOworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY190b3BbaysyXSwgMiwgLS0gKTsKKworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY19ib3R0b21ba10sIDAsICsrICk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX2JvdHRvbVtrKzFdLCAxLCArKyApOworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY19ib3R0b21baysyXSwgMiwgKysgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBjbiA9PSA0ICk7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG54KjQ7IGsgKz0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY190b3Bba10sIDAsIC0tICk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX3RvcFtrKzFdLCAxLCAtLSApOworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY190b3BbaysyXSwgMiwgLS0gKTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0FDQzAxKCBzcmNfdG9wW2srM10sIDMsIC0tICk7CisKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0FDQzAxKCBzcmNfYm90dG9tW2tdLCAwLCArKyApOworICAgICAgICAgICAgICAgICAgICBVUERBVEVfQUNDMDEoIHNyY19ib3R0b21baysxXSwgMSwgKysgKTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0FDQzAxKCBzcmNfYm90dG9tW2srMl0sIDIsICsrICk7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX2JvdHRvbVtrKzNdLCAzLCArKyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHgwID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggYyA9IDA7IGMgPCBjbjsgYysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFVQREFURV9BQ0MwMSggc3JjX3RvcFt4MCtjXSwgYywgLT0gKG0gLSBueCkgKTsKKyAgICAgICAgICAgICAgICAgICAgVVBEQVRFX0FDQzAxKCBzcmNfYm90dG9tW3gwK2NdLCBjLCArPSAobSAtIG54KSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIChzcmNfc3RlcDEgPiAwICYmIHNyY19ib3R0b20gKyBzcmNfc3RlcDEgPCBzcmNfbWF4KSB8fAorICAgICAgICAgICAgICAgIChzcmNfc3RlcDEgPCAwICYmIHNyY19ib3R0b20gKyBzcmNfc3RlcDEgPj0gc3JjKSApCisgICAgICAgICAgICAgICAgc3JjX2JvdHRvbSArPSBzcmNfc3RlcDE7CisKKyAgICAgICAgICAgIGlmKCB5ID49IG0vMiApCisgICAgICAgICAgICAgICAgc3JjX3RvcCArPSBzcmNfc3RlcDE7CisgICAgICAgIH0KKworICAgICAgICBpZiggeCA+PSBtLzIgKQorICAgICAgICAgICAgc3JjICs9IGNuOworICAgICAgICBpZiggc3JjICsgbngqY24gPiBzcmNfcmlnaHQgKSBueC0tOworICAgIH0KKyN1bmRlZiBOCisjdW5kZWYgVVBEQVRFX0FDQworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlsYXRlcmFsIEZpbHRlcmluZworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpY3ZCaWxhdGVyYWxGaWx0ZXJpbmdfOHUoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsIGludCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2lnbWFfY29sb3IsIGRvdWJsZSBzaWdtYV9zcGFjZSApCit7CisgICAgQ3ZNYXQqIHRlbXAgPSAwOworICAgIGZsb2F0KiBjb2xvcl93ZWlnaHQgPSAwOworICAgIGZsb2F0KiBzcGFjZV93ZWlnaHQgPSAwOworICAgIGludCogc3BhY2Vfb2ZzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2QmlsYXRlcmFsRmlsdGVyaW5nXzh1IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIGdhdXNzX2NvbG9yX2NvZWZmID0gLTAuNS8oc2lnbWFfY29sb3Iqc2lnbWFfY29sb3IpOworICAgIGRvdWJsZSBnYXVzc19zcGFjZV9jb2VmZiA9IC0wLjUvKHNpZ21hX3NwYWNlKnNpZ21hX3NwYWNlKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3JjLT50eXBlKTsKKyAgICBpbnQgaSwgaiwgaywgbWF4aywgcmFkaXVzOworICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisKKyAgICBpZiggKENWX01BVF9UWVBFKHNyYy0+dHlwZSkgIT0gQ1ZfOFVDMSAmJgorICAgICAgICBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzhVQzMpIHx8CisgICAgICAgICFDVl9BUkVfVFlQRVNfRVEoc3JjLCBkc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiQm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QgYmUgOC1iaXQsIHNpbmdsZS1jaGFubmVsIG9yIDMtY2hhbm5lbCBpbWFnZXMiICk7CisKKyAgICBpZiggc2lnbWFfY29sb3IgPD0gMCApCisgICAgICAgIHNpZ21hX2NvbG9yID0gMTsKKyAgICBpZiggc2lnbWFfc3BhY2UgPD0gMCApCisgICAgICAgIHNpZ21hX3NwYWNlID0gMTsKKworICAgIGlmKCBkID09IDAgKQorICAgICAgICByYWRpdXMgPSBjdlJvdW5kKHNpZ21hX3NwYWNlKjEuNSk7CisgICAgZWxzZQorICAgICAgICByYWRpdXMgPSBkLzI7CisgICAgcmFkaXVzID0gTUFYKHJhZGl1cywgMSk7CisgICAgZCA9IHJhZGl1cyoyICsgMTsKKworICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggc3JjLT5yb3dzICsgcmFkaXVzKjIsCisgICAgICAgIHNyYy0+Y29scyArIHJhZGl1cyoyLCBzcmMtPnR5cGUgKSk7CisgICAgQ1ZfQ0FMTCggY3ZDb3B5TWFrZUJvcmRlciggc3JjLCB0ZW1wLCBjdlBvaW50KHJhZGl1cyxyYWRpdXMpLCBJUExfQk9SREVSX1JFUExJQ0FURSApKTsKKyAgICBDVl9DQUxMKCBjb2xvcl93ZWlnaHQgPSAoZmxvYXQqKWN2QWxsb2MoY24qMjU2KnNpemVvZihjb2xvcl93ZWlnaHRbMF0pKSk7CisgICAgQ1ZfQ0FMTCggc3BhY2Vfd2VpZ2h0ID0gKGZsb2F0KiljdkFsbG9jKGQqZCpzaXplb2Yoc3BhY2Vfd2VpZ2h0WzBdKSkpOworICAgIENWX0NBTEwoIHNwYWNlX29mcyA9IChpbnQqKWN2QWxsb2MoZCpkKnNpemVvZihzcGFjZV9vZnNbMF0pKSk7CisKKyAgICAvLyBpbml0aWFsaXplIGNvbG9yLXJlbGF0ZWQgYmlsYXRlcmFsIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjU2KmNuOyBpKysgKQorICAgICAgICBjb2xvcl93ZWlnaHRbaV0gPSAoZmxvYXQpZXhwKGkqaSpnYXVzc19jb2xvcl9jb2VmZik7CisKKyAgICAvLyBpbml0aWFsaXplIHNwYWNlLXJlbGF0ZWQgYmlsYXRlcmFsIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBmb3IoIGkgPSAtcmFkaXVzLCBtYXhrID0gMDsgaSA8PSByYWRpdXM7IGkrKyApCisgICAgICAgIGZvciggaiA9IC1yYWRpdXM7IGogPD0gcmFkaXVzOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgciA9IHNxcnQoKGRvdWJsZSlpKmkgKyAoZG91YmxlKWoqaik7CisgICAgICAgICAgICBpZiggciA+IHJhZGl1cyApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzcGFjZV93ZWlnaHRbbWF4a10gPSAoZmxvYXQpZXhwKHIqcipnYXVzc19zcGFjZV9jb2VmZik7CisgICAgICAgICAgICBzcGFjZV9vZnNbbWF4aysrXSA9IGkqdGVtcC0+c3RlcCArIGoqY247CisgICAgICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVjaGFyKiBzcHRyID0gdGVtcC0+ZGF0YS5wdHIgKyAoaStyYWRpdXMpKnRlbXAtPnN0ZXAgKyByYWRpdXMqY247CisgICAgICAgIHVjaGFyKiBkcHRyID0gZHN0LT5kYXRhLnB0ciArIGkqZHN0LT5zdGVwOworCisgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgc3VtID0gMCwgd3N1bSA9IDA7CisgICAgICAgICAgICAgICAgaW50IHZhbDAgPSBzcHRyW2pdOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtYXhrOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IHNwdHJbaiArIHNwYWNlX29mc1trXV07CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSBzcGFjZV93ZWlnaHRba10qY29sb3Jfd2VpZ2h0W2Ficyh2YWwgLSB2YWwwKV07CisgICAgICAgICAgICAgICAgICAgIHN1bSArPSB2YWwqdzsKKyAgICAgICAgICAgICAgICAgICAgd3N1bSArPSB3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBvdmVyZmxvdyBpcyBub3QgcG9zc2libGUgaGVyZSA9PiB0aGVyZSBpcyBubyBuZWVkIHRvIHVzZSBDVl9DQVNUXzhVCisgICAgICAgICAgICAgICAgZHB0cltqXSA9ICh1Y2hhciljdlJvdW5kKHN1bS93c3VtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggY24gPT0gMyApOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGgqMzsgaiArPSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBzdW1fYiA9IDAsIHN1bV9nID0gMCwgc3VtX3IgPSAwLCB3c3VtID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgYjAgPSBzcHRyW2pdLCBnMCA9IHNwdHJbaisxXSwgcjAgPSBzcHRyW2orMl07CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG1heGs7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogc3B0cl9rID0gc3B0ciArIGogKyBzcGFjZV9vZnNba107CisgICAgICAgICAgICAgICAgICAgIGludCBiID0gc3B0cl9rWzBdLCBnID0gc3B0cl9rWzFdLCByID0gc3B0cl9rWzJdOworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ID0gc3BhY2Vfd2VpZ2h0W2tdKmNvbG9yX3dlaWdodFthYnMoYiAtIGIwKSArCisgICAgICAgICAgICAgICAgICAgICAgICBhYnMoZyAtIGcwKSArIGFicyhyIC0gcjApXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2IgKz0gYip3OyBzdW1fZyArPSBnKnc7IHN1bV9yICs9IHIqdzsKKyAgICAgICAgICAgICAgICAgICAgd3N1bSArPSB3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3c3VtID0gMS5mL3dzdW07CisgICAgICAgICAgICAgICAgYjAgPSBjdlJvdW5kKHN1bV9iKndzdW0pOworICAgICAgICAgICAgICAgIGcwID0gY3ZSb3VuZChzdW1fZyp3c3VtKTsKKyAgICAgICAgICAgICAgICByMCA9IGN2Um91bmQoc3VtX3Iqd3N1bSk7CisgICAgICAgICAgICAgICAgZHB0cltqXSA9ICh1Y2hhciliMDsgZHB0cltqKzFdID0gKHVjaGFyKWcwOyBkcHRyW2orMl0gPSAodWNoYXIpcjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworICAgIGN2RnJlZSggJmNvbG9yX3dlaWdodCApOworICAgIGN2RnJlZSggJnNwYWNlX3dlaWdodCApOworICAgIGN2RnJlZSggJnNwYWNlX29mcyApOworfQorCisKK3N0YXRpYyB2b2lkIGljdkJpbGF0ZXJhbEZpbHRlcmluZ18zMmYoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsIGludCBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNpZ21hX2NvbG9yLCBkb3VibGUgc2lnbWFfc3BhY2UgKQoreworICAJQ3ZNYXQqIHRlbXAgPSAwOworICAgIGZsb2F0KiBzcGFjZV93ZWlnaHQgPSAwOworICAgIGludCogc3BhY2Vfb2ZzID0gMDsKKyAgICBmbG9hdCAqZXhwTFVUID0gMDsKKyAKKyAgICBDVl9GVU5DTkFNRSggImljdkJpbGF0ZXJhbEZpbHRlcmluZ18zMmYiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIGdhdXNzX2NvbG9yX2NvZWZmID0gLTAuNS8oc2lnbWFfY29sb3Iqc2lnbWFfY29sb3IpOworICAgIGRvdWJsZSBnYXVzc19zcGFjZV9jb2VmZiA9IC0wLjUvKHNpZ21hX3NwYWNlKnNpZ21hX3NwYWNlKTsKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oc3JjLT50eXBlKTsKKyAgICBpbnQgaSwgaiwgaywgbWF4aywgcmFkaXVzOworICAgIGRvdWJsZSBtaW5WYWxTcmM9LTEsIG1heFZhbFNyYz0xOworICAgIGNvbnN0IGludCBrRXhwTnVtQmluc1BlckNoYW5uZWwgPSAxIDw8IDEyOworICAgIGludCBrRXhwTnVtQmlucyA9IDA7CisgICAgZmxvYXQgbGFzdEV4cFZhbCA9IDEuZjsKKyAgICBpbnQgdGVtcF9zdGVwOworICAgIGZsb2F0IGxlbiwgc2NhbGVfaW5kZXg7CisgICAgQ3ZNYXQgc3JjX3Jlc2hhcGVkOworCisgICAgQ3ZTaXplIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKworICAgIGlmKCAoQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICBDVl9NQVRfVFlQRShzcmMtPnR5cGUpICE9IENWXzMyRkMzKSB8fAorICAgICAgICAhQ1ZfQVJFX1RZUEVTX0VRKHNyYywgZHN0KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIkJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBtdXN0IGJlIDMyLWJpdCBmbG9hdCwgc2luZ2xlLWNoYW5uZWwgb3IgMy1jaGFubmVsIGltYWdlcyIgKTsKKworICAgIGlmKCBzaWdtYV9jb2xvciA8PSAwICkKKyAgICAgICAgc2lnbWFfY29sb3IgPSAxOworICAgIGlmKCBzaWdtYV9zcGFjZSA8PSAwICkKKyAgICAgICAgc2lnbWFfc3BhY2UgPSAxOworCisgICAgaWYoIGQgPT0gMCApCisgICAgICAgIHJhZGl1cyA9IGN2Um91bmQoc2lnbWFfc3BhY2UqMS41KTsKKyAgICBlbHNlCisgICAgICAgIHJhZGl1cyA9IGQvMjsKKyAgICByYWRpdXMgPSBNQVgocmFkaXVzLCAxKTsKKyAgICBkID0gcmFkaXVzKjIgKyAxOworICAgIC8vIGNvbXB1dGUgdGhlIG1pbi9tYXggcmFuZ2UgZm9yIHRoZSBpbnB1dCBpbWFnZSAoZXZlbiBpZiBtdWx0aWNoYW5uZWwpCisgICAgCisgICAgQ1ZfQ0FMTCggY3ZSZXNoYXBlKCBzcmMsICZzcmNfcmVzaGFwZWQsIDEgKSApOyAgIAorICAgIENWX0NBTEwoIGN2TWluTWF4TG9jKCZzcmNfcmVzaGFwZWQsICZtaW5WYWxTcmMsICZtYXhWYWxTcmMpICk7IAorICAgIAorICAgIC8vIHRlbXBvcmFyeSBjb3B5IG9mIHRoZSBpbWFnZSB3aXRoIGJvcmRlcnMgZm9yIGVhc3kgcHJvY2Vzc2luZworICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggc3JjLT5yb3dzICsgcmFkaXVzKjIsCisgICAgICAgIHNyYy0+Y29scyArIHJhZGl1cyoyLCBzcmMtPnR5cGUgKSk7CisgICAgdGVtcF9zdGVwID0gdGVtcC0+c3RlcC9zaXplb2YoZmxvYXQpOworICAgIENWX0NBTEwoIGN2Q29weU1ha2VCb3JkZXIoIHNyYywgdGVtcCwgY3ZQb2ludChyYWRpdXMscmFkaXVzKSwgSVBMX0JPUkRFUl9SRVBMSUNBVEUgKSk7CisgICAgLy8gYWxsb2NhdGUgbG9va3VwIHRhYmxlcworICAgIENWX0NBTEwoIHNwYWNlX3dlaWdodCA9IChmbG9hdCopY3ZBbGxvYyhkKmQqc2l6ZW9mKHNwYWNlX3dlaWdodFswXSkpKTsKKyAgICBDVl9DQUxMKCBzcGFjZV9vZnMgPSAoaW50KiljdkFsbG9jKGQqZCpzaXplb2Yoc3BhY2Vfb2ZzWzBdKSkpOworICAgCisgICAgLy8gYXNzaWduIGEgbGVuZ3RoIHdoaWNoIGlzIHNsaWdodGx5IG1vcmUgdGhhbiBuZWVkZWQKKyAgICBsZW4gPSAoZmxvYXQpKG1heFZhbFNyYyAtIG1pblZhbFNyYykgKiBjbjsKKyAgICBrRXhwTnVtQmlucyA9IGtFeHBOdW1CaW5zUGVyQ2hhbm5lbCAqIGNuOworICAgIENWX0NBTEwoIGV4cExVVCA9IChmbG9hdCopY3ZBbGxvYygoa0V4cE51bUJpbnMrMikgKiBzaXplb2YoZXhwTFVUWzBdKSkpOworICAgIHNjYWxlX2luZGV4ID0ga0V4cE51bUJpbnMvbGVuOworICAgIAorICAgIC8vIGluaXRpYWxpemUgdGhlIGV4cCBMVVQKKyAgICBmb3IoIGkgPSAwOyBpIDwga0V4cE51bUJpbnMrMjsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBsYXN0RXhwVmFsID4gMC5mICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbCA9ICBpIC8gc2NhbGVfaW5kZXg7CisgICAgICAgICAgICBleHBMVVRbaV0gPSAoZmxvYXQpZXhwKHZhbCAqIHZhbCAqIGdhdXNzX2NvbG9yX2NvZWZmKTsKKyAgICAgICAgICAgIGxhc3RFeHBWYWwgPSBleHBMVVRbaV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXhwTFVUW2ldID0gMC5mOworICAgIH0KKyAgICAKKyAgICAvLyBpbml0aWFsaXplIHNwYWNlLXJlbGF0ZWQgYmlsYXRlcmFsIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICBmb3IoIGkgPSAtcmFkaXVzLCBtYXhrID0gMDsgaSA8PSByYWRpdXM7IGkrKyApCisgICAgICAgIGZvciggaiA9IC1yYWRpdXM7IGogPD0gcmFkaXVzOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgciA9IHNxcnQoKGRvdWJsZSlpKmkgKyAoZG91YmxlKWoqaik7CisgICAgICAgICAgICBpZiggciA+IHJhZGl1cyApCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzcGFjZV93ZWlnaHRbbWF4a10gPSAoZmxvYXQpZXhwKHIqcipnYXVzc19zcGFjZV9jb2VmZik7CisgICAgICAgICAgICBzcGFjZV9vZnNbbWF4aysrXSA9IGkqdGVtcF9zdGVwICsgaipjbjsKKyAgICAgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKQorICAgIHsKKwkgICAgY29uc3QgZmxvYXQqIHNwdHIgPSB0ZW1wLT5kYXRhLmZsICsgKGkrcmFkaXVzKSp0ZW1wX3N0ZXAgKyByYWRpdXMqY247CisgICAgICAgIGZsb2F0KiBkcHRyID0gKGZsb2F0KikoZHN0LT5kYXRhLnB0ciArIGkqZHN0LT5zdGVwKTsKKworICAgICAgICBpZiggY24gPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IHN1bSA9IDAsIHdzdW0gPSAwOworICAgICAgICAgICAgICAgIGZsb2F0IHZhbDAgPSBzcHRyW2pdOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtYXhrOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gc3B0cltqICsgc3BhY2Vfb2ZzW2tdXTsKKwkJCQkJZmxvYXQgYWxwaGEgPSAoZmxvYXQpKGZhYnModmFsIC0gdmFsMCkqc2NhbGVfaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gY3ZGbG9vcihhbHBoYSk7CisgICAgICAgICAgICAgICAgICAgIGFscGhhIC09IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdyA9IHNwYWNlX3dlaWdodFtrXSooZXhwTFVUW2lkeF0gKyBhbHBoYSooZXhwTFVUW2lkeCsxXSAtIGV4cExVVFtpZHhdKSk7CisJICAgICAgICAgICAgICAgIHN1bSArPSB2YWwqdzsKKyAgICAgICAgICAgICAgICAgICAgd3N1bSArPSB3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkcHRyW2pdID0gKGZsb2F0KShzdW0vd3N1bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoIGNuID09IDMgKTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoKjM7IGogKz0gMyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgc3VtX2IgPSAwLCBzdW1fZyA9IDAsIHN1bV9yID0gMCwgd3N1bSA9IDA7CisgICAgICAgICAgICAgICAgZmxvYXQgYjAgPSBzcHRyW2pdLCBnMCA9IHNwdHJbaisxXSwgcjAgPSBzcHRyW2orMl07CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG1heGs7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3B0cl9rID0gc3B0ciArIGogKyBzcGFjZV9vZnNba107CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGIgPSBzcHRyX2tbMF0sIGcgPSBzcHRyX2tbMV0sIHIgPSBzcHRyX2tbMl07CisJCQkJCWZsb2F0IGFscGhhID0gKGZsb2F0KSgoZmFicyhiIC0gYjApICsgZmFicyhnIC0gZzApICsgZmFicyhyIC0gcjApKSpzY2FsZV9pbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGludCBpZHggPSBjdkZsb29yKGFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgYWxwaGEgLT0gaWR4OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB3ID0gc3BhY2Vfd2VpZ2h0W2tdKihleHBMVVRbaWR4XSArIGFscGhhKihleHBMVVRbaWR4KzFdIC0gZXhwTFVUW2lkeF0pKTsKKyAgICAgICAgICAgICAgICAgICAgc3VtX2IgKz0gYip3OyBzdW1fZyArPSBnKnc7IHN1bV9yICs9IHIqdzsKKyAgICAgICAgICAgICAgICAgICAgd3N1bSArPSB3OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3c3VtID0gMS5mL3dzdW07CisgICAgICAgICAgICAgICAgYjAgPSBzdW1fYip3c3VtOworICAgICAgICAgICAgICAgIGcwID0gc3VtX2cqd3N1bTsKKyAgICAgICAgICAgICAgICByMCA9IHN1bV9yKndzdW07CisgICAgICAgICAgICAgICAgZHB0cltqXSA9IGIwOyBkcHRyW2orMV0gPSBnMDsgZHB0cltqKzJdID0gcjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJnRlbXAgKTsKKyAgICBjdkZyZWUoICZzcGFjZV93ZWlnaHQgKTsKKyAgICBjdkZyZWUoICZzcGFjZV9vZnMgKTsKKyAgICBjdkZyZWUoICZleHBMVVQgKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSVBQIHNtb290aGluZyBmdW5jdGlvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2ljdkZpbHRlck1lZGlhbl84dV9DMVJfdCBpY3ZGaWx0ZXJNZWRpYW5fOHVfQzFSX3AgPSAwOworaWN2RmlsdGVyTWVkaWFuXzh1X0MzUl90IGljdkZpbHRlck1lZGlhbl84dV9DM1JfcCA9IDA7CitpY3ZGaWx0ZXJNZWRpYW5fOHVfQzRSX3QgaWN2RmlsdGVyTWVkaWFuXzh1X0M0Ul9wID0gMDsKKworaWN2RmlsdGVyQm94Xzh1X0MxUl90IGljdkZpbHRlckJveF84dV9DMVJfcCA9IDA7CitpY3ZGaWx0ZXJCb3hfOHVfQzNSX3QgaWN2RmlsdGVyQm94Xzh1X0MzUl9wID0gMDsKK2ljdkZpbHRlckJveF84dV9DNFJfdCBpY3ZGaWx0ZXJCb3hfOHVfQzRSX3AgPSAwOworaWN2RmlsdGVyQm94XzMyZl9DMVJfdCBpY3ZGaWx0ZXJCb3hfMzJmX0MxUl9wID0gMDsKK2ljdkZpbHRlckJveF8zMmZfQzNSX3QgaWN2RmlsdGVyQm94XzMyZl9DM1JfcCA9IDA7CitpY3ZGaWx0ZXJCb3hfMzJmX0M0Ul90IGljdkZpbHRlckJveF8zMmZfQzRSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZTbW9vdGhGaXhlZElQUEZ1bmMpCisoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgIEN2U2l6ZSBzaXplLCBDdlNpemUga3NpemUsIEN2UG9pbnQgYW5jaG9yICk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDVl9JTVBMIHZvaWQKK2N2U21vb3RoKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgaW50IHNtb290aF90eXBlLAorICAgICAgICAgIGludCBwYXJhbTEsIGludCBwYXJhbTIsIGRvdWJsZSBwYXJhbTMsIGRvdWJsZSBwYXJhbTQgKQoreworICAgIEN2Qm94RmlsdGVyIGJveF9maWx0ZXI7CisgICAgQ3ZTZXBGaWx0ZXIgZ2F1c3NpYW5fZmlsdGVyOworCisgICAgQ3ZNYXQqIHRlbXAgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNtb290aCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgc3JjX3R5cGUsIGRzdF90eXBlLCBkZXB0aCwgY247CisgICAgZG91YmxlIHNpZ21hMSA9IDAsIHNpZ21hMiA9IDA7CisgICAgYm9vbCBoYXZlX2lwcCA9IGljdkZpbHRlck1lZGlhbl84dV9DMVJfcCAhPSAwOworCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHNyY190eXBlID0gQ1ZfTUFUX1RZUEUoIHNyYy0+dHlwZSApOworICAgIGRzdF90eXBlID0gQ1ZfTUFUX1RZUEUoIGRzdC0+dHlwZSApOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHNyY190eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTihzcmNfdHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBzbW9vdGhfdHlwZSAhPSBDVl9CTFVSX05PX1NDQUxFICYmICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAiVGhlIHNwZWNpZmllZCBzbW9vdGhpbmcgYWxnb3JpdGhtIHJlcXVpcmVzIGlucHV0IGFuZCBvdXB1dCBhcnJheXMgYmUgb2YgdGhlIHNhbWUgdHlwZSIgKTsKKworICAgIGlmKCBzbW9vdGhfdHlwZSA9PSBDVl9CTFVSIHx8IHNtb290aF90eXBlID09IENWX0JMVVJfTk9fU0NBTEUgfHwKKyAgICAgICAgc21vb3RoX3R5cGUgPT0gQ1ZfR0FVU1NJQU4gfHwgc21vb3RoX3R5cGUgPT0gQ1ZfTUVESUFOICkKKyAgICB7CisgICAgICAgIC8vIGF1dG9tYXRpYyBkZXRlY3Rpb24gb2Yga2VybmVsIHNpemUgZnJvbSBzaWdtYQorICAgICAgICBpZiggc21vb3RoX3R5cGUgPT0gQ1ZfR0FVU1NJQU4gKQorICAgICAgICB7CisgICAgICAgICAgICBzaWdtYTEgPSBwYXJhbTM7CisgICAgICAgICAgICBzaWdtYTIgPSBwYXJhbTQgPyBwYXJhbTQgOiBwYXJhbTM7CisKKyAgICAgICAgICAgIGlmKCBwYXJhbTEgPT0gMCAmJiBzaWdtYTEgPiAwICkKKyAgICAgICAgICAgICAgICBwYXJhbTEgPSBjdlJvdW5kKHNpZ21hMSooZGVwdGggPT0gQ1ZfOFUgPyAzIDogNCkqMiArIDEpfDE7CisgICAgICAgICAgICBpZiggcGFyYW0yID09IDAgJiYgc2lnbWEyID4gMCApCisgICAgICAgICAgICAgICAgcGFyYW0yID0gY3ZSb3VuZChzaWdtYTIqKGRlcHRoID09IENWXzhVID8gMyA6IDQpKjIgKyAxKXwxOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHBhcmFtMiA9PSAwICkKKyAgICAgICAgICAgIHBhcmFtMiA9IHNpemUuaGVpZ2h0ID09IDEgPyAxIDogcGFyYW0xOworICAgICAgICBpZiggcGFyYW0xIDwgMSB8fCAocGFyYW0xICYgMSkgPT0gMCB8fCBwYXJhbTIgPCAxIHx8IChwYXJhbTIgJiAxKSA9PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgICAgICJCb3RoIG1hc2sgd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlID49MSBhbmQgb2RkIiApOworCisgICAgICAgIGlmKCBwYXJhbTEgPT0gMSAmJiBwYXJhbTIgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCBkc3QgKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaGF2ZV9pcHAgJiYgKHNtb290aF90eXBlID09IENWX0JMVVIgfHwgKHNtb290aF90eXBlID09IENWX01FRElBTiAmJiBwYXJhbTEgPD0gMTUpKSAmJgorICAgICAgICBzaXplLndpZHRoID49IHBhcmFtMSAmJiBzaXplLmhlaWdodCA+PSBwYXJhbTIgJiYgcGFyYW0xID4gMSAmJiBwYXJhbTIgPiAxICkKKyAgICB7CisgICAgICAgIEN2U21vb3RoRml4ZWRJUFBGdW5jIGlwcF9tZWRpYW5fYm94X2Z1bmMgPSAwOworCisgICAgICAgIGlmKCBzbW9vdGhfdHlwZSA9PSBDVl9CTFVSICkKKyAgICAgICAgeworICAgICAgICAgICAgaXBwX21lZGlhbl9ib3hfZnVuYyA9CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDMSA/IGljdkZpbHRlckJveF84dV9DMVJfcCA6CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDMyA/IGljdkZpbHRlckJveF84dV9DM1JfcCA6CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDNCA/IGljdkZpbHRlckJveF84dV9DNFJfcCA6CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfMzJGQzEgPyBpY3ZGaWx0ZXJCb3hfMzJmX0MxUl9wIDoKKyAgICAgICAgICAgICAgICBzcmNfdHlwZSA9PSBDVl8zMkZDMyA/IGljdkZpbHRlckJveF8zMmZfQzNSX3AgOgorICAgICAgICAgICAgICAgIHNyY190eXBlID09IENWXzMyRkM0ID8gaWN2RmlsdGVyQm94XzMyZl9DNFJfcCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggc21vb3RoX3R5cGUgPT0gQ1ZfTUVESUFOICkKKyAgICAgICAgeworICAgICAgICAgICAgaXBwX21lZGlhbl9ib3hfZnVuYyA9CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDMSA/IGljdkZpbHRlck1lZGlhbl84dV9DMVJfcCA6CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDMyA/IGljdkZpbHRlck1lZGlhbl84dV9DM1JfcCA6CisgICAgICAgICAgICAgICAgc3JjX3R5cGUgPT0gQ1ZfOFVDNCA/IGljdkZpbHRlck1lZGlhbl84dV9DNFJfcCA6IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiggaXBwX21lZGlhbl9ib3hfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U2l6ZSBlbF9zaXplID0geyBwYXJhbTEsIHBhcmFtMiB9OworICAgICAgICAgICAgQ3ZQb2ludCBlbF9hbmNob3IgPSB7IHBhcmFtMS8yLCBwYXJhbTIvMiB9OworICAgICAgICAgICAgaW50IHN0cmlwZV9zaXplID0gMSA8PCAxNDsgLy8gdGhlIG9wdGltYWwgdmFsdWUgbWF5IGRlcGVuZCBvbiBDUFUgY2FjaGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdmVyaGVhZCBvZiB0aGUgY3VycmVudCBJUFAgY29kZSBldGMuCisgICAgICAgICAgICBjb25zdCB1Y2hhciogc2hpZnRlZF9wdHI7CisgICAgICAgICAgICBpbnQgeSwgZHkgPSAwOworICAgICAgICAgICAgaW50IHRlbXBfc3RlcCwgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisKKyAgICAgICAgICAgIENWX0NBTEwoIHRlbXAgPSBpY3ZJUFBGaWx0ZXJJbml0KCBzcmMsIHN0cmlwZV9zaXplLCBlbF9zaXplICkpOworCisgICAgICAgICAgICBzaGlmdGVkX3B0ciA9IHRlbXAtPmRhdGEucHRyICsKKyAgICAgICAgICAgICAgICBlbF9hbmNob3IueSp0ZW1wLT5zdGVwICsgZWxfYW5jaG9yLngqQ1ZfRUxFTV9TSVpFKHNyY190eXBlKTsKKyAgICAgICAgICAgIHRlbXBfc3RlcCA9IHRlbXAtPnN0ZXAgPyB0ZW1wLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc3JjLT5yb3dzOyB5ICs9IGR5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkeSA9IGljdklQUEZpbHRlck5leHRTdHJpcGUoIHNyYywgdGVtcCwgeSwgZWxfc2l6ZSwgZWxfYW5jaG9yICk7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpcHBfbWVkaWFuX2JveF9mdW5jKCBzaGlmdGVkX3B0ciwgdGVtcF9zdGVwLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyICsgeSpkc3Rfc3RlcCwgZHN0X3N0ZXAsIGN2U2l6ZShzcmMtPmNvbHMsIGR5KSwKKyAgICAgICAgICAgICAgICAgICAgZWxfc2l6ZSwgZWxfYW5jaG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzbW9vdGhfdHlwZSA9PSBDVl9CTFVSIHx8IHNtb290aF90eXBlID09IENWX0JMVVJfTk9fU0NBTEUgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYm94X2ZpbHRlci5pbml0KCBzcmMtPmNvbHMsIHNyY190eXBlLCBkc3RfdHlwZSwKKyAgICAgICAgICAgIHNtb290aF90eXBlID09IENWX0JMVVIsIGN2U2l6ZShwYXJhbTEsIHBhcmFtMikgKSk7CisgICAgICAgIENWX0NBTEwoIGJveF9maWx0ZXIucHJvY2Vzcyggc3JjLCBkc3QgKSk7CisgICAgfQorICAgIGVsc2UgaWYoIHNtb290aF90eXBlID09IENWX01FRElBTiApCisgICAgeworICAgICAgICBpbnQgaW1nX3NpemVfbXAgPSBzaXplLndpZHRoKnNpemUuaGVpZ2h0OworICAgICAgICBpbWdfc2l6ZV9tcCA9IChpbWdfc2l6ZV9tcCArICgxPDwxOSkpID4+IDIwOworCisgICAgICAgIGlmKCBkZXB0aCAhPSBDVl84VSB8fCAoY24gIT0gMSAmJiBjbiAhPSAzICYmIGNuICE9IDQpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJNZWRpYW4gZmlsdGVyIG9ubHkgc3VwcG9ydHMgOHVDMSwgOHVDMyBhbmQgOHVDNCBpbWFnZXMiICk7CisKKyAgICAgICAgaWYoIHNpemUud2lkdGggPCBwYXJhbTEqMiB8fCBzaXplLmhlaWdodCA8IHBhcmFtMSoyIHx8CisgICAgICAgICAgICBwYXJhbTEgPD0gMyArIChpbWdfc2l6ZV9tcCA8IDEgPyAxMiA6IGltZ19zaXplX21wIDwgNCA/IDYgOiAyKSooTUVESUFOX0hBVkVfU0lNRCA/IDEgOiAzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIG9wdGltaXplZCBmb3IgM3gzCisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdk1lZGlhbkJsdXJfOHVfQ25SX09tKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsCisgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBzaXplLCBwYXJhbTEsIGNuICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHIgPSAocGFyYW0xIC0gMSkgLyAyOworICAgICAgICAgICAgY29uc3QgaW50IENBQ0hFX1NJWkUgPSAoaW50KSAoIDAuOTUgKiAyNTYgKiAxMDI0IC8gY24gKTsgIC8vIGFzc3VtZSBhIDI1NiBrQiBjYWNoZSBzaXplCisgICAgICAgICAgICBjb25zdCBpbnQgU1RSSVBFUyA9IChpbnQpIGN2Q2VpbCggKGRvdWJsZSkgKHNpemUud2lkdGggLSAyKnIpIC8KKyAgICAgICAgICAgICAgICAgICAgKENBQ0hFX1NJWkUgLyBzaXplb2YoSGlzdG9ncmFtKSAtIDIqcikgKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBTVFJJUEVfU0laRSA9IChpbnQpIGN2Q2VpbCgKKyAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkgKCBzaXplLndpZHRoICsgU1RSSVBFUyoyKnIgLSAyKnIgKSAvIFNUUklQRVMgKTsKKworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpICs9IFNUUklQRV9TSVpFIC0gMipyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RyaXBlID0gU1RSSVBFX1NJWkU7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZpbHRlciBrZXJuZWwgZml0cyBpbnRvIG9uZSBzdHJpcGUuCisgICAgICAgICAgICAgICAgaWYoIGkgKyBTVFJJUEVfU0laRSAtIDIqciA+PSBzaXplLndpZHRoIHx8CisgICAgICAgICAgICAgICAgICAgIHNpemUud2lkdGggLSAoaSArIFNUUklQRV9TSVpFIC0gMipyKSA8IDIqcisxICkKKyAgICAgICAgICAgICAgICAgICAgc3RyaXBlID0gc2l6ZS53aWR0aCAtIGk7CisKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdk1lZGlhbkJsdXJfOHVfQ25SX08xKCBzcmMtPmRhdGEucHRyICsgY24qaSwgc3JjLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyICsgY24qaSwgZHN0LT5zdGVwLCBjdlNpemUoc3RyaXBlLCBzaXplLmhlaWdodCksCisgICAgICAgICAgICAgICAgICAgIHBhcmFtMSwgY24sIGkgPT0gMCwgc3RyaXBlID09IHNpemUud2lkdGggLSBpICkpOworCisgICAgICAgICAgICAgICAgaWYoIHN0cmlwZSA9PSBzaXplLndpZHRoIC0gaSApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIHNtb290aF90eXBlID09IENWX0dBVVNTSUFOICkKKyAgICB7CisgICAgICAgIEN2U2l6ZSBrc2l6ZSA9IHsgcGFyYW0xLCBwYXJhbTIgfTsKKyAgICAgICAgZmxvYXQqIGt4ID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGtzaXplLndpZHRoKnNpemVvZihreFswXSkgKTsKKyAgICAgICAgZmxvYXQqIGt5ID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGtzaXplLmhlaWdodCpzaXplb2Yoa3lbMF0pICk7CisgICAgICAgIEN2TWF0IEtYID0gY3ZNYXQoIDEsIGtzaXplLndpZHRoLCBDVl8zMkYsIGt4ICk7CisgICAgICAgIEN2TWF0IEtZID0gY3ZNYXQoIDEsIGtzaXplLmhlaWdodCwgQ1ZfMzJGLCBreSApOworICAgICAgICAKKyAgICAgICAgQ3ZTZXBGaWx0ZXI6OmluaXRfZ2F1c3NpYW5fa2VybmVsKCAmS1gsIHNpZ21hMSApOworICAgICAgICBpZigga3NpemUud2lkdGggIT0ga3NpemUuaGVpZ2h0IHx8IGZhYnMoc2lnbWExIC0gc2lnbWEyKSA+IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIEN2U2VwRmlsdGVyOjppbml0X2dhdXNzaWFuX2tlcm5lbCggJktZLCBzaWdtYTIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgS1kuZGF0YS5mbCA9IGt4OworICAgICAgICAKKyAgICAgICAgaWYoIGhhdmVfaXBwICYmIHNpemUud2lkdGggPj0gcGFyYW0xKjMgJiYKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID49IHBhcmFtMiAmJiBwYXJhbTEgPiAxICYmIHBhcmFtMiA+IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZG9uZTsKKyAgICAgICAgICAgIENWX0NBTEwoIGRvbmUgPSBpY3ZJUFBTZXBGaWx0ZXIoIHNyYywgZHN0LCAmS1gsICZLWSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2UG9pbnQoa3NpemUud2lkdGgvMixrc2l6ZS5oZWlnaHQvMikpKTsKKyAgICAgICAgICAgIGlmKCBkb25lICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICB9CisKKyAgICAgICAgQ1ZfQ0FMTCggZ2F1c3NpYW5fZmlsdGVyLmluaXQoIHNyYy0+Y29scywgc3JjX3R5cGUsIGRzdF90eXBlLCAmS1gsICZLWSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggZ2F1c3NpYW5fZmlsdGVyLnByb2Nlc3MoIHNyYywgZHN0ICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBzbW9vdGhfdHlwZSA9PSBDVl9CSUxBVEVSQUwgKQorICAgIHsKKyAgICAgICAgaWYoIHBhcmFtMiAhPSAwICYmIChwYXJhbTIgIT0gcGFyYW0xIHx8IHBhcmFtMSAlIDIgPT0gMCkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJCaWxhdGVyYWwgZmlsdGVyIG9ubHkgc3VwcG9ydHMgc3F1YXJlIHdpbmRvd3Mgb2Ygb2RkIHNpemUiICk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2goIHNyY190eXBlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIENWXzMyRkMxOgorICAgICAgICBjYXNlIENWXzMyRkMzOgorICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2QmlsYXRlcmFsRmlsdGVyaW5nXzMyZiggc3JjLCBkc3QsIHBhcmFtMSwgcGFyYW0zLCBwYXJhbTQgKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl84VUMxOgorICAgICAgICBjYXNlIENWXzhVQzM6CisgICAgICAgICAgICBDVl9DQUxMKCBpY3ZCaWxhdGVyYWxGaWx0ZXJpbmdfOHUoIHNyYywgZHN0LCBwYXJhbTEsIHBhcmFtMywgcGFyYW00ICkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgIlVua25vd24vdW5zdXBwb3J0ZWQgZm9ybWF0OiBiaWxhdGVyYWwgZmlsdGVyIG9ubHkgc3VwcG9ydHMgOHVDMSwgOHVDMywgMzJmQzEgYW5kIDMyZkMzIGZvcm1hdHMiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnNuYWtlcy5jcHAgYi9jdi9zcmMvY3ZzbmFrZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNGU5MGEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZzbmFrZXMuY3BwCkBAIC0wLDAgKzEsNDM4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKworI2RlZmluZSBfQ1ZfU05BS0VfQklHIDIuZSszOGYKKyNkZWZpbmUgX0NWX1NOQUtFX0lNQUdFIDEKKyNkZWZpbmUgX0NWX1NOQUtFX0dSQUQgIDIKKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6ICAgICAgaWN2U25ha2U4dUMxUiAgICAgCisvLyAgICBQdXJwb3NlOiAgIAorLy8gICAgQ29udGV4dDogICAKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgICAgICAgIHNyYyAtIHNvdXJjZSBpbWFnZSwKKy8vICAgICAgICAgICAgICAgc3JjU3RlcCAtIGl0cyBzdGVwIGluIGJ5dGVzLAorLy8gICAgICAgICAgICAgICByb2kgLSBzaXplIG9mIFJPSSwKKy8vICAgICAgICAgICAgICAgcHQgLSBwb2ludGVyIHRvIHNuYWtlIHBvaW50cyBhcnJheQorLy8gICAgICAgICAgICAgICBuIC0gc2l6ZSBvZiBwb2ludHMgYXJyYXksIAorLy8gICAgICAgICAgICAgICBhbHBoYSAtIHBvaW50ZXIgdG8gY29lZmZpY2llbnQgb2YgY29udGludWl0eSBlbmVyZ3ksIAorLy8gICAgICAgICAgICAgICBiZXRhIC0gcG9pbnRlciB0byBjb2VmZmljaWVudCBvZiBjdXJ2YXR1cmUgZW5lcmd5LCAgCisvLyAgICAgICAgICAgICAgIGdhbW1hIC0gcG9pbnRlciB0byBjb2VmZmljaWVudCBvZiBpbWFnZSBlbmVyZ3ksICAKKy8vICAgICAgICAgICAgICAgY29lZmZVc2FnZSAtIGlmIENWX1ZBTFVFIC0gYWxwaGEsIGJldGEsIGdhbW1hIHBvaW50IHRvIHNpbmdsZSB2YWx1ZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgQ1ZfTUFUQVkgLSBwb2ludCB0byBhcnJheXMKKy8vICAgICAgICAgICAgICAgY3JpdGVyaWEgLSB0ZXJtaW5hdGlvbiBjcml0ZXJpYS4KKy8vICAgICAgICAgICAgICAgc2NoZW1lIC0gaW1hZ2UgZW5lcmd5IHNjaGVtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgX0NWX1NOQUtFX0lNQUdFIC0gaW1hZ2UgaW50ZW5zaXR5IGlzIGVuZXJneQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaWYgX0NWX1NOQUtFX0dSQUQgIC0gbWFnbml0dWRlIG9mIGdyYWRpZW50IGlzIGVuZXJneQorLy8gICAgUmV0dXJuczogICAKKy8vRiovCisKK3N0YXRpYyBDdlN0YXR1cworaWN2U25ha2U4dUMxUiggdW5zaWduZWQgY2hhciAqc3JjLAorICAgICAgICAgICAgICAgaW50IHNyY1N0ZXAsCisgICAgICAgICAgICAgICBDdlNpemUgcm9pLAorICAgICAgICAgICAgICAgQ3ZQb2ludCAqIHB0LAorICAgICAgICAgICAgICAgaW50IG4sCisgICAgICAgICAgICAgICBmbG9hdCAqYWxwaGEsCisgICAgICAgICAgICAgICBmbG9hdCAqYmV0YSwKKyAgICAgICAgICAgICAgIGZsb2F0ICpnYW1tYSwKKyAgICAgICAgICAgICAgIGludCBjb2VmZlVzYWdlLCBDdlNpemUgd2luLCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwgaW50IHNjaGVtZSApCit7CisgICAgaW50IGksIGosIGs7CisgICAgaW50IG5laWdoYm9ycyA9IHdpbi5oZWlnaHQgKiB3aW4ud2lkdGg7CisKKyAgICBpbnQgY2VudGVyeCA9IHdpbi53aWR0aCA+PiAxOworICAgIGludCBjZW50ZXJ5ID0gd2luLmhlaWdodCA+PiAxOworCisgICAgZmxvYXQgaW52bjsKKyAgICBpbnQgaXRlcmF0aW9uID0gMDsKKyAgICBpbnQgY29udmVyZ2VkID0gMDsKKwkKKworICAgIGZsb2F0ICpFY29udDsKKyAgICBmbG9hdCAqRWN1cnY7CisgICAgZmxvYXQgKkVpbWc7CisgICAgZmxvYXQgKkU7CisKKyAgICBmbG9hdCBfYWxwaGEsIF9iZXRhLCBfZ2FtbWE7CisKKyAgICAvKiNpZmRlZiBHUkFEX1NOQUtFICovCisgICAgZmxvYXQgKmdyYWRpZW50ID0gTlVMTDsKKyAgICB1Y2hhciAqbWFwID0gTlVMTDsKKyAgICBpbnQgbWFwX3dpZHRoID0gKChyb2kud2lkdGggLSAxKSA+PiAzKSArIDE7CisgICAgaW50IG1hcF9oZWlnaHQgPSAoKHJvaS5oZWlnaHQgLSAxKSA+PiAzKSArIDE7CisgICAgQ3ZTZXBGaWx0ZXIgcFgsIHBZOworICAgICNkZWZpbmUgV1RJTEVfU0laRSA4CisgICAgI2RlZmluZSBUSUxFX1NJWkUgKFdUSUxFX1NJWkUgKyAyKSAgICAgICAgCisgICAgc2hvcnQgZHhbVElMRV9TSVpFKlRJTEVfU0laRV0sIGR5W1RJTEVfU0laRSpUSUxFX1NJWkVdOworICAgIEN2TWF0IF9keCA9IGN2TWF0KCBUSUxFX1NJWkUsIFRJTEVfU0laRSwgQ1ZfMTZTQzEsIGR4ICk7CisgICAgQ3ZNYXQgX2R5ID0gY3ZNYXQoIFRJTEVfU0laRSwgVElMRV9TSVpFLCBDVl8xNlNDMSwgZHkgKTsKKyAgICBDdk1hdCBfc3JjID0gY3ZNYXQoIHJvaS5oZWlnaHQsIHJvaS53aWR0aCwgQ1ZfOFVDMSwgc3JjICk7CisKKyAgICAvKiBpbm5lciBidWZmZXIgb2YgY29udm9sdXRpb24gcHJvY2VzcyAqLworICAgIC8vY2hhciBDb252QnVmZmVyWzQwMF07CisKKyAgICAvKiNlbmRpZiAqLworCisKKyAgICAvKiBjaGVjayBiYWQgYXJndW1lbnRzICovCisgICAgaWYoIHNyYyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCAocm9pLmhlaWdodCA8PSAwKSB8fCAocm9pLndpZHRoIDw9IDApICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCBzcmNTdGVwIDwgcm9pLndpZHRoICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCBwdCA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBuIDwgMyApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggYWxwaGEgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggYmV0YSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBnYW1tYSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBjb2VmZlVzYWdlICE9IENWX1ZBTFVFICYmIGNvZWZmVXNhZ2UgIT0gQ1ZfQVJSQVkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisgICAgaWYoICh3aW4uaGVpZ2h0IDw9IDApIHx8ICghKHdpbi5oZWlnaHQgJiAxKSkpCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggKHdpbi53aWR0aCA8PSAwKSB8fCAoISh3aW4ud2lkdGggJiAxKSkpCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGludm4gPSAxIC8gKChmbG9hdCkgbik7CisKKyAgICBpZiggc2NoZW1lID09IF9DVl9TTkFLRV9HUkFEICkKKyAgICB7CisgICAgICAgIHBYLmluaXRfZGVyaXYoIFRJTEVfU0laRSsyLCBDVl84VUMxLCBDVl8xNlNDMSwgMSwgMCwgMyApOworICAgICAgICBwWS5pbml0X2Rlcml2KCBUSUxFX1NJWkUrMiwgQ1ZfOFVDMSwgQ1ZfMTZTQzEsIDAsIDEsIDMgKTsKKworICAgICAgICBncmFkaWVudCA9IChmbG9hdCAqKSBjdkFsbG9jKCByb2kuaGVpZ2h0ICogcm9pLndpZHRoICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgICAgICBpZiggIWdyYWRpZW50ICkKKyAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIG1hcCA9ICh1Y2hhciAqKSBjdkFsbG9jKCBtYXBfd2lkdGggKiBtYXBfaGVpZ2h0ICk7CisgICAgICAgIGlmKCAhbWFwICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZGcmVlKCAmZ3JhZGllbnQgKTsKKyAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIH0KKyAgICAgICAgLyogY2xlYXIgbWFwIC0gbm8gZ3JhZGllbnQgY29tcHV0ZWQgKi8KKyAgICAgICAgbWVtc2V0KCAodm9pZCAqKSBtYXAsIDAsIG1hcF93aWR0aCAqIG1hcF9oZWlnaHQgKTsKKyAgICB9CisgICAgRWNvbnQgPSAoZmxvYXQgKikgY3ZBbGxvYyggbmVpZ2hib3JzICogc2l6ZW9mKCBmbG9hdCApKTsKKyAgICBFY3VydiA9IChmbG9hdCAqKSBjdkFsbG9jKCBuZWlnaGJvcnMgKiBzaXplb2YoIGZsb2F0ICkpOworICAgIEVpbWcgPSAoZmxvYXQgKikgY3ZBbGxvYyggbmVpZ2hib3JzICogc2l6ZW9mKCBmbG9hdCApKTsKKyAgICBFID0gKGZsb2F0ICopIGN2QWxsb2MoIG5laWdoYm9ycyAqIHNpemVvZiggZmxvYXQgKSk7CisKKyAgICB3aGlsZSggIWNvbnZlcmdlZCApCisgICAgeworICAgICAgICBmbG9hdCBhdmVfZCA9IDA7CisgICAgICAgIGludCBtb3ZlZCA9IDA7CisKKyAgICAgICAgY29udmVyZ2VkID0gMDsKKyAgICAgICAgaXRlcmF0aW9uKys7CisgICAgICAgIC8qIGNvbXB1dGUgYXZlcmFnZSBkaXN0YW5jZSAqLworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRpZmZ4ID0gcHRbaSAtIDFdLnggLSBwdFtpXS54OworICAgICAgICAgICAgaW50IGRpZmZ5ID0gcHRbaSAtIDFdLnkgLSBwdFtpXS55OworCisgICAgICAgICAgICBhdmVfZCArPSBjdlNxcnQoIChmbG9hdCkgKGRpZmZ4ICogZGlmZnggKyBkaWZmeSAqIGRpZmZ5KSApOworICAgICAgICB9CisgICAgICAgIGF2ZV9kICs9IGN2U3FydCggKGZsb2F0KSAoKHB0WzBdLnggLSBwdFtuIC0gMV0ueCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwdFswXS54IC0gcHRbbiAtIDFdLngpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHRbMF0ueSAtIHB0W24gLSAxXS55KSAqIChwdFswXS55IC0gcHRbbiAtIDFdLnkpKSk7CisKKyAgICAgICAgYXZlX2QgKj0gaW52bjsKKyAgICAgICAgLyogYXZlcmFnZSBkaXN0YW5jZSBjb21wdXRlZCAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogQ2FsY3VsYXRlIEVjb250ICovCisgICAgICAgICAgICBmbG9hdCBtYXhFY29udCA9IDA7CisgICAgICAgICAgICBmbG9hdCBtYXhFY3VydiA9IDA7CisgICAgICAgICAgICBmbG9hdCBtYXhFaW1nID0gMDsKKyAgICAgICAgICAgIGZsb2F0IG1pbkVjb250ID0gX0NWX1NOQUtFX0JJRzsKKyAgICAgICAgICAgIGZsb2F0IG1pbkVjdXJ2ID0gX0NWX1NOQUtFX0JJRzsKKyAgICAgICAgICAgIGZsb2F0IG1pbkVpbWcgPSBfQ1ZfU05BS0VfQklHOworICAgICAgICAgICAgZmxvYXQgRW1pbiA9IF9DVl9TTkFLRV9CSUc7CisKKyAgICAgICAgICAgIGludCBvZmZzZXR4ID0gMDsKKyAgICAgICAgICAgIGludCBvZmZzZXR5ID0gMDsKKyAgICAgICAgICAgIGZsb2F0IHRtcDsKKworICAgICAgICAgICAgLyogY29tcHV0ZSBib3VuZHMgKi8KKyAgICAgICAgICAgIGludCBsZWZ0ID0gTUlOKCBwdFtpXS54LCB3aW4ud2lkdGggPj4gMSApOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gTUlOKCByb2kud2lkdGggLSAxIC0gcHRbaV0ueCwgd2luLndpZHRoID4+IDEgKTsKKyAgICAgICAgICAgIGludCB1cHBlciA9IE1JTiggcHRbaV0ueSwgd2luLmhlaWdodCA+PiAxICk7CisgICAgICAgICAgICBpbnQgYm90dG9tID0gTUlOKCByb2kuaGVpZ2h0IC0gMSAtIHB0W2ldLnksIHdpbi5oZWlnaHQgPj4gMSApOworCisgICAgICAgICAgICBtYXhFY29udCA9IDA7CisgICAgICAgICAgICBtaW5FY29udCA9IF9DVl9TTkFLRV9CSUc7CisgICAgICAgICAgICBmb3IoIGogPSAtdXBwZXI7IGogPD0gYm90dG9tOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggayA9IC1sZWZ0OyBrIDw9IHJpZ2h0OyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGRpZmZ4LCBkaWZmeTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZW5lcmd5OworCisgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmeCA9IHB0W24gLSAxXS54IC0gKHB0W2ldLnggKyBrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZ5ID0gcHRbbiAtIDFdLnkgLSAocHRbaV0ueSArIGopOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZnggPSBwdFtpIC0gMV0ueCAtIChwdFtpXS54ICsgayk7CisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmeSA9IHB0W2kgLSAxXS55IC0gKHB0W2ldLnkgKyBqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFY29udFsoaiArIGNlbnRlcnkpICogd2luLndpZHRoICsgayArIGNlbnRlcnhdID0gZW5lcmd5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgZmFicyggYXZlX2QgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNxcnQoIChmbG9hdCkgKGRpZmZ4ICogZGlmZnggKyBkaWZmeSAqIGRpZmZ5KSApKTsKKworICAgICAgICAgICAgICAgICAgICBtYXhFY29udCA9IE1BWCggbWF4RWNvbnQsIGVuZXJneSApOworICAgICAgICAgICAgICAgICAgICBtaW5FY29udCA9IE1JTiggbWluRWNvbnQsIGVuZXJneSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IG1heEVjb250IC0gbWluRWNvbnQ7CisgICAgICAgICAgICB0bXAgPSAodG1wID09IDApID8gMCA6ICgxIC8gdG1wKTsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBuZWlnaGJvcnM7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRWNvbnRba10gPSAoRWNvbnRba10gLSBtaW5FY29udCkgKiB0bXA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qICBDYWxjdWxhdGUgRWN1cnYgKi8KKyAgICAgICAgICAgIG1heEVjdXJ2ID0gMDsKKyAgICAgICAgICAgIG1pbkVjdXJ2ID0gX0NWX1NOQUtFX0JJRzsKKyAgICAgICAgICAgIGZvciggaiA9IC11cHBlcjsgaiA8PSBib3R0b207IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gLWxlZnQ7IGsgPD0gcmlnaHQ7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdHgsIHR5OworICAgICAgICAgICAgICAgICAgICBmbG9hdCBlbmVyZ3k7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4ID0gcHRbbiAtIDFdLnggLSAyICogKHB0W2ldLnggKyBrKSArIHB0W2kgKyAxXS54OworICAgICAgICAgICAgICAgICAgICAgICAgdHkgPSBwdFtuIC0gMV0ueSAtIDIgKiAocHRbaV0ueSArIGopICsgcHRbaSArIDFdLnk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggaSA9PSBuIC0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHR4ID0gcHRbaSAtIDFdLnggLSAyICogKHB0W2ldLnggKyBrKSArIHB0WzBdLng7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IHB0W2kgLSAxXS55IC0gMiAqIChwdFtpXS55ICsgaikgKyBwdFswXS55OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHggPSBwdFtpIC0gMV0ueCAtIDIgKiAocHRbaV0ueCArIGspICsgcHRbaSArIDFdLng7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9IHB0W2kgLSAxXS55IC0gMiAqIChwdFtpXS55ICsgaikgKyBwdFtpICsgMV0ueTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFY3VydlsoaiArIGNlbnRlcnkpICogd2luLndpZHRoICsgayArIGNlbnRlcnhdID0gZW5lcmd5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKHR4ICogdHggKyB0eSAqIHR5KTsKKyAgICAgICAgICAgICAgICAgICAgbWF4RWN1cnYgPSBNQVgoIG1heEVjdXJ2LCBlbmVyZ3kgKTsKKyAgICAgICAgICAgICAgICAgICAgbWluRWN1cnYgPSBNSU4oIG1pbkVjdXJ2LCBlbmVyZ3kgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBtYXhFY3VydiAtIG1pbkVjdXJ2OworICAgICAgICAgICAgdG1wID0gKHRtcCA9PSAwKSA/IDAgOiAoMSAvIHRtcCk7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbmVpZ2hib3JzOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVjdXJ2W2tdID0gKEVjdXJ2W2tdIC0gbWluRWN1cnYpICogdG1wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBDYWxjdWxhdGUgRWltZyAqLworICAgICAgICAgICAgZm9yKCBqID0gLXVwcGVyOyBqIDw9IGJvdHRvbTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAtbGVmdDsgayA8PSByaWdodDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGVuZXJneTsKKworICAgICAgICAgICAgICAgICAgICBpZiggc2NoZW1lID09IF9DVl9TTkFLRV9HUkFEICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogbG9vayBhdCBtYXAgYW5kIGNoZWNrIHN0YXR1cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHggPSAocHRbaV0ueCArIGspL1dUSUxFX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA9IChwdFtpXS55ICsgaikvV1RJTEVfU0laRTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hcFt5ICogbWFwX3dpZHRoICsgeF0gPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGwsIG07CQkJCQkJCQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXZhbHVhdGUgYmxvY2sgbG9jYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXBzaGlmdCA9IHkgPyAxIDogMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdHNoaWZ0ID0geCA/IDEgOiAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBib3R0b21zaGlmdCA9IE1JTiggMSwgcm9pLmhlaWdodCAtICh5ICsgMSkqV1RJTEVfU0laRSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByaWdodHNoaWZ0ID0gTUlOKCAxLCByb2kud2lkdGggLSAoeCArIDEpKldUSUxFX1NJWkUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgZ19yb2kgPSB7IHgqV1RJTEVfU0laRSAtIGxlZnRzaGlmdCwgeSpXVElMRV9TSVpFIC0gdXBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdHNoaWZ0ICsgV1RJTEVfU0laRSArIHJpZ2h0c2hpZnQsIHVwc2hpZnQgKyBXVElMRV9TSVpFICsgYm90dG9tc2hpZnQgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCBfc3JjMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkdldFN1YkFyciggJl9zcmMsICZfc3JjMSwgZ19yb2kgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBYLnByb2Nlc3MoICZfc3JjMSwgJl9keCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBZLnByb2Nlc3MoICZfc3JjMSwgJl9keSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IFdUSUxFX1NJWkUgKyBib3R0b21zaGlmdDsgbCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBXVElMRV9TSVpFICsgcmlnaHRzaGlmdDsgbSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhZGllbnRbKHkqV1RJTEVfU0laRSArIGwpICogcm9pLndpZHRoICsgeCpXVElMRV9TSVpFICsgbV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkgKGR4WyhsICsgdXBzaGlmdCkgKiBUSUxFX1NJWkUgKyBtICsgbGVmdHNoaWZ0XSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHhbKGwgKyB1cHNoaWZ0KSAqIFRJTEVfU0laRSArIG0gKyBsZWZ0c2hpZnRdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkeVsobCArIHVwc2hpZnQpICogVElMRV9TSVpFICsgbSArIGxlZnRzaGlmdF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5WyhsICsgdXBzaGlmdCkgKiBUSUxFX1NJWkUgKyBtICsgbGVmdHNoaWZ0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwW3kgKiBtYXBfd2lkdGggKyB4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBFaW1nWyhqICsgY2VudGVyeSkgKiB3aW4ud2lkdGggKyBrICsgY2VudGVyeF0gPSBlbmVyZ3kgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWRpZW50WyhwdFtpXS55ICsgaikgKiByb2kud2lkdGggKyBwdFtpXS54ICsga107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFaW1nWyhqICsgY2VudGVyeSkgKiB3aW4ud2lkdGggKyBrICsgY2VudGVyeF0gPSBlbmVyZ3kgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1socHRbaV0ueSArIGopICogc3JjU3RlcCArIHB0W2ldLnggKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG1heEVpbWcgPSBNQVgoIG1heEVpbWcsIGVuZXJneSApOworICAgICAgICAgICAgICAgICAgICBtaW5FaW1nID0gTUlOKCBtaW5FaW1nLCBlbmVyZ3kgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRtcCA9IChtYXhFaW1nIC0gbWluRWltZyk7CisgICAgICAgICAgICB0bXAgPSAodG1wID09IDApID8gMCA6ICgxIC8gdG1wKTsKKworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG5laWdoYm9yczsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFaW1nW2tdID0gKG1pbkVpbWcgLSBFaW1nW2tdKSAqIHRtcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbG9jYXRlIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgaWYoIGNvZWZmVXNhZ2UgPT0gQ1ZfVkFMVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX2FscGhhID0gKmFscGhhOworICAgICAgICAgICAgICAgIF9iZXRhID0gKmJldGE7CisgICAgICAgICAgICAgICAgX2dhbW1hID0gKmdhbW1hOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBfYWxwaGEgPSBhbHBoYVtpXTsKKyAgICAgICAgICAgICAgICBfYmV0YSA9IGJldGFbaV07CisgICAgICAgICAgICAgICAgX2dhbW1hID0gZ2FtbWFbaV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEZpbmQgTWluaW1pemUgcG9pbnQgaW4gdGhlIG5laWdoYm9ycyAqLworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG5laWdoYm9yczsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBFW2tdID0gX2FscGhhICogRWNvbnRba10gKyBfYmV0YSAqIEVjdXJ2W2tdICsgX2dhbW1hICogRWltZ1trXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVtaW4gPSBfQ1ZfU05BS0VfQklHOworICAgICAgICAgICAgZm9yKCBqID0gLXVwcGVyOyBqIDw9IGJvdHRvbTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAtbGVmdDsgayA8PSByaWdodDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIEVbKGogKyBjZW50ZXJ5KSAqIHdpbi53aWR0aCArIGsgKyBjZW50ZXJ4XSA8IEVtaW4gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBFbWluID0gRVsoaiArIGNlbnRlcnkpICogd2luLndpZHRoICsgayArIGNlbnRlcnhdOworICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0eCA9IGs7CisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXR5ID0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIG9mZnNldHggfHwgb2Zmc2V0eSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRbaV0ueCArPSBvZmZzZXR4OworICAgICAgICAgICAgICAgIHB0W2ldLnkgKz0gb2Zmc2V0eTsKKyAgICAgICAgICAgICAgICBtb3ZlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnZlcmdlZCA9IChtb3ZlZCA9PSAwKTsKKyAgICAgICAgaWYoIChjcml0ZXJpYS50eXBlICYgQ1ZfVEVSTUNSSVRfSVRFUikgJiYgKGl0ZXJhdGlvbiA+PSBjcml0ZXJpYS5tYXhfaXRlcikgKQorICAgICAgICAgICAgY29udmVyZ2VkID0gMTsKKyAgICAgICAgaWYoIChjcml0ZXJpYS50eXBlICYgQ1ZfVEVSTUNSSVRfRVBTKSAmJiAobW92ZWQgPD0gY3JpdGVyaWEuZXBzaWxvbikgKQorICAgICAgICAgICAgY29udmVyZ2VkID0gMTsKKyAgICB9CisKKyAgICBjdkZyZWUoICZFY29udCApOworICAgIGN2RnJlZSggJkVjdXJ2ICk7CisgICAgY3ZGcmVlKCAmRWltZyApOworICAgIGN2RnJlZSggJkUgKTsKKworICAgIGlmKCBzY2hlbWUgPT0gX0NWX1NOQUtFX0dSQUQgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmZ3JhZGllbnQgKTsKKyAgICAgICAgY3ZGcmVlKCAmbWFwICk7CisgICAgfQorICAgIHJldHVybiBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2U25ha2VJbWFnZSggY29uc3QgSXBsSW1hZ2UqIHNyYywgQ3ZQb2ludCogcG9pbnRzLAorICAgICAgICAgICAgICBpbnQgbGVuZ3RoLCBmbG9hdCAqYWxwaGEsCisgICAgICAgICAgICAgIGZsb2F0ICpiZXRhLCBmbG9hdCAqZ2FtbWEsCisgICAgICAgICAgICAgIGludCBjb2VmZlVzYWdlLCBDdlNpemUgd2luLAorICAgICAgICAgICAgICBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwgaW50IGNhbGNHcmFkaWVudCApCit7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U25ha2VJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHVjaGFyICpkYXRhOworICAgIEN2U2l6ZSBzaXplOworICAgIGludCBzdGVwOworCisgICAgaWYoIHNyYy0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICJpbnB1dCBpbWFnZSBoYXMgbW9yZSB0aGFuIG9uZSBjaGFubmVsIiApOworCisgICAgaWYoIHNyYy0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBjdkdldFJhd0RhdGEoIHNyYywgJmRhdGEsICZzdGVwLCAmc2l6ZSApOworCisgICAgSVBQSV9DQUxMKCBpY3ZTbmFrZTh1QzFSKCBkYXRhLCBzdGVwLCBzaXplLCBwb2ludHMsIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCBiZXRhLCBnYW1tYSwgY29lZmZVc2FnZSwgd2luLCBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNHcmFkaWVudCA/IF9DVl9TTkFLRV9HUkFEIDogX0NWX1NOQUtFX0lNQUdFICkpOworICAgIF9fRU5EX187Cit9CisKKy8qIGVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZzdGVyZW9ibS5jcHAgYi9jdi9zcmMvY3ZzdGVyZW9ibS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U5ZjczMQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnN0ZXJlb2JtLmNwcApAQCAtMCwwICsxLDY4MSBAQAorLy9NKi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICBWZXJ5IGZhc3QgU0FELWJhc2VkIChTdW0tb2YtQWJzb2x1dGUtRGlmZnJlbmNlcykgc3RlcmVvIGNvcnJlc3BvbmRlbmNlIGFsZ29yaXRobS4gICAqCisqICAgIENvbnRyaWJ1dGVkIGJ5IEt1cnQgS29ub2xpZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiX2N2LmgiCisvKgorI3VuZGVmIENWX1NTRTIKKyNkZWZpbmUgQ1ZfU1NFMiAxCisjaW5jbHVkZSAiZW1taW50cmluLmgiCisqLworCitDVl9JTVBMIEN2U3RlcmVvQk1TdGF0ZSoKK2N2Q3JlYXRlU3RlcmVvQk1TdGF0ZSggaW50IC8qcHJlc2V0Ki8sIGludCBudW1iZXJPZkRpc3Bhcml0aWVzICkKK3sKKyAgICBDdlN0ZXJlb0JNU3RhdGUqIHN0YXRlID0gMDsKKworICAgIC8vQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZVN0ZXJlb0JNU3RhdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBzdGF0ZSA9IChDdlN0ZXJlb0JNU3RhdGUqKWN2QWxsb2MoIHNpemVvZigqc3RhdGUpICk7CisgICAgaWYoICFzdGF0ZSApCisgICAgICAgIEVYSVQ7CisKKyAgICBzdGF0ZS0+cHJlRmlsdGVyVHlwZSA9IENWX1NURVJFT19CTV9OT1JNQUxJWkVEX1JFU1BPTlNFOworICAgIHN0YXRlLT5wcmVGaWx0ZXJTaXplID0gOTsKKyAgICBzdGF0ZS0+cHJlRmlsdGVyQ2FwID0gMzE7CisgICAgc3RhdGUtPlNBRFdpbmRvd1NpemUgPSAxNTsKKyAgICBzdGF0ZS0+bWluRGlzcGFyaXR5ID0gMDsKKyAgICBzdGF0ZS0+bnVtYmVyT2ZEaXNwYXJpdGllcyA9IG51bWJlck9mRGlzcGFyaXRpZXMgPiAwID8gbnVtYmVyT2ZEaXNwYXJpdGllcyA6IDY0OworICAgIHN0YXRlLT50ZXh0dXJlVGhyZXNob2xkID0gMTA7CisgICAgc3RhdGUtPnVuaXF1ZW5lc3NSYXRpbyA9IDE1OworICAgIHN0YXRlLT5zcGVja2xlUmFuZ2UgPSBzdGF0ZS0+c3BlY2tsZVdpbmRvd1NpemUgPSAwOworCisgICAgc3RhdGUtPnByZUZpbHRlcmVkSW1nMCA9IHN0YXRlLT5wcmVGaWx0ZXJlZEltZzEgPSBzdGF0ZS0+c2xpZGluZ1N1bUJ1ZiA9IDA7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlU3RlcmVvQk1TdGF0ZSggJnN0YXRlICk7CisgICAgcmV0dXJuIHN0YXRlOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlU3RlcmVvQk1TdGF0ZSggQ3ZTdGVyZW9CTVN0YXRlKiogc3RhdGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlU3RlcmVvQk1TdGF0ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3RhdGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhKnN0YXRlICkKKyAgICAgICAgRVhJVDsKKworICAgIGN2UmVsZWFzZU1hdCggJigqc3RhdGUpLT5wcmVGaWx0ZXJlZEltZzAgKTsKKyAgICBjdlJlbGVhc2VNYXQoICYoKnN0YXRlKS0+cHJlRmlsdGVyZWRJbWcxICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmKCpzdGF0ZSktPnNsaWRpbmdTdW1CdWYgKTsKKyAgICBjdkZyZWUoIHN0YXRlICk7CisKKyAgICBfX0VORF9fOworfQorCitzdGF0aWMgdm9pZCBpY3ZQcmVmaWx0ZXIoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QsIGludCB3aW5zaXplLCBpbnQgZnR6ZXJvLCB1Y2hhciogYnVmICkKK3sKKyAgICBpbnQgeCwgeSwgd3N6MiA9IHdpbnNpemUvMjsKKyAgICBpbnQqIHZzdW0gPSAoaW50KiljdkFsaWduUHRyKGJ1ZiArICh3c3oyICsgMSkqc2l6ZW9mKHZzdW1bMF0pLCAzMik7CisgICAgaW50IHNjYWxlX2cgPSB3aW5zaXplKndpbnNpemUvOCwgc2NhbGVfcyA9ICgxMDI0ICsgc2NhbGVfZykvKHNjYWxlX2cqMik7CisgICAgY29uc3QgaW50IE9GUyA9IDI1Nio1LCBUQUJTWiA9IE9GUyoyICsgMjU2OworICAgIHVjaGFyIHRhYltUQUJTWl07CisgICAgY29uc3QgdWNoYXIqIHNwdHIgPSBzcmMtPmRhdGEucHRyOworICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwOworICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisKKyAgICBzY2FsZV9nICo9IHNjYWxlX3M7CisKKyAgICBmb3IoIHggPSAwOyB4IDwgVEFCU1o7IHgrKyApCisgICAgICAgIHRhYlt4XSA9ICh1Y2hhcikoeCAtIE9GUyA8IC1mdHplcm8gPyAwIDogeCAtIE9GUyA+IGZ0emVybyA/IGZ0emVybyoyIDogeCAtIE9GUyArIGZ0emVybyk7CisKKyAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgdnN1bVt4XSA9ICh1c2hvcnQpKHNwdHJbeF0qKHdzejIgKyAyKSk7CisKKyAgICBmb3IoIHkgPSAxOyB5IDwgd3N6MjsgeSsrICkKKyAgICB7CisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICAgICAgdnN1bVt4XSA9ICh1c2hvcnQpKHZzdW1beF0gKyBzcHRyW3NyY3N0ZXAqeSArIHhdKTsKKyAgICB9CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgeworICAgICAgICBjb25zdCB1Y2hhciogdG9wID0gc3B0ciArIHNyY3N0ZXAqTUFYKHktd3N6Mi0xLDApOworICAgICAgICBjb25zdCB1Y2hhciogYm90dG9tID0gc3B0ciArIHNyY3N0ZXAqTUlOKHkrd3N6MixzaXplLmhlaWdodC0xKTsKKyAgICAgICAgY29uc3QgdWNoYXIqIHByZXYgPSBzcHRyICsgc3Jjc3RlcCpNQVgoeS0xLDApOworICAgICAgICBjb25zdCB1Y2hhciogY3VyciA9IHNwdHIgKyBzcmNzdGVwKnk7CisgICAgICAgIGNvbnN0IHVjaGFyKiBuZXh0ID0gc3B0ciArIHNyY3N0ZXAqTUlOKHkrMSxzaXplLmhlaWdodC0xKTsKKyAgICAgICAgdWNoYXIqIGRwdHIgPSBkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKnk7CisgICAgICAgIHggPSAwOworCisgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgIHZzdW1beF0gPSAodXNob3J0KSh2c3VtW3hdICsgYm90dG9tW3hdIC0gdG9wW3hdKTsKKworICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHdzejI7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZzdW1bLXgtMV0gPSB2c3VtWzBdOworICAgICAgICAgICAgdnN1bVtzaXplLndpZHRoK3hdID0gdnN1bVtzaXplLndpZHRoLTFdOworICAgICAgICB9CisKKyAgICAgICAgaW50IHN1bSA9IHZzdW1bMF0qKHdzejIgKyAxKTsKKyAgICAgICAgZm9yKCB4ID0gMTsgeCA8PSB3c3oyOyB4KysgKQorICAgICAgICAgICAgc3VtICs9IHZzdW1beF07CisKKyAgICAgICAgaW50IHZhbCA9ICgoY3VyclswXSo1ICsgY3VyclsxXSArIHByZXZbMF0gKyBuZXh0WzBdKSpzY2FsZV9nIC0gc3VtKnNjYWxlX3MpID4+IDEwOworICAgICAgICBkcHRyWzBdID0gdGFiW3ZhbCArIE9GU107CisKKyAgICAgICAgZm9yKCB4ID0gMTsgeCA8IHNpemUud2lkdGgtMTsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtICs9IHZzdW1beCt3c3oyXSAtIHZzdW1beC13c3oyLTFdOworICAgICAgICAgICAgdmFsID0gKChjdXJyW3hdKjQgKyBjdXJyW3gtMV0gKyBjdXJyW3grMV0gKyBwcmV2W3hdICsgbmV4dFt4XSkqc2NhbGVfZyAtIHN1bSpzY2FsZV9zKSA+PiAxMDsKKyAgICAgICAgICAgIGRwdHJbeF0gPSB0YWJbdmFsICsgT0ZTXTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3VtICs9IHZzdW1beCt3c3oyXSAtIHZzdW1beC13c3oyLTFdOworICAgICAgICB2YWwgPSAoKGN1cnJbeF0qNSArIGN1cnJbeC0xXSArIHByZXZbeF0gKyBuZXh0W3hdKSpzY2FsZV9nIC0gc3VtKnNjYWxlX3MpID4+IDEwOworICAgICAgICBkcHRyW3hdID0gdGFiW3ZhbCArIE9GU107CisgICAgfQorfQorCisKK3N0YXRpYyBjb25zdCBpbnQgRElTUEFSSVRZX1NISUZUID0gNDsKKworI2lmIENWX1NTRTIKK3N0YXRpYyB2b2lkCitpY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2VCTV9TU0UyKCBjb25zdCBDdk1hdCogbGVmdCwgY29uc3QgQ3ZNYXQqIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGRpc3AsIEN2U3RlcmVvQk1TdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYnVmLCBpbnQgX2R5MCwgaW50IF9keTEgKQoreworICAgIGludCB4LCB5LCBkOworICAgIGludCB3c3ogPSBzdGF0ZS0+U0FEV2luZG93U2l6ZSwgd3N6MiA9IHdzei8yOworICAgIGludCBkeTAgPSBNSU4oX2R5MCwgd3N6MisxKSwgZHkxID0gTUlOKF9keTEsIHdzejIrMSk7CisgICAgaW50IG5kaXNwID0gc3RhdGUtPm51bWJlck9mRGlzcGFyaXRpZXM7CisgICAgaW50IG1pbmRpc3AgPSBzdGF0ZS0+bWluRGlzcGFyaXR5OworICAgIGludCBsb2ZzID0gTUFYKG5kaXNwIC0gMSArIG1pbmRpc3AsIDApOworICAgIGludCByb2ZzID0gLU1JTihuZGlzcCAtIDEgKyBtaW5kaXNwLCAwKTsKKyAgICBpbnQgd2lkdGggPSBsZWZ0LT5jb2xzLCBoZWlnaHQgPSBsZWZ0LT5yb3dzOworICAgIGludCB3aWR0aDEgPSB3aWR0aCAtIHJvZnMgLSBuZGlzcCArIDE7CisgICAgaW50IGZ0emVybyA9IHN0YXRlLT5wcmVGaWx0ZXJDYXA7CisgICAgaW50IHRleHR1cmVUaHJlc2hvbGQgPSBzdGF0ZS0+dGV4dHVyZVRocmVzaG9sZDsKKyAgICBpbnQgdW5pcXVlbmVzc1JhdGlvID0gc3RhdGUtPnVuaXF1ZW5lc3NSYXRpbzsKKyAgICBzaG9ydCBGSUxURVJFRCA9IChzaG9ydCkoKG1pbmRpc3AgLSAxKSA8PCBESVNQQVJJVFlfU0hJRlQpOworCisgICAgdXNob3J0ICpzYWQsICpoc2FkMCwgKmhzYWQsICpoc2FkX3N1YjsKKyAgICBpbnQgKmh0ZXh0OworICAgIHVjaGFyICpjYnVmMCwgKmNidWY7CisgICAgY29uc3QgdWNoYXIqIGxwdHIwID0gbGVmdC0+ZGF0YS5wdHIgKyBsb2ZzOworICAgIGNvbnN0IHVjaGFyKiBycHRyMCA9IHJpZ2h0LT5kYXRhLnB0ciArIHJvZnM7CisgICAgY29uc3QgdWNoYXIgKmxwdHIsICpscHRyX3N1YiwgKnJwdHI7CisgICAgc2hvcnQqIGRwdHIgPSBkaXNwLT5kYXRhLnM7CisgICAgaW50IHNzdGVwID0gbGVmdC0+c3RlcDsKKyAgICBpbnQgZHN0ZXAgPSBkaXNwLT5zdGVwL3NpemVvZihkcHRyWzBdKTsKKyAgICBpbnQgY3N0ZXAgPSAoaGVpZ2h0ICsgZHkwICsgZHkxKSpuZGlzcDsKKyAgICBjb25zdCBpbnQgVEFCU1ogPSAyNTY7CisgICAgdWNoYXIgdGFiW1RBQlNaXTsKKyAgICBjb25zdCBfX20xMjhpIGQwXzggPSBfbW1fc2V0cl9lcGkxNigwLDEsMiwzLDQsNSw2LDcpLCBkZF84ID0gX21tX3NldDFfZXBpMTYoOCk7CisKKyAgICBzYWQgPSAodXNob3J0KiljdkFsaWduUHRyKGJ1ZiArIHNpemVvZihzYWRbMF0pKTsKKyAgICBoc2FkMCA9ICh1c2hvcnQqKWN2QWxpZ25QdHIoc2FkICsgbmRpc3AgKyAxICsgZHkwKm5kaXNwKTsKKyAgICBodGV4dCA9IChpbnQqKWN2QWxpZ25QdHIoKGludCopKGhzYWQwICsgKGhlaWdodCtkeTEpKm5kaXNwKSArIHdzejIgKyAyKTsKKyAgICBjYnVmMCA9ICh1Y2hhciopY3ZBbGlnblB0cihodGV4dCArIGhlaWdodCArIHdzejIgKyAyICsgZHkwKm5kaXNwKTsKKworICAgIGZvciggeCA9IDA7IHggPCBUQUJTWjsgeCsrICkKKyAgICAgICAgdGFiW3hdID0gKHVjaGFyKWFicyh4IC0gZnR6ZXJvKTsKKworICAgIC8vIGluaXRpYWxpemUgYnVmZmVycworICAgIG1lbXNldCggaHNhZDAgLSBkeTAqbmRpc3AsIDAsIChoZWlnaHQgKyBkeTAgKyBkeTEpKm5kaXNwKnNpemVvZihoc2FkMFswXSkgKTsKKyAgICBtZW1zZXQoIGh0ZXh0IC0gd3N6MiAtIDEsIDAsIChoZWlnaHQgKyB3c3ogKyAxKSpzaXplb2YoaHRleHRbMF0pICk7CisKKyAgICBmb3IoIHggPSAtd3N6Mi0xOyB4IDwgd3N6MjsgeCsrICkKKyAgICB7CisgICAgICAgIGhzYWQgPSBoc2FkMCAtIGR5MCpuZGlzcDsgY2J1ZiA9IGNidWYwICsgKHggKyB3c3oyICsgMSkqY3N0ZXAgLSBkeTAqbmRpc3A7CisgICAgICAgIGxwdHIgPSBscHRyMCArIE1JTihNQVgoeCwgLWxvZnMpLCB3aWR0aC1sb2ZzLTEpIC0gZHkwKnNzdGVwOworICAgICAgICBycHRyID0gcnB0cjAgKyBNSU4oTUFYKHgsIC1yb2ZzKSwgd2lkdGgtcm9mcy0xKSAtIGR5MCpzc3RlcDsKKworICAgICAgICBmb3IoIHkgPSAtZHkwOyB5IDwgaGVpZ2h0ICsgZHkxOyB5KyssIGhzYWQgKz0gbmRpc3AsIGNidWYgKz0gbmRpc3AsIGxwdHIgKz0gc3N0ZXAsIHJwdHIgKz0gc3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbHZhbCA9IGxwdHJbMF07CisgICAgICAgICAgICBmb3IoIGQgPSAwOyBkIDwgbmRpc3A7IGQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGRpZmYgPSBhYnMobHZhbCAtIHJwdHJbZF0pOworICAgICAgICAgICAgICAgIGNidWZbZF0gPSAodWNoYXIpZGlmZjsKKyAgICAgICAgICAgICAgICBoc2FkW2RdID0gKHVzaG9ydCkoaHNhZFtkXSArIGRpZmYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRleHRbeV0gKz0gdGFiW2x2YWxdOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgbGVmdCBhbmQgcmlnaHQgYm9yZGVycyBvZiB0aGUgZGlzcGFyaXR5IG1hcAorICAgIGZvciggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKyApCisgICAgeworICAgICAgICBmb3IoIHggPSAwOyB4IDwgbG9mczsgeCsrICkKKyAgICAgICAgICAgIGRwdHJbeSpkc3RlcCArIHhdID0gRklMVEVSRUQ7CisgICAgICAgIGZvciggeCA9IGxvZnMgKyB3aWR0aDE7IHggPCB3aWR0aDsgeCsrICkKKyAgICAgICAgICAgIGRwdHJbeSpkc3RlcCArIHhdID0gRklMVEVSRUQ7CisgICAgfQorICAgIGRwdHIgKz0gbG9mczsKKworICAgIGZvciggeCA9IDA7IHggPCB3aWR0aDE7IHgrKywgZHB0cisrICkKKyAgICB7CisgICAgICAgIGludCB4MCA9IHggLSB3c3oyIC0gMSwgeDEgPSB4ICsgd3N6MjsKKyAgICAgICAgY29uc3QgdWNoYXIqIGNidWZfc3ViID0gY2J1ZjAgKyAoKHgwICsgd3N6MiArIDEpICUgKHdzeiArIDEpKSpjc3RlcCAtIGR5MCpuZGlzcDsKKyAgICAgICAgdWNoYXIqIGNidWYgPSBjYnVmMCArICgoeDEgKyB3c3oyICsgMSkgJSAod3N6ICsgMSkpKmNzdGVwIC0gZHkwKm5kaXNwOworICAgICAgICBoc2FkID0gaHNhZDAgLSBkeTAqbmRpc3A7CisgICAgICAgIGxwdHJfc3ViID0gbHB0cjAgKyBNSU4oTUFYKHgwLCAtbG9mcyksIHdpZHRoLTEtbG9mcykgLSBkeTAqc3N0ZXA7CisgICAgICAgIGxwdHIgPSBscHRyMCArIE1JTihNQVgoeDEsIC1sb2ZzKSwgd2lkdGgtMS1sb2ZzKSAtIGR5MCpzc3RlcDsKKyAgICAgICAgcnB0ciA9IHJwdHIwICsgTUlOKE1BWCh4MSwgLXJvZnMpLCB3aWR0aC0xLXJvZnMpIC0gZHkwKnNzdGVwOworCisgICAgICAgIGZvciggeSA9IC1keTA7IHkgPCBoZWlnaHQgKyBkeTE7IHkrKywgY2J1ZiArPSBuZGlzcCwgY2J1Zl9zdWIgKz0gbmRpc3AsCisgICAgICAgICAgICAgaHNhZCArPSBuZGlzcCwgbHB0ciArPSBzc3RlcCwgbHB0cl9zdWIgKz0gc3N0ZXAsIHJwdHIgKz0gc3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbHZhbCA9IGxwdHJbMF07CisgICAgICAgICAgICBfX20xMjhpIGx2ID0gX21tX3NldDFfZXBpOCgoY2hhcilsdmFsKSwgeiA9IF9tbV9zZXR6ZXJvX3NpMTI4KCk7CisgICAgICAgICAgICBmb3IoIGQgPSAwOyBkIDwgbmRpc3A7IGQgKz0gMTYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIF9fbTEyOGkgcnYgPSBfbW1fbG9hZHVfc2kxMjgoKGNvbnN0IF9fbTEyOGkqKShycHRyICsgZCkpOworICAgICAgICAgICAgICAgIF9fbTEyOGkgaHNhZF9sID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShoc2FkICsgZCkpOworICAgICAgICAgICAgICAgIF9fbTEyOGkgaHNhZF9oID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShoc2FkICsgZCArIDgpKTsKKyAgICAgICAgICAgICAgICBfX20xMjhpIGNicyA9IF9tbV9sb2FkX3NpMTI4KChjb25zdCBfX20xMjhpKikoY2J1Zl9zdWIgKyBkKSk7CisgICAgICAgICAgICAgICAgX19tMTI4aSBkaWZmID0gX21tX2FkZHNfZXB1OChfbW1fc3Vic19lcHU4KGx2LCBydiksIF9tbV9zdWJzX2VwdTgocnYsIGx2KSk7CisgICAgICAgICAgICAgICAgX19tMTI4aSBkaWZmX2ggPSBfbW1fc3ViX2VwaTE2KF9tbV91bnBhY2toaV9lcGk4KGRpZmYsIHopLCBfbW1fdW5wYWNraGlfZXBpOChjYnMsIHopKTsKKyAgICAgICAgICAgICAgICBfbW1fc3RvcmVfc2kxMjgoKF9fbTEyOGkqKShjYnVmICsgZCksIGRpZmYpOworICAgICAgICAgICAgICAgIGRpZmYgPSBfbW1fc3ViX2VwaTE2KF9tbV91bnBhY2tsb19lcGk4KGRpZmYsIHopLCBfbW1fdW5wYWNrbG9fZXBpOChjYnMsIHopKTsKKyAgICAgICAgICAgICAgICBoc2FkX2ggPSBfbW1fYWRkX2VwaTE2KGhzYWRfaCwgZGlmZl9oKTsKKyAgICAgICAgICAgICAgICBoc2FkX2wgPSBfbW1fYWRkX2VwaTE2KGhzYWRfbCwgZGlmZik7CisgICAgICAgICAgICAgICAgX21tX3N0b3JlX3NpMTI4KChfX20xMjhpKikoaHNhZCArIGQpLCBoc2FkX2wpOworICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKGhzYWQgKyBkICsgOCksIGhzYWRfaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodGV4dFt5XSArPSB0YWJbbHZhbF0gLSB0YWJbbHB0cl9zdWJbMF1dOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmlsbCBib3JkZXJzCisgICAgICAgIGZvciggeSA9IGR5MTsgeSA8PSB3c3oyOyB5KysgKQorICAgICAgICAgICAgaHRleHRbaGVpZ2h0K3ldID0gaHRleHRbaGVpZ2h0K2R5MS0xXTsKKyAgICAgICAgZm9yKCB5ID0gLXdzejItMTsgeSA8IC1keTA7IHkrKyApCisgICAgICAgICAgICBodGV4dFt5XSA9IGh0ZXh0Wy1keTBdOworCisgICAgICAgIC8vIGluaXRpYWxpemUgc3VtcworICAgICAgICBmb3IoIGQgPSAwOyBkIDwgbmRpc3A7IGQrKyApCisgICAgICAgICAgICBzYWRbZF0gPSAodXNob3J0KShoc2FkMFtkLW5kaXNwKmR5MF0qKHdzejIgKyAyIC0gZHkwKSk7CisgICAgICAgIAorICAgICAgICBoc2FkID0gaHNhZDAgKyAoMSAtIGR5MCkqbmRpc3A7CisgICAgICAgIGZvciggeSA9IDEgLSBkeTA7IHkgPCB3c3oyOyB5KyssIGhzYWQgKz0gbmRpc3AgKQorICAgICAgICAgICAgZm9yKCBkID0gMDsgZCA8IG5kaXNwOyBkKysgKQorICAgICAgICAgICAgICAgIHNhZFtkXSA9ICh1c2hvcnQpKHNhZFtkXSArIGhzYWRbZF0pOworICAgICAgICBpbnQgdHN1bSA9IDA7CisgICAgICAgIGZvciggeSA9IC13c3oyLTE7IHkgPCB3c3oyOyB5KysgKQorICAgICAgICAgICAgdHN1bSArPSBodGV4dFt5XTsKKworICAgICAgICAvLyBmaW5hbGx5LCBzdGFydCB0aGUgcmVhbCBwcm9jZXNzaW5nCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtaW5zYWQgPSBJTlRfTUFYLCBtaW5kID0gLTE7CisgICAgICAgICAgICBoc2FkID0gaHNhZDAgKyBNSU4oeSArIHdzejIsIGhlaWdodCtkeTEtMSkqbmRpc3A7CisgICAgICAgICAgICBoc2FkX3N1YiA9IGhzYWQwICsgTUFYKHkgLSB3c3oyIC0gMSwgLWR5MCkqbmRpc3A7CisgICAgICAgICAgICBfX20xMjhpIG1pbnNhZDggPSBfbW1fc2V0MV9lcGkxNihTSFJUX01BWCk7CisgICAgICAgICAgICBfX20xMjhpIG1pbmQ4ID0gX21tX3NldDFfZXBpMTYoLTEpLCBkOCA9IGQwXzgsIG1hc2s7CisKKyAgICAgICAgICAgIGZvciggZCA9IDA7IGQgPCBuZGlzcDsgZCArPSA4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfX20xMjhpIHYwID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShoc2FkX3N1YiArIGQpKTsKKyAgICAgICAgICAgICAgICBfX20xMjhpIHYxID0gX21tX2xvYWRfc2kxMjgoKF9fbTEyOGkqKShoc2FkICsgZCkpOworICAgICAgICAgICAgICAgIF9fbTEyOGkgc2FkOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc2FkICsgZCkpOworICAgICAgICAgICAgICAgIHNhZDggPSBfbW1fc3ViX2VwaTE2KHNhZDgsIHYwKTsKKyAgICAgICAgICAgICAgICBzYWQ4ID0gX21tX2FkZF9lcGkxNihzYWQ4LCB2MSk7CisKKyAgICAgICAgICAgICAgICBtYXNrID0gX21tX2NtcGd0X2VwaTE2KG1pbnNhZDgsIHNhZDgpOworICAgICAgICAgICAgICAgIF9tbV9zdG9yZV9zaTEyOCgoX19tMTI4aSopKHNhZCArIGQpLCBzYWQ4KTsKKyAgICAgICAgICAgICAgICBtaW5zYWQ4ID0gX21tX21pbl9lcGkxNihtaW5zYWQ4LCBzYWQ4KTsKKyAgICAgICAgICAgICAgICBtaW5kOCA9IF9tbV94b3Jfc2kxMjgobWluZDgsX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KGQ4LG1pbmQ4KSxtYXNrKSk7CisgICAgICAgICAgICAgICAgZDggPSBfbW1fYWRkX2VwaTE2KGQ4LCBkZF84KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19tMTI4aSBtaW5zYWQ4MiA9IF9tbV91bnBhY2toaV9lcGk2NChtaW5zYWQ4LCBtaW5zYWQ4KTsKKyAgICAgICAgICAgIF9fbTEyOGkgbWluZDgyID0gX21tX3VucGFja2hpX2VwaTY0KG1pbmQ4LCBtaW5kOCk7CisgICAgICAgICAgICBtYXNrID0gX21tX2NtcGd0X2VwaTE2KG1pbnNhZDgsIG1pbnNhZDgyKTsKKyAgICAgICAgICAgIG1pbmQ4ID0gX21tX3hvcl9zaTEyOChtaW5kOCxfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgobWluZDgyLG1pbmQ4KSxtYXNrKSk7CisgICAgICAgICAgICBtaW5zYWQ4ID0gX21tX21pbl9lcGkxNihtaW5zYWQ4LCBtaW5zYWQ4Mik7CisKKyAgICAgICAgICAgIG1pbnNhZDgyID0gX21tX3NodWZmbGVsb19lcGkxNihtaW5zYWQ4LCBfTU1fU0hVRkZMRSgzLDIsMywyKSk7CisgICAgICAgICAgICBtaW5kODIgPSBfbW1fc2h1ZmZsZWxvX2VwaTE2KG1pbmQ4LCBfTU1fU0hVRkZMRSgzLDIsMywyKSk7CisgICAgICAgICAgICBtYXNrID0gX21tX2NtcGd0X2VwaTE2KG1pbnNhZDgsIG1pbnNhZDgyKTsKKyAgICAgICAgICAgIG1pbmQ4ID0gX21tX3hvcl9zaTEyOChtaW5kOCxfbW1fYW5kX3NpMTI4KF9tbV94b3Jfc2kxMjgobWluZDgyLG1pbmQ4KSxtYXNrKSk7CisgICAgICAgICAgICBtaW5zYWQ4ID0gX21tX21pbl9lcGkxNihtaW5zYWQ4LCBtaW5zYWQ4Mik7CisKKyAgICAgICAgICAgIG1pbnNhZDgyID0gX21tX3NodWZmbGVsb19lcGkxNihtaW5zYWQ4LCAxKTsKKyAgICAgICAgICAgIG1pbmQ4MiA9IF9tbV9zaHVmZmxlbG9fZXBpMTYobWluZDgsIDEpOworICAgICAgICAgICAgbWFzayA9IF9tbV9jbXBndF9lcGkxNihtaW5zYWQ4LCBtaW5zYWQ4Mik7CisgICAgICAgICAgICBtaW5kOCA9IF9tbV94b3Jfc2kxMjgobWluZDgsX21tX2FuZF9zaTEyOChfbW1feG9yX3NpMTI4KG1pbmQ4MixtaW5kOCksbWFzaykpOworICAgICAgICAgICAgbWluZCA9IChzaG9ydClfbW1fY3Z0c2kxMjhfc2kzMihtaW5kOCk7CisgICAgICAgICAgICBtaW5zYWQgPSBzYWRbbWluZF07CisgICAgICAgICAgICB0c3VtICs9IGh0ZXh0W3kgKyB3c3oyXSAtIGh0ZXh0W3kgLSB3c3oyIC0gMV07CisgICAgICAgICAgICBpZiggdHN1bSA8IHRleHR1cmVUaHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRwdHJbeSpkc3RlcF0gPSBGSUxURVJFRDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHVuaXF1ZW5lc3NSYXRpbyA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0aHJlc2ggPSBtaW5zYWQgKyAobWluc2FkICogdW5pcXVlbmVzc1JhdGlvLzEwMCk7CisgICAgICAgICAgICAgICAgX19tMTI4aSB0aHJlc2g4ID0gX21tX3NldDFfZXBpMTYoKHNob3J0KSh0aHJlc2ggKyAxKSk7CisgICAgICAgICAgICAgICAgX19tMTI4aSBkMSA9IF9tbV9zZXQxX2VwaTE2KChzaG9ydCkobWluZC0xKSksIGQyID0gX21tX3NldDFfZXBpMTYoKHNob3J0KShtaW5kKzEpKTsKKyAgICAgICAgICAgICAgICBfX20xMjhpIGQ4ID0gZDBfODsKKworICAgICAgICAgICAgICAgIGZvciggZCA9IDA7IGQgPCBuZGlzcDsgZCArPSA4ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9fbTEyOGkgc2FkOCA9IF9tbV9sb2FkX3NpMTI4KChfX20xMjhpKikoc2FkICsgZCkpOworICAgICAgICAgICAgICAgICAgICBfX20xMjhpIG1hc2sgPSBfbW1fY21wZ3RfZXBpMTYoIHRocmVzaDgsIHNhZDggKTsKKyAgICAgICAgICAgICAgICAgICAgbWFzayA9IF9tbV9hbmRfc2kxMjgobWFzaywgX21tX29yX3NpMTI4KF9tbV9jbXBndF9lcGkxNihkMSxkOCksIF9tbV9jbXBndF9lcGkxNihkOCxkMikpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9tbV9tb3ZlbWFza19lcGk4KG1hc2spICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkOCA9IF9tbV9hZGRfZXBpMTYoZDgsIGRkXzgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggZCA8IG5kaXNwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRwdHJbeSpkc3RlcF0gPSBGSUxURVJFRDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB7CisgICAgICAgICAgICBzYWRbLTFdID0gc2FkWzFdOworICAgICAgICAgICAgc2FkW25kaXNwXSA9IHNhZFtuZGlzcC0yXTsKKyAgICAgICAgICAgIGludCBwID0gc2FkW21pbmQrMV0sIG4gPSBzYWRbbWluZC0xXSwgZCA9IHAgKyBuIC0gMipzYWRbbWluZF07CisgICAgICAgICAgICBkcHRyW3kqZHN0ZXBdID0gKHNob3J0KSgoKG5kaXNwIC0gbWluZCAtIDEgKyBtaW5kaXNwKSoyNTYgKyAoZCAhPSAwID8gKHAtbikqMTI4L2QgOiAwKSArIDE1KSA+PiA0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAoraWN2RmluZFN0ZXJlb0NvcnJlc3BvbmRlbmNlQk0oIGNvbnN0IEN2TWF0KiBsZWZ0LCBjb25zdCBDdk1hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGRpc3AsIEN2U3RlcmVvQk1TdGF0ZSogc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGJ1ZiwgaW50IF9keTAsIGludCBfZHkxICkKK3sKKyAgICBpbnQgeCwgeSwgZDsKKyAgICBpbnQgd3N6ID0gc3RhdGUtPlNBRFdpbmRvd1NpemUsIHdzejIgPSB3c3ovMjsKKyAgICBpbnQgZHkwID0gTUlOKF9keTAsIHdzejIrMSksIGR5MSA9IE1JTihfZHkxLCB3c3oyKzEpOworICAgIGludCBuZGlzcCA9IHN0YXRlLT5udW1iZXJPZkRpc3Bhcml0aWVzOworICAgIGludCBtaW5kaXNwID0gc3RhdGUtPm1pbkRpc3Bhcml0eTsKKyAgICBpbnQgbG9mcyA9IE1BWChuZGlzcCAtIDEgKyBtaW5kaXNwLCAwKTsKKyAgICBpbnQgcm9mcyA9IC1NSU4obmRpc3AgLSAxICsgbWluZGlzcCwgMCk7CisgICAgaW50IHdpZHRoID0gbGVmdC0+Y29scywgaGVpZ2h0ID0gbGVmdC0+cm93czsKKyAgICBpbnQgd2lkdGgxID0gd2lkdGggLSByb2ZzIC0gbmRpc3AgKyAxOworICAgIGludCBmdHplcm8gPSBzdGF0ZS0+cHJlRmlsdGVyQ2FwOworICAgIGludCB0ZXh0dXJlVGhyZXNob2xkID0gc3RhdGUtPnRleHR1cmVUaHJlc2hvbGQ7CisgICAgaW50IHVuaXF1ZW5lc3NSYXRpbyA9IHN0YXRlLT51bmlxdWVuZXNzUmF0aW87CisgICAgc2hvcnQgRklMVEVSRUQgPSAoc2hvcnQpKChtaW5kaXNwIC0gMSkgPDwgRElTUEFSSVRZX1NISUZUKTsKKworICAgIGludCAqc2FkLCAqaHNhZDAsICpoc2FkLCAqaHNhZF9zdWIsICpodGV4dDsKKyAgICB1Y2hhciAqY2J1ZjAsICpjYnVmOworICAgIGNvbnN0IHVjaGFyKiBscHRyMCA9IGxlZnQtPmRhdGEucHRyICsgbG9mczsKKyAgICBjb25zdCB1Y2hhciogcnB0cjAgPSByaWdodC0+ZGF0YS5wdHIgKyByb2ZzOworICAgIGNvbnN0IHVjaGFyICpscHRyLCAqbHB0cl9zdWIsICpycHRyOworICAgIHNob3J0KiBkcHRyID0gZGlzcC0+ZGF0YS5zOworICAgIGludCBzc3RlcCA9IGxlZnQtPnN0ZXA7CisgICAgaW50IGRzdGVwID0gZGlzcC0+c3RlcC9zaXplb2YoZHB0clswXSk7CisgICAgaW50IGNzdGVwID0gKGhlaWdodCtkeTArZHkxKSpuZGlzcDsKKyAgICBjb25zdCBpbnQgVEFCU1ogPSAyNTY7CisgICAgdWNoYXIgdGFiW1RBQlNaXTsKKworICAgIHNhZCA9IChpbnQqKWN2QWxpZ25QdHIoYnVmICsgc2l6ZW9mKHNhZFswXSkpOworICAgIGhzYWQwID0gKGludCopY3ZBbGlnblB0cihzYWQgKyBuZGlzcCArIDEgKyBkeTAqbmRpc3ApOworICAgIGh0ZXh0ID0gKGludCopY3ZBbGlnblB0cigoaW50KikoaHNhZDAgKyAoaGVpZ2h0K2R5MSkqbmRpc3ApICsgd3N6MiArIDIpOworICAgIGNidWYwID0gKHVjaGFyKiljdkFsaWduUHRyKGh0ZXh0ICsgaGVpZ2h0ICsgd3N6MiArIDIgKyBkeTAqbmRpc3ApOworCisgICAgZm9yKCB4ID0gMDsgeCA8IFRBQlNaOyB4KysgKQorICAgICAgICB0YWJbeF0gPSAodWNoYXIpYWJzKHggLSBmdHplcm8pOworCisgICAgLy8gaW5pdGlhbGl6ZSBidWZmZXJzCisgICAgbWVtc2V0KCBoc2FkMCAtIGR5MCpuZGlzcCwgMCwgKGhlaWdodCArIGR5MCArIGR5MSkqbmRpc3Aqc2l6ZW9mKGhzYWQwWzBdKSApOworICAgIG1lbXNldCggaHRleHQgLSB3c3oyIC0gMSwgMCwgKGhlaWdodCArIHdzeiArIDEpKnNpemVvZihodGV4dFswXSkgKTsKKworICAgIGZvciggeCA9IC13c3oyLTE7IHggPCB3c3oyOyB4KysgKQorICAgIHsKKyAgICAgICAgaHNhZCA9IGhzYWQwIC0gZHkwKm5kaXNwOyBjYnVmID0gY2J1ZjAgKyAoeCArIHdzejIgKyAxKSpjc3RlcCAtIGR5MCpuZGlzcDsKKyAgICAgICAgbHB0ciA9IGxwdHIwICsgTUlOKE1BWCh4LCAtbG9mcyksIHdpZHRoLWxvZnMtMSkgLSBkeTAqc3N0ZXA7CisgICAgICAgIHJwdHIgPSBycHRyMCArIE1JTihNQVgoeCwgLXJvZnMpLCB3aWR0aC1yb2ZzLTEpIC0gZHkwKnNzdGVwOworCisgICAgICAgIGZvciggeSA9IC1keTA7IHkgPCBoZWlnaHQgKyBkeTE7IHkrKywgaHNhZCArPSBuZGlzcCwgY2J1ZiArPSBuZGlzcCwgbHB0ciArPSBzc3RlcCwgcnB0ciArPSBzc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsdmFsID0gbHB0clswXTsKKyAgICAgICAgICAgIGZvciggZCA9IDA7IGQgPCBuZGlzcDsgZCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGFicyhsdmFsIC0gcnB0cltkXSk7CisgICAgICAgICAgICAgICAgY2J1ZltkXSA9ICh1Y2hhcilkaWZmOworICAgICAgICAgICAgICAgIGhzYWRbZF0gPSAoaW50KShoc2FkW2RdICsgZGlmZik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBodGV4dFt5XSArPSB0YWJbbHZhbF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBsZWZ0IGFuZCByaWdodCBib3JkZXJzIG9mIHRoZSBkaXNwYXJpdHkgbWFwCisgICAgZm9yKCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIGZvciggeCA9IDA7IHggPCBsb2ZzOyB4KysgKQorICAgICAgICAgICAgZHB0clt5KmRzdGVwICsgeF0gPSBGSUxURVJFRDsKKyAgICAgICAgZm9yKCB4ID0gbG9mcyArIHdpZHRoMTsgeCA8IHdpZHRoOyB4KysgKQorICAgICAgICAgICAgZHB0clt5KmRzdGVwICsgeF0gPSBGSUxURVJFRDsKKyAgICB9CisgICAgZHB0ciArPSBsb2ZzOworCisgICAgZm9yKCB4ID0gMDsgeCA8IHdpZHRoMTsgeCsrLCBkcHRyKysgKQorICAgIHsKKyAgICAgICAgaW50IHgwID0geCAtIHdzejIgLSAxLCB4MSA9IHggKyB3c3oyOworICAgICAgICBjb25zdCB1Y2hhciogY2J1Zl9zdWIgPSBjYnVmMCArICgoeDAgKyB3c3oyICsgMSkgJSAod3N6ICsgMSkpKmNzdGVwIC0gZHkwKm5kaXNwOworICAgICAgICB1Y2hhciogY2J1ZiA9IGNidWYwICsgKCh4MSArIHdzejIgKyAxKSAlICh3c3ogKyAxKSkqY3N0ZXAgLSBkeTAqbmRpc3A7CisgICAgICAgIGhzYWQgPSBoc2FkMCAtIGR5MCpuZGlzcDsKKyAgICAgICAgbHB0cl9zdWIgPSBscHRyMCArIE1JTihNQVgoeDAsIC1sb2ZzKSwgd2lkdGgtMS1sb2ZzKSAtIGR5MCpzc3RlcDsKKyAgICAgICAgbHB0ciA9IGxwdHIwICsgTUlOKE1BWCh4MSwgLWxvZnMpLCB3aWR0aC0xLWxvZnMpIC0gZHkwKnNzdGVwOworICAgICAgICBycHRyID0gcnB0cjAgKyBNSU4oTUFYKHgxLCAtcm9mcyksIHdpZHRoLTEtcm9mcykgLSBkeTAqc3N0ZXA7CisKKyAgICAgICAgZm9yKCB5ID0gLWR5MDsgeSA8IGhlaWdodCArIGR5MTsgeSsrLCBjYnVmICs9IG5kaXNwLCBjYnVmX3N1YiArPSBuZGlzcCwKKyAgICAgICAgICAgICBoc2FkICs9IG5kaXNwLCBscHRyICs9IHNzdGVwLCBscHRyX3N1YiArPSBzc3RlcCwgcnB0ciArPSBzc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsdmFsID0gbHB0clswXTsKKyAgICAgICAgICAgIGZvciggZCA9IDA7IGQgPCBuZGlzcDsgZCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGFicyhsdmFsIC0gcnB0cltkXSk7CisgICAgICAgICAgICAgICAgY2J1ZltkXSA9ICh1Y2hhcilkaWZmOworICAgICAgICAgICAgICAgIGhzYWRbZF0gPSBoc2FkW2RdICsgZGlmZiAtIGNidWZfc3ViW2RdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaHRleHRbeV0gKz0gdGFiW2x2YWxdIC0gdGFiW2xwdHJfc3ViWzBdXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbGwgYm9yZGVycworICAgICAgICBmb3IoIHkgPSBkeTE7IHkgPD0gd3N6MjsgeSsrICkKKyAgICAgICAgICAgIGh0ZXh0W2hlaWdodCt5XSA9IGh0ZXh0W2hlaWdodCtkeTEtMV07CisgICAgICAgIGZvciggeSA9IC13c3oyLTE7IHkgPCAtZHkwOyB5KysgKQorICAgICAgICAgICAgaHRleHRbeV0gPSBodGV4dFstZHkwXTsKKworICAgICAgICAvLyBpbml0aWFsaXplIHN1bXMKKyAgICAgICAgZm9yKCBkID0gMDsgZCA8IG5kaXNwOyBkKysgKQorICAgICAgICAgICAgc2FkW2RdID0gKGludCkoaHNhZDBbZC1uZGlzcCpkeTBdKih3c3oyICsgMiAtIGR5MCkpOworICAgICAgICAKKyAgICAgICAgaHNhZCA9IGhzYWQwICsgKDEgLSBkeTApKm5kaXNwOworICAgICAgICBmb3IoIHkgPSAxIC0gZHkwOyB5IDwgd3N6MjsgeSsrLCBoc2FkICs9IG5kaXNwICkKKyAgICAgICAgICAgIGZvciggZCA9IDA7IGQgPCBuZGlzcDsgZCsrICkKKyAgICAgICAgICAgICAgICBzYWRbZF0gPSAoaW50KShzYWRbZF0gKyBoc2FkW2RdKTsKKyAgICAgICAgaW50IHRzdW0gPSAwOworICAgICAgICBmb3IoIHkgPSAtd3N6Mi0xOyB5IDwgd3N6MjsgeSsrICkKKyAgICAgICAgICAgIHRzdW0gKz0gaHRleHRbeV07CisKKyAgICAgICAgLy8gZmluYWxseSwgc3RhcnQgdGhlIHJlYWwgcHJvY2Vzc2luZworICAgICAgICBmb3IoIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWluc2FkID0gSU5UX01BWCwgbWluZCA9IC0xOworICAgICAgICAgICAgaHNhZCA9IGhzYWQwICsgTUlOKHkgKyB3c3oyLCBoZWlnaHQrZHkxLTEpKm5kaXNwOworICAgICAgICAgICAgaHNhZF9zdWIgPSBoc2FkMCArIE1BWCh5IC0gd3N6MiAtIDEsIC1keTApKm5kaXNwOworCisgICAgICAgICAgICBmb3IoIGQgPSAwOyBkIDwgbmRpc3A7IGQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGN1cnJzYWQgPSBzYWRbZF0gKyBoc2FkW2RdIC0gaHNhZF9zdWJbZF07CisgICAgICAgICAgICAgICAgc2FkW2RdID0gY3VycnNhZDsKKyAgICAgICAgICAgICAgICBpZiggY3VycnNhZCA8IG1pbnNhZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5zYWQgPSBjdXJyc2FkOworICAgICAgICAgICAgICAgICAgICBtaW5kID0gZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0c3VtICs9IGh0ZXh0W3kgKyB3c3oyXSAtIGh0ZXh0W3kgLSB3c3oyIC0gMV07CisgICAgICAgICAgICBpZiggdHN1bSA8IHRleHR1cmVUaHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRwdHJbeSpkc3RlcF0gPSBGSUxURVJFRDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHVuaXF1ZW5lc3NSYXRpbyA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0aHJlc2ggPSBtaW5zYWQgKyAobWluc2FkICogdW5pcXVlbmVzc1JhdGlvLzEwMCk7CisgICAgICAgICAgICAgICAgZm9yKCBkID0gMDsgZCA8IG5kaXNwOyBkKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNhZFtkXSA8PSB0aHJlc2ggJiYgKGQgPCBtaW5kLTEgfHwgZCA+IG1pbmQrMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGQgPCBuZGlzcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkcHRyW3kqZHN0ZXBdID0gRklMVEVSRUQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgc2FkWy0xXSA9IHNhZFsxXTsKKyAgICAgICAgICAgIHNhZFtuZGlzcF0gPSBzYWRbbmRpc3AtMl07CisgICAgICAgICAgICBpbnQgcCA9IHNhZFttaW5kKzFdLCBuID0gc2FkW21pbmQtMV0sIGQgPSBwICsgbiAtIDIqc2FkW21pbmRdOworICAgICAgICAgICAgZHB0clt5KmRzdGVwXSA9IChzaG9ydCkoKChuZGlzcCAtIG1pbmQgLSAxICsgbWluZGlzcCkqMjU2ICsgKGQgIT0gMCA/IChwLW4pKjEyOC9kIDogMCkgKyAxNSkgPj4gNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUJNKCBjb25zdCBDdkFyciogbGVmdGFyciwgY29uc3QgQ3ZBcnIqIHJpZ2h0YXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRpc3BhcnIsIEN2U3RlcmVvQk1TdGF0ZSogc3RhdGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2VCTSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IGxzdHViLCAqbGVmdDAgPSBjdkdldE1hdCggbGVmdGFyciwgJmxzdHViICk7CisgICAgQ3ZNYXQgcnN0dWIsICpyaWdodDAgPSBjdkdldE1hdCggcmlnaHRhcnIsICZyc3R1YiApOworICAgIEN2TWF0IGxlZnQsIHJpZ2h0OworICAgIEN2TWF0IGRzdHViLCAqZGlzcCA9IGN2R2V0TWF0KCBkaXNwYXJyLCAmZHN0dWIgKTsKKyAgICBpbnQgYnVmU2l6ZTAsIGJ1ZlNpemUxLCBidWZTaXplLCB3aWR0aCwgd2lkdGgxLCBoZWlnaHQ7CisgICAgaW50IHdzeiwgbmRpc3AsIG1pbmRpc3AsIGxvZnMsIHJvZnM7CisgICAgaW50IGksIG4gPSBjdkdldE51bVRocmVhZHMoKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKGxlZnQwLCByaWdodDApIHx8CisgICAgICAgICFDVl9BUkVfU0laRVNfRVEoZGlzcCwgbGVmdDApICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQWxsIHRoZSBpbWFnZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUobGVmdDAtPnR5cGUpICE9IENWXzhVQzEgfHwKKyAgICAgICAgIUNWX0FSRV9UWVBFU19FUShsZWZ0MCwgcmlnaHQwKSB8fAorICAgICAgICBDVl9NQVRfVFlQRShkaXNwLT50eXBlKSAhPSBDVl8xNlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIkJvdGggaW5wdXQgaW1hZ2VzIG11c3QgaGF2ZSA4dUMxIGZvcm1hdCBhbmQgdGhlIGRpc3Bhcml0eSBpbWFnZSBtdXN0IGhhdmUgMTZzQzEgZm9ybWF0IiApOworCisgICAgaWYoICFzdGF0ZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU3RlcmVvIEJNIHN0YXRlIGlzIE5VTEwuIiApOworCisgICAgaWYoIHN0YXRlLT5wcmVGaWx0ZXJUeXBlICE9IENWX1NURVJFT19CTV9OT1JNQUxJWkVEX1JFU1BPTlNFICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJwcmVGaWx0ZXJUeXBlIG11c3QgYmUgPUNWX1NURVJFT19CTV9OT1JNQUxJWkVEX1JFU1BPTlNFIiApOworCisgICAgaWYoIHN0YXRlLT5wcmVGaWx0ZXJTaXplIDwgNSB8fCBzdGF0ZS0+cHJlRmlsdGVyU2l6ZSA+IDI1NSB8fCBzdGF0ZS0+cHJlRmlsdGVyU2l6ZSAlIDIgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAicHJlRmlsdGVyU2l6ZSBtdXN0IGJlIG9kZCBhbmQgYmUgd2l0aGluIDUuLjI1NSIgKTsKKworICAgIGlmKCBzdGF0ZS0+cHJlRmlsdGVyQ2FwIDwgMSB8fCBzdGF0ZS0+cHJlRmlsdGVyQ2FwID4gNjMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInByZUZpbHRlckNhcCBtdXN0IGJlIHdpdGhpbiAxLi42MyIgKTsKKworICAgIGlmKCBzdGF0ZS0+U0FEV2luZG93U2l6ZSA8IDUgfHwgc3RhdGUtPlNBRFdpbmRvd1NpemUgPiAyNTUgfHwgc3RhdGUtPlNBRFdpbmRvd1NpemUgJSAyID09IDAgfHwKKyAgICAgICAgc3RhdGUtPlNBRFdpbmRvd1NpemUgPj0gTUlOKGxlZnQwLT5jb2xzLCBsZWZ0MC0+cm93cykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNBRFdpbmRvd1NpemUgbXVzdCBiZSBvZGQsIGJlIHdpdGhpbiA1Li4yNTUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZSBub3QgbGFyZ2VyIHRoYW4gaW1hZ2Ugd2lkdGggb3IgaGVpZ2h0IiApOworCisgICAgaWYoIHN0YXRlLT5udW1iZXJPZkRpc3Bhcml0aWVzIDw9IDAgfHwgc3RhdGUtPm51bWJlck9mRGlzcGFyaXRpZXMgJSAxNiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJudW1iZXJPZkRpc3Bhcml0aWVzIG11c3QgYmUgcG9zaXRpdmUgYW5kIGRpdmlzYmxlIGJ5IDE2IiApOworICAgIGlmKCBzdGF0ZS0+dGV4dHVyZVRocmVzaG9sZCA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInRleHR1cmUgdGhyZXNob2xkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiApOworICAgIGlmKCBzdGF0ZS0+dW5pcXVlbmVzc1JhdGlvIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAidW5pcXVlbmVzcyByYXRpbyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIgKTsKKworICAgIGlmKCAhc3RhdGUtPnByZUZpbHRlcmVkSW1nMCB8fAorICAgICAgICBzdGF0ZS0+cHJlRmlsdGVyZWRJbWcwLT5jb2xzKnN0YXRlLT5wcmVGaWx0ZXJlZEltZzAtPnJvd3MgPCBsZWZ0MC0+Y29scypsZWZ0MC0+cm93cyApCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZzdGF0ZS0+cHJlRmlsdGVyZWRJbWcwICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5wcmVGaWx0ZXJlZEltZzEgKTsKKworICAgICAgICBzdGF0ZS0+cHJlRmlsdGVyZWRJbWcwID0gY3ZDcmVhdGVNYXQoIGxlZnQwLT5yb3dzLCBsZWZ0MC0+Y29scywgQ1ZfOFUgKTsKKyAgICAgICAgc3RhdGUtPnByZUZpbHRlcmVkSW1nMSA9IGN2Q3JlYXRlTWF0KCBsZWZ0MC0+cm93cywgbGVmdDAtPmNvbHMsIENWXzhVICk7CisgICAgfQorICAgIGxlZnQgPSBjdk1hdChsZWZ0MC0+cm93cywgbGVmdDAtPmNvbHMsIENWXzhVLCBzdGF0ZS0+cHJlRmlsdGVyZWRJbWcwLT5kYXRhLnB0cik7CisgICAgcmlnaHQgPSBjdk1hdChyaWdodDAtPnJvd3MsIHJpZ2h0MC0+Y29scywgQ1ZfOFUsIHN0YXRlLT5wcmVGaWx0ZXJlZEltZzEtPmRhdGEucHRyKTsKKyAgICAKKyAgICBtaW5kaXNwID0gc3RhdGUtPm1pbkRpc3Bhcml0eTsKKyAgICBuZGlzcCA9IHN0YXRlLT5udW1iZXJPZkRpc3Bhcml0aWVzOworCisgICAgd2lkdGggPSBsZWZ0MC0+Y29sczsKKyAgICBoZWlnaHQgPSBsZWZ0MC0+cm93czsKKyAgICBsb2ZzID0gTUFYKG5kaXNwIC0gMSArIG1pbmRpc3AsIDApOworICAgIHJvZnMgPSAtTUlOKG5kaXNwIC0gMSArIG1pbmRpc3AsIDApOworICAgIHdpZHRoMSA9IHdpZHRoIC0gcm9mcyAtIG5kaXNwICsgMTsKKyAgICBpZiggbG9mcyA+PSB3aWR0aCB8fCByb2ZzID49IHdpZHRoIHx8IHdpZHRoMSA8IDEgKQorICAgIHsKKyAgICAgICAgaW50IEZJTFRFUkVEID0gKHNob3J0KSgoc3RhdGUtPm1pbkRpc3Bhcml0eSAtIDEpIDw8IERJU1BBUklUWV9TSElGVCk7CisgICAgICAgIGN2U2V0KCBkaXNwLCBjdlNjYWxhckFsbChGSUxURVJFRCkgKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICB3c3ogPSBzdGF0ZS0+U0FEV2luZG93U2l6ZTsKKyAgICBidWZTaXplMCA9IChuZGlzcCArIDIpKnNpemVvZihpbnQpICsgKGhlaWdodCt3c3orMikqbmRpc3Aqc2l6ZW9mKGludCkgKworICAgICAgICAoaGVpZ2h0ICsgd3N6ICsgMikqc2l6ZW9mKGludCkgKyAoaGVpZ2h0K3dzeisyKSpuZGlzcCood3N6KzEpKnNpemVvZih1Y2hhcikgKyAyNTY7CisgICAgYnVmU2l6ZTEgPSAod2lkdGggKyBzdGF0ZS0+cHJlRmlsdGVyU2l6ZSArIDIpKnNpemVvZihpbnQpICsgMjU2OworICAgIGJ1ZlNpemUgPSBNQVgoYnVmU2l6ZTAsIGJ1ZlNpemUxKTsKKyAgICBuID0gTUFYKE1JTihoZWlnaHQvd3N6LCBuKSwgMSk7CisKKyAgICBpZiggIXN0YXRlLT5zbGlkaW5nU3VtQnVmIHx8IHN0YXRlLT5zbGlkaW5nU3VtQnVmLT5jb2xzIDwgYnVmU2l6ZSpuICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5zbGlkaW5nU3VtQnVmICk7CisgICAgICAgIHN0YXRlLT5zbGlkaW5nU3VtQnVmID0gY3ZDcmVhdGVNYXQoIDEsIGJ1ZlNpemUqbiwgQ1ZfOFUgKTsKKyAgICB9CisKKyNpZmRlZiBfT1BFTk1QCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBudW1fdGhyZWFkcyhuKQorI2VuZGlmCisgICAgeworICAgICNpZmRlZiBfT1BFTk1QCisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICNlbmRpZgorICAgICAgICBpY3ZQcmVmaWx0ZXIoIGxlZnQwLCAmbGVmdCwgc3RhdGUtPnByZUZpbHRlclNpemUsCisgICAgICAgICAgICBzdGF0ZS0+cHJlRmlsdGVyQ2FwLCBzdGF0ZS0+c2xpZGluZ1N1bUJ1Zi0+ZGF0YS5wdHIgKTsKKyAgICAjaWZkZWYgX09QRU5NUAorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAjZW5kaWYKKyAgICAgICAgaWN2UHJlZmlsdGVyKCByaWdodDAsICZyaWdodCwgc3RhdGUtPnByZUZpbHRlclNpemUsCisgICAgICAgICAgICBzdGF0ZS0+cHJlRmlsdGVyQ2FwLCBzdGF0ZS0+c2xpZGluZ1N1bUJ1Zi0+ZGF0YS5wdHIgKyBidWZTaXplMSoobj4xKSApOworICAgIH0KKworI2lmZGVmIF9PUEVOTVAKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHMobikgc2NoZWR1bGUoc3RhdGljKQorI2VuZGlmCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgdGhyZWFkX2lkID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgQ3ZNYXQgbGVmdF9pLCByaWdodF9pLCBkaXNwX2k7CisgICAgICAgIGludCByb3cwID0gaSpsZWZ0LnJvd3Mvbiwgcm93MSA9IChpKzEpKmxlZnQucm93cy9uOworICAgICAgICBjdkdldFJvd3MoICZsZWZ0LCAmbGVmdF9pLCByb3cwLCByb3cxICk7CisgICAgICAgIGN2R2V0Um93cyggJnJpZ2h0LCAmcmlnaHRfaSwgcm93MCwgcm93MSApOworICAgICAgICBjdkdldFJvd3MoIGRpc3AsICZkaXNwX2ksIHJvdzAsIHJvdzEgKTsKKyAgICAjaWYgQ1ZfU1NFMgorICAgICAgICBpZiggc3RhdGUtPnByZUZpbHRlckNhcCA8PSAzMSAmJiBzdGF0ZS0+U0FEV2luZG93U2l6ZSA8PSAyMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUJNX1NTRTIoICZsZWZ0X2ksICZyaWdodF9pLCAmZGlzcF9pLCBzdGF0ZSwKKyAgICAgICAgICAgICAgICBzdGF0ZS0+c2xpZGluZ1N1bUJ1Zi0+ZGF0YS5wdHIgKyB0aHJlYWRfaWQqYnVmU2l6ZTAsIHJvdzAsIGxlZnQucm93cy1yb3cxICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBpY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2VCTSggJmxlZnRfaSwgJnJpZ2h0X2ksICZkaXNwX2ksIHN0YXRlLAorICAgICAgICAgICAgICAgIHN0YXRlLT5zbGlkaW5nU3VtQnVmLT5kYXRhLnB0ciArIHRocmVhZF9pZCpidWZTaXplMCwgcm93MCwgbGVmdC5yb3dzLXJvdzEgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2c3RlcmVvZ2MuY3BwIGIvY3Yvc3JjL2N2c3RlcmVvZ2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmY4MDYKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZzdGVyZW9nYy5jcHAKQEAgLTAsMCArMSw5NjAgQEAKKy8vTSovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKKyN1bmRlZiBJTkZJTklUWQorI2RlZmluZSBJTkZJTklUWSAxMDAwMAorI2RlZmluZSBPQ0NMVVNJT05fUEVOQUxUWSAxMDAwMAorI2RlZmluZSBPQ0NMVVNJT05fUEVOQUxUWTIgMTAwMAorI2RlZmluZSBERU5PTUlOQVRPUiAxNgorI3VuZGVmIE9DQ0xVREVECisjZGVmaW5lIE9DQ0xVREVEIENWX1NURVJFT19HQ19PQ0NMVURFRAorI2RlZmluZSBDVVRPRkYgMTAwMAorI2RlZmluZSBJU19CTE9DS0VEKGQxLCBkMikgKChkMSkgPiAoZDIpKQorCit0eXBlZGVmIHN0cnVjdCBHQ1Z0eAoreworICAgIEdDVnR4ICpuZXh0OworICAgIGludCBwYXJlbnQ7CisgICAgaW50IGZpcnN0OworICAgIGludCB0czsKKyAgICBpbnQgZGlzdDsKKyAgICBzaG9ydCB3ZWlnaHQ7CisgICAgdWNoYXIgdDsKK30KK0dDVnR4OworCit0eXBlZGVmIHN0cnVjdCBHQ0VkZ2UKK3sKKyAgICBHQ1Z0eCogZHN0OworICAgIGludCBuZXh0OworICAgIGludCB3ZWlnaHQ7Cit9CitHQ0VkZ2U7CisKK3R5cGVkZWYgc3RydWN0IEN2U3RlcmVvR0NTdGF0ZTIKK3sKKyAgICBpbnQgSXRocmVzaG9sZCwgaW50ZXJhY3Rpb25SYWRpdXM7CisgICAgaW50IGxhbWJkYSwgbGFtYmRhMSwgbGFtYmRhMiwgSzsKKyAgICBpbnQgZGF0YUNvc3RGdW5jVGFiW0NVVE9GRisxXTsKKyAgICBpbnQgc21vb3RobmVzc1JbQ1VUT0ZGKjIrMV07CisgICAgaW50IHNtb290aG5lc3NHcmF5RGlmZls1MTJdOworICAgIEdDVnR4Kiogb3JwaGFuczsKKyAgICBpbnQgbWF4T3JwaGFuczsKK30KK0N2U3RlcmVvR0NTdGF0ZTI7CisKKy8vIHRydW5jVGFiW3grMjU1XSA9IE1BWCh4LTI1NSwwKQorc3RhdGljIHVjaGFyIGljdlRydW5jVGFiWzUxMl07CisvLyBjdXRvZmZTcXJUYWJbeF0gPSBNSU4oeCp4LCBDVVRPRkYpCitzdGF0aWMgaW50IGljdkN1dG9mZlNxclRhYlsyNTZdOworCitzdGF0aWMgdm9pZCBpY3ZJbml0U3RlcmVvQ29uc3RUYWJzKCkKK3sKKyAgICBzdGF0aWMgdm9sYXRpbGUgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBpZiggIWluaXRpYWxpemVkICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNTEyOyBpKysgKQorICAgICAgICAgICAgaWN2VHJ1bmNUYWJbaV0gPSAodWNoYXIpTUlOKE1BWChpLTI1NSwwKSwyNTUpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKQorICAgICAgICAgICAgaWN2Q3V0b2ZmU3FyVGFiW2ldID0gTUlOKGkqaSwgQ1VUT0ZGKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSAxOworICAgIH0KK30KKworc3RhdGljIHZvaWQgaWN2SW5pdFN0ZXJlb1RhYnMoIEN2U3RlcmVvR0NTdGF0ZTIqIHN0YXRlMiApCit7CisgICAgaW50IGksIEsgPSBzdGF0ZTItPks7CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IENVVE9GRjsgaSsrICkKKyAgICAgICAgc3RhdGUyLT5kYXRhQ29zdEZ1bmNUYWJbaV0gPSBNSU4oaSpERU5PTUlOQVRPUiAtIEssIDApOworCisgICAgZm9yKCBpID0gMDsgaSA8IENVVE9GRioyICsgMTsgaSsrICkKKyAgICAgICAgc3RhdGUyLT5zbW9vdGhuZXNzUltpXSA9IE1JTihhYnMoaS1DVVRPRkYpLCBzdGF0ZTItPmludGVyYWN0aW9uUmFkaXVzKTsKKworICAgIGZvciggaSA9IDA7IGkgPCA1MTI7IGkrKyApCisgICAgeworICAgICAgICBpbnQgZGlmZiA9IGFicyhpIC0gMjU1KTsKKyAgICAgICAgc3RhdGUyLT5zbW9vdGhuZXNzR3JheURpZmZbaV0gPSBkaWZmIDwgc3RhdGUyLT5JdGhyZXNob2xkID8gc3RhdGUyLT5sYW1iZGExIDogc3RhdGUyLT5sYW1iZGEyOworICAgIH0KK30KKworCitzdGF0aWMgaW50IGljdkdDUmVzaXplT3JwaGFuc0J1ZiggR0NWdHgqKiYgb3JwaGFucywgaW50IG5vcnBoYW5zICkKK3sKKyAgICBpbnQgaSwgbmV3Tk9ycGhhbnMgPSBNQVgobm9ycGhhbnMqMy8yLCAyNTYpOworICAgIEdDVnR4KiogbmV3T3JwaGFucyA9IChHQ1Z0eCoqKWN2QWxsb2MoIG5ld05PcnBoYW5zKnNpemVvZihvcnBoYW5zWzBdKSApOworICAgIGZvciggaSA9IDA7IGkgPCBub3JwaGFuczsgaSsrICkKKyAgICAgICAgbmV3T3JwaGFuc1tpXSA9IG9ycGhhbnNbaV07CisgICAgY3ZGcmVlKCAmb3JwaGFucyApOworICAgIG9ycGhhbnMgPSBuZXdPcnBoYW5zOworICAgIHJldHVybiBuZXdOT3JwaGFuczsKK30KKworc3RhdGljIGludDY0IGljdkdDTWF4RmxvdyggR0NWdHgqIHZ0eCwgaW50IG52dHgsIEdDRWRnZSogZWRnZXMsIEdDVnR4KiomIF9vcnBoYW5zLCBpbnQmIF9tYXhPcnBoYW5zICkKK3sKKyAgICBjb25zdCBpbnQgVEVSTUlOQUwgPSAtMSwgT1JQSEFOID0gLTI7CisgICAgR0NWdHggc3R1YiwgKm5pbCA9ICZzdHViLCAqZmlyc3QgPSBuaWwsICpsYXN0ID0gbmlsOworICAgIGludCBpLCBrOworICAgIGludCBjdXJyX3RzID0gMDsKKyAgICBpbnQ2NCBmbG93ID0gMDsKKyAgICBpbnQgbm9ycGhhbnMgPSAwLCBtYXhPcnBoYW5zID0gX21heE9ycGhhbnM7CisgICAgR0NWdHgqKiBvcnBoYW5zID0gX29ycGhhbnM7CisgICAgc3R1Yi5uZXh0ID0gbmlsOworICAgIAorICAgIC8vIGluaXRpYWxpemUgdGhlIGFjdGl2ZSBxdWV1ZSBhbmQgdGhlIGdyYXBoIHZlcnRpY2VzCisgICAgZm9yKCBpID0gMDsgaSA8IG52dHg7IGkrKyApCisgICAgeworICAgICAgICBHQ1Z0eCogdiA9IHZ0eCArIGk7CisgICAgICAgIHYtPnRzID0gMDsKKyAgICAgICAgaWYoIHYtPndlaWdodCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbGFzdCA9IGxhc3QtPm5leHQgPSB2OworICAgICAgICAgICAgdi0+ZGlzdCA9IDE7CisgICAgICAgICAgICB2LT5wYXJlbnQgPSBURVJNSU5BTDsKKyAgICAgICAgICAgIHYtPnQgPSB2LT53ZWlnaHQgPCAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHYtPnBhcmVudCA9IDA7CisgICAgfQorCisgICAgZmlyc3QgPSBmaXJzdC0+bmV4dDsKKyAgICBsYXN0LT5uZXh0ID0gbmlsOworICAgIG5pbC0+bmV4dCA9IDA7CisKKyAgICAvLyBydW4gdGhlIHNlYXJjaC1wYXRoIC0+IGF1Z21lbnQtZ3JhcGggLT4gcmVzdG9yZS10cmVlcyBsb29wCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgR0NWdHgqIHYsICp1OworICAgICAgICBpbnQgZTAgPSAtMSwgZWkgPSAwLCBlaiA9IDAsIG1pbl93ZWlnaHQsIHdlaWdodDsKKyAgICAgICAgdWNoYXIgdnQ7CisgICAgICAgIAorICAgICAgICAvLyBncm93IFMgJiBUIHNlYXJjaCB0cmVlcywgZmluZCBhbiBlZGdlIGNvbm5lY3RpbmcgdGhlbQorICAgICAgICB3aGlsZSggZmlyc3QgIT0gbmlsICkKKyAgICAgICAgeworICAgICAgICAgICAgdiA9IGZpcnN0OworICAgICAgICAgICAgaWYoIHYtPnBhcmVudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdnQgPSB2LT50OworICAgICAgICAgICAgICAgIGZvciggZWkgPSB2LT5maXJzdDsgZWkgIT0gMDsgZWkgPSBlZGdlc1tlaV0ubmV4dCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZWRnZXNbZWlednRdLndlaWdodCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB1ID0gZWRnZXNbZWldLmRzdDsKKyAgICAgICAgICAgICAgICAgICAgaWYoICF1LT5wYXJlbnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1LT50ID0gdnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB1LT5wYXJlbnQgPSBlaSBeIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB1LT50cyA9IHYtPnRzOworICAgICAgICAgICAgICAgICAgICAgICAgdS0+ZGlzdCA9IHYtPmRpc3QgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICF1LT5uZXh0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1LT5uZXh0ID0gbmlsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBsYXN0LT5uZXh0ID0gdTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHUtPnQgIT0gdnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlMCA9IGVpIF4gdnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB1LT5kaXN0ID4gdi0+ZGlzdCsxICYmIHUtPnRzIDw9IHYtPnRzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVhc3NpZ24gdGhlIHBhcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgdS0+cGFyZW50ID0gZWkgXiAxOworICAgICAgICAgICAgICAgICAgICAgICAgdS0+dHMgPSB2LT50czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUtPmRpc3QgPSB2LT5kaXN0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggZTAgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBleGNsdWRlIHRoZSB2ZXJ0ZXggZnJvbSB0aGUgYWN0aXZlIGxpc3QKKyAgICAgICAgICAgIGZpcnN0ID0gZmlyc3QtPm5leHQ7CisgICAgICAgICAgICB2LT5uZXh0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBlMCA8PSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIC8vIGZpbmQgdGhlIG1pbmltdW0gZWRnZSB3ZWlnaHQgYWxvbmcgdGhlIHBhdGgKKyAgICAgICAgbWluX3dlaWdodCA9IGVkZ2VzW2UwXS53ZWlnaHQ7CisgICAgICAgIGFzc2VydCggbWluX3dlaWdodCA+IDAgKTsKKyAgICAgICAgLy8gayA9IDE6IHNvdXJjZSB0cmVlLCBrID0gMDogZGVzdGluYXRpb24gdHJlZQorICAgICAgICBmb3IoIGsgPSAxOyBrID49IDA7IGstLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggdiA9IGVkZ2VzW2UwXmtdLmRzdDs7IHYgPSBlZGdlc1tlaV0uZHN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggKGVpID0gdi0+cGFyZW50KSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB3ZWlnaHQgPSBlZGdlc1tlaV5rXS53ZWlnaHQ7CisgICAgICAgICAgICAgICAgbWluX3dlaWdodCA9IE1JTihtaW5fd2VpZ2h0LCB3ZWlnaHQpOworICAgICAgICAgICAgICAgIGFzc2VydCggbWluX3dlaWdodCA+IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdlaWdodCA9IGFicyh2LT53ZWlnaHQpOworICAgICAgICAgICAgbWluX3dlaWdodCA9IE1JTihtaW5fd2VpZ2h0LCB3ZWlnaHQpOworICAgICAgICAgICAgYXNzZXJ0KCBtaW5fd2VpZ2h0ID4gMCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gbW9kaWZ5IHdlaWdodHMgb2YgdGhlIGVkZ2VzIGFsb25nIHRoZSBwYXRoIGFuZCBjb2xsZWN0IG9ycGhhbnMKKyAgICAgICAgZWRnZXNbZTBdLndlaWdodCAtPSBtaW5fd2VpZ2h0OworICAgICAgICBlZGdlc1tlMF4xXS53ZWlnaHQgKz0gbWluX3dlaWdodDsKKyAgICAgICAgZmxvdyArPSBtaW5fd2VpZ2h0OworCisgICAgICAgIC8vIGsgPSAxOiBzb3VyY2UgdHJlZSwgayA9IDA6IGRlc3RpbmF0aW9uIHRyZWUKKyAgICAgICAgZm9yKCBrID0gMTsgayA+PSAwOyBrLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIHYgPSBlZGdlc1tlMF5rXS5kc3Q7OyB2ID0gZWRnZXNbZWldLmRzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIChlaSA9IHYtPnBhcmVudCkgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWRnZXNbZWleKGteMSldLndlaWdodCArPSBtaW5fd2VpZ2h0OworICAgICAgICAgICAgICAgIGlmKCAoZWRnZXNbZWlea10ud2VpZ2h0IC09IG1pbl93ZWlnaHQpID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5vcnBoYW5zID49IG1heE9ycGhhbnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgbWF4T3JwaGFucyA9IGljdkdDUmVzaXplT3JwaGFuc0J1Ziggb3JwaGFucywgbm9ycGhhbnMgKTsKKyAgICAgICAgICAgICAgICAgICAgb3JwaGFuc1tub3JwaGFucysrXSA9IHY7CisgICAgICAgICAgICAgICAgICAgIHYtPnBhcmVudCA9IE9SUEhBTjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHYtPndlaWdodCA9IChzaG9ydCkodi0+d2VpZ2h0ICsgbWluX3dlaWdodCooMS1rKjIpKTsKKyAgICAgICAgICAgIGlmKCB2LT53ZWlnaHQgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG5vcnBoYW5zID49IG1heE9ycGhhbnMgKQorICAgICAgICAgICAgICAgICAgICBtYXhPcnBoYW5zID0gaWN2R0NSZXNpemVPcnBoYW5zQnVmKCBvcnBoYW5zLCBub3JwaGFucyApOworICAgICAgICAgICAgICAgIG9ycGhhbnNbbm9ycGhhbnMrK10gPSB2OworICAgICAgICAgICAgICAgIHYtPnBhcmVudCA9IE9SUEhBTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlc3RvcmUgdGhlIHNlYXJjaCB0cmVlcyBieSBmaW5kaW5nIG5ldyBwYXJlbnRzIGZvciB0aGUgb3JwaGFucworICAgICAgICBjdXJyX3RzKys7CisgICAgICAgIHdoaWxlKCBub3JwaGFucyA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBHQ1Z0eCogdiA9IG9ycGhhbnNbLS1ub3JwaGFuc107CisgICAgICAgICAgICBpbnQgZCwgbWluX2Rpc3QgPSBJTlRfTUFYOworICAgICAgICAgICAgZTAgPSAwOworICAgICAgICAgICAgdnQgPSB2LT50OworCisgICAgICAgICAgICBmb3IoIGVpID0gdi0+Zmlyc3Q7IGVpICE9IDA7IGVpID0gZWRnZXNbZWldLm5leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBlZGdlc1tlaV4odnReMSldLndlaWdodCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgdSA9IGVkZ2VzW2VpXS5kc3Q7CisgICAgICAgICAgICAgICAgaWYoIHUtPnQgIT0gdnQgfHwgdS0+cGFyZW50ID09IDAgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAvLyBjb21wdXRlIHRoZSBkaXN0YW5jZSB0byB0aGUgdHJlZSByb290CisgICAgICAgICAgICAgICAgZm9yKCBkID0gMDs7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB1LT50cyA9PSBjdXJyX3RzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZCArPSB1LT5kaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWogPSB1LT5wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGQrKzsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGVqIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBlaiA9PSBPUlBIQU4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBJTlRfTUFYLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdS0+dHMgPSBjdXJyX3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUtPmRpc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdSA9IGVkZ2VzW2VqXS5kc3Q7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBkaXN0YW5jZQorICAgICAgICAgICAgICAgIGlmKCArK2QgPCBJTlRfTUFYICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBkIDwgbWluX2Rpc3QgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaW5fZGlzdCA9IGQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlMCA9IGVpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciggdSA9IGVkZ2VzW2VpXS5kc3Q7IHUtPnRzICE9IGN1cnJfdHM7IHUgPSBlZGdlc1t1LT5wYXJlbnRdLmRzdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUtPnRzID0gY3Vycl90czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUtPmRpc3QgPSAtLWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAodi0+cGFyZW50ID0gZTApID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdi0+dHMgPSBjdXJyX3RzOworICAgICAgICAgICAgICAgIHYtPmRpc3QgPSBtaW5fZGlzdDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbm8gcGFyZW50IGlzIGZvdW5kICovCisgICAgICAgICAgICB2LT50cyA9IDA7CisgICAgICAgICAgICBmb3IoIGVpID0gdi0+Zmlyc3Q7IGVpICE9IDA7IGVpID0gZWRnZXNbZWldLm5leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHUgPSBlZGdlc1tlaV0uZHN0OworICAgICAgICAgICAgICAgIGVqID0gdS0+cGFyZW50OworICAgICAgICAgICAgICAgIGlmKCB1LT50ICE9IHZ0IHx8ICFlaiApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmKCBlZGdlc1tlaV4odnReMSldLndlaWdodCAmJiAhdS0+bmV4dCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1LT5uZXh0ID0gbmlsOworICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC0+bmV4dCA9IHU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBlaiA+IDAgJiYgZWRnZXNbZWpdLmRzdCA9PSB2ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBub3JwaGFucyA+PSBtYXhPcnBoYW5zICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heE9ycGhhbnMgPSBpY3ZHQ1Jlc2l6ZU9ycGhhbnNCdWYoIG9ycGhhbnMsIG5vcnBoYW5zICk7CisgICAgICAgICAgICAgICAgICAgIG9ycGhhbnNbbm9ycGhhbnMrK10gPSB1OworICAgICAgICAgICAgICAgICAgICB1LT5wYXJlbnQgPSBPUlBIQU47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX29ycGhhbnMgPSBvcnBoYW5zOworICAgIF9tYXhPcnBoYW5zID0gbWF4T3JwaGFuczsKKworICAgIHJldHVybiBmbG93OworfQorCisKK0N2U3RlcmVvR0NTdGF0ZSogY3ZDcmVhdGVTdGVyZW9HQ1N0YXRlKCBpbnQgbnVtYmVyT2ZEaXNwYXJpdGllcywgaW50IG1heEl0ZXJzICkKK3sKKyAgICBDdlN0ZXJlb0dDU3RhdGUqIHN0YXRlID0gMDsKKworICAgIC8vQ1ZfRlVOQ05BTUUoImN2Q3JlYXRlU3RlcmVvR0NTdGF0ZSIpOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIHN0YXRlID0gKEN2U3RlcmVvR0NTdGF0ZSopY3ZBbGxvYyggc2l6ZW9mKCpzdGF0ZSkgKTsKKyAgICBtZW1zZXQoIHN0YXRlLCAwLCBzaXplb2YoKnN0YXRlKSApOworICAgIHN0YXRlLT5taW5EaXNwYXJpdHkgPSAwOworICAgIHN0YXRlLT5udW1iZXJPZkRpc3Bhcml0aWVzID0gbnVtYmVyT2ZEaXNwYXJpdGllczsKKyAgICBzdGF0ZS0+bWF4SXRlcnMgPSBtYXhJdGVycyA8PSAwID8gMyA6IG1heEl0ZXJzOworICAgIHN0YXRlLT5JdGhyZXNob2xkID0gNTsKKyAgICBzdGF0ZS0+aW50ZXJhY3Rpb25SYWRpdXMgPSAxOworICAgIHN0YXRlLT5LID0gc3RhdGUtPmxhbWJkYSA9IHN0YXRlLT5sYW1iZGExID0gc3RhdGUtPmxhbWJkYTIgPSAtMS5mOworICAgIHN0YXRlLT5vY2NsdXNpb25Db3N0ID0gT0NDTFVTSU9OX1BFTkFMVFk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHN0YXRlOworfQorCit2b2lkIGN2UmVsZWFzZVN0ZXJlb0dDU3RhdGUoIEN2U3RlcmVvR0NTdGF0ZSoqIF9zdGF0ZSApCit7CisgICAgQ3ZTdGVyZW9HQ1N0YXRlKiBzdGF0ZTsKKyAgICAKKyAgICBpZiggIV9zdGF0ZSAmJiAhKl9zdGF0ZSApCisgICAgICAgIHJldHVybjsKKworICAgIHN0YXRlID0gKl9zdGF0ZTsKKyAgICBjdlJlbGVhc2VNYXQoICZzdGF0ZS0+bGVmdCApOworICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5yaWdodCApOworICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5wdHJMZWZ0ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc3RhdGUtPnB0clJpZ2h0ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc3RhdGUtPnZ0eEJ1ZiApOworICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5lZGdlQnVmICk7CisgICAgY3ZGcmVlKCBfc3RhdGUgKTsKK30KKworLy8gfHxJKHgpIC0gSih4Jyl8fCA9CisvLyBtaW4oQ1VUT0ZGLAorLy8gICBtaW4oCisvLyAgICAgbWF4KAorLy8gICAgICAgbWF4KG1pbkooeCcpIC0gSSh4KSwgMCksCisvLyAgICAgICBtYXgoSSh4KSAtIG1heEooeCcpLCAwKSksCisvLyAgICAgbWF4KAorLy8gICAgICAgbWF4KG1pbkkoeCkgLSBKKHgnKSwgMCksCisvLyAgICAgICBtYXgoSih4JykgLSBtYXhJKHgpLCAwKSkpKioyKSA9PQorLy8gbWluKENVVE9GRiwKKy8vICAgbWluKAorLy8gICAgICAgbWF4KG1pbkooeCcpIC0gSSh4KSwgMCkgKworLy8gICAgICAgbWF4KEkoeCkgLSBtYXhKKHgnKSwgMCksCisvLworLy8gICAgICAgbWF4KG1pbkkoeCkgLSBKKHgnKSwgMCkgKworLy8gICAgICAgbWF4KEooeCcpIC0gbWF4SSh4KSwgMCkpKSoqMikKKy8vIHdoZXJlIChJLCBtaW5JLCBtYXhJKSBhbmQKKy8vICAgICAgIChKLCBtaW5KLCBtYXhKKSBhcmUgc3RvcmVkIGFzIGludGVybGVhdmVkIDMtY2hhbm5lbCBpbWFnZXMuCisvLyBtaW5JLCBtYXhJIGFyZSBjb21wdXRlZCBmcm9tIEksCisvLyBtaW5KLCBtYXhKIGFyZSBjb21wdXRlZCBmcm9tIEogLSBzZWUgaWN2SW5pdEdyYXlTdWJQaXguCitzdGF0aWMgaW5saW5lIGludCBpY3ZEYXRhQ29zdEZ1bmNHcmF5U3VicGl4KCBjb25zdCB1Y2hhciogYSwgY29uc3QgdWNoYXIqIGIgKQoreworICAgIGludCB2YSA9IGFbMF0sIHZiID0gYlswXTsKKyAgICBpbnQgZGEgPSBpY3ZUcnVuY1RhYltiWzFdIC0gdmEgKyAyNTVdICsgaWN2VHJ1bmNUYWJbdmEgLSBiWzJdICsgMjU1XTsKKyAgICBpbnQgZGIgPSBpY3ZUcnVuY1RhYlthWzFdIC0gdmIgKyAyNTVdICsgaWN2VHJ1bmNUYWJbdmIgLSBhWzJdICsgMjU1XTsKKyAgICByZXR1cm4gaWN2Q3V0b2ZmU3FyVGFiW01JTihkYSxkYildOworfQorCitzdGF0aWMgaW5saW5lIGludCBpY3ZTbW9vdGhuZXNzQ29zdEZ1bmMoIGludCBkYSwgaW50IGRiLCBpbnQgbWF4UiwgY29uc3QgaW50KiBzdGFiUiwgaW50IHNjYWxlICkKK3sKKyAgICByZXR1cm4gZGEgPT0gZGIgPyAwIDogKGRhID09IE9DQ0xVREVEIHx8IGRiID09IE9DQ0xVREVEID8gbWF4UiA6IHN0YWJSW2RhIC0gZGJdKSpzY2FsZTsKK30KKworc3RhdGljIHZvaWQgaWN2SW5pdEdyYXlTdWJwaXgoIGNvbnN0IEN2TWF0KiBsZWZ0LCBjb25zdCBDdk1hdCogcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGxlZnQzLCBDdk1hdCogcmlnaHQzICkKK3sKKyAgICBpbnQgaywgeCwgeSwgcm93cyA9IGxlZnQtPnJvd3MsIGNvbHMgPSBsZWZ0LT5jb2xzOworICAgIAorICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZNYXQqIHNyYyA9IGsgPT0gMCA/IGxlZnQgOiByaWdodDsKKyAgICAgICAgQ3ZNYXQqIGRzdCA9IGsgPT0gMCA/IGxlZnQzIDogcmlnaHQzOworICAgICAgICBpbnQgc3N0ZXAgPSBzcmMtPnN0ZXA7CisKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHJvd3M7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcHRyID0gc3JjLT5kYXRhLnB0ciArIHNzdGVwKnk7CisgICAgICAgICAgICBjb25zdCB1Y2hhciogc3B0cl9wcmV2ID0geSA+IDAgPyBzcHRyIC0gc3N0ZXAgOiBzcHRyOworICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNwdHJfbmV4dCA9IHkgPCByb3dzLTEgPyBzcHRyICsgc3N0ZXAgOiBzcHRyOworICAgICAgICAgICAgdWNoYXIqIGRwdHIgPSBkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKnk7CisgICAgICAgICAgICBpbnQgdl9wcmV2ID0gc3B0clswXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGNvbHM7IHgrKywgZHB0ciArPSAzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IHNwdHJbeF0sIHYxLCBtaW52ID0gdiwgbWF4diA9IHY7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgdjEgPSAodiArIHZfcHJldikvMjsKKyAgICAgICAgICAgICAgICBtaW52ID0gTUlOKG1pbnYsIHYxKTsgbWF4diA9IE1BWChtYXh2LCB2MSk7CisgICAgICAgICAgICAgICAgdjEgPSAodiArIHNwdHJfcHJldlt4XSkvMjsKKyAgICAgICAgICAgICAgICBtaW52ID0gTUlOKG1pbnYsIHYxKTsgbWF4diA9IE1BWChtYXh2LCB2MSk7CisgICAgICAgICAgICAgICAgdjEgPSAodiArIHNwdHJfbmV4dFt4XSkvMjsKKyAgICAgICAgICAgICAgICBtaW52ID0gTUlOKG1pbnYsIHYxKTsgbWF4diA9IE1BWChtYXh2LCB2MSk7CisgICAgICAgICAgICAgICAgaWYoIHggPCBjb2xzLTEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdjEgPSAodiArIHNwdHJbeCsxXSkvMjsKKyAgICAgICAgICAgICAgICAgICAgbWludiA9IE1JTihtaW52LCB2MSk7IG1heHYgPSBNQVgobWF4diwgdjEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2X3ByZXYgPSB2OworICAgICAgICAgICAgICAgIGRwdHJbMF0gPSAodWNoYXIpdjsKKyAgICAgICAgICAgICAgICBkcHRyWzFdID0gKHVjaGFyKW1pbnY7CisgICAgICAgICAgICAgICAgZHB0clsyXSA9ICh1Y2hhciltYXh2OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBPcHRpbWFsIEsgaXMgY29tcHV0ZWQgYXMgYXZnX3goay10aC1zbWFsbGVzdF9kKHx8SSh4KS1KKHgrZCl8fCkpLAorLy8gd2hlcmUgayA9IG51bWJlcl9vZl9kaXNwYXJpdGllcyowLjI1Lgorc3RhdGljIGZsb2F0CitpY3ZDb21wdXRlSyggQ3ZTdGVyZW9HQ1N0YXRlKiBzdGF0ZSApCit7CisgICAgaW50IHgsIHksIHgxLCBkLCBpLCBqLCByb3dzID0gc3RhdGUtPmxlZnQtPnJvd3MsIGNvbHMgPSBzdGF0ZS0+bGVmdC0+Y29scywgbiA9IDA7CisgICAgaW50IG1pbmQgPSBzdGF0ZS0+bWluRGlzcGFyaXR5LCBuZCA9IHN0YXRlLT5udW1iZXJPZkRpc3Bhcml0aWVzLCBtYXhkID0gbWluZCArIG5kOworICAgIGludCBrID0gTUlOKE1BWCgobmQgKyAyKS80LCAzKSwgbmQpOworICAgIGludCAqYXJyID0gKGludCopY3ZTdGFja0FsbG9jKGsqc2l6ZW9mKGFyclswXSkpLCBkZWx0YSwgdCwgc3VtID0gMDsKKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIGxwdHIgPSBzdGF0ZS0+bGVmdC0+ZGF0YS5wdHIgKyBzdGF0ZS0+bGVmdC0+c3RlcCp5OworICAgICAgICBjb25zdCB1Y2hhciogcnB0ciA9IHN0YXRlLT5yaWdodC0+ZGF0YS5wdHIgKyBzdGF0ZS0+cmlnaHQtPnN0ZXAqeTsKKyAgICAgICAgCisgICAgICAgIGZvciggeCA9IDA7IHggPCBjb2xzOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGQgPSBtYXhkLTEsIGkgPSAwOyBkID49IG1pbmQ7IGQtLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeDEgPSB4IC0gZDsKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXgxID49ICh1bnNpZ25lZCljb2xzICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgZGVsdGEgPSBpY3ZEYXRhQ29zdEZ1bmNHcmF5U3VicGl4KCBscHRyICsgeCozLCBycHRyICsgeDEqMyApOworICAgICAgICAgICAgICAgIGlmKCBpIDwgayApCisgICAgICAgICAgICAgICAgICAgIGFycltpKytdID0gZGVsdGE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgazsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkZWx0YSA8IGFycltpXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUCggYXJyW2ldLCBkZWx0YSwgdCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsdGEgPSBhcnJbMF07CisgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDwgaTsgaisrICkKKyAgICAgICAgICAgICAgICBkZWx0YSA9IE1BWChkZWx0YSwgYXJyW2pdKTsKKyAgICAgICAgICAgIHN1bSArPSBkZWx0YTsKKyAgICAgICAgICAgIG4rKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoZmxvYXQpc3VtL247Cit9CisKK3N0YXRpYyBpbnQ2NCBpY3ZDb21wdXRlRW5lcmd5KCBjb25zdCBDdlN0ZXJlb0dDU3RhdGUqIHN0YXRlLCBjb25zdCBDdlN0ZXJlb0dDU3RhdGUyKiBzdGF0ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxPY2NsdWRlZCApCit7CisgICAgaW50IHgsIHksIHJvd3MgPSBzdGF0ZS0+bGVmdC0+cm93cywgY29scyA9IHN0YXRlLT5sZWZ0LT5jb2xzOworICAgIGludDY0IEUgPSAwOworICAgIGNvbnN0IGludCogZHRhYiA9IHN0YXRlMi0+ZGF0YUNvc3RGdW5jVGFiOworICAgIGludCBtYXhSID0gc3RhdGUyLT5pbnRlcmFjdGlvblJhZGl1czsKKyAgICBjb25zdCBpbnQqIHN0YWJSID0gc3RhdGUyLT5zbW9vdGhuZXNzUiArIENVVE9GRjsKKyAgICBjb25zdCBpbnQqIHN0YWJJID0gc3RhdGUyLT5zbW9vdGhuZXNzR3JheURpZmYgKyAyNTU7CisgICAgY29uc3QgdWNoYXIqIGxlZnQgPSBzdGF0ZS0+bGVmdC0+ZGF0YS5wdHI7CisgICAgY29uc3QgdWNoYXIqIHJpZ2h0ID0gc3RhdGUtPnJpZ2h0LT5kYXRhLnB0cjsKKyAgICBzaG9ydCogZGxlZnQgPSBzdGF0ZS0+ZGlzcExlZnQtPmRhdGEuczsKKyAgICBzaG9ydCogZHJpZ2h0ID0gc3RhdGUtPmRpc3BSaWdodC0+ZGF0YS5zOworICAgIGludCBzdGVwID0gc3RhdGUtPmxlZnQtPnN0ZXA7CisgICAgaW50IGRzdGVwID0gKGludCkoc3RhdGUtPmRpc3BMZWZ0LT5zdGVwL3NpemVvZihzaG9ydCkpOworCisgICAgYXNzZXJ0KCBzdGF0ZS0+bGVmdC0+c3RlcCA9PSBzdGF0ZS0+cmlnaHQtPnN0ZXAgJiYKKyAgICAgICAgc3RhdGUtPmRpc3BMZWZ0LT5zdGVwID09IHN0YXRlLT5kaXNwUmlnaHQtPnN0ZXAgKTsKKworICAgIGlmKCBhbGxPY2NsdWRlZCApCisgICAgICAgIHJldHVybiAoaW50NjQpT0NDTFVTSU9OX1BFTkFMVFkqcm93cypjb2xzKjI7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgcm93czsgeSsrLCBsZWZ0ICs9IHN0ZXAsIHJpZ2h0ICs9IHN0ZXAsIGRsZWZ0ICs9IGRzdGVwLCBkcmlnaHQgKz0gZHN0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGNvbHM7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkID0gZGxlZnRbeF0sIHgxLCBkMTsKKyAgICAgICAgICAgIGlmKCBkID09IE9DQ0xVREVEICkKKyAgICAgICAgICAgICAgICBFICs9IE9DQ0xVU0lPTl9QRU5BTFRZOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHgxID0geCArIGQ7CisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl4MSA+PSAodW5zaWduZWQpY29scyApCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGQxID0gZHJpZ2h0W3gxXTsKKyAgICAgICAgICAgICAgICBpZiggZCA9PSAtZDEgKQorICAgICAgICAgICAgICAgICAgICBFICs9IGR0YWJbaWN2RGF0YUNvc3RGdW5jR3JheVN1YnBpeCggbGVmdCArIHgqMywgcmlnaHQgKyB4MSozICldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggeCA8IGNvbHMtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZDEgPSBkbGVmdFt4KzFdOworICAgICAgICAgICAgICAgIEUgKz0gaWN2U21vb3RobmVzc0Nvc3RGdW5jKGQsIGQxLCBtYXhSLCBzdGFiUiwgc3RhYklbbGVmdFt4KjNdIC0gbGVmdFt4KjMrM11dICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggeSA8IHJvd3MtMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZDEgPSBkbGVmdFt4K2RzdGVwXTsKKyAgICAgICAgICAgICAgICBFICs9IGljdlNtb290aG5lc3NDb3N0RnVuYyhkLCBkMSwgbWF4Uiwgc3RhYlIsIHN0YWJJW2xlZnRbeCozXSAtIGxlZnRbeCozK3N0ZXBdXSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkID0gZHJpZ2h0W3hdOworICAgICAgICAgICAgaWYoIGQgPT0gT0NDTFVERUQgKQorICAgICAgICAgICAgICAgIEUgKz0gT0NDTFVTSU9OX1BFTkFMVFk7CisKKyAgICAgICAgICAgIGlmKCB4IDwgY29scy0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkMSA9IGRyaWdodFt4KzFdOworICAgICAgICAgICAgICAgIEUgKz0gaWN2U21vb3RobmVzc0Nvc3RGdW5jKGQsIGQxLCBtYXhSLCBzdGFiUiwgc3RhYklbcmlnaHRbeCozXSAtIHJpZ2h0W3gqMyszXV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB5IDwgcm93cy0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkMSA9IGRyaWdodFt4K2RzdGVwXTsKKyAgICAgICAgICAgICAgICBFICs9IGljdlNtb290aG5lc3NDb3N0RnVuYyhkLCBkMSwgbWF4Uiwgc3RhYlIsIHN0YWJJW3JpZ2h0W3gqM10gLSByaWdodFt4KjMrc3RlcF1dICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnQoIEUgPj0gMCApOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpY3ZBZGRFZGdlKCBHQ1Z0eCAqeCwgR0NWdHgqIHksIEdDRWRnZSogZWRnZUJ1ZiwgaW50IG5lZGdlcywgaW50IHcsIGludCBydyApCit7CisgICAgR0NFZGdlICp4eSA9IGVkZ2VCdWYgKyBuZWRnZXMsICp5eCA9IHh5ICsgMTsKKworICAgIGFzc2VydCggeCAhPSAwICYmIHkgIT0gMCApOworICAgIHh5LT5kc3QgPSB5OworICAgIHh5LT5uZXh0ID0geC0+Zmlyc3Q7CisgICAgeHktPndlaWdodCA9IChzaG9ydCl3OworICAgIHgtPmZpcnN0ID0gbmVkZ2VzOworCisgICAgeXgtPmRzdCA9IHg7CisgICAgeXgtPm5leHQgPSB5LT5maXJzdDsKKyAgICB5eC0+d2VpZ2h0ID0gKHNob3J0KXJ3OworICAgIHktPmZpcnN0ID0gbmVkZ2VzKzE7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGljdkFkZFRXZWlnaHRzKCBHQ1Z0eCogdnR4LCBpbnQgc291cmNlV2VpZ2h0LCBpbnQgc2lua1dlaWdodCApCit7CisgICAgaW50IHcgPSB2dHgtPndlaWdodDsKKyAgICBpZiggdyA+IDAgKQorICAgICAgICBzb3VyY2VXZWlnaHQgKz0gdzsKKyAgICBlbHNlCisgICAgICAgIHNpbmtXZWlnaHQgLT0gdzsKKyAgICB2dHgtPndlaWdodCA9IChzaG9ydCkoc291cmNlV2VpZ2h0IC0gc2lua1dlaWdodCk7CisgICAgcmV0dXJuIE1JTihzb3VyY2VXZWlnaHQsIHNpbmtXZWlnaHQpOworfQorCitzdGF0aWMgaW5saW5lIGludCBpY3ZBZGRUZXJtKCBHQ1Z0eCogeCwgR0NWdHgqIHksIGludCBBLCBpbnQgQiwgaW50IEMsIGludCBELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NFZGdlKiBlZGdlQnVmLCBpbnQmIG5lZGdlcyApCit7CisgICAgaW50IGRFID0gMCwgdzsKKworICAgIGFzc2VydChCIC0gQSArIEMgLSBEID49IDApOworICAgIGlmKCBCIDwgQSApCisgICAgeworICAgICAgICBkRSArPSBpY3ZBZGRUV2VpZ2h0cyh4LCBELCBCKTsKKyAgICAgICAgZEUgKz0gaWN2QWRkVFdlaWdodHMoeSwgMCwgQSAtIEIpOworICAgICAgICBpZiggKHcgPSBCIC0gQSArIEMgLSBEKSAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2QWRkRWRnZSggeCwgeSwgZWRnZUJ1ZiwgbmVkZ2VzLCAwLCB3ICk7CisgICAgICAgICAgICBuZWRnZXMgKz0gMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDIDwgRCApCisgICAgeworICAgICAgICBkRSArPSBpY3ZBZGRUV2VpZ2h0cyh4LCBELCBBICsgRCAtIEMpOworICAgICAgICBkRSArPSBpY3ZBZGRUV2VpZ2h0cyh5LCAwLCBDIC0gRCk7CisgICAgICAgIGlmKCAodyA9IEIgLSBBICsgQyAtIEQpICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZBZGRFZGdlKCB4LCB5LCBlZGdlQnVmLCBuZWRnZXMsIHcsIDAgKTsKKyAgICAgICAgICAgIG5lZGdlcyArPSAyOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRFICs9IGljdkFkZFRXZWlnaHRzKHgsIEQsIEEpOworICAgICAgICBpZiggQiAhPSBBIHx8IEMgIT0gRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkFkZEVkZ2UoIHgsIHksIGVkZ2VCdWYsIG5lZGdlcywgQiAtIEEsIEMgLSBEICk7CisgICAgICAgICAgICBuZWRnZXMgKz0gMjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZEU7Cit9CisKK3N0YXRpYyBpbnQ2NCBpY3ZBbHBoYUV4cGFuZCggaW50NjQgRXByZXYsIGludCBhbHBoYSwgQ3ZTdGVyZW9HQ1N0YXRlKiBzdGF0ZSwgQ3ZTdGVyZW9HQ1N0YXRlMiogc3RhdGUyICkKK3sKKyAgICBHQ1Z0eCAqdmFyLCAqdmFyMTsKKyAgICBpbnQ2NCBFID0gMDsKKyAgICBpbnQgZGVsdGEsIEUwMD0wLCBFMGE9MCwgRWEwPTAsIEVhYT0wOworICAgIGludCBrLCBhLCBkLCBkMSwgeCwgeSwgeDEsIHkxLCByb3dzID0gc3RhdGUtPmxlZnQtPnJvd3MsIGNvbHMgPSBzdGF0ZS0+bGVmdC0+Y29sczsKKyAgICBpbnQgbnZ0eCA9IDAsIG5lZGdlcyA9IDI7CisgICAgR0NWdHgqIHZidWYgPSAoR0NWdHgqKXN0YXRlLT52dHhCdWYtPmRhdGEucHRyOworICAgIEdDRWRnZSogZWJ1ZiA9IChHQ0VkZ2UqKXN0YXRlLT5lZGdlQnVmLT5kYXRhLnB0cjsKKyAgICBpbnQgbWF4UiA9IHN0YXRlMi0+aW50ZXJhY3Rpb25SYWRpdXM7CisgICAgY29uc3QgaW50KiBkdGFiID0gc3RhdGUyLT5kYXRhQ29zdEZ1bmNUYWI7CisgICAgY29uc3QgaW50KiBzdGFiUiA9IHN0YXRlMi0+c21vb3RobmVzc1IgKyBDVVRPRkY7CisgICAgY29uc3QgaW50KiBzdGFiSSA9IHN0YXRlMi0+c21vb3RobmVzc0dyYXlEaWZmICsgMjU1OworICAgIGNvbnN0IHVjaGFyKiBsZWZ0MCA9IHN0YXRlLT5sZWZ0LT5kYXRhLnB0cjsKKyAgICBjb25zdCB1Y2hhciogcmlnaHQwID0gc3RhdGUtPnJpZ2h0LT5kYXRhLnB0cjsKKyAgICBzaG9ydCogZGxlZnQwID0gc3RhdGUtPmRpc3BMZWZ0LT5kYXRhLnM7CisgICAgc2hvcnQqIGRyaWdodDAgPSBzdGF0ZS0+ZGlzcFJpZ2h0LT5kYXRhLnM7CisgICAgR0NWdHgqKiBwbGVmdDAgPSAoR0NWdHgqKilzdGF0ZS0+cHRyTGVmdC0+ZGF0YS5wdHI7CisgICAgR0NWdHgqKiBwcmlnaHQwID0gKEdDVnR4Kiopc3RhdGUtPnB0clJpZ2h0LT5kYXRhLnB0cjsKKyAgICBpbnQgc3RlcCA9IHN0YXRlLT5sZWZ0LT5zdGVwOworICAgIGludCBkc3RlcCA9IChpbnQpKHN0YXRlLT5kaXNwTGVmdC0+c3RlcC9zaXplb2Yoc2hvcnQpKTsKKyAgICBpbnQgcHN0ZXAgPSAoaW50KShzdGF0ZS0+cHRyTGVmdC0+c3RlcC9zaXplb2YoR0NWdHgqKSk7CisgICAgaW50IGFhW10gPSB7IGFscGhhLCAtYWxwaGEgfTsKKworICAgIGRvdWJsZSB0ID0gKGRvdWJsZSljdkdldFRpY2tDb3VudCgpOworCisgICAgYXNzZXJ0KCBzdGF0ZS0+bGVmdC0+c3RlcCA9PSBzdGF0ZS0+cmlnaHQtPnN0ZXAgJiYKKyAgICAgICAgICAgIHN0YXRlLT5kaXNwTGVmdC0+c3RlcCA9PSBzdGF0ZS0+ZGlzcFJpZ2h0LT5zdGVwICYmCisgICAgICAgICAgICBzdGF0ZS0+cHRyTGVmdC0+c3RlcCA9PSBzdGF0ZS0+cHRyUmlnaHQtPnN0ZXAgKTsKKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIGVidWZba10uZHN0ID0gMDsKKyAgICAgICAgZWJ1ZltrXS5uZXh0ID0gMDsKKyAgICAgICAgZWJ1ZltrXS53ZWlnaHQgPSAwOworICAgIH0KKworICAgIGZvciggeSA9IDA7IHkgPCByb3dzOyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIGxlZnQgPSBsZWZ0MCArIHN0ZXAqeTsKKyAgICAgICAgY29uc3QgdWNoYXIqIHJpZ2h0ID0gcmlnaHQwICsgc3RlcCp5OworICAgICAgICBjb25zdCBzaG9ydCogZGxlZnQgPSBkbGVmdDAgKyBkc3RlcCp5OworICAgICAgICBjb25zdCBzaG9ydCogZHJpZ2h0ID0gZHJpZ2h0MCArIGRzdGVwKnk7CisgICAgICAgIEdDVnR4KiogcGxlZnQgPSBwbGVmdDAgKyBwc3RlcCp5OworICAgICAgICBHQ1Z0eCoqIHByaWdodCA9IHByaWdodDAgKyBwc3RlcCp5OworICAgICAgICBjb25zdCB1Y2hhciogbHJbXSA9IHsgbGVmdCwgcmlnaHQgfTsKKyAgICAgICAgY29uc3Qgc2hvcnQqIGRscltdID0geyBkbGVmdCwgZHJpZ2h0IH07CisgICAgICAgIEdDVnR4KiogcGxyW10gPSB7IHBsZWZ0LCBwcmlnaHQgfTsgCisKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGEgPSBhYVtrXTsKKyAgICAgICAgICAgIGZvciggeTEgPSB5Kyh5PjApOyB5MSA8PSB5Kyh5PHJvd3MtMSk7IHkxKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHNob3J0KiBkaXNwID0gKGsgPT0gMCA/IGRsZWZ0MCA6IGRyaWdodDApICsgeTEqZHN0ZXA7CisgICAgICAgICAgICAgICAgR0NWdHgqKiBwdHIgPSAoayA9PSAwID8gcGxlZnQwIDogcHJpZ2h0MCkgKyB5MSpwc3RlcDsKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgY29sczsgeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdDVnR4KiB2ID0gcHRyW3hdID0gJnZidWZbbnZ0eCsrXTsKKyAgICAgICAgICAgICAgICAgICAgdi0+Zmlyc3QgPSAwOworICAgICAgICAgICAgICAgICAgICB2LT53ZWlnaHQgPSBkaXNwW3hdID09IChzaG9ydCkoT0NDTFVERUQgPyAtT0NDTFVTSU9OX1BFTkFMVFkyIDogMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGNvbHM7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGQgPSBkbGVmdFt4XTsKKyAgICAgICAgICAgIHgxID0geCArIGQ7CisgICAgICAgICAgICB2YXIgPSBwbGVmdFt4XTsKKworICAgICAgICAgICAgLy8gKGxlZnQgKyB4LCByaWdodCArIHggKyBkKQorICAgICAgICAgICAgaWYoIGQgIT0gYWxwaGEgJiYgZCAhPSBPQ0NMVURFRCAmJiAodW5zaWduZWQpeDEgPCAodW5zaWduZWQpY29scyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyMSA9IHByaWdodFt4MV07CisgICAgICAgICAgICAgICAgZDEgPSBkcmlnaHRbeDFdOworICAgICAgICAgICAgICAgIGlmKCBkID09IC1kMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIHZhcjEgIT0gMCApOworICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IElTX0JMT0NLRUQoYWxwaGEsIGQpID8gSU5GSU5JVFkgOiAwOworICAgICAgICAgICAgICAgICAgICAvL2FkZCBpbnRlciBlZGdlCisgICAgICAgICAgICAgICAgICAgIEUgKz0gaWN2QWRkVGVybSggdmFyLCB2YXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgZHRhYltpY3ZEYXRhQ29zdEZ1bmNHcmF5U3VicGl4KCBsZWZ0ICsgeCozLCByaWdodCArIHgxKjMgKV0sCisgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSwgZGVsdGEsIDAsIGVidWYsIG5lZGdlcyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBJU19CTE9DS0VEKGFscGhhLCBkKSApCisgICAgICAgICAgICAgICAgICAgIEUgKz0gaWN2QWRkVGVybSggdmFyLCB2YXIxLCAwLCBJTkZJTklUWSwgMCwgMCwgZWJ1ZiwgbmVkZ2VzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIChsZWZ0ICsgeCwgcmlnaHQgKyB4ICsgYWxwaGEpCisgICAgICAgICAgICB4MSA9IHggKyBhbHBoYTsKKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeDEgPCAodW5zaWduZWQpY29scyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyMSA9IHByaWdodFt4MV07CisgICAgICAgICAgICAgICAgZDEgPSBkcmlnaHRbeDFdOworCisgICAgICAgICAgICAgICAgRTBhID0gSVNfQkxPQ0tFRChkLCBhbHBoYSkgPyBJTkZJTklUWSA6IDA7CisgICAgICAgICAgICAgICAgRWEwID0gSVNfQkxPQ0tFRCgtZDEsIGFscGhhKSA/IElORklOSVRZIDogMDsKKyAgICAgICAgICAgICAgICBFYWEgPSBkdGFiW2ljdkRhdGFDb3N0RnVuY0dyYXlTdWJwaXgoIGxlZnQgKyB4KjMsIHJpZ2h0ICsgeDEqMyApXTsKKyAgICAgICAgICAgICAgICBFICs9IGljdkFkZFRlcm0oIHZhciwgdmFyMSwgMCwgRTBhLCBFYTAsIEVhYSwgZWJ1ZiwgbmVkZ2VzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHNtb290aG5lc3MKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCAyOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdDVnR4KiogcCA9IHBscltrXTsKKyAgICAgICAgICAgICAgICBjb25zdCBzaG9ydCogZGlzcCA9IGRscltrXTsKKyAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogaW1nID0gbHJba10gKyB4KjM7CisgICAgICAgICAgICAgICAgaW50IHNjYWxlOworICAgICAgICAgICAgICAgIHZhciA9IHBbeF07CisgICAgICAgICAgICAgICAgZCA9IGRpc3BbeF07CisgICAgICAgICAgICAgICAgYSA9IGFhW2tdOworCisgICAgICAgICAgICAgICAgaWYoIHggPCBjb2xzIC0gMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YXIxID0gcFt4KzFdOworICAgICAgICAgICAgICAgICAgICBkMSA9IGRpc3BbeCsxXTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBzdGFiSVtpbWdbMF0gLSBpbWdbM11dOworICAgICAgICAgICAgICAgICAgICBFMGEgPSBpY3ZTbW9vdGhuZXNzQ29zdEZ1bmMoIGQsIGEsIG1heFIsIHN0YWJSLCBzY2FsZSApOworICAgICAgICAgICAgICAgICAgICBFYTAgPSBpY3ZTbW9vdGhuZXNzQ29zdEZ1bmMoIGEsIGQxLCBtYXhSLCBzdGFiUiwgc2NhbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgRTAwID0gaWN2U21vb3RobmVzc0Nvc3RGdW5jKCBkLCBkMSwgbWF4Uiwgc3RhYlIsIHNjYWxlICk7CisgICAgICAgICAgICAgICAgICAgIEUgKz0gaWN2QWRkVGVybSggdmFyLCB2YXIxLCBFMDAsIEUwYSwgRWEwLCAwLCBlYnVmLCBuZWRnZXMgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggeSA8IHJvd3MgLSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZhcjEgPSBwW3grcHN0ZXBdOworICAgICAgICAgICAgICAgICAgICBkMSA9IGRpc3BbeCtkc3RlcF07CisgICAgICAgICAgICAgICAgICAgIHNjYWxlID0gc3RhYklbaW1nWzBdIC0gaW1nW3N0ZXBdXTsKKyAgICAgICAgICAgICAgICAgICAgRTBhID0gaWN2U21vb3RobmVzc0Nvc3RGdW5jKCBkLCBhLCBtYXhSLCBzdGFiUiwgc2NhbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgRWEwID0gaWN2U21vb3RobmVzc0Nvc3RGdW5jKCBhLCBkMSwgbWF4Uiwgc3RhYlIsIHNjYWxlICk7CisgICAgICAgICAgICAgICAgICAgIEUwMCA9IGljdlNtb290aG5lc3NDb3N0RnVuYyggZCwgZDEsIG1heFIsIHN0YWJSLCBzY2FsZSApOworICAgICAgICAgICAgICAgICAgICBFICs9IGljdkFkZFRlcm0oIHZhciwgdmFyMSwgRTAwLCBFMGEsIEVhMCwgMCwgZWJ1ZiwgbmVkZ2VzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB2aXNpYmlsaXR5IHRlcm0KKyAgICAgICAgICAgIGlmKCBkICE9IE9DQ0xVREVEICYmIElTX0JMT0NLRUQoYWxwaGEsIC1kKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4MSA9IHggKyBkOworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeDEgPCAodW5zaWduZWQpY29scyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZCAhPSAtZGxlZnRbeDFdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFyMSA9IHBsZWZ0W3gxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEUgKz0gaWN2QWRkVGVybSggdmFyLCB2YXIxLCAwLCBJTkZJTklUWSwgMCwgMCwgZWJ1ZiwgbmVkZ2VzICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB0ID0gKGRvdWJsZSljdkdldFRpY2tDb3VudCgpIC0gdDsKKyAgICBlYnVmWzBdLndlaWdodCA9IGVidWZbMV0ud2VpZ2h0ID0gMDsKKyAgICBFICs9IGljdkdDTWF4RmxvdyggdmJ1ZiwgbnZ0eCwgZWJ1Ziwgc3RhdGUyLT5vcnBoYW5zLCBzdGF0ZTItPm1heE9ycGhhbnMgKTsKKworICAgIGlmKCBFIDwgRXByZXYgKQorICAgIHsKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHJvd3M7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNob3J0KiBkbGVmdCA9IGRsZWZ0MCArIGRzdGVwKnk7CisgICAgICAgICAgICBzaG9ydCogZHJpZ2h0ID0gZHJpZ2h0MCArIGRzdGVwKnk7CisgICAgICAgICAgICBHQ1Z0eCoqIHBsZWZ0ID0gcGxlZnQwICsgcHN0ZXAqeTsKKyAgICAgICAgICAgIEdDVnR4KiogcHJpZ2h0ID0gcHJpZ2h0MCArIHBzdGVwKnk7CisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgY29sczsgeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHQ1Z0eCogdmFyID0gcGxlZnRbeF07CisgICAgICAgICAgICAgICAgaWYoIHZhciAmJiB2YXItPnBhcmVudCAmJiB2YXItPnQgKQorICAgICAgICAgICAgICAgICAgICBkbGVmdFt4XSA9IChzaG9ydClhbHBoYTsgCisKKyAgICAgICAgICAgICAgICB2YXIgPSBwcmlnaHRbeF07CisgICAgICAgICAgICAgICAgaWYoIHZhciAmJiB2YXItPnBhcmVudCAmJiB2YXItPnQgKQorICAgICAgICAgICAgICAgICAgICBkcmlnaHRbeF0gPSAoc2hvcnQpLWFscGhhOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE1JTihFLCBFcHJldik7Cit9CisKKworQ1ZfSU1QTCB2b2lkIGN2RmluZFN0ZXJlb0NvcnJlc3BvbmRlbmNlR0MoIGNvbnN0IEN2QXJyKiBfbGVmdCwgY29uc3QgQ3ZBcnIqIF9yaWdodCwKKyAgICBDdkFyciogX2Rpc3BMZWZ0LCBDdkFyciogX2Rpc3BSaWdodCwgQ3ZTdGVyZW9HQ1N0YXRlKiBzdGF0ZSwgaW50IHVzZURpc3Bhcml0eUd1ZXNzICkKK3sKKyAgICBDdlN0ZXJlb0dDU3RhdGUyIHN0YXRlMjsKKyAgICBzdGF0ZTIub3JwaGFucyA9IDA7CisgICAgc3RhdGUyLm1heE9ycGhhbnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUdDIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgbHN0dWIsICpsZWZ0ID0gY3ZHZXRNYXQoIF9sZWZ0LCAmbHN0dWIgKTsKKyAgICBDdk1hdCByc3R1YiwgKnJpZ2h0ID0gY3ZHZXRNYXQoIF9yaWdodCwgJnJzdHViICk7CisgICAgQ3ZNYXQgZGxzdHViLCAqZGlzcExlZnQgPSBjdkdldE1hdCggX2Rpc3BMZWZ0LCAmZGxzdHViICk7CisgICAgQ3ZNYXQgZHJzdHViLCAqZGlzcFJpZ2h0ID0gY3ZHZXRNYXQoIF9kaXNwUmlnaHQsICZkcnN0dWIgKTsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgaXRlciwgaSwgblplcm9FeHBhbnNpb25zID0gMDsKKyAgICBDdlJORyBybmcgPSBjdlJORygtMSk7CisgICAgaW50KiBkaXNwOworICAgIEN2TWF0IF9kaXNwOworICAgIGludDY0IEU7CisKKyAgICBDVl9BU1NFUlQoIHN0YXRlICE9IDAgKTsKKyAgICBDVl9BU1NFUlQoIENWX0FSRV9TSVpFU19FUShsZWZ0LCByaWdodCkgJiYgQ1ZfQVJFX1RZUEVTX0VRKGxlZnQsIHJpZ2h0KSAmJgorICAgICAgICAgICAgICAgQ1ZfTUFUX1RZUEUobGVmdC0+dHlwZSkgPT0gQ1ZfOFVDMSApOworICAgIENWX0FTU0VSVCggIWRpc3BMZWZ0IHx8CisgICAgICAgIChDVl9BUkVfU0laRVNfRVEoZGlzcExlZnQsIGxlZnQpICYmIENWX01BVF9DTihkaXNwTGVmdC0+dHlwZSkgPT0gMSkgKTsKKyAgICBDVl9BU1NFUlQoICFkaXNwUmlnaHQgfHwKKyAgICAgICAgKENWX0FSRV9TSVpFU19FUShkaXNwUmlnaHQsIGxlZnQpICYmIENWX01BVF9DTihkaXNwUmlnaHQtPnR5cGUpID09IDEpICk7CisKKyAgICBzaXplID0gY3ZHZXRTaXplKGxlZnQpOworICAgIGlmKCAhc3RhdGUtPmxlZnQgfHwgc3RhdGUtPmxlZnQtPndpZHRoICE9IHNpemUud2lkdGggfHwgc3RhdGUtPmxlZnQtPmhlaWdodCAhPSBzaXplLmhlaWdodCApCisgICAgeworICAgICAgICBpbnQgcGNuID0gKGludCkoc2l6ZW9mKEdDVnR4Kikvc2l6ZW9mKGludCkpOworICAgICAgICBpbnQgdmNuID0gKGludCkoc2l6ZW9mKEdDVnR4KS9zaXplb2YoaW50KSk7CisgICAgICAgIGludCBlY24gPSAoaW50KShzaXplb2YoR0NFZGdlKS9zaXplb2YoaW50KSk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5sZWZ0ICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5yaWdodCApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZzdGF0ZS0+cHRyTGVmdCApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZzdGF0ZS0+cHRyUmlnaHQgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmc3RhdGUtPmRpc3BMZWZ0ICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN0YXRlLT5kaXNwUmlnaHQgKTsKKworICAgICAgICBzdGF0ZS0+bGVmdCA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfOFVDMyApOworICAgICAgICBzdGF0ZS0+cmlnaHQgPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIENWXzhVQzMgKTsKKyAgICAgICAgc3RhdGUtPmRpc3BMZWZ0ID0gY3ZDcmVhdGVNYXQoIHNpemUuaGVpZ2h0LCBzaXplLndpZHRoLCBDVl8xNlNDMSApOworICAgICAgICBzdGF0ZS0+ZGlzcFJpZ2h0ID0gY3ZDcmVhdGVNYXQoIHNpemUuaGVpZ2h0LCBzaXplLndpZHRoLCBDVl8xNlNDMSApOworICAgICAgICBzdGF0ZS0+cHRyTGVmdCA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfMzJTQyhwY24pICk7CisgICAgICAgIHN0YXRlLT5wdHJSaWdodCA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfMzJTQyhwY24pICk7CisgICAgICAgIHN0YXRlLT52dHhCdWYgPSBjdkNyZWF0ZU1hdCggMSwgc2l6ZS5oZWlnaHQqc2l6ZS53aWR0aCoyLCBDVl8zMlNDKHZjbikgKTsKKyAgICAgICAgc3RhdGUtPmVkZ2VCdWYgPSBjdkNyZWF0ZU1hdCggMSwgc2l6ZS5oZWlnaHQqc2l6ZS53aWR0aCoxMiArIDE2LCBDVl8zMlNDKGVjbikgKTsKKyAgICB9CisKKyAgICBpZiggIXVzZURpc3Bhcml0eUd1ZXNzICkKKyAgICB7CisgICAgICAgIGN2U2V0KCBzdGF0ZS0+ZGlzcExlZnQsIGN2U2NhbGFyQWxsKE9DQ0xVREVEKSk7CisgICAgICAgIGN2U2V0KCBzdGF0ZS0+ZGlzcFJpZ2h0LCBjdlNjYWxhckFsbChPQ0NMVURFRCkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9BU1NFUlQoIGRpc3BMZWZ0ICYmIGRpc3BSaWdodCApOworICAgICAgICBjdkNvbnZlcnQoIGRpc3BMZWZ0LCBzdGF0ZS0+ZGlzcExlZnQgKTsKKyAgICAgICAgY3ZDb252ZXJ0KCBkaXNwUmlnaHQsIHN0YXRlLT5kaXNwUmlnaHQgKTsKKyAgICB9CisKKyAgICBzdGF0ZTIuSXRocmVzaG9sZCA9IHN0YXRlLT5JdGhyZXNob2xkOworICAgIHN0YXRlMi5pbnRlcmFjdGlvblJhZGl1cyA9IHN0YXRlLT5pbnRlcmFjdGlvblJhZGl1czsKKyAgICBzdGF0ZTIubGFtYmRhID0gY3ZSb3VuZChzdGF0ZS0+bGFtYmRhKkRFTk9NSU5BVE9SKTsKKyAgICBzdGF0ZTIubGFtYmRhMSA9IGN2Um91bmQoc3RhdGUtPmxhbWJkYTEqREVOT01JTkFUT1IpOworICAgIHN0YXRlMi5sYW1iZGEyID0gY3ZSb3VuZChzdGF0ZS0+bGFtYmRhMipERU5PTUlOQVRPUik7CisgICAgc3RhdGUyLksgPSBjdlJvdW5kKHN0YXRlLT5LKkRFTk9NSU5BVE9SKTsKKworICAgIGljdkluaXRTdGVyZW9Db25zdFRhYnMoKTsKKyAgICBpY3ZJbml0R3JheVN1YnBpeCggbGVmdCwgcmlnaHQsIHN0YXRlLT5sZWZ0LCBzdGF0ZS0+cmlnaHQgKTsKKyAgICBkaXNwID0gKGludCopY3ZTdGFja0FsbG9jKCBzdGF0ZS0+bnVtYmVyT2ZEaXNwYXJpdGllcypzaXplb2YoZGlzcFswXSkgKTsKKyAgICBfZGlzcCA9IGN2TWF0KCAxLCBzdGF0ZS0+bnVtYmVyT2ZEaXNwYXJpdGllcywgQ1ZfMzJTLCBkaXNwICk7CisgICAgY3ZSYW5nZSggJl9kaXNwLCBzdGF0ZS0+bWluRGlzcGFyaXR5LCBzdGF0ZS0+bWluRGlzcGFyaXR5ICsgc3RhdGUtPm51bWJlck9mRGlzcGFyaXRpZXMgKTsKKyAgICBjdlJhbmRTaHVmZmxlKCAmX2Rpc3AsICZybmcgKTsKKworICAgIGlmKCBzdGF0ZTIubGFtYmRhIDwgMCAmJiAoc3RhdGUyLksgPCAwIHx8IHN0YXRlMi5sYW1iZGExIDwgMCB8fCBzdGF0ZTIubGFtYmRhMiA8IDApICkKKyAgICB7CisgICAgICAgIGZsb2F0IEwgPSBpY3ZDb21wdXRlSyhzdGF0ZSkqMC4yZjsKKyAgICAgICAgc3RhdGUyLmxhbWJkYSA9IGN2Um91bmQoTCpERU5PTUlOQVRPUik7CisgICAgfQorCisgICAgaWYoIHN0YXRlMi5LIDwgMCApCisgICAgICAgIHN0YXRlMi5LID0gc3RhdGUyLmxhbWJkYSo1OworICAgIGlmKCBzdGF0ZTIubGFtYmRhMSA8IDAgKQorICAgICAgICBzdGF0ZTIubGFtYmRhMSA9IHN0YXRlMi5sYW1iZGEqMzsKKyAgICBpZiggc3RhdGUyLmxhbWJkYTIgPCAwICkKKyAgICAgICAgc3RhdGUyLmxhbWJkYTIgPSBzdGF0ZTIubGFtYmRhOworCisgICAgaWN2SW5pdFN0ZXJlb1RhYnMoICZzdGF0ZTIgKTsKKworICAgIEUgPSBpY3ZDb21wdXRlRW5lcmd5KCBzdGF0ZSwgJnN0YXRlMiwgIXVzZURpc3Bhcml0eUd1ZXNzICk7CisgICAgZm9yKCBpdGVyID0gMDsgaXRlciA8IHN0YXRlLT5tYXhJdGVyczsgaXRlcisrICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdGF0ZS0+bnVtYmVyT2ZEaXNwYXJpdGllczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGFscGhhID0gZGlzcFtpXTsKKyAgICAgICAgICAgIGludDY0IEVuZXcgPSBpY3ZBbHBoYUV4cGFuZCggRSwgLWFscGhhLCBzdGF0ZSwgJnN0YXRlMiApOworICAgICAgICAgICAgaWYoIEVuZXcgPCBFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuWmVyb0V4cGFuc2lvbnMgPSAwOworICAgICAgICAgICAgICAgIEUgPSBFbmV3OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggKytuWmVyb0V4cGFuc2lvbnMgPj0gc3RhdGUtPm51bWJlck9mRGlzcGFyaXRpZXMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGRpc3BMZWZ0ICkKKyAgICAgICAgY3ZDb252ZXJ0KCBzdGF0ZS0+ZGlzcExlZnQsIGRpc3BMZWZ0ICk7CisgICAgaWYoIGRpc3BSaWdodCApCisgICAgICAgIGN2Q29udmVydCggc3RhdGUtPmRpc3BSaWdodCwgZGlzcFJpZ2h0ICk7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmc3RhdGUyLm9ycGhhbnMgKTsKK30KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnN1YmRpdmlzaW9uMmQuY3BwIGIvY3Yvc3JjL2N2c3ViZGl2aXNpb24yZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3NzhlNQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnN1YmRpdmlzaW9uMmQuY3BwCkBAIC0wLDAgKzEsODUwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3YuaCIKKworQ1ZfSU1QTCBDdlN1YmRpdjJEICoKK2N2Q3JlYXRlU3ViZGl2MkQoIGludCBzdWJkaXZfdHlwZSwgaW50IGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgaW50IHZ0eF9zaXplLCBpbnQgcXVhZGVkZ2Vfc2l6ZSwgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSApCit7CisgICAgQ3ZTdWJkaXYyRCAqc3ViZGl2ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDbGVhdGVTdWJkaXYyRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIGhlYWRlcl9zaXplIDwgKGludClzaXplb2YoICpzdWJkaXYgKSB8fAorICAgICAgICBxdWFkZWRnZV9zaXplIDwgKGludClzaXplb2YoIEN2UXVhZEVkZ2UyRCApIHx8CisgICAgICAgIHZ0eF9zaXplIDwgKGludClzaXplb2YoIEN2U3ViZGl2MkRQb2ludCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFEU0laRV9FUlIgKTsKKworICAgIHN1YmRpdiA9IChDdlN1YmRpdjJEICopIGN2Q3JlYXRlR3JhcGgoIHN1YmRpdl90eXBlLCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2dHhfc2l6ZSwgcXVhZGVkZ2Vfc2l6ZSwgc3RvcmFnZSApOworCisgICAgCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzdWJkaXY7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUXVhZCBFZGdlICBhbGdlYnJhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgQ3ZTdWJkaXYyREVkZ2UKK2N2U3ViZGl2MkRNYWtlRWRnZSggQ3ZTdWJkaXYyRCAqIHN1YmRpdiApCit7CisgICAgQ3ZRdWFkRWRnZTJEICplZGdlID0gMDsKKyAgICBDdlN1YmRpdjJERWRnZSBlZGdlaGFuZGxlID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJkaXYyRE1ha2VFZGdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGVkZ2UgPSAoQ3ZRdWFkRWRnZTJEKiljdlNldE5ldyggKEN2U2V0KilzdWJkaXYtPmVkZ2VzICk7CisgICAgQ1ZfQ0hFQ0soKTsKKworICAgIG1lbXNldCggZWRnZS0+cHQsIDAsIHNpemVvZiggZWRnZS0+cHQgKSk7CisgICAgZWRnZWhhbmRsZSA9IChDdlN1YmRpdjJERWRnZSkgZWRnZTsKKworICAgIGVkZ2UtPm5leHRbMF0gPSBlZGdlaGFuZGxlOworICAgIGVkZ2UtPm5leHRbMV0gPSBlZGdlaGFuZGxlICsgMzsKKyAgICBlZGdlLT5uZXh0WzJdID0gZWRnZWhhbmRsZSArIDI7CisgICAgZWRnZS0+bmV4dFszXSA9IGVkZ2VoYW5kbGUgKyAxOworCisgICAgc3ViZGl2LT5xdWFkX2VkZ2VzKys7CisKKyAgICAKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGVkZ2VoYW5kbGU7Cit9CisKKworc3RhdGljIEN2U3ViZGl2MkRQb2ludCAqCitjdlN1YmRpdjJEQWRkUG9pbnQoIEN2U3ViZGl2MkQgKiBzdWJkaXYsIEN2UG9pbnQyRDMyZiBwdCwgaW50IGlzX3ZpcnR1YWwgKQoreworICAgIEN2U3ViZGl2MkRQb2ludCAqc3ViZGl2X3BvaW50ID0gMDsKKworICAgIHN1YmRpdl9wb2ludCA9IChDdlN1YmRpdjJEUG9pbnQqKWN2U2V0TmV3KCAoQ3ZTZXQqKXN1YmRpdiApOworICAgIGlmKCBzdWJkaXZfcG9pbnQgKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCBzdWJkaXZfcG9pbnQsIDAsIHN1YmRpdi0+ZWxlbV9zaXplICk7CisgICAgICAgIHN1YmRpdl9wb2ludC0+cHQgPSBwdDsKKyAgICAgICAgc3ViZGl2X3BvaW50LT5maXJzdCA9IDA7CisgICAgICAgIHN1YmRpdl9wb2ludC0+ZmxhZ3MgfD0gaXNfdmlydHVhbCA/IENWX1NVQkRJVjJEX1ZJUlRVQUxfUE9JTlRfRkxBRyA6IDA7CisgICAgfQorCisgICAgcmV0dXJuIHN1YmRpdl9wb2ludDsKK30KKworCitzdGF0aWMgdm9pZAorY3ZTdWJkaXYyRFNwbGljZSggQ3ZTdWJkaXYyREVkZ2UgZWRnZUEsIEN2U3ViZGl2MkRFZGdlIGVkZ2VCICkKK3sKKyAgICBDdlN1YmRpdjJERWRnZSAqYV9uZXh0ID0gJkNWX1NVQkRJVjJEX05FWFRfRURHRSggZWRnZUEgKTsKKyAgICBDdlN1YmRpdjJERWRnZSAqYl9uZXh0ID0gJkNWX1NVQkRJVjJEX05FWFRfRURHRSggZWRnZUIgKTsKKyAgICBDdlN1YmRpdjJERWRnZSBhX3JvdCA9IGN2U3ViZGl2MkRSb3RhdGVFZGdlKCAqYV9uZXh0LCAxICk7CisgICAgQ3ZTdWJkaXYyREVkZ2UgYl9yb3QgPSBjdlN1YmRpdjJEUm90YXRlRWRnZSggKmJfbmV4dCwgMSApOworICAgIEN2U3ViZGl2MkRFZGdlICphX3JvdF9uZXh0ID0gJkNWX1NVQkRJVjJEX05FWFRfRURHRSggYV9yb3QgKTsKKyAgICBDdlN1YmRpdjJERWRnZSAqYl9yb3RfbmV4dCA9ICZDVl9TVUJESVYyRF9ORVhUX0VER0UoIGJfcm90ICk7CisgICAgQ3ZTdWJkaXYyREVkZ2UgdDsKKworICAgIENWX1NXQVAoICphX25leHQsICpiX25leHQsIHQgKTsKKyAgICBDVl9TV0FQKCAqYV9yb3RfbmV4dCwgKmJfcm90X25leHQsIHQgKTsKK30KKworCitzdGF0aWMgdm9pZAorY3ZTdWJkaXYyRFNldEVkZ2VQb2ludHMoIEN2U3ViZGl2MkRFZGdlIGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyRFBvaW50ICogb3JnX3B0LCBDdlN1YmRpdjJEUG9pbnQgKiBkc3RfcHQgKQoreworICAgIEN2UXVhZEVkZ2UyRCAqcXVhZGVkZ2UgPSAoQ3ZRdWFkRWRnZTJEICopIChlZGdlICYgfjMpOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlN1YmRpdjJEU2V0RWRnZVBvaW50cyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhcXVhZGVkZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHF1YWRlZGdlLT5wdFtlZGdlICYgM10gPSBvcmdfcHQ7CisgICAgcXVhZGVkZ2UtPnB0WyhlZGdlICsgMikgJiAzXSA9IGRzdF9wdDsKKworICAgIAorICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQKK2N2U3ViZGl2MkREZWxldGVFZGdlKCBDdlN1YmRpdjJEICogc3ViZGl2LCBDdlN1YmRpdjJERWRnZSBlZGdlICkKK3sKKyAgICBDdlF1YWRFZGdlMkQgKnF1YWRlZGdlID0gKEN2UXVhZEVkZ2UyRCAqKSAoZWRnZSAmIH4zKTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJkaXYyRERlbGV0ZUVkZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN1YmRpdiB8fCAhcXVhZGVkZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGN2U3ViZGl2MkRTcGxpY2UoIGVkZ2UsIGN2U3ViZGl2MkRHZXRFZGdlKCBlZGdlLCBDVl9QUkVWX0FST1VORF9PUkcgKSk7CisKKyAgICB7CisgICAgQ3ZTdWJkaXYyREVkZ2Ugc3ltX2VkZ2UgPSBjdlN1YmRpdjJEU3ltRWRnZSggZWRnZSApOworICAgIGN2U3ViZGl2MkRTcGxpY2UoIHN5bV9lZGdlLCBjdlN1YmRpdjJER2V0RWRnZSggc3ltX2VkZ2UsIENWX1BSRVZfQVJPVU5EX09SRyApKTsKKyAgICB9CisKKyAgICBjdlNldFJlbW92ZUJ5UHRyKCAoQ3ZTZXQqKShzdWJkaXYtPmVkZ2VzKSwgcXVhZGVkZ2UgKTsKKyAgICBzdWJkaXYtPnF1YWRfZWRnZXMtLTsKKworICAgIAorICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIEN2U3ViZGl2MkRFZGdlCitjdlN1YmRpdjJEQ29ubmVjdEVkZ2VzKCBDdlN1YmRpdjJEICogc3ViZGl2LCBDdlN1YmRpdjJERWRnZSBlZGdlQSwgQ3ZTdWJkaXYyREVkZ2UgZWRnZUIgKQoreworICAgIEN2U3ViZGl2MkRFZGdlIG5ld19lZGdlID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJkaXYyRENvbm5lY3RQb2ludHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlN1YmRpdjJEUG9pbnQgKm9yZ0IsICpkc3RBOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIG5ld19lZGdlID0gY3ZTdWJkaXYyRE1ha2VFZGdlKCBzdWJkaXYgKTsKKworICAgIGN2U3ViZGl2MkRTcGxpY2UoIG5ld19lZGdlLCBjdlN1YmRpdjJER2V0RWRnZSggZWRnZUEsIENWX05FWFRfQVJPVU5EX0xFRlQgKSk7CisgICAgY3ZTdWJkaXYyRFNwbGljZSggY3ZTdWJkaXYyRFN5bUVkZ2UoIG5ld19lZGdlICksIGVkZ2VCICk7CisKKyAgICBkc3RBID0gY3ZTdWJkaXYyREVkZ2VEc3QoIGVkZ2VBICk7CisgICAgb3JnQiA9IGN2U3ViZGl2MkRFZGdlT3JnKCBlZGdlQiApOworICAgIGN2U3ViZGl2MkRTZXRFZGdlUG9pbnRzKCBuZXdfZWRnZSwgZHN0QSwgb3JnQiApOworICAgIAorICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbmV3X2VkZ2U7Cit9CisKKworc3RhdGljIHZvaWQKK2N2U3ViZGl2MkRTd2FwRWRnZXMoIEN2U3ViZGl2MkRFZGdlIGVkZ2UgKQoreworICAgIEN2U3ViZGl2MkRFZGdlIHN5bV9lZGdlID0gY3ZTdWJkaXYyRFN5bUVkZ2UoIGVkZ2UgKTsKKyAgICBDdlN1YmRpdjJERWRnZSBhID0gY3ZTdWJkaXYyREdldEVkZ2UoIGVkZ2UsIENWX1BSRVZfQVJPVU5EX09SRyApOworICAgIEN2U3ViZGl2MkRFZGdlIGIgPSBjdlN1YmRpdjJER2V0RWRnZSggc3ltX2VkZ2UsIENWX1BSRVZfQVJPVU5EX09SRyApOworICAgIEN2U3ViZGl2MkRQb2ludCAqZHN0QiwgKmRzdEE7CisKKyAgICBjdlN1YmRpdjJEU3BsaWNlKCBlZGdlLCBhICk7CisgICAgY3ZTdWJkaXYyRFNwbGljZSggc3ltX2VkZ2UsIGIgKTsKKworICAgIGRzdEEgPSBjdlN1YmRpdjJERWRnZURzdCggYSApOworICAgIGRzdEIgPSBjdlN1YmRpdjJERWRnZURzdCggYiApOworICAgIGN2U3ViZGl2MkRTZXRFZGdlUG9pbnRzKCBlZGdlLCBkc3RBLCBkc3RCICk7CisKKyAgICBjdlN1YmRpdjJEU3BsaWNlKCBlZGdlLCBjdlN1YmRpdjJER2V0RWRnZSggYSwgQ1ZfTkVYVF9BUk9VTkRfTEVGVCApKTsKKyAgICBjdlN1YmRpdjJEU3BsaWNlKCBzeW1fZWRnZSwgY3ZTdWJkaXYyREdldEVkZ2UoIGIsIENWX05FWFRfQVJPVU5EX0xFRlQgKSk7Cit9CisKKworc3RhdGljIGludAoraWN2SXNSaWdodE9mKCBDdlBvaW50MkQzMmYmIHB0LCBDdlN1YmRpdjJERWRnZSBlZGdlICkKK3sKKyAgICBDdlN1YmRpdjJEUG9pbnQgKm9yZyA9IGN2U3ViZGl2MkRFZGdlT3JnKGVkZ2UpLCAqZHN0ID0gY3ZTdWJkaXYyREVkZ2VEc3QoZWRnZSk7CisgICAgQ3YzMnN1ZiBjd19hcmVhOworICAgIGN3X2FyZWEuZiA9IChmbG9hdCljdlRyaWFuZ2xlQXJlYSggcHQsIGRzdC0+cHQsIG9yZy0+cHQgKTsKKworICAgIHJldHVybiAoY3dfYXJlYS5pID4gMCkqMiAtIChjd19hcmVhLmkqMiAhPSAwKTsKK30KKworCitDVl9JTVBMIEN2U3ViZGl2MkRQb2ludExvY2F0aW9uCitjdlN1YmRpdjJETG9jYXRlKCBDdlN1YmRpdjJEICogc3ViZGl2LCBDdlBvaW50MkQzMmYgcHQsCisgICAgICAgICAgICAgICAgICBDdlN1YmRpdjJERWRnZSAqIF9lZGdlLCBDdlN1YmRpdjJEUG9pbnQgKiogX3BvaW50ICkKK3sKKyAgICBDdlN1YmRpdjJERWRnZSBlZGdlID0gMDsKKyAgICBDdlN1YmRpdjJEUG9pbnQgKnBvaW50ID0gMDsKKyAgICBDdlN1YmRpdjJEUG9pbnRMb2NhdGlvbiBsb2NhdGlvbiA9IENWX1BUTE9DX0VSUk9SOworCisgICAgaW50IGksIG1heF9lZGdlczsKKyAgICBpbnQgcmlnaHRfb2ZfY3VyciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U3ViZGl2MkRMb2NhdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN1YmRpdiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICFDVl9JU19TVUJESVYyRChzdWJkaXYpICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBREZMQUdfRVJSICk7CisKKyAgICBtYXhfZWRnZXMgPSBzdWJkaXYtPnF1YWRfZWRnZXMgKiA0OworICAgIGVkZ2UgPSBzdWJkaXYtPnJlY2VudF9lZGdlOworCisgICAgaWYoIG1heF9lZGdlcyA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX0JBRFNJWkVfRVJSICk7CisgICAgaWYoICFlZGdlICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9TVEFUVVMoIENWX05PVERFRklORURfRVJSICk7CisKKyAgICBsb2NhdGlvbiA9IENWX1BUTE9DX09VVFNJREVfUkVDVDsKKyAgICBpZiggcHQueCA8IHN1YmRpdi0+dG9wbGVmdC54IHx8IHB0LnkgPCBzdWJkaXYtPnRvcGxlZnQueSB8fAorICAgICAgICBwdC54ID49IHN1YmRpdi0+Ym90dG9tcmlnaHQueCB8fCBwdC55ID49IHN1YmRpdi0+Ym90dG9tcmlnaHQueSApCisgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9CQURSQU5HRV9FUlIgKTsKKworICAgIGxvY2F0aW9uID0gQ1ZfUFRMT0NfRVJST1I7CisKKyAgICByaWdodF9vZl9jdXJyID0gaWN2SXNSaWdodE9mKCBwdCwgZWRnZSApOworICAgIGlmKCByaWdodF9vZl9jdXJyID4gMCApCisgICAgeworICAgICAgICBlZGdlID0gY3ZTdWJkaXYyRFN5bUVkZ2UoIGVkZ2UgKTsKKyAgICAgICAgcmlnaHRfb2ZfY3VyciA9IC1yaWdodF9vZl9jdXJyOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBtYXhfZWRnZXM7IGkrKyApCisgICAgeworICAgICAgICBDdlN1YmRpdjJERWRnZSBvbmV4dF9lZGdlID0gY3ZTdWJkaXYyRE5leHRFZGdlKCBlZGdlICk7CisgICAgICAgIEN2U3ViZGl2MkRFZGdlIGRwcmV2X2VkZ2UgPSBjdlN1YmRpdjJER2V0RWRnZSggZWRnZSwgQ1ZfUFJFVl9BUk9VTkRfRFNUICk7CisKKyAgICAgICAgaW50IHJpZ2h0X29mX29uZXh0ID0gaWN2SXNSaWdodE9mKCBwdCwgb25leHRfZWRnZSApOworICAgICAgICBpbnQgcmlnaHRfb2ZfZHByZXYgPSBpY3ZJc1JpZ2h0T2YoIHB0LCBkcHJldl9lZGdlICk7CisKKyAgICAgICAgaWYoIHJpZ2h0X29mX2RwcmV2ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCByaWdodF9vZl9vbmV4dCA+IDAgfHwgKHJpZ2h0X29mX29uZXh0ID09IDAgJiYgcmlnaHRfb2ZfY3VyciA9PSAwKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBDVl9QVExPQ19JTlNJREU7CisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByaWdodF9vZl9jdXJyID0gcmlnaHRfb2Zfb25leHQ7CisgICAgICAgICAgICAgICAgZWRnZSA9IG9uZXh0X2VkZ2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcmlnaHRfb2Zfb25leHQgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggcmlnaHRfb2ZfZHByZXYgPT0gMCAmJiByaWdodF9vZl9jdXJyID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBDVl9QVExPQ19JTlNJREU7CisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJpZ2h0X29mX2N1cnIgPSByaWdodF9vZl9kcHJldjsKKyAgICAgICAgICAgICAgICAgICAgZWRnZSA9IGRwcmV2X2VkZ2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggcmlnaHRfb2ZfY3VyciA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICBpY3ZJc1JpZ2h0T2YoIGN2U3ViZGl2MkRFZGdlRHN0KCBvbmV4dF9lZGdlICktPnB0LCBlZGdlICkgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWRnZSA9IGN2U3ViZGl2MkRTeW1FZGdlKCBlZGdlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmlnaHRfb2ZfY3VyciA9IHJpZ2h0X29mX29uZXh0OworICAgICAgICAgICAgICAgIGVkZ2UgPSBvbmV4dF9lZGdlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgX19FTkRfXzsKKworICAgIHN1YmRpdi0+cmVjZW50X2VkZ2UgPSBlZGdlOworCisgICAgaWYoIGxvY2F0aW9uID09IENWX1BUTE9DX0lOU0lERSApCisgICAgeworICAgICAgICBkb3VibGUgdDEsIHQyLCB0MzsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIG9yZ19wdCA9IGN2U3ViZGl2MkRFZGdlT3JnKCBlZGdlICktPnB0OworICAgICAgICBDdlBvaW50MkQzMmYgZHN0X3B0ID0gY3ZTdWJkaXYyREVkZ2VEc3QoIGVkZ2UgKS0+cHQ7CisKKyAgICAgICAgdDEgPSBmYWJzKCBwdC54IC0gb3JnX3B0LnggKTsKKyAgICAgICAgdDEgKz0gZmFicyggcHQueSAtIG9yZ19wdC55ICk7CisgICAgICAgIHQyID0gZmFicyggcHQueCAtIGRzdF9wdC54ICk7CisgICAgICAgIHQyICs9IGZhYnMoIHB0LnkgLSBkc3RfcHQueSApOworICAgICAgICB0MyA9IGZhYnMoIG9yZ19wdC54IC0gZHN0X3B0LnggKTsKKyAgICAgICAgdDMgKz0gZmFicyggb3JnX3B0LnkgLSBkc3RfcHQueSApOworCisgICAgICAgIGlmKCB0MSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYXRpb24gPSBDVl9QVExPQ19WRVJURVg7CisgICAgICAgICAgICBwb2ludCA9IGN2U3ViZGl2MkRFZGdlT3JnKCBlZGdlICk7CisgICAgICAgICAgICBlZGdlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0MiA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9jYXRpb24gPSBDVl9QVExPQ19WRVJURVg7CisgICAgICAgICAgICBwb2ludCA9IGN2U3ViZGl2MkRFZGdlRHN0KCBlZGdlICk7CisgICAgICAgICAgICBlZGdlID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAodDEgPCB0MyB8fCB0MiA8IHQzKSAmJgorICAgICAgICAgICAgICAgICBmYWJzKCBjdlRyaWFuZ2xlQXJlYSggcHQsIG9yZ19wdCwgZHN0X3B0ICkpIDwgRkxUX0VQU0lMT04gKQorICAgICAgICB7CisgICAgICAgICAgICBsb2NhdGlvbiA9IENWX1BUTE9DX09OX0VER0U7CisgICAgICAgICAgICBwb2ludCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbG9jYXRpb24gPT0gQ1ZfUFRMT0NfRVJST1IgKQorICAgIHsKKyAgICAgICAgZWRnZSA9IDA7CisgICAgICAgIHBvaW50ID0gMDsKKyAgICB9CisKKyAgICBpZiggX2VkZ2UgKQorICAgICAgICAqX2VkZ2UgPSBlZGdlOworICAgIGlmKCBfcG9pbnQgKQorICAgICAgICAqX3BvaW50ID0gcG9pbnQ7CisKKyAgICByZXR1cm4gbG9jYXRpb247Cit9CisKKworQ1ZfSU5MSU5FIGludAoraWN2SXNQdEluQ2lyY2xlMyggQ3ZQb2ludDJEMzJmIHB0LCBDdlBvaW50MkQzMmYgYSwgQ3ZQb2ludDJEMzJmIGIsIEN2UG9pbnQyRDMyZiBjICkKK3sKKyAgICBkb3VibGUgdmFsID0gKGEueCAqIGEueCArIGEueSAqIGEueSkgKiBjdlRyaWFuZ2xlQXJlYSggYiwgYywgcHQgKTsKKyAgICB2YWwgLT0gKGIueCAqIGIueCArIGIueSAqIGIueSkgKiBjdlRyaWFuZ2xlQXJlYSggYSwgYywgcHQgKTsKKyAgICB2YWwgKz0gKGMueCAqIGMueCArIGMueSAqIGMueSkgKiBjdlRyaWFuZ2xlQXJlYSggYSwgYiwgcHQgKTsKKyAgICB2YWwgLT0gKHB0LnggKiBwdC54ICsgcHQueSAqIHB0LnkpICogY3ZUcmlhbmdsZUFyZWEoIGEsIGIsIGMgKTsKKworICAgIHJldHVybiB2YWwgPiBGTFRfRVBTSUxPTiA/IDEgOiB2YWwgPCAtRkxUX0VQU0lMT04gPyAtMSA6IDA7Cit9CisKKworQ1ZfSU1QTCBDdlN1YmRpdjJEUG9pbnQgKgorY3ZTdWJkaXZEZWxhdW5heTJESW5zZXJ0KCBDdlN1YmRpdjJEICogc3ViZGl2LCBDdlBvaW50MkQzMmYgcHQgKQoreworICAgIEN2U3ViZGl2MkRQb2ludCAqcG9pbnQgPSAwOworICAgIEN2U3ViZGl2MkRQb2ludExvY2F0aW9uIGxvY2F0aW9uID0gQ1ZfUFRMT0NfRVJST1I7CisKKyAgICBDdlN1YmRpdjJEUG9pbnQgKmN1cnJfcG9pbnQgPSAwLCAqZmlyc3RfcG9pbnQgPSAwOworICAgIEN2U3ViZGl2MkRFZGdlIGN1cnJfZWRnZSA9IDAsIGRlbGV0ZWRfZWRnZSA9IDAsIGJhc2VfZWRnZSA9IDA7CisgICAgaW50IGksIG1heF9lZGdlczsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJkaXZEZWxhdW5heTJESW5zZXJ0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfU1VCRElWMkQoc3ViZGl2KSApCisgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9CQURGTEFHX0VSUiApOworCisKKyAgICBsb2NhdGlvbiA9IGN2U3ViZGl2MkRMb2NhdGUoIHN1YmRpdiwgcHQsICZjdXJyX2VkZ2UsICZjdXJyX3BvaW50ICk7CisKKyAgICBzd2l0Y2ggKGxvY2F0aW9uKQorICAgIHsKKyAgICBjYXNlIENWX1BUTE9DX0VSUk9SOgorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFEU0laRV9FUlIgKTsKKworICAgIGNhc2UgQ1ZfUFRMT0NfT1VUU0lERV9SRUNUOgorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfQkFEUkFOR0VfRVJSICk7CisKKyAgICBjYXNlIENWX1BUTE9DX1ZFUlRFWDoKKyAgICAgICAgcG9pbnQgPSBjdXJyX3BvaW50OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfUFRMT0NfT05fRURHRToKKyAgICAgICAgZGVsZXRlZF9lZGdlID0gY3Vycl9lZGdlOworICAgICAgICBzdWJkaXYtPnJlY2VudF9lZGdlID0gY3Vycl9lZGdlID0gY3ZTdWJkaXYyREdldEVkZ2UoIGN1cnJfZWRnZSwgQ1ZfUFJFVl9BUk9VTkRfT1JHICk7CisgICAgICAgIGN2U3ViZGl2MkREZWxldGVFZGdlKCBzdWJkaXYsIGRlbGV0ZWRfZWRnZSApOworICAgICAgICAvKiBubyBicmVhayAqLworCisgICAgY2FzZSBDVl9QVExPQ19JTlNJREU6CisKKyAgICAgICAgYXNzZXJ0KCBjdXJyX2VkZ2UgIT0gMCApOworICAgICAgICBzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkID0gMDsKKworICAgICAgICBjdXJyX3BvaW50ID0gY3ZTdWJkaXYyREFkZFBvaW50KCBzdWJkaXYsIHB0LCAwICk7CisgICAgICAgIENWX0NIRUNLKCk7CisKKyAgICAgICAgYmFzZV9lZGdlID0gY3ZTdWJkaXYyRE1ha2VFZGdlKCBzdWJkaXYgKTsKKyAgICAgICAgZmlyc3RfcG9pbnQgPSBjdlN1YmRpdjJERWRnZU9yZyggY3Vycl9lZGdlICk7CisgICAgICAgIGN2U3ViZGl2MkRTZXRFZGdlUG9pbnRzKCBiYXNlX2VkZ2UsIGZpcnN0X3BvaW50LCBjdXJyX3BvaW50ICk7CisgICAgICAgIGN2U3ViZGl2MkRTcGxpY2UoIGJhc2VfZWRnZSwgY3Vycl9lZGdlICk7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgYmFzZV9lZGdlID0gY3ZTdWJkaXYyRENvbm5lY3RFZGdlcyggc3ViZGl2LCBjdXJyX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlN1YmRpdjJEU3ltRWRnZSggYmFzZV9lZGdlICkpOworICAgICAgICAgICAgY3Vycl9lZGdlID0gY3ZTdWJkaXYyREdldEVkZ2UoIGJhc2VfZWRnZSwgQ1ZfUFJFVl9BUk9VTkRfT1JHICk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGN2U3ViZGl2MkRFZGdlRHN0KCBjdXJyX2VkZ2UgKSAhPSBmaXJzdF9wb2ludCApOworCisgICAgICAgIGN1cnJfZWRnZSA9IGN2U3ViZGl2MkRHZXRFZGdlKCBiYXNlX2VkZ2UsIENWX1BSRVZfQVJPVU5EX09SRyApOworCisgICAgICAgIG1heF9lZGdlcyA9IHN1YmRpdi0+cXVhZF9lZGdlcyAqIDQ7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1heF9lZGdlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTdWJkaXYyRFBvaW50ICp0ZW1wX2RzdCA9IDAsICpjdXJyX29yZyA9IDAsICpjdXJyX2RzdCA9IDA7CisgICAgICAgICAgICBDdlN1YmRpdjJERWRnZSB0ZW1wX2VkZ2UgPSBjdlN1YmRpdjJER2V0RWRnZSggY3Vycl9lZGdlLCBDVl9QUkVWX0FST1VORF9PUkcgKTsKKworICAgICAgICAgICAgdGVtcF9kc3QgPSBjdlN1YmRpdjJERWRnZURzdCggdGVtcF9lZGdlICk7CisgICAgICAgICAgICBjdXJyX29yZyA9IGN2U3ViZGl2MkRFZGdlT3JnKCBjdXJyX2VkZ2UgKTsKKyAgICAgICAgICAgIGN1cnJfZHN0ID0gY3ZTdWJkaXYyREVkZ2VEc3QoIGN1cnJfZWRnZSApOworCisgICAgICAgICAgICBpZiggaWN2SXNSaWdodE9mKCB0ZW1wX2RzdC0+cHQsIGN1cnJfZWRnZSApID4gMCAmJgorICAgICAgICAgICAgICAgIGljdklzUHRJbkNpcmNsZTMoIGN1cnJfb3JnLT5wdCwgdGVtcF9kc3QtPnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJfZHN0LT5wdCwgY3Vycl9wb2ludC0+cHQgKSA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2U3ViZGl2MkRTd2FwRWRnZXMoIGN1cnJfZWRnZSApOworICAgICAgICAgICAgICAgIGN1cnJfZWRnZSA9IGN2U3ViZGl2MkRHZXRFZGdlKCBjdXJyX2VkZ2UsIENWX1BSRVZfQVJPVU5EX09SRyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggY3Vycl9vcmcgPT0gZmlyc3RfcG9pbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJfZWRnZSA9IGN2U3ViZGl2MkRHZXRFZGdlKCBjdlN1YmRpdjJETmV4dEVkZ2UoIGN1cnJfZWRnZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QUkVWX0FST1VORF9MRUZUICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KCAwICk7CisgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCBDVl9OT1RERUZJTkVEX0VSUiApOworICAgIH0KKworICAgIHBvaW50ID0gY3Vycl9wb2ludDsKKworICAgIAorICAgIF9fRU5EX187CisKKyAgICAvL2ljdlN1YmRpdjJEQ2hlY2soIHN1YmRpdiApOworCisgICAgcmV0dXJuIHBvaW50OworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZJbml0U3ViZGl2RGVsYXVuYXkyRCggQ3ZTdWJkaXYyRCAqIHN1YmRpdiwgQ3ZSZWN0IHJlY3QgKQoreworICAgIGZsb2F0IGJpZ19jb29yZCA9IDMuZiAqIE1BWCggcmVjdC53aWR0aCwgcmVjdC5oZWlnaHQgKTsKKyAgICBDdlBvaW50MkQzMmYgcHBBLCBwcEIsIHBwQzsKKyAgICBDdlN1YmRpdjJEUG9pbnQgKnBBLCAqcEIsICpwQzsKKyAgICBDdlN1YmRpdjJERWRnZSBlZGdlX0FCLCBlZGdlX0JDLCBlZGdlX0NBOworICAgIGZsb2F0IHJ4ID0gKGZsb2F0KSByZWN0Lng7CisgICAgZmxvYXQgcnkgPSAoZmxvYXQpIHJlY3QueTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJkaXZEZWxhdW5heTJESW5pdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3ViZGl2ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBjdkNsZWFyU2V0KCAoQ3ZTZXQgKikgKHN1YmRpdi0+ZWRnZXMpICk7CisgICAgY3ZDbGVhclNldCggKEN2U2V0ICopIHN1YmRpdiApOworCisgICAgc3ViZGl2LT5xdWFkX2VkZ2VzID0gMDsKKyAgICBzdWJkaXYtPnJlY2VudF9lZGdlID0gMDsKKyAgICBzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkID0gMDsKKworICAgIHN1YmRpdi0+dG9wbGVmdCA9IGN2UG9pbnQyRDMyZiggcngsIHJ5ICk7CisgICAgc3ViZGl2LT5ib3R0b21yaWdodCA9IGN2UG9pbnQyRDMyZiggcnggKyByZWN0LndpZHRoLCByeSArIHJlY3QuaGVpZ2h0ICk7CisKKyAgICBwcEEgPSBjdlBvaW50MkQzMmYoIHJ4ICsgYmlnX2Nvb3JkLCByeSApOworICAgIHBwQiA9IGN2UG9pbnQyRDMyZiggcngsIHJ5ICsgYmlnX2Nvb3JkICk7CisgICAgcHBDID0gY3ZQb2ludDJEMzJmKCByeCAtIGJpZ19jb29yZCwgcnkgLSBiaWdfY29vcmQgKTsKKworICAgIHBBID0gY3ZTdWJkaXYyREFkZFBvaW50KCBzdWJkaXYsIHBwQSwgMCApOworICAgIHBCID0gY3ZTdWJkaXYyREFkZFBvaW50KCBzdWJkaXYsIHBwQiwgMCApOworICAgIHBDID0gY3ZTdWJkaXYyREFkZFBvaW50KCBzdWJkaXYsIHBwQywgMCApOworCisgICAgZWRnZV9BQiA9IGN2U3ViZGl2MkRNYWtlRWRnZSggc3ViZGl2ICk7CisgICAgZWRnZV9CQyA9IGN2U3ViZGl2MkRNYWtlRWRnZSggc3ViZGl2ICk7CisgICAgZWRnZV9DQSA9IGN2U3ViZGl2MkRNYWtlRWRnZSggc3ViZGl2ICk7CisKKyAgICBjdlN1YmRpdjJEU2V0RWRnZVBvaW50cyggZWRnZV9BQiwgcEEsIHBCICk7CisgICAgY3ZTdWJkaXYyRFNldEVkZ2VQb2ludHMoIGVkZ2VfQkMsIHBCLCBwQyApOworICAgIGN2U3ViZGl2MkRTZXRFZGdlUG9pbnRzKCBlZGdlX0NBLCBwQywgcEEgKTsKKworICAgIGN2U3ViZGl2MkRTcGxpY2UoIGVkZ2VfQUIsIGN2U3ViZGl2MkRTeW1FZGdlKCBlZGdlX0NBICkpOworICAgIGN2U3ViZGl2MkRTcGxpY2UoIGVkZ2VfQkMsIGN2U3ViZGl2MkRTeW1FZGdlKCBlZGdlX0FCICkpOworICAgIGN2U3ViZGl2MkRTcGxpY2UoIGVkZ2VfQ0EsIGN2U3ViZGl2MkRTeW1FZGdlKCBlZGdlX0JDICkpOworCisgICAgc3ViZGl2LT5yZWNlbnRfZWRnZSA9IGVkZ2VfQUI7CisKKyAgICAKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZDbGVhclN1YmRpdlZvcm9ub2kyRCggQ3ZTdWJkaXYyRCAqIHN1YmRpdiApCit7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBpbnQgaSwgdG90YWw7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsZWFyVm9yb25vaTJEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIC8qIGNsZWFyIHBvaW50ZXJzIHRvIHZvcm9ub2kgcG9pbnRzICovCisgICAgdG90YWwgPSBzdWJkaXYtPmVkZ2VzLT50b3RhbDsKKyAgICBlbGVtX3NpemUgPSBzdWJkaXYtPmVkZ2VzLT5lbGVtX3NpemU7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxICopIChzdWJkaXYtPmVkZ2VzKSwgJnJlYWRlciwgMCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZRdWFkRWRnZTJEICpxdWFkZWRnZSA9IChDdlF1YWRFZGdlMkQgKikgcmVhZGVyLnB0cjsKKworICAgICAgICBxdWFkZWRnZS0+cHRbMV0gPSBxdWFkZWRnZS0+cHRbM10gPSAwOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIC8qIHJlbW92ZSB2b3Jvbm9pIHBvaW50cyAqLworICAgIHRvdGFsID0gc3ViZGl2LT50b3RhbDsKKyAgICBlbGVtX3NpemUgPSBzdWJkaXYtPmVsZW1fc2l6ZTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCAoQ3ZTZXEgKikgc3ViZGl2LCAmcmVhZGVyLCAwICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdlN1YmRpdjJEUG9pbnQgKnB0ID0gKEN2U3ViZGl2MkRQb2ludCAqKSByZWFkZXIucHRyOworCisgICAgICAgIC8qIGNoZWNrIGZvciB2aXJ0dWFsIHBvaW50LiBpdCBpcyBhbHNvIGNoZWNrIHRoYXQgdGhlIHBvaW50IGV4aXN0cyAqLworICAgICAgICBpZiggcHQtPmZsYWdzICYgQ1ZfU1VCRElWMkRfVklSVFVBTF9QT0lOVF9GTEFHICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZTZXRSZW1vdmVCeVB0ciggKEN2U2V0KilzdWJkaXYsIHB0ICk7CisgICAgICAgIH0KKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkID0gMDsKKworICAgIAorICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNhbGNTdWJkaXZWb3Jvbm9pMkQoIEN2U3ViZGl2MkQgKiBzdWJkaXYgKQoreworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgdG90YWwsIGVsZW1fc2l6ZTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjU3ViZGl2Vm9yb25vaTJEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIC8qIGNoZWNrIGlmIGl0IGlzIGFscmVhZHkgY2FsY3VsYXRlZCAqLworICAgIGlmKCBzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkICkKKyAgICAgICAgRVhJVDsKKworICAgIHRvdGFsID0gc3ViZGl2LT5lZGdlcy0+dG90YWw7CisgICAgZWxlbV9zaXplID0gc3ViZGl2LT5lZGdlcy0+ZWxlbV9zaXplOworCisgICAgY3ZDbGVhclN1YmRpdlZvcm9ub2kyRCggc3ViZGl2ICk7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxICopIChzdWJkaXYtPmVkZ2VzKSwgJnJlYWRlciwgMCApOworCisgICAgaWYoIHRvdGFsIDw9IDMgKQorICAgICAgICBFWElUOworCisgICAgLyogc2tpcCBmaXJzdCB0aHJlZSBlZGdlcyAoYm91bmRpbmcgdHJpYW5nbGUpICovCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyICk7CisKKyAgICAvKiBsb29wIHRocm91Z2ggYWxsIHF1YWQtZWRnZXMgKi8KKyAgICBmb3IoIDsgaSA8IHRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZRdWFkRWRnZTJEICpxdWFkZWRnZSA9IChDdlF1YWRFZGdlMkQgKikgKHJlYWRlci5wdHIpOworCisgICAgICAgIGlmKCBDVl9JU19TRVRfRUxFTSggcXVhZGVkZ2UgKSkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2UgZWRnZTAgPSAoQ3ZTdWJkaXYyREVkZ2UpIHF1YWRlZGdlLCBlZGdlMSwgZWRnZTI7CisgICAgICAgICAgICBkb3VibGUgYTAsIGIwLCBjMCwgYTEsIGIxLCBjMTsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiB2aXJ0X3BvaW50OworICAgICAgICAgICAgQ3ZTdWJkaXYyRFBvaW50ICp2b3Jvbm9pX3BvaW50OworCisgICAgICAgICAgICBpZiggIXF1YWRlZGdlLT5wdFszXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWRnZTEgPSBjdlN1YmRpdjJER2V0RWRnZSggZWRnZTAsIENWX05FWFRfQVJPVU5EX0xFRlQgKTsKKyAgICAgICAgICAgICAgICBlZGdlMiA9IGN2U3ViZGl2MkRHZXRFZGdlKCBlZGdlMSwgQ1ZfTkVYVF9BUk9VTkRfTEVGVCApOworCisgICAgICAgICAgICAgICAgaWN2Q3JlYXRlQ2VudGVyTm9ybWFsTGluZSggZWRnZTAsICZhMCwgJmIwLCAmYzAgKTsKKyAgICAgICAgICAgICAgICBpY3ZDcmVhdGVDZW50ZXJOb3JtYWxMaW5lKCBlZGdlMSwgJmExLCAmYjEsICZjMSApOworCisgICAgICAgICAgICAgICAgaWN2SW50ZXJzZWN0TGluZXMzKCAmYTAsICZiMCwgJmMwLCAmYTEsICZiMSwgJmMxLCAmdmlydF9wb2ludCApOworICAgICAgICAgICAgICAgIGlmKCBmYWJzKCB2aXJ0X3BvaW50LnggKSA8IEZMVF9NQVggKiAwLjUgJiYKKyAgICAgICAgICAgICAgICAgICAgZmFicyggdmlydF9wb2ludC55ICkgPCBGTFRfTUFYICogMC41ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZvcm9ub2lfcG9pbnQgPSBjdlN1YmRpdjJEQWRkUG9pbnQoIHN1YmRpdiwgdmlydF9wb2ludCwgMSApOworCisgICAgICAgICAgICAgICAgICAgIHF1YWRlZGdlLT5wdFszXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoKEN2UXVhZEVkZ2UyRCAqKSAoZWRnZTEgJiB+MykpLT5wdFszIC0gKGVkZ2UxICYgMildID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ3ZRdWFkRWRnZTJEICopIChlZGdlMiAmIH4zKSktPnB0WzMgLSAoZWRnZTIgJiAyKV0gPSB2b3Jvbm9pX3BvaW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFxdWFkZWRnZS0+cHRbMV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVkZ2UxID0gY3ZTdWJkaXYyREdldEVkZ2UoIGVkZ2UwLCBDVl9ORVhUX0FST1VORF9SSUdIVCApOworICAgICAgICAgICAgICAgIGVkZ2UyID0gY3ZTdWJkaXYyREdldEVkZ2UoIGVkZ2UxLCBDVl9ORVhUX0FST1VORF9SSUdIVCApOworCisgICAgICAgICAgICAgICAgaWN2Q3JlYXRlQ2VudGVyTm9ybWFsTGluZSggZWRnZTAsICZhMCwgJmIwLCAmYzAgKTsKKyAgICAgICAgICAgICAgICBpY3ZDcmVhdGVDZW50ZXJOb3JtYWxMaW5lKCBlZGdlMSwgJmExLCAmYjEsICZjMSApOworCisgICAgICAgICAgICAgICAgaWN2SW50ZXJzZWN0TGluZXMzKCAmYTAsICZiMCwgJmMwLCAmYTEsICZiMSwgJmMxLCAmdmlydF9wb2ludCApOworCisgICAgICAgICAgICAgICAgaWYoIGZhYnMoIHZpcnRfcG9pbnQueCApIDwgRkxUX01BWCAqIDAuNSAmJgorICAgICAgICAgICAgICAgICAgICBmYWJzKCB2aXJ0X3BvaW50LnkgKSA8IEZMVF9NQVggKiAwLjUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdm9yb25vaV9wb2ludCA9IGN2U3ViZGl2MkRBZGRQb2ludCggc3ViZGl2LCB2aXJ0X3BvaW50LCAxICk7CisKKyAgICAgICAgICAgICAgICAgICAgcXVhZGVkZ2UtPnB0WzFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoQ3ZRdWFkRWRnZTJEICopIChlZGdlMSAmIH4zKSktPnB0WzEgKyAoZWRnZTEgJiAyKV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgKChDdlF1YWRFZGdlMkQgKikgKGVkZ2UyICYgfjMpKS0+cHRbMSArIChlZGdlMiAmIDIpXSA9IHZvcm9ub2lfcG9pbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkID0gMTsKKworICAgIAorICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIGludAoraWN2SXNSaWdodE9mMiggY29uc3QgQ3ZQb2ludDJEMzJmJiBwdCwgY29uc3QgQ3ZQb2ludDJEMzJmJiBvcmcsIGNvbnN0IEN2UG9pbnQyRDMyZiYgZGlmZiApCit7CisgICAgQ3YzMnN1ZiBjd19hcmVhOworICAgIGN3X2FyZWEuZiA9IChvcmcueCAtIHB0LngpKmRpZmYueSAtIChvcmcueSAtIHB0LnkpKmRpZmYueDsKKyAgICByZXR1cm4gKGN3X2FyZWEuaSA+IDApKjIgLSAoY3dfYXJlYS5pKjIgIT0gMCk7Cit9CisKKworQ1ZfSU1QTCBDdlN1YmRpdjJEUG9pbnQqCitjdkZpbmROZWFyZXN0UG9pbnQyRCggQ3ZTdWJkaXYyRCogc3ViZGl2LCBDdlBvaW50MkQzMmYgcHQgKQoreworICAgIEN2U3ViZGl2MkRQb2ludCogcG9pbnQgPSAwOworICAgIEN2UG9pbnQyRDMyZiBzdGFydDsKKyAgICBDdlBvaW50MkQzMmYgZGlmZjsKKyAgICBDdlN1YmRpdjJEUG9pbnRMb2NhdGlvbiBsb2M7CisgICAgQ3ZTdWJkaXYyREVkZ2UgZWRnZTsgCisgICAgaW50IGk7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoImN2RmluZE5lYXJlc3RQb2ludDJEIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN1YmRpdiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICFDVl9JU19TVUJESVYyRCggc3ViZGl2ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICFzdWJkaXYtPmlzX2dlb21ldHJ5X3ZhbGlkICkKKyAgICAgICAgY3ZDYWxjU3ViZGl2Vm9yb25vaTJEKCBzdWJkaXYgKTsKKworICAgIGxvYyA9IGN2U3ViZGl2MkRMb2NhdGUoIHN1YmRpdiwgcHQsICZlZGdlLCAmcG9pbnQgKTsKKworICAgIHN3aXRjaCggbG9jICkKKyAgICB7CisgICAgY2FzZSBDVl9QVExPQ19PTl9FREdFOgorICAgIGNhc2UgQ1ZfUFRMT0NfSU5TSURFOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBFWElUOworICAgIH0KKworICAgIHBvaW50ID0gMDsKKworICAgIHN0YXJ0ID0gY3ZTdWJkaXYyREVkZ2VPcmcoIGVkZ2UgKS0+cHQ7CisgICAgZGlmZi54ID0gcHQueCAtIHN0YXJ0Lng7CisgICAgZGlmZi55ID0gcHQueSAtIHN0YXJ0Lnk7CisKKyAgICBlZGdlID0gY3ZTdWJkaXYyRFJvdGF0ZUVkZ2UoIGVkZ2UsIDEgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBzdWJkaXYtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHQ7CisgICAgICAgIAorICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggY3ZTdWJkaXYyREVkZ2VEc3QoIGVkZ2UgKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHQgPSBjdlN1YmRpdjJERWRnZURzdCggZWRnZSApLT5wdDsKKyAgICAgICAgICAgIGlmKCBpY3ZJc1JpZ2h0T2YyKCB0LCBzdGFydCwgZGlmZiApID49IDAgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBlZGdlID0gY3ZTdWJkaXYyREdldEVkZ2UoIGVkZ2UsIENWX05FWFRfQVJPVU5EX0xFRlQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBjdlN1YmRpdjJERWRnZU9yZyggZWRnZSApKTsKKworICAgICAgICAgICAgdCA9IGN2U3ViZGl2MkRFZGdlT3JnKCBlZGdlICktPnB0OworICAgICAgICAgICAgaWYoIGljdklzUmlnaHRPZjIoIHQsIHN0YXJ0LCBkaWZmICkgPCAwICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZWRnZSA9IGN2U3ViZGl2MkRHZXRFZGdlKCBlZGdlLCBDVl9QUkVWX0FST1VORF9MRUZUICk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50MkQzMmYgdGVtcERpZmYgPSBjdlN1YmRpdjJERWRnZURzdCggZWRnZSApLT5wdDsKKyAgICAgICAgICAgIHQgPSBjdlN1YmRpdjJERWRnZU9yZyggZWRnZSApLT5wdDsKKyAgICAgICAgICAgIHRlbXBEaWZmLnggLT0gdC54OworICAgICAgICAgICAgdGVtcERpZmYueSAtPSB0Lnk7CisKKyAgICAgICAgICAgIGlmKCBpY3ZJc1JpZ2h0T2YyKCBwdCwgdCwgdGVtcERpZmYgKSA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwb2ludCA9IGN2U3ViZGl2MkRFZGdlT3JnKCBjdlN1YmRpdjJEUm90YXRlRWRnZSggZWRnZSwgMyApKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGVkZ2UgPSBjdlN1YmRpdjJEU3ltRWRnZSggZWRnZSApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcG9pbnQ7Cit9CisKKy8qIFJlbW92ZWQgZnJvbSB0aGUgbWFpbiBpbnRlcmZhY2UgKi8KKworI2lmIDAKKy8qIEFkZHMgbmV3IGlzb2xhdGVkIHF1YWRlZGdlIHRvIHRoZSBzdWJkaXZpc2lvbiAqLworT1BFTkNWQVBJICBDdlN1YmRpdjJERWRnZSAgY3ZTdWJkaXYyRE1ha2VFZGdlKCBDdlN1YmRpdjJEKiBzdWJkaXYgKTsKKworCisvKiBBZGRzIG5ldyBpc29sYXRlZCBwb2ludCB0byBzdWJkaXZpc2lvbiAqLworT1BFTkNWQVBJICBDdlN1YmRpdjJEUG9pbnQqICAgY3ZTdWJkaXYyREFkZFBvaW50KCBDdlN1YmRpdjJEKiBzdWJkaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdCwgaW50IGlzX3ZpcnR1YWwgKTsKKworCisvKiBEb2VzIGEgc3BsaWNlIG9wZXJhdGlvbiBmb3IgdHdvIHF1YWRlZGdlcyAqLworT1BFTkNWQVBJICB2b2lkICBjdlN1YmRpdjJEU3BsaWNlKCBDdlN1YmRpdjJERWRnZSAgZWRnZUEsICBDdlN1YmRpdjJERWRnZSAgZWRnZUIgKTsKKworCisvKiBBc3NpZ25zIGVuZGluZyBbbm9uLXZpcnR1YWxdIHBvaW50cyBmb3IgZ2l2ZW4gcXVhZGVkZ2UgKi8KK09QRU5DVkFQSSAgdm9pZCAgY3ZTdWJkaXYyRFNldEVkZ2VQb2ludHMoIEN2U3ViZGl2MkRFZGdlIGVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlN1YmRpdjJEUG9pbnQqIG9yZ19wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkRQb2ludCogZHN0X3B0ICk7CisKKy8qIFJlbW92ZXMgcXVhZGVkZ2UgZnJvbSBzdWJkaXZpc2lvbiAqLworT1BFTkNWQVBJICB2b2lkICBjdlN1YmRpdjJERGVsZXRlRWRnZSggQ3ZTdWJkaXYyRCogc3ViZGl2LCBDdlN1YmRpdjJERWRnZSBlZGdlICk7CisKKworLyogQ29ubmVjdHMgZXN0aW5hdGlvbiBwb2ludCBvZiB0aGUgZmlyc3QgZWRnZSB3aXRoIG9yaWdpbiBwb2ludCBvZiB0aGUgc2Vjb25kIGVkZ2UgKi8KK09QRU5DVkFQSSAgQ3ZTdWJkaXYyREVkZ2UgIGN2U3ViZGl2MkRDb25uZWN0RWRnZXMoIEN2U3ViZGl2MkQqIHN1YmRpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkRFZGdlIGVkZ2VBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2UgZWRnZUIgKTsKKworLyogU3dhcHMgZGlhZ29uYWwgaW4gdHdvIGNvbm5lY3RlZCBEZWxhdW5heSBmYWNldHMgKi8KK09QRU5DVkFQSSAgdm9pZCAgY3ZTdWJkaXYyRFN3YXBFZGdlcyggQ3ZTdWJkaXYyREVkZ2UgZWRnZSApOworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2c3VtcGl4ZWxzLmNwcCBiL2N2L3NyYy9jdnN1bXBpeGVscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwMzQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnN1bXBpeGVscy5jcHAKQEAgLTAsMCArMSw0MzUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2LmgiCisKKyNkZWZpbmUgSUNWX0RFRl9JTlRFR1JBTF9PUF9DMSggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBjYXN0X3Nxcl9tYWNybyApICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZJbnRlZ3JhbEltYWdlXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUqIHN1bSwgaW50IHN1bXN0ZXAsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXN1bXR5cGUqIHNxc3VtLCBpbnQgc3FzdW1zdGVwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUqIHRpbHRlZCwgaW50IHRpbHRlZHN0ZXAsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUgKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN1bXR5cGUgczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXN1bXR5cGUgc3E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VtdHlwZSogYnVmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCggc3VtLCAwLCAoc2l6ZS53aWR0aCsxKSpzaXplb2Yoc3VtWzBdKSk7ICAgICAgICAgICAgIFwKKyAgICBzdW1zdGVwIC89IHNpemVvZihzdW1bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VtICs9IHN1bXN0ZXAgKyAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc3FzdW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1zZXQoIHNxc3VtLCAwLCAoc2l6ZS53aWR0aCsxKSpzaXplb2Yoc3FzdW1bMF0pKTsgICAgIFwKKyAgICAgICAgc3FzdW1zdGVwIC89IHNpemVvZihzcXN1bVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxc3VtICs9IHNxc3Vtc3RlcCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIHRpbHRlZCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbWVtc2V0KCB0aWx0ZWQsIDAsIChzaXplLndpZHRoKzEpKnNpemVvZih0aWx0ZWRbMF0pKTsgICBcCisgICAgICAgIHRpbHRlZHN0ZXAgLz0gc2l6ZW9mKHRpbHRlZFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0aWx0ZWQgKz0gdGlsdGVkc3RlcCArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBzcXN1bSA9PSAwICYmIHRpbHRlZCA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrLCBzcmMgKz0gc3Jjc3RlcCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IHN1bXN0ZXAgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdW1bLTFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMCwgcyA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtdHlwZSB0ID0gY2FzdF9tYWNybyhzcmNbeF0pOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMgKz0gdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSBzdW1beCAtIHN1bXN0ZXBdICsgczsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSBpZiggdGlsdGVkID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KyssIHNyYyArPSBzcmNzdGVwLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gc3Vtc3RlcCwgc3FzdW0gKz0gc3FzdW1zdGVwICkgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1bVstMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcXN1bVstMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggeCA9IDAsIHMgPSAwLCBzcSA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIGl0ID0gc3JjW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW10eXBlIHQgPSBjYXN0X21hY3JvKGl0KTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3FzdW10eXBlIHRxID0gY2FzdF9zcXJfbWFjcm8oaXQpOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMgKz0gdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcSArPSB0cTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdCA9IHN1bVt4IC0gc3Vtc3RlcF0gKyBzOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRxID0gc3FzdW1beCAtIHNxc3Vtc3RlcF0gKyBzcTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3FzdW1beF0gPSB0cTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBzcXN1bSA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFzc2VydCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJ1ZiA9IChzdW10eXBlKiljdlN0YWNrQWxsb2MoKHNpemUud2lkdGggKyAxICkqIHNpemVvZihidWZbMF0pKTtcCisgICAgICAgIHN1bVstMV0gPSB0aWx0ZWRbLTFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcXN1bVstMV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDAsIHMgPSAwLCBzcSA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGl0ID0gc3JjW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdW10eXBlIHQgPSBjYXN0X21hY3JvKGl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlIHRxID0gY2FzdF9zcXJfbWFjcm8oaXQpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJ1Zlt4XSA9IHRpbHRlZFt4XSA9IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzICs9IHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EgKz0gdHE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1bVt4XSA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcXN1bVt4XSA9IHNxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBzaXplLndpZHRoID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnVmWzFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeSA9IDE7IHkgPCBzaXplLmhlaWdodDsgeSsrICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdW10eXBlIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlIHRxMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcmMgKz0gc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3VtICs9IHN1bXN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNxc3VtICs9IHNxc3Vtc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0aWx0ZWQgKz0gdGlsdGVkc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGl0ID0gc3JjWzAvKngqL107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzID0gdDAgPSBjYXN0X21hY3JvKGl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EgPSB0cTAgPSBjYXN0X3Nxcl9tYWNybyhpdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdW1bLTFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3FzdW1bLTFdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qdGlsdGVkWy0xXSA9IGJ1ZlswXTsqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0aWx0ZWRbLTFdID0gdGlsdGVkWy10aWx0ZWRzdGVwXTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1bVswXSA9IHN1bVstc3Vtc3RlcF0gKyB0MDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcXN1bVswXSA9IHNxc3VtWy1zcXN1bXN0ZXBdICsgdHEwOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGlsdGVkWzBdID0gdGlsdGVkWy10aWx0ZWRzdGVwXSArIHQwICsgYnVmWzFdOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIHggPSAxOyB4IDwgc2l6ZS53aWR0aCAtIDE7IHgrKyApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW10eXBlIHQxID0gYnVmW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYnVmW3gtMV0gPSB0MSArIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGl0ID0gc3JjW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IGNhc3RfbWFjcm8oaXQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdHEwID0gY2FzdF9zcXJfbWFjcm8oaXQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcSArPSB0cTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtW3hdID0gc3VtW3ggLSBzdW1zdGVwXSArIHM7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNxc3VtW3hdID0gc3FzdW1beCAtIHNxc3Vtc3RlcF0gKyBzcTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSArPSBidWZbeCsxXSArIHQwICsgdGlsdGVkW3ggLSB0aWx0ZWRzdGVwIC0gMV07XAorICAgICAgICAgICAgICAgIHRpbHRlZFt4XSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHNpemUud2lkdGggPiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtdHlwZSB0MSA9IGJ1Zlt4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJ1Zlt4LTFdID0gdDEgKyB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpdCA9IHNyY1t4XTsgICAgLyorKi8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBjYXN0X21hY3JvKGl0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRxMCA9IGNhc3Rfc3FyX21hY3JvKGl0KTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3EgKz0gdHEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bVt4XSA9IHN1bVt4IC0gc3Vtc3RlcF0gKyBzOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcXN1bVt4XSA9IHNxc3VtW3ggLSBzcXN1bXN0ZXBdICsgc3E7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGlsdGVkW3hdID0gdDAgKyB0MSArIHRpbHRlZFt4IC0gdGlsdGVkc3RlcCAtIDFdO1wKKyAgICAgICAgICAgICAgICBidWZbeF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX0lOVEVHUkFMX09QX0MxKCA4dTMycywgdWNoYXIsIGludCwgZG91YmxlLCBpbnQsIENWX05PUCwgQ1ZfOFRPMzJGX1NRUiApCitJQ1ZfREVGX0lOVEVHUkFMX09QX0MxKCA4dTY0ZiwgdWNoYXIsIGRvdWJsZSwgZG91YmxlLCBpbnQsIENWXzhUTzMyRiwgQ1ZfOFRPMzJGX1NRUiApCitJQ1ZfREVGX0lOVEVHUkFMX09QX0MxKCAzMmY2NGYsIGZsb2F0LCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AsIENWX1NRUiApCitJQ1ZfREVGX0lOVEVHUkFMX09QX0MxKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9TUVIgKQorCisKKyNkZWZpbmUgSUNWX0RFRl9JTlRFR1JBTF9PUF9DTiggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGNhc3RfbWFjcm8sIGNhc3Rfc3FyX21hY3JvICkgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZJbnRlZ3JhbEltYWdlXyMjZmxhdm9yIyNfQ25SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUqIHN1bSwgaW50IHN1bXN0ZXAsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXN1bXR5cGUqIHNxc3VtLCBpbnQgc3FzdW1zdGVwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24gKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbXNldCggc3VtLCAwLCAoc2l6ZS53aWR0aCsxKSpjbipzaXplb2Yoc3VtWzBdKSk7ICAgICAgICAgIFwKKyAgICBzdW1zdGVwIC89IHNpemVvZihzdW1bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3VtICs9IHN1bXN0ZXAgKyBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc3FzdW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBtZW1zZXQoIHNxc3VtLCAwLCAoc2l6ZS53aWR0aCsxKSpjbipzaXplb2Yoc3FzdW1bMF0pKTsgIFwKKyAgICAgICAgc3FzdW1zdGVwIC89IHNpemVvZihzcXN1bVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxc3VtICs9IHNxc3Vtc3RlcCArIGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc3FzdW0gPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgc3JjICs9IHNyY3N0ZXAsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBzdW1zdGVwICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gLWNuOyB4IDwgMDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSBjYXN0X21hY3JvKHNyY1t4XSkgKyBzdW1beCAtIGNuXTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSBzdW1beF0gKyBzdW1beCAtIHN1bXN0ZXBdOyAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgc3JjICs9IHNyY3N0ZXAsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBzdW1zdGVwLCBzcXN1bSArPSBzcXN1bXN0ZXAgKSAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gLWNuOyB4IDwgMDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtW3hdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNxc3VtW3hdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgaXQgPSBzcmNbeF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHN1bXR5cGUgdCA9IGNhc3RfbWFjcm8oaXQpICsgc3VtW3gtY25dOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzcXN1bXR5cGUgdHEgPSBjYXN0X3Nxcl9tYWNybyhpdCkgKyBzcXN1bVt4LWNuXTtcCisgICAgICAgICAgICAgICAgc3VtW3hdID0gdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNxc3VtW3hdID0gdHE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3VtdHlwZSB0ID0gc3VtW3hdICsgc3VtW3ggLSBzdW1zdGVwXTsgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNxc3VtdHlwZSB0cSA9IHNxc3VtW3hdICsgc3FzdW1beCAtIHNxc3Vtc3RlcF07IFwKKyAgICAgICAgICAgICAgICBzdW1beF0gPSB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3FzdW1beF0gPSB0cTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9JTlRFR1JBTF9PUF9DTiggOHUzMnMsIHVjaGFyLCBpbnQsIGRvdWJsZSwgaW50LCBDVl9OT1AsIENWXzhUTzMyRl9TUVIgKQorSUNWX0RFRl9JTlRFR1JBTF9PUF9DTiggOHU2NGYsIHVjaGFyLCBkb3VibGUsIGRvdWJsZSwgaW50LCBDVl84VE8zMkYsIENWXzhUTzMyRl9TUVIgKQorSUNWX0RFRl9JTlRFR1JBTF9PUF9DTiggMzJmNjRmLCBmbG9hdCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9TUVIgKQorSUNWX0RFRl9JTlRFR1JBTF9PUF9DTiggNjRmLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIENWX05PUCwgQ1ZfU1FSICkKKworCitzdGF0aWMgdm9pZCBpY3ZJbml0SW50ZWdyYWxJbWFnZVRhYmxlKCBDdkZ1bmNUYWJsZSogdGFibGVfYzEsIEN2RnVuY1RhYmxlKiB0YWJsZV9jbiApCit7CisgICAgdGFibGVfYzEtPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZJbnRlZ3JhbEltYWdlXzh1NjRmX0MxUjsKKyAgICB0YWJsZV9jMS0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZJbnRlZ3JhbEltYWdlXzMyZjY0Zl9DMVI7CisgICAgdGFibGVfYzEtPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2SW50ZWdyYWxJbWFnZV82NGZfQzFSOworCisgICAgdGFibGVfY24tPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZJbnRlZ3JhbEltYWdlXzh1NjRmX0NuUjsKKyAgICB0YWJsZV9jbi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZJbnRlZ3JhbEltYWdlXzMyZjY0Zl9DblI7CisgICAgdGFibGVfY24tPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2SW50ZWdyYWxJbWFnZV82NGZfQ25SOworfQorCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkludGVncmFsSW1hZ2VGdW5jQzEpKAorICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIHN1bSwgaW50IHN1bXN0ZXAsCisgICAgdm9pZCogc3FzdW0sIGludCBzcXN1bXN0ZXAsIHZvaWQqIHRpbHRlZCwgaW50IHRpbHRlZHN0ZXAsCisgICAgQ3ZTaXplIHNpemUgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2SW50ZWdyYWxJbWFnZUZ1bmNDbikoCisgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogc3VtLCBpbnQgc3Vtc3RlcCwKKyAgICB2b2lkKiBzcXN1bSwgaW50IHNxc3Vtc3RlcCwgQ3ZTaXplIHNpemUsIGludCBjbiApOworCitpY3ZJbnRlZ3JhbF84dTMyc19DMVJfdCBpY3ZJbnRlZ3JhbF84dTMyc19DMVJfcCA9IDA7CitpY3ZTcXJJbnRlZ3JhbF84dTMyczY0Zl9DMVJfdCBpY3ZTcXJJbnRlZ3JhbF84dTMyczY0Zl9DMVJfcCA9IDA7CisKK0NWX0lNUEwgdm9pZAorY3ZJbnRlZ3JhbCggY29uc3QgQ3ZBcnIqIGltYWdlLCBDdkFyciogc3VtSW1hZ2UsCisgICAgICAgICAgICBDdkFyciogc3VtU3FJbWFnZSwgQ3ZBcnIqIHRpbHRlZFN1bUltYWdlICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgdGFiX2MxLCB0YWJfY247CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2SW50ZWdyYWxJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHNyY19zdHViLCAqc3JjID0gKEN2TWF0KilpbWFnZTsKKyAgICBDdk1hdCBzdW1fc3R1YiwgKnN1bSA9IChDdk1hdCopc3VtSW1hZ2U7CisgICAgQ3ZNYXQgc3FzdW1fc3R1YiwgKnNxc3VtID0gKEN2TWF0KilzdW1TcUltYWdlOworICAgIEN2TWF0IHRpbHRlZF9zdHViLCAqdGlsdGVkID0gKEN2TWF0Kil0aWx0ZWRTdW1JbWFnZTsKKyAgICBpbnQgY29pMCA9IDAsIGNvaTEgPSAwLCBjb2kyID0gMCwgY29pMyA9IDA7CisgICAgaW50IGRlcHRoLCBjbjsKKyAgICBpbnQgc3JjX3N0ZXAsIHN1bV9zdGVwLCBzcXN1bV9zdGVwLCB0aWx0ZWRfc3RlcDsKKyAgICBDdkludGVncmFsSW1hZ2VGdW5jQzEgZnVuY19jMSA9IDA7CisgICAgQ3ZJbnRlZ3JhbEltYWdlRnVuY0NuIGZ1bmNfY24gPSAwOworICAgIEN2U2l6ZSBzaXplOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRJbnRlZ3JhbEltYWdlVGFibGUoICZ0YWJfYzEsICZ0YWJfY24gKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY19zdHViLCAmY29pMCApKTsKKyAgICBDVl9DQUxMKCBzdW0gPSBjdkdldE1hdCggc3VtLCAmc3VtX3N0dWIsICZjb2kxICkpOworICAgIAorICAgIGlmKCBzdW0tPndpZHRoICE9IHNyYy0+d2lkdGggKyAxIHx8CisgICAgICAgIHN1bS0+aGVpZ2h0ICE9IHNyYy0+aGVpZ2h0ICsgMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCAoQ1ZfTUFUX0RFUFRIKCBzdW0tPnR5cGUgKSAhPSBDVl82NEYgJiYKKyAgICAgICAgKENWX01BVF9ERVBUSCggc3JjLT50eXBlICkgIT0gQ1ZfOFUgfHwKKyAgICAgICAgIENWX01BVF9ERVBUSCggc3VtLT50eXBlICkgIT0gQ1ZfMzJTICkpIHx8CisgICAgICAgICFDVl9BUkVfQ05TX0VRKCBzcmMsIHN1bSApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJTdW0gYXJyYXkgbXVzdCBoYXZlIDY0ZiB0eXBlIChvciAzMnMgdHlwZSBpbiBjYXNlIG9mIDh1IHNvdXJjZSBhcnJheSkgIgorICAgICAgICAiYW5kIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyBhcyB0aGUgc291cmNlIGFycmF5IiApOworCisgICAgaWYoIHNxc3VtICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNxc3VtID0gY3ZHZXRNYXQoIHNxc3VtLCAmc3FzdW1fc3R1YiwgJmNvaTIgKSk7CisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzdW0sIHNxc3VtICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKCBzcXN1bS0+dHlwZSApICE9IENWXzY0RiB8fCAhQ1ZfQVJFX0NOU19FUSggc3JjLCBzcXN1bSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICJTcXVhcmVzIHN1bSBhcnJheSBtdXN0IGJlIDY0ZiAiCisgICAgICAgICAgICAgICAgICAgICAgImFuZCB0aGUgc2FtZSBudW1iZXIgb2YgY2hhbm5lbHMgYXMgdGhlIHNvdXJjZSBhcnJheSIgKTsKKyAgICB9CisKKyAgICBpZiggdGlsdGVkICkKKyAgICB7CisgICAgICAgIGlmKCAhc3FzdW0gKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsCisgICAgICAgICAgICAiU3F1YXJlZCBzdW0gYXJyYXkgbXVzdCBiZSBwYXNzZWQgaWYgdGlsdGVkIHN1bSBhcnJheSBpcyBwYXNzZWQiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggdGlsdGVkID0gY3ZHZXRNYXQoIHRpbHRlZCwgJnRpbHRlZF9zdHViLCAmY29pMyApKTsKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHN1bSwgdGlsdGVkICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3VtLCB0aWx0ZWQgKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAiU3VtIGFuZCB0aWx0ZWQgc3VtIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlcyIgKTsKKyAgICAgICAgaWYoIENWX01BVF9DTih0aWx0ZWQtPnR5cGUpICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c05vdEltcGxlbWVudGVkLAorICAgICAgICAgICAgICAgICAgICAgICJUaWx0ZWQgc3VtIGNhbiBub3QgYmUgY29tcHV0ZWQgZm9yIG11bHRpLWNoYW5uZWwgYXJyYXlzIiApOworICAgIH0KKworICAgIGlmKCBjb2kwIHx8IGNvaTEgfHwgY29pMiB8fCBjb2kzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIkNPSSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBmdW5jdGlvbiIgKTsKKworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHNyYy0+dHlwZSk7CisgICAgY24gPSBDVl9NQVRfQ04oc3JjLT50eXBlKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIHN1bS0+dHlwZSApID09IENWXzMyUyApCisgICAgeworICAgICAgICBmdW5jX2MxID0gKEN2SW50ZWdyYWxJbWFnZUZ1bmNDMSlpY3ZJbnRlZ3JhbEltYWdlXzh1MzJzX0MxUjsKKyAgICAgICAgZnVuY19jbiA9IChDdkludGVncmFsSW1hZ2VGdW5jQ24paWN2SW50ZWdyYWxJbWFnZV84dTMyc19DblI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZ1bmNfYzEgPSAoQ3ZJbnRlZ3JhbEltYWdlRnVuY0MxKXRhYl9jMS5mbl8yZFtkZXB0aF07CisgICAgICAgIGZ1bmNfY24gPSAoQ3ZJbnRlZ3JhbEltYWdlRnVuY0NuKXRhYl9jbi5mbl8yZFtkZXB0aF07CisgICAgICAgIGlmKCAhZnVuY19jMSAmJiAhZnVuY19jbiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGlzIHNvdXJjZSBpbWFnZSBmb3JtYXQgaXMgdW5zdXBwb3J0ZWQiICk7CisgICAgfQorCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZShzcmMpOworICAgIHNyY19zdGVwID0gc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgIHN1bV9zdGVwID0gc3VtLT5zdGVwID8gc3VtLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworICAgIHNxc3VtX3N0ZXAgPSAhc3FzdW0gPyAwIDogc3FzdW0tPnN0ZXAgPyBzcXN1bS0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICB0aWx0ZWRfc3RlcCA9ICF0aWx0ZWQgPyAwIDogdGlsdGVkLT5zdGVwID8gdGlsdGVkLT5zdGVwIDogQ1ZfU1RVQl9TVEVQOworCisgICAgaWYoIGNuID09IDEgKQorICAgIHsKKyAgICAgICAgaWYoIGRlcHRoID09IENWXzhVICYmICF0aWx0ZWQgJiYgQ1ZfTUFUX0RFUFRIKHN1bS0+dHlwZSkgPT0gQ1ZfMzJTICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFzcXN1bSAmJiBpY3ZJbnRlZ3JhbF84dTMyc19DMVJfcCAmJgorICAgICAgICAgICAgICAgIGljdkludGVncmFsXzh1MzJzX0MxUl9wKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0tPmRhdGEuaSwgc3VtX3N0ZXAsIHNpemUsIDAgKSA+PSAwICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggc3FzdW0gJiYgaWN2U3FySW50ZWdyYWxfOHUzMnM2NGZfQzFSX3AgJiYKKyAgICAgICAgICAgICAgICBpY3ZTcXJJbnRlZ3JhbF84dTMyczY0Zl9DMVJfcCggc3JjLT5kYXRhLnB0ciwgc3JjX3N0ZXAsIHN1bS0+ZGF0YS5pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bV9zdGVwLCBzcXN1bS0+ZGF0YS5kYiwgc3FzdW1fc3RlcCwgc2l6ZSwgMCwgMCApID49IDAgKQorICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmNfYzEoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBzdW0tPmRhdGEucHRyLCBzdW1fc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNxc3VtID8gc3FzdW0tPmRhdGEucHRyIDogMCwgc3FzdW1fc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbHRlZCA/IHRpbHRlZC0+ZGF0YS5wdHIgOiAwLCB0aWx0ZWRfc3RlcCwgc2l6ZSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jX2NuKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwgc3VtLT5kYXRhLnB0ciwgc3VtX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICBzcXN1bSA/IHNxc3VtLT5kYXRhLnB0ciA6IDAsIHNxc3VtX3N0ZXAsIHNpemUsIGNuICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3ZzdXJmLmNwcCBiL2N2L3NyYy9jdnN1cmYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YjBmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3ZzdXJmLmNwcApAQCAtMCwwICsxLDU2MiBAQAorLyogT3JpZ2luYWwgY29kZSBoYXMgYmVlbiBzdWJtaXR0ZWQgYnkgTGl1IExpdS4gSGVyZSBpcyB0aGUgY29weXJpZ2h0LgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQW4gT3BlbkNWIEltcGxlbWVudGF0aW9uIG9mIFNVUkYKKyAqIEZ1cnRoZXIgSW5mb3JtYXRpb24gUmVmZXIgdG8gIlNVUkY6IFNwZWVkLVVwIFJvYnVzdCBGZWF0dXJlIgorICogQXV0aG9yOiBMaXUgTGl1CisgKiBsaXVsaXUuMTk4NytvcGVuY3ZAZ21haWwuY29tCisgKgorICogVGhlcmUgYXJlIHN0aWxsIHNlcnZlcmFsIGxhY2tzIGZvciB0aGlzIGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbjoKKyAqIDEuVGhlIGludGVycG9sYXRpb24gb2Ygc3ViLXBpeGVsIG1lbnRpb25lZCBpbiBhcnRpY2xlIHdhcyBub3QgaW1wbGVtZW50ZWQgeWV0OworICogMi5BIGNvbXBhcmlzaW9uIHdpdGggb3JpZ2luYWwgbGliU3VyZi5zbyBzaG93cyB0aGF0IHRoZSBoZXNzaWFuIGRldGVjdG9yIGlzIG5vdCBhIDEwMCUgbWF0Y2ggdG8gdGhlaXIgaW1wbGVtZW50YXRpb247CisgKiAzLkR1ZSB0byBhYm92ZSByZWFzb25zLCBJIHJlY29tbWFuZGVkIHRoZSBvcmlnaW5hbCBvbmUgZm9yIHN0dWR5IGFuZCByZXVzZTsKKyAqCisgKiBIb3dldmVyLCB0aGUgc3BlZWQgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBzb21ldGhpbmcgY29tcGFyYWJsZSB0byBvcmlnaW5hbCBvbmUuCisgKgorICogQ29weXJpZ2h0wqkgMjAwOCwgTGl1IExpdSBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogY29uZGl0aW9ucyBhcmUgbWV0OgorICogCVJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUKKyAqIAljb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogCWRpc2NsYWltZXIuCisgKiAJUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogCWNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAJZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzCisgKiAJcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogCVRoZSBuYW1lIG9mIENvbnRyaWJ1dG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yCisgKiAJcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CisgKiAJc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAorICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKKyAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLAorICogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUgorICogVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCisgKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkKKyAqIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qIAorICAgVGhlIGZvbGxvd2luZyBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLCBjb21wYXJpbmcgdG8gdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbjoKKyAgIDEuIEEgbG90IG9mIHNtYWxsIG9wdGltaXphdGlvbnMsIGxlc3MgbWVtb3J5IGFsbG9jYXRpb25zLCBnb3QgcmlkIG9mIGdsb2JhbCBidWZmZXJzCisgICAyLiBSZXZlcnNlZCBvcmRlciBvZiBjdkdldFF1YWRyYW5nbGVTdWJQaXggYW5kIGN2UmVzaXplIGNhbGxzOyBwcm9iYWJseSBsZXNzIGFjY3VyYXRlLCBidXQgbXVjaCBmYXN0ZXIKKyAgIDMuIFRoZSBkZXNjcmlwdG9yIGNvbXB1dGluZyBwYXJ0ICh3aGljaCBpcyBtb3N0IGV4cGVuc2l2ZSkgaXMgdGhyZWFkZWQgdXNpbmcgT3Blbk1QCisgICAoc3VicGl4ZWwtYWNjdXJhdGUga2V5cG9pbnQgbG9jYWxpemF0aW9uIGFuZCBzY2FsZSBlc3RpbWF0aW9uIGFyZSBzdGlsbCBUQkQpCisqLworCisjaW5jbHVkZSAiX2N2LmgiCisKK0N2U1VSRlBhcmFtcyBjdlNVUkZQYXJhbXMoZG91YmxlIHRocmVzaG9sZCwgaW50IGV4dGVuZGVkKQoreworICAgIEN2U1VSRlBhcmFtcyBwYXJhbXM7CisgICAgcGFyYW1zLmhlc3NpYW5UaHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisgICAgcGFyYW1zLmV4dGVuZGVkID0gZXh0ZW5kZWQ7CisgICAgcGFyYW1zLm5PY3RhdmVzID0gMzsKKyAgICBwYXJhbXMubk9jdGF2ZUxheWVycyA9IDQ7CisgICAgcmV0dXJuIHBhcmFtczsKK30KKworc3RydWN0IEN2U3VyZkhGCit7CisgICAgaW50IHAwLCBwMSwgcDIsIHAzOworICAgIGZsb2F0IHc7Cit9OworCitDVl9JTkxJTkUgZmxvYXQKK2ljdkNhbGNIYWFyUGF0dGVybiggY29uc3QgaW50KiBvcmlnaW4sIGNvbnN0IEN2U3VyZkhGKiBmLCBpbnQgbiApCit7CisgICAgZG91YmxlIGQgPSAwOworICAgIGZvciggaW50IGsgPSAwOyBrIDwgbjsgaysrICkKKyAgICAgICAgZCArPSAob3JpZ2luW2Zba10ucDBdICsgb3JpZ2luW2Zba10ucDNdIC0gb3JpZ2luW2Zba10ucDFdIC0gb3JpZ2luW2Zba10ucDJdKSpmW2tdLnc7CisgICAgcmV0dXJuIChmbG9hdClkOworfQorCitzdGF0aWMgdm9pZAoraWN2UmVzaXplSGFhclBhdHRlcm4oIGNvbnN0IGludCBzcmNbXVs1XSwgQ3ZTdXJmSEYqIGRzdCwgaW50IG4sIGludCBvbGRTaXplLCBpbnQgbmV3U2l6ZSwgaW50IHdpZHRoU3RlcCApCit7CisgICAgZm9yKCBpbnQgayA9IDA7IGsgPCBuOyBrKysgKQorICAgIHsKKyAgICAgICAgaW50IGR4MSA9IHNyY1trXVswXSpuZXdTaXplL29sZFNpemU7CisgICAgICAgIGludCBkeTEgPSBzcmNba11bMV0qbmV3U2l6ZS9vbGRTaXplOworICAgICAgICBpbnQgZHgyID0gc3JjW2tdWzJdKm5ld1NpemUvb2xkU2l6ZTsKKyAgICAgICAgaW50IGR5MiA9IHNyY1trXVszXSpuZXdTaXplL29sZFNpemU7CisgICAgICAgIGRzdFtrXS5wMCA9IGR5MSp3aWR0aFN0ZXAgKyBkeDE7CisgICAgICAgIGRzdFtrXS5wMSA9IGR5Mip3aWR0aFN0ZXAgKyBkeDE7CisgICAgICAgIGRzdFtrXS5wMiA9IGR5MSp3aWR0aFN0ZXAgKyBkeDI7CisgICAgICAgIGRzdFtrXS5wMyA9IGR5Mip3aWR0aFN0ZXAgKyBkeDI7CisgICAgICAgIGRzdFtrXS53ID0gc3JjW2tdWzRdLygoZmxvYXQpKGR4Mi1keDEpKihkeTItZHkxKSk7CisgICAgfQorfQorCitzdGF0aWMgQ3ZTZXEqIGljdkZhc3RIZXNzaWFuRGV0ZWN0b3IoIGNvbnN0IEN2TWF0KiBzdW0sIGNvbnN0IEN2TWF0KiBtYXNrX3N1bSwKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIGNvbnN0IEN2U1VSRlBhcmFtcyogcGFyYW1zICkKK3sKKyAgICBDdlNlcSogcG9pbnRzID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdlNlcSksIHNpemVvZihDdlNVUkZQb2ludCksIHN0b3JhZ2UgKTsKKyAgICAKKyAgICBpbnQgdG90YWxMYXllcnMgPSBwYXJhbXMtPm5PY3RhdmVzKihwYXJhbXMtPm5PY3RhdmVMYXllcnMrMik7CisgICAgQ3ZNYXQqKiBoZXNzaWFucyA9IChDdk1hdCoqKWN2U3RhY2tBbGxvYyh0b3RhbExheWVycypzaXplb2YoaGVzc2lhbnNbMF0pKTsKKyAgICBDdk1hdCoqIHRyYWNlcyA9IChDdk1hdCoqKWN2U3RhY2tBbGxvYyh0b3RhbExheWVycypzaXplb2YodHJhY2VzWzBdKSk7CisgICAgaW50IHNpemUsICpzaXplQ2FjaGUgPSAoaW50KiljdlN0YWNrQWxsb2ModG90YWxMYXllcnMqc2l6ZW9mKHNpemVDYWNoZVswXSkpOworICAgIGludCBzY2FsZSwgKnNjYWxlQ2FjaGUgPSAoaW50KiljdlN0YWNrQWxsb2ModG90YWxMYXllcnMqc2l6ZW9mKHNjYWxlQ2FjaGVbMF0pKTsKKworICAgIGNvbnN0IGludCBOWD0zLCBOWT0zLCBOWFk9NCwgU0laRTA9OTsKKyAgICBpbnQgZHhfc1tOWF1bNV0gPSB7IHswLCAyLCAzLCA3LCAxfSwgezMsIDIsIDYsIDcsIC0yfSwgezYsIDIsIDksIDcsIDF9IH07CisgICAgaW50IGR5X3NbTlldWzVdID0geyB7MiwgMCwgNywgMywgMX0sIHsyLCAzLCA3LCA2LCAtMn0sIHsyLCA2LCA3LCA5LCAxfSB9OworICAgIGludCBkeHlfc1tOWFldWzVdID0geyB7MSwgMSwgNCwgNCwgMX0sIHs1LCAxLCA4LCA0LCAtMX0sIHsxLCA1LCA0LCA4LCAtMX0sIHs1LCA1LCA4LCA4LCAxfSB9OworICAgIGludCBkbVsxXVs1XSA9IHsgezAsIDAsIDksIDksIDF9IH07CisgICAgQ3ZTdXJmSEYgRHhbTlhdLCBEeVtOWV0sIER4eVtOWFldLCBEbTsKKyAgICBkb3VibGUgZHggPSAwLCBkeSA9IDAsIGR4eSA9IDA7CisgICAgaW50IGhlc3NpYW5fcm93cywgaGVzc2lhbl9jb2xzOworICAgIAorICAgIGludCBvY3RhdmUsIHNjOworICAgIGludCBpLCBqLCBrLCB6OworICAgIGludCogeG9mcyA9IChpbnQqKWN2U3RhY2tBbGxvYyhzdW0tPmNvbHMqc2l6ZW9mKHhvZnNbMF0pKTsKKworICAgIC8qIGhlc3NpYW4gZGV0ZWN0b3IgKi8KKyAgICBmb3IoIG9jdGF2ZSA9IGsgPSAwOyBvY3RhdmUgPCBwYXJhbXMtPm5PY3RhdmVzOyBvY3RhdmUrKyApCisgICAgeworICAgICAgICBmb3IoIHNjID0gLTE7IHNjIDw9IHBhcmFtcy0+bk9jdGF2ZUxheWVyczsgc2MrKywgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBzYyA8IDAgKQorICAgICAgICAgICAgICAgIHNpemVDYWNoZVtrXSA9IHNpemUgPSA3IDw8IG9jdGF2ZTsgLy8gZ2F1c3NpYW4gc2NhbGUgMS4wOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNpemVDYWNoZVtrXSA9IHNpemUgPSAoc2MqNiArIDkpIDw8IG9jdGF2ZTsgLy8gZ2F1c3NpYW4gc2NhbGUgc2l6ZSoxLjIvOS47CisgICAgICAgICAgICBzY2FsZUNhY2hlW2tdID0gc2NhbGUgPSBNQVgoc2l6ZSwgU0laRTApOworCisgICAgICAgICAgICBoZXNzaWFuX3Jvd3MgPSAoc3VtLT5yb3dzKSpTSVpFMC9zY2FsZTsKKyAgICAgICAgICAgIGhlc3NpYW5fY29scyA9IChzdW0tPmNvbHMpKlNJWkUwL3NjYWxlOworICAgICAgICAgICAgaGVzc2lhbnNba10gPSBjdkNyZWF0ZU1hdCggaGVzc2lhbl9yb3dzLCBoZXNzaWFuX2NvbHMsIENWXzMyRkMxICk7CisgICAgICAgICAgICB0cmFjZXNba10gPSBjdkNyZWF0ZU1hdCggaGVzc2lhbl9yb3dzLCBoZXNzaWFuX2NvbHMsIENWXzMyRkMxICk7CisKKyAgICAgICAgICAgIGljdlJlc2l6ZUhhYXJQYXR0ZXJuKCBkeF9zLCBEeCwgTlgsIFNJWkUwLCBzaXplLCBzdW0tPmNvbHMgKTsKKyAgICAgICAgICAgIGljdlJlc2l6ZUhhYXJQYXR0ZXJuKCBkeV9zLCBEeSwgTlksIFNJWkUwLCBzaXplLCBzdW0tPmNvbHMgKTsKKyAgICAgICAgICAgIGljdlJlc2l6ZUhhYXJQYXR0ZXJuKCBkeHlfcywgRHh5LCBOWFksIFNJWkUwLCBzaXplLCBzdW0tPmNvbHMgKTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBOWFk7IGkrKyApCisgICAgICAgICAgICAgICAgRHh5W2ldLncgKj0gMC45ZjsKKworICAgICAgICAgICAgZmxvYXQqIGhlc3NpYW4gPSBoZXNzaWFuc1trXS0+ZGF0YS5mbDsKKyAgICAgICAgICAgIGZsb2F0KiB0cmFjZSA9IHRyYWNlc1trXS0+ZGF0YS5mbDsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhlc3NpYW5fY29scyooU0laRTAvMik7IGkrKyApCisgICAgICAgICAgICAgICAgaGVzc2lhbltpXSA9IGhlc3NpYW5baGVzc2lhbl9jb2xzKmhlc3NpYW5fcm93cy0xLWldID0KKyAgICAgICAgICAgICAgICB0cmFjZVtpXSA9IHRyYWNlW2hlc3NpYW5fY29scypoZXNzaWFuX3Jvd3MtMS1pXSA9IDAuZjsKKworICAgICAgICAgICAgaGVzc2lhbiArPSAoU0laRTAvMikqKGhlc3NpYW5fY29scyArIDEpOworICAgICAgICAgICAgdHJhY2UgKz0gKFNJWkUwLzIpKihoZXNzaWFuX2NvbHMgKyAxKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBoZXNzaWFuX2NvbHMgLSBTSVpFMDsgaisrICkKKyAgICAgICAgICAgICAgICB4b2ZzW2pdID0gaipzY2FsZS9TSVpFMDsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhlc3NpYW5fcm93cyAtIFNJWkUwOyBpKyssCisgICAgICAgICAgICAgICAgdHJhY2UgKz0gaGVzc2lhbl9jb2xzLCBoZXNzaWFuICs9IGhlc3NpYW5fY29scyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzdW1fcHRyID0gc3VtLT5kYXRhLmkgKyBzdW0tPmNvbHMqKGkqc2NhbGUvU0laRTApOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBTSVpFMC8yOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBoZXNzaWFuWy1qLTFdID0gaGVzc2lhbltoZXNzaWFuX2NvbHMgLSBTSVpFMCArIGpdID0KKyAgICAgICAgICAgICAgICAgICAgdHJhY2VbLWotMV0gPSB0cmFjZVtoZXNzaWFuX2NvbHMgLSBTSVpFMCArIGpdID0gMC5mOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gaGVzc2lhbl9jb2xzIC0gU0laRTA7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHMgPSBzdW1fcHRyICsgeG9mc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgZHggPSAoc1tEeFswXS5wMF0gKyBzW0R4WzBdLnAzXSAtIHNbRHhbMF0ucDFdIC0gc1tEeFswXS5wMl0pKkR4WzBdLncgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNbRHhbMV0ucDBdICsgc1tEeFsxXS5wM10gLSBzW0R4WzFdLnAxXSAtIHNbRHhbMV0ucDJdKSpEeFsxXS53ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChzW0R4WzJdLnAwXSArIHNbRHhbMl0ucDNdIC0gc1tEeFsyXS5wMV0gLSBzW0R4WzJdLnAyXSkqRHhbMl0udzsKKyAgICAgICAgICAgICAgICAgICAgZHkgPSAoc1tEeVswXS5wMF0gKyBzW0R5WzBdLnAzXSAtIHNbRHlbMF0ucDFdIC0gc1tEeVswXS5wMl0pKkR5WzBdLncgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNbRHlbMV0ucDBdICsgc1tEeVsxXS5wM10gLSBzW0R5WzFdLnAxXSAtIHNbRHlbMV0ucDJdKSpEeVsxXS53ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChzW0R5WzJdLnAwXSArIHNbRHlbMl0ucDNdIC0gc1tEeVsyXS5wMV0gLSBzW0R5WzJdLnAyXSkqRHlbMl0udzsKKyAgICAgICAgICAgICAgICAgICAgZHh5ID0gKHNbRHh5WzBdLnAwXSArIHNbRHh5WzBdLnAzXSAtIHNbRHh5WzBdLnAxXSAtIHNbRHh5WzBdLnAyXSkqRHh5WzBdLncgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNbRHh5WzFdLnAwXSArIHNbRHh5WzFdLnAzXSAtIHNbRHh5WzFdLnAxXSAtIHNbRHh5WzFdLnAyXSkqRHh5WzFdLncgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNbRHh5WzJdLnAwXSArIHNbRHh5WzJdLnAzXSAtIHNbRHh5WzJdLnAxXSAtIHNbRHh5WzJdLnAyXSkqRHh5WzJdLncgKworICAgICAgICAgICAgICAgICAgICAgICAgKHNbRHh5WzNdLnAwXSArIHNbRHh5WzNdLnAzXSAtIHNbRHh5WzNdLnAxXSAtIHNbRHh5WzNdLnAyXSkqRHh5WzNdLnc7CisgICAgICAgICAgICAgICAgICAgIGhlc3NpYW5bal0gPSAoZmxvYXQpKGR4KmR5IC0gZHh5KmR4eSk7CisgICAgICAgICAgICAgICAgICAgIHRyYWNlW2pdID0gKGZsb2F0KShkeCArIGR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoIG9jdGF2ZSA9IDAsIGsgPSAxOyBvY3RhdmUgPCBwYXJhbXMtPm5PY3RhdmVzOyBvY3RhdmUrKywgays9MiApCisgICAgeworICAgICAgICBmb3IoIHNjID0gMDsgc2MgPCBwYXJhbXMtPm5PY3RhdmVMYXllcnM7IHNjKyssIGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUgPSBzaXplQ2FjaGVba107CisgICAgICAgICAgICBzY2FsZSA9IHNjYWxlQ2FjaGVba107CisgICAgICAgICAgICBoZXNzaWFuX3Jvd3MgPSBoZXNzaWFuc1trXS0+cm93czsKKyAgICAgICAgICAgIGhlc3NpYW5fY29scyA9IGhlc3NpYW5zW2tdLT5jb2xzOworICAgICAgICAgICAgaWN2UmVzaXplSGFhclBhdHRlcm4oIGRtLCAmRG0sIDEsIFNJWkUwLCBzaXplLCBtYXNrX3N1bSA/IG1hc2tfc3VtLT5jb2xzIDogc3VtLT5jb2xzICk7CisgICAgICAgICAgICBpbnQgbWFyZ2luID0gNSpzY2FsZUNhY2hlW2srMV0vc2NhbGU7CisgICAgICAgICAgICBmb3IoIGkgPSBtYXJnaW47IGkgPCBoZXNzaWFuX3Jvd3MtbWFyZ2luOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBoZXNzaWFuID0gaGVzc2lhbnNba10tPmRhdGEuZmwgKyBpKmhlc3NpYW5fY29sczsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdHJhY2UgPSB0cmFjZXNba10tPmRhdGEuZmwgKyBpKmhlc3NpYW5fY29sczsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBtYXJnaW47IGogPCBoZXNzaWFuX2NvbHMtbWFyZ2luOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsMCA9IGhlc3NpYW5bal07CisgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwwID4gcGFyYW1zLT5oZXNzaWFuVGhyZXNob2xkICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXBwcmVzc2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbWFza19zdW0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogbWFza19wdHIgPSBtYXNrX3N1bS0+ZGF0YS5pICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zdW0tPmNvbHMqKChpLVNJWkUwLzIpKnNjYWxlL1NJWkUwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChqIC0gU0laRTAvMikqc2NhbGUvU0laRTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbXZhbCA9IGljdkNhbGNIYWFyUGF0dGVybiggbWFza19wdHIsICZEbSwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtdmFsIDwgMC41ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vbi1tYXhpbWEgc3VwcHJlc3Npb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeiA9IGstMTsgeiA8IGsrMjsgeisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGNvbHNfeiA9IGhlc3NpYW5zW3pdLT5jb2xzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBoZXNzaWFuID0gaGVzc2lhbnNbel0tPmRhdGEuZmwgKyAoaipzY2FsZStzY2FsZUNhY2hlW3pdLzIpL3NjYWxlQ2FjaGVbel0tMSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSpzY2FsZSArIHNjYWxlQ2FjaGVbel0vMikvc2NhbGVDYWNoZVt6XS0xKSpoY29sc196OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwwIDwgaGVzc2lhblswXSB8fCB2YWwwIDwgaGVzc2lhblsxXSB8fCB2YWwwIDwgaGVzc2lhblsyXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwwIDwgaGVzc2lhbltoY29sc196XSB8fCB2YWwwIDwgaGVzc2lhbltoY29sc196KzFdIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbDAgPCBoZXNzaWFuW2hjb2xzX3orMl0gfHwgdmFsMCA8IGhlc3NpYW5baGNvbHNfeioyXSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWwwIDwgaGVzc2lhbltoY29sc196KjIrMV0gfHwgdmFsMCA8IGhlc3NpYW5baGNvbHNfeioyKzJdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHByZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXN1cHByZXNzZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0cmFjZV92YWwgPSB0cmFjZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNVUkZQb2ludCBwb2ludCA9IGN2U1VSRlBvaW50KCBjdlBvaW50MkQzMmYoaipzY2FsZS85LmYsIGkqc2NhbGUvOS5mKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU0lHTih0cmFjZV92YWwpLCBzaXplQ2FjaGVba10sIDAsIHZhbDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHBvaW50cywgJnBvaW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoIG9jdGF2ZSA9IGsgPSAwOyBvY3RhdmUgPCBwYXJhbXMtPm5PY3RhdmVzOyBvY3RhdmUrKyApCisgICAgICAgIGZvciggc2MgPSAtMTsgc2MgPD0gcGFyYW1zLT5uT2N0YXZlTGF5ZXJzOyBzYysrLCBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZoZXNzaWFuc1trXSApOworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmdHJhY2VzW2tdICk7CisgICAgICAgIH0KKyAgICByZXR1cm4gcG9pbnRzOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZFeHRyYWN0U1VSRiggY29uc3QgQ3ZBcnIqIF9pbWcsIGNvbnN0IEN2QXJyKiBfbWFzaywKKyAgICAgICAgICAgICAgIEN2U2VxKiogX2tleXBvaW50cywgQ3ZTZXEqKiBfZGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIEN2U1VSRlBhcmFtcyBwYXJhbXMgKQoreworICAgIEN2TWF0ICpzdW0gPSAwLCAqbWFzazEgPSAwLCAqbWFza19zdW0gPSAwOworCisgICAgaWYoIF9rZXlwb2ludHMgKQorICAgICAgICAqX2tleXBvaW50cyA9IDA7CisgICAgaWYoIF9kZXNjcmlwdG9ycyApCisgICAgICAgICpfZGVzY3JpcHRvcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkV4dHJhY3RTVVJGIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXEgKmtleXBvaW50cywgKmRlc2NyaXB0b3JzID0gMDsKKyAgICBDdk1hdCBpbWdoZHIsICppbWcgPSBjdkdldE1hdChfaW1nLCAmaW1naGRyKTsKKyAgICBDdk1hdCBtYXNraGRyLCAqbWFzayA9IF9tYXNrID8gY3ZHZXRNYXQoX21hc2ssICZtYXNraGRyKSA6IDA7CisgICAgCisgICAgaW50IGRlc2NyaXB0b3Jfc2l6ZSA9IHBhcmFtcy5leHRlbmRlZCA/IDEyOCA6IDY0OworICAgIGNvbnN0IGludCBkZXNjcmlwdG9yX2RhdGFfdHlwZSA9IENWXzMyRjsKKyAgICBjb25zdCBpbnQgTlg9MiwgTlk9MjsKKyAgICBjb25zdCBmbG9hdCBzcXJ0XzIgPSAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTdmOworICAgIGNvbnN0IGludCBQQVRDSF9TWiA9IDIwOworICAgIGNvbnN0IGludCBSU19QQVRDSF9TWiA9IDMwOyAvLyBjZWlsKChQQVRDSF9TWisxKSpzcXJ0XzIpOworICAgIGludCBkeF9zW05YXVs1XSA9IHt7MCwgMCwgMiwgNCwgLTF9LCB7MiwgMCwgNCwgNCwgMX19OworICAgIGludCBkeV9zW05ZXVs1XSA9IHt7MCwgMCwgNCwgMiwgMX0sIHswLCAyLCA0LCA0LCAtMX19OworICAgIGZsb2F0IEdbOV0gPSB7MCwwLDAsMCwwLDAsMCwwLDB9OworICAgIEN2TWF0IF9HID0gY3ZNYXQoMSwgOSwgQ1ZfMzJGLCBHKTsKKyAgICBmbG9hdCBEV1tQQVRDSF9TWl1bUEFUQ0hfU1pdOworICAgIEN2TWF0IF9EVyA9IGN2TWF0KFBBVENIX1NaLCBQQVRDSF9TWiwgQ1ZfMzJGLCBEVyk7CisgICAgQ3ZQb2ludCBhcHRbODFdOworICAgIGludCBpLCBqLCBrLCBuYW5nbGUwID0gMCwgTjsKKworICAgIENWX0FTU0VSVCggaW1nICE9IDAgJiYgQ1ZfTUFUX1RZUEUoaW1nLT50eXBlKSA9PSBDVl84VUMxICYmCisgICAgICAgIChtYXNrID09IDAgfHwgKENWX0FSRV9TSVpFU19FUShpbWcsbWFzaykgJiYKKyAgICAgICAgQ1ZfTUFUX1RZUEUobWFzay0+dHlwZSkgPT0gQ1ZfOFVDMSkpICYmCisgICAgICAgIHN0b3JhZ2UgIT0gMCAmJiBwYXJhbXMuaGVzc2lhblRocmVzaG9sZCA+PSAwICYmCisgICAgICAgIHBhcmFtcy5uT2N0YXZlcyA+IDAgJiYgcGFyYW1zLm5PY3RhdmVMYXllcnMgPiAwICk7CisKKyAgICBzdW0gPSBjdkNyZWF0ZU1hdCggaW1nLT5oZWlnaHQrMSwgaW1nLT53aWR0aCsxLCBDVl8zMlNDMSApOworICAgIGN2SW50ZWdyYWwoIGltZywgc3VtICk7CisgICAgaWYoIG1hc2sgKQorICAgIHsKKyAgICAgICAgbWFzazEgPSBjdkNyZWF0ZU1hdCggaW1nLT5oZWlnaHQsIGltZy0+d2lkdGgsIENWXzhVQzEgKTsKKyAgICAgICAgbWFza19zdW0gPSBjdkNyZWF0ZU1hdCggaW1nLT5oZWlnaHQrMSwgaW1nLT53aWR0aCsxLCBDVl8zMlNDMSApOworICAgICAgICBjdk1pblMoIG1hc2ssIDEsIG1hc2sxICk7CisgICAgICAgIGN2SW50ZWdyYWwoIG1hc2sxLCBtYXNrX3N1bSApOworICAgIH0KKyAgICBrZXlwb2ludHMgPSBpY3ZGYXN0SGVzc2lhbkRldGVjdG9yKCBzdW0sIG1hc2tfc3VtLCBzdG9yYWdlLCAmcGFyYW1zICk7CisgICAgTiA9IGtleXBvaW50cy0+dG90YWw7CisgICAgaWYoIF9kZXNjcmlwdG9ycyApCisgICAgeworICAgICAgICBkZXNjcmlwdG9ycyA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLAorICAgICAgICAgICAgZGVzY3JpcHRvcl9zaXplKkNWX0VMRU1fU0laRShkZXNjcmlwdG9yX2RhdGFfdHlwZSksIHN0b3JhZ2UgKTsKKyAgICAgICAgY3ZTZXFQdXNoTXVsdGkoIGRlc2NyaXB0b3JzLCAwLCBOICk7CisgICAgfQorCisgICAgQ3ZTZXBGaWx0ZXI6OmluaXRfZ2F1c3NpYW5fa2VybmVsKCAmX0csIDIuNSApOworCisgICAgeworICAgIGNvbnN0IGRvdWJsZSBzaWdtYSA9IDMuMzsKKyAgICBkb3VibGUgYzIgPSAxLi8oc2lnbWEqc2lnbWEqMiksIGdzID0gMDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgUEFUQ0hfU1o7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgUEFUQ0hfU1o7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gaiAtIFBBVENIX1NaKjAuNSwgeSA9IGkgLSBQQVRDSF9TWiowLjU7CisgICAgICAgICAgICBkb3VibGUgdmFsID0gZXhwKC0oeCp4K3kqeSkqYzIpOworICAgICAgICAgICAgRFdbaV1bal0gPSAoZmxvYXQpdmFsOworICAgICAgICAgICAgZ3MgKz0gdmFsOworICAgICAgICB9CisgICAgfQorICAgIGN2U2NhbGUoICZfRFcsICZfRFcsIDEuL2dzICk7CisgICAgfQorCisgICAgZm9yKCBpID0gLTQ7IGkgPD0gNDsgaSsrICkKKyAgICAgICAgZm9yKCBqID0gLTQ7IGogPD0gNDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGkqaSArIGoqaiA8PSAxNiApCisgICAgICAgICAgICAgICAgYXB0W25hbmdsZTArK10gPSBjdlBvaW50KGosaSk7CisgICAgICAgIH0KKworICAgIHsKKyNpZmRlZiBfT1BFTk1QCisgICAgaW50IG50aHJlYWRzID0gY3ZHZXROdW1UaHJlYWRzKCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHMobnRocmVhZHMpIHNjaGVkdWxlKGR5bmFtaWMpCisjZW5kaWYKKyAgICBmb3IoIGsgPSAwOyBrIDwgTjsgaysrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCogc3VtX3B0ciA9IHN1bS0+ZGF0YS5pOworICAgICAgICBpbnQgc3VtX2NvbHMgPSBzdW0tPmNvbHM7CisgICAgICAgIGludCBpLCBqLCBraywgeCwgeSwgbmFuZ2xlOworICAgICAgICBDdlN1cmZIRiBkeF90W05YXSwgZHlfdFtOWV07CisgICAgICAgIGZsb2F0IFhbODFdLCBZWzgxXSwgYW5nbGVbODFdOworICAgICAgICB1Y2hhciBQQVRDSFtQQVRDSF9TWisxXVtQQVRDSF9TWisxXSwgUlNfUEFUQ0hbUlNfUEFUQ0hfU1pdW1JTX1BBVENIX1NaXTsKKyAgICAgICAgZmxvYXQgRFhbUEFUQ0hfU1pdW1BBVENIX1NaXSwgRFlbUEFUQ0hfU1pdW1BBVENIX1NaXTsKKyAgICAgICAgQ3ZNYXQgX1ggPSBjdk1hdCgxLCA4MSwgQ1ZfMzJGLCBYKTsKKyAgICAgICAgQ3ZNYXQgX1kgPSBjdk1hdCgxLCA4MSwgQ1ZfMzJGLCBZKTsKKyAgICAgICAgQ3ZNYXQgX2FuZ2xlID0gY3ZNYXQoMSwgODEsIENWXzMyRiwgYW5nbGUpOworICAgICAgICBDdk1hdCBfcGF0Y2ggPSBjdk1hdChQQVRDSF9TWisxLCBQQVRDSF9TWisxLCBDVl84VSwgUEFUQ0gpOworICAgICAgICBDdk1hdCBfcnNfcGF0Y2ggPSBjdk1hdChSU19QQVRDSF9TWiwgUlNfUEFUQ0hfU1osIENWXzhVLCBSU19QQVRDSCk7CisgICAgICAgIEN2TWF0IF9zcmMsICpzcmMgPSBpbWc7CisgICAgICAgIAorICAgICAgICBDdlNVUkZQb2ludCoga3AgPSAoQ3ZTVVJGUG9pbnQqKWN2R2V0U2VxRWxlbSgga2V5cG9pbnRzLCBrICk7CisgICAgICAgIEN2UG9pbnQyRDMyZiBjZW50ZXIgPSBrcC0+cHQ7CisgICAgICAgIGludCBzaXplID0ga3AtPnNpemU7CisgICAgICAgIGljdlJlc2l6ZUhhYXJQYXR0ZXJuKCBkeF9zLCBkeF90LCBOWCwgOSwgc2l6ZSwgc3VtLT5jb2xzICk7CisgICAgICAgIGljdlJlc2l6ZUhhYXJQYXR0ZXJuKCBkeV9zLCBkeV90LCBOWSwgOSwgc2l6ZSwgc3VtLT5jb2xzICk7CisgICAgICAgIEN2UG9pbnQgcHQgPSBjdlBvaW50RnJvbTMyZihjZW50ZXIpOworICAgICAgICBmbG9hdCogdmVjOworICAgICAgICBmbG9hdCBhbHBoYTAsIGJldGEwLCBzejAsIHNjYWxlMDsKKworICAgICAgICBmb3IoIGtrID0gMCwgbmFuZ2xlID0gMDsga2sgPCBuYW5nbGUwOyBraysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaiA9IGFwdFtra10ueDsgaSA9IGFwdFtra10ueTsKKyAgICAgICAgICAgIGludCB4ID0gcHQueCArIChqLTIpKnNpemUvOTsKKyAgICAgICAgICAgIGludCB5ID0gcHQueSArIChpLTIpKnNpemUvOTsKKyAgICAgICAgICAgIGNvbnN0IGludCogcHRyOworICAgICAgICAgICAgZmxvYXQgdngsIHZ5LCB3OworICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl5ID49ICh1bnNpZ25lZClzdW0tPnJvd3MgLSBzaXplIHx8CisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKXggPj0gKHVuc2lnbmVkKXN1bS0+Y29scyAtIHNpemUgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcHRyID0gc3VtX3B0ciArIHggKyB5KnN1bV9jb2xzOworICAgICAgICAgICAgdyA9IEdbaSs0XSpHW2orNF07CisgICAgICAgICAgICB2eCA9IGljdkNhbGNIYWFyUGF0dGVybiggcHRyLCBkeF90LCBOWCApKnc7CisgICAgICAgICAgICB2eSA9IGljdkNhbGNIYWFyUGF0dGVybiggcHRyLCBkeV90LCBOWCApKnc7CisgICAgICAgICAgICBYW25hbmdsZV0gPSB2eDsgWVtuYW5nbGVdID0gdnk7CisgICAgICAgICAgICBuYW5nbGUrKzsKKyAgICAgICAgfQorICAgICAgICBfWC5jb2xzID0gX1kuY29scyA9IF9hbmdsZS5jb2xzID0gbmFuZ2xlOworICAgICAgICBjdkNhcnRUb1BvbGFyKCAmX1gsICZfWSwgMCwgJl9hbmdsZSwgMSApOworCisgICAgICAgIGZsb2F0IGJlc3R4ID0gMCwgYmVzdHkgPSAwLCBkZXNjcmlwdG9yX21vZCA9IDA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCAzNjA7IGkgKz0gNSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHN1bXggPSAwLCBzdW15ID0gMCwgdGVtcF9tb2Q7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmFuZ2xlOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBkID0gYWJzKGN2Um91bmQoYW5nbGVbal0pIC0gaSk7CisgICAgICAgICAgICAgICAgaWYoIGQgPCA2MCB8fCBkID4gMzAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bXggKz0gWFtqXTsKKyAgICAgICAgICAgICAgICAgICAgc3VteSArPSBZW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXBfbW9kID0gc3VteCpzdW14ICsgc3VteSpzdW15OworICAgICAgICAgICAgaWYoIHRlbXBfbW9kID4gZGVzY3JpcHRvcl9tb2QgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbW9kID0gdGVtcF9tb2Q7CisgICAgICAgICAgICAgICAgYmVzdHggPSBzdW14OworICAgICAgICAgICAgICAgIGJlc3R5ID0gc3VteTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZmxvYXQgZGVzY3JpcHRvcl9kaXIgPSBjdkZhc3RBcmN0YW4oIGJlc3R5LCBiZXN0eCApOworICAgICAgICBrcC0+ZGlyID0gZGVzY3JpcHRvcl9kaXI7CisKKyAgICAgICAgaWYoICFfZGVzY3JpcHRvcnMgKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGRlc2NyaXB0b3JfZGlyICo9IChmbG9hdCkoQ1ZfUEkvMTgwKTsKKyAgICAgICAgCisgICAgICAgIGFscGhhMCA9IChmbG9hdCljb3MoZGVzY3JpcHRvcl9kaXIpOworICAgICAgICBiZXRhMCA9IChmbG9hdClzaW4oZGVzY3JpcHRvcl9kaXIpOworICAgICAgICBzejAgPSAoZmxvYXQpKChQQVRDSF9TWisxKSpzaXplKjEuMi85Lik7CisgICAgICAgIHNjYWxlMCA9IHN6MC8oUEFUQ0hfU1orMSk7CisKKyAgICAgICAgaWYoIHN6MCA+IChQQVRDSF9TWisxKSoxLjVmICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgcmQgPSAoZmxvYXQpKHN6MCpzcXJ0XzIqMC41KTsKKyAgICAgICAgICAgIGZsb2F0IGFscGhhMSA9IChhbHBoYTAgLSBiZXRhMCkqc3FydF8yKjAuNWYsIGJldGExID0gKGFscGhhMCArIGJldGEwKSpzcXJ0XzIqMC41ZjsKKyAgICAgICAgICAgIEN2UmVjdCBwYXRjaF9yZWN0MCA9IHsgSU5UX01BWCwgSU5UX01BWCwgSU5UX01JTiwgSU5UX01JTiB9LCBwYXRjaF9yZWN0LCBzcl9wYXRjaF9yZWN0OworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBhLCBiLCByID0gaSA8IDIgPyByZCA6IC1yZDsKKyAgICAgICAgICAgICAgICBpZiggaSAlIDIgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGEgPSBhbHBoYTEsIGIgPSBiZXRhMTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGEgPSAtYmV0YTEsIGIgPSBhbHBoYTE7CisgICAgICAgICAgICAgICAgZmxvYXQgeGYgPSBjZW50ZXIueCArIHIqYTsKKyAgICAgICAgICAgICAgICBmbG9hdCB5ZiA9IGNlbnRlci55IC0gcipiOworICAgICAgICAgICAgICAgIHggPSBjdkZsb29yKHhmKTsgcGF0Y2hfcmVjdDAueCA9IE1JTihwYXRjaF9yZWN0MC54LCB4KTsKKyAgICAgICAgICAgICAgICB5ID0gY3ZGbG9vcih5Zik7IHBhdGNoX3JlY3QwLnkgPSBNSU4ocGF0Y2hfcmVjdDAueSwgeSk7CisgICAgICAgICAgICAgICAgeCA9IGN2Q2VpbCh4ZikrMTsgcGF0Y2hfcmVjdDAud2lkdGggPSBNQVgocGF0Y2hfcmVjdDAud2lkdGgsIHgpOworICAgICAgICAgICAgICAgIHkgPSBjdkNlaWwoeWYpKzE7IHBhdGNoX3JlY3QwLmhlaWdodCA9IE1BWChwYXRjaF9yZWN0MC5oZWlnaHQsIHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwYXRjaF9yZWN0ID0gcGF0Y2hfcmVjdDA7CisgICAgICAgICAgICBwYXRjaF9yZWN0LnggPSBNQVgocGF0Y2hfcmVjdC54LCAwKTsKKyAgICAgICAgICAgIHBhdGNoX3JlY3QueSA9IE1BWChwYXRjaF9yZWN0LnksIDApOworICAgICAgICAgICAgcGF0Y2hfcmVjdC53aWR0aCA9IE1JTihwYXRjaF9yZWN0LndpZHRoLCBpbWctPndpZHRoKSAtIHBhdGNoX3JlY3QueDsKKyAgICAgICAgICAgIHBhdGNoX3JlY3QuaGVpZ2h0ID0gTUlOKHBhdGNoX3JlY3QuaGVpZ2h0LCBpbWctPmhlaWdodCkgLSBwYXRjaF9yZWN0Lnk7CisgICAgICAgICAgICBwYXRjaF9yZWN0MC53aWR0aCAtPSBwYXRjaF9yZWN0MC54OworICAgICAgICAgICAgcGF0Y2hfcmVjdDAuaGVpZ2h0IC09IHBhdGNoX3JlY3QwLnk7CisKKyAgICAgICAgICAgIEN2TWF0IF9zcmMwOworICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNSU4oMS5mLE1JTigoZmxvYXQpUlNfUEFUQ0hfU1ovcGF0Y2hfcmVjdDAud2lkdGgsCisgICAgICAgICAgICAgICAgKGZsb2F0KVJTX1BBVENIX1NaL3BhdGNoX3JlY3QwLmhlaWdodCkpOworICAgICAgICAgICAgY3ZHZXRTdWJBcnIoIGltZywgJl9zcmMwLCBwYXRjaF9yZWN0ICk7CisgICAgICAgICAgICBzcl9wYXRjaF9yZWN0ID0gY3ZSZWN0KDAsMCwgUlNfUEFUQ0hfU1osIFJTX1BBVENIX1NaKTsKKyAgICAgICAgICAgIHNyX3BhdGNoX3JlY3Qud2lkdGggPSBjdlJvdW5kKHBhdGNoX3JlY3Qud2lkdGgqc2NhbGUpOworICAgICAgICAgICAgc3JfcGF0Y2hfcmVjdC5oZWlnaHQgPSBjdlJvdW5kKHBhdGNoX3JlY3QuaGVpZ2h0KnNjYWxlKTsKKyAgICAgICAgICAgIHNyYyA9IGN2R2V0U3ViQXJyKCAmX3JzX3BhdGNoLCAmX3NyYywgc3JfcGF0Y2hfcmVjdCApOworICAgICAgICAgICAgY3ZSZXNpemUoICZfc3JjMCwgJl9zcmMsIENWX0lOVEVSX0FSRUEgKTsKKyAgICAgICAgICAgIGNlbnRlci54ID0gUlNfUEFUQ0hfU1oqMC41ZiAtIChwYXRjaF9yZWN0LnggLSBwYXRjaF9yZWN0MC54KSpzY2FsZTsKKyAgICAgICAgICAgIGNlbnRlci55ID0gUlNfUEFUQ0hfU1oqMC41ZiAtIChwYXRjaF9yZWN0LnkgLSBwYXRjaF9yZWN0MC55KSpzY2FsZTsKKyAgICAgICAgICAgIHNjYWxlMCAqPSBzY2FsZTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeworICAgICAgICBmbG9hdCB3W10gPQorICAgICAgICB7CisgICAgICAgICAgICBhbHBoYTAqc2NhbGUwLCBiZXRhMCpzY2FsZTAsIGNlbnRlci54LAorICAgICAgICAgICAgLWJldGEwKnNjYWxlMCwgYWxwaGEwKnNjYWxlMCwgY2VudGVyLnkKKyAgICAgICAgfTsKKyAgICAgICAgQ3ZNYXQgVyA9IGN2TWF0KDIsIDMsIENWXzMyRiwgdyk7CisgICAgICAgIGN2R2V0UXVhZHJhbmdsZVN1YlBpeCggc3JjLCAmX3BhdGNoLCAmVyApOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IFBBVENIX1NaOyBpKysgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IFBBVENIX1NaOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IGR3ID0gRFdbaV1bal07CisgICAgICAgICAgICAgICAgZmxvYXQgdnggPSAoUEFUQ0hbaV1baisxXSAtIFBBVENIW2ldW2pdICsgUEFUQ0hbaSsxXVtqKzFdIC0gUEFUQ0hbaSsxXVtqXSkqZHc7CisgICAgICAgICAgICAgICAgZmxvYXQgdnkgPSAoUEFUQ0hbaSsxXVtqXSAtIFBBVENIW2ldW2pdICsgUEFUQ0hbaSsxXVtqKzFdIC0gUEFUQ0hbaV1baisxXSkqZHc7CisgICAgICAgICAgICAgICAgRFhbaV1bal0gPSB2eDsKKyAgICAgICAgICAgICAgICBEWVtpXVtqXSA9IHZ5OworICAgICAgICAgICAgfQorCisgICAgICAgIHZlYyA9IChmbG9hdCopY3ZHZXRTZXFFbGVtKCBkZXNjcmlwdG9ycywgayApOworICAgICAgICBmb3IoIGtrID0gMDsga2sgPCAoaW50KShkZXNjcmlwdG9ycy0+ZWxlbV9zaXplL3NpemVvZih2ZWNbMF0pKTsga2srKyApCisgICAgICAgICAgICB2ZWNba2tdID0gMDsKKyAgICAgICAgaWYoIHBhcmFtcy5leHRlbmRlZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIDEyOC1iaW4gZGVzY3JpcHRvciAqLworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSBpKjU7IHkgPCBpKjUrNTsgeSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gaio1OyB4IDwgaio1KzU7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdHggPSBEWFt5XVt4XSwgdHkgPSBEWVt5XVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggdHkgPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbMF0gKz0gdHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1sxXSArPSAoZmxvYXQpZmFicyh0eCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjWzJdICs9IHR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbM10gKz0gKGZsb2F0KWZhYnModHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHR4ID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjWzRdICs9IHR5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbNV0gKz0gKGZsb2F0KWZhYnModHkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY1s2XSArPSB0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjWzddICs9IChmbG9hdClmYWJzKHR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLyogdW5pdCB2ZWN0b3IgaXMgZXNzZW50aWFsIGZvciBjb250cmFzdCBpbnZhcmlhbmNlICovCisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtYWxpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IoIGtrID0gMDsga2sgPCA4OyBraysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZSArPSB2ZWNba2tdKnZlY1tra107CisgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9IDEuLyhzcXJ0KG5vcm1hbGl6ZSkgKyBEQkxfRVBTSUxPTik7CisgICAgICAgICAgICAgICAgICAgIGZvcigga2sgPSAwOyBrayA8IDg7IGtrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgdmVjW2trXSA9IChmbG9hdCkodmVjW2trXSpub3JtYWxpemUpOworICAgICAgICAgICAgICAgICAgICB2ZWMgKz0gODsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiA2NC1iaW4gZGVzY3JpcHRvciAqLworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSBpKjU7IHkgPCBpKjUrNTsgeSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gaio1OyB4IDwgaio1KzU7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdHggPSBEWFt5XVt4XSwgdHkgPSBEWVt5XVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbMF0gKz0gdHg7IHZlY1sxXSArPSB0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbMl0gKz0gKGZsb2F0KWZhYnModHgpOyB2ZWNbM10gKz0gKGZsb2F0KWZhYnModHkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtYWxpemUgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IoIGtrID0gMDsga2sgPCA0OyBraysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZSArPSB2ZWNba2tdKnZlY1tra107CisgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZSA9IDEuLyhzcXJ0KG5vcm1hbGl6ZSkgKyBEQkxfRVBTSUxPTik7CisgICAgICAgICAgICAgICAgICAgIGZvcigga2sgPSAwOyBrayA8IDQ7IGtrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgdmVjW2trXSA9IChmbG9hdCkodmVjW2trXSpub3JtYWxpemUpOworICAgICAgICAgICAgICAgICAgICB2ZWMrPTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIH0KKworICAgIGlmKCBfa2V5cG9pbnRzICkKKyAgICAgICAgKl9rZXlwb2ludHMgPSBrZXlwb2ludHM7CisgICAgaWYoIF9kZXNjcmlwdG9ycyApCisgICAgICAgICpfZGVzY3JpcHRvcnMgPSBkZXNjcmlwdG9yczsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZzdW0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZtYXNrMSApOworICAgIGN2UmVsZWFzZU1hdCggJm1hc2tfc3VtICk7Cit9CmRpZmYgLS1naXQgYS9jdi9zcmMvY3Zzd2l0Y2hlci5jcHAgYi9jdi9zcmMvY3Zzd2l0Y2hlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJjYzRmZgotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnN3aXRjaGVyLmNwcApAQCAtMCwwICsxLDU5IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCisjdW5kZWYgSVBDVkFQSV9FWAorI2RlZmluZSBJUENWQVBJX0VYKHR5cGUsZnVuY19uYW1lLG5hbWVzLG1vZHVsZXMsYXJnKSBcCisgICAgeyAodm9pZCoqKSZmdW5jX25hbWUjI19wLCAodm9pZCopKHNpemVfdCktMSwgbmFtZXMsIG1vZHVsZXMsIDAgfSwKKworc3RhdGljIEN2UGx1Z2luRnVuY0luZm8gY3ZfaXBwX3RhYltdID0KK3sKKyN1bmRlZiBfQ1ZfSVBQX0hfCisjaW5jbHVkZSAiX2N2aXBwLmgiCisjdW5kZWYgX0NWX0lQUF9IXworICAgIHswLCAwLCAwLCAwLCAwfQorfTsKKworc3RhdGljIEN2TW9kdWxlSW5mbyBjdl9pbmZvID0geyAwLCAiY3YiLCBDVl9WRVJTSU9OLCBjdl9pcHBfdGFiIH07CitDdk1vZHVsZSBjdl9tb2R1bGUoICZjdl9pbmZvICk7CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL2N2dGFibGVzLmNwcCBiL2N2L3NyYy9jdnRhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlN2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL2N2L3NyYy9jdnRhYmxlcy5jcHAKQEAgLTAsMCArMSwyMTQgQEAKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEN2TWF0IGhlbHBlciB0YWJsZXMKKy8vCisvLyAqLworCisjaW5jbHVkZSAiX2N2LmgiCisKK2NvbnN0IGZsb2F0IGljdjh4MzJmVGFiX2N2W10gPQoreworICAgIC0yNTYuZiwgLTI1NS5mLCAtMjU0LmYsIC0yNTMuZiwgLTI1Mi5mLCAtMjUxLmYsIC0yNTAuZiwgLTI0OS5mLAorICAgIC0yNDguZiwgLTI0Ny5mLCAtMjQ2LmYsIC0yNDUuZiwgLTI0NC5mLCAtMjQzLmYsIC0yNDIuZiwgLTI0MS5mLAorICAgIC0yNDAuZiwgLTIzOS5mLCAtMjM4LmYsIC0yMzcuZiwgLTIzNi5mLCAtMjM1LmYsIC0yMzQuZiwgLTIzMy5mLAorICAgIC0yMzIuZiwgLTIzMS5mLCAtMjMwLmYsIC0yMjkuZiwgLTIyOC5mLCAtMjI3LmYsIC0yMjYuZiwgLTIyNS5mLAorICAgIC0yMjQuZiwgLTIyMy5mLCAtMjIyLmYsIC0yMjEuZiwgLTIyMC5mLCAtMjE5LmYsIC0yMTguZiwgLTIxNy5mLAorICAgIC0yMTYuZiwgLTIxNS5mLCAtMjE0LmYsIC0yMTMuZiwgLTIxMi5mLCAtMjExLmYsIC0yMTAuZiwgLTIwOS5mLAorICAgIC0yMDguZiwgLTIwNy5mLCAtMjA2LmYsIC0yMDUuZiwgLTIwNC5mLCAtMjAzLmYsIC0yMDIuZiwgLTIwMS5mLAorICAgIC0yMDAuZiwgLTE5OS5mLCAtMTk4LmYsIC0xOTcuZiwgLTE5Ni5mLCAtMTk1LmYsIC0xOTQuZiwgLTE5My5mLAorICAgIC0xOTIuZiwgLTE5MS5mLCAtMTkwLmYsIC0xODkuZiwgLTE4OC5mLCAtMTg3LmYsIC0xODYuZiwgLTE4NS5mLAorICAgIC0xODQuZiwgLTE4My5mLCAtMTgyLmYsIC0xODEuZiwgLTE4MC5mLCAtMTc5LmYsIC0xNzguZiwgLTE3Ny5mLAorICAgIC0xNzYuZiwgLTE3NS5mLCAtMTc0LmYsIC0xNzMuZiwgLTE3Mi5mLCAtMTcxLmYsIC0xNzAuZiwgLTE2OS5mLAorICAgIC0xNjguZiwgLTE2Ny5mLCAtMTY2LmYsIC0xNjUuZiwgLTE2NC5mLCAtMTYzLmYsIC0xNjIuZiwgLTE2MS5mLAorICAgIC0xNjAuZiwgLTE1OS5mLCAtMTU4LmYsIC0xNTcuZiwgLTE1Ni5mLCAtMTU1LmYsIC0xNTQuZiwgLTE1My5mLAorICAgIC0xNTIuZiwgLTE1MS5mLCAtMTUwLmYsIC0xNDkuZiwgLTE0OC5mLCAtMTQ3LmYsIC0xNDYuZiwgLTE0NS5mLAorICAgIC0xNDQuZiwgLTE0My5mLCAtMTQyLmYsIC0xNDEuZiwgLTE0MC5mLCAtMTM5LmYsIC0xMzguZiwgLTEzNy5mLAorICAgIC0xMzYuZiwgLTEzNS5mLCAtMTM0LmYsIC0xMzMuZiwgLTEzMi5mLCAtMTMxLmYsIC0xMzAuZiwgLTEyOS5mLAorICAgIC0xMjguZiwgLTEyNy5mLCAtMTI2LmYsIC0xMjUuZiwgLTEyNC5mLCAtMTIzLmYsIC0xMjIuZiwgLTEyMS5mLAorICAgIC0xMjAuZiwgLTExOS5mLCAtMTE4LmYsIC0xMTcuZiwgLTExNi5mLCAtMTE1LmYsIC0xMTQuZiwgLTExMy5mLAorICAgIC0xMTIuZiwgLTExMS5mLCAtMTEwLmYsIC0xMDkuZiwgLTEwOC5mLCAtMTA3LmYsIC0xMDYuZiwgLTEwNS5mLAorICAgIC0xMDQuZiwgLTEwMy5mLCAtMTAyLmYsIC0xMDEuZiwgLTEwMC5mLCAgLTk5LmYsICAtOTguZiwgIC05Ny5mLAorICAgICAtOTYuZiwgIC05NS5mLCAgLTk0LmYsICAtOTMuZiwgIC05Mi5mLCAgLTkxLmYsICAtOTAuZiwgIC04OS5mLAorICAgICAtODguZiwgIC04Ny5mLCAgLTg2LmYsICAtODUuZiwgIC04NC5mLCAgLTgzLmYsICAtODIuZiwgIC04MS5mLAorICAgICAtODAuZiwgIC03OS5mLCAgLTc4LmYsICAtNzcuZiwgIC03Ni5mLCAgLTc1LmYsICAtNzQuZiwgIC03My5mLAorICAgICAtNzIuZiwgIC03MS5mLCAgLTcwLmYsICAtNjkuZiwgIC02OC5mLCAgLTY3LmYsICAtNjYuZiwgIC02NS5mLAorICAgICAtNjQuZiwgIC02My5mLCAgLTYyLmYsICAtNjEuZiwgIC02MC5mLCAgLTU5LmYsICAtNTguZiwgIC01Ny5mLAorICAgICAtNTYuZiwgIC01NS5mLCAgLTU0LmYsICAtNTMuZiwgIC01Mi5mLCAgLTUxLmYsICAtNTAuZiwgIC00OS5mLAorICAgICAtNDguZiwgIC00Ny5mLCAgLTQ2LmYsICAtNDUuZiwgIC00NC5mLCAgLTQzLmYsICAtNDIuZiwgIC00MS5mLAorICAgICAtNDAuZiwgIC0zOS5mLCAgLTM4LmYsICAtMzcuZiwgIC0zNi5mLCAgLTM1LmYsICAtMzQuZiwgIC0zMy5mLAorICAgICAtMzIuZiwgIC0zMS5mLCAgLTMwLmYsICAtMjkuZiwgIC0yOC5mLCAgLTI3LmYsICAtMjYuZiwgIC0yNS5mLAorICAgICAtMjQuZiwgIC0yMy5mLCAgLTIyLmYsICAtMjEuZiwgIC0yMC5mLCAgLTE5LmYsICAtMTguZiwgIC0xNy5mLAorICAgICAtMTYuZiwgIC0xNS5mLCAgLTE0LmYsICAtMTMuZiwgIC0xMi5mLCAgLTExLmYsICAtMTAuZiwgICAtOS5mLAorICAgICAgLTguZiwgICAtNy5mLCAgIC02LmYsICAgLTUuZiwgICAtNC5mLCAgIC0zLmYsICAgLTIuZiwgICAtMS5mLAorICAgICAgIDAuZiwgICAgMS5mLCAgICAyLmYsICAgIDMuZiwgICAgNC5mLCAgICA1LmYsICAgIDYuZiwgICAgNy5mLAorICAgICAgIDguZiwgICAgOS5mLCAgIDEwLmYsICAgMTEuZiwgICAxMi5mLCAgIDEzLmYsICAgMTQuZiwgICAxNS5mLAorICAgICAgMTYuZiwgICAxNy5mLCAgIDE4LmYsICAgMTkuZiwgICAyMC5mLCAgIDIxLmYsICAgMjIuZiwgICAyMy5mLAorICAgICAgMjQuZiwgICAyNS5mLCAgIDI2LmYsICAgMjcuZiwgICAyOC5mLCAgIDI5LmYsICAgMzAuZiwgICAzMS5mLAorICAgICAgMzIuZiwgICAzMy5mLCAgIDM0LmYsICAgMzUuZiwgICAzNi5mLCAgIDM3LmYsICAgMzguZiwgICAzOS5mLAorICAgICAgNDAuZiwgICA0MS5mLCAgIDQyLmYsICAgNDMuZiwgICA0NC5mLCAgIDQ1LmYsICAgNDYuZiwgICA0Ny5mLAorICAgICAgNDguZiwgICA0OS5mLCAgIDUwLmYsICAgNTEuZiwgICA1Mi5mLCAgIDUzLmYsICAgNTQuZiwgICA1NS5mLAorICAgICAgNTYuZiwgICA1Ny5mLCAgIDU4LmYsICAgNTkuZiwgICA2MC5mLCAgIDYxLmYsICAgNjIuZiwgICA2My5mLAorICAgICAgNjQuZiwgICA2NS5mLCAgIDY2LmYsICAgNjcuZiwgICA2OC5mLCAgIDY5LmYsICAgNzAuZiwgICA3MS5mLAorICAgICAgNzIuZiwgICA3My5mLCAgIDc0LmYsICAgNzUuZiwgICA3Ni5mLCAgIDc3LmYsICAgNzguZiwgICA3OS5mLAorICAgICAgODAuZiwgICA4MS5mLCAgIDgyLmYsICAgODMuZiwgICA4NC5mLCAgIDg1LmYsICAgODYuZiwgICA4Ny5mLAorICAgICAgODguZiwgICA4OS5mLCAgIDkwLmYsICAgOTEuZiwgICA5Mi5mLCAgIDkzLmYsICAgOTQuZiwgICA5NS5mLAorICAgICAgOTYuZiwgICA5Ny5mLCAgIDk4LmYsICAgOTkuZiwgIDEwMC5mLCAgMTAxLmYsICAxMDIuZiwgIDEwMy5mLAorICAgICAxMDQuZiwgIDEwNS5mLCAgMTA2LmYsICAxMDcuZiwgIDEwOC5mLCAgMTA5LmYsICAxMTAuZiwgIDExMS5mLAorICAgICAxMTIuZiwgIDExMy5mLCAgMTE0LmYsICAxMTUuZiwgIDExNi5mLCAgMTE3LmYsICAxMTguZiwgIDExOS5mLAorICAgICAxMjAuZiwgIDEyMS5mLCAgMTIyLmYsICAxMjMuZiwgIDEyNC5mLCAgMTI1LmYsICAxMjYuZiwgIDEyNy5mLAorICAgICAxMjguZiwgIDEyOS5mLCAgMTMwLmYsICAxMzEuZiwgIDEzMi5mLCAgMTMzLmYsICAxMzQuZiwgIDEzNS5mLAorICAgICAxMzYuZiwgIDEzNy5mLCAgMTM4LmYsICAxMzkuZiwgIDE0MC5mLCAgMTQxLmYsICAxNDIuZiwgIDE0My5mLAorICAgICAxNDQuZiwgIDE0NS5mLCAgMTQ2LmYsICAxNDcuZiwgIDE0OC5mLCAgMTQ5LmYsICAxNTAuZiwgIDE1MS5mLAorICAgICAxNTIuZiwgIDE1My5mLCAgMTU0LmYsICAxNTUuZiwgIDE1Ni5mLCAgMTU3LmYsICAxNTguZiwgIDE1OS5mLAorICAgICAxNjAuZiwgIDE2MS5mLCAgMTYyLmYsICAxNjMuZiwgIDE2NC5mLCAgMTY1LmYsICAxNjYuZiwgIDE2Ny5mLAorICAgICAxNjguZiwgIDE2OS5mLCAgMTcwLmYsICAxNzEuZiwgIDE3Mi5mLCAgMTczLmYsICAxNzQuZiwgIDE3NS5mLAorICAgICAxNzYuZiwgIDE3Ny5mLCAgMTc4LmYsICAxNzkuZiwgIDE4MC5mLCAgMTgxLmYsICAxODIuZiwgIDE4My5mLAorICAgICAxODQuZiwgIDE4NS5mLCAgMTg2LmYsICAxODcuZiwgIDE4OC5mLCAgMTg5LmYsICAxOTAuZiwgIDE5MS5mLAorICAgICAxOTIuZiwgIDE5My5mLCAgMTk0LmYsICAxOTUuZiwgIDE5Ni5mLCAgMTk3LmYsICAxOTguZiwgIDE5OS5mLAorICAgICAyMDAuZiwgIDIwMS5mLCAgMjAyLmYsICAyMDMuZiwgIDIwNC5mLCAgMjA1LmYsICAyMDYuZiwgIDIwNy5mLAorICAgICAyMDguZiwgIDIwOS5mLCAgMjEwLmYsICAyMTEuZiwgIDIxMi5mLCAgMjEzLmYsICAyMTQuZiwgIDIxNS5mLAorICAgICAyMTYuZiwgIDIxNy5mLCAgMjE4LmYsICAyMTkuZiwgIDIyMC5mLCAgMjIxLmYsICAyMjIuZiwgIDIyMy5mLAorICAgICAyMjQuZiwgIDIyNS5mLCAgMjI2LmYsICAyMjcuZiwgIDIyOC5mLCAgMjI5LmYsICAyMzAuZiwgIDIzMS5mLAorICAgICAyMzIuZiwgIDIzMy5mLCAgMjM0LmYsICAyMzUuZiwgIDIzNi5mLCAgMjM3LmYsICAyMzguZiwgIDIzOS5mLAorICAgICAyNDAuZiwgIDI0MS5mLCAgMjQyLmYsICAyNDMuZiwgIDI0NC5mLCAgMjQ1LmYsICAyNDYuZiwgIDI0Ny5mLAorICAgICAyNDguZiwgIDI0OS5mLCAgMjUwLmYsICAyNTEuZiwgIDI1Mi5mLCAgMjUzLmYsICAyNTQuZiwgIDI1NS5mLAorICAgICAyNTYuZiwgIDI1Ny5mLCAgMjU4LmYsICAyNTkuZiwgIDI2MC5mLCAgMjYxLmYsICAyNjIuZiwgIDI2My5mLAorICAgICAyNjQuZiwgIDI2NS5mLCAgMjY2LmYsICAyNjcuZiwgIDI2OC5mLCAgMjY5LmYsICAyNzAuZiwgIDI3MS5mLAorICAgICAyNzIuZiwgIDI3My5mLCAgMjc0LmYsICAyNzUuZiwgIDI3Ni5mLCAgMjc3LmYsICAyNzguZiwgIDI3OS5mLAorICAgICAyODAuZiwgIDI4MS5mLCAgMjgyLmYsICAyODMuZiwgIDI4NC5mLCAgMjg1LmYsICAyODYuZiwgIDI4Ny5mLAorICAgICAyODguZiwgIDI4OS5mLCAgMjkwLmYsICAyOTEuZiwgIDI5Mi5mLCAgMjkzLmYsICAyOTQuZiwgIDI5NS5mLAorICAgICAyOTYuZiwgIDI5Ny5mLCAgMjk4LmYsICAyOTkuZiwgIDMwMC5mLCAgMzAxLmYsICAzMDIuZiwgIDMwMy5mLAorICAgICAzMDQuZiwgIDMwNS5mLCAgMzA2LmYsICAzMDcuZiwgIDMwOC5mLCAgMzA5LmYsICAzMTAuZiwgIDMxMS5mLAorICAgICAzMTIuZiwgIDMxMy5mLCAgMzE0LmYsICAzMTUuZiwgIDMxNi5mLCAgMzE3LmYsICAzMTguZiwgIDMxOS5mLAorICAgICAzMjAuZiwgIDMyMS5mLCAgMzIyLmYsICAzMjMuZiwgIDMyNC5mLCAgMzI1LmYsICAzMjYuZiwgIDMyNy5mLAorICAgICAzMjguZiwgIDMyOS5mLCAgMzMwLmYsICAzMzEuZiwgIDMzMi5mLCAgMzMzLmYsICAzMzQuZiwgIDMzNS5mLAorICAgICAzMzYuZiwgIDMzNy5mLCAgMzM4LmYsICAzMzkuZiwgIDM0MC5mLCAgMzQxLmYsICAzNDIuZiwgIDM0My5mLAorICAgICAzNDQuZiwgIDM0NS5mLCAgMzQ2LmYsICAzNDcuZiwgIDM0OC5mLCAgMzQ5LmYsICAzNTAuZiwgIDM1MS5mLAorICAgICAzNTIuZiwgIDM1My5mLCAgMzU0LmYsICAzNTUuZiwgIDM1Ni5mLCAgMzU3LmYsICAzNTguZiwgIDM1OS5mLAorICAgICAzNjAuZiwgIDM2MS5mLCAgMzYyLmYsICAzNjMuZiwgIDM2NC5mLCAgMzY1LmYsICAzNjYuZiwgIDM2Ny5mLAorICAgICAzNjguZiwgIDM2OS5mLCAgMzcwLmYsICAzNzEuZiwgIDM3Mi5mLCAgMzczLmYsICAzNzQuZiwgIDM3NS5mLAorICAgICAzNzYuZiwgIDM3Ny5mLCAgMzc4LmYsICAzNzkuZiwgIDM4MC5mLCAgMzgxLmYsICAzODIuZiwgIDM4My5mLAorICAgICAzODQuZiwgIDM4NS5mLCAgMzg2LmYsICAzODcuZiwgIDM4OC5mLCAgMzg5LmYsICAzOTAuZiwgIDM5MS5mLAorICAgICAzOTIuZiwgIDM5My5mLCAgMzk0LmYsICAzOTUuZiwgIDM5Ni5mLCAgMzk3LmYsICAzOTguZiwgIDM5OS5mLAorICAgICA0MDAuZiwgIDQwMS5mLCAgNDAyLmYsICA0MDMuZiwgIDQwNC5mLCAgNDA1LmYsICA0MDYuZiwgIDQwNy5mLAorICAgICA0MDguZiwgIDQwOS5mLCAgNDEwLmYsICA0MTEuZiwgIDQxMi5mLCAgNDEzLmYsICA0MTQuZiwgIDQxNS5mLAorICAgICA0MTYuZiwgIDQxNy5mLCAgNDE4LmYsICA0MTkuZiwgIDQyMC5mLCAgNDIxLmYsICA0MjIuZiwgIDQyMy5mLAorICAgICA0MjQuZiwgIDQyNS5mLCAgNDI2LmYsICA0MjcuZiwgIDQyOC5mLCAgNDI5LmYsICA0MzAuZiwgIDQzMS5mLAorICAgICA0MzIuZiwgIDQzMy5mLCAgNDM0LmYsICA0MzUuZiwgIDQzNi5mLCAgNDM3LmYsICA0MzguZiwgIDQzOS5mLAorICAgICA0NDAuZiwgIDQ0MS5mLCAgNDQyLmYsICA0NDMuZiwgIDQ0NC5mLCAgNDQ1LmYsICA0NDYuZiwgIDQ0Ny5mLAorICAgICA0NDguZiwgIDQ0OS5mLCAgNDUwLmYsICA0NTEuZiwgIDQ1Mi5mLCAgNDUzLmYsICA0NTQuZiwgIDQ1NS5mLAorICAgICA0NTYuZiwgIDQ1Ny5mLCAgNDU4LmYsICA0NTkuZiwgIDQ2MC5mLCAgNDYxLmYsICA0NjIuZiwgIDQ2My5mLAorICAgICA0NjQuZiwgIDQ2NS5mLCAgNDY2LmYsICA0NjcuZiwgIDQ2OC5mLCAgNDY5LmYsICA0NzAuZiwgIDQ3MS5mLAorICAgICA0NzIuZiwgIDQ3My5mLCAgNDc0LmYsICA0NzUuZiwgIDQ3Ni5mLCAgNDc3LmYsICA0NzguZiwgIDQ3OS5mLAorICAgICA0ODAuZiwgIDQ4MS5mLCAgNDgyLmYsICA0ODMuZiwgIDQ4NC5mLCAgNDg1LmYsICA0ODYuZiwgIDQ4Ny5mLAorICAgICA0ODguZiwgIDQ4OS5mLCAgNDkwLmYsICA0OTEuZiwgIDQ5Mi5mLCAgNDkzLmYsICA0OTQuZiwgIDQ5NS5mLAorICAgICA0OTYuZiwgIDQ5Ny5mLCAgNDk4LmYsICA0OTkuZiwgIDUwMC5mLCAgNTAxLmYsICA1MDIuZiwgIDUwMy5mLAorICAgICA1MDQuZiwgIDUwNS5mLCAgNTA2LmYsICA1MDcuZiwgIDUwOC5mLCAgNTA5LmYsICA1MTAuZiwgIDUxMS5mLAorfTsKKworY29uc3QgZmxvYXQgaWN2OHgzMmZTcXJUYWJbXSA9Cit7CisgMTYzODQuZiwgIDE2MTI5LmYsICAxNTg3Ni5mLCAgMTU2MjUuZiwgIDE1Mzc2LmYsICAxNTEyOS5mLCAgMTQ4ODQuZiwgIDE0NjQxLmYsCisgMTQ0MDAuZiwgIDE0MTYxLmYsICAxMzkyNC5mLCAgMTM2ODkuZiwgIDEzNDU2LmYsICAxMzIyNS5mLCAgMTI5OTYuZiwgIDEyNzY5LmYsCisgMTI1NDQuZiwgIDEyMzIxLmYsICAxMjEwMC5mLCAgMTE4ODEuZiwgIDExNjY0LmYsICAxMTQ0OS5mLCAgMTEyMzYuZiwgIDExMDI1LmYsCisgMTA4MTYuZiwgIDEwNjA5LmYsICAxMDQwNC5mLCAgMTAyMDEuZiwgIDEwMDAwLmYsICAgOTgwMS5mLCAgIDk2MDQuZiwgICA5NDA5LmYsCisgIDkyMTYuZiwgICA5MDI1LmYsICAgODgzNi5mLCAgIDg2NDkuZiwgICA4NDY0LmYsICAgODI4MS5mLCAgIDgxMDAuZiwgICA3OTIxLmYsCisgIDc3NDQuZiwgICA3NTY5LmYsICAgNzM5Ni5mLCAgIDcyMjUuZiwgICA3MDU2LmYsICAgNjg4OS5mLCAgIDY3MjQuZiwgICA2NTYxLmYsCisgIDY0MDAuZiwgICA2MjQxLmYsICAgNjA4NC5mLCAgIDU5MjkuZiwgICA1Nzc2LmYsICAgNTYyNS5mLCAgIDU0NzYuZiwgICA1MzI5LmYsCisgIDUxODQuZiwgICA1MDQxLmYsICAgNDkwMC5mLCAgIDQ3NjEuZiwgICA0NjI0LmYsICAgNDQ4OS5mLCAgIDQzNTYuZiwgICA0MjI1LmYsCisgIDQwOTYuZiwgICAzOTY5LmYsICAgMzg0NC5mLCAgIDM3MjEuZiwgICAzNjAwLmYsICAgMzQ4MS5mLCAgIDMzNjQuZiwgICAzMjQ5LmYsCisgIDMxMzYuZiwgICAzMDI1LmYsICAgMjkxNi5mLCAgIDI4MDkuZiwgICAyNzA0LmYsICAgMjYwMS5mLCAgIDI1MDAuZiwgICAyNDAxLmYsCisgIDIzMDQuZiwgICAyMjA5LmYsICAgMjExNi5mLCAgIDIwMjUuZiwgICAxOTM2LmYsICAgMTg0OS5mLCAgIDE3NjQuZiwgICAxNjgxLmYsCisgIDE2MDAuZiwgICAxNTIxLmYsICAgMTQ0NC5mLCAgIDEzNjkuZiwgICAxMjk2LmYsICAgMTIyNS5mLCAgIDExNTYuZiwgICAxMDg5LmYsCisgIDEwMjQuZiwgICAgOTYxLmYsICAgIDkwMC5mLCAgICA4NDEuZiwgICAgNzg0LmYsICAgIDcyOS5mLCAgICA2NzYuZiwgICAgNjI1LmYsCisgICA1NzYuZiwgICAgNTI5LmYsICAgIDQ4NC5mLCAgICA0NDEuZiwgICAgNDAwLmYsICAgIDM2MS5mLCAgICAzMjQuZiwgICAgMjg5LmYsCisgICAyNTYuZiwgICAgMjI1LmYsICAgIDE5Ni5mLCAgICAxNjkuZiwgICAgMTQ0LmYsICAgIDEyMS5mLCAgICAxMDAuZiwgICAgIDgxLmYsCisgICAgNjQuZiwgICAgIDQ5LmYsICAgICAzNi5mLCAgICAgMjUuZiwgICAgIDE2LmYsICAgICAgOS5mLCAgICAgIDQuZiwgICAgICAxLmYsCisgICAgIDAuZiwgICAgICAxLmYsICAgICAgNC5mLCAgICAgIDkuZiwgICAgIDE2LmYsICAgICAyNS5mLCAgICAgMzYuZiwgICAgIDQ5LmYsCisgICAgNjQuZiwgICAgIDgxLmYsICAgIDEwMC5mLCAgICAxMjEuZiwgICAgMTQ0LmYsICAgIDE2OS5mLCAgICAxOTYuZiwgICAgMjI1LmYsCisgICAyNTYuZiwgICAgMjg5LmYsICAgIDMyNC5mLCAgICAzNjEuZiwgICAgNDAwLmYsICAgIDQ0MS5mLCAgICA0ODQuZiwgICAgNTI5LmYsCisgICA1NzYuZiwgICAgNjI1LmYsICAgIDY3Ni5mLCAgICA3MjkuZiwgICAgNzg0LmYsICAgIDg0MS5mLCAgICA5MDAuZiwgICAgOTYxLmYsCisgIDEwMjQuZiwgICAxMDg5LmYsICAgMTE1Ni5mLCAgIDEyMjUuZiwgICAxMjk2LmYsICAgMTM2OS5mLCAgIDE0NDQuZiwgICAxNTIxLmYsCisgIDE2MDAuZiwgICAxNjgxLmYsICAgMTc2NC5mLCAgIDE4NDkuZiwgICAxOTM2LmYsICAgMjAyNS5mLCAgIDIxMTYuZiwgICAyMjA5LmYsCisgIDIzMDQuZiwgICAyNDAxLmYsICAgMjUwMC5mLCAgIDI2MDEuZiwgICAyNzA0LmYsICAgMjgwOS5mLCAgIDI5MTYuZiwgICAzMDI1LmYsCisgIDMxMzYuZiwgICAzMjQ5LmYsICAgMzM2NC5mLCAgIDM0ODEuZiwgICAzNjAwLmYsICAgMzcyMS5mLCAgIDM4NDQuZiwgICAzOTY5LmYsCisgIDQwOTYuZiwgICA0MjI1LmYsICAgNDM1Ni5mLCAgIDQ0ODkuZiwgICA0NjI0LmYsICAgNDc2MS5mLCAgIDQ5MDAuZiwgICA1MDQxLmYsCisgIDUxODQuZiwgICA1MzI5LmYsICAgNTQ3Ni5mLCAgIDU2MjUuZiwgICA1Nzc2LmYsICAgNTkyOS5mLCAgIDYwODQuZiwgICA2MjQxLmYsCisgIDY0MDAuZiwgICA2NTYxLmYsICAgNjcyNC5mLCAgIDY4ODkuZiwgICA3MDU2LmYsICAgNzIyNS5mLCAgIDczOTYuZiwgICA3NTY5LmYsCisgIDc3NDQuZiwgICA3OTIxLmYsICAgODEwMC5mLCAgIDgyODEuZiwgICA4NDY0LmYsICAgODY0OS5mLCAgIDg4MzYuZiwgICA5MDI1LmYsCisgIDkyMTYuZiwgICA5NDA5LmYsICAgOTYwNC5mLCAgIDk4MDEuZiwgIDEwMDAwLmYsICAxMDIwMS5mLCAgMTA0MDQuZiwgIDEwNjA5LmYsCisgMTA4MTYuZiwgIDExMDI1LmYsICAxMTIzNi5mLCAgMTE0NDkuZiwgIDExNjY0LmYsICAxMTg4MS5mLCAgMTIxMDAuZiwgIDEyMzIxLmYsCisgMTI1NDQuZiwgIDEyNzY5LmYsICAxMjk5Ni5mLCAgMTMyMjUuZiwgIDEzNDU2LmYsICAxMzY4OS5mLCAgMTM5MjQuZiwgIDE0MTYxLmYsCisgMTQ0MDAuZiwgIDE0NjQxLmYsICAxNDg4NC5mLCAgMTUxMjkuZiwgIDE1Mzc2LmYsICAxNTYyNS5mLCAgMTU4NzYuZiwgIDE2MTI5LmYsCisgMTYzODQuZiwgIDE2NjQxLmYsICAxNjkwMC5mLCAgMTcxNjEuZiwgIDE3NDI0LmYsICAxNzY4OS5mLCAgMTc5NTYuZiwgIDE4MjI1LmYsCisgMTg0OTYuZiwgIDE4NzY5LmYsICAxOTA0NC5mLCAgMTkzMjEuZiwgIDE5NjAwLmYsICAxOTg4MS5mLCAgMjAxNjQuZiwgIDIwNDQ5LmYsCisgMjA3MzYuZiwgIDIxMDI1LmYsICAyMTMxNi5mLCAgMjE2MDkuZiwgIDIxOTA0LmYsICAyMjIwMS5mLCAgMjI1MDAuZiwgIDIyODAxLmYsCisgMjMxMDQuZiwgIDIzNDA5LmYsICAyMzcxNi5mLCAgMjQwMjUuZiwgIDI0MzM2LmYsICAyNDY0OS5mLCAgMjQ5NjQuZiwgIDI1MjgxLmYsCisgMjU2MDAuZiwgIDI1OTIxLmYsICAyNjI0NC5mLCAgMjY1NjkuZiwgIDI2ODk2LmYsICAyNzIyNS5mLCAgMjc1NTYuZiwgIDI3ODg5LmYsCisgMjgyMjQuZiwgIDI4NTYxLmYsICAyODkwMC5mLCAgMjkyNDEuZiwgIDI5NTg0LmYsICAyOTkyOS5mLCAgMzAyNzYuZiwgIDMwNjI1LmYsCisgMzA5NzYuZiwgIDMxMzI5LmYsICAzMTY4NC5mLCAgMzIwNDEuZiwgIDMyNDAwLmYsICAzMjc2MS5mLCAgMzMxMjQuZiwgIDMzNDg5LmYsCisgMzM4NTYuZiwgIDM0MjI1LmYsICAzNDU5Ni5mLCAgMzQ5NjkuZiwgIDM1MzQ0LmYsICAzNTcyMS5mLCAgMzYxMDAuZiwgIDM2NDgxLmYsCisgMzY4NjQuZiwgIDM3MjQ5LmYsICAzNzYzNi5mLCAgMzgwMjUuZiwgIDM4NDE2LmYsICAzODgwOS5mLCAgMzkyMDQuZiwgIDM5NjAxLmYsCisgNDAwMDAuZiwgIDQwNDAxLmYsICA0MDgwNC5mLCAgNDEyMDkuZiwgIDQxNjE2LmYsICA0MjAyNS5mLCAgNDI0MzYuZiwgIDQyODQ5LmYsCisgNDMyNjQuZiwgIDQzNjgxLmYsICA0NDEwMC5mLCAgNDQ1MjEuZiwgIDQ0OTQ0LmYsICA0NTM2OS5mLCAgNDU3OTYuZiwgIDQ2MjI1LmYsCisgNDY2NTYuZiwgIDQ3MDg5LmYsICA0NzUyNC5mLCAgNDc5NjEuZiwgIDQ4NDAwLmYsICA0ODg0MS5mLCAgNDkyODQuZiwgIDQ5NzI5LmYsCisgNTAxNzYuZiwgIDUwNjI1LmYsICA1MTA3Ni5mLCAgNTE1MjkuZiwgIDUxOTg0LmYsICA1MjQ0MS5mLCAgNTI5MDAuZiwgIDUzMzYxLmYsCisgNTM4MjQuZiwgIDU0Mjg5LmYsICA1NDc1Ni5mLCAgNTUyMjUuZiwgIDU1Njk2LmYsICA1NjE2OS5mLCAgNTY2NDQuZiwgIDU3MTIxLmYsCisgNTc2MDAuZiwgIDU4MDgxLmYsICA1ODU2NC5mLCAgNTkwNDkuZiwgIDU5NTM2LmYsICA2MDAyNS5mLCAgNjA1MTYuZiwgIDYxMDA5LmYsCisgNjE1MDQuZiwgIDYyMDAxLmYsICA2MjUwMC5mLCAgNjMwMDEuZiwgIDYzNTA0LmYsICA2NDAwOS5mLCAgNjQ1MTYuZiwgIDY1MDI1LmYKK307CisKK2NvbnN0IHVjaGFyIGljdlNhdHVyYXRlOHVfY3ZbXSA9IAoreworICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMSwgICAyLCAgIDMsICAgNCwgICA1LCAgIDYsICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LCAgMTUsCisgICAgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLCAgMjMsICAyNCwgIDI1LCAgMjYsICAyNywgIDI4LCAgMjksICAzMCwgIDMxLAorICAgICAzMiwgIDMzLCAgMzQsICAzNSwgIDM2LCAgMzcsICAzOCwgIDM5LCAgNDAsICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywKKyAgICAgNDgsICA0OSwgIDUwLCAgNTEsICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LCAgNjAsICA2MSwgIDYyLCAgNjMsCisgICAgIDY0LCAgNjUsICA2NiwgIDY3LCAgNjgsICA2OSwgIDcwLCAgNzEsICA3MiwgIDczLCAgNzQsICA3NSwgIDc2LCAgNzcsICA3OCwgIDc5LAorICAgICA4MCwgIDgxLCAgODIsICA4MywgIDg0LCAgODUsICA4NiwgIDg3LCAgODgsICA4OSwgIDkwLCAgOTEsICA5MiwgIDkzLCAgOTQsICA5NSwKKyAgICAgOTYsICA5NywgIDk4LCAgOTksIDEwMCwgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisgICAgMTEyLCAxMTMsIDExNCwgMTE1LCAxMTYsIDExNywgMTE4LCAxMTksIDEyMCwgMTIxLCAxMjIsIDEyMywgMTI0LCAxMjUsIDEyNiwgMTI3LAorICAgIDEyOCwgMTI5LCAxMzAsIDEzMSwgMTMyLCAxMzMsIDEzNCwgMTM1LCAxMzYsIDEzNywgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDIsIDE0MywKKyAgICAxNDQsIDE0NSwgMTQ2LCAxNDcsIDE0OCwgMTQ5LCAxNTAsIDE1MSwgMTUyLCAxNTMsIDE1NCwgMTU1LCAxNTYsIDE1NywgMTU4LCAxNTksCisgICAgMTYwLCAxNjEsIDE2MiwgMTYzLCAxNjQsIDE2NSwgMTY2LCAxNjcsIDE2OCwgMTY5LCAxNzAsIDE3MSwgMTcyLCAxNzMsIDE3NCwgMTc1LAorICAgIDE3NiwgMTc3LCAxNzgsIDE3OSwgMTgwLCAxODEsIDE4MiwgMTgzLCAxODQsIDE4NSwgMTg2LCAxODcsIDE4OCwgMTg5LCAxOTAsIDE5MSwKKyAgICAxOTIsIDE5MywgMTk0LCAxOTUsIDE5NiwgMTk3LCAxOTgsIDE5OSwgMjAwLCAyMDEsIDIwMiwgMjAzLCAyMDQsIDIwNSwgMjA2LCAyMDcsCisgICAgMjA4LCAyMDksIDIxMCwgMjExLCAyMTIsIDIxMywgMjE0LCAyMTUsIDIxNiwgMjE3LCAyMTgsIDIxOSwgMjIwLCAyMjEsIDIyMiwgMjIzLAorICAgIDIyNCwgMjI1LCAyMjYsIDIyNywgMjI4LCAyMjksIDIzMCwgMjMxLCAyMzIsIDIzMywgMjM0LCAyMzUsIDIzNiwgMjM3LCAyMzgsIDIzOSwKKyAgICAyNDAsIDI0MSwgMjQyLCAyNDMsIDI0NCwgMjQ1LCAyNDYsIDI0NywgMjQ4LCAyNDksIDI1MCwgMjUxLCAyNTIsIDI1MywgMjU0LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NQorfTsKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Z0ZW1wbG1hdGNoLmNwcCBiL2N2L3NyYy9jdnRlbXBsbWF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkNzk1MjgKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Z0ZW1wbG1hdGNoLmNwcApAQCAtMCwwICsxLDUzNiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKwordm9pZAoraWN2Q3Jvc3NDb3JyKCBjb25zdCBDdkFyciogX2ltZywgY29uc3QgQ3ZBcnIqIF90ZW1wbCwgQ3ZBcnIqIF9jb3JyLCBDdlBvaW50IGFuY2hvciApCit7CisgICAgY29uc3QgZG91YmxlIGJsb2NrX3NjYWxlID0gNC41OworICAgIGNvbnN0IGludCBtaW5fYmxvY2tfc2l6ZSA9IDI1NjsKKyAgICBDdk1hdCogZGZ0X2ltZ1tDVl9NQVhfVEhSRUFEU10gPSB7MH07CisgICAgQ3ZNYXQqIGRmdF90ZW1wbCA9IDA7CisgICAgdm9pZCogYnVmW0NWX01BWF9USFJFQURTXSA9IHswfTsKKyAgICBpbnQgaywgbnVtX3RocmVhZHMgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2Q3Jvc3NDb3JyIiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IGlzdHViLCAqaW1nID0gKEN2TWF0KilfaW1nOworICAgIEN2TWF0IHRzdHViLCAqdGVtcGwgPSAoQ3ZNYXQqKV90ZW1wbDsKKyAgICBDdk1hdCBjc3R1YiwgKmNvcnIgPSAoQ3ZNYXQqKV9jb3JyOworICAgIEN2U2l6ZSBkZnRzaXplLCBibG9ja3NpemU7CisgICAgaW50IGRlcHRoLCB0ZW1wbF9kZXB0aCwgY29ycl9kZXB0aCwgbWF4X2RlcHRoID0gQ1ZfMzJGLAorICAgICAgICBjbiwgdGVtcGxfY24sIGNvcnJfY24sIGJ1Zl9zaXplID0gMCwKKyAgICAgICAgdGlsZV9jb3VudF94LCB0aWxlX2NvdW50X3ksIHRpbGVfY291bnQ7CisKKyAgICBDVl9DQUxMKCBpbWcgPSBjdkdldE1hdCggaW1nLCAmaXN0dWIgKSk7CisgICAgQ1ZfQ0FMTCggdGVtcGwgPSBjdkdldE1hdCggdGVtcGwsICZ0c3R1YiApKTsKKyAgICBDVl9DQUxMKCBjb3JyID0gY3ZHZXRNYXQoIGNvcnIsICZjc3R1YiApKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIGltZy0+dHlwZSApICE9IENWXzhVICYmCisgICAgICAgIENWX01BVF9ERVBUSCggaW1nLT50eXBlICkgIT0gQ1ZfMTZVICYmCisgICAgICAgIENWX01BVF9ERVBUSCggaW1nLT50eXBlICkgIT0gQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgOHUsIDE2dSBhbmQgMzJmIGRhdGEgdHlwZXMiICk7CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIGltZywgdGVtcGwgKSAmJiBDVl9NQVRfREVQVEgoIHRlbXBsLT50eXBlICkgIT0gQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGVtcGxhdGUgKGtlcm5lbCkgbXVzdCBiZSBvZiB0aGUgc2FtZSBkZXB0aCBhcyB0aGUgaW5wdXQgaW1hZ2UsIG9yIGJlIDMyZiIgKTsKKyAgICAKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIGltZywgY29yciApICYmIENWX01BVF9ERVBUSCggY29yci0+dHlwZSApICE9IENWXzMyRiAmJgorICAgICAgICBDVl9NQVRfREVQVEgoIGNvcnItPnR5cGUgKSAhPSBDVl82NEYgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJUaGUgb3V0cHV0IGltYWdlIG11c3QgaGF2ZSB0aGUgc2FtZSBkZXB0aCBhcyB0aGUgaW5wdXQgaW1hZ2UsIG9yIGJlIDMyZi82NGYiICk7CisKKyAgICBpZiggKCFDVl9BUkVfQ05TX0VRKCBpbWcsIGNvcnIgKSB8fCBDVl9NQVRfQ04odGVtcGwtPnR5cGUpID4gMSkgJiYKKyAgICAgICAgKENWX01BVF9DTiggY29yci0+dHlwZSApID4gMSB8fCAhQ1ZfQVJFX0NOU19FUSggaW1nLCB0ZW1wbCkpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGhlIG91dHB1dCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzIGFzIHRoZSBpbnB1dCAod2hlbiB0aGUgdGVtcGxhdGUgaGFzIDEgY2hhbm5lbCksICIKKyAgICAgICAgIm9yIHRoZSBvdXRwdXQgbXVzdCBoYXZlIDEgY2hhbm5lbCB3aGVuIHRoZSBpbnB1dCBhbmQgdGhlIHRlbXBsYXRlIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYW5uZWxzIiApOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoaW1nLT50eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTihpbWctPnR5cGUpOworICAgIHRlbXBsX2RlcHRoID0gQ1ZfTUFUX0RFUFRIKHRlbXBsLT50eXBlKTsKKyAgICB0ZW1wbF9jbiA9IENWX01BVF9DTih0ZW1wbC0+dHlwZSk7CisgICAgY29ycl9kZXB0aCA9IENWX01BVF9ERVBUSChjb3JyLT50eXBlKTsKKyAgICBjb3JyX2NuID0gQ1ZfTUFUX0NOKGNvcnItPnR5cGUpOworICAgIG1heF9kZXB0aCA9IE1BWCggbWF4X2RlcHRoLCB0ZW1wbF9kZXB0aCApOworICAgIG1heF9kZXB0aCA9IE1BWCggbWF4X2RlcHRoLCBkZXB0aCApOworICAgIG1heF9kZXB0aCA9IE1BWCggbWF4X2RlcHRoLCBjb3JyX2RlcHRoICk7CisgICAgaWYoIGRlcHRoID4gQ1ZfOFUgKQorICAgICAgICBtYXhfZGVwdGggPSBDVl82NEY7CisKKyAgICBpZiggaW1nLT5jb2xzIDwgdGVtcGwtPmNvbHMgfHwgaW1nLT5yb3dzIDwgdGVtcGwtPnJvd3MgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICJTdWNoIGEgY29tYmluYXRpb24gb2YgaW1hZ2UgYW5kIHRlbXBsYXRlL2ZpbHRlciBzaXplIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggY29yci0+cm93cyA+IGltZy0+cm93cyArIHRlbXBsLT5yb3dzIC0gMSB8fAorICAgICAgICBjb3JyLT5jb2xzID4gaW1nLT5jb2xzICsgdGVtcGwtPmNvbHMgLSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAib3V0cHV0IGltYWdlIHNob3VsZCBub3QgYmUgZ3JlYXRlciB0aGFuIChXICsgdyAtIDEpeChIICsgaCAtIDEpIiApOworCisgICAgYmxvY2tzaXplLndpZHRoID0gY3ZSb3VuZCh0ZW1wbC0+Y29scypibG9ja19zY2FsZSk7CisgICAgYmxvY2tzaXplLndpZHRoID0gTUFYKCBibG9ja3NpemUud2lkdGgsIG1pbl9ibG9ja19zaXplIC0gdGVtcGwtPmNvbHMgKyAxICk7CisgICAgYmxvY2tzaXplLndpZHRoID0gTUlOKCBibG9ja3NpemUud2lkdGgsIGNvcnItPmNvbHMgKTsKKyAgICBibG9ja3NpemUuaGVpZ2h0ID0gY3ZSb3VuZCh0ZW1wbC0+cm93cypibG9ja19zY2FsZSk7CisgICAgYmxvY2tzaXplLmhlaWdodCA9IE1BWCggYmxvY2tzaXplLmhlaWdodCwgbWluX2Jsb2NrX3NpemUgLSB0ZW1wbC0+cm93cyArIDEgKTsKKyAgICBibG9ja3NpemUuaGVpZ2h0ID0gTUlOKCBibG9ja3NpemUuaGVpZ2h0LCBjb3JyLT5yb3dzICk7CisKKyAgICBkZnRzaXplLndpZHRoID0gY3ZHZXRPcHRpbWFsREZUU2l6ZShibG9ja3NpemUud2lkdGggKyB0ZW1wbC0+Y29scyAtIDEpOworICAgIGlmKCBkZnRzaXplLndpZHRoID09IDEgKQorICAgICAgICBkZnRzaXplLndpZHRoID0gMjsKKyAgICBkZnRzaXplLmhlaWdodCA9IGN2R2V0T3B0aW1hbERGVFNpemUoYmxvY2tzaXplLmhlaWdodCArIHRlbXBsLT5yb3dzIC0gMSk7CisgICAgaWYoIGRmdHNpemUud2lkdGggPD0gMCB8fCBkZnRzaXplLmhlaWdodCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJ0aGUgaW5wdXQgYXJyYXlzIGFyZSB0b28gYmlnIiApOworCisgICAgLy8gcmVjb21wdXRlIGJsb2NrIHNpemUKKyAgICBibG9ja3NpemUud2lkdGggPSBkZnRzaXplLndpZHRoIC0gdGVtcGwtPmNvbHMgKyAxOworICAgIGJsb2Nrc2l6ZS53aWR0aCA9IE1JTiggYmxvY2tzaXplLndpZHRoLCBjb3JyLT5jb2xzICk7CisgICAgYmxvY2tzaXplLmhlaWdodCA9IGRmdHNpemUuaGVpZ2h0IC0gdGVtcGwtPnJvd3MgKyAxOworICAgIGJsb2Nrc2l6ZS5oZWlnaHQgPSBNSU4oIGJsb2Nrc2l6ZS5oZWlnaHQsIGNvcnItPnJvd3MgKTsKKworICAgIENWX0NBTEwoIGRmdF90ZW1wbCA9IGN2Q3JlYXRlTWF0KCBkZnRzaXplLmhlaWdodCp0ZW1wbF9jbiwgZGZ0c2l6ZS53aWR0aCwgbWF4X2RlcHRoICkpOworCisgICAgbnVtX3RocmVhZHMgPSBjdkdldE51bVRocmVhZHMoKTsKKworICAgIGZvciggayA9IDA7IGsgPCBudW1fdGhyZWFkczsgaysrICkKKyAgICAgICAgQ1ZfQ0FMTCggZGZ0X2ltZ1trXSA9IGN2Q3JlYXRlTWF0KCBkZnRzaXplLmhlaWdodCwgZGZ0c2l6ZS53aWR0aCwgbWF4X2RlcHRoICkpOworCisgICAgaWYoIHRlbXBsX2NuID4gMSAmJiB0ZW1wbF9kZXB0aCAhPSBtYXhfZGVwdGggKQorICAgICAgICBidWZfc2l6ZSA9IHRlbXBsLT5jb2xzKnRlbXBsLT5yb3dzKkNWX0VMRU1fU0laRSh0ZW1wbF9kZXB0aCk7CisKKyAgICBpZiggY24gPiAxICYmIGRlcHRoICE9IG1heF9kZXB0aCApCisgICAgICAgIGJ1Zl9zaXplID0gTUFYKCBidWZfc2l6ZSwgKGJsb2Nrc2l6ZS53aWR0aCArIHRlbXBsLT5jb2xzIC0gMSkqCisgICAgICAgICAgICAoYmxvY2tzaXplLmhlaWdodCArIHRlbXBsLT5yb3dzIC0gMSkqQ1ZfRUxFTV9TSVpFKGRlcHRoKSk7CisKKyAgICBpZiggKGNvcnJfY24gPiAxIHx8IGNuID4gMSkgJiYgY29ycl9kZXB0aCAhPSBtYXhfZGVwdGggKQorICAgICAgICBidWZfc2l6ZSA9IE1BWCggYnVmX3NpemUsIGJsb2Nrc2l6ZS53aWR0aCpibG9ja3NpemUuaGVpZ2h0KkNWX0VMRU1fU0laRShjb3JyX2RlcHRoKSk7CisKKyAgICBpZiggYnVmX3NpemUgPiAwICkKKyAgICB7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBudW1fdGhyZWFkczsgaysrICkKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZltrXSA9IGN2QWxsb2MoYnVmX3NpemUpICk7CisgICAgfQorCisgICAgLy8gY29tcHV0ZSBERlQgb2YgZWFjaCB0ZW1wbGF0ZSBwbGFuZQorICAgIGZvciggayA9IDA7IGsgPCB0ZW1wbF9jbjsgaysrICkKKyAgICB7CisgICAgICAgIEN2TWF0IGRzdHViLCAqc3JjLCAqZHN0LCB0ZW1wOworICAgICAgICBDdk1hdCogcGxhbmVzW10gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgaW50IHlvZnMgPSBrKmRmdHNpemUuaGVpZ2h0OworCisgICAgICAgIHNyYyA9IHRlbXBsOworICAgICAgICBkc3QgPSBjdkdldFN1YlJlY3QoIGRmdF90ZW1wbCwgJmRzdHViLCBjdlJlY3QoMCx5b2ZzLHRlbXBsLT5jb2xzLHRlbXBsLT5yb3dzKSk7CisgICAgCisgICAgICAgIGlmKCB0ZW1wbF9jbiA+IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBwbGFuZXNba10gPSB0ZW1wbF9kZXB0aCA9PSBtYXhfZGVwdGggPyBkc3QgOgorICAgICAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJnRlbXAsIHRlbXBsLT5yb3dzLCB0ZW1wbC0+Y29scywgdGVtcGxfZGVwdGgsIGJ1ZlswXSApOworICAgICAgICAgICAgY3ZTcGxpdCggdGVtcGwsIHBsYW5lc1swXSwgcGxhbmVzWzFdLCBwbGFuZXNbMl0sIHBsYW5lc1szXSApOworICAgICAgICAgICAgc3JjID0gcGxhbmVzW2tdOworICAgICAgICAgICAgcGxhbmVzW2tdID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkc3QgIT0gc3JjICkKKyAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCBkc3QgKTsKKworICAgICAgICBpZiggZGZ0X3RlbXBsLT5jb2xzID4gdGVtcGwtPmNvbHMgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkdldFN1YlJlY3QoIGRmdF90ZW1wbCwgZHN0LCBjdlJlY3QodGVtcGwtPmNvbHMsIHlvZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRmdF90ZW1wbC0+Y29scyAtIHRlbXBsLT5jb2xzLCB0ZW1wbC0+cm93cykgKTsKKyAgICAgICAgICAgIGN2WmVybyggZHN0ICk7CisgICAgICAgIH0KKyAgICAgICAgY3ZHZXRTdWJSZWN0KCBkZnRfdGVtcGwsIGRzdCwgY3ZSZWN0KDAseW9mcyxkZnRzaXplLndpZHRoLGRmdHNpemUuaGVpZ2h0KSApOworICAgICAgICBjdkRGVCggZHN0LCBkc3QsIENWX0RYVF9GT1JXQVJEICsgQ1ZfRFhUX1NDQUxFLCB0ZW1wbC0+cm93cyApOworICAgIH0KKworICAgIHRpbGVfY291bnRfeCA9IChjb3JyLT5jb2xzICsgYmxvY2tzaXplLndpZHRoIC0gMSkvYmxvY2tzaXplLndpZHRoOworICAgIHRpbGVfY291bnRfeSA9IChjb3JyLT5yb3dzICsgYmxvY2tzaXplLmhlaWdodCAtIDEpL2Jsb2Nrc2l6ZS5oZWlnaHQ7CisgICAgdGlsZV9jb3VudCA9IHRpbGVfY291bnRfeCp0aWxlX2NvdW50X3k7CisKKyAgICB7CisjaWZkZWYgX09QRU5NUAorICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBudW1fdGhyZWFkcyhudW1fdGhyZWFkcykgc2NoZWR1bGUoZHluYW1pYykKKyNlbmRpZgorICAgIC8vIGNhbGN1bGF0ZSBjb3JyZWxhdGlvbiBieSBibG9ja3MKKyAgICBmb3IoIGsgPSAwOyBrIDwgdGlsZV9jb3VudDsgaysrICkKKyAgICB7CisgICAgICAgIGludCB0aHJlYWRfaWR4ID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgaW50IHggPSAoayV0aWxlX2NvdW50X3gpKmJsb2Nrc2l6ZS53aWR0aDsKKyAgICAgICAgaW50IHkgPSAoay90aWxlX2NvdW50X3gpKmJsb2Nrc2l6ZS5oZWlnaHQ7CisgICAgICAgIGludCBpLCB5b2ZzOworICAgICAgICBDdk1hdCBzc3R1YiwgZHN0dWIsICpzcmMsICpkc3QsIHRlbXA7CisgICAgICAgIEN2TWF0KiBwbGFuZXNbXSA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgICBDdk1hdCogX2RmdF9pbWcgPSBkZnRfaW1nW3RocmVhZF9pZHhdOworICAgICAgICB2b2lkKiBfYnVmID0gYnVmW3RocmVhZF9pZHhdOworICAgICAgICBDdlNpemUgY3N6ID0geyBibG9ja3NpemUud2lkdGgsIGJsb2Nrc2l6ZS5oZWlnaHQgfSwgaXN6OworICAgICAgICBpbnQgeDAgPSB4IC0gYW5jaG9yLngsIHkwID0geSAtIGFuY2hvci55OworICAgICAgICBpbnQgeDEgPSBNQVgoIDAsIHgwICksIHkxID0gTUFYKCAwLCB5MCApLCB4MiwgeTI7CisgICAgICAgIGNzei53aWR0aCA9IE1JTiggY3N6LndpZHRoLCBjb3JyLT5jb2xzIC0geCApOworICAgICAgICBjc3ouaGVpZ2h0ID0gTUlOKCBjc3ouaGVpZ2h0LCBjb3JyLT5yb3dzIC0geSApOworICAgICAgICBpc3oud2lkdGggPSBjc3oud2lkdGggKyB0ZW1wbC0+Y29scyAtIDE7CisgICAgICAgIGlzei5oZWlnaHQgPSBjc3ouaGVpZ2h0ICsgdGVtcGwtPnJvd3MgLSAxOworICAgICAgICB4MiA9IE1JTiggaW1nLT5jb2xzLCB4MCArIGlzei53aWR0aCApOworICAgICAgICB5MiA9IE1JTiggaW1nLT5yb3dzLCB5MCArIGlzei5oZWlnaHQgKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgZHN0dWIxLCAqZHN0MTsKKyAgICAgICAgICAgIHlvZnMgPSBpKmRmdHNpemUuaGVpZ2h0OworCisgICAgICAgICAgICBzcmMgPSBjdkdldFN1YlJlY3QoIGltZywgJnNzdHViLCBjdlJlY3QoeDEseTEseDIteDEseTIteTEpICk7CisgICAgICAgICAgICBkc3QgPSBjdkdldFN1YlJlY3QoIF9kZnRfaW1nLCAmZHN0dWIsCisgICAgICAgICAgICAgICAgY3ZSZWN0KDAsMCxpc3oud2lkdGgsaXN6LmhlaWdodCkgKTsKKyAgICAgICAgICAgIGRzdDEgPSBkc3Q7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCB4MiAtIHgxIDwgaXN6LndpZHRoIHx8IHkyIC0geTEgPCBpc3ouaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICBkc3QxID0gY3ZHZXRTdWJSZWN0KCBfZGZ0X2ltZywgJmRzdHViMSwKKyAgICAgICAgICAgICAgICAgICAgY3ZSZWN0KCB4MSAtIHgwLCB5MSAtIHkwLCB4MiAtIHgxLCB5MiAtIHkxICkpOworCisgICAgICAgICAgICBpZiggY24gPiAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbGFuZXNbaV0gPSBkc3QxOworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCAhPSBtYXhfZGVwdGggKQorICAgICAgICAgICAgICAgICAgICBwbGFuZXNbaV0gPSBjdkluaXRNYXRIZWFkZXIoICZ0ZW1wLCB5MiAtIHkxLCB4MiAtIHgxLCBkZXB0aCwgX2J1ZiApOworICAgICAgICAgICAgICAgIGN2U3BsaXQoIHNyYywgcGxhbmVzWzBdLCBwbGFuZXNbMV0sIHBsYW5lc1syXSwgcGxhbmVzWzNdICk7CisgICAgICAgICAgICAgICAgc3JjID0gcGxhbmVzW2ldOworICAgICAgICAgICAgICAgIHBsYW5lc1tpXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkc3QxICE9IHNyYyApCisgICAgICAgICAgICAgICAgY3ZDb252ZXJ0KCBzcmMsIGRzdDEgKTsKKworICAgICAgICAgICAgaWYoIGRzdCAhPSBkc3QxICkKKyAgICAgICAgICAgICAgICBjdkNvcHlNYWtlQm9yZGVyKCBkc3QxLCBkc3QsIGN2UG9pbnQoeDEgLSB4MCwgeTEgLSB5MCksIElQTF9CT1JERVJfUkVQTElDQVRFICk7CisKKyAgICAgICAgICAgIGlmKCBkZnRzaXplLndpZHRoID4gaXN6LndpZHRoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoIF9kZnRfaW1nLCBkc3QsIGN2UmVjdChpc3oud2lkdGgsIDAsCisgICAgICAgICAgICAgICAgICAgICAgZGZ0c2l6ZS53aWR0aCAtIGlzei53aWR0aCxkZnRzaXplLmhlaWdodCkgKTsKKyAgICAgICAgICAgICAgICBjdlplcm8oIGRzdCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkRGVCggX2RmdF9pbWcsIF9kZnRfaW1nLCBDVl9EWFRfRk9SV0FSRCwgaXN6LmhlaWdodCApOworICAgICAgICAgICAgY3ZHZXRTdWJSZWN0KCBkZnRfdGVtcGwsIGRzdCwKKyAgICAgICAgICAgICAgICBjdlJlY3QoMCwodGVtcGxfY24+MT95b2ZzOjApLGRmdHNpemUud2lkdGgsZGZ0c2l6ZS5oZWlnaHQpICk7CisKKyAgICAgICAgICAgIGN2TXVsU3BlY3RydW1zKCBfZGZ0X2ltZywgZHN0LCBfZGZ0X2ltZywgQ1ZfRFhUX01VTF9DT05KICk7CisgICAgICAgICAgICBjdkRGVCggX2RmdF9pbWcsIF9kZnRfaW1nLCBDVl9EWFRfSU5WRVJTRSwgY3N6LmhlaWdodCApOworCisgICAgICAgICAgICBzcmMgPSBjdkdldFN1YlJlY3QoIF9kZnRfaW1nLCAmc3N0dWIsIGN2UmVjdCgwLDAsY3N6LndpZHRoLGNzei5oZWlnaHQpICk7CisgICAgICAgICAgICBkc3QgPSBjdkdldFN1YlJlY3QoIGNvcnIsICZkc3R1YiwgY3ZSZWN0KHgseSxjc3oud2lkdGgsY3N6LmhlaWdodCkgKTsKKworICAgICAgICAgICAgaWYoIGNvcnJfY24gPiAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwbGFuZXNbaV0gPSBzcmM7CisgICAgICAgICAgICAgICAgaWYoIGNvcnJfZGVwdGggIT0gbWF4X2RlcHRoICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBsYW5lc1tpXSA9IGN2SW5pdE1hdEhlYWRlciggJnRlbXAsIGNzei5oZWlnaHQsIGNzei53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyX2RlcHRoLCBfYnVmICk7CisgICAgICAgICAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCBwbGFuZXNbaV0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3ZNZXJnZSggcGxhbmVzWzBdLCBwbGFuZXNbMV0sIHBsYW5lc1syXSwgcGxhbmVzWzNdLCBkc3QgKTsKKyAgICAgICAgICAgICAgICBwbGFuZXNbaV0gPSAwOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGN2Q29udmVydCggc3JjLCBkc3QgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbWF4X2RlcHRoID4gY29ycl9kZXB0aCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJnRlbXAsIGNzei5oZWlnaHQsIGNzei53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycl9kZXB0aCwgX2J1ZiApOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZDb252ZXJ0KCBzcmMsICZ0ZW1wICk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMgPSAmdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjdkFjYyggc3JjLCBkc3QgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmRmdF90ZW1wbCApOworCisgICAgZm9yKCBrID0gMDsgayA8IG51bV90aHJlYWRzOyBrKysgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmZGZ0X2ltZ1trXSApOworICAgICAgICBjdkZyZWUoICZidWZba10gKTsKKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElQUCBNYXRjaCBUZW1wbGF0ZSBGdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtXzh1MzJmX0MxUl90ICBpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtXzh1MzJmX0MxUl9wID0gMDsKK2ljdkNyb3NzQ29yclZhbGlkX05vcm1MZXZlbF84dTMyZl9DMVJfdCAgaWN2Q3Jvc3NDb3JyVmFsaWRfTm9ybUxldmVsXzh1MzJmX0MxUl9wID0gMDsKK2ljdlNxckRpc3RhbmNlVmFsaWRfTm9ybV84dTMyZl9DMVJfdCAgaWN2U3FyRGlzdGFuY2VWYWxpZF9Ob3JtXzh1MzJmX0MxUl9wID0gMDsKK2ljdkNyb3NzQ29yclZhbGlkX05vcm1fMzJmX0MxUl90ICBpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtXzMyZl9DMVJfcCA9IDA7CitpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtTGV2ZWxfMzJmX0MxUl90ICBpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtTGV2ZWxfMzJmX0MxUl9wID0gMDsKK2ljdlNxckRpc3RhbmNlVmFsaWRfTm9ybV8zMmZfQzFSX3QgIGljdlNxckRpc3RhbmNlVmFsaWRfTm9ybV8zMmZfQzFSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZUZW1wbE1hdGNoSVBQRnVuYykKKyAgICAoIGNvbnN0IHZvaWQqIGltZywgaW50IGltZ3N0ZXAsIEN2U2l6ZSBpbWdzaXplLAorICAgICAgY29uc3Qgdm9pZCogdGVtcGwsIGludCB0ZW1wbHN0ZXAsIEN2U2l6ZSB0ZW1wbHNpemUsCisgICAgICB2b2lkKiByZXN1bHQsIGludCByc3RlcCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWX0lNUEwgdm9pZAorY3ZNYXRjaFRlbXBsYXRlKCBjb25zdCBDdkFyciogX2ltZywgY29uc3QgQ3ZBcnIqIF90ZW1wbCwgQ3ZBcnIqIF9yZXN1bHQsIGludCBtZXRob2QgKQoreworICAgIEN2TWF0KiBzdW0gPSAwOworICAgIEN2TWF0KiBzcXN1bSA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1hdGNoVGVtcGxhdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwOworICAgIGludCBkZXB0aCwgY247CisgICAgaW50IGksIGosIGs7CisgICAgQ3ZNYXQgc3R1YiwgKmltZyA9IChDdk1hdCopX2ltZzsKKyAgICBDdk1hdCB0c3R1YiwgKnRlbXBsID0gKEN2TWF0KilfdGVtcGw7CisgICAgQ3ZNYXQgcnN0dWIsICpyZXN1bHQgPSAoQ3ZNYXQqKV9yZXN1bHQ7CisgICAgQ3ZTY2FsYXIgdGVtcGxfbWVhbiA9IGN2U2NhbGFyQWxsKDApOworICAgIGRvdWJsZSB0ZW1wbF9ub3JtID0gMCwgdGVtcGxfc3VtMiA9IDA7CisgICAgCisgICAgaW50IGlkeCA9IDAsIGlkeDIgPSAwOworICAgIGRvdWJsZSAqcDAsICpwMSwgKnAyLCAqcDM7CisgICAgZG91YmxlICpxMCwgKnExLCAqcTIsICpxMzsKKyAgICBkb3VibGUgaW52X2FyZWE7CisgICAgaW50IHN1bV9zdGVwLCBzcXN1bV9zdGVwOworICAgIGludCBudW1fdHlwZSA9IG1ldGhvZCA9PSBDVl9UTV9DQ09SUiB8fCBtZXRob2QgPT0gQ1ZfVE1fQ0NPUlJfTk9STUVEID8gMCA6CisgICAgICAgICAgICAgICAgICAgbWV0aG9kID09IENWX1RNX0NDT0VGRiB8fCBtZXRob2QgPT0gQ1ZfVE1fQ0NPRUZGX05PUk1FRCA/IDEgOiAyOworICAgIGludCBpc19ub3JtZWQgPSBtZXRob2QgPT0gQ1ZfVE1fQ0NPUlJfTk9STUVEIHx8CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9PSBDVl9UTV9TUURJRkZfTk9STUVEIHx8CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9PSBDVl9UTV9DQ09FRkZfTk9STUVEOworCisgICAgQ1ZfQ0FMTCggaW1nID0gY3ZHZXRNYXQoIGltZywgJnN0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIHRlbXBsID0gY3ZHZXRNYXQoIHRlbXBsLCAmdHN0dWIsICZjb2kyICkpOworICAgIENWX0NBTEwoIHJlc3VsdCA9IGN2R2V0TWF0KCByZXN1bHQsICZyc3R1YiApKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgoIGltZy0+dHlwZSApICE9IENWXzhVICYmCisgICAgICAgIENWX01BVF9ERVBUSCggaW1nLT50eXBlICkgIT0gQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGhlIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHkgOHUgYW5kIDMyZiBkYXRhIHR5cGVzIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIGltZywgdGVtcGwgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiaW1hZ2UgYW5kIHRlbXBsYXRlIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGUiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIHJlc3VsdC0+dHlwZSApICE9IENWXzMyRkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAib3V0cHV0IGltYWdlIHNob3VsZCBoYXZlIDMyZiB0eXBlIiApOworCisgICAgaWYoIGltZy0+cm93cyA8IHRlbXBsLT5yb3dzIHx8IGltZy0+Y29scyA8IHRlbXBsLT5jb2xzICkKKyAgICB7CisgICAgICAgIEN2TWF0KiB0OworICAgICAgICBDVl9TV0FQKCBpbWcsIHRlbXBsLCB0ICk7CisgICAgfQorCisgICAgaWYoIHJlc3VsdC0+cm93cyAhPSBpbWctPnJvd3MgLSB0ZW1wbC0+cm93cyArIDEgfHwKKyAgICAgICAgcmVzdWx0LT5jb2xzICE9IGltZy0+Y29scyAtIHRlbXBsLT5jb2xzICsgMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIm91dHB1dCBpbWFnZSBzaG91bGQgYmUgKFcgLSB3ICsgMSl4KEggLSBoICsgMSkiICk7CisKKyAgICBpZiggbWV0aG9kIDwgQ1ZfVE1fU1FESUZGIHx8IG1ldGhvZCA+IENWX1RNX0NDT0VGRl9OT1JNRUQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAidW5rbm93biBjb21wYXJpc29uIG1ldGhvZCIgKTsKKworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKGltZy0+dHlwZSk7CisgICAgY24gPSBDVl9NQVRfQ04oaW1nLT50eXBlKTsKKworICAgIGlmKCBpc19ub3JtZWQgJiYgY24gPT0gMSAmJiB0ZW1wbC0+cm93cyA+IDggJiYgdGVtcGwtPmNvbHMgPiA4ICYmCisgICAgICAgIGltZy0+cm93cyA+IHRlbXBsLT5jb2xzICYmIGltZy0+Y29scyA+IHRlbXBsLT5jb2xzICkKKyAgICB7CisgICAgICAgIEN2VGVtcGxNYXRjaElQUEZ1bmMgaXBwX2Z1bmMgPQorICAgICAgICAgICAgZGVwdGggPT0gQ1ZfOFUgPworICAgICAgICAgICAgKG1ldGhvZCA9PSBDVl9UTV9TUURJRkZfTk9STUVEID8gKEN2VGVtcGxNYXRjaElQUEZ1bmMpaWN2U3FyRGlzdGFuY2VWYWxpZF9Ob3JtXzh1MzJmX0MxUl9wIDoKKyAgICAgICAgICAgIG1ldGhvZCA9PSBDVl9UTV9DQ09SUl9OT1JNRUQgPyAoQ3ZUZW1wbE1hdGNoSVBQRnVuYylpY3ZDcm9zc0NvcnJWYWxpZF9Ob3JtXzh1MzJmX0MxUl9wIDoKKyAgICAgICAgICAgIChDdlRlbXBsTWF0Y2hJUFBGdW5jKWljdkNyb3NzQ29yclZhbGlkX05vcm1MZXZlbF84dTMyZl9DMVJfcCkgOgorICAgICAgICAgICAgKG1ldGhvZCA9PSBDVl9UTV9TUURJRkZfTk9STUVEID8gKEN2VGVtcGxNYXRjaElQUEZ1bmMpaWN2U3FyRGlzdGFuY2VWYWxpZF9Ob3JtXzMyZl9DMVJfcCA6CisgICAgICAgICAgICBtZXRob2QgPT0gQ1ZfVE1fQ0NPUlJfTk9STUVEID8gKEN2VGVtcGxNYXRjaElQUEZ1bmMpaWN2Q3Jvc3NDb3JyVmFsaWRfTm9ybV8zMmZfQzFSX3AgOgorICAgICAgICAgICAgKEN2VGVtcGxNYXRjaElQUEZ1bmMpaWN2Q3Jvc3NDb3JyVmFsaWRfTm9ybUxldmVsXzMyZl9DMVJfcCk7CisKKyAgICAgICAgaWYoIGlwcF9mdW5jICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTaXplIGltZ19zaXplID0gY3ZHZXRNYXRTaXplKGltZyksIHRlbXBsX3NpemUgPSBjdkdldE1hdFNpemUodGVtcGwpOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGlwcF9mdW5jKCBpbWctPmRhdGEucHRyLCBpbWctPnN0ZXAgPyBpbWctPnN0ZXAgOiBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdfc2l6ZSwgdGVtcGwtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGwtPnN0ZXAgPyB0ZW1wbC0+c3RlcCA6IENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsX3NpemUsIHJlc3VsdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQtPnN0ZXAgPyByZXN1bHQtPnN0ZXAgOiBDVl9TVFVCX1NURVAgKSk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcmVzdWx0LT5yb3dzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0KiBycm93ID0gKGZsb2F0KikocmVzdWx0LT5kYXRhLnB0ciArIGkqcmVzdWx0LT5zdGVwKTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgcmVzdWx0LT5jb2xzOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMocnJvd1tqXSkgPiAxLiApCisgICAgICAgICAgICAgICAgICAgICAgICBycm93W2pdID0gcnJvd1tqXSA8IDAgPyAtMS5mIDogMS5mOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDVl9DQUxMKCBpY3ZDcm9zc0NvcnIoIGltZywgdGVtcGwsIHJlc3VsdCApKTsKKworICAgIGlmKCBtZXRob2QgPT0gQ1ZfVE1fQ0NPUlIgKQorICAgICAgICBFWElUOworCisgICAgaW52X2FyZWEgPSAxLi8oKGRvdWJsZSl0ZW1wbC0+cm93cyAqIHRlbXBsLT5jb2xzKTsKKworICAgIENWX0NBTEwoIHN1bSA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MgKyAxLCBpbWctPmNvbHMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQUtFVFlQRSggQ1ZfNjRGLCBjbiApKSk7CisgICAgaWYoIG1ldGhvZCA9PSBDVl9UTV9DQ09FRkYgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZJbnRlZ3JhbCggaW1nLCBzdW0sIDAsIDAgKSk7CisgICAgICAgIENWX0NBTEwoIHRlbXBsX21lYW4gPSBjdkF2ZyggdGVtcGwgKSk7CisgICAgICAgIHEwID0gcTEgPSBxMiA9IHEzID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTY2FsYXIgX3RlbXBsX3NkdiA9IGN2U2NhbGFyQWxsKDApOworICAgICAgICBDVl9DQUxMKCBzcXN1bSA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MgKyAxLCBpbWctPmNvbHMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQUtFVFlQRSggQ1ZfNjRGLCBjbiApKSk7CisgICAgICAgIENWX0NBTEwoIGN2SW50ZWdyYWwoIGltZywgc3VtLCBzcXN1bSwgMCApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZBdmdTZHYoIHRlbXBsLCAmdGVtcGxfbWVhbiwgJl90ZW1wbF9zZHYgKSk7CisKKyAgICAgICAgdGVtcGxfbm9ybSA9IENWX1NRUihfdGVtcGxfc2R2LnZhbFswXSkgKyBDVl9TUVIoX3RlbXBsX3Nkdi52YWxbMV0pICsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfU1FSKF90ZW1wbF9zZHYudmFsWzJdKSArIENWX1NRUihfdGVtcGxfc2R2LnZhbFszXSk7CisKKyAgICAgICAgaWYoIHRlbXBsX25vcm0gPCBEQkxfRVBTSUxPTiAmJiBtZXRob2QgPT0gQ1ZfVE1fQ0NPRUZGX05PUk1FRCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2U2V0KCByZXN1bHQsIGN2U2NhbGFyQWxsKDEuKSApOworICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGVtcGxfc3VtMiA9IHRlbXBsX25vcm0gKworICAgICAgICAgICAgICAgICAgICAgQ1ZfU1FSKHRlbXBsX21lYW4udmFsWzBdKSArIENWX1NRUih0ZW1wbF9tZWFuLnZhbFsxXSkgKworICAgICAgICAgICAgICAgICAgICAgQ1ZfU1FSKHRlbXBsX21lYW4udmFsWzJdKSArIENWX1NRUih0ZW1wbF9tZWFuLnZhbFszXSk7CisKKyAgICAgICAgaWYoIG51bV90eXBlICE9IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wbF9tZWFuID0gY3ZTY2FsYXJBbGwoMCk7CisgICAgICAgICAgICB0ZW1wbF9ub3JtID0gdGVtcGxfc3VtMjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgdGVtcGxfc3VtMiAvPSBpbnZfYXJlYTsKKyAgICAgICAgdGVtcGxfbm9ybSA9IHNxcnQodGVtcGxfbm9ybSk7CisgICAgICAgIHRlbXBsX25vcm0gLz0gc3FydChpbnZfYXJlYSk7IC8vIGNhcmUgb2YgYWNjdXJhY3kgaGVyZQorCisgICAgICAgIHEwID0gKGRvdWJsZSopc3FzdW0tPmRhdGEucHRyOworICAgICAgICBxMSA9IHEwICsgdGVtcGwtPmNvbHMqY247CisgICAgICAgIHEyID0gKGRvdWJsZSopKHNxc3VtLT5kYXRhLnB0ciArIHRlbXBsLT5yb3dzKnNxc3VtLT5zdGVwKTsKKyAgICAgICAgcTMgPSBxMiArIHRlbXBsLT5jb2xzKmNuOworICAgIH0KKworICAgIHAwID0gKGRvdWJsZSopc3VtLT5kYXRhLnB0cjsKKyAgICBwMSA9IHAwICsgdGVtcGwtPmNvbHMqY247CisgICAgcDIgPSAoZG91YmxlKikoc3VtLT5kYXRhLnB0ciArIHRlbXBsLT5yb3dzKnN1bS0+c3RlcCk7CisgICAgcDMgPSBwMiArIHRlbXBsLT5jb2xzKmNuOworCisgICAgc3VtX3N0ZXAgPSBzdW0gPyBzdW0tPnN0ZXAgLyBzaXplb2YoZG91YmxlKSA6IDA7CisgICAgc3FzdW1fc3RlcCA9IHNxc3VtID8gc3FzdW0tPnN0ZXAgLyBzaXplb2YoZG91YmxlKSA6IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgcmVzdWx0LT5yb3dzOyBpKysgKQorICAgIHsKKyAgICAgICAgZmxvYXQqIHJyb3cgPSAoZmxvYXQqKShyZXN1bHQtPmRhdGEucHRyICsgaSpyZXN1bHQtPnN0ZXApOworICAgICAgICBpZHggPSBpICogc3VtX3N0ZXA7CisgICAgICAgIGlkeDIgPSBpICogc3FzdW1fc3RlcDsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgcmVzdWx0LT5jb2xzOyBqKyssIGlkeCArPSBjbiwgaWR4MiArPSBjbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBudW0gPSBycm93W2pdLCB0OworICAgICAgICAgICAgZG91YmxlIHduZF9tZWFuMiA9IDAsIHduZF9zdW0yID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIG51bV90eXBlID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHQgPSBwMFtpZHgra10gLSBwMVtpZHgra10gLSBwMltpZHgra10gKyBwM1tpZHgra107CisgICAgICAgICAgICAgICAgICAgIHduZF9tZWFuMiArPSBDVl9TUVIodCk7CisgICAgICAgICAgICAgICAgICAgIG51bSAtPSB0KnRlbXBsX21lYW4udmFsW2tdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHduZF9tZWFuMiAqPSBpbnZfYXJlYTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGlzX25vcm1lZCB8fCBudW1fdHlwZSA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ID0gcTBbaWR4MitrXSAtIHExW2lkeDIra10gLSBxMltpZHgyK2tdICsgcTNbaWR4MitrXTsKKyAgICAgICAgICAgICAgICAgICAgd25kX3N1bTIgKz0gdDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggbnVtX3R5cGUgPT0gMiApCisgICAgICAgICAgICAgICAgICAgIG51bSA9IHduZF9zdW0yIC0gMipudW0gKyB0ZW1wbF9zdW0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggaXNfbm9ybWVkICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gc3FydChNQVgod25kX3N1bTIgLSB3bmRfbWVhbjIsMCkpKnRlbXBsX25vcm07CisgICAgICAgICAgICAgICAgaWYoIHQgPiBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBudW0gLz0gdDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMobnVtKSA+IDEuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IG51bSA+IDAgPyAxIDogLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbnVtID0gbWV0aG9kICE9IENWX1RNX1NRRElGRl9OT1JNRUQgfHwgbnVtIDwgREJMX0VQU0lMT04gPyAwIDogMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcnJvd1tqXSA9IChmbG9hdCludW07CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIAorICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZzdW0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzcXN1bSApOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnRocmVzaC5jcHAgYi9jdi9zcmMvY3Z0aHJlc2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZWE2MjIKLS0tIC9kZXYvbnVsbAorKysgYi9jdi9zcmMvY3Z0aHJlc2guY3BwCkBAIC0wLDAgKzEsNDk1IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2VGhyZXNoXzh1X0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICBDdlNpemUgcm9pLCB1Y2hhciB0aHJlc2gsIHVjaGFyIG1heHZhbCwgaW50IHR5cGUgKQoreworICAgIGludCBpLCBqOworICAgIHVjaGFyIHRhYlsyNTZdOworCisgICAgc3dpdGNoKCB0eXBlICkKKyAgICB7CisgICAgY2FzZSBDVl9USFJFU0hfQklOQVJZOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHRocmVzaDsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9IDA7CisgICAgICAgIGZvciggOyBpIDwgMjU2OyBpKysgKQorICAgICAgICAgICAgdGFiW2ldID0gbWF4dmFsOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX1RIUkVTSF9CSU5BUllfSU5WOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHRocmVzaDsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9IG1heHZhbDsKKyAgICAgICAgZm9yKCA7IGkgPCAyNTY7IGkrKyApCisgICAgICAgICAgICB0YWJbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX1RIUkVTSF9UUlVOQzoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB0aHJlc2g7IGkrKyApCisgICAgICAgICAgICB0YWJbaV0gPSAodWNoYXIpaTsKKyAgICAgICAgZm9yKCA7IGkgPCAyNTY7IGkrKyApCisgICAgICAgICAgICB0YWJbaV0gPSB0aHJlc2g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfVEhSRVNIX1RPWkVSTzoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSB0aHJlc2g7IGkrKyApCisgICAgICAgICAgICB0YWJbaV0gPSAwOworICAgICAgICBmb3IoIDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9ICh1Y2hhcilpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX1RIUkVTSF9UT1pFUk9fSU5WOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHRocmVzaDsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9ICh1Y2hhcilpOworICAgICAgICBmb3IoIDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgICAgIHRhYltpXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBDVl9CQURGTEFHX0VSUjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgcm9pLmhlaWdodDsgaSsrLCBzcmMgKz0gc3JjX3N0ZXAsIGRzdCArPSBkc3Rfc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHJvaS53aWR0aCAtIDQ7IGogKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyIHQwID0gdGFiW3NyY1tqXV07CisgICAgICAgICAgICB1Y2hhciB0MSA9IHRhYltzcmNbaisxXV07CisKKyAgICAgICAgICAgIGRzdFtqXSA9IHQwOworICAgICAgICAgICAgZHN0W2orMV0gPSB0MTsKKworICAgICAgICAgICAgdDAgPSB0YWJbc3JjW2orMl1dOworICAgICAgICAgICAgdDEgPSB0YWJbc3JjW2orM11dOworCisgICAgICAgICAgICBkc3RbaisyXSA9IHQwOworICAgICAgICAgICAgZHN0W2orM10gPSB0MTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyBqIDwgcm9pLndpZHRoOyBqKysgKQorICAgICAgICAgICAgZHN0W2pdID0gdGFiW3NyY1tqXV07CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2VGhyZXNoXzMyZl9DMVIoIGNvbnN0IGZsb2F0ICpzcmMsIGludCBzcmNfc3RlcCwgZmxvYXQgKmRzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgIEN2U2l6ZSByb2ksIGZsb2F0IHRocmVzaCwgZmxvYXQgbWF4dmFsLCBpbnQgdHlwZSApCit7CisgICAgaW50IGksIGo7CisgICAgY29uc3QgaW50KiBpc3JjID0gKGNvbnN0IGludCopc3JjOworICAgIGludCogaWRzdCA9IChpbnQqKWRzdDsKKyAgICBDdjMyc3VmIHY7CisgICAgaW50IGlUaHJlc2gsIGlNYXg7CisKKyAgICB2LmYgPSB0aHJlc2g7IGlUaHJlc2ggPSBDVl9UT0dHTEVfRkxUKHYuaSk7CisgICAgdi5mID0gbWF4dmFsOyBpTWF4ID0gdi5pOworCisgICAgc3JjX3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBzd2l0Y2goIHR5cGUgKQorICAgIHsKKyAgICBjYXNlIENWX1RIUkVTSF9CSU5BUlk6CisgICAgICAgIGZvciggaSA9IDA7IGkgPCByb2kuaGVpZ2h0OyBpKyssIGlzcmMgKz0gc3JjX3N0ZXAsIGlkc3QgKz0gZHN0X3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgcm9pLndpZHRoOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ZW1wID0gaXNyY1tqXTsKKyAgICAgICAgICAgICAgICBpZHN0W2pdID0gKChDVl9UT0dHTEVfRkxUKHRlbXApIDw9IGlUaHJlc2gpIC0gMSkgJiBpTWF4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9USFJFU0hfQklOQVJZX0lOVjoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJvaS5oZWlnaHQ7IGkrKywgaXNyYyArPSBzcmNfc3RlcCwgaWRzdCArPSBkc3Rfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCByb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRlbXAgPSBpc3JjW2pdOworICAgICAgICAgICAgICAgIGlkc3Rbal0gPSAoKENWX1RPR0dMRV9GTFQodGVtcCkgPiBpVGhyZXNoKSAtIDEpICYgaU1heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfVEhSRVNIX1RSVU5DOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcm9pLmhlaWdodDsgaSsrLCBzcmMgKz0gc3JjX3N0ZXAsIGRzdCArPSBkc3Rfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCByb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdGVtcCA9IHNyY1tqXTsKKworICAgICAgICAgICAgICAgIGlmKCB0ZW1wID4gdGhyZXNoICkKKyAgICAgICAgICAgICAgICAgICAgdGVtcCA9IHRocmVzaDsKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9USFJFU0hfVE9aRVJPOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcm9pLmhlaWdodDsgaSsrLCBpc3JjICs9IHNyY19zdGVwLCBpZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHJvaS53aWR0aDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGVtcCA9IGlzcmNbal07CisgICAgICAgICAgICAgICAgaWRzdFtqXSA9ICgoQ1ZfVE9HR0xFX0ZMVCggdGVtcCApIDw9IGlUaHJlc2gpIC0gMSkgJiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9USFJFU0hfVE9aRVJPX0lOVjoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJvaS5oZWlnaHQ7IGkrKywgaXNyYyArPSBzcmNfc3RlcCwgaWRzdCArPSBkc3Rfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCByb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRlbXAgPSBpc3JjW2pdOworICAgICAgICAgICAgICAgIGlkc3Rbal0gPSAoKENWX1RPR0dMRV9GTFQoIHRlbXAgKSA+IGlUaHJlc2gpIC0gMSkgJiB0ZW1wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgZG91YmxlCitpY3ZHZXRUaHJlc2hWYWxfT3RzdSggY29uc3QgQ3ZIaXN0b2dyYW0qIGhpc3QgKQoreworICAgIGRvdWJsZSBtYXhfdmFsID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImljdkdldFRocmVzaFZhbF9PdHN1IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGNvdW50OworICAgIGNvbnN0IGZsb2F0KiBoOworICAgIGRvdWJsZSBzdW0gPSAwLCBtdSA9IDA7CisgICAgYm9vbCB1bmlmb3JtID0gZmFsc2U7CisgICAgZG91YmxlIGxvdyA9IDAsIGhpZ2ggPSAwLCBkZWx0YSA9IDA7CisgICAgZmxvYXQqIG51X3RocmVzaCA9IDA7CisgICAgZG91YmxlIG11MSA9IDAsIHExID0gMDsKKyAgICBkb3VibGUgbWF4X3NpZ21hID0gMDsKKworICAgIGlmKCAhQ1ZfSVNfSElTVChoaXN0KSB8fCBDVl9JU19TUEFSU0VfSElTVChoaXN0KSB8fCBoaXN0LT5tYXQuZGltcyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgIlRoZSBoaXN0b2dyYW0gaW4gT3RzdSBtZXRob2QgbXVzdCBiZSBhIHZhbGlkIGRlbnNlIDFEIGhpc3RvZ3JhbSIgKTsKKworICAgIGNvdW50ID0gaGlzdC0+bWF0LmRpbVswXS5zaXplOworICAgIGggPSAoZmxvYXQqKWN2UHRyMUQoIGhpc3QtPmJpbnMsIDAgKTsKKworICAgIGlmKCAhQ1ZfSElTVF9IQVNfUkFOR0VTKGhpc3QpIHx8IENWX0lTX1VOSUZPUk1fSElTVChoaXN0KSApCisgICAgeworICAgICAgICBpZiggQ1ZfSElTVF9IQVNfUkFOR0VTKGhpc3QpICkKKyAgICAgICAgeworICAgICAgICAgICAgbG93ID0gaGlzdC0+dGhyZXNoWzBdWzBdOworICAgICAgICAgICAgaGlnaCA9IGhpc3QtPnRocmVzaFswXVsxXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvdyA9IDA7CisgICAgICAgICAgICBoaWdoID0gY291bnQ7CisgICAgICAgIH0KKworICAgICAgICBkZWx0YSA9IChoaWdoLWxvdykvY291bnQ7CisgICAgICAgIGxvdyArPSBkZWx0YSowLjU7CisgICAgICAgIHVuaWZvcm0gPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG51X3RocmVzaCA9IGhpc3QtPnRocmVzaDJbMF07CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBzdW0gKz0gaFtpXTsKKyAgICAgICAgaWYoIHVuaWZvcm0gKQorICAgICAgICAgICAgbXUgKz0gKGkqZGVsdGEgKyBsb3cpKmhbaV07CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG11ICs9IChudV90aHJlc2hbaSoyXSArIG51X3RocmVzaFtpKjIrMV0pKjAuNSpoW2ldOworICAgIH0KKyAgICAKKyAgICBzdW0gPSBmYWJzKHN1bSkgPiBGTFRfRVBTSUxPTiA/IDEuL3N1bSA6IDA7CisgICAgbXUgKj0gc3VtOworCisgICAgbXUxID0gMDsKKyAgICBxMSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgcF9pLCBxMiwgbXUyLCB2YWxfaSwgc2lnbWE7CisKKyAgICAgICAgcF9pID0gaFtpXSpzdW07CisgICAgICAgIG11MSAqPSBxMTsKKyAgICAgICAgcTEgKz0gcF9pOworICAgICAgICBxMiA9IDEuIC0gcTE7CisKKyAgICAgICAgaWYoIE1JTihxMSxxMikgPCBGTFRfRVBTSUxPTiB8fCBNQVgocTEscTIpID4gMS4gLSBGTFRfRVBTSUxPTiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggdW5pZm9ybSApCisgICAgICAgICAgICB2YWxfaSA9IGkqZGVsdGEgKyBsb3c7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHZhbF9pID0gKG51X3RocmVzaFtpKjJdICsgbnVfdGhyZXNoW2kqMisxXSkqMC41OworCisgICAgICAgIG11MSA9IChtdTEgKyB2YWxfaSpwX2kpL3ExOworICAgICAgICBtdTIgPSAobXUgLSBxMSptdTEpL3EyOworICAgICAgICBzaWdtYSA9IHExKnEyKihtdTEgLSBtdTIpKihtdTEgLSBtdTIpOworICAgICAgICBpZiggc2lnbWEgPiBtYXhfc2lnbWEgKQorICAgICAgICB7CisgICAgICAgICAgICBtYXhfc2lnbWEgPSBzaWdtYTsKKyAgICAgICAgICAgIG1heF92YWwgPSB2YWxfaTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbWF4X3ZhbDsKK30KKworCitpY3ZBbmRDXzh1X0MxUl90IGljdkFuZENfOHVfQzFSX3AgPSAwOworaWN2Q29tcGFyZUNfOHVfQzFSX2N2X3QgaWN2Q29tcGFyZUNfOHVfQzFSX2N2X3AgPSAwOworaWN2VGhyZXNob2xkX0dUVmFsXzh1X0MxUl90IGljdlRocmVzaG9sZF9HVFZhbF84dV9DMVJfcCA9IDA7CitpY3ZUaHJlc2hvbGRfR1RWYWxfMzJmX0MxUl90IGljdlRocmVzaG9sZF9HVFZhbF8zMmZfQzFSX3AgPSAwOworaWN2VGhyZXNob2xkX0xUVmFsXzh1X0MxUl90IGljdlRocmVzaG9sZF9MVFZhbF84dV9DMVJfcCA9IDA7CitpY3ZUaHJlc2hvbGRfTFRWYWxfMzJmX0MxUl90IGljdlRocmVzaG9sZF9MVFZhbF8zMmZfQzFSX3AgPSAwOworCitDVl9JTVBMIGRvdWJsZQorY3ZUaHJlc2hvbGQoIGNvbnN0IHZvaWQqIHNyY2Fyciwgdm9pZCogZHN0YXJyLCBkb3VibGUgdGhyZXNoLCBkb3VibGUgbWF4dmFsLCBpbnQgdHlwZSApCit7CisgICAgQ3ZIaXN0b2dyYW0qIGhpc3QgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZUaHJlc2hvbGQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUgcm9pOworICAgIGludCBzcmNfc3RlcCwgZHN0X3N0ZXA7CisgICAgQ3ZNYXQgc3JjX3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3Rfc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2TWF0IHNyYzAsIGRzdDA7CisgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMDsKKyAgICBpbnQgaXRocmVzaCwgaW1heHZhbCwgY247CisgICAgYm9vbCB1c2Vfb3RzdTsKKworICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNfc3R1YiwgJmNvaTEgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdF9zdHViLCAmY29pMiApKTsKKworICAgIGlmKCBjb2kxICsgY29pMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICJDT0kgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZnVuY3Rpb24iICk7CisKKyAgICBpZiggIUNWX0FSRV9DTlNfRVEoIHNyYywgZHN0ICkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIkJvdGggYXJyYXlzIG11c3QgaGF2ZSBlcXVhbCBudW1iZXIgb2YgY2hhbm5lbHMiICk7CisKKyAgICBjbiA9IENWX01BVF9DTihzcmMtPnR5cGUpOworICAgIGlmKCBjbiA+IDEgKQorICAgIHsKKyAgICAgICAgc3JjID0gY3ZSZXNoYXBlKCBzcmMsICZzcmMwLCAxICk7CisgICAgICAgIGRzdCA9IGN2UmVzaGFwZSggZHN0LCAmZHN0MCwgMSApOworICAgIH0KKworICAgIHVzZV9vdHN1ID0gKHR5cGUgJiB+Q1ZfVEhSRVNIX01BU0spID09IENWX1RIUkVTSF9PVFNVOworICAgIHR5cGUgJj0gQ1ZfVEhSRVNIX01BU0s7CisKKyAgICBpZiggdXNlX290c3UgKQorICAgIHsKKyAgICAgICAgZmxvYXQgX3Jhbmdlc1tdID0geyAwLCAyNTYgfTsKKyAgICAgICAgZmxvYXQqIHJhbmdlcyA9IF9yYW5nZXM7CisgICAgICAgIGludCBoaXN0X3NpemUgPSAyNTY7CisgICAgICAgIHZvaWQqIHNyY2FycjAgPSBzcmM7CisKKyAgICAgICAgaWYoIENWX01BVF9UWVBFKHNyYy0+dHlwZSkgIT0gQ1ZfOFVDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsICJPdHN1IG1ldGhvZCBjYW4gb25seSBiZSB1c2VkIHdpdGggOHVDMSBpbWFnZXMiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggaGlzdCA9IGN2Q3JlYXRlSGlzdCggMSwgJmhpc3Rfc2l6ZSwgQ1ZfSElTVF9BUlJBWSwgJnJhbmdlcyApKTsKKyAgICAgICAgY3ZDYWxjQXJySGlzdCggJnNyY2FycjAsIGhpc3QgKTsKKyAgICAgICAgdGhyZXNoID0gY3ZGbG9vcihpY3ZHZXRUaHJlc2hWYWxfT3RzdSggaGlzdCApKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIHNyYywgZHN0ICkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9UWVBFKGRzdC0+dHlwZSkgIT0gQ1ZfOFVDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbiBjYXNlIG9mIGRpZmZlcmVudCB0eXBlcyBkZXN0aW5hdGlvbiBzaG91bGQgYmUgOHVDMSIgKTsKKworICAgICAgICBpZiggdHlwZSAhPSBDVl9USFJFU0hfQklOQVJZICYmIHR5cGUgIT0gQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJJbiBjYXNlIG9mIGRpZmZlcmVudCB0eXBlcyBvbmx5IENWX1RIUkVTSF9CSU5BUlkgIgorICAgICAgICAgICAgImFuZCBDVl9USFJFU0hfQklOQVJZX0lOViB0aHJlc2hvbGRpbmcgdHlwZXMgYXJlIHN1cHBvcnRlZCIgKTsKKworICAgICAgICBpZiggbWF4dmFsIDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2U2V0WmVybyggZHN0ICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDbXBTKCBzcmMsIHRocmVzaCwgZHN0LCB0eXBlID09IENWX1RIUkVTSF9CSU5BUlkgPyBDVl9DTVBfR1QgOiBDVl9DTVBfTEUgKSk7CisgICAgICAgICAgICBpZiggbWF4dmFsIDwgMjU1ICkKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdkFuZFMoIGRzdCwgY3ZTY2FsYXJBbGwoIG1heHZhbCApLCBkc3QgKSk7CisgICAgICAgIH0KKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHJvaSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHJvaS53aWR0aCAqPSByb2kuaGVpZ2h0OworICAgICAgICByb2kuaGVpZ2h0ID0gMTsKKyAgICAgICAgc3JjX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwOworICAgIH0KKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHNyYy0+dHlwZSkgKQorICAgIHsKKyAgICBjYXNlIENWXzhVOgorICAgICAgICAKKyAgICAgICAgaXRocmVzaCA9IGN2Rmxvb3IodGhyZXNoKTsKKyAgICAgICAgaW1heHZhbCA9IGN2Um91bmQobWF4dmFsKTsKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfVEhSRVNIX1RSVU5DICkKKyAgICAgICAgICAgIGltYXh2YWwgPSBpdGhyZXNoOworICAgICAgICBpbWF4dmFsID0gQ1ZfQ0FTVF84VShpbWF4dmFsKTsKKworICAgICAgICBpZiggaXRocmVzaCA8IDAgfHwgaXRocmVzaCA+PSAyNTUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl9USFJFU0hfQklOQVJZIHx8IHR5cGUgPT0gQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgfHwKKyAgICAgICAgICAgICAgICAoKHR5cGUgPT0gQ1ZfVEhSRVNIX1RSVU5DIHx8IHR5cGUgPT0gQ1ZfVEhSRVNIX1RPWkVST19JTlYpICYmIGl0aHJlc2ggPCAwKSB8fAorICAgICAgICAgICAgICAgICh0eXBlID09IENWX1RIUkVTSF9UT1pFUk8gJiYgaXRocmVzaCA+PSAyNTUpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdiA9IHR5cGUgPT0gQ1ZfVEhSRVNIX0JJTkFSWSA/IChpdGhyZXNoID49IDI1NSA/IDAgOiBpbWF4dmFsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENWX1RIUkVTSF9CSU5BUllfSU5WID8gKGl0aHJlc2ggPj0gMjU1ID8gaW1heHZhbCA6IDApIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfVEhSRVNIX1RSVU5DID8gaW1heHZhbCA6IDA7CisKKyAgICAgICAgICAgICAgICBjdlNldCggZHN0LCBjdlNjYWxhckFsbCh2KSApOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZDb3B5KCBzcmMsIGRzdCApOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdHlwZSA9PSBDVl9USFJFU0hfQklOQVJZIHx8IHR5cGUgPT0gQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaWN2Q29tcGFyZUNfOHVfQzFSX2N2X3AgJiYgaWN2QW5kQ184dV9DMVJfcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZDb21wYXJlQ184dV9DMVJfY3ZfcCggc3JjLT5kYXRhLnB0ciwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICh1Y2hhcilpdGhyZXNoLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgcm9pLAorICAgICAgICAgICAgICAgICAgICB0eXBlID09IENWX1RIUkVTSF9CSU5BUlkgPyBjdkNtcEdyZWF0ZXIgOiBjdkNtcExlc3NFcSApKTsKKworICAgICAgICAgICAgICAgIGlmKCBpbWF4dmFsIDwgMjU1ICkKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZBbmRDXzh1X0MxUl9wKCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgKHVjaGFyKWltYXh2YWwsIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCByb2kgKSk7CisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWX1RIUkVTSF9UUlVOQyB8fCB0eXBlID09IENWX1RIUkVTSF9UT1pFUk9fSU5WICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGljdlRocmVzaG9sZF9HVFZhbF84dV9DMVJfcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZUaHJlc2hvbGRfR1RWYWxfOHVfQzFSX3AoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgcm9pLCAodWNoYXIpaXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSh0eXBlID09IENWX1RIUkVTSF9UUlVOQyA/IGl0aHJlc2ggOiAwKSApKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCB0eXBlID09IENWX1RIUkVTSF9UT1pFUk8gKTsKKyAgICAgICAgICAgIGlmKCBpY3ZUaHJlc2hvbGRfTFRWYWxfOHVfQzFSX3AgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0aHJlc2ggPSBjdkZsb29yKHRocmVzaCsxLik7CisgICAgICAgICAgICAgICAgaXRocmVzaCA9IENWX0NBU1RfOFUoaXRocmVzaCk7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZUaHJlc2hvbGRfTFRWYWxfOHVfQzFSX3AoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgcm9pLCAodWNoYXIpaXRocmVzaCwgMCApKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWN2VGhyZXNoXzh1X0MxUiggc3JjLT5kYXRhLnB0ciwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhcilpdGhyZXNoLCAodWNoYXIpaW1heHZhbCwgdHlwZSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRjoKKworICAgICAgICBpZiggdHlwZSA9PSBDVl9USFJFU0hfVFJVTkMgfHwgdHlwZSA9PSBDVl9USFJFU0hfVE9aRVJPX0lOViApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpY3ZUaHJlc2hvbGRfR1RWYWxfMzJmX0MxUl9wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdlRocmVzaG9sZF9HVFZhbF8zMmZfQzFSX3AoIHNyYy0+ZGF0YS5mbCwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5mbCwgZHN0X3N0ZXAsIHJvaSwgKGZsb2F0KXRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl9USFJFU0hfVFJVTkMgPyAoZmxvYXQpdGhyZXNoIDogMCApKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfVEhSRVNIX1RPWkVSTyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpY3ZUaHJlc2hvbGRfTFRWYWxfMzJmX0MxUl9wICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdlRocmVzaG9sZF9MVFZhbF8zMmZfQzFSX3AoIHNyYy0+ZGF0YS5mbCwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5mbCwgZHN0X3N0ZXAsIHJvaSwgKGZsb2F0KSh0aHJlc2gqKDEgKyBGTFRfRVBTSUxPTikpLCAwICkpOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpY3ZUaHJlc2hfMzJmX0MxUiggc3JjLT5kYXRhLmZsLCBzcmNfc3RlcCwgZHN0LT5kYXRhLmZsLCBkc3Rfc3RlcCwgcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KXRocmVzaCwgKGZsb2F0KW1heHZhbCwgdHlwZSApOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGhpc3QgKQorICAgICAgICBjdlJlbGVhc2VIaXN0KCAmaGlzdCApOworCisgICAgcmV0dXJuIHRocmVzaDsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdi9zcmMvY3Z1bmRpc3RvcnQuY3BwIGIvY3Yvc3JjL2N2dW5kaXN0b3J0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODRiY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2dW5kaXN0b3J0LmNwcApAQCAtMCwwICsxLDQ5MSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3YuaCIKKworc3RhdGljIEN2U3RhdHVzCitpY3ZVbkRpc3RvcnRfOHVfQ25SKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnRyaW5zaWNfbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGRpc3RfY29lZmZzLCBpbnQgY24gKQoreworICAgIGludCB1LCB2LCBpOworICAgIGZsb2F0IHUwID0gaW50cmluc2ljX21hdHJpeFsyXSwgdjAgPSBpbnRyaW5zaWNfbWF0cml4WzVdOworICAgIGZsb2F0IHgwID0gKHNpemUud2lkdGgtMSkqMC41ZiwgeTAgPSAoc2l6ZS5oZWlnaHQtMSkqMC41ZjsKKyAgICBmbG9hdCBmeCA9IGludHJpbnNpY19tYXRyaXhbMF0sIGZ5ID0gaW50cmluc2ljX21hdHJpeFs0XTsKKyAgICBmbG9hdCBpZnggPSAxLmYvZngsIGlmeSA9IDEuZi9meTsKKyAgICBmbG9hdCBrMSA9IGRpc3RfY29lZmZzWzBdLCBrMiA9IGRpc3RfY29lZmZzWzFdLCBrMyA9IGRpc3RfY29lZmZzWzRdOworICAgIGZsb2F0IHAxID0gZGlzdF9jb2VmZnNbMl0sIHAyID0gZGlzdF9jb2VmZnNbM107CisKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOworICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBmb3IoIHYgPSAwOyB2IDwgc2l6ZS5oZWlnaHQ7IHYrKywgZHN0ICs9IGRzdHN0ZXAgKQorICAgIHsKKyAgICAgICAgZmxvYXQgeSA9ICh2IC0gdjApKmlmeSwgeTIgPSB5Knk7CisKKyAgICAgICAgZm9yKCB1ID0gMDsgdSA8IHNpemUud2lkdGg7IHUrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHggPSAodSAtIHUwKSppZngsIHgyID0geCp4LCByMiA9IHgyICsgeTIsIF8yeHkgPSAyKngqeTsKKyAgICAgICAgICAgIGZsb2F0IGtyID0gMSArICgoazMqcjIgKyBrMikqcjIgKyBrMSkqcjI7CisgICAgICAgICAgICBmbG9hdCBfeCA9IGZ4Kih4KmtyICsgcDEqXzJ4eSArIHAyKihyMiArIDIqeDIpKSArIHgwOworICAgICAgICAgICAgZmxvYXQgX3kgPSBmeSooeSprciArIHAxKihyMiArIDIqeTIpICsgcDIqXzJ4eSkgKyB5MDsKKyAgICAgICAgICAgIGludCBpeCA9IGN2Rmxvb3IoX3gpLCBpeSA9IGN2Rmxvb3IoX3kpOworCisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKWl5IDwgKHVuc2lnbmVkKShzaXplLmhlaWdodCAtIDEpICYmCisgICAgICAgICAgICAgICAgKHVuc2lnbmVkKWl4IDwgKHVuc2lnbmVkKShzaXplLndpZHRoIC0gMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBwdHIgPSBzcmMgKyBpeSpzcmNzdGVwICsgaXgqY247CisgICAgICAgICAgICAgICAgX3ggLT0gaXg7IF95IC09IGl5OworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjbjsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gQ1ZfOFRPMzJGKHB0cltpXSksIHQxID0gQ1ZfOFRPMzJGKHB0cltpK3NyY3N0ZXBdKTsKKyAgICAgICAgICAgICAgICAgICAgdDAgKz0gX3gqKENWXzhUTzMyRihwdHJbaStjbl0pIC0gdDApOworICAgICAgICAgICAgICAgICAgICB0MSArPSBfeCooQ1ZfOFRPMzJGKHB0cltpICsgc3Jjc3RlcCArIGNuXSkgLSB0MSk7CisgICAgICAgICAgICAgICAgICAgIGRzdFt1KmNuICsgaV0gPSAodWNoYXIpY3ZSb3VuZCh0MCArIF95Kih0MSAtIHQwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W3UqY24gKyBpXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitpY3ZVbmRpc3RvcnRHZXRTaXplX3QgaWN2VW5kaXN0b3J0R2V0U2l6ZV9wID0gMDsKK2ljdkNyZWF0ZU1hcENhbWVyYVVuZGlzdG9ydF8zMmZfQzFSX3QgaWN2Q3JlYXRlTWFwQ2FtZXJhVW5kaXN0b3J0XzMyZl9DMVJfcCA9IDA7CitpY3ZVbmRpc3RvcnRSYWRpYWxfOHVfQzFSX3QgaWN2VW5kaXN0b3J0UmFkaWFsXzh1X0MxUl9wID0gMDsKK2ljdlVuZGlzdG9ydFJhZGlhbF84dV9DM1JfdCBpY3ZVbmRpc3RvcnRSYWRpYWxfOHVfQzNSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZVbmRpc3RvcnRSYWRpYWxJUFBGdW5jKQorICAgICggY29uc3Qgdm9pZCogcFNyYywgaW50IHNyY1N0ZXAsIHZvaWQqIHBEc3QsIGludCBkc3RTdGVwLCBDdlNpemUgcm9pU2l6ZSwKKyAgICAgIGZsb2F0IGZ4LCBmbG9hdCBmeSwgZmxvYXQgY3gsIGZsb2F0IGN5LCBmbG9hdCBrMSwgZmxvYXQgazIsIHVjaGFyICpwQnVmZmVyICk7CisKK0NWX0lNUEwgdm9pZAorY3ZVbmRpc3RvcnQyKCBjb25zdCBDdkFyciogX3NyYywgQ3ZBcnIqIF9kc3QsIGNvbnN0IEN2TWF0KiBBLCBjb25zdCBDdk1hdCogZGlzdF9jb2VmZnMgKQoreworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2VW5kaXN0b3J0MiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGZsb2F0IGFbOV0sIGtbNV09ezAsMCwwLDAsMH07CisgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMDsKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0Kilfc3JjOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKV9kc3Q7CisgICAgQ3ZNYXQgX2EgPSBjdk1hdCggMywgMywgQ1ZfMzJGLCBhICksIF9rOworICAgIGludCBjbiwgc3JjX3N0ZXAsIGRzdF9zdGVwOworICAgIEN2U2l6ZSBzaXplOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRMaW5lYXJDb2VmZlRhYigpOworICAgICAgICBpY3ZJbml0Q3ViaWNDb2VmZlRhYigpOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaTEgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgQ09JIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSChzcmMtPnR5cGUpICE9IENWXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiT25seSA4LWJpdCBpbWFnZXMgYXJlIHN1cHBvcnRlZCIgKTsKKworICAgIGlmKCBzcmMtPmRhdGEucHRyID09IGRzdC0+ZGF0YS5wdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsICJJbi1wbGFjZSB1bmRpc3RvcnRpb24gaXMgbm90IGltcGxlbWVudGVkIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKEEpIHx8IEEtPnJvd3MgIT0gMyB8fCBBLT5jb2xzICE9IDMgIHx8CisgICAgICAgIChDVl9NQVRfVFlQRShBLT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShBLT50eXBlKSAhPSBDVl82NEZDMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW50cmluc2ljIG1hdHJpeCBtdXN0IGJlIGEgdmFsaWQgM3gzIGZsb2F0aW5nLXBvaW50IG1hdHJpeCIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRpc3RfY29lZmZzKSB8fCAoZGlzdF9jb2VmZnMtPnJvd3MgIT0gMSAmJiBkaXN0X2NvZWZmcy0+Y29scyAhPSAxKSB8fAorICAgICAgICAoZGlzdF9jb2VmZnMtPnJvd3MqZGlzdF9jb2VmZnMtPmNvbHMqQ1ZfTUFUX0NOKGRpc3RfY29lZmZzLT50eXBlKSAhPSA0ICYmCisgICAgICAgIGRpc3RfY29lZmZzLT5yb3dzKmRpc3RfY29lZmZzLT5jb2xzKkNWX01BVF9DTihkaXN0X2NvZWZmcy0+dHlwZSkgIT0gNSkgfHwKKyAgICAgICAgKENWX01BVF9ERVBUSChkaXN0X2NvZWZmcy0+dHlwZSkgIT0gQ1ZfNjRGICYmCisgICAgICAgIENWX01BVF9ERVBUSChkaXN0X2NvZWZmcy0+dHlwZSkgIT0gQ1ZfMzJGKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiRGlzdG9ydGlvbiBjb2VmZmljaWVudHMgbXVzdCBiZSAxeDQsIDR4MSwgMXg1IG9yIDV4MSBmbG9hdGluZy1wb2ludCB2ZWN0b3IiICk7CisKKyAgICBjdkNvbnZlcnQoIEEsICZfYSApOworICAgIF9rID0gY3ZNYXQoIGRpc3RfY29lZmZzLT5yb3dzLCBkaXN0X2NvZWZmcy0+Y29scywKKyAgICAgICAgICAgICAgICBDVl9NQUtFVFlQRShDVl8zMkYsIENWX01BVF9DTihkaXN0X2NvZWZmcy0+dHlwZSkpLCBrICk7CisgICAgY3ZDb252ZXJ0KCBkaXN0X2NvZWZmcywgJl9rICk7CisKKyAgICBjbiA9IENWX01BVF9DTihzcmMtPnR5cGUpOworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBzcmNfc3RlcCA9IHNyYy0+c3RlcCA/IHNyYy0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcCA/IGRzdC0+c3RlcCA6IENWX1NUVUJfU1RFUDsKKworICAgIGljdlVuRGlzdG9ydF84dV9DblIoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLAorICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwgYSwgaywgY24gKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkluaXRVbmRpc3RvcnRNYXAoIGNvbnN0IEN2TWF0KiBBLCBjb25zdCBDdk1hdCogZGlzdF9jb2VmZnMsCisgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBtYXB4YXJyLCBDdkFyciogbWFweWFyciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkluaXRVbmRpc3RvcnRNYXAiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgZmxvYXQgYVs5XSwga1s1XT17MCwwLDAsMCwwfTsKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwOworICAgIEN2TWF0IG1hcHhzdHViLCAqX21hcHggPSAoQ3ZNYXQqKW1hcHhhcnI7CisgICAgQ3ZNYXQgbWFweXN0dWIsICpfbWFweSA9IChDdk1hdCopbWFweWFycjsKKyAgICBDdk1hdCBfYSA9IGN2TWF0KCAzLCAzLCBDVl8zMkYsIGEgKSwgX2s7CisgICAgaW50IHUsIHY7CisgICAgZmxvYXQgdTAsIHYwLCBmeCwgZnksIGlmeCwgaWZ5LCB4MCwgeTAsIGsxLCBrMiwgazMsIHAxLCBwMjsKKyAgICBDdlNpemUgc2l6ZTsKKworICAgIENWX0NBTEwoIF9tYXB4ID0gY3ZHZXRNYXQoIF9tYXB4LCAmbWFweHN0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIF9tYXB5ID0gY3ZHZXRNYXQoIF9tYXB5LCAmbWFweXN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgQ09JIiApOworCisgICAgaWYoIENWX01BVF9UWVBFKF9tYXB4LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIkJvdGggbWFwcyBtdXN0IGhhdmUgMzJmQzEgdHlwZSIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBfbWFweCwgX21hcHkgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggX21hcHgsIF9tYXB5ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoX21hcHgpOworCisgICAgaWYoICFDVl9JU19NQVQoQSkgfHwgQS0+cm93cyAhPSAzIHx8IEEtPmNvbHMgIT0gMyAgfHwKKyAgICAgICAgKENWX01BVF9UWVBFKEEtPnR5cGUpICE9IENWXzMyRkMxICYmIENWX01BVF9UWVBFKEEtPnR5cGUpICE9IENWXzY0RkMxKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnRyaW5zaWMgbWF0cml4IG11c3QgYmUgYSB2YWxpZCAzeDMgZmxvYXRpbmctcG9pbnQgbWF0cml4IiApOworCisgICAgaWYoICFDVl9JU19NQVQoZGlzdF9jb2VmZnMpIHx8IChkaXN0X2NvZWZmcy0+cm93cyAhPSAxICYmIGRpc3RfY29lZmZzLT5jb2xzICE9IDEpIHx8CisgICAgICAgIChkaXN0X2NvZWZmcy0+cm93cypkaXN0X2NvZWZmcy0+Y29scypDVl9NQVRfQ04oZGlzdF9jb2VmZnMtPnR5cGUpICE9IDQgJiYKKyAgICAgICAgZGlzdF9jb2VmZnMtPnJvd3MqZGlzdF9jb2VmZnMtPmNvbHMqQ1ZfTUFUX0NOKGRpc3RfY29lZmZzLT50eXBlKSAhPSA1KSB8fAorICAgICAgICAoQ1ZfTUFUX0RFUFRIKGRpc3RfY29lZmZzLT50eXBlKSAhPSBDVl82NEYgJiYKKyAgICAgICAgQ1ZfTUFUX0RFUFRIKGRpc3RfY29lZmZzLT50eXBlKSAhPSBDVl8zMkYpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJEaXN0b3J0aW9uIGNvZWZmaWNpZW50cyBtdXN0IGJlIDF4NCwgNHgxLCAxeDUgb3IgNXgxIGZsb2F0aW5nLXBvaW50IHZlY3RvciIgKTsKKworICAgIGN2Q29udmVydCggQSwgJl9hICk7CisgICAgX2sgPSBjdk1hdCggZGlzdF9jb2VmZnMtPnJvd3MsIGRpc3RfY29lZmZzLT5jb2xzLAorICAgICAgICAgICAgICAgIENWX01BS0VUWVBFKENWXzMyRiwgQ1ZfTUFUX0NOKGRpc3RfY29lZmZzLT50eXBlKSksIGsgKTsKKyAgICBjdkNvbnZlcnQoIGRpc3RfY29lZmZzLCAmX2sgKTsKKworICAgIHUwID0gYVsyXTsgdjAgPSBhWzVdOworICAgIGZ4ID0gYVswXTsgZnkgPSBhWzRdOworICAgIGlmeCA9IDEuZi9meDsgaWZ5ID0gMS5mL2Z5OworICAgIGsxID0ga1swXTsgazIgPSBrWzFdOyBrMyA9IGtbNF07CisgICAgcDEgPSBrWzJdOyBwMiA9IGtbM107CisgICAgeDAgPSAoc2l6ZS53aWR0aC0xKSowLjVmOworICAgIHkwID0gKHNpemUuaGVpZ2h0LTEpKjAuNWY7CisKKyAgICBmb3IoIHYgPSAwOyB2IDwgc2l6ZS5oZWlnaHQ7IHYrKyApCisgICAgeworICAgICAgICBmbG9hdCogbWFweCA9IChmbG9hdCopKF9tYXB4LT5kYXRhLnB0ciArIF9tYXB4LT5zdGVwKnYpOworICAgICAgICBmbG9hdCogbWFweSA9IChmbG9hdCopKF9tYXB5LT5kYXRhLnB0ciArIF9tYXB5LT5zdGVwKnYpOworICAgICAgICBmbG9hdCB5ID0gKHYgLSB2MCkqaWZ5LCB5MiA9IHkqeTsKKworICAgICAgICBmb3IoIHUgPSAwOyB1IDwgc2l6ZS53aWR0aDsgdSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgeCA9ICh1IC0gdTApKmlmeCwgeDIgPSB4KngsIHIyID0geDIgKyB5MiwgXzJ4eSA9IDIqeCp5OworICAgICAgICAgICAgZG91YmxlIGtyID0gMSArICgoazMqcjIgKyBrMikqcjIgKyBrMSkqcjI7CisgICAgICAgICAgICBkb3VibGUgX3ggPSBmeCooeCprciArIHAxKl8yeHkgKyBwMioocjIgKyAyKngyKSkgKyB4MDsKKyAgICAgICAgICAgIGRvdWJsZSBfeSA9IGZ5Kih5KmtyICsgcDEqKHIyICsgMip5MikgKyBwMipfMnh5KSArIHkwOyAKKyAgICAgICAgICAgIG1hcHhbdV0gPSAoZmxvYXQpX3g7CisgICAgICAgICAgICBtYXB5W3VdID0gKGZsb2F0KV95OworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkCitjdkluaXRVbmRpc3RvcnRSZWN0aWZ5TWFwKCBjb25zdCBDdk1hdCogQSwgY29uc3QgQ3ZNYXQqIGRpc3RDb2VmZnMsCisgICAgY29uc3QgQ3ZNYXQgKlIsIGNvbnN0IEN2TWF0KiBBciwgQ3ZBcnIqIG1hcHhhcnIsIEN2QXJyKiBtYXB5YXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2SW5pdFVuZGlzdG9ydE1hcCIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBkb3VibGUgYVs5XSwgYXJbOV0sIHJbOV0sIGlyWzldLCBrWzVdPXswLDAsMCwwLDB9OworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgQ3ZNYXQgbWFweHN0dWIsICpfbWFweCA9IChDdk1hdCopbWFweGFycjsKKyAgICBDdk1hdCBtYXB5c3R1YiwgKl9tYXB5ID0gKEN2TWF0KiltYXB5YXJyOworICAgIEN2TWF0IF9hID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgYSApOworICAgIEN2TWF0IF9rID0gY3ZNYXQoIDQsIDEsIENWXzY0RiwgayApOworICAgIEN2TWF0IF9hciA9IGN2TWF0KCAzLCAzLCBDVl82NEYsIGFyICk7CisgICAgQ3ZNYXQgX3IgPSBjdk1hdCggMywgMywgQ1ZfNjRGLCByICk7CisgICAgQ3ZNYXQgX2lyID0gY3ZNYXQoIDMsIDMsIENWXzY0RiwgaXIgKTsKKyAgICBpbnQgaSwgajsKKyAgICBkb3VibGUgZngsIGZ5LCB1MCwgdjAsIGsxLCBrMiwgazMsIHAxLCBwMjsKKyAgICBDdlNpemUgc2l6ZTsKKworICAgIENWX0NBTEwoIF9tYXB4ID0gY3ZHZXRNYXQoIF9tYXB4LCAmbWFweHN0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIF9tYXB5ID0gY3ZHZXRNYXQoIF9tYXB5LCAmbWFweXN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgQ09JIiApOworCisgICAgaWYoIENWX01BVF9UWVBFKF9tYXB4LT50eXBlKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIkJvdGggbWFwcyBtdXN0IGhhdmUgMzJmQzEgdHlwZSIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBfbWFweCwgX21hcHkgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggX21hcHgsIF9tYXB5ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCBBICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKEEpIHx8IEEtPnJvd3MgIT0gMyB8fCBBLT5jb2xzICE9IDMgIHx8CisgICAgICAgICAgICAoQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYgQ1ZfTUFUX1RZUEUoQS0+dHlwZSkgIT0gQ1ZfNjRGQzEpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnRyaW5zaWMgbWF0cml4IG11c3QgYmUgYSB2YWxpZCAzeDMgZmxvYXRpbmctcG9pbnQgbWF0cml4IiApOworICAgICAgICBjdkNvbnZlcnQoIEEsICZfYSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN2U2V0SWRlbnRpdHkoICZfYSApOworCisgICAgaWYoIEFyICkKKyAgICB7CisgICAgICAgIEN2TWF0IEFyMzM7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKEFyKSB8fCBBci0+cm93cyAhPSAzIHx8IChBci0+Y29scyAhPSAzICYmIEFyLT5jb2xzICE9IDQpIHx8CisgICAgICAgICAgICAoQ1ZfTUFUX1RZUEUoQXItPnR5cGUpICE9IENWXzMyRkMxICYmIENWX01BVF9UWVBFKEFyLT50eXBlKSAhPSBDVl82NEZDMSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBuZXcgaW50cmluc2ljIG1hdHJpeCBtdXN0IGJlIGEgdmFsaWQgM3gzIGZsb2F0aW5nLXBvaW50IG1hdHJpeCIgKTsKKyAgICAgICAgY3ZHZXRDb2xzKCBBciwgJkFyMzMsIDAsIDMgKTsKKyAgICAgICAgY3ZDb252ZXJ0KCAmQXIzMywgJl9hciApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN2U2V0SWRlbnRpdHkoICZfYXIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKFIpIHx8IFItPnJvd3MgIT0gMyB8fCBSLT5jb2xzICE9IDMgIHx8CisgICAgICAgIChDVl9NQVRfVFlQRShSLT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShSLT50eXBlKSAhPSBDVl82NEZDMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiUm90YWlvbi9ob21vZ3JhcGh5IG1hdHJpeCBtdXN0IGJlIGEgdmFsaWQgM3gzIGZsb2F0aW5nLXBvaW50IG1hdHJpeCIgKTsKKworICAgIGlmKCBkaXN0Q29lZmZzICkKKyAgICB7CisgICAgICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKGRpc3RDb2VmZnMpICYmCisgICAgICAgICAgICAoZGlzdENvZWZmcy0+cm93cyA9PSAxIHx8IGRpc3RDb2VmZnMtPmNvbHMgPT0gMSkgJiYKKyAgICAgICAgICAgIChkaXN0Q29lZmZzLT5yb3dzKmRpc3RDb2VmZnMtPmNvbHMqQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpID09IDQgfHwKKyAgICAgICAgICAgIGRpc3RDb2VmZnMtPnJvd3MqZGlzdENvZWZmcy0+Y29scypDVl9NQVRfQ04oZGlzdENvZWZmcy0+dHlwZSkgPT0gNSkgJiYKKyAgICAgICAgICAgIChDVl9NQVRfREVQVEgoZGlzdENvZWZmcy0+dHlwZSkgPT0gQ1ZfNjRGIHx8CisgICAgICAgICAgICBDVl9NQVRfREVQVEgoZGlzdENvZWZmcy0+dHlwZSkgPT0gQ1ZfMzJGKSApOworICAgICAgICBfayA9IGN2TWF0KCBkaXN0Q29lZmZzLT5yb3dzLCBkaXN0Q29lZmZzLT5jb2xzLAorICAgICAgICAgICAgICAgIENWX01BS0VUWVBFKENWXzY0RiwgQ1ZfTUFUX0NOKGRpc3RDb2VmZnMtPnR5cGUpKSwgayApOworICAgICAgICBjdkNvbnZlcnQoIGRpc3RDb2VmZnMsICZfayApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGN2WmVybyggJl9rICk7CisgICAgCisgICAgY3ZDb252ZXJ0KCBSLCAmX3IgKTsgICAgLy8gcmVjdGlmaWNhdGlvbiBtYXRyaXgKKyAgICBjdk1hdE11bCggJl9hciwgJl9yLCAmX3IgKTsgLy8gQXIqUgorICAgIGN2SW52ZXJ0KCAmX3IsICZfaXIgKTsgIC8vIGludmVyc2U6IFJeLTEqQXJeLTEKKworICAgIHUwID0gYVsyXTsgdjAgPSBhWzVdOworICAgIGZ4ID0gYVswXTsgZnkgPSBhWzRdOworICAgIGsxID0ga1swXTsgazIgPSBrWzFdOyBrMyA9IGtbNF07CisgICAgcDEgPSBrWzJdOyBwMiA9IGtbM107CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKF9tYXB4KTsKKworICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGZsb2F0KiBtYXB4ID0gKGZsb2F0KikoX21hcHgtPmRhdGEucHRyICsgX21hcHgtPnN0ZXAqaSk7CisgICAgICAgIGZsb2F0KiBtYXB5ID0gKGZsb2F0KikoX21hcHktPmRhdGEucHRyICsgX21hcHktPnN0ZXAqaSk7CisgICAgICAgIGRvdWJsZSBfeCA9IGkqaXJbMV0gKyBpclsyXSwgX3kgPSBpKmlyWzRdICsgaXJbNV0sIF93ID0gaSppcls3XSArIGlyWzhdOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKyssIF94ICs9IGlyWzBdLCBfeSArPSBpclszXSwgX3cgKz0gaXJbNl0gKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdyA9IDEuL193LCB4ID0gX3gqdywgeSA9IF95Knc7CisgICAgICAgICAgICBkb3VibGUgeDIgPSB4KngsIHkyID0geSp5OworICAgICAgICAgICAgZG91YmxlIHIyID0geDIgKyB5MiwgXzJ4eSA9IDIqeCp5OworICAgICAgICAgICAgZG91YmxlIGtyID0gMSArICgoazMqcjIgKyBrMikqcjIgKyBrMSkqcjI7CisgICAgICAgICAgICBkb3VibGUgdSA9IGZ4Kih4KmtyICsgcDEqXzJ4eSArIHAyKihyMiArIDIqeDIpKSArIHUwOworICAgICAgICAgICAgZG91YmxlIHYgPSBmeSooeSprciArIHAxKihyMiArIDIqeTIpICsgcDIqXzJ4eSkgKyB2MDsgCisgICAgICAgICAgICBtYXB4W2pdID0gKGZsb2F0KXU7CisgICAgICAgICAgICBtYXB5W2pdID0gKGZsb2F0KXY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQKK2N2VW5kaXN0b3J0UG9pbnRzKCBjb25zdCBDdk1hdCogX3NyYywgQ3ZNYXQqIF9kc3QsIGNvbnN0IEN2TWF0KiBfY2FtZXJhTWF0cml4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfZGlzdENvZWZmcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX1IsIGNvbnN0IEN2TWF0KiBfUCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlVuZGlzdG9ydFBvaW50cyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBBWzNdWzNdLCBSUlszXVszXSwga1s1XT17MCwwLDAsMCwwfSwgZngsIGZ5LCBpZngsIGlmeSwgY3gsIGN5OworICAgIEN2TWF0IF9BPWN2TWF0KDMsIDMsIENWXzY0RiwgQSksIF9EazsKKyAgICBDdk1hdCBfUlI9Y3ZNYXQoMywgMywgQ1ZfNjRGLCBSUik7CisgICAgY29uc3QgQ3ZQb2ludDJEMzJmKiBzcmNmOworICAgIGNvbnN0IEN2UG9pbnQyRDY0Ziogc3JjZDsKKyAgICBDdlBvaW50MkQzMmYqIGRzdGY7CisgICAgQ3ZQb2ludDJENjRmKiBkc3RkOworICAgIGludCBzdHlwZSwgZHR5cGU7CisgICAgaW50IHNzdGVwLCBkc3RlcDsKKyAgICBpbnQgaSwgaiwgbjsKKworICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKF9zcmMpICYmIENWX0lTX01BVChfZHN0KSAmJgorICAgICAgICAoX3NyYy0+cm93cyA9PSAxIHx8IF9zcmMtPmNvbHMgPT0gMSkgJiYKKyAgICAgICAgKF9kc3QtPnJvd3MgPT0gMSB8fCBfZHN0LT5jb2xzID09IDEpICYmCisgICAgICAgIENWX0FSRV9TSVpFU19FUShfc3JjLCBfZHN0KSAmJgorICAgICAgICAoQ1ZfTUFUX1RZUEUoX3NyYy0+dHlwZSkgPT0gQ1ZfMzJGQzIgfHwgQ1ZfTUFUX1RZUEUoX3NyYy0+dHlwZSkgPT0gQ1ZfNjRGQzIpICYmCisgICAgICAgIChDVl9NQVRfVFlQRShfZHN0LT50eXBlKSA9PSBDVl8zMkZDMiB8fCBDVl9NQVRfVFlQRShfZHN0LT50eXBlKSA9PSBDVl82NEZDMikpOworCisgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQoX2NhbWVyYU1hdHJpeCkgJiYgQ1ZfSVNfTUFUKF9kaXN0Q29lZmZzKSAmJgorICAgICAgICBfY2FtZXJhTWF0cml4LT5yb3dzID09IDMgJiYgX2NhbWVyYU1hdHJpeC0+Y29scyA9PSAzICYmCisgICAgICAgIChfZGlzdENvZWZmcy0+cm93cyA9PSAxIHx8IF9kaXN0Q29lZmZzLT5jb2xzID09IDEpICYmCisgICAgICAgIChfZGlzdENvZWZmcy0+cm93cypfZGlzdENvZWZmcy0+Y29scyA9PSA0IHx8CisgICAgICAgIF9kaXN0Q29lZmZzLT5yb3dzKl9kaXN0Q29lZmZzLT5jb2xzID09IDUpICk7CisgICAgX0RrID0gY3ZNYXQoIF9kaXN0Q29lZmZzLT5yb3dzLCBfZGlzdENvZWZmcy0+Y29scywKKyAgICAgICAgQ1ZfTUFLRVRZUEUoQ1ZfNjRGLENWX01BVF9DTihfZGlzdENvZWZmcy0+dHlwZSkpLCBrKTsKKyAgICBjdkNvbnZlcnQoIF9jYW1lcmFNYXRyaXgsICZfQSApOworICAgIGN2Q29udmVydCggX2Rpc3RDb2VmZnMsICZfRGsgKTsKKworICAgIGlmKCBfUiApCisgICAgeworICAgICAgICBDVl9BU1NFUlQoIENWX0lTX01BVChfUikgJiYgX1ItPnJvd3MgPT0gMyAmJiBfUi0+Y29scyA9PSAzICk7CisgICAgICAgIGN2Q29udmVydCggX1IsICZfUlIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjdlNldElkZW50aXR5KCZfUlIpOworCisgICAgaWYoIF9QICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBQUFszXVszXTsKKyAgICAgICAgQ3ZNYXQgX1AzeDMsIF9QUD1jdk1hdCgzLCAzLCBDVl82NEYsIFBQKTsKKyAgICAgICAgQ1ZfQVNTRVJUKCBDVl9JU19NQVQoX1ApICYmIF9QLT5yb3dzID09IDMgJiYgKF9QLT5jb2xzID09IDMgfHwgX1AtPmNvbHMgPT0gNCkpOworICAgICAgICBjdkNvbnZlcnQoIGN2R2V0Q29scyhfUCwgJl9QM3gzLCAwLCAzKSwgJl9QUCApOworICAgICAgICBjdk1hdE11bCggJl9QUCwgJl9SUiwgJl9SUiApOworICAgIH0KKyAgICAKKyAgICBzcmNmID0gKGNvbnN0IEN2UG9pbnQyRDMyZiopX3NyYy0+ZGF0YS5wdHI7CisgICAgc3JjZCA9IChjb25zdCBDdlBvaW50MkQ2NGYqKV9zcmMtPmRhdGEucHRyOworICAgIGRzdGYgPSAoQ3ZQb2ludDJEMzJmKilfZHN0LT5kYXRhLnB0cjsKKyAgICBkc3RkID0gKEN2UG9pbnQyRDY0ZiopX2RzdC0+ZGF0YS5wdHI7CisgICAgc3R5cGUgPSBDVl9NQVRfVFlQRShfc3JjLT50eXBlKTsKKyAgICBkdHlwZSA9IENWX01BVF9UWVBFKF9kc3QtPnR5cGUpOworICAgIHNzdGVwID0gX3NyYy0+cm93cyA9PSAxID8gMSA6IF9zcmMtPnN0ZXAvQ1ZfRUxFTV9TSVpFKHN0eXBlKTsKKyAgICBkc3RlcCA9IF9kc3QtPnJvd3MgPT0gMSA/IDEgOiBfZHN0LT5zdGVwL0NWX0VMRU1fU0laRShkdHlwZSk7CisgICAgCisgICAgbiA9IF9zcmMtPnJvd3MgKyBfc3JjLT5jb2xzIC0gMTsKKworICAgIGZ4ID0gQVswXVswXTsKKyAgICBmeSA9IEFbMV1bMV07CisgICAgaWZ4ID0gMS4vZng7CisgICAgaWZ5ID0gMS4vZnk7CisgICAgY3ggPSBBWzBdWzJdOworICAgIGN5ID0gQVsxXVsyXTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHgsIHksIHgwLCB5MDsKKyAgICAgICAgaWYoIHN0eXBlID09IENWXzMyRkMyICkKKyAgICAgICAgeworICAgICAgICAgICAgeCA9IHNyY2ZbaSpzc3RlcF0ueDsKKyAgICAgICAgICAgIHkgPSBzcmNmW2kqc3N0ZXBdLnk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB4ID0gc3JjZFtpKnNzdGVwXS54OworICAgICAgICAgICAgeSA9IHNyY2RbaSpzc3RlcF0ueTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgeDAgPSB4ID0gKHggLSBjeCkqaWZ4OworICAgICAgICB5MCA9IHkgPSAoeSAtIGN5KSppZnk7CisKKyAgICAgICAgLy8gY29tcGVuc2F0ZSBkaXN0b3J0aW9uIGl0ZXJhdGl2ZWx5CisgICAgICAgIGZvciggaiA9IDA7IGogPCA1OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgcjIgPSB4KnggKyB5Knk7CisgICAgICAgICAgICBkb3VibGUgaWNkaXN0ID0gMS4vKDEgKyAoKGtbNF0qcjIgKyBrWzFdKSpyMiArIGtbMF0pKnIyKTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YVggPSAyKmtbMl0qeCp5ICsga1szXSoocjIgKyAyKngqeCk7CisgICAgICAgICAgICBkb3VibGUgZGVsdGFZID0ga1syXSoocjIgKyAyKnkqeSkgKyAyKmtbM10qeCp5OworICAgICAgICAgICAgeCA9ICh4MCAtIGRlbHRhWCkqaWNkaXN0OworICAgICAgICAgICAgeSA9ICh5MCAtIGRlbHRhWSkqaWNkaXN0OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBkb3VibGUgeHggPSBSUlswXVswXSp4ICsgUlJbMF1bMV0qeSArIFJSWzBdWzJdOworICAgICAgICBkb3VibGUgeXkgPSBSUlsxXVswXSp4ICsgUlJbMV1bMV0qeSArIFJSWzFdWzJdOworICAgICAgICBkb3VibGUgd3cgPSAxLi8oUlJbMl1bMF0qeCArIFJSWzJdWzFdKnkgKyBSUlsyXVsyXSk7CisgICAgICAgIHggPSB4eCp3dzsKKyAgICAgICAgeSA9IHl5Knd3OworCisgICAgICAgIGlmKCBkdHlwZSA9PSBDVl8zMkZDMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdGZbaSpkc3RlcF0ueCA9IChmbG9hdCl4OworICAgICAgICAgICAgZHN0ZltpKmRzdGVwXS55ID0gKGZsb2F0KXk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkc3RkW2kqZHN0ZXBdLnggPSB4OworICAgICAgICAgICAgZHN0ZFtpKmRzdGVwXS55ID0geTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qICBFbmQgb2YgZmlsZSAgKi8KZGlmZiAtLWdpdCBhL2N2L3NyYy9jdnV0aWxzLmNwcCBiL2N2L3NyYy9jdnV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODhiMzA5Ci0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL2N2dXRpbHMuY3BwCkBAIC0wLDAgKzEsNTQwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdi5oIgorCitDVl9JTVBMIEN2U2VxKiBjdlBvaW50U2VxRnJvbU1hdCggaW50IHNlcV9raW5kLCBjb25zdCBDdkFyciogYXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Q29udG91ciogY29udG91cl9oZWFkZXIsIEN2U2VxQmxvY2sqIGJsb2NrICkKK3sKKyAgICBDdlNlcSogY29udG91ciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UG9pbnRTZXFGcm9tTWF0IiApOworCisgICAgYXNzZXJ0KCBhcnIgIT0gMCAmJiBjb250b3VyX2hlYWRlciAhPSAwICYmIGJsb2NrICE9IDAgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpbnQgZWx0eXBlOworICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVCggbWF0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnB1dCBhcnJheSBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7IAorCisgICAgZWx0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworICAgIGlmKCBlbHR5cGUgIT0gQ1ZfMzJTQzIgJiYgZWx0eXBlICE9IENWXzMyRkMyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGhlIG1hdHJpeCBjYW4gbm90IGJlIGNvbnZlcnRlZCB0byBwb2ludCBzZXF1ZW5jZSBiZWNhdXNlIG9mICIKKyAgICAgICAgImluYXBwcm9wcmlhdGUgZWxlbWVudCB0eXBlIiApOworCisgICAgaWYoIChtYXQtPndpZHRoICE9IDEgJiYgbWF0LT5oZWlnaHQgIT0gMSkgfHwgIUNWX0lTX01BVF9DT05UKG1hdC0+dHlwZSkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJUaGUgbWF0cml4IGNvbnZlcnRlZCB0byBwb2ludCBzZXF1ZW5jZSBtdXN0IGJlICIKKyAgICAgICAgIjEtZGltZW5zaW9uYWwgYW5kIGNvbnRpbnVvdXMiICk7CisKKyAgICBDVl9DQUxMKCBjdk1ha2VTZXFIZWFkZXJGb3JBcnJheSgKKyAgICAgICAgICAgIChzZXFfa2luZCAmIChDVl9TRVFfS0lORF9NQVNLfENWX1NFUV9GTEFHX0NMT1NFRCkpIHwgZWx0eXBlLAorICAgICAgICAgICAgc2l6ZW9mKEN2Q29udG91ciksIENWX0VMRU1fU0laRShlbHR5cGUpLCBtYXQtPmRhdGEucHRyLAorICAgICAgICAgICAgbWF0LT53aWR0aCptYXQtPmhlaWdodCwgKEN2U2VxKiljb250b3VyX2hlYWRlciwgYmxvY2sgKSk7CisKKyAgICBjb250b3VyID0gKEN2U2VxKiljb250b3VyX2hlYWRlcjsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gY29udG91cjsKK30KKworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZDb3B5Tm9uQ29uc3RCb3JkZXJGdW5jKSgKKyAgICBjb25zdCB2b2lkKiwgaW50LCBDdlNpemUsIHZvaWQqLCBpbnQsIEN2U2l6ZSwgaW50LCBpbnQgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2Q29weU5vbkNvbnN0Qm9yZGVyRnVuY0kpKAorICAgIGNvbnN0IHZvaWQqLCBpbnQsIEN2U2l6ZSwgQ3ZTaXplLCBpbnQsIGludCApOworCitpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1X0MxUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHVfQzFSX3AgPSAwOworaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzFSX3QgaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzFSX3AgPSAwOworaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dV9DM1JfdCBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1X0MzUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0MxUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0MxUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0MzUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0MzUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0M0Ul90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0M0Ul9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0MzUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0MzUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0M0Ul90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0M0Ul9wID0gMDsKKworaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dV9DMUlSX3QgaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dV9DMUlSX3AgPSAwOworaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzFJUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0MxSVJfcCA9IDA7CitpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1X0MzSVJfdCBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzh1X0MzSVJfcCA9IDA7CitpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzMyc19DMUlSX3QgaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8zMnNfQzFJUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0MzSVJfdCBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzE2c19DM0lSX3AgPSAwOworaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzRJUl90IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0M0SVJfcCA9IDA7CitpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzMyc19DM0lSX3QgaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8zMnNfQzNJUl9wID0gMDsKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0M0SVJfdCBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzMyc19DNElSX3AgPSAwOworCisKK0N2U3RhdHVzIENWX1NURENBTEwKK2ljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHUoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3Jjcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc3Ryb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdG9wLCBpbnQgbGVmdCwgaW50IGNuLCBjb25zdCB1Y2hhciogKQoreworICAgIGNvbnN0IGludCBpc3ogPSAoaW50KXNpemVvZihpbnQpOworICAgIGludCBpLCBqOworCisgICAgaWYoIHNyY3N0ZXAgPT0gZHN0c3RlcCAmJiBkc3QgKyBkc3RzdGVwKnRvcCArIGxlZnQqY24gPT0gc3JjICYmCisgICAgICAgIGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHVfQzFJUl9wICkKKyAgICB7CisgICAgICAgIEN2Q29weU5vbkNvbnN0Qm9yZGVyRnVuY0kgaWZ1bmMgPQorICAgICAgICAgICAgICAgY24gPT0gMSA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHVfQzFJUl9wIDoKKyAgICAgICAgICAgICAgIGNuID09IDIgPyBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzE2c19DMUlSX3AgOgorICAgICAgICAgICAgICAgY24gPT0gMyA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHVfQzNJUl9wIDoKKyAgICAgICAgICAgICAgIGNuID09IDQgPyBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzMyc19DMUlSX3AgOgorICAgICAgICAgICAgICAgY24gPT0gNiA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMTZzX0MzSVJfcCA6CisgICAgICAgICAgICAgICBjbiA9PSA4ID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzRJUl9wIDoKKyAgICAgICAgICAgICAgIGNuID09IDEyID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8zMnNfQzNJUl9wIDoKKyAgICAgICAgICAgICAgIGNuID09IDE2ID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8zMnNfQzRJUl9wIDogMDsKKworICAgICAgICBpZiggaWZ1bmMgKQorICAgICAgICAgICAgcmV0dXJuIGlmdW5jKCBzcmMsIHNyY3N0ZXAsIHNyY3JvaSwgZHN0cm9pLCB0b3AsIGxlZnQgKTsKKyAgICB9CisgICAgZWxzZSBpZiggaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dV9DMVJfcCApCisgICAgeworICAgICAgICBDdkNvcHlOb25Db25zdEJvcmRlckZ1bmMgZnVuYyA9CisgICAgICAgICAgICAgICBjbiA9PSAxID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dV9DMVJfcCA6CisgICAgICAgICAgICAgICBjbiA9PSAyID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzFSX3AgOgorICAgICAgICAgICAgICAgY24gPT0gMyA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfOHVfQzNSX3AgOgorICAgICAgICAgICAgICAgY24gPT0gNCA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0MxUl9wIDoKKyAgICAgICAgICAgICAgIGNuID09IDYgPyBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzE2c19DM1JfcCA6CisgICAgICAgICAgICAgICBjbiA9PSA4ID8gaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl8xNnNfQzRSX3AgOgorICAgICAgICAgICAgICAgY24gPT0gMTIgPyBpY3ZDb3B5UmVwbGljYXRlQm9yZGVyXzMyc19DM1JfcCA6CisgICAgICAgICAgICAgICBjbiA9PSAxNiA/IGljdkNvcHlSZXBsaWNhdGVCb3JkZXJfMzJzX0M0Ul9wIDogMDsKKworICAgICAgICBpZiggZnVuYyApCisgICAgICAgICAgICByZXR1cm4gZnVuYyggc3JjLCBzcmNzdGVwLCBzcmNyb2ksIGRzdCwgZHN0c3RlcCwgZHN0cm9pLCB0b3AsIGxlZnQgKTsKKyAgICB9CisKKyAgICBpZiggKGNuIHwgc3Jjc3RlcCB8IGRzdHN0ZXAgfCAoc2l6ZV90KXNyYyB8IChzaXplX3QpZHN0KSAlIGlzeiA9PSAwICkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCogaXNyYyA9IChjb25zdCBpbnQqKXNyYzsKKyAgICAgICAgaW50KiBpZHN0ID0gKGludCopZHN0OworICAgICAgICAKKyAgICAgICAgY24gLz0gaXN6OworICAgICAgICBzcmNzdGVwIC89IGlzejsKKyAgICAgICAgZHN0c3RlcCAvPSBpc3o7CisKKyAgICAgICAgc3Jjcm9pLndpZHRoICo9IGNuOworICAgICAgICBkc3Ryb2kud2lkdGggKj0gY247CisgICAgICAgIGxlZnQgKj0gY247CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRzdHJvaS5oZWlnaHQ7IGkrKywgaWRzdCArPSBkc3RzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlkc3QgKyBsZWZ0ICE9IGlzcmMgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzcmNyb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlkc3RbaiArIGxlZnRdID0gaXNyY1tqXTsKKyAgICAgICAgICAgIGZvciggaiA9IGxlZnQgLSAxOyBqID49IDA7IGotLSApCisgICAgICAgICAgICAgICAgaWRzdFtqXSA9IGlkc3RbaiArIGNuXTsKKyAgICAgICAgICAgIGZvciggaiA9IGxlZnQrc3Jjcm9pLndpZHRoOyBqIDwgZHN0cm9pLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgIGlkc3Rbal0gPSBpZHN0W2ogLSBjbl07CisgICAgICAgICAgICBpZiggaSA+PSB0b3AgJiYgaSA8IHRvcCArIHNyY3JvaS5oZWlnaHQgLSAxICkKKyAgICAgICAgICAgICAgICBpc3JjICs9IHNyY3N0ZXA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3Jjcm9pLndpZHRoICo9IGNuOworICAgICAgICBkc3Ryb2kud2lkdGggKj0gY247CisgICAgICAgIGxlZnQgKj0gY247CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRzdHJvaS5oZWlnaHQ7IGkrKywgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZHN0ICsgbGVmdCAhPSBzcmMgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzcmNyb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRzdFtqICsgbGVmdF0gPSBzcmNbal07CisgICAgICAgICAgICBmb3IoIGogPSBsZWZ0IC0gMTsgaiA+PSAwOyBqLS0gKQorICAgICAgICAgICAgICAgIGRzdFtqXSA9IGRzdFtqICsgY25dOworICAgICAgICAgICAgZm9yKCBqID0gbGVmdCtzcmNyb2kud2lkdGg7IGogPCBkc3Ryb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgZHN0W2pdID0gZHN0W2ogLSBjbl07CisgICAgICAgICAgICBpZiggaSA+PSB0b3AgJiYgaSA8IHRvcCArIHNyY3JvaS5oZWlnaHQgLSAxICkKKyAgICAgICAgICAgICAgICBzcmMgKz0gc3Jjc3RlcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2Q29weVJlZmxlY3QxMDFCb3JkZXJfOHUoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc3Jjcm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgZHN0cm9pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsIGludCBsZWZ0LCBpbnQgY24gKQoreworICAgIGNvbnN0IGludCBpc3ogPSAoaW50KXNpemVvZihpbnQpOworICAgIGludCBpLCBqLCBrLCB0LCBkaiwgdGFiX3NpemUsIGludF9tb2RlID0gMDsKKyAgICBjb25zdCBpbnQqIGlzcmMgPSAoY29uc3QgaW50KilzcmM7CisgICAgaW50KiBpZHN0ID0gKGludCopZHN0LCAqdGFiOworCisgICAgaWYoIChjbiB8IHNyY3N0ZXAgfCBkc3RzdGVwIHwgKHNpemVfdClzcmMgfCAoc2l6ZV90KWRzdCkgJSBpc3ogPT0gMCApCisgICAgeworICAgICAgICBjbiAvPSBpc3o7CisgICAgICAgIHNyY3N0ZXAgLz0gaXN6OworICAgICAgICBkc3RzdGVwIC89IGlzejsKKworICAgICAgICBpbnRfbW9kZSA9IDE7CisgICAgfQorCisgICAgc3Jjcm9pLndpZHRoICo9IGNuOworICAgIGRzdHJvaS53aWR0aCAqPSBjbjsKKyAgICBsZWZ0ICo9IGNuOworCisgICAgdGFiX3NpemUgPSBkc3Ryb2kud2lkdGggLSBzcmNyb2kud2lkdGg7CisgICAgdGFiID0gKGludCopY3ZTdGFja0FsbG9jKCB0YWJfc2l6ZSpzaXplb2YodGFiWzBdKSApOworCisgICAgaWYoIHNyY3JvaS53aWR0aCA9PSAxICkKKyAgICB7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0YWJfc2l6ZTsgaSArPSBjbiApCisgICAgICAgICAgICAgICAgdGFiW2kgKyBrXSA9IGsgKyBsZWZ0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBqID0gZGogPSBjbjsKKyAgICAgICAgZm9yKCBpID0gbGVmdCAtIGNuOyBpID49IDA7IGkgLT0gY24gKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKyApCisgICAgICAgICAgICAgICAgdGFiW2kgKyBrXSA9IGogKyBrICsgbGVmdDsKKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpKGogKz0gZGopID49ICh1bnNpZ25lZClzcmNyb2kud2lkdGggKQorICAgICAgICAgICAgICAgIGogLT0gMipkaiwgZGogPSAtZGo7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGogPSBzcmNyb2kud2lkdGggLSBjbioyOworICAgICAgICBkaiA9IC1jbjsKKyAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8IHRhYl9zaXplOyBpICs9IGNuICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKQorICAgICAgICAgICAgICAgIHRhYltpICsga10gPSBqICsgayArIGxlZnQ7CisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKShqICs9IGRqKSA+PSAodW5zaWduZWQpc3Jjcm9pLndpZHRoICkKKyAgICAgICAgICAgICAgICBqIC09IDIqZGosIGRqID0gLWRqOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGludF9tb2RlICkKKyAgICB7CisgICAgICAgIGlkc3QgKz0gdG9wKmRzdHN0ZXA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzcmNyb2kuaGVpZ2h0OyBpKyssIGlzcmMgKz0gc3Jjc3RlcCwgaWRzdCArPSBkc3RzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlkc3QgKyBsZWZ0ICE9IGlzcmMgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzcmNyb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlkc3RbaiArIGxlZnRdID0gaXNyY1tqXTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBsZWZ0OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSB0YWJbal07IAorICAgICAgICAgICAgICAgIGlkc3Rbal0gPSBpZHN0W2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCA7IGogPCB0YWJfc2l6ZTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrID0gdGFiW2pdOworICAgICAgICAgICAgICAgIGlkc3RbaiArIHNyY3JvaS53aWR0aF0gPSBpZHN0W2tdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlzcmMgLT0gc3Jjcm9pLmhlaWdodCpzcmNzdGVwOworICAgICAgICBpZHN0IC09ICh0b3AgLSBzcmNyb2kuaGVpZ2h0KSpkc3RzdGVwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkc3QgKz0gdG9wKmRzdHN0ZXA7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzcmNyb2kuaGVpZ2h0OyBpKyssIHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkc3QgKyBsZWZ0ICE9IHNyYyApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNyY3JvaS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ogKyBsZWZ0XSA9IHNyY1tqXTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBsZWZ0OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSB0YWJbal07IAorICAgICAgICAgICAgICAgIGRzdFtqXSA9IGRzdFtrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciggOyBqIDwgdGFiX3NpemU7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgayA9IHRhYltqXTsKKyAgICAgICAgICAgICAgICBkc3RbaiArIHNyY3JvaS53aWR0aF0gPSBkc3Rba107CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3JjIC09IHNyY3JvaS5oZWlnaHQqc3Jjc3RlcDsKKyAgICAgICAgZHN0IC09ICh0b3AgLSBzcmNyb2kuaGVpZ2h0KSpkc3RzdGVwOworICAgIH0KKworICAgIGZvciggdCA9IDA7IHQgPCAyOyB0KysgKQorICAgIHsKKyAgICAgICAgaW50IGkxLCBpMiwgZGk7CisgICAgICAgIGlmKCB0ID09IDAgKQorICAgICAgICAgICAgaTEgPSB0b3AtMSwgaTIgPSAwLCBkaSA9IC0xLCBqID0gMSwgZGogPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpMSA9IHRvcCtzcmNyb2kuaGVpZ2h0LCBpMj1kc3Ryb2kuaGVpZ2h0LCBkaSA9IDEsIGogPSBzcmNyb2kuaGVpZ2h0LTIsIGRqID0gLTE7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSBpMTsgaSAhPSBpMjsgaSArPSBkaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpbnRfbW9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzID0gaWRzdCArIGkqZHN0c3RlcDsKKyAgICAgICAgICAgICAgICBpbnQqIGQgPSBpZHN0ICsgKGordG9wKSpkc3RzdGVwOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkc3Ryb2kud2lkdGg7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIGRba10gPSBzW2tdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzID0gZHN0ICsgaSpkc3RzdGVwOworICAgICAgICAgICAgICAgIHVjaGFyKiBkID0gZHN0ICsgKGordG9wKSpkc3RzdGVwOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBkc3Ryb2kud2lkdGg7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIGRba10gPSBzW2tdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKShqICs9IGRqKSA+PSAodW5zaWduZWQpc3Jjcm9pLmhlaWdodCApCisgICAgICAgICAgICAgICAgaiAtPSAyKmRqLCBkaiA9IC1kajsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2Q29weUNvbnN0Qm9yZGVyXzh1KCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgQ3ZTaXplIHNyY3JvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBkc3Ryb2ksCisgICAgICAgICAgICAgICAgICAgICAgIGludCB0b3AsIGludCBsZWZ0LCBpbnQgY24sIGNvbnN0IHVjaGFyKiB2YWx1ZSApCit7CisgICAgY29uc3QgaW50IGlzeiA9IChpbnQpc2l6ZW9mKGludCk7CisgICAgaW50IGksIGosIGs7CisgICAgaWYoIChjbiB8IHNyY3N0ZXAgfCBkc3RzdGVwIHwgKHNpemVfdClzcmMgfCAoc2l6ZV90KWRzdCB8IChzaXplX3QpdmFsdWUpICUgaXN6ID09IDAgKQorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBpc3JjID0gKGNvbnN0IGludCopc3JjOworICAgICAgICBpbnQqIGlkc3QgPSAoaW50Kilkc3Q7CisgICAgICAgIGNvbnN0IGludCogaXZhbHVlID0gKGNvbnN0IGludCopdmFsdWU7CisgICAgICAgIGludCB2MCA9IGl2YWx1ZVswXTsKKyAgICAgICAgCisgICAgICAgIGNuIC89IGlzejsKKyAgICAgICAgc3Jjc3RlcCAvPSBpc3o7CisgICAgICAgIGRzdHN0ZXAgLz0gaXN6OworCisgICAgICAgIHNyY3JvaS53aWR0aCAqPSBjbjsKKyAgICAgICAgZHN0cm9pLndpZHRoICo9IGNuOworICAgICAgICBsZWZ0ICo9IGNuOworCisgICAgICAgIGZvciggaiA9IDE7IGogPCBjbjsgaisrICkKKyAgICAgICAgICAgIGlmKCBpdmFsdWVbal0gIT0gaXZhbHVlWzBdICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggaiA9PSBjbiApCisgICAgICAgICAgICBjbiA9IDE7CisKKyAgICAgICAgaWYoIGRzdHJvaS53aWR0aCA8PSAwICkKKyAgICAgICAgICAgIHJldHVybiBDVl9PSzsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHN0cm9pLmhlaWdodDsgaSsrLCBpZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaSA8IHRvcCB8fCBpID49IHRvcCArIHNyY3JvaS5oZWlnaHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkc3Ryb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBpZHN0W2pdID0gdjA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjbjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkc3Rbal0gPSBpdmFsdWVbal07CisgICAgICAgICAgICAgICAgICAgIGZvciggOyBqIDwgZHN0cm9pLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWRzdFtqXSA9IGlkc3RbaiAtIGNuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbGVmdDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgaWRzdFtqXSA9IHYwOworICAgICAgICAgICAgICAgIGZvciggaiA9IHNyY3JvaS53aWR0aCArIGxlZnQ7IGogPCBkc3Ryb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlkc3Rbal0gPSB2MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbGVmdDsgaiArPSBjbiApCisgICAgICAgICAgICAgICAgICAgICAgICBpZHN0W2ora10gPSBpdmFsdWVba107CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IHNyY3JvaS53aWR0aCArIGxlZnQ7IGogPCBkc3Ryb2kud2lkdGg7IGogKz0gY24gKQorICAgICAgICAgICAgICAgICAgICAgICAgaWRzdFtqK2tdID0gaXZhbHVlW2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGlkc3QgKyBsZWZ0ICE9IGlzcmMgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzcmNyb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGlkc3RbaiArIGxlZnRdID0gaXNyY1tqXTsKKyAgICAgICAgICAgIGlzcmMgKz0gc3Jjc3RlcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1Y2hhciB2MCA9IHZhbHVlWzBdOworICAgICAgICAKKyAgICAgICAgc3Jjcm9pLndpZHRoICo9IGNuOworICAgICAgICBkc3Ryb2kud2lkdGggKj0gY247CisgICAgICAgIGxlZnQgKj0gY247CisKKyAgICAgICAgZm9yKCBqID0gMTsgaiA8IGNuOyBqKysgKQorICAgICAgICAgICAgaWYoIHZhbHVlW2pdICE9IHZhbHVlWzBdICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggaiA9PSBjbiApCisgICAgICAgICAgICBjbiA9IDE7CisKKyAgICAgICAgaWYoIGRzdHJvaS53aWR0aCA8PSAwICkKKyAgICAgICAgICAgIHJldHVybiBDVl9PSzsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHN0cm9pLmhlaWdodDsgaSsrLCBkc3QgKz0gZHN0c3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpIDwgdG9wIHx8IGkgPj0gdG9wICsgc3Jjcm9pLmhlaWdodCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGNuID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRzdHJvaS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IHYwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY247IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rbal0gPSB2YWx1ZVtqXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGogPCBkc3Ryb2kud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3Rbal0gPSBkc3RbaiAtIGNuXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbGVmdDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gdjA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gc3Jjcm9pLndpZHRoICsgbGVmdDsgaiA8IGRzdHJvaS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gdjA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNuOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGxlZnQ7IGogKz0gY24gKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2ora10gPSB2YWx1ZVtrXTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gc3Jjcm9pLndpZHRoICsgbGVmdDsgaiA8IGRzdHJvaS53aWR0aDsgaiArPSBjbiApCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RbaitrXSA9IHZhbHVlW2tdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGRzdCArIGxlZnQgIT0gc3JjICkKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc3Jjcm9pLndpZHRoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBkc3RbaiArIGxlZnRdID0gc3JjW2pdOworICAgICAgICAgICAgc3JjICs9IHNyY3N0ZXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkNvcHlNYWtlQm9yZGVyKCBjb25zdCBDdkFyciogc3JjYXJyLCBDdkFyciogZHN0YXJyLCBDdlBvaW50IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGludCBib3JkZXJ0eXBlLCBDdlNjYWxhciB2YWx1ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvcHlNYWtlQm9yZGVyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc3Jjc2l6ZSwgZHN0c2l6ZTsKKyAgICBpbnQgc3Jjc3RlcCwgZHN0c3RlcDsKKyAgICBpbnQgcGl4X3NpemUsIHR5cGU7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIgKSk7CisgICAgCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApICAgIAorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiApKTsKKworICAgIGlmKCBvZmZzZXQueCA8IDAgfHwgb2Zmc2V0LnkgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJPZmZzZXQgKGxlZnQvdG9wIGJvcmRlciB3aWR0aCkgaXMgbmVnYXRpdmUiICk7CisKKyAgICBpZiggc3JjLT5yb3dzICsgb2Zmc2V0LnkgPiBkc3QtPnJvd3MgfHwgc3JjLT5jb2xzICsgb2Zmc2V0LnggPiBkc3QtPmNvbHMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlNvdXJjZSBhcnJheSBpcyB0b28gYmlnIG9yIGRlc3RpbmF0aW9uIGFycmF5IGlzIHRvbyBzbWFsbCIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMtPnR5cGUpOworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgIHNyY3NpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBkc3RzaXplID0gY3ZHZXRNYXRTaXplKGRzdCk7CisgICAgc3Jjc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3RzdGVwID0gZHN0LT5zdGVwOworICAgIGlmKCBzcmNzdGVwID09IDAgKQorICAgICAgICBzcmNzdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgIGlmKCBkc3RzdGVwID09IDAgKQorICAgICAgICBkc3RzdGVwID0gQ1ZfU1RVQl9TVEVQOworCisgICAgaWYoIGJvcmRlcnR5cGUgPT0gSVBMX0JPUkRFUl9SRVBMSUNBVEUgKQorICAgIHsKKyAgICAgICAgaWN2Q29weVJlcGxpY2F0ZUJvcmRlcl84dSggc3JjLT5kYXRhLnB0ciwgc3Jjc3RlcCwgc3Jjc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0c3RlcCwgZHN0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LnksIG9mZnNldC54LCBwaXhfc2l6ZSApOworICAgIH0KKyAgICBlbHNlIGlmKCBib3JkZXJ0eXBlID09IElQTF9CT1JERVJfUkVGTEVDVF8xMDEgKQorICAgIHsKKyAgICAgICAgaWN2Q29weVJlZmxlY3QxMDFCb3JkZXJfOHUoIHNyYy0+ZGF0YS5wdHIsIHNyY3N0ZXAsIHNyY3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdHN0ZXAsIGRzdHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldC55LCBvZmZzZXQueCwgcGl4X3NpemUgKTsKKyAgICB9CisgICAgZWxzZSBpZiggYm9yZGVydHlwZSA9PSBJUExfQk9SREVSX0NPTlNUQU5UICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBidWZbNF07CisgICAgICAgIGN2U2NhbGFyVG9SYXdEYXRhKCAmdmFsdWUsIGJ1Ziwgc3JjLT50eXBlLCAwICk7CisgICAgICAgIGljdkNvcHlDb25zdEJvcmRlcl84dSggc3JjLT5kYXRhLnB0ciwgc3Jjc3RlcCwgc3Jjc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3RzdGVwLCBkc3RzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldC55LCBvZmZzZXQueCwgcGl4X3NpemUsICh1Y2hhciopYnVmICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJVbmtub3duL3Vuc3VwcG9ydGVkIGJvcmRlciB0eXBlIiApOworICAgIAorICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3Yvc3JjL215Y3ZIYWFyRGV0ZWN0T2JqZWN0cy5jcHAgYi9jdi9zcmMvbXljdkhhYXJEZXRlY3RPYmplY3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGI5NDZjCi0tLSAvZGV2L251bGwKKysrIGIvY3Yvc3JjL215Y3ZIYWFyRGV0ZWN0T2JqZWN0cy5jcHAKQEAgLTAsMCArMSwxNTcyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogSGFhciBmZWF0dXJlcyBjYWxjdWxhdGlvbiAqLworCisjaW5jbHVkZSAiX2N2LmgiCisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogdGhlc2Ugc2V0dGluZ3MgYWZmZWN0IHRoZSBxdWFsaXR5IG9mIGRldGVjdGlvbjogY2hhbmdlIHdpdGggY2FyZSAqLworI2RlZmluZSBDVl9BREpVU1RfRkVBVFVSRVMgMQorI2RlZmluZSBDVl9BREpVU1RfV0VJR0hUUyAgMQorCit0eXBlZGVmIGludCBzdW10eXBlOwordHlwZWRlZiBkb3VibGUgc3FzdW10eXBlOworCit0eXBlZGVmIHN0cnVjdCBNeUN2SGlkSGFhckZlYXR1cmUKKwl7CisJCXN0cnVjdAorCQl7CisJCQlzdW10eXBlICpwMCwgKnAxLCAqcDIsICpwMzsKKwkJCWludCB3ZWlnaHQ7CisJCX0KKwkJcmVjdFtDVl9IQUFSX0ZFQVRVUkVfTUFYXTsKKwl9CisJTXlDdkhpZEhhYXJGZWF0dXJlOworCisKK3R5cGVkZWYgc3RydWN0IE15Q3ZIaWRIYWFyVHJlZU5vZGUKKwl7CisJCU15Q3ZIaWRIYWFyRmVhdHVyZSBmZWF0dXJlOworCQlpbnQgdGhyZXNob2xkOworCQlpbnQgbGVmdDsKKwkJaW50IHJpZ2h0OworCX0KKwlNeUN2SGlkSGFhclRyZWVOb2RlOworCisKK3R5cGVkZWYgc3RydWN0IE15Q3ZIaWRIYWFyQ2xhc3NpZmllcgorCXsKKwkJaW50IGNvdW50OworCQkvL0N2SGFhckZlYXR1cmUqIG9yaWdfZmVhdHVyZTsKKwkJTXlDdkhpZEhhYXJUcmVlTm9kZSogbm9kZTsKKwkJZmxvYXQqIGFscGhhOworCX0KKwlNeUN2SGlkSGFhckNsYXNzaWZpZXI7CisKKwordHlwZWRlZiBzdHJ1Y3QgTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIKKwl7CisJCWludCAgY291bnQ7CisJCWZsb2F0IHRocmVzaG9sZDsKKwkJTXlDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyOworCQlpbnQgdHdvX3JlY3RzOworCQkKKwkJc3RydWN0IE15Q3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKiBuZXh0OworCQlzdHJ1Y3QgTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIqIGNoaWxkOworCQlzdHJ1Y3QgTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIqIHBhcmVudDsKKwl9CisJTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXI7CisKKworc3RydWN0IE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUKK3sKKyAgICBpbnQgIGNvdW50OworICAgIGludCAgaXNfc3R1bXBfYmFzZWQ7CisgICAgaW50ICBoYXNfdGlsdGVkX2ZlYXR1cmVzOworICAgIGludCAgaXNfdHJlZTsKKyAgICBkb3VibGUgaW52X3dpbmRvd19hcmVhOworICAgIEN2TWF0IHN1bSwgc3FzdW0sIHRpbHRlZDsKKyAgICBNeUN2SGlkSGFhclN0YWdlQ2xhc3NpZmllciogc3RhZ2VfY2xhc3NpZmllcjsKKyAgICBzcXN1bXR5cGUgKnBxMCwgKnBxMSwgKnBxMiwgKnBxMzsKKyAgICBzdW10eXBlICpwMCwgKnAxLCAqcDIsICpwMzsKKwkKKyAgICB2b2lkKiogaXBwX3N0YWdlczsKK307CisKKworY29uc3QgaW50IGljdl9vYmplY3Rfd2luX2JvcmRlciA9IDE7Citjb25zdCBmbG9hdCBpY3Zfc3RhZ2VfdGhyZXNob2xkX2JpYXMgPSAwLjAwMDFmOworCitzdGF0aWMgaW50IG15aXNfZXF1YWwoIGNvbnN0IHZvaWQqIF9yMSwgY29uc3Qgdm9pZCogX3IyLCB2b2lkKiApCit7CisgICAgY29uc3QgQ3ZSZWN0KiByMSA9IChjb25zdCBDdlJlY3QqKV9yMTsKKyAgICBjb25zdCBDdlJlY3QqIHIyID0gKGNvbnN0IEN2UmVjdCopX3IyOworICAgIGludCBkaXN0YW5jZSA9IGN2Um91bmQocjEtPndpZHRoKjAuMik7CisJCisgICAgcmV0dXJuIHIyLT54IDw9IHIxLT54ICsgZGlzdGFuY2UgJiYKKwlyMi0+eCA+PSByMS0+eCAtIGRpc3RhbmNlICYmCisJcjItPnkgPD0gcjEtPnkgKyBkaXN0YW5jZSAmJgorCXIyLT55ID49IHIxLT55IC0gZGlzdGFuY2UgJiYKKwlyMi0+d2lkdGggPD0gY3ZSb3VuZCggcjEtPndpZHRoICogMS4yICkgJiYKKwljdlJvdW5kKCByMi0+d2lkdGggKiAxLjIgKSA+PSByMS0+d2lkdGg7Cit9CisKK3N0YXRpYyB2b2lkCitteWljdlJlbGVhc2VIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUoIE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKiBfY2FzY2FkZSApCit7CisgICAgaWYoIF9jYXNjYWRlICYmICpfY2FzY2FkZSApCisgICAgeworICAgICAgICAvKkN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBjYXNjYWRlID0gKl9jYXNjYWRlOworCQkgaWYoIGNhc2NhZGUtPmlwcF9zdGFnZXMgJiYgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZl9wICkKKwkJIHsKKwkJIGludCBpOworCQkgZm9yKCBpID0gMDsgaSA8IGNhc2NhZGUtPmNvdW50OyBpKysgKQorCQkgeworCQkgaWYoIGNhc2NhZGUtPmlwcF9zdGFnZXNbaV0gKQorCQkgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZl9wKCBjYXNjYWRlLT5pcHBfc3RhZ2VzW2ldICk7CisJCSB9CisJCSB9CisJCSBjdkZyZWUoICZjYXNjYWRlLT5pcHBfc3RhZ2VzICk7Ki8KKyAgICAgICAgY3ZGcmVlKCBfY2FzY2FkZSApOworICAgIH0KK30KKworLyogY3JlYXRlIG1vcmUgZWZmaWNpZW50IGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIGhhYXIgY2xhc3NpZmllciBjYXNjYWRlICovCitzdGF0aWMgTXlDdkhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSoKK215aWN2Q3JlYXRlSGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSApCit7CisgICAgQ3ZSZWN0KiBpcHBfZmVhdHVyZXMgPSAwOworICAgIGZsb2F0ICppcHBfd2VpZ2h0cyA9IDAsICppcHBfdGhyZXNob2xkcyA9IDAsICppcHBfdmFsMSA9IDAsICppcHBfdmFsMiA9IDA7CisgICAgaW50KiBpcHBfY291bnRzID0gMDsKKwkKKyAgICBNeUN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiBvdXQgPSAwOworCQorICAgIENWX0ZVTkNOQU1FKCAiaWN2Q3JlYXRlSGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlIiApOworCQorICAgIF9fQkVHSU5fXzsKKwkKKyAgICBpbnQgaSwgaiwgaywgbDsKKyAgICBpbnQgZGF0YXNpemU7CisgICAgaW50IHRvdGFsX2NsYXNzaWZpZXJzID0gMDsKKyAgICBpbnQgdG90YWxfbm9kZXMgPSAwOworICAgIGNoYXIgZXJyb3JzdHJbMTAwXTsKKyAgICBNeUN2SGlkSGFhckNsYXNzaWZpZXIqIGhhYXJfY2xhc3NpZmllcl9wdHI7CisgICAgTXlDdkhpZEhhYXJUcmVlTm9kZSogaGFhcl9ub2RlX3B0cjsKKyAgICBDdlNpemUgb3JpZ193aW5kb3dfc2l6ZTsKKyAgICBpbnQgaGFzX3RpbHRlZF9mZWF0dXJlcyA9IDA7CisgICAgaW50IG1heF9jb3VudCA9IDA7CisJCisgICAgaWYoICFDVl9JU19IQUFSX0NMQVNTSUZJRVIoY2FzY2FkZSkgKQorICAgICAgICBDVl9FUlJPUiggIWNhc2NhZGUgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBjbGFzc2lmaWVyIHBvaW50ZXIiICk7CisJCisgICAgaWYoIGNhc2NhZGUtPmhpZF9jYXNjYWRlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiaGlkX2Nhc2NhZGUgaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkIiApOworCQorICAgIGlmKCAhY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCQorICAgIGlmKCBjYXNjYWRlLT5jb3VudCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOZWdhdGl2ZSBudW1iZXIgb2YgY2FzY2FkZSBzdGFnZXMiICk7CisJCisgICAgb3JpZ193aW5kb3dfc2l6ZSA9IGNhc2NhZGUtPm9yaWdfd2luZG93X3NpemU7CisJCisgICAgLyogY2hlY2sgaW5wdXQgc3RydWN0dXJlIGNvcnJlY3RuZXNzIGFuZCBjYWxjdWxhdGUgdG90YWwgbWVtb3J5IHNpemUgbmVlZGVkIGZvcgorCSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY2xhc3NpZmllciBjYXNjYWRlICovCisgICAgZm9yKCBpID0gMDsgaSA8IGNhc2NhZGUtPmNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZIYWFyU3RhZ2VDbGFzc2lmaWVyKiBzdGFnZV9jbGFzc2lmaWVyID0gY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllciArIGk7CisJCQorICAgICAgICBpZiggIXN0YWdlX2NsYXNzaWZpZXItPmNsYXNzaWZpZXIgfHwKKwkJICAgc3RhZ2VfY2xhc3NpZmllci0+Y291bnQgPD0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwcmludGYoIGVycm9yc3RyLCAiaGVhZGVyIG9mIHRoZSBzdGFnZSBjbGFzc2lmaWVyICMlZCBpcyBpbnZhbGlkICIKKwkJCQkJIihoYXMgbnVsbCBwb2ludGVycyBvciBub24tcG9zaXRpdmUgY2xhc3NmaWVyIGNvdW50KSIsIGkgKTsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgZXJyb3JzdHIgKTsKKyAgICAgICAgfQorCQkKKyAgICAgICAgbWF4X2NvdW50ID0gTUFYKCBtYXhfY291bnQsIHN0YWdlX2NsYXNzaWZpZXItPmNvdW50ICk7CisgICAgICAgIHRvdGFsX2NsYXNzaWZpZXJzICs9IHN0YWdlX2NsYXNzaWZpZXItPmNvdW50OworCQkKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHN0YWdlX2NsYXNzaWZpZXItPmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0gc3RhZ2VfY2xhc3NpZmllci0+Y2xhc3NpZmllciArIGo7CisJCQkKKyAgICAgICAgICAgIHRvdGFsX25vZGVzICs9IGNsYXNzaWZpZXItPmNvdW50OworICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IGNsYXNzaWZpZXItPmNvdW50OyBsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBDVl9IQUFSX0ZFQVRVUkVfTUFYOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS5yZWN0W2tdLnIud2lkdGggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgciA9IGNsYXNzaWZpZXItPmhhYXJfZmVhdHVyZVtsXS5yZWN0W2tdLnI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGlsdGVkID0gY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlW2xdLnRpbHRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc190aWx0ZWRfZmVhdHVyZXMgfD0gdGlsdGVkICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggci53aWR0aCA8IDAgfHwgci5oZWlnaHQgPCAwIHx8IHIueSA8IDAgfHwKKwkJCQkJCSAgIHIueCArIHIud2lkdGggPiBvcmlnX3dpbmRvd19zaXplLndpZHRoCisJCQkJCQkgICB8fAorCQkJCQkJICAgKCF0aWx0ZWQgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoci54IDwgMCB8fCByLnkgKyByLmhlaWdodCA+IG9yaWdfd2luZG93X3NpemUuaGVpZ2h0KSkKKwkJCQkJCSAgIHx8CisJCQkJCQkgICAodGlsdGVkICYmIChyLnggLSByLmhlaWdodCA8IDAgfHwKKwkJCQkJCQkJCSAgIHIueSArIHIud2lkdGggKyByLmhlaWdodCA+IG9yaWdfd2luZG93X3NpemUuaGVpZ2h0KSkpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggZXJyb3JzdHIsICJyZWN0YW5nbGUgIyVkIG9mIHRoZSBjbGFzc2lmaWVyICMlZCBvZiAiCisJCQkJCQkJCQkidGhlIHN0YWdlIGNsYXNzaWZpZXIgIyVkIGlzIG5vdCBpbnNpZGUgIgorCQkJCQkJCQkJInRoZSByZWZlcmVuY2UgKG9yaWdpbmFsKSBjYXNjYWRlIHdpbmRvdyIsIGssIGosIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgZXJyb3JzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkKKyAgICAvLyB0aGlzIGlzIGFuIHVwcGVyIGJvdW5kYXJ5IGZvciB0aGUgd2hvbGUgaGlkZGVuIGNhc2NhZGUgc2l6ZQorICAgIGRhdGFzaXplID0gc2l6ZW9mKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUpICsKKwlzaXplb2YoTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIpKmNhc2NhZGUtPmNvdW50ICsKKwlzaXplb2YoTXlDdkhpZEhhYXJDbGFzc2lmaWVyKSAqIHRvdGFsX2NsYXNzaWZpZXJzICsKKwlzaXplb2YoTXlDdkhpZEhhYXJUcmVlTm9kZSkgKiB0b3RhbF9ub2RlcyArCisJc2l6ZW9mKHZvaWQqKSoodG90YWxfbm9kZXMgKyB0b3RhbF9jbGFzc2lmaWVycyk7CisJCisgICAgQ1ZfQ0FMTCggb3V0ID0gKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKWN2QWxsb2MoIGRhdGFzaXplICkpOworICAgIG1lbXNldCggb3V0LCAwLCBzaXplb2YoKm91dCkgKTsKKwkKKyAgICAvKiBpbml0IGhlYWRlciAqLworICAgIG91dC0+Y291bnQgPSBjYXNjYWRlLT5jb3VudDsKKyAgICBvdXQtPnN0YWdlX2NsYXNzaWZpZXIgPSAoTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIqKShvdXQgKyAxKTsKKyAgICBoYWFyX2NsYXNzaWZpZXJfcHRyID0gKE15Q3ZIaWRIYWFyQ2xhc3NpZmllciopKG91dC0+c3RhZ2VfY2xhc3NpZmllciArIGNhc2NhZGUtPmNvdW50KTsKKyAgICBoYWFyX25vZGVfcHRyID0gKE15Q3ZIaWRIYWFyVHJlZU5vZGUqKShoYWFyX2NsYXNzaWZpZXJfcHRyICsgdG90YWxfY2xhc3NpZmllcnMpOworCQorICAgIG91dC0+aXNfc3R1bXBfYmFzZWQgPSAxOworICAgIG91dC0+aGFzX3RpbHRlZF9mZWF0dXJlcyA9IGhhc190aWx0ZWRfZmVhdHVyZXM7CisgICAgb3V0LT5pc190cmVlID0gMDsKKwkKKyAgICAvKiBpbml0aWFsaXplIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCisgICAgZm9yKCBpID0gMDsgaSA8IGNhc2NhZGUtPmNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZIYWFyU3RhZ2VDbGFzc2lmaWVyKiBzdGFnZV9jbGFzc2lmaWVyID0gY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllciArIGk7CisgICAgICAgIE15Q3ZIaWRIYWFyU3RhZ2VDbGFzc2lmaWVyKiBoaWRfc3RhZ2VfY2xhc3NpZmllciA9IG91dC0+c3RhZ2VfY2xhc3NpZmllciArIGk7CisJCQorICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+Y291bnQgPSBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsKKyAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPnRocmVzaG9sZCA9IHN0YWdlX2NsYXNzaWZpZXItPnRocmVzaG9sZCAtIGljdl9zdGFnZV90aHJlc2hvbGRfYmlhczsKKyAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPmNsYXNzaWZpZXIgPSBoYWFyX2NsYXNzaWZpZXJfcHRyOworICAgICAgICBoaWRfc3RhZ2VfY2xhc3NpZmllci0+dHdvX3JlY3RzID0gMTsKKyAgICAgICAgaGFhcl9jbGFzc2lmaWVyX3B0ciArPSBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsKKwkJCisgICAgICAgIGhpZF9zdGFnZV9jbGFzc2lmaWVyLT5wYXJlbnQgPSAoc3RhZ2VfY2xhc3NpZmllci0+cGFyZW50ID09IC0xKQorCQk/IE5VTEwgOiBvdXQtPnN0YWdlX2NsYXNzaWZpZXIgKyBzdGFnZV9jbGFzc2lmaWVyLT5wYXJlbnQ7CisgICAgICAgIGhpZF9zdGFnZV9jbGFzc2lmaWVyLT5uZXh0ID0gKHN0YWdlX2NsYXNzaWZpZXItPm5leHQgPT0gLTEpCisJCT8gTlVMTCA6IG91dC0+c3RhZ2VfY2xhc3NpZmllciArIHN0YWdlX2NsYXNzaWZpZXItPm5leHQ7CisgICAgICAgIGhpZF9zdGFnZV9jbGFzc2lmaWVyLT5jaGlsZCA9IChzdGFnZV9jbGFzc2lmaWVyLT5jaGlsZCA9PSAtMSkKKwkJPyBOVUxMIDogb3V0LT5zdGFnZV9jbGFzc2lmaWVyICsgc3RhZ2VfY2xhc3NpZmllci0+Y2hpbGQ7CisJCQorICAgICAgICBvdXQtPmlzX3RyZWUgfD0gaGlkX3N0YWdlX2NsYXNzaWZpZXItPm5leHQgIT0gTlVMTDsKKwkJCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZIYWFyQ2xhc3NpZmllciogY2xhc3NpZmllciA9IHN0YWdlX2NsYXNzaWZpZXItPmNsYXNzaWZpZXIgKyBqOworICAgICAgICAgICAgTXlDdkhpZEhhYXJDbGFzc2lmaWVyKiBoaWRfY2xhc3NpZmllciA9IGhpZF9zdGFnZV9jbGFzc2lmaWVyLT5jbGFzc2lmaWVyICsgajsKKyAgICAgICAgICAgIGludCBub2RlX2NvdW50ID0gY2xhc3NpZmllci0+Y291bnQ7CisgICAgICAgICAgICBmbG9hdCogYWxwaGFfcHRyID0gKGZsb2F0KikoaGFhcl9ub2RlX3B0ciArIG5vZGVfY291bnQpOworCQkJCisgICAgICAgICAgICBoaWRfY2xhc3NpZmllci0+Y291bnQgPSBub2RlX2NvdW50OworICAgICAgICAgICAgaGlkX2NsYXNzaWZpZXItPm5vZGUgPSBoYWFyX25vZGVfcHRyOworICAgICAgICAgICAgaGlkX2NsYXNzaWZpZXItPmFscGhhID0gYWxwaGFfcHRyOworCQkJCisgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgbm9kZV9jb3VudDsgbCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNeUN2SGlkSGFhclRyZWVOb2RlKiBub2RlID0gaGlkX2NsYXNzaWZpZXItPm5vZGUgKyBsOworICAgICAgICAgICAgICAgIEN2SGFhckZlYXR1cmUqIGZlYXR1cmUgPSBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUgKyBsOworICAgICAgICAgICAgICAgIG1lbXNldCggbm9kZSwgLTEsIHNpemVvZigqbm9kZSkgKTsKKyAgICAgICAgICAgICAgICBub2RlLT50aHJlc2hvbGQgPSAoaW50KSgoY2xhc3NpZmllci0+dGhyZXNob2xkW2xdKSAqIDY1NTM2LjApOworICAgICAgICAgICAgICAgIG5vZGUtPmxlZnQgPSBjbGFzc2lmaWVyLT5sZWZ0W2xdOworICAgICAgICAgICAgICAgIG5vZGUtPnJpZ2h0ID0gY2xhc3NpZmllci0+cmlnaHRbbF07CisJCQkJCisgICAgICAgICAgICAgICAgaWYoIGZhYnMoZmVhdHVyZS0+cmVjdFsyXS53ZWlnaHQpIDwgREJMX0VQU0lMT04gfHwKKwkJCQkgICBmZWF0dXJlLT5yZWN0WzJdLnIud2lkdGggPT0gMCB8fAorCQkJCSAgIGZlYXR1cmUtPnJlY3RbMl0uci5oZWlnaHQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggJihub2RlLT5mZWF0dXJlLnJlY3RbMl0pLCAwLCBzaXplb2Yobm9kZS0+ZmVhdHVyZS5yZWN0WzJdKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaGlkX3N0YWdlX2NsYXNzaWZpZXItPnR3b19yZWN0cyA9IDA7CisgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIG1lbWNweSggYWxwaGFfcHRyLCBjbGFzc2lmaWVyLT5hbHBoYSwgKG5vZGVfY291bnQrMSkqc2l6ZW9mKGFscGhhX3B0clswXSkpOworICAgICAgICAgICAgaGFhcl9ub2RlX3B0ciA9CisJCQkoTXlDdkhpZEhhYXJUcmVlTm9kZSopY3ZBbGlnblB0cihhbHBoYV9wdHIrbm9kZV9jb3VudCsxLCBzaXplb2Yodm9pZCopKTsKKwkJCQorICAgICAgICAgICAgb3V0LT5pc19zdHVtcF9iYXNlZCAmPSBub2RlX2NvdW50ID09IDE7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgLyp7CisJIGludCBjYW5fdXNlX2lwcCA9IGljdkhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZl9wICE9IDAgJiYKKwkgaWN2SGFhckNsYXNzaWZpZXJGcmVlXzMyZl9wICE9IDAgJiYKKwkgaWN2QXBwbHlIYWFyQ2xhc3NpZmllcl8zMmZfQzFSX3AgIT0gMCAmJgorCSBpY3ZSZWN0U3RkRGV2XzMyZl9DMVJfcCAhPSAwICYmCisJICFvdXQtPmhhc190aWx0ZWRfZmVhdHVyZXMgJiYgIW91dC0+aXNfdHJlZSAmJiBvdXQtPmlzX3N0dW1wX2Jhc2VkOworCSAKKwkgaWYoIGNhbl91c2VfaXBwICkKKwkgeworCSBpbnQgaXBwX2RhdGFzaXplID0gY2FzY2FkZS0+Y291bnQqc2l6ZW9mKG91dC0+aXBwX3N0YWdlc1swXSk7CisJIGZsb2F0IGlwcF93ZWlnaHRfc2NhbGU9KGZsb2F0KSgxLi8oKG9yaWdfd2luZG93X3NpemUud2lkdGgtaWN2X29iamVjdF93aW5fYm9yZGVyKjIpKgorCSAob3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQtaWN2X29iamVjdF93aW5fYm9yZGVyKjIpKSk7CisJIAorCSBDVl9DQUxMKCBvdXQtPmlwcF9zdGFnZXMgPSAodm9pZCoqKWN2QWxsb2MoIGlwcF9kYXRhc2l6ZSApKTsKKwkgbWVtc2V0KCBvdXQtPmlwcF9zdGFnZXMsIDAsIGlwcF9kYXRhc2l6ZSApOworCSAKKwkgQ1ZfQ0FMTCggaXBwX2ZlYXR1cmVzID0gKEN2UmVjdCopY3ZBbGxvYyggbWF4X2NvdW50KjMqc2l6ZW9mKGlwcF9mZWF0dXJlc1swXSkgKSk7CisJIENWX0NBTEwoIGlwcF93ZWlnaHRzID0gKGZsb2F0KiljdkFsbG9jKCBtYXhfY291bnQqMypzaXplb2YoaXBwX3dlaWdodHNbMF0pICkpOworCSBDVl9DQUxMKCBpcHBfdGhyZXNob2xkcyA9IChmbG9hdCopY3ZBbGxvYyggbWF4X2NvdW50KnNpemVvZihpcHBfdGhyZXNob2xkc1swXSkgKSk7CisJIENWX0NBTEwoIGlwcF92YWwxID0gKGZsb2F0KiljdkFsbG9jKCBtYXhfY291bnQqc2l6ZW9mKGlwcF92YWwxWzBdKSApKTsKKwkgQ1ZfQ0FMTCggaXBwX3ZhbDIgPSAoZmxvYXQqKWN2QWxsb2MoIG1heF9jb3VudCpzaXplb2YoaXBwX3ZhbDJbMF0pICkpOworCSBDVl9DQUxMKCBpcHBfY291bnRzID0gKGludCopY3ZBbGxvYyggbWF4X2NvdW50KnNpemVvZihpcHBfY291bnRzWzBdKSApKTsKKwkgCisJIGZvciggaSA9IDA7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKwkgeworCSBDdkhhYXJTdGFnZUNsYXNzaWZpZXIqIHN0YWdlX2NsYXNzaWZpZXIgPSBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyICsgaTsKKwkgZm9yKCBqID0gMCwgayA9IDA7IGogPCBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudDsgaisrICkKKwkgeworCSBDdkhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0gc3RhZ2VfY2xhc3NpZmllci0+Y2xhc3NpZmllciArIGo7CisJIGludCByZWN0X2NvdW50ID0gMiArIChjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUtPnJlY3RbMl0uci53aWR0aCAhPSAwKTsKKwkgCisJIGlwcF90aHJlc2hvbGRzW2pdID0gY2xhc3NpZmllci0+dGhyZXNob2xkWzBdOworCSBpcHBfdmFsMVtqXSA9IGNsYXNzaWZpZXItPmFscGhhWzBdOworCSBpcHBfdmFsMltqXSA9IGNsYXNzaWZpZXItPmFscGhhWzFdOworCSBpcHBfY291bnRzW2pdID0gcmVjdF9jb3VudDsKKwkgCisJIGZvciggbCA9IDA7IGwgPCByZWN0X2NvdW50OyBsKyssIGsrKyApCisJIHsKKwkgaXBwX2ZlYXR1cmVzW2tdID0gY2xhc3NpZmllci0+aGFhcl9mZWF0dXJlLT5yZWN0W2xdLnI7CisJIC8vaXBwX2ZlYXR1cmVzW2tdLnkgPSBvcmlnX3dpbmRvd19zaXplLmhlaWdodCAtIGlwcF9mZWF0dXJlc1trXS55IC0gaXBwX2ZlYXR1cmVzW2tdLmhlaWdodDsKKwkgaXBwX3dlaWdodHNba10gPSBjbGFzc2lmaWVyLT5oYWFyX2ZlYXR1cmUtPnJlY3RbbF0ud2VpZ2h0KmlwcF93ZWlnaHRfc2NhbGU7CisJIH0KKwkgfQorCSAKKwkgaWYoIGljdkhhYXJDbGFzc2lmaWVySW5pdEFsbG9jXzMyZl9wKCAmb3V0LT5pcHBfc3RhZ2VzW2ldLAorCSBpcHBfZmVhdHVyZXMsIGlwcF93ZWlnaHRzLCBpcHBfdGhyZXNob2xkcywKKwkgaXBwX3ZhbDEsIGlwcF92YWwyLCBpcHBfY291bnRzLCBzdGFnZV9jbGFzc2lmaWVyLT5jb3VudCApIDwgMCApCisJIGJyZWFrOworCSB9CisJIAorCSBpZiggaSA8IGNhc2NhZGUtPmNvdW50ICkKKwkgeworCSBmb3IoIGogPSAwOyBqIDwgaTsgaisrICkKKwkgaWYoIGljdkhhYXJDbGFzc2lmaWVyRnJlZV8zMmZfcCAmJiBvdXQtPmlwcF9zdGFnZXNbaV0gKQorCSBpY3ZIYWFyQ2xhc3NpZmllckZyZWVfMzJmX3AoIG91dC0+aXBwX3N0YWdlc1tpXSApOworCSBjdkZyZWUoICZvdXQtPmlwcF9zdGFnZXMgKTsKKwkgfQorCSB9CisJIH0qLworCQorICAgIGNhc2NhZGUtPmhpZF9jYXNjYWRlID0gKEN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKilvdXQ7CisgICAgYXNzZXJ0KCAoY2hhciopaGFhcl9ub2RlX3B0ciAtIChjaGFyKilvdXQgPD0gZGF0YXNpemUgKTsKKwkKKyAgICBfX0VORF9fOworCQorICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIG15aWN2UmVsZWFzZUhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggJm91dCApOworCQorICAgIGN2RnJlZSggJmlwcF9mZWF0dXJlcyApOworICAgIGN2RnJlZSggJmlwcF93ZWlnaHRzICk7CisgICAgY3ZGcmVlKCAmaXBwX3RocmVzaG9sZHMgKTsKKyAgICBjdkZyZWUoICZpcHBfdmFsMSApOworICAgIGN2RnJlZSggJmlwcF92YWwyICk7CisgICAgY3ZGcmVlKCAmaXBwX2NvdW50cyApOworCQorICAgIHJldHVybiBvdXQ7Cit9CisKKyNkZWZpbmUgY2FsY19zdW0ocmVjdCxvZmZzZXQpIFwKKygocmVjdCkucDBbb2Zmc2V0XSAtIChyZWN0KS5wMVtvZmZzZXRdIC0gKHJlY3QpLnAyW29mZnNldF0gKyAocmVjdCkucDNbb2Zmc2V0XSkKKworCitDVl9JTkxJTkUKK2RvdWJsZSBteWljdkV2YWxIaWRIYWFyQ2xhc3NpZmllciggTXlDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyLAorCQkJCQkJCQlkb3VibGUgdmFyaWFuY2Vfbm9ybV9mYWN0b3IsCisJCQkJCQkJCXNpemVfdCBwX29mZnNldCApCit7CisgICAgaW50IGlkeCA9IDA7CisgICAgZG8KKyAgICB7CisgICAgICAgIE15Q3ZIaWRIYWFyVHJlZU5vZGUqIG5vZGUgPSBjbGFzc2lmaWVyLT5ub2RlICsgaWR4OworICAgICAgICBkb3VibGUgdCA9IG5vZGUtPnRocmVzaG9sZCAqIHZhcmlhbmNlX25vcm1fZmFjdG9yOworCQkKKyAgICAgICAgZG91YmxlIHN1bSA9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFswXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMF0ud2VpZ2h0OworICAgICAgICBzdW0gKz0gY2FsY19zdW0obm9kZS0+ZmVhdHVyZS5yZWN0WzFdLHBfb2Zmc2V0KSAqIG5vZGUtPmZlYXR1cmUucmVjdFsxXS53ZWlnaHQ7CisJCQorICAgICAgICBpZiggbm9kZS0+ZmVhdHVyZS5yZWN0WzJdLnAwICkKKyAgICAgICAgICAgIHN1bSArPSBjYWxjX3N1bShub2RlLT5mZWF0dXJlLnJlY3RbMl0scF9vZmZzZXQpICogbm9kZS0+ZmVhdHVyZS5yZWN0WzJdLndlaWdodDsKKwkJCisgICAgICAgIGlkeCA9IHN1bSA8IHQgPyBub2RlLT5sZWZ0IDogbm9kZS0+cmlnaHQ7CisgICAgfQorICAgIHdoaWxlKCBpZHggPiAwICk7CisgICAgcmV0dXJuIGNsYXNzaWZpZXItPmFscGhhWy1pZHhdOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKiogU3BlY2lhbCBpbnRlZ2VyIHNxcnQgKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludAoraXNxcnQoaW50IHgpCit7CisJLyoKKwkgKglMb2dpY2FsbHksIHRoZXNlIGFyZSB1bnNpZ25lZC4gV2UgbmVlZCB0aGUgc2lnbiBiaXQgdG8gdGVzdAorCSAqCXdoZXRoZXIgKG9wIC0gcmVzIC0gb25lKSB1bmRlcmZsb3dlZC4KKwkgKi8KKwkKKwlyZWdpc3RlciBpbnQgb3AsIHJlcywgb25lOworCQorCW9wID0geDsKKwlyZXMgPSAwOworCQorCS8qICJvbmUiIHN0YXJ0cyBhdCB0aGUgaGlnaGVzdCBwb3dlciBvZiBmb3VyIDw9IHRoYW4gdGhlIGFyZ3VtZW50LiAqLworCQorCW9uZSA9IDEgPDwgMzA7CS8qIHNlY29uZC10by10b3AgYml0IHNldCAqLworCXdoaWxlIChvbmUgPiBvcCkgb25lID4+PSAyOworCQkKKwkJd2hpbGUgKG9uZSAhPSAwKSB7CisJCQlpZiAob3AgPj0gcmVzICsgb25lKSB7CisJCQkJb3AgPSBvcCAtIChyZXMgKyBvbmUpOworCQkJCXJlcyA9IHJlcyArICAyICogb25lOworCQkJfQorCQkJcmVzIC89IDI7CisJCQlvbmUgLz0gNDsKKwkJfQorCXJldHVybihyZXMpOworfQorCisjZGVmaW5lIE5FWFQobiwgaSkgICgoKG4pICsgKGkpLyhuKSkgPj4gMSkKKwordW5zaWduZWQgaW50IGlzcXJ0MShpbnQgbnVtYmVyKSB7CisJdW5zaWduZWQgaW50IG4gID0gMTsKKwl1bnNpZ25lZCBpbnQgbjEgPSBORVhUKG4sIG51bWJlcik7CisJCisJd2hpbGUoYWJzKG4xIC0gbikgPiAxKSB7CisJCW4gID0gbjE7CisJCW4xID0gTkVYVChuLCBudW1iZXIpOworCX0KKwl3aGlsZSgobjEqbjEpID4gbnVtYmVyKSB7CisJCW4xIC09IDE7CisJfQorCXJldHVybiBuMTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCBpbnQKK215Y3ZSdW5IYWFyQ2xhc3NpZmllckNhc2NhZGUoIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiBfY2FzY2FkZSwKKwkJCQkJCSAgIEN2UG9pbnQgcHQsIGludCBzdGFydF9zdGFnZSApCit7CisgICAgaW50IHJlc3VsdCA9IC0xOworICAgIENWX0ZVTkNOQU1FKCJteWN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlIik7CisJCisgICAgX19CRUdJTl9fOworCQorICAgIGludCBwX29mZnNldCwgcHFfb2Zmc2V0OworCWludCBwcTAsIHBxMSwgcHEyLCBwcTM7CisgICAgaW50IGksIGo7CisgICAgZG91YmxlIG1lYW47CisJaW50IHZhcmlhbmNlX25vcm1fZmFjdG9yOworICAgIE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqIGNhc2NhZGU7CisJCisgICAgaWYoICFDVl9JU19IQUFSX0NMQVNTSUZJRVIoX2Nhc2NhZGUpICkKKyAgICAgICAgQ1ZfRVJST1IoICFfY2FzY2FkZSA/IENWX1N0c051bGxQdHIgOiBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGNhc2NhZGUgcG9pbnRlciIgKTsKKwkKKyAgICBjYXNjYWRlID0gKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKV9jYXNjYWRlLT5oaWRfY2FzY2FkZTsKKyAgICBpZiggIWNhc2NhZGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIkhpZGRlbiBjYXNjYWRlIGhhcyBub3QgYmVlbiBjcmVhdGVkLlxuIgorCQkJCSAiVXNlIGN2U2V0SW1hZ2VzRm9ySGFhckNsYXNzaWZpZXJDYXNjYWRlIiApOworCQorICAgIGlmKCBwdC54IDwgMCB8fCBwdC55IDwgMCB8fAorCSAgIHB0LnggKyBfY2FzY2FkZS0+cmVhbF93aW5kb3dfc2l6ZS53aWR0aCA+PSBjYXNjYWRlLT5zdW0ud2lkdGgtMiB8fAorCSAgIHB0LnkgKyBfY2FzY2FkZS0+cmVhbF93aW5kb3dfc2l6ZS5oZWlnaHQgPj0gY2FzY2FkZS0+c3VtLmhlaWdodC0yICkKKyAgICAgICAgRVhJVDsKKwkKKyAgICBwX29mZnNldCA9IHB0LnkgKiAoY2FzY2FkZS0+c3VtLnN0ZXAvc2l6ZW9mKHN1bXR5cGUpKSArIHB0Lng7CisgICAgcHFfb2Zmc2V0ID0gcHQueSAqIChjYXNjYWRlLT5zcXN1bS5zdGVwL3NpemVvZihzcXN1bXR5cGUpKSArIHB0Lng7CisgICAgbWVhbiA9IGNhbGNfc3VtKCpjYXNjYWRlLHBfb2Zmc2V0KSAqIGNhc2NhZGUtPmludl93aW5kb3dfYXJlYTsKKwlwcTAgPSBjYXNjYWRlLT5wcTBbcHFfb2Zmc2V0XTsKKwlwcTEgPSBjYXNjYWRlLT5wcTFbcHFfb2Zmc2V0XTsKKwlwcTIgPSBjYXNjYWRlLT5wcTJbcHFfb2Zmc2V0XTsKKwlwcTMgPSBjYXNjYWRlLT5wcTNbcHFfb2Zmc2V0XTsKKyAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciA9IHBxMCAtIHBxMSAtIHBxMiArIHBxMzsKKyAgICB2YXJpYW5jZV9ub3JtX2ZhY3RvciA9IHZhcmlhbmNlX25vcm1fZmFjdG9yICogY2FzY2FkZS0+aW52X3dpbmRvd19hcmVhIC0gbWVhbiAqIG1lYW47CisgICAgaWYoIHZhcmlhbmNlX25vcm1fZmFjdG9yID49IDAuICkKKyAgICAgICAgdmFyaWFuY2Vfbm9ybV9mYWN0b3IgPSBzcXJ0KHZhcmlhbmNlX25vcm1fZmFjdG9yKTsKKyAgICBlbHNlCisgICAgICAgIHZhcmlhbmNlX25vcm1fZmFjdG9yID0gMS47CisJCisvLyAgICBpZiggY2FzY2FkZS0+aXNfdHJlZSApCisvLyAgICB7CisvLyAgICAgICAgTXlDdkhpZEhhYXJTdGFnZUNsYXNzaWZpZXIqIHB0cjsKKy8vICAgICAgICBhc3NlcnQoIHN0YXJ0X3N0YWdlID09IDAgKTsKKy8vCQkKKy8vICAgICAgICByZXN1bHQgPSAxOworLy8gICAgICAgIHB0ciA9IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXI7CisvLwkJCisvLyAgICAgICAgd2hpbGUoIHB0ciApCisvLyAgICAgICAgeworLy8gICAgICAgICAgICBkb3VibGUgc3RhZ2Vfc3VtID0gMDsKKy8vCQkJCisvLyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBwdHItPmNvdW50OyBqKysgKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBzdGFnZV9zdW0gKz0gbXlpY3ZFdmFsSGlkSGFhckNsYXNzaWZpZXIoIHB0ci0+Y2xhc3NpZmllciArIGosCisvLwkJCQkJCQkJCQkJCQkgIHZhcmlhbmNlX25vcm1fZmFjdG9yLCBwX29mZnNldCApOworLy8gICAgICAgICAgICB9CisvLwkJCQorLy8gICAgICAgICAgICBpZiggc3RhZ2Vfc3VtID49IHB0ci0+dGhyZXNob2xkICkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgcHRyID0gcHRyLT5jaGlsZDsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBlbHNlCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHdoaWxlKCBwdHIgJiYgcHRyLT5uZXh0ID09IE5VTEwgKSBwdHIgPSBwdHItPnBhcmVudDsKKy8vICAgICAgICAgICAgICAgIGlmKCBwdHIgPT0gTlVMTCApCisvLyAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKy8vICAgICAgICAgICAgICAgICAgICBFWElUOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgICAgICAgICAgcHRyID0gcHRyLT5uZXh0OworLy8gICAgICAgICAgICB9CisvLyAgICAgICAgfQorLy8gICAgfQorLy8gICAgZWxzZSBpZiggY2FzY2FkZS0+aXNfc3R1bXBfYmFzZWQgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gc3RhcnRfc3RhZ2U7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHN0YWdlX3N1bSA9IDA7CisJCQkKKyAgICAgICAgICAgIGlmKCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnR3b19yZWN0cyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBNeUN2SGlkSGFhckNsYXNzaWZpZXIqIGNsYXNzaWZpZXIgPSBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXIgKyBqOworICAgICAgICAgICAgICAgICAgICBNeUN2SGlkSGFhclRyZWVOb2RlKiBub2RlID0gY2xhc3NpZmllci0+bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHQgPSBub2RlLT50aHJlc2hvbGQgKiB2YXJpYW5jZV9ub3JtX2ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN1bSA9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFswXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMF0ud2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY2FsY19zdW0obm9kZS0+ZmVhdHVyZS5yZWN0WzFdLHBfb2Zmc2V0KSAqIG5vZGUtPmZlYXR1cmUucmVjdFsxXS53ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bSArPSBjbGFzc2lmaWVyLT5hbHBoYVtzdW0gPj0gdF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTXlDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0gY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyICsgajsKKyAgICAgICAgICAgICAgICAgICAgTXlDdkhpZEhhYXJUcmVlTm9kZSogbm9kZSA9IGNsYXNzaWZpZXItPm5vZGU7CisgICAgICAgICAgICAgICAgICAgIGludCB0ID0gbm9kZS0+dGhyZXNob2xkICogdmFyaWFuY2Vfbm9ybV9mYWN0b3I7CisgICAgICAgICAgICAgICAgICAgIGludCBzdW0gPSBjYWxjX3N1bShub2RlLT5mZWF0dXJlLnJlY3RbMF0scF9vZmZzZXQpICogbm9kZS0+ZmVhdHVyZS5yZWN0WzBdLndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGNhbGNfc3VtKG5vZGUtPmZlYXR1cmUucmVjdFsxXSxwX29mZnNldCkgKiBub2RlLT5mZWF0dXJlLnJlY3RbMV0ud2VpZ2h0OworICAgICAgICAgICAgICAgICAgICBpZiggbm9kZS0+ZmVhdHVyZS5yZWN0WzJdLnAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjYWxjX3N1bShub2RlLT5mZWF0dXJlLnJlY3RbMl0scF9vZmZzZXQpICogbm9kZS0+ZmVhdHVyZS5yZWN0WzJdLndlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHN0YWdlX3N1bSArPSBjbGFzc2lmaWVyLT5hbHBoYVtzdW0gPj0gdF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCQkJCisgICAgICAgICAgICBpZiggc3RhZ2Vfc3VtIDwgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS50aHJlc2hvbGQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1pOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisvLyAgICBlbHNlCisvLyAgICB7CisvLyAgICAgICAgZm9yKCBpID0gc3RhcnRfc3RhZ2U7IGkgPCBjYXNjYWRlLT5jb3VudDsgaSsrICkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGRvdWJsZSBzdGFnZV9zdW0gPSAwOworLy8JCQkKKy8vICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY291bnQ7IGorKyApCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHN0YWdlX3N1bSArPSBteWljdkV2YWxIaWRIYWFyQ2xhc3NpZmllcigKKy8vCQkJCQkJCQkJCQkJCSAgY2FzY2FkZS0+c3RhZ2VfY2xhc3NpZmllcltpXS5jbGFzc2lmaWVyICsgaiwKKy8vCQkJCQkJCQkJCQkJCSAgdmFyaWFuY2Vfbm9ybV9mYWN0b3IsIHBfb2Zmc2V0ICk7CisvLyAgICAgICAgICAgIH0KKy8vCQkJCisvLyAgICAgICAgICAgIGlmKCBzdGFnZV9zdW0gPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLnRocmVzaG9sZCApCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHJlc3VsdCA9IC1pOworLy8gICAgICAgICAgICAgICAgRVhJVDsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vICAgIH0KKwkKKyAgICByZXN1bHQgPSAxOworCQorICAgIF9fRU5EX187CisJCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBzdW1fZWxlbV9wdHIoc3VtLHJvdyxjb2wpICBcCisoKHN1bXR5cGUqKUNWX01BVF9FTEVNX1BUUl9GQVNUKChzdW0pLChyb3cpLChjb2wpLHNpemVvZihzdW10eXBlKSkpCisKKyNkZWZpbmUgc3FzdW1fZWxlbV9wdHIoc3FzdW0scm93LGNvbCkgIFwKKygoc3FzdW10eXBlKilDVl9NQVRfRUxFTV9QVFJfRkFTVCgoc3FzdW0pLChyb3cpLChjb2wpLHNpemVvZihzcXN1bXR5cGUpKSkKKworCitDVl9JTVBMIHZvaWQKK215Y3ZTZXRJbWFnZXNGb3JIYWFyQ2xhc3NpZmllckNhc2NhZGUoIEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiBfY2FzY2FkZSwKKwkJCQkJCQkJCWNvbnN0IEN2QXJyKiBfc3VtLAorCQkJCQkJCQkJY29uc3QgQ3ZBcnIqIF9zcXN1bSwKKwkJCQkJCQkJCWNvbnN0IEN2QXJyKiBfdGlsdGVkX3N1bSwKKwkJCQkJCQkJCWRvdWJsZSBzY2FsZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoImN2U2V0SW1hZ2VzRm9ySGFhckNsYXNzaWZpZXJDYXNjYWRlIik7CisJCisgICAgX19CRUdJTl9fOworCQkKKyAgICBDdk1hdCBzdW1fc3R1YiwgKnN1bSA9IChDdk1hdCopX3N1bTsKKyAgICBDdk1hdCBzcXN1bV9zdHViLCAqc3FzdW0gPSAoQ3ZNYXQqKV9zcXN1bTsKKyAgICBDdk1hdCB0aWx0ZWRfc3R1YiwgKnRpbHRlZCA9IChDdk1hdCopX3RpbHRlZF9zdW07CisgICAgTXlDdkhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZTsKKyAgICBpbnQgY29pMCA9IDAsIGNvaTEgPSAwOworICAgIGludCBpOworICAgIEN2UmVjdCBlcXVfcmVjdDsKKyAgICBkb3VibGUgd2VpZ2h0X3NjYWxlOworCQorICAgIGlmKCAhQ1ZfSVNfSEFBUl9DTEFTU0lGSUVSKF9jYXNjYWRlKSApCisgICAgICAgIENWX0VSUk9SKCAhX2Nhc2NhZGUgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBjbGFzc2lmaWVyIHBvaW50ZXIiICk7CisJCisgICAgaWYoIHNjYWxlIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNjYWxlIG11c3QgYmUgcG9zaXRpdmUiICk7CisJCisgICAgQ1ZfQ0FMTCggc3VtID0gY3ZHZXRNYXQoIHN1bSwgJnN1bV9zdHViLCAmY29pMCApKTsKKyAgICBDVl9DQUxMKCBzcXN1bSA9IGN2R2V0TWF0KCBzcXN1bSwgJnNxc3VtX3N0dWIsICZjb2kxICkpOworCQorICAgIGlmKCBjb2kwIHx8IGNvaTEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisJCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHN1bSwgc3FzdW0gKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQWxsIGludGVncmFsIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIgKTsKKwkKKyAgICBpZiggQ1ZfTUFUX1RZUEUoc3FzdW0tPnR5cGUpICE9IENWXzY0RkMxIHx8CisJICAgQ1ZfTUFUX1RZUEUoc3VtLT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKwkJCQkgIk9ubHkgKDMycywgNjRmLCAzMnMpIGNvbWJpbmF0aW9uIG9mIChzdW0sc3FzdW0sdGlsdGVkX3N1bSkgZm9ybWF0cyBpcyBhbGxvd2VkIiApOworCQorICAgIGlmKCAhX2Nhc2NhZGUtPmhpZF9jYXNjYWRlICkKKyAgICAgICAgQ1ZfQ0FMTCggbXlpY3ZDcmVhdGVIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUoX2Nhc2NhZGUpICk7CisJCisgICAgY2FzY2FkZSA9IChNeUN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKilfY2FzY2FkZS0+aGlkX2Nhc2NhZGU7CisJCisgICAgaWYoIGNhc2NhZGUtPmhhc190aWx0ZWRfZmVhdHVyZXMgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggdGlsdGVkID0gY3ZHZXRNYXQoIHRpbHRlZCwgJnRpbHRlZF9zdHViLCAmY29pMSApKTsKKwkJCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRSh0aWx0ZWQtPnR5cGUpICE9IENWXzMyU0MxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKwkJCQkJICJPbmx5ICgzMnMsIDY0ZiwgMzJzKSBjb21iaW5hdGlvbiBvZiAoc3VtLHNxc3VtLHRpbHRlZF9zdW0pIGZvcm1hdHMgaXMgYWxsb3dlZCIgKTsKKwkJCisgICAgICAgIGlmKCBzdW0tPnN0ZXAgIT0gdGlsdGVkLT5zdGVwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKwkJCQkJICJTdW0gYW5kIHRpbHRlZF9zdW0gbXVzdCBoYXZlIHRoZSBzYW1lIHN0cmlkZSAoc3RlcCwgd2lkdGhTdGVwKSIgKTsKKwkJCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzdW0sIHRpbHRlZCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiQWxsIGludGVncmFsIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSIgKTsKKyAgICAgICAgY2FzY2FkZS0+dGlsdGVkID0gKnRpbHRlZDsKKyAgICB9CisJCisgICAgX2Nhc2NhZGUtPnNjYWxlID0gc2NhbGU7CisgICAgX2Nhc2NhZGUtPnJlYWxfd2luZG93X3NpemUud2lkdGggPSBjdlJvdW5kKCBfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS53aWR0aCAqIHNjYWxlICk7CisgICAgX2Nhc2NhZGUtPnJlYWxfd2luZG93X3NpemUuaGVpZ2h0ID0gY3ZSb3VuZCggX2Nhc2NhZGUtPm9yaWdfd2luZG93X3NpemUuaGVpZ2h0ICogc2NhbGUgKTsKKwkKKyAgICBjYXNjYWRlLT5zdW0gPSAqc3VtOworICAgIGNhc2NhZGUtPnNxc3VtID0gKnNxc3VtOworCQorICAgIGVxdV9yZWN0LnggPSBlcXVfcmVjdC55ID0gY3ZSb3VuZChzY2FsZSk7CisgICAgZXF1X3JlY3Qud2lkdGggPSBjdlJvdW5kKChfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS53aWR0aC0yKSpzY2FsZSk7CisgICAgZXF1X3JlY3QuaGVpZ2h0ID0gY3ZSb3VuZCgoX2Nhc2NhZGUtPm9yaWdfd2luZG93X3NpemUuaGVpZ2h0LTIpKnNjYWxlKTsKKyAgICB3ZWlnaHRfc2NhbGUgPSAxLi8oZXF1X3JlY3Qud2lkdGgqZXF1X3JlY3QuaGVpZ2h0KTsKKyAgICBjYXNjYWRlLT5pbnZfd2luZG93X2FyZWEgPSB3ZWlnaHRfc2NhbGU7CisJCisgICAgY2FzY2FkZS0+cDAgPSBzdW1fZWxlbV9wdHIoKnN1bSwgZXF1X3JlY3QueSwgZXF1X3JlY3QueCk7CisgICAgY2FzY2FkZS0+cDEgPSBzdW1fZWxlbV9wdHIoKnN1bSwgZXF1X3JlY3QueSwgZXF1X3JlY3QueCArIGVxdV9yZWN0LndpZHRoICk7CisgICAgY2FzY2FkZS0+cDIgPSBzdW1fZWxlbV9wdHIoKnN1bSwgZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCwgZXF1X3JlY3QueCApOworICAgIGNhc2NhZGUtPnAzID0gc3VtX2VsZW1fcHRyKCpzdW0sIGVxdV9yZWN0LnkgKyBlcXVfcmVjdC5oZWlnaHQsCisJCQkJCQkJICAgZXF1X3JlY3QueCArIGVxdV9yZWN0LndpZHRoICk7CisJCisgICAgY2FzY2FkZS0+cHEwID0gc3FzdW1fZWxlbV9wdHIoKnNxc3VtLCBlcXVfcmVjdC55LCBlcXVfcmVjdC54KTsKKyAgICBjYXNjYWRlLT5wcTEgPSBzcXN1bV9lbGVtX3B0cigqc3FzdW0sIGVxdV9yZWN0LnksIGVxdV9yZWN0LnggKyBlcXVfcmVjdC53aWR0aCApOworICAgIGNhc2NhZGUtPnBxMiA9IHNxc3VtX2VsZW1fcHRyKCpzcXN1bSwgZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCwgZXF1X3JlY3QueCApOworICAgIGNhc2NhZGUtPnBxMyA9IHNxc3VtX2VsZW1fcHRyKCpzcXN1bSwgZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCwKKwkJCQkJCQkJICBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGggKTsKKwkKKyAgICAvKiBpbml0IHBvaW50ZXJzIGluIGhhYXIgZmVhdHVyZXMgYWNjb3JkaW5nIHRvIHJlYWwgd2luZG93IHNpemUgYW5kCisJIGdpdmVuIGltYWdlIHBvaW50ZXJzICovCisgICAgeworI2lmZGVmIF9PUEVOTVAKKwkJaW50IG1heF90aHJlYWRzID0gY3ZHZXROdW1UaHJlYWRzKCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHMobWF4X3RocmVhZHMpIHNjaGVkdWxlKGR5bmFtaWMpCisjZW5kaWYgLy8gX09QRU5NUAorCQlmb3IoIGkgPSAwOyBpIDwgX2Nhc2NhZGUtPmNvdW50OyBpKysgKQorCQl7CisJCQlpbnQgaiwgaywgbDsKKwkJCWZvciggaiA9IDA7IGogPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNvdW50OyBqKysgKQorCQkJeworCQkJCWZvciggbCA9IDA7IGwgPCBjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXJbal0uY291bnQ7IGwrKyApCisJCQkJeworCQkJCQlDdkhhYXJGZWF0dXJlKiBmZWF0dXJlID0KKyAgICAgICAgICAgICAgICAgICAgJl9jYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXJbal0uaGFhcl9mZWF0dXJlW2xdOworCQkJCQkvKiBDdkhpZEhhYXJDbGFzc2lmaWVyKiBjbGFzc2lmaWVyID0KKwkJCQkJIGNhc2NhZGUtPnN0YWdlX2NsYXNzaWZpZXJbaV0uY2xhc3NpZmllciArIGo7ICovCisJCQkJCU15Q3ZIaWRIYWFyRmVhdHVyZSogaGlkZmVhdHVyZSA9CisgICAgICAgICAgICAgICAgICAgICZjYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2ldLmNsYXNzaWZpZXJbal0ubm9kZVtsXS5mZWF0dXJlOworCQkJCQlkb3VibGUgc3VtMCA9IDAsIGFyZWEwID0gMDsKKwkJCQkJQ3ZSZWN0IHJbM107CisjaWYgQ1ZfQURKVVNUX0ZFQVRVUkVTCisJCQkJCWludCBiYXNlX3cgPSAtMSwgYmFzZV9oID0gLTE7CisJCQkJCWludCBuZXdfYmFzZV93ID0gMCwgbmV3X2Jhc2VfaCA9IDA7CisJCQkJCWludCBreCwga3k7CisJCQkJCWludCBmbGFneCA9IDAsIGZsYWd5ID0gMDsKKwkJCQkJaW50IHgwID0gMCwgeTAgPSAwOworI2VuZGlmCisJCQkJCWludCBucjsKKwkJCQkJCisJCQkJCS8qIGFsaWduIGJsb2NrcyAqLworCQkJCQlmb3IoIGsgPSAwOyBrIDwgQ1ZfSEFBUl9GRUFUVVJFX01BWDsgaysrICkKKwkJCQkJeworCQkJCQkJaWYoICFoaWRmZWF0dXJlLT5yZWN0W2tdLnAwICkKKwkJCQkJCQlicmVhazsKKyNpZiBDVl9BREpVU1RfRkVBVFVSRVMKKwkJCQkJCXJba10gPSBmZWF0dXJlLT5yZWN0W2tdLnI7CisJCQkJCQliYXNlX3cgPSAoaW50KUNWX0lNSU4oICh1bnNpZ25lZCliYXNlX3csICh1bnNpZ25lZCkocltrXS53aWR0aC0xKSApOworCQkJCQkJYmFzZV93ID0gKGludClDVl9JTUlOKCAodW5zaWduZWQpYmFzZV93LCAodW5zaWduZWQpKHJba10ueCAtIHJbMF0ueC0xKSApOworCQkJCQkJYmFzZV9oID0gKGludClDVl9JTUlOKCAodW5zaWduZWQpYmFzZV9oLCAodW5zaWduZWQpKHJba10uaGVpZ2h0LTEpICk7CisJCQkJCQliYXNlX2ggPSAoaW50KUNWX0lNSU4oICh1bnNpZ25lZCliYXNlX2gsICh1bnNpZ25lZCkocltrXS55IC0gclswXS55LTEpICk7CisjZW5kaWYKKwkJCQkJfQorCQkJCQkKKwkJCQkJbnIgPSBrOworCQkJCQkKKyNpZiBDVl9BREpVU1RfRkVBVFVSRVMKKwkJCQkJYmFzZV93ICs9IDE7CisJCQkJCWJhc2VfaCArPSAxOworCQkJCQlreCA9IHJbMF0ud2lkdGggLyBiYXNlX3c7CisJCQkJCWt5ID0gclswXS5oZWlnaHQgLyBiYXNlX2g7CisJCQkJCQorCQkJCQlpZigga3ggPD0gMCApCisJCQkJCXsKKwkJCQkJCWZsYWd4ID0gMTsKKwkJCQkJCW5ld19iYXNlX3cgPSBjdlJvdW5kKCByWzBdLndpZHRoICogc2NhbGUgKSAvIGt4OworCQkJCQkJeDAgPSBjdlJvdW5kKCByWzBdLnggKiBzY2FsZSApOworCQkJCQl9CisJCQkJCQorCQkJCQlpZigga3kgPD0gMCApCisJCQkJCXsKKwkJCQkJCWZsYWd5ID0gMTsKKwkJCQkJCW5ld19iYXNlX2ggPSBjdlJvdW5kKCByWzBdLmhlaWdodCAqIHNjYWxlICkgLyBreTsKKwkJCQkJCXkwID0gY3ZSb3VuZCggclswXS55ICogc2NhbGUgKTsKKwkJCQkJfQorI2VuZGlmCisJCQkJCQorCQkJCQlmbG9hdCB0bXB3ZWlnaHRbM10gPSB7MH07CisJCQkJCQorCQkJCQlmb3IoIGsgPSAwOyBrIDwgbnI7IGsrKyApCisJCQkJCXsKKwkJCQkJCUN2UmVjdCB0cjsKKwkJCQkJCWRvdWJsZSBjb3JyZWN0aW9uX3JhdGlvOworCQkJCQkJCisjaWYgQ1ZfQURKVVNUX0ZFQVRVUkVTCisJCQkJCQlpZiggZmxhZ3ggKQorCQkJCQkJeworCQkJCQkJCXRyLnggPSAocltrXS54IC0gclswXS54KSAqIG5ld19iYXNlX3cgLyBiYXNlX3cgKyB4MDsKKwkJCQkJCQl0ci53aWR0aCA9IHJba10ud2lkdGggKiBuZXdfYmFzZV93IC8gYmFzZV93OworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmCisJCQkJCQl7CisJCQkJCQkJdHIueCA9IGN2Um91bmQoIHJba10ueCAqIHNjYWxlICk7CisJCQkJCQkJdHIud2lkdGggPSBjdlJvdW5kKCByW2tdLndpZHRoICogc2NhbGUgKTsKKwkJCQkJCX0KKwkJCQkJCQorI2lmIENWX0FESlVTVF9GRUFUVVJFUworCQkJCQkJaWYoIGZsYWd5ICkKKwkJCQkJCXsKKwkJCQkJCQl0ci55ID0gKHJba10ueSAtIHJbMF0ueSkgKiBuZXdfYmFzZV9oIC8gYmFzZV9oICsgeTA7CisJCQkJCQkJdHIuaGVpZ2h0ID0gcltrXS5oZWlnaHQgKiBuZXdfYmFzZV9oIC8gYmFzZV9oOworCQkJCQkJfQorCQkJCQkJZWxzZQorI2VuZGlmCisJCQkJCQl7CisJCQkJCQkJdHIueSA9IGN2Um91bmQoIHJba10ueSAqIHNjYWxlICk7CisJCQkJCQkJdHIuaGVpZ2h0ID0gY3ZSb3VuZCggcltrXS5oZWlnaHQgKiBzY2FsZSApOworCQkJCQkJfQorCQkJCQkJCisjaWYgQ1ZfQURKVVNUX1dFSUdIVFMKKwkJCQkJCXsKKwkJCQkJCQkvLyBSQUlORVIgU1RBUlQKKwkJCQkJCQljb25zdCBmbG9hdCBvcmlnX2ZlYXR1cmVfc2l6ZSA9ICAoZmxvYXQpKGZlYXR1cmUtPnJlY3Rba10uci53aWR0aCkqZmVhdHVyZS0+cmVjdFtrXS5yLmhlaWdodDsKKwkJCQkJCQljb25zdCBmbG9hdCBvcmlnX25vcm1fc2l6ZSA9IChmbG9hdCkoX2Nhc2NhZGUtPm9yaWdfd2luZG93X3NpemUud2lkdGgpKihfY2FzY2FkZS0+b3JpZ193aW5kb3dfc2l6ZS5oZWlnaHQpOworCQkJCQkJCWNvbnN0IGZsb2F0IGZlYXR1cmVfc2l6ZSA9IGZsb2F0KHRyLndpZHRoKnRyLmhlaWdodCk7CisJCQkJCQkJLy9jb25zdCBmbG9hdCBub3JtU2l6ZSAgICA9IGZsb2F0KGVxdV9yZWN0LndpZHRoKmVxdV9yZWN0LmhlaWdodCk7CisJCQkJCQkJZmxvYXQgdGFyZ2V0X3JhdGlvID0gb3JpZ19mZWF0dXJlX3NpemUgLyBvcmlnX25vcm1fc2l6ZTsKKwkJCQkJCQkvL2Zsb2F0IGlzUmF0aW8gPSBmZWF0dXJlU2l6ZSAvIG5vcm1TaXplOworCQkJCQkJCS8vY29ycmVjdGlvblJhdGlvID0gdGFyZ2V0UmF0aW8gLyBpc1JhdGlvIC8gbm9ybVNpemU7CisJCQkJCQkJY29ycmVjdGlvbl9yYXRpbyA9IHRhcmdldF9yYXRpbyAvIGZlYXR1cmVfc2l6ZTsKKwkJCQkJCQkvLyBSQUlORVIgRU5ECisJCQkJCQl9CisjZWxzZQorCQkJCQkJY29ycmVjdGlvbl9yYXRpbyA9IHdlaWdodF9zY2FsZSAqICghZmVhdHVyZS0+dGlsdGVkID8gMSA6IDAuNSk7CisjZW5kaWYKKwkJCQkJCQorCQkJCQkJaWYoICFmZWF0dXJlLT50aWx0ZWQgKQorCQkJCQkJeworCQkJCQkJCWhpZGZlYXR1cmUtPnJlY3Rba10ucDAgPSBzdW1fZWxlbV9wdHIoKnN1bSwgdHIueSwgdHIueCk7CisJCQkJCQkJaGlkZmVhdHVyZS0+cmVjdFtrXS5wMSA9IHN1bV9lbGVtX3B0cigqc3VtLCB0ci55LCB0ci54ICsgdHIud2lkdGgpOworCQkJCQkJCWhpZGZlYXR1cmUtPnJlY3Rba10ucDIgPSBzdW1fZWxlbV9wdHIoKnN1bSwgdHIueSArIHRyLmhlaWdodCwgdHIueCk7CisJCQkJCQkJaGlkZmVhdHVyZS0+cmVjdFtrXS5wMyA9IHN1bV9lbGVtX3B0cigqc3VtLCB0ci55ICsgdHIuaGVpZ2h0LCB0ci54ICsgdHIud2lkdGgpOworCQkJCQkJfQorCQkJCQkJZWxzZQorCQkJCQkJeworCQkJCQkJCWhpZGZlYXR1cmUtPnJlY3Rba10ucDIgPSBzdW1fZWxlbV9wdHIoKnRpbHRlZCwgdHIueSArIHRyLndpZHRoLCB0ci54ICsgdHIud2lkdGgpOworCQkJCQkJCWhpZGZlYXR1cmUtPnJlY3Rba10ucDMgPSBzdW1fZWxlbV9wdHIoKnRpbHRlZCwgdHIueSArIHRyLndpZHRoICsgdHIuaGVpZ2h0LAorCQkJCQkJCQkJCQkJCQkJCSAgdHIueCArIHRyLndpZHRoIC0gdHIuaGVpZ2h0KTsKKwkJCQkJCQloaWRmZWF0dXJlLT5yZWN0W2tdLnAwID0gc3VtX2VsZW1fcHRyKCp0aWx0ZWQsIHRyLnksIHRyLngpOworCQkJCQkJCWhpZGZlYXR1cmUtPnJlY3Rba10ucDEgPSBzdW1fZWxlbV9wdHIoKnRpbHRlZCwgdHIueSArIHRyLmhlaWdodCwgdHIueCAtIHRyLmhlaWdodCk7CisJCQkJCQl9CisJCQkJCQkKKy8vCQkJCQkJaGlkZmVhdHVyZS0+cmVjdFtrXS53ZWlnaHQgPSAoZmxvYXQpKGZlYXR1cmUtPnJlY3Rba10ud2VpZ2h0ICogY29ycmVjdGlvbl9yYXRpbyk7CisJCQkJCQl0bXB3ZWlnaHRba10gPSAoZmxvYXQpKGZlYXR1cmUtPnJlY3Rba10ud2VpZ2h0ICogY29ycmVjdGlvbl9yYXRpbyk7CisJCQkJCQkKKwkJCQkJCWlmKCBrID09IDAgKQorCQkJCQkJCWFyZWEwID0gdHIud2lkdGggKiB0ci5oZWlnaHQ7CisJCQkJCQllbHNlCisvLwkJCQkJCQlzdW0wICs9IGhpZGZlYXR1cmUtPnJlY3Rba10ud2VpZ2h0ICogdHIud2lkdGggKiB0ci5oZWlnaHQ7CisJCQkJCQkJc3VtMCArPSB0bXB3ZWlnaHRba10gKiB0ci53aWR0aCAqIHRyLmhlaWdodDsKKwkJCQkJfQorCQkJCQkKKwkJCQkJdG1wd2VpZ2h0WzBdID0gKGZsb2F0KSgtc3VtMC9hcmVhMCk7CisJCQkJCQorCQkJCQlmb3IoaW50IGlpID0gMDsgaWkgPCBucjsgaGlkZmVhdHVyZS0+cmVjdFtpaV0ud2VpZ2h0ID0gKGludCkodG1wd2VpZ2h0W2lpXSAqIDY1NTM2LjApLCBpaSsrKTsKKwkJCQl9IC8qIGwgKi8KKwkJCX0gLyogaiAqLworCQl9CisgICAgfQorCQorICAgIF9fRU5EX187Cit9CisKK0N2TWF0ICp0ZW1wID0gMCwgKnN1bSA9IDAsICpzcXN1bSA9IDA7Citkb3VibGUgdGlja0ZyZXFUaW1lczEwMDAgPSAoKGRvdWJsZSljdkdldFRpY2tGcmVxdWVuY3koKSoxMDAwLik7CisKK0NWX0lNUEwgQ3ZTZXEqCitteWN2SGFhckRldGVjdE9iamVjdHMoIGNvbnN0IEN2QXJyKiBfaW1nLAorCQkJCQlDdkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSogY2FzY2FkZSwKKwkJCQkJQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBkb3VibGUgc2NhbGVfZmFjdG9yLAorCQkJCQlpbnQgbWluX25laWdoYm9ycywgaW50IGZsYWdzLCBDdlNpemUgbWluX3NpemUgKQoreworICAgIGludCBzcGxpdF9zdGFnZSA9IDI7CisJCisgICAgQ3ZNYXQgc3R1YiwgKmltZyA9IChDdk1hdCopX2ltZzsKKyAgICBDdk1hdCAgKnRpbHRlZCA9IDAsICpub3JtX2ltZyA9IDAsICpzdW1jYW5ueSA9IDAsICppbWdfc21hbGwgPSAwOworICAgIEN2U2VxKiByZXN1bHRfc2VxID0gMDsKKyAgICBDdk1lbVN0b3JhZ2UqIHRlbXBfc3RvcmFnZSA9IDA7CisgICAgQ3ZBdmdDb21wKiBjb21wcyA9IDA7CisgICAgQ3ZTZXEqIHNlcV90aHJlYWRbQ1ZfTUFYX1RIUkVBRFNdID0gezB9OworICAgIGludCBpLCBtYXhfdGhyZWFkcyA9IDA7CisJZG91YmxlIHQxOworCQorICAgIENWX0ZVTkNOQU1FKCAiY3ZIYWFyRGV0ZWN0T2JqZWN0cyIgKTsKKwkKKyAgICBfX0JFR0lOX187CisJCisJZG91YmxlIHQgPSAoZG91YmxlKWN2R2V0VGlja0NvdW50KCk7CisJCisgICAgQ3ZTZXEgKnNlcSA9IDAsICpzZXEyID0gMCwgKmlkeF9zZXEgPSAwLCAqYmlnX3NlcSA9IDA7CisgICAgQ3ZBdmdDb21wIHJlc3VsdF9jb21wID0ge3swLDAsMCwwfSwwfTsKKyAgICBkb3VibGUgZmFjdG9yOworICAgIGludCBucGFzcyA9IDIsIGNvaTsKKyAgICBib29sIGRvX2Nhbm55X3BydW5pbmcgPSAoZmxhZ3MgJiBDVl9IQUFSX0RPX0NBTk5ZX1BSVU5JTkcpICE9IDA7CisgICAgYm9vbCBmaW5kX2JpZ2dlc3Rfb2JqZWN0ID0gKGZsYWdzICYgQ1ZfSEFBUl9GSU5EX0JJR0dFU1RfT0JKRUNUKSAhPSAwOworICAgIGJvb2wgcm91Z2hfc2VhcmNoID0gKGZsYWdzICYgQ1ZfSEFBUl9ET19ST1VHSF9TRUFSQ0gpICE9IDA7CisJCisgICAgaWYoICFDVl9JU19IQUFSX0NMQVNTSUZJRVIoY2FzY2FkZSkgKQorICAgICAgICBDVl9FUlJPUiggIWNhc2NhZGUgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBjbGFzc2lmaWVyIGNhc2NhZGUiICk7CisJCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHN0b3JhZ2UgcG9pbnRlciIgKTsKKwkKKyAgICBDVl9DQUxMKCBpbWcgPSBjdkdldE1hdCggaW1nLCAmc3R1YiwgJmNvaSApKTsKKyAgICBpZiggY29pICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIkNPSSBpcyBub3Qgc3VwcG9ydGVkIiApOworCQorICAgIGlmKCBDVl9NQVRfREVQVEgoaW1nLT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIk9ubHkgOC1iaXQgaW1hZ2VzIGFyZSBzdXBwb3J0ZWQiICk7CisgICAgCisgICAgaWYoIHNjYWxlX2ZhY3RvciA8PSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzY2FsZSBmYWN0b3IgbXVzdCBiZSA+IDEiICk7CisJCisgICAgaWYoIGZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICBmbGFncyAmPSB+Q1ZfSEFBUl9TQ0FMRV9JTUFHRTsKKwkKKwlpZighdGVtcCkgeworCQlDVl9DQUxMKCB0ZW1wID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl84VUMxICkpOworCX0KKwlpZighc3VtKSB7CisJCUNWX0NBTEwoIHN1bSA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MgKyAxLCBpbWctPmNvbHMgKyAxLCBDVl8zMlNDMSApKTsKKwl9CisJaWYoIXNxc3VtKSB7CisJCUNWX0NBTEwoIHNxc3VtID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzY0RkMxICkpOworCX0KKyAgICBDVl9DQUxMKCB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSggc3RvcmFnZSApKTsKKwkKKyAgICBpZiggIWNhc2NhZGUtPmhpZF9jYXNjYWRlICkKKyAgICAgICAgQ1ZfQ0FMTCggbXlpY3ZDcmVhdGVIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUoY2FzY2FkZSkgKTsKKwkKKyAgICBpZiggKChNeUN2SGlkSGFhckNsYXNzaWZpZXJDYXNjYWRlKiljYXNjYWRlLT5oaWRfY2FzY2FkZSktPmhhc190aWx0ZWRfZmVhdHVyZXMgKQorICAgICAgICB0aWx0ZWQgPSBjdkNyZWF0ZU1hdCggaW1nLT5yb3dzICsgMSwgaW1nLT5jb2xzICsgMSwgQ1ZfMzJTQzEgKTsKKwkKKyAgICBzZXEgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2UmVjdCksIHRlbXBfc3RvcmFnZSApOworICAgIHNlcTIgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2QXZnQ29tcCksIHRlbXBfc3RvcmFnZSApOworICAgIHJlc3VsdF9zZXEgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2QXZnQ29tcCksIHN0b3JhZ2UgKTsKKwkKKyAgICBtYXhfdGhyZWFkcyA9IGN2R2V0TnVtVGhyZWFkcygpOworICAgIGlmKCBtYXhfdGhyZWFkcyA+IDEgKQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbWF4X3RocmVhZHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogdGVtcF9zdG9yYWdlX3RocmVhZDsKKyAgICAgICAgICAgIENWX0NBTEwoIHRlbXBfc3RvcmFnZV90aHJlYWQgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoMCkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggc2VxX3RocmVhZFtpXSA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLAorCQkJCQkJCQkJCQkJIHNpemVvZihDdlJlY3QpLCB0ZW1wX3N0b3JhZ2VfdGhyZWFkICkpOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBzZXFfdGhyZWFkWzBdID0gc2VxOworCQorICAgIGlmKCBDVl9NQVRfQ04oaW1nLT50eXBlKSA+IDEgKQorICAgIHsKKyAgICAgICAgY3ZDdnRDb2xvciggaW1nLCB0ZW1wLCBDVl9CR1IyR1JBWSApOworICAgICAgICBpbWcgPSB0ZW1wOworICAgIH0KKwkKKyAgICBpZiggZmxhZ3MgJiBDVl9IQUFSX0ZJTkRfQklHR0VTVF9PQkpFQ1QgKQorICAgICAgICBmbGFncyAmPSB+KENWX0hBQVJfU0NBTEVfSU1BR0V8Q1ZfSEFBUl9ET19DQU5OWV9QUlVOSU5HKTsKKwkKKy8vICAgIGlmKCBmbGFncyAmIENWX0hBQVJfU0NBTEVfSU1BR0UgKQorLy8gICAgeworLy8gICAgICAgIEN2U2l6ZSB3aW5fc2l6ZTAgPSBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplOworLy8gICAgICAgIC8qaW50IHVzZV9pcHAgPSBjYXNjYWRlLT5oaWRfY2FzY2FkZS0+aXBwX3N0YWdlcyAhPSAwICYmCisvLwkJIGljdkFwcGx5SGFhckNsYXNzaWZpZXJfMzJmX0MxUl9wICE9IDA7CisvLwkJIAorLy8JCSBpZiggdXNlX2lwcCApCisvLwkJIENWX0NBTEwoIG5vcm1faW1nID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cywgaW1nLT5jb2xzLCBDVl8zMkZDMSApKTsqLworLy8gICAgICAgIENWX0NBTEwoIGltZ19zbWFsbCA9IGN2Q3JlYXRlTWF0KCBpbWctPnJvd3MgKyAxLCBpbWctPmNvbHMgKyAxLCBDVl84VUMxICkpOworLy8JCQorLy8gICAgICAgIGZvciggZmFjdG9yID0gMTsgOyBmYWN0b3IgKj0gc2NhbGVfZmFjdG9yICkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIGludCBzdHJpcF9jb3VudCwgc3RyaXBfc2l6ZTsKKy8vICAgICAgICAgICAgaW50IHlzdGVwID0gZmFjdG9yID4gMi4gPyAxIDogMjsKKy8vICAgICAgICAgICAgQ3ZTaXplIHdpbl9zaXplID0geyBjdlJvdW5kKHdpbl9zaXplMC53aWR0aCpmYWN0b3IpLAorLy8JCQljdlJvdW5kKHdpbl9zaXplMC5oZWlnaHQqZmFjdG9yKSB9OworLy8gICAgICAgICAgICBDdlNpemUgc3ogPSB7IGN2Um91bmQoIGltZy0+Y29scy9mYWN0b3IgKSwgY3ZSb3VuZCggaW1nLT5yb3dzL2ZhY3RvciApIH07CisvLyAgICAgICAgICAgIEN2U2l6ZSBzejEgPSB7IHN6LndpZHRoIC0gd2luX3NpemUwLndpZHRoLCBzei5oZWlnaHQgLSB3aW5fc2l6ZTAuaGVpZ2h0IH07CisvLyAgICAgICAgICAgIC8qQ3ZSZWN0IGVxdV9yZWN0ID0geyBpY3Zfb2JqZWN0X3dpbl9ib3JkZXIsIGljdl9vYmplY3Rfd2luX2JvcmRlciwKKy8vCQkJIHdpbl9zaXplMC53aWR0aCAtIGljdl9vYmplY3Rfd2luX2JvcmRlcioyLAorLy8JCQkgd2luX3NpemUwLmhlaWdodCAtIGljdl9vYmplY3Rfd2luX2JvcmRlcioyIH07Ki8KKy8vICAgICAgICAgICAgQ3ZNYXQgaW1nMSwgc3VtMSwgc3FzdW0xLCBub3JtMSwgdGlsdGVkMSwgbWFzazE7CisvLyAgICAgICAgICAgIEN2TWF0KiBfdGlsdGVkID0gMDsKKy8vCQkJCisvLyAgICAgICAgICAgIGlmKCBzejEud2lkdGggPD0gMCB8fCBzejEuaGVpZ2h0IDw9IDAgKQorLy8gICAgICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgICAgIGlmKCB3aW5fc2l6ZS53aWR0aCA8IG1pbl9zaXplLndpZHRoIHx8IHdpbl9zaXplLmhlaWdodCA8IG1pbl9zaXplLmhlaWdodCApCisvLyAgICAgICAgICAgICAgICBjb250aW51ZTsKKy8vCQkJCisvLyAgICAgICAgICAgIGltZzEgPSBjdk1hdCggc3ouaGVpZ2h0LCBzei53aWR0aCwgQ1ZfOFVDMSwgaW1nX3NtYWxsLT5kYXRhLnB0ciApOworLy8gICAgICAgICAgICBzdW0xID0gY3ZNYXQoIHN6LmhlaWdodCsxLCBzei53aWR0aCsxLCBDVl8zMlNDMSwgc3VtLT5kYXRhLnB0ciApOworLy8gICAgICAgICAgICBzcXN1bTEgPSBjdk1hdCggc3ouaGVpZ2h0KzEsIHN6LndpZHRoKzEsIENWXzY0RkMxLCBzcXN1bS0+ZGF0YS5wdHIgKTsKKy8vICAgICAgICAgICAgaWYoIHRpbHRlZCApCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIHRpbHRlZDEgPSBjdk1hdCggc3ouaGVpZ2h0KzEsIHN6LndpZHRoKzEsIENWXzMyU0MxLCB0aWx0ZWQtPmRhdGEucHRyICk7CisvLyAgICAgICAgICAgICAgICBfdGlsdGVkID0gJnRpbHRlZDE7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgbm9ybTEgPSBjdk1hdCggc3oxLmhlaWdodCwgc3oxLndpZHRoLCBDVl8zMkZDMSwgbm9ybV9pbWcgPyBub3JtX2ltZy0+ZGF0YS5wdHIgOiAwICk7CisvLyAgICAgICAgICAgIG1hc2sxID0gY3ZNYXQoIHN6MS5oZWlnaHQsIHN6MS53aWR0aCwgQ1ZfOFVDMSwgdGVtcC0+ZGF0YS5wdHIgKTsKKy8vCQkJCisvLyAgICAgICAgICAgIGN2UmVzaXplKCBpbWcsICZpbWcxLCBDVl9JTlRFUl9MSU5FQVIgKTsKKy8vICAgICAgICAgICAgY3ZJbnRlZ3JhbCggJmltZzEsICZzdW0xLCAmc3FzdW0xLCBfdGlsdGVkICk7CisvLwkJCQorLy8gICAgICAgICAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKy8vICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgc3RyaXBfY291bnQgPSBNQVgoTUlOKHN6MS5oZWlnaHQveXN0ZXAsIG1heF90aHJlYWRzKjMpLCAxKTsKKy8vICAgICAgICAgICAgICAgIHN0cmlwX3NpemUgPSAoc3oxLmhlaWdodCArIHN0cmlwX2NvdW50IC0gMSkvc3RyaXBfY291bnQ7CisvLyAgICAgICAgICAgICAgICBzdHJpcF9zaXplID0gKHN0cmlwX3NpemUgLyB5c3RlcCkqeXN0ZXA7CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgZWxzZQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBzdHJpcF9jb3VudCA9IDE7CisvLyAgICAgICAgICAgICAgICBzdHJpcF9zaXplID0gc3oxLmhlaWdodDsKKy8vICAgICAgICAgICAgfQorLy8JCQkKKy8vICAgICAgICAgICAgLy9pZiggIXVzZV9pcHAgKQorLy8JCQljdlNldEltYWdlc0ZvckhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggY2FzY2FkZSwgJnN1bTEsICZzcXN1bTEsIDAsIDEuICk7CisvLyAgICAgICAgICAgIC8qZWxzZQorLy8JCQkgeworLy8JCQkgZm9yKCBpID0gMDsgaSA8PSBzei5oZWlnaHQ7IGkrKyApCisvLwkJCSB7CisvLwkJCSBjb25zdCBpbnQqIGlzdW0gPSAoaW50Kikoc3VtMS5kYXRhLnB0ciArIHN1bTEuc3RlcCppKTsKKy8vCQkJIGZsb2F0KiBmc3VtID0gKGZsb2F0Kilpc3VtOworLy8JCQkgY29uc3QgaW50IEZMVF9ERUxUQSA9IC0oMSA8PCAyNCk7CisvLwkJCSBpbnQgajsKKy8vCQkJIGZvciggaiA9IDA7IGogPD0gc3oud2lkdGg7IGorKyApCisvLwkJCSBmc3VtW2pdID0gKGZsb2F0KShpc3VtW2pdICsgRkxUX0RFTFRBKTsKKy8vCQkJIH0KKy8vCQkJIH0qLworLy8JCQkKKy8vI2lmZGVmIF9PUEVOTVAKKy8vI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIG51bV90aHJlYWRzKG1heF90aHJlYWRzKSBzY2hlZHVsZShkeW5hbWljKQorLy8jZW5kaWYKKy8vICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHN0cmlwX2NvdW50OyBpKysgKQorLy8gICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICBpbnQgdGhyZWFkX2lkID0gY3ZHZXRUaHJlYWROdW0oKTsKKy8vICAgICAgICAgICAgICAgIGludCBwb3NpdGl2ZSA9IDA7CisvLyAgICAgICAgICAgICAgICBpbnQgeTEgPSBpKnN0cmlwX3NpemUsIHkyID0gKGkrMSkqc3RyaXBfc2l6ZS8qIC0geXN0ZXAgKyAxKi87CisvLyAgICAgICAgICAgICAgICBDdlNpemUgc3N6OworLy8gICAgICAgICAgICAgICAgaW50IHgsIHk7CisvLyAgICAgICAgICAgICAgICBpZiggaSA9PSBzdHJpcF9jb3VudCAtIDEgfHwgeTIgPiBzejEuaGVpZ2h0ICkKKy8vICAgICAgICAgICAgICAgICAgICB5MiA9IHN6MS5oZWlnaHQ7CisvLyAgICAgICAgICAgICAgICBzc3ogPSBjdlNpemUoc3oxLndpZHRoLCB5MiAtIHkxKTsKKy8vCQkJCQorLy8gICAgICAgICAgICAgICAgLyppZiggdXNlX2lwcCApCisvLwkJCQkgeworLy8JCQkJIGljdlJlY3RTdGREZXZfMzJmX0MxUl9wKAorLy8JCQkJIChmbG9hdCopKHN1bTEuZGF0YS5wdHIgKyB5MSpzdW0xLnN0ZXApLCBzdW0xLnN0ZXAsCisvLwkJCQkgKGRvdWJsZSopKHNxc3VtMS5kYXRhLnB0ciArIHkxKnNxc3VtMS5zdGVwKSwgc3FzdW0xLnN0ZXAsCisvLwkJCQkgKGZsb2F0Kikobm9ybTEuZGF0YS5wdHIgKyB5MSpub3JtMS5zdGVwKSwgbm9ybTEuc3RlcCwgc3N6LCBlcXVfcmVjdCApOworLy8JCQkJIAorLy8JCQkJIHBvc2l0aXZlID0gKHNzei53aWR0aC95c3RlcCkqKChzc3ouaGVpZ2h0ICsgeXN0ZXAtMSkveXN0ZXApOworLy8JCQkJIG1lbXNldCggbWFzazEuZGF0YS5wdHIgKyB5MSptYXNrMS5zdGVwLCB5c3RlcCA9PSAxLCBtYXNrMS5oZWlnaHQqbWFzazEuc3RlcCk7CisvLwkJCQkgCisvLwkJCQkgaWYoIHlzdGVwID4gMSApCisvLwkJCQkgeworLy8JCQkJIGZvciggeSA9IHkxLCBwb3NpdGl2ZSA9IDA7IHkgPCB5MjsgeSArPSB5c3RlcCApCisvLwkJCQkgZm9yKCB4ID0gMDsgeCA8IHNzei53aWR0aDsgeCArPSB5c3RlcCApCisvLwkJCQkgbWFzazEuZGF0YS5wdHJbbWFzazEuc3RlcCp5ICsgeF0gPSAodWNoYXIpMTsKKy8vCQkJCSB9CisvLwkJCQkgCisvLwkJCQkgZm9yKCBpbnQgaiA9IDA7IGogPCBjYXNjYWRlLT5jb3VudDsgaisrICkKKy8vCQkJCSB7CisvLwkJCQkgaWYoIGljdkFwcGx5SGFhckNsYXNzaWZpZXJfMzJmX0MxUl9wKAorLy8JCQkJIChmbG9hdCopKHN1bTEuZGF0YS5wdHIgKyB5MSpzdW0xLnN0ZXApLCBzdW0xLnN0ZXAsCisvLwkJCQkgKGZsb2F0Kikobm9ybTEuZGF0YS5wdHIgKyB5MSpub3JtMS5zdGVwKSwgbm9ybTEuc3RlcCwKKy8vCQkJCSBtYXNrMS5kYXRhLnB0ciArIHkxKm1hc2sxLnN0ZXAsIG1hc2sxLnN0ZXAsIHNzeiwgJnBvc2l0aXZlLAorLy8JCQkJIGNhc2NhZGUtPmhpZF9jYXNjYWRlLT5zdGFnZV9jbGFzc2lmaWVyW2pdLnRocmVzaG9sZCwKKy8vCQkJCSBjYXNjYWRlLT5oaWRfY2FzY2FkZS0+aXBwX3N0YWdlc1tqXSkgPCAwICkKKy8vCQkJCSB7CisvLwkJCQkgcG9zaXRpdmUgPSAwOworLy8JCQkJIGJyZWFrOworLy8JCQkJIH0KKy8vCQkJCSBpZiggcG9zaXRpdmUgPD0gMCApCisvLwkJCQkgYnJlYWs7CisvLwkJCQkgfQorLy8JCQkJIH0KKy8vCQkJCSBlbHNlKi8KKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICBmb3IoIHkgPSB5MSwgcG9zaXRpdmUgPSAwOyB5IDwgeTI7IHkgKz0geXN0ZXAgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc3N6LndpZHRoOyB4ICs9IHlzdGVwICkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzazEuZGF0YS5wdHJbbWFzazEuc3RlcCp5ICsgeF0gPQorLy8JCQkJCQkJbXljdlJ1bkhhYXJDbGFzc2lmaWVyQ2FzY2FkZSggY2FzY2FkZSwgY3ZQb2ludCh4LHkpLCAwICkgPiAwOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUgKz0gbWFzazEuZGF0YS5wdHJbbWFzazEuc3RlcCp5ICsgeF07CisvLyAgICAgICAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgIH0KKy8vCQkJCQorLy8gICAgICAgICAgICAgICAgaWYoIHBvc2l0aXZlID4gMCApCisvLyAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgZm9yKCB5ID0geTE7IHkgPCB5MjsgeSArPSB5c3RlcCApCisvLyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzc3oud2lkdGg7IHggKz0geXN0ZXAgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG1hc2sxLmRhdGEucHRyW21hc2sxLnN0ZXAqeSArIHhdICE9IDAgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCBvYmpfcmVjdCA9IHsgY3ZSb3VuZCh4KmZhY3RvciksIGN2Um91bmQoeSpmYWN0b3IpLAorLy8JCQkJCQkJCXdpbl9zaXplLndpZHRoLCB3aW5fc2l6ZS5oZWlnaHQgfTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHNlcV90aHJlYWRbdGhyZWFkX2lkXSwgJm9ial9yZWN0ICk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgIH0KKy8vCQkJCisvLyAgICAgICAgICAgIC8vIGdhdGhlciB0aGUgcmVzdWx0cworLy8gICAgICAgICAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKy8vICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBtYXhfdGhyZWFkczsgaSsrICkKKy8vICAgICAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgICAgICBDdlNlcSogcyA9IHNlcV90aHJlYWRbaV07CisvLyAgICAgICAgICAgICAgICAgICAgaW50IGosIHRvdGFsID0gcy0+dG90YWw7CisvLyAgICAgICAgICAgICAgICAgICAgQ3ZTZXFCbG9jayogYiA9IHMtPmZpcnN0OworLy8gICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB0b3RhbDsgaiArPSBiLT5jb3VudCwgYiA9IGItPm5leHQgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2hNdWx0aSggc2VxLCBiLT5kYXRhLCBiLT5jb3VudCApOworLy8gICAgICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vICAgIH0KKy8vICAgIGVsc2UKKwl0MSA9IChkb3VibGUpY3ZHZXRUaWNrQ291bnQoKTsKKy8vCXByaW50ZiggImluaXQgdGltZSA9ICVnbXNcbiIsICh0MSAtIHQpL3RpY2tGcmVxVGltZXMxMDAwKTsKKwl0ID0gdDE7CisJCisgICAgeworICAgICAgICBpbnQgbl9mYWN0b3JzID0gMDsKKyAgICAgICAgQ3ZSZWN0IHNjYW5fcm9pX3JlY3QgPSB7MCwwLDAsMH07CisgICAgICAgIGJvb2wgaXNfZm91bmQgPSBmYWxzZSwgc2Nhbl9yb2kgPSBmYWxzZTsKKwkJCisgICAgICAgIGN2SW50ZWdyYWwoIGltZywgc3VtLCBzcXN1bSwgdGlsdGVkICk7CisJCQorLy8gICAgICAgIGlmKCBkb19jYW5ueV9wcnVuaW5nICkKKy8vICAgICAgICB7CisvLyAgICAgICAgICAgIHN1bWNhbm55ID0gY3ZDcmVhdGVNYXQoIGltZy0+cm93cyArIDEsIGltZy0+Y29scyArIDEsIENWXzMyU0MxICk7CisvLyAgICAgICAgICAgIGN2Q2FubnkoIGltZywgdGVtcCwgMCwgNTAsIDMgKTsKKy8vICAgICAgICAgICAgY3ZJbnRlZ3JhbCggdGVtcCwgc3VtY2FubnkgKTsKKy8vICAgICAgICB9CisJCQorICAgICAgICBpZiggKHVuc2lnbmVkKXNwbGl0X3N0YWdlID49ICh1bnNpZ25lZCljYXNjYWRlLT5jb3VudCB8fAorCQkgICAoKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKWNhc2NhZGUtPmhpZF9jYXNjYWRlKS0+aXNfdHJlZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwbGl0X3N0YWdlID0gY2FzY2FkZS0+Y291bnQ7CisgICAgICAgICAgICBucGFzcyA9IDE7CisgICAgICAgIH0KKwkJCisgICAgICAgIGZvciggbl9mYWN0b3JzID0gMCwgZmFjdG9yID0gMTsKKwkJCWZhY3RvcipjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLndpZHRoIDwgaW1nLT5jb2xzIC0gMTAgJiYKKwkJCWZhY3RvcipjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLmhlaWdodCA8IGltZy0+cm93cyAtIDEwOworCQkJbl9mYWN0b3JzKyssIGZhY3RvciAqPSBzY2FsZV9mYWN0b3IgKQorICAgICAgICAgICAgOworCQkKKyAgICAgICAgaWYoIGZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICB7CisgICAgICAgICAgICBzY2FsZV9mYWN0b3IgPSAxLi9zY2FsZV9mYWN0b3I7CisgICAgICAgICAgICBmYWN0b3IgKj0gc2NhbGVfZmFjdG9yOworICAgICAgICAgICAgYmlnX3NlcSA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZSZWN0KSwgdGVtcF9zdG9yYWdlICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmFjdG9yID0gMTsKKwkJCQkKKyAgICAgICAgZm9yKCA7IG5fZmFjdG9ycy0tID4gMCAmJiAhaXNfZm91bmQ7IGZhY3RvciAqPSBzY2FsZV9mYWN0b3IgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgeXN0ZXAgPSBNQVgoIDIsIGZhY3RvciApOworICAgICAgICAgICAgQ3ZTaXplIHdpbl9zaXplID0geyBjdlJvdW5kKCBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLndpZHRoICogZmFjdG9yICksCisJCQljdlJvdW5kKCBjYXNjYWRlLT5vcmlnX3dpbmRvd19zaXplLmhlaWdodCAqIGZhY3RvciApfTsKKyAgICAgICAgICAgIEN2UmVjdCBlcXVfcmVjdCA9IHsgMCwgMCwgMCwgMCB9OworICAgICAgICAgICAgaW50ICpwMCA9IDAsICpwMSA9IDAsICpwMiA9IDAsICpwMyA9IDA7CisgICAgICAgICAgICBpbnQgKnBxMCA9IDAsICpwcTEgPSAwLCAqcHEyID0gMCwgKnBxMyA9IDA7CisgICAgICAgICAgICBpbnQgcGFzcywgc3RhZ2Vfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGludCBzdGFydF94ID0gMCwgc3RhcnRfeSA9IDA7CisgICAgICAgICAgICBpbnQgZW5kX3ggPSBjdlJvdW5kKChpbWctPmNvbHMgLSB3aW5fc2l6ZS53aWR0aCkgLyB5c3RlcCk7CisgICAgICAgICAgICBpbnQgZW5kX3kgPSBjdlJvdW5kKChpbWctPnJvd3MgLSB3aW5fc2l6ZS5oZWlnaHQpIC8geXN0ZXApOworCQkJCisgICAgICAgICAgICBpZiggd2luX3NpemUud2lkdGggPCBtaW5fc2l6ZS53aWR0aCB8fCB3aW5fc2l6ZS5oZWlnaHQgPCBtaW5fc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBmaW5kX2JpZ2dlc3Rfb2JqZWN0ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIG15Y3ZTZXRJbWFnZXNGb3JIYWFyQ2xhc3NpZmllckNhc2NhZGUoIGNhc2NhZGUsIHN1bSwgc3FzdW0sIHRpbHRlZCwgZmFjdG9yICk7CisgICAgICAgICAgICBjdlplcm8oIHRlbXAgKTsKKwkJCQorLy8gICAgICAgICAgICBpZiggZG9fY2FubnlfcHJ1bmluZyApCisvLyAgICAgICAgICAgIHsKKy8vICAgICAgICAgICAgICAgIGVxdV9yZWN0LnggPSBjdlJvdW5kKHdpbl9zaXplLndpZHRoKjAuMTUpOworLy8gICAgICAgICAgICAgICAgZXF1X3JlY3QueSA9IGN2Um91bmQod2luX3NpemUuaGVpZ2h0KjAuMTUpOworLy8gICAgICAgICAgICAgICAgZXF1X3JlY3Qud2lkdGggPSBjdlJvdW5kKHdpbl9zaXplLndpZHRoKjAuNyk7CisvLyAgICAgICAgICAgICAgICBlcXVfcmVjdC5oZWlnaHQgPSBjdlJvdW5kKHdpbl9zaXplLmhlaWdodCowLjcpOworLy8JCQkJCisvLyAgICAgICAgICAgICAgICBwMCA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyBlcXVfcmVjdC55KnN1bWNhbm55LT5zdGVwKSArIGVxdV9yZWN0Lng7CisvLyAgICAgICAgICAgICAgICBwMSA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyBlcXVfcmVjdC55KnN1bWNhbm55LT5zdGVwKQorLy8JCQkJKyBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGg7CisvLyAgICAgICAgICAgICAgICBwMiA9IChpbnQqKShzdW1jYW5ueS0+ZGF0YS5wdHIgKyAoZXF1X3JlY3QueSArIGVxdV9yZWN0LmhlaWdodCkqc3VtY2FubnktPnN0ZXApICsgZXF1X3JlY3QueDsKKy8vICAgICAgICAgICAgICAgIHAzID0gKGludCopKHN1bWNhbm55LT5kYXRhLnB0ciArIChlcXVfcmVjdC55ICsgZXF1X3JlY3QuaGVpZ2h0KSpzdW1jYW5ueS0+c3RlcCkKKy8vCQkJCSsgZXF1X3JlY3QueCArIGVxdV9yZWN0LndpZHRoOworLy8JCQkJCisvLyAgICAgICAgICAgICAgICBwcTAgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIGVxdV9yZWN0Lnkqc3VtLT5zdGVwKSArIGVxdV9yZWN0Lng7CisvLyAgICAgICAgICAgICAgICBwcTEgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIGVxdV9yZWN0Lnkqc3VtLT5zdGVwKQorLy8JCQkJKyBlcXVfcmVjdC54ICsgZXF1X3JlY3Qud2lkdGg7CisvLyAgICAgICAgICAgICAgICBwcTIgPSAoaW50Kikoc3VtLT5kYXRhLnB0ciArIChlcXVfcmVjdC55ICsgZXF1X3JlY3QuaGVpZ2h0KSpzdW0tPnN0ZXApICsgZXF1X3JlY3QueDsKKy8vICAgICAgICAgICAgICAgIHBxMyA9IChpbnQqKShzdW0tPmRhdGEucHRyICsgKGVxdV9yZWN0LnkgKyBlcXVfcmVjdC5oZWlnaHQpKnN1bS0+c3RlcCkKKy8vCQkJCSsgZXF1X3JlY3QueCArIGVxdV9yZWN0LndpZHRoOworLy8gICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIGlmKCBzY2FuX3JvaSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy9hZGp1c3Qgc3RhcnRfaGVpZ2h0IGFuZCBzdG9wX2hlaWdodAorICAgICAgICAgICAgICAgIHN0YXJ0X3kgPSBjdlJvdW5kKHNjYW5fcm9pX3JlY3QueSAvIHlzdGVwKTsKKyAgICAgICAgICAgICAgICBlbmRfeSA9IGN2Um91bmQoKHNjYW5fcm9pX3JlY3QueSArIHNjYW5fcm9pX3JlY3QuaGVpZ2h0IC0gd2luX3NpemUuaGVpZ2h0KSAvIHlzdGVwKTsKKwkJCQkKKyAgICAgICAgICAgICAgICBzdGFydF94ID0gY3ZSb3VuZChzY2FuX3JvaV9yZWN0LnggLyB5c3RlcCk7CisgICAgICAgICAgICAgICAgZW5kX3ggPSBjdlJvdW5kKChzY2FuX3JvaV9yZWN0LnggKyBzY2FuX3JvaV9yZWN0LndpZHRoIC0gd2luX3NpemUud2lkdGgpIC8geXN0ZXApOworICAgICAgICAgICAgfQorCQkJCisgICAgICAgICAgICAoKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKWNhc2NhZGUtPmhpZF9jYXNjYWRlKS0+Y291bnQgPSBzcGxpdF9zdGFnZTsKKwkJCQorICAgICAgICAgICAgZm9yKCBwYXNzID0gMDsgcGFzcyA8IG5wYXNzOyBwYXNzKysgKQorICAgICAgICAgICAgeworI2lmZGVmIF9PUEVOTVAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBudW1fdGhyZWFkcyhtYXhfdGhyZWFkcykgc2NoZWR1bGUoZHluYW1pYykKKyNlbmRpZgorICAgICAgICAgICAgICAgIGZvciggaW50IF9peSA9IHN0YXJ0X3k7IF9peSA8IGVuZF95OyBfaXkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdGhyZWFkX2lkID0gY3ZHZXRUaHJlYWROdW0oKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl5ID0gY3ZSb3VuZChfaXkqeXN0ZXApOworICAgICAgICAgICAgICAgICAgICBpbnQgX2l4LCBfeHN0ZXAgPSAxOworICAgICAgICAgICAgICAgICAgICB1Y2hhciogbWFza19yb3cgPSB0ZW1wLT5kYXRhLnB0ciArIHRlbXAtPnN0ZXAgKiBpeTsKKwkJCQkJCisgICAgICAgICAgICAgICAgICAgIGZvciggX2l4ID0gc3RhcnRfeDsgX2l4IDwgZW5kX3g7IF9peCArPSBfeHN0ZXAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaXggPSBjdlJvdW5kKF9peCp5c3RlcCk7IC8vIGl0IHJlYWxseSBzaG91bGQgYmUgeXN0ZXAKKwkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBhc3MgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfeHN0ZXAgPSAyOworCQkJCQkJCQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGRvX2Nhbm55X3BydW5pbmcgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgeworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQ7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHMsIHNxOworLy8JCQkJCQkJCQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IGl5KihzdW0tPnN0ZXAvc2l6ZW9mKHAwWzBdKSkgKyBpeDsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0gcDBbb2Zmc2V0XSAtIHAxW29mZnNldF0gLSBwMltvZmZzZXRdICsgcDNbb2Zmc2V0XTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcSA9IHBxMFtvZmZzZXRdIC0gcHExW29mZnNldF0gLSBwcTJbb2Zmc2V0XSArIHBxM1tvZmZzZXRdOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzIDwgMTAwIHx8IHNxIDwgMjAgKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBteWN2UnVuSGFhckNsYXNzaWZpZXJDYXNjYWRlKCBjYXNjYWRlLCBjdlBvaW50KGl4LGl5KSwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwYXNzIDwgbnBhc3MgLSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcm93W2l4XSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHJlY3QgPSBjdlJlY3QoaXgsaXksd2luX3NpemUud2lkdGgsd2luX3NpemUuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggc2VxX3RocmVhZFt0aHJlYWRfaWRdLCAmcmVjdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZXN1bHQgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3hzdGVwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIG1hc2tfcm93W2l4XSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IG15Y3ZSdW5IYWFyQ2xhc3NpZmllckNhc2NhZGUoIGNhc2NhZGUsIGN2UG9pbnQoaXgsaXkpLAorCQkJCQkJCQkJCQkJCQkJCQlzdGFnZV9vZmZzZXQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcmVzdWx0ID4gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGFzcyA9PSBucGFzcyAtIDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgcmVjdCA9IGN2UmVjdChpeCxpeSx3aW5fc2l6ZS53aWR0aCx3aW5fc2l6ZS5oZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKCBzZXFfdGhyZWFkW3RocmVhZF9pZF0sICZyZWN0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3Jvd1tpeF0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWdlX29mZnNldCA9ICgoTXlDdkhpZEhhYXJDbGFzc2lmaWVyQ2FzY2FkZSopY2FzY2FkZS0+aGlkX2Nhc2NhZGUpLT5jb3VudDsKKyAgICAgICAgICAgICAgICAoKE15Q3ZIaWRIYWFyQ2xhc3NpZmllckNhc2NhZGUqKWNhc2NhZGUtPmhpZF9jYXNjYWRlKS0+Y291bnQgPSBjYXNjYWRlLT5jb3VudDsKKyAgICAgICAgICAgIH0KKwkJCQorICAgICAgICAgICAgLy8gZ2F0aGVyIHRoZSByZXN1bHRzCisgICAgICAgICAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKwkgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbWF4X3RocmVhZHM7IGkrKyApCisJICAgICAgICAgICAgeworCQkgICAgICAgICAgICBDdlNlcSogcyA9IHNlcV90aHJlYWRbaV07CisgICAgICAgICAgICAgICAgICAgIGludCBqLCB0b3RhbCA9IHMtPnRvdGFsOworICAgICAgICAgICAgICAgICAgICBDdlNlcUJsb2NrKiBiID0gcy0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB0b3RhbDsgaiArPSBiLT5jb3VudCwgYiA9IGItPm5leHQgKQorICAgICAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoTXVsdGkoIHNlcSwgYi0+ZGF0YSwgYi0+Y291bnQgKTsKKwkgICAgICAgICAgICB9CisJCQkKKyAgICAgICAgICAgIGlmKCBmaW5kX2JpZ2dlc3Rfb2JqZWN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlNlcSogYnNlcSA9IG1pbl9uZWlnaGJvcnMgPiAwID8gYmlnX3NlcSA6IHNlcTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggbWluX25laWdoYm9ycyA+IDAgJiYgIXNjYW5fcm9pICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwIHJldHJpZXZlZCByZWN0YW5nbGVzIGluIG9yZGVyIHRvIGZpbHRlciBvdXQgbm9pc2UKKyAgICAgICAgICAgICAgICAgICAgaW50IG5jb21wID0gY3ZTZXFQYXJ0aXRpb24oIHNlcSwgMCwgJmlkeF9zZXEsIG15aXNfZXF1YWwsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY29tcHMgPSAoQ3ZBdmdDb21wKiljdkFsbG9jKCAobmNvbXArMSkqc2l6ZW9mKGNvbXBzWzBdKSkpOworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGNvbXBzLCAwLCAobmNvbXArMSkqc2l6ZW9mKGNvbXBzWzBdKSk7CisJCQkJCQorI2lmIFZFUllfUk9VR0hfU0VBUkNICisgICAgICAgICAgICAgICAgICAgIGlmKCByb3VnaF9zZWFyY2ggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgcjEgPSAqKEN2UmVjdCopY3ZHZXRTZXFFbGVtKCBzZXEsIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKihpbnQqKWN2R2V0U2VxRWxlbSggaWR4X3NlcSwgaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZCluY29tcCApOworCQkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ubmVpZ2hib3JzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnggKz0gcjEueDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QueSArPSByMS55OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC53aWR0aCArPSByMS53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QuaGVpZ2h0ICs9IHIxLmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgYm91bmRpbmcgYm94CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbmNvbXA7IGkrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG4gPSBjb21wc1tpXS5uZWlnaGJvcnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG4gPj0gbWluX25laWdoYm9ycyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkF2Z0NvbXAgY29tcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LnggPSAoY29tcHNbaV0ucmVjdC54KjIgKyBuKS8oMipuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LnkgPSAoY29tcHNbaV0ucmVjdC55KjIgKyBuKS8oMipuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LndpZHRoID0gKGNvbXBzW2ldLnJlY3Qud2lkdGgqMiArIG4pLygyKm4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3QuaGVpZ2h0ID0gKGNvbXBzW2ldLnJlY3QuaGVpZ2h0KjIgKyBuKS8oMipuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5uZWlnaGJvcnMgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIGJzZXEsICZjb21wICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwIDsgaSA8PSBuY29tcDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpXS5yZWN0LnggPSBjb21wc1tpXS5yZWN0LnkgPSBJTlRfTUFYOworCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3VudCBudW1iZXIgb2YgbmVpZ2hib3JzCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3QgcjEgPSAqKEN2UmVjdCopY3ZHZXRTZXFFbGVtKCBzZXEsIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKihpbnQqKWN2R2V0U2VxRWxlbSggaWR4X3NlcSwgaSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZCluY29tcCApOworCQkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ubmVpZ2hib3JzKys7CisJCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjdC53aWR0aCBhbmQgcmVjdC5oZWlnaHQgd2lsbCBzdG9yZSBjb29yZGluYXRlIG9mIHJpZ2h0LWJvdHRvbSBjb3JuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QueCA9IE1JTihjb21wc1tpZHhdLnJlY3QueCwgcjEueCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnkgPSBNSU4oY29tcHNbaWR4XS5yZWN0LnksIHIxLnkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC53aWR0aCA9IE1BWChjb21wc1tpZHhdLnJlY3Qud2lkdGgsIHIxLngrcjEud2lkdGgtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LmhlaWdodCA9IE1BWChjb21wc1tpZHhdLnJlY3QuaGVpZ2h0LCByMS55K3IxLmhlaWdodC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGVuY2xvc2luZyBib3gKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY29tcDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbiA9IGNvbXBzW2ldLm5laWdoYm9yczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbiA+PSBtaW5fbmVpZ2hib3JzICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXZnQ29tcCBjb21wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl9zY2FsZSA9IHJvdWdoX3NlYXJjaCA/IDAuNiA6IDAuNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LnggPSBjb21wc1tpXS5yZWN0Lng7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC55ID0gY29tcHNbaV0ucmVjdC55OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSBjb21wc1tpXS5yZWN0LndpZHRoIC0gY29tcHNbaV0ucmVjdC54ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IGNvbXBzW2ldLnJlY3QuaGVpZ2h0IC0gY29tcHNbaV0ucmVjdC55ICsgMTsKKwkJCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBtaW5fc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gY3ZSb3VuZCggY29tcC5yZWN0LndpZHRoKm1pbl9zY2FsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2l6ZS53aWR0aCA9IE1BWCggbWluX3NpemUud2lkdGgsIHQgKTsKKwkJCQkJCQkJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBjdlJvdW5kKCBjb21wLnJlY3QuaGVpZ2h0Km1pbl9zY2FsZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5fc2l6ZS5oZWlnaHQgPSBNQVgoIG1pbl9zaXplLmhlaWdodCwgdCApOworCQkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9leHBhbmQgdGhlIGJveCBieSAyMCUgYmVjYXVzZSB3ZSBjb3VsZCBtaXNzIHNvbWUgbmVpZ2hib3VycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NlZSAnaXNfZXF1YWwnIGZ1bmN0aW9uCisjaWYgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gY3ZSb3VuZChjb21wLnJlY3Qud2lkdGggKiAwLjIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmlnaHQgPSBNSU4oIGltZy0+Y29scy0xLCBjb21wLnJlY3QueCtjb21wLnJlY3Qud2lkdGgtMSArIG9mZnNldCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYm90dG9tID0gTUlOKCBpbWctPnJvd3MtMSwgY29tcC5yZWN0LnkrY29tcC5yZWN0LmhlaWdodC0xICsgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LnggPSBNQVgoIGNvbXAucmVjdC54IC0gb2Zmc2V0LCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAucmVjdC55ID0gTUFYKCBjb21wLnJlY3QueSAtIG9mZnNldCwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSByaWdodCAtIGNvbXAucmVjdC54ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IGJvdHRvbSAtIGNvbXAucmVjdC55ICsgMTsKKyNlbmRpZgorCQkJCQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcC5uZWlnaGJvcnMgPSBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIGJzZXEsICZjb21wICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQorICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZjb21wcyApOworICAgICAgICAgICAgICAgIH0KKwkJCQkKKyAgICAgICAgICAgICAgICAvLyBleHRyYWN0IHRoZSBiaWdnZXN0IHJlY3QKKyAgICAgICAgICAgICAgICBpZiggYnNlcS0+dG90YWwgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfYXJlYSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBic2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBdmdDb21wKiBjb21wID0gKEN2QXZnQ29tcCopY3ZHZXRTZXFFbGVtKCBic2VxLCBpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJlYSA9IGNvbXAtPnJlY3Qud2lkdGggKiBjb21wLT5yZWN0LmhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtYXhfYXJlYSA8IGFyZWEgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhID0gYXJlYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfY29tcC5yZWN0ID0gY29tcC0+cmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRfY29tcC5uZWlnaGJvcnMgPSBic2VxID09IHNlcSA/IDEgOiBjb21wLT5uZWlnaGJvcnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKwkJCQkJCisgICAgICAgICAgICAgICAgICAgIC8vUHJlcGFyZSBpbmZvcm1hdGlvbiBmb3IgZnVydGhlciBzY2FubmluZyBpbnNpZGUgdGhlIGJpZ2dlc3QgcmVjdGFuZ2xlCisJCQkJCQorI2lmIFZFUllfUk9VR0hfU0VBUkNICisgICAgICAgICAgICAgICAgICAgIC8vIGNoYW5nZSBzY2FuIHJhbmdlcyB0byByb2kgaW4gY2FzZSBvZiByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICBpZiggIXJvdWdoX3NlYXJjaCAmJiAhc2Nhbl9yb2kgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaV9yZWN0ID0gcmVzdWx0X2NvbXAucmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2Q2xlYXJTZXEoYnNlcSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggcm91Z2hfc2VhcmNoICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzX2ZvdW5kID0gdHJ1ZTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmKCAhc2Nhbl9yb2kgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2FuX3JvaV9yZWN0ID0gcmVzdWx0X2NvbXAucmVjdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2Q2xlYXJTZXEoYnNlcSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwkKKy8vCXQxID0gKGRvdWJsZSljdkdldFRpY2tDb3VudCgpOworLy8JcHJpbnRmKCAiZmFjdG9ycyB0aW1lID0gJWdtc1xuIiwgKHQxIC0gdCkvdGlja0ZyZXFUaW1lczEwMDApOworLy8JdCA9IHQxOworCisgICAgaWYoIG1pbl9uZWlnaGJvcnMgPT0gMCAmJiAhZmluZF9iaWdnZXN0X29iamVjdCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZSZWN0KiByZWN0ID0gKEN2UmVjdCopY3ZHZXRTZXFFbGVtKCBzZXEsIGkgKTsKKyAgICAgICAgICAgIEN2QXZnQ29tcCBjb21wOworICAgICAgICAgICAgY29tcC5yZWN0ID0gKnJlY3Q7CisgICAgICAgICAgICBjb21wLm5laWdoYm9ycyA9IDE7CisgICAgICAgICAgICBjdlNlcVB1c2goIHJlc3VsdF9zZXEsICZjb21wICk7CisgICAgICAgIH0KKyAgICB9CisJCisgICAgaWYoIG1pbl9uZWlnaGJvcnMgIT0gMAorI2lmIFZFUllfUk9VR0hfU0VBUkNIICAgICAgICAKKwkgICAmJiAoIWZpbmRfYmlnZ2VzdF9vYmplY3QgfHwgIXJvdWdoX3NlYXJjaCkKKyNlbmRpZiAgICAgICAgCisJICAgKQorICAgIHsKKyAgICAgICAgLy8gZ3JvdXAgcmV0cmlldmVkIHJlY3RhbmdsZXMgaW4gb3JkZXIgdG8gZmlsdGVyIG91dCBub2lzZQorICAgICAgICBpbnQgbmNvbXAgPSBjdlNlcVBhcnRpdGlvbiggc2VxLCAwLCAmaWR4X3NlcSwgbXlpc19lcXVhbCwgMCApOworICAgICAgICBDVl9DQUxMKCBjb21wcyA9IChDdkF2Z0NvbXAqKWN2QWxsb2MoIChuY29tcCsxKSpzaXplb2YoY29tcHNbMF0pKSk7CisgICAgICAgIG1lbXNldCggY29tcHMsIDAsIChuY29tcCsxKSpzaXplb2YoY29tcHNbMF0pKTsKKwkJCisgICAgICAgIC8vIGNvdW50IG51bWJlciBvZiBuZWlnaGJvcnMKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNlcS0+dG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UmVjdCByMSA9ICooQ3ZSZWN0KiljdkdldFNlcUVsZW0oIHNlcSwgaSApOworICAgICAgICAgICAgaW50IGlkeCA9ICooaW50KiljdkdldFNlcUVsZW0oIGlkeF9zZXEsIGkgKTsKKyAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZCluY29tcCApOworCQkJCisgICAgICAgICAgICBjb21wc1tpZHhdLm5laWdoYm9ycysrOworCQkJCisgICAgICAgICAgICBjb21wc1tpZHhdLnJlY3QueCArPSByMS54OworICAgICAgICAgICAgY29tcHNbaWR4XS5yZWN0LnkgKz0gcjEueTsKKyAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC53aWR0aCArPSByMS53aWR0aDsKKyAgICAgICAgICAgIGNvbXBzW2lkeF0ucmVjdC5oZWlnaHQgKz0gcjEuaGVpZ2h0OworICAgICAgICB9CisJCQorICAgICAgICAvLyBjYWxjdWxhdGUgYXZlcmFnZSBib3VuZGluZyBib3gKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5jb21wOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IGNvbXBzW2ldLm5laWdoYm9yczsKKyAgICAgICAgICAgIGlmKCBuID49IG1pbl9uZWlnaGJvcnMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2QXZnQ29tcCBjb21wOworICAgICAgICAgICAgICAgIGNvbXAucmVjdC54ID0gKGNvbXBzW2ldLnJlY3QueCoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgY29tcC5yZWN0LnkgPSAoY29tcHNbaV0ucmVjdC55KjIgKyBuKS8oMipuKTsKKyAgICAgICAgICAgICAgICBjb21wLnJlY3Qud2lkdGggPSAoY29tcHNbaV0ucmVjdC53aWR0aCoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgY29tcC5yZWN0LmhlaWdodCA9IChjb21wc1tpXS5yZWN0LmhlaWdodCoyICsgbikvKDIqbik7CisgICAgICAgICAgICAgICAgY29tcC5uZWlnaGJvcnMgPSBjb21wc1tpXS5uZWlnaGJvcnM7CisJCQkJCisgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKCBzZXEyLCAmY29tcCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisJCQorICAgICAgICBpZiggIWZpbmRfYmlnZ2VzdF9vYmplY3QgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IHNtYWxsIGZhY2UgcmVjdGFuZ2xlcyBpbnNpZGUgbGFyZ2UgZmFjZSByZWN0YW5nbGVzCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxMi0+dG90YWw7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZBdmdDb21wIHIxID0gKihDdkF2Z0NvbXAqKWN2R2V0U2VxRWxlbSggc2VxMiwgaSApOworICAgICAgICAgICAgICAgIGludCBqLCBmbGFnID0gMTsKKwkJCQkKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2VxMi0+dG90YWw7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkF2Z0NvbXAgcjIgPSAqKEN2QXZnQ29tcCopY3ZHZXRTZXFFbGVtKCBzZXEyLCBqICk7CisgICAgICAgICAgICAgICAgICAgIGludCBkaXN0YW5jZSA9IGN2Um91bmQoIHIyLnJlY3Qud2lkdGggKiAwLjIgKTsKKwkJCQkJCisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IGogJiYKKwkJCQkJICAgcjEucmVjdC54ID49IHIyLnJlY3QueCAtIGRpc3RhbmNlICYmCisJCQkJCSAgIHIxLnJlY3QueSA+PSByMi5yZWN0LnkgLSBkaXN0YW5jZSAmJgorCQkJCQkgICByMS5yZWN0LnggKyByMS5yZWN0LndpZHRoIDw9IHIyLnJlY3QueCArIHIyLnJlY3Qud2lkdGggKyBkaXN0YW5jZSAmJgorCQkJCQkgICByMS5yZWN0LnkgKyByMS5yZWN0LmhlaWdodCA8PSByMi5yZWN0LnkgKyByMi5yZWN0LmhlaWdodCArIGRpc3RhbmNlICYmCisJCQkJCSAgIChyMi5uZWlnaGJvcnMgPiBNQVgoIDMsIHIxLm5laWdoYm9ycyApIHx8IHIxLm5laWdoYm9ycyA8IDMpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwkJCQkKKyAgICAgICAgICAgICAgICBpZiggZmxhZyApCisgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggcmVzdWx0X3NlcSwgJnIxICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4X2FyZWEgPSAwOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNlcTItPnRvdGFsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2QXZnQ29tcCogY29tcCA9IChDdkF2Z0NvbXAqKWN2R2V0U2VxRWxlbSggc2VxMiwgaSApOworICAgICAgICAgICAgICAgIGludCBhcmVhID0gY29tcC0+cmVjdC53aWR0aCAqIGNvbXAtPnJlY3QuaGVpZ2h0OworICAgICAgICAgICAgICAgIGlmKCBtYXhfYXJlYSA8IGFyZWEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWEgPSBhcmVhOworICAgICAgICAgICAgICAgICAgICByZXN1bHRfY29tcCA9ICpjb21wOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisJCisJdDEgPSAoZG91YmxlKWN2R2V0VGlja0NvdW50KCk7CisvLwlwcmludGYoICJyZXN1bHRzIGV2YWwgdGltZSA9ICVnbXNcbiIsICh0MSAtIHQpL3RpY2tGcmVxVGltZXMxMDAwKTsKKwl0ID0gdDE7CisKKyAgICBpZiggZmluZF9iaWdnZXN0X29iamVjdCAmJiByZXN1bHRfY29tcC5yZWN0LndpZHRoID4gMCApCisgICAgICAgIGN2U2VxUHVzaCggcmVzdWx0X3NlcSwgJnJlc3VsdF9jb21wICk7CisJCisgICAgX19FTkRfXzsKKwkKKyAgICBpZiggbWF4X3RocmVhZHMgPiAxICkKKwkgICAgZm9yKCBpID0gMDsgaSA8IG1heF90aHJlYWRzOyBpKysgKQorCSAgICB7CisJCSAgICBpZiggc2VxX3RocmVhZFtpXSApCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnNlcV90aHJlYWRbaV0tPnN0b3JhZ2UgKTsKKwkgICAgfQorCQorICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZ0ZW1wX3N0b3JhZ2UgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzdW0gKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzcXN1bSApOworICAgIGN2UmVsZWFzZU1hdCggJnRpbHRlZCApOworICAgIGN2UmVsZWFzZU1hdCggJnRlbXAgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzdW1jYW5ueSApOworICAgIGN2UmVsZWFzZU1hdCggJm5vcm1faW1nICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmaW1nX3NtYWxsICk7CisgICAgY3ZGcmVlKCAmY29tcHMgKTsKKwkKKyAgICByZXR1cm4gcmVzdWx0X3NlcTsKK30KZGlmZiAtLWdpdCBhL2N2YXV4L2luY2x1ZGUvY3ZhdXguaCBiL2N2YXV4L2luY2x1ZGUvY3ZhdXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTAyZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvaW5jbHVkZS9jdmF1eC5oCkBAIC0wLDAgKzEsMTU3NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX19DVkFVWF9fSF9fCisjZGVmaW5lIF9fQ1ZBVVhfX0hfXworCisjaW5jbHVkZSAiY3YuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitDVkFQSShDdlNlcSopIGN2U2VnbWVudEltYWdlKCBjb25zdCBDdkFyciogc3JjYXJyLCBDdkFyciogZHN0YXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGNhbm55X3RocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmZmlsbF90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVpZ2VuIG9iamVjdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGludCAoQ1ZfQ0RFQ0wgKiBDdkNhbGxiYWNrKShpbnQgaW5kZXgsIHZvaWQqIGJ1ZmZlciwgdm9pZCogdXNlcl9kYXRhKTsKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBDdkNhbGxiYWNrIGNhbGxiYWNrOworICAgIHZvaWQqIGRhdGE7Cit9CitDdklucHV0OworCisjZGVmaW5lIENWX0VJR09CSl9OT19DQUxMQkFDSyAgICAgMAorI2RlZmluZSBDVl9FSUdPQkpfSU5QVVRfQ0FMTEJBQ0sgIDEKKyNkZWZpbmUgQ1ZfRUlHT0JKX09VVFBVVF9DQUxMQkFDSyAyCisjZGVmaW5lIENWX0VJR09CSl9CT1RIX0NBTExCQUNLICAgMworCisvKiBDYWxjdWxhdGVzIGNvdmFyaWF0aW9uIG1hdHJpeCBvZiBhIHNldCBvZiBhcnJheXMgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNDb3Zhck1hdHJpeEV4KCBpbnQgbk9iamVjdHMsIHZvaWQqIGlucHV0LCBpbnQgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW9CdWZTaXplLCB1Y2hhciogYnVmZmVyLCB2b2lkKiB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSogYXZnLCBmbG9hdCogY292YXJNYXRyaXggKTsKKworLyogQ2FsY3VsYXRlcyBlaWdlbiB2YWx1ZXMgYW5kIHZlY3RvcnMgb2YgY292YXJpYXRpb24gbWF0cml4IG9mIGEgc2V0IG9mCisgICBhcnJheXMgKi8KK0NWQVBJKHZvaWQpICBjdkNhbGNFaWdlbk9iamVjdHMoIGludCBuT2JqZWN0cywgdm9pZCogaW5wdXQsIHZvaWQqIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0ZsYWdzLCBpbnQgaW9CdWZTaXplLCB2b2lkKiB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhKiBjYWxjTGltaXQsIElwbEltYWdlKiBhdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZWlnVmFscyApOworCisvKiBDYWxjdWxhdGVzIGRvdCBwcm9kdWN0IChvYmogLSBhdmcpICogZWlnT2JqIChpLmUuIHByb2plY3RzIGltYWdlIHRvIGVpZ2VuIHZlY3RvcikgKi8KK0NWQVBJKGRvdWJsZSkgIGN2Q2FsY0RlY29tcENvZWZmKCBJcGxJbWFnZSogb2JqLCBJcGxJbWFnZSogZWlnT2JqLCBJcGxJbWFnZSogYXZnICk7CisKKy8qIFByb2plY3RzIGltYWdlIHRvIGVpZ2VuIHNwYWNlIChmaW5kcyBhbGwgZGVjb21wb3Npb24gY29lZmZpY2llbnRzICovCitDVkFQSSh2b2lkKSAgY3ZFaWdlbkRlY29tcG9zaXRlKCBJcGxJbWFnZSogb2JqLCBpbnQgbkVpZ09ianMsIHZvaWQqIGVpZ0lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvRmxhZ3MsIHZvaWQqIHVzZXJEYXRhLCBJcGxJbWFnZSogYXZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvZWZmcyApOworCisvKiBQcm9qZWN0cyBvcmlnaW5hbCBvYmplY3RzIHVzZWQgdG8gY2FsY3VsYXRlIGVpZ2VuIHNwYWNlIGJhc2lzIHRvIHRoYXQgc3BhY2UgKi8KK0NWQVBJKHZvaWQpICBjdkVpZ2VuUHJvamVjdGlvbiggdm9pZCogZWlnSW5wdXQsIGludCBuRWlnT2JqcywgaW50IGlvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJEYXRhLCBmbG9hdCogY29lZmZzLCBJcGxJbWFnZSogYXZnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSogcHJvaiApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxRC8yRCBITU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2SW1nT2JzSW5mbworeworICAgIGludCBvYnNfeDsKKyAgICBpbnQgb2JzX3k7CisgICAgaW50IG9ic19zaXplOworICAgIGZsb2F0KiBvYnM7Ly9jb25zZXF1dGl2ZSBvYnNlcnZhdGlvbnMKKworICAgIGludCogc3RhdGU7LyogYXJyIG9mIHBhaXJzIHN1cGVyc3RhdGUvc3RhdGUgdG8gd2hpY2ggb2JzZXJ2YXRpb24gYmVsb25nICovCisgICAgaW50KiBtaXg7ICAvKiBudW1iZXIgb2YgbWl4dHVyZSB0byB3aGljaCBvYnNlcnZhdGlvbiBiZWxvbmcgKi8KKworfQorQ3ZJbWdPYnNJbmZvOy8qc3RydWN0IGZvciAxIGltYWdlKi8KKwordHlwZWRlZiBDdkltZ09ic0luZm8gQ3YxRE9ic0luZm87CisKK3R5cGVkZWYgc3RydWN0IEN2RUhNTVN0YXRlCit7CisgICAgaW50IG51bV9taXg7ICAgICAgICAvKm51bWJlciBvZiBtaXh0dXJlcyBpbiB0aGlzIHN0YXRlKi8KKyAgICBmbG9hdCogbXU7ICAgICAgICAgIC8qbWVhbiB2ZWN0b3JzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtaXh0dXJlKi8KKyAgICBmbG9hdCogaW52X3ZhcjsgICAgIC8qIHNxdWFyZSByb290IG9mIGludmVyc2VkIHZhcmlhbmNlcyBjb3JyZXNwLiB0byBlYWNoIG1peHR1cmUqLworICAgIGZsb2F0KiBsb2dfdmFyX3ZhbDsgLyogc3VtIG9mIDAuNSAoTE4yUEkgKyBsbih2YXJpYW5jZVtpXSkgKSBmb3IgaT0xLG4gKi8KKyAgICBmbG9hdCogd2VpZ2h0OyAgICAgIC8qYXJyYXkgb2YgbWl4dHVyZSB3ZWlnaHRzLiBTdW1tIG9mIGFsbCB3ZWlnaHRzIGluIHN0YXRlIGlzIDEuICovCisKK30KK0N2RUhNTVN0YXRlOworCit0eXBlZGVmIHN0cnVjdCBDdkVITU0KK3sKKyAgICBpbnQgbGV2ZWw7IC8qIDAgLSBsb3dlc3QoaS5lIGl0cyBzdGF0ZXMgYXJlIHJlYWwgc3RhdGVzKSwgLi4uLi4gKi8KKyAgICBpbnQgbnVtX3N0YXRlczsgLyogbnVtYmVyIG9mIEhNTSBzdGF0ZXMgKi8KKyAgICBmbG9hdCogIHRyYW5zUDsvKnRyYW5zaXRpb24gcHJvYmFiLiBtYXRyaWNlcyBmb3Igc3RhdGVzICovCisgICAgZmxvYXQqKiBvYnNQcm9iOyAvKiBpZiBsZXZlbCA9PSAwIC0gYXJyYXkgb2YgYnJvYiBtYXRyaWNlcyBjb3JyZXNwb25kaW5nIHRvIGhtbQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGV2ZWwgPT0gMSAtIG1hcnRpeCBvZiBtYXRyaWNlcyAqLworICAgIHVuaW9uCisgICAgeworICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGU7IC8qIGlmIGxldmVsID09IDAgcG9pbnRzIHRvIHJlYWwgc3RhdGVzIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCAtIHBvaW50cyB0byBlbWJlZGRlZCBobW1zICovCisgICAgICAgIHN0cnVjdCBDdkVITU0qIGVobW07IC8qIHBvaW50ZXIgdG8gYW4gZW1iZWRkZWQgbW9kZWwgb3IgTlVMTCwgaWYgaXQgaXMgYSBsZWFmICovCisgICAgfSB1OworCit9CitDdkVITU07CisKKy8qQ1ZBUEkoaW50KSAgaWN2Q3JlYXRlMURITU0oIEN2RUhNTSoqIHRoaXNfaG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdGVfbnVtYmVyLCBpbnQqIG51bV9taXgsIGludCBvYnNfc2l6ZSApOworCitDVkFQSShpbnQpICBpY3ZSZWxlYXNlMURITU0oIEN2RUhNTSoqIHBobW0gKTsKKworQ1ZBUEkoaW50KSAgaWN2VW5pZm9ybTFEU2VnbSggQ3YxRE9ic0luZm8qIG9ic19pbmZvLCBDdkVITU0qIGhtbSApOworCitDVkFQSShpbnQpICBpY3ZJbml0MURNaXhTZWdtKCBDdjFET2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0pOworCitDVkFQSShpbnQpICBpY3ZFc3RpbWF0ZTFESE1NU3RhdGVQYXJhbXMoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0pOworCitDVkFQSShpbnQpICBpY3ZFc3RpbWF0ZTFET2JzUHJvYiggQ3ZJbWdPYnNJbmZvKiBvYnNfaW5mbywgQ3ZFSE1NKiBobW0gKTsKKworQ1ZBUEkoaW50KSAgaWN2RXN0aW1hdGUxRFRyYW5zUHJvYiggQ3YxRE9ic0luZm8qKiBvYnNfaW5mb19hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkVITU0qIGhtbSApOworCitDVkFQSShmbG9hdCkgIGljdlZpdGVyYmkoIEN2MURPYnNJbmZvKiBvYnNfaW5mbywgQ3ZFSE1NKiBobW0pOworCitDVkFQSShpbnQpICBpY3YxRE1peFNlZ21MMiggQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksIGludCBudW1faW1nLCBDdkVITU0qIGhtbSApOyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBFbWJlZGRlZCBITU1zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENyZWF0ZXMgMkQgSE1NICovCitDVkFQSShDdkVITU0qKSAgY3ZDcmVhdGUyREhNTSggaW50KiBzdGF0ZU51bWJlciwgaW50KiBudW1NaXgsIGludCBvYnNTaXplICk7CisKKy8qIFJlbGVhc2VzIEhNTSAqLworQ1ZBUEkodm9pZCkgIGN2UmVsZWFzZTJESE1NKCBDdkVITU0qKiBobW0gKTsKKworI2RlZmluZSBDVl9DT1VOVF9PQlMocm9pLCB3aW4sIGRlbHRhLCBudW1PYnMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAobnVtT2JzKS0+d2lkdGggID0oKHJvaSktPndpZHRoICAtKHdpbiktPndpZHRoICArKGRlbHRhKS0+d2lkdGgpLyhkZWx0YSktPndpZHRoOyAgXAorICAgKG51bU9icyktPmhlaWdodCA9KChyb2kpLT5oZWlnaHQgLSh3aW4pLT5oZWlnaHQgKyhkZWx0YSktPmhlaWdodCkvKGRlbHRhKS0+aGVpZ2h0O1wKK30KKworLyogQ3JlYXRlcyBzdG9yYWdlIGZvciBvYnNlcnZhdGlvbiB2ZWN0b3JzICovCitDVkFQSShDdkltZ09ic0luZm8qKSAgY3ZDcmVhdGVPYnNJbmZvKCBDdlNpemUgbnVtT2JzLCBpbnQgb2JzU2l6ZSApOworCisvKiBSZWxlYXNlcyBzdG9yYWdlIGZvciBvYnNlcnZhdGlvbiB2ZWN0b3JzICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlT2JzSW5mbyggQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm8gKTsKKworCisvKiBUaGUgZnVuY3Rpb24gdGFrZXMgYW4gaW1hZ2Ugb24gaW5wdXQgYW5kIGFuZCByZXR1cm5zIHRoZSBzZXF1bmNlIG9mIG9ic2VydmF0aW9ucworICAgdG8gYmUgdXNlZCB3aXRoIGFuIGVtYmVkZGVkIEhNTTsgRWFjaCBvYnNlcnZhdGlvbiBpcyB0b3AtbGVmdCBibG9jayBvZiBEQ1QKKyAgIGNvZWZmaWNpZW50IG1hdHJpeCAqLworQ1ZBUEkodm9pZCkgIGN2SW1nVG9PYnNfRENUKCBjb25zdCBDdkFyciogYXJyLCBmbG9hdCogb2JzLCBDdlNpemUgZGN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIG9ic1NpemUsIEN2U2l6ZSBkZWx0YSApOworCisKKy8qIFVuaWZvcm1seSBzZWdtZW50cyBhbGwgb2JzZXJ2YXRpb24gdmVjdG9ycyBleHRyYWN0ZWQgZnJvbSBpbWFnZSAqLworQ1ZBUEkodm9pZCkgIGN2VW5pZm9ybUltZ1NlZ20oIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogZWhtbSApOworCisvKiBEb2VzIG1peHR1cmUgc2VnbWVudGF0aW9uIG9mIHRoZSBzdGF0ZXMgb2YgZW1iZWRkZWQgSE1NICovCitDVkFQSSh2b2lkKSAgY3ZJbml0TWl4U2VnbSggQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICk7CisKKy8qIEZ1bmN0aW9uIGNhbGN1bGF0ZXMgbWVhbnMsIHZhcmlhbmNlcywgd2VpZ2h0cyBvZiBldmVyeSBHYXVzc2lhbiBtaXh0dXJlCisgICBvZiBldmVyeSBsb3ctbGV2ZWwgc3RhdGUgb2YgZW1iZWRkZWQgSE1NICovCitDVkFQSSh2b2lkKSAgY3ZFc3RpbWF0ZUhNTVN0YXRlUGFyYW1zKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1faW1nLCBDdkVITU0qIGhtbSApOworCisvKiBGdW5jdGlvbiBjb21wdXRlcyB0cmFuc2l0aW9uIHByb2JhYmlsaXR5IG1hdHJpY2VzIG9mIGVtYmVkZGVkIEhNTQorICAgZ2l2ZW4gb2JzZXJ2YXRpb25zIHNlZ21lbnRhdGlvbiAqLworQ1ZBUEkodm9pZCkgIGN2RXN0aW1hdGVUcmFuc1Byb2IoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1faW1nLCBDdkVITU0qIGhtbSApOworCisvKiBGdW5jdGlvbiBjb21wdXRlcyBwcm9iYWJpbGl0aWVzIG9mIGFwcGVhcmluZyBvYnNlcnZhdGlvbnMgYXQgYW55IHN0YXRlCisgICAoaS5lLiBjb21wdXRlcyBQKG9ic3xzdGF0ZSkgZm9yIGV2ZXJ5IHBhaXIob2JzLHN0YXRlKSkgKi8KK0NWQVBJKHZvaWQpICBjdkVzdGltYXRlT2JzUHJvYiggQ3ZJbWdPYnNJbmZvKiBvYnNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZFSE1NKiBobW0gKTsKKworLyogUnVucyBWaXRlcmJpIGFsZ29yaXRobSBmb3IgZW1iZWRkZWQgSE1NICovCitDVkFQSShmbG9hdCkgIGN2RVZpdGVyYmkoIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tICk7CisKKworLyogRnVuY3Rpb24gY2x1c3RlcnMgb2JzZXJ2YXRpb24gdmVjdG9ycyBmcm9tIHNldmVyYWwgaW1hZ2VzCisgICBnaXZlbiBvYnNlcnZhdGlvbnMgc2VnbWVudGF0aW9uLgorICAgRXVjbGlkZWFuIGRpc3RhbmNlIHVzZWQgZm9yIGNsdXN0ZXJpbmcgdmVjdG9ycy4KKyAgIENlbnRlcnMgb2YgY2x1c3RlcnMgYXJlIGdpdmVuIG1lYW5zIG9mIGV2ZXJ5IG1peHR1cmUgKi8KK0NWQVBJKHZvaWQpICBjdk1peFNlZ21MMiggQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1faW1nLCBDdkVITU0qIGhtbSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICBBIGZldyBmdW5jdGlvbnMgZnJvbSBvbGQgc3RlcmVvIGdlc3R1cmUgcmVjb2duaXRpb24gZGVtb3Npb25zICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIENyZWF0ZXMgaGFuZCBtYXNrIGltYWdlIGdpdmVuIHNldmVyYWwgcG9pbnRzIG9uIHRoZSBoYW5kICovCitDVkFQSSh2b2lkKSAgY3ZDcmVhdGVIYW5kTWFzayggQ3ZTZXEqIGhhbmRfcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSAqaW1nX21hc2ssIEN2UmVjdCAqcm9pKTsKKworLyogRmluZHMgaGFuZCByZWdpb24gaW4gcmFuZ2UgaW1hZ2UgZGF0YSAqLworQ1ZBUEkodm9pZCkgIGN2RmluZEhhbmRSZWdpb24gKEN2UG9pbnQzRDMyZiogcG9pbnRzLCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBpbmRleHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBsaW5lLCBDdlNpemUyRDMyZiBzaXplLCBpbnQgZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTZXEgKipudW1iZXJzKTsKKworLyogRmluZHMgaGFuZCByZWdpb24gaW4gcmFuZ2UgaW1hZ2UgZGF0YSAoYWR2YW5jZWQgdmVyc2lvbikgKi8KK0NWQVBJKHZvaWQpICBjdkZpbmRIYW5kUmVnaW9uQSggQ3ZQb2ludDNEMzJmKiBwb2ludHMsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGluZGV4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGxpbmUsIEN2U2l6ZTJEMzJmIHNpemUsIGludCBqYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTZXEgKipudW1iZXJzKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBvcGVyYXRpb25zIG9uIFN1YmRpdmlzaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBwYWludHMgdm9yb25vaSBkaWFncmFtOiBqdXN0IGRlbW8gZnVuY3Rpb24KK0NWQVBJKHZvaWQpICBpY3ZEcmF3TW9zYWljKCBDdlN1YmRpdjJEKiBzdWJkaXYsIElwbEltYWdlKiBzcmMsIElwbEltYWdlKiBkc3QgKTsKKworLy8gY2hlY2tzIHBsYW5hciBzdWJkaXZpc2lvbiBmb3IgY29ycmVjdG5lc3MuIEl0IGlzIG5vdCBhbiBhYnNvbHV0ZSBjaGVjaywKKy8vIGJ1dCBpdCB2ZXJpZmllcyBzb21lIHJlbGF0aW9ucyBiZXR3ZWVuIHF1YWQtZWRnZXMKK0NWQVBJKGludCkgICBpY3ZTdWJkaXYyRENoZWNrKCBDdlN1YmRpdjJEKiBzdWJkaXYgKTsKKworLy8gcmV0dXJucyBzcXVhcmVkIGRpc3RhbmNlIGJldHdlZW4gdHdvIDJEIHBvaW50cyB3aXRoIGZsb2F0aW5nLXBvaW50IGNvb3JkaW5hdGVzLgorQ1ZfSU5MSU5FIGRvdWJsZSBpY3ZTcURpc3QyRDMyZiggQ3ZQb2ludDJEMzJmIHB0MSwgQ3ZQb2ludDJEMzJmIHB0MiApCit7CisgICAgZG91YmxlIGR4ID0gcHQxLnggLSBwdDIueDsKKyAgICBkb3VibGUgZHkgPSBwdDEueSAtIHB0Mi55OworCisgICAgcmV0dXJuIGR4KmR4ICsgZHkqZHk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9yZSBvcGVyYXRpb25zIG9uIHNlcXVlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfQ1VSUkVOVF9JTlQoIHJlYWRlciApICgqKChpbnQgKikocmVhZGVyKS5wdHIpKQorI2RlZmluZSBDVl9QUkVWX0lOVCggcmVhZGVyICkgKCooKGludCAqKShyZWFkZXIpLnByZXZfZWxlbSkpCisKKyNkZWZpbmUgIENWX0dSQVBIX1dFSUdIVEVEX1ZFUlRFWF9GSUVMRFMoKSBDVl9HUkFQSF9WRVJURVhfRklFTERTKClcCisgICAgZmxvYXQgd2VpZ2h0OworCisjZGVmaW5lICBDVl9HUkFQSF9XRUlHSFRFRF9FREdFX0ZJRUxEUygpIENWX0dSQVBIX0VER0VfRklFTERTKCkKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaFdlaWdodGVkVnR4Cit7CisgICAgQ1ZfR1JBUEhfV0VJR0hURURfVkVSVEVYX0ZJRUxEUygpCit9CitDdkdyYXBoV2VpZ2h0ZWRWdHg7CisKK3R5cGVkZWYgc3RydWN0IEN2R3JhcGhXZWlnaHRlZEVkZ2UKK3sKKyAgICBDVl9HUkFQSF9XRUlHSFRFRF9FREdFX0ZJRUxEUygpCit9CitDdkdyYXBoV2VpZ2h0ZWRFZGdlOworCit0eXBlZGVmIGVudW0gQ3ZHcmFwaFdlaWdodFR5cGUKK3sKKyAgICBDVl9OT1RfV0VJR0hURUQsCisgICAgQ1ZfV0VJR0hURURfVlRYLAorICAgIENWX1dFSUdIVEVEX0VER0UsCisgICAgQ1ZfV0VJR0hURURfQUxMCit9IEN2R3JhcGhXZWlnaHRUeXBlOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlN0ZXJlbyBjb3JyZXNwb25kZW5jZSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2Q2xpcXVlRmluZGVyCit7ICAgCisgICAgQ3ZHcmFwaCogZ3JhcGg7CisgICAgaW50KiogICAgYWRqX21hdHI7CisgICAgaW50IE47IC8vZ3JhcGggc2l6ZQorCisgICAgLy8gc3RhY2tzLCBjb3VudGVycyBldGMvCisgICAgaW50IGs7IC8vc3RhY2sgc2l6ZQorICAgIGludCogY3VycmVudF9jb21wOworICAgIGludCoqIEFsbDsKKyAgICAKKyAgICBpbnQqIG5lOworICAgIGludCogY2U7CisgICAgaW50KiBmaXhwOyAvL25vZGUgd2l0aCBtaW5pbWFsIGRpc2Nvbm5lY3Rpb25zCisgICAgaW50KiBub2Q7CisgICAgaW50KiBzOyAvL2ZvciBzZWxlY3RlZCBjYW5kaWRhdGUKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBiZXN0X3Njb3JlOworICAgIGludCB3ZWlnaHRlZDsKKyAgICBpbnQgd2VpZ2h0ZWRfZWRnZXM7ICAgIAorICAgIGZsb2F0IGJlc3Rfd2VpZ2h0OworICAgIGZsb2F0KiBlZGdlX3dlaWdodHM7CisgICAgZmxvYXQqIHZlcnRleF93ZWlnaHRzOworICAgIGZsb2F0KiBjdXJfd2VpZ2h0OworICAgIGZsb2F0KiBjYW5kX3dlaWdodDsKKworfSBDdkNsaXF1ZUZpbmRlcjsKKworI2RlZmluZSBDTElRVUVfVElNRV9PRkYgMgorI2RlZmluZSBDTElRVUVfRk9VTkQgMQorI2RlZmluZSBDTElRVUVfRU5EICAgMAorCisvKkNWQVBJKHZvaWQpIGN2U3RhcnRGaW5kQ2xpcXVlcyggQ3ZHcmFwaCogZ3JhcGgsIEN2Q2xpcXVlRmluZGVyKiBmaW5kZXIsIGludCByZXZlcnNlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdlaWdodGVkIENWX0RFRkFVTFQoMCksICBpbnQgd2VpZ2h0ZWRfZWRnZXMgQ1ZfREVGQVVMVCgwKSk7CitDVkFQSShpbnQpIGN2RmluZE5leHRNYXhpbWFsQ2xpcXVlKCBDdkNsaXF1ZUZpbmRlciogZmluZGVyLCBpbnQqIGNsb2NrX3Jlc3QgQ1ZfREVGQVVMVCgwKSApOyAKK0NWQVBJKHZvaWQpIGN2RW5kRmluZENsaXF1ZXMoIEN2Q2xpcXVlRmluZGVyKiBmaW5kZXIgKTsKKworQ1ZBUEkodm9pZCkgY3ZCcm9uS2VyYm9zY2goIEN2R3JhcGgqIGdyYXBoICk7Ki8KKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBOYW1lOiAgICBjdlN1YmdyYXBoV2VpZ2h0CisvLyAgICBQdXJwb3NlOiBmaW5kcyB3ZWlnaHQgb2Ygc3ViZ3JhcGggaW4gYSBncmFwaAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIGdyYXBoIC0gaW5wdXQgZ3JhcGguCisvLyAgICAgIHN1YmdyYXBoIC0gc2VxdWVuY2Ugb2YgcGFpcndpc2UgZGlmZmVyZW50IGludHMuICBUaGVzZSBhcmUgaW5kaWNlcyBvZiB2ZXJ0aWNlcyBvZiBzdWJncmFwaC4KKy8vICAgICAgd2VpZ2h0X3R5cGUgLSBkZXNjcmliZXMgdGhlIHdheSB3ZSBtZWFzdXJlIHdlaWdodC4KKy8vICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisvLyAgICAgICAgICAgIENWX05PVF9XRUlHSFRFRCAtIHdlaWdodCBvZiBhIGNsaXF1ZSBpcyBzaW1wbHkgaXRzIHNpemUKKy8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfVlRYIC0gd2VpZ2h0IG9mIGEgY2xpcXVlIGlzIHRoZSBzdW0gb2Ygd2VpZ2h0cyBvZiBpdHMgdmVydGljZXMKKy8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfRURHRSAtIHRoZSBzYW1lIGJ1dCBlZGdlcworLy8gICAgICAgICAgICBDVl9XRUlHSFRFRF9BTEwgLSB0aGUgc2FtZSBidXQgYm90aCBlZGdlcyBhbmQgdmVydGljZXMKKy8vICAgICAgd2VpZ2h0X3Z0eCAtIG9wdGlvbmFsIHZlY3RvciBvZiBmbG9hdHMsIHdpdGggc2l6ZSA9IGdyYXBoLT50b3RhbC4KKy8vICAgICAgICAgICAgSWYgd2VpZ2h0X3R5cGUgaXMgZWl0aGVyIENWX1dFSUdIVEVEX1ZUWCBvciBDVl9XRUlHSFRFRF9BTEwKKy8vICAgICAgICAgICAgd2VpZ2h0cyBvZiB2ZXJ0aWNlcyBtdXN0IGJlIHByb3ZpZGVkLiAgSWYgd2VpZ2h0X3Z0eCBub3QgemVybworLy8gICAgICAgICAgICB0aGVzZSB3ZWlnaHRzIGNvbnNpZGVyZWQgdG8gYmUgaGVyZSwgb3RoZXJ3aXNlIGZ1bmN0aW9uIGFzc3VtZXMKKy8vICAgICAgICAgICAgdGhhdCB2ZXJ0aWNlcyBvZiBncmFwaCBhcmUgaW5oZXJpdGVkIGZyb20gQ3ZHcmFwaFdlaWdodGVkVnR4LgorLy8gICAgICB3ZWlnaHRfZWRnZSAtIG9wdGlvbmFsIG1hdHJpeCBvZiBmbG9hdHMsIG9mIHdpZHRoIGFuZCBoZWlnaHQgPSBncmFwaC0+dG90YWwuCisvLyAgICAgICAgICAgIElmIHdlaWdodF90eXBlIGlzIGVpdGhlciBDVl9XRUlHSFRFRF9FREdFIG9yIENWX1dFSUdIVEVEX0FMTAorLy8gICAgICAgICAgICB3ZWlnaHRzIG9mIGVkZ2VzIG91Z2h0IHRvIGJlIHN1cHBsaWVkLiAgSWYgd2VpZ2h0X2VkZ2UgaXMgbm90IHplcm8KKy8vICAgICAgICAgICAgZnVuY3Rpb24gZmluZHMgdGhlbSBoZXJlLCBvdGhlcndpc2UgZnVuY3Rpb24gZXhwZWN0cworLy8gICAgICAgICAgICBlZGdlcyBvZiBncmFwaCB0byBiZSBpbmhlcml0ZWQgZnJvbSBDdkdyYXBoV2VpZ2h0ZWRFZGdlLgorLy8gICAgICAgICAgICBJZiB0aGlzIHBhcmFtZXRlciBpcyBub3QgemVybyBzdHJ1Y3R1cmUgb2YgdGhlIGdyYXBoIGlzIGRldGVybWluZWQgZnJvbSBtYXRyaXgKKy8vICAgICAgICAgICAgcmF0aGVyIHRoYW4gZnJvbSBDdkdyYXBoRWRnZSdzLiAgSW4gcGFydGljdWxhciwgZWxlbWVudHMgY29ycmVzcG9uZGluZyB0bworLy8gICAgICAgICAgICBhYnNlbnQgZWRnZXMgc2hvdWxkIGJlIHplcm8uCisvLyAgICBSZXR1cm5zOgorLy8gICAgICB3ZWlnaHQgb2Ygc3ViZ3JhcGguCisvLyAgICBOb3RlczoKKy8vRiovCisvKkNWQVBJKGZsb2F0KSBjdlN1YmdyYXBoV2VpZ2h0KCBDdkdyYXBoICpncmFwaCwgQ3ZTZXEgKnN1YmdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhXZWlnaHRUeXBlIHdlaWdodF90eXBlIENWX0RFRkFVTFQoQ1ZfTk9UX1dFSUdIVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgd2VpZ2h0X3Z0eCBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiB3ZWlnaHRfZWRnZSBDVl9ERUZBVUxUKDApICk7Ki8KKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgICBOYW1lOiAgICBjdkZpbmRDbGlxdWVFeAorLy8gICAgUHVycG9zZTogdHJpZXMgdG8gZmluZCBjbGlxdWUgd2l0aCBtYXhpbXVtIHBvc3NpYmxlIHdlaWdodCBpbiBhIGdyYXBoCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgZ3JhcGggLSBpbnB1dCBncmFwaC4KKy8vICAgICAgc3RvcmFnZSAtIG1lbW9yeSBzdG9yYWdlIHRvIGJlIHVzZWQgYnkgdGhlIHJlc3VsdC4KKy8vICAgICAgaXNfY29tcGxlbWVudGFyeSAtIG9wdGlvbmFsIGZsYWcgc2hvd2luZyB3aGV0aGVyIGZ1bmN0aW9uIHNob3VsZCBzZWVrIGZvciBjbGlxdWUKKy8vICAgICAgICAgICAgaW4gY29tcGxlbWVudGFyeSBncmFwaC4KKy8vICAgICAgd2VpZ2h0X3R5cGUgLSBkZXNjcmliZXMgb3VyIG5vdGlvbiBhYm91dCB3ZWlnaHQuCisvLyAgICAgICAgICAgIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorLy8gICAgICAgICAgICBDVl9OT1RfV0VJR0hURUQgLSB3ZWlnaHQgb2YgYSBjbGlxdWUgaXMgc2ltcGx5IGl0cyBzaXplCisvLyAgICAgICAgICAgIENWX1dFSUdIVEVEX1ZUWCAtIHdlaWdodCBvZiBhIGNsaXF1ZSBpcyB0aGUgc3VtIG9mIHdlaWdodHMgb2YgaXRzIHZlcnRpY2VzCisvLyAgICAgICAgICAgIENWX1dFSUdIVEVEX0VER0UgLSB0aGUgc2FtZSBidXQgZWRnZXMKKy8vICAgICAgICAgICAgQ1ZfV0VJR0hURURfQUxMIC0gdGhlIHNhbWUgYnV0IGJvdGggZWRnZXMgYW5kIHZlcnRpY2VzCisvLyAgICAgIHdlaWdodF92dHggLSBvcHRpb25hbCB2ZWN0b3Igb2YgZmxvYXRzLCB3aXRoIHNpemUgPSBncmFwaC0+dG90YWwuCisvLyAgICAgICAgICAgIElmIHdlaWdodF90eXBlIGlzIGVpdGhlciBDVl9XRUlHSFRFRF9WVFggb3IgQ1ZfV0VJR0hURURfQUxMCisvLyAgICAgICAgICAgIHdlaWdodHMgb2YgdmVydGljZXMgbXVzdCBiZSBwcm92aWRlZC4gIElmIHdlaWdodF92dHggbm90IHplcm8KKy8vICAgICAgICAgICAgdGhlc2Ugd2VpZ2h0cyBjb25zaWRlcmVkIHRvIGJlIGhlcmUsIG90aGVyd2lzZSBmdW5jdGlvbiBhc3N1bWVzCisvLyAgICAgICAgICAgIHRoYXQgdmVydGljZXMgb2YgZ3JhcGggYXJlIGluaGVyaXRlZCBmcm9tIEN2R3JhcGhXZWlnaHRlZFZ0eC4KKy8vICAgICAgd2VpZ2h0X2VkZ2UgLSBvcHRpb25hbCBtYXRyaXggb2YgZmxvYXRzLCBvZiB3aWR0aCBhbmQgaGVpZ2h0ID0gZ3JhcGgtPnRvdGFsLgorLy8gICAgICAgICAgICBJZiB3ZWlnaHRfdHlwZSBpcyBlaXRoZXIgQ1ZfV0VJR0hURURfRURHRSBvciBDVl9XRUlHSFRFRF9BTEwKKy8vICAgICAgICAgICAgd2VpZ2h0cyBvZiBlZGdlcyBvdWdodCB0byBiZSBzdXBwbGllZC4gIElmIHdlaWdodF9lZGdlIGlzIG5vdCB6ZXJvCisvLyAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRzIHRoZW0gaGVyZSwgb3RoZXJ3aXNlIGZ1bmN0aW9uIGV4cGVjdHMKKy8vICAgICAgICAgICAgZWRnZXMgb2YgZ3JhcGggdG8gYmUgaW5oZXJpdGVkIGZyb20gQ3ZHcmFwaFdlaWdodGVkRWRnZS4KKy8vICAgICAgICAgICAgTm90ZSB0aGF0IGluIGNhc2Ugb2YgQ1ZfV0VJR0hURURfRURHRSBvciBDVl9XRUlHSFRFRF9BTEwKKy8vICAgICAgICAgICAgbm9uemVybyBpc19jb21wbGVtZW50YXJ5IGltcGxpZXMgbm9uemVybyB3ZWlnaHRfZWRnZS4KKy8vICAgICAgc3RhcnRfY2xpcXVlIC0gb3B0aW9uYWwgc2VxdWVuY2Ugb2YgcGFpcndpc2UgZGlmZmVyZW50IGludHMuICBUaGV5IGFyZSBpbmRpY2VzIG9mCisvLyAgICAgICAgICAgIHZlcnRpY2VzIHRoYXQgc2hhbGwgYmUgcHJlc2VudCBpbiB0aGUgb3V0cHV0IGNsaXF1ZS4KKy8vICAgICAgc3ViZ3JhcGhfb2ZfYmFuIC0gb3B0aW9uYWwgc2VxdWVuY2Ugb2YgKG1heWJlIGVxdWFsKSBpbnRzLiAgVGhleSBhcmUgaW5kaWNlcyBvZgorLy8gICAgICAgICAgICB2ZXJ0aWNlcyB0aGF0IHNoYWxsIG5vdCBiZSBwcmVzZW50IGluIHRoZSBvdXRwdXQgY2xpcXVlLgorLy8gICAgICBjbGlxdWVfd2VpZ2h0X3B0ciAtIG9wdGlvbmFsIG91dHB1dCBwYXJhbWV0ZXIuICBXZWlnaHQgb2YgZm91bmQgY2xpcXVlIHN0b3JlZCBoZXJlLgorLy8gICAgICBudW1fZ2VuZXJhdGlvbnMgLSBvcHRpb25hbCBudW1iZXIgb2YgZ2VuZXJhdGlvbnMgaW4gZXZvbHV0aW9uYXJ5IHBhcnQgb2YgYWxnb3JpdGhtLAorLy8gICAgICAgICAgICB6ZXJvIGZvcmNlcyB0byByZXR1cm4gZmlyc3QgZm91bmQgY2xpcXVlLgorLy8gICAgICBxdWFsaXR5IC0gb3B0aW9uYWwgcGFyYW1ldGVyIGRldGVybWluaW5nIGRlZ3JlZSBvZiByZXF1aXJlZCBxdWFsaXR5L3NwZWVkIHRyYWRlb2ZmLgorLy8gICAgICAgICAgICBNdXN0IGJlIGluIHRoZSByYW5nZSBmcm9tIDAgdG8gOS4KKy8vICAgICAgICAgICAgMCBpcyBmYXN0IGFuZCBkaXJ0eSwgOSBpcyBzbG93IGJ1dCBob3BlZnVsbHkgeWllbGRzIGdvb2QgY2xpcXVlLgorLy8gICAgUmV0dXJuczoKKy8vICAgICAgc2VxdWVuY2Ugb2YgcGFpcndpc2UgZGlmZmVyZW50IGludHMuCisvLyAgICAgIFRoZXNlIGFyZSBpbmRpY2VzIG9mIHZlcnRpY2VzIHRoYXQgZm9ybSBmb3VuZCBjbGlxdWUuCisvLyAgICBOb3RlczoKKy8vICAgICAgaW4gY2FzZXMgb2YgQ1ZfV0VJR0hURURfRURHRSBhbmQgQ1ZfV0VJR0hURURfQUxMIHdlaWdodHMgc2hvdWxkIGJlIG5vbm5lZ2F0aXZlLgorLy8gICAgICBzdGFydF9jbGlxdWUgaGFzIGEgcHJpb3JpdHkgb3ZlciBzdWJncmFwaF9vZl9iYW4uCisvL0YqLworLypDVkFQSShDdlNlcSopIGN2RmluZENsaXF1ZUV4KCBDdkdyYXBoICpncmFwaCwgQ3ZNZW1TdG9yYWdlICpzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2NvbXBsZW1lbnRhcnkgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhXZWlnaHRUeXBlIHdlaWdodF90eXBlIENWX0RFRkFVTFQoQ1ZfTk9UX1dFSUdIVEVEKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiB3ZWlnaHRfdnR4IENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgd2VpZ2h0X2VkZ2UgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxICpzdGFydF9jbGlxdWUgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxICpzdWJncmFwaF9vZl9iYW4gQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjbGlxdWVfd2VpZ2h0X3B0ciBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9nZW5lcmF0aW9ucyBDVl9ERUZBVUxUKDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1YWxpdHkgQ1ZfREVGQVVMVCgyKSApOyovCisKKworI2RlZmluZSBDVl9VTkRFRl9TQ19QQVJBTSAgICAgICAgIDEyMzQ1IC8vZGVmYXVsdCB2YWx1ZSBvZiBwYXJhbWV0ZXJzCisKKyNkZWZpbmUgQ1ZfSURQX0JJUkNIRklFTERfUEFSQU0xICAyNSAgICAKKyNkZWZpbmUgQ1ZfSURQX0JJUkNIRklFTERfUEFSQU0yICA1CisjZGVmaW5lIENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMyAgMTIKKyNkZWZpbmUgQ1ZfSURQX0JJUkNIRklFTERfUEFSQU00ICAxNQorI2RlZmluZSBDVl9JRFBfQklSQ0hGSUVMRF9QQVJBTTUgIDI1CisKKworI2RlZmluZSAgQ1ZfRElTUEFSSVRZX0JJUkNIRklFTEQgIDAgICAgCisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgTmFtZTogICAgY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2UKKy8vICAgIFB1cnBvc2U6IGZpbmQgc3RlcmVvIGNvcnJlc3BvbmRlbmNlIG9uIHN0ZXJlby1wYWlyCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgbGVmdEltYWdlIC0gbGVmdCBpbWFnZSBvZiBzdGVyZW8tcGFpciAoZm9ybWF0IDh1QzEpLgorLy8gICAgICByaWdodEltYWdlIC0gcmlnaHQgaW1hZ2Ugb2Ygc3RlcmVvLXBhaXIgKGZvcm1hdCA4dUMxKS4KKy8vICAgbW9kZSAtIG1vZGUgb2YgY29ycmVzcG9uZGVuY2UgcmV0cmlldmFsIChub3cgQ1ZfRElTUEFSSVRZX0JJUkNIRklFTEQgb25seSkKKy8vICAgICAgZGlzcEltYWdlIC0gZGVzdGluYXRpb24gZGlzcGFyaXR5IGltYWdlCisvLyAgICAgIG1heERpc3Bhcml0eSAtIG1heGltYWwgZGlzcGFyaXR5IAorLy8gICAgICBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSAtIHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtCisvLyAgICBSZXR1cm5zOgorLy8gICAgTm90ZXM6CisvLyAgICAgIEltYWdlcyBtdXN0IGJlIHJlY3RpZmllZC4KKy8vICAgICAgQWxsIGltYWdlcyBtdXN0IGhhdmUgZm9ybWF0IDh1QzEuCisvL0YqLworQ1ZBUEkodm9pZCkgCitjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZSggCisgICAgICAgICAgICAgICAgICAgY29uc3QgIEN2QXJyKiBsZWZ0SW1hZ2UsIGNvbnN0ICBDdkFyciogcmlnaHRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgQ3ZBcnIqICBkaXNwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgaW50ICAgICBtYXhEaXNwYXJpdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgIHBhcmFtMSBDVl9ERUZBVUxUKENWX1VOREVGX1NDX1BBUkFNKSwgCisgICAgICAgICAgICAgICAgICAgZG91YmxlICBwYXJhbTIgQ1ZfREVGQVVMVChDVl9VTkRFRl9TQ19QQVJBTSksIAorICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgcGFyYW0zIENWX0RFRkFVTFQoQ1ZfVU5ERUZfU0NfUEFSQU0pLCAKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgIHBhcmFtNCBDVl9ERUZBVUxUKENWX1VOREVGX1NDX1BBUkFNKSwgCisgICAgICAgICAgICAgICAgICAgZG91YmxlICBwYXJhbTUgQ1ZfREVGQVVMVChDVl9VTkRFRl9TQ19QQVJBTSkgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKiBFcGlsaW5lIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqLworCisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdGVyZW9MaW5lQ29lZmYKK3sKKyAgICBkb3VibGUgWGNvZWY7CisgICAgZG91YmxlIFhjb2VmQTsKKyAgICBkb3VibGUgWGNvZWZCOworICAgIGRvdWJsZSBYY29lZkFCOworCisgICAgZG91YmxlIFljb2VmOworICAgIGRvdWJsZSBZY29lZkE7CisgICAgZG91YmxlIFljb2VmQjsKKyAgICBkb3VibGUgWWNvZWZBQjsKKworICAgIGRvdWJsZSBaY29lZjsKKyAgICBkb3VibGUgWmNvZWZBOworICAgIGRvdWJsZSBaY29lZkI7CisgICAgZG91YmxlIFpjb2VmQUI7Cit9Q3ZTdGVyZW9MaW5lQ29lZmY7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDYW1lcmEKK3sKKyAgICBmbG9hdCAgIGltZ1NpemVbMl07IC8qIHNpemUgb2YgdGhlIGNhbWVyYSB2aWV3LCB1c2VkIGR1cmluZyBjYWxpYnJhdGlvbiAqLworICAgIGZsb2F0ICAgbWF0cml4WzldOyAvKiBpbnRpbnNpYyBjYW1lcmEgcGFyYW1ldGVyczogIFsgZnggMCBjeDsgMCBmeSBjeTsgMCAwIDEgXSAqLworICAgIGZsb2F0ICAgZGlzdG9ydGlvbls0XTsgLyogZGlzdG9ydGlvbiBjb2VmZmljaWVudHMgLSB0d28gY29lZmZpY2llbnRzIGZvciByYWRpYWwgZGlzdG9ydGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFub3RoZXIgdHdvIGZvciB0YW5nZW50aWFsOiBbIGsxIGsyIHAxIHAyIF0gKi8KKyAgICBmbG9hdCAgIHJvdE1hdHJbOV07CisgICAgZmxvYXQgICB0cmFuc1ZlY3RbM107IC8qIHJvdGF0aW9uIG1hdHJpeCBhbmQgdHJhbnNpdGlvbiB2ZWN0b3IgcmVsYXRpdmVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzb21lIHJlZmVyZW5jZSBwb2ludCBpbiB0aGUgc3BhY2UuICovCit9CitDdkNhbWVyYTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdGVyZW9DYW1lcmEKK3sKKyAgICBDdkNhbWVyYSogY2FtZXJhWzJdOyAvKiB0d28gaW5kaXZpZHVhbCBjYW1lcmEgcGFyYW1ldGVycyAqLworICAgIGZsb2F0IGZ1bmRNYXRyWzldOyAvKiBmdW5kYW1lbnRhbCBtYXRyaXggKi8KKworICAgIC8qIE5ldyBwYXJ0IGZvciBzdGVyZW8gKi8KKyAgICBDdlBvaW50M0QzMmYgZXBpcG9sZVsyXTsKKyAgICBDdlBvaW50MkQzMmYgcXVhZFsyXVs0XTsgLyogY29vcmRpbmF0ZXMgb2YgZGVzdGluYXRpb24gcXVhZHJhbmdsZSBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcGlwb2xhciBnZW9tZXRyeSByZWN0aWZpY2F0aW9uICovCisgICAgZG91YmxlIGNvZWZmc1syXVszXVszXTsvKiBjb2VmZmljaWVudHMgZm9yIHRyYW5zZm9ybWF0aW9uICovCisgICAgQ3ZQb2ludDJEMzJmIGJvcmRlclsyXVs0XTsKKyAgICBDdlNpemUgd2FycFNpemU7CisgICAgQ3ZTdGVyZW9MaW5lQ29lZmYqIGxpbmVDb2VmZnM7CisgICAgaW50IG5lZWRTd2FwQ2FtZXJhczsvKiBmbGFnIHNldCB0byAxIGlmIG5lZWQgdG8gc3dhcCBjYW1lcmFzIGZvciBnb29kIHJlY29uc3RydWN0aW9uICovCisgICAgZmxvYXQgcm90TWF0cml4WzldOworICAgIGZsb2F0IHRyYW5zVmVjdG9yWzNdOworfQorQ3ZTdGVyZW9DYW1lcmE7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDb250b3VyT3JpZW50YXRpb24KK3sKKyAgICBmbG9hdCBlZ3ZhbHNbMl07CisgICAgZmxvYXQgZWd2ZWN0c1s0XTsKKworICAgIGZsb2F0IG1heCwgbWluOyAvLyBtaW5pbXVtIGFuZCBtYXhpbXVtIHByb2plY3Rpb25zCisgICAgaW50IGltYXgsIGltaW47Cit9IEN2Q29udG91ck9yaWVudGF0aW9uOworCisjZGVmaW5lIENWX0NBTUVSQV9UT19XQVJQIDEKKyNkZWZpbmUgQ1ZfV0FSUF9UT19DQU1FUkEgMgorCitDVkFQSShpbnQpIGljdkNvbnZlcnRXYXJwQ29vcmRpbmF0ZXMoZG91YmxlIGNvZWZmc1szXVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBjYW1lcmFQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiB3YXJwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pOworCitDVkFQSShpbnQpIGljdkdldFN5bVBvaW50M0QoICBDdlBvaW50M0Q2NGYgcG9pbnRDb3JuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmIHBvaW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYgcG9pbnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiAqcG9pbnRTeW0yKTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0UGllY2VMZW5ndGgzRChDdlBvaW50M0Q2NGYgcG9pbnQxLEN2UG9pbnQzRDY0ZiBwb2ludDIsZG91YmxlKiBkaXN0KTsKKworQ1ZBUEkoaW50KSBpY3ZDb21wdXRlM0RQb2ludCggICAgZG91YmxlIGFscGhhLGRvdWJsZSBiZXR0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlN0ZXJlb0xpbmVDb2VmZiogY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiogcG9pbnQpOworCitDVkFQSShpbnQpIGljdkNyZWF0ZUNvbnZlcnRNYXRyVmVjdCggQ3ZNYXRyNjRkICAgICByb3RNYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICB0cmFuc1ZlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIHJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIHRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY29udlJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY29udlRyYW5zVmVjdCk7CisKK0NWQVBJKGludCkgaWN2Q29udmVydFBvaW50U3lzdGVtKEN2UG9pbnQzRDY0ZiAgTTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICB0cmFuc1ZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitDVkFQSShpbnQpIGljdkNvbXB1dGVDb2VmZkZvclN0ZXJlbyggIEN2U3RlcmVvQ2FtZXJhKiBzdGVyZW9DYW1lcmEpOworCitDVkFQSShpbnQpIGljdkdldENyb3NzUGllY2VWZWN0b3IoQ3ZQb2ludDJEMzJmIHAxX3N0YXJ0LEN2UG9pbnQyRDMyZiBwMV9lbmQsQ3ZQb2ludDJEMzJmIHYyX3N0YXJ0LEN2UG9pbnQyRDMyZiB2Ml9lbmQsQ3ZQb2ludDJEMzJmICpjcm9zcyk7CitDVkFQSShpbnQpIGljdkdldENyb3NzTGluZURpcmVjdChDdlBvaW50MkQzMmYgcDEsQ3ZQb2ludDJEMzJmIHAyLGZsb2F0IGEsZmxvYXQgYixmbG9hdCBjLEN2UG9pbnQyRDMyZiogY3Jvc3MpOworQ1ZBUEkoZmxvYXQpIGljdkRlZmluZVBvaW50UG9zaXRpb24oQ3ZQb2ludDJEMzJmIHBvaW50MSxDdlBvaW50MkQzMmYgcG9pbnQyLEN2UG9pbnQyRDMyZiBwb2ludCk7CitDVkFQSShpbnQpIGljdlN0ZXJlb0NhbGlicmF0aW9uKCBpbnQgbnVtSW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogaW1hZ2VQb2ludHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogaW1hZ2VQb2ludHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiogb2JqZWN0UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvQ2FtZXJhKiBzdGVyZW9wYXJhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworQ1ZBUEkoaW50KSBpY3ZDb21wdXRlUmVzdFN0ZXJlb1BhcmFtcyhDdlN0ZXJlb0NhbWVyYSAqc3RlcmVvcGFyYW1zKTsKKworQ1ZBUEkodm9pZCkgY3ZDb21wdXRlUGVyc3BlY3RpdmVNYXAoIGNvbnN0IGRvdWJsZSBjb2VmZnNbM11bM10sIEN2QXJyKiByZWN0TWFwWCwgQ3ZBcnIqIHJlY3RNYXBZICk7CisKK0NWQVBJKGludCkgaWN2Q29tQ29lZmZGb3JMaW5lKCAgIEN2UG9pbnQyRDY0ZiBwb2ludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIHBvaW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgcG9pbnQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiBwb2ludDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICByb3RNYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgdHJhbnNWZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIHJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICB0cmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiAgICBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuZWVkU3dhcENhbWVyYXMpOworCitDVkFQSShpbnQpIGljdkdldERpcmVjdGlvbkZvclBvaW50KCAgQ3ZQb2ludDJENjRmIHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgY2FtTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBkaXJlY3QpOworCitDVkFQSShpbnQpIGljdkdldENyb3NzTGluZXMoQ3ZQb2ludDNENjRmIHBvaW50MTEsQ3ZQb2ludDNENjRmIHBvaW50MTIsCisgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiBwb2ludDIxLEN2UG9pbnQzRDY0ZiBwb2ludDIyLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGYqIG1pZFBvaW50KTsKKworQ1ZBUEkoaW50KSBpY3ZDb21wdXRlU3RlcmVvTGluZUNvZWZmcyggICBDdlBvaW50M0Q2NGYgcG9pbnRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmIHBvaW50QiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiBwb2ludENhbTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ2FtbWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlN0ZXJlb0xpbmVDb2VmZiogICAgY29lZmZzKTsKKworLypDVkFQSShpbnQpIGljdkNvbXB1dGVGdW5kTWF0ckVwaXBvbGVzICggQ3ZNYXRyNjRkIGNhbU1hdHIxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0cjEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0NjRkICAgICB0cmFuc1ZlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgICAgIHRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIGVwaXBvbGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmKiBlcGlwb2xlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgZnVuZE1hdHIpOyovCisKK0NWQVBJKGludCkgaWN2R2V0QW5nbGVMaW5lKCBDdlBvaW50MkQ2NGYgc3RhcnRQb2ludCwgQ3ZTaXplIGltYWdlU2l6ZSxDdlBvaW50MkQ2NGYgKnBvaW50MSxDdlBvaW50MkQ2NGYgKnBvaW50Mik7CisKK0NWQVBJKHZvaWQpIGljdkdldENvZWZGb3JQaWVjZSggICBDdlBvaW50MkQ2NGYgcF9zdGFydCxDdlBvaW50MkQ2NGYgcF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmEsZG91YmxlICpiLGRvdWJsZSAqYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVzdWx0KTsKKworLypDVkFQSSh2b2lkKSBpY3ZHZXRDb21tb25BcmVhKCBDdlNpemUgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgZXBpcG9sZTEsQ3ZQb2ludDJENjRmIGVwaXBvbGUyLAorICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgZnVuZE1hdHIsCisgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCBjb2VmZjExLEN2VmVjdDY0ZCBjb2VmZjEyLAorICAgICAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgY29lZmYyMSxDdlZlY3Q2NGQgY29lZmYyMiwKKyAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpOyovCisKK0NWQVBJKHZvaWQpIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0MShDdk1hdHI2NGQgICAgcm90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwb2ludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmICpwb2ludDIpOworCitDVkFQSSh2b2lkKSBpY3ZDb21wdXRlZUluZmluaXRlUHJvamVjdDIoQ3ZNYXRyNjRkICAgIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHBvaW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgcG9pbnQyKTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0Q3Jvc3NEaXJlY3REaXJlY3QoICBDdlZlY3Q2NGQgZGlyZWN0MSxDdlZlY3Q2NGQgZGlyZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYgKmNyb3NzLGludCogcmVzdWx0KTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0Q3Jvc3NQaWVjZURpcmVjdCggICBDdlBvaW50MkQ2NGYgcF9zdGFydCxDdlBvaW50MkQ2NGYgcF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEsZG91YmxlIGIsZG91YmxlIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmICpjcm9zcyxpbnQqIHJlc3VsdCk7CisKK0NWQVBJKHZvaWQpIGljdkdldENyb3NzUGllY2VQaWVjZSggQ3ZQb2ludDJENjRmIHAxX3N0YXJ0LEN2UG9pbnQyRDY0ZiBwMV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIHAyX3N0YXJ0LEN2UG9pbnQyRDY0ZiBwMl9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmKiBjcm9zcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCitDVkFQSSh2b2lkKSBpY3ZHZXRQaWVjZUxlbmd0aChDdlBvaW50MkQ2NGYgcG9pbnQxLEN2UG9pbnQyRDY0ZiBwb2ludDIsZG91YmxlKiBkaXN0KTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0Q3Jvc3NSZWN0RGlyZWN0KCAgICBDdlNpemUgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLGRvdWJsZSBiLGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiAqc3RhcnQsQ3ZQb2ludDJENjRmICplbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpOworCitDVkFQSSh2b2lkKSBpY3ZQcm9qZWN0UG9pbnRUb0ltYWdlKCAgIEN2UG9pbnQzRDY0ZiBwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgY2FtTWF0cixDdk1hdHI2NGQgcm90TWF0cixDdlZlY3Q2NGQgdHJhbnNWZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiogcHJvalBvaW50KTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0UXVhZHNUcmFuc2Zvcm0oIEN2U2l6ZSAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCAgICAgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSogICAgICAgd2FycFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDFbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDJbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGZ1bmRNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRmKiBlcGlwb2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZiogZXBpcG9sZTIKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0NWQVBJKHZvaWQpIGljdkdldFF1YWRzVHJhbnNmb3JtU3RydWN0KCAgQ3ZTdGVyZW9DYW1lcmEqIHN0ZXJlb0NhbWVyYSk7CisKK0NWQVBJKHZvaWQpIGljdkNvbXB1dGVTdGVyZW9QYXJhbXNGb3JDYW1lcmFzKEN2U3RlcmVvQ2FtZXJhKiBzdGVyZW9DYW1lcmEpOworCitDVkFQSSh2b2lkKSBpY3ZHZXRDdXRQaWVjZSggICBDdlZlY3Q2NGQgYXJlYUxpbmVDb2VmMSxDdlZlY3Q2NGQgYXJlYUxpbmVDb2VmMiwKKyAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRmIGVwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiogcG9pbnQxMSxDdlBvaW50MkQ2NGYqIHBvaW50MTIsCisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiogcG9pbnQyMSxDdlBvaW50MkQ2NGYqIHBvaW50MjIsCisgICAgICAgICAgICAgICAgICAgIGludCogcmVzdWx0KTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0TWlkZGxlQW5nbGVQb2ludCggICBDdlBvaW50MkQ2NGYgYmFzZVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZiBwb2ludDEsQ3ZQb2ludDJENjRmIHBvaW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIG1pZFBvaW50KTsKKworQ1ZBUEkodm9pZCkgaWN2R2V0Tm9ybWFsRGlyZWN0KEN2VmVjdDY0ZCBkaXJlY3QsQ3ZQb2ludDJENjRmIHBvaW50LEN2VmVjdDY0ZCBub3JtRGlyZWN0KTsKKworQ1ZBUEkoZG91YmxlKSBpY3ZHZXRWZWN0KEN2UG9pbnQyRDY0ZiBiYXNlUG9pbnQsQ3ZQb2ludDJENjRmIHBvaW50MSxDdlBvaW50MkQ2NGYgcG9pbnQyKTsKKworQ1ZBUEkodm9pZCkgaWN2UHJvamVjdFBvaW50VG9EaXJlY3QoICBDdlBvaW50MkQ2NGYgcG9pbnQsQ3ZWZWN0NjRkIGxpbmVDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGYqIHByb2plY3RQb2ludCk7CisKK0NWQVBJKHZvaWQpIGljdkdldERpc3RhbmNlRnJvbVBvaW50VG9EaXJlY3QoIEN2UG9pbnQyRDY0ZiBwb2ludCxDdlZlY3Q2NGQgbGluZUNvZWYsZG91YmxlKmRpc3QpOworCitDVkFQSShJcGxJbWFnZSopIGljdkNyZWF0ZUlzb21ldHJpY0ltYWdlKCBJcGxJbWFnZSogc3JjLCBJcGxJbWFnZSogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWRfZGVwdGgsIGludCBkZXNpcmVkX251bV9jaGFubmVscyApOworCitDVkFQSSh2b2lkKSBjdkRlSW50ZXJsYWNlKCBjb25zdCBDdkFyciogZnJhbWUsIEN2QXJyKiBmaWVsZEV2ZW4sIEN2QXJyKiBmaWVsZE9kZCApOworCisvKkNWQVBJKGludCkgaWN2U2VsZWN0QmVzdFJ0KCAgICAgICAgICAgaW50ICAgICAgICAgICBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgIG51bVBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBpbWFnZVBvaW50czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGltYWdlUG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiogb2JqZWN0UG9pbnRzLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIGNhbWVyYU1hdHJpeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIGRpc3RvcnRpb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICByb3RNYXRyczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIHRyYW5zVmVjdHMxLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIGNhbWVyYU1hdHJpeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIGRpc3RvcnRpb24yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICByb3RNYXRyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIHRyYW5zVmVjdHMyLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIGJlc3RSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmICAgICBiZXN0VHJhbnNWZWN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udG91ciBNb3JwaGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZmluZHMgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0d28gY29udG91cnMgKi8KK0N2U2VxKiBjdkNhbGNDb250b3Vyc0NvcnJlc3BvbmRlbmNlKCBjb25zdCBDdlNlcSogY29udG91cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTZXEqIGNvbnRvdXIyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UpOworCisvKiBtb3JwaHMgY29udG91cnMgdXNpbmcgdGhlIHByZS1jYWxjdWxhdGVkIGNvcnJlc3BvbmRlbmNlOgorICAgYWxwaGE9MCB+IGNvbnRvdXIxLCBhbHBoYT0xIH4gY29udG91cjIgKi8KK0N2U2VxKiBjdk1vcnBoQ29udG91cnMoIGNvbnN0IEN2U2VxKiBjb250b3VyMSwgY29uc3QgQ3ZTZXEqIGNvbnRvdXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGNvcnIsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0dXJlIERlc2NyaXB0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfR0xDTV9PUFRJTUlaQVRJT05fTk9ORSAgICAgICAgICAgICAgICAgICAtMgorI2RlZmluZSBDVl9HTENNX09QVElNSVpBVElPTl9MVVQgICAgICAgICAgICAgICAgICAgIC0xCisjZGVmaW5lIENWX0dMQ01fT1BUSU1JWkFUSU9OX0hJU1RPR1JBTSAgICAgICAgICAgICAgMAorCisjZGVmaW5lIENWX0dMQ01ERVNDX09QVElNSVpBVElPTl9BTExPV0RPVUJMRU5FU1QgICAgMTAKKyNkZWZpbmUgQ1ZfR0xDTURFU0NfT1BUSU1JWkFUSU9OX0FMTE9XVFJJUExFTkVTVCAgICAxMQorI2RlZmluZSBDVl9HTENNREVTQ19PUFRJTUlaQVRJT05fSElTVE9HUkFNICAgICAgICAgIDQKKworI2RlZmluZSBDVl9HTENNREVTQ19FTlRST1BZICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1ZfR0xDTURFU0NfRU5FUkdZICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENWX0dMQ01ERVNDX0hPTU9HRU5JVFkgICAgICAgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDVl9HTENNREVTQ19DT05UUkFTVCAgICAgICAgICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgQ1ZfR0xDTURFU0NfQ0xVU1RFUlRFTkRFTkNZICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIENWX0dMQ01ERVNDX0NMVVNURVJTSEFERSAgICAgICAgICAgICAgICAgICAgNQorI2RlZmluZSBDVl9HTENNREVTQ19DT1JSRUxBVElPTiAgICAgICAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgQ1ZfR0xDTURFU0NfQ09SUkVMQVRJT05JTkZPMSAgICAgICAgICAgICAgICA3CisjZGVmaW5lIENWX0dMQ01ERVNDX0NPUlJFTEFUSU9OSU5GTzIgICAgICAgICAgICAgICAgOAorI2RlZmluZSBDVl9HTENNREVTQ19NQVhJTVVNUFJPQkFCSUxJVFkgICAgICAgICAgICAgIDkKKworI2RlZmluZSBDVl9HTENNX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1ZfR0xDTV9HTENNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIENWX0dMQ01fREVTQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCit0eXBlZGVmIHN0cnVjdCBDdkdMQ00gQ3ZHTENNOworCitDVkFQSShDdkdMQ00qKSBjdkNyZWF0ZUdMQ00oIGNvbnN0IElwbEltYWdlKiBzcmNJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXBNYWduaXR1ZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogc3RlcERpcmVjdGlvbnMgQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bVN0ZXBEaXJlY3Rpb25zIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcHRpbWl6YXRpb25UeXBlIENWX0RFRkFVTFQoQ1ZfR0xDTV9PUFRJTUlaQVRJT05fTk9ORSkpOworCitDVkFQSSh2b2lkKSBjdlJlbGVhc2VHTENNKCBDdkdMQ00qKiBHTENNLCBpbnQgZmxhZyBDVl9ERUZBVUxUKENWX0dMQ01fQUxMKSk7CisKK0NWQVBJKHZvaWQpIGN2Q3JlYXRlR0xDTURlc2NyaXB0b3JzKCBDdkdMQ00qIGRlc3RHTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNjcmlwdG9yT3B0aW1pemF0aW9uVHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0RFRkFVTFQoQ1ZfR0xDTURFU0NfT1BUSU1JWkFUSU9OX0FMTE9XRE9VQkxFTkVTVCkpOworCitDVkFQSShkb3VibGUpIGN2R2V0R0xDTURlc2NyaXB0b3IoIEN2R0xDTSogR0xDTSwgaW50IHN0ZXAsIGludCBkZXNjcmlwdG9yICk7CisKK0NWQVBJKHZvaWQpIGN2R2V0R0xDTURlc2NyaXB0b3JTdGF0aXN0aWNzKCBDdkdMQ00qIEdMQ00sIGludCBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYXZlcmFnZSwgZG91YmxlKiBzdGFuZGFyZERldmlhdGlvbiApOworCitDVkFQSShJcGxJbWFnZSopIGN2Q3JlYXRlR0xDTUltYWdlKCBDdkdMQ00qIEdMQ00sIGludCBzdGVwICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlIGV5ZXMmbW91dGggdHJhY2tpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCit0eXBlZGVmIHN0cnVjdCBDdkZhY2VUcmFja2VyIEN2RmFjZVRyYWNrZXI7CisKKyNkZWZpbmUgQ1ZfTlVNX0ZBQ0VfRUxFTUVOVFMgICAgMyAKK2VudW0gQ1ZfRkFDRV9FTEVNRU5UUworeworICAgIENWX0ZBQ0VfTU9VVEggPSAwLAorICAgIENWX0ZBQ0VfTEVGVF9FWUUgPSAxLAorICAgIENWX0ZBQ0VfUklHSFRfRVlFID0gMgorfTsKKworQ1ZBUEkoQ3ZGYWNlVHJhY2tlciopIGN2SW5pdEZhY2VUcmFja2VyKEN2RmFjZVRyYWNrZXIqIHBGYWNlVHJhY2tpbmcsIGNvbnN0IElwbEltYWdlKiBpbWdHcmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0KiBwUmVjdHMsIGludCBuUmVjdHMpOworQ1ZBUEkoaW50KSBjdlRyYWNrRmFjZSggQ3ZGYWNlVHJhY2tlciogcEZhY2VUcmFja2VyLCBJcGxJbWFnZSogaW1nR3JheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCogcFJlY3RzLCBpbnQgblJlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCogcHRSb3RhdGUsIGRvdWJsZSogZGJBbmdsZVJvdGF0ZSk7CitDVkFQSSh2b2lkKSBjdlJlbGVhc2VGYWNlVHJhY2tlcihDdkZhY2VUcmFja2VyKiogcHBGYWNlVHJhY2tlcik7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZGYWNlCit7CisgICAgQ3ZSZWN0IE1vdXRoUmVjdDsKKyAgICBDdlJlY3QgTGVmdEV5ZVJlY3Q7CisgICAgQ3ZSZWN0IFJpZ2h0RXllUmVjdDsKK30gQ3ZGYWNlRGF0YTsKKworQ3ZTZXEgKiBjdkZpbmRGYWNlKElwbEltYWdlICogSW1hZ2UsQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlKTsKK0N2U2VxICogY3ZQb3N0Qm9vc3RpbmdGaW5kRmFjZShJcGxJbWFnZSAqIEltYWdlLEN2TWVtU3RvcmFnZSogc3RvcmFnZSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzRCBUcmFja2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQ3ZCb29sOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBpZDsKKyAgICBDdlBvaW50MkQzMmYgcDsgLy8gcGdydWViZWxlOiBTbyB3ZSBkbyBub3QgbG9vc2UgcHJlY2lzaW9uLCB0aGlzIG5lZWRzIHRvIGJlIGZsb2F0Cit9IEN2M2RUcmFja2VyMmRUcmFja2VkT2JqZWN0OworCitDVl9JTkxJTkUgQ3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QgY3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QoaW50IGlkLCBDdlBvaW50MkQzMmYgcCkKK3sKKyAgICBDdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdCByOworICAgIHIuaWQgPSBpZDsKKyAgICByLnAgPSBwOworICAgIHJldHVybiByOworfQorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBpZDsKKyAgICBDdlBvaW50M0QzMmYgcDsgICAgICAgICAgICAgLy8gbG9jYXRpb24gb2YgdGhlIHRyYWNrZWQgb2JqZWN0Cit9IEN2M2RUcmFja2VyVHJhY2tlZE9iamVjdDsKKworQ1ZfSU5MSU5FIEN2M2RUcmFja2VyVHJhY2tlZE9iamVjdCBjdjNkVHJhY2tlclRyYWNrZWRPYmplY3QoaW50IGlkLCBDdlBvaW50M0QzMmYgcCkKK3sKKyAgICBDdjNkVHJhY2tlclRyYWNrZWRPYmplY3QgcjsKKyAgICByLmlkID0gaWQ7CisgICAgci5wID0gcDsKKyAgICByZXR1cm4gcjsKK30KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDdkJvb2wgdmFsaWQ7CisgICAgZmxvYXQgbWF0WzRdWzRdOyAgICAgICAgICAgICAgLyogbWFwcyBjYW1lcmEgY29vcmRpbmF0ZXMgdG8gd29ybGQgY29vcmRpbmF0ZXMgKi8KKyAgICBDdlBvaW50MkQzMmYgcHJpbmNpcGFsX3BvaW50OyAvKiBjb3BpZWQgZnJvbSBpbnRyaW5zaWNzIHNvIHRoaXMgc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIGFsbCB0aGUgaW5mbyB3ZSBuZWVkICovCit9IEN2M2RUcmFja2VyQ2FtZXJhSW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBDdlBvaW50MkQzMmYgcHJpbmNpcGFsX3BvaW50OworICAgIGZsb2F0IGZvY2FsX2xlbmd0aFsyXTsKKyAgICBmbG9hdCBkaXN0b3J0aW9uWzRdOworfSBDdjNkVHJhY2tlckNhbWVyYUludHJpbnNpY3M7CisKK0NWQVBJKEN2Qm9vbCkgY3YzZFRyYWNrZXJDYWxpYnJhdGVDYW1lcmFzKGludCBudW1fY2FtZXJhcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2M2RUcmFja2VyQ2FtZXJhSW50cmluc2ljcyBjYW1lcmFfaW50cmluc2ljc1tdLCAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCisgICAgICAgICAgICAgICAgICAgICBDdlNpemUgZXRhbG9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcXVhcmVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlICpzYW1wbGVzW10sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCisgICAgICAgICAgICAgICAgICAgICBDdjNkVHJhY2tlckNhbWVyYUluZm8gY2FtZXJhX2luZm9bXSk7ICAgICAgICAgICAgICAgICAgLyogc2l6ZSBpcyBudW1fY2FtZXJhcyAqLworCitDVkFQSShpbnQpICBjdjNkVHJhY2tlckxvY2F0ZU9iamVjdHMoaW50IG51bV9jYW1lcmFzLCBpbnQgbnVtX29iamVjdHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3YzZFRyYWNrZXJDYW1lcmFJbmZvIGNhbWVyYV9pbmZvW10sICAgICAgICAvKiBzaXplIGlzIG51bV9jYW1lcmFzICovCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QgdHJhY2tpbmdfaW5mb1tdLCAvKiBzaXplIGlzIG51bV9vYmplY3RzKm51bV9jYW1lcmFzICovCisgICAgICAgICAgICAgICAgICAgQ3YzZFRyYWNrZXJUcmFja2VkT2JqZWN0IHRyYWNrZWRfb2JqZWN0c1tdKTsgICAgICAvKiBzaXplIGlzIG51bV9vYmplY3RzICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIHRyYWNraW5nX2luZm8gaXMgYSByZWN0YW5ndWxhciBhcnJheTsgb25lIHJvdyBwZXIgY2FtZXJhLCBudW1fb2JqZWN0cyBlbGVtZW50cyBwZXIgcm93LgorIFRoZSBpZCBmaWVsZCBvZiBhbnkgdW51c2VkIHNsb3RzIG11c3QgYmUgLTEuIElkcyBuZWVkIG5vdCBiZSBvcmRlcmVkIG9yIGNvbnNlY3V0aXZlLiBPbgorIGNvbXBsZXRpb24sIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiBvYmplY3RzIGxvY2F0ZWQ7IGkuZS4sIHRoZSBudW1iZXIgb2Ygb2JqZWN0cworIHZpc2libGUgYnkgbW9yZSB0aGFuIG9uZSBjYW1lcmEuIFRoZSBpZCBmaWVsZCBvZiBhbnkgdW51c2VkIHNsb3RzIGluIHRyYWNrZWQgb2JqZWN0cyBpcworIHNldCB0byAtMS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgU2tlbGV0b25zIGFuZCBMaW5lYXItQ29udG91ciBNb2RlbHMgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIGVudW0gQ3ZMZWVQYXJhbWV0ZXJzCit7CisgICAgQ1ZfTEVFX0lOVCA9IDAsCisgICAgQ1ZfTEVFX0ZMT0FUID0gMSwKKyAgICBDVl9MRUVfRE9VQkxFID0gMiwKKyAgICBDVl9MRUVfQVVUTyA9IC0xLAorICAgIENWX0xFRV9FUk9ERSA9IDAsCisgICAgQ1ZfTEVFX1pPT00gPSAxLAorICAgIENWX0xFRV9OT04gPSAyCit9IEN2TGVlUGFyYW1ldGVyczsKKworI2RlZmluZSBDVl9ORVhUX1ZPUk9OT0lTSVRFMkQoIFNJVEUgKSAoKFNJVEUpLT5lZGdlWzBdLT5zaXRlWygoU0lURSktPmVkZ2VbMF0tPnNpdGVbMF0gPT0gKFNJVEUpKV0pCisjZGVmaW5lIENWX1BSRVZfVk9ST05PSVNJVEUyRCggU0lURSApICgoU0lURSktPmVkZ2VbMV0tPnNpdGVbKChTSVRFKS0+ZWRnZVsxXS0+c2l0ZVswXSA9PSAoU0lURSkpXSkKKyNkZWZpbmUgQ1ZfRklSU1RfVk9ST05PSUVER0UyRCggU0lURSApICgoU0lURSktPmVkZ2VbMF0pCisjZGVmaW5lIENWX0xBU1RfVk9ST05PSUVER0UyRCggU0lURSApICgoU0lURSktPmVkZ2VbMV0pCisjZGVmaW5lIENWX05FWFRfVk9ST05PSUVER0UyRCggRURHRSwgU0lURSApICgoRURHRSktPm5leHRbKEVER0UpLT5zaXRlWzBdICE9IChTSVRFKV0pCisjZGVmaW5lIENWX1BSRVZfVk9ST05PSUVER0UyRCggRURHRSwgU0lURSApICgoRURHRSktPm5leHRbMiArICgoRURHRSktPnNpdGVbMF0gIT0gKFNJVEUpKV0pCisjZGVmaW5lIENWX1ZPUk9OT0lFREdFMkRfQkVHSU5OT0RFKCBFREdFLCBTSVRFICkgKChFREdFKS0+bm9kZVsoKEVER0UpLT5zaXRlWzBdICE9IChTSVRFKSldKQorI2RlZmluZSBDVl9WT1JPTk9JRURHRTJEX0VORE5PREUoIEVER0UsIFNJVEUgKSAoKEVER0UpLT5ub2RlWygoRURHRSktPnNpdGVbMF0gPT0gKFNJVEUpKV0pCisjZGVmaW5lIENWX1RXSU5fVk9ST05PSVNJVEUyRCggU0lURSwgRURHRSApICggKEVER0UpLT5zaXRlWygoRURHRSktPnNpdGVbMF0gPT0gKFNJVEUpKV0pIAorCisjZGVmaW5lIENWX1ZPUk9OT0lTSVRFMkRfRklFTERTKCkgICAgXAorICAgIHN0cnVjdCBDdlZvcm9ub2lOb2RlMkQgKm5vZGVbMl07IFwKKyAgICBzdHJ1Y3QgQ3ZWb3Jvbm9pRWRnZTJEICplZGdlWzJdOworCit0eXBlZGVmIHN0cnVjdCBDdlZvcm9ub2lTaXRlMkQKK3sKKyAgICBDVl9WT1JPTk9JU0lURTJEX0ZJRUxEUygpCisgICAgc3RydWN0IEN2Vm9yb25vaVNpdGUyRCAqbmV4dFsyXTsKK30gQ3ZWb3Jvbm9pU2l0ZTJEOworCisjZGVmaW5lIENWX1ZPUk9OT0lFREdFMkRfRklFTERTKCkgICAgXAorICAgIHN0cnVjdCBDdlZvcm9ub2lOb2RlMkQgKm5vZGVbMl07IFwKKyAgICBzdHJ1Y3QgQ3ZWb3Jvbm9pU2l0ZTJEICpzaXRlWzJdOyBcCisgICAgc3RydWN0IEN2Vm9yb25vaUVkZ2UyRCAqbmV4dFs0XTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZWb3Jvbm9pRWRnZTJECit7CisgICAgQ1ZfVk9ST05PSUVER0UyRF9GSUVMRFMoKQorfSBDdlZvcm9ub2lFZGdlMkQ7CisKKyNkZWZpbmUgQ1ZfVk9ST05PSU5PREUyRF9GSUVMRFMoKSAgICAgICBcCisgICAgQ1ZfU0VUX0VMRU1fRklFTERTKEN2Vm9yb25vaU5vZGUyRCkgXAorICAgIEN2UG9pbnQyRDMyZiBwdDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCByYWRpdXM7CisKK3R5cGVkZWYgc3RydWN0IEN2Vm9yb25vaU5vZGUyRAoreworICAgIENWX1ZPUk9OT0lOT0RFMkRfRklFTERTKCkKK30gQ3ZWb3Jvbm9pTm9kZTJEOworCisjZGVmaW5lIENWX1ZPUk9OT0lESUFHUkFNMkRfRklFTERTKCkgXAorICAgIENWX0dSQVBIX0ZJRUxEUygpICAgICAgICAgICAgICAgIFwKKyAgICBDdlNldCAqc2l0ZXM7CisKK3R5cGVkZWYgc3RydWN0IEN2Vm9yb25vaURpYWdyYW0yRAoreworICAgIENWX1ZPUk9OT0lESUFHUkFNMkRfRklFTERTKCkKK30gQ3ZWb3Jvbm9pRGlhZ3JhbTJEOworCisvKiBDb21wdXRlcyBWb3Jvbm9pIERpYWdyYW0gZm9yIGdpdmVuIHBvbHlnb25zIHdpdGggaG9sZXMgKi8KK0NWQVBJKGludCkgIGN2Vm9yb25vaURpYWdyYW1Gcm9tQ29udG91cihDdlNlcSogQ29udG91clNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtMkQqKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIFZvcm9ub2lTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyBjb250b3VyX3R5cGUgQ1ZfREVGQVVMVChDVl9MRUVfSU5UKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udG91cl9vcmllbnRhdGlvbiBDVl9ERUZBVUxUKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdF9udW1iZXIgQ1ZfREVGQVVMVCgxMCkpOworCisvKiBDb21wdXRlcyBWb3Jvbm9pIERpYWdyYW0gZm9yIGRvbWFpbnMgaW4gZ2l2ZW4gaW1hZ2UgKi8KK0NWQVBJKGludCkgIGN2Vm9yb25vaURpYWdyYW1Gcm9tSW1hZ2UoSXBsSW1hZ2UqIHBJbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqKiBDb250b3VyU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtMkQqKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMZWVQYXJhbWV0ZXJzIHJlZ3VsYXJpemF0aW9uX21ldGhvZCBDVl9ERUZBVUxUKENWX0xFRV9OT04pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhcHByb3hfcHJlY2lzaW9uIENWX0RFRkFVTFQoQ1ZfTEVFX0FVVE8pKTsKKworLyogRGVhbGxvY2F0ZXMgdGhlIHN0b3JhZ2UgKi8KK0NWQVBJKHZvaWQpIGN2UmVsZWFzZVZvcm9ub2lTdG9yYWdlKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqKiBwVm9yb25vaVN0b3JhZ2UpOworCisvKioqKioqKioqKioqKioqKioqKioqKiogTGluZWFyLUNvbnRvdXIgTW9kZWwgKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IEN2TENNRWRnZTsKK3N0cnVjdCBDdkxDTU5vZGU7CisKK3R5cGVkZWYgc3RydWN0IEN2TENNRWRnZQoreworICAgIENWX0dSQVBIX0VER0VfRklFTERTKCkgCisgICAgQ3ZTZXEqIGNoYWluOworICAgIGZsb2F0IHdpZHRoOworICAgIGludCBpbmRleDE7CisgICAgaW50IGluZGV4MjsKK30gQ3ZMQ01FZGdlOworCit0eXBlZGVmIHN0cnVjdCBDdkxDTU5vZGUKK3sKKyAgICBDVl9HUkFQSF9WRVJURVhfRklFTERTKCkKKyAgICBDdkNvbnRvdXIqIGNvbnRvdXI7IAorfSBDdkxDTU5vZGU7CisKKworLyogQ29tcHV0ZXMgaHlicmlkIG1vZGVsIGZyb20gVm9yb25vaSBEaWFncmFtICovCitDVkFQSShDdkdyYXBoKikgY3ZMaW5lYXJDb250b3JNb2RlbEZyb21Wb3Jvbm9pRGlhZ3JhbShDdlZvcm9ub2lEaWFncmFtMkQqIFZvcm9ub2lEaWFncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4V2lkdGgpOworCisvKiBSZWxlYXNlcyBoeWJyaWQgbW9kZWwgc3RvcmFnZSAqLworQ1ZBUEkoaW50KSBjdlJlbGVhc2VMaW5lYXJDb250b3JNb2RlbFN0b3JhZ2UoQ3ZHcmFwaCoqIEdyYXBoKTsKKworCisvKiB0d28gc3RlcmVvLXJlbGF0ZWQgZnVuY3Rpb25zICovCisKK0NWQVBJKHZvaWQpIGN2SW5pdFBlcnNwZWN0aXZlVHJhbnNmb3JtKCBDdlNpemUgc2l6ZSwgY29uc3QgQ3ZQb2ludDJEMzJmIHZlcnRleFs0XSwgZG91YmxlIG1hdHJpeFszXVszXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogcmVjdE1hcCApOworCisvKkNWQVBJKHZvaWQpIGN2SW5pdFN0ZXJlb1JlY3RpZmljYXRpb24oIEN2U3RlcmVvQ2FtZXJhKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogcmVjdE1hcDEsIEN2QXJyKiByZWN0TWFwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkb191bmRpc3RvcnRpb24gKTsqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqIFZpZXcgTW9ycGhpbmcgRnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGhlIG9yZGVyIG9mIHRoZSBmdW5jdGlvbiBjb3JyZXNwb25kcyB0byB0aGUgb3JkZXIgdGhleSBzaG91bGQgYXBwZWFyIGluCisgICB0aGUgdmlldyBtb3JwaGluZyBwaXBlbGluZSAqLyAKKworLyogRmluZHMgZW5kaW5nIHBvaW50cyBvZiBzY2FubGluZXMgb24gbGVmdCBhbmQgcmlnaHQgaW1hZ2VzIG9mIHN0ZXJlby1wYWlyICovCitDVkFQSSh2b2lkKSAgY3ZNYWtlU2NhbmxpbmVzKCBjb25zdCBDdk1hdHJpeDMqIG1hdHJpeCwgQ3ZTaXplICBpbWdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogIHNjYW5saW5lczEsIGludCogIHNjYW5saW5lczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBsZW5ndGhzMSwgaW50KiAgbGVuZ3RoczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBsaW5lX2NvdW50ICk7CisKKy8qIEdyYWIgcGl4ZWwgdmFsdWVzIGZyb20gc2NhbmxpbmVzIGFuZCBzdG9yZXMgdGhlbSBzZXF1ZW50aWFsbHkKKyAgIChzb21lIHNvcnQgb2YgcGVyc3BlY3RpdmUgaW1hZ2UgdHJhbnNmb3JtKSAqLworQ1ZBUEkodm9pZCkgIGN2UHJlV2FycEltYWdlKCBpbnQgICAgICAgbGluZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqIGltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICAgIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgIGRzdF9udW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgc2NhbmxpbmVzKTsKKworLyogQXBwcm94aW1hdGUgZWFjaCBncmFiYmVkIHNjYW5saW5lIGJ5IGEgc2VxdWVuY2Ugb2YgcnVucworICAgKGxvc3N5IHJ1bi1sZW5ndGggY29tcHJlc3Npb24pICovCitDVkFQSSh2b2lkKSAgY3ZGaW5kUnVucyggaW50ICAgIGxpbmVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIHByZXdhcnAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBwcmV3YXJwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgbGluZV9sZW5ndGhzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgbGluZV9sZW5ndGhzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgcnVuczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHJ1bnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBudW1fcnVuczEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIG51bV9ydW5zMik7CisKKy8qIENvbXBhcmVzIHR3byBzZXRzIG9mIGNvbXByZXNzZWQgc2NhbmxpbmVzICovCitDVkFQSSh2b2lkKSAgY3ZEeW5hbWljQ29ycmVzcG9uZE11bHRpKCBpbnQgIGxpbmVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaXJzdF9ydW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNlY29uZF9ydW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaXJzdF9jb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzZWNvbmRfY29ycik7CisKKy8qIEZpbmRzIHNjYW5saW5lIGVuZGluZyBjb29yZGluYXRlcyBmb3Igc29tZSBpbnRlcm1lZGlhdGUgInZpcnR1YWwiIGNhbWVyYSBwb3NpdGlvbiAqLworQ1ZBUEkodm9pZCkgIGN2TWFrZUFscGhhU2NhbmxpbmVzKCBpbnQqICBzY2FubGluZXMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBzY2FubGluZXMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBzY2FubGluZXNBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBsZW5ndGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBsaW5lX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSk7CisKKy8qIEJsZW5kcyBkYXRhIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBpbWFnZSBzY2FubGluZXMgdG8gZ2V0CisgICBwaXhlbCB2YWx1ZXMgb2YgInZpcnR1YWwiIGltYWdlIHNjYW5saW5lcyAqLworQ1ZBUEkodm9pZCkgIGN2TW9ycGhFcGlsaW5lc011bHRpKCBpbnQgICAgbGluZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGZpcnN0X3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIGZpcnN0X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIHNlY29uZF9waXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICBzZWNvbmRfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0X3BpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIGRzdF9udW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgZmlyc3RfcnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHNlY29uZF9ydW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgZmlyc3RfY29yciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgIHNlY29uZF9jb3JyKTsKKworLyogRG9lcyByZXZlcnNlIHdhcnBpbmcgb2YgdGhlIG1vcnBoaW5nIHJlc3VsdCB0byBtYWtlCisgICBpdCBmaWxsIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSByZWN0YW5nbGUgKi8KK0NWQVBJKHZvaWQpICBjdlBvc3RXYXJwSW1hZ2UoIGludCAgICAgICBsaW5lX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICBzcmNfbnVtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiBpbWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgc2NhbmxpbmVzKTsKKworLyogRGVsZXRlcyBNb2lyZSAobWlzc2VkIHBpeGVscyB0aGF0IGFwcGVhciBkdWUgdG8gZGlzY3JldGl6YXRpb24pICovCitDVkFQSSh2b2lkKSAgY3ZEZWxldGVNb2lyZSggSXBsSW1hZ2UqICBpbWcgKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICBCYWNrZ3JvdW5kL2ZvcmVncm91bmQgc2VnbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFdlIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgcGl4ZWxzCisgKiBieSBidWlsZGluZyBhbmQgbWFpbnRhaW5pbmcgYSBtb2RlbCBvZiB0aGUgYmFja2dyb3VuZC4KKyAqIEFueSBwaXhlbCB3aGljaCBkb2VzIG5vdCBmaXQgdGhpcyBtb2RlbCBpcyB0aGVuIGRlZW1lZAorICogdG8gYmUgZm9yZWdyb3VuZC4KKyAqCisgKiBBdCBwcmVzZW50IHdlIHN1cHBvcnQgdHdvIGNvcmUgYmFja2dyb3VuZCBtb2RlbHMsCisgKiBvbmUgb2Ygd2hpY2ggaGFzIHR3byB2YXJpYXRpb25zOgorICoKKyAqICBvIENWX0JHX01PREVMX0ZHRDogbGF0ZXN0IGFuZCBncmVhdGVzdCBhbGdvcml0aG0sIGRlc2NyaWJlZCBpbgorICogICAgCisgKgkgRm9yZWdyb3VuZCBPYmplY3QgRGV0ZWN0aW9uIGZyb20gVmlkZW9zIENvbnRhaW5pbmcgQ29tcGxleCBCYWNrZ3JvdW5kLgorICoJIExpeXVhbiBMaSwgV2VpbWluIEh1YW5nLCBJcmVuZSBZLkguIEd1LCBhbmQgUWkgVGlhbi4gCisgKgkgQUNNIE1NMjAwMyA5cAorICoKKyAqICBvIENWX0JHX01PREVMX0ZHRF9TSU1QTEU6CisgKiAgICAgICBBIGNvZGUgY29tbWVudCBkZXNjcmliZXMgdGhpcyBhcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgYWJvdmUsCisgKiAgICAgICBidXQgdGhlIGNvZGUgaXMgaW4gZmFjdCBjdXJyZW50bHkgaWRlbnRpY2FsCisgKgorICogIG8gQ1ZfQkdfTU9ERUxfTU9HOiAiTWl4dHVyZSBvZiBHYXVzc2lhbnMiLCBvbGRlciBhbGdvcml0aG0sIGRlc2NyaWJlZCBpbgorICoKKyAqICAgICAgIE1vdmluZyB0YXJnZXQgY2xhc3NpZmljYXRpb24gYW5kIHRyYWNraW5nIGZyb20gcmVhbC10aW1lIHZpZGVvLgorICogICAgICAgQSBMaXB0b24sIEggRnVqaWpvc2hpLCBSIFBhdGlsCisgKiAgICAgICBQcm9jZWVkaW5ncyBJRUVFIFdvcmtzaG9wIG9uIEFwcGxpY2F0aW9uIG9mIENvbXB1dGVyIFZpc2lvbiBwcCA4LTE0IDE5OTgKKyAqCisgKiAgICAgICBMZWFybmluZyBwYXR0ZXJucyBvZiBhY3Rpdml0eSB1c2luZyByZWFsLXRpbWUgdHJhY2tpbmcKKyAqICAgICAgIEMgU3RhdWZmZXIgYW5kIFcgR3JpbXNvbiAgQXVndXN0IDIwMDAKKyAqICAgICAgIElFRUUgVHJhbnNhY3Rpb25zIG9uIFBhdHRlcm4gQW5hbHlzaXMgYW5kIE1hY2hpbmUgSW50ZWxsaWdlbmNlIDIyKDgpOjc0Ny03NTcKKyAqLworCisKKyNkZWZpbmUgQ1ZfQkdfTU9ERUxfRkdECQkwCisjZGVmaW5lIENWX0JHX01PREVMX01PRwkJMQkJCS8qICJNaXh0dXJlIG9mIEdhdXNzaWFucyIuCSovCisjZGVmaW5lIENWX0JHX01PREVMX0ZHRF9TSU1QTEUJMgorCitzdHJ1Y3QgQ3ZCR1N0YXRNb2RlbDsKKwordHlwZWRlZiB2b2lkIChDVl9DREVDTCAqIEN2UmVsZWFzZUJHU3RhdE1vZGVsKSggc3RydWN0IEN2QkdTdGF0TW9kZWwqKiBiZ19tb2RlbCApOwordHlwZWRlZiBpbnQgKENWX0NERUNMICogQ3ZVcGRhdGVCR1N0YXRNb2RlbCkoIElwbEltYWdlKiBjdXJyX2ZyYW1lLCBzdHJ1Y3QgQ3ZCR1N0YXRNb2RlbCogYmdfbW9kZWwgKTsKKworI2RlZmluZSBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICAgICAgICB0eXBlOyAvKnR5cGUgb2YgQkcgbW9kZWwqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2UmVsZWFzZUJHU3RhdE1vZGVsIHJlbGVhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2VXBkYXRlQkdTdGF0TW9kZWwgdXBkYXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElwbEltYWdlKiAgICAgICBiYWNrZ3JvdW5kOyAgIC8qOFVDMyByZWZlcmVuY2UgYmFja2dyb3VuZCBpbWFnZSovICAgICAgICAgICAgICAgXAorICAgIElwbEltYWdlKiAgICAgICBmb3JlZ3JvdW5kOyAgIC8qOFVDMSBmb3JlZ3JvdW5kIGltYWdlKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElwbEltYWdlKiogICAgICBsYXllcnM7ICAgICAgIC8qOFVDMyByZWZlcmVuY2UgYmFja2dyb3VuZCBpbWFnZSwgY2FuIGJlIG51bGwgKi8gXAorICAgIGludCAgICAgICAgICAgICBsYXllcl9jb3VudDsgIC8qIGNhbiBiZSB6ZXJvICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2TWVtU3RvcmFnZSogICBzdG9yYWdlOyAgICAgIC8qc3RvcmFnZSBmb3Igk2ZvcmVncm91bmRfcmVnaW9uc5QqLyAgICAgICAgICAgICAgXAorICAgIEN2U2VxKiAgICAgICAgICBmb3JlZ3JvdW5kX3JlZ2lvbnMgLypmb3JlZ3JvdW5kIG9iamVjdCBjb250b3VycyovCisKK3R5cGVkZWYgc3RydWN0IEN2QkdTdGF0TW9kZWwKK3sKKyAgICBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpOworfQorQ3ZCR1N0YXRNb2RlbDsKKworLy8gCisKKy8vIFJlbGVhc2VzIG1lbW9yeSB1c2VkIGJ5IEJHU3RhdE1vZGVsCitDVl9JTkxJTkUgdm9pZCBjdlJlbGVhc2VCR1N0YXRNb2RlbCggQ3ZCR1N0YXRNb2RlbCoqIGJnX21vZGVsICkKK3sKKyAgICBpZiggYmdfbW9kZWwgJiYgKmJnX21vZGVsICYmICgqYmdfbW9kZWwpLT5yZWxlYXNlICkKKyAgICAgICAgKCpiZ19tb2RlbCktPnJlbGVhc2UoIGJnX21vZGVsICk7Cit9CisKKy8vIFVwZGF0ZXMgc3RhdGlzdGljYWwgbW9kZWwgYW5kIHJldHVybnMgbnVtYmVyIG9mIGZvdW5kIGZvcmVncm91bmQgcmVnaW9ucworQ1ZfSU5MSU5FIGludCBjdlVwZGF0ZUJHU3RhdE1vZGVsKCBJcGxJbWFnZSogY3VycmVudF9mcmFtZSwgQ3ZCR1N0YXRNb2RlbCogIGJnX21vZGVsICkKK3sKKyAgICByZXR1cm4gYmdfbW9kZWwgJiYgYmdfbW9kZWwtPnVwZGF0ZSA/IGJnX21vZGVsLT51cGRhdGUoIGN1cnJlbnRfZnJhbWUsIGJnX21vZGVsICkgOiAwOworfQorCisvLyBQZXJmb3JtcyBGRyBwb3N0LXByb2Nlc3NpbmcgdXNpbmcgc2VnbWVudGF0aW9uCisvLyAoYWxsIHBpeGVscyBvZiBhIHJlZ2lvbiB3aWxsIGJlIGNsYXNzaWZpZWQgYXMgZm9yZWdyb3VuZCBpZiBtYWpvcml0eSBvZiBwaXhlbHMgb2YgdGhlIHJlZ2lvbiBhcmUgRkcpLgorLy8gcGFyYW1ldGVyczoKKy8vICAgICAgc2VnbWVudHMgLSBwb2ludGVyIHRvIHJlc3VsdCBvZiBzZWdtZW50YXRpb24gKGZvciBleGFtcGxlIE1lYW5TaGlmdFNlZ21lbnRhdGlvbikKKy8vICAgICAgYmdfbW9kZWwgLSBwb2ludGVyIHRvIEN2QkdTdGF0TW9kZWwgc3RydWN0dXJlCitDVkFQSSh2b2lkKSBjdlJlZmluZUZvcmVncm91bmRNYXNrQnlTZWdtKCBDdlNlcSogc2VnbWVudHMsIEN2QkdTdGF0TW9kZWwqICBiZ19tb2RlbCApOworCisvKiBDb21tb24gdXNlIGNoYW5nZSBkZXRlY3Rpb24gZnVuY3Rpb24gKi8KK0NWQVBJKGludCkgIGN2Q2hhbmdlRGV0ZWN0aW9uKCBJcGxJbWFnZSogIHByZXZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqICBjdXJyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiAgY2hhbmdlX21hc2sgKTsKKworLyoKKyAgSW50ZXJmYWNlIG9mIEFDTSBNTTIwMDMgYWxnb3JpdGhtCisqLworCisvKiBEZWZhdWx0IHBhcmFtZXRlcnMgb2YgZm9yZWdyb3VuZCBkZXRlY3Rpb24gYWxnb3JpdGhtOiAqLworI2RlZmluZSAgQ1ZfQkdGR19GR0RfTEMgICAgICAgICAgICAgIDEyOAorI2RlZmluZSAgQ1ZfQkdGR19GR0RfTjFDICAgICAgICAgICAgIDE1CisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9OMkMgICAgICAgICAgICAgMjUKKworI2RlZmluZSAgQ1ZfQkdGR19GR0RfTENDICAgICAgICAgICAgIDY0CisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9OMUNDICAgICAgICAgICAgMjUKKyNkZWZpbmUgIENWX0JHRkdfRkdEX04yQ0MgICAgICAgICAgICA0MAorCisvKiBCYWNrZ3JvdW5kIHJlZmVyZW5jZSBpbWFnZSB1cGRhdGUgcGFyYW1ldGVyOiAqLworI2RlZmluZSAgQ1ZfQkdGR19GR0RfQUxQSEFfMSAgICAgICAgIDAuMWYKKworLyogc3RhdCBtb2RlbCB1cGRhdGUgcGFyYW1ldGVyCisgKiAwLjAwMmYgfiAxSyBmcmFtZSh+NDVzZWMpLCAwLjAwNSB+IDE4c2VjIChpZiAyNWZwcyBhbmQgYWJzb2x1dGVseSBzdGF0aWMgQkcpCisgKi8KKyNkZWZpbmUgIENWX0JHRkdfRkdEX0FMUEhBXzIgICAgICAgICAwLjAwNWYKKworLyogc3RhcnQgdmFsdWUgZm9yIGFscGhhIHBhcmFtZXRlciAodG8gZmFzdCBpbml0aWF0ZSBzdGF0aXN0aWMgbW9kZWwpICovCisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9BTFBIQV8zICAgICAgICAgMC4xZgorCisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9ERUxUQSAgICAgICAgICAgMgorCisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9UICAgICAgICAgICAgICAgMC45ZgorCisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9NSU5BUkVBICAgICAgICAgMTUuZgorCisjZGVmaW5lICBDVl9CR0ZHX0ZHRF9CR19VUERBVEVfVFJFU0ggMC41ZgorCisvKiBTZWUgdGhlIGFib3ZlLXJlZmVyZW5jZWQgTGkvSHVhbmcvR3UvVGlhbiBwYXBlcgorICogZm9yIGEgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGVzZSBiYWNrZ3JvdW5kLW1vZGVsCisgKiB0dW5pbmcgcGFyYW1ldGVycy4KKyAqCisgKiBOb21lbmNsYXR1cmU6ICAnYycgID09ICJjb2xvciIsIGEgdGhyZWUtY29tcG9uZW50IHJlZC9ncmVlbi9ibHVlIHZlY3Rvci4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIFdlIHVzZSBoaXN0b2dyYW1zIG9mIHRoZXNlIHRvIG1vZGVsIHRoZSByYW5nZSBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzIHdlJ3ZlIHNlZW4gYXQgYSBnaXZlbiBiYWNrZ3JvdW5kIHBpeGVsLgorICoKKyAqICAgICAgICAgICAgICAgICdjYycgPT0gImNvbG9yIGNvLW9jY3VycmVuY2UiLCBhIHNpeC1jb21wb25lbnQgdmVjdG9yIGdpdmluZworICogICAgICAgICAgICAgICAgICAgICAgICAgUkdCIGNvbG9yIGZvciBib3RoIHRoaXMgZnJhbWUgYW5kIHByZWNlZGluZyBmcmFtZS4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSB1c2UgaGlzdG9ncmFtcyBvZiB0aGVzZSB0byBtb2RlbCB0aGUgcmFuZ2Ugb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yIENIQU5HRVMgd2UndmUgc2VlbiBhdCBhIGdpdmVuIGJhY2tncm91bmQgcGl4ZWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IEN2RkdEU3RhdE1vZGVsUGFyYW1zCit7CisgICAgaW50ICAgIExjOwkJCS8qIFF1YW50aXplZCBsZXZlbHMgcGVyICdjb2xvcicgY29tcG9uZW50LiBQb3dlciBvZiB0d28sIHR5cGljYWxseSAzMiwgNjQgb3IgMTI4LgkJCQkqLworICAgIGludCAgICBOMWM7CQkJLyogTnVtYmVyIG9mIGNvbG9yIHZlY3RvcnMgdXNlZCB0byBtb2RlbCBub3JtYWwgYmFja2dyb3VuZCBjb2xvciB2YXJpYXRpb24gYXQgYSBnaXZlbiBwaXhlbC4JCQkqLworICAgIGludCAgICBOMmM7CQkJLyogTnVtYmVyIG9mIGNvbG9yIHZlY3RvcnMgcmV0YWluZWQgYXQgZ2l2ZW4gcGl4ZWwuICBNdXN0IGJlID4gTjFjLCB0eXBpY2FsbHkgfiA1LzMgb2YgTjFjLgkJCSovCisJCQkJLyogVXNlZCB0byBhbGxvdyB0aGUgZmlyc3QgTjFjIHZlY3RvcnMgdG8gYWRhcHQgb3ZlciB0aW1lIHRvIGNoYW5naW5nIGJhY2tncm91bmQuCQkJCSovCisKKyAgICBpbnQgICAgTGNjOwkJCS8qIFF1YW50aXplZCBsZXZlbHMgcGVyICdjb2xvciBjby1vY2N1cnJlbmNlJyBjb21wb25lbnQuICBQb3dlciBvZiB0d28sIHR5cGljYWxseSAxNiwgMzIgb3IgNjQuCQkJKi8KKyAgICBpbnQgICAgTjFjYzsJCS8qIE51bWJlciBvZiBjb2xvciBjby1vY2N1cnJlbmNlIHZlY3RvcnMgdXNlZCB0byBtb2RlbCBub3JtYWwgYmFja2dyb3VuZCBjb2xvciB2YXJpYXRpb24gYXQgYSBnaXZlbiBwaXhlbC4JKi8KKyAgICBpbnQgICAgTjJjYzsJCS8qIE51bWJlciBvZiBjb2xvciBjby1vY2N1cnJlbmNlIHZlY3RvcnMgcmV0YWluZWQgYXQgZ2l2ZW4gcGl4ZWwuICBNdXN0IGJlID4gTjFjYywgdHlwaWNhbGx5IH4gNS8zIG9mIE4xY2MuCSovCisJCQkJLyogVXNlZCB0byBhbGxvdyB0aGUgZmlyc3QgTjFjYyB2ZWN0b3JzIHRvIGFkYXB0IG92ZXIgdGltZSB0byBjaGFuZ2luZyBiYWNrZ3JvdW5kLgkJCQkqLworCisgICAgaW50ICAgIGlzX29ial93aXRob3V0X2hvbGVzOy8qIElmIFRSVUUgd2UgaWdub3JlIGhvbGVzIHdpdGhpbiBmb3JlZ3JvdW5kIGJsb2JzLiBEZWZhdWx0cyB0byBUUlVFLgkJCQkJCSovCisgICAgaW50ICAgIHBlcmZvcm1fbW9ycGhpbmc7CS8qIE51bWJlciBvZiBlcm9kZS1kaWxhdGUtZXJvZGUgZm9yZWdyb3VuZC1ibG9iIGNsZWFudXAgaXRlcmF0aW9ucy4JCQkJCQkqLworCQkJCS8qIFRoZXNlIGVyYXNlIG9uZS1waXhlbCBqdW5rIGJsb2JzIGFuZCBtZXJnZSBhbG1vc3QtdG91Y2hpbmcgYmxvYnMuIERlZmF1bHQgdmFsdWUgaXMgMS4JCQkqLworCisgICAgZmxvYXQgIGFscGhhMTsJCS8qIEhvdyBxdWlja2x5IHdlIGZvcmdldCBvbGQgYmFja2dyb3VuZCBwaXhlbCB2YWx1ZXMgc2Vlbi4gIFR5cGljYWxseSBzZXQgdG8gMC4xICAJCQkJKi8KKyAgICBmbG9hdCAgYWxwaGEyOwkJLyogIkNvbnRyb2xzIHNwZWVkIG9mIGZlYXR1cmUgbGVhcm5pbmciLiBEZXBlbmRzIG9uIFQuIFR5cGljYWwgdmFsdWUgY2lyY2EgMC4wMDUuIAkJCQkqLworICAgIGZsb2F0ICBhbHBoYTM7CQkvKiBBbHRlcm5hdGUgdG8gYWxwaGEyLCB1c2VkIChlLmcuKSBmb3IgcXVpY2tlciBpbml0aWFsIGNvbnZlcmdlbmNlLiBUeXBpY2FsIHZhbHVlIDAuMS4JCQkJKi8KKworICAgIGZsb2F0ICBkZWx0YTsJCS8qIEFmZmVjdHMgY29sb3IgYW5kIGNvbG9yIGNvLW9jY3VycmVuY2UgcXVhbnRpemF0aW9uLCB0eXBpY2FsbHkgc2V0IHRvIDIuCQkJCQkqLworICAgIGZsb2F0ICBUOwkJCS8qICJBIHBlcmNlbnRhZ2UgdmFsdWUgd2hpY2ggZGV0ZXJtaW5lcyB3aGVuIG5ldyBmZWF0dXJlcyBjYW4gYmUgcmVjb2duaXplZCBhcyBuZXcgYmFja2dyb3VuZC4iIChUeXBpY2FsbHkgMC45KS4qLworICAgIGZsb2F0ICBtaW5BcmVhOwkJLyogRGlzY2FyZCBmb3JlZ3JvdW5kIGJsb2JzIHdob3NlIGJvdW5kaW5nIGJveCBpcyBzbWFsbGVyIHRoYW4gdGhpcyB0aHJlc2hvbGQuCQkJCQkqLworfQorQ3ZGR0RTdGF0TW9kZWxQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IEN2QkdQaXhlbENTdGF0VGFibGUKK3sKKyAgICBmbG9hdCAgICAgICAgICBQdiwgUHZiOworICAgIHVjaGFyICAgICAgICAgIHZbM107Cit9CitDdkJHUGl4ZWxDU3RhdFRhYmxlOworCit0eXBlZGVmIHN0cnVjdCBDdkJHUGl4ZWxDQ1N0YXRUYWJsZQoreworICAgIGZsb2F0ICAgICAgICAgIFB2LCBQdmI7CisgICAgdWNoYXIgICAgICAgICAgdls2XTsKK30KK0N2QkdQaXhlbENDU3RhdFRhYmxlOworCit0eXBlZGVmIHN0cnVjdCBDdkJHUGl4ZWxTdGF0Cit7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIFBiYzsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgUGJjYzsKKyAgICBDdkJHUGl4ZWxDU3RhdFRhYmxlKiAgY3RhYmxlOworICAgIEN2QkdQaXhlbENDU3RhdFRhYmxlKiBjY3RhYmxlOworICAgIHVjaGFyICAgICAgICAgICAgICAgICBpc190cmFpbmVkX3N0X21vZGVsOworICAgIHVjaGFyICAgICAgICAgICAgICAgICBpc190cmFpbmVkX2R5bl9tb2RlbDsKK30KK0N2QkdQaXhlbFN0YXQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZGR0RTdGF0TW9kZWwKK3sKKyAgICBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpOworICAgIEN2QkdQaXhlbFN0YXQqICAgICAgICAgcGl4ZWxfc3RhdDsKKyAgICBJcGxJbWFnZSogICAgICAgICAgICAgIEZ0ZDsKKyAgICBJcGxJbWFnZSogICAgICAgICAgICAgIEZiZDsKKyAgICBJcGxJbWFnZSogICAgICAgICAgICAgIHByZXZfZnJhbWU7CisgICAgQ3ZGR0RTdGF0TW9kZWxQYXJhbXMgICBwYXJhbXM7Cit9CitDdkZHRFN0YXRNb2RlbDsKKworLyogQ3JlYXRlcyBGR0QgbW9kZWwgKi8KK0NWQVBJKEN2QkdTdGF0TW9kZWwqKSBjdkNyZWF0ZUZHRFN0YXRNb2RlbCggSXBsSW1hZ2UqIGZpcnN0X2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICBDdkZHRFN0YXRNb2RlbFBhcmFtcyogcGFyYW1ldGVycyBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogCisgICBJbnRlcmZhY2Ugb2YgR2F1c3NpYW4gbWl4dHVyZSBhbGdvcml0aG0KKworICAgIkFuIGltcHJvdmVkIGFkYXB0aXZlIGJhY2tncm91bmQgbWl4dHVyZSBtb2RlbCBmb3IgcmVhbC10aW1lIHRyYWNraW5nIHdpdGggc2hhZG93IGRldGVjdGlvbiIKKyAgIFAuIEthZGV3VHJhS3VQb25nIGFuZCBSLiBCb3dkZW4sCisgICBQcm9jLiAybmQgRXVyb3BlYW4gV29ya3NocCBvbiBBZHZhbmNlZCBWaWRlby1CYXNlZCBTdXJ2ZWlsbGFuY2UgU3lzdGVtcywgMjAwMS4iCisgICBodHRwOi8vcGVyc29uYWwuZWUuc3VycmV5LmFjLnVrL1BlcnNvbmFsL1IuQm93ZGVuL3B1YmxpY2F0aW9ucy9hdmJzMDEvYXZiczAxLnBkZgorKi8KKworLyogTm90ZTogICJNT0ciID09ICJNaXh0dXJlIE9mIEdhdXNzaWFucyI6ICovCisKKyNkZWZpbmUgQ1ZfQkdGR19NT0dfTUFYX05HQVVTU0lBTlMgNTAwCisKKy8qIGRlZmF1bHQgcGFyYW1ldGVycyBvZiBnYXVzc2lhbiBiYWNrZ3JvdW5kIGRldGVjdGlvbiBhbGdvcml0aG0gKi8KKyNkZWZpbmUgQ1ZfQkdGR19NT0dfQkFDS0dST1VORF9USFJFU0hPTEQgICAgIDAuNyAgICAgLyogdGhyZXNob2xkIHN1bSBvZiB3ZWlnaHRzIGZvciBiYWNrZ3JvdW5kIHRlc3QgKi8KKyNkZWZpbmUgQ1ZfQkdGR19NT0dfU1REX1RIUkVTSE9MRCAgICAgICAgICAgIDIuNSAgICAgLyogbGFtYmRhPTIuNSBpcyA5OSUgKi8KKyNkZWZpbmUgQ1ZfQkdGR19NT0dfV0lORE9XX1NJWkUgICAgICAgICAgICAgIDIwMCAgICAgLyogTGVhcm5pbmcgcmF0ZTsgYWxwaGEgPSAxL0NWX0dCR19XSU5ET1dfU0laRSAqLworI2RlZmluZSBDVl9CR0ZHX01PR19OR0FVU1NJQU5TICAgICAgICAgICAgICAgNSAgICAgICAvKiA9IEsgPSBudW1iZXIgb2YgR2F1c3NpYW5zIGluIG1peHR1cmUgKi8KKyNkZWZpbmUgQ1ZfQkdGR19NT0dfV0VJR0hUX0lOSVQgICAgICAgICAgICAgIDAuMDUKKyNkZWZpbmUgQ1ZfQkdGR19NT0dfU0lHTUFfSU5JVCAgICAgICAgICAgICAgIDMwCisjZGVmaW5lIENWX0JHRkdfTU9HX01JTkFSRUEgICAgICAgICAgICAgICAgICAxNS5mCisKKworI2RlZmluZSBDVl9CR0ZHX01PR19OQ09MT1JTICAgICAgICAgICAgICAgICAgMworCit0eXBlZGVmIHN0cnVjdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMKK3sgICAgCisgICAgaW50ICAgICB3aW5fc2l6ZTsgICAgICAgICAgICAgICAvKiA9IDEvYWxwaGEgKi8KKyAgICBpbnQgICAgIG5fZ2F1c3M7CisgICAgZG91YmxlICBiZ190aHJlc2hvbGQsIHN0ZF90aHJlc2hvbGQsIG1pbkFyZWE7CisgICAgZG91YmxlICB3ZWlnaHRfaW5pdCwgdmFyaWFuY2VfaW5pdDsKK31DdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IEN2R2F1c3NCR1ZhbHVlcworeworICAgIGludCAgICAgICAgIG1hdGNoX3N1bTsKKyAgICBkb3VibGUgICAgICB3ZWlnaHQ7CisgICAgZG91YmxlICAgICAgdmFyaWFuY2VbQ1ZfQkdGR19NT0dfTkNPTE9SU107CisgICAgZG91YmxlICAgICAgbWVhbltDVl9CR0ZHX01PR19OQ09MT1JTXTsKK30KK0N2R2F1c3NCR1ZhbHVlczsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHYXVzc0JHUG9pbnQKK3sKKyAgICBDdkdhdXNzQkdWYWx1ZXMqIGdfdmFsdWVzOworfQorQ3ZHYXVzc0JHUG9pbnQ7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHYXVzc0JHTW9kZWwKK3sKKyAgICBDVl9CR19TVEFUX01PREVMX0ZJRUxEUygpOworICAgIEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAgIHBhcmFtczsgICAgCisgICAgQ3ZHYXVzc0JHUG9pbnQqICAgICAgICAgICAgZ19wb2ludDsgICAgCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgY291bnRGcmFtZXM7Cit9CitDdkdhdXNzQkdNb2RlbDsKKworCisvKiBDcmVhdGVzIEdhdXNzaWFuIG1peHR1cmUgYmFja2dyb3VuZCBtb2RlbCAqLworQ1ZBUEkoQ3ZCR1N0YXRNb2RlbCopIGN2Q3JlYXRlR2F1c3NpYW5CR01vZGVsKCBJcGxJbWFnZSogZmlyc3RfZnJhbWUsCisgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zKiBwYXJhbWV0ZXJzIENWX0RFRkFVTFQoTlVMTCkpOworCisKK3R5cGVkZWYgc3RydWN0IEN2QkdDb2RlQm9va0VsZW0KK3sKKyAgICBzdHJ1Y3QgQ3ZCR0NvZGVCb29rRWxlbSogbmV4dDsKKyAgICBpbnQgdExhc3RVcGRhdGU7CisgICAgaW50IHN0YWxlOworICAgIHVjaGFyIGJveE1pblszXTsKKyAgICB1Y2hhciBib3hNYXhbM107CisgICAgdWNoYXIgbGVhcm5NaW5bM107CisgICAgdWNoYXIgbGVhcm5NYXhbM107Cit9CitDdkJHQ29kZUJvb2tFbGVtOworCit0eXBlZGVmIHN0cnVjdCBDdkJHQ29kZUJvb2tNb2RlbAoreworICAgIEN2U2l6ZSBzaXplOworICAgIGludCB0OworICAgIHVjaGFyIGNiQm91bmRzWzNdOworICAgIHVjaGFyIG1vZE1pblszXTsKKyAgICB1Y2hhciBtb2RNYXhbM107CisgICAgQ3ZCR0NvZGVCb29rRWxlbSoqIGNibWFwOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZTsKKyAgICBDdkJHQ29kZUJvb2tFbGVtKiBmcmVlTGlzdDsKK30KK0N2QkdDb2RlQm9va01vZGVsOworCitDVkFQSShDdkJHQ29kZUJvb2tNb2RlbCopIGN2Q3JlYXRlQkdDb2RlQm9va01vZGVsKCk7CitDVkFQSSh2b2lkKSBjdlJlbGVhc2VCR0NvZGVCb29rTW9kZWwoIEN2QkdDb2RlQm9va01vZGVsKiogbW9kZWwgKTsKKworQ1ZBUEkodm9pZCkgY3ZCR0NvZGVCb29rVXBkYXRlKCBDdkJHQ29kZUJvb2tNb2RlbCogbW9kZWwsIGNvbnN0IEN2QXJyKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHJvaSBDVl9ERUZBVUxUKGN2UmVjdCgwLDAsMCwwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoMCkgKTsKKworQ1ZBUEkoaW50KSBjdkJHQ29kZUJvb2tEaWZmKCBjb25zdCBDdkJHQ29kZUJvb2tNb2RlbCogbW9kZWwsIGNvbnN0IEN2QXJyKiBpbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGZnbWFzaywgQ3ZSZWN0IHJvaSBDVl9ERUZBVUxUKGN2UmVjdCgwLDAsMCwwKSkgKTsKKworQ1ZBUEkodm9pZCkgY3ZCR0NvZGVCb29rQ2xlYXJTdGFsZSggQ3ZCR0NvZGVCb29rTW9kZWwqIG1vZGVsLCBpbnQgc3RhbGVUaHJlc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3Qgcm9pIENWX0RFRkFVTFQoY3ZSZWN0KDAsMCwwLDApKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoMCkgKTsKKworQ1ZBUEkoQ3ZTZXEqKSBjdlNlZ21lbnRGR01hc2soIEN2QXJyICpmZ21hc2ssIGludCBwb2x5MUh1bGwwIENWX0RFRkFVTFQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcGVyaW1TY2FsZSBDVl9ERUZBVUxUKDQuZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBvZmZzZXQgQ1ZfREVGQVVMVChjdlBvaW50KDAsMCkpKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsaWJyYXRpb24gZW5naW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBlbnVtIEN2Q2FsaWJFdGFsb25UeXBlCit7CisgICAgQ1ZfQ0FMSUJfRVRBTE9OX1VTRVIgPSAtMSwKKyAgICBDVl9DQUxJQl9FVEFMT05fQ0hFU1NCT0FSRCA9IDAsCisgICAgQ1ZfQ0FMSUJfRVRBTE9OX0NIRUNLRVJCT0FSRCA9IENWX0NBTElCX0VUQUxPTl9DSEVTU0JPQVJECit9CitDdkNhbGliRXRhbG9uVHlwZTsKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdkNhbGliRmlsdGVyCit7CitwdWJsaWM6CisgICAgLyogQ29uc3RydWN0b3IgJiBkZXN0cnVjdG9yICovCisgICAgQ3ZDYWxpYkZpbHRlcigpOworICAgIHZpcnR1YWwgfkN2Q2FsaWJGaWx0ZXIoKTsKKworICAgIC8qIFNldHMgZXRhbG9uIHR5cGUgLSBvbmUgZm9yIGFsbCBjYW1lcmFzLgorICAgICAgIGV0YWxvblBhcmFtcyBpcyB1c2VkIGluIGNhc2Ugb2YgcHJlLWRlZmluZWQgZXRhbG9ucyAoc3VjaCBhcyBjaGVzc2JvYXJkKS4KKyAgICAgICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gZXRhbG9uUGFyYW1zIGlzIGRldGVybWluZWQgYnkgZXRhbG9uVHlwZS4KKyAgICAgICBFLmcuLCBpZiBldGFsb24gdHlwZSBpcyBDVl9FVEFMT05fVFlQRV9DSEVTU0JPQVJEIHRoZW46CisgICAgICAgICBldGFsb25QYXJhbXNbMF0gaXMgbnVtYmVyIG9mIHNxdWFyZXMgcGVyIG9uZSBzaWRlIG9mIGV0YWxvbgorICAgICAgICAgZXRhbG9uUGFyYW1zWzFdIGlzIG51bWJlciBvZiBzcXVhcmVzIHBlciBhbm90aGVyIHNpZGUgb2YgZXRhbG9uCisgICAgICAgICBldGFsb25QYXJhbXNbMl0gaXMgbGluZWFyIHNpemUgb2Ygc3F1YXJlcyBpbiB0aGUgYm9hcmQgaW4gYXJiaXRyYXJ5IHVuaXRzLgorICAgICAgIHBvaW50Q291bnQgJiBwb2ludHMgYXJlIHVzZWQgaW4gY2FzZSBvZgorICAgICAgIENWX0NBTElCX0VUQUxPTl9VU0VSICh1c2VyLWRlZmluZWQpIGV0YWxvbi4gKi8KKyAgICB2aXJ0dWFsIGJvb2wKKyAgICAgICAgU2V0RXRhbG9uKCBDdkNhbGliRXRhbG9uVHlwZSBldGFsb25UeXBlLCBkb3VibGUqIGV0YWxvblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBpbnQgcG9pbnRDb3VudCA9IDAsIEN2UG9pbnQyRDMyZiogcG9pbnRzID0gMCApOworCisgICAgLyogUmV0cmlldmVzIGV0YWxvbiBwYXJhbWV0ZXJzL29yIGFuZCBwb2ludHMgKi8KKyAgICB2aXJ0dWFsIEN2Q2FsaWJFdGFsb25UeXBlCisgICAgICAgIEdldEV0YWxvbiggaW50KiBwYXJhbUNvdW50ID0gMCwgY29uc3QgZG91YmxlKiogZXRhbG9uUGFyYW1zID0gMCwKKyAgICAgICAgICAgICAgICAgICBpbnQqIHBvaW50Q291bnQgPSAwLCBjb25zdCBDdlBvaW50MkQzMmYqKiBldGFsb25Qb2ludHMgPSAwICkgY29uc3Q7CisKKyAgICAvKiBTZXRzIG51bWJlciBvZiBjYW1lcmFzIGNhbGlicmF0ZWQgc2ltdWx0YW5lb3VzbHkuIEl0IGlzIGVxdWFsIHRvIDEgaW5pdGlhbGx5ICovCisgICAgdmlydHVhbCB2b2lkIFNldENhbWVyYUNvdW50KCBpbnQgY2FtZXJhQ291bnQgKTsKKworICAgIC8qIFJldHJpZXZlcyBudW1iZXIgb2YgY2FtZXJhcyAqLworICAgIGludCBHZXRDYW1lcmFDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGNhbWVyYUNvdW50OyB9CisKKyAgICAvKiBTdGFydHMgY2FtZXJhcyBjYWxpYnJhdGlvbiAqLworICAgIHZpcnR1YWwgYm9vbCBTZXRGcmFtZXMoIGludCB0b3RhbEZyYW1lcyApOworICAgIAorICAgIC8qIFN0b3BzIGNhbWVyYXMgY2FsaWJyYXRpb24gKi8KKyAgICB2aXJ0dWFsIHZvaWQgU3RvcCggYm9vbCBjYWxpYnJhdGUgPSBmYWxzZSApOworCisgICAgLyogUmV0cmlldmVzIG51bWJlciBvZiBjYW1lcmFzICovCisgICAgYm9vbCBJc0NhbGlicmF0ZWQoKSBjb25zdCB7IHJldHVybiBpc0NhbGlicmF0ZWQ7IH0KKworICAgIC8qIEZlZWRzIGFub3RoZXIgc2VyaWUgb2Ygc25hcHNob3RzIChvbmUgcGVyIGVhY2ggY2FtZXJhKSB0byBmaWx0ZXIuCisgICAgICAgRXRhbG9uIHBvaW50cyBvbiB0aGVzZSBpbWFnZXMgYXJlIGZvdW5kIGF1dG9tYXRpY2FsbHkuCisgICAgICAgSWYgdGhlIGZ1bmN0aW9uIGNhbid0IGxvY2F0ZSBwb2ludHMsIGl0IHJldHVybnMgZmFsc2UgKi8KKyAgICB2aXJ0dWFsIGJvb2wgRmluZEV0YWxvbiggSXBsSW1hZ2UqKiBpbWdzICk7CisKKyAgICAvKiBUaGUgc2FtZSBidXQgdGFrZXMgbWF0cmljZXMgKi8KKyAgICB2aXJ0dWFsIGJvb2wgRmluZEV0YWxvbiggQ3ZNYXQqKiBpbWdzICk7CisKKyAgICAvKiBMb3dlci1sZXZlbCBmdW5jdGlvbiBmb3IgZmVlZGluZyBmaWx0ZXIgd2l0aCBhbHJlYWR5IGZvdW5kIGV0YWxvbiBwb2ludHMuCisgICAgICAgQXJyYXkgb2YgcG9pbnQgYXJyYXlzIGZvciBlYWNoIGNhbWVyYSBpcyBwYXNzZWQuICovCisgICAgdmlydHVhbCBib29sIFB1c2goIGNvbnN0IEN2UG9pbnQyRDMyZioqIHBvaW50cyA9IDAgKTsKKworICAgIC8qIFJldHVybnMgdG90YWwgbnVtYmVyIG9mIGFjY2VwdGVkIGZyYW1lcyBhbmQsIG9wdGlvbmFsbHksCisgICAgICAgdG90YWwgbnVtYmVyIG9mIGZyYW1lcyB0byBjb2xsZWN0ICovCisgICAgdmlydHVhbCBpbnQgR2V0RnJhbWVDb3VudCggaW50KiBmcmFtZXNUb3RhbCA9IDAgKSBjb25zdDsKKworICAgIC8qIFJldHJpZXZlcyBjYW1lcmEgcGFyYW1ldGVycyBmb3Igc3BlY2lmaWVkIGNhbWVyYS4KKyAgICAgICBJZiBjYW1lcmEgaXMgbm90IGNhbGlicmF0ZWQgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCAqLworICAgIHZpcnR1YWwgY29uc3QgQ3ZDYW1lcmEqIEdldENhbWVyYVBhcmFtcyggaW50IGlkeCA9IDAgKSBjb25zdDsKKworICAgIHZpcnR1YWwgY29uc3QgQ3ZTdGVyZW9DYW1lcmEqIEdldFN0ZXJlb1BhcmFtcygpIGNvbnN0OworCisgICAgLyogU2V0cyBjYW1lcmEgcGFyYW1ldGVycyBmb3IgYWxsIGNhbWVyYXMgKi8KKyAgICB2aXJ0dWFsIGJvb2wgU2V0Q2FtZXJhUGFyYW1zKCBDdkNhbWVyYSogcGFyYW1zICk7CisKKyAgICAvKiBTYXZlcyBhbGwgY2FtZXJhIHBhcmFtZXRlcnMgdG8gZmlsZSAqLworICAgIHZpcnR1YWwgYm9vbCBTYXZlQ2FtZXJhUGFyYW1zKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIAorICAgIC8qIExvYWRzIGFsbCBjYW1lcmEgcGFyYW1ldGVycyBmcm9tIGZpbGUgKi8KKyAgICB2aXJ0dWFsIGJvb2wgTG9hZENhbWVyYVBhcmFtcyggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKworICAgIC8qIFVuZGlzdG9ydHMgaW1hZ2VzIHVzaW5nIGNhbWVyYSBwYXJhbWV0ZXJzLiBTb21lIG9mIHNyYyBwb2ludGVycyBjYW4gYmUgTlVMTC4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgVW5kaXN0b3J0KCBJcGxJbWFnZSoqIHNyYywgSXBsSW1hZ2UqKiBkc3QgKTsKKworICAgIC8qIFVuZGlzdG9ydHMgaW1hZ2VzIHVzaW5nIGNhbWVyYSBwYXJhbWV0ZXJzLiBTb21lIG9mIHNyYyBwb2ludGVycyBjYW4gYmUgTlVMTC4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgVW5kaXN0b3J0KCBDdk1hdCoqIHNyYywgQ3ZNYXQqKiBkc3QgKTsKKworICAgIC8qIFJldHVybnMgYXJyYXkgb2YgZXRhbG9uIHBvaW50cyBkZXRlY3RlZC9wYXJ0YWxseSBkZXRlY3RlZAorICAgICAgIG9uIHRoZSBsYXRlc3QgZnJhbWUgZm9yIGlkeC10aCBjYW1lcmEgKi8KKyAgICB2aXJ0dWFsIGJvb2wgR2V0TGF0ZXN0UG9pbnRzKCBpbnQgaWR4LCBDdlBvaW50MkQzMmYqKiBwdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogY291bnQsIGJvb2wqIGZvdW5kICk7CisKKyAgICAvKiBEcmF3IHRoZSBsYXRlc3QgZGV0ZWN0ZWQvcGFydGlhbGx5IGRldGVjdGVkIGV0YWxvbiAqLworICAgIHZpcnR1YWwgdm9pZCBEcmF3UG9pbnRzKCBJcGxJbWFnZSoqIGRzdCApOworCisgICAgLyogRHJhdyB0aGUgbGF0ZXN0IGRldGVjdGVkL3BhcnRpYWxseSBkZXRlY3RlZCBldGFsb24gKi8KKyAgICB2aXJ0dWFsIHZvaWQgRHJhd1BvaW50cyggQ3ZNYXQqKiBkc3QgKTsKKworICAgIHZpcnR1YWwgYm9vbCBSZWN0aWZ5KCBJcGxJbWFnZSoqIHNyY2FyciwgSXBsSW1hZ2UqKiBkc3RhcnIgKTsKKyAgICB2aXJ0dWFsIGJvb2wgUmVjdGlmeSggQ3ZNYXQqKiBzcmNhcnIsIEN2TWF0KiogZHN0YXJyICk7CisKK3Byb3RlY3RlZDoKKworICAgIGVudW0geyBNQVhfQ0FNRVJBUyA9IDMgfTsKKworICAgIC8qIGV0YWxvbiBkYXRhICovCisgICAgQ3ZDYWxpYkV0YWxvblR5cGUgIGV0YWxvblR5cGU7CisgICAgaW50ICAgICBldGFsb25QYXJhbUNvdW50OworICAgIGRvdWJsZSogZXRhbG9uUGFyYW1zOworICAgIGludCAgICAgZXRhbG9uUG9pbnRDb3VudDsKKyAgICBDdlBvaW50MkQzMmYqIGV0YWxvblBvaW50czsKKyAgICBDdlNpemUgIGltZ1NpemU7CisgICAgQ3ZNYXQqICBncmF5SW1nOworICAgIEN2TWF0KiAgdGVtcEltZzsKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2U7CisKKyAgICAvKiBjYW1lcmEgZGF0YSAqLworICAgIGludCAgICAgY2FtZXJhQ291bnQ7CisgICAgQ3ZDYW1lcmEgY2FtZXJhUGFyYW1zW01BWF9DQU1FUkFTXTsKKyAgICBDdlN0ZXJlb0NhbWVyYSBzdGVyZW87CisgICAgQ3ZQb2ludDJEMzJmKiBwb2ludHNbTUFYX0NBTUVSQVNdOworICAgIEN2TWF0KiAgdW5kaXN0TWFwW01BWF9DQU1FUkFTXVsyXTsKKyAgICBDdk1hdCogIHVuZGlzdEltZzsKKyAgICBpbnQgICAgIGxhdGVzdENvdW50c1tNQVhfQ0FNRVJBU107CisgICAgQ3ZQb2ludDJEMzJmKiBsYXRlc3RQb2ludHNbTUFYX0NBTUVSQVNdOworICAgIEN2TWF0KiAgcmVjdE1hcFtNQVhfQ0FNRVJBU11bMl07CisKKyAgICAvKiBBZGRlZCBieSBWYWxlcnkgKi8KKyAgICAvL0N2U3RlcmVvQ2FtZXJhIHN0ZXJlb1BhcmFtczsKKworICAgIGludCAgICAgbWF4UG9pbnRzOworICAgIGludCAgICAgZnJhbWVzVG90YWw7CisgICAgaW50ICAgICBmcmFtZXNBY2NlcHRlZDsKKyAgICBib29sICAgIGlzQ2FsaWJyYXRlZDsKK307CisKKyNpbmNsdWRlICJjdmF1eC5ocHAiCisjaW5jbHVkZSAiY3Z2aWRzdXJ2LmhwcCIKKy8qI2luY2x1ZGUgImN2bWF0LmhwcCIqLworI2VuZGlmCisKKyNlbmRpZgorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2YXV4L2luY2x1ZGUvY3ZhdXguaHBwIGIvY3ZhdXgvaW5jbHVkZS9jdmF1eC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhZTg5NwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L2luY2x1ZGUvY3ZhdXguaHBwCkBAIC0wLDAgKzEsMTQ0IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfX0NWQVVYX0hQUF9fCisjZGVmaW5lIF9fQ1ZBVVhfSFBQX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgY2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY2xhc3MgQ1ZfRVhQT1JUUyBDdkNhbVNoaWZ0VHJhY2tlcgoreworcHVibGljOgorICAgIAorICAgIEN2Q2FtU2hpZnRUcmFja2VyKCk7CisgICAgdmlydHVhbCB+Q3ZDYW1TaGlmdFRyYWNrZXIoKTsKKyAgICAKKyAgICAvKioqKiBDaGFyYWN0ZXJpc3RpY3Mgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBjYWxjdWxhdGVkIGJ5IHRyYWNrX29iamVjdCBtZXRob2QgKioqKiovCisgICAgZmxvYXQgICBnZXRfb3JpZW50YXRpb24oKSBjb25zdCAvLyBvcmllbnRhdGlvbiBvZiB0aGUgb2JqZWN0IGluIGRlZ3JlZXMgCisgICAgeyByZXR1cm4gbV9ib3guYW5nbGU7IH0KKyAgICBmbG9hdCAgIGdldF9sZW5ndGgoKSBjb25zdCAvLyB0aGUgbGFyZ2VyIGxpbmVhciBzaXplIG9mIHRoZSBvYmplY3QKKyAgICB7IHJldHVybiBtX2JveC5zaXplLmhlaWdodDsgfQorICAgIGZsb2F0ICAgZ2V0X3dpZHRoKCkgY29uc3QgLy8gdGhlIHNtYWxsZXIgbGluZWFyIHNpemUgb2YgdGhlIG9iamVjdAorICAgIHsgcmV0dXJuIG1fYm94LnNpemUud2lkdGg7IH0KKyAgICBDdlBvaW50MkQzMmYgZ2V0X2NlbnRlcigpIGNvbnN0IC8vIGNlbnRlciBvZiB0aGUgb2JqZWN0CisgICAgeyByZXR1cm4gbV9ib3guY2VudGVyOyB9CisgICAgQ3ZSZWN0IGdldF93aW5kb3coKSBjb25zdCAvLyBib3VuZGluZyByZWN0YW5nbGUgZm9yIHRoZSBvYmplY3QKKyAgICB7IHJldHVybiBtX2NvbXAucmVjdDsgfQorICAgIAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKiBUcmFja2luZyBwYXJhbWV0ZXJzICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbnQgICAgIGdldF90aHJlc2hvbGQoKSBjb25zdCAvLyB0aHJlc2hvbGRpbmcgdmFsdWUgdGhhdCBhcHBsaWVkIHRvIGJhY2sgcHJvamVjdAorICAgIHsgcmV0dXJuIG1fdGhyZXNob2xkOyB9CisKKyAgICBpbnQgICAgIGdldF9oaXN0X2RpbXMoIGludCogZGltcyA9IDAgKSBjb25zdCAvLyByZXR1cm5zIG51bWJlciBvZiBoaXN0b2dyYW0gZGltZW5zaW9ucyBhbmQgc2V0cworICAgIHsgcmV0dXJuIG1faGlzdCA/IGN2R2V0RGltcyggbV9oaXN0LT5iaW5zLCBkaW1zICkgOiAwOyB9IAorICAgIAorICAgIGludCAgICAgZ2V0X21pbl9jaF92YWwoIGludCBjaGFubmVsICkgY29uc3QgLy8gZ2V0IHRoZSBtaW5pbXVtIGFsbG93ZWQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCisgICAgeyByZXR1cm4gbV9taW5fY2hfdmFsW2NoYW5uZWxdOyB9CisgICAgCisgICAgaW50ICAgICBnZXRfbWF4X2NoX3ZhbCggaW50IGNoYW5uZWwgKSBjb25zdCAvLyBnZXQgdGhlIG1heGltdW0gYWxsb3dlZCB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIGNoYW5uZWwKKyAgICB7IHJldHVybiBtX21heF9jaF92YWxbY2hhbm5lbF07IH0KKyAgICAKKyAgICAvLyBzZXQgaW5pdGlhbCBvYmplY3QgcmVjdGFuZ2xlIChtdXN0IGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbCBjYWxjdWxhdGlvbiBvZiB0aGUgaGlzdG9ncmFtKQorICAgIGJvb2wgICAgc2V0X3dpbmRvdyggQ3ZSZWN0IHdpbmRvdykKKyAgICB7IG1fY29tcC5yZWN0ID0gd2luZG93OyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGJvb2wgICAgc2V0X3RocmVzaG9sZCggaW50IHRocmVzaG9sZCApIC8vIHRocmVzaG9sZCBhcHBsaWVkIHRvIHRoZSBoaXN0b2dyYW0gYmlucworICAgIHsgbV90aHJlc2hvbGQgPSB0aHJlc2hvbGQ7IHJldHVybiB0cnVlOyB9CisKKyAgICBib29sICAgIHNldF9oaXN0X2Jpbl9yYW5nZSggaW50IGRpbSwgaW50IG1pbl92YWwsIGludCBtYXhfdmFsICk7CisKKyAgICBib29sICAgIHNldF9oaXN0X2RpbXMoIGludCBjX2RpbXMsIGludCogZGltcyApOy8vIHNldCB0aGUgaGlzdG9ncmFtIHBhcmFtZXRlcnMKKyAgICAKKyAgICBib29sICAgIHNldF9taW5fY2hfdmFsKCBpbnQgY2hhbm5lbCwgaW50IHZhbCApIC8vIHNldCB0aGUgbWluaW11bSBhbGxvd2VkIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAorICAgIHsgbV9taW5fY2hfdmFsW2NoYW5uZWxdID0gdmFsOyByZXR1cm4gdHJ1ZTsgfQorICAgIGJvb2wgICAgc2V0X21heF9jaF92YWwoIGludCBjaGFubmVsLCBpbnQgdmFsICkgLy8gc2V0IHRoZSBtYXhpbXVtIGFsbG93ZWQgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCisgICAgeyBtX21heF9jaF92YWxbY2hhbm5lbF0gPSB2YWw7IHJldHVybiB0cnVlOyB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqIFRoZSBwcm9jZXNzaW5nIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8vIHVwZGF0ZSBvYmplY3QgcG9zaXRpb24KKyAgICB2aXJ0dWFsIGJvb2wgIHRyYWNrX29iamVjdCggY29uc3QgSXBsSW1hZ2UqIGN1cl9mcmFtZSApOworICAgIAorICAgIC8vIHVwZGF0ZSBvYmplY3QgaGlzdG9ncmFtCisgICAgdmlydHVhbCBib29sICB1cGRhdGVfaGlzdG9ncmFtKCBjb25zdCBJcGxJbWFnZSogY3VyX2ZyYW1lICk7CisKKyAgICAvLyByZXNldCBoaXN0b2dyYW0KKyAgICB2aXJ0dWFsIHZvaWQgIHJlc2V0X2hpc3RvZ3JhbSgpOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiBSZXRyaWV2aW5nIGludGVybmFsIGRhdGEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBnZXQgYmFjayBwcm9qZWN0IGltYWdlCisgICAgdmlydHVhbCBJcGxJbWFnZSogZ2V0X2JhY2tfcHJvamVjdCgpCisgICAgeyByZXR1cm4gbV9iYWNrX3Byb2plY3Q7IH0KKworICAgIGZsb2F0IHF1ZXJ5KCBpbnQqIGJpbiApIGNvbnN0CisgICAgeyByZXR1cm4gbV9oaXN0ID8gKGZsb2F0KWN2R2V0UmVhbE5EKG1faGlzdC0+YmlucywgYmluKSA6IDAuZjsgfQorICAgIAorcHJvdGVjdGVkOgorCisgICAgLy8gaW50ZXJuYWwgbWV0aG9kIGZvciBjb2xvciBjb252ZXJzaW9uOiBmaWxscyBtX2NvbG9yX3BsYW5lcyBncm91cAorICAgIHZpcnR1YWwgdm9pZCBjb2xvcl90cmFuc2Zvcm0oIGNvbnN0IElwbEltYWdlKiBpbWcgKTsgCisKKyAgICBDdkhpc3RvZ3JhbSogbV9oaXN0OworCisgICAgQ3ZCb3gyRCAgICBtX2JveDsKKyAgICBDdkNvbm5lY3RlZENvbXAgbV9jb21wOworCisgICAgZmxvYXQgICAgICBtX2hpc3RfcmFuZ2VzX2RhdGFbQ1ZfTUFYX0RJTV1bMl07CisgICAgZmxvYXQqICAgICBtX2hpc3RfcmFuZ2VzW0NWX01BWF9ESU1dOworCisgICAgaW50ICAgICAgICBtX21pbl9jaF92YWxbQ1ZfTUFYX0RJTV07CisgICAgaW50ICAgICAgICBtX21heF9jaF92YWxbQ1ZfTUFYX0RJTV07CisgICAgaW50ICAgICAgICBtX3RocmVzaG9sZDsKKworICAgIElwbEltYWdlKiAgbV9jb2xvcl9wbGFuZXNbQ1ZfTUFYX0RJTV07CisgICAgSXBsSW1hZ2UqICBtX2JhY2tfcHJvamVjdDsKKyAgICBJcGxJbWFnZSogIG1fdGVtcDsKKyAgICBJcGxJbWFnZSogIG1fbWFzazsKK307CisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX19DVkFVWF9IUFBfXyAqLworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2YXV4L2luY2x1ZGUvY3ZtYXQuaHBwIGIvY3ZhdXgvaW5jbHVkZS9jdm1hdC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRlZmI1OQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L2luY2x1ZGUvY3ZtYXQuaHBwCkBAIC0wLDAgKzEsMjMyNiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NWTUFUX0hQUF8KKyNkZWZpbmUgX0NWTUFUX0hQUF8KKworI2lmIDAgJiYgKGRlZmluZWQgX19jcGx1c3BsdXMgJiYgKF9NU0NfVkVSPj0xMjAwIHx8IGRlZmluZWQgX19CT1JMQU5EQ19fIHx8IGRlZmluZWQgX19HTlVDX18pKQorCisjaWYgX01TQ19WRVIgPj0gMTIwMAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0NzEwICkgLyogc3VwcHJlc3MgImZ1bmN0aW9uIC4uLiBpcyBub3QgaW5saW5lZCIgKi8KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI3VuZGVmIG1pbgorI3VuZGVmIG1heAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQysrIC0gbGlrZSBvcGVyYXRpb25zIG9uIEN2U2NhbGFyICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2lubGluZSBDdlNjYWxhciYgb3BlcmF0b3IgKz0gKCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIGRvdWJsZSB0MCA9IGEudmFsWzBdICsgYi52YWxbMF07CisgICAgZG91YmxlIHQxID0gYS52YWxbMV0gKyBiLnZhbFsxXTsKKyAgICBhLnZhbFswXSA9IHQwOworICAgIGEudmFsWzFdID0gdDE7CisKKyAgICB0MCA9IGEudmFsWzJdICsgYi52YWxbMl07CisgICAgdDEgPSBhLnZhbFszXSArIGIudmFsWzNdOworICAgIGEudmFsWzJdID0gdDA7CisgICAgYS52YWxbM10gPSB0MTsKKworICAgIHJldHVybiBhOworfQorCisKK2lubGluZSBDdlNjYWxhciYgb3BlcmF0b3IgLT0gKCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIGRvdWJsZSB0MCA9IGEudmFsWzBdIC0gYi52YWxbMF07CisgICAgZG91YmxlIHQxID0gYS52YWxbMV0gLSBiLnZhbFsxXTsKKyAgICBhLnZhbFswXSA9IHQwOworICAgIGEudmFsWzFdID0gdDE7CisKKyAgICB0MCA9IGEudmFsWzJdIC0gYi52YWxbMl07CisgICAgdDEgPSBhLnZhbFszXSAtIGIudmFsWzNdOworICAgIGEudmFsWzJdID0gdDA7CisgICAgYS52YWxbM10gPSB0MTsKKworICAgIHJldHVybiBhOworfQorCisKK2lubGluZSBDdlNjYWxhciYgb3BlcmF0b3IgKj0gKCBDdlNjYWxhciYgYSwgZG91YmxlIGIgKQoreworICAgIGRvdWJsZSB0MCA9IGEudmFsWzBdICogYjsKKyAgICBkb3VibGUgdDEgPSBhLnZhbFsxXSAqIGI7CisgICAgYS52YWxbMF0gPSB0MDsKKyAgICBhLnZhbFsxXSA9IHQxOworCisgICAgdDAgPSBhLnZhbFsyXSAqIGI7CisgICAgdDEgPSBhLnZhbFszXSAqIGI7CisgICAgYS52YWxbMl0gPSB0MDsKKyAgICBhLnZhbFszXSA9IHQxOworCisgICAgcmV0dXJuIGE7Cit9CisKKworaW5saW5lIEN2U2NhbGFyJiBvcGVyYXRvciAvPSAoIEN2U2NhbGFyJiBhLCBkb3VibGUgYiApCit7CisgICAgZG91YmxlIGludl9iID0gMS4vYjsKKyAgICBkb3VibGUgdDAgPSBhLnZhbFswXSAqIGludl9iOworICAgIGRvdWJsZSB0MSA9IGEudmFsWzFdICogaW52X2I7CisgICAgYS52YWxbMF0gPSB0MDsKKyAgICBhLnZhbFsxXSA9IHQxOworCisgICAgdDAgPSBhLnZhbFsyXSAqIGludl9iOworICAgIHQxID0gYS52YWxbM10gKiBpbnZfYjsKKyAgICBhLnZhbFsyXSA9IHQwOworICAgIGEudmFsWzNdID0gdDE7CisKKyAgICByZXR1cm4gYTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXImIG9wZXJhdG9yICo9ICggQ3ZTY2FsYXImIGEsIGNvbnN0IEN2U2NhbGFyJiBiICkKK3sKKyAgICBkb3VibGUgdDAgPSBhLnZhbFswXSpiLnZhbFswXSAtIGEudmFsWzFdKmIudmFsWzFdIC0KKyAgICAgICAgICAgICAgICBhLnZhbFsyXSpiLnZhbFsyXSAtIGEudmFsWzNdKmIudmFsWzNdOworCisgICAgZG91YmxlIHQxID0gYS52YWxbMF0qYi52YWxbMV0gKyBhLnZhbFsxXSpiLnZhbFswXSArCisgICAgICAgICAgICAgICAgYS52YWxbMl0qYi52YWxbM10gLSBhLnZhbFszXSpiLnZhbFsyXTsKKworICAgIGRvdWJsZSB0MiA9IGEudmFsWzBdKmIudmFsWzJdIC0gYS52YWxbMV0qYi52YWxbM10gKworICAgICAgICAgICAgICAgIGEudmFsWzJdKmIudmFsWzBdICsgYS52YWxbM10qYi52YWxbMV07CisKKyAgICBkb3VibGUgdDMgPSBhLnZhbFswXSpiLnZhbFszXSArIGEudmFsWzFdKmIudmFsWzJdIC0KKyAgICAgICAgICAgICAgICBhLnZhbFsyXSpiLnZhbFsxXSArIGEudmFsWzNdKmIudmFsWzBdOworCisgICAgYS52YWxbMF0gPSB0MDsKKyAgICBhLnZhbFsxXSA9IHQxOworICAgIGEudmFsWzJdID0gdDI7CisgICAgYS52YWxbM10gPSB0MzsKKworICAgIHJldHVybiBhOworfQorCisKK2lubGluZSBDdlNjYWxhciYgb3BlcmF0b3IgLz0gKCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIGRvdWJsZSBpbnZfZCA9IC0xLi8oYi52YWxbMF0qYi52YWxbMF0gKyBiLnZhbFsxXSpiLnZhbFsxXSArCisgICAgICAgICAgICAgICAgICAgICAgICBiLnZhbFsyXSpiLnZhbFsyXSArIGIudmFsWzNdKmIudmFsWzNdKTsKKyAgICByZXR1cm4gYSAqPSBjdlNjYWxhciggYi52YWxbMF0gKiAtaW52X2QsIGIudmFsWzFdICogaW52X2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGIudmFsWzJdICogaW52X2QsIGIudmFsWzNdICogaW52X2QgKTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXImIG9wZXJhdG9yICs9ICggQ3ZTY2FsYXImIGEsIGRvdWJsZSBiICkKK3sKKyAgICBhLnZhbFswXSArPSBiOworICAgIHJldHVybiBhOworfQorCisKK2lubGluZSBDdlNjYWxhciYgb3BlcmF0b3IgLT0gKCBDdlNjYWxhciYgYSwgZG91YmxlIGIgKQoreworICAgIGEudmFsWzBdIC09IGI7CisgICAgcmV0dXJuIGE7Cit9CisKKworaW5saW5lIEN2U2NhbGFyIG9wZXJhdG9yICsgKCBjb25zdCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIHJldHVybiBjdlNjYWxhciggYS52YWxbMF0gKyBiLnZhbFswXSwgYS52YWxbMV0gKyBiLnZhbFsxXSwKKyAgICAgICAgICAgICAgICAgICAgIGEudmFsWzJdICsgYi52YWxbMl0sIGEudmFsWzNdICsgYi52YWxbM10gKTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXIgb3BlcmF0b3IgLSAoIGNvbnN0IEN2U2NhbGFyJiBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgcmV0dXJuIGN2U2NhbGFyKCBhLnZhbFswXSAtIGIudmFsWzBdLCBhLnZhbFsxXSAtIGIudmFsWzFdLAorICAgICAgICAgICAgICAgICAgICAgYS52YWxbMl0gLSBiLnZhbFsyXSwgYS52YWxbM10gLSBiLnZhbFszXSApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciArICggY29uc3QgQ3ZTY2FsYXImIGEsIGRvdWJsZSBiICkKK3sKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEudmFsWzBdICsgYiwgYS52YWxbMV0sIGEudmFsWzJdLCBhLnZhbFszXSApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciAtICggY29uc3QgQ3ZTY2FsYXImIGEsIGRvdWJsZSBiICkKK3sKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEudmFsWzBdIC0gYiwgYS52YWxbMV0sIGEudmFsWzJdLCBhLnZhbFszXSApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciArICggZG91YmxlIGEsIGNvbnN0IEN2U2NhbGFyJiBiICkKK3sKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEgKyBiLnZhbFswXSwgYi52YWxbMV0sIGIudmFsWzJdLCBiLnZhbFszXSApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciAtICggZG91YmxlIGEsIGNvbnN0IEN2U2NhbGFyJiBiICkKK3sKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEgLSBiLnZhbFswXSwgLWIudmFsWzFdLCAtYi52YWxbMl0sIC1iLnZhbFszXSApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciAtICggY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIHJldHVybiBjdlNjYWxhciggLWIudmFsWzBdLCAtYi52YWxbMV0sIC1iLnZhbFsyXSwgLWIudmFsWzNdICk7Cit9CisKKworaW5saW5lIEN2U2NhbGFyIG9wZXJhdG9yICogKCBjb25zdCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIEN2U2NhbGFyIGMgPSBhOworCisgICAgcmV0dXJuIChjICo9IGIpOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciAqICggY29uc3QgQ3ZTY2FsYXImIGEsIGRvdWJsZSBiICkKK3sKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEudmFsWzBdKmIsIGEudmFsWzFdKmIsIGEudmFsWzJdKmIsIGEudmFsWzNdKmIgKTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXIgb3BlcmF0b3IgKiAoIGRvdWJsZSBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgcmV0dXJuIGN2U2NhbGFyKCBiLnZhbFswXSphLCBiLnZhbFsxXSphLCBiLnZhbFsyXSphLCBiLnZhbFszXSphICk7Cit9CisKKworaW5saW5lIEN2U2NhbGFyIG9wZXJhdG9yIC8gKCBjb25zdCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIEN2U2NhbGFyIGMgPSBhOworICAgIHJldHVybiAoYyAvPSBiKTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXIgb3BlcmF0b3IgLyAoIGNvbnN0IEN2U2NhbGFyJiBhLCBkb3VibGUgYiApCit7CisgICAgZG91YmxlIGludl9iID0gMS4vYjsKKyAgICByZXR1cm4gY3ZTY2FsYXIoIGEudmFsWzBdKmludl9iLCBhLnZhbFsxXSppbnZfYiwKKyAgICAgICAgICAgICAgICAgICAgIGEudmFsWzJdKmludl9iLCBhLnZhbFszXSppbnZfYiApOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciAvICggZG91YmxlIGEsIGNvbnN0IEN2U2NhbGFyJiBiICkKK3sKKyAgICBkb3VibGUgaW52X2QgPSAtYS8oYi52YWxbMF0qYi52YWxbMF0gKyBiLnZhbFsxXSpiLnZhbFsxXSArCisgICAgICAgICAgICAgICAgICAgICAgIGIudmFsWzJdKmIudmFsWzJdICsgYi52YWxbM10qYi52YWxbM10pOworICAgIHJldHVybiBjdlNjYWxhciggYi52YWxbMF0gKiAtaW52X2QsIGIudmFsWzFdICogaW52X2QsCisgICAgICAgICAgICAgICAgICAgICBiLnZhbFsyXSAqIGludl9kLCBiLnZhbFszXSAqIGludl9kICk7Cit9CisKKworaW5saW5lIEN2U2NhbGFyJiBvcGVyYXRvciAmPSAoIEN2U2NhbGFyJiBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgaW50IHQwID0gY3ZSb3VuZChhLnZhbFswXSkgJiBjdlJvdW5kKGIudmFsWzBdKTsKKyAgICBpbnQgdDEgPSBjdlJvdW5kKGEudmFsWzFdKSAmIGN2Um91bmQoYi52YWxbMV0pOworICAgIGEudmFsWzBdID0gdDA7CisgICAgYS52YWxbMV0gPSB0MTsKKworICAgIHQwID0gY3ZSb3VuZChhLnZhbFsyXSkgJiBjdlJvdW5kKGIudmFsWzJdKTsKKyAgICB0MSA9IGN2Um91bmQoYS52YWxbM10pICYgY3ZSb3VuZChiLnZhbFszXSk7CisgICAgYS52YWxbMl0gPSB0MDsKKyAgICBhLnZhbFszXSA9IHQxOworCisgICAgcmV0dXJuIGE7Cit9CisKKworaW5saW5lIEN2U2NhbGFyJiBvcGVyYXRvciB8PSAoIEN2U2NhbGFyJiBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgaW50IHQwID0gY3ZSb3VuZChhLnZhbFswXSkgfCBjdlJvdW5kKGIudmFsWzBdKTsKKyAgICBpbnQgdDEgPSBjdlJvdW5kKGEudmFsWzFdKSB8IGN2Um91bmQoYi52YWxbMV0pOworICAgIGEudmFsWzBdID0gdDA7CisgICAgYS52YWxbMV0gPSB0MTsKKworICAgIHQwID0gY3ZSb3VuZChhLnZhbFsyXSkgfCBjdlJvdW5kKGIudmFsWzJdKTsKKyAgICB0MSA9IGN2Um91bmQoYS52YWxbM10pIHwgY3ZSb3VuZChiLnZhbFszXSk7CisgICAgYS52YWxbMl0gPSB0MDsKKyAgICBhLnZhbFszXSA9IHQxOworCisgICAgcmV0dXJuIGE7Cit9CisKKworaW5saW5lIEN2U2NhbGFyJiBvcGVyYXRvciBePSAoIEN2U2NhbGFyJiBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgaW50IHQwID0gY3ZSb3VuZChhLnZhbFswXSkgXiBjdlJvdW5kKGIudmFsWzBdKTsKKyAgICBpbnQgdDEgPSBjdlJvdW5kKGEudmFsWzFdKSBeIGN2Um91bmQoYi52YWxbMV0pOworICAgIGEudmFsWzBdID0gdDA7CisgICAgYS52YWxbMV0gPSB0MTsKKworICAgIHQwID0gY3ZSb3VuZChhLnZhbFsyXSkgXiBjdlJvdW5kKGIudmFsWzJdKTsKKyAgICB0MSA9IGN2Um91bmQoYS52YWxbM10pIF4gY3ZSb3VuZChiLnZhbFszXSk7CisgICAgYS52YWxbMl0gPSB0MDsKKyAgICBhLnZhbFszXSA9IHQxOworCisgICAgcmV0dXJuIGE7Cit9CisKKworaW5saW5lIEN2U2NhbGFyIG9wZXJhdG9yICYgKCBjb25zdCBDdlNjYWxhciYgYSwgY29uc3QgQ3ZTY2FsYXImIGIgKQoreworICAgIEN2U2NhbGFyIGMgPSBhOworICAgIHJldHVybiAoYyAmPSBiKTsKK30KKworCitpbmxpbmUgQ3ZTY2FsYXIgb3BlcmF0b3IgfCAoIGNvbnN0IEN2U2NhbGFyJiBhLCBjb25zdCBDdlNjYWxhciYgYiApCit7CisgICAgQ3ZTY2FsYXIgYyA9IGE7CisgICAgcmV0dXJuIChjIHw9IGIpOworfQorCisKK2lubGluZSBDdlNjYWxhciBvcGVyYXRvciBeICggY29uc3QgQ3ZTY2FsYXImIGEsIGNvbnN0IEN2U2NhbGFyJiBiICkKK3sKKyAgICBDdlNjYWxhciBjID0gYTsKKyAgICByZXR1cm4gKGMgXj0gYik7Cit9CisKKworaW5saW5lIEN2U2NhbGFyIG9wZXJhdG9yIH4gKCBjb25zdCBDdlNjYWxhciYgYSApCit7CisgICAgcmV0dXJuIGN2U2NhbGFyKCB+Y3ZSb3VuZChhLnZhbFswXSksIH5jdlJvdW5kKGEudmFsWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgIH5jdlJvdW5kKGEudmFsWzJdKSwgfmN2Um91bmQoYS52YWxbM10pKTsgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKysgTWF0cml4IENsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgIF9Ddk1BVENvbnN0RWxlbV87CitzdHJ1Y3QgIF9Ddk1BVEVsZW1fOworc3RydWN0ICBfQ3ZNQVRFbGVtQ25fOworCitzdHJ1Y3QgIF9Ddk1BVF9UXzsKK3N0cnVjdCAgX0N2TUFUX01VTF87CitzdHJ1Y3QgIF9Ddk1BVF9JTlZfOworc3RydWN0ICBfQ3ZNQVRfU0NBTEVfOworc3RydWN0ICBfQ3ZNQVRfU0NBTEVfU0hJRlRfOworc3RydWN0ICBfQ3ZNQVRfQUREXzsKK3N0cnVjdCAgX0N2TUFUX0FERF9FWF87CitzdHJ1Y3QgIF9Ddk1BVF9NVUxfQUREXzsKK3N0cnVjdCAgX0N2TUFUX0xPR0lDXzsKK3N0cnVjdCAgX0N2TUFUX1VOX0xPR0lDXzsKK3N0cnVjdCAgX0N2TUFUX05PVF87CitzdHJ1Y3QgIF9Ddk1BVF9DVlRfOworc3RydWN0ICBfQ3ZNQVRfQ09QWV87CitzdHJ1Y3QgIF9Ddk1BVF9ET1RfT1BfOworc3RydWN0ICBfQ3ZNQVRfU09MVkVfOworc3RydWN0ICBfQ3ZNQVRfQ01QXzsKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdk1BVCA6IHB1YmxpYyBDdk1hdAoreworcHJvdGVjdGVkOgorCitwdWJsaWM6CisgICAgLyogaGVscGVyIG1ldGhvZHMgZm9yIHJldHJpZXZpbmcvc2V0dGluZyBtYXRyaXggZWxlbWVudHMgKi8KKyAgICBzdGF0aWMgZG91YmxlIGdldCggY29uc3QgdWNoYXIqIHB0ciwgaW50IHR5cGUsIGludCBjb2kgPSAwICk7CisgICAgc3RhdGljIHZvaWQgc2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGNvaSwgZG91YmxlIGQgKTsKKyAgICBzdGF0aWMgdm9pZCBzZXQoIHVjaGFyKiBwdHIsIGludCB0eXBlLCBpbnQgY29pLCBpbnQgaSApOworICAgIHN0YXRpYyB2b2lkIHNldCggdWNoYXIqIHB0ciwgaW50IHR5cGUsIGRvdWJsZSBkICk7CisgICAgc3RhdGljIHZvaWQgc2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGkgKTsKKworICAgIC8qKioqKioqKioqKioqKioqKioqIGNvbnN0cnVjdG9ycyAqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBlbXB0eSAqLworICAgIGV4cGxpY2l0IEN2TUFUKCk7CisKKyAgICAvKiBjcmVhdGlvbiAqLworICAgIGV4cGxpY2l0IEN2TUFUKCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlLCB2b2lkKiBkYXRhLCBpbnQgc3RlcCA9IENWX0FVVE9TVEVQICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGludCByb3dzLCBpbnQgdHlwZSwgdm9pZCogZGF0YSwgaW50IHN0ZXAgPSBDVl9BVVRPU1RFUCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGludCByb3dzLCBpbnQgdHlwZSApOworICAgIAorICAgIC8qIGV4dHJhY3RpbmcgcGFydCBvZiBhbiBleGlzdGluZyBtYXRyaXggKi8KKyAgICBleHBsaWNpdCBDdk1BVCggY29uc3QgQ3ZNYXQmIG1hdCwgQ3ZSZWN0IHJlY3QgKTsgLyogc3VibWF0cml4ICovCisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IEN2TWF0JiBtYXQsIGludCBrLCBpbnQgaSApOyAvKiBzdWJtYXRyaXg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA9PSAwIC0gaS10aCByb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrID4gMCAtIGktdGggY29sdW1uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgayA8IDAgLSBpLXRoIGRpYWdvbmFsICovCisgICAgLyogY29weWluZyAqLworICAgIEN2TUFUKCBjb25zdCBDdk1hdCYgbWF0ICk7CisgICAgQ3ZNQVQoIGNvbnN0IEN2TUFUJiBtYXQgKTsKKyAgICBDdk1BVCggY29uc3QgSXBsSW1hZ2UmIGltZyApOworCisgICAgLyogQ3ZNQVQgYiA9IG9wKGExLGEyLC4uLikgKi8KKyAgICBleHBsaWNpdCBDdk1BVCggY29uc3QgX0N2TUFUX1RfJiBtYXRfdCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfSU5WXyYgaW52X21hdCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfQUREXyYgbWF0X2FkZCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfQUREX0VYXyYgbWF0X2FkZCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBzY2FsZV9tYXQgKTsKKyAgICBleHBsaWNpdCBDdk1BVCggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgc2NhbGVfc2hpZnRfbWF0ICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9NVUxfJiBtbXVsICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9NVUxfQUREXyYgbW11bGFkZCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfTE9HSUNfJiBtYXRfbG9naWMgKTsKKyAgICBleHBsaWNpdCBDdk1BVCggY29uc3QgX0N2TUFUX1VOX0xPR0lDXyYgbWF0X2xvZ2ljICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9OT1RfJiBub3RfbWF0ICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9DT1BZXyYgbWF0X2NvcHkgKTsKKyAgICBleHBsaWNpdCBDdk1BVCggY29uc3QgX0N2TUFUX0NWVF8mIG1hdF9jb3B5ICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9ET1RfT1BfJiBkb3RfbXVsICk7CisgICAgZXhwbGljaXQgQ3ZNQVQoIGNvbnN0IF9Ddk1BVF9TT0xWRV8mIHNvbHZlX21hdCApOworICAgIGV4cGxpY2l0IEN2TUFUKCBjb25zdCBfQ3ZNQVRfQ01QXyYgY21wX21hdCApOworCisgICAgLyogZGVzY3RydWN0b3IgKi8KKyAgICB+Q3ZNQVQoKTsKKworICAgIC8qIGNvcHlpbmcgYW5kIGZpbGxpbmcgd2l0aCBhIGNvbnN0YW50ICovCisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBDdk1BVCYgbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBDdk1hdCYgbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBJcGxJbWFnZSYgaW1nICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBkb3VibGUgZmlsbHZhbCApOworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgQ3ZTY2FsYXImIGZpbGx2YWwgKTsKKyAgICAKKyAgICAvKiBiID0gb3AoYTEsIGEyLC4uLikgKi8KKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9UXyYgbWF0X3QgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9JTlZfJiBpbnZfbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfQUREXyYgbWF0X2FkZCApOworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0FERF9FWF8mIG1hdF9hZGQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIHNjYWxlX21hdCApOworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgc2NhbGVfc2hpZnRfbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfTVVMXyYgbW11bCApOworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX01VTF9BRERfJiBtbXVsYWRkICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfTE9HSUNfJiBtYXRfbG9naWMgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9VTl9MT0dJQ18mIG1hdF9sb2dpYyApOworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX05PVF8mIG5vdF9tYXQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9ET1RfT1BfJiBkb3RfbXVsICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfU09MVkVfJiBzb2x2ZV9tYXQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9DTVBfJiBjbXBfbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfQ1ZUXyYgbWF0X2N2dCApOworCisgICAgLyogY29weSBtYXRyaXggZGF0YSwgbm90IG9ubHkgbWF0cml4IGhlYWRlciAqLworICAgIEN2TUFUJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0NPUFlfJiBtYXRfY29weSApOworCisgICAgLyogYXVnbWVudGVkIGFzc2lnbm1lbnRzICovCisgICAgQ3ZNQVQmIG9wZXJhdG9yICs9ICggY29uc3QgQ3ZNYXQmIG1hdCApOworICAgIEN2TUFUJiBvcGVyYXRvciArPSAoIGRvdWJsZSB2YWwgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgKz0gKCBjb25zdCBDdlNjYWxhciYgdmFsICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yICs9ICggY29uc3QgX0N2TUFUX1NDQUxFXyYgc2NhbGVfbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yICs9ICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgc2NhbGVfbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yICs9ICggY29uc3QgX0N2TUFUX01VTF8mIG1tdWwgKTsKKworICAgIEN2TUFUJiBvcGVyYXRvciAtPSAoIGNvbnN0IEN2TWF0JiBtYXQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgLT0gKCBkb3VibGUgdmFsICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yIC09ICggY29uc3QgQ3ZTY2FsYXImIHZhbCApOworICAgIEN2TUFUJiBvcGVyYXRvciAtPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIHNjYWxlX21hdCApOworICAgIEN2TUFUJiBvcGVyYXRvciAtPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIHNjYWxlX21hdCApOworICAgIEN2TUFUJiBvcGVyYXRvciAtPSAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBtbXVsICk7CisKKyAgICBDdk1BVCYgb3BlcmF0b3IgKj0gKCBjb25zdCBDdk1hdCYgbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yICo9ICggZG91YmxlIHZhbCApOworICAgIEN2TUFUJiBvcGVyYXRvciAqPSAoIGNvbnN0IEN2U2NhbGFyJiB2YWwgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgKj0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBzY2FsZV9tYXQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgKj0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBzY2FsZV9tYXQgKTsKKworICAgIEN2TUFUJiBvcGVyYXRvciAmPSAoIGNvbnN0IEN2TWF0JiBtYXQgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgJj0gKCBkb3VibGUgdmFsICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yICY9ICggY29uc3QgQ3ZTY2FsYXImIHZhbCApOworCisgICAgQ3ZNQVQmIG9wZXJhdG9yIHw9ICggY29uc3QgQ3ZNYXQmIG1hdCApOworICAgIEN2TUFUJiBvcGVyYXRvciB8PSAoIGRvdWJsZSB2YWwgKTsKKyAgICBDdk1BVCYgb3BlcmF0b3IgfD0gKCBjb25zdCBDdlNjYWxhciYgdmFsICk7CisKKyAgICBDdk1BVCYgb3BlcmF0b3IgXj0gKCBjb25zdCBDdk1hdCYgbWF0ICk7CisgICAgQ3ZNQVQmIG9wZXJhdG9yIF49ICggZG91YmxlIHZhbCApOworICAgIEN2TUFUJiBvcGVyYXRvciBePSAoIGNvbnN0IEN2U2NhbGFyJiB2YWwgKTsKKworICAgIC8qIHZhcmlvdXMgc2NhbGFyIGNoYXJhY3RlcnRpY3MgKi8KKyAgICBkb3VibGUgbm9ybSggaW50IG5vcm1fdHlwZSA9IENWX0wyICkgY29uc3Q7CisgICAgZG91YmxlIG5vcm0oIEN2TWF0JiBtYXQsIGludCBub3JtX3R5cGUgPSBDVl9MMiApIGNvbnN0OworICAgIEN2U2NhbGFyIHN1bSgpIGNvbnN0OworCisgICAgZG91YmxlIGRldCgpIGNvbnN0OworICAgIGRvdWJsZSB0cmFjZSgpIGNvbnN0OworCisgICAgX0N2TUFUX1RfICB0KCkgY29uc3Q7IC8qIHRyYW5zcG9zaXRpb24gKi8KKyAgICBfQ3ZNQVRfSU5WXyBpbnYoaW50IG1ldGhvZCA9IDApIGNvbnN0OworICAgIC8qIGludmVyc2lvbiB1c2luZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzOgorICAgICAgICAgIG1ldGhvZCA9IDAgLSBHYXVzc2lhbiBlbGltaW5hdGlvbiwKKyAgICAgICAgICBtZXRob2QgPSAxIC0gU1ZEICovCisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgbXVsKCBjb25zdCBDdk1BVCYgbWF0ICkgY29uc3Q7CisgICAgX0N2TUFUX0RPVF9PUF8gIG11bCggY29uc3QgX0N2TUFUX1NDQUxFXyYgbWF0ICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgZGl2KCBjb25zdCBDdk1BVCYgbWF0ICkgY29uc3Q7CisgICAgX0N2TUFUX0RPVF9PUF8gIGRpdiggY29uc3QgX0N2TUFUX1NDQUxFXyYgbWF0ICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgbWluKCBjb25zdCBDdk1BVCYgbWF0ICkgY29uc3Q7CisgICAgX0N2TUFUX0RPVF9PUF8gIG1heCggY29uc3QgQ3ZNQVQmIG1hdCApIGNvbnN0OworICAgIF9Ddk1BVF9ET1RfT1BfICBtaW4oIGRvdWJsZSB2YWx1ZSApIGNvbnN0OworICAgIF9Ddk1BVF9ET1RfT1BfICBtYXgoIGRvdWJsZSB2YWx1ZSApIGNvbnN0OworICAgIGRvdWJsZSAgICAgICAgICBtaW4oIEN2UG9pbnQqIG1pbmxvYyA9IDAgKSBjb25zdDsKKyAgICBkb3VibGUgICAgICAgICAgbWF4KCBDdlBvaW50KiBtYXhsb2MgPSAwICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgYWJzKCkgY29uc3Q7CisgICAgCisgICAgLyogYWNjZXNzaW5nIG1hdHJpeCBlbGVtZW50cyAqLworICAgIF9Ddk1BVEVsZW1fIG9wZXJhdG9yICgpKCBpbnQgcm93ICk7CisgICAgX0N2TUFUQ29uc3RFbGVtXyBvcGVyYXRvciAoKSggaW50IHJvdyApIGNvbnN0OworCisgICAgX0N2TUFURWxlbV8gb3BlcmF0b3IgKCkoIGludCByb3csIGludCBjb2wgKTsKKyAgICBfQ3ZNQVRDb25zdEVsZW1fIG9wZXJhdG9yICgpKCBpbnQgcm93LCBpbnQgY29sICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRFbGVtXyBvcGVyYXRvciAoKSggQ3ZQb2ludCBsb2MgKTsKKyAgICBfQ3ZNQVRDb25zdEVsZW1fIG9wZXJhdG9yICgpKCBDdlBvaW50IGxvYyApIGNvbnN0OworCisgICAgX0N2TUFURWxlbUNuXyBvcGVyYXRvcigpKCBpbnQgcm93LCBpbnQgY29sLCBpbnQgY29pICk7CisgICAgZG91YmxlIG9wZXJhdG9yKCkoIGludCByb3csIGludCBjb2wsIGludCBjb2kgKSBjb25zdDsKKworICAgIF9Ddk1BVEVsZW1Dbl8gb3BlcmF0b3IoKSggQ3ZQb2ludCBwdCwgaW50IGNvaSApOworICAgIGRvdWJsZSBvcGVyYXRvcigpKCBDdlBvaW50IHB0LCBpbnQgY29pICkgY29uc3Q7CisKKyAgICB2b2lkKiBwdHIoIGludCByb3cgKTsKKyAgICBjb25zdCB2b2lkKiBwdHIoIGludCByb3cgKSBjb25zdDsKKworICAgIHZvaWQqIHB0ciggaW50IHJvdywgaW50IGNvbCApOworICAgIGNvbnN0IHZvaWQqIHB0ciggaW50IHJvdywgaW50IGNvbCApIGNvbnN0OworCisgICAgdm9pZCogcHRyKCBDdlBvaW50IHB0ICk7CisgICAgY29uc3Qgdm9pZCogcHRyKCBDdlBvaW50IHB0ICkgY29uc3Q7CisKKyAgICAvKiBhY2Nlc3NpbmcgbWF0cml4IHBhcnRzICovCisgICAgQ3ZNQVQgcm93KCBpbnQgcm93ICkgY29uc3Q7CisgICAgQ3ZNQVQgcm93cmFuZ2UoIGludCByb3cxLCBpbnQgcm93MiApIGNvbnN0OworICAgIEN2TUFUIGNvbCggaW50IGNvbCApIGNvbnN0OworICAgIEN2TUFUIGNvbHJhbmdlKCBpbnQgY29sMSwgaW50IGNvbDIgKSBjb25zdDsKKyAgICBDdk1BVCByZWN0KCBDdlJlY3QgcmVjdCApIGNvbnN0OworICAgIEN2TUFUIGRpYWcoIGludCBkaWFnID0gMCApIGNvbnN0OworCisgICAgX0N2TUFUX0NPUFlfIGNsb25lKCkgY29uc3Q7CisKKyAgICAvKiBjb252ZXJ0IG1hdHJpeCAqLworICAgIF9Ddk1BVF9DVlRfIGN2dCggaW50IG5ld2RlcHRoID0gLTEsIGRvdWJsZSBzY2FsZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2hpZnQgPSAwICkgY29uc3Q7CisKKyAgICAvKiBtYXRyaXggdHJhbnNmb3JtYXRpb24gKi8KKyAgICB2b2lkICByZXNoYXBlKCBpbnQgbmV3Y24sIGludCBuZXdyb3dzID0gMCApOworICAgIHZvaWQgIGZsaXBYKCk7CisgICAgdm9pZCAgZmxpcFkoKTsKKyAgICB2b2lkICBmbGlwWFkoKTsKKworICAgIC8qIG1hdHJpeCBJL086IHVzZSBkeW5hbWljYWxseSBsaW5rZWQgcnVudGltZSBsaWJyYXJpZXMgKi8KKyAgICB2b2lkICB3cml0ZSggY29uc3QgY2hhciogbmFtZSA9IDAsIEZJTEUqIGYgPSAwLCBjb25zdCBjaGFyKiBmbXQgPSAwICk7CisgICAgdm9pZCAgcmVhZCggY2hhcioqIG5hbWUgPSAwLCBGSUxFKiBmID0gMCApOworCisgICAgLyogZGVjcmVhc2UgbWF0cml4IGRhdGEgcmVmZXJlbmNlIGNvdW50ZXIgYW5kIGNsZWFyIGRhdGEgcG9pbnRlciAqLworICAgIHZvaWQgIHJlbGVhc2UoKTsKK3Byb3RlY3RlZDoKKyAgICAKKyAgICB2b2lkICBjcmVhdGUoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUgKTsKK307CisKKworLyogISEhIEludGVybmFsIFVzZSBPbmx5ICEhISAqLworLyogcHJveGllcyBmb3IgbWF0cml4IGVsZW1lbnRzICovCisKKy8qIGNvbnN0X0EoaSxqKSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVENvbnN0RWxlbV8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRDb25zdEVsZW1fKCBjb25zdCB1Y2hhciogcHRyLCBpbnQgdHlwZSApOworICAgIG9wZXJhdG9yIEN2U2NhbGFyICgpIGNvbnN0OworICAgIGRvdWJsZSBvcGVyYXRvciAoKSggaW50IGNvaSA9IDAgKSBjb25zdDsKKworICAgIHVjaGFyKiBwdHI7CisgICAgaW50IHR5cGU7Cit9OworCisKKy8qIEEoaSxqLGNuKSBvciBBKGksaikoY24pICovCitzdHJ1Y3QgIENWX0VYUE9SVFMgX0N2TUFURWxlbUNuXworeworICAgIGV4cGxpY2l0IF9Ddk1BVEVsZW1Dbl8oIHVjaGFyKiBwdHIsIGludCB0eXBlLCBpbnQgY29pICk7CisgICAgb3BlcmF0b3IgZG91YmxlKCkgY29uc3Q7CisgICAgCisgICAgX0N2TUFURWxlbUNuXyYgb3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVENvbnN0RWxlbV8mIGVsZW0gKTsKKyAgICBfQ3ZNQVRFbGVtQ25fJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFURWxlbUNuXyYgZWxlbSApOworICAgIF9Ddk1BVEVsZW1Dbl8mIG9wZXJhdG9yID0gKCBjb25zdCBDdlNjYWxhciYgc2NhbGFyICk7CisgICAgX0N2TUFURWxlbUNuXyYgb3BlcmF0b3IgPSAoIGRvdWJsZSBkICk7CisgICAgX0N2TUFURWxlbUNuXyYgb3BlcmF0b3IgPSAoIGZsb2F0IGYgKTsKKyAgICBfQ3ZNQVRFbGVtQ25fJiBvcGVyYXRvciA9ICggaW50IGkgKTsKKworICAgIHVjaGFyKiBwdHI7CisgICAgaW50IHR5cGU7Cit9OworCisKKy8qIEEoaSxqKSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVEVsZW1fIDogcHVibGljIF9Ddk1BVENvbnN0RWxlbV8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRFbGVtXyggdWNoYXIqIHB0ciwgaW50IHR5cGUgKTsKKyAgICBfQ3ZNQVRFbGVtQ25fIG9wZXJhdG9yICgpKCBpbnQgY29pID0gMCApOworCisgICAgX0N2TUFURWxlbV8mIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRDb25zdEVsZW1fJiBlbGVtICk7CisgICAgX0N2TUFURWxlbV8mIG9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRFbGVtXyYgZWxlbSApOworICAgIF9Ddk1BVEVsZW1fJiBvcGVyYXRvciA9ICggY29uc3QgX0N2TUFURWxlbUNuXyYgZWxlbSApOworICAgIF9Ddk1BVEVsZW1fJiBvcGVyYXRvciA9ICggY29uc3QgQ3ZTY2FsYXImIHZhbCApOworICAgIF9Ddk1BVEVsZW1fJiBvcGVyYXRvciA9ICggZG91YmxlIGQgKTsKKyAgICBfQ3ZNQVRFbGVtXyYgb3BlcmF0b3IgPSAoIGZsb2F0IGYgKTsKKyAgICBfQ3ZNQVRFbGVtXyYgb3BlcmF0b3IgPSAoIGludCBpICk7Cit9OworCisKK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBfQ3ZNQVRfQkFTRV9PUF8oKSB7fTsKKyAgICB2aXJ0dWFsIG9wZXJhdG9yIEN2TUFUKCkgY29uc3QgPSAwOworCisgICAgX0N2TUFUX0RPVF9PUF8gIG11bCggY29uc3QgQ3ZNQVQmIGEgKSBjb25zdDsKKyAgICBfQ3ZNQVRfRE9UX09QXyAgbXVsKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgZGl2KCBjb25zdCBDdk1BVCYgYSApIGNvbnN0OworICAgIF9Ddk1BVF9ET1RfT1BfICBkaXYoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGEgKSBjb25zdDsKKworICAgIF9Ddk1BVF9ET1RfT1BfICBtYXgoIGNvbnN0IEN2TUFUJiBhICkgY29uc3Q7CisgICAgX0N2TUFUX0RPVF9PUF8gIG1pbiggY29uc3QgQ3ZNQVQmIGEgKSBjb25zdDsKKworICAgIF9Ddk1BVF9ET1RfT1BfICBtYXgoIGRvdWJsZSB2YWx1ZSApIGNvbnN0OworICAgIF9Ddk1BVF9ET1RfT1BfICBtaW4oIGRvdWJsZSB2YWx1ZSApIGNvbnN0OworCisgICAgZG91YmxlICAgICAgICAgIG1heCggQ3ZQb2ludCogbWF4bG9jID0gMCApIGNvbnN0OworICAgIGRvdWJsZSAgICAgICAgICBtaW4oIEN2UG9pbnQqIG1pbmxvYyA9IDAgKSBjb25zdDsKKworICAgIF9Ddk1BVF9ET1RfT1BfICBhYnMoKSBjb25zdDsKKworICAgIF9Ddk1BVF9JTlZfICAgICBpbnYoIGludCBtZXRob2QgPSAwICkgY29uc3Q7CisgICAgX0N2TUFUX1RfICAgICAgIHQoKSBjb25zdDsKKworICAgIEN2TUFUICAgICByb3coIGludCByb3cgKSBjb25zdDsKKyAgICBDdk1BVCAgICAgcm93cmFuZ2UoIGludCByb3cxLCBpbnQgcm93MiApIGNvbnN0OworICAgIEN2TUFUICAgICBjb2woIGludCBjb2wgKSBjb25zdDsKKyAgICBDdk1BVCAgICAgY29scmFuZ2UoIGludCBjb2wxLCBpbnQgY29sMiApIGNvbnN0OworICAgIEN2TUFUICAgICByZWN0KCBDdlJlY3QgcmVjdCApIGNvbnN0OworICAgIEN2TUFUICAgICBkaWFnKCBpbnQgZGlhZyA9IDAgKSBjb25zdDsKKyAgICBfQ3ZNQVRfQ1ZUXyAgICAgY3Z0KCBpbnQgbmV3ZGVwdGggPSAtMSwgZG91YmxlIHNjYWxlID0gMSwgZG91YmxlIHNoaWZ0ID0gMCApIGNvbnN0OworICAgIAorICAgIGRvdWJsZSAgICAgICAgICBub3JtKCBpbnQgbm9ybV90eXBlID0gQ1ZfTDIgKSBjb25zdDsKKyAgICBkb3VibGUgICAgICAgICAgZGV0KCkgY29uc3Q7CisgICAgZG91YmxlICAgICAgICAgIHRyYWNlKCkgY29uc3Q7CisgICAgQ3ZTY2FsYXIgICAgICAgIHN1bSgpIGNvbnN0OworfTsKKworCisvKiAoQV50KSphbHBoYSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9UXyA6IHB1YmxpYyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRfVF8oIGNvbnN0IEN2TUFUKiBhICk7CisgICAgZXhwbGljaXQgX0N2TUFUX1RfKCBjb25zdCBDdk1BVCogYSwgZG91YmxlIGFscGhhICk7CisgICAgCisgICAgZG91YmxlIGRldCgpIGNvbnN0OworICAgIGRvdWJsZSBub3JtKCBpbnQgbm9ybVR5cGUgPSBDVl9MMiApIGNvbnN0OworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCAgYTsKKyAgICBkb3VibGUgYWxwaGE7Cit9OworCisKKy8qIGludihBKSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9JTlZfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9JTlZfKCBjb25zdCBDdk1BVCogbWF0LCBpbnQgbWV0aG9kICk7CisgICAgb3BlcmF0b3IgQ3ZNQVQoKSBjb25zdDsKKworICAgIEN2TUFUIGE7CisgICAgaW50IG1ldGhvZDsKK307CisKKworLyogKEFedGEpKihCXnRiKSphbHBoYSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9NVUxfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9NVUxfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsIGludCB0X2FiICk7CisgICAgZXhwbGljaXQgX0N2TUFUX01VTF8oIGNvbnN0IEN2TUFUKiBhLCBjb25zdCBDdk1BVCogYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhLCBpbnQgdF9hYmMgKTsKKyAgICBvcGVyYXRvciBDdk1BVCgpIGNvbnN0OworCisgICAgZG91YmxlIGFscGhhOworICAgIEN2TUFUKiBhOworICAgIEN2TUFUKiBiOworICAgIGludCB0X2FiOyAvKiAodF9hYiAmIDEpID0gdGEsICh0X2FiICYgMikgPSB0YiAqLworfTsKKworCisvKiAoQV50YSkqKEJedGIpKmFscGhhICsgKENedGMpKmJldGEgKi8KK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfTVVMX0FERF8gOiBwdWJsaWMgX0N2TUFUX0JBU0VfT1BfCit7CisgICAgZXhwbGljaXQgX0N2TUFUX01VTF9BRERfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1BVCogYywgaW50IHRfYWJjICk7CisgICAgZXhwbGljaXQgX0N2TUFUX01VTF9BRERfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TUFUKiBjLCBkb3VibGUgYmV0YSwgaW50IHRfYWJjICk7CisgICAgb3BlcmF0b3IgQ3ZNQVQoKSBjb25zdDsKKworICAgIGRvdWJsZSBhbHBoYSwgYmV0YTsKKyAgICBDdk1BVCogYTsKKyAgICBDdk1BVCogYjsKKyAgICBDdk1BVCogYzsKKyAgICBpbnQgdF9hYmM7IC8qICh0X2FiYyAmIDEpID0gdGEsICh0X2FiYyAmIDIpID0gdGIsICh0X2FiYyAmIDQpID0gdGMgKi8KK307CisKKworLyogQSArIEIqYmV0YSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9BRERfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9BRERfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsIGRvdWJsZSBiZXRhID0gMSApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBkb3VibGUgICBub3JtKCBpbnQgbm9ybV90eXBlID0gQ1ZfTDIgKSBjb25zdDsKKyAgICBfQ3ZNQVRfRE9UX09QXyBhYnMoKSBjb25zdDsKKworICAgIGRvdWJsZSBiZXRhOworICAgIEN2TUFUKiBhOworICAgIEN2TUFUKiBiOworfTsKKworCisvKiBBKmFscGhhICsgQipiZXRhICsgZ2FtbWEgKi8KK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfQUREX0VYXyA6IHB1YmxpYyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRfQUREX0VYXyggY29uc3QgQ3ZNQVQqIGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNQVQqIGIsIGRvdWJsZSBiZXRhLCBkb3VibGUgZ2FtbWEgPSAwICk7CisgICAgb3BlcmF0b3IgQ3ZNQVQoKSBjb25zdDsKKworICAgIGRvdWJsZSBhbHBoYSwgYmV0YSwgZ2FtbWE7CisgICAgQ3ZNQVQqIGE7CisgICAgQ3ZNQVQqIGI7Cit9OworCisKKy8qIEEqYWxwaGEgKi8KK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfU0NBTEVfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9TQ0FMRV8oIGNvbnN0IEN2TUFUKiBhLCBkb3VibGUgYWxwaGEgKTsKKyAgICBvcGVyYXRvciBDdk1BVCgpIGNvbnN0OworCisgICAgX0N2TUFUX0RPVF9PUF8gIG11bCggY29uc3QgQ3ZNQVQmIGEgKSBjb25zdDsKKyAgICBfQ3ZNQVRfRE9UX09QXyAgbXVsKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhICkgY29uc3Q7CisKKyAgICBfQ3ZNQVRfRE9UX09QXyAgZGl2KCBjb25zdCBDdk1BVCYgYSApIGNvbnN0OworICAgIF9Ddk1BVF9ET1RfT1BfICBkaXYoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGEgKSBjb25zdDsKKworICAgIGRvdWJsZSBhbHBoYTsKKyAgICBDdk1BVCogYTsKK307CisKKworLyogQSphbHBoYSArIGJldGEgKi8KK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfU0NBTEVfU0hJRlRfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGNvbnN0IEN2TUFUKiBhLCBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhICk7CisgICAgb3BlcmF0b3IgQ3ZNQVQoKSBjb25zdDsKKworICAgIF9Ddk1BVF9ET1RfT1BfICBhYnMoKSBjb25zdDsKKworICAgIGRvdWJsZSBhbHBoYSwgYmV0YTsKKyAgICBDdk1BVCogYTsKK307CisKKworLyogKEEgJiBCKSwgKEEgfCBCKSBvciAoQSBeIEIpICovCitzdHJ1Y3QgIENWX0VYUE9SVFMgX0N2TUFUX0xPR0lDXyA6IHB1YmxpYyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBlbnVtIE9wIHsgQU5EID0gMCwgT1IgPSAxLCBYT1IgPSAyIH07CisgICAgZXhwbGljaXQgX0N2TUFUX0xPR0lDXyggY29uc3QgQ3ZNQVQqIGEsIGNvbnN0IEN2TUFUKiBiLCBPcCBvcCwgaW50IGZsYWdzID0gMCApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCogYTsKKyAgICBDdk1BVCogYjsKKyAgICBPcCBvcDsKKyAgICBpbnQgZmxhZ3M7Cit9OworCisKKy8qIChBICYgc2NhbGFyKSwgKEEgfCBzY2FsYXIpIG9yIChBIF4gc2NhbGFyKSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9VTl9MT0dJQ18gOiBwdWJsaWMgX0N2TUFUX0JBU0VfT1BfCit7CisgICAgZXhwbGljaXQgX0N2TUFUX1VOX0xPR0lDXyggY29uc3QgQ3ZNQVQqIGEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ3ZNQVRfTE9HSUNfOjpPcCBvcCwgaW50IGZsYWdzID0gMCApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCogYTsKKyAgICBkb3VibGUgYWxwaGE7CisgICAgX0N2TUFUX0xPR0lDXzo6T3Agb3A7CisgICAgaW50IGZsYWdzOworfTsKKworCisvKiB+QSAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9OT1RfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9OT1RfKCBjb25zdCBDdk1BVCogYSApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCogYTsKK307CisKKworLyogY29udmVyc2lvbiBvZiBkYXRhIHR5cGUgKi8KK3N0cnVjdCAgQ1ZfRVhQT1JUUyBfQ3ZNQVRfQ1ZUXyA6IHB1YmxpYyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRfQ1ZUXyggY29uc3QgQ3ZNQVQqIGEsIGludCBuZXdkZXB0aCA9IC0xLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUgPSAxLCBkb3VibGUgc2hpZnQgPSAwICk7CisgICAgb3BlcmF0b3IgQ3ZNQVQoKSBjb25zdDsKKworICAgIEN2TUFUIGE7CisgICAgaW50IG5ld2RlcHRoOworICAgIGRvdWJsZSBzY2FsZSwgc2hpZnQ7Cit9OworCisKKy8qIGNvbnZlcnNpb24gb2YgZGF0YSB0eXBlICovCitzdHJ1Y3QgIENWX0VYUE9SVFMgX0N2TUFUX0NPUFlfCit7CisgICAgZXhwbGljaXQgX0N2TUFUX0NPUFlfKCBjb25zdCBDdk1BVCogYSApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisgICAgQ3ZNQVQqIGE7Cit9OworCisKKy8qIGEub3AoYiksIHdoZXJlIG9wID0gbXVsLCBkaXYsIG1pbiwgbWF4IC4uLiAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9ET1RfT1BfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9ET1RfT1BfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcCwgZG91YmxlIGFscGhhID0gMSApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCBhOyAvKiBrZWVwIHRoZSBsZWZ0IG9wZXJhbmQgY29weSAqLworICAgIEN2TUFUKiBiOworICAgIGRvdWJsZSBhbHBoYTsKKyAgICBpbnQgb3A7Cit9OworCisKKy8qIEEuaW52KCkqQiBvciBBLnBpbnYoKSpCICovCitzdHJ1Y3QgIENWX0VYUE9SVFMgX0N2TUFUX1NPTFZFXyA6IHB1YmxpYyBfQ3ZNQVRfQkFTRV9PUF8KK3sKKyAgICBleHBsaWNpdCBfQ3ZNQVRfU09MVkVfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsIGludCBtZXRob2QgKTsKKyAgICBvcGVyYXRvciBDdk1BVCgpIGNvbnN0OworCisgICAgQ3ZNQVQqIGE7CisgICAgQ3ZNQVQqIGI7CisgICAgaW50IG1ldGhvZDsKK307CisKKworLyogQSA8PT4gQiAqLworc3RydWN0ICBDVl9FWFBPUlRTIF9Ddk1BVF9DTVBfIDogcHVibGljIF9Ddk1BVF9CQVNFX09QXworeworICAgIGV4cGxpY2l0IF9Ddk1BVF9DTVBfKCBjb25zdCBDdk1BVCogYSwgY29uc3QgQ3ZNQVQqIGIsIGludCBjbXBfb3AgKTsKKyAgICBleHBsaWNpdCBfQ3ZNQVRfQ01QXyggY29uc3QgQ3ZNQVQqIGEsIGRvdWJsZSBhbHBoYSwgaW50IGNtcF9vcCApOworICAgIG9wZXJhdG9yIEN2TUFUKCkgY29uc3Q7CisKKyAgICBDdk1BVCogYTsKKyAgICBDdk1BVCogYjsKKyAgICBkb3VibGUgYWxwaGE7CisgICAgaW50IGNtcF9vcDsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogX0N2TUFUQ29uc3RFbGVtXyBpbmxpbmUgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2lubGluZSBfQ3ZNQVRDb25zdEVsZW1fOjpfQ3ZNQVRDb25zdEVsZW1fKGNvbnN0IHVjaGFyKiBwLCBpbnQgdCkgOiBwdHIoKHVjaGFyKilwKSwgdHlwZSh0KQore30KKworCitpbmxpbmUgX0N2TUFUQ29uc3RFbGVtXzo6b3BlcmF0b3IgQ3ZTY2FsYXIoKSBjb25zdAoreworICAgIEN2U2NhbGFyIHNjYWxhcjsKKyAgICBjdlJhd0RhdGFUb1NjYWxhciggcHRyLCB0eXBlLCAmc2NhbGFyICk7CisKKyAgICByZXR1cm4gc2NhbGFyOworfQorCisKK2lubGluZSBkb3VibGUgX0N2TUFUQ29uc3RFbGVtXzo6b3BlcmF0b3IgKCkoIGludCBjb2kgKSBjb25zdAoreyAgIHJldHVybiBDdk1BVDo6Z2V0KCBwdHIsIHR5cGUsIGNvaSApOyAgICB9CisKKworaW5saW5lIF9Ddk1BVEVsZW1Dbl86Ol9Ddk1BVEVsZW1Dbl8oIHVjaGFyKiBwLCBpbnQgdCwgaW50IGNvaSApIDoKKyAgICBwdHIocCksIHR5cGUoQ1ZfTUFUX0RFUFRIKHQpKQoreworICAgIGlmKCBjb2kgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpY29pIDwgKHVuc2lnbmVkKUNWX01BVF9DTih0KSApOworICAgICAgICBwdHIgKz0gY29pICogQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgIH0KK30KKworCitpbmxpbmUgX0N2TUFURWxlbUNuXzo6b3BlcmF0b3IgZG91YmxlKCkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQ6OmdldCggcHRyLCB0eXBlICk7IH0KKworCitpbmxpbmUgX0N2TUFURWxlbUNuXyYgX0N2TUFURWxlbUNuXzo6b3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVENvbnN0RWxlbV8mIGVsZW0gKQoreworICAgIGlmKCB0eXBlID09IGVsZW0udHlwZSApCisgICAgICAgIG1lbWNweSggcHRyLCBlbGVtLnB0ciwgQ1ZfRUxFTV9TSVpFKHR5cGUpICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBDVl9NQVRfQ04oZWxlbS50eXBlKSA9PSAxICk7CisgICAgICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgMCwgZWxlbSgwKSk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtQ25fJiBfQ3ZNQVRFbGVtQ25fOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFURWxlbUNuXyYgZWxlbSApCit7CisgICAgaWYoIHR5cGUgPT0gZWxlbS50eXBlICkKKyAgICAgICAgbWVtY3B5KCBwdHIsIGVsZW0ucHRyLCBDVl9FTEVNX1NJWkUodHlwZSkgKTsKKyAgICBlbHNlCisgICAgICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgMCwgKGRvdWJsZSllbGVtICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtQ25fJiBfQ3ZNQVRFbGVtQ25fOjpvcGVyYXRvciA9ICggY29uc3QgQ3ZTY2FsYXImIHNjYWxhciApCit7ICAgCisgICAgQ3ZNQVQ6OnNldCggcHRyLCB0eXBlLCAwLCBzY2FsYXIudmFsWzBdICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtQ25fJiBfQ3ZNQVRFbGVtQ25fOjpvcGVyYXRvciA9ICggZG91YmxlIGQgKQoreyAgIAorICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgMCwgZCApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgX0N2TUFURWxlbUNuXyYgX0N2TUFURWxlbUNuXzo6b3BlcmF0b3IgPSAoIGZsb2F0IGYgKQoreyAgIAorICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgMCwgKGRvdWJsZSlmICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtQ25fJiBfQ3ZNQVRFbGVtQ25fOjpvcGVyYXRvciA9ICggaW50IGkgKQoreyAgIAorICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgMCwgaSApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgX0N2TUFURWxlbV86Ol9Ddk1BVEVsZW1fKCB1Y2hhciogcCwgaW50IHQgKSA6IF9Ddk1BVENvbnN0RWxlbV8oIChjb25zdCB1Y2hhciopcCwgdCApCit7fQorCisKK2lubGluZSBfQ3ZNQVRFbGVtQ25fIF9Ddk1BVEVsZW1fOjpvcGVyYXRvciAoKSggaW50IGNvaSApCit7ICAgcmV0dXJuIF9Ddk1BVEVsZW1Dbl8oIHB0ciwgdHlwZSwgY29pICk7IH0KKworCitpbmxpbmUgX0N2TUFURWxlbV8mIF9Ddk1BVEVsZW1fOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUQ29uc3RFbGVtXyYgZWxlbSApCit7CisgICAgaWYoIHR5cGUgPT0gZWxlbS50eXBlICkKKyAgICAgICAgbWVtY3B5KCBwdHIsIGVsZW0ucHRyLCBDVl9FTEVNX1NJWkUodHlwZSkgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoIENWX01BVF9DTiggdHlwZSBeIGVsZW0udHlwZSApID09IDAgKTsKKyAgICAgICAgQ3ZTY2FsYXIgc2MgPSAoQ3ZTY2FsYXIpZWxlbTsKKyAgICAgICAgY3ZTY2FsYXJUb1Jhd0RhdGEoICZzYywgcHRyLCB0eXBlLCAwICk7CisgICAgfQorCisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyYgX0N2TUFURWxlbV86Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRFbGVtXyYgZWxlbSApCit7CisgICAgKnRoaXMgPSAoY29uc3QgX0N2TUFUQ29uc3RFbGVtXyYpZWxlbTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIF9Ddk1BVEVsZW1fJiBfQ3ZNQVRFbGVtXzo6b3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVEVsZW1Dbl8mIGVsZW0gKQoreworICAgIGlmKCB0eXBlID09IGVsZW0udHlwZSApCisgICAgICAgIG1lbWNweSggcHRyLCBlbGVtLnB0ciwgQ1ZfRUxFTV9TSVpFKHR5cGUpICk7CisgICAgZWxzZQorICAgICAgICBDdk1BVDo6c2V0KCBwdHIsIHR5cGUsIChkb3VibGUpZWxlbSApOworCisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyYgX0N2TUFURWxlbV86Om9wZXJhdG9yID0gKCBjb25zdCBDdlNjYWxhciYgc2NhbGFyICkKK3sKKyAgICBjdlNjYWxhclRvUmF3RGF0YSggJnNjYWxhciwgcHRyLCB0eXBlLCAwICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyYgX0N2TUFURWxlbV86Om9wZXJhdG9yID0gKCBkb3VibGUgZCApCit7CisgICAgQ3ZNQVQ6OnNldCggcHRyLCB0eXBlLCBkICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyYgX0N2TUFURWxlbV86Om9wZXJhdG9yID0gKCBmbG9hdCBmICkKK3sKKyAgICBDdk1BVDo6c2V0KCBwdHIsIHR5cGUsIChkb3VibGUpZiApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgX0N2TUFURWxlbV8mIF9Ddk1BVEVsZW1fOjpvcGVyYXRvciA9ICggaW50IGkgKQoreworICAgIEN2TUFUOjpzZXQoIHB0ciwgdHlwZSwgaSApOworICAgIHJldHVybiAqdGhpczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdk1BVCBpbmxpbmUgbWV0aG9kcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW5saW5lIEN2TUFUOjpDdk1BVCgpCit7CisgICAgbWVtc2V0KCB0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKK30KKworCitpbmxpbmUgQ3ZNQVQ6OkN2TUFUKCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlLCB2b2lkKiBkYXRhLCBpbnQgc3RlcCApCit7CisgICAgY3ZJbml0TWF0SGVhZGVyKCB0aGlzLCByb3dzLCBjb2xzLCB0eXBlLCBkYXRhLCBzdGVwICk7Cit9CisKKworaW5saW5lIEN2TUFUOjpDdk1BVCggaW50IHJvd3MsIGludCB0eXBlLCB2b2lkKiBkYXRhLCBpbnQgc3RlcCApCit7CisgICAgY3ZJbml0TWF0SGVhZGVyKCB0aGlzLCByb3dzLCAxLCB0eXBlLCBkYXRhLCBzdGVwICk7Cit9CisKKworaW5saW5lIHZvaWQgQ3ZNQVQ6OmNyZWF0ZSggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSApCit7CisgICAgaW50IHN0ZXAgPSBjb2xzKkNWX0VMRU1fU0laRSh0eXBlKSwgdG90YWxfc2l6ZSA9IHN0ZXAqcm93czsKKyAgICB0aGlzLT5yb3dzID0gcm93czsKKyAgICB0aGlzLT5jb2xzID0gY29sczsKKyAgICB0aGlzLT5zdGVwID0gcm93cyA9PSAxID8gMCA6IHN0ZXA7CisgICAgdGhpcy0+dHlwZSA9IENWX01BVF9NQUdJQ19WQUwgfCAodHlwZSAmIENWX01BVF9UWVBFX01BU0spIHwgQ1ZfTUFUX0NPTlRfRkxBRzsKKyAgICByZWZjb3VudCA9IChpbnQqKWN2QWxsb2MoKHNpemVfdCl0b3RhbF9zaXplICsgOCk7CisgICAgZGF0YS5wdHIgPSAodWNoYXIqKSgoKHNpemVfdCkocmVmY291bnQgKyAxKSArIDcpICYgLTgpOworICAgICpyZWZjb3VudCA9IDE7Cit9CisKKworaW5saW5lIEN2TUFUOjpDdk1BVCggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSApCit7CisgICAgY3JlYXRlKCByb3dzLCBjb2xzLCB0eXBlICk7Cit9CisKKworaW5saW5lIEN2TUFUOjpDdk1BVCggaW50IHJvd3MsIGludCB0eXBlICkKK3sKKyAgICBjcmVhdGUoIHJvd3MsIDEsIHR5cGUgKTsKK30KKworCitpbmxpbmUgQ3ZNQVQ6OkN2TUFUKCBjb25zdCBDdk1hdCYgbWF0ICkKK3sKKyAgICBtZW1jcHkoIHRoaXMsICZtYXQsIHNpemVvZihtYXQpKTsKKyAgICBpZiggcmVmY291bnQgKQorICAgICAgICAoKnJlZmNvdW50KSsrOworfQorCisKK2lubGluZSBDdk1BVDo6Q3ZNQVQoIGNvbnN0IEN2TUFUJiBtYXQgKQoreworICAgIG1lbWNweSggdGhpcywgJm1hdCwgc2l6ZW9mKG1hdCkpOworICAgIGlmKCByZWZjb3VudCApCisgICAgICAgICgqcmVmY291bnQpKys7Cit9CisKKworaW5saW5lIEN2TUFUOjpDdk1BVCggY29uc3QgSXBsSW1hZ2UmIGltZyApCit7CisgICAgY3ZHZXRNYXQoICZpbWcsIHRoaXMgKTsKK30KKworCitpbmxpbmUgdm9pZCBDdk1BVDo6cmVsZWFzZSgpCit7CisgICAgZGF0YS5wdHIgPSBOVUxMOworICAgIGlmKCByZWZjb3VudCAhPSBOVUxMICYmIC0tKnJlZmNvdW50ID09IDAgKQorICAgICAgICBjdkZyZWUoICh2b2lkKiopJnJlZmNvdW50ICk7CisgICAgcmVmY291bnQgPSAwOworfQorCisKK2lubGluZSBDdk1BVDo6fkN2TUFUKCkKK3sKKyAgICByZWxlYXNlKCk7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IEN2TUFUJiBtYXQgKQoreworICAgIGlmKCB0aGlzICE9ICZtYXQgKQorICAgIHsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICBtZW1jcHkoIHRoaXMsICZtYXQsIHNpemVvZihtYXQpKTsKKyAgICAgICAgaWYoIHJlZmNvdW50ICkKKyAgICAgICAgICAgICgqcmVmY291bnQpKys7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgQ3ZNYXQmIG1hdCApCit7CisgICAgKnRoaXMgPSAoY29uc3QgQ3ZNQVQmKW1hdDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IElwbEltYWdlJiBpbWcgKQoreworICAgIHJlbGVhc2UoKTsKKyAgICBjdkdldE1hdCggJmltZywgdGhpcyApOworCisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBkb3VibGUgZmlsbHZhbCApCit7CisgICAgY3ZGaWxsSW1hZ2UoIHRoaXMsIGZpbGx2YWwgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IEN2U2NhbGFyJiBmaWxsdmFsICkKK3sKKyAgICBjdlNldCggdGhpcywgZmlsbHZhbCApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciArPSAoIGNvbnN0IEN2TWF0JiBtYXQgKQoreworICAgIGN2QWRkKCB0aGlzLCAmbWF0LCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICs9ICggZG91YmxlIHZhbCApCit7CisgICAgY3ZBZGRTKCB0aGlzLCBjdlNjYWxhcih2YWwpLCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICs9ICggY29uc3QgQ3ZTY2FsYXImIHZhbCApCit7CisgICAgY3ZBZGRTKCB0aGlzLCB2YWwsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgLT0gKCBjb25zdCBDdk1hdCYgbWF0ICkKK3sKKyAgICBjdlN1YiggdGhpcywgJm1hdCwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciAtPSAoIGRvdWJsZSB2YWwgKQoreworICAgIGN2U3ViUyggdGhpcywgY3ZTY2FsYXIodmFsKSwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciAtPSAoIGNvbnN0IEN2U2NhbGFyJiB2YWwgKQoreworICAgIGN2U3ViUyggdGhpcywgdmFsLCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICo9ICggY29uc3QgQ3ZNYXQmIG1hdCApCit7CisgICAgY3ZNdWwoIHRoaXMsICZtYXQsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7ICAgIAorfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICo9ICggZG91YmxlIHZhbCApCit7CisgICAgY3ZTY2FsZSggdGhpcywgdGhpcywgdmFsLCAwICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICo9ICggY29uc3QgQ3ZTY2FsYXImIHZhbCApCit7CisgICAgY3ZTY2FsZUFkZCggdGhpcywgdmFsLCAwLCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICY9ICggY29uc3QgQ3ZNYXQmIG1hdCApCit7CisgICAgY3ZBbmQoIHRoaXMsICZtYXQsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgJj0gKCBkb3VibGUgdmFsICkKK3sKKyAgICBjdkFuZFMoIHRoaXMsIGN2U2NhbGFyQWxsKHZhbCksIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgJj0gKCBjb25zdCBDdlNjYWxhciYgdmFsICkKK3sKKyAgICBjdkFuZFMoIHRoaXMsIHZhbCwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciB8PSAoIGNvbnN0IEN2TWF0JiBtYXQgKQoreworICAgIGN2T3IoIHRoaXMsICZtYXQsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgfD0gKCBkb3VibGUgdmFsICkKK3sKKyAgICBjdk9yUyggdGhpcywgY3ZTY2FsYXJBbGwodmFsKSwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciB8PSAoIGNvbnN0IEN2U2NhbGFyJiB2YWwgKQoreworICAgIGN2T3JTKCB0aGlzLCB2YWwsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgXj0gKCBjb25zdCBDdk1hdCYgbWF0ICkKK3sKKyAgICBjdlhvciggdGhpcywgJm1hdCwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciBePSAoIGRvdWJsZSB2YWwgKQoreworICAgIGN2WG9yUyggdGhpcywgY3ZTY2FsYXJBbGwodmFsKSwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciBePSAoIGNvbnN0IEN2U2NhbGFyJiB2YWwgKQoreworICAgIGN2WG9yUyggdGhpcywgdmFsLCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK2lubGluZSBkb3VibGUgQ3ZNQVQ6Om5vcm0oIGludCBub3JtVHlwZSApIGNvbnN0Cit7ICAgcmV0dXJuIGN2Tm9ybSggdGhpcywgMCwgbm9ybVR5cGUgKTsgfQorCisKK2lubGluZSBkb3VibGUgQ3ZNQVQ6Om1pbiggQ3ZQb2ludCogbWlubG9jICkgY29uc3QKK3sgICAKKyAgICBkb3VibGUgdDsKKyAgICBjdk1pbk1heExvYyggdGhpcywgJnQsIDAsIG1pbmxvYywgMCwgMCApOworICAgIHJldHVybiB0OworfQorCitpbmxpbmUgZG91YmxlIEN2TUFUOjptYXgoIEN2UG9pbnQqIG1heGxvYyApIGNvbnN0Cit7ICAgCisgICAgZG91YmxlIHQ7CisgICAgY3ZNaW5NYXhMb2MoIHRoaXMsIDAsICZ0LCAwLCBtYXhsb2MsIDAgKTsKKyAgICByZXR1cm4gdDsKK30KKworCitpbmxpbmUgZG91YmxlIEN2TUFUOjpub3JtKCBDdk1hdCYgbWF0LCBpbnQgbm9ybVR5cGUgKSBjb25zdAoreyAgIHJldHVybiBjdk5vcm0oIHRoaXMsICZtYXQsIG5vcm1UeXBlICk7ICB9CisKKworaW5saW5lIEN2U2NhbGFyIEN2TUFUOjpzdW0oKSBjb25zdAoreyAgIHJldHVybiBjdlN1bSggdGhpcyApOyAgIH0KKworCitpbmxpbmUgZG91YmxlIEN2TUFUOjpkZXQoKSBjb25zdAoreyAgIHJldHVybiBjdkRldCggdGhpcyApOyAgIH0KKworCitpbmxpbmUgdm9pZCBDdk1BVDo6cmVzaGFwZSggaW50IG5ld2NuLCBpbnQgbmV3cm93cyApCit7ICAgY3ZSZXNoYXBlKCB0aGlzLCB0aGlzLCBuZXdjbiwgbmV3cm93cyApOyAgICB9CisKKworaW5saW5lIHZvaWQgQ3ZNQVQ6OmZsaXBYKCkKK3sgICBjdkZsaXAoIHRoaXMsIHRoaXMsIDEgKTsgICAgfQorCisKK2lubGluZSB2b2lkIEN2TUFUOjpmbGlwWSgpCit7ICAgY3ZGbGlwKCB0aGlzLCB0aGlzLCAwICk7ICAgIH0KKworCitpbmxpbmUgdm9pZCBDdk1BVDo6ZmxpcFhZKCkKK3sgICBjdkZsaXAoIHRoaXMsIHRoaXMsIC0xICk7ICAgfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyBDdk1BVDo6b3BlcmF0b3IgKCkoIGludCByb3cgKQoreyAgIHJldHVybiBfQ3ZNQVRFbGVtXyggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCAwICksIHR5cGUgKTsgICB9CisKKworaW5saW5lIF9Ddk1BVENvbnN0RWxlbV8gQ3ZNQVQ6Om9wZXJhdG9yICgpKCBpbnQgcm93ICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUQ29uc3RFbGVtXyggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCAwICksIHR5cGUgKTsgfQorCisKK2lubGluZSBfQ3ZNQVRFbGVtXyBDdk1BVDo6b3BlcmF0b3IgKCkoIGludCByb3csIGludCBjb2wgKQoreyAgIHJldHVybiBfQ3ZNQVRFbGVtXyggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCBjb2wgKSwgdHlwZSApOyB9CisKKworaW5saW5lIF9Ddk1BVENvbnN0RWxlbV8gQ3ZNQVQ6Om9wZXJhdG9yICgpKCBpbnQgcm93LCBpbnQgY29sICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUQ29uc3RFbGVtXyggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCBjb2wgKSwgdHlwZSApOyB9CisKKworaW5saW5lIF9Ddk1BVEVsZW1Dbl8gQ3ZNQVQ6Om9wZXJhdG9yKCkoIGludCByb3csIGludCBjb2wsIGludCBjb2kgKQoreyAgIHJldHVybiBfQ3ZNQVRFbGVtQ25fKCBDVl9NQVRfRUxFTV9QVFIoICp0aGlzLCByb3csIGNvbCApLCB0eXBlLCBjb2kgKTsgIH0KKworCitpbmxpbmUgX0N2TUFURWxlbUNuXyBDdk1BVDo6b3BlcmF0b3IoKSggQ3ZQb2ludCBwdCwgaW50IGNvaSApCit7ICAgcmV0dXJuIF9Ddk1BVEVsZW1Dbl8oIENWX01BVF9FTEVNX1BUUiggKnRoaXMsIHB0LnksIHB0LnggKSwgdHlwZSwgY29pICk7ICB9CisKKworaW5saW5lIGRvdWJsZSBDdk1BVDo6b3BlcmF0b3IoKSggaW50IHJvdywgaW50IGNvbCwgaW50IGNvaSApIGNvbnN0Cit7ICAgcmV0dXJuIGdldCggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCBjb2wgKSwgdHlwZSwgY29pICk7ICAgIH0KKworCitpbmxpbmUgX0N2TUFURWxlbV8gQ3ZNQVQ6Om9wZXJhdG9yICgpKCBDdlBvaW50IHB0ICkKK3sgICByZXR1cm4gX0N2TUFURWxlbV8oIENWX01BVF9FTEVNX1BUUiggKnRoaXMsIHB0LnksIHB0LnggKSwgdHlwZSApOyB9CisKKworaW5saW5lIF9Ddk1BVENvbnN0RWxlbV8gQ3ZNQVQ6Om9wZXJhdG9yICgpKCBDdlBvaW50IHB0ICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUQ29uc3RFbGVtXyggQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcHQueSwgcHQueCApLCB0eXBlICk7IH0KKworCitpbmxpbmUgZG91YmxlIEN2TUFUOjpvcGVyYXRvcigpKCBDdlBvaW50IHB0LCBpbnQgY29pICkgY29uc3QKK3sgICByZXR1cm4gZ2V0KCBDVl9NQVRfRUxFTV9QVFIoICp0aGlzLCBwdC55LCBwdC54ICksIHR5cGUsIGNvaSApOyAgICB9CisKKworaW5saW5lIHZvaWQqIEN2TUFUOjpwdHIoIGludCByb3cgKQoreyAgIHJldHVybiBDVl9NQVRfRUxFTV9QVFIoICp0aGlzLCByb3csIDAgKTsgICAgfQorCisKK2lubGluZSBjb25zdCB2b2lkKiBDdk1BVDo6cHRyKCBpbnQgcm93ICkgY29uc3QKK3sgICByZXR1cm4gKGNvbnN0IHZvaWQqKUNWX01BVF9FTEVNX1BUUiggKnRoaXMsIHJvdywgMCApOyAgIH0KKworCitpbmxpbmUgdm9pZCogQ3ZNQVQ6OnB0ciggaW50IHJvdywgaW50IGNvbCApCit7ICAgcmV0dXJuIENWX01BVF9FTEVNX1BUUiggKnRoaXMsIHJvdywgY29sICk7ICB9CisKKworaW5saW5lIGNvbnN0IHZvaWQqIEN2TUFUOjpwdHIoIGludCByb3csIGludCBjb2wgKSBjb25zdAoreyAgIHJldHVybiAoY29uc3Qgdm9pZCopQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcm93LCBjb2wgKTsgfQorCisKK2lubGluZSB2b2lkKiBDdk1BVDo6cHRyKCBDdlBvaW50IHB0ICkKK3sgICByZXR1cm4gQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcHQueSwgcHQueCApOyAgICB9CisKKworaW5saW5lIGNvbnN0IHZvaWQqIEN2TUFUOjpwdHIoIEN2UG9pbnQgcHQgKSBjb25zdAoreyAgIHJldHVybiAoY29uc3Qgdm9pZCopQ1ZfTUFUX0VMRU1fUFRSKCAqdGhpcywgcHQueSwgcHQueCApOyB9CisKKworaW5saW5lIF9Ddk1BVF9JTlZfIEN2TUFUOjppbnYoIGludCBtZXRob2QgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfSU5WXyggdGhpcywgbWV0aG9kICk7IH0KKworCitpbmxpbmUgX0N2TUFUX1RfIEN2TUFUOjp0KCkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUX1RfKCB0aGlzICk7ICAgfQorCisKK2lubGluZSBfQ3ZNQVRfQ09QWV8gQ3ZNQVQ6OmNsb25lKCkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUX0NPUFlfKCB0aGlzICk7IH0KKworaW5saW5lIF9Ddk1BVF9DVlRfIEN2TUFUOjpjdnQoIGludCBuZXdkZXB0aCwgZG91YmxlIHNjYWxlLCBkb3VibGUgc2hpZnQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfQ1ZUXyggdGhpcywgbmV3ZGVwdGgsIHNjYWxlLCBzaGlmdCApOyB9CisKKworaW5saW5lIEN2TUFUOjpDdk1BVCggY29uc3QgQ3ZNYXQmIG1hdCwgQ3ZSZWN0IHJlY3QgKQoreyAgIAorICAgIHR5cGUgPSAwOworICAgIGN2R2V0U3ViQXJyKCAmbWF0LCB0aGlzLCByZWN0ICk7CisgICAgY3ZJbmNSZWZEYXRhKCB0aGlzICk7Cit9CisKKworLyogc3VibWF0cml4OgorICAgICBrID09IDAgLSBpLXRoIHJvdworICAgICBrID4gMCAtIGktdGggY29sdW1uCisgICAgIGsgPCAwIC0gaS10aCBkaWFnb25hbCAqLworaW5saW5lIEN2TUFUOjpDdk1BVCggY29uc3QgQ3ZNYXQmIG1hdCwgaW50IGssIGludCBpICkKK3sKKyAgICB0eXBlID0gMDsKKyAgICBpZiggayA9PSAwICkKKyAgICAgICAgY3ZHZXRSb3coICZtYXQsIHRoaXMsIGkgKTsKKyAgICBlbHNlIGlmKCBrID4gMCApCisgICAgICAgIGN2R2V0Q29sKCAmbWF0LCB0aGlzLCBpICk7CisgICAgZWxzZQorICAgICAgICBjdkdldERpYWcoICZtYXQsIHRoaXMsIGkgKTsKKyAgICBjdkluY1JlZkRhdGEoIHRoaXMgKTsKK30KKworCitpbmxpbmUgQ3ZNQVQgQ3ZNQVQ6OnJvdyggaW50IHIgKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMsIDAsIHIgKTsgIH0KKworCitpbmxpbmUgQ3ZNQVQgQ3ZNQVQ6OmNvbCggaW50IGMgKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMsIDEsIGMgKTsgIH0KKworCitpbmxpbmUgQ3ZNQVQgQ3ZNQVQ6OmRpYWcoIGludCBkICkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoICp0aGlzLCAtMSwgZCApOyAgfQorCisKK2lubGluZSBDdk1BVCBDdk1BVDo6cmVjdCggQ3ZSZWN0IHJlY3QgKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMsIHJlY3QgKTsgICAgfQorCitpbmxpbmUgQ3ZNQVQgQ3ZNQVQ6OnJvd3JhbmdlKCBpbnQgcm93MSwgaW50IHJvdzIgKSBjb25zdAoreyAgIAorICAgIGFzc2VydCggMCA8PSByb3cxICYmIHJvdzEgPCByb3cyICYmIHJvdzIgPD0gaGVpZ2h0ICk7CisgICAgcmV0dXJuIEN2TUFUKCAqdGhpcywgY3ZSZWN0KCAwLCByb3cxLCB3aWR0aCwgcm93MiAtIHJvdzEgKSk7Cit9CisKK2lubGluZSBDdk1BVCBDdk1BVDo6Y29scmFuZ2UoIGludCBjb2wxLCBpbnQgY29sMiApIGNvbnN0Cit7ICAgCisgICAgYXNzZXJ0KCAwIDw9IGNvbDEgJiYgY29sMSA8IGNvbDIgJiYgY29sMiA8PSB3aWR0aCApOworICAgIHJldHVybiBDdk1BVCggKnRoaXMsIGN2UmVjdCggY29sMSwgMCwgY29sMiAtIGNvbDEsIGhlaWdodCApKTsKK30KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIEN2TUFUOjptdWwoIGNvbnN0IEN2TUFUJiBtYXQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggdGhpcywgJm1hdCwgJyonICk7ICAgfQorCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gQ3ZNQVQ6Om11bCggY29uc3QgX0N2TUFUX1NDQUxFXyYgbWF0ICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUX0RPVF9PUF8oIHRoaXMsIG1hdC5hLCAnKicsIG1hdC5hbHBoYSApOyAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIEN2TUFUOjpkaXYoIGNvbnN0IEN2TUFUJiBtYXQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggdGhpcywgJm1hdCwgJy8nICk7ICB9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBDdk1BVDo6ZGl2KCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBtYXQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggdGhpcywgbWF0LmEsICcvJywgMS4vbWF0LmFscGhhICk7ICAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIEN2TUFUOjptaW4oIGNvbnN0IEN2TUFUJiBtYXQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggdGhpcywgJm1hdCwgJ20nICk7ICAgfQorCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gQ3ZNQVQ6Om1heCggY29uc3QgQ3ZNQVQmIG1hdCApIGNvbnN0Cit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCB0aGlzLCAmbWF0LCAnTScgKTsgICB9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBDdk1BVDo6bWluKCBkb3VibGUgdmFsdWUgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggdGhpcywgMCwgJ20nLCB2YWx1ZSApOyAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIEN2TUFUOjptYXgoIGRvdWJsZSB2YWx1ZSApIGNvbnN0Cit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCB0aGlzLCAwLCAnTScsIHZhbHVlICk7ICAgfQorCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gQ3ZNQVQ6OmFicygpIGNvbnN0Cit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCB0aGlzLCAwLCAnYScsIDAgKTsgICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5hcnkgb3BlcmF0aW9ucyAoKywtLCopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyogUEFSVCBJLiBTY2FsaW5nLCBzaGlmdGluZywgYWRkaXRpb24vc3VidHJhY3Rpb24gb3BlcmF0aW9ucworKi8KKworLyogKG1hdDJedCkgPSAobWF0MV50KSAqIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9UXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1RfJiBhLCBkb3VibGUgYWxwaGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVF8oICZhLmEsIGEuYWxwaGEqYWxwaGEgKTsgIH0KKworLyogKG1hdDJedCkgPSBzY2FsYXIgKiAobWF0MV50KSAqLworaW5saW5lIF9Ddk1BVF9UXyBvcGVyYXRvciAqICggZG91YmxlIGFscGhhLCBjb25zdCBfQ3ZNQVRfVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVF8oICZhLmEsIGEuYWxwaGEqYWxwaGEgKTsgIH0KKworLyogLShtYXRedCkgKi8KK2lubGluZSBfQ3ZNQVRfVF8gb3BlcmF0b3IgLSAoIGNvbnN0IF9Ddk1BVF9UXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9UXyggJmEuYSwgLWEuYWxwaGEgKTsgfQorCisvKiBtYXRfc2NhbGVkID0gbWF0ICogc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX1NDQUxFXyBvcGVyYXRvciAqICggY29uc3QgQ3ZNQVQmIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV8oICZhLCBhbHBoYSApOyAgfQorCisvKiBtYXRfc2NhbGVkID0gc2NhbGFyICogbWF0ICovCitpbmxpbmUgX0N2TUFUX1NDQUxFXyBvcGVyYXRvciAqICggZG91YmxlIGFscGhhLCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV8oICZhLCBhbHBoYSApOyAgfQorCisvKiBtYXRfc2NhbGVkMiA9IG1hdF9zY2FsZWQxICogc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX1NDQUxFXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX1NDQUxFXyggYS5hLCBhLmFscGhhKmFscGhhICk7IH0KKworLyogbWF0X3NjYWxlZDIgPSBzY2FsYXIgKiBtYXRfc2NhbGVkMSAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV8gb3BlcmF0b3IgKiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV8oIGEuYSwgYS5hbHBoYSphbHBoYSApOyB9CisKKy8qIC1tYXRfc2NhbGVkICovCitpbmxpbmUgX0N2TUFUX1NDQUxFXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV8oIGEuYSwgLWEuYWxwaGEgKTsgfQorCisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IG1hdCArIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgKyAoIGNvbnN0IEN2TUFUJiBhLCBkb3VibGUgYmV0YSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oICZhLCAxLCBiZXRhICk7ICB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IHNjYWxhciArIG1hdCAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgKyAoIGRvdWJsZSBiZXRhLCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oICZhLCAxLCBiZXRhICk7ICB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IG1hdCAtIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgLSAoIGNvbnN0IEN2TUFUJiBhLCBkb3VibGUgYmV0YSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oICZhLCAxLCAtYmV0YSApOyB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IHNjYWxhciAtIG1hdCAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgLSAoIGRvdWJsZSBiZXRhLCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oICZhLCAtMSwgYmV0YSApOyB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IG1hdF9zY2FsZWQgKyBzY2FsYXIgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhLCBkb3VibGUgYmV0YSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGEuYSwgYS5hbHBoYSwgYmV0YSApOyAgIH0KKworLyogbWF0X3NjYWxlZF9zaGlmdGVkID0gc2NhbGFyICsgbWF0X3NjYWxlZCAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgKyAoIGRvdWJsZSBiZXRhLCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX1NDQUxFX1NISUZUXyggYS5hLCBhLmFscGhhLCBiZXRhICk7ICAgfQorCisvKiBtYXRfc2NhbGVkX3NoaWZ0ZWQgPSBtYXRfc2NhbGVkIC0gc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX1NDQUxFX1NISUZUXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSwgZG91YmxlIGJldGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfU0NBTEVfU0hJRlRfKCBhLmEsIGEuYWxwaGEsIC1iZXRhICk7ICB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZCA9IHNjYWxhciAtIG1hdF9zY2FsZWQgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yIC0gKCBkb3VibGUgYmV0YSwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGEuYSwgLWEuYWxwaGEsIGJldGEgKTsgIH0KKworLyogbWF0X3NjYWxlZF9zaGlmdGVkMiA9IG1hdF9zY2FsZWRfc2hpZnRlZDEgKyBzY2FsYXIgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhLCBkb3VibGUgYmV0YSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGEuYSwgYS5hbHBoYSwgYS5iZXRhICsgYmV0YSApOyAgfQorCisvKiBtYXRfc2NhbGVkX3NoaWZ0ZWQyID0gc2NhbGFyICsgbWF0X3NjYWxlZF9zaGlmdGVkMSAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgKyAoIGRvdWJsZSBiZXRhLCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX1NDQUxFX1NISUZUXyggYS5hLCBhLmFscGhhLCBhLmJldGEgKyBiZXRhICk7ICB9CisKKy8qIG1hdF9zY2FsZWRfc2hpZnRlZDIgPSBtYXRfc2NhbGVkX3NoaWZ0ZWQxIC0gc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX1NDQUxFX1NISUZUXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSwgZG91YmxlIGJldGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfU0NBTEVfU0hJRlRfKCBhLmEsIGEuYWxwaGEsIGEuYmV0YSAtIGJldGEgKTsgIH0KKworLyogbWF0X3NjYWxlZF9zaGlmdGVkMiA9IHNjYWxhciAtIG1hdF9zY2FsZWRfc2hpZnRlZDEgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yIC0gKCBkb3VibGUgYmV0YSwgY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGEuYSwgLWEuYWxwaGEsIGJldGEgLSBhLmJldGEgKTsgfQorCisvKiBtYXRfc2NhbGVkX3NoaWZ0ZWQyID0gbWF0X3NjYWxlZF9zaGlmdGVkMSAqIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9TQ0FMRV9TSElGVF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV9TSElGVF8oIGEuYSwgYS5hbHBoYSphbHBoYSwgYS5iZXRhKmFscGhhICk7IH0KKworLyogbWF0X3NjYWxlZF9zaGlmdGVkMiA9IHNjYWxhciAqIG1hdF9zY2FsZWRfc2hpZnRlZDEgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yICogKCBkb3VibGUgYWxwaGEsIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfU0NBTEVfU0hJRlRfKCBhLmEsIGEuYWxwaGEqYWxwaGEsIGEuYmV0YSphbHBoYSApOyB9CisKKy8qIC1tYXRfc2NhbGVkX3NoaWZ0ZWQgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfIG9wZXJhdG9yIC0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX1NDQUxFX1NISUZUXyggYS5hLCAtYS5hbHBoYSwgLWEuYmV0YSApOyB9CisKKworLyogLW1hdDEgKi8KK2lubGluZSBfQ3ZNQVRfU0NBTEVfIG9wZXJhdG9yIC0gKCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9TQ0FMRV8oICZhLCAtMSApOyAgIH0KKworLyogbWF0X2FkZCA9IG1hdDEgKyBtYXQyICovCitpbmxpbmUgX0N2TUFUX0FERF8gb3BlcmF0b3IgKyAoIGNvbnN0IEN2TUFUJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfKCAmYSwgJmIgKTsgICB9CisKKy8qIG1hdF9hZGQgPSBtYXQxIC0gbWF0MiAqLworaW5saW5lIF9Ddk1BVF9BRERfIG9wZXJhdG9yIC0gKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREXyggJmEsICZiLCAtMSApOyAgICB9CisKKy8qIG1hdF9hZGQgPSBtYXRfc2NhbGVkMSArIG1hdDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREXyBvcGVyYXRvciArICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREXyggJmIsIGEuYSwgYS5hbHBoYSApOyAgfQorCisvKiBtYXRfYWRkID0gbWF0MSArIG1hdF9zY2FsZWQyICovCitpbmxpbmUgX0N2TUFUX0FERF8gb3BlcmF0b3IgKyAoIGNvbnN0IEN2TUFUJiBiLCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF8oICZiLCBhLmEsIGEuYWxwaGEgKTsgIH0KKworLyogLW1hdF9hZGQgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX0FERF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCAtMSwgYS5iLCAtYS5iZXRhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdF9zY2FsZWQxIC0gbWF0MiAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yIC0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsICZiLCAtMSApOyB9CisKKy8qIG1hdF9hZGQgPSBtYXQxIC0gbWF0X3NjYWxlZDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREXyBvcGVyYXRvciAtICggY29uc3QgQ3ZNQVQmIGIsIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREXyggJmIsIGEuYSwgLWEuYWxwaGEgKTsgfQorCisvKiBtYXRfYWRkID0gbWF0X3NjYWxlZF9zaGlmdGVkMSArIG1hdDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciArICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCBhLmFscGhhLCAmYiwgMSwgYS5iZXRhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdDEgKyBtYXRfc2NhbGVkX3NoaWZ0ZWQyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgKyAoIGNvbnN0IEN2TUFUJiBiLCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYS5hbHBoYSwgJmIsIDEsIGEuYmV0YSApOyB9CisKKy8qIG1hdF9hZGQgPSBtYXRfc2NhbGVkX3NoaWZ0ZWQxIC0gbWF0MiAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yIC0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsICZiLCAtMSwgYS5iZXRhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdDEgLSBtYXRfc2NhbGVkX3NoaWZ0ZWQyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgLSAoIGNvbnN0IEN2TUFUJiBiLCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgLWEuYWxwaGEsICZiLCAxLCAtYS5iZXRhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdF9zY2FsZWRfc2hpZnRlZDEgKyBtYXRfc2NhbGVkMiAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfU0NBTEVfU0hJRlRfJiBhLCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYS5hbHBoYSwgYi5hLCBiLmFscGhhLCBhLmJldGEgKTsgfQorCisvKiBtYXRfYWRkID0gbWF0X3NjYWxlZDEgKyBtYXRfc2NhbGVkX3NoaWZ0ZWQyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgKyAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIsIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCBhLmFscGhhLCBiLmEsIGIuYWxwaGEsIGEuYmV0YSApOyB9CisKKy8qIG1hdF9hZGQgPSBtYXRfc2NhbGVkX3NoaWZ0ZWQxIC0gbWF0X3NjYWxlZDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsIGIuYSwgLWIuYWxwaGEsIGEuYmV0YSApOyB9CisKKy8qIG1hdF9hZGQgPSBtYXRfc2NhbGVkMSAtIG1hdF9zY2FsZWRfc2hpZnRlZDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYiwgY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIC1hLmFscGhhLCBiLmEsIGIuYWxwaGEsIC1hLmJldGEgKTsgfQorCisvKiBtYXRfYWRkID0gbWF0X3NjYWxlZDEgKyBtYXRfc2NhbGVkMiAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhLCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYS5hbHBoYSwgYi5hLCBiLmFscGhhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdF9zY2FsZWQxIC0gbWF0X3NjYWxlZDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsIGIuYSwgLWIuYWxwaGEgKTsgfQorCisvKiBtYXRfYWRkID0gbWF0X3NjYWxlZF9zaGlmdGVkMSArIG1hdF9zY2FsZWRfc2hpZnRlZDIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciArICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsIGIuYSwgYi5hbHBoYSwgYS5iZXRhICsgYi5iZXRhICk7IH0KKworLyogbWF0X2FkZCA9IG1hdF9zY2FsZWRfc2hpZnRlZDEgLSBtYXRfc2NhbGVkX3NoaWZ0ZWQyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgLSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCBhLmFscGhhLCBiLmEsIC1iLmFscGhhLCBhLmJldGEgLSBiLmJldGEgKTsgfQorCisvKiBtYXRfYWRkMiA9IG1hdF9hZGQxICsgc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgKyAoIGNvbnN0IF9Ddk1BVF9BRERfRVhfJiBhLCBkb3VibGUgZ2FtbWEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCBhLmFscGhhLCBhLmIsIGEuYmV0YSwgYS5nYW1tYSArIGdhbW1hICk7IH0KKworLyogbWF0X2FkZDIgPSBzY2FsYXIgKyBtYXRfYWRkMSAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICsgKCBkb3VibGUgZ2FtbWEsIGNvbnN0IF9Ddk1BVF9BRERfRVhfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYS5hbHBoYSwgYS5iLCBhLmJldGEsIGEuZ2FtbWEgKyBnYW1tYSApOyB9CisKKy8qIG1hdF9hZGQyID0gbWF0X2FkZDEgLSBzY2FsYXIgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX0FERF9FWF8mIGEsIGRvdWJsZSBnYW1tYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEsIGEuYiwgYS5iZXRhLCBhLmdhbW1hIC0gZ2FtbWEgKTsgfQorCisvKiBtYXRfYWRkMiA9IHNjYWxhciAtIG1hdF9hZGQxICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgLSAoIGRvdWJsZSBnYW1tYSwgY29uc3QgX0N2TUFUX0FERF9FWF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCAtYS5hbHBoYSwgYS5iLCAtYS5iZXRhLCBnYW1tYSAtIGEuZ2FtbWEgKTsgfQorCisvKiBtYXRfYWRkMiA9IG1hdF9hZGQxICogc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX0FERF9FWF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9BRERfRVhfJiBhLCBkb3VibGUgYWxwaGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCBhLmFscGhhKmFscGhhLCBhLmIsIGEuYmV0YSphbHBoYSwgYS5nYW1tYSphbHBoYSApOyB9CisKKy8qIG1hdF9hZGQyID0gc2NhbGFyICogbWF0X2FkZDEgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAqICggZG91YmxlIGFscGhhLCBjb25zdCBfQ3ZNQVRfQUREX0VYXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIGEuYWxwaGEqYWxwaGEsIGEuYiwgYS5iZXRhKmFscGhhLCBhLmdhbW1hKmFscGhhICk7IH0KKworLyogbWF0X2FkZDIgPSBtYXRfYWRkMSArIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfQUREXyYgYSwgZG91YmxlIGdhbW1hICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgMSwgYS5iLCBhLmJldGEsIGdhbW1hICk7IH0KKworLyogbWF0X2FkZDIgPSBzY2FsYXIgKyBtYXRfYWRkMSAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICsgKCBkb3VibGUgZ2FtbWEsIGNvbnN0IF9Ddk1BVF9BRERfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgMSwgYS5iLCBhLmJldGEsIGdhbW1hICk7IH0KKworLyogbWF0X2FkZDIgPSBtYXRfYWRkMSAtIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yIC0gKCBjb25zdCBfQ3ZNQVRfQUREXyYgYSwgZG91YmxlIGdhbW1hICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgMSwgYS5iLCBhLmJldGEsIC1nYW1tYSApOyB9CisKKy8qIG1hdF9hZGQyID0gc2NhbGFyIC0gbWF0X2FkZDEgKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggZG91YmxlIGdhbW1hLCBjb25zdCBfQ3ZNQVRfQUREXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9BRERfRVhfKCBhLmEsIC0xLCBhLmIsIC1hLmJldGEsIGdhbW1hICk7IH0KKworLyogbWF0X2FkZDIgPSBtYXRfYWRkMSAqIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfQUREXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYWxwaGEsIGEuYiwgYS5iZXRhKmFscGhhLCAwICk7IH0KKworLyogbWF0X2FkZDIgPSBzY2FsYXIgKiBtYXRfYWRkMSAqLworaW5saW5lIF9Ddk1BVF9BRERfRVhfIG9wZXJhdG9yICogKCBkb3VibGUgYWxwaGEsIGNvbnN0IF9Ddk1BVF9BRERfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0FERF9FWF8oIGEuYSwgYWxwaGEsIGEuYiwgYS5iZXRhKmFscGhhLCAwICk7IH0KKworLyogLW1hdF9hZGRfZXggKi8KK2lubGluZSBfQ3ZNQVRfQUREX0VYXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX0FERF9FWF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQUREX0VYXyggYS5hLCAtYS5hbHBoYSwgYS5iLCAtYS5iZXRhLCAtYS5nYW1tYSApOyB9CisKKworLyoKKyogUEFSVCBJSS4gTWF0cml4IG11bHRpcGxpY2F0aW9uLgorKi8KKworLyogbW11bCA9IG1hdDEgKiBtYXQyICovCitpbmxpbmUgX0N2TUFUX01VTF8gb3BlcmF0b3IgKiAoIGNvbnN0IEN2TUFUJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCAmYSwgJmIsIDAgKTsgICAgfQorCisvKiBtbXVsID0gKG1hdDFedCkgKiBtYXQyICovCitpbmxpbmUgX0N2TUFUX01VTF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9UXyYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMXyggJmEuYSwgJmIsIGEuYWxwaGEsIDEgKTsgICB9CisKKy8qIG1tdWwgPSBtYXQxICogKG1hdDJedCkgKi8KK2lubGluZSBfQ3ZNQVRfTVVMXyBvcGVyYXRvciAqICggY29uc3QgQ3ZNQVQmIGIsIGNvbnN0IF9Ddk1BVF9UXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCAmYiwgJmEuYSwgYS5hbHBoYSwgMiApOyAgfQorCisvKiBtbXVsID0gKG1hdDFedCkgKiAobWF0Ml50KSAqLworaW5saW5lIF9Ddk1BVF9NVUxfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfVF8mIGEsIGNvbnN0IF9Ddk1BVF9UXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCAmYS5hLCAmYi5hLCBhLmFscGhhKmIuYWxwaGEsIDMgKTsgIH0KKworLyogbW11bCA9IG1hdF9zY2FsZWQxICogbWF0MiAqLworaW5saW5lIF9Ddk1BVF9NVUxfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCBhLmEsICZiLCBhLmFscGhhLCAwICk7IH0KKworLyogbW11bCA9IG1hdDEgKiBtYXRfc2NhbGVkMiAqLworaW5saW5lIF9Ddk1BVF9NVUxfIG9wZXJhdG9yICogKCBjb25zdCBDdk1BVCYgYiwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCAmYiwgYS5hLCBhLmFscGhhLCAwICk7IH0KKworLyogbW11bCA9IChtYXQxXnQpICogbWF0X3NjYWxlZDEgKi8KK2lubGluZSBfQ3ZNQVRfTVVMXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1RfJiBhLCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF8oICZhLmEsIGIuYSwgYS5hbHBoYSpiLmFscGhhLCAxICk7IH0KKworLyogbW11bCA9IG1hdF9zY2FsZWQxICogKG1hdDJedCkgKi8KK2lubGluZSBfQ3ZNQVRfTVVMXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYiwgY29uc3QgX0N2TUFUX1RfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF8oIGIuYSwgJmEuYSwgYS5hbHBoYSpiLmFscGhhLCAyICk7IH0KKworLyogbW11bCA9IG1hdF9zY2FsZWQxICogbWF0X3NjYWxlZDIgKi8KK2lubGluZSBfQ3ZNQVRfTVVMXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSwgY29uc3QgX0N2TUFUX1NDQUxFXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfKCBhLmEsIGIuYSwgYS5hbHBoYSpiLmFscGhhLCAwICk7IH0KKworLyogbW11bDIgPSBtbXVsMSAqIHNjYWxhciAqLworaW5saW5lIF9Ddk1BVF9NVUxfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfTVVMXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF8oIGEuYSwgYS5iLCBhLmFscGhhKmFscGhhLCBhLnRfYWIgKTsgfQorCisvKiBtbXVsMiA9IHNjYWxhciAqIG1tdWwxICovCitpbmxpbmUgX0N2TUFUX01VTF8gb3BlcmF0b3IgKiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgX0N2TUFUX01VTF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMXyggYS5hLCBhLmIsIGEuYWxwaGEqYWxwaGEsIGEudF9hYiApOyB9CisKKy8qIC1tbXVsICovCitpbmxpbmUgX0N2TUFUX01VTF8gb3BlcmF0b3IgLSAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF8oIGEuYSwgYS5iLCAtYS5hbHBoYSwgYS50X2FiICk7IH0KKworLyogbW11bGFkZCA9IG1tdWwgKyBtYXQgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgKyAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCBhLmIsIGEuYWxwaGEsICZiLCAxLCBhLnRfYWIgKTsgfQorCisvKiAhISEgQ29tbWVudCB0aGlzIG9mZiBiZWNhdXNlIG9mIGFtYmlnb3VzIGNvbnZlcnNpb24gZXJyb3IgISEhCisgICBtbXVsYWRkID0gbWF0ICsgbW11bCAqLworLyogaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciArICggY29uc3QgQ3ZNQVQmIGIsIGNvbnN0IF9Ddk1BVF9NVUxfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF9BRERfKCBhLmEsIGEuYiwgYS5hbHBoYSwgJmIsIDEsIGEudF9hYiApOyB9Ki8KKworLyogbW11bGFkZCA9IG1tdWwgLSBtYXQgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgLSAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCBhLmIsIGEuYWxwaGEsICZiLCAtMSwgYS50X2FiICk7IH0KKworLyogISEhIENvbW1lbnQgdGhpcyBvZmYgYmVjYXVzZSBvZiBhbWJpZ291cyBjb252ZXJzaW9uIGVycm9yICEhIQorICAgbW11bGFkZCA9IG1hdCAtIG1tdWwgKi8KKy8qaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAtICggY29uc3QgQ3ZNQVQmIGIsIGNvbnN0IF9Ddk1BVF9NVUxfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF9BRERfKCBhLmEsIGEuYiwgLWEuYWxwaGEsICZiLCAxLCBhLnRfYWIgKTsgfSovCisKKy8qIG1tdWxhZGQgPSBtbXVsICsgbWF0X3NjYWxlZCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciArICggY29uc3QgX0N2TUFUX01VTF8mIGEsIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCBhLmFscGhhLCBiLmEsIGIuYWxwaGEsIGEudF9hYiApOyB9CisKKy8qIG1tdWxhZGQgPSBtYXRfc2NhbGVkICsgbW11bCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciArICggY29uc3QgX0N2TUFUX1NDQUxFXyYgYiwgY29uc3QgX0N2TUFUX01VTF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCBhLmFscGhhLCBiLmEsIGIuYWxwaGEsIGEudF9hYiApOyB9CisKKy8qIG1tdWxhZGQgPSBtbXVsIC0gbWF0X3NjYWxlZCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX01VTF8mIGEsIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCBhLmFscGhhLCBiLmEsIC1iLmFscGhhLCBhLnRfYWIgKTsgfQorCisvKiBtbXVsYWRkID0gbWF0X3NjYWxlZCAtIG1tdWwgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgLSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIsIGNvbnN0IF9Ddk1BVF9NVUxfJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF9BRERfKCBhLmEsIGEuYiwgLWEuYWxwaGEsIGIuYSwgYi5hbHBoYSwgYS50X2FiICk7IH0KKworLyogbW11bGFkZCA9IG1tdWwgKyAobWF0XnQpICovCitpbmxpbmUgX0N2TUFUX01VTF9BRERfIG9wZXJhdG9yICsgKCBjb25zdCBfQ3ZNQVRfTVVMXyYgYSwgY29uc3QgX0N2TUFUX1RfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX01VTF9BRERfKCBhLmEsIGEuYiwgYS5hbHBoYSwgJmIuYSwgYi5hbHBoYSwgYS50X2FiICsgNCApOyAgfQorCisvKiBtbXVsYWRkID0gKG1hdF50KSArIG1tdWwgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgKyAoIGNvbnN0IF9Ddk1BVF9UXyYgYiwgY29uc3QgX0N2TUFUX01VTF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCBhLmFscGhhLCAmYi5hLCBiLmFscGhhLCBhLnRfYWIgKyA0ICk7ICB9CisKKy8qIG1tdWxhZGQgPSBtbXVsIC0gKG1hdF50KSAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX01VTF8mIGEsIGNvbnN0IF9Ddk1BVF9UXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCBhLmIsIGEuYWxwaGEsICZiLmEsIC1iLmFscGhhLCBhLnRfYWIgKyA0ICk7ICB9CisKKy8qIG1tdWxhZGQgPSAobWF0XnQpIC0gbW11bCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAtICggY29uc3QgX0N2TUFUX1RfJiBiLCBjb25zdCBfQ3ZNQVRfTVVMXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCBhLmIsIC1hLmFscGhhLCAmYi5hLCBiLmFscGhhLCBhLnRfYWIgKyA0ICk7ICB9CisKKworLyogbW11bGFkZCA9IG1hdF9zY2FsZWRfc2hpZnRlZCAqIG1hdCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAqICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgJmIsIGEuYWxwaGEsICZiLCBhLmJldGEsIDAgKTsgIH0KKworLyogbW11bGFkZCA9IG1hdCAqIG1hdF9zY2FsZWRfc2hpZnRlZCAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAqICggY29uc3QgQ3ZNQVQmIGIsIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oICZiLCBhLmEsIGEuYWxwaGEsICZiLCBhLmJldGEsIDAgKTsgIH0KKworLyogbW11bGFkZCA9IG1hdF9zY2FsZWRfc2hpZnRlZCAqIG1hdF9zY2FsZWQgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEsIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYi5hLCBhLmFscGhhKmIuYWxwaGEsIGIuYSwgYS5iZXRhKmIuYWxwaGEsIDAgKTsgIH0KKworLyogbW11bGFkZCA9IG1hdF9zY2FsZWQgKiBtYXRfc2NhbGVkX3NoaWZ0ZWQgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIGIsIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGIuYSwgYS5hLCBhLmFscGhhKmIuYWxwaGEsIGIuYSwgYS5iZXRhKmIuYWxwaGEsIDAgKTsgIH0KKworLyogbW11bGFkZCA9IG1hdF9zY2FsZWRfc2hpZnRlZCAqIChtYXRedCkgKi8KK2lubGluZSBfQ3ZNQVRfTVVMX0FERF8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEsIGNvbnN0IF9Ddk1BVF9UXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCAmYi5hLCBhLmFscGhhKmIuYWxwaGEsICZiLmEsIGEuYmV0YSpiLmFscGhhLCA2ICk7ICB9CisKKy8qIG1tdWxhZGQgPSAobWF0XnQpICogbWF0X3NjYWxlZF9zaGlmdGVkICovCitpbmxpbmUgX0N2TUFUX01VTF9BRERfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfVF8mIGIsIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oICZiLmEsIGEuYSwgYS5hbHBoYSpiLmFscGhhLCAmYi5hLCBhLmJldGEqYi5hbHBoYSwgNSApOyAgfQorCisvKiBtbXVsYWRkMiA9IG1tdWxhZGQxICogc2NhbGFyICovCitpbmxpbmUgX0N2TUFUX01VTF9BRERfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfTVVMX0FERF8mIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9NVUxfQUREXyggYS5hLCBhLmIsIGEuYWxwaGEqYWxwaGEsIGEuYywgYS5iZXRhKmFscGhhLCBhLnRfYWJjICk7IH0KKworLyogbW11bGFkZDIgPSBzY2FsYXIgKiBtbXVsYWRkMSAqLworaW5saW5lIF9Ddk1BVF9NVUxfQUREXyBvcGVyYXRvciAqICggZG91YmxlIGFscGhhLCBjb25zdCBfQ3ZNQVRfTVVMX0FERF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCBhLmFscGhhKmFscGhhLCBhLmMsIGEuYmV0YSphbHBoYSwgYS50X2FiYyApOyB9CisKKy8qIC1tbXVsYWRkICovCitpbmxpbmUgX0N2TUFUX01VTF9BRERfIG9wZXJhdG9yIC0gKCBjb25zdCBfQ3ZNQVRfTVVMX0FERF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTVVMX0FERF8oIGEuYSwgYS5iLCAtYS5hbHBoYSwgYS5jLCAtYS5iZXRhLCBhLnRfYWJjICk7IH0KKworLyogaW52KGEpKmIsIGkuZS4gc29sdmUgYSp4ID0gYiAqLworaW5saW5lIF9Ddk1BVF9TT0xWRV8gb3BlcmF0b3IgKiAoIGNvbnN0IF9Ddk1BVF9JTlZfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9TT0xWRV8oICZhLmEsICZiLCBhLm1ldGhvZCApOyAgICB9CisKKworLyoKKyogUEFSVCBJSUkuIExvZ2ljYWwgb3BlcmF0aW9ucworKi8KK2lubGluZSBfQ3ZNQVRfTk9UXyBvcGVyYXRvciB+ICggY29uc3QgQ3ZNQVQmIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfTk9UXygmYSk7IH0KKworaW5saW5lIF9Ddk1BVF9MT0dJQ18gb3BlcmF0b3IgJiAoIGNvbnN0IEN2TUFUJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9MT0dJQ18oICZhLCAmYiwgX0N2TUFUX0xPR0lDXzo6QU5ELCAwICk7IH0KKworaW5saW5lIF9Ddk1BVF9MT0dJQ18gb3BlcmF0b3IgJiAoIGNvbnN0IF9Ddk1BVF9OT1RfJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9MT0dJQ18oIGEuYSwgJmIsIF9Ddk1BVF9MT0dJQ186OkFORCwgMSApOyB9CisKK2lubGluZSBfQ3ZNQVRfTE9HSUNfIG9wZXJhdG9yICYgKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgX0N2TUFUX05PVF8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTE9HSUNfKCAmYSwgYi5hLCBfQ3ZNQVRfTE9HSUNfOjpBTkQsIDIgKTsgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciAmICggY29uc3QgX0N2TUFUX05PVF8mIGEsIGNvbnN0IF9Ddk1BVF9OT1RfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggYS5hLCBiLmEsIF9Ddk1BVF9MT0dJQ186OkFORCwgMyApOyB9CisKKworaW5saW5lIF9Ddk1BVF9MT0dJQ18gb3BlcmF0b3IgfCAoIGNvbnN0IEN2TUFUJiBhLCBjb25zdCBDdk1BVCYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9MT0dJQ18oICZhLCAmYiwgX0N2TUFUX0xPR0lDXzo6T1IsIDAgKTsgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciB8ICggY29uc3QgX0N2TUFUX05PVF8mIGEsIGNvbnN0IEN2TUFUJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggYS5hLCAmYiwgX0N2TUFUX0xPR0lDXzo6T1IsIDEgKTsgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciB8ICggY29uc3QgQ3ZNQVQmIGEsIGNvbnN0IF9Ddk1BVF9OT1RfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggJmEsIGIuYSwgX0N2TUFUX0xPR0lDXzo6T1IsIDIgKTsgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciB8ICggY29uc3QgX0N2TUFUX05PVF8mIGEsIGNvbnN0IF9Ddk1BVF9OT1RfJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggYS5hLCBiLmEsIF9Ddk1BVF9MT0dJQ186Ok9SLCAzICk7IH0KKworCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciBeICggY29uc3QgQ3ZNQVQmIGEsIGNvbnN0IEN2TUFUJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggJmEsICZiLCBfQ3ZNQVRfTE9HSUNfOjpYT1IsIDAgKTsgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXyBvcGVyYXRvciBeICggY29uc3QgX0N2TUFUX05PVF8mIGEsIGNvbnN0IEN2TUFUJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0xPR0lDXyggYS5hLCAmYiwgX0N2TUFUX0xPR0lDXzo6WE9SLCAxICk7IH0KKworaW5saW5lIF9Ddk1BVF9MT0dJQ18gb3BlcmF0b3IgXiAoIGNvbnN0IEN2TUFUJiBhLCBjb25zdCBfQ3ZNQVRfTk9UXyYgYiApCit7ICAgcmV0dXJuIF9Ddk1BVF9MT0dJQ18oICZhLCBiLmEsIF9Ddk1BVF9MT0dJQ186OlhPUiwgMiApOyB9CisKK2lubGluZSBfQ3ZNQVRfTE9HSUNfIG9wZXJhdG9yIF4gKCBjb25zdCBfQ3ZNQVRfTk9UXyYgYSwgY29uc3QgX0N2TUFUX05PVF8mIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfTE9HSUNfKCBhLmEsIGIuYSwgX0N2TUFUX0xPR0lDXzo6WE9SLCAzICk7IH0KKworCitpbmxpbmUgX0N2TUFUX1VOX0xPR0lDXyBvcGVyYXRvciAmICggY29uc3QgQ3ZNQVQmIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9VTl9MT0dJQ18oICZhLCBhbHBoYSwgX0N2TUFUX0xPR0lDXzo6QU5ELCAwICk7IH0KKworaW5saW5lIF9Ddk1BVF9VTl9MT0dJQ18gb3BlcmF0b3IgJiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgQ3ZNQVQmIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVU5fTE9HSUNfKCAmYSwgYWxwaGEsIF9Ddk1BVF9MT0dJQ186OkFORCwgMCApOyB9CisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfIG9wZXJhdG9yICYgKCBjb25zdCBfQ3ZNQVRfTk9UXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX1VOX0xPR0lDXyggYS5hLCBhbHBoYSwgX0N2TUFUX0xPR0lDXzo6QU5ELCAxICk7IH0KKworaW5saW5lIF9Ddk1BVF9VTl9MT0dJQ18gb3BlcmF0b3IgJiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgX0N2TUFUX05PVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVU5fTE9HSUNfKCBhLmEsIGFscGhhLCBfQ3ZNQVRfTE9HSUNfOjpBTkQsIDEgKTsgfQorCisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfIG9wZXJhdG9yIHwgKCBjb25zdCBDdk1BVCYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX1VOX0xPR0lDXyggJmEsIGFscGhhLCBfQ3ZNQVRfTE9HSUNfOjpPUiwgMCApOyB9CisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfIG9wZXJhdG9yIHwgKCBkb3VibGUgYWxwaGEsIGNvbnN0IEN2TUFUJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX1VOX0xPR0lDXyggJmEsIGFscGhhLCBfQ3ZNQVRfTE9HSUNfOjpPUiwgMCApOyB9CisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfIG9wZXJhdG9yIHwgKCBjb25zdCBfQ3ZNQVRfTk9UXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX1VOX0xPR0lDXyggYS5hLCBhbHBoYSwgX0N2TUFUX0xPR0lDXzo6T1IsIDEgKTsgfQorCitpbmxpbmUgX0N2TUFUX1VOX0xPR0lDXyBvcGVyYXRvciB8ICggZG91YmxlIGFscGhhLCBjb25zdCBfQ3ZNQVRfTk9UXyYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9VTl9MT0dJQ18oIGEuYSwgYWxwaGEsIF9Ddk1BVF9MT0dJQ186Ok9SLCAxICk7IH0KKworCitpbmxpbmUgX0N2TUFUX1VOX0xPR0lDXyBvcGVyYXRvciBeICggY29uc3QgQ3ZNQVQmIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9VTl9MT0dJQ18oICZhLCBhbHBoYSwgX0N2TUFUX0xPR0lDXzo6WE9SLCAwICk7IH0KKworaW5saW5lIF9Ddk1BVF9VTl9MT0dJQ18gb3BlcmF0b3IgXiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgQ3ZNQVQmIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVU5fTE9HSUNfKCAmYSwgYWxwaGEsIF9Ddk1BVF9MT0dJQ186OlhPUiwgMCApOyB9CisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfIG9wZXJhdG9yIF4gKCBjb25zdCBfQ3ZNQVRfTk9UXyYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX1VOX0xPR0lDXyggYS5hLCBhbHBoYSwgX0N2TUFUX0xPR0lDXzo6WE9SLCAxICk7IH0KKworaW5saW5lIF9Ddk1BVF9VTl9MT0dJQ18gb3BlcmF0b3IgXiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgX0N2TUFUX05PVF8mIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfVU5fTE9HSUNfKCBhLmEsIGFscGhhLCBfQ3ZNQVRfTE9HSUNfOjpYT1IsIDEgKTsgfQorCisKKy8qCisqIFBBUlQgSVYuIENvbXBhcmlzb24gb3BlcmF0aW9ucworKi8KK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciA+ICggY29uc3QgQ3ZNQVQmIGEsIGNvbnN0IEN2TUFUJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCAmYiwgQ1ZfQ01QX0dUICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yID49ICggY29uc3QgQ3ZNQVQmIGEsIGNvbnN0IEN2TUFUJiBiICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCAmYiwgQ1ZfQ01QX0dFICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yIDwgKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsICZiLCBDVl9DTVBfTFQgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgPD0gKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsICZiLCBDVl9DTVBfTEUgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgPT0gKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsICZiLCBDVl9DTVBfRVEgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgIT0gKCBjb25zdCBDdk1BVCYgYSwgY29uc3QgQ3ZNQVQmIGIgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsICZiLCBDVl9DTVBfTkUgKTsgfQorCisKK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciA+ICggY29uc3QgQ3ZNQVQmIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9DTVBfKCAmYSwgYWxwaGEsIENWX0NNUF9HVCApOyB9CisKK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciA+ICggZG91YmxlIGFscGhhLCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9DTVBfKCAmYSwgYWxwaGEsIENWX0NNUF9MVCApOyB9CisKK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciA+PSAoIGNvbnN0IEN2TUFUJiBhLCBkb3VibGUgYWxwaGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsIGFscGhhLCBDVl9DTVBfR0UgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgPj0gKCBkb3VibGUgYWxwaGEsIGNvbnN0IEN2TUFUJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCBhbHBoYSwgQ1ZfQ01QX0xFICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yIDwgKCBjb25zdCBDdk1BVCYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCBhbHBoYSwgQ1ZfQ01QX0xUICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yIDwgKCBkb3VibGUgYWxwaGEsIGNvbnN0IEN2TUFUJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCBhbHBoYSwgQ1ZfQ01QX0dUICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yIDw9ICggY29uc3QgQ3ZNQVQmIGEsIGRvdWJsZSBhbHBoYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9DTVBfKCAmYSwgYWxwaGEsIENWX0NNUF9MRSApOyB9CisKK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciA8PSAoIGRvdWJsZSBhbHBoYSwgY29uc3QgQ3ZNQVQmIGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsIGFscGhhLCBDVl9DTVBfR0UgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgPT0gKCBjb25zdCBDdk1BVCYgYSwgZG91YmxlIGFscGhhICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCBhbHBoYSwgQ1ZfQ01QX0VRICk7IH0KKworaW5saW5lIF9Ddk1BVF9DTVBfIG9wZXJhdG9yID09ICggZG91YmxlIGFscGhhLCBjb25zdCBDdk1BVCYgYSApCit7ICAgcmV0dXJuIF9Ddk1BVF9DTVBfKCAmYSwgYWxwaGEsIENWX0NNUF9FUSApOyB9CisKK2lubGluZSBfQ3ZNQVRfQ01QXyBvcGVyYXRvciAhPSAoIGNvbnN0IEN2TUFUJiBhLCBkb3VibGUgYWxwaGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfQ01QXyggJmEsIGFscGhhLCBDVl9DTVBfTkUgKTsgfQorCitpbmxpbmUgX0N2TUFUX0NNUF8gb3BlcmF0b3IgIT0gKCBkb3VibGUgYWxwaGEsIGNvbnN0IEN2TUFUJiBhICkKK3sgICByZXR1cm4gX0N2TUFUX0NNUF8oICZhLCBhbHBoYSwgQ1ZfQ01QX05FICk7IH0KKworCisvKgorKiBQQVJUIFYuIFNwZWVkdXAgZm9yIHNvbWUgYXVnbWVudGVkIGFzc2lnbm1lbnRzIHRvIEN2TUFUCisqLworCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciArPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIHNjYWxlX21hdCApCit7ICAgcmV0dXJuICgqdGhpcyA9ICp0aGlzICsgc2NhbGVfbWF0KTsgfQorCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciArPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIHNjYWxlX21hdCApCit7ICAgcmV0dXJuICgqdGhpcyA9ICp0aGlzICsgc2NhbGVfbWF0KTsgfQorCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciArPSAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBtbXVsICkKK3sgICByZXR1cm4gKCp0aGlzID0gbW11bCArICp0aGlzKTsgIH0KKworaW5saW5lIEN2TUFUJiBDdk1BVDo6b3BlcmF0b3IgLT0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBzY2FsZV9tYXQgKQoreyAgIHJldHVybiAoKnRoaXMgPSAqdGhpcyAtIHNjYWxlX21hdCk7ICB9CisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yIC09ICggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgc2NhbGVfbWF0ICkKK3sgICByZXR1cm4gKCp0aGlzID0gKnRoaXMgLSBzY2FsZV9tYXQpOyAgfQorCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciAtPSAoIGNvbnN0IF9Ddk1BVF9NVUxfJiBtbXVsICkKK3sgICByZXR1cm4gKCp0aGlzID0gLW1tdWwgKyAqdGhpcyk7ICB9CisKK2lubGluZSBDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yICo9ICggY29uc3QgX0N2TUFUX1NDQUxFXyYgc2NhbGVfbWF0ICkKK3sgICByZXR1cm4gKCp0aGlzID0gKnRoaXMgKiBzY2FsZV9tYXQpOyAgfQorCitpbmxpbmUgQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciAqPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIHNjYWxlX21hdCApCit7ICAgcmV0dXJuICgqdGhpcyA9ICp0aGlzICogc2NhbGVfbWF0KTsgIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgbWlzYy4gb3BlcmF0aW9ucyBvbiB0ZW1wb3JhcnkgbWF0cmljZXMgKCssLSwqKSAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorKiB0aGUgYmFzZSBwcm94eSBjbGFzcyBpbXBsZW1lbnRhdGlvbgorKi8KKworLyogYS4qYiAqLworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIF9Ddk1BVF9CQVNFX09QXzo6bXVsKCBjb25zdCBDdk1BVCYgYSApIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLm11bChhKTsgIH0KKworLyogYS4qYiphbHBoYSAqLworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIF9Ddk1BVF9CQVNFX09QXzo6bXVsKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBhICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykubXVsKGEpOyAgfQorCisvKiBhLi9iICovCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gX0N2TUFUX0JBU0VfT1BfOjpkaXYoIGNvbnN0IEN2TUFUJiBhICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykuZGl2KGEpOyAgfQorCisvKiBhLi8oYiphbHBoYSkgKi8KK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfQkFTRV9PUF86OmRpdiggY29uc3QgX0N2TUFUX1NDQUxFXyYgYSApIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLmRpdihhKTsgIH0KKworLyogYS5tYXgoYikgKi8KK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfQkFTRV9PUF86Om1pbiggY29uc3QgQ3ZNQVQmIGEgKSBjb25zdAoreyAgIHJldHVybiAoKEN2TUFUKSp0aGlzKS5taW4oYSk7ICB9CisKKy8qIGEubWluKGIpICovCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gX0N2TUFUX0JBU0VfT1BfOjptYXgoIGNvbnN0IEN2TUFUJiBhICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykubWF4KGEpOyAgfQorCisvKiBhLm1heChhbHBoYSkgKi8KK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfQkFTRV9PUF86Om1pbiggZG91YmxlIGFscGhhICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykubWluKGFscGhhKTsgIH0KKworLyogYS5taW4oYWxwaGEpICovCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gX0N2TUFUX0JBU0VfT1BfOjptYXgoIGRvdWJsZSBhbHBoYSApIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLm1heChhbHBoYSk7ICB9CisKKworaW5saW5lIF9Ddk1BVF9JTlZfICBfQ3ZNQVRfQkFTRV9PUF86OmludiggaW50IG1ldGhvZCApIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLmludihtZXRob2QpOyAgfQorCitpbmxpbmUgX0N2TUFUX1RfICBfQ3ZNQVRfQkFTRV9PUF86OnQoKSBjb25zdAoreyAgIHJldHVybiAoKEN2TUFUKSp0aGlzKS50KCk7ICB9CisKK2lubGluZSBfQ3ZNQVRfQ1ZUXyBfQ3ZNQVRfQkFTRV9PUF86OmN2dCggaW50IG5ld2RlcHRoLCBkb3VibGUgc2NhbGUsIGRvdWJsZSBzaGlmdCApIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLmN2dCggbmV3ZGVwdGgsIHNjYWxlLCBzaGlmdCApOyB9CisKK2lubGluZSBDdk1BVCAgX0N2TUFUX0JBU0VfT1BfOjpyb3coIGludCByICkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoKEN2TUFUKSp0aGlzLCAwLCByICk7IH0KKworaW5saW5lIEN2TUFUICBfQ3ZNQVRfQkFTRV9PUF86OnJvd3JhbmdlKCBpbnQgcm93MSwgaW50IHJvdzIgKSBjb25zdAoreyAgIAorICAgIEN2TUFUIG0gPSAoQ3ZNQVQpKnRoaXM7CisgICAgYXNzZXJ0KCAwIDw9IHJvdzEgJiYgcm93MSA8IHJvdzIgJiYgcm93MiA8PSBtLmhlaWdodCApOworICAgIHJldHVybiBDdk1BVCggbSwgY3ZSZWN0KCAwLCByb3cxLCBtLndpZHRoLCByb3cyIC0gcm93MSApKTsKK30KKworaW5saW5lIEN2TUFUICBfQ3ZNQVRfQkFTRV9PUF86OmNvbCggaW50IGMgKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKEN2TUFUKSp0aGlzLCAxLCBjICk7IH0KKworaW5saW5lIEN2TUFUICBfQ3ZNQVRfQkFTRV9PUF86OmNvbHJhbmdlKCBpbnQgY29sMSwgaW50IGNvbDIgKSBjb25zdAoreyAgIAorICAgIEN2TUFUIG0gPSAoQ3ZNQVQpKnRoaXM7CisgICAgYXNzZXJ0KCAwIDw9IGNvbDEgJiYgY29sMSA8IGNvbDIgJiYgY29sMiA8PSBtLndpZHRoICk7CisgICAgcmV0dXJuIEN2TUFUKCBtLCBjdlJlY3QoIGNvbDEsIDAsIGNvbDIgLSBjb2wxLCBtLmhlaWdodCApKTsKK30KKworaW5saW5lIEN2TUFUICBfQ3ZNQVRfQkFTRV9PUF86OnJlY3QoIEN2UmVjdCByICkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoIChDdk1BVCkqdGhpcywgciApOyB9CisKK2lubGluZSBDdk1BVCAgX0N2TUFUX0JBU0VfT1BfOjpkaWFnKCBpbnQgZCApIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAoQ3ZNQVQpKnRoaXMsIC0xLCBkICk7IH0KKworaW5saW5lIGRvdWJsZSBfQ3ZNQVRfQkFTRV9PUF86OmRldCgpIGNvbnN0Cit7ICAgcmV0dXJuICgoQ3ZNQVQpKnRoaXMpLmRldCgpOyB9CisKK2lubGluZSBkb3VibGUgX0N2TUFUX0JBU0VfT1BfOjpub3JtKCBpbnQgbm9ybV90eXBlICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykubm9ybSggbm9ybV90eXBlICk7IH0KKworaW5saW5lIEN2U2NhbGFyIF9Ddk1BVF9CQVNFX09QXzo6c3VtKCkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykuc3VtKCk7IH0KKworaW5saW5lIGRvdWJsZSBfQ3ZNQVRfQkFTRV9PUF86Om1pbiggQ3ZQb2ludCogbWlubG9jICkgY29uc3QKK3sgICByZXR1cm4gKChDdk1BVCkqdGhpcykubWluKCBtaW5sb2MgKTsgfQorCitpbmxpbmUgZG91YmxlIF9Ddk1BVF9CQVNFX09QXzo6bWF4KCBDdlBvaW50KiBtYXhsb2MgKSBjb25zdAoreyAgIHJldHVybiAoKEN2TUFUKSp0aGlzKS5tYXgoIG1heGxvYyApOyB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5IGNsYXNzZXMgaW1wbGVtZW50YXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBJLiBjb25zdHJ1Y3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnN0cnVjdG9ycyAqLworaW5saW5lIF9Ddk1BVF9DT1BZXzo6X0N2TUFUX0NPUFlfKCBjb25zdCBDdk1BVCogX2EgKSA6IGEoKEN2TUFUKilfYSkgIHt9CisKK2lubGluZSBfQ3ZNQVRfQ1ZUXzo6X0N2TUFUX0NWVF8oIGNvbnN0IEN2TUFUKiBfYSwgaW50IF9uZXdkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfc2NhbGUsIGRvdWJsZSBfc2hpZnQgKSA6CisgICAgYSgqKEN2TUFUKilfYSksIG5ld2RlcHRoKF9uZXdkZXB0aCksIHNjYWxlKF9zY2FsZSksIHNoaWZ0KF9zaGlmdCkgIHt9CisKK2lubGluZSBfQ3ZNQVRfVF86Ol9Ddk1BVF9UXyggY29uc3QgQ3ZNQVQqIF9hICkgOiBhKCooQ3ZNQVQqKV9hKSwgYWxwaGEoMSkgIHt9CisKKworaW5saW5lIF9Ddk1BVF9UXzo6X0N2TUFUX1RfKCBjb25zdCBDdk1BVCogX2EsIGRvdWJsZSBfYWxwaGEgKSA6CisgICAgYSgqKEN2TUFUKilfYSksIGFscGhhKF9hbHBoYSkgIHt9CisKKworaW5saW5lIF9Ddk1BVF9JTlZfOjpfQ3ZNQVRfSU5WXyggY29uc3QgQ3ZNQVQqIF9hLCBpbnQgX21ldGhvZCApIDoKKyAgICBhKCooQ3ZNQVQqKV9hKSwgbWV0aG9kKF9tZXRob2QpIHt9CisKKworaW5saW5lIF9Ddk1BVF9NVUxfOjpfQ3ZNQVRfTVVMXyggY29uc3QgQ3ZNQVQqIF9hLCBjb25zdCBDdk1BVCogX2IsIGludCBfdF9hYiApIDoKKyAgICBhKChDdk1BVCopX2EpLCBiKChDdk1BVCopX2IpLCBhbHBoYSgxKSwgdF9hYihfdF9hYikge30KKworCitpbmxpbmUgX0N2TUFUX01VTF86Ol9Ddk1BVF9NVUxfKCBjb25zdCBDdk1BVCogX2EsIGNvbnN0IEN2TUFUKiBfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfYWxwaGEsIGludCBfdF9hYiApIDoKKyAgICBhKChDdk1BVCopX2EpLCBiKChDdk1BVCopX2IpLCBhbHBoYShfYWxwaGEpLCB0X2FiKF90X2FiKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfTVVMX0FERF86Ol9Ddk1BVF9NVUxfQUREXyggY29uc3QgQ3ZNQVQqIF9hLCBjb25zdCBDdk1BVCogX2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TUFUKiBfYywgaW50IF90X2FiYyApIDoKKyAgICBhKChDdk1BVCopX2EpLCBiKChDdk1BVCopX2IpLCBjKChDdk1BVCopX2MpLCB0X2FiYyhfdF9hYmMpIHt9CisKKworaW5saW5lIF9Ddk1BVF9NVUxfQUREXzo6X0N2TUFUX01VTF9BRERfKCBjb25zdCBDdk1BVCogX2EsIGNvbnN0IEN2TUFUKiBfYiwgZG91YmxlIF9hbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNQVQqIF9jLCBkb3VibGUgX2JldGEsIGludCBfdF9hYmMgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSwgYigoQ3ZNQVQqKV9iKSwgYWxwaGEoX2FscGhhKSwKKyAgICBjKChDdk1BVCopX2MpLCBiZXRhKF9iZXRhKSwgdF9hYmMoX3RfYWJjKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfQUREXzo6X0N2TUFUX0FERF8oIGNvbnN0IEN2TUFUKiBfYSwgY29uc3QgQ3ZNQVQqIF9iLCBkb3VibGUgX2JldGEgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSwgYigoQ3ZNQVQqKV9iKSwgYmV0YShfYmV0YSkge30KKworCitpbmxpbmUgX0N2TUFUX0FERF9FWF86Ol9Ddk1BVF9BRERfRVhfKCBjb25zdCBDdk1BVCogX2EsIGRvdWJsZSBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1BVCogX2IsIGRvdWJsZSBfYmV0YSwgZG91YmxlIF9nYW1tYSApIDoKKyAgICBhKChDdk1BVCopX2EpLCBhbHBoYShfYWxwaGEpLCBiKChDdk1BVCopX2IpLCBiZXRhKF9iZXRhKSwgZ2FtbWEoX2dhbW1hKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfU0NBTEVfOjpfQ3ZNQVRfU0NBTEVfKCBjb25zdCBDdk1BVCogX2EsIGRvdWJsZSBfYWxwaGEgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSwgYWxwaGEoX2FscGhhKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfOjpfQ3ZNQVRfU0NBTEVfU0hJRlRfKCBjb25zdCBDdk1BVCogX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF9hbHBoYSwgZG91YmxlIF9iZXRhICkgOgorICAgIGEoKEN2TUFUKilfYSksIGFscGhhKF9hbHBoYSksIGJldGEoX2JldGEpIHt9CisKKworaW5saW5lIF9Ddk1BVF9MT0dJQ186Ol9Ddk1BVF9MT0dJQ18oIGNvbnN0IEN2TUFUKiBfYSwgY29uc3QgQ3ZNQVQqIF9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ3ZNQVRfTE9HSUNfOjpPcCBfb3AsIGludCBfZmxhZ3MgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSwgYigoQ3ZNQVQqKV9iKSwgb3AoX29wKSwgZmxhZ3MoX2ZsYWdzKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfVU5fTE9HSUNfOjpfQ3ZNQVRfVU5fTE9HSUNfKCBjb25zdCBDdk1BVCogX2EsIGRvdWJsZSBfYWxwaGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0N2TUFUX0xPR0lDXzo6T3AgX29wLCBpbnQgX2ZsYWdzICkgOgorICAgIGEoKEN2TUFUKilfYSksIGFscGhhKF9hbHBoYSksIG9wKF9vcCksIGZsYWdzKF9mbGFncykge30KKworCitpbmxpbmUgX0N2TUFUX05PVF86Ol9Ddk1BVF9OT1RfKCBjb25zdCBDdk1BVCogX2EgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSB7fQorCisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXzo6X0N2TUFUX0RPVF9PUF8oIGNvbnN0IEN2TUFUKiBfYSwgY29uc3QgQ3ZNQVQqIF9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9vcCwgZG91YmxlIF9hbHBoYSApIDoKKyAgICBhKCpfYSksIGIoKEN2TUFUKilfYiksIG9wKF9vcCksIGFscGhhKF9hbHBoYSkge30KKworCitpbmxpbmUgX0N2TUFUX1NPTFZFXzo6X0N2TUFUX1NPTFZFXyggY29uc3QgQ3ZNQVQqIF9hLCBjb25zdCBDdk1BVCogX2IsIGludCBfbWV0aG9kICkgOgorICAgIGEoKEN2TUFUKilfYSksIGIoKEN2TUFUKilfYiksIG1ldGhvZChfbWV0aG9kKSB7fQorCitpbmxpbmUgX0N2TUFUX0NNUF86Ol9Ddk1BVF9DTVBfKCBjb25zdCBDdk1BVCogX2EsIGNvbnN0IEN2TUFUKiBfYiwgaW50IF9jbXBfb3AgKSA6CisgICAgYSgoQ3ZNQVQqKV9hKSwgYigoQ3ZNQVQqKV9iKSwgYWxwaGEoMCksIGNtcF9vcChfY21wX29wKSB7fQorCitpbmxpbmUgX0N2TUFUX0NNUF86Ol9Ddk1BVF9DTVBfKCBjb25zdCBDdk1BVCogX2EsIGRvdWJsZSBfYWxwaGEsIGludCBfY21wX29wICkgOgorICAgIGEoKEN2TUFUKilfYSksIGIoMCksIGFscGhhKF9hbHBoYSksIGNtcF9vcChfY21wX29wKSB7fQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkgY2xhc3NlcyBpbXBsZW1lbnRhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0IElJLiBjb252ZXJzaW9uIHRvIEN2TUFUICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworaW5saW5lIF9Ddk1BVF9UXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX0lOVl86Om9wZXJhdG9yIEN2TUFUKCkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoICp0aGlzICk7ICAgIH0KKworaW5saW5lIF9Ddk1BVF9NVUxfOjpvcGVyYXRvciBDdk1BVCgpIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAqdGhpcyApOyAgICB9CisKK2lubGluZSBfQ3ZNQVRfU0NBTEVfOjpvcGVyYXRvciBDdk1BVCgpIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAqdGhpcyApOyAgICB9CisKK2lubGluZSBfQ3ZNQVRfU0NBTEVfU0hJRlRfOjpvcGVyYXRvciBDdk1BVCgpIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAqdGhpcyApOyAgICB9CisKK2lubGluZSBfQ3ZNQVRfQUREXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX0FERF9FWF86Om9wZXJhdG9yIEN2TUFUKCkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoICp0aGlzICk7ICAgIH0KKworaW5saW5lIF9Ddk1BVF9NVUxfQUREXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX0xPR0lDXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX1VOX0xPR0lDXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX05PVF86Om9wZXJhdG9yIEN2TUFUKCkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoICp0aGlzICk7ICAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfOjpvcGVyYXRvciBDdk1BVCgpIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAqdGhpcyApOyAgICB9CisKK2lubGluZSBfQ3ZNQVRfU09MVkVfOjpvcGVyYXRvciBDdk1BVCgpIGNvbnN0Cit7ICAgcmV0dXJuIEN2TUFUKCAqdGhpcyApOyAgICB9CisKK2lubGluZSBfQ3ZNQVRfQ01QXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiBDdk1BVCggKnRoaXMgKTsgICAgfQorCitpbmxpbmUgX0N2TUFUX0NWVF86Om9wZXJhdG9yIEN2TUFUKCkgY29uc3QKK3sgICByZXR1cm4gQ3ZNQVQoKnRoaXMpOyAgIH0KKworaW5saW5lIF9Ddk1BVF9DT1BZXzo6b3BlcmF0b3IgQ3ZNQVQoKSBjb25zdAoreyAgIHJldHVybiAqYTsgICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eSBjbGFzc2VzIGltcGxlbWVudGF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnQgSUlJLiBjdXN0b20gb3ZlcnJpZGVkIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gX0N2TUFUX1NDQUxFXzo6bXVsKCBjb25zdCBDdk1BVCYgbWF0ICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUX0RPVF9PUF8oIGEsICZtYXQsICcqJywgYWxwaGEgKTsgICB9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfU0NBTEVfOjptdWwoIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIG1hdCApIGNvbnN0Cit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCBhLCBtYXQuYSwgJyonLCBhbHBoYSptYXQuYWxwaGEgKTsgICB9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfU0NBTEVfOjpkaXYoIGNvbnN0IEN2TUFUJiBtYXQgKSBjb25zdAoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggYSwgJm1hdCwgJy8nLCBhbHBoYSApOyAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIF9Ddk1BVF9TQ0FMRV86OmRpdiggY29uc3QgX0N2TUFUX1NDQUxFXyYgbWF0ICkgY29uc3QKK3sgICByZXR1cm4gX0N2TUFUX0RPVF9PUF8oIGEsIG1hdC5hLCAnLycsIGFscGhhL21hdC5hbHBoYSApOyAgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIG9wZXJhdG9yICogKCBjb25zdCBfQ3ZNQVRfRE9UX09QXyYgZG90X29wLCBkb3VibGUgYWxwaGEgKQoreyAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggJmRvdF9vcC5hLCBkb3Rfb3AuYiwgZG90X29wLm9wLCBkb3Rfb3AuYWxwaGEgKiBhbHBoYSApOyAgfQorCitpbmxpbmUgX0N2TUFUX0RPVF9PUF8gb3BlcmF0b3IgKiAoIGRvdWJsZSBhbHBoYSwgY29uc3QgX0N2TUFUX0RPVF9PUF8mIGRvdF9vcCApCit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCAmZG90X29wLmEsIGRvdF9vcC5iLCBkb3Rfb3Aub3AsIGRvdF9vcC5hbHBoYSAqIGFscGhhICk7ICB9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBvcGVyYXRvciAvICggZG91YmxlIGFscGhhLCBjb25zdCBDdk1BVCYgbWF0ICkKK3sgICByZXR1cm4gX0N2TUFUX0RPVF9PUF8oICZtYXQsIDAsICcvJywgYWxwaGEgKTsgIH0KKworaW5saW5lIF9Ddk1BVF9ET1RfT1BfIG9wZXJhdG9yIC8gKCBkb3VibGUgYWxwaGEsIGNvbnN0IF9Ddk1BVF9TQ0FMRV8mIG1hdCApCit7ICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCBtYXQuYSwgMCwgJy8nLCBhbHBoYS9tYXQuYWxwaGEgKTsgIH0KKworCitpbmxpbmUgZG91YmxlIF9Ddk1BVF9UXzo6ZGV0KCkgY29uc3QKK3sgICByZXR1cm4gYS5kZXQoKTsgICAgIH0KKworaW5saW5lIGRvdWJsZSBfQ3ZNQVRfVF86Om5vcm0oIGludCBub3JtX3R5cGUgKSBjb25zdAoreyAgIHJldHVybiBhLm5vcm0oIG5vcm1fdHlwZSApOyAgICB9CisKK2lubGluZSBkb3VibGUgX0N2TUFUX0FERF86Om5vcm0oIGludCBub3JtX3R5cGUgKSBjb25zdAoreworICAgIGlmKCBiZXRhID09IC0xICkKKyAgICAgICAgcmV0dXJuIGN2Tm9ybSggYSwgYiwgbm9ybV90eXBlICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChDdk1BVCkqdGhpcykubm9ybSggbm9ybV90eXBlICk7Cit9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfQUREXzo6YWJzKCkgY29uc3QKK3sKKyAgICBpZiggYmV0YSA9PSAtMSApCisgICAgICAgIHJldHVybiBfQ3ZNQVRfRE9UX09QXyggYSwgYiwgJ2EnLCAwICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChDdk1BVCkqdGhpcykuYWJzKCk7Cit9CisKK2lubGluZSBfQ3ZNQVRfRE9UX09QXyBfQ3ZNQVRfU0NBTEVfU0hJRlRfOjphYnMoKSBjb25zdAoreworICAgIGlmKCBhbHBoYSA9PSAxICkKKyAgICAgICAgcmV0dXJuIF9Ddk1BVF9ET1RfT1BfKCBhLCAwLCAnYScsIC1iZXRhICk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gKChDdk1BVCkqdGhpcykuYWJzKCk7Cit9CisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLypfQ1ZNQVRfSFBQXyovCisKZGlmZiAtLWdpdCBhL2N2YXV4L2luY2x1ZGUvY3Z2aWRzdXJ2LmhwcCBiL2N2YXV4L2luY2x1ZGUvY3Z2aWRzdXJ2LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM1NjVkCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvaW5jbHVkZS9jdnZpZHN1cnYuaHBwCkBAIC0wLDAgKzEsMTMyNCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKworI2lmbmRlZiBfX0NWVklERU9TVVJWRUlMTEFOQ0VfSF9fCisjZGVmaW5lIF9fQ1ZWSURFT1NVUlZFSUxMQU5DRV9IX18KKworLyogVHVybiBvZmYgdGhlIGZ1bmN0aW9uYWxpdHkgdW50aWwgY3ZhdXgvc3JjL01ha2VmaWxlLmFtIGdldHMgdXBkYXRlZDogKi8KKy8vI2lmIF9NU0NfVkVSID49IDEyMDAKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwIHx8IGRlZmluZWQgX19CT1JMQU5EQ19fCisjZGVmaW5lIGN2X3N0cmljbXAgc3RyaWNtcAorI2RlZmluZSBjdl9zdHJuaWNtcCBzdHJuaWNtcAorI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworI2RlZmluZSBjdl9zdHJpY21wIHN0cmNhc2VjbXAKKyNkZWZpbmUgY3Zfc3RybmljbXAgc3RybmNhc2VjbXAKKyNlbHNlCisjZXJyb3IgRG8gbm90IGtub3cgaG93IHRvIG1ha2UgY2FzZS1pbnNlbnNpdGl2ZSBzdHJpbmcgY29tcGFyaXNvbiBvbiB0aGlzIHBsYXRmb3JtCisjZW5kaWYKKworLy9zdHJ1Y3QgRGVmUGFyYW07CitzdHJ1Y3QgQ3ZEZWZQYXJhbQoreworICAgIHN0cnVjdCBDdkRlZlBhcmFtKiAgICBuZXh0OworICAgIGNoYXIqICAgICAgICAgICAgICAgcE5hbWU7CisgICAgY2hhciogICAgICAgICAgICAgICBwQ29tbWVudDsKKyAgICBkb3VibGUqICAgICAgICAgICAgIHBEb3VibGU7CisgICAgZG91YmxlICAgICAgICAgICAgICBEb3VibGU7CisgICAgZmxvYXQqICAgICAgICAgICAgICBwRmxvYXQ7CisgICAgZmxvYXQgICAgICAgICAgICAgICBGbG9hdDsKKyAgICBpbnQqICAgICAgICAgICAgICAgIHBJbnQ7CisgICAgaW50ICAgICAgICAgICAgICAgICBJbnQ7CisgICAgY2hhcioqICAgICAgICAgICAgICBwU3RyOworICAgIGNoYXIqICAgICAgICAgICAgICAgU3RyOworfTsKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdlZTTW9kdWxlCit7Citwcml2YXRlOiAvKiBJbnRlcm5hbCBkYXRhOiAqLworICAgIEN2RGVmUGFyYW0qICAgbV9wUGFyYW1MaXN0OworICAgIGNoYXIqICAgICAgIG1fcE1vZHVsZVR5cGVOYW1lOworICAgIGNoYXIqICAgICAgIG1fcE1vZHVsZU5hbWU7CisgICAgY2hhciogICAgICAgbV9wTmlja05hbWU7Citwcm90ZWN0ZWQ6CisgICAgaW50ICAgICAgICAgbV9XbmQ7CitwdWJsaWM6IC8qIENvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yOiAqLworICAgIEN2VlNNb2R1bGUoKQorICAgIHsKKyAgICAgICAgbV9wTmlja05hbWUgPSBOVUxMOworICAgICAgICBtX3BQYXJhbUxpc3QgPSBOVUxMOworICAgICAgICBtX3BNb2R1bGVUeXBlTmFtZSA9IE5VTEw7CisgICAgICAgIG1fcE1vZHVsZU5hbWUgPSBOVUxMOworICAgICAgICBtX1duZCA9IDA7CisgICAgICAgIEFkZFBhcmFtKCJEZWJ1Z1duZCIsJm1fV25kKTsKKyAgICB9CisgICAgdmlydHVhbCB+Q3ZWU01vZHVsZSgpCisgICAgeworICAgICAgICBDdkRlZlBhcmFtKiBwID0gbV9wUGFyYW1MaXN0OworICAgICAgICBmb3IoO3A7KQorICAgICAgICB7CisgICAgICAgICAgICBDdkRlZlBhcmFtKiBwZiA9IHA7CisgICAgICAgICAgICBwPXAtPm5leHQ7CisgICAgICAgICAgICBGcmVlUGFyYW0oJnBmKTsKKyAgICAgICAgfQorICAgICAgICBtX3BQYXJhbUxpc3Q9TlVMTDsKKyAgICAgICAgaWYobV9wTW9kdWxlVHlwZU5hbWUpZnJlZShtX3BNb2R1bGVUeXBlTmFtZSk7CisgICAgICAgIGlmKG1fcE1vZHVsZU5hbWUpZnJlZShtX3BNb2R1bGVOYW1lKTsKKyAgICB9Citwcml2YXRlOiAvKiBJbnRlcm5hbCBmdW5jdGlvbnM6ICovCisgICAgdm9pZCAgICBGcmVlUGFyYW0oQ3ZEZWZQYXJhbSoqIHBwKQorICAgIHsKKyAgICAgICAgQ3ZEZWZQYXJhbSogcCA9IHBwWzBdOworICAgICAgICBpZihwLT5TdHIpZnJlZShwLT5TdHIpOworICAgICAgICBpZihwLT5wTmFtZSlmcmVlKHAtPnBOYW1lKTsKKyAgICAgICAgaWYocC0+cENvbW1lbnQpZnJlZShwLT5wQ29tbWVudCk7CisgICAgICAgIGN2RnJlZSgodm9pZCoqKXBwKTsKKyAgICB9CisgICAgQ3ZEZWZQYXJhbSogTmV3UGFyYW0oY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHBOZXcgPSAoQ3ZEZWZQYXJhbSopY3ZBbGxvYyhzaXplb2YoQ3ZEZWZQYXJhbSkpOworICAgICAgICBtZW1zZXQocE5ldywwLHNpemVvZihDdkRlZlBhcmFtKSk7CisgICAgICAgIHBOZXctPnBOYW1lID0gc3RyZHVwKG5hbWUpOworICAgICAgICBpZihtX3BQYXJhbUxpc3Q9PU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fcFBhcmFtTGlzdCA9IHBOZXc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdkRlZlBhcmFtKiBwID0gbV9wUGFyYW1MaXN0OworICAgICAgICAgICAgZm9yKDtwLT5uZXh0O3A9cC0+bmV4dCk7CisgICAgICAgICAgICBwLT5uZXh0ID0gcE5ldzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcE5ldzsKKyAgICB9OworCisgICAgQ3ZEZWZQYXJhbSogR2V0UGFyYW1QdHIoaW50IGluZGV4KQorICAgIHsKKyAgICAgICAgQ3ZEZWZQYXJhbSogcCA9IG1fcFBhcmFtTGlzdDsKKyAgICAgICAgZm9yKDtpbmRleD4wICYmIHA7aW5kZXgtLSxwPXAtPm5leHQpOworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisgICAgQ3ZEZWZQYXJhbSogR2V0UGFyYW1QdHIoY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHAgPSBtX3BQYXJhbUxpc3Q7CisgICAgICAgIGZvcig7cDtwPXAtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGN2X3N0cmljbXAocC0+cE5hbWUsbmFtZSk9PTApIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwOworICAgIH0KK3Byb3RlY3RlZDogLyogSU5URVJOQUwgSU5URVJGQUNFICovCisgICAgaW50ICBJc1BhcmFtKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgeworICAgICAgICByZXR1cm4gR2V0UGFyYW1QdHIobmFtZSk/MTowOworICAgIH07CisgICAgdm9pZCBBZGRQYXJhbShjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUqIHBBZGRyKQorICAgIHsKKyAgICAgICAgTmV3UGFyYW0obmFtZSktPnBEb3VibGUgPSBwQWRkcjsKKyAgICB9OworICAgIHZvaWQgQWRkUGFyYW0oY29uc3QgY2hhciogbmFtZSwgZmxvYXQqIHBBZGRyKQorICAgIHsKKyAgICAgICAgTmV3UGFyYW0obmFtZSktPnBGbG9hdD1wQWRkcjsKKyAgICB9OworICAgIHZvaWQgQWRkUGFyYW0oY29uc3QgY2hhciogbmFtZSwgaW50KiBwQWRkcikKKyAgICB7CisgICAgICAgIE5ld1BhcmFtKG5hbWUpLT5wSW50PXBBZGRyOworICAgIH07CisgICAgdm9pZCBBZGRQYXJhbShjb25zdCBjaGFyKiBuYW1lLCBjaGFyKiogcEFkZHIpCisgICAgeworICAgICAgICBDdkRlZlBhcmFtKiBwUCA9IE5ld1BhcmFtKG5hbWUpOworICAgICAgICBjaGFyKiBwID0gcEFkZHI/cEFkZHJbMF06TlVMTDsKKyAgICAgICAgcFAtPnBTdHIgPSBwQWRkcj9wQWRkcjomKHBQLT5TdHIpOworICAgICAgICBpZihwKQorICAgICAgICB7CisgICAgICAgICAgICBwUC0+U3RyID0gc3RyZHVwKHApOworICAgICAgICAgICAgcFAtPnBTdHJbMF0gPSBwUC0+U3RyOworICAgICAgICB9CisgICAgfTsKKyAgICB2b2lkIEFkZFBhcmFtKGNvbnN0IGNoYXIqIG5hbWUpCisgICAgeworICAgICAgICBDdkRlZlBhcmFtKiBwID0gTmV3UGFyYW0obmFtZSk7CisgICAgICAgIHAtPnBEb3VibGUgPSAmcC0+RG91YmxlOworICAgIH07CisgICAgdm9pZCBDb21tZW50UGFyYW0oY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogcENvbW1lbnQpCisgICAgeworICAgICAgICBDdkRlZlBhcmFtKiBwID0gR2V0UGFyYW1QdHIobmFtZSk7CisgICAgICAgIGlmKHApcC0+cENvbW1lbnQgPSBwQ29tbWVudCA/IHN0cmR1cChwQ29tbWVudCkgOiAwOworICAgIH07CisgICAgdm9pZCBTZXRUeXBlTmFtZShjb25zdCBjaGFyKiBuYW1lKXttX3BNb2R1bGVUeXBlTmFtZSA9IHN0cmR1cChuYW1lKTt9CisgICAgdm9pZCBTZXRNb2R1bGVOYW1lKGNvbnN0IGNoYXIqIG5hbWUpe21fcE1vZHVsZU5hbWUgPSBzdHJkdXAobmFtZSk7fQorICAgIHZvaWQgRGVsUGFyYW0oY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHAgPSBtX3BQYXJhbUxpc3Q7CisgICAgICAgIEN2RGVmUGFyYW0qIHBQcmV2ID0gTlVMTDsKKyAgICAgICAgZm9yKDtwO3A9cC0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3Zfc3RyaWNtcChwLT5wTmFtZSxuYW1lKT09MCkgYnJlYWs7CisgICAgICAgICAgICBwUHJldiA9IHA7CisgICAgICAgIH0KKyAgICAgICAgaWYocCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocFByZXYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByZXYtPm5leHQgPSBwLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fcFBhcmFtTGlzdCA9IHAtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGcmVlUGFyYW0oJnApOworICAgICAgICB9CisgICAgfS8qIERlbFBhcmFtICovCisKK3B1YmxpYzogLyogRVhURVJOQUwgSU5URVJGQUNFICovCisgICAgY2hhciogR2V0UGFyYW1OYW1lKGludCBpbmRleCkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHAgPSBHZXRQYXJhbVB0cihpbmRleCk7CisgICAgICAgIHJldHVybiBwP3AtPnBOYW1lOk5VTEw7CisgICAgfQorICAgIGNoYXIqIEdldFBhcmFtQ29tbWVudChjb25zdCBjaGFyKiBuYW1lKQorICAgIHsKKyAgICAgICAgQ3ZEZWZQYXJhbSogcCA9IEdldFBhcmFtUHRyKG5hbWUpOworICAgICAgICBpZihwICYmIHAtPnBDb21tZW50KSByZXR1cm4gcC0+cENvbW1lbnQ7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBkb3VibGUgR2V0UGFyYW0oY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHAgPSBHZXRQYXJhbVB0cihuYW1lKTsKKyAgICAgICAgaWYocCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocC0+cERvdWJsZSkgcmV0dXJuIHAtPnBEb3VibGVbMF07CisgICAgICAgICAgICBpZihwLT5wRmxvYXQpIHJldHVybiBwLT5wRmxvYXRbMF07CisgICAgICAgICAgICBpZihwLT5wSW50KSByZXR1cm4gcC0+cEludFswXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgY29uc3QgY2hhciogR2V0UGFyYW1TdHIoY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIEN2RGVmUGFyYW0qIHAgPSBHZXRQYXJhbVB0cihuYW1lKTsKKyAgICAgICAgcmV0dXJuIHA/cC0+U3RyOk5VTEw7CisgICAgfQorICAgIHZvaWQgICBTZXRQYXJhbShjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgdmFsKQorICAgIHsKKyAgICAgICAgQ3ZEZWZQYXJhbSogcCA9IG1fcFBhcmFtTGlzdDsKKyAgICAgICAgZm9yKDtwO3A9cC0+bmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoY3Zfc3RyaWNtcChwLT5wTmFtZSxuYW1lKSAhPSAwKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKHAtPnBEb3VibGUpcC0+cERvdWJsZVswXSA9IHZhbDsKKyAgICAgICAgICAgIGlmKHAtPnBGbG9hdClwLT5wRmxvYXRbMF0gPSAoZmxvYXQpdmFsOworICAgICAgICAgICAgaWYocC0+cEludClwLT5wSW50WzBdID0gY3ZSb3VuZCh2YWwpOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgICBTZXRQYXJhbVN0cihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBzdHIpCisgICAgeworICAgICAgICBDdkRlZlBhcmFtKiBwID0gbV9wUGFyYW1MaXN0OworICAgICAgICBmb3IoOyBwOyBwPXAtPm5leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGN2X3N0cmljbXAocC0+cE5hbWUsbmFtZSkgIT0gMCkgY29udGludWU7CisgICAgICAgICAgICBpZihwLT5wU3RyKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHAtPlN0cilmcmVlKHAtPlN0cik7CisgICAgICAgICAgICAgICAgcC0+U3RyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBpZihzdHIpcC0+U3RyID0gc3RyZHVwKHN0cik7CisgICAgICAgICAgICAgICAgcC0+cFN0clswXSA9IHAtPlN0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBDb252ZXJ0IHRvIGRvdWJsZSBhbmQgc2V0OiAqLworICAgICAgICBpZihzdHIpIFNldFBhcmFtKG5hbWUsYXRvZihzdHIpKTsKKyAgICB9CisgICAgdm9pZCBUcmFuc2ZlclBhcmFtc0Zyb21DaGlsZChDdlZTTW9kdWxlKiBwTSwgY2hhciogcHJlZml4ID0gTlVMTCkKKyAgICB7CisgICAgICAgIGNoYXIgICAgdG1wWzEwMjRdOworICAgICAgICBjaGFyKiAgIEZOID0gTlVMTDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7OysraSkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciogTiA9IHBNLT5HZXRQYXJhbU5hbWUoaSk7CisgICAgICAgICAgICBpZihOID09IE5VTEwpIGJyZWFrOworICAgICAgICAgICAgRk4gPSBOOworICAgICAgICAgICAgaWYocHJlZml4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0cmNweSh0bXAscHJlZml4KTsKKyAgICAgICAgICAgICAgICBzdHJjYXQodG1wLCJfIik7CisgICAgICAgICAgICAgICAgRk4gPSBzdHJjYXQodG1wLE4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZighSXNQYXJhbShGTikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocE0tPkdldFBhcmFtU3RyKE4pKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRkUGFyYW0oRk4sKGNoYXIqKilOVUxMKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQWRkUGFyYW0oRk4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKHBNLT5HZXRQYXJhbVN0cihOKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWwgPSBwTS0+R2V0UGFyYW1TdHIoTik7CisgICAgICAgICAgICAgICAgU2V0UGFyYW1TdHIoRk4sdmFsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gcE0tPkdldFBhcmFtKE4pOworICAgICAgICAgICAgICAgIFNldFBhcmFtKEZOLHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb21tZW50UGFyYW0oRk4sIHBNLT5HZXRQYXJhbUNvbW1lbnQoTikpOworICAgICAgICB9LyogdHJhbnNmZXIgbmV4dCBwYXJhbSAqLworICAgIH0vKiBUcmFuc2ZlciBwYXJhbXMgKi8KKworICAgIHZvaWQgVHJhbnNmZXJQYXJhbXNUb0NoaWxkKEN2VlNNb2R1bGUqIHBNLCBjaGFyKiBwcmVmaXggPSBOVUxMKQorICAgIHsKKyAgICAgICAgY2hhciAgICB0bXBbMTAyNF07CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoaT0wOzsrK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIqIE4gPSBwTS0+R2V0UGFyYW1OYW1lKGkpOworICAgICAgICAgICAgaWYoTiA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgIGlmKHByZWZpeCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdHJjcHkodG1wLHByZWZpeCk7CisgICAgICAgICAgICAgICAgc3RyY2F0KHRtcCwiXyIpOworICAgICAgICAgICAgICAgIHN0cmNhdCh0bXAsTik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RyY3B5KHRtcCxOKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoSXNQYXJhbSh0bXApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKEdldFBhcmFtU3RyKHRtcCkpCisgICAgICAgICAgICAgICAgICAgIHBNLT5TZXRQYXJhbVN0cihOLEdldFBhcmFtU3RyKHRtcCkpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcE0tPlNldFBhcmFtKE4sR2V0UGFyYW0odG1wKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0vKiBUcmFuc2ZlciBuZXh0IHBhcmFtZXRlciAqLworICAgICAgICBwTS0+UGFyYW1VcGRhdGUoKTsKKyAgICB9LyogVHJhbnNmZXIgcGFyYW1zICovCisKKyAgICB2aXJ0dWFsIHZvaWQgUGFyYW1VcGRhdGUoKXt9OworICAgIGNvbnN0IGNoYXIqICAgR2V0VHlwZU5hbWUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcE1vZHVsZVR5cGVOYW1lOworICAgIH0KKyAgICBpbnQgICAgIElzTW9kdWxlVHlwZU5hbWUoY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3BNb2R1bGVUeXBlTmFtZT8oY3Zfc3RyaWNtcChtX3BNb2R1bGVUeXBlTmFtZSxuYW1lKT09MCk6MDsKKyAgICB9CisgICAgY2hhciogICBHZXRNb2R1bGVOYW1lKCkKKyAgICB7CisgICAgICAgIHJldHVybiBtX3BNb2R1bGVOYW1lOworICAgIH0KKyAgICBpbnQgICAgIElzTW9kdWxlTmFtZShjb25zdCBjaGFyKiBuYW1lKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1fcE1vZHVsZU5hbWU/KGN2X3N0cmljbXAobV9wTW9kdWxlTmFtZSxuYW1lKT09MCk6MDsKKyAgICB9CisgICAgdm9pZCBTZXROaWNrTmFtZShjb25zdCBjaGFyKiBwU3RyKQorICAgIHsKKyAgICAgICAgaWYobV9wTmlja05hbWUpCisgICAgICAgICAgICBmcmVlKG1fcE5pY2tOYW1lKTsKKworICAgICAgICBtX3BOaWNrTmFtZSA9IE5VTEw7CisKKyAgICAgICAgaWYocFN0cikKKyAgICAgICAgICAgIG1fcE5pY2tOYW1lID0gc3RyZHVwKHBTdHIpOworICAgIH0KKyAgICBjb25zdCBjaGFyKiBHZXROaWNrTmFtZSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9wTmlja05hbWUgPyBtX3BOaWNrTmFtZSA6ICJ1bmtub3duIjsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIFNhdmVTdGF0ZShDdkZpbGVTdG9yYWdlKil7fTsKKyAgICB2aXJ0dWFsIHZvaWQgTG9hZFN0YXRlKEN2RmlsZVN0b3JhZ2UqLCBDdkZpbGVOb2RlKil7fTsKKworICAgIHZpcnR1YWwgdm9pZCBSZWxlYXNlKCkgPSAwOworfTsvKiBDdlZNTW9kdWxlICovCit2b2lkIGlubGluZSBjdldyaXRlU3RydWN0KEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBhZGRyLCBjaGFyKiBkZXNjLCBpbnQgbnVtPTEpCit7CisgICAgY3ZTdGFydFdyaXRlU3RydWN0KGZzLG5hbWUsQ1ZfTk9ERV9TRVF8Q1ZfTk9ERV9GTE9XKTsKKyAgICBjdldyaXRlUmF3RGF0YShmcyxhZGRyLG51bSxkZXNjKTsKKyAgICBjdkVuZFdyaXRlU3RydWN0KGZzKTsKK30KK3ZvaWQgaW5saW5lIGN2UmVhZFN0cnVjdEJ5TmFtZShDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogYWRkciwgY2hhciogZGVzYykKK3sKKyAgICBDdkZpbGVOb2RlKiBwU2VxTm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoZnMsIG5vZGUsIG5hbWUpOworICAgIGlmKHBTZXFOb2RlPT1OVUxMKQorICAgIHsKKyAgICAgICAgcHJpbnRmKCJXQVJOSU5HISEhIENhbid0IHJlYWQgc3RydWN0dXJlICVzXG4iLG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihDVl9OT0RFX0lTX1NFUShwU2VxTm9kZS0+dGFnKSkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZSZWFkUmF3RGF0YSggZnMsIHBTZXFOb2RlLCBhZGRyLCBkZXNjICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIldBUk5JTkchISEgU3RydWN0dXJlICVzIGlzIG5vdCBzZXF1ZW5jZSBhbmQgY2FuIG5vdCBiZSByZWFkXG4iLG5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIEZPUkVHUk9VTkQgREVURUNUT1IgSU5URVJGQUNFICovCitjbGFzcyBDVl9FWFBPUlRTIEN2RkdEZXRlY3RvcjogcHVibGljIEN2VlNNb2R1bGUKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIElwbEltYWdlKiBHZXRNYXNrKCkgPSAwOworICAgIC8qIFByb2Nlc3MgY3VycmVudCBpbWFnZTogKi8KKyAgICB2aXJ0dWFsIHZvaWQgICAgUHJvY2VzcyhJcGxJbWFnZSogcEltZykgPSAwOworICAgIC8qIFJlbGVhc2UgZm9yZWdyb3VuZCBkZXRlY3RvcjogKi8KKyAgICB2aXJ0dWFsIHZvaWQgICAgUmVsZWFzZSgpID0gMDsKK307CitpbmxpbmUgdm9pZCBjdlJlbGVhc2VGR0RldGVjdG9yKEN2RkdEZXRlY3RvcioqIHBwVCApCit7CisgICAgcHBUWzBdLT5SZWxlYXNlKCk7CisgICAgcHBUWzBdID0gMDsKK30KKy8qIEZPUkVHUk9VTkQgREVURUNUT1IgSU5URVJGQUNFICovCisKK0NWX0VYUE9SVFMgQ3ZGR0RldGVjdG9yKiBjdkNyZWF0ZUZHRGV0ZWN0b3JCYXNlKGludCB0eXBlLCB2b2lkICpwYXJhbSk7CisKKworLyogQkxPQiBTVFJVQ1RVUkUqLworc3RydWN0IEN2QmxvYgoreworICAgIGZsb2F0ICAgeCx5OyAvKiBibG9iIHBvc2l0aW9uICAgKi8KKyAgICBmbG9hdCAgIHcsaDsgLyogYmxvYiBzaXplcyAgICAgICovCisgICAgaW50ICAgICBJRDsgIC8qIGJsb2IgSUQgICAgICAgICAqLyAgICAgCit9OworCitpbmxpbmUgQ3ZCbG9iIGN2QmxvYihmbG9hdCB4LGZsb2F0IHksIGZsb2F0IHcsIGZsb2F0IGgpCit7CisgICAgQ3ZCbG9iIEIgPSB7eCx5LHcsaCwwfTsgCisgICAgcmV0dXJuIEI7Cit9CisjZGVmaW5lIENWX0JMT0JfTUlOVyA1CisjZGVmaW5lIENWX0JMT0JfTUlOSCA1CisjZGVmaW5lIENWX0JMT0JfSUQocEIpICgoKEN2QmxvYiopKHBCKSktPklEKQorI2RlZmluZSBDVl9CTE9CX0NFTlRFUihwQikgY3ZQb2ludDJEMzJmKCgoQ3ZCbG9iKikocEIpKS0+eCwoKEN2QmxvYiopKHBCKSktPnkpCisjZGVmaW5lIENWX0JMT0JfWChwQikgKCgoQ3ZCbG9iKikocEIpKS0+eCkKKyNkZWZpbmUgQ1ZfQkxPQl9ZKHBCKSAoKChDdkJsb2IqKShwQikpLT55KQorI2RlZmluZSBDVl9CTE9CX1dYKHBCKSAoKChDdkJsb2IqKShwQikpLT53KQorI2RlZmluZSBDVl9CTE9CX1dZKHBCKSAoKChDdkJsb2IqKShwQikpLT5oKQorI2RlZmluZSBDVl9CTE9CX1JYKHBCKSAoMC41ZipDVl9CTE9CX1dYKHBCKSkKKyNkZWZpbmUgQ1ZfQkxPQl9SWShwQikgKDAuNWYqQ1ZfQkxPQl9XWShwQikpCisjZGVmaW5lIENWX0JMT0JfUkVDVChwQikgY3ZSZWN0KGN2Um91bmQoKChDdkJsb2IqKShwQikpLT54LUNWX0JMT0JfUlgocEIpKSxjdlJvdW5kKCgoQ3ZCbG9iKikocEIpKS0+eS1DVl9CTE9CX1JZKHBCKSksY3ZSb3VuZChDVl9CTE9CX1dYKHBCKSksY3ZSb3VuZChDVl9CTE9CX1dZKHBCKSkpCisvKiBFTkQgQkxPQiBTVFJVQ1RVUkUqLworCisKKy8qIHNpbXBsZSBCTE9CTElTVCAqLworY2xhc3MgQ1ZfRVhQT1JUUyBDdkJsb2JTZXEKK3sKK3B1YmxpYzoKKyAgICBDdkJsb2JTZXEoaW50IEJsb2JTaXplID0gc2l6ZW9mKEN2QmxvYikpCisgICAgeworICAgICAgICBtX3BNZW0gPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoKTsKKyAgICAgICAgbV9wU2VxID0gY3ZDcmVhdGVTZXEoMCxzaXplb2YoQ3ZTZXEpLEJsb2JTaXplLG1fcE1lbSk7CisgICAgICAgIHN0cmNweShtX3BFbGVtRm9ybWF0LCJmZmZmaSIpOworICAgIH0KKyAgICB2aXJ0dWFsIH5DdkJsb2JTZXEoKQorICAgIHsgCisgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJm1fcE1lbSk7CisgICAgfTsKKyAgICB2aXJ0dWFsIEN2QmxvYiogR2V0QmxvYihpbnQgQmxvYkluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChDdkJsb2IqKWN2R2V0U2VxRWxlbShtX3BTZXEsQmxvYkluZGV4KTsKKyAgICB9OworICAgIHZpcnR1YWwgQ3ZCbG9iKiBHZXRCbG9iQnlJRChpbnQgQmxvYklEKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPTA7IGk8bV9wU2VxLT50b3RhbDsgKytpKQorICAgICAgICAgICAgaWYoQmxvYklEID09IENWX0JMT0JfSUQoR2V0QmxvYihpKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIEdldEJsb2IoaSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07CisgICAgdmlydHVhbCB2b2lkIERlbEJsb2IoaW50IEJsb2JJbmRleCkKKyAgICB7CisgICAgICAgIGN2U2VxUmVtb3ZlKG1fcFNlcSxCbG9iSW5kZXgpOworICAgIH07CisgICAgdmlydHVhbCB2b2lkIERlbEJsb2JCeUlEKGludCBCbG9iSUQpCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaTxtX3BTZXEtPnRvdGFsOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKEJsb2JJRCA9PSBDVl9CTE9CX0lEKEdldEJsb2IoaSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERlbEJsb2IoaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKQorICAgIHsKKyAgICAgICAgY3ZDbGVhclNlcShtX3BTZXEpOworICAgIH07CisgICAgdmlydHVhbCB2b2lkIEFkZEJsb2IoQ3ZCbG9iKiBwQikKKyAgICB7CisgICAgICAgIGN2U2VxUHVzaChtX3BTZXEscEIpOworICAgIH07CisgICAgdmlydHVhbCBpbnQgR2V0QmxvYk51bSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9wU2VxLT50b3RhbDsKKyAgICB9OworICAgIHZpcnR1YWwgdm9pZCBXcml0ZShDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqICBhdHRyW10gPSB7ImR0IixtX3BFbGVtRm9ybWF0LE5VTEx9OworICAgICAgICBpZihmcykKKyAgICAgICAgeworICAgICAgICAgICAgY3ZXcml0ZShmcyxuYW1lLG1fcFNlcSxjdkF0dHJMaXN0KGF0dHIsTlVMTCkpOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBMb2FkKEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlKQorICAgIHsKKyAgICAgICAgaWYoZnM9PU5VTEwpIHJldHVybjsKKyAgICAgICAgQ3ZTZXEqIHBTZXEgPSAoQ3ZTZXEqKWN2UmVhZChmcywgbm9kZSk7CisgICAgICAgIGlmKHBTZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgY3ZDbGVhclNlcShtX3BTZXEpOworICAgICAgICAgICAgZm9yKGk9MDtpPHBTZXEtPnRvdGFsOysraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b2lkKiBwQiA9IGN2R2V0U2VxRWxlbSggcFNlcSwgaSApOworICAgICAgICAgICAgICAgIGN2U2VxUHVzaCggbV9wU2VxLCBwQiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHZvaWQgQWRkRm9ybWF0KGNoYXIqIHN0cil7c3RyY2F0KG1fcEVsZW1Gb3JtYXQsc3RyKTt9Citwcm90ZWN0ZWQ6CisgICAgQ3ZNZW1TdG9yYWdlKiAgIG1fcE1lbTsKKyAgICBDdlNlcSogICAgICAgICAgbV9wU2VxOworICAgIGNoYXIgICAgICAgICAgICBtX3BFbGVtRm9ybWF0WzEwMjRdOworfTsKKy8qIHNpbXBsZSBCTE9CTElTVCAqLworCisKKy8qIHNpbXBsZSBUUkFDS0xJU1QgKi8KK3N0cnVjdCBDdkJsb2JUcmFjaworeworICAgIGludCAgICAgICAgIFRyYWNrSUQ7CisgICAgaW50ICAgICAgICAgU3RhcnRGcmFtZTsKKyAgICBDdkJsb2JTZXEqICBwQmxvYlNlcTsKK307CisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tTZXEKK3sKK3B1YmxpYzoKKyAgICBDdkJsb2JUcmFja1NlcShpbnQgVHJhY2tTaXplID0gc2l6ZW9mKEN2QmxvYlRyYWNrKSkKKyAgICB7CisgICAgICAgIG1fcE1lbSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpOworICAgICAgICBtX3BTZXEgPSBjdkNyZWF0ZVNlcSgwLHNpemVvZihDdlNlcSksVHJhY2tTaXplLG1fcE1lbSk7CisgICAgfQorICAgIHZpcnR1YWwgfkN2QmxvYlRyYWNrU2VxKCkKKyAgICB7IAorICAgICAgICBDbGVhcigpOworICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZtX3BNZW0pOworICAgIH07CisgICAgdmlydHVhbCBDdkJsb2JUcmFjayogR2V0QmxvYlRyYWNrKGludCBUcmFja0luZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIChDdkJsb2JUcmFjayopY3ZHZXRTZXFFbGVtKG1fcFNlcSxUcmFja0luZGV4KTsKKyAgICB9OworICAgIHZpcnR1YWwgQ3ZCbG9iVHJhY2sqIEdldEJsb2JUcmFja0J5SUQoaW50IFRyYWNrSUQpCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKGk9MDsgaTxtX3BTZXEtPnRvdGFsOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2QmxvYlRyYWNrKiBwUCA9IEdldEJsb2JUcmFjayhpKTsKKyAgICAgICAgICAgIGlmKHBQICYmIHBQLT5UcmFja0lEID09IFRyYWNrSUQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHBQOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH07CisgICAgdmlydHVhbCB2b2lkIERlbEJsb2JUcmFjayhpbnQgVHJhY2tJbmRleCkKKyAgICB7CisgICAgICAgIEN2QmxvYlRyYWNrKiBwUCA9IEdldEJsb2JUcmFjayhUcmFja0luZGV4KTsKKyAgICAgICAgaWYocFAgJiYgcFAtPnBCbG9iU2VxKSBkZWxldGUgcFAtPnBCbG9iU2VxOworICAgICAgICBjdlNlcVJlbW92ZShtX3BTZXEsVHJhY2tJbmRleCk7CisgICAgfTsKKyAgICB2aXJ0dWFsIHZvaWQgRGVsQmxvYlRyYWNrQnlJRChpbnQgVHJhY2tJRCkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoaT0wOyBpPG1fcFNlcS0+dG90YWw7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZCbG9iVHJhY2sqIHBQID0gR2V0QmxvYlRyYWNrKGkpOworICAgICAgICAgICAgaWYoVHJhY2tJRCA9PSBwUC0+VHJhY2tJRCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEZWxCbG9iVHJhY2soaSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPUdldEJsb2JUcmFja051bSgpO2k+MDtpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIERlbEJsb2JUcmFjayhpLTEpOworICAgICAgICB9CisgICAgICAgIGN2Q2xlYXJTZXEobV9wU2VxKTsKKyAgICB9OworICAgIHZpcnR1YWwgdm9pZCBBZGRCbG9iVHJhY2soaW50IFRyYWNrSUQsIGludCBTdGFydEZyYW1lID0gMCkKKyAgICB7CisgICAgICAgIEN2QmxvYlRyYWNrIE47CisgICAgICAgIE4uVHJhY2tJRCA9IFRyYWNrSUQ7CisgICAgICAgIE4uU3RhcnRGcmFtZSA9IFN0YXJ0RnJhbWU7CisgICAgICAgIE4ucEJsb2JTZXEgPSBuZXcgQ3ZCbG9iU2VxOworICAgICAgICBjdlNlcVB1c2gobV9wU2VxLCZOKTsKKyAgICB9OworICAgIHZpcnR1YWwgaW50IEdldEJsb2JUcmFja051bSgpCisgICAgeworICAgICAgICByZXR1cm4gbV9wU2VxLT50b3RhbDsKKyAgICB9OworcHJvdGVjdGVkOgorICAgIEN2TWVtU3RvcmFnZSogICBtX3BNZW07CisgICAgQ3ZTZXEqICAgICAgICAgIG1fcFNlcTsKK307CisKKy8qIHNpbXBsZSBUUkFDS0xJU1QgKi8KKworCisvKiBCTE9CIERFVEVDVE9SIElOVEVSRkFDRSAqLworY2xhc3MgQ1ZfRVhQT1JUUyBDdkJsb2JEZXRlY3RvcjogcHVibGljIEN2VlNNb2R1bGUKK3sKK3B1YmxpYzoKKyAgICAvKiBUcnkgdG8gZGV0ZWN0IG5ldyBibG9iIGVudHJhbmNlIGJhc2VkIG9uIGZvcmVncm91bmQgbWFzay4gKi8KKyAgICAvKiBwRkdNYXNrIC0gaW1hZ2Ugb2YgZm9yZWdyb3VuZCBtYXNrICovCisgICAgLyogcE5ld0Jsb2IgLSBwb2ludGVyIHRvIEN2QmxvYiBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaWYgbmV3IGJsb2IgZW50cmFuY2UgZGV0ZWN0ZWQgKi8KKyAgICAvKiBwT2xkQmxvYkxpc3QgLSBwb2ludGVyIHRvIGJsb2IgbGlzdCB3aGljaCBhbHJlYWR5IGV4aXN0IG9uIGltYWdlICovCisgICAgdmlydHVhbCBpbnQgRGV0ZWN0TmV3QmxvYihJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBJbWdGRywgQ3ZCbG9iU2VxKiBwTmV3QmxvYkxpc3QsIEN2QmxvYlNlcSogcE9sZEJsb2JMaXN0KSA9IDA7CisgICAgLyogcmVsZWFzZSBibG9iIGRldGVjdG9yICovCisgICAgdmlydHVhbCB2b2lkIFJlbGVhc2UoKT0wOworfTsKKy8qIFJlbGVhc2UgYW55IGJsb2IgZGV0ZWN0b3I6ICovCitpbmxpbmUgdm9pZCBjdlJlbGVhc2VCbG9iRGV0ZWN0b3IoQ3ZCbG9iRGV0ZWN0b3IqKiBwcEJEKQoreworICAgIHBwQkRbMF0tPlJlbGVhc2UoKTsKKyAgICBwcEJEWzBdID0gTlVMTDsKK30KKy8qIEVORCBCTE9CIERFVEVDVE9SIElOVEVSRkFDRSAqLworCisvKiBEZWNsYXJhdGlvbnMgb2YgY29uc3RydWN0b3JzIG9mIGltcGxlbWVudGVkIG1vZHVsZXM6ICovCitDVl9FWFBPUlRTIEN2QmxvYkRldGVjdG9yKiBjdkNyZWF0ZUJsb2JEZXRlY3RvclNpbXBsZSgpOworQ1ZfRVhQT1JUUyBDdkJsb2JEZXRlY3RvciogY3ZDcmVhdGVCbG9iRGV0ZWN0b3JDQygpOworCisKK3N0cnVjdCBDVl9FWFBPUlRTIEN2RGV0ZWN0ZWRCbG9iIDogcHVibGljIEN2QmxvYgoreworICAgIGZsb2F0IHJlc3BvbnNlOworfTsKKworQ1ZfSU5MSU5FIEN2RGV0ZWN0ZWRCbG9iIGN2RGV0ZWN0ZWRCbG9iKCBmbG9hdCB4LCBmbG9hdCB5LCBmbG9hdCB3LCBmbG9hdCBoLCBpbnQgSUQgPSAwLCBmbG9hdCByZXNwb25zZSA9IDAuMEYgKQoreworICAgIEN2RGV0ZWN0ZWRCbG9iIGI7CisgICAgYi54ID0geDsgYi55ID0geTsgYi53ID0gdzsgYi5oID0gaDsgYi5JRCA9IElEOyBiLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgcmV0dXJuIGI7Cit9CisKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdk9iamVjdERldGVjdG9yCit7CitwdWJsaWM6CisgICAgQ3ZPYmplY3REZXRlY3RvciggY29uc3QgY2hhciogLypkZXRlY3Rvcl9maWxlX25hbWUqLyA9IDAgKSB7fTsKKyAgICAKKyAgICB+Q3ZPYmplY3REZXRlY3RvcigpIHt9OworCisgICAgLyoKKyAgICAgKiBSZWxlYXNlIHRoZSBjdXJyZW50IGRldGVjdG9yIGFuZCBsb2FkIG5ldyBkZXRlY3RvciBmcm9tIGZpbGUKKyAgICAgKiAoaWYgZGV0ZWN0b3JfZmlsZV9uYW1lIGlzIG5vdCAwKQorICAgICAqIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3M6CisgICAgICovCisgICAgYm9vbCBMb2FkKCBjb25zdCBjaGFyKiAvKmRldGVjdG9yX2ZpbGVfbmFtZSovID0gMCApIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvKiBSZXR1cm4gbWluIGRldGVjdG9yIHdpbmRvdyBzaXplOiAqLworICAgIEN2U2l6ZSBHZXRNaW5XaW5kb3dTaXplKCkgY29uc3QgeyByZXR1cm4gY3ZTaXplKDAsMCk7IH0KKyAgICAKKyAgICAvKiBSZXR1cm4gbWF4IGJvcmRlcjogKi8KKyAgICBpbnQgR2V0TWF4Qm9yZGVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAgIC8qCisgICAgICogRGV0ZWN0IHRoZSBvYmplY3Qgb24gdGhlIGltYWdlIGFuZCBwdXNoIHRoZSBkZXRlY3RlZAorICAgICAqIGJsb2JzIGludG8gPGRldGVjdGVkX2Jsb2Jfc2VxPiB3aGljaCBtdXN0IGJlIHRoZSBzZXF1ZW5jZSBvZiA8Q3ZEZXRlY3RlZEJsb2I+cworICAgICAqLworICAgIHZvaWQgRGV0ZWN0KCBjb25zdCBDdkFyciogLyppbWcqLywgLyogb3V0ICovIEN2QmxvYlNlcSogLypkZXRlY3RlZF9ibG9iX3NlcSovID0gMCApIHt9OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgQ3ZPYmplY3REZXRlY3RvckltcGwqIGltcGw7Cit9OworCisKK0NWX0lOTElORSBDdlJlY3QgY3ZSZWN0SW50ZXJzZWN0aW9uKCBjb25zdCBDdlJlY3QgcjEsIGNvbnN0IEN2UmVjdCByMiApCit7CisgICAgQ3ZSZWN0IHIgPSBjdlJlY3QoIE1BWChyMS54LCByMi54KSwgTUFYKHIxLnksIHIyLnkpLCAwLCAwICk7CisKKyAgICByLndpZHRoICA9IE1JTihyMS54ICsgcjEud2lkdGgsIHIyLnggKyByMi53aWR0aCkgLSByLng7CisgICAgci5oZWlnaHQgPSBNSU4ocjEueSArIHIxLmhlaWdodCwgcjIueSArIHIyLmhlaWdodCkgLSByLnk7CisKKyAgICByZXR1cm4gcjsKK30KKworCisvKgorICogQ3ZJbWFnZURyYXdlcgorICoKKyAqIERyYXcgb24gYW4gaW1hZ2UgdGhlIHNwZWNpZmllZCBST0lzIGZyb20gdGhlIHNvdXJjZSBpbWFnZSBhbmQKKyAqIGdpdmVuIGJsb2JzIGFzIGVsbGlwc2VzIG9yIHJlY3RhbmdsZXM6CisgKi8KKworc3RydWN0IEN2RHJhd1NoYXBlCit7CisgICAgZW51bSB7UkVDVCwgRUxMSVBTRX0gc2hhcGU7CisgICAgQ3ZTY2FsYXIgY29sb3I7Cit9OworCisvKmV4dGVybiBjb25zdCBDdkRyYXdTaGFwZSBpY3Zfc2hhcGVbXSA9Cit7CisgICAgeyBDdkRyYXdTaGFwZTo6RUxMSVBTRSwgQ1ZfUkdCKDI1NSwwLDApIH0sCisgICAgeyBDdkRyYXdTaGFwZTo6RUxMSVBTRSwgQ1ZfUkdCKDAsMjU1LDApIH0sCisgICAgeyBDdkRyYXdTaGFwZTo6RUxMSVBTRSwgQ1ZfUkdCKDAsMCwyNTUpIH0sCisgICAgeyBDdkRyYXdTaGFwZTo6RUxMSVBTRSwgQ1ZfUkdCKDI1NSwyNTUsMCkgfSwKKyAgICB7IEN2RHJhd1NoYXBlOjpFTExJUFNFLCBDVl9SR0IoMCwyNTUsMjU1KSB9LAorICAgIHsgQ3ZEcmF3U2hhcGU6OkVMTElQU0UsIENWX1JHQigyNTUsMCwyNTUpIH0KK307Ki8KKworY2xhc3MgQ1ZfRVhQT1JUUyBDdkltYWdlRHJhd2VyCit7CitwdWJsaWM6CisgICAgQ3ZJbWFnZURyYXdlcigpIDogbV9pbWFnZSgwKSB7fQorICAgIH5DdkltYWdlRHJhd2VyKCkgeyBjdlJlbGVhc2VJbWFnZSggJm1faW1hZ2UgKTsgfQorICAgIHZvaWQgU2V0U2hhcGVzKCBjb25zdCBDdkRyYXdTaGFwZSogc2hhcGVzLCBpbnQgbnVtICk7CisgICAgLyogPGJsb2Jfc2VxPiBtdXN0IGJlIHRoZSBzZXF1ZW5jZSBvZiA8Q3ZEZXRlY3RlZEJsb2I+cyAqLworICAgIElwbEltYWdlKiBEcmF3KCBjb25zdCBDdkFyciogc3JjLCBDdkJsb2JTZXEqIGJsb2Jfc2VxID0gMCwgY29uc3QgQ3ZTZXEqIHJvaV9zZXEgPSAwICk7CisgICAgSXBsSW1hZ2UqIEdldEltYWdlKCkgeyByZXR1cm4gbV9pbWFnZTsgfQorcHJvdGVjdGVkOgorICAgIC8vc3RhdGljIGNvbnN0IGludCBNQVhfU0hBUEVTID0gc2l6ZW9mKGljdl9zaGFwZSkgLyBzaXplb2YoaWN2X3NoYXBlWzBdKTs7CisKKyAgICBJcGxJbWFnZSogbV9pbWFnZTsgICAgCisgICAgQ3ZEcmF3U2hhcGUgbV9zaGFwZVsxNl07Cit9OworCisKKworLyogVHJhamVjdG9yeSBnZW5lcmF0aW9uIG1vZHVsZTogKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tHZW46IHB1YmxpYyBDdlZTTW9kdWxlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkICAgIFNldEZpbGVOYW1lKGNoYXIqIHBGaWxlTmFtZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICBBZGRCbG9iKEN2QmxvYiogcEJsb2IpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgUHJvY2VzcyhJcGxJbWFnZSogcEltZyA9IE5VTEwsIElwbEltYWdlKiBwRkcgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgIFJlbGVhc2UoKSA9IDA7Cit9OworCitpbmxpbmUgdm9pZCBjdlJlbGVhc2VCbG9iVHJhY2tHZW4oQ3ZCbG9iVHJhY2tHZW4qKiBwQlRHZW4pCit7CisgICAgaWYoKnBCVEdlbikoKnBCVEdlbiktPlJlbGVhc2UoKTsKKyAgICAqcEJUR2VuID0gMDsKK30KKworLyogRGVjbGFyYXRpb25zIG9mIGNvbnN0cnVjdG9ycyBvZiBpbXBsZW1lbnRlZCBtb2R1bGVzOiAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0dlbiogY3ZDcmVhdGVNb2R1bGVCbG9iVHJhY2tHZW4xKCk7CitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrR2VuKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja0dlbllNTCgpOworCisKKworLyogQkxPQiBUUkFDS0VSIElOVEVSRkFDRSAqLworY2xhc3MgQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyOiBwdWJsaWMgQ3ZWU01vZHVsZQoreworcHVibGljOgorICAgIEN2QmxvYlRyYWNrZXIoKXtTZXRUeXBlTmFtZSgiQmxvYlRyYWNrZXIiKTt9OworCisgICAgLyogQWRkIG5ldyBibG9iIHRvIHRyYWNrIGl0IGFuZCBhc3NpZ24gdG8gdGhpcyBibG9iIHBlcnNvbmFsIElEICovCisgICAgLyogcEJsb2IgLSBwb2ludGVyIHRvIHN0cnVjdHVyZSB3aXRoIGJsb2IgcGFyYW1ldGVycyAoSUQgaXMgaWdub3JlZCkqLworICAgIC8qIHBJbWcgLSBjdXJyZW50IGltYWdlICovCisgICAgLyogcEltZ0ZHIC0gY3VycmVudCBmb3JlZ3JvdW5kIG1hc2sgKi8KKyAgICAvKiBSZXR1cm4gcG9pbnRlciB0byBuZXcgYWRkZWQgYmxvYjogKi8KKyAgICB2aXJ0dWFsIEN2QmxvYiogQWRkQmxvYihDdkJsb2IqIHBCbG9iLCBJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBJbWdGRyA9IE5VTEwgKSA9IDA7CisKKyAgICAvKiBSZXR1cm4gbnVtYmVyIG9mIGN1cnJlbnRseSB0cmFja2VkIGJsb2JzOiAqLworICAgIHZpcnR1YWwgaW50ICAgICBHZXRCbG9iTnVtKCkgPSAwOworCisgICAgLyogUmV0dXJuIHBvaW50ZXIgdG8gc3BlY2lmaWVkIGJ5IGluZGV4IGJsb2I6ICovCisgICAgdmlydHVhbCBDdkJsb2IqIEdldEJsb2IoaW50IEJsb2JJbmRleCkgPSAwOworICAgIAorICAgIC8qIERlbGV0ZSBibG9iIGJ5IGl0cyBpbmRleDogKi8KKyAgICB2aXJ0dWFsIHZvaWQgICAgRGVsQmxvYihpbnQgQmxvYkluZGV4KSA9IDA7CisKKyAgICAvKiBQcm9jZXNzIGN1cnJlbnQgaW1hZ2UgYW5kIHRyYWNrIGFsbCBleGlzdGVkIGJsb2JzOiAqLworICAgIHZpcnR1YWwgdm9pZCAgICBQcm9jZXNzKElwbEltYWdlKiBwSW1nLCBJcGxJbWFnZSogcEltZ0ZHID0gTlVMTCkgPSAwOworCisgICAgLyogUmVsZWFzZSBibG9iIHRyYWNrZXI6ICovCisgICAgdmlydHVhbCB2b2lkICAgIFJlbGVhc2UoKSA9IDA7CisKKworICAgIC8qIFByb2Nlc3Mgb25lIGJsb2IgKGZvciBtdWx0aSBoeXBvdGhlc2lzIHRyYWNpbmcpOiAqLworICAgIHZpcnR1YWwgdm9pZCBQcm9jZXNzQmxvYihpbnQgQmxvYkluZGV4LCBDdkJsb2IqIHBCbG9iLCBJcGxJbWFnZSogLypwSW1nKi8sIElwbEltYWdlKiAvKnBJbWdGRyovID0gTlVMTCkKKyAgICB7CisgICAgICAgIEN2QmxvYiogcEI7CisgICAgICAgIGludCBJRCA9IDA7CisgICAgICAgIGFzc2VydChwQmxvYik7CisgICAgICAgIC8vcEJsb2ItPklEOworICAgICAgICBwQiA9IEdldEJsb2IoQmxvYkluZGV4KTsKKyAgICAgICAgaWYocEIpCisgICAgICAgICAgICBwQmxvYlswXSA9IHBCWzBdOworICAgICAgICBwQmxvYi0+SUQgPSBJRDsKKyAgICB9OworCisgICAgLyogR2V0IGNvbmZpZGVuY2Uvd2llZ2h0L3Byb2JhYmlsaXR5ICgwLTEpIGZvciBibG9iOiAqLworICAgIHZpcnR1YWwgZG91YmxlICBHZXRDb25maWRlbmNlKGludCAvKkJsb2JJbmRleCovLCBDdkJsb2IqIC8qcEJsb2IqLywgSXBsSW1hZ2UqIC8qcEltZyovLCBJcGxJbWFnZSogLypwSW1nRkcqLyA9IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9OworCisgICAgdmlydHVhbCBkb3VibGUgR2V0Q29uZmlkZW5jZUxpc3QoQ3ZCbG9iU2VxKiBwQmxvYkxpc3QsIElwbEltYWdlKiBwSW1nLCBJcGxJbWFnZSogcEltZ0ZHID0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCAgICAgYixiTiA9IHBCbG9iTGlzdC0+R2V0QmxvYk51bSgpOworICAgICAgICBkb3VibGUgIFcgPSAxOworICAgICAgICBmb3IoYj0wO2I8Yk47KytiKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJsb2IqIHBCID0gcEJsb2JMaXN0LT5HZXRCbG9iKGIpOworICAgICAgICAgICAgaW50ICAgICBCSSA9IEdldEJsb2JJbmRleEJ5SUQocEItPklEKTsKKyAgICAgICAgICAgIFcgKj0gR2V0Q29uZmlkZW5jZShCSSxwQixwSW1nLHBJbWdGRyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFc7CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBVcGRhdGVCbG9iKGludCAvKkJsb2JJbmRleCovLCBDdkJsb2IqIC8qcEJsb2IqLywgSXBsSW1hZ2UqIC8qcEltZyovLCBJcGxJbWFnZSogLypwSW1nRkcqLyA9IE5VTEwpe307CisKKyAgICAvKiBVcGRhdGUgYWxsIGJsb2IgbW9kZWxzOiAqLworICAgIHZpcnR1YWwgdm9pZCBVcGRhdGUoSXBsSW1hZ2UqIHBJbWcsIElwbEltYWdlKiBwSW1nRkcgPSBOVUxMKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPUdldEJsb2JOdW0oKTtpPjA7aS0tKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJsb2IqIHBCPUdldEJsb2IoaS0xKTsKKyAgICAgICAgICAgIFVwZGF0ZUJsb2IoaS0xLCBwQiwgcEltZywgcEltZ0ZHKTsKKyAgICAgICAgfQorCisgICAgfTsKKworICAgIC8qIFJldHVybiBwb2ludGVyIHRvIGJsb2IgYnkgaXRzIHVuaXF1ZSBJRDogKi8KKyAgICB2aXJ0dWFsIGludCAgICAgR2V0QmxvYkluZGV4QnlJRChpbnQgQmxvYklEKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPUdldEJsb2JOdW0oKTtpPjA7aS0tKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJsb2IqIHBCPUdldEJsb2IoaS0xKTsKKyAgICAgICAgICAgIGlmKENWX0JMT0JfSUQocEIpID09IEJsb2JJRCkgcmV0dXJuIGktMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfTsKKworICAgIC8qIFJldHVybiBwb2ludGVyIHRvIGJsb2IgYnkgaXRzIHVuaXF1ZSBJRDogKi8KKyAgICB2aXJ0dWFsIEN2QmxvYiogR2V0QmxvYkJ5SUQoaW50IEJsb2JJRCl7cmV0dXJuIEdldEJsb2IoR2V0QmxvYkluZGV4QnlJRChCbG9iSUQpKTt9OworCisgICAgLyogRGVsZXRlIGJsb2IgYnkgaXRzIElEOiAqLworICAgIHZpcnR1YWwgdm9pZCAgICBEZWxCbG9iQnlJRChpbnQgQmxvYklEKXtEZWxCbG9iKEdldEJsb2JJbmRleEJ5SUQoQmxvYklEKSk7fTsKKworICAgIC8qIFNldCBuZXcgcGFyYW1ldGVycyBmb3Igc3BlY2lmaWVkIChieSBpbmRleCkgYmxvYjogKi8KKyAgICB2aXJ0dWFsIHZvaWQgICAgU2V0QmxvYihpbnQgLypCbG9iSW5kZXgqLywgQ3ZCbG9iKiAvKnBCbG9iKi8pe307CisKKyAgICAvKiBTZXQgbmV3IHBhcmFtZXRlcnMgZm9yIHNwZWNpZmllZCAoYnkgSUQpIGJsb2I6ICovCisgICAgdmlydHVhbCB2b2lkICAgIFNldEJsb2JCeUlEKGludCBCbG9iSUQsIEN2QmxvYiogcEJsb2IpCisgICAgeworICAgICAgICBTZXRCbG9iKEdldEJsb2JJbmRleEJ5SUQoQmxvYklEKSxwQmxvYik7CisgICAgfTsKKworICAgIC8qICA9PT09PT09PT09PT09PT0gIE1VTFRJIEhZUE9USEVTSVMgSU5URVJGQUNFID09PT09PT09PT09PT09PT09PSAgKi8KKworICAgIC8qIFJldHVybiBudW1iZXIgb2YgcG9zaXRpb24gaHlwb3NldGlzIG9mIGN1cnJlbnRseSB0cmFja2VkIGJsb2I6ICovCisgICAgdmlydHVhbCBpbnQgICAgIEdldEJsb2JIeXBOdW0oaW50IC8qQmxvYklkeCovKXtyZXR1cm4gMTt9OworCisgICAgLyogUmV0dXJuIHBvaW50ZXIgdG8gc3BlY2lmaWVkIGJsb2IgaHlwb3RoZXNpcyBieSBpbmRleCBibG9iOiAqLworICAgIHZpcnR1YWwgQ3ZCbG9iKiBHZXRCbG9iSHlwKGludCBCbG9iSW5kZXgsIGludCAvKmh5cG90aGVzaXMqLyl7cmV0dXJuIEdldEJsb2IoQmxvYkluZGV4KTt9OworCisgICAgLyogU2V0IG5ldyBwYXJhbWV0ZXJzIGZvciBzcGVjaWZpZWQgKGJ5IGluZGV4KSBibG9iIGh5cAorICAgICAqIChjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgZm9yIGVhY2ggaHlwICk6CisgICAgICovCisgICAgdmlydHVhbCB2b2lkICAgIFNldEJsb2JIeXAoaW50IC8qQmxvYkluZGV4Ki8sIEN2QmxvYiogLypwQmxvYiovKXt9OworfTsKK2lubGluZSB2b2lkIGN2UmVsZWFzZUJsb2JUcmFja2VyKEN2QmxvYlRyYWNrZXIqKnBwVCApCit7CisgICAgcHBUWzBdLT5SZWxlYXNlKCk7CisgICAgcHBUWzBdID0gMDsKK30KKy8qIEJMT0IgVFJBQ0tFUiBJTlRFUkZBQ0UgKi8KKworLypCTE9CIFRSQUNLRVIgT05FIElOVEVSRkFDRSAqLworY2xhc3MgQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyT25lOnB1YmxpYyBDdlZTTW9kdWxlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIEluaXQoQ3ZCbG9iKiBwQmxvYkluaXQsIElwbEltYWdlKiBwSW1nLCBJcGxJbWFnZSogcEltZ0ZHID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgQ3ZCbG9iKiBQcm9jZXNzKEN2QmxvYiogcEJsb2JQcmV2LCBJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBJbWdGRyA9IE5VTEwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gIDA7CisKKyAgICAvKiBOb24tcmVxdWlyZWQgbWV0aG9kczogKi8KKyAgICB2aXJ0dWFsIHZvaWQgU2tpcFByb2Nlc3MoQ3ZCbG9iKiAvKnBCbG9iUHJldiovLCBJcGxJbWFnZSogLypwSW1nKi8sIElwbEltYWdlKiAvKnBJbWdGRyovID0gTlVMTCl7fTsKKyAgICB2aXJ0dWFsIHZvaWQgVXBkYXRlKEN2QmxvYiogLypwQmxvYiovLCBJcGxJbWFnZSogLypwSW1nKi8sIElwbEltYWdlKiAvKnBJbWdGRyovID0gTlVMTCl7fTsKKyAgICB2aXJ0dWFsIHZvaWQgU2V0Q29sbGlzaW9uKGludCAvKkNvbGxpc2lvbkZsYWcqLyl7fTsgLyogY2FsbCBpbiBjYXNlIG9mIGJsb2IgY29sbGlzaW9uIHNpdHVhdGlvbiovCisgICAgdmlydHVhbCBkb3VibGUgR2V0Q29uZmlkZW5jZShDdkJsb2IqIC8qcEJsb2IqLywgSXBsSW1hZ2UqIC8qcEltZyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqIC8qcEltZ0ZHKi8gPSBOVUxMLCBJcGxJbWFnZSogLypwSW1nVW51c2VkUmVnKi8gPSBOVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfTsKK307CitpbmxpbmUgdm9pZCBjdlJlbGVhc2VCbG9iVHJhY2tlck9uZShDdkJsb2JUcmFja2VyT25lICoqcHBUICkKK3sKKyAgICBwcFRbMF0tPlJlbGVhc2UoKTsKKyAgICBwcFRbMF0gPSAwOworfQorQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyTGlzdChDdkJsb2JUcmFja2VyT25lKiAoKmNyZWF0ZSkoKSk7CisvKkJMT0IgVFJBQ0tFUiBPTkUgSU5URVJGQUNFICovCisKKy8qIERlY2xhcmF0aW9ucyBvZiBjb25zdHJ1Y3RvcnMgb2YgaW1wbGVtZW50ZWQgbW9kdWxlczogKi8KKworLyogU29tZSBkZWNsYXJhdGlvbnMgZm9yIHNwZWNpZmljIE1lYW5TaGlmdCB0cmFja2VyOiAqLworI2RlZmluZSBQUk9GSUxFX0VQQU5FQ0hOSUtPViAgICAwCisjZGVmaW5lIFBST0ZJTEVfRE9HICAgICAgICAgICAgIDEKK3N0cnVjdCBDdkJsb2JUcmFja2VyUGFyYW1NUworeworICAgIGludCAgICAgbm9PZlNpZ0JpdHM7CisgICAgaW50ICAgICBhcHBlYXJhbmNlX3Byb2ZpbGU7CisgICAgaW50ICAgICBtZWFuc2hpZnRfcHJvZmlsZTsKKyAgICBmbG9hdCAgIHNpZ21hOworfTsKKworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyTVMxKEN2QmxvYlRyYWNrZXJQYXJhbU1TKiBwYXJhbSk7CitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrZXIqIGN2Q3JlYXRlQmxvYlRyYWNrZXJNUzIoQ3ZCbG9iVHJhY2tlclBhcmFtTVMqIHBhcmFtKTsKK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tlciogY3ZDcmVhdGVCbG9iVHJhY2tlck1TMUJ5TGlzdCgpOworCisvKiBTb21lIGRlY2xhcmF0aW9ucyBmb3Igc3BlY2lmaWMgTGlrZWxpaG9vZCB0cmFja2VyOiAqLworc3RydWN0IEN2QmxvYlRyYWNrZXJQYXJhbUxICit7CisgICAgaW50ICAgICBIaXN0VHlwZTsgLyogc2VlIFByb2IuaCAqLworICAgIGludCAgICAgU2NhbGVBZnRlcjsKK307CisKKy8qIFdpdGhvdXQgc2NhbGUgb3B0aW1pemF0aW9uOiAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyTEhSKEN2QmxvYlRyYWNrZXJQYXJhbUxIKiAvKnBhcmFtKi8gPSBOVUxMKTsKKworLyogV2l0aCBzY2FsZSBvcHRpbWl6YXRpb246ICovCitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrZXIqIGN2Q3JlYXRlQmxvYlRyYWNrZXJMSFJTKEN2QmxvYlRyYWNrZXJQYXJhbUxIKiAvKnBhcmFtKi8gPSBOVUxMKTsKKworLyogU2ltcGxlIGJsb2IgdHJhY2tlciBiYXNlZCBvbiBjb25uZWN0ZWQgY29tcG9uZW50IHRyYWNraW5nOiAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyQ0MoKTsKKworLyogQ29ubmVjdGVkIGNvbXBvbmVudCB0cmFja2luZyBhbmQgbWVhbi1zaGlmdCBwYXJ0aWNsZSBmaWx0ZXIgY29sbGlvbi1yZXNvbHZlcjogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tlciogY3ZDcmVhdGVCbG9iVHJhY2tlckNDTVNQRigpOworCisvKiBCbG9iIHRyYWNrZXIgdGhhdCBpbnRlZ3JhdGVzIG1lYW5zaGlmdCBhbmQgY29ubmVjdGVkIGNvbXBvbmVudHM6ICovCitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrZXIqIGN2Q3JlYXRlQmxvYlRyYWNrZXJNU0ZHKCk7CitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrZXIqIGN2Q3JlYXRlQmxvYlRyYWNrZXJNU0ZHUygpOworCisvKiBNZWFuc2hpZnQgd2l0aG91dCBjb25uZWN0ZWQtY29tcG9uZW50cyAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyTVMoKTsKKworLyogUGFydGljbGUgZmlsdGVyaW5nIHZpYSBCaGF0dGFjaGFyeWEgY29lZmZpY2llbnQsIHdoaWNoICAgICAgICAqLworLyogaXMgcm91Z2hseSB0aGUgZG90LXByb2R1Y3Qgb2YgdHdvIHByb2JhYmlsaXR5IGRlbnNpdGllcy4gICAgICAqLworLyogU2VlOiBSZWFsLVRpbWUgVHJhY2tpbmcgb2YgTm9uLVJpZ2lkIE9iamVjdHMgdXNpbmcgTWVhbiBTaGlmdCAqLworLyogICAgICBDb21hbmljaXVzLCBSYW1lc2gsIE1lZXIsIDIwMDAsIDhwICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBodHRwOi8vY2l0ZXNlZXIuaXN0LnBzdS5lZHUvMzIxNDQxLmh0bWwgICAgICAgICAgICAgICAgICAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VyTVNQRigpOworCisvKiA9PT09PT09PT09PSB0cmFja2VyIGludGVncmF0b3JzIHRyYWNrZXJzID09PT09PT09PT09PT0qLworCisvKiBJbnRlZ3JhdG9yIGJhc2VkIG9uIFBhcnRpY2xlIEZpbHRlcmluZyBtZXRob2Q6ICovCisvL0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tlciogY3ZDcmVhdGVCbG9iVHJhY2tlcklQRigpOworCisvKiBSdWxlIGJhc2VkIGludGVncmF0b3I6ICovCisvL0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tlciogY3ZDcmVhdGVCbG9iVHJhY2tlcklSQigpOworCisvKiBJbnRlZ3JhdG9yIGJhc2VkIG9uIGRhdGEgZnVzaW9uIHVzaW5nIHBhcnRpY2xlIGZpbHRlcmluZzogKi8KKy8vQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyKiBjdkNyZWF0ZUJsb2JUcmFja2VySVBGREYoKTsKKworCisKKworLyogVHJhamVjdG9yeSBwb3N0cHJvY2Vzc2luZyBtb2R1bGU6ICovCitjbGFzcyBDVl9FWFBPUlRTIEN2QmxvYlRyYWNrUG9zdFByb2M6IHB1YmxpYyBDdlZTTW9kdWxlCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkICAgIEFkZEJsb2IoQ3ZCbG9iKiBwQmxvYikgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICBQcm9jZXNzKCkgPSAwOworICAgIHZpcnR1YWwgaW50ICAgICBHZXRCbG9iTnVtKCkgPSAwOworICAgIHZpcnR1YWwgQ3ZCbG9iKiBHZXRCbG9iKGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICBSZWxlYXNlKCkgPSAwOworCisgICAgLyogQWRkaXRpb25hbCBmdW5jdGlvbmFsaXR5OiAqLworICAgIHZpcnR1YWwgQ3ZCbG9iKiBHZXRCbG9iQnlJRChpbnQgQmxvYklEKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvcihpPUdldEJsb2JOdW0oKTtpPjA7aS0tKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJsb2IqIHBCPUdldEJsb2IoaS0xKTsKKyAgICAgICAgICAgIGlmKHBCLT5JRD09QmxvYklEKSByZXR1cm4gcEI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfTsKK307CisKK2lubGluZSB2b2lkIGN2UmVsZWFzZUJsb2JUcmFja1Bvc3RQcm9jKEN2QmxvYlRyYWNrUG9zdFByb2MqKiBwQlRQUCkKK3sKKyAgICBpZihwQlRQUCA9PSBOVUxMKSByZXR1cm47CisgICAgaWYoKnBCVFBQKSgqcEJUUFApLT5SZWxlYXNlKCk7CisgICAgKnBCVFBQID0gMDsKK30KKworLyogVHJhamVjdG9yeSBnZW5lcmF0aW9uIG1vZHVsZTogKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tQb3N0UHJvY09uZTogcHVibGljIEN2VlNNb2R1bGUKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIEN2QmxvYiogUHJvY2VzcyhDdkJsb2IqIHBCbG9iKSA9IDA7CisgICAgdmlydHVhbCB2b2lkICAgIFJlbGVhc2UoKSA9IDA7Cit9OworCisvKiBDcmVhdGUgYmxvYiB0cmFja2luZyBwb3N0IHByb2Nlc3NpbmcgbW9kdWxlIGJhc2VkIG9uIHNpbWxlIG1vZHVsZTogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tQb3N0UHJvYyogY3ZDcmVhdGVCbG9iVHJhY2tQb3N0UHJvY0xpc3QoQ3ZCbG9iVHJhY2tQb3N0UHJvY09uZSogKCpjcmVhdGUpKCkpOworCisKKy8qIERlY2xhcmF0aW9ucyBvZiBjb25zdHJ1Y3RvcnMgb2YgaW1wbGVtZW50ZWQgbW9kdWxlczogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tQb3N0UHJvYyogY3ZDcmVhdGVNb2R1bGVCbG9iVHJhY2tQb3N0UHJvY0thbG1hbigpOworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja1Bvc3RQcm9jKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja1Bvc3RQcm9jVGltZUF2ZXJSZWN0KCk7CitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrUG9zdFByb2MqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrUG9zdFByb2NUaW1lQXZlckV4cCgpOworCisKKy8qIFBSRURJQ1RPUlMgKi8KKy8qIGJsb2IgUFJFRElDVE9SICovCitjbGFzcyBDdkJsb2JUcmFja1ByZWRpY3RvcjogcHVibGljIEN2VlNNb2R1bGUKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIEN2QmxvYiogUHJlZGljdCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgVXBkYXRlKEN2QmxvYiogcEJsb2IpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgUmVsZWFzZSgpID0gMDsKK307CitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrUHJlZGljdG9yKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja1ByZWRpY3RLYWxtYW4oKTsKKworCisKKy8qIFRyYWplY3RvcnkgYW5hbHlzZXIgbW9kdWxlOiAqLworY2xhc3MgQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0FuYWx5c2lzOiBwdWJsaWMgQ3ZWU01vZHVsZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCAgICBBZGRCbG9iKEN2QmxvYiogcEJsb2IpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgUHJvY2VzcyhJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBGRykgPSAwOworICAgIHZpcnR1YWwgZmxvYXQgICBHZXRTdGF0ZShpbnQgQmxvYklEKSA9IDA7CisgICAgLyogcmV0dXJuIDAgaWYgdHJhamVjdG9yeSBpcyBub3JtYWwKKyAgICAgICByZXR1cm4gPjAgaWYgdHJhamVjdG9yeSBhYm5vcm1hbCAqLworICAgIHZpcnR1YWwgY2hhciogICBHZXRTdGF0ZURlc2MoaW50IC8qQmxvYklEKi8pe3JldHVybiBOVUxMO307CisgICAgdmlydHVhbCB2b2lkICAgIFNldEZpbGVOYW1lKGNoYXIqIC8qRGF0YUJhc2VOYW1lKi8pe307CisgICAgdmlydHVhbCB2b2lkICAgIFJlbGVhc2UoKSA9IDA7Cit9OworCisKK2lubGluZSB2b2lkIGN2UmVsZWFzZUJsb2JUcmFja0FuYWx5c2lzKEN2QmxvYlRyYWNrQW5hbHlzaXMqKiBwQlRQUCkKK3sKKyAgICBpZihwQlRQUCA9PSBOVUxMKSByZXR1cm47CisgICAgaWYoKnBCVFBQKSgqcEJUUFApLT5SZWxlYXNlKCk7CisgICAgKnBCVFBQID0gMDsKK30KKworLyogRmVhdHVyZS12ZWN0b3IgZ2VuZXJhdGlvbiBtb2R1bGU6ICovCitjbGFzcyBDVl9FWFBPUlRTIEN2QmxvYlRyYWNrRlZHZW4gOiBwdWJsaWMgQ3ZWU01vZHVsZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCAgICBBZGRCbG9iKEN2QmxvYiogcEJsb2IpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgUHJvY2VzcyhJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBGRykgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgICBSZWxlYXNlKCkgPSAwOworICAgIHZpcnR1YWwgaW50ICAgICBHZXRGVlNpemUoKSA9IDA7CisgICAgdmlydHVhbCBpbnQgICAgIEdldEZWTnVtKCkgPSAwOworICAgIHZpcnR1YWwgZmxvYXQqICBHZXRGVihpbnQgaW5kZXgsIGludCogcEZWSUQpID0gMDsgLyogUmV0dXJucyBwb2ludGVyIHRvIEZWLCBpZiByZXR1cm4gMCB0aGVuIEZWIG5vdCBjcmVhdGVkICovCisgICAgdmlydHVhbCBmbG9hdCogIEdldEZWVmFyKCl7cmV0dXJuIE5VTEw7fTsgLyogUmV0dXJucyBwb2ludGVyIHRvIGFycmF5IG9mIHZhcmlhdGlvbiBvZiB2YWx1ZXMgb2YgRlYsIGlmIHJldHVybnMgMCB0aGVuIEZWVmFyIGRvZXMgbm90IGV4aXN0LiAqLworICAgIHZpcnR1YWwgZmxvYXQqICBHZXRGVk1pbigpID0gMDsgLyogUmV0dXJucyBwb2ludGVyIHRvIGFycmF5IG9mIG1pbmltYWwgdmFsdWVzIG9mIEZWLCBpZiByZXR1cm5zIDAgdGhlbiBGVnJhbmdlIGRvZXMgbm90IGV4aXN0ICovCisgICAgdmlydHVhbCBmbG9hdCogIEdldEZWTWF4KCkgPSAwOyAvKiBSZXR1cm5zIHBvaW50ZXIgdG8gYXJyYXkgb2YgbWF4aW1hbCB2YWx1ZXMgb2YgRlYsIGlmIHJldHVybnMgMCB0aGVuIEZWcmFuZ2UgZG9lcyBub3QgZXhpc3QgKi8KK307CisKKworLyogVHJhamVjdG9yeSBBbmFseXNlciBtb2R1bGU6ICovCitjbGFzcyBDVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXNPbmUKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5DdkJsb2JUcmFja0FuYWx5c2lzT25lKCkge307CisgICAgdmlydHVhbCBpbnQgICAgIFByb2Nlc3MoQ3ZCbG9iKiBwQmxvYiwgSXBsSW1hZ2UqIHBJbWcsIElwbEltYWdlKiBwRkcpID0gMDsKKyAgICAvKiByZXR1cm4gMCBpZiB0cmFqZWN0b3J5IGlzIG5vcm1hbAorICAgICAgIHJldHVybiA+MCBpZiB0cmFqZWN0b3J5IGFibm9ybWFsICovCisgICAgdmlydHVhbCB2b2lkICAgIFJlbGVhc2UoKSA9IDA7Cit9OworCisvKiBDcmVhdGUgYmxvYiB0cmFja2luZyBwb3N0IHByb2Nlc3NpbmcgbW9kdWxlIGJhc2VkIG9uIHNpbWxlIG1vZHVsZTogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tBbmFseXNpcyogY3ZDcmVhdGVCbG9iVHJhY2tBbmFseXNpc0xpc3QoQ3ZCbG9iVHJhY2tBbmFseXNpc09uZSogKCpjcmVhdGUpKCkpOworCisvKiBEZWNsYXJhdGlvbnMgb2YgY29uc3RydWN0b3JzIG9mIGltcGxlbWVudGVkIG1vZHVsZXM6ICovCisKKy8qIEJhc2VkIG9uIGhpc3RvZ3JhbSBhbmFseXNpcyBvZiAyRCBGViAoeCx5KTogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tBbmFseXNpcyogY3ZDcmVhdGVNb2R1bGVCbG9iVHJhY2tBbmFseXNpc0hpc3RQKCk7CisKKy8qIEJhc2VkIG9uIGhpc3RvZ3JhbSBhbmFseXNpcyBvZiA0RCBGViAoeCx5LHZ4LHZ5KTogKi8KK0NWX0VYUE9SVFMgQ3ZCbG9iVHJhY2tBbmFseXNpcyogY3ZDcmVhdGVNb2R1bGVCbG9iVHJhY2tBbmFseXNpc0hpc3RQVigpOworCisvKiBCYXNlZCBvbiBoaXN0b2dyYW0gYW5hbHlzaXMgb2YgNUQgRlYgKHgseSx2eCx2eSxzdGF0ZSk6ICovCitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXNIaXN0UFZTKCk7CisKKy8qIEJhc2VkIG9uIGhpc3RvZ3JhbSBhbmFseXNpcyBvZiA0RCBGViAoc3RhcnRwb3Msc3RvcHBvcyk6ICovCitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXNIaXN0U1MoKTsKKworCisKKy8qIEJhc2VkIG9uIFNWTSBjbGFzc2lmaWVyIGFuYWx5c2lzIG9mIDJEIEZWICh4LHkpOiAqLworLy9DVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXNTVk1QKCk7CisKKy8qIEJhc2VkIG9uIFNWTSBjbGFzc2lmaWVyIGFuYWx5c2lzIG9mIDREIEZWICh4LHksdngsdnkpOiAqLworLy9DVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXNTVk1QVigpOworCisvKiBCYXNlZCBvbiBTVk0gY2xhc3NpZmllciBhbmFseXNpcyBvZiA1RCBGViAoeCx5LHZ4LHZ5LHN0YXRlKTogKi8KKy8vQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0FuYWx5c2lzKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja0FuYWx5c2lzU1ZNUFZTKCk7CisKKy8qIEJhc2VkIG9uIFNWTSBjbGFzc2lmaWVyIGFuYWx5c2lzIG9mIDREIEZWIChzdGFydHBvcyxzdG9wcG9zKTogKi8KKy8vQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0FuYWx5c2lzKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja0FuYWx5c2lzU1ZNU1MoKTsKKworLyogVHJhY2sgYW5hbHlzaXMgYmFzZWQgb24gZGlzdGFuY2UgYmV0d2VlbiB0cmFja3M6ICovCitDVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXNUcmFja0Rpc3QoKTsKKworLyogQW5hbHl6ZXIgYmFzZWQgb24gcmVhdGlvbiBSb2FkIGFuZCBoZWlnaHQgbWFwOiAqLworLy9DVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXMqIGN2Q3JlYXRlTW9kdWxlQmxvYlRyYWNrQW5hbHlzaXMzRFJvYWRNYXAoKTsKKworLyogQW5hbHl6ZXIgdGhhdCBtYWtlcyBPUiBkZWNpc2lvbiB1c2luZyBzZXQgb2YgYW5hbHl6ZXJzOiAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0FuYWx5c2lzKiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja0FuYWx5c2lzSU9SKCk7CisKKy8qIEVzdGltYXRvciBvZiBodW1hbiBoZWlnaHQ6ICovCitjbGFzcyBDVl9FWFBPUlRTIEN2QmxvYlRyYWNrQW5hbHlzaXNIZWlnaHQ6IHB1YmxpYyBDdkJsb2JUcmFja0FuYWx5c2lzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCBkb3VibGUgIEdldEhlaWdodChDdkJsb2IqIHBCKSA9IDA7Cit9OyAKKy8vQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja0FuYWx5c2lzSGVpZ2h0KiBjdkNyZWF0ZU1vZHVsZUJsb2JUcmFja0FuYWx5c2lzSGVpZ2h0U2NhbGUoKTsKKworCisKKy8qIEFVVE8gQkxPQiBUUkFDS0VSIElOVEVSRkFDRSAtLSBwaXBlbGluZSBvZiAzIG1vZHVsZXM6ICovCitjbGFzcyBDVl9FWFBPUlRTIEN2QmxvYlRyYWNrZXJBdXRvOiBwdWJsaWMgQ3ZWU01vZHVsZQoreworcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCAgICAgICAgUHJvY2VzcyhJcGxJbWFnZSogcEltZywgSXBsSW1hZ2UqIHBNYXNrID0gTlVMTCkgPSAwOworICAgIHZpcnR1YWwgQ3ZCbG9iKiAgICAgR2V0QmxvYihpbnQgaW5kZXgpID0gMDsKKyAgICB2aXJ0dWFsIEN2QmxvYiogICAgIEdldEJsb2JCeUlEKGludCBJRCkgPSAwOworICAgIHZpcnR1YWwgaW50ICAgICAgICAgR2V0QmxvYk51bSgpID0gMDsKKyAgICB2aXJ0dWFsIElwbEltYWdlKiAgIEdldEZHTWFzaygpe3JldHVybiBOVUxMO307CisgICAgdmlydHVhbCBmbG9hdCAgICAgICBHZXRTdGF0ZShpbnQgQmxvYklEKSA9IDA7CisgICAgdmlydHVhbCBjaGFyKiAgICAgICBHZXRTdGF0ZURlc2MoaW50IEJsb2JJRCkgPSAwOworICAgIC8qIHJldHVybiAwIGlmIHRyYWplY3RvcnkgaXMgbm9ybWFsOworICAgICAqIHJldHVybiA+MCBpZiB0cmFqZWN0b3J5IGFibm9ybWFsLiAqLworICAgIHZpcnR1YWwgdm9pZCAgICBSZWxlYXNlKCkgPSAwOworfTsKK2lubGluZSB2b2lkIGN2UmVsZWFzZUJsb2JUcmFja2VyQXV0byhDdkJsb2JUcmFja2VyQXV0byoqIHBwVCkKK3sKKyAgICBwcFRbMF0tPlJlbGVhc2UoKTsKKyAgICBwcFRbMF0gPSAwOworfQorLyogRU5EIEFVVE8gQkxPQiBUUkFDS0VSIElOVEVSRkFDRSAqLworCisKKy8qIENvbnN0cnVjdG9yIGZ1bmN0aW9ucyBhbmQgZGF0YSBmb3Igc3BlY2lmaWMgQmxvYlRSYWNrZXJBdXRvIG1vZHVsZXM6ICovCisKKy8qIFBhcmFtZXRlcnMgb2YgYmxvYnRyYWNrZXIgYXV0byB2ZXIxOiAqLworc3RydWN0IEN2QmxvYlRyYWNrZXJBdXRvUGFyYW0xCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgRkdUcmFpbkZyYW1lczsgLyogTnVtYmVyIG9mIGZyYW1lcyBuZWVkZWQgZm9yIEZHIChmb3JlZ3JvdW5kKSBkZXRlY3RvciB0byB0cmFpbi4gICAgICAgICovCisKKyAgICBDdkZHRGV0ZWN0b3IqICAgICAgICAgICBwRkc7ICAgICAgICAgICAvKiBGR0RldGVjdG9yIG1vZHVsZS4gSWYgdGhpcyBmaWVsZCBpcyBOVUxMIHRoZSBQcm9jZXNzIEZHIG1hc2sgaXMgdXNlZC4gKi8KKworICAgIEN2QmxvYkRldGVjdG9yKiAgICAgICAgIHBCRDsgICAgICAgICAgIC8qIFNlbGVjdGVkIGJsb2IgZGV0ZWN0b3IgbW9kdWxlLiAJCQkJCSAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHRoaXMgZmllbGQgaXMgTlVMTCBkZWZhdWx0IGJsb2JkZXRlY3RvciBtb2R1bGUgd2lsbCBiZSBjcmVhdGVkLiAgICAqLworCisgICAgQ3ZCbG9iVHJhY2tlciogICAgICAgICAgcEJUOyAgICAgICAgICAgLyogU2VsZWN0ZWQgYmxvYiB0cmFja2luZyBtb2R1bGUuCQkJCQkgICAgKi8JCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBmaWVsZCBpcyBOVUxMIGRlZmF1bHQgYmxvYnRyYWNrZXIgbW9kdWxlIHdpbGwgYmUgY3JlYXRlZC4gICAgICovCisKKyAgICBDdkJsb2JUcmFja0dlbiogICAgICAgICBwQlRHZW47ICAgICAgICAvKiBTZWxlY3RlZCBibG9iIHRyYWplY3RvcnkgZ2VuZXJhdG9yLgkJCQkgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGlzIGZpZWxkIGlzIE5VTEwgbm8gZ2VuZXJhdG9yIGlzIHVzZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIEN2QmxvYlRyYWNrUG9zdFByb2MqICAgIHBCVFBQOyAgICAgICAgIC8qIFNlbGVjdGVkIGJsb2IgdHJhamVjdG9yeSBwb3N0cHJvY2Vzc2luZyBtb2R1bGUuCQkJICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgdGhpcyBmaWVsZCBpcyBOVUxMIG5vIHBvc3Rwcm9jZXNzaW5nIGlzIGRvbmUuICAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBVc2VQUERhdGE7CisKKyAgICBDdkJsb2JUcmFja0FuYWx5c2lzKiAgICBwQlRBOyAgICAgICAgICAvKiBTZWxlY3RlZCBibG9iIHRyYWplY3RvcnkgYW5hbHlzaXMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB0aGlzIGZpZWxkIGlzIE5VTEwgbm8gdHJhY2sgYW5hbHlzaXMgaXMgZG9uZS4gICAgICAgICAgICAgICAgICAgICAgKi8KK307CisKKy8qIENyZWF0ZSBibG9iIHRyYWNrZXIgYXV0byB2ZXIxOiAqLworQ1ZfRVhQT1JUUyBDdkJsb2JUcmFja2VyQXV0byogY3ZDcmVhdGVCbG9iVHJhY2tlckF1dG8xKEN2QmxvYlRyYWNrZXJBdXRvUGFyYW0xKiBwYXJhbSA9IE5VTEwpOworCisvKiBTaW1wbGUgbG9hZGVyIGZvciBtYW55IGF1dG8gdHJhY2tlcnMgYnkgaXRzIHR5cGUgOiAqLworaW5saW5lIEN2QmxvYlRyYWNrZXJBdXRvKiBjdkNyZWF0ZUJsb2JUcmFja2VyQXV0byhpbnQgdHlwZSwgdm9pZCogcGFyYW0pCit7CisgICAgaWYodHlwZSA9PSAwKSByZXR1cm4gY3ZDcmVhdGVCbG9iVHJhY2tlckF1dG8xKChDdkJsb2JUcmFja2VyQXV0b1BhcmFtMSopcGFyYW0pOworICAgIHJldHVybiAwOworfQorCisKKworc3RydWN0IEN2VHJhY2tzVGltZVBvcworeworICAgIGludCBsZW4xLGxlbjI7CisgICAgaW50IGJlZzEsYmVnMjsKKyAgICBpbnQgZW5kMSxlbmQyOworICAgIGludCBjb21MZW47IC8vY29tbW9uIGxlbmd0aCBmb3IgdHdvIHRyYWNrcworICAgIGludCBzaGlmdDEsc2hpZnQyOworfTsKKworLypDVl9FWFBPUlRTIGludCBjdkNvbXBhcmVUcmFja3MoIEN2QmxvYlRyYWNrU2VxICpncm91bmRUcnV0aCwKKyAgICAgICAgICAgICAgICAgICBDdkJsb2JUcmFja1NlcSAqcmVzdWx0LAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZpbGUpOyovCisKKworLyogQ29uc3RydWN0b3IgZnVuY3Rpb25zOiAgKi8KKworQ1ZfRVhQT1JUUyB2b2lkIGN2Q3JlYXRlVHJhY2tzX09uZShDdkJsb2JUcmFja1NlcSAqVFMpOworQ1ZfRVhQT1JUUyB2b2lkIGN2Q3JlYXRlVHJhY2tzX1NhbWUoQ3ZCbG9iVHJhY2tTZXEgKlRTMSwgQ3ZCbG9iVHJhY2tTZXEgKlRTMik7CitDVl9FWFBPUlRTIHZvaWQgY3ZDcmVhdGVUcmFja3NfQXJlYUVycihDdkJsb2JUcmFja1NlcSAqVFMxLCBDdkJsb2JUcmFja1NlcSAqVFMyLCBpbnQgYWRkVywgaW50IGFkZEgpOworCisKKy8qIEhJU1QgQVBJICovCitjbGFzcyBDVl9FWFBPUlRTIEN2UHJvYgoreworcHVibGljOgorICAgIHZpcnR1YWwgfkN2UHJvYigpIHt9OworCisgICAgLyogQ2FsY3VsYXRlIHByb2JhYmlsaXR5IHZhbHVlOiAqLyAKKyAgICB2aXJ0dWFsIGRvdWJsZSBWYWx1ZShpbnQqIC8qY29tcCovLCBpbnQgLyp4Ki8gPSAwLCBpbnQgLyp5Ki8gPSAwKXtyZXR1cm4gLTE7fTsKKworICAgIC8qIFVwZGF0ZSBoaXN0b2dyYXBwIFBuZXcgPSAoMS1XKSpQb2xkICsgVypQYWRkKi8KKyAgICAvKiBXIHdlaWdodCBvZiBuZXcgYWRkZWQgcHJvYiAqLworICAgIC8qIGNvbXBzIC0gbWF0cml4IG9mIG5ldyBmZXRhdHVyZSB2ZWN0b3JzIHVzZWQgdG8gdXBkYXRlIHByb2IgKi8KKyAgICB2aXJ0dWFsIHZvaWQgQWRkRmVhdHVyZShmbG9hdCBXLCBpbnQqIGNvbXBzLCBpbnQgeCA9MCwgaW50IHkgPSAwKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFNjYWxlKGZsb2F0IGZhY3RvciA9IDAsIGludCB4ID0gLTEsIGludCB5ID0gLTEpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgUmVsZWFzZSgpID0gMDsKK307CitpbmxpbmUgdm9pZCBjdlJlbGVhc2VQcm9iKEN2UHJvYioqIHBwUHJvYil7cHBQcm9iWzBdLT5SZWxlYXNlKCk7cHBQcm9iWzBdPU5VTEw7fQorLyogSElTVCBBUEkgKi8KKworLyogU29tZSBQcm9iOiAqLworQ1ZfRVhQT1JUUyBDdlByb2IqIGN2Q3JlYXRlUHJvYlMoaW50IGRpbSwgQ3ZTaXplIHNpemUsIGludCBzYW1wbGVfbnVtKTsKK0NWX0VYUE9SVFMgQ3ZQcm9iKiBjdkNyZWF0ZVByb2JNRyhpbnQgZGltLCBDdlNpemUgc2l6ZSwgaW50IHNhbXBsZV9udW0pOworQ1ZfRVhQT1JUUyBDdlByb2IqIGN2Q3JlYXRlUHJvYk1HMihpbnQgZGltLCBDdlNpemUgc2l6ZSwgaW50IHNhbXBsZV9udW0pOworQ1ZfRVhQT1JUUyBDdlByb2IqIGN2Q3JlYXRlUHJvYkhpc3QoaW50IGRpbSwgQ3ZTaXplIHNpemUpOworCisjZGVmaW5lIENWX0JUX0hJU1RfVFlQRV9TICAgICAwCisjZGVmaW5lIENWX0JUX0hJU1RfVFlQRV9NRyAgICAxCisjZGVmaW5lIENWX0JUX0hJU1RfVFlQRV9NRzIgICAyCisjZGVmaW5lIENWX0JUX0hJU1RfVFlQRV9IICAgICAzCitpbmxpbmUgQ3ZQcm9iKiBjdkNyZWF0ZVByb2IoaW50IHR5cGUsIGludCBkaW0sIEN2U2l6ZSBzaXplID0gY3ZTaXplKDEsMSksIHZvaWQqIC8qcGFyYW0qLyA9IE5VTEwpCit7CisgICAgaWYodHlwZSA9PSBDVl9CVF9ISVNUX1RZUEVfUykgcmV0dXJuIGN2Q3JlYXRlUHJvYlMoZGltLCBzaXplLCAtMSk7CisgICAgaWYodHlwZSA9PSBDVl9CVF9ISVNUX1RZUEVfTUcpIHJldHVybiBjdkNyZWF0ZVByb2JNRyhkaW0sIHNpemUsIC0xKTsKKyAgICBpZih0eXBlID09IENWX0JUX0hJU1RfVFlQRV9NRzIpIHJldHVybiBjdkNyZWF0ZVByb2JNRzIoZGltLCBzaXplLCAtMSk7CisgICAgaWYodHlwZSA9PSBDVl9CVF9ISVNUX1RZUEVfSCkgcmV0dXJuIGN2Q3JlYXRlUHJvYkhpc3QoZGltLCBzaXplKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworCisKKy8qIE5vaXNlIHR5cGUgZGVmaW5pdGlvbnM6ICovCisjZGVmaW5lIENWX05PSVNFX05PTkUgICAgICAgICAgICAgICAwCisjZGVmaW5lIENWX05PSVNFX0dBVVNTSUFOICAgICAgICAgICAxCisjZGVmaW5lIENWX05PSVNFX1VOSUZPUk0gICAgICAgICAgICAyCisjZGVmaW5lIENWX05PSVNFX1NQRUNLTEUgICAgICAgICAgICAzCisjZGVmaW5lIENWX05PSVNFX1NBTFRfQU5EX1BFUFBFUiAgICA0CisKKy8qIEFkZCBzb21lIG5vaXNlIHRvIGltYWdlOiAqLworLyogcEltZyAtIChpbnB1dCkgaW1hZ2Ugd2l0aG91dCBub2lzZSAqLworLyogcEltZyAtIChvdXRwdXQpIGltYWdlIHdpdGggbm9pc2UgKi8KKy8qIG5vaXNlX3R5cGUgLSB0eXBlIG9mIGFkZGVkIG5vaXNlICovCisvKiAgQ1ZfTk9JU0VfR0FVU1NJQU4gLSBwSW1nICs9IG4gLCBuIC0gaXMgZ2F1c3NpYW4gbm9pc2Ugd2l0aCBBbXBsIHN0YW5kYXJ0IGRldmlhdGlvbiAqLworLyogIENWX05PSVNFX1VOSUZPUk0gLSBwSW1nICs9IG4gLCBuIC0gaXMgdW5pZm9ybSBub2lzZSB3aXRoIEFtcGwgc3RhbmRhcnQgZGV2aWF0aW9uICovCisvKiAgQ1ZfTk9JU0VfU1BFQ0tMRSAtIHBJbWcgKz0gbipwSW1nICwgbiAtIGlzIGdhdXNzaWFuIG5vaXNlIHdpdGggQW1wbCBzdGFuZGFydCBkZXZpYXRpb24gKi8KKy8qICBDVl9OT0lTRV9TQUxUX0FORF9QQVBQRVIgLSBwSW1nID0gcEltZyB3aXRoIGJsYWNrZWQgYW5kIHdoaXRlZCBwaXhlbHMsIAorICAgICAgICAgICAgQW1wbCBpcyBkZW5zaXR5IG9mIGJyb2NrZW4gcGl4ZWxzICgwLXRoZXJlIGFyZSBub3QgYnJva2VuIHBpeGVscywgMSAtIGFsbCBwaXhlbHMgYXJlIGJyb2tlbikqLworLyogQW1wbCAtICJhbXBsaXR1ZGUiIG9mIG5vaXNlICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK0NWX0VYUE9SVFMgdm9pZCBjdkFkZE5vaXNlKElwbEltYWdlKiBwSW1nLCBpbnQgbm9pc2VfdHlwZSwgZG91YmxlIEFtcGwsIEN2UmFuZFN0YXRlKiBybmRfc3RhdGUgPSBOVUxMKTsKKworLyo9PT09PT09PT09PT09PT09PT0gR0VORVJBVE9SIE9GIFRFU1QgVklERU8gU0VRVUVOQ0UgPT09PT09PT09PT09PT09PT09PT09ICovCit0eXBlZGVmIHZvaWQgQ3ZUZXN0U2VxOworCisvKiBwQ29uZmlnZmlsZSAtIE5hbWUgb2YgZmlsZSAoeW1sIG9yIHhtbCkgd2l0aCBkZXNjcmlwdGlvbiBvZiB0ZXN0IHNlcXVlbmNlICovCisvKiB2aWRlb3MgLSBhcnJheSBvZiBuYW1lcyBvZiB0ZXN0IHZpZGVvcyBkZXNjcmliZWQgaW4gInBDb25maWdmaWxlIiBmaWxlICovCisvKiBudW12aWRlb3MgLSBzaXplIG9mICJ2aWRlb3MiIGFycmF5ICovCitDVl9FWFBPUlRTIEN2VGVzdFNlcSogY3ZDcmVhdGVUZXN0U2VxKGNoYXIqIHBDb25maWdmaWxlLCBjaGFyKiogdmlkZW9zLCBpbnQgbnVtdmlkZW8sIGZsb2F0IFNjYWxlID0gMSwgaW50IG5vaXNlX3R5cGUgPSBDVl9OT0lTRV9OT05FLCBkb3VibGUgbm9pc2VfYW1wbCA9IDApOworQ1ZfRVhQT1JUUyB2b2lkIGN2UmVsZWFzZVRlc3RTZXEoQ3ZUZXN0U2VxKiogcHBUZXN0U2VxKTsKKworLyogR2VuZXJhdGUgbmV4dCBmcmFtZSBmcm9tIHRlc3QgdmlkZW8gc2VxIGFuZCByZXR1cm4gcG9pbnRlciB0byBpdDogKi8KK0NWX0VYUE9SVFMgSXBsSW1hZ2UqIGN2VGVzdFNlcVF1ZXJ5RnJhbWUoQ3ZUZXN0U2VxKiBwVGVzdFNlcSk7CisKKy8qIFJldHVybiBwb2ludGVyIHRvIGN1cnJlbnQgZm9yZWdyb3VuZCBtYXNrOiAqLworQ1ZfRVhQT1JUUyBJcGxJbWFnZSogY3ZUZXN0U2VxR2V0RkdNYXNrKEN2VGVzdFNlcSogcFRlc3RTZXEpOworCisvKiBSZXR1cm4gcG9pbnRlciB0byBjdXJyZW50IGltYWdlOiAqLworQ1ZfRVhQT1JUUyBJcGxJbWFnZSogY3ZUZXN0U2VxR2V0SW1hZ2UoQ3ZUZXN0U2VxKiBwVGVzdFNlcSk7CisKKy8qIFJldHVybiBmcmFtZSBzaXplIG9mIHJlc3VsdCB0ZXN0IHZpZGVvOiAqLworQ1ZfRVhQT1JUUyBDdlNpemUgY3ZUZXN0U2VxR2V0SW1hZ2VTaXplKEN2VGVzdFNlcSogcFRlc3RTZXEpOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyByZXN1bHQgdGVzdCB2aWRlbzogKi8KK0NWX0VYUE9SVFMgaW50IGN2VGVzdFNlcUZyYW1lTnVtKEN2VGVzdFNlcSogcFRlc3RTZXEpOworCisvKiBSZXR1cm4gbnVtYmVyIG9mIGV4aXN0aW5nIG9iamVjdHMuIAorICogVGhpcyBpcyBnZW5lcmFsIG51bWJlciBvZiBhbnkgb2JqZWN0cy4gCisgKiBGb3IgZXhhbXBsZSBudW1iZXIgb2YgdHJhamVjdG9yaWVzIG1heSBiZSBlcXVhbCBvciBsZXNzIHRoYW4gcmV0dXJuZWQgdmFsdWU6CisgKi8KK0NWX0VYUE9SVFMgaW50IGN2VGVzdFNlcUdldE9iamVjdE51bShDdlRlc3RTZXEqIHBUZXN0U2VxKTsKKworLyogUmV0dXJuIDAgaWYgdGhlcmUgaXMgbm90IHBvc2l0aW9uIGZvciBjdXJyZW50IGRlZmluZWQgb24gY3VycmVudCBmcmFtZSAqLworLyogUmV0dXJuIDEgaWYgdGhlcmUgaXMgb2JqZWN0IHBvc2l0aW9uIGFuZCBwUG9zIHdhcyBmaWxsZWQgKi8KK0NWX0VYUE9SVFMgaW50IGN2VGVzdFNlcUdldE9iamVjdFBvcyhDdlRlc3RTZXEqIHBUZXN0U2VxLCBpbnQgT2JqSW5kZXgsIEN2UG9pbnQyRDMyZiogcFBvcyk7CitDVl9FWFBPUlRTIGludCBjdlRlc3RTZXFHZXRPYmplY3RTaXplKEN2VGVzdFNlcSogcFRlc3RTZXEsIGludCBPYmpJbmRleCwgQ3ZQb2ludDJEMzJmKiBwU2l6ZSk7CisKKy8qIEFkZCBub2lzZSB0byBmaW5hbCBpbWFnZTogKi8KK0NWX0VYUE9SVFMgdm9pZCBjdlRlc3RTZXFBZGROb2lzZShDdlRlc3RTZXEqIHBUZXN0U2VxLCBpbnQgbm9pc2VfdHlwZSA9IENWX05PSVNFX05PTkUsIGRvdWJsZSBub2lzZV9hbXBsID0gMCk7CisKKy8qIEFkZCBJbnRlbnNpdHkgdmFyaWF0aW9uOiAqLworQ1ZfRVhQT1JUUyB2b2lkIGN2VGVzdFNlcUFkZEludGVuc2l0eVZhcmlhdGlvbihDdlRlc3RTZXEqIHBUZXN0U2VxLCBmbG9hdCBESV9wZXJfZnJhbWUsIGZsb2F0IE1pbkksIGZsb2F0IE1heEkpOworQ1ZfRVhQT1JUUyB2b2lkIGN2VGVzdFNlcVNldEZyYW1lKEN2VGVzdFNlcSogcFRlc3RTZXEsIGludCBuKTsKKworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL19jdmF1eC5oIGIvY3ZhdXgvc3JjL19jdmF1eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MjY3ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvX2N2YXV4LmgKQEAgLTAsMCArMSw3MyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaWZuZGVmIF9fQ1ZBVVhfSF9fCisjZGVmaW5lIF9fQ1ZBVVhfSF9fCisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQ3MTAgNDcxMSA0NTE0IDQ5OTYgKSAvKiBmdW5jdGlvbiBBQUEgc2VsZWN0ZWQgZm9yIGF1dG9tYXRpYyBpbmxpbmUgZXhwYW5zaW9uICovCisjZW5kaWYKKworI2luY2x1ZGUgImN2YXV4LmgiCisjaW5jbHVkZSAiY3htaXNjLmgiCisjaW5jbHVkZSAiX2N2bWF0cml4LmgiCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OworCitDVl9JTkxJTkUgYm9vbCBvcGVyYXRvciA9PSAoQ3ZTaXplIHNpemUxLCBDdlNpemUgc2l6ZTIgKTsKK0NWX0lOTElORSBib29sIG9wZXJhdG9yID09IChDdlNpemUgc2l6ZTEsIEN2U2l6ZSBzaXplMiApCit7CisgICAgcmV0dXJuIHNpemUxLndpZHRoID09IHNpemUyLndpZHRoICYmIHNpemUxLmhlaWdodCA9PSBzaXplMi5oZWlnaHQ7Cit9CisKK0NWX0lOTElORSBib29sIG9wZXJhdG9yICE9IChDdlNpemUgc2l6ZTEsIEN2U2l6ZSBzaXplMiApOworQ1ZfSU5MSU5FIGJvb2wgb3BlcmF0b3IgIT0gKEN2U2l6ZSBzaXplMSwgQ3ZTaXplIHNpemUyICkKK3sKKyAgICByZXR1cm4gc2l6ZTEud2lkdGggIT0gc2l6ZTIud2lkdGggfHwgc2l6ZTEuaGVpZ2h0ICE9IHNpemUyLmhlaWdodDsKK30KKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjZW5kaWYgLyogX19DVkFVWF9IX18gKi8KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9fY3ZmYWNlZGV0ZWN0aW9uLmggYi9jdmF1eC9zcmMvX2N2ZmFjZWRldGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNDFiZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvX2N2ZmFjZWRldGVjdGlvbi5oCkBAIC0wLDAgKzEsNDEyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vIENyZWF0ZWQgYnkgS2h1ZHlha292IFYuQS4gYm9iZXJAZ29yb2Rvay5uZXQKKy8vIEZhY2VEZXRlY3Rpb24uaDogaW50ZXJmYWNlIGZvciB0aGUgRmFjZURldGVjdGlvbiBjbGFzcy4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpZm5kZWYgX0NWRkFDRURFVEVDVElPTl9IXworI2RlZmluZSBfQ1ZGQUNFREVURUNUSU9OX0hfCisKKyNkZWZpbmUgTUFYX0xBWUVSUyA2NAorCitjbGFzcyBGYWNlRmVhdHVyZQoreworcHVibGljOgorICAgIEZhY2VGZWF0dXJlKGRvdWJsZSBkV2VpZ2h0LHZvaWQgKiBscENvbnRvdXIsYm9vbCBiSXNGZWF0dXJlKTsKKyAgICBGYWNlRmVhdHVyZSgpOworICAgIHZpcnR1YWwgfkZhY2VGZWF0dXJlKCk7CisgICAgaW5saW5lIGJvb2wgaXNGYWNlRmVhdHVyZSgpOworICAgIGlubGluZSB2b2lkICogR2V0Q29udG91cigpOworICAgIGlubGluZSBkb3VibGUgR2V0V2VpZ2h0KCk7CisgICAgaW5saW5lIHZvaWQgU2V0Q29udG91cih2b2lkICogbHBDb250b3VyKTsgCisgICAgaW5saW5lIHZvaWQgU2V0V2VpZ2h0KGRvdWJsZSBkV2VpZ2h0KTsKKyAgICBpbmxpbmUgdm9pZCBTZXRGZWF0dXJlKGJvb2wgYklzRmVhdHVyZSk7Citwcml2YXRlOgorICAgIGRvdWJsZSBtX2RXZWlnaHQ7CisgICAgdm9pZCAqIG1fbHBDb250b3VyOworICAgIGJvb2wgbV9iSXNGYWNlRmVhdHVyZTsKK307Ly9jbGFzcyBGYWNlRmVhdHVyZQorCitpbmxpbmUgdm9pZCBGYWNlRmVhdHVyZTo6U2V0RmVhdHVyZShib29sIGJJc0ZlYXR1cmUpCit7CisgICAgbV9iSXNGYWNlRmVhdHVyZSA9IGJJc0ZlYXR1cmU7Cit9CisKK2lubGluZSBib29sIEZhY2VGZWF0dXJlOjppc0ZhY2VGZWF0dXJlKCkKK3sKKyAgICByZXR1cm4gbV9iSXNGYWNlRmVhdHVyZTsKK30vL2lubGluZSBib29sIEZhY2VGZWF0dXJlOjppc0ZhY2VGZWF0dXJlKCkKKworaW5saW5lIHZvaWQgKiBGYWNlRmVhdHVyZTo6R2V0Q29udG91cigpCit7CisgICAgcmV0dXJuIG1fbHBDb250b3VyOyAKK30vL2lubGluZSB2b2lkICogRmFjZUZlYXR1cmU6OkdldENvbnRvdXIoKQorCitpbmxpbmUgZG91YmxlIEZhY2VGZWF0dXJlOjpHZXRXZWlnaHQoKQoreworICAgIHJldHVybiBtX2RXZWlnaHQ7Cit9Ly9pbmxpbmUgbG9uZyBGYWNlRmVhdHVyZTo6R2V0V2VpZ2h0KCkKKworaW5saW5lIHZvaWQgRmFjZUZlYXR1cmU6OlNldENvbnRvdXIodm9pZCAqIGxwQ29udG91cikKK3sKKyAgICBtX2xwQ29udG91ciA9IGxwQ29udG91cjsKK30vL2lubGluZSB2b2lkIEZhY2VGZWF0dXJlOjpTZXRDb250b3VyKHZvaWQgKiBscENvbnRvdXIpCisKK2lubGluZSB2b2lkIEZhY2VGZWF0dXJlOjpTZXRXZWlnaHQoZG91YmxlICBkV2VpZ2h0KQoreworICAgIG1fZFdlaWdodCA9IGRXZWlnaHQ7Cit9Ly9pbmxpbmUgdm9pZCBGYWNlRmVhdHVyZTo6U2V0V2VpZ2h0KGRvdWJsZSAqIGRXZWlnaHQpCisKKworCitjbGFzcyBGYWNlVGVtcGxhdGUKK3sKK3B1YmxpYzoKKyAgICBGYWNlVGVtcGxhdGUobG9uZyBsRmVhdHVyZUNvdW50KSB7bV9sRmVhdHVyZXNDb3VudCA9IGxGZWF0dXJlQ291bnQ7ICBtX2xwRmVhdHVyZXNMaXN0ID0gbmV3IEZhY2VGZWF0dXJlW2xGZWF0dXJlQ291bnRdO307CisgICAgdmlydHVhbCB+RmFjZVRlbXBsYXRlKCk7CisgICAgCisgICAgaW5saW5lIGxvbmcgR2V0Q291bnQoKTsKKyAgICBpbmxpbmUgRmFjZUZlYXR1cmUgKiBHZXRGZWF0dXJlcygpOworCitwcm90ZWN0ZWQ6CisgICAgRmFjZUZlYXR1cmUgKiBtX2xwRmVhdHVyZXNMaXN0OyAKK3ByaXZhdGU6CisgICAgbG9uZyBtX2xGZWF0dXJlc0NvdW50OworfTsvL2NsYXNzIEZhY2VUZW1wbGF0ZQorCisKK2lubGluZSBsb25nIEZhY2VUZW1wbGF0ZTo6R2V0Q291bnQoKQoreworICAgIHJldHVybiBtX2xGZWF0dXJlc0NvdW50OworfS8vaW5saW5lIGxvbmcgRmFjZVRlbXBsYXRlOjpHZXRDb3VudCgpCisKKworaW5saW5lIEZhY2VGZWF0dXJlICogRmFjZVRlbXBsYXRlOjpHZXRGZWF0dXJlcygpCit7CisgICAgcmV0dXJuIG1fbHBGZWF0dXJlc0xpc3Q7Cit9Ly9pbmxpbmUgRmFjZUZlYXR1cmUgKiBGYWNlVGVtcGxhdGU6OkdldEZlYXR1cmVzKCkKKworLy8vLy8vLy8vLy8vCisvL2NsYXNzIFJGYWNlVGVtcGxhdGUKKy8vLy8vLy8vLy8vCisKK2NsYXNzIE1vdXRoRmFjZVRlbXBsYXRlOnB1YmxpYyBGYWNlVGVtcGxhdGUKK3sKK3B1YmxpYzoKKyAgICBpbmxpbmUgTW91dGhGYWNlVGVtcGxhdGUobG9uZyBsTnVtYmVyLEN2UmVjdCByZWN0LGRvdWJsZSBkRXllV2lkdGgsZG91YmxlIGRFeWVIZWlnaHQsZG91YmxlIGREaXN0YW5jZUJldHdlZW5FeWUsZG91YmxlIGREaXN0YW5jZUV5ZUFib3ZlTW91dGgpOworICAgIH5Nb3V0aEZhY2VUZW1wbGF0ZSgpOworfTsvL2NsYXNzIE1vdXRoRmFjZVRlbXBsYXRlOnB1YmxpYyBGYWNlVGVtcGxhdGUKKworCitpbmxpbmUgTW91dGhGYWNlVGVtcGxhdGU6Ok1vdXRoRmFjZVRlbXBsYXRlKGxvbmcgbE51bWJlcixDdlJlY3QgcmVjdCxkb3VibGUgZEV5ZVdpZHRoLGRvdWJsZSBkRXllSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZERpc3RhbmNlQmV0d2VlbkV5ZSxkb3VibGUgZERpc3RhbmNlRXllQWJvdmVNb3V0aCk6RmFjZVRlbXBsYXRlKGxOdW1iZXIpCit7CisgICAgCisgICAgQ3ZSZWN0IE1vdXRoUmVjdCA9IHJlY3Q7CisgICAgCisgICAgCisgICAgQ3ZSZWN0IExlZnRFeWVSZWN0ID0gY3ZSZWN0KGN2Um91bmQocmVjdC54IC0gKGRFeWVXaWR0aCArIGREaXN0YW5jZUJldHdlZW5FeWUvKGRvdWJsZSkyIC0gKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpMikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJvdW5kKHJlY3QueSAtIGREaXN0YW5jZUV5ZUFib3ZlTW91dGggLSBkRXllSGVpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZChkRXllV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJvdW5kKGRFeWVIZWlnaHQpICk7CisKKyAgICBDdlJlY3QgUmlnaHRFeWVSZWN0ID0gY3ZSZWN0KGN2Um91bmQocmVjdC54ICsgKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpMiArIGREaXN0YW5jZUJldHdlZW5FeWUvKGRvdWJsZSkyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQocmVjdC55IC0gZERpc3RhbmNlRXllQWJvdmVNb3V0aCAtIGRFeWVIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZChkRXllV2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZChkRXllSGVpZ2h0KSApOworCisvLyAgQ3ZSZWN0IE5vc2VSZWN0ID0gY3ZSZWN0KGN2Um91bmQocmVjdC54ICsgKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpNCksCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQocmVjdC55IC0gKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpMiAtIChkb3VibGUpcmVjdC5oZWlnaHQvKGRvdWJsZSk0KSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCgoZG91YmxlKXJlY3Qud2lkdGgvKGRvdWJsZSkyKSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCgoZG91YmxlKXJlY3Qud2lkdGgvKGRvdWJsZSkyKSApOworLyogIAorICAgIEN2UmVjdCBDaGVlblJlY3QgPSBjdlJlY3QocmVjdC54LHJlY3QueSArIDMqcmVjdC5oZWlnaHQvMixyZWN0LndpZHRoLHJlY3QuaGVpZ2h0KTsKKyAgICAgICAgCisqLyAgCisgICAgCisgICAgQ3ZSZWN0ICogbHBNb3V0aFJlY3QgPSBuZXcgQ3ZSZWN0KCk7CisgICAgKmxwTW91dGhSZWN0ID0gTW91dGhSZWN0OworICAgIG1fbHBGZWF0dXJlc0xpc3RbMF0uU2V0Q29udG91cihscE1vdXRoUmVjdCk7CisgICAgbV9scEZlYXR1cmVzTGlzdFswXS5TZXRXZWlnaHQoMSk7CisgICAgbV9scEZlYXR1cmVzTGlzdFswXS5TZXRGZWF0dXJlKGZhbHNlKTsKKworCisgICAgQ3ZSZWN0ICogbHBMZWZ0RXllUmVjdCA9IG5ldyBDdlJlY3QoKTsKKyAgICAqbHBMZWZ0RXllUmVjdCA9IExlZnRFeWVSZWN0OworICAgIG1fbHBGZWF0dXJlc0xpc3RbMV0uU2V0Q29udG91cihscExlZnRFeWVSZWN0KTsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzFdLlNldFdlaWdodCgxKTsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzFdLlNldEZlYXR1cmUodHJ1ZSk7CisKKyAgICBDdlJlY3QgKiBscFJpZ2h0RXllUmVjdCA9IG5ldyBDdlJlY3QoKTsKKyAgICAqbHBSaWdodEV5ZVJlY3QgPSBSaWdodEV5ZVJlY3Q7CisgICAgbV9scEZlYXR1cmVzTGlzdFsyXS5TZXRDb250b3VyKGxwUmlnaHRFeWVSZWN0KTsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzJdLlNldFdlaWdodCgxKTsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzJdLlNldEZlYXR1cmUodHJ1ZSk7CisKKyAgICAKKy8vICBDdlJlY3QgKiBscE5vc2VSZWN0ID0gbmV3IEN2UmVjdCgpOworLy8gICpscE5vc2VSZWN0ID0gTm9zZVJlY3Q7CisvLyAgbV9scEZlYXR1cmVzTGlzdFszXS5TZXRDb250b3VyKGxwTm9zZVJlY3QpOworLy8gIG1fbHBGZWF0dXJlc0xpc3RbM10uU2V0V2VpZ2h0KDApOworLy8gIG1fbHBGZWF0dXJlc0xpc3RbM10uU2V0RmVhdHVyZSh0cnVlKTsKKworLyogIEN2UmVjdCAqIGxwQ2hlZW5SZWN0ID0gbmV3IEN2UmVjdCgpOworICAgICpscENoZWVuUmVjdCA9IENoZWVuUmVjdDsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzRdLlNldENvbnRvdXIobHBDaGVlblJlY3QpOworICAgIG1fbHBGZWF0dXJlc0xpc3RbNF0uU2V0V2VpZ2h0KDEpOworICAgIG1fbHBGZWF0dXJlc0xpc3RbNF0uU2V0RmVhdHVyZShmYWxzZSk7CisKKyovCisKK30vL2NvbnN0cnVjdG9yIE1vdXRoRmFjZVRlbXBsYXRlKGxvbmcgbE51bUZlYXR1cmVzLEN2UmVjdCByZWN0LGRvdWJsZSBkRXllV2lkdGgsZG91YmxlIGRFeWVIZWlnaHQsZG91YmxlIGREaXN0YW5jZUJldHdlZW5FeWUsZG91YmxlIGREaXN0YW5jZUV5ZUFib3ZlTW91dGgpOworCisKK3R5cGVkZWYgc3RydWN0IEN2Q29udG91clJlY3QKK3sKKyAgICBpbnQgICAgIGlOdW1iZXI7CisgICAgaW50ICAgICBpVHlwZTsKKyAgICBpbnQgICAgIGlGbGFnczsKKyAgICBDdlNlcSAgICpzZXFDb250b3VyOworICAgIGludCAgICAgaUNvbnRvdXJMZW5ndGg7CisgICAgQ3ZSZWN0ICByOworICAgIEN2UG9pbnQgcENlbnRlcjsKKyAgICBpbnQgICAgIGlDb2xvcjsKK30gQ3ZDb250b3VyUmVjdDsKKworY2xhc3MgRmFjZQoreworcHVibGljOgorICAgIEZhY2UoRmFjZVRlbXBsYXRlICogbHBGYWNlVGVtcGxhdGUpOworICAgIHZpcnR1YWwgfkZhY2UoKTsKKyAgICAKKyAgICBpbmxpbmUgYm9vbCBpc0ZlYXR1cmUodm9pZCAqIGxwRWxlbSk7CisgICAgCisgICAgdmlydHVhbCB2b2lkIFNob3coSXBsSW1hZ2UgKiAvKkltYWdlKi8pe307CisgICAgdmlydHVhbCB2b2lkIFNob3dJZGVhbChJcGxJbWFnZSogLypJbWFnZSovKXt9OworICAgIAorICAgIHZpcnR1YWwgdm9pZCBDcmVhdGVGYWNlKHZvaWQgKiBscERhdGEpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgQ2hlY2tFbGVtKHZvaWQgKiBscENhbmRpZGF0LHZvaWQgKiBscElkZWFsKSA9IDA7CisgICAgdmlydHVhbCBkb3VibGUgR2V0V2VpZ2h0KCkgPSAwOworcHJvdGVjdGVkOgorICAgIEZhY2VGZWF0dXJlICogbV9scElkZWFsRmFjZTsvL2lkZWFsIGZhY2UgZGVmaW5pdGlvbgorICAgIGxvbmcgbV9sRmFjZUZlYXR1cmVzTnVtYmVyOyAvL3RvdGFsIG51bWJlciBvZiBkaWZlcmVudCBmYWNlIGZlYXR1cmVzIAorICAgIGxvbmcgKiBtX2xwbEZhY2VGZWF0dXJlc0NvdW50Oy8vbnVtYmVyIG9mIGVhY2ggZmVhdHVyZXMgZm91ZGVkIGZvciB0aGlzIGZhY2UKKyAgICBGYWNlRmVhdHVyZSAqKiBtX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXM7Ly9mb3VuZGVkIGZlYXR1cmVzIG9mIGN1cmVuIGZhY2UKKyAgICBkb3VibGUgbV9kV2VpZ2h0OworfTsKKworaW5saW5lIGJvb2wgRmFjZTo6aXNGZWF0dXJlKHZvaWQgKiBscEVsZW0pCit7CisgICAgZm9yIChpbnQgaSA9IDA7aSA8IG1fbEZhY2VGZWF0dXJlc051bWJlcjtpICsrKQorICAgIHsKKyAgICAgICAgdm9pZCAqIGxwSWRlYWwgPSBtX2xwSWRlYWxGYWNlW2ldLkdldENvbnRvdXIoKTsKKyAgICAgICAgCisgICAgICAgIGlmICggQ2hlY2tFbGVtKCBscEVsZW0sbHBJZGVhbCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAobV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXSA8IDMqTUFYX0xBWUVSUykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZFdlaWdodCA9IG1fbHBJZGVhbEZhY2VbaV0uR2V0V2VpZ2h0KCk7CisgICAgICAgICAgICAgICAgYm9vbCBiSXNGZWF0dXJlID0gbV9scElkZWFsRmFjZVtpXS5pc0ZhY2VGZWF0dXJlKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGJJc0ZlYXR1cmUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbaV1bbV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXV0uU2V0V2VpZ2h0KGRXZWlnaHQpOworICAgICAgICAgICAgICAgICAgICBtX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbaV1bbV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXV0uU2V0Q29udG91cihscEVsZW0pOworICAgICAgICAgICAgICAgICAgICBtX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbaV1bbV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXV0uU2V0RmVhdHVyZShiSXNGZWF0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgbV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXSArKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbV9kV2VpZ2h0ICs9IGRXZWlnaHQ7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGJJc0ZlYXR1cmUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfS8vaW5saW5lIGJvb2wgUkZhY2U6OmlzRmVhdHVyZSh2b2lkICogbHBFbGVtKTsKKworCitzdHJ1Y3QgRmFjZURhdGEKK3sKKyAgICBDdlJlY3QgTGVmdEV5ZVJlY3Q7CisgICAgQ3ZSZWN0IFJpZ2h0RXllUmVjdDsKKyAgICBDdlJlY3QgTW91dGhSZWN0OworICAgIGRvdWJsZSBFcnJvcjsKK307Ly9zdHJ1Y3QgRmFjZURhdGEKKworY2xhc3MgUkZhY2U6cHVibGljIEZhY2UKK3sKK3B1YmxpYzoKKyAgICBSRmFjZShGYWNlVGVtcGxhdGUgKiBscEZhY2VUZW1wbGF0ZSk7CisgICAgdmlydHVhbCB+UkZhY2UoKTsKKyAgICB2aXJ0dWFsIGJvb2wgQ2hlY2tFbGVtKHZvaWQgKiBscENhbmRpZGF0LHZvaWQgKiBscElkZWFsKTsKKyAgICB2aXJ0dWFsIHZvaWQgIENyZWF0ZUZhY2Uodm9pZCAqIGxwRGF0YSk7CisgICAgdmlydHVhbCB2b2lkIFNob3coSXBsSW1hZ2UqIEltYWdlKTsKKyAgICB2aXJ0dWFsIHZvaWQgU2hvd0lkZWFsKElwbEltYWdlKiBJbWFnZSk7CisgICAgdmlydHVhbCBkb3VibGUgR2V0V2VpZ2h0KCk7Citwcml2YXRlOgorICAgIGJvb2wgaXNQb2ludEluUmVjdChDdlBvaW50IHAsQ3ZSZWN0IHJlY3QpOworICAgIGJvb2wgbV9iSXNHZW5lcmF0ZWQ7CisgICAgdm9pZCBSZXNpemVSZWN0KEN2UmVjdCBSZWN0LEN2UmVjdCAqIGxwUmVjdCxsb25nIGxEaXIsbG9uZyBsRCk7CisgICAgdm9pZCBDYWxjdWxhdGVFcnJvcihGYWNlRGF0YSAqIGxwRmFjZURhdGEpOworfTsgCisKKworY2xhc3MgTGlzdEVsZW0KK3sKK3B1YmxpYzoKKyAgICBMaXN0RWxlbSgpOworICAgIExpc3RFbGVtKEZhY2UgKiBwRmFjZSxMaXN0RWxlbSAqIHBIZWFkKTsKKyAgICB2aXJ0dWFsIH5MaXN0RWxlbSgpOworICAgIExpc3RFbGVtICogbV9wTmV4dDsKKyAgICBMaXN0RWxlbSAqIG1fcFByZXY7CisgICAgRmFjZSAqIG1fcEZhY2U7Cit9Oy8vY2xhc3MgTGlzdEVsZW0KKworY2xhc3MgTGlzdAoreworcHVibGljOgorICAgIExpc3QoKTsKKyAgICBpbnQgQWRkRWxlbShGYWNlICogcEZhY2UpOworICAgIHZpcnR1YWwgfkxpc3QoKTsKKyAgICBGYWNlKiBHZXREYXRhKCk7CisgICAgICAgIGxvbmcgbV9GYWNlc0NvdW50OworcHJpdmF0ZToKKyAgICBMaXN0RWxlbSAqIG1fcEhlYWQ7CisgICAgTGlzdEVsZW0gKiBtX3BDdXJFbGVtOworfTsvL2NsYXNzIExpc3QKKworCitjbGFzcyBGYWNlRGV0ZWN0aW9uICAKK3sKK3B1YmxpYzoKKyAgICB2b2lkIEZpbmRGYWNlKElwbEltYWdlKiBpbWcpOworICAgIHZvaWQgQ3JlYXRlUmVzdWx0cyhDdlNlcSAqIGxwU2VxKTsKKyAgICBGYWNlRGV0ZWN0aW9uKCk7CisgICAgdmlydHVhbCB+RmFjZURldGVjdGlvbigpOworICAgIHZvaWQgU2V0Qm9vc3RpbmcoYm9vbCBiQm9vc3RpbmcpIHttX2JCb29zdGluZyA9IGJCb29zdGluZzt9CisgICAgYm9vbCBpc1Bvc3RCb29zdGluZygpIHtyZXR1cm4gbV9iQm9vc3Rpbmc7fQorcHJvdGVjdGVkOgorCisgICAgSXBsSW1hZ2UqIG1faW1nR3JheTsKKyAgICBJcGxJbWFnZSogbV9pbWdUaHJlc2g7CisgICAgaW50IG1faU51bUxheWVyczsKKyAgICBDdk1lbVN0b3JhZ2UqIG1fbXN0Z0NvbnRvdXJzOworICAgIEN2U2VxKiBtX3NlcUNvbnRvdXJzW01BWF9MQVlFUlNdOworICAgIEN2TWVtU3RvcmFnZSogbV9tc3RnUmVjdHM7CisgICAgQ3ZTZXEqIG1fc2VxUmVjdHM7CisgICAgCisgICAgYm9vbCBtX2JCb29zdGluZzsKKyAgICBMaXN0ICogbV9wRmFjZUxpc3Q7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFJlc2V0SW1hZ2UoKTsKKyAgICB2b2lkIEZpbmRDb250b3VycyhJcGxJbWFnZSogaW1nR3JheSk7CisgICAgdm9pZCBBZGRDb250b3VyczJSZWN0KEN2U2VxKiAgc2VxLCBpbnQgY29sb3IsIGludCBpTGF5ZXIpOworICAgIHZvaWQgVGhyZXNob2xkaW5nUGFyYW0oSXBsSW1hZ2UqIGltZ0dyYXksIGludCBpTnVtTGF5ZXJzLCBpbnQmIGlNaW5MZXZlbCwgaW50JiBpTWF4TGV2ZWwsIGludCYgaVN0ZXApOworICAgIHZvaWQgRmluZENhbmRpZGF0cygpOworICAgIHZvaWQgUG9zdEJvb3N0aW5nRmluZENhbmRpZGF0cyhJcGxJbWFnZSAqIEZhY2VJbWFnZSk7Cit9OworCitpbmxpbmUgdm9pZCBSZWFsbG9jSW1hZ2UoSXBsSW1hZ2UqKiBwcEltYWdlLCBDdlNpemUgc3osIGxvbmcgbENoTnVtKQoreworICAgIElwbEltYWdlKiBwSW1hZ2U7CisgICAgaWYoIHBwSW1hZ2UgPT0gTlVMTCApIAorICAgICAgICByZXR1cm47CisgICAgcEltYWdlID0gKnBwSW1hZ2U7CisgICAgaWYoIHBJbWFnZSAhPSBOVUxMICkKKyAgICB7CisgICAgICAgIGlmIChwSW1hZ2UtPndpZHRoICE9IHN6LndpZHRoIHx8IHBJbWFnZS0+aGVpZ2h0ICE9IHN6LmhlaWdodCB8fCBwSW1hZ2UtPm5DaGFubmVscyAhPSBsQ2hOdW0pCisgICAgICAgICAgICBjdlJlbGVhc2VJbWFnZSggJnBJbWFnZSApOworICAgIH0KKyAgICBpZiggcEltYWdlID09IE5VTEwgKQorICAgICAgICBwSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBzeiwgSVBMX0RFUFRIXzhVLCBsQ2hOdW0pOworICAgICpwcEltYWdlID0gcEltYWdlOworfQorCisvLy8vLy8vLy8vLy8KKy8vY2xhc3MgUkZhY2VUZW1wbGF0ZQorLy8vLy8vLy8vLy8KKworY2xhc3MgQm9vc3RpbmdGYWNlVGVtcGxhdGU6cHVibGljIEZhY2VUZW1wbGF0ZQoreworcHVibGljOgorICAgIGlubGluZSBCb29zdGluZ0ZhY2VUZW1wbGF0ZShsb25nIGxOdW1iZXIsQ3ZSZWN0IHJlY3QpOworICAgIH5Cb29zdGluZ0ZhY2VUZW1wbGF0ZSgpIHt9OworfTsvL2NsYXNzIFJGYWNlVGVtcGxhdGU6cHVibGljIEZhY2VUZW1wbGF0ZQorCisKK2lubGluZSBCb29zdGluZ0ZhY2VUZW1wbGF0ZTo6Qm9vc3RpbmdGYWNlVGVtcGxhdGUobG9uZyBsTnVtYmVyLEN2UmVjdCByZWN0KTpGYWNlVGVtcGxhdGUobE51bWJlcikKK3sKKyAgICBsb25nIEV5ZVdpZHRoID0gcmVjdC53aWR0aC81OworICAgIGxvbmcgRXllSGVpZ2h0ID0gRXllV2lkdGg7CisgICAgCisgICAgQ3ZSZWN0IExlZnRFeWVSZWN0ID0gY3ZSZWN0KHJlY3QueCArIEV5ZVdpZHRoLHJlY3QueSArIHJlY3QuaGVpZ2h0LzIgLSBFeWVIZWlnaHQsRXllV2lkdGgsRXllSGVpZ2h0KTsKKyAgICBDdlJlY3QgUmlnaHRFeWVSZWN0ID0gY3ZSZWN0KHJlY3QueCArIDMqRXllV2lkdGgscmVjdC55ICsgcmVjdC5oZWlnaHQvMiAtIEV5ZUhlaWdodCxFeWVXaWR0aCxFeWVIZWlnaHQpOworICAgIEN2UmVjdCBNb3V0aFJlY3QgPSBjdlJlY3QocmVjdC54ICsgMypFeWVXaWR0aC8yLHJlY3QueSArIDMqcmVjdC5oZWlnaHQvNCAtIEV5ZUhlaWdodC8yLDIqRXllV2lkdGgsRXllSGVpZ2h0KTsKKworICAgIEN2UmVjdCAqIGxwTW91dGhSZWN0ID0gbmV3IEN2UmVjdCgpOworICAgICpscE1vdXRoUmVjdCA9IE1vdXRoUmVjdDsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzBdLlNldENvbnRvdXIobHBNb3V0aFJlY3QpOworICAgIG1fbHBGZWF0dXJlc0xpc3RbMF0uU2V0V2VpZ2h0KDEpOworICAgIG1fbHBGZWF0dXJlc0xpc3RbMF0uU2V0RmVhdHVyZSh0cnVlKTsKKworICAgIEN2UmVjdCAqIGxwTGVmdEV5ZVJlY3QgPSBuZXcgQ3ZSZWN0KCk7CisgICAgKmxwTGVmdEV5ZVJlY3QgPSBMZWZ0RXllUmVjdDsKKyAgICBtX2xwRmVhdHVyZXNMaXN0WzFdLlNldENvbnRvdXIobHBMZWZ0RXllUmVjdCk7CisgICAgbV9scEZlYXR1cmVzTGlzdFsxXS5TZXRXZWlnaHQoMSk7CisgICAgbV9scEZlYXR1cmVzTGlzdFsxXS5TZXRGZWF0dXJlKHRydWUpOworCisgICAgQ3ZSZWN0ICogbHBSaWdodEV5ZVJlY3QgPSBuZXcgQ3ZSZWN0KCk7CisgICAgKmxwUmlnaHRFeWVSZWN0ID0gUmlnaHRFeWVSZWN0OworICAgIG1fbHBGZWF0dXJlc0xpc3RbMl0uU2V0Q29udG91cihscFJpZ2h0RXllUmVjdCk7CisgICAgbV9scEZlYXR1cmVzTGlzdFsyXS5TZXRXZWlnaHQoMSk7CisgICAgbV9scEZlYXR1cmVzTGlzdFsyXS5TZXRGZWF0dXJlKHRydWUpOworCit9Ly9pbmxpbmUgQm9vc3RpbmdGYWNlVGVtcGxhdGU6OkJvb3N0aW5nRmFjZVRlbXBsYXRlKGxvbmcgbE51bWJlcixDdlJlY3QgcmVjdCk6RmFjZVRlbXBsYXRlKGxOdW1iZXIpCisKKyNlbmRpZiAvLyAhZGVmaW5lZChBRlhfRkFDRURFVEVDVElPTl9IX181NTg2NTAzM19EOEU1XzRERDVfODkyNV8zNEMyMjg1QkIxQkVfX0lOQ0xVREVEXykKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9fY3Z2ZWN0cmFjay5oIGIvY3ZhdXgvc3JjL19jdnZlY3RyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3YTNmNwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9fY3Z2ZWN0cmFjay5oCkBAIC0wLDAgKzEsMTYzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworCisjaWZuZGVmIF9fQ1ZWRUNUUkFDS19IX18KKyNkZWZpbmUgX19DVlZFQ1RSQUNLX0hfXworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjdW5kZWYgbWF4CisjdW5kZWYgbWluCisKKyNkZWZpbmUgbWF4KGEsYikgKChhKTwoYikgPyAoYikgOiAoYSkpCisjZGVmaW5lIG1pbihhLGIpICgoYSk+KGIpID8gKGEpIDogKGIpKQorCitpbmxpbmUgaW50IHBvdzIoaW50IHYpCit7CisgICAgICAgIHJldHVybiAodip2KTsKK30KKworaW5saW5lIGludCBvcGVyYXRvciA9PSAoY29uc3QgQ3ZSZWN0JiByMSwgY29uc3QgQ3ZSZWN0JiByMikKK3sKKyAgICAgICAgcmV0dXJuIChyMS54ID09IHIyLngpICYmIChyMS55ID09IHIyLnkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAocjEud2lkdGggPT0gcjIud2lkdGgpICYmIChyMS5oZWlnaHQgPT0gcjIuaGVpZ2h0KTsKK30KKworaW5saW5lIGludCBvcGVyYXRvciAhPSAoY29uc3QgQ3ZSZWN0JiByMSwgY29uc3QgQ3ZSZWN0JiByMikKK3sKKyAgICAgICAgcmV0dXJuICEocjEgPT0gcjIpOworfQorCitpbmxpbmUgCitpbnQgQ21wUG9pbnRzKGNvbnN0IEN2UG9pbnQmIHAxLCBjb25zdCBDdlBvaW50JiBwMiwgaW50IGVycikKK3sKKyAgICAgICAgLyogU2ltYWtvdjogbW9kaWZ5IF9fbWF4IHRvIG1heCAqLworICAgICAgICByZXR1cm4gKG1heChhYnMocDEueCAtIHAyLngpLCBhYnMocDEueSAtIHAyLnkpKSA8IGVycik7Cit9CisKK2lubGluZSAKK2ludCBQb2ludEluUmVjdChjb25zdCBDdlBvaW50JiBwLCBjb25zdCBDdlJlY3QmIHIpCit7CisgICAgICAgIHJldHVybiAoKHAueCA+IHIueCkgJiYgKHAueCA8IChyLnggKyByLndpZHRoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwLnkgPiByLnkpICYmIChwLnkgPCAoci55ICsgci5oZWlnaHQpKSk7Cit9CisKK2lubGluZSAKK2ludCBSZWN0SW5SZWN0KGNvbnN0IEN2UmVjdCYgcjEsIGNvbnN0IEN2UmVjdCYgcjIpCit7CisgICAgICAgIEN2UG9pbnQgcGx0ID0ge3IxLngsIHIxLnl9OworICAgICAgICBDdlBvaW50IHByYiA9IHtyMS54ICsgcjEud2lkdGgsIHIxLnkgKyByMS5oZWlnaHR9OworICAgICAgICByZXR1cm4gKFBvaW50SW5SZWN0KHBsdCwgcjIpICYmIFBvaW50SW5SZWN0KHByYiwgcjIpKTsKK30KKworaW5saW5lIAorQ3ZSZWN0IEluY3JlYXNlKGNvbnN0IEN2UmVjdCYgciwgaW50IGRlY3IpCit7CisgICAgICAgIEN2UmVjdCByZWN0OworICAgICAgICByZWN0LnggPSByLnggKiBkZWNyOworICAgICAgICByZWN0LnkgPSByLnkgKiBkZWNyOworICAgICAgICByZWN0LndpZHRoID0gci53aWR0aCAqIGRlY3I7CisgICAgICAgIHJlY3QuaGVpZ2h0ID0gci5oZWlnaHQgKiBkZWNyOworICAgICAgICByZXR1cm4gcmVjdDsKK30KKworaW5saW5lIAorQ3ZQb2ludCBJbmNyZWFzZShjb25zdCBDdlBvaW50JiBwLCBpbnQgZGVjcikKK3sKKyAgICAgICAgQ3ZQb2ludCBwb2ludDsKKyAgICAgICAgcG9pbnQueCA9IHAueCAqIGRlY3I7CisgICAgICAgIHBvaW50LnkgPSBwLnkgKiBkZWNyOworICAgICAgICByZXR1cm4gcG9pbnQ7Cit9CisKK2lubGluZSAKK3ZvaWQgTW92ZShDdlJlY3QmIHIsIGludCBkeCwgaW50IGR5KQoreworICAgICAgICByLnggKz0gZHg7CisgICAgICAgIHIueSArPSBkeTsKK30KKworaW5saW5lIAordm9pZCBNb3ZlKEN2UG9pbnQmIHAsIGludCBkeCwgaW50IGR5KQoreworICAgICAgICBwLnggKz0gZHg7CisgICAgICAgIHAueSArPSBkeTsKK30KKworaW5saW5lIAordm9pZCBFeHRlbmQoQ3ZSZWN0JiByLCBpbnQgZCkKK3sKKyAgICAgICAgci54IC09IGQ7CisgICAgICAgIHIueSAtPSBkOworICAgICAgICByLndpZHRoICs9IDIqZDsKKyAgICAgICAgci5oZWlnaHQgKz0gMipkOworfQorCitpbmxpbmUgCitDdlBvaW50IENlbnRlcihjb25zdCBDdlJlY3QmIHIpCit7CisgICAgICAgIEN2UG9pbnQgcDsKKyAgICAgICAgcC54ID0gci54ICsgci53aWR0aCAvIDI7CisgICAgICAgIHAueSA9IHIueSArIHIuaGVpZ2h0IC8gMjsKKyAgICAgICAgcmV0dXJuIHA7Cit9CisKK2lubGluZSB2b2lkIFJlYWxsb2NJbWFnZShJcGxJbWFnZSoqIHBwSW1hZ2UsIEN2U2l6ZSBzeiwgbG9uZyBsQ2hOdW0pCit7CisgICAgSXBsSW1hZ2UqIHBJbWFnZTsKKyAgICBpZiggcHBJbWFnZSA9PSBOVUxMICkgCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgIHBJbWFnZSA9ICpwcEltYWdlOworICAgIGlmKCBwSW1hZ2UgIT0gTlVMTCApCisgICAgeworICAgICAgICBpZiAocEltYWdlLT53aWR0aCAhPSBzei53aWR0aCB8fCBwSW1hZ2UtPmhlaWdodCAhPSBzei5oZWlnaHQgfHwgcEltYWdlLT5uQ2hhbm5lbHMgIT0gbENoTnVtKQorICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZwSW1hZ2UgKTsKKyAgICB9CisgICAgaWYoIHBJbWFnZSA9PSBOVUxMICkKKyAgICAgICAgcEltYWdlID0gY3ZDcmVhdGVJbWFnZSggc3osIElQTF9ERVBUSF84VSwgbENoTnVtKTsKKyAgICAqcHBJbWFnZSA9IHBJbWFnZTsKK30KKworI2VuZGlmIC8vX19WRUNUUkFDS19IX18KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9fY3Z2bS5oIGIvY3ZhdXgvc3JjL19jdnZtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQwZGE1YwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9fY3Z2bS5oCkBAIC0wLDAgKzEsMjk4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfQ1ZfVk1fSF8KKyNkZWZpbmUgX0NWX1ZNX0hfCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW50ZXJuYWwgVmlld01vcnBoaW5nIEZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZNYXRyaXg0Cit7CisgICAgZmxvYXQgbVs0XVs0XTsKK30KK0N2TWF0cml4NDsKKworCisvKiBTY2FubGluZSBzZWN0aW9uLiBGaW5kIGNvb3JkaW5hdGVzIGJ5IGZ1bmRhbWVudGFsIG1hdHJpeCAqLworCisvKiBFcHNpbG9uIGFuZCByZWFsIHplcm8gKi8KKyNkZWZpbmUgRVBTSUxPTiAgICAgICAgICAgICAxLmUtNAorLy8jZGVmaW5lIFJFQUxfWkVSTyh4KSAgICAgICAgKCAoeCkgPCBFUFNJTE9OICYmICh4KSA+IC1FUFNJTE9OKQorI2RlZmluZSBSRUFMX1pFUk8oeCkgKCAoeCkgPCAxZS04ICYmICh4KSA+IC0xZS04KQorCisjZGVmaW5lIFNJR04oeCkJCQkJKCAoeCk8MCA/IC0xOigoeCk+MD8xOjAgKSApCisKK0N2U3RhdHVzICBpY3ZNYWtlU2NhbmxpbmVzTGVuZ3RocyggaW50KiAgICAgICAgc2NhbmxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgbnVtbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICBsZW5zKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFByZVdhcnAgc2VjdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK0NWX0lOTElORSBpbnQgaWN2R2V0Q29sb3IodWNoYXIqIHZhbHVlUkdCKTsKKworQ3ZTdGF0dXMgIGljdkZpbmRSdW5zSW5PbmVJbWFnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBudW1MaW5lcywgICAgICAgLyogbnVtYmVyIG9mIHNjYW5saW5lcwkJKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICBwcmV3YXJwLCAgICAgICAgLyogcHJld2FycCBpbWFnZSAJCQkqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgIGxpbmVfbGVucywgICAgICAvKiBsaW5lIGxlbmd0aHMgaW4gcGl4ZWxzCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgcnVucywgICAgICAgICAgIC8qIHJlc3VsdCBydW5zCQkJCSovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgbnVtX3J1bnMpOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IE1vcnBoaW5nIHNlY3Rpb24gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworQ3ZTdGF0dXMgIGljdk1vcnBoRXBpbGluZXM4dUMzKCAgICB1Y2hhciogIGZpcnN0X3BpeCwgLyogcmFzdGVyIGVwaWxpbmUgZnJvbSB0aGUgZmlyc3QgaW1hZ2UgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgc2Vjb25kX3BpeCwgLyogcmFzdGVyIGVwaWxpbmUgZnJvbSB0aGUgc2Vjb25kIGltYWdlICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgZHN0X3BpeCwgICAgLyogcmFzdGVyIGVwaWxpbmUgZnJvbSB0aGUgZGVzdGluYXRpb24gaW1hZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGl0J3MgYW4gb3V0cHV0IHBhcmFtZXRlcikgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICAgYWxwaGEsICAgICAgLyogcmVsYXRpdmUgcG9zaXRpb24gb2YgY2FtZXJhICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgZmlyc3QsICAgICAgLyogZmlyc3Qgc2VxdWVuY2Ugb2YgcnVucyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgZmlyc3RfcnVucywgLyogaXQncyBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgc2Vjb25kLCAgICAgLyogc2Vjb25kIHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgc2Vjb25kX3J1bnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgIGZpcnN0X2NvcnIsIC8qIGNvcnJlc3BvbmQgaW5mb3JtYXRpb24gZm9yIHRoZSAxc3Qgc2VxICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgIHNlY29uZF9jb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICBkc3RfbGVuKTsgICAvKiBjb3JyZXNwb25kIGluZm9ybWF0aW9uIGZvciB0aGUgMm5kIHNlcSAgICAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09IER5bmFtaWMgY29ycmVzcG9uZCBzZWN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworQ3ZTdGF0dXMgIGljdkR5bmFtaWNDb3JyZXNwb25kKCAgIGludCogIGZpcnN0LCAgICAgICAgIC8qIGZpcnN0IHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzMHx3MHxzMXx3MXwuLi58cyhuLTEpfHcobi0xKXxzbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgZmlyc3RfcnVucywgICAgLyogbnVtYmVyIG9mIHJ1bnMgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogIHNlY29uZCwgICAgICAgIC8qIHNlY29uZCBzZXF1ZW5jZSBvZiBydW5zICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICBzZWNvbmRfcnVucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogIGZpcnN0X2NvcnIsICAgIC8qIHMwJ3xlMCd8czEnfGUxJ3wuLi4gICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICBzZWNvbmRfY29yciApOworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBvc3RXYXJwIEZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworQ3ZTdGF0dXMgIGljdkZldGNoTGluZTh1QzNSKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogICBzcmMsICBpbnQgICBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICAgZHN0LCAgaW50KiAgZHN0X251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplICBzcmNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBlbmQgKTsKKworQ3ZTdGF0dXMgIGljdkRyYXdMaW5lOHVDM1IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiAgIHNyYywgIGludCAgc3JjX251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqICAgZHN0LCAgaW50ICBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplICBkc3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBzdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBlbmQgKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBGdW5kYW1lbnRhbCBNYXRyaXggRnVuY3Rpb25zID09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzICBpY3ZQb2ludDcoICBpbnQqICAgICAgICBwb2ludHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogICAgIEYsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICBhbW91bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0N2U3RhdHVzICBpY3ZDdWJpYyggICAgICBkb3VibGUgYTIsIGRvdWJsZSBhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYTAsIGRvdWJsZSogc3F1YXJlcyApOworCitkb3VibGUgaWN2RGV0KCBkb3VibGUqIE0gKTsKK2RvdWJsZSAgIGljdk1pbm9yKCBkb3VibGUqIE0sIGludCB4LCBpbnQgeSApOworCitpbnQKK2ljdkdhdXNzTXhOKCBkb3VibGUgKkEsIGRvdWJsZSAqQiwgaW50IE0sIGludCBOLCBkb3VibGUgKipzb2x1dGlvbnMgKTsKKworQ3ZTdGF0dXMKK2ljdkdldENvZWYoIGRvdWJsZSAqZjEsIGRvdWJsZSAqZjIsIGRvdWJsZSAqYTIsIGRvdWJsZSAqYTEsIGRvdWJsZSAqYTAgKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU2NhbmxpbmVzIEZ1bmN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK0N2U3RhdHVzICBpY3ZHZXRDb2VmZmljaWVudCggIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplICAgICAgICAgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHNjYW5saW5lc18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBudW1saW5lcyk7CisKK0N2U3RhdHVzICBpY3ZHZXRDb2VmZmljaWVudERlZmF1bHQoICAgQ3ZNYXRyaXgzKiAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHNjYW5saW5lc18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBzY2FubGluZXNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgbnVtbGluZXMpOworCitDdlN0YXR1cyAgaWN2R2V0Q29lZmZpY2llbnRTdGVyZW8oICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgICAgICAgICBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICAgICBsX2VwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqICAgICAgICAgIHJfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHNjYW5saW5lc18yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBudW1saW5lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworQ3ZTdGF0dXMgIGljdkdldENvZWZmaWNpZW50T3J0byggIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgbnVtbGluZXMpOworCisKK0N2U3RhdHVzICBpY3ZHZXRDcm9zc0VwaWxpbmVGcmFtZSggICAgQ3ZTaXplICAgICBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgIGVwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgeTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgeDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgeTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKK0N2U3RhdHVzICBpY3ZCdWlsZFNjYW5saW5lTGVmdFN0ZXJlbyggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplICAgICAgICAgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHJpeDMqICAgICBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqICAgICAgICAgIGxfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgbF9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgbF9yYWRpdXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHNjYW5saW5lc18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBzY2FubGluZXNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgbnVtbGluZXMpOworCitDdlN0YXR1cyAgaWN2QnVpbGRTY2FubGluZVJpZ2h0U3RlcmVvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyaXgzKiAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICAgICByX2VwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqICAgICAgICAgIHJfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgIHJfcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBzY2FubGluZXNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIG51bWxpbmVzKTsKKworQ3ZTdGF0dXMgIGljdkdldFN0YXJ0RW5kMSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgbF9zdGFydF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgcl9zdGFydF9lbmQgKTsKKworQ3ZTdGF0dXMgIGljdkdldFN0YXJ0RW5kMigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgbF9zdGFydF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgcl9zdGFydF9lbmQgKTsKKworQ3ZTdGF0dXMgIGljdkdldFN0YXJ0RW5kMygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgbF9zdGFydF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgcl9zdGFydF9lbmQgKTsKKworQ3ZTdGF0dXMgIGljdkdldFN0YXJ0RW5kNCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgbF9zdGFydF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgcl9zdGFydF9lbmQgKTsKKworQ3ZTdGF0dXMgIGljdkJ1aWxkU2NhbmxpbmVMZWZ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyaXgzKiAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplICAgICAgICAgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBzY2FubGluZXNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBzY2FubGluZXNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICAgICBsX3N0YXJ0X2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgICAgICAgICBudW1saW5lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworQ3ZTdGF0dXMgIGljdkJ1aWxkU2NhbmxpbmVSaWdodCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgICAgICAgcl9zdGFydF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgbnVtbGluZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBMTWVkUyBGdW5jdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cyAgaWN2TE1lZFM3KAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHBvaW50czEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyogICAgIG1hdHJpeCk7CisKKworQ3ZTdGF0dXMgIGljdkxNZWRTKCAgIGludCogICAgcG9pbnRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogICAgcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgbnVtUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyaXgzKiBmdW5kYW1lbnRhbE1hdHJpeCApOworCisKKy8qCitDdlN0YXR1cyAgaWN2RmluZEZ1bmRhbWVudGFsTWF0cml4KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICAgIHBvaW50czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqICAgICAgICAgICAgcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBudW1wb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyaXgzKiAgICAgIG1hdHJpeCk7CisqLwordm9pZCAgIGljdkNob29zZTcoCWludCogICAgbWwsICAgICBpbnQqIG1yLAorCQkJCQkgICAgaW50ICAgICBudW0sCWludCogbWw3LAorCQkJCQkgICAgaW50KiAgIG1yNyApOworCitkb3VibGUgaWN2TWVkaWFuKAlpbnQqIG1sLCBpbnQqIG1yLAorCQkJCSAgICBpbnQgbnVtLCBkb3VibGUqIEYgKTsKKworaW50IGljdkJvbHRpbmdQb2ludHMoIGludCogbWwsCSAgICBpbnQqIG1yLAorCQkJCQkgICAgaW50IG51bSwgICAgICAgIGRvdWJsZSogRiwKKwkJCQkJICAgIGRvdWJsZSBNaiwgICAgICBpbnQqICpuZXdfbWwsCisJCQkJCSAgICBpbnQqICpuZXdfbXIsICAgaW50KiBuZXdfbnVtKTsKKworQ3ZTdGF0dXMgIGljdlBvaW50czgoIGludCogbWwsIGludCogbXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtLCBkb3VibGUqIEYgKTsKKworQ3ZTdGF0dXMgIGljdlJhbmsyQ29uc3RyYWludCggZG91YmxlKiBGICk7CisKK0N2U3RhdHVzICBpY3ZTb3J0KCBkb3VibGUqIGFycmF5LCBpbnQgbGVuZ3RoICk7CisKK2RvdWJsZSBpY3ZBbmFseXRpY1BvaW50czgoCWRvdWJsZSogQSwKKwkJCQkJCQkJCQkJaW50IG51bSwgZG91YmxlKiBGICk7CisKK2ludCBpY3ZTaW5ndWxhclZhbHVlRGVjb21wb3NpdGlvbigJaW50CQlNLAorCQkJCQkJCQkJCWludAkJTiwKKwkJCQkJCQkJCQlkb3VibGUqCUEsCisJCQkJCQkJCQkJZG91YmxlKglXLAorCQkJCQkJCQkJCWludAkJZ2V0X1UsCisJCQkJCQkJCQkJZG91YmxlKglVLAorCQkJCQkJCQkJCWludAkJZ2V0X1YsCisJCQkJCQkJCQkJZG91YmxlKglWCisJCQkJCQkJCQkJCQkgKTsKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNlbmRpZi8qX0NWX1ZNX0hfKi8KKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2NhbXNoaWZ0LmNwcCBiL2N2YXV4L3NyYy9jYW1zaGlmdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjZmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jYW1zaGlmdC5jcHAKQEAgLTAsMCArMSwyODUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdmF1eC5oIgorCitDdkNhbVNoaWZ0VHJhY2tlcjo6Q3ZDYW1TaGlmdFRyYWNrZXIoKQoreworICAgIGludCBpOworICAgIAorICAgIG1lbXNldCggJm1fYm94LCAwLCBzaXplb2YobV9ib3gpKTsKKyAgICBtZW1zZXQoICZtX2NvbXAsIDAsIHNpemVvZihtX2NvbXApKTsKKyAgICBtZW1zZXQoIG1fY29sb3JfcGxhbmVzLCAwLCBzaXplb2YobV9jb2xvcl9wbGFuZXMpKTsKKyAgICBtX3RocmVzaG9sZCA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1ZfTUFYX0RJTTsgaSsrICkKKyAgICB7CisgICAgICAgIG1fbWluX2NoX3ZhbFtpXSA9IDA7CisgICAgICAgIG1fbWF4X2NoX3ZhbFtpXSA9IDI1NTsKKyAgICAgICAgbV9oaXN0X3Jhbmdlc1tpXSA9IG1faGlzdF9yYW5nZXNfZGF0YVtpXTsKKyAgICAgICAgbV9oaXN0X3Jhbmdlc1tpXVswXSA9IDAuZjsKKyAgICAgICAgbV9oaXN0X3Jhbmdlc1tpXVsxXSA9IDI1Ni5mOworICAgIH0KKworICAgIG1faGlzdCA9IDA7CisgICAgbV9iYWNrX3Byb2plY3QgPSAwOworICAgIG1fdGVtcCA9IDA7CisgICAgbV9tYXNrID0gMDsKK30KKworCitDdkNhbVNoaWZ0VHJhY2tlcjo6fkN2Q2FtU2hpZnRUcmFja2VyKCkKK3sKKyAgICBpbnQgaTsKKyAgICAKKyAgICBjdlJlbGVhc2VIaXN0KCAmbV9oaXN0ICk7CisgICAgZm9yKCBpID0gMDsgaSA8IENWX01BWF9ESU07IGkrKyApCisgICAgICAgIGN2UmVsZWFzZUltYWdlKCAmbV9jb2xvcl9wbGFuZXNbaV0gKTsKKyAgICBjdlJlbGVhc2VJbWFnZSggJm1fYmFja19wcm9qZWN0ICk7CisgICAgY3ZSZWxlYXNlSW1hZ2UoICZtX3RlbXAgKTsKKyAgICBjdlJlbGVhc2VJbWFnZSggJm1fbWFzayApOworfQorCisKK3ZvaWQKK0N2Q2FtU2hpZnRUcmFja2VyOjpjb2xvcl90cmFuc2Zvcm0oIGNvbnN0IElwbEltYWdlKiBpbWFnZSApCit7CisgICAgQ3ZTaXplIHNpemUgPSBjdkdldFNpemUoaW1hZ2UpOworICAgIHVjaGFyKiBjb2xvcl9kYXRhID0gMCwgKm1hc2sgPSAwOworICAgIHVjaGFyKiBwbGFuZXNbQ1ZfTUFYX0RJTV07CisgICAgaW50IHgsIGNvbG9yX3N0ZXAgPSAwLCBwbGFuZV9zdGVwID0gMCwgbWFza19zdGVwOworICAgIGludCBkaW1zW0NWX01BWF9ESU1dOworICAgIGludCBpLCBuID0gZ2V0X2hpc3RfZGltcyhkaW1zKTsKKworICAgIGFzc2VydCggaW1hZ2UtPm5DaGFubmVscyA9PSAzICYmIG1faGlzdCAhPSAwICk7CisgICAgCisgICAgaWYoICFtX3RlbXAgfHwgIW1fbWFzayB8fCAhbV9jb2xvcl9wbGFuZXNbMF0gfHwgIW1fY29sb3JfcGxhbmVzW24tMV0gfHwgIW1fYmFja19wcm9qZWN0IHx8CisgICAgICAgIG1fdGVtcC0+d2lkdGggIT0gc2l6ZS53aWR0aCB8fCBtX3RlbXAtPmhlaWdodCAhPSBzaXplLmhlaWdodCB8fAorICAgICAgICBtX3RlbXAtPm5DaGFubmVscyAhPSAzICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZUltYWdlKCAmbV90ZW1wICk7CisgICAgICAgIG1fdGVtcCA9IGN2Q3JlYXRlSW1hZ2UoIHNpemUsIElQTF9ERVBUSF84VSwgMyApOworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJm1fbWFzayApOworICAgICAgICBtX21hc2sgPSBjdkNyZWF0ZUltYWdlKCBzaXplLCBJUExfREVQVEhfOFUsIDEgKTsKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZtX2JhY2tfcHJvamVjdCApOworICAgICAgICBtX2JhY2tfcHJvamVjdCA9IGN2Q3JlYXRlSW1hZ2UoIHNpemUsIElQTF9ERVBUSF84VSwgMSApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgQ1ZfTUFYX0RJTTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZtX2NvbG9yX3BsYW5lc1tpXSApOworICAgICAgICAgICAgaWYoIGkgPCBuICkKKyAgICAgICAgICAgICAgICBtX2NvbG9yX3BsYW5lc1tpXSA9IGN2Q3JlYXRlSW1hZ2UoIHNpemUsIElQTF9ERVBUSF84VSwgMSApOworICAgICAgICB9CisgICAgfQorCisgICAgY3ZDdnRDb2xvciggaW1hZ2UsIG1fdGVtcCwgQ1ZfQkdSMkhTViApOworICAgIGN2R2V0UmF3RGF0YSggbV90ZW1wLCAmY29sb3JfZGF0YSwgJmNvbG9yX3N0ZXAsICZzaXplICk7CisgICAgY3ZHZXRSYXdEYXRhKCBtX21hc2ssICZtYXNrLCAmbWFza19zdGVwLCAmc2l6ZSApOworICAgIAorICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICBjdkdldFJhd0RhdGEoIG1fY29sb3JfcGxhbmVzW2ldLCAmcGxhbmVzW2ldLCAmcGxhbmVfc3RlcCwgJnNpemUgKTsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBjb2xvcl9kYXRhICs9IGNvbG9yX3N0ZXAsIG1hc2sgKz0gbWFza19zdGVwICkKKyAgICB7CisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsMCA9IGNvbG9yX2RhdGFbeCozXTsKKyAgICAgICAgICAgIGludCB2YWwxID0gY29sb3JfZGF0YVt4KjMrMV07CisgICAgICAgICAgICBpbnQgdmFsMiA9IGNvbG9yX2RhdGFbeCozKzJdOworICAgICAgICAgICAgaWYoIG1fbWluX2NoX3ZhbFswXSA8PSB2YWwwICYmIHZhbDAgPD0gbV9tYXhfY2hfdmFsWzBdICYmCisgICAgICAgICAgICAgICAgbV9taW5fY2hfdmFsWzFdIDw9IHZhbDEgJiYgdmFsMSA8PSBtX21heF9jaF92YWxbMV0gJiYKKyAgICAgICAgICAgICAgICBtX21pbl9jaF92YWxbMl0gPD0gdmFsMiAmJiB2YWwyIDw9IG1fbWF4X2NoX3ZhbFsyXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaHVlIGlzIHdyaXR0ZW4gdG8gdGhlIDAtdGggcGxhbmUsIHNhdHVyYXRpb24gLSB0byB0aGUgMS1zdCBvbmUsCisgICAgICAgICAgICAgICAgLy8gc28gMWQgaGlzdG9ncmFtIHdpbGwgYXV0b21hZ2ljYWxseSBjb3JyZXNwb25kIHRvIGh1ZS1iYXNlZCB0cmFja2luZywKKyAgICAgICAgICAgICAgICAvLyAyZCBoaXN0b2dyYW0gLSB0byBzYXR1cmF0aW9uLWJhc2VkIHRyYWNraW5nLgorICAgICAgICAgICAgICAgIHBsYW5lc1swXVt4XSA9ICh1Y2hhcil2YWwwOworICAgICAgICAgICAgICAgIGlmKCBuID4gMSApCisgICAgICAgICAgICAgICAgICAgIHBsYW5lc1sxXVt4XSA9ICh1Y2hhcil2YWwxOworICAgICAgICAgICAgICAgIGlmKCBuID4gMiApCisgICAgICAgICAgICAgICAgICAgIHBsYW5lc1syXVt4XSA9ICh1Y2hhcil2YWwyOworCisgICAgICAgICAgICAgICAgbWFza1t4XSA9ICh1Y2hhcikyNTU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGxhbmVzWzBdW3hdID0gMDsKKyAgICAgICAgICAgICAgICBpZiggbiA+IDEgKQorICAgICAgICAgICAgICAgICAgICBwbGFuZXNbMV1beF0gPSAwOworICAgICAgICAgICAgICAgIGlmKCBuID4gMiApCisgICAgICAgICAgICAgICAgICAgIHBsYW5lc1syXVt4XSA9IDA7CisgICAgICAgICAgICAgICAgbWFza1t4XSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICBwbGFuZXNbaV0gKz0gcGxhbmVfc3RlcDsKKyAgICB9Cit9CisKKworYm9vbAorQ3ZDYW1TaGlmdFRyYWNrZXI6OnVwZGF0ZV9oaXN0b2dyYW0oIGNvbnN0IElwbEltYWdlKiBjdXJfZnJhbWUgKQoreworICAgIGZsb2F0IG1heF92YWwgPSAwOworICAgIGludCBpLCBkaW1zOworCisgICAgaWYoIG1fY29tcC5yZWN0LndpZHRoID09IDAgfHwgbV9jb21wLnJlY3QuaGVpZ2h0ID09IDAgfHwKKyAgICAgICAgbV9oaXN0ID09IDAgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29sb3JfdHJhbnNmb3JtKGN1cl9mcmFtZSk7CisKKyAgICBkaW1zID0gY3ZHZXREaW1zKCBtX2hpc3QtPmJpbnMgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgY3ZTZXRJbWFnZVJPSSggbV9jb2xvcl9wbGFuZXNbaV0sIG1fY29tcC5yZWN0ICk7CisgICAgY3ZTZXRJbWFnZVJPSSggbV9tYXNrLCBtX2NvbXAucmVjdCApOworCisgICAgY3ZTZXRIaXN0QmluUmFuZ2VzKCBtX2hpc3QsIG1faGlzdF9yYW5nZXMsIDEgKTsKKyAgICBjdkNhbGNIaXN0KCBtX2NvbG9yX3BsYW5lcywgbV9oaXN0LCAwLCBtX21hc2sgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICBjdlNldEltYWdlUk9JKCBtX2NvbG9yX3BsYW5lc1tpXSwgbV9jb21wLnJlY3QgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICBjdlJlc2V0SW1hZ2VST0koIG1fY29sb3JfcGxhbmVzW2ldICk7CisgICAgY3ZSZXNldEltYWdlUk9JKCBtX21hc2sgKTsKKworICAgIGN2R2V0TWluTWF4SGlzdFZhbHVlKCBtX2hpc3QsIDAsICZtYXhfdmFsICk7CisgICAgY3ZTY2FsZSggbV9oaXN0LT5iaW5zLCBtX2hpc3QtPmJpbnMsIG1heF92YWwgPyAyNTUuIC8gbWF4X3ZhbCA6IDAuICk7CisKKyAgICByZXR1cm4gbWF4X3ZhbCAhPSAwOworfQorCisKK3ZvaWQKK0N2Q2FtU2hpZnRUcmFja2VyOjpyZXNldF9oaXN0b2dyYW0oKQoreworICAgIGlmKCBtX2hpc3QgKQorICAgICAgICBjdkNsZWFySGlzdCggbV9oaXN0ICk7Cit9CisKKworYm9vbAorQ3ZDYW1TaGlmdFRyYWNrZXI6OnRyYWNrX29iamVjdCggY29uc3QgSXBsSW1hZ2UqIGN1cl9mcmFtZSApCit7CisgICAgQ3ZSZWN0IHJlY3Q7CisgICAgQ3ZTaXplIGJwX3NpemU7CisgICAgCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHZvaWQqKiBhcnI7CisgICAgICAgIElwbEltYWdlKiogaW1nOworICAgIH0gdTsKKyAgICAKKyAgICBpZiggbV9jb21wLnJlY3Qud2lkdGggPT0gMCB8fCBtX2NvbXAucmVjdC5oZWlnaHQgPT0gMCB8fAorICAgICAgICBtX2hpc3QgPT0gMCApCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGNvbG9yX3RyYW5zZm9ybSggY3VyX2ZyYW1lICk7CisgICAgdS5pbWcgPSBtX2NvbG9yX3BsYW5lczsKKyAgICBjdkNhbGNBcnJCYWNrUHJvamVjdCggdS5hcnIsIG1fYmFja19wcm9qZWN0LCBtX2hpc3QgKTsKKyAgICBjdkFuZCggbV9iYWNrX3Byb2plY3QsIG1fbWFzaywgbV9iYWNrX3Byb2plY3QgKTsKKworICAgIHJlY3QgPSBtX2NvbXAucmVjdDsKKyAgICBicF9zaXplID0gY3ZHZXRTaXplKCBtX2JhY2tfcHJvamVjdCApOworICAgIGlmKCByZWN0LnggPCAwICkKKyAgICAgICAgcmVjdC54ID0gMDsKKyAgICBpZiggcmVjdC54ICsgcmVjdC53aWR0aCA+IGJwX3NpemUud2lkdGggKQorICAgICAgICByZWN0LndpZHRoID0gYnBfc2l6ZS53aWR0aCAtIHJlY3QueDsKKyAgICBpZiggcmVjdC55IDwgMCApCisgICAgICAgIHJlY3QueSA9IDA7CisgICAgaWYoIHJlY3QueSArIHJlY3QuaGVpZ2h0ID4gYnBfc2l6ZS5oZWlnaHQgKQorICAgICAgICByZWN0LmhlaWdodCA9IGJwX3NpemUuaGVpZ2h0IC0gcmVjdC55OworCisgICAgY3ZDYW1TaGlmdCggbV9iYWNrX3Byb2plY3QsIHJlY3QsCisgICAgICAgICAgICAgICAgY3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0VQUyB8IENWX1RFUk1DUklUX0lURVIsIDEwLCAxICksCisgICAgICAgICAgICAgICAgJm1fY29tcCwgJm1fYm94ICk7CisKKyAgICBpZiggbV9jb21wLnJlY3Qud2lkdGggPT0gMCB8fCBtX2NvbXAucmVjdC5oZWlnaHQgPT0gMCApCisgICAgICAgIG1fY29tcC5yZWN0ID0gcmVjdDsgLy8gZG8gbm90IGFsbG93IHRyYWNrZXIgdG8gbG9vc2UgdGhlIG9iamVjdAorCisgICAgcmV0dXJuIG1fY29tcC5yZWN0LndpZHRoICE9IDAgJiYgbV9jb21wLnJlY3QuaGVpZ2h0ICE9IDA7Cit9CisKKworYm9vbAorQ3ZDYW1TaGlmdFRyYWNrZXI6OnNldF9oaXN0X2RpbXMoIGludCBjX2RpbXMsIGludCAqZGltcyApCit7CisgICAgaWYoICh1bnNpZ25lZCkoY19kaW1zLTEpID49ICh1bnNpZ25lZClDVl9NQVhfRElNIHx8IGRpbXMgPT0gMCApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmKCBtX2hpc3QgKQorICAgIHsKKyAgICAgICAgaW50IGRpbXMyW0NWX01BWF9ESU1dOworICAgICAgICBpbnQgY19kaW1zMiA9IGN2R2V0RGltcyggbV9oaXN0LT5iaW5zLCBkaW1zMiApOworCisgICAgICAgIGlmKCBjX2RpbXMyID09IGNfZGltcyAmJiBtZW1jbXAoIGRpbXMsIGRpbXMyLCBjX2RpbXMqc2l6ZW9mKGRpbXNbMF0pKSA9PSAwICkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIGN2UmVsZWFzZUhpc3QoICZtX2hpc3QgKTsKKyAgICB9CisKKyAgICBtX2hpc3QgPSBjdkNyZWF0ZUhpc3QoIGNfZGltcywgZGltcywgQ1ZfSElTVF9BUlJBWSwgMCwgMCApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbAorQ3ZDYW1TaGlmdFRyYWNrZXI6OnNldF9oaXN0X2Jpbl9yYW5nZSggaW50IGNoYW5uZWwsIGludCBtaW5fdmFsLCBpbnQgbWF4X3ZhbCApCit7CisgICAgaWYoICh1bnNpZ25lZCljaGFubmVsID49ICh1bnNpZ25lZClDVl9NQVhfRElNIHx8CisgICAgICAgIG1pbl92YWwgPj0gbWF4X3ZhbCB8fCBtaW5fdmFsIDwgMCB8fCBtYXhfdmFsID4gMjU2ICkKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1faGlzdF9yYW5nZXNbY2hhbm5lbF1bMF0gPSAoZmxvYXQpbWluX3ZhbDsKKyAgICBtX2hpc3RfcmFuZ2VzW2NoYW5uZWxdWzFdID0gKGZsb2F0KW1heF92YWw7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3YzZHRyYWNrZXIuY3BwIGIvY3ZhdXgvc3JjL2N2M2R0cmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThhMGUzCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2M2R0cmFja2VyLmNwcApAQCAtMCwwICsxLDU4OCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDIsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0Nzg2KSAvLyBEaXNhYmxlIE1TVkMgd2FybmluZ3MgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTo0MTAwKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDUxMikKKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoZGVmYXVsdDo0MTAwKQorI3ByYWdtYSB3YXJuaW5nKGRlZmF1bHQ6NDUxMikKKyNlbmRpZgorCisjZGVmaW5lIEFSUkFZX1NJWkVPRihhKSAoc2l6ZW9mKGEpL3NpemVvZigoYSlbMF0pKQorCitzdGF0aWMgdm9pZCBGaWxsT2JqZWN0UG9pbnRzKEN2UG9pbnQzRDMyZiAqb2JqX3BvaW50cywgQ3ZTaXplIGV0YWxvbl9zaXplLCBmbG9hdCBzcXVhcmVfc2l6ZSk7CitzdGF0aWMgdm9pZCBEcmF3RXRhbG9uKElwbEltYWdlICppbWcsIEN2UG9pbnQyRDMyZiAqY29ybmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcm5lcl9jb3VudCwgQ3ZTaXplIGV0YWxvbl9zaXplLCBpbnQgZHJhd19vcmRlcmVkKTsKK3N0YXRpYyB2b2lkIE11bHRNYXRyaXgoZmxvYXQgcm1bNF1bNF0sIGNvbnN0IGZsb2F0IG0xWzRdWzRdLCBjb25zdCBmbG9hdCBtMls0XVs0XSk7CitzdGF0aWMgdm9pZCBNdWx0VmVjdG9yTWF0cml4KGZsb2F0IHJ2WzRdLCBjb25zdCBmbG9hdCB2WzRdLCBjb25zdCBmbG9hdCBtWzRdWzRdKTsKK3N0YXRpYyBDdlBvaW50M0QzMmYgSW1hZ2VDU3RvV29ybGRDUyhjb25zdCBDdjNkVHJhY2tlckNhbWVyYUluZm8gJmNhbWVyYV9pbmZvLCBDdlBvaW50MkQzMmYgcCk7CitzdGF0aWMgYm9vbCBpbnRlcnNlY3Rpb24oQ3ZQb2ludDNEMzJmIG8xLCBDdlBvaW50M0QzMmYgcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmIG8yLCBDdlBvaW50M0QzMmYgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmICZyMSwgQ3ZQb2ludDNEMzJmICZyMik7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gY3YzZFRyYWNrZXJDYWxpYnJhdGVDYW1lcmFzIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0NWX0lNUEwgQ3ZCb29sIGN2M2RUcmFja2VyQ2FsaWJyYXRlQ2FtZXJhcyhpbnQgbnVtX2NhbWVyYXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3YzZFRyYWNrZXJDYW1lcmFJbnRyaW5zaWNzIGNhbWVyYV9pbnRyaW5zaWNzW10sIC8vIHNpemUgaXMgbnVtX2NhbWVyYXMKKyAgICAgICAgICAgICAgICAgICBDdlNpemUgZXRhbG9uX3NpemUsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgc3F1YXJlX3NpemUsCisgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKnNhbXBsZXNbXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaXMgbnVtX2NhbWVyYXMKKyAgICAgICAgICAgICAgICAgICBDdjNkVHJhY2tlckNhbWVyYUluZm8gY2FtZXJhX2luZm9bXSkgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpcyBudW1fY2FtZXJhcworeworICAgIENWX0ZVTkNOQU1FKCJjdjNkVHJhY2tlckNhbGlicmF0ZUNhbWVyYXMiKTsKKyAgICBjb25zdCBpbnQgbnVtX3BvaW50cyA9IGV0YWxvbl9zaXplLndpZHRoICogZXRhbG9uX3NpemUuaGVpZ2h0OworICAgIGludCBjYW1lcmFzX2RvbmUgPSAwOyAgICAgICAgLy8gdGhlIG51bWJlciBvZiBjYW1lcmFzIHdob3NlIHBvc2l0aW9ucyBoYXZlIGJlZW4gZGV0ZXJtaW5lZAorICAgIEN2UG9pbnQzRDMyZiAqb2JqZWN0X3BvaW50cyA9IE5VTEw7IC8vIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMgb2YgY2hlY2tlcmJvYXJkIHBvaW50cworICAgIEN2UG9pbnQyRDMyZiAqcG9pbnRzID0gTlVMTDsgLy8gMmQgY29vcmRpbmF0ZXMgb2YgY2hlY2tlcmJvYXJkIHBvaW50cyBhcyBzZWVuIGJ5IGEgY2FtZXJhCisgICAgSXBsSW1hZ2UgKmdyYXlfaW1nID0gTlVMTDsgICAvLyB0ZW1wb3JhcnkgaW1hZ2UgZm9yIGNvbG9yIGNvbnZlcnNpb24KKyAgICBJcGxJbWFnZSAqdG1wX2ltZyA9IE5VTEw7ICAgIC8vIHRlbXBvcmFyeSBpbWFnZSB1c2VkIGJ5IEZpbmRDaGVzc2JvYXJkQ29ybmVyR3Vlc3NlcworICAgIGludCBjLCBpLCBqOworCisgICAgaWYgKGV0YWxvbl9zaXplLndpZHRoIDwgMyB8fCBldGFsb25fc2l6ZS5oZWlnaHQgPCAzKQorICAgICAgICBDVl9FUlJPUihDVl9TdHNCYWRBcmcsICJDaGVzcyBib2FyZCBzaXplIGlzIGludmFsaWQiKTsKKworICAgIGZvciAoYyA9IDA7IGMgPCBudW1fY2FtZXJhczsgYysrKQorICAgIHsKKyAgICAgICAgLy8gQ1ZfQ0hFQ0tfSU1BR0UgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgY3ZhdXggbGlicmFyeQorICAgICAgICAvLyBzbyBwZXJmb3JtIHRoZSBjaGVja3MgaW5saW5lLgorCisgICAgICAgIC8vQ1ZfQ0FMTChDVl9DSEVDS19JTUFHRShzYW1wbGVzW2NdKSk7CisKKyAgICAgICAgaWYoIHNhbXBsZXNbY10gPT0gTlVMTCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfSGVhZGVySXNOdWxsLCAiTnVsbCBpbWFnZSIgKTsKKworICAgICAgICBpZiggc2FtcGxlc1tjXS0+ZGF0YU9yZGVyICE9IElQTF9EQVRBX09SREVSX1BJWEVMICYmIHNhbXBsZXNbY10tPm5DaGFubmVscyA+IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE9yZGVyLCAiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IiApOworCisgICAgICAgIGlmKCBzYW1wbGVzW2NdLT5tYXNrUk9JICE9IDAgfHwgc2FtcGxlc1tjXS0+dGlsZUluZm8gIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IiApOworCisgICAgICAgIGlmKCBzYW1wbGVzW2NdLT5pbWFnZURhdGEgPT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGF0YVB0ciwgIk51bGwgaW1hZ2UgZGF0YSIgKTsKKworICAgICAgICBpZiggc2FtcGxlc1tjXS0+cm9pICYmCisgICAgICAgICAgICAoKHNhbXBsZXNbY10tPnJvaS0+eE9mZnNldCB8IHNhbXBsZXNbY10tPnJvaS0+eU9mZnNldAorICAgICAgICAgICAgICB8IHNhbXBsZXNbY10tPnJvaS0+d2lkdGggfCBzYW1wbGVzW2NdLT5yb2ktPmhlaWdodCkgPCAwIHx8CisgICAgICAgICAgICAgc2FtcGxlc1tjXS0+cm9pLT54T2Zmc2V0ICsgc2FtcGxlc1tjXS0+cm9pLT53aWR0aCA+IHNhbXBsZXNbY10tPndpZHRoIHx8CisgICAgICAgICAgICAgc2FtcGxlc1tjXS0+cm9pLT55T2Zmc2V0ICsgc2FtcGxlc1tjXS0+cm9pLT5oZWlnaHQgPiBzYW1wbGVzW2NdLT5oZWlnaHQgfHwKKyAgICAgICAgICAgICAodW5zaWduZWQpIChzYW1wbGVzW2NdLT5yb2ktPmNvaSkgPiAodW5zaWduZWQpIChzYW1wbGVzW2NdLT5uQ2hhbm5lbHMpKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRST0lTaXplLCAiSW52YWxpZCBST0kiICk7CisKKyAgICAgICAgLy8gRW5kIG9mIENWX0NIRUNLX0lNQUdFIGlubGluZSBleHBhbnNpb24KKworICAgICAgICBpZiAoc2FtcGxlc1tjXS0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVKQorICAgICAgICAgICAgQ1ZfRVJST1IoQ1ZfQmFkRGVwdGgsICJDaGFubmVsIGRlcHRoIG9mIHNvdXJjZSBpbWFnZSBtdXN0IGJlIDgiKTsKKworICAgICAgICBpZiAoc2FtcGxlc1tjXS0+bkNoYW5uZWxzICE9IDMgJiYgc2FtcGxlc1tjXS0+bkNoYW5uZWxzICE9IDEpCisgICAgICAgICAgICBDVl9FUlJPUihDVl9CYWROdW1DaGFubmVscywgIlNvdXJjZSBpbWFnZSBtdXN0IGhhdmUgMSBvciAzIGNoYW5uZWxzIik7CisgICAgfQorCisgICAgQ1ZfQ0FMTChvYmplY3RfcG9pbnRzID0gKEN2UG9pbnQzRDMyZiAqKWN2QWxsb2MobnVtX3BvaW50cyAqIHNpemVvZihDdlBvaW50M0QzMmYpKSk7CisgICAgQ1ZfQ0FMTChwb2ludHMgPSAoQ3ZQb2ludDJEMzJmICopY3ZBbGxvYyhudW1fcG9pbnRzICogc2l6ZW9mKEN2UG9pbnQyRDMyZikpKTsKKworICAgIC8vIGZpbGwgaW4gdGhlIHJlYWwtd29ybGQgY29vcmRpbmF0ZXMgb2YgdGhlIGNoZWNrZXJib2FyZCBwb2ludHMKKyAgICBGaWxsT2JqZWN0UG9pbnRzKG9iamVjdF9wb2ludHMsIGV0YWxvbl9zaXplLCBzcXVhcmVfc2l6ZSk7CisKKyAgICBmb3IgKGMgPSAwOyBjIDwgbnVtX2NhbWVyYXM7IGMrKykKKyAgICB7CisgICAgICAgIEN2U2l6ZSBpbWFnZV9zaXplID0gY3ZTaXplKHNhbXBsZXNbY10tPndpZHRoLCBzYW1wbGVzW2NdLT5oZWlnaHQpOworICAgICAgICBJcGxJbWFnZSAqaW1nOworCisgICAgICAgIC8vIFRoZSBpbnB1dCBzYW1wbGVzIGFyZSBub3QgcmVxdWlyZWQgdG8gYWxsIGhhdmUgdGhlIHNhbWUgc2l6ZSBvciBjb2xvcgorICAgICAgICAvLyBmb3JtYXQuIElmIHRoZXkgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMsIHRoZSB0ZW1wb3JhcnkgaW1hZ2VzIGFyZQorICAgICAgICAvLyByZWFsbG9jYXRlZCBhcyBuZWNlc3NhcnkuCisgICAgICAgIGlmIChzYW1wbGVzW2NdLT5uQ2hhbm5lbHMgPT0gMykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29udmVydCB0byBncmF5CisgICAgICAgICAgICBpZiAoZ3JheV9pbWcgPT0gTlVMTCB8fCBncmF5X2ltZy0+d2lkdGggIT0gc2FtcGxlc1tjXS0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICBncmF5X2ltZy0+aGVpZ2h0ICE9IHNhbXBsZXNbY10tPmhlaWdodCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKGdyYXlfaW1nICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZUltYWdlKCZncmF5X2ltZyk7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTChncmF5X2ltZyA9IGN2Q3JlYXRlSW1hZ2UoaW1hZ2Vfc2l6ZSwgSVBMX0RFUFRIXzhVLCAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENWX0NBTEwoY3ZDdnRDb2xvcihzYW1wbGVzW2NdLCBncmF5X2ltZywgQ1ZfQkdSMkdSQVkpKTsKKworICAgICAgICAgICAgaW1nID0gZ3JheV9pbWc7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyBubyBjb2xvciBjb252ZXJzaW9uIHJlcXVpcmVkCisgICAgICAgICAgICBpbWcgPSBzYW1wbGVzW2NdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRtcF9pbWcgPT0gTlVMTCB8fCB0bXBfaW1nLT53aWR0aCAhPSBzYW1wbGVzW2NdLT53aWR0aCB8fAorICAgICAgICAgICAgdG1wX2ltZy0+aGVpZ2h0ICE9IHNhbXBsZXNbY10tPmhlaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICh0bXBfaW1nICE9IE5VTEwpCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoJnRtcF9pbWcpOworICAgICAgICAgICAgQ1ZfQ0FMTCh0bXBfaW1nID0gY3ZDcmVhdGVJbWFnZShpbWFnZV9zaXplLCBJUExfREVQVEhfOFUsIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBjb3VudCA9IG51bV9wb2ludHM7CisgICAgICAgIGJvb2wgZm91bmQgPSBjdkZpbmRDaGVzc0JvYXJkQ29ybmVyR3Vlc3NlcyhpbWcsIHRtcF9pbWcsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFsb25fc2l6ZSwgcG9pbnRzLCAmY291bnQpICE9IDA7CisgICAgICAgIGlmIChjb3VudCA9PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIAorICAgICAgICAvLyBJZiBmb3VuZCBpcyB0cnVlLCBpdCBtZWFucyBhbGwgdGhlIHBvaW50cyB3ZXJlIGZvdW5kIChjb3VudCA9IG51bV9wb2ludHMpLgorICAgICAgICAvLyBJZiBmb3VuZCBpcyBmYWxzZSBidXQgY291bnQgaXMgbm9uLXplcm8sIGl0IG1lYW5zIHRoYXQgbm90IGFsbCBwb2ludHMgd2VyZSBmb3VuZC4KKworICAgICAgICBjdkZpbmRDb3JuZXJTdWJQaXgoaW1nLCBwb2ludHMsIGNvdW50LCBjdlNpemUoNSw1KSwgY3ZTaXplKC0xLC0xKSwKKyAgICAgICAgICAgICAgICAgICAgY3ZUZXJtQ3JpdGVyaWEoQ1ZfVEVSTUNSSVRfSVRFUnxDVl9URVJNQ1JJVF9FUFMsIDEwLCAwLjAxZikpOworCisgICAgICAgIC8vIElmIHRoZSBpbWFnZSBvcmlnaW4gaXMgQkwgKGJvdHRvbS1sZWZ0KSwgZml4IHRoZSB5IGNvb3JkaW5hdGVzCisgICAgICAgIC8vIHNvIHRoZXkgYXJlIHJlbGF0aXZlIHRvIHRoZSB0cnVlIHRvcCBvZiB0aGUgaW1hZ2UuCisgICAgICAgIGlmIChzYW1wbGVzW2NdLT5vcmlnaW4gPT0gSVBMX09SSUdJTl9CTCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCisgICAgICAgICAgICAgICAgcG9pbnRzW2ldLnkgPSBzYW1wbGVzW2NdLT5oZWlnaHQgLSAxIC0gcG9pbnRzW2ldLnk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB4IGNvb3JkaW5hdGVzIGFyZSBpbmNyZWFzaW5nIGFuZCB5IGNvb3JkaW5hdGVzIGFyZSBkZWNyZWFzaW5nLgorICAgICAgICAgICAgLy8gKFRoZSB5IGNvb3JkaW5hdGUgb2YgcG9pbnQgKDAsMCkgc2hvdWxkIGJlIHRoZSBncmVhdGVzdCwgYmVjYXVzZSB0aGUgcG9pbnQKKyAgICAgICAgICAgIC8vIG9uIHRoZSBjaGVja2VyYm9hcmQgdGhhdCBpcyB0aGUgb3JpZ2luIGlzIG5lYXJlc3QgdGhlIGJvdHRvbSBvZiB0aGUgaW1hZ2UuKQorICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIGFmdGVyIGFkanVzdGluZyB0aGUgeSBjb29yZGluYXRlcyBhY2NvcmRpbmcgdG8gdGhlIGltYWdlIG9yaWdpbi4KKyAgICAgICAgICAgIGlmIChwb2ludHNbMF0ueCA+IHBvaW50c1sxXS54KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgcG9pbnRzIGluIGVhY2ggcm93CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGV0YWxvbl9zaXplLmhlaWdodDsgaisrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmICpyb3cgPSAmcG9pbnRzW2oqZXRhbG9uX3NpemUud2lkdGhdOworICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXRhbG9uX3NpemUud2lkdGgvMjsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzd2FwKHJvd1tpXSwgcm93W2V0YWxvbl9zaXplLndpZHRoLWktMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBvaW50c1swXS55IDwgcG9pbnRzW2V0YWxvbl9zaXplLndpZHRoXS55KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHJldmVyc2UgcG9pbnRzIGluIGVhY2ggY29sdW1uCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGV0YWxvbl9zaXplLndpZHRoOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZXRhbG9uX3NpemUuaGVpZ2h0LzI7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3dhcChwb2ludHNbaStqKmV0YWxvbl9zaXplLndpZHRoXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbaSsoZXRhbG9uX3NpemUuaGVpZ2h0LWotMSkqZXRhbG9uX3NpemUud2lkdGhdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBEcmF3RXRhbG9uKHNhbXBsZXNbY10sIHBvaW50cywgY291bnQsIGV0YWxvbl9zaXplLCBmb3VuZCk7CisKKyAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGZsb2F0IHJvdFZlY3RbM107CisgICAgICAgIGZsb2F0IHJvdE1hdHJbOV07CisgICAgICAgIGZsb2F0IHRyYW5zVmVjdFszXTsKKworICAgICAgICBjdkZpbmRFeHRyaW5zaWNDYW1lcmFQYXJhbXMoY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQgKj4oY2FtZXJhX2ludHJpbnNpY3NbY10uZm9jYWxfbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9pbnRyaW5zaWNzW2NdLnByaW5jaXBhbF9wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8ZmxvYXQgKj4oY2FtZXJhX2ludHJpbnNpY3NbY10uZGlzdG9ydGlvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RWZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0KTsKKworICAgICAgICAvLyBDaGVjayByZXN1bHQgYWdhaW5zdCBhbiBhcmJpdHJhcnkgbGltaXQgdG8gZWxpbWluYXRlIGltcG9zc2libGUgdmFsdWVzLgorICAgICAgICAvLyAoSWYgdGhlIGNoZXNzIGJvYXJkIHdlcmUgdHJ1bHkgdGhhdCBmYXIgYXdheSwgdGhlIGNhbWVyYSB3b3VsZG4ndCBiZSBhYmxlIHRvCisgICAgICAgIC8vIHNlZSB0aGUgc3F1YXJlcy4pCisgICAgICAgIGlmICh0cmFuc1ZlY3RbMF0gPiAxMDAwKnNxdWFyZV9zaXplCisgICAgICAgICAgICB8fCB0cmFuc1ZlY3RbMV0gPiAxMDAwKnNxdWFyZV9zaXplCisgICAgICAgICAgICB8fCB0cmFuc1ZlY3RbMl0gPiAxMDAwKnNxdWFyZV9zaXplKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgaW1wb3NzaWJsZSByZXN1bHRzCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEN2TWF0IHJvdE1hdHJEZXNjciA9IGN2TWF0KDMsIDMsIENWXzMyRkMxLCByb3RNYXRyKTsKKyAgICAgICAgQ3ZNYXQgcm90VmVjdERlc2NyID0gY3ZNYXQoMywgMSwgQ1ZfMzJGQzEsIHJvdFZlY3QpOworCisgICAgICAgIC8qIENhbGMgcm90YXRpb24gbWF0cml4IGJ5IFJvZHJpZ3VlcyBUcmFuc2Zvcm0gKi8KKyAgICAgICAgY3ZSb2RyaWd1ZXMyKCAmcm90VmVjdERlc2NyLCAmcm90TWF0ckRlc2NyICk7CisKKyAgICAgICAgLy9jb21iaW5lIHRoZSB0d28gdHJhbnNmb3JtYXRpb25zIGludG8gb25lIG1hdHJpeAorICAgICAgICAvL29yZGVyIGlzIGltcG9ydGFudCEgcm90YXRpb25zIGFyZSBub3QgY29tbXV0YXRpdmUKKyAgICAgICAgZmxvYXQgdG1hdFs0XVs0XSA9IHsgeyAxLmYsIDAuZiwgMC5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDEuZiwgMC5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDAuZiwgMS5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB0cmFuc1ZlY3RbMF0sIHRyYW5zVmVjdFsxXSwgdHJhbnNWZWN0WzJdLCAxLmYgfSB9OworICAgICAgICAKKyAgICAgICAgZmxvYXQgcm1hdFs0XVs0XSA9IHsgeyByb3RNYXRyWzBdLCByb3RNYXRyWzFdLCByb3RNYXRyWzJdLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByb3RNYXRyWzNdLCByb3RNYXRyWzRdLCByb3RNYXRyWzVdLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByb3RNYXRyWzZdLCByb3RNYXRyWzddLCByb3RNYXRyWzhdLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDAuZiwgMC5mLCAxLmYgfSB9OworCisKKyAgICAgICAgTXVsdE1hdHJpeChjYW1lcmFfaW5mb1tjXS5tYXQsIHRtYXQsIHJtYXQpOworCisgICAgICAgIC8vIGNoYW5nZSB0aGUgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGNhbWVyYXMgdG8gcHV0IHRoZW0gaW4gdGhlIHdvcmxkIGNvb3JkaW5hdGUgCisgICAgICAgIC8vIHN5c3RlbSB3ZSB3YW50IHRvIHdvcmsgd2l0aC4KKworICAgICAgICAvLyBTdGFydCB3aXRoIGFuIGlkZW50aXR5IG1hdHJpeDsgdGhlbiBmaWxsIGluIHRoZSB2YWx1ZXMgdG8gYWNjb21wbGlzaAorICAgICAgICAvLyB0aGUgZGVzaXJlZCB0cmFuc2Zvcm1hdGlvbi4KKyAgICAgICAgZmxvYXQgc21hdFs0XVs0XSA9IHsgeyAxLmYsIDAuZiwgMC5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDEuZiwgMC5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDAuZiwgMS5mLCAwLmYgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAwLmYsIDAuZiwgMC5mLCAxLmYgfSB9OworCisgICAgICAgIC8vIEZpcnN0LCByZWZsZWN0IHRocm91Z2ggdGhlIG9yaWdpbiBieSBpbnZlcnRpbmcgYWxsIHRocmVlIGF4ZXMuCisgICAgICAgIHNtYXRbMF1bMF0gPSAtMS5mOworICAgICAgICBzbWF0WzFdWzFdID0gLTEuZjsKKyAgICAgICAgc21hdFsyXVsyXSA9IC0xLmY7CisgICAgICAgIE11bHRNYXRyaXgodG1hdCwgY2FtZXJhX2luZm9bY10ubWF0LCBzbWF0KTsKKworICAgICAgICAvLyBTY2FsZSB4IGFuZCB5IGNvb3JkaW5hdGVzIGJ5IHRoZSBmb2NhbCBsZW5ndGggKGFsbG93aW5nIGZvciBub24tc3F1YXJlIHBpeGVscworICAgICAgICAvLyBhbmQvb3Igbm9uLXN5bW1ldHJpY2FsIGxlbnNlcykuCisgICAgICAgIHNtYXRbMF1bMF0gPSAxLjBmIC8gY2FtZXJhX2ludHJpbnNpY3NbY10uZm9jYWxfbGVuZ3RoWzBdOworICAgICAgICBzbWF0WzFdWzFdID0gMS4wZiAvIGNhbWVyYV9pbnRyaW5zaWNzW2NdLmZvY2FsX2xlbmd0aFsxXTsKKyAgICAgICAgc21hdFsyXVsyXSA9IDEuMGY7CisgICAgICAgIE11bHRNYXRyaXgoY2FtZXJhX2luZm9bY10ubWF0LCBzbWF0LCB0bWF0KTsKKworICAgICAgICBjYW1lcmFfaW5mb1tjXS5wcmluY2lwYWxfcG9pbnQgPSBjYW1lcmFfaW50cmluc2ljc1tjXS5wcmluY2lwYWxfcG9pbnQ7CisgICAgICAgIGNhbWVyYV9pbmZvW2NdLnZhbGlkID0gdHJ1ZTsKKworICAgICAgICBjYW1lcmFzX2RvbmUrKzsKKyAgICB9CisKK2V4aXQ6CisgICAgY3ZSZWxlYXNlSW1hZ2UoJmdyYXlfaW1nKTsKKyAgICBjdlJlbGVhc2VJbWFnZSgmdG1wX2ltZyk7CisgICAgY3ZGcmVlKCZvYmplY3RfcG9pbnRzKTsKKyAgICBjdkZyZWUoJnBvaW50cyk7CisKKyAgICByZXR1cm4gY2FtZXJhc19kb25lID09IG51bV9jYW1lcmFzOworfQorCisvLyBmaWxsIGluIHRoZSByZWFsLXdvcmxkIGNvb3JkaW5hdGVzIG9mIHRoZSBjaGVja2VyYm9hcmQgcG9pbnRzCitzdGF0aWMgdm9pZCBGaWxsT2JqZWN0UG9pbnRzKEN2UG9pbnQzRDMyZiAqb2JqX3BvaW50cywgQ3ZTaXplIGV0YWxvbl9zaXplLCBmbG9hdCBzcXVhcmVfc2l6ZSkKK3sKKyAgICBpbnQgeCwgeSwgaTsKKworICAgIGZvciAoeSA9IDAsIGkgPSAwOyB5IDwgZXRhbG9uX3NpemUuaGVpZ2h0OyB5KyspCisgICAgeworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZXRhbG9uX3NpemUud2lkdGg7IHgrKywgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBvYmpfcG9pbnRzW2ldLnggPSBzcXVhcmVfc2l6ZSAqIHg7CisgICAgICAgICAgICBvYmpfcG9pbnRzW2ldLnkgPSBzcXVhcmVfc2l6ZSAqIHk7CisgICAgICAgICAgICBvYmpfcG9pbnRzW2ldLnogPSAwOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vIE1hcmsgdGhlIHBvaW50cyBmb3VuZCBvbiB0aGUgaW5wdXQgaW1hZ2UKKy8vIFRoZSBtYXJrcyBhcmUgZHJhd24gbXVsdGktY29sb3JlZCBpZiBhbGwgdGhlIHBvaW50cyB3ZXJlIGZvdW5kLgorc3RhdGljIHZvaWQgRHJhd0V0YWxvbihJcGxJbWFnZSAqaW1nLCBDdlBvaW50MkQzMmYgKmNvcm5lcnMsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3JuZXJfY291bnQsIEN2U2l6ZSBldGFsb25fc2l6ZSwgaW50IGRyYXdfb3JkZXJlZCkKK3sKKyAgICBjb25zdCBpbnQgciA9IDQ7CisgICAgaW50IGk7CisgICAgaW50IHgsIHk7CisgICAgQ3ZQb2ludCBwcmV2X3B0ID0geyAwLCAwIH07CisgICAgc3RhdGljIGNvbnN0IEN2U2NhbGFyIHJnYl9jb2xvcnNbXSA9IHsKKyAgICAgICAge3swLDAsMjU1fX0sCisgICAgICAgIHt7MCwxMjgsMjU1fX0sCisgICAgICAgIHt7MCwyMDAsMjAwfX0sCisgICAgICAgIHt7MCwyNTUsMH19LAorICAgICAgICB7ezIwMCwyMDAsMH19LAorICAgICAgICB7ezI1NSwwLDB9fSwKKyAgICAgICAge3syNTUsMCwyNTV9fSB9OworICAgIHN0YXRpYyBjb25zdCBDdlNjYWxhciBncmF5X2NvbG9yc1tdID0geworICAgICAgICB7ezgwfX0sIHt7MTIwfX0sIHt7MTYwfX0sIHt7MjAwfX0sIHt7MTAwfX0sIHt7MTQwfX0sIHt7MTgwfX0KKyAgICB9OworICAgIGNvbnN0IEN2U2NhbGFyKiBjb2xvcnMgPSBpbWctPm5DaGFubmVscyA9PSAzID8gcmdiX2NvbG9ycyA6IGdyYXlfY29sb3JzOworCisgICAgQ3ZTY2FsYXIgY29sb3IgPSBjb2xvcnNbMF07CisgICAgZm9yICh5ID0gMCwgaSA9IDA7IHkgPCBldGFsb25fc2l6ZS5oZWlnaHQ7IHkrKykKKyAgICB7CisgICAgICAgIGlmIChkcmF3X29yZGVyZWQpCisgICAgICAgICAgICBjb2xvciA9IGNvbG9yc1t5ICUgQVJSQVlfU0laRU9GKHJnYl9jb2xvcnMpXTsKKworICAgICAgICBmb3IgKHggPSAwOyB4IDwgZXRhbG9uX3NpemUud2lkdGggJiYgaSA8IGNvcm5lcl9jb3VudDsgeCsrLCBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQgcHQ7CisgICAgICAgICAgICBwdC54ID0gY3ZSb3VuZChjb3JuZXJzW2ldLngpOworICAgICAgICAgICAgcHQueSA9IGN2Um91bmQoY29ybmVyc1tpXS55KTsKKyAgICAgICAgICAgIGlmIChpbWctPm9yaWdpbiA9PSBJUExfT1JJR0lOX0JMKQorICAgICAgICAgICAgICAgIHB0LnkgPSBpbWctPmhlaWdodCAtIDEgLSBwdC55OworCisgICAgICAgICAgICBpZiAoZHJhd19vcmRlcmVkKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICAgICAgICAgY3ZMaW5lKGltZywgcHJldl9wdCwgcHQsIGNvbG9yLCAxLCBDVl9BQSk7CisgICAgICAgICAgICAgICAgcHJldl9wdCA9IHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkxpbmUoIGltZywgY3ZQb2ludChwdC54IC0gciwgcHQueSAtIHIpLAorICAgICAgICAgICAgICAgICAgICBjdlBvaW50KHB0LnggKyByLCBwdC55ICsgciksIGNvbG9yLCAxLCBDVl9BQSApOworICAgICAgICAgICAgY3ZMaW5lKCBpbWcsIGN2UG9pbnQocHQueCAtIHIsIHB0LnkgKyByKSwKKyAgICAgICAgICAgICAgICAgICAgY3ZQb2ludChwdC54ICsgciwgcHQueSAtIHIpLCBjb2xvciwgMSwgQ1ZfQUEgKTsKKyAgICAgICAgICAgIGN2Q2lyY2xlKCBpbWcsIHB0LCByKzEsIGNvbG9yLCAxLCBDVl9BQSApOworICAgICAgICB9CisgICAgfQorfQorCisvLyBGaW5kIHRoZSBtaWRwb2ludCBvZiB0aGUgbGluZSBzZWdtZW50IGJldHdlZW4gdHdvIHBvaW50cy4KK3N0YXRpYyBDdlBvaW50M0QzMmYgbWlkcG9pbnQoY29uc3QgQ3ZQb2ludDNEMzJmICZwMSwgY29uc3QgQ3ZQb2ludDNEMzJmICZwMikKK3sKKyAgICByZXR1cm4gY3ZQb2ludDNEMzJmKChwMS54K3AyLngpLzIsIChwMS55K3AyLnkpLzIsIChwMS56K3AyLnopLzIpOworfQorCitzdGF0aWMgdm9pZCBvcGVyYXRvciArPShDdlBvaW50M0QzMmYgJnAxLCBjb25zdCBDdlBvaW50M0QzMmYgJnAyKQoreworICAgIHAxLnggKz0gcDIueDsKKyAgICBwMS55ICs9IHAyLnk7CisgICAgcDEueiArPSBwMi56OworfQorCitzdGF0aWMgQ3ZQb2ludDNEMzJmIG9wZXJhdG9yIC8oY29uc3QgQ3ZQb2ludDNEMzJmICZwLCBpbnQgZCkKK3sKKyAgICByZXR1cm4gY3ZQb2ludDNEMzJmKHAueC9kLCBwLnkvZCwgcC56L2QpOworfQorCitzdGF0aWMgY29uc3QgQ3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QgKmZpbmQoY29uc3QgQ3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QgdltdLCBpbnQgbnVtX29iamVjdHMsIGludCBpZCkKK3sKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9vYmplY3RzOyBpKyspCisgICAgeworICAgICAgICBpZiAodltpXS5pZCA9PSBpZCkKKyAgICAgICAgICAgIHJldHVybiAmdltpXTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKyNkZWZpbmUgQ0FNRVJBX1BPUyhjKSAoY3ZQb2ludDNEMzJmKChjKS5tYXRbM11bMF0sIChjKS5tYXRbM11bMV0sIChjKS5tYXRbM11bMl0pKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIGN2M2RUcmFja2VyTG9jYXRlT2JqZWN0cyAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitDVl9JTVBMIGludCAgY3YzZFRyYWNrZXJMb2NhdGVPYmplY3RzKGludCBudW1fY2FtZXJhcywgaW50IG51bV9vYmplY3RzLAorICAgICAgICAgICAgICAgICBjb25zdCBDdjNkVHJhY2tlckNhbWVyYUluZm8gY2FtZXJhX2luZm9bXSwgICAgICAvLyBzaXplIGlzIG51bV9jYW1lcmFzCisgICAgICAgICAgICAgICAgIGNvbnN0IEN2M2RUcmFja2VyMmRUcmFja2VkT2JqZWN0IHRyYWNraW5nX2luZm9bXSwgLy8gc2l6ZSBpcyBudW1fb2JqZWN0cypudW1fY2FtZXJhcworICAgICAgICAgICAgICAgICBDdjNkVHJhY2tlclRyYWNrZWRPYmplY3QgdHJhY2tlZF9vYmplY3RzW10pICAgICAvLyBzaXplIGlzIG51bV9vYmplY3RzCit7CisgICAgLypDVl9GVU5DTkFNRSgiY3YzZFRyYWNrZXJMb2NhdGVPYmplY3RzIik7Ki8KKyAgICBpbnQgZm91bmRfb2JqZWN0cyA9IDA7CisKKyAgICAvLyBjb3VudCBob3cgbWFueSBjYW1lcmFzIGNvdWxkIHNlZSBlYWNoIG9iamVjdAorICAgIHN0ZDo6bWFwPGludCwgaW50PiBjb3VudDsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IG51bV9jYW1lcmFzOyBjKyspCisgICAgeworICAgICAgICBpZiAoIWNhbWVyYV9pbmZvW2NdLnZhbGlkKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fb2JqZWN0czsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBDdjNkVHJhY2tlcjJkVHJhY2tlZE9iamVjdCAqbyA9ICZ0cmFja2luZ19pbmZvW2MqbnVtX29iamVjdHMraV07CisgICAgICAgICAgICBpZiAoby0+aWQgIT0gLTEpCisgICAgICAgICAgICAgICAgY291bnRbby0+aWRdKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBwcm9jZXNzIGVhY2ggb2JqZWN0IHRoYXQgd2FzIHNlZW4gYnkgYXQgbGVhc3QgdHdvIGNhbWVyYXMKKyAgICBmb3IgKHN0ZDo6bWFwPGludCwgaW50Pjo6aXRlcmF0b3IgaSA9IGNvdW50LmJlZ2luKCk7IGkgIT0gY291bnQuZW5kKCk7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChpLT5zZWNvbmQgPCAyKQorICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZSBvYmplY3Qgc2VlbiBieSBvbmx5IG9uZSBjYW1lcmEKKyAgICAgICAgaW50IGlkID0gaS0+Zmlyc3Q7CisKKyAgICAgICAgLy8gZmluZCBhbiBhcHByb3hpbWF0aW9uIG9mIHRoZSBvYmplY3RzIGxvY2F0aW9uIGZvciBlYWNoIHBhaXIgb2YgY2FtZXJhcyB0aGF0CisgICAgICAgIC8vIGNvdWxkIHNlZSB0aGlzIG9iamVjdCwgYW5kIGF2ZXJhZ2UgdGhlbQorICAgICAgICBDdlBvaW50M0QzMmYgdG90YWwgPSBjdlBvaW50M0QzMmYoMCwgMCwgMCk7CisgICAgICAgIGludCB3ZWlnaHQgPSAwOworCisgICAgICAgIGZvciAoaW50IGMxID0gMDsgYzEgPCBudW1fY2FtZXJhcy0xOyBjMSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoIWNhbWVyYV9pbmZvW2MxXS52YWxpZCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgY29uc3QgQ3YzZFRyYWNrZXIyZFRyYWNrZWRPYmplY3QgKm8xID0gZmluZCgmdHJhY2tpbmdfaW5mb1tjMSpudW1fb2JqZWN0c10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9vYmplY3RzLCBpZCk7CisgICAgICAgICAgICBpZiAobzEgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gdGhpcyBjYW1lcmEgZGlkbid0IHNlZSB0aGlzIG9iamVjdAorCisgICAgICAgICAgICBDdlBvaW50M0QzMmYgcDFhID0gQ0FNRVJBX1BPUyhjYW1lcmFfaW5mb1tjMV0pOworICAgICAgICAgICAgQ3ZQb2ludDNEMzJmIHAxYiA9IEltYWdlQ1N0b1dvcmxkQ1MoY2FtZXJhX2luZm9bYzFdLCBvMS0+cCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGMyID0gYzEgKyAxOyBjMiA8IG51bV9jYW1lcmFzOyBjMisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghY2FtZXJhX2luZm9bYzJdLnZhbGlkKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIGNvbnN0IEN2M2RUcmFja2VyMmRUcmFja2VkT2JqZWN0ICpvMiA9IGZpbmQoJnRyYWNraW5nX2luZm9bYzIqbnVtX29iamVjdHNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX29iamVjdHMsIGlkKTsKKyAgICAgICAgICAgICAgICBpZiAobzIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIHRoaXMgY2FtZXJhIGRpZG4ndCBzZWUgdGhpcyBvYmplY3QKKworICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiBwMmEgPSBDQU1FUkFfUE9TKGNhbWVyYV9pbmZvW2MyXSk7CisgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmIHAyYiA9IEltYWdlQ1N0b1dvcmxkQ1MoY2FtZXJhX2luZm9bYzJdLCBvMi0+cCk7CisKKyAgICAgICAgICAgICAgICAvLyB0aGVzZSB2YXJpYWJsZXMgYXJlIGluaXRpYWxpemVkIHNpbXBseSB0byBhdm9pZCBlcnJvbmVvdXMgZXJyb3IgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAvLyBmcm9tIHRoZSBjb21waWxlcgorICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiByMSA9IGN2UG9pbnQzRDMyZigwLCAwLCAwKTsKKyAgICAgICAgICAgICAgICBDdlBvaW50M0QzMmYgcjIgPSBjdlBvaW50M0QzMmYoMCwgMCwgMCk7CisKKyAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhlIHR3byBsaW5lcyAob3IgdGhlIHBvaW50cyBvZiBjbG9zZXN0CisgICAgICAgICAgICAgICAgLy8gYXBwcm9hY2gsIGlmIHRoZXkgZG9uJ3QgaW50ZXJzZWN0KQorICAgICAgICAgICAgICAgIGlmICghaW50ZXJzZWN0aW9uKHAxYSwgcDFiLCBwMmEsIHAyYiwgcjEsIHIyKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBtaWRwb2ludChyMSwgcjIpOworICAgICAgICAgICAgICAgIHdlaWdodCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ3ZQb2ludDNEMzJmIGNlbnRlciA9IHRvdGFsL3dlaWdodDsKKyAgICAgICAgdHJhY2tlZF9vYmplY3RzW2ZvdW5kX29iamVjdHMrK10gPSBjdjNkVHJhY2tlclRyYWNrZWRPYmplY3QoaWQsIGNlbnRlcik7CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kX29iamVjdHM7Cit9CisKKyNkZWZpbmUgRVBTIDFlLTkKKworLy8gQ29tcHV0ZSB0aGUgZGV0ZXJtaW5hbnQgb2YgdGhlIDN4MyBtYXRyaXggcmVwcmVzZW50ZWQgYnkgMyByb3cgdmVjdG9ycy4KK3N0YXRpYyBpbmxpbmUgZG91YmxlIGRldChDdlBvaW50M0QzMmYgdjEsIEN2UG9pbnQzRDMyZiB2MiwgQ3ZQb2ludDNEMzJmIHYzKQoreworICAgIHJldHVybiB2MS54KnYyLnkqdjMueiArIHYxLnoqdjIueCp2My55ICsgdjEueSp2Mi56KnYzLngKKyAgICAgICAgICAgLSB2MS56KnYyLnkqdjMueCAtIHYxLngqdjIueip2My55IC0gdjEueSp2Mi54KnYzLno7Cit9CisKK3N0YXRpYyBDdlBvaW50M0QzMmYgb3BlcmF0b3IgKyhDdlBvaW50M0QzMmYgYSwgQ3ZQb2ludDNEMzJmIGIpCit7CisgICAgcmV0dXJuIGN2UG9pbnQzRDMyZihhLnggKyBiLngsIGEueSArIGIueSwgYS56ICsgYi56KTsKK30KKworc3RhdGljIEN2UG9pbnQzRDMyZiBvcGVyYXRvciAtKEN2UG9pbnQzRDMyZiBhLCBDdlBvaW50M0QzMmYgYikKK3sKKyAgICByZXR1cm4gY3ZQb2ludDNEMzJmKGEueCAtIGIueCwgYS55IC0gYi55LCBhLnogLSBiLnopOworfQorCitzdGF0aWMgQ3ZQb2ludDNEMzJmIG9wZXJhdG9yICooQ3ZQb2ludDNEMzJmIHYsIGRvdWJsZSBmKQoreworICAgIHJldHVybiBjdlBvaW50M0QzMmYoZip2LngsIGYqdi55LCBmKnYueik7Cit9CisKKworLy8gRmluZCB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBsaW5lcywgb3IgaWYgdGhleSBkb24ndCBpbnRlcnNlY3QsCisvLyB0aGUgcG9pbnRzIG9mIGNsb3Nlc3QgYXBwcm9hY2guCisvLyBUaGUgbGluZXMgYXJlIGRlZmluZWQgYnkgKG8xLHAxKSBhbmQgKG8yLCBwMikuCisvLyBJZiB0aGV5IGludGVyc2VjdCwgcjEgYW5kIHIyIHdpbGwgYmUgdGhlIHNhbWUuCisvLyBSZXR1cm5zIGZhbHNlIG9uIGVycm9yLgorc3RhdGljIGJvb2wgaW50ZXJzZWN0aW9uKEN2UG9pbnQzRDMyZiBvMSwgQ3ZQb2ludDNEMzJmIHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiBvMiwgQ3ZQb2ludDNEMzJmIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiAmcjEsIEN2UG9pbnQzRDMyZiAmcjIpCit7CisgICAgQ3ZQb2ludDNEMzJmIHggPSBvMiAtIG8xOworICAgIEN2UG9pbnQzRDMyZiBkMSA9IHAxIC0gbzE7CisgICAgQ3ZQb2ludDNEMzJmIGQyID0gcDIgLSBvMjsKKworICAgIEN2UG9pbnQzRDMyZiBjcm9zcyA9IGN2UG9pbnQzRDMyZihkMS55KmQyLnogLSBkMS56KmQyLnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQxLnoqZDIueCAtIGQxLngqZDIueiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZDEueCpkMi55IC0gZDEueSpkMi54KTsKKyAgICBkb3VibGUgZGVuID0gY3Jvc3MueCpjcm9zcy54ICsgY3Jvc3MueSpjcm9zcy55ICsgY3Jvc3Mueipjcm9zcy56OworCisgICAgaWYgKGRlbiA8IEVQUykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZG91YmxlIHQxID0gZGV0KHgsIGQyLCBjcm9zcykgLyBkZW47CisgICAgZG91YmxlIHQyID0gZGV0KHgsIGQxLCBjcm9zcykgLyBkZW47CisKKyAgICByMSA9IG8xICsgZDEgKiB0MTsKKyAgICByMiA9IG8yICsgZDIgKiB0MjsKKworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb252ZXJ0IGZyb20gaW1hZ2UgdG8gY2FtZXJhIHNwYWNlIGJ5IHRyYW5zZm9ybWluZyBwb2ludCBwIGluCisvLyB0aGUgaW1hZ2UgcGxhbmUgYnkgdGhlIGNhbWVyYSBtYXRyaXguCitzdGF0aWMgQ3ZQb2ludDNEMzJmIEltYWdlQ1N0b1dvcmxkQ1MoY29uc3QgQ3YzZFRyYWNrZXJDYW1lcmFJbmZvICZjYW1lcmFfaW5mbywgQ3ZQb2ludDJEMzJmIHApCit7CisgICAgZmxvYXQgdHBbNF07CisgICAgdHBbMF0gPSAoZmxvYXQpcC54IC0gY2FtZXJhX2luZm8ucHJpbmNpcGFsX3BvaW50Lng7CisgICAgdHBbMV0gPSAoZmxvYXQpcC55IC0gY2FtZXJhX2luZm8ucHJpbmNpcGFsX3BvaW50Lnk7CisgICAgdHBbMl0gPSAxLmY7CisgICAgdHBbM10gPSAxLmY7CisKKyAgICBmbG9hdCB0cls0XTsKKyAgICAvL211bHRpcGx5IHRwIGJ5IG1hdCB0byBnZXQgdHIKKyAgICBNdWx0VmVjdG9yTWF0cml4KHRyLCB0cCwgY2FtZXJhX2luZm8ubWF0KTsKKworICAgIHJldHVybiBjdlBvaW50M0QzMmYodHJbMF0vdHJbM10sIHRyWzFdL3RyWzNdLCB0clsyXS90clszXSk7Cit9CisKKy8vIE11bHRpcGx5IGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtMSBieSB0aGUgYWZmaW5lIHRyYW5zZm9ybWF0aW9uIG0yIGFuZAorLy8gcmV0dXJuIHRoZSByZXN1bHQgaW4gcm0uCitzdGF0aWMgdm9pZCBNdWx0TWF0cml4KGZsb2F0IHJtWzRdWzRdLCBjb25zdCBmbG9hdCBtMVs0XVs0XSwgY29uc3QgZmxvYXQgbTJbNF1bNF0pCit7CisgICAgZm9yIChpbnQgaT0wOyBpPD0zOyBpKyspCisgICAgICAgIGZvciAoaW50IGo9MDsgajw9MzsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBybVtpXVtqXT0gMC4wOworICAgICAgICAgICAgZm9yIChpbnQgaz0wOyBrIDw9IDM7IGsrKykKKyAgICAgICAgICAgICAgICBybVtpXVtqXSArPSBtMVtpXVtrXSptMltrXVtqXTsKKyAgICAgICAgfQorfQorCisvLyBNdWx0aXBseSB0aGUgdmVjdG9yIHYgYnkgdGhlIGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBtYXRyaXggbSBhbmQgcmV0dXJuIHRoZQorLy8gcmVzdWx0IGluIHJ2Lgordm9pZCBNdWx0VmVjdG9yTWF0cml4KGZsb2F0IHJ2WzRdLCBjb25zdCBmbG9hdCB2WzRdLCBjb25zdCBmbG9hdCBtWzRdWzRdKQoreworICAgIGZvciAoaW50IGk9MDsgaTw9MzsgaSsrKQorICAgIHsKKyAgICAgICAgcnZbaV0gPSAwLmY7CisgICAgICAgIGZvciAoaW50IGo9MDtqPD0zO2orKykKKyAgICAgICAgICAgIHJ2W2ldICs9IHZbal0gKiBtW2pdW2ldOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmF1eC5jcHAgYi9jdmF1eC9zcmMvY3ZhdXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZhdXguY3BwCkBAIC0wLDAgKzEsNDQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2YXV4dXRpbHMuY3BwIGIvY3ZhdXgvc3JjL2N2YXV4dXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOGRmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZhdXh1dGlscy5jcHAKQEAgLTAsMCArMSw0NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZiZ2ZnX2FjbW1tMjAwMy5jcHAgYi9jdmF1eC9zcmMvY3ZiZ2ZnX2FjbW1tMjAwMy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNiMDNiMwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmJnZmdfYWNtbW0yMDAzLmNwcApAQCAtMCwwICsxLDc0MCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisKKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb3JlZ3JvdW5kL2JhY2tncm91bmQgcGl4ZWwKKy8vIGRpc2NyaW1pbmF0aW9uIGFsZ29yaXRobSBkZXNjcmliZWQgaW4KKy8vCisvLyAgICAgRm9yZWdyb3VuZCBPYmplY3QgRGV0ZWN0aW9uIGZyb20gVmlkZW9zIENvbnRhaW5pbmcgQ29tcGxleCBCYWNrZ3JvdW5kCisvLyAgICAgTGksIEh1YW4sIEd1LCBUaWFuIDIwMDMgOXAKKy8vICAgICBodHRwOi8vbXVxLm9yZy9+Y3luYmUvYmliL2ZvcmVncm91bmQtb2JqZWN0LWRldGVjdGlvbi1mcm9tLXZpZGVvcy1jb250YWluaW5nLWNvbXBsZXgtYmFja2dyb3VuZC5wZGYgCisKKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisvLyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK3N0YXRpYyBkb3VibGUqIF9jdl9tYXhfZWxlbWVudCggZG91YmxlKiBzdGFydCwgZG91YmxlKiBlbmQgKQoreworICAgIGRvdWJsZSogcCA9IHN0YXJ0Kys7CisKKyAgICBmb3IoIDsgc3RhcnQgIT0gZW5kOyAgKytzdGFydCkgeworCisgICAgICAgIGlmICgqcCA8ICpzdGFydCkgICBwID0gc3RhcnQ7CisgICAgfSAKKworICAgIHJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBDVl9DREVDTCBpY3ZSZWxlYXNlRkdEU3RhdE1vZGVsKCBDdkZHRFN0YXRNb2RlbCoqIG1vZGVsICk7CitzdGF0aWMgaW50IENWX0NERUNMIGljdlVwZGF0ZUZHRFN0YXRNb2RlbCggSXBsSW1hZ2UqIGN1cnJfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZGR0RTdGF0TW9kZWwqICBtb2RlbCApOworCisvLyBGdW5jdGlvbiBjdkNyZWF0ZUZHRFN0YXRNb2RlbCBpbml0aWFsaXplcyBmb3JlZ3JvdW5kIGRldGVjdGlvbiBwcm9jZXNzCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICBmaXJzdF9mcmFtZSAtIGZyYW1lIGZyb20gdmlkZW8gc2VxdWVuY2UKKy8vICAgICAgcGFyYW1ldGVycyAgLSAob3B0aW9uYWwpIGlmIE5VTEwgZGVmYXVsdCBwYXJhbWV0ZXJzIG9mIHRoZSBhbGdvcml0aG0gd2lsbCBiZSB1c2VkCisvLyAgICAgIHBfbW9kZWwgICAgIC0gcG9pbnRlciB0byBDdkZHRFN0YXRNb2RlbCBzdHJ1Y3R1cmUKK0NWX0lNUEwgQ3ZCR1N0YXRNb2RlbCoKK2N2Q3JlYXRlRkdEU3RhdE1vZGVsKCBJcGxJbWFnZSogZmlyc3RfZnJhbWUsIEN2RkdEU3RhdE1vZGVsUGFyYW1zKiBwYXJhbWV0ZXJzICkKK3sKKyAgICBDdkZHRFN0YXRNb2RlbCogcF9tb2RlbCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUZHRFN0YXRNb2RlbCIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpbnQgaSwgaiwgaywgcGl4ZWxfY291bnQsIGJ1Zl9zaXplOworICAgIEN2RkdEU3RhdE1vZGVsUGFyYW1zIHBhcmFtczsKKworICAgIGlmKCAhQ1ZfSVNfSU1BR0UoZmlyc3RfZnJhbWUpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgb3IgTlVMTCBmaXJzdF9mcmFtZSBwYXJhbWV0ZXIiICk7CisKKyAgICBpZiAoZmlyc3RfZnJhbWUtPm5DaGFubmVscyAhPSAzKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZmlyc3RfZnJhbWUgbXVzdCBoYXZlIDMgY29sb3IgY2hhbm5lbHMiICk7CisKKyAgICAvLyBJbml0aWFsaXplIHBhcmFtZXRlcnM6CisgICAgaWYoIHBhcmFtZXRlcnMgPT0gTlVMTCApCisgICAgeworICAgICAgICBwYXJhbXMuTGMgICAgICA9IENWX0JHRkdfRkdEX0xDOworICAgICAgICBwYXJhbXMuTjFjICAgICA9IENWX0JHRkdfRkdEX04xQzsKKyAgICAgICAgcGFyYW1zLk4yYyAgICAgPSBDVl9CR0ZHX0ZHRF9OMkM7CisKKyAgICAgICAgcGFyYW1zLkxjYyAgICAgPSBDVl9CR0ZHX0ZHRF9MQ0M7CisgICAgICAgIHBhcmFtcy5OMWNjICAgID0gQ1ZfQkdGR19GR0RfTjFDQzsKKyAgICAgICAgcGFyYW1zLk4yY2MgICAgPSBDVl9CR0ZHX0ZHRF9OMkNDOworCisgICAgICAgIHBhcmFtcy5kZWx0YSAgID0gQ1ZfQkdGR19GR0RfREVMVEE7CisKKyAgICAgICAgcGFyYW1zLmFscGhhMSAgPSBDVl9CR0ZHX0ZHRF9BTFBIQV8xOworICAgICAgICBwYXJhbXMuYWxwaGEyICA9IENWX0JHRkdfRkdEX0FMUEhBXzI7CisgICAgICAgIHBhcmFtcy5hbHBoYTMgID0gQ1ZfQkdGR19GR0RfQUxQSEFfMzsKKworICAgICAgICBwYXJhbXMuVCAgICAgICA9IENWX0JHRkdfRkdEX1Q7CisgICAgICAgIHBhcmFtcy5taW5BcmVhID0gQ1ZfQkdGR19GR0RfTUlOQVJFQTsKKworICAgICAgICBwYXJhbXMuaXNfb2JqX3dpdGhvdXRfaG9sZXMgPSAxOworICAgICAgICBwYXJhbXMucGVyZm9ybV9tb3JwaGluZyAgICAgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwYXJhbXMgPSAqcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBwX21vZGVsID0gKEN2RkdEU3RhdE1vZGVsKiljdkFsbG9jKCBzaXplb2YoKnBfbW9kZWwpICkpOworICAgIG1lbXNldCggcF9tb2RlbCwgMCwgc2l6ZW9mKCpwX21vZGVsKSApOworICAgIHBfbW9kZWwtPnR5cGUgPSBDVl9CR19NT0RFTF9GR0Q7CisgICAgcF9tb2RlbC0+cmVsZWFzZSA9IChDdlJlbGVhc2VCR1N0YXRNb2RlbClpY3ZSZWxlYXNlRkdEU3RhdE1vZGVsOworICAgIHBfbW9kZWwtPnVwZGF0ZSA9IChDdlVwZGF0ZUJHU3RhdE1vZGVsKWljdlVwZGF0ZUZHRFN0YXRNb2RlbDs7CisgICAgcF9tb2RlbC0+cGFyYW1zID0gcGFyYW1zOworCisgICAgLy8gSW5pdGlhbGl6ZSBzdG9yYWdlIHBvb2xzOgorICAgIHBpeGVsX2NvdW50ID0gZmlyc3RfZnJhbWUtPndpZHRoICogZmlyc3RfZnJhbWUtPmhlaWdodDsKKyAgICAKKyAgICBidWZfc2l6ZSA9IHBpeGVsX2NvdW50KnNpemVvZihwX21vZGVsLT5waXhlbF9zdGF0WzBdKTsKKyAgICBDVl9DQUxMKCBwX21vZGVsLT5waXhlbF9zdGF0ID0gKEN2QkdQaXhlbFN0YXQqKWN2QWxsb2MoYnVmX3NpemUpICk7CisgICAgbWVtc2V0KCBwX21vZGVsLT5waXhlbF9zdGF0LCAwLCBidWZfc2l6ZSApOworICAgIAorICAgIGJ1Zl9zaXplID0gcGl4ZWxfY291bnQqcGFyYW1zLk4yYypzaXplb2YocF9tb2RlbC0+cGl4ZWxfc3RhdFswXS5jdGFibGVbMF0pOworICAgIENWX0NBTEwoIHBfbW9kZWwtPnBpeGVsX3N0YXRbMF0uY3RhYmxlID0gKEN2QkdQaXhlbENTdGF0VGFibGUqKWN2QWxsb2MoYnVmX3NpemUpICk7CisgICAgbWVtc2V0KCBwX21vZGVsLT5waXhlbF9zdGF0WzBdLmN0YWJsZSwgMCwgYnVmX3NpemUgKTsKKworICAgIGJ1Zl9zaXplID0gcGl4ZWxfY291bnQqcGFyYW1zLk4yY2Mqc2l6ZW9mKHBfbW9kZWwtPnBpeGVsX3N0YXRbMF0uY2N0YWJsZVswXSk7CisgICAgQ1ZfQ0FMTCggcF9tb2RlbC0+cGl4ZWxfc3RhdFswXS5jY3RhYmxlID0gKEN2QkdQaXhlbENDU3RhdFRhYmxlKiljdkFsbG9jKGJ1Zl9zaXplKSApOworICAgIG1lbXNldCggcF9tb2RlbC0+cGl4ZWxfc3RhdFswXS5jY3RhYmxlLCAwLCBidWZfc2l6ZSApOworCisgICAgZm9yKCAgICAgaSA9IDAsIGsgPSAwOyBpIDwgZmlyc3RfZnJhbWUtPmhlaWdodDsgaSsrICkgeworICAgICAgICBmb3IoIGogPSAwOyAgICAgICAgaiA8IGZpcnN0X2ZyYW1lLT53aWR0aDsgIGorKywgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgcF9tb2RlbC0+cGl4ZWxfc3RhdFtrXS5jdGFibGUgPSBwX21vZGVsLT5waXhlbF9zdGF0WzBdLmN0YWJsZSArIGsqcGFyYW1zLk4yYzsKKyAgICAgICAgICAgIHBfbW9kZWwtPnBpeGVsX3N0YXRba10uY2N0YWJsZSA9IHBfbW9kZWwtPnBpeGVsX3N0YXRbMF0uY2N0YWJsZSArIGsqcGFyYW1zLk4yY2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbml0IHRlbXBvcmFyeSBpbWFnZXM6CisgICAgQ1ZfQ0FMTCggcF9tb2RlbC0+RnRkID0gY3ZDcmVhdGVJbWFnZShjdlNpemUoZmlyc3RfZnJhbWUtPndpZHRoLCBmaXJzdF9mcmFtZS0+aGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxKSk7CisgICAgQ1ZfQ0FMTCggcF9tb2RlbC0+RmJkID0gY3ZDcmVhdGVJbWFnZShjdlNpemUoZmlyc3RfZnJhbWUtPndpZHRoLCBmaXJzdF9mcmFtZS0+aGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxKSk7CisgICAgQ1ZfQ0FMTCggcF9tb2RlbC0+Zm9yZWdyb3VuZCA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKGZpcnN0X2ZyYW1lLT53aWR0aCwgZmlyc3RfZnJhbWUtPmhlaWdodCksIElQTF9ERVBUSF84VSwgMSkpOworCisgICAgQ1ZfQ0FMTCggcF9tb2RlbC0+YmFja2dyb3VuZCA9IGN2Q2xvbmVJbWFnZShmaXJzdF9mcmFtZSkpOworICAgIENWX0NBTEwoIHBfbW9kZWwtPnByZXZfZnJhbWUgPSBjdkNsb25lSW1hZ2UoZmlyc3RfZnJhbWUpKTsKKyAgICBDVl9DQUxMKCBwX21vZGVsLT5zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBDdkJHU3RhdE1vZGVsKiBiYXNlX3B0ciA9IChDdkJHU3RhdE1vZGVsKilwX21vZGVsOworCisgICAgICAgIGlmKCBwX21vZGVsICYmIHBfbW9kZWwtPnJlbGVhc2UgKQorICAgICAgICAgICAgcF9tb2RlbC0+cmVsZWFzZSggJmJhc2VfcHRyICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2RnJlZSggJnBfbW9kZWwgKTsKKyAgICAgICAgcF9tb2RlbCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIChDdkJHU3RhdE1vZGVsKilwX21vZGVsOworfQorCisKK3N0YXRpYyB2b2lkIENWX0NERUNMCitpY3ZSZWxlYXNlRkdEU3RhdE1vZGVsKCBDdkZHRFN0YXRNb2RlbCoqIF9tb2RlbCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWxlYXNlRkdEU3RhdE1vZGVsIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCAhX21vZGVsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggKl9tb2RlbCApCisgICAgeworICAgICAgICBDdkZHRFN0YXRNb2RlbCogbW9kZWwgPSAqX21vZGVsOworICAgICAgICBpZiggbW9kZWwtPnBpeGVsX3N0YXQgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZtb2RlbC0+cGl4ZWxfc3RhdFswXS5jdGFibGUgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJm1vZGVsLT5waXhlbF9zdGF0WzBdLmNjdGFibGUgKTsKKyAgICAgICAgICAgIGN2RnJlZSggJm1vZGVsLT5waXhlbF9zdGF0ICk7CisgICAgICAgIH0KKworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJm1vZGVsLT5GdGQgKTsKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZtb2RlbC0+RmJkICk7CisgICAgICAgIGN2UmVsZWFzZUltYWdlKCAmbW9kZWwtPmZvcmVncm91bmQgKTsKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZtb2RlbC0+YmFja2dyb3VuZCApOworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJm1vZGVsLT5wcmV2X2ZyYW1lICk7CisgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJm1vZGVsLT5zdG9yYWdlKTsKKworICAgICAgICBjdkZyZWUoIF9tb2RlbCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8vICBGdW5jdGlvbiBjdkNoYW5nZURldGVjdGlvbiBwZXJmb3JtcyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBGb3JlZ3JvdW5kIGRldGVjdGlvbiBhbGdvcml0aG0KKy8vIHBhcmFtZXRlcnM6CisvLyAgICAgIHByZXZfZnJhbWUgLQorLy8gICAgICBjdXJyX2ZyYW1lIC0KKy8vICAgICAgY2hhbmdlX21hc2sgLQorQ1ZfSU1QTCBpbnQKK2N2Q2hhbmdlRGV0ZWN0aW9uKCBJcGxJbWFnZSogIHByZXZfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqICBjdXJyX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiAgY2hhbmdlX21hc2sgKQoreworICAgIGludCBpLCBqLCBiLCB4LCB5LCB0aHJlczsKKyAgICBjb25zdCBpbnQgUElYRUxSQU5HRT0yNTY7CisKKyAgICBpZiggIXByZXZfZnJhbWUKKyAgICB8fCAgIWN1cnJfZnJhbWUKKyAgICB8fCAgIWNoYW5nZV9tYXNrCisgICAgfHwgICBwcmV2X2ZyYW1lLT5uQ2hhbm5lbHMgICE9IDMKKyAgICB8fCAgIGN1cnJfZnJhbWUtPm5DaGFubmVscyAgIT0gMworICAgIHx8ICAgY2hhbmdlX21hc2stPm5DaGFubmVscyAhPSAxCisgICAgfHwgICBwcmV2X2ZyYW1lLT5kZXB0aCAgIT0gSVBMX0RFUFRIXzhVCisgICAgfHwgICBjdXJyX2ZyYW1lLT5kZXB0aCAgIT0gSVBMX0RFUFRIXzhVCisgICAgfHwgICBjaGFuZ2VfbWFzay0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVCisgICAgfHwgICBwcmV2X2ZyYW1lLT53aWR0aCAgIT0gY3Vycl9mcmFtZS0+d2lkdGgKKyAgICB8fCAgIHByZXZfZnJhbWUtPmhlaWdodCAhPSBjdXJyX2ZyYW1lLT5oZWlnaHQKKyAgICB8fCAgIHByZXZfZnJhbWUtPndpZHRoICAhPSBjaGFuZ2VfbWFzay0+d2lkdGgKKyAgICB8fCAgIHByZXZfZnJhbWUtPmhlaWdodCAhPSBjaGFuZ2VfbWFzay0+aGVpZ2h0CisgICAgKXsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgY3ZaZXJvICggY2hhbmdlX21hc2sgKTsKKworICAgIC8vIEFsbCBvcGVyYXRpb25zIHBlciBjb2xvdXIKKyAgICBmb3IgKGI9MCA7IGI8cHJldl9mcmFtZS0+bkNoYW5uZWxzIDsgYisrKSB7CisKKyAgICAgICAgLy8gQ3JlYXRlIGhpc3RvZ3JhbToKKworICAgICAgICBsb25nIEhJU1RPR1JBTVtQSVhFTFJBTkdFXTsgCisgICAgICAgIGZvciAoaT0wIDsgaTxQSVhFTFJBTkdFOyBpKyspIEhJU1RPR1JBTVtpXT0wOworICAgICAgICAKKyAgICAgICAgZm9yICh5PTAgOyB5PGN1cnJfZnJhbWUtPmhlaWdodCA7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHJvd1N0YXJ0MSA9ICh1Y2hhciopY3Vycl9mcmFtZS0+aW1hZ2VEYXRhICsgeSAqIGN1cnJfZnJhbWUtPndpZHRoU3RlcCArIGI7CisgICAgICAgICAgICB1Y2hhciogcm93U3RhcnQyID0gKHVjaGFyKilwcmV2X2ZyYW1lLT5pbWFnZURhdGEgKyB5ICogcHJldl9mcmFtZS0+d2lkdGhTdGVwICsgYjsKKyAgICAgICAgICAgIGZvciAoeD0wIDsgeDxjdXJyX2ZyYW1lLT53aWR0aCA7IHgrKywgcm93U3RhcnQxKz1jdXJyX2ZyYW1lLT5uQ2hhbm5lbHMsIHJvd1N0YXJ0Mis9cHJldl9mcmFtZS0+bkNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgaW50IGRpZmYgPSBhYnMoIGludCgqcm93U3RhcnQxKSAtIGludCgqcm93U3RhcnQyKSApOworICAgICAgICAgICAgICAgIEhJU1RPR1JBTVtkaWZmXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZG91YmxlIHJlbGF0aXZlVmFyaWFuY2VbUElYRUxSQU5HRV07CisgICAgICAgIGZvciAoaT0wIDsgaTxQSVhFTFJBTkdFOyBpKyspIHJlbGF0aXZlVmFyaWFuY2VbaV09MDsKKworICAgICAgICBmb3IgKHRocmVzPVBJWEVMUkFOR0UtMjsgdGhyZXM+PTAgOyB0aHJlcy0tKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSXRlciAlZFxuIiwgdGhyZXMpOworICAgICAgICAgICAgZG91YmxlIHN1bT0wOworICAgICAgICAgICAgZG91YmxlIHNxc3VtPTA7CisgICAgICAgICAgICBpbnQgY291bnQ9MDsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJdGVyICVkIGVudGVyaW5nIGxvb3BcbiIsIHRocmVzKTsKKyAgICAgICAgICAgIGZvciAoaj10aHJlcyA7IGo8UElYRUxSQU5HRSA7IGorKykgeworICAgICAgICAgICAgICAgIHN1bSAgICs9IGRvdWJsZShqKSpkb3VibGUoSElTVE9HUkFNW2pdKTsKKyAgICAgICAgICAgICAgICBzcXN1bSArPSBkb3VibGUoaipqKSpkb3VibGUoSElTVE9HUkFNW2pdKTsKKyAgICAgICAgICAgICAgICBjb3VudCArPSBISVNUT0dSQU1bal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3VudCA9IGNvdW50ID09IDAgPyAxIDogY291bnQ7CisgICAgICAgICAgICAvLyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSXRlciAlZCBmaW5pc2hpbmcgbG9vcFxuIiwgdGhyZXMpOworICAgICAgICAgICAgZG91YmxlIG15ID0gc3VtIC8gY291bnQ7CisgICAgICAgICAgICBkb3VibGUgc2lnbWEgPSBzcXJ0KCBzcXN1bS9jb3VudCAtIG15Km15KTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJJdGVyICVkIHN1bT0lZyBzcXN1bT0lZyBjb3VudD0lZCBzaWdtYSA9ICVnXG4iLCB0aHJlcywgc3VtLCBzcXN1bSwgY291bnQsIHNpZ21hKTsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJXcml0aW5nIHRvICV4XG4iLCAmKHJlbGF0aXZlVmFyaWFuY2VbdGhyZXNdKSk7CisgICAgICAgICAgICByZWxhdGl2ZVZhcmlhbmNlW3RocmVzXSA9IHNpZ21hOworICAgICAgICAgICAgLy8gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkl0ZXIgJWQgZmluaXNoZWRcbiIsIHRocmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgbWF4aW11bToKKyAgICAgICAgdWNoYXIgYmVzdFRocmVzID0gMDsKKworICAgICAgICBkb3VibGUqIHBCZXN0VGhyZXMgPSBfY3ZfbWF4X2VsZW1lbnQocmVsYXRpdmVWYXJpYW5jZSwgcmVsYXRpdmVWYXJpYW5jZStQSVhFTFJBTkdFKTsKKyAgICAgICAgYmVzdFRocmVzID0gKHVjaGFyKSgqcEJlc3RUaHJlcyk7IGlmIChiZXN0VGhyZXMgPDEwKSBiZXN0VGhyZXM9MTA7CisKKyAgICAgICAgZm9yICh5PTAgOyB5PHByZXZfZnJhbWUtPmhlaWdodCA7IHkrKykKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHJvd1N0YXJ0MSA9ICh1Y2hhciopKGN1cnJfZnJhbWUtPmltYWdlRGF0YSkgKyB5ICogY3Vycl9mcmFtZS0+d2lkdGhTdGVwICsgYjsKKyAgICAgICAgICAgIHVjaGFyKiByb3dTdGFydDIgPSAodWNoYXIqKShwcmV2X2ZyYW1lLT5pbWFnZURhdGEpICsgeSAqIHByZXZfZnJhbWUtPndpZHRoU3RlcCArIGI7CisgICAgICAgICAgICB1Y2hhciogcm93U3RhcnQzID0gKHVjaGFyKikoY2hhbmdlX21hc2stPmltYWdlRGF0YSkgKyB5ICogY2hhbmdlX21hc2stPndpZHRoU3RlcDsKKyAgICAgICAgICAgIGZvciAoeCA9IDA7IHggPCBjdXJyX2ZyYW1lLT53aWR0aDsgeCsrLCByb3dTdGFydDErPWN1cnJfZnJhbWUtPm5DaGFubmVscywKKyAgICAgICAgICAgICAgICByb3dTdGFydDIrPXByZXZfZnJhbWUtPm5DaGFubmVscywgcm93U3RhcnQzKz1jaGFuZ2VfbWFzay0+bkNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgLy8gT1IgYmV0d2VlbiBkaWZmZXJlbnQgY29sb3IgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICBpbnQgZGlmZiA9IGFicyggaW50KCpyb3dTdGFydDEpIC0gaW50KCpyb3dTdGFydDIpICk7CisgICAgICAgICAgICAgICAgaWYgKCBkaWZmID4gYmVzdFRocmVzKQorICAgICAgICAgICAgICAgICAgICAqcm93U3RhcnQzIHw9MjU1OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDE7Cit9CisKKworI2RlZmluZSBNSU5fUFYgMUUtMTAKKworCisjZGVmaW5lIFZfQyhrLGwpIGN0YWJsZVtrXS52W2xdCisjZGVmaW5lIFBWX0MoaykgY3RhYmxlW2tdLlB2CisjZGVmaW5lIFBWQl9DKGspIGN0YWJsZVtrXS5QdmIKKyNkZWZpbmUgVl9DQyhrLGwpIGNjdGFibGVba10udltsXQorI2RlZmluZSBQVl9DQyhrKSBjY3RhYmxlW2tdLlB2CisjZGVmaW5lIFBWQl9DQyhrKSBjY3RhYmxlW2tdLlB2YgorCisKKy8vIEZ1bmN0aW9uIGN2VXBkYXRlRkdEU3RhdE1vZGVsIHVwZGF0ZXMgc3RhdGlzdGljYWwgbW9kZWwgYW5kIHJldHVybnMgbnVtYmVyIG9mIGZvcmVncm91bmQgcmVnaW9ucworLy8gcGFyYW1ldGVyczoKKy8vICAgICAgY3Vycl9mcmFtZSAgLSBjdXJyZW50IGZyYW1lIGZyb20gdmlkZW8gc2VxdWVuY2UKKy8vICAgICAgcF9tb2RlbCAgICAgLSBwb2ludGVyIHRvIEN2RkdEU3RhdE1vZGVsIHN0cnVjdHVyZQorc3RhdGljIGludCBDVl9DREVDTAoraWN2VXBkYXRlRkdEU3RhdE1vZGVsKCBJcGxJbWFnZSogY3Vycl9mcmFtZSwgQ3ZGR0RTdGF0TW9kZWwqICBtb2RlbCApCit7CisgICAgaW50ICAgICAgICAgICAgbWFza19zdGVwID0gbW9kZWwtPkZ0ZC0+d2lkdGhTdGVwOworICAgIEN2U2VxICAgICAgICAgKmZpcnN0X3NlcSA9IE5VTEwsICpwcmV2X3NlcSA9IE5VTEwsICpzZXEgPSBOVUxMOworICAgIElwbEltYWdlKiAgICAgIHByZXZfZnJhbWUgPSBtb2RlbC0+cHJldl9mcmFtZTsKKyAgICBpbnQgICAgICAgICAgICByZWdpb25fY291bnQgPSAwOworICAgIGludCAgICAgICAgICAgIEZHX3BpeGVsc19jb3VudCA9IDA7CisgICAgaW50ICAgICAgICAgICAgZGVsdGFDICA9IGN2Um91bmQobW9kZWwtPnBhcmFtcy5kZWx0YSAqIDI1NiAvIG1vZGVsLT5wYXJhbXMuTGMpOworICAgIGludCAgICAgICAgICAgIGRlbHRhQ0MgPSBjdlJvdW5kKG1vZGVsLT5wYXJhbXMuZGVsdGEgKiAyNTYgLyBtb2RlbC0+cGFyYW1zLkxjYyk7CisgICAgaW50ICAgICAgICAgICAgaSwgaiwgaywgbDsKKworICAgIC8vY2xlYXIgc3RvcmFnZXMKKyAgICBjdkNsZWFyTWVtU3RvcmFnZShtb2RlbC0+c3RvcmFnZSk7CisgICAgY3ZaZXJvKG1vZGVsLT5mb3JlZ3JvdW5kKTsKKworICAgIC8vIEZyb20gZm9yZWdyb3VuZCBwaXhlbCBjYW5kaWRhdGVzIHVzaW5nIGltYWdlIGRpZmZlcmVuY2luZworICAgIC8vIHdpdGggYWRhcHRpdmUgdGhyZXNob2xkaW5nLiAgVGhlIGFsZ29yaXRobSBpcyBmcm9tOgorICAgIC8vCisgICAgLy8gICAgVGhyZXNob2xkaW5nIGZvciBDaGFuZ2UgRGV0ZWN0aW9uCisgICAgLy8gICAgUGF1bCBMLiBSb3NpbiAxOTk4IDZwCisgICAgLy8gICAgaHR0cDovL3d3dy5jaXMudGVtcGxlLmVkdS9+bGF0ZWNraS9Db3Vyc2VzL0NJUzc1MC0wMy9QYXBlcnMvdGhyZXNoLWljY3YucGRmCisgICAgLy8KKyAgICBjdkNoYW5nZURldGVjdGlvbiggcHJldl9mcmFtZSwgY3Vycl9mcmFtZSwgbW9kZWwtPkZ0ZCApOworICAgIGN2Q2hhbmdlRGV0ZWN0aW9uKCBtb2RlbC0+YmFja2dyb3VuZCwgY3Vycl9mcmFtZSwgbW9kZWwtPkZiZCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IG1vZGVsLT5GdGQtPmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBtb2RlbC0+RnRkLT53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICgodWNoYXIqKW1vZGVsLT5GYmQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0gfHwgKCh1Y2hhciopbW9kZWwtPkZ0ZC0+aW1hZ2VEYXRhKVtpKm1hc2tfc3RlcCtqXSApCisgICAgICAgICAgICB7CisJICAgICAgICBmbG9hdCBQYiAgPSAwOworICAgICAgICAgICAgICAgIGZsb2F0IFB2ICA9IDA7CisgICAgICAgICAgICAgICAgZmxvYXQgUHZiID0gMDsKKworICAgICAgICAgICAgICAgIEN2QkdQaXhlbFN0YXQqIHN0YXQgPSBtb2RlbC0+cGl4ZWxfc3RhdCArIGkgKiBtb2RlbC0+RnRkLT53aWR0aCArIGo7CisKKyAgICAgICAgICAgICAgICBDdkJHUGl4ZWxDU3RhdFRhYmxlKiAgIGN0YWJsZSA9IHN0YXQtPmN0YWJsZTsKKyAgICAgICAgICAgICAgICBDdkJHUGl4ZWxDQ1N0YXRUYWJsZSogY2N0YWJsZSA9IHN0YXQtPmNjdGFibGU7CisgICAgCisgICAgICAgICAgICAgICAgdWNoYXIqIGN1cnJfZGF0YSA9ICh1Y2hhciopKGN1cnJfZnJhbWUtPmltYWdlRGF0YSkgKyBpKmN1cnJfZnJhbWUtPndpZHRoU3RlcCArIGoqMzsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHJldl9kYXRhID0gKHVjaGFyKikocHJldl9mcmFtZS0+aW1hZ2VEYXRhKSArIGkqcHJldl9mcmFtZS0+d2lkdGhTdGVwICsgaiozOworCisgICAgICAgICAgICAgICAgaW50IHZhbCA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBJcyBpdCBhIG1vdGlvbiBwaXhlbD8KKyAgICAgICAgICAgICAgICBpZiggKCh1Y2hhciopbW9kZWwtPkZ0ZC0+aW1hZ2VEYXRhKVtpKm1hc2tfc3RlcCtqXSApCisgICAgICAgICAgICAgICAgeworCQkgICAgaWYoICFzdGF0LT5pc190cmFpbmVkX2R5bl9tb2RlbCApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gMTsKKworCQkgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB3aXRoIHN0b3JlZCBDQ3QgdmVjdG9yczoKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDA7ICBQVl9DQyhrKSA+IG1vZGVsLT5wYXJhbXMuYWxwaGEyICYmIGsgPCBtb2RlbC0+cGFyYW1zLk4xY2M7ICBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYWJzKCBWX0NDKGssMCkgLSBwcmV2X2RhdGFbMF0pIDw9ICBkZWx0YUNDICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoIFZfQ0MoaywxKSAtIHByZXZfZGF0YVsxXSkgPD0gIGRlbHRhQ0MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyggVl9DQyhrLDIpIC0gcHJldl9kYXRhWzJdKSA8PSAgZGVsdGFDQyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKCBWX0NDKGssMykgLSBjdXJyX2RhdGFbMF0pIDw9ICBkZWx0YUNDICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoIFZfQ0Moayw0KSAtIGN1cnJfZGF0YVsxXSkgPD0gIGRlbHRhQ0MgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyggVl9DQyhrLDUpIC0gY3Vycl9kYXRhWzJdKSA8PSAgZGVsdGFDQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB2ICs9IFBWX0NDKGspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdmIgKz0gUFZCX0NDKGspOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFBiID0gc3RhdC0+UGJjYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAyICogUHZiICogUGIgPD0gUHYgKSB2YWwgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIHN0YXQtPmlzX3RyYWluZWRfc3RfbW9kZWwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSB3aXRoIHN0b3JlZCBDdCB2ZWN0b3JzOgorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyAgUFZfQyhrKSA+IG1vZGVsLT5wYXJhbXMuYWxwaGEyICYmIGsgPCBtb2RlbC0+cGFyYW1zLk4xYzsgIGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYWJzKCBWX0MoaywwKSAtIGN1cnJfZGF0YVswXSkgPD0gIGRlbHRhQyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYnMoIFZfQyhrLDEpIC0gY3Vycl9kYXRhWzFdKSA8PSAgZGVsdGFDICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFicyggVl9DKGssMikgLSBjdXJyX2RhdGFbMl0pIDw9ICBkZWx0YUMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB2ICs9IFBWX0Moayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHZiICs9IFBWQl9DKGspOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFBiID0gc3RhdC0+UGJjOworICAgICAgICAgICAgICAgICAgICBpZiggMiAqIFB2YiAqIFBiIDw9IFB2ICkgdmFsID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBVcGRhdGUgZm9yZWdyb3VuZDoKKyAgICAgICAgICAgICAgICAoKHVjaGFyKiltb2RlbC0+Zm9yZWdyb3VuZC0+aW1hZ2VEYXRhKVtpKm1hc2tfc3RlcCtqXSA9ICh1Y2hhcikodmFsKjI1NSk7CisgICAgICAgICAgICAgICAgRkdfcGl4ZWxzX2NvdW50ICs9IHZhbDsKKworICAgICAgICAgICAgfQkJLy8gZW5kIGlmKCBjaGFuZ2UgZGV0ZWN0aW9uLi4uCisgICAgICAgIH0JCS8vIGZvciBqLi4uCisgICAgfQkJCS8vIGZvciBpLi4uCisgICAgLy9lbmQgQkcvRkcgY2xhc3NpZmljYXRpb24KKworICAgIC8vIEZvcmVncm91bmQgc2VnbWVudGF0aW9uLgorICAgIC8vIFNtb290aCBmb3JlZ3JvdW5kIG1hcDoKKyAgICBpZiggbW9kZWwtPnBhcmFtcy5wZXJmb3JtX21vcnBoaW5nICl7CisgICAgICAgIGN2TW9ycGhvbG9neUV4KCBtb2RlbC0+Zm9yZWdyb3VuZCwgbW9kZWwtPmZvcmVncm91bmQsIDAsIDAsIENWX01PUF9PUEVOLCAgbW9kZWwtPnBhcmFtcy5wZXJmb3JtX21vcnBoaW5nICk7CisgICAgICAgIGN2TW9ycGhvbG9neUV4KCBtb2RlbC0+Zm9yZWdyb3VuZCwgbW9kZWwtPmZvcmVncm91bmQsIDAsIDAsIENWX01PUF9DTE9TRSwgbW9kZWwtPnBhcmFtcy5wZXJmb3JtX21vcnBoaW5nICk7CisgICAgfQorICAgCisgICAKKyAgICBpZiggbW9kZWwtPnBhcmFtcy5taW5BcmVhID4gMCB8fCBtb2RlbC0+cGFyYW1zLmlzX29ial93aXRob3V0X2hvbGVzICl7CisKKyAgICAgICAgLy8gRGlzY2FyZCB1bmRlci1zaXplIGZvcmVncm91bmQgcmVnaW9uczoKKwkvLworICAgICAgICBjdkZpbmRDb250b3VycyggbW9kZWwtPmZvcmVncm91bmQsIG1vZGVsLT5zdG9yYWdlLCAmZmlyc3Rfc2VxLCBzaXplb2YoQ3ZDb250b3VyKSwgQ1ZfUkVUUl9MSVNUICk7CisgICAgICAgIGZvciggc2VxID0gZmlyc3Rfc2VxOyBzZXE7IHNlcSA9IHNlcS0+aF9uZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZDb250b3VyKiBjbnQgPSAoQ3ZDb250b3VyKilzZXE7CisgICAgICAgICAgICBpZiggY250LT5yZWN0LndpZHRoICogY250LT5yZWN0LmhlaWdodCA8IG1vZGVsLT5wYXJhbXMubWluQXJlYSB8fCAKKyAgICAgICAgICAgICAgICAobW9kZWwtPnBhcmFtcy5pc19vYmpfd2l0aG91dF9ob2xlcyAmJiBDVl9JU19TRVFfSE9MRShzZXEpKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gRGVsZXRlIHVuZGVyLXNpemUgY29udG91cjoKKyAgICAgICAgICAgICAgICBwcmV2X3NlcSA9IHNlcS0+aF9wcmV2OworICAgICAgICAgICAgICAgIGlmKCBwcmV2X3NlcSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X3NlcS0+aF9uZXh0ID0gc2VxLT5oX25leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzZXEtPmhfbmV4dCApIHNlcS0+aF9uZXh0LT5oX3ByZXYgPSBwcmV2X3NlcTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3Rfc2VxID0gc2VxLT5oX25leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzZXEtPmhfbmV4dCApIHNlcS0+aF9uZXh0LT5oX3ByZXYgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZWdpb25fY291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgCisgICAgICAgIG1vZGVsLT5mb3JlZ3JvdW5kX3JlZ2lvbnMgPSBmaXJzdF9zZXE7CisgICAgICAgIGN2WmVybyhtb2RlbC0+Zm9yZWdyb3VuZCk7CisgICAgICAgIGN2RHJhd0NvbnRvdXJzKG1vZGVsLT5mb3JlZ3JvdW5kLCBmaXJzdF9zZXEsIENWX1JHQigwLCAwLCAyNTUpLCBDVl9SR0IoMCwgMCwgMjU1KSwgMTAsIC0xKTsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgbW9kZWwtPmZvcmVncm91bmRfcmVnaW9ucyA9IE5VTEw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgQUxMIEJHIHVwZGF0ZSBjb25kaXRpb246CisgICAgaWYoICgoZmxvYXQpRkdfcGl4ZWxzX2NvdW50Lyhtb2RlbC0+RnRkLT53aWR0aCptb2RlbC0+RnRkLT5oZWlnaHQpKSA+IENWX0JHRkdfRkdEX0JHX1VQREFURV9UUkVTSCApCisgICAgeworICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1vZGVsLT5GdGQtPmhlaWdodDsgaSsrICkKKyAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbW9kZWwtPkZ0ZC0+d2lkdGg7IGorKyApCisgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICBDdkJHUGl4ZWxTdGF0KiBzdGF0ID0gbW9kZWwtPnBpeGVsX3N0YXQgKyBpICogbW9kZWwtPkZ0ZC0+d2lkdGggKyBqOworICAgICAgICAgICAgICAgICBzdGF0LT5pc190cmFpbmVkX3N0X21vZGVsID0gc3RhdC0+aXNfdHJhaW5lZF9keW5fbW9kZWwgPSAxOworICAgICAgICAgICAgIH0KKyAgICB9CisKKworICAgIC8vIFVwZGF0ZSBiYWNrZ3JvdW5kIG1vZGVsOgorICAgIGZvciggaSA9IDA7IGkgPCBtb2RlbC0+RnRkLT5oZWlnaHQ7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgbW9kZWwtPkZ0ZC0+d2lkdGg7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2QkdQaXhlbFN0YXQqIHN0YXQgPSBtb2RlbC0+cGl4ZWxfc3RhdCArIGkgKiBtb2RlbC0+RnRkLT53aWR0aCArIGo7CisgICAgICAgICAgICBDdkJHUGl4ZWxDU3RhdFRhYmxlKiBjdGFibGUgPSBzdGF0LT5jdGFibGU7CisgICAgICAgICAgICBDdkJHUGl4ZWxDQ1N0YXRUYWJsZSogY2N0YWJsZSA9IHN0YXQtPmNjdGFibGU7CisKKyAgICAgICAgICAgIHVjaGFyICpjdXJyX2RhdGEgPSAodWNoYXIqKShjdXJyX2ZyYW1lLT5pbWFnZURhdGEpK2kqY3Vycl9mcmFtZS0+d2lkdGhTdGVwK2oqMzsKKyAgICAgICAgICAgIHVjaGFyICpwcmV2X2RhdGEgPSAodWNoYXIqKShwcmV2X2ZyYW1lLT5pbWFnZURhdGEpK2kqcHJldl9mcmFtZS0+d2lkdGhTdGVwK2oqMzsKKworICAgICAgICAgICAgaWYoICgodWNoYXIqKW1vZGVsLT5GdGQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0gfHwgIXN0YXQtPmlzX3RyYWluZWRfZHluX21vZGVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSA9IHN0YXQtPmlzX3RyYWluZWRfZHluX21vZGVsID8gbW9kZWwtPnBhcmFtcy5hbHBoYTIgOiBtb2RlbC0+cGFyYW1zLmFscGhhMzsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaWZmID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZGlzdCwgbWluX2Rpc3QgPSAyMTQ3NDgzNjQ3LCBpbmR4ID0gLTE7CisKKyAgICAgICAgICAgICAgICAvL3VwZGF0ZSBQYgorICAgICAgICAgICAgICAgIHN0YXQtPlBiY2MgKj0gKDEuZi1hbHBoYSk7CisgICAgICAgICAgICAgICAgaWYoICEoKHVjaGFyKiltb2RlbC0+Zm9yZWdyb3VuZC0+aW1hZ2VEYXRhKVtpKm1hc2tfc3RlcCtqXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGF0LT5QYmNjICs9IGFscGhhOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEZpbmQgYmVzdCBWaSBtYXRjaDoKKyAgICAgICAgICAgICAgICBmb3IoayA9IDA7IFBWX0NDKGspICYmIGsgPCBtb2RlbC0+cGFyYW1zLk4yY2M7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBFeHBvbmVudGlhbCBkZWNheSBvZiBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgUFZfQ0MoaykgICo9ICgxLWFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgUFZCX0NDKGspICo9ICgxLWFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIFBWX0NDKGspIDwgTUlOX1BWICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUFZfQ0MoaykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgUFZCX0NDKGspID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCAzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gYWJzKCBWX0NDKGssbCkgLSBwcmV2X2RhdGFbbF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwgPiBkZWx0YUNDICkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGFicyggVl9DQyhrLGwrMykgLSBjdXJyX2RhdGFbbF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwgPiBkZWx0YUNDKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBsID09IDMgJiYgZGlzdCA8IG1pbl9kaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgaW5keCA9IGs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgICAgIGlmKCBpbmR4IDwgMCApCisgICAgICAgICAgICAgICAgeyAgIC8vIFJlcGxhY2UgTjJ0aCBlbGVtIGluIHRoZSB0YWJsZSBieSBuZXcgZmVhdHVyZToKKyAgICAgICAgICAgICAgICAgICAgaW5keCA9IG1vZGVsLT5wYXJhbXMuTjJjYyAtIDE7CisgICAgICAgICAgICAgICAgICAgIFBWX0NDKGluZHgpID0gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgIFBWQl9DQyhpbmR4KSA9IGFscGhhOworICAgICAgICAgICAgICAgICAgICAvL3VkYXRlIFZ0CisgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCAzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWX0NDKGluZHgsbCkgPSBwcmV2X2RhdGFbbF07CisgICAgICAgICAgICAgICAgICAgICAgICBWX0NDKGluZHgsbCszKSA9IGN1cnJfZGF0YVtsXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAgIC8vIFVwZGF0ZToKKyAgICAgICAgICAgICAgICAgICAgUFZfQ0MoaW5keCkgKz0gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhKCh1Y2hhciopbW9kZWwtPmZvcmVncm91bmQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQVkJfQ0MoaW5keCkgKz0gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3JlLXNvcnQgQ0N0IHRhYmxlIGJ5IFB2CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGluZHg7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggUFZfQ0MoaykgPD0gUFZfQ0MoaW5keCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICBDdkJHUGl4ZWxDQ1N0YXRUYWJsZSB0bXAxLCB0bXAyID0gY2N0YWJsZVtpbmR4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IGs7IGwgPD0gaW5keDsgbCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAxID0gY2N0YWJsZVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjY3RhYmxlW2xdID0gdG1wMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXAyID0gdG1wMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBmbG9hdCBzdW0xPTAsIHN1bTI9MDsKKyAgICAgICAgICAgICAgICAvL2NoZWNrICJvbmNlLW9mZiIgY2hhbmdlcworICAgICAgICAgICAgICAgIGZvcihrID0gMDsgUFZfQ0MoaykgJiYgayA8IG1vZGVsLT5wYXJhbXMuTjFjYzsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bTEgKz0gUFZfQ0Moayk7CisgICAgICAgICAgICAgICAgICAgIHN1bTIgKz0gUFZCX0NDKGspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggc3VtMSA+IG1vZGVsLT5wYXJhbXMuVCApIHN0YXQtPmlzX3RyYWluZWRfZHluX21vZGVsID0gMTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkaWZmID0gc3VtMSAtIHN0YXQtPlBiY2MgKiBzdW0yOworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBzdGF0IHRhYmxlOgorICAgICAgICAgICAgICAgIGlmKCBkaWZmID4gIG1vZGVsLT5wYXJhbXMuVCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvL3ByaW50Zigib25jZSBvZmYgY2hhbmdlIGF0IG1vdGlvbiBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXcgQkcgZmVhdHVyZXMgYXJlIGRpc2NvdmVyZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgUFZfQ0MoaykgJiYgayA8IG1vZGVsLT5wYXJhbXMuTjFjYzsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUFZCX0NDKGspID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFZfQ0Moayktc3RhdC0+UGJjYypQVkJfQ0MoaykpLygxLXN0YXQtPlBiY2MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChzdGF0LT5QYmNjPD0xICYmIHN0YXQtPlBiY2M+PTApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSGFuZGxlICJzdGF0aW9uYXJ5IiBwaXhlbDoKKyAgICAgICAgICAgIGlmKCAhKCh1Y2hhciopbW9kZWwtPkZ0ZC0+aW1hZ2VEYXRhKVtpKm1hc2tfc3RlcCtqXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgYWxwaGEgPSBzdGF0LT5pc190cmFpbmVkX3N0X21vZGVsID8gbW9kZWwtPnBhcmFtcy5hbHBoYTIgOiBtb2RlbC0+cGFyYW1zLmFscGhhMzsKKyAgICAgICAgICAgICAgICBmbG9hdCBkaWZmID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgZGlzdCwgbWluX2Rpc3QgPSAyMTQ3NDgzNjQ3LCBpbmR4ID0gLTE7CisKKyAgICAgICAgICAgICAgICAvL3VwZGF0ZSBQYgorICAgICAgICAgICAgICAgIHN0YXQtPlBiYyAqPSAoMS5mLWFscGhhKTsKKyAgICAgICAgICAgICAgICBpZiggISgodWNoYXIqKW1vZGVsLT5mb3JlZ3JvdW5kLT5pbWFnZURhdGEpW2kqbWFza19zdGVwK2pdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQtPlBiYyArPSBhbHBoYTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL2ZpbmQgYmVzdCBWaSBtYXRjaAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtb2RlbC0+cGFyYW1zLk4yYzsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEV4cG9uZW50aWFsIGRlY2F5IG9mIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICBQVl9DKGspICo9ICgxLWFscGhhKTsKKyAgICAgICAgICAgICAgICAgICAgUFZCX0MoaykgKj0gKDEtYWxwaGEpOworICAgICAgICAgICAgICAgICAgICBpZiggUFZfQyhrKSA8IE1JTl9QViApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBWX0MoaykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgUFZCX0MoaykgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAgICAgICAgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgMzsgbCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IGFicyggVl9DKGssbCkgLSBjdXJyX2RhdGFbbF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwgPiBkZWx0YUMgKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBsID09IDMgJiYgZGlzdCA8IG1pbl9kaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgaW5keCA9IGs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggaW5keCA8IDAgKQorICAgICAgICAgICAgICAgIHsvL04ydGggZWxlbSBpbiB0aGUgdGFibGUgaXMgcmVwbGFjZWQgYnkgYSBuZXcgZmVhdHVyZXMKKyAgICAgICAgICAgICAgICAgICAgaW5keCA9IG1vZGVsLT5wYXJhbXMuTjJjIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgUFZfQyhpbmR4KSA9IGFscGhhOworICAgICAgICAgICAgICAgICAgICBQVkJfQyhpbmR4KSA9IGFscGhhOworICAgICAgICAgICAgICAgICAgICAvL3VkYXRlIFZ0CisgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCAzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBWX0MoaW5keCxsKSA9IGN1cnJfZGF0YVtsXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHsvL3VwZGF0ZQorICAgICAgICAgICAgICAgICAgICBQVl9DKGluZHgpICs9IGFscGhhOworICAgICAgICAgICAgICAgICAgICBpZiggISgodWNoYXIqKW1vZGVsLT5mb3JlZ3JvdW5kLT5pbWFnZURhdGEpW2kqbWFza19zdGVwK2pdICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgUFZCX0MoaW5keCkgKz0gYWxwaGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvL3JlLXNvcnQgQ3QgdGFibGUgYnkgUHYKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgaW5keDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBQVl9DKGspIDw9IFBWX0MoaW5keCkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3NoaWZ0IGVsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICBDdkJHUGl4ZWxDU3RhdFRhYmxlIHRtcDEsIHRtcDIgPSBjdGFibGVbaW5keF07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGwgPSBrOyBsIDw9IGluZHg7IGwrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wMSA9IGN0YWJsZVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdGFibGVbbF0gPSB0bXAyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcDIgPSB0bXAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBDaGVjayAib25jZS1vZmYiIGNoYW5nZXM6CisgICAgICAgICAgICAgICAgZmxvYXQgc3VtMT0wLCBzdW0yPTA7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgUFZfQyhrKSAmJiBrIDwgbW9kZWwtPnBhcmFtcy5OMWM7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdW0xICs9IFBWX0Moayk7CisgICAgICAgICAgICAgICAgICAgIHN1bTIgKz0gUFZCX0Moayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpZmYgPSBzdW0xIC0gc3RhdC0+UGJjICogc3VtMjsKKyAgICAgICAgICAgICAgICBpZiggc3VtMSA+IG1vZGVsLT5wYXJhbXMuVCApIHN0YXQtPmlzX3RyYWluZWRfc3RfbW9kZWwgPSAxOworCisgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHN0YXQgdGFibGU6CisgICAgICAgICAgICAgICAgaWYoIGRpZmYgPiAgbW9kZWwtPnBhcmFtcy5UICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJvbmNlIG9mZiBjaGFuZ2UgYXQgc3RhdCBtb2RlXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgLy9uZXcgQkcgZmVhdHVyZXMgYXJlIGRpc2NvdmVyZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgUFZfQyhrKSAmJiBrIDwgbW9kZWwtPnBhcmFtcy5OMWM7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBWQl9DKGspID0gKFBWX0Moayktc3RhdC0+UGJjKlBWQl9DKGspKS8oMS1zdGF0LT5QYmMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXQtPlBiYyA9IDEgLSBzdGF0LT5QYmM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQkJLy8gaWYgIShjaGFuZ2UgZGV0ZWN0aW9uKSBhdCBwaXhlbCAoaSxqKQorCisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlZmVyZW5jZSBCRyBpbWFnZToKKyAgICAgICAgICAgIGlmKCAhKCh1Y2hhciopbW9kZWwtPmZvcmVncm91bmQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIHB0ciA9ICgodWNoYXIqKW1vZGVsLT5iYWNrZ3JvdW5kLT5pbWFnZURhdGEpICsgaSptb2RlbC0+YmFja2dyb3VuZC0+d2lkdGhTdGVwK2oqMzsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggISgodWNoYXIqKW1vZGVsLT5GdGQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0gJiYKKyAgICAgICAgICAgICAgICAgICAgISgodWNoYXIqKW1vZGVsLT5GYmQtPmltYWdlRGF0YSlbaSptYXNrX3N0ZXAral0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgSUlSIGZpbHRlcjoKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IDM7IGwrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhID0gY3ZSb3VuZChwdHJbbF0qKDEgLSBtb2RlbC0+cGFyYW1zLmFscGhhMSkgKyBtb2RlbC0+cGFyYW1zLmFscGhhMSpjdXJyX2RhdGFbbF0pOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyW2xdID0gKHVjaGFyKWE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLygodWNoYXIqKW1vZGVsLT5iYWNrZ3JvdW5kLT5pbWFnZURhdGEpW2kqbW9kZWwtPmJhY2tncm91bmQtPndpZHRoU3RlcCtqKjMrbF0qPSgxIC0gbW9kZWwtPnBhcmFtcy5hbHBoYTEpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8oKHVjaGFyKiltb2RlbC0+YmFja2dyb3VuZC0+aW1hZ2VEYXRhKVtpKm1vZGVsLT5iYWNrZ3JvdW5kLT53aWR0aFN0ZXAraiozK2xdICs9IG1vZGVsLT5wYXJhbXMuYWxwaGExKmN1cnJfZGF0YVtsXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBCYWNrZ3JvdW5kIGNoYW5nZSBkZXRlY3RlZDoKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IDM7IGwrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vKCh1Y2hhciopbW9kZWwtPmJhY2tncm91bmQtPmltYWdlRGF0YSlbaSptb2RlbC0+YmFja2dyb3VuZC0+d2lkdGhTdGVwK2oqMytsXSA9IGN1cnJfZGF0YVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cltsXSA9IGN1cnJfZGF0YVtsXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQkJLy8gagorICAgIH0JCQkvLyBpCisKKyAgICAvLyBLZWVwIHByZXZpb3VzIGZyYW1lOgorICAgIGN2Q29weSggY3Vycl9mcmFtZSwgbW9kZWwtPnByZXZfZnJhbWUgKTsKKworICAgIHJldHVybiByZWdpb25fY291bnQ7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2YmdmZ19jb2RlYm9vay5jcHAgYi9jdmF1eC9zcmMvY3ZiZ2ZnX2NvZGVib29rLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWJhZGZmCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2YmdmZ19jb2RlYm9vay5jcHAKQEAgLTAsMCArMSwzNjIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCitDdkJHQ29kZUJvb2tNb2RlbCogY3ZDcmVhdGVCR0NvZGVCb29rTW9kZWwoKQoreworICAgIEN2QkdDb2RlQm9va01vZGVsKiBtb2RlbCA9IChDdkJHQ29kZUJvb2tNb2RlbCopY3ZBbGxvYyggc2l6ZW9mKCptb2RlbCkgKTsKKyAgICBtZW1zZXQoIG1vZGVsLCAwLCBzaXplb2YoKm1vZGVsKSApOworICAgIG1vZGVsLT5jYkJvdW5kc1swXSA9IG1vZGVsLT5jYkJvdW5kc1sxXSA9IG1vZGVsLT5jYkJvdW5kc1syXSA9IDEwOworICAgIG1vZGVsLT5tb2RNaW5bMF0gPSAzOworICAgIG1vZGVsLT5tb2RNYXhbMF0gPSAxMDsKKyAgICBtb2RlbC0+bW9kTWluWzFdID0gbW9kZWwtPm1vZE1pblsyXSA9IDE7CisgICAgbW9kZWwtPm1vZE1heFsxXSA9IG1vZGVsLT5tb2RNYXhbMl0gPSAxOworICAgIG1vZGVsLT5zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCk7CisKKyAgICByZXR1cm4gbW9kZWw7Cit9CisKK3ZvaWQgY3ZSZWxlYXNlQkdDb2RlQm9va01vZGVsKCBDdkJHQ29kZUJvb2tNb2RlbCoqIG1vZGVsICkKK3sKKyAgICBpZiggbW9kZWwgJiYgKm1vZGVsICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICYoKm1vZGVsKS0+c3RvcmFnZSApOworICAgICAgICBtZW1zZXQoICptb2RlbCwgMCwgc2l6ZW9mKCoqbW9kZWwpICk7CisgICAgICAgIGN2RnJlZSggbW9kZWwgKTsKKyAgICB9Cit9CisKK3N0YXRpYyB1Y2hhciBzYXRUYWI4dVs3NjhdOworI3VuZGVmIFNBVF84VQorI2RlZmluZSBTQVRfOFUoeCkgc2F0VGFiOHVbKHgpICsgMjU1XQorCitzdGF0aWMgdm9pZCBpY3ZJbml0U2F0VGFiKCkKK3sKKyAgICBzdGF0aWMgaW50IGluaXRpYWxpemVkID0gMDsKKyAgICBpZiggIWluaXRpYWxpemVkICkKKyAgICB7CisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgNzY4OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdiA9IGkgLSAyNTU7CisgICAgICAgICAgICBzYXRUYWI4dVtpXSA9ICh1Y2hhcikodiA8IDAgPyAwIDogdiA+IDI1NSA/IDI1NSA6IHYpOworICAgICAgICB9CisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKyAgICB9Cit9CisKKwordm9pZCBjdkJHQ29kZUJvb2tVcGRhdGUoIEN2QkdDb2RlQm9va01vZGVsKiBtb2RlbCwgY29uc3QgQ3ZBcnIqIF9pbWFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlJlY3Qgcm9pLCBjb25zdCBDdkFyciogX21hc2sgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZCR0NvZGVCb29rVXBkYXRlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKmltYWdlID0gY3ZHZXRNYXQoIF9pbWFnZSwgJnN0dWIgKTsKKyAgICBDdk1hdCBtc3R1YiwgKm1hc2sgPSBfbWFzayA/IGN2R2V0TWF0KCBfbWFzaywgJm1zdHViICkgOiAwOworICAgIGludCBpLCB4LCB5LCBUOworICAgIGludCBuYmxvY2tzOworICAgIHVjaGFyIGNiMCwgY2IxLCBjYjI7CisgICAgQ3ZCR0NvZGVCb29rRWxlbSogZnJlZUxpc3Q7CisKKyAgICBDVl9BU1NFUlQoIG1vZGVsICYmIENWX01BVF9UWVBFKGltYWdlLT50eXBlKSA9PSBDVl84VUMzICYmCisgICAgICAgICghbWFzayB8fCBDVl9JU19NQVNLX0FSUihtYXNrKSAmJiBDVl9BUkVfU0laRVNfRVEoaW1hZ2UsIG1hc2spKSApOworCisgICAgaWYoIHJvaS54ID09IDAgJiYgcm9pLnkgPT0gMCAmJiByb2kud2lkdGggPT0gMCAmJiByb2kuaGVpZ2h0ID09IDAgKQorICAgIHsKKyAgICAgICAgcm9pLndpZHRoID0gaW1hZ2UtPmNvbHM7CisgICAgICAgIHJvaS5oZWlnaHQgPSBpbWFnZS0+cm93czsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9BU1NFUlQoICh1bnNpZ25lZClyb2kueCA8ICh1bnNpZ25lZClpbWFnZS0+Y29scyAmJgorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClyb2kueSA8ICh1bnNpZ25lZClpbWFnZS0+cm93cyAmJgorICAgICAgICAgICAgICAgICAgIHJvaS53aWR0aCA+PSAwICYmIHJvaS5oZWlnaHQgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgIHJvaS54ICsgcm9pLndpZHRoIDw9IGltYWdlLT5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgcm9pLnkgKyByb2kuaGVpZ2h0IDw9IGltYWdlLT5yb3dzICk7CisKKyAgICBpZiggaW1hZ2UtPmNvbHMgIT0gbW9kZWwtPnNpemUud2lkdGggfHwgaW1hZ2UtPnJvd3MgIT0gbW9kZWwtPnNpemUuaGVpZ2h0ICkKKyAgICB7CisgICAgICAgIGN2Q2xlYXJNZW1TdG9yYWdlKCBtb2RlbC0+c3RvcmFnZSApOworICAgICAgICBtb2RlbC0+ZnJlZUxpc3QgPSAwOworICAgICAgICBjdkZyZWUoICZtb2RlbC0+Y2JtYXAgKTsKKyAgICAgICAgaW50IGJ1ZlN6ID0gaW1hZ2UtPmNvbHMqaW1hZ2UtPnJvd3Mqc2l6ZW9mKG1vZGVsLT5jYm1hcFswXSk7CisgICAgICAgIG1vZGVsLT5jYm1hcCA9IChDdkJHQ29kZUJvb2tFbGVtKiopY3ZBbGxvYyhidWZTeik7CisgICAgICAgIG1lbXNldCggbW9kZWwtPmNibWFwLCAwLCBidWZTeiApOworICAgICAgICBtb2RlbC0+c2l6ZSA9IGN2U2l6ZShpbWFnZS0+Y29scywgaW1hZ2UtPnJvd3MpOworICAgIH0KKworICAgIGljdkluaXRTYXRUYWIoKTsKKworICAgIGNiMCA9IG1vZGVsLT5jYkJvdW5kc1swXTsKKyAgICBjYjEgPSBtb2RlbC0+Y2JCb3VuZHNbMV07CisgICAgY2IyID0gbW9kZWwtPmNiQm91bmRzWzJdOworCisgICAgVCA9ICsrbW9kZWwtPnQ7CisgICAgZnJlZUxpc3QgPSBtb2RlbC0+ZnJlZUxpc3Q7CisgICAgbmJsb2NrcyA9IChpbnQpKChtb2RlbC0+c3RvcmFnZS0+YmxvY2tfc2l6ZSAtIHNpemVvZihDdk1lbUJsb2NrKSkvc2l6ZW9mKCpmcmVlTGlzdCkpOworICAgIG5ibG9ja3MgPSBNSU4oIG5ibG9ja3MsIDEwMjQgKTsKKyAgICBDVl9BU1NFUlQoIG5ibG9ja3MgPiAwICk7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgcm9pLmhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVjaGFyKiBwID0gaW1hZ2UtPmRhdGEucHRyICsgaW1hZ2UtPnN0ZXAqKHkgKyByb2kueSkgKyByb2kueCozOworICAgICAgICBjb25zdCB1Y2hhciogbSA9IG1hc2sgPyBtYXNrLT5kYXRhLnB0ciArIG1hc2stPnN0ZXAqKHkgKyByb2kueSkgKyByb2kueCA6IDA7CisgICAgICAgIEN2QkdDb2RlQm9va0VsZW0qKiBjYiA9IG1vZGVsLT5jYm1hcCArIGltYWdlLT5jb2xzKih5ICsgcm9pLnkpICsgcm9pLng7CisKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHJvaS53aWR0aDsgeCsrLCBwICs9IDMsIGNiKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJHQ29kZUJvb2tFbGVtICplLCAqZm91bmQgPSAwOworICAgICAgICAgICAgdWNoYXIgcDAsIHAxLCBwMiwgbDAsIGwxLCBsMiwgaDAsIGgxLCBoMjsKKyAgICAgICAgICAgIGludCBuZWdSdW47CisKKyAgICAgICAgICAgIGlmKCBtICYmIG1beF0gPT0gMCApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHAwID0gcFswXTsgcDEgPSBwWzFdOyBwMiA9IHBbMl07CisgICAgICAgICAgICBsMCA9IFNBVF84VShwMCAtIGNiMCk7IGwxID0gU0FUXzhVKHAxIC0gY2IxKTsgbDIgPSBTQVRfOFUocDIgLSBjYjIpOworICAgICAgICAgICAgaDAgPSBTQVRfOFUocDAgKyBjYjApOyBoMSA9IFNBVF84VShwMSArIGNiMSk7IGgyID0gU0FUXzhVKHAyICsgY2IyKTsKKworICAgICAgICAgICAgZm9yKCBlID0gKmNiOyBlICE9IDA7IGUgPSBlLT5uZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZS0+bGVhcm5NaW5bMF0gPD0gcDAgJiYgcDAgPD0gZS0+bGVhcm5NYXhbMF0gJiYKKyAgICAgICAgICAgICAgICAgICAgZS0+bGVhcm5NaW5bMV0gPD0gcDEgJiYgcDEgPD0gZS0+bGVhcm5NYXhbMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgZS0+bGVhcm5NaW5bMl0gPD0gcDIgJiYgcDIgPD0gZS0+bGVhcm5NYXhbMl0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZS0+dExhc3RVcGRhdGUgPSBUOworICAgICAgICAgICAgICAgICAgICBlLT5ib3hNaW5bMF0gPSBNSU4oZS0+Ym94TWluWzBdLCBwMCk7CisgICAgICAgICAgICAgICAgICAgIGUtPmJveE1heFswXSA9IE1BWChlLT5ib3hNYXhbMF0sIHAwKTsKKyAgICAgICAgICAgICAgICAgICAgZS0+Ym94TWluWzFdID0gTUlOKGUtPmJveE1pblsxXSwgcDEpOworICAgICAgICAgICAgICAgICAgICBlLT5ib3hNYXhbMV0gPSBNQVgoZS0+Ym94TWF4WzFdLCBwMSk7CisgICAgICAgICAgICAgICAgICAgIGUtPmJveE1pblsyXSA9IE1JTihlLT5ib3hNaW5bMl0sIHAyKTsKKyAgICAgICAgICAgICAgICAgICAgZS0+Ym94TWF4WzJdID0gTUFYKGUtPmJveE1heFsyXSwgcDIpOworCisgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gdXNlIFNBVF84VSBmb3IgdXBkYXRlZCBsZWFybk1pbltpXSAmIGxlYXJuTWF4W2ldIGhlcmUsCisgICAgICAgICAgICAgICAgICAgIC8vIGFzIHRoZSBib3VuZGluZyBsaSAmIGhpIGFyZSBhbHJlYWR5IHdpdGhpbiAwLi4yNTUuCisgICAgICAgICAgICAgICAgICAgIGlmKCBlLT5sZWFybk1pblswXSA+IGwwICkgZS0+bGVhcm5NaW5bMF0tLTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGUtPmxlYXJuTWF4WzBdIDwgaDAgKSBlLT5sZWFybk1heFswXSsrOworICAgICAgICAgICAgICAgICAgICBpZiggZS0+bGVhcm5NaW5bMV0gPiBsMSApIGUtPmxlYXJuTWluWzFdLS07CisgICAgICAgICAgICAgICAgICAgIGlmKCBlLT5sZWFybk1heFsxXSA8IGgxICkgZS0+bGVhcm5NYXhbMV0rKzsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGUtPmxlYXJuTWluWzJdID4gbDIgKSBlLT5sZWFybk1pblsyXS0tOworICAgICAgICAgICAgICAgICAgICBpZiggZS0+bGVhcm5NYXhbMl0gPCBoMiApIGUtPmxlYXJuTWF4WzJdKys7CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmVnUnVuID0gVCAtIGUtPnRMYXN0VXBkYXRlOworICAgICAgICAgICAgICAgIGUtPnN0YWxlID0gTUFYKCBlLT5zdGFsZSwgbmVnUnVuICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBlICE9IDA7IGUgPSBlLT5uZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZWdSdW4gPSBUIC0gZS0+dExhc3RVcGRhdGU7CisgICAgICAgICAgICAgICAgZS0+c3RhbGUgPSBNQVgoIGUtPnN0YWxlLCBuZWdSdW4gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFmb3VuZCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFmcmVlTGlzdCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcmVlTGlzdCA9IChDdkJHQ29kZUJvb2tFbGVtKiljdk1lbVN0b3JhZ2VBbGxvYyhtb2RlbC0+c3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ibG9ja3Mqc2l6ZW9mKCpmcmVlTGlzdCkpOworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbmJsb2Nrcy0xOyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJlZUxpc3RbaV0ubmV4dCA9ICZmcmVlTGlzdFtpKzFdOworICAgICAgICAgICAgICAgICAgICBmcmVlTGlzdFtuYmxvY2tzLTFdLm5leHQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlID0gZnJlZUxpc3Q7CisgICAgICAgICAgICAgICAgZnJlZUxpc3QgPSBmcmVlTGlzdC0+bmV4dDsKKworICAgICAgICAgICAgICAgIGUtPmxlYXJuTWluWzBdID0gbDA7IGUtPmxlYXJuTWF4WzBdID0gaDA7CisgICAgICAgICAgICAgICAgZS0+bGVhcm5NaW5bMV0gPSBsMTsgZS0+bGVhcm5NYXhbMV0gPSBoMTsKKyAgICAgICAgICAgICAgICBlLT5sZWFybk1pblsyXSA9IGwyOyBlLT5sZWFybk1heFsyXSA9IGgyOworICAgICAgICAgICAgICAgIGUtPmJveE1pblswXSA9IGUtPmJveE1heFswXSA9IHAwOworICAgICAgICAgICAgICAgIGUtPmJveE1pblsxXSA9IGUtPmJveE1heFsxXSA9IHAxOworICAgICAgICAgICAgICAgIGUtPmJveE1pblsyXSA9IGUtPmJveE1heFsyXSA9IHAyOworICAgICAgICAgICAgICAgIGUtPnRMYXN0VXBkYXRlID0gVDsKKyAgICAgICAgICAgICAgICBlLT5zdGFsZSA9IDA7CisgICAgICAgICAgICAgICAgZS0+bmV4dCA9ICpjYjsKKyAgICAgICAgICAgICAgICAqY2IgPSBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbW9kZWwtPmZyZWVMaXN0ID0gZnJlZUxpc3Q7CisKKyAgICBfX0VORF9fOworfQorCisKK2ludCBjdkJHQ29kZUJvb2tEaWZmKCBjb25zdCBDdkJHQ29kZUJvb2tNb2RlbCogbW9kZWwsIGNvbnN0IEN2QXJyKiBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIF9mZ21hc2ssIEN2UmVjdCByb2kgKQoreworICAgIGludCBtYXNrQ291bnQgPSAtMTsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2QkdDb2RlQm9va0RpZmYiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqaW1hZ2UgPSBjdkdldE1hdCggX2ltYWdlLCAmc3R1YiApOworICAgIEN2TWF0IG1zdHViLCAqbWFzayA9IGN2R2V0TWF0KCBfZmdtYXNrLCAmbXN0dWIgKTsKKyAgICBpbnQgeCwgeTsKKyAgICB1Y2hhciBtMCwgbTEsIG0yLCBNMCwgTTEsIE0yOworCisgICAgQ1ZfQVNTRVJUKCBtb2RlbCAmJiBDVl9NQVRfVFlQRShpbWFnZS0+dHlwZSkgPT0gQ1ZfOFVDMyAmJgorICAgICAgICBpbWFnZS0+Y29scyA9PSBtb2RlbC0+c2l6ZS53aWR0aCAmJiBpbWFnZS0+cm93cyA9PSBtb2RlbC0+c2l6ZS5oZWlnaHQgJiYKKyAgICAgICAgQ1ZfSVNfTUFTS19BUlIobWFzaykgJiYgQ1ZfQVJFX1NJWkVTX0VRKGltYWdlLCBtYXNrKSApOworCisgICAgaWYoIHJvaS54ID09IDAgJiYgcm9pLnkgPT0gMCAmJiByb2kud2lkdGggPT0gMCAmJiByb2kuaGVpZ2h0ID09IDAgKQorICAgIHsKKyAgICAgICAgcm9pLndpZHRoID0gaW1hZ2UtPmNvbHM7CisgICAgICAgIHJvaS5oZWlnaHQgPSBpbWFnZS0+cm93czsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9BU1NFUlQoICh1bnNpZ25lZClyb2kueCA8ICh1bnNpZ25lZClpbWFnZS0+Y29scyAmJgorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClyb2kueSA8ICh1bnNpZ25lZClpbWFnZS0+cm93cyAmJgorICAgICAgICAgICAgICAgICAgIHJvaS53aWR0aCA+PSAwICYmIHJvaS5oZWlnaHQgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgIHJvaS54ICsgcm9pLndpZHRoIDw9IGltYWdlLT5jb2xzICYmCisgICAgICAgICAgICAgICAgICAgcm9pLnkgKyByb2kuaGVpZ2h0IDw9IGltYWdlLT5yb3dzICk7CisKKyAgICBtMCA9IG1vZGVsLT5tb2RNaW5bMF07IE0wID0gbW9kZWwtPm1vZE1heFswXTsKKyAgICBtMSA9IG1vZGVsLT5tb2RNaW5bMV07IE0xID0gbW9kZWwtPm1vZE1heFsxXTsKKyAgICBtMiA9IG1vZGVsLT5tb2RNaW5bMl07IE0yID0gbW9kZWwtPm1vZE1heFsyXTsKKworICAgIG1hc2tDb3VudCA9IHJvaS5oZWlnaHQqcm9pLndpZHRoOworICAgIGZvciggeSA9IDA7IHkgPCByb2kuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIHAgPSBpbWFnZS0+ZGF0YS5wdHIgKyBpbWFnZS0+c3RlcCooeSArIHJvaS55KSArIHJvaS54KjM7CisgICAgICAgIHVjaGFyKiBtID0gbWFzay0+ZGF0YS5wdHIgKyBtYXNrLT5zdGVwKih5ICsgcm9pLnkpICsgcm9pLng7CisgICAgICAgIEN2QkdDb2RlQm9va0VsZW0qKiBjYiA9IG1vZGVsLT5jYm1hcCArIGltYWdlLT5jb2xzKih5ICsgcm9pLnkpICsgcm9pLng7CisKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHJvaS53aWR0aDsgeCsrLCBwICs9IDMsIGNiKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkJHQ29kZUJvb2tFbGVtICplOworICAgICAgICAgICAgdWNoYXIgcDAgPSBwWzBdLCBwMSA9IHBbMV0sIHAyID0gcFsyXTsKKyAgICAgICAgICAgIGludCBsMCA9IHAwICsgbTAsIGwxID0gcDEgKyBtMSwgbDIgPSBwMiArIG0yOworICAgICAgICAgICAgaW50IGgwID0gcDAgLSBNMCwgaDEgPSBwMSAtIE0xLCBoMiA9IHAyIC0gTTI7CisgICAgICAgICAgICBtW3hdID0gKHVjaGFyKTI1NTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBlID0gKmNiOyBlICE9IDA7IGUgPSBlLT5uZXh0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZS0+Ym94TWluWzBdIDw9IGwwICYmIGgwIDw9IGUtPmJveE1heFswXSAmJgorICAgICAgICAgICAgICAgICAgICBlLT5ib3hNaW5bMV0gPD0gbDEgJiYgaDEgPD0gZS0+Ym94TWF4WzFdICYmCisgICAgICAgICAgICAgICAgICAgIGUtPmJveE1pblsyXSA8PSBsMiAmJiBoMiA8PSBlLT5ib3hNYXhbMl0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbVt4XSA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1hc2tDb3VudC0tOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG1hc2tDb3VudDsKK30KKwordm9pZCBjdkJHQ29kZUJvb2tDbGVhclN0YWxlKCBDdkJHQ29kZUJvb2tNb2RlbCogbW9kZWwsIGludCBzdGFsZVRocmVzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSZWN0IHJvaSwgY29uc3QgQ3ZBcnIqIF9tYXNrICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2QkdDb2RlQm9va0NsZWFyU3RhbGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBtc3R1YiwgKm1hc2sgPSBfbWFzayA/IGN2R2V0TWF0KCBfbWFzaywgJm1zdHViICkgOiAwOworICAgIGludCB4LCB5LCBUOworICAgIEN2QkdDb2RlQm9va0VsZW0qIGZyZWVMaXN0OworCisgICAgQ1ZfQVNTRVJUKCBtb2RlbCAmJiAoIW1hc2sgfHwgQ1ZfSVNfTUFTS19BUlIobWFzaykgJiYKKyAgICAgICAgbWFzay0+Y29scyA9PSBtb2RlbC0+c2l6ZS53aWR0aCAmJiBtYXNrLT5yb3dzID09IG1vZGVsLT5zaXplLmhlaWdodCkgKTsKKworICAgIGlmKCByb2kueCA9PSAwICYmIHJvaS55ID09IDAgJiYgcm9pLndpZHRoID09IDAgJiYgcm9pLmhlaWdodCA9PSAwICkKKyAgICB7CisgICAgICAgIHJvaS53aWR0aCA9IG1vZGVsLT5zaXplLndpZHRoOworICAgICAgICByb2kuaGVpZ2h0ID0gbW9kZWwtPnNpemUuaGVpZ2h0OworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0FTU0VSVCggKHVuc2lnbmVkKXJvaS54IDwgKHVuc2lnbmVkKW1hc2stPmNvbHMgJiYKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpcm9pLnkgPCAodW5zaWduZWQpbWFzay0+cm93cyAmJgorICAgICAgICAgICAgICAgICAgIHJvaS53aWR0aCA+PSAwICYmIHJvaS5oZWlnaHQgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgIHJvaS54ICsgcm9pLndpZHRoIDw9IG1hc2stPmNvbHMgJiYKKyAgICAgICAgICAgICAgICAgICByb2kueSArIHJvaS5oZWlnaHQgPD0gbWFzay0+cm93cyApOworCisgICAgaWN2SW5pdFNhdFRhYigpOworICAgIGZyZWVMaXN0ID0gbW9kZWwtPmZyZWVMaXN0OworICAgIFQgPSBtb2RlbC0+dDsKKworICAgIGZvciggeSA9IDA7IHkgPCByb2kuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIG0gPSBtYXNrID8gbWFzay0+ZGF0YS5wdHIgKyBtYXNrLT5zdGVwKih5ICsgcm9pLnkpICsgcm9pLnggOiAwOworICAgICAgICBDdkJHQ29kZUJvb2tFbGVtKiogY2IgPSBtb2RlbC0+Y2JtYXAgKyBtb2RlbC0+c2l6ZS53aWR0aCooeSArIHJvaS55KSArIHJvaS54OworCisgICAgICAgIGZvciggeCA9IDA7IHggPCByb2kud2lkdGg7IHgrKywgY2IrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2QkdDb2RlQm9va0VsZW0gKmUsIGZpcnN0LCAqcHJldiA9ICZmaXJzdDsKKworICAgICAgICAgICAgaWYoIG0gJiYgbVt4XSA9PSAwICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgZm9yKCBmaXJzdC5uZXh0ID0gZSA9ICpjYjsgZSAhPSAwOyBlID0gcHJldi0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGUtPnN0YWxlID4gc3RhbGVUaHJlc2ggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldi0+bmV4dCA9IGUtPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGUtPm5leHQgPSBmcmVlTGlzdDsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUxpc3QgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlLT5zdGFsZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGUtPnRMYXN0VXBkYXRlID0gVDsKKyAgICAgICAgICAgICAgICAgICAgcHJldiA9IGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqY2IgPSBmaXJzdC5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgbW9kZWwtPmZyZWVMaXN0ID0gZnJlZUxpc3Q7CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2YmdmZ19jb21tb24uY3BwIGIvY3ZhdXgvc3JjL2N2YmdmZ19jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODU4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZiZ2ZnX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxMjQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCisvLyAgRnVuY3Rpb24gY3ZSZWZpbmVGb3JlZ3JvdW5kTWFza0J5U2VnbSBwcmVmb3JtcyBGRyBwb3N0LXByb2Nlc3NpbmcgYmFzZWQgb24gc2VnbWVudGF0aW9uCisvLyAgICAoYWxsIHBpeGVscyBvZiB0aGUgc2VnbWVudCB3aWxsIGJlIGNsYXNzaWZpZWQgYXMgRkcgaWYgbWFqb3JpdHkgb2YgcGl4ZWxzIG9mIHRoZSByZWdpb24gYXJlIEZHKS4KKy8vIHBhcmFtZXRlcnM6CisvLyAgICAgIHNlZ21lbnRzIC0gcG9pbnRlciB0byByZXN1bHQgb2Ygc2VnbWVudGF0aW9uIChmb3IgZXhhbXBsZSBNZWFuU2hpZnRTZWdtZW50YXRpb24pCisvLyAgICAgIGJnX21vZGVsIC0gcG9pbnRlciB0byBDdkJHU3RhdE1vZGVsIHN0cnVjdHVyZQorQ1ZfSU1QTCB2b2lkIGN2UmVmaW5lRm9yZWdyb3VuZE1hc2tCeVNlZ20oIEN2U2VxKiBzZWdtZW50cywgQ3ZCR1N0YXRNb2RlbCogIGJnX21vZGVsICkKK3sKKwlJcGxJbWFnZSogdG1wX2ltYWdlID0gY3ZDcmVhdGVJbWFnZShjdlNpemUoYmdfbW9kZWwtPmZvcmVncm91bmQtPndpZHRoLGJnX21vZGVsLT5mb3JlZ3JvdW5kLT5oZWlnaHQpLAorCQkJCQkJCUlQTF9ERVBUSF84VSwgMSk7CisJZm9yKCA7IHNlZ21lbnRzOyBzZWdtZW50cyA9ICgoQ3ZTZXEqKXNlZ21lbnRzKS0+aF9uZXh0ICkKKwl7CisJCUN2U2VxIHNlcSA9ICpzZWdtZW50czsKKwkJc2VxLnZfbmV4dCA9IHNlcS5oX25leHQgPSBOVUxMOworCQljdlplcm8odG1wX2ltYWdlKTsKKwkJY3ZEcmF3Q29udG91cnMoIHRtcF9pbWFnZSwgJnNlcSwgQ1ZfUkdCKDAsIDAsIDI1NSksIENWX1JHQigwLCAwLCAyNTUpLCAxMCwgLTEpOworCQlpbnQgbnVtMSA9IGN2Q291bnROb25aZXJvKHRtcF9pbWFnZSk7CisgICAgICAgIGN2QW5kKHRtcF9pbWFnZSwgYmdfbW9kZWwtPmZvcmVncm91bmQsIHRtcF9pbWFnZSk7CisJCWludCBudW0yID0gY3ZDb3VudE5vblplcm8odG1wX2ltYWdlKTsKKwkJaWYoIG51bTIgPiBudW0xKjAuNSApCisJCQljdkRyYXdDb250b3VycyggYmdfbW9kZWwtPmZvcmVncm91bmQsICZzZXEsIENWX1JHQigwLCAwLCAyNTUpLCBDVl9SR0IoMCwgMCwgMjU1KSwgMTAsIC0xKTsKKwkJZWxzZQorCQkJY3ZEcmF3Q29udG91cnMoIGJnX21vZGVsLT5mb3JlZ3JvdW5kLCAmc2VxLCBDVl9SR0IoMCwgMCwgMCksIENWX1JHQigwLCAwLCAwKSwgMTAsIC0xKTsKKwl9CisJY3ZSZWxlYXNlSW1hZ2UoJnRtcF9pbWFnZSk7Cit9CisKKworCitDVl9JTVBMIEN2U2VxKgorY3ZTZWdtZW50RkdNYXNrKCBDdkFyciogX21hc2ssIGludCBwb2x5MUh1bGwwLCBmbG9hdCBwZXJpbVNjYWxlLAorICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIEN2UG9pbnQgb2Zmc2V0ICkKK3sKKyAgICBDdk1hdCBtc3R1YiwgKm1hc2sgPSBjdkdldE1hdCggX21hc2ssICZtc3R1YiApOworICAgIEN2TWVtU3RvcmFnZSogdGVtcFN0b3JhZ2UgPSBzdG9yYWdlID8gc3RvcmFnZSA6IGN2Q3JlYXRlTWVtU3RvcmFnZSgpOworICAgIEN2U2VxICpjb250b3VycywgKmM7CisgICAgaW50IG5Db250b3VycyA9IDA7CisgICAgQ3ZDb250b3VyU2Nhbm5lciBzY2FubmVyOworICAgIAorICAgIC8vIGNsZWFuIHVwIHJhdyBtYXNrCisgICAgY3ZNb3JwaG9sb2d5RXgoIG1hc2ssIG1hc2ssIDAsIDAsIENWX01PUF9PUEVOLCAxICk7CisgICAgY3ZNb3JwaG9sb2d5RXgoIG1hc2ssIG1hc2ssIDAsIDAsIENWX01PUF9DTE9TRSwgMSApOworCisgICAgLy8gZmluZCBjb250b3VycyBhcm91bmQgb25seSBiaWdnZXIgcmVnaW9ucworICAgIHNjYW5uZXIgPSBjdlN0YXJ0RmluZENvbnRvdXJzKCBtYXNrLCB0ZW1wU3RvcmFnZSwKKyAgICAgICAgc2l6ZW9mKEN2Q29udG91ciksIENWX1JFVFJfRVhURVJOQUwsIENWX0NIQUlOX0FQUFJPWF9TSU1QTEUsIG9mZnNldCApOworICAgIAorICAgIHdoaWxlKCAoYyA9IGN2RmluZE5leHRDb250b3VyKCBzY2FubmVyICkpICE9IDAgKSAKKyAgICB7CisgICAgICAgIGRvdWJsZSBsZW4gPSBjdkNvbnRvdXJQZXJpbWV0ZXIoIGMgKTsKKyAgICAgICAgZG91YmxlIHEgPSAobWFzay0+cm93cyArIG1hc2stPmNvbHMpL3BlcmltU2NhbGU7IC8vIGNhbGN1bGF0ZSBwZXJpbWV0ZXIgbGVuIHRocmVzaG9sZAorICAgICAgICBpZiggbGVuIDwgcSApIC8vR2V0IHJpZCBvZiBibG9iIGlmIGl0J3MgcGVyaW1ldGVyIGlzIHRvbyBzbWFsbAorICAgICAgICAgICAgY3ZTdWJzdGl0dXRlQ29udG91ciggc2Nhbm5lciwgMCApOworICAgICAgICBlbHNlIC8vU21vb3RoIGl0J3MgZWRnZXMgaWYgaXQncyBsYXJnZSBlbm91Z2gKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTZXEqIG5ld0M7CisgICAgICAgICAgICBpZiggcG9seTFIdWxsMCApIC8vUG9seWdvbmFsIGFwcHJveGltYXRpb24gb2YgdGhlIHNlZ21lbnRhdGlvbiAKKyAgICAgICAgICAgICAgICBuZXdDID0gY3ZBcHByb3hQb2x5KCBjLCBzaXplb2YoQ3ZDb250b3VyKSwgdGVtcFN0b3JhZ2UsIENWX1BPTFlfQVBQUk9YX0RQLCAyLCAwICk7IAorICAgICAgICAgICAgZWxzZSAvL0NvbnZleCBIdWxsIG9mIHRoZSBzZWdtZW50YXRpb24KKyAgICAgICAgICAgICAgICBuZXdDID0gY3ZDb252ZXhIdWxsMiggYywgdGVtcFN0b3JhZ2UsIENWX0NMT0NLV0lTRSwgMSApOworICAgICAgICAgICAgY3ZTdWJzdGl0dXRlQ29udG91ciggc2Nhbm5lciwgbmV3QyApOworICAgICAgICAgICAgbkNvbnRvdXJzKys7CisgICAgICAgIH0KKyAgICB9CisgICAgY29udG91cnMgPSBjdkVuZEZpbmRDb250b3VycyggJnNjYW5uZXIgKTsKKworICAgIC8vIHBhaW50IHRoZSBmb3VuZCByZWdpb25zIGJhY2sgaW50byB0aGUgaW1hZ2UKKyAgICBjdlplcm8oIG1hc2sgKTsKKyAgICBmb3IoIGM9Y29udG91cnM7IGMgIT0gMDsgYyA9IGMtPmhfbmV4dCApIAorICAgICAgICBjdkRyYXdDb250b3VycyggbWFzaywgYywgY3ZTY2FsYXJBbGwoMjU1KSwgY3ZTY2FsYXJBbGwoMCksIC0xLCBDVl9GSUxMRUQsIDgsCisgICAgICAgICAgICBjdlBvaW50KC1vZmZzZXQueCwtb2Zmc2V0LnkpKTsKKworICAgIGlmKCB0ZW1wU3RvcmFnZSAhPSBzdG9yYWdlICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZ0ZW1wU3RvcmFnZSApOworICAgICAgICBjb250b3VycyA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIGNvbnRvdXJzOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2YmdmZ19nYXVzc21peC5jcHAgYi9jdmF1eC9zcmMvY3ZiZ2ZnX2dhdXNzbWl4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDY1NWNkCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2YmdmZ19nYXVzc21peC5jcHAKQEAgLTAsMCArMSw1OTcgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworCisvLyBUaGlzIGlzIGJhc2VkIG9uIHRoZSAiQW4gSW1wcm92ZWQgQWRhcHRpdmUgQmFja2dyb3VuZCBNaXh0dXJlIE1vZGVsIGZvcgorLy8gUmVhbC10aW1lIFRyYWNraW5nIHdpdGggU2hhZG93IERldGVjdGlvbiIgYnkgUC4gS2Fld1RyYUt1bFBvbmcgYW5kIFIuIEJvd2RlbgorLy8gaHR0cDovL3BlcnNvbmFsLmVlLnN1cnJleS5hYy51ay9QZXJzb25hbC9SLkJvd2Rlbi9wdWJsaWNhdGlvbnMvYXZiczAxL2F2YnMwMS5wZGYKKy8vCisvLyBUaGUgd2luZG93aW5nIG1ldGhvZCBpcyB1c2VkLCBidXQgbm90IHRoZSBzaGFkb3cgZGV0ZWN0aW9uLiBJIG1ha2Ugc29tZSBvZiBteQorLy8gb3duIG1vZGlmaWNhdGlvbnMgd2hpY2ggbWFrZSBtb3JlIHNlbnNlLiBUaGVyZSBhcmUgc29tZSBlcnJvcnMgaW4gc29tZSBvZiB0aGVpcgorLy8gZXF1YXRpb25zLgorLy8KKy8vSXBsSW1hZ2UgdmFsdWVzIG9mIGltYWdlIHRoYXQgYXJlIHVzZWZ1bAorLy9pbnQgIG5TaXplOyAgICAgICAgIC8qIHNpemVvZihJcGxJbWFnZSkgKi8KKy8vaW50ICBkZXB0aDsgICAgICAgICAvKiBwaXhlbCBkZXB0aCBpbiBiaXRzOiBJUExfREVQVEhfOFUgLi4uKi8KKy8vaW50ICBuQ2hhbm5lbHM7ICAgICAvKiBPcGVuQ1YgZnVuY3Rpb25zIHN1cHBvcnQgMSwyLDMgb3IgNCBjaGFubmVscyAqLworLy9pbnQgIHdpZHRoOyAgICAgICAgIC8qIGltYWdlIHdpZHRoIGluIHBpeGVscyAqLworLy9pbnQgIGhlaWdodDsgICAgICAgIC8qIGltYWdlIGhlaWdodCBpbiBwaXhlbHMgKi8KKy8vaW50ICBpbWFnZVNpemU7ICAgICAvKiBpbWFnZSBkYXRhIHNpemUgaW4gYnl0ZXMgaW4gY2FzZSBvZiBpbnRlcmxlYXZlZCBkYXRhKSovCisvL2NoYXIgKmltYWdlRGF0YTsgICAgLyogcG9pbnRlciB0byBhbGlnbmVkIGltYWdlIGRhdGEgKi8KKy8vY2hhciAqaW1hZ2VEYXRhT3JpZ2luOyAvKiBwb2ludGVyIHRvIHZlcnkgb3JpZ2luIG9mIGltYWdlIC1kZWFsbG9jYXRpb24gKi8KKy8vVmFsdWVzIHVzZWZ1bCBmb3IgZ2F1c3NpYW4gaW50ZWdyYWwKKy8vMC41IC0gMC4xOTE0NiAtIDAuMzgyOTIKKy8vMS4wIC0gMC4zNDEzNCAtIDAuNjgyNjgKKy8vMS41IC0gMC40MzMxOSAtIDAuODY2MzgKKy8vMi4wIC0gMC40NzcyNSAtIDAuOTU0NTAKKy8vMi41IC0gMC40OTM3OSAtIDAuOTg3NTgKKy8vMy4wIC0gMC40OTg2NSAtIDAuOTk3MzAKKy8vMy41IC0gMC40OTk3Njc0IC0gMC45OTk1MzQ4CisvLzQuMCAtIDAuNDk5OTY4MyAtIDAuOTk5OTM2NgorCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKworLy9pbnRlcm5hbCBmdW5jdGlvbnMgZm9yIGdhdXNzaWFuIGJhY2tncm91bmQgZGV0ZWN0aW9uCitzdGF0aWMgdm9pZCBpY3ZJbnNlcnRpb25Tb3J0R2F1c3NpYW5zKCBDdkdhdXNzQkdQb2ludCogZ19wb2ludCwgZG91YmxlKiBzb3J0X2tleSwgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMgKTsKKworLyogCisgICBUZXN0IHdoZXRoZXIgcGl4ZWwgY2FuIGJlIGV4cGxhaW5lZCBieSBiYWNrZ3JvdW5kIG1vZGVsOyAKKyAgIFJldHVybiAtMSBpZiBubyBtYXRjaCB3YXMgZm91bmQ7IG90aGVyd2lzZSB0aGUgaW5kZXggaW4gbWF0Y2hbXSBpcyByZXR1cm5lZAorCisgICBpY3ZNYXRjaFRlc3QoLi4uKSBhc3N1bWVzIHdoYXQgYWxsIGNvbG9yIGNoYW5uZWxzIGNvbXBvbmVudCBleGhpYml0IHRoZSBzYW1lIHZhcmlhbmNlCisgICBpY3ZNYXRjaFRlc3QyKC4uLikgYWNjb3VudHMgZm9yIGRpZmZlcmVudCB2YXJpYW5jZXMgcGVyIGNvbG9yIGNoYW5uZWwKKyAqLworc3RhdGljIGludCBpY3ZNYXRjaFRlc3QoIGRvdWJsZSogc3JjX3BpeGVsLCBpbnQgbkNoYW5uZWxzLCBpbnQqIG1hdGNoLCAKKyAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqYmdfbW9kZWxfcGFyYW1zICk7CisvKnN0YXRpYyBpbnQgaWN2TWF0Y2hUZXN0MiggZG91YmxlKiBzcmNfcGl4ZWwsIGludCBuQ2hhbm5lbHMsIGludCogbWF0Y2gsIAorICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdQb2ludCogZ19wb2ludCwgY29uc3QgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMgKTsqLworCisKKy8qIAorICAgVGhlIHVwZGF0ZSBwcm9jZWR1cmUgZGlmZmVycyBiZXR3ZWVuICAKKyAgICAgICogdGhlIGluaXRpYWxpemF0aW9uIHBoYXNlIChuYW1lZCAqUGFydGlhbCogKSBhbmQKKyAgICAgICogdGhlIG5vcm1hbCBwaGFzZSAobmFtZWQgKkZ1bGwqICkKKyAgIFRoZSBpbml0YWxpemF0aW9uIHBoYXNlIGlzIGRlZmluZWQgYXMgbm90IGhhdmluZyBwcm9jZXNzZWQgPHdpbl9zaXplPiBmcmFtZXMgeWV0CisgKi8KK3N0YXRpYyB2b2lkIGljdlVwZGF0ZUZ1bGxXaW5kb3coIGRvdWJsZSogc3JjX3BpeGVsLCBpbnQgbkNoYW5uZWxzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2R2F1c3NCR1BvaW50KiBnX3BvaW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMgKmJnX21vZGVsX3BhcmFtcyApOworc3RhdGljIHZvaWQgaWN2VXBkYXRlRnVsbE5vTWF0Y2goIElwbEltYWdlKiBnbV9pbWFnZSwgaW50IHAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1hdGNoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMgKmJnX21vZGVsX3BhcmFtcyk7CitzdGF0aWMgdm9pZCBpY3ZVcGRhdGVQYXJ0aWFsV2luZG93KCBkb3VibGUqIHNyY19waXhlbCwgaW50IG5DaGFubmVscywgaW50KiBtYXRjaCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqYmdfbW9kZWxfcGFyYW1zICk7CitzdGF0aWMgdm9pZCBpY3ZVcGRhdGVQYXJ0aWFsTm9NYXRjaCggZG91YmxlKiBzcmNfcGl4ZWwsIGludCBuQ2hhbm5lbHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG1hdGNoLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMgKmJnX21vZGVsX3BhcmFtcyk7CisKKworc3RhdGljIHZvaWQgaWN2R2V0U29ydEtleSggY29uc3QgaW50IG5DaGFubmVscywgZG91YmxlKiBzb3J0X2tleSwgY29uc3QgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMgKmJnX21vZGVsX3BhcmFtcyApOworc3RhdGljIHZvaWQgaWN2QmFja2dyb3VuZFRlc3QoIGNvbnN0IGludCBuQ2hhbm5lbHMsIGludCBuLCBpbnQgaSwgaW50IGosIGludCAqbWF0Y2gsIEN2R2F1c3NCR01vZGVsKiBiZ19tb2RlbCApOworCitzdGF0aWMgdm9pZCBDVl9DREVDTCBpY3ZSZWxlYXNlR2F1c3NpYW5CR01vZGVsKCBDdkdhdXNzQkdNb2RlbCoqIGJnX21vZGVsICk7CitzdGF0aWMgaW50IENWX0NERUNMIGljdlVwZGF0ZUdhdXNzaWFuQkdNb2RlbCggSXBsSW1hZ2UqIGN1cnJfZnJhbWUsIEN2R2F1c3NCR01vZGVsKiAgYmdfbW9kZWwgKTsKKworLy8jZGVmaW5lIGZvciBpZigwKTtlbHNlIGZvcgorCisvL2cgPSAxIGZvciBmaXJzdCBnYXVzc2lhbiBpbiBsaXN0IHRoYXQgbWF0Y2hlcyBlbHNlIGcgPSAwCisvL1J3IGlzIHRoZSBsZWFybmluZyByYXRlIGZvciB3ZWlnaHQgYW5kIFJnIGlzIGxlYW5pbmcgcmF0ZSBmb3IgbWVhbiBhbmQgdmFyaWFuY2UKKy8vTXMgaXMgdGhlIG1hdGNoX3N1bSB3aGljaCBpcyB0aGUgc3VtIG9mIG1hdGNoZXMgZm9yIGEgcGFydGljdWxhciBnYXVzc2lhbgorLy9NcyB2YWx1ZXMgYXJlIGluY3JlbWVudGVkIHVudGlsIHRoZSBzdW0gb2YgTXMgdmFsdWVzIGluIHRoZSBsaXN0IGVxdWFscyB3aW5kb3cgc2l6ZSBMCisvL1NNcyBpcyB0aGUgc3VtIG9mIG1hdGNoX3N1bXMgZm9yIGdhdXNzaWFucyBpbiB0aGUgbGlzdAorLy9SdyA9IDEvU01zIG5vdGUgdGhlIHNtYWxsZXN0IFJ3IGdldHMgaXMgMS9MCisvL1JnID0gZy9NcyBmb3IgU01zIDwgTCBhbmQgUmcgPSBnLyh3KkwpIGZvciBTTXMgPSBMCisvL1RoZSBsaXN0IGlzIG1haW50YWluZWQgaW4gc29ydGVkIG9yZGVyIHVzaW5nIHcvc3FydCh2YXJpYW5jZSkgYXMgYSBrZXkKKy8vSWYgdGhlcmUgaXMgbm8gbWF0Y2ggdGhlIGxhc3QgZ2F1c3NpYW4gaW4gdGhlIGxpc3QgaXMgcmVwbGFjZWQgYnkgdGhlIG5ldyBnYXVzc2lhbgorLy9UaGlzIHdpbGwgcmVzdWx0IGluIGNoYW5nZXMgdG8gU01zIHdoaWNoIHJlc3VsdHMgaW4gY2hhbmdlcyBpbiBSdyBhbmQgUmcuCisvL0lmIGEgZ2F1c3NpYW4gaXMgcmVwbGFjZWQgYW5kIFNNcyBwcmV2aW91c2x5IGVxdWFsZWQgTCB2YWx1ZXMgb2YgTXMgYXJlIGNvbXB1dGVkIGZyb20gdworLy93W24rMV0gPSB3W25dICsgUncqKGcgLSB3W25dKSAgIHdlaWdodAorLy91W24rMV0gPSB1W25dICsgUmcqKHhbbisxXSAtIHVbbl0pIG1lYW4gdmFsdWUgU2cgaXMgc3VtIG4gdmFsdWVzIG9mIGcKKy8vdltuKzFdID0gdltuXSArIFJnKigoeFtuKzFdIC0gdVtuXSkqKHhbbisxXSAtIHVbbl0pKSAtIHZbbl0pIHZhcmlhbmNlCisvLworCitDVl9JTVBMIEN2QkdTdGF0TW9kZWwqCitjdkNyZWF0ZUdhdXNzaWFuQkdNb2RlbCggSXBsSW1hZ2UqIGZpcnN0X2ZyYW1lLCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMqIHBhcmFtZXRlcnMgKQoreworICAgIEN2R2F1c3NCR01vZGVsKiBiZ19tb2RlbCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUdhdXNzaWFuQkdNb2RlbCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgZG91YmxlIHZhcl9pbml0OworICAgIEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyBwYXJhbXM7CisgICAgaW50IGksIGosIGssIG0sIG47CisgICAgCisgICAgLy9pbml0IHBhcmFtZXRlcnMKKyAgICBpZiggcGFyYW1ldGVycyA9PSBOVUxMICkKKyAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVzZSBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gY3ZhdXgvaW5jbHVkZS9jdmF1eC5oOiAqLworICAgICAgICBwYXJhbXMud2luX3NpemUgICAgICA9IENWX0JHRkdfTU9HX1dJTkRPV19TSVpFOworICAgICAgICBwYXJhbXMuYmdfdGhyZXNob2xkICA9IENWX0JHRkdfTU9HX0JBQ0tHUk9VTkRfVEhSRVNIT0xEOworCisgICAgICAgIHBhcmFtcy5zdGRfdGhyZXNob2xkID0gQ1ZfQkdGR19NT0dfU1REX1RIUkVTSE9MRDsKKyAgICAgICAgcGFyYW1zLndlaWdodF9pbml0ICAgPSBDVl9CR0ZHX01PR19XRUlHSFRfSU5JVDsKKworICAgICAgICBwYXJhbXMudmFyaWFuY2VfaW5pdCA9IENWX0JHRkdfTU9HX1NJR01BX0lOSVQqQ1ZfQkdGR19NT0dfU0lHTUFfSU5JVDsKKyAgICAgICAgcGFyYW1zLm1pbkFyZWEgICAgICAgPSBDVl9CR0ZHX01PR19NSU5BUkVBOworICAgICAgICBwYXJhbXMubl9nYXVzcyAgICAgICA9IENWX0JHRkdfTU9HX05HQVVTU0lBTlM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBhcmFtcyA9ICpwYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBpZiggIUNWX0lTX0lNQUdFKGZpcnN0X2ZyYW1lKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIG9yIE5VTEwgZmlyc3RfZnJhbWUgcGFyYW1ldGVyIiApOworICAgIAorICAgIENWX0NBTEwoIGJnX21vZGVsID0gKEN2R2F1c3NCR01vZGVsKiljdkFsbG9jKCBzaXplb2YoKmJnX21vZGVsKSApKTsKKyAgICBtZW1zZXQoIGJnX21vZGVsLCAwLCBzaXplb2YoKmJnX21vZGVsKSApOworICAgIGJnX21vZGVsLT50eXBlID0gQ1ZfQkdfTU9ERUxfTU9HOworICAgIGJnX21vZGVsLT5yZWxlYXNlID0gKEN2UmVsZWFzZUJHU3RhdE1vZGVsKWljdlJlbGVhc2VHYXVzc2lhbkJHTW9kZWw7CisgICAgYmdfbW9kZWwtPnVwZGF0ZSA9IChDdlVwZGF0ZUJHU3RhdE1vZGVsKWljdlVwZGF0ZUdhdXNzaWFuQkdNb2RlbDsKKyAgICAKKyAgICBiZ19tb2RlbC0+cGFyYW1zID0gcGFyYW1zOworICAgIAorICAgIC8vcHJlcGFyZSBzdG9yYWdlcworICAgIENWX0NBTEwoIGJnX21vZGVsLT5nX3BvaW50ID0gKEN2R2F1c3NCR1BvaW50KiljdkFsbG9jKHNpemVvZihDdkdhdXNzQkdQb2ludCkqCisgICAgICAgICgoZmlyc3RfZnJhbWUtPndpZHRoKmZpcnN0X2ZyYW1lLT5oZWlnaHQpICsgMjU2KSkpOworICAgIAorICAgIENWX0NBTEwoIGJnX21vZGVsLT5iYWNrZ3JvdW5kID0gY3ZDcmVhdGVJbWFnZShjdlNpemUoZmlyc3RfZnJhbWUtPndpZHRoLAorICAgICAgICBmaXJzdF9mcmFtZS0+aGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCBmaXJzdF9mcmFtZS0+bkNoYW5uZWxzKSk7CisgICAgQ1ZfQ0FMTCggYmdfbW9kZWwtPmZvcmVncm91bmQgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZShmaXJzdF9mcmFtZS0+d2lkdGgsCisgICAgICAgIGZpcnN0X2ZyYW1lLT5oZWlnaHQpLCBJUExfREVQVEhfOFUsIDEpKTsKKyAgICAKKyAgICBDVl9DQUxMKCBiZ19tb2RlbC0+c3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpKTsKKyAgICAKKyAgICAvL2luaXRpYWxpemluZworICAgIHZhcl9pbml0ID0gMiAqIHBhcmFtcy5zdGRfdGhyZXNob2xkICogcGFyYW1zLnN0ZF90aHJlc2hvbGQ7CisgICAgQ1ZfQ0FMTCggYmdfbW9kZWwtPmdfcG9pbnRbMF0uZ192YWx1ZXMgPQorICAgICAgICAoQ3ZHYXVzc0JHVmFsdWVzKiljdkFsbG9jKCBzaXplb2YoQ3ZHYXVzc0JHVmFsdWVzKSpwYXJhbXMubl9nYXVzcyoKKyAgICAgICAgKGZpcnN0X2ZyYW1lLT53aWR0aCpmaXJzdF9mcmFtZS0+aGVpZ2h0ICsgMTI4KSkpOworICAgIAorICAgIGZvciggaSA9IDAsIG4gPSAwOyBpIDwgZmlyc3RfZnJhbWUtPmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBmaXJzdF9mcmFtZS0+d2lkdGg7IGorKywgbisrICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50IHAgPSBpKmZpcnN0X2ZyYW1lLT53aWR0aFN0ZXAraipmaXJzdF9mcmFtZS0+bkNoYW5uZWxzOworCisgICAgICAgICAgICBiZ19tb2RlbC0+Z19wb2ludFtuXS5nX3ZhbHVlcyA9CisgICAgICAgICAgICAgICAgYmdfbW9kZWwtPmdfcG9pbnRbMF0uZ192YWx1ZXMgKyBuKnBhcmFtcy5uX2dhdXNzOworICAgICAgICAgICAgYmdfbW9kZWwtPmdfcG9pbnRbbl0uZ192YWx1ZXNbMF0ud2VpZ2h0ID0gMTsgICAgLy90aGUgZmlyc3QgdmFsdWUgc2VlbiBoYXMgd2VpZ2h0IG9uZQorICAgICAgICAgICAgYmdfbW9kZWwtPmdfcG9pbnRbbl0uZ192YWx1ZXNbMF0ubWF0Y2hfc3VtID0gMTsKKyAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBmaXJzdF9mcmFtZS0+bkNoYW5uZWxzOyBtKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmdfbW9kZWwtPmdfcG9pbnRbbl0uZ192YWx1ZXNbMF0udmFyaWFuY2VbbV0gPSB2YXJfaW5pdDsKKyAgICAgICAgICAgICAgICBiZ19tb2RlbC0+Z19wb2ludFtuXS5nX3ZhbHVlc1swXS5tZWFuW21dID0gKHVuc2lnbmVkIGNoYXIpZmlyc3RfZnJhbWUtPmltYWdlRGF0YVtwICsgbV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIGsgPSAxOyBrIDwgcGFyYW1zLm5fZ2F1c3M7IGsrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZ19tb2RlbC0+Z19wb2ludFtuXS5nX3ZhbHVlc1trXS53ZWlnaHQgPSAwOworICAgICAgICAgICAgICAgIGJnX21vZGVsLT5nX3BvaW50W25dLmdfdmFsdWVzW2tdLm1hdGNoX3N1bSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBtID0gMDsgbSA8IGZpcnN0X2ZyYW1lLT5uQ2hhbm5lbHM7IG0rKyl7CisgICAgICAgICAgICAgICAgICAgIGJnX21vZGVsLT5nX3BvaW50W25dLmdfdmFsdWVzW2tdLnZhcmlhbmNlW21dID0gdmFyX2luaXQ7CisgICAgICAgICAgICAgICAgICAgIGJnX21vZGVsLT5nX3BvaW50W25dLmdfdmFsdWVzW2tdLm1lYW5bbV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBiZ19tb2RlbC0+Y291bnRGcmFtZXMgPSAwOworICAgIAorICAgIF9fRU5EX187CisgICAgCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICB7CisgICAgICAgIEN2QkdTdGF0TW9kZWwqIGJhc2VfcHRyID0gKEN2QkdTdGF0TW9kZWwqKWJnX21vZGVsOworICAgICAgICAKKyAgICAgICAgaWYoIGJnX21vZGVsICYmIGJnX21vZGVsLT5yZWxlYXNlICkKKyAgICAgICAgICAgIGJnX21vZGVsLT5yZWxlYXNlKCAmYmFzZV9wdHIgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZGcmVlKCAmYmdfbW9kZWwgKTsKKyAgICAgICAgYmdfbW9kZWwgPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gKEN2QkdTdGF0TW9kZWwqKWJnX21vZGVsOworfQorCisKK3N0YXRpYyB2b2lkIENWX0NERUNMCitpY3ZSZWxlYXNlR2F1c3NpYW5CR01vZGVsKCBDdkdhdXNzQkdNb2RlbCoqIF9iZ19tb2RlbCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWxlYXNlR2F1c3NpYW5CR01vZGVsIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCAhX2JnX21vZGVsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggKl9iZ19tb2RlbCApCisgICAgeworICAgICAgICBDdkdhdXNzQkdNb2RlbCogYmdfbW9kZWwgPSAqX2JnX21vZGVsOworICAgICAgICBpZiggYmdfbW9kZWwtPmdfcG9pbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZiZ19tb2RlbC0+Z19wb2ludFswXS5nX3ZhbHVlcyApOworICAgICAgICAgICAgY3ZGcmVlKCAmYmdfbW9kZWwtPmdfcG9pbnQgKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZiZ19tb2RlbC0+YmFja2dyb3VuZCApOworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmJnX21vZGVsLT5mb3JlZ3JvdW5kICk7CisgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJmJnX21vZGVsLT5zdG9yYWdlKTsKKyAgICAgICAgbWVtc2V0KCBiZ19tb2RlbCwgMCwgc2l6ZW9mKCpiZ19tb2RlbCkgKTsKKyAgICAgICAgY3ZGcmVlKCBfYmdfbW9kZWwgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyBpbnQgQ1ZfQ0RFQ0wKK2ljdlVwZGF0ZUdhdXNzaWFuQkdNb2RlbCggSXBsSW1hZ2UqIGN1cnJfZnJhbWUsIEN2R2F1c3NCR01vZGVsKiAgYmdfbW9kZWwgKQoreworICAgIGludCBpLCBqLCBrLCBuOworICAgIGludCByZWdpb25fY291bnQgPSAwOworICAgIEN2U2VxICpmaXJzdF9zZXEgPSBOVUxMLCAqcHJldl9zZXEgPSBOVUxMLCAqc2VxID0gTlVMTDsKKyAgICAKKyAgICBiZ19tb2RlbC0+Y291bnRGcmFtZXMrKzsKKyAgICAKKyAgICBmb3IoIGkgPSAwLCBuID0gMDsgaSA8IGN1cnJfZnJhbWUtPmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBjdXJyX2ZyYW1lLT53aWR0aDsgaisrLCBuKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF0Y2hbQ1ZfQkdGR19NT0dfTUFYX05HQVVTU0lBTlNdOworICAgICAgICAgICAgZG91YmxlIHNvcnRfa2V5W0NWX0JHRkdfTU9HX01BWF9OR0FVU1NJQU5TXTsKKyAgICAgICAgICAgIGNvbnN0IGludCBuQ2hhbm5lbHMgPSBjdXJyX2ZyYW1lLT5uQ2hhbm5lbHM7CisgICAgICAgICAgICBjb25zdCBpbnQgcCA9IGN1cnJfZnJhbWUtPndpZHRoU3RlcCppK2oqbkNoYW5uZWxzOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBBIGZldyBzaG9ydCBjdXRzCisgICAgICAgICAgICBDdkdhdXNzQkdQb2ludCogZ19wb2ludCA9ICZiZ19tb2RlbC0+Z19wb2ludFtuXTsKKyAgICAgICAgICAgIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyBiZ19tb2RlbF9wYXJhbXMgPSBiZ19tb2RlbC0+cGFyYW1zOworICAgICAgICAgICAgZG91YmxlIHBpeGVsWzRdOworICAgICAgICAgICAgaW50IG5vX21hdGNoOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbkNoYW5uZWxzOyBrKysgKQorICAgICAgICAgICAgICAgIHBpeGVsW2tdID0gKHVjaGFyKWN1cnJfZnJhbWUtPmltYWdlRGF0YVtwK2tdOworICAgICAgICAgICAgCisgICAgICAgICAgICBub19tYXRjaCA9IGljdk1hdGNoVGVzdCggcGl4ZWwsIG5DaGFubmVscywgbWF0Y2gsIGdfcG9pbnQsICZiZ19tb2RlbF9wYXJhbXMgKTsKKyAgICAgICAgICAgIGlmKCBiZ19tb2RlbC0+Y291bnRGcmFtZXMgPj0gYmdfbW9kZWwtPnBhcmFtcy53aW5fc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWN2VXBkYXRlRnVsbFdpbmRvdyggcGl4ZWwsIG5DaGFubmVscywgbWF0Y2gsIGdfcG9pbnQsICZiZ19tb2RlbC0+cGFyYW1zICk7CisgICAgICAgICAgICAgICAgaWYoIG5vX21hdGNoID09IC0xKQorICAgICAgICAgICAgICAgICAgICBpY3ZVcGRhdGVGdWxsTm9NYXRjaCggY3Vycl9mcmFtZSwgcCwgbWF0Y2gsIGdfcG9pbnQsICZiZ19tb2RlbF9wYXJhbXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpY3ZVcGRhdGVQYXJ0aWFsV2luZG93KCBwaXhlbCwgbkNoYW5uZWxzLCBtYXRjaCwgZ19wb2ludCwgJmJnX21vZGVsX3BhcmFtcyApOworICAgICAgICAgICAgICAgIGlmKCBub19tYXRjaCA9PSAtMSkKKyAgICAgICAgICAgICAgICAgICAgaWN2VXBkYXRlUGFydGlhbE5vTWF0Y2goIHBpeGVsLCBuQ2hhbm5lbHMsIG1hdGNoLCBnX3BvaW50LCAmYmdfbW9kZWxfcGFyYW1zICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpY3ZHZXRTb3J0S2V5KCBuQ2hhbm5lbHMsIHNvcnRfa2V5LCBnX3BvaW50LCAmYmdfbW9kZWxfcGFyYW1zICk7CisgICAgICAgICAgICBpY3ZJbnNlcnRpb25Tb3J0R2F1c3NpYW5zKCBnX3BvaW50LCBzb3J0X2tleSwgKEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqKSZiZ19tb2RlbF9wYXJhbXMgKTsKKyAgICAgICAgICAgIGljdkJhY2tncm91bmRUZXN0KCBuQ2hhbm5lbHMsIG4sIGksIGosIG1hdGNoLCBiZ19tb2RlbCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8vZm9yZWdyb3VuZCBmaWx0ZXJpbmcKKyAgICAKKyAgICAvL2ZpbHRlciBzbWFsbCByZWdpb25zCisgICAgY3ZDbGVhck1lbVN0b3JhZ2UoYmdfbW9kZWwtPnN0b3JhZ2UpOworICAgIAorICAgIC8vY3ZNb3JwaG9sb2d5RXgoIGJnX21vZGVsLT5mb3JlZ3JvdW5kLCBiZ19tb2RlbC0+Zm9yZWdyb3VuZCwgMCwgMCwgQ1ZfTU9QX09QRU4sIDEgKTsKKyAgICAvL2N2TW9ycGhvbG9neUV4KCBiZ19tb2RlbC0+Zm9yZWdyb3VuZCwgYmdfbW9kZWwtPmZvcmVncm91bmQsIDAsIDAsIENWX01PUF9DTE9TRSwgMSApOworICAgIAorICAgIGN2RmluZENvbnRvdXJzKCBiZ19tb2RlbC0+Zm9yZWdyb3VuZCwgYmdfbW9kZWwtPnN0b3JhZ2UsICZmaXJzdF9zZXEsIHNpemVvZihDdkNvbnRvdXIpLCBDVl9SRVRSX0xJU1QgKTsKKyAgICBmb3IoIHNlcSA9IGZpcnN0X3NlcTsgc2VxOyBzZXEgPSBzZXEtPmhfbmV4dCApCisgICAgeworICAgICAgICBDdkNvbnRvdXIqIGNudCA9IChDdkNvbnRvdXIqKXNlcTsKKyAgICAgICAgaWYoIGNudC0+cmVjdC53aWR0aCAqIGNudC0+cmVjdC5oZWlnaHQgPCBiZ19tb2RlbC0+cGFyYW1zLm1pbkFyZWEgKQorICAgICAgICB7CisgICAgICAgICAgICAvL2RlbGV0ZSBzbWFsbCBjb250b3VyCisgICAgICAgICAgICBwcmV2X3NlcSA9IHNlcS0+aF9wcmV2OworICAgICAgICAgICAgaWYoIHByZXZfc2VxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwcmV2X3NlcS0+aF9uZXh0ID0gc2VxLT5oX25leHQ7CisgICAgICAgICAgICAgICAgaWYoIHNlcS0+aF9uZXh0ICkgc2VxLT5oX25leHQtPmhfcHJldiA9IHByZXZfc2VxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZpcnN0X3NlcSA9IHNlcS0+aF9uZXh0OworICAgICAgICAgICAgICAgIGlmKCBzZXEtPmhfbmV4dCApIHNlcS0+aF9uZXh0LT5oX3ByZXYgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaW9uX2NvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgYmdfbW9kZWwtPmZvcmVncm91bmRfcmVnaW9ucyA9IGZpcnN0X3NlcTsKKyAgICBjdlplcm8oYmdfbW9kZWwtPmZvcmVncm91bmQpOworICAgIGN2RHJhd0NvbnRvdXJzKGJnX21vZGVsLT5mb3JlZ3JvdW5kLCBmaXJzdF9zZXEsIENWX1JHQigwLCAwLCAyNTUpLCBDVl9SR0IoMCwgMCwgMjU1KSwgMTAsIC0xKTsKKyAgICAKKyAgICByZXR1cm4gcmVnaW9uX2NvdW50OworfQorCitzdGF0aWMgdm9pZCBpY3ZJbnNlcnRpb25Tb3J0R2F1c3NpYW5zKCBDdkdhdXNzQkdQb2ludCogZ19wb2ludCwgZG91YmxlKiBzb3J0X2tleSwgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMgKQoreworICAgIGludCBpLCBqOworICAgIGZvciggaSA9IDE7IGkgPCBiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3M7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgaW5kZXggPSBzb3J0X2tleVtpXTsKKyAgICAgICAgZm9yKCBqID0gaTsgaiA+IDAgJiYgc29ydF9rZXlbai0xXSA8IGluZGV4OyBqLS0gKSAvL3NvcnQgZGVjZW5kaW5nIG9yZGVyCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0ZW1wX3NvcnRfa2V5ID0gc29ydF9rZXlbal07CisgICAgICAgICAgICBzb3J0X2tleVtqXSA9IHNvcnRfa2V5W2otMV07CisgICAgICAgICAgICBzb3J0X2tleVtqLTFdID0gdGVtcF9zb3J0X2tleTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ3ZHYXVzc0JHVmFsdWVzIHRlbXBfZ2F1c3NfdmFsdWVzID0gZ19wb2ludC0+Z192YWx1ZXNbal07CisgICAgICAgICAgICBnX3BvaW50LT5nX3ZhbHVlc1tqXSA9IGdfcG9pbnQtPmdfdmFsdWVzW2otMV07CisgICAgICAgICAgICBnX3BvaW50LT5nX3ZhbHVlc1tqLTFdID0gdGVtcF9nYXVzc192YWx1ZXM7CisgICAgICAgIH0KKy8vICAgICAgICBzb3J0X2tleVtqXSA9IGluZGV4OworICAgIH0KK30KKworCitzdGF0aWMgaW50IGljdk1hdGNoVGVzdCggZG91YmxlKiBzcmNfcGl4ZWwsIGludCBuQ2hhbm5lbHMsIGludCogbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMgKQoreworICAgIGludCBrOworICAgIGludCBtYXRjaFBvc2l0aW9uPS0xOworICAgIGZvciAoIGsgPSAwOyBrIDwgYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzOyBrKyspIG1hdGNoW2tdPTA7CisgICAgCisgICAgZm9yICggayA9IDA7IGsgPCBiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3M7IGsrKykgeworICAgICAgICBkb3VibGUgc3VtX2QyID0gMC4wOworICAgICAgICBkb3VibGUgdmFyX3RocmVzaG9sZCA9IDAuMDsKKyAgICAgICAgZm9yKGludCBtID0gMDsgbSA8IG5DaGFubmVsczsgbSsrKXsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gZ19wb2ludC0+Z192YWx1ZXNba10ubWVhblttXS0gc3JjX3BpeGVsW21dOworICAgICAgICAgICAgc3VtX2QyICs9IChkKmQpOworICAgICAgICAgICAgdmFyX3RocmVzaG9sZCArPSBnX3BvaW50LT5nX3ZhbHVlc1trXS52YXJpYW5jZVttXTsKKyAgICAgICAgfSAgLy9kaWZmZXJlbmNlIDwgU1REX0xJTUlUKlNURF9MSU1JVCBvciBkaWZmZXJlbmNlKioyIDwgU1REX0xJTUlUKlNURF9MSU1JVCpWQVIKKyAgICAgICAgdmFyX3RocmVzaG9sZCA9IGJnX21vZGVsX3BhcmFtcy0+c3RkX3RocmVzaG9sZCpiZ19tb2RlbF9wYXJhbXMtPnN0ZF90aHJlc2hvbGQqdmFyX3RocmVzaG9sZDsKKyAgICAgICAgaWYoc3VtX2QyIDwgdmFyX3RocmVzaG9sZCl7CisgICAgICAgICAgICBtYXRjaFtrXSA9IDE7CisgICAgICAgICAgICBtYXRjaFBvc2l0aW9uID0gazsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBtYXRjaFBvc2l0aW9uOworfQorCisvKgorc3RhdGljIGludCBpY3ZNYXRjaFRlc3QyKCBkb3VibGUqIHNyY19waXhlbCwgaW50IG5DaGFubmVscywgaW50KiBtYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqYmdfbW9kZWxfcGFyYW1zICkKK3sKKyAgICBpbnQgaywgbTsKKyAgICBpbnQgbWF0Y2hQb3NpdGlvbj0tMTsKKyAgICAKKyAgICBmb3IoIGsgPSAwOyBrIDwgYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzOyBrKysgKQorICAgICAgICBtYXRjaFtrXSA9IDA7CisgICAgCisgICAgZm9yKCBrID0gMDsgayA8IGJnX21vZGVsX3BhcmFtcy0+bl9nYXVzczsgaysrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzdW1fZDIgPSAwLjAsIHZhcl90aHJlc2hvbGQ7CisgICAgICAgIGZvciggbSA9IDA7IG0gPCBuQ2hhbm5lbHM7IG0rKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBkID0gZ19wb2ludC0+Z192YWx1ZXNba10ubWVhblttXS0gc3JjX3BpeGVsW21dOworICAgICAgICAgICAgc3VtX2QyICs9IChkKmQpIC8gKGdfcG9pbnQtPmdfdmFsdWVzW2tdLnZhcmlhbmNlW21dICogZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV0pOworICAgICAgICB9ICAvL2RpZmZlcmVuY2UgPCBTVERfTElNSVQqU1REX0xJTUlUIG9yIGRpZmZlcmVuY2UqKjIgPCBTVERfTElNSVQqU1REX0xJTUlUKlZBUgorICAgICAgICAKKyAgICAgICAgdmFyX3RocmVzaG9sZCA9IGJnX21vZGVsX3BhcmFtcy0+c3RkX3RocmVzaG9sZCpiZ19tb2RlbF9wYXJhbXMtPnN0ZF90aHJlc2hvbGQ7CisgICAgICAgIGlmKCBzdW1fZDIgPCB2YXJfdGhyZXNob2xkICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF0Y2hba10gPSAxOworICAgICAgICAgICAgbWF0Y2hQb3NpdGlvbiA9IGs7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gbWF0Y2hQb3NpdGlvbjsKK30KKyovCisKK3N0YXRpYyB2b2lkIGljdlVwZGF0ZUZ1bGxXaW5kb3coIGRvdWJsZSogc3JjX3BpeGVsLCBpbnQgbkNoYW5uZWxzLCBpbnQqIG1hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdhdXNzQkdTdGF0TW9kZWxQYXJhbXMgKmJnX21vZGVsX3BhcmFtcyApCit7CisgICAgY29uc3QgZG91YmxlIGxlYXJuaW5nX3JhdGVfd2VpZ2h0ID0gKDEuMC8oZG91YmxlKWJnX21vZGVsX3BhcmFtcy0+d2luX3NpemUpOworICAgIGZvcihpbnQgayA9IDA7IGsgPCBiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3M7IGsrKyl7CisgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2tdLndlaWdodCA9IGdfcG9pbnQtPmdfdmFsdWVzW2tdLndlaWdodCArCisgICAgICAgICAgICAobGVhcm5pbmdfcmF0ZV93ZWlnaHQqKChkb3VibGUpbWF0Y2hba10gLQorICAgICAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNba10ud2VpZ2h0KSk7CisgICAgICAgIGlmKG1hdGNoW2tdKXsKKyAgICAgICAgICAgIGRvdWJsZSBsZWFybmluZ19yYXRlX2dhdXNzaWFuID0gKGRvdWJsZSltYXRjaFtrXS8oZ19wb2ludC0+Z192YWx1ZXNba10ud2VpZ2h0KgorICAgICAgICAgICAgICAgIChkb3VibGUpYmdfbW9kZWxfcGFyYW1zLT53aW5fc2l6ZSk7CisgICAgICAgICAgICBmb3IoaW50IG0gPSAwOyBtIDwgbkNoYW5uZWxzOyBtKyspeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSB0bXBEaWZmID0gc3JjX3BpeGVsW21dIC0gZ19wb2ludC0+Z192YWx1ZXNba10ubWVhblttXTsKKyAgICAgICAgICAgICAgICBnX3BvaW50LT5nX3ZhbHVlc1trXS5tZWFuW21dID0gZ19wb2ludC0+Z192YWx1ZXNba10ubWVhblttXSArCisgICAgICAgICAgICAgICAgICAgIChsZWFybmluZ19yYXRlX2dhdXNzaWFuICogdG1wRGlmZik7CisgICAgICAgICAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV0gPSBnX3BvaW50LT5nX3ZhbHVlc1trXS52YXJpYW5jZVttXSsKKyAgICAgICAgICAgICAgICAgICAgKGxlYXJuaW5nX3JhdGVfZ2F1c3NpYW4qKCh0bXBEaWZmKnRtcERpZmYpIC0gZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBpY3ZVcGRhdGVQYXJ0aWFsV2luZG93KCBkb3VibGUqIHNyY19waXhlbCwgaW50IG5DaGFubmVscywgaW50KiBtYXRjaCwgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqYmdfbW9kZWxfcGFyYW1zICkKK3sKKyAgICBpbnQgaywgbTsKKyAgICBpbnQgd2luZG93X2N1cnJlbnQgPSAwOworICAgIAorICAgIGZvciggayA9IDA7IGsgPCBiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3M7IGsrKyApCisgICAgICAgIHdpbmRvd19jdXJyZW50ICs9IGdfcG9pbnQtPmdfdmFsdWVzW2tdLm1hdGNoX3N1bTsKKyAgICAKKyAgICBmb3IoIGsgPSAwOyBrIDwgYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzOyBrKysgKQorICAgIHsKKyAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNba10ubWF0Y2hfc3VtICs9IG1hdGNoW2tdOworICAgICAgICBkb3VibGUgbGVhcm5pbmdfcmF0ZV93ZWlnaHQgPSAoMS4wLygoZG91YmxlKXdpbmRvd19jdXJyZW50ICsgMS4wKSk7IC8vaW5jcmVhc2VkIGJ5IG9uZSBzaW5jZSBzdW0KKyAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNba10ud2VpZ2h0ID0gZ19wb2ludC0+Z192YWx1ZXNba10ud2VpZ2h0ICsKKyAgICAgICAgICAgIChsZWFybmluZ19yYXRlX3dlaWdodCooKGRvdWJsZSltYXRjaFtrXSAtIGdfcG9pbnQtPmdfdmFsdWVzW2tdLndlaWdodCkpOworICAgICAgICAKKyAgICAgICAgaWYoIGdfcG9pbnQtPmdfdmFsdWVzW2tdLm1hdGNoX3N1bSA+IDAgJiYgbWF0Y2hba10gKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgbGVhcm5pbmdfcmF0ZV9nYXVzc2lhbiA9IChkb3VibGUpbWF0Y2hba10vKChkb3VibGUpZ19wb2ludC0+Z192YWx1ZXNba10ubWF0Y2hfc3VtKTsKKyAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBuQ2hhbm5lbHM7IG0rKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIHRtcERpZmYgPSBzcmNfcGl4ZWxbbV0gLSBnX3BvaW50LT5nX3ZhbHVlc1trXS5tZWFuW21dOworICAgICAgICAgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2tdLm1lYW5bbV0gPSBnX3BvaW50LT5nX3ZhbHVlc1trXS5tZWFuW21dICsKKyAgICAgICAgICAgICAgICAgICAgKGxlYXJuaW5nX3JhdGVfZ2F1c3NpYW4qdG1wRGlmZik7CisgICAgICAgICAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV0gPSBnX3BvaW50LT5nX3ZhbHVlc1trXS52YXJpYW5jZVttXSsKKyAgICAgICAgICAgICAgICAgICAgKGxlYXJuaW5nX3JhdGVfZ2F1c3NpYW4qKCh0bXBEaWZmKnRtcERpZmYpIC0gZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIHZvaWQgaWN2VXBkYXRlRnVsbE5vTWF0Y2goIElwbEltYWdlKiBnbV9pbWFnZSwgaW50IHAsIGludCogbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHYXVzc0JHUG9pbnQqIGdfcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMpCit7CisgICAgaW50IGssIG07CisgICAgZG91YmxlIGFscGhhOworICAgIGludCBtYXRjaF9zdW1fdG90YWwgPSAwOworCisgICAgLy9uZXcgdmFsdWUgb2YgbGFzdCBvbmUKKyAgICBnX3BvaW50LT5nX3ZhbHVlc1tiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3MgLSAxXS5tYXRjaF9zdW0gPSAxOworICAgIAorICAgIC8vZ2V0IHN1bSBvZiBhbGwgYnV0IGxhc3QgdmFsdWUgb2YgbWF0Y2hfc3VtCisgICAgCisgICAgZm9yKCBrID0gMDsgayA8IGJnX21vZGVsX3BhcmFtcy0+bl9nYXVzcyA7IGsrKyApCisgICAgICAgIG1hdGNoX3N1bV90b3RhbCArPSBnX3BvaW50LT5nX3ZhbHVlc1trXS5tYXRjaF9zdW07CisgICAgCisgICAgZ19wb2ludC0+Z192YWx1ZXNbYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzIC0gMV0ud2VpZ2h0ID0gMS4vKGRvdWJsZSltYXRjaF9zdW1fdG90YWw7CisgICAgZm9yKCBtID0gMDsgbSA8IGdtX2ltYWdlLT5uQ2hhbm5lbHMgOyBtKysgKQorICAgIHsKKyAgICAgICAgLy8gZmlyc3QgcGFzcyBtZWFuIGlzIGltYWdlIHZhbHVlCisgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2JnX21vZGVsX3BhcmFtcy0+bl9nYXVzcyAtIDFdLnZhcmlhbmNlW21dID0gYmdfbW9kZWxfcGFyYW1zLT52YXJpYW5jZV9pbml0OworICAgICAgICBnX3BvaW50LT5nX3ZhbHVlc1tiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3MgLSAxXS5tZWFuW21dID0gKHVuc2lnbmVkIGNoYXIpZ21faW1hZ2UtPmltYWdlRGF0YVtwICsgbV07CisgICAgfQorICAgIAorICAgIGFscGhhID0gMS4wIC0gKDEuMC9iZ19tb2RlbF9wYXJhbXMtPndpbl9zaXplKTsKKyAgICBmb3IoIGsgPSAwOyBrIDwgYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzIC0gMTsgaysrICkKKyAgICB7CisgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2tdLndlaWdodCAqPSBhbHBoYTsKKyAgICAgICAgaWYoIG1hdGNoW2tdICkKKyAgICAgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2tdLndlaWdodCArPSBhbHBoYTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlVwZGF0ZVBhcnRpYWxOb01hdGNoKGRvdWJsZSAqcGl4ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAvKm1hdGNoKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBDdkdhdXNzQkdQb2ludCogZ19wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2R2F1c3NCR1N0YXRNb2RlbFBhcmFtcyAqYmdfbW9kZWxfcGFyYW1zKQoreworICAgIGludCBrLCBtOworICAgIC8vbmV3IHZhbHVlIG9mIGxhc3Qgb25lCisgICAgZ19wb2ludC0+Z192YWx1ZXNbYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzIC0gMV0ubWF0Y2hfc3VtID0gMTsKKyAgICAKKyAgICAvL2dldCBzdW0gb2YgYWxsIGJ1dCBsYXN0IHZhbHVlIG9mIG1hdGNoX3N1bQorICAgIGludCBtYXRjaF9zdW1fdG90YWwgPSAwOworICAgIGZvcihrID0gMDsgayA8IGJnX21vZGVsX3BhcmFtcy0+bl9nYXVzcyA7IGsrKykKKyAgICAgICAgbWF0Y2hfc3VtX3RvdGFsICs9IGdfcG9pbnQtPmdfdmFsdWVzW2tdLm1hdGNoX3N1bTsKKworICAgIGZvcihtID0gMDsgbSA8IG5DaGFubmVsczsgbSsrKQorICAgIHsKKyAgICAgICAgLy9maXJzdCBwYXNzIG1lYW4gaXMgaW1hZ2UgdmFsdWUKKyAgICAgICAgZ19wb2ludC0+Z192YWx1ZXNbYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzIC0gMV0udmFyaWFuY2VbbV0gPSBiZ19tb2RlbF9wYXJhbXMtPnZhcmlhbmNlX2luaXQ7CisgICAgICAgIGdfcG9pbnQtPmdfdmFsdWVzW2JnX21vZGVsX3BhcmFtcy0+bl9nYXVzcyAtIDFdLm1lYW5bbV0gPSBwaXhlbFttXTsKKyAgICB9CisgICAgZm9yKGsgPSAwOyBrIDwgYmdfbW9kZWxfcGFyYW1zLT5uX2dhdXNzOyBrKyspCisgICAgeworICAgICAgICBnX3BvaW50LT5nX3ZhbHVlc1trXS53ZWlnaHQgPSAoZG91YmxlKWdfcG9pbnQtPmdfdmFsdWVzW2tdLm1hdGNoX3N1bSAvCisgICAgICAgICAgICAoZG91YmxlKW1hdGNoX3N1bV90b3RhbDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGljdkdldFNvcnRLZXkoIGNvbnN0IGludCBuQ2hhbm5lbHMsIGRvdWJsZSogc29ydF9rZXksIGNvbnN0IEN2R2F1c3NCR1BvaW50KiBnX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHYXVzc0JHU3RhdE1vZGVsUGFyYW1zICpiZ19tb2RlbF9wYXJhbXMgKQoreworICAgIGludCBrLCBtOworICAgIGZvciggayA9IDA7IGsgPCBiZ19tb2RlbF9wYXJhbXMtPm5fZ2F1c3M7IGsrKyApCisgICAgeworICAgICAgICAvLyBBdm9pZCBkaXZpc2lvbiBieSB6ZXJvCisgICAgICAgIGlmKCBnX3BvaW50LT5nX3ZhbHVlc1trXS5tYXRjaF9zdW0gPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gSW5kZXBlbmRlbmNlIGFzc3VtcHRpb24gYmV0d2VlbiBjb21wb25lbnRzCisgICAgICAgICAgICBkb3VibGUgdmFyaWFuY2Vfc3VtID0gMC4wOworICAgICAgICAgICAgZm9yKCBtID0gMDsgbSA8IG5DaGFubmVsczsgbSsrICkKKyAgICAgICAgICAgICAgICB2YXJpYW5jZV9zdW0gKz0gZ19wb2ludC0+Z192YWx1ZXNba10udmFyaWFuY2VbbV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNvcnRfa2V5W2tdID0gZ19wb2ludC0+Z192YWx1ZXNba10ud2VpZ2h0L3NxcnQodmFyaWFuY2Vfc3VtKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzb3J0X2tleVtrXT0gMC4wOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZCBpY3ZCYWNrZ3JvdW5kVGVzdCggY29uc3QgaW50IG5DaGFubmVscywgaW50IG4sIGludCBpLCBpbnQgaiwgaW50ICptYXRjaCwgQ3ZHYXVzc0JHTW9kZWwqIGJnX21vZGVsICkKK3sKKyAgICBpbnQgbSwgYjsKKyAgICB1Y2hhciBwaXhlbFZhbHVlID0gKHVjaGFyKTI1NTsgLy8gd2lsbCBzd2l0Y2ggdG8gMCBpZiBtYXRjaCBmb3VuZAorICAgIGRvdWJsZSB3ZWlnaHRfc3VtID0gMC4wOworICAgIEN2R2F1c3NCR1BvaW50KiBnX3BvaW50ID0gYmdfbW9kZWwtPmdfcG9pbnQ7CisgICAgCisgICAgZm9yKCBtID0gMDsgbSA8IG5DaGFubmVsczsgbSsrKQorICAgICAgICBiZ19tb2RlbC0+YmFja2dyb3VuZC0+aW1hZ2VEYXRhWyBiZ19tb2RlbC0+YmFja2dyb3VuZC0+d2lkdGhTdGVwKmkgKyBqKm5DaGFubmVscyArIG1dICA9ICh1bnNpZ25lZCBjaGFyKShnX3BvaW50W25dLmdfdmFsdWVzWzBdLm1lYW5bbV0rMC41KTsKKyAgICAKKyAgICBmb3IoIGIgPSAwOyBiIDwgYmdfbW9kZWwtPnBhcmFtcy5uX2dhdXNzOyBiKyspCisgICAgeworICAgICAgICB3ZWlnaHRfc3VtICs9IGdfcG9pbnRbbl0uZ192YWx1ZXNbYl0ud2VpZ2h0OworICAgICAgICBpZiggbWF0Y2hbYl0gKQorICAgICAgICAgICAgcGl4ZWxWYWx1ZSA9IDA7CisgICAgICAgIGlmKCB3ZWlnaHRfc3VtID4gYmdfbW9kZWwtPnBhcmFtcy5iZ190aHJlc2hvbGQgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGJnX21vZGVsLT5mb3JlZ3JvdW5kLT5pbWFnZURhdGFbIGJnX21vZGVsLT5mb3JlZ3JvdW5kLT53aWR0aFN0ZXAqaSArIGpdID0gcGl4ZWxWYWx1ZTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZjYWxpYmZpbHRlci5jcHAgYi9jdmF1eC9zcmMvY3ZjYWxpYmZpbHRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjNGZjOAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmNhbGliZmlsdGVyLmNwcApAQCAtMCwwICsxLDkwNiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjdW5kZWYgcXVhZAorCisjaWYgX01TQ19WRVIgPj0gMTIwMAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0NzAxICkKKyNlbmRpZgorCitDdkNhbGliRmlsdGVyOjpDdkNhbGliRmlsdGVyKCkKK3sKKyAgICAvKiBldGFsb24gZGF0YSAqLworICAgIGV0YWxvblR5cGUgPSBDVl9DQUxJQl9FVEFMT05fVVNFUjsKKyAgICBldGFsb25QYXJhbUNvdW50ID0gMDsKKyAgICBldGFsb25QYXJhbXMgPSAwOworICAgIGV0YWxvblBvaW50Q291bnQgPSAwOworICAgIGV0YWxvblBvaW50cyA9IDA7CisKKyAgICAvKiBjYW1lcmEgZGF0YSAqLworICAgIGNhbWVyYUNvdW50ID0gMTsKKworICAgIG1lbXNldCggcG9pbnRzLCAwLCBzaXplb2YocG9pbnRzKSk7CisgICAgbWVtc2V0KCB1bmRpc3RNYXAsIDAsIHNpemVvZih1bmRpc3RNYXApKTsKKyAgICB1bmRpc3RJbWcgPSAwOworICAgIG1lbXNldCggbGF0ZXN0Q291bnRzLCAwLCBzaXplb2YobGF0ZXN0Q291bnRzKSk7CisgICAgbWVtc2V0KCBsYXRlc3RQb2ludHMsIDAsIHNpemVvZihsYXRlc3RQb2ludHMpKTsKKyAgICBtZW1zZXQoICZzdGVyZW8sIDAsIHNpemVvZihzdGVyZW8pICk7CisgICAgbWF4UG9pbnRzID0gMDsKKyAgICBmcmFtZXNUb3RhbCA9IDE1OworICAgIGZyYW1lc0FjY2VwdGVkID0gMDsKKyAgICBpc0NhbGlicmF0ZWQgPSBmYWxzZTsKKworICAgIGltZ1NpemUgPSBjdlNpemUoMCwwKTsKKyAgICBncmF5SW1nID0gMDsKKyAgICB0ZW1wSW1nID0gMDsKKyAgICBzdG9yYWdlID0gMDsKKworICAgIG1lbXNldCggcmVjdE1hcCwgMCwgc2l6ZW9mKHJlY3RNYXApKTsKK30KKworCitDdkNhbGliRmlsdGVyOjp+Q3ZDYWxpYkZpbHRlcigpCit7CisgICAgU2V0Q2FtZXJhQ291bnQoMCk7CisgICAgY3ZGcmVlKCAmZXRhbG9uUGFyYW1zICk7CisgICAgY3ZGcmVlKCAmZXRhbG9uUG9pbnRzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmZ3JheUltZyApOworICAgIGN2UmVsZWFzZU1hdCggJnRlbXBJbWcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ1bmRpc3RJbWcgKTsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmc3RvcmFnZSApOworfQorCisKK2Jvb2wgQ3ZDYWxpYkZpbHRlcjo6U2V0RXRhbG9uKCBDdkNhbGliRXRhbG9uVHlwZSB0eXBlLCBkb3VibGUqIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9pbnRDb3VudCwgQ3ZQb2ludDJEMzJmKiBwb2ludHMgKQoreworICAgIGludCBpLCBhcnJTaXplOworCisgICAgU3RvcCgpOworCisgICAgZm9yKCBpID0gMDsgaSA8IE1BWF9DQU1FUkFTOyBpKysgKQorICAgICAgICBjdkZyZWUoIGxhdGVzdFBvaW50cyArIGkgKTsKKworICAgIGlmKCB0eXBlID09IENWX0NBTElCX0VUQUxPTl9VU0VSIHx8IHR5cGUgIT0gZXRhbG9uVHlwZSApCisgICAgeworICAgICAgICBjdkZyZWUoICZldGFsb25QYXJhbXMgKTsKKyAgICB9CisKKyAgICBldGFsb25UeXBlID0gdHlwZTsKKworICAgIHN3aXRjaCggZXRhbG9uVHlwZSApCisgICAgeworICAgIGNhc2UgQ1ZfQ0FMSUJfRVRBTE9OX0NIRVNTQk9BUkQ6CisgICAgICAgIGV0YWxvblBhcmFtQ291bnQgPSAzOworICAgICAgICBpZiggIXBhcmFtcyB8fCBjdlJvdW5kKHBhcmFtc1swXSkgIT0gcGFyYW1zWzBdIHx8IHBhcmFtc1swXSA8IDMgfHwKKyAgICAgICAgICAgIGN2Um91bmQocGFyYW1zWzFdKSAhPSBwYXJhbXNbMV0gfHwgcGFyYW1zWzFdIDwgMyB8fCBwYXJhbXNbMl0gPD0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHBvaW50Q291bnQgPSBjdlJvdW5kKChwYXJhbXNbMF0gLSAxKSoocGFyYW1zWzFdIC0gMSkpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQ1ZfQ0FMSUJfRVRBTE9OX1VTRVI6CisgICAgICAgIGV0YWxvblBhcmFtQ291bnQgPSAwOworCisgICAgICAgIGlmKCAhcG9pbnRzIHx8IHBvaW50Q291bnQgPCA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYoIGV0YWxvblBhcmFtQ291bnQgPiAwICkKKyAgICB7CisgICAgICAgIGFyclNpemUgPSBldGFsb25QYXJhbUNvdW50ICogc2l6ZW9mKGV0YWxvblBhcmFtc1swXSk7CisgICAgICAgIGV0YWxvblBhcmFtcyA9IChkb3VibGUqKWN2QWxsb2MoIGFyclNpemUgKTsKKyAgICB9CisKKyAgICBhcnJTaXplID0gcG9pbnRDb3VudCAqIHNpemVvZihldGFsb25Qb2ludHNbMF0pOworCisgICAgaWYoIGV0YWxvblBvaW50Q291bnQgIT0gcG9pbnRDb3VudCApCisgICAgeworICAgICAgICBjdkZyZWUoICZldGFsb25Qb2ludHMgKTsKKyAgICAgICAgZXRhbG9uUG9pbnRDb3VudCA9IHBvaW50Q291bnQ7CisgICAgICAgIGV0YWxvblBvaW50cyA9IChDdlBvaW50MkQzMmYqKWN2QWxsb2MoIGFyclNpemUgKTsKKyAgICB9CisKKyAgICBzd2l0Y2goIGV0YWxvblR5cGUgKQorICAgIHsKKyAgICBjYXNlIENWX0NBTElCX0VUQUxPTl9DSEVTU0JPQVJEOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZXRhbG9uV2lkdGggPSBjdlJvdW5kKCBwYXJhbXNbMF0gKSAtIDE7CisgICAgICAgICAgICBpbnQgZXRhbG9uSGVpZ2h0ID0gY3ZSb3VuZCggcGFyYW1zWzFdICkgLSAxOworICAgICAgICAgICAgaW50IHgsIHksIGsgPSAwOworCisgICAgICAgICAgICBldGFsb25QYXJhbXNbMF0gPSBldGFsb25XaWR0aDsKKyAgICAgICAgICAgIGV0YWxvblBhcmFtc1sxXSA9IGV0YWxvbkhlaWdodDsKKyAgICAgICAgICAgIGV0YWxvblBhcmFtc1syXSA9IHBhcmFtc1syXTsKKworICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IGV0YWxvbkhlaWdodDsgeSsrICkKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgZXRhbG9uV2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBldGFsb25Qb2ludHNbaysrXSA9IGN2UG9pbnQyRDMyZiggKGV0YWxvbldpZHRoIC0gMSAtIHgpKnBhcmFtc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkqcGFyYW1zWzJdICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDVl9DQUxJQl9FVEFMT05fVVNFUjoKKyAgICAgICAgbWVtY3B5KCBldGFsb25QYXJhbXMsIHBhcmFtcywgYXJyU2l6ZSApOworICAgICAgICBtZW1jcHkoIGV0YWxvblBvaW50cywgcG9pbnRzLCBhcnJTaXplICk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworQ3ZDYWxpYkV0YWxvblR5cGUKK0N2Q2FsaWJGaWx0ZXI6OkdldEV0YWxvbiggaW50KiBwYXJhbUNvdW50LCBjb25zdCBkb3VibGUqKiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcG9pbnRDb3VudCwgY29uc3QgQ3ZQb2ludDJEMzJmKiogcG9pbnRzICkgY29uc3QKK3sKKyAgICBpZiggcGFyYW1Db3VudCApCisgICAgICAgICpwYXJhbUNvdW50ID0gZXRhbG9uUGFyYW1Db3VudDsKKworICAgIGlmKCBwYXJhbXMgKQorICAgICAgICAqcGFyYW1zID0gZXRhbG9uUGFyYW1zOworCisgICAgaWYoIHBvaW50Q291bnQgKQorICAgICAgICAqcG9pbnRDb3VudCA9IGV0YWxvblBvaW50Q291bnQ7CisKKyAgICBpZiggcG9pbnRzICkKKyAgICAgICAgKnBvaW50cyA9IGV0YWxvblBvaW50czsKKworICAgIHJldHVybiBldGFsb25UeXBlOworfQorCisKK3ZvaWQgQ3ZDYWxpYkZpbHRlcjo6U2V0Q2FtZXJhQ291bnQoIGludCBjb3VudCApCit7CisgICAgU3RvcCgpOworICAgIAorICAgIGlmKCBjb3VudCAhPSBjYW1lcmFDb3VudCApCisgICAgeworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNhbWVyYUNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoIHBvaW50cyArIGkgKTsKKyAgICAgICAgICAgIGN2RnJlZSggbGF0ZXN0UG9pbnRzICsgaSApOworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmdW5kaXN0TWFwW2ldWzBdICk7CisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZ1bmRpc3RNYXBbaV1bMV0gKTsKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnJlY3RNYXBbaV1bMF0gKTsKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnJlY3RNYXBbaV1bMV0gKTsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCggbGF0ZXN0Q291bnRzLCAwLCBzaXplb2YobGF0ZXN0UG9pbnRzKSApOworICAgICAgICBtYXhQb2ludHMgPSAwOworICAgICAgICBjYW1lcmFDb3VudCA9IGNvdW50OworICAgIH0KK30KKworICAgCitib29sIEN2Q2FsaWJGaWx0ZXI6OlNldEZyYW1lcyggaW50IGZyYW1lcyApCit7CisgICAgaWYoIGZyYW1lcyA8IDUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGZyYW1lc1RvdGFsID0gZnJhbWVzOworICAgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQgQ3ZDYWxpYkZpbHRlcjo6U3RvcCggYm9vbCBjYWxpYnJhdGUgKQoreworICAgIGludCBpLCBqOworICAgIGlzQ2FsaWJyYXRlZCA9IGZhbHNlOworCisgICAgLy8gZGVhbGxvY2F0ZSB1bmRpc3RvcnRpb24gbWFwcworICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnVuZGlzdE1hcFtpXVswXSApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZ1bmRpc3RNYXBbaV1bMV0gKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmcmVjdE1hcFtpXVswXSApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZyZWN0TWFwW2ldWzFdICk7CisgICAgfQorCisgICAgaWYoIGNhbGlicmF0ZSAmJiBmcmFtZXNBY2NlcHRlZCA+IDAgKQorICAgIHsKKyAgICAgICAgaW50IG4gPSBmcmFtZXNBY2NlcHRlZDsKKyAgICAgICAgQ3ZQb2ludDNEMzJmKiBidWZmZXIgPQorICAgICAgICAgICAgKEN2UG9pbnQzRDMyZiopY3ZBbGxvYyggbiAqIGV0YWxvblBvaW50Q291bnQgKiBzaXplb2YoYnVmZmVyWzBdKSk7CisgICAgICAgIEN2TWF0IG1hdDsKKyAgICAgICAgZmxvYXQqIHJvdE1hdHIgPSAoZmxvYXQqKWN2QWxsb2MoIG4gKiA5ICogc2l6ZW9mKHJvdE1hdHJbMF0pKTsKKyAgICAgICAgZmxvYXQqIHRyYW5zVmVjdCA9IChmbG9hdCopY3ZBbGxvYyggbiAqIDMgKiBzaXplb2YodHJhbnNWZWN0WzBdKSk7CisgICAgICAgIGludCogY291bnRzID0gKGludCopY3ZBbGxvYyggbiAqIHNpemVvZihjb3VudHNbMF0pKTsKKworICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZtYXQsIDEsIHNpemVvZihDdkNhbWVyYSkvc2l6ZW9mKGZsb2F0KSwgQ1ZfMzJGQzEsIDAgKTsKKyAgICAgICAgbWVtc2V0KCBjYW1lcmFQYXJhbXMsIDAsIGNhbWVyYUNvdW50ICogc2l6ZW9mKGNhbWVyYVBhcmFtc1swXSkpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBmcmFtZXNBY2NlcHRlZDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnRzW2ldID0gZXRhbG9uUG9pbnRDb3VudDsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBldGFsb25Qb2ludENvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpICogZXRhbG9uUG9pbnRDb3VudCArIGpdID0gY3ZQb2ludDNEMzJmKCBldGFsb25Qb2ludHNbal0ueCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhbG9uUG9pbnRzW2pdLnksIDAgKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZDYWxpYnJhdGVDYW1lcmEoIGZyYW1lc0FjY2VwdGVkLCBjb3VudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nU2l6ZSwgcG9pbnRzW2ldLCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhUGFyYW1zW2ldLmRpc3RvcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhUGFyYW1zW2ldLm1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3QsIHJvdE1hdHIsIDAgKTsKKworICAgICAgICAgICAgY2FtZXJhUGFyYW1zW2ldLmltZ1NpemVbMF0gPSAoZmxvYXQpaW1nU2l6ZS53aWR0aDsKKyAgICAgICAgICAgIGNhbWVyYVBhcmFtc1tpXS5pbWdTaXplWzFdID0gKGZsb2F0KWltZ1NpemUuaGVpZ2h0OworICAgICAgICAgICAgCisvLyAgICAgICAgICAgIGNhbWVyYVBhcmFtc1tpXS5mb2NhbExlbmd0aFswXSA9IGNhbWVyYVBhcmFtc1tpXS5tYXRyaXhbMF07CisvLyAgICAgICAgICAgIGNhbWVyYVBhcmFtc1tpXS5mb2NhbExlbmd0aFsxXSA9IGNhbWVyYVBhcmFtc1tpXS5tYXRyaXhbNF07CisKKy8vICAgICAgICAgICAgY2FtZXJhUGFyYW1zW2ldLnByaW5jaXBhbFBvaW50WzBdID0gY2FtZXJhUGFyYW1zW2ldLm1hdHJpeFsyXTsKKy8vICAgICAgICAgICAgY2FtZXJhUGFyYW1zW2ldLnByaW5jaXBhbFBvaW50WzFdID0gY2FtZXJhUGFyYW1zW2ldLm1hdHJpeFs1XTsKKworICAgICAgICAgICAgbWVtY3B5KCBjYW1lcmFQYXJhbXNbaV0ucm90TWF0ciwgcm90TWF0ciwgOSAqIHNpemVvZihyb3RNYXRyWzBdKSk7CisgICAgICAgICAgICBtZW1jcHkoIGNhbWVyYVBhcmFtc1tpXS50cmFuc1ZlY3QsIHRyYW5zVmVjdCwgMyAqIHNpemVvZih0cmFuc1ZlY3RbMF0pKTsKKworICAgICAgICAgICAgbWF0LmRhdGEucHRyID0gKHVjaGFyKikoY2FtZXJhUGFyYW1zICsgaSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGNoZWNrIHJlc3VsdGFudCBjYW1lcmEgcGFyYW1ldGVyczogaWYgdGhlcmUgYXJlIHNvbWUgSU5GJ3Mgb3IgTkFOJ3MsCisgICAgICAgICAgICAgICBzdG9wIGFuZCByZXNldCByZXN1bHRzICovCisgICAgICAgICAgICBpZiggIWN2Q2hlY2tBcnIoICZtYXQsIENWX0NIRUNLX1JBTkdFIHwgQ1ZfQ0hFQ0tfUVVJRVQsIC0xMDAwMCwgMTAwMDAgKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisKKworICAgICAgICBpc0NhbGlicmF0ZWQgPSBpID09IGNhbWVyYUNvdW50OworCisgICAgICAgIHsvKiBjYWxpYnJhdGUgc3RlcmVvIGNhbWVyYXMgKi8KKyAgICAgICAgICAgIGlmKCBjYW1lcmFDb3VudCA9PSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGVyZW8uY2FtZXJhWzBdID0gJmNhbWVyYVBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICBzdGVyZW8uY2FtZXJhWzFdID0gJmNhbWVyYVBhcmFtc1sxXTsKKworICAgICAgICAgICAgICAgIGljdlN0ZXJlb0NhbGlicmF0aW9uKCBmcmFtZXNBY2NlcHRlZCwgY291bnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbMF0scG9pbnRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGVyZW8pOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDk7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGVyZW8uZnVuZE1hdHJbaV0gPSBzdGVyZW8uZnVuZE1hdHJbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgY3ZGcmVlKCAmY291bnRzICk7CisgICAgICAgIGN2RnJlZSggJnJvdE1hdHIgKTsKKyAgICAgICAgY3ZGcmVlKCAmdHJhbnNWZWN0ICk7CisgICAgfQorCisgICAgZnJhbWVzQWNjZXB0ZWQgPSAwOworfQorCisKK2Jvb2wgQ3ZDYWxpYkZpbHRlcjo6RmluZEV0YWxvbiggSXBsSW1hZ2UqKiBpbWdzICkKK3sKKyAgICByZXR1cm4gRmluZEV0YWxvbiggKEN2TWF0KiopaW1ncyApOworfQorCisKK2Jvb2wgQ3ZDYWxpYkZpbHRlcjo6RmluZEV0YWxvbiggQ3ZNYXQqKiBtYXRzICkKK3sKKyAgICBib29sIHJlc3VsdCA9IHRydWU7CisKKyAgICBpZiggIW1hdHMgfHwgZXRhbG9uUG9pbnRDb3VudCA9PSAwICkKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYoIHJlc3VsdCApCisgICAgeworICAgICAgICBpbnQgaSwgdGVtcFBvaW50Q291bnQwID0gZXRhbG9uUG9pbnRDb3VudCoyOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFsYXRlc3RQb2ludHNbaV0gKQorICAgICAgICAgICAgICAgIGxhdGVzdFBvaW50c1tpXSA9IChDdlBvaW50MkQzMmYqKQorICAgICAgICAgICAgICAgICAgICBjdkFsbG9jKCB0ZW1wUG9pbnRDb3VudDAqMipzaXplb2YobGF0ZXN0UG9pbnRzWzBdKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FtZXJhQ291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U2l6ZSBzaXplOworICAgICAgICAgICAgaW50IHRlbXBQb2ludENvdW50ID0gdGVtcFBvaW50Q291bnQwOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiggIUNWX0lTX01BVChtYXRzW2ldKSAmJiAhQ1ZfSVNfSU1BR0UobWF0c1tpXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzaXplID0gY3ZHZXRTaXplKG1hdHNbaV0pOworCisgICAgICAgICAgICBpZiggc2l6ZS53aWR0aCAhPSBpbWdTaXplLndpZHRoIHx8IHNpemUuaGVpZ2h0ICE9IGltZ1NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbWdTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFncmF5SW1nIHx8IGdyYXlJbWctPndpZHRoICE9IGltZ1NpemUud2lkdGggfHwKKyAgICAgICAgICAgICAgICBncmF5SW1nLT5oZWlnaHQgIT0gaW1nU2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJmdyYXlJbWcgKTsKKyAgICAgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wSW1nICk7CisgICAgICAgICAgICAgICAgZ3JheUltZyA9IGN2Q3JlYXRlTWF0KCBpbWdTaXplLmhlaWdodCwgaW1nU2l6ZS53aWR0aCwgQ1ZfOFVDMSApOworICAgICAgICAgICAgICAgIHRlbXBJbWcgPSBjdkNyZWF0ZU1hdCggaW1nU2l6ZS5oZWlnaHQsIGltZ1NpemUud2lkdGgsIENWXzhVQzEgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgICAgICAgICBzdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCk7CisKKyAgICAgICAgICAgIHN3aXRjaCggZXRhbG9uVHlwZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENWX0NBTElCX0VUQUxPTl9DSEVTU0JPQVJEOgorICAgICAgICAgICAgICAgIGlmKCBDVl9NQVRfQ04oY3ZHZXRFbGVtVHlwZShtYXRzW2ldKSkgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIGN2Q29weSggbWF0c1tpXSwgZ3JheUltZyApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgY3ZDdnRDb2xvciggbWF0c1tpXSwgZ3JheUltZywgQ1ZfQkdSMkdSQVkgKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IGN2RmluZENoZXNzQm9hcmRDb3JuZXJHdWVzc2VzKCBncmF5SW1nLCB0ZW1wSW1nLCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSggY3ZSb3VuZChldGFsb25QYXJhbXNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQoZXRhbG9uUGFyYW1zWzFdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0UG9pbnRzW2ldLCAmdGVtcFBvaW50Q291bnQgKSAhPSAwOworICAgICAgICAgICAgICAgIGlmKCBmb3VuZCApCisgICAgICAgICAgICAgICAgICAgIGN2RmluZENvcm5lclN1YlBpeCggZ3JheUltZywgbGF0ZXN0UG9pbnRzW2ldLCB0ZW1wUG9pbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoNSw1KSwgY3ZTaXplKC0xLC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlRlcm1Dcml0ZXJpYShDVl9URVJNQ1JJVF9JVEVSfENWX1RFUk1DUklUX0VQUywxMCwwLjEpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsYXRlc3RDb3VudHNbaV0gPSBmb3VuZCA/IHRlbXBQb2ludENvdW50IDogLXRlbXBQb2ludENvdW50OworICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICYmIGZvdW5kOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHN0b3JhZ2UgKQorICAgICAgICBjdkNsZWFyTWVtU3RvcmFnZSggc3RvcmFnZSApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sIEN2Q2FsaWJGaWx0ZXI6OlB1c2goIGNvbnN0IEN2UG9pbnQyRDMyZioqIHB0cyApCit7CisgICAgYm9vbCByZXN1bHQgPSB0cnVlOworICAgIGludCBpLCBuZXdNYXhQb2ludHMgPSBldGFsb25Qb2ludENvdW50KihNQVgoZnJhbWVzQWNjZXB0ZWQsZnJhbWVzVG90YWwpICsgMSk7CisKKyAgICBpc0NhbGlicmF0ZWQgPSBmYWxzZTsKKworICAgIGlmKCAhcHRzICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICAgICAgICAgIGlmKCBsYXRlc3RDb3VudHNbaV0gPD0gMCApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBwdHMgPSAoY29uc3QgQ3ZQb2ludDJEMzJmKiopbGF0ZXN0UG9pbnRzOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAhcHRzW2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggbWF4UG9pbnRzIDwgbmV3TWF4UG9pbnRzICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwcmV2ID0gcG9pbnRzW2ldOworICAgICAgICAgICAgY3ZGcmVlKCBwb2ludHMgKyBpICk7CisgICAgICAgICAgICBwb2ludHNbaV0gPSAoQ3ZQb2ludDJEMzJmKiljdkFsbG9jKCBuZXdNYXhQb2ludHMgKiBzaXplb2YocHJldlswXSkpOworICAgICAgICAgICAgbWVtY3B5KCBwb2ludHNbaV0sIHByZXYsIG1heFBvaW50cyAqIHNpemVvZihwcmV2WzBdKSk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoIHBvaW50c1tpXSArIGZyYW1lc0FjY2VwdGVkKmV0YWxvblBvaW50Q291bnQsIHB0c1tpXSwKKyAgICAgICAgICAgICAgICBldGFsb25Qb2ludENvdW50KnNpemVvZihwb2ludHNbMF1bMF0pKTsKKyAgICB9CisKKyAgICBpZiggbWF4UG9pbnRzIDwgbmV3TWF4UG9pbnRzICkKKyAgICAgICAgbWF4UG9pbnRzID0gbmV3TWF4UG9pbnRzOworCisgICAgcmVzdWx0ID0gaSA9PSBjYW1lcmFDb3VudDsKKworICAgIGlmKCArK2ZyYW1lc0FjY2VwdGVkID49IGZyYW1lc1RvdGFsICkKKyAgICAgICAgU3RvcCggdHJ1ZSApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCBDdkNhbGliRmlsdGVyOjpHZXRMYXRlc3RQb2ludHMoIGludCBpZHgsIEN2UG9pbnQyRDMyZioqIHB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNvdW50LCBib29sKiBmb3VuZCApCit7CisgICAgaW50IG47CisgICAgCisgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKWNhbWVyYUNvdW50IHx8CisgICAgICAgICFwdHMgfHwgIWNvdW50IHx8ICFmb3VuZCApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgbiA9IGxhdGVzdENvdW50c1tpZHhdOworICAgIAorICAgICpmb3VuZCA9IG4gPiAwOworICAgICpjb3VudCA9IGFicyhuKTsKKyAgICAqcHRzID0gbGF0ZXN0UG9pbnRzW2lkeF07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCit2b2lkIEN2Q2FsaWJGaWx0ZXI6OkRyYXdQb2ludHMoIElwbEltYWdlKiogZHN0ICkKK3sKKyAgICBEcmF3UG9pbnRzKCAoQ3ZNYXQqKilkc3QgKTsKK30KKworCit2b2lkIEN2Q2FsaWJGaWx0ZXI6OkRyYXdQb2ludHMoIEN2TWF0KiogZHN0YXJyICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGlmKCAhZHN0YXJyICkKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmKCBsYXRlc3RDb3VudHMgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNhbWVyYUNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZHN0YXJyW2ldICYmIGxhdGVzdENvdW50c1tpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZNYXQgZHN0X3N0dWIsICpkc3Q7CisgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBwdHMgPSAwOworCisgICAgICAgICAgICAgICAgR2V0TGF0ZXN0UG9pbnRzKCBpLCAmcHRzLCAmY291bnQsICZmb3VuZCApOworCisgICAgICAgICAgICAgICAgZHN0ID0gY3ZHZXRNYXQoIGRzdGFycltpXSwgJmRzdF9zdHViICk7CisKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgQ3ZTY2FsYXIgbGluZV9jb2xvcnNbXSA9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB7ezAsMCwyNTV9fSwKKyAgICAgICAgICAgICAgICAgICAge3swLDEyOCwyNTV9fSwKKyAgICAgICAgICAgICAgICAgICAge3swLDIwMCwyMDB9fSwKKyAgICAgICAgICAgICAgICAgICAge3swLDI1NSwwfX0sCisgICAgICAgICAgICAgICAgICAgIHt7MjAwLDIwMCwwfX0sCisgICAgICAgICAgICAgICAgICAgIHt7MjU1LDAsMH19LAorICAgICAgICAgICAgICAgICAgICB7ezI1NSwwLDI1NX19CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGNvbnN0IGludCBjb2xvckNvdW50ID0gc2l6ZW9mKGxpbmVfY29sb3JzKS9zaXplb2YobGluZV9jb2xvcnNbMF0pOworICAgICAgICAgICAgICAgIGNvbnN0IGludCByID0gNDsKKyAgICAgICAgICAgICAgICBDdlNjYWxhciBjb2xvciA9IGxpbmVfY29sb3JzWzBdOworICAgICAgICAgICAgICAgIEN2UG9pbnQgcHJldl9wdCA9IHsgMCwgMH07CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdlBvaW50IHB0OworICAgICAgICAgICAgICAgICAgICBwdC54ID0gY3ZSb3VuZChwdHNbal0ueCk7CisgICAgICAgICAgICAgICAgICAgIHB0LnkgPSBjdlJvdW5kKHB0c1tqXS55KTsKKworICAgICAgICAgICAgICAgICAgICBpZiggZm91bmQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZXRhbG9uVHlwZSA9PSBDVl9DQUxJQl9FVEFMT05fQ0hFU1NCT0FSRCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBsaW5lX2NvbG9yc1soai9jdlJvdW5kKGV0YWxvblBhcmFtc1swXSkpJWNvbG9yQ291bnRdOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ1ZfUkdCKDAsMjU1LDApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaiAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkxpbmUoIGRzdCwgcHJldl9wdCwgcHQsIGNvbG9yLCAxLCBDVl9BQSApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY3ZMaW5lKCBkc3QsIGN2UG9pbnQoIHB0LnggLSByLCBwdC55IC0gciApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2UG9pbnQoIHB0LnggKyByLCBwdC55ICsgciApLCBjb2xvciwgMSwgQ1ZfQUEgKTsKKworICAgICAgICAgICAgICAgICAgICBjdkxpbmUoIGRzdCwgY3ZQb2ludCggcHQueCAtIHIsIHB0LnkgKyByKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlBvaW50KCBwdC54ICsgciwgcHQueSAtIHIpLCBjb2xvciwgMSwgQ1ZfQUEgKTsKKworICAgICAgICAgICAgICAgICAgICBjdkNpcmNsZSggZHN0LCBwdCwgcisxLCBjb2xvciwgMSwgQ1ZfQUEgKTsKKworICAgICAgICAgICAgICAgICAgICBwcmV2X3B0ID0gcHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8qIEdldCB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIGFuZCBhbHJlYWR5IGFjY2VwdGVkIHBhaXIgb2YgZnJhbWVzICovCitpbnQgQ3ZDYWxpYkZpbHRlcjo6R2V0RnJhbWVDb3VudCggaW50KiB0b3RhbCApIGNvbnN0Cit7CisgICAgaWYoIHRvdGFsICkKKyAgICAgICAgKnRvdGFsID0gZnJhbWVzVG90YWw7CisKKyAgICByZXR1cm4gZnJhbWVzQWNjZXB0ZWQ7Cit9CisKKworLyogR2V0IGNhbWVyYSBwYXJhbWV0ZXJzIGZvciBzcGVjaWZpZWQgY2FtZXJhLiBJZiBjYW1lcmEgaXMgbm90IGNhbGlicmF0ZWQKKyAgIHRoZSBmdW5jdGlvbiByZXR1cm5zIDAgKi8KK2NvbnN0IEN2Q2FtZXJhKiBDdkNhbGliRmlsdGVyOjpHZXRDYW1lcmFQYXJhbXMoIGludCBpZHggKSBjb25zdAoreworICAgIGlmKCAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZCljYW1lcmFDb3VudCApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gaXNDYWxpYnJhdGVkID8gY2FtZXJhUGFyYW1zICsgaWR4IDogMDsKK30KKworCisvKiBHZXQgY2FtZXJhIHBhcmFtZXRlcnMgZm9yIHNwZWNpZmllZCBjYW1lcmEuIElmIGNhbWVyYSBpcyBub3QgY2FsaWJyYXRlZAorICAgdGhlIGZ1bmN0aW9uIHJldHVybnMgMCAqLworY29uc3QgQ3ZTdGVyZW9DYW1lcmEqIEN2Q2FsaWJGaWx0ZXI6OkdldFN0ZXJlb1BhcmFtcygpIGNvbnN0Cit7CisgICAgaWYoICEoaXNDYWxpYnJhdGVkICYmIGNhbWVyYUNvdW50ID09IDIpICkKKyAgICB7CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiAmc3RlcmVvOworfQorCisKKy8qIFNldHMgY2FtZXJhIHBhcmFtZXRlcnMgZm9yIGFsbCBjYW1lcmFzICovCitib29sIEN2Q2FsaWJGaWx0ZXI6OlNldENhbWVyYVBhcmFtcyggQ3ZDYW1lcmEqIHBhcmFtcyApCit7CisgICAgQ3ZNYXQgbWF0OworICAgIGludCBhcnJTaXplOworICAgIAorICAgIFN0b3AoKTsKKyAgICAKKyAgICBpZiggIXBhcmFtcyApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhcnJTaXplID0gY2FtZXJhQ291bnQgKiBzaXplb2YocGFyYW1zWzBdKTsKKworICAgIGN2SW5pdE1hdEhlYWRlciggJm1hdCwgMSwgY2FtZXJhQ291bnQgKiAoYXJyU2l6ZS9zaXplb2YoZmxvYXQpKSwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyRkMxLCBwYXJhbXMgKTsKKyAgICBjdkNoZWNrQXJyKCAmbWF0LCBDVl9DSEVDS19SQU5HRSwgLTEwMDAwLCAxMDAwMCApOworCisgICAgbWVtY3B5KCBjYW1lcmFQYXJhbXMsIHBhcmFtcywgYXJyU2l6ZSApOworICAgIGlzQ2FsaWJyYXRlZCA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEN2Q2FsaWJGaWx0ZXI6OlNhdmVDYW1lcmFQYXJhbXMoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBpZiggaXNDYWxpYnJhdGVkICkKKyAgICB7CisgICAgICAgIGludCBpLCBqOworICAgICAgICAKKyAgICAgICAgRklMRSogZiA9IGZvcGVuKCBmaWxlbmFtZSwgInciICk7CisKKyAgICAgICAgaWYoICFmICkgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGZwcmludGYoIGYsICIlZFxuXG4iLCBjYW1lcmFDb3VudCApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjYW1lcmFDb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IChpbnQpKHNpemVvZihjYW1lcmFQYXJhbXNbaV0pL3NpemVvZihmbG9hdCkpOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoIGYsICIlMTUuMTBmICIsICgoZmxvYXQqKShjYW1lcmFQYXJhbXMgKyBpKSlbal0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoIGYsICJcblxuIiApOworICAgICAgICB9CisKKyAgICAgICAgLyogU2F2ZSBzdGVyZW8gcGFyYW1zICovCisKKyAgICAgICAgLyogU2F2ZSBxdWFkICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAyOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlMTUuMTBmICIsIHN0ZXJlby5xdWFkW2ldW2pdLnggKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGYsICIlMTUuMTBmICIsIHN0ZXJlby5xdWFkW2ldW2pdLnkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXZlIGNvZWZmcyAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDk7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnByaW50ZihmLCAiJTE1LjEwbGYgIiwgc3RlcmVvLmNvZWZmc1tpXVtqLzNdW2olM10gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZwcmludGYoZiwgIlxuIik7CisgICAgICAgIH0KKworCisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDdkNhbGliRmlsdGVyOjpMb2FkQ2FtZXJhUGFyYW1zKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgaW50IGksIGo7CisgICAgaW50IGQgPSAwOworICAgIEZJTEUqIGYgPSBmb3BlbiggZmlsZW5hbWUsICJyIiApOworCisgICAgaXNDYWxpYnJhdGVkID0gZmFsc2U7CisKKyAgICBpZiggIWYgKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiggZnNjYW5mKCBmLCAiJWQiLCAmZCApICE9IDEgfHwgZCA8PSAwIHx8IGQgPiAxMCApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFNldENhbWVyYUNvdW50KCBkICk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IGNhbWVyYUNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IChpbnQpKHNpemVvZihjYW1lcmFQYXJhbXNbaV0pL3NpemVvZihmbG9hdCkpOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmc2NhbmYoIGYsICIlZiIsICYoKGZsb2F0KikoY2FtZXJhUGFyYW1zICsgaSkpW2pdICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIExvYWQgc3RlcmVvIHBhcmFtcyAqLworCisgICAgLyogbG9hZCBxdWFkICovCisgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZnNjYW5mKGYsICIlZiAiLCAmKHN0ZXJlby5xdWFkW2ldW2pdLngpICk7CisgICAgICAgICAgICBmc2NhbmYoZiwgIiVmICIsICYoc3RlcmVvLnF1YWRbaV1bal0ueSkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIExvYWQgY29lZmZzICovCisgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgOTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZnNjYW5mKGYsICIlbGYgIiwgJihzdGVyZW8uY29lZmZzW2ldW2ovM11baiUzXSkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAKKyAgICAKKyAgICAKKyAgICBmY2xvc2UoZik7CisKKyAgICBzdGVyZW8ud2FycFNpemUgPSBjdlNpemUoIGN2Um91bmQoY2FtZXJhUGFyYW1zWzBdLmltZ1NpemVbMF0pLCBjdlJvdW5kKGNhbWVyYVBhcmFtc1swXS5pbWdTaXplWzFdKSk7CisKKyAgICBpc0NhbGlicmF0ZWQgPSB0cnVlOworICAgIAorICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ3ZDYWxpYkZpbHRlcjo6UmVjdGlmeSggSXBsSW1hZ2UqKiBzcmNhcnIsIElwbEltYWdlKiogZHN0YXJyICkKK3sKKyAgICByZXR1cm4gUmVjdGlmeSggKEN2TWF0Kiopc3JjYXJyLCAoQ3ZNYXQqKilkc3RhcnIgKTsKK30KKworYm9vbCBDdkNhbGliRmlsdGVyOjpSZWN0aWZ5KCBDdk1hdCoqIHNyY2FyciwgQ3ZNYXQqKiBkc3RhcnIgKQoreworICAgIGludCBpOworCisgICAgaWYoICFzcmNhcnIgfHwgIWRzdGFyciApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiggaXNDYWxpYnJhdGVkICYmIGNhbWVyYUNvdW50ID09IDIgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNhbWVyYUNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3JjYXJyW2ldICYmIGRzdGFycltpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSXBsSW1hZ2Ugc3JjX3N0dWIsICpzcmM7CisgICAgICAgICAgICAgICAgSXBsSW1hZ2UgZHN0X3N0dWIsICpkc3Q7CisKKyAgICAgICAgICAgICAgICBzcmMgPSBjdkdldEltYWdlKCBzcmNhcnJbaV0sICZzcmNfc3R1YiApOworICAgICAgICAgICAgICAgIGRzdCA9IGN2R2V0SW1hZ2UoIGRzdGFycltpXSwgJmRzdF9zdHViICk7CisKKyAgICAgICAgICAgICAgICBpZiggc3JjLT5pbWFnZURhdGEgPT0gZHN0LT5pbWFnZURhdGEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICF1bmRpc3RJbWcgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZGlzdEltZy0+d2lkdGggIT0gc3JjLT53aWR0aCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgdW5kaXN0SW1nLT5oZWlnaHQgIT0gc3JjLT5oZWlnaHQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX01BVF9DTih1bmRpc3RJbWctPnR5cGUpICE9IHNyYy0+bkNoYW5uZWxzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmdW5kaXN0SW1nICk7CisgICAgICAgICAgICAgICAgICAgICAgICB1bmRpc3RJbWcgPSBjdkNyZWF0ZU1hdCggc3JjLT5oZWlnaHQsIHNyYy0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfOFUgKyAoc3JjLT5uQ2hhbm5lbHMtMSkqOCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN2Q29weSggc3JjLCB1bmRpc3RJbWcgKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gY3ZHZXRJbWFnZSggdW5kaXN0SW1nLCAmc3JjX3N0dWIgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjdlplcm8oIGRzdCApOworCisgICAgICAgICAgICAgICAgaWYoICFyZWN0TWFwW2ldWzBdIHx8IHJlY3RNYXBbaV1bMF0tPndpZHRoICE9IHNyYy0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgcmVjdE1hcFtpXVswXS0+aGVpZ2h0ICE9IHNyYy0+aGVpZ2h0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnJlY3RNYXBbaV1bMF0gKTsKKyAgICAgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmcmVjdE1hcFtpXVsxXSApOworICAgICAgICAgICAgICAgICAgICByZWN0TWFwW2ldWzBdID0gY3ZDcmVhdGVNYXQoc3RlcmVvLndhcnBTaXplLmhlaWdodCxzdGVyZW8ud2FycFNpemUud2lkdGgsQ1ZfMzJGQzEpOworICAgICAgICAgICAgICAgICAgICByZWN0TWFwW2ldWzFdID0gY3ZDcmVhdGVNYXQoc3RlcmVvLndhcnBTaXplLmhlaWdodCxzdGVyZW8ud2FycFNpemUud2lkdGgsQ1ZfMzJGQzEpOworICAgICAgICAgICAgICAgICAgICBjdkNvbXB1dGVQZXJzcGVjdGl2ZU1hcChzdGVyZW8uY29lZmZzW2ldLCByZWN0TWFwW2ldWzBdLCByZWN0TWFwW2ldWzFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3ZSZW1hcCggc3JjLCBkc3QsIHJlY3RNYXBbaV1bMF0sIHJlY3RNYXBbaV1bMV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FtZXJhQ291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzcmNhcnJbaV0gIT0gZHN0YXJyW2ldICkKKyAgICAgICAgICAgICAgICBjdkNvcHkoIHNyY2FycltpXSwgZHN0YXJyW2ldICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDdkNhbGliRmlsdGVyOjpVbmRpc3RvcnQoIElwbEltYWdlKiogc3JjYXJyLCBJcGxJbWFnZSoqIGRzdGFyciApCit7CisgICAgcmV0dXJuIFVuZGlzdG9ydCggKEN2TWF0Kiopc3JjYXJyLCAoQ3ZNYXQqKilkc3RhcnIgKTsKK30KKworCitib29sIEN2Q2FsaWJGaWx0ZXI6OlVuZGlzdG9ydCggQ3ZNYXQqKiBzcmNhcnIsIEN2TWF0KiogZHN0YXJyICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCAhc3JjYXJyIHx8ICFkc3RhcnIgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYoIGlzQ2FsaWJyYXRlZCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FtZXJhQ291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzcmNhcnJbaV0gJiYgZHN0YXJyW2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdk1hdCBzcmNfc3R1YiwgKnNyYzsKKyAgICAgICAgICAgICAgICBDdk1hdCBkc3Rfc3R1YiwgKmRzdDsKKworICAgICAgICAgICAgICAgIHNyYyA9IGN2R2V0TWF0KCBzcmNhcnJbaV0sICZzcmNfc3R1YiApOworICAgICAgICAgICAgICAgIGRzdCA9IGN2R2V0TWF0KCBkc3RhcnJbaV0sICZkc3Rfc3R1YiApOworCisgICAgICAgICAgICAgICAgaWYoIHNyYy0+ZGF0YS5wdHIgPT0gZHN0LT5kYXRhLnB0ciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggIXVuZGlzdEltZyB8fCB1bmRpc3RJbWctPndpZHRoICE9IHNyYy0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZGlzdEltZy0+aGVpZ2h0ICE9IHNyYy0+aGVpZ2h0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9BUkVfVFlQRVNfRVEoIHVuZGlzdEltZywgc3JjICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnVuZGlzdEltZyApOworICAgICAgICAgICAgICAgICAgICAgICAgdW5kaXN0SW1nID0gY3ZDcmVhdGVNYXQoIHNyYy0+aGVpZ2h0LCBzcmMtPndpZHRoLCBzcmMtPnR5cGUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGN2Q29weSggc3JjLCB1bmRpc3RJbWcgKTsKKyAgICAgICAgICAgICAgICAgICAgc3JjID0gdW5kaXN0SW1nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIDEKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZNYXQgQSA9IGN2TWF0KCAzLCAzLCBDVl8zMkZDMSwgY2FtZXJhUGFyYW1zW2ldLm1hdHJpeCApOworICAgICAgICAgICAgICAgIEN2TWF0IGsgPSBjdk1hdCggMSwgNCwgQ1ZfMzJGQzEsIGNhbWVyYVBhcmFtc1tpXS5kaXN0b3J0aW9uICk7CisKKyAgICAgICAgICAgICAgICBpZiggIXVuZGlzdE1hcFtpXVswXSB8fCB1bmRpc3RNYXBbaV1bMF0tPndpZHRoICE9IHNyYy0+d2lkdGggfHwKKyAgICAgICAgICAgICAgICAgICAgIHVuZGlzdE1hcFtpXVswXS0+aGVpZ2h0ICE9IHNyYy0+aGVpZ2h0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnVuZGlzdE1hcFtpXVswXSApOworICAgICAgICAgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZ1bmRpc3RNYXBbaV1bMV0gKTsKKyAgICAgICAgICAgICAgICAgICAgdW5kaXN0TWFwW2ldWzBdID0gY3ZDcmVhdGVNYXQoIHNyYy0+aGVpZ2h0LCBzcmMtPndpZHRoLCBDVl8zMkZDMSApOworICAgICAgICAgICAgICAgICAgICB1bmRpc3RNYXBbaV1bMV0gPSBjdkNyZWF0ZU1hdCggc3JjLT5oZWlnaHQsIHNyYy0+d2lkdGgsIENWXzMyRkMxICk7CisgICAgICAgICAgICAgICAgICAgIGN2SW5pdFVuZGlzdG9ydE1hcCggJkEsICZrLCB1bmRpc3RNYXBbaV1bMF0sIHVuZGlzdE1hcFtpXVsxXSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN2UmVtYXAoIHNyYywgZHN0LCB1bmRpc3RNYXBbaV1bMF0sIHVuZGlzdE1hcFtpXVsxXSApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBjdlVuZGlzdG9ydDIoIHNyYywgZHN0LCAmQSwgJmsgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2FtZXJhQ291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzcmNhcnJbaV0gIT0gZHN0YXJyW2ldICkKKyAgICAgICAgICAgICAgICBjdkNvcHkoIHNyY2FycltpXSwgZHN0YXJyW2ldICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2Y2xpcXVlLmNwcCBiL2N2YXV4L3NyYy9jdmNsaXF1ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3ZjhhOQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmNsaXF1ZS5jcHAKQEAgLTAsMCArMSw3MDkgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKyNpZiAwCisKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKworI2luY2x1ZGUgIl9jdnV0aWxzLmgiCisjaW5jbHVkZSAiX2N2d3JhcC5oIgorCisvKnR5cGVkZWYgc3RydWN0IEN2Q2xpcXVlRmluZGVyCit7ICAgCisgICAgQ3ZHcmFwaCogZ3JhcGg7CisgICAgaW50KiogICAgYWRqX21hdHI7CisgICAgaW50IE47IC8vZ3JhcGggc2l6ZQorCisgICAgLy8gc3RhY2tzLCBjb3VudGVycyBldGMvCisgICAgaW50IGs7IC8vc3RhY2sgc2l6ZQorICAgIGludCogY3VycmVudF9jb21wOworICAgIGludCoqIEFsbDsKKyAgICAKKyAgICBpbnQqIG5lOworICAgIGludCogY2U7CisgICAgaW50KiBmaXhwOyAvL25vZGUgd2l0aCBtaW5pbWFsIGRpc2Nvbm5lY3Rpb25zCisgICAgaW50KiBub2Q7CisgICAgaW50KiBzOyAvL2ZvciBzZWxlY3RlZCBjYW5kaWRhdGUKKyAgICBpbnQgc3RhdHVzOworICAgIGludCBiZXN0X3Njb3JlOworCit9IEN2Q2xpcXVlRmluZGVyOworKi8KKworI2RlZmluZSBHTyAxCisjZGVmaW5lIEJBQ0sgMgorI2RlZmluZSBQRVJFQk9SIDMKKyNkZWZpbmUgTkVYVCBQRVJFQk9SCisjZGVmaW5lIEVORCA0CisKKworI2RlZmluZSAgQ1ZfR0VUX0FESl9WVFgoIHZlcnRleCwgZWRnZSApIFwKKyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KGVkZ2UtPnZ0eFswXT09dmVydGV4fHxlZGdlLT52dHhbMV0gPT0gdmVydGV4ICksIFwKKyAgICAoZWRnZS0+dnR4WzBdID09IHZlcnRleCk/ZWRnZS0+dnR4WzFdOmVkZ2UtPnZ0eFswXSAgICAgXAorKQorCisKKyNkZWZpbmUgTlVNQkVSKCB2ICkgKCh2KS0+ZmxhZ3MgPj4gMSApCisKK3ZvaWQgX01hcmtOb2RlcyggQ3ZHcmFwaCogZ3JhcGggKQoreworICAgIC8vc2V0IG51bWJlciBvZiB2ZXJ0aWNlcyB0byB0aGVpciBmbGFncworICAgIGZvciggaW50IGkgPSAwOyBpIDwgZ3JhcGgtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZHcmFwaFZ0eCogdmVyID0gY3ZHZXRHcmFwaFZ0eCggZ3JhcGgsIGkgKTsKKyAgICAgICAgaWYoIHZlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZlci0+ZmxhZ3MgPSBpPDwxOworICAgICAgICB9CisgICAgfSAgCit9CisKK3ZvaWQgX0ZpbGxBZGpNYXRyaXgoIEN2R3JhcGgqIGdyYXBoLCBpbnQqKiBjb25uZWN0ZWQsIGludCByZXZlcnNlICkKK3sKKyAgICAvL2Fzc3VtZSBhbGwgdmVydGljZXMgYXJlIG1hcmtlZAorICAgIGZvciggaW50IGkgPSAwOyBpIDwgZ3JhcGgtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBncmFwaC0+dG90YWw7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbm5lY3RlZFtpXVtqXSA9IDB8cmV2ZXJzZTsKKyAgICAgICAgfSAKKyAgICAgICAgLy9tZW1zZXQoIGNvbm5lY3RlZFtpXSwgMCwgc2l6ZW9mKGludCkqZ3JhcGgtPnRvdGFsICk7CisgICAgICAgIEN2R3JhcGhWdHgqIHZlciA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBpICk7CisgICAgICAgIGlmKCB2ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25uZWN0ZWRbaV1baV0gPSAxOworICAgICAgICAgICAgZm9yKCBDdkdyYXBoRWRnZSogZSA9IHZlci0+Zmlyc3Q7IGUgOyBlID0gQ1ZfTkVYVF9HUkFQSF9FREdFKCBlLCB2ZXIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiB2ID0gQ1ZfR0VUX0FESl9WVFgoIHZlciwgZSApOworICAgICAgICAgICAgICAgY29ubmVjdGVkW2ldW05VTUJFUih2KV0gPSAxXnJldmVyc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBjdlN0YXJ0RmluZENsaXF1ZXMoIEN2R3JhcGgqIGdyYXBoLCBDdkNsaXF1ZUZpbmRlciogZmluZGVyLCBpbnQgcmV2ZXJzZSwgaW50IHdlaWdodGVkLCBpbnQgd2VpZ2h0ZWRfZWRnZXMgKQoreworICAgIGludCBpOworCisgICAgaWYgKHdlaWdodGVkKQorICAgIHsKKyAgICAgICAgZmluZGVyLT53ZWlnaHRlZCA9IDE7CisgICAgICAgIGZpbmRlci0+YmVzdF93ZWlnaHQgPSAwOworICAgICAgICBmaW5kZXItPnZlcnRleF93ZWlnaHRzID0gKGZsb2F0KiltYWxsb2MoIHNpemVvZihmbG9hdCkqKGdyYXBoLT50b3RhbCsxKSk7CisgICAgICAgIGZpbmRlci0+Y3VyX3dlaWdodCA9IChmbG9hdCopbWFsbG9jKCBzaXplb2YoZmxvYXQpKihncmFwaC0+dG90YWwrMSkpOworICAgICAgICBmaW5kZXItPmNhbmRfd2VpZ2h0ID0gKGZsb2F0KiltYWxsb2MoIHNpemVvZihmbG9hdCkqKGdyYXBoLT50b3RhbCsxKSk7CisKKyAgICAgICAgZmluZGVyLT5jdXJfd2VpZ2h0WzBdID0gMDsKKyAgICAgICAgZmluZGVyLT5jYW5kX3dlaWdodFswXSA9IDA7CisgICAgICAgIGZvciggaSA9IDAgOyBpIDwgZ3JhcGgtPnRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkdyYXBoV2VpZ2h0ZWRWdHgqIHZlciA9IChDdkdyYXBoV2VpZ2h0ZWRWdHgqKWN2R2V0R3JhcGhWdHgoIGdyYXBoLCBpICk7CisgICAgICAgICAgICBhc3NlcnQodmVyKTsKKyAgICAgICAgICAgIGFzc2VydCh2ZXItPndlaWdodD49MCk7CisgICAgICAgICAgICBmaW5kZXItPnZlcnRleF93ZWlnaHRzW2ldID0gdmVyLT53ZWlnaHQ7CisgICAgICAgICAgICBmaW5kZXItPmNhbmRfd2VpZ2h0WzBdICs9IHZlci0+d2VpZ2h0OyAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGZpbmRlci0+d2VpZ2h0ZWQgPSAwOworCisgICAgaWYgKHdlaWdodGVkX2VkZ2VzKQorICAgIHsKKyAgICAgICAgZmluZGVyLT53ZWlnaHRlZF9lZGdlcyA9IDE7CisgICAgICAgIC8vZmluZGVyLT5iZXN0X3dlaWdodCA9IDA7CisgICAgICAgIGZpbmRlci0+ZWRnZV93ZWlnaHRzID0gKGZsb2F0KiltYWxsb2MoIHNpemVvZihmbG9hdCkqKGdyYXBoLT50b3RhbCkqKGdyYXBoLT50b3RhbCkpOworICAgICAgICAvL2ZpbmRlci0+Y3VyX3dlaWdodCA9IChmbG9hdCopbWFsbG9jKCBzaXplb2YoZmxvYXQpKihncmFwaC0+dG90YWwrMSkpOworICAgICAgICAvL2ZpbmRlci0+Y2FuZF93ZWlnaHQgPSAoZmxvYXQqKW1hbGxvYyggc2l6ZW9mKGZsb2F0KSooZ3JhcGgtPnRvdGFsKzEpKTsKKworICAgICAgICAvL2ZpbmRlci0+Y3VyX3dlaWdodFswXSA9IDA7CisgICAgICAgIC8vZmluZGVyLT5jYW5kX3dlaWdodFswXSA9IDA7CisgICAgICAgIG1lbXNldCggZmluZGVyLT5lZGdlX3dlaWdodHMsIDAsIHNpemVvZihmbG9hdCkqKGdyYXBoLT50b3RhbCkqKGdyYXBoLT50b3RhbCkgKTsKKyAgICAgICAgZm9yKCBpID0gMCA7IGkgPCBncmFwaC0+dG90YWw7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2R3JhcGhWdHgqIHZlcjEgPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSApOworICAgICAgICAgICAgaWYoIXZlcjEpIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yKCBpbnQgaiA9IGkgOyBqIDwgZ3JhcGgtPnRvdGFsOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIHZlcjIgPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaiApOworICAgICAgICAgICAgICAgIGlmKCF2ZXIyKSBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogZWRnZSA9IGN2RmluZEdyYXBoRWRnZUJ5UHRyKCBncmFwaCwgdmVyMSwgdmVyMiApOworICAgICAgICAgICAgICAgIGlmKCBlZGdlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKChDdkdyYXBoV2VpZ2h0ZWRFZGdlKillZGdlKS0+d2VpZ2h0ID49IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5lZGdlX3dlaWdodHNbIGkgKiBncmFwaC0+dG90YWwgKyBqIF0gPSAKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5lZGdlX3dlaWdodHNbIGogKiBncmFwaC0+dG90YWwgKyBpIF0gPSAoKEN2R3JhcGhXZWlnaHRlZEVkZ2UqKWVkZ2UpLT53ZWlnaHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAKKyAgICB9CisgICAgZWxzZSBmaW5kZXItPndlaWdodGVkX2VkZ2VzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworICAgIC8vaW50KiBDb21wc3ViOyAvL2N1cnJlbnQgY29tcG9uZW50ICh2ZXJ0ZXggc3RhY2spCisgICAgZmluZGVyLT5rID0gMDsgLy9jb3VudGVyIG9mIHN0ZXBzCisgICAgaW50IE4gPSBmaW5kZXItPk4gPSBncmFwaC0+dG90YWw7CisgICAgZmluZGVyLT5jdXJyZW50X2NvbXAgPSBuZXcgaW50W05dOworICAgIGZpbmRlci0+QWxsID0gbmV3IGludCpbTl07CisgICAgZm9yKCBpID0gMCA7IGkgPCBmaW5kZXItPk47IGkrKyApCisgICAgeworICAgICAgICBmaW5kZXItPkFsbFtpXSA9IG5ldyBpbnRbTl07CisgICAgfQorCisgICAgZmluZGVyLT5uZSA9IG5ldyBpbnRbTisxXTsKKyAgICBmaW5kZXItPmNlID0gbmV3IGludFtOKzFdOworICAgIGZpbmRlci0+Zml4cCA9IG5ldyBpbnRbTisxXTsgLy9ub2RlIHdpdGggbWluaW1hbCBkaXNjb25uZWN0aW9ucworICAgIGZpbmRlci0+bm9kID0gbmV3IGludFtOKzFdOworICAgIGZpbmRlci0+cyA9IG5ldyBpbnRbTisxXTsgLy9mb3Igc2VsZWN0ZWQgY2FuZGlkYXRlCisgICAgCisgICAgLy9mb3JtIGFkaiBtYXRyaXgKKyAgICBmaW5kZXItPmFkal9tYXRyID0gbmV3IGludCpbTl07IC8vYXNzdW1lIGZpbGxlZCB3aXRoIDAKKyAgICBmb3IoIGkgPSAwIDsgaSA8IE47IGkrKyApCisgICAgeworICAgICAgICBmaW5kZXItPmFkal9tYXRyW2ldID0gbmV3IGludFtOXTsKKyAgICB9CisKKyAgICAvL3NldCBudW1iZXIgdG8gdmVydGljZXMKKyAgICBfTWFya05vZGVzKCBncmFwaCApOworICAgIF9GaWxsQWRqTWF0cml4KCBncmFwaCwgZmluZGVyLT5hZGpfbWF0ciwgcmV2ZXJzZSApOworCisgICAgLy9pbml0IGFsbCBhcnJheXMKKyAgICBpbnQgayA9IGZpbmRlci0+ayA9IDA7IC8vc3RhY2sgc2l6ZQorICAgIG1lbXNldCggZmluZGVyLT5BbGxba10sIDAsIHNpemVvZihpbnQpICogTiApOworICAgIGZvciggaSA9IDA7IGkgPCBOOyBpKysgKSAgZmluZGVyLT5BbGxba11baV0gPSBpOworICAgIGZpbmRlci0+bmVbMF0gPSAwOworICAgIGZpbmRlci0+Y2VbMF0gPSBOOworCisgICAgZmluZGVyLT5zdGF0dXMgPSBHTzsKKyAgICBmaW5kZXItPmJlc3Rfc2NvcmUgPSAwOworCit9ICAgCisKK3ZvaWQgY3ZFbmRGaW5kQ2xpcXVlcyggQ3ZDbGlxdWVGaW5kZXIqIGZpbmRlciApCit7CisgICAgaW50IGk7CisgICAgCisgICAgLy9pbnQqIENvbXBzdWI7IC8vY3VycmVudCBjb21wb25lbnQgKHZlcnRleCBzdGFjaykKKyAgICBkZWxldGUgZmluZGVyLT5jdXJyZW50X2NvbXA7CisgICAgZm9yKCBpID0gMCA7IGkgPCBmaW5kZXItPk47IGkrKyApCisgICAgeworICAgICAgICBkZWxldGUgZmluZGVyLT5BbGxbaV07CisgICAgfQorICAgIGRlbGV0ZSBmaW5kZXItPkFsbDsKKyAgICAKKyAgICBkZWxldGUgZmluZGVyLT5uZTsKKyAgICBkZWxldGUgZmluZGVyLT5jZTsKKyAgICBkZWxldGUgZmluZGVyLT5maXhwOyAvL25vZGUgd2l0aCBtaW5pbWFsIGRpc2Nvbm5lY3Rpb25zCisgICAgZGVsZXRlIGZpbmRlci0+bm9kOworICAgIGRlbGV0ZSBmaW5kZXItPnM7IC8vZm9yIHNlbGVjdGVkIGNhbmRpZGF0ZQorICAgIAorICAgIC8vZGVsZXRlIGFkaiBtYXRyaXgKKyAgICBmb3IoIGkgPSAwIDsgaSA8IGZpbmRlci0+TjsgaSsrICkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBmaW5kZXItPmFkal9tYXRyW2ldOworICAgIH0gIAorICAgIGRlbGV0ZSBmaW5kZXItPmFkal9tYXRyOworICAgIAorICAgIGlmKGZpbmRlci0+d2VpZ2h0ZWQpCisgICAgeworICAgICAgICBmcmVlKGZpbmRlci0+dmVydGV4X3dlaWdodHMpOworICAgICAgICBmcmVlKGZpbmRlci0+Y3VyX3dlaWdodCk7CisgICAgICAgIGZyZWUoZmluZGVyLT5jYW5kX3dlaWdodCk7IAorICAgIH0KKyAgICBpZihmaW5kZXItPndlaWdodGVkX2VkZ2VzKQorICAgIHsKKyAgICAgICAgZnJlZShmaW5kZXItPmVkZ2Vfd2VpZ2h0cyk7CisgICAgfQorfQorCitpbnQgY3ZGaW5kTmV4dE1heGltYWxDbGlxdWUoIEN2Q2xpcXVlRmluZGVyKiBmaW5kZXIgKSAKK3sKKyAgICBpbnQqKiAgY29ubmVjdGVkID0gZmluZGVyLT5hZGpfbWF0cjsKKy8vICAgIGludCBOID0gZmluZGVyLT5OOyAvL2dyYXBoIHNpemUKKworICAgIC8vIHN0YWNrcywgY291bnRlcnMgZXRjLworICAgIGludCBrID0gZmluZGVyLT5rOyAvL3N0YWNrIHNpemUKKyAgICBpbnQqIENvbXBzdWIgPSBmaW5kZXItPmN1cnJlbnRfY29tcDsKKyAgICBpbnQqKiBBbGwgPSBmaW5kZXItPkFsbDsKKyAgICAKKyAgICBpbnQqIG5lID0gZmluZGVyLT5uZTsKKyAgICBpbnQqIGNlID0gZmluZGVyLT5jZTsKKyAgICBpbnQqIGZpeHAgPSBmaW5kZXItPmZpeHA7IC8vbm9kZSB3aXRoIG1pbmltYWwgZGlzY29ubmVjdGlvbnMKKyAgICBpbnQqIG5vZCA9IGZpbmRlci0+bm9kOworICAgIGludCogcyA9IGZpbmRlci0+czsgLy9mb3Igc2VsZWN0ZWQgY2FuZGlkYXRlICAgCisgICAgCisgICAgLy9TVEFSVAorICAgIHdoaWxlKCBrID49IDApCisgICAgeworICAgICAgICBpbnQqIG9sZCA9IEFsbFtrXTsKKyAgICAgICAgc3dpdGNoKGZpbmRlci0+c3RhdHVzKQorICAgICAgICB7ICAgIAorICAgICAgICBjYXNlIEdPOi8vRm9yd2FyZCBzdGVwCisgICAgICAgIC8qIHdlIGhhdmUgYWxsIHNldHMgYW5kIHdpbGwgY2hvb3NlIGZpeGVkIHBvaW50ICovIAorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIC8vY2hlY2sgcG90ZW50aWFsIHNpemUgb2YgY2xpcXVlCisgICAgICAgICAgICAgICAgaWYoICghZmluZGVyLT53ZWlnaHRlZCkgJiYgKGsgKyBjZVtrXSAtIG5lW2tdIDwgZmluZGVyLT5iZXN0X3Njb3JlKSApIAorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5zdGF0dXMgID0gQkFDSzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAvL2NoZWNrIHBvdGVudGlhbCB3ZWlnaHQKKyAgICAgICAgICAgICAgICBpZiggZmluZGVyLT53ZWlnaHRlZCAmJiAhZmluZGVyLT53ZWlnaHRlZF9lZGdlcyAmJgorICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmN1cl93ZWlnaHRba10gKyBmaW5kZXItPmNhbmRfd2VpZ2h0W2tdIDwgZmluZGVyLT5iZXN0X3dlaWdodCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaW5kZXItPnN0YXR1cyAgPSBCQUNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgbWlubm9kID0gY2Vba107CisgICAgICAgICAgICAgICAgbm9kW2tdID0gMDsKKworICAgICAgICAgICAgICAgIC8vZm9yIGV2ZXJ5IHZlcnRleCBvZiBBbGwgZGV0ZXJtaW5lIGNvdW50ZXIgdmFsdWUgYW5kIGNob29zZSBtaW5pbXVtCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBjZVtrXSAmJiBtaW5ub2QgIT0gMDsgaSsrKSAKKyAgICAgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgICAgIGludCBwID0gb2xkW2ldOyAvL2N1cnJlbnQgcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gMDsgIC8vY291bnRlcgorICAgICAgICAgICAgICAgICAgICBpbnQgcG9zID0gMDsKKworICAgICAgICAgICAgICAgICAgICAvKiBDb3VudCBkaXNjb25uZWN0aW9ucyB3aXRoIGNhbmRpZGF0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG5lW2tdOyBqIDwgY2Vba10gJiYgKGNvdW50IDwgbWlubm9kKTsgaisrKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhY29ubmVjdGVkW3BdW29sZFtqXV0gKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgcG9zaXRpb24gb2YgcG90ZW50aWFsIGNhbmRpZGF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGo7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIC8qIFRlc3QgbmV3IG1pbmltdW0gKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50IDwgbWlubm9kKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZml4cFtrXSA9IHA7ICAgICAvL3NldCBjdXJyZW50IHBvaW50IGFzIGZpeGVkCisgICAgICAgICAgICAgICAgICAgICAgICBtaW5ub2QgPSBjb3VudDsgIC8vbmV3IHZhbHVlIGZvciBtaW5ub2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbmVba10pICAgICAgLy9pZiBjdXJyZW50IGZpeGVkIHBvaW50IGJlbG9uZ3MgdG8gJ25vdCcKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2tdID0gcG9zOyAgICAgLy9zIC0gc2VsZWN0ZWQgY2FuZGlkYXRlCisgICAgICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzW2tdID0gaTsgICAgICAgIC8vc2VsZWN0ZWQgY2FuZGlkYXRlIGlzIGZpeGVkIHBvaW50IGl0c2VsZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByZWluY3IgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rba10gPSAxOyAgICAgIC8vbm9kIGlzIGF1eCB2YXJpYWJsZSwgMSBtZWFucyBmaXhwID09IHMKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0vL2ZvcgorCisgICAgICAgICAgICAgICAgbm9kW2tdID0gbWlubm9kICsgbm9kW2tdOworICAgICAgICAgICAgICAgIGZpbmRlci0+c3RhdHVzID0gTkVYVDsvL2dvIHRvIGJhY2t0cmFja2N5Y2xlIAorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTkVYVDoKKyAgICAgICAgICAgIC8vaGVyZSB3ZSB3aWxsIGxvb2sgZm9yIGNhbmRpZGF0ZSB0byB0cmFuc2xhdGUgaW50byBub3QgICAgCisgICAgICAgICAgICAvL3Nba10gbm93IGNvbnRhaW5zIGluZGV4IG9mIGNob29zZW4gY2FuZGlkYXRlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50KiBuZXdfID0gQWxsW2srMV07CisgICAgICAgICAgICAgICAgaWYoIG5vZFtrXSAhPSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vc3dhcCBzZWxlY3RlZCBhbmQgZmlyc3QgY2FuZGlkYXRlCisgICAgICAgICAgICAgICAgICAgIGludCBpLCBwID0gb2xkW3Nba11dOworICAgICAgICAgICAgICAgICAgICBvbGRbc1trXV0gPSBvbGRbbmVba11dOworICAgICAgICAgICAgICAgICAgICBpbnQgc2VsID0gb2xkW25lW2tdXSA9IHA7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld25lID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLy9maWxsIG5ldyBzZXQgJ25vdCcKKyAgICAgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBuZVtrXTsgaSsrKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFtzZWxdW29sZFtpXV0pIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19bbmV3bmVdID0gb2xkW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld25lKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9maWxsIG5ldyBzZXQgJ2NhbmRpZGF0ZScKKyAgICAgICAgICAgICAgICAgICAgaW50IG5ld2NlID0gbmV3bmU7CisgICAgICAgICAgICAgICAgICAgIGkrKzsvL3NraXAgc2VsZWN0ZWQgY2FuZGlkYXRlCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYW5kd2VpZ2h0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBpIDwgY2Vba107IGkrKykgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25uZWN0ZWRbc2VsXVtvbGRbaV1dKSAKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdfW25ld2NlXSA9IG9sZFtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmluZGVyLT53ZWlnaHRlZCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kd2VpZ2h0ICs9IGZpbmRlci0+dmVydGV4X3dlaWdodHNbb2xkW2ldXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Y2UrKzsgCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBub2Rba10tLTsKKworICAgICAgICAgICAgICAgICAgICAvL2FkZCBzZWxlY3RlZCB0byBzdGFjayAKKyAgICAgICAgICAgICAgICAgICAgQ29tcHN1YltrXSA9IHNlbDsKKworICAgICAgICAgICAgICAgICAgICBrKys7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggayA8PSBmaW5kZXItPk4gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZpbmRlci0+d2VpZ2h0ZWQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB3ZWlnaHRzIG9mIGN1cnJlbnQgY2xpcXVlIGFuZCBjYW5kaWRhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmN1cl93ZWlnaHRba10gPSBmaW5kZXItPmN1cl93ZWlnaHRbay0xXSArIGZpbmRlci0+dmVydGV4X3dlaWdodHNbc2VsXTsgCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmNhbmRfd2VpZ2h0W2tdID0gY2FuZHdlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZpbmRlci0+d2VpZ2h0ZWRfZWRnZXMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0b3RhbCB3ZWlnaHQgYnkgZWRnZSB3ZWlnaHRzCisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhZGRlZCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpbmQgPSAwOyBpbmQgPCBrLTE7IGluZCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCArPSBmaW5kZXItPmVkZ2Vfd2VpZ2h0c1sgQ29tcHN1YltpbmRdICogZmluZGVyLT5OICsgc2VsIF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmN1cl93ZWlnaHRba10gKz0gYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvL2NoZWNrIGlmICdub3QnIGFuZCAnY2FuZCcgYXJlIGJvdGggZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5ld2NlID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmJlc3Rfc2NvcmUgPSBNQVgoZmluZGVyLT5iZXN0X3Njb3JlLCBrICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmaW5kZXItPndlaWdodGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5kZXItPmJlc3Rfd2VpZ2h0ID0gTUFYKCBmaW5kZXItPmJlc3Rfd2VpZ2h0LCBmaW5kZXItPmN1cl93ZWlnaHRba10gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qRklMRSogZmlsZSAgPSBmb3BlbigiY2xpcXVlcy50eHQiLCAiYSIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgdD0wOyB0PGs7IHQrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCAiJWQgIiwgQ29tcHN1Ylt0XSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsICJcbiIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAvL291dHB1dCBuZXcgY2xpcXVlLy8qKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRlci0+c3RhdHVzID0gQkFDSzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRlci0+ayA9IGs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDTElRVUVfRk9VTkQ7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vY2hlY2sgbm9uZW1wdHkgc2V0IG9mIGNhbmRpZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5ld25lIDwgbmV3Y2UgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2dvIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lW2tdID0gbmV3bmU7CisgICAgICAgICAgICAgICAgICAgICAgICBjZVtrXSA9IG5ld2NlOworICAgICAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5zdGF0dXMgID0gR087CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5zdGF0dXMgID0gQkFDSzsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBCQUNLOgorICAgICAgICAgICAgeyAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vZGVjcmVhc2Ugc3RhY2sKKyAgICAgICAgICAgICAgICBrLS07ICAgICAgICAgCisgICAgICAgICAgICAgICAgb2xkID0gQWxsW2tdOworICAgICAgICAgICAgICAgIGlmKCBrIDwgMCApIGJyZWFrOworCisgICAgICAgICAgICAgICAgLy9hZGQgdG8gbm90CisgICAgICAgICAgICAgICAgbmVba10rKzsKKworICAgICAgICAgICAgICAgIGlmKCBub2Rba10gPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vc2VsZWN0IG5leHQgY2FuZGlkYXRlCisgICAgICAgICAgICAgICAgICAgIGZvciggc1trXSA9IG5lW2tdOyBzW2tdIDwgY2Vba107IHNba10rKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhY29ubmVjdGVkW2ZpeHBba11dW29sZFtzW2tdXV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBzW2tdIDwgY2Vba10gKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyLT5zdGF0dXMgPSBORVhUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZpbmRlci0+c3RhdHVzID0gQkFDSzsKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRU5EOiBhc3NlcnQoMCk7ICAgICAgIAorCisgICAgICAgIH0KKyAgICB9Ly9lbmQgd2hpbGUKKworICAgIGZpbmRlci0+c3RhdHVzID0gRU5EOworICAgIHJldHVybiBDTElRVUVfRU5EOworfQorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwordm9pZCBjdkJyb25LZXJib3NjaCggQ3ZHcmFwaCogZ3JhcGggKQoreworICAgIGludCogQ29tcHN1YjsgLy9jdXJyZW50IGNvbXBvbmVudCAodmVydGV4IHN0YWNrKQorICAgIGludCBrID0gMDsgLy9jb3VudGVyIG9mIHN0ZXBzCisgICAgaW50IE4gPSBncmFwaC0+dG90YWw7CisgICAgaW50IGk7CisgICAgQ29tcHN1YiA9IG5ldyBpbnRbTl07CisgICAgaW50KiogQWxsID0gbmV3IGludCpbTl07CisgICAgZm9yKCBpID0gMCA7IGkgPCBOOyBpKysgKQorICAgIHsKKyAgICAgICAgQWxsW2ldID0gbmV3IGludFtOXTsKKyAgICB9CisKKyAgICBpbnQqIG5lID0gbmV3IGludFtOXTsKKyAgICBpbnQqIGNlID0gbmV3IGludFtOXTsKKyAgICBpbnQqIGZpeHAgPSBuZXcgaW50W05dOyAvL25vZGUgd2l0aCBtaW5pbWFsIGRpc2Nvbm5lY3Rpb25zCisgICAgaW50KiBub2QgPSBuZXcgaW50W05dOworICAgIGludCogcyA9IG5ldyBpbnRbTl07IC8vZm9yIHNlbGVjdGVkIGNhbmRpZGF0ZQorICAgIAorICAgIC8vZm9ybSBhZGogbWF0cml4CisgICAgaW50KiogY29ubmVjdGVkID0gbmV3IGludCpbTl07IC8vYXNzdW1lIGZpbGxlZCB3aXRoIDAKKyAgICBmb3IoIGkgPSAwIDsgaSA8IE47IGkrKyApCisgICAgeworICAgICAgICBjb25uZWN0ZWRbaV0gPSBuZXcgaW50W05dOworICAgIH0KKworCisKKyAgICAvL3NldCBudW1iZXIgdG8gdmVydGljZXMKKyAgICBfTWFya05vZGVzKCBncmFwaCApOworICAgIF9GaWxsQWRqTWF0cml4KCBncmFwaCwgY29ubmVjdGVkLCAwICk7CisKKyAgICAvL2luaXQgYWxsIGFycmF5cworICAgIGsgPSAwOyAvL3N0YWNrIHNpemUKKyAgICBtZW1zZXQoIEFsbFtrXSwgMCwgc2l6ZW9mKGludCkgKiBOICk7CisgICAgZm9yKCBpID0gMDsgaSA8IE47IGkrKyApICBBbGxba11baV0gPSBpOworICAgIG5lWzBdID0gMDsKKyAgICBjZVswXSA9IE47CisKKyAgICBpbnQgc3RhdHVzID0gR087CisgICAgaW50IGJlc3Rfc2NvcmUgPSAwOworCisgICAgLy9TVEFSVAorICAgIHdoaWxlKCBrID49IDApCisgICAgeworICAgICAgICBpbnQqIG9sZCA9IEFsbFtrXTsKKyAgICAgICAgc3dpdGNoKHN0YXR1cykKKyAgICAgICAgeyAgICAKKyAgICAgICAgY2FzZSBHTzovL0ZvcndhcmQgc3RlcAorICAgICAgICAvKiB3ZSBoYXZlIGFsbCBzZXRzIGFuZCB3aWxsIGNob29zZSBmaXhlZCBwb2ludCAqLyAKKyAgICAgICAgICAgIHsgICAKKworICAgICAgICAgICAgICAgIGlmKCBrICsgY2Vba10gLSBuZVtrXSA8IGJlc3Rfc2NvcmUgKSAKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgPSBCQUNLOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IAorCisgICAgICAgICAgICAgICAgaW50IG1pbm5vZCA9IGNlW2tdOworICAgICAgICAgICAgICAgIG5vZFtrXSA9IDA7CisKKyAgICAgICAgICAgICAgICAvL2ZvciBldmVyeSB2ZXJ0ZXggb2YgQWxsIGRldGVybWluZSBjb3VudGVyIHZhbHVlIGFuZCBjaG9vc2UgbWluaW11bQorICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgY2Vba10gJiYgbWlubm9kICE9IDA7IGkrKykgCisgICAgICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgcCA9IG9sZFtpXTsgLy9jdXJyZW50IHBvaW50CisgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCA9IDA7ICAvL2NvdW50ZXIKKyAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ291bnQgZGlzY29ubmVjdGlvbnMgd2l0aCBjYW5kaWRhdGVzICovCisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBuZVtrXTsgaiA8IGNlW2tdICYmIChjb3VudCA8IG1pbm5vZCk7IGorKykgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIWNvbm5lY3RlZFtwXVtvbGRbal1dICkgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHBvc2l0aW9uIG9mIHBvdGVudGlhbCBjYW5kaWRhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSBqOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAvKiBUZXN0IG5ldyBtaW5pbXVtICovCisgICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA8IG1pbm5vZCkgCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpeHBba10gPSBwOyAgICAgLy9zZXQgY3VycmVudCBwb2ludCBhcyBmaXhlZAorICAgICAgICAgICAgICAgICAgICAgICAgbWlubm9kID0gY291bnQ7ICAvL25ldyB2YWx1ZSBmb3IgbWlubm9kCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IG5lW2tdKSAgICAgIC8vaWYgY3VycmVudCBmaXhlZCBwb2ludCBiZWxvbmdzIHRvICdub3QnCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1trXSA9IHBvczsgICAgIC8vcyAtIHNlbGVjdGVkIGNhbmRpZGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgfSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1trXSA9IGk7ICAgICAgICAvL3NlbGVjdGVkIGNhbmRpZGF0ZSBpcyBmaXhlZCBwb2ludCBpdHNlbGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwcmVpbmNyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kW2tdID0gMTsgICAgICAvL25vZCBpcyBhdXggdmFyaWFibGUsIDEgbWVhbnMgZml4cCA9PSBzCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9Ly9mb3IKKworICAgICAgICAgICAgICAgIG5vZFtrXSA9IG1pbm5vZCArIG5vZFtrXTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBORVhUOy8vZ28gdG8gYmFja3RyYWNrY3ljbGUgCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBORVhUOgorICAgICAgICAgICAgLy9oZXJlIHdlIHdpbGwgbG9vayBmb3IgY2FuZGlkYXRlIHRvIHRyYW5zbGF0ZSBpbnRvIG5vdCAgICAKKyAgICAgICAgICAgIC8vc1trXSBub3cgY29udGFpbnMgaW5kZXggb2YgY2hvb3NlbiBjYW5kaWRhdGUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQqIG5ld18gPSBBbGxbaysxXTsKKyAgICAgICAgICAgICAgICBpZiggbm9kW2tdICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9zd2FwIHNlbGVjdGVkIGFuZCBmaXJzdCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgaW50IHAgPSBvbGRbc1trXV07CisgICAgICAgICAgICAgICAgICAgIG9sZFtzW2tdXSA9IG9sZFtuZVtrXV07CisgICAgICAgICAgICAgICAgICAgIGludCBzZWwgPSBvbGRbbmVba11dID0gcDsKKworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3bmUgPSAwOworICAgICAgICAgICAgICAgICAgICAvL2ZpbGwgbmV3IHNldCAnbm90JworICAgICAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5lW2tdOyBpKyspIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGVkW3NlbF1bb2xkW2ldXSkgCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X1tuZXduZV0gPSBvbGRbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3bmUrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvL2ZpbGwgbmV3IHNldCAnY2FuZGlkYXRlJworICAgICAgICAgICAgICAgICAgICBpbnQgbmV3Y2UgPSBuZXduZTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOy8vc2tpcCBzZWxlY3RlZCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBjZVtrXTsgaSsrKSAKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RlZFtzZWxdW29sZFtpXV0pIAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19bbmV3Y2VdID0gb2xkW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2NlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBub2Rba10tLTsKKworICAgICAgICAgICAgICAgICAgICAvL2FkZCBzZWxlY3RlZCB0byBzdGFjayAKKyAgICAgICAgICAgICAgICAgICAgQ29tcHN1YltrXSA9IHNlbDsKKyAgICAgICAgICAgICAgICAgICAgaysrOworCisgICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgJ25vdCcgYW5kICdjYW5kJyBhcmUgYm90aCBlbXB0eQorICAgICAgICAgICAgICAgICAgICBpZiggbmV3Y2UgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlc3Rfc2NvcmUgPSBNQVgoYmVzdF9zY29yZSwgayApOworCisgICAgICAgICAgICAgICAgICAgICAgICBGSUxFKiBmaWxlICA9IGZvcGVuKCJjbGlxdWVzLnR4dCIsICJhIiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCB0PTA7IHQ8azsgdCsrKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsICIlZCAiLCBDb21wc3ViW3RdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwgIlxuIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLypmb3IoIGludCB0ID0gMDsgdCA8IGs7IHQrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlZCAiLCBDb21wc3ViW3RdICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7ICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCJmb3VuZCAlZFxuIiwgayk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vb3V0cHV0IG5ldyBjbGlxdWUvLyoqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFDSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIC8vY2hlY2sgbm9uZW1wdHkgc2V0IG9mIGNhbmRpZGF0ZXMKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5ld25lIDwgbmV3Y2UgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL2dvIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIG5lW2tdID0gbmV3bmU7CisgICAgICAgICAgICAgICAgICAgICAgICBjZVtrXSA9IG5ld2NlOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzICA9IEdPOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyAgPSBCQUNLOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEJBQ0s6CisgICAgICAgICAgICB7ICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9kZWNyZWFzZSBzdGFjaworICAgICAgICAgICAgICAgIGstLTsgICAgICAgICAKKyAgICAgICAgICAgICAgICBvbGQgPSBBbGxba107CisgICAgICAgICAgICAgICAgaWYoIGsgPCAwICkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAvL2FkZCB0byBub3QKKyAgICAgICAgICAgICAgICBuZVtrXSsrOworCisgICAgICAgICAgICAgICAgaWYoIG5vZFtrXSA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy9zZWxlY3QgbmV4dCBjYW5kaWRhdGUKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBzW2tdID0gbmVba107IHNba10gPCBjZVtrXTsgc1trXSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFjb25uZWN0ZWRbZml4cFtrXV1bb2xkW3Nba11dXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIHNba10gPCBjZVtrXSApOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBORVhUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBQ0s7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgIAorCisgICAgICAgIH0KKyAgICB9Ly9lbmQgd2hpbGUKKworfS8vZW5kIGN2QnJvbktlcmJvc2NoCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3Zjb3JyZXNwb25kLmNwcCBiL2N2YXV4L3NyYy9jdmNvcnJlc3BvbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYzU1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3Zjb3JyZXNwb25kLmNwcApAQCAtMCwwICsxLDQwMyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2YXV4LmgiCisjaW5jbHVkZSAiX2N2dm0uaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworQ3ZTdGF0dXMKK2ljdkR5bmFtaWNDb3JyZXNwb25kKCBpbnQgKmZpcnN0LCAgICAgICAvKiBmaXJzdCBzZXF1ZW5jZSBvZiBydW5zICovCisgICAgICAgICAgICAgICAgICAgICAgLyogczB8dzB8czF8dzF8Li4ufHMobi0xKXx3KG4tMSl8c24gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZmlyc3RfcnVucywgICAvKiBudW1iZXIgb2YgcnVucyAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kLCAgICAgIC8qIHNlY29uZCBzZXF1ZW5jZSBvZiBydW5zICovCisgICAgICAgICAgICAgICAgICAgICAgaW50IHNlY29uZF9ydW5zLCBpbnQgKmZpcnN0X2NvcnIsIC8qIHMwJ3xlMCd8czEnfGUxJ3wuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlY29uZF9jb3JyICkKK3sKKworICAgIGZsb2F0IFBkLCBGaSwgUzsKKyAgICBmbG9hdCBPY2NsdXNpb247CisgICAgZmxvYXQgKmNvc3RUYWJsZTsKKyAgICB1Y2hhciAqbWF0Y2hFZGdlczsKKyAgICBpbnQgcHJldjsKKyAgICBpbnQgY3VycjsKKyAgICBpbnQgYmFzZUluZGV4OworICAgIGludCBpLCBqOworICAgIGludCBpXzEsIGpfMTsKKyAgICBpbnQgbjsKKyAgICBpbnQgbF9iZWcsIHJfYmVnLCBsX2VuZCwgcl9lbmQsIGxfbGVuLCByX2xlbjsKKyAgICBpbnQgZmlyc3RfY3VycjsKKyAgICBpbnQgc2Vjb25kX2N1cnI7CisgICAgaW50IGxfY29sb3IsIHJfY29sb3I7CisgICAgaW50IGxlbl9jb2xvcjsKKyAgICBmbG9hdCBjb3N0LCBjb3N0MTsKKyAgICBmbG9hdCBtaW4xLCBtaW4yLCBtaW4zOworICAgIGZsb2F0IGNtaW47CisgICAgdWNoYXIgY3BhdGg7CisgICAgaW50IHJvd19zaXplOworCisgICAgLyogVGVzdCBhcmd1bWVudHMgZm9yIGVycm9ycyAqLworCisgICAgaWYoIChmaXJzdCA9PSAwKSB8fAorICAgICAgICAoZmlyc3RfcnVucyA8IDEpIHx8CisgICAgICAgIChzZWNvbmQgPT0gMCkgfHwgKHNlY29uZF9ydW5zIDwgMSkgfHwgKGZpcnN0X2NvcnIgPT0gMCkgfHwgKHNlY29uZF9jb3JyID09IDApICkKKworICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworCisgICAgUGQgPSAwLjk1ZjsKKyAgICBGaSA9IChmbG9hdCkgQ1ZfUEk7CisgICAgUyA9IDE7CisKKyAgICBPY2NsdXNpb24gPSAoZmxvYXQpIGxvZyggUGQgKiBGaSAvICgoMSAtIFBkKSAqIHNxcnQoIGZhYnMoIChDVl9QSSAqIDIpICogKDEuIC8gUykgKSkpKTsKKworICAgIGNvc3RUYWJsZSA9IChmbG9hdCAqKWN2QWxsb2MoIChmaXJzdF9ydW5zICsgMSkgKiAoc2Vjb25kX3J1bnMgKyAxKSAqIHNpemVvZiggZmxvYXQgKSk7CisKKyAgICBpZiggY29zdFRhYmxlID09IDAgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgbWF0Y2hFZGdlcyA9ICh1Y2hhciAqKWN2QWxsb2MoIChmaXJzdF9ydW5zICsgMSkgKiAoc2Vjb25kX3J1bnMgKyAxKSAqIHNpemVvZiggdWNoYXIgKSk7CisKKyAgICBpZiggbWF0Y2hFZGdlcyA9PSAwICkKKyAgICB7CisgICAgICAgIGN2RnJlZSggJmNvc3RUYWJsZSApOworICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgIH0KKworICAgIHJvd19zaXplID0gZmlyc3RfcnVucyArIDE7CisKKyAgICAvKiA9PT09PT09PT09PT09IEZpbGwgY29zdFRhYmxlID09PT09PT09PT09PT0gKi8KKworICAgIGNvc3RUYWJsZVswXSA9IDAuMGY7CisKKyAgICAvKiBGaWxsIHVwcGVyIGxpbmUgaW4gdGhlIGNvc3QgVGFibGUgKi8KKworICAgIHByZXYgPSBmaXJzdFswXTsKKyAgICBjdXJyID0gMjsKKworICAgIGZvciggbiA9IDA7IG4gPCBmaXJzdF9ydW5zOyBuKysgKQorICAgIHsKKworICAgICAgICBsX2VuZCA9IGZpcnN0W2N1cnJdOworICAgICAgICBjdXJyICs9IDI7CisgICAgICAgIGNvc3RUYWJsZVtuICsgMV0gPSBjb3N0VGFibGVbbl0gKyBPY2NsdXNpb24gKiAobF9lbmQgLSBwcmV2KTsKKyAgICAgICAgcHJldiA9IGxfZW5kOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgLyogRmlsbCBsZWZ0ZXIgbGluZSBpbiB0aGUgY29zdCBUYWJsZSAqLworCisgICAgcHJldiA9IHNlY29uZFswXTsKKyAgICBjdXJyID0gMjsKKyAgICBiYXNlSW5kZXggPSAwOworCisgICAgZm9yKCBuID0gMDsgbiA8IHNlY29uZF9ydW5zOyBuKysgKQorICAgIHsKKworICAgICAgICBsX2VuZCA9IHNlY29uZFtjdXJyXTsKKyAgICAgICAgY3VyciArPSAyOworICAgICAgICBjb3N0VGFibGVbYmFzZUluZGV4ICsgcm93X3NpemVdID0gY29zdFRhYmxlW2Jhc2VJbmRleF0gKyBPY2NsdXNpb24gKiAobF9lbmQgLSBwcmV2KTsKKyAgICAgICAgYmFzZUluZGV4ICs9IHJvd19zaXplOworICAgICAgICBwcmV2ID0gbF9lbmQ7CisKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAvKiBDb3VudCBjb3N0cyBpbiB0aGUgYWxsIHJlc3QgY2VsbHMgKi8KKworICAgIGZpcnN0X2N1cnIgPSAwOworICAgIHNlY29uZF9jdXJyID0gMDsKKworICAgIGZvciggaSA9IDE7IGkgPD0gZmlyc3RfcnVuczsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDE7IGogPD0gc2Vjb25kX3J1bnM7IGorKyApCisgICAgICAgIHsKKworICAgICAgICAgICAgZmlyc3RfY3VyciA9IChpIC0gMSkgKiAyOworICAgICAgICAgICAgc2Vjb25kX2N1cnIgPSAoaiAtIDEpICogMjsKKworICAgICAgICAgICAgbF9iZWcgPSBmaXJzdFtmaXJzdF9jdXJyXTsKKyAgICAgICAgICAgIGZpcnN0X2N1cnIrKzsKKyAgICAgICAgICAgIGxfY29sb3IgPSBmaXJzdFtmaXJzdF9jdXJyXTsKKyAgICAgICAgICAgIGZpcnN0X2N1cnIrKzsKKyAgICAgICAgICAgIGxfZW5kID0gZmlyc3RbZmlyc3RfY3Vycl07CisgICAgICAgICAgICBsX2xlbiA9IGxfZW5kIC0gbF9iZWcgKyAxOworCisgICAgICAgICAgICByX2JlZyA9IHNlY29uZFtzZWNvbmRfY3Vycl07CisgICAgICAgICAgICBzZWNvbmRfY3VycisrOworICAgICAgICAgICAgcl9jb2xvciA9IHNlY29uZFtzZWNvbmRfY3Vycl07CisgICAgICAgICAgICBzZWNvbmRfY3VycisrOworICAgICAgICAgICAgcl9lbmQgPSBzZWNvbmRbc2Vjb25kX2N1cnJdOworICAgICAgICAgICAgcl9sZW4gPSByX2VuZCAtIHJfYmVnICsgMTsKKworICAgICAgICAgICAgaV8xID0gaSAtIDE7CisgICAgICAgICAgICBqXzEgPSBqIC0gMTsKKworICAgICAgICAgICAgaWYoIHJfbGVuID09IGxfbGVuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb3N0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmKCByX2xlbiA+IGxfbGVuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAoZmxvYXQpIChyX2xlbiAqIHJfbGVuIC0gbF9sZW4gKiBsX2xlbikgKiAoMSAvIChyX2xlbiAqIGxfbGVuKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvc3QgPSAoZmxvYXQpIChsX2xlbiAqIGxfbGVuIC0gcl9sZW4gKiByX2xlbikgKiAoMSAvIChyX2xlbiAqIGxfbGVuKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICBsZW5fY29sb3IgPSByX2NvbG9yIC0gbF9jb2xvcjsKKworICAgICAgICAgICAgY29zdDEgPSAoZmxvYXQpICgobGVuX2NvbG9yICogbGVuX2NvbG9yKSA+PiAyKTsKKworICAgICAgICAgICAgbWluMiA9IGNvc3RUYWJsZVtpXzEgKyBqICogcm93X3NpemVdICsgT2NjbHVzaW9uICogbF9sZW47CisKKyAgICAgICAgICAgIG1pbjMgPSBjb3N0VGFibGVbaSArIGpfMSAqIHJvd19zaXplXSArIE9jY2x1c2lvbiAqIHJfbGVuOworCisgICAgICAgICAgICBtaW4xID0gY29zdFRhYmxlW2lfMSArIGpfMSAqIHJvd19zaXplXSArIGNvc3QgKyAoZmxvYXQpIGNvc3QxOworCisgICAgICAgICAgICBpZiggbWluMSA8IG1pbjIgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYoIG1pbjEgPCBtaW4zICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNtaW4gPSBtaW4xOworICAgICAgICAgICAgICAgICAgICBjcGF0aCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNtaW4gPSBtaW4zOworICAgICAgICAgICAgICAgICAgICBjcGF0aCA9IDM7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmKCBtaW4yIDwgbWluMyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbWluID0gbWluMjsKKyAgICAgICAgICAgICAgICAgICAgY3BhdGggPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjbWluID0gbWluMzsKKyAgICAgICAgICAgICAgICAgICAgY3BhdGggPSAzOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgICAgIGNvc3RUYWJsZVtpICsgaiAqIHJvd19zaXplXSA9IGNtaW47CisgICAgICAgICAgICBtYXRjaEVkZ2VzW2kgKyBqICogcm93X3NpemVdID0gY3BhdGg7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIC8qID09PT09PT09PT09IFJlY29uc3RydWN0IHRoZSBQYXRoID09PT09PT09PT09ICovCisKKyAgICBpID0gZmlyc3RfcnVuczsKKyAgICBqID0gc2Vjb25kX3J1bnM7CisKKyAgICBmaXJzdF9jdXJyID0gaSAqIDIgLSAyOworICAgIHNlY29uZF9jdXJyID0gaiAqIDIgLSAyOworCisKKyAgICB3aGlsZSggaSA+IDAgJiYgaiA+IDAgKQorICAgIHsKKworICAgICAgICAvKiBDb25uZWN0IGJlZ2lucyAqLworICAgICAgICBzd2l0Y2ggKG1hdGNoRWRnZXNbaSArIGogKiByb3dfc2l6ZV0pCisgICAgICAgIHsKKworICAgICAgICBjYXNlIDE6ICAgICAgICAgICAgICAgIC8qIHRvIGRpYWdvbmFsICovCisKKyAgICAgICAgICAgIGZpcnN0X2NvcnJbZmlyc3RfY3Vycl0gPSBzZWNvbmRbc2Vjb25kX2N1cnJdOworICAgICAgICAgICAgZmlyc3RfY29ycltmaXJzdF9jdXJyICsgMV0gPSBzZWNvbmRbc2Vjb25kX2N1cnIgKyAyXTsKKyAgICAgICAgICAgIHNlY29uZF9jb3JyW3NlY29uZF9jdXJyXSA9IGZpcnN0W2ZpcnN0X2N1cnJdOworICAgICAgICAgICAgc2Vjb25kX2NvcnJbc2Vjb25kX2N1cnIgKyAxXSA9IGZpcnN0W2ZpcnN0X2N1cnIgKyAyXTsKKworICAgICAgICAgICAgZmlyc3RfY3VyciAtPSAyOworICAgICAgICAgICAgc2Vjb25kX2N1cnIgLT0gMjsKKyAgICAgICAgICAgIGktLTsKKyAgICAgICAgICAgIGotLTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAyOiAgICAgICAgICAgICAgICAvKiB0byBsZWZ0ICovCisKKyAgICAgICAgICAgIGZpcnN0X2NvcnJbZmlyc3RfY3Vycl0gPSBzZWNvbmRbc2Vjb25kX2N1cnIgKyAyXTsKKyAgICAgICAgICAgIGZpcnN0X2NvcnJbZmlyc3RfY3VyciArIDFdID0gc2Vjb25kW3NlY29uZF9jdXJyICsgMl07CisKKyAgICAgICAgICAgIGZpcnN0X2N1cnIgLT0gMjsKKyAgICAgICAgICAgIGktLTsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAzOiAgICAgICAgICAgICAgICAvKiB0byB1cCAqLworCisgICAgICAgICAgICBzZWNvbmRfY29ycltzZWNvbmRfY3Vycl0gPSBmaXJzdFtmaXJzdF9jdXJyICsgMl07CisgICAgICAgICAgICBzZWNvbmRfY29ycltzZWNvbmRfY3VyciArIDFdID0gZmlyc3RbZmlyc3RfY3VyciArIDJdOworCisgICAgICAgICAgICBzZWNvbmRfY3VyciAtPSAyOworICAgICAgICAgICAgai0tOworCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogc3dpdGNoICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlICovCisKKyAgICAvKiBjb25zdHJ1Y3QgcmVzdCBvZiBob3Jpc29udGFsIHBhdGggaWYgaXRzIG5lZWQgKi8KKyAgICB3aGlsZSggaSA+IDAgKQorICAgIHsKKworICAgICAgICBmaXJzdF9jb3JyW2ZpcnN0X2N1cnJdID0gc2Vjb25kW3NlY29uZF9jdXJyICsgMl07ICAgICAgIC8qIGNvbm5lY3QgdG8gYmVnaW4gKi8KKyAgICAgICAgZmlyc3RfY29ycltmaXJzdF9jdXJyICsgMV0gPSBzZWNvbmRbc2Vjb25kX2N1cnIgKyAyXTsgICAvKiBjb25uZWN0IHRvIGJlZ2luICovCisKKyAgICAgICAgZmlyc3RfY3VyciAtPSAyOworICAgICAgICBpLS07CisKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgKi8KKworICAgIC8qIGNvbnN0cnVjdCByZXN0IG9mIHZlcnRpY2FsIHBhdGggaWYgaXRzIG5lZWQgKi8KKyAgICB3aGlsZSggaiA+IDAgKQorICAgIHsKKworICAgICAgICBzZWNvbmRfY29ycltzZWNvbmRfY3Vycl0gPSBmaXJzdFtmaXJzdF9jdXJyICsgMl07CisgICAgICAgIHNlY29uZF9jb3JyW3NlY29uZF9jdXJyICsgMV0gPSBmaXJzdFtmaXJzdF9jdXJyICsgMl07CisKKyAgICAgICAgc2Vjb25kX2N1cnIgLT0gMjsKKyAgICAgICAgai0tOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlICovCisKKyAgICBjdkZyZWUoICZjb3N0VGFibGUgKTsKKyAgICBjdkZyZWUoICZtYXRjaEVkZ2VzICk7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZEeW5hbWljQ29ycmVzcG9uZCAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkR5bmFtaWNDb3JyZXNwb25kTXVsdGkoIGludCBsaW5lcywgICAvKiBudW1iZXIgb2Ygc2NhbmxpbmVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZpcnN0LCAgLyogczB8dzB8czF8dzF8Li4ucyhuLTEpfHcobi0xKXxzbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmaXJzdF9ydW5zLCAgICAgLyogbnVtYmVycyBvZiBydW5zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlY29uZCwgaW50ICpzZWNvbmRfcnVucywgaW50ICpmaXJzdF9jb3JyLCAgICAgIC8qIHMwJ3xlMCd8czEnfGUxJ3wuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kX2NvcnIgKQoreworICAgIEN2U3RhdHVzIGVycm9yOworCisgICAgaW50IGN1cnJGaXJzdDsKKyAgICBpbnQgY3VyclNlY29uZDsKKyAgICBpbnQgY3VyckZpcnN0Q29ycjsKKyAgICBpbnQgY3VyclNlY29uZENvcnI7CisgICAgaW50IG47CisKKyAgICAvKiBUZXN0IGVycm9ycyAqLworCisgICAgaWYoIChsaW5lcyA8IDEpIHx8CisgICAgICAgIChmaXJzdCA9PSAwKSB8fAorICAgICAgICAoZmlyc3RfcnVucyA9PSAwKSB8fAorICAgICAgICAoc2Vjb25kID09IDApIHx8IChzZWNvbmRfcnVucyA9PSAwKSB8fCAoZmlyc3RfY29yciA9PSAwKSB8fCAoc2Vjb25kX2NvcnIgPT0gMCkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIGN1cnJGaXJzdCA9IDA7CisgICAgY3VyclNlY29uZCA9IDA7CisgICAgY3VyckZpcnN0Q29yciA9IDA7CisgICAgY3VyclNlY29uZENvcnIgPSAwOworCisgICAgZm9yKCBuID0gMDsgbiA8IGxpbmVzOyBuKysgKQorICAgIHsKKworICAgICAgICBlcnJvciA9IGljdkR5bmFtaWNDb3JyZXNwb25kKCAmKGZpcnN0W2N1cnJGaXJzdF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9ydW5zW25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNlY29uZFtjdXJyU2Vjb25kXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9ydW5zW25dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGZpcnN0X2NvcnJbY3VyckZpcnN0Q29ycl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNlY29uZF9jb3JyW2N1cnJTZWNvbmRDb3JyXSkgKTsKKworICAgICAgICBpZiggZXJyb3IgIT0gQ1ZfTk9fRVJSICkKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKworICAgICAgICBjdXJyRmlyc3QgKz0gZmlyc3RfcnVuc1tuXSAqIDIgKyAxOworICAgICAgICBjdXJyU2Vjb25kICs9IHNlY29uZF9ydW5zW25dICogMiArIDE7CisgICAgICAgIGN1cnJGaXJzdENvcnIgKz0gZmlyc3RfcnVuc1tuXSAqIDI7CisgICAgICAgIGN1cnJTZWNvbmRDb3JyICs9IHNlY29uZF9ydW5zW25dICogMjsKKworICAgIH0KKworICAgIHJldHVybiBDVl9OT19FUlI7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2RHluYW1pY0NvcnJlc3BvbmRNdWx0aSAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2RHluYW1pY0NvcnJlc3BvbmRNdWx0aQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9ucyAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgCisvLworLy8gICAgTm90ZXM6ICAKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2RHluYW1pY0NvcnJlc3BvbmRNdWx0aSggaW50IGxpbmVzLCAgICAvKiBudW1iZXIgb2Ygc2NhbmxpbmVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmlyc3QsICAgLyogczB8dzB8czF8dzF8Li4ucyhuLTEpfHcobi0xKXxzbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZpcnN0X3J1bnMsICAgICAgLyogbnVtYmVycyBvZiBydW5zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kLCBpbnQgKnNlY29uZF9ydW5zLCBpbnQgKmZpcnN0X2NvcnIsICAgICAgIC8qIHMwJ3xlMCd8czEnfGUxJ3wuLi4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmRfY29yciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkR5bmFtaWNDb3JyZXNwb25kTXVsdGkiICk7CisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZEeW5hbWljQ29ycmVzcG9uZE11bHRpKCBsaW5lcywgICAgICAgIC8qIG51bWJlciBvZiBzY2FubGluZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCAgICAgICAgLyogczB8dzB8czF8dzF8Li4ucyhuLTEpfHcobi0xKXxzbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcnVucywgICAvKiBudW1iZXJzIG9mIHJ1bnMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCwgc2Vjb25kX3J1bnMsIGZpcnN0X2NvcnIsICAgICAgLyogczAnfGUwJ3xzMSd8ZTEnfC4uLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX2NvcnIgKSk7CisgICAgX19DTEVBTlVQX187CisgICAgX19FTkRfXzsKK30KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmNvcnJpbWFnZXMuY3BwIGIvY3ZhdXgvc3JjL2N2Y29ycmltYWdlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIyNjFlOQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmNvcnJpbWFnZXMuY3BwCkBAIC0wLDAgKzEsMTE1MiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKy8vI2luY2x1ZGUgImN2dHlwZXMuaCIKKy8vI2luY2x1ZGUgPGZsb2F0Lmg+CisvLyNpbmNsdWRlIDxsaW1pdHMuaD4KKy8vI2luY2x1ZGUgImN2LmgiCisvLyNpbmNsdWRlICJoaWdoZ3VpLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvKiBWYWxlcnkgTW9zeWFnaW4gKi8KKworLyogPT09PT0gRnVuY3Rpb24gZm9yIGZpbmQgY29ycmVzcG9uZGluZyBiZXR3ZWVuIGltYWdlcyA9PT09PSAqLworCisvKiBDcmVhdGUgZmVhdHVyZSBwb2ludHMgb24gaW1hZ2UgYW5kIHJldHVybiBudW1iZXIgb2YgdGhlbS4gQXJyYXkgcG9pbnRzIGZpbGxzIGJ5IGZvdW5kIHBvaW50cyAqLworaW50IGljdkNyZWF0ZUZlYXR1cmVQb2ludHMoSXBsSW1hZ2UgKmltYWdlLCBDdk1hdCAqcG9pbnRzLCBDdk1hdCAqc3RhdHVzKQoreworICAgIGludCBmb3VuZEZlYXR1cmVQb2ludHMgPSAwOworICAgIElwbEltYWdlICpncmF5SW1hZ2UgPSAwOworICAgIElwbEltYWdlICplaWdJbWFnZSA9IDA7CisgICAgSXBsSW1hZ2UgKnRtcEltYWdlID0gMDsKKyAgICBDdlBvaW50MkQzMmYgKmNvcm5lclBvaW50cyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkZlYXR1cmVDcmVhdGVQb2ludHMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBmb3IgZXJyb3JzICovCisgICAgaWYoIGltYWdlID09IDAgfHwgcG9pbnRzID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgLyogVGVzdCBpbWFnZSBzaXplICovCisgICAgaW50IHcsaDsKKyAgICB3ID0gaW1hZ2UtPndpZHRoOworICAgIGggPSBpbWFnZS0+aGVpZ2h0OworCisgICAgaWYoIHcgPD0gMCB8fCBoIDw9IDApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNpemUgb2YgaW1hZ2UgbXVzdCBiZSA+IDAiICk7CisgICAgfQorCisgICAgLyogVGVzdCBmb3IgbWF0cmljZXMgKi8KKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlciBwb2ludHMgbXVzdCBiZSBhIG1hdHJpeCIgKTsKKyAgICB9CisKKyAgICBpbnQgbmVlZE51bVBvaW50czsKKyAgICBuZWVkTnVtUG9pbnRzID0gcG9pbnRzLT5jb2xzOworICAgIGlmKCBuZWVkTnVtUG9pbnRzIDw9IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgbmVlZCBwb2ludHMgbXVzdCBiZSA+IDAiICk7CisgICAgfQorCisgICAgaWYoIHBvaW50cy0+cm93cyAhPSAyICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIHBvaW50IGNvb3JkaW5hdGVzIG11c3QgYmUgPT0gMiIgKTsKKyAgICB9CisKKyAgICBpZiggc3RhdHVzICE9IDAgKQorICAgIHsKKyAgICAgICAgLyogSWYgc3RhdHVzIG1hdHJpeCBleGlzdCB0ZXN0IGl0IGZvciBjb3JyZWN0ICovCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoc3RhdHVzKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlN0YXR1c2VzIG11c3QgYmUgYSBtYXNrIGFycmF5cyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdGF0dXMtPmNvbHMgIT0gbmVlZE51bVBvaW50cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgcG9pbnRzIGFuZCBzdGF0dXNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHN0YXR1cy0+cm93cyAhPTEgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJOdW1iZXIgb2Ygcm93cyBvZiBzdGF0dXMgbXVzdCBiZSAxIiApOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ3JlYXRlIHRlbXBvcmFyeSBpbWFnZXMgKi8KKyAgICBDVl9DQUxMKCBncmF5SW1hZ2UgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZSh3LGgpLCA4LDEpICk7CisgICAgQ1ZfQ0FMTCggZWlnSW1hZ2UgICA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKHcsaCksMzIsMSkgKTsKKyAgICBDVl9DQUxMKCB0bXBJbWFnZSAgID0gY3ZDcmVhdGVJbWFnZShjdlNpemUodyxoKSwzMiwxKSApOworCisgICAgLyogQ3JlYXRlIHBvaW50cyAqLworICAgIENWX0NBTEwoIGNvcm5lclBvaW50cyA9IChDdlBvaW50MkQzMmYqKWN2QWxsb2MoIHNpemVvZihDdlBvaW50MkQzMmYpICogbmVlZE51bVBvaW50cykgKTsKKworICAgIGludCBmb3VuZE51bTsKKyAgICBkb3VibGUgcXVhbGl0eTsKKyAgICBkb3VibGUgbWluRGlzdDsKKworICAgIGN2Q3Z0Q29sb3IoaW1hZ2UsZ3JheUltYWdlLCBDVl9CR1IyR1JBWSk7CisKKyAgICBmb3VuZE51bSA9IG5lZWROdW1Qb2ludHM7CisgICAgcXVhbGl0eSA9IDAuMDE7CisgICAgbWluRGlzdCA9IDU7CisgICAgY3ZHb29kRmVhdHVyZXNUb1RyYWNrKGdyYXlJbWFnZSwgZWlnSW1hZ2UsIHRtcEltYWdlLCBjb3JuZXJQb2ludHMsICZmb3VuZE51bSwgcXVhbGl0eSwgbWluRGlzdCk7CisKKyAgICAvKiBDb3B5IGZvdW5kIHBvaW50cyB0byByZXN1bHQgKi8KKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgZm91bmROdW07IGkrKyApCisgICAgeworICAgICAgICBjdm1TZXQocG9pbnRzLDAsaSxjb3JuZXJQb2ludHNbaV0ueCk7CisgICAgICAgIGN2bVNldChwb2ludHMsMSxpLGNvcm5lclBvaW50c1tpXS55KTsKKyAgICB9CisKKyAgICAvKiBTZXQgc3RhdHVzIGlmIG5lZWQgKi8KKyAgICBpZiggc3RhdHVzICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBmb3VuZE51bTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdHVzLT5kYXRhLnB0cltpXSA9IDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGkgPSBmb3VuZE51bTsgaSA8IG5lZWROdW1Qb2ludHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cy0+ZGF0YS5wdHJbaV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgZm91bmRGZWF0dXJlUG9pbnRzID0gZm91bmROdW07CisKKyAgICBfX0VORF9fOworCisgICAgLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgY3ZSZWxlYXNlSW1hZ2UoJmdyYXlJbWFnZSk7CisgICAgY3ZSZWxlYXNlSW1hZ2UoJmVpZ0ltYWdlKTsKKyAgICBjdlJlbGVhc2VJbWFnZSgmdG1wSW1hZ2UpOworICAgIGN2RnJlZSgmY29ybmVyUG9pbnRzKTsKKworICAgIHJldHVybiBmb3VuZEZlYXR1cmVQb2ludHM7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZvciBnaXZlbiBwb2ludHMxICh3aXRoIHBudFN0YXR1cykgb24gaW1hZ2UxIGZpbmRzIGNvcnJlc3BvbmRpbmcgcG9pbnRzMiBvbiBpbWFnZTIgYW5kIHNldCBwbnRTdGF0dXMyIGZvciB0aGVtICovCisvKiBSZXR1cm5zIG51bWJlciBvZiBjb3JyZXNwb25kaW5nIHBvaW50cyAqLworaW50IGljdkZpbmRDb3JyRm9yR2l2ZW5Qb2ludHMoIElwbEltYWdlICppbWFnZTEsLyogSW1hZ2UgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSAqaW1hZ2UyLC8qIEltYWdlIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKnBvaW50czEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqcG50U3RhdHVzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKnBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpwbnRTdGF0dXMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXNlRmlsdGVyLC8qVXNlIGZ1bmRhbWVudGFsIG1hdHJpeCB0byBmaWx0ZXIgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aHJlc2hvbGQpLyogVGhyZXNob2xkIGZvciBnb29kIHBvaW50cyBpbiBmaWx0ZXIgKi8KK3sKKyAgICBpbnQgcmVzTnVtQ29yclBvaW50cyA9IDA7CisgICAgQ3ZQb2ludDJEMzJmKiBjb3JuZXJQb2ludHMxID0gMDsKKyAgICBDdlBvaW50MkQzMmYqIGNvcm5lclBvaW50czIgPSAwOworICAgIGNoYXIqICBzdGF0dXMgPSAwOworICAgIGZsb2F0KiBlcnJvcnMgPSAwOworICAgIEN2TWF0KiB0bXBQb2ludHMxID0gMDsKKyAgICBDdk1hdCogdG1wUG9pbnRzMiA9IDA7CisgICAgQ3ZNYXQqIHBTdGF0dXMgPSAwOworICAgIElwbEltYWdlICpncmF5SW1hZ2UxID0gMDsKKyAgICBJcGxJbWFnZSAqZ3JheUltYWdlMiA9IDA7CisgICAgSXBsSW1hZ2UgKnB5ckltYWdlMSA9IDA7CisgICAgSXBsSW1hZ2UgKnB5ckltYWdlMiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkZpbmRDb3JyRm9yR2l2ZW5Qb2ludHMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBpbnB1dCBkYXRhIGZvciBlcnJvcnMgKi8KKworICAgIC8qIFRlc3QgZm9yIG51bGwgcG9pbnRlcnMgKi8KKyAgICBpZiggaW1hZ2UxICAgICA9PSAwIHx8IGltYWdlMiAgICAgPT0gMCB8fCAKKyAgICAgICAgcG9pbnRzMSAgICA9PSAwIHx8IHBvaW50czIgICAgPT0gMCB8fAorICAgICAgICBwbnRTdGF0dXMxID09IDAgfHwgcG50U3RhdHVzMiA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgLyogVGVzdCBpbWFnZSBzaXplICovCisgICAgaW50IHcsaDsKKyAgICB3ID0gaW1hZ2UxLT53aWR0aDsKKyAgICBoID0gaW1hZ2UxLT5oZWlnaHQ7CisKKyAgICBpZiggdyA8PSAwIHx8IGggPD0gMCkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiU2l6ZSBvZiBpbWFnZTEgbXVzdCBiZSA+IDAiICk7CisgICAgfQorCisgICAgaWYoIGltYWdlMi0+d2lkdGggIT0gdyB8fCBpbWFnZTItPmhlaWdodCAhPSBoICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgaW1hZ2VzIG11c3QgYmUgdGhlIHNhbWUiICk7CisgICAgfQorCisgICAgLyogVGVzdCBmb3IgbWF0cmljZXMgKi8KKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMxKSAgICB8fCAhQ1ZfSVNfTUFUKHBvaW50czIpIHx8IAorICAgICAgICAhQ1ZfSVNfTUFUKHBudFN0YXR1czEpIHx8ICFDVl9JU19NQVQocG50U3RhdHVzMikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyAocG9pbnRzIGFuZCBzdGF0dXMpIG11c3QgYmUgYSBtYXRyaWNlcyIgKTsKKyAgICB9CisKKyAgICAvKiBUZXN0IHR5cGUgb2Ygc3RhdHVzIG1hdHJpY2VzICovCisgICAgaWYoICFDVl9JU19NQVNLX0FSUihwbnRTdGF0dXMxKSB8fCAhQ1ZfSVNfTUFTS19BUlIocG50U3RhdHVzMikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiU3RhdHVzZXMgbXVzdCBiZSBhIG1hc2sgYXJyYXlzIiApOworICAgIH0KKworICAgIC8qIFRlc3QgbnVtYmVyIG9mIHBvaW50cyAqLworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcG9pbnRzMS0+Y29sczsKKworICAgIGlmKCBudW1Qb2ludHMgPD0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHMxIG11c3QgYmUgPiAwIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHMyLT5jb2xzICE9IG51bVBvaW50cyB8fCBwbnRTdGF0dXMxLT5jb2xzICE9IG51bVBvaW50cyB8fCBwbnRTdGF0dXMyLT5jb2xzICE9IG51bVBvaW50cyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIGFuZCBzdGF0dXNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHMxLT5yb3dzICE9IDIgfHwgcG9pbnRzMi0+cm93cyAhPSAyICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlIDIiICk7CisgICAgfQorCisgICAgaWYoIHBudFN0YXR1czEtPnJvd3MgIT0gMSB8fCBwbnRTdGF0dXMyLT5yb3dzICE9IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJTdGF0dXMgbXVzdCBiZSBhIG1hdHJpeCAxeE4iICk7CisgICAgfQorICAgIC8qIC0tLS0tIEVuZCB0ZXN0IC0tLS0tICovCisKKworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIHZpc2libGUgcG9pbnRzIG9uIGltYWdlMSAqLworICAgIGludCBudW1WaXNQb2ludHM7CisgICAgbnVtVmlzUG9pbnRzID0gY3ZDb3VudE5vblplcm8ocG50U3RhdHVzMSk7CisKKyAgICBpZiggbnVtVmlzUG9pbnRzID4gMCApCisgICAgeworICAgICAgICAvKiBDcmVhdGUgdGVtcG9yYXJ5IGltYWdlcyAqLworICAgICAgICAvKiBXZSBtdXN0IHVzZSBpcGxJbWFnZSBhZ2FpbnRzIGh1Z2hndWkgaW1hZ2VzICovCisKKy8qCisgICAgICAgIEN2dkltYWdlIGdyYXlJbWFnZTE7CisgICAgICAgIEN2dkltYWdlIGdyYXlJbWFnZTI7CisgICAgICAgIEN2dkltYWdlIHB5ckltYWdlMTsKKyAgICAgICAgQ3Z2SW1hZ2UgcHlySW1hZ2UyOworKi8KKworICAgICAgICAvKiBDcmVhdGUgSXBsIGltYWdlcyAqLworICAgICAgICBDVl9DQUxMKCBncmF5SW1hZ2UxID0gY3ZDcmVhdGVJbWFnZShjdlNpemUodyxoKSw4LDEpICk7CisgICAgICAgIENWX0NBTEwoIGdyYXlJbWFnZTIgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZSh3LGgpLDgsMSkgKTsKKyAgICAgICAgQ1ZfQ0FMTCggcHlySW1hZ2UxICA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKHcsaCksOCwxKSApOworICAgICAgICBDVl9DQUxMKCBweXJJbWFnZTIgID0gY3ZDcmVhdGVJbWFnZShjdlNpemUodyxoKSw4LDEpICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggY29ybmVyUG9pbnRzMSA9IChDdlBvaW50MkQzMmYqKWN2QWxsb2MoIHNpemVvZihDdlBvaW50MkQzMmYpKm51bVZpc1BvaW50cykgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY29ybmVyUG9pbnRzMiA9IChDdlBvaW50MkQzMmYqKWN2QWxsb2MoIHNpemVvZihDdlBvaW50MkQzMmYpKm51bVZpc1BvaW50cykgKTsKKyAgICAgICAgQ1ZfQ0FMTCggc3RhdHVzID0gKGNoYXIqKWN2QWxsb2MoIHNpemVvZihjaGFyKSpudW1WaXNQb2ludHMpICk7CisgICAgICAgIENWX0NBTEwoIGVycm9ycyA9IChmbG9hdCopY3ZBbGxvYyggMiAqIHNpemVvZihmbG9hdCkqbnVtVmlzUG9pbnRzKSApOworCisgICAgICAgIGludCBpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtVmlzUG9pbnRzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNbaV0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgLyogISEhIE5lZWQgdGVzdCBjcmVhdGlvbiBlcnJvcnMgKi8KKyAgICAgICAgLyoKKyAgICAgICAgaWYoICFncmF5SW1hZ2UxLkNyZWF0ZSh3LGgsOCkpIEVYSVQ7CisgICAgICAgIGlmKCAhZ3JheUltYWdlMi5DcmVhdGUodyxoLDgpKSBFWElUOworICAgICAgICBpZiggIXB5ckltYWdlMS4gQ3JlYXRlKHcsaCw4KSkgRVhJVDsKKyAgICAgICAgaWYoICFweXJJbWFnZTIuIENyZWF0ZSh3LGgsOCkpIEVYSVQ7CisgICAgICAgICovCisKKyAgICAgICAgY3ZDdnRDb2xvcihpbWFnZTEsZ3JheUltYWdlMSxDVl9CR1IyR1JBWSk7CisgICAgICAgIGN2Q3Z0Q29sb3IoaW1hZ2UyLGdyYXlJbWFnZTIsQ1ZfQkdSMkdSQVkpOworCisgICAgICAgIC8qCisgICAgICAgIGdyYXlJbWFnZTEuQ29weU9mKGltYWdlMSwwKTsKKyAgICAgICAgZ3JheUltYWdlMi5Db3B5T2YoaW1hZ2UyLDApOworICAgICAgICAqLworCisgICAgICAgIC8qIENvcHkgcG9pbnRzIGdvb2QgcG9pbnRzIGZyb20gaW5wdXQgZGF0YSAqLworICAgICAgICB1Y2hhciAqc3RhdDEgPSBwbnRTdGF0dXMxLT5kYXRhLnB0cjsKKyAgICAgICAgdWNoYXIgKnN0YXQyID0gcG50U3RhdHVzMi0+ZGF0YS5wdHI7CisKKyAgICAgICAgaW50IGN1cnIgPSAwOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RhdDFbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvcm5lclBvaW50czFbY3Vycl0ueCA9IChmbG9hdCljdm1HZXQocG9pbnRzMSwwLGkpOworICAgICAgICAgICAgICAgIGNvcm5lclBvaW50czFbY3Vycl0ueSA9IChmbG9hdCljdm1HZXQocG9pbnRzMSwxLGkpOworICAgICAgICAgICAgICAgIGN1cnIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIERlZmluZSBudW1iZXIgb2YgbGV2ZWxzIG9mIHB5cmFtaWQgKi8KKyAgICAgICAgY3ZDYWxjT3B0aWNhbEZsb3dQeXJMSyggZ3JheUltYWdlMSwgZ3JheUltYWdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlySW1hZ2UxLCBweXJJbWFnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcm5lclBvaW50czEsIGNvcm5lclBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVZpc1BvaW50cywgY3ZTaXplKDEwLDEwKSwgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLCBlcnJvcnMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlRlcm1Dcml0ZXJpYShDVl9URVJNQ1JJVF9JVEVSfENWX1RFUk1DUklUX0VQUywyMCwwLjAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC8qQ1ZfTEtGTE9XX1BZUl9BX1JFQURZKi8gKTsKKworICAgICAgICAKKyAgICAgICAgbWVtc2V0KHN0YXQyLDAsc2l6ZW9mKHVjaGFyKSpudW1Qb2ludHMpOworCisgICAgICAgIGludCBjdXJyVmlzID0gMDsKKyAgICAgICAgaW50IHRvdGFsQ29ybnMgPSAwOworCisgICAgICAgIC8qIENvcHkgbmV3IHBvaW50cyBhbmQgc2V0IHN0YXR1cyAqLworICAgICAgICAvKiBzdGF0MSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHN0YXQyICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdGF0MVtpXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHN0YXR1c1tjdXJyVmlzXSAmJiBlcnJvcnNbY3VyclZpc10gPCAxMDAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQyW2ldID0gMTsKKyAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHBvaW50czIsMCxpLGNvcm5lclBvaW50czJbY3VyclZpc10ueCk7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldChwb2ludHMyLDEsaSxjb3JuZXJQb2ludHMyW2N1cnJWaXNdLnkpOworICAgICAgICAgICAgICAgICAgICB0b3RhbENvcm5zKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJWaXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc051bUNvcnJQb2ludHMgPSB0b3RhbENvcm5zOworCisgICAgICAgIC8qIEZpbHRlciBwb2ludHMgdXNpbmcgUkFOU0FDICovCisgICAgICAgIGlmKCB1c2VGaWx0ZXIgKQorICAgICAgICB7CisgICAgICAgICAgICByZXNOdW1Db3JyUG9pbnRzID0gMDsKKyAgICAgICAgICAgIC8qIFVzZSBSQU5TQUMgZmlsdGVyIGZvciBmb3VuZCBwb2ludHMgKi8KKyAgICAgICAgICAgIGlmKCB0b3RhbENvcm5zID4gNyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGFycmF5IHdpdGggZ29vZCBwb2ludHMgb25seSAqLworICAgICAgICAgICAgICAgIENWX0NBTEwoIHRtcFBvaW50czEgPSBjdkNyZWF0ZU1hdCgyLHRvdGFsQ29ybnMsQ1ZfNjRGKSApOworICAgICAgICAgICAgICAgIENWX0NBTEwoIHRtcFBvaW50czIgPSBjdkNyZWF0ZU1hdCgyLHRvdGFsQ29ybnMsQ1ZfNjRGKSApOworCisgICAgICAgICAgICAgICAgLyogQ29weSBqdXN0IGdvb2QgcG9pbnRzICovCisgICAgICAgICAgICAgICAgaW50IGN1cnJQb2ludCA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzdGF0MltpXSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldCh0bXBQb2ludHMxLDAsY3VyclBvaW50LGN2bUdldChwb2ludHMxLDAsaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHRtcFBvaW50czEsMSxjdXJyUG9pbnQsY3ZtR2V0KHBvaW50czEsMSxpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldCh0bXBQb2ludHMyLDAsY3VyclBvaW50LGN2bUdldChwb2ludHMyLDAsaSkpOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHRtcFBvaW50czIsMSxjdXJyUG9pbnQsY3ZtR2V0KHBvaW50czIsMSxpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJQb2ludCsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBmdW5kYW1lbnRhbCBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICBDdk1hdCBmdW5kTWF0cjsKKyAgICAgICAgICAgICAgICBkb3VibGUgZnVuZE1hdHJfZGF0WzldOworICAgICAgICAgICAgICAgIGZ1bmRNYXRyID0gY3ZNYXQoMywzLENWXzY0RixmdW5kTWF0cl9kYXQpOworICAgICAgICAKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBwU3RhdHVzID0gY3ZDcmVhdGVNYXQoMSx0b3RhbENvcm5zLENWXzMyRikgKTsKKworICAgICAgICAgICAgICAgIGludCBudW0gPSBjdkZpbmRGdW5kYW1lbnRhbE1hdCh0bXBQb2ludHMxLHRtcFBvaW50czIsJmZ1bmRNYXRyLENWX0ZNX1JBTlNBQyx0aHJlc2hvbGQsMC45OSxwU3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpZiggbnVtID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY3VyciA9IDA7CisgICAgICAgICAgICAgICAgICAgIC8qIFNldCBmaW5hbCBzdGF0dXMgZm9yIHBvaW50czIgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXQyW2ldICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY3ZtR2V0KHBTdGF0dXMsMCxjdXJyKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQyW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycisrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlc051bUNvcnJQb2ludHMgPSBjdXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICAvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBjdkZyZWUoJmNvcm5lclBvaW50czEpOworICAgIGN2RnJlZSgmY29ybmVyUG9pbnRzMik7CisgICAgY3ZGcmVlKCZzdGF0dXMpOworICAgIGN2RnJlZSgmZXJyb3JzKTsKKyAgICBjdkZyZWUoJnRtcFBvaW50czEpOworICAgIGN2RnJlZSgmdG1wUG9pbnRzMik7CisgICAgY3ZSZWxlYXNlTWF0KCAmcFN0YXR1cyApOworICAgIGN2UmVsZWFzZUltYWdlKCAmZ3JheUltYWdlMSApOworICAgIGN2UmVsZWFzZUltYWdlKCAmZ3JheUltYWdlMiApOworICAgIGN2UmVsZWFzZUltYWdlKCAmcHlySW1hZ2UxICk7CisgICAgY3ZSZWxlYXNlSW1hZ2UoICZweXJJbWFnZTIgKTsKKworICAgIHJldHVybiByZXNOdW1Db3JyUG9pbnRzOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpY3ZHcm93UG9pbnRzQW5kU3RhdHVzKEN2TWF0ICoqb2xkUG9pbnRzLEN2TWF0ICoqb2xkU3RhdHVzLEN2TWF0ICphZGRQb2ludHMsQ3ZNYXQgKmFkZFN0YXR1cyxpbnQgYWRkQ3JlYXRlTnVtKQoreworICAgIC8qIEFkZCB0byBleGlzdGluZyBwb2ludHMgYW5kIHN0YXR1cyBhcnJheXMgbmV3IHBvaW50cyBvciBqdXN0IGdyb3cgKi8KKyAgICBDdk1hdCAqbmV3T2xkUG9pbnQgID0gMDsKKyAgICBDdk1hdCAqbmV3T2xkU3RhdHVzID0gMDsKKyAgICBpbnQgbmV3VG90YWxOdW1iZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZHcm93UG9pbnRzQW5kU3RhdHVzIiApOworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICAvKiBUZXN0IGZvciBlcnJvcnMgKi8KKyAgICBpZiggb2xkUG9pbnRzID09IDAgfHwgb2xkU3RhdHVzID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICpvbGRQb2ludHMgPT0gMCB8fCAqb2xkU3RhdHVzID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoKm9sZFBvaW50cykpCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJvbGRQb2ludHMgbXVzdCBiZSBhIHBvaW50ZXIgdG8gYSBtYXRyaXgiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVNLX0FSUigqb2xkU3RhdHVzKSkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIm9sZFN0YXR1cyBtdXN0IGJlIGEgcG9pbnRlciB0byBhIG1hc2sgYXJyYXkiICk7CisgICAgfQorCisgICAgaW50IG9sZE51bTsKKyAgICBvbGROdW0gPSAoKm9sZFBvaW50cyktPmNvbHM7CisgICAgaWYoIG9sZE51bSA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2Ygb2xkIHBvaW50cyBtdXN0IGJlID4gMCIgKTsKKyAgICB9CisKKyAgICAvKiBEZWZpbmUgaWYgbmVlZCBudW1iZXIgb2YgYWRkIHBvaW50cyAqLworICAgIGludCBhZGROdW07CisgICAgYWRkTnVtID0gMDsKKyAgICBpZiggYWRkUG9pbnRzICE9IDAgJiYgYWRkU3RhdHVzICE9IDAgKQorICAgIHsvKiBXZSBoYXZlIGFkaXRpb25hbCBwb2ludHMgKi8KKyAgICAgICAgaWYoIENWX0lTX01BVChhZGRQb2ludHMpICYmIENWX0lTX01BU0tfQVJSKGFkZFN0YXR1cykgKQorICAgICAgICB7CisgICAgICAgICAgICBhZGROdW0gPSBhZGRQb2ludHMtPmNvbHM7CisgICAgICAgICAgICBpZiggYWRkU3RhdHVzLT5jb2xzICE9IGFkZE51bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgYWRkIHBvaW50cyBhbmQgc3RhdHVzZXMgbXVzdCBiZSB0aGUgc2FtZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICAqLworCisgICAgaW50IG51bUNvb3JkOworICAgIG51bUNvb3JkID0gKCpvbGRQb2ludHMpLT5yb3dzOworICAgIG5ld1RvdGFsTnVtYmVyID0gb2xkTnVtICsgYWRkTnVtICsgYWRkQ3JlYXRlTnVtOworCisgICAgaWYoIG5ld1RvdGFsTnVtYmVyICkKKyAgICB7CisgICAgICAgIC8qIEZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgICAgICBuZXdPbGRQb2ludCAgPSBjdkNyZWF0ZU1hdChudW1Db29yZCxuZXdUb3RhbE51bWJlcixDVl82NEYpOworICAgICAgICBuZXdPbGRTdGF0dXMgPSBjdkNyZWF0ZU1hdCgxLG5ld1RvdGFsTnVtYmVyLENWXzhTKTsKKworICAgICAgICAvKiBDb3B5IG9sZCB2YWx1ZXMgdG8gICovCisgICAgICAgIGludCBpOworCisgICAgICAgIC8qIENsZWFyIGFsbCB2YWx1ZXMgKi8KKyAgICAgICAgY3ZaZXJvKG5ld09sZFBvaW50KTsKKyAgICAgICAgY3ZaZXJvKG5ld09sZFN0YXR1cyk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG9sZE51bTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGN1cnJDb29yZDsKKyAgICAgICAgICAgIGZvciggY3VyckNvb3JkID0gMDsgY3VyckNvb3JkIDwgbnVtQ29vcmQ7IGN1cnJDb29yZCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdm1TZXQobmV3T2xkUG9pbnQsY3VyckNvb3JkLGksY3ZtR2V0KCpvbGRQb2ludHMsY3VyckNvb3JkLGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld09sZFN0YXR1cy0+ZGF0YS5wdHJbaV0gPSAoKm9sZFN0YXR1cyktPmRhdGEucHRyW2ldOworICAgICAgICB9CisKKyAgICAgICAgLyogQ29weSBhZGRpdGlvbmFsIHBvaW50cyBhbmQgc3RhdHVzZXMgKi8KKyAgICAgICAgaWYoIGFkZE51bSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBhZGROdW07IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGN1cnJDb29yZDsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cnJDb29yZCA9IDA7IGN1cnJDb29yZCA8IG51bUNvb3JkOyBjdXJyQ29vcmQrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdm1TZXQobmV3T2xkUG9pbnQsY3VyckNvb3JkLGkrb2xkTnVtLGN2bUdldChhZGRQb2ludHMsY3VyckNvb3JkLGkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV3T2xkU3RhdHVzLT5kYXRhLnB0cltpK29sZE51bV0gPSBhZGRTdGF0dXMtPmRhdGEucHRyW2ldOworICAgICAgICAgICAgICAgIC8vY3ZtU2V0KG5ld09sZFN0YXR1cywwLGksY3ZtR2V0KGFkZFN0YXR1cywwLGkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIERlbGV0ZSBwcmV2aW91cyBkYXRhICovCisgICAgICAgIGN2UmVsZWFzZU1hdChvbGRQb2ludHMpOworICAgICAgICBjdlJlbGVhc2VNYXQob2xkU3RhdHVzKTsKKworICAgICAgICAvKiBjb3B5IHBvaW50ZXJzICovCisgICAgICAgICpvbGRQb2ludHMgID0gbmV3T2xkUG9pbnQ7CisgICAgICAgICpvbGRTdGF0dXMgPSBuZXdPbGRTdGF0dXM7CisKKyAgICB9CisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBuZXdUb3RhbE51bWJlcjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaWN2UmVtb3ZlRG91YmxlUG9pbnMoICAgQ3ZNYXQgKm9sZFBvaW50cywvKiBQb2ludHMgb24gcHJldiBpbWFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpuZXdQb2ludHMsLyogTmV3IHBvaW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpvbGRTdGF0dXMsLyogU3RhdHVzIGZvciBvbGQgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqb3JpZ1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0aHJlc2hvbGQpLyogU3RhdHVzIGZvciBuZXcgcG9pbnRzICovCit7CisKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgPSAwOworICAgIEN2U3ViZGl2MkQqIHN1YmRpdiA9IDA7CisgICAgQ3ZTZXEqIHNlcSA9IDA7CisKKyAgICBpbnQgb3JpZ2luYWxQb2ludHMgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2UmVtb3ZlRG91YmxlUG9pbnMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBpbnB1dCBkYXRhICovCisgICAgaWYoIG9sZFBvaW50cyA9PSAwIHx8IG5ld1BvaW50cyA9PSAwIHx8CisgICAgICAgIG9sZFN0YXR1cyA9PSAwIHx8IG5ld1N0YXR1cyA9PSAwIHx8IG9yaWdTdGF0dXMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChvbGRQb2ludHMpIHx8ICFDVl9JU19NQVQobmV3UG9pbnRzKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnB1dCBwYXJhbWV0ZXJzIHBvaW50cyBtdXN0IGJlIGEgbWF0cmljZXMiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVNLX0FSUihvbGRTdGF0dXMpIHx8ICFDVl9JU19NQVNLX0FSUihuZXdTdGF0dXMpIHx8ICFDVl9JU19NQVNLX0FSUihvcmlnU3RhdHVzKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnB1dCBwYXJhbWV0ZXJzIHN0YXR1c2VzIG11c3QgYmUgYSBtYXNrIGFycmF5IiApOworICAgIH0KKworICAgIGludCBvbGROdW1Qb2ludHM7CisgICAgb2xkTnVtUG9pbnRzID0gb2xkUG9pbnRzLT5jb2xzOworICAgIGlmKCBvbGROdW1Qb2ludHMgPCAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIG9sZFBvaW50cyBtdXN0IGJlID49IDAiICk7CisgICAgfQorCisgICAgaWYoIG9sZFN0YXR1cy0+Y29scyAhPSBvbGROdW1Qb2ludHMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIG9sZCBQb2ludHMgYW5kIG9sZCBTdGF0dXNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGludCBuZXdOdW1Qb2ludHM7CisgICAgbmV3TnVtUG9pbnRzID0gbmV3UG9pbnRzLT5jb2xzOworICAgIGlmKCBuZXdOdW1Qb2ludHMgPCAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIG5ld1BvaW50cyBtdXN0IGJlID49IDAiICk7CisgICAgfQorCisgICAgaWYoIG5ld1N0YXR1cy0+Y29scyAhPSBuZXdOdW1Qb2ludHMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIG5ldyBQb2ludHMgYW5kIG5ldyBTdGF0dXNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCBvcmlnU3RhdHVzLT5jb2xzICE9IG5ld051bVBvaW50cyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgbmV3IFBvaW50cyBhbmQgbmV3IG9yaWdpbmFsIFN0YXR1cyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCBvbGRQb2ludHMtPnJvd3MgIT0gMikKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiT2xkUG9pbnRzIG11c3QgaGF2ZSAyIGNvb3JkaW5hdGVzID49IDAiICk7CisgICAgfQorCisgICAgaWYoIG5ld1BvaW50cy0+cm93cyAhPSAyKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOZXdQb2ludHMgbXVzdCBoYXZlIDIgY29vcmRpbmF0ZXMgPj0gMCIgKTsKKyAgICB9CisKKyAgICBpZiggb2xkU3RhdHVzLT5yb3dzICE9IDEgfHwgbmV3U3RhdHVzLT5yb3dzICE9IDEgfHwgb3JpZ1N0YXR1cy0+cm93cyAhPSAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiU3RhdHVzZXMgbXVzdCBoYXZlIDEgcm93IiApOworICAgIH0KKyAgICAKKyAgICAvKiB3ZSBoYXZlIHBvaW50cyBvbiBpbWFnZSBhbmQgd2FudHMgYWRkIG5ldyBwb2ludHMgKi8KKyAgICAvKiB1c2Ugc3ViZGl2aXNpb24gZm9yIGZpbmQgbmVhcmVzdCBwb2ludHMgKi8KKworICAgIC8qIERlZmluZSBtYXhpbXVtIGFuZCBtaW5pbXVtIFggYW5kIFkgKi8KKyAgICBmbG9hdCBtaW5YLG1pblk7CisgICAgZmxvYXQgbWF4WCxtYXhZOworCisgICAgbWluWCA9IG1pblkgPSBGTFRfTUFYOworICAgIG1heFggPSBtYXhZID0gRkxUX01JTjsKKworICAgIGludCBpOworCisgICAgZm9yKCBpID0gMDsgaSA8IG9sZE51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBvbGRTdGF0dXMtPmRhdGEucHRyW2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgeCA9IChmbG9hdCljdm1HZXQob2xkUG9pbnRzLDAsaSk7CisgICAgICAgICAgICBmbG9hdCB5ID0gKGZsb2F0KWN2bUdldChvbGRQb2ludHMsMSxpKTsKKworICAgICAgICAgICAgaWYoIHggPCBtaW5YICkKKyAgICAgICAgICAgICAgICBtaW5YID0geDsKKworICAgICAgICAgICAgaWYoIHggPiBtYXhYICkKKyAgICAgICAgICAgICAgICBtYXhYID0geDsKKworICAgICAgICAgICAgaWYoIHkgPCBtaW5ZICkKKyAgICAgICAgICAgICAgICBtaW5ZID0geTsKKworICAgICAgICAgICAgaWYoIHkgPiBtYXhZICkKKyAgICAgICAgICAgICAgICBtYXhZID0geTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBuZXdOdW1Qb2ludHM7IGkrKyApCisgICAgeworICAgICAgICBpZiggbmV3U3RhdHVzLT5kYXRhLnB0cltpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHggPSAoZmxvYXQpY3ZtR2V0KG5ld1BvaW50cywwLGkpOworICAgICAgICAgICAgZmxvYXQgeSA9IChmbG9hdCljdm1HZXQobmV3UG9pbnRzLDEsaSk7CisKKyAgICAgICAgICAgIGlmKCB4IDwgbWluWCApCisgICAgICAgICAgICAgICAgbWluWCA9IHg7CisKKyAgICAgICAgICAgIGlmKCB4ID4gbWF4WCApCisgICAgICAgICAgICAgICAgbWF4WCA9IHg7CisKKyAgICAgICAgICAgIGlmKCB5IDwgbWluWSApCisgICAgICAgICAgICAgICAgbWluWSA9IHk7CisKKyAgICAgICAgICAgIGlmKCB5ID4gbWF4WSApCisgICAgICAgICAgICAgICAgbWF4WSA9IHk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIENyZWFyZSBzdWJkaXZpc2lvbiBmb3Igb2xkIGltYWdlICovCisgICAgc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKTsKKy8vICAgIHN1YmRpdiA9IGN2Q3JlYXRlU3ViZGl2RGVsYXVuYXkyRCggY3ZSZWN0KCAwLCAwLCBzaXplLndpZHRoLCBzaXplLmhlaWdodCApLCBzdG9yYWdlICk7CisgICAgc3ViZGl2ID0gY3ZDcmVhdGVTdWJkaXZEZWxhdW5heTJEKCBjdlJlY3QoIGN2Um91bmQobWluWCktNSwgY3ZSb3VuZChtaW5ZKS01LCBjdlJvdW5kKG1heFgtbWluWCkrMTAsIGN2Um91bmQobWF4WS1taW5ZKSsxMCApLCBzdG9yYWdlICk7CisgICAgc2VxID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZigqc2VxKSwgc2l6ZW9mKEN2UG9pbnQyRDMyZiksIHN0b3JhZ2UgKTsKKworICAgIC8qIEluc2VydCBlYWNoIHBvaW50IGZyb20gZmlyc3QgaW1hZ2UgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgb2xkTnVtUG9pbnRzOyBpKysgKQorICAgIHsKKyAgICAgICAgLyogQWRkIGp1c3QgZXhpc3QgcG9pbnRzICovCisgICAgICAgIGlmKCBvbGRTdGF0dXMtPmRhdGEucHRyW2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludDJEMzJmIHB0OworICAgICAgICAgICAgcHQueCA9IChmbG9hdCljdm1HZXQob2xkUG9pbnRzLDAsaSk7CisgICAgICAgICAgICBwdC55ID0gKGZsb2F0KWN2bUdldChvbGRQb2ludHMsMSxpKTsKKworICAgICAgICAgICAgQ3ZTdWJkaXYyRFBvaW50KiBwb2ludDsKKyAgICAgICAgICAgIHBvaW50ID0gY3ZTdWJkaXZEZWxhdW5heTJESW5zZXJ0KCBzdWJkaXYsIHB0ICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIEZpbmQgbmVhcmVzdCBwb2ludHMgKi8KKyAgICAvKiBmb3IgZWFjaCBuZXcgcG9pbnQgKi8KKyAgICBpbnQgZmxhZzsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmV3TnVtUG9pbnRzOyBpKysgKQorICAgIHsKKyAgICAgICAgZmxhZyA9IDA7CisgICAgICAgIC8qIFRlc3QganVzdCBleGlzdCBwb2ludHMgKi8KKyAgICAgICAgaWYoIG5ld1N0YXR1cy0+ZGF0YS5wdHJbaV0gKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFnID0gMTsKKyAgICAgICAgICAgIC8qIExldCB0aGlzIGlzIGEgZ29vZCBwb2ludCAqLworICAgICAgICAgICAgLy9vcmlnaW5hbFBvaW50cysrOworCisgICAgICAgICAgICBDdlBvaW50MkQzMmYgcHQ7CisKKyAgICAgICAgICAgIHB0LnggPSAoZmxvYXQpY3ZtR2V0KG5ld1BvaW50cywwLGkpOworICAgICAgICAgICAgcHQueSA9IChmbG9hdCljdm1HZXQobmV3UG9pbnRzLDEsaSk7CisKKyAgICAgICAgICAgIEN2U3ViZGl2MkRQb2ludCogcG9pbnQgPSBjdkZpbmROZWFyZXN0UG9pbnQyRCggc3ViZGl2LCBwdCApOworCisgICAgICAgICAgICBpZiggcG9pbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFRlc3QgZGlzdGFuY2Ugb2YgZm91bmQgbmVhcmVzdCBwb2ludCAqLworICAgICAgICAgICAgICAgIGRvdWJsZSBtaW5EaXN0YW5jZSA9IGljdlNxRGlzdDJEMzJmKCBwdCwgcG9pbnQtPnB0ICk7CisKKyAgICAgICAgICAgICAgICBpZiggbWluRGlzdGFuY2UgPCB0aHJlc2hvbGQqdGhyZXNob2xkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50IGlzIGRvdWJsZS4gVHVybiBpdCBvZmYgKi8KKyAgICAgICAgICAgICAgICAgICAgLyogU2V0IHN0YXR1cyAqLworICAgICAgICAgICAgICAgICAgICAvL25ld1N0YXR1cy0+ZGF0YS5wdHJbaV0gPSAwOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgLyogTm8gdGhpcyBpcyBhIGRvdWJsZSBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICAvL29yaWdpbmFsUG9pbnRzLS07CisgICAgICAgICAgICAgICAgICAgIGZsYWcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvcmlnaW5hbFBvaW50cyArPSBmbGFnOworICAgICAgICBvcmlnU3RhdHVzLT5kYXRhIC5wdHJbaV0gPSAodWNoYXIpZmxhZzsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0b3JhZ2UgKTsKKyAgICAKKworICAgIHJldHVybiBvcmlnaW5hbFBvaW50czsKKworCit9CisKK3ZvaWQgaWN2Q29tcHV0ZVByb2plY3RNYXRyaXgoQ3ZNYXQqIG9ialBvaW50cyxDdk1hdCogcHJvalBvaW50cyxDdk1hdCogcHJvak1hdHIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBpY3ZDb21wdXRlUHJvamVjdE1hdHJpeFN0YXR1cyhDdk1hdCAqb2JqUG9pbnRzNEQsQ3ZNYXQgKnBvaW50czIsQ3ZNYXQgKnN0YXR1cywgQ3ZNYXQgKnByb2pNYXRyKQoreworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIGdvb2QgcG9pbnRzICovCisgICAgaW50IG51bSA9IGN2Q291bnROb25aZXJvKHN0YXR1cyk7CisgICAgCisgICAgLyogQ3JlYXRlIGFycmF5cyAqLworICAgIEN2TWF0ICpvYmpQb2ludHMgPSAwOworICAgIG9ialBvaW50cyA9IGN2Q3JlYXRlTWF0KDQsbnVtLENWXzY0Rik7CisKKyAgICBDdk1hdCAqcG9pbnRzMkQgPSAwOworICAgIHBvaW50czJEID0gY3ZDcmVhdGVNYXQoMixudW0sQ1ZfNjRGKTsKKworICAgIGludCBjdXJyVmlzID0gMDsKKyAgICBpbnQgaTsKKyNpZiAxCisgICAgRklMRSAqZmlsZTsKKyAgICBmaWxlID0gZm9wZW4oImQ6XFx0ZXN0XFxwcm9qU3RhdHVzLnR4dCIsInciKTsKKyNlbmRpZgorICAgIGludCB0b3RhbE51bSA9IG9ialBvaW50czRELT5jb2xzOworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbE51bTsgaSsrICkKKyAgICB7CisgICAgICAgIGZwcmludGYoZmlsZSwiJWQgKCVkKSAiLGksc3RhdHVzLT5kYXRhLnB0cltpXSk7CisgICAgICAgIGlmKCBzdGF0dXMtPmRhdGEucHRyW2ldICkKKyAgICAgICAgeworCisjaWYgMQorICAgICAgICAgICAgZG91YmxlIFgsWSxaLFc7CisgICAgICAgICAgICBkb3VibGUgeCx5OworICAgICAgICAgICAgWCA9IGN2bUdldChvYmpQb2ludHM0RCwwLGkpOworICAgICAgICAgICAgWSA9IGN2bUdldChvYmpQb2ludHM0RCwxLGkpOworICAgICAgICAgICAgWiA9IGN2bUdldChvYmpQb2ludHM0RCwyLGkpOworICAgICAgICAgICAgVyA9IGN2bUdldChvYmpQb2ludHM0RCwzLGkpOworCisgICAgICAgICAgICB4ID0gY3ZtR2V0KHBvaW50czIsMCxpKTsKKyAgICAgICAgICAgIHkgPSBjdm1HZXQocG9pbnRzMiwxLGkpOworICAgICAgICAgICAgZnByaW50ZihmaWxlLCIlZCAoJWxmICVsZiAlbGYgJWxmKSAtICglbGYgJWxmKSIsaSxYLFksWixXLHgseSApOworI2VuZGlmCisgICAgICAgICAgICBjdm1TZXQob2JqUG9pbnRzLDAsY3VyclZpcyxjdm1HZXQob2JqUG9pbnRzNEQsMCxpKSk7CisgICAgICAgICAgICBjdm1TZXQob2JqUG9pbnRzLDEsY3VyclZpcyxjdm1HZXQob2JqUG9pbnRzNEQsMSxpKSk7CisgICAgICAgICAgICBjdm1TZXQob2JqUG9pbnRzLDIsY3VyclZpcyxjdm1HZXQob2JqUG9pbnRzNEQsMixpKSk7CisgICAgICAgICAgICBjdm1TZXQob2JqUG9pbnRzLDMsY3VyclZpcyxjdm1HZXQob2JqUG9pbnRzNEQsMyxpKSk7CisKKyAgICAgICAgICAgIGN2bVNldChwb2ludHMyRCwwLGN1cnJWaXMsY3ZtR2V0KHBvaW50czIsMCxpKSk7CisgICAgICAgICAgICBjdm1TZXQocG9pbnRzMkQsMSxjdXJyVmlzLGN2bUdldChwb2ludHMyLDEsaSkpOworCisgICAgICAgICAgICBjdXJyVmlzKys7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZwcmludGYoZmlsZSwiXG4iKTsKKyAgICB9CisKKyNpZiAxCisgICAgZmNsb3NlKGZpbGUpOworI2VuZGlmCisKKyAgICBpY3ZDb21wdXRlUHJvamVjdE1hdHJpeChvYmpQb2ludHMscG9pbnRzMkQscHJvak1hdHIpOworCisgICAgLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgY3ZSZWxlYXNlTWF0KCZvYmpQb2ludHMpOworICAgIGN2UmVsZWFzZU1hdCgmcG9pbnRzMkQpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZvciBnaXZlbiBOIGltYWdlcyAKKyB3ZSBoYXZlIGNvcnJlc3BvbmRpbmcgcG9pbnRzIG9uIE4gaW1hZ2VzCisgY29tcHV0ZWQgcHJvamVjdGlvbiBtYXRyaWNlcworIHJlY29uc3RydWN0ZWQgNEQgcG9pbnRzCisKKyAgd2UgbXVzdCB0byBjb21wdXRlIAorICAKKworKi8KKwordm9pZCBpY3ZBZGROZXdJbWFnZVRvUHJldmlvdXNfX19fKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKm5ld0ltYWdlLC8vSW1hZ2UgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSAqb2xkSW1hZ2UsLy9QcmV2aW91cyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm9sZFBvaW50cywvLyBwcmV2aW91cyAyRCBwb2ludHMgb24gcHJldiBpbWFnZSAoc29tZSBwb2ludHMgbWF5IGJlIG5vdCB2aXNpYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm9sZFBudFN0YXR1cywvL1N0YXR1cyBmb3IgZWFjaCBwb2ludCBvbiBwcmV2IGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqb2JqUG9pbnRzNEQsLy9wcmV2IDREIHBvaW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld1BvaW50cywgIC8vUG9pbnRzIG9uIG5ldyBpbWFnZSBjb3JyIGZvciBwcmV2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqbmV3UG50U3RhdHVzLC8vIE5ldyBwb2ludCBzdGF0dXMgZm9yIG5ldyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld0ZQb2ludHMyRDEsLy9uZXcgZmVhdHVyZSBwb2ludHMgb24gcHJldiBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld0ZQb2ludHMyRDIsLy9uZXcgZmVhdHVyZSBwb2ludHMgb24gbmV3IGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqbmV3RlBvaW50c1N0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpuZXdQcm9qTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1c2VGaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhyZXNob2xkKS8vTmV3IHByb2plY3Rpb24gbWF0cml4Cit7CisgICAgQ3ZNYXQgKnBvaW50czIgPSAwOworICAgIEN2TWF0ICpzdGF0dXMgPSAwOworICAgIEN2TWF0ICpuZXdGUG9pbnRzU3RhdHVzVG1wID0gMDsKKworICAgIC8vQ1ZfRlVOQ05BTUUoICJpY3ZBZGROZXdJbWFnZVRvUHJldmlvdXNfX19fIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIEZpcnN0IGZvdW5kIGNvcnJlc3BvbmRlbmNlIHBvaW50cyBmb3IgaW1hZ2VzICovCisKKyAgICAvKiBUZXN0IGlucHV0IHBhcmFtcyAqLworCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBvbGRQb2ludHMtPmNvbHM7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKworICAgIHBvaW50czIgPSBjdkNyZWF0ZU1hdCgyLG51bVBvaW50cyxDVl82NEYpOworICAgIHN0YXR1cyA9IGN2Q3JlYXRlTWF0KDEsbnVtUG9pbnRzLENWXzhTKTsKKyAgICBuZXdGUG9pbnRzU3RhdHVzVG1wID0gY3ZDcmVhdGVNYXQoMSwgbmV3RlBvaW50czJEMS0+Y29scyxDVl84Uyk7CisKKyAgICBpbnQgY29yck51bTsKKyAgICBjb3JyTnVtID0gaWN2RmluZENvcnJGb3JHaXZlblBvaW50cyggICAgb2xkSW1hZ2UsLyogSW1hZ2UgMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbWFnZSwvKiBJbWFnZSAyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBvaW50cywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBudFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VGaWx0ZXIsLypVc2UgZnVuZGFtZW50YWwgbWF0cml4IHRvIGZpbHRlciBwb2ludHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkKTsvKiBUaHJlc2hvbGQgZm9yIGdvb2QgcG9pbnRzIGluIGZpbHRlciAqLworCisgICAgY3ZDb3B5KHN0YXR1cyxuZXdQbnRTdGF0dXMpOworICAgIGN2Q29weShwb2ludHMyLG5ld1BvaW50cyk7CisKKyAgICBDdk1hdCBwcm9qTWF0cjsKKyAgICBkb3VibGUgcHJvak1hdHJfZGF0WzEyXTsKKyAgICBwcm9qTWF0ciA9IGN2TWF0KDMsNCxDVl82NEYscHJvak1hdHJfZGF0KTsKKworICAgIGlmKCBjb3JyTnVtID49IDYgKQorICAgIHsvKiBXZSBjYW4gY29tcHV0ZSBwcm9qZWN0aW9uIG1hdHJpeCAqLworLy8gICAgICAgIGljdkNvbXB1dGVQcm9qZWN0TWF0cml4KG9ialBvaW50czRELHBvaW50czIsJnByb2pNYXRyKTsKKyAgICAgICAgaWN2Q29tcHV0ZVByb2plY3RNYXRyaXhTdGF0dXMob2JqUG9pbnRzNEQscG9pbnRzMixzdGF0dXMsJnByb2pNYXRyKTsKKyAgICAgICAgY3ZDb3B5KCZwcm9qTWF0cixuZXdQcm9qTWF0cik7CisgICAgICAgIAorICAgICAgICAvKiBDcmVhdGUgbmV3IHBvaW50cyBhbmQgZmluZCBjb3JyZXNwb25kZW5jZSAqLworICAgICAgICBpY3ZDcmVhdGVGZWF0dXJlUG9pbnRzKG5ld0ltYWdlLCBuZXdGUG9pbnRzMkQyLG5ld0ZQb2ludHNTdGF0dXMpOworICAgICAgICAKKyAgICAgICAgLyogR29vZCBpZiB3ZSB0ZXN0IG5ldyBwb2ludHMgYmVmb3JlIGZpbmQgY29yciBwb2ludHMgKi8KKworICAgICAgICAvKiBGaW5kIGNvcnJlc3BvbmRlbmNlIGZvciBuZXcgZm91bmQgcG9pbnRzICovCisgICAgICAgIGljdkZpbmRDb3JyRm9yR2l2ZW5Qb2ludHMoIG5ld0ltYWdlLC8qIEltYWdlIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkSW1hZ2UsLyogSW1hZ2UgMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGUG9pbnRzMkQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGUG9pbnRzU3RhdHVzLC8vcHJldiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RlBvaW50czJEMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RlBvaW50c1N0YXR1c1RtcCwvL25ldyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmlsdGVyLC8qVXNlIGZ1bmRhbWVudGFsIG1hdHJpeCB0byBmaWx0ZXIgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVzaG9sZCk7LyogVGhyZXNob2xkIGZvciBnb29kIHBvaW50cyBpbiBmaWx0ZXIgKi8KKworICAgICAgICAvKiBXZSBnZW5lcmF0ZWQgbmV3IHBvaW50cyBvbiBpbWFnZSB0ZXN0IGZvciBleGlzdCBwb2ludHMgKi8KKworICAgICAgICAvKiBSZW1vdmUgYWxsIG5ldyBkb3VibGUgcG9pbnRzICovCisKKyAgICAgICAgaW50IG9yaWdOdW07CisgICAgICAgIC8qIEZpbmQgcG9pbnQgb2Ygb2xkIGltYWdlICovCisgICAgICAgIG9yaWdOdW0gPSBpY3ZSZW1vdmVEb3VibGVQb2lucyggb2xkUG9pbnRzLC8qIFBvaW50cyBvbiBwcmV2IGltYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RlBvaW50czJEMSwvKiBOZXcgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUG50U3RhdHVzLC8qIFN0YXR1cyBmb3Igb2xkIHBvaW50cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0ZQb2ludHNTdGF0dXNUbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RlBvaW50c1N0YXR1c1RtcCwvL29yaWcgc3RhdHVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjApOy8qIFN0YXR1cyBmb3IgbmV3IHBvaW50cyAqLworCisgICAgICAgIC8qIEZpbmQgZG91YmxlIHBvaW50cyBvbiBuZXcgaW1hZ2UgKi8KKyAgICAgICAgb3JpZ051bSA9IGljdlJlbW92ZURvdWJsZVBvaW5zKCBuZXdQb2ludHMsLyogUG9pbnRzIG9uIHByZXYgaW1hZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGUG9pbnRzMkQyLC8qIE5ldyBwb2ludHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdQbnRTdGF0dXMsLyogU3RhdHVzIGZvciBvbGQgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RlBvaW50c1N0YXR1c1RtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdGUG9pbnRzU3RhdHVzVG1wLC8vb3JpZyBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMCk7LyogU3RhdHVzIGZvciBuZXcgcG9pbnRzICovCisKKworCisgICAgICAgIC8qIEFkZCBhbGwgbmV3IGdvb2QgcG9pbnRzIHRvIHJlc3VsdCAqLworCisKKyAgICAgICAgLyogQ29weSBuZXcgc3RhdHVzIHRvIG9sZCAqLworICAgICAgICBjdkNvcHkobmV3RlBvaW50c1N0YXR1c1RtcCxuZXdGUG9pbnRzU3RhdHVzKTsKKworCisgICAgfQorCisKKworICAgIF9fRU5EX187CisKKyAgICAvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKworICAgIHJldHVybjsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvL2ludCBpY3ZEZWxldGUvLworLy9DcmVhdGVHb29kCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaWN2RGVsZXRlU3BhcnNJblBvaW50cyggIGludCBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICoqcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqKnN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKndhc1N0YXR1cykvKiBzdGF0dXMgb2YgcHJldmlvdXMgY29uZmlndXJhdGlvbiAqLworeworICAgIC8qIERlbGV0ZSBwb2ludHMgd2hpY2ggbm8gZXhpc3Qgb24gYW55IG9mIGltYWdlcyAqLworICAgIC8qIG51bUltYWdlcyAtIG51bWJlciBvZiBpbWFnZXMgKi8KKyAgICAvKiBwb2ludHMgLSBhcnJheXMgb2YgcG9pbnRzIGZvciBlYWNoIGltYWdlLiBDaGFuZ2luZyAqLworICAgIC8qIHN0YXR1cyAtIGFycmF5cyBvZiBzdGF0dXMgZm9yIGVhY2ggaW1hZ2UuIENoYW5naW5nICovCisgICAgLyogRnVuY3Rpb24gcmV0dXJucyBudW1iZXIgb2YgY29tbW9uIHBvaW50cyAqLworCisgICAgaW50IGNvbU51bWJlciA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZEZWxldGVTcGFyc0luUG9pbnRzIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIFRlc3QgZm9yIGVycm9ycyAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IGJlIG1vcmUgdGhhbiAwIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHMgPT0gMCB8fCBzdGF0dXMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisgICAgaW50IG51bVBvaW50czsKKworICAgIG51bVBvaW50cyA9IHBvaW50c1swXS0+Y29sczsKKyAgICAvLy8vLy8vLy8vIFRFU1RTIC8vLy8vLy8vLy8KKworICAgIGludCBudW1Db29yZDsKKyAgICBudW1Db29yZCA9IHBvaW50c1swXS0+cm93czsvLyAhISEgbWF5IGJlIG51bWJlciBvZiBjb29yZGluYXRlcyBpcyBub3QgY29ycmVjdCAhISEKKyAgICAKKyAgICBpbnQgaTsKKyAgICBpbnQgY3VyckV4aXN0UG9pbnQ7CisgICAgY3VyckV4aXN0UG9pbnQgPSAwOworCisgICAgaWYoIHdhc1N0YXR1cyApCisgICAgeworICAgICAgICBjdlplcm8od2FzU3RhdHVzKTsKKyAgICB9CisKKyAgICBpbnQgY3VyckltYWdlOworICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgeworICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsYWcgfD0gc3RhdHVzW2N1cnJJbWFnZV0tPmRhdGEucHRyW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGZsYWcgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDdXJyZW50IHBvaW50IGV4aXN0cyAqLworICAgICAgICAgICAgLyogQ29weSBwb2ludHMgYW5kIHN0YXR1cyAqLworICAgICAgICAgICAgaWYoIGN1cnJFeGlzdFBvaW50ICE9IGkgKS8qIENvcHkganVzdCBpZiBkaWZmZXJlbnQgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSBwb2ludHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgY3VyckNvb3JkID0gMDsgY3VyckNvb3JkIDwgbnVtQ29vcmQ7IGN1cnJDb29yZCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHBvaW50c1tjdXJySW1hZ2VdLGN1cnJDb29yZCxjdXJyRXhpc3RQb2ludCwgY3ZtR2V0KHBvaW50c1tjdXJySW1hZ2VdLGN1cnJDb29yZCxpKSApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogQ29weSBzdGF0dXMgKi8KKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzW2N1cnJJbWFnZV0tPmRhdGEucHRyW2N1cnJFeGlzdFBvaW50XSA9IHN0YXR1c1tjdXJySW1hZ2VdLT5kYXRhLnB0cltpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggd2FzU3RhdHVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3YXNTdGF0dXMtPmRhdGEucHRyW2ldID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VyckV4aXN0UG9pbnQrKzsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyogUmVzdCBvZiBmaW5hbCBzdGF0dXMgb2YgcG9pbnRzIG11c3QgYmUgc2V0IHRvIDAgICovCisgICAgZm9yKCBpID0gY3VyckV4aXN0UG9pbnQ7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXNbY3VyckltYWdlXS0+ZGF0YS5wdHJbaV0gPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgY29tTnVtYmVyID0gY3VyckV4aXN0UG9pbnQ7CisKKyAgICBfX0VORF9fOworICAgIHJldHVybiBjb21OdW1iZXI7Cit9CisKKyNpZiAwCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBpY3ZHcm93UG9pbnRzQXJyYXkoQ3ZNYXQgKipwb2ludHMpCit7CisKKworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBpY3ZBZGROZXdBcnJheVBvaW50cygpCit7CisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbmRpZgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyogQWRkIGltYWdlIHRvIGV4aXN0aW5nIGltYWdlcyBhbmQgY29yciBwb2ludHMgKi8KKyNpZiAwCisvKiBSZXR1cm5zOiAxIGlmIG5ldyBpbWFnZSB3YXMgYWRkZWQgZ29vZCAqLworLyogICAgICAgICAgMCBpbWFnZSB3YXMgbm90IGFkZGVkLiBOb3QgZW5vdWdodCBjb3JyIHBvaW50cyAqLworaW50IEFkZEltYWdlVG9TdHJ1Y3QoICBJcGxJbWFnZSAqbmV3SW1hZ2UsLy9JbWFnZSB0byBhZGQKKyAgICAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlICpvbGRJbWFnZSwvL1ByZXZpb3VzIGltYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqb2xkUG9pbnRzLC8vIHByZXZpb3VzIDJEIHBvaW50cyBvbiBwcmV2IGltYWdlIChzb21lIHBvaW50cyBtYXkgYmUgbm90IHZpc2libGUpCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqb2xkUG50U3RhdHVzLC8vU3RhdHVzIGZvciBlYWNoIHBvaW50IG9uIHByZXYgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpvYmpQb2ludHM0RCwvL3ByZXYgNEQgcG9pbnRzCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqbmV3UG50U3RhdHVzLC8vIE5ldyBwb2ludCBzdGF0dXMgZm9yIG5ldyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld1BvaW50cywvL05ldyBjb3JyZXNwb25kaW5nIHBvaW50cyBvbiBuZXcgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpuZXdQb2ludHMyRDEsLy9uZXcgcG9pbnRzIG9uIHByZXYgaW1hZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICpuZXdQb2ludHMyRDIsLy9uZXcgcG9pbnRzIG9uIG5ldyBpbWFnZQorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKm5ld1Byb2pNYXRyKTsvL05ldyBwcm9qZWN0aW9uIG1hdHJpeAoreworCisgICAgLyogQWRkIG5ldyBpbWFnZS4gQ3JlYXRlIG5ldyBjb3JyIHBvaW50cyAqLworICAgIC8qIFRyYWNrIGV4aXN0IHBvaW50cyBmcm9tIG9sZEltYWdlIHRvIG5ld0ltYWdlICovCisgICAgLyogQ3JlYXRlIG5ldyB2ZWN0b3Igc3RhdHVzICovCisgICAgQ3ZNYXQgKnN0YXR1czsKKyAgICBpbnQgbnVtUG9pbnRzID0gb2xkUG9pbnRzLT5jb2xzOworICAgIHN0YXR1cyA9IGN2Q3JlYXRlTWF0KDEsbnVtUG9pbnRzLENWXzY0Rik7CisgICAgLyogQ29weSBzdGF0dXMgKi8KKyAgICBjdkNvbnZlcnQocG50U3RhdHVzLHN0YXR1cyk7CisKKyAgICBpbnQgY29yck51bSA9IEZpbmRDb3JyRm9yR2l2ZW5Qb2ludHMob2xkSW1hZ2UsbmV3SW1hZ2Usb2xkUG9pbnRzLG5ld1BvaW50cyxzdGF0dXMpOworICAgIAorICAgIC8qIFN0YXR1cyBoYXMgbmV3IHN0YXR1cyBvZiBwb2ludHMgKi8KKworICAgIEN2TWF0IHByb2pNYXRyOworICAgIGRvdWJsZSBwcm9qTWF0cl9kYXRbMTJdOworICAgIHByb2pNYXRyID0gY3ZNYXQoMyw0LENWXzY0Rixwcm9qTWF0cl9kYXQpOworCisgICAgLyogSWYgbnVtYmVyIG9mIGNvcnIgcG9pbnRzIGlzIDYgb3IgbW9yZSBjYW4gY29tcHV0ZSBwcm9qZWN0aW9uIG1hdHJpeCAqLworICAgIGlmKCBjb3JyTnVtID49IDYpCisgICAgeworICAgICAgICAvKiBDb21wdXRlIHByb2plY3Rpb24gbWF0cml4IGZvciBuZXcgaW1hZ2UgdXNpbmcgY29ycmVzcG9uZGluZyBwb2ludHMgKi8KKyAgICAgICAgaWN2Q29tcHV0ZVByb2plY3RNYXRyaXgob2JqUG9pbnRzNEQsbmV3UG9pbnRzLCZwcm9qTWF0cik7CisKKyAgICAgICAgQ3ZNYXQgKnRtcFBvaW50czsKKyAgICAgICAgLyogQ3JlYXRlIG5ldyBwb2ludHMgYW5kIGZpbmQgY29ycmVzcG9uZGVuY2UgKi8KKyAgICAgICAgaW50IG51bSA9IEZpbmRGZWF0dXJlUG9pbnRzKG5ld0ltYWdlLCAmdG1wUG9pbnRzKTsKKyAgICAgICAgaWYoIG51bSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBDdk1hdCAqbmV3UG9pbnRzOworICAgICAgICAgICAgbmV3UG9pbnRzID0gY3ZDcmVhdGVNYXQoMixudW0sQ1ZfNjRGKTsKKyAgICAgICAgICAgIEN2TWF0ICpzdGF0dXM7CisgICAgICAgICAgICBzdGF0dXMgPSBjdkNyZWF0ZU1hdCgxLG51bSxDVl82NEYpOworICAgICAgICAgICAgLyogU2V0IHN0YXR1cyBmb3IgYWxsIHBvaW50cyAqLworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2bVNldChzdGF0dXMsMCxpLDEuMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBjb3JyTnVtMiA9IEZpbmRDb3JyRm9yR2l2ZW5Qb2ludHMob2xkSW1hZ2UsbmV3SW1hZ2UsdG1wUG9pbnRzLG5ld1BvaW50cyxzdGF0dXMpOworCisgICAgICAgICAgICAvKiAhISEgRmlsdGVyIHBvaW50cyB1c2luZyBwcm9qZWN0aW9uIG1hdHJpY2VzIG9yIG5vdCA/Pz8gKi8KKworICAgICAgICAgICAgLyogISEhIE5lZWQgdG8gZmlsdGVyIG5lYXJlc3QgcG9pbnRzICovCisKKyAgICAgICAgICAgIC8qIEFkZCBuZXcgZm91bmQgcG9pbnRzIHRvIGV4aXN0IHBvaW50cyBhbmQgb3B0aW1pemUgYWdhaW4gKi8KKyAgICAgICAgICAgIEN2TWF0ICpuZXcyRFBvaW50czsKKyAgICAgICAgICAgIEN2TWF0ICpuZXdTdGF0dXM7CisKKyAgICAgICAgICAgIC8qIGFkZCBuZXcgc3RhdHVzIHRvIG9sZCBzdGF0dXMgKi8KKworCisKKworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBObyBuZXcgcG9pbnRzIHdlcmUgZm91bmQgKi8KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBXZSBjYW4ndCBjb21wdXRlIHByb2plY3Rpb24gbWF0cml4IGZvciBuZXcgaW1hZ2UgKi8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmNyZWF0ZWhhbmRtYXNrLmNwcCBiL2N2YXV4L3NyYy9jdmNyZWF0ZWhhbmRtYXNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWI5NTNjCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2Y3JlYXRlaGFuZG1hc2suY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2RlZmluZSBDVl9NQVgyKCBhLCBiICkgKChhKT4oYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIENWX01JTjIoIGEsIGIgKSAoKGEpPChiKSA/IChhKSA6IChiKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKyAgIGNyZWF0ZSBoYW5kIG1hc2sKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBpY3ZDcmVhdGVIYW5kTWFzazh1QzFSKEN2U2VxICogbnVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICogaW1hZ2VfbWFzaywgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgQ3ZSZWN0ICogcm9pICkKK3sKKworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdlBvaW50IHB0OworICAgIGludCBrX3BvaW50OworICAgIGludCBpX21pbiwgaV9tYXgsIGpfbWluLCBqX21heDsKKworICAgIGlmKCBudW1iZXJzID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICBpZiggIUNWX0lTX1NFUV9QT0lOVF9TRVQoIG51bWJlcnMgKSkKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworCisgICAgaV9tYXggPSBqX21heCA9IDA7CisgICAgaV9taW4gPSBzaXplLmhlaWdodDsKKyAgICBqX21pbiA9IHNpemUud2lkdGg7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggbnVtYmVycywgJnJlYWRlciwgMCApOworCisgICAga19wb2ludCA9IG51bWJlcnMtPnRvdGFsOworICAgIGFzc2VydCgga19wb2ludCA+IDAgKTsKKyAgICBpZigga19wb2ludCA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgbWVtc2V0KCBpbWFnZV9tYXNrLCAwLCBzdGVwICogc2l6ZS5oZWlnaHQgKTsKKworICAgIHdoaWxlKCBrX3BvaW50LS0gPiAwICkKKyAgICB7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHB0LCByZWFkZXIgKTsKKworICAgICAgICBpX21pbiA9IENWX01JTjIoIGlfbWluLCBwdC55ICk7CisgICAgICAgIGlfbWF4ID0gQ1ZfTUFYMiggaV9tYXgsIHB0LnkgKTsKKyAgICAgICAgal9taW4gPSBDVl9NSU4yKCBqX21pbiwgcHQueCApOworICAgICAgICBqX21heCA9IENWX01BWDIoIGpfbWF4LCBwdC54ICk7CisKKyAgICAgICAgKihpbWFnZV9tYXNrICsgcHQueSAqIHN0ZXAgKyBwdC54KSA9IDI1NTsKKyAgICB9CisKKyAgICByb2ktPnggPSBqX21pbjsKKyAgICByb2ktPnkgPSBpX21pbjsKKyAgICByb2ktPndpZHRoID0gal9tYXggLSBqX21pbiArIDE7CisgICAgcm9pLT5oZWlnaHQgPSBpX21heCAtIGlfbWluICsgMTsKKworICAgIHJldHVybiBDVl9PSzsKKworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgIGN2Q3JlYXRlSGFuZE1hc2sKKy8vICAgIFB1cnBvc2U6ICBjcmVhdGVzIGhhbmQgbWFzayBpbWFnZQorLy8gICAgQ29udGV4dDogICAKKy8vICAgIFBhcmFtZXRlcnM6IAorLy8gICAgICBudW1iZXJzIC0gcG9pbnRlciB0byB0aGUgaW5wdXQgc2VxdWVuY2Ugb2YgdGhlIHBvaW50J3MgaW5kZXhlcyBpbnNpZGUKKy8vICAgICAgICAgICAgICAgIGhhbmQgcmVnaW9uICAgICAgICAgICAgICAgIAorLy8gICAgICBpbWdfbWFzayAtIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBtYXNrIGltYWdlIAorLy8gICAgICByb2kgICAgICAtIHJlc3VsdCBoYW5kIG1hc2sgUk9JIAorLy8gICAgICAKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgdm9pZAorY3ZDcmVhdGVIYW5kTWFzayggQ3ZTZXEgKiBudW1iZXJzLCBJcGxJbWFnZSAqIGltZ19tYXNrLCBDdlJlY3QgKiByb2kgKQoreworICAgIHVjaGFyICppbWdfbWFza19kYXRhID0gMDsKKyAgICBpbnQgaW1nX21hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIGltZ19tYXNrX3NpemU7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlSGFuZE1hc2siICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggaW1nX21hc2stPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgaWYoIGltZ19tYXNrLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIm91dHB1dCBpbWFnZSBoYXZlIHdyb25nIG51bWJlciBvZiBjaGFubmVscyIgKTsKKworICAgIGN2R2V0SW1hZ2VSYXdEYXRhKCBpbWdfbWFzaywgJmltZ19tYXNrX2RhdGEsICZpbWdfbWFza19zdGVwLCAmaW1nX21hc2tfc2l6ZSApOworCisgICAgSVBQSV9DQUxMKCBpY3ZDcmVhdGVIYW5kTWFzazh1QzFSKCBudW1iZXJzLCBpbWdfbWFza19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19tYXNrX3N0ZXAsIGltZ19tYXNrX3NpemUsIHJvaSApKTsKKworICAgIF9fRU5EX187Cit9CmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZkcHN0ZXJlby5jcHAgYi9jdmF1eC9zcmMvY3ZkcHN0ZXJlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyNzgwOQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmRwc3RlcmVvLmNwcApAQCAtMCwwICsxLDU1NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgVGhlIGNvZGUgYmVsb3cgaXMgc29tZSBtb2RpZmljYXRpb24gb2YgU3RhbiBCaXJjaGZpZWxkJ3MgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbjoKKworICAgIERlcHRoIERpc2NvbnRpbnVpdGllcyBieSBQaXhlbC10by1QaXhlbCBTdGVyZW8KKyAgICBTdGFuIEJpcmNoZmllbGQgYW5kIENhcmxvIFRvbWFzaQorICAgIEludGVybmF0aW9uYWwgSm91cm5hbCBvZiBDb21wdXRlciBWaXNpb24sCisgICAgMzUoMyk6IDI2OS0yOTMsIERlY2VtYmVyIDE5OTkuCisgICAgCisgICAgVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGRpZmZlcmVudCBjb3N0IGZ1bmN0aW9uIHRoYXQgcmVzdWx0cyBpbgorICAgIE8ocGl4UGVyUm93Km1heERpc3Bhcml0eSkgY29tcGxleGl0eSBvZiBkeW5hbWljIHByb2dyYW1taW5nIHN0YWdlIHZlcnN1cworICAgIE8ocGl4UGVyUm93KmxvZyhwaXhQZXJSb3cpKm1heERpc3Bhcml0eSkgaW4gdGhlIGFib3ZlIHBhcGVyLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICBGaW5kIHN0ZXJlbyBjb3JyZXNwb25kZW5jZSBieSBkeW5hbWljIHByb2dyYW1taW5nIGFsZ29yaXRobSAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgSUNWX0RQX1NURVBfTEVGVCAgMAorI2RlZmluZSBJQ1ZfRFBfU1RFUF9VUCAgICAxCisjZGVmaW5lIElDVl9EUF9TVEVQX0RJQUcgIDIKKworI2RlZmluZSBJQ1ZfQklSQ0hfRElGRl9MVU0gNQorCisjZGVmaW5lIElDVl9NQVhfRFBfU1VNX1ZBTCAoSU5UX01BWC80KQorCit0eXBlZGVmIHN0cnVjdCBfQ3ZEUENlbGwKK3sKKyAgICB1Y2hhciAgc3RlcDsgLy9sb2NhbC1vcHRpbWFsIHN0ZXAKKyAgICBpbnQgICAgc3VtOyAgLy9jdXJyZW50IHN1bSAgCit9X0N2RFBDZWxsOworCit0eXBlZGVmIHN0cnVjdCBfQ3ZSaWdodEltRGF0YQoreworICAgIHVjaGFyIG1pbl92YWwsIG1heF92YWw7Cit9IF9DdlJpZ2h0SW1EYXRhOworCisjZGVmaW5lIENWX0lNQVgzKGEsYixjKSAoKHRlbXAzID0gKGEpID49IChiKSA/IChhKSA6IChiKSksKHRlbXAzID49IChjKSA/IHRlbXAzIDogKGMpKSkKKyNkZWZpbmUgQ1ZfSU1JTjMoYSxiLGMpICgodGVtcDMgPSAoYSkgPD0gKGIpID8gKGEpIDogKGIpKSwodGVtcDMgPD0gKGMpID8gdGVtcDMgOiAoYykpKQorCit2b2lkIGljdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZUJ5QmlyY2hmaWVsZERQKCB1Y2hhciogc3JjMSwgdWNoYXIqIHNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZGlzcGFyaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IHdpZHRoU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBtYXhEaXNwYXJpdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgIF9wYXJhbTEsIGZsb2F0IF9wYXJhbTIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgIF9wYXJhbTMsIGZsb2F0IF9wYXJhbTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAgX3BhcmFtNSApCit7CisgICAgaW50ICAgICB4LCB5LCBpLCBqLCB0ZW1wMzsKKyAgICBpbnQgICAgIGQsIHM7CisgICAgaW50ICAgICBkaXNwSCA9ICBtYXhEaXNwYXJpdHkgKyAzOyAKKyAgICB1Y2hhciAgKmRpc3BkYXRhOworICAgIGludCAgICAgaW1nVyA9IHNpemUud2lkdGg7CisgICAgaW50ICAgICBpbWdIID0gc2l6ZS5oZWlnaHQ7CisgICAgdWNoYXIgICB2YWwsIHByZXZ2YWwsIHByZXYsIGN1cnI7CisgICAgaW50ICAgICBtaW5fdmFsOworICAgIHVjaGFyKiAgZGVzdCA9IGRpc3Bhcml0aWVzOworICAgIGludCBwYXJhbTEgPSBjdlJvdW5kKF9wYXJhbTEpOworICAgIGludCBwYXJhbTIgPSBjdlJvdW5kKF9wYXJhbTIpOworICAgIGludCBwYXJhbTMgPSBjdlJvdW5kKF9wYXJhbTMpOworICAgIGludCBwYXJhbTQgPSBjdlJvdW5kKF9wYXJhbTQpOworICAgIGludCBwYXJhbTUgPSBjdlJvdW5kKF9wYXJhbTUpOworCisgICAgI2RlZmluZSBDRUxMKGQseCkgICBjZWxsc1soZCkrKHgpKmRpc3BIXQorICAgIAorICAgIHVjaGFyKiAgICAgICAgICAgICAgZHNpID0gKHVjaGFyKiljdkFsbG9jKHNpemVvZih1Y2hhcikqaW1nVypkaXNwSCk7CisgICAgdWNoYXIqICAgICAgICAgICAgICBlZGdlcyA9ICh1Y2hhciopY3ZBbGxvYyhzaXplb2YodWNoYXIpKmltZ1cqaW1nSCk7CisgICAgX0N2RFBDZWxsKiAgICAgICAgICBjZWxscyA9IChfQ3ZEUENlbGwqKWN2QWxsb2Moc2l6ZW9mKF9DdkRQQ2VsbCkqaW1nVypNQVgoZGlzcEgsKGltZ0grMSkvMikpOworICAgIF9DdlJpZ2h0SW1EYXRhKiAgICAgckRhdGEgPSAoX0N2UmlnaHRJbURhdGEqKWN2QWxsb2Moc2l6ZW9mKF9DdlJpZ2h0SW1EYXRhKSppbWdXKTsKKyAgICBpbnQqICAgICAgICAgICAgICAgIHJlbGlhYmlsaXRpZXMgPSAoaW50KiljZWxsczsKKyAgICAKKyAgICBmb3IoIHkgPSAwOyB5IDwgaW1nSDsgeSsrICkgCisgICAgeyAKKyAgICAgICAgdWNoYXIqIHNyY2RhdGExID0gc3JjMSArIHdpZHRoU3RlcCAqIHk7CisgICAgICAgIHVjaGFyKiBzcmNkYXRhMiA9IHNyYzIgKyB3aWR0aFN0ZXAgKiB5OyAgICAgICAgCisKKyAgICAgICAgLy9pbml0IHJEYXRhCisgICAgICAgIHByZXZ2YWwgPSBwcmV2ID0gc3JjZGF0YTJbMF07CisgICAgICAgIGZvciggaiA9IDE7IGogPCBpbWdXOyBqKysgKQorICAgICAgICB7ICAgICAgICAgICAgIAorICAgICAgICAgICAgY3VyciA9IHNyY2RhdGEyW2pdOworICAgICAgICAgICAgdmFsID0gKHVjaGFyKSgoY3VyciArIHByZXYpPj4xKTsKKyAgICAgICAgICAgIHJEYXRhW2otMV0ubWF4X3ZhbCA9ICh1Y2hhcilDVl9JTUFYMyggdmFsLCBwcmV2dmFsLCBwcmV2ICk7CisgICAgICAgICAgICByRGF0YVtqLTFdLm1pbl92YWwgPSAodWNoYXIpQ1ZfSU1JTjMoIHZhbCwgcHJldnZhbCwgcHJldiApOworICAgICAgICAgICAgcHJldnZhbCA9IHZhbDsKKyAgICAgICAgICAgIHByZXYgPSBjdXJyOworICAgICAgICB9CisgICAgICAgIHJEYXRhW2otMV0gPSByRGF0YVtqLTJdOy8vbGFzdCBlbGVtCisKKyAgICAgICAgLy8gZmlsbCBkaXNzaW11bGFyaXR5IHNwYWNlIGltYWdlCisgICAgICAgIGZvciggaSA9IDE7IGkgPD0gbWF4RGlzcGFyaXR5ICsgMTsgaSsrICkKKyAgICAgICAgeyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgZHNpICs9IGltZ1c7CisgICAgICAgICAgICByRGF0YS0tOworICAgICAgICAgICAgZm9yKCBqID0gaSAtIDE7IGogPCBpbWdXIC0gMTsgaisrICkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaW50IHQ7IAorICAgICAgICAgICAgICAgIGlmKCAodCA9IHNyY2RhdGExW2pdIC0gckRhdGFbaisxXS5tYXhfdmFsKSA+PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzaVtqXSA9ICh1Y2hhcil0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCAodCA9IHJEYXRhW2orMV0ubWluX3ZhbCAtIHNyY2RhdGExW2pdKSA+PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzaVtqXSA9ICh1Y2hhcil0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc2lbal0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkc2kgLT0gKG1heERpc3Bhcml0eSsxKSppbWdXOworICAgICAgICByRGF0YSArPSBtYXhEaXNwYXJpdHkrMTsKKworICAgICAgICAvL2ludGVuc2l0eSBncmFkaWVudHMgaW1hZ2UgY29uc3RydWN0aW9uCisgICAgICAgIC8vbGVmdCByb3cKKyAgICAgICAgZWRnZXNbeSppbWdXXSA9IGVkZ2VzW3kqaW1nVysxXSA9IGVkZ2VzW3kqaW1nVysyXSA9IDI7CisgICAgICAgIGVkZ2VzW3kqaW1nVytpbWdXLTFdID0gZWRnZXNbeSppbWdXK2ltZ1ctMl0gPSBlZGdlc1t5KmltZ1craW1nVy0zXSA9IDE7CisgICAgICAgIGZvciggaiA9IDM7IGogPCBpbWdXLTQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGVkZ2VzW3kqaW1nVytqXSA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCAoIENWX0lNQVgzKCBzcmNkYXRhMVtqLTNdLCBzcmNkYXRhMVtqLTJdLCBzcmNkYXRhMVtqLTFdICkgLSAKKyAgICAgICAgICAgICAgICAgIENWX0lNSU4zKCBzcmNkYXRhMVtqLTNdLCBzcmNkYXRhMVtqLTJdLCBzcmNkYXRhMVtqLTFdICkgKSA+PSBJQ1ZfQklSQ0hfRElGRl9MVU0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVkZ2VzW3kqaW1nVytqXSB8PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICggQ1ZfSU1BWDMoIHNyY2RhdGEyW2orM10sIHNyY2RhdGEyW2orMl0sIHNyY2RhdGEyW2orMV0gKSAtIAorICAgICAgICAgICAgICAgICAgQ1ZfSU1JTjMoIHNyY2RhdGEyW2orM10sIHNyY2RhdGEyW2orMl0sIHNyY2RhdGEyW2orMV0gKSApID49IElDVl9CSVJDSF9ESUZGX0xVTSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZWRnZXNbeSppbWdXK2pdIHw9IDI7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgIAorCisgICAgICAgIC8vZmluZCBjb3JyZXNwb25kZW5jZSB1c2luZyBkeW5hbWljYWwgcHJvZ3JhbW1pbmcKKyAgICAgICAgLy9pbml0IERQIHRhYmxlCisgICAgICAgIGZvciggeCA9IDA7IHggPCBpbWdXOyB4KysgKSAKKyAgICAgICAgeworICAgICAgICAgICAgQ0VMTCgwLHgpLnN1bSA9IENFTEwoZGlzcEgtMSx4KS5zdW0gPSBJQ1ZfTUFYX0RQX1NVTV9WQUw7CisgICAgICAgICAgICBDRUxMKDAseCkuc3RlcCA9IENFTEwoZGlzcEgtMSx4KS5zdGVwID0gSUNWX0RQX1NURVBfTEVGVDsKKyAgICAgICAgfQorICAgICAgICBmb3IoIGQgPSAyOyBkIDwgZGlzcEg7IGQrKyApIAorICAgICAgICB7CisgICAgICAgICAgICBDRUxMKGQsZC0yKS5zdW0gPSBJQ1ZfTUFYX0RQX1NVTV9WQUw7CisgICAgICAgICAgICBDRUxMKGQsZC0yKS5zdGVwID0gSUNWX0RQX1NURVBfVVA7CisgICAgICAgIH0gICAgCisgICAgICAgIENFTEwoMSwwKS5zdW0gID0gMDsKKyAgICAgICAgQ0VMTCgxLDApLnN0ZXAgPSBJQ1ZfRFBfU1RFUF9MRUZUOworCisgICAgICAgIGZvciggeCA9IDE7IHggPCBpbWdXOyB4KysgKQorICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgIGludCBkID0gTUlOKCB4ICsgMSwgbWF4RGlzcGFyaXR5ICsgMSk7CisgICAgICAgICAgICB1Y2hhciogX2VkZ2VzID0gZWRnZXMgKyB5KmltZ1cgKyB4OworICAgICAgICAgICAgaW50IGUwID0gX2VkZ2VzWzBdICYgMTsKKyAgICAgICAgICAgIF9DdkRQQ2VsbCogX2NlbGwgPSBjZWxscyArIHgqZGlzcEg7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHMgPSBkc2lbZCppbWdXK3hdOworICAgICAgICAgICAgICAgIGludCBzdW1bM107CisKKyAgICAgICAgICAgICAgICAvL2NoZWNrIGxlZnQgc3RlcAorICAgICAgICAgICAgICAgIHN1bVswXSA9IF9jZWxsW2QtZGlzcEhdLnN1bSAtIHBhcmFtMjsgICAgICAgICAgICAgICAgCisKKyAgICAgICAgICAgICAgICAvL2NoZWNrIHVwIHN0ZXAKKyAgICAgICAgICAgICAgICBpZiggX2NlbGxbZCsxXS5zdGVwICE9IElDVl9EUF9TVEVQX0RJQUcgJiYgZTAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3VtWzFdID0gX2NlbGxbZCsxXS5zdW0gKyBwYXJhbTE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9jZWxsW2QtMS1kaXNwSF0uc3RlcCAhPSBJQ1ZfRFBfU1RFUF9VUCAmJiAoX2VkZ2VzWzEtZF0gJiAyKSApIAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc3VtWzJdID0gX2NlbGxbZC0xLWRpc3BIXS5zdW0gKyBwYXJhbTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBzdW1bMV0gPCBzdW1bMF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vY2hvb3NlIGxvY2FsLW9wdGltYWwgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN1bVt0XSA8PSBzdW1bMl0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN0ZXAgPSAodWNoYXIpdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbFtkXS5zdW0gPSBzdW1bdF0gKyBzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbFtkXS5zdGVwID0gSUNWX0RQX1NURVBfRElBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbFtkXS5zdW0gPSBzdW1bMl0gKyBzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN1bVswXSA8PSBzdW1bMV0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN0ZXAgPSBJQ1ZfRFBfU1RFUF9MRUZUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN1bSA9IHN1bVswXSArIHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NlbGxbZF0uc3RlcCA9IElDVl9EUF9TVEVQX1VQOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN1bSA9IHN1bVsxXSArIHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggX2NlbGxbZC0xLWRpc3BIXS5zdGVwICE9IElDVl9EUF9TVEVQX1VQICYmIChfZWRnZXNbMS1kXSAmIDIpICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdW1bMl0gPSBfY2VsbFtkLTEtZGlzcEhdLnN1bSArIHBhcmFtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN1bVswXSA8PSBzdW1bMl0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbFtkXS5zdGVwID0gSUNWX0RQX1NURVBfTEVGVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN1bSA9IHN1bVswXSArIHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfY2VsbFtkXS5zdGVwID0gSUNWX0RQX1NURVBfRElBRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN1bSA9IHN1bVsyXSArIHM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX2NlbGxbZF0uc3RlcCA9IElDVl9EUF9TVEVQX0xFRlQ7CisgICAgICAgICAgICAgICAgICAgIF9jZWxsW2RdLnN1bSA9IHN1bVswXSArIHM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIC0tZCApOworICAgICAgICB9Ly8gZm9yIHgKKworICAgICAgICAvL2V4dHJhY3Qgb3B0aW1hbCB3YXkgYW5kIGZpbGwgZGlzcGFyaXR5IGltYWdlCisgICAgICAgIGRpc3BkYXRhID0gZGVzdCArIHdpZHRoU3RlcCAqIHk7CisKKyAgICAgICAgLy9maW5kIG1pbl92YWwKKyAgICAgICAgbWluX3ZhbCA9IElDVl9NQVhfRFBfU1VNX1ZBTDsKKyAgICAgICAgZm9yKCBpID0gMTsgaSA8PSBtYXhEaXNwYXJpdHkgKyAxOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWluX3ZhbCA+IENFTEwoaSxpbWdXLTEpLnN1bSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZCA9IGk7CisgICAgICAgICAgICAgICAgbWluX3ZhbCA9IENFTEwoaSxpbWdXLTEpLnN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy90cmFjayBvcHRpbWFsIHBhc3MKKyAgICAgICAgZm9yKCB4ID0gaW1nVyAtIDE7IHggPiAwOyB4LS0gKQorICAgICAgICB7ICAgICAgICAKKyAgICAgICAgICAgIGRpc3BkYXRhW3hdID0gKHVjaGFyKShkIC0gMSk7CisgICAgICAgICAgICB3aGlsZSggQ0VMTChkLHgpLnN0ZXAgPT0gSUNWX0RQX1NURVBfVVAgKSBkKys7CisgICAgICAgICAgICBpZiAoIENFTEwoZCx4KS5zdGVwID09IElDVl9EUF9TVEVQX0RJQUcgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHMgPSB4OworICAgICAgICAgICAgICAgIHdoaWxlKCBDRUxMKGQseCkuc3RlcCA9PSBJQ1ZfRFBfU1RFUF9ESUFHICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkLS07IAorICAgICAgICAgICAgICAgICAgICB4LS07ICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKCBpID0geDsgaSA8IHM7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaXNwZGF0YVtpXSA9ICh1Y2hhcikoZC0xKTsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgICAgICB9ICAgICAgICAKKyAgICAgICAgfS8vZm9yIHgKKyAgICB9Ly8gZm9yIHkKKworICAgIC8vUG9zdHByb2Nlc3NpbmcgdGhlIERpc3Bhcml0eSBNYXAKKworICAgIC8vcmVtb3ZlIG9idmlvdXMgZXJyb3JzIGluIHRoZSBkaXNwYXJpdHkgbWFwCisgICAgZm9yKCB4ID0gMDsgeCA8IGltZ1c7IHgrKyApCisgICAgeworICAgICAgICBmb3IoIHkgPSAxOyB5IDwgaW1nSCAtIDE7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkZXN0Wyh5LTEpKndpZHRoU3RlcCt4XSA9PSBkZXN0Wyh5KzEpKndpZHRoU3RlcCt4XSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGVzdFt5KndpZHRoU3RlcCt4XSA9IGRlc3RbKHktMSkqd2lkdGhTdGVwK3hdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy9jb21wdXRlIGludGVuc2l0eSBZLWdyYWRpZW50cworICAgIGZvciggeCA9IDA7IHggPCBpbWdXOyB4KysgKQorICAgIHsKKyAgICAgICAgZm9yKCB5ID0gMTsgeSA8IGltZ0ggLSAxOyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKCBDVl9JTUFYMyggc3JjMVsoeS0xKSp3aWR0aFN0ZXAreF0sIHNyYzFbeSp3aWR0aFN0ZXAreF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgc3JjMVsoeSsxKSp3aWR0aFN0ZXAreF0gKSAtIAorICAgICAgICAgICAgICAgICAgQ1ZfSU1JTjMoIHNyYzFbKHktMSkqd2lkdGhTdGVwK3hdLCBzcmMxW3kqd2lkdGhTdGVwK3hdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFbKHkrMSkqd2lkdGhTdGVwK3hdICkgKSA+PSBJQ1ZfQklSQ0hfRElGRl9MVU0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVkZ2VzW3kqaW1nVyt4XSB8PSA0OworICAgICAgICAgICAgICAgIGVkZ2VzWyh5KzEpKmltZ1creF0gfD0gNDsKKyAgICAgICAgICAgICAgICBlZGdlc1soeS0xKSppbWdXK3hdIHw9IDQ7CisgICAgICAgICAgICAgICAgeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy9yZW1vdmUgYWxvbmcgYW55IHBhcnRpY3VsYXIgcm93LCBldmVyeSBncmFkaWVudCAKKyAgICAvL2ZvciB3aGljaCB0d28gYWRqYWNlbnQgY29sdW1ucyBkbyBub3QgYWdyZWUuCisgICAgZm9yKCB5ID0gMDsgeSA8IGltZ0g7IHkrKyApCisgICAgeworICAgICAgICBwcmV2ID0gZWRnZXNbeSppbWdXXTsKKyAgICAgICAgZm9yKCB4ID0gMTsgeCA8IGltZ1cgLSAxOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdXJyID0gZWRnZXNbeSppbWdXK3hdOyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIChjdXJyICYgNCkgJiYKKyAgICAgICAgICAgICAgICAoICEoIHByZXYgJiA0ICkgfHwKKyAgICAgICAgICAgICAgICAgICEoIGVkZ2VzW3kqaW1nVyt4KzFdICYgNCApICkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVkZ2VzW3kqaW1nVyt4XSAtPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9IGN1cnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBkZWZpbmUgcmVsaWFiaWxpdHkKKyAgICBmb3IoIHggPSAwOyB4IDwgaW1nVzsgeCsrICkKKyAgICB7CisgICAgICAgIGZvciggeSA9IDE7IHkgPCBpbWdIOyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpID0geSAtIDE7CisgICAgICAgICAgICBmb3IoIDsgeSA8IGltZ0ggJiYgZGVzdFt5KndpZHRoU3RlcCt4XSA9PSBkZXN0Wyh5LTEpKndpZHRoU3RlcCt4XTsgeSsrICkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBzID0geSAtIGk7CisgICAgICAgICAgICBmb3IoIDsgaSA8IHk7IGkrKyApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJlbGlhYmlsaXRpZXNbaSppbWdXK3hdID0gczsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gICAKKyAgICAKKyAgICAvL1kgLSBwcm9wYWdhdGUgcmVsaWFibGUgcmVnaW9ucyAKKyAgICBmb3IoIHggPSAwOyB4IDwgaW1nVzsgeCsrICkKKyAgICB7ICAgICAgICAKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IGltZ0g7IHkrKyApCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGQgPSBkZXN0W3kqd2lkdGhTdGVwK3hdOworICAgICAgICAgICAgaWYoIHJlbGlhYmlsaXRpZXNbeSppbWdXK3hdID49IHBhcmFtNCAmJiAhKGVkZ2VzW3kqaW1nVyt4XSAmIDQpICYmCisgICAgICAgICAgICAgICAgZCA+IDAgKS8vaGlnaGx5IHx8IG1vZGVyYXRlbHkKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICBkaXNwYXJpdGllc1t5KndpZHRoU3RlcCt4XSA9ICh1Y2hhcilkOworICAgICAgICAgICAgICAgIC8vdXAgcHJvcGFnYXRpb24KKyAgICAgICAgICAgICAgICBmb3IoIGkgPSB5IC0gMTsgaSA+PSAwOyBpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICAoIGVkZ2VzW2kqaW1nVyt4XSAmIDQgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICggZGVzdFtpKndpZHRoU3RlcCt4XSA8IGQgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpYWJpbGl0aWVzW2kqaW1nVyt4XSA+PSBwYXJhbTMgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICggcmVsaWFiaWxpdGllc1t5KmltZ1creF0gPCBwYXJhbTUgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W2kqd2lkdGhTdGVwK3hdIC0gMSA9PSBkICkgKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkaXNwYXJpdGllc1tpKndpZHRoU3RlcCt4XSA9ICh1Y2hhcilkOyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvL2Rvd24gcHJvcGFnYXRpb24KKyAgICAgICAgICAgICAgICBmb3IoIGkgPSB5ICsgMTsgaSA8IGltZ0g7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggICggZWRnZXNbaSppbWdXK3hdICYgNCApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKCBkZXN0W2kqd2lkdGhTdGVwK3hdIDwgZCAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGlhYmlsaXRpZXNbaSppbWdXK3hdID49IHBhcmFtMyApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKCByZWxpYWJpbGl0aWVzW3kqaW1nVyt4XSA8IHBhcmFtNSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RbaSp3aWR0aFN0ZXAreF0gLSAxID09IGQgKSApIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGRpc3Bhcml0aWVzW2kqd2lkdGhTdGVwK3hdID0gKHVjaGFyKWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHkgPSBpIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaXNwYXJpdGllc1t5KndpZHRoU3RlcCt4XSA9ICh1Y2hhcilkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGVmaW5lIHJlbGlhYmlsaXR5IGFsb25nIFgKKyAgICBmb3IoIHkgPSAwOyB5IDwgaW1nSDsgeSsrICkKKyAgICB7CisgICAgICAgIGZvciggeCA9IDE7IHggPCBpbWdXOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpID0geCAtIDE7CisgICAgICAgICAgICBmb3IoIDsgeCA8IGltZ1cgJiYgZGVzdFt5KndpZHRoU3RlcCt4XSA9PSBkZXN0W3kqd2lkdGhTdGVwK3gtMV07IHgrKyApOworICAgICAgICAgICAgcyA9IHggLSBpOworICAgICAgICAgICAgZm9yKCA7IGkgPCB4OyBpKysgKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZWxpYWJpbGl0aWVzW3kqaW1nVytpXSA9IHM7CisgICAgICAgICAgICB9ICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9ICAgCisgICAgCisgICAgLy9YIC0gcHJvcGFnYXRlIHJlbGlhYmxlIHJlZ2lvbnMgCisgICAgZm9yKCB5ID0gMDsgeSA8IGltZ0g7IHkrKyApICAgIAorICAgIHsgICAgICAgIAorICAgICAgICBmb3IoIHggPSAwOyB4IDwgaW1nVzsgeCsrICkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgZCA9IGRlc3RbeSp3aWR0aFN0ZXAreF07CisgICAgICAgICAgICBpZiggcmVsaWFiaWxpdGllc1t5KmltZ1creF0gPj0gcGFyYW00ICYmICEoZWRnZXNbeSppbWdXK3hdICYgMSkgJiYKKyAgICAgICAgICAgICAgICBkID4gMCApLy9oaWdobHkgfHwgbW9kZXJhdGVseQorICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgIGRpc3Bhcml0aWVzW3kqd2lkdGhTdGVwK3hdID0gKHVjaGFyKWQ7CisgICAgICAgICAgICAgICAgLy91cCBwcm9wYWdhdGlvbgorICAgICAgICAgICAgICAgIGZvciggaSA9IHggLSAxOyBpID49IDA7IGktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggIChlZGdlc1t5KmltZ1craV0gJiAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICggZGVzdFt5KndpZHRoU3RlcCtpXSA8IGQgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxpYWJpbGl0aWVzW3kqaW1nVytpXSA+PSBwYXJhbTMgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICggcmVsaWFiaWxpdGllc1t5KmltZ1creF0gPCBwYXJhbTUgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0W3kqd2lkdGhTdGVwK2ldIC0gMSA9PSBkICkgKSBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkaXNwYXJpdGllc1t5KndpZHRoU3RlcCtpXSA9ICh1Y2hhcilkOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy9kb3duIHByb3BhZ2F0aW9uCisgICAgICAgICAgICAgICAgZm9yKCBpID0geCArIDE7IGkgPCBpbWdXOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoICAoZWRnZXNbeSppbWdXK2ldICYgMSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIGRlc3RbeSp3aWR0aFN0ZXAraV0gPCBkICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsaWFiaWxpdGllc1t5KmltZ1craV0gPj0gcGFyYW0zICkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoIHJlbGlhYmlsaXRpZXNbeSppbWdXK3hdIDwgcGFyYW01ICYmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdFt5KndpZHRoU3RlcCtpXSAtIDEgPT0gZCApICkgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZGlzcGFyaXRpZXNbeSp3aWR0aFN0ZXAraV0gPSAodWNoYXIpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeCA9IGkgLSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRpc3Bhcml0aWVzW3kqd2lkdGhTdGVwK3hdID0gKHVjaGFyKWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvL3JlbGVhc2UgcmVzb3VyY2VzCisgICAgY3ZGcmVlKCAmZHNpICk7ICAgIAorICAgIGN2RnJlZSggJmVkZ2VzICk7ICAgIAorICAgIGN2RnJlZSggJmNlbGxzICk7ICAgICAgICAKKyAgICBjdkZyZWUoICZyRGF0YSApOyAgICAgICAgCit9CisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gICAgTmFtZTogICAgY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2UKKy8vICAgIFB1cnBvc2U6IGZpbmQgc3RlcmVvIGNvcnJlc3BvbmRlbmNlIG9uIHN0ZXJlby1wYWlyCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgbGVmdEltYWdlIC0gbGVmdCBpbWFnZSBvZiBzdGVyZW8tcGFpciAoZm9ybWF0IDh1QzEpLgorLy8gICAgICByaWdodEltYWdlIC0gcmlnaHQgaW1hZ2Ugb2Ygc3RlcmVvLXBhaXIgKGZvcm1hdCA4dUMxKS4KKy8vICAgICAgbW9kZSAtbW9kZSBvZiBjb3JyZXNwb25kYW5jZSByZXRyaWV2YWwgKG5vdyBDVl9SRVRSX0RQX0JJUkNIRklFTEQgb25seSkKKy8vICAgICAgZGlzcEltYWdlIC0gZGVzdGluYXRpb24gZGlzcGFyaXR5IGltYWdlCisvLyAgICAgIG1heERpc3Bhcml0eSAtIG1heGltYWwgZGlzcGFyaXR5IAorLy8gICAgICBwYXJhbTEsIHBhcmFtMiwgcGFyYW0zLCBwYXJhbTQsIHBhcmFtNSAtIHBhcmFtZXRlcnMgb2YgYWxnb3JpdGhtCisvLyAgICBSZXR1cm5zOgorLy8gICAgTm90ZXM6CisvLyAgICAgIEltYWdlcyBtdXN0IGJlIHJlY3RpZmllZC4KKy8vICAgICAgQWxsIGltYWdlcyBtdXN0IGhhdmUgZm9ybWF0IDh1QzEuCisvL0YqLworQ1ZfSU1QTCB2b2lkCitjdkZpbmRTdGVyZW9Db3JyZXNwb25kZW5jZSggCisgICAgICAgICAgICAgICAgICAgY29uc3QgIEN2QXJyKiBsZWZ0SW1hZ2UsIGNvbnN0ICBDdkFyciogcmlnaHRJbWFnZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgIG1vZGUsCisgICAgICAgICAgICAgICAgICAgQ3ZBcnIqICBkZXB0aEltYWdlLAorICAgICAgICAgICAgICAgICAgIGludCAgICAgbWF4RGlzcGFyaXR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgZG91YmxlICBwYXJhbTEsIGRvdWJsZSAgcGFyYW0yLCBkb3VibGUgIHBhcmFtMywgCisgICAgICAgICAgICAgICAgICAgZG91YmxlICBwYXJhbTQsIGRvdWJsZSAgcGFyYW01ICApCit7ICAgICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCAgKnNyYzEsICpzcmMyOyAgICAKKyAgICBDdk1hdCAgKmRzdDsKKyAgICBDdk1hdCAgc3JjMV9zdHViLCBzcmMyX3N0dWIsIGRzdF9zdHViOworICAgIGludCAgICBjb2k7ICAgIAorCisgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBsZWZ0SW1hZ2UsICZzcmMxX3N0dWIsICZjb2kgKSk7CisgICAgaWYoIGNvaSApIENWX0VSUk9SKCBDVl9CYWRDT0ksICJDT0kgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZnVuY3Rpb24iICk7CisgICAgQ1ZfQ0FMTCggc3JjMiA9IGN2R2V0TWF0KCByaWdodEltYWdlLCAmc3JjMl9zdHViLCAmY29pICkpOworICAgIGlmKCBjb2kgKSBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGZ1bmN0aW9uIiApOyAgICAKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZGVwdGhJbWFnZSwgJmRzdF9zdHViLCAmY29pICkpOworICAgIGlmKCBjb2kgKSBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGZ1bmN0aW9uIiApOworCisgICAgLy8gY2hlY2sgYXJncyAKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIHNyYzEtPnR5cGUgKSAhPSBDVl84VUMxIHx8IAorICAgICAgICBDVl9NQVRfVFlQRSggc3JjMi0+dHlwZSApICE9IENWXzhVQzEgfHwgICAgICAgIAorICAgICAgICBDVl9NQVRfVFlQRSggZHN0LT50eXBlICkgIT0gQ1ZfOFVDMSkgQ1ZfRVJST1IoQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAiQWxsIGltYWdlcyBtdXN0IGJlIHNpbmdsZS1jaGFubmVsIGFuZCBoYXZlIDh1IiApOyAgICAKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMyICkgfHwgIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgZHN0ICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgIAorICAgIGlmKCBtYXhEaXNwYXJpdHkgPD0gMCB8fCBtYXhEaXNwYXJpdHkgPj0gc3JjMS0+d2lkdGggfHwgbWF4RGlzcGFyaXR5ID4gMjU1ICkKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzT3V0T2ZSYW5nZSwgCisgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIgL21heERpc3Bhcml0eS8gaXMgb3V0IG9mIHJhbmdlIik7CisgICAgCisgICAgaWYoIG1vZGUgPT0gQ1ZfRElTUEFSSVRZX0JJUkNIRklFTEQgKQorICAgIHsKKyAgICAgICAgaWYoIHBhcmFtMSA9PSBDVl9VTkRFRl9TQ19QQVJBTSApIHBhcmFtMSA9IENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMTsKKyAgICAgICAgaWYoIHBhcmFtMiA9PSBDVl9VTkRFRl9TQ19QQVJBTSApIHBhcmFtMiA9IENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMjsKKyAgICAgICAgaWYoIHBhcmFtMyA9PSBDVl9VTkRFRl9TQ19QQVJBTSApIHBhcmFtMyA9IENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNMzsKKyAgICAgICAgaWYoIHBhcmFtNCA9PSBDVl9VTkRFRl9TQ19QQVJBTSApIHBhcmFtNCA9IENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNNDsKKyAgICAgICAgaWYoIHBhcmFtNSA9PSBDVl9VTkRFRl9TQ19QQVJBTSApIHBhcmFtNSA9IENWX0lEUF9CSVJDSEZJRUxEX1BBUkFNNTsKKworICAgICAgICBDVl9DQUxMKCBpY3ZGaW5kU3RlcmVvQ29ycmVzcG9uZGVuY2VCeUJpcmNoZmllbGREUCggc3JjMS0+ZGF0YS5wdHIsIAorICAgICAgICAgICAgc3JjMi0+ZGF0YS5wdHIsIGRzdC0+ZGF0YS5wdHIsIAorICAgICAgICAgICAgY3ZHZXRNYXRTaXplKCBzcmMxICksIHNyYzEtPnN0ZXAsCisgICAgICAgICAgICBtYXhEaXNwYXJpdHksIChmbG9hdClwYXJhbTEsIChmbG9hdClwYXJhbTIsIChmbG9hdClwYXJhbTMsIAorICAgICAgICAgICAgKGZsb2F0KXBhcmFtNCwgKGZsb2F0KXBhcmFtNSApICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbnN1cHBvcnRlZCBtb2RlIG9mIGZ1bmN0aW9uIiApOworICAgIH0KKworICAgIF9fRU5EX187IAorfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2ZWlnZW5vYmplY3RzLmNwcCBiL2N2YXV4L3NyYy9jdmVpZ2Vub2JqZWN0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxYWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmVpZ2Vub2JqZWN0cy5jcHAKQEAgLTAsMCArMSwxODExIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCitDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZKYWNvYmlFaWdlbnNfMzJmKGZsb2F0ICpBLCBmbG9hdCAqViwgZmxvYXQgKkUsIGludCBuLCBmbG9hdCBlcHMpCit7CisgICAgaW50IGksIGosIGssIGluZDsKKyAgICBmbG9hdCAqQUEgPSBBLCAqVlYgPSBWOworICAgIGRvdWJsZSBBbWF4LCBhbm9ybSA9IDAsIGF4OworCisgICAgaWYoIEEgPT0gTlVMTCB8fCBWID09IE5VTEwgfHwgRSA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBuIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgaWYoIGVwcyA8IDEuMGUtN2YgKQorICAgICAgICBlcHMgPSAxLjBlLTdmOworCisgICAgLyotLS0tLS0tLSBQcmVwYXJlIC0tLS0tLS0tKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCBWViArPSBuLCBBQSArPSBuICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBpOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgQW0gPSBBQVtqXTsKKworICAgICAgICAgICAgYW5vcm0gKz0gQW0gKiBBbTsKKyAgICAgICAgfQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjsgaisrICkKKyAgICAgICAgICAgIFZWW2pdID0gMC5mOworICAgICAgICBWVltpXSA9IDEuZjsKKyAgICB9CisKKyAgICBhbm9ybSA9IHNxcnQoIGFub3JtICsgYW5vcm0gKTsKKyAgICBheCA9IGFub3JtICogZXBzIC8gbjsKKyAgICBBbWF4ID0gYW5vcm07CisKKyAgICB3aGlsZSggQW1heCA+IGF4ICkKKyAgICB7CisgICAgICAgIEFtYXggLz0gbjsKKyAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgKGluZCkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHAsIHE7CisgICAgICAgICAgICBmbG9hdCAqVjEgPSBWLCAqQTEgPSBBOworCisgICAgICAgICAgICBpbmQgPSAwOworICAgICAgICAgICAgZm9yKCBwID0gMDsgcCA8IG4gLSAxOyBwKyssIEExICs9IG4sIFYxICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0ICpBMiA9IEEgKyBuICogKHAgKyAxKSwgKlYyID0gViArIG4gKiAocCArIDEpOworCisgICAgICAgICAgICAgICAgZm9yKCBxID0gcCArIDE7IHEgPCBuOyBxKyssIEEyICs9IG4sIFYyICs9IG4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgsIHksIGMsIHMsIGMyLCBzMiwgYTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKkEzLCBBcHEgPSBBMVtxXSwgQXBwLCBBcXEsIEFpcCwgQWlxLCBWcGksIFZxaTsKKworICAgICAgICAgICAgICAgICAgICBpZiggZmFicyggQXBxICkgPCBBbWF4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgIGluZCA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgLyotLS0tIENhbGN1bGF0aW9uIG9mIHJvdGF0aW9uIGFuZ2xlJ3Mgc2luZSAmIGNvc2luZSAtLS0tKi8KKyAgICAgICAgICAgICAgICAgICAgQXBwID0gQTFbcF07CisgICAgICAgICAgICAgICAgICAgIEFxcSA9IEEyW3FdOworICAgICAgICAgICAgICAgICAgICB5ID0gNS4wZS0xICogKEFwcCAtIEFxcSk7CisgICAgICAgICAgICAgICAgICAgIHggPSAtQXBxIC8gc3FydCggKGRvdWJsZSlBcHEgKiBBcHEgKyAoZG91YmxlKXkgKiB5ICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCB5IDwgMC4wICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSAteDsKKyAgICAgICAgICAgICAgICAgICAgcyA9IHggLyBzcXJ0KCAyLjAgKiAoMS4wICsgc3FydCggMS4wIC0gKGRvdWJsZSl4ICogeCApKSk7CisgICAgICAgICAgICAgICAgICAgIHMyID0gcyAqIHM7CisgICAgICAgICAgICAgICAgICAgIGMgPSBzcXJ0KCAxLjAgLSBzMiApOworICAgICAgICAgICAgICAgICAgICBjMiA9IGMgKiBjOworICAgICAgICAgICAgICAgICAgICBhID0gMi4wICogQXBxICogYyAqIHM7CisKKyAgICAgICAgICAgICAgICAgICAgLyotLS0tIEFwcSBhbm51bGF0aW9uIC0tLS0qLworICAgICAgICAgICAgICAgICAgICBBMyA9IEE7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBwOyBpKyssIEEzICs9IG4gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBaXAgPSBBM1twXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcSA9IEEzW3FdOworICAgICAgICAgICAgICAgICAgICAgICAgVnBpID0gVjFbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcWkgPSBWMltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEzW3BdID0gKGZsb2F0KSAoQWlwICogYyAtIEFpcSAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgQTNbcV0gPSAoZmxvYXQpIChBaXEgKiBjICsgQWlwICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBWMVtpXSA9IChmbG9hdCkgKFZwaSAqIGMgLSBWcWkgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYyW2ldID0gKGZsb2F0KSAoVnFpICogYyArIFZwaSAqIHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciggOyBpIDwgcTsgaSsrLCBBMyArPSBuICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWlwID0gQTFbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBBaXEgPSBBM1txXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZwaSA9IFYxW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgVnFpID0gVjJbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBBMVtpXSA9IChmbG9hdCkgKEFpcCAqIGMgLSBBaXEgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEzW3FdID0gKGZsb2F0KSAoQWlxICogYyArIEFpcCAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgVjFbaV0gPSAoZmxvYXQpIChWcGkgKiBjIC0gVnFpICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBWMltpXSA9IChmbG9hdCkgKFZxaSAqIGMgKyBWcGkgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcCA9IEExW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQWlxID0gQTJbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcGkgPSBWMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZxaSA9IFYyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQTFbaV0gPSAoZmxvYXQpIChBaXAgKiBjIC0gQWlxICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBMltpXSA9IChmbG9hdCkgKEFpcSAqIGMgKyBBaXAgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYxW2ldID0gKGZsb2F0KSAoVnBpICogYyAtIFZxaSAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgVjJbaV0gPSAoZmxvYXQpIChWcWkgKiBjICsgVnBpICogcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQTFbcF0gPSAoZmxvYXQpIChBcHAgKiBjMiArIEFxcSAqIHMyIC0gYSk7CisgICAgICAgICAgICAgICAgICAgIEEyW3FdID0gKGZsb2F0KSAoQXBwICogczIgKyBBcXEgKiBjMiArIGEpOworICAgICAgICAgICAgICAgICAgICBBMVtxXSA9IEEyW3BdID0gMC4wZjsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLypxICovCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qcCAqLworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBpbmQgKTsKKyAgICAgICAgQW1heCAvPSBuOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAoIEFtYXggPiBheCApICovCisKKyAgICBmb3IoIGkgPSAwLCBrID0gMDsgaSA8IG47IGkrKywgayArPSBuICsgMSApCisgICAgICAgIEVbaV0gPSBBW2tdOworICAgIC8qcHJpbnRmKCIgTSA9ICVkXG4iLCBNKTsgKi8KKworICAgIC8qIC0tLS0tLS0tIG9yZGVyaW5nIC0tLS0tLS0tICovCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgbSA9IGk7CisgICAgICAgIGZsb2F0IEVtID0gKGZsb2F0KSBmYWJzKCBFW2ldICk7CisKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPCBuOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBFaiA9IChmbG9hdCkgZmFicyggRVtqXSApOworCisgICAgICAgICAgICBtID0gKEVtIDwgRWopID8gaiA6IG07CisgICAgICAgICAgICBFbSA9IChFbSA8IEVqKSA/IEVqIDogRW07CisgICAgICAgIH0KKyAgICAgICAgaWYoIG0gIT0gaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsOworICAgICAgICAgICAgZmxvYXQgYiA9IEVbaV07CisKKyAgICAgICAgICAgIEVbaV0gPSBFW21dOworICAgICAgICAgICAgRVttXSA9IGI7CisgICAgICAgICAgICBmb3IoIGogPSAwLCBrID0gaSAqIG4sIGwgPSBtICogbjsgaiA8IG47IGorKywgaysrLCBsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSBWW2tdOworICAgICAgICAgICAgICAgIFZba10gPSBWW2xdOworICAgICAgICAgICAgICAgIFZbbF0gPSBiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDYWxjQ292YXJNYXRyaXhFeF84dTMyZlIKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGEgY292YXJpYW5jZSBtYXRyaXggZm9yIGEgZ3JvdXAgb2YgaW5wdXQgb2JqZWN0cworLy8gICAgICAgICAgICAgKGltYWdlcywgdmVjdG9ycywgZXRjLikuIFJPSSBzdXBwb3J0ZWQuCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG5PYmplY3RzICAgIC0gbnVtYmVyIG9mIHNvdXJjZSBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgb2JqZWN0cyAgICAgLSBhcnJheSBvZiBwb2ludGVycyB0byBST0lzIG9mIHRoZSBzb3VyY2Ugb2JqZWN0cworLy8gICAgICAgICAgICAgICAgIGltZ1N0ZXAgICAgIC0gZnVsbCB3aWR0aCBvZiBlYWNoIHNvdXJjZSBvYmplY3Qgcm93IGluIGJ5dGVzCisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAgICAgLSBwb2ludGVyIHRvIGF2ZXJhZ2VkIG9iamVjdAorLy8gICAgICAgICAgICAgICAgIGF2Z1N0ZXAgICAgIC0gZnVsbCB3aWR0aCBvZiBhdmVyYWdlZCBvYmplY3Qgcm93IGluIGJ5dGVzCisvLyAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgLSBST0kgc2l6ZSBvZiBlYWNoIHNvdXJjZSBhbmQgYXZlcmFnZWQgb2JqZWN0cworLy8gICAgICAgICAgICAgICAgIGNvdmFyTWF0cml4IC0gY292YXJpYW5jZSBtYXRyaXggKG91dHB1dCBwYXJhbWV0ZXI7IG11c3QgYmUgYWxsb2NhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbCkKKy8vCisvLyAgICBSZXR1cm5zOiBDVl9OT19FUlIgb3IgZXJyb3IgY29kZQorLy8KKy8vICAgIE5vdGVzOiAgIAorLy9GKi8KK3N0YXRpYyBDdlN0YXR1cyAgQ1ZfU1REQ0FMTAoraWN2Q2FsY0NvdmFyTWF0cml4RXhfOHUzMmZSKCBpbnQgbk9iamVjdHMsIHZvaWQgKmlucHV0LCBpbnQgb2JqU3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0ZsYWdzLCBpbnQgaW9CdWZTaXplLCB1Y2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgZmxvYXQgKmF2ZywgaW50IGF2Z1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBmbG9hdCAqY292YXJNYXRyaXggKQoreworICAgIGludCBvYmpTdGVwID0gb2JqU3RlcDE7CisKKyAgICAvKiAtLS0tIFRFU1QgT0YgUEFSQU1FVEVSUyAtLS0tICovCisKKyAgICBpZiggbk9iamVjdHMgPCAyICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisgICAgaWYoIGlvRmxhZ3MgPCAwIHx8IGlvRmxhZ3MgPiAzICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisgICAgaWYoIGlvRmxhZ3MgJiYgaW9CdWZTaXplIDwgMTAyNCApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGlmKCBpb0ZsYWdzICYmIGJ1ZmZlciA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBpbnB1dCA9PSBOVUxMIHx8IGF2ZyA9PSBOVUxMIHx8IGNvdmFyTWF0cml4ID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIHNpemUud2lkdGggPiBvYmpTdGVwIHx8IDQgKiBzaXplLndpZHRoID4gYXZnU3RlcCB8fCBzaXplLmhlaWdodCA8IDEgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBhdmdTdGVwIC89IDQ7CisKKyAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyApICAgIC8qID09PT0gVVNFIElOUFVUIENBTExCQUNLID09PT0gKi8KKyAgICB7CisgICAgICAgIGludCBuaW8sIG5nciwgaWdyLCBuID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0LCBtbSA9IDA7CisgICAgICAgIEN2Q2FsbGJhY2sgcmVhZF9jYWxsYmFjayA9ICgoQ3ZJbnB1dCAqKSAmIGlucHV0KS0+Y2FsbGJhY2s7CisgICAgICAgIHVjaGFyICpidWZmZXIyOworCisgICAgICAgIG9ialN0ZXAgPSBuOworICAgICAgICBuaW8gPSBpb0J1ZlNpemUgLyBuOyAgICAvKiBudW1iZXIgb2Ygb2JqZWN0cyBpbiBidWZmZXIgKi8KKyAgICAgICAgbmdyID0gbk9iamVjdHMgLyBuaW87ICAgLyogbnVtYmVyIG9mIGlvIGdyb3VwcyAqLworICAgICAgICBpZiggbk9iamVjdHMgJSBuaW8gKQorICAgICAgICAgICAgbW0gPSAxOworICAgICAgICBuZ3IgKz0gbW07CisKKyAgICAgICAgYnVmZmVyMiA9ICh1Y2hhciAqKWN2QWxsb2MoIHNpemVvZiggdWNoYXIgKSAqIG4gKTsKKyAgICAgICAgaWYoIGJ1ZmZlcjIgPT0gTlVMTCApCisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgICAgIGZvciggaWdyID0gMDsgaWdyIDwgbmdyOyBpZ3IrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrLCBsOworICAgICAgICAgICAgaW50IGlvLCBqbywgaW1pbiA9IGlnciAqIG5pbywgaW1heCA9IGltaW4gKyBuaW87CisgICAgICAgICAgICB1Y2hhciAqYnUxID0gYnVmZmVyLCAqYnUyOworCisgICAgICAgICAgICBpZiggaW1heCA+IG5PYmplY3RzICkKKyAgICAgICAgICAgICAgICBpbWF4ID0gbk9iamVjdHM7CisKKyAgICAgICAgICAgIC8qIHJlYWQgaWdyIGdyb3VwICovCisgICAgICAgICAgICBmb3IoIGlvID0gaW1pbjsgaW8gPCBpbWF4OyBpbysrLCBidTEgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZTdGF0dXMgcjsKKworICAgICAgICAgICAgICAgIHIgPSAoQ3ZTdGF0dXMpcmVhZF9jYWxsYmFjayggaW8sICh2b2lkICopIGJ1MSwgdXNlckRhdGEgKTsKKyAgICAgICAgICAgICAgICBpZiggciApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBkaWFnb25hbCBzcXVhcmUgY2FsYyAqLworICAgICAgICAgICAgYnUxID0gYnVmZmVyOworICAgICAgICAgICAgZm9yKCBpbyA9IGltaW47IGlvIDwgaW1heDsgaW8rKywgYnUxICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1MiA9IGJ1MTsKKyAgICAgICAgICAgICAgICBmb3IoIGpvID0gaW87IGpvIDwgaW1heDsgam8rKywgYnUyICs9IG4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdyA9IDAuZjsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmZ1ID0gYXZnOworICAgICAgICAgICAgICAgICAgICBpbnQgaWogPSAwOworCisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBzaXplLmhlaWdodDsgaysrLCBmdSArPSBhdmdTdGVwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBzaXplLndpZHRoOyBsKyssIGlqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGYgPSBmdVtsXSwgdTEgPSBidTFbaWpdLCB1MiA9IGJ1Mltpal07CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdmFyTWF0cml4W2lvICogbk9iamVjdHMgKyBqb10gPSBjb3Zhck1hdHJpeFtqbyAqIG5PYmplY3RzICsgaW9dID0gdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIG5vbi1kaWFnb25hbCBlbGVtZW50cyBjYWxjICovCisgICAgICAgICAgICBmb3IoIGpvID0gaW1heDsgam8gPCBuT2JqZWN0czsgam8rKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZTdGF0dXMgcjsKKworICAgICAgICAgICAgICAgIGJ1MSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBidTIgPSBidWZmZXIyOworCisgICAgICAgICAgICAgICAgLyogcmVhZCBqbyBvYmplY3QgKi8KKyAgICAgICAgICAgICAgICByID0gKEN2U3RhdHVzKXJlYWRfY2FsbGJhY2soIGpvLCAodm9pZCAqKSBidTIsIHVzZXJEYXRhICk7CisgICAgICAgICAgICAgICAgaWYoIHIgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKworICAgICAgICAgICAgICAgIGZvciggaW8gPSBpbWluOyBpbyA8IGltYXg7IGlvKyssIGJ1MSArPSBuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHcgPSAwLmY7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpmdSA9IGF2ZzsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlqID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgc2l6ZS5oZWlnaHQ7IGsrKywgZnUgKz0gYXZnU3RlcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBzaXplLndpZHRoIC0gMzsgbCArPSA0LCBpaiArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gZnVbbF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdTEgPSBidTFbaWpdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHUyID0gYnUyW2lqXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gKHUxIC0gZikgKiAodTIgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gZnVbbCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxID0gYnUxW2lqICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTIgPSBidTJbaWogKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGZ1W2wgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGJ1MVtpaiArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUyID0gYnUyW2lqICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSAodTEgLSBmKSAqICh1MiAtIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBmdVtsICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTEgPSBidTFbaWogKyAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1MiA9IGJ1MltpaiArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gKHUxIC0gZikgKiAodTIgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggOyBsIDwgc2l6ZS53aWR0aDsgbCsrLCBpaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gZnVbbF0sIHUxID0gYnUxW2lqXSwgdTIgPSBidTJbaWpdOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdyArPSAodTEgLSBmKSAqICh1MiAtIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvdmFyTWF0cml4W2lvICogbk9iamVjdHMgKyBqb10gPSBjb3Zhck1hdHJpeFtqbyAqIG5PYmplY3RzICsgaW9dID0gdzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlnciAqLworCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlcjIgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYoKSAqLworCisgICAgZWxzZQorICAgICAgICAvKiA9PT09IE5PVCBVU0UgSU5QVVQgQ0FMTEJBQ0sgPT09PSAqLworICAgIHsKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIHVjaGFyICoqb2JqZWN0cyA9ICh1Y2hhciAqKikgKCgoQ3ZJbnB1dCAqKSAmIGlucHV0KS0+ZGF0YSk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5PYmplY3RzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICB1Y2hhciAqYnUgPSBvYmplY3RzW2ldOworCisgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDwgbk9iamVjdHM7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGssIGw7CisgICAgICAgICAgICAgICAgZmxvYXQgdyA9IDAuZjsKKyAgICAgICAgICAgICAgICBmbG9hdCAqYSA9IGF2ZzsKKyAgICAgICAgICAgICAgICB1Y2hhciAqYnUxID0gYnU7CisgICAgICAgICAgICAgICAgdWNoYXIgKmJ1MiA9IG9iamVjdHNbal07CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICBrKyssIGJ1MSArPSBvYmpTdGVwLCBidTIgKz0gb2JqU3RlcCwgYSArPSBhdmdTdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBzaXplLndpZHRoIC0gMzsgbCArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IGFbbF07CisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB1MSA9IGJ1MVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHUyID0gYnUyW2xdOworCisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gYVtsICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGJ1MVtsICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICB1MiA9IGJ1MltsICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gYVtsICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGJ1MVtsICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICB1MiA9IGJ1MltsICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gYVtsICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICB1MSA9IGJ1MVtsICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICB1MiA9IGJ1MltsICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICB3ICs9ICh1MSAtIGYpICogKHUyIC0gZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGwgPCBzaXplLndpZHRoOyBsKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gYVtsXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHUxID0gYnUxW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdTIgPSBidTJbbF07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHcgKz0gKHUxIC0gZikgKiAodTIgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvdmFyTWF0cml4W2kgKiBuT2JqZWN0cyArIGpdID0gY292YXJNYXRyaXhbaiAqIG5PYmplY3RzICsgaV0gPSB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgKi8KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09IGVuZCBvZiBpY3ZDYWxjQ292YXJNYXRyaXhFeF84dTMyZlIgPT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworCitzdGF0aWMgaW50CitpY3ZEZWZhdWx0QnVmZmVyU2l6ZSggdm9pZCApCit7CisgICAgcmV0dXJuIDEwICogMTAyNCAqIDEwMjQ7Cit9CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogaWN2Q2FsY0VpZ2VuT2JqZWN0c184dTMyZlIKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIGFuIG9ydGhvbm9ybWFsIGVpZ2VuIGJhc2lzIGFuZCBhIG1lYW4gKGF2ZXJhZ2VkKQorLy8gICAgICAgICAgICAgb2JqZWN0IGZvciBhIGdyb3VwIG9mIGlucHV0IG9iamVjdHMgKGltYWdlcywgdmVjdG9ycywgZXRjLikuIFJPSSBzdXBwb3J0ZWQuCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogbk9iamVjdHMgIC0gbnVtYmVyIG9mIHNvdXJjZSBvYmplY3RzCisvLyAgICAgICAgICAgICAgICBpbnB1dCAgICAgLSBwb2ludGVyIGVpdGhlciB0byBhcnJheSBvZiBwb2ludGVycyB0byBpbnB1dCBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0byByZWFkIGNhbGxiYWNrIGZ1bmN0aW9uIChkZXBlbmRpbmcgb24gaW9GbGFncykKKy8vICAgICAgICAgICAgICAgIGltZ1N0ZXAgICAtIGZ1bGwgd2lkdGggb2YgZWFjaCBzb3VyY2Ugb2JqZWN0IHJvdyBpbiBieXRlcworLy8gICAgICAgICAgICAgICAgb3V0cHV0ICAgIC0gcG9pbnRlciBlaXRoZXIgdG8gYXJyYXkgb2YgcG9pbnRlcnMgdG8gb3V0cHV0IGVpZ2VuIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHdyaXRlIGNhbGxiYWNrIGZ1bmN0aW9uIChkZXBlbmRpbmcgb24gaW9GbGFncykKKy8vICAgICAgICAgICAgICAgIGVpZ1N0ZXAgICAtIGZ1bGwgd2lkdGggb2YgZWFjaCBlaWdlbm9iamVjdCByb3cgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgICAgIHNpemUgICAgICAtIFJPSSBzaXplIG9mIGVhY2ggc291cmNlIG9iamVjdAorLy8gICAgICAgICAgICAgICAgaW9GbGFncyAgIC0gaW5wdXQvb3V0cHV0IGZsYWdzIChzZWUgTm90ZXMpCisvLyAgICAgICAgICAgICAgICBpb0J1ZlNpemUgLSBpbnB1dC9vdXRwdXQgYnVmZmVyIHNpemUKKy8vICAgICAgICAgICAgICAgIHVzZXJEYXRhICAtIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhbGwgbmVjZXNzYXJ5CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zCisvLyAgICAgICAgICAgICAgICBjYWxjTGltaXQgLSBkZXRlcm1pbmVzIHRoZSBjYWxjdWxhdGlvbiBmaW5pc2ggY29uZGl0aW9ucworLy8gICAgICAgICAgICAgICAgYXZnICAgICAgIC0gcG9pbnRlciB0byBhdmVyYWdlZCBvYmplY3QgKGhhcyB0aGUgc2FtZSBzaXplIGFzIFJPSSkKKy8vICAgICAgICAgICAgICAgIGF2Z1N0ZXAgICAtIGZ1bGwgd2lkdGggb2YgYXZlcmFnZWQgb2JqZWN0IHJvdyBpbiBieXRlcworLy8gICAgICAgICAgICAgICAgZWlnVmFscyAgIC0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIGVpZ2VudmFsdWVzIChhcnJheSBvZiA8bk9iamVjdHM+CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpbiBkZXNjZW5kaW5nIG9yZGVyKQorLy8KKy8vICAgIFJldHVybnM6IENWX05PX0VSUiBvciBlcnJvciBjb2RlCisvLworLy8gICAgTm90ZXM6IDEuIGlucHV0L291dHB1dCBkYXRhICh0aGF0IGlzLCBpbnB1dCBvYmplY3RzIGFuZCBlaWdlbiBvbmVzKSBtYXkgZWl0aGVyCisvLyAgICAgICAgICAgICAgYmUgYWxsb2NhdGVkIGluIHRoZSBSQU0gb3IgYmUgcmVhZCBmcm9tL3dyaXR0ZW4gdG8gdGhlIEhERCAob3IgYW55CisvLyAgICAgICAgICAgICAgb3RoZXIgZGV2aWNlKSBieSByZWFkL3dyaXRlIGNhbGxiYWNrIGZ1bmN0aW9ucy4gSXQgZGVwZW5kcyBvbiB0aGUKKy8vICAgICAgICAgICAgICB2YWx1ZSBvZiBpb0ZsYWdzIHBhcmFtYXRlciwgd2hpY2ggbWF5IGJlIHRoZSBmb2xsb3dpbmc6CisvLyAgICAgICAgICAgICAgICAgIENWX0VJR09CSl9OT19DQUxMQkFDSywgb3IgMDsKKy8vICAgICAgICAgICAgICAgICAgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLOworLy8gICAgICAgICAgICAgICAgICBDVl9FSUdPQkpfT1VUUFVUX0NBTExCQUNLOworLy8gICAgICAgICAgICAgICAgICBDVl9FSUdPQkpfQk9USF9DQUxMQkFDSywgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyB8IENWX0VJR09CSl9PVVRQVVRfQ0FMTEJBQ0suCisvLyAgICAgICAgICAgICAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSB1c2VyIGRhdGEgc3RydWN0dXJlIG11c3QgYmUKKy8vICAgICAgICAgICAgICBkZXZlbG9wZWQgYnkgdGhlIHVzZXIuCisvLworLy8gICAgICAgICAgIDIuIElmIGlvQnVmU2l6ZSA9IDAsIG9yIGl0J3MgdG9vIGxhcmdlLCB0aGUgZnVuY3Rpb24gZGVybWluZXMgYnVmZmVyIHNpemUKKy8vICAgICAgICAgICAgICBpdHNlbGYuCisvLworLy8gICAgICAgICAgIDMuIERlcGVuZGluZyBvbiBjYWxjTGltaXQgcGFyYW1ldGVyLCBjYWxjdWxhdGlvbnMgYXJlIGZpbmlzaGVkIGVpdGhlciBpZgorLy8gICAgICAgICAgICAgIGVpZ2VuZmFjZXMgbnVtYmVyIGNvbWVzIHVwIHRvIGNlcnRhaW4gdmFsdWUgb3IgdGhlIHJlbGF0aW9uIG9mIHRoZQorLy8gICAgICAgICAgICAgIGN1cnJlbnQgZWlnZW52YWx1ZSBhbmQgdGhlIGxhcmdlc3Qgb25lIGNvbWVzIGRvd24gdG8gY2VydGFpbiB2YWx1ZQorLy8gICAgICAgICAgICAgIChvciBhbnkgb2YgdGhlIGFib3ZlIGNvbmRpdGlvbnMgdGFrZXMgcGxhY2UpLiBUaGUgY2FsY0xpbWl0LT50eXBlIHZhbHVlCisvLyAgICAgICAgICAgICAgbXVzdCBiZSBDVl9URVJNQ1JJVF9OVU1CLCBDVl9URVJNQ1JJVF9FUFMgb3IKKy8vICAgICAgICAgICAgICBDVl9URVJNQ1JJVF9OVU1CIHwgQ1ZfVEVSTUNSSVRfRVBTLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVhbAorLy8gICAgICAgICAgICAgIHZhbHVlcyBjYWxjTGltaXQtPm1heF9pdGVyIGFuZCBjYWxjTGltaXQtPmVwc2lsb24uCisvLworLy8gICAgICAgICAgIDQuIGVpZ1ZhbHMgbWF5IGJlIGVxdWFsIHRvIE5VTEwgKGlmIHlvdSBkb24ndCBuZWVkIGVpZ2VuIHZhbHVlcyBpbiBmdXJ0aGVyKS4KKy8vCisvL0YqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkNhbGNFaWdlbk9iamVjdHNfOHUzMmZSKCBpbnQgbk9iamVjdHMsIHZvaWQqIGlucHV0LCBpbnQgb2JqU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBvdXRwdXQsIGludCBlaWdTdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgIGlvRmxhZ3MsIGludCBpb0J1ZlNpemUsIHZvaWQqIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhKiBjYWxjTGltaXQsIGZsb2F0KiBhdmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgIGF2Z1N0ZXAsIGZsb2F0ICAqZWlnVmFscyApCit7CisgICAgaW50IGksIGosIG4sIGlldiA9IDAsIG0xID0gbk9iamVjdHMgLSAxLCBvYmpTdGVwMSA9IG9ialN0ZXAsIGVpZ1N0ZXAxID0gZWlnU3RlcCAvIDQ7CisgICAgQ3ZTaXplIG9ialNpemUsIGVpZ1NpemUsIGF2Z1NpemU7CisgICAgZmxvYXQgKmMgPSAwOworICAgIGZsb2F0ICpldiA9IDA7CisgICAgZmxvYXQgKmJmID0gMDsKKyAgICB1Y2hhciAqYnVmID0gMDsKKyAgICB2b2lkICpidWZmZXIgPSAwOworICAgIGZsb2F0IG0gPSAxLjBmIC8gKGZsb2F0KSBuT2JqZWN0czsKKyAgICBDdlN0YXR1cyByOworCisgICAgaWYoIG0xID4gY2FsY0xpbWl0LT5tYXhfaXRlciAmJiBjYWxjTGltaXQtPnR5cGUgIT0gQ1ZfVEVSTUNSSVRfRVBTICkKKyAgICAgICAgbTEgPSBjYWxjTGltaXQtPm1heF9pdGVyOworCisgICAgLyogLS0tLSBURVNUIE9GIFBBUkFNRVRFUlMgLS0tLSAqLworCisgICAgaWYoIG5PYmplY3RzIDwgMiApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGlmKCBpb0ZsYWdzIDwgMCB8fCBpb0ZsYWdzID4gMyApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGlmKCBpbnB1dCA9PSBOVUxMIHx8IG91dHB1dCA9PSBOVUxMIHx8IGF2ZyA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBzaXplLndpZHRoID4gb2JqU3RlcCB8fCA0ICogc2l6ZS53aWR0aCA+IGVpZ1N0ZXAgfHwKKyAgICAgICAgNCAqIHNpemUud2lkdGggPiBhdmdTdGVwIHx8IHNpemUuaGVpZ2h0IDwgMSApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggIShpb0ZsYWdzICYgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLKSApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuT2JqZWN0czsgaSsrICkKKyAgICAgICAgICAgIGlmKCAoKHVjaGFyICoqKSBpbnB1dClbaV0gPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCAhKGlvRmxhZ3MgJiBDVl9FSUdPQkpfT1VUUFVUX0NBTExCQUNLKSApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtMTsgaSsrICkKKyAgICAgICAgICAgIGlmKCAoKGZsb2F0ICoqKSBvdXRwdXQpW2ldID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGF2Z1N0ZXAgLz0gNDsKKyAgICBlaWdTdGVwIC89IDQ7CisKKyAgICBpZiggb2JqU3RlcCA9PSBzaXplLndpZHRoICYmIGVpZ1N0ZXAgPT0gc2l6ZS53aWR0aCAmJiBhdmdTdGVwID09IHNpemUud2lkdGggKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICBvYmpTdGVwID0gb2JqU3RlcDEgPSBlaWdTdGVwID0gZWlnU3RlcDEgPSBhdmdTdGVwID0gc2l6ZS53aWR0aDsKKyAgICB9CisgICAgb2JqU2l6ZSA9IGVpZ1NpemUgPSBhdmdTaXplID0gc2l6ZTsKKworICAgIGlmKCBpb0ZsYWdzICYgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLICkKKyAgICB7CisgICAgICAgIG9ialNpemUud2lkdGggKj0gb2JqU2l6ZS5oZWlnaHQ7CisgICAgICAgIG9ialNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgb2JqU3RlcCA9IG9ialNpemUud2lkdGg7CisgICAgICAgIG9ialN0ZXAxID0gc2l6ZS53aWR0aDsKKyAgICB9CisKKyAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9PVVRQVVRfQ0FMTEJBQ0sgKQorICAgIHsKKyAgICAgICAgZWlnU2l6ZS53aWR0aCAqPSBlaWdTaXplLmhlaWdodDsKKyAgICAgICAgZWlnU2l6ZS5oZWlnaHQgPSAxOworICAgICAgICBlaWdTdGVwID0gZWlnU2l6ZS53aWR0aDsKKyAgICAgICAgZWlnU3RlcDEgPSBzaXplLndpZHRoOworICAgIH0KKworICAgIG4gPSBvYmpTaXplLmhlaWdodCAqIG9ialNpemUud2lkdGggKiAoaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSykgKworICAgICAgICAyICogZWlnU2l6ZS5oZWlnaHQgKiBlaWdTaXplLndpZHRoICogKGlvRmxhZ3MgJiBDVl9FSUdPQkpfT1VUUFVUX0NBTExCQUNLKTsKKworICAgIC8qIEJ1ZmZlciBzaXplIGRldGVybWluYXRpb24gKi8KKyAgICBpZiggaW9GbGFncyApCisgICAgeworICAgICAgICBpbnQgc2l6ZSA9IGljdkRlZmF1bHRCdWZmZXJTaXplKCk7CisgICAgICAgIGlvQnVmU2l6ZSA9IE1JTiggc2l6ZSwgbiApOworICAgIH0KKworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIChpZiBuZWNlc3NlYXkpICovCisKKyAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyApCisgICAgeworICAgICAgICBidWYgPSAodWNoYXIgKikgY3ZBbGxvYyggc2l6ZW9mKCB1Y2hhciApICogb2JqU2l6ZS53aWR0aCApOworICAgICAgICBpZiggYnVmID09IE5VTEwgKQorICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKyAgICB9CisKKyAgICBpZiggaW9GbGFncyApCisgICAgeworICAgICAgICBidWZmZXIgPSAodm9pZCAqKSBjdkFsbG9jKCBpb0J1ZlNpemUgKTsKKyAgICAgICAgaWYoIGJ1ZmZlciA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGJ1ZiApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ2FsY3VsYXRpb24gb2YgYXZlcmFnZWQgb2JqZWN0ICovCisgICAgYmYgPSBhdmc7CisgICAgZm9yKCBpID0gMDsgaSA8IGF2Z1NpemUuaGVpZ2h0OyBpKyssIGJmICs9IGF2Z1N0ZXAgKQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgYXZnU2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgIGJmW2pdID0gMC5mOworCisgICAgZm9yKCBpID0gMDsgaSA8IG5PYmplY3RzOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGssIGw7CisgICAgICAgIHVjaGFyICpidSA9IChpb0ZsYWdzICYgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLKSA/IGJ1ZiA6ICgodWNoYXIgKiopIGlucHV0KVtpXTsKKworICAgICAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q2FsbGJhY2sgcmVhZF9jYWxsYmFjayA9ICgoQ3ZJbnB1dCAqKSAmIGlucHV0KS0+Y2FsbGJhY2s7CisKKyAgICAgICAgICAgIHIgPSAoQ3ZTdGF0dXMpcmVhZF9jYWxsYmFjayggaSwgKHZvaWQgKikgYnVmLCB1c2VyRGF0YSApOworICAgICAgICAgICAgaWYoIHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBidWZmZXIgKQorICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgICAgICAgICBpZiggYnVmICkKKyAgICAgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiZiA9IGF2ZzsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IGF2Z1NpemUuaGVpZ2h0OyBrKyssIGJmICs9IGF2Z1N0ZXAsIGJ1ICs9IG9ialN0ZXAxICkKKyAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBhdmdTaXplLndpZHRoOyBsKysgKQorICAgICAgICAgICAgICAgIGJmW2xdICs9IGJ1W2xdOworICAgIH0KKworICAgIGJmID0gYXZnOworICAgIGZvciggaSA9IDA7IGkgPCBhdmdTaXplLmhlaWdodDsgaSsrLCBiZiArPSBhdmdTdGVwICkKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGF2Z1NpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICBiZltqXSAqPSBtOworCisgICAgLyogQ2FsY3VsYXRpb24gb2YgY292YXJpYW5jZSBtYXRyaXggKi8KKyAgICBjID0gKGZsb2F0ICopIGN2QWxsb2MoIHNpemVvZiggZmxvYXQgKSAqIG5PYmplY3RzICogbk9iamVjdHMgKTsKKworICAgIGlmKCBjID09IE5VTEwgKQorICAgIHsKKyAgICAgICAgaWYoIGJ1ZmZlciApCisgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgaWYoIGJ1ZiApCisgICAgICAgICAgICBjdkZyZWUoICZidWYgKTsKKyAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKyAgICB9CisKKyAgICByID0gaWN2Q2FsY0NvdmFyTWF0cml4RXhfOHUzMmZSKCBuT2JqZWN0cywgaW5wdXQsIG9ialN0ZXAxLCBpb0ZsYWdzLCBpb0J1ZlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1Y2hhciAqKSBidWZmZXIsIHVzZXJEYXRhLCBhdmcsIDQgKiBhdmdTdGVwLCBzaXplLCBjICk7CisgICAgaWYoIHIgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmYyApOworICAgICAgICBpZiggYnVmZmVyICkKKyAgICAgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgICAgICBpZiggYnVmICkKKyAgICAgICAgICAgIGN2RnJlZSggJmJ1ZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICAvKiBDYWxjdWxhdGlvbiBvZiBlaWdlbnZhbHVlcyAmIGVpZ2VudmVjdG9ycyAqLworICAgIGV2ID0gKGZsb2F0ICopIGN2QWxsb2MoIHNpemVvZiggZmxvYXQgKSAqIG5PYmplY3RzICogbk9iamVjdHMgKTsKKworICAgIGlmKCBldiA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIGN2RnJlZSggJmMgKTsKKyAgICAgICAgaWYoIGJ1ZmZlciApCisgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgaWYoIGJ1ZiApCisgICAgICAgICAgICBjdkZyZWUoICZidWYgKTsKKyAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKyAgICB9CisKKyAgICBpZiggZWlnVmFscyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIGVpZ1ZhbHMgPSAoZmxvYXQgKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCApICogbk9iamVjdHMgKTsKKworICAgICAgICBpZiggZWlnVmFscyA9PSBOVUxMICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZGcmVlKCAmYyApOworICAgICAgICAgICAgY3ZGcmVlKCAmZXYgKTsKKyAgICAgICAgICAgIGlmKCBidWZmZXIgKQorICAgICAgICAgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgICAgICAgICAgaWYoIGJ1ZiApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgICAgICB9CisgICAgICAgIGlldiA9IDE7CisgICAgfQorCisgICAgciA9IGljdkphY29iaUVpZ2Vuc18zMmYoIGMsIGV2LCBlaWdWYWxzLCBuT2JqZWN0cywgMC4wZiApOworICAgIGN2RnJlZSggJmMgKTsKKyAgICBpZiggciApCisgICAgeworICAgICAgICBjdkZyZWUoICZldiApOworICAgICAgICBpZiggYnVmZmVyICkKKyAgICAgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgICAgICBpZiggYnVmICkKKyAgICAgICAgICAgIGN2RnJlZSggJmJ1ZiApOworICAgICAgICBpZiggaWV2ICkKKyAgICAgICAgICAgIGN2RnJlZSggJmVpZ1ZhbHMgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorCisgICAgLyogRWlnZW4gb2JqZWN0cyBudW1iZXIgZGV0ZXJtaW5hdGlvbiAqLworICAgIGlmKCBjYWxjTGltaXQtPnR5cGUgIT0gQ1ZfVEVSTUNSSVRfTlVNQkVSICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtMTsgaSsrICkKKyAgICAgICAgICAgIGlmKCBmYWJzKCBlaWdWYWxzW2ldIC8gZWlnVmFsc1swXSApIDwgY2FsY0xpbWl0LT5lcHNpbG9uICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbTEgPSBjYWxjTGltaXQtPm1heF9pdGVyID0gaTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBtMSA9IGNhbGNMaW1pdC0+bWF4X2l0ZXI7CisgICAgY2FsY0xpbWl0LT5lcHNpbG9uID0gKGZsb2F0KSBmYWJzKCBlaWdWYWxzW20xIC0gMV0gLyBlaWdWYWxzWzBdICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbTE7IGkrKyApCisgICAgICAgIGVpZ1ZhbHNbaV0gPSAoZmxvYXQpICgxLjAgLyBzcXJ0KCAoZG91YmxlKWVpZ1ZhbHNbaV0gKSk7CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLSBDYWxjdWxhdGlvbiBvZiBlaWdlbm9iamVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9PVVRQVVRfQ0FMTEJBQ0sgKQorICAgIHsKKyAgICAgICAgaW50IG5pbywgbmdyLCBpZ3I7CisKKyAgICAgICAgbmlvID0gaW9CdWZTaXplIC8gKDQgKiBlaWdTaXplLndpZHRoKTsgIC8qIG51bWJlciBvZiBlaWdlbiBvYmplY3RzIGluIGJ1ZmZlciAqLworICAgICAgICBuZ3IgPSBtMSAvIG5pbzsgICAgICAgICAvKiBudW1iZXIgb2YgaW8gZ3JvdXBzICovCisgICAgICAgIGlmKCBuT2JqZWN0cyAlIG5pbyApCisgICAgICAgICAgICBuZ3IgKz0gMTsKKworICAgICAgICBmb3IoIGlnciA9IDA7IGlnciA8IG5ncjsgaWdyKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaSwgaW8sIGllLCBpbWluID0gaWdyICogbmlvLCBpbWF4ID0gaW1pbiArIG5pbzsKKworICAgICAgICAgICAgaWYoIGltYXggPiBtMSApCisgICAgICAgICAgICAgICAgaW1heCA9IG0xOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZWlnU2l6ZS53aWR0aCAqIChpbWF4IC0gaW1pbik7IGkrKyApCisgICAgICAgICAgICAgICAgKChmbG9hdCAqKSBidWZmZXIpW2ldID0gMC5mOworCisgICAgICAgICAgICBmb3IoIGlvID0gMDsgaW8gPCBuT2JqZWN0czsgaW8rKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIgKmJ1ID0gaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyA/IGJ1ZiA6ICgodWNoYXIgKiopIGlucHV0KVtpb107CisKKyAgICAgICAgICAgICAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkNhbGxiYWNrIHJlYWRfY2FsbGJhY2sgPSAoKEN2SW5wdXQgKikgJiBpbnB1dCktPmNhbGxiYWNrOworCisgICAgICAgICAgICAgICAgICAgIHIgPSAoQ3ZTdGF0dXMpcmVhZF9jYWxsYmFjayggaW8sICh2b2lkICopIGJ1ZiwgdXNlckRhdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZldiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlldiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZGcmVlKCAmZWlnVmFscyApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJ1ZmZlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYnVmICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZidWYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKCBpZSA9IGltaW47IGllIDwgaW1heDsgaWUrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaywgbDsKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmJ2ID0gYnU7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IGUgPSBldltpZSAqIG5PYmplY3RzICsgaW9dICogZWlnVmFsc1tpZV07CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpiZSA9ICgoZmxvYXQgKikgYnVmZmVyKSArICgoaWUgLSBpbWluKSAqIGVpZ1N0ZXApOworCisgICAgICAgICAgICAgICAgICAgIGJmID0gYXZnOworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgc2l6ZS5oZWlnaHQ7IGsrKywgYnYgKz0gb2JqU3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgYmYgKz0gYXZnU3RlcCwgYmUgKz0gZWlnU3RlcDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgc2l6ZS53aWR0aCAtIDM7IGwgKz0gNCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IGJmW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyIHYgPSBidltsXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlW2xdICs9IGUgKiAodiAtIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBiZltsICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiA9IGJ2W2wgKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZVtsICsgMV0gKz0gZSAqICh2IC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGJmW2wgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ID0gYnZbbCArIDJdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlW2wgKyAyXSArPSBlICogKHYgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gYmZbbCArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBidltsICsgM107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVbbCArIDNdICs9IGUgKiAodiAtIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGwgPCBzaXplLndpZHRoOyBsKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlW2xdICs9IGUgKiAoYnZbbF0gLSBiZltsXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlvICovCisKKyAgICAgICAgICAgIGZvciggaWUgPSBpbWluOyBpZSA8IGltYXg7IGllKysgKSAgIC8qIGNhbGN1bGF0ZWQgZWlnZW4gb2JqZWN0cyB3cml0dGluZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q2FsbGJhY2sgd3JpdGVfY2FsbGJhY2sgPSAoKEN2SW5wdXQgKikgJiBvdXRwdXQpLT5jYWxsYmFjazsKKyAgICAgICAgICAgICAgICBmbG9hdCAqYmUgPSAoKGZsb2F0ICopIGJ1ZmZlcikgKyAoKGllIC0gaW1pbikgKiBlaWdTdGVwKTsKKworICAgICAgICAgICAgICAgIHIgPSAoQ3ZTdGF0dXMpd3JpdGVfY2FsbGJhY2soIGllLCAodm9pZCAqKSBiZSwgdXNlckRhdGEgKTsKKyAgICAgICAgICAgICAgICBpZiggciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZldiApOworICAgICAgICAgICAgICAgICAgICBpZiggaWV2ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2RnJlZSggJmVpZ1ZhbHMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGJ1ZmZlciApCisgICAgICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGJ1ZiApCisgICAgICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZidWYgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZ3IgKi8KKyAgICB9CisKKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaywgcCwgbDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbTE7IGkrKyApICAgICAgIC8qIGUuby4gYW5udWxhdGlvbiAqLworICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCAqYmUgPSAoKGZsb2F0ICoqKSBvdXRwdXQpW2ldOworCisgICAgICAgICAgICBmb3IoIHAgPSAwOyBwIDwgZWlnU2l6ZS5oZWlnaHQ7IHArKywgYmUgKz0gZWlnU3RlcCApCisgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IGVpZ1NpemUud2lkdGg7IGwrKyApCisgICAgICAgICAgICAgICAgICAgIGJlW2xdID0gMC4wZjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggayA9IDA7IGsgPCBuT2JqZWN0czsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIgKmJ2ID0gKGlvRmxhZ3MgJiBDVl9FSUdPQkpfSU5QVVRfQ0FMTEJBQ0spID8gYnVmIDogKCh1Y2hhciAqKikgaW5wdXQpW2tdOworCisgICAgICAgICAgICBpZiggaW9GbGFncyAmIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZDYWxsYmFjayByZWFkX2NhbGxiYWNrID0gKChDdklucHV0ICopICYgaW5wdXQpLT5jYWxsYmFjazsKKworICAgICAgICAgICAgICAgIHIgPSAoQ3ZTdGF0dXMpcmVhZF9jYWxsYmFjayggaywgKHZvaWQgKikgYnVmLCB1c2VyRGF0YSApOworICAgICAgICAgICAgICAgIGlmKCByICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2RnJlZSggJmV2ICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpZXYgKQorICAgICAgICAgICAgICAgICAgICAgICAgY3ZGcmVlKCAmZWlnVmFscyApOworICAgICAgICAgICAgICAgICAgICBpZiggYnVmZmVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgICAgICAgICAgICAgICAgICBpZiggYnVmICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2RnJlZSggJmJ1ZiApOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBtMTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2ID0gZWlnVmFsc1tpXSAqIGV2W2kgKiBuT2JqZWN0cyArIGtdOworICAgICAgICAgICAgICAgIGZsb2F0ICpiZSA9ICgoZmxvYXQgKiopIG91dHB1dClbaV07CisgICAgICAgICAgICAgICAgdWNoYXIgKmJ1ID0gYnY7CisKKyAgICAgICAgICAgICAgICBiZiA9IGF2ZzsKKworICAgICAgICAgICAgICAgIGZvciggcCA9IDA7IHAgPCBzaXplLmhlaWdodDsgcCsrLCBidSArPSBvYmpTdGVwMSwKKyAgICAgICAgICAgICAgICAgICAgIGJmICs9IGF2Z1N0ZXAsIGJlICs9IGVpZ1N0ZXAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBzaXplLndpZHRoIC0gMzsgbCArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZiA9IGJmW2xdOworICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgdSA9IGJ1W2xdOworCisgICAgICAgICAgICAgICAgICAgICAgICBiZVtsXSArPSB2ICogKHUgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBiZltsICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICB1ID0gYnVbbCArIDFdOworICAgICAgICAgICAgICAgICAgICAgICAgYmVbbCArIDFdICs9IHYgKiAodSAtIGYpOworICAgICAgICAgICAgICAgICAgICAgICAgZiA9IGJmW2wgKyAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgPSBidVtsICsgMl07CisgICAgICAgICAgICAgICAgICAgICAgICBiZVtsICsgMl0gKz0gdiAqICh1IC0gZik7CisgICAgICAgICAgICAgICAgICAgICAgICBmID0gYmZbbCArIDNdOworICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGJ1W2wgKyAzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJlW2wgKyAzXSArPSB2ICogKHUgLSBmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIDsgbCA8IHNpemUud2lkdGg7IGwrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBiZVtsXSArPSB2ICogKGJ1W2xdIC0gYmZbbF0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaSAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBrICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVsc2UgKi8KKworICAgIGN2RnJlZSggJmV2ICk7CisgICAgaWYoIGlldiApCisgICAgICAgIGN2RnJlZSggJmVpZ1ZhbHMgKTsKKyAgICBlbHNlCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtMTsgaSsrICkKKyAgICAgICAgICAgIGVpZ1ZhbHNbaV0gPSAxLmYgLyAoZWlnVmFsc1tpXSAqIGVpZ1ZhbHNbaV0pOworICAgIGlmKCBidWZmZXIgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBpZiggYnVmICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLyogLS0tIEVuZCBvZiBpY3ZDYWxjRWlnZW5PYmplY3RzXzh1MzJmUiAtLS0gKi8KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDYWxjRGVjb21wQ29lZmZfOHUzMmZSCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBvbmUgZGVjb21wb3NpdGlvbiBjb2VmZmljaWVudCBvZiBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgIHVzaW5nIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlaWdlbiBvYmplY3QgYW5kIHRoZSBtZWFuIChhdmVyYWdlZCkgb2JqZWN0CisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG9iaiAgICAgLSBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBvYmpTdGVwIC0gaXRzIHN0ZXAgKGluIGJ5dGVzKQorLy8gICAgICAgICAgICAgICAgIGVpZ09iaiAgLSBwb2ludGVyIHRvIGVpZ2VuIG9iamVjdAorLy8gICAgICAgICAgICAgICAgIGVpZ1N0ZXAgLSBpdHMgc3RlcCAoaW4gYnl0ZXMpCisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAtIHBvaW50ZXIgdG8gYXZlcmFnZWQgb2JqZWN0CisvLyAgICAgICAgICAgICAgICAgYXZnU3RlcCAtIGl0cyBzdGVwIChpbiBieXRlcykKKy8vICAgICAgICAgICAgICAgICBzaXplICAgIC0gUk9JIHNpemUgb2YgZWFjaCBzb3VyY2Ugb2JqZWN0CisvLworLy8gICAgUmV0dXJuczogZGVjb21wb3NpdGlvbiBjb2VmZmljaWVudCB2YWx1ZSBvciBsYXJnZSBuZWdhdGl2ZSB2YWx1ZSAoaWYgZXJyb3IpCisvLworLy8gICAgTm90ZXM6CisvL0YqLworc3RhdGljIGZsb2F0IENWX1NURENBTEwKK2ljdkNhbGNEZWNvbXBDb2VmZl84dTMyZlIoIHVjaGFyKiBvYmosIGludCBvYmpTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmVpZ09iaiwgaW50IGVpZ1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqYXZnLCBpbnQgYXZnU3RlcCwgQ3ZTaXplIHNpemUgKQoreworICAgIGludCBpLCBrOworICAgIGZsb2F0IHcgPSAwLjBmOworCisgICAgaWYoIHNpemUud2lkdGggPiBvYmpTdGVwIHx8IDQgKiBzaXplLndpZHRoID4gZWlnU3RlcAorICAgICAgICB8fCA0ICogc2l6ZS53aWR0aCA+IGF2Z1N0ZXAgfHwgc2l6ZS5oZWlnaHQgPCAxICkKKyAgICAgICAgcmV0dXJuIC0xLjBlMzBmOworICAgIGlmKCBvYmogPT0gTlVMTCB8fCBlaWdPYmogPT0gTlVMTCB8fCBhdmcgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAtMS4wZTMwZjsKKworICAgIGVpZ1N0ZXAgLz0gNDsKKyAgICBhdmdTdGVwIC89IDQ7CisKKyAgICBpZiggc2l6ZS53aWR0aCA9PSBvYmpTdGVwICYmIHNpemUud2lkdGggPT0gZWlnU3RlcCAmJiBzaXplLndpZHRoID09IGF2Z1N0ZXAgKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICBvYmpTdGVwID0gZWlnU3RlcCA9IGF2Z1N0ZXAgPSBzaXplLndpZHRoOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrLCBvYmogKz0gb2JqU3RlcCwgZWlnT2JqICs9IGVpZ1N0ZXAsIGF2ZyArPSBhdmdTdGVwICkKKyAgICB7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBzaXplLndpZHRoIC0gNDsgayArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgbyA9IChmbG9hdCkgb2JqW2tdOworICAgICAgICAgICAgZmxvYXQgZSA9IGVpZ09ialtrXTsKKyAgICAgICAgICAgIGZsb2F0IGEgPSBhdmdba107CisKKyAgICAgICAgICAgIHcgKz0gZSAqIChvIC0gYSk7CisgICAgICAgICAgICBvID0gKGZsb2F0KSBvYmpbayArIDFdOworICAgICAgICAgICAgZSA9IGVpZ09ialtrICsgMV07CisgICAgICAgICAgICBhID0gYXZnW2sgKyAxXTsKKyAgICAgICAgICAgIHcgKz0gZSAqIChvIC0gYSk7CisgICAgICAgICAgICBvID0gKGZsb2F0KSBvYmpbayArIDJdOworICAgICAgICAgICAgZSA9IGVpZ09ialtrICsgMl07CisgICAgICAgICAgICBhID0gYXZnW2sgKyAyXTsKKyAgICAgICAgICAgIHcgKz0gZSAqIChvIC0gYSk7CisgICAgICAgICAgICBvID0gKGZsb2F0KSBvYmpbayArIDNdOworICAgICAgICAgICAgZSA9IGVpZ09ialtrICsgM107CisgICAgICAgICAgICBhID0gYXZnW2sgKyAzXTsKKyAgICAgICAgICAgIHcgKz0gZSAqIChvIC0gYSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKCA7IGsgPCBzaXplLndpZHRoOyBrKysgKQorICAgICAgICAgICAgdyArPSBlaWdPYmpba10gKiAoKGZsb2F0KSBvYmpba10gLSBhdmdba10pOworICAgIH0KKworICAgIHJldHVybiB3OworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWVzOiBpY3ZFaWdlbkRlY29tcG9zaXRlXzh1MzJmUgorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYWxsIGRlY29tcG9zaXRpb24gY29lZmZpY2llbnRzIGZvciBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgIHVzaW5nIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlaWdlbiBvYmplY3RzIGJhc2lzIGFuZCB0aGUgbWVhbiAoYXZlcmFnZWQpCisvLyAgICAgICAgICAgICBvYmplY3QKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgb2JqICAgICAgICAgLSBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBvYmpTdGVwICAgICAtIGl0cyBzdGVwIChpbiBieXRlcykKKy8vICAgICAgICAgICAgICAgICBuRWlnT2JqcyAgICAtIG51bWJlciBvZiBlaWdlbiBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgZWlnSW5wdXQgICAgLSBwb2ludGVyIGVpdGhlciB0byBhcnJheSBvZiBwb2ludGVycyB0byBlaWdlbiBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0byByZWFkIGNhbGxiYWNrIGZ1bmN0aW9uIChkZXBlbmRpbmcgb24gaW9GbGFncykKKy8vICAgICAgICAgICAgICAgICBlaWdTdGVwICAgICAtIGVpZ2VuIG9iamVjdHMgc3RlcCAoaW4gYnl0ZXMpCisvLyAgICAgICAgICAgICAgICAgaW9GbGFncyAgICAgLSBpbnB1dC9vdXRwdXQgZmxhZ3MKKy8vICAgICAgICAgICAgICAgICBpc2VyRGF0YSAgICAtIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhbGwgbmVjZXNzYXJ5CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAgICBhdmcgICAgICAgICAtIHBvaW50ZXIgdG8gYXZlcmFnZWQgb2JqZWN0CisvLyAgICAgICAgICAgICAgICAgYXZnU3RlcCAgICAgLSBpdHMgc3RlcCAoaW4gYnl0ZXMpCisvLyAgICAgICAgICAgICAgICAgc2l6ZSAgICAgICAgLSBST0kgc2l6ZSBvZiBlYWNoIHNvdXJjZSBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBjb2VmZnMgICAgICAtIGNhbGN1bGF0ZWQgY29lZmZpY2llbnRzIChvdXRwdXQgZGF0YSkKKy8vCisvLyAgICBSZXR1cm5zOiBpY3Ygc3RhdHVzCisvLworLy8gICAgTm90ZXM6ICAgc2VlIG5vdGVzIGZvciBpY3ZDYWxjRWlnZW5PYmplY3RzXzh1MzJmUiBmdW5jdGlvbgorLy9GKi8KK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZFaWdlbkRlY29tcG9zaXRlXzh1MzJmUiggdWNoYXIgKiBvYmosIGludCBvYmpTdGVwLCBpbnQgbkVpZ09ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZWlnSW5wdXQsIGludCBlaWdTdGVwLCBpbnQgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyRGF0YSwgZmxvYXQgKmF2ZywgaW50IGF2Z1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGZsb2F0ICpjb2VmZnMgKQoreworICAgIGludCBpOworCisgICAgaWYoIG5FaWdPYmpzIDwgMiApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGlmKCBpb0ZsYWdzIDwgMCB8fCBpb0ZsYWdzID4gMSApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGlmKCBzaXplLndpZHRoID4gb2JqU3RlcCB8fCA0ICogc2l6ZS53aWR0aCA+IGVpZ1N0ZXAgfHwKKyAgICAgICAgNCAqIHNpemUud2lkdGggPiBhdmdTdGVwIHx8IHNpemUuaGVpZ2h0IDwgMSApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggb2JqID09IE5VTEwgfHwgZWlnSW5wdXQgPT0gTlVMTCB8fCBjb2VmZnMgPT0gTlVMTCB8fCBhdmcgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggIWlvRmxhZ3MgKQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbkVpZ09ianM7IGkrKyApCisgICAgICAgICAgICBpZiggKCh1Y2hhciAqKikgZWlnSW5wdXQpW2ldID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGlmKCBpb0ZsYWdzICkgICAgICAgICAgICAgICAvKiBjYWxsYmFjayAqLworCisgICAgeworICAgICAgICBmbG9hdCAqYnVmZmVyOworICAgICAgICBDdkNhbGxiYWNrIHJlYWRfY2FsbGJhY2sgPSAoKEN2SW5wdXQgKikgJiBlaWdJbnB1dCktPmNhbGxiYWNrOworCisgICAgICAgIGVpZ1N0ZXAgPSA0ICogc2l6ZS53aWR0aDsKKworICAgICAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgICAgICBidWZmZXIgPSAoZmxvYXQgKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCApICogc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0ICk7CisKKyAgICAgICAgaWYoIGJ1ZmZlciA9PSBOVUxMICkKKyAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5FaWdPYmpzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB3OworICAgICAgICAgICAgQ3ZTdGF0dXMgciA9IChDdlN0YXR1cylyZWFkX2NhbGxiYWNrKCBpLCAodm9pZCAqKSBidWZmZXIsIHVzZXJEYXRhICk7CisKKyAgICAgICAgICAgIGlmKCByICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHcgPSBpY3ZDYWxjRGVjb21wQ29lZmZfOHUzMmZSKCBvYmosIG9ialN0ZXAsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlnU3RlcCwgYXZnLCBhdmdTdGVwLCBzaXplICk7CisgICAgICAgICAgICBpZiggdyA8IC0xLjBlMjlmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfTk9UREVGSU5FRF9FUlI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2VmZnNbaV0gPSB3OworICAgICAgICB9CisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIH0KKworICAgIGVsc2UKKyAgICAgICAgLyogbm8gY2FsbGJhY2sgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5FaWdPYmpzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCB3ID0gaWN2Q2FsY0RlY29tcENvZWZmXzh1MzJmUiggb2JqLCBvYmpTdGVwLCAoKGZsb2F0ICoqKSBlaWdJbnB1dClbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZ1N0ZXAsIGF2ZywgYXZnU3RlcCwgc2l6ZSApOworCisgICAgICAgICAgICBpZiggdyA8IC0xLjBlMjlmICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfTk9UREVGSU5FRF9FUlI7CisgICAgICAgICAgICBjb2VmZnNbaV0gPSB3OworICAgICAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZXM6IGljdkVpZ2VuUHJvamVjdGlvbl84dTMyZlIKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIG9iamVjdCBwcm9qZWN0aW9uIHRvIHRoZSBlaWdlbiBzdWItc3BhY2UgKHJlc3RvcmVzCisvLyAgICAgICAgICAgICBhbiBvYmplY3QpIHVzaW5nIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlaWdlbiBvYmplY3RzIGJhc2lzLCBtZWFuIChhdmVyYWdlZCkKKy8vICAgICAgICAgICAgIG9iamVjdCBhbmQgZGVjb21wb3NpdGlvbiBjb2VmZmljaWVudHMgb2YgdGhlIHJlc3RvcmVkIG9iamVjdAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICBuRWlnT2JqcyAtIE51bWJlciBvZiBlaWdlbiBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgZWlnZW5zICAgLSBBcnJheSBvZiBwb2ludGVycyB0byBlaWdlbiBvYmplY3RzCisvLyAgICAgICAgICAgICAgICAgZWlnU3RlcCAgLSBFaWdlbiBvYmplY3RzIHN0ZXAgKGluIGJ5dGVzKQorLy8gICAgICAgICAgICAgICAgIGNvZWZmcyAgIC0gUHJldmlvdXNseSBjYWxjdWxhdGVkIGRlY29tcG9zaXRpb24gY29lZmZpY2llbnRzCisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAgLSBQb2ludGVyIHRvIGF2ZXJhZ2VkIG9iamVjdAorLy8gICAgICAgICAgICAgICAgIGF2Z1N0ZXAgIC0gSXRzIHN0ZXAgKGluIGJ5dGVzKQorLy8gICAgICAgICAgICAgICAgIHJlc3QgICAgIC0gUG9pbnRlciB0byByZXN0b3JlZCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICByZXN0U3RlcCAtIEl0cyBzdGVwIChpbiBieXRlcykKKy8vICAgICAgICAgICAgICAgICBzaXplICAgICAtIFJPSSBzaXplIG9mIGVhY2ggb2JqZWN0CisvLworLy8gICAgUmV0dXJuczogQ1Ygc3RhdHVzCisvLworLy8gICAgTm90ZXM6CisvL0YqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkVpZ2VuUHJvamVjdGlvbl84dTMyZlIoIGludCBuRWlnT2Jqcywgdm9pZCAqZWlnSW5wdXQsIGludCBlaWdTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlvRmxhZ3MsIHZvaWQgKnVzZXJEYXRhLCBmbG9hdCAqY29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmF2ZywgaW50IGF2Z1N0ZXAsIHVjaGFyICogcmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXN0U3RlcCwgQ3ZTaXplIHNpemUgKQoreworICAgIGludCBpLCBqLCBrOworICAgIGZsb2F0ICpidWY7CisgICAgZmxvYXQgKmJ1ZmZlciA9IE5VTEw7CisgICAgZmxvYXQgKmI7CisgICAgQ3ZDYWxsYmFjayByZWFkX2NhbGxiYWNrID0gKChDdklucHV0ICopICYgZWlnSW5wdXQpLT5jYWxsYmFjazsKKworICAgIGlmKCBzaXplLndpZHRoID4gYXZnU3RlcCB8fCA0ICogc2l6ZS53aWR0aCA+IGVpZ1N0ZXAgfHwgc2l6ZS5oZWlnaHQgPCAxICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCByZXN0ID09IE5VTEwgfHwgZWlnSW5wdXQgPT0gTlVMTCB8fCBhdmcgPT0gTlVMTCB8fCBjb2VmZnMgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggaW9GbGFncyA8IDAgfHwgaW9GbGFncyA+IDEgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICBpZiggIWlvRmxhZ3MgKQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbkVpZ09ianM7IGkrKyApCisgICAgICAgICAgICBpZiggKCh1Y2hhciAqKikgZWlnSW5wdXQpW2ldID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBlaWdTdGVwIC89IDQ7CisgICAgYXZnU3RlcCAvPSA0OworCisgICAgaWYoIHNpemUud2lkdGggPT0gcmVzdFN0ZXAgJiYgc2l6ZS53aWR0aCA9PSBlaWdTdGVwICYmIHNpemUud2lkdGggPT0gYXZnU3RlcCApCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIHJlc3RTdGVwID0gZWlnU3RlcCA9IGF2Z1N0ZXAgPSBzaXplLndpZHRoOworICAgIH0KKworICAgIGJ1ZiA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBzaXplLndpZHRoICogc2l6ZS5oZWlnaHQgKTsKKworICAgIGlmKCBidWYgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgYiA9IGJ1ZjsKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgYXZnICs9IGF2Z1N0ZXAsIGIgKz0gc2l6ZS53aWR0aCApCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgYltqXSA9IGF2Z1tqXTsKKworICAgIGlmKCBpb0ZsYWdzICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IChmbG9hdCAqKSBjdkFsbG9jKCBzaXplb2YoIGZsb2F0ICkgKiBzaXplLndpZHRoICogc2l6ZS5oZWlnaHQgKTsKKworICAgICAgICBpZiggYnVmZmVyID09IE5VTEwgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZidWYgKTsKKyAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIH0KKyAgICAgICAgZWlnU3RlcCA9IHNpemUud2lkdGg7CisgICAgfQorCisgICAgZm9yKCBrID0gMDsgayA8IG5FaWdPYmpzOyBrKysgKQorICAgIHsKKyAgICAgICAgZmxvYXQgKmUgPSBpb0ZsYWdzID8gYnVmZmVyIDogKChmbG9hdCAqKikgZWlnSW5wdXQpW2tdOworICAgICAgICBmbG9hdCBjID0gY29lZmZzW2tdOworCisgICAgICAgIGlmKCBpb0ZsYWdzICkgICAgICAgICAgIC8qIHJlYWQgZWlnZW4gb2JqZWN0ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U3RhdHVzIHIgPSAoQ3ZTdGF0dXMpcmVhZF9jYWxsYmFjayggaywgKHZvaWQgKikgYnVmZmVyLCB1c2VyRGF0YSApOworCisgICAgICAgICAgICBpZiggciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBiID0gYnVmOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgZSArPSBlaWdTdGVwLCBiICs9IHNpemUud2lkdGggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aCAtIDM7IGogKz0gNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgYjAgPSBjICogZVtqXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiMSA9IGMgKiBlW2ogKyAxXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiMiA9IGMgKiBlW2ogKyAyXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBiMyA9IGMgKiBlW2ogKyAzXTsKKworICAgICAgICAgICAgICAgIGJbal0gKz0gYjA7CisgICAgICAgICAgICAgICAgYltqICsgMV0gKz0gYjE7CisgICAgICAgICAgICAgICAgYltqICsgMl0gKz0gYjI7CisgICAgICAgICAgICAgICAgYltqICsgM10gKz0gYjM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgYltqXSArPSBjICogZVtqXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGIgPSBidWY7CisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIGF2ZyArPSBhdmdTdGVwLCBiICs9IHNpemUud2lkdGgsIHJlc3QgKz0gcmVzdFN0ZXAgKQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHcgPSBjdlJvdW5kKCBiW2pdICk7CisKKyAgICAgICAgICAgIHcgPSAhKHcgJiB+MjU1KSA/IHcgOiB3IDwgMCA/IDAgOiAyNTU7CisgICAgICAgICAgICByZXN0W2pdID0gKHVjaGFyKSB3OworICAgICAgICB9CisKKyAgICBjdkZyZWUoICZidWYgKTsKKyAgICBpZiggaW9GbGFncyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZDYWxjQ292YXJNYXRyaXhFeAorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYSBjb3ZhcmlhbmNlIG1hdHJpeCBmb3IgYSBncm91cCBvZiBpbnB1dCBvYmplY3RzCisvLyAgICAgICAgICAgICAoaW1hZ2VzLCB2ZWN0b3JzLCBldGMuKS4KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgbk9iamVjdHMgICAgLSBudW1iZXIgb2Ygc291cmNlIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICBpbnB1dCAgICAgICAtIHBvaW50ZXIgZWl0aGVyIHRvIGFycmF5IG9mIGlucHV0IG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHJlYWQgY2FsbGJhY2sgZnVuY3Rpb24gKGRlcGVuZGluZyBvbiBpb0ZsYWdzKQorLy8gICAgICAgICAgICAgICAgIGlvRmxhZ3MgICAgIC0gaW5wdXQvb3V0cHV0IGZsYWdzIChzZWUgTm90ZXMgdG8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Q2FsY0VpZ2VuT2JqZWN0cyBmdW5jdGlvbikKKy8vICAgICAgICAgICAgICAgICBpb0J1ZlNpemUgICAtIGlucHV0L291dHB1dCBidWZmZXIgc2l6ZQorLy8gICAgICAgICAgICAgICAgIHVzZXJEYXRhICAgIC0gcG9pbnRlciB0byB0aGUgc3RydWN0dXJlIHdoaWNoIGNvbnRhaW5zIGFsbCBuZWNlc3NhcnkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMKKy8vICAgICAgICAgICAgICAgICBhdmcgICAgICAgICAtIGF2ZXJhZ2VkIG9iamVjdAorLy8gICAgICAgICAgICAgICAgIGNvdmFyTWF0cml4IC0gY292YXJpYW5jZSBtYXRyaXggKG91dHB1dCBwYXJhbWV0ZXI7IG11c3QgYmUgYWxsb2NhdGVkCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgY2FsbCkKKy8vCisvLyAgICBOb3RlczogIFNlZSBOb3RlcyB0byBjdkNhbGNFaWdlbk9iamVjdHMgZnVuY3Rpb24KKy8vRiovCisKK0NWX0lNUEwgdm9pZAorY3ZDYWxjQ292YXJNYXRyaXhFeCggaW50ICBuT2JqZWN0cywgdm9pZCogIGlucHV0LCBpbnQgIGlvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBpbnQgIGlvQnVmU2l6ZSwgdWNoYXIqICBidWZmZXIsIHZvaWQqICB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiBhdmcsIGZsb2F0KiAgY292YXJNYXRyaXggKQoreworICAgIGZsb2F0ICphdmdfZGF0YTsKKyAgICBpbnQgYXZnX3N0ZXAgPSAwOworICAgIEN2U2l6ZSBhdmdfc2l6ZTsKKyAgICBpbnQgaTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjQ292YXJNYXRyaXhFeCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGN2R2V0SW1hZ2VSYXdEYXRhKCBhdmcsICh1Y2hhciAqKikgJiBhdmdfZGF0YSwgJmF2Z19zdGVwLCAmYXZnX3NpemUgKTsKKyAgICBpZiggYXZnLT5kZXB0aCAhPSBJUExfREVQVEhfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgaWYoIGF2Zy0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgIGlmKCBpb0ZsYWdzID09IENWX0VJR09CSl9OT19DQUxMQkFDSyApCisgICAgeworICAgICAgICBJcGxJbWFnZSAqKmltYWdlcyA9IChJcGxJbWFnZSAqKikgKCgoQ3ZJbnB1dCAqKSAmIGlucHV0KS0+ZGF0YSk7CisgICAgICAgIHVjaGFyICoqb2JqZWN0cyA9ICh1Y2hhciAqKikgY3ZBbGxvYyggc2l6ZW9mKCB1Y2hhciAqICkgKiBuT2JqZWN0cyApOworICAgICAgICBpbnQgaW1nX3N0ZXAgPSAwLCBvbGRfc3RlcCA9IDA7CisgICAgICAgIEN2U2l6ZSBpbWdfc2l6ZSA9IGF2Z19zaXplLCBvbGRfc2l6ZSA9IGF2Z19zaXplOworCisgICAgICAgIGlmKCBvYmplY3RzID09IE5VTEwgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkluc3VmZmljaWVudCBtZW1vcnkiICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5PYmplY3RzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBJcGxJbWFnZSAqaW1nID0gaW1hZ2VzW2ldOworICAgICAgICAgICAgdWNoYXIgKmltZ19kYXRhOworCisgICAgICAgICAgICBjdkdldEltYWdlUmF3RGF0YSggaW1nLCAmaW1nX2RhdGEsICZpbWdfc3RlcCwgJmltZ19zaXplICk7CisgICAgICAgICAgICBpZiggaW1nLT5kZXB0aCAhPSBJUExfREVQVEhfOFUgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgaWYoIGltZ19zaXplICE9IGF2Z19zaXplIHx8IGltZ19zaXplICE9IG9sZF9zaXplICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiRGlmZmVyZW50IHNpemVzIG9mIG9iamVjdHMiICk7CisgICAgICAgICAgICBpZiggaW1nLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgICAgICAgICBpZiggaSA+IDAgJiYgaW1nX3N0ZXAgIT0gb2xkX3N0ZXAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc3RlcHMgb2Ygb2JqZWN0cyIgKTsKKworICAgICAgICAgICAgb2xkX3N0ZXAgPSBpbWdfc3RlcDsKKyAgICAgICAgICAgIG9sZF9zaXplID0gaW1nX3NpemU7CisgICAgICAgICAgICBvYmplY3RzW2ldID0gaW1nX2RhdGE7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBpY3ZDYWxjQ292YXJNYXRyaXhFeF84dTMyZlIoIG5PYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FSUdPQkpfTk9fQ0FMTEJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY292YXJNYXRyaXggKSk7CisgICAgICAgIGN2RnJlZSggJm9iamVjdHMgKTsKKyAgICB9CisKKyAgICBlbHNlCisKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGljdkNhbGNDb3Zhck1hdHJpeEV4Xzh1MzJmUiggbk9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAgLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9CdWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3Zhck1hdHJpeCApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2Q2FsY0VpZ2VuT2JqZWN0cworLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYW4gb3J0aG9ub3JtYWwgZWlnZW4gYmFzaXMgYW5kIGEgbWVhbiAoYXZlcmFnZWQpCisvLyAgICAgICAgICAgICBvYmplY3QgZm9yIGEgZ3JvdXAgb2YgaW5wdXQgb2JqZWN0cyAoaW1hZ2VzLCB2ZWN0b3JzLCBldGMuKS4KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiBuT2JqZWN0cyAgLSBudW1iZXIgb2Ygc291cmNlIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgIGlucHV0ICAgICAtIHBvaW50ZXIgZWl0aGVyIHRvIGFycmF5IG9mIGlucHV0IG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHJlYWQgY2FsbGJhY2sgZnVuY3Rpb24gKGRlcGVuZGluZyBvbiBpb0ZsYWdzKQorLy8gICAgICAgICAgICAgICAgb3V0cHV0ICAgIC0gcG9pbnRlciBlaXRoZXIgdG8gb3V0cHV0IGVpZ2VuIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHdyaXRlIGNhbGxiYWNrIGZ1bmN0aW9uIChkZXBlbmRpbmcgb24gaW9GbGFncykKKy8vICAgICAgICAgICAgICAgIGlvRmxhZ3MgICAtIGlucHV0L291dHB1dCBmbGFncyAoc2VlIE5vdGVzKQorLy8gICAgICAgICAgICAgICAgaW9CdWZTaXplIC0gaW5wdXQvb3V0cHV0IGJ1ZmZlciBzaXplCisvLyAgICAgICAgICAgICAgICB1c2VyRGF0YSAgLSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIG5lY2Vzc2FyeQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucworLy8gICAgICAgICAgICAgICAgY2FsY0xpbWl0IC0gZGV0ZXJtaW5lcyB0aGUgY2FsY3VsYXRpb24gZmluaXNoIGNvbmRpdGlvbnMKKy8vICAgICAgICAgICAgICAgIGF2ZyAgICAgICAtIGF2ZXJhZ2VkIG9iamVjdCAoaGFzIHRoZSBzYW1lIHNpemUgYXMgUk9JKQorLy8gICAgICAgICAgICAgICAgZWlnVmFscyAgIC0gcG9pbnRlciB0byBjb3JyZXNwb25kaW5nIGVpZ2VuIHZhbHVlcyAoYXJyYXkgb2YgPG5PYmplY3RzPgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgaW4gZGVzY2VuZGluZyBvcmRlcikKKy8vCisvLyAgICBOb3RlczogMS4gaW5wdXQvb3V0cHV0IGRhdGEgKHRoYXQgaXMsIGlucHV0IG9iamVjdHMgYW5kIGVpZ2VuIG9uZXMpIG1heSBlaXRoZXIKKy8vICAgICAgICAgICAgICBiZSBhbGxvY2F0ZWQgaW4gdGhlIFJBTSBvciBiZSByZWFkIGZyb20vd3JpdHRlbiB0byB0aGUgSEREIChvciBhbnkKKy8vICAgICAgICAgICAgICBvdGhlciBkZXZpY2UpIGJ5IHJlYWQvd3JpdGUgY2FsbGJhY2sgZnVuY3Rpb25zLiBJdCBkZXBlbmRzIG9uIHRoZQorLy8gICAgICAgICAgICAgIHZhbHVlIG9mIGlvRmxhZ3MgcGFyYW1hdGVyLCB3aGljaCBtYXkgYmUgdGhlIGZvbGxvd2luZzoKKy8vICAgICAgICAgICAgICAgICAgQ1ZfRUlHT0JKX05PX0NBTExCQUNLLCBvciAwOworLy8gICAgICAgICAgICAgICAgICBDVl9FSUdPQkpfSU5QVVRfQ0FMTEJBQ0s7CisvLyAgICAgICAgICAgICAgICAgIENWX0VJR09CSl9PVVRQVVRfQ0FMTEJBQ0s7CisvLyAgICAgICAgICAgICAgICAgIENWX0VJR09CSl9CT1RIX0NBTExCQUNLLCBvcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLIHwgQ1ZfRUlHT0JKX09VVFBVVF9DQUxMQkFDSy4KKy8vICAgICAgICAgICAgICBUaGUgY2FsbGJhY2sgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlIHVzZXIgZGF0YSBzdHJ1Y3R1cmUgbXVzdCBiZQorLy8gICAgICAgICAgICAgIGRldmVsb3BlZCBieSB0aGUgdXNlci4KKy8vCisvLyAgICAgICAgICAgMi4gSWYgaW9CdWZTaXplID0gMCwgb3IgaXQncyB0b28gbGFyZ2UsIHRoZSBmdW5jdGlvbiBkZXJtaW5lcyBidWZmZXIgc2l6ZQorLy8gICAgICAgICAgICAgIGl0c2VsZi4KKy8vCisvLyAgICAgICAgICAgMy4gRGVwZW5kaW5nIG9uIGNhbGNMaW1pdCBwYXJhbWV0ZXIsIGNhbGN1bGF0aW9ucyBhcmUgZmluaXNoZWQgZWl0aGVyIGlmCisvLyAgICAgICAgICAgICAgZWlnZW5mYWNlcyBudW1iZXIgY29tZXMgdXAgdG8gY2VydGFpbiB2YWx1ZSBvciB0aGUgcmVsYXRpb24gb2YgdGhlCisvLyAgICAgICAgICAgICAgY3VycmVudCBlaWdlbnZhbHVlIGFuZCB0aGUgbGFyZ2VzdCBvbmUgY29tZXMgZG93biB0byBjZXJ0YWluIHZhbHVlCisvLyAgICAgICAgICAgICAgKG9yIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyB0YWtlcyBwbGFjZSkuIFRoZSBjYWxjTGltaXQtPnR5cGUgdmFsdWUKKy8vICAgICAgICAgICAgICBtdXN0IGJlIENWX1RFUk1DUklUX05VTUIsIENWX1RFUk1DUklUX0VQUyBvcgorLy8gICAgICAgICAgICAgIENWX1RFUk1DUklUX05VTUIgfCBDVl9URVJNQ1JJVF9FUFMuIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWFsCisvLyAgICAgICAgICAgICAgdmFsdWVzIGNhbGNMaW1pdC0+bWF4X2l0ZXIgYW5kIGNhbGNMaW1pdC0+ZXBzaWxvbi4KKy8vCisvLyAgICAgICAgICAgNC4gZWlnVmFscyBtYXkgYmUgZXF1YWwgdG8gTlVMTCAoaWYgeW91IGRvbid0IG5lZWQgZWlnZW4gdmFsdWVzIGluIGZ1cnRoZXIpLgorLy8KKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2Q2FsY0VpZ2VuT2JqZWN0cyggaW50ICAgICAgIG5PYmplY3RzLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBpb0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgaW9CdWZTaXplLAorICAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgIEN2VGVybUNyaXRlcmlhKiBjYWxjTGltaXQsCisgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiBhdmcsIAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgZWlnVmFscyApCit7CisgICAgZmxvYXQgKmF2Z19kYXRhOworICAgIGludCBhdmdfc3RlcCA9IDA7CisgICAgQ3ZTaXplIGF2Z19zaXplOworICAgIGludCBpOworICAgIGludCBuRWlnZW5zID0gbk9iamVjdHMgLSAxOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNhbGNFaWdlbk9iamVjdHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggYXZnLCAodWNoYXIgKiopICYgYXZnX2RhdGEsICZhdmdfc3RlcCwgJmF2Z19zaXplICk7CisgICAgaWYoIGF2Zy0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBhdmctPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggbkVpZ2VucyA+IGNhbGNMaW1pdC0+bWF4X2l0ZXIgJiYgY2FsY0xpbWl0LT50eXBlICE9IENWX1RFUk1DUklUX0VQUyApCisgICAgICAgIG5FaWdlbnMgPSBjYWxjTGltaXQtPm1heF9pdGVyOworCisgICAgc3dpdGNoIChpb0ZsYWdzKQorICAgIHsKKyAgICBjYXNlIENWX0VJR09CSl9OT19DQUxMQkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgSXBsSW1hZ2UgKipvYmplY3RzID0gKElwbEltYWdlICoqKSAoKChDdklucHV0ICopICYgaW5wdXQpLT5kYXRhKTsKKyAgICAgICAgICAgIElwbEltYWdlICoqZWlnZW5zID0gKElwbEltYWdlICoqKSAoKChDdklucHV0ICopICYgb3V0cHV0KS0+ZGF0YSk7CisgICAgICAgICAgICB1Y2hhciAqKm9ianMgPSAodWNoYXIgKiopIGN2QWxsb2MoIHNpemVvZiggdWNoYXIgKiApICogbk9iamVjdHMgKTsKKyAgICAgICAgICAgIGZsb2F0ICoqZWlncyA9IChmbG9hdCAqKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCAqICkgKiBuRWlnZW5zICk7CisgICAgICAgICAgICBpbnQgb2JqX3N0ZXAgPSAwLCBvbGRfc3RlcCA9IDA7CisgICAgICAgICAgICBpbnQgZWlnX3N0ZXAgPSAwLCBvbGRlaWdfc3RlcCA9IDA7CisgICAgICAgICAgICBDdlNpemUgb2JqX3NpemUgPSBhdmdfc2l6ZSwgb2xkX3NpemUgPSBhdmdfc2l6ZSwKKworICAgICAgICAgICAgICAgIGVpZ19zaXplID0gYXZnX3NpemUsIG9sZGVpZ19zaXplID0gYXZnX3NpemU7CisKKyAgICAgICAgICAgIGlmKCBvYmplY3RzID09IE5VTEwgfHwgZWlnZW5zID09IE5VTEwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnN1ZmZpY2llbnQgbWVtb3J5IiApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbk9iamVjdHM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKmltZyA9IG9iamVjdHNbaV07CisgICAgICAgICAgICAgICAgdWNoYXIgKm9ial9kYXRhOworCisgICAgICAgICAgICAgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIGltZywgJm9ial9kYXRhLCAmb2JqX3N0ZXAsICZvYmpfc2l6ZSApOworICAgICAgICAgICAgICAgIGlmKCBpbWctPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBvYmpfc2l6ZSAhPSBhdmdfc2l6ZSB8fCBvYmpfc2l6ZSAhPSBvbGRfc2l6ZSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc2l6ZXMgb2Ygb2JqZWN0cyIgKTsKKyAgICAgICAgICAgICAgICBpZiggaW1nLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBpID4gMCAmJiBvYmpfc3RlcCAhPSBvbGRfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc3RlcHMgb2Ygb2JqZWN0cyIgKTsKKworICAgICAgICAgICAgICAgIG9sZF9zdGVwID0gb2JqX3N0ZXA7CisgICAgICAgICAgICAgICAgb2xkX3NpemUgPSBvYmpfc2l6ZTsKKyAgICAgICAgICAgICAgICBvYmpzW2ldID0gb2JqX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbkVpZ2VuczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJcGxJbWFnZSAqZWlnID0gZWlnZW5zW2ldOworICAgICAgICAgICAgICAgIGZsb2F0ICplaWdfZGF0YTsKKworICAgICAgICAgICAgICAgIGN2R2V0SW1hZ2VSYXdEYXRhKCBlaWcsICh1Y2hhciAqKikgJiBlaWdfZGF0YSwgJmVpZ19zdGVwLCAmZWlnX3NpemUgKTsKKyAgICAgICAgICAgICAgICBpZiggZWlnLT5kZXB0aCAhPSBJUExfREVQVEhfMzJGICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgICAgICAgICAgICAgaWYoIGVpZ19zaXplICE9IGF2Z19zaXplIHx8IGVpZ19zaXplICE9IG9sZGVpZ19zaXplICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkRpZmZlcmVudCBzaXplcyBvZiBvYmplY3RzIiApOworICAgICAgICAgICAgICAgIGlmKCBlaWctPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgICAgICAgICAgICAgaWYoIGkgPiAwICYmIGVpZ19zdGVwICE9IG9sZGVpZ19zdGVwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkRpZmZlcmVudCBzdGVwcyBvZiBvYmplY3RzIiApOworCisgICAgICAgICAgICAgICAgb2xkZWlnX3N0ZXAgPSBlaWdfc3RlcDsKKyAgICAgICAgICAgICAgICBvbGRlaWdfc2l6ZSA9IGVpZ19zaXplOworICAgICAgICAgICAgICAgIGVpZ3NbaV0gPSBlaWdfZGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENWX0NBTEwoIGljdkNhbGNFaWdlbk9iamVjdHNfOHUzMmZSKCBuT2JqZWN0cywgKHZvaWQqKSBvYmpzLCBvYmpfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCopIGVpZ3MsIGVpZ19zdGVwLCBvYmpfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0ZsYWdzLCBpb0J1ZlNpemUsIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNMaW1pdCwgYXZnX2RhdGEsIGF2Z19zdGVwLCBlaWdWYWxzICkpOworICAgICAgICAgICAgY3ZGcmVlKCAmb2JqcyApOworICAgICAgICAgICAgY3ZGcmVlKCAmZWlncyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgQ1ZfRUlHT0JKX09VVFBVVF9DQUxMQkFDSzoKKyAgICAgICAgeworICAgICAgICAgICAgSXBsSW1hZ2UgKipvYmplY3RzID0gKElwbEltYWdlICoqKSAoKChDdklucHV0ICopICYgaW5wdXQpLT5kYXRhKTsKKyAgICAgICAgICAgIHVjaGFyICoqb2JqcyA9ICh1Y2hhciAqKikgY3ZBbGxvYyggc2l6ZW9mKCB1Y2hhciAqICkgKiBuT2JqZWN0cyApOworICAgICAgICAgICAgaW50IG9ial9zdGVwID0gMCwgb2xkX3N0ZXAgPSAwOworICAgICAgICAgICAgQ3ZTaXplIG9ial9zaXplID0gYXZnX3NpemUsIG9sZF9zaXplID0gYXZnX3NpemU7CisKKyAgICAgICAgICAgIGlmKCBvYmplY3RzID09IE5VTEwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnN1ZmZpY2llbnQgbWVtb3J5IiApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbk9iamVjdHM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKmltZyA9IG9iamVjdHNbaV07CisgICAgICAgICAgICAgICAgdWNoYXIgKm9ial9kYXRhOworCisgICAgICAgICAgICAgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIGltZywgJm9ial9kYXRhLCAmb2JqX3N0ZXAsICZvYmpfc2l6ZSApOworICAgICAgICAgICAgICAgIGlmKCBpbWctPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBvYmpfc2l6ZSAhPSBhdmdfc2l6ZSB8fCBvYmpfc2l6ZSAhPSBvbGRfc2l6ZSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc2l6ZXMgb2Ygb2JqZWN0cyIgKTsKKyAgICAgICAgICAgICAgICBpZiggaW1nLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBpID4gMCAmJiBvYmpfc3RlcCAhPSBvbGRfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc3RlcHMgb2Ygb2JqZWN0cyIgKTsKKworICAgICAgICAgICAgICAgIG9sZF9zdGVwID0gb2JqX3N0ZXA7CisgICAgICAgICAgICAgICAgb2xkX3NpemUgPSBvYmpfc2l6ZTsKKyAgICAgICAgICAgICAgICBvYmpzW2ldID0gb2JqX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDVl9DQUxMKCBpY3ZDYWxjRWlnZW5PYmplY3RzXzh1MzJmUiggbk9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQqKSBvYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmpfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlnVmFscyAgICkpOworICAgICAgICAgICAgY3ZGcmVlKCAmb2JqcyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIGNhc2UgQ1ZfRUlHT0JKX0lOUFVUX0NBTExCQUNLOgorICAgICAgICB7CisgICAgICAgICAgICBJcGxJbWFnZSAqKmVpZ2VucyA9IChJcGxJbWFnZSAqKikgKCgoQ3ZJbnB1dCAqKSAmIG91dHB1dCktPmRhdGEpOworICAgICAgICAgICAgZmxvYXQgKiplaWdzID0gKGZsb2F0KiopIGN2QWxsb2MoIHNpemVvZiggZmxvYXQqICkgKiBuRWlnZW5zICk7CisgICAgICAgICAgICBpbnQgZWlnX3N0ZXAgPSAwLCBvbGRlaWdfc3RlcCA9IDA7CisgICAgICAgICAgICBDdlNpemUgZWlnX3NpemUgPSBhdmdfc2l6ZSwgb2xkZWlnX3NpemUgPSBhdmdfc2l6ZTsKKworICAgICAgICAgICAgaWYoIGVpZ2VucyA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5zdWZmaWNpZW50IG1lbW9yeSIgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5FaWdlbnM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKmVpZyA9IGVpZ2Vuc1tpXTsKKyAgICAgICAgICAgICAgICBmbG9hdCAqZWlnX2RhdGE7CisKKyAgICAgICAgICAgICAgICBjdkdldEltYWdlUmF3RGF0YSggZWlnLCAodWNoYXIgKiopICYgZWlnX2RhdGEsICZlaWdfc3RlcCwgJmVpZ19zaXplICk7CisgICAgICAgICAgICAgICAgaWYoIGVpZy0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBlaWdfc2l6ZSAhPSBhdmdfc2l6ZSB8fCBlaWdfc2l6ZSAhPSBvbGRlaWdfc2l6ZSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc2l6ZXMgb2Ygb2JqZWN0cyIgKTsKKyAgICAgICAgICAgICAgICBpZiggZWlnLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgICAgIGlmKCBpID4gMCAmJiBlaWdfc3RlcCAhPSBvbGRlaWdfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc3RlcHMgb2Ygb2JqZWN0cyIgKTsKKworICAgICAgICAgICAgICAgIG9sZGVpZ19zdGVwID0gZWlnX3N0ZXA7CisgICAgICAgICAgICAgICAgb2xkZWlnX3NpemUgPSBlaWdfc2l6ZTsKKyAgICAgICAgICAgICAgICBlaWdzW2ldID0gZWlnX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDVl9DQUxMKCBpY3ZDYWxjRWlnZW5PYmplY3RzXzh1MzJmUiggbk9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAgLyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgZWlncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpb0ZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlnVmFscyAgICkpOworICAgICAgICAgICAgY3ZGcmVlKCAmZWlncyApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIENWX0VJR09CSl9JTlBVVF9DQUxMQkFDSyB8IENWX0VJR09CSl9PVVRQVVRfQ0FMTEJBQ0s6CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2Q2FsY0VpZ2VuT2JqZWN0c184dTMyZlIoIG5PYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCAvIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvQnVmU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsY0xpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZ1ZhbHMgICApKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5zdXBwb3J0ZWQgaS9vIGZsYWciICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2Q2FsY0RlY29tcENvZWZmCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBvbmUgZGVjb21wb3NpdGlvbiBjb2VmZmljaWVudCBvZiBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgIHVzaW5nIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBlaWdlbiBvYmplY3QgYW5kIHRoZSBtZWFuIChhdmVyYWdlZCkgb2JqZWN0CisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG9iaiAgICAgLSBpbnB1dCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBlaWdPYmogIC0gZWlnZW4gb2JqZWN0CisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAtIGF2ZXJhZ2VkIG9iamVjdAorLy8KKy8vICAgIFJldHVybnM6IGRlY29tcG9zaXRpb24gY29lZmZpY2llbnQgdmFsdWUgb3IgbGFyZ2UgbmVnYXRpdmUgdmFsdWUgKGlmIGVycm9yKQorLy8KKy8vICAgIE5vdGVzOgorLy9GKi8KKworQ1ZfSU1QTCBkb3VibGUKK2N2Q2FsY0RlY29tcENvZWZmKCBJcGxJbWFnZSAqIG9iaiwgSXBsSW1hZ2UgKiBlaWdPYmosIElwbEltYWdlICogYXZnICkKK3sKKyAgICBkb3VibGUgY29lZmYgPSBEQkxfTUFYOworCisgICAgdWNoYXIgKm9ial9kYXRhOworICAgIGZsb2F0ICplaWdfZGF0YTsKKyAgICBmbG9hdCAqYXZnX2RhdGE7CisgICAgaW50IG9ial9zdGVwID0gMCwgZWlnX3N0ZXAgPSAwLCBhdmdfc3RlcCA9IDA7CisgICAgQ3ZTaXplIG9ial9zaXplLCBlaWdfc2l6ZSwgYXZnX3NpemU7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FsY0RlY29tcENvZWZmIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIG9iaiwgJm9ial9kYXRhLCAmb2JqX3N0ZXAsICZvYmpfc2l6ZSApOworICAgIGlmKCBvYmotPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBvYmotPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggZWlnT2JqLCAodWNoYXIgKiopICYgZWlnX2RhdGEsICZlaWdfc3RlcCwgJmVpZ19zaXplICk7CisgICAgaWYoIGVpZ09iai0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBlaWdPYmotPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggYXZnLCAodWNoYXIgKiopICYgYXZnX2RhdGEsICZhdmdfc3RlcCwgJmF2Z19zaXplICk7CisgICAgaWYoIGF2Zy0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBhdmctPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggb2JqX3NpemUgIT0gZWlnX3NpemUgfHwgb2JqX3NpemUgIT0gYXZnX3NpemUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZGlmZmVyZW50IHNpemVzIG9mIGltYWdlcyIgKTsKKworICAgIGNvZWZmID0gaWN2Q2FsY0RlY29tcENvZWZmXzh1MzJmUiggb2JqX2RhdGEsIG9ial9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlnX2RhdGEsIGVpZ19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsIGF2Z19zdGVwLCBvYmpfc2l6ZSApOworCisgICAgX19FTkRfXzsKKyAgICAKKyAgICByZXR1cm4gY29lZmY7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lczogY3ZFaWdlbkRlY29tcG9zaXRlCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBhbGwgZGVjb21wb3NpdGlvbiBjb2VmZmljaWVudHMgZm9yIGlucHV0IG9iamVjdAorLy8gICAgICAgICAgICAgdXNpbmcgcHJldmlvdXNseSBjYWxjdWxhdGVkIGVpZ2VuIG9iamVjdHMgYmFzaXMgYW5kIHRoZSBtZWFuIChhdmVyYWdlZCkKKy8vICAgICAgICAgICAgIG9iamVjdAorLy8KKy8vICAgIFBhcmFtZXRlcnM6ICBvYmogICAgICAgICAtIGlucHV0IG9iamVjdAorLy8gICAgICAgICAgICAgICAgIG5FaWdPYmpzICAgIC0gbnVtYmVyIG9mIGVpZ2VuIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICBlaWdJbnB1dCAgICAtIHBvaW50ZXIgZWl0aGVyIHRvIGFycmF5IG9mIHBvaW50ZXJzIHRvIGVpZ2VuIG9iamVjdHMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIHRvIHJlYWQgY2FsbGJhY2sgZnVuY3Rpb24gKGRlcGVuZGluZyBvbiBpb0ZsYWdzKQorLy8gICAgICAgICAgICAgICAgIGlvRmxhZ3MgICAgIC0gaW5wdXQvb3V0cHV0IGZsYWdzCisvLyAgICAgICAgICAgICAgICAgdXNlckRhdGEgICAgLSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMgYWxsIG5lY2Vzc2FyeQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAgICAgLSBhdmVyYWdlZCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBjb2VmZnMgICAgICAtIGNhbGN1bGF0ZWQgY29lZmZpY2llbnRzIChvdXRwdXQgZGF0YSkKKy8vCisvLyAgICBOb3RlczogICBzZWUgbm90ZXMgZm9yIGN2Q2FsY0VpZ2VuT2JqZWN0cyBmdW5jdGlvbgorLy9GKi8KKworQ1ZfSU1QTCB2b2lkCitjdkVpZ2VuRGVjb21wb3NpdGUoIElwbEltYWdlKiBvYmosCisgICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuRWlnT2JqcywKKyAgICAgICAgICAgICAgICAgICAgdm9pZCogICAgIGVpZ0lucHV0LAorICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgaW9GbGFncywgCisgICAgICAgICAgICAgICAgICAgIHZvaWQqICAgICB1c2VyRGF0YSwgCisgICAgICAgICAgICAgICAgICAgIElwbEltYWdlKiBhdmcsIAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogICAgY29lZmZzICkKK3sKKyAgICBmbG9hdCAqYXZnX2RhdGE7CisgICAgdWNoYXIgKm9ial9kYXRhOworICAgIGludCBhdmdfc3RlcCA9IDAsIG9ial9zdGVwID0gMDsKKyAgICBDdlNpemUgYXZnX3NpemUsIG9ial9zaXplOworICAgIGludCBpOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkVpZ2VuRGVjb21wb3NpdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggYXZnLCAodWNoYXIgKiopICYgYXZnX2RhdGEsICZhdmdfc3RlcCwgJmF2Z19zaXplICk7CisgICAgaWYoIGF2Zy0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBhdmctPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggb2JqLCAmb2JqX2RhdGEsICZvYmpfc3RlcCwgJm9ial9zaXplICk7CisgICAgaWYoIG9iai0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisgICAgaWYoIG9iai0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgIGlmKCBvYmpfc2l6ZSAhPSBhdmdfc2l6ZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJEaWZmZXJlbnQgc2l6ZXMgb2Ygb2JqZWN0cyIgKTsKKworICAgIGlmKCBpb0ZsYWdzID09IENWX0VJR09CSl9OT19DQUxMQkFDSyApCisgICAgeworICAgICAgICBJcGxJbWFnZSAqKmVpZ2VucyA9IChJcGxJbWFnZSAqKikgKCgoQ3ZJbnB1dCAqKSAmIGVpZ0lucHV0KS0+ZGF0YSk7CisgICAgICAgIGZsb2F0ICoqZWlncyA9IChmbG9hdCAqKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCAqICkgKiBuRWlnT2JqcyApOworICAgICAgICBpbnQgZWlnX3N0ZXAgPSAwLCBvbGRfc3RlcCA9IDA7CisgICAgICAgIEN2U2l6ZSBlaWdfc2l6ZSA9IGF2Z19zaXplLCBvbGRfc2l6ZSA9IGF2Z19zaXplOworCisgICAgICAgIGlmKCBlaWdzID09IE5VTEwgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkluc3VmZmljaWVudCBtZW1vcnkiICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5FaWdPYmpzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBJcGxJbWFnZSAqZWlnID0gZWlnZW5zW2ldOworICAgICAgICAgICAgZmxvYXQgKmVpZ19kYXRhOworCisgICAgICAgICAgICBjdkdldEltYWdlUmF3RGF0YSggZWlnLCAodWNoYXIgKiopICYgZWlnX2RhdGEsICZlaWdfc3RlcCwgJmVpZ19zaXplICk7CisgICAgICAgICAgICBpZiggZWlnLT5kZXB0aCAhPSBJUExfREVQVEhfMzJGICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKyAgICAgICAgICAgIGlmKCBlaWdfc2l6ZSAhPSBhdmdfc2l6ZSB8fCBlaWdfc2l6ZSAhPSBvbGRfc2l6ZSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkRpZmZlcmVudCBzaXplcyBvZiBvYmplY3RzIiApOworICAgICAgICAgICAgaWYoIGVpZy0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgaWYoIGkgPiAwICYmIGVpZ19zdGVwICE9IG9sZF9zdGVwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiRGlmZmVyZW50IHN0ZXBzIG9mIG9iamVjdHMiICk7CisKKyAgICAgICAgICAgIG9sZF9zdGVwID0gZWlnX3N0ZXA7CisgICAgICAgICAgICBvbGRfc2l6ZSA9IGVpZ19zaXplOworICAgICAgICAgICAgZWlnc1tpXSA9IGVpZ19kYXRhOworICAgICAgICB9CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2RWlnZW5EZWNvbXBvc2l0ZV84dTMyZlIoIG9ial9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuRWlnT2JqcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgZWlncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVpZ19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzICAgKSk7CisgICAgICAgIGN2RnJlZSggJmVpZ3MgKTsKKyAgICB9CisKKyAgICBlbHNlCisKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGljdkVpZ2VuRGVjb21wb3NpdGVfOHUzMmZSKCBvYmpfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkVpZ09ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ial9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzICAgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGN2RWlnZW5Qcm9qZWN0aW9uCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyBvYmplY3QgcHJvamVjdGlvbiB0byB0aGUgZWlnZW4gc3ViLXNwYWNlIChyZXN0b3JlcworLy8gICAgICAgICAgICAgYW4gb2JqZWN0KSB1c2luZyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgZWlnZW4gb2JqZWN0cyBiYXNpcywgbWVhbiAoYXZlcmFnZWQpCisvLyAgICAgICAgICAgICBvYmplY3QgYW5kIGRlY29tcG9zaXRpb24gY29lZmZpY2llbnRzIG9mIHRoZSByZXN0b3JlZCBvYmplY3QKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgbkVpZ09ianMgICAgLSBudW1iZXIgb2YgZWlnZW4gb2JqZWN0cworLy8gICAgICAgICAgICAgICAgIGVpZ0lucHV0ICAgIC0gcG9pbnRlciBlaXRoZXIgdG8gYXJyYXkgb2YgcG9pbnRlcnMgdG8gZWlnZW4gb2JqZWN0cworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdG8gcmVhZCBjYWxsYmFjayBmdW5jdGlvbiAoZGVwZW5kaW5nIG9uIGlvRmxhZ3MpCisvLyAgICAgICAgICAgICAgICAgaW9GbGFncyAgICAgLSBpbnB1dC9vdXRwdXQgZmxhZ3MKKy8vICAgICAgICAgICAgICAgICB1c2VyRGF0YSAgICAtIHBvaW50ZXIgdG8gdGhlIHN0cnVjdHVyZSB3aGljaCBjb250YWlucyBhbGwgbmVjZXNzYXJ5CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KKy8vICAgICAgICAgICAgICAgICBjb2VmZnMgICAgICAtIGFycmF5IG9mIGRlY29tcG9zaXRpb24gY29lZmZpY2llbnRzCisvLyAgICAgICAgICAgICAgICAgYXZnICAgICAgICAgLSBhdmVyYWdlZCBvYmplY3QKKy8vICAgICAgICAgICAgICAgICBwcm9qICAgICAgICAtIG9iamVjdCBwcm9qZWN0aW9uIChvdXRwdXQgZGF0YSkKKy8vCisvLyAgICBOb3RlczogICBzZWUgbm90ZXMgZm9yIGN2Q2FsY0VpZ2VuT2JqZWN0cyBmdW5jdGlvbgorLy9GKi8KKworQ1ZfSU1QTCB2b2lkCitjdkVpZ2VuUHJvamVjdGlvbiggdm9pZCogICAgIGVpZ0lucHV0LAorICAgICAgICAgICAgICAgICAgIGludCAgICAgICBuRWlnT2JqcywKKyAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgaW9GbGFncywKKyAgICAgICAgICAgICAgICAgICB2b2lkKiAgICAgdXNlckRhdGEsCisgICAgICAgICAgICAgICAgICAgZmxvYXQqICAgIGNvZWZmcywgCisgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2UqIGF2ZywKKyAgICAgICAgICAgICAgICAgICBJcGxJbWFnZSogcHJvaiApCit7CisgICAgZmxvYXQgKmF2Z19kYXRhOworICAgIHVjaGFyICpwcm9qX2RhdGE7CisgICAgaW50IGF2Z19zdGVwID0gMCwgcHJval9zdGVwID0gMDsKKyAgICBDdlNpemUgYXZnX3NpemUsIHByb2pfc2l6ZTsKKyAgICBpbnQgaTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZFaWdlblByb2plY3Rpb24iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggYXZnLCAodWNoYXIgKiopICYgYXZnX2RhdGEsICZhdmdfc3RlcCwgJmF2Z19zaXplICk7CisgICAgaWYoIGF2Zy0+ZGVwdGggIT0gSVBMX0RFUFRIXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgIGlmKCBhdmctPm5DaGFubmVscyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBjdkdldEltYWdlUmF3RGF0YSggcHJvaiwgJnByb2pfZGF0YSwgJnByb2pfc3RlcCwgJnByb2pfc2l6ZSApOworICAgIGlmKCBwcm9qLT5kZXB0aCAhPSBJUExfREVQVEhfOFUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKyAgICBpZiggcHJvai0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgIGlmKCBwcm9qX3NpemUgIT0gYXZnX3NpemUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiRGlmZmVyZW50IHNpemVzIG9mIHByb2plY3RzIiApOworCisgICAgaWYoIGlvRmxhZ3MgPT0gQ1ZfRUlHT0JKX05PX0NBTExCQUNLICkKKyAgICB7CisgICAgICAgIElwbEltYWdlICoqZWlnZW5zID0gKElwbEltYWdlKiopICgoKEN2SW5wdXQgKikgJiBlaWdJbnB1dCktPmRhdGEpOworICAgICAgICBmbG9hdCAqKmVpZ3MgPSAoZmxvYXQqKikgY3ZBbGxvYyggc2l6ZW9mKCBmbG9hdCAqICkgKiBuRWlnT2JqcyApOworICAgICAgICBpbnQgZWlnX3N0ZXAgPSAwLCBvbGRfc3RlcCA9IDA7CisgICAgICAgIEN2U2l6ZSBlaWdfc2l6ZSA9IGF2Z19zaXplLCBvbGRfc2l6ZSA9IGF2Z19zaXplOworCisgICAgICAgIGlmKCBlaWdzID09IE5VTEwgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkluc3VmZmljaWVudCBtZW1vcnkiICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5FaWdPYmpzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBJcGxJbWFnZSAqZWlnID0gZWlnZW5zW2ldOworICAgICAgICAgICAgZmxvYXQgKmVpZ19kYXRhOworCisgICAgICAgICAgICBjdkdldEltYWdlUmF3RGF0YSggZWlnLCAodWNoYXIgKiopICYgZWlnX2RhdGEsICZlaWdfc3RlcCwgJmVpZ19zaXplICk7CisgICAgICAgICAgICBpZiggZWlnLT5kZXB0aCAhPSBJUExfREVQVEhfMzJGICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKyAgICAgICAgICAgIGlmKCBlaWdfc2l6ZSAhPSBhdmdfc2l6ZSB8fCBlaWdfc2l6ZSAhPSBvbGRfc2l6ZSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkRpZmZlcmVudCBzaXplcyBvZiBvYmplY3RzIiApOworICAgICAgICAgICAgaWYoIGVpZy0+bkNoYW5uZWxzICE9IDEgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworICAgICAgICAgICAgaWYoIGkgPiAwICYmIGVpZ19zdGVwICE9IG9sZF9zdGVwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiRGlmZmVyZW50IHN0ZXBzIG9mIG9iamVjdHMiICk7CisKKyAgICAgICAgICAgIG9sZF9zdGVwID0gZWlnX3N0ZXA7CisgICAgICAgICAgICBvbGRfc2l6ZSA9IGVpZ19zaXplOworICAgICAgICAgICAgZWlnc1tpXSA9IGVpZ19kYXRhOworICAgICAgICB9CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2RWlnZW5Qcm9qZWN0aW9uXzh1MzJmUiggbkVpZ09ianMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKikgZWlncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWlnX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJval9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19zaXplICAgKSk7CisgICAgICAgIGN2RnJlZSggJmVpZ3MgKTsKKyAgICB9CisKKyAgICBlbHNlCisKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGljdkVpZ2VuUHJvamVjdGlvbl84dTMyZlIoIG5FaWdPYmpzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlaWdJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZnX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmdfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJval9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19zaXplICAgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZlcGlsaW5lcy5jcHAgYi9jdmF1eC9zcmMvY3ZlcGlsaW5lcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y5NmM3MgotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmVwaWxpbmVzLmNwcApAQCAtMCwwICsxLDM3MjIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlICJjdnR5cGVzLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJjdi5oIgorCisvKiBWYWxlcnkgTW9zeWFnaW4gKi8KKworI3VuZGVmIHF1YWQKKworI2RlZmluZSBFUFM2NEQgMWUtOQorCitpbnQgY3ZDb21wdXRlRXNzZW50aWFsTWF0cml4KCAgQ3ZNYXRyMzJmIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgdHJhbnNWZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmIGVzc01hdHIpOworCitpbnQgY3ZDb252ZXJ0RXNzZW50aWFsMkZ1bmRhbWVudGFsKCBDdk1hdHIzMmYgZXNzTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmIGZ1bmRNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgY2FtZXJhTWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiBjYW1lcmFNYXRyMik7CisKK2ludCBjdkNvbXB1dGVFcGlwb2xlc0Zyb21GdW5kTWF0cml4KEN2TWF0cjMyZiBmdW5kTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBlcGlwb2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBlcGlwb2xlMik7CisKK3ZvaWQgaWN2VGVzdFBvaW50KCBDdlBvaW50MkQ2NGQgdGVzdFBvaW50LAorICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCBsaW5lMSxDdlZlY3Q2NGQgbGluZTIsCisgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRkIGJhc2VQb2ludCwKKyAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCk7CisKKworCitpbnQgaWN2R2V0U3ltUG9pbnQzRCggIEN2UG9pbnQzRDY0ZCBwb2ludENvcm5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQgcG9pbnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZCBwb2ludDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkICpwb2ludFN5bTIpCit7CisgICAgZG91YmxlIGxlbjEsbGVuMjsKKyAgICBkb3VibGUgYWxwaGE7CisgICAgaWN2R2V0UGllY2VMZW5ndGgzRChwb2ludENvcm5lcixwb2ludDEsJmxlbjEpOworICAgIGlmKCBsZW4xIDwgRVBTNjREICkKKyAgICB7CisgICAgICAgIHJldHVybiBDVl9CQURBUkdfRVJSOworICAgIH0KKyAgICBpY3ZHZXRQaWVjZUxlbmd0aDNEKHBvaW50Q29ybmVyLHBvaW50MiwmbGVuMik7CisgICAgYWxwaGEgPSBsZW4yIC8gbGVuMTsKKworICAgIHBvaW50U3ltMi0+eCA9IHBvaW50Q29ybmVyLnggKyBhbHBoYSoocG9pbnQxLnggLSBwb2ludENvcm5lci54KTsKKyAgICBwb2ludFN5bTItPnkgPSBwb2ludENvcm5lci55ICsgYWxwaGEqKHBvaW50MS55IC0gcG9pbnRDb3JuZXIueSk7CisgICAgcG9pbnRTeW0yLT56ID0gcG9pbnRDb3JuZXIueiArIGFscGhhKihwb2ludDEueiAtIHBvaW50Q29ybmVyLnopOworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qICBhdXRob3IgVmFsZXJ5IE1vc3lhZ2luICovCisKKy8qIENvbXB1dGUgM0QgcG9pbnQgZm9yIHNjYW5saW5lIGFuZCBhbHBoYSBiZXR0YSAqLworaW50IGljdkNvbXB1dGUzRFBvaW50KCBkb3VibGUgYWxwaGEsZG91YmxlIGJldHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiBjb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkKiBwb2ludCkKK3sKKworICAgIGRvdWJsZSBwYXJ0WDsKKyAgICBkb3VibGUgcGFydFk7CisgICAgZG91YmxlIHBhcnRaOworICAgIGRvdWJsZSBwYXJ0QWxsOworICAgIGRvdWJsZSBpbnZQYXJ0QWxsOworCisgICAgZG91YmxlIGFscGhhYmV0dGEgPSBhbHBoYSpiZXR0YTsKKyAgICAKKyAgICBwYXJ0QWxsID0gYWxwaGEgLSBiZXR0YTsKKyAgICBpZiggZmFicyhwYXJ0QWxsKSA+IDAuMDAwMDEgICkgLyogYWxwaGEgbXVzdCBiZSA+IGJldHRhICovCisgICAgeworCisgICAgICAgIHBhcnRYICAgPSBjb2VmZnMtPlhjb2VmICAgICAgICArIGNvZWZmcy0+WGNvZWZBICphbHBoYSArCisgICAgICAgICAgICAgICAgICBjb2VmZnMtPlhjb2VmQipiZXR0YSArIGNvZWZmcy0+WGNvZWZBQiphbHBoYWJldHRhOworCisgICAgICAgIHBhcnRZICAgPSBjb2VmZnMtPlljb2VmICAgICAgICArIGNvZWZmcy0+WWNvZWZBICphbHBoYSArCisgICAgICAgICAgICAgICAgICBjb2VmZnMtPlljb2VmQipiZXR0YSArIGNvZWZmcy0+WWNvZWZBQiphbHBoYWJldHRhOworICAgICAgICAKKyAgICAgICAgcGFydFogICA9IGNvZWZmcy0+WmNvZWYgICAgICAgICsgY29lZmZzLT5aY29lZkEgKmFscGhhICsKKyAgICAgICAgICAgICAgICAgIGNvZWZmcy0+WmNvZWZCKmJldHRhICsgY29lZmZzLT5aY29lZkFCKmFscGhhYmV0dGE7CisKKyAgICAgICAgaW52UGFydEFsbCA9IDEuMCAvIHBhcnRBbGw7CisKKyAgICAgICAgcG9pbnQtPnggPSBwYXJ0WCAqIGludlBhcnRBbGw7CisgICAgICAgIHBvaW50LT55ID0gcGFydFkgKiBpbnZQYXJ0QWxsOworICAgICAgICBwb2ludC0+eiA9IHBhcnRaICogaW52UGFydEFsbDsKKyAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisgICAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogQ29tcHV0ZSByb3RhdGUgbWF0cml4IGFuZCB0cmFucyB2ZWN0b3IgZm9yIGNoYW5nZSBzeXN0ZW0gKi8KK2ludCBpY3ZDcmVhdGVDb252ZXJ0TWF0clZlY3QoIEN2TWF0cjY0ZCAgICAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgdHJhbnNWZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICB0cmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNvbnZSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNvbnZUcmFuc1ZlY3QpCit7CisgICAgZG91YmxlIGludlJvdE1hdHIyWzldOworICAgIGRvdWJsZSB0bXBWZWN0WzNdOworCisKKyAgICBpY3ZJbnZlcnRNYXRyaXhfNjRkKHJvdE1hdHIyLDMsaW52Um90TWF0cjIpOworICAgIC8qIFRlc3QgZm9yIGVycm9yICovCisKKyAgICBpY3ZNdWxNYXRyaXhfNjRkKCAgIHJvdE1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW52Um90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAzLDMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb252Um90TWF0cik7CisKKyAgICBpY3ZNdWxNYXRyaXhfNjRkKCAgIGNvbnZSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsMywgCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWZWN0KTsKKyAgICAKKyAgICBpY3ZTdWJWZWN0b3JfNjRkKHRyYW5zVmVjdDEsdG1wVmVjdCxjb252VHJhbnNWZWN0LDMpOworCisgICAgCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIENvbXB1dGUgcG9pbnQgY29vcmRpbmF0ZXMgaW4gb3RoZXIgc3lzdGVtICovCitpbnQgaWN2Q29udmVydFBvaW50U3lzdGVtKEN2UG9pbnQzRDY0ZCAgTTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkKiBNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICB0cmFuc1ZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgZG91YmxlIHRtcFZlY3RbM107CisKKyAgICBpY3ZNdWxNYXRyaXhfNjRkKCAgIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAzLDMsCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKikmTTIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLDMsIAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmVjdCk7CisKKyAgICBpY3ZBZGRWZWN0b3JfNjRkKHRtcFZlY3QsdHJhbnNWZWN0LChkb3VibGUqKU0xLDMpOworICAgIAorICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpY3ZDb21wdXRlQ29lZmZGb3JTdGVyZW9WMyggZG91YmxlIHF1YWQxWzRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDJbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICBudW1TY2FubGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIHJvdE1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgdHJhbnNWZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgcm90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICB0cmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlN0ZXJlb0xpbmVDb2VmZiogICAgc3RhcnRDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbmVlZFN3YXBDYW1lcmEpCit7CisgICAgLyogRm9yIGVhY2ggcGFpciAqLworICAgIC8qIEluIHRoaXMgZnVuY3Rpb24gd2UgbXVzdCBkZWZpbmUgcG9zaXRpb24gb2YgY2FtZXJhcyAqLworCisgICAgQ3ZQb2ludDJENjRkIHBvaW50MTsKKyAgICBDdlBvaW50MkQ2NGQgcG9pbnQyOworICAgIEN2UG9pbnQyRDY0ZCBwb2ludDM7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50NDsKKworICAgIGludCBjdXJyTGluZTsKKyAgICAqbmVlZFN3YXBDYW1lcmEgPSAwOworICAgIGZvciggY3VyckxpbmUgPSAwOyBjdXJyTGluZSA8IG51bVNjYW5saW5lczsgY3VyckxpbmUrKyApCisgICAgeworICAgICAgICAvKiBDb21wdXRlIHBvaW50cyAqLworICAgICAgICBkb3VibGUgYWxwaGEgPSAoKGRvdWJsZSljdXJyTGluZSkvKChkb3VibGUpKG51bVNjYW5saW5lcykpOyAvKiBtYXliZSAtIDEgKi8KKworICAgICAgICBwb2ludDEueCA9ICgxLjAgLSBhbHBoYSkgKiBxdWFkMVswXVswXSArIGFscGhhICogcXVhZDFbM11bMF07CisgICAgICAgIHBvaW50MS55ID0gKDEuMCAtIGFscGhhKSAqIHF1YWQxWzBdWzFdICsgYWxwaGEgKiBxdWFkMVszXVsxXTsKKworICAgICAgICBwb2ludDIueCA9ICgxLjAgLSBhbHBoYSkgKiBxdWFkMVsxXVswXSArIGFscGhhICogcXVhZDFbMl1bMF07CisgICAgICAgIHBvaW50Mi55ID0gKDEuMCAtIGFscGhhKSAqIHF1YWQxWzFdWzFdICsgYWxwaGEgKiBxdWFkMVsyXVsxXTsKKyAgICAgICAgCisgICAgICAgIHBvaW50My54ID0gKDEuMCAtIGFscGhhKSAqIHF1YWQyWzBdWzBdICsgYWxwaGEgKiBxdWFkMlszXVswXTsKKyAgICAgICAgcG9pbnQzLnkgPSAoMS4wIC0gYWxwaGEpICogcXVhZDJbMF1bMV0gKyBhbHBoYSAqIHF1YWQyWzNdWzFdOworCisgICAgICAgIHBvaW50NC54ID0gKDEuMCAtIGFscGhhKSAqIHF1YWQyWzFdWzBdICsgYWxwaGEgKiBxdWFkMlsyXVswXTsKKyAgICAgICAgcG9pbnQ0LnkgPSAoMS4wIC0gYWxwaGEpICogcXVhZDJbMV1bMV0gKyBhbHBoYSAqIHF1YWQyWzJdWzFdOworCisgICAgICAgIC8qIFdlIGNhbiBjb21wdXRlIGNvZWZmcyBmb3IgdGhpcyBsaW5lICovCisgICAgICAgIGljdkNvbUNvZWZmRm9yTGluZSggICAgcG9pbnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnRDb2VmZnNbY3VyckxpbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRTd2FwQ2FtZXJhKTsKKyAgICB9CisgICAgcmV0dXJuIENWX05PX0VSUjsgICAgCit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpY3ZDb21wdXRlQ29lZmZGb3JTdGVyZW9OZXcoICAgZG91YmxlIHF1YWQxWzRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBxdWFkMls0XVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgbnVtU2NhbmxpbmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiAgICBzdGFydENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG5lZWRTd2FwQ2FtZXJhKQoreworICAgIC8qIENvbnZlcnQgZGF0YSAqLworCisgICAgZG91YmxlIGNhbU1hdHIxXzY0ZFs5XTsKKyAgICBkb3VibGUgY2FtTWF0cjJfNjRkWzldOworICAgIAorICAgIGRvdWJsZSByb3RNYXRyMV82NGRbOV07CisgICAgZG91YmxlIHRyYW5zVmVjdDFfNjRkWzNdOworICAgIAorICAgIGRvdWJsZSByb3RNYXRyMl82NGRbOV07CisgICAgZG91YmxlIHRyYW5zVmVjdDJfNjRkWzNdOworCisgICAgaWN2Q3Z0XzMyZl82NGQoY2FtTWF0cjEsY2FtTWF0cjFfNjRkLDkpOworICAgIGljdkN2dF8zMmZfNjRkKGNhbU1hdHIyLGNhbU1hdHIyXzY0ZCw5KTsKKworICAgIGljdkN2dF8zMmZfNjRkKHJvdE1hdHIxLHJvdE1hdHIxXzY0ZCw5KTsKKyAgICBpY3ZDdnRfMzJmXzY0ZCh0cmFuc1ZlY3QxLHRyYW5zVmVjdDFfNjRkLDMpOworCisgICAgcm90TWF0cjJfNjRkWzBdID0gMTsKKyAgICByb3RNYXRyMl82NGRbMV0gPSAwOworICAgIHJvdE1hdHIyXzY0ZFsyXSA9IDA7CisgICAgcm90TWF0cjJfNjRkWzNdID0gMDsKKyAgICByb3RNYXRyMl82NGRbNF0gPSAxOworICAgIHJvdE1hdHIyXzY0ZFs1XSA9IDA7CisgICAgcm90TWF0cjJfNjRkWzZdID0gMDsKKyAgICByb3RNYXRyMl82NGRbN10gPSAwOworICAgIHJvdE1hdHIyXzY0ZFs4XSA9IDE7CisKKyAgICB0cmFuc1ZlY3QyXzY0ZFswXSA9IDA7CisgICAgdHJhbnNWZWN0Ml82NGRbMV0gPSAwOworICAgIHRyYW5zVmVjdDJfNjRkWzJdID0gMDsKKworICAgIGludCBzdGF0dXMgPSBpY3ZDb21wdXRlQ29lZmZGb3JTdGVyZW9WMyggcXVhZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNjYW5saW5lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHIxXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdDFfNjRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjJfNjRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90TWF0cjJfNjRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0Ml82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRTd2FwQ2FtZXJhKTsKKworCisgICAgcmV0dXJuIHN0YXR1czsKKworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitpbnQgaWN2Q29tcHV0ZUNvZWZmRm9yU3RlcmVvKCAgQ3ZTdGVyZW9DYW1lcmEqIHN0ZXJlb0NhbWVyYSkKK3sKKyAgICBkb3VibGUgcXVhZDFbNF1bMl07CisgICAgZG91YmxlIHF1YWQyWzRdWzJdOworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgeworICAgICAgICBxdWFkMVtpXVswXSA9IHN0ZXJlb0NhbWVyYS0+cXVhZFswXVtpXS54OworICAgICAgICBxdWFkMVtpXVsxXSA9IHN0ZXJlb0NhbWVyYS0+cXVhZFswXVtpXS55OworCisgICAgICAgIHF1YWQyW2ldWzBdID0gc3RlcmVvQ2FtZXJhLT5xdWFkWzFdW2ldLng7CisgICAgICAgIHF1YWQyW2ldWzFdID0gc3RlcmVvQ2FtZXJhLT5xdWFkWzFdW2ldLnk7CisgICAgfQorCisgICAgaWN2Q29tcHV0ZUNvZWZmRm9yU3RlcmVvTmV3KCAgICAgICAgcXVhZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhZDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ2FtZXJhLT53YXJwU2l6ZS5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMF0tPm1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9DYW1lcmEtPnJvdE1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9DYW1lcmEtPnRyYW5zVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb0NhbWVyYS0+Y2FtZXJhWzFdLT5tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ2FtZXJhLT5saW5lQ29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RlcmVvQ2FtZXJhLT5uZWVkU3dhcENhbWVyYXMpKTsKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK2ludCBpY3ZDb21Db2VmZkZvckxpbmUoICAgQ3ZQb2ludDJENjRkIHBvaW50MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQgcG9pbnQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCBwb2ludDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRkIHBvaW50NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgY2FtTWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIHJvdE1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICB0cmFuc1ZlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgcm90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgIHRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGVyZW9MaW5lQ29lZmYqIGNvZWZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG5lZWRTd2FwQ2FtZXJhKQoreworICAgIC8qIEdldCBkaXJlY3Rpb24gZm9yIGFsbCBwb2ludHMgKi8KKyAgICAvKiBEaXJlY3Rpb24gZm9yIGNhbWVyYSAxICovCisgICAgCisgICAgZG91YmxlIGRpcmVjdDFbM107CisgICAgZG91YmxlIGRpcmVjdDJbM107CisgICAgZG91YmxlIGNhbVBvaW50MVszXTsKKyAgICAKKyAgICBkb3VibGUgZGlyZWN0UzNbM107CisgICAgZG91YmxlIGRpcmVjdFM0WzNdOworICAgIGRvdWJsZSBkaXJlY3QzWzNdOworICAgIGRvdWJsZSBkaXJlY3Q0WzNdOworICAgIGRvdWJsZSBjYW1Qb2ludDJbM107CisgICAgCisgICAgaWN2R2V0RGlyZWN0aW9uRm9yUG9pbnQoICAgcG9pbnQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdlBvaW50M0Q2NGQqKWRpcmVjdDEpOworICAgIAorICAgIGljdkdldERpcmVjdGlvbkZvclBvaW50KCAgIHBvaW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3ZQb2ludDNENjRkKilkaXJlY3QyKTsKKworICAgIC8qIERpcmVjdGlvbiBmb3IgY2FtZXJhIDIgKi8KKworICAgIGljdkdldERpcmVjdGlvbkZvclBvaW50KCAgIHBvaW50MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3ZQb2ludDNENjRkKilkaXJlY3RTMyk7CisgICAgCisgICAgaWN2R2V0RGlyZWN0aW9uRm9yUG9pbnQoICAgcG9pbnQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdlBvaW50M0Q2NGQqKWRpcmVjdFM0KTsKKworICAgIC8qIENyZWF0ZSBjb252ZXJ0aW9uIGZvciBjYW1lcmEgMjogdHdvIGRpcmVjdGlvbiBhbmQgY2FtZXJhIHBvaW50ICovCisgICAgCisgICAgZG91YmxlIGNvbnZSb3RNYXRyWzldOworICAgIGRvdWJsZSBjb252VHJhbnNWZWN0WzNdOworCisgICAgaWN2Q3JlYXRlQ29udmVydE1hdHJWZWN0KCAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZUcmFuc1ZlY3QpOworCisgICAgZG91YmxlIHplcm9WZWN0WzNdOworICAgIHplcm9WZWN0WzBdID0gemVyb1ZlY3RbMV0gPSB6ZXJvVmVjdFsyXSA9IDAuMDsKKyAgICBjYW1Qb2ludDFbMF0gPSBjYW1Qb2ludDFbMV0gPSBjYW1Qb2ludDFbMl0gPSAwLjA7CisgICAgCisgICAgaWN2Q29udmVydFBvaW50U3lzdGVtKCooKEN2UG9pbnQzRDY0ZCopZGlyZWN0UzMpLChDdlBvaW50M0Q2NGQqKWRpcmVjdDMsY29udlJvdE1hdHIsY29udlRyYW5zVmVjdCk7CisgICAgaWN2Q29udmVydFBvaW50U3lzdGVtKCooKEN2UG9pbnQzRDY0ZCopZGlyZWN0UzQpLChDdlBvaW50M0Q2NGQqKWRpcmVjdDQsY29udlJvdE1hdHIsY29udlRyYW5zVmVjdCk7CisgICAgaWN2Q29udmVydFBvaW50U3lzdGVtKCooKEN2UG9pbnQzRDY0ZCopemVyb1ZlY3QpLChDdlBvaW50M0Q2NGQqKWNhbVBvaW50Mixjb252Um90TWF0cixjb252VHJhbnNWZWN0KTsKKworICAgIGRvdWJsZSBwb2ludEJbM107CisgICAgICAgIAorICAgIGludCBwb3N0eXBlID0gMDsKKyAgICAKKyAgICAvKiBDaGFuZ2VkIG9yZGVyICovCisgICAgLyogQ29tcHV0ZSBwb2ludCBCOiB4Qix5Qix6QiAqLworICAgIGljdkdldENyb3NzTGluZXMoKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDEpLCooKEN2UG9pbnQzRDY0ZCopZGlyZWN0MiksCisgICAgICAgICAgICAgICAgICAqKChDdlBvaW50M0Q2NGQqKWNhbVBvaW50MiksKigoQ3ZQb2ludDNENjRkKilkaXJlY3QzKSwKKyAgICAgICAgICAgICAgICAgIChDdlBvaW50M0Q2NGQqKXBvaW50Qik7CisKKyAgICBpZiggcG9pbnRCWzJdIDwgMCApLyogSWYgbmVnYXRpdmUgdXNlIG90aGVyIGxpbmVzIGZvciBjcm9zcyAqLworICAgIHsKKyAgICAgICAgcG9zdHlwZSA9IDE7CisgICAgICAgIGljdkdldENyb3NzTGluZXMoKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDEpLCooKEN2UG9pbnQzRDY0ZCopZGlyZWN0MSksCisgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDIpLCooKEN2UG9pbnQzRDY0ZCopZGlyZWN0NCksCisgICAgICAgICAgICAgICAgICAgICAgKEN2UG9pbnQzRDY0ZCopcG9pbnRCKTsKKyAgICB9CisKKyAgICBDdlBvaW50M0Q2NGQgcG9pbnROZXdBOworICAgIEN2UG9pbnQzRDY0ZCBwb2ludE5ld0M7CisKKyAgICBwb2ludE5ld0EueCA9IHBvaW50TmV3QS55ID0gcG9pbnROZXdBLnogPSAwOworICAgIHBvaW50TmV3Qy54ID0gcG9pbnROZXdDLnkgPSBwb2ludE5ld0MueiA9IDA7CisKKyAgICBpZiggcG9zdHlwZSA9PSAwICkKKyAgICB7CisgICAgICAgIGljdkdldFN5bVBvaW50M0QoICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEN2UG9pbnQzRDY0ZCopZGlyZWN0MSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKilwb2ludEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludE5ld0EpOworCisgICAgICAgIGljdkdldFN5bVBvaW50M0QoICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEN2UG9pbnQzRDY0ZCopZGlyZWN0NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKilwb2ludEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludE5ld0MpOworICAgIH0KKyAgICBlbHNlCisgICAgey8qIEluIHRoaXMgY2FzZSB3ZSBtdXN0IGNoYW5nZSBjYW1lcmFzICovCisgICAgICAgICpuZWVkU3dhcENhbWVyYSA9IDE7CisgICAgICAgIGljdkdldFN5bVBvaW50M0QoICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEN2UG9pbnQzRDY0ZCopZGlyZWN0MyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKilwb2ludEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludE5ld0EpOworCisgICAgICAgIGljdkdldFN5bVBvaW50M0QoICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEN2UG9pbnQzRDY0ZCopZGlyZWN0MiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKilwb2ludEIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludE5ld0MpOworICAgIH0KKworCisgICAgZG91YmxlIGdhbW1hOworICAgIAorICAgIGRvdWJsZSB4MSx5MSx6MTsKKworICAgIHgxID0gY2FtUG9pbnQxWzBdOworICAgIHkxID0gY2FtUG9pbnQxWzFdOworICAgIHoxID0gY2FtUG9pbnQxWzJdOworCisgICAgZG91YmxlIHhBLHlBLHpBOworICAgIGRvdWJsZSB4Qix5Qix6QjsKKyAgICBkb3VibGUgeEMseUMsekM7CisKKyAgICB4QSA9IHBvaW50TmV3QS54OworICAgIHlBID0gcG9pbnROZXdBLnk7CisgICAgekEgPSBwb2ludE5ld0EuejsKKworICAgIHhCID0gcG9pbnRCWzBdOworICAgIHlCID0gcG9pbnRCWzFdOworICAgIHpCID0gcG9pbnRCWzJdOworCisgICAgeEMgPSBwb2ludE5ld0MueDsKKyAgICB5QyA9IHBvaW50TmV3Qy55OworICAgIHpDID0gcG9pbnROZXdDLno7CisKKyAgICBkb3VibGUgbGVuMSxsZW4yOworICAgIGxlbjEgPSBzcXJ0KCAoeEEteEIpKih4QS14QikgKyAoeUEteUIpKih5QS15QikgKyAoekEtekIpKih6QS16QikgKTsKKyAgICBsZW4yID0gc3FydCggKHhCLXhDKSooeEIteEMpICsgKHlCLXlDKSooeUIteUMpICsgKHpCLXpDKSooekItekMpICk7CisgICAgZ2FtbWEgPSBsZW4yIC8gbGVuMTsKKworICAgIGljdkNvbXB1dGVTdGVyZW9MaW5lQ29lZmZzKCBwb2ludE5ld0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKEN2UG9pbnQzRDY0ZCopcG9pbnRCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKigoQ3ZQb2ludDNENjRkKiljYW1Qb2ludDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW1tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZmZzKTsKKyAgICAKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgaWN2R2V0RGlyZWN0aW9uRm9yUG9pbnQoICBDdlBvaW50MkQ2NGQgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCBjYW1NYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQqIGRpcmVjdCkKK3sKKyAgICAvKiAgKi8KKyAgICBkb3VibGUgaW52TWF0cls5XTsKKyAgICAKKyAgICAvKiBJbnZlcnQgbWF0cml4ICovCisKKyAgICBpY3ZJbnZlcnRNYXRyaXhfNjRkKGNhbU1hdHIsMyxpbnZNYXRyKTsKKyAgICAvKiBURVNUIEZPUiBFUlJPUlMgKi8KKworICAgIGRvdWJsZSB2ZWN0WzNdOworICAgIHZlY3RbMF0gPSBwb2ludC54OworICAgIHZlY3RbMV0gPSBwb2ludC55OworICAgIHZlY3RbMl0gPSAxOworCisgICAgLyogTXVsIG1hdHIgKi8KKyAgICBpY3ZNdWxNYXRyaXhfNjRkKCAgIGludk1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAzLDMsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgMSwzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUqKWRpcmVjdCk7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOyAgICAKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK2ludCBpY3ZHZXRDcm9zc0xpbmVzKEN2UG9pbnQzRDY0ZCBwb2ludDExLEN2UG9pbnQzRDY0ZCBwb2ludDEyLAorICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQgcG9pbnQyMSxDdlBvaW50M0Q2NGQgcG9pbnQyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkKiBtaWRQb2ludCkKK3sKKyAgICBkb3VibGUgeE0seU0sek07CisgICAgZG91YmxlIHhOLHlOLHpOOworCisgICAgZG91YmxlIHhBLHlBLHpBOworICAgIGRvdWJsZSB4Qix5Qix6QjsKKworICAgIGRvdWJsZSB4Qyx5Qyx6QzsKKyAgICBkb3VibGUgeEQseUQsekQ7CisKKyAgICB4QSA9IHBvaW50MTEueDsKKyAgICB5QSA9IHBvaW50MTEueTsKKyAgICB6QSA9IHBvaW50MTEuejsKKworICAgIHhCID0gcG9pbnQxMi54OworICAgIHlCID0gcG9pbnQxMi55OworICAgIHpCID0gcG9pbnQxMi56OworCisgICAgeEMgPSBwb2ludDIxLng7CisgICAgeUMgPSBwb2ludDIxLnk7CisgICAgekMgPSBwb2ludDIxLno7CisKKyAgICB4RCA9IHBvaW50MjIueDsKKyAgICB5RCA9IHBvaW50MjIueTsKKyAgICB6RCA9IHBvaW50MjIuejsKKworICAgIGRvdWJsZSBhMTEsYTEyLGEyMSxhMjI7CisgICAgZG91YmxlIGIxLGIyOworCisgICAgYTExID0gICh4Qi14QSkqKHhCLXhBKSsoeUIteUEpKih5Qi15QSkrKHpCLXpBKSooekItekEpOworICAgIGExMiA9IC0oeEQteEMpKih4Qi14QSktKHlELXlDKSooeUIteUEpLSh6RC16QykqKHpCLXpBKTsKKyAgICBhMjEgPSAgKHhCLXhBKSooeEQteEMpKyh5Qi15QSkqKHlELXlDKSsoekItekEpKih6RC16Qyk7CisgICAgYTIyID0gLSh4RC14QykqKHhELXhDKS0oeUQteUMpKih5RC15QyktKHpELXpDKSooekQtekMpOworICAgIGIxICA9IC0oICh4QS14QykqKHhCLXhBKSsoeUEteUMpKih5Qi15QSkrKHpBLXpDKSooekItekEpICk7CisgICAgYjIgID0gLSggKHhBLXhDKSooeEQteEMpKyh5QS15QykqKHlELXlDKSsoekEtekMpKih6RC16QykgKTsKKworICAgIGRvdWJsZSBkZWx0YTsKKyAgICBkb3VibGUgZGVsdGFBLGRlbHRhQjsKKyAgICBkb3VibGUgYWxwaGEsYmV0dGE7CisKKyAgICBkZWx0YSAgPSBhMTEqYTIyLWExMiphMjE7CisgICAgCisgICAgaWYoIGZhYnMoZGVsdGEpIDwgRVBTNjREICkKKyAgICB7CisgICAgICAgIC8qcmV0dXJuIEVSUk9SOyovCisgICAgfQorCisgICAgZGVsdGFBID0gYjEqYTIyLWIyKmExMjsKKyAgICBkZWx0YUIgPSBhMTEqYjItYjEqYTIxOworCisgICAgYWxwaGEgPSBkZWx0YUEgLyBkZWx0YTsKKyAgICBiZXR0YSA9IGRlbHRhQiAvIGRlbHRhOworCisgICAgeE0gPSB4QSthbHBoYSooeEIteEEpOworICAgIHlNID0geUErYWxwaGEqKHlCLXlBKTsKKyAgICB6TSA9IHpBK2FscGhhKih6Qi16QSk7CisKKyAgICB4TiA9IHhDK2JldHRhKih4RC14Qyk7CisgICAgeU4gPSB5QytiZXR0YSooeUQteUMpOworICAgIHpOID0gekMrYmV0dGEqKHpELXpDKTsKKworICAgIC8qIENvbXB1dGUgbWlkZGxlIHBvaW50ICovCisgICAgbWlkUG9pbnQtPnggPSAoeE0gKyB4TikgKiAwLjU7CisgICAgbWlkUG9pbnQtPnkgPSAoeU0gKyB5TikgKiAwLjU7CisgICAgbWlkUG9pbnQtPnogPSAoek0gKyB6TikgKiAwLjU7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworaW50IGljdkNvbXB1dGVTdGVyZW9MaW5lQ29lZmZzKCAgIEN2UG9pbnQzRDY0ZCBwb2ludEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQgcG9pbnRCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkIHBvaW50Q2FtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBnYW1tYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RlcmVvTGluZUNvZWZmKiAgICBjb2VmZnMpCit7CisgICAgZG91YmxlIHgxLHkxLHoxOworCisgICAgeDEgPSBwb2ludENhbTEueDsKKyAgICB5MSA9IHBvaW50Q2FtMS55OworICAgIHoxID0gcG9pbnRDYW0xLno7CisKKyAgICBkb3VibGUgeEEseUEsekE7CisgICAgZG91YmxlIHhCLHlCLHpCOworCisgICAgeEEgPSBwb2ludEEueDsKKyAgICB5QSA9IHBvaW50QS55OworICAgIHpBID0gcG9pbnRBLno7CisKKyAgICB4QiA9IHBvaW50Qi54OworICAgIHlCID0gcG9pbnRCLnk7CisgICAgekIgPSBwb2ludEIuejsKKworICAgIGlmKCBnYW1tYSA+IDAgKQorICAgIHsKKyAgICAgICAgY29lZmZzLT5YY29lZiAgID0gLXgxICsgeEE7CisgICAgICAgIGNvZWZmcy0+WGNvZWZBICA9ICB4QiArIHgxIC0geEE7CisgICAgICAgIGNvZWZmcy0+WGNvZWZCICA9IC14QSAtIGdhbW1hICogeDEgKyBnYW1tYSAqIHhBOworICAgICAgICBjb2VmZnMtPlhjb2VmQUIgPSAteEIgKyB4QSArIGdhbW1hICogeEIgLSBnYW1tYSAqIHhBOworCisgICAgICAgIGNvZWZmcy0+WWNvZWYgICA9IC15MSArIHlBOworICAgICAgICBjb2VmZnMtPlljb2VmQSAgPSAgeUIgKyB5MSAtIHlBOworICAgICAgICBjb2VmZnMtPlljb2VmQiAgPSAteUEgLSBnYW1tYSAqIHkxICsgZ2FtbWEgKiB5QTsKKyAgICAgICAgY29lZmZzLT5ZY29lZkFCID0gLXlCICsgeUEgKyBnYW1tYSAqIHlCIC0gZ2FtbWEgKiB5QTsKKworICAgICAgICBjb2VmZnMtPlpjb2VmICAgPSAtejEgKyB6QTsKKyAgICAgICAgY29lZmZzLT5aY29lZkEgID0gIHpCICsgejEgLSB6QTsKKyAgICAgICAgY29lZmZzLT5aY29lZkIgID0gLXpBIC0gZ2FtbWEgKiB6MSArIGdhbW1hICogekE7CisgICAgICAgIGNvZWZmcy0+WmNvZWZBQiA9IC16QiArIHpBICsgZ2FtbWEgKiB6QiAtIGdhbW1hICogekE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGdhbW1hID0gLSBnYW1tYTsKKyAgICAgICAgY29lZmZzLT5YY29lZiAgID0gLSggLXgxICsgeEEpOworICAgICAgICBjb2VmZnMtPlhjb2VmQiAgPSAtKCAgeEIgKyB4MSAtIHhBKTsKKyAgICAgICAgY29lZmZzLT5YY29lZkEgID0gLSggLXhBIC0gZ2FtbWEgKiB4MSArIGdhbW1hICogeEEpOworICAgICAgICBjb2VmZnMtPlhjb2VmQUIgPSAtKCAteEIgKyB4QSArIGdhbW1hICogeEIgLSBnYW1tYSAqIHhBKTsKKworICAgICAgICBjb2VmZnMtPlljb2VmICAgPSAtKCAteTEgKyB5QSk7CisgICAgICAgIGNvZWZmcy0+WWNvZWZCICA9IC0oICB5QiArIHkxIC0geUEpOworICAgICAgICBjb2VmZnMtPlljb2VmQSAgPSAtKCAteUEgLSBnYW1tYSAqIHkxICsgZ2FtbWEgKiB5QSk7CisgICAgICAgIGNvZWZmcy0+WWNvZWZBQiA9IC0oIC15QiArIHlBICsgZ2FtbWEgKiB5QiAtIGdhbW1hICogeUEpOworCisgICAgICAgIGNvZWZmcy0+WmNvZWYgICA9IC0oIC16MSArIHpBKTsKKyAgICAgICAgY29lZmZzLT5aY29lZkIgID0gLSggIHpCICsgejEgLSB6QSk7CisgICAgICAgIGNvZWZmcy0+WmNvZWZBICA9IC0oIC16QSAtIGdhbW1hICogejEgKyBnYW1tYSAqIHpBKTsKKyAgICAgICAgY29lZmZzLT5aY29lZkFCID0gLSggLXpCICsgekEgKyBnYW1tYSAqIHpCIC0gZ2FtbWEgKiB6QSk7CisgICAgfQorCisKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIFRoaXMgZnVuY3Rpb24gZ2V0IG1pbmltdW0gYW5nbGUgc3RhcnRlZCBhdCBwb2ludCB3aGljaCBjb250YWlucyByZWN0ICovCitpbnQgaWN2R2V0QW5nbGVMaW5lKCBDdlBvaW50MkQ2NGQgc3RhcnRQb2ludCwgQ3ZTaXplIGltYWdlU2l6ZSxDdlBvaW50MkQ2NGQgKnBvaW50MSxDdlBvaW50MkQ2NGQgKnBvaW50MikKK3sKKyAgICAvKiBHZXQgY3Jvc3NsaW5lcyB3aXRoIGltYWdlIGNvcm5lcnMgKi8KKworICAgIC8qIEZpbmQgZm91ciBsaW5lcyAqLworCisgICAgQ3ZQb2ludDJENjRkIHBhLHBiLHBjLHBkOworICAgIAorICAgIHBhLnggPSAwOworICAgIHBhLnkgPSAwOworCisgICAgcGIueCA9IGltYWdlU2l6ZS53aWR0aC0xOworICAgIHBiLnkgPSAwOworCisgICAgcGQueCA9IGltYWdlU2l6ZS53aWR0aC0xOworICAgIHBkLnkgPSBpbWFnZVNpemUuaGVpZ2h0LTE7CisKKyAgICBwYy54ID0gMDsKKyAgICBwYy55ID0gaW1hZ2VTaXplLmhlaWdodC0xOworICAgIAorICAgIC8qIFdlIGNhbiBjb21wdXRlIHBvaW50cyBmb3IgYW5nbGUgKi8KKyAgICAvKiBUZXN0IGZvciBwbGFjZSBzZWN0aW9uICovCisgICAgCisgICAgaWYoIHN0YXJ0UG9pbnQueCA8IDAgKQorICAgIHsvKiAxLDQsNyAqLworICAgICAgICBpZiggc3RhcnRQb2ludC55IDwgMCkKKyAgICAgICAgey8qIDEgKi8KKyAgICAgICAgICAgICpwb2ludDEgPSBwYjsKKyAgICAgICAgICAgICpwb2ludDIgPSBwYzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzdGFydFBvaW50LnkgPiBpbWFnZVNpemUuaGVpZ2h0LTEgKQorICAgICAgICB7LyogNyAqLworICAgICAgICAgICAgKnBvaW50MSA9IHBhOworICAgICAgICAgICAgKnBvaW50MiA9IHBkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgey8qIDQgKi8KKyAgICAgICAgICAgICpwb2ludDEgPSBwYTsKKyAgICAgICAgICAgICpwb2ludDIgPSBwYzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICggc3RhcnRQb2ludC54ID4gaW1hZ2VTaXplLndpZHRoLTEgKQorICAgIHsvKiAzLDYsOSAqLworICAgICAgICBpZiggc3RhcnRQb2ludC55IDwgMCApCisgICAgICAgIHsvKiAzICovCisgICAgICAgICAgICAqcG9pbnQxID0gcGE7CisgICAgICAgICAgICAqcG9pbnQyID0gcGQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHN0YXJ0UG9pbnQueSA+IGltYWdlU2l6ZS5oZWlnaHQtMSApCisgICAgICAgIHsvKiA5ICovCisgICAgICAgICAgICAqcG9pbnQxID0gcGI7CisgICAgICAgICAgICAqcG9pbnQyID0gcGM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7LyogNiAqLworICAgICAgICAgICAgKnBvaW50MSA9IHBiOworICAgICAgICAgICAgKnBvaW50MiA9IHBkOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7LyogMiw1LDggKi8KKyAgICAgICAgaWYoIHN0YXJ0UG9pbnQueSA8IDAgKQorICAgICAgICB7LyogMiAqLworICAgICAgICAgICAgaWYoIHN0YXJ0UG9pbnQueCA8IGltYWdlU2l6ZS53aWR0aC8yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcG9pbnQxID0gcGI7CisgICAgICAgICAgICAgICAgKnBvaW50MiA9IHBhOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpwb2ludDEgPSBwYTsKKyAgICAgICAgICAgICAgICAqcG9pbnQyID0gcGI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggc3RhcnRQb2ludC55ID4gaW1hZ2VTaXplLmhlaWdodC0xICkKKyAgICAgICAgey8qIDggKi8KKyAgICAgICAgICAgIGlmKCBzdGFydFBvaW50LnggPCBpbWFnZVNpemUud2lkdGgvMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBvaW50MSA9IHBjOworICAgICAgICAgICAgICAgICpwb2ludDIgPSBwZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcG9pbnQxID0gcGQ7CisgICAgICAgICAgICAgICAgKnBvaW50MiA9IHBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgey8qIDUgLSBwb2ludCBpbiB0aGUgaW1hZ2UgKi8KKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfS8qIEdldEFuZ2xlTGluZSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaWN2R2V0Q29lZkZvclBpZWNlKCAgIEN2UG9pbnQyRDY0ZCBwX3N0YXJ0LEN2UG9pbnQyRDY0ZCBwX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqYSxkb3VibGUgKmIsZG91YmxlICpjLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpCit7CisgICAgZG91YmxlIGRldDsKKyAgICBkb3VibGUgZGV0QSxkZXRCLGRldEM7CisKKyAgICBkZXQgPSBwX3N0YXJ0LngqcF9lbmQueStwX2VuZC54K3Bfc3RhcnQueS1wX2VuZC55LXBfc3RhcnQueSpwX2VuZC54LXBfc3RhcnQueDsKKyAgICBpZiggZmFicyhkZXQpIDwgRVBTNjREKS8qIEVycm9yICovCisgICAgeworICAgICAgICAqcmVzdWx0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRldEEgPSBwX3N0YXJ0LnkgLSBwX2VuZC55OworICAgIGRldEIgPSBwX2VuZC54IC0gcF9zdGFydC54OworICAgIGRldEMgPSBwX3N0YXJ0LngqcF9lbmQueSAtIHBfZW5kLngqcF9zdGFydC55OworCisgICAgZG91YmxlIGludkRldCA9IDEuMCAvIGRldDsKKyAgICAqYSA9IGRldEEgKiBpbnZEZXQ7CisgICAgKmIgPSBkZXRCICogaW52RGV0OworICAgICpjID0gZGV0QyAqIGludkRldDsKKworICAgICpyZXN1bHQgPSAxOworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHZXQgY29tbW9uIGFyZWEgb2YgcmVjdGlmeWluZyAqLwordm9pZCBpY3ZHZXRDb21tb25BcmVhKCBDdlNpemUgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQgZXBpcG9sZTEsQ3ZQb2ludDNENjRkIGVwaXBvbGUyLAorICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgZnVuZE1hdHIsCisgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCBjb2VmZjExLEN2VmVjdDY0ZCBjb2VmZjEyLAorICAgICAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgY29lZmYyMSxDdlZlY3Q2NGQgY29lZmYyMiwKKyAgICAgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpCit7CisgICAgaW50IHJlcyA9IDA7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50MTE7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50MTI7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50MjE7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50MjI7CisKKyAgICBkb3VibGUgY29ycjExWzNdOworICAgIGRvdWJsZSBjb3JyMTJbM107CisgICAgZG91YmxlIGNvcnIyMVszXTsKKyAgICBkb3VibGUgY29ycjIyWzNdOworCisgICAgZG91YmxlIHBvaW50VzExWzNdOworICAgIGRvdWJsZSBwb2ludFcxMlszXTsKKyAgICBkb3VibGUgcG9pbnRXMjFbM107CisgICAgZG91YmxlIHBvaW50VzIyWzNdOworCisgICAgZG91YmxlIHRyYW5zRnVuZE1hdHJbMyozXTsKKyAgICAvKiBDb21wdXRlIHRyYW5zcG9zZSBvZiBmdW5kYW1lbnRhbCBtYXRyaXggKi8KKyAgICBpY3ZUcmFuc3Bvc2VNYXRyaXhfNjRkKCBmdW5kTWF0ciwgMywgMywgdHJhbnNGdW5kTWF0ciApOworICAgIAorICAgIEN2UG9pbnQyRDY0ZCBlcGlwb2xlMV8yZDsKKyAgICBDdlBvaW50MkQ2NGQgZXBpcG9sZTJfMmQ7CisgICAgCisgICAgaWYoIGZhYnMoZXBpcG9sZTEueikgPCAxZS04ICkKKyAgICB7LyogZXBpcG9sZTEgaW4gaW5maW5pdHkgKi8KKyAgICAgICAgKnJlc3VsdCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXBpcG9sZTFfMmQueCA9IGVwaXBvbGUxLnggLyBlcGlwb2xlMS56OworICAgIGVwaXBvbGUxXzJkLnkgPSBlcGlwb2xlMS55IC8gZXBpcG9sZTEuejsKKworICAgIGlmKCBmYWJzKGVwaXBvbGUyLnopIDwgMWUtOCApCisgICAgey8qIGVwaXBvbGUyIGluIGluZmluaXR5ICovCisgICAgICAgICpyZXN1bHQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVwaXBvbGUyXzJkLnggPSBlcGlwb2xlMi54IC8gZXBpcG9sZTIuejsKKyAgICBlcGlwb2xlMl8yZC55ID0gZXBpcG9sZTIueSAvIGVwaXBvbGUyLno7CisKKyAgICBpbnQgc3RhdCA9IGljdkdldEFuZ2xlTGluZSggZXBpcG9sZTFfMmQsIGltYWdlU2l6ZSwmcG9pbnQxMSwmcG9pbnQxMik7CisgICAgaWYoIHN0YXQgPT0gMiApCisgICAgeworICAgICAgICAvKiBObyBhbmdsZSAqLworICAgICAgICAqcmVzdWx0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXQgPSBpY3ZHZXRBbmdsZUxpbmUoIGVwaXBvbGUyXzJkLCBpbWFnZVNpemUsJnBvaW50MjEsJnBvaW50MjIpOworICAgIGlmKCBzdGF0ID09IDIgKQorICAgIHsKKyAgICAgICAgLyogTm8gYW5nbGUgKi8KKyAgICAgICAgKnJlc3VsdCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiA9PT09PT09PT09PT09IENvbXB1dGF0aW9uIGZvciBsaW5lIDEgPT09PT09PT09PT09PT09PSAqLworICAgIC8qIEZpbmQgY29ycmVzcG9uZGVuY2UgbGluZSBmb3IgYW5nbGUgcG9pbnRzMTEgKi8KKyAgICAvKiBjb3JyMjEgPSBGdW5kJypwMSAqLworCisgICAgcG9pbnRXMTFbMF0gPSBwb2ludDExLng7CisgICAgcG9pbnRXMTFbMV0gPSBwb2ludDExLnk7CisgICAgcG9pbnRXMTFbMl0gPSAxLjA7CisKKyAgICBpY3ZUcmFuc2Zvcm1WZWN0b3JfNjRkKCB0cmFuc0Z1bmRNYXRyLCAvKiAhISEgTW9kaWZpZWQgZnJvbSBub3QgdHJhbnNwb3NlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50VzExLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywzKTsKKworICAgIC8qIEZpbmQgY3Jvc3Npbmcgb2YgbGluZSB3aXRoIGltYWdlIDIgKi8KKyAgICBDdlBvaW50MkQ2NGQgc3RhcnQ7CisgICAgQ3ZQb2ludDJENjRkIGVuZDsKKyAgICBpY3ZHZXRDcm9zc1JlY3REaXJlY3QoIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcnIyMVswXSxjb3JyMjFbMV0sY29ycjIxWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0LCZlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKTsKKyAgICAKKyAgICBpZiggcmVzID09IDAgKQorICAgIHsvKiBXZSBoYXZlIG5vdCBjcm9zcyAqLworICAgICAgICAvKiBXZSBtdXN0IGRlZmluZSBuZXcgYW5nbGUgKi8KKworICAgICAgICBwb2ludFcyMVswXSA9IHBvaW50MjEueDsKKyAgICAgICAgcG9pbnRXMjFbMV0gPSBwb2ludDIxLnk7CisgICAgICAgIHBvaW50VzIxWzJdID0gMS4wOworCisgICAgICAgIC8qIEZpbmQgY29ycmVzcG9uZGVuY2UgbGluZSBmb3IgdGhpcyBhbmdsZSBwb2ludHMgKi8KKyAgICAgICAgLyogV2Uga25vdyBwb2ludCBhbmQgdHJ5IHRvIGdldCBjb3JyIGxpbmUgKi8KKyAgICAgICAgLyogRm9yIHBvaW50MjEgKi8KKyAgICAgICAgLyogY29ycjExID0gRnVuZCAqIHAyMSAqLworCisgICAgICAgIGljdlRyYW5zZm9ybVZlY3Rvcl82NGQoIGZ1bmRNYXRyLCAvKiAhISEgTW9kaWZpZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRXMjEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyMTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMyk7CisKKyAgICAgICAgLyogV2UgaGF2ZSBjcm9zcy4gQW5kIGl0J3MgcmVzdWx0IGNyb3NzIGZvciB1cCBsaW5lLiBTZXQgcmVzdWx0IGNvZWZzICovCisKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDEgaW1hZ2UgMSAqLworICAgICAgICBjb2VmZjExWzBdID0gY29ycjExWzBdOworICAgICAgICBjb2VmZjExWzFdID0gY29ycjExWzFdOworICAgICAgICBjb2VmZjExWzJdID0gY29ycjExWzJdOworICAgICAgICAKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDEgaW1hZ2UgMiAqLworICAgICAgICBpY3ZHZXRDb2VmRm9yUGllY2UoICAgIGVwaXBvbGUyXzJkLHBvaW50MjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZWZmMjFbMF0sJmNvZWZmMjFbMV0sJmNvZWZmMjFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcyk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZXN1bHQgPSAwOworICAgICAgICAgICAgcmV0dXJuOy8qIEVycm9yICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsvKiBMaW5lIDEgY3Jvc3MgaW1hZ2UgMiAqLworICAgICAgICAvKiBTZXQgY29lZnMgZm9yIGxpbmUgMSBpbWFnZSAxICovCisgICAgICAgIGljdkdldENvZWZGb3JQaWVjZSggICAgZXBpcG9sZTFfMmQscG9pbnQxMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29lZmYxMVswXSwmY29lZmYxMVsxXSwmY29lZmYxMVsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKTsKKyAgICAgICAgaWYoIHJlcyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgKnJlc3VsdCA9IDA7CisgICAgICAgICAgICByZXR1cm47LyogRXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDEgaW1hZ2UgMiAqLworICAgICAgICBjb2VmZjIxWzBdID0gY29ycjIxWzBdOworICAgICAgICBjb2VmZjIxWzFdID0gY29ycjIxWzFdOworICAgICAgICBjb2VmZjIxWzJdID0gY29ycjIxWzJdOworICAgICAgICAKKyAgICB9CisKKyAgICAvKiA9PT09PT09PT09PT09IENvbXB1dGF0aW9uIGZvciBsaW5lIDIgPT09PT09PT09PT09PT09PSAqLworICAgIC8qIEZpbmQgY29ycmVzcG9uZGVuY2UgbGluZSBmb3IgYW5nbGUgcG9pbnRzMTEgKi8KKyAgICAvKiBjb3JyMjIgPSBGdW5kKnAyICovCisKKyAgICBwb2ludFcxMlswXSA9IHBvaW50MTIueDsKKyAgICBwb2ludFcxMlsxXSA9IHBvaW50MTIueTsKKyAgICBwb2ludFcxMlsyXSA9IDEuMDsKKworICAgIGljdlRyYW5zZm9ybVZlY3Rvcl82NGQoIHRyYW5zRnVuZE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRXMTIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnIyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLDMpOworCisgICAgLyogRmluZCBjcm9zc2luZyBvZiBsaW5lIHdpdGggaW1hZ2UgMiAqLworICAgIGljdkdldENyb3NzUmVjdERpcmVjdCggaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29ycjIyWzBdLGNvcnIyMlsxXSxjb3JyMjJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQsJmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXMpOworICAgIAorICAgIGlmKCByZXMgPT0gMCApCisgICAgey8qIFdlIGhhdmUgbm90IGNyb3NzICovCisgICAgICAgIC8qIFdlIG11c3QgZGVmaW5lIG5ldyBhbmdsZSAqLworCisgICAgICAgIHBvaW50VzIyWzBdID0gcG9pbnQyMi54OworICAgICAgICBwb2ludFcyMlsxXSA9IHBvaW50MjIueTsKKyAgICAgICAgcG9pbnRXMjJbMl0gPSAxLjA7CisKKyAgICAgICAgLyogRmluZCBjb3JyZXNwb25kZW5jZSBsaW5lIGZvciB0aGlzIGFuZ2xlIHBvaW50cyAqLworICAgICAgICAvKiBXZSBrbm93IHBvaW50IGFuZCB0cnkgdG8gZ2V0IGNvcnIgbGluZSAqLworICAgICAgICAvKiBGb3IgcG9pbnQyMSAqLworICAgICAgICAvKiBjb3JyMiA9IEZ1bmQnICogcDEgKi8KKworICAgICAgICBpY3ZUcmFuc2Zvcm1WZWN0b3JfNjRkKCBmdW5kTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRXMjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsMyk7CisKKyAgICAgICAgCisgICAgICAgIC8qIFdlIGhhdmUgY3Jvc3MuIEFuZCBpdCdzIHJlc3VsdCBjcm9zcyBmb3IgZG93biBsaW5lLiBTZXQgcmVzdWx0IGNvZWZzICovCisKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDIgaW1hZ2UgMSAqLworICAgICAgICBjb2VmZjEyWzBdID0gY29ycjEyWzBdOworICAgICAgICBjb2VmZjEyWzFdID0gY29ycjEyWzFdOworICAgICAgICBjb2VmZjEyWzJdID0gY29ycjEyWzJdOworICAgICAgICAKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDEgaW1hZ2UgMiAqLworICAgICAgICBpY3ZHZXRDb2VmRm9yUGllY2UoICAgIGVwaXBvbGUyXzJkLHBvaW50MjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZWZmMjJbMF0sJmNvZWZmMjJbMV0sJmNvZWZmMjJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcyk7CisgICAgICAgIGlmKCByZXMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZXN1bHQgPSAwOworICAgICAgICAgICAgcmV0dXJuOy8qIEVycm9yICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsvKiBMaW5lIDIgY3Jvc3MgaW1hZ2UgMiAqLworICAgICAgICAvKiBTZXQgY29lZnMgZm9yIGxpbmUgMiBpbWFnZSAxICovCisgICAgICAgIGljdkdldENvZWZGb3JQaWVjZSggICAgZXBpcG9sZTFfMmQscG9pbnQxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29lZmYxMlswXSwmY29lZmYxMlsxXSwmY29lZmYxMlsyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzKTsKKyAgICAgICAgaWYoIHJlcyA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgKnJlc3VsdCA9IDA7CisgICAgICAgICAgICByZXR1cm47LyogRXJyb3IgKi8KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLyogU2V0IGNvZWZzIGZvciBsaW5lIDEgaW1hZ2UgMiAqLworICAgICAgICBjb2VmZjIyWzBdID0gY29ycjIyWzBdOworICAgICAgICBjb2VmZjIyWzFdID0gY29ycjIyWzFdOworICAgICAgICBjb2VmZjIyWzJdID0gY29ycjIyWzJdOworICAgICAgICAKKyAgICB9CisKKyAgICAvKiBOb3cgd2Uga25vdyBjb21tb24gYXJlYSAqLworCisgICAgcmV0dXJuOworCit9LyogR2V0Q29tbW9uQXJlYSAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdldCBjcm9zcyBmb3IgZGlyZWN0aW9uMSBhbmQgZGlyZWN0aW9uMiAqLworLyogIFJlc3VsdCA9IDEgLSBjcm9zcyAqLworLyogIFJlc3VsdCA9IDIgLSBwYXJhbGxlbCBhbmQgbm90IGVxdWFsICovCisvKiAgUmVzdWx0ID0gMyAtIHBhcmFsbGVsIGFuZCBlcXVhbCAqLworCit2b2lkIGljdkdldENyb3NzRGlyZWN0RGlyZWN0KCAgQ3ZWZWN0NjRkIGRpcmVjdDEsQ3ZWZWN0NjRkIGRpcmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRkICpjcm9zcyxpbnQqIHJlc3VsdCkKK3sKKyAgICBkb3VibGUgZGV0ICA9IGRpcmVjdDFbMF0qZGlyZWN0MlsxXSAtIGRpcmVjdDJbMF0qZGlyZWN0MVsxXTsKKyAgICBkb3VibGUgZGV0eCA9IC1kaXJlY3QxWzJdKmRpcmVjdDJbMV0gKyBkaXJlY3QxWzFdKmRpcmVjdDJbMl07CisKKyAgICBpZiggZmFicyhkZXQpID4gRVBTNjREICkKKyAgICB7LyogSGF2ZSBjcm9zcyAqLworICAgICAgICBjcm9zcy0+eCA9IGRldHgvZGV0OworICAgICAgICBjcm9zcy0+eSA9ICgtZGlyZWN0MVswXSpkaXJlY3QyWzJdICsgZGlyZWN0MlswXSpkaXJlY3QxWzJdKS9kZXQ7CisgICAgICAgICpyZXN1bHQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgey8qIG1heSBiZSBwYXJhbGxlbCAqLworICAgICAgICBpZiggZmFicyhkZXR4KSA+IEVQUzY0RCApCisgICAgICAgIHsvKiBwYXJhbGxlbCBhbmQgbm90IGVxdWFsICovCisgICAgICAgICAgICAqcmVzdWx0ID0gMjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsvKiBlcXVhbHMgKi8KKyAgICAgICAgICAgICpyZXN1bHQgPSAzOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEdldCBjcm9zcyBmb3IgcGllY2UgcDEscDIgYW5kIGRpcmVjdGlvbiBhLGIsYyAqLworLyogIFJlc3VsdCA9IDAgLSBubyBjcm9zcyAqLworLyogIFJlc3VsdCA9IDEgLSBjcm9zcyAqLworLyogIFJlc3VsdCA9IDIgLSBwYXJhbGxlbCBhbmQgbm90IGVxdWFsICovCisvKiAgUmVzdWx0ID0gMyAtIHBhcmFsbGVsIGFuZCBlcXVhbCAqLworCit2b2lkIGljdkdldENyb3NzUGllY2VEaXJlY3QoICAgQ3ZQb2ludDJENjRkIHBfc3RhcnQsQ3ZQb2ludDJENjRkIHBfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhLGRvdWJsZSBiLGRvdWJsZSBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCAqY3Jvc3MsaW50KiByZXN1bHQpCit7CisKKyAgICBpZiggKGEqcF9zdGFydC54ICsgYipwX3N0YXJ0LnkgKyBjKSAqIChhKnBfZW5kLnggKyBiKnBfZW5kLnkgKyBjKSA8PSAwICkKKyAgICB7LyogSGF2ZSBjcm9zcyAqLworICAgICAgICBkb3VibGUgZGV0OworICAgICAgICBkb3VibGUgZGV0eGMsZGV0eWM7CisgICAgICAgIAorICAgICAgICBkZXQgPSBhICogKHBfZW5kLnggLSBwX3N0YXJ0LngpICsgYiAqIChwX2VuZC55IC0gcF9zdGFydC55KTsKKyAgICAgICAgCisgICAgICAgIGlmKCBmYWJzKGRldCkgPCBFUFM2NEQgKQorICAgICAgICB7LyogbGluZXMgYXJlIHBhcmFsbGVsIGFuZCBtYXkgYmUgZXF1YWwgb3IgbGluZSBpcyBwb2ludCAqLworICAgICAgICAgICAgaWYoICBmYWJzKGEqcF9zdGFydC54ICsgYipwX3N0YXJ0LnkgKyBjKSA8IEVQUzY0RCApCisgICAgICAgICAgICB7LyogbGluZSBpcyBwb2ludCBvciBub3QgZGlmZiAqLworICAgICAgICAgICAgICAgICpyZXN1bHQgPSAzOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcmVzdWx0ID0gMjsgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkZXR4YyA9IGIqKHBfZW5kLnkqcF9zdGFydC54IC0gcF9zdGFydC55KnBfZW5kLngpICsgYyoocF9zdGFydC54IC0gcF9lbmQueCk7CisgICAgICAgIGRldHljID0gYSoocF9lbmQueCpwX3N0YXJ0LnkgLSBwX3N0YXJ0LngqcF9lbmQueSkgKyBjKihwX3N0YXJ0LnkgLSBwX2VuZC55KTsKKworICAgICAgICBjcm9zcy0+eCA9IGRldHhjIC8gZGV0OworICAgICAgICBjcm9zcy0+eSA9IGRldHljIC8gZGV0OworICAgICAgICAqcmVzdWx0ID0gMTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcmVzdWx0ID0gMDsKKyAgICB9CisgICAgcmV0dXJuOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaWN2R2V0Q3Jvc3NQaWVjZVBpZWNlKCBDdlBvaW50MkQ2NGQgcDFfc3RhcnQsQ3ZQb2ludDJENjRkIHAxX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQgcDJfc3RhcnQsQ3ZQb2ludDJENjRkIHAyX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQqIGNyb3NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVzdWx0KQoreworICAgIGRvdWJsZSBleDEsZXkxLGV4MixleTI7CisgICAgZG91YmxlIHB4MSxweTEscHgyLHB5MjsKKyAgICBkb3VibGUgZGVsOworICAgIGRvdWJsZSBkZWxBLGRlbEIsZGVsWCxkZWxZOworICAgIGRvdWJsZSBhbHBoYSxiZXR0YTsKKworICAgIGV4MSA9IHAxX3N0YXJ0Lng7CisgICAgZXkxID0gcDFfc3RhcnQueTsKKyAgICBleDIgPSBwMV9lbmQueDsKKyAgICBleTIgPSBwMV9lbmQueTsKKworICAgIHB4MSA9IHAyX3N0YXJ0Lng7CisgICAgcHkxID0gcDJfc3RhcnQueTsKKyAgICBweDIgPSBwMl9lbmQueDsKKyAgICBweTIgPSBwMl9lbmQueTsKKworICAgIGRlbCA9IChweTEtcHkyKSooZXgxLWV4MiktKHB4MS1weDIpKihleTEtZXkyKTsKKyAgICBpZiggZmFicyhkZWwpIDw9IEVQUzY0RCApCisgICAgey8qIE1heSBiZSB0aGV5IGFyZSBwYXJhbGxlbCAhISEgKi8KKyAgICAgICAgKnJlc3VsdCA9IDA7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZWxBID0gIChleTEtZXkyKSooZXgxLXB4MSkgKyAoZXgxLWV4MikqKHB5MS1leTEpOworICAgIGRlbEIgPSAgKHB5MS1weTIpKihleDEtcHgxKSArIChweDEtcHgyKSoocHkxLWV5MSk7CisKKyAgICBhbHBoYSA9IGRlbEEgLyBkZWw7CisgICAgYmV0dGEgPSBkZWxCIC8gZGVsOworCisgICAgaWYoIGFscGhhIDwgMCB8fCBhbHBoYSA+IDEuMCB8fCBiZXR0YSA8IDAgfHwgYmV0dGEgPiAxLjApCisgICAgeworICAgICAgICAqcmVzdWx0ID0gMDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlbFggPSAgKHB4MS1weDIpKihleTEqKGV4MS1leDIpLWV4MSooZXkxLWV5MikpKworICAgICAgICAgICAgKGV4MS1leDIpKihweDEqKHB5MS1weTIpLXB5MSoocHgxLXB4MikpOworCisgICAgZGVsWSA9ICAocHkxLXB5MikqKGV5MSooZXgxLWV4MiktZXgxKihleTEtZXkyKSkrCisgICAgICAgICAgICAoZXkxLWV5MikqKHB4MSoocHkxLXB5MiktcHkxKihweDEtcHgyKSk7CisKKyAgICBjcm9zcy0+eCA9IGRlbFggLyBkZWw7CisgICAgY3Jvc3MtPnkgPSBkZWxZIC8gZGVsOworICAgIAorICAgICpyZXN1bHQgPSAxOworICAgIHJldHVybjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaWN2R2V0UGllY2VMZW5ndGgoQ3ZQb2ludDJENjRkIHBvaW50MSxDdlBvaW50MkQ2NGQgcG9pbnQyLGRvdWJsZSogZGlzdCkKK3sKKyAgICBkb3VibGUgZHggPSBwb2ludDIueCAtIHBvaW50MS54OworICAgIGRvdWJsZSBkeSA9IHBvaW50Mi55IC0gcG9pbnQxLnk7CisgICAgKmRpc3QgPSBzcXJ0KCBkeCpkeCArIGR5KmR5ICk7CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaWN2R2V0UGllY2VMZW5ndGgzRChDdlBvaW50M0Q2NGQgcG9pbnQxLEN2UG9pbnQzRDY0ZCBwb2ludDIsZG91YmxlKiBkaXN0KQoreworICAgIGRvdWJsZSBkeCA9IHBvaW50Mi54IC0gcG9pbnQxLng7CisgICAgZG91YmxlIGR5ID0gcG9pbnQyLnkgLSBwb2ludDEueTsKKyAgICBkb3VibGUgZHogPSBwb2ludDIueiAtIHBvaW50MS56OworICAgICpkaXN0ID0gc3FydCggZHgqZHggKyBkeSpkeSArIGR6KmR6ICk7CisgICAgcmV0dXJuOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIEZpbmQgbGluZSBmcm9tIGVwaXBvbGUgd2hpY2ggY3Jvc3MgaW1hZ2UgcmVjdCAqLworLyogRmluZCBwb2ludHMgb2YgY3Jvc3MgMCBvciAxIG9yIDIuIFJldHVybiBudW1iZXIgb2YgcG9pbnRzIGluIGNyb3NzICovCit2b2lkIGljdkdldENyb3NzUmVjdERpcmVjdCggICAgQ3ZTaXplIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSxkb3VibGUgYixkb3VibGUgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQgKnN0YXJ0LEN2UG9pbnQyRDY0ZCAqZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmVzdWx0KQoreworICAgIEN2UG9pbnQyRDY0ZCBmcmFtZUJlZzsKKyAgICBDdlBvaW50MkQ2NGQgZnJhbWVFbmQ7CisgICAgQ3ZQb2ludDJENjRkIGNyb3NzWzRdOworICAgIGludCAgICAgaGF2ZUNyb3NzWzRdOworICAgIAorICAgIGhhdmVDcm9zc1swXSA9IDA7CisgICAgaGF2ZUNyb3NzWzFdID0gMDsKKyAgICBoYXZlQ3Jvc3NbMl0gPSAwOworICAgIGhhdmVDcm9zc1szXSA9IDA7CisKKyAgICBmcmFtZUJlZy54ID0gMDsKKyAgICBmcmFtZUJlZy55ID0gMDsKKyAgICBmcmFtZUVuZC54ID0gaW1hZ2VTaXplLndpZHRoOworICAgIGZyYW1lRW5kLnkgPSAwOworCisgICAgaWN2R2V0Q3Jvc3NQaWVjZURpcmVjdChmcmFtZUJlZyxmcmFtZUVuZCxhLGIsYywmY3Jvc3NbMF0sJmhhdmVDcm9zc1swXSk7ICAgIAorICAgIAorICAgIGZyYW1lQmVnLnggPSBpbWFnZVNpemUud2lkdGg7CisgICAgZnJhbWVCZWcueSA9IDA7CisgICAgZnJhbWVFbmQueCA9IGltYWdlU2l6ZS53aWR0aDsKKyAgICBmcmFtZUVuZC55ID0gaW1hZ2VTaXplLmhlaWdodDsKKyAgICBpY3ZHZXRDcm9zc1BpZWNlRGlyZWN0KGZyYW1lQmVnLGZyYW1lRW5kLGEsYixjLCZjcm9zc1sxXSwmaGF2ZUNyb3NzWzFdKTsgICAgCisKKyAgICBmcmFtZUJlZy54ID0gaW1hZ2VTaXplLndpZHRoOworICAgIGZyYW1lQmVnLnkgPSBpbWFnZVNpemUuaGVpZ2h0OworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSBpbWFnZVNpemUuaGVpZ2h0OworICAgIGljdkdldENyb3NzUGllY2VEaXJlY3QoZnJhbWVCZWcsZnJhbWVFbmQsYSxiLGMsJmNyb3NzWzJdLCZoYXZlQ3Jvc3NbMl0pOyAgICAKKworICAgIGZyYW1lQmVnLnggPSAwOworICAgIGZyYW1lQmVnLnkgPSBpbWFnZVNpemUuaGVpZ2h0OworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAwOworICAgIGljdkdldENyb3NzUGllY2VEaXJlY3QoZnJhbWVCZWcsZnJhbWVFbmQsYSxiLGMsJmNyb3NzWzNdLCZoYXZlQ3Jvc3NbM10pOyAgICAKKworICAgIGRvdWJsZSBtYXhEaXN0OworCisgICAgaW50IG1heEk9MCxtYXhKPTA7CisKKworICAgIGludCBpLGo7CisKKyAgICBtYXhEaXN0ID0gLTEuMDsKKyAgICAKKyAgICBkb3VibGUgZGlzdGFuY2U7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBoYXZlQ3Jvc3NbaV0gPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgNDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaGF2ZUNyb3NzW2pdID09IDEpCisgICAgICAgICAgICAgICAgey8qIENvbXB1dGUgZGlzdCAqLworICAgICAgICAgICAgICAgICAgICBpY3ZHZXRQaWVjZUxlbmd0aChjcm9zc1tpXSxjcm9zc1tqXSwmZGlzdGFuY2UpOworICAgICAgICAgICAgICAgICAgICBpZiggZGlzdGFuY2UgPiBtYXhEaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4SSA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhKID0gajsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heERpc3QgPSBkaXN0YW5jZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBtYXhEaXN0ID49IDAgKQorICAgIHsvKiBXZSBoYXZlIGNyb3NzICovCisgICAgICAgICpzdGFydCA9IGNyb3NzW21heEldOworICAgICAgICAqcmVzdWx0ID0gMTsKKyAgICAgICAgaWYoIG1heERpc3QgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgKmVuZCAgID0gY3Jvc3NbbWF4Sl07CisgICAgICAgICAgICAqcmVzdWx0ID0gMjsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAqcmVzdWx0ID0gMDsKKyAgICB9CisKKyAgICByZXR1cm47Cit9LyogR2V0Q3Jvc3NSZWN0RGlyZWN0ICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaWN2UHJvamVjdFBvaW50VG9JbWFnZSggICBDdlBvaW50M0Q2NGQgcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkIGNhbU1hdHIsQ3ZNYXRyNjRkIHJvdE1hdHIsQ3ZWZWN0NjRkIHRyYW5zVmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQqIHByb2pQb2ludCkKK3sKKworICAgIGRvdWJsZSB0bXBWZWN0MVszXTsKKyAgICBkb3VibGUgdG1wVmVjdDJbM107CisgICAgCisgICAgaWN2TXVsTWF0cml4XzY0ZCAoICByb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSopJnBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgMSwzLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmVjdDEpOworCisgICAgaWN2QWRkVmVjdG9yXzY0ZCAoIHRtcFZlY3QxLCB0cmFuc1ZlY3QsdG1wVmVjdDIsIDMpOworCisgICAgaWN2TXVsTWF0cml4XzY0ZCAoICBjYW1NYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgdG1wVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAxLDMsCisgICAgICAgICAgICAgICAgICAgICAgICB0bXBWZWN0MSk7CisKKyAgICBwcm9qUG9pbnQtPnggPSB0bXBWZWN0MVswXSAvIHRtcFZlY3QxWzJdOworICAgIHByb2pQb2ludC0+eSA9IHRtcFZlY3QxWzFdIC8gdG1wVmVjdDFbMl07CisgICAKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEdldCBxdWFkcyBmb3IgdHJhbnNmb3JtIGltYWdlcyAqLwordm9pZCBpY3ZHZXRRdWFkc1RyYW5zZm9ybSggCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDY0ZCAgICAgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSogICAgICAgd2FycFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDFbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcXVhZDJbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGZ1bmRNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNENjRkKiBlcGlwb2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZCogZXBpcG9sZTIKKyAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvKiBGaXJzdCBjb21wdXRlIGZ1bmRhbWVudGFsIG1hdHJpeCBhbmQgZXBpcG9sZXMgKi8KKyAgICBpbnQgcmVzOworCisKKyAgICAvKiBDb21wdXRlIGVwaXBvbGVzIGFuZCBmdW5kYW1lbnRhbCBtYXRyaXggdXNpbmcgbmV3IGZ1bmN0aW9ucyAqLworICAgIHsKKyAgICAgICAgZG91YmxlIGNvbnZSb3RNYXRyWzldOworICAgICAgICBkb3VibGUgY29udlRyYW5zVmVjdFszXTsKKworICAgICAgICBpY3ZDcmVhdGVDb252ZXJ0TWF0clZlY3QoIHJvdE1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252VHJhbnNWZWN0KTsKKyAgICAgICAgZmxvYXQgY29udlJvdE1hdHJfMzJmWzldOworICAgICAgICBmbG9hdCBjb252VHJhbnNWZWN0XzMyZlszXTsKKworICAgICAgICBpY3ZDdnRfNjRkXzMyZihjb252Um90TWF0cixjb252Um90TWF0cl8zMmYsOSk7CisgICAgICAgIGljdkN2dF82NGRfMzJmKGNvbnZUcmFuc1ZlY3QsY29udlRyYW5zVmVjdF8zMmYsMyk7CisKKyAgICAgICAgLyogV2Uga25vdyBSIGFuZCB0ICovCisgICAgICAgIC8qIENvbXB1dGUgZXNzZW50aWFsIG1hdHJpeCAqLworICAgICAgICBmbG9hdCBlc3NNYXRyWzldOworICAgICAgICBmbG9hdCBmdW5kTWF0cl8zMmZbOV07CisKKyAgICAgICAgZmxvYXQgY2FtTWF0cjFfMzJmWzldOworICAgICAgICBmbG9hdCBjYW1NYXRyMl8zMmZbOV07CisKKyAgICAgICAgaWN2Q3Z0XzY0ZF8zMmYoY2FtTWF0cjEsY2FtTWF0cjFfMzJmLDkpOworICAgICAgICBpY3ZDdnRfNjRkXzMyZihjYW1NYXRyMixjYW1NYXRyMl8zMmYsOSk7CisKKyAgICAgICAgY3ZDb21wdXRlRXNzZW50aWFsTWF0cml4KCAgIGNvbnZSb3RNYXRyXzMyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZUcmFuc1ZlY3RfMzJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXNzTWF0cik7CisKKyAgICAgICAgY3ZDb252ZXJ0RXNzZW50aWFsMkZ1bmRhbWVudGFsKCBlc3NNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmRNYXRyXzMyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMV8zMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjJfMzJmKTsKKyAgICAgICAgCisgICAgICAgIEN2UG9pbnQzRDMyZiBlcGlwb2xlMV8zMmY7CisgICAgICAgIEN2UG9pbnQzRDMyZiBlcGlwb2xlMl8zMmY7CisgICAgICAgIAorICAgICAgICBjdkNvbXB1dGVFcGlwb2xlc0Zyb21GdW5kTWF0cml4KCBmdW5kTWF0cl8zMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcGlwb2xlMV8zMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlcGlwb2xlMl8zMmYpOworICAgICAgICAvKiBjb3B5IHRvIDY0ZCBlcGlwb2xlcyAqLworICAgICAgICBlcGlwb2xlMS0+eCA9IGVwaXBvbGUxXzMyZi54OworICAgICAgICBlcGlwb2xlMS0+eSA9IGVwaXBvbGUxXzMyZi55OworICAgICAgICBlcGlwb2xlMS0+eiA9IGVwaXBvbGUxXzMyZi56OworCisgICAgICAgIGVwaXBvbGUyLT54ID0gZXBpcG9sZTJfMzJmLng7CisgICAgICAgIGVwaXBvbGUyLT55ID0gZXBpcG9sZTJfMzJmLnk7CisgICAgICAgIGVwaXBvbGUyLT56ID0gZXBpcG9sZTJfMzJmLno7CisgICAgICAgIAorICAgICAgICAvKiBDb252ZXJ0IGZ1bmRhbWVudGFsIG1hdHJpeCAqLworICAgICAgICBpY3ZDdnRfMzJmXzY0ZChmdW5kTWF0cl8zMmYsZnVuZE1hdHIsOSk7CisgICAgfQorCisgICAgZG91YmxlIGNvZWZmMTFbM107CisgICAgZG91YmxlIGNvZWZmMTJbM107CisgICAgZG91YmxlIGNvZWZmMjFbM107CisgICAgZG91YmxlIGNvZWZmMjJbM107CisKKyAgICBpY3ZHZXRDb21tb25BcmVhKCAgIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICplcGlwb2xlMSwqZXBpcG9sZTIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5kTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmMTEsY29lZmYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmMjEsY29lZmYyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXMpOworCisgICAgQ3ZQb2ludDJENjRkIHBvaW50MTEsIHBvaW50MTIscG9pbnQyMSwgcG9pbnQyMjsKKyAgICBkb3VibGUgd2lkdGgxLHdpZHRoMjsKKyAgICBkb3VibGUgaGVpZ2h0MSxoZWlnaHQyOworICAgIGRvdWJsZSB0bXBIZWlnaHQxLHRtcEhlaWdodDI7CisKKyAgICBDdlBvaW50MkQ2NGQgZXBpcG9sZTFfMmQ7CisgICAgQ3ZQb2ludDJENjRkIGVwaXBvbGUyXzJkOworCisgICAgLyogLS0tLS0gSW1hZ2UgMSAtLS0tLSAqLworICAgIGlmKCBmYWJzKGVwaXBvbGUxLT56KSA8IDFlLTggKQorICAgIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlcGlwb2xlMV8yZC54ID0gZXBpcG9sZTEtPnggLyBlcGlwb2xlMS0+ejsKKyAgICBlcGlwb2xlMV8yZC55ID0gZXBpcG9sZTEtPnkgLyBlcGlwb2xlMS0+ejsKKworICAgIGljdkdldEN1dFBpZWNlKCBjb2VmZjExLGNvZWZmMTIsCisgICAgICAgICAgICAgICAgZXBpcG9sZTFfMmQsCisgICAgICAgICAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICZwb2ludDExLCZwb2ludDEyLAorICAgICAgICAgICAgICAgICZwb2ludDIxLCZwb2ludDIyLAorICAgICAgICAgICAgICAgICZyZXMpOworCisgICAgLyogQ29tcHV0ZSBkaXN0YW5jZSAqLworICAgIGljdkdldFBpZWNlTGVuZ3RoKHBvaW50MTEscG9pbnQyMSwmd2lkdGgxKTsKKyAgICBpY3ZHZXRQaWVjZUxlbmd0aChwb2ludDExLHBvaW50MTIsJnRtcEhlaWdodDEpOworICAgIGljdkdldFBpZWNlTGVuZ3RoKHBvaW50MjEscG9pbnQyMiwmdG1wSGVpZ2h0Mik7CisgICAgaGVpZ2h0MSA9IE1BWCh0bXBIZWlnaHQxLHRtcEhlaWdodDIpOworCisgICAgcXVhZDFbMF1bMF0gPSBwb2ludDExLng7CisgICAgcXVhZDFbMF1bMV0gPSBwb2ludDExLnk7CisKKyAgICBxdWFkMVsxXVswXSA9IHBvaW50MjEueDsKKyAgICBxdWFkMVsxXVsxXSA9IHBvaW50MjEueTsKKworICAgIHF1YWQxWzJdWzBdID0gcG9pbnQyMi54OworICAgIHF1YWQxWzJdWzFdID0gcG9pbnQyMi55OworCisgICAgcXVhZDFbM11bMF0gPSBwb2ludDEyLng7CisgICAgcXVhZDFbM11bMV0gPSBwb2ludDEyLnk7CisKKyAgICAvKiAtLS0tLSBJbWFnZSAyIC0tLS0tICovCisgICAgaWYoIGZhYnMoZXBpcG9sZTItPnopIDwgMWUtOCApCisgICAgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVwaXBvbGUyXzJkLnggPSBlcGlwb2xlMi0+eCAvIGVwaXBvbGUyLT56OworICAgIGVwaXBvbGUyXzJkLnkgPSBlcGlwb2xlMi0+eSAvIGVwaXBvbGUyLT56OworCisgICAgaWN2R2V0Q3V0UGllY2UoIGNvZWZmMjEsY29lZmYyMiwKKyAgICAgICAgICAgICAgICBlcGlwb2xlMl8yZCwKKyAgICAgICAgICAgICAgICBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgJnBvaW50MTEsJnBvaW50MTIsCisgICAgICAgICAgICAgICAgJnBvaW50MjEsJnBvaW50MjIsCisgICAgICAgICAgICAgICAgJnJlcyk7CisKKyAgICAvKiBDb21wdXRlIGRpc3RhbmNlICovCisgICAgaWN2R2V0UGllY2VMZW5ndGgocG9pbnQxMSxwb2ludDIxLCZ3aWR0aDIpOworICAgIGljdkdldFBpZWNlTGVuZ3RoKHBvaW50MTEscG9pbnQxMiwmdG1wSGVpZ2h0MSk7CisgICAgaWN2R2V0UGllY2VMZW5ndGgocG9pbnQyMSxwb2ludDIyLCZ0bXBIZWlnaHQyKTsKKyAgICBoZWlnaHQyID0gTUFYKHRtcEhlaWdodDEsdG1wSGVpZ2h0Mik7CisKKyAgICBxdWFkMlswXVswXSA9IHBvaW50MTEueDsKKyAgICBxdWFkMlswXVsxXSA9IHBvaW50MTEueTsKKworICAgIHF1YWQyWzFdWzBdID0gcG9pbnQyMS54OworICAgIHF1YWQyWzFdWzFdID0gcG9pbnQyMS55OworCisgICAgcXVhZDJbMl1bMF0gPSBwb2ludDIyLng7CisgICAgcXVhZDJbMl1bMV0gPSBwb2ludDIyLnk7CisKKyAgICBxdWFkMlszXVswXSA9IHBvaW50MTIueDsKKyAgICBxdWFkMlszXVsxXSA9IHBvaW50MTIueTsKKworCisgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyAgICAvKiBUaGlzIGlzIGEgbmV3IGFkZGl0aW9uYWwgd2F5IHRvIGNvbXB1dGUgcXVhZHMuICovCisgICAgLyogV2UgbXVzdCBjb3JyZWN0IHF1YWRzICovCisgICAgeworICAgICAgICBkb3VibGUgY29udlJvdE1hdHJbOV07CisgICAgICAgIGRvdWJsZSBjb252VHJhbnNWZWN0WzNdOworCisgICAgICAgIGRvdWJsZSBuZXdRdWFkMVs0XVsyXTsKKyAgICAgICAgZG91YmxlIG5ld1F1YWQyWzRdWzJdOworCisKKyAgICAgICAgaWN2Q3JlYXRlQ29udmVydE1hdHJWZWN0KCByb3RNYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdCk7CisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLUNvbXB1dGUgZm9yIGZpcnN0IGltYWdlLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgQ3ZQb2ludDJEMzJmIHBvaW50YjE7CisgICAgICAgIEN2UG9pbnQyRDMyZiBwb2ludGUxOworICAgICAgICAKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHBvaW50YjI7CisgICAgICAgIEN2UG9pbnQyRDMyZiBwb2ludGUyOworCisgICAgICAgIHBvaW50YjEueCA9IChmbG9hdClxdWFkMVswXVswXTsKKyAgICAgICAgcG9pbnRiMS55ID0gKGZsb2F0KXF1YWQxWzBdWzFdOworCisgICAgICAgIHBvaW50ZTEueCA9IChmbG9hdClxdWFkMVszXVswXTsKKyAgICAgICAgcG9pbnRlMS55ID0gKGZsb2F0KXF1YWQxWzNdWzFdOworCisgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0MShjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50YjIpOworCisgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0MShjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50ZTIpOworCisgICAgICAgIC8qICBKVVNUIFRFU1QgRk9SIFBPSU5UICovCisKKyAgICAgICAgLyogQ29tcHV0ZSBkaXN0YW5jZXMgKi8KKyAgICAgICAgZG91YmxlIGR4T2xkLGR5T2xkOworICAgICAgICBkb3VibGUgZHhOZXcsZHlOZXc7CisgICAgICAgIGRvdWJsZSBkaXN0T2xkLGRpc3ROZXc7CisgICAgICAgIAorICAgICAgICBkeE9sZCA9IHF1YWQyWzFdWzBdIC0gcXVhZDJbMF1bMF07CisgICAgICAgIGR5T2xkID0gcXVhZDJbMV1bMV0gLSBxdWFkMlswXVsxXTsKKyAgICAgICAgZGlzdE9sZCA9IGR4T2xkKmR4T2xkICsgZHlPbGQqZHlPbGQ7CisgICAgICAgIAorICAgICAgICBkeE5ldyA9IHF1YWQyWzFdWzBdIC0gcG9pbnRiMi54OworICAgICAgICBkeU5ldyA9IHF1YWQyWzFdWzFdIC0gcG9pbnRiMi55OworICAgICAgICBkaXN0TmV3ID0gZHhOZXcqZHhOZXcgKyBkeU5ldypkeU5ldzsKKworICAgICAgICBpZiggZGlzdE5ldyA+IGRpc3RPbGQgKQorICAgICAgICB7LyogR2V0IG5ldyBwb2ludHMgZm9yIHNlY29uZCBxdWFkICovCisgICAgICAgICAgICBuZXdRdWFkMlswXVswXSA9IHBvaW50YjIueDsKKyAgICAgICAgICAgIG5ld1F1YWQyWzBdWzFdID0gcG9pbnRiMi55OworICAgICAgICAgICAgbmV3UXVhZDJbM11bMF0gPSBwb2ludGUyLng7CisgICAgICAgICAgICBuZXdRdWFkMlszXVsxXSA9IHBvaW50ZTIueTsKKyAgICAgICAgICAgIG5ld1F1YWQxWzBdWzBdID0gcXVhZDFbMF1bMF07CisgICAgICAgICAgICBuZXdRdWFkMVswXVsxXSA9IHF1YWQxWzBdWzFdOworICAgICAgICAgICAgbmV3UXVhZDFbM11bMF0gPSBxdWFkMVszXVswXTsKKyAgICAgICAgICAgIG5ld1F1YWQxWzNdWzFdID0gcXVhZDFbM11bMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7LyogR2V0IG5ldyBwb2ludHMgZm9yIGZpcnN0IHF1YWQgKi8KKworICAgICAgICAgICAgcG9pbnRiMi54ID0gKGZsb2F0KXF1YWQyWzBdWzBdOworICAgICAgICAgICAgcG9pbnRiMi55ID0gKGZsb2F0KXF1YWQyWzBdWzFdOworCisgICAgICAgICAgICBwb2ludGUyLnggPSAoZmxvYXQpcXVhZDJbM11bMF07CisgICAgICAgICAgICBwb2ludGUyLnkgPSAoZmxvYXQpcXVhZDJbM11bMV07CisKKyAgICAgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0Mihjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGIyKTsKKworICAgICAgICAgICAgaWN2Q29tcHV0ZWVJbmZpbml0ZVByb2plY3QyKGNvbnZSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZTIpOworCisKKyAgICAgICAgICAgIC8qICBKVVNUIFRFU1QgRk9SIFBPSU5UICovCisKKyAgICAgICAgICAgIG5ld1F1YWQyWzBdWzBdID0gcXVhZDJbMF1bMF07CisgICAgICAgICAgICBuZXdRdWFkMlswXVsxXSA9IHF1YWQyWzBdWzFdOworICAgICAgICAgICAgbmV3UXVhZDJbM11bMF0gPSBxdWFkMlszXVswXTsKKyAgICAgICAgICAgIG5ld1F1YWQyWzNdWzFdID0gcXVhZDJbM11bMV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5ld1F1YWQxWzBdWzBdID0gcG9pbnRiMS54OworICAgICAgICAgICAgbmV3UXVhZDFbMF1bMV0gPSBwb2ludGIxLnk7CisgICAgICAgICAgICBuZXdRdWFkMVszXVswXSA9IHBvaW50ZTEueDsKKyAgICAgICAgICAgIG5ld1F1YWQxWzNdWzFdID0gcG9pbnRlMS55OworICAgICAgICB9CisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLUNvbXB1dGUgZm9yIHNlY29uZCBpbWFnZS0tLS0tLS0tLS0tLS0tICovCisgICAgICAgIHBvaW50YjEueCA9IChmbG9hdClxdWFkMVsxXVswXTsKKyAgICAgICAgcG9pbnRiMS55ID0gKGZsb2F0KXF1YWQxWzFdWzFdOworCisgICAgICAgIHBvaW50ZTEueCA9IChmbG9hdClxdWFkMVsyXVswXTsKKyAgICAgICAgcG9pbnRlMS55ID0gKGZsb2F0KXF1YWQxWzJdWzFdOworCisgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0MShjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50YjIpOworCisgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0MShjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvaW50ZTIpOworCisgICAgICAgIC8qIENvbXB1dGUgZGlzdGFuY2VzICovCisgICAgICAgIAorICAgICAgICBkeE9sZCA9IHF1YWQyWzBdWzBdIC0gcXVhZDJbMV1bMF07CisgICAgICAgIGR5T2xkID0gcXVhZDJbMF1bMV0gLSBxdWFkMlsxXVsxXTsKKyAgICAgICAgZGlzdE9sZCA9IGR4T2xkKmR4T2xkICsgZHlPbGQqZHlPbGQ7CisgICAgICAgIAorICAgICAgICBkeE5ldyA9IHF1YWQyWzBdWzBdIC0gcG9pbnRiMi54OworICAgICAgICBkeU5ldyA9IHF1YWQyWzBdWzFdIC0gcG9pbnRiMi55OworICAgICAgICBkaXN0TmV3ID0gZHhOZXcqZHhOZXcgKyBkeU5ldypkeU5ldzsKKworICAgICAgICBpZiggZGlzdE5ldyA+IGRpc3RPbGQgKQorICAgICAgICB7LyogR2V0IG5ldyBwb2ludHMgZm9yIHNlY29uZCBxdWFkICovCisgICAgICAgICAgICBuZXdRdWFkMlsxXVswXSA9IHBvaW50YjIueDsKKyAgICAgICAgICAgIG5ld1F1YWQyWzFdWzFdID0gcG9pbnRiMi55OworICAgICAgICAgICAgbmV3UXVhZDJbMl1bMF0gPSBwb2ludGUyLng7CisgICAgICAgICAgICBuZXdRdWFkMlsyXVsxXSA9IHBvaW50ZTIueTsKKyAgICAgICAgICAgIG5ld1F1YWQxWzFdWzBdID0gcXVhZDFbMV1bMF07CisgICAgICAgICAgICBuZXdRdWFkMVsxXVsxXSA9IHF1YWQxWzFdWzFdOworICAgICAgICAgICAgbmV3UXVhZDFbMl1bMF0gPSBxdWFkMVsyXVswXTsKKyAgICAgICAgICAgIG5ld1F1YWQxWzJdWzFdID0gcXVhZDFbMl1bMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7LyogR2V0IG5ldyBwb2ludHMgZm9yIGZpcnN0IHF1YWQgKi8KKworICAgICAgICAgICAgcG9pbnRiMi54ID0gKGZsb2F0KXF1YWQyWzFdWzBdOworICAgICAgICAgICAgcG9pbnRiMi55ID0gKGZsb2F0KXF1YWQyWzFdWzFdOworCisgICAgICAgICAgICBwb2ludGUyLnggPSAoZmxvYXQpcXVhZDJbMl1bMF07CisgICAgICAgICAgICBwb2ludGUyLnkgPSAoZmxvYXQpcXVhZDJbMl1bMV07CisKKyAgICAgICAgICAgIGljdkNvbXB1dGVlSW5maW5pdGVQcm9qZWN0Mihjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1NYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRiMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGIyKTsKKworICAgICAgICAgICAgaWN2Q29tcHV0ZWVJbmZpbml0ZVByb2plY3QyKGNvbnZSb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZTIpOworCisgICAgICAgICAgICBuZXdRdWFkMlsxXVswXSA9IHF1YWQyWzFdWzBdOworICAgICAgICAgICAgbmV3UXVhZDJbMV1bMV0gPSBxdWFkMlsxXVsxXTsKKyAgICAgICAgICAgIG5ld1F1YWQyWzJdWzBdID0gcXVhZDJbMl1bMF07CisgICAgICAgICAgICBuZXdRdWFkMlsyXVsxXSA9IHF1YWQyWzJdWzFdOworICAgICAgICAgICAgCisgICAgICAgICAgICBuZXdRdWFkMVsxXVswXSA9IHBvaW50YjEueDsKKyAgICAgICAgICAgIG5ld1F1YWQxWzFdWzFdID0gcG9pbnRiMS55OworICAgICAgICAgICAgbmV3UXVhZDFbMl1bMF0gPSBwb2ludGUxLng7CisgICAgICAgICAgICBuZXdRdWFkMVsyXVsxXSA9IHBvaW50ZTEueTsKKyAgICAgICAgfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgICAgICAvKiBDb3B5IG5ldyBxdWFkcyB0byBvbGQgcXVhZCAqLworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBxdWFkMVtpXVswXSA9IG5ld1F1YWQxW2ldWzBdOworICAgICAgICAgICAgICAgIHF1YWQxW2ldWzFdID0gbmV3UXVhZDFbaV1bMV07CisgICAgICAgICAgICAgICAgcXVhZDJbaV1bMF0gPSBuZXdRdWFkMltpXVswXTsKKyAgICAgICAgICAgICAgICBxdWFkMltpXVsxXSA9IG5ld1F1YWQyW2ldWzFdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyAgICBkb3VibGUgd2FycFdpZHRoLHdhcnBIZWlnaHQ7CisKKyAgICB3YXJwV2lkdGggID0gTUFYKHdpZHRoMSx3aWR0aDIpOworICAgIHdhcnBIZWlnaHQgPSBNQVgoaGVpZ2h0MSxoZWlnaHQyKTsKKworICAgIHdhcnBTaXplLT53aWR0aCAgPSAoaW50KXdhcnBXaWR0aDsKKyAgICB3YXJwU2l6ZS0+aGVpZ2h0ID0gKGludCl3YXJwSGVpZ2h0OworCisgICAgd2FycFNpemUtPndpZHRoICA9IGN2Um91bmQod2FycFdpZHRoLTEpOworICAgIHdhcnBTaXplLT5oZWlnaHQgPSBjdlJvdW5kKHdhcnBIZWlnaHQtMSk7CisKKy8qICEhISBieSBWYWxlcnkgTW9zeWFnaW4uIHRoaXMgbGluZXMgYWRkZWQganVzdCBmb3IgdGVzdCBubyB3YXJwICovCisgICAgd2FycFNpemUtPndpZHRoICA9IGltYWdlU2l6ZS53aWR0aDsKKyAgICB3YXJwU2l6ZS0+aGVpZ2h0ID0gaW1hZ2VTaXplLmhlaWdodDsKKworICAgIHJldHVybjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQgaWN2R2V0UXVhZHNUcmFuc2Zvcm1OZXcoICBDdlNpemUgICAgICAgIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICByb3RNYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplKiAgICAgICB3YXJwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgICAgICAgIHF1YWQxWzRdWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAgICAgICAgcXVhZDJbNF1bMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmICAgICBmdW5kTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50M0QzMmYqIGVwaXBvbGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiogZXBpcG9sZTIKKyAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvKiBDb252ZXJ0IGRhdGEgKi8KKyAgICAvKiBDb252ZXJ0IGNhbWVyYSBtYXRyaXggKi8KKyAgICBkb3VibGUgY2FtTWF0cjFfNjRkWzldOworICAgIGRvdWJsZSBjYW1NYXRyMl82NGRbOV07CisgICAgZG91YmxlIHJvdE1hdHIxXzY0ZFs5XTsKKyAgICBkb3VibGUgdHJhbnNWZWN0MV82NGRbM107CisgICAgZG91YmxlIHJvdE1hdHIyXzY0ZFs5XTsKKyAgICBkb3VibGUgdHJhbnNWZWN0Ml82NGRbM107CisgICAgZG91YmxlIGZ1bmRNYXRyXzY0ZFs5XTsKKyAgICBDdlBvaW50M0Q2NGQgZXBpcG9sZTFfNjRkOworICAgIEN2UG9pbnQzRDY0ZCBlcGlwb2xlMl82NGQ7CisKKyAgICBpY3ZDdnRfMzJmXzY0ZChjYW1NYXRyMSxjYW1NYXRyMV82NGQsOSk7CisgICAgaWN2Q3Z0XzMyZl82NGQoY2FtTWF0cjIsY2FtTWF0cjJfNjRkLDkpOworICAgIGljdkN2dF8zMmZfNjRkKHJvdE1hdHIxLHJvdE1hdHIxXzY0ZCw5KTsKKyAgICBpY3ZDdnRfMzJmXzY0ZCh0cmFuc1ZlY3QxLHRyYW5zVmVjdDFfNjRkLDMpOworCisgICAgLyogQ3JlYXRlIHZlY3RvciBhbmQgbWF0cml4ICovCisKKyAgICByb3RNYXRyMl82NGRbMF0gPSAxOworICAgIHJvdE1hdHIyXzY0ZFsxXSA9IDA7CisgICAgcm90TWF0cjJfNjRkWzJdID0gMDsKKyAgICByb3RNYXRyMl82NGRbM10gPSAwOworICAgIHJvdE1hdHIyXzY0ZFs0XSA9IDE7CisgICAgcm90TWF0cjJfNjRkWzVdID0gMDsKKyAgICByb3RNYXRyMl82NGRbNl0gPSAwOworICAgIHJvdE1hdHIyXzY0ZFs3XSA9IDA7CisgICAgcm90TWF0cjJfNjRkWzhdID0gMTsKKworICAgIHRyYW5zVmVjdDJfNjRkWzBdID0gMDsKKyAgICB0cmFuc1ZlY3QyXzY0ZFsxXSA9IDA7CisgICAgdHJhbnNWZWN0Ml82NGRbMl0gPSAwOworCisgICAgaWN2R2V0UXVhZHNUcmFuc2Zvcm0oICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbU1hdHIxXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyMV82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0MV82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtTWF0cjJfNjRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHIyXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3QyXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5kTWF0cl82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVwaXBvbGUxXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXBpcG9sZTJfNjRkCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgLyogQ29udmVydCBlcGlwb2xlcyAqLworICAgIGVwaXBvbGUxLT54ID0gKGZsb2F0KShlcGlwb2xlMV82NGQueCk7CisgICAgZXBpcG9sZTEtPnkgPSAoZmxvYXQpKGVwaXBvbGUxXzY0ZC55KTsKKyAgICBlcGlwb2xlMS0+eiA9IChmbG9hdCkoZXBpcG9sZTFfNjRkLnopOworCisgICAgZXBpcG9sZTItPnggPSAoZmxvYXQpKGVwaXBvbGUyXzY0ZC54KTsKKyAgICBlcGlwb2xlMi0+eSA9IChmbG9hdCkoZXBpcG9sZTJfNjRkLnkpOworICAgIGVwaXBvbGUyLT56ID0gKGZsb2F0KShlcGlwb2xlMl82NGQueik7CisKKyAgICAvKiBDb252ZXJ0IGZ1bmRhbWVudGFsIG1hdHJpeCAqLworICAgIGljdkN2dF82NGRfMzJmKGZ1bmRNYXRyXzY0ZCxmdW5kTWF0ciw5KTsKKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaWN2R2V0UXVhZHNUcmFuc2Zvcm1TdHJ1Y3QoICBDdlN0ZXJlb0NhbWVyYSogc3RlcmVvQ2FtZXJhKQoreworICAgIC8qIFdyYXBwZXIgZm9yIGljdkdldFF1YWRzVHJhbnNmb3JtTmV3ICovCisKKworICAgIGRvdWJsZSAgcXVhZDFbNF1bMl07CisgICAgZG91YmxlICBxdWFkMls0XVsyXTsKKworICAgIGljdkdldFF1YWRzVHJhbnNmb3JtTmV3KCAgICAgY3ZTaXplKGN2Um91bmQoc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMF0tPmltZ1NpemVbMF0pLGN2Um91bmQoc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMF0tPmltZ1NpemVbMV0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9DYW1lcmEtPmNhbWVyYVswXS0+bWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb0NhbWVyYS0+Y2FtZXJhWzFdLT5tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ2FtZXJhLT5yb3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvQ2FtZXJhLT50cmFuc1ZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHN0ZXJlb0NhbWVyYS0+d2FycFNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb0NhbWVyYS0+ZnVuZE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihzdGVyZW9DYW1lcmEtPmVwaXBvbGVbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc3RlcmVvQ2FtZXJhLT5lcGlwb2xlWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgIHsKKyAgICAgICAgc3RlcmVvQ2FtZXJhLT5xdWFkWzBdW2ldID0gY3ZQb2ludDJEMzJmKHF1YWQxW2ldWzBdLHF1YWQxW2ldWzFdKTsKKyAgICAgICAgc3RlcmVvQ2FtZXJhLT5xdWFkWzFdW2ldID0gY3ZQb2ludDJEMzJmKHF1YWQyW2ldWzBdLHF1YWQyW2ldWzFdKTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaWN2Q29tcHV0ZVN0ZXJlb1BhcmFtc0ZvckNhbWVyYXMoQ3ZTdGVyZW9DYW1lcmEqIHN0ZXJlb0NhbWVyYSkKK3sKKyAgICAvKiBGb3IgZ2l2ZW4gaW50cmluc2ljIGFuZCBleHRyaW5zaWMgcGFyYW1ldGVycyBjb21wdXRlcyByZXN0IHBhcmFtZXRlcnMgCisgICAgKiogICBzdWNoIGFzIGZ1bmRhbWVudGFsIG1hdHJpeC4gd2FycGluZyBjb2VmZnMsIGVwaXBvbGVzLCAuLi4KKyAgICAqLworCisKKyAgICAvKiBjb21wdXRlIHJvdGF0ZSBtYXRyaXggYW5kIHRyYW5zbGF0ZSB2ZWN0b3IgKi8KKyAgICBkb3VibGUgcm90TWF0cjFbOV07CisgICAgZG91YmxlIHJvdE1hdHIyWzldOworCisgICAgZG91YmxlIHRyYW5zVmVjdDFbM107CisgICAgZG91YmxlIHRyYW5zVmVjdDJbM107CisKKyAgICBkb3VibGUgY29udlJvdE1hdHJbOV07CisgICAgZG91YmxlIGNvbnZUcmFuc1ZlY3RbM107CisKKyAgICAvKiBmaWxsIG1hdHJpY2VzICovCisgICAgaWN2Q3Z0XzMyZl82NGQoc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMF0tPnJvdE1hdHIscm90TWF0cjEsOSk7CisgICAgaWN2Q3Z0XzMyZl82NGQoc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMV0tPnJvdE1hdHIscm90TWF0cjIsOSk7CisKKyAgICBpY3ZDdnRfMzJmXzY0ZChzdGVyZW9DYW1lcmEtPmNhbWVyYVswXS0+dHJhbnNWZWN0LHRyYW5zVmVjdDEsMyk7CisgICAgaWN2Q3Z0XzMyZl82NGQoc3RlcmVvQ2FtZXJhLT5jYW1lcmFbMV0tPnRyYW5zVmVjdCx0cmFuc1ZlY3QyLDMpOworICAgICAgICAKKyAgICBpY3ZDcmVhdGVDb252ZXJ0TWF0clZlY3QoICAgcm90TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdCk7CisgICAgCisgICAgLyogY29weSB0byBzdGVyZW8gY2FtZXJhIHBhcmFtcyAqLworICAgIGljdkN2dF82NGRfMzJmKGNvbnZSb3RNYXRyLHN0ZXJlb0NhbWVyYS0+cm90TWF0cml4LDkpOworICAgIGljdkN2dF82NGRfMzJmKGNvbnZUcmFuc1ZlY3Qsc3RlcmVvQ2FtZXJhLT50cmFuc1ZlY3RvciwzKTsKKworCisgICAgaWN2R2V0UXVhZHNUcmFuc2Zvcm1TdHJ1Y3Qoc3RlcmVvQ2FtZXJhKTsKKyAgICBpY3ZDb21wdXRlUmVzdFN0ZXJlb1BhcmFtcyhzdGVyZW9DYW1lcmEpOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBHZXQgY3V0IGxpbmUgZm9yIG9uZSBpbWFnZSAqLwordm9pZCBpY3ZHZXRDdXRQaWVjZSggICBDdlZlY3Q2NGQgYXJlYUxpbmVDb2VmMSxDdlZlY3Q2NGQgYXJlYUxpbmVDb2VmMiwKKyAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRkIGVwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCogcG9pbnQxMSxDdlBvaW50MkQ2NGQqIHBvaW50MTIsCisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCogcG9pbnQyMSxDdlBvaW50MkQ2NGQqIHBvaW50MjIsCisgICAgICAgICAgICAgICAgICAgIGludCogcmVzdWx0KQoreworICAgIC8qIENvbXB1dGUgbmVhcmVzdCBjdXQgbGluZSB0byBlcGlwb2xlICovCisgICAgLyogR2V0IGNvcm5lcnMgaW5zaWRlIHNlY3RvciAqLworICAgIC8qIENvbGxlY3QgYWxsIGNhbmRpZGF0ZSBwb2ludCAqLworCisgICAgQ3ZQb2ludDJENjRkIGNhbmRQb2ludHNbOF07CisgICAgQ3ZQb2ludDJENjRkIG1pZFBvaW50OworICAgIGludCBudW1Qb2ludHMgPSAwOworICAgIGludCByZXM7CisgICAgaW50IGk7CisKKyAgICBkb3VibGUgY3V0TGluZTFbM107CisgICAgZG91YmxlIGN1dExpbmUyWzNdOworCisgICAgLyogRmluZCBtaWRkbGUgbGluZSBvZiBzZWN0b3IgKi8KKyAgICBkb3VibGUgbWlkTGluZVszXTsKKworICAgIAorICAgIC8qIERpZmZlcmVudCB3YXkgICovCisgICAgQ3ZQb2ludDJENjRkIHBvaW50T25MaW5lMTsgIHBvaW50T25MaW5lMS54ID0gcG9pbnRPbkxpbmUxLnkgPSAwOworICAgIEN2UG9pbnQyRDY0ZCBwb2ludE9uTGluZTI7ICBwb2ludE9uTGluZTIueCA9IHBvaW50T25MaW5lMi55ID0gMDsKKworICAgIEN2UG9pbnQyRDY0ZCBzdGFydDEsZW5kMTsKKworICAgIGljdkdldENyb3NzUmVjdERpcmVjdCggaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJlYUxpbmVDb2VmMVswXSxhcmVhTGluZUNvZWYxWzFdLGFyZWFMaW5lQ29lZjFbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAmc3RhcnQxLCZlbmQxLCZyZXMpOworICAgIGlmKCByZXMgPiAwICkKKyAgICB7CisgICAgICAgIHBvaW50T25MaW5lMSA9IHN0YXJ0MTsKKyAgICB9CisKKyAgICBpY3ZHZXRDcm9zc1JlY3REaXJlY3QoIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFMaW5lQ29lZjJbMF0sYXJlYUxpbmVDb2VmMlsxXSxhcmVhTGluZUNvZWYyWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXJ0MSwmZW5kMSwmcmVzKTsKKyAgICBpZiggcmVzID4gMCApCisgICAgeworICAgICAgICBwb2ludE9uTGluZTIgPSBzdGFydDE7CisgICAgfQorCisgICAgaWN2R2V0TWlkZGxlQW5nbGVQb2ludChlcGlwb2xlLHBvaW50T25MaW5lMSxwb2ludE9uTGluZTIsJm1pZFBvaW50KTsKKworICAgIGljdkdldENvZWZGb3JQaWVjZShlcGlwb2xlLG1pZFBvaW50LCZtaWRMaW5lWzBdLCZtaWRMaW5lWzFdLCZtaWRMaW5lWzJdLCZyZXMpOworCisgICAgLyogVGVzdCBjb3JuZXIgcG9pbnRzICovCisgICAgQ3ZQb2ludDJENjRkIGNvcm5lclBvaW50OworICAgIEN2UG9pbnQyRDY0ZCB0bXBQb2ludHNbMl07CisKKyAgICBjb3JuZXJQb2ludC54ID0gMDsKKyAgICBjb3JuZXJQb2ludC55ID0gMDsKKyAgICBpY3ZUZXN0UG9pbnQoIGNvcm5lclBvaW50LCBhcmVhTGluZUNvZWYxLCBhcmVhTGluZUNvZWYyLCBlcGlwb2xlLCAmcmVzKTsKKyAgICBpZiggcmVzID09IDEgKQorICAgIHsvKiBBZGQgcG9pbnQgKi8KKyAgICAgICAgY2FuZFBvaW50c1tudW1Qb2ludHNdID0gY29ybmVyUG9pbnQ7CisgICAgICAgIG51bVBvaW50cysrOworICAgIH0KKworICAgIGNvcm5lclBvaW50LnggPSBpbWFnZVNpemUud2lkdGg7CisgICAgY29ybmVyUG9pbnQueSA9IDA7CisgICAgaWN2VGVzdFBvaW50KCBjb3JuZXJQb2ludCwgYXJlYUxpbmVDb2VmMSwgYXJlYUxpbmVDb2VmMiwgZXBpcG9sZSwgJnJlcyk7CisgICAgaWYoIHJlcyA9PSAxICkKKyAgICB7LyogQWRkIHBvaW50ICovCisgICAgICAgIGNhbmRQb2ludHNbbnVtUG9pbnRzXSA9IGNvcm5lclBvaW50OworICAgICAgICBudW1Qb2ludHMrKzsKKyAgICB9CisgICAgCisgICAgY29ybmVyUG9pbnQueCA9IGltYWdlU2l6ZS53aWR0aDsKKyAgICBjb3JuZXJQb2ludC55ID0gaW1hZ2VTaXplLmhlaWdodDsKKyAgICBpY3ZUZXN0UG9pbnQoIGNvcm5lclBvaW50LCBhcmVhTGluZUNvZWYxLCBhcmVhTGluZUNvZWYyLCBlcGlwb2xlLCAmcmVzKTsKKyAgICBpZiggcmVzID09IDEgKQorICAgIHsvKiBBZGQgcG9pbnQgKi8KKyAgICAgICAgY2FuZFBvaW50c1tudW1Qb2ludHNdID0gY29ybmVyUG9pbnQ7CisgICAgICAgIG51bVBvaW50cysrOworICAgIH0KKworICAgIGNvcm5lclBvaW50LnggPSAwOworICAgIGNvcm5lclBvaW50LnkgPSBpbWFnZVNpemUuaGVpZ2h0OworICAgIGljdlRlc3RQb2ludCggY29ybmVyUG9pbnQsIGFyZWFMaW5lQ29lZjEsIGFyZWFMaW5lQ29lZjIsIGVwaXBvbGUsICZyZXMpOworICAgIGlmKCByZXMgPT0gMSApCisgICAgey8qIEFkZCBwb2ludCAqLworICAgICAgICBjYW5kUG9pbnRzW251bVBvaW50c10gPSBjb3JuZXJQb2ludDsKKyAgICAgICAgbnVtUG9pbnRzKys7CisgICAgfQorCisgICAgLyogRmluZCBjcm9zcyBsaW5lIDEgd2l0aCBpbWFnZSBib3JkZXIgKi8KKyAgICBpY3ZHZXRDcm9zc1JlY3REaXJlY3QoIGltYWdlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZWFMaW5lQ29lZjFbMF0sYXJlYUxpbmVDb2VmMVsxXSxhcmVhTGluZUNvZWYxWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFBvaW50c1swXSwgJnRtcFBvaW50c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZyZXMpOworICAgIGZvciggaSA9IDA7IGkgPCByZXM7IGkrKyApCisgICAgeworICAgICAgICBjYW5kUG9pbnRzW251bVBvaW50cysrXSA9IHRtcFBvaW50c1tpXTsKKyAgICB9CisKKyAgICAvKiBGaW5kIGNyb3NzIGxpbmUgMiB3aXRoIGltYWdlIGJvcmRlciAqLworICAgIGljdkdldENyb3NzUmVjdERpcmVjdCggaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgYXJlYUxpbmVDb2VmMlswXSxhcmVhTGluZUNvZWYyWzFdLGFyZWFMaW5lQ29lZjJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAmdG1wUG9pbnRzWzBdLCAmdG1wUG9pbnRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnJlcyk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IHJlczsgaSsrICkKKyAgICB7CisgICAgICAgIGNhbmRQb2ludHNbbnVtUG9pbnRzKytdID0gdG1wUG9pbnRzW2ldOworICAgIH0KKworICAgIGlmKCBudW1Qb2ludHMgPCAyICkKKyAgICB7CisgICAgICAgICpyZXN1bHQgPSAwOworICAgICAgICByZXR1cm47LyogRXJyb3IuIE5vdCBlbm91Z2h0IHBvaW50cyAqLworICAgIH0KKyAgICAvKiBQcm9qZWN0IGFsbCBwb2ludHMgdG8gbWlkZGxlIGxpbmUgYW5kIGdldCBtYXggYW5kIG1pbiAqLworCisgICAgQ3ZQb2ludDJENjRkIHByb2pQb2ludDsKKyAgICBDdlBvaW50MkQ2NGQgbWluUG9pbnQ7IG1pblBvaW50LnggPSBtaW5Qb2ludC55ID0gRkxUX01BWDsKKyAgICBDdlBvaW50MkQ2NGQgbWF4UG9pbnQ7IG1heFBvaW50LnggPSBtYXhQb2ludC55ID0gLUZMVF9NQVg7CisKKworICAgIGRvdWJsZSBkaXN0OworICAgIGRvdWJsZSBtYXhEaXN0ID0gMDsKKyAgICBkb3VibGUgbWluRGlzdCA9IDEwMDAwMDAwOworCisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGljdlByb2plY3RQb2ludFRvRGlyZWN0KGNhbmRQb2ludHNbaV0sIG1pZExpbmUsICZwcm9qUG9pbnQpOworICAgICAgICBpY3ZHZXRQaWVjZUxlbmd0aChlcGlwb2xlLHByb2pQb2ludCwmZGlzdCk7CisgICAgICAgIGlmKCBkaXN0IDwgbWluRGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWluRGlzdCA9IGRpc3Q7CisgICAgICAgICAgICBtaW5Qb2ludCA9IHByb2pQb2ludDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkaXN0ID4gbWF4RGlzdCkKKyAgICAgICAgeworICAgICAgICAgICAgbWF4RGlzdCA9IGRpc3Q7CisgICAgICAgICAgICBtYXhQb2ludCA9IHByb2pQb2ludDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFdlIGtub3cgbWF4aW11bSBhbmQgbWluaW11bSBwb2ludHMuIE5vdyB3ZSBjYW4gY29tcHV0ZSBjdXQgbGluZXMgKi8KKyAgICAKKyAgICBpY3ZHZXROb3JtYWxEaXJlY3QobWlkTGluZSxtaW5Qb2ludCxjdXRMaW5lMSk7CisgICAgaWN2R2V0Tm9ybWFsRGlyZWN0KG1pZExpbmUsbWF4UG9pbnQsY3V0TGluZTIpOworCisgICAgLyogVGVzdCBmb3IgYmVnaW4gb2YgbGluZS4gKi8KKyAgICBDdlBvaW50MkQ2NGQgdG1wUG9pbnQyOworCisgICAgLyogR2V0IGNyb3NzIHdpdGggKi8KKyAgICBpY3ZHZXRDcm9zc0RpcmVjdERpcmVjdChhcmVhTGluZUNvZWYxLGN1dExpbmUxLHBvaW50MTEsJnJlcyk7CisgICAgaWN2R2V0Q3Jvc3NEaXJlY3REaXJlY3QoYXJlYUxpbmVDb2VmMixjdXRMaW5lMSxwb2ludDEyLCZyZXMpOworCisgICAgaWN2R2V0Q3Jvc3NEaXJlY3REaXJlY3QoYXJlYUxpbmVDb2VmMSxjdXRMaW5lMixwb2ludDIxLCZyZXMpOworICAgIGljdkdldENyb3NzRGlyZWN0RGlyZWN0KGFyZWFMaW5lQ29lZjIsY3V0TGluZTIscG9pbnQyMiwmcmVzKTsKKworICAgIGlmKCBlcGlwb2xlLnggPiBpbWFnZVNpemUud2lkdGggKiAwLjUgKQorICAgIHsvKiBOZWVkIHRvIGNoYW5nZSBwb2ludHMgKi8KKyAgICAgICAgdG1wUG9pbnQyID0gKnBvaW50MTE7CisgICAgICAgICpwb2ludDExID0gKnBvaW50MjE7CisgICAgICAgICpwb2ludDIxID0gdG1wUG9pbnQyOworCisgICAgICAgIHRtcFBvaW50MiA9ICpwb2ludDEyOworICAgICAgICAqcG9pbnQxMiA9ICpwb2ludDIyOworICAgICAgICAqcG9pbnQyMiA9IHRtcFBvaW50MjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBHZXQgbWlkZGxlIGFuZ2xlICovCit2b2lkIGljdkdldE1pZGRsZUFuZ2xlUG9pbnQoICAgQ3ZQb2ludDJENjRkIGJhc2VQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQ2NGQgcG9pbnQxLEN2UG9pbnQyRDY0ZCBwb2ludDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJENjRkKiBtaWRQb2ludCkKK3svKiAhISEgTWF5IGJlIG5lZWQgdG8gcmV0dXJuIGVycm9yICovCisgICAgCisgICAgZG91YmxlIGRpc3QxOworICAgIGRvdWJsZSBkaXN0MjsKKyAgICBpY3ZHZXRQaWVjZUxlbmd0aChiYXNlUG9pbnQscG9pbnQxLCZkaXN0MSk7CisgICAgaWN2R2V0UGllY2VMZW5ndGgoYmFzZVBvaW50LHBvaW50MiwmZGlzdDIpOworICAgIEN2UG9pbnQyRDY0ZCBwb2ludE5ldzE7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50TmV3MjsKKyAgICBkb3VibGUgYWxwaGEgPSBkaXN0Mi9kaXN0MTsKKworICAgIHBvaW50TmV3MS54ID0gYmFzZVBvaW50LnggKyAoMS4wL2FscGhhKSAqICggcG9pbnQyLnggLSBiYXNlUG9pbnQueCApOworICAgIHBvaW50TmV3MS55ID0gYmFzZVBvaW50LnkgKyAoMS4wL2FscGhhKSAqICggcG9pbnQyLnkgLSBiYXNlUG9pbnQueSApOworCisgICAgcG9pbnROZXcyLnggPSBiYXNlUG9pbnQueCArIGFscGhhICogKCBwb2ludDEueCAtIGJhc2VQb2ludC54ICk7CisgICAgcG9pbnROZXcyLnkgPSBiYXNlUG9pbnQueSArIGFscGhhICogKCBwb2ludDEueSAtIGJhc2VQb2ludC55ICk7CisKKyAgICBpbnQgcmVzOworICAgIGljdkdldENyb3NzUGllY2VQaWVjZShwb2ludDEscG9pbnQyLHBvaW50TmV3MSxwb2ludE5ldzIsbWlkUG9pbnQsJnJlcyk7CisKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEdldCBub3JtYWwgZGlyZWN0IHRvIGRpcmVjdCBpbiBsaW5lICovCit2b2lkIGljdkdldE5vcm1hbERpcmVjdChDdlZlY3Q2NGQgZGlyZWN0LEN2UG9pbnQyRDY0ZCBwb2ludCxDdlZlY3Q2NGQgbm9ybURpcmVjdCkKK3sKKyAgICBub3JtRGlyZWN0WzBdID0gICBkaXJlY3RbMV07CisgICAgbm9ybURpcmVjdFsxXSA9IC0gZGlyZWN0WzBdOworICAgIG5vcm1EaXJlY3RbMl0gPSAtKG5vcm1EaXJlY3RbMF0qcG9pbnQueCArIG5vcm1EaXJlY3RbMV0qcG9pbnQueSk7ICAKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lNUEwgZG91YmxlIGljdkdldFZlY3QoQ3ZQb2ludDJENjRkIGJhc2VQb2ludCxDdlBvaW50MkQ2NGQgcG9pbnQxLEN2UG9pbnQyRDY0ZCBwb2ludDIpCit7CisgICAgcmV0dXJuICAocG9pbnQxLnggLSBiYXNlUG9pbnQueCkqKHBvaW50Mi55IC0gYmFzZVBvaW50LnkpIC0KKyAgICAgICAgICAgIChwb2ludDIueCAtIGJhc2VQb2ludC54KSoocG9pbnQxLnkgLSBiYXNlUG9pbnQueSk7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBUZXN0IGZvciBwb2ludCBpbiBzZWN0b3IgICAgICAgICAgICovCisvKiBSZXR1cm4gMCAtIHBvaW50IG5vdCBpbnNpZGUgc2VjdG9yICovCisvKiBSZXR1cm4gMSAtIHBvaW50IGluc2lkZSBzZWN0b3IgICAgICovCit2b2lkIGljdlRlc3RQb2ludCggQ3ZQb2ludDJENjRkIHRlc3RQb2ludCwKKyAgICAgICAgICAgICAgICBDdlZlY3Q2NGQgbGluZTEsQ3ZWZWN0NjRkIGxpbmUyLAorICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCBiYXNlUG9pbnQsCisgICAgICAgICAgICAgICAgaW50KiByZXN1bHQpCit7CisgICAgQ3ZQb2ludDJENjRkIHBvaW50MSxwb2ludDI7CisKKyAgICBpY3ZQcm9qZWN0UG9pbnRUb0RpcmVjdCh0ZXN0UG9pbnQsbGluZTEsJnBvaW50MSk7CisgICAgaWN2UHJvamVjdFBvaW50VG9EaXJlY3QodGVzdFBvaW50LGxpbmUyLCZwb2ludDIpOworCisgICAgZG91YmxlIHNpZ24xID0gaWN2R2V0VmVjdChiYXNlUG9pbnQscG9pbnQxLHBvaW50Mik7CisgICAgZG91YmxlIHNpZ24yID0gaWN2R2V0VmVjdChiYXNlUG9pbnQscG9pbnQxLHRlc3RQb2ludCk7CisgICAgaWYoIHNpZ24xICogc2lnbjIgPiAwICkKKyAgICB7LyogQ29ycmVjdCBmb3IgZmlyc3QgbGluZSAqLworICAgICAgICBzaWduMSA9IC0gc2lnbjE7CisgICAgICAgIHNpZ24yID0gaWN2R2V0VmVjdChiYXNlUG9pbnQscG9pbnQyLHRlc3RQb2ludCk7CisgICAgICAgIGlmKCBzaWduMSAqIHNpZ24yID4gMCApCisgICAgICAgIHsvKiBDb3JyZWN0IGZvciBib3RoIGxpbmVzICovCisgICAgICAgICAgICAqcmVzdWx0ID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZXN1bHQgPSAwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICpyZXN1bHQgPSAwOworICAgIH0KKyAgICAKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByb2plY3QgcG9pbnQgdG8gbGluZSAqLwordm9pZCBpY3ZQcm9qZWN0UG9pbnRUb0RpcmVjdCggIEN2UG9pbnQyRDY0ZCBwb2ludCxDdlZlY3Q2NGQgbGluZUNvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDY0ZCogcHJvamVjdFBvaW50KQoreworICAgIGRvdWJsZSBhID0gbGluZUNvZWZmWzBdOworICAgIGRvdWJsZSBiID0gbGluZUNvZWZmWzFdOworICAgIAorICAgIGRvdWJsZSBkZXQgPSAgMS4wIC8gKCBhKmEgKyBiKmIgKTsKKyAgICBkb3VibGUgZGVsdGEgPSAgYSpwb2ludC55IC0gYipwb2ludC54OworCisgICAgcHJvamVjdFBvaW50LT54ID0gKCAtYSpsaW5lQ29lZmZbMl0gLSBiICogZGVsdGEgKSAqIGRldDsKKyAgICBwcm9qZWN0UG9pbnQtPnkgPSAoIC1iKmxpbmVDb2VmZlsyXSArIGEgKiBkZWx0YSApICogZGV0IDsKKworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogR2V0IGRpc3RhbmNlIGZyb20gcG9pbnQgdG8gZGlyZWN0aW9uICovCit2b2lkIGljdkdldERpc3RhbmNlRnJvbVBvaW50VG9EaXJlY3QoIEN2UG9pbnQyRDY0ZCBwb2ludCxDdlZlY3Q2NGQgbGluZUNvZWYsZG91YmxlKmRpc3QpCit7CisgICAgQ3ZQb2ludDJENjRkIHRtcFBvaW50OworICAgIGljdlByb2plY3RQb2ludFRvRGlyZWN0KHBvaW50LGxpbmVDb2VmLCZ0bXBQb2ludCk7CisgICAgZG91YmxlIGR4ID0gcG9pbnQueCAtIHRtcFBvaW50Lng7CisgICAgZG91YmxlIGR5ID0gcG9pbnQueSAtIHRtcFBvaW50Lnk7CisgICAgKmRpc3QgPSBzcXJ0KGR4KmR4K2R5KmR5KTsKKyAgICByZXR1cm47Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NWX0lNUEwgSXBsSW1hZ2UqIGljdkNyZWF0ZUlzb21ldHJpY0ltYWdlKCBJcGxJbWFnZSogc3JjLCBJcGxJbWFnZSogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWRfZGVwdGgsIGludCBkZXNpcmVkX251bV9jaGFubmVscyApCit7CisgICAgQ3ZTaXplIHNyY19zaXplIDsKKyAgICBzcmNfc2l6ZS53aWR0aCA9IHNyYy0+d2lkdGg7CisgICAgc3JjX3NpemUuaGVpZ2h0ID0gc3JjLT5oZWlnaHQ7CisgICAgCisgICAgQ3ZTaXplIGRzdF9zaXplID0gc3JjX3NpemU7CisKKyAgICBpZiggZHN0ICkKKyAgICB7CisgICAgICAgIGRzdF9zaXplLndpZHRoID0gZHN0LT53aWR0aDsKKyAgICAgICAgZHN0X3NpemUuaGVpZ2h0ID0gZHN0LT5oZWlnaHQ7CisgICAgfQorCisgICAgaWYoICFkc3QgfHwgZHN0LT5kZXB0aCAhPSBkZXNpcmVkX2RlcHRoIHx8CisgICAgICAgIGRzdC0+bkNoYW5uZWxzICE9IGRlc2lyZWRfbnVtX2NoYW5uZWxzIHx8CisgICAgICAgIGRzdF9zaXplLndpZHRoICE9IHNyY19zaXplLndpZHRoIHx8CisgICAgICAgIGRzdF9zaXplLmhlaWdodCAhPSBkc3Rfc2l6ZS5oZWlnaHQgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZkc3QgKTsKKyAgICAgICAgZHN0ID0gY3ZDcmVhdGVJbWFnZSggc3JjX3NpemUsIGRlc2lyZWRfZGVwdGgsIGRlc2lyZWRfbnVtX2NoYW5uZWxzICk7CisgICAgICAgIEN2UmVjdCByZWN0ID0gY3ZSZWN0KDAsMCxzcmNfc2l6ZS53aWR0aCxzcmNfc2l6ZS5oZWlnaHQpOworICAgICAgICBjdlNldEltYWdlUk9JKCBkc3QsIHJlY3QgKTsKKworICAgIH0KKworICAgIHJldHVybiBkc3Q7Cit9CisKK2ludAoraWN2Q3Z0XzMyZl82NGQoIGZsb2F0ICpzcmMsIGRvdWJsZSAqZHN0LCBpbnQgc2l6ZSApCit7CisgICAgaW50IHQ7CisKKyAgICBpZiggIXNyYyB8fCAhZHN0ICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBzaXplIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworCisgICAgZm9yKCB0ID0gMDsgdCA8IHNpemU7IHQrKyApCisgICAgeworICAgICAgICBkc3RbdF0gPSAoZG91YmxlKSAoc3JjW3RdKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVHlwZSBjb252ZXJzaW9uIGRvdWJsZSAtPiBmbG9hdCAqLworaW50CitpY3ZDdnRfNjRkXzMyZiggZG91YmxlICpzcmMsIGZsb2F0ICpkc3QsIGludCBzaXplICkKK3sKKyAgICBpbnQgdDsKKworICAgIGlmKCAhc3JjIHx8ICFkc3QgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIHNpemUgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBmb3IoIHQgPSAwOyB0IDwgc2l6ZTsgdCsrICkKKyAgICB7CisgICAgICAgIGRzdFt0XSA9IChmbG9hdCkgKHNyY1t0XSk7CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qIEZpbmQgbGluZSB3aGljaCBjcm9zcyBmcmFtZSBieSBsaW5lKGEsYixjKSAqLwordm9pZCBGaW5kTGluZUZvckVwaWxpbmUoICAgIEN2U2l6ZSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYSxmbG9hdCBiLGZsb2F0IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmICpzdGFydCxDdlBvaW50MkQzMmYgKmVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQgPSByZXN1bHQ7CisgICAgQ3ZQb2ludDJEMzJmIGZyYW1lQmVnOworCisgICAgQ3ZQb2ludDJEMzJmIGZyYW1lRW5kOworICAgIEN2UG9pbnQyRDMyZiBjcm9zc1s0XTsKKyAgICBpbnQgICAgIGhhdmVDcm9zc1s0XTsKKyAgICBmbG9hdCAgIGRpc3Q7CisKKyAgICBoYXZlQ3Jvc3NbMF0gPSAwOworICAgIGhhdmVDcm9zc1sxXSA9IDA7CisgICAgaGF2ZUNyb3NzWzJdID0gMDsKKyAgICBoYXZlQ3Jvc3NbM10gPSAwOworCisgICAgZnJhbWVCZWcueCA9IDA7CisgICAgZnJhbWVCZWcueSA9IDA7CisgICAgZnJhbWVFbmQueCA9IChmbG9hdCkoaW1hZ2VTaXplLndpZHRoKTsKKyAgICBmcmFtZUVuZC55ID0gMDsKKyAgICBoYXZlQ3Jvc3NbMF0gPSBpY3ZHZXRDcm9zc0xpbmVEaXJlY3QoZnJhbWVCZWcsZnJhbWVFbmQsYSxiLGMsJmNyb3NzWzBdKTsKKyAgICAKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAwOworICAgIGZyYW1lRW5kLnggPSAoZmxvYXQpKGltYWdlU2l6ZS53aWR0aCk7CisgICAgZnJhbWVFbmQueSA9IChmbG9hdCkoaW1hZ2VTaXplLmhlaWdodCk7CisgICAgaGF2ZUNyb3NzWzFdID0gaWN2R2V0Q3Jvc3NMaW5lRGlyZWN0KGZyYW1lQmVnLGZyYW1lRW5kLGEsYixjLCZjcm9zc1sxXSk7CisKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGhhdmVDcm9zc1syXSA9IGljdkdldENyb3NzTGluZURpcmVjdChmcmFtZUJlZyxmcmFtZUVuZCxhLGIsYywmY3Jvc3NbMl0pOworICAgIAorICAgIGZyYW1lQmVnLnggPSAwOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAwOworICAgIGhhdmVDcm9zc1szXSA9IGljdkdldENyb3NzTGluZURpcmVjdChmcmFtZUJlZyxmcmFtZUVuZCxhLGIsYywmY3Jvc3NbM10pOworCisgICAgaW50IG47CisgICAgZmxvYXQgbWluRGlzdCA9IChmbG9hdCkoSU5UX01BWCk7CisgICAgZmxvYXQgbWF4RGlzdCA9IChmbG9hdCkoSU5UX01JTik7CisKKyAgICBpbnQgbWF4TiA9IC0xOworICAgIGludCBtaW5OID0gLTE7CisKKyAgICBkb3VibGUgbWlkUG9pbnRYID0gaW1hZ2VTaXplLndpZHRoICAvIDIuMDsKKyAgICBkb3VibGUgbWlkUG9pbnRZID0gaW1hZ2VTaXplLmhlaWdodCAvIDIuMDsKKworICAgIGZvciggbiA9IDA7IG4gPCA0OyBuKysgKQorICAgIHsKKyAgICAgICAgaWYoIGhhdmVDcm9zc1tuXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXN0ID0gIChmbG9hdCkoKG1pZFBvaW50WCAtIGNyb3NzW25dLngpKihtaWRQb2ludFggLSBjcm9zc1tuXS54KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pZFBvaW50WSAtIGNyb3NzW25dLnkpKihtaWRQb2ludFkgLSBjcm9zc1tuXS55KSk7CisKKyAgICAgICAgICAgIGlmKCBkaXN0IDwgbWluRGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWluRGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWluTiA9IG47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkaXN0ID4gbWF4RGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4RGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWF4TiA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbWluTiA+PSAwICYmIG1heE4gPj0gMCAmJiAobWluTiAhPSBtYXhOKSApCisgICAgeworICAgICAgICAqc3RhcnQgPSBjcm9zc1ttaW5OXTsKKyAgICAgICAgKmVuZCAgID0gY3Jvc3NbbWF4Tl07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXJ0LT54ID0gMDsKKyAgICAgICAgc3RhcnQtPnkgPSAwOworICAgICAgICBlbmQtPnggPSAwOworICAgICAgICBlbmQtPnkgPSAwOworICAgIH0KKworICAgIHJldHVybjsKKyAgICAKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgR2V0QW5nbGVMaW5lZSggQ3ZQb2ludDJEMzJmIGVwaXBvbGUsIEN2U2l6ZSBpbWFnZVNpemUsQ3ZQb2ludDJEMzJmIHBvaW50MSxDdlBvaW50MkQzMmYgcG9pbnQyKQoreworICAgIGZsb2F0IHdpZHRoICA9IChmbG9hdCkoaW1hZ2VTaXplLndpZHRoKTsKKyAgICBmbG9hdCBoZWlnaHQgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworCisgICAgLyogR2V0IGNyb3NzbGluZXMgd2l0aCBpbWFnZSBjb3JuZXJzICovCisKKyAgICAvKiBGaW5kIGZvdXIgbGluZXMgKi8KKworICAgIEN2UG9pbnQyRDMyZiBwYSxwYixwYyxwZDsKKyAgICAKKyAgICBwYS54ID0gMDsKKyAgICBwYS55ID0gMDsKKworICAgIHBiLnggPSB3aWR0aDsKKyAgICBwYi55ID0gMDsKKworICAgIHBkLnggPSB3aWR0aDsKKyAgICBwZC55ID0gaGVpZ2h0OworCisgICAgcGMueCA9IDA7CisgICAgcGMueSA9IGhlaWdodDsKKworICAgIC8qIFdlIGNhbiBjb21wdXRlIHBvaW50cyBmb3IgYW5nbGUgKi8KKyAgICAvKiBUZXN0IGZvciBwbGFjZSBzZWN0aW9uICovCisKKyAgICBmbG9hdCB4LHk7CisgICAgeCA9IGVwaXBvbGUueDsKKyAgICB5ID0gZXBpcG9sZS55OworICAgIAorICAgIGlmKCB4IDwgMCApCisgICAgey8qIDEsNCw3ICovCisgICAgICAgIGlmKCB5IDwgMCkKKyAgICAgICAgey8qIDEgKi8KKyAgICAgICAgICAgIHBvaW50MSA9IHBiOworICAgICAgICAgICAgcG9pbnQyID0gcGM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggeSA+IGhlaWdodCApCisgICAgICAgIHsvKiA3ICovCisgICAgICAgICAgICBwb2ludDEgPSBwYTsKKyAgICAgICAgICAgIHBvaW50MiA9IHBkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgey8qIDQgKi8KKyAgICAgICAgICAgIHBvaW50MSA9IHBhOworICAgICAgICAgICAgcG9pbnQyID0gcGM7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIHggPiB3aWR0aCApCisgICAgey8qIDMsNiw5ICovCisgICAgICAgIGlmKCB5IDwgMCApCisgICAgICAgIHsvKiAzICovCisgICAgICAgICAgICBwb2ludDEgPSBwYTsKKyAgICAgICAgICAgIHBvaW50MiA9IHBkOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB5ID4gaGVpZ2h0ICkKKyAgICAgICAgey8qIDkgKi8KKyAgICAgICAgICAgIHBvaW50MSA9IHBjOworICAgICAgICAgICAgcG9pbnQyID0gcGI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7LyogNiAqLworICAgICAgICAgICAgcG9pbnQxID0gcGI7CisgICAgICAgICAgICBwb2ludDIgPSBwZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgey8qIDIsNSw4ICovCisgICAgICAgIGlmKCB5IDwgMCApCisgICAgICAgIHsvKiAyICovCisgICAgICAgICAgICBwb2ludDEgPSBwYTsKKyAgICAgICAgICAgIHBvaW50MiA9IHBiOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHkgPiBoZWlnaHQgKQorICAgICAgICB7LyogOCAqLworICAgICAgICAgICAgcG9pbnQxID0gcGM7CisgICAgICAgICAgICBwb2ludDIgPSBwZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsvKiA1IC0gcG9pbnQgaW4gdGhlIGltYWdlICovCisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorCisgICAgICAgIAorICAgIH0KKyAgICAKKworICAgIHJldHVybiAwOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgaWN2Q29tcHV0ZVBlcnNwZWN0aXZlQ29lZmZzKGNvbnN0IEN2UG9pbnQyRDMyZiBzcmNRdWFkWzRdLGNvbnN0IEN2UG9pbnQyRDMyZiBkc3RRdWFkWzRdLGRvdWJsZSBjb2VmZnNbM11bM10pCit7LyogQ29tcHV0ZXMgcGVyc3BlY3RpdmUgY29lZmZzIGZvciB0cmFuc2Zvcm1hdGlvbiBmcm9tIHNyYyB0byBkc3QgcXVhZCAqLworCisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVQZXJzcGVjdGl2ZUNvZWZmcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBBWzY0XTsKKyAgICBkb3VibGUgYls4XTsKKyAgICBkb3VibGUgY1s4XTsKKyAgICBDdlBvaW50MkQzMmYgcHRbNF07CisgICAgaW50IGk7CisKKyAgICBwdFswXSA9IHNyY1F1YWRbMF07CisgICAgcHRbMV0gPSBzcmNRdWFkWzFdOworICAgIHB0WzJdID0gc3JjUXVhZFsyXTsKKyAgICBwdFszXSA9IHNyY1F1YWRbM107CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICB7CisjaWYgMAorICAgICAgICBkb3VibGUgeCA9IGRzdFF1YWRbaV0ueDsKKyAgICAgICAgZG91YmxlIHkgPSBkc3RRdWFkW2ldLnk7CisgICAgICAgIGRvdWJsZSBYID0gcHRbaV0ueDsKKyAgICAgICAgZG91YmxlIFkgPSBwdFtpXS55OworI2Vsc2UKKyAgICAgICAgZG91YmxlIHggPSBwdFtpXS54OworICAgICAgICBkb3VibGUgeSA9IHB0W2ldLnk7CisgICAgICAgIGRvdWJsZSBYID0gZHN0UXVhZFtpXS54OworICAgICAgICBkb3VibGUgWSA9IGRzdFF1YWRbaV0ueTsKKyNlbmRpZgorICAgICAgICBkb3VibGUqIGEgPSBBICsgaSoxNjsKKyAgICAgICAgCisgICAgICAgIGFbMF0gPSB4OworICAgICAgICBhWzFdID0geTsKKyAgICAgICAgYVsyXSA9IDE7CisgICAgICAgIGFbM10gPSAwOworICAgICAgICBhWzRdID0gMDsKKyAgICAgICAgYVs1XSA9IDA7CisgICAgICAgIGFbNl0gPSAtWCp4OworICAgICAgICBhWzddID0gLVgqeTsKKworICAgICAgICBhICs9IDg7CisKKyAgICAgICAgYVswXSA9IDA7CisgICAgICAgIGFbMV0gPSAwOworICAgICAgICBhWzJdID0gMDsKKyAgICAgICAgYVszXSA9IHg7CisgICAgICAgIGFbNF0gPSB5OworICAgICAgICBhWzVdID0gMTsKKyAgICAgICAgYVs2XSA9IC1ZKng7CisgICAgICAgIGFbN10gPSAtWSp5OworCisgICAgICAgIGJbaSoyXSA9IFg7CisgICAgICAgIGJbaSoyICsgMV0gPSBZOworICAgIH0KKworICAgIHsKKyAgICBkb3VibGUgaW52QVs2NF07CisgICAgQ3ZNYXQgbWF0QSA9IGN2TWF0KCA4LCA4LCBDVl82NEYsIEEgKTsKKyAgICBDdk1hdCBtYXRJbnZBID0gY3ZNYXQoIDgsIDgsIENWXzY0RiwgaW52QSApOworICAgIEN2TWF0IG1hdEIgPSBjdk1hdCggOCwgMSwgQ1ZfNjRGLCBiICk7CisgICAgQ3ZNYXQgbWF0WCA9IGN2TWF0KCA4LCAxLCBDVl82NEYsIGMgKTsKKworICAgIENWX0NBTEwoIGN2UHNldWRvSW52ZXJzZSggJm1hdEEsICZtYXRJbnZBICkpOworICAgIENWX0NBTEwoIGN2TWF0TXVsQWRkKCAmbWF0SW52QSwgJm1hdEIsIDAsICZtYXRYICkpOworICAgIH0KKyAgICAKKyAgICBjb2VmZnNbMF1bMF0gPSBjWzBdOworICAgIGNvZWZmc1swXVsxXSA9IGNbMV07CisgICAgY29lZmZzWzBdWzJdID0gY1syXTsKKyAgICBjb2VmZnNbMV1bMF0gPSBjWzNdOworICAgIGNvZWZmc1sxXVsxXSA9IGNbNF07CisgICAgY29lZmZzWzFdWzJdID0gY1s1XTsKKyAgICBjb2VmZnNbMl1bMF0gPSBjWzZdOworICAgIGNvZWZmc1syXVsxXSA9IGNbN107CisgICAgY29lZmZzWzJdWzJdID0gMS4wOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybjsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK0NWX0lNUEwgdm9pZCBjdkNvbXB1dGVQZXJzcGVjdGl2ZU1hcChjb25zdCBkb3VibGUgY1szXVszXSwgQ3ZBcnIqIHJlY3RNYXBYLCBDdkFyciogcmVjdE1hcFkgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb21wdXRlUGVyc3BlY3RpdmVNYXAiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBDdk1hdCAgc3R1YngsICptYXB4ID0gKEN2TWF0KilyZWN0TWFwWDsKKyAgICBDdk1hdCAgc3R1YnksICptYXB5ID0gKEN2TWF0KilyZWN0TWFwWTsKKyAgICBpbnQgaSwgajsKKworICAgIENWX0NBTEwoIG1hcHggPSBjdkdldE1hdCggbWFweCwgJnN0dWJ4ICkpOworICAgIENWX0NBTEwoIG1hcHkgPSBjdkdldE1hdCggbWFweSwgJnN0dWJ5ICkpOworCisgICAgaWYoIENWX01BVF9UWVBFKCBtYXB4LT50eXBlICkgIT0gQ1ZfMzJGQzEgfHwgQ1ZfTUFUX1RZUEUoIG1hcHktPnR5cGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUobWFweCk7CisgICAgYXNzZXJ0KCBmYWJzKGNbMl1bMl0gLSAxLikgPCBGTFRfRVBTSUxPTiApOworICAgIAorICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrICkKKyAgICB7CisgICAgICAgIGZsb2F0KiBteCA9IChmbG9hdCopKG1hcHgtPmRhdGEucHRyICsgbWFweC0+c3RlcCppKTsKKyAgICAgICAgZmxvYXQqIG15ID0gKGZsb2F0KikobWFweS0+ZGF0YS5wdHIgKyBtYXB5LT5zdGVwKmkpOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdyA9IDEuLyhjWzJdWzBdKmogKyBjWzJdWzFdKmkgKyAxLik7CisgICAgICAgICAgICBkb3VibGUgeCA9IChjWzBdWzBdKmogKyBjWzBdWzFdKmkgKyBjWzBdWzJdKSp3OworICAgICAgICAgICAgZG91YmxlIHkgPSAoY1sxXVswXSpqICsgY1sxXVsxXSppICsgY1sxXVsyXSkqdzsKKworICAgICAgICAgICAgbXhbal0gPSAoZmxvYXQpeDsKKyAgICAgICAgICAgIG15W2pdID0gKGZsb2F0KXk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworQ1ZfSU1QTCB2b2lkIGN2SW5pdFBlcnNwZWN0aXZlVHJhbnNmb3JtKCBDdlNpemUgc2l6ZSwgY29uc3QgQ3ZQb2ludDJEMzJmIHF1YWRbNF0sIGRvdWJsZSBtYXRyaXhbM11bM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIHJlY3RNYXAgKQoreworICAgIC8qIENvbXB1dGVzIFBlcnNwZWN0aXZlIFRyYW5zZm9ybSBjb2VmZnMgYW5kIG1hcCBpZiBuZWVkCisgICAgICAgIGZvciBnaXZlbiBpbWFnZSBzaXplIGFuZCBnaXZlbiByZXN1bHQgcXVhZCAqLworICAgIENWX0ZVTkNOQU1FKCAiY3ZJbml0UGVyc3BlY3RpdmVUcmFuc2Zvcm0iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgQVs2NF07CisgICAgZG91YmxlIGJbOF07CisgICAgZG91YmxlIGNbOF07CisgICAgQ3ZQb2ludDJEMzJmIHB0WzRdOworICAgIEN2TWF0ICBtYXBzdHViLCAqbWFwID0gKEN2TWF0KilyZWN0TWFwOworICAgIGludCBpLCBqOworCisgICAgaWYoIG1hcCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtYXAgPSBjdkdldE1hdCggbWFwLCAmbWFwc3R1YiApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoIG1hcC0+dHlwZSApICE9IENWXzMyRkMyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBpZiggbWFwLT53aWR0aCAhPSBzaXplLndpZHRoIHx8IG1hcC0+aGVpZ2h0ICE9IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICB9CisKKyAgICBwdFswXSA9IGN2UG9pbnQyRDMyZiggMCwgMCApOworICAgIHB0WzFdID0gY3ZQb2ludDJEMzJmKCBzaXplLndpZHRoLCAwICk7CisgICAgcHRbMl0gPSBjdlBvaW50MkQzMmYoIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICk7CisgICAgcHRbM10gPSBjdlBvaW50MkQzMmYoIDAsIHNpemUuaGVpZ2h0ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICB7CisjaWYgMAorICAgICAgICBkb3VibGUgeCA9IHF1YWRbaV0ueDsKKyAgICAgICAgZG91YmxlIHkgPSBxdWFkW2ldLnk7CisgICAgICAgIGRvdWJsZSBYID0gcHRbaV0ueDsKKyAgICAgICAgZG91YmxlIFkgPSBwdFtpXS55OworI2Vsc2UKKyAgICAgICAgZG91YmxlIHggPSBwdFtpXS54OworICAgICAgICBkb3VibGUgeSA9IHB0W2ldLnk7CisgICAgICAgIGRvdWJsZSBYID0gcXVhZFtpXS54OworICAgICAgICBkb3VibGUgWSA9IHF1YWRbaV0ueTsKKyNlbmRpZgorICAgICAgICBkb3VibGUqIGEgPSBBICsgaSoxNjsKKyAgICAgICAgCisgICAgICAgIGFbMF0gPSB4OworICAgICAgICBhWzFdID0geTsKKyAgICAgICAgYVsyXSA9IDE7CisgICAgICAgIGFbM10gPSAwOworICAgICAgICBhWzRdID0gMDsKKyAgICAgICAgYVs1XSA9IDA7CisgICAgICAgIGFbNl0gPSAtWCp4OworICAgICAgICBhWzddID0gLVgqeTsKKworICAgICAgICBhICs9IDg7CisKKyAgICAgICAgYVswXSA9IDA7CisgICAgICAgIGFbMV0gPSAwOworICAgICAgICBhWzJdID0gMDsKKyAgICAgICAgYVszXSA9IHg7CisgICAgICAgIGFbNF0gPSB5OworICAgICAgICBhWzVdID0gMTsKKyAgICAgICAgYVs2XSA9IC1ZKng7CisgICAgICAgIGFbN10gPSAtWSp5OworCisgICAgICAgIGJbaSoyXSA9IFg7CisgICAgICAgIGJbaSoyICsgMV0gPSBZOworICAgIH0KKworICAgIHsKKyAgICBkb3VibGUgaW52QVs2NF07CisgICAgQ3ZNYXQgbWF0QSA9IGN2TWF0KCA4LCA4LCBDVl82NEYsIEEgKTsKKyAgICBDdk1hdCBtYXRJbnZBID0gY3ZNYXQoIDgsIDgsIENWXzY0RiwgaW52QSApOworICAgIEN2TWF0IG1hdEIgPSBjdk1hdCggOCwgMSwgQ1ZfNjRGLCBiICk7CisgICAgQ3ZNYXQgbWF0WCA9IGN2TWF0KCA4LCAxLCBDVl82NEYsIGMgKTsKKworICAgIENWX0NBTEwoIGN2UHNldWRvSW52ZXJzZSggJm1hdEEsICZtYXRJbnZBICkpOworICAgIENWX0NBTEwoIGN2TWF0TXVsQWRkKCAmbWF0SW52QSwgJm1hdEIsIDAsICZtYXRYICkpOworICAgIH0KKyAgICAKKyAgICBtYXRyaXhbMF1bMF0gPSBjWzBdOworICAgIG1hdHJpeFswXVsxXSA9IGNbMV07CisgICAgbWF0cml4WzBdWzJdID0gY1syXTsKKyAgICBtYXRyaXhbMV1bMF0gPSBjWzNdOworICAgIG1hdHJpeFsxXVsxXSA9IGNbNF07CisgICAgbWF0cml4WzFdWzJdID0gY1s1XTsKKyAgICBtYXRyaXhbMl1bMF0gPSBjWzZdOworICAgIG1hdHJpeFsyXVsxXSA9IGNbN107CisgICAgbWF0cml4WzJdWzJdID0gMS4wOworCisgICAgaWYoIG1hcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogbWFwcm93ID0gKEN2UG9pbnQyRDMyZiopKG1hcC0+ZGF0YS5wdHIgKyBtYXAtPnN0ZXAqaSk7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdyA9IDEuLyhjWzZdKmogKyBjWzddKmkgKyAxLik7CisgICAgICAgICAgICAgICAgZG91YmxlIHggPSAoY1swXSpqICsgY1sxXSppICsgY1syXSkqdzsKKyAgICAgICAgICAgICAgICBkb3VibGUgeSA9IChjWzNdKmogKyBjWzRdKmkgKyBjWzVdKSp3OworCisgICAgICAgICAgICAgICAgbWFwcm93W2pdLnggPSAoZmxvYXQpeDsKKyAgICAgICAgICAgICAgICBtYXByb3dbal0ueSA9IChmbG9hdCl5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIENvbXB1dGUgcHJvamVjdGVkIGluZmluaXRlIHBvaW50IGZvciBzZWNvbmQgaW1hZ2UgaWYgZmlyc3QgaW1hZ2UgcG9pbnQgaXMga25vd24gKi8KK3ZvaWQgaWN2Q29tcHV0ZWVJbmZpbml0ZVByb2plY3QxKCAgIEN2TWF0cjY0ZCAgICAgcm90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY2FtTWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHI2NGQgICAgIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmICBwb2ludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHBvaW50MikKK3sKKyAgICBkb3VibGUgaW52TWF0cjFbOV07CisgICAgaWN2SW52ZXJ0TWF0cml4XzY0ZChjYW1NYXRyMSwzLGludk1hdHIxKTsKKyAgICBkb3VibGUgUDFbM107CisgICAgZG91YmxlIHAxWzNdOworICAgIHAxWzBdID0gKGRvdWJsZSkocG9pbnQxLngpOworICAgIHAxWzFdID0gKGRvdWJsZSkocG9pbnQxLnkpOworICAgIHAxWzJdID0gMTsKKworICAgIGljdk11bE1hdHJpeF82NGQoICAgaW52TWF0cjEsCisgICAgICAgICAgICAgICAgICAgICAgICAzLDMsCisgICAgICAgICAgICAgICAgICAgICAgICBwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsMywgCisgICAgICAgICAgICAgICAgICAgICAgICBQMSk7CisKKyAgICBkb3VibGUgaW52Uls5XTsKKyAgICBpY3ZUcmFuc3Bvc2VNYXRyaXhfNjRkKCByb3RNYXRyLCAzLCAzLCBpbnZSICk7CisKKyAgICAvKiBDaGFuZ2Ugc3lzdGVtIDEgdG8gc3lzdGVtIDIgKi8KKyAgICBkb3VibGUgUDJbM107CisgICAgaWN2TXVsTWF0cml4XzY0ZCggICBpbnZSLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgUDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxLDMsIAorICAgICAgICAgICAgICAgICAgICAgICAgUDIpOworCisgICAgLyogTm93IHdlIGNhbiBwcm9qZWN0IHRoaXMgcG9pbnQgdG8gaW1hZ2UgMiAqLworICAgIGRvdWJsZSBwcm9qUFszXTsKKworICAgIGljdk11bE1hdHJpeF82NGQoICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAzLDMsCisgICAgICAgICAgICAgICAgICAgICAgICBQMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEsMywgCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9qUCk7CisKKyAgICBwb2ludDItPnggPSAoZmxvYXQpKHByb2pQWzBdIC8gcHJvalBbMl0pOworICAgIHBvaW50Mi0+eSA9IChmbG9hdCkocHJvalBbMV0gLyBwcm9qUFsyXSk7CisKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ29tcHV0ZSBwcm9qZWN0ZWQgaW5maW5pdGUgcG9pbnQgZm9yIHNlY29uZCBpbWFnZSBpZiBmaXJzdCBpbWFnZSBwb2ludCBpcyBrbm93biAqLwordm9pZCBpY3ZDb21wdXRlZUluZmluaXRlUHJvamVjdDIoICAgQ3ZNYXRyNjRkICAgICByb3RNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyNjRkICAgICBjYW1NYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCAgICAgY2FtTWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqICBwb2ludDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYgcG9pbnQyKQoreworICAgIGRvdWJsZSBpbnZNYXRyMls5XTsKKyAgICBpY3ZJbnZlcnRNYXRyaXhfNjRkKGNhbU1hdHIyLDMsaW52TWF0cjIpOworICAgIGRvdWJsZSBQMlszXTsKKyAgICBkb3VibGUgcDJbM107CisgICAgcDJbMF0gPSAoZG91YmxlKShwb2ludDIueCk7CisgICAgcDJbMV0gPSAoZG91YmxlKShwb2ludDIueSk7CisgICAgcDJbMl0gPSAxOworCisgICAgaWN2TXVsTWF0cml4XzY0ZCggICBpbnZNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDMsMywKKyAgICAgICAgICAgICAgICAgICAgICAgIHAyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFAyKTsKKworICAgIC8qIENoYW5nZSBzeXN0ZW0gMSB0byBzeXN0ZW0gMiAqLworCisgICAgZG91YmxlIFAxWzNdOworICAgIGljdk11bE1hdHJpeF82NGQoICAgcm90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIDMsMywKKyAgICAgICAgICAgICAgICAgICAgICAgIFAyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIFAxKTsKKworICAgIC8qIE5vdyB3ZSBjYW4gcHJvamVjdCB0aGlzIHBvaW50IHRvIGltYWdlIDIgKi8KKyAgICBkb3VibGUgcHJvalBbM107CisKKyAgICBpY3ZNdWxNYXRyaXhfNjRkKCAgIGNhbU1hdHIxLAorICAgICAgICAgICAgICAgICAgICAgICAgMywzLAorICAgICAgICAgICAgICAgICAgICAgICAgUDEsCisgICAgICAgICAgICAgICAgICAgICAgICAxLDMsIAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvalApOworCisgICAgcG9pbnQxLT54ID0gKGZsb2F0KShwcm9qUFswXSAvIHByb2pQWzJdKTsKKyAgICBwb2ludDEtPnkgPSAoZmxvYXQpKHByb2pQWzFdIC8gcHJvalBbMl0pOworCisgICAgcmV0dXJuOworfQorCisvKiBTZWxlY3QgYmVzdCBSIGFuZCB0IGZvciBnaXZlbiBjYW1lcmFzLCBwb2ludHMsIC4uLiAqLworLyogRm9yIGJvdGggY2FtZXJhcyAqLworaW50IGljdlNlbGVjdEJlc3RSdCggICAgICAgICAgIGludCAgICAgICAgICAgbnVtSW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiAgICAgICAgICBudW1Qb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGltYWdlUG9pbnRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogaW1hZ2VQb2ludHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBvYmplY3RQb2ludHMsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgY2FtZXJhTWF0cml4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgZGlzdG9ydGlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIHJvdE1hdHJzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgdHJhbnNWZWN0czEsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgY2FtZXJhTWF0cml4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgZGlzdG9ydGlvbjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgICAgIHJvdE1hdHJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiAgICAgdHJhbnNWZWN0czIsCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiAgICAgYmVzdFJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgICAgIGJlc3RUcmFuc1ZlY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKK3sKKworICAgIC8qIE5lZWQgdG8gY29udmVydCBpbnB1dCBkYXRhIDMyIC0+IDY0ICovCisgICAgQ3ZQb2ludDNENjRkKiBvYmplY3RQb2ludHNfNjRkOworICAgIAorICAgIGRvdWJsZSogcm90TWF0cnMxXzY0ZDsKKyAgICBkb3VibGUqIHJvdE1hdHJzMl82NGQ7CisKKyAgICBkb3VibGUqIHRyYW5zVmVjdHMxXzY0ZDsKKyAgICBkb3VibGUqIHRyYW5zVmVjdHMyXzY0ZDsKKworICAgIGRvdWJsZSBjYW1lcmFNYXRyaXgxXzY0ZFs5XTsKKyAgICBkb3VibGUgY2FtZXJhTWF0cml4Ml82NGRbOV07CisKKyAgICBkb3VibGUgZGlzdG9ydGlvbjFfNjRkWzRdOworICAgIGRvdWJsZSBkaXN0b3J0aW9uMl82NGRbNF07CisKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIDY0ZCBkYXRhICovCisgICAgaW50IHRvdGFsTnVtID0gMDsKKworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBudW1JbWFnZXM7IGkrKyApCisgICAgeworICAgICAgICB0b3RhbE51bSArPSBudW1Qb2ludHNbaV07CisgICAgfQorCisgICAgb2JqZWN0UG9pbnRzXzY0ZCA9IChDdlBvaW50M0Q2NGQqKWNhbGxvYyh0b3RhbE51bSxzaXplb2YoQ3ZQb2ludDNENjRkKSk7CisgICAgCisgICAgcm90TWF0cnMxXzY0ZCAgICA9IChkb3VibGUqKWNhbGxvYyhudW1JbWFnZXMsc2l6ZW9mKGRvdWJsZSkqOSk7CisgICAgcm90TWF0cnMyXzY0ZCAgICA9IChkb3VibGUqKWNhbGxvYyhudW1JbWFnZXMsc2l6ZW9mKGRvdWJsZSkqOSk7CisKKyAgICB0cmFuc1ZlY3RzMV82NGQgID0gKGRvdWJsZSopY2FsbG9jKG51bUltYWdlcyxzaXplb2YoZG91YmxlKSozKTsKKyAgICB0cmFuc1ZlY3RzMl82NGQgID0gKGRvdWJsZSopY2FsbG9jKG51bUltYWdlcyxzaXplb2YoZG91YmxlKSozKTsKKworICAgIC8qIENvbnZlcnQgaW5wdXQgZGF0YSB0byA2NGQgKi8KKyAgICAKKyAgICBpY3ZDdnRfMzJmXzY0ZCgoZmxvYXQqKW9iamVjdFBvaW50cywgKGRvdWJsZSopb2JqZWN0UG9pbnRzXzY0ZCwgIHRvdGFsTnVtKjMpOworCisgICAgaWN2Q3Z0XzMyZl82NGQocm90TWF0cnMxLCByb3RNYXRyczFfNjRkLCAgbnVtSW1hZ2VzKjkpOworICAgIGljdkN2dF8zMmZfNjRkKHJvdE1hdHJzMiwgcm90TWF0cnMyXzY0ZCwgIG51bUltYWdlcyo5KTsKKworICAgIGljdkN2dF8zMmZfNjRkKHRyYW5zVmVjdHMxLCB0cmFuc1ZlY3RzMV82NGQsICBudW1JbWFnZXMqMyk7CisgICAgaWN2Q3Z0XzMyZl82NGQodHJhbnNWZWN0czIsIHRyYW5zVmVjdHMyXzY0ZCwgIG51bUltYWdlcyozKTsKKworICAgIC8qIENvbnZlcnQgdG8gYXJyYXlzICovCisgICAgaWN2Q3Z0XzMyZl82NGQoY2FtZXJhTWF0cml4MSwgY2FtZXJhTWF0cml4MV82NGQsIDkpOworICAgIGljdkN2dF8zMmZfNjRkKGNhbWVyYU1hdHJpeDIsIGNhbWVyYU1hdHJpeDJfNjRkLCA5KTsKKworICAgIGljdkN2dF8zMmZfNjRkKGRpc3RvcnRpb24xLCBkaXN0b3J0aW9uMV82NGQsIDQpOworICAgIGljdkN2dF8zMmZfNjRkKGRpc3RvcnRpb24yLCBkaXN0b3J0aW9uMl82NGQsIDQpOworCisKKyAgICAvKiBmb3IgZWFjaCBSIGFuZCB0IGNvbXB1dGUgZXJyb3IgZm9yIGltYWdlIHBhaXIgKi8KKyAgICBmbG9hdCogZXJyb3JzOworCisgICAgZXJyb3JzID0gKGZsb2F0KiljYWxsb2MobnVtSW1hZ2VzKm51bUltYWdlcyxzaXplb2YoZmxvYXQpKTsKKyAgICBpZiggZXJyb3JzID09IDAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKyAgICB9CisKKyAgICBpbnQgY3VyckltYWdlUGFpcjsKKyAgICBpbnQgY3VyclJ0OworICAgIGZvciggY3VyclJ0ID0gMDsgY3VyclJ0IDwgbnVtSW1hZ2VzOyBjdXJyUnQrKyApCisgICAgeworICAgICAgICBpbnQgYmVnUG9pbnQgPSAwOyAKKyAgICAgICAgZm9yKGN1cnJJbWFnZVBhaXIgPSAwOyBjdXJySW1hZ2VQYWlyIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2VQYWlyKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBGb3IgY3VycmVudCBSLHQgUix0IGNvbXB1dGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgY2FtZXJhcyAqLworCisgICAgICAgICAgICBkb3VibGUgY29udlJvdE1hdHJbOV07CisgICAgICAgICAgICBkb3VibGUgY29udlRyYW5zVmVjdFszXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWN2Q3JlYXRlQ29udmVydE1hdHJWZWN0KCByb3RNYXRyczFfNjRkICsgY3VyclJ0KjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdHMxXzY0ZCArIGN1cnJSdCozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyczJfNjRkICsgY3VyclJ0KjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdHMyXzY0ZCArIGN1cnJSdCozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252Um90TWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdCk7CisKKyAgICAgICAgICAgIC8qIFByb2plY3QgcG9pbnRzIHVzaW5nIHJlbGF0aXZlIHBvc2l0aW9uIG9mIGNhbWVyYXMgKi8KKworICAgICAgICAgICAgZG91YmxlIGNvbnZSb3RNYXRyMls5XTsKKyAgICAgICAgICAgIGRvdWJsZSBjb252VHJhbnNWZWN0MlszXTsKKworICAgICAgICAgICAgY29udlJvdE1hdHIyWzBdID0gMTsKKyAgICAgICAgICAgIGNvbnZSb3RNYXRyMlsxXSA9IDA7CisgICAgICAgICAgICBjb252Um90TWF0cjJbMl0gPSAwOworCisgICAgICAgICAgICBjb252Um90TWF0cjJbM10gPSAwOworICAgICAgICAgICAgY29udlJvdE1hdHIyWzRdID0gMTsKKyAgICAgICAgICAgIGNvbnZSb3RNYXRyMls1XSA9IDA7CisKKyAgICAgICAgICAgIGNvbnZSb3RNYXRyMls2XSA9IDA7CisgICAgICAgICAgICBjb252Um90TWF0cjJbN10gPSAwOworICAgICAgICAgICAgY29udlJvdE1hdHIyWzhdID0gMTsKKworICAgICAgICAgICAgY29udlRyYW5zVmVjdDJbMF0gPSAwOworICAgICAgICAgICAgY29udlRyYW5zVmVjdDJbMV0gPSAwOworICAgICAgICAgICAgY29udlRyYW5zVmVjdDJbMl0gPSAwOworCisgICAgICAgICAgICAvKiBDb21wdXRlIGVycm9yIGZvciBnaXZlbiBwYWlyIGFuZCBSdCAqLworICAgICAgICAgICAgLyogV2UgbXVzdCBwcm9qZWN0IHBvaW50cyB0byBpbWFnZSBhbmQgY29tcHV0ZSBlcnJvciAqLworCisgICAgICAgICAgICBDdlBvaW50MkQ2NGQqIHByb2pJbWFnZVBvaW50czE7CisgICAgICAgICAgICBDdlBvaW50MkQ2NGQqIHByb2pJbWFnZVBvaW50czI7CisKKyAgICAgICAgICAgIEN2UG9pbnQzRDY0ZCogcG9pbnRzMTsKKyAgICAgICAgICAgIEN2UG9pbnQzRDY0ZCogcG9pbnRzMjsKKworICAgICAgICAgICAgaW50IG51bWJlclBudDsKKyAgICAgICAgICAgIG51bWJlclBudCA9IG51bVBvaW50c1tjdXJySW1hZ2VQYWlyXTsKKyAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czEgPSAoQ3ZQb2ludDJENjRkKiljYWxsb2MobnVtYmVyUG50LHNpemVvZihDdlBvaW50MkQ2NGQpKTsKKyAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czIgPSAoQ3ZQb2ludDJENjRkKiljYWxsb2MobnVtYmVyUG50LHNpemVvZihDdlBvaW50MkQ2NGQpKTsKKworICAgICAgICAgICAgcG9pbnRzMSA9IChDdlBvaW50M0Q2NGQqKWNhbGxvYyhudW1iZXJQbnQsc2l6ZW9mKEN2UG9pbnQzRDY0ZCkpOworICAgICAgICAgICAgcG9pbnRzMiA9IChDdlBvaW50M0Q2NGQqKWNhbGxvYyhudW1iZXJQbnQsc2l6ZW9mKEN2UG9pbnQzRDY0ZCkpOworCisgICAgICAgICAgICAvKiBUcmFuc2Zvcm0gb2JqZWN0IHBvaW50cyB0byBmaXJzdCBjYW1lcmEgcG9zaXRpb24gKi8KKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bWJlclBudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgc2Vjb25kIGNhbWVyYSBwb2ludCAqLworICAgICAgICAgICAgICAgIEN2UG9pbnQzRDY0ZCB0bXBQb2ludDsKKyAgICAgICAgICAgICAgICB0bXBQb2ludC54ID0gKGRvdWJsZSkob2JqZWN0UG9pbnRzW2ldLngpOworICAgICAgICAgICAgICAgIHRtcFBvaW50LnkgPSAoZG91YmxlKShvYmplY3RQb2ludHNbaV0ueSk7CisgICAgICAgICAgICAgICAgdG1wUG9pbnQueiA9IChkb3VibGUpKG9iamVjdFBvaW50c1tpXS56KTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpY3ZDb252ZXJ0UG9pbnRTeXN0ZW0oICB0bXBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMyK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90TWF0cnMyXzY0ZCArIGN1cnJJbWFnZVBhaXIqOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3RzMl82NGQgKyBjdXJySW1hZ2VQYWlyKjMpOworCisgICAgICAgICAgICAgICAgLyogQ3JlYXRlIGZpcnN0IGNhbWVyYSBwb2ludCB1c2luZyBSLCB0ICovCisgICAgICAgICAgICAgICAgaWN2Q29udmVydFBvaW50U3lzdGVtKCAgcG9pbnRzMltpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMxK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdCk7CisKKyAgICAgICAgICAgICAgICBDdlBvaW50M0Q2NGQgdG1wUG9pbnQyID0geyAwLCAwLCAwIH07CisgICAgICAgICAgICAgICAgaWN2Q29udmVydFBvaW50U3lzdGVtKCAgdG1wUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcFBvaW50MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyczFfNjRkICsgY3VyckltYWdlUGFpcio5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdHMxXzY0ZCArIGN1cnJJbWFnZVBhaXIqMyk7CisgICAgICAgICAgICAgICAgZG91YmxlIGVycjsKKyAgICAgICAgICAgICAgICBkb3VibGUgZHgsZHksZHo7CisgICAgICAgICAgICAgICAgZHggPSB0bXBQb2ludDIueCAtIHBvaW50czFbaV0ueDsKKyAgICAgICAgICAgICAgICBkeSA9IHRtcFBvaW50Mi55IC0gcG9pbnRzMVtpXS55OworICAgICAgICAgICAgICAgIGR6ID0gdG1wUG9pbnQyLnogLSBwb2ludHMxW2ldLno7CisgICAgICAgICAgICAgICAgZXJyID0gc3FydChkeCpkeCArIGR5KmR5ICsgZHoqZHopOworCisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorI2lmIDAKKyAgICAgICAgICAgIGN2UHJvamVjdFBvaW50c1NpbXBsZSggIG51bVBvaW50c1tjdXJySW1hZ2VQYWlyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFBvaW50c182NGQgKyBiZWdQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHJzMV82NGQgKyBjdXJyUnQqOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdHMxXzY0ZCArIGN1cnJSdCozLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWF0cml4MV82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0b3J0aW9uMV82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qSW1hZ2VQb2ludHMxKTsKKworICAgICAgICAgICAgY3ZQcm9qZWN0UG9pbnRzU2ltcGxlKCAgbnVtUG9pbnRzW2N1cnJJbWFnZVBhaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UG9pbnRzXzY0ZCArIGJlZ1BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90TWF0cnMyXzY0ZCArIGN1cnJSdCo5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0czJfNjRkICsgY3VyclJ0KjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNYXRyaXgyXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb24yXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czIpOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIFByb2plY3Qgd2l0aCBubyB0cmFuc2xhdGUgYW5kIG5vIHJvdGF0aW9uICovCisKKyNpZiAwCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIG5vZGlzdFs0XSA9IHswLDAsMCwwfTsKKyAgICAgICAgICAgICAgICBjdlByb2plY3RQb2ludHNTaW1wbGUoICBudW1Qb2ludHNbY3VyckltYWdlUGFpcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252Um90TWF0cjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWF0cml4MV82NGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czEpOworCisgICAgICAgICAgICAgICAgY3ZQcm9qZWN0UG9pbnRzU2ltcGxlKCAgbnVtUG9pbnRzW2N1cnJJbWFnZVBhaXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZUcmFuc1ZlY3QyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYU1hdHJpeDJfNjRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qSW1hZ2VQb2ludHMyKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBjdlByb2plY3RQb2ludHNTaW1wbGUoICBudW1Qb2ludHNbY3VyckltYWdlUGFpcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNYXRyaXgxXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb24xXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czEpOworCisgICAgICAgICAgICBjdlByb2plY3RQb2ludHNTaW1wbGUoICBudW1Qb2ludHNbY3VyckltYWdlUGFpcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlJvdE1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udlRyYW5zVmVjdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNYXRyaXgyXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb24yXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2pJbWFnZVBvaW50czIpOworCisgICAgICAgICAgICAvKiBwb2ludHMgYXJlIHByb2plY3RlZC4gQ29tcHV0ZSBlcnJvciAqLworCisgICAgICAgICAgICBpbnQgY3VyclBvaW50OworICAgICAgICAgICAgZG91YmxlIGVycjEgPSAwOworICAgICAgICAgICAgZG91YmxlIGVycjIgPSAwOworICAgICAgICAgICAgZG91YmxlIGVycjsKKyAgICAgICAgICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtYmVyUG50OyBjdXJyUG9pbnQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGxlbjEsbGVuMjsgCisgICAgICAgICAgICAgICAgZG91YmxlIGR4MSxkeTE7CisgICAgICAgICAgICAgICAgZHgxID0gaW1hZ2VQb2ludHMxW2JlZ1BvaW50K2N1cnJQb2ludF0ueCAtIHByb2pJbWFnZVBvaW50czFbY3VyclBvaW50XS54OworICAgICAgICAgICAgICAgIGR5MSA9IGltYWdlUG9pbnRzMVtiZWdQb2ludCtjdXJyUG9pbnRdLnkgLSBwcm9qSW1hZ2VQb2ludHMxW2N1cnJQb2ludF0ueTsKKyAgICAgICAgICAgICAgICBsZW4xID0gc3FydChkeDEqZHgxICsgZHkxKmR5MSk7CisgICAgICAgICAgICAgICAgZXJyMSArPSBsZW4xOworCisgICAgICAgICAgICAgICAgZG91YmxlIGR4MixkeTI7CisgICAgICAgICAgICAgICAgZHgyID0gaW1hZ2VQb2ludHMyW2JlZ1BvaW50K2N1cnJQb2ludF0ueCAtIHByb2pJbWFnZVBvaW50czJbY3VyclBvaW50XS54OworICAgICAgICAgICAgICAgIGR5MiA9IGltYWdlUG9pbnRzMltiZWdQb2ludCtjdXJyUG9pbnRdLnkgLSBwcm9qSW1hZ2VQb2ludHMyW2N1cnJQb2ludF0ueTsKKyAgICAgICAgICAgICAgICBsZW4yID0gc3FydChkeDIqZHgyICsgZHkyKmR5Mik7CisgICAgICAgICAgICAgICAgZXJyMiArPSBsZW4yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlcnIxIC89IChmbG9hdCkobnVtYmVyUG50KTsKKyAgICAgICAgICAgIGVycjIgLz0gKGZsb2F0KShudW1iZXJQbnQpOworCisgICAgICAgICAgICBlcnIgPSAoZXJyMStlcnIyKSAqIDAuNTsKKyAgICAgICAgICAgIGJlZ1BvaW50ICs9IG51bWJlclBudDsKKworICAgICAgICAgICAgLyogU2V0IHRoaXMgZXJyb3IgdG8gKi8KKyAgICAgICAgICAgIGVycm9yc1tudW1JbWFnZXMqY3VyckltYWdlUGFpcitjdXJyUnRdID0gKGZsb2F0KWVycjsKKworICAgICAgICAgICAgZnJlZShwb2ludHMxKTsKKyAgICAgICAgICAgIGZyZWUocG9pbnRzMik7CisgICAgICAgICAgICBmcmVlKHByb2pJbWFnZVBvaW50czEpOworICAgICAgICAgICAgZnJlZShwcm9qSW1hZ2VQb2ludHMyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEp1c3Qgc2VsZWN0IFIgYW5kIHQgd2l0aCBtaW5pbWFsIGF2ZXJhZ2UgZXJyb3IgKi8KKworICAgIGludCBiZXN0bnVtUnQgPSAwOworICAgIGZsb2F0IG1pbkVycm9yID0gMDsvKiBKdXN0IGZvciBubyB3YXJuaW5ncy4gVXNlcyAnZmlyc3QnIGZsYWcuICovCisgICAgaW50IGZpcnN0ID0gMTsKKyAgICBmb3IoIGN1cnJSdCA9IDA7IGN1cnJSdCA8IG51bUltYWdlczsgY3VyclJ0KysgKQorICAgIHsKKyAgICAgICAgZmxvYXQgYXZFcnIgPSAwOworICAgICAgICBmb3IoY3VyckltYWdlUGFpciA9IDA7IGN1cnJJbWFnZVBhaXIgPCBudW1JbWFnZXM7IGN1cnJJbWFnZVBhaXIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGF2RXJyICs9IGVycm9yc1tudW1JbWFnZXMqY3VyckltYWdlUGFpcitjdXJyUnRdOworICAgICAgICB9CisgICAgICAgIGF2RXJyIC89IChmbG9hdCkobnVtSW1hZ2VzKTsKKworICAgICAgICBpZiggZmlyc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBiZXN0bnVtUnQgPSAwOworICAgICAgICAgICAgbWluRXJyb3IgPSBhdkVycjsKKyAgICAgICAgICAgIGZpcnN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBhdkVyciA8IG1pbkVycm9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0bnVtUnQgPSBjdXJyUnQ7CisgICAgICAgICAgICAgICAgbWluRXJyb3IgPSBhdkVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgZG91YmxlIGJlc3RSb3RNYXRyXzY0ZFs5XTsKKyAgICBkb3VibGUgYmVzdFRyYW5zVmVjdF82NGRbM107CisKKyAgICBpY3ZDcmVhdGVDb252ZXJ0TWF0clZlY3QoIHJvdE1hdHJzMV82NGQgKyBiZXN0bnVtUnQgKiA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0czFfNjRkICsgYmVzdG51bVJ0ICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHJzMl82NGQgKyBiZXN0bnVtUnQgKiA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0czJfNjRkICsgYmVzdG51bVJ0ICogMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RSb3RNYXRyXzY0ZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RUcmFuc1ZlY3RfNjRkKTsKKworICAgIGljdkN2dF82NGRfMzJmKGJlc3RSb3RNYXRyXzY0ZCxiZXN0Um90TWF0ciw5KTsKKyAgICBpY3ZDdnRfNjRkXzMyZihiZXN0VHJhbnNWZWN0XzY0ZCxiZXN0VHJhbnNWZWN0LDMpOworCisKKyAgICBmcmVlKGVycm9ycyk7CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0gU3RlcmVvIGNhbGlicmF0aW9uIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZmxvYXQgaWN2RGVmaW5lUG9pbnRQb3NpdGlvbihDdlBvaW50MkQzMmYgcG9pbnQxLEN2UG9pbnQyRDMyZiBwb2ludDIsQ3ZQb2ludDJEMzJmIHBvaW50KQoreworICAgIGZsb2F0IGF4ID0gcG9pbnQyLnggLSBwb2ludDEueDsKKyAgICBmbG9hdCBheSA9IHBvaW50Mi55IC0gcG9pbnQxLnk7CisKKyAgICBmbG9hdCBieCA9IHBvaW50LnggLSBwb2ludDEueDsKKyAgICBmbG9hdCBieSA9IHBvaW50LnkgLSBwb2ludDEueTsKKworICAgIHJldHVybiAoYXgqYnkgLSBheSpieCk7Cit9CisKKy8qIENvbnZlcnQgZnVuY3Rpb24gZm9yIHN0ZXJlbyB3YXJwaW5nICovCitpbnQgaWN2Q29udmVydFdhcnBDb29yZGluYXRlcyhkb3VibGUgY29lZmZzWzNdWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIGNhbWVyYVBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIHdhcnBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpcmVjdGlvbikKK3sKKyAgICBkb3VibGUgeCx5OworICAgIGRvdWJsZSBkZXQ7IAorICAgIGlmKCBkaXJlY3Rpb24gPT0gQ1ZfV0FSUF9UT19DQU1FUkEgKQorICAgIHsvKiBjb252ZXJ0IGZyb20gY2FtZXJhIGltYWdlIHRvIHdhcnBlZCBpbWFnZSBjb29yZGluYXRlcyAqLworICAgICAgICB4ID0gd2FycFBvaW50LT54OworICAgICAgICB5ID0gd2FycFBvaW50LT55OworICAgICAgICAKKyAgICAgICAgZGV0ID0gKGNvZWZmc1syXVswXSAqIHggKyBjb2VmZnNbMl1bMV0gKiB5ICsgY29lZmZzWzJdWzJdKTsKKyAgICAgICAgaWYoIGZhYnMoZGV0KSA+IDFlLTggKQorICAgICAgICB7CisgICAgICAgICAgICBjYW1lcmFQb2ludC0+eCA9IChmbG9hdCkoKGNvZWZmc1swXVswXSAqIHggKyBjb2VmZnNbMF1bMV0gKiB5ICsgY29lZmZzWzBdWzJdKSAvIGRldCk7CisgICAgICAgICAgICBjYW1lcmFQb2ludC0+eSA9IChmbG9hdCkoKGNvZWZmc1sxXVswXSAqIHggKyBjb2VmZnNbMV1bMV0gKiB5ICsgY29lZmZzWzFdWzJdKSAvIGRldCk7CisgICAgICAgICAgICByZXR1cm4gQ1ZfT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggZGlyZWN0aW9uID09IENWX0NBTUVSQV9UT19XQVJQICkKKyAgICB7LyogY29udmVydCBmcm9tIHdhcnBlZCBpbWFnZSB0byBjYW1lcmEgaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgeCA9IGNhbWVyYVBvaW50LT54OworICAgICAgICB5ID0gY2FtZXJhUG9pbnQtPnk7CisKKyAgICAgICAgZGV0ID0gKGNvZWZmc1syXVswXSp4LWNvZWZmc1swXVswXSkqKGNvZWZmc1syXVsxXSp5LWNvZWZmc1sxXVsxXSktKGNvZWZmc1syXVsxXSp4LWNvZWZmc1swXVsxXSkqKGNvZWZmc1syXVswXSp5LWNvZWZmc1sxXVswXSk7CisKKyAgICAgICAgaWYoIGZhYnMoZGV0KSA+IDFlLTggKQorICAgICAgICB7CisgICAgICAgICAgICB3YXJwUG9pbnQtPnggPSAoZmxvYXQpKCgoY29lZmZzWzBdWzJdLWNvZWZmc1syXVsyXSp4KSooY29lZmZzWzJdWzFdKnktY29lZmZzWzFdWzFdKS0oY29lZmZzWzJdWzFdKngtY29lZmZzWzBdWzFdKSooY29lZmZzWzFdWzJdLWNvZWZmc1syXVsyXSp5KSkvZGV0KTsKKyAgICAgICAgICAgIHdhcnBQb2ludC0+eSA9IChmbG9hdCkoKChjb2VmZnNbMl1bMF0qeC1jb2VmZnNbMF1bMF0pKihjb2VmZnNbMV1bMl0tY29lZmZzWzJdWzJdKnkpLShjb2VmZnNbMF1bMl0tY29lZmZzWzJdWzJdKngpKihjb2VmZnNbMl1bMF0qeS1jb2VmZnNbMV1bMF0pKS9kZXQpOworICAgICAgICAgICAgcmV0dXJuIENWX09LOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworfQorCisvKiBDb21wdXRlIHN0ZXJlbyBwYXJhbXMgdXNpbmcgc29tZSBjYW1lcmEgcGFyYW1zICovCisvKiBieSBWYWxlcnkgTW9zeWFnaW4uIGludCBDb21wdXRlUmVzdFN0ZXJlb1BhcmFtcyhTdGVyZW9QYXJhbXMgKnN0ZXJlb3BhcmFtcykgKi8KK2ludCBpY3ZDb21wdXRlUmVzdFN0ZXJlb1BhcmFtcyhDdlN0ZXJlb0NhbWVyYSAqc3RlcmVvcGFyYW1zKQoreworCisKKyAgICBpY3ZHZXRRdWFkc1RyYW5zZm9ybVN0cnVjdChzdGVyZW9wYXJhbXMpOworCisgICAgY3ZJbml0UGVyc3BlY3RpdmVUcmFuc2Zvcm0oIHN0ZXJlb3BhcmFtcy0+d2FycFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb3BhcmFtcy0+cXVhZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5jb2VmZnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgY3ZJbml0UGVyc3BlY3RpdmVUcmFuc2Zvcm0oIHN0ZXJlb3BhcmFtcy0+d2FycFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb3BhcmFtcy0+cXVhZFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5jb2VmZnNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgLyogQ3JlYXRlIGJvcmRlciBmb3Igd2FycGVkIGltYWdlcyAqLworICAgIEN2UG9pbnQyRDMyZiBjb3Juc1s0XTsKKyAgICBjb3Juc1swXS54ID0gMDsKKyAgICBjb3Juc1swXS55ID0gMDsKKworICAgIGNvcm5zWzFdLnggPSAoZmxvYXQpKHN0ZXJlb3BhcmFtcy0+Y2FtZXJhWzBdLT5pbWdTaXplWzBdLTEpOworICAgIGNvcm5zWzFdLnkgPSAwOworCisgICAgY29ybnNbMl0ueCA9IChmbG9hdCkoc3RlcmVvcGFyYW1zLT5jYW1lcmFbMF0tPmltZ1NpemVbMF0tMSk7CisgICAgY29ybnNbMl0ueSA9IChmbG9hdCkoc3RlcmVvcGFyYW1zLT5jYW1lcmFbMF0tPmltZ1NpemVbMV0tMSk7CisKKyAgICBjb3Juc1szXS54ID0gMDsKKyAgICBjb3Juc1szXS55ID0gKGZsb2F0KShzdGVyZW9wYXJhbXMtPmNhbWVyYVswXS0+aW1nU2l6ZVsxXS0xKTsKKworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgIHsKKyAgICAgICAgLyogRm9yIGZpcnN0IGNhbWVyYSAqLworICAgICAgICBpY3ZDb252ZXJ0V2FycENvb3JkaW5hdGVzKCBzdGVyZW9wYXJhbXMtPmNvZWZmc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ybnMraSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5ib3JkZXJbMF0raSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FNRVJBX1RPX1dBUlApOworCisgICAgICAgIC8qIEZvciBzZWNvbmQgY2FtZXJhICovCisgICAgICAgIGljdkNvbnZlcnRXYXJwQ29vcmRpbmF0ZXMoIHN0ZXJlb3BhcmFtcy0+Y29lZmZzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JucytpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPmJvcmRlclsxXStpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQU1FUkFfVE9fV0FSUCk7CisgICAgfQorCisgICAgLyogVGVzdCBjb21wdXRlICAqLworICAgIHsKKyAgICAgICAgQ3ZQb2ludDJEMzJmIHdhcnBQb2ludHNbNF07CisgICAgICAgIHdhcnBQb2ludHNbMF0gPSBjdlBvaW50MkQzMmYoMCwwKTsKKyAgICAgICAgd2FycFBvaW50c1sxXSA9IGN2UG9pbnQyRDMyZihzdGVyZW9wYXJhbXMtPndhcnBTaXplLndpZHRoLTEsMCk7CisgICAgICAgIHdhcnBQb2ludHNbMl0gPSBjdlBvaW50MkQzMmYoc3RlcmVvcGFyYW1zLT53YXJwU2l6ZS53aWR0aC0xLHN0ZXJlb3BhcmFtcy0+d2FycFNpemUuaGVpZ2h0LTEpOworICAgICAgICB3YXJwUG9pbnRzWzNdID0gY3ZQb2ludDJEMzJmKDAsc3RlcmVvcGFyYW1zLT53YXJwU2l6ZS5oZWlnaHQtMSk7CisKKyAgICAgICAgQ3ZQb2ludDJEMzJmIGNhbVBvaW50czFbNF07CisgICAgICAgIEN2UG9pbnQyRDMyZiBjYW1Qb2ludHMyWzRdOworCisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2Q29udmVydFdhcnBDb29yZGluYXRlcyhzdGVyZW9wYXJhbXMtPmNvZWZmc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtUG9pbnRzMStpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJwUG9pbnRzK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1dBUlBfVE9fQ0FNRVJBKTsKKworICAgICAgICAgICAgaWN2Q29udmVydFdhcnBDb29yZGluYXRlcyhzdGVyZW9wYXJhbXMtPmNvZWZmc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtUG9pbnRzMitpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJwUG9pbnRzK2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1dBUlBfVE9fQ0FNRVJBKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBzY2FubGluZXMgY29lZmZzICovCisKKyAgICBzdGVyZW9wYXJhbXMtPmxpbmVDb2VmZnMgPSAoQ3ZTdGVyZW9MaW5lQ29lZmYqKWNhbGxvYyhzdGVyZW9wYXJhbXMtPndhcnBTaXplLmhlaWdodCxzaXplb2YoQ3ZTdGVyZW9MaW5lQ29lZmYpKTsKKworICAgIC8qIENvbXB1dGUgY29lZmZzIGZvciBlcGlsaW5lcyAgKi8KKworICAgIGljdkNvbXB1dGVDb2VmZkZvclN0ZXJlbyggc3RlcmVvcGFyYW1zKTsKKworICAgIC8qIGFsbCBjb2VmZnMgYXJlIGtub3duICovCisgICAgcmV0dXJuIENWX09LOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbnQgaWN2U3RlcmVvQ2FsaWJyYXRpb24oIGludCBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWFnZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBpbWFnZVBvaW50czEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBpbWFnZVBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBvYmplY3RQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGVyZW9DYW1lcmEqIHN0ZXJlb3BhcmFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKQoreworICAgIC8qIEZpcnN0bHkgd2UgbXVzdCBjYWxpYnJhdGUgYm90aCBjYW1lcmFzICovCisgICAgLyogIEFsb2NhdGUgbWVtb3J5IGZvciBkYXRhICovCisgICAgLyogQWxsb2NhdGUgZm9yIHRyYW5zbGF0ZSB2ZWN0b3JzICovCisgICAgZmxvYXQqIHRyYW5zVmVjdHMxOworICAgIGZsb2F0KiB0cmFuc1ZlY3RzMjsKKyAgICBmbG9hdCogcm90TWF0cnMxOworICAgIGZsb2F0KiByb3RNYXRyczI7CisKKyAgICB0cmFuc1ZlY3RzMSA9IChmbG9hdCopY2FsbG9jKG51bUltYWdlcyxzaXplb2YoZmxvYXQpKjMpOworICAgIHRyYW5zVmVjdHMyID0gKGZsb2F0KiljYWxsb2MobnVtSW1hZ2VzLHNpemVvZihmbG9hdCkqMyk7CisKKyAgICByb3RNYXRyczEgICA9IChmbG9hdCopY2FsbG9jKG51bUltYWdlcyxzaXplb2YoZmxvYXQpKjkpOworICAgIHJvdE1hdHJzMiAgID0gKGZsb2F0KiljYWxsb2MobnVtSW1hZ2VzLHNpemVvZihmbG9hdCkqOSk7CisKKyAgICAvKiBDYWxpYnJhdGUgZmlyc3QgY2FtZXJhICovCisgICAgY3ZDYWxpYnJhdGVDYW1lcmEoICBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb2ludHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5jYW1lcmFbMF0tPmRpc3RvcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPmNhbWVyYVswXS0+bWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0czEsCisgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyczEsCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgIC8qIENhbGlicmF0ZSBzZWNvbmQgY2FtZXJhICovCisgICAgY3ZDYWxpYnJhdGVDYW1lcmEoICBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBudW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VQb2ludHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0UG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5jYW1lcmFbMV0tPmRpc3RvcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPmNhbWVyYVsxXS0+bWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNWZWN0czIsCisgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKworICAgIC8qIENhbWVyYXMgYXJlIGNhbGlicmF0ZWQgKi8KKworICAgIHN0ZXJlb3BhcmFtcy0+Y2FtZXJhWzBdLT5pbWdTaXplWzBdID0gKGZsb2F0KWltYWdlU2l6ZS53aWR0aDsKKyAgICBzdGVyZW9wYXJhbXMtPmNhbWVyYVswXS0+aW1nU2l6ZVsxXSA9IChmbG9hdClpbWFnZVNpemUuaGVpZ2h0OworCisgICAgc3RlcmVvcGFyYW1zLT5jYW1lcmFbMV0tPmltZ1NpemVbMF0gPSAoZmxvYXQpaW1hZ2VTaXplLndpZHRoOworICAgIHN0ZXJlb3BhcmFtcy0+Y2FtZXJhWzFdLT5pbWdTaXplWzFdID0gKGZsb2F0KWltYWdlU2l6ZS5oZWlnaHQ7CisKKyAgICBpY3ZTZWxlY3RCZXN0UnQoICAgIG51bUltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvaW50czEsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZVBvaW50czIsCisgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3RQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPmNhbWVyYVswXS0+bWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5jYW1lcmFbMF0tPmRpc3RvcnRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICByb3RNYXRyczEsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc1ZlY3RzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXJlb3BhcmFtcy0+Y2FtZXJhWzFdLT5tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPmNhbWVyYVsxXS0+ZGlzdG9ydGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdE1hdHJzMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zVmVjdHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RlcmVvcGFyYW1zLT5yb3RNYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGVyZW9wYXJhbXMtPnRyYW5zVmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICApOworCisgICAgLyogRnJlZSBtZW1vcnkgKi8KKyAgICBmcmVlKHRyYW5zVmVjdHMxKTsKKyAgICBmcmVlKHRyYW5zVmVjdHMyKTsKKyAgICBmcmVlKHJvdE1hdHJzMSk7CisgICAgZnJlZShyb3RNYXRyczIpOworCisgICAgaWN2Q29tcHV0ZVJlc3RTdGVyZW9QYXJhbXMoc3RlcmVvcGFyYW1zKTsKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qIEZpbmQgbGluZSBmcm9tIGVwaXBvbGUgKi8KK3ZvaWQgRmluZExpbmUoQ3ZQb2ludDJEMzJmIGVwaXBvbGUsQ3ZTaXplIGltYWdlU2l6ZSxDdlBvaW50MkQzMmYgcG9pbnQsQ3ZQb2ludDJEMzJmICpzdGFydCxDdlBvaW50MkQzMmYgKmVuZCkKK3sKKyAgICBDdlBvaW50MkQzMmYgZnJhbWVCZWc7CisgICAgQ3ZQb2ludDJEMzJmIGZyYW1lRW5kOworICAgIEN2UG9pbnQyRDMyZiBjcm9zc1s0XTsKKyAgICBpbnQgICAgIGhhdmVDcm9zc1s0XTsKKyAgICBmbG9hdCAgIGRpc3Q7CisKKyAgICBoYXZlQ3Jvc3NbMF0gPSAwOworICAgIGhhdmVDcm9zc1sxXSA9IDA7CisgICAgaGF2ZUNyb3NzWzJdID0gMDsKKyAgICBoYXZlQ3Jvc3NbM10gPSAwOworCisgICAgZnJhbWVCZWcueCA9IDA7CisgICAgZnJhbWVCZWcueSA9IDA7CisgICAgZnJhbWVFbmQueCA9IChmbG9hdCkoaW1hZ2VTaXplLndpZHRoKTsKKyAgICBmcmFtZUVuZC55ID0gMDsKKyAgICBoYXZlQ3Jvc3NbMF0gPSBpY3ZHZXRDcm9zc1BpZWNlVmVjdG9yKGZyYW1lQmVnLGZyYW1lRW5kLGVwaXBvbGUscG9pbnQsJmNyb3NzWzBdKTsKKyAgICAKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAwOworICAgIGZyYW1lRW5kLnggPSAoZmxvYXQpKGltYWdlU2l6ZS53aWR0aCk7CisgICAgZnJhbWVFbmQueSA9IChmbG9hdCkoaW1hZ2VTaXplLmhlaWdodCk7CisgICAgaGF2ZUNyb3NzWzFdID0gaWN2R2V0Q3Jvc3NQaWVjZVZlY3RvcihmcmFtZUJlZyxmcmFtZUVuZCxlcGlwb2xlLHBvaW50LCZjcm9zc1sxXSk7CisKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGhhdmVDcm9zc1syXSA9IGljdkdldENyb3NzUGllY2VWZWN0b3IoZnJhbWVCZWcsZnJhbWVFbmQsZXBpcG9sZSxwb2ludCwmY3Jvc3NbMl0pOworICAgIAorICAgIGZyYW1lQmVnLnggPSAwOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAwOworICAgIGhhdmVDcm9zc1szXSA9IGljdkdldENyb3NzUGllY2VWZWN0b3IoZnJhbWVCZWcsZnJhbWVFbmQsZXBpcG9sZSxwb2ludCwmY3Jvc3NbM10pOworCisgICAgaW50IG47CisgICAgZmxvYXQgbWluRGlzdCA9IChmbG9hdCkoSU5UX01BWCk7CisgICAgZmxvYXQgbWF4RGlzdCA9IChmbG9hdCkoSU5UX01JTik7CisKKyAgICBpbnQgbWF4TiA9IC0xOworICAgIGludCBtaW5OID0gLTE7CisgICAgCisgICAgZm9yKCBuID0gMDsgbiA8IDQ7IG4rKyApCisgICAgeworICAgICAgICBpZiggaGF2ZUNyb3NzW25dID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3QgPSAgKGVwaXBvbGUueCAtIGNyb3NzW25dLngpKihlcGlwb2xlLnggLSBjcm9zc1tuXS54KSArCisgICAgICAgICAgICAgICAgICAgIChlcGlwb2xlLnkgLSBjcm9zc1tuXS55KSooZXBpcG9sZS55IC0gY3Jvc3Nbbl0ueSk7CisKKyAgICAgICAgICAgIGlmKCBkaXN0IDwgbWluRGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWluRGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWluTiA9IG47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkaXN0ID4gbWF4RGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4RGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWF4TiA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbWluTiA+PSAwICYmIG1heE4gPj0gMCAmJiAobWluTiAhPSBtYXhOKSApCisgICAgeworICAgICAgICAqc3RhcnQgPSBjcm9zc1ttaW5OXTsKKyAgICAgICAgKmVuZCAgID0gY3Jvc3NbbWF4Tl07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXJ0LT54ID0gMDsKKyAgICAgICAgc3RhcnQtPnkgPSAwOworICAgICAgICBlbmQtPnggPSAwOworICAgICAgICBlbmQtPnkgPSAwOworICAgIH0KKworICAgIHJldHVybjsKK30KKworCisvKiBGaW5kIGxpbmUgd2hpY2ggY3Jvc3MgZnJhbWUgYnkgbGluZShhLGIsYykgKi8KK3ZvaWQgRmluZExpbmVGb3JFcGlsaW5lKEN2U2l6ZSBpbWFnZVNpemUsZmxvYXQgYSxmbG9hdCBiLGZsb2F0IGMsQ3ZQb2ludDJEMzJmICpzdGFydCxDdlBvaW50MkQzMmYgKmVuZCkKK3sKKyAgICBDdlBvaW50MkQzMmYgZnJhbWVCZWc7CisgICAgQ3ZQb2ludDJEMzJmIGZyYW1lRW5kOworICAgIEN2UG9pbnQyRDMyZiBjcm9zc1s0XTsKKyAgICBpbnQgICAgIGhhdmVDcm9zc1s0XTsKKyAgICBmbG9hdCAgIGRpc3Q7CisKKyAgICBoYXZlQ3Jvc3NbMF0gPSAwOworICAgIGhhdmVDcm9zc1sxXSA9IDA7CisgICAgaGF2ZUNyb3NzWzJdID0gMDsKKyAgICBoYXZlQ3Jvc3NbM10gPSAwOworCisgICAgZnJhbWVCZWcueCA9IDA7CisgICAgZnJhbWVCZWcueSA9IDA7CisgICAgZnJhbWVFbmQueCA9IChmbG9hdCkoaW1hZ2VTaXplLndpZHRoKTsKKyAgICBmcmFtZUVuZC55ID0gMDsKKyAgICBoYXZlQ3Jvc3NbMF0gPSBpY3ZHZXRDcm9zc0xpbmVEaXJlY3QoZnJhbWVCZWcsZnJhbWVFbmQsYSxiLGMsJmNyb3NzWzBdKTsKKyAgICAKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAwOworICAgIGZyYW1lRW5kLnggPSAoZmxvYXQpKGltYWdlU2l6ZS53aWR0aCk7CisgICAgZnJhbWVFbmQueSA9IChmbG9hdCkoaW1hZ2VTaXplLmhlaWdodCk7CisgICAgaGF2ZUNyb3NzWzFdID0gaWN2R2V0Q3Jvc3NMaW5lRGlyZWN0KGZyYW1lQmVnLGZyYW1lRW5kLGEsYixjLCZjcm9zc1sxXSk7CisKKyAgICBmcmFtZUJlZy54ID0gKGZsb2F0KShpbWFnZVNpemUud2lkdGgpOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGhhdmVDcm9zc1syXSA9IGljdkdldENyb3NzTGluZURpcmVjdChmcmFtZUJlZyxmcmFtZUVuZCxhLGIsYywmY3Jvc3NbMl0pOworICAgIAorICAgIGZyYW1lQmVnLnggPSAwOworICAgIGZyYW1lQmVnLnkgPSAoZmxvYXQpKGltYWdlU2l6ZS5oZWlnaHQpOworICAgIGZyYW1lRW5kLnggPSAwOworICAgIGZyYW1lRW5kLnkgPSAwOworICAgIGhhdmVDcm9zc1szXSA9IGljdkdldENyb3NzTGluZURpcmVjdChmcmFtZUJlZyxmcmFtZUVuZCxhLGIsYywmY3Jvc3NbM10pOworCisgICAgaW50IG47CisgICAgZmxvYXQgbWluRGlzdCA9IChmbG9hdCkoSU5UX01BWCk7CisgICAgZmxvYXQgbWF4RGlzdCA9IChmbG9hdCkoSU5UX01JTik7CisKKyAgICBpbnQgbWF4TiA9IC0xOworICAgIGludCBtaW5OID0gLTE7CisKKyAgICBkb3VibGUgbWlkUG9pbnRYID0gaW1hZ2VTaXplLndpZHRoICAvIDIuMDsKKyAgICBkb3VibGUgbWlkUG9pbnRZID0gaW1hZ2VTaXplLmhlaWdodCAvIDIuMDsKKworICAgIGZvciggbiA9IDA7IG4gPCA0OyBuKysgKQorICAgIHsKKyAgICAgICAgaWYoIGhhdmVDcm9zc1tuXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkaXN0ID0gIChmbG9hdCkoKG1pZFBvaW50WCAtIGNyb3NzW25dLngpKihtaWRQb2ludFggLSBjcm9zc1tuXS54KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pZFBvaW50WSAtIGNyb3NzW25dLnkpKihtaWRQb2ludFkgLSBjcm9zc1tuXS55KSk7CisKKyAgICAgICAgICAgIGlmKCBkaXN0IDwgbWluRGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWluRGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWluTiA9IG47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkaXN0ID4gbWF4RGlzdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF4RGlzdCA9IGRpc3Q7CisgICAgICAgICAgICAgICAgbWF4TiA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbWluTiA+PSAwICYmIG1heE4gPj0gMCAmJiAobWluTiAhPSBtYXhOKSApCisgICAgeworICAgICAgICAqc3RhcnQgPSBjcm9zc1ttaW5OXTsKKyAgICAgICAgKmVuZCAgID0gY3Jvc3NbbWF4Tl07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YXJ0LT54ID0gMDsKKyAgICAgICAgc3RhcnQtPnkgPSAwOworICAgICAgICBlbmQtPnggPSAwOworICAgICAgICBlbmQtPnkgPSAwOworICAgIH0KKworICAgIHJldHVybjsKKyAgICAKK30KKworLyogQ3Jvc3MgbGluZXMgKi8KK2ludCBHZXRDcm9zc0xpbmVzKEN2UG9pbnQyRDMyZiBwMV9zdGFydCxDdlBvaW50MkQzMmYgcDFfZW5kLEN2UG9pbnQyRDMyZiBwMl9zdGFydCxDdlBvaW50MkQzMmYgcDJfZW5kLEN2UG9pbnQyRDMyZiAqY3Jvc3MpCit7CisgICAgZG91YmxlIGV4MSxleTEsZXgyLGV5MjsKKyAgICBkb3VibGUgcHgxLHB5MSxweDIscHkyOworICAgIGRvdWJsZSBkZWw7CisgICAgZG91YmxlIGRlbEEsZGVsQixkZWxYLGRlbFk7CisgICAgZG91YmxlIGFscGhhLGJldHRhOworCisgICAgZXgxID0gcDFfc3RhcnQueDsKKyAgICBleTEgPSBwMV9zdGFydC55OworICAgIGV4MiA9IHAxX2VuZC54OworICAgIGV5MiA9IHAxX2VuZC55OworCisgICAgcHgxID0gcDJfc3RhcnQueDsKKyAgICBweTEgPSBwMl9zdGFydC55OworICAgIHB4MiA9IHAyX2VuZC54OworICAgIHB5MiA9IHAyX2VuZC55OworCisgICAgZGVsID0gKGV4MS1leDIpKihweTItcHkxKSsoZXkyLWV5MSkqKHB4Mi1weDEpOworICAgIGlmKCBkZWwgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBkZWxBID0gIChweDEtZXgxKSoocHkxLXB5MikgKyAoZXkxLXB5MSkqKHB4MS1weDIpOworICAgIGRlbEIgPSAgKGV4MS1weDEpKihleTEtZXkyKSArIChweTEtZXkxKSooZXgxLWV4Mik7CisKKyAgICBhbHBoYSA9ICBkZWxBIC8gZGVsOworICAgIGJldHRhID0gLWRlbEIgLyBkZWw7CisKKyAgICBpZiggYWxwaGEgPCAwIHx8IGFscGhhID4gMS4wIHx8IGJldHRhIDwgMCB8fCBiZXR0YSA+IDEuMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBkZWxYID0gIChleDEtZXgyKSoocHkxKihweDEtcHgyKS1weDEqKHB5MS1weTIpKSsKKyAgICAgICAgICAgIChweDEtcHgyKSooZXgxKihleTEtZXkyKS1leTEqKGV4MS1leDIpKTsKKworICAgIGRlbFkgPSAgKGV5MS1leTIpKihweDEqKHB5MS1weTIpLXB5MSoocHgxLXB4MikpKworICAgICAgICAgICAgKHB5MS1weTIpKihleTEqKGV4MS1leDIpLWV4MSooZXkxLWV5MikpOworCisgICAgY3Jvc3MtPnggPSAoZmxvYXQpKCBkZWxYIC8gZGVsKTsKKyAgICBjcm9zcy0+eSA9IChmbG9hdCkoLWRlbFkgLyBkZWwpOworICAgIHJldHVybiAxOworfQorCisKK2ludCBpY3ZHZXRDcm9zc1BpZWNlVmVjdG9yKEN2UG9pbnQyRDMyZiBwMV9zdGFydCxDdlBvaW50MkQzMmYgcDFfZW5kLEN2UG9pbnQyRDMyZiB2Ml9zdGFydCxDdlBvaW50MkQzMmYgdjJfZW5kLEN2UG9pbnQyRDMyZiAqY3Jvc3MpCit7CisgICAgZG91YmxlIGV4MSxleTEsZXgyLGV5MjsKKyAgICBkb3VibGUgcHgxLHB5MSxweDIscHkyOworICAgIGRvdWJsZSBkZWw7CisgICAgZG91YmxlIGRlbEEsZGVsQixkZWxYLGRlbFk7CisgICAgZG91YmxlIGFscGhhLGJldHRhOworCisgICAgZXgxID0gcDFfc3RhcnQueDsKKyAgICBleTEgPSBwMV9zdGFydC55OworICAgIGV4MiA9IHAxX2VuZC54OworICAgIGV5MiA9IHAxX2VuZC55OworCisgICAgcHgxID0gdjJfc3RhcnQueDsKKyAgICBweTEgPSB2Ml9zdGFydC55OworICAgIHB4MiA9IHYyX2VuZC54OworICAgIHB5MiA9IHYyX2VuZC55OworCisgICAgZGVsID0gKGV4MS1leDIpKihweTItcHkxKSsoZXkyLWV5MSkqKHB4Mi1weDEpOworICAgIGlmKCBkZWwgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBkZWxBID0gIChweDEtZXgxKSoocHkxLXB5MikgKyAoZXkxLXB5MSkqKHB4MS1weDIpOworICAgIGRlbEIgPSAgKGV4MS1weDEpKihleTEtZXkyKSArIChweTEtZXkxKSooZXgxLWV4Mik7CisKKyAgICBhbHBoYSA9ICBkZWxBIC8gZGVsOworICAgIGJldHRhID0gLWRlbEIgLyBkZWw7CisKKyAgICBpZiggYWxwaGEgPCAwIHx8IGFscGhhID4gMS4wICkKKyAgICB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBkZWxYID0gIChleDEtZXgyKSoocHkxKihweDEtcHgyKS1weDEqKHB5MS1weTIpKSsKKyAgICAgICAgICAgIChweDEtcHgyKSooZXgxKihleTEtZXkyKS1leTEqKGV4MS1leDIpKTsKKworICAgIGRlbFkgPSAgKGV5MS1leTIpKihweDEqKHB5MS1weTIpLXB5MSoocHgxLXB4MikpKworICAgICAgICAgICAgKHB5MS1weTIpKihleTEqKGV4MS1leDIpLWV4MSooZXkxLWV5MikpOworCisgICAgY3Jvc3MtPnggPSAoZmxvYXQpKCBkZWxYIC8gZGVsKTsKKyAgICBjcm9zcy0+eSA9IChmbG9hdCkoLWRlbFkgLyBkZWwpOworICAgIHJldHVybiAxOworfQorCisKK2ludCBpY3ZHZXRDcm9zc0xpbmVEaXJlY3QoQ3ZQb2ludDJEMzJmIHAxLEN2UG9pbnQyRDMyZiBwMixmbG9hdCBhLGZsb2F0IGIsZmxvYXQgYyxDdlBvaW50MkQzMmYqIGNyb3NzKQoreworICAgIGRvdWJsZSBkZWw7CisgICAgZG91YmxlIGRlbFgsZGVsWSxkZWxBOworCisgICAgZG91YmxlIHB4MSxweDIscHkxLHB5MjsKKyAgICBkb3VibGUgWCxZLGFscGhhOworCisgICAgcHgxID0gcDEueDsKKyAgICBweTEgPSBwMS55OworCisgICAgcHgyID0gcDIueDsKKyAgICBweTIgPSBwMi55OworCisgICAgZGVsID0gYSAqIChweDIgLSBweDEpICsgYiAqIChweTItcHkxKTsKKyAgICBpZiggZGVsID09IDAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGRlbEEgPSAtIGMgLSBhKnB4MSAtIGIqcHkxOworICAgIGFscGhhID0gZGVsQSAvIGRlbDsKKworICAgIGlmKCBhbHBoYSA8IDAgfHwgYWxwaGEgPiAxLjAgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIC0xOy8qIG5vIGNyb3NzICovCisgICAgfQorCisgICAgZGVsWCA9IGIgKiAocHkxKihweDEtcHgyKSAtIHB4MSoocHkxLXB5MikpICsgYyAqIChweDEtcHgyKTsKKyAgICBkZWxZID0gYSAqIChweDEqKHB5MS1weTIpIC0gcHkxKihweDEtcHgyKSkgKyBjICogKHB5MS1weTIpOworCisgICAgWCA9IGRlbFggLyBkZWw7CisgICAgWSA9IGRlbFkgLyBkZWw7CisKKyAgICBjcm9zcy0+eCA9IChmbG9hdClYOworICAgIGNyb3NzLT55ID0gKGZsb2F0KVk7CisgICAgCisgICAgcmV0dXJuIDE7Cit9CisKK2ludCBjdkNvbXB1dGVFcGlwb2xlcyggQ3ZNYXRyMzJmIGNhbU1hdHIxLCAgQ3ZNYXRyMzJmIGNhbU1hdHIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiByb3RNYXRyMSwgIEN2TWF0cjMyZiByb3RNYXRyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgdHJhbnNWZWN0MSxDdlZlY3QzMmYgdHJhbnNWZWN0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgZXBpcG9sZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmIGVwaXBvbGUyKQoreworCisgICAgLyogQ29weSBtYXRyaXggKi8KKworICAgIEN2TWF0IGNjYW1NYXRyMSA9IGN2TWF0KDMsMyxDVl9NQVQzMkYsY2FtTWF0cjEpOworICAgIEN2TWF0IGNjYW1NYXRyMiA9IGN2TWF0KDMsMyxDVl9NQVQzMkYsY2FtTWF0cjIpOworICAgIEN2TWF0IGNyb3RNYXRyMSA9IGN2TWF0KDMsMyxDVl9NQVQzMkYscm90TWF0cjEpOworICAgIEN2TWF0IGNyb3RNYXRyMiA9IGN2TWF0KDMsMyxDVl9NQVQzMkYscm90TWF0cjIpOworICAgIEN2TWF0IGN0cmFuc1ZlY3QxID0gY3ZNYXQoMywxLENWX01BVDMyRix0cmFuc1ZlY3QxKTsKKyAgICBDdk1hdCBjdHJhbnNWZWN0MiA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsdHJhbnNWZWN0Mik7CisgICAgQ3ZNYXQgY2VwaXBvbGUxID0gY3ZNYXQoMywxLENWX01BVDMyRixlcGlwb2xlMSk7CisgICAgQ3ZNYXQgY2VwaXBvbGUyID0gY3ZNYXQoMywxLENWX01BVDMyRixlcGlwb2xlMik7CisKKworICAgIEN2TWF0IGNtYXRyUDEgICA9IGN2TWF0KDMsMyxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjbWF0clAxKTsKKyAgICBDdk1hdCBjbWF0clAyICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY21hdHJQMik7CisgICAgQ3ZNYXQgY3ZlY3RwMSAgID0gY3ZNYXQoMywxLENWX01BVDMyRiwwKTsgY3ZtQWxsb2MoJmN2ZWN0cDEpOworICAgIEN2TWF0IGN2ZWN0cDIgICA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjdmVjdHAyKTsKKyAgICBDdk1hdCBjdG1wRjEgICAgPSBjdk1hdCgzLDEsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY3RtcEYxKTsKKyAgICBDdk1hdCBjdG1wTTEgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY3RtcE0xKTsKKyAgICBDdk1hdCBjdG1wTTIgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY3RtcE0yKTsKKyAgICBDdk1hdCBjaW52UDEgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY2ludlAxKTsKKyAgICBDdk1hdCBjaW52UDIgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY2ludlAyKTsKKyAgICBDdk1hdCBjdG1wTWF0ciAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY3RtcE1hdHIpOworICAgIEN2TWF0IGN0bXBWZWN0MSA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjdG1wVmVjdDEpOworICAgIEN2TWF0IGN0bXBWZWN0MiA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjdG1wVmVjdDIpOworICAgIEN2TWF0IGNtYXRyRjEgICA9IGN2TWF0KDMsMyxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjbWF0ckYxKTsKKyAgICBDdk1hdCBjdG1wRiAgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLDApOyBjdm1BbGxvYygmY3RtcEYpOworICAgIEN2TWF0IGN0bXBFMSAgICA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjdG1wRTEpOworICAgIEN2TWF0IGN0bXBFMiAgICA9IGN2TWF0KDMsMSxDVl9NQVQzMkYsMCk7IGN2bUFsbG9jKCZjdG1wRTIpOworCisgICAgLyogQ29tcHV0ZSBmaXJzdCAqLworICAgIGN2bU11bCggJmNjYW1NYXRyMSwgJmNyb3RNYXRyMSwgJmNtYXRyUDEpOworICAgIGN2bUludmVydCggJmNtYXRyUDEsJmNpbnZQMSApOworICAgIGN2bU11bCggJmNjYW1NYXRyMSwgJmN0cmFuc1ZlY3QxLCAmY3ZlY3RwMSApOworICAgIAorICAgIC8qIENvbXB1dGUgc2Vjb25kICovCisgICAgY3ZtTXVsKCAmY2NhbU1hdHIyLCAmY3JvdE1hdHIyLCAmY21hdHJQMiApOworICAgIGN2bUludmVydCggJmNtYXRyUDIsJmNpbnZQMiApOworICAgIGN2bU11bCggJmNjYW1NYXRyMiwgJmN0cmFuc1ZlY3QyLCAmY3ZlY3RwMiApOworCisgICAgY3ZtTXVsKCAmY21hdHJQMSwgJmNpbnZQMiwgJmN0bXBNMSk7CisgICAgY3ZtTXVsKCAmY3RtcE0xLCAmY3ZlY3RwMiwgJmN0bXBWZWN0MSk7CisgICAgY3ZtU3ViKCAmY3ZlY3RwMSwmY3RtcFZlY3QxLCZjdG1wRTEpOworCisgICAgY3ZtTXVsKCAmY21hdHJQMiwgJmNpbnZQMSwgJmN0bXBNMik7CisgICAgY3ZtTXVsKCAmY3RtcE0yLCAmY3ZlY3RwMSwgJmN0bXBWZWN0Mik7CisgICAgY3ZtU3ViKCAmY3ZlY3RwMiwgJmN0bXBWZWN0MiwgJmN0bXBFMik7CisKKworICAgIC8qIE5lZWQgc2NhbGUgKi8KKworICAgIGN2bVNjYWxlKCZjdG1wRTEsJmNlcGlwb2xlMSwxLjApOworICAgIGN2bVNjYWxlKCZjdG1wRTIsJmNlcGlwb2xlMiwxLjApOworCisgICAgY3ZtRnJlZSgmY21hdHJQMSk7CisgICAgY3ZtRnJlZSgmY21hdHJQMSk7CisgICAgY3ZtRnJlZSgmY3ZlY3RwMSk7CisgICAgY3ZtRnJlZSgmY3ZlY3RwMik7CisgICAgY3ZtRnJlZSgmY3RtcEYxKTsKKyAgICBjdm1GcmVlKCZjdG1wTTEpOworICAgIGN2bUZyZWUoJmN0bXBNMik7CisgICAgY3ZtRnJlZSgmY2ludlAxKTsKKyAgICBjdm1GcmVlKCZjaW52UDIpOworICAgIGN2bUZyZWUoJmN0bXBNYXRyKTsKKyAgICBjdm1GcmVlKCZjdG1wVmVjdDEpOworICAgIGN2bUZyZWUoJmN0bXBWZWN0Mik7CisgICAgY3ZtRnJlZSgmY21hdHJGMSk7CisgICAgY3ZtRnJlZSgmY3RtcEYpOworICAgIGN2bUZyZWUoJmN0bXBFMSk7CisgICAgY3ZtRnJlZSgmY3RtcEUyKTsKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9LyogY3ZDb21wdXRlRXBpcG9sZXMgKi8KKworCisvKiBDb21wdXRlIGVwaXBvbGVzIGZvciBmdW5kYW1lbnRhbCBtYXRyaXggKi8KK2ludCBjdkNvbXB1dGVFcGlwb2xlc0Zyb21GdW5kTWF0cml4KEN2TWF0cjMyZiBmdW5kTWF0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBlcGlwb2xlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmKiBlcGlwb2xlMikKK3sKKyAgICAvKiBEZWNvbXBvc2UgZnVuZGFtZW50YWwgbWF0cml4IHVzaW5nIFNWRCAoIEEgPSBVIFcgVicpICovCisgICAgQ3ZNYXQgZnVuZE1hdHJDID0gY3ZNYXQoMywzLENWX01BVDMyRixmdW5kTWF0cik7CisKKyAgICBDdk1hdCogbWF0clcgPSBjdkNyZWF0ZU1hdCgzLDMsQ1ZfTUFUMzJGKTsKKyAgICBDdk1hdCogbWF0clUgPSBjdkNyZWF0ZU1hdCgzLDMsQ1ZfTUFUMzJGKTsKKyAgICBDdk1hdCogbWF0clYgPSBjdkNyZWF0ZU1hdCgzLDMsQ1ZfTUFUMzJGKTsKKworICAgIC8qIEZyb20gc3ZkIHdlIG5lZWQganVzdCBsYXN0IHZlY3RvciBvZiBVIGFuZCBWIG9yIGxhc3Qgcm93IGZyb20gVScgYW5kIFYnICovCisgICAgLyogV2UgZ2V0IHRyYW5zcG9zZWQgbWF0cml4ZXMgVSBhbmQgViAqLworICAgIGN2U1ZEKCZmdW5kTWF0ckMsbWF0clcsbWF0clUsbWF0clYsQ1ZfU1ZEX1ZfVHxDVl9TVkRfVV9UKTsKKworICAgIC8qIEdldCBsYXN0IHJvdyBmcm9tIFUnIGFuZCBjb21wdXRlIGVwaXBvbGUxICovCisgICAgZXBpcG9sZTEtPnggPSBtYXRyVS0+ZGF0YS5mbFs2XTsKKyAgICBlcGlwb2xlMS0+eSA9IG1hdHJVLT5kYXRhLmZsWzddOworICAgIGVwaXBvbGUxLT56ID0gbWF0clUtPmRhdGEuZmxbOF07CisgICAgCisgICAgLyogR2V0IGxhc3Qgcm93IGZyb20gVicgYW5kIGNvbXB1dGUgZXBpcG9sZTIgKi8KKyAgICBlcGlwb2xlMi0+eCA9IG1hdHJWLT5kYXRhLmZsWzZdOworICAgIGVwaXBvbGUyLT55ID0gbWF0clYtPmRhdGEuZmxbN107CisgICAgZXBpcG9sZTItPnogPSBtYXRyVi0+ZGF0YS5mbFs4XTsKKworICAgIGN2UmVsZWFzZU1hdCgmbWF0clcpOworICAgIGN2UmVsZWFzZU1hdCgmbWF0clUpOworICAgIGN2UmVsZWFzZU1hdCgmbWF0clYpOyAgICAKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKK2ludCBjdkNvbnZlcnRFc3NlbnRpYWwyRnVuZGFtZW50YWwoIEN2TWF0cjMyZiBlc3NNYXRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgZnVuZE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjMyZiBjYW1lcmFNYXRyMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmIGNhbWVyYU1hdHIyKQorey8qIEZ1bmQgPSBpbnYoQ00xJykgKiBFc3MgKiBpbnYoQ00yKSAqLworCisgICAgQ3ZNYXQgZXNzTWF0ckMgICAgID0gY3ZNYXQoMywzLENWX01BVDMyRixlc3NNYXRyKTsKKyAgICBDdk1hdCBmdW5kTWF0ckMgICAgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLGZ1bmRNYXRyKTsKKyAgICBDdk1hdCBjYW1lcmFNYXRyMUMgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLGNhbWVyYU1hdHIxKTsKKyAgICBDdk1hdCBjYW1lcmFNYXRyMkMgPSBjdk1hdCgzLDMsQ1ZfTUFUMzJGLGNhbWVyYU1hdHIyKTsKKworICAgIEN2TWF0KiBpbnZDTTIgID0gY3ZDcmVhdGVNYXQoMywzLENWX01BVDMyRik7CisgICAgQ3ZNYXQqIHRtcE1hdHIgPSBjdkNyZWF0ZU1hdCgzLDMsQ1ZfTUFUMzJGKTsKKyAgICBDdk1hdCogaW52Q00xVCA9IGN2Q3JlYXRlTWF0KDMsMyxDVl9NQVQzMkYpOworCisgICAgY3ZUcmFuc3Bvc2UoJmNhbWVyYU1hdHIxQyx0bXBNYXRyKTsKKyAgICBjdkludmVydCh0bXBNYXRyLGludkNNMVQpOyAgICAgICAKKyAgICBjdm1NdWwoaW52Q00xVCwmZXNzTWF0ckMsdG1wTWF0cik7CisgICAgY3ZJbnZlcnQoJmNhbWVyYU1hdHIyQyxpbnZDTTIpOworICAgIGN2bU11bCh0bXBNYXRyLGludkNNMiwmZnVuZE1hdHJDKTsKKworICAgIC8qIFNjYWxlIGZ1bmRhbWVudGFsIG1hdHJpeCAqLworICAgIGRvdWJsZSBzY2FsZTsKKyAgICBzY2FsZSA9IDEuMC9mdW5kTWF0ckMuZGF0YS5mbFs4XTsKKyAgICBjdkNvbnZlcnRTY2FsZSgmZnVuZE1hdHJDLCZmdW5kTWF0ckMsc2NhbGUpOworCisgICAgY3ZSZWxlYXNlTWF0KCZpbnZDTTIpOworICAgIGN2UmVsZWFzZU1hdCgmdG1wTWF0cik7CisgICAgY3ZSZWxlYXNlTWF0KCZpbnZDTTFUKTsKKyAgICAKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKy8qIENvbXB1dGUgZXNzZW50aWFsIG1hdHJpeCAqLworCitpbnQgY3ZDb21wdXRlRXNzZW50aWFsTWF0cml4KCAgQ3ZNYXRyMzJmIHJvdE1hdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgdHJhbnNWZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXRyMzJmIGVzc01hdHIpCit7CisgICAgZmxvYXQgdHJhbnNNYXRyWzldOworCisgICAgLyogTWFrZSBhbnRpc3ltbWV0cmljIG1hdHJpeCBmcm9tIHRyYW5zcG9zZSB2ZWN0b3IgKi8KKyAgICB0cmFuc01hdHJbMF0gPSAgIDA7CisgICAgdHJhbnNNYXRyWzFdID0gLSB0cmFuc1ZlY3RbMl07CisgICAgdHJhbnNNYXRyWzJdID0gICB0cmFuc1ZlY3RbMV07CisgICAgCisgICAgdHJhbnNNYXRyWzNdID0gICB0cmFuc1ZlY3RbMl07CisgICAgdHJhbnNNYXRyWzRdID0gICAwOworICAgIHRyYW5zTWF0cls1XSA9IC0gdHJhbnNWZWN0WzBdOworICAgIAorICAgIHRyYW5zTWF0cls2XSA9IC0gdHJhbnNWZWN0WzFdOworICAgIHRyYW5zTWF0cls3XSA9ICAgdHJhbnNWZWN0WzBdOworICAgIHRyYW5zTWF0cls4XSA9ICAgMDsKKworICAgIGljdk11bE1hdHJpeF8zMmYodHJhbnNNYXRyLDMsMyxyb3RNYXRyLDMsMyxlc3NNYXRyKTsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZmYWNlLmNwcCBiL2N2YXV4L3NyYy9jdmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZTZkZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZmYWNlLmNwcApAQCAtMCwwICsxLDM1NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLyBDcmVhdGVkIGJ5IEtodWR5YWtvdiBWLkEuIGJvYmVyQGdvcm9kb2submV0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlICJfY3ZmYWNlZGV0ZWN0aW9uLmgiCisKK0ZhY2U6OkZhY2UoRmFjZVRlbXBsYXRlICogbHBGYWNlVGVtcGxhdGUpCit7CisgICAgLy9pbml0IG51bWJlciBvZiBmYWNlIGVsZW1lbnRzOworICAgIG1fbEZhY2VGZWF0dXJlc051bWJlciA9IGxwRmFjZVRlbXBsYXRlLT5HZXRDb3VudCgpOworICAgIAorICAgIC8vaW5pdCBhcnJheSBvZiBudW1iZXJzIG9mIGZvdW5kZXQgZmFjZSBlbGVtZW50cyBvZiBlYWNoIHR5cGUKKyAgICBtX2xwbEZhY2VGZWF0dXJlc0NvdW50ID0gbmV3IGxvbmdbbV9sRmFjZUZlYXR1cmVzTnVtYmVyXTsgICAKKyAgICBtZW1zZXQobV9scGxGYWNlRmVhdHVyZXNDb3VudCwwLG1fbEZhY2VGZWF0dXJlc051bWJlcipzaXplb2YobG9uZykpOworICAgIAorICAgIC8vaW5pdCBhcnJheSBvZiBpZGVhbCBmYWNlIGZlYXR1cmVzCisgICAgbV9scElkZWFsRmFjZSA9IG5ldyBGYWNlRmVhdHVyZVttX2xGYWNlRmVhdHVyZXNOdW1iZXJdOworCisgICAgLy9pbml0IGFycmF5IG9mIGZvdW5kZWQgZmVhdHVyZXMKKyAgICBtX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXMgPSBuZXcgRmFjZUZlYXR1cmUqW21fbEZhY2VGZWF0dXJlc051bWJlcl07CisgICAgCisgICAgZm9yIChpbnQgaSA9IDA7aSA8IG1fbEZhY2VGZWF0dXJlc051bWJlcjtpICsrKQorICAgIHsKKyAgICAgICAgbV9scHBGb3VuZGVkRmFjZUZlYXR1cmVzW2ldID0gKG5ldyBGYWNlRmVhdHVyZVszKk1BWF9MQVlFUlNdKTsKKyAgICB9CisKKyAgICAvL3NldCBzdGFydCB3ZWlnaHQgMAorICAgIG1fZFdlaWdodCA9IDA7ICAKKworfS8vRmFjZTo6RmFjZShGYWNlVGVtcGxhdGUgKiBscEZhY2VUZW1wbGF0ZSkKKworRmFjZTo6fkZhY2UoKQoreworICAgIGZvciAoaW50IGkgPSAwO2kgPCBtX2xGYWNlRmVhdHVyZXNOdW1iZXI7aSArKykKKyAgICB7CisgICAgICAgIGRlbGV0ZSBbXSAobV9scHBGb3VuZGVkRmFjZUZlYXR1cmVzW2ldKTsKKyAgICB9CisgICAgZGVsZXRlIFtdIG1fbHBwRm91bmRlZEZhY2VGZWF0dXJlczsKKyAgICAKKyAgICAKKyAgICBkZWxldGUgW10gbV9scGxGYWNlRmVhdHVyZXNDb3VudDsKKyAgICBkZWxldGUgW10gbV9scElkZWFsRmFjZTsKKworfS8vRmFjZTo6fkZhY2UoKQorCisKKyNkZWZpbmUgVVBfU0NBTEUgICAgMQorI2RlZmluZSBET1dOX1NDQUxFICAyCisKKworLy8vLy8vLy8vLy8vCisvL2NsYXNzIFJGYWNlKHJlY3QgYmFzZWQgZmFjZSkgCisvLy8vLy8vLy8vLy8KK1JGYWNlOjpSRmFjZShGYWNlVGVtcGxhdGUgKiBscEZhY2VUZW1wbGF0ZSk6RmFjZShscEZhY2VUZW1wbGF0ZSkKK3sKKyAgICAvL2luaXQgaWRlYWwgZmFjZQorICAgIEZhY2VGZWF0dXJlICogbHBUbXAgPSBscEZhY2VUZW1wbGF0ZS0+R2V0RmVhdHVyZXMoKTsKKyAgICAKKyAgICBmb3IgKGludCBqID0gMDtqIDwgbV9sRmFjZUZlYXR1cmVzTnVtYmVyO2ogKyspCisgICAgeworICAgICAgICBDdlJlY3QgKiBscFRtcFJlY3QgPSBOVUxMOworICAgICAgICBscFRtcFJlY3QgPSBuZXcgQ3ZSZWN0OworICAgICAgICAqbHBUbXBSZWN0ID0gKihDdlJlY3QqKWxwVG1wW2pdLkdldENvbnRvdXIoKTsgCisgICAgICAgIAorICAgICAgICBtX2xwSWRlYWxGYWNlW2pdLlNldENvbnRvdXIoIGxwVG1wUmVjdCApOworICAgICAgICBtX2xwSWRlYWxGYWNlW2pdLlNldFdlaWdodCggbHBUbXBbal0uR2V0V2VpZ2h0KCkgKTsKKyAgICAgICAgbV9scElkZWFsRmFjZVtqXS5TZXRGZWF0dXJlKCBscFRtcFtqXS5pc0ZhY2VGZWF0dXJlKCkgKTsKKworICAgIH0KKworICAgIG1fYklzR2VuZXJhdGVkID0gZmFsc2U7Cit9Ly9SRmFjZTo6UkZhY2UoRmFjZVRlbXBsYXRlICogbHBGYWNlVGVtcGxhdGUpCisKK1JGYWNlOjp+UkZhY2UoKQoreworCit9Ly9SRmFjZTo6flJGYWNlKCkKKworaW5saW5lIGJvb2wgUkZhY2U6OmlzUG9pbnRJblJlY3QoQ3ZQb2ludCBwLEN2UmVjdCByZWN0KQoreworICAgIGlmICggKHAueCA+PSByZWN0LngpICYmIChwLnkgPj0gcmVjdC55KSAmJiAocC54IDw9IHJlY3QueCArIHJlY3Qud2lkdGgpICYmIChwLnkgPD0gcmVjdC55ICsgcmVjdC5oZWlnaHQpICkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9Ly9pbmxpbmUgYm9vbCBSRmFjZTo6aXNQb2ludEluUmVjdChDdlBvaW50LEN2UmVjdCByZWN0KQorCitkb3VibGUgUkZhY2U6OkdldFdlaWdodCgpCit7CisgICAgcmV0dXJuIG1fZFdlaWdodDsKK30vL2RvdWJsZSBSRmFjZTo6R2V0V2VpZ2h0KCkKKworCitib29sIFJGYWNlOjpDaGVja0VsZW0odm9pZCAqIGxwQ2FuZGlkYXQsdm9pZCAqIGxwSWRlYWwpCit7CisgICAgCisgICAgQ3ZSZWN0IElkZWFsUmVjdCA9ICooQ3ZSZWN0KilscElkZWFsOworICAgIEN2UmVjdCBSZWN0ID0gKihDdlJlY3QqKWxwQ2FuZGlkYXQ7CisKKyAgICBpZiAoUmVjdC5oZWlnaHQgPiBSZWN0LndpZHRoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgbG9uZyBTaXplSWRlYWwgPSBJZGVhbFJlY3Qud2lkdGgqSWRlYWxSZWN0LmhlaWdodDsKKyAgICBsb25nIFNpemUgPSBSZWN0LndpZHRoKlJlY3QuaGVpZ2h0OworICAgIAorICAgIGlmICggKFNpemUgPiBTaXplSWRlYWwpIHx8ICggU2l6ZSA8IChTaXplSWRlYWwvNSkgKSApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworLy8gIEN2UmVjdCBVcFJlY3Q7CisvLyAgQ3ZSZWN0IERvd25SZWN0OworLy8gIFJlc2l6ZVJlY3QoSWRlYWxSZWN0LCZVcFJlY3QsVVBfU0NBTEUsNyk7CisvLyAgUmVzaXplUmVjdChJZGVhbFJlY3QsJkRvd25SZWN0LERPV05fU0NBTEUsNyk7CisKKyAgICBsb25nIHggPSBSZWN0LnggKyBjdlJvdW5kKFJlY3Qud2lkdGgvMik7ICAKKyAgICBsb25nIHkgPSBSZWN0LnkgKyBjdlJvdW5kKFJlY3QuaGVpZ2h0LzIpOworCisgICAgaWYgKCBpc1BvaW50SW5SZWN0KGN2UG9pbnQoeCx5KSxJZGVhbFJlY3QpICkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgCisvLyAgaWYgKCBpc1BvaW50SW5SZWN0KGN2UG9pbnQoUmVjdC54LFJlY3QueSksVXBSZWN0KSAmJiAKKy8vICAgICAgIGlzUG9pbnRJblJlY3QoY3ZQb2ludChSZWN0LnggKyBSZWN0LndpZHRoLFJlY3QueSArIFJlY3QuaGVpZ2h0KSxVcFJlY3QgKSAmJgorLy8gICAgICAgaXNQb2ludEluUmVjdChjdlBvaW50KERvd25SZWN0LngsRG93blJlY3QueSksUmVjdCkgJiYKKy8vICAgICAgIGlzUG9pbnRJblJlY3QoY3ZQb2ludChEb3duUmVjdC54ICsgRG93blJlY3Qud2lkdGgsRG93blJlY3QueSArIERvd25SZWN0LmhlaWdodCksUmVjdCkgKQorLy8gICAgICByZXR1cm4gdHJ1ZTsKKyAgICAKKyAgICAKKy8vICBpZiAoIGlzUG9pbnRJblJlY3QoY3ZQb2ludChSZWN0LngsUmVjdC55KSxJZGVhbFJlY3QpICYmIAorLy8gICAgICAgaXNQb2ludEluUmVjdChjdlBvaW50KFJlY3QueCArIFJlY3Qud2lkdGgsUmVjdC55ICsgUmVjdC5oZWlnaHQpLElkZWFsUmVjdCApICkKKy8vICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAKKyAgICByZXR1cm4gZmFsc2U7Cit9Ly9pbmxpbmUgYm9vbCBSRmFjZTo6Q2hlY2tFbGVtKEN2UmVjdCByZWN0KQorCisKKwordm9pZCBSRmFjZTo6Q2FsY3VsYXRlRXJyb3IoRmFjZURhdGEgKiBscEZhY2VEYXRhKQoreworICAgIEN2UmVjdCBMZWZ0RXllUmVjdCA9IGxwRmFjZURhdGEtPkxlZnRFeWVSZWN0OworICAgIEN2UmVjdCBSaWdodEV5ZVJlY3QgPSBscEZhY2VEYXRhLT5SaWdodEV5ZVJlY3Q7CisgICAgQ3ZSZWN0IE1vdXRoUmVjdCA9IGxwRmFjZURhdGEtPk1vdXRoUmVjdDsKKyAgICAKKyAgICBsb25nIExlZnRTcXVhcmUgPSBMZWZ0RXllUmVjdC53aWR0aCpMZWZ0RXllUmVjdC5oZWlnaHQ7CisgICAgbG9uZyBSaWdodFNxdWFyZSA9IFJpZ2h0RXllUmVjdC53aWR0aCpSaWdodEV5ZVJlY3QuaGVpZ2h0OworCisgICAgbG9uZyBkeSA9IExlZnRFeWVSZWN0LnkgLSBSaWdodEV5ZVJlY3QueTsKKyAgICAKKyAgICBsb25nIGR4MSA9IExlZnRFeWVSZWN0LnggKyBMZWZ0RXllUmVjdC53aWR0aC8yIC0gTW91dGhSZWN0Lng7CisgICAgbG9uZyBkeDIgPSBSaWdodEV5ZVJlY3QueCArIFJpZ2h0RXllUmVjdC53aWR0aC8yIC0gTW91dGhSZWN0LnggLSBNb3V0aFJlY3Qud2lkdGg7CisKKworICAgIGxwRmFjZURhdGEtPkVycm9yID0gKGRvdWJsZSkoTGVmdFNxdWFyZSAtIFJpZ2h0U3F1YXJlKSooZG91YmxlKShMZWZ0U3F1YXJlIC0gUmlnaHRTcXVhcmUpLygoZG91YmxlKShMZWZ0U3F1YXJlICsgUmlnaHRTcXVhcmUpKihMZWZ0U3F1YXJlICsgUmlnaHRTcXVhcmUpKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkoZHkqZHkpLygoZG91YmxlKShMZWZ0RXllUmVjdC5oZWlnaHQgKyBSaWdodEV5ZVJlY3QuaGVpZ2h0KSooTGVmdEV5ZVJlY3QuaGVpZ2h0ICsgUmlnaHRFeWVSZWN0LmhlaWdodCkpICsgCisgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKShkeDEqZHgxKS8oKGRvdWJsZSlNb3V0aFJlY3Qud2lkdGgqTW91dGhSZWN0LndpZHRoKSArIAorICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSkoZHgyKmR4MikvKChkb3VibGUpTW91dGhSZWN0LndpZHRoKk1vdXRoUmVjdC53aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAKK30vL3ZvaWQgUkZhY2U6OkNhbGN1bGF0ZUVycm9yKEZhY2VEYXRhICogbHBGYWNlRGF0YSkKKworI2RlZmluZSBNQVhfRVJST1IgMHhGRkZGRkZGRgorCit2b2lkICBSRmFjZTo6Q3JlYXRlRmFjZSh2b2lkICogbHBEYXRhKQoreworICAgIEZhY2VEYXRhIERhdGE7CisgICAgCisgICAgZG91YmxlIEVycm9yID0gTUFYX0VSUk9SOworICAgIGRvdWJsZSBDdXJFcnJvciA9IE1BWF9FUlJPUjsKKyAgICAKKyAgICBGYWNlRGF0YSAqIGxwRmFjZURhdGEgPSAoRmFjZURhdGEqKWxwRGF0YTsKKyAgICAKKyAgICBpbnQgaW0gPSAwOy8vbW91dGggd2FzIGZpbmQKKyAgICBpbnQgamwgPSAwOy8vbGVmdCBleWUgd2FzIGZpbmQKKyAgICBpbnQga3IgPSAwOy8vcmlnaHQgZXllIHdhcyBmaW5kCisgICAgCisgICAgbG9uZyBNb3V0aE51bWJlciA9IDA7CisgICAgbG9uZyBMZWZ0RXllTnVtYmVyID0gMDsKKyAgICBsb25nIFJpZ2h0RXllTnVtYmVyID0gMDsKKworICAgIGZvciAoaW50IGkgPSAwO2kgPCBtX2xwbEZhY2VGZWF0dXJlc0NvdW50WzBdICsgMTtpICsrKQorICAgIHsKKyAgICAgICAgCisgICAgICAgIGlmICggIW1fbHBsRmFjZUZlYXR1cmVzQ291bnRbMF0gKQorICAgICAgICAgICAgRGF0YS5Nb3V0aFJlY3QgPSAqKEN2UmVjdCopbV9scElkZWFsRmFjZVswXS5HZXRDb250b3VyKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBpICE9IG1fbHBsRmFjZUZlYXR1cmVzQ291bnRbMF0gKQorICAgICAgICAgICAgICAgIERhdGEuTW91dGhSZWN0ID0gKihDdlJlY3QqKW1fbHBwRm91bmRlZEZhY2VGZWF0dXJlc1swXVtpXS5HZXRDb250b3VyKCk7CisgICAgICAgICAgICBpbSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7aiA8IG1fbHBsRmFjZUZlYXR1cmVzQ291bnRbMV0gKyAxO2ogKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCAhbV9scGxGYWNlRmVhdHVyZXNDb3VudFsxXSApCisgICAgICAgICAgICAgICAgRGF0YS5MZWZ0RXllUmVjdCA9ICooQ3ZSZWN0KiltX2xwSWRlYWxGYWNlWzFdLkdldENvbnRvdXIoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBtX2xwbEZhY2VGZWF0dXJlc0NvdW50WzFdICkKKyAgICAgICAgICAgICAgICAgICAgRGF0YS5MZWZ0RXllUmVjdCA9ICooQ3ZSZWN0KiltX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbMV1bal0uR2V0Q29udG91cigpOworICAgICAgICAgICAgICAgIGpsID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKGludCBrID0gMDtrIDwgbV9scGxGYWNlRmVhdHVyZXNDb3VudFsyXSArIDE7ayArKykKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmICggIW1fbHBsRmFjZUZlYXR1cmVzQ291bnRbMl0gKQorICAgICAgICAgICAgICAgICAgICBEYXRhLlJpZ2h0RXllUmVjdCA9ICooQ3ZSZWN0KiltX2xwSWRlYWxGYWNlWzJdLkdldENvbnRvdXIoKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoayAhPSBtX2xwbEZhY2VGZWF0dXJlc0NvdW50WzJdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGEuUmlnaHRFeWVSZWN0ID0gKihDdlJlY3QqKW1fbHBwRm91bmRlZEZhY2VGZWF0dXJlc1syXVtrXS5HZXRDb250b3VyKCk7CisgICAgICAgICAgICAgICAgICAgIGtyID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAgICAgICAgIENhbGN1bGF0ZUVycm9yKCZEYXRhKTsgICAgICAKKyAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCAoaW0gKyBqbCArIGtyKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBFcnJvciA9IERhdGEuRXJyb3IvKGltICsgamwgKyBrcik7CisgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgRXJyb3IgPSBNQVhfRVJST1I7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKEN1ckVycm9yID4gRXJyb3IpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdXJFcnJvciA9IEVycm9yOworICAgICAgICAgICAgICAgICAgICBNb3V0aE51bWJlciA9IGk7CisgICAgICAgICAgICAgICAgICAgIExlZnRFeWVOdW1iZXIgPSBqOworICAgICAgICAgICAgICAgICAgICBSaWdodEV5ZU51bWJlciA9IGs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgfQorCisgICAgfQorCisgICAgaWYgKCBtX2xwbEZhY2VGZWF0dXJlc0NvdW50WzBdICkKKyAgICAgICAgbHBGYWNlRGF0YS0+TW91dGhSZWN0ID0gKihDdlJlY3QqKW1fbHBwRm91bmRlZEZhY2VGZWF0dXJlc1swXVtNb3V0aE51bWJlcl0uR2V0Q29udG91cigpOworICAgIGVsc2UKKyAgICAgICAgbHBGYWNlRGF0YS0+TW91dGhSZWN0ID0gKihDdlJlY3QqKW1fbHBJZGVhbEZhY2VbMF0uR2V0Q29udG91cigpOworCisgICAgaWYgKCBtX2xwbEZhY2VGZWF0dXJlc0NvdW50WzFdICkKKyAgICAgICAgbHBGYWNlRGF0YS0+TGVmdEV5ZVJlY3QgPSAqKEN2UmVjdCopbV9scHBGb3VuZGVkRmFjZUZlYXR1cmVzWzFdW0xlZnRFeWVOdW1iZXJdLkdldENvbnRvdXIoKTsKKyAgICBlbHNlCisgICAgICAgIGxwRmFjZURhdGEtPkxlZnRFeWVSZWN0ID0gKihDdlJlY3QqKW1fbHBJZGVhbEZhY2VbMV0uR2V0Q29udG91cigpOworICAgIAorICAgIGlmICggbV9scGxGYWNlRmVhdHVyZXNDb3VudFsyXSApCisgICAgICAgIGxwRmFjZURhdGEtPlJpZ2h0RXllUmVjdCA9ICooQ3ZSZWN0KiltX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbMl1bUmlnaHRFeWVOdW1iZXJdLkdldENvbnRvdXIoKTsKKyAgICBlbHNlCisgICAgICAgIGxwRmFjZURhdGEtPlJpZ2h0RXllUmVjdCA9ICooQ3ZSZWN0KiltX2xwSWRlYWxGYWNlWzJdLkdldENvbnRvdXIoKTsKKworICAgIGxwRmFjZURhdGEtPkVycm9yID0gQ3VyRXJyb3I7CisKK30vL3ZvaWQgKiBSRmFjZTo6Q3JlYXRlRmFjZSgpCisKK3ZvaWQgUkZhY2U6OlNob3coSXBsSW1hZ2UgKiBJbWFnZSkKK3sKKyAgICBmb3IgKGludCBpID0gMDtpIDwgbV9sRmFjZUZlYXR1cmVzTnVtYmVyO2kgKyspCisgICAgeworICAgICAgICBpZiAobV9scGxGYWNlRmVhdHVyZXNDb3VudFtpXSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7aiA8IG1fbHBsRmFjZUZlYXR1cmVzQ291bnRbaV07aiArKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlJlY3QgcmVjdCA9ICooQ3ZSZWN0KiltX2xwcEZvdW5kZWRGYWNlRmVhdHVyZXNbaV1bal0uR2V0Q29udG91cigpOworICAgICAgICAgICAgICAgIEN2UG9pbnQgcDEgPSBjdlBvaW50KHJlY3QueCxyZWN0LnkpOworICAgICAgICAgICAgICAgIEN2UG9pbnQgcDIgPSBjdlBvaW50KHJlY3QueCArIHJlY3Qud2lkdGgscmVjdC55ICsgcmVjdC5oZWlnaHQpOworICAgICAgICAgICAgICAgIGN2UmVjdGFuZ2xlKEltYWdlLHAxLHAyLENWX1JHQigyNTUsMCwwKSwxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfS8vdm9pZCBSRmFjZTo6U2hvdyhJcGxJbWFnZSAqIEltYWdlKQorCit2b2lkIFJGYWNlOjpTaG93SWRlYWwoSXBsSW1hZ2UqIEltYWdlKQoreworICAgIGZvciAoaW50IGkgPSAwO2kgPCBtX2xGYWNlRmVhdHVyZXNOdW1iZXI7aSArKykKKyAgICB7CisgICAgICAgIEN2UmVjdCBSZWN0ID0gKihDdlJlY3QqKW1fbHBJZGVhbEZhY2VbaV0uR2V0Q29udG91cigpOworICAgICAgICBDdlBvaW50IHAxID0gY3ZQb2ludChSZWN0LngsUmVjdC55KTsKKyAgICAgICAgQ3ZQb2ludCBwMiA9IGN2UG9pbnQoUmVjdC54ICsgUmVjdC53aWR0aCxSZWN0LnkgKyBSZWN0LmhlaWdodCk7CisgICAgICAgIGN2UmVjdGFuZ2xlKEltYWdlLHAxLHAyLENWX1JHQigwLDAsMjU1KSwxKTsKKyAgICB9Cit9Ly92b2lkIFJGYWNlOjpTaG93SWRlYWwoSXBsSW1hZ2UqIEltYWdlKQorCisKK2lubGluZSB2b2lkIFJGYWNlOjpSZXNpemVSZWN0KEN2UmVjdCBSZWN0LEN2UmVjdCAqIGxwUmVjdCxsb25nIGxEaXIsbG9uZyBsRCkKK3sKKyAgICBpZiAobERpciA9PSBVUF9TQ0FMRSkKKyAgICB7CisgICAgICAgIGxwUmVjdC0+eCA9IFJlY3QueCAtIGxEOworICAgICAgICBscFJlY3QtPnkgPSBSZWN0LnkgLSBsRDsKKyAgICAgICAgbHBSZWN0LT53aWR0aCA9IFJlY3Qud2lkdGggKyAyKmxEOworICAgICAgICBscFJlY3QtPmhlaWdodCA9IFJlY3QuaGVpZ2h0ICsgMipsRDsKKyAgICB9CisgICAgaWYgKGxEaXIgPT0gRE9XTl9TQ0FMRSkKKyAgICB7CisgICAgICAgIGxwUmVjdC0+eCA9IFJlY3QueCArIGxEOworICAgICAgICBscFJlY3QtPnkgPSBSZWN0LnkgKyBsRDsKKyAgICAgICAgaWYgKFJlY3Qud2lkdGggLSAyKmxEID49IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxwUmVjdC0+d2lkdGggPSBSZWN0LndpZHRoIC0gMipsRDsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGxwUmVjdC0+d2lkdGggPSAwOworICAgICAgICAKKyAgICAgICAgaWYgKFJlY3QuaGVpZ2h0IC0gMipsRCA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBscFJlY3QtPmhlaWdodCA9IFJlY3QuaGVpZ2h0IC0gMipsRDsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGxwUmVjdC0+aGVpZ2h0ID0gMDsKKyAgICB9CisKK30vLyBpbmxpbmUgdm9pZCBSRmFjZTo6UmVzaXplUmVjdChDdlJlY3QgKiBscFJlY3QsbG9uZyBsRGlyLGxvbmcgbEQpCisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmZhY2VkZXRlY3Rpb24uY3BwIGIvY3ZhdXgvc3JjL2N2ZmFjZWRldGVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwNGRmNwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmZhY2VkZXRlY3Rpb24uY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vIENyZWF0ZWQgYnkgS2h1ZHlha292IFYuQS4gYm9iZXJAZ29yb2Rvay5uZXQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIEZhY2VEZXRlY3Rpb24uY3BwOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRmFjZURldGVjdGlvbiBjbGFzcy4KKy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlICJfY3ZmYWNlZGV0ZWN0aW9uLmgiCisKKworaW50IENWX0NERUNMIENvbXBhcmVDb250b3VyUmVjdChjb25zdCB2b2lkKiBlbDEsIGNvbnN0IHZvaWQqIGVsMiwgdm9pZCogdXNlcmRhdGEpOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworRmFjZURldGVjdGlvbjo6RmFjZURldGVjdGlvbigpCit7CisKKyAgICBtX2ltZ0dyYXkgPSBOVUxMOworICAgIG1faW1nVGhyZXNoID0gTlVMTDsKKyAgICBtX21zdGdDb250b3VycyA9IE5VTEw7CisgICAgbWVtc2V0KG1fc2VxQ29udG91cnMsIDAsIHNpemVvZihDdlNlcSopICogTUFYX0xBWUVSUyk7CisgICAgbV9tc3RnUmVjdHMgPSBOVUxMOworICAgIG1fc2VxUmVjdHMgPSBOVUxMOworICAgIG1faU51bUxheWVycyA9IDE2OworICAgIGFzc2VydChtX2lOdW1MYXllcnMgPD0gTUFYX0xBWUVSUyk7CisgICAgbV9wRmFjZUxpc3QgPSBuZXcgTGlzdCgpOworICAgIAorCisKKyAgICBtX2JCb29zdGluZyA9IGZhbHNlOworCit9Ly8gRmFjZURldGVjdGlvbigpCisKK0ZhY2VEZXRlY3Rpb246On5GYWNlRGV0ZWN0aW9uKCkKK3sKKyAgICBpZiAobV9pbWdHcmF5KQorICAgICAgICBjdlJlbGVhc2VJbWFnZSgmbV9pbWdHcmF5KTsKKworICAgIGlmIChtX2ltZ1RocmVzaCkKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoJm1faW1nVGhyZXNoKTsKKworICAgIGlmIChtX21zdGdDb250b3VycykKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmbV9tc3RnQ29udG91cnMpOworCisgICAgaWYgKG1fbXN0Z1JlY3RzKQorICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZtX21zdGdSZWN0cyk7CisgICAgCisKK30vLyB+RmFjZURldGVjdGlvbigpCisKK3ZvaWQgRmFjZURldGVjdGlvbjo6RmluZENvbnRvdXJzKElwbEltYWdlKiBpbWdHcmF5KQoreworICAgIFJlYWxsb2NJbWFnZSgmbV9pbWdUaHJlc2gsIGN2R2V0U2l6ZShpbWdHcmF5KSwgMSk7CisgICAgaWYgKE5VTEwgPT0gbV9pbWdUaHJlc2gpCisgICAgICAgIHJldHVybjsKKyAgICAvLworICAgIGludCBpTnVtTGF5ZXJzID0gbV9pTnVtTGF5ZXJzOworICAgIGludCBpTWluTGV2ZWwgPSAwLCBpTWF4TGV2ZWwgPSAyNTUsIGlTdGVwID0gMjU1IC8gaU51bUxheWVyczsKKyAgICBUaHJlc2hvbGRpbmdQYXJhbShpbWdHcmF5LCBpTnVtTGF5ZXJzLCBpTWluTGV2ZWwsIGlNYXhMZXZlbCwgaVN0ZXApOworICAgIC8vIGluaXQKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZtX21zdGdDb250b3Vycyk7CisgICAgbV9tc3RnQ29udG91cnMgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoKTsKKyAgICBpZiAoTlVMTCA9PSBtX21zdGdDb250b3VycykKKyAgICAgICAgcmV0dXJuOworICAgIG1lbXNldChtX3NlcUNvbnRvdXJzLCAwLCBzaXplb2YoQ3ZTZXEqKSAqIE1BWF9MQVlFUlMpOworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmbV9tc3RnUmVjdHMpOworICAgIG1fbXN0Z1JlY3RzID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCk7CisgICAgaWYgKE5VTEwgPT0gbV9tc3RnUmVjdHMpCisgICAgICAgIHJldHVybjsKKyAgICBtX3NlcVJlY3RzID0gY3ZDcmVhdGVTZXEoMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2Q29udG91clJlY3QpLCBtX21zdGdSZWN0cyk7IAorICAgIGlmIChOVUxMID09IG1fc2VxUmVjdHMpCisgICAgICAgIHJldHVybjsKKyAgICAvLyBmaW5kIGNvbnRvdXJzCisgICAgZm9yIChpbnQgbCA9IGlNaW5MZXZlbCwgaSA9IDA7IGwgPCBpTWF4TGV2ZWw7IGwgKz0gaVN0ZXAsIGkrKykKKyAgICB7CisgICAgICAgIGN2VGhyZXNob2xkKGltZ0dyYXksIG1faW1nVGhyZXNoLCAoZG91YmxlKWwsIChkb3VibGUpMjU1LCBDVl9USFJFU0hfQklOQVJZKTsKKyAgICAgICAgaWYgKGN2RmluZENvbnRvdXJzKG1faW1nVGhyZXNoLCBtX21zdGdDb250b3VycywgJm1fc2VxQ29udG91cnNbaV0sIHNpemVvZihDdkNvbnRvdXIpLCBDVl9SRVRSX0NDT01QLCBDVl9DSEFJTl9BUFBST1hfU0lNUExFKSkKKyAgICAgICAgICAgIEFkZENvbnRvdXJzMlJlY3QobV9zZXFDb250b3Vyc1tpXSwgbCwgaSk7CisgICAgfQorICAgIC8vIHNvcnQgcmVjdHMKKyAgICBjdlNlcVNvcnQobV9zZXFSZWN0cywgQ29tcGFyZUNvbnRvdXJSZWN0LCBOVUxMKTsKK30vLyB2b2lkIEZhY2VEZXRlY3Rpb246OkZpbmRDb250b3VycyhJcGxJbWFnZSogaW1nR3JheSkKKworI2RlZmluZSBHSVNUX1NURVAgICAxMAorI2RlZmluZSBHSVNUX05VTSAgICAoMjU2IC8gR0lTVF9TVEVQKQorI2RlZmluZSBHSVNUX01JTiAgICAzMgorCit2b2lkIEZhY2VEZXRlY3Rpb246OlRocmVzaG9sZGluZ1BhcmFtKElwbEltYWdlICppbWdHcmF5LCBpbnQgaU51bUxheWVycywgaW50ICZpTWluTGV2ZWwsIGludCAmaU1heExldmVsLCBpbnQgJmlTdGVwKQoreworICAgIGFzc2VydChpbWdHcmF5ICE9IE5VTEwpOworICAgIGFzc2VydChpbWdHcmF5LT5uQ2hhbm5lbHMgPT0gMSk7CisgICAgaW50IGksIGo7CisgICAgLy8gY3JlYXRlIGdpc3RvZ3JhbW0KKyAgICB1Y2hhciogYnVmZkltZyA9ICh1Y2hhciopaW1nR3JheS0+aW1hZ2VEYXRhOworICAgIGludCBnaXN0SW1nW0dJU1RfTlVNICsgMV0gPSB7MH07CisKKyAgICBmb3IgKGogPSAwOyBqIDwgaW1nR3JheS0+aGVpZ2h0OyBqICsrKQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGltZ0dyYXktPndpZHRoOyBpICsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW5kID0gYnVmZkltZ1tpXSAvIEdJU1RfU1RFUDsKKyAgICAgICAgICAgIGdpc3RJbWdbaW5kXSArKzsKKyAgICAgICAgfQorICAgICAgICBidWZmSW1nICs9IGltZ0dyYXktPndpZHRoU3RlcDsKKyAgICB9CisgICAgLy8gcGFyYW1zCisgICAgCisgICAgZm9yIChpID0gMDsgaSA8PSBHSVNUX05VTTsgaSArKykKKyAgICB7CisgICAgICAgIGlmIChnaXN0SW1nW2ldID49IEdJU1RfTUlOKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlNaW5MZXZlbCA9IGkgKiBHSVNUX1NURVA7CisgICAgCisgICAgZm9yIChpID0gR0lTVF9OVU07IGkgPj0gMDsgaSAtLSkKKyAgICB7CisgICAgICAgIGlmIChnaXN0SW1nW2ldID49IEdJU1RfTUlOKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlNYXhMZXZlbCA9IGkgKiBHSVNUX1NURVA7CisgICAgCisgICAgaW50IGRMZXZlbHMgPSBpTWF4TGV2ZWwgLSBpTWluTGV2ZWw7CisgICAgaWYgKGRMZXZlbHMgPD0gMCkKKyAgICB7CisgICAgICAgIGlNaW5MZXZlbCA9IDA7CisgICAgICAgIGlNYXhMZXZlbCA9IDI1NTsKKyAgICB9CisgICAgZWxzZSBpZiAoZExldmVscyA8PSBpTnVtTGF5ZXJzKQorICAgIHsKKyAgICAgICAgaU1pbkxldmVsID0gaU1heExldmVsIC0gaU51bUxheWVyczsKKyAgICAgICAgaWYgKGlNaW5MZXZlbCA8IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlNaW5MZXZlbCA9IDA7CisgICAgICAgICAgICBpTWF4TGV2ZWwgPSBpTnVtTGF5ZXJzOworICAgICAgICB9CisgICAgfQorICAgIGlTdGVwID0gKGlNYXhMZXZlbCAtIGlNaW5MZXZlbCkgLyBpTnVtTGF5ZXJzOworCit9Ly8gdm9pZCBGYWNlRGV0ZWN0aW9uOjpUaHJlc2hvbGRpbmdQYXJhbShJcGxJbWFnZSAqaW1nR3JheSwgaW50IGlOdW1MYXllcnMsIGludCAmaU1pbkxldmVsLCBpbnQgJmlNYXhMZXZlbCwgaW50ICZpU3RlcCkKKworI2lmbmRlZiBNQVhfRVJST1IKKyNkZWZpbmUgTUFYX0VSUk9SIDB4RkZGRkZGRkYKKyNlbmRpZiAvL01BWF9FUlJPUgorCisKK3ZvaWQgRmFjZURldGVjdGlvbjo6Q3JlYXRlUmVzdWx0cyhDdlNlcSAqIGxwU2VxKQoreworICAgIAorICAgIEZhY2UgKiB0bXA7CisgICAgCisgICAgZG91YmxlIE1heCAgPSAwOworICAgIGRvdWJsZSBDdXJTdGF0ID0gMDsKKyAgICAKKyAgICBGYWNlRGF0YSB0bXBEYXRhOworICAgIGlmIChtX2JCb29zdGluZykKKyAgICB7CisgICAgICAgIHRtcCA9IG1fcEZhY2VMaXN0LT5HZXREYXRhKCk7CisgICAgICAgIHRtcC0+Q3JlYXRlRmFjZSgmdG1wRGF0YSk7CisKKyAgICAgICAgQ3ZGYWNlIHRtcEZhY2U7CisgICAgICAgIHRtcEZhY2UuTW91dGhSZWN0ID0gdG1wRGF0YS5Nb3V0aFJlY3Q7CisgICAgICAgIHRtcEZhY2UuTGVmdEV5ZVJlY3QgPSB0bXBEYXRhLkxlZnRFeWVSZWN0OworICAgICAgICB0bXBGYWNlLlJpZ2h0RXllUmVjdCA9IHRtcERhdGEuUmlnaHRFeWVSZWN0OworCisgICAgICAgIGN2U2VxUHVzaChscFNlcSwmdG1wRmFjZSk7CisKKyAgICB9ZWxzZQorICAgIHsKKyAgICAgICAgd2hpbGUgKCAodG1wID0gbV9wRmFjZUxpc3QtPkdldERhdGEoKSkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1clN0YXQgPSB0bXAtPkdldFdlaWdodCgpOworICAgICAgICAgICAgaWYgKEN1clN0YXQgPiBNYXgpCisgICAgICAgICAgICAgICAgTWF4ID0gQ3VyU3RhdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgd2hpbGUgKCAodG1wID0gbV9wRmFjZUxpc3QtPkdldERhdGEoKSkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRtcC0+Q3JlYXRlRmFjZSgmdG1wRGF0YSk7CisgICAgICAgICAgICBDdXJTdGF0ID0gdG1wLT5HZXRXZWlnaHQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKEN1clN0YXQgPT0gTWF4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RmFjZSB0bXBGYWNlOworICAgICAgICAgICAgICAgIHRtcEZhY2UuTW91dGhSZWN0ID0gdG1wRGF0YS5Nb3V0aFJlY3Q7CisgICAgICAgICAgICAgICAgdG1wRmFjZS5MZWZ0RXllUmVjdCA9IHRtcERhdGEuTGVmdEV5ZVJlY3Q7CisgICAgICAgICAgICAgICAgdG1wRmFjZS5SaWdodEV5ZVJlY3QgPSB0bXBEYXRhLlJpZ2h0RXllUmVjdDsKKyAgICAgICAgICAgICAgICBjdlNlcVB1c2gobHBTZXEsJnRtcEZhY2UpOworCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Ly8gdm9pZCBGYWNlRGV0ZWN0aW9uOjpEcmF3UmVzdWx0KElwbEltYWdlKiBpbWcpCisKK3ZvaWQgRmFjZURldGVjdGlvbjo6UmVzZXRJbWFnZSgpCit7CisgICAgICAgIGRlbGV0ZSBtX3BGYWNlTGlzdDsKKyAgICAgICAgbV9wRmFjZUxpc3QgPSBuZXcgTGlzdCgpOworCit9Ly9GYWNlRGV0ZWN0aW9uOjpSZXNldEltYWdlCisKK3ZvaWQgRmFjZURldGVjdGlvbjo6QWRkQ29udG91cnMyUmVjdChDdlNlcSAqc2VxLCBpbnQgY29sb3IsIGludCBpTGF5ZXIpCit7CisgICAgYXNzZXJ0KG1fbXN0Z1JlY3RzICE9IE5VTEwpOworICAgIGFzc2VydChtX3NlcVJlY3RzICE9IE5VTEwpOworCisgICAgQ3ZDb250b3VyUmVjdCBjcjsKKyAgICBmb3IgKEN2U2VxKiBleHRlcm5hbCA9IHNlcTsgZXh0ZXJuYWw7IGV4dGVybmFsID0gZXh0ZXJuYWwtPmhfbmV4dCkKKyAgICB7CisgICAgICAgIGNyLnIgPSBjdkNvbnRvdXJCb3VuZGluZ1JlY3QoZXh0ZXJuYWwsIDEgKTsKKyAgICAgICAgY3IucENlbnRlci54ID0gY3Iuci54ICsgY3Iuci53aWR0aCAvIDI7CisgICAgICAgIGNyLnBDZW50ZXIueSA9IGNyLnIueSArIGNyLnIuaGVpZ2h0IC8gMjsKKyAgICAgICAgY3IuaU51bWJlciA9IGlMYXllcjsKKyAgICAgICAgY3IuaVR5cGUgPSA2OworICAgICAgICBjci5pRmxhZ3MgPSAwOworICAgICAgICBjci5zZXFDb250b3VyID0gZXh0ZXJuYWw7CisgICAgICAgIGNyLmlDb250b3VyTGVuZ3RoID0gZXh0ZXJuYWwtPnRvdGFsOworICAgICAgICBjci5pQ29sb3IgPSBjb2xvcjsKKyAgICAgICAgY3ZTZXFQdXNoKG1fc2VxUmVjdHMsICZjcik7CisgICAgICAgIGZvciAoQ3ZTZXEqIGludGVybmFsID0gZXh0ZXJuYWwtPnZfbmV4dDsgaW50ZXJuYWw7IGludGVybmFsID0gaW50ZXJuYWwtPmhfbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgY3IuciA9IGN2Q29udG91ckJvdW5kaW5nUmVjdChpbnRlcm5hbCwgMCk7ICAgIAorICAgICAgICAgICAgY3IucENlbnRlci54ID0gY3Iuci54ICsgY3Iuci53aWR0aCAvIDI7CisgICAgICAgICAgICBjci5wQ2VudGVyLnkgPSBjci5yLnkgKyBjci5yLmhlaWdodCAvIDI7CisgICAgICAgICAgICBjci5pTnVtYmVyID0gaUxheWVyOworICAgICAgICAgICAgY3IuaVR5cGUgPSAxMjsKKyAgICAgICAgICAgIGNyLmlGbGFncyA9IDA7CisgICAgICAgICAgICBjci5zZXFDb250b3VyID0gaW50ZXJuYWw7CisgICAgICAgICAgICBjci5pQ29udG91ckxlbmd0aCA9IGludGVybmFsLT50b3RhbDsKKyAgICAgICAgICAgIGNyLmlDb2xvciA9IGNvbG9yOworICAgICAgICAgICAgY3ZTZXFQdXNoKG1fc2VxUmVjdHMsICZjcik7CisgICAgICAgIH0KKyAgICB9Cit9Ly8gdm9pZCBGYWNlRGV0ZWN0aW9uOjpBZGRDb250b3VyczJSZWN0KEN2U2VxICpzZXEsIGludCBjb2xvciwgaW50IGlMYXllcikKKworaW50IENWX0NERUNMIENvbXBhcmVDb250b3VyUmVjdChjb25zdCB2b2lkKiBlbDEsIGNvbnN0IHZvaWQqIGVsMiwgdm9pZCogLyp1c2VyZGF0YSovKQoreworICAgIHJldHVybiAoKChDdkNvbnRvdXJSZWN0KillbDEpLT5wQ2VudGVyLnkgLSAoKEN2Q29udG91clJlY3QqKWVsMiktPnBDZW50ZXIueSk7Cit9Ly8gaW50IENWX0NERUNMIENvbXBhcmVDb250b3VyUmVjdChjb25zdCB2b2lkKiBlbDEsIGNvbnN0IHZvaWQqIGVsMiwgdm9pZCogdXNlcmRhdGEpCisKK3ZvaWQgRmFjZURldGVjdGlvbjo6RmluZEZhY2UoSXBsSW1hZ2UgKmltZykKK3sKKyAgICAvLyBmaW5kIGFsbCBjb250b3VycworICAgIEZpbmRDb250b3VycyhpbWcpOworICAgIC8vCisgICAgUmVzZXRJbWFnZSgpOworCisgICAgaWYgKG1fYkJvb3N0aW5nKQorICAgICAgICBQb3N0Qm9vc3RpbmdGaW5kQ2FuZGlkYXRzKGltZyk7CisgICAgZWxzZQorICAgICAgICBGaW5kQ2FuZGlkYXRzKCk7ICAgIAorICAgIAorfS8vIHZvaWQgRmFjZURldGVjdGlvbjo6RmluZEZhY2UoSXBsSW1hZ2UgKmltZykKKworCit2b2lkIEZhY2VEZXRlY3Rpb246OkZpbmRDYW5kaWRhdHMoKQoreworICAgIGJvb2wgYkZvdW5kMSA9IGZhbHNlOworICAgIE1vdXRoRmFjZVRlbXBsYXRlICogbHBGYWNlVGVtcGxhdGUxOworICAgIFJGYWNlICogbHBGYWNlMTsgCisgICAgYm9vbCBiSW52YWxpZFJlY3QxID0gZmFsc2U7CisgICAgQ3ZSZWN0ICogbHBSZWN0MSAgPSBOVUxMOworICAgIAorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9zZXFSZWN0cy0+dG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIEN2Q29udG91clJlY3QqIHBSZWN0ID0gKEN2Q29udG91clJlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCBpKTsKKyAgICAgICAgQ3ZSZWN0IHJlY3QgPSBwUmVjdC0+cjsKKyAgICAgICAgaWYgKHJlY3Qud2lkdGggPj0gMipyZWN0LmhlaWdodCkKKyAgICAgICAgeworCisgICAgICAgICAgICBscEZhY2VUZW1wbGF0ZTEgPSBuZXcgTW91dGhGYWNlVGVtcGxhdGUoMyxyZWN0LDMqKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyooZG91YmxlKXJlY3Qud2lkdGgvKGRvdWJsZSk0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpcmVjdC53aWR0aC8oZG91YmxlKTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdWJsZSlyZWN0LndpZHRoLyhkb3VibGUpMik7CisgICAgCisKKyAgICAgICAgICAgIGxwRmFjZTEgPSBuZXcgUkZhY2UobHBGYWNlVGVtcGxhdGUxKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBtX3NlcVJlY3RzLT50b3RhbDsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29udG91clJlY3QqIHBSZWN0ID0gKEN2Q29udG91clJlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCBqKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoICFiSW52YWxpZFJlY3QxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxwUmVjdDEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBscFJlY3QxID0gbmV3IEN2UmVjdCgpOworICAgICAgICAgICAgICAgICAgICAqbHBSZWN0MSA9IHBSZWN0LT5yOworICAgICAgICAgICAgICAgIH1lbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZWxldGUgbHBSZWN0MTsKKyAgICAgICAgICAgICAgICAgICAgbHBSZWN0MSA9IG5ldyBDdlJlY3QoKTsKKyAgICAgICAgICAgICAgICAgICAgKmxwUmVjdDEgPSBwUmVjdC0+cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCBscEZhY2UxLT5pc0ZlYXR1cmUobHBSZWN0MSkgKQorICAgICAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgICAgIGJGb3VuZDEgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBiSW52YWxpZFJlY3QxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfWVsc2UKKyAgICAgICAgICAgICAgICAgICAgYkludmFsaWRSZWN0MSA9IHRydWU7CisgICAgCisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoYkZvdW5kMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3BGYWNlTGlzdC0+QWRkRWxlbShscEZhY2UxKTsKKyAgICAgICAgICAgICAgICBiRm91bmQxID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbHBGYWNlMSA9IE5VTEw7CisgICAgICAgICAgICB9ZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBscEZhY2UxOworICAgICAgICAgICAgICAgIGxwRmFjZTEgPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGRlbGV0ZSBscEZhY2VUZW1wbGF0ZTE7CisgICAgICAgIH0KKyAgICAKKyAgICB9CisKK30KKworCit2b2lkIEZhY2VEZXRlY3Rpb246OlBvc3RCb29zdGluZ0ZpbmRDYW5kaWRhdHMoSXBsSW1hZ2UgKiBGYWNlSW1hZ2UpCit7CisgICAgQm9vc3RpbmdGYWNlVGVtcGxhdGUgKiBscEZhY2VUZW1wbGF0ZTE7CisgICAgUkZhY2UgKiBscEZhY2UxOyAKKyAgICBib29sIGJJbnZhbGlkUmVjdDEgPSBmYWxzZTsKKyAgICBDdlJlY3QgKiBscFJlY3QxICA9IE5VTEw7CisgICAgCisgICAgaWYgKCAoICFGYWNlSW1hZ2UtPnJvaSApICkKKyAgICAgICAgbHBGYWNlVGVtcGxhdGUxID0gbmV3IEJvb3N0aW5nRmFjZVRlbXBsYXRlKDMsY3ZSZWN0KDAsMCxGYWNlSW1hZ2UtPndpZHRoLEZhY2VJbWFnZS0+aGVpZ2h0KSk7CisgICAgZWxzZQorICAgICAgICBscEZhY2VUZW1wbGF0ZTEgPSBuZXcgQm9vc3RpbmdGYWNlVGVtcGxhdGUoMyxjdlJlY3QoRmFjZUltYWdlLT5yb2ktPnhPZmZzZXQsRmFjZUltYWdlLT5yb2ktPnlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWNlSW1hZ2UtPnJvaS0+d2lkdGgsRmFjZUltYWdlLT5yb2ktPmhlaWdodCkpOworICAgIAorICAgIGxwRmFjZTEgPSBuZXcgUkZhY2UobHBGYWNlVGVtcGxhdGUxKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9zZXFSZWN0cy0+dG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIEN2Q29udG91clJlY3QqIHBSZWN0ID0gKEN2Q29udG91clJlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCBpKTsKKyAgICAgICAgCisgICAgICAgIGlmICggIWJJbnZhbGlkUmVjdDEgKQorICAgICAgICB7CisgICAgICAgICAgICBscFJlY3QxID0gTlVMTDsKKyAgICAgICAgICAgIGxwUmVjdDEgPSBuZXcgQ3ZSZWN0KCk7CisgICAgICAgICAgICAqbHBSZWN0MSA9IHBSZWN0LT5yOworICAgICAgICB9ZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgbHBSZWN0MTsKKyAgICAgICAgICAgIGxwUmVjdDEgPSBuZXcgQ3ZSZWN0KCk7CisgICAgICAgICAgICAqbHBSZWN0MSA9IHBSZWN0LT5yOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAKKyAgICAgICAgaWYgKCBscEZhY2UxLT5pc0ZlYXR1cmUobHBSZWN0MSkgKQorICAgICAgICB7IAorICAgICAgICAgICAgLy9iRm91bmQxID0gdHJ1ZTsKKyAgICAgICAgICAgIGJJbnZhbGlkUmVjdDEgPSBmYWxzZTsKKyAgICAgICAgfWVsc2UKKyAgICAgICAgICAgIGJJbnZhbGlkUmVjdDEgPSB0cnVlOworCisgICAgCisgICAgfQorICAgIAorICAgIG1fcEZhY2VMaXN0LT5BZGRFbGVtKGxwRmFjZTEpOworICAgIAorICAgIGRlbGV0ZSBscEZhY2VUZW1wbGF0ZTE7CisKK30vL3ZvaWQgRmFjZURldGVjdGlvbjo6UG9zdEJvb3N0aW5nRmluZENhbmRpZGF0cyhJcGxJbWFnZSAqIEZhY2VJbWFnZSkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy9jbGFzcyBGYWNlCisKKworCisvLy8vLy8KKy8vTGlzdCBDbGFzcworLy8vLy8KK0xpc3RFbGVtOjpMaXN0RWxlbSgpCit7CisgICAgbV9wTmV4dCA9IHRoaXM7CisgICAgbV9wUHJldiA9IHRoaXM7CisgICAgbV9wRmFjZSA9IE5VTEw7Cit9Ly8vTGlzdEVsZW06Okxpc3RFbGVtKCkKKworTGlzdEVsZW06Okxpc3RFbGVtKEZhY2UgKiBwRmFjZSxMaXN0RWxlbSAqIHBIZWFkKQoreworICAgIG1fcE5leHQgPSBwSGVhZDsKKyAgICBtX3BQcmV2ID0gcEhlYWQtPm1fcFByZXY7CisgICAgcEhlYWQtPm1fcFByZXYtPm1fcE5leHQgPSB0aGlzOworICAgIHBIZWFkLT5tX3BQcmV2ID0gdGhpczsKKworICAgIG1fcEZhY2UgPSBwRmFjZTsKK30vL0xpc3RFbGVtOjpMaXN0RWxlbShGYWNlICogcEZhY2UpCisKKworCitMaXN0RWxlbTo6fkxpc3RFbGVtKCkKK3sKKyAgICBkZWxldGUgbV9wRmFjZTsKKyAgICBtX3BOZXh0LT5tX3BQcmV2ID0gbV9wUHJldjsKKyAgICBtX3BQcmV2LT5tX3BOZXh0ID0gbV9wTmV4dDsKKworfS8vTGlzdEVsZW06On5MaXN0RWxlbSgpCisKK0xpc3Q6Okxpc3QoKQoreworICAgIG1fcEhlYWQgPSBuZXcgTGlzdEVsZW0oKTsKKyAgICBtX0ZhY2VzQ291bnQgPSAwOworICAgIG1fcEN1ckVsZW0gPSBtX3BIZWFkOworfS8vTGlzdDo6TGlzdCgpCisKK0xpc3Q6On5MaXN0KCkKK3sKKyAgICB2b2lkICogdG1wOworICAgIHdoaWxlKCh0bXAgPSBtX3BIZWFkLT5tX3BOZXh0LT5tX3BGYWNlKSAhPSAwKQorICAgICAgICBkZWxldGUgbV9wSGVhZC0+bV9wTmV4dDsKKworICAgIGRlbGV0ZSBtX3BIZWFkOworCit9Ly9MaXN0Ojp+TGlzdCgpCisKKworaW50IExpc3Q6OkFkZEVsZW0oRmFjZSAqIHBGYWNlKQoreworICAgIG5ldyBMaXN0RWxlbShwRmFjZSxtX3BIZWFkKTsKKyAgICByZXR1cm4gbV9GYWNlc0NvdW50Kys7Cit9Ly9MaXN0OjpBZGRFbGVtKEZhY2UgKiBwRmFjZSkKKworRmFjZSAqIExpc3Q6OkdldERhdGEoKQoreworICAgIG1fcEN1ckVsZW0gPSBtX3BDdXJFbGVtLT5tX3BOZXh0OworICAgIHJldHVybiBtX3BDdXJFbGVtLT5tX3BGYWNlOworfS8vRmFjZSAqIExpc3Q6OkdldERhdGEoKQorCisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmZhY2V0ZW1wbGF0ZS5jcHAgYi9jdmF1eC9zcmMvY3ZmYWNldGVtcGxhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YjljZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZmYWNldGVtcGxhdGUuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLy8gQ3JlYXRlZCBieSBLaHVkeWFrb3YgVi5BLiBib2JlckBnb3JvZG9rLm5ldAorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisjaW5jbHVkZSAiX2N2ZmFjZWRldGVjdGlvbi5oIgorCisvLy9jbGFzcyBGYWNlRmVhdHVyZQorRmFjZUZlYXR1cmU6OkZhY2VGZWF0dXJlKGRvdWJsZSBkV2VpZ2h0LHZvaWQgKiBscENvbnRvdXIsYm9vbCBiSXNGZWF0dXJlKQoreworICAgIG1fbHBDb250b3VyID0gbHBDb250b3VyOworICAgIG1fZFdlaWdodCA9IGRXZWlnaHQ7CisgICAgbV9iSXNGYWNlRmVhdHVyZSA9IGJJc0ZlYXR1cmU7Cit9Ly9GYWNlRmVhdHVyZTo6RmFjZUZlYXR1cmUobG9uZyBsV2VpZ2h0LHZvaWQgKiBscENvbnRvdXIpCisKK0ZhY2VGZWF0dXJlOjp+RmFjZUZlYXR1cmUoKQoreworICAgIGlmIChtX2xwQ29udG91cikKKyAgICAgICAgZGVsZXRlIChjaGFyKiltX2xwQ29udG91cjsKK30vL0ZhY2VGZWF0dXJlOjp+RmFjZUZlYXR1cmUoKQorCitGYWNlRmVhdHVyZTo6RmFjZUZlYXR1cmUoKQoreworICAgIG1fbHBDb250b3VyID0gTlVMTDsKKyAgICBtX2RXZWlnaHQgPSAwOworICAgIG1fYklzRmFjZUZlYXR1cmUgPSBmYWxzZTsKK30KKworCisvLy8vY2xhc3MgRmFjZVRlbXBsYXRlCisKK0ZhY2VUZW1wbGF0ZTo6fkZhY2VUZW1wbGF0ZSgpCit7CisgICAgZGVsZXRlIFtdIG1fbHBGZWF0dXJlc0xpc3Q7Cit9Ly9GYWNlVGVtcGxhdGU6On5GYWNlVGVtcGxhdGUoKQorCisKKy8vLy8vCisvL2NsYXNzIFJGYWNlVGVtcGxhdGUKKy8vLy8vCisKKworTW91dGhGYWNlVGVtcGxhdGU6On5Nb3V0aEZhY2VUZW1wbGF0ZSgpCit7CisgICAgCit9Ly9SRmFjZVRlbXBsYXRlOjp+UkZhY2VUZW1wbGF0ZSgpCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZmaW5kZmFjZS5jcHAgYi9jdmF1eC9zcmMvY3ZmaW5kZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1Mzg4OAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmZpbmRmYWNlLmNwcApAQCAtMCwwICsxLDY4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vIENyZWF0ZWQgYnkgS2h1ZHlha292IFYuQS4gYm9iZXJAZ29yb2Rvay5uZXQKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorI2luY2x1ZGUgIl9jdmZhY2VkZXRlY3Rpb24uaCIKKworQ3ZTZXEgKiBjdkZpbmRGYWNlKElwbEltYWdlICogSW1hZ2UsQ3ZNZW1TdG9yYWdlKiBscFN0b3JhZ2UpCit7CisgICAgRmFjZURldGVjdGlvbiBGRDsKKyAgICBGRC5TZXRCb29zdGluZyhmYWxzZSk7CisgICAgRkQuRmluZEZhY2UoSW1hZ2UpOworICAgIEN2U2VxICogbHBTZXEgPSBjdkNyZWF0ZVNlcSgwLHNpemVvZigqbHBTZXEpLHNpemVvZihDdkZhY2UpLGxwU3RvcmFnZSk7CisgICAgRkQuQ3JlYXRlUmVzdWx0cyhscFNlcSk7CisgICAgcmV0dXJuIGxwU2VxOworfS8vY3ZGaW5kRmFjZShJcGxJbWFnZSAqIEltYWdlKQorCitDdlNlcSAqIGN2UG9zdEJvb3N0aW5nRmluZEZhY2UoSXBsSW1hZ2UgKiBJbWFnZSxDdk1lbVN0b3JhZ2UqIGxwU3RvcmFnZSkKK3sKKyAgICBGYWNlRGV0ZWN0aW9uIEZEOworICAgIEZELlNldEJvb3N0aW5nKHRydWUpOworICAgIEZELkZpbmRGYWNlKEltYWdlKTsKKyAgICBDdlNlcSAqIGxwU2VxID0gY3ZDcmVhdGVTZXEoMCxzaXplb2YoKmxwU2VxKSxzaXplb2YoQ3ZGYWNlKSxscFN0b3JhZ2UpOworICAgIEZELkNyZWF0ZVJlc3VsdHMobHBTZXEpOworICAgIAorICAgIHJldHVybiBscFNlcTsKK30vL2N2UG9zdEJvb3N0aW5nRmluZEZhY2UoSXBsSW1hZ2UgKiBJbWFnZSkKKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2ZmluZGhhbmRyZWdpb24uY3BwIGIvY3ZhdXgvc3JjL2N2ZmluZGhhbmRyZWdpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZGNiY2IKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZmaW5kaGFuZHJlZ2lvbi5jcHAKQEAgLTAsMCArMSw2NDUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdmF1eC5oIgorCisjZGVmaW5lIF9DVl9OT1JNX0wyKGEpIChmbG9hdCkoaWN2U3FydDMyZihhWzBdKmFbMF0gKyBhWzFdKmFbMV0gKyBhWzJdKmFbMl0pKQorI2RlZmluZSBfQ1ZfTk9STV9MMjIoYSkgKGZsb2F0KShhWzBdKmFbMF0gKyBhWzFdKmFbMV0gKyBhWzJdKmFbMl0pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorCisgICBmaW5kIHJlZ2lvbiB3aGVyZSBoYW5kIGlzICAgKGZvciBnZXN0dXJlIHJlY29nbml0aW9uKQorICAgZmxhZyA9IDAgKHVzZSBsZWZ0IGJ1Y2tldCkgIGZsYWcgPSAxICh1c2UgcmlnaHQgYnVja2V0KSAKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZGaW5kSGFuZFJlZ2lvbiggQ3ZQb2ludDNEMzJmICogcG9pbnRzLCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgQ3ZTZXEgKiBpbmRleHMsCisgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxpbmUsIEN2U2l6ZTJEMzJmIHNpemUsIGludCBmbGFnLAorICAgICAgICAgICAgICAgICAgIEN2UG9pbnQzRDMyZiAqIGNlbnRlciwKKyAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLCBDdlNlcSAqKiBudW1iZXJzICkKK3sKKworLyogICAgSXBwbVZlY3QzMmYgc3ViLCBjcm9zOyAgICovCisgICAgZmxvYXQgKnN1YiwgKmNyb3M7CisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgIEN2U3RhdHVzIHN0YXR1czsKKyAgICBpbnQgbmJpbnMgPSAyMCwgaSwgbCwgaV9wb2ludCwgbGVmdCwgcmlnaHQ7CisgICAgaW50ICpiaW5fY291bnRzID0gMDsgICAgICAgIC8vICBwb2ludGVyIHRvIHRoZSBwb2ludCdzIGNvdW50ZXIgaW4gdGhlIGJpY2tldHMKKyAgICBpbnQgbG93X2NvdW50OyAgICAgICAgICAgICAgLy8gIGxvdyB0aHJlc2hvbGQgIAorCisgICAgQ3ZQb2ludCAqdG1wX251bWJlciA9IDAsICpwdDsKKyAgICBmbG9hdCB2YWx1ZSwgdm1pbiwgdm1heCwgdmwsIGJzaXplLCB2YzsKKyAgICBmbG9hdCBoYW5kX2xlbmd0aCwgaGFuZF9sZW5ndGgyLCBoYW5kX2xlZnQsIGhhbmRfcmlnaHQ7CisgICAgZmxvYXQgdGhyZXNob2xkLCB0aHJlc2hvbGQyOworICAgIGZsb2F0ICp2diA9IDA7CisgICAgZmxvYXQgYVszXTsKKworICAgIHN0YXR1cyA9IENWX09LOworCisgICAgaGFuZF9sZW5ndGggPSBzaXplLndpZHRoOworICAgIGhhbmRfbGVuZ3RoMiA9IGhhbmRfbGVuZ3RoIC8gMjsKKworICAgIHRocmVzaG9sZCA9IChmbG9hdCkgKHNpemUuaGVpZ2h0ICogMyAvIDUuKTsKKyAgICB0aHJlc2hvbGQyID0gdGhyZXNob2xkICogdGhyZXNob2xkOworCisvKiAgICBsb3dfY291bnQgPSBjb3VudC9uYmluczsgICAgICovCisgICAgbG93X2NvdW50ID0gKGludCkgKGNvdW50IC8gNjAuKTsKKworICAgIGFzc2VydCggcG9pbnRzICE9IE5VTEwgJiYgbGluZSAhPSBOVUxMICk7CisgICAgaWYoIHBvaW50cyA9PSBOVUxMIHx8IGxpbmUgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGFzc2VydCggY291bnQgPiA1ICk7CisgICAgaWYoIGNvdW50IDwgNSApCisgICAgICAgIHJldHVybiBDVl9CQURGTEFHX0VSUjsKKworICAgIGFzc2VydCggZmxhZyA9PSAwIHx8IGZsYWcgPT0gMSApOworICAgIGlmKCBmbGFnICE9IDAgJiYgZmxhZyAhPSAxICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZMQUdfRVJSOworCisvKiAgY3JlYXRlIHZlY3RvcnMgICAgICAgICAqLworICAgIHN1YiA9IGljdkNyZWF0ZVZlY3Rvcl8zMmYoIDMgKTsKKyAgICBjcm9zID0gaWN2Q3JlYXRlVmVjdG9yXzMyZiggMyApOworICAgIGlmKCBzdWIgPT0gTlVMTCB8fCBjcm9zID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisvKiAgYWxsb2MgbWVtb3J5IGZvciB0aGUgcG9pbnQncyBwcm9qZWN0aW9ucyBvbiB0aGUgbGluZSAgICAqLworICAgIHZ2ID0gKGZsb2F0ICopIGN2QWxsb2MoIGNvdW50ICogc2l6ZW9mKCBmbG9hdCApKTsKKworICAgIGlmKCB2diA9PSBOVUxMICkKKyAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsKKworLyogIGFsbG9jIG1lbW9yeSBmb3IgdGhlIHBvaW50J3MgY291bnRlciBpbiB0aGUgYmlja2V0cyAgICAgKi8KKyAgICBiaW5fY291bnRzID0gKGludCAqKSBjdkFsbG9jKCBuYmlucyAqIHNpemVvZiggaW50ICkpOworCisgICAgaWYoIGJpbl9jb3VudHMgPT0gTlVMTCApCisgICAgeworICAgICAgICBzdGF0dXMgPSBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorICAgIG1lbXNldCggYmluX2NvdW50cywgMCwgbmJpbnMgKiBzaXplb2YoIGludCApKTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBpbmRleHMsICZyZWFkZXIsIDAgKTsKKworLyogIGFsbG9jIG1lbW9yeSBmb3IgdGhlIHRlbXBvcmFsZSBwb2ludCdzIG51bWJlcnMgICAgICAqLworICAgIHRtcF9udW1iZXIgPSAoQ3ZQb2ludCAqKSBjdkFsbG9jKCBjb3VudCAqIHNpemVvZiggQ3ZQb2ludCApKTsKKyAgICBpZiggdG1wX251bWJlciA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IENWX09VVE9GTUVNX0VSUjsKKyAgICAgICAgZ290byBNX0VORDsKKyAgICB9CisKKy8qICBmaW5kIG1pbiBhbmQgbWF4IHBvaW50J3MgcHJvamVjdGlvbiBvbiB0aGUgbGluZSAgICAgKi8KKyAgICB2bWluID0gMTAwMDsKKyAgICB2bWF4ID0gLTEwMDA7CisgICAgaV9wb2ludCA9IDA7CisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKy8qICAgIAorICAgICAgICBpY3ZTdWJWZWN0b3JfMzJmICgoSXBwbVZlY3QzMmYgKSZwb2ludHNbaV0sIChJcHBtVmVjdDMyZiApJmxpbmVbM10sIHN1YiwgMyk7CisKKyAgICAgICAgaWN2Q3Jvc3NQcm9kdWN0MkxfMzJmICgoSXBwbVZlY3QzMmYgKSZsaW5lWzBdLCBzdWIsIGNyb3MpOworKi8KKworICAgICAgICBzdWJbMF0gPSBwb2ludHNbaV0ueCAtIGxpbmVbM107CisgICAgICAgIHN1YlsxXSA9IHBvaW50c1tpXS55IC0gbGluZVs0XTsKKyAgICAgICAgc3ViWzJdID0gcG9pbnRzW2ldLnogLSBsaW5lWzVdOworICAgICAgICBhWzBdID0gc3ViWzBdICogbGluZVsxXSAtIHN1YlsxXSAqIGxpbmVbMF07CisgICAgICAgIGFbMV0gPSBzdWJbMV0gKiBsaW5lWzJdIC0gc3ViWzJdICogbGluZVsxXTsKKyAgICAgICAgYVsyXSA9IHN1YlsyXSAqIGxpbmVbMF0gLSBzdWJbMF0gKiBsaW5lWzJdOworCisvKiAgICAgIGlmKElQUElfTk9STV9MMjIgKCBjcm9zICkgPCB0aHJlc2hvbGQyKSAgICAqLworICAgICAgICBpZiggX0NWX05PUk1fTDIyKCBhICkgPCB0aHJlc2hvbGQyICkKKyAgICAgICAgeworICAgICAgICAgICAgdmFsdWUgPSAoZmxvYXQpaWN2RG90UHJvZHVjdF8zMmYoIHN1YiwgJmxpbmVbMF0sIDMgKTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZSA+IHZtYXggKQorICAgICAgICAgICAgICAgIHZtYXggPSB2YWx1ZTsKKyAgICAgICAgICAgIGlmKCB2YWx1ZSA8IHZtaW4gKQorICAgICAgICAgICAgICAgIHZtaW4gPSB2YWx1ZTsKKworICAgICAgICAgICAgdnZbaV9wb2ludF0gPSB2YWx1ZTsKKworICAgICAgICAgICAgcHQgPSAoQ3ZQb2ludCopY3ZHZXRTZXFFbGVtKCBpbmRleHMsIGkgKTsKKyAgICAgICAgICAgIHRtcF9udW1iZXJbaV9wb2ludF0gPSAqcHQ7CisgICAgICAgICAgICBpX3BvaW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKy8qICBjb21wdXRlIHRoZSBsZW5ndGggb2Ygb25lIGJ1Y2tldCAgICAgICAgICAgICAqLworICAgIHZsID0gdm1heCAtIHZtaW47CisgICAgYnNpemUgPSB2bCAvIG5iaW5zOworCisvKiAgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiBlYWNoIGJ1Y2tldCAgICovCisgICAgZm9yKCBpID0gMDsgaSA8IGlfcG9pbnQ7IGkrKyApCisgICAgeworICAgICAgICBsID0gY3ZSb3VuZCggKHZ2W2ldIC0gdm1pbikgLyBic2l6ZSApOworICAgICAgICBiaW5fY291bnRzW2xdKys7CisgICAgfQorCisgICAgKm51bWJlcnMgPSBjdkNyZWF0ZVNlcSggQ1ZfU0VRX1BPSU5UX1NFVCwgc2l6ZW9mKCBDdlNlcSApLCBzaXplb2YoIEN2UG9pbnQgKSwgc3RvcmFnZSApOworICAgIGFzc2VydCggbnVtYmVycyAhPSAwICk7CisgICAgaWYoIG51bWJlcnMgPT0gTlVMTCApCisgICAgeworICAgICAgICBzdGF0dXMgPSBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorCisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCAqbnVtYmVycywgJndyaXRlciApOworCisgICAgaWYoIGZsYWcgPT0gMCApCisgICAgeworLyogIGZpbmQgdGhlIGxlZnRtb3N0IGJ1Y2tldCAgICAgICAgICAgKi8KKyAgICAgICAgZm9yKCBsID0gMDsgbCA8IG5iaW5zOyBsKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggYmluX2NvdW50c1tsXSA+IGxvd19jb3VudCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbGVmdCA9IGw7CisKKy8qICBjb21wdXRlIGNlbnRlciBwb2ludCBvZiB0aGUgbGVmdCBoYW5kICAgICAqLworICAgICAgICBoYW5kX2xlZnQgPSB2bWluICsgbGVmdCAqIGJzaXplOworICAgICAgICB2YyA9IGhhbmRfbGVmdCArIGhhbmRfbGVuZ3RoMjsKKyAgICAgICAgaGFuZF9yaWdodCA9IGhhbmRfbGVmdCArIGhhbmRfbGVuZ3RoOworICAgIH0KKyAgICBlbHNlCisgICAgeworLyogIGZpbmQgdGhlIHJpZ2h0bW9zdCBidWNrZXQgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgZm9yKCBsID0gbmJpbnMgLSAxOyBsID49IDA7IGwtLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBiaW5fY291bnRzW2xdID4gbG93X2NvdW50ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByaWdodCA9IGw7CisKKy8qICBjb21wdXRlIGNlbnRlciBwb2ludCBvZiB0aGUgcmlnaHQgaGFuZCAgICAqLworICAgICAgICBoYW5kX3JpZ2h0ID0gdm1heCAtIChuYmlucyAtIHJpZ2h0IC0gMSkgKiBic2l6ZTsKKyAgICAgICAgdmMgPSBoYW5kX3JpZ2h0IC0gaGFuZF9sZW5ndGgyOworICAgICAgICBoYW5kX2xlZnQgPSBoYW5kX3JpZ2h0IC0gaGFuZF9sZW5ndGg7CisgICAgfQorCisgICAgaWN2U2NhbGVWZWN0b3JfMzJmKCAmbGluZVswXSwgc3ViLCAzLCB2YyApOworICAgIGljdkFkZFZlY3Rvcl8zMmYoICZsaW5lWzNdLCBzdWIsIChmbG9hdCAqKSBjZW50ZXIsIDMgKTsKKworLyogIHNlbGVjdCBoYW5kJ3MgcG9pbnRzIGFuZCBjYWxjdWxhdGUgbWVhbiB2YWx1ZSAgICAgKi8KKworICAgIC8vc3MueCA9IHNzLnkgPSBzcy56ID0gMDsKKyAgICBmb3IoIGwgPSAwOyBsIDwgaV9wb2ludDsgbCsrICkKKyAgICB7CisgICAgICAgIGlmKCB2dltsXSA+PSBoYW5kX2xlZnQgJiYgdnZbbF0gPD0gaGFuZF9yaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCB0bXBfbnVtYmVyW2xdLCB3cml0ZXIgKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworCisgIE1fRU5EOgorICAgIGlmKCB0bXBfbnVtYmVyICE9IE5VTEwgKQorICAgICAgICBjdkZyZWUoICZ0bXBfbnVtYmVyICk7CisgICAgaWYoIGJpbl9jb3VudHMgIT0gTlVMTCApCisgICAgICAgIGN2RnJlZSggJmJpbl9jb3VudHMgKTsKKyAgICBpZiggdnYgIT0gTlVMTCApCisgICAgICAgIGN2RnJlZSggJnZ2ICk7CisgICAgaWYoIHN1YiAhPSBOVUxMICkgaWN2RGVsZXRlVmVjdG9yIChzdWIpOworICAgIGlmKCBjcm9zICE9IE5VTEwgKSBpY3ZEZWxldGVWZWN0b3IgKGNyb3MpOworCisgICAgcmV0dXJuIHN0YXR1czsKKworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIF9DVl9OT1JNX0wzMShhKSAoZmxvYXQpKGljdlNxcnQzMmYoYVswXSphWzBdICsgYVsxXSphWzFdICsgYVsyXSphWzJdKSkKKyNkZWZpbmUgX0NWX05PUk1fTDMyKGEpIChmbG9hdCkoYVswXSphWzBdICsgYVsxXSphWzFdICsgYVsyXSphWzJdKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworICAgZmluZCByZWdpb24gd2hlcmUgaGFuZCBpcyAgIChmb3IgZ2VzdHVyZSByZWNvZ25pdGlvbikKKyAgIGZsYWcgPSAwICh1c2UgbGVmdCBidWNrZXQpICBmbGFnID0gMSAodXNlIHJpZ2h0IGJ1Y2tldCkKKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZGaW5kSGFuZFJlZ2lvbkEoIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICBDdlNlcSAqIGluZGV4cywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmxpbmUsIEN2U2l6ZTJEMzJmIHNpemUsIGludCBqYywKKyAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmICogY2VudGVyLAorICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLCBDdlNlcSAqKiBudW1iZXJzICkKK3sKKworLyogICAgSXBwbVZlY3QzMmYgc3ViLCBjcm9zOyAgICovCisgICAgZmxvYXQgKnN1YiwgKmNyb3M7CisgICAgZmxvYXQgZXBzID0gKGZsb2F0KSAwLjAxOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisKKyAgICBDdlN0YXR1cyBzdGF0dXM7CisgICAgZmxvYXQgZ29yWzNdID0geyAxLCAwLCAwIH07CisgICAgZmxvYXQgdmVyWzNdID0geyAwLCAxLCAwIH07CisKKyAgICBpbnQgbmJpbnMgPSAyMCwgaSwgbCwgaV9wb2ludCwgbGVmdCwgcmlnaHQsIGptaW4sIGptYXgsIGpsOworICAgIGludCBqX2xlZnQsIGpfcmlnaHQ7CisgICAgaW50ICpiaW5fY291bnRzID0gMDsgICAgICAgIC8vICBwb2ludGVyIHRvIHRoZSBwb2ludCdzIGNvdW50ZXIgaW4gdGhlIGJpY2tldHMKKworLy8gICAgaW50ICpiaW5fY291bnRzaiA9IDA7ICAgLy8gIHBvaW50ZXIgdG8gdGhlIGluZGV4J3MgY291bnRlciBpbiB0aGUgYmlja2V0cworICAgIGludCBsb3dfY291bnQ7ICAgICAgICAgICAgICAvLyAgbG93IHRocmVzaG9sZCAgCisKKyAgICBDdlBvaW50ICp0bXBfbnVtYmVyID0gMCwgKnB0OworICAgIGZsb2F0IHZhbHVlLCB2bWluLCB2bWF4LCB2bCwgYnNpemUsIGJzaXplaiwgdmMsIHZjbCwgdmNyOworICAgIGRvdWJsZSB2X3Zlciwgdl9nb3I7CisgICAgZmxvYXQgaGFuZF9sZW5ndGgsIGhhbmRfbGVuZ3RoMiwgaGFuZF9sZWZ0LCBoYW5kX3JpZ2h0OworICAgIGZsb2F0IHRocmVzaG9sZCwgdGhyZXNob2xkMjsKKyAgICBmbG9hdCAqdnYgPSAwOworICAgIGZsb2F0IGFbM107CisgICAgY2hhciBsb2c7CisKKyAgICBzdGF0dXMgPSBDVl9PSzsKKworICAgIGhhbmRfbGVuZ3RoID0gc2l6ZS53aWR0aDsKKyAgICBoYW5kX2xlbmd0aDIgPSBoYW5kX2xlbmd0aCAvIDI7CisKKyAgICB0aHJlc2hvbGQgPSAoZmxvYXQpIChzaXplLmhlaWdodCAqIDMgLyA1Lik7CisgICAgdGhyZXNob2xkMiA9IHRocmVzaG9sZCAqIHRocmVzaG9sZDsKKworLyogICAgbG93X2NvdW50ID0gY291bnQvbmJpbnM7ICAgICAqLworICAgIGxvd19jb3VudCA9IChpbnQpIChjb3VudCAvIDYwLik7CisKKyAgICBhc3NlcnQoIHBvaW50cyAhPSBOVUxMICYmIGxpbmUgIT0gTlVMTCApOworICAgIGlmKCBwb2ludHMgPT0gTlVMTCB8fCBsaW5lID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICBhc3NlcnQoIGNvdW50ID4gNSApOworICAgIGlmKCBjb3VudCA8IDUgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisKKy8qICBjcmVhdGUgdmVjdG9ycyAgICAgICAgICovCisgICAgc3ViID0gaWN2Q3JlYXRlVmVjdG9yXzMyZiggMyApOworICAgIGNyb3MgPSBpY3ZDcmVhdGVWZWN0b3JfMzJmKCAzICk7CisgICAgaWYoIHN1YiA9PSBOVUxMIHx8IGNyb3MgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisKKy8qICBhbGxvYyBtZW1vcnkgZm9yIHRoZSBwb2ludCdzIHByb2plY3Rpb25zIG9uIHRoZSBsaW5lICAgICovCisgICAgdnYgPSAoZmxvYXQgKikgY3ZBbGxvYyggY291bnQgKiBzaXplb2YoIGZsb2F0ICkpOworCisgICAgaWYoIHZ2ID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisvKiAgYWxsb2MgbWVtb3J5IGZvciB0aGUgcG9pbnQncyBjb3VudGVyIGluIHRoZSBiaWNrZXRzICAgICAqLworICAgIGJpbl9jb3VudHMgPSAoaW50ICopIGN2QWxsb2MoIG5iaW5zICogc2l6ZW9mKCBpbnQgKSk7CisKKyAgICBpZiggYmluX2NvdW50cyA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IENWX09VVE9GTUVNX0VSUjsKKyAgICAgICAgZ290byBNX0VORDsKKyAgICB9CisgICAgbWVtc2V0KCBiaW5fY291bnRzLCAwLCBuYmlucyAqIHNpemVvZiggaW50ICkpOworCisvKiAgYWxsb2MgbWVtb3J5IGZvciB0aGUgcG9pbnQncyBjb3VudGVyIGluIHRoZSBiaWNrZXRzICAgICAqLworLy8gICAgYmluX2NvdW50c2ogPSAoaW50KikgaWN2QWxsb2MobmJpbnMqc2l6ZW9mKGludCkpOyAgCisvLyAgICBpZihiaW5fY291bnRzaiA9PSBOVUxMKSB7c3RhdHVzID0gQ1ZfT1VUT0ZNRU1fRVJSOyBnb3RvIE1fRU5EO30KKy8vICAgIG1lbXNldChiaW5fY291bnRzaiwwLG5iaW5zKnNpemVvZihpbnQpKTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBpbmRleHMsICZyZWFkZXIsIDAgKTsKKworLyogIGFsbG9jIG1lbW9yeSBmb3IgdGhlIHRlbXBvcmFsZSBwb2ludCdzIG51bWJlcnMgICAgICAqLworICAgIHRtcF9udW1iZXIgPSAoQ3ZQb2ludCAqKSBjdkFsbG9jKCBjb3VudCAqIHNpemVvZiggQ3ZQb2ludCApKTsKKyAgICBpZiggdG1wX251bWJlciA9PSBOVUxMICkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IENWX09VVE9GTUVNX0VSUjsKKyAgICAgICAgZ290byBNX0VORDsKKyAgICB9CisKKy8qICBmaW5kIG1pbiBhbmQgbWF4IHBvaW50J3MgcHJvamVjdGlvbiBvbiB0aGUgbGluZSAgICAgKi8KKyAgICB2bWluID0gMTAwMDsKKyAgICB2bWF4ID0gLTEwMDA7CisgICAgam1pbiA9IDEwMDA7CisgICAgam1heCA9IC0xMDAwOworICAgIGlfcG9pbnQgPSAwOworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisvKgorICAgICAgICBpY3ZTdWJWZWN0b3JfMzJmICgoSXBwbVZlY3QzMmYgKSZwb2ludHNbaV0sIChJcHBtVmVjdDMyZiApJmxpbmVbM10sIHN1YiwgMyk7CisKKyAgICAgICAgaWN2Q3Jvc3NQcm9kdWN0MkxfMzJmICgoSXBwbVZlY3QzMmYgKSZsaW5lWzBdLCBzdWIsIGNyb3MpOworKi8KKworICAgICAgICBzdWJbMF0gPSBwb2ludHNbaV0ueCAtIGxpbmVbM107CisgICAgICAgIHN1YlsxXSA9IHBvaW50c1tpXS55IC0gbGluZVs0XTsKKyAgICAgICAgc3ViWzJdID0gcG9pbnRzW2ldLnogLSBsaW5lWzVdOworCisvLyAgICAgIGlmKGZhYnMoc3ViWzBdKTxlcHN8fGZhYnMoc3ViWzFdKTxlcHN8fGZhYnMoc3ViWzJdKTxlcHMpIGNvbnRpbnVlOworCisgICAgICAgIGFbMF0gPSBzdWJbMF0gKiBsaW5lWzFdIC0gc3ViWzFdICogbGluZVswXTsKKyAgICAgICAgYVsxXSA9IHN1YlsxXSAqIGxpbmVbMl0gLSBzdWJbMl0gKiBsaW5lWzFdOworICAgICAgICBhWzJdID0gc3ViWzJdICogbGluZVswXSAtIHN1YlswXSAqIGxpbmVbMl07CisKKyAgICAgICAgdl9nb3IgPSBpY3ZEb3RQcm9kdWN0XzMyZiggZ29yLCAmbGluZVswXSwgMyApOworICAgICAgICB2X3ZlciA9IGljdkRvdFByb2R1Y3RfMzJmKCB2ZXIsICZsaW5lWzBdLCAzICk7CisKKyAgICAgICAgaWYoIHZfdmVyID4gdl9nb3IgKQorICAgICAgICAgICAgbG9nID0gdHJ1ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG9nID0gZmFsc2U7CisKKworLyogICAgICBpZihJUFBJX05PUk1fTDIyICggY3JvcyApIDwgdGhyZXNob2xkMikgICAgKi8KKy8qCisgICAgICAgIGlmKGZhYnMoYVswXSk8ZXBzICYmIGZhYnMoYVsxXSk8ZXBzICYmIGZhYnMoYVsyXSk8ZXBzKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZEb3RQcm9kdWN0XzMyZiggc3ViLCAmbGluZVswXSwgMywgJnZhbHVlKTsKKyAgICAgICAgICAgIGlmKHZhbHVlID4gdm1heCkgdm1heCA9IHZhbHVlOworICAgICAgICAgICAgaWYodmFsdWUgPCB2bWluKSB2bWluID0gdmFsdWU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZ2W2lfcG9pbnRdID0gdmFsdWU7CisKKyAgICAgICAgICAgIHB0ID0gKEN2UG9pbnQqIClpY3ZHZXRTZXFFbGVtICggaW5kZXhzLCBpLCAwKTsKKworICAgICAgICAgICAgaWYocHQtPnggPiBqbWF4KSBqbWF4ID0gcHQtPng7CisgICAgICAgICAgICBpZihwdC0+eCA8IGptaW4pIGptaW4gPSBwdC0+eDsKKworICAgICAgICAgICAgdG1wX251bWJlcltpX3BvaW50XSA9ICpwdDsKKyAgICAgICAgICAgIGlfcG9pbnQrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYoIF9DVl9OT1JNX0wzMiggYSApIDwgdGhyZXNob2xkMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoZmxvYXQpaWN2RG90UHJvZHVjdF8zMmYoIHN1YiwgJmxpbmVbMF0sIDMgKTsKKyAgICAgICAgICAgICAgICBpZiggdmFsdWUgPiB2bWF4ICkKKyAgICAgICAgICAgICAgICAgICAgdm1heCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmKCB2YWx1ZSA8IHZtaW4gKQorICAgICAgICAgICAgICAgICAgICB2bWluID0gdmFsdWU7CisKKyAgICAgICAgICAgICAgICB2dltpX3BvaW50XSA9IHZhbHVlOworCisgICAgICAgICAgICAgICAgcHQgPSAoQ3ZQb2ludCopY3ZHZXRTZXFFbGVtKCBpbmRleHMsIGkgKTsKKworICAgICAgICAgICAgICAgIGlmKCAhbG9nICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwdC0+eCA+IGptYXggKQorICAgICAgICAgICAgICAgICAgICAgICAgam1heCA9IHB0LT54OworICAgICAgICAgICAgICAgICAgICBpZiggcHQtPnggPCBqbWluICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGptaW4gPSBwdC0+eDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHB0LT55ID4gam1heCApCisgICAgICAgICAgICAgICAgICAgICAgICBqbWF4ID0gcHQtPnk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwdC0+eSA8IGptaW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgam1pbiA9IHB0LT55OworICAgICAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAgICAgdG1wX251bWJlcltpX3BvaW50XSA9ICpwdDsKKyAgICAgICAgICAgICAgICBpX3BvaW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKy8qICBjb21wdXRlIHRoZSBsZW5ndGggb2Ygb25lIGJ1Y2tldCBhbG9uZyB0aGUgbGluZSAgICAgICAgKi8KKyAgICB2bCA9IHZtYXggLSB2bWluOworCisvKiAgZXhhbWluaW5nIG9uIHRoZSBhcm0ncyBleGlzdGVuY2UgICovCisgICAgaWYoIHZsIDwgZXBzICkKKyAgICB7CisgICAgICAgICpudW1iZXJzID0gTlVMTDsKKyAgICAgICAgc3RhdHVzID0gQ1ZfT0s7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorCisgICAgYnNpemUgPSB2bCAvIG5iaW5zOworCisvKiAgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIHBvaW50cyBpbiBlYWNoIGJ1Y2tldCBhbG9uZyB0aGUgbGluZSAgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgaV9wb2ludDsgaSsrICkKKyAgICB7CisgICAgICAgIGwgPSBjdlJvdW5kKCAodnZbaV0gLSB2bWluKSAvIGJzaXplICk7CisgICAgICAgIGJpbl9jb3VudHNbbF0rKzsKKyAgICB9CisKKyAgICAvKiAgY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIG9uZSBidWNrZXQgYWxvbmcgdGhlIFggYXhlICAgICAgICAqLworICAgIGpsID0gam1heCAtIGptaW47CisgICAgaWYoIGpsIDw9IDEgKQorICAgIHsKKyAgICAgICAgKm51bWJlcnMgPSBOVUxMOworICAgICAgICBzdGF0dXMgPSBDVl9PSzsKKyAgICAgICAgZ290byBNX0VORDsKKyAgICB9CisKKyAgICBic2l6ZWogPSAoZmxvYXQpIChqbCAvIChuYmlucyArIDAuKSk7CisKKy8qICBjb21wdXRlIHRoZSBudW1iZXIgb2YgcG9pbnRzIGluIGVhY2ggYnVja2V0IGFsb25nIHRoZSBYIGF4ZSAqLworLy8gICAgZm9yKGk9MDtpPGlfcG9pbnQ7aSsrKQorLy8gICAgeworLy8gICAgICAgIGwgPSBjdlJvdW5kKCh0bXBfbnVtYmVyW2ldLnggLSBqbWluKS9ic2l6ZWopOworLy8gICAgICAgIGJpbl9jb3VudHNqW2xdKys7CisvLyAgICB9CisKKworICAgIGxlZnQgPSByaWdodCA9IC0xOworCisvKiAgZmluZCB0aGUgbGVmdG1vc3QgYW5kIHRoZSByaWdodG1vc3QgYnVja2V0cyAgICAgICAgICAgKi8KKyAgICBmb3IoIGwgPSAwOyBsIDwgbmJpbnM7IGwrKyApCisgICAgeworICAgICAgICBpZiggYmluX2NvdW50c1tsXSA+IGxvd19jb3VudCAmJiBsZWZ0ID09IC0xICkKKyAgICAgICAgICAgIGxlZnQgPSBsOworICAgICAgICBlbHNlIGlmKCBiaW5fY291bnRzW2xdID4gbG93X2NvdW50ICYmIGxlZnQgPj0gMCApCisgICAgICAgICAgICByaWdodCA9IGw7CisKKyAgICB9CisKKy8qICBjb21wdXRlIGNlbnRlciBwb2ludCBvZiB0aGUgbGVmdCBoYW5kICAgICAqLworICAgIGlmKCBsZWZ0ID09IC0xICYmIHJpZ2h0ID09IC0xICkKKyAgICB7CisgICAgICAgICpudW1iZXJzID0gTlVMTDsKKyAgICAgICAgc3RhdHVzID0gQ1ZfT0s7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorCisgICAgaGFuZF9sZWZ0ID0gdm1pbiArIGxlZnQgKiBic2l6ZTsKKyAgICBqX2xlZnQgPSAoaW50KSAoam1pbiArIGxlZnQgKiBic2l6ZWopOworCisgICAgdmNsID0gaGFuZF9sZWZ0ICsgaGFuZF9sZW5ndGgyOworCisvKiAgY29tcHV0ZSBjZW50ZXIgcG9pbnQgb2YgdGhlIHJpZ2h0IGhhbmQgICAgKi8KKyAgICBoYW5kX3JpZ2h0ID0gdm1heCAtIChuYmlucyAtIHJpZ2h0IC0gMSkgKiBic2l6ZTsKKyAgICB2Y3IgPSBoYW5kX3JpZ2h0IC0gaGFuZF9sZW5ndGgyOworCisgICAgal9yaWdodCA9IChpbnQpIChqbWF4IC0gKG5iaW5zIC0gcmlnaHQgLSAxKSAqIGJzaXplaik7CisKKyAgICBqX2xlZnQgPSBhYnMoIGpfbGVmdCAtIGpjICk7CisgICAgal9yaWdodCA9IGFicyggal9yaWdodCAtIGpjICk7CisKKyAgICBpZiggal9sZWZ0IDw9IGpfcmlnaHQgKQorICAgIHsKKyAgICAgICAgaGFuZF9yaWdodCA9IGhhbmRfbGVmdCArIGhhbmRfbGVuZ3RoOworICAgICAgICB2YyA9IHZjbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGFuZF9sZWZ0ID0gaGFuZF9yaWdodCAtIGhhbmRfbGVuZ3RoOworICAgICAgICB2YyA9IHZjcjsKKyAgICB9CisKKyAgICBpY3ZTY2FsZVZlY3Rvcl8zMmYoICZsaW5lWzBdLCBzdWIsIDMsIHZjICk7CisgICAgaWN2QWRkVmVjdG9yXzMyZiggJmxpbmVbM10sIHN1YiwgKGZsb2F0ICopIGNlbnRlciwgMyApOworCisvKiAgc2VsZWN0IGhhbmQncyBwb2ludHMgYW5kIGNhbGN1bGF0ZSBtZWFuIHZhbHVlICAgICAqLworICAgICpudW1iZXJzID0gY3ZDcmVhdGVTZXEoIENWX1NFUV9QT0lOVF9TRVQsIHNpemVvZiggQ3ZTZXEgKSwgc2l6ZW9mKCBDdlBvaW50ICksIHN0b3JhZ2UgKTsKKyAgICBhc3NlcnQoICpudW1iZXJzICE9IDAgKTsKKyAgICBpZiggKm51bWJlcnMgPT0gTlVMTCApCisgICAgeworICAgICAgICBzdGF0dXMgPSBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIGdvdG8gTV9FTkQ7CisgICAgfQorCisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCAqbnVtYmVycywgJndyaXRlciApOworCisgICAgZm9yKCBsID0gMDsgbCA8IGlfcG9pbnQ7IGwrKyApCisgICAgeworICAgICAgICBpZiggdnZbbF0gPj0gaGFuZF9sZWZ0ICYmIHZ2W2xdIDw9IGhhbmRfcmlnaHQgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggdG1wX251bWJlcltsXSwgd3JpdGVyICk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKworICBNX0VORDoKKyAgICBpZiggdG1wX251bWJlciAhPSBOVUxMICkKKyAgICAgICAgY3ZGcmVlKCAmdG1wX251bWJlciApOworLy8gICAgaWYoYmluX2NvdW50c2ogIT0gTlVMTCkgY3ZGcmVlKCAmYmluX2NvdW50c2ogKTsKKyAgICBpZiggYmluX2NvdW50cyAhPSBOVUxMICkKKyAgICAgICAgY3ZGcmVlKCAmYmluX2NvdW50cyApOworCisgICAgaWYoIHZ2ICE9IE5VTEwgKQorICAgICAgICBjdkZyZWUoICZ2diApOworCisgICAgaWYoIHN1YiAhPSBOVUxMICkgaWN2RGVsZXRlVmVjdG9yIChzdWIpOworICAgIGlmKCBjcm9zICE9IE5VTEwgKSBpY3ZEZWxldGVWZWN0b3IgKGNyb3MpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6ICAgICBjdkZpbmRIYW5kUmVnaW9uCisvLyAgICBQdXJwb3NlOiAgZmluZHMgaGFuZCByZWdpb24gaW4gcmFuZ2UgaW1hZ2UgZGF0YQorLy8gICAgQ29udGV4dDogICAKKy8vICAgIFBhcmFtZXRlcnM6IAorLy8gICAgICBwb2ludHMgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBwb2ludCdzIHNldC4KKy8vICAgICAgY291bnQgIC0gdGhlIG51bWJlciBvZiB0aGUgaW5wdXQgcG9pbnRzLgorLy8gICAgICBpbmRleHMgLSBwb2ludGVyIHRvIHRoZSBpbnB1dCBzZXF1ZW5jZSBvZiB0aGUgcG9pbnQncyBpbmRleGVzCisvLyAgICAgIGxpbmUgICAtIHBvaW50ZXIgdG8gdGhlIDNELWxpbmUKKy8vICAgICAgc2l6ZSAgIC0gc2l6ZSBvZiB0aGUgaGFuZCBpbiBtZXRlcnMgCisvLyAgICAgIGZsYWcgICAtIGhhbmQgZGlyZWN0aW9uJ3MgZmxhZyAoMCAtIGxlZnQsIC0xIC0gcmlnaHQsIAorLy8gICAgICAgICAgICAgICBvdGhlcndpc2Ugai1pbmRleCBvZiB0aGUgaW5pdGlhbCBpbWFnZSBjZW50ZXIpCisvLyAgICAgIGNlbnRlciAtIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBoYW5kIGNlbnRlcgorLy8gICAgICBzdG9yYWdlIC0gcG9pbnRlciB0byB0aGUgbWVtb3J5IHN0b3JhZ2UgIAorLy8gICAgICBudW1iZXJzIC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IHNlcXVlbmNlIG9mIHRoZSBwb2ludCdzIGluZGV4ZXMgaW5zaWRlCisvLyAgICAgICAgICAgICAgICBoYW5kIHJlZ2lvbiAgICAgICAgICAgICAgICAKKy8vICAgICAgCisvLyAgICBOb3RlczoKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2RmluZEhhbmRSZWdpb24oIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgQ3ZTZXEgKiBpbmRleHMsCisgICAgICAgICAgICAgICAgICBmbG9hdCAqbGluZSwgQ3ZTaXplMkQzMmYgc2l6ZSwgaW50IGZsYWcsCisgICAgICAgICAgICAgICAgICBDdlBvaW50M0QzMmYgKiBjZW50ZXIsIEN2TWVtU3RvcmFnZSAqIHN0b3JhZ2UsIEN2U2VxICoqIG51bWJlcnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZGaW5kSGFuZFJlZ2lvbiIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpZihmbGFnID09IDAgfHwgZmxhZyA9PSAtMSkKKwl7CisJCUlQUElfQ0FMTCggaWN2RmluZEhhbmRSZWdpb24oIHBvaW50cywgY291bnQsIGluZGV4cywgbGluZSwgc2l6ZSwgLWZsYWcsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXIsIHN0b3JhZ2UsIG51bWJlcnMgKSk7CisJfQorCWVsc2UgCisJCUlQUElfQ0FMTCggaWN2RmluZEhhbmRSZWdpb25BKCBwb2ludHMsIGNvdW50LCBpbmRleHMsIGxpbmUsIHNpemUsIGZsYWcsCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLCBzdG9yYWdlLCBudW1iZXJzICkpOworCisgICAgX19DTEVBTlVQX187CisgICAgX19FTkRfXzsKK30KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICAgY3ZGaW5kSGFuZFJlZ2lvbkEKKy8vICAgIFB1cnBvc2U6ICBmaW5kcyBoYW5kIHJlZ2lvbiBpbiByYW5nZSBpbWFnZSBkYXRhCisvLyAgICBDb250ZXh0OiAgIAorLy8gICAgUGFyYW1ldGVyczogCisvLyAgICAgIHBvaW50cyAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IHBvaW50J3Mgc2V0LgorLy8gICAgICBjb3VudCAgLSB0aGUgbnVtYmVyIG9mIHRoZSBpbnB1dCBwb2ludHMuCisvLyAgICAgIGluZGV4cyAtIHBvaW50ZXIgdG8gdGhlIGlucHV0IHNlcXVlbmNlIG9mIHRoZSBwb2ludCdzIGluZGV4ZXMKKy8vICAgICAgbGluZSAgIC0gcG9pbnRlciB0byB0aGUgM0QtbGluZQorLy8gICAgICBzaXplICAgLSBzaXplIG9mIHRoZSBoYW5kIGluIG1ldGVycyAKKy8vICAgICAgamMgICAgIC0gai1pbmRleCBvZiB0aGUgaW5pdGlhbCBpbWFnZSBjZW50ZXIKKy8vICAgICAgY2VudGVyIC0gcG9pbnRlciB0byB0aGUgb3V0cHV0IGhhbmQgY2VudGVyCisvLyAgICAgIHN0b3JhZ2UgLSBwb2ludGVyIHRvIHRoZSBtZW1vcnkgc3RvcmFnZSAgCisvLyAgICAgIG51bWJlcnMgLSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgc2VxdWVuY2Ugb2YgdGhlIHBvaW50J3MgaW5kZXhlcyBpbnNpZGUKKy8vICAgICAgICAgICAgICAgIGhhbmQgcmVnaW9uICAgICAgICAgICAgICAgIAorLy8gICAgICAKKy8vICAgIE5vdGVzOgorLy9GKi8KK0NWX0lNUEwgdm9pZAorY3ZGaW5kSGFuZFJlZ2lvbkEoIEN2UG9pbnQzRDMyZiAqIHBvaW50cywgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgIEN2U2VxICogaW5kZXhzLAorICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsaW5lLCBDdlNpemUyRDMyZiBzaXplLCBpbnQgamMsCisgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDNEMzJmICogY2VudGVyLCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLCBDdlNlcSAqKiBudW1iZXJzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZEhhbmRSZWdpb25BIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIElQUElfQ0FMTCggaWN2RmluZEhhbmRSZWdpb25BKCBwb2ludHMsIGNvdW50LCBpbmRleHMsIGxpbmUsIHNpemUsIGpjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyLCBzdG9yYWdlLCBudW1iZXJzICkpOworICAgIF9fQ0xFQU5VUF9fOworICAgIF9fRU5EX187Cit9CisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmhtbS5jcHAgYi9jdmF1eC9zcmMvY3ZobW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZTBiMmYKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZobW0uY3BwCkBAIC0wLDAgKzEsMTc3MCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2RlZmluZSBMTjJQSSAxLjgzNzg3N2YKKyNkZWZpbmUgQklHX0ZMVCAxLmUrMTBmCisKKworI2RlZmluZSBfQ1ZfRVJHT0RJQyAxCisjZGVmaW5lIF9DVl9DQVVTQUwgMgorCisjZGVmaW5lIF9DVl9MQVNUX1NUQVRFIDEKKyNkZWZpbmUgX0NWX0JFU1RfU1RBVEUgMiAgCisKKworLy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogX2N2Q3JlYXRlT2JzSW5mbworLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIEN2SW1nT2JzSW5mbyBzdHJ1Y3R1cmUgCisvLyAgICAgICAgICAgICBhbmQgaXRzIGlubmVyIHN0dWZmCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogb2JzX2luZm8gLSBhZGRyZXMgb2YgcG9pbnRlciB0byBDdkltZ09ic0luZm8gc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgICBudW1faG9yX29icyAtIG51bWJlciBvZiBob3Jpem9udGFsIG9ic2VydmF0aW9uIHZlY3RvcnMKKy8vICAgICAgICAgICAgICAgIG51bV92ZXJfb2JzIC0gbnVtYmVyIG9mIGhvcml6b250YWwgb2JzZXJ2YXRpb24gdmVjdG9ycworLy8gICAgICAgICAgICAgICAgb2JzX3NpemUgLSBsZW5ndGggb2Ygb2JzZXJ2YXRpb24gdmVjdG9yCisvLworLy8gICAgUmV0dXJuczogZXJyb3Igc3RhdHVzCisvLworLy8gICAgTm90ZXM6ICAgCisvL0YqLyAgICAgIAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2Q3JlYXRlT2JzSW5mbyggIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgbnVtX29icywgaW50IG9ic19zaXplICkKK3sKKyAgICBpbnQgdG90YWwgPSBudW1fb2JzLmhlaWdodCAqIG51bV9vYnMud2lkdGg7CisgCisgICAgQ3ZJbWdPYnNJbmZvKiBvYnMgPSAoQ3ZJbWdPYnNJbmZvKiljdkFsbG9jKCBzaXplb2YoIEN2SW1nT2JzSW5mbykgKTsKKyAgICAKKyAgICBvYnMtPm9ic194ID0gbnVtX29icy53aWR0aDsKKyAgICBvYnMtPm9ic195ID0gbnVtX29icy5oZWlnaHQ7CisKKyAgICBvYnMtPm9icyA9IChmbG9hdCopY3ZBbGxvYyggdG90YWwgKiBvYnNfc2l6ZSAqIHNpemVvZihmbG9hdCkgKTsKKworICAgIG9icy0+c3RhdGUgPSAoaW50KiljdkFsbG9jKCAyICogdG90YWwgKiBzaXplb2YoaW50KSApOworICAgIG9icy0+bWl4ID0gKGludCopY3ZBbGxvYyggdG90YWwgKiBzaXplb2YoaW50KSApOyAgCisgICAgICAgIAorICAgIG9icy0+b2JzX3NpemUgPSBvYnNfc2l6ZTsKKworICAgIG9ic19pbmZvWzBdID0gb2JzOworIAorICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIGljdlJlbGVhc2VPYnNJbmZvKCBDdkltZ09ic0luZm8qKiBwX29ic19pbmZvICkKK3sKKyAgICBDdkltZ09ic0luZm8qIG9ic19pbmZvID0gcF9vYnNfaW5mb1swXTsKKworICAgIGN2RnJlZSggJihvYnNfaW5mby0+b2JzKSApOworICAgIGN2RnJlZSggJihvYnNfaW5mby0+bWl4KSApOworICAgIGN2RnJlZSggJihvYnNfaW5mby0+c3RhdGUpICk7IAorICAgIGN2RnJlZSggJihvYnNfaW5mbykgKTsKKworICAgIHBfb2JzX2luZm9bMF0gPSBOVUxMOworCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30gCisKKyAgICAKKy8vKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkNyZWF0ZTJESE1NCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgMi1kaW1lbnNpb25hbCBlbWJlZGRlZCBITU0gbW9kZWwgCisvLyAgICAgICAgICAgICBhbmQgaXRzIGlubmVyIHN0dWZmCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogaG1tIC0gYWRkcmVzIG9mIHBvaW50ZXIgdG8gQ3ZFSE1NIHN0cnVjdHVyZQorLy8gICAgICAgICAgICAgICAgc3RhdGVfbnVtYmVyIC0gYXJyYXkgb2YgaG1tIHNpemVzIChzaXplIG9mIGFycmF5ID09IHN0YXRlX251bWJlclswXSsxICkKKy8vICAgICAgICAgICAgICAgIG51bV9taXggLSBudW1iZXIgb2YgZ2F1c3NpYW4gbWl4dHVyZXMgaW4gbG93LWxldmVsIEhNTSBzdGF0ZXMgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiBhcnJheSBpcyBkZWZpbmVkIGJ5IHByZXZpb3VzIGFycmF5IHZhbHVlcworLy8gICAgICAgICAgICAgICAgb2JzX3NpemUgLSBsZW5ndGggb2Ygb2JzZXJ2YXRpb24gdmVjdG9ycworLy8KKy8vICAgIFJldHVybnM6IGVycm9yIHN0YXR1cworLy8KKy8vICAgIE5vdGVzOiBzdGF0ZV9udW1iZXJbMF0gLSBudW1iZXIgb2Ygc3RhdGVzIGluIGV4dGVybmFsIEhNTS4KKy8vICAgICAgICAgICBzdGF0ZV9udW1iZXJbaV0gLSBudW1iZXIgb2Ygc3RhdGVzIGluIGVtYmVkZGVkIEhNTQorLy8gICAgICAgICAgIAorLy8gICAgICAgICAgIGV4YW1wbGUgZm9yIGZhY2UgcmVjb2duaXRpb246IHN0YXRlX251bWJlciA9IHsgNSAzIDYgNiA2IDMgfSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggb2YgbnVtX21peCBhcnJheSA9IDMrNis2KzYrMyA9IDI0Ly8KKy8vCisvL0YqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2Q3JlYXRlMkRITU0oIEN2RUhNTSoqIHRoaXNfaG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0YXRlX251bWJlciwgaW50KiBudW1fbWl4LCBpbnQgb2JzX3NpemUgKQoreworICAgIGludCBpOworICAgIGludCByZWFsX3N0YXRlcyA9IDA7CisKKyAgICBDdkVITU1TdGF0ZSogYWxsX3N0YXRlczsKKyAgICBDdkVITU0qIGhtbTsKKyAgICBpbnQgdG90YWxfbWl4ID0gMDsKKyAgICBmbG9hdCogcG9pbnRlcnM7CisKKyAgICAvL2NvbXB1dGUgdG90YWwgbnVtYmVyIG9mIHN0YXRlcyBvZiBhbGwgbGV2ZWwgaW4gMmQgRUhNTQorICAgIGZvciggaSA9IDE7IGkgPD0gc3RhdGVfbnVtYmVyWzBdOyBpKysgKQorICAgIHsKKyAgICAgICAgcmVhbF9zdGF0ZXMgKz0gc3RhdGVfbnVtYmVyW2ldOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIGhtbXMgKGZyb20gYWxsIGxldmVscykgKi8KKyAgICBobW0gPSAoQ3ZFSE1NKiljdkFsbG9jKCAoc3RhdGVfbnVtYmVyWzBdICsgMSkgKiBzaXplb2YoQ3ZFSE1NKSApOworICAgIAorICAgIC8qIHNldCBudW1iZXIgb2Ygc3VwZXJzdGF0ZXMgKi8KKyAgICBobW1bMF0ubnVtX3N0YXRlcyA9IHN0YXRlX251bWJlclswXTsKKyAgICBobW1bMF0ubGV2ZWwgPSAxOworICAgICAgICAKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBzdGF0ZXMgKi8KKyAgICBhbGxfc3RhdGVzID0gKEN2RUhNTVN0YXRlICopY3ZBbGxvYyggcmVhbF9zdGF0ZXMgKiBzaXplb2YoIEN2RUhNTVN0YXRlICkgKTsKKworICAgIC8qIGFzc2lnbiBudW1iZXIgb2YgbWl4dHVyZXMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgcmVhbF9zdGF0ZXM7IGkrKyApCisgICAgeworICAgICAgICBhbGxfc3RhdGVzW2ldLm51bV9taXggPSBudW1fbWl4W2ldOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgc2l6ZSBvZiBpbm5lciBvZiBhbGwgcmVhbCBzdGF0ZXMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgcmVhbF9zdGF0ZXM7IGkrKyApCisgICAgeworICAgICAgICB0b3RhbF9taXggKz0gbnVtX21peFtpXTsKKyAgICB9IAorICAgIC8qIGFsbG9jYXRlIG1lbW9yeSBmb3Igc3RhdGVzIHN0dWZmICovCisgICAgcG9pbnRlcnMgPSAoZmxvYXQqKWN2QWxsb2MoIHRvdGFsX21peCAqICgyLypmb3IgbXUgaW52dmFyICovICogb2JzX3NpemUgKyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIvKmZvciB3ZWlnaHQgYW5kIGxvZ192YXJfdmFsKi8gKSAqIHNpemVvZiggZmxvYXQpICk7CisgICAgCisgICAgLyogb3JnYW5pemUgbWVtb3J5ICovCisgICAgZm9yKCBpID0gMDsgaSA8IHJlYWxfc3RhdGVzOyBpKysgKQorICAgIHsKKyAgICAgICAgYWxsX3N0YXRlc1tpXS5tdSAgICAgID0gcG9pbnRlcnM7IHBvaW50ZXJzICs9IG51bV9taXhbaV0gKiBvYnNfc2l6ZTsgIAorICAgICAgICBhbGxfc3RhdGVzW2ldLmludl92YXIgPSBwb2ludGVyczsgcG9pbnRlcnMgKz0gbnVtX21peFtpXSAqIG9ic19zaXplOworCisgICAgICAgIGFsbF9zdGF0ZXNbaV0ubG9nX3Zhcl92YWwgPSBwb2ludGVyczsgcG9pbnRlcnMgKz0gbnVtX21peFtpXTsKKyAgICAgICAgYWxsX3N0YXRlc1tpXS53ZWlnaHQgICAgICA9IHBvaW50ZXJzOyBwb2ludGVycyArPSBudW1fbWl4W2ldOworICAgIH0gICAgICAgICAgCisgICAgCisgICAgLyogc2V0IHBvaW50ZXIgdG8gZW1iZWRkZWQgaG1tIGFycmF5ICovCisgICAgaG1tLT51LmVobW0gPSBobW0gKyAxOworICAgIAorICAgIGZvciggaSA9IDA7IGkgPCBobW1bMF0ubnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIGhtbVtpKzFdLnUuc3RhdGUgPSBhbGxfc3RhdGVzOworICAgICAgICBhbGxfc3RhdGVzICs9IHN0YXRlX251bWJlcltpKzFdOworICAgICAgICBobW1baSsxXS5udW1fc3RhdGVzID0gc3RhdGVfbnVtYmVyW2krMV07CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIAorICAgIGZvciggaSA9IDA7IGkgPD0gc3RhdGVfbnVtYmVyWzBdOyBpKysgKQorICAgIHsKKyAgICAgICAgaG1tW2ldLnRyYW5zUCA9IGljdkNyZWF0ZU1hdHJpeF8zMmYoIGhtbVtpXS5udW1fc3RhdGVzLCBobW1baV0ubnVtX3N0YXRlcyApOworICAgICAgICBobW1baV0ub2JzUHJvYiA9IE5VTEw7CisgICAgICAgIGhtbVtpXS5sZXZlbCA9IGkgPyAwIDogMTsKKyAgICB9CisgICAgCisgICAgLyogaWYgYWxsIG9rIC0gcmV0dXJuIHBvaW50ZXIgKi8KKyAgICAqdGhpc19obW0gPSBobW07CisgICAgcmV0dXJuIENWX05PX0VSUjsKK30gCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIGljdlJlbGVhc2UyREhNTSggQ3ZFSE1NKiogcGhtbSApCit7CisgICAgQ3ZFSE1NKiBobW0gPSBwaG1tWzBdOyAKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgaG1tWzBdLm51bV9zdGF0ZXMgKyAxOyBpKysgKQorICAgIHsKKyAgICAgICAgaWN2RGVsZXRlTWF0cml4KCBobW1baV0udHJhbnNQICk7CisgICAgfSAKKworICAgIGlmIChobW0tPm9ic1Byb2IgIT0gTlVMTCkKKyAgICB7CisgICAgICAgIGludCogdG1wID0gKChpbnQqKShobW0tPm9ic1Byb2IpKSAtIDM7CisgICAgICAgIGN2RnJlZSggJih0bXApICApOworICAgIH0KKworICAgIGN2RnJlZSggJihobW0tPnUuZWhtbS0+dS5zdGF0ZS0+bXUpICk7CisgICAgY3ZGcmVlKCAmKGhtbS0+dS5laG1tLT51LnN0YXRlKSApOworCisKKyAgICAvKiBmcmVlIGhtbSBzdHJ1Y3R1cmVzICovCisgICAgY3ZGcmVlKCBwaG1tICk7CisKKyAgICBwaG1tWzBdID0gTlVMTDsKKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9ICAgICAKKworLyogZGlzdGFuY2UgYmV0d2VlbiAyIHZlY3RvcnMgKi8KK3N0YXRpYyBmbG9hdCBpY3ZTcXVhcmVEaXN0YW5jZSggQ3ZWZWN0MzJmIHYxLCBDdlZlY3QzMmYgdjIsIGludCBsZW4gKQoreworICAgIGludCBpOworICAgIGRvdWJsZSBkaXN0MCA9IDA7CisgICAgZG91YmxlIGRpc3QxID0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPD0gbGVuIC0gNDsgaSArPSA0ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0MCA9IHYxW2ldIC0gdjJbaV07CisgICAgICAgIGRvdWJsZSB0MSA9IHYxW2krMV0gLSB2MltpKzFdOworICAgICAgICBkaXN0MCArPSB0MCp0MDsKKyAgICAgICAgZGlzdDEgKz0gdDEqdDE7CisKKyAgICAgICAgdDAgPSB2MVtpKzJdIC0gdjJbaSsyXTsKKyAgICAgICAgdDEgPSB2MVtpKzNdIC0gdjJbaSszXTsKKyAgICAgICAgZGlzdDAgKz0gdDAqdDA7CisgICAgICAgIGRpc3QxICs9IHQxKnQxOworICAgIH0KKworICAgIGZvciggOyBpIDwgbGVuOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHQwID0gdjFbaV0gLSB2MltpXTsKKyAgICAgICAgZGlzdDAgKz0gdDAqdDA7CisgICAgfQorCisgICAgcmV0dXJuIChmbG9hdCkoZGlzdDAgKyBkaXN0MSk7Cit9IAorCisvKmNhbiBiZSB1c2VkIGluIENITU0gJiBESE1NICovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2VW5pZm9ybUltZ1NlZ20oICBDdkltZ09ic0luZm8qIG9ic19pbmZvLCBDdkVITU0qIGhtbSApCit7CisjaWYgMQorICAgIC8qIGltcGxlbWVudGF0aW9uIGlzIHZlcnkgYmFkICovCisgICAgaW50ICBpLCBqLCBjb3VudGVyID0gMDsKKyAgICBDdkVITU1TdGF0ZSogZmlyc3Rfc3RhdGU7CisgICAgZmxvYXQgaW52X3ggPSAxLmYvb2JzX2luZm8tPm9ic194OworICAgIGZsb2F0IGludl95ID0gMS5mL29ic19pbmZvLT5vYnNfeTsKKworICAgIC8qIGNoZWNrIGFyZ3VtZW50cyAqLworICAgIGlmICggIW9ic19pbmZvIHx8ICFobW0gKSByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICBmaXJzdF9zdGF0ZSA9IGhtbS0+dS5laG1tLT51LnN0YXRlOworICAgICAgICAgICAgCisgICAgZm9yIChpID0gMDsgaSA8IG9ic19pbmZvLT5vYnNfeTsgaSsrKQorICAgIHsKKyAgICAgICAgLy9iYWQgbGluZSAoZGl2aXNpb24gKQorICAgICAgICBpbnQgc3VwZXJzdGF0ZSA9IChpbnQpKChpICogaG1tLT5udW1fc3RhdGVzKSppbnZfeSk7LyogL29ic19pbmZvLT5vYnNfeTsgKi8KKyAgICAgICAgCisgICAgICAgIGludCBpbmRleCA9IChpbnQpKGhtbS0+dS5laG1tW3N1cGVyc3RhdGVdLnUuc3RhdGUgLSBmaXJzdF9zdGF0ZSk7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9ic19pbmZvLT5vYnNfeDsgaisrLCBjb3VudGVyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IChpbnQpKChqICogaG1tLT51LmVobW1bc3VwZXJzdGF0ZV0ubnVtX3N0YXRlcykqIGludl94KTsgLyogLyBvYnNfaW5mby0+b2JzX3g7ICovCisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9ic19pbmZvLT5zdGF0ZVsyICogY291bnRlcl0gPSBzdXBlcnN0YXRlOworICAgICAgICAgICAgb2JzX2luZm8tPnN0YXRlWzIgKiBjb3VudGVyICsgMV0gPSBzdGF0ZSArIGluZGV4OworICAgICAgICB9CisgICAgfSAKKyNlbHNlCisgICAgLy90aGlzIGlzIG5vdCByZWFkeSB5ZXQKKworICAgIGludCBpLGosayxtOworICAgIEN2RUhNTVN0YXRlKiBmaXJzdF9zdGF0ZSA9IGhtbS0+dS5laG1tLT51LnN0YXRlOyAKKworICAgIC8qIGNoZWNrIGJhZCBhcmd1bWVudHMgKi8KKyAgICBpZiAoIGhtbS0+bnVtX3N0YXRlcyA+IG9ic19pbmZvLT5vYnNfeSApIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIC8vY29tcHV0ZSB2ZXJ0aWNhbCBzdWJkaXZpc2lvbgorICAgIGZsb2F0IHJvd19wZXJfc3RhdGUgPSAoZmxvYXQpb2JzX2luZm8tPm9ic195IC8gaG1tLT5udW1fc3RhdGVzOworICAgIGZsb2F0IGNvbF9wZXJfc3RhdGVbMTAyNF07IC8qIG1heGltdW0gMTAyNCBzdXBlcnN0YXRlcyAqLworICAgIAorICAgIC8vZm9yIGV2ZXJ5IGhvcml6b250YWwgYmFuZCBjb21wdXRlIHN1YmRpdmlzaW9uCisgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1baV0pOworICAgICAgICBjb2xfcGVyX3N0YXRlW2ldID0gKGZsb2F0KW9ic19pbmZvLT5vYnNfeCAvIGVobW0tPm51bV9zdGF0ZXM7CisgICAgfQorCisgICAgLy9jb21wdXRlIHN0YXRlIGJvdW5kcworICAgIGludCBzc19ib3VuZFsxMDI0XTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgaG1tLT5udW1fc3RhdGVzIC0gMTsgaSsrICkKKyAgICB7CisgICAgICAgIHNzX2JvdW5kW2ldID0gZmxvb3IoIHJvd19wZXJfc3RhdGUgKiAoIGkrMSApICk7CisgICAgfQorICAgIHNzX2JvdW5kW2htbS0+bnVtX3N0YXRlcyAtIDFdID0gb2JzX2luZm8tPm9ic195OworCisgICAgLy93b3JrIGluc2lkZSBldmVyeSBzdXBlcnN0YXRlCisKKyAgICBpbnQgcm93ID0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKyApCisgICAgeworICAgICAgICBDdkVITU0qIGVobW0gPSAmKGhtbS0+dS5laG1tW2ldKTsKKyAgICAgICAgaW50IGluZGV4ID0gZWhtbS0+dS5zdGF0ZSAtIGZpcnN0X3N0YXRlOworCisgICAgICAgIC8vY2FsYyBkaXN0cmlidXRpb24gaW4gc3VwZXJzdGF0ZQorICAgICAgICBpbnQgZXNfYm91bmRbMTAyNF07CisgICAgICAgIGZvciggaiA9IDA7IGogPCBlaG1tLT5udW1fc3RhdGVzIC0gMTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZXNfYm91bmRbal0gPSBmbG9vciggY29sX3Blcl9zdGF0ZVtpXSAqICggaisxICkgKTsKKyAgICAgICAgfQorICAgICAgICBlc19ib3VuZFtlaG1tLT5udW1fc3RhdGVzIC0gMV0gPSBvYnNfaW5mby0+b2JzX3g7CisKKyAgICAgICAgLy9hc3NpZ24gc3RhdGVzIHRvIGZpcnN0IHJvdyBvZiBzdXBlcnN0YXRlCisgICAgICAgIGludCBjb2wgPSAwOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgZWhtbS0+bnVtX3N0YXRlczsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBrID0gY29sOyBrIDwgZXNfYm91bmRbal07IGsrKywgY29sKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9ic19pbmZvLT5zdGF0ZVtyb3cgKiBvYnNfaW5mby0+b2JzX3ggKyAyICoga10gPSBpOworICAgICAgICAgICAgICAgIG9ic19pbmZvLT5zdGF0ZVtyb3cgKiBvYnNfaW5mby0+b2JzX3ggKyAyICogayArIDFdID0gaiArIGluZGV4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29sID0gZXNfYm91bmRbal07IAorICAgICAgICB9CisKKyAgICAgICAgLy9jb3B5IHRoZSBzYW1lIHRvIG90aGVyIHJvd3Mgb2Ygc3VwZXJzdGF0ZQorICAgICAgICBmb3IoIG0gPSByb3c7IG0gPCBzc19ib3VuZFtpXTsgbSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCAmKG9ic19pbmZvLT5zdGF0ZVttICogb2JzX2luZm8tPm9ic194ICogMl0pLCAKKyAgICAgICAgICAgICAgICAgICAgJihvYnNfaW5mby0+c3RhdGVbcm93ICogb2JzX2luZm8tPm9ic194ICogMl0pLCBvYnNfaW5mby0+b2JzX3ggKiAyICogc2l6ZW9mKGludCkgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJvdyA9IHNzX2JvdW5kW2ldOyAgICAKKyAgICB9ICAgCisKKyNlbmRpZgorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKyAgICAgICAgICAgCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogSW5pdE1peFNlZ20KKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBtaXh0dXJlIHNlZ21lbnRhdGlvbiBvZiB0aGUgc3RhdGVzIG9mIHRoZQorLy8gICAgICAgICAgICAgZW1iZWRkZWQgSE1NCisvLyAgICBDb250ZXh0OiB1c2VkIHdpdGggdGhlIFZpdGVyYmkgdHJhaW5pbmcgb2YgdGhlIGVtYmVkZGVkIEhNTQorLy8gICAgICAgICAgICAgRnVuY3Rpb24gdXNlcyBLLU1lYW5zIGFsZ29yaXRobSBmb3IgY2x1c3RlcmluZworLy8KKy8vICAgIFBhcmFtZXRlcnM6ICBvYnNfaW5mb19hcnJheSAtIGFycmF5IG9mIHBvaW50ZXJzIHRvIGltYWdlIG9ic2VydmF0aW9ucyAKKy8vICAgICAgICAgICAgICAgICBudW1faW1nIC0gbGVuZ3RoIG9mIGFib3ZlIGFycmF5CisvLyAgICAgICAgICAgICAgICAgaG1tIC0gcG9pbnRlciB0byBITU0gc3RydWN0dXJlICAgCisvLyAgICAgCisvLyAgICBSZXR1cm5zOiBlcnJvciBzdGF0dXMKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkluaXRNaXhTZWdtKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICkKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGludCAgaywgaSwgajsgCisgICAgaW50KiBudW1fc2FtcGxlczsgLyogbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBpbiBldmVyeSBzdGF0ZSAqLworICAgIGludCogY291bnRlcjsgICAgIC8qIGFycmF5IG9mIGNvdW50ZXJzIGZvciBldmVyeSBzdGF0ZSAqLworICAgIAorICAgIGludCoqICBhX2NsYXNzOyAgIC8qIGZvciBldmVyeSBzdGF0ZSAtIGNoYXJhY3RlcmlzdGljIGFycmF5ICovCisgICAgCisgICAgQ3ZWZWN0MzJmKiogc2FtcGxlczsgLyogZm9yIGV2ZXJ5IHN0YXRlIC0gcG9pbnRlciB0byBvYnNlcnZhdGlvbiB2ZWN0b3JzICovCisgICAgaW50KioqICBzYW1wbGVzX21peDsgICAvKiBmb3IgZXZlcnkgc3RhdGUgLSBhcnJheSBvZiBwb2ludGVycyB0byB2ZWN0b3JzIG1peHR1cmVzICovICAgCisgICAgCisgICAgQ3ZUZXJtQ3JpdGVyaWEgY3JpdGVyaWEgPSBjdlRlcm1Dcml0ZXJpYSggQ1ZfVEVSTUNSSVRfRVBTfENWX1RFUk1DUklUX0lURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCwgICAgLyogaXRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDFmICk7IC8qIGVwcyAgKi8KKyAgICAKKyAgICBpbnQgdG90YWwgPSAwOworICAgIAorICAgIEN2RUhNTVN0YXRlKiBmaXJzdF9zdGF0ZSA9IGhtbS0+dS5laG1tLT51LnN0YXRlOyAKKyAgICAKKyAgICBmb3IoIGkgPSAwIDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIHRvdGFsICs9IGhtbS0+dS5laG1tW2ldLm51bV9zdGF0ZXM7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAKKyAgICAvKiBmb3IgZXZlcnkgc3RhdGUgaW50ZWdlciBpcyBhbGxvY2F0ZWQgLSBudW1iZXIgb2YgdmVjdG9ycyBpbiBzdGF0ZSAqLworICAgIG51bV9zYW1wbGVzID0gKGludCopY3ZBbGxvYyggdG90YWwgKiBzaXplb2YoaW50KSApOworICAgIAorICAgIC8qIGludGVnZXIgY291bnRlciBpcyBhbGxvY2F0ZWQgZm9yIGV2ZXJ5IHN0YXRlICovCisgICAgY291bnRlciA9IChpbnQqKWN2QWxsb2MoIHRvdGFsICogc2l6ZW9mKGludCkgKTsKKyAgICAKKyAgICBzYW1wbGVzID0gKEN2VmVjdDMyZioqKWN2QWxsb2MoIHRvdGFsICogc2l6ZW9mKEN2VmVjdDMyZiopICk7IAorICAgIHNhbXBsZXNfbWl4ID0gKGludCoqKiljdkFsbG9jKCB0b3RhbCAqIHNpemVvZihpbnQqKikgKTsgCisgICAgCisgICAgLyogY2xlYXIgKi8KKyAgICBtZW1zZXQoIG51bV9zYW1wbGVzLCAwICwgdG90YWwqc2l6ZW9mKGludCkgKTsKKyAgICBtZW1zZXQoIGNvdW50ZXIsIDAgLCB0b3RhbCpzaXplb2YoaW50KSApOworICAgIAorICAgIAorICAgIC8qIGZvciBldmVyeSBzdGF0ZSB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgd2hpY2ggYmVsb25nIHRvIGl0IGlzIGNvbXB1dGVkIChzbXRoLiBsaWtlIGhpc3RvZ3JhbSkgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsgIAorICAgICAgICBDdkltZ09ic0luZm8qIG9icyA9IG9ic19pbmZvX2FycmF5W2tdOworICAgICAgICBpbnQgY291bnQgPSAwOworICAgICAgICAKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG9icy0+b2JzX3k7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG9icy0+b2JzX3g7IGorKywgY291bnQrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdGUgPSBvYnMtPnN0YXRlWyAyICogY291bnQgKyAxXTsKKyAgICAgICAgICAgICAgICBudW1fc2FtcGxlc1tzdGF0ZV0gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gCisgICAgCisgICAgLyogZm9yIGV2ZXJ5IHN0YXRlIGludCogaXMgYWxsb2NhdGVkICovCisgICAgYV9jbGFzcyA9IChpbnQqKiljdkFsbG9jKCB0b3RhbCpzaXplb2YoaW50KikgKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIGFfY2xhc3NbaV0gPSAoaW50KiljdkFsbG9jKCBudW1fc2FtcGxlc1tpXSAqIHNpemVvZihpbnQpICk7CisgICAgICAgIHNhbXBsZXNbaV0gPSAoQ3ZWZWN0MzJmKiljdkFsbG9jKCBudW1fc2FtcGxlc1tpXSAqIHNpemVvZihDdlZlY3QzMmYpICk7CisgICAgICAgIHNhbXBsZXNfbWl4W2ldID0gKGludCoqKWN2QWxsb2MoIG51bV9zYW1wbGVzW2ldICogc2l6ZW9mKGludCopICk7CisgICAgfQorICAgIAorICAgIC8qIGZvciBldmVyeSBzdGF0ZSB2ZWN0b3JzIHdoaWNoIGJlbG9uZyB0byBzdGF0ZSBhcmUgZ2F0aGVyZWQgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsgIAorICAgICAgICBDdkltZ09ic0luZm8qIG9icyA9IG9ic19pbmZvX2FycmF5W2tdOworICAgICAgICBpbnQgbnVtX29icyA9ICggb2JzLT5vYnNfeCApICogKCBvYnMtPm9ic195ICk7CisgICAgICAgIGZsb2F0KiB2ZWN0b3IgPSBvYnMtPm9iczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29iczsgaSsrLCB2ZWN0b3IrPW9icy0+b2JzX3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBvYnMtPnN0YXRlWzIqaSsxXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc2FtcGxlc1tzdGF0ZV1bY291bnRlcltzdGF0ZV1dID0gdmVjdG9yOworICAgICAgICAgICAgc2FtcGxlc19taXhbc3RhdGVdW2NvdW50ZXJbc3RhdGVdXSA9ICYob2JzLT5taXhbaV0pOworICAgICAgICAgICAgY291bnRlcltzdGF0ZV0rKzsgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gCisgICAgCisgICAgLyogY2xlYXIgY291bnRlcnMgKi8KKyAgICBtZW1zZXQoIGNvdW50ZXIsIDAsIHRvdGFsKnNpemVvZihpbnQpICk7CisgICAgCisgICAgLyogZG8gdGhlIGFjdHVhbCBjbHVzdGVyaW5nIHVzaW5nIHRoZSBLIE1lYW5zIGFsZ29yaXRobSAqLworICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKCBmaXJzdF9zdGF0ZVtpXS5udW1fbWl4ID09IDEpCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBudW1fc2FtcGxlc1tpXTsgaysrKQorICAgICAgICAgICAgeyAgCisgICAgICAgICAgICAgICAgLyogYWxsIHZlY3RvcnMgYmVsb25nIHRvIG9uZSBtaXh0dXJlICovCisgICAgICAgICAgICAgICAgYV9jbGFzc1tpXVtrXSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gICAgICAKKyAgICAgICAgZWxzZSBpZiggbnVtX3NhbXBsZXNbaV0gKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBjbHVzdGVyaXplIHZlY3RvcnMgICovCisgICAgICAgICAgICBjdktNZWFucyggZmlyc3Rfc3RhdGVbaV0ubnVtX21peCwgc2FtcGxlc1tpXSwgbnVtX3NhbXBsZXNbaV0sIAorICAgICAgICAgICAgICAgICAgICAgIG9ic19pbmZvX2FycmF5WzBdLT5vYnNfc2l6ZSwgY3JpdGVyaWEsIGFfY2xhc3NbaV0gKTsKKyAgICAgICAgfSAKKyAgICB9CisgICAgCisgICAgLyogZm9yIGV2ZXJ5IHZlY3RvciBudW1iZXIgb2YgbWl4dHVyZSBpcyBhc3NpZ25lZCAqLworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc2FtcGxlc1tpXTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBzYW1wbGVzX21peFtpXVtqXVswXSA9IGFfY2xhc3NbaV1bal07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspCisgICAgeworICAgICAgICBjdkZyZWUoICYoYV9jbGFzc1tpXSkgKTsKKyAgICAgICAgY3ZGcmVlKCAmKHNhbXBsZXNbaV0pICk7CisgICAgICAgIGN2RnJlZSggJihzYW1wbGVzX21peFtpXSkgKTsKKyAgICB9CisKKyAgICBjdkZyZWUoICZhX2NsYXNzICk7CisgICAgY3ZGcmVlKCAmc2FtcGxlcyApOworICAgIGN2RnJlZSggJnNhbXBsZXNfbWl4ICk7CisgICAgY3ZGcmVlKCAmY291bnRlciApOworICAgIGN2RnJlZSggJm51bV9zYW1wbGVzICk7ICAKKyAgICAKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IENvbXB1dGVVbmlNb2RlR2F1c3MKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjb21wdXRlcyB0aGUgR2F1c3NpYW4gcGRmIGZvciBhIHNhbXBsZSB2ZWN0b3IgCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG9ic1ZlcSAtIHBvaW50ZXIgdG8gdGhlIHNhbXBsZSB2ZWN0b3IKKy8vICAgICAgICAgICAgICAgICBtdSAtIHBvaW50ZXIgdG8gdGhlIG1lYW4gdmVjdG9yIG9mIHRoZSBHYXVzc2lhbiBwZGYKKy8vICAgICAgICAgICAgICAgICB2YXIgLSBwb2ludGVyIHRvIHRoZSB2YXJpYW5jZSB2ZWN0b3Igb2YgdGhlIEdhdXNzaWFuIHBkZgorLy8gICAgICAgICAgICAgICAgIFZlY1NpemUgLSB0aGUgc2l6ZSBvZiBzYW1wbGUgdmVjdG9yCisvLyAgICAgICAgICAgICAgICAgCisvLyAgICBSZXR1cm5zOiB0aGUgcGRmIG9mIHRoZSBzYW1wbGUgdmVjdG9yIGdpdmVuIHRoZSBzcGVjaWZpZWQgR2F1c3NpYW4gCisvLworLy8gICAgTm90ZXM6IAorLy9GKi8KKy8qc3RhdGljIGZsb2F0IGljdkNvbXB1dGVVbmlNb2RlR2F1c3MoQ3ZWZWN0MzJmIHZlY3QsIEN2VmVjdDMyZiBtdSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZlY3QzMmYgaW52X3ZhciwgZmxvYXQgbG9nX3Zhcl92YWwsIGludCB2ZWN0X3NpemUpICAgICAgICAgICAKK3sKKyAgICBpbnQgbjsgCisgICAgZG91YmxlIHRtcDsKKyAgICBkb3VibGUgcHJvYjsKKworICAgIHByb2IgPSAtbG9nX3Zhcl92YWw7CisKKyAgICBmb3IgKG4gPSAwOyBuIDwgdmVjdF9zaXplOyBuKyspCisgICAgeworICAgICAgICB0bXAgPSAodmVjdFtuXSAtIG11W25dKSAqIGludl92YXJbbl07CisgICAgICAgIHByb2IgPSBwcm9iIC0gdG1wICogdG1wOworICAgfQorICAgLy9wcm9iICo9IDAuNWY7CisgIAorICAgcmV0dXJuIChmbG9hdClwcm9iOworfSovICAgICAgICAgICAgICAgICAgICAgICAgCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogQ29tcHV0ZUdhdXNzTWl4dHVyZQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBtaXh0dXJlIEdhdXNzaWFuIHBkZiBvZiBhIHNhbXBsZSB2ZWN0b3IuIAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICBvYnNWZXEgLSBwb2ludGVyIHRvIHRoZSBzYW1wbGUgdmVjdG9yCisvLyAgICAgICAgICAgICAgICAgbXUgIC0gdHdvLWRpbWVuc2lvbmFsIHBvaW50ZXIgdG8gdGhlIG1lYW4gdmVjdG9yIG9mIHRoZSBHYXVzc2lhbiBwZGY7CisvLyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpbWVuc2lvbiBpcyBpbmRleGVkIG92ZXIgdGhlIG51bWJlciBvZiBtaXh0dXJlcyBhbmQgCisvLyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY29uZCBkaW1lbnNpb24gaXMgaW5kZXhlZCBhbG9uZyB0aGUgc2l6ZSBvZiB0aGUgbWVhbiB2ZWN0b3IKKy8vICAgICAgICAgICAgICAgICB2YXIgLSB0d28tZGltZW5zaW9uYWwgcG9pbnRlciB0byB0aGUgdmFyaWFuY2UgdmVjdG9yIG9mIHRoZSBHYXVzc2lhbiBwZGY7CisvLyAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpbWVuc2lvbiBpcyBpbmRleGVkIG92ZXIgdGhlIG51bWJlciBvZiBtaXh0dXJlcyBhbmQgCisvLyAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlY29uZCBkaW1lbnNpb24gaXMgaW5kZXhlZCBhbG9uZyB0aGUgc2l6ZSBvZiB0aGUgdmFyaWFuY2UgdmVjdG9yCisvLyAgICAgICAgICAgICAgICAgVmVjU2l6ZSAtIHRoZSBzaXplIG9mIHNhbXBsZSB2ZWN0b3IKKy8vICAgICAgICAgICAgICAgICB3ZWlnaHQgLSBwb2ludGVyIHRvIHRoZSB3aWdodHMgb2YgdGhlIEdhdXNzaWFuIG1peHR1cmUKKy8vICAgICAgICAgICAgICAgICBOdW1NaXggLSB0aGUgbnVtYmVyIG9mIEdhdXNzaWFuIG1peHR1cmVzCisvLyAgICAgICAgICAgICAgICAgCisvLyAgICBSZXR1cm5zOiB0aGUgcGRmIG9mIHRoZSBzYW1wbGUgdmVjdG9yIGdpdmVuIHRoZSBzcGVjaWZpZWQgR2F1c3NpYW4gbWl4dHVyZS4gIAorLy8KKy8vICAgIE5vdGVzOiAKKy8vRiovCisvKiBDYWxjdWxhdGUgcHJvYmFiaWxpdHkgb2Ygb2JzZXJ2YXRpb24gYXQgc3RhdGUgaW4gbG9nYXJpdGhtaWMgc2NhbGUqLworLypzdGF0aWMgZmxvYXQKK2ljdkNvbXB1dGVHYXVzc01peHR1cmUoIEN2VmVjdDMyZiB2ZWN0LCBmbG9hdCogbXUsIAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGludl92YXIsIGZsb2F0KiBsb2dfdmFyX3ZhbCwgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVjdF9zaXplLCBmbG9hdCogd2VpZ2h0LCBpbnQgbnVtX21peCApCit7ICAgICAgIAorICAgIGRvdWJsZSBwcm9iLCBsX3Byb2I7CisgICAgCisgICAgcHJvYiA9IDAuMGY7IAorCisgICAgaWYgKG51bV9taXggPT0gMSkKKyAgICB7CisgICAgICAgIHJldHVybiBpY3ZDb21wdXRlVW5pTW9kZUdhdXNzKCB2ZWN0LCBtdSwgaW52X3ZhciwgbG9nX3Zhcl92YWxbMF0sIHZlY3Rfc2l6ZSk7ICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgbTsKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IG51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZWlnaHRbbV0gPiAwLjApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGxfcHJvYiA9IGljdkNvbXB1dGVVbmlNb2RlR2F1c3ModmVjdCwgbXUgKyBtKnZlY3Rfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludl92YXIgKyBtICogdmVjdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfdmFyX3ZhbFttXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rfc2l6ZSk7IAorCisgICAgICAgICAgICAgICAgcHJvYiA9IHByb2IgKyB3ZWlnaHRbbV0qZXhwKChkb3VibGUpbF9wcm9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgcHJvYiA9IGxvZyhwcm9iKTsgICAgCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiAoZmxvYXQpcHJvYjsgICAKK30qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IEVzdGltYXRlT2JzUHJvYgorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBldmVyeSBvYnNlcnZhdGlvbiBpbiBldmVyeSBzdGF0ZSAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgb2JzX2luZm8gLSBvYnNlcnZhdGlvbnMKKy8vICAgICAgICAgICAgICAgICBobW0gICAgICAtIGhtbQorLy8gICAgUmV0dXJuczogZXJyb3Igc3RhdHVzICAKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2RXN0aW1hdGVPYnNQcm9iKCBDdkltZ09ic0luZm8qIG9ic19pbmZvLCBDdkVITU0qIGhtbSApCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHRvdGFsX3N0YXRlcyA9IDA7CisKKyAgICAvKiBjaGVjayBpZiBtYXRyaXggZXhpc3QgYW5kIGNoZWNrIGN1cnJlbnQgc2l6ZQorICAgICAgIGlmIG5vdCBzdWZmaWNpZW50IC0gcmVhbGxvYyAqLworICAgIGludCBzdGF0dXMgPSAwOyAvKiAxIC0gbm90IGFsbG9jYXRlZCwgMiAtIGFsbG9jYXRlZCBidXQgc21hbGwgc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgIDMgLSBzaXplIGlzIGVub3VnaCwgYnV0IGRpc3RyaWJ1dGlvbiBpcyBiYWQsIDAgLSBhbGwgb2sgKi8KKworICAgIGZvciggaiA9IDA7IGogPCBobW0tPm51bV9zdGF0ZXM7IGorKyApCisgICAgeworICAgICAgIHRvdGFsX3N0YXRlcyArPSBobW0tPnUuZWhtbVtqXS5udW1fc3RhdGVzOworICAgIH0KKworICAgIGlmICggaG1tLT5vYnNQcm9iID09IE5VTEwgKSAKKyAgICB7CisgICAgICAgIC8qIGFsbG9jYXJlIG1lbW9yeSAqLworICAgICAgICBpbnQgbmVlZF9zaXplID0gKCBvYnNfaW5mby0+b2JzX3ggKiBvYnNfaW5mby0+b2JzX3kgKiB0b3RhbF9zdGF0ZXMgKiBzaXplb2YoZmxvYXQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzX2luZm8tPm9ic195ICogaG1tLT5udW1fc3RhdGVzICogc2l6ZW9mKCBDdk1hdHIzMmYpICk7CisKKyAgICAgICAgaW50KiBidWZmZXIgPSAoaW50KiljdkFsbG9jKCBuZWVkX3NpemUgKyAzICogc2l6ZW9mKGludCkgKTsKKyAgICAgICAgYnVmZmVyWzBdID0gbmVlZF9zaXplOworICAgICAgICBidWZmZXJbMV0gPSBvYnNfaW5mby0+b2JzX3k7CisgICAgICAgIGJ1ZmZlclsyXSA9IG9ic19pbmZvLT5vYnNfeDsKKyAgICAgICAgaG1tLT5vYnNQcm9iID0gKGZsb2F0KiopIChidWZmZXIgKyAzKTsKKyAgICAgICAgc3RhdHVzID0gMzsKKyAgICAgICAgCisgICAgfQorICAgIGVsc2UKKyAgICB7ICAgCisgICAgICAgIC8qIGNoZWNrIGN1cnJlbnQgc2l6ZSAqLworICAgICAgICBpbnQqIHRvdGFsPSAoaW50KikoKChpbnQqKShobW0tPm9ic1Byb2IpKSAtIDMpOworICAgICAgICBpbnQgbmVlZF9zaXplID0gKCBvYnNfaW5mby0+b2JzX3ggKiBvYnNfaW5mby0+b2JzX3kgKiB0b3RhbF9zdGF0ZXMgKiBzaXplb2YoZmxvYXQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzX2luZm8tPm9ic195ICogaG1tLT5udW1fc3RhdGVzICogc2l6ZW9mKCBDdk1hdHIzMmYvKihmbG9hdCopKi8gKSApOworCisgICAgICAgIGFzc2VydCggc2l6ZW9mKGZsb2F0KikgPT0gc2l6ZW9mKGludCkgKTsKKworICAgICAgICBpZiAoIG5lZWRfc2l6ZSA+ICgqdG90YWwpICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCogYnVmZmVyID0gKChpbnQqKShobW0tPm9ic1Byb2IpKSAtIDM7CisgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIpOworICAgICAgICAgICAgYnVmZmVyID0gKGludCopY3ZBbGxvYyggbmVlZF9zaXplICsgMyAqIHNpemVvZihpbnQpKTsKKyAgICAgICAgICAgIGJ1ZmZlclswXSA9IG5lZWRfc2l6ZTsKKyAgICAgICAgICAgIGJ1ZmZlclsxXSA9IG9ic19pbmZvLT5vYnNfeTsKKyAgICAgICAgICAgIGJ1ZmZlclsyXSA9IG9ic19pbmZvLT5vYnNfeDsKKworICAgICAgICAgICAgaG1tLT5vYnNQcm9iID0gKGZsb2F0KiopKGJ1ZmZlciArIDMpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzdGF0dXMgPSAzOworICAgICAgICB9ICAgICAgICAgIAorICAgIH0KKyAgICBpZiAoIXN0YXR1cykKKyAgICB7CisgICAgICAgIGludCogb2JzeCA9ICgoaW50KikoaG1tLT5vYnNQcm9iKSkgLSAxOworICAgICAgICBpbnQqIG9ic3kgPSAoKGludCopKGhtbS0+b2JzUHJvYikpIC0gMjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0KCAoKm9ic3ggPiAwKSAmJiAoKm9ic3kgPiAwKSApOworCisgICAgICAgIC8qIGlzIGdvb2QgZGlzdHJpYnV0aW9uPyAqLworICAgICAgICBpZiAoIChvYnNfaW5mby0+b2JzX3ggPiAoKm9ic3gpICkgfHwgKG9ic19pbmZvLT5vYnNfeSA+ICgqb2JzeSkgKSApIAorICAgICAgICAgICAgc3RhdHVzID0gMzsgICAgICAgIAorICAgIH0KKyAgICAKKyAgICAvKiBpZiBiYWQgc3RhdHVzIC0gZG8gcmVhbGxvY2F0aW9uIGFjdGlvbnMgKi8KKyAgICBhc3NlcnQoIChzdGF0dXMgPT0gMCkgfHwgKHN0YXR1cyA9PSAzKSApOworCisgICAgaWYgKCBzdGF0dXMgKQorICAgIHsKKyAgICAgICAgZmxvYXQqKiB0bXAgPSBobW0tPm9ic1Byb2I7CisgICAgICAgIGZsb2F0KiAgdG1wZjsKKworICAgICAgICAvKiBkaXN0cmlidXRlIHBvaW50ZXJzIG9mIGVobW0tPm9ic1Byb2IgKi8KKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaG1tLT51LmVobW1baV0ub2JzUHJvYiA9IHRtcDsgCisgICAgICAgICAgICB0bXAgKz0gb2JzX2luZm8tPm9ic195OworICAgICAgICB9CisKKyAgICAgICAgdG1wZiA9IChmbG9hdCopdG1wOworCisgICAgICAgIC8qIGRpc3RyaWJ1dGUgcG9pbnRlcnMgb2YgZWhtbS0+b2JzUHJvYltqXSAqLworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgaG1tLT5udW1fc3RhdGVzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkVITU0qIGVobW0gPSAmKCBobW0tPnUuZWhtbVtpXSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgb2JzX2luZm8tPm9ic195OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVobW0tPm9ic1Byb2Jbal0gPSB0bXBmOworICAgICAgICAgICAgICAgIHRtcGYgKz0gZWhtbS0+bnVtX3N0YXRlcyAqIG9ic19pbmZvLT5vYnNfeDsKKyAgICAgICAgICAgIH0gICAgICAgICAgIAorICAgICAgICB9CisgICAgfS8qIGVuZCBvZiBwb2ludGVyIGRpc3RyaWJ1dGlvbiAqLyAKKworI2lmIDEgICAgCisgICAgeworI2RlZmluZSBNQVhfQlVGX1NJWkUgIDEyMDAKKyAgICAgICAgZmxvYXQgIGxvY2FsX2xvZ19taXhfcHJvYltNQVhfQlVGX1NJWkVdOworICAgICAgICBkb3VibGUgbG9jYWxfbWl4X3Byb2JbTUFYX0JVRl9TSVpFXTsKKyAgICAgICAgaW50ICAgIHZlY3Rfc2l6ZSA9IG9ic19pbmZvLT5vYnNfc2l6ZTsKKyAgICAgICAgQ3ZTdGF0dXMgcmVzID0gQ1ZfTk9fRVJSOworCisgICAgICAgIGZsb2F0KiAgbG9nX21peF9wcm9iID0gbG9jYWxfbG9nX21peF9wcm9iOworICAgICAgICBkb3VibGUqIG1peF9wcm9iID0gbG9jYWxfbWl4X3Byb2I7CisgICAgICAgIAorICAgICAgICBpbnQgIG1heF9zaXplID0gMDsKKyAgICAgICAgaW50ICBvYnNfeCA9IG9ic19pbmZvLT5vYnNfeDsKKworICAgICAgICAvKiBjYWxjdWxhdGUgdGVtcG9yYXJ5IGJ1ZmZlciBzaXplICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1baV0pOworICAgICAgICAgICAgQ3ZFSE1NU3RhdGUqIHN0YXRlID0gZWhtbS0+dS5zdGF0ZTsKKworICAgICAgICAgICAgaW50IG1heF9taXggPSAwOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGVobW0tPm51bV9zdGF0ZXM7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBzdGF0ZVtqXS5udW1fbWl4OworICAgICAgICAgICAgICAgIGlmKCBtYXhfbWl4IDwgdCApIG1heF9taXggPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4X21peCAqPSBlaG1tLT5udW1fc3RhdGVzOworICAgICAgICAgICAgaWYoIG1heF9zaXplIDwgbWF4X21peCApIG1heF9zaXplID0gbWF4X21peDsKKyAgICAgICAgfQorCisgICAgICAgIG1heF9zaXplICo9IG9ic194ICogdmVjdF9zaXplOworICAgICAgICAKKyAgICAgICAgLyogYWxsb2NhdGUgYnVmZmVyICovCisgICAgICAgIGlmKCBtYXhfc2l6ZSA+IE1BWF9CVUZfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxvZ19taXhfcHJvYiA9IChmbG9hdCopY3ZBbGxvYyggbWF4X3NpemUqKHNpemVvZihmbG9hdCkgKyBzaXplb2YoZG91YmxlKSkpOworICAgICAgICAgICAgaWYoICFsb2dfbWl4X3Byb2IgKSByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgICAgICAgICAgbWl4X3Byb2IgPSAoZG91YmxlKikobG9nX21peF9wcm9iICsgbWF4X3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCBsb2dfbWl4X3Byb2IsIDAsIG1heF9zaXplKnNpemVvZihmbG9hdCkpOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKmNvbXB1dGluZyBwcm9iYWJpbGl0aWVzKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIAorICAgICAgICAvKiBsb29wIHRocm91Z2ggZXh0ZXJuYWwgc3RhdGVzICovCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1baV0pOworICAgICAgICAgICAgQ3ZFSE1NU3RhdGUqIHN0YXRlID0gZWhtbS0+dS5zdGF0ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG1heF9taXggPSAwOworICAgICAgICAgICAgaW50IG5fc3RhdGVzID0gZWhtbS0+bnVtX3N0YXRlczsKKworICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1heGltYWwgbnVtYmVyIG9mIG1peHR1cmVzIChhZ2FpbikgKi8KKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBlaG1tLT5udW1fc3RhdGVzOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gc3RhdGVbal0ubnVtX21peDsKKyAgICAgICAgICAgICAgICBpZiggbWF4X21peCA8IHQgKSBtYXhfbWl4ID0gdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogbG9vcCB0aHJvdWdoIHJvd3Mgb2YgdGhlIG9ic2VydmF0aW9uIG1hdHJpeCAqLworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG9ic19pbmZvLT5vYnNfeTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgIG0sIG47CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZsb2F0KiBvYnMgPSBvYnNfaW5mby0+b2JzICsgaiAqIG9ic194ICogdmVjdF9zaXplOworICAgICAgICAgICAgICAgIGZsb2F0KiBsb2dfbXAgPSBtYXhfbWl4ID4gMSA/IGxvZ19taXhfcHJvYiA6IGVobW0tPm9ic1Byb2Jbal07CisgICAgICAgICAgICAgICAgZG91YmxlKiBtcCA9IG1peF9wcm9iOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogc2V2ZXJhbCBwYXNzZXMgYXJlIGRvbmUgYmVsb3cgKi8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiAxLiBjYWxjdWxhdGUgbG9nYXJpdGhtcyBvZiBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIG1peHR1cmUgKi8KKworICAgICAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBtaXh0dXJlcyAqLworICAgICAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBtYXhfbWl4OyBtKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogc2V0IHBvaW50ZXIgdG8gZmlyc3Qgb2JzZXJ2YXRpb24gaW4gdGhlIGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZlY3QgPSBvYnM7CisKKyAgICAgICAgICAgICAgICAgICAgLyogY3ljbGVzIHRocm91Z2ggb2JzZXJhdnRpb25zIGluIHRoZSBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGZvciggbiA9IDA7IG4gPCBvYnNfeDsgbisrLCB2ZWN0ICs9IHZlY3Rfc2l6ZSwgbG9nX21wICs9IG5fc3RhdGVzICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGssIGw7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGwgPSAwOyBsIDwgbl9zdGF0ZXM7IGwrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN0YXRlW2xdLm51bV9taXggPiBtICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBtdSA9IHN0YXRlW2xdLm11ICsgbSp2ZWN0X3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBpbnZfdmFyID0gc3RhdGVbbF0uaW52X3ZhciArIG0qdmVjdF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcHJvYiA9IC1zdGF0ZVtsXS5sb2dfdmFyX3ZhbFttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHZlY3Rfc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSAodmVjdFtrXSAtIG11W2tdKSppbnZfdmFyW2tdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYiAtPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nX21wW2xdID0gTUFYKCAoZmxvYXQpcHJvYiwgLTUwMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIHNraXAgdGhlIHJlc3QgaWYgdGhlcmUgaXMgYSBzaW5nbGUgbWl4dHVyZSAqLworICAgICAgICAgICAgICAgIGlmKCBtYXhfbWl4ID09IDEgKSBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIDIuIGNhbGN1bGF0ZSBleHBvbmVudCBvZiBsb2dfbWl4X3Byb2IKKyAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBwcm9iYWJpbGl0eSBmb3IgZWFjaCBtaXh0dXJlKSAqLworICAgICAgICAgICAgICAgIGN2YkZhc3RFeHAoIGxvZ19taXhfcHJvYiwgbWl4X3Byb2IsIG1heF9taXggKiBvYnNfeCAqIG5fc3RhdGVzICk7CisKKyAgICAgICAgICAgICAgICAvKiAzLiBzdW0gYWxsIG1peHR1cmVzIHdpdGggd2VpZ2h0cyAqLworICAgICAgICAgICAgICAgIC8qIDNhLiBmaXJzdCBtaXh0dXJlIC0gc2ltcGx5IHNjYWxlIGJ5IHdlaWdodCAqLworICAgICAgICAgICAgICAgIGZvciggbiA9IDA7IG4gPCBvYnNfeDsgbisrLCBtcCArPSBuX3N0YXRlcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IG5fc3RhdGVzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtcFtsXSAqPSBzdGF0ZVtsXS53ZWlnaHRbMF07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiAzYi4gYWRkIG90aGVyIG1peHR1cmVzICovCisgICAgICAgICAgICAgICAgZm9yKCBtID0gMTsgbSA8IG1heF9taXg7IG0rKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgb2ZzID0gLW0qb2JzX3gqbl9zdGF0ZXM7CisgICAgICAgICAgICAgICAgICAgIGZvciggbiA9IDA7IG4gPCBvYnNfeDsgbisrLCBtcCArPSBuX3N0YXRlcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IG5fc3RhdGVzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtIDwgc3RhdGVbbF0ubnVtX21peCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcFtsICsgb2ZzXSArPSBtcFtsXSAqIHN0YXRlW2xdLndlaWdodFttXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiA0LiBQdXQgbG9nYXJpdGhtcyBvZiBzdW1tYXJ5IHByb2JhYmlsaXRpZXMgdG8gdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCAqLworICAgICAgICAgICAgICAgIGN2YkZhc3RMb2coIG1peF9wcm9iLCBlaG1tLT5vYnNQcm9iW2pdLCBvYnNfeCAqIG5fc3RhdGVzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggbG9nX21peF9wcm9iICE9IGxvY2FsX2xvZ19taXhfcHJvYiApIGN2RnJlZSggJmxvZ19taXhfcHJvYiApOworICAgICAgICByZXR1cm4gcmVzOworI3VuZGVmIE1BWF9CVUZfU0laRQorICAgIH0KKyNlbHNlCisgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1baV0pOworICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGUgPSBlaG1tLT51LnN0YXRlOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBvYnNfaW5mby0+b2JzX3k7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrLG07CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9ic19pbmRleCA9IGogKiBvYnNfaW5mby0+b2JzX3g7CisKKyAgICAgICAgICAgIGZsb2F0KiBCID0gZWhtbS0+b2JzUHJvYltqXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogY3ljbGVzIHRocm91Z2ggb2JzIGFuZCBzdGF0ZXMgKi8KKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBvYnNfaW5mby0+b2JzX3g7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmIHZlY3QgPSAob2JzX2luZm8tPm9icykgKyAob2JzX2luZGV4ICsgaykgKiB2ZWN0X3NpemU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmxvYXQqIG1hdHJfbGluZSA9IEIgKyBrICogZWhtbS0+bnVtX3N0YXRlczsKKworICAgICAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBlaG1tLT5udW1fc3RhdGVzOyBtKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0cl9saW5lW21dID0gaWN2Q29tcHV0ZUdhdXNzTWl4dHVyZSggdmVjdCwgc3RhdGVbbV0ubXUsIHN0YXRlW21dLmludl92YXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW21dLmxvZ192YXJfdmFsLCB2ZWN0X3NpemUsIHN0YXRlW21dLndlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVttXS5udW1fbWl4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBFc3RpbWF0ZVRyYW5zUHJvYgorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0YXRlIGFuZCBzdXBlciBzdGF0ZSB0cmFuc2l0aW9uIHByb2JhYmlsaXRpZXMgCisvLyAgICAgICAgICAgICBvZiB0aGUgbW9kZWwgZ2l2ZW4gdGhlIGltYWdlcywgCisvLyAgICAgICAgICAgICB0aGUgc3RhdGUgc2VnbWVudGF0aW9uIGFuZCB0aGUgaW5wdXQgcGFyYW1ldGVycworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6IG9ic19pbmZvX2FycmF5IC0gYXJyYXkgb2YgcG9pbnRlcnMgdG8gaW1hZ2Ugb2JzZXJ2YXRpb25zIAorLy8gICAgICAgICAgICAgICAgbnVtX2ltZyAtIGxlbmd0aCBvZiBhYm92ZSBhcnJheQorLy8gICAgICAgICAgICAgICAgaG1tIC0gcG9pbnRlciB0byBITU0gc3RydWN0dXJlICAgICAgICAgICAgICAgICAKKy8vICAgIFJldHVybnM6IHZvaWQKKy8vCisvLyAgICBOb3RlczogICAKKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2RXN0aW1hdGVUcmFuc1Byb2IoIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0gKQoreworICAgIGludCAgaSwgaiwgazsKKworICAgIEN2RUhNTVN0YXRlKiBmaXJzdF9zdGF0ZSA9IGhtbS0+dS5laG1tLT51LnN0YXRlOworICAgIC8qIGFzIGEgY291bnRlciB3ZSB3aWxsIHVzZSB0cmFuc1AgbWF0cml4ICovCisgICAgCisgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgICAKKyAgICAvKiBjbGVhciB0cmFuc1AgKi8KKyAgICBpY3ZTZXRaZXJvXzMyZiggaG1tLT50cmFuc1AsIGhtbS0+bnVtX3N0YXRlcywgaG1tLT5udW1fc3RhdGVzICk7CisgICAgZm9yIChpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIGljdlNldFplcm9fMzJmKCBobW0tPnUuZWhtbVtpXS50cmFuc1AgLCBobW0tPnUuZWhtbVtpXS5udW1fc3RhdGVzLCBobW0tPnUuZWhtbVtpXS5udW1fc3RhdGVzICk7CisgICAgfQorICAgICAgICAKKyAgICAvKiBjb21wdXRlIHRoZSBjb3VudGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1faW1nOyBpKyspCisgICAgeworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIEN2SW1nT2JzSW5mbyogaW5mbyA9IG9ic19pbmZvX2FycmF5W2ldOworICAgICAgICAKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IGluZm8tPm9ic195OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBpbmZvLT5vYnNfeDsgaysrLCBjb3VudGVyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBob3cgbWFueSB0cmFuc2l0aW9ucyBmcm9tIHN0YXRlIHRvIHN0YXRlCisgICAgICAgICAgICAgICAgICAgb2NjdXJlZCBib3RoIGluIGhvcml6b250YWwgYW5kIHZlcnRpY2FsIGRpcmVjdGlvbiAqLyAKKyAgICAgICAgICAgICAgICBpbnQgc3VwZXJzdGF0ZSwgc3RhdGU7CisgICAgICAgICAgICAgICAgaW50IG5leHRzdXBlcnN0YXRlLCBuZXh0c3RhdGU7CisgICAgICAgICAgICAgICAgaW50IGJlZ2luX2luZDsKKworICAgICAgICAgICAgICAgIHN1cGVyc3RhdGUgPSBpbmZvLT5zdGF0ZVsyICogY291bnRlcl07CisgICAgICAgICAgICAgICAgYmVnaW5faW5kID0gKGludCkoaG1tLT51LmVobW1bc3VwZXJzdGF0ZV0udS5zdGF0ZSAtIGZpcnN0X3N0YXRlKTsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IGluZm8tPnN0YXRlWyAyICogY291bnRlciArIDFdIC0gYmVnaW5faW5kOyAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiAoaiA8IGluZm8tPm9ic195IC0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0cmFuc1Bfc2l6ZSA9IGhtbS0+bnVtX3N0YXRlczsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIG5leHRzdXBlcnN0YXRlID0gaW5mby0+c3RhdGVbIDIqKGNvdW50ZXIgKyBpbmZvLT5vYnNfeCkgXTsKKworICAgICAgICAgICAgICAgICAgICBobW0tPnRyYW5zUFtzdXBlcnN0YXRlICogdHJhbnNQX3NpemUgKyBuZXh0c3VwZXJzdGF0ZV0gKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYgKGsgPCBpbmZvLT5vYnNfeCAtIDEpCisgICAgICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNQX3NpemUgPSBobW0tPnUuZWhtbVtzdXBlcnN0YXRlXS5udW1fc3RhdGVzOworCisgICAgICAgICAgICAgICAgICAgIG5leHRzdGF0ZSA9IGluZm8tPnN0YXRlWzIqKGNvdW50ZXIrMSkgKyAxXSAtIGJlZ2luX2luZDsKKyAgICAgICAgICAgICAgICAgICAgaG1tLT51LmVobW1bc3VwZXJzdGF0ZV0udHJhbnNQWyBzdGF0ZSAqIHRyYW5zUF9zaXplICsgbmV4dHN0YXRlXSArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBlc3RpbWF0ZSBzdXBlcnN0YXRlIG1hdHJpeCAqLworICAgIGZvciggaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKykKKyAgICB7CisgICAgICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAgICAgZmxvYXQgaW52X3RvdGFsOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgaG1tLT5udW1fc3RhdGVzOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRvdGFsICs9IGhtbS0+dHJhbnNQW2kgKiBobW0tPm51bV9zdGF0ZXMgKyBqXTsKKyAgICAgICAgfQorICAgICAgICAvL2Fzc2VydCggdG90YWwgKTsKKworICAgICAgICBpbnZfdG90YWwgPSB0b3RhbCA/IDEuZi90b3RhbCA6IDA7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgaG1tLT5udW1fc3RhdGVzOyBqKyspCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBobW0tPnRyYW5zUFtpICogaG1tLT5udW1fc3RhdGVzICsgal0gPSAKKyAgICAgICAgICAgICAgICBobW0tPnRyYW5zUFtpICogaG1tLT5udW1fc3RhdGVzICsgal0gPyAKKyAgICAgICAgICAgICAgICAoZmxvYXQpbG9nKCBobW0tPnRyYW5zUFtpICogaG1tLT5udW1fc3RhdGVzICsgal0gKiBpbnZfdG90YWwgKSA6IC1CSUdfRkxUOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIC8qIGVzdGltYXRlIG90aGVyIG1hdHJpY2VzICovCisgICAgZm9yKCBrID0gMDsgayA8IGhtbS0+bnVtX3N0YXRlczsgaysrICkKKyAgICB7CisgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1ba10pOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBlaG1tLT5udW1fc3RhdGVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHRvdGFsID0gMDsKKyAgICAgICAgICAgIGZsb2F0IGludl90b3RhbDsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBlaG1tLT5udW1fc3RhdGVzOyBqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG90YWwgKz0gZWhtbS0+dHJhbnNQW2kqZWhtbS0+bnVtX3N0YXRlcyArIGpdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9hc3NlcnQoIHRvdGFsICk7CisgICAgICAgICAgICBpbnZfdG90YWwgPSB0b3RhbCA/IDEuZi90b3RhbCA6ICAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZWhtbS0+bnVtX3N0YXRlczsgaisrKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBlaG1tLT50cmFuc1BbaSAqIGVobW0tPm51bV9zdGF0ZXMgKyBqXSA9IAorICAgICAgICAgICAgICAgICAgICAoZWhtbS0+dHJhbnNQW2kgKiBlaG1tLT5udW1fc3RhdGVzICsgal0pID8KKyAgICAgICAgICAgICAgICAgICAgKGZsb2F0KWxvZyggZWhtbS0+dHJhbnNQW2kgKiBlaG1tLT5udW1fc3RhdGVzICsgal0gKiBpbnZfdG90YWwpIDogLUJJR19GTFQgOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDVl9OT19FUlI7Cit9IAorICAgICAgICAgICAgICAgICAgICAgIAorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IE1peFNlZ21MMgorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIG1peHR1cmUgc2VnbWVudGF0aW9uIG9mIHRoZSBzdGF0ZXMgb2YgdGhlCisvLyAgICAgICAgICAgICBlbWJlZGRlZCBITU0KKy8vICAgIENvbnRleHQ6IHVzZWQgd2l0aCB0aGUgVml0ZXJiaSB0cmFpbmluZyBvZiB0aGUgZW1iZWRkZWQgSE1NCisvLworLy8gICAgUGFyYW1ldGVyczogIAorLy8gICAgICAgICAgICAgb2JzX2luZm9fYXJyYXkKKy8vICAgICAgICAgICAgIG51bV9pbWcKKy8vICAgICAgICAgICAgIGhtbQorLy8gICAgUmV0dXJuczogdm9pZAorLy8KKy8vICAgIE5vdGVzOiAKKy8vRiovCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2TWl4U2VnbUwyKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICkKK3sKKyAgICBpbnQgICAgIGssIGksIGosIG07CisgICAgICAgCisgICAgQ3ZFSE1NU3RhdGUqIHN0YXRlID0gaG1tLT51LmVobW1bMF0udS5zdGF0ZTsKKyAgICAKKyAgICAKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsgICAKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBDdkltZ09ic0luZm8qIGluZm8gPSBvYnNfaW5mb19hcnJheVtrXTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+b2JzX3k7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGluZm8tPm9ic194OyBqKyssIGNvdW50ZXIrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZV9zdGF0ZSA9IGluZm8tPnN0YXRlWzIgKiBjb3VudGVyICsgMV07CisgICAgICAgICAgICAgICAgZmxvYXQgbWluX2Rpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtaW5fZGlzdCA9IGljdlNxdWFyZURpc3RhbmNlKChpbmZvLT5vYnMpICsgKGNvdW50ZXIgKiBpbmZvLT5vYnNfc2l6ZSksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVtlX3N0YXRlXS5tdSwgaW5mby0+b2JzX3NpemUpOworICAgICAgICAgICAgICAgIGluZm8tPm1peFtjb3VudGVyXSA9IDA7ICAKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IgKG0gPSAxOyBtIDwgc3RhdGVbZV9zdGF0ZV0ubnVtX21peDsgbSsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgZGlzdD1pY3ZTcXVhcmVEaXN0YW5jZSggKGluZm8tPm9icykgKyAoY291bnRlciAqIGluZm8tPm9ic19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVtlX3N0YXRlXS5tdSArIG0gKiBpbmZvLT5vYnNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5vYnNfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkaXN0IDwgbWluX2Rpc3QpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFzc2lnbiBtaXh0dXJlIHdpdGggc21hbGxlc3QgZGlzdGFuY2UgKi8gCisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5taXhbY291bnRlcl0gPSBtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDVl9OT19FUlI7Cit9IAorCisvKgorQ3ZTdGF0dXMgaWN2TWl4U2VnbVByb2IoQ3ZJbWdPYnNJbmZvKiBvYnNfaW5mbywgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICkKK3sKKyAgICBpbnQgICAgIGssIGksIGosIG07CisgICAgICAgCisgICAgQ3ZFSE1NU3RhdGUqIHN0YXRlID0gaG1tLT5laG1tWzBdLnN0YXRlX2luZm87CisgICAgCisgICAgCisgICAgZm9yIChrID0gMDsgayA8IG51bV9pbWc7IGsrKykKKyAgICB7ICAgCisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgQ3ZJbWdPYnNJbmZvKiBpbmZvID0gb2JzX2luZm8gKyBrOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5vYnNfeTsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgaW5mby0+b2JzX3g7IGorKywgY291bnRlcisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBlX3N0YXRlID0gaW5mby0+aW5fc3RhdGVbY291bnRlcl07CisgICAgICAgICAgICAgICAgZmxvYXQgbWF4X3Byb2I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBtYXhfcHJvYiA9IGljdkNvbXB1dGVVbmlNb2RlR2F1c3MoIGluZm8tPm9ic1tjb3VudGVyXSwgc3RhdGVbZV9zdGF0ZV0ubXVbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW2Vfc3RhdGVdLmludl92YXJbMF0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW2Vfc3RhdGVdLmxvZ192YXJbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+b2JzX3NpemUgKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5taXhbY291bnRlcl0gPSAwOyAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yIChtID0gMTsgbSA8IHN0YXRlW2Vfc3RhdGVdLm51bV9taXg7IG0rKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHByb2I9aWN2Q29tcHV0ZVVuaU1vZGVHYXVzcyhpbmZvLT5vYnNbY291bnRlcl0sIHN0YXRlW2Vfc3RhdGVdLm11W21dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW2Vfc3RhdGVdLmludl92YXJbbV0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW2Vfc3RhdGVdLmxvZ192YXJbbV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+b2JzX3NpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvYiA+IG1heF9wcm9iKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcHJvYiA9IHByb2I7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gbWl4dHVyZSB3aXRoIGdyZWF0ZXN0IHByb2JhYmlsaXR5LiAKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm1peFtjb3VudGVyXSA9IG07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IAorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30gCisqLworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdlZpdGVyYmlTZWdtZW50YXRpb24oIGludCBudW1fc3RhdGVzLCBpbnQgLypudW1fb2JzKi8sIEN2TWF0cjMyZiB0cmFuc1AsCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdHIzMmYgQiwgaW50IHN0YXJ0X29icywgaW50IHByb2JfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCoqIHEsIGludCBtaW5fbnVtX29icywgaW50IG1heF9udW1fb2JzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHByb2IgKQoreworICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9uIAorICAgIGludCBpLCBqLCBsYXN0X29iczsKKyAgICBpbnQgbV9ITU1UeXBlID0gX0NWX0VSR09ESUM7IC8qIF9DVl9DQVVTQUwgb3IgX0NWX0VSR09ESUMgKi8KKyAgICAKKyAgICBpbnQgbV9Qcm9iVHlwZSAgID0gcHJvYl90eXBlOyAvKiBfQ1ZfTEFTVF9TVEFURSBvciBfQ1ZfQkVTVF9TVEFURSAqLworICAgIAorICAgIGludCBtX21pbk51bU9icyAgPSBtaW5fbnVtX29iczsgLyo/PyovCisgICAgaW50IG1fbWF4TnVtT2JzICA9IG1heF9udW1fb2JzOyAvKj8/Ki8KKyAgICAKKyAgICBpbnQgbV9udW1TdGF0ZXMgID0gbnVtX3N0YXRlczsKKyAgICAKKyAgICBmbG9hdCogbV9waSA9IChmbG9hdCopY3ZBbGxvYyggbnVtX3N0YXRlcyogc2l6ZW9mKGZsb2F0KSApOworICAgIEN2TWF0cjMyZiBtX2EgPSB0cmFuc1A7CisKKyAgICAvLyBvZmZzZXQgYnJvYmFiaWxpdHkgbWF0cml4IHRvIHN0YXJ0aW5nIG9ic2VydmF0aW9uIAorICAgIEN2TWF0cjMyZiBtX2IgPSBCICsgc3RhcnRfb2JzICogbnVtX3N0YXRlczsKKyAgICAvL3NvIG1feGwgd2lsbCBub3QgYmUgdXNlZCBtb3JlCisKKyAgICAvL21feGwgPSBzdGFydF9vYnM7IAorCisgICAgLyogICAgIGlmIChtdUR1ciAhPSBOVUxMKXsgCisgICAgbV9kID0gbmV3IGludFttX251bVN0YXRlc107CisgICAgbV9sID0gbmV3IGRvdWJsZVttX251bVN0YXRlc107CisgICAgZm9yIChpID0gMDsgaSA8IG1fbnVtU3RhdGVzOyBpKyspeworICAgIG1fbFtpXSA9IG11RHVyW2ldOyAKKyAgICB9CisgICAgfSAKKyAgICBlbHNleworICAgIG1fZCA9IE5VTEw7CisgICAgbV9sID0gTlVMTDsKKyAgICB9CisgICAgKi8KKyAgICAKKyAgICBDdk1hdHIzMmYgbV9HYW1tYSA9IGljdkNyZWF0ZU1hdHJpeF8zMmYoIG51bV9zdGF0ZXMsIG1fbWF4TnVtT2JzICk7CisgICAgaW50KiBtX2NzaSA9IChpbnQqKWN2QWxsb2MoIG51bV9zdGF0ZXMgKiBtX21heE51bU9icyAqIHNpemVvZihpbnQpICk7CisgICAgCisgICAgLy9zdG9yZXMgbWF4aW1hbCByZXN1bHQgZm9yIGV2ZXJ5IGVuZGluZyBvYnNlcnZhdGlvbiAqLworICAgIEN2VmVjdDMyZiAgIG1fTWF4R2FtbWEgPSBwcm9iOworICAgIAorCisvLyAgICBhc3NlcnQoIG1feGwgKyBtYXhfbnVtX29icyA8PSBudW1fb2JzICk7CisKKyAgICAvKj8/bV9xICAgICAgICAgID0gbmV3IGludCpbbV9tYXhOdW1PYnMgLSBtX21pbk51bU9ic107CisgICAgICA/P2ZvciAoaSA9IDA7IGkgPCBtX21heE51bU9icyAtIG1fbWluTnVtT2JzOyBpKyspCisgICAgICA/PyAgICAgbV9xW2ldID0gbmV3IGludFttX21pbk51bU9icyArIGkgKyAxXTsKKyAgICAqLworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICBWaXRlcmJpIGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIHNldCBpbml0aWFsIHN0YXRlIHByb2JhYmlsaXRpZXMsIGluIGxvZ2FyaXRobWljIHNjYWxlICovCisgICAgZm9yIChpID0gMDsgaSA8IG1fbnVtU3RhdGVzOyBpKyspCisgICAgeworICAgICAgICBtX3BpW2ldID0gLUJJR19GTFQ7CisgICAgfQorICAgIG1fcGlbMF0gPSAwLjBmOworICAgIAorICAgIGZvciAgKGkgPSAwOyBpIDwgbnVtX3N0YXRlczsgaSsrKQorICAgIHsKKyAgICAgICAgbV9HYW1tYVswICogbnVtX3N0YXRlcyArIGldID0gbV9waVtpXSArIG1fYlswICogbnVtX3N0YXRlcyArIGldOworICAgICAgICBtX2NzaVswICogbnVtX3N0YXRlcyArIGldID0gMDsgICAKKyAgICB9CisgICAgCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiAgICBWaXRlcmJpIHJlY3Vyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgIGlmICggbV9ITU1UeXBlID09IF9DVl9DQVVTQUwgKSAvL2NhdXNhbCBtb2RlbAorICAgIHsKKyAgICAgICAgaW50IHQsajsKKyAgICAgICAgCisgICAgICAgIGZvciAodCA9IDEgOyB0IDwgbV9tYXhOdW1PYnM7IHQrKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZXZhbHVhdGUgc2VsZi10by1zZWxmIHRyYW5zaXRpb24gZm9yIHN0YXRlIDAKKyAgICAgICAgICAgIG1fR2FtbWFbdCAqIG51bV9zdGF0ZXMgKyAwXSA9IG1fR2FtbWFbKHQtMSkgKiBudW1fc3RhdGVzICsgMF0gKyBtX2FbMF07CisgICAgICAgICAgICBtX2NzaVt0ICogbnVtX3N0YXRlcyArIDBdID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IG51bV9zdGF0ZXM7IGorKykKKyAgICAgICAgICAgIHsgIAorICAgICAgICAgICAgICAgIGZsb2F0IHNlbGYgPSBtX0dhbW1hWyAodC0xKSAqIG51bV9zdGF0ZXMgKyBqXSArIG1fYVsgaiAqIG51bV9zdGF0ZXMgKyBqXTsKKyAgICAgICAgICAgICAgICBmbG9hdCBwcmV2ID0gbV9HYW1tYVsgKHQtMSkgKiBudW1fc3RhdGVzICsoai0xKV0gKyBtX2FbIChqLTEpICogbnVtX3N0YXRlcyArIGpdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmICggcHJldiA+IHNlbGYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9jc2lbdCAqIG51bV9zdGF0ZXMgKyBqXSA9IGotMTsKKyAgICAgICAgICAgICAgICAgICAgbV9HYW1tYVt0ICogbnVtX3N0YXRlcyArIGpdID0gcHJldjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9jc2lbdCAqIG51bV9zdGF0ZXMgKyBqXSA9IGo7CisgICAgICAgICAgICAgICAgICAgIG1fR2FtbWFbdCAqIG51bV9zdGF0ZXMgKyBqXSA9IHNlbGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIG1fR2FtbWFbdCAqIG51bV9zdGF0ZXMgKyBqXSA9IG1fR2FtbWFbdCAqIG51bV9zdGF0ZXMgKyBqXSArIG1fYlt0ICogbnVtX3N0YXRlcyArIGpdOyAgIAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIG1fSE1NVHlwZSA9PSBfQ1ZfRVJHT0RJQyApIC8vZXJnb2RpYyBtb2RlbCAKKyAgICB7IAorICAgICAgICBpbnQgdDsKKyAgICAgICAgZm9yICh0ID0gMSA7IHQgPCBtX21heE51bU9iczsgdCsrKQorICAgICAgICB7ICAgICAKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc3RhdGVzOyBqKyspCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgbV9HYW1tYVsgdCpudW1fc3RhdGVzICsgal0gPSBtX0dhbW1hWyh0LTEpICogbnVtX3N0YXRlcyArIDBdICsgbV9hWzAqbnVtX3N0YXRlcytqXTsKKyAgICAgICAgICAgICAgICBtX2NzaVt0ICpudW1fc3RhdGVzICsgal0gPSAwOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCBudW1fc3RhdGVzOyBpKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCBjdXJyR2FtbWEgPSBtX0dhbW1hWyh0LTEpICpudW1fc3RhdGVzICsgaV0gKyBtX2FbaSAqbnVtX3N0YXRlcyArIGpdOyAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJHYW1tYSA+IG1fR2FtbWFbdCAqbnVtX3N0YXRlcyArIGpdKQorICAgICAgICAgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgICAgICAgICAgbV9HYW1tYVt0ICogbnVtX3N0YXRlcyArIGpdID0gY3VyckdhbW1hOworICAgICAgICAgICAgICAgICAgICAgICAgbV9jc2lbdCAqIG51bV9zdGF0ZXMgKyBqXSA9IGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIG1fR2FtbWFbdCAqbnVtX3N0YXRlcyArIGpdID0gbV9HYW1tYVt0ICpudW1fc3RhdGVzICsgal0gKyBtX2JbdCAqIG51bV9zdGF0ZXMgKyBqXTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAKKyAgICB9CisKKyAgICBmb3IoIGxhc3Rfb2JzID0gbV9taW5OdW1PYnMtMSwgaSA9IDA7IGxhc3Rfb2JzIDwgbV9tYXhOdW1PYnM7IGxhc3Rfb2JzKyssIGkrKyApCisgICAgeworICAgICAgICBpbnQgdDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgICBWaXRlcmJpIHRlcm1pbmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIAorICAgICAgICBpZiAoIG1fUHJvYlR5cGUgPT0gX0NWX0xBU1RfU1RBVEUgKQorICAgICAgICB7CisgICAgICAgICAgICBtX01heEdhbW1hW2ldID0gbV9HYW1tYVtsYXN0X29icyAqIG51bV9zdGF0ZXMgKyBudW1fc3RhdGVzIC0gMV07CisgICAgICAgICAgICBxW2ldW2xhc3Rfb2JzXSA9IG51bV9zdGF0ZXMgLSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIG1fUHJvYlR5cGUgPT0gX0NWX0JFU1RfU1RBVEUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgazsKKyAgICAgICAgICAgIHFbaV1bbGFzdF9vYnNdID0gMDsgIAorICAgICAgICAgICAgbV9NYXhHYW1tYVtpXSA9IG1fR2FtbWFbbGFzdF9vYnMgKiBudW1fc3RhdGVzICsgMF07IAorICAgICAgICAKKyAgICAgICAgICAgIGZvcihrID0gMTsgayA8IG51bV9zdGF0ZXM7IGsrKykKKyAgICAgICAgICAgIHsgCisgICAgICAgICAgICAgICAgaWYgKCBtX0dhbW1hW2xhc3Rfb2JzICogbnVtX3N0YXRlcyArIGtdID4gbV9NYXhHYW1tYVtpXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX01heEdhbW1hW2ldID0gbV9HYW1tYVtsYXN0X29icyAqIG51bV9zdGF0ZXMgKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgcVtpXVtsYXN0X29ic10gPSBrOworICAgICAgICAgICAgICAgIH0gICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0gCisgICAgCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAgIFZpdGVyYmkgYmFja3RyYWNraW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIGZvciAgKHQgPSBsYXN0X29icy0xOyB0ID49IDA7IHQtLSkKKyAgICAgICAgeworICAgICAgICAgICAgcVtpXVt0XSA9IG1fY3NpWyh0KzEpICogbnVtX3N0YXRlcyArIHFbaV1bdCsxXSBdOyAgIAorICAgICAgICB9IAorICAgIH0gICAgICAgICAgICAKKyAgICAKKyAgICAvKiBtZW1vcnkgZnJlZSAqLworICAgIGN2RnJlZSggJm1fcGkgKTsKKyAgICBjdkZyZWUoICZtX2NzaSApOworICAgIGljdkRlbGV0ZU1hdHJpeCggbV9HYW1tYSApOyAgIAorICAgICAgIAorICAgIHJldHVybiBDVl9OT19FUlI7Cit9IAorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkVWaXRlcmJpCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW1iZWRkZWQgVml0ZXJiaSBhbGdvcml0aG0KKy8vICAgICAgICAgICAgIGZvciAxIGltYWdlIAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICAKKy8vICAgICAgICAgICAgIG9ic19pbmZvIC0gb2JzZXJ2YXRpb25zCisvLyAgICAgICAgICAgICBobW0gICAgICAtIEhNTQorLy8gICAgICAgICAgICAgICAgCisvLyAgICBSZXR1cm5zOiB0aGUgRW1iZWRkZWQgVml0ZXJiaSBwcm9iYWJpbGl0eSAoZmxvYXQpIAorLy8gICAgICAgICAgICAgYW5kIGRvIHN0YXRlIHNlZ21lbnRhdGlvbiBvZiBvYnNlcnZhdGlvbnMKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworc3RhdGljIGZsb2F0IENWX1NURENBTEwgaWN2RVZpdGVyYmkoIEN2SW1nT2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tICkKK3sKKyAgICBpbnQgICAgaSwgaiwgY291bnRlcjsKKyAgICBmbG9hdCAgbG9nX2xpa2VsaWhvb2Q7CisKKyAgICBmbG9hdCBpbnZfb2JzX3ggPSAxLmYgLyBvYnNfaW5mby0+b2JzX3g7CisKKyAgICBDdkVITU1TdGF0ZSogZmlyc3Rfc3RhdGUgPSBobW0tPnUuZWhtbS0+dS5zdGF0ZTsKKyAgICAKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3Igc3VwZXJCICovCisgICAgQ3ZNYXRyMzJmIHN1cGVyQiA9IGljdkNyZWF0ZU1hdHJpeF8zMmYoaG1tLT5udW1fc3RhdGVzLCBvYnNfaW5mby0+b2JzX3kgKTsKKyAgICAKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgcSAqLworICAgIGludCoqKiBxID0gKGludCoqKiljdkFsbG9jKCBobW0tPm51bV9zdGF0ZXMgKiBzaXplb2YoaW50KiopICk7CisgICAgaW50KiBzdXBlcl9xID0gKGludCopY3ZBbGxvYyggb2JzX2luZm8tPm9ic195ICogc2l6ZW9mKGludCkgKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgaG1tLT5udW1fc3RhdGVzOyBpKyspCisgICAgeworICAgICAgICBxW2ldID0gKGludCoqKWN2QWxsb2MoIG9ic19pbmZvLT5vYnNfeSAqIHNpemVvZihpbnQqKSApOworICAgICAgICAKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG9ic19pbmZvLT5vYnNfeSA7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgcVtpXVtqXSA9IChpbnQqKWN2QWxsb2MoIG9ic19pbmZvLT5vYnNfeCAqIHNpemVvZihpbnQpICk7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgICAgIAorICAgIAorICAgIC8qIHN0YXJ0IFZpdGVyYmkgc2VnbWVudGF0aW9uICovCisgICAgZm9yIChpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrKQorICAgIHsKKyAgICAgICAgQ3ZFSE1NKiBlaG1tID0gJihobW0tPnUuZWhtbVtpXSk7CisgICAgICAgIAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2JzX2luZm8tPm9ic195OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IG1heF9nYW1tYTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogMUQgSE1NIFZpdGVyYmkgc2VnbWVudGF0aW9uICovCisgICAgICAgICAgICBpY3ZWaXRlcmJpU2VnbWVudGF0aW9uKCBlaG1tLT5udW1fc3RhdGVzLCBvYnNfaW5mby0+b2JzX3gsIAorICAgICAgICAgICAgICAgIGVobW0tPnRyYW5zUCwgZWhtbS0+b2JzUHJvYltqXSwgMCwgCisgICAgICAgICAgICAgICAgX0NWX0xBU1RfU1RBVEUsICZxW2ldW2pdLCBvYnNfaW5mby0+b2JzX3gsCisgICAgICAgICAgICAgICAgb2JzX2luZm8tPm9ic194LCAmbWF4X2dhbW1hKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3VwZXJCW2ogKiBobW0tPm51bV9zdGF0ZXMgKyBpXSA9IG1heF9nYW1tYSAqIGludl9vYnNfeDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBwZXJmb3JtIGdsb2JhbCBWaXRlcmJpIHNlZ21lbnRhdGlvbiAoaS5lLiBwcm9jZXNzIGhpZ2hlci1sZXZlbCBITU0pICovCisgICAgCisgICAgaWN2Vml0ZXJiaVNlZ21lbnRhdGlvbiggaG1tLT5udW1fc3RhdGVzLCBvYnNfaW5mby0+b2JzX3ksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobW0tPnRyYW5zUCwgc3VwZXJCLCAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NWX0xBU1RfU1RBVEUsICZzdXBlcl9xLCBvYnNfaW5mby0+b2JzX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic19pbmZvLT5vYnNfeSwgJmxvZ19saWtlbGlob29kICk7CisgICAgCisgICAgbG9nX2xpa2VsaWhvb2QgLz0gb2JzX2luZm8tPm9ic195IDsgICAKKyAgICAKKyAgICAKKyAgICBjb3VudGVyID0gMDsKKyAgICAvKiBhc3NpZ24gbmV3IHN0YXRlIHRvIG9ic2VydmF0aW9uIHZlY3RvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgb2JzX2luZm8tPm9ic195OyBpKyspCisgICAgeyAgIAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgb2JzX2luZm8tPm9ic194OyBqKyssIGNvdW50ZXIrKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN1cGVyc3RhdGUgPSBzdXBlcl9xW2ldOworICAgICAgICAgICAgaW50IHN0YXRlID0gKGludCkoaG1tLT51LmVobW1bc3VwZXJzdGF0ZV0udS5zdGF0ZSAtIGZpcnN0X3N0YXRlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgb2JzX2luZm8tPnN0YXRlWzIgKiBjb3VudGVyXSA9IHN1cGVyc3RhdGU7CisgICAgICAgICAgICBvYnNfaW5mby0+c3RhdGVbMiAqIGNvdW50ZXIgKyAxXSA9IHN0YXRlICsgcVtzdXBlcnN0YXRlXVtpXVtqXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvKiBtZW1vcnkgZGVhbGxvY2F0aW9uIGZvciBzdXBlckIgKi8KKyAgICBpY3ZEZWxldGVNYXRyaXgoIHN1cGVyQiApOworICAgIAorICAgIC8qbWVtb3J5IGRlYWxsb2NhdGlvbiBmb3IgcSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBvYnNfaW5mby0+b2JzX3kgOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2RnJlZSggJnFbaV1bal0gKTsKKyAgICAgICAgfQorICAgICAgICBjdkZyZWUoICZxW2ldICk7CisgICAgfQorICAgIAorICAgIGN2RnJlZSggJnEgKTsKKyAgICBjdkZyZWUoICZzdXBlcl9xICk7CisgICAgCisgICAgcmV0dXJuIGxvZ19saWtlbGlob29kOworfSAgCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZFc3RpbWF0ZUhNTVN0YXRlUGFyYW1zKCBDdkltZ09ic0luZm8qKiBvYnNfaW5mb19hcnJheSwgaW50IG51bV9pbWcsIEN2RUhNTSogaG1tICkKK3sKKyAgICAvKiBjb21wdXRlIGdhbW1hLCB3ZWlnaHRzLCBtZWFucywgdmFycyAqLworICAgIGludCBrLCBpLCBqLCBtOworICAgIGludCB0b3RhbCA9IDA7CisgICAgaW50IHZlY3RfbGVuID0gb2JzX2luZm9fYXJyYXlbMF0tPm9ic19zaXplOworCisgICAgZmxvYXQgc3RhcnRfbG9nX3Zhcl92YWwgPSBMTjJQSSAqIHZlY3RfbGVuOworCisgICAgQ3ZWZWN0MzJmIHRtcF92ZWN0ID0gaWN2Q3JlYXRlVmVjdG9yXzMyZiggdmVjdF9sZW4gKTsKKyAgICAKKyAgICBDdkVITU1TdGF0ZSogZmlyc3Rfc3RhdGUgPSBobW0tPnUuZWhtbVswXS51LnN0YXRlOworCisgICAgYXNzZXJ0KCBzaXplb2YoZmxvYXQpID09IHNpemVvZihpbnQpICk7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBobW0tPm51bV9zdGF0ZXM7IGkrKyApCisgICAgeworICAgICAgICB0b3RhbCs9IGhtbS0+dS5laG1tW2ldLm51bV9zdGF0ZXM7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKkdhbW1hKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogaW5pdGlhbGl6ZSBnYW1tYSAqLworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciAobSA9IDA7IG0gPCBmaXJzdF9zdGF0ZVtpXS5udW1fbWl4OyBtKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICgoaW50KikoZmlyc3Rfc3RhdGVbaV0ud2VpZ2h0KSlbbV0gPSAwOworICAgICAgICB9ICAgICAKKyAgICB9CisgICAgCisgICAgLyogbWF5YmUgZ2FtbWEgbXVzdCBiZSBjb21wdXRlZCBpbiBtaXhzZWdtIHByb2Nlc3MgPz8gKi8KKworICAgIC8qIGNvbXB1dGUgZ2FtbWEgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsKKyAgICAgICAgQ3ZJbWdPYnNJbmZvKiBpbmZvID0gb2JzX2luZm9fYXJyYXlba107CisgICAgICAgIGludCBudW1fb2JzID0gaW5mby0+b2JzX3kgKiBpbmZvLT5vYnNfeDsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29iczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RhdGUsIG1peHR1cmU7CisgICAgICAgICAgICBzdGF0ZSA9IGluZm8tPnN0YXRlWzIqaSArIDFdOworICAgICAgICAgICAgbWl4dHVyZSA9IGluZm8tPm1peFtpXTsKKyAgICAgICAgICAgIC8qIGNvbXB1dGVzIGdhbW1hIC0gbnVtYmVyIG9mIG9ic2VydmF0aW9ucyBjb3JyZXNwb25kaW5nIAorICAgICAgICAgICAgICAgdG8gZXZlcnkgbWl4dHVyZSBvZiBldmVyeSBzdGF0ZSAqLyAKKyAgICAgICAgICAgICgoaW50KikoZmlyc3Rfc3RhdGVbc3RhdGVdLndlaWdodCkpW21peHR1cmVdICs9IDE7ICAgICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0gICAgIAorICAgIC8qKioqKioqKioqKioqKipNZWFuIGFuZCBWYXIqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBjb21wdXRlIG1lYW5zIGFuZCB2YXJpYW5jZXMgb2YgZXZlcnkgaXRlbSAqLworICAgIC8qIGluaXRpYWxseSB2YXJpYW5jZSBwbGFjZWQgdG8gaW52X3ZhciAqLworICAgIC8qIHplcm8gbWVhbiBhbmQgdmFyaWFuY2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIG1lbXNldCggKHZvaWQqKWZpcnN0X3N0YXRlW2ldLm11LCAwLCBmaXJzdF9zdGF0ZVtpXS5udW1fbWl4ICogdmVjdF9sZW4gKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpICk7CisgICAgICAgIG1lbXNldCggKHZvaWQqKWZpcnN0X3N0YXRlW2ldLmludl92YXIsIDAsIGZpcnN0X3N0YXRlW2ldLm51bV9taXggKiB2ZWN0X2xlbiAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKTsKKyAgICB9CisgICAgCisgICAgLyogY29tcHV0ZSBzdW1zICovCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9pbWc7IGkrKykKKyAgICB7CisgICAgICAgIEN2SW1nT2JzSW5mbyogaW5mbyA9IG9ic19pbmZvX2FycmF5W2ldOworICAgICAgICBpbnQgdG90YWxfb2JzID0gaW5mby0+b2JzX3ggKiBpbmZvLT5vYnNfeTsKKworICAgICAgICBmbG9hdCogdmVjdG9yID0gaW5mby0+b2JzOworCisgICAgICAgIGZvciAoaiA9IDA7IGogPCB0b3RhbF9vYnM7IGorKywgdmVjdG9yKz12ZWN0X2xlbiApCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IGluZm8tPnN0YXRlWzIgKiBqICsgMV07CisgICAgICAgICAgICBpbnQgbWl4dHVyZSA9IGluZm8tPm1peFtqXTsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEN2VmVjdDMyZiBtZWFuICA9IGZpcnN0X3N0YXRlW3N0YXRlXS5tdSArIG1peHR1cmUgKiB2ZWN0X2xlbjsKKyAgICAgICAgICAgIEN2VmVjdDMyZiBtZWFuMiA9IGZpcnN0X3N0YXRlW3N0YXRlXS5pbnZfdmFyICsgbWl4dHVyZSAqIHZlY3RfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBpY3ZBZGRWZWN0b3JfMzJmKCBtZWFuLCB2ZWN0b3IsIG1lYW4sIHZlY3RfbGVuICk7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgdmVjdF9sZW47IGsrKyApCisgICAgICAgICAgICAgICAgbWVhbjJba10gKz0gdmVjdG9yW2tdKnZlY3RvcltrXTsKKyAgICAgICAgfSAgIAorICAgIH0KKyAgICAKKyAgICAvKmNvbXB1dGUgdGhlIG1lYW5zIGFuZCB2YXJpYW5jZXMgKi8KKyAgICAvKiBhc3N1bWUgZ2FtbWEgYWxyZWFkeSBjb21wdXRlZCAqLworICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQorICAgIHsgICAgICAgICAgIAorICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGUgPSAmKGZpcnN0X3N0YXRlW2ldKTsKKworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgc3RhdGUtPm51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBDdlZlY3QzMmYgbXUgID0gc3RhdGUtPm11ICsgbSAqIHZlY3RfbGVuOworICAgICAgICAgICAgQ3ZWZWN0MzJmIGludmFyID0gc3RhdGUtPmludl92YXIgKyBtICogdmVjdF9sZW47ICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoICgoaW50KilzdGF0ZS0+d2VpZ2h0KVttXSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgaW52X2dhbW1hID0gMS5mLygoaW50Kikoc3RhdGUtPndlaWdodCkpW21dOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWN2U2NhbGVWZWN0b3JfMzJmKCBtdSwgbXUsIHZlY3RfbGVuLCBpbnZfZ2FtbWEpOworICAgICAgICAgICAgICAgIGljdlNjYWxlVmVjdG9yXzMyZiggaW52YXIsIGludmFyLCB2ZWN0X2xlbiwgaW52X2dhbW1hKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWN2TXVsVmVjdG9yc18zMmYobXUsIG11LCB0bXBfdmVjdCwgdmVjdF9sZW4pOworICAgICAgICAgICAgaWN2U3ViVmVjdG9yXzMyZiggaW52YXIsIHRtcF92ZWN0LCBpbnZhciwgdmVjdF9sZW4pOyAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGxvdyBib3VuZCBvZiB2YXJpYW5jZSAtIDEwMCAoQXJhJ3MgZXhwZXJpbWVudGFsIHJlc3VsdCkgKi8KKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCB2ZWN0X2xlbjsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnZhcltrXSA9IChpbnZhcltrXSA+IDEwMC5mKSA/IGludmFyW2tdIDogMTAwLmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGNvbXB1dGUgbG9nX3ZhciAqLworICAgICAgICAgICAgc3RhdGUtPmxvZ192YXJfdmFsW21dID0gc3RhcnRfbG9nX3Zhcl92YWw7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgdmVjdF9sZW47IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3RhdGUtPmxvZ192YXJfdmFsW21dICs9IChmbG9hdClsb2coIGludmFyW2tdICk7CisgICAgICAgICAgICB9ICAgICAgICAgICAKKworICAgICAgICAgICAgLyogU01PTEkgMjcuMTAuMjAwMCAqLworICAgICAgICAgICAgc3RhdGUtPmxvZ192YXJfdmFsW21dICo9IDAuNTsKKworCisgICAgICAgICAgICAvKiBjb21wdXRlIGludl92YXIgPSAxL3NxcnQoMip2YXJpYW5jZSkgKi8KKyAgICAgICAgICAgIGljdlNjYWxlVmVjdG9yXzMyZihpbnZhciwgaW52YXIsIHZlY3RfbGVuLCAyLmYgKTsKKyAgICAgICAgICAgIGN2YkludlNxcnQoIGludmFyLCBpbnZhciwgdmVjdF9sZW4gKTsKKyAgICAgICAgfQorICAgIH0KKyAgCisgICAgLyoqKioqKioqKioqKioqKldlaWdodHMqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBub3JtaWxpemUgZ2FtbWFzIC0gaS5lLiBjb21wdXRlIG1peHR1cmUgd2VpZ2h0cyAqLworICAgIAorICAgIC8vY29tcHV0ZSB3ZWlnaHRzCisgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspCisgICAgeyAgICAgICAgICAgCisgICAgICAgIGludCBnYW1tYV90b3RhbCA9IDA7CisgICAgICAgIGZsb2F0IG5vcm07CisKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IGZpcnN0X3N0YXRlW2ldLm51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgZ2FtbWFfdG90YWwgKz0gKChpbnQqKShmaXJzdF9zdGF0ZVtpXS53ZWlnaHQpKVttXTsgIAorICAgICAgICB9CisKKyAgICAgICAgbm9ybSA9IGdhbW1hX3RvdGFsID8gKDEuZi8oZmxvYXQpZ2FtbWFfdG90YWwpIDogMC5mOworICAgICAgICAgICAgCisgICAgICAgIGZvciAobSA9IDA7IG0gPCBmaXJzdF9zdGF0ZVtpXS5udW1fbWl4OyBtKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpcnN0X3N0YXRlW2ldLndlaWdodFttXSA9ICgoaW50KikoZmlyc3Rfc3RhdGVbaV0ud2VpZ2h0KSlbbV0gKiBub3JtOworICAgICAgICB9IAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgaWN2RGVsZXRlVmVjdG9yKCB0bXBfdmVjdCk7CisgICAgcmV0dXJuIENWX05PX0VSUjsgCit9ICAgCisKKy8qCitDdlN0YXR1cyBpY3ZMaWdodGluZ0NvcnJlY3Rpb244dUMxUiggdWNoYXIqIGltZywgQ3ZTaXplIHJvaSwgaW50IHNyY19zdGVwICkKK3sKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgd2lkdGggPSByb2kud2lkdGg7CisgICAgaW50IGhlaWdodCA9IHJvaS5oZWlnaHQ7CisgICAgCisgICAgZmxvYXQgeDEsIHgyLCB5MSwgeTI7CisgICAgaW50IGZbM10gPSB7MCwgMCwgMH07CisgICAgZmxvYXQgYVszXSA9IHswLCAwLCAwfTsKKyAgICAKKyAgICBmbG9hdCBoMTsKKyAgICBmbG9hdCBoMjsKKyAgICAKKyAgICBmbG9hdCBjMSxjMjsKKyAgICAKKyAgICBmbG9hdCBtaW4gPSBGTFRfTUFYOworICAgIGZsb2F0IG1heCA9IC1GTFRfTUFYOworICAgIGZsb2F0IGNvcnJlY3Rpb247CisgICAgCisgICAgZmxvYXQqIGZsb2F0X2ltZyA9IGljdkFsbG9jKCB3aWR0aCAqIGhlaWdodCAqIHNpemVvZihmbG9hdCkgKTsKKyAgICAKKyAgICB4MSA9IHdpZHRoICogKHdpZHRoICsgMSkgLyAyLjBmOyAvLyBTdW0gKDEsIC4uLiAsIHdpZHRoKQorICAgIHgyID0gd2lkdGggKiAod2lkdGggKyAxICkgKiAoMiAqIHdpZHRoICsgMSkgLyA2LjBmOyAvLyBTdW0gKDFeMiwgLi4uICwgd2lkdGheMikKKyAgICB5MSA9IGhlaWdodCAqIChoZWlnaHQgKyAxKS8yLjBmOyAvLyBTdW0gKDEsIC4uLiAsIHdpZHRoKQorICAgIHkyID0gaGVpZ2h0ICogKGhlaWdodCArIDEgKSAqICgyICogaGVpZ2h0ICsgMSkgLyA2LjBmOyAvLyBTdW0gKDFeMiwgLi4uICwgd2lkdGheMikKKyAgICAKKyAgICAKKyAgICAvLyBleHRyYWN0IGdyYXl2YWx1ZXMKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgZlsyXSA9IGZbMl0gKyBqICogaW1nW2kqc3JjX3N0ZXAgKyBqXTsKKyAgICAgICAgICAgIGZbMV0gPSBmWzFdICsgaSAqIGltZ1tpKnNyY19zdGVwICsgal07CisgICAgICAgICAgICBmWzBdID0gZlswXSArICAgICBpbWdbaSpzcmNfc3RlcCArIGpdOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGgxID0gKGZsb2F0KWZbMF0gKiAoZmxvYXQpeDEgLyAoZmxvYXQpd2lkdGg7CisgICAgaDIgPSAoZmxvYXQpZlswXSAqIChmbG9hdCl5MSAvIChmbG9hdCloZWlnaHQ7CisgICAgCisgICAgYVsyXSA9ICgoZmxvYXQpZlsyXSAtIGgxKSAvIChmbG9hdCkoeDIqaGVpZ2h0IC0geDEqeDEqaGVpZ2h0LyhmbG9hdCl3aWR0aCk7CisgICAgYVsxXSA9ICgoZmxvYXQpZlsxXSAtIGgyKSAvIChmbG9hdCkoeTIqd2lkdGggLSB5MSp5MSp3aWR0aC8oZmxvYXQpaGVpZ2h0KTsKKyAgICBhWzBdID0gKGZsb2F0KWZbMF0vKGZsb2F0KSh3aWR0aCpoZWlnaHQpIC0gKGZsb2F0KXkxKmFbMV0vKGZsb2F0KWhlaWdodCAtIAorICAgICAgICAoZmxvYXQpeDEqYVsyXS8oZmxvYXQpd2lkdGg7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSAKKyAgICB7ICAgIAorICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBjb3JyZWN0aW9uID0gYVswXSArIGFbMV0qKGZsb2F0KWkgKyBhWzJdKihmbG9hdClqOworICAgICAgICAgICAgCisgICAgICAgICAgICBmbG9hdF9pbWdbaSp3aWR0aCArIGpdID0gaW1nW2kqc3JjX3N0ZXAgKyBqXSAtIGNvcnJlY3Rpb247CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmIChmbG9hdF9pbWdbaSp3aWR0aCArIGpdIDwgbWluKSBtaW4gPSBmbG9hdF9pbWdbaSp3aWR0aCtqXTsKKyAgICAgICAgICAgIGlmIChmbG9hdF9pbWdbaSp3aWR0aCArIGpdID4gbWF4KSBtYXggPSBmbG9hdF9pbWdbaSp3aWR0aCtqXTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvL3Jlc2NhbGluZyB0byB0aGUgcmFuZ2UgMDoyNTUKKyAgICBjMiA9IDA7CisgICAgaWYgKG1heCA9PSBtaW4pCisgICAgICAgIGMyID0gMjU1LjBmOworICAgIGVsc2UKKyAgICAgICAgYzIgPSAyNTUuMGYvKGZsb2F0KShtYXggLSBtaW4pOworICAgIAorICAgIGMxID0gKC0oZmxvYXQpbWluKSpjMjsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspCisgICAgeworICAgICAgICBmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHZhbHVlID0gKGludClmbG9vcihjMipmbG9hdF9pbWdbaSp3aWR0aCArIGpdICsgYzEpOworICAgICAgICAgICAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAwOworICAgICAgICAgICAgaWYgKHZhbHVlID4gMjU1KSB2YWx1ZSA9IDI1NTsKKyAgICAgICAgICAgIGltZ1tpKnNyY19zdGVwICsgal0gPSAodWNoYXIpdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkZyZWUoICZmbG9hdF9pbWcgKTsKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKK0N2U3RhdHVzIGljdkxpZ2h0aW5nQ29ycmVjdGlvbiggaWN2SW1hZ2UqIGltZyApIAoreworICAgIEN2U2l6ZSByb2k7CisgICAgaWYgKCBpbWctPnR5cGUgIT0gSVBMX0RFUFRIXzhVIHx8IGltZy0+Y2hhbm5lbHMgIT0gMSApCisgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICByb2kgPSBfY3ZTaXplKCBpbWctPnJvaS53aWR0aCwgaW1nLT5yb2kuaGVpZ2h0ICk7CisgICAgCisgICAgcmV0dXJuIF9jdkxpZ2h0aW5nQ29ycmVjdGlvbjh1QzFSKCBpbWctPmRhdGEgKyBpbWctPnJvaS55ICogaW1nLT5zdGVwICsgaW1nLT5yb2kueCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9pLCBpbWctPnN0ZXAgKTsKKworfQorCisqLworCitDVl9JTVBMIEN2RUhNTSoKK2N2Q3JlYXRlMkRITU0oIGludCAqc3RhdGVfbnVtYmVyLCBpbnQgKm51bV9taXgsIGludCBvYnNfc2l6ZSApCit7CisgICAgQ3ZFSE1NKiBobW0gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZTJESE1NIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZDcmVhdGUyREhNTSggJmhtbSwgc3RhdGVfbnVtYmVyLCBudW1fbWl4LCBvYnNfc2l6ZSApKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gaG1tOworfQorCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZTJESE1NKCBDdkVITU0gKiogaG1tICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVsZWFzZTJESE1NIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZSZWxlYXNlMkRITU0oIGhtbSApKTsKKyAgICBfX0VORF9fOworfQorCitDVl9JTVBMIEN2SW1nT2JzSW5mbyoKK2N2Q3JlYXRlT2JzSW5mbyggQ3ZTaXplIG51bV9vYnMsIGludCBvYnNfc2l6ZSApCit7CisgICAgQ3ZJbWdPYnNJbmZvICpvYnNfaW5mbyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZU9ic0luZm8iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBJUFBJX0NBTEwoIGljdkNyZWF0ZU9ic0luZm8oICZvYnNfaW5mbywgbnVtX29icywgb2JzX3NpemUgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG9ic19pbmZvOworfQorCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZU9ic0luZm8oIEN2SW1nT2JzSW5mbyAqKiBvYnNfaW5mbyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VPYnNJbmZvIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZSZWxlYXNlT2JzSW5mbyggb2JzX2luZm8gKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZVbmlmb3JtSW1nU2VnbSggQ3ZJbWdPYnNJbmZvICogb2JzX2luZm8sIEN2RUhNTSAqIGhtbSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlVuaWZvcm1JbWdTZWdtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZVbmlmb3JtSW1nU2VnbSggb2JzX2luZm8sIGhtbSApKTsKKyAgICBfX0NMRUFOVVBfXzsKKyAgICBfX0VORF9fOworfQorCitDVl9JTVBMIHZvaWQKK2N2SW5pdE1peFNlZ20oIEN2SW1nT2JzSW5mbyAqKiBvYnNfaW5mb19hcnJheSwgaW50IG51bV9pbWcsIEN2RUhNTSAqIGhtbSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkluaXRNaXhTZWdtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZJbml0TWl4U2VnbSggb2JzX2luZm9fYXJyYXksIG51bV9pbWcsIGhtbSApKTsKKworICAgIF9fRU5EX187Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZFc3RpbWF0ZUhNTVN0YXRlUGFyYW1zKCBDdkltZ09ic0luZm8gKiogb2JzX2luZm9fYXJyYXksIGludCBudW1faW1nLCBDdkVITU0gKiBobW0gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZFc3RpbWF0ZUhNTVN0YXRlUGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZFc3RpbWF0ZUhNTVN0YXRlUGFyYW1zKCBvYnNfaW5mb19hcnJheSwgbnVtX2ltZywgaG1tICkpOworCisgICAgX19FTkRfXzsKK30KKworQ1ZfSU1QTCB2b2lkCitjdkVzdGltYXRlVHJhbnNQcm9iKCBDdkltZ09ic0luZm8gKiogb2JzX2luZm9fYXJyYXksIGludCBudW1faW1nLCBDdkVITU0gKiBobW0gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZFc3RpbWF0ZVRyYW5zUHJvYiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIElQUElfQ0FMTCggaWN2RXN0aW1hdGVUcmFuc1Byb2IoIG9ic19pbmZvX2FycmF5LCBudW1faW1nLCBobW0gKSk7CisKKyAgICBfX0VORF9fOworCit9CisKK0NWX0lNUEwgdm9pZAorY3ZFc3RpbWF0ZU9ic1Byb2IoIEN2SW1nT2JzSW5mbyAqIG9ic19pbmZvLCBDdkVITU0gKiBobW0gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZFc3RpbWF0ZU9ic1Byb2IiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBJUFBJX0NBTEwoIGljdkVzdGltYXRlT2JzUHJvYiggb2JzX2luZm8sIGhtbSApKTsKKworICAgIF9fRU5EX187Cit9CisKK0NWX0lNUEwgZmxvYXQKK2N2RVZpdGVyYmkoIEN2SW1nT2JzSW5mbyAqIG9ic19pbmZvLCBDdkVITU0gKiBobW0gKQoreworICAgIGZsb2F0IHJlc3VsdCA9IEZMVF9NQVg7CisKKyAgICBDVl9GVU5DTkFNRSggImN2RVZpdGVyYmkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggKG9ic19pbmZvID09IE5VTEwpIHx8IChobW0gPT0gTlVMTCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGF0YVB0ciwgIk51bGwgcG9pbnRlci4iICk7CisKKyAgICByZXN1bHQgPSBpY3ZFVml0ZXJiaSggb2JzX2luZm8sIGhtbSApOworICAgIAorICAgIF9fRU5EX187CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworQ1ZfSU1QTCB2b2lkCitjdk1peFNlZ21MMiggQ3ZJbWdPYnNJbmZvICoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NICogaG1tICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TWl4U2VnbUwyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZNaXhTZWdtTDIoIG9ic19pbmZvX2FycmF5LCBudW1faW1nLCBobW0gKSk7CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZobW0xZC5jcHAgYi9jdmF1eC9zcmMvY3ZobW0xZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwOGU2ZQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmhtbTFkLmNwcApAQCAtMCwwICsxLDExNTEgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2lmIDAKKworI2RlZmluZSBMTjJQSSAxLjgzNzg3N2YKKyNkZWZpbmUgQklHX0ZMVCAxLmUrMTBmCisKKworI2RlZmluZSBfQ1ZfRVJHT0RJQyAxCisjZGVmaW5lIF9DVl9DQVVTQUwgMgorCisjZGVmaW5lIF9DVl9MQVNUX1NUQVRFIDEKKyNkZWZpbmUgX0NWX0JFU1RfU1RBVEUgMiAgCisKKy8vKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkZvcndhcmQxREhNTQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIHBlcmZvcm1zIGJhdW0td2Vsc2ggYWxnb3JpdGhtICAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiBvYnNfaW5mbyAtIGFkZHJlcyBvZiBwb2ludGVyIHRvIEN2SW1nT2JzSW5mbyBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICAgIG51bV9ob3Jfb2JzIC0gbnVtYmVyIG9mIGhvcml6b250YWwgb2JzZXJ2YXRpb24gdmVjdG9ycworLy8gICAgICAgICAgICAgICAgbnVtX3Zlcl9vYnMgLSBudW1iZXIgb2YgaG9yaXpvbnRhbCBvYnNlcnZhdGlvbiB2ZWN0b3JzCisvLyAgICAgICAgICAgICAgICBvYnNfc2l6ZSAtIGxlbmd0aCBvZiBvYnNlcnZhdGlvbiB2ZWN0b3IKKy8vCisvLyAgICBSZXR1cm5zOiBlcnJvciBzdGF0dXMKKy8vCisvLyAgICBOb3RlczogICAKKy8vRiovIAorI2lmIDAgICAgICAKK0N2U3RhdHVzIGljdkZvcndhcmQxREhNTSggaW50IG51bV9zdGF0ZXMsIGludCBudW1fb2JzLCBDdk1hdHI2NGQgQSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cjY0ZCBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHNjYWxlcykgCit7CisgICAgLy8gYXNzdW1lIHRoYXQgb2JzZXJ2YXRpb24gYW5kIHRyYW5zaXRpb24gCisgICAgLy8gcHJvYmFiaWxpdGllcyBhbHJlYWR5IGNvbXB1dGVkCisgICAgaW50IG1fSE1NVHlwZSAgPSBfQ1ZfQ0FVU0FMOworICAgIGRvdWJsZSogbV9waSA9IGljdkFsbG9jKCBudW1fc3RhdGVzKiBzaXplb2YoIGRvdWJsZSkgKTsKKyAgICAKKyAgICAvKiBhbHBoYSBpcyBtYXRyaXggCisgICAgICAgcm93cyB0aHJvdWhnIHN0YXRlcworICAgICAgIGNvbHVtbnMgdGhyb3VnaCB0aW1lCisgICAgKi8KKyAgICBkb3VibGUqIGFscGhhID0gaWN2QWxsb2MoIG51bV9zdGF0ZXMqbnVtX29icyAqIHNpemVvZiggZG91YmxlICkgKTsKKworICAgIC8qIEFsbCBjYWxjdWxhdGlvbnMgd2lsbCBiZSBpbiBub24tbG9nYXJpdGhtaWMgZG9tYWluICovCisgICAgCisgICAgLyogSW5pdGlhbGl6YXRpb24gKi8KKyAgICAvKiBzZXQgaW5pdGlhbCBzdGF0ZSBwcm9iYWJpbGl0aWVzICovCisgICAgbV9waVswXSA9IDE7CisgICAgZm9yIChpID0gMTsgaSA8IG51bV9zdGF0ZXM7IGkrKykKKyAgICB7CisgICAgICAgIG1fcGlbaV0gPSAwLjA7CisgICAgfSAgICAgICAgCisgICAgCisgICAgZm9yICAoaSA9IDA7IGkgPCBudW1fc3RhdGVzOyBpKyspCisgICAgeworICAgICAgICBhbHBoYVtpXSA9IG1fcGlbaV0gKiBtX2JbIGldOyAgICAgICAgIAorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogICBJbmR1Y3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAKKyAgICBpZiAoIG1fSE1NVHlwZSA9PSBfQ1ZfRVJHT0RJQyApICAKKyAgICB7IAorICAgICAgICBpbnQgdDsKKyAgICAgICAgZm9yICh0ID0gMSA7IHQgPCBudW1fb2JzOyB0KyspCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc3RhdGVzOyBqKyspCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICBkb3VibGUgc3VtID0gMC4wOworICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc3RhdGVzOyBpKyspCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGFscGhhWyh0IC0gMSkgKiBudW1fc3RhdGVzICsgaV0gKiBBW2kgKiBudW1fc3RhdGVzICsgal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGFscGhhWyh0IC0gMSkgKiBudW1fc3RhdGVzICsgal0gPSBzdW0gKiBCW3QgKiBudW1fc3RhdGVzICsgal07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLyogYWRkIGNvbXB1dGVkIGFscGhhIHRvIHNjYWxlIGZhY3RvciAqLworICAgICAgICAgICAgICAgIHN1bV9hbHBoYSArPSBhbHBoYVsodCAtIDEpICogbnVtX3N0YXRlcyArIGpdOworICAgICAgICAgICAgfSAKKworICAgICAgICAgICAgZG91YmxlIHNjYWxlID0gMS9zdW1fYWxwaGE7CisKKyAgICAgICAgICAgIC8qIHNjYWxlIGFscGhhICovCisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbnVtX3N0YXRlczsgaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFscGhhWyh0IC0gMSkgKiBudW1fc3RhdGVzICsgal0gKj0gc2NhbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHNjYWxlc1t0XSA9IHNjYWxlOyAgICAgICAgICAKKyAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgCisgICAgfSAKKworI2VuZGlmCisKKworCisvLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDcmVhdGVPYnNJbmZvCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBmb3IgQ3ZJbWdPYnNJbmZvIHN0cnVjdHVyZSAKKy8vICAgICAgICAgICAgIGFuZCBpdHMgaW5uZXIgc3R1ZmYKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiBvYnNfaW5mbyAtIGFkZHJlcyBvZiBwb2ludGVyIHRvIEN2SW1nT2JzSW5mbyBzdHJ1Y3R1cmUKKy8vICAgICAgICAgICAgICAgIG51bV9ob3Jfb2JzIC0gbnVtYmVyIG9mIGhvcml6b250YWwgb2JzZXJ2YXRpb24gdmVjdG9ycworLy8gICAgICAgICAgICAgICAgbnVtX3Zlcl9vYnMgLSBudW1iZXIgb2YgaG9yaXpvbnRhbCBvYnNlcnZhdGlvbiB2ZWN0b3JzCisvLyAgICAgICAgICAgICAgICBvYnNfc2l6ZSAtIGxlbmd0aCBvZiBvYnNlcnZhdGlvbiB2ZWN0b3IKKy8vCisvLyAgICBSZXR1cm5zOiBlcnJvciBzdGF0dXMKKy8vCisvLyAgICBOb3RlczogICAKKy8vRiovICAgICAgCisvKkN2U3RhdHVzIGljdkNyZWF0ZU9ic0luZm8oIEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBudW1fb2JzLCBpbnQgb2JzX3NpemUgKQoreworICAgIGludCB0b3RhbCA9IG51bV9vYnMuaGVpZ2h0ICogbnVtX29icy53aWR0aDsKKyAKKyAgICBDdkltZ09ic0luZm8qIG9icyA9IChDdkltZ09ic0luZm8qKWljdkFsbG9jKCBzaXplb2YoIEN2SW1nT2JzSW5mbykgKTsKKyAgICAKKyAgICBvYnMtPm9ic194ID0gbnVtX29icy53aWR0aDsKKyAgICBvYnMtPm9ic195ID0gbnVtX29icy5oZWlnaHQ7CisKKyAgICBvYnMtPm9icyA9IChmbG9hdCopaWN2QWxsb2MoIHRvdGFsICogb2JzX3NpemUgKiBzaXplb2YoZmxvYXQpICk7CisKKyAgICBvYnMtPnN0YXRlID0gKGludCopaWN2QWxsb2MoIDIgKiB0b3RhbCAqIHNpemVvZihpbnQpICk7CisgICAgb2JzLT5taXggPSAoaW50KilpY3ZBbGxvYyggdG90YWwgKiBzaXplb2YoaW50KSApOyAgCisgICAgICAgIAorICAgIG9icy0+b2JzX3NpemUgPSBvYnNfc2l6ZTsKKyAgICAKKyAgICBvYnNfaW5mb1swXSA9IG9iczsKKyAKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSovCisKKy8qQ3ZTdGF0dXMgaWN2UmVsZWFzZU9ic0luZm8oIEN2SW1nT2JzSW5mbyoqIHBfb2JzX2luZm8gKQoreworICAgIEN2SW1nT2JzSW5mbyogb2JzX2luZm8gPSBwX29ic19pbmZvWzBdOworCisgICAgaWN2RnJlZSggJihvYnNfaW5mby0+b2JzKSApOworICAgIGljdkZyZWUoICYob2JzX2luZm8tPm1peCkgKTsKKyAgICBpY3ZGcmVlKCAmKG9ic19pbmZvLT5zdGF0ZSkgKTsKKyAgICBpY3ZGcmVlKCAmKG9ic19pbmZvKSApOworCisgICAgcF9vYnNfaW5mb1swXSA9IE5VTEw7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAqLworCisgICAgCisvLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZDcmVhdGUxREhNTQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIDEtZGltZW5zaW9uYWwgSE1NICAKKy8vICAgICAgICAgICAgIGFuZCBpdHMgaW5uZXIgc3R1ZmYKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiBobW0gLSBhZGRyZXMgb2YgcG9pbnRlciB0byBDdkVITU0gc3RydWN0dXJlCisvLyAgICAgICAgICAgICAgICBzdGF0ZV9udW1iZXIgLSBudW1iZXIgb2Ygc3RhdGVzIGluIEhNTQorLy8gICAgICAgICAgICAgICAgbnVtX21peCAtIG51bWJlciBvZiBnYXVzc2lhbiBtaXh0dXJlcyBpbiBITU0gc3RhdGVzIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgb2YgYXJyYXkgaXMgZGVmaW5lZCBieSBwcmV2aW91cyBwYXJhbWV0ZXIKKy8vICAgICAgICAgICAgICAgIG9ic19zaXplIC0gbGVuZ3RoIG9mIG9ic2VydmF0aW9uIHZlY3RvcnMKKy8vCisvLyAgICBSZXR1cm5zOiBlcnJvciBzdGF0dXMKKy8vICAgIE5vdGVzOiAKKy8vRiovICAgICAgICAgICAgICAgICAgIAorQ3ZTdGF0dXMgaWN2Q3JlYXRlMURITU0oIEN2RUhNTSoqIHRoaXNfaG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZV9udW1iZXIsIGludCogbnVtX21peCwgaW50IG9ic19zaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmVhbF9zdGF0ZXMgPSBzdGF0ZV9udW1iZXI7CisgICAgCisgICAgQ3ZFSE1NU3RhdGUqIGFsbF9zdGF0ZXM7CisgICAgQ3ZFSE1NKiBobW07CisgICAgaW50IHRvdGFsX21peCA9IDA7CisgICAgZmxvYXQqIHBvaW50ZXJzOworCisgICAgLyogYWxsb2NhdGUgbWVtb3J5IGZvciBobW0gKi8KKyAgICBobW0gPSAoQ3ZFSE1NKilpY3ZBbGxvYyggc2l6ZW9mKEN2RUhNTSkgKTsKKyAgICAKKyAgICAvKiBzZXQgbnVtYmVyIG9mIHN1cGVyc3RhdGVzICovCisgICAgaG1tLT5udW1fc3RhdGVzID0gc3RhdGVfbnVtYmVyOworICAgIGhtbS0+bGV2ZWwgPSAwOworICAgICAgICAKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBzdGF0ZXMgKi8KKyAgICBhbGxfc3RhdGVzID0gKEN2RUhNTVN0YXRlICopaWN2QWxsb2MoIHJlYWxfc3RhdGVzICogc2l6ZW9mKCBDdkVITU1TdGF0ZSApICk7CisKKyAgICAvKiBhc3NpZ24gbnVtYmVyIG9mIG1peHR1cmVzICovCisgICAgZm9yKCBpID0gMDsgaSA8IHJlYWxfc3RhdGVzOyBpKysgKQorICAgIHsKKyAgICAgICAgYWxsX3N0YXRlc1tpXS5udW1fbWl4ID0gbnVtX21peFtpXTsKKyAgICB9CisKKyAgICAvKiBjb21wdXRlIHNpemUgb2YgaW5uZXIgb2YgYWxsIHJlYWwgc3RhdGVzICovCisgICAgZm9yKCBpID0gMDsgaSA8IHJlYWxfc3RhdGVzOyBpKysgKQorICAgIHsKKyAgICAgICAgdG90YWxfbWl4ICs9IG51bV9taXhbaV07CisgICAgfSAKKyAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgZm9yIHN0YXRlcyBzdHVmZiAqLworICAgIHBvaW50ZXJzID0gKGZsb2F0KilpY3ZBbGxvYyggdG90YWxfbWl4ICogKDIvKmZvciBtdSBpbnZ2YXIgKi8gKiBvYnNfc2l6ZSArIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi8qZm9yIHdlaWdodCBhbmQgbG9nX3Zhcl92YWwqLyApICogc2l6ZW9mKCBmbG9hdCkgKTsKKyAgICAKKyAgICAvKiBvcmdhbml6ZSBtZW1vcnkgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgcmVhbF9zdGF0ZXM7IGkrKyApCisgICAgeworICAgICAgICBhbGxfc3RhdGVzW2ldLm11ICAgICAgPSBwb2ludGVyczsgcG9pbnRlcnMgKz0gbnVtX21peFtpXSAqIG9ic19zaXplOyAgCisgICAgICAgIGFsbF9zdGF0ZXNbaV0uaW52X3ZhciA9IHBvaW50ZXJzOyBwb2ludGVycyArPSBudW1fbWl4W2ldICogb2JzX3NpemU7CisKKyAgICAgICAgYWxsX3N0YXRlc1tpXS5sb2dfdmFyX3ZhbCA9IHBvaW50ZXJzOyBwb2ludGVycyArPSBudW1fbWl4W2ldOworICAgICAgICBhbGxfc3RhdGVzW2ldLndlaWdodCAgICAgID0gcG9pbnRlcnM7IHBvaW50ZXJzICs9IG51bV9taXhbaV07CisgICAgfSAgICAgICAgICAKKyAgICBobW0tPnUuc3RhdGUgPSBhbGxfc3RhdGVzOworICAgICAgICAKKyAgICBobW0tPnRyYW5zUCA9IGljdkNyZWF0ZU1hdHJpeF8zMmYoIGhtbS0+bnVtX3N0YXRlcywgaG1tLT5udW1fc3RhdGVzICk7CisgICAgaG1tLT5vYnNQcm9iID0gTlVMTDsKKyAgICAKKyAgICAvKiBpZiBhbGwgb2sgLSByZXR1cm4gcG9pbnRlciAqLworICAgICp0aGlzX2htbSA9IGhtbTsKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAKKworQ3ZTdGF0dXMgaWN2UmVsZWFzZTFESE1NKCBDdkVITU0qKiBwaG1tICkKK3sKKyAgICBDdkVITU0qIGhtbSA9IHBobW1bMF07IAorICAgIGljdkRlbGV0ZU1hdHJpeCggaG1tLT50cmFuc1AgKTsKKyAgICAKKyAgICBpZiAoaG1tLT5vYnNQcm9iICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQqIHRtcCA9ICgoaW50KikoaG1tLT5vYnNQcm9iKSkgLSAzOworICAgICAgICBpY3ZGcmVlKCAmKHRtcCkgICk7CisgICAgfQorCisgICAgaWN2RnJlZSggJihobW0tPnUuc3RhdGUtPm11KSApOworICAgIGljdkZyZWUoICYoaG1tLT51LnN0YXRlKSApOworCisgICAgcGhtbVswXSA9IE5VTEw7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAgICAgCisKKy8qY2FuIGJlIHVzZWQgaW4gQ0hNTSAmIERITU0gKi8KK0N2U3RhdHVzIGljdlVuaWZvcm0xRFNlZ20oIEN2MURPYnNJbmZvKiBvYnNfaW5mbywgQ3ZFSE1NKiBobW0gKSAKK3sKKyAgICAvKiBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGJhZCAqLworICAgIGludCAgaTsKKyAgICBDdkVITU1TdGF0ZSogZmlyc3Rfc3RhdGU7CisKKyAgICAvKiBjaGVjayBhcmd1bWVudHMgKi8KKyAgICBpZiAoICFvYnNfaW5mbyB8fCAhaG1tICkgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZmlyc3Rfc3RhdGUgPSBobW0tPnUuc3RhdGU7CisgICAgICAgICAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgb2JzX2luZm8tPm9ic194OyBpKyspCisgICAgeworICAgICAgICAvL2JhZCBsaW5lIChkaXZpc2lvbiApCisgICAgICAgIGludCBzdGF0ZSA9IChpICogaG1tLT5udW1fc3RhdGVzKS9vYnNfaW5mby0+b2JzX3g7CisgICAgICAgIG9ic19pbmZvLT5zdGF0ZVtpXSA9IHN0YXRlOworICAgIH0gICAgCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKyAgICAgICAgICAgCisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBJbml0TWl4U2VnbQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGltcGxlbWVudHMgdGhlIG1peHR1cmUgc2VnbWVudGF0aW9uIG9mIHRoZSBzdGF0ZXMgb2YgdGhlIGVtYmVkZGVkIEhNTQorLy8gICAgQ29udGV4dDogdXNlZCB3aXRoIHRoZSBWaXRlcmJpIHRyYWluaW5nIG9mIHRoZSBlbWJlZGRlZCBITU0KKy8vICAgICAgICAgICAgIEZ1bmN0aW9uIHVzZXMgSy1NZWFucyBhbGdvcml0aG0gZm9yIGNsdXN0ZXJpbmcKKy8vCisvLyAgICBQYXJhbWV0ZXJzOiAgb2JzX2luZm9fYXJyYXkgLSBhcnJheSBvZiBwb2ludGVycyB0byBpbWFnZSBvYnNlcnZhdGlvbnMKKy8vICAgICAgICAgICAgICAgICBudW1faW1nIC0gbGVuZ3RoIG9mIGFib3ZlIGFycmF5CisvLyAgICAgICAgICAgICAgICAgaG1tIC0gcG9pbnRlciB0byBITU0gc3RydWN0dXJlICAgCisvLyAgICAgCisvLyAgICBSZXR1cm5zOiBlcnJvciBzdGF0dXMKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworQ3ZTdGF0dXMgaWN2SW5pdDFETWl4U2VnbShDdjFET2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0pCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpbnQgIGssIGksIGo7IAorICAgIGludCogbnVtX3NhbXBsZXM7IC8qIG51bWJlciBvZiBvYnNlcnZhdGlvbnMgaW4gZXZlcnkgc3RhdGUgKi8KKyAgICBpbnQqIGNvdW50ZXI7ICAgICAvKiBhcnJheSBvZiBjb3VudGVycyBmb3IgZXZlcnkgc3RhdGUgKi8KKyAgICAKKyAgICBpbnQqKiAgYV9jbGFzczsgICAvKiBmb3IgZXZlcnkgc3RhdGUgLSBjaGFyYWN0ZXJpc3RpYyBhcnJheSAqLworICAgIAorICAgIEN2VmVjdDMyZioqIHNhbXBsZXM7IC8qIGZvciBldmVyeSBzdGF0ZSAtIHBvaW50ZXIgdG8gb2JzZXJ2YXRpb24gdmVjdG9ycyAqLworICAgIGludCoqKiAgc2FtcGxlc19taXg7ICAgLyogZm9yIGV2ZXJ5IHN0YXRlIC0gYXJyYXkgb2YgcG9pbnRlcnMgdG8gdmVjdG9ycyBtaXh0dXJlcyAqLyAgIAorICAgIAorICAgIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhID0gY3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0VQU3xDVl9URVJNQ1JJVF9JVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAsICAgIC8qIGl0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxZiApOyAvKiBlcHMgICovCisgICAgCisgICAgaW50IHRvdGFsID0gaG1tLT5udW1fc3RhdGVzOyAKKyAgICBDdkVITU1TdGF0ZSogZmlyc3Rfc3RhdGUgPSBobW0tPnUuc3RhdGU7IAorICAgIAorICAgIC8qIGZvciBldmVyeSBzdGF0ZSBpbnRlZ2VyIGlzIGFsbG9jYXRlZCAtIG51bWJlciBvZiB2ZWN0b3JzIGluIHN0YXRlICovCisgICAgbnVtX3NhbXBsZXMgPSAoaW50KilpY3ZBbGxvYyggdG90YWwgKiBzaXplb2YoaW50KSApOworICAgIAorICAgIC8qIGludGVnZXIgY291bnRlciBpcyBhbGxvY2F0ZWQgZm9yIGV2ZXJ5IHN0YXRlICovCisgICAgY291bnRlciA9IChpbnQqKWljdkFsbG9jKCB0b3RhbCAqIHNpemVvZihpbnQpICk7CisgICAgCisgICAgc2FtcGxlcyA9IChDdlZlY3QzMmYqKilpY3ZBbGxvYyggdG90YWwgKiBzaXplb2YoQ3ZWZWN0MzJmKikgKTsgCisgICAgc2FtcGxlc19taXggPSAoaW50KioqKWljdkFsbG9jKCB0b3RhbCAqIHNpemVvZihpbnQqKikgKTsgCisgICAgCisgICAgLyogY2xlYXIgKi8KKyAgICBtZW1zZXQoIG51bV9zYW1wbGVzLCAwICwgdG90YWwqc2l6ZW9mKGludCkgKTsKKyAgICBtZW1zZXQoIGNvdW50ZXIsIDAgLCB0b3RhbCpzaXplb2YoaW50KSApOworICAgIAorICAgIAorICAgIC8qIGZvciBldmVyeSBzdGF0ZSB0aGUgbnVtYmVyIG9mIHZlY3RvcnMgd2hpY2ggYmVsb25nIHRvIGl0IGlzIGNvbXB1dGVkIChzbXRoLiBsaWtlIGhpc3RvZ3JhbSkgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsKKyAgICAgICAgQ3ZJbWdPYnNJbmZvKiBvYnMgPSBvYnNfaW5mb19hcnJheVtrXTsKKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBvYnMtPm9ic194OyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdGF0ZSA9IG9icy0+c3RhdGVbIGkgXTsKKyAgICAgICAgICAgIG51bV9zYW1wbGVzW3N0YXRlXSArPSAxOworICAgICAgICB9CisgICAgfSAKKyAgICAKKyAgICAvKiBmb3IgZXZlcnkgc3RhdGUgaW50KiBpcyBhbGxvY2F0ZWQgKi8KKyAgICBhX2NsYXNzID0gKGludCoqKWljdkFsbG9jKCB0b3RhbCpzaXplb2YoaW50KikgKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIGFfY2xhc3NbaV0gPSAoaW50KilpY3ZBbGxvYyggbnVtX3NhbXBsZXNbaV0gKiBzaXplb2YoaW50KSApOworICAgICAgICBzYW1wbGVzW2ldID0gKEN2VmVjdDMyZiopaWN2QWxsb2MoIG51bV9zYW1wbGVzW2ldICogc2l6ZW9mKEN2VmVjdDMyZikgKTsKKyAgICAgICAgc2FtcGxlc19taXhbaV0gPSAoaW50KiopaWN2QWxsb2MoIG51bV9zYW1wbGVzW2ldICogc2l6ZW9mKGludCopICk7CisgICAgfQorICAgIAorICAgIC8qIGZvciBldmVyeSBzdGF0ZSB2ZWN0b3JzIHdoaWNoIGJlbG9uZyB0byBzdGF0ZSBhcmUgZ2F0aGVyZWQgKi8KKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsgIAorICAgICAgICBDdkltZ09ic0luZm8qIG9icyA9IG9ic19pbmZvX2FycmF5W2tdOworICAgICAgICBpbnQgbnVtX29icyA9IG9icy0+b2JzX3g7CisgICAgICAgIGZsb2F0KiB2ZWN0b3IgPSBvYnMtPm9iczsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX29iczsgaSsrLCB2ZWN0b3IrPW9icy0+b2JzX3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RhdGUgPSBvYnMtPnN0YXRlW2ldOworICAgICAgICAgICAgCisgICAgICAgICAgICBzYW1wbGVzW3N0YXRlXVtjb3VudGVyW3N0YXRlXV0gPSB2ZWN0b3I7CisgICAgICAgICAgICBzYW1wbGVzX21peFtzdGF0ZV1bY291bnRlcltzdGF0ZV1dID0gJihvYnMtPm1peFtpXSk7CisgICAgICAgICAgICBjb3VudGVyW3N0YXRlXSsrOyAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfSAKKyAgICAKKyAgICAvKiBjbGVhciBjb3VudGVycyAqLworICAgIG1lbXNldCggY291bnRlciwgMCwgdG90YWwqc2l6ZW9mKGludCkgKTsKKyAgICAKKyAgICAvKiBkbyB0aGUgYWN0dWFsIGNsdXN0ZXJpbmcgdXNpbmcgdGhlIEsgTWVhbnMgYWxnb3JpdGhtICovCisgICAgZm9yIChpID0gMDsgaSA8IHRvdGFsOyBpKyspCisgICAgeworICAgICAgICBpZiAoIGZpcnN0X3N0YXRlW2ldLm51bV9taXggPT0gMSkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgZm9yIChrID0gMDsgayA8IG51bV9zYW1wbGVzW2ldOyBrKyspCisgICAgICAgICAgICB7ICAKKyAgICAgICAgICAgICAgICAvKiBhbGwgdmVjdG9ycyBiZWxvbmcgdG8gb25lIG1peHR1cmUgKi8KKyAgICAgICAgICAgICAgICBhX2NsYXNzW2ldW2tdID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgIAorICAgICAgICBlbHNlIGlmKCBudW1fc2FtcGxlc1tpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNsdXN0ZXJpemUgdmVjdG9ycyAgKi8KKyAgICAgICAgICAgIGljdktNZWFucyggZmlyc3Rfc3RhdGVbaV0ubnVtX21peCwgc2FtcGxlc1tpXSwgbnVtX3NhbXBsZXNbaV0sIAorICAgICAgICAgICAgICAgIG9ic19pbmZvX2FycmF5WzBdLT5vYnNfc2l6ZSwgY3JpdGVyaWEsIGFfY2xhc3NbaV0gKTsKKyAgICAgICAgfSAKKyAgICB9CisgICAgCisgICAgLyogZm9yIGV2ZXJ5IHZlY3RvciBudW1iZXIgb2YgbWl4dHVyZSBpcyBhc3NpZ25lZCAqLworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBudW1fc2FtcGxlc1tpXTsgaisrKQorICAgICAgICB7CisgICAgICAgICAgICBzYW1wbGVzX21peFtpXVtqXVswXSA9IGFfY2xhc3NbaV1bal07CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIGljdkZyZWUoICYoYV9jbGFzc1tpXSkgKTsKKyAgICAgICAgaWN2RnJlZSggJihzYW1wbGVzW2ldKSApOworICAgICAgICBpY3ZGcmVlKCAmKHNhbXBsZXNfbWl4W2ldKSApOworICAgIH0KKworICAgIGljdkZyZWUoICZhX2NsYXNzICk7CisgICAgaWN2RnJlZSggJnNhbXBsZXMgKTsKKyAgICBpY3ZGcmVlKCAmc2FtcGxlc19taXggKTsKKyAgICBpY3ZGcmVlKCAmY291bnRlciApOworICAgIGljdkZyZWUoICZudW1fc2FtcGxlcyApOyAgCisKKyAgICAKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IENvbXB1dGVVbmlNb2RlR2F1c3MKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjb21wdXRlcyB0aGUgR2F1c3NpYW4gcGRmIGZvciBhIHNhbXBsZSB2ZWN0b3IgCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG9ic1ZlcSAtIHBvaW50ZXIgdG8gdGhlIHNhbXBsZSB2ZWN0b3IKKy8vICAgICAgICAgICAgICAgICBtdSAtIHBvaW50ZXIgdG8gdGhlIG1lYW4gdmVjdG9yIG9mIHRoZSBHYXVzc2lhbiBwZGYKKy8vICAgICAgICAgICAgICAgICB2YXIgLSBwb2ludGVyIHRvIHRoZSB2YXJpYW5jZSB2ZWN0b3Igb2YgdGhlIEdhdXNzaWFuIHBkZgorLy8gICAgICAgICAgICAgICAgIFZlY1NpemUgLSB0aGUgc2l6ZSBvZiBzYW1wbGUgdmVjdG9yCisvLyAgICAgICAgICAgICAgICAgCisvLyAgICBSZXR1cm5zOiB0aGUgcGRmIG9mIHRoZSBzYW1wbGUgdmVjdG9yIGdpdmVuIHRoZSBzcGVjaWZpZWQgR2F1c3NpYW4gCisvLworLy8gICAgTm90ZXM6IAorLy9GKi8KKy8qZmxvYXQgaWN2Q29tcHV0ZVVuaU1vZGVHYXVzcyhDdlZlY3QzMmYgdmVjdCwgQ3ZWZWN0MzJmIG11LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2VmVjdDMyZiBpbnZfdmFyLCBmbG9hdCBsb2dfdmFyX3ZhbCwgaW50IHZlY3Rfc2l6ZSkgICAgICAgICAgIAoreworICAgIGludCBuOyAKKyAgICBkb3VibGUgdG1wOworICAgIGRvdWJsZSBwcm9iOworCisgICAgcHJvYiA9IC1sb2dfdmFyX3ZhbDsKKworICAgIGZvciAobiA9IDA7IG4gPCB2ZWN0X3NpemU7IG4rKykKKyAgICB7CisgICAgICAgIHRtcCA9ICh2ZWN0W25dIC0gbXVbbl0pICogaW52X3ZhcltuXTsKKyAgICAgICAgcHJvYiA9IHByb2IgLSB0bXAgKiB0bXA7CisgICB9CisgICAvL3Byb2IgKj0gMC41ZjsKKyAgCisgICByZXR1cm4gKGZsb2F0KXByb2I7Cit9Ki8gICAgICAgICAgICAgICAgICAgICAgICAKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBDb21wdXRlR2F1c3NNaXh0dXJlCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIG1peHR1cmUgR2F1c3NpYW4gcGRmIG9mIGEgc2FtcGxlIHZlY3Rvci4gCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogIG9ic1ZlcSAtIHBvaW50ZXIgdG8gdGhlIHNhbXBsZSB2ZWN0b3IKKy8vICAgICAgICAgICAgICAgICBtdSAgLSB0d28tZGltZW5zaW9uYWwgcG9pbnRlciB0byB0aGUgbWVhbiB2ZWN0b3Igb2YgdGhlIEdhdXNzaWFuIHBkZjsKKy8vICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGltZW5zaW9uIGlzIGluZGV4ZWQgb3ZlciB0aGUgbnVtYmVyIG9mIG1peHR1cmVzIGFuZCAKKy8vICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2Vjb25kIGRpbWVuc2lvbiBpcyBpbmRleGVkIGFsb25nIHRoZSBzaXplIG9mIHRoZSBtZWFuIHZlY3RvcgorLy8gICAgICAgICAgICAgICAgIHZhciAtIHR3by1kaW1lbnNpb25hbCBwb2ludGVyIHRvIHRoZSB2YXJpYW5jZSB2ZWN0b3Igb2YgdGhlIEdhdXNzaWFuIHBkZjsKKy8vICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGltZW5zaW9uIGlzIGluZGV4ZWQgb3ZlciB0aGUgbnVtYmVyIG9mIG1peHR1cmVzIGFuZAorLy8gICAgICAgICAgICAgICAgICAgICAgIHRoZSBzZWNvbmQgZGltZW5zaW9uIGlzIGluZGV4ZWQgYWxvbmcgdGhlIHNpemUgb2YgdGhlIHZhcmlhbmNlIHZlY3RvcgorLy8gICAgICAgICAgICAgICAgIFZlY1NpemUgLSB0aGUgc2l6ZSBvZiBzYW1wbGUgdmVjdG9yCisvLyAgICAgICAgICAgICAgICAgd2VpZ2h0IC0gcG9pbnRlciB0byB0aGUgd2lnaHRzIG9mIHRoZSBHYXVzc2lhbiBtaXh0dXJlCisvLyAgICAgICAgICAgICAgICAgTnVtTWl4IC0gdGhlIG51bWJlciBvZiBHYXVzc2lhbiBtaXh0dXJlcworLy8gICAgICAgICAgICAgICAgIAorLy8gICAgUmV0dXJuczogdGhlIHBkZiBvZiB0aGUgc2FtcGxlIHZlY3RvciBnaXZlbiB0aGUgc3BlY2lmaWVkIEdhdXNzaWFuIG1peHR1cmUuICAKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworLyogQ2FsY3VsYXRlIHByb2JhYmlsaXR5IG9mIG9ic2VydmF0aW9uIGF0IHN0YXRlIGluIGxvZ2FyaXRobWljIHNjYWxlKi8KKy8qZmxvYXQgaWN2Q29tcHV0ZUdhdXNzTWl4dHVyZSggQ3ZWZWN0MzJmIHZlY3QsIGZsb2F0KiBtdSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBpbnZfdmFyLCBmbG9hdCogbG9nX3Zhcl92YWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmVjdF9zaXplLCBmbG9hdCogd2VpZ2h0LCBpbnQgbnVtX21peCApCit7ICAgICAgIAorICAgIGRvdWJsZSBwcm9iLCBsX3Byb2I7CisgICAgCisgICAgcHJvYiA9IDAuMGY7IAorCisgICAgaWYgKG51bV9taXggPT0gMSkKKyAgICB7CisgICAgICAgIHJldHVybiBpY3ZDb21wdXRlVW5pTW9kZUdhdXNzKCB2ZWN0LCBtdSwgaW52X3ZhciwgbG9nX3Zhcl92YWxbMF0sIHZlY3Rfc2l6ZSk7ICAgIAorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgbTsKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IG51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB3ZWlnaHRbbV0gPiAwLjApCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIGxfcHJvYiA9IGljdkNvbXB1dGVVbmlNb2RlR2F1c3ModmVjdCwgbXUgKyBtKnZlY3Rfc2l6ZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludl92YXIgKyBtICogdmVjdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dfdmFyX3ZhbFttXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rfc2l6ZSk7IAorCisgICAgICAgICAgICAgICAgcHJvYiA9IHByb2IgKyB3ZWlnaHRbbV0qZXhwKChkb3VibGUpbF9wcm9iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAKKyAgICAgICAgcHJvYiA9IGxvZyhwcm9iKTsgICAgCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIHJldHVybiAoZmxvYXQpcHJvYjsgICAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgCisqLworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IEVzdGltYXRlT2JzUHJvYgorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBwcm9iYWJpbGl0eSBvZiBldmVyeSBvYnNlcnZhdGlvbiBpbiBldmVyeSBzdGF0ZSAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgb2JzX2luZm8gLSBvYnNlcnZhdGlvbnMKKy8vICAgICAgICAgICAgICAgICBobW0gICAgICAtIGhtbQorLy8gICAgUmV0dXJuczogZXJyb3Igc3RhdHVzICAKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworQ3ZTdGF0dXMgaWN2RXN0aW1hdGUxRE9ic1Byb2IoQ3ZJbWdPYnNJbmZvKiBvYnNfaW5mbywgQ3ZFSE1NKiBobW0gKQoreworICAgIGludCBqOworICAgIGludCB0b3RhbF9zdGF0ZXMgPSAwOworCisgICAgLyogY2hlY2sgaWYgbWF0cml4IGV4aXN0IGFuZCBjaGVjayBjdXJyZW50IHNpemUKKyAgICAgICBpZiBub3Qgc3VmZmljaWVudCAtIHJlYWxsb2MgKi8KKyAgICBpbnQgc3RhdHVzID0gMDsgLyogMSAtIG5vdCBhbGxvY2F0ZWQsIDIgLSBhbGxvY2F0ZWQgYnV0IHNtYWxsIHNpemUsIAorICAgICAgICAgICAgICAgICAgICAgICAzIC0gc2l6ZSBpcyBlbm91Z2gsIGJ1dCBkaXN0cmlidXRpb24gaXMgYmFkLCAwIC0gYWxsIG9rICovCisKKyAgICAvKmZvciggaiA9IDA7IGogPCBobW0tPm51bV9zdGF0ZXM7IGorKyApCisgICAgeworICAgICAgIHRvdGFsX3N0YXRlcyArPSBobW0tPnUuZWhtbVtqXS5udW1fc3RhdGVzOworICAgIH0qLworICAgIHRvdGFsX3N0YXRlcyA9IGhtbS0+bnVtX3N0YXRlczsKKworICAgIGlmICggaG1tLT5vYnNQcm9iID09IE5VTEwgKSAKKyAgICB7CisgICAgICAgIC8qIGFsbG9jYXJlIG1lbW9yeSAqLworICAgICAgICBpbnQgbmVlZF9zaXplID0gKCBvYnNfaW5mby0+b2JzX3ggLyogKiBvYnNfaW5mby0+b2JzX3kqLyAqIHRvdGFsX3N0YXRlcyAqIHNpemVvZihmbG9hdCkgLyogKworICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNfaW5mby0+b2JzX3kgKiBobW0tPm51bV9zdGF0ZXMgKiBzaXplb2YoIEN2TWF0cjMyZikgKi8pOworCisgICAgICAgIGludCogYnVmZmVyID0gKGludCopaWN2QWxsb2MoIG5lZWRfc2l6ZSArIDMgKiBzaXplb2YoaW50KSApOworICAgICAgICBidWZmZXJbMF0gPSBuZWVkX3NpemU7CisgICAgICAgIGJ1ZmZlclsxXSA9IG9ic19pbmZvLT5vYnNfeTsKKyAgICAgICAgYnVmZmVyWzJdID0gb2JzX2luZm8tPm9ic194OworICAgICAgICBobW0tPm9ic1Byb2IgPSAoZmxvYXQqKikgKGJ1ZmZlciArIDMpOworICAgICAgICBzdGF0dXMgPSAzOworICAgICAgICAKKyAgICB9CisgICAgZWxzZQorICAgIHsgICAKKyAgICAgICAgLyogY2hlY2sgY3VycmVudCBzaXplICovCisgICAgICAgIGludCogdG90YWw9IChpbnQqKSgoKGludCopKGhtbS0+b2JzUHJvYikpIC0gMyk7CisgICAgICAgIGludCBuZWVkX3NpemUgPSAoIG9ic19pbmZvLT5vYnNfeCAvKiAqIG9ic19pbmZvLT5vYnNfeSovICogdG90YWxfc3RhdGVzICogc2l6ZW9mKGZsb2F0KSAvKiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNfaW5mby0+b2JzX3kgKiBobW0tPm51bV9zdGF0ZXMgKiBzaXplb2YoIEN2TWF0cjMyZihmbG9hdCopICApKi8gKTsKKworICAgICAgICBhc3NlcnQoIHNpemVvZihmbG9hdCopID09IHNpemVvZihpbnQpICk7CisKKyAgICAgICAgaWYgKCBuZWVkX3NpemUgPiAoKnRvdGFsKSApIAorICAgICAgICB7CisgICAgICAgICAgICBpbnQqIGJ1ZmZlciA9ICgoaW50KikoaG1tLT5vYnNQcm9iKSkgLSAzOworICAgICAgICAgICAgaWN2RnJlZSggJmJ1ZmZlcik7CisgICAgICAgICAgICBidWZmZXIgPSAoaW50KilpY3ZBbGxvYyggbmVlZF9zaXplICsgMyk7CisgICAgICAgICAgICBidWZmZXJbMF0gPSBuZWVkX3NpemU7CisgICAgICAgICAgICBidWZmZXJbMV0gPSBvYnNfaW5mby0+b2JzX3k7CisgICAgICAgICAgICBidWZmZXJbMl0gPSBvYnNfaW5mby0+b2JzX3g7CisKKyAgICAgICAgICAgIGhtbS0+b2JzUHJvYiA9IChmbG9hdCoqKShidWZmZXIgKyAzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3RhdHVzID0gMzsKKyAgICAgICAgfSAgICAgICAgICAKKyAgICB9CisgICAgaWYgKCFzdGF0dXMpCisgICAgeworICAgICAgICBpbnQqIG9ic3ggPSAoKGludCopKGhtbS0+b2JzUHJvYikpIC0gMTsKKyAgICAgICAgLy9pbnQqIG9ic3kgPSAoKGludCopKGhtbS0+b2JzUHJvYikpIC0gMjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgYXNzZXJ0KCAvKigqb2JzeSA+IDApICYmKi8gKCpvYnN4ID4gMCkgKTsKKworICAgICAgICAvKiBpcyBnb29kIGRpc3RyaWJ1dGlvbj8gKi8KKyAgICAgICAgaWYgKCAob2JzX2luZm8tPm9ic194ID4gKCpvYnN4KSApIC8qIHx8IChvYnNfaW5mby0+b2JzX3kgPiAoKm9ic3kpICkgKi8gKSAKKyAgICAgICAgICAgIHN0YXR1cyA9IDM7ICAgICAgICAKKyAgICB9CisgICAgCisgICAgYXNzZXJ0KCAoc3RhdHVzID09IDApIHx8IChzdGF0dXMgPT0gMykgKTsKKyAgICAvKiBpZiBiYWQgc3RhdHVzIC0gZG8gcmVhbGxvY2F0aW9uIGFjdGlvbnMgKi8KKyAgICBpZiAoIHN0YXR1cyApCisgICAgeworICAgICAgICBmbG9hdCoqIHRtcCA9IGhtbS0+b2JzUHJvYjsKKyAgICAgICAgLy9mbG9hdCogIHRtcGY7CisKKyAgICAgICAgLyogZGlzdHJpYnV0ZSBwb2ludGVycyBvZiBlaG1tLT5vYnNQcm9iICovCisvKiAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaG1tLT51LmVobW1baV0ub2JzUHJvYiA9IHRtcDsgCisgICAgICAgICAgICB0bXAgKz0gb2JzX2luZm8tPm9ic195OworICAgICAgICB9CisqLworICAgICAgICAvL3RtcGYgPSAoZmxvYXQqKXRtcDsKKworICAgICAgICAvKiBkaXN0cmlidXRlIHBvaW50ZXJzIG9mIGVobW0tPm9ic1Byb2Jbal0gKi8KKy8qICAgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZFSE1NKiBlaG1tID0gJiggaG1tLT51LmVobW1baV0gKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG9ic19pbmZvLT5vYnNfeTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlaG1tLT5vYnNQcm9iW2pdID0gdG1wZjsKKyAgICAgICAgICAgICAgICB0bXBmICs9IGVobW0tPm51bV9zdGF0ZXMgKiBvYnNfaW5mby0+b2JzX3g7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyovCisgICAgICAgIGhtbS0+b2JzUHJvYiA9IHRtcDsKKworICAgIH0vKiBlbmQgb2YgcG9pbnRlciBkaXN0cmlidXRpb24gKi8KKworI2lmIDEKKyAgICB7CisjZGVmaW5lIE1BWF9CVUZfU0laRSAgMTIwMAorICAgICAgICBmbG9hdCAgbG9jYWxfbG9nX21peF9wcm9iW01BWF9CVUZfU0laRV07CisgICAgICAgIGRvdWJsZSBsb2NhbF9taXhfcHJvYltNQVhfQlVGX1NJWkVdOworICAgICAgICBpbnQgICAgdmVjdF9zaXplID0gb2JzX2luZm8tPm9ic19zaXplOworICAgICAgICBDdlN0YXR1cyByZXMgPSBDVl9OT19FUlI7CisKKyAgICAgICAgZmxvYXQqICBsb2dfbWl4X3Byb2IgPSBsb2NhbF9sb2dfbWl4X3Byb2I7CisgICAgICAgIGRvdWJsZSogbWl4X3Byb2IgPSBsb2NhbF9taXhfcHJvYjsKKyAgICAgICAgCisgICAgICAgIGludCAgbWF4X3NpemUgPSAwOworICAgICAgICBpbnQgIG9ic194ID0gb2JzX2luZm8tPm9ic194OworCisgICAgICAgIC8qIGNhbGN1bGF0ZSB0ZW1wb3JhcnkgYnVmZmVyIHNpemUgKi8KKyAgICAgICAgLy9mb3IoIGkgPSAwOyBpIDwgaG1tLT5udW1fc3RhdGVzOyBpKysgKQorICAgICAgICAvL3sKKyAgICAgICAgLy8gICAgQ3ZFSE1NKiBlaG1tID0gJihobW0tPnUuZWhtbVtpXSk7CisgICAgICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGUgPSBobW0tPnUuc3RhdGU7CisKKyAgICAgICAgICAgIGludCBtYXhfbWl4ID0gMDsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBobW0tPm51bV9zdGF0ZXM7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQgPSBzdGF0ZVtqXS5udW1fbWl4OworICAgICAgICAgICAgICAgIGlmKCBtYXhfbWl4IDwgdCApIG1heF9taXggPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF4X21peCAqPSBobW0tPm51bV9zdGF0ZXM7CisgICAgICAgICAgICAvKmlmKCBtYXhfc2l6ZSA8IG1heF9taXggKSovIG1heF9zaXplID0gbWF4X21peDsKKyAgICAgICAgLy99CisKKyAgICAgICAgbWF4X3NpemUgKj0gb2JzX3ggKiB2ZWN0X3NpemU7CisgICAgICAgIAorICAgICAgICAvKiBhbGxvY2F0ZSBidWZmZXIgKi8KKyAgICAgICAgaWYoIG1heF9zaXplID4gTUFYX0JVRl9TSVpFICkKKyAgICAgICAgeworICAgICAgICAgICAgbG9nX21peF9wcm9iID0gKGZsb2F0KilpY3ZBbGxvYyggbWF4X3NpemUqKHNpemVvZihmbG9hdCkgKyBzaXplb2YoZG91YmxlKSkpOworICAgICAgICAgICAgaWYoICFsb2dfbWl4X3Byb2IgKSByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworICAgICAgICAgICAgbWl4X3Byb2IgPSAoZG91YmxlKikobG9nX21peF9wcm9iICsgbWF4X3NpemUpOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KCBsb2dfbWl4X3Byb2IsIDAsIG1heF9zaXplKnNpemVvZihmbG9hdCkpOworCisgICAgICAgIC8qKioqKioqKioqKioqKioqKmNvbXB1dGluZyBwcm9iYWJpbGl0aWVzKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIAorICAgICAgICAvKiBsb29wIHRocm91Z2ggZXh0ZXJuYWwgc3RhdGVzICovCisgICAgICAgIC8vZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAvLyAgICBDdkVITU0qIGVobW0gPSAmKGhtbS0+dS5laG1tW2ldKTsKKyAgICAgICAgICAgIEN2RUhNTVN0YXRlKiBzdGF0ZSA9IGhtbS0+dS5zdGF0ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG1heF9taXggPSAwOworICAgICAgICAgICAgaW50IG5fc3RhdGVzID0gaG1tLT5udW1fc3RhdGVzOworCisgICAgICAgICAgICAvKiBkZXRlcm1pbmUgbWF4aW1hbCBudW1iZXIgb2YgbWl4dHVyZXMgKGFnYWluKSAqLworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGhtbS0+bnVtX3N0YXRlczsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IHN0YXRlW2pdLm51bV9taXg7CisgICAgICAgICAgICAgICAgaWYoIG1heF9taXggPCB0ICkgbWF4X21peCA9IHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCByb3dzIG9mIHRoZSBvYnNlcnZhdGlvbiBtYXRyaXggKi8KKyAgICAgICAgICAgIC8vZm9yKCBqID0gMDsgaiA8IG9ic19pbmZvLT5vYnNfeTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgIG0sIG47CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZsb2F0KiBvYnMgPSBvYnNfaW5mby0+b2JzOy8qICsgaiAqIG9ic194ICogdmVjdF9zaXplOyAqLworICAgICAgICAgICAgICAgIGZsb2F0KiBsb2dfbXAgPSBtYXhfbWl4ID4gMSA/IGxvZ19taXhfcHJvYiA6IChmbG9hdCopKGhtbS0+b2JzUHJvYik7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtcCA9IG1peF9wcm9iOworCisgICAgICAgICAgICAgICAgLyogc2V2ZXJhbCBwYXNzZXMgYXJlIGRvbmUgYmVsb3cgKi8KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvKiAxLiBjYWxjdWxhdGUgbG9nYXJpdGhtcyBvZiBwcm9iYWJpbGl0aWVzIGZvciBlYWNoIG1peHR1cmUgKi8KKworICAgICAgICAgICAgICAgIC8qIGxvb3AgdGhyb3VnaCBtaXh0dXJlcyAqLworICAgIC8qICAhISEhICovICAgICBmb3IoIG0gPSAwOyBtIDwgbWF4X21peDsgbSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIHNldCBwb2ludGVyIHRvIGZpcnN0IG9ic2VydmF0aW9uIGluIHRoZSBsaW5lICovCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB2ZWN0ID0gb2JzOworCisgICAgICAgICAgICAgICAgICAgIC8qIGN5Y2xlcyB0aHJvdWdoIG9ic2VyYXZ0aW9ucyBpbiB0aGUgbGluZSAqLworICAgICAgICAgICAgICAgICAgICBmb3IoIG4gPSAwOyBuIDwgb2JzX3g7IG4rKywgdmVjdCArPSB2ZWN0X3NpemUsIGxvZ19tcCArPSBuX3N0YXRlcyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBrLCBsOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBsID0gMDsgbCA8IG5fc3RhdGVzOyBsKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzdGF0ZVtsXS5udW1fbWl4ID4gbSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbXUgPSBzdGF0ZVtsXS5tdSArIG0qdmVjdF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogaW52X3ZhciA9IHN0YXRlW2xdLmludl92YXIgKyBtKnZlY3Rfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHByb2IgPSAtc3RhdGVbbF0ubG9nX3Zhcl92YWxbbV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCB2ZWN0X3NpemU7IGsrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gKHZlY3Rba10gLSBtdVtrXSkqaW52X3ZhcltrXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2IgLT0gdCp0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ19tcFtsXSA9IE1BWCggKGZsb2F0KXByb2IsIC01MDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBza2lwIHRoZSByZXN0IGlmIHRoZXJlIGlzIGEgc2luZ2xlIG1peHR1cmUgKi8KKyAgICAgICAgICAgICAgICBpZiggbWF4X21peCAhPSAxICkgCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiAyLiBjYWxjdWxhdGUgZXhwb25lbnQgb2YgbG9nX21peF9wcm9iCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHByb2JhYmlsaXR5IGZvciBlYWNoIG1peHR1cmUpICovCisgICAgICAgICAgICAgICAgICAgIHJlcyA9IGljdmJFeHBfMzJmNjRmKCBsb2dfbWl4X3Byb2IsIG1peF9wcm9iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfbWl4ICogb2JzX3ggKiBuX3N0YXRlcyApOworICAgICAgICAgICAgICAgICAgICBpZiggcmVzIDwgMCApIGdvdG8gcHJvY2Vzc2luZ19leGl0OworCisgICAgICAgICAgICAgICAgICAgIC8qIDMuIHN1bSBhbGwgbWl4dHVyZXMgd2l0aCB3ZWlnaHRzICovCisgICAgICAgICAgICAgICAgICAgIC8qIDNhLiBmaXJzdCBtaXh0dXJlIC0gc2ltcGx5IHNjYWxlIGJ5IHdlaWdodCAqLworICAgICAgICAgICAgICAgICAgICBmb3IoIG4gPSAwOyBuIDwgb2JzX3g7IG4rKywgbXAgKz0gbl9zdGF0ZXMgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBuX3N0YXRlczsgbCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcFtsXSAqPSBzdGF0ZVtsXS53ZWlnaHRbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiAzYi4gYWRkIG90aGVyIG1peHR1cmVzICovCisgICAgICAgICAgICAgICAgICAgIGZvciggbSA9IDE7IG0gPCBtYXhfbWl4OyBtKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZzID0gLW0qb2JzX3gqbl9zdGF0ZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIG4gPSAwOyBuIDwgb2JzX3g7IG4rKywgbXAgKz0gbl9zdGF0ZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciggbCA9IDA7IGwgPCBuX3N0YXRlczsgbCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtIDwgc3RhdGVbbF0ubnVtX21peCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wW2wgKyBvZnNdICs9IG1wW2xdICogc3RhdGVbbF0ud2VpZ2h0W21dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogNC4gUHV0IGxvZ2FyaXRobXMgb2Ygc3VtbWFyeSBwcm9iYWJpbGl0aWVzIHRvIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICAgICAgcmVzID0gaWN2YkxvZ182NGYzMmYoIG1peF9wcm9iLCAoZmxvYXQqKShobW0tPm9ic1Byb2IpLC8vW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNfeCAqIG5fc3RhdGVzICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZXMgPCAwICkgZ290byBwcm9jZXNzaW5nX2V4aXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKK3Byb2Nlc3NpbmdfZXhpdDoKKworICAgICAgICBpZiggbG9nX21peF9wcm9iICE9IGxvY2FsX2xvZ19taXhfcHJvYiApIGljdkZyZWUoICZsb2dfbWl4X3Byb2IgKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyN1bmRlZiBNQVhfQlVGX1NJWkUKKyAgICB9CisjZWxzZQorLyogICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2RUhNTSogZWhtbSA9ICYoaG1tLT51LmVobW1baV0pOworICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGUgPSBlaG1tLT51LnN0YXRlOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBvYnNfaW5mby0+b2JzX3k7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrLG07CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IG9ic19pbmRleCA9IGogKiBvYnNfaW5mby0+b2JzX3g7CisKKyAgICAgICAgICAgIGZsb2F0KiBCID0gZWhtbS0+b2JzUHJvYltqXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gY3ljbGVzIHRocm91Z2ggb2JzIGFuZCBzdGF0ZXMKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBvYnNfaW5mby0+b2JzX3g7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZWZWN0MzJmIHZlY3QgPSAob2JzX2luZm8tPm9icykgKyAob2JzX2luZGV4ICsgaykgKiB2ZWN0X3NpemU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmxvYXQqIG1hdHJfbGluZSA9IEIgKyBrICogZWhtbS0+bnVtX3N0YXRlczsKKworICAgICAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBlaG1tLT5udW1fc3RhdGVzOyBtKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0cl9saW5lW21dID0gaWN2Q29tcHV0ZUdhdXNzTWl4dHVyZSggdmVjdCwgc3RhdGVbbV0ubXUsIHN0YXRlW21dLmludl92YXIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW21dLmxvZ192YXJfdmFsLCB2ZWN0X3NpemUsIHN0YXRlW21dLndlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVttXS5udW1fbWl4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorKi8KKyNlbmRpZgorfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogRXN0aW1hdGVUcmFuc1Byb2IKKy8vICAgIFB1cnBvc2U6IFRoZSBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdGF0ZSBhbmQgc3VwZXIgc3RhdGUgdHJhbnNpdGlvbiBwcm9iYWJpbGl0aWVzCisvLyAgICAgICAgICAgICBvZiB0aGUgbW9kZWwgZ2l2ZW4gdGhlIGltYWdlcywKKy8vICAgICAgICAgICAgIHRoZSBzdGF0ZSBzZWdtZW50YXRpb24gYW5kIHRoZSBpbnB1dCBwYXJhbWV0ZXJzCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczogb2JzX2luZm9fYXJyYXkgLSBhcnJheSBvZiBwb2ludGVycyB0byBpbWFnZSBvYnNlcnZhdGlvbnMKKy8vICAgICAgICAgICAgICAgIG51bV9pbWcgLSBsZW5ndGggb2YgYWJvdmUgYXJyYXkKKy8vICAgICAgICAgICAgICAgIGhtbSAtIHBvaW50ZXIgdG8gSE1NIHN0cnVjdHVyZQorLy8gICAgUmV0dXJuczogdm9pZAorLy8KKy8vICAgIE5vdGVzOgorLy9GKi8KK0N2U3RhdHVzIGljdkVzdGltYXRlMURUcmFuc1Byb2IoIEN2MURPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX3NlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RUhNTSogaG1tICkKK3sKKyAgICBpbnQgICAgaSwgaiwgazsKKworICAgIC8qIGFzIGEgY291bnRlciB3ZSB3aWxsIHVzZSB0cmFuc1AgbWF0cml4ICovCisKKyAgICAvKiBpbml0aWFsaXphdGlvbiAqLworCisgICAgLyogY2xlYXIgdHJhbnNQICovCisgICAgaWN2U2V0WmVyb18zMmYoIGhtbS0+dHJhbnNQLCBobW0tPm51bV9zdGF0ZXMsIGhtbS0+bnVtX3N0YXRlcyApOworCisKKyAgICAvKiBjb21wdXRlIHRoZSBjb3VudGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBudW1fc2VxOyBpKyspCisgICAgeworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIEN2MURPYnNJbmZvKiBpbmZvID0gb2JzX2luZm9fYXJyYXlbaV07CisKKyAgICAgICAgZm9yIChrID0gMDsgayA8IGluZm8tPm9ic194OyBrKyssIGNvdW50ZXIrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogY29tcHV0ZSBob3cgbWFueSB0cmFuc2l0aW9ucyBmcm9tIHN0YXRlIHRvIHN0YXRlCisgICAgICAgICAgICAgICBvY2N1cmVkICovIAorICAgICAgICAgICAgaW50IHN0YXRlOworICAgICAgICAgICAgaW50IG5leHRzdGF0ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgc3RhdGUgPSBpbmZvLT5zdGF0ZVtjb3VudGVyXTsKKworICAgICAgICAgICAgaWYgKGsgPCBpbmZvLT5vYnNfeCAtIDEpCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgaW50IHRyYW5zUF9zaXplID0gaG1tLT5udW1fc3RhdGVzOworCisgICAgICAgICAgICAgICAgbmV4dHN0YXRlID0gaW5mby0+c3RhdGVbY291bnRlcisxXTsKKyAgICAgICAgICAgICAgICBobW0tPnRyYW5zUFsgc3RhdGUgKiB0cmFuc1Bfc2l6ZSArIG5leHRzdGF0ZV0gKz0gMTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGVzdGltYXRlIHN1cGVyc3RhdGUgbWF0cml4ICovCisgICAgZm9yKCBpID0gMDsgaSA8IGhtbS0+bnVtX3N0YXRlczsgaSsrKQorICAgIHsKKyAgICAgICAgZmxvYXQgdG90YWwgPSAwOworICAgICAgICBmbG9hdCBpbnZfdG90YWw7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBobW0tPm51bV9zdGF0ZXM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWwgKz0gaG1tLT50cmFuc1BbaSAqIGhtbS0+bnVtX3N0YXRlcyArIGpdOworICAgICAgICB9CisgICAgICAgIC8vYXNzZXJ0KCB0b3RhbCApOworCisgICAgICAgIGludl90b3RhbCA9IHRvdGFsID8gMS5mL3RvdGFsIDogMDsKKyAgICAgICAgCisgICAgICAgIGZvciggaiA9IDA7IGogPCBobW0tPm51bV9zdGF0ZXM7IGorKykKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGhtbS0+dHJhbnNQW2kgKiBobW0tPm51bV9zdGF0ZXMgKyBqXSA9IAorICAgICAgICAgICAgICAgIGhtbS0+dHJhbnNQW2kgKiBobW0tPm51bV9zdGF0ZXMgKyBqXSA/IAorICAgICAgICAgICAgICAgIChmbG9hdClsb2coIGhtbS0+dHJhbnNQW2kgKiBobW0tPm51bV9zdGF0ZXMgKyBqXSAqIGludl90b3RhbCApIDogLUJJR19GTFQ7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30gCisgICAgICAgICAgICAgICAgICAgICAgCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogTWl4U2VnbUwyCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgbWl4dHVyZSBzZWdtZW50YXRpb24gb2YgdGhlIHN0YXRlcyBvZiB0aGUgZW1iZWRkZWQgSE1NCisvLyAgICBDb250ZXh0OiB1c2VkIHdpdGggdGhlIFZpdGVyYmkgdHJhaW5pbmcgb2YgdGhlIGVtYmVkZGVkIEhNTQorLy8KKy8vICAgIFBhcmFtZXRlcnM6ICAKKy8vICAgICAgICAgICAgIG9ic19pbmZvX2FycmF5CisvLyAgICAgICAgICAgICBudW1faW1nCisvLyAgICAgICAgICAgICBobW0KKy8vICAgIFJldHVybnM6IHZvaWQKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworQ3ZTdGF0dXMgaWN2MURNaXhTZWdtTDIoQ3ZJbWdPYnNJbmZvKiogb2JzX2luZm9fYXJyYXksIGludCBudW1faW1nLCBDdkVITU0qIGhtbSApCit7CisgICAgaW50ICAgICBrLCBpLCBtOworICAgICAgIAorICAgIEN2RUhNTVN0YXRlKiBzdGF0ZSA9IGhtbS0+dS5zdGF0ZTsKKyAgICAKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsgICAKKyAgICAgICAgLy9pbnQgY291bnRlciA9IDA7CisgICAgICAgIEN2SW1nT2JzSW5mbyogaW5mbyA9IG9ic19pbmZvX2FycmF5W2tdOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpbmZvLT5vYnNfeDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZV9zdGF0ZSA9IGluZm8tPnN0YXRlW2ldOworICAgICAgICAgICAgZmxvYXQgbWluX2Rpc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIG1pbl9kaXN0ID0gaWN2U3F1YXJlRGlzdGFuY2UoKGluZm8tPm9icykgKyAoaSAqIGluZm8tPm9ic19zaXplKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlW2Vfc3RhdGVdLm11LCBpbmZvLT5vYnNfc2l6ZSk7CisgICAgICAgICAgICBpbmZvLT5taXhbaV0gPSAwOyAgCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IgKG0gPSAxOyBtIDwgc3RhdGVbZV9zdGF0ZV0ubnVtX21peDsgbSsrKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZmxvYXQgZGlzdD1pY3ZTcXVhcmVEaXN0YW5jZSggKGluZm8tPm9icykgKyAoaSAqIGluZm8tPm9ic19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVbZV9zdGF0ZV0ubXUgKyBtICogaW5mby0+b2JzX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPm9ic19zaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzdCA8IG1pbl9kaXN0KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgICAgICAgICAvKiBhc3NpZ24gbWl4dHVyZSB3aXRoIHNtYWxsZXN0IGRpc3RhbmNlICovIAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5taXhbaV0gPSBtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIE5hbWU6IGljdkVWaXRlcmJpCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZW1iZWRkZWQgVml0ZXJiaSBhbGdvcml0aG0KKy8vICAgICAgICAgICAgIGZvciAxIGltYWdlIAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICAKKy8vICAgICAgICAgICAgIG9ic19pbmZvIC0gb2JzZXJ2YXRpb25zCisvLyAgICAgICAgICAgICBobW0gICAgICAtIEhNTQorLy8gICAgICAgICAgICAgICAgCisvLyAgICBSZXR1cm5zOiB0aGUgRW1iZWRkZWQgVml0ZXJiaSBwcm9iYWJpbGl0eSAoZmxvYXQpIAorLy8gICAgICAgICAgICAgYW5kIGRvIHN0YXRlIHNlZ21lbnRhdGlvbiBvZiBvYnNlcnZhdGlvbnMKKy8vCisvLyAgICBOb3RlczogCisvL0YqLworZmxvYXQgaWN2Vml0ZXJiaShDdjFET2JzSW5mbyogb2JzX2luZm8sIEN2RUhNTSogaG1tKQoreworICAgIGludCAgICBpLCBjb3VudGVyOworICAgIGZsb2F0ICBsb2dfbGlrZWxpaG9vZDsKKworICAgIC8vQ3ZFSE1NU3RhdGUqIGZpcnN0X3N0YXRlID0gaG1tLT51LnN0YXRlOworICAgIAorICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uIGZvciBzdXBlckIgKi8KKyAgICAvKkN2TWF0cjMyZiBzdXBlckIgPSBwaWN2Q3JlYXRlTWF0cml4XzMyZihobW0tPm51bV9zdGF0ZXMsIG9ic19pbmZvLT5vYnNfeCApOyovCisgICAgCisgICAgLyogbWVtb3J5IGFsbG9jYXRpb24gZm9yIHEgKi8KKyAgICBpbnQqIHN1cGVyX3EgPSAoaW50KilpY3ZBbGxvYyggb2JzX2luZm8tPm9ic194ICogc2l6ZW9mKGludCkgKTsKKyAgICAKKyAgICAvKiBwZXJmb3JtIFZpdGVyYmkgc2VnbWVudGF0aW9uIChwcm9jZXNzIDFEIEhNTSkgKi8KKyAgICBpY3ZWaXRlcmJpU2VnbWVudGF0aW9uKCBobW0tPm51bV9zdGF0ZXMsIG9ic19pbmZvLT5vYnNfeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG1tLT50cmFuc1AsIChmbG9hdCopKGhtbS0+b2JzUHJvYiksIDAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DVl9MQVNUX1NUQVRFLCAmc3VwZXJfcSwgb2JzX2luZm8tPm9ic194LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNfaW5mby0+b2JzX3gsICZsb2dfbGlrZWxpaG9vZCApOworICAgIAorICAgIGxvZ19saWtlbGlob29kIC89IG9ic19pbmZvLT5vYnNfeCA7ICAgCisKKyAgICBjb3VudGVyID0gMDsKKyAgICAvKiBhc3NpZ24gbmV3IHN0YXRlIHRvIG9ic2VydmF0aW9uIHZlY3RvcnMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgb2JzX2luZm8tPm9ic194OyBpKyspCisgICAgeyAgIAorICAgICAgICAgaW50IHN0YXRlID0gc3VwZXJfcVtpXTsKKyAgICAgICAgIG9ic19pbmZvLT5zdGF0ZVtpXSA9IHN0YXRlOworICAgIH0KKyAgICAKKyAgICAvKiBtZW1vcnkgZGVhbGxvY2F0aW9uIGZvciBzdXBlckIgKi8KKyAgICAvKnBpY3ZEZWxldGVNYXRyaXgoIHN1cGVyQiApOyovCisgICAgaWN2RnJlZSggJnN1cGVyX3EgKTsKKyAgICAKKyAgICByZXR1cm4gbG9nX2xpa2VsaWhvb2Q7Cit9ICAKKworQ3ZTdGF0dXMgaWN2RXN0aW1hdGUxREhNTVN0YXRlUGFyYW1zKEN2SW1nT2JzSW5mbyoqIG9ic19pbmZvX2FycmF5LCBpbnQgbnVtX2ltZywgQ3ZFSE1NKiBobW0pCisKK3sKKyAgICAvKiBjb21wdXRlIGdhbW1hLCB3ZWlnaHRzLCBtZWFucywgdmFycyAqLworICAgIGludCBrLCBpLCBqLCBtOworICAgIGludCBjb3VudGVyID0gMDsKKyAgICBpbnQgdG90YWwgPSAwOworICAgIGludCB2ZWN0X2xlbiA9IG9ic19pbmZvX2FycmF5WzBdLT5vYnNfc2l6ZTsKKworICAgIGZsb2F0IHN0YXJ0X2xvZ192YXJfdmFsID0gTE4yUEkgKiB2ZWN0X2xlbjsKKworICAgIEN2VmVjdDMyZiB0bXBfdmVjdCA9IGljdkNyZWF0ZVZlY3Rvcl8zMmYoIHZlY3RfbGVuICk7CisgICAgCisgICAgQ3ZFSE1NU3RhdGUqIGZpcnN0X3N0YXRlID0gaG1tLT51LnN0YXRlOworCisgICAgYXNzZXJ0KCBzaXplb2YoZmxvYXQpID09IHNpemVvZihpbnQpICk7CisKKyAgICB0b3RhbCs9IGhtbS0+bnVtX3N0YXRlczsKKyAgICAKKyAgICAvKioqKioqKioqKioqKioqR2FtbWEqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBpbml0aWFsaXplIGdhbW1hICovCisgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IGZpcnN0X3N0YXRlW2ldLm51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgKChpbnQqKShmaXJzdF9zdGF0ZVtpXS53ZWlnaHQpKVttXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogbWF5YmUgZ2FtbWEgbXVzdCBiZSBjb21wdXRlZCBpbiBtaXhzZWdtIHByb2Nlc3MgPz8gKi8KKworICAgIC8qIGNvbXB1dGUgZ2FtbWEgKi8KKyAgICBjb3VudGVyID0gMDsKKyAgICBmb3IgKGsgPSAwOyBrIDwgbnVtX2ltZzsgaysrKQorICAgIHsKKyAgICAgICAgQ3ZJbWdPYnNJbmZvKiBpbmZvID0gb2JzX2luZm9fYXJyYXlba107CisgICAgICAgIGludCBudW1fb2JzID0gaW5mby0+b2JzX3kgKiBpbmZvLT5vYnNfeDsKKyAgICAgICAgCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBudW1fb2JzOyBpKyspCisgICAgICAgIHsgICAKKyAgICAgICAgICAgIGludCBzdGF0ZSwgbWl4dHVyZTsKKyAgICAgICAgICAgIHN0YXRlID0gaW5mby0+c3RhdGVbaV07CisgICAgICAgICAgICBtaXh0dXJlID0gaW5mby0+bWl4W2ldOworICAgICAgICAgICAgLyogY29tcHV0ZXMgZ2FtbWEgLSBudW1iZXIgb2Ygb2JzZXJ2YXRpb25zIGNvcnJlc3BvbmRpbmcgCisgICAgICAgICAgICAgICB0byBldmVyeSBtaXh0dXJlIG9mIGV2ZXJ5IHN0YXRlICovIAorICAgICAgICAgICAgKChpbnQqKShmaXJzdF9zdGF0ZVtzdGF0ZV0ud2VpZ2h0KSlbbWl4dHVyZV0gKz0gMTsgICAgICAgICAgICAgIAorICAgICAgICB9CisgICAgfSAgICAgCisgICAgLyoqKioqKioqKioqKioqKk1lYW4gYW5kIFZhcioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIGNvbXB1dGUgbWVhbnMgYW5kIHZhcmlhbmNlcyBvZiBldmVyeSBpdGVtICovCisgICAgLyogaW5pdGlhbGx5IHZhcmlhbmNlIHBsYWNlZCB0byBpbnZfdmFyICovCisgICAgLyogemVybyBtZWFuIGFuZCB2YXJpYW5jZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQorICAgIHsKKyAgICAgICAgbWVtc2V0KCAodm9pZCopZmlyc3Rfc3RhdGVbaV0ubXUsIDAsIGZpcnN0X3N0YXRlW2ldLm51bV9taXggKiB2ZWN0X2xlbiAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKTsKKyAgICAgICAgbWVtc2V0KCAodm9pZCopZmlyc3Rfc3RhdGVbaV0uaW52X3ZhciwgMCwgZmlyc3Rfc3RhdGVbaV0ubnVtX21peCAqIHZlY3RfbGVuICogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsb2F0KSApOworICAgIH0KKyAgICAKKyAgICAvKiBjb21wdXRlIHN1bXMgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2ltZzsgaSsrKQorICAgIHsKKyAgICAgICAgQ3ZJbWdPYnNJbmZvKiBpbmZvID0gb2JzX2luZm9fYXJyYXlbaV07CisgICAgICAgIGludCB0b3RhbF9vYnMgPSBpbmZvLT5vYnNfeDsvLyAqIGluZm8tPm9ic195OworCisgICAgICAgIGZsb2F0KiB2ZWN0b3IgPSBpbmZvLT5vYnM7CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IHRvdGFsX29iczsgaisrLCB2ZWN0b3IrPXZlY3RfbGVuICkKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgaW50IHN0YXRlID0gaW5mby0+c3RhdGVbal07CisgICAgICAgICAgICBpbnQgbWl4dHVyZSA9IGluZm8tPm1peFtqXTsgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIEN2VmVjdDMyZiBtZWFuICA9IGZpcnN0X3N0YXRlW3N0YXRlXS5tdSArIG1peHR1cmUgKiB2ZWN0X2xlbjsKKyAgICAgICAgICAgIEN2VmVjdDMyZiBtZWFuMiA9IGZpcnN0X3N0YXRlW3N0YXRlXS5pbnZfdmFyICsgbWl4dHVyZSAqIHZlY3RfbGVuOworICAgICAgICAgICAgCisgICAgICAgICAgICBpY3ZBZGRWZWN0b3JfMzJmKCBtZWFuLCB2ZWN0b3IsIG1lYW4sIHZlY3RfbGVuICk7CisgICAgICAgICAgICBpY3ZBZGRTcXVhcmVfMzJmX0MxSVIoIHZlY3RvciwgdmVjdF9sZW4gKiBzaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbjIsIHZlY3RfbGVuICogc2l6ZW9mKGZsb2F0KSwgY3ZTaXplKHZlY3RfbGVuLCAxKSApOyAKKyAgICAgICAgfSAgIAorICAgIH0KKyAgICAKKyAgICAvKmNvbXB1dGUgdGhlIG1lYW5zIGFuZCB2YXJpYW5jZXMgKi8KKyAgICAvKiBhc3N1bWUgZ2FtbWEgYWxyZWFkeSBjb21wdXRlZCAqLworICAgIGNvdW50ZXIgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCB0b3RhbDsgaSsrKQorICAgIHsgICAgICAgICAgIAorICAgICAgICBDdkVITU1TdGF0ZSogc3RhdGUgPSAmKGZpcnN0X3N0YXRlW2ldKTsKKworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgc3RhdGUtPm51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGs7CisgICAgICAgICAgICBDdlZlY3QzMmYgbXUgID0gc3RhdGUtPm11ICsgbSAqIHZlY3RfbGVuOworICAgICAgICAgICAgQ3ZWZWN0MzJmIGludmFyID0gc3RhdGUtPmludl92YXIgKyBtICogdmVjdF9sZW47ICAgICAgICAgICAgIAorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoICgoaW50KilzdGF0ZS0+d2VpZ2h0KVttXSA+IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgaW52X2dhbW1hID0gMS5mLygoaW50Kikoc3RhdGUtPndlaWdodCkpW21dOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWN2U2NhbGVWZWN0b3JfMzJmKCBtdSwgbXUsIHZlY3RfbGVuLCBpbnZfZ2FtbWEpOworICAgICAgICAgICAgICAgIGljdlNjYWxlVmVjdG9yXzMyZiggaW52YXIsIGludmFyLCB2ZWN0X2xlbiwgaW52X2dhbW1hKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWN2TXVsVmVjdG9yc18zMmYobXUsIG11LCB0bXBfdmVjdCwgdmVjdF9sZW4pOworICAgICAgICAgICAgaWN2U3ViVmVjdG9yXzMyZiggaW52YXIsIHRtcF92ZWN0LCBpbnZhciwgdmVjdF9sZW4pOyAgICAgCisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8qIGxvdyBib3VuZCBvZiB2YXJpYW5jZSAtIDAuMDEgKEFyYSdzIGV4cGVyaW1lbnRhbCByZXN1bHQpICovCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgdmVjdF9sZW47IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW52YXJba10gPSAoaW52YXJba10gPiAwLjAxZikgPyBpbnZhcltrXSA6IDAuMDFmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjb21wdXRlIGxvZ192YXIgKi8KKyAgICAgICAgICAgIHN0YXRlLT5sb2dfdmFyX3ZhbFttXSA9IHN0YXJ0X2xvZ192YXJfdmFsOworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHZlY3RfbGVuOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0YXRlLT5sb2dfdmFyX3ZhbFttXSArPSAoZmxvYXQpbG9nKCBpbnZhcltrXSApOworICAgICAgICAgICAgfSAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgc3RhdGUtPmxvZ192YXJfdmFsW21dICo9IDAuNTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLyogY29tcHV0ZSBpbnZfdmFyID0gMS9zcXJ0KDIqdmFyaWFuY2UpICovCisgICAgICAgICAgICBpY3ZTY2FsZVZlY3Rvcl8zMmYoaW52YXIsIGludmFyLCB2ZWN0X2xlbiwgMi5mICk7CisgICAgICAgICAgICBpY3ZiSW52U3FydF8zMmYoaW52YXIsIGludmFyLCB2ZWN0X2xlbiApOworICAgICAgICB9CisgICAgfQorICAKKyAgICAvKioqKioqKioqKioqKioqV2VpZ2h0cyoqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIG5vcm1pbGl6ZSBnYW1tYXMgLSBpLmUuIGNvbXB1dGUgbWl4dHVyZSB3ZWlnaHRzICovCisgICAgCisgICAgLy9jb21wdXRlIHdlaWdodHMKKyAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWw7IGkrKykKKyAgICB7ICAgICAgICAgICAKKyAgICAgICAgaW50IGdhbW1hX3RvdGFsID0gMDsKKyAgICAgICAgZmxvYXQgbm9ybTsKKworICAgICAgICBmb3IgKG0gPSAwOyBtIDwgZmlyc3Rfc3RhdGVbaV0ubnVtX21peDsgbSsrKQorICAgICAgICB7CisgICAgICAgICAgICBnYW1tYV90b3RhbCArPSAoKGludCopKGZpcnN0X3N0YXRlW2ldLndlaWdodCkpW21dOyAgCisgICAgICAgIH0KKworICAgICAgICBub3JtID0gZ2FtbWFfdG90YWwgPyAoMS5mLyhmbG9hdClnYW1tYV90b3RhbCkgOiAwLmY7CisgICAgICAgICAgICAKKyAgICAgICAgZm9yIChtID0gMDsgbSA8IGZpcnN0X3N0YXRlW2ldLm51bV9taXg7IG0rKykKKyAgICAgICAgeworICAgICAgICAgICAgZmlyc3Rfc3RhdGVbaV0ud2VpZ2h0W21dID0gKChpbnQqKShmaXJzdF9zdGF0ZVtpXS53ZWlnaHQpKVttXSAqIG5vcm07CisgICAgICAgIH0gCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKyAgICBpY3ZEZWxldGVWZWN0b3IoIHRtcF92ZWN0KTsKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOyAKK30KKworCisKKworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2aG1tb2JzLmNwcCBiL2N2YXV4L3NyYy9jdmhtbW9icy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJhYzcxNAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmhtbW9icy5jcHAKQEAgLTAsMCArMSw2MzQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdmF1eC5oIgorCisvLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBpY3ZJbWdUb09ic19EQ1RfOHUzMmZfQzFSCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb24gdGFrZXMgYXMgaW5wdXQgYW4gaW1hZ2UgYW5kIHJldHVybnMgdGhlIHNlcXVuY2Ugb2Ygb2JzZXJ2YXRpb25zCisvLyAgICAgICAgICAgICB0byBiZSB1c2VkIHdpdGggYW4gZW1iZWRkZWQgSE1NOyBFYWNoIG9ic2VydmF0aW9uIGlzIHRvcC1sZWZ0IGJsb2NrIG9mIERDVAorLy8gICAgICAgICAgICAgY29lZmZpY2llbnQgbWF0cml4LgorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6IGltZyAgICAgLSBwb2ludGVyIHRvIHRoZSBvcmlnaW5hbCBpbWFnZSBST0kKKy8vICAgICAgICAgICAgICAgIGltZ1N0ZXAgLSBmdWxsIHJvdyB3aWR0aCBvZiB0aGUgaW1hZ2UgaW4gYnl0ZXMKKy8vICAgICAgICAgICAgICAgIHJvaSAgICAgLSB3aWR0aCBhbmQgaGVpZ2h0IG9mIFJPSSBpbiBwaXhlbHMKKy8vICAgICAgICAgICAgICAgIG9icyAgICAgLSBwb2ludGVyIHRvIHJlc3VsdGFudCBvYnNlcnZhdGlvbiB2ZWN0b3JzCisvLyAgICAgICAgICAgICAgICBkY3RTaXplIC0gc2l6ZSBvZiB0aGUgYmxvY2sgZm9yIHdoaWNoIERDVCBpcyBjYWxjdWxhdGVkCisvLyAgICAgICAgICAgICAgICBvYnNTaXplIC0gc2l6ZSBvZiB0b3AtbGVmdCBibG9jayBvZiBEQ1QgY29lZmZzIG1hdHJpeCwgd2hpY2ggaXMgdHJlYXRlZAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFzIG9ic2VydmF0aW9uLiBFYWNoIG9ic2VydmF0aW9uIHZlY3RvciBjb25zaXN0cyBvZgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG9ic1NpemUud2lkdGggKiBvYnNTaXplLmhlaWdodCBmbG9hdHMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHNob3VsZCBiZSBzYXRpc2ZpZWQ6CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgMCA8IG9ialNpemUud2lkdGggPD0gZGN0U2l6ZS53aWR0aCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAwIDwgb2JqU2l6ZS5oZWlnaHQgPD0gZGN0U2l6ZS5oZWlnaHQuCisvLyAgICAgICAgICAgICAgICBkZWx0YSAgIC0gZGN0QmxvY2tzIGFyZSBvdmVybGFwcGVkIGFuZCB0aGlzIHBhcmFtZXRlciBzcGVjaWZpZXMgaG9yaXpvbnRhbAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB2ZXJ0aWNhbCBzaGlmdC4KKy8vICAgIFJldHVybnM6CisvLyAgICAgIENWX05PX0VSUiBvciBlcnJvciBjb2RlCisvLyAgICBOb3RlczoKKy8vICAgICAgVGhlIGFsZ29yaXRobSBpcyBmb2xsb3dpbmc6CisvLyAgICAgICAgICAxLiBGaXJzdCwgbnVtYmVyIG9mIG9ic2VydmF0aW9uIHZlY3RvcnMgcGVyIHJvdyBhbmQgcGVyIGNvbHVtbiBhcmUgY2FsY3VsYXRlZDoKKy8vCisvLyAgICAgICAgICAgICBOeCA9IGZsb29yKChyb2kud2lkdGggLSBkY3RTaXplLndpZHRoICsgZGVsdGEud2lkdGgpL2RlbHRhLndpZHRoKTsKKy8vICAgICAgICAgICAgIE55ID0gZmxvb3IoKHJvaS5oZWlnaHQgLSBkY3RTaXplLmhlaWdodCArIGRlbHRhLmhlaWdodCkvZGVsdGEuaGVpZ2h0KTsKKy8vCisvLyAgICAgICAgICAgICBTbywgdG90YWwgbnVtYmVyIG9mIG9ic2VydmF0aW9uIHZlY3RvcnMgaXMgTngqTnksIGFuZCB0b3RhbCBzaXplIG9mCisvLyAgICAgICAgICAgICBhcnJheSBvYnMgbXVzdCBiZSA+PSBOeCpOeSpvYnNTaXplLndpZHRoKm9ic1NpemUuaGVpZ2h0KnNpemVvZihmbG9hdCkuCisvLyAgICAgICAgICAyLiBPYnNlcnZhdGlvbiB2ZWN0b3JzIGFyZSBjYWxjdWxhdGVkIGluIHRoZSBmb2xsb3dpbmcgbG9vcAorLy8gICAgICAgICAgICAgICAoIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgZGlmZmVyZW50ICksIHdoZXJlIAorLy8gICAgICAgICAgICAgICBJW3gxOngyLHkxOnkyXSBtZWFucyBibG9jayBvZiBwaXhlbHMgZnJvbSBzb3VyY2UgaW1hZ2Ugd2l0aAorLy8gICAgICAgICAgICAgICB4MSA8PSB4IDwgeDIsIHkxIDw9IHkgPCB5MiwKKy8vICAgICAgICAgICAgICAgRFt4MTp4Mix5MTp5Ml0gbWVhbnMgc3ViIG1hdHJpeCBvZiBEQ1QgbWF0cml4IEQuCisvLyAgICAgICAgICAgICAgIE9beCx5XSBtZWFucyBvYnNlcnZhdGlvbiB2ZWN0b3IgdGhhdCBjb3JyZXNwb25kcyB0byBwb3NpdGlvbgorLy8gICAgICAgICAgICAgICAoeCpkZWx0YS53aWR0aCx5KmRlbHRhLmhlaWdodCkgaW4gdGhlIHNvdXJjZSBpbWFnZQorLy8gICAgICAgICAgICAgICAoIGFsbCBpbmRpY2VzIGFyZSBjb3VudGVkIGZyb20gMCApLgorLy8KKy8vICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IE55OyB5KysgKQorLy8gICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgTng7IHgrKyApCisvLyAgICAgICAgICAgICAgICAgICB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgRCA9IERDVChJW3gqZGVsdGEud2lkdGggOiB4KmRlbHRhLndpZHRoICsgZGN0U2l6ZS53aWR0aCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkqZGVsdGEuaGVpZ2h0IDogeSpkZWx0YS5oZWlnaHQgKyBkY3RTaXplLmhlaWdodF0pOworLy8gICAgICAgICAgICAgICAgICAgICAgIE9beCx5XSA9IERbMDpvYnNTaXplLndpZHRoLCAwOm9ic1NpemUuaGVpZ2h0XTsKKy8vICAgICAgICAgICAgICAgICAgIH0KKy8vICAgICAgICAgICAgICAgfQorLy9GKi8KKworLypjb21tZW50IG91dCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gbWFrZSBEQ1QgYmUgY2FsY3VsYXRlZCBpbiBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljcyovCisvLyNkZWZpbmUgX0NWX0lOVF9EQ1QKKworLyogZm9yIGludGVnZXIgRENUIG9ubHkgKi8KKyNkZWZpbmUgRENUX1NDQUxFICAxNQorCisjaWZkZWYgX0NWX0lOVF9EQ1QKK3R5cGVkZWYgaW50IHdvcmtfdDsKKworI2RlZmluZSAgREVTQ0FMRSAgICAgIENWX0RFU0NBTEUKKyNkZWZpbmUgIFNDQUxFKHgpICAgICBDVl9GTFRfVE9fRklYKCh4KSxEQ1RfU0NBTEUpCisjZWxzZQordHlwZWRlZiBmbG9hdCB3b3JrX3Q7CisKKyNkZWZpbmUgIERFU0NBTEUoeCxuKSAoZmxvYXQpKHgpCisjZGVmaW5lICBTQ0FMRSh4KSAgICAgKGZsb2F0KSh4KQorI2VuZGlmCisKKy8qIGNhbGN1bGF0ZSBkY3QgdHJhbnNmb3JtIG1hdHJpeCAqLworc3RhdGljIHZvaWQgaWN2Q2FsY0RDVE1hdHJpeCggd29ya190ICogY2ZzLCBpbnQgbiApOworCisjZGVmaW5lICBNQVhfRENUX1NJWkUgIDMyCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZJbWdUb09ic19EQ1RfOHUzMmZfQzFSKCB1Y2hhciAqIGltZywgaW50IGltZ1N0ZXAsIEN2U2l6ZSByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqb2JzLCBDdlNpemUgZGN0U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBvYnNTaXplLCBDdlNpemUgZGVsdGEgKQoreworICAgIC8qIGRjdCB0cmFuc2Zvcm0gbWF0cmljZXM6IGhvcml6b250YWwgYW5kIHZlcnRpY2FsICovCisgICAgd29ya190IHRhYl94W01BWF9EQ1RfU0laRSAqIE1BWF9EQ1RfU0laRSAvIDIgKyAyXTsKKyAgICB3b3JrX3QgdGFiX3lbTUFYX0RDVF9TSVpFICogTUFYX0RDVF9TSVpFIC8gMiArIDJdOworCisgICAgLyogdGVtcG9yYXJ5IGJ1ZmZlcnMgZm9yIGRjdCAqLworICAgIHdvcmtfdCB0ZW1wMFtNQVhfRENUX1NJWkUgKiA0XTsKKyAgICB3b3JrX3QgdGVtcDFbTUFYX0RDVF9TSVpFICogNF07CisgICAgd29ya190ICpidWZmZXIgPSAwOworICAgIHdvcmtfdCAqYnVmX2xpbWl0OworCisgICAgZG91YmxlIHM7CisKKyAgICBpbnQgeTsKKyAgICBpbnQgTngsIE55OworCisgICAgaW50IG4xID0gZGN0U2l6ZS5oZWlnaHQsIG0xID0gbjEgLyAyOworICAgIGludCBuMiA9IGRjdFNpemUud2lkdGgsIG0yID0gbjIgLyAyOworCisgICAgaWYoICFpbWcgfHwgIW9icyApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGlmKCByb2kud2lkdGggPD0gMCB8fCByb2kuaGVpZ2h0IDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBpZiggZGVsdGEud2lkdGggPD0gMCB8fCBkZWx0YS5oZWlnaHQgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBpZiggb2JzU2l6ZS53aWR0aCA8PSAwIHx8IGRjdFNpemUud2lkdGggPCBvYnNTaXplLndpZHRoIHx8CisgICAgICAgIG9ic1NpemUuaGVpZ2h0IDw9IDAgfHwgZGN0U2l6ZS5oZWlnaHQgPCBvYnNTaXplLmhlaWdodCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBpZiggZGN0U2l6ZS53aWR0aCA+IE1BWF9EQ1RfU0laRSB8fCBkY3RTaXplLmhlaWdodCA+IE1BWF9EQ1RfU0laRSApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBOeCA9IChyb2kud2lkdGggLSBkY3RTaXplLndpZHRoICsgZGVsdGEud2lkdGgpIC8gZGVsdGEud2lkdGg7CisgICAgTnkgPSAocm9pLmhlaWdodCAtIGRjdFNpemUuaGVpZ2h0ICsgZGVsdGEuaGVpZ2h0KSAvIGRlbHRhLmhlaWdodDsKKworICAgIGlmKCBOeCA8PSAwIHx8IE55IDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworCisgICAgYnVmZmVyID0gKHdvcmtfdCAqKWN2QWxsb2MoIHJvaS53aWR0aCAqIG9ic1NpemUuaGVpZ2h0ICogc2l6ZW9mKCBidWZmZXJbMF0gKSk7CisgICAgaWYoICFidWZmZXIgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgaWN2Q2FsY0RDVE1hdHJpeCggdGFiX3gsIGRjdFNpemUud2lkdGggKTsKKyAgICBpY3ZDYWxjRENUTWF0cml4KCB0YWJfeSwgZGN0U2l6ZS5oZWlnaHQgKTsKKworICAgIGJ1Zl9saW1pdCA9IGJ1ZmZlciArIG9ic1NpemUuaGVpZ2h0ICogcm9pLndpZHRoOworCisgICAgZm9yKCB5ID0gMDsgeSA8IE55OyB5KyssIGltZyArPSBkZWx0YS5oZWlnaHQgKiBpbWdTdGVwICkKKyAgICB7CisgICAgICAgIGludCB4LCBpLCBqLCBrOworICAgICAgICB3b3JrX3QgazAgPSAwOworCisgICAgICAgIC8qIGRvIHRyYW5zZnJvbXMgZm9yIGVhY2ggY29sdW1uLiBDYWxjIG9ubHkgZmlyc3Qgb2JzU2l6ZS5oZWlnaHQgRENUIGNvZWZmaWNpZW50cyAqLworICAgICAgICBmb3IoIHggPSAwOyB4IDwgcm9pLndpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBpcyA9IDA7CisgICAgICAgICAgICB3b3JrX3QgKmJ1ZiA9IGJ1ZmZlciArIHg7CisgICAgICAgICAgICB3b3JrX3QgKnRhYiA9IHRhYl95ICsgMjsKKworICAgICAgICAgICAgaWYoIG4xICYgMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXMgPSBpbWdbeCArIG0xICogaW1nU3RlcF07CisgICAgICAgICAgICAgICAgazAgPSAoKHdvcmtfdCkgaXMpICogdGFiWy0xXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmlyc3QgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBtMTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGltZ1t4ICsgaiAqIGltZ1N0ZXBdOworICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gaW1nW3ggKyAobjEgLSAxIC0gaikgKiBpbWdTdGVwXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB0MiA9IHQwICsgdDE7CisKKyAgICAgICAgICAgICAgICB0MCAtPSB0MTsKKyAgICAgICAgICAgICAgICB0ZW1wMFtqXSA9ICh3b3JrX3QpIHQyOworICAgICAgICAgICAgICAgIGlzICs9IHQyOworICAgICAgICAgICAgICAgIHRlbXAxW2pdID0gKHdvcmtfdCkgdDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZlswXSA9IERFU0NBTEUoIGlzICogdGFiWy0yXSwgUEFTUzFfU0hJRlQgKTsKKyAgICAgICAgICAgIGlmKCAoYnVmICs9IHJvaS53aWR0aCkgPj0gYnVmX2xpbWl0ICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogb3RoZXIgY29lZmZpY2llbnRzICovCisgICAgICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtMTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0ZW1wMVtrXSAqIHRhYltrXTsKKworICAgICAgICAgICAgICAgIGJ1ZlswXSA9IERFU0NBTEUoIHMsIFBBU1MxX1NISUZUICk7CisgICAgICAgICAgICAgICAgaWYoIChidWYgKz0gcm9pLndpZHRoKSA+PSBidWZfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHRhYiArPSBtMTsKKyAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgIGlmKCBuMSAmIDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgazAgPSAtazA7CisgICAgICAgICAgICAgICAgICAgIHMgPSBrMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG0xOyBrKysgKQorICAgICAgICAgICAgICAgICAgICBzICs9IHRlbXAwW2tdICogdGFiW2tdOworCisgICAgICAgICAgICAgICAgYnVmWzBdID0gREVTQ0FMRSggcywgUEFTUzFfU0hJRlQgKTsKKyAgICAgICAgICAgICAgICB0YWIgKz0gbTE7CisKKyAgICAgICAgICAgICAgICBpZiggKGJ1ZiArPSByb2kud2lkdGgpID49IGJ1Zl9saW1pdCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgazAgPSAwOworCisgICAgICAgIC8qIGRvIHRyYW5zZm9ybXMgZm9yIHJvd3MuICovCisgICAgICAgIGZvciggeCA9IDA7IHggKyBkY3RTaXplLndpZHRoIDw9IHJvaS53aWR0aDsgeCArPSBkZWx0YS53aWR0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBvYnNTaXplLmhlaWdodDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JrX3QgKmJ1ZiA9IGJ1ZmZlciArIHggKyByb2kud2lkdGggKiBpOworICAgICAgICAgICAgICAgIHdvcmtfdCAqdGFiID0gdGFiX3ggKyAyOworICAgICAgICAgICAgICAgIGZsb2F0ICpvYnNfbGltaXQgPSBvYnMgKyBvYnNTaXplLndpZHRoOworCisgICAgICAgICAgICAgICAgcyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiggbjIgJiAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBidWZbbTJdOworICAgICAgICAgICAgICAgICAgICBrMCA9ICh3b3JrX3QpIChzICogdGFiWy0xXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZmlyc3QgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTI7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3JrX3QgdDAgPSBidWZbal07CisgICAgICAgICAgICAgICAgICAgIHdvcmtfdCB0MSA9IGJ1ZltuMiAtIDEgLSBqXTsKKyAgICAgICAgICAgICAgICAgICAgd29ya190IHQyID0gdDAgKyB0MTsKKworICAgICAgICAgICAgICAgICAgICB0MCAtPSB0MTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDBbal0gPSAod29ya190KSB0MjsKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0MjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDFbal0gPSAod29ya190KSB0MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqb2JzKysgPSAoZmxvYXQpIERFU0NBTEUoIHMgKiB0YWJbLTJdLCBQQVNTMl9TSElGVCApOworCisgICAgICAgICAgICAgICAgaWYoIG9icyA9PSBvYnNfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIG90aGVyIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgICAgIGZvciggOzsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG0yOyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB0ZW1wMVtrXSAqIHRhYltrXTsKKworICAgICAgICAgICAgICAgICAgICBvYnNbMF0gPSAoZmxvYXQpIERFU0NBTEUoIHMsIFBBU1MyX1NISUZUICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCArK29icyA9PSBvYnNfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgdGFiICs9IG0yOworCisgICAgICAgICAgICAgICAgICAgIHMgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBuMiAmIDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrMCA9IC1rMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBrMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTI7IGsrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHRlbXAwW2tdICogdGFiW2tdOworICAgICAgICAgICAgICAgICAgICBvYnNbMF0gPSAoZmxvYXQpIERFU0NBTEUoIHMsIFBBU1MyX1NISUZUICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGFiICs9IG0yOworICAgICAgICAgICAgICAgICAgICBpZiggKytvYnMgPT0gb2JzX2xpbWl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkltZ1RvT2JzX0RDVF8zMmZfQzFSKCBmbG9hdCAqIGltZywgaW50IGltZ1N0ZXAsIEN2U2l6ZSByb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKm9icywgQ3ZTaXplIGRjdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIG9ic1NpemUsIEN2U2l6ZSBkZWx0YSApCit7CisgICAgLyogZGN0IHRyYW5zZm9ybSBtYXRyaWNlczogaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgKi8KKyAgICB3b3JrX3QgdGFiX3hbTUFYX0RDVF9TSVpFICogTUFYX0RDVF9TSVpFIC8gMiArIDJdOworICAgIHdvcmtfdCB0YWJfeVtNQVhfRENUX1NJWkUgKiBNQVhfRENUX1NJWkUgLyAyICsgMl07CisKKyAgICAvKiB0ZW1wb3JhcnkgYnVmZmVycyBmb3IgZGN0ICovCisgICAgd29ya190IHRlbXAwW01BWF9EQ1RfU0laRSAqIDRdOworICAgIHdvcmtfdCB0ZW1wMVtNQVhfRENUX1NJWkUgKiA0XTsKKyAgICB3b3JrX3QgKmJ1ZmZlciA9IDA7CisgICAgd29ya190ICpidWZfbGltaXQ7CisKKyAgICBkb3VibGUgczsKKworICAgIGludCB5OworICAgIGludCBOeCwgTnk7CisKKyAgICBpbnQgbjEgPSBkY3RTaXplLmhlaWdodCwgbTEgPSBuMSAvIDI7CisgICAgaW50IG4yID0gZGN0U2l6ZS53aWR0aCwgbTIgPSBuMiAvIDI7CisKKyAgICBpZiggIWltZyB8fCAhb2JzICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgaWYoIHJvaS53aWR0aCA8PSAwIHx8IHJvaS5oZWlnaHQgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGlmKCBkZWx0YS53aWR0aCA8PSAwIHx8IGRlbHRhLmhlaWdodCA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKworICAgIGlmKCBvYnNTaXplLndpZHRoIDw9IDAgfHwgZGN0U2l6ZS53aWR0aCA8IG9ic1NpemUud2lkdGggfHwKKyAgICAgICAgb2JzU2l6ZS5oZWlnaHQgPD0gMCB8fCBkY3RTaXplLmhlaWdodCA8IG9ic1NpemUuaGVpZ2h0ICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKworICAgIGlmKCBkY3RTaXplLndpZHRoID4gTUFYX0RDVF9TSVpFIHx8IGRjdFNpemUuaGVpZ2h0ID4gTUFYX0RDVF9TSVpFICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKworICAgIE54ID0gKHJvaS53aWR0aCAtIGRjdFNpemUud2lkdGggKyBkZWx0YS53aWR0aCkgLyBkZWx0YS53aWR0aDsKKyAgICBOeSA9IChyb2kuaGVpZ2h0IC0gZGN0U2l6ZS5oZWlnaHQgKyBkZWx0YS5oZWlnaHQpIC8gZGVsdGEuaGVpZ2h0OworCisgICAgaWYoIE54IDw9IDAgfHwgTnkgPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURSQU5HRV9FUlI7CisKKyAgICBidWZmZXIgPSAod29ya190ICopY3ZBbGxvYyggcm9pLndpZHRoICogb2JzU2l6ZS5oZWlnaHQgKiBzaXplb2YoIGJ1ZmZlclswXSApKTsKKyAgICBpZiggIWJ1ZmZlciApCisgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisKKyAgICBpY3ZDYWxjRENUTWF0cml4KCB0YWJfeCwgZGN0U2l6ZS53aWR0aCApOworICAgIGljdkNhbGNEQ1RNYXRyaXgoIHRhYl95LCBkY3RTaXplLmhlaWdodCApOworCisgICAgYnVmX2xpbWl0ID0gYnVmZmVyICsgb2JzU2l6ZS5oZWlnaHQgKiByb2kud2lkdGg7CisKKyAgICBpbWdTdGVwIC89IHNpemVvZihpbWdbMF0pOworCisgICAgZm9yKCB5ID0gMDsgeSA8IE55OyB5KyssIGltZyArPSBkZWx0YS5oZWlnaHQgKiBpbWdTdGVwICkKKyAgICB7CisgICAgICAgIGludCB4LCBpLCBqLCBrOworICAgICAgICB3b3JrX3QgazAgPSAwOworCisgICAgICAgIC8qIGRvIHRyYW5zZnJvbXMgZm9yIGVhY2ggY29sdW1uLiBDYWxjIG9ubHkgZmlyc3Qgb2JzU2l6ZS5oZWlnaHQgRENUIGNvZWZmaWNpZW50cyAqLworICAgICAgICBmb3IoIHggPSAwOyB4IDwgcm9pLndpZHRoOyB4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBpcyA9IDA7CisgICAgICAgICAgICB3b3JrX3QgKmJ1ZiA9IGJ1ZmZlciArIHg7CisgICAgICAgICAgICB3b3JrX3QgKnRhYiA9IHRhYl95ICsgMjsKKworICAgICAgICAgICAgaWYoIG4xICYgMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXMgPSBpbWdbeCArIG0xICogaW1nU3RlcF07CisgICAgICAgICAgICAgICAgazAgPSAoKHdvcmtfdCkgaXMpICogdGFiWy0xXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogZmlyc3QgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBtMTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGltZ1t4ICsgaiAqIGltZ1N0ZXBdOworICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gaW1nW3ggKyAobjEgLSAxIC0gaikgKiBpbWdTdGVwXTsKKyAgICAgICAgICAgICAgICBmbG9hdCB0MiA9IHQwICsgdDE7CisKKyAgICAgICAgICAgICAgICB0MCAtPSB0MTsKKyAgICAgICAgICAgICAgICB0ZW1wMFtqXSA9ICh3b3JrX3QpIHQyOworICAgICAgICAgICAgICAgIGlzICs9IHQyOworICAgICAgICAgICAgICAgIHRlbXAxW2pdID0gKHdvcmtfdCkgdDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1ZlswXSA9IERFU0NBTEUoIGlzICogdGFiWy0yXSwgUEFTUzFfU0hJRlQgKTsKKyAgICAgICAgICAgIGlmKCAoYnVmICs9IHJvaS53aWR0aCkgPj0gYnVmX2xpbWl0ICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLyogb3RoZXIgY29lZmZpY2llbnRzICovCisgICAgICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtMTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0ZW1wMVtrXSAqIHRhYltrXTsKKworICAgICAgICAgICAgICAgIGJ1ZlswXSA9IERFU0NBTEUoIHMsIFBBU1MxX1NISUZUICk7CisgICAgICAgICAgICAgICAgaWYoIChidWYgKz0gcm9pLndpZHRoKSA+PSBidWZfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIHRhYiArPSBtMTsKKyAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgIGlmKCBuMSAmIDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgazAgPSAtazA7CisgICAgICAgICAgICAgICAgICAgIHMgPSBrMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG0xOyBrKysgKQorICAgICAgICAgICAgICAgICAgICBzICs9IHRlbXAwW2tdICogdGFiW2tdOworCisgICAgICAgICAgICAgICAgYnVmWzBdID0gREVTQ0FMRSggcywgUEFTUzFfU0hJRlQgKTsKKyAgICAgICAgICAgICAgICB0YWIgKz0gbTE7CisKKyAgICAgICAgICAgICAgICBpZiggKGJ1ZiArPSByb2kud2lkdGgpID49IGJ1Zl9saW1pdCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgazAgPSAwOworCisgICAgICAgIC8qIGRvIHRyYW5zZm9ybXMgZm9yIHJvd3MuICovCisgICAgICAgIGZvciggeCA9IDA7IHggKyBkY3RTaXplLndpZHRoIDw9IHJvaS53aWR0aDsgeCArPSBkZWx0YS53aWR0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBvYnNTaXplLmhlaWdodDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3b3JrX3QgKmJ1ZiA9IGJ1ZmZlciArIHggKyByb2kud2lkdGggKiBpOworICAgICAgICAgICAgICAgIHdvcmtfdCAqdGFiID0gdGFiX3ggKyAyOworICAgICAgICAgICAgICAgIGZsb2F0ICpvYnNfbGltaXQgPSBvYnMgKyBvYnNTaXplLndpZHRoOworCisgICAgICAgICAgICAgICAgcyA9IDA7CisKKyAgICAgICAgICAgICAgICBpZiggbjIgJiAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHMgPSBidWZbbTJdOworICAgICAgICAgICAgICAgICAgICBrMCA9ICh3b3JrX3QpIChzICogdGFiWy0xXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogZmlyc3QgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTI7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3b3JrX3QgdDAgPSBidWZbal07CisgICAgICAgICAgICAgICAgICAgIHdvcmtfdCB0MSA9IGJ1ZltuMiAtIDEgLSBqXTsKKyAgICAgICAgICAgICAgICAgICAgd29ya190IHQyID0gdDAgKyB0MTsKKworICAgICAgICAgICAgICAgICAgICB0MCAtPSB0MTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDBbal0gPSAod29ya190KSB0MjsKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0MjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDFbal0gPSAod29ya190KSB0MDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqb2JzKysgPSAoZmxvYXQpIERFU0NBTEUoIHMgKiB0YWJbLTJdLCBQQVNTMl9TSElGVCApOworCisgICAgICAgICAgICAgICAgaWYoIG9icyA9PSBvYnNfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIC8qIG90aGVyIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgICAgIGZvciggOzsgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG0yOyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB0ZW1wMVtrXSAqIHRhYltrXTsKKworICAgICAgICAgICAgICAgICAgICBvYnNbMF0gPSAoZmxvYXQpIERFU0NBTEUoIHMsIFBBU1MyX1NISUZUICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCArK29icyA9PSBvYnNfbGltaXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgdGFiICs9IG0yOworCisgICAgICAgICAgICAgICAgICAgIHMgPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBuMiAmIDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBrMCA9IC1rMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBrMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTI7IGsrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHRlbXAwW2tdICogdGFiW2tdOworICAgICAgICAgICAgICAgICAgICBvYnNbMF0gPSAoZmxvYXQpIERFU0NBTEUoIHMsIFBBU1MyX1NISUZUICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGFiICs9IG0yOworICAgICAgICAgICAgICAgICAgICBpZiggKytvYnMgPT0gb2JzX2xpbWl0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGN2RnJlZSggJmJ1ZmZlciApOworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkNhbGNEQ1RNYXRyaXgoIHdvcmtfdCAqIGNmcywgaW50IG4gKQoreworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc3FydDIgPSAxLjQxNDIxMzU2MjM3MzA5NTA0ODgwMTY4ODcyNDIwOTc7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBwaSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzgzMjc5NTsKKworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2luY29zWzE2ICogMl0gPSB7CisgICAgICAgIDEuMDAwMDAwMDAwMDAwMDAwMDAsIDAuMDAwMDAwMDAwMDAwMDAwMDYsCisgICAgICAgIDAuNzA3MTA2NzgxMTg2NTQ3NDYsIDAuNzA3MTA2NzgxMTg2NTQ3NTcsCisgICAgICAgIDAuNDk5OTk5OTk5OTk5OTk5OTQsIDAuODY2MDI1NDAzNzg0NDM4NzEsCisgICAgICAgIDAuMzgyNjgzNDMyMzY1MDg5NzgsIDAuOTIzODc5NTMyNTExMjg2NzQsCisgICAgICAgIDAuMzA5MDE2OTk0Mzc0OTQ3NDAsIDAuOTUxMDU2NTE2Mjk1MTUzNTMsCisgICAgICAgIDAuMjU4ODE5MDQ1MTAyNTIwNzQsIDAuOTY1OTI1ODI2Mjg5MDY4MzEsCisgICAgICAgIDAuMjIyNTIwOTMzOTU2MzE0MzksIDAuOTc0OTI3OTEyMTgxODIzNjIsCisgICAgICAgIDAuMTk1MDkwMzIyMDE2MTI4MjUsIDAuOTgwNzg1MjgwNDAzMjMwNDMsCisgICAgICAgIDAuMTczNjQ4MTc3NjY2OTMwMzMsIDAuOTg0ODA3NzUzMDEyMjA4MDIsCisgICAgICAgIDAuMTU2NDM0NDY1MDQwMjMwODcsIDAuOTg3Njg4MzQwNTk1MTM3NzcsCisgICAgICAgIDAuMTQyMzE0ODM4MjczMjg1MTQsIDAuOTg5ODIxNDQxODgwOTMyNjgsCisgICAgICAgIDAuMTMwNTI2MTkyMjIwMDUxNTcsIDAuOTkxNDQ0ODYxMzczODEwMzgsCisgICAgICAgIDAuMTIwNTM2NjgwMjU1MzIzMDUsIDAuOTkyNzA4ODc0MDk4MDUzOTcsCisgICAgICAgIDAuMTExOTY0NDc2MTAzMzA3ODYsIDAuOTkzNzEyMjA5ODkzMjQyNjAsCisgICAgICAgIDAuMTA0NTI4NDYzMjY3NjUzNDYsIDAuOTk0NTIxODk1MzY4MjczMjksCisgICAgICAgIDAuMDk4MDE3MTQwMzI5NTYwNjAsIDAuOTk1MTg0NzI2NjcyMTk2OTMsCisgICAgfTsKKworI2RlZmluZSBST1RBVEUoIGMsIHMsIGRjLCBkcyApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ID0gYypkYyAtIHMqZHM7ICAgICAgICAgICBcCisgICAgICAgIHMgPSBjKmRzICsgcypkYzsgICAgICAgICAgIFwKKyAgICAgICAgYyA9IHQ7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2RlZmluZSBXUklURTIoIGosIGEsIGIgKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNmc1tqXSAgID0gU0NBTEUoYSk7ICBcCisgICAgICAgIGNmczJbal0gID0gU0NBTEUoYik7ICBcCisgICAgfQorCisgICAgZG91YmxlIHQsIHNjYWxlID0gMS4gLyBzcXJ0KCAoZG91YmxlKW4gKTsKKyAgICBpbnQgaSwgaiwgbSA9IG4gLyAyOworCisgICAgY2ZzWzBdID0gU0NBTEUoIHNjYWxlICk7CisgICAgc2NhbGUgKj0gc3FydDI7CisgICAgY2ZzWzFdID0gU0NBTEUoIHNjYWxlICk7CisgICAgY2ZzICs9IDIgLSBtOworCisgICAgaWYoIG4gPiAxICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBhMCwgYjA7CisgICAgICAgIGRvdWJsZSBkYTAsIGRiMDsKKyAgICAgICAgd29ya190ICpjZnMyID0gY2ZzICsgbSAqIG47CisKKyAgICAgICAgaWYoIG4gPD0gMTYgKQorICAgICAgICB7CisgICAgICAgICAgICBkYTAgPSBhMCA9IHNpbmNvc1syICogbiAtIDFdOworICAgICAgICAgICAgZGIwID0gYjAgPSBzaW5jb3NbMiAqIG4gLSAyXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHQgPSBwaSAvICgyICogbik7CisgICAgICAgICAgICBkYTAgPSBhMCA9IGNvcyggdCApOworICAgICAgICAgICAgZGIwID0gYjAgPSBzaW4oIHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIG90aGVyIHJvd3MgKi8KKyAgICAgICAgZm9yKCBpID0gMTsgaSA8PSBtOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYSA9IGEwICogc2NhbGU7CisgICAgICAgICAgICBkb3VibGUgYiA9IGIwICogc2NhbGU7CisgICAgICAgICAgICBkb3VibGUgZGEgPSBhMCAqIGEwIC0gYjAgKiBiMDsKKyAgICAgICAgICAgIGRvdWJsZSBkYiA9IGEwICogYjAgKyBhMCAqIGIwOworCisgICAgICAgICAgICBjZnMgKz0gbTsKKyAgICAgICAgICAgIGNmczIgLT0gbTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGogKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV1JJVEUyKCBqLCBhLCBiICk7CisgICAgICAgICAgICAgICAgUk9UQVRFKCBhLCBiLCBkYSwgZGIgKTsKKyAgICAgICAgICAgICAgICBpZiggaiArIDEgPCBtICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdSSVRFMiggaiArIDEsIGEsIC1iICk7CisgICAgICAgICAgICAgICAgICAgIFJPVEFURSggYSwgYiwgZGEsIGRiICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBST1RBVEUoIGEwLCBiMCwgZGEwLCBkYjAgKTsKKyAgICAgICAgfQorICAgIH0KKyN1bmRlZiBST1RBVEUKKyN1bmRlZiBXUklURTIKK30KKworCitDVl9JTVBMIHZvaWQKK2N2SW1nVG9PYnNfRENUKCBjb25zdCB2b2lkKiBhcnIsIGZsb2F0ICpvYnMsIEN2U2l6ZSBkY3RTaXplLAorICAgICAgICAgICAgICAgIEN2U2l6ZSBvYnNTaXplLCBDdlNpemUgZGVsdGEgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZJbWdUb09ic19EQ1QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggYXJyLCAmc3R1YiApKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApKQorICAgIHsKKyAgICBjYXNlIENWXzhVQzE6CisgICAgICAgIElQUElfQ0FMTCggaWN2SW1nVG9PYnNfRENUXzh1MzJmX0MxUiggbWF0LT5kYXRhLnB0ciwgbWF0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2R2V0TWF0U2l6ZShtYXQpLCBvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0U2l6ZSwgb2JzU2l6ZSwgZGVsdGEgKSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJGQzE6CisgICAgICAgIElQUElfQ0FMTCggaWN2SW1nVG9PYnNfRENUXzMyZl9DMVIoIG1hdC0+ZGF0YS5mbCwgbWF0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2R2V0TWF0U2l6ZShtYXQpLCBvYnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGN0U2l6ZSwgb2JzU2l6ZSwgZGVsdGEgKSk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2bGNtLmNwcCBiL2N2YXV4L3NyYy9jdmxjbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQwNTllNwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmxjbS5jcHAKQEAgLTAsMCArMSw3MjQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKiBIeWJyaWQgbGluZWFyLWNvbnRvdXIgbW9kZWwgcmVjb25zdHJ1Y3Rpb24gKi8KKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2RlZmluZSBDVl9JTVBMIENWX0VYVEVSTl9DCisKK2NvbnN0IGZsb2F0IExDTV9DT05TVF9aRVJPID0gMWUtNmY7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1eGlsaWFyeSBzdHJ1Y3QgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IEN2TENNCit7CisgICAgQ3ZHcmFwaCogR3JhcGg7CisgICAgQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbTsKKyAgICBDdk1lbVN0b3JhZ2UqIENvbnRvdXJTdG9yYWdlOworICAgIEN2TWVtU3RvcmFnZSogRWRnZVN0b3JhZ2U7CisgICAgZmxvYXQgbWF4V2lkdGg7Cit9IEN2TENNOworCit0eXBlZGVmIHN0cnVjdCBDdkxDTUNvbXBsZXhOb2RlRGF0YQoreworICAgIEN2Vm9yb25vaU5vZGUyRCBlZGdlX25vZGU7CisgICAgQ3ZQb2ludDJEMzJmIHNpdGVfZmlyc3RfcHQ7CisgICAgQ3ZQb2ludDJEMzJmIHNpdGVfbGFzdF9wdDsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIHNpdGVfZmlyc3Q7CisgICAgQ3ZWb3Jvbm9pU2l0ZTJEKiBzaXRlX2xhc3Q7CisgICAgQ3ZWb3Jvbm9pRWRnZTJEKiBlZGdlOworfSBDdkxDTUNvbXBsZXhOb2RlRGF0YTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZMQ01EYXRhCit7CisgICAgQ3ZWb3Jvbm9pTm9kZTJEKiBwbm9kZTsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIHBzaXRlOworICAgIEN2Vm9yb25vaUVkZ2UyRCogcGVkZ2U7Cit9IEN2TENNRGF0YTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiBkZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgX0NWX1JFQURfU0VRX0VMRU0oIGVsZW0sIHJlYWRlciwgdHlwZSApICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCAocmVhZGVyKS5zZXEtPmVsZW1fc2l6ZSA9PSBzaXplb2YoKmVsZW0pKTsgICAgICAgICBcCisgICAgZWxlbSA9ICh0eXBlKShyZWFkZXIpLnB0cjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKCplbGVtKSwgcmVhZGVyICkgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgX0NWX0lTX1NJVEVfUkVGTEVYKCBTSVRFICkgICgoU0lURSkgLT5ub2RlWzBdID09IChTSVRFKSAtPm5vZGVbMV0pCisjZGVmaW5lIF9DVl9JU19FREdFX1JFRkxFWCggRURHRSApICAoKCAoRURHRSktPnNpdGVbMF0tPm5vZGVbMF0gPT0gKEVER0UpLT5zaXRlWzBdLT5ub2RlWzBdICkgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIChFREdFKS0+c2l0ZVsxXS0+bm9kZVswXSA9PSAoRURHRSktPnNpdGVbMV0tPm5vZGVbMF0gKSApCisKKyNkZWZpbmUgX0NWX0lOSVRJQUxJWkVfQ1ZMQ01EQVRBKFNUUlVDVCxTSVRFLEVER0UsTk9ERSlcCit7IChTVFJVQ1QpLT5wc2l0ZSA9IFNJVEUgOyAoU1RSVUNUKS0+cGVkZ2UgPSBFREdFOyAoU1RSVUNUKS0+cG5vZGUgPSBOT0RFO30KKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICAgIE5hbWU6ICAgIF9jdkNvbnN0cnVjdExDTQorLy8gICAgUHVycG9zZTogRnVuY3Rpb24gY29uc3RydWN0cyBoeWJyaWQgbW9kZWwKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBMQ00gOiBpbiZvdXQuCisvLyAgICBSZXR1cm5zOiAxLCBpZiBoeWJyaWQgbW9kZWwgd2FzIHN1Y2Nlc2Z1bGx5IGNvbnN0cnVjdGVkCisvLyAgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZXMKKy8vRiovCitDVl9JTVBMIAoraW50IF9jdkNvbnN0cnVjdExDTShDdkxDTSogTENNKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q29uc3RydWN0TENNQ29tcGxleE5vZGUKKy8vICAgIFB1cnBvc2U6IEZ1bmN0aW9uIGNvbnN0cnVjdHMgQ29tcGxleCBOb2RlIChub2RlLCB3aGljaCBjb25zaXN0cyBvZgorLy8gICAgICAgICAgICAgdHdvIHBvaW50cyBhbmQgbW9yZSkgb2YgaHlicmlkIG1vZGVsCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgcExDTSA6IGluJm91dC4KKy8vICAgICAgcExDTUVkZ2U6IGluLCBpbnB1dCBlZGdlIG9mIGh5YnJpZCBtb2RlbAorLy8gICAgICBwTENNSW5wdXREYXRhOiBpbiwgaW5wdXQgcGFyYW1ldGVycworLy8gICAgUmV0dXJuczogcG9pbnRlciB0byBjb25zdHJ1Y3RlZCBub2RlCisvL0YqLworQ1ZfSU1QTAorQ3ZMQ01Ob2RlKiBfY3ZDb25zdHJ1Y3RMQ01Db21wbGV4Tm9kZShDdkxDTSogcExDTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01FZGdlKiBwTENNRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01EYXRhKiBwTENNSW5wdXREYXRhKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q29uc3RydWN0TENNU2ltcGxlTm9kZQorLy8gICAgUHVycG9zZTogRnVuY3Rpb24gY29uc3RydWN0cyBTaW1wbGUgTm9kZSAobm9kZSwgd2hpY2ggY29uc2lzdHMgb2YKKy8vICAgICAgICAgICAgIG9uZSBwb2ludCkgb2YgaHlicmlkIG1vZGVsCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgcExDTSA6IGluJm91dC4KKy8vICAgICAgcExDTUVkZ2U6IGluLCBpbnB1dCBlZGdlIG9mIGh5YnJpZCBtb2RlbAorLy8gICAgICBwTENNSW5wdXREYXRhOiBpbiwgaW5wdXQgcGFyYW1ldGVycworLy8gICAgUmV0dXJuczogcG9pbnRlciB0byBjb25zdHJ1Y3RlZCBub2RlCisvL0YqLworQ1ZfSU1QTAorQ3ZMQ01Ob2RlKiBfY3ZDb25zdHJ1Y3RMQ01TaW1wbGVOb2RlKEN2TENNKiBwTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01FZGdlKiBwTENNRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TENNRGF0YSogcExDTUlucHV0RGF0YSk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICAgIE5hbWU6ICAgIF9jdkNvbnN0cnVjdExDTVNpbXBsZU5vZGUKKy8vICAgIFB1cnBvc2U6IEZ1bmN0aW9uIGNvbnN0cnVjdHMgRWRnZSBvZiBoeWJyaWQgbW9kZWwKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBwTENNIDogaW4mb3V0LgorLy8gICAgICBwTENNSW5wdXREYXRhOiBpbiwgaW5wdXQgcGFyYW1ldGVycworLy8gICAgUmV0dXJuczogcG9pbnRlciB0byBjb25zdHJ1Y3RlZCBlZGdlCisvL0YqLworQ1ZfSU1QTAorQ3ZMQ01FZGdlKiBfY3ZDb25zdHJ1Y3RMQ01FZGdlKEN2TENNKiBwTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TENNRGF0YSogcExDTUlucHV0RGF0YSk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICAgIE5hbWU6ICAgIF9jdlRyZWF0RXhlcHRpb25hbENhc2UKKy8vICAgIFB1cnBvc2U6IEZ1bmN0aW9uIHRyZWF0cyB0cmlhbmdsZXMgYW5kIHJlZ3VsYXIgcG9seWdvbnMKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBwTENNIDogaW4sIGluZm9ybWF0aW9uIGFib3V0IGdyYXBoCisvLyAgICAgIHBMQ01JbnB1dERhdGE6IGluLCBpbnB1dCBwYXJhbWV0ZXJzCisvLyAgICBSZXR1cm5zOiBwb2ludGVyIHRvIGdyYXBoIG5vZGUKKy8vRiovCitDVl9JTVBMCitDdkxDTU5vZGUqIF9jdlRyZWF0RXhlcHRpb25hbENhc2UoQ3ZMQ00qIHBMQ00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01EYXRhKiBwTENNSW5wdXREYXRhKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Tm9kZU11bHR5cGxpY2l0eQorLy8gICAgUHVycG9zZTogRnVuY3Rpb24gc2Vla3MgYWxsIG5vbi1ib3VuZGFyeSBlZGdlcyBpbmNpZGVudCB0bworLy8gICAgICAgICAgICAgIGdpdmVuIG5vZGUgYW5kIGNvcnJlc3BvbmRlbnQgaW5jaWRlbnQgc2l0ZXMKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBwRWRnZSA6IGluLCBvcmlnaW5hbCBlZGdlCisvLyAgICAgIHBOb2RlIDogaW4sIGdpdmVuIG5vZGUKKy8vICAgICAgTGlua2VkRWRnZXMgOiBvdXQsIG1hdHJpeCBvZiBpbmNpZGVudCBlZGdlcworLy8gICAgICBMaW5rZWRTaXRlcyA6IG91dCwgbWF0cml4IG9mIGluY2lkZW50IHNpdGVzCisvLyAgICAgIHBTaXRlOiBpbiwgb3JpZ2luYWwgc2l0ZSAocE5vZGUgbXVzdCBiZSB0aGUgYmVnaW4gcG9pbnQgb2YgcEVkZ2UKKy8vICAgICAgICAgICAgICBmb3IgdGhpcyBwU2l0ZSwgdGhpcyBwcm9wZXJ0eSBob2xkIG91dCBmYXIgYWxsIGVkZ2VzKSAgCisvLyAgICBSZXR1cm5zOiBudW1iZXIgb2YgaW5jaWRlbnQgZWRnZXMgKG11c3QgYmUgbGVzcyB0aGFuIDEwKQorLy9GKi8KK0NWX0lNUEwKK2ludCBfY3ZOb2RlTXVsdHlwbGljaXR5KEN2Vm9yb25vaVNpdGUyRCogcFNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lFZGdlMkQqIHBFZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pTm9kZTJEKiBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaUVkZ2UyRCoqIExpbmtlZEVkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pU2l0ZTJEKiogTGlua2VkU2l0ZXMpOworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIEF1dGhvcjogIEFuZHJleSBTb2JvbGV2CisvLyAgICBOYW1lOiAgICBfY3ZDcmVhdGVMQ01Ob2RlCisvLyAgICBQdXJwb3NlOiBGdW5jdGlvbiBjcmVhdGUgZ3JhcGggbm9kZQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIHBMQ00gOiBpbiwgaW5mb3JtYXRpb24gYWJvdXQgZ3JhcGgKKy8vICAgIFJldHVybnM6IHBvaW50ZXIgdG8gZ3JhcGggbm9kZQorLy9GKi8KK0NWX0lNUEwKK0N2TENNTm9kZSogX2N2Q3JlYXRlTENNTm9kZShDdkxDTSogcExDTSk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICAgIE5hbWU6ICAgIF9jdkNyZWF0ZUxDTUVkZ2UKKy8vICAgIFB1cnBvc2U6IEZ1bmN0aW9uIGNyZWF0ZSBncmFwaCBlZGdlCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgcExDTSA6IGluLCBpbmZvcm1hdGlvbiBhYm91dCBncmFwaAorLy8gICAgUmV0dXJuczogcG9pbnRlciB0byBncmFwaCBlZGdlCisvL0YqLworQ1ZfSU1QTAorQ3ZMQ01FZGdlKiBfY3ZDcmVhdGVMQ01FZGdlKEN2TENNKiBwTENNKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q3JlYXRlTENNTm9kZQorLy8gICAgUHVycG9zZTogRnVuY3Rpb24gZXN0YWJsaXNocyB0aGUgY29ubmVjdGlvbiBiZXR3ZWVuIG5vZGUgYW5kIGVnZQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIExDTU5vZGUgOiBpbiwgZ3JhcGggbm9kZQorLy8gICAgICBMQ01FZGdlIDogaW4sIGdyYXBoIGVkZ2UKKy8vICAgICAgTENNRWRnZV9wcmV2IDogaW4mb3V0LCBwcmV2aW91cyBlZGdlLCBjb25uZWN0ZWQgd2l0aCBnaXZlbiBub2RlCisvLyAgICAgIGluZGV4OiBpbiwgCisvLyAgICAgIGkgICAgOiA9MCwgaWYgbm9kZSBpcyBpbml0aWFsIGZvciBlZGdlCisvLyAgICAgICAgICAgICA9MSwgaWYgbm9kZSAgaXMgdGVybWluYWwgZm9yIGVkZ2UKKy8vICAgIFJldHVybnM6IAorLy9GKi8KK0NWX0lNUEwKK3ZvaWQgX2N2QXR0YWNoTENNRWRnZVRvTENNTm9kZShDdkxDTU5vZGUqIExDTU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01FZGdlKiBMQ01FZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TENNRWRnZSogJkxDTUVkZ2VfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkpOworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2UHJvamVjdGlvblBvaW50VG9TZWdtZW50CisvLyAgICBQdXJwb3NlOiBGdW5jdGlvbiBjb21wdXRlcyB0aGUgb3J0b2dvbmFsIHByb2plY3Rpb24gb2YgUG9pbnRPIHRvCisvLyAgICAgICAgICAgICB0byBzZWdtZW50W1BvaW50QSwgUG9pbnRCXQorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIFBvaW50TywgUG9pbnRBLFBvaW50QjogaW4sIGdpdmVuIHBvaW50cworLy8gICAgICBQclBvaW50IDogb3V0LCBwcm9qZWN0aW9uCisvLyAgICAgIGRpc3QgOiBkaXN0YW5jZSBmcm9tIFBvaW50TyB0byBQclBvaW50CisvLyAgICBSZXR1cm5zOiAKKy8vRiovCitDVl9JTVBMCit2b2lkIF9jdlByb2plY3Rpb25Qb2ludFRvU2VnbWVudChDdlBvaW50MkQzMmYqIFBvaW50TywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogUG9pbnRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBQb2ludEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIFByUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGlzdCk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICAgIE5hbWU6ICAgIF9jdlByZXBhcmVEYXRhCisvLyAgICBQdXJwb3NlOiBGdW5jdGlvbiBmaWxscyB1cCB0aGUgc3RydWN0IEN2TENNQ29tcGxleE5vZGVEYXRhCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgcExDTURhdGEgOiBpbgorLy8gICAgICBwTENNQ0NORGF0YSA6IG91dAorLy8gICAgUmV0dXJuczogCisvL0YqLworQ1ZfSU1QTAordm9pZCBfY3ZQcmVwYXJlRGF0YShDdkxDTUNvbXBsZXhOb2RlRGF0YSogcExDTUNDTkRhdGEsCisgICAgICAgICAgICAgICAgICAgIEN2TENNRGF0YSogcExDTURhdGEpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiByZWFsaXphdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCBDdkdyYXBoKiBjdkxpbmVhckNvbnRvck1vZGVsRnJvbVZvcm9ub2lEaWFncmFtKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbWF4V2lkdGgpCit7CisgICAgQ3ZNZW1TdG9yYWdlKiBMQ01zdG9yYWdlOworICAgIEN2U2V0KiBTaXRlU2V0OworICAgIEN2TENNIExDTSA9IHtOVUxMLCBWb3Jvbm9pRGlhZ3JhbSxOVUxMLE5VTEwsbWF4V2lkdGh9OworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkxpbmVhckNvbnRvck1vZGVsRnJvbVZvcm9ub2lEaWFncmFtIiApOworICAgICBfX0JFR0lOX187CisgICAgCisgICAgaWYoICFWb3Jvbm9pRGlhZ3JhbSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIlZvcm9ub2kgRGlhZ3JhbSBpcyBub3QgZGVmaW5lZCIgKTsKKyAgICBpZiggbWF4V2lkdGggPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiVHJlc2hvbGQgcGFyYW1ldGVyIG11c3QgYmUgbm9uIG5lZ2F0aXZlIiApOworICAgIAorICAgIGZvcihTaXRlU2V0ID0gVm9yb25vaURpYWdyYW0tPnNpdGVzOworICAgICAgICBTaXRlU2V0ICE9IE5VTEw7CisgICAgICAgIFNpdGVTZXQgPSAoQ3ZTZXQqKVNpdGVTZXQtPmhfbmV4dCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoU2l0ZVNldC0+dl9uZXh0KQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIkNhbid0IG9wZXJhdGUgd2l0aCBtdWx0aWNvbm5lY3RlZCBkb21haW5zIiApOworICAgICAgICAgICAgaWYoU2l0ZVNldC0+dG90YWwgPiA3MDAwMCkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCJDYW4ndCBvcGVyYXRlIHdpdGggbGFyZ2UgZG9tYWlucyIgKTsKKyAgICAgICAgfQorICAgICAgICAgICAgCisKKyAgICBMQ01zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKDApOworICAgIExDTS5FZGdlU3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKExDTXN0b3JhZ2UpOworICAgIExDTS5Db250b3VyU3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKExDTXN0b3JhZ2UpOworICAgIExDTS5HcmFwaCA9IGN2Q3JlYXRlR3JhcGgoQ1ZfU0VRX0tJTkRfR1JBUEh8Q1ZfR1JBUEhfRkxBR19PUklFTlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkdyYXBoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkxDTU5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2TENNRWRnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01zdG9yYWdlKTsKKyAgICBpZighX2N2Q29uc3RydWN0TENNKCZMQ00pKQorICAgICAgICBjdlJlbGVhc2VMaW5lYXJDb250b3JNb2RlbFN0b3JhZ2UoJkxDTS5HcmFwaCk7CisKKyAgICAKKyAgICBfX0VORF9fOworICAgIHJldHVybiBMQ00uR3JhcGg7Cit9Ly9lbmQgb2YgY3ZMaW5lYXJDb250b3JNb2RlbEZyb21Wb3Jvbm9pRGlhZ3JhbQorCitDVl9JTVBMIGludCBjdlJlbGVhc2VMaW5lYXJDb250b3JNb2RlbFN0b3JhZ2UoQ3ZHcmFwaCoqIEdyYXBoKQoreworICAgIEN2U2VxKiBMQ01Ob2RlU2VxLCAqTENNRWRnZVNlcTsKKyAgICBDdkxDTU5vZGUqIHBMQ01Ob2RlOworICAgIEN2TENNRWRnZSogcExDTUVkZ2U7CisKKyAgICAvKkNWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlTGluZWFyQ29udG9yTW9kZWxTdG9yYWdlIiApOyovCisgICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCFHcmFwaCB8fCAhKCpHcmFwaCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgTENNTm9kZVNlcSA9IChDdlNlcSopKCpHcmFwaCk7CisgICAgTENNRWRnZVNlcSA9IChDdlNlcSopKCpHcmFwaCktPmVkZ2VzOworICAgIGlmKExDTU5vZGVTZXEtPnRvdGFsID4gMCkKKyAgICB7CisgICAgICAgIHBMQ01Ob2RlID0gKEN2TENNTm9kZSopY3ZHZXRTZXFFbGVtKExDTU5vZGVTZXEsMCk7CisgICAgICAgIGlmKHBMQ01Ob2RlLT5jb250b3VyLT5zdG9yYWdlKQorICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmcExDTU5vZGUtPmNvbnRvdXItPnN0b3JhZ2UpOworICAgIH0KKyAgICBpZihMQ01FZGdlU2VxLT50b3RhbCA+IDApCisgICAgeworICAgICAgICBwTENNRWRnZSA9IChDdkxDTUVkZ2UqKWN2R2V0U2VxRWxlbShMQ01FZGdlU2VxLDApOworICAgICAgICBpZihwTENNRWRnZS0+Y2hhaW4tPnN0b3JhZ2UpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZwTENNRWRnZS0+Y2hhaW4tPnN0b3JhZ2UpOworICAgIH0KKyAgICBpZigoKkdyYXBoKS0+c3RvcmFnZSkKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmKCpHcmFwaCktPnN0b3JhZ2UpOworICAgICpHcmFwaCA9IE5VTEw7CisKKyAgICAKKyAgICBfX0VORF9fOworICAgIHJldHVybiAxOworfS8vZW5kIG9mIGN2UmVsZWFzZUxpbmVhckNvbnRvck1vZGVsU3RvcmFnZQorCitpbnQgX2N2Q29uc3RydWN0TENNKEN2TENNKiBMQ00pCit7CisgICAgQ3ZWb3Jvbm9pU2l0ZTJEKiBwU2l0ZSA9IDA7CisgICAgQ3ZWb3Jvbm9pRWRnZTJEKiBwRWRnZSA9IDAsICpwRWRnZTE7CisgICAgQ3ZWb3Jvbm9pTm9kZTJEKiBwTm9kZSwgKnBOb2RlMTsKKyAgICAKKyAgICBDdlZvcm9ub2lFZGdlMkQqIExpbmtlZEVkZ2VzWzEwXTsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIExpbmtlZFNpdGVzWzEwXTsKKyAgICAKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZMQ01EYXRhIExDTWRhdGE7CisgICAgaW50IGk7CisKKyAgICBmb3IoQ3ZTZXQqIFNpdGVTZXQgPSBMQ00tPlZvcm9ub2lEaWFncmFtLT5zaXRlczsKKyAgICAgICAgU2l0ZVNldCAhPSBOVUxMOworICAgICAgICBTaXRlU2V0ID0gKEN2U2V0KilTaXRlU2V0LT5oX25leHQpCisgICAgeworICAgICAgICBjdlN0YXJ0UmVhZFNlcSgoQ3ZTZXEqKVNpdGVTZXQsICZyZWFkZXIpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBTaXRlU2V0LT50b3RhbDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBfQ1ZfUkVBRF9TRVFfRUxFTShwU2l0ZSxyZWFkZXIsQ3ZWb3Jvbm9pU2l0ZTJEKik7CisgICAgICAgICAgICBpZihwU2l0ZS0+bm9kZVswXSA9PSBwU2l0ZS0+bm9kZVsxXSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHBFZGdlID0gQ1ZfTEFTVF9WT1JPTk9JRURHRTJEKHBTaXRlKTsKKyAgICAgICAgICAgIHBOb2RlID0gQ1ZfVk9ST05PSUVER0UyRF9CRUdJTk5PREUocEVkZ2UscFNpdGUpOworICAgICAgICAgICAgaWYocE5vZGUtPnJhZGl1cyA+IExDTS0+bWF4V2lkdGgpCisgICAgICAgICAgICAgICAgZ290byBQUkVQQVJFQ09NUExFWE5PREU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBFZGdlMSA9IENWX1BSRVZfVk9ST05PSUVER0UyRChwRWRnZSxwU2l0ZSk7CisgICAgICAgICAgICBwTm9kZTEgPSBDVl9WT1JPTk9JRURHRTJEX0JFR0lOTk9ERShwRWRnZTEscFNpdGUpOworICAgICAgICAgICAgaWYocE5vZGUxLT5yYWRpdXMgPiBMQ00tPm1heFdpZHRoKQorICAgICAgICAgICAgICAgIGdvdG8gUFJFUEFSRUNPTVBMRVhOT0RFOworICAgICAgICAgICAgaWYocE5vZGUxLT5yYWRpdXMgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKF9jdk5vZGVNdWx0eXBsaWNpdHkocFNpdGUsIHBFZGdlLHBOb2RlLExpbmtlZEVkZ2VzLExpbmtlZFNpdGVzKSA9PSAxKQorICAgICAgICAgICAgICAgIGdvdG8gUFJFUEFSRVNJTVBMRU5PREU7CisgICAgICAgIH0KKy8vIHRyZWF0ZSB0cmlhbmdsZSBvciByZWd1bGFyIHBvbHlnb24KKyAgICAgICAgX0NWX0lOSVRJQUxJWkVfQ1ZMQ01EQVRBKCZMQ01kYXRhLHBTaXRlLHBFZGdlLENWX1ZPUk9OT0lFREdFMkRfRU5ETk9ERShwRWRnZSxwU2l0ZSkpOworICAgICAgICBpZighX2N2VHJlYXRFeGVwdGlvbmFsQ2FzZShMQ00sJkxDTWRhdGEpKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNvbnRpbnVlOworCitQUkVQQVJFQ09NUExFWE5PREU6CisgICAgICAgIF9DVl9JTklUSUFMSVpFX0NWTENNREFUQSgmTENNZGF0YSxwU2l0ZSxwRWRnZSxDVl9WT1JPTk9JRURHRTJEX0VORE5PREUocEVkZ2UscFNpdGUpKTsKKyAgICAgICAgaWYoIV9jdkNvbnN0cnVjdExDTUNvbXBsZXhOb2RlKExDTSxOVUxMLCZMQ01kYXRhKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCitQUkVQQVJFU0lNUExFTk9ERToKKyAgICAgICAgX0NWX0lOSVRJQUxJWkVfQ1ZMQ01EQVRBKCZMQ01kYXRhLHBTaXRlLHBFZGdlLENWX1ZPUk9OT0lFREdFMkRfRU5ETk9ERShwRWRnZSxwU2l0ZSkpOworICAgICAgICBpZighX2N2Q29uc3RydWN0TENNU2ltcGxlTm9kZShMQ00sTlVMTCwmTENNZGF0YSkpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY29udGludWU7CisgICAgfQorICAgIHJldHVybiAxOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdExDTQorCitDdkxDTU5vZGUqIF9jdkNvbnN0cnVjdExDTUNvbXBsZXhOb2RlKEN2TENNKiBwTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkxDTUVkZ2UqIHBMQ01FZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkxDTURhdGEqIHBMQ01JbnB1dERhdGEpCit7CisgICAgQ3ZMQ01Ob2RlKiBwTENNTm9kZTsKKyAgICBDdkxDTUVkZ2UqIHBMQ01FZGdlX3ByZXYgPSBOVUxMOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIHBTaXRlLCAqcFNpdGVfZmlyc3QsICpwU2l0ZV9sYXN0OworICAgIEN2Vm9yb25vaUVkZ2UyRCogcEVkZ2UsICpwRWRnZV9zdG9wOworICAgIEN2Vm9yb25vaU5vZGUyRCogcE5vZGUwLCAqcE5vZGUxOworICAgIEN2TENNRGF0YSBMQ01PdXRwdXREYXRhOworICAgIEN2TENNQ29tcGxleE5vZGVEYXRhIExDTUNDTkRhdGE7CisgICAgaW50IGluZGV4ID0gMDsKKyAgICAKKyAgICBfY3ZQcmVwYXJlRGF0YSgmTENNQ0NORGF0YSxwTENNSW5wdXREYXRhKTsKKworICAgIHBMQ01Ob2RlID0gX2N2Q3JlYXRlTENNTm9kZShwTENNKTsKKyAgICBfY3ZBdHRhY2hMQ01FZGdlVG9MQ01Ob2RlKHBMQ01Ob2RlLHBMQ01FZGdlLHBMQ01FZGdlX3ByZXYsMSwxKTsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoKEN2U2VxKilwTENNTm9kZS0+Y29udG91ciwmd3JpdGVyKTsKKyAgICBDVl9XUklURV9TRVFfRUxFTShMQ01DQ05EYXRhLnNpdGVfbGFzdF9wdCwgd3JpdGVyKTsKKyAgICBpbmRleCsrOworCisgICAgaWYocExDTUVkZ2UpCisgICAgeworICAgICAgICBDVl9XUklURV9TRVFfRUxFTShMQ01DQ05EYXRhLmVkZ2Vfbm9kZS5wdCwgd3JpdGVyICk7CisgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKExDTUNDTkRhdGEuc2l0ZV9maXJzdF9wdCwgd3JpdGVyICk7CisgICAgICAgIGluZGV4Kz0yOworICAgIH0KKworICAgIHBTaXRlX2ZpcnN0ID0gTENNQ0NORGF0YS5zaXRlX2ZpcnN0OyAKKyAgICBwU2l0ZV9sYXN0ID0gTENNQ0NORGF0YS5zaXRlX2xhc3Q7CisgICAgcEVkZ2UgPSBMQ01DQ05EYXRhLmVkZ2U7CisKKyAgICBmb3IocFNpdGUgPSBwU2l0ZV9maXJzdDsgCisgICAgICAgIHBTaXRlICE9IHBTaXRlX2xhc3Q7CisgICAgICAgIHBTaXRlID0gQ1ZfTkVYVF9WT1JPTk9JU0lURTJEKHBTaXRlKSwKKyAgICAgICAgcEVkZ2UgPSBDVl9QUkVWX1ZPUk9OT0lFREdFMkQoQ1ZfTEFTVF9WT1JPTk9JRURHRTJEKHBTaXRlKSxwU2l0ZSkpCisgICAgeworICAgICAgICBwRWRnZV9zdG9wID0gQ1ZfRklSU1RfVk9ST05PSUVER0UyRChwU2l0ZSk7CisgICAgICAgIGZvcig7cEVkZ2UgJiYgcEVkZ2UgIT0gcEVkZ2Vfc3RvcDsKKyAgICAgICAgICAgICBwRWRnZSA9IENWX1BSRVZfVk9ST05PSUVER0UyRChwRWRnZSxwU2l0ZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBOb2RlMCA9IENWX1ZPUk9OT0lFREdFMkRfQkVHSU5OT0RFKHBFZGdlLHBTaXRlKTsKKyAgICAgICAgICAgIHBOb2RlMSA9IENWX1ZPUk9OT0lFREdFMkRfRU5ETk9ERShwRWRnZSxwU2l0ZSk7CisgICAgICAgICAgICBpZihwTm9kZTAtPnJhZGl1cyA8PSBwTENNLT5tYXhXaWR0aCAmJiBwTm9kZTEtPnJhZGl1cyA8PSBwTENNLT5tYXhXaWR0aCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBfQ1ZfSU5JVElBTElaRV9DVkxDTURBVEEoJkxDTU91dHB1dERhdGEscFNpdGUscEVkZ2UscE5vZGUxKTsKKyAgICAgICAgICAgICAgICBfY3ZQcmVwYXJlRGF0YSgmTENNQ0NORGF0YSwmTENNT3V0cHV0RGF0YSk7CisgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oTENNQ0NORGF0YS5zaXRlX2ZpcnN0X3B0LCB3cml0ZXIpOworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKExDTUNDTkRhdGEuZWRnZV9ub2RlLnB0LCB3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICBpbmRleCs9MjsKKyAgICAgICAgICAgICAgICBwTENNRWRnZSA9IF9jdkNvbnN0cnVjdExDTUVkZ2UocExDTSwmTENNT3V0cHV0RGF0YSk7CisgICAgICAgICAgICAgICAgX2N2QXR0YWNoTENNRWRnZVRvTENNTm9kZShwTENNTm9kZSxwTENNRWRnZSxwTENNRWRnZV9wcmV2LGluZGV4IC0gMSwwKTsKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTShMQ01DQ05EYXRhLnNpdGVfbGFzdF9wdCwgd3JpdGVyKTsKKyAgICAgICAgICAgICAgICBpbmRleCsrOworCisgICAgICAgICAgICAgICAgcFNpdGUgPSBDVl9UV0lOX1ZPUk9OT0lTSVRFMkQocFNpdGUscEVkZ2UpOworICAgICAgICAgICAgICAgIHBFZGdlX3N0b3AgPSBDVl9GSVJTVF9WT1JPTk9JRURHRTJEKHBTaXRlKTsKKyAgICAgICAgICAgICAgICBpZihwU2l0ZSA9PSBwU2l0ZV9sYXN0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZihwU2l0ZSA9PSBwU2l0ZV9sYXN0KQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0ocFNpdGUtPm5vZGVbMV0tPnB0LCB3cml0ZXIpOworICAgICAgICBpbmRleCsrOworICAgIH0KKworICAgIGlmKHBMQ01FZGdlX3ByZXYpCisgICAgICAgIHBMQ01FZGdlX3ByZXYtPm5leHRbKHBMQ01FZGdlX3ByZXYgPT0gKEN2TENNRWRnZSopcExDTU5vZGUtPmZpcnN0KV0gPSBwTENNTm9kZS0+Zmlyc3Q7CisgICAgY3ZFbmRXcml0ZVNlcSgmd3JpdGVyKTsKKyAgICByZXR1cm4gcExDTU5vZGU7Cit9Ly9lbmQgb2YgX2N2Q29uc3RydWN0TENNQ29tcGxleE5vZGUKKworQ3ZMQ01Ob2RlKiBfY3ZDb25zdHJ1Y3RMQ01TaW1wbGVOb2RlKEN2TENNKiBwTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TENNRWRnZSogcExDTUVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01EYXRhKiBwTENNSW5wdXREYXRhKQoreworICAgIEN2Vm9yb25vaUVkZ2UyRCogcEVkZ2UgPSBwTENNSW5wdXREYXRhLT5wZWRnZTsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIHBTaXRlID0gcExDTUlucHV0RGF0YS0+cHNpdGU7CisgICAgQ3ZWb3Jvbm9pTm9kZTJEKiBwTm9kZSA9IENWX1ZPUk9OT0lFREdFMkRfQkVHSU5OT0RFKHBFZGdlLHBTaXRlKTsKKworICAgIEN2Vm9yb25vaUVkZ2UyRCogTGlua2VkRWRnZXNbMTBdOworICAgIEN2Vm9yb25vaVNpdGUyRCogTGlua2VkU2l0ZXNbMTBdOworICAgIGludCBtdWx0eXBsaWNpdHkgPSBfY3ZOb2RlTXVsdHlwbGljaXR5KHBTaXRlLHBFZGdlLHBOb2RlLExpbmtlZEVkZ2VzLExpbmtlZFNpdGVzKTsKKyAgICBpZihtdWx0eXBsaWNpdHkgPT0gMikKKyAgICB7CisgICAgICAgIHBMQ01JbnB1dERhdGEtPnBlZGdlID0gTGlua2VkRWRnZXNbMV07CisgICAgICAgIHBMQ01JbnB1dERhdGEtPnBzaXRlID0gQ1ZfVFdJTl9WT1JPTk9JU0lURTJEKExpbmtlZFNpdGVzWzFdLExpbmtlZEVkZ2VzWzFdKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIAorICAgIEN2TENNRWRnZSogcExDTUVkZ2VfcHJldiA9IE5VTEw7CisgICAgQ3ZMQ01Ob2RlKiBwTENNTm9kZTsKKyAgICBDdkxDTURhdGEgTENNT3V0cHV0RGF0YTsKKworICAgIHBMQ01Ob2RlID0gX2N2Q3JlYXRlTENNTm9kZShwTENNKTsKKyAgICBjdlNlcVB1c2goKEN2U2VxKilwTENNTm9kZS0+Y29udG91ciwmcE5vZGUtPnB0KTsKKyAgICBfY3ZBdHRhY2hMQ01FZGdlVG9MQ01Ob2RlKHBMQ01Ob2RlLHBMQ01FZGdlLHBMQ01FZGdlX3ByZXYsMCwxKTsKKworICAgIGZvcihpbnQgaSA9IChpbnQpKHBMQ01FZGdlICE9IE5VTEwpO2kgPCBtdWx0eXBsaWNpdHk7IGkrKykKKyAgICB7CisgICAgICAgIHBFZGdlID0gTGlua2VkRWRnZXNbaV07CisgICAgICAgIHBTaXRlID0gTGlua2VkU2l0ZXNbaV07CisgICAgICAgIF9DVl9JTklUSUFMSVpFX0NWTENNREFUQSgmTENNT3V0cHV0RGF0YSxDVl9UV0lOX1ZPUk9OT0lTSVRFMkQocFNpdGUscEVkZ2UpLHBFZGdlLHBOb2RlKTsKKyAgICAgICAgcExDTUVkZ2UgPSBfY3ZDb25zdHJ1Y3RMQ01FZGdlKHBMQ00sJkxDTU91dHB1dERhdGEpOworICAgICAgICBfY3ZBdHRhY2hMQ01FZGdlVG9MQ01Ob2RlKHBMQ01Ob2RlLHBMQ01FZGdlLHBMQ01FZGdlX3ByZXYsMCwwKTsKKyAgICB9CisgICAgcExDTUVkZ2VfcHJldi0+bmV4dFsocExDTUVkZ2VfcHJldiA9PSAoQ3ZMQ01FZGdlKilwTENNTm9kZS0+Zmlyc3QpXSA9IHBMQ01Ob2RlLT5maXJzdDsKKyAgICByZXR1cm4gcExDTU5vZGU7Cit9Ly9lbmQgb2YgX2N2Q29uc3RydWN0TENNU2ltcGxlTm9kZQorCitDdkxDTUVkZ2UqIF9jdkNvbnN0cnVjdExDTUVkZ2UoQ3ZMQ00qIHBMQ00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01EYXRhKiBwTENNSW5wdXREYXRhKQoreworICAgIEN2Vm9yb25vaUVkZ2UyRCogcEVkZ2UgPSBwTENNSW5wdXREYXRhLT5wZWRnZTsKKyAgICBDdlZvcm9ub2lTaXRlMkQqIHBTaXRlID0gcExDTUlucHV0RGF0YS0+cHNpdGU7CisgICAgZmxvYXQgd2lkdGggPSAwOworCisgICAgQ3ZMQ01EYXRhIExDTURhdGE7CisgICAgQ3ZWb3Jvbm9pTm9kZTJEKiBwTm9kZTAsKnBOb2RlMTsKKworICAgIEN2TENNRWRnZSogcExDTUVkZ2UgPSBfY3ZDcmVhdGVMQ01FZGdlKHBMQ00pOworICAgIAorICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEocExDTUVkZ2UtPmNoYWluLCZ3cml0ZXIgKTsKKworICAgIHBOb2RlMCA9IHBOb2RlMSA9IHBMQ01JbnB1dERhdGEtPnBub2RlOworICAgIENWX1dSSVRFX1NFUV9FTEVNKHBOb2RlMC0+cHQsIHdyaXRlcik7CisgICAgd2lkdGggKz0gcE5vZGUwLT5yYWRpdXM7CisKKyAgICBmb3IoaW50IGNvdW50ZXIgPSAwOworICAgICAgICAgICAgY291bnRlciA8IHBMQ00tPlZvcm9ub2lEaWFncmFtLT5lZGdlcy0+dG90YWw7CisgICAgICAgICAgICBjb3VudGVyKyspCisgICAgeworICAgICAgICBwTm9kZTEgPSBDVl9WT1JPTk9JRURHRTJEX0JFR0lOTk9ERShwRWRnZSxwU2l0ZSk7CisgICAgICAgIGlmKHBOb2RlMS0+cmFkaXVzID49IHBMQ00tPm1heFdpZHRoKQorICAgICAgICAgICAgZ290byBDUkVBVEVDT01QTEVYTk9ERTsKKworICAgICAgICBDVl9XUklURV9TRVFfRUxFTShwTm9kZTEtPnB0LHdyaXRlcik7CisgICAgICAgIHdpZHRoICs9IHBOb2RlMS0+cmFkaXVzOworICAgICAgICBfQ1ZfSU5JVElBTElaRV9DVkxDTURBVEEoJkxDTURhdGEscFNpdGUscEVkZ2UscE5vZGUxKTsKKyAgICAgICAgaWYoX2N2Q29uc3RydWN0TENNU2ltcGxlTm9kZShwTENNLHBMQ01FZGdlLCZMQ01EYXRhKSkKKyAgICAgICAgICAgIGdvdG8gTENNRURHRUVYSVQ7CisKKyAgICAgICAgcEVkZ2UgPSBMQ01EYXRhLnBlZGdlOyBwU2l0ZSA9IExDTURhdGEucHNpdGU7CisgICAgICAgIHBOb2RlMCA9IHBOb2RlMTsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7CisKK0NSRUFURUNPTVBMRVhOT0RFOgorICAgIF9DVl9JTklUSUFMSVpFX0NWTENNREFUQSgmTENNRGF0YSxwU2l0ZSxwRWRnZSxwTm9kZTApOworICAgIENWX1dSSVRFX1NFUV9FTEVNKExDTURhdGEucG5vZGUtPnB0LHdyaXRlcik7CisgICAgd2lkdGggKz0gTENNRGF0YS5wbm9kZS0+cmFkaXVzOworICAgIF9jdkNvbnN0cnVjdExDTUNvbXBsZXhOb2RlKHBMQ00scExDTUVkZ2UsJkxDTURhdGEpOworCitMQ01FREdFRVhJVDoKKyAgICBjdkVuZFdyaXRlU2VxKCZ3cml0ZXIpOworICAgIHBMQ01FZGdlLT53aWR0aCA9IHdpZHRoL3BMQ01FZGdlLT5jaGFpbi0+dG90YWw7CisgICAgcmV0dXJuIHBMQ01FZGdlOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdExDTUVkZ2UKKworQ3ZMQ01Ob2RlKiBfY3ZUcmVhdEV4ZXB0aW9uYWxDYXNlKEN2TENNKiBwTENNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TENNRGF0YSogcExDTUlucHV0RGF0YSkKK3sKKyAgICBDdlZvcm9ub2lFZGdlMkQqIHBFZGdlID0gcExDTUlucHV0RGF0YS0+cGVkZ2U7CisgICAgQ3ZWb3Jvbm9pU2l0ZTJEKiBwU2l0ZSA9IHBMQ01JbnB1dERhdGEtPnBzaXRlOworICAgIEN2Vm9yb25vaU5vZGUyRCogcE5vZGUgPSBDVl9WT1JPTk9JRURHRTJEX0JFR0lOTk9ERShwRWRnZSxwU2l0ZSk7CisgICAgQ3ZMQ01Ob2RlKiBwTENNTm9kZSA9IF9jdkNyZWF0ZUxDTU5vZGUocExDTSk7CisgICAgY3ZTZXFQdXNoKChDdlNlcSopcExDTU5vZGUtPmNvbnRvdXIsJnBOb2RlLT5wdCk7CisgICAgcmV0dXJuIHBMQ01Ob2RlOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdExDTUVkZ2UKKworQ1ZfSU5MSU5FCitDdkxDTU5vZGUqIF9jdkNyZWF0ZUxDTU5vZGUoQ3ZMQ00qIHBMQ00pCit7CisgICAgQ3ZMQ01Ob2RlKiBwTENNTm9kZTsKKyAgICBjdlNldEFkZCgoQ3ZTZXQqKXBMQ00tPkdyYXBoLCBOVUxMLCAoQ3ZTZXRFbGVtKiopJnBMQ01Ob2RlICk7CisgICAgcExDTU5vZGUtPmNvbnRvdXIgPSAoQ3ZDb250b3VyKiljdkNyZWF0ZVNlcSgwLCBzaXplb2YoQ3ZDb250b3VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdlBvaW50MkQzMmYpLHBMQ00tPkNvbnRvdXJTdG9yYWdlKTsKKyAgICBwTENNTm9kZS0+Zmlyc3QgPSBOVUxMOworICAgIHJldHVybiBwTENNTm9kZTsKK30vL2VuZCBvZiBfY3ZDcmVhdGVMQ01Ob2RlCisKK0NWX0lOTElORQorQ3ZMQ01FZGdlKiBfY3ZDcmVhdGVMQ01FZGdlKEN2TENNKiBwTENNKQoreworICAgIEN2TENNRWRnZSogcExDTUVkZ2U7CisgICAgY3ZTZXRBZGQoIChDdlNldCopKHBMQ00tPkdyYXBoLT5lZGdlcyksIDAsIChDdlNldEVsZW0qKikmcExDTUVkZ2UgKTsKKyAgICBwTENNRWRnZS0+Y2hhaW4gPSBjdkNyZWF0ZVNlcSgwLCBzaXplb2YoQ3ZTZXEpLHNpemVvZihDdlBvaW50MkQzMmYpLHBMQ00tPkVkZ2VTdG9yYWdlKTsKKyAgICBwTENNRWRnZS0+bmV4dFswXSA9IHBMQ01FZGdlLT5uZXh0WzFdID0gTlVMTDsKKyAgICBwTENNRWRnZS0+dnR4WzBdID0gIHBMQ01FZGdlLT52dHhbMV0gPSBOVUxMOworICAgIHBMQ01FZGdlLT5pbmRleDEgPSAgcExDTUVkZ2UtPmluZGV4MiA9IC0xOworICAgIHJldHVybiBwTENNRWRnZTsKK30vL2VuZCBvZiBfY3ZDcmVhdGVMQ01FZGdlCisKK0NWX0lOTElORQordm9pZCBfY3ZBdHRhY2hMQ01FZGdlVG9MQ01Ob2RlKEN2TENNTm9kZSogTENNTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkxDTUVkZ2UqIExDTUVkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMQ01FZGdlKiAmTENNRWRnZV9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSkKK3sKKyAgICBpZighTENNRWRnZSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmKGk9PTApCisgICAgICAgIExDTUVkZ2UtPmluZGV4MSA9IGluZGV4OworICAgIGVsc2UKKyAgICAgICAgTENNRWRnZS0+aW5kZXgyID0gaW5kZXg7CisKKyAgICBMQ01FZGdlLT52dHhbaV0gPSAoQ3ZHcmFwaFZ0eCopTENNTm9kZTsKKyAgICBpZighTENNRWRnZV9wcmV2KQorICAgICAgICBMQ01Ob2RlLT5maXJzdCA9IChDdkdyYXBoRWRnZSopTENNRWRnZTsKKyAgICBlbHNlCisvLyAgICAgIExDTUVkZ2VfcHJldi0+bmV4dFsoTENNRWRnZV9wcmV2ID09IChDdkxDTUVkZ2UqKUxDTU5vZGUtPmZpcnN0KV0gPSAoQ3ZHcmFwaEVkZ2UqKUxDTUVkZ2U7CisgICAgICAgIExDTUVkZ2VfcHJldi0+bmV4dFsoTENNRWRnZV9wcmV2LT52dHhbMF0gIT0gKEN2R3JhcGhWdHgqKUxDTU5vZGUpXSA9IChDdkdyYXBoRWRnZSopTENNRWRnZTsKKworICAgIExDTUVkZ2UtPm5leHRbaV0gPSBMQ01Ob2RlLT5maXJzdDsKKyAgICBMQ01FZGdlX3ByZXYgPSBMQ01FZGdlOworfS8vZW5kIG9mIF9jdkF0dGFjaExDTUVkZ2VUb0xDTU5vZGUKKworCitpbnQgX2N2Tm9kZU11bHR5cGxpY2l0eShDdlZvcm9ub2lTaXRlMkQqIHBTaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRWRnZTJEKiBwRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaU5vZGUyRCogcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lFZGdlMkQqKiBMaW5rZWRFZGdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaVNpdGUyRCoqIExpbmtlZFNpdGVzKQoreworICAgIGlmKCFwTm9kZS0+cmFkaXVzKQorICAgICAgICByZXR1cm4gLTE7IAorICAgIGFzc2VydChwTm9kZSA9PSBDVl9WT1JPTk9JRURHRTJEX0JFR0lOTk9ERShwRWRnZSxwU2l0ZSkpOworCisgICAgaW50IG11bHR5cGxpY2l0eSA9IDA7CisgICAgQ3ZWb3Jvbm9pRWRnZTJEKiBwRWRnZV9jdXIgPSBwRWRnZTsKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYocEVkZ2VfY3VyLT5ub2RlWzBdLT5yYWRpdXMgJiYgcEVkZ2VfY3VyLT5ub2RlWzFdLT5yYWRpdXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIExpbmtlZEVkZ2VzW211bHR5cGxpY2l0eV0gPSBwRWRnZV9jdXI7CisgICAgICAgICAgICBMaW5rZWRTaXRlc1ttdWx0eXBsaWNpdHldID0gcFNpdGU7CisgICAgICAgICAgICBtdWx0eXBsaWNpdHkrKzsKKyAgICAgICAgfQorICAgICAgICBwRWRnZV9jdXIgPSBDVl9QUkVWX1ZPUk9OT0lFREdFMkQocEVkZ2VfY3VyLHBTaXRlKTsKKyAgICAgICAgcFNpdGUgPSBDVl9UV0lOX1ZPUk9OT0lTSVRFMkQocFNpdGUscEVkZ2VfY3VyKTsKKyAgICB9d2hpbGUocEVkZ2VfY3VyICE9IHBFZGdlKTsKKyAgICByZXR1cm4gbXVsdHlwbGljaXR5OworfS8vZW5kIG9mIF9jdk5vZGVNdWx0eXBsaWNpdHkKKworCitDVl9JTkxJTkUKK3ZvaWQgX2N2UHJlcGFyZURhdGEoQ3ZMQ01Db21wbGV4Tm9kZURhdGEqIHBMQ01DQ05EYXRhLAorICAgICAgICAgICAgICAgICAgICBDdkxDTURhdGEqIHBMQ01EYXRhKQoreworICAgIHBMQ01DQ05EYXRhLT5zaXRlX2ZpcnN0ID0gcExDTURhdGEtPnBzaXRlOworICAgIHBMQ01DQ05EYXRhLT5zaXRlX2xhc3QgPSBDVl9UV0lOX1ZPUk9OT0lTSVRFMkQocExDTURhdGEtPnBzaXRlLHBMQ01EYXRhLT5wZWRnZSk7CisgICAgaWYocExDTURhdGEtPnBlZGdlID09IENWX0xBU1RfVk9ST05PSUVER0UyRChwTENNRGF0YS0+cHNpdGUpKQorICAgIHsKKyAgICAgICAgcExDTUNDTkRhdGEtPmVkZ2UgPSBDVl9QUkVWX1ZPUk9OT0lFREdFMkQocExDTURhdGEtPnBlZGdlLHBMQ01EYXRhLT5wc2l0ZSk7CisgICAgICAgIHBMQ01DQ05EYXRhLT5lZGdlX25vZGUgPSAqcExDTURhdGEtPnBub2RlOworICAgICAgICBwTENNQ0NORGF0YS0+c2l0ZV9maXJzdF9wdCA9IHBMQ01EYXRhLT5wc2l0ZS0+bm9kZVswXS0+cHQ7CisgICAgICAgIHBMQ01DQ05EYXRhLT5zaXRlX2xhc3RfcHQgPSBwTENNRGF0YS0+cHNpdGUtPm5vZGVbMF0tPnB0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwTENNQ0NORGF0YS0+ZWRnZSA9IHBMQ01EYXRhLT5wZWRnZTsKKyAgICAgICAgcExDTUNDTkRhdGEtPmVkZ2Vfbm9kZSA9ICpwTENNRGF0YS0+cG5vZGU7CisgICAgICAgIF9jdlByb2plY3Rpb25Qb2ludFRvU2VnbWVudCgmcExDTUNDTkRhdGEtPmVkZ2Vfbm9kZS5wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExDTUNDTkRhdGEtPnNpdGVfZmlyc3QtPm5vZGVbMF0tPnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTENNQ0NORGF0YS0+c2l0ZV9maXJzdC0+bm9kZVsxXS0+cHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMQ01DQ05EYXRhLT5zaXRlX2ZpcnN0X3B0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBfY3ZQcm9qZWN0aW9uUG9pbnRUb1NlZ21lbnQoJnBMQ01DQ05EYXRhLT5lZGdlX25vZGUucHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBMQ01DQ05EYXRhLT5zaXRlX2xhc3QtPm5vZGVbMF0tPnB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwTENNQ0NORGF0YS0+c2l0ZV9sYXN0LT5ub2RlWzFdLT5wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcExDTUNDTkRhdGEtPnNpdGVfbGFzdF9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICB9Cit9Ly9lbmQgb2YgX2N2UHJlcGFyZURhdGEKKworCit2b2lkIF9jdlByb2plY3Rpb25Qb2ludFRvU2VnbWVudChDdlBvaW50MkQzMmYqIFBvaW50TywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogUG9pbnRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBQb2ludEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIFByUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZGlzdCkKK3sKKyAgICBmbG9hdCBzY2FsX0FPX0FCLCBzY2FsX0FCX0FCOworICAgIEN2UG9pbnQyRDMyZiBWZWN0b3JBQiA9IHtQb2ludEItPnggLSBQb2ludEEtPngsIFBvaW50Qi0+eSAtIFBvaW50QS0+eX07CisgICAgc2NhbF9BQl9BQiA9IFZlY3RvckFCLngqVmVjdG9yQUIueCArIFZlY3RvckFCLnkqVmVjdG9yQUIueTsKKyAgICBpZihzY2FsX0FCX0FCIDwgTENNX0NPTlNUX1pFUk8pCisgICAgeworICAgICAgICAqUHJQb2ludCA9ICpQb2ludEE7CisgICAgICAgIGlmKGRpc3QpCisgICAgICAgICAgICAqZGlzdCA9IChmbG9hdClzcXJ0KCAoZG91YmxlKShQb2ludE8tPnggLVBvaW50QS0+eCkqKFBvaW50Ty0+eCAtUG9pbnRBLT54KSArIChQb2ludE8tPnkgLSBQb2ludEEtPnkpKihQb2ludE8tPnkgLSBQb2ludEEtPnkpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEN2UG9pbnQyRDMyZiBWZWN0b3JBTyA9IHtQb2ludE8tPnggLSBQb2ludEEtPngsIFBvaW50Ty0+eSAtIFBvaW50QS0+eX07CisgICAgc2NhbF9BT19BQiA9IFZlY3RvckFPLngqVmVjdG9yQUIueCArIFZlY3RvckFPLnkqVmVjdG9yQUIueTsKKworICAgIGlmKGRpc3QpCisgICAgeworICAgICAgICBmbG9hdCB2ZWN0b3JfQU9fQUIgPSAoZmxvYXQpZmFicyhWZWN0b3JBTy54KlZlY3RvckFCLnkgLSBWZWN0b3JBTy55KlZlY3RvckFCLngpOworICAgICAgICAqZGlzdCA9IChmbG9hdCkodmVjdG9yX0FPX0FCL3NxcnQoKGRvdWJsZSlzY2FsX0FCX0FCKSk7CisgICAgfQorCisgICAgZmxvYXQgYWxmYSA9IHNjYWxfQU9fQUIvc2NhbF9BQl9BQjsKKyAgICBQclBvaW50LT54ID0gUG9pbnRPLT54IC0gVmVjdG9yQU8ueCArIGFsZmEqVmVjdG9yQUIueDsKKyAgICBQclBvaW50LT55ID0gUG9pbnRPLT55IC0gVmVjdG9yQU8ueSArIGFsZmEqVmVjdG9yQUIueTsKKyAgICByZXR1cm47Cit9Ly9lbmQgb2YgX2N2UHJvamVjdGlvblBvaW50VG9TZWdtZW50CisKKworCisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmxlZS5jcHAgYi9jdmF1eC9zcmMvY3ZsZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZGIwZDAKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZsZWUuY3BwCkBAIC0wLDAgKzEsNDcxOCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qIFJlY29uc3RydWN0aW9uIG9mIGNvbnRvdXIgc2tlbGV0b24gKi8KKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNkZWZpbmUgTkVYVF9TRVEoc2VxLHNlcV9maXJzdCkgKChzZXEpID09IChzZXFfZmlyc3QpID8gc2VxLT52X25leHQgOiBzZXEtPmhfbmV4dCkKKyNkZWZpbmUgU0lHTih4KSAoIHg8MCA/IC0xOiggeD4wID8gMTowICkgKQorCitjb25zdCBmbG9hdCBMRUVfQ09OU1RfWkVSTyA9IDFlLTZmOworY29uc3QgZmxvYXQgTEVFX0NPTlNUX0RJRkZfUE9JTlRTID0gMWUtMmY7Citjb25zdCBmbG9hdCBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUiA9IDFlLTRmOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXhpbGlhcnkgc3RydWN0IGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdHJ1Y3QgQ3ZMZWVQb2ludAoreworICAgIFQgeCx5OworfTsKKwordHlwZWRlZiBDdkxlZVBvaW50PGZsb2F0PiBDdlBvaW50RmxvYXQ7Cit0eXBlZGVmIEN2TGVlUG9pbnQ8ZmxvYXQ+IEN2RGlyZWN0aW9uOworCitzdHJ1Y3QgQ3ZWb3Jvbm9pU2l0ZUludDsKK3N0cnVjdCBDdlZvcm9ub2lFZGdlSW50Oworc3RydWN0IEN2Vm9yb25vaU5vZGVJbnQ7CitzdHJ1Y3QgQ3ZWb3Jvbm9pUGFyYWJvbGFJbnQ7CitzdHJ1Y3QgQ3ZWb3Jvbm9pQ2hhaW5JbnQ7CitzdHJ1Y3QgQ3ZWb3Jvbm9pSG9sZUludDsKKworc3RydWN0IEN2Vm9yb25vaURpYWdyYW1JbnQKK3sKKyAgICBDdlNlcSogU2l0ZVNlcTsKKyAgICBDdlNlcSogRWRnZVNlcTsKKyAgICBDdlNlcSogTm9kZVNlcTsKKyAgICBDdlNlcSogQ2hhaW5TZXE7CisgICAgQ3ZTZXEqIFBhcmFib2xhU2VxOworICAgIEN2U2VxKiBEaXJlY3Rpb25TZXE7CisgICAgQ3ZTZXEqIEhvbGVTZXE7CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCogcmVmbGV4X3NpdGU7CisgICAgQ3ZWb3Jvbm9pSG9sZUludCogdG9wX2hvbGU7Cit9OworCitzdHJ1Y3QgQ3ZWb3Jvbm9pU3RvcmFnZUludAoreworICAgIEN2TWVtU3RvcmFnZSogU2l0ZVN0b3JhZ2U7CisgICAgQ3ZNZW1TdG9yYWdlKiBFZGdlU3RvcmFnZTsKKyAgICBDdk1lbVN0b3JhZ2UqIE5vZGVTdG9yYWdlOworICAgIEN2TWVtU3RvcmFnZSogQ2hhaW5TdG9yYWdlOworICAgIEN2TWVtU3RvcmFnZSogUGFyYWJvbGFTdG9yYWdlOworICAgIEN2TWVtU3RvcmFnZSogRGlyZWN0aW9uU3RvcmFnZTsKKyAgICBDdk1lbVN0b3JhZ2UqIEhvbGVTdG9yYWdlOworfTsKKworc3RydWN0IEN2Vm9yb25vaU5vZGVJbnQKK3sKKyAgICBDdlBvaW50RmxvYXQgIG5vZGU7CisgICAgZmxvYXQgICAgICAgICByYWRpdXM7Cit9OworCitzdHJ1Y3QgQ3ZWb3Jvbm9pU2l0ZUludAoreworICAgIEN2Vm9yb25vaU5vZGVJbnQqIG5vZGUxOworICAgIEN2Vm9yb25vaU5vZGVJbnQqIG5vZGUyOworICAgIEN2Vm9yb25vaUVkZ2VJbnQqIGVkZ2UxOworICAgIEN2Vm9yb25vaUVkZ2VJbnQqIGVkZ2UyOworICAgIEN2Vm9yb25vaVNpdGVJbnQqIG5leHRfc2l0ZTsKKyAgICBDdlZvcm9ub2lTaXRlSW50KiBwcmV2X3NpdGU7CisgICAgQ3ZEaXJlY3Rpb24qIGRpcmVjdGlvbjsKK307CisKK3N0cnVjdCBDdlZvcm9ub2lFZGdlSW50Cit7CisgICAgQ3ZWb3Jvbm9pTm9kZUludCogbm9kZTE7CisgICAgQ3ZWb3Jvbm9pTm9kZUludCogbm9kZTI7CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCogc2l0ZTsKKyAgICBDdlZvcm9ub2lFZGdlSW50KiBuZXh0X2VkZ2U7CisgICAgQ3ZWb3Jvbm9pRWRnZUludCogcHJldl9lZGdlOworICAgIEN2Vm9yb25vaUVkZ2VJbnQqIHR3aW5fZWRnZTsKKyAgICBDdlZvcm9ub2lQYXJhYm9sYUludCogcGFyYWJvbGE7CisgICAgQ3ZEaXJlY3Rpb24qICBkaXJlY3Rpb247Cit9OworCitzdHJ1Y3QgQ3ZWb3Jvbm9pUGFyYWJvbGFJbnQKK3sKKyAgICBmbG9hdCBtYXBbNl07CisgICAgZmxvYXQgYTsKKyAgICBDdlZvcm9ub2lOb2RlSW50KiBmb2N1czsKKyAgICBDdlZvcm9ub2lTaXRlSW50KiBkaXJlY3RyaWNlOworfTsKKworc3RydWN0IEN2Vm9yb25vaUNoYWluSW50Cit7CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCAqIGZpcnN0X3NpdGU7CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCAqIGxhc3Rfc2l0ZTsKKyAgICBDdlZvcm9ub2lDaGFpbkludCogbmV4dF9jaGFpbjsKK307CisKK3N0cnVjdCBDdlZvcm9ub2lIb2xlSW50Cit7CisgICAgQ3ZTZXEqIFNpdGVTZXE7CisgICAgQ3ZTZXEqIENoYWluU2VxOworICAgIEN2Vm9yb25vaVNpdGVJbnQqIHNpdGVfdG9wOworICAgIEN2Vm9yb25vaVNpdGVJbnQqIHNpdGVfbmVhcmVzdDsKKyAgICBDdlZvcm9ub2lTaXRlSW50KiBzaXRlX29wcG9zaXRlOworICAgIEN2Vm9yb25vaU5vZGVJbnQqIG5vZGU7CisgICAgQ3ZWb3Jvbm9pSG9sZUludCogbmV4dF9ob2xlOworICAgIGJvb2wgZXJyb3I7CisgICAgZmxvYXQgeF9jb29yZDsKK307CisKK3R5cGVkZWYgQ3ZWb3Jvbm9pU2l0ZUludCogcEN2Vm9yb25vaVNpdGU7Cit0eXBlZGVmIEN2Vm9yb25vaUVkZ2VJbnQqIHBDdlZvcm9ub2lFZGdlOwordHlwZWRlZiBDdlZvcm9ub2lOb2RlSW50KiBwQ3ZWb3Jvbm9pTm9kZTsKK3R5cGVkZWYgQ3ZWb3Jvbm9pUGFyYWJvbGFJbnQqIHBDdlZvcm9ub2lQYXJhYm9sYTsKK3R5cGVkZWYgQ3ZWb3Jvbm9pQ2hhaW5JbnQqIHBDdlZvcm9ub2lDaGFpbjsKK3R5cGVkZWYgQ3ZWb3Jvbm9pSG9sZUludCogcEN2Vm9yb25vaUhvbGU7Cit0eXBlZGVmIEN2UG9pbnRGbG9hdCogcEN2UG9pbnRGbG9hdDsKK3R5cGVkZWYgQ3ZEaXJlY3Rpb24qIHBDdkRpcmVjdGlvbjsgCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2TGVlCisvLyAgICBQdXJwb3NlOiBDb21wdXRlIFZvcm9ub2kgRGlhZ3JhbSBmb3Igb25lIGdpdmVuIHBvbHlnb24gd2l0aCBob2xlcworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIENvbnRvdXJTZXEgOiBpbiwgdmVydGljZXMgb2YgcG9seWdvbi4KKy8vICAgICAgVm9yb25vaURpYWdyYW1JbnQgOiBpbiZvdXQsIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisvLyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtLgorLy8gICAgICBWb3Jvbm9pU3RvcmFnZTogaW4sIHN0b3JhZ2UgZm9yIFZvcm9ub2kgRGlhZ3JhbS4KKy8vICAgICAgY29udG91cl90eXBlOiBpbiwgdHlwZSBvZiB2ZXJ0aWNlcy4KKy8vICAgICAgICAgICAgICAgICAgICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSBDVl9MRUVfSU5ULENWX0xFRV9GTE9BVCxDVl9MRUVfRE9VQkxFLgorLy8gICAgICBjb250b3VyX29yaWVudGF0aW9uOiBpbiwgb3JpZW50YXRpb24gb2YgcG9seWdvbnMuCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwgaWYgY29udG91ciBpcyBsZWZ0IC0gb3JpZW50ZWQgaW4gbGVmdCBjb29yZGluYXQgc3lzdGVtCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgID0tMSwgaWYgY29udG91ciBpcyBsZWZ0IC0gb3JpZW50ZWQgaW4gcmlnaHQgY29vcmRpbmF0IHN5c3RlbQorLy8gICAgICBhdHRlbXB0X251bWJlcjogaW4sIG51bWJlciBvZiB1bnN1Y2Nlc3NmdWwgYXR0ZW10cyBtYWRlIGJ5IHByb2dyYW0gdG8gY29tcHV0ZSAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgVm9yb25vaSBEaWFncmFtIGJlZm9yIHJldHVybiB0aGUgZXJyb3IKKy8vCisvLyAgICBSZXR1cm5zOiAxLCBpZiBWb3Jvbm9pIERpYWdyYW0gd2FzIHN1Y2Nlc2Z1bGx5IGNvbXB1dGVkIAorLy8gICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmVzCisvL0YqLworc3RhdGljIGludCAgX2N2TGVlKEN2U2VxKiBDb250b3VyU2VxLAorICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbUludCwKKyAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIFZvcm9ub2lTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyBjb250b3VyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRvdXJfb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRfbnVtYmVyKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q29uc3R1Y3RTaXRlcworLy8gICAgUHVycG9zZSA6IENvbXB1dGUgc2l0ZXMgZm9yIGdpdmVuIHBvbHlnb24gd2l0aCBob2xlcworLy8gICAgICAgICAgICAgICAgICAgICAoc2l0ZSBpcyBhbiBlZGdlIG9mIHBvbHlnb24gb3IgYSByZWZsZXggdmVydGV4KS4KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICAgICAgICBDb250b3VyU2VxIDogaW4sIHZlcnRpY2VzIG9mIHBvbHlnb24KKy8vICAgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorLy8gICAgICAgICAgIGNvbnRvdXJfdHlwZTogaW4sIHR5cGUgb2YgdmVydGljZXMuICBUaGUgcG9zc2libGUgdmFsdWVzIGFyZSAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9MRUVfSU5ULENWX0xFRV9GTE9BVCxDVl9MRUVfRE9VQkxFLgorLy8gICAgY29udG91cl9vcmllbnRhdGlvbjogaW4sIG9yaWVudGF0aW9uIG9mIHBvbHlnb25zLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsIGlmIGNvbnRvdXIgaXMgbGVmdCAtIG9yaWVudGVkIGluIGxlZnQgY29vcmRpbmF0IHN5c3RlbQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICA9LTEsIGlmIGNvbnRvdXIgaXMgbGVmdCAtIG9yaWVudGVkIGluIHJpZ2h0IGNvb3JkaW5hdCBzeXN0ZW0KKy8vICAgICBSZXR1cm46IDEsIGlmIHNpdGVzIHdlcmUgc3VjY2VzZnVsbHkgY29uc3RydWN0ZWQgCisvLyAgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZXMKKy8vRiovCitzdGF0aWMgaW50IF9jdkNvbnN0dWN0U2l0ZXMoQ3ZTZXEqIENvbnRvdXJTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyBjb250b3VyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRvdXJfb3JpZW50YXRpb24pOworCisvKkYvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgIEF1dGhvcjogIEFuZHJleSBTb2JvbGV2CisvLyAgICBOYW1lOiAgICBfY3ZDb25zdHJ1Y3RDaGFpbnMKKy8vICAgIFB1cnBvc2UgOiBDb21wdXRlIGNoYWlucyBmb3IgZ2l2ZW4gcG9seWdvbiB3aXRoIGhvbGVzLgorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKy8vICAgICBSZXR1cm46IDEsIGlmIGNoYWlucyB3ZXJlIHN1Y2Nlc2Z1bGx5IGNvbnN0cnVjdGVkIAorLy8gICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmVzCisvL0YqLworc3RhdGljIGludCBfY3ZDb25zdHJ1Y3RDaGFpbnMoQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q29uc3RydWN0U2tlbGV0b24KKy8vICAgIFB1cnBvc2U6IENvbXB1dGUgc2tlbGV0b24gZm9yIGdpdmVuIGNvbGxlY3Rpb24gb2Ygc2l0ZXMsIHVzaW5nIExlZSBhbGdvcml0aG0KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorLy8gICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbS4KKy8vICAgIFJldHVybnM6IDEsIGlmIHNrZWxldG9uIHdhcyBzdWNjZXNmdWxseSBjb21wdXRlZCAKKy8vICAgICAgICAgICAgIDAsIGlmIHNvbWUgZXJyb3Igb2NjdXJlcworLy9GKi8KK3N0YXRpYyBpbnQgX2N2Q29uc3RydWN0U2tlbGV0b24oQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBBdXRob3I6ICBBbmRyZXkgU29ib2xldgorLy8gICAgTmFtZTogICAgX2N2Q29uc3RydWN0U2l0ZVRyZWUKKy8vICAgIFB1cnBvc2U6IENvbnN0cnVjdCB0cmVlIG9mIHNpdGVzIChieSBhbmFsb2d5IHdpdGggY29udG91ciB0cmVlKS4KKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgICBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorLy8gICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbS4KKy8vICAgIFJldHVybnM6IAorLy9GKi8KK3N0YXRpYyB2b2lkIF9jdkNvbnN0cnVjdFNpdGVUcmVlKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgQXV0aG9yOiAgIEFuZHJleSBTb2JvbGV2CisvLyAgICBOYW1lOiAgICAgX2N2UmVsZWFzZVZvcm9ub2lTdG9yYWdlCisvLyAgICBQdXJwb3NlIDogRnVuY3Rpb24gcmVhbGVhc2Ugc3RvcmFnZXMuIAorLy8gICAgICAgICAgICAgICAgICBUaGUgc3RvcmFnZXMgYXJlIGRpdmlkZWQgaW50byB0d28gZ3JvdXBzOgorLy8gICAgICAgICAgICAgICAgICBTaXRlU3RvcmFnZSwgRWRnZVN0b3JhZ2UsIE5vZGVTdG9yYWdlIGZvcm0gdGhlIGZpcnN0IGdyb3VwOworLy8gICAgICAgICAgICAgICAgICBDaGFpblN0b3JhZ2UsUGFyYWJvbGFTdG9yYWdlLERpcmVjdGlvblN0b3JhZ2UsSG9sZVN0b3JhZ2UgZm9ybSB0aGUgc2Vjb25kIGdyb3VwLgorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgcFZvcm9ub2lTdG9yYWdlOiBpbiwKKy8vICAgICAgICBncm91cDEsZ3JvdXAyOiBpbiwgaWYgZ3JvdXAxPD4wIHRoZW4gc3RvcmFnZXMgZnJvbSBmaXJzdCBncm91cCByZWxlYXNlZCAgIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBncm91cDI8PjAgdGhlbiBzdG9yYWdlcyBmcm9tIHNlY29uZCBncm91cCByZWxlYXNlZAorLy8gICAgUmV0dXJuICAgIDoKKy8vRiovCitzdGF0aWMgdm9pZCBfY3ZSZWxlYXNlVm9yb25vaVN0b3JhZ2UoQ3ZWb3Jvbm9pU3RvcmFnZUludCogcFZvcm9ub2lTdG9yYWdlLCBpbnQgZ3JvdXAxLCBpbnQgZ3JvdXAyKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICBOYW1lOiAgX2N2Q29udmVydAorLy8gIFB1cnBvc2UgOiAgRnVuY3Rpb24gY29udmVydCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBWRCAodmlhIAorLy8gICAgICAgICAgICAgICAgICBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGVJbnQsIEN2Vm9yb25vaUVkZ2VJbnQsQ3ZWb3Jvbm9pTm9kZUludCkgaW50byAKKy8vICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgVkQgKHZpYSBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGUyRCwgQ3ZWb3Jvbm9pRWRnZTJELAorLy8gICAgICAgICAgICAgICAgICBDdlZvcm9ub2lOb2RlMkQpIAorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgICAgVm9yb25vaURpYWdyYW06IGluCisvLyAgICAgICAgVm9yb25vaVN0b3JhZ2U6IGluCisvLyAgICAgICAgY2hhbmdlX29yaWVudGF0aW9uOiBpbiwgaWYgPSAtMSB0aGVuIHRoZSBjb252ZXJ0aW9uIGlzIGFjY29tcGFuaWVkIHdpdGggY2hhbmdlIAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Ygb3JpZW50YXRpb24KKy8vCisvLyAgICAgUmV0dXJuOiAxLCBpZiBjb252ZXJ0aW9uIHdhcyBzdWNjZXNmdWxseSBjb21wbGV0ZWQKKy8vICAgICAgICAgICAgIDAsIGlmIHNvbWUgZXJyb3Igb2NjdXJlcworLy9GKi8KKy8qCitzdGF0aWMgaW50IF9jdkNvbnZlcnQoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwgCisgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlX29yaWVudGF0aW9uKTsKKyovCitzdGF0aWMgaW50IF9jdkNvbnZlcnQoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCBWb3Jvbm9pRGlhZ3JhbUludCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXQqICZOZXdTaXRlU2VxUHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXFXcml0ZXIgJk5vZGVXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxV3JpdGVyICZFZGdlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIFZvcm9ub2lTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhbmdlX29yaWVudGF0aW9uKTsKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgQXV0aG9yOiAgQW5kcmV5IFNvYm9sZXYKKy8vICBOYW1lOiAgX2N2Q29udmVydFNhbWVPcmllbnRhdGlvbgorLy8gIFB1cnBvc2UgOiAgRnVuY3Rpb24gY29udmVydCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBWRCAodmlhIAorLy8gICAgICAgICAgICAgICAgICBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGVJbnQsIEN2Vm9yb25vaUVkZ2VJbnQsQ3ZWb3Jvbm9pTm9kZUludCkgaW50byAKKy8vICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgVkQgKHZpYSBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGUyRCwgQ3ZWb3Jvbm9pRWRnZTJELAorLy8gICAgICAgICAgICAgICAgICBDdlZvcm9ub2lOb2RlMkQpIHdpdGhvdXQgY2hhbmdlIG9mIG9yaWVudGF0aW9uCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgICBWb3Jvbm9pRGlhZ3JhbTogaW4KKy8vICAgICAgICBWb3Jvbm9pU3RvcmFnZTogaW4KKy8KKy8vICAgICBSZXR1cm46IDEsIGlmIGNvbnZlcnRpb24gd2FzIHN1Y2Nlc2Z1bGx5IGNvbXBsZXRlZAorLy8gICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmVzCisvL0YqLworLyoKK3N0YXRpYyBpbnQgX2N2Q29udmVydFNhbWVPcmllbnRhdGlvbihDdlZvcm9ub2lEaWFncmFtMkQqIFZvcm9ub2lEaWFncmFtLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSk7CisqLworc3RhdGljIGludCBfY3ZDb252ZXJ0U2FtZU9yaWVudGF0aW9uKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQgVm9yb25vaURpYWdyYW1JbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2V0KiAmTmV3U2l0ZVNlcVByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxV3JpdGVyICZOb2RlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciAmRWRnZVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSk7CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gIEF1dGhvcjogIEFuZHJleSBTb2JvbGV2CisvLyAgTmFtZTogIF9jdkNvbnZlcnRDaGFuZ2VPcmllbnRhdGlvbgorLy8gIFB1cnBvc2UgOiAgRnVuY3Rpb24gY29udmVydCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBWRCAodmlhIAorLy8gICAgICAgICAgICAgICAgICBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGVJbnQsIEN2Vm9yb25vaUVkZ2VJbnQsQ3ZWb3Jvbm9pTm9kZUludCkgaW50byAKKy8vICAgICAgICAgICAgICAgICAgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgVkQgKHZpYSBzdHJ1Y3RzIEN2Vm9yb25vaVNpdGUyRCwgQ3ZWb3Jvbm9pRWRnZTJELAorLy8gICAgICAgICAgICAgICAgICBDdlZvcm9ub2lOb2RlMkQpIHdpdGggY2hhbmdlIG9mIG9yaWVudGF0aW9uCisvLyAgICBDb250ZXh0OgorLy8gICAgUGFyYW1ldGVyczoKKy8vICAgICAgICBWb3Jvbm9pRGlhZ3JhbTogaW4KKy8vICAgICAgICBWb3Jvbm9pU3RvcmFnZTogaW4KKy8KKy8vICAgICBSZXR1cm46IDEsIGlmIGNvbnZlcnRpb24gd2FzIHN1Y2Nlc2Z1bGx5IGNvbXBsZXRlZAorLy8gICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmVzCisvL0YqLworLyoKK3N0YXRpYyBpbnQgX2N2Q29udmVydENoYW5nZU9yaWVudGF0aW9uKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIFZvcm9ub2lTdG9yYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0YXRpYyBpbnQgX2N2Q29udmVydENoYW5nZU9yaWVudGF0aW9uKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQgVm9yb25vaURpYWdyYW1JbnQsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2V0KiAmTmV3U2l0ZVNlcVByZXYsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxV3JpdGVyICZOb2RlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciAmRWRnZVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBDb21wdXRlICBzaXRlcyBmb3IgZXh0ZXJuYWwgcG9seWdvbi4gCisgICAgQXJndW1lbnRzIAorICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBDb250b3VyU2VxIDogaW4sIHZlcnRpY2VzIG9mIHBvbHlnb24KKyAgICAgcFJlZmxleFNpdGU6IG91dCwgcG9pbnRlciB0byByZWZsZXggc2l0ZSxpZiBhbnkgZXhpc3QsZWxzZSBOVUxMCisgICAgIG9yaWVudGF0aW9uOiBpbiwgb3JpZW50YXRpb24gb2YgY29udG91ciAoID0gMSBvciA9IC0xKQorICAgICB0eXBlOiAgICAgICAgaW4sIHR5cGUgb2YgdmVydGljZXMuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIChpbnQpMSwKKyAgICAgICAgICAgICAgICAgICAoZmxvYXQpMSwoZG91YmxlKTEuCisgICAgIFJldHVybjogICAgMSwgaWYgc2l0ZXMgd2VyZSBzdWNjZXNmdWxseSBjb25zdHJ1Y3RlZCAKKyAgICAgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZXMgICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW50IF9jdkNvbnN0cnVjdEV4dFNpdGVzKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSogQ29udG91clNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgVCAvKnR5cGUqLyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBDb21wdXRlICBzaXRlcyBmb3IgaW50ZXJuYWwgcG9seWdvbiAoZm9yIGhvbGUpLiAKKyAgICBBcmd1bWVudHMgCisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtCisgICAgIEN1cnJTaXRlU2VxOiBpbiwgdGhlIHNlcXVlbmNlIGZvciBzaXRlcyB0byBiZSBjb25zdHJ1Y3RlZAorICAgICBDdXJyQ29udG91clNlcSA6IGluLCB2ZXJ0aWNlcyBvZiBwb2x5Z29uCisgICAgIHBUb3BTaXRlOiBvdXQsIHBvaW50ZXIgdG8gdGhlIG1vc3QgbGVmdCBzaXRlIG9mIHBvbHlnb24gKGl0IGlzIHRoZSBtb3N0IGxlZnQgCisgICAgICAgICAgICAgICAgdmVydGV4IG9mIHBvbHlnb24pCisgICAgIG9yaWVudGF0aW9uOiBpbiwgb3JpZW50YXRpb24gb2YgY29udG91ciAoID0gMSBvciA9IC0xKQorICAgICB0eXBlOiAgICAgICAgaW4sIHR5cGUgb2YgdmVydGljZXMuIFRoZSBwb3NzaWJsZSB2YWx1ZXMgYXJlIChpbnQpMSwKKyAgICAgICAgICAgICAgICAgICAoZmxvYXQpMSwoZG91YmxlKTEuCisgICAgIFJldHVybjogICAgMSwgaWYgc2l0ZXMgd2VyZSBzdWNjZXNmdWxseSBjb25zdHJ1Y3RlZCAKKyAgICAgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZXMgICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW50IF9jdkNvbnN0cnVjdEludFNpdGVzKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSogQ3VyclNpdGVTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIEN1cnJDb250b3VyU2VxLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSAmcFRvcFNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQgLyp0eXBlKi8pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgc2ltcGxlIGNoYWlucyBvZiBzaXRlcyBmb3IgZXh0ZXJuYWwgcG9seWdvbi4KKyAgICBBcmd1bWVudHMgCisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluJm91dCwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgIAorICAgIFJldHVybjogMSwgaWYgY2hhaW5zIHdlcmUgc3VjY2VzZnVsbHkgY29uc3RydWN0ZWQgCisgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZXMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9jdkNvbnN0cnVjdEV4dENoYWlucyhDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgc2ltcGxlIGNoYWlucyBvZiBzaXRlcyBmb3IgaW50ZXJuYWwgcG9seWdvbiAoPSBob2xlKQorICAgIEFyZ3VtZW50cyAKKyAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgIEN1cnJTaXRlU2VxIDogaW4sIHRoZSBzZXF1ZW5jZSBvZiBzaXRlcworICAgQ3VyckNoYWluU2VxIDogaW4sdGhlIHNlcXVlbmNlIGZvciBjaGFpbnMgdG8gYmUgY29uc3RydWN0ZWQKKyAgICAgICBwVG9wU2l0ZSA6IGluLCB0aGUgbW9zdCBsZWZ0IHNpdGUgb2YgaG9sZQorCisgICAgICBSZXR1cm4gICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfY3ZDb25zdHJ1Y3RJbnRDaGFpbnMoQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDdXJyQ2hhaW5TZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIEN1cnJTaXRlU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBUb3BTaXRlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IENvbXB1dGUgdGhlIGluaXRpYWwgVm9yb25vaSBEaWFncmFtIGZvciBzaW5nbGUgc2l0ZQorICAgIEFyZ3VtZW50cyAKKyAgICAgcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgcFNpdGU6IGluLCBwb2ludGVyIHRvIHNpdGUKKworICAgICBSZXR1cm4gOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfY3ZDb25zdHJ1Y3RFZGdlcyhwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSxDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gbW92ZXMgZWFjaCBub2RlIG9uIHNtYWxsIHJhbmRvbSB2YWx1ZS4gVGhlIG5vZGVzIGFyZSB0YWtlbgorICAgICAgICAgICAgICAgICAgICBmcm9tIHBWb3Jvbm9pRGlhZ3JhbS0+Tm9kZVNlcS4KKyAgICBBcmd1bWVudHMgCisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtCisgICAgIGJlZ2luLGVuZDogaW4sIHRoZSBmaXJzdCBhbmQgdGhlIGxhc3Qgbm9kZXMgaW4gcFZvcm9ub2lEaWFncmFtLT5Ob2RlU2VxLAorICAgICAgICAgICAgICAgICAgICB3aGljaCBtb3ZlcworICAgICBzaGlmdDogaW4sIHRoZSB2YWx1ZSBvZiBtYXhpbWFsIHNoaWZ0LgorICAgICBSZXR1cm4gOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBfY3ZSYW5kb21Nb2RpZmljYXRpb24oQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtLCBpbnQgYmVnaW4sIGludCBlbmQsIGZsb2F0IHNoaWZ0KTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IENvbXB1dGUgdGhlIGludGVybmFsIFZvcm9ub2kgRGlhZ3JhbSBmb3IgZXh0ZXJuYWwgcG9seWdvbi4KKyAgICBBcmd1bWVudHMgCisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtCisgICAgIFJldHVybiAgICAgOiAxLCBpZiBWRCB3YXMgY29uc3RydWN0ZWQgc3VjY2VzZnVsbHkKKyAgICAgICAgICAgICAgICAgIDAsIGlmIHNvbWUgZXJyb3Igb2NjdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBfY3ZDb25zdHJ1Y3RFeHRWRChDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgZXh0ZXJuYWwgVm9yb25vaSBEaWFncmFtIGZvciBlYWNoIGludGVybmFsIHBvbHlnb24gKGhvbGUpLgorICAgIEFyZ3VtZW50cyAKKyAgICAgcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIF9jdkNvbnN0cnVjdEludFZEKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBqb2lucyB0aGUgVm9yb25vaSBEaWFncmFtcyBvZiBkaWZmZXJlbnQgCisgICAgICAgICAgICAgICAgICAgIGNoYWlucyBpbnRvIG9uZSBWb3Jvbm9pIERpYWdyYW0gCisgICAgQXJndW1lbnRzIAorICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBwQ2hhaW4xLHBDaGFpbjE6IGluLCBnaXZlbiBjaGFpbnMKKyAgICAgUmV0dXJuICAgICA6IDEsIGlmIGpvaW5pbmcgd2FzIHN1Y2Nlc2Z1bAorICAgICAgICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9jdkpvaW5DaGFpbnMocEN2Vm9yb25vaUNoYWluIHBDaGFpbjEsIAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lDaGFpbiBwQ2hhaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBmaW5kcyB0aGUgbmVhcmVzdCBzaXRlIGZvciB0b3AgdmVydGV4IAorICAgICAgICAgICAgICAgICAoPSB0aGUgbW9zdCBsZWZ0IHZlcnRleCkgb2YgZWFjaCBob2xlCisgICAgQXJndW1lbnRzIAorICAgICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIF9jdkZpbmROZWFyZXN0U2l0ZShDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gc2Vla3MgZm9yIHNpdGUsIHdoaWNoIGhhcyBjb21tb24gYmlzZWN0b3IgaW4KKyAgICAgICAgICAgICAgICAgIGZpbmFsIFZEIHdpdGggdG9wIHZlcnRleCBvZiBnaXZlbiBob2xlLiBJdCBzdG9yZXMgaW4gcEhvbGUtPm9wcG9zaXRlX3NpdGUuCisgICAgICAgICAgICAgICAgICAgVGhlIHNlYXJjaCBiZWdpbnMgZnJvbSAgSG9sZS0+bmVhcmVzdF9zaXRlIGFuZCByZWFsaXplcyBpbiBjbG9ja3dpc2UgCisgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uIGFyb3VuZCB0aGUgdG9wIHZlcnRleCBvZiBnaXZlbiBob2xlLgorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICAgICAgIHBIb2xlIDogaW4sIGdpdmVuIGhvbGUgICAgICAgIAorICAgICBSZXR1cm4gICAgIDogMSwgaWYgdGhlIHNlYXJjaCB3YXMgc3VjY2VzZnVsCisgICAgICAgICAgICAgICAgICAwLCBpZiBzb21lIGVycm9yIG9jY3VyZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyBpbnQgX2N2RmluZE9wcG9zaXRTaXRlQ1cocEN2Vm9yb25vaUhvbGUgcEhvbGUsIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBzZWVrcyBmb3Igc2l0ZSwgd2hpY2ggaGFzIGNvbW1vbiBiaXNlY3RvciBpbgorICAgICAgICAgICAgICAgICAgZmluYWwgVkQgd2l0aCB0b3AgdmVydGV4IG9mIGdpdmVuIGhvbGUuIEl0IHN0b3JlcyBpbiBwSG9sZS0+b3Bwb3NpdGVfc2l0ZS4KKyAgICAgICAgICAgICAgICAgICBUaGUgc2VhcmNoIGJlZ2lucyBmcm9tICBIb2xlLT5uZWFyZXN0X3NpdGUgYW5kIHJlYWxpemVzIGluIGNvdW50ZXJjbG9ja3dpc2UgCisgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uIGFyb3VuZCB0aGUgdG9wIHZlcnRleCBvZiBnaXZlbiBob2xlLgorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgICAgICBwSG9sZSA6IGluLCBnaXZlbiBob2xlICAgICAgICAKKyAgICAgUmV0dXJuICAgICA6IDEsIGlmIHRoZSBzZWFyY2ggd2FzIHN1Y2Nlc2Z1bAorICAgICAgICAgICAgICAgICAgMCwgaWYgc29tZSBlcnJvciBvY2N1cmUKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgaW50IF9jdkZpbmRPcHBvc2l0U2l0ZUNDVyhwQ3ZWb3Jvbm9pSG9sZSBwSG9sZSxDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gbWVyZ2VzIGV4dGVybmFsIFZEIG9mIGhvbGUgYW5kIGludGVybmFsIFZELCB3aGljaCB3YXMgCisgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RlZCBlYWxpZXIuCisgICAgQXJndW1lbnRzIAorcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgICAgICBwSG9sZSA6IGluLCBnaXZlbiBob2xlCisgICAgIFJldHVybiAgICAgOiAxLCBpZiBtZXJnaW5nIHdhcyBzdWNjZXNmdWwKKyAgICAgICAgICAgICAgICAgIDAsIGlmIHNvbWUgZXJyb3Igb2NjdXJlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGludCBfY3ZNZXJnZVZEKHBDdlZvcm9ub2lIb2xlIHBIb2xlLEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRhdGlvbiBvZiBiaXNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgYmlzZWN0b3Igb2YgdHdvIHNpdGVzCisgICAgQXJndW1lbnRzIAorICAgICBwU2l0ZV9sZWZ0LHBTaXRlX3JpZ2h0OiBpbiwgZ2l2ZW4gc2l0ZXMKKyAgICAgcFZvcm9ub2lEaWFncmFtIDogaW4sIHBvaW50ZXIgdG8gc3RydWN0LCB3aGljaCBjb250YWlucyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBWb3Jvbm9pIERpYWdyYW0KKyAgICAgcEVkZ2UgICAgICA6IG91dCwgYmlzZWN0b3IKKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgX2N2Q2FsY0VkZ2UocEN2Vm9yb25vaVNpdGUgcFNpdGVfbGVmdCwgCisgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcmlnaHQsCisgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UsCisgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IENvbXB1dGUgdGhlIGJpc2VjdG9yIG9mIHBvaW50IGFuZCBzaXRlCisgICAgQXJndW1lbnRzIAorICAgICBwU2l0ZSAgICAgIDogaW4sIHNpdGUKKyAgICAgcE5vZGUgICAgICA6IGluLCBwb2ludAorICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBwRWRnZSAgICAgIDogb3V0LCBiaXNlY3RvcgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBfY3ZDYWxjRWRnZShwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSwKKyAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pTm9kZSBwTm9kZSwKKyAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgYmlzZWN0b3Igb2YgcG9pbnQgYW5kIHNpdGUKKyAgICBBcmd1bWVudHMgCisgICAgIHBTaXRlICAgICAgOiBpbiwgc2l0ZQorICAgICBwTm9kZSAgICAgIDogaW4sIHBvaW50CisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtCisgICAgIHBFZGdlICAgICAgOiBvdXQsIGJpc2VjdG9yCisgICAgIFJldHVybiAgICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIF9jdkNhbGNFZGdlKHBDdlZvcm9ub2lOb2RlIHBOb2RlLCAKKyAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSwKKyAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgZGlyZWN0aW9uIG9mIGJpc2VjdG9yIG9mIHR3byBzZWdtZW50cworICAgIEFyZ3VtZW50cyAKKyAgICAgcERpcmVjdGlvbjE6IGluLCBkaXJlY3Rpb24gb2YgZmlyc3Qgc2VnbWVudAorICAgICBwRGlyZWN0aW9uMjogaW4sIGRpcmVjdGlvbiBvZiBzZWNvbmQgc2VnbWVudAorICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBwRWRnZSAgICAgIDogb3V0LCBiaXNlY3RvcgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNFZGdlTEwocEN2RGlyZWN0aW9uIHBEaXJlY3Rpb24xLAorICAgICAgICAgICAgICAgICAgcEN2RGlyZWN0aW9uIHBEaXJlY3Rpb24yLAorICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UsCisgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgYmlzZWN0b3Igb2YgdHdvIHBvaW50cworICAgIEFyZ3VtZW50cyAKKyAgICAgcFBvaW50MSwgcFBvaW50MjogaW4sIGdpdmVuIHBvaW50cworICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBwRWRnZSAgICAgIDogb3V0LCBiaXNlY3RvcgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNFZGdlUFAocEN2UG9pbnRGbG9hdCBwUG9pbnQxLAorICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCBwUG9pbnQyLAorICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UsCisgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogQ29tcHV0ZSB0aGUgYmlzZWN0b3Igb2Ygc2VnbWVudCBhbmQgcG9pbnQuIFNpbmNlIAorICAgICAgICAgICAgICAgICAgICBpdCBpcyBwYXJhYm9sYSwgaXQgaXMgZGVmaW5lZCBieSBpdHMgZm9jdXMgKHNpdGUgLSBwb2ludCkKKyAgICAgICAgICAgICAgICAgICAgYW5kIGRpcmVjdHJpY2Uoc2l0ZS1zZWdtZW50KQorICAgIEFyZ3VtZW50cyAKKyAgICAgcEZvY3VzICAgIDogaW4sIHBvaW50LCB3aGljaCBkZWZpbmVzIHRoZSBmb2N1cyBvZiBwYXJhYm9sYQorICAgICBwRGlyZWN0cmljZTogaW4sIHNpdGUgLSBzZWdtZW50LCB3aGljaCBkZWZpbmVzIHRoZSBkaXJlY3RyaWNlIG9mIHBhcmFib2xhIAorICAgICBwVm9yb25vaURpYWdyYW0gOiBpbiwgcG9pbnRlciB0byBzdHJ1Y3QsIHdoaWNoIGNvbnRhaW5zIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbQorICAgICBwRWRnZSAgICAgIDogb3V0LCBiaXNlY3RvcgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNFZGdlUEwocEN2Vm9yb25vaU5vZGUgcEZvY3VzLAorICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcERpcmVjdHJpY2UsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBDb21wdXRlIHRoZSBiaXNlY3RvciBvZiBzZWdtZW50IGFuZCBwb2ludC4gU2luY2UgCisgICAgICAgICAgICAgICAgICAgIGl0IGlzIHBhcmFib2xhLCBpdCBpcyBkZWZpbmVkIGJ5IGl0cyBmb2N1cyAoc2l0ZSAtIHBvaW50KQorICAgICAgICAgICAgICAgICAgICBhbmQgZGlyZWN0cmljZShzaXRlLXNlZ21lbnQpCisgICAgQXJndW1lbnRzIAorICAgICBwRm9jdXMgICAgOiBpbiwgcG9pbnQsIHdoaWNoIGRlZmluZXMgdGhlIGZvY3VzIG9mIHBhcmFib2xhCisgICAgIHBEaXJlY3RyaWNlOiBpbiwgc2l0ZSAtIHNlZ21lbnQsIHdoaWNoIGRlZmluZXMgdGhlIGRpcmVjdHJpY2Ugb2YgcGFyYWJvbGEgCisgICAgIHBWb3Jvbm9pRGlhZ3JhbSA6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgVm9yb25vaSBEaWFncmFtCisgICAgIHBFZGdlICAgICAgOiBvdXQsIGJpc2VjdG9yCisgICAgIFJldHVybiAgICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDVl9JTkxJTkUKK3ZvaWQgX2N2Q2FsY0VkZ2VMUChwQ3ZWb3Jvbm9pU2l0ZSBwRGlyZWN0cmljZSwKKyAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lOb2RlIHBGb2N1cywKKyAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlLAorICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKTsKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgIENvbXB1dGF0aW9uIG9mIGludGVyc2VjdGlvbnMgb2YgYmlzZWN0b3JzICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgaW50ZXJzZWN0aW9uIG9mIHR3byBlZGdlcy4gSW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIG5lYXJlc3QgdG8gdGhlIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEKKyAgICAgICAgICAgICAgICAgICAgKHRoaXMgbWFya2VkIHBvaW50IGlzIHBFZGdlMS0+bm9kZTEtPm5vZGUpLgorICAgIEFyZ3VtZW50cyAKKyAgICBwRWRnZTEscEVkZ2UyOiBpbiwgdHdvIGVkZ2VzCisgICAgICAgIHBQb2ludDogb3V0LCBpbnRlcnNlY3Rpb24gb2YgcEVkZ2UxIGFuZCBwRWRnZTIKKyAgICAgICAgUmFkaXVzOiBvdXQsIGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBzaXRlcywgYXNzb3NpYXRlZAorICAgICAgICAgICAgICAgICAgICB3aXRoIHBFZGdlMSBhbmQgcEVkZ2UyIChwUG9pbnQgaXMgc2l0dWF0ZWQgb24gdGhlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gc2l0ZSwgYXNzb3NpYXRlZCB3aXRoIHBFZGdlMSBhbmQgZnJvbQorICAgICAgICAgICAgICAgICAgICBzaXRlLGFzc29zaWF0ZWQgd2l0aCBwRWRnZTIpCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgbWFya2VkIHBvaW50IG9uIHBFZGdlMSBvcgorICAgICAgICAgICAgICAgIDogLTEsIGlmIGVkZ2VzIGhhdmUgbm8gaW50ZXJzZWN0aW9ucworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworZmxvYXQgX2N2Q2FsY0VkZ2VJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludEZsb2F0KiBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNvbXB1dGVzIGludGVyc2VjdGlvbiBvZiB0d28gZWRnZXMuIEludGVyc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBuZWFyZXN0IHRvIHRoZSBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxCisgICAgICAgICAgICAgICAgICAgICh0aGlzIG1hcmtlZCBwb2ludCBpcyBwRWRnZTEtPm5vZGUxLT5ub2RlKS4KKyAgICBBcmd1bWVudHMgCisgICAgcEVkZ2UxIDogaW4sIHN0cmFpZ2h0IHJheQorICAgIHBFZGdlMjogaW4sIHN0cmFpZ2h0IHJheSBvciBzZWdtZW50CisgICAgICAgIHBQb2ludDogb3V0LCBpbnRlcnNlY3Rpb24gb2YgcEVkZ2UxIGFuZCBwRWRnZTIKKyAgICAgICAgUmFkaXVzOiBvdXQsIGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBzaXRlcywgYXNzb3NpYXRlZAorICAgICAgICAgICAgICAgICAgICB3aXRoIHBFZGdlMSBhbmQgcEVkZ2UyIChwUG9pbnQgaXMgc2l0dWF0ZWQgb24gdGhlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gc2l0ZSwgYXNzb3NpYXRlZCB3aXRoIHBFZGdlMSBhbmQgZnJvbQorICAgICAgICAgICAgICAgICAgICBzaXRlLGFzc29zaWF0ZWQgd2l0aCBwRWRnZTIpCisgICAgIFJldHVybiA6IGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxIG9yCisgICAgICAgICAgICAgICAgOiAtMSwgaWYgZWRnZXMgaGF2ZSBubyBpbnRlcnNlY3Rpb25zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitmbG9hdCBfY3ZMaW5lX0xpbmVJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlBvaW50RmxvYXQgIHBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyBpbnRlcnNlY3Rpb24gb2YgdHdvIGVkZ2VzLiBJbnRlcnNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgbmVhcmVzdCB0byB0aGUgbWFya2VkIHBvaW50IG9uIHBFZGdlMQorICAgICAgICAgICAgICAgICAgICAodGhpcyBtYXJrZWQgcG9pbnQgaXMgcEVkZ2UxLT5ub2RlMS0+bm9kZSkuCisgICAgQXJndW1lbnRzIAorICAgIHBFZGdlMSA6IGluLCBzdHJhaWdodCByYXkKKyAgICBwRWRnZTI6IGluLCBwYXJhYm9saWMgcmF5IG9yIHNlZ21lbnQKKyAgICAgICAgcFBvaW50OiBvdXQsIGludGVyc2VjdGlvbiBvZiBwRWRnZTEgYW5kIHBFZGdlMgorICAgICAgICBSYWRpdXM6IG91dCwgZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIHNpdGVzLCBhc3Nvc2lhdGVkCisgICAgICAgICAgICAgICAgICAgIHdpdGggcEVkZ2UxIGFuZCBwRWRnZTIgKHBQb2ludCBpcyBzaXR1YXRlZCBvbiB0aGUgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSBzaXRlLCBhc3Nvc2lhdGVkIHdpdGggcEVkZ2UxIGFuZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHNpdGUsYXNzb3NpYXRlZCB3aXRoIHBFZGdlMikKKyAgICAgIFJldHVybiAgICA6IGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxIG9yCisgICAgICAgICAgICAgICAgOiAtMSwgaWYgZWRnZXMgaGF2ZSBubyBpbnRlcnNlY3Rpb25zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitmbG9hdCBfY3ZMaW5lX1BhckludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNvbXB1dGVzIGludGVyc2VjdGlvbiBvZiB0d28gZWRnZXMuIEludGVyc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBuZWFyZXN0IHRvIHRoZSBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxCisgICAgICAgICAgICAgICAgICAgICh0aGlzIG1hcmtlZCBwb2ludCBpcyBwRWRnZTEtPm5vZGUxLT5ub2RlKS4KKyAgICBBcmd1bWVudHMgCisgICAgcEVkZ2UxIDogaW4sIHN0cmFpZ2h0IHJheQorICAgIHBFZGdlMjogaW4sIHBhcmFib2xpYyBzZWdtZW50CisgICAgICAgIHBQb2ludDogb3V0LCBpbnRlcnNlY3Rpb24gb2YgcEVkZ2UxIGFuZCBwRWRnZTIKKyAgICAgICAgUmFkaXVzOiBvdXQsIGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBzaXRlcywgYXNzb3NpYXRlZAorICAgICAgICAgICAgICAgICAgICB3aXRoIHBFZGdlMSBhbmQgcEVkZ2UyIChwUG9pbnQgaXMgc2l0dWF0ZWQgb24gdGhlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gc2l0ZSwgYXNzb3NpYXRlZCB3aXRoIHBFZGdlMSBhbmQgZnJvbQorICAgICAgICAgICAgICAgICAgICBzaXRlLGFzc29zaWF0ZWQgd2l0aCBwRWRnZTIpCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgbWFya2VkIHBvaW50IG9uIHBFZGdlMSBvcgorICAgICAgICAgICAgICAgIDogLTEsIGlmIGVkZ2VzIGhhdmUgbm8gaW50ZXJzZWN0aW9ucworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworZmxvYXQgX2N2TGluZV9DbG9zZVBhckludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNvbXB1dGVzIGludGVyc2VjdGlvbiBvZiB0d28gZWRnZXMuIEludGVyc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHRoZSBuZWFyZXN0IHRvIHRoZSBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxCisgICAgICAgICAgICAgICAgICAgICh0aGlzIG1hcmtlZCBwb2ludCBpcyBwRWRnZTEtPm5vZGUxLT5ub2RlKS4KKyAgICBBcmd1bWVudHMgCisgICAgcEVkZ2UxIDogaW4sIHN0cmFpZ2h0IHJheQorICAgIHBFZGdlMjogaW4sIHBhcmFib2xpYyByYXkgCisgICAgICAgIHBQb2ludDogb3V0LCBpbnRlcnNlY3Rpb24gb2YgcEVkZ2UxIGFuZCBwRWRnZTIKKyAgICAgICAgUmFkaXVzOiBvdXQsIGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBzaXRlcywgYXNzb3NpYXRlZAorICAgICAgICAgICAgICAgICAgICB3aXRoIHBFZGdlMSBhbmQgcEVkZ2UyIChwUG9pbnQgaXMgc2l0dWF0ZWQgb24gdGhlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gc2l0ZSwgYXNzb3NpYXRlZCB3aXRoIHBFZGdlMSBhbmQgZnJvbQorICAgICAgICAgICAgICAgICAgICBzaXRlLGFzc29zaWF0ZWQgd2l0aCBwRWRnZTIpCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgbWFya2VkIHBvaW50IG9uIHBFZGdlMSBvcgorICAgICAgICAgICAgICAgIDogLTEsIGlmIGVkZ2VzIGhhdmUgbm8gaW50ZXJzZWN0aW9ucworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworZmxvYXQgX2N2TGluZV9PcGVuUGFySW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgaW50ZXJzZWN0aW9uIG9mIHR3byBlZGdlcy4gSW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIG5lYXJlc3QgdG8gdGhlIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEKKyAgICAgICAgICAgICAgICAgICAgKHRoaXMgbWFya2VkIHBvaW50IGlzIHBFZGdlMS0+bm9kZTEtPm5vZGUpLgorICAgIEFyZ3VtZW50cyAKKyAgICBwRWRnZTEgOiBpbiwgIHBhcmFib2xpYyByYXkKKyAgICBwRWRnZTI6IGluLCAgc3RyYWlnaHQgcmF5IG9yIHNlZ21lbnQKKyAgICAgICAgcFBvaW50OiBvdXQsIGludGVyc2VjdGlvbiBvZiBwRWRnZTEgYW5kIHBFZGdlMgorICAgICAgICBSYWRpdXM6IG91dCwgZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIHNpdGVzLCBhc3Nvc2lhdGVkCisgICAgICAgICAgICAgICAgICAgIHdpdGggcEVkZ2UxIGFuZCBwRWRnZTIgKHBQb2ludCBpcyBzaXR1YXRlZCBvbiB0aGUgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSBzaXRlLCBhc3Nvc2lhdGVkIHdpdGggcEVkZ2UxIGFuZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHNpdGUsYXNzb3NpYXRlZCB3aXRoIHBFZGdlMikKKyAgICAgIFJldHVybiAgICA6IGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxIG9yCisgICAgICAgICAgICAgICAgOiAtMSwgaWYgZWRnZXMgaGF2ZSBubyBpbnRlcnNlY3Rpb25zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitmbG9hdCBfY3ZQYXJfTGluZUludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyBpbnRlcnNlY3Rpb24gb2YgdHdvIGVkZ2VzLiBJbnRlcnNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgbmVhcmVzdCB0byB0aGUgbWFya2VkIHBvaW50IG9uIHBFZGdlMQorICAgICAgICAgICAgICAgICAgICAodGhpcyBtYXJrZWQgcG9pbnQgaXMgcEVkZ2UxLT5ub2RlMS0+bm9kZSkuCisgICAgQXJndW1lbnRzIAorICAgIHBFZGdlMSA6IGluLCAgcGFyYWJvbGljIHJheQorICAgIHBFZGdlMjogaW4sICBzdHJhaWdodCByYXkgCisgICAgICAgIHBQb2ludDogb3V0LCBpbnRlcnNlY3Rpb24gb2YgcEVkZ2UxIGFuZCBwRWRnZTIKKyAgICAgICAgUmFkaXVzOiBvdXQsIGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBzaXRlcywgYXNzb3NpYXRlZAorICAgICAgICAgICAgICAgICAgICB3aXRoIHBFZGdlMSBhbmQgcEVkZ2UyIChwUG9pbnQgaXMgc2l0dWF0ZWQgb24gdGhlIGVxdWFsCisgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlIGZyb20gc2l0ZSwgYXNzb3NpYXRlZCB3aXRoIHBFZGdlMSBhbmQgZnJvbQorICAgICAgICAgICAgICAgICAgICBzaXRlLGFzc29zaWF0ZWQgd2l0aCBwRWRnZTIpCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgbWFya2VkIHBvaW50IG9uIHBFZGdlMSBvcgorICAgICAgICAgICAgICAgIDogLTEsIGlmIGVkZ2VzIGhhdmUgbm8gaW50ZXJzZWN0aW9ucworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYworZmxvYXQgX2N2UGFyX09wZW5MaW5lSW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgaW50ZXJzZWN0aW9uIG9mIHR3byBlZGdlcy4gSW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIG5lYXJlc3QgdG8gdGhlIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEKKyAgICAgICAgICAgICAgICAgICAgKHRoaXMgbWFya2VkIHBvaW50IGlzIHBFZGdlMS0+bm9kZTEtPm5vZGUpLgorICAgIEFyZ3VtZW50cyAKKyAgICBwRWRnZTEgOiBpbiwgIHBhcmFib2xpYyByYXkKKyAgICBwRWRnZTI6IGluLCAgc3RyYWlnaHQgc2VnbWVudAorICAgICAgICBwUG9pbnQ6IG91dCwgaW50ZXJzZWN0aW9uIG9mIHBFZGdlMSBhbmQgcEVkZ2UyCisgICAgICAgIFJhZGl1czogb3V0LCBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgc2l0ZXMsIGFzc29zaWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBwRWRnZTEgYW5kIHBFZGdlMiAocFBvaW50IGlzIHNpdHVhdGVkIG9uIHRoZSBlcXVhbAorICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHNpdGUsIGFzc29zaWF0ZWQgd2l0aCBwRWRnZTEgYW5kIGZyb20KKyAgICAgICAgICAgICAgICAgICAgc2l0ZSxhc3Nvc2lhdGVkIHdpdGggcEVkZ2UyKQorICAgICAgUmV0dXJuICAgIDogZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEgb3IKKyAgICAgICAgICAgICAgICA6IC0xLCBpZiBlZGdlcyBoYXZlIG5vIGludGVyc2VjdGlvbnMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK2Zsb2F0IF9jdlBhcl9DbG9zZUxpbmVJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cyk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyBpbnRlcnNlY3Rpb24gb2YgdHdvIGVkZ2VzLiBJbnRlcnNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgbmVhcmVzdCB0byB0aGUgbWFya2VkIHBvaW50IG9uIHBFZGdlMQorICAgICAgICAgICAgICAgICAgICAodGhpcyBtYXJrZWQgcG9pbnQgaXMgcEVkZ2UxLT5ub2RlMS0+bm9kZSkuCisgICAgQXJndW1lbnRzIAorICAgIHBFZGdlMSA6IGluLCAgcGFyYWJvbGljIHJheQorICAgIHBFZGdlMjogaW4sICBwYXJhYm9saWMgcmF5IG9yIHNlZ21lbnQKKyAgICAgICAgcFBvaW50OiBvdXQsIGludGVyc2VjdGlvbiBvZiBwRWRnZTEgYW5kIHBFZGdlMgorICAgICAgICBSYWRpdXM6IG91dCwgZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIHNpdGVzLCBhc3Nvc2lhdGVkCisgICAgICAgICAgICAgICAgICAgIHdpdGggcEVkZ2UxIGFuZCBwRWRnZTIgKHBQb2ludCBpcyBzaXR1YXRlZCBvbiB0aGUgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSBzaXRlLCBhc3Nvc2lhdGVkIHdpdGggcEVkZ2UxIGFuZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHNpdGUsYXNzb3NpYXRlZCB3aXRoIHBFZGdlMikKKyAgICAgIFJldHVybiAgICA6IGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxIG9yCisgICAgICAgICAgICAgICAgOiAtMSwgaWYgZWRnZXMgaGF2ZSBubyBpbnRlcnNlY3Rpb25zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitmbG9hdCBfY3ZQYXJfUGFySW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyBpbnRlcnNlY3Rpb24gb2YgdHdvIGVkZ2VzLiBJbnRlcnNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSB0aGUgbmVhcmVzdCB0byB0aGUgbWFya2VkIHBvaW50IG9uIHBFZGdlMQorICAgICAgICAgICAgICAgICAgICAodGhpcyBtYXJrZWQgcG9pbnQgaXMgcEVkZ2UxLT5ub2RlMS0+bm9kZSkuCisgICAgQXJndW1lbnRzIAorICAgIHBFZGdlMSA6IGluLCAgcGFyYWJvbGljIHJheQorICAgIHBFZGdlMjogaW4sICBwYXJhYm9saWMgcmF5IAorICAgICAgICBwUG9pbnQ6IG91dCwgaW50ZXJzZWN0aW9uIG9mIHBFZGdlMSBhbmQgcEVkZ2UyCisgICAgICAgIFJhZGl1czogb3V0LCBkaXN0YW5jZSBiZXR3ZWVuIHBQb2ludCBhbmQgc2l0ZXMsIGFzc29zaWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgd2l0aCBwRWRnZTEgYW5kIHBFZGdlMiAocFBvaW50IGlzIHNpdHVhdGVkIG9uIHRoZSBlcXVhbAorICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSBmcm9tIHNpdGUsIGFzc29zaWF0ZWQgd2l0aCBwRWRnZTEgYW5kIGZyb20KKyAgICAgICAgICAgICAgICAgICAgc2l0ZSxhc3Nvc2lhdGVkIHdpdGggcEVkZ2UyKQorICAgICAgUmV0dXJuICAgIDogZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEgb3IKKyAgICAgICAgICAgICAgICA6IC0xLCBpZiBlZGdlcyBoYXZlIG5vIGludGVyc2VjdGlvbnMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK2Zsb2F0IF9jdlBhcl9PcGVuUGFySW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgaW50ZXJzZWN0aW9uIG9mIHR3byBlZGdlcy4gSW50ZXJzZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgdGhlIG5lYXJlc3QgdG8gdGhlIG1hcmtlZCBwb2ludCBvbiBwRWRnZTEKKyAgICAgICAgICAgICAgICAgICAgKHRoaXMgbWFya2VkIHBvaW50IGlzIHBFZGdlMS0+bm9kZTEtPm5vZGUpLgorICAgIEFyZ3VtZW50cyAKKyAgICBwRWRnZTEgOiBpbiwgIHBhcmFib2xpYyByYXkKKyAgICBwRWRnZTI6IGluLCAgcGFyYWJvbGljIHNlZ21lbnQKKyAgICAgICAgcFBvaW50OiBvdXQsIGludGVyc2VjdGlvbiBvZiBwRWRnZTEgYW5kIHBFZGdlMgorICAgICAgICBSYWRpdXM6IG91dCwgZGlzdGFuY2UgYmV0d2VlbiBwUG9pbnQgYW5kIHNpdGVzLCBhc3Nvc2lhdGVkCisgICAgICAgICAgICAgICAgICAgIHdpdGggcEVkZ2UxIGFuZCBwRWRnZTIgKHBQb2ludCBpcyBzaXR1YXRlZCBvbiB0aGUgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2UgZnJvbSBzaXRlLCBhc3Nvc2lhdGVkIHdpdGggcEVkZ2UxIGFuZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHNpdGUsYXNzb3NpYXRlZCB3aXRoIHBFZGdlMikKKyAgICAgIFJldHVybiAgICA6IGRpc3RhbmNlIGJldHdlZW4gcFBvaW50IGFuZCBtYXJrZWQgcG9pbnQgb24gcEVkZ2UxIG9yCisgICAgICAgICAgICAgICAgOiAtMSwgaWYgZWRnZXMgaGF2ZSBubyBpbnRlcnNlY3Rpb25zCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitmbG9hdCBfY3ZQYXJfQ2xvc2VQYXJJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cyk7CisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJzaWRpYXJ5IGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IAorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcEVkZ2UxICA6IGluCisgICAgICAgIHBFZGdlMiAgOiBvdXQKKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQordm9pZCBfY3ZNYWtlVHdpbkVkZ2UocEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UxKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IAorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcEVkZ2UgICA6IGluJm91dAorICAgICAgICBwRWRnZV9sZWZ0X3ByZXYgOiBpbiZvdXQKKyAgICAgICAgcFNpdGVfbGVmdCA6IGluJm91dAorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdlN0aWNrRWRnZUxlZnRCZWdpbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnRfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfbGVmdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiAKKyAgICBBcmd1bWVudHMgCisgICAgICAgIHBFZGdlICAgOiBpbiZvdXQKKyAgICAgICAgcEVkZ2VfcmlnaHRfbmV4dCA6IGluJm91dAorICAgICAgICBwU2l0ZV9yaWdodCA6IGluJm91dAorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdlN0aWNrRWRnZVJpZ2h0QmVnaW4ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9yaWdodF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZV9yaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiAKKyAgICBBcmd1bWVudHMgCisgICAgICAgIHBFZGdlICAgOiBpbiZvdXQKKyAgICAgICAgcEVkZ2VfbGVmdF9uZXh0IDogaW4mb3V0CisgICAgICAgIHBTaXRlX2xlZnQgOiBpbiZvdXQKKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQordm9pZCBfY3ZTdGlja0VkZ2VMZWZ0RW5kKHBDdlZvcm9ub2lFZGdlIHBFZGdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnRfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogCisgICAgQXJndW1lbnRzIAorICAgICAgICBwRWRnZSAgIDogaW4mb3V0CisgICAgICAgIHBFZGdlX3JpZ2h0X3ByZXYgOiBpbiZvdXQKKyAgICAgICAgcFNpdGVfcmlnaHQgOiBpbiZvdXQKKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQordm9pZCBfY3ZTdGlja0VkZ2VSaWdodEVuZChwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHRfcHJldiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZV9yaWdodCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiAKKyAgICBBcmd1bWVudHMgCisgICAgICAgIHBFZGdlX2xlZnRfY3VyICA6IGluCisgICAgICAgIHBFZGdlX2xlZnQgOiBpbgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworQ1ZfSU5MSU5FCit2b2lkIF9jdlR3aW5OVUxMTGVmdChwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0X2N1ciwKKyAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfbGVmdCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiAKKyAgICBBcmd1bWVudHMgCisgICAgICAgIHBFZGdlX3JpZ2h0X2N1ciA6IGluCisgICAgICAgIHBFZGdlX3JpZ2h0IDogaW4KKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQordm9pZCBfY3ZUd2luTlVMTFJpZ2h0KHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0X2N1ciwKKyAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0KTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHN0cnVjdCBDdlZvcm9ub2lOb2RlCisgICAgQXJndW1lbnRzIAorICAgICAgICBwTm9kZSAgIDogb3V0CisgICAgICAgICBwUG9pbnQgOiBpbiwgCisgICAgICAgIHJhZGl1cyAgOiBpbgorICAgICBSZXR1cm4gICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQordm9pZCBfY3ZJbml0Vm9yb25vaU5vZGUocEN2Vm9yb25vaU5vZGUgcE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIFQgcFBvaW50LCBmbG9hdCByYWRpdXMgPSAwKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzdHJ1Y3QgQ3ZWb3Jvbm9pU2l0ZQorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcFNpdGUgICA6IG91dAorICAgICAgICAgcE5vZGUxLHBOb2RlMixwUHJldl9zaXRlIDogaW4gCisgICAgIFJldHVybiAgICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDVl9JTkxJTkUKK3ZvaWQgX2N2SW5pdFZvcm9ub2lTaXRlKHBDdlZvcm9ub2lTaXRlIHBTaXRlLAorICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pTm9kZSBwTm9kZTEsCisgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lOb2RlIHBOb2RlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFByZXZfc2l0ZSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBmdW5jdGlvbiBwdXNocyB0aGUgZWxlbWVudCBpbiB0aGUgZW5kIG9mIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICBlbmQgcmV0dXJucyBpdHMgYWRyZXNzCisgICAgQXJndW1lbnRzIAorICAgICAgICAgICAgU2VxIDogaW4sIHBvaW50ZXIgdG8gdGhlIHNlcXVlbmNlCisgICAgICAgICAgIEVsZW0gOiBpbiwgZWxlbWVudCAKKyAgICAgUmV0dXJuICAgICA6IHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQorVCBfY3ZTZXFQdXNoKEN2U2VxKiBTZXEsIFQgcEVsZW0pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogZnVuY3Rpb24gcHVzaHMgdGhlIGVsZW1lbnQgaW4gdGhlIGJlZ2luIG9mIHRoZSBzZXF1ZW5jZQorICAgICAgICAgICAgICAgICAgICBlbmQgcmV0dXJucyBpdHMgYWRyZXNzCisgICAgQXJndW1lbnRzIAorICAgICAgICAgICAgU2VxIDogaW4sIHBvaW50ZXIgdG8gdGhlIHNlcXVlbmNlCisgICAgICAgICAgIEVsZW0gOiBpbiwgZWxlbWVudCAKKyAgICAgUmV0dXJuICAgICA6IHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgaW4gdGhlIHNlcXVlbmNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQorVCBfY3ZTZXFQdXNoRnJvbnQoQ3ZTZXEqIFNlcSwgVCBwRWxlbSk7IAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogZnVuY3Rpb24gcHVzaHMgdGhlIGVsZW1lbnQgcEhvbGUgaW4gcEhvbGVIaWVyYXJjaHktPkhvbGVTZXEKKyAgICAgICAgICAgICAgICAgICAgIHNvIGFzIGFsbCBlbGVtZW50cyBpbiB0aGlzIHNlcXVlbmNlIHdvdWxkIGJlIG5vcm1hbGl6ZWQKKyAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byBmaWVsZCAueF9jb29yZCBvZiBlbGVtZW50LiBwSG9sZUhpZXJhcmNoeS0+VG9wSG9sZQorICAgICAgICAgICAgICAgICAgICAgcG9pbnRzIHRvIGhvbGUgd2l0aCBzbWFsbGVzdCB4X2Nvb3JkLgorICAgIEFyZ3VtZW50cyAKK3BIb2xlSGllcmFyY2h5ICA6IGluLCBwb2ludGVyIHRvIHRoZSBzdHJ1Y3R1cgorICAgICAgICAgIHBIb2xlIDogaW4sIGVsZW1lbnQgCisgICAgIFJldHVybiAgICAgOiBwb2ludGVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQordm9pZCBfY3ZTZXFQdXNoSW5PcmRlcihDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0sIHBDdlZvcm9ub2lIb2xlIHBIb2xlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IGZ1bmN0aW9uIGludGVyc2VjdHMgZ2l2ZW4gZWRnZSBwRWRnZSAoYW5kIGhpcyB0d2luIGVkZ2UpCisgICAgICAgICAgICAgICAgICAgIGJ5IHBvaW50IHBOb2RlIG9uIHR3byBwYXJ0cworICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcEVkZ2UgICA6IGluLCBnaXZlbiBlZGdlCisgICAgICAgICAgcE5vZGUgOiBpbiwgZ2l2ZW4gcG9pbnQKKyAgICAgICAgRWRnZVNlcSA6IGluCisgICAgIFJldHVybiAgICAgOiBvbmUgb2YgcGFydHMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDVl9JTkxJTkUKK3BDdlZvcm9ub2lFZGdlIF9jdkRpdmlkZVJpZ2h0RWRnZShwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lOb2RlIHBOb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBFZGdlU2VxKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IGZ1bmN0aW9uIGludGVyc2VjdHMgZ2l2ZW4gZWRnZSBwRWRnZSAoYW5kIGhpcyB0d2luIGVkZ2UpCisgICAgICAgICAgICAgICAgICAgIGJ5IHBvaW50IHBOb2RlIG9uIHR3byBwYXJ0cworICAgIEFyZ3VtZW50cyAKKyAgICAgICAgcEVkZ2UgICA6IGluLCBnaXZlbiBlZGdlCisgICAgICAgICAgcE5vZGUgOiBpbiwgZ2l2ZW4gcG9pbnQKKyAgICAgICAgRWRnZVNlcSA6IGluCisgICAgIFJldHVybiAgICAgOiBvbmUgb2YgcGFydHMKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDVl9JTkxJTkUKK3BDdlZvcm9ub2lFZGdlIF9jdkRpdmlkZUxlZnRFZGdlKHBDdlZvcm9ub2lFZGdlIHBFZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pTm9kZSBwTm9kZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBFZGdlU2VxKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IGZ1bmN0aW9uIHB1c2hzIHRoZSBlbGVtZW50IGluIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlCisgICAgICAgICAgICAgICAgICAgIGVuZCByZXR1cm5zIGl0cyBhZHJlc3MKKyAgICBBcmd1bWVudHMgCisgICAgICAgICAgd3JpdGVyOiBpbiwgd3JpdGVyIGFzc29jaWF0ZWQgd2l0aCBzZXF1ZW5jZQorICAgICAgICAgIHBFbGVtIDogaW4sIGVsZW1lbnQgCisgICAgIFJldHVybiAgICAgOiBwb2ludGVyIHRvIHRoZSBlbGVtZW50IGluIHRoZSBzZXF1ZW5jZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RlbXBsYXRlPGNsYXNzIFQ+IENWX0lOTElORQorVCBfY3ZXcml0ZVNlcUVsZW0oVCBwRWxlbSwgQ3ZTZXFXcml0ZXIgJndyaXRlcik7CisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoZW1hdGljYWwgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNoYW5nZXMgeCBhbmQgeQorICAgIEFyZ3VtZW50cyAKKyAgICAgICAgICAgIHgseSA6IGluJm91dAorICAgICAgUmV0dXJuICAgIDogCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQordm9pZCBfY3ZTd2FwKFQgJngsIFQgJnkpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgdGhlIGludmVyc2UgbWFwIHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gb3J0b2dvbmFsIGFmZmluZSBtYXAKKyAgICBBcmd1bWVudHMgCisgICAgICAgICAgICBBICAgOiBpbiwgZ2l2ZW4gb3J0b2dvbmFsIGFmZmluZSBtYXAKKyAgICAgICAgICAgIEIgICA6IG91dCwgaW52ZXJzZSBtYXAKKyAgICAgIFJldHVybiAgICA6IDEsIGlmIGludmVyc2UgbWFwIGV4aXN0CisgICAgICAgICAgICAgICAgICAwLCBlbHNlCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQoraW50IF9jdkNhbGNPcnRvZ0ludmVyc2UoVCogQiwgVCogQSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyB0aGUgY29tcG9zaXRpb24gb2YgdHdvIGFmZmluZSBtYXBzCisgICAgQXJndW1lbnRzIAorICAgICAgICAgICAgQSxCIDogaW4sIGdpdmVuIGFmZmluZSBtYXBzCisgICAgICAgICAgICBSZXN1bHQ6IG91dCwgY29tcG9zaXRpb24gb2YgQSBhbmQgQiAoUmVzdWx0ID0gQUIpCisgICAgICBSZXR1cm4gICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNDb21wb3NpdGlvbihUKiBSZXN1bHQsVCogQSxUKiBCKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBpbWFnZSBvZiBwb2ludCB1bmRlciAKKyAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gYWZmaW4gbWFwCisgICAgQXJndW1lbnRzIAorICAgICAgICAgICAgQSAgIDogaW4sIGFmZmluZSBtYXBzCisgICAgICAgIHBQb2ludCAgOiBpbiwgcG9pbnRlciB0byBwb2ludAorICAgICAgICBwSW1nUG9pbnQ6b3V0LCBwb2ludGVyIHRvIGltYWdlIG9mIHBvaW50CisgICAgICBSZXR1cm4gICAgOiAKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0ZW1wbGF0ZTxjbGFzcyBUPiBDVl9JTkxJTkUKK3ZvaWQgX2N2Q2FsY1BvaW50SW1hZ2UocEN2UG9pbnRGbG9hdCBwSW1nUG9pbnQscEN2UG9pbnRGbG9hdCBwUG9pbnQsVCogQSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyB0aGUgaW1hZ2Ugb2YgdmVjdG9yIHVuZGVyIAorICAgICAgICAgICAgICAgICAgICBnaXZlbiBhZmZpbiBtYXAKKyAgICBBcmd1bWVudHMgCisgICAgICAgICAgICBBICAgOiBpbiwgYWZmaW5lIG1hcHMKKyAgICAgICAgcFZlY3RvciA6IGluLCBwb2ludGVyIHRvIHZlY3RvcgorICAgICAgICBwSW1nVmVjdG9yOm91dCwgcG9pbnRlciB0byBpbWFnZSBvZiB2ZWN0b3IKKyAgICAgIFJldHVybiAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RlbXBsYXRlPGNsYXNzIFQ+IENWX0lOTElORQordm9pZCBfY3ZDYWxjVmVjdG9ySW1hZ2UocEN2RGlyZWN0aW9uIHBJbWdWZWN0b3IscEN2RGlyZWN0aW9uIHBWZWN0b3IsVCogQSk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBjb21wdXRlcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgCisgICAgICAgICAgICAgICAgICAgIGFuZCBzaXRlLiBJbnRlcm5hbCBmdW5jdGlvbi4KKyAgICBBcmd1bWVudHMgCisgICAgICAgIHBQb2ludCAgOiBpbiwgcG9pbnQKKyAgICAgICAgcFNpdGUgICA6IGluLCBzaXRlCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQorZmxvYXQgX2N2Q2FsY0Rpc3QocEN2UG9pbnRGbG9hdCBwUG9pbnQsIHBDdlZvcm9ub2lTaXRlIHBTaXRlKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIEF1dGhvciAgICAgIDogQW5kcmV5IFNvYm9sZXYKKyAgICBEZXNjcmlwdGlvbiA6IEZ1bmN0aW9uIGNvbXB1dGVzIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHR3byBwb2ludHMgCisgICAgQXJndW1lbnRzIAorICAgIHBQb2ludDEscFBvaW50MiA6IGluLCB0d28gcG9pbnRzCisgICAgICBSZXR1cm4gICAgOiBkaXN0YW5jZQorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0NWX0lOTElORQorZmxvYXQgX2N2UFBEaXN0KHBDdlBvaW50RmxvYXQgcFBvaW50MSxwQ3ZQb2ludEZsb2F0IHBQb2ludDIpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gY29tcHV0ZXMgdGhlIGRpc3RhbmNlIGJldHdpbiBwb2ludCBhbmQgCisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuIEludGVybmFsIGZ1bmN0aW9uLiAKKyAgICBBcmd1bWVudHMgCisgICAgICAgICAgcFBvaW50OiBpbiwgcG9pbnQKKyAgICBwUG9pbnQxLHBQb2ludDIgOiBpbiwgc2VnbWVudCBbcFBvaW50MSxwUG9pbnQyXQorICAgICAgIFJldHVybiAgIDogZGlzdGFuY2UKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitDVl9JTkxJTkUKK2Zsb2F0IF9jdlBMRGlzdChwQ3ZQb2ludEZsb2F0IHBQb2ludCxwQ3ZQb2ludEZsb2F0IHBQb2ludDEscEN2RGlyZWN0aW9uIHBEaXJlY3Rpb24pOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRnVuY3Rpb24gc29sdmVzIHRoZSBzcXVhciBlcXVhdGlvbiB3aXRoIHJlYWwgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICAgIFQgLSBmbG9hdCBvciBkb3VibGUKKyAgICBBcmd1bWVudHMgCisgICAgIGMyLGMxLGMwOiBpbiwgcmVhbCBjb2VmZmljaWVudHMgb2YgcG9seW5vbSAKKyAgICAgICAgICAgICAgIFg6IG91dCwgYXJyYXkgb2Ygcm9vdHMKKyAgICAgUmV0dXJuICAgICA6IG51bWJlciBvZiByb290cworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RlbXBsYXRlIDxjbGFzcyBUPiAKK2ludCBfY3ZTb2x2ZUVxdTJ0aFIoVCBjMiwgVCBjMSwgVCBjMCwgVCogWCk7CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBBdXRob3IgICAgICA6IEFuZHJleSBTb2JvbGV2CisgICAgRGVzY3JpcHRpb24gOiBGdW5jdGlvbiBzb2x2ZXMgdGhlIGxpbmVhciBlcXVhdGlvbiB3aXRoIHJlYWwgb3IgY29tcGxleCBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgICAgVCAtIGZsb2F0IG9yIGRvdWJsZSBvciBjb21wbGV4CisgICAgQXJndW1lbnRzIAorICAgICAgICBjMSxjMDogaW4sIHJlYWwgb3IgY29tcGxleCBjb2VmZmljaWVudHMgb2YgcG9seW5vbSAKKyAgICAgICAgICAgICAgIFg6IG91dCwgYXJyYXkgb2Ygcm9vdHMKKyAgICAgUmV0dXJuICAgICA6IG51bWJlciBvZiByb290cworICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3RlbXBsYXRlIDxjbGFzcyBUPiBDVl9JTkxJTkUKK2ludCBfY3ZTb2x2ZUVxdTF0aChUIGMxLCBUIGMwLCBUKiBYKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlIEJsb2NrIEluY3JlYXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQXV0aG9yICAgICAgOiBBbmRyZXkgU29ib2xldgorICAgIERlc2NyaXB0aW9uIDogRm9yIGVhY2ggc2VxdWVuY2UgZnVuY3Rpb24gY3JlYXRlcyB0aGUgbWVtb3J5IGJsb2NrIHN1ZmZpY2llbnQgdG8gc3RvcmUKKyAgICAgICAgICAgICAgICAgIGFsbCBlbGVtZW50cyBvZiBzZXF1bmNlCisgICAgQXJndW1lbnRzIAorICAgICAgICBwVm9yb25vaURpYWdyYW1JbnQ6IGluLCBwb2ludGVyIHRvIHN0cnVjdCwgd2hpY2ggY29udGFpbnMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIFZvcm9ub2kgRGlhZ3JhbS4KKyAgICAgICAgdmVydGljZXNfbnVtYmVyOiBpbiwgbnVtYmVyIG9mIHZlcnRpY2VzIGluIHBvbHlnb24KKyAgICAgUmV0dXJuICAgICA6IAorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgX2N2U2V0U2VxQmxvY2tTaXplKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbUludCxpbnQgdmVydGljZXNfbnVtYmVyKQoreworICAgIGludCBOID0gMip2ZXJ0aWNlc19udW1iZXI7CisgICAgY3ZTZXRTZXFCbG9ja1NpemUocFZvcm9ub2lEaWFncmFtSW50LT5TaXRlU2VxLE4qcFZvcm9ub2lEaWFncmFtSW50LT5TaXRlU2VxLT5lbGVtX3NpemUpOworICAgIGN2U2V0U2VxQmxvY2tTaXplKHBWb3Jvbm9pRGlhZ3JhbUludC0+RWRnZVNlcSwzKk4qcFZvcm9ub2lEaWFncmFtSW50LT5FZGdlU2VxLT5lbGVtX3NpemUpOworICAgIGN2U2V0U2VxQmxvY2tTaXplKHBWb3Jvbm9pRGlhZ3JhbUludC0+Tm9kZVNlcSw1Kk4qcFZvcm9ub2lEaWFncmFtSW50LT5Ob2RlU2VxLT5lbGVtX3NpemUpOworICAgIGN2U2V0U2VxQmxvY2tTaXplKHBWb3Jvbm9pRGlhZ3JhbUludC0+UGFyYWJvbGFTZXEsTipwVm9yb25vaURpYWdyYW1JbnQtPlBhcmFib2xhU2VxLT5lbGVtX3NpemUpOworICAgIGN2U2V0U2VxQmxvY2tTaXplKHBWb3Jvbm9pRGlhZ3JhbUludC0+RGlyZWN0aW9uU2VxLDMqTipwVm9yb25vaURpYWdyYW1JbnQtPkRpcmVjdGlvblNlcS0+ZWxlbV9zaXplKTsKKyAgICBjdlNldFNlcUJsb2NrU2l6ZShwVm9yb25vaURpYWdyYW1JbnQtPkNoYWluU2VxLE4qcFZvcm9ub2lEaWFncmFtSW50LT5EaXJlY3Rpb25TZXEtPmVsZW1fc2l6ZSk7CisgICAgY3ZTZXRTZXFCbG9ja1NpemUocFZvcm9ub2lEaWFncmFtSW50LT5Ib2xlU2VxLDEwMCpwVm9yb25vaURpYWdyYW1JbnQtPkhvbGVTZXEtPmVsZW1fc2l6ZSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uIHJlYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK0NWX0lNUEwgaW50ICAgY3ZWb3Jvbm9pRGlhZ3JhbUZyb21Db250b3VyKEN2U2VxKiBDb250b3VyU2VxLCAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtMkQqKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIFZvcm9ub2lTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyBjb250b3VyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRvdXJfb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRfbnVtYmVyKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZWb3Jvbm9pRGlhZ3JhbUZyb21Db250b3VyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXQqIFNpdGVTZXEgPSBOVUxMOworICAgIEN2U2VxKiBDdXJDb250b3VyU2VxID0gTlVMTDsKKyAgICBDdlZvcm9ub2lEaWFncmFtSW50IFZvcm9ub2lEaWFncmFtSW50OworICAgIEN2U2VxV3JpdGVyIE5vZGVXcml0ZXIsIEVkZ2VXcml0ZXI7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlOworCisgICAgbWVtc2V0KCAmVm9yb25vaURpYWdyYW1JbnQsIDAsIHNpemVvZihWb3Jvbm9pRGlhZ3JhbUludCkgKTsKKworICAgIGlmKCAhQ29udG91clNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIkNvbnRvdXIgc2VxdWVuY2UgaXMgZW1wdHkiICk7CisKKyAgICBpZighVm9yb25vaVN0b3JhZ2UpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIlN0b3JhZ2UgaXMgbm90IGluaXRpYWxpemVkIiApOworICAgCisgICAgaWYoIGNvbnRvdXJfdHlwZSA8IDAgfHwgY29udG91cl90eXBlID4gMikKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiVW5zdXBwb3J0ZWQgcGFyYW1ldGVyOiB0eXBlIiApOworCisgICAgaWYoIGNvbnRvdXJfb3JpZW50YXRpb24gIT0gMSAmJiAgY29udG91cl9vcmllbnRhdGlvbiAhPSAtMSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiVW5zdXBwb3J0ZWQgcGFyYW1ldGVyOiBvcmllbnRhdGlvbiIgKTsKKworICAgIHN0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZShWb3Jvbm9pU3RvcmFnZSk7CisgICAgKCpWb3Jvbm9pRGlhZ3JhbSkgPSAoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiljdkNyZWF0ZVNldCgwLHNpemVvZihDdlZvcm9ub2lEaWFncmFtMkQpLHNpemVvZihDdlZvcm9ub2lOb2RlMkQpLCBzdG9yYWdlKTsKKyAgICBzdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoVm9yb25vaVN0b3JhZ2UpOworICAgICgqVm9yb25vaURpYWdyYW0pLT5lZGdlcyA9IGN2Q3JlYXRlU2V0KDAsc2l6ZW9mKEN2U2V0KSxzaXplb2YoQ3ZWb3Jvbm9pRWRnZTJEKSwgc3RvcmFnZSk7CisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKChDdlNlcSopKCpWb3Jvbm9pRGlhZ3JhbSktPmVkZ2VzLCAmRWRnZVdyaXRlcik7CisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKChDdlNlcSopKCpWb3Jvbm9pRGlhZ3JhbSksICZOb2RlV3JpdGVyKTsKKworICAgICAgICBmb3IoQ3VyQ29udG91clNlcSA9IENvbnRvdXJTZXE7XAorICAgICAgICAgICAgQ3VyQ29udG91clNlcSAhPSBOVUxMO1wKKyAgICAgICAgICAgIEN1ckNvbnRvdXJTZXEgPSBDdXJDb250b3VyU2VxLT5oX25leHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKF9jdkxlZShDdXJDb250b3VyU2VxLCAmVm9yb25vaURpYWdyYW1JbnQsVm9yb25vaVN0b3JhZ2UsY29udG91cl90eXBlLGNvbnRvdXJfb3JpZW50YXRpb24sYXR0ZW1wdF9udW1iZXIpKQorICAgIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCFfY3ZDb252ZXJ0KCpWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pRGlhZ3JhbUludCxTaXRlU2VxLE5vZGVXcml0ZXIsRWRnZVdyaXRlcixWb3Jvbm9pU3RvcmFnZSxjb250b3VyX29yaWVudGF0aW9uKSkKKyAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihDdXJDb250b3VyU2VxLT50b3RhbCA+PSAzKQorICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGN2RW5kV3JpdGVTZXEoJkVkZ2VXcml0ZXIpOworICAgICAgICBjdkVuZFdyaXRlU2VxKCZOb2RlV3JpdGVyKTsKKyAgICAgICAgaWYoU2l0ZVNlcSAhPSBOVUxMKQorICAgICAgICAgICAgcmV0dXJuIDE7CisKKyAgICAKKyAgICBfX0VORF9fOworICAgIHJldHVybiAwOworfS8vZW5kIG9mIGN2Vm9yb25vaURpYWdyYW1Gcm9tQ29udG91ciAKKworQ1ZfSU1QTCBpbnQgICBjdlZvcm9ub2lEaWFncmFtRnJvbUltYWdlKElwbEltYWdlKiBwSW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiogQ29udG91clNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogVm9yb25vaVN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TGVlUGFyYW1ldGVycyByZWd1bGFyaXphdGlvbl9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFwcHJveF9wcmVjaXNpb24pCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlZvcm9ub2lEaWFncmFtRnJvbUNvbnRvdXIiICk7CisgICAgaW50IFJFU1VMVCA9IDA7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgSXBsSW1hZ2UqIHBXb3JrSW1hZ2UgPSBOVUxMOworICAgIEN2U2l6ZSBpbWFnZV9zaXplOworICAgIGludCBpLCBtdWx0aXBsaWNhdG9yID0gMzsKKyAgICAKKyAgICBpbnQgYXBwcm94X21ldGhvZDsKKyAgICBDdk1lbVN0b3JhZ2UqIEFwcHJveENvbnRvdXJTdG9yYWdlID0gTlVMTDsKKyAgICBDdlNlcSogQXBwcm94Q29udG91clNlcSA9IE5VTEw7CisKKyAgICBpZiggIUNvbnRvdXJTZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCJDb250b3VyIHNlcXVlbmNlIGlzIG5vdCBpbml0aWFsaXplZCIgKTsKKworICAgIGlmKCAoKkNvbnRvdXJTZXEpLT50b3RhbCAhPSAwKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCJDb250b3VyIHNlcXVlbmNlIGlzIG5vdCBlbXB0eSIgKTsKKworICAgIGlmKCFWb3Jvbm9pU3RvcmFnZSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiU3RvcmFnZSBpcyBub3QgaW5pdGlhbGl6ZWQiICk7CisKKyAgICBpZighcEltYWdlKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCJJbWFnZSBpcyBub3QgaW5pdGlhbGl6ZWQiICk7CisKKyAgICBpZihwSW1hZ2UtPm5DaGFubmVscyAhPSAxIHx8IHBJbWFnZS0+ZGVwdGggIT0gOCkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiVW5zdXBwb3J0ZWQgaW1hZ2UgZm9ybWF0IiApOworCisgICAgaWYoYXBwcm94X3ByZWNpc2lvbjwwICYmIGFwcHJveF9wcmVjaXNpb24gIT0gQ1ZfTEVFX0FVVE8pCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIlVuc3VwcG9ydGVkIHByZXNpc2lvbiB2YWx1ZSIgKTsKKyAgICAKKyAgICBzd2l0Y2gocmVndWxhcml6YXRpb25fbWV0aG9kKQorICAgIHsKKyAgICAgICAgY2FzZSBDVl9MRUVfRVJPREU6ICBpbWFnZV9zaXplLndpZHRoID0gcEltYWdlLT53aWR0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9zaXplLmhlaWdodCA9IHBJbWFnZS0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKGltYWdlX3NpemUsOCwxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkVyb2RlKHBJbWFnZSxwV29ya0ltYWdlLDAsMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwcm94X21ldGhvZCA9IENWX0NIQUlOX0FQUFJPWF9UQzg5X0wxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWX0xFRV9aT09NOiAgIGltYWdlX3NpemUud2lkdGggPSBtdWx0aXBsaWNhdG9yKnBJbWFnZS0+d2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2Vfc2l6ZS5oZWlnaHQgPSBtdWx0aXBsaWNhdG9yKnBJbWFnZS0+aGVpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXb3JrSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKGltYWdlX3NpemUsOCwxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJlc2l6ZShwSW1hZ2UsIHBXb3JrSW1hZ2UsIENWX0lOVEVSX05OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3hfbWV0aG9kID0gQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfTDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfTEVFX05PTjogICAgcFdvcmtJbWFnZSA9IHBJbWFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3hfbWV0aG9kID0gQ1ZfQ0hBSU5fQVBQUk9YX1RDODlfTDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywiVW5zdXBwb3J0ZWQgcmVndWxhcmlzYXRpb24gbWV0aG9kIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgfQorCisgICAgY3ZGaW5kQ29udG91cnMocFdvcmtJbWFnZSwgKCpDb250b3VyU2VxKS0+c3RvcmFnZSwgQ29udG91clNlcSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkNvbnRvdXIpLCBDVl9SRVRSX0NDT01QLCBhcHByb3hfbWV0aG9kICk7CisKKyAgICBpZihwV29ya0ltYWdlICYmIHBXb3JrSW1hZ2UgIT0gcEltYWdlICkKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoJnBXb3JrSW1hZ2UpOworICAgIAorICAgIEFwcHJveENvbnRvdXJTdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKDApOworICAgIGlmKGFwcHJveF9wcmVjaXNpb24gPiAwKQorICAgIHsKKyAgICAgICAgQXBwcm94Q29udG91clNlcSA9IGN2QXBwcm94UG9seSgqQ29udG91clNlcSwgc2l6ZW9mKEN2Q29udG91ciksIEFwcHJveENvbnRvdXJTdG9yYWdlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QT0xZX0FQUFJPWF9EUCxhcHByb3hfcHJlY2lzaW9uLDEpOworICAgIAorICAgICAgICBSRVNVTFQgPSBjdlZvcm9ub2lEaWFncmFtRnJvbUNvbnRvdXIoQXBwcm94Q29udG91clNlcSxWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pU3RvcmFnZSxDVl9MRUVfSU5ULC0xLDEwKTsKKyAgICB9CisgICAgZWxzZSBpZihhcHByb3hfcHJlY2lzaW9uID09IENWX0xFRV9BVVRPKQorICAgIHsKKyAgICAgICAgQXBwcm94Q29udG91clNlcSA9ICpDb250b3VyU2VxOworICAgICAgICBmb3IoaSA9IDE7IGkgPCA1MDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBSRVNVTFQgPSBjdlZvcm9ub2lEaWFncmFtRnJvbUNvbnRvdXIoQXBwcm94Q29udG91clNlcSxWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pU3RvcmFnZSxDVl9MRUVfSU5ULC0xLDEpOworICAgICAgICAgICAgaWYoUkVTVUxUKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQXBwcm94Q29udG91clNlcSA9IGN2QXBwcm94UG9seShBcHByb3hDb250b3VyU2VxLCBzaXplb2YoQ3ZDb250b3VyKSxBcHByb3hDb250b3VyU3RvcmFnZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1BPTFlfQVBQUk9YX0RQLChmbG9hdClpLDEpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgUkVTVUxUID0gY3ZWb3Jvbm9pRGlhZ3JhbUZyb21Db250b3VyKCpDb250b3VyU2VxLFZvcm9ub2lEaWFncmFtLFZvcm9ub2lTdG9yYWdlLENWX0xFRV9JTlQsLTEsMTApOworLyoKKyAgICBpZihBcHByb3hDb250b3VyU2VxKQorICAgIHsKKyAgICAgICAgY3ZDbGVhck1lbVN0b3JhZ2UoICgqQ29udG91clNlcSktPnN0b3JhZ2UgKTsKKyAgICAgICAgKkNvbnRvdXJTZXEgPSBjdkNyZWF0ZVNlcSgwLHNpemVvZihDdlNlcSksc2l6ZW9mKEN2UG9pbnQpLCgqQ29udG91clNlcSktPnN0b3JhZ2UpOworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICAgICAgQ3ZQb2ludCBQb2ludDsKKyAgICAgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCpDb250b3VyU2VxLCAmd3JpdGVyKTsKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoQXBwcm94Q29udG91clNlcSwgJnJlYWRlcik7CisgICAgICAgIGZvcihpbnQgaSA9IDA7aSA8IEFwcHJveENvbnRvdXJTZXEtPnRvdGFsO2krKykKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTShQb2ludCxyZWFkZXIpOworICAgICAgICAgICAgUG9pbnQueSA9IDYwMCAtIFBvaW50Lnk7CisgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTShQb2ludCx3cml0ZXIpOworICAgICAgICB9CisgICAgICAgIGN2RW5kV3JpdGVTZXEoJndyaXRlcik7CisgICAgfQorICAgICovCisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZBcHByb3hDb250b3VyU3RvcmFnZSk7CisgICAgCisgICAgCisgICAgX19FTkRfXzsKKyAgICByZXR1cm4gUkVTVUxUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9Ly9lbmQgb2YgY3ZWb3Jvbm9pRGlhZ3JhbUZyb21JbWFnZQorCitDVl9JTVBMIHZvaWQgY3ZSZWxlYXNlVm9yb25vaVN0b3JhZ2UoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqKiBwVm9yb25vaVN0b3JhZ2UpCit7CisgICAgLypDVl9GVU5DTkFNRSggImN2UmVsZWFzZVZvcm9ub2lTdG9yYWdlIiApOyovCisgICAgX19CRUdJTl9fOworICAgIAorICAgIEN2U2VxKiBTZXE7CisKKyAgICBpZihWb3Jvbm9pRGlhZ3JhbS0+c3RvcmFnZSkKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmVm9yb25vaURpYWdyYW0tPnN0b3JhZ2UpOworICAgIGZvcihTZXEgPSAoQ3ZTZXEqKVZvcm9ub2lEaWFncmFtLT5zaXRlczsgU2VxICE9IE5VTEw7IFNlcSA9IFNlcS0+aF9uZXh0KQorICAgICAgICBpZihTZXEtPnN0b3JhZ2UpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZTZXEtPnN0b3JhZ2UpOworICAgIGZvcihTZXEgPSAoQ3ZTZXEqKVZvcm9ub2lEaWFncmFtLT5lZGdlczsgU2VxICE9IE5VTEw7IFNlcSA9IFNlcS0+aF9uZXh0KQorICAgICAgICBpZihTZXEtPnN0b3JhZ2UpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZTZXEtPnN0b3JhZ2UpOworCisgICAgaWYoKnBWb3Jvbm9pU3RvcmFnZSkKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZShwVm9yb25vaVN0b3JhZ2UpOworCisgICAgX19FTkRfXzsKK30vL2VuZCBvZiBjdlJlbGVhc2VWb3Jvbm9pU3RvcmFnZQorCitzdGF0aWMgaW50ICBfY3ZMZWUoQ3ZTZXEqIENvbnRvdXJTZXEsCisgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbUludCwKKyAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgQ3ZMZWVQYXJhbWV0ZXJzIGNvbnRvdXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRvdXJfb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGludCBhdHRlbXB0X251bWJlcikKK3sKKyAgICAvL29yaWVudGF0aW9uID0gMSBmb3IgbGVmdCBjb29yZGluYXQgc3lzdGVtCisgICAgLy9vcmllbnRhdGlvbiA9IC0xIGZvciByaWdodCBjb29yZGluYXQgc3lzdGVtCisgICAgaWYoQ29udG91clNlcS0+dG90YWw8MykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpbnQgYXR0ZW1wdCA9IDA7CisgICAgQ3ZWb3Jvbm9pU3RvcmFnZUludCBWb3Jvbm9pU3RvcmFnZUludDsKKworICAgIHNyYW5kKChpbnQpdGltZShOVUxMKSk7CisKK05FWFRBVFRFTVBUOgorICAgIFZvcm9ub2lTdG9yYWdlSW50LlNpdGVTdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoVm9yb25vaVN0b3JhZ2UpOworICAgIFZvcm9ub2lTdG9yYWdlSW50Lk5vZGVTdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoVm9yb25vaVN0b3JhZ2UpOworICAgIFZvcm9ub2lTdG9yYWdlSW50LkVkZ2VTdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoVm9yb25vaVN0b3JhZ2UpOworICAgIFZvcm9ub2lTdG9yYWdlSW50LlBhcmFib2xhU3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKTsKKyAgICBWb3Jvbm9pU3RvcmFnZUludC5DaGFpblN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoMCk7CisgICAgVm9yb25vaVN0b3JhZ2VJbnQuRGlyZWN0aW9uU3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKTsKKyAgICBWb3Jvbm9pU3RvcmFnZUludC5Ib2xlU3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKTsKKworICAgIHBWb3Jvbm9pRGlhZ3JhbUludC0+U2l0ZVNlcSA9IGN2Q3JlYXRlU2VxKDAsc2l6ZW9mKEN2U2VxKSxzaXplb2YoQ3ZWb3Jvbm9pU2l0ZUludCksVm9yb25vaVN0b3JhZ2VJbnQuU2l0ZVN0b3JhZ2UpOworICAgIHBWb3Jvbm9pRGlhZ3JhbUludC0+Tm9kZVNlcSA9IGN2Q3JlYXRlU2VxKDAsc2l6ZW9mKEN2U2VxKSxzaXplb2YoQ3ZWb3Jvbm9pTm9kZUludCksVm9yb25vaVN0b3JhZ2VJbnQuTm9kZVN0b3JhZ2UpOworICAgIHBWb3Jvbm9pRGlhZ3JhbUludC0+RWRnZVNlcSA9IGN2Q3JlYXRlU2VxKDAsc2l6ZW9mKEN2U2VxKSxzaXplb2YoQ3ZWb3Jvbm9pRWRnZUludCksVm9yb25vaVN0b3JhZ2VJbnQuRWRnZVN0b3JhZ2UpOworICAgIHBWb3Jvbm9pRGlhZ3JhbUludC0+Q2hhaW5TZXEgID0gY3ZDcmVhdGVTZXEoMCxzaXplb2YoQ3ZTZXEpLHNpemVvZihDdlZvcm9ub2lDaGFpbkludCksVm9yb25vaVN0b3JhZ2VJbnQuQ2hhaW5TdG9yYWdlKTsKKyAgICBwVm9yb25vaURpYWdyYW1JbnQtPkRpcmVjdGlvblNlcSA9IGN2Q3JlYXRlU2VxKDAsc2l6ZW9mKEN2U2VxKSxzaXplb2YoQ3ZEaXJlY3Rpb24pLFZvcm9ub2lTdG9yYWdlSW50LkRpcmVjdGlvblN0b3JhZ2UpOworICAgIHBWb3Jvbm9pRGlhZ3JhbUludC0+UGFyYWJvbGFTZXEgPSAgY3ZDcmVhdGVTZXEoMCxzaXplb2YoQ3ZTZXEpLHNpemVvZihDdlZvcm9ub2lQYXJhYm9sYUludCksVm9yb25vaVN0b3JhZ2VJbnQuUGFyYWJvbGFTdG9yYWdlKTsKKyAgICBwVm9yb25vaURpYWdyYW1JbnQtPkhvbGVTZXEgPSAgY3ZDcmVhdGVTZXEoMCxzaXplb2YoQ3ZTZXEpLHNpemVvZihDdlZvcm9ub2lIb2xlSW50KSxWb3Jvbm9pU3RvcmFnZUludC5Ib2xlU3RvcmFnZSk7CisKKyAgICBfY3ZTZXRTZXFCbG9ja1NpemUocFZvcm9ub2lEaWFncmFtSW50LENvbnRvdXJTZXEtPnRvdGFsKTsKKyAgICAKKyAgICBpZighX2N2Q29uc3R1Y3RTaXRlcyhDb250b3VyU2VxLCBwVm9yb25vaURpYWdyYW1JbnQsIGNvbnRvdXJfdHlwZSxjb250b3VyX29yaWVudGF0aW9uKSkKKyAgICB7CisgICAgICAgIGF0dGVtcHQgPSBhdHRlbXB0X251bWJlcjsKKyAgICAgICAgZ290byBGQVVMVDsKKyAgICB9CisgICAgX2N2UmFuZG9tTW9kaWZpY2F0aW9uKHBWb3Jvbm9pRGlhZ3JhbUludCwgMCxwVm9yb25vaURpYWdyYW1JbnQtPk5vZGVTZXEtPnRvdGFsLDAuMmYpOworCisgICAgaWYoIV9jdkNvbnN0cnVjdENoYWlucyhwVm9yb25vaURpYWdyYW1JbnQpKQorICAgIHsKKyAgICAgICAgYXR0ZW1wdCA9IGF0dGVtcHRfbnVtYmVyOworICAgICAgICBnb3RvIEZBVUxUOworICAgIH0KKworICAgIGlmKCFfY3ZDb25zdHJ1Y3RTa2VsZXRvbihwVm9yb25vaURpYWdyYW1JbnQpKQorICAgICAgICBnb3RvIEZBVUxUOyAKKworICAgIF9jdkNvbnN0cnVjdFNpdGVUcmVlKHBWb3Jvbm9pRGlhZ3JhbUludCk7CisgICAgCisvL1NVQ0NFU1M6CisgICAgX2N2UmVsZWFzZVZvcm9ub2lTdG9yYWdlKCZWb3Jvbm9pU3RvcmFnZUludCwwLDEpOworICAgIHJldHVybiAxOworCitGQVVMVDoKKyAgICBfY3ZSZWxlYXNlVm9yb25vaVN0b3JhZ2UoJlZvcm9ub2lTdG9yYWdlSW50LDEsMSk7CisgICAgaWYoKythdHRlbXB0IDwgYXR0ZW1wdF9udW1iZXIpCisgICAgICAgIGdvdG8gTkVYVEFUVEVNUFQ7CisKKyAgICByZXR1cm4gMDsKK30vLyBlbmQgb2YgX2N2TGVlCisKK3N0YXRpYyBpbnQgX2N2Q29uc3R1Y3RTaXRlcyhDdlNlcSogQ29udG91clNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZMZWVQYXJhbWV0ZXJzIGNvbnRvdXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udG91cl9vcmllbnRhdGlvbikKK3sKKyAgICBwVm9yb25vaURpYWdyYW0tPnJlZmxleF9zaXRlID0gTlVMTDsKKyAgICBwVm9yb25vaURpYWdyYW0tPnRvcF9ob2xlID0gTlVMTDsgICAKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIHN3aXRjaChjb250b3VyX3R5cGUpCisgICAgeworICAgICAgICBjYXNlIENWX0xFRV9JTlQgOiAgICByZXN1bHQgPSBfY3ZDb25zdHJ1Y3RFeHRTaXRlcyhwVm9yb25vaURpYWdyYW0sQ29udG91clNlcSxjb250b3VyX29yaWVudGF0aW9uLChpbnQpMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWX0xFRV9GTE9BVCA6ICByZXN1bHQgPSBfY3ZDb25zdHJ1Y3RFeHRTaXRlcyhwVm9yb25vaURpYWdyYW0sQ29udG91clNlcSxjb250b3VyX29yaWVudGF0aW9uLChmbG9hdCkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfTEVFX0RPVUJMRSA6IHJlc3VsdCA9IF9jdkNvbnN0cnVjdEV4dFNpdGVzKHBWb3Jvbm9pRGlhZ3JhbSxDb250b3VyU2VxLGNvbnRvdXJfb3JpZW50YXRpb24sKGRvdWJsZSkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZighcmVzdWx0KQorICAgICAgICByZXR1cm4gMDsKKworICAgIEN2U2VxKiBDdXJTaXRlU2VxOyAKKyAgICBDdlZvcm9ub2lIb2xlSW50IEhvbGUgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxmYWxzZSwwfTsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwVG9wU2l0ZSA9IDA7CisgICAgZm9yKEN2U2VxKiBDdXJDb250b3VyU2VxID0gQ29udG91clNlcS0+dl9uZXh0O1wKKyAgICAgICAgQ3VyQ29udG91clNlcSAhPSBOVUxMO1wKKyAgICAgICAgQ3VyQ29udG91clNlcSA9IEN1ckNvbnRvdXJTZXEtPmhfbmV4dCkKKyAgICB7CisgICAgICAgIGlmKEN1ckNvbnRvdXJTZXEtPnRvdGFsID09IDApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBDdXJTaXRlU2VxID0gY3ZDcmVhdGVTZXEoMCxzaXplb2YoQ3ZTZXEpLHNpemVvZihDdlZvcm9ub2lTaXRlSW50KSxwVm9yb25vaURpYWdyYW0tPlNpdGVTZXEtPnN0b3JhZ2UpOworICAgICAgICBzd2l0Y2goY29udG91cl90eXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIENWX0xFRV9JTlQgOiAgIHJlc3VsdCA9IF9jdkNvbnN0cnVjdEludFNpdGVzKHBWb3Jvbm9pRGlhZ3JhbSxDdXJTaXRlU2VxLEN1ckNvbnRvdXJTZXEscFRvcFNpdGUsY29udG91cl9vcmllbnRhdGlvbiwoaW50KTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQ1ZfTEVFX0ZMT0FUIDogcmVzdWx0ID0gX2N2Q29uc3RydWN0SW50U2l0ZXMocFZvcm9ub2lEaWFncmFtLEN1clNpdGVTZXEsQ3VyQ29udG91clNlcSxwVG9wU2l0ZSxjb250b3VyX29yaWVudGF0aW9uLChmbG9hdCkxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENWX0xFRV9ET1VCTEUgOnJlc3VsdCA9IF9jdkNvbnN0cnVjdEludFNpdGVzKHBWb3Jvbm9pRGlhZ3JhbSxDdXJTaXRlU2VxLEN1ckNvbnRvdXJTZXEscFRvcFNpdGUsY29udG91cl9vcmllbnRhdGlvbiwoZG91YmxlKTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZighcmVzdWx0KQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgSG9sZS5TaXRlU2VxID0gQ3VyU2l0ZVNlcTsKKyAgICAgICAgSG9sZS5zaXRlX3RvcCA9IHBUb3BTaXRlOworICAgICAgICBIb2xlLnhfY29vcmQgPSBwVG9wU2l0ZS0+bm9kZTEtPm5vZGUueDsKKyAgICAgICAgSG9sZS5lcnJvciA9IGZhbHNlOworICAgICAgICBfY3ZTZXFQdXNoSW5PcmRlcihwVm9yb25vaURpYWdyYW0sICZIb2xlKTsKKyAgICB9CisgICAgcmV0dXJuIDE7Cit9Ly9lbmQgb2YgX2N2Q29uc3R1Y3RTaXRlcworCitzdGF0aWMgaW50IF9jdkNvbnN0cnVjdENoYWlucyhDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgaWYoIV9jdkNvbnN0cnVjdEV4dENoYWlucyhwVm9yb25vaURpYWdyYW0pKQorICAgICAgICByZXR1cm4gMDsKKworICAgIEN2U2VxKiBDdXJyQ2hhaW5TZXE7CisgICAgZm9yKHBDdlZvcm9ub2lIb2xlIHBIb2xlID0gcFZvcm9ub2lEaWFncmFtLT50b3BfaG9sZTtcCisgICAgICAgIHBIb2xlICE9IE5VTEw7IFwKKyAgICAgICAgcEhvbGUgPSBwSG9sZS0+bmV4dF9ob2xlKQorICAgICAgICB7CisgICAgICAgICAgICBwSG9sZS0+ZXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgIEN1cnJDaGFpblNlcSA9IGN2Q3JlYXRlU2VxKDAsc2l6ZW9mKEN2U2VxKSxzaXplb2YoQ3ZWb3Jvbm9pQ2hhaW5JbnQpLHBWb3Jvbm9pRGlhZ3JhbS0+Q2hhaW5TZXEtPnN0b3JhZ2UpOworICAgICAgICAgICAgX2N2Q29uc3RydWN0SW50Q2hhaW5zKHBWb3Jvbm9pRGlhZ3JhbSxDdXJyQ2hhaW5TZXEscEhvbGUtPlNpdGVTZXEscEhvbGUtPnNpdGVfdG9wKTsKKyAgICAgICAgICAgIHBIb2xlLT5DaGFpblNlcSA9IEN1cnJDaGFpblNlcTsKKyAgICAgICAgfQorICAgIHJldHVybiAxOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdENoYWlucworCitzdGF0aWMgaW50IF9jdkNvbnN0cnVjdFNrZWxldG9uKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBpZighX2N2Q29uc3RydWN0RXh0VkQocFZvcm9ub2lEaWFncmFtKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgX2N2Q29uc3RydWN0SW50VkQocFZvcm9ub2lEaWFncmFtKTsKKyAgICBfY3ZGaW5kTmVhcmVzdFNpdGUocFZvcm9ub2lEaWFncmFtKTsKKyAgICAKKyAgICBmbG9hdCBkeCxkeTsKKyAgICBpbnQgcmVzdWx0OworICAgIGZvcihwQ3ZWb3Jvbm9pSG9sZSBwSG9sZSA9IHBWb3Jvbm9pRGlhZ3JhbS0+dG9wX2hvbGU7XAorICAgICAgICBwSG9sZSAhPSBOVUxMOyBwSG9sZSA9IHBIb2xlLT5uZXh0X2hvbGUpCisgICAgeworICAgICAgICBpZihwSG9sZS0+ZXJyb3IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZHggPSBwSG9sZS0+bm9kZS0+bm9kZS54IC0gcEhvbGUtPnNpdGVfdG9wLT5ub2RlMS0+bm9kZS54OworICAgICAgICBkeSA9IHBIb2xlLT5ub2RlLT5ub2RlLnkgLSBwSG9sZS0+c2l0ZV90b3AtPm5vZGUxLT5ub2RlLnk7CisgICAgICAgIAorICAgICAgICBpZihmYWJzKGR5KSA8IDAuMDEgJiYgZHggPCAwKQorICAgICAgICAgICAgcEhvbGUtPnNpdGVfb3Bwb3NpdGUgPSBwSG9sZS0+c2l0ZV9uZWFyZXN0OworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGR5ID4gMCkKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBfY3ZGaW5kT3Bwb3NpdFNpdGVDQ1cocEhvbGUscFZvcm9ub2lEaWFncmFtKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBfY3ZGaW5kT3Bwb3NpdFNpdGVDVyhwSG9sZSxwVm9yb25vaURpYWdyYW0pOworCisgICAgICAgICAgICBpZighcmVzdWx0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBIb2xlLT5lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYoIV9jdk1lcmdlVkQocEhvbGUscFZvcm9ub2lEaWFncmFtKSkKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gMTsKK30vL2VuZCBvZiBfY3ZDb25zdHJ1Y3RTa2VsZXRvbgorCitzdGF0aWMgdm9pZCBfY3ZDb25zdHJ1Y3RTaXRlVHJlZShDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgQ3ZTZXEqIEN1clNlcSA9IHBWb3Jvbm9pRGlhZ3JhbS0+U2l0ZVNlcTsKKyAgICBmb3IocEN2Vm9yb25vaUhvbGUgcEhvbGUgPSBwVm9yb25vaURpYWdyYW0tPnRvcF9ob2xlO1wKKyAgICAgICAgcEhvbGUgIT0gTlVMTDsgcEhvbGUgPSBwSG9sZS0+bmV4dF9ob2xlKQorICAgIHsKKyAgICAgICAgaWYocEhvbGUtPmVycm9yKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmKEN1clNlcSA9PSBwVm9yb25vaURpYWdyYW0tPlNpdGVTZXEpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1clNlcS0+dl9uZXh0ID0gcEhvbGUtPlNpdGVTZXE7CisgICAgICAgICAgICBwSG9sZS0+U2l0ZVNlcS0+dl9wcmV2ID0gQ3VyU2VxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VyU2VxLT5oX25leHQgPSBwSG9sZS0+U2l0ZVNlcTsKKyAgICAgICAgICAgIHBIb2xlLT5TaXRlU2VxLT5oX3ByZXYgPSBDdXJTZXE7CisgICAgICAgICAgICBwSG9sZS0+U2l0ZVNlcS0+dl9wcmV2ID0gcFZvcm9ub2lEaWFncmFtLT5TaXRlU2VxOworICAgICAgICB9CisgICAgICAgIEN1clNlcSA9IHBIb2xlLT5TaXRlU2VxOyAKKyAgICB9CisgICAgQ3VyU2VxLT5oX25leHQgPSBOVUxMOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdFNpdGVUcmVlCisKK3N0YXRpYyB2b2lkIF9jdlJhbmRvbU1vZGlmaWNhdGlvbihDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0sIGludCBiZWdpbiwgaW50IGVuZCwgZmxvYXQgc2hpZnQpCit7CisgICAgQ3ZTZXFSZWFkZXIgUmVhZGVyOworICAgIHBDdlZvcm9ub2lOb2RlIHBOb2RlOworICAgIGNvbnN0IGZsb2F0IHJuZF9jb25zdCA9IHNoaWZ0L1JBTkRfTUFYOworICAgIGludCBpOworCisgICAgY3ZTdGFydFJlYWRTZXEocFZvcm9ub2lEaWFncmFtLT5Ob2RlU2VxLCAmUmVhZGVyLDApOworICAgIGZvciggaSA9IGJlZ2luOyBpIDwgZW5kOyBpKyspCisgICAgeworICAgICAgICBwTm9kZSA9IChwQ3ZWb3Jvbm9pTm9kZSlSZWFkZXIucHRyOworICAgICAgICBwTm9kZS0+bm9kZS54ID0gKGZsb2F0KWN2Rmxvb3IocE5vZGUtPm5vZGUueCkgKyByYW5kKCkqcm5kX2NvbnN0OworICAgICAgICBwTm9kZS0+bm9kZS55ID0gKGZsb2F0KWN2Rmxvb3IocE5vZGUtPm5vZGUueSkgKyByYW5kKCkqcm5kX2NvbnN0OworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoQ3ZWb3Jvbm9pTm9kZUludCksIFJlYWRlciApOyAKKyAgICB9CisKKyAgICBmb3IocEN2Vm9yb25vaUhvbGUgcEhvbGUgPSBwVm9yb25vaURpYWdyYW0tPnRvcF9ob2xlO1wKKyAgICAgICAgcEhvbGUgIT0gTlVMTDtcCisgICAgICAgIHBIb2xlID0gcEhvbGUtPm5leHRfaG9sZSkKKyAgICB7CisgICAgICAgIHBIb2xlLT5zaXRlX3RvcC0+bm9kZTEtPm5vZGUueCA9IChmbG9hdCljdkZsb29yKHBIb2xlLT5zaXRlX3RvcC0+bm9kZTEtPm5vZGUueCk7CisgICAgfQorICAgICAgICAKK30vL2VuZCBvZiBfY3ZSYW5kb21Nb2RpZmljYXRpb24KKworc3RhdGljIHZvaWQgX2N2UmVsZWFzZVZvcm9ub2lTdG9yYWdlKEN2Vm9yb25vaVN0b3JhZ2VJbnQqIHBWb3Jvbm9pU3RvcmFnZSwgaW50IGdyb3VwMSwgaW50IGdyb3VwMikKK3sKKyAgICAvL2lmIGdyb3VwMSA9IDEgdGhlbiBTaXRlU2VxLCBOb2RlU2VxLCBFZGdlU2VxIHJlbGVhc2VkCisgICAgLy9pZiBncm91cDIgPSAxIHRoZW4gRGlyZWN0aW9uU2VxLCBQYXJhYm9sYVNlcSwgQ2hhaW5TZXEsIEhvbGVTZXEgcmVsZWFzZWQKKyAgICBpZihncm91cDEgPT0gMSkKKyAgICB7CisgICAgICAgIGlmKHBWb3Jvbm9pU3RvcmFnZS0+U2l0ZVN0b3JhZ2UhPU5VTEwpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZwVm9yb25vaVN0b3JhZ2UtPlNpdGVTdG9yYWdlKTsKKyAgICAgICAgaWYocFZvcm9ub2lTdG9yYWdlLT5FZGdlU3RvcmFnZSE9TlVMTCkKKyAgICAgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJnBWb3Jvbm9pU3RvcmFnZS0+RWRnZVN0b3JhZ2UpOworICAgICAgICBpZihwVm9yb25vaVN0b3JhZ2UtPk5vZGVTdG9yYWdlIT1OVUxMKQorICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmcFZvcm9ub2lTdG9yYWdlLT5Ob2RlU3RvcmFnZSk7CisgICAgfQorICAgIGlmKGdyb3VwMiA9PSAxKQorICAgIHsKKyAgICAgICAgaWYocFZvcm9ub2lTdG9yYWdlLT5QYXJhYm9sYVN0b3JhZ2UhPU5VTEwpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZwVm9yb25vaVN0b3JhZ2UtPlBhcmFib2xhU3RvcmFnZSk7CisgICAgICAgIGlmKHBWb3Jvbm9pU3RvcmFnZS0+Q2hhaW5TdG9yYWdlIT1OVUxMKQorICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmcFZvcm9ub2lTdG9yYWdlLT5DaGFpblN0b3JhZ2UpOworICAgICAgICBpZihwVm9yb25vaVN0b3JhZ2UtPkRpcmVjdGlvblN0b3JhZ2UhPU5VTEwpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZwVm9yb25vaVN0b3JhZ2UtPkRpcmVjdGlvblN0b3JhZ2UpOworICAgICAgICBpZihwVm9yb25vaVN0b3JhZ2UtPkhvbGVTdG9yYWdlICE9IE5VTEwpCisgICAgICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCZwVm9yb25vaVN0b3JhZ2UtPkhvbGVTdG9yYWdlKTsKKyAgICB9Cit9Ly8gZW5kIG9mIF9jdlJlbGVhc2VWb3Jvbm9pU3RvcmFnZQorCitzdGF0aWMgaW50IF9jdkNvbnZlcnQoQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCBWb3Jvbm9pRGlhZ3JhbUludCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXQqICZTaXRlU2VxLAorICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciAmTm9kZVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXFXcml0ZXIgJkVkZ2VXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogVm9yb25vaVN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBjb250b3VyX29yaWVudGF0aW9uKQoreworICAgIGlmKGNvbnRvdXJfb3JpZW50YXRpb24gPT0gMSkKKyAgICAgICAgcmV0dXJuIF9jdkNvbnZlcnRTYW1lT3JpZW50YXRpb24oVm9yb25vaURpYWdyYW0sVm9yb25vaURpYWdyYW1JbnQsU2l0ZVNlcSxOb2RlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkZ2VXcml0ZXIsVm9yb25vaVN0b3JhZ2UpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIF9jdkNvbnZlcnRDaGFuZ2VPcmllbnRhdGlvbihWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pRGlhZ3JhbUludCxTaXRlU2VxLE5vZGVXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRnZVdyaXRlcixWb3Jvbm9pU3RvcmFnZSk7Cit9Ly8gZW5kIG9mIF9jdkNvbnZlcnQKKworc3RhdGljIGludCBfY3ZDb252ZXJ0U2FtZU9yaWVudGF0aW9uKEN2Vm9yb25vaURpYWdyYW0yRCogVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQgVm9yb25vaURpYWdyYW1JbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2V0KiAmTmV3U2l0ZVNlcVByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxV3JpdGVyICZOb2RlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciAmRWRnZVdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSkKK3sKKyAgICBDdlNlcSogU2l0ZVNlcSA9IFZvcm9ub2lEaWFncmFtSW50LlNpdGVTZXE7CisgICAgQ3ZTZXEqIEVkZ2VTZXEgPSBWb3Jvbm9pRGlhZ3JhbUludC5FZGdlU2VxOworICAgIEN2U2VxKiBOb2RlU2VxID0gVm9yb25vaURpYWdyYW1JbnQuTm9kZVNlcTsKKworCisgICAgQ3ZNZW1TdG9yYWdlICpOZXdTaXRlU3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKFZvcm9ub2lTdG9yYWdlKTsKKyAgICBDdlNldCAqTmV3U2l0ZVNlcSA9IE5VTEwsKkN1cnJOZXdTaXRlU2VxID0gTlVMTCwgKlByZXZOZXdTaXRlU2VxID0gTlVMTDs7CisgICAgQ3ZTZXFXcml0ZXIgU2l0ZVdyaXRlcjsgCisKKyAgICBDdlZvcm9ub2lTaXRlMkQgTmV3U2l0ZSA9IHt7MCwwfSx7MCwwfSx7MCwwfX0sTmV3U2l0ZV9wcmV2OworICAgIEN2Vm9yb25vaVNpdGUyRCAqcE5ld1NpdGUsICpwTmV3U2l0ZV9wcmV2ID0gJk5ld1NpdGVfcHJldjsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSxwRmlyc3RTaXRlOworCisgICAgQ3ZWb3Jvbm9pRWRnZTJEIE5ld0VkZ2UgPSB7ezAsMH0sezAsMH0sezAsMCwwLDB9fTsKKyAgICBDdlZvcm9ub2lFZGdlMkQgKnBOZXdFZGdlMSwgKnBOZXdFZGdlMjsKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTsKKworICAgIEN2Vm9yb25vaU5vZGUyRCogcE5vZGUxLCAqcE5vZGUyOworICAgIEN2Vm9yb25vaU5vZGUyRCBOb2RlOworICAgIE5vZGUubmV4dF9mcmVlID0gTlVMTDsKKworICAgIGZvcihDdlNlcSogQ3VyclNpdGVTZXEgPSBTaXRlU2VxO1wKKyAgICAgICAgQ3VyclNpdGVTZXEgIT0gTlVMTDtcCisgICAgICAgIEN1cnJTaXRlU2VxID0gTkVYVF9TRVEoQ3VyclNpdGVTZXEsU2l0ZVNlcSkpCisgICAgeworICAgICAgICBDdXJyTmV3U2l0ZVNlcSA9IGN2Q3JlYXRlU2V0KDAsc2l6ZW9mKEN2U2V0KSxzaXplb2YoQ3ZWb3Jvbm9pU2l0ZTJEKSwgTmV3U2l0ZVN0b3JhZ2UpOworICAgICAgICBpZighTmV3U2l0ZVNlcSkKKyAgICAgICAgICAgIE5ld1NpdGVTZXEgPSBQcmV2TmV3U2l0ZVNlcSA9IEN1cnJOZXdTaXRlU2VxOworICAgICAgICBlbHNlIGlmKFByZXZOZXdTaXRlU2VxLT52X3ByZXYgPT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgUHJldk5ld1NpdGVTZXEtPnZfbmV4dCA9IChDdlNlcSopQ3Vyck5ld1NpdGVTZXE7CisgICAgICAgICAgICBDdXJyTmV3U2l0ZVNlcS0+dl9wcmV2ID0gKEN2U2VxKilQcmV2TmV3U2l0ZVNlcTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZXZOZXdTaXRlU2VxLT5oX25leHQgPSAoQ3ZTZXEqKUN1cnJOZXdTaXRlU2VxOworICAgICAgICAgICAgQ3Vyck5ld1NpdGVTZXEtPmhfcHJldiA9IChDdlNlcSopUHJldk5ld1NpdGVTZXE7CisgICAgICAgICAgICBDdXJyTmV3U2l0ZVNlcS0+dl9wcmV2ID0gKEN2U2VxKilQcmV2TmV3U2l0ZVNlcS0+dl9wcmV2OworICAgICAgICB9CisgICAgICAgIFByZXZOZXdTaXRlU2VxID0gQ3Vyck5ld1NpdGVTZXE7CisgICAgICAgIAorICAgICAgICBwU2l0ZSA9IHBGaXJzdFNpdGUgPSAocEN2Vm9yb25vaVNpdGUpY3ZHZXRTZXFFbGVtKEN1cnJTaXRlU2VxLCAwKTsKKyAgICAgICAgd2hpbGUocFNpdGUtPnByZXZfc2l0ZS0+bm9kZTEgPT0gcFNpdGUtPnByZXZfc2l0ZS0+bm9kZTIpXAorICAgICAgICAgICAgcFNpdGUgPSBwU2l0ZS0+bmV4dF9zaXRlOworICAgICAgICBwRmlyc3RTaXRlID0gcFNpdGU7CisgICAgICAgIAorICAgICAgICBwTmV3U2l0ZV9wcmV2ID0gJk5ld1NpdGVfcHJldjsKKyAgICAgICAgY3ZTdGFydEFwcGVuZFRvU2VxKChDdlNlcSopQ3Vyck5ld1NpdGVTZXEsICZTaXRlV3JpdGVyKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcE5ld1NpdGUgPSBfY3ZXcml0ZVNlcUVsZW0oJk5ld1NpdGUsU2l0ZVdyaXRlcik7IAorICAgICAgICAgICAgcE5ld1NpdGUtPm5leHRbMF0gPSBwTmV3U2l0ZV9wcmV2OworICAgICAgICAgICAgcE5ld1NpdGVfcHJldi0+bmV4dFsxXSA9IHBOZXdTaXRlOworICAgICAgICAgICAgcEVkZ2UgPSBwU2l0ZS0+ZWRnZTE7CisgICAgICAgICAgICBpZighcEVkZ2UgfHwgIXBFZGdlLT5ub2RlMSB8fCAhcEVkZ2UtPm5vZGUyKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZihwRWRnZS0+c2l0ZSA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBOZXdFZGdlMSA9IChDdlZvcm9ub2lFZGdlMkQqKXBFZGdlLT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5zaXRlWzFdID0gcE5ld1NpdGU7CisgICAgICAgICAgICAgICAgcE5ld1NpdGUtPm5vZGVbMF0gPSBwTmV3RWRnZTEtPm5vZGVbMF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgcE5ld0VkZ2UxID0gX2N2V3JpdGVTZXFFbGVtKCZOZXdFZGdlLEVkZ2VXcml0ZXIpOyAKKyAgICAgICAgICAgICAgICBwTmV3RWRnZTEtPnNpdGVbMF0gPSBwTmV3U2l0ZTsKKworICAgICAgICAgICAgICAgIHBOb2RlMSA9IF9jdldyaXRlU2VxRWxlbSgmTm9kZSxOb2RlV3JpdGVyKTsKKyAgICAgICAgICAgICAgICBwTm9kZTIgPSBfY3ZXcml0ZVNlcUVsZW0oJk5vZGUsTm9kZVdyaXRlcik7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5wdC54ID0gcEVkZ2UtPm5vZGUxLT5ub2RlLng7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5wdC55ID0gcEVkZ2UtPm5vZGUxLT5ub2RlLnk7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5yYWRpdXMgPSBwRWRnZS0+bm9kZTEtPnJhZGl1czsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnB0LnggPSBwRWRnZS0+bm9kZTItPm5vZGUueDsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnB0LnkgPSBwRWRnZS0+bm9kZTItPm5vZGUueTsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnJhZGl1cyA9IHBFZGdlLT5ub2RlMi0+cmFkaXVzOworICAgICAgICAgICAgICAgIHBOZXdFZGdlMS0+bm9kZVswXSA9IHBOb2RlMTsKKyAgICAgICAgICAgICAgICBwTmV3RWRnZTEtPm5vZGVbMV0gPSBwTm9kZTI7CisKKyAgICAgICAgICAgICAgICBwTmV3U2l0ZS0+bm9kZVswXSA9IHBOZXdFZGdlMS0+bm9kZVsxXTsKKworICAgICAgICAgICAgICAgIGlmKCFwTmV3RWRnZTEtPm5vZGVbMF0gfHwgIXBOZXdFZGdlMS0+bm9kZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+c2l0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+dHdpbl9lZGdlID0gKHBDdlZvcm9ub2lFZGdlKXBOZXdFZGdlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBOZXdTaXRlLT5lZGdlWzFdID0gcE5ld0VkZ2UxOworICAgICAgICAgICAgcEVkZ2UgPSBwRWRnZS0+cHJldl9lZGdlOworICAgICAgICAgICAgd2hpbGUoKHBFZGdlICE9IE5VTEwgJiYgQ3VyclNpdGVTZXEtPnRvdGFsPjEpIHx8CisgICAgICAgICAgICAgICAgICAocEVkZ2UgIT0gcFNpdGUtPmVkZ2UyICYmIEN1cnJTaXRlU2VxLT50b3RhbCA9PSAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwRWRnZS0+c2l0ZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UyID0gKEN2Vm9yb25vaUVkZ2UyRCopcEVkZ2UtPnR3aW5fZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UyLT5zaXRlWzFdID0gcE5ld1NpdGU7CisgICAgICAgICAgICAgICAgICAgIGlmKENWX1ZPUk9OT0lFREdFMkRfQkVHSU5OT0RFKHBOZXdFZGdlMSxwTmV3U2l0ZSkgIT0gcE5ld0VkZ2UyLT5ub2RlWzBdKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdkZsdXNoU2VxV3JpdGVyKCZOb2RlV3JpdGVyKTsKKy8vICAgICAgICAgICAgICAgICAgICAgIGN2U2V0UmVtb3ZlKChDdlNldCopVm9yb25vaURpYWdyYW0sVm9yb25vaURpYWdyYW0tPnRvdGFsLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5ub2RlWzBdID0gcE5ld0VkZ2UyLT5ub2RlWzBdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7ICAgCisgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMiA9IF9jdldyaXRlU2VxRWxlbSgmTmV3RWRnZSxFZGdlV3JpdGVyKTsgCisgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMi0+c2l0ZVswXSA9IHBOZXdTaXRlOworCisgICAgICAgICAgICAgICAgICAgIHBOb2RlMSA9IF9jdldyaXRlU2VxRWxlbSgmTm9kZSxOb2RlV3JpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcE5vZGUxLT5wdC54ID0gcEVkZ2UtPm5vZGUxLT5ub2RlLng7CisgICAgICAgICAgICAgICAgICAgIHBOb2RlMS0+cHQueSA9IHBFZGdlLT5ub2RlMS0+bm9kZS55OworICAgICAgICAgICAgICAgICAgICBwTm9kZTEtPnJhZGl1cyA9IHBFZGdlLT5ub2RlMS0+cmFkaXVzOworICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPm5vZGVbMF0gPSBwTm9kZTE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKHBOZXdFZGdlMS0+c2l0ZVswXSA9PSBwTmV3U2l0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMi0+bm9kZVsxXSA9IHBOZXdFZGdlMS0+bm9kZVswXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UyLT5ub2RlWzFdID0gcE5ld0VkZ2UxLT5ub2RlWzFdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZighcE5ld0VkZ2UxLT5ub2RlWzBdIHx8ICFwTmV3RWRnZTEtPm5vZGVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+c2l0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBFZGdlLT50d2luX2VkZ2UtPnR3aW5fZWRnZSA9IChwQ3ZWb3Jvbm9pRWRnZSlwTmV3RWRnZTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHBOZXdFZGdlMS0+c2l0ZVswXSA9PSBwTmV3U2l0ZSkKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5uZXh0WzJdID0gcE5ld0VkZ2UyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5uZXh0WzNdID0gcE5ld0VkZ2UyOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYocE5ld0VkZ2UyLT5zaXRlWzBdID09IHBOZXdTaXRlKQorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPm5leHRbMF0gPSBwTmV3RWRnZTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPm5leHRbMV0gPSBwTmV3RWRnZTE7CisKKyAgICAgICAgICAgICAgICBwRWRnZSA9IHBFZGdlLT5wcmV2X2VkZ2U7CisgICAgICAgICAgICAgICAgcE5ld0VkZ2UxID0gcE5ld0VkZ2UyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE5ld1NpdGUtPmVkZ2VbMF0gPSBwTmV3RWRnZTE7CisgICAgICAgICAgICBwTmV3U2l0ZS0+bm9kZVsxXSA9IHBOZXdFZGdlMS0+bm9kZVswXTsKKworICAgICAgICAgICAgaWYocFNpdGUtPm5vZGUxID09IHBTaXRlLT5ub2RlMiAmJiBwU2l0ZSAhPSBwU2l0ZS0+bmV4dF9zaXRlICYmIHBOZXdFZGdlMS0+bm9kZVswXSAhPSBwTmV3RWRnZTEtPm5vZGVbMV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZGbHVzaFNlcVdyaXRlcigmTm9kZVdyaXRlcik7CisvLyAgICAgICAgICAgICAgY3ZTZXRSZW1vdmUoKEN2U2V0KilWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pRGlhZ3JhbS0+dG90YWwtMSk7CisgICAgICAgICAgICAgICAgcE5ld1NpdGUtPm5vZGVbMV0gPSBwTmV3RWRnZTEtPm5vZGVbMF0gPSBwTmV3U2l0ZS0+bm9kZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgcE5ld1NpdGVfcHJldiA9IHBOZXdTaXRlOworICAgICAgICAgICAgcFNpdGUgPSBwU2l0ZS0+bmV4dF9zaXRlOworICAgICAgICB9d2hpbGUocFNpdGUgIT0gcEZpcnN0U2l0ZSk7CisgICAgICAgIHBOZXdTaXRlLT5ub2RlWzFdID0gcE5ld0VkZ2UxLT5ub2RlWzFdOworICAgICAgICBpZihwU2l0ZSA9PSBwU2l0ZS0+bmV4dF9zaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBOb2RlLnB0LnggPSBwU2l0ZS0+bm9kZTEtPm5vZGUueDsKKyAgICAgICAgICAgIE5vZGUucHQueSA9IHBTaXRlLT5ub2RlMS0+bm9kZS55OworICAgICAgICAgICAgTm9kZS5yYWRpdXMgPSAwOworICAgICAgICAgICAgcE5ld1NpdGUtPm5vZGVbMF0gPSBwTmV3U2l0ZS0+bm9kZVsxXSA9IF9jdldyaXRlU2VxRWxlbSgmTm9kZSxOb2RlV3JpdGVyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3ZFbmRXcml0ZVNlcSgmU2l0ZVdyaXRlcik7CisgICAgICAgIHBOZXdTaXRlID0gKEN2Vm9yb25vaVNpdGUyRCopY3ZHZXRTZXRFbGVtKEN1cnJOZXdTaXRlU2VxLCAwKTsKKyAgICAgICAgcE5ld1NpdGUtPm5leHRbMF0gPSBwTmV3U2l0ZV9wcmV2OworICAgICAgICBwTmV3U2l0ZV9wcmV2LT5uZXh0WzFdID0gcE5ld1NpdGU7CisgICAgfQorCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmKFNpdGVTZXEtPnN0b3JhZ2UpKTsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCYoRWRnZVNlcS0+c3RvcmFnZSkpOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJihOb2RlU2VxLT5zdG9yYWdlKSk7CisKKyAgICBpZihOZXdTaXRlU2VxUHJldiA9PSBOVUxMKQorICAgICAgICBWb3Jvbm9pRGlhZ3JhbS0+c2l0ZXMgPSBOZXdTaXRlU2VxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5ld1NpdGVTZXFQcmV2LT5oX25leHQgPSAoQ3ZTZXEqKU5ld1NpdGVTZXE7CisgICAgICAgIE5ld1NpdGVTZXEtPmhfcHJldiA9IChDdlNlcSopTmV3U2l0ZVNlcVByZXY7CisgICAgfQorCisgICAgTmV3U2l0ZVNlcVByZXYgPSBOZXdTaXRlU2VxOworICAgIHJldHVybiAxOworfS8vZW5kIG9mIF9jdkNvbnZlcnRTYW1lT3JpZW50YXRpb24KKworc3RhdGljIGludCBfY3ZDb252ZXJ0Q2hhbmdlT3JpZW50YXRpb24oQ3ZWb3Jvbm9pRGlhZ3JhbTJEKiBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50IFZvcm9ub2lEaWFncmFtSW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2V0KiAmTmV3U2l0ZVNlcVByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXFXcml0ZXIgJk5vZGVXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXFXcml0ZXIgJkVkZ2VXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBWb3Jvbm9pU3RvcmFnZSkKK3sKKyAgICAvLyBwTmV3U2l0ZS0+ZWRnZVsxXSA9IHBTaXRlLT5lZGdlMgorICAgIC8vIHBOZXdTaXRlLT5lZGdlWzBdID0gcFNpdGUtPmVkZ2UxCisgICAgCisgICAgQ3ZTZXEqIFNpdGVTZXEgPSBWb3Jvbm9pRGlhZ3JhbUludC5TaXRlU2VxOworICAgIEN2U2VxKiBFZGdlU2VxID0gVm9yb25vaURpYWdyYW1JbnQuRWRnZVNlcTsKKyAgICBDdlNlcSogTm9kZVNlcSA9IFZvcm9ub2lEaWFncmFtSW50Lk5vZGVTZXE7CisKKworICAgIEN2TWVtU3RvcmFnZSAqTmV3U2l0ZVN0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZShWb3Jvbm9pU3RvcmFnZSk7CisgICAgQ3ZTZXQgKk5ld1NpdGVTZXEgPSBOVUxMLCpDdXJyTmV3U2l0ZVNlcSA9IE5VTEwsICpQcmV2TmV3U2l0ZVNlcSA9IE5VTEw7OworICAgIEN2U2VxV3JpdGVyIFNpdGVXcml0ZXI7IAorCisgICAgQ3ZWb3Jvbm9pU2l0ZTJEIE5ld1NpdGUgPSB7ezAsMH0sezAsMH0sezAsMH19LE5ld1NpdGVfcHJldjsKKyAgICBDdlZvcm9ub2lTaXRlMkQgKnBOZXdTaXRlLCAqcE5ld1NpdGVfcHJldiA9ICZOZXdTaXRlX3ByZXY7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGUscEZpcnN0U2l0ZTsKKworICAgIEN2Vm9yb25vaUVkZ2UyRCBOZXdFZGdlID0ge3swLDB9LHswLDB9LHswLDAsMCwwfX07CisgICAgQ3ZWb3Jvbm9pRWRnZTJEICpwTmV3RWRnZTEsICpwTmV3RWRnZTI7CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2U7CisKKyAgICBDdlZvcm9ub2lOb2RlMkQqIHBOb2RlMSwgKnBOb2RlMjsKKyAgICBDdlZvcm9ub2lOb2RlMkQgTm9kZTsKKyAgICBOb2RlLm5leHRfZnJlZSA9IE5VTEw7CisKKyAgICBmb3IoQ3ZTZXEqIEN1cnJTaXRlU2VxID0gU2l0ZVNlcTtcCisgICAgICAgIEN1cnJTaXRlU2VxICE9IE5VTEw7XAorICAgICAgICBDdXJyU2l0ZVNlcSA9IE5FWFRfU0VRKEN1cnJTaXRlU2VxLFNpdGVTZXEpKQorICAgIHsKKyAgICAgICAgQ3Vyck5ld1NpdGVTZXEgPSBjdkNyZWF0ZVNldCgwLHNpemVvZihDdlNldCksc2l6ZW9mKEN2Vm9yb25vaVNpdGUyRCksIE5ld1NpdGVTdG9yYWdlKTsKKyAgICAgICAgaWYoIU5ld1NpdGVTZXEpCisgICAgICAgICAgICBOZXdTaXRlU2VxID0gUHJldk5ld1NpdGVTZXEgPSBDdXJyTmV3U2l0ZVNlcTsKKyAgICAgICAgZWxzZSBpZihQcmV2TmV3U2l0ZVNlcS0+dl9wcmV2ID09IE5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIFByZXZOZXdTaXRlU2VxLT52X25leHQgPSAoQ3ZTZXEqKUN1cnJOZXdTaXRlU2VxOworICAgICAgICAgICAgQ3Vyck5ld1NpdGVTZXEtPnZfcHJldiA9IChDdlNlcSopUHJldk5ld1NpdGVTZXE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQcmV2TmV3U2l0ZVNlcS0+aF9uZXh0ID0gKEN2U2VxKilDdXJyTmV3U2l0ZVNlcTsKKyAgICAgICAgICAgIEN1cnJOZXdTaXRlU2VxLT5oX3ByZXYgPSAoQ3ZTZXEqKVByZXZOZXdTaXRlU2VxOworICAgICAgICAgICAgQ3Vyck5ld1NpdGVTZXEtPnZfcHJldiA9IChDdlNlcSopUHJldk5ld1NpdGVTZXEtPnZfcHJldjsKKyAgICAgICAgfQorICAgICAgICBQcmV2TmV3U2l0ZVNlcSA9IEN1cnJOZXdTaXRlU2VxOworICAgICAgICAKKyAgICAgICAgcFNpdGUgPSAocEN2Vm9yb25vaVNpdGUpY3ZHZXRTZXFFbGVtKEN1cnJTaXRlU2VxLCAwKTsKKyAgICAgICAgd2hpbGUocFNpdGUtPm5leHRfc2l0ZS0+bm9kZTEgPT0gcFNpdGUtPm5leHRfc2l0ZS0+bm9kZTIpXAorICAgICAgICAgICAgcFNpdGUgPSBwU2l0ZS0+bmV4dF9zaXRlOworICAgICAgICBwRmlyc3RTaXRlID0gcFNpdGU7CisgICAgICAgIAorICAgICAgICBwTmV3U2l0ZV9wcmV2ID0gJk5ld1NpdGVfcHJldjsKKyAgICAgICAgY3ZTdGFydEFwcGVuZFRvU2VxKChDdlNlcSopQ3Vyck5ld1NpdGVTZXEsICZTaXRlV3JpdGVyKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcE5ld1NpdGUgPSBfY3ZXcml0ZVNlcUVsZW0oJk5ld1NpdGUsU2l0ZVdyaXRlcik7IAorICAgICAgICAgICAgcE5ld1NpdGUtPm5leHRbMF0gPSBwTmV3U2l0ZV9wcmV2OworICAgICAgICAgICAgcE5ld1NpdGVfcHJldi0+bmV4dFsxXSA9IHBOZXdTaXRlOworCisgICAgICAgICAgICBwRWRnZSA9IHBTaXRlLT5lZGdlMjsKKyAgICAgICAgICAgIGlmKCFwRWRnZSB8fCAhcEVkZ2UtPm5vZGUxIHx8ICFwRWRnZS0+bm9kZTIpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgICAgIGlmKHBFZGdlLT5zaXRlID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcE5ld0VkZ2UxID0gKEN2Vm9yb25vaUVkZ2UyRCopcEVkZ2UtPnR3aW5fZWRnZTsKKyAgICAgICAgICAgICAgICBwTmV3RWRnZTEtPnNpdGVbMV0gPSBwTmV3U2l0ZTsKKyAgICAgICAgICAgICAgICBwTmV3U2l0ZS0+bm9kZVswXSA9IHBOZXdFZGdlMS0+bm9kZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsgICAKKyAgICAgICAgICAgICAgICBwTmV3RWRnZTEgPSBfY3ZXcml0ZVNlcUVsZW0oJk5ld0VkZ2UsRWRnZVdyaXRlcik7IAorICAgICAgICAgICAgICAgIHBOZXdFZGdlMS0+c2l0ZVswXSA9IHBOZXdTaXRlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBOb2RlMSA9IF9jdldyaXRlU2VxRWxlbSgmTm9kZSxOb2RlV3JpdGVyKTsKKyAgICAgICAgICAgICAgICBwTm9kZTIgPSBfY3ZXcml0ZVNlcUVsZW0oJk5vZGUsTm9kZVdyaXRlcik7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5wdC54ID0gcEVkZ2UtPm5vZGUxLT5ub2RlLng7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5wdC55ID0gcEVkZ2UtPm5vZGUxLT5ub2RlLnk7CisgICAgICAgICAgICAgICAgcE5vZGUxLT5yYWRpdXMgPSBwRWRnZS0+bm9kZTEtPnJhZGl1czsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnB0LnggPSBwRWRnZS0+bm9kZTItPm5vZGUueDsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnB0LnkgPSBwRWRnZS0+bm9kZTItPm5vZGUueTsKKyAgICAgICAgICAgICAgICBwTm9kZTItPnJhZGl1cyA9IHBFZGdlLT5ub2RlMi0+cmFkaXVzOworICAgICAgICAgICAgICAgIHBOZXdFZGdlMS0+bm9kZVswXSA9IHBOb2RlMjsKKyAgICAgICAgICAgICAgICBwTmV3RWRnZTEtPm5vZGVbMV0gPSBwTm9kZTE7CisKKyAgICAgICAgICAgICAgICBwTmV3U2l0ZS0+bm9kZVswXSA9IHBOZXdFZGdlMS0+bm9kZVsxXTsKKworICAgICAgICAgICAgICAgIGlmKCFwTmV3RWRnZTEtPm5vZGVbMF0gfHwgIXBOZXdFZGdlMS0+bm9kZVsxXSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+c2l0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+dHdpbl9lZGdlID0gKHBDdlZvcm9ub2lFZGdlKXBOZXdFZGdlMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBOZXdTaXRlLT5lZGdlWzFdID0gcE5ld0VkZ2UxOworICAgICAgICAgICAgCisKKyAgICAgICAgICAgIHBFZGdlID0gcEVkZ2UtPm5leHRfZWRnZTsKKyAgICAgICAgICAgIHdoaWxlKChwRWRnZSAhPSBOVUxMICYmIEN1cnJTaXRlU2VxLT50b3RhbD4xKSB8fAorICAgICAgICAgICAgICAgICAgKHBFZGdlICE9IHBTaXRlLT5lZGdlMSAmJiBDdXJyU2l0ZVNlcS0+dG90YWwgPT0gMSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocEVkZ2UtPnNpdGUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMiA9IChDdlZvcm9ub2lFZGdlMkQqKXBFZGdlLT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMi0+c2l0ZVsxXSA9IHBOZXdTaXRlOworICAgICAgICAgICAgICAgICAgICBpZihDVl9WT1JPTk9JRURHRTJEX0JFR0lOTk9ERShwTmV3RWRnZTEscE5ld1NpdGUpICE9IHBOZXdFZGdlMi0+bm9kZVswXSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZGbHVzaFNlcVdyaXRlcigmTm9kZVdyaXRlcik7CisvLyAgICAgICAgICAgICAgICAgICAgICBjdlNldFJlbW92ZSgoQ3ZTZXQqKVZvcm9ub2lEaWFncmFtLFZvcm9ub2lEaWFncmFtLT50b3RhbC0xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMS0+bm9kZVswXSA9IHBOZXdFZGdlMi0+bm9kZVswXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeyAgIAorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTIgPSBfY3ZXcml0ZVNlcUVsZW0oJk5ld0VkZ2UsRWRnZVdyaXRlcik7IAorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPnNpdGVbMF0gPSBwTmV3U2l0ZTsKKworICAgICAgICAgICAgICAgICAgICBwTm9kZTIgPSBfY3ZXcml0ZVNlcUVsZW0oJk5vZGUsTm9kZVdyaXRlcik7CisgICAgICAgICAgICAgICAgICAgIHBOb2RlMi0+cHQueCA9IHBFZGdlLT5ub2RlMi0+bm9kZS54OworICAgICAgICAgICAgICAgICAgICBwTm9kZTItPnB0LnkgPSBwRWRnZS0+bm9kZTItPm5vZGUueTsKKyAgICAgICAgICAgICAgICAgICAgcE5vZGUyLT5yYWRpdXMgPSBwRWRnZS0+bm9kZTItPnJhZGl1czsKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UyLT5ub2RlWzBdID0gcE5vZGUyOworCisgICAgICAgICAgICAgICAgICAgIGlmKHBOZXdFZGdlMS0+c2l0ZVswXSA9PSBwTmV3U2l0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBOZXdFZGdlMi0+bm9kZVsxXSA9IHBOZXdFZGdlMS0+bm9kZVswXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UyLT5ub2RlWzFdID0gcE5ld0VkZ2UxLT5ub2RlWzFdOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZighcE5ld0VkZ2UxLT5ub2RlWzBdIHx8ICFwTmV3RWRnZTEtPm5vZGVbMV0pCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2UtPnR3aW5fZWRnZS0+c2l0ZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBFZGdlLT50d2luX2VkZ2UtPnR3aW5fZWRnZSA9IChwQ3ZWb3Jvbm9pRWRnZSlwTmV3RWRnZTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKHBOZXdFZGdlMS0+c2l0ZVswXSA9PSBwTmV3U2l0ZSkKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5uZXh0WzJdID0gcE5ld0VkZ2UyOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcE5ld0VkZ2UxLT5uZXh0WzNdID0gcE5ld0VkZ2UyOworCisgICAgICAgICAgICAgICAgaWYocE5ld0VkZ2UyLT5zaXRlWzBdID09IHBOZXdTaXRlKQorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPm5leHRbMF0gPSBwTmV3RWRnZTE7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBwTmV3RWRnZTItPm5leHRbMV0gPSBwTmV3RWRnZTE7CisKKyAgICAgICAgICAgICAgICBwRWRnZSA9IHBFZGdlLT5uZXh0X2VkZ2U7CisgICAgICAgICAgICAgICAgcE5ld0VkZ2UxID0gcE5ld0VkZ2UyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE5ld1NpdGUtPmVkZ2VbMF0gPSBwTmV3RWRnZTE7CisgICAgICAgICAgICBwTmV3U2l0ZS0+bm9kZVsxXSA9IHBOZXdFZGdlMS0+bm9kZVswXTsKKworICAgICAgICAgICAgaWYocFNpdGUtPm5vZGUxID09IHBTaXRlLT5ub2RlMiAmJiBwU2l0ZSAhPSBwU2l0ZS0+bmV4dF9zaXRlICYmIHBOZXdFZGdlMS0+bm9kZVswXSAhPSBwTmV3RWRnZTEtPm5vZGVbMV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZGbHVzaFNlcVdyaXRlcigmTm9kZVdyaXRlcik7CisvLyAgICAgICAgICAgICAgY3ZTZXRSZW1vdmUoKEN2U2V0KilWb3Jvbm9pRGlhZ3JhbSxWb3Jvbm9pRGlhZ3JhbS0+dG90YWwtMSk7CisgICAgICAgICAgICAgICAgcE5ld1NpdGUtPm5vZGVbMV0gPSBwTmV3RWRnZTEtPm5vZGVbMF0gPSBwTmV3U2l0ZS0+bm9kZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcE5ld1NpdGVfcHJldiA9IHBOZXdTaXRlOworICAgICAgICAgICAgcFNpdGUgPSBwU2l0ZS0+cHJldl9zaXRlOworICAgICAgICB9d2hpbGUocFNpdGUgIT0gcEZpcnN0U2l0ZSk7CisgICAgICAgIHBOZXdTaXRlLT5ub2RlWzFdID0gcE5ld0VkZ2UxLT5ub2RlWzFdOworICAgICAgICBpZihwU2l0ZSA9PSBwU2l0ZS0+bmV4dF9zaXRlKQorICAgICAgICB7CisgICAgICAgICAgICBOb2RlLnB0LnggPSBwU2l0ZS0+bm9kZTEtPm5vZGUueDsKKyAgICAgICAgICAgIE5vZGUucHQueSA9IHBTaXRlLT5ub2RlMS0+bm9kZS55OworICAgICAgICAgICAgTm9kZS5yYWRpdXMgPSAwOworICAgICAgICAgICAgcE5ld1NpdGUtPm5vZGVbMF0gPSBwTmV3U2l0ZS0+bm9kZVsxXSA9IF9jdldyaXRlU2VxRWxlbSgmTm9kZSxOb2RlV3JpdGVyKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgY3ZFbmRXcml0ZVNlcSgmU2l0ZVdyaXRlcik7CisgICAgICAgIHBOZXdTaXRlID0gKEN2Vm9yb25vaVNpdGUyRCopY3ZHZXRTZXRFbGVtKEN1cnJOZXdTaXRlU2VxLCAwKTsKKyAgICAgICAgcE5ld1NpdGUtPm5leHRbMF0gPSBwTmV3U2l0ZV9wcmV2OworICAgICAgICBwTmV3U2l0ZV9wcmV2LT5uZXh0WzFdID0gcE5ld1NpdGU7CisgICAgfQorCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSgmKFNpdGVTZXEtPnN0b3JhZ2UpKTsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCYoRWRnZVNlcS0+c3RvcmFnZSkpOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJihOb2RlU2VxLT5zdG9yYWdlKSk7CisKKyAgICBpZihOZXdTaXRlU2VxUHJldiA9PSBOVUxMKQorICAgICAgICBWb3Jvbm9pRGlhZ3JhbS0+c2l0ZXMgPSBOZXdTaXRlU2VxOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIE5ld1NpdGVTZXFQcmV2LT5oX25leHQgPSAoQ3ZTZXEqKU5ld1NpdGVTZXE7CisgICAgICAgIE5ld1NpdGVTZXEtPmhfcHJldiA9IChDdlNlcSopTmV3U2l0ZVNlcVByZXY7CisgICAgfQorICAgIE5ld1NpdGVTZXFQcmV2ID0gTmV3U2l0ZVNlcTsKKyAgICByZXR1cm4gMTsKK30vL2VuZCBvZiBfY3ZDb252ZXJ0CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitpbnQgX2N2Q29uc3RydWN0RXh0U2l0ZXMoQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDb250b3VyU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUIHR5cGUpCit7IAorICAgIGNvbnN0IGRvdWJsZSBhbmdsX2VwcyA9IDAuMDM7CisgICAgQ3ZTZXEqIFNpdGVTZXEgPSBwVm9yb25vaURpYWdyYW0tPlNpdGVTZXE7CisgICAgQ3ZTZXEqIE5vZGVTZXEgPSBwVm9yb25vaURpYWdyYW0tPk5vZGVTZXE7CisgICAgLy9DdlNlcSogRGlyZWN0aW9uU2VxID0gcFZvcm9ub2lEaWFncmFtLT5EaXJlY3Rpb25TZXE7CisgICAgQ3ZQb2ludEZsb2F0IFZlcnRleDEsVmVydGV4MixWZXJ0ZXgzOworICAgIEN2TGVlUG9pbnQ8VD4gVmVydGV4VDEsVmVydGV4VDIsVmVydGV4VDM7CisgICAgCisgICAgQ3ZTZXFSZWFkZXIgQ29udG91clJlYWRlcjsKKyAgICBDdlZvcm9ub2lTaXRlSW50IFNpdGUgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTH07CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCBTaXRlVGVtcCA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKyAgICBDdlZvcm9ub2lOb2RlSW50IE5vZGU7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGUxLHBOb2RlMjsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSA9ICZTaXRlVGVtcCxwU2l0ZV9wcmV2ID0gJlNpdGVUZW1wOworICAgIHBDdlZvcm9ub2lTaXRlIHBSZWZsZXhTaXRlID0gTlVMTDsKKyAgICBpbnQgTlJlZmxleFNpdGUgPSAwOworICAgIAorICAgIGZsb2F0IGRlbHRhX3hfcmMsIGRlbHRhX3hfY2wsIGRlbHRhX3lfcmMsIGRlbHRhX3lfY2w7CisgICAgZmxvYXQgbm9ybV9jbCxub3JtX3JjLCBtdWx0X2NsX3JjOworICAgIGZsb2F0IF9zaW4sIF9jb3M7CisgICAgaW50IGk7CisKKyAgICBpZihvcmllbnRhdGlvbiA9PSAxKQorICAgIHsKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoQ29udG91clNlcSwgJkNvbnRvdXJSZWFkZXIsMCk7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oVmVydGV4VDEsQ29udG91clJlYWRlcik7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oVmVydGV4VDIsQ29udG91clJlYWRlcik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKENvbnRvdXJTZXEsICZDb250b3VyUmVhZGVyLDEpOyAKKyAgICAgICAgQ1ZfUkVWX1JFQURfU0VRX0VMRU0oVmVydGV4VDEsQ29udG91clJlYWRlcik7CisgICAgICAgIENWX1JFVl9SRUFEX1NFUV9FTEVNKFZlcnRleFQyLENvbnRvdXJSZWFkZXIpOyAgIAorICAgIH0KKyAgICAKKyAgICBWZXJ0ZXgxLnggPSAoZmxvYXQpVmVydGV4VDEueDsKKyAgICBWZXJ0ZXgxLnkgPSAoZmxvYXQpVmVydGV4VDEueTsKKyAgICBWZXJ0ZXgyLnggPSAoZmxvYXQpVmVydGV4VDIueDsKKyAgICBWZXJ0ZXgyLnkgPSAoZmxvYXQpVmVydGV4VDIueTsKKworICAgIF9jdkluaXRWb3Jvbm9pTm9kZSgmTm9kZSwgJlZlcnRleDIpOworICAgIHBOb2RlMSA9IF9jdlNlcVB1c2goTm9kZVNlcSwgJk5vZGUpOworCisgICAgZGVsdGFfeF9jbCA9IFZlcnRleDIueCAtIFZlcnRleDEueDsKKyAgICBkZWx0YV95X2NsID0gVmVydGV4Mi55IC0gVmVydGV4MS55OworICAgIG5vcm1fY2wgPSAoZmxvYXQpc3FydCgoZG91YmxlKWRlbHRhX3hfY2wqZGVsdGFfeF9jbCArIGRlbHRhX3lfY2wqZGVsdGFfeV9jbCk7CisKKyAgICBmb3IoIGkgPSAwO2k8Q29udG91clNlcS0+dG90YWw7aSsrKQorICAgIHsKKyAgICAgICAgaWYob3JpZW50YXRpb24gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTShWZXJ0ZXhUMyxDb250b3VyUmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1JFVl9SRUFEX1NFUV9FTEVNKFZlcnRleFQzLENvbnRvdXJSZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgVmVydGV4My54ID0gKGZsb2F0KVZlcnRleFQzLng7CisgICAgICAgIFZlcnRleDMueSA9IChmbG9hdClWZXJ0ZXhUMy55OworCisgICAgICAgIF9jdkluaXRWb3Jvbm9pTm9kZSgmTm9kZSwgJlZlcnRleDMpOworICAgICAgICBwTm9kZTIgPSBfY3ZTZXFQdXNoKE5vZGVTZXEsICZOb2RlKTsKKworICAgICAgICBkZWx0YV94X3JjID0gVmVydGV4My54IC0gVmVydGV4Mi54OworICAgICAgICBkZWx0YV95X3JjID0gVmVydGV4My55IC0gVmVydGV4Mi55OworICAgICAgICBub3JtX3JjID0gKGZsb2F0KXNxcnQoKGRvdWJsZSlkZWx0YV94X3JjKmRlbHRhX3hfcmMgKyBkZWx0YV95X3JjKmRlbHRhX3lfcmMpOworICAgICAgICBpZihub3JtX3JjPT0wKQorICAgICAgICAgICAgY29udGludWU7CisgICAgCisgICAgICAgIG11bHRfY2xfcmMgPSBub3JtX2NsKm5vcm1fcmM7CisgICAgICAgIF9zaW4gPSAoZGVsdGFfeV9yYyogZGVsdGFfeF9jbCAtIGRlbHRhX3hfcmMqIGRlbHRhX3lfY2wpL211bHRfY2xfcmM7CisgICAgICAgIF9jb3MgPSAtKGRlbHRhX3hfY2wqZGVsdGFfeF9yYyArIGRlbHRhX3lfY2wqZGVsdGFfeV9yYykvbXVsdF9jbF9yYzsKKworICAgICAgICBpZigoX3NpbiA+IGFuZ2xfZXBzKSB8fCAoX3NpbiA+IDAgJiYgX2NvcyA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBwU2l0ZSA9IF9jdlNlcVB1c2goU2l0ZVNlcSwgJlNpdGUpOworICAgICAgICAgICAgX2N2SW5pdFZvcm9ub2lTaXRlKHBTaXRlLHBOb2RlMSxwTm9kZTIscFNpdGVfcHJldik7CisgICAgICAgICAgICBwU2l0ZV9wcmV2LT5uZXh0X3NpdGUgPSBwU2l0ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKChfc2luIDwgLWFuZ2xfZXBzKSB8fCAoX3NpbiA8IDAgJiYgX2NvcyA+IDApKQorICAgICAgICB7CisgICAgICAgICAgICBwU2l0ZSA9IF9jdlNlcVB1c2goU2l0ZVNlcSwgJlNpdGUpOworICAgICAgICAgICAgX2N2SW5pdFZvcm9ub2lTaXRlKHBTaXRlLHBOb2RlMSxwTm9kZTEscFNpdGVfcHJldik7CisgICAgICAgICAgICBwUmVmbGV4U2l0ZSA9IHBTaXRlOyAKKyAgICAgICAgICAgIE5SZWZsZXhTaXRlKys7CisgICAgICAgICAgICBwU2l0ZV9wcmV2LT5uZXh0X3NpdGUgPSBwU2l0ZTsKKworICAgICAgICAgICAgcFNpdGVfcHJldiA9IHBTaXRlOworICAgICAgICAgICAgcFNpdGUgPSBfY3ZTZXFQdXNoKFNpdGVTZXEsICZTaXRlKTsKKyAgICAgICAgICAgIF9jdkluaXRWb3Jvbm9pU2l0ZShwU2l0ZSxwTm9kZTEscE5vZGUyLHBTaXRlX3ByZXYpOworICAgICAgICAgICAgcFNpdGVfcHJldi0+bmV4dF9zaXRlID0gcFNpdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWZXJ0ZXgyID0gVmVydGV4MzsKKyAgICAgICAgICAgIGRlbHRhX3lfcmMgPSBkZWx0YV95X2NsICsgZGVsdGFfeV9yYzsKKyAgICAgICAgICAgIGRlbHRhX3hfcmMgPSBkZWx0YV94X2NsICsgZGVsdGFfeF9yYzsKKyAgICAgICAgICAgIHBTaXRlLT5ub2RlMiA9IHBOb2RlMjsKKyAgICAgICAgCisgICAgICAgICAgICBub3JtX3JjID0gKGZsb2F0KXNxcnQoKGRvdWJsZSlkZWx0YV95X3JjKmRlbHRhX3lfcmMgKyBkZWx0YV94X3JjKmRlbHRhX3hfcmMpOworICAgICAgICB9CisgICAgICAgIFZlcnRleDI9VmVydGV4MzsKKyAgICAgICAgZGVsdGFfeV9jbD0gZGVsdGFfeV9yYzsKKyAgICAgICAgZGVsdGFfeF9jbD0gZGVsdGFfeF9yYzsKKyAgICAgICAgbm9ybV9jbCA9IG5vcm1fcmM7CisgICAgICAgIHBTaXRlX3ByZXYgPSBwU2l0ZTsKKyAgICAgICAgcE5vZGUxID0gcE5vZGUyOworICAgIH0KKworICAgIGlmKFNpdGVUZW1wLm5leHRfc2l0ZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZihDb250b3VyU2VxLT50b3RhbCAtIE5SZWZsZXhTaXRlPDIpCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYoU2l0ZVNlcS0+dG90YWw8MykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBwU2l0ZS0+bm9kZTIgPSBTaXRlVGVtcC5uZXh0X3NpdGUtPm5vZGUxOworICAgIHBTaXRlLT5uZXh0X3NpdGUgPSBTaXRlVGVtcC5uZXh0X3NpdGU7CisgICAgU2l0ZVRlbXAubmV4dF9zaXRlLT5wcmV2X3NpdGUgPSBwU2l0ZTsKKworICAgIGkgPSAwOworICAgIGlmKHBSZWZsZXhTaXRlIT1OVUxMKQorICAgICAgICBmb3IoaT0wOyBpPFNpdGVTZXEtPnRvdGFsOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBSZWZsZXhTaXRlLT5uZXh0X3NpdGUtPm5leHRfc2l0ZS0+bm9kZTEgIT0KKyAgICAgICAgICAgICAgcFJlZmxleFNpdGUtPm5leHRfc2l0ZS0+bmV4dF9zaXRlLT5ub2RlMikKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcFJlZmxleFNpdGUgPSBwUmVmbGV4U2l0ZS0+bmV4dF9zaXRlLT5uZXh0X3NpdGU7CisgICAgICAgIH0KKyAgICBwVm9yb25vaURpYWdyYW0tPnJlZmxleF9zaXRlID0gcFJlZmxleFNpdGU7CisgICAgcmV0dXJuIChpPFNpdGVTZXEtPnRvdGFsKTsKK30vL2VuZCBvZiBfY3ZDb25zdHJ1Y3RFeHRTaXRlcworCit0ZW1wbGF0ZTxjbGFzcyBUPgoraW50IF9jdkNvbnN0cnVjdEludFNpdGVzKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDdXJyU2l0ZVNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDdXJyQ29udG91clNlcSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSAmcFRvcFNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JpZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHR5cGUpCit7IAorICAgIGNvbnN0IGRvdWJsZSBhbmdsX2VwcyA9IDAuMDM7CisgICAgZmxvYXQgbWluX3ggPSAoZmxvYXQpOTk5OTk5OTk5OworICAgIEN2U2VxKiBTaXRlU2VxID0gQ3VyclNpdGVTZXE7CisgICAgQ3ZTZXEqIE5vZGVTZXEgPSBwVm9yb25vaURpYWdyYW0tPk5vZGVTZXE7CisgICAgLy9DdlNlcSogRGlyZWN0aW9uU2VxID0gcFZvcm9ub2lEaWFncmFtLT5EaXJlY3Rpb25TZXE7CisgICAgQ3ZQb2ludEZsb2F0IFZlcnRleDEsVmVydGV4MixWZXJ0ZXgzOworICAgIEN2TGVlUG9pbnQ8VD4gVmVydGV4VDEsVmVydGV4VDIsVmVydGV4VDM7CisgICAgCisgICAgQ3ZTZXFSZWFkZXIgQ29udG91clJlYWRlcjsKKyAgICBDdlZvcm9ub2lTaXRlSW50IFNpdGUgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTH07CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCBTaXRlVGVtcCA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKyAgICBDdlZvcm9ub2lOb2RlSW50IE5vZGU7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGUxLHBOb2RlMjsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSA9ICZTaXRlVGVtcCxwU2l0ZV9wcmV2ID0gJlNpdGVUZW1wOworICAgIHBUb3BTaXRlID0gTlVMTDsKKyAgICBpbnQgTlJlZmxleFNpdGUgPSAwOworICAgIAorICAgIGlmKEN1cnJDb250b3VyU2VxLT50b3RhbCA9PSAxKQorICAgIHsKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoQ3VyckNvbnRvdXJTZXEsICZDb250b3VyUmVhZGVyLDApOyAKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTShWZXJ0ZXhUMSxDb250b3VyUmVhZGVyKTsgCisgICAgICAgIFZlcnRleDEueCA9IChmbG9hdClWZXJ0ZXhUMS54OworICAgICAgICBWZXJ0ZXgxLnkgPSAoZmxvYXQpVmVydGV4VDEueTsKKworICAgICAgICBfY3ZJbml0Vm9yb25vaU5vZGUoJk5vZGUsICZWZXJ0ZXgxKTsKKyAgICAgICAgcE5vZGUxID0gX2N2U2VxUHVzaChOb2RlU2VxLCAmTm9kZSk7CisgICAgICAgIHBUb3BTaXRlID0gcFNpdGUgPSBfY3ZTZXFQdXNoKFNpdGVTZXEsICZTaXRlKTsKKyAgICAgICAgX2N2SW5pdFZvcm9ub2lTaXRlKHBTaXRlLHBOb2RlMSxwTm9kZTEscFNpdGUpOworICAgICAgICBwU2l0ZS0+bmV4dF9zaXRlID0gcFNpdGU7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIGZsb2F0IGRlbHRhX3hfcmMsIGRlbHRhX3hfY2wsIGRlbHRhX3lfcmMsIGRlbHRhX3lfY2w7CisgICAgZmxvYXQgbm9ybV9jbCxub3JtX3JjLCBtdWx0X2NsX3JjOworICAgIGZsb2F0IF9zaW4sIF9jb3M7CisgICAgaW50IGk7CisKKyAgICBpZihvcmllbnRhdGlvbiA9PSAxKQorICAgIHsKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoQ3VyckNvbnRvdXJTZXEsICZDb250b3VyUmVhZGVyLDApOworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKFZlcnRleFQxLENvbnRvdXJSZWFkZXIpOworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKFZlcnRleFQyLENvbnRvdXJSZWFkZXIpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdlN0YXJ0UmVhZFNlcShDdXJyQ29udG91clNlcSwgJkNvbnRvdXJSZWFkZXIsMSk7IAorICAgICAgICBDVl9SRVZfUkVBRF9TRVFfRUxFTShWZXJ0ZXhUMSxDb250b3VyUmVhZGVyKTsKKyAgICAgICAgQ1ZfUkVWX1JFQURfU0VRX0VMRU0oVmVydGV4VDIsQ29udG91clJlYWRlcik7ICAgCisgICAgfQorCisgICAgVmVydGV4MS54ID0gKGZsb2F0KVZlcnRleFQxLng7CisgICAgVmVydGV4MS55ID0gKGZsb2F0KVZlcnRleFQxLnk7CisgICAgVmVydGV4Mi54ID0gKGZsb2F0KVZlcnRleFQyLng7CisgICAgVmVydGV4Mi55ID0gKGZsb2F0KVZlcnRleFQyLnk7CisKKyAgICBfY3ZJbml0Vm9yb25vaU5vZGUoJk5vZGUsICZWZXJ0ZXgyKTsKKyAgICBwTm9kZTEgPSBfY3ZTZXFQdXNoKE5vZGVTZXEsICZOb2RlKTsKKworICAgIGRlbHRhX3hfY2wgPSBWZXJ0ZXgyLnggLSBWZXJ0ZXgxLng7CisgICAgZGVsdGFfeV9jbCA9IFZlcnRleDIueSAtIFZlcnRleDEueTsKKyAgICBub3JtX2NsID0gKGZsb2F0KXNxcnQoKGRvdWJsZSlkZWx0YV94X2NsKmRlbHRhX3hfY2wgKyBkZWx0YV95X2NsKmRlbHRhX3lfY2wpOworICAgIGZvciggaSA9IDA7aTxDdXJyQ29udG91clNlcS0+dG90YWw7aSsrKQorICAgIHsKKyAgICAgICAgaWYob3JpZW50YXRpb24gPT0gMSkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTShWZXJ0ZXhUMyxDb250b3VyUmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX1JFVl9SRUFEX1NFUV9FTEVNKFZlcnRleFQzLENvbnRvdXJSZWFkZXIpOworICAgICAgICB9CisgICAgICAgIFZlcnRleDMueCA9IChmbG9hdClWZXJ0ZXhUMy54OworICAgICAgICBWZXJ0ZXgzLnkgPSAoZmxvYXQpVmVydGV4VDMueTsKKyAgICAKKyAgICAgICAgX2N2SW5pdFZvcm9ub2lOb2RlKCZOb2RlLCAmVmVydGV4Myk7CisgICAgICAgIHBOb2RlMiA9IF9jdlNlcVB1c2goTm9kZVNlcSwgJk5vZGUpOworCisgICAgICAgIGRlbHRhX3hfcmMgPSBWZXJ0ZXgzLnggLSBWZXJ0ZXgyLng7CisgICAgICAgIGRlbHRhX3lfcmMgPSBWZXJ0ZXgzLnkgLSBWZXJ0ZXgyLnk7CisgICAgICAgIG5vcm1fcmMgPSAoZmxvYXQpc3FydCgoZG91YmxlKWRlbHRhX3hfcmMqZGVsdGFfeF9yYyArIGRlbHRhX3lfcmMqZGVsdGFfeV9yYyk7CisgICAgICAgIGlmKG5vcm1fcmM9PTApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBtdWx0X2NsX3JjID0gbm9ybV9jbCpub3JtX3JjOworICAgICAgICBfc2luID0gKGRlbHRhX3lfcmMqIGRlbHRhX3hfY2wgLSBkZWx0YV94X3JjKiBkZWx0YV95X2NsKS9tdWx0X2NsX3JjOworICAgICAgICBfY29zID0gLShkZWx0YV94X2NsKmRlbHRhX3hfcmMgKyBkZWx0YV95X2NsKmRlbHRhX3lfcmMpL211bHRfY2xfcmM7CisgICAgICAgIGlmKChfc2luID4gYW5nbF9lcHMpIHx8IChfc2luID4gMCAmJiBfY29zID4gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTaXRlID0gX2N2U2VxUHVzaChTaXRlU2VxLCAmU2l0ZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaVNpdGUocFNpdGUscE5vZGUxLHBOb2RlMixwU2l0ZV9wcmV2KTsKKyAgICAgICAgICAgIHBTaXRlX3ByZXYtPm5leHRfc2l0ZSA9IHBTaXRlOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoKF9zaW4gPCAtYW5nbF9lcHMpIHx8IChfc2luIDwgMCAmJiBfY29zID4gMCkgfHwgKF9zaW4gPT0gMCAmJiBDdXJyQ29udG91clNlcS0+dG90YWwgPT0gMikpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTaXRlID0gX2N2U2VxUHVzaChTaXRlU2VxLCAmU2l0ZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaVNpdGUocFNpdGUscE5vZGUxLHBOb2RlMSxwU2l0ZV9wcmV2KTsKKyAgICAgICAgICAgIGlmKHBOb2RlMS0+bm9kZS54IDwgbWluX3gpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWluX3ggPSBwTm9kZTEtPm5vZGUueDsKKyAgICAgICAgICAgICAgICBwVG9wU2l0ZSA9IHBTaXRlOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5SZWZsZXhTaXRlKys7CisgICAgICAgICAgICBwU2l0ZV9wcmV2LT5uZXh0X3NpdGUgPSBwU2l0ZTsKKworICAgICAgICAgICAgcFNpdGVfcHJldiA9IHBTaXRlOworICAgICAgICAgICAgcFNpdGUgPSBfY3ZTZXFQdXNoKFNpdGVTZXEsICZTaXRlKTsKKyAgICAgICAgICAgIF9jdkluaXRWb3Jvbm9pU2l0ZShwU2l0ZSxwTm9kZTEscE5vZGUyLHBTaXRlX3ByZXYpOworICAgICAgICAgICAgcFNpdGVfcHJldi0+bmV4dF9zaXRlID0gcFNpdGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBWZXJ0ZXgyID0gVmVydGV4MzsKKyAgICAgICAgICAgIGRlbHRhX3lfcmMgPSBkZWx0YV95X2NsICsgZGVsdGFfeV9yYzsKKyAgICAgICAgICAgIGRlbHRhX3hfcmMgPSBkZWx0YV94X2NsICsgZGVsdGFfeF9yYzsKKyAgICAgICAgICAgIG5vcm1fcmMgPSAoZmxvYXQpc3FydCgoZG91YmxlKWRlbHRhX3lfcmMqZGVsdGFfeV9yYyArIGRlbHRhX3hfcmMqZGVsdGFfeF9yYyk7CisgICAgICAgICAgICBwU2l0ZS0+bm9kZTIgPSBwTm9kZTI7CisgICAgICAgIH0KKworICAgICAgICBWZXJ0ZXgxPVZlcnRleDI7CisgICAgICAgIFZlcnRleDI9VmVydGV4MzsKKyAgICAgICAgZGVsdGFfeV9jbD0gZGVsdGFfeV9yYzsKKyAgICAgICAgZGVsdGFfeF9jbD0gZGVsdGFfeF9yYzsKKyAgICAgICAgbm9ybV9jbCA9IG5vcm1fcmM7CisgICAgICAgIHBTaXRlX3ByZXYgPSBwU2l0ZTsKKyAgICAgICAgcE5vZGUxID0gcE5vZGUyOworICAgIH0KKworICAgIGlmKFNpdGVUZW1wLm5leHRfc2l0ZT09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZihOUmVmbGV4U2l0ZSA8IDMgJiYgQ3VyckNvbnRvdXJTZXEtPnRvdGFsID4gMiB8fCBOUmVmbGV4U2l0ZSA8IDIpCisgICAgICAgIHJldHVybiAwOworCisgICAgcFNpdGUtPm5vZGUyID0gU2l0ZVRlbXAubmV4dF9zaXRlLT5ub2RlMTsKKyAgICBwU2l0ZS0+bmV4dF9zaXRlID0gU2l0ZVRlbXAubmV4dF9zaXRlOworICAgIFNpdGVUZW1wLm5leHRfc2l0ZS0+cHJldl9zaXRlID0gcFNpdGU7CisKKyAgICByZXR1cm4gMTsKK30vL2VuZCBvZiBfY3ZDb25zdHJ1Y3RJbnRTaXRlcworCitzdGF0aWMgaW50IF9jdkNvbnN0cnVjdEV4dENoYWlucyhDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgQ3ZTZXEqIFNpdGVTZXEgPSBwVm9yb25vaURpYWdyYW0tPlNpdGVTZXE7CisgICAgQ3ZTZXEqIENoYWluU2VxID0gcFZvcm9ub2lEaWFncmFtLT5DaGFpblNlcTsKKworICAgIEN2Vm9yb25vaUNoYWluSW50IENoYWluOworICAgIHBDdlZvcm9ub2lDaGFpbiBwQ2hhaW4scENoYWluRmlyc3Q7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGUsIHBTaXRlX3ByZXYsIHBTaXRlRmlyc3QscFJlZmxleFNpdGUgPSBwVm9yb25vaURpYWdyYW0tPnJlZmxleF9zaXRlOworCisgICAgaWYocFJlZmxleFNpdGU9PU5VTEwpCisgICAgICAgIHBTaXRlID0gcFNpdGVGaXJzdCA9IChwQ3ZWb3Jvbm9pU2l0ZSljdkdldFNlcUVsZW0oU2l0ZVNlcSwgMCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgd2hpbGUocFJlZmxleFNpdGUtPm5leHRfc2l0ZS0+bmV4dF9zaXRlLT5ub2RlMT09CisgICAgICAgICAgICAgIHBSZWZsZXhTaXRlLT5uZXh0X3NpdGUtPm5leHRfc2l0ZS0+bm9kZTIpCisgICAgICAgICAgICBwUmVmbGV4U2l0ZSA9IHBSZWZsZXhTaXRlLT5uZXh0X3NpdGUtPm5leHRfc2l0ZTsKKworICAgICAgICBwU2l0ZSA9IHBTaXRlRmlyc3QgPSBwUmVmbGV4U2l0ZS0+bmV4dF9zaXRlOworICAgIH0KKyAgICAKKyAgICBDaGFpbi5sYXN0X3NpdGUgPSBwU2l0ZTsKKyAgICBfY3ZDb25zdHJ1Y3RFZGdlcyhwU2l0ZSxwVm9yb25vaURpYWdyYW0pOworICAgIHBTaXRlX3ByZXYgPSBwU2l0ZTsKKyAgICBwU2l0ZSA9IHBTaXRlLT5wcmV2X3NpdGU7CisgICAgZG8KKyAgICB7CisgICAgICAgIGlmKHBTaXRlLT5ub2RlMSE9cFNpdGUtPm5vZGUyKQorICAgICAgICB7CisgICAgICAgICAgICBDaGFpbi5maXJzdF9zaXRlID0gcFNpdGVfcHJldjsKKyAgICAgICAgICAgIHBDaGFpbiA9IF9jdlNlcVB1c2hGcm9udChDaGFpblNlcSwmQ2hhaW4pOworCisgICAgICAgICAgICBfY3ZDb25zdHJ1Y3RFZGdlcyhwU2l0ZSxwVm9yb25vaURpYWdyYW0pOworICAgICAgICAgICAgQ2hhaW4ubGFzdF9zaXRlID0gcFNpdGU7CisgICAgICAgICAgICBDaGFpbi5uZXh0X2NoYWluID0gcENoYWluOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcFNpdGU9cFNpdGUtPnByZXZfc2l0ZTsKKyAgICAgICAgICAgIF9jdkNvbnN0cnVjdEVkZ2VzKHBTaXRlLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgICAgICBfY3ZDb25zdHJ1Y3RFZGdlcyhwU2l0ZS0+bmV4dF9zaXRlLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgIH0KKyAgICAgICAgcFNpdGVfcHJldiA9IHBTaXRlOworICAgICAgICBwU2l0ZSA9IHBTaXRlLT5wcmV2X3NpdGU7CisgICAgfXdoaWxlKHBTaXRlIT1wU2l0ZUZpcnN0KTsKKworICAgIENoYWluLmZpcnN0X3NpdGUgPSBwU2l0ZV9wcmV2OworICAgIHBDaGFpbiA9IF9jdlNlcVB1c2hGcm9udChDaGFpblNlcSwmQ2hhaW4pOworICAgIHBDaGFpbkZpcnN0ID0gKHBDdlZvcm9ub2lDaGFpbiljdkdldFNlcUVsZW0oQ2hhaW5TZXEsQ2hhaW5TZXEtPnRvdGFsIC0gMSk7CisgICAgcENoYWluRmlyc3QtPm5leHRfY2hhaW4gPSBwQ2hhaW47CisgICAgaWYoQ2hhaW5TZXEtPnRvdGFsIDwgMykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMTsKK30vLyBlbmQgb2YgX2N2Q29uc3RydWN0RXh0Q2hhaW5zCisKK3N0YXRpYyB2b2lkIF9jdkNvbnN0cnVjdEludENoYWlucyhDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDdXJyQ2hhaW5TZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxKiBDdXJyU2l0ZVNlcSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFRvcFNpdGUpCit7CisgICAgQ3ZTZXEqIENoYWluU2VxID0gQ3VyckNoYWluU2VxOworCisgICAgaWYoQ3VyclNpdGVTZXEtPnRvdGFsID09IDEpCisgICAgICAgIHJldHVybjsKKworICAgIEN2Vm9yb25vaUNoYWluSW50IENoYWluID0ge05VTEwsTlVMTCxOVUxMfTsKKyAgICBwQ3ZWb3Jvbm9pQ2hhaW4gcENoYWluLHBDaGFpbkZpcnN0OzsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSwgcFNpdGVfcHJldiwgcFNpdGVGaXJzdDsKKyAgICBwU2l0ZSA9IHBTaXRlRmlyc3QgPSBwVG9wU2l0ZS0+bmV4dF9zaXRlOworCisgICAgQ2hhaW4ubGFzdF9zaXRlID0gcFNpdGU7CisgICAgX2N2Q29uc3RydWN0RWRnZXMocFNpdGUscFZvcm9ub2lEaWFncmFtKTsKKyAgICBwU2l0ZV9wcmV2ID0gcFNpdGU7CisgICAgcFNpdGUgPSBwU2l0ZS0+cHJldl9zaXRlOworICAgIGRvCisgICAgeworICAgICAgICBpZihwU2l0ZS0+bm9kZTEhPXBTaXRlLT5ub2RlMikKKyAgICAgICAgeworICAgICAgICAgICAgQ2hhaW4uZmlyc3Rfc2l0ZSA9IHBTaXRlX3ByZXY7CisgICAgICAgICAgICBwQ2hhaW4gPSBfY3ZTZXFQdXNoRnJvbnQoQ2hhaW5TZXEsJkNoYWluKTsKKworICAgICAgICAgICAgX2N2Q29uc3RydWN0RWRnZXMocFNpdGUscFZvcm9ub2lEaWFncmFtKTsKKyAgICAgICAgICAgIENoYWluLmxhc3Rfc2l0ZSA9IHBTaXRlOworICAgICAgICAgICAgQ2hhaW4ubmV4dF9jaGFpbiA9IHBDaGFpbjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBTaXRlPXBTaXRlLT5wcmV2X3NpdGU7CisgICAgICAgICAgICBpZihwU2l0ZSAhPSBwU2l0ZUZpcnN0KQorICAgICAgICAgICAgICAgIF9jdkNvbnN0cnVjdEVkZ2VzKHBTaXRlLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgICAgICBfY3ZDb25zdHJ1Y3RFZGdlcyhwU2l0ZS0+bmV4dF9zaXRlLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgIH0KKyAgICAgICAgcFNpdGVfcHJldiA9IHBTaXRlOworICAgICAgICBwU2l0ZSA9IHBTaXRlLT5wcmV2X3NpdGU7CisgICAgfXdoaWxlKHBTaXRlIT1wU2l0ZUZpcnN0ICYmIHBTaXRlIT0gcFNpdGVGaXJzdC0+cHJldl9zaXRlKTsKKworICAgIGlmKHBTaXRlID09IHBTaXRlRmlyc3QtPnByZXZfc2l0ZSAmJiBDaGFpblNlcS0+dG90YWwgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIENoYWluLmZpcnN0X3NpdGUgPSBwU2l0ZV9wcmV2OworICAgIGlmKHBTaXRlID09IHBTaXRlRmlyc3QtPnByZXZfc2l0ZSkKKyAgICB7CisgICAgICAgIHBDaGFpbkZpcnN0ID0gKHBDdlZvcm9ub2lDaGFpbiljdkdldFNlcUVsZW0oQ2hhaW5TZXEsQ2hhaW5TZXEtPnRvdGFsIC0gMSk7CisgICAgICAgIHBDaGFpbkZpcnN0LT5sYXN0X3NpdGUgPSBDaGFpbi5sYXN0X3NpdGU7CisgICAgICAgIHBDaGFpbkZpcnN0LT5uZXh0X2NoYWluID0gQ2hhaW4ubmV4dF9jaGFpbjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwQ2hhaW4gPSBfY3ZTZXFQdXNoRnJvbnQoQ2hhaW5TZXEsJkNoYWluKTsKKyAgICAgICAgcENoYWluRmlyc3QgPSAocEN2Vm9yb25vaUNoYWluKWN2R2V0U2VxRWxlbShDaGFpblNlcSxDaGFpblNlcS0+dG90YWwgLSAxKTsKKyAgICAgICAgcENoYWluRmlyc3QtPm5leHRfY2hhaW4gPSBwQ2hhaW47CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9Ly8gZW5kIG9mIF9jdkNvbnN0cnVjdEludENoYWlucworCitDVl9JTkxJTkUgdm9pZCBfY3ZDb25zdHJ1Y3RFZGdlcyhwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSxDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgQ3ZTZXEqIEVkZ2VTZXEgPSBwVm9yb25vaURpYWdyYW0tPkVkZ2VTZXE7CisgICAgQ3ZTZXEqIERpcmVjdGlvblNlcSA9IHBWb3Jvbm9pRGlhZ3JhbS0+RGlyZWN0aW9uU2VxOworICAgIEN2Vm9yb25vaUVkZ2VJbnQgRWRnZSA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9OworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMSxwRWRnZTI7CisgICAgQ3ZEaXJlY3Rpb24gRWRnZURpcmVjdGlvbixTaXRlRGlyZWN0aW9uOworICAgIGZsb2F0IHNpdGVfbGVuZ2g7CisKKyAgICBFZGdlLnNpdGUgPSBwU2l0ZTsKKyAgICBpZihwU2l0ZS0+bm9kZTEhPXBTaXRlLT5ub2RlMikKKyAgICB7CisgICAgICAgIFNpdGVEaXJlY3Rpb24ueCA9IHBTaXRlLT5ub2RlMi0+bm9kZS54IC0gcFNpdGUtPm5vZGUxLT5ub2RlLng7CisgICAgICAgIFNpdGVEaXJlY3Rpb24ueSA9IHBTaXRlLT5ub2RlMi0+bm9kZS55IC0gcFNpdGUtPm5vZGUxLT5ub2RlLnk7CisgICAgICAgIHNpdGVfbGVuZ2ggPSAoZmxvYXQpc3FydCgoZG91YmxlKVNpdGVEaXJlY3Rpb24ueCpTaXRlRGlyZWN0aW9uLnggKyBTaXRlRGlyZWN0aW9uLnkgKiBTaXRlRGlyZWN0aW9uLnkpOworICAgICAgICBTaXRlRGlyZWN0aW9uLnggLz0gc2l0ZV9sZW5naDsKKyAgICAgICAgU2l0ZURpcmVjdGlvbi55IC89IHNpdGVfbGVuZ2g7CisgICAgICAgIEVkZ2VEaXJlY3Rpb24ueCA9IC1TaXRlRGlyZWN0aW9uLnk7CisgICAgICAgIEVkZ2VEaXJlY3Rpb24ueSA9IFNpdGVEaXJlY3Rpb24ueDsKKyAgICAgICAgRWRnZS5kaXJlY3Rpb24gPSBfY3ZTZXFQdXNoKERpcmVjdGlvblNlcSwmRWRnZURpcmVjdGlvbik7CisgICAgICAgIHBTaXRlLT5kaXJlY3Rpb24gPSBfY3ZTZXFQdXNoKERpcmVjdGlvblNlcSwmU2l0ZURpcmVjdGlvbik7CisKKyAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCZFZGdlKTsKKyAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCZFZGdlKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcHJldiA9IHBTaXRlLT5wcmV2X3NpdGU7CisgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX25leHQgPSBwU2l0ZS0+bmV4dF9zaXRlOworCisgICAgICAgIHBFZGdlMSA9IF9jdlNlcVB1c2goRWRnZVNlcSwmRWRnZSk7CisgICAgICAgIHBFZGdlMiA9IF9jdlNlcVB1c2goRWRnZVNlcSwmRWRnZSk7CisgICAgCisgICAgICAgIHBFZGdlMi0+ZGlyZWN0aW9uID0gcFNpdGVfbmV4dC0+ZWRnZTEtPmRpcmVjdGlvbjsKKyAgICAgICAgcEVkZ2UyLT50d2luX2VkZ2UgPSBwU2l0ZV9uZXh0LT5lZGdlMTsKKyAgICAgICAgcFNpdGVfbmV4dC0+ZWRnZTEtPnR3aW5fZWRnZSA9IHBFZGdlMjsKKworICAgICAgICBwRWRnZTEtPmRpcmVjdGlvbiA9IHBTaXRlX3ByZXYtPmVkZ2UyLT5kaXJlY3Rpb247CisgICAgICAgIHBFZGdlMS0+dHdpbl9lZGdlID0gcFNpdGVfcHJldi0+ZWRnZTI7CisgICAgICAgIHBTaXRlX3ByZXYtPmVkZ2UyLT50d2luX2VkZ2UgPSBwRWRnZTE7CisgICAgfQorCisgICAgICAgIHBFZGdlMi0+bm9kZTEgPSBwU2l0ZS0+bm9kZTI7CisgICAgICAgIHBFZGdlMS0+bm9kZTIgPSBwU2l0ZS0+bm9kZTE7CisgICAgICAgIHBTaXRlLT5lZGdlMSA9IHBFZGdlMTsKKyAgICAgICAgcFNpdGUtPmVkZ2UyID0gcEVkZ2UyOworICAgICAgICBwRWRnZTItPm5leHRfZWRnZSA9IHBFZGdlMTsKKyAgICAgICAgcEVkZ2UxLT5wcmV2X2VkZ2UgPSBwRWRnZTI7Cit9Ly8gZW5kIG9mIF9jdkNvbnN0cnVjdEVkZ2VzCisKK3N0YXRpYyBpbnQgX2N2Q29uc3RydWN0RXh0VkQoQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKQoreworICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX3JpZ2h0ID0gMCxwU2l0ZV9sZWZ0ID0gMDsKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0LHBFZGdlX3JpZ2h0OworICAgIHBDdlZvcm9ub2lDaGFpbiBwQ2hhaW4xLCBwQ2hhaW4yOworCisgICAgcENoYWluMSA9IChwQ3ZWb3Jvbm9pQ2hhaW4pY3ZHZXRTZXFFbGVtKHBWb3Jvbm9pRGlhZ3JhbS0+Q2hhaW5TZXEsMCk7CisgICAgZG8KKyAgICB7CisgICAgICAgIHBDaGFpbjIgPSBwQ2hhaW4xLT5uZXh0X2NoYWluOworICAgICAgICBpZihwQ2hhaW4yLT5uZXh0X2NoYWluPT1wQ2hhaW4xKQorICAgICAgICB7CisgICAgICAgICAgICBwU2l0ZV9yaWdodCA9IHBDaGFpbjEtPmZpcnN0X3NpdGU7CisgICAgICAgICAgICBwU2l0ZV9sZWZ0ID0gcENoYWluMi0+bGFzdF9zaXRlOworICAgICAgICAgICAgcEVkZ2VfbGVmdCA9IHBTaXRlX2xlZnQtPmVkZ2UyLT5uZXh0X2VkZ2U7CisgICAgICAgICAgICBwRWRnZV9yaWdodCA9IHBTaXRlX3JpZ2h0LT5lZGdlMS0+cHJldl9lZGdlOworICAgICAgICAgICAgcEVkZ2VfbGVmdC0+cHJldl9lZGdlID0gTlVMTDsKKyAgICAgICAgICAgIHBFZGdlX3JpZ2h0LT5uZXh0X2VkZ2UgPSBOVUxMOworICAgICAgICAgICAgcFNpdGVfcmlnaHQtPmVkZ2UxID0gTlVMTDsKKyAgICAgICAgICAgIHBTaXRlX2xlZnQtPmVkZ2UyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCFfY3ZKb2luQ2hhaW5zKHBDaGFpbjEscENoYWluMixwVm9yb25vaURpYWdyYW0pKQorICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgcENoYWluMS0+bGFzdF9zaXRlID0gcENoYWluMi0+bGFzdF9zaXRlOworICAgICAgICBwQ2hhaW4xLT5uZXh0X2NoYWluID0gcENoYWluMi0+bmV4dF9jaGFpbjsKKyAgICAgICAgcENoYWluMSA9IHBDaGFpbjEtPm5leHRfY2hhaW47CisgICAgfXdoaWxlKHBDaGFpbjEtPm5leHRfY2hhaW4gIT0gcENoYWluMSk7CisKKyAgICBwQ3ZWb3Jvbm9pTm9kZSBwRW5kTm9kZSA9IHBTaXRlX2xlZnQtPm5vZGUyOworICAgIGlmKHBTaXRlX3JpZ2h0LT5lZGdlMT09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICBwU2l0ZV9yaWdodC0+ZWRnZTEtPm5vZGUyID0gcEVuZE5vZGU7CisKKyAgICBpZihwU2l0ZV9sZWZ0LT5lZGdlMj09TlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgZWxzZQorICAgICAgICBwU2l0ZV9sZWZ0LT5lZGdlMi0+bm9kZTEgPSBwRW5kTm9kZTsKKworICAgIHJldHVybiAxOworfS8vZW5kIG9mIF9jdkNvbnN0cnVjdEV4dFZECisKK3N0YXRpYyBpbnQgX2N2Sm9pbkNoYWlucyhwQ3ZWb3Jvbm9pQ2hhaW4gcENoYWluMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lDaGFpbiBwQ2hhaW4yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgY29uc3QgZG91YmxlIGRpc3RfZXBzID0gMC4wNTsKKyAgICBpZihwQ2hhaW4xLT5maXJzdF9zaXRlID09IE5VTEwgfHwgcENoYWluMS0+bGFzdF9zaXRlID09IE5VTEwgfHwgCisgICAgICAgIHBDaGFpbjItPmZpcnN0X3NpdGUgPT0gTlVMTCB8fCBwQ2hhaW4yLT5sYXN0X3NpdGUgPT0gTlVMTCkgCisgICAgICAgIHJldHVybiAwOworCisgICAgQ3ZWb3Jvbm9pRWRnZUludCBFZGdlTlVMTCA9IHtOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9OworCisgICAgQ3ZTZXEqIE5vZGVTZXEgPSBwVm9yb25vaURpYWdyYW0tPk5vZGVTZXE7CisgICAgQ3ZTZXEqIEVkZ2VTZXEgPSBwVm9yb25vaURpYWdyYW0tPkVkZ2VTZXE7CisgICAgICAgIAorICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQgPSBwQ2hhaW4xLT5sYXN0X3NpdGU7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcmlnaHQgPSBwQ2hhaW4yLT5maXJzdF9zaXRlOworICAgIAorICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnQgPSBwU2l0ZV9sZWZ0LT5lZGdlMi0+bmV4dF9lZGdlOworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0ID0gcFNpdGVfcmlnaHQtPmVkZ2UxLT5wcmV2X2VkZ2U7CisKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0X2N1ciA9IHBFZGdlX2xlZnQ7CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHRfY3VyID0gcEVkZ2VfcmlnaHQ7CisKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0X3ByZXYgPSBOVUxMOworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0X25leHQgPSBOVUxMOworCisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGVfc2l0ZWxlZnQgPSBwQ2hhaW4xLT5maXJzdF9zaXRlLT5ub2RlMTsKKyAgICBwQ3ZWb3Jvbm9pTm9kZSBwTm9kZV9zaXRlcmlnaHQgPSBwQ2hhaW4yLT5sYXN0X3NpdGUtPm5vZGUyOworICAgIC8qQ3ZWb3Jvbm9pU2l0ZUludCBTaXRlX2xlZnRfY2hhaW4gPSB7cE5vZGVfc2l0ZWxlZnQscE5vZGVfc2l0ZWxlZnQsTlVMTCxOVUxMLE5VTEwsTlVMTH07CisgICAgQ3ZWb3Jvbm9pU2l0ZUludCBTaXRlX3JpZ2h0X2NoYWluID0ge3BOb2RlX3NpdGVyaWdodCxwTm9kZV9zaXRlcmlnaHQsTlVMTCxOVUxMLE5VTEwsTlVMTH07Ki8KKworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMSxwRWRnZTI7CisgICAgQ3ZQb2ludEZsb2F0IFBvaW50MSA9IHswLDB9LCBQb2ludDIgPSB7MCwwfTsKKyAgICAKKyAgICBmbG9hdCByYWRpdXMxLHJhZGl1czIsZGlzdDEsZGlzdDI7CisgICAgYm9vbCBsZWZ0ID0gdHJ1ZSxyaWdodCA9IHRydWU7CisKKyAgICBDdlZvcm9ub2lOb2RlSW50IE5vZGU7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGVfYmVnaW4gPSBwU2l0ZV9sZWZ0LT5ub2RlMjsKKworICAgIHBFZGdlMSA9IHBTaXRlX2xlZnQtPmVkZ2UyOworICAgIHBFZGdlMS0+bm9kZTIgPSBOVUxMOworICAgIHBFZGdlMiA9IHBTaXRlX3JpZ2h0LT5lZGdlMTsKKyAgICBwRWRnZTItPm5vZGUxID0gTlVMTDsKKyAgICAKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICAKKyAgICAgICAgaWYobGVmdCkKKyAgICAgICAgICAgIHBFZGdlMS0+bm9kZTEgPSBwTm9kZV9iZWdpbjsKKyAgICAgICAgaWYocmlnaHQpCisgICAgICAgICAgICBwRWRnZTItPm5vZGUyID0gcE5vZGVfYmVnaW47CisKKyAgICAgICAgcEVkZ2VfbGVmdCA9IHBFZGdlX2xlZnRfY3VyOworICAgICAgICBwRWRnZV9yaWdodCA9IHBFZGdlX3JpZ2h0X2N1cjsKKworICAgICAgICBpZihsZWZ0JiZyaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgX2N2Q2FsY0VkZ2UocFNpdGVfbGVmdCxwU2l0ZV9yaWdodCxwRWRnZTEscFZvcm9ub2lEaWFncmFtKTsKKyAgICAgICAgICAgIF9jdk1ha2VUd2luRWRnZShwRWRnZTIscEVkZ2UxKTsKKyAgICAgICAgICAgIF9jdlN0aWNrRWRnZUxlZnRCZWdpbihwRWRnZTEscEVkZ2VfbGVmdF9wcmV2LHBTaXRlX2xlZnQpOworICAgICAgICAgICAgX2N2U3RpY2tFZGdlUmlnaHRCZWdpbihwRWRnZTIscEVkZ2VfcmlnaHRfbmV4dCxwU2l0ZV9yaWdodCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZighbGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgX2N2Q2FsY0VkZ2UocE5vZGVfc2l0ZWxlZnQscFNpdGVfcmlnaHQscEVkZ2UyLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VSaWdodEJlZ2luKHBFZGdlMixwRWRnZV9yaWdodF9uZXh0LHBTaXRlX3JpZ2h0KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCFyaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgX2N2Q2FsY0VkZ2UocFNpdGVfbGVmdCxwTm9kZV9zaXRlcmlnaHQscEVkZ2UxLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VMZWZ0QmVnaW4ocEVkZ2UxLHBFZGdlX2xlZnRfcHJldixwU2l0ZV9sZWZ0KTsKKyAgICAgICAgfQorCisgICAgICAgIGRpc3QxPWRpc3QyPS0xOworICAgICAgICByYWRpdXMxID0gLTE7IHJhZGl1czIgPSAtMjsKKworICAgICAgICB3aGlsZShwRWRnZV9sZWZ0IT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT5ub2RlMiA9PSBOVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBFZGdlX2xlZnRfY3VyID0gcEVkZ2VfbGVmdCA9IHBFZGdlX2xlZnQtPm5leHRfZWRnZTsKKyAgICAgICAgICAgICAgICBpZihwRWRnZV9sZWZ0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZihsZWZ0KQorICAgICAgICAgICAgICAgIGRpc3QxID0gX2N2Q2FsY0VkZ2VJbnRlcnNlY3Rpb24ocEVkZ2UxLCBwRWRnZV9sZWZ0LCAmUG9pbnQxLHJhZGl1czEpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpc3QxID0gX2N2Q2FsY0VkZ2VJbnRlcnNlY3Rpb24ocEVkZ2UyLCBwRWRnZV9sZWZ0LCAmUG9pbnQxLHJhZGl1czEpOworCisgICAgICAgICAgICBpZihkaXN0MT49MCkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgcEVkZ2VfbGVmdCA9IHBFZGdlX2xlZnQtPm5leHRfZWRnZTsKKyAgICAgICAgfQorICAgIAorICAgICAgICB3aGlsZShwRWRnZV9yaWdodCE9TlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEVkZ2VfcmlnaHQtPm5vZGUxID09IE5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEVkZ2VfcmlnaHRfY3VyID0gcEVkZ2VfcmlnaHQgPSBwRWRnZV9yaWdodC0+cHJldl9lZGdlOworICAgICAgICAgICAgICAgIGlmKHBFZGdlX3JpZ2h0ID09IE5VTEwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIGlmKGxlZnQpCisgICAgICAgICAgICAgICAgZGlzdDIgPSBfY3ZDYWxjRWRnZUludGVyc2VjdGlvbihwRWRnZTEsIHBFZGdlX3JpZ2h0LCAmUG9pbnQyLCByYWRpdXMyKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBkaXN0MiA9IF9jdkNhbGNFZGdlSW50ZXJzZWN0aW9uKHBFZGdlMiwgcEVkZ2VfcmlnaHQsICZQb2ludDIsIHJhZGl1czIpOworCisgICAgICAgICAgICBpZihkaXN0Mj49MCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAKKyAgICAgICAgICAgIHBFZGdlX3JpZ2h0ID0gcEVkZ2VfcmlnaHQtPnByZXZfZWRnZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRpc3QxPDAmJmRpc3QyPDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGxlZnQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdCA9IHBTaXRlX2xlZnQtPmVkZ2UxOworICAgICAgICAgICAgICAgIGlmKHBFZGdlX2xlZnQ9PU5VTEwpCisgICAgICAgICAgICAgICAgICAgIF9jdlN0aWNrRWRnZUxlZnRFbmQocEVkZ2UxLE5VTEwscFNpdGVfbGVmdCk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUocEVkZ2VfbGVmdC0+bm9kZTEhPU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmcEVkZ2VfbGVmdC0+bm9kZTE9PXBFZGdlX2xlZnQtPnByZXZfZWRnZS0+bm9kZTIpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBFZGdlX2xlZnQgPSBwRWRnZV9sZWZ0LT5wcmV2X2VkZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwRWRnZV9sZWZ0PT1OVUxMIHx8IHBFZGdlX2xlZnQtPnByZXZfZWRnZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9jdlN0aWNrRWRnZUxlZnRFbmQocEVkZ2UxLHBFZGdlX2xlZnQscFNpdGVfbGVmdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYocmlnaHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEVkZ2VfcmlnaHQgPSBwU2l0ZV9yaWdodC0+ZWRnZTI7CisgICAgICAgICAgICAgICAgaWYocEVkZ2VfcmlnaHQ9PU5VTEwpCisgICAgICAgICAgICAgICAgICAgIF9jdlN0aWNrRWRnZVJpZ2h0RW5kKHBFZGdlMixOVUxMLHBTaXRlX3JpZ2h0KTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB3aGlsZShwRWRnZV9yaWdodC0+bm9kZTIhPU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICBwRWRnZV9yaWdodC0+bm9kZTI9PXBFZGdlX3JpZ2h0LT5uZXh0X2VkZ2UtPm5vZGUxKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBwRWRnZV9yaWdodCA9IHBFZGdlX3JpZ2h0LT5uZXh0X2VkZ2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZihwRWRnZV9yaWdodD09TlVMTCB8fCBwRWRnZV9yaWdodC0+bmV4dF9lZGdlID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9jdlN0aWNrRWRnZVJpZ2h0RW5kKHBFZGdlMixwRWRnZV9yaWdodCxwU2l0ZV9yaWdodCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZihmYWJzKGRpc3QxIC0gZGlzdDIpPGRpc3RfZXBzKQorICAgICAgICB7ICAgICAgICAgICAKKyAgICAgICAgICAgIHBOb2RlX2JlZ2luID0gX2N2U2VxUHVzaChOb2RlU2VxLCZOb2RlKTsKKyAgICAgICAgICAgIF9jdkluaXRWb3Jvbm9pTm9kZShwTm9kZV9iZWdpbiwgJlBvaW50MixyYWRpdXMyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcEVkZ2UxLT5ub2RlMiA9IHBOb2RlX2JlZ2luOworICAgICAgICAgICAgcEVkZ2UyLT5ub2RlMSA9IHBOb2RlX2JlZ2luOworCisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VMZWZ0RW5kKHBFZGdlMSxwRWRnZV9sZWZ0LHBTaXRlX2xlZnQpOworICAgICAgICAgICAgX2N2VHdpbk5VTExMZWZ0KHBFZGdlX2xlZnRfY3VyLHBFZGdlX2xlZnQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VSaWdodEVuZChwRWRnZTIscEVkZ2VfcmlnaHQscFNpdGVfcmlnaHQpOworICAgICAgICAgICAgX2N2VHdpbk5VTExSaWdodChwRWRnZV9yaWdodF9jdXIscEVkZ2VfcmlnaHQpOworCisgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT50d2luX2VkZ2UhPU5VTEwmJnBFZGdlX3JpZ2h0LT50d2luX2VkZ2UhPU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9wcmV2ID0gcEVkZ2VfbGVmdC0+dHdpbl9lZGdlOworICAgICAgICAgICAgICAgIGlmKCFwRWRnZV9sZWZ0X3ByZXYpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHBFZGdlX2xlZnRfY3VyID0gcEVkZ2VfbGVmdF9wcmV2LT5uZXh0X2VkZ2U7CisgICAgICAgICAgICAgICAgcEVkZ2VfcmlnaHRfbmV4dCA9IHBFZGdlX3JpZ2h0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgaWYoIXBFZGdlX3JpZ2h0X25leHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHBFZGdlX3JpZ2h0X2N1ciA9IHBFZGdlX3JpZ2h0X25leHQtPnByZXZfZWRnZTsKKyAgICAgICAgICAgICAgICBwU2l0ZV9yaWdodCA9IHBFZGdlX3JpZ2h0X25leHQtPnNpdGU7CisgICAgICAgICAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgIHBTaXRlX2xlZnQgPSBwRWRnZV9sZWZ0X3ByZXYtPnNpdGU7CisgICAgICAgICAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT50d2luX2VkZ2U9PU5VTEwmJnBFZGdlX3JpZ2h0LT50d2luX2VkZ2UhPU5VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEVkZ2VfcmlnaHRfbmV4dCA9IHBFZGdlX3JpZ2h0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgaWYoIXBFZGdlX3JpZ2h0X25leHQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHBFZGdlX3JpZ2h0X2N1ciA9IHBFZGdlX3JpZ2h0X25leHQtPnByZXZfZWRnZTsKKyAgICAgICAgICAgICAgICBwU2l0ZV9yaWdodCA9IHBFZGdlX3JpZ2h0X25leHQtPnNpdGU7CisgICAgICAgICAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgIHBFZGdlX2xlZnRfY3VyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKHBFZGdlX2xlZnQtPnR3aW5fZWRnZSE9TlVMTCYmcEVkZ2VfcmlnaHQtPnR3aW5fZWRnZT09TlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRWRnZV9sZWZ0X3ByZXYgPSBwRWRnZV9sZWZ0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgaWYoIXBFZGdlX2xlZnRfcHJldikKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0X3ByZXYtPm5leHRfZWRnZTsKKyAgICAgICAgICAgICAgICBwU2l0ZV9sZWZ0ID0gcEVkZ2VfbGVmdF9wcmV2LT5zaXRlOworICAgICAgICAgICAgICAgIHBFZGdlMSA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2VOVUxMKTsKKyAgICAgICAgICAgICAgICBwRWRnZV9yaWdodF9jdXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJpZ2h0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT50d2luX2VkZ2U9PU5VTEwmJnBFZGdlX3JpZ2h0LT50d2luX2VkZ2U9PU5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBpZigoZGlzdDE8ZGlzdDImJmRpc3QxPj0wKXx8KGRpc3QxPj0wJiZkaXN0MjwwKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBwTm9kZV9iZWdpbiA9IF9jdlNlcVB1c2goTm9kZVNlcSwmTm9kZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaU5vZGUocE5vZGVfYmVnaW4sICZQb2ludDEscmFkaXVzMSk7CisgICAgICAgICAgICBwRWRnZTEtPm5vZGUyID0gcE5vZGVfYmVnaW47CisgICAgICAgICAgICBfY3ZUd2luTlVMTExlZnQocEVkZ2VfbGVmdF9jdXIscEVkZ2VfbGVmdCk7IAorICAgICAgICAgICAgX2N2U3RpY2tFZGdlTGVmdEVuZChwRWRnZTEscEVkZ2VfbGVmdCxwU2l0ZV9sZWZ0KTsKKyAgICAgICAgICAgIGlmKHJpZ2h0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBFZGdlMi0+bm9kZTEgPSBwTm9kZV9iZWdpbjsKKyAgICAgICAgICAgICAgICBwRWRnZV9yaWdodF9uZXh0ID0gcEVkZ2UyOworICAgICAgICAgICAgICAgIHBFZGdlMiA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2VOVUxMKTsKKyAgICAgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT50d2luX2VkZ2UhPU5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRWRnZV9sZWZ0X3ByZXYgPSBwRWRnZV9sZWZ0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIGlmKCFwRWRnZV9sZWZ0X3ByZXYpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0X3ByZXYtPm5leHRfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgcFNpdGVfbGVmdCA9IHBFZGdlX2xlZnRfcHJldi0+c2l0ZTsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZihwRWRnZV9sZWZ0LT50d2luX2VkZ2UhPU5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRWRnZV9sZWZ0X3ByZXYgPSBwRWRnZV9sZWZ0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIGlmKCFwRWRnZV9sZWZ0X3ByZXYpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0X3ByZXYtPm5leHRfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgcFNpdGVfbGVmdCA9IHBFZGdlX2xlZnRfcHJldi0+c2l0ZTsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgfQorCisgICAgICAgIGlmKChkaXN0MT5kaXN0MiYmZGlzdDI+PTApfHwoZGlzdDE8MCYmZGlzdDI+PTApKQorICAgICAgICB7CisgICAgICAgICAgICBwTm9kZV9iZWdpbiA9IF9jdlNlcVB1c2goTm9kZVNlcSwmTm9kZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaU5vZGUocE5vZGVfYmVnaW4sICZQb2ludDIscmFkaXVzMik7CisgICAgICAgICAgICBwRWRnZTItPm5vZGUxID0gcE5vZGVfYmVnaW47CisgICAgICAgICAgICBfY3ZUd2luTlVMTFJpZ2h0KHBFZGdlX3JpZ2h0X2N1cixwRWRnZV9yaWdodCk7CisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VSaWdodEVuZChwRWRnZTIscEVkZ2VfcmlnaHQscFNpdGVfcmlnaHQpOworICAgICAgICAgICAgaWYobGVmdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwRWRnZTEtPm5vZGUyID0gcE5vZGVfYmVnaW47CisgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9wcmV2ID0gcEVkZ2UxOworICAgICAgICAgICAgICAgIHBFZGdlMSA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2VOVUxMKTsKKyAgICAgICAgICAgICAgICBpZihwRWRnZV9yaWdodC0+dHdpbl9lZGdlIT1OVUxMKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2VfcmlnaHRfbmV4dCA9IHBFZGdlX3JpZ2h0LT50d2luX2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIGlmKCFwRWRnZV9yaWdodF9uZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIHBFZGdlX3JpZ2h0X2N1ciA9IHBFZGdlX3JpZ2h0X25leHQtPnByZXZfZWRnZTsKKyAgICAgICAgICAgICAgICAgICAgcFNpdGVfcmlnaHQgPSBwRWRnZV9yaWdodF9uZXh0LT5zaXRlOworICAgICAgICAgICAgICAgICAgICBwRWRnZTIgPSBfY3ZTZXFQdXNoKEVkZ2VTZXEsICZFZGdlTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwRWRnZV9yaWdodF9jdXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICByaWdodCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYocEVkZ2VfcmlnaHQtPnR3aW5fZWRnZSE9TlVMTCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBFZGdlX3JpZ2h0X25leHQgPSBwRWRnZV9yaWdodC0+dHdpbl9lZGdlOworICAgICAgICAgICAgICAgICAgICBpZighcEVkZ2VfcmlnaHRfbmV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBwRWRnZV9yaWdodF9jdXIgPSBwRWRnZV9yaWdodF9uZXh0LT5wcmV2X2VkZ2U7CisgICAgICAgICAgICAgICAgICAgIHBTaXRlX3JpZ2h0ID0gcEVkZ2VfcmlnaHRfbmV4dC0+c2l0ZTsKKyAgICAgICAgICAgICAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCit9Ly8gZW5kIG9mIF9jdkpvaW5DaGFpbnMKKworc3RhdGljIHZvaWQgX2N2RmluZE5lYXJlc3RTaXRlKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBwQ3ZWb3Jvbm9pSG9sZSBwQ3VyckhvbGUsIHBIb2xlID0gcFZvcm9ub2lEaWFncmFtLT50b3BfaG9sZTsKKyAgICBwQ3ZQb2ludEZsb2F0IHBUb3BQb2ludCxwUG9pbnQxLHBQb2ludDI7CisgICAgQ3ZQb2ludEZsb2F0IERpcmVjdGlvbjsKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZTsKKyAgICBDdlZvcm9ub2lOb2RlSW50IE5vZGU7CisgICAgQ3ZTZXEqIEN1cnJTZXE7CisgICAgZmxvYXQgbWluX2Rpc3RhbmNlLGRpc3RhbmNlOworICAgIGludCBpOworICAgIGZvcig7cEhvbGUgIT0gTlVMTDsgcEhvbGUgPSBwSG9sZS0+bmV4dF9ob2xlKQorICAgIHsKKyAgICAgICAgaWYocEhvbGUtPmVycm9yKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHBUb3BQb2ludCA9ICZwSG9sZS0+c2l0ZV90b3AtPm5vZGUxLT5ub2RlOworICAgICAgICBwQ3VyckhvbGUgPSBOVUxMOworICAgICAgICBDdXJyU2VxID0gcFZvcm9ub2lEaWFncmFtLT5TaXRlU2VxOworICAgICAgICBtaW5fZGlzdGFuY2UgPSAoZmxvYXQpM2UrMzQ7CisgICAgICAgIHdoaWxlKHBDdXJySG9sZSAhPSBwSG9sZSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYocEN1cnJIb2xlICYmIHBDdXJySG9sZS0+ZXJyb3IpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBwU2l0ZSA9IChwQ3ZWb3Jvbm9pU2l0ZSljdkdldFNlcUVsZW0oQ3VyclNlcSwwKTsKKyAgICAgICAgICAgIGlmKEN1cnJTZXEtPnRvdGFsID09IDEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBfY3ZDYWxjRGlzdChwVG9wUG9pbnQsIHBTaXRlKTsKKyAgICAgICAgICAgICAgICBpZihkaXN0YW5jZSA8IG1pbl9kaXN0YW5jZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1pbl9kaXN0YW5jZSA9IGRpc3RhbmNlOworICAgICAgICAgICAgICAgICAgICBwSG9sZS0+c2l0ZV9uZWFyZXN0ID0gcFNpdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IEN1cnJTZXEtPnRvdGFsO2krKywgcFNpdGUgPSBwU2l0ZS0+bmV4dF9zaXRlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocFNpdGUtPm5vZGUxICE9IHBTaXRlLT5ub2RlMikKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFBvaW50MSA9ICZwU2l0ZS0+bm9kZTEtPm5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBwUG9pbnQyID0gJnBTaXRlLT5ub2RlMi0+bm9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uLnggPSAtcFNpdGUtPmRpcmVjdGlvbi0+eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIERpcmVjdGlvbi55ID0gcFNpdGUtPmRpcmVjdGlvbi0+eDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBUb3BQb2ludC0+eCAtIHBQb2ludDItPngpKkRpcmVjdGlvbi55IC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFRvcFBvaW50LT55IC0gcFBvaW50Mi0+eSkqRGlyZWN0aW9uLnggPiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVG9wUG9pbnQtPnggLSBwUG9pbnQxLT54KSpEaXJlY3Rpb24ueSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBUb3BQb2ludC0+eSAtIHBQb2ludDEtPnkpKkRpcmVjdGlvbi54IDwgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFRvcFBvaW50LT54IC0gcFBvaW50MS0+eCkqcFNpdGUtPmRpcmVjdGlvbi0+eSAtICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVG9wUG9pbnQtPnkgLSBwUG9pbnQxLT55KSpwU2l0ZS0+ZGlyZWN0aW9uLT54ID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKSAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IF9jdkNhbGNEaXN0KHBUb3BQb2ludCwgcFNpdGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcFBvaW50MSA9ICZwU2l0ZS0+bm9kZTEtPm5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwVG9wUG9pbnQtPnggLSBwUG9pbnQxLT54KSpwU2l0ZS0+ZWRnZTItPmRpcmVjdGlvbi0+eSAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBUb3BQb2ludC0+eSAtIHBQb2ludDEtPnkpKnBTaXRlLT5lZGdlMi0+ZGlyZWN0aW9uLT54ID4gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFRvcFBvaW50LT54IC0gcFBvaW50MS0+eCkqcFNpdGUtPmVkZ2UxLT5kaXJlY3Rpb24tPnkgLSAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFRvcFBvaW50LT55IC0gcFBvaW50MS0+eSkqcFNpdGUtPmVkZ2UxLT5kaXJlY3Rpb24tPnggPCAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICApICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3RhbmNlID0gX2N2Q2FsY0Rpc3QocFRvcFBvaW50LCBwU2l0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBpZihkaXN0YW5jZSA8IG1pbl9kaXN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3RhbmNlID0gZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBwSG9sZS0+c2l0ZV9uZWFyZXN0ID0gcFNpdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKHBDdXJySG9sZSA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHBDdXJySG9sZSA9IHBWb3Jvbm9pRGlhZ3JhbS0+dG9wX2hvbGU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcEN1cnJIb2xlID0gcEN1cnJIb2xlLT5uZXh0X2hvbGU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEN1cnJTZXEgPSBwQ3VyckhvbGUtPlNpdGVTZXE7CisgICAgICAgIH0KKyAgICAgICAgcEhvbGUtPnhfY29vcmQgPSBtaW5fZGlzdGFuY2U7IAorICAgICAgICAKKyAgICAgICAgaWYocEhvbGUtPnNpdGVfbmVhcmVzdC0+bm9kZTEgPT0gcEhvbGUtPnNpdGVfbmVhcmVzdC0+bm9kZTIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERpcmVjdGlvbi54ID0gKHBIb2xlLT5zaXRlX25lYXJlc3QtPm5vZGUxLT5ub2RlLnggLSBwSG9sZS0+c2l0ZV90b3AtPm5vZGUxLT5ub2RlLngpLzI7CisgICAgICAgICAgICBEaXJlY3Rpb24ueSA9IChwSG9sZS0+c2l0ZV9uZWFyZXN0LT5ub2RlMS0+bm9kZS55IC0gcEhvbGUtPnNpdGVfdG9wLT5ub2RlMS0+bm9kZS55KS8yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgCisgICAgICAgICAgICBEaXJlY3Rpb24ueCA9IHBIb2xlLT5zaXRlX25lYXJlc3QtPmRpcmVjdGlvbi0+eSAqIG1pbl9kaXN0YW5jZSAvIDI7CisgICAgICAgICAgICBEaXJlY3Rpb24ueSA9IC0gcEhvbGUtPnNpdGVfbmVhcmVzdC0+ZGlyZWN0aW9uLT54ICogbWluX2Rpc3RhbmNlIC8gMjsKKyAgICAgICAgfQorCisgICAgICAgIE5vZGUubm9kZS54ID0gcEhvbGUtPnNpdGVfdG9wLT5ub2RlMS0+bm9kZS54ICsgRGlyZWN0aW9uLng7CisgICAgICAgIE5vZGUubm9kZS55ID0gcEhvbGUtPnNpdGVfdG9wLT5ub2RlMS0+bm9kZS55ICsgRGlyZWN0aW9uLnk7CisgICAgICAgIHBIb2xlLT5ub2RlID0gX2N2U2VxUHVzaChwVm9yb25vaURpYWdyYW0tPk5vZGVTZXEsICZOb2RlKTsKKyAgICB9Cit9Ly9lbmQgb2YgX2N2RmluZE5lYXJlc3RTaXRlCisKK3N0YXRpYyB2b2lkIF9jdkNvbnN0cnVjdEludFZEKEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBwQ3ZWb3Jvbm9pQ2hhaW4gcENoYWluMSwgcENoYWluMjsKKyAgICBwQ3ZWb3Jvbm9pSG9sZSBwSG9sZTsKKyAgICBpbnQgaTsKKyAgICAKKyAgICBwSG9sZSA9IHBWb3Jvbm9pRGlhZ3JhbS0+dG9wX2hvbGU7CisKKyAgICBmb3IoO3BIb2xlICE9IE5VTEw7IHBIb2xlID0gcEhvbGUtPm5leHRfaG9sZSkKKyAgICB7CisgICAgICAgIGlmKHBIb2xlLT5DaGFpblNlcS0+dG90YWwgPT0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwQ2hhaW4xID0gKHBDdlZvcm9ub2lDaGFpbiljdkdldFNlcUVsZW0ocEhvbGUtPkNoYWluU2VxLDApOworICAgICAgICBmb3IoaSA9IHBIb2xlLT5DaGFpblNlcS0+dG90YWw7IGkgPiAwO2ktLSkKKyAgICAgICAgeworICAgICAgICAgICAgcENoYWluMiA9IHBDaGFpbjEtPm5leHRfY2hhaW47CisgICAgICAgICAgICBpZighX2N2Sm9pbkNoYWlucyhwQ2hhaW4xLHBDaGFpbjIscFZvcm9ub2lEaWFncmFtKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSG9sZS0+ZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwQ2hhaW4xLT5sYXN0X3NpdGUgPSBwQ2hhaW4yLT5sYXN0X3NpdGU7CisgICAgICAgICAgICBwQ2hhaW4xLT5uZXh0X2NoYWluID0gcENoYWluMi0+bmV4dF9jaGFpbjsKKyAgICAgICAgICAgIHBDaGFpbjEgPSBwQ2hhaW4xLT5uZXh0X2NoYWluOworICAgICAgICB9CisgICAgfQorfS8vIGVuZCBvZiBfY3ZDb25zdHJ1Y3RJbnRWRAorCitzdGF0aWMgaW50IF9jdkZpbmRPcHBvc2l0U2l0ZUNXKHBDdlZvcm9ub2lIb2xlIHBIb2xlLCBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfbGVmdCA9IHBIb2xlLT5zaXRlX25lYXJlc3Q7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcmlnaHQgPSBwSG9sZS0+c2l0ZV90b3A7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGUgPSBwSG9sZS0+bm9kZTsKKworICAgIEN2RGlyZWN0aW9uIERpcmVjdGlvbiA9IHstMSwwfTsKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2VfcmlnaHQgPSB7TlVMTCxwU2l0ZV9yaWdodC0+bm9kZTEscFNpdGVfcmlnaHQsTlVMTCxOVUxMLE5VTEwsTlVMTCwmRGlyZWN0aW9ufTsKKworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnQgPSBwU2l0ZV9sZWZ0LT5lZGdlMi0+bmV4dF9lZGdlOworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0ID0gJkVkZ2VfcmlnaHQ7CisKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2UgPSB7TlVMTCxwTm9kZSxwU2l0ZV9yaWdodCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEx9OworICAgIEN2Vm9yb25vaUVkZ2VJbnQgRWRnZV9jdXIgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTH07CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UgPSAmRWRnZTsKKyAgICAKKyAgICBmbG9hdCByYWRpdXMxLCByYWRpdXMyLGRpc3QxLCBkaXN0MjsKKyAgICBDdlBvaW50RmxvYXQgUG9pbnQxID0gezAsMH0sIFBvaW50MiA9IHswLDB9OworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgcEVkZ2UtPmRpcmVjdGlvbiA9IE5VTEw7CisgICAgICAgIHBFZGdlLT5wYXJhYm9sYSA9IE5VTEw7CisgICAgICAgIF9jdkNhbGNFZGdlKHBTaXRlX2xlZnQscFNpdGVfcmlnaHQscEVkZ2UscFZvcm9ub2lEaWFncmFtKTsKKworICAgICAgICBkaXN0MT1kaXN0Mj0tMTsKKyAgICAgICAgcmFkaXVzMSA9IC0xOyByYWRpdXMyID0gLTI7CisgICAgICAgIHdoaWxlKHBFZGdlX2xlZnQhPU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3QxID0gX2N2Q2FsY0VkZ2VJbnRlcnNlY3Rpb24ocEVkZ2UsIHBFZGdlX2xlZnQsICZQb2ludDEscmFkaXVzMSk7CisgICAgICAgICAgICBpZihkaXN0MT49MCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHBFZGdlX2xlZnQgPSBwRWRnZV9sZWZ0LT5uZXh0X2VkZ2U7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgZGlzdDIgPSBfY3ZDYWxjRWRnZUludGVyc2VjdGlvbihwRWRnZSwgcEVkZ2VfcmlnaHQsICZQb2ludDIsIHJhZGl1czIpOworICAgICAgICBpZihkaXN0Mj49MCAmJiBkaXN0MSA+PSBkaXN0MikKKyAgICAgICAgeworICAgICAgICAgICAgcEhvbGUtPnNpdGVfb3Bwb3NpdGUgPSBwU2l0ZV9sZWZ0OworICAgICAgICAgICAgcE5vZGUtPm5vZGUgPSBQb2ludDI7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKGRpc3QxPDApCisgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBFZGdlX2N1ciA9ICpwRWRnZV9sZWZ0LT50d2luX2VkZ2U7CisgICAgICAgIEVkZ2VfY3VyLm5vZGUxID0gcE5vZGU7CisgICAgICAgIHBFZGdlX2xlZnQgPSAmRWRnZV9jdXI7CisKKyAgICAgICAgcFNpdGVfbGVmdCA9IHBFZGdlX2xlZnQtPnNpdGU7CisgICAgICAgIHBOb2RlLT5ub2RlID0gUG9pbnQxOworICAgIH0KK30vL2VuZCBvZiBfY3ZGaW5kT3Bwb3NpdFNpdGVDVworCitzdGF0aWMgaW50IF9jdkZpbmRPcHBvc2l0U2l0ZUNDVyhwQ3ZWb3Jvbm9pSG9sZSBwSG9sZSxDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcmlnaHQgPSBwSG9sZS0+c2l0ZV9uZWFyZXN0OworICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQgPSBwSG9sZS0+c2l0ZV90b3A7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGUgPSBwSG9sZS0+bm9kZTsKKworICAgIEN2RGlyZWN0aW9uIERpcmVjdGlvbiA9IHstMSwwfTsKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2VfbGVmdCA9IHtwU2l0ZV9sZWZ0LT5ub2RlMSxOVUxMLHBTaXRlX2xlZnQsTlVMTCxOVUxMLE5VTEwsIE5VTEwsICZEaXJlY3Rpb259OworICAgIAorICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnQgPSAmRWRnZV9sZWZ0OworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0ID0gcFNpdGVfcmlnaHQtPmVkZ2UxLT5wcmV2X2VkZ2U7CisKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2UgPSB7TlVMTCxwTm9kZSxwU2l0ZV9sZWZ0LE5VTEwsTlVMTCxOVUxMLE5VTEx9OworICAgIEN2Vm9yb25vaUVkZ2VJbnQgRWRnZV9jdXIgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTH07CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UgPSAmRWRnZTsKKyAgICAKKyAgICBkb3VibGUgZGlzdDEsIGRpc3QyOworICAgIGZsb2F0IHJhZGl1czEsIHJhZGl1czI7CisgICAgQ3ZQb2ludEZsb2F0IFBvaW50MSA9IHswLDB9LCBQb2ludDIgPSB7MCwwfTsKKworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIHBFZGdlLT5kaXJlY3Rpb24gPSBOVUxMOworICAgICAgICBwRWRnZS0+cGFyYWJvbGEgPSBOVUxMOworICAgICAgICBfY3ZDYWxjRWRnZShwU2l0ZV9sZWZ0LHBTaXRlX3JpZ2h0LHBFZGdlLHBWb3Jvbm9pRGlhZ3JhbSk7CisgICAgCisgICAgICAgIGRpc3QxPWRpc3QyPS0xOworICAgICAgICByYWRpdXMxID0gLTE7IHJhZGl1czIgPSAtMjsKKyAgICAgICAgd2hpbGUocEVkZ2VfcmlnaHQhPU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGRpc3QxID0gX2N2Q2FsY0VkZ2VJbnRlcnNlY3Rpb24ocEVkZ2UsIHBFZGdlX3JpZ2h0LCAmUG9pbnQxLHJhZGl1czIpOworICAgICAgICAgICAgaWYoZGlzdDE+PTApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBwRWRnZV9yaWdodCA9IHBFZGdlX3JpZ2h0LT5wcmV2X2VkZ2U7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgZGlzdDIgPSBfY3ZDYWxjRWRnZUludGVyc2VjdGlvbihwRWRnZSwgcEVkZ2VfbGVmdCwgJlBvaW50MiwgcmFkaXVzMSk7CisgICAgICAgIGlmKGRpc3QyPj0wICYmIGRpc3QxID4gZGlzdDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBIb2xlLT5zaXRlX29wcG9zaXRlID0gcFNpdGVfcmlnaHQ7CisgICAgICAgICAgICBwTm9kZS0+bm9kZSA9IFBvaW50MjsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgaWYoZGlzdDE8MCkKKyAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIEVkZ2VfY3VyID0gKnBFZGdlX3JpZ2h0LT50d2luX2VkZ2U7CisgICAgICAgIEVkZ2VfY3VyLm5vZGUyID0gcE5vZGU7CisgICAgICAgIHBFZGdlX3JpZ2h0ID0gJkVkZ2VfY3VyOworCisgICAgICAgIHBTaXRlX3JpZ2h0ID0gcEVkZ2VfcmlnaHQtPnNpdGU7CisgICAgICAgIHBOb2RlLT5ub2RlID0gUG9pbnQxOworICAgIH0KK30vL2VuZCBvZiBfY3ZGaW5kT3Bwb3NpdFNpdGVDQ1cKKworc3RhdGljIGludCBfY3ZNZXJnZVZEKHBDdlZvcm9ub2lIb2xlIHBIb2xlLEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZV9sZWZ0X2ZpcnN0ID0gcEhvbGUtPnNpdGVfdG9wOworICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX3JpZ2h0X2ZpcnN0ID0gcEhvbGUtPnNpdGVfb3Bwb3NpdGU7CisgICAgcEN2Vm9yb25vaU5vZGUgcE5vZGVfYmVnaW4gPSBwSG9sZS0+bm9kZTsKKyAgICBpZihwU2l0ZV9sZWZ0X2ZpcnN0ID09IE5VTEwgfHwgcFNpdGVfcmlnaHRfZmlyc3QgPT0gTlVMTCB8fCBwTm9kZV9iZWdpbiA9PSBOVUxMKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQgPSBwU2l0ZV9sZWZ0X2ZpcnN0OworICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX3JpZ2h0ID0gcFNpdGVfcmlnaHRfZmlyc3Q7CisKKyAgICBjb25zdCBkb3VibGUgZGlzdF9lcHMgPSAwLjA1OworICAgIEN2Vm9yb25vaUVkZ2VJbnQgRWRnZU5VTEwgPSB7TlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMLE5VTEwsTlVMTCxOVUxMfTsKKworICAgIEN2U2VxKiBOb2RlU2VxID0gcFZvcm9ub2lEaWFncmFtLT5Ob2RlU2VxOworICAgIEN2U2VxKiBFZGdlU2VxID0gcFZvcm9ub2lEaWFncmFtLT5FZGdlU2VxOworICAgICAgICAKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0ID0gTlVMTDsKKyAgICBpZihwU2l0ZV9sZWZ0LT5lZGdlMiAhPSBOVUxMKQorICAgICAgICBwRWRnZV9sZWZ0ID0gcFNpdGVfbGVmdC0+ZWRnZTItPm5leHRfZWRnZTsKKworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX3JpZ2h0ID0gcFNpdGVfcmlnaHQtPmVkZ2UxOworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnRfY3VyID0gcEVkZ2VfbGVmdDsKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9yaWdodF9jdXIgPSBwRWRnZV9yaWdodDsKKworICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnRfcHJldiA9IE5VTEw7CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHRfbmV4dCA9IE5VTEw7CisKKyAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEscEVkZ2UyLHBFZGdlMV9maXJzdCwgcEVkZ2UyX2ZpcnN0OworICAgIEN2UG9pbnRGbG9hdCBQb2ludDEgPSB7MCwwfSwgUG9pbnQyID0gezAsMH07CisgICAgCisgICAgZmxvYXQgcmFkaXVzMSxyYWRpdXMyLGRpc3QxLGRpc3QyOworICAgIAorICAgIEN2Vm9yb25vaU5vZGVJbnQgTm9kZTsKKworICAgIHBFZGdlMV9maXJzdCA9IHBFZGdlMSA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2VOVUxMKTs7CisgICAgcEVkZ2UyX2ZpcnN0ID0gcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOzsKKyAgICBwRWRnZTEtPnNpdGUgPSBwU2l0ZV9sZWZ0X2ZpcnN0OworICAgIHBFZGdlMi0+c2l0ZSA9IHBTaXRlX3JpZ2h0X2ZpcnN0OworCisgICAgZG8KKyAgICB7CisgICAgICAgIHBFZGdlMS0+bm9kZTEgPSBwRWRnZTItPm5vZGUyID0gcE5vZGVfYmVnaW47CisgICAgICAgIAorICAgICAgICBwRWRnZV9sZWZ0ID0gcEVkZ2VfbGVmdF9jdXI7CisgICAgICAgIHBFZGdlX3JpZ2h0ID0gcEVkZ2VfcmlnaHRfY3VyLT5wcmV2X2VkZ2U7CisKKyAgICAgICAgX2N2Q2FsY0VkZ2UocFNpdGVfbGVmdCxwU2l0ZV9yaWdodCxwRWRnZTEscFZvcm9ub2lEaWFncmFtKTsKKyAgICAgICAgX2N2TWFrZVR3aW5FZGdlKHBFZGdlMixwRWRnZTEpOworICAgICAgICAKKyAgICAgICAgaWYocEVkZ2VfbGVmdF9wcmV2ICE9IE5VTEwpCisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VMZWZ0QmVnaW4ocEVkZ2UxLHBFZGdlX2xlZnRfcHJldixwU2l0ZV9sZWZ0KTsKKyAgICAgICAgaWYocEVkZ2VfcmlnaHRfbmV4dCAhPSBOVUxMKQorICAgICAgICAgICAgX2N2U3RpY2tFZGdlUmlnaHRCZWdpbihwRWRnZTIscEVkZ2VfcmlnaHRfbmV4dCxwU2l0ZV9yaWdodCk7CisgICAgICAgICAgICAKKyAgICAgICAgZGlzdDE9ZGlzdDI9LTE7CisgICAgICAgIHJhZGl1czEgPSAtMTsgcmFkaXVzMiA9IC0yOworCisvL0xFRlQ6CisgICAgICAgIHdoaWxlKHBFZGdlX2xlZnQhPU5VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBFZGdlX2xlZnQtPm5vZGUyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0ID0gcEVkZ2VfbGVmdC0+bmV4dF9lZGdlOworCisgICAgICAgICAgICBkaXN0MSA9IF9jdkNhbGNFZGdlSW50ZXJzZWN0aW9uKHBFZGdlMSwgcEVkZ2VfbGVmdCwgJlBvaW50MSxyYWRpdXMxKTsKKyAgICAgICAgICAgIGlmKGRpc3QxPj0wKQorICAgICAgICAgICAgICAgIGdvdG8gUklHSFQ7CisgICAgICAgICAgICBwRWRnZV9sZWZ0ID0gcEVkZ2VfbGVmdC0+bmV4dF9lZGdlOworICAgICAgICB9CisKK1JJR0hUOiAgCisgICAgICAgIHdoaWxlKHBFZGdlX3JpZ2h0IT1OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBkaXN0MiA9IF9jdkNhbGNFZGdlSW50ZXJzZWN0aW9uKHBFZGdlMSwgcEVkZ2VfcmlnaHQsICZQb2ludDIscmFkaXVzMik7CisgICAgICAgICAgICBpZihkaXN0Mj49MCkKKyAgICAgICAgICAgICAgICBnb3RvIFJFU1VMVEhBTkRMSU5HOworICAgICAgICAKKyAgICAgICAgICAgIHBFZGdlX3JpZ2h0ID0gcEVkZ2VfcmlnaHQtPnByZXZfZWRnZTsKKyAgICAgICAgfQorICAgICAgICBwRWRnZV9yaWdodCA9IHBFZGdlX3JpZ2h0X2N1cjsKKyAgICAgICAgZGlzdDIgPSBfY3ZDYWxjRWRnZUludGVyc2VjdGlvbihwRWRnZTEsIHBFZGdlX3JpZ2h0LCAmUG9pbnQyLCByYWRpdXMyKTsKKworUkVTVUxUSEFORExJTkc6CisgICAgICAgIGlmKGRpc3QxPDAmJmRpc3QyPDApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICAgICAgaWYoZmFicyhkaXN0MSAtIGRpc3QyKTxkaXN0X2VwcykKKyAgICAgICAgeworICAgICAgICAgICAgcE5vZGVfYmVnaW4gPSBfY3ZTZXFQdXNoKE5vZGVTZXEsJk5vZGUpOworICAgICAgICAgICAgX2N2SW5pdFZvcm9ub2lOb2RlKHBOb2RlX2JlZ2luLCAmUG9pbnQyLHJhZGl1czIpOworICAgICAgICAKKyAgICAgICAgICAgIHBFZGdlMS0+bm9kZTIgPSBwTm9kZV9iZWdpbjsKKyAgICAgICAgICAgIHBFZGdlMi0+bm9kZTEgPSBwTm9kZV9iZWdpbjsKKworICAgICAgICAgICAgcEVkZ2VfcmlnaHRfY3VyID0gX2N2RGl2aWRlUmlnaHRFZGdlKHBFZGdlX3JpZ2h0LHBOb2RlX2JlZ2luLEVkZ2VTZXEpOworCisgICAgICAgICAgICBfY3ZTdGlja0VkZ2VMZWZ0RW5kKHBFZGdlMSxwRWRnZV9sZWZ0LHBTaXRlX2xlZnQpOworICAgICAgICAgICAgX2N2U3RpY2tFZGdlUmlnaHRFbmQocEVkZ2UyLHBFZGdlX3JpZ2h0LHBTaXRlX3JpZ2h0KTsKKyAgICAgICAgCisgICAgICAgICAgICBwRWRnZV9sZWZ0X3ByZXYgPSBwRWRnZV9sZWZ0LT50d2luX2VkZ2U7CisgICAgICAgICAgICBpZighcEVkZ2VfbGVmdF9wcmV2KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0X3ByZXYtPm5leHRfZWRnZTsKKyAgICAgICAgICAgIHBTaXRlX2xlZnQgPSBwRWRnZV9sZWZ0X3ByZXYtPnNpdGU7CisgICAgICAgICAgICBwRWRnZTEgPSBfY3ZTZXFQdXNoKEVkZ2VTZXEsICZFZGdlTlVMTCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBwRWRnZV9yaWdodF9uZXh0ID0gcEVkZ2VfcmlnaHQtPnR3aW5fZWRnZTsKKyAgICAgICAgICAgIGlmKCFwRWRnZV9yaWdodF9uZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcFNpdGVfcmlnaHQgPSBwRWRnZV9yaWdodF9uZXh0LT5zaXRlOworICAgICAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChkaXN0MTxkaXN0MiYmZGlzdDE+PTApfHwoZGlzdDE+PTAmJmRpc3QyPDApKQorICAgICAgICB7CisgICAgICAgICAgICBwTm9kZV9iZWdpbiA9IF9jdlNlcVB1c2goTm9kZVNlcSwmTm9kZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaU5vZGUocE5vZGVfYmVnaW4sICZQb2ludDEscmFkaXVzMSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHBFZGdlMS0+bm9kZTIgPSBwTm9kZV9iZWdpbjsKKyAgICAgICAgICAgIF9jdlN0aWNrRWRnZUxlZnRFbmQocEVkZ2UxLHBFZGdlX2xlZnQscFNpdGVfbGVmdCk7CisgICAgICAgIAorICAgICAgICAgICAgcEVkZ2UyLT5ub2RlMSA9IHBOb2RlX2JlZ2luOworICAgICAgICAgICAgcEVkZ2VfcmlnaHRfbmV4dCA9IHBFZGdlMjsKKyAgICAgICAgICAgIHBFZGdlMiA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2VOVUxMKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcEVkZ2VfbGVmdF9wcmV2ID0gcEVkZ2VfbGVmdC0+dHdpbl9lZGdlOworICAgICAgICAgICAgaWYoIXBFZGdlX2xlZnRfcHJldikKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIHBFZGdlX2xlZnRfY3VyID0gcEVkZ2VfbGVmdF9wcmV2LT5uZXh0X2VkZ2U7CisgICAgICAgICAgICBwU2l0ZV9sZWZ0ID0gcEVkZ2VfbGVmdF9wcmV2LT5zaXRlOworICAgICAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChkaXN0MT5kaXN0MiYmZGlzdDI+PTApfHwoZGlzdDE8MCYmZGlzdDI+PTApKQorICAgICAgICB7CisgICAgICAgICAgICBwTm9kZV9iZWdpbiA9IF9jdlNlcVB1c2goTm9kZVNlcSwmTm9kZSk7CisgICAgICAgICAgICBfY3ZJbml0Vm9yb25vaU5vZGUocE5vZGVfYmVnaW4sICZQb2ludDIscmFkaXVzMik7CisgICAgCisgICAgICAgICAgICBwRWRnZV9yaWdodF9jdXIgPSBfY3ZEaXZpZGVSaWdodEVkZ2UocEVkZ2VfcmlnaHQscE5vZGVfYmVnaW4sRWRnZVNlcSk7CisKKyAgICAgICAgICAgIHBFZGdlMi0+bm9kZTEgPSBwTm9kZV9iZWdpbjsKKyAgICAgICAgICAgIF9jdlN0aWNrRWRnZVJpZ2h0RW5kKHBFZGdlMixwRWRnZV9yaWdodCxwU2l0ZV9yaWdodCk7CisgICAgICAgIAorICAgICAgICAgICAgcEVkZ2UxLT5ub2RlMiA9IHBOb2RlX2JlZ2luOworICAgICAgICAgICAgcEVkZ2VfbGVmdF9wcmV2ID0gcEVkZ2UxOworICAgICAgICAgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworICAgICAgICAgICAgCisgICAgICAgICAgICBwRWRnZV9yaWdodF9uZXh0ID0gcEVkZ2VfcmlnaHQtPnR3aW5fZWRnZTsKKyAgICAgICAgICAgIGlmKCFwRWRnZV9yaWdodF9uZXh0KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgcFNpdGVfcmlnaHQgPSBwRWRnZV9yaWdodF9uZXh0LT5zaXRlOworICAgICAgICAgICAgcEVkZ2UyID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZU5VTEwpOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgfXdoaWxlKCEocFNpdGVfbGVmdCA9PSBwU2l0ZV9sZWZ0X2ZpcnN0ICYmIHBTaXRlX3JpZ2h0ID09IHBTaXRlX3JpZ2h0X2ZpcnN0KSk7CisKKyAgICAgICAgcEVkZ2UxX2ZpcnN0LT5ub2RlMSA9IHBOb2RlX2JlZ2luOworICAgICAgICBwRWRnZTJfZmlyc3QtPm5vZGUyID0gcE5vZGVfYmVnaW47IAorICAgICAgICBfY3ZTdGlja0VkZ2VMZWZ0QmVnaW4ocEVkZ2UxX2ZpcnN0LHBFZGdlX2xlZnRfcHJldixwU2l0ZV9sZWZ0X2ZpcnN0KTsKKyAgICAgICAgX2N2U3RpY2tFZGdlUmlnaHRCZWdpbihwRWRnZTJfZmlyc3QscEVkZ2VfcmlnaHRfbmV4dCxwU2l0ZV9yaWdodF9maXJzdCk7CisKKyAgICAgICAgaWYocFNpdGVfbGVmdF9maXJzdC0+ZWRnZTIgPT0gTlVMTCkKKyAgICAgICAgICAgIHBTaXRlX2xlZnRfZmlyc3QtPmVkZ2UyID0gcFNpdGVfbGVmdF9maXJzdC0+ZWRnZTEgPSBwRWRnZTFfZmlyc3Q7CisgICAgICAgIHJldHVybiAxOworfS8vIGVuZCBvZiBfY3ZNZXJnZVZECisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wdXRhdGlvbiBvZiBiaXNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCit2b2lkIF9jdkNhbGNFZGdlKHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQsIAorICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZV9yaWdodCwKKyAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UsCisgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBpZigocFNpdGVfbGVmdC0+bm9kZTEhPXBTaXRlX2xlZnQtPm5vZGUyKSYmCisgICAgICAgIChwU2l0ZV9yaWdodC0+bm9kZTEhPXBTaXRlX3JpZ2h0LT5ub2RlMikpCisgICAgICAgIF9jdkNhbGNFZGdlTEwocFNpdGVfbGVmdC0+ZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgcFNpdGVfcmlnaHQtPmRpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIHBFZGdlLHBWb3Jvbm9pRGlhZ3JhbSk7CisKKyAgICBlbHNlIGlmKChwU2l0ZV9sZWZ0LT5ub2RlMSE9cFNpdGVfbGVmdC0+bm9kZTIpJiYKKyAgICAgICAgICAgIChwU2l0ZV9yaWdodC0+bm9kZTEgPT0gcFNpdGVfcmlnaHQtPm5vZGUyKSkKKyAgICAgICAgX2N2Q2FsY0VkZ2VMUChwU2l0ZV9sZWZ0LHBTaXRlX3JpZ2h0LT5ub2RlMSxwRWRnZSxwVm9yb25vaURpYWdyYW0pOworCisgICAgZWxzZSBpZigocFNpdGVfbGVmdC0+bm9kZTE9PXBTaXRlX2xlZnQtPm5vZGUyKSYmCisgICAgICAgICAgICAocFNpdGVfcmlnaHQtPm5vZGUxIT1wU2l0ZV9yaWdodC0+bm9kZTIpKQorICAgICAgICBfY3ZDYWxjRWRnZVBMKHBTaXRlX2xlZnQtPm5vZGUxLHBTaXRlX3JpZ2h0LHBFZGdlLHBWb3Jvbm9pRGlhZ3JhbSk7CisKKyAgICBlbHNlCisgICAgICAgIF9jdkNhbGNFZGdlUFAoJihwU2l0ZV9sZWZ0LT5ub2RlMS0+bm9kZSksCisgICAgICAgICAgICAgICAgICAgICAmKHBTaXRlX3JpZ2h0LT5ub2RlMS0+bm9kZSksCisgICAgICAgICAgICAgICAgICAgICBwRWRnZSxwVm9yb25vaURpYWdyYW0pOworfS8vZW5kIG9mIF9jdkNhbGNFZGdlCisKK3ZvaWQgX2N2Q2FsY0VkZ2UocEN2Vm9yb25vaVNpdGUgcFNpdGUsCisgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lOb2RlIHBOb2RlLAorICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgQ3ZWb3Jvbm9pRGlhZ3JhbUludCogcFZvcm9ub2lEaWFncmFtKQoreworICAgIGlmKHBTaXRlLT5ub2RlMSE9cFNpdGUtPm5vZGUyKQorICAgICAgICBfY3ZDYWxjRWRnZUxQKHBTaXRlLCBwTm9kZSwgcEVkZ2UscFZvcm9ub2lEaWFncmFtKTsKKyAgICBlbHNlCisgICAgICAgIF9jdkNhbGNFZGdlUFAoJihwU2l0ZS0+bm9kZTEtPm5vZGUpLAorICAgICAgICAgICAgICAgICAgICAgJnBOb2RlLT5ub2RlLAorICAgICAgICAgICAgICAgICAgICAgcEVkZ2UscFZvcm9ub2lEaWFncmFtKTsKK30vL2VuZCBvZiBfY3ZDYWxjRWRnZQorCit2b2lkIF9jdkNhbGNFZGdlKHBDdlZvcm9ub2lOb2RlIHBOb2RlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0pCit7CisgICAgaWYocFNpdGUtPm5vZGUxIT1wU2l0ZS0+bm9kZTIpCisgICAgICAgIF9jdkNhbGNFZGdlUEwocE5vZGUscFNpdGUscEVkZ2UscFZvcm9ub2lEaWFncmFtKTsKKyAgICBlbHNlCisgICAgICAgIF9jdkNhbGNFZGdlUFAoJnBOb2RlLT5ub2RlLCZwU2l0ZS0+bm9kZTEtPm5vZGUscEVkZ2UscFZvcm9ub2lEaWFncmFtKTsKK30vL2VuZCBvZiBfY3ZDYWxjRWRnZQorCitDVl9JTkxJTkUKK3ZvaWQgX2N2Q2FsY0VkZ2VMTChwQ3ZEaXJlY3Rpb24gcERpcmVjdGlvbjEsCisgICAgICAgICAgICAgICAgICBwQ3ZEaXJlY3Rpb24gcERpcmVjdGlvbjIsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBDdkRpcmVjdGlvbiBEaXJlY3Rpb24gPSB7cERpcmVjdGlvbjItPnggLSBwRGlyZWN0aW9uMS0+eCwgcERpcmVjdGlvbjItPnkgLSBwRGlyZWN0aW9uMS0+eX07CisgICAgaWYoKGZhYnMoRGlyZWN0aW9uLngpPExFRV9DT05TVF9aRVJPKSYmKGZhYnMoRGlyZWN0aW9uLnkpPExFRV9DT05TVF9aRVJPKSkKKyAgICAgICAgICAgIERpcmVjdGlvbiA9ICpwRGlyZWN0aW9uMjsKKyAgICBwRWRnZS0+ZGlyZWN0aW9uID0gX2N2U2VxUHVzaChwVm9yb25vaURpYWdyYW0tPkRpcmVjdGlvblNlcSwmRGlyZWN0aW9uKTs7Cit9Ly9lbmQgb2YgX2N2Q2FsY0VkZ2VMTAorCitDVl9JTkxJTkUKK3ZvaWQgX2N2Q2FsY0VkZ2VQUChwQ3ZQb2ludEZsb2F0IHBQb2ludDEsCisgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0IHBQb2ludDIsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBDdkRpcmVjdGlvbiBEaXJlY3Rpb24gPSB7cFBvaW50MS0+eSAtIHBQb2ludDItPnkscFBvaW50Mi0+eCAtIHBQb2ludDEtPnh9OworICAgIHBFZGdlLT5kaXJlY3Rpb24gPSBfY3ZTZXFQdXNoKHBWb3Jvbm9pRGlhZ3JhbS0+RGlyZWN0aW9uU2VxLCZEaXJlY3Rpb24pOworfS8vZW5kIG9mIF9jdkNhbGNFZGdlUFAKKworQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNFZGdlUEwocEN2Vm9yb25vaU5vZGUgcEZvY3VzLAorICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcERpcmVjdHJpY2UsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBwQ3ZQb2ludEZsb2F0IHBQb2ludDAgPSAmcEZvY3VzLT5ub2RlOworICAgIHBDdlBvaW50RmxvYXQgcFBvaW50MSA9ICZwRGlyZWN0cmljZS0+bm9kZTEtPm5vZGU7IAorCisgICAgQ3ZEaXJlY3Rpb24gVmVjdG9yMDEgPSB7cFBvaW50MC0+eCAtIHBQb2ludDEtPngscFBvaW50MC0+eSAtIHBQb2ludDEtPnl9OworICAgIGZsb2F0IGhhbGZfaCA9IChWZWN0b3IwMS55KnBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnggLSBWZWN0b3IwMS54KnBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnkpLzI7CisgICAgQ3ZEaXJlY3Rpb24gTm9ybWFsID0gey1wRGlyZWN0cmljZS0+ZGlyZWN0aW9uLT55LHBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnh9OworICAgIGlmKGhhbGZfaCA8IExFRV9DT05TVF9aRVJPKQorICAgIHsKKyAgICAgICAgcEVkZ2UtPmRpcmVjdGlvbiA9IF9jdlNlcVB1c2gocFZvcm9ub2lEaWFncmFtLT5EaXJlY3Rpb25TZXEsJk5vcm1hbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ3ZWb3Jvbm9pUGFyYWJvbGFJbnQgUGFyYWJvbGE7CisgICAgcEN2Vm9yb25vaVBhcmFib2xhICBwUGFyYWJvbGEgPSBfY3ZTZXFQdXNoKHBWb3Jvbm9pRGlhZ3JhbS0+UGFyYWJvbGFTZXEsJlBhcmFib2xhKTsKKyAgICBmbG9hdCogbWFwID0gcFBhcmFib2xhLT5tYXA7IAorICAgICAgICAKKyAgICBtYXBbMV0gPSBOb3JtYWwueDsKKyAgICBtYXBbNF0gPSBOb3JtYWwueTsKKyAgICBtYXBbMF0gPSBOb3JtYWwueTsKKyAgICBtYXBbM10gPSAtTm9ybWFsLng7CisgICAgbWFwWzJdID0gcFBvaW50MC0+eCAtIE5vcm1hbC54KmhhbGZfaDsKKyAgICBtYXBbNV0gPSBwUG9pbnQwLT55IC0gTm9ybWFsLnkqaGFsZl9oOworCisgICAgcFBhcmFib2xhLT5hID0gMS8oNCpoYWxmX2gpOworICAgIHBQYXJhYm9sYS0+Zm9jdXMgPSBwRm9jdXM7CisgICAgcFBhcmFib2xhLT5kaXJlY3RyaWNlID0gcERpcmVjdHJpY2U7CisgICAgcEVkZ2UtPnBhcmFib2xhID0gcFBhcmFib2xhOworfS8vZW5kIG9mIF9jdkNhbGNFZGdlUEwKKworQ1ZfSU5MSU5FCit2b2lkIF9jdkNhbGNFZGdlTFAocEN2Vm9yb25vaVNpdGUgcERpcmVjdHJpY2UsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pTm9kZSBwRm9jdXMsCisgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSwKKyAgICAgICAgICAgICAgICAgIEN2Vm9yb25vaURpYWdyYW1JbnQqIHBWb3Jvbm9pRGlhZ3JhbSkKK3sKKyAgICBwQ3ZQb2ludEZsb2F0IHBQb2ludDAgPSAmcEZvY3VzLT5ub2RlOworICAgIHBDdlBvaW50RmxvYXQgcFBvaW50MSA9ICZwRGlyZWN0cmljZS0+bm9kZTEtPm5vZGU7IAorCisgICAgQ3ZEaXJlY3Rpb24gVmVjdG9yMDEgPSB7cFBvaW50MC0+eCAtIHBQb2ludDEtPngscFBvaW50MC0+eSAtIHBQb2ludDEtPnl9OworICAgIGZsb2F0IGhhbGZfaCA9IChWZWN0b3IwMS55KnBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnggLSBWZWN0b3IwMS54KnBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnkpLzI7CisgICAgQ3ZEaXJlY3Rpb24gTm9ybWFsID0gey1wRGlyZWN0cmljZS0+ZGlyZWN0aW9uLT55LHBEaXJlY3RyaWNlLT5kaXJlY3Rpb24tPnh9OworICAgIGlmKGhhbGZfaCA8IExFRV9DT05TVF9aRVJPKQorICAgIHsKKyAgICAgICAgcEVkZ2UtPmRpcmVjdGlvbiA9IF9jdlNlcVB1c2gocFZvcm9ub2lEaWFncmFtLT5EaXJlY3Rpb25TZXEsJk5vcm1hbCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQ3ZWb3Jvbm9pUGFyYWJvbGFJbnQgUGFyYWJvbGE7CisgICAgcEN2Vm9yb25vaVBhcmFib2xhICBwUGFyYWJvbGEgPSBfY3ZTZXFQdXNoKHBWb3Jvbm9pRGlhZ3JhbS0+UGFyYWJvbGFTZXEsJlBhcmFib2xhKTsKKyAgICBmbG9hdCogbWFwID0gcFBhcmFib2xhLT5tYXA7IAorCisgICAgbWFwWzFdID0gTm9ybWFsLng7CisgICAgbWFwWzRdID0gTm9ybWFsLnk7CisgICAgbWFwWzBdID0gLU5vcm1hbC55OworICAgIG1hcFszXSA9IE5vcm1hbC54OworICAgIG1hcFsyXSA9IHBQb2ludDAtPnggLSBOb3JtYWwueCpoYWxmX2g7CisgICAgbWFwWzVdID0gcFBvaW50MC0+eSAtIE5vcm1hbC55KmhhbGZfaDsKKyAgICAKKyAgICBwUGFyYWJvbGEtPmEgPSAxLyg0KmhhbGZfaCk7CisgICAgcFBhcmFib2xhLT5mb2N1cyA9IHBGb2N1czsKKyAgICBwUGFyYWJvbGEtPmRpcmVjdHJpY2UgPSBwRGlyZWN0cmljZTsKKyAgICBwRWRnZS0+cGFyYWJvbGEgPSBwUGFyYWJvbGE7Cit9Ly9lbmQgb2YgX2N2Q2FsY0VkZ2VMUAorCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgQ29tcHV0YXRpb24gb2YgaW50ZXJzZWN0aW9ucyBvZiBiaXNlY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICovCisKK3N0YXRpYyAKK2Zsb2F0IF9jdkNhbGNFZGdlSW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnRGbG9hdCogcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cykKK3sKKyAgICBpZigocEVkZ2UxLT5wYXJhYm9sYT09TlVMTCkmJihwRWRnZTItPnBhcmFib2xhPT1OVUxMKSkKKyAgICAgICAgcmV0dXJuIF9jdkxpbmVfTGluZUludGVyc2VjdGlvbihwRWRnZTEscEVkZ2UyLHBQb2ludCxSYWRpdXMpOworICAgIGlmKChwRWRnZTEtPnBhcmFib2xhPT1OVUxMKSYmKHBFZGdlMi0+cGFyYWJvbGEhPU5VTEwpKSAKKyAgICAgICAgcmV0dXJuIF9jdkxpbmVfUGFySW50ZXJzZWN0aW9uKHBFZGdlMSxwRWRnZTIscFBvaW50LFJhZGl1cyk7CisgICAgaWYoKHBFZGdlMS0+cGFyYWJvbGEhPU5VTEwpJiYocEVkZ2UyLT5wYXJhYm9sYT09TlVMTCkpCisgICAgICAgIHJldHVybiBfY3ZQYXJfTGluZUludGVyc2VjdGlvbihwRWRnZTEscEVkZ2UyLHBQb2ludCxSYWRpdXMpOworICAgIGlmKChwRWRnZTEtPnBhcmFib2xhIT1OVUxMKSYmKHBFZGdlMi0+cGFyYWJvbGEhPU5VTEwpKQorICAgICAgICByZXR1cm4gX2N2UGFyX1BhckludGVyc2VjdGlvbihwRWRnZTEscEVkZ2UyLHBQb2ludCxSYWRpdXMpOworICAgIHJldHVybiAtMTsKK30vL2VuZCBvZiBfY3ZDYWxjRWRnZUludGVyc2VjdGlvbgorCitzdGF0aWMKK2Zsb2F0IF9jdkxpbmVfTGluZUludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKQoreworICAgIGlmKCgocEVkZ2UxLT5ub2RlMSA9PSBwRWRnZTItPm5vZGUxIHx8CisgICAgICAgIHBFZGdlMS0+bm9kZTEgPT0gcEVkZ2UyLT5ub2RlMikgJiYKKyAgICAgICAgcEVkZ2UxLT5ub2RlMSAhPSBOVUxMKXx8CisgICAgICAgKChwRWRnZTEtPm5vZGUyID09IHBFZGdlMi0+bm9kZTEgfHwKKyAgICAgICAgcEVkZ2UxLT5ub2RlMiA9PSBwRWRnZTItPm5vZGUyKSAmJgorICAgICAgICBwRWRnZTEtPm5vZGUyICE9IE5VTEwpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBDdlBvaW50RmxvYXQgUG9pbnQxLFBvaW50MzsKKyAgICBmbG9hdCBkZXQ7CisgICAgZmxvYXQgayxtOworICAgIGZsb2F0IHgyMSx4NDMseTQzLHkyMSx4MzEseTMxOworCisgICAgaWYocEVkZ2UxLT5ub2RlMSE9TlVMTCkKKyAgICB7CisgICAgICAgIFBvaW50MS54ID0gcEVkZ2UxLT5ub2RlMS0+bm9kZS54OworICAgICAgICBQb2ludDEueSA9IHBFZGdlMS0+bm9kZTEtPm5vZGUueTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUG9pbnQxLnggPSBwRWRnZTEtPm5vZGUyLT5ub2RlLng7CisgICAgICAgIFBvaW50MS55ID0gcEVkZ2UxLT5ub2RlMi0+bm9kZS55OworICAgIH0KKyAgICB4MjEgPSBwRWRnZTEtPmRpcmVjdGlvbi0+eDsKKyAgICB5MjEgPSBwRWRnZTEtPmRpcmVjdGlvbi0+eTsKKworICAgIGlmKHBFZGdlMi0+bm9kZTI9PU5VTEwpCisgICAgeworICAgICAgICBQb2ludDMueCA9IHBFZGdlMi0+bm9kZTEtPm5vZGUueDsKKyAgICAgICAgUG9pbnQzLnkgPSBwRWRnZTItPm5vZGUxLT5ub2RlLnk7CisgICAgICAgIHg0MyA9IHBFZGdlMi0+ZGlyZWN0aW9uLT54OworICAgICAgICB5NDMgPSBwRWRnZTItPmRpcmVjdGlvbi0+eTsKKyAgICAKKyAgICB9CisgICAgZWxzZSBpZihwRWRnZTItPm5vZGUxPT1OVUxMKQorICAgIHsKKyAgICAgICAgUG9pbnQzLnggPSBwRWRnZTItPm5vZGUyLT5ub2RlLng7CisgICAgICAgIFBvaW50My55ID0gcEVkZ2UyLT5ub2RlMi0+bm9kZS55OworICAgICAgICB4NDMgPSBwRWRnZTItPmRpcmVjdGlvbi0+eDsKKyAgICAgICAgeTQzID0gcEVkZ2UyLT5kaXJlY3Rpb24tPnk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBvaW50My54ID0gcEVkZ2UyLT5ub2RlMS0+bm9kZS54OworICAgICAgICBQb2ludDMueSA9IHBFZGdlMi0+bm9kZTEtPm5vZGUueTsKKyAgICAgICAgeDQzID0gcEVkZ2UyLT5ub2RlMi0+bm9kZS54IC0gUG9pbnQzLng7CisgICAgICAgIHk0MyA9IHBFZGdlMi0+bm9kZTItPm5vZGUueSAtIFBvaW50My55OworICAgIH0KKworICAgIHgzMSA9IFBvaW50My54IC0gUG9pbnQxLng7CisgICAgeTMxID0gUG9pbnQzLnkgLSBQb2ludDEueTsKKworICAgIGRldCA9IHkyMSp4NDMgLSB4MjEqeTQzOworICAgIGlmKGZhYnMoZGV0KSA8IExFRV9DT05TVF9aRVJPKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBrID0gKHg0Myp5MzEgLSB5NDMqeDMxKS9kZXQ7CisgICAgbSA9ICh4MjEqeTMxIC0geTIxKngzMSkvZGV0OworCisgICAgaWYoazwtTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1J8fG08LUxFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICByZXR1cm4gLTE7CisgICAgaWYoKChwRWRnZTEtPm5vZGUyIT1OVUxMKSYmKHBFZGdlMS0+bm9kZTEhPU5VTEwpKSYmKGs+MS5mK0xFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGlmKCgocEVkZ2UyLT5ub2RlMiE9TlVMTCkmJihwRWRnZTItPm5vZGUxIT1OVUxMKSkmJihtPjEuZitMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikpCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBwUG9pbnQtPnggPSAoZmxvYXQpKGsqeDIxKSArIFBvaW50MS54OworICAgIHBQb2ludC0+eSA9IChmbG9hdCkoayp5MjEpICsgUG9pbnQxLnk7IAorICAgIAorICAgIFJhZGl1cyA9IF9jdkNhbGNEaXN0KHBQb2ludCxwRWRnZTEtPnNpdGUpOworICAgIHJldHVybiBfY3ZQUERpc3QocFBvaW50LCZQb2ludDEpOzsKK30vL2VuZCBvZiBfY3ZMaW5lX0xpbmVJbnRlcnNlY3Rpb24KKworc3RhdGljCitmbG9hdCBfY3ZMaW5lX1BhckludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKQoreworICAgIGlmKHBFZGdlMi0+bm9kZTE9PU5VTEx8fHBFZGdlMi0+bm9kZTI9PU5VTEwpCisgICAgICAgIHJldHVybiBfY3ZMaW5lX09wZW5QYXJJbnRlcnNlY3Rpb24ocEVkZ2UxLHBFZGdlMixwUG9pbnQsUmFkaXVzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfY3ZMaW5lX0Nsb3NlUGFySW50ZXJzZWN0aW9uKHBFZGdlMSxwRWRnZTIscFBvaW50LFJhZGl1cyk7Cit9Ly9lbmQgb2YgX2N2TGluZV9QYXJJbnRlcnNlY3Rpb24KKworc3RhdGljCitmbG9hdCBfY3ZMaW5lX09wZW5QYXJJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlBvaW50RmxvYXQgIHBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cykKK3sKKyAgICBpbnQgSW50ZXJzZWN0aW9uTnVtYmVyID0gMTsKKyAgICBpZigoKHBFZGdlMS0+bm9kZTEgPT0gcEVkZ2UyLT5ub2RlMSB8fAorICAgICAgICBwRWRnZTEtPm5vZGUxID09IHBFZGdlMi0+bm9kZTIpICYmCisgICAgICAgIHBFZGdlMS0+bm9kZTEgIT0gTlVMTCl8fAorICAgICAgICgocEVkZ2UxLT5ub2RlMiA9PSBwRWRnZTItPm5vZGUxIHx8CisgICAgICAgIHBFZGdlMS0+bm9kZTIgPT0gcEVkZ2UyLT5ub2RlMikgJiYKKyAgICAgICAgcEVkZ2UxLT5ub2RlMiAhPSBOVUxMKSkKKyAgICAgICAgSW50ZXJzZWN0aW9uTnVtYmVyID0gMjsKKyAgICAKKyAgICBwQ3ZQb2ludEZsb2F0IHBSYXlQb2ludDE7IAorICAgIGlmKHBFZGdlMS0+bm9kZTEhPU5VTEwpCisgICAgICAgIHBSYXlQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTEtPm5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcFJheVBvaW50MSA9ICYocEVkZ2UxLT5ub2RlMi0+bm9kZSk7CisKKyAgICBwQ3ZEaXJlY3Rpb24gcERpcmVjdGlvbiA9IHBFZGdlMS0+ZGlyZWN0aW9uOworICAgIGZsb2F0KiBQYXJhYm9sYSA9IHBFZGdlMi0+cGFyYWJvbGEtPm1hcDsKKworICAgIHBDdlBvaW50RmxvYXQgcFBhclBvaW50MTsKKyAgICBpZihwRWRnZTItPm5vZGUxPT1OVUxMKQorICAgICAgICBwUGFyUG9pbnQxID0gJihwRWRnZTItPm5vZGUyLT5ub2RlKTsKKyAgICBlbHNlIAorICAgICAgICBwUGFyUG9pbnQxID0gJihwRWRnZTItPm5vZGUxLT5ub2RlKTsKKyAgICAKKyAgICBmbG9hdCBJbnZlcnNQYXJhYm9sYVs2XTsKKyAgICBfY3ZDYWxjT3J0b2dJbnZlcnNlKEludmVyc1BhcmFib2xhLCBQYXJhYm9sYSk7CisKKyAgICBDdlBvaW50RmxvYXQgIFBvaW50LFBhclBvaW50MV9pbWcsUmF5UG9pbnQxX2ltZzsKKyAgICBDdkRpcmVjdGlvbiBEaXJlY3Rpb25faW1nOworICAgIF9jdkNhbGNQb2ludEltYWdlKCZSYXlQb2ludDFfaW1nLCBwUmF5UG9pbnQxLCBJbnZlcnNQYXJhYm9sYSk7CisgICAgX2N2Q2FsY1ZlY3RvckltYWdlKCZEaXJlY3Rpb25faW1nLHBEaXJlY3Rpb24sIEludmVyc1BhcmFib2xhKTsKKworICAgIGZsb2F0IGMyID0gcEVkZ2UyLT5wYXJhYm9sYS0+YSpEaXJlY3Rpb25faW1nLng7CisgICAgZmxvYXQgYzEgPSAtRGlyZWN0aW9uX2ltZy55OworICAgIGZsb2F0IGMwID0gRGlyZWN0aW9uX2ltZy55KiBSYXlQb2ludDFfaW1nLnggLSBEaXJlY3Rpb25faW1nLngqUmF5UG9pbnQxX2ltZy55OworICAgIGZsb2F0IFhbMl07CisgICAgaW50IE4gPSBfY3ZTb2x2ZUVxdTJ0aFIoYzIsYzEsYzAsWCk7CisgICAgaWYoTj09MCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgX2N2Q2FsY1BvaW50SW1hZ2UoJlBhclBvaW50MV9pbWcsIHBQYXJQb2ludDEsIEludmVyc1BhcmFib2xhKTsKKyAgICBpbnQgc2lnbl94ID0gU0lHTihEaXJlY3Rpb25faW1nLngpOworICAgIGludCBzaWduX3kgPSBTSUdOKERpcmVjdGlvbl9pbWcueSk7CisgICAgaWYoTj09MSkKKyAgICB7CisgICAgICAgIGlmKFhbMF08UGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZsb2F0IHByMCA9IChYWzBdLVJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgXAorICAgICAgICAgICAgICAgICAgICAocEVkZ2UyLT5wYXJhYm9sYS0+YSpYWzBdKlhbMF0tUmF5UG9pbnQxX2ltZy55KSpzaWduX3k7CisgICAgICAgIGlmKHByMCA8PSAtTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKFhbMV08UGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIGZsb2F0IHByMCA9IChYWzBdLVJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgKHBFZGdlMi0+cGFyYWJvbGEtPmEqWFswXSpYWzBdLVJheVBvaW50MV9pbWcueSkqc2lnbl95OworICAgICAgICBmbG9hdCBwcjEgPSAoWFsxXS1SYXlQb2ludDFfaW1nLngpKnNpZ25feCArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwRWRnZTItPnBhcmFib2xhLT5hKlhbMV0qWFsxXS1SYXlQb2ludDFfaW1nLnkpKnNpZ25feTsKKworICAgICAgICBpZihwcjAgPD0gLUxFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SICYmcHIxIDw9IC1MRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZihwcjAgPi0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IgJiYgcHIxID4tIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICBpZihYWzBdID49IFBhclBvaW50MV9pbWcueCAtIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHByMD5wcjEpCisgICAgICAgICAgICAgICAgICAgIF9jdlN3YXAoWFswXSxYWzFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOPTE7CisgICAgICAgICAgICAgICAgWFswXSA9IFhbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwcjAgPi0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIE4gPSAxOworICAgICAgICAgICAgaWYoWFswXSA8IFBhclBvaW50MV9pbWcueCAtIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHByMSA+LSBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgeworICAgICAgICAgICAgTj0xOworICAgICAgICAgICAgWFswXSA9IFhbMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFBvaW50LnggPSBYWyhOLTEpKihJbnRlcnNlY3Rpb25OdW1iZXIgLSAxKV07CisgICAgUG9pbnQueSA9IHBFZGdlMi0+cGFyYWJvbGEtPmEqUG9pbnQueCpQb2ludC54OworCisgICAgUmFkaXVzID0gUG9pbnQueSArIDEuZi8oNCpwRWRnZTItPnBhcmFib2xhLT5hKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZShwUG9pbnQsJlBvaW50LFBhcmFib2xhKTsKKyAgICBmbG9hdCBkaXN0ID0gX2N2UFBEaXN0KHBQb2ludCwgcFJheVBvaW50MSk7CisgICAgaWYoSW50ZXJzZWN0aW9uTnVtYmVyID09IDIgJiYgZGlzdCA8IExFRV9DT05TVF9ESUZGX1BPSU5UUykKKyAgICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGRpc3Q7Cit9Ly8gZW5kIG9mIF9jdkxpbmVfT3BlblBhckludGVyc2VjdGlvbgorCitzdGF0aWMKK2Zsb2F0IF9jdkxpbmVfQ2xvc2VQYXJJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlBvaW50RmxvYXQgIHBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cykKK3sKKyAgICBpbnQgSW50ZXJzZWN0aW9uTnVtYmVyID0gMTsKKyAgICBpZigoKHBFZGdlMS0+bm9kZTEgPT0gcEVkZ2UyLT5ub2RlMSB8fAorICAgICAgICBwRWRnZTEtPm5vZGUxID09IHBFZGdlMi0+bm9kZTIpICYmCisgICAgICAgIHBFZGdlMS0+bm9kZTEgIT0gTlVMTCl8fAorICAgICAgICgocEVkZ2UxLT5ub2RlMiA9PSBwRWRnZTItPm5vZGUxIHx8CisgICAgICAgIHBFZGdlMS0+bm9kZTIgPT0gcEVkZ2UyLT5ub2RlMikgJiYKKyAgICAgICAgcEVkZ2UxLT5ub2RlMiAhPSBOVUxMKSkKKyAgICAgICAgSW50ZXJzZWN0aW9uTnVtYmVyID0gMjsKKworICAgIHBDdlBvaW50RmxvYXQgcFJheVBvaW50MTsgCisgICAgaWYocEVkZ2UxLT5ub2RlMSE9TlVMTCkKKyAgICAgICAgcFJheVBvaW50MSA9ICYocEVkZ2UxLT5ub2RlMS0+bm9kZSk7CisgICAgZWxzZQorICAgICAgICBwUmF5UG9pbnQxID0gJihwRWRnZTEtPm5vZGUyLT5ub2RlKTsKKworICAgIHBDdkRpcmVjdGlvbiBwRGlyZWN0aW9uID0gcEVkZ2UxLT5kaXJlY3Rpb247CisgICAgZmxvYXQqIFBhcmFib2xhID0gcEVkZ2UyLT5wYXJhYm9sYS0+bWFwOworCisgICAgcEN2UG9pbnRGbG9hdCBwUGFyUG9pbnQxLHBQYXJQb2ludDI7CisgICAgcFBhclBvaW50MiA9ICYocEVkZ2UyLT5ub2RlMS0+bm9kZSk7CisgICAgcFBhclBvaW50MSA9ICYocEVkZ2UyLT5ub2RlMi0+bm9kZSk7CisKKworICAgIGZsb2F0IEludmVyc1BhcmFib2xhWzZdOworICAgIF9jdkNhbGNPcnRvZ0ludmVyc2UoSW52ZXJzUGFyYWJvbGEsIFBhcmFib2xhKTsKKworICAgIEN2UG9pbnRGbG9hdCAgUG9pbnQsUGFyUG9pbnQxX2ltZyxQYXJQb2ludDJfaW1nLFJheVBvaW50MV9pbWc7CisgICAgQ3ZEaXJlY3Rpb24gRGlyZWN0aW9uX2ltZzsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUmF5UG9pbnQxX2ltZywgcFJheVBvaW50MSwgSW52ZXJzUGFyYWJvbGEpOworICAgIF9jdkNhbGNWZWN0b3JJbWFnZSgmRGlyZWN0aW9uX2ltZyxwRGlyZWN0aW9uLCBJbnZlcnNQYXJhYm9sYSk7CisKKyAgICBmbG9hdCBjMiA9IHBFZGdlMi0+cGFyYWJvbGEtPmEqRGlyZWN0aW9uX2ltZy54OworICAgIGZsb2F0IGMxID0gLURpcmVjdGlvbl9pbWcueTsKKyAgICBmbG9hdCBjMCA9IERpcmVjdGlvbl9pbWcueSogUmF5UG9pbnQxX2ltZy54IC0gRGlyZWN0aW9uX2ltZy54KlJheVBvaW50MV9pbWcueTsKKyAgICBmbG9hdCBYWzJdOworICAgIGludCBOID0gX2N2U29sdmVFcXUydGhSKGMyLGMxLGMwLFgpOworICAgIGlmKE49PTApCisgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyUG9pbnQxX2ltZywgcFBhclBvaW50MSwgSW52ZXJzUGFyYWJvbGEpOworICAgIF9jdkNhbGNQb2ludEltYWdlKCZQYXJQb2ludDJfaW1nLCBwUGFyUG9pbnQyLCBJbnZlcnNQYXJhYm9sYSk7CisgICAgaWYoUGFyUG9pbnQxX2ltZy54PlBhclBvaW50Ml9pbWcueCkKKyAgICAgICAgX2N2U3dhcChQYXJQb2ludDFfaW1nLFBhclBvaW50Ml9pbWcpOworICAgIGludCBzaWduX3ggPSBTSUdOKERpcmVjdGlvbl9pbWcueCk7CisgICAgaW50IHNpZ25feSA9IFNJR04oRGlyZWN0aW9uX2ltZy55KTsKKyAgICBpZihOPT0xKQorICAgIHsKKyAgICAgICAgaWYoKFhbMF08UGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpIHx8CisgICAgICAgICAgIChYWzBdPlBhclBvaW50Ml9pbWcueCArIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZmxvYXQgcHIwID0gKFhbMF0tUmF5UG9pbnQxX2ltZy54KSpzaWduX3ggKyBcCisgICAgICAgICAgICAgICAgICAgIChwRWRnZTItPnBhcmFib2xhLT5hKlhbMF0qWFswXS1SYXlQb2ludDFfaW1nLnkpKnNpZ25feTsKKyAgICAgICAgaWYocHIwIDw9IC1MRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoKFhbMV08UGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpIHx8CisgICAgICAgICAgIChYWzBdPlBhclBvaW50Ml9pbWcueCArIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZigoWFswXTxQYXJQb2ludDFfaW1nLnggLSBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikgJiYKKyAgICAgICAgICAgKFhbMV0+UGFyUG9pbnQyX2ltZy54ICsgTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGZsb2F0IHByMCA9IChYWzBdLVJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgXAorICAgICAgICAgICAgICAgICAgICAocEVkZ2UyLT5wYXJhYm9sYS0+YSpYWzBdKlhbMF0tUmF5UG9pbnQxX2ltZy55KSpzaWduX3k7CisgICAgICAgIGZsb2F0IHByMSA9IChYWzFdLVJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgXAorICAgICAgICAgICAgICAgICAgICAocEVkZ2UyLT5wYXJhYm9sYS0+YSpYWzFdKlhbMV0tUmF5UG9pbnQxX2ltZy55KSpzaWduX3k7CisKKyAgICAgICAgaWYocHIwIDw9IC1MRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUiAmJiBwcjEgPD0gLUxFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGlmKHByMCA+IC1MRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUiAmJiBwcjEgPiAtTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKFhbMF0gPj0gUGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoWFsxXSA8PSBQYXJQb2ludDJfaW1nLnggKyBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHByMD5wcjEpCisgICAgICAgICAgICAgICAgICAgICAgICBfY3ZTd2FwKFhbMF0sIFhbMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIE49MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOPTE7CisgICAgICAgICAgICAgICAgWFswXSA9IFhbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihwcjAgPiAtTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgIHsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoWFswXSA+PSBQYXJQb2ludDFfaW1nLnggLSBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgICAgICBOPTE7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocHIxID4gLUxFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICB7CisgICAgICAgICAgICBpZihYWzFdIDw9IFBhclBvaW50Ml9pbWcueCArIExFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE49MTsKKyAgICAgICAgICAgICAgICBYWzBdID0gWFsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIFBvaW50LnggPSBYWyhOLTEpKihJbnRlcnNlY3Rpb25OdW1iZXIgLSAxKV07CisgICAgUG9pbnQueSA9IHBFZGdlMi0+cGFyYWJvbGEtPmEqUG9pbnQueCpQb2ludC54OworICAgIFJhZGl1cyA9IFBvaW50LnkgKyAxLmYvKDQqcEVkZ2UyLT5wYXJhYm9sYS0+YSk7CisgICAgX2N2Q2FsY1BvaW50SW1hZ2UocFBvaW50LCZQb2ludCxQYXJhYm9sYSk7CisgICAgZmxvYXQgZGlzdCA9IF9jdlBQRGlzdChwUG9pbnQsIHBSYXlQb2ludDEpOworICAgIGlmKEludGVyc2VjdGlvbk51bWJlciA9PSAyICYmIGRpc3QgPCBMRUVfQ09OU1RfRElGRl9QT0lOVFMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkaXN0OworfS8vIGVuZCBvZiBfY3ZMaW5lX0Nsb3NlUGFySW50ZXJzZWN0aW9uCisKK3N0YXRpYworZmxvYXQgX2N2UGFyX0xpbmVJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlBvaW50RmxvYXQgIHBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cykKK3sKKyAgICBpZihwRWRnZTItPm5vZGUxPT1OVUxMfHxwRWRnZTItPm5vZGUyPT1OVUxMKQorICAgICAgICByZXR1cm4gX2N2UGFyX09wZW5MaW5lSW50ZXJzZWN0aW9uKHBFZGdlMSxwRWRnZTIscFBvaW50LFJhZGl1cyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gX2N2UGFyX0Nsb3NlTGluZUludGVyc2VjdGlvbihwRWRnZTEscEVkZ2UyLHBQb2ludCxSYWRpdXMpOworfS8vZW5kIF9jdlBhcl9MaW5lSW50ZXJzZWN0aW9uCisKK3N0YXRpYworZmxvYXQgX2N2UGFyX09wZW5MaW5lSW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpCit7CisgICAgaW50IGksIEludGVyc2VjdGlvbk51bWJlciA9IDE7CisgICAgaWYoKChwRWRnZTEtPm5vZGUxID09IHBFZGdlMi0+bm9kZTEgfHwKKyAgICAgICAgcEVkZ2UxLT5ub2RlMSA9PSBwRWRnZTItPm5vZGUyKSAmJgorICAgICAgICBwRWRnZTEtPm5vZGUxICE9IE5VTEwpfHwKKyAgICAgICAoKHBFZGdlMS0+bm9kZTIgPT0gcEVkZ2UyLT5ub2RlMSB8fAorICAgICAgICBwRWRnZTEtPm5vZGUyID09IHBFZGdlMi0+bm9kZTIpICYmCisgICAgICAgIHBFZGdlMS0+bm9kZTIgIT0gTlVMTCkpCisgICAgICAgIEludGVyc2VjdGlvbk51bWJlciA9IDI7CisKKyAgICBmbG9hdCogUGFyYWJvbGEgPSBwRWRnZTEtPnBhcmFib2xhLT5tYXA7CisgICAgcEN2UG9pbnRGbG9hdCBwUGFyUG9pbnQxOworICAgIGlmKHBFZGdlMS0+bm9kZTEhPU5VTEwpCisgICAgICAgIHBQYXJQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTEtPm5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcFBhclBvaW50MSA9ICYocEVkZ2UxLT5ub2RlMi0+bm9kZSk7CisKKyAgICBwQ3ZQb2ludEZsb2F0IHBSYXlQb2ludDE7CisgICAgaWYocEVkZ2UyLT5ub2RlMT09TlVMTCkKKyAgICAgICAgcFJheVBvaW50MSA9ICYocEVkZ2UyLT5ub2RlMi0+bm9kZSk7CisgICAgZWxzZSAKKyAgICAgICAgcFJheVBvaW50MSA9ICYocEVkZ2UyLT5ub2RlMS0+bm9kZSk7CisgICAgcEN2RGlyZWN0aW9uIHBEaXJlY3Rpb24gPSBwRWRnZTItPmRpcmVjdGlvbjsKKworICAgICAgICAgICAgCisgICAgZmxvYXQgSW52ZXJzUGFyYWJvbGFbNl07CisgICAgX2N2Q2FsY09ydG9nSW52ZXJzZShJbnZlcnNQYXJhYm9sYSwgUGFyYWJvbGEpOworCisgICAgQ3ZQb2ludEZsb2F0ICBQb2ludCA9IHswLDB9LFBhclBvaW50MV9pbWcsUmF5UG9pbnQxX2ltZzsKKyAgICBDdkRpcmVjdGlvbiBEaXJlY3Rpb25faW1nOworICAgIF9jdkNhbGNWZWN0b3JJbWFnZSgmRGlyZWN0aW9uX2ltZyxwRGlyZWN0aW9uLCBJbnZlcnNQYXJhYm9sYSk7CisgICAgX2N2Q2FsY1BvaW50SW1hZ2UoJlJheVBvaW50MV9pbWcsIHBSYXlQb2ludDEsIEludmVyc1BhcmFib2xhKTsKKworICAgIAorICAgIGZsb2F0IHEgPSBSYXlQb2ludDFfaW1nLnkgLSBwRWRnZTEtPnBhcmFib2xhLT5hKlJheVBvaW50MV9pbWcueCpSYXlQb2ludDFfaW1nLng7CisgICAgaWYocEVkZ2UyLT5zaXRlLT5ub2RlMSA9PSBwRWRnZTItPnNpdGUtPm5vZGUyICYmIHEgPCAwIHx8CisgICAgICAgIHBFZGdlMi0+c2l0ZS0+bm9kZTEgIT0gcEVkZ2UyLT5zaXRlLT5ub2RlMiAmJiBxID4gMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZmxvYXQgYzIgPSBwRWRnZTEtPnBhcmFib2xhLT5hKkRpcmVjdGlvbl9pbWcueDsKKyAgICBmbG9hdCBjMSA9IC1EaXJlY3Rpb25faW1nLnk7CisgICAgZmxvYXQgYzAgPSBEaXJlY3Rpb25faW1nLnkqIFJheVBvaW50MV9pbWcueCAtIERpcmVjdGlvbl9pbWcueCpSYXlQb2ludDFfaW1nLnk7CisgICAgZmxvYXQgWFsyXTsKKyAgICBpbnQgTiA9IF9jdlNvbHZlRXF1MnRoUihjMixjMSxjMCxYKTsKKyAgICBpZihOPT0wKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyUG9pbnQxX2ltZywgcFBhclBvaW50MSwgSW52ZXJzUGFyYWJvbGEpOworICAgIGludCBzaWduX3ggPSBTSUdOKERpcmVjdGlvbl9pbWcueCk7CisgICAgaW50IHNpZ25feSA9IFNJR04oRGlyZWN0aW9uX2ltZy55KTsKKyAgICBmbG9hdCBwcjsKKworICAgIGlmKE49PTIgJiYgSW50ZXJzZWN0aW9uTnVtYmVyID09IDIpCisgICAgICAgIF9jdlN3YXAoWFswXSwgWFsxXSk7CisKKyAgICBmb3IoIGk9MDtpPE47aSsrKQorICAgIHsKKyAgICAgICAgaWYoWFtpXTw9UGFyUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcHIgPSAoWFtpXS1SYXlQb2ludDFfaW1nLngpKnNpZ25feCArIAorICAgICAgICAgICAgICAgICAgICAgICAgKHBFZGdlMS0+cGFyYWJvbGEtPmEqWFtpXSpYW2ldLVJheVBvaW50MV9pbWcueSkqc2lnbl95OworICAgICAgICBpZihwciA8PSAtTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBQb2ludC54ID0gWFtpXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoaT09TikKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAKKyAgICBQb2ludC55ID0gcEVkZ2UxLT5wYXJhYm9sYS0+YSpQb2ludC54KlBvaW50Lng7CisgICAgUmFkaXVzID0gUG9pbnQueSArIDEuZi8oNCpwRWRnZTEtPnBhcmFib2xhLT5hKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZShwUG9pbnQsJlBvaW50LFBhcmFib2xhKTsKKyAgICBmbG9hdCBkaXN0ID0gUG9pbnQueCAtIFBhclBvaW50MV9pbWcueDsKKyAgICBpZihJbnRlcnNlY3Rpb25OdW1iZXIgPT0gMiAmJiBkaXN0IDwgTEVFX0NPTlNUX0RJRkZfUE9JTlRTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZGlzdDsKK30vLyBlbmQgb2YgX2N2UGFyX09wZW5MaW5lSW50ZXJzZWN0aW9uCisKK3N0YXRpYworZmxvYXQgX2N2UGFyX0Nsb3NlTGluZUludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKQoreworICAgIGludCBpLCBJbnRlcnNlY3Rpb25OdW1iZXIgPSAxOworICAgIGlmKCgocEVkZ2UxLT5ub2RlMSA9PSBwRWRnZTItPm5vZGUxIHx8CisgICAgICAgIHBFZGdlMS0+bm9kZTEgPT0gcEVkZ2UyLT5ub2RlMikgJiYKKyAgICAgICAgcEVkZ2UxLT5ub2RlMSAhPSBOVUxMKXx8CisgICAgICAgKChwRWRnZTEtPm5vZGUyID09IHBFZGdlMi0+bm9kZTEgfHwKKyAgICAgICAgcEVkZ2UxLT5ub2RlMiA9PSBwRWRnZTItPm5vZGUyKSAmJgorICAgICAgICBwRWRnZTEtPm5vZGUyICE9IE5VTEwpKQorICAgICAgICBJbnRlcnNlY3Rpb25OdW1iZXIgPSAyOworCisgICAgZmxvYXQqIFBhcmFib2xhID0gcEVkZ2UxLT5wYXJhYm9sYS0+bWFwOworICAgIHBDdlBvaW50RmxvYXQgcFBhclBvaW50MTsKKyAgICBpZihwRWRnZTEtPm5vZGUxIT1OVUxMKQorICAgICAgICBwUGFyUG9pbnQxID0gJihwRWRnZTEtPm5vZGUxLT5ub2RlKTsKKyAgICBlbHNlCisgICAgICAgIHBQYXJQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTItPm5vZGUpOworCisgICAgcEN2UG9pbnRGbG9hdCBwUmF5UG9pbnQxLHBSYXlQb2ludDI7CisgICAgcFJheVBvaW50MiA9ICYocEVkZ2UyLT5ub2RlMS0+bm9kZSk7CisgICAgcFJheVBvaW50MSA9ICYocEVkZ2UyLT5ub2RlMi0+bm9kZSk7CisKKyAgICBwQ3ZEaXJlY3Rpb24gcERpcmVjdGlvbiA9IHBFZGdlMi0+ZGlyZWN0aW9uOworICAgIGZsb2F0IEludmVyc1BhcmFib2xhWzZdOworICAgIF9jdkNhbGNPcnRvZ0ludmVyc2UoSW52ZXJzUGFyYWJvbGEsIFBhcmFib2xhKTsKKworICAgIEN2UG9pbnRGbG9hdCAgUG9pbnQ9ezAsMH0sUGFyUG9pbnQxX2ltZyxSYXlQb2ludDFfaW1nLFJheVBvaW50Ml9pbWc7CisgICAgQ3ZEaXJlY3Rpb24gRGlyZWN0aW9uX2ltZzsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUmF5UG9pbnQxX2ltZywgcFJheVBvaW50MSwgSW52ZXJzUGFyYWJvbGEpOworICAgIF9jdkNhbGNQb2ludEltYWdlKCZSYXlQb2ludDJfaW1nLCBwUmF5UG9pbnQyLCBJbnZlcnNQYXJhYm9sYSk7CisgICAgCisgICAgZmxvYXQgcTsKKyAgICBpZihSYWRpdXMgPT0gLTEpCisgICAgeworICAgICAgICAgcSA9IFJheVBvaW50MV9pbWcueSAtIHBFZGdlMS0+cGFyYWJvbGEtPmEqUmF5UG9pbnQxX2ltZy54KlJheVBvaW50MV9pbWcueDsKKyAgICAgICAgIGlmKHBFZGdlMi0+c2l0ZS0+bm9kZTEgPT0gcEVkZ2UyLT5zaXRlLT5ub2RlMiAmJiBxIDwgMCB8fAorICAgICAgICAgICAgcEVkZ2UyLT5zaXRlLT5ub2RlMSAhPSBwRWRnZTItPnNpdGUtPm5vZGUyICYmIHEgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYoUmFkaXVzID09IC0yKQorICAgIHsKKyAgICAgICAgIHEgPSBSYXlQb2ludDJfaW1nLnkgLSBwRWRnZTEtPnBhcmFib2xhLT5hKlJheVBvaW50Ml9pbWcueCpSYXlQb2ludDJfaW1nLng7CisgICAgICAgIGlmKHBFZGdlMi0+c2l0ZS0+bm9kZTEgPT0gcEVkZ2UyLT5zaXRlLT5ub2RlMiAmJiBxIDwgMCB8fAorICAgICAgICAgICAgcEVkZ2UyLT5zaXRlLT5ub2RlMSAhPSBwRWRnZTItPnNpdGUtPm5vZGUyICYmIHEgPiAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyUG9pbnQxX2ltZywgcFBhclBvaW50MSwgSW52ZXJzUGFyYWJvbGEpOworICAgIF9jdkNhbGNWZWN0b3JJbWFnZSgmRGlyZWN0aW9uX2ltZyxwRGlyZWN0aW9uLCBJbnZlcnNQYXJhYm9sYSk7CisKKyAgICBmbG9hdCBjMiA9IHBFZGdlMS0+cGFyYWJvbGEtPmEqRGlyZWN0aW9uX2ltZy54OworICAgIGZsb2F0IGMxID0gLURpcmVjdGlvbl9pbWcueTsKKyAgICBmbG9hdCBjMCA9IERpcmVjdGlvbl9pbWcueSogUmF5UG9pbnQxX2ltZy54IC0gRGlyZWN0aW9uX2ltZy54KlJheVBvaW50MV9pbWcueTsKKyAgICBmbG9hdCBYWzJdOworICAgIGludCBOID0gX2N2U29sdmVFcXUydGhSKGMyLGMxLGMwLFgpOworICAgIGlmKE49PTApCisgICAgICAgIHJldHVybiAtMTsKKyAgICBpbnQgc2lnbl94ID0gU0lHTihSYXlQb2ludDJfaW1nLnggLSBSYXlQb2ludDFfaW1nLngpOworICAgIGludCBzaWduX3kgPSBTSUdOKFJheVBvaW50Ml9pbWcueSAtIFJheVBvaW50MV9pbWcueSk7CisgICAgZmxvYXQgcHJfZGlyID0gKFJheVBvaW50Ml9pbWcueCAtIFJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgCisgICAgICAgICAgICAgICAgICAgKFJheVBvaW50Ml9pbWcueSAtIFJheVBvaW50MV9pbWcueSkqc2lnbl95OworICAgIGZsb2F0IHByOworCisgICAgaWYoTj09MiAmJiBJbnRlcnNlY3Rpb25OdW1iZXIgPT0gMikKKyAgICAgICAgX2N2U3dhcChYWzBdLCBYWzFdKTsKKworICAgIGZvciggaSA9MDtpPE47aSsrKQorICAgIHsKKyAgICAgICAgaWYoWFtpXSA8PSBQYXJQb2ludDFfaW1nLnggLSBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBwciA9IChYW2ldLVJheVBvaW50MV9pbWcueCkqc2lnbl94ICsgXAorICAgICAgICAgICAgIChwRWRnZTEtPnBhcmFib2xhLT5hKlhbaV0qWFtpXS1SYXlQb2ludDFfaW1nLnkpKnNpZ25feTsKKyAgICAgICAgaWYocHIgPD0gLUxFRV9DT05TVF9BQ0NFUFRBQkxFX0VSUk9SIHx8IHByPj1wcl9kaXIgKyBMRUVfQ09OU1RfQUNDRVBUQUJMRV9FUlJPUikKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvaW50LnggPSBYW2ldOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihpPT1OKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBQb2ludC55ID0gcEVkZ2UxLT5wYXJhYm9sYS0+YSpQb2ludC54KlBvaW50Lng7CisgICAgUmFkaXVzID0gUG9pbnQueSArIDEuZi8oNCpwRWRnZTEtPnBhcmFib2xhLT5hKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZShwUG9pbnQsJlBvaW50LFBhcmFib2xhKTsKKyAgICBmbG9hdCBkaXN0ID0gUG9pbnQueCAtIFBhclBvaW50MV9pbWcueDsKKyAgICBpZihJbnRlcnNlY3Rpb25OdW1iZXIgPT0gMiAmJiBkaXN0IDwgTEVFX0NPTlNUX0RJRkZfUE9JTlRTKQorICAgICAgICByZXR1cm4gLTE7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gZGlzdDsKK30vLyBlbmQgb2YgX2N2UGFyX0Nsb3NlTGluZUludGVyc2VjdGlvbgorCitzdGF0aWMKK2Zsb2F0IF9jdlBhcl9QYXJJbnRlcnNlY3Rpb24ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZQb2ludEZsb2F0ICBwUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgJlJhZGl1cykKK3sKKyAgICBpZihwRWRnZTItPm5vZGUxPT1OVUxMfHxwRWRnZTItPm5vZGUyPT1OVUxMKQorICAgICAgICByZXR1cm4gX2N2UGFyX09wZW5QYXJJbnRlcnNlY3Rpb24ocEVkZ2UxLHBFZGdlMixwUG9pbnQsUmFkaXVzKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfY3ZQYXJfQ2xvc2VQYXJJbnRlcnNlY3Rpb24ocEVkZ2UxLHBFZGdlMixwUG9pbnQsUmFkaXVzKTsKK30vLyBlbmQgb2YgX2N2UGFyX1BhckludGVyc2VjdGlvbgorCitzdGF0aWMKK2Zsb2F0IF9jdlBhcl9PcGVuUGFySW50ZXJzZWN0aW9uKHBDdlZvcm9ub2lFZGdlIHBFZGdlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2UG9pbnRGbG9hdCAgcFBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICZSYWRpdXMpCit7CisgICAgaW50IGksIEludGVyc2VjdGlvbk51bWJlciA9IDE7CisgICAgaWYoKChwRWRnZTEtPm5vZGUxID09IHBFZGdlMi0+bm9kZTEgfHwKKyAgICAgICAgcEVkZ2UxLT5ub2RlMSA9PSBwRWRnZTItPm5vZGUyKSAmJgorICAgICAgICBwRWRnZTEtPm5vZGUxICE9IE5VTEwpfHwKKyAgICAgICAoKHBFZGdlMS0+bm9kZTIgPT0gcEVkZ2UyLT5ub2RlMSB8fAorICAgICAgICBwRWRnZTEtPm5vZGUyID09IHBFZGdlMi0+bm9kZTIpICYmCisgICAgICAgIHBFZGdlMS0+bm9kZTIgIT0gTlVMTCkpCisgICAgICAgIEludGVyc2VjdGlvbk51bWJlciA9IDI7CisKKyAgICBmbG9hdCogUGFyYWJvbGExID0gcEVkZ2UxLT5wYXJhYm9sYS0+bWFwOworICAgIHBDdlBvaW50RmxvYXQgcFBhcjFQb2ludDE7CisgICAgaWYocEVkZ2UxLT5ub2RlMSE9TlVMTCkKKyAgICAgICAgcFBhcjFQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTEtPm5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcFBhcjFQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTItPm5vZGUpOworCisgICAgZmxvYXQqIFBhcmFib2xhMiA9IHBFZGdlMi0+cGFyYWJvbGEtPm1hcDsKKyAgICBwQ3ZQb2ludEZsb2F0IHBQYXIyUG9pbnQxOworICAgIGlmKHBFZGdlMi0+bm9kZTEhPU5VTEwpCisgICAgICAgIHBQYXIyUG9pbnQxID0gJihwRWRnZTItPm5vZGUxLT5ub2RlKTsKKyAgICBlbHNlCisgICAgICAgIHBQYXIyUG9pbnQxID0gJihwRWRnZTItPm5vZGUyLT5ub2RlKTsKKworICAgIEN2UG9pbnRGbG9hdCBQb2ludDsKKyAgICBDdkRpcmVjdGlvbiBEaXJlY3Rpb247CisgICAgaWYocEVkZ2UxLT5wYXJhYm9sYS0+ZGlyZWN0cmljZT09cEVkZ2UyLT5wYXJhYm9sYS0+ZGlyZWN0cmljZSkgIC8vY29tbW9uIHNpdGUgaXMgc2VnbWVudCAtPiBkaWZmZXJlbnQgZm9jdXNlcworICAgIHsKKyAgICAgICAgcEN2UG9pbnRGbG9hdCBwRm9jdXMxID0gJihwRWRnZTEtPnBhcmFib2xhLT5mb2N1cy0+bm9kZSk7CisgICAgICAgIHBDdlBvaW50RmxvYXQgcEZvY3VzMiA9ICYocEVkZ2UyLT5wYXJhYm9sYS0+Zm9jdXMtPm5vZGUpOworICAgICAgICAKKyAgICAgICAgUG9pbnQueCA9IChwRm9jdXMxLT54ICsgcEZvY3VzMi0+eCkvMjsKKyAgICAgICAgUG9pbnQueSA9IChwRm9jdXMxLT55ICsgcEZvY3VzMi0+eSkvMjsKKyAgICAgICAgRGlyZWN0aW9uLnggPSBwRm9jdXMxLT55IC0gcEZvY3VzMi0+eTsKKyAgICAgICAgRGlyZWN0aW9uLnkgPSBwRm9jdXMyLT54IC0gcEZvY3VzMS0+eDsKKyAgICB9CisgICAgZWxzZS8vY29tbW9uIHNpdGUgaXMgZm9jdXMgLT4gZGlmZmVyZW50IGRpcmVjdHJpY2VzCisgICAgeworICAgICAgICBwQ3ZWb3Jvbm9pU2l0ZSBwRGlyZWN0cmljZTEgPSBwRWRnZTEtPnBhcmFib2xhLT5kaXJlY3RyaWNlOworICAgICAgICBwQ3ZQb2ludEZsb2F0IHBQb2ludDEgPSAmKHBEaXJlY3RyaWNlMS0+bm9kZTEtPm5vZGUpOworICAgICAgICBwQ3ZEaXJlY3Rpb24gcFZlY3RvcjIxID0gcERpcmVjdHJpY2UxLT5kaXJlY3Rpb247CisgICAgCisgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBEaXJlY3RyaWNlMiA9IHBFZGdlMi0+cGFyYWJvbGEtPmRpcmVjdHJpY2U7CisgICAgICAgIHBDdlBvaW50RmxvYXQgcFBvaW50MyA9ICYocERpcmVjdHJpY2UyLT5ub2RlMS0+bm9kZSk7CisgICAgICAgIHBDdkRpcmVjdGlvbiBwVmVjdG9yNDMgPSBwRGlyZWN0cmljZTItPmRpcmVjdGlvbjsKKyAgICAgICAgCisgICAgICAgIERpcmVjdGlvbi54ID0gcFZlY3RvcjQzLT54IC0gcFZlY3RvcjIxLT54OworICAgICAgICBEaXJlY3Rpb24ueSA9IHBWZWN0b3I0My0+eSAtIHBWZWN0b3IyMS0+eTsKKworICAgICAgICBpZigoZmFicyhEaXJlY3Rpb24ueCkgPCBMRUVfQ09OU1RfWkVSTykgJiYKKyAgICAgICAgICAgKGZhYnMoRGlyZWN0aW9uLnkpIDwgTEVFX0NPTlNUX1pFUk8pKQorICAgICAgICAgICAgICAgIERpcmVjdGlvbiA9ICpwVmVjdG9yNDM7CisgICAgCisgICAgICAgIGZsb2F0IGRldCA9IHBWZWN0b3IyMS0+eSAqIHBWZWN0b3I0My0+eCAtIHBWZWN0b3IyMS0+eCAqIHBWZWN0b3I0My0+eTsKKyAgICAgICAgaWYoZmFicyhkZXQpIDwgTEVFX0NPTlNUX1pFUk8pCisgICAgICAgIHsKKyAgICAgICAgICAgIFBvaW50LnggPSAocFBvaW50MS0+eCArIHBQb2ludDMtPngpLzI7CisgICAgICAgICAgICBQb2ludC55ID0gKHBQb2ludDEtPnkgKyBwUG9pbnQzLT55KS8yOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgZDEgPSBwVmVjdG9yMjEtPnkqcFBvaW50MS0+eCAtIHBWZWN0b3IyMS0+eCpwUG9pbnQxLT55OworICAgICAgICAgICAgZmxvYXQgZDIgPSBwVmVjdG9yNDMtPnkqcFBvaW50My0+eCAtIHBWZWN0b3I0My0+eCpwUG9pbnQzLT55OworICAgICAgICAgICAgUG9pbnQueCA9IChmbG9hdCkoKHBWZWN0b3I0My0+eCpkMSAtIHBWZWN0b3IyMS0+eCpkMikvZGV0KTsKKyAgICAgICAgICAgIFBvaW50LnkgPSAoZmxvYXQpKChwVmVjdG9yNDMtPnkqZDEgLSBwVmVjdG9yMjEtPnkqZDIpL2RldCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbG9hdCBJbnZlcnNQYXJhYm9sYTJbNl07CisgICAgX2N2Q2FsY09ydG9nSW52ZXJzZShJbnZlcnNQYXJhYm9sYTIsIFBhcmFib2xhMik7CisgICAgCisgICAgQ3ZQb2ludEZsb2F0ICBQYXIyUG9pbnQxX2ltZyxQb2ludF9pbWc7CisgICAgQ3ZEaXJlY3Rpb24gRGlyZWN0aW9uX2ltZzsKKyAgICBfY3ZDYWxjVmVjdG9ySW1hZ2UoJkRpcmVjdGlvbl9pbWcsJkRpcmVjdGlvbiwgSW52ZXJzUGFyYWJvbGEyKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUG9pbnRfaW1nLCAmUG9pbnQsIEludmVyc1BhcmFib2xhMik7CisgICAgCisgICAgZmxvYXQgYTEgPSBwRWRnZTEtPnBhcmFib2xhLT5hOworICAgIGZsb2F0IGEyID0gcEVkZ2UyLT5wYXJhYm9sYS0+YTsKKyAgICBmbG9hdCBjMiA9IGEyKkRpcmVjdGlvbl9pbWcueDsKKyAgICBmbG9hdCBjMSA9IC1EaXJlY3Rpb25faW1nLnk7CisgICAgZmxvYXQgYzAgPSBEaXJlY3Rpb25faW1nLnkqIFBvaW50X2ltZy54IC0gRGlyZWN0aW9uX2ltZy54KlBvaW50X2ltZy55OworICAgIGZsb2F0IFhbMl07CisgICAgaW50IE4gPSBfY3ZTb2x2ZUVxdTJ0aFIoYzIsYzEsYzAsWCk7CisKKyAgICBpZihOPT0wKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyMlBvaW50MV9pbWcsIHBQYXIyUG9pbnQxLCBJbnZlcnNQYXJhYm9sYTIpOworCisgICAgaWYoWFtOLTFdPFBhcjJQb2ludDFfaW1nLngpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGlmKFhbMF08UGFyMlBvaW50MV9pbWcueCkKKyAgICB7CisgICAgICAgIFhbMF0gPSBYWzFdOworICAgICAgICBOPTE7CisgICAgfQorCisgICAgZmxvYXQgSW52ZXJzUGFyYWJvbGExWzZdOworICAgIEN2UG9pbnRGbG9hdCBQYXIxUG9pbnQxX2ltZzsKKyAgICBfY3ZDYWxjT3J0b2dJbnZlcnNlKEludmVyc1BhcmFib2xhMSwgUGFyYWJvbGExKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyMVBvaW50MV9pbWcsIHBQYXIxUG9pbnQxLCBJbnZlcnNQYXJhYm9sYTEpOworICAgIGZsb2F0IEludlBhcjFfUGFyMls2XTsKKyAgICBfY3ZDYWxjQ29tcG9zaXRpb24oSW52UGFyMV9QYXIyLEludmVyc1BhcmFib2xhMSxQYXJhYm9sYTIpOworICAgIGZvcihpPTA7aTxOO2krKykKKyAgICAgICAgWFtpXSA9IChJbnZQYXIxX1BhcjJbMV0qYTIqWFtpXSArIEludlBhcjFfUGFyMlswXSkqWFtpXSArICBJbnZQYXIxX1BhcjJbMl07CisKKyAgICBpZihOIT0xKQorICAgIHsKKyAgICAgICAgaWYoKFhbMF0+WFsxXSAmJiBJbnRlcnNlY3Rpb25OdW1iZXIgPT0gMSl8fAorICAgICAgICAgICAgKFhbMF08WFsxXSAmJiBJbnRlcnNlY3Rpb25OdW1iZXIgPT0gMikpCisgICAgICAgICAgICBfY3ZTd2FwKFhbMF0sIFhbMV0pOworICAgIH0KKworICAgIGZvcihpID0gMDtpPE47aSsrKQorICAgIHsKKyAgICAgICAgUG9pbnQueCA9IFhbaV07CisgICAgICAgIFBvaW50LnkgPSBhMSpQb2ludC54KlBvaW50Lng7CisgICAgICAgIGlmKFBvaW50LnggPCBQYXIxUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIAorICAgIGlmKGk9PU4pCisgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgCisgICAgUmFkaXVzID0gUG9pbnQueSArIDEuZi8oNCpwRWRnZTEtPnBhcmFib2xhLT5hKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZShwUG9pbnQsJlBvaW50LFBhcmFib2xhMSk7CisgICAgZmxvYXQgZGlzdCA9IFBvaW50LnggLSBQYXIxUG9pbnQxX2ltZy54OworICAgIGlmKEludGVyc2VjdGlvbk51bWJlciA9PSAyICYmIGRpc3QgPCBMRUVfQ09OU1RfRElGRl9QT0lOVFMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkaXN0OworfS8vIGVuZCBvZiBfY3ZQYXJfT3BlblBhckludGVyc2VjdGlvbgorCitzdGF0aWMKK2Zsb2F0IF9jdlBhcl9DbG9zZVBhckludGVyc2VjdGlvbihwQ3ZWb3Jvbm9pRWRnZSBwRWRnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlBvaW50RmxvYXQgIHBQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAmUmFkaXVzKQoreworICAgIGludCBpLCBJbnRlcnNlY3Rpb25OdW1iZXIgPSAxOworICAgIGlmKCgocEVkZ2UxLT5ub2RlMSA9PSBwRWRnZTItPm5vZGUxIHx8CisgICAgICAgIHBFZGdlMS0+bm9kZTEgPT0gcEVkZ2UyLT5ub2RlMikgJiYKKyAgICAgICAgcEVkZ2UxLT5ub2RlMSAhPSBOVUxMKXx8CisgICAgICAgKChwRWRnZTEtPm5vZGUyID09IHBFZGdlMi0+bm9kZTEgfHwKKyAgICAgICAgcEVkZ2UxLT5ub2RlMiA9PSBwRWRnZTItPm5vZGUyKSAmJgorICAgICAgICBwRWRnZTEtPm5vZGUyICE9IE5VTEwpKQorICAgICAgICBJbnRlcnNlY3Rpb25OdW1iZXIgPSAyOworCisgICAgZmxvYXQqIFBhcmFib2xhMSA9IHBFZGdlMS0+cGFyYWJvbGEtPm1hcDsKKyAgICBmbG9hdCogUGFyYWJvbGEyID0gcEVkZ2UyLT5wYXJhYm9sYS0+bWFwOworICAgIHBDdlBvaW50RmxvYXQgcFBhcjFQb2ludDE7CisgICAgaWYocEVkZ2UxLT5ub2RlMSE9TlVMTCkKKyAgICAgICAgcFBhcjFQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTEtPm5vZGUpOworICAgIGVsc2UKKyAgICAgICAgcFBhcjFQb2ludDEgPSAmKHBFZGdlMS0+bm9kZTItPm5vZGUpOworCisgICAgcEN2UG9pbnRGbG9hdCBwUGFyMlBvaW50MSA9ICYocEVkZ2UyLT5ub2RlMS0+bm9kZSk7CisgICAgcEN2UG9pbnRGbG9hdCBwUGFyMlBvaW50MiA9ICYocEVkZ2UyLT5ub2RlMi0+bm9kZSk7CisgICAgCisgICAgQ3ZQb2ludEZsb2F0IFBvaW50OworICAgIEN2RGlyZWN0aW9uIERpcmVjdGlvbjsKKyAgICBpZihwRWRnZTEtPnBhcmFib2xhLT5kaXJlY3RyaWNlPT1wRWRnZTItPnBhcmFib2xhLT5kaXJlY3RyaWNlKSAgLy9jb21tb24gc2l0ZSBpcyBzZWdtZW50IC0+IGRpZmZlcmVudCBmb2N1c2VzCisgICAgeworICAgICAgICBwQ3ZQb2ludEZsb2F0IHBGb2N1czEgPSAmKHBFZGdlMS0+cGFyYWJvbGEtPmZvY3VzLT5ub2RlKTsKKyAgICAgICAgcEN2UG9pbnRGbG9hdCBwRm9jdXMyID0gJihwRWRnZTItPnBhcmFib2xhLT5mb2N1cy0+bm9kZSk7CisgICAgICAgIAorICAgICAgICBQb2ludC54ID0gKHBGb2N1czEtPnggKyBwRm9jdXMyLT54KS8yOworICAgICAgICBQb2ludC55ID0gKHBGb2N1czEtPnkgKyBwRm9jdXMyLT55KS8yOworICAgICAgICBEaXJlY3Rpb24ueCA9IHBGb2N1czEtPnkgLSBwRm9jdXMyLT55OworICAgICAgICBEaXJlY3Rpb24ueSA9IHBGb2N1czItPnggLSBwRm9jdXMxLT54OworICAgIH0KKyAgICBlbHNlLy9jb21tb24gc2l0ZSBpcyBmb2N1cyAtPiBkaWZmZXJlbnQgZGlyZWN0cmljZXMKKyAgICB7CisgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBEaXJlY3RyaWNlMSA9IHBFZGdlMS0+cGFyYWJvbGEtPmRpcmVjdHJpY2U7CisgICAgICAgIHBDdlBvaW50RmxvYXQgcFBvaW50MSA9ICYocERpcmVjdHJpY2UxLT5ub2RlMS0+bm9kZSk7CisgICAgICAgIHBDdkRpcmVjdGlvbiBwVmVjdG9yMjEgPSBwRGlyZWN0cmljZTEtPmRpcmVjdGlvbjsKKyAgICAKKyAgICAgICAgcEN2Vm9yb25vaVNpdGUgcERpcmVjdHJpY2UyID0gcEVkZ2UyLT5wYXJhYm9sYS0+ZGlyZWN0cmljZTsKKyAgICAgICAgcEN2UG9pbnRGbG9hdCBwUG9pbnQzID0gJihwRGlyZWN0cmljZTItPm5vZGUxLT5ub2RlKTsKKyAgICAgICAgcEN2RGlyZWN0aW9uIHBWZWN0b3I0MyA9IHBEaXJlY3RyaWNlMi0+ZGlyZWN0aW9uOworICAgICAgICAKKyAgICAgICAgRGlyZWN0aW9uLnggPSBwVmVjdG9yNDMtPnggLSBwVmVjdG9yMjEtPng7CisgICAgICAgIERpcmVjdGlvbi55ID0gcFZlY3RvcjQzLT55IC0gcFZlY3RvcjIxLT55OworCisgICAgICAgIGlmKChmYWJzKERpcmVjdGlvbi54KSA8IExFRV9DT05TVF9aRVJPKSAmJgorICAgICAgICAgICAoZmFicyhEaXJlY3Rpb24ueSkgPCBMRUVfQ09OU1RfWkVSTykpCisgICAgICAgICAgICAgICAgRGlyZWN0aW9uID0gKnBWZWN0b3I0MzsKKyAgICAKKyAgICAgICAgZmxvYXQgZGV0ID0gcFZlY3RvcjIxLT55ICogcFZlY3RvcjQzLT54IC0gcFZlY3RvcjIxLT54ICogcFZlY3RvcjQzLT55OworICAgICAgICBpZihmYWJzKGRldCkgPCBMRUVfQ09OU1RfWkVSTykKKyAgICAgICAgeworICAgICAgICAgICAgUG9pbnQueCA9IChwUG9pbnQxLT54ICsgcFBvaW50My0+eCkvMjsKKyAgICAgICAgICAgIFBvaW50LnkgPSAocFBvaW50MS0+eSArIHBQb2ludDMtPnkpLzI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBkMSA9IHBWZWN0b3IyMS0+eSpwUG9pbnQxLT54IC0gcFZlY3RvcjIxLT54KnBQb2ludDEtPnk7CisgICAgICAgICAgICBmbG9hdCBkMiA9IHBWZWN0b3I0My0+eSpwUG9pbnQzLT54IC0gcFZlY3RvcjQzLT54KnBQb2ludDMtPnk7CisgICAgICAgICAgICBQb2ludC54ID0gKGZsb2F0KSgocFZlY3RvcjQzLT54KmQxIC0gcFZlY3RvcjIxLT54KmQyKS9kZXQpOworICAgICAgICAgICAgUG9pbnQueSA9IChmbG9hdCkoKHBWZWN0b3I0My0+eSpkMSAtIHBWZWN0b3IyMS0+eSpkMikvZGV0KTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgCisgICAgZmxvYXQgSW52ZXJzUGFyYWJvbGEyWzZdOworICAgIF9jdkNhbGNPcnRvZ0ludmVyc2UoSW52ZXJzUGFyYWJvbGEyLCBQYXJhYm9sYTIpOworICAgIAorICAgIEN2UG9pbnRGbG9hdCAgUGFyMlBvaW50MV9pbWcsUGFyMlBvaW50Ml9pbWcsUG9pbnRfaW1nOworICAgIEN2RGlyZWN0aW9uIERpcmVjdGlvbl9pbWc7CisgICAgX2N2Q2FsY1ZlY3RvckltYWdlKCZEaXJlY3Rpb25faW1nLCZEaXJlY3Rpb24sIEludmVyc1BhcmFib2xhMik7CisgICAgX2N2Q2FsY1BvaW50SW1hZ2UoJlBvaW50X2ltZywgJlBvaW50LCBJbnZlcnNQYXJhYm9sYTIpOworICAgIAorICAgIGZsb2F0IGExID0gcEVkZ2UxLT5wYXJhYm9sYS0+YTsKKyAgICBmbG9hdCBhMiA9IHBFZGdlMi0+cGFyYWJvbGEtPmE7CisgICAgZmxvYXQgYzIgPSBhMipEaXJlY3Rpb25faW1nLng7CisgICAgZmxvYXQgYzEgPSAtRGlyZWN0aW9uX2ltZy55OworICAgIGZsb2F0IGMwID0gRGlyZWN0aW9uX2ltZy55KiBQb2ludF9pbWcueCAtIERpcmVjdGlvbl9pbWcueCpQb2ludF9pbWcueTsKKyAgICBmbG9hdCBYWzJdOworICAgIGludCBOID0gX2N2U29sdmVFcXUydGhSKGMyLGMxLGMwLFgpOworCisgICAgaWYoTj09MCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgX2N2Q2FsY1BvaW50SW1hZ2UoJlBhcjJQb2ludDFfaW1nLCBwUGFyMlBvaW50MSwgSW52ZXJzUGFyYWJvbGEyKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZSgmUGFyMlBvaW50Ml9pbWcsIHBQYXIyUG9pbnQyLCBJbnZlcnNQYXJhYm9sYTIpOworICAgIGlmKFBhcjJQb2ludDFfaW1nLng+UGFyMlBvaW50Ml9pbWcueCkKKyAgICAgICAgX2N2U3dhcChQYXIyUG9pbnQxX2ltZyxQYXIyUG9pbnQyX2ltZyk7CisKKyAgICBpZihYWzBdPlBhcjJQb2ludDJfaW1nLnh8fFhbTi0xXTxQYXIyUG9pbnQxX2ltZy54KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBpZihYWzBdPFBhcjJQb2ludDFfaW1nLngpCisgICAgeworICAgICAgICBpZihYWzFdPFBhcjJQb2ludDJfaW1nLngpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhbMF0gPSBYWzFdOworICAgICAgICAgICAgTj0xOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSBpZihYW04tMV0+UGFyMlBvaW50Ml9pbWcueCkKKyAgICAgICAgICAgIE49MTsKKyAgICAKKyAgICBmbG9hdCBJbnZlcnNQYXJhYm9sYTFbNl07CisgICAgQ3ZQb2ludEZsb2F0IFBhcjFQb2ludDFfaW1nOworICAgIF9jdkNhbGNPcnRvZ0ludmVyc2UoSW52ZXJzUGFyYWJvbGExLCBQYXJhYm9sYTEpOworICAgIF9jdkNhbGNQb2ludEltYWdlKCZQYXIxUG9pbnQxX2ltZywgcFBhcjFQb2ludDEsIEludmVyc1BhcmFib2xhMSk7CisgICAgZmxvYXQgSW52UGFyMV9QYXIyWzZdOworICAgIF9jdkNhbGNDb21wb3NpdGlvbihJbnZQYXIxX1BhcjIsSW52ZXJzUGFyYWJvbGExLFBhcmFib2xhMik7CisgICAgZm9yKGk9MDtpPE47aSsrKQorICAgICAgICBYW2ldID0gKEludlBhcjFfUGFyMlsxXSphMipYW2ldICsgSW52UGFyMV9QYXIyWzBdKSpYW2ldICsgIEludlBhcjFfUGFyMlsyXTsKKworICAgIGlmKE4hPTEpCisgICAgeworICAgICAgICBpZigoWFswXT5YWzFdICYmIEludGVyc2VjdGlvbk51bWJlciA9PSAxKXx8CisgICAgICAgICAgICAoWFswXTxYWzFdICYmIEludGVyc2VjdGlvbk51bWJlciA9PSAyKSkKKyAgICAgICAgICAgIF9jdlN3YXAoWFswXSwgWFsxXSk7CisgICAgfQorICAgICAgICAgICAgCisKKyAgICBmb3IoaSA9IDA7aTxOO2krKykKKyAgICB7CisgICAgICAgIFBvaW50LnggPSAoZmxvYXQpWFtpXTsKKyAgICAgICAgUG9pbnQueSA9IChmbG9hdClhMSpQb2ludC54KlBvaW50Lng7CisgICAgICAgIGlmKFBvaW50LnggPCBQYXIxUG9pbnQxX2ltZy54IC0gTEVFX0NPTlNUX0FDQ0VQVEFCTEVfRVJST1IpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYoaT09TikKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAKKyAgICBSYWRpdXMgPSBQb2ludC55ICsgMS5mLyg0KmExKTsKKyAgICBfY3ZDYWxjUG9pbnRJbWFnZShwUG9pbnQsJlBvaW50LFBhcmFib2xhMSk7CisgICAgZmxvYXQgZGlzdCA9IFBvaW50LnggLSBQYXIxUG9pbnQxX2ltZy54OworICAgIGlmKEludGVyc2VjdGlvbk51bWJlciA9PSAyICYmIGRpc3QgPCBMRUVfQ09OU1RfRElGRl9QT0lOVFMpCisgICAgICAgIHJldHVybiAtMTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBkaXN0OworfS8vIGVuZCBvZiBfY3ZQYXJfQ2xvc2VQYXJJbnRlcnNlY3Rpb24KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YnNpZGlhcnkgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCitDVl9JTkxJTkUKK3ZvaWQgX2N2TWFrZVR3aW5FZGdlKHBDdlZvcm9ub2lFZGdlIHBFZGdlMiwKKyAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UxKQoreworICAgIHBFZGdlMi0+ZGlyZWN0aW9uID0gcEVkZ2UxLT5kaXJlY3Rpb247CisgICAgcEVkZ2UyLT5wYXJhYm9sYSA9IHBFZGdlMS0+cGFyYWJvbGE7CisgICAgcEVkZ2UyLT5ub2RlMSA9IHBFZGdlMS0+bm9kZTI7CisgICAgcEVkZ2UyLT50d2luX2VkZ2UgPSBwRWRnZTE7CisgICAgcEVkZ2UxLT50d2luX2VkZ2UgPSBwRWRnZTI7Cit9Ly9lbmQgb2YgX2N2TWFrZVR3aW5FZGdlCisKK0NWX0lOTElORQordm9pZCBfY3ZTdGlja0VkZ2VMZWZ0QmVnaW4ocEN2Vm9yb25vaUVkZ2UgcEVkZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9sZWZ0X3ByZXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX2xlZnQpCit7CisgICAgcEVkZ2UtPnByZXZfZWRnZSA9IHBFZGdlX2xlZnRfcHJldjsKKyAgICBwRWRnZS0+c2l0ZSA9IHBTaXRlX2xlZnQ7CisgICAgaWYocEVkZ2VfbGVmdF9wcmV2ID09IE5VTEwpCisgICAgICAgIHBTaXRlX2xlZnQtPmVkZ2UyID0gcEVkZ2U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEVkZ2VfbGVmdF9wcmV2LT5ub2RlMiA9IHBFZGdlLT5ub2RlMTsKKyAgICAgICAgcEVkZ2VfbGVmdF9wcmV2LT5uZXh0X2VkZ2UgPSBwRWRnZTsKKyAgICB9Cit9Ly9lbmQgb2YgX2N2U3RpY2tFZGdlTGVmdEJlZ2luCisKK0NWX0lOTElORQordm9pZCBfY3ZTdGlja0VkZ2VSaWdodEJlZ2luKHBDdlZvcm9ub2lFZGdlIHBFZGdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHRfbmV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfcmlnaHQpCit7CisgICAgcEVkZ2UtPm5leHRfZWRnZSA9IHBFZGdlX3JpZ2h0X25leHQ7CisgICAgcEVkZ2UtPnNpdGUgPSBwU2l0ZV9yaWdodDsKKyAgICBpZihwRWRnZV9yaWdodF9uZXh0ID09IE5VTEwpCisgICAgICAgIHBTaXRlX3JpZ2h0LT5lZGdlMSA9IHBFZGdlOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBFZGdlX3JpZ2h0X25leHQtPm5vZGUxID0gcEVkZ2UtPm5vZGUyOworICAgICAgICBwRWRnZV9yaWdodF9uZXh0LT5wcmV2X2VkZ2UgPSBwRWRnZTsKKyAgICB9Cit9Ly8gZW5kIG9mIF9jdlN0aWNrRWRnZVJpZ2h0QmVnaW4KKworQ1ZfSU5MSU5FCit2b2lkIF9jdlN0aWNrRWRnZUxlZnRFbmQocEN2Vm9yb25vaUVkZ2UgcEVkZ2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfbGVmdF9uZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFNpdGVfbGVmdCkKK3sKKyAgICBwRWRnZS0+bmV4dF9lZGdlID0gcEVkZ2VfbGVmdF9uZXh0OworICAgIGlmKHBFZGdlX2xlZnRfbmV4dCA9PSBOVUxMKQorICAgICAgICBwU2l0ZV9sZWZ0LT5lZGdlMSA9IHBFZGdlOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBFZGdlX2xlZnRfbmV4dC0+bm9kZTEgPSBwRWRnZS0+bm9kZTI7CisgICAgICAgIHBFZGdlX2xlZnRfbmV4dC0+cHJldl9lZGdlID0gcEVkZ2U7CisgICAgfQorfS8vZW5kIG9mIF9jdlN0aWNrRWRnZUxlZnRFbmQKKworQ1ZfSU5MSU5FCit2b2lkIF9jdlN0aWNrRWRnZVJpZ2h0RW5kKHBDdlZvcm9ub2lFZGdlIHBFZGdlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pRWRnZSBwRWRnZV9yaWdodF9wcmV2LAorICAgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lTaXRlIHBTaXRlX3JpZ2h0KQoreworICAgIHBFZGdlLT5wcmV2X2VkZ2UgPSBwRWRnZV9yaWdodF9wcmV2OworICAgIGlmKHBFZGdlX3JpZ2h0X3ByZXYgPT0gTlVMTCkKKyAgICAgICAgcFNpdGVfcmlnaHQtPmVkZ2UyID0gcEVkZ2U7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEVkZ2VfcmlnaHRfcHJldi0+bm9kZTIgPSBwRWRnZS0+bm9kZTE7CisgICAgICAgIHBFZGdlX3JpZ2h0X3ByZXYtPm5leHRfZWRnZSA9IHBFZGdlOworICAgIH0KK30vL2VuZCBvZiBfY3ZTdGlja0VkZ2VSaWdodEVuZAorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ1ZfSU5MSU5FCit2b2lkIF9jdkluaXRWb3Jvbm9pTm9kZShwQ3ZWb3Jvbm9pTm9kZSBwTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFQgcFBvaW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhZGl1cykKK3sKKyAgICBwTm9kZS0+bm9kZS54ID0gKGZsb2F0KXBQb2ludC0+eDsKKyAgICBwTm9kZS0+bm9kZS55ID0gKGZsb2F0KXBQb2ludC0+eTsKKyAgICBwTm9kZS0+cmFkaXVzID0gcmFkaXVzOworfS8vZW5kIG9mIF9jdkluaXRWb3Jvbm9pTm9kZQorCitDVl9JTkxJTkUKK3ZvaWQgX2N2SW5pdFZvcm9ub2lTaXRlKHBDdlZvcm9ub2lTaXRlIHBTaXRlLAorICAgICAgICAgICAgICAgICAgICAgICBwQ3ZWb3Jvbm9pTm9kZSBwTm9kZTEsCisgICAgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lOb2RlIHBOb2RlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaVNpdGUgcFByZXZfc2l0ZSkKK3sKKyAgICBwU2l0ZS0+bm9kZTEgPSBwTm9kZTE7CisgICAgcFNpdGUtPm5vZGUyID0gcE5vZGUyOworICAgIHBTaXRlLT5wcmV2X3NpdGUgPSBwUHJldl9zaXRlOworfS8vZW5kIG9mIF9jdkluaXRWb3Jvbm9pU2l0ZQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ1ZfSU5MSU5FIAorVCBfY3ZTZXFQdXNoKEN2U2VxKiBTZXEsIFQgcEVsZW0pCit7CisgICAgY3ZTZXFQdXNoKFNlcSwgcEVsZW0pOworICAgIHJldHVybiAoVCkoU2VxLT5wdHIgLSBTZXEtPmVsZW1fc2l6ZSk7CisvLyAgcmV0dXJuIChUKWN2R2V0U2VxRWxlbShTZXEsIFNlcS0+dG90YWwgLSAxLE5VTEwpOworfS8vZW5kIG9mIF9jdlNlcVB1c2gKKwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQorVCBfY3ZTZXFQdXNoRnJvbnQoQ3ZTZXEqIFNlcSwgVCBwRWxlbSkKK3sKKyAgICBjdlNlcVB1c2hGcm9udChTZXEscEVsZW0pOworICAgIHJldHVybiAoVClTZXEtPmZpcnN0LT5kYXRhOworLy8gIHJldHVybiAoVCljdkdldFNlcUVsZW0oU2VxLDAsTlVMTCk7Cit9Ly9lbmQgb2YgX2N2U2VxUHVzaEZyb250CisKK0NWX0lOTElORQordm9pZCBfY3ZUd2luTlVMTExlZnQocEN2Vm9yb25vaUVkZ2UgcEVkZ2VfbGVmdF9jdXIsCisgICAgICAgICAgICAgICAgICAgIHBDdlZvcm9ub2lFZGdlIHBFZGdlX2xlZnQpCit7CisgICAgd2hpbGUocEVkZ2VfbGVmdF9jdXIhPXBFZGdlX2xlZnQpCisgICAgeworICAgICAgICBpZihwRWRnZV9sZWZ0X2N1ci0+dHdpbl9lZGdlIT1OVUxMKQorICAgICAgICAgICAgcEVkZ2VfbGVmdF9jdXItPnR3aW5fZWRnZS0+dHdpbl9lZGdlID0gTlVMTDsKKyAgICAgICAgcEVkZ2VfbGVmdF9jdXIgPSBwRWRnZV9sZWZ0X2N1ci0+bmV4dF9lZGdlOworICAgIH0KK30vL2VuZCBvZiBfY3ZUd2luTlVMTExlZnQKKworQ1ZfSU5MSU5FCit2b2lkIF9jdlR3aW5OVUxMUmlnaHQocEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHRfY3VyLAorICAgICAgICAgICAgICAgICAgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2VfcmlnaHQpCit7CisgICAgd2hpbGUocEVkZ2VfcmlnaHRfY3VyIT1wRWRnZV9yaWdodCkKKyAgICB7CisgICAgICAgIGlmKHBFZGdlX3JpZ2h0X2N1ci0+dHdpbl9lZGdlIT1OVUxMKQorICAgICAgICAgICAgcEVkZ2VfcmlnaHRfY3VyLT50d2luX2VkZ2UtPnR3aW5fZWRnZSA9IE5VTEw7CisgICAgICAgIHBFZGdlX3JpZ2h0X2N1ciA9IHBFZGdlX3JpZ2h0X2N1ci0+cHJldl9lZGdlOworICAgIH0KK30vL2VuZCBvZiBfY3ZUd2luTlVMTFJpZ2h0CisKK0NWX0lOTElORQordm9pZCBfY3ZTZXFQdXNoSW5PcmRlcihDdlZvcm9ub2lEaWFncmFtSW50KiBwVm9yb25vaURpYWdyYW0sIHBDdlZvcm9ub2lIb2xlIHBIb2xlKQoreworICAgIHBIb2xlID0gX2N2U2VxUHVzaChwVm9yb25vaURpYWdyYW0tPkhvbGVTZXEsIHBIb2xlKTsKKyAgICBpZihwVm9yb25vaURpYWdyYW0tPkhvbGVTZXEtPnRvdGFsID09IDEpCisgICAgeworICAgICAgICBwVm9yb25vaURpYWdyYW0tPnRvcF9ob2xlID0gcEhvbGU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwQ3ZWb3Jvbm9pSG9sZSBwVG9wSG9sZSA9IHBWb3Jvbm9pRGlhZ3JhbS0+dG9wX2hvbGU7CisgICAgcEN2Vm9yb25vaUhvbGUgcEN1cnJIb2xlOworICAgIGlmKHBUb3BIb2xlLT54X2Nvb3JkID49IHBIb2xlLT54X2Nvb3JkKQorICAgIHsKKyAgICAgICAgcEhvbGUtPm5leHRfaG9sZSA9IHBUb3BIb2xlOworICAgICAgICBwVm9yb25vaURpYWdyYW0tPnRvcF9ob2xlID0gcEhvbGU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBmb3IocEN1cnJIb2xlID0gcFRvcEhvbGU7IFwKKyAgICAgICAgcEN1cnJIb2xlLT5uZXh0X2hvbGUgIT0gTlVMTDsgXAorICAgICAgICBwQ3VyckhvbGUgPSBwQ3VyckhvbGUtPm5leHRfaG9sZSkKKyAgICAgICAgaWYocEN1cnJIb2xlLT5uZXh0X2hvbGUtPnhfY29vcmQgPj0gcEhvbGUtPnhfY29vcmQpCisgICAgICAgICAgICBicmVhazsKKyAgICBwSG9sZS0+bmV4dF9ob2xlID0gcEN1cnJIb2xlLT5uZXh0X2hvbGU7CisgICAgcEN1cnJIb2xlLT5uZXh0X2hvbGUgPSBwSG9sZTsKK30vL2VuZCBvZiBfY3ZTZXFQdXNoSW5PcmRlcgorCitDVl9JTkxJTkUKK3BDdlZvcm9ub2lFZGdlIF9jdkRpdmlkZVJpZ2h0RWRnZShwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSxwQ3ZWb3Jvbm9pTm9kZSBwTm9kZSwgQ3ZTZXEqIEVkZ2VTZXEpCit7CisgICAgQ3ZWb3Jvbm9pRWRnZUludCBFZGdlMSA9ICpwRWRnZTsKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2UyID0gKnBFZGdlLT50d2luX2VkZ2U7CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLCBwRWRnZTI7CisgICAgCisgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZTEpOworICAgIHBFZGdlMiA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2UyKTsKKworICAgIGlmKHBFZGdlMS0+bmV4dF9lZGdlICE9IE5VTEwpCisgICAgICAgIHBFZGdlMS0+bmV4dF9lZGdlLT5wcmV2X2VkZ2UgPSBwRWRnZTE7CisgICAgcEVkZ2UxLT5wcmV2X2VkZ2UgPSBOVUxMOworCisgICAgaWYocEVkZ2UyLT5wcmV2X2VkZ2UgIT0gTlVMTCkKKyAgICAgICAgcEVkZ2UyLT5wcmV2X2VkZ2UtPm5leHRfZWRnZSA9IHBFZGdlMjsKKyAgICBwRWRnZTItPm5leHRfZWRnZSA9IE5VTEw7CisKKyAgICBwRWRnZTEtPm5vZGUxID0gcEVkZ2UyLT5ub2RlMj0gcE5vZGU7CisgICAgcEVkZ2UxLT50d2luX2VkZ2UgPSBwRWRnZTI7CisgICAgcEVkZ2UyLT50d2luX2VkZ2UgPSBwRWRnZTE7CisgICAgcmV0dXJuIHBFZGdlMjsKK30vL2VuZCBvZiBfY3ZEaXZpZGVSaWdodEVkZ2UKKworQ1ZfSU5MSU5FCitwQ3ZWb3Jvbm9pRWRnZSBfY3ZEaXZpZGVMZWZ0RWRnZShwQ3ZWb3Jvbm9pRWRnZSBwRWRnZSxwQ3ZWb3Jvbm9pTm9kZSBwTm9kZSwgQ3ZTZXEqIEVkZ2VTZXEpCit7CisgICAgQ3ZWb3Jvbm9pRWRnZUludCBFZGdlMSA9ICpwRWRnZTsKKyAgICBDdlZvcm9ub2lFZGdlSW50IEVkZ2UyID0gKnBFZGdlLT50d2luX2VkZ2U7CisgICAgcEN2Vm9yb25vaUVkZ2UgcEVkZ2UxLCBwRWRnZTI7CisgICAgCisgICAgcEVkZ2UxID0gX2N2U2VxUHVzaChFZGdlU2VxLCAmRWRnZTEpOworICAgIHBFZGdlMiA9IF9jdlNlcVB1c2goRWRnZVNlcSwgJkVkZ2UyKTsKKworICAgIGlmKHBFZGdlMi0+bmV4dF9lZGdlICE9IE5VTEwpCisgICAgICAgIHBFZGdlMi0+bmV4dF9lZGdlLT5wcmV2X2VkZ2UgPSBwRWRnZTI7CisgICAgcEVkZ2UyLT5wcmV2X2VkZ2UgPSBOVUxMOworCisgICAgaWYocEVkZ2UxLT5wcmV2X2VkZ2UgIT0gTlVMTCkKKyAgICAgICAgcEVkZ2UxLT5wcmV2X2VkZ2UtPm5leHRfZWRnZSA9IHBFZGdlMTsKKyAgICBwRWRnZTEtPm5leHRfZWRnZSA9IE5VTEw7CisgICAgCisgICAgcEVkZ2UxLT5ub2RlMiA9IHBFZGdlMi0+bm9kZTE9IHBOb2RlOworICAgIHBFZGdlMS0+dHdpbl9lZGdlID0gcEVkZ2UyOworICAgIHBFZGdlMi0+dHdpbl9lZGdlID0gcEVkZ2UxOworICAgIHJldHVybiBwRWRnZTI7Cit9Ly9lbmQgb2YgX2N2RGl2aWRlTGVmdEVkZ2UKKwordGVtcGxhdGU8Y2xhc3MgVD4gQ1ZfSU5MSU5FCitUIF9jdldyaXRlU2VxRWxlbShUIHBFbGVtLCBDdlNlcVdyaXRlciAmd3JpdGVyKQoreworICAgIGlmKCB3cml0ZXIucHRyID49IHdyaXRlci5ibG9ja19tYXggKSAgICAgICAgCisgICAgICAgICAgY3ZDcmVhdGVTZXFCbG9jayggJndyaXRlcik7IAorCisgICAgVCBwdHIgPSAoVCl3cml0ZXIucHRyOworICAgIG1lbWNweSh3cml0ZXIucHRyLCBwRWxlbSwgc2l6ZW9mKCpwRWxlbSkpOyAgICAgIAorICAgIHdyaXRlci5wdHIgKz0gc2l6ZW9mKCpwRWxlbSk7ICAgCisgICAgcmV0dXJuIHB0cjsKK30vL2VuZCBvZiBfY3ZXcml0ZVNlcUVsZW0KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCit0ZW1wbGF0ZTxjbGFzcyBUPiBDVl9JTkxJTkUKK3ZvaWQgX2N2Q2FsY1BvaW50SW1hZ2UocEN2UG9pbnRGbG9hdCBwSW1nUG9pbnQscEN2UG9pbnRGbG9hdCBwUG9pbnQsVCogQSkKK3sKKyAgICBwSW1nUG9pbnQtPnggPSAoZmxvYXQpKEFbMF0qcFBvaW50LT54ICsgQVsxXSpwUG9pbnQtPnkgKyBBWzJdKTsKKyAgICBwSW1nUG9pbnQtPnkgPSAoZmxvYXQpKEFbM10qcFBvaW50LT54ICsgQVs0XSpwUG9pbnQtPnkgKyBBWzVdKTsKK30vL2VuZCBvZiBfY3ZDYWxjUG9pbnRJbWFnZQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ1ZfSU5MSU5FCit2b2lkIF9jdlN3YXAoVCAmeCwgVCAmeSkKK3sKKyAgICBUIHo7IHo9eDsgeD15OyB5PXo7Cit9Ly9lbmQgb2YgX2N2U3dhcAorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gQ1ZfSU5MSU5FCitpbnQgX2N2Q2FsY09ydG9nSW52ZXJzZShUKiBCLCBUKiBBKQoreworICAgIGludCBzaWduX2RldCA9IFNJR04oQVswXSpBWzRdIC0gQVsxXSpBWzNdKTsKKworICAgIGlmKHNpZ25fZGV0KQorICAgIHsKKyAgICAgICAgQlswXSA9ICBBWzRdKnNpZ25fZGV0OworICAgICAgICBCWzFdID0gLUFbMV0qc2lnbl9kZXQ7CisgICAgICAgIEJbM10gPSAtQVszXSpzaWduX2RldDsKKyAgICAgICAgQls0XSA9ICBBWzBdKnNpZ25fZGV0OworICAgICAgICBCWzJdID0gLSAoQlswXSpBWzJdK0JbMV0qQVs1XSk7CisgICAgICAgIEJbNV0gPSAtIChCWzNdKkFbMl0rQls0XSpBWzVdKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9Ly9lbmQgb2YgX2N2Q2FsY09ydG9nSW52ZXJzZQorCit0ZW1wbGF0ZTxjbGFzcyBUPiBDVl9JTkxJTkUgCit2b2lkIF9jdkNhbGNWZWN0b3JJbWFnZShwQ3ZEaXJlY3Rpb24gcEltZ1ZlY3RvcixwQ3ZEaXJlY3Rpb24gcFZlY3RvcixUKiBBKQoreworICAgIHBJbWdWZWN0b3ItPnggPSBBWzBdKnBWZWN0b3ItPnggKyBBWzFdKnBWZWN0b3ItPnk7CisgICAgcEltZ1ZlY3Rvci0+eSA9IEFbM10qcFZlY3Rvci0+eCArIEFbNF0qcFZlY3Rvci0+eTsKK30vL2VuZCBvZiBfY3ZDYWxjVmVjdG9ySW1hZ2UKKwordGVtcGxhdGUgPGNsYXNzIFQ+IENWX0lOTElORQordm9pZCBfY3ZDYWxjQ29tcG9zaXRpb24oVCogUmVzdWx0LFQqIEEsVCogQikKK3sKKyAgICBSZXN1bHRbMF0gPSBBWzBdKkJbMF0gKyBBWzFdKkJbM107CisgICAgUmVzdWx0WzFdID0gQVswXSpCWzFdICsgQVsxXSpCWzRdOworICAgIFJlc3VsdFszXSA9IEFbM10qQlswXSArIEFbNF0qQlszXTsKKyAgICBSZXN1bHRbNF0gPSBBWzNdKkJbMV0gKyBBWzRdKkJbNF07CisgICAgUmVzdWx0WzJdID0gQVswXSpCWzJdICsgQVsxXSpCWzVdICsgQVsyXTsKKyAgICBSZXN1bHRbNV0gPSBBWzNdKkJbMl0gKyBBWzRdKkJbNV0gKyBBWzVdOworfS8vZW5kIG9mIF9jdkNhbGNDb21wb3NpdGlvbgorCitDVl9JTkxJTkUKK2Zsb2F0IF9jdkNhbGNEaXN0KHBDdlBvaW50RmxvYXQgcFBvaW50LCBwQ3ZWb3Jvbm9pU2l0ZSBwU2l0ZSkKK3sKKyAgICBpZihwU2l0ZS0+bm9kZTE9PXBTaXRlLT5ub2RlMikKKyAgICAgICAgcmV0dXJuIF9jdlBQRGlzdChwUG9pbnQsJihwU2l0ZS0+bm9kZTEtPm5vZGUpKTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBfY3ZQTERpc3QocFBvaW50LCYocFNpdGUtPm5vZGUxLT5ub2RlKSxwU2l0ZS0+ZGlyZWN0aW9uKTsKK30vL2VuZCBvZiBfY3ZDYWxjQ29tcG9zaXRpb24KKworQ1ZfSU5MSU5FCitmbG9hdCBfY3ZQUERpc3QocEN2UG9pbnRGbG9hdCBwUG9pbnQxLHBDdlBvaW50RmxvYXQgcFBvaW50MikKK3sKKyAgICBmbG9hdCBkZWx0YV94ID0gcFBvaW50MS0+eCAtIHBQb2ludDItPng7CisgICAgZmxvYXQgZGVsdGFfeSA9IHBQb2ludDEtPnkgLSBwUG9pbnQyLT55OworICAgIHJldHVybiAoZmxvYXQpc3FydCgoZG91YmxlKWRlbHRhX3gqZGVsdGFfeCArIGRlbHRhX3kqZGVsdGFfeSk7Cit9Ly9lbmQgb2YgX2N2UFBEaXN0CisKKworQ1ZfSU5MSU5FCitmbG9hdCBfY3ZQTERpc3QocEN2UG9pbnRGbG9hdCBwUG9pbnQscEN2UG9pbnRGbG9hdCBwUG9pbnQxLHBDdkRpcmVjdGlvbiBwRGlyZWN0aW9uKQoreworICAgIHJldHVybiAoZmxvYXQpZmFicyhwRGlyZWN0aW9uLT54KihwUG9pbnQtPnkgLSBwUG9pbnQxLT55KSAtCisgICAgICAgICAgICAgICAgICAgICBwRGlyZWN0aW9uLT55KihwUG9pbnQtPnggLSBwUG9pbnQxLT54KSk7Cit9Ly9lbmQgb2YgX2N2UExEaXN0CisKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW50IF9jdlNvbHZlRXF1MnRoUihUIGMyLCBUIGMxLCBUIGMwLCBUKiBYKQoreworICAgIGNvbnN0IFQgZXBzID0gKFQpMWUtNjsKKyAgICBpZihmYWJzKGMyKTxlcHMpCisgICAgICAgIHJldHVybiBfY3ZTb2x2ZUVxdTF0aChjMSxjMCxYKTsKKworICAgIFQgRGlzY3IgPSBjMSpjMSAtIGMyKmMwKjQ7CisgICAgaWYoRGlzY3I8LWVwcykKKyAgICAgICAgcmV0dXJuIDA7CisgICAgRGlzY3IgPSAoVClzcXJ0KChkb3VibGUpZmFicyhEaXNjcikpOworCisgICAgaWYoZmFicyhEaXNjcik8ZXBzKQorICAgIHsKKyAgICAgICAgWFswXSA9IC1jMS8oYzIqMik7CisgICAgICAgIGlmKGZhYnMoWFswXSk8ZXBzKQorICAgICAgICAgICAgWFswXT0wOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoYzEgPj0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZihjMj4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhbMF0gPSAoLWMxIC0gRGlzY3IpLygyKmMyKTsKKyAgICAgICAgICAgICAgICBYWzFdID0gLTIqYzAvKGMxK0Rpc2NyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYWzFdID0gKC1jMSAtIERpc2NyKS8oMipjMik7CisgICAgICAgICAgICAgICAgWFswXSA9IC0yKmMwLyhjMStEaXNjcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZihjMj4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFhbMV0gPSAoLWMxICsgRGlzY3IpLygyKmMyKTsKKyAgICAgICAgICAgICAgICBYWzBdID0gLTIqYzAvKGMxLURpc2NyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBYWzBdID0gKC1jMSArIERpc2NyKS8oMipjMik7CisgICAgICAgICAgICAgICAgWFsxXSA9IC0yKmMwLyhjMS1EaXNjcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Ly9lbmQgb2YgX2N2U29sdmVFcXUydGhSICAgCisKK3RlbXBsYXRlIDxjbGFzcyBUPiBDVl9JTkxJTkUKK2ludCBfY3ZTb2x2ZUVxdTF0aChUIGMxLCBUIGMwLCBUKiBYKQoreworICAgIGNvbnN0IFQgZXBzID0gKFQpMWUtNjsKKyAgICBpZihmYWJzKGMxKTxlcHMpCisgICAgICAgIHJldHVybiAwOworCisgICAgWFswXSA9IC1jMC9jMTsKKyAgICByZXR1cm4gMTsKK30vL2VuZCBvZiBfY3ZTb2x2ZUVxdTF0aApkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2bGV2bWFyLmNwcCBiL2N2YXV4L3NyYy9jdmxldm1hci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhhODUyOQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmxldm1hci5jcHAKQEAgLTAsMCArMSwzMjAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisjaW5jbHVkZSAiY3Z0eXBlcy5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAiY3YuaCIKKworLyogVmFsZXJ5IE1vc3lhZ2luICovCisKKy8vI2RlZmluZSBUUkFDS0xFVk1BUgorCit0eXBlZGVmIHZvaWQgKCpwb2ludGVyX0xNSmFjKSggY29uc3QgQ3ZNYXQqIHNyYywgQ3ZNYXQqIGRzdCApOwordHlwZWRlZiB2b2lkICgqcG9pbnRlcl9MTUZ1bmMpKCBjb25zdCBDdk1hdCogc3JjLCBDdk1hdCogZHN0ICk7CisKKy8qIE9wdGltaXphdGlvbiB1c2luZyBMZXZlbmJlcmctTWFycXVhcmR0ICovCit2b2lkIGN2TGV2ZW5iZXJnTWFycXVhcmR0T3B0aW1pemF0aW9uKHBvaW50ZXJfTE1KYWMgSmFjb2JpYW5GdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfTE1GdW5jIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwb2ludGVyX0VyciBlcnJvcl9mdW5jdGlvbiwqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKlgwLEN2TWF0ICpvYnNlcnZSZXMsQ3ZNYXQgKnJlc3VsdFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SXRlcixkb3VibGUgZXBzaWxvbikKK3sKKyAgICAvKiBUaGlzIGlzIG5vdCBzcGFyY2UgbWV0aG9kICovCisgICAgLyogTWFrZSBvcHRpbWl6YXRpb24gdXNpbmcgICovCisgICAgLyogZnVuYyAtIGZ1bmN0aW9uIHRvIGNvbXB1dGUgKi8KKyAgICAvKiB1c2VzIGZ1bmN0aW9uIHRvIGNvbXB1dGUgamFjb2JpYW4gKi8KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICAgIEN2TWF0ICp2ZWN0WCA9IDA7CisgICAgQ3ZNYXQgKnZlY3ROZXdYID0gMDsKKyAgICBDdk1hdCAqcmVzRnVuYyA9IDA7CisgICAgQ3ZNYXQgKnJlc05ld0Z1bmMgPSAwOworICAgIEN2TWF0ICplcnJvciA9IDA7CisgICAgQ3ZNYXQgKmVycm9yTmV3ID0gMDsKKyAgICBDdk1hdCAqSmFjID0gMDsKKyAgICBDdk1hdCAqZGVsdGEgPSAwOworICAgIEN2TWF0ICptYXRySnRKID0gMDsKKyAgICBDdk1hdCAqbWF0ckp0Sk4gPSAwOworICAgIEN2TWF0ICptYXRySnQgPSAwOworICAgIEN2TWF0ICp2ZWN0QiA9IDA7CisgICAKKyAgICBDVl9GVU5DTkFNRSggImN2TGV2ZW5iZWdyTWFycXVhcmR0T3B0aW1pemF0aW9uIiApOworICAgIF9fQkVHSU5fXzsKKworCisgICAgaWYoIEphY29iaWFuRnVuY3Rpb24gPT0gMCB8fCBmdW5jdGlvbiA9PSAwIHx8IFgwID09IDAgfHwgb2JzZXJ2UmVzID09IDAgfHwgcmVzdWx0WCA9PSAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKFgwKSB8fCAhQ1ZfSVNfTUFUKG9ic2VydlJlcykgfHwgIUNWX0lTX01BVChyZXN1bHRYKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJTb21lIG9mIGlucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworCisgICAgaW50IG51bVZhbDsKKyAgICBpbnQgbnVtRnVuYzsKKyAgICBkb3VibGUgdmFsRXJyb3I7CisgICAgZG91YmxlIHZhbE5ld0Vycm9yOworCisgICAgbnVtVmFsID0gWDAtPnJvd3M7CisgICAgbnVtRnVuYyA9IG9ic2VydlJlcy0+cm93czsKKworICAgIC8qIHRlc3QgaW5wdXQgZGF0YSAqLworICAgIGlmKCBYMC0+Y29scyAhPSAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBjb2xvbW4gb2YgdmVjdG9yIFgwIG11c3QgYmUgMSIgKTsKKyAgICB9CisgICAgCisgICAgaWYoIG9ic2VydlJlcy0+Y29scyAhPSAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBjb2xvbW4gb2YgdmVjdG9yIG9ic2VydmVkIHJ1c3VsdCBtdXN0IGJlIDEiICk7CisgICAgfQorCisgICAgaWYoIHJlc3VsdFgtPmNvbHMgIT0gMSB8fCByZXN1bHRYLT5yb3dzICE9IG51bVZhbCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHJlc3VsdCB2ZWN0b3IgWCBtdXN0IGJlIGVxdWFscyB0byBYMCIgKTsKKyAgICB9CisKKyAgICBpZiggbWF4SXRlciA8PSAwICApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgbWF4aW11bSBpdGVyYXRpb24gbXVzdCBiZSA+IDAiICk7CisgICAgfQorCisgICAgaWYoIGVwc2lsb24gPCAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIkVwc2lsb24gbXVzdCBiZSA+PSAwIiApOworICAgIH0KKworICAgIC8qIGNvcHkgeDAgdG8gY3VycmVudCB2YWx1ZSBvZiB4ICovCisgICAgQ1ZfQ0FMTCggdmVjdFggICAgICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggdmVjdE5ld1ggICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggcmVzRnVuYyAgICA9IGN2Q3JlYXRlTWF0KG51bUZ1bmMsMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggcmVzTmV3RnVuYyA9IGN2Q3JlYXRlTWF0KG51bUZ1bmMsMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggZXJyb3IgICAgICA9IGN2Q3JlYXRlTWF0KG51bUZ1bmMsMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggZXJyb3JOZXcgICA9IGN2Q3JlYXRlTWF0KG51bUZ1bmMsMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggSmFjICAgICAgICA9IGN2Q3JlYXRlTWF0KG51bUZ1bmMsbnVtVmFsLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggZGVsdGEgICAgICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgMSwgICAgICBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0ckp0SiAgICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgbnVtVmFsLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0ckp0Sk4gICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgbnVtVmFsLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0ckp0ICAgICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgbnVtRnVuYyxDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggdmVjdEIgICAgICA9IGN2Q3JlYXRlTWF0KG51bVZhbCwgMSwgICAgICBDVl82NEYpICk7CisKKyAgICBjdkNvcHkoWDAsdmVjdFgpOworCisgICAgLyogPT09PT09PT09PSBNYWluIG9wdGltaXphdGlvbiBsb29wID09PT09PT09PT09PSAqLworICAgIGRvdWJsZSBjaGFuZ2U7CisgICAgaW50IGN1cnJJdGVyOworICAgIGRvdWJsZSBhbHBoYTsKKworICAgIGNoYW5nZSA9IDE7CisgICAgY3Vyckl0ZXIgPSAwOworICAgIGFscGhhID0gMC4wMDE7CisKKyAgICBkbyB7CisKKyAgICAgICAgLyogQ29tcHV0ZSB2YWx1ZSBvZiBmdW5jdGlvbiAqLworICAgICAgICBmdW5jdGlvbih2ZWN0WCxyZXNGdW5jKTsKKyAgICAgICAgLyogUHJpbnQgcmVzdWx0IG9mIGZ1bmN0aW9uIHRvIGZpbGUgKi8KKworICAgICAgICAvKiBDb21wdXRlIGVycm9yICovCisgICAgICAgIGN2U3ViKG9ic2VydlJlcyxyZXNGdW5jLGVycm9yKTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgLy92YWxFcnJvciA9IGVycm9yX2Z1bmN0aW9uKG9ic2VydlJlcyxyZXNGdW5jKTsKKyAgICAgICAgLyogTmVlZCB0byB1c2UgbmV3IHZlcnNpb24gb2YgY29tcHV0aW5nIGVycm9yIChub3JtKSAqLworICAgICAgICB2YWxFcnJvciA9IGN2Tm9ybShvYnNlcnZSZXMscmVzRnVuYyk7CisKKyAgICAgICAgLyogQ29tcHV0ZSBKYWNvYmlhbiBmb3IgZ2l2ZW4gcG9pbnQgdmVjdFggKi8KKyAgICAgICAgSmFjb2JpYW5GdW5jdGlvbih2ZWN0WCxKYWMpOworCisgICAgICAgIC8qIERlZmluZSBvcHRpbWFsIGRlbHRhIGZvciBKJypKKmRlbHRhPUonKmVycm9yICovCisgICAgICAgIC8qIGNvbXB1dGUgSidKICovCisgICAgICAgIGN2TXVsVHJhbnNwb3NlZChKYWMsbWF0ckp0SiwxKTsKKyAgICAgICAgCisgICAgICAgIGN2Q29weShtYXRySnRKLG1hdHJKdEpOKTsKKworICAgICAgICAvKiBjb21wdXRlIEonKmVycm9yICovCisgICAgICAgIGN2VHJhbnNwb3NlKEphYyxtYXRySnQpOworICAgICAgICBjdm1NdWwobWF0ckp0LGVycm9yLHZlY3RCKTsKKworCisgICAgICAgIC8qIFNvbHZlIG5vcm1hbCBlcXVhdGlvbiBmb3IgZ2l2ZW4gYWxwaGEgYW5kIEphY29iaWFuICovCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIEluY3JlYXNlIGRpYWdvbmFsIGVsZW1lbnRzIGJ5IGFscGhhICovCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG51bVZhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgIHZhbCA9IGN2bUdldChtYXRySnRKLGksaSk7CisgICAgICAgICAgICAgICAgY3ZtU2V0KG1hdHJKdEpOLGksaSwoMSthbHBoYSkqdmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogU29sdmUgc3lzdGVtIHRvIGRlZmluZSBkZWx0YSAqLworICAgICAgICAgICAgY3ZTb2x2ZShtYXRySnRKTix2ZWN0QixkZWx0YSxDVl9TVkQpOworCisgICAgICAgICAgICAvKiBXZSBrbm93IGRlbHRhIGFuZCB3ZSBjYW4gZGVmaW5lIG5ldyB2YWx1ZSBvZiB2ZWN0b3IgWCAqLworICAgICAgICAgICAgY3ZBZGQodmVjdFgsZGVsdGEsdmVjdE5ld1gpOworCisgICAgICAgICAgICAvKiBDb21wdXRlIHJlc3VsdCBvZiBmdW5jdGlvbiBmb3IgbmV3IHZlY3RvciBYICovCisgICAgICAgICAgICBmdW5jdGlvbih2ZWN0TmV3WCxyZXNOZXdGdW5jKTsKKyAgICAgICAgICAgIGN2U3ViKG9ic2VydlJlcyxyZXNOZXdGdW5jLGVycm9yTmV3KTsKKworICAgICAgICAgICAgdmFsTmV3RXJyb3IgPSBjdk5vcm0ob2JzZXJ2UmVzLHJlc05ld0Z1bmMpOworCisgICAgICAgICAgICBjdXJySXRlcisrOworCisgICAgICAgICAgICBpZiggdmFsTmV3RXJyb3IgPCB2YWxFcnJvciApCisgICAgICAgICAgICB7LyogYWNjZXB0IG5ldyB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHZhbEVycm9yID0gdmFsTmV3RXJyb3I7CisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIHJlbGF0aXZlIGNoYW5nZSBvZiByZXF1aXJlZCBwYXJhbWV0ZXIgdmVjdG9yWC4gY2hhbmdlID0gbm9ybShjdXJyLXByZXYpIC8gbm9ybShjdXJyKSApICAqLworICAgICAgICAgICAgICAgIGNoYW5nZSA9IGN2Tm9ybSh2ZWN0WCwgdmVjdE5ld1gsIENWX1JFTEFUSVZFX0wyKTsKKworICAgICAgICAgICAgICAgIGFscGhhIC89IDEwOworICAgICAgICAgICAgICAgIGN2Q29weSh2ZWN0TmV3WCx2ZWN0WCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWxwaGEgKj0gMTA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAoIGN1cnJJdGVyIDwgbWF4SXRlciAgKTsKKyAgICAgICAgLyogbmV3IHZhbHVlIG9mIFggYW5kIGFscGhhIHdlcmUgYWNjZXB0ZWQgKi8KKworICAgIH0gd2hpbGUgKCBjaGFuZ2UgPiBlcHNpbG9uICYmIGN1cnJJdGVyIDwgbWF4SXRlciApOworCisKKyAgICAvKiByZXN1bHQgd2FzIGNvbXB1dGVkICovCisgICAgY3ZDb3B5KHZlY3RYLHJlc3VsdFgpOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCgmdmVjdFgpOworICAgIGN2UmVsZWFzZU1hdCgmdmVjdE5ld1gpOworICAgIGN2UmVsZWFzZU1hdCgmcmVzRnVuYyk7CisgICAgY3ZSZWxlYXNlTWF0KCZyZXNOZXdGdW5jKTsKKyAgICBjdlJlbGVhc2VNYXQoJmVycm9yKTsKKyAgICBjdlJlbGVhc2VNYXQoJmVycm9yTmV3KTsKKyAgICBjdlJlbGVhc2VNYXQoJkphYyk7CisgICAgY3ZSZWxlYXNlTWF0KCZkZWx0YSk7CisgICAgY3ZSZWxlYXNlTWF0KCZtYXRySnRKKTsKKyAgICBjdlJlbGVhc2VNYXQoJm1hdHJKdEpOKTsKKyAgICBjdlJlbGVhc2VNYXQoJm1hdHJKdCk7CisgICAgY3ZSZWxlYXNlTWF0KCZ2ZWN0Qik7CisKKyAgICByZXR1cm47Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiAwCisvL3Rlc3RzCit2b2lkIEphY19GdW5jMihDdk1hdCAqdmVjdFgsQ3ZNYXQgKkphYykKK3sKKyAgICBkb3VibGUgeCA9IGN2bUdldCh2ZWN0WCwwLDApOworICAgIGRvdWJsZSB5ID0gY3ZtR2V0KHZlY3RYLDEsMCk7CisgICAgY3ZtU2V0KEphYywwLDAsMiooeC0yKSk7CisgICAgY3ZtU2V0KEphYywwLDEsMiooeSszKSk7CisKKyAgICBjdm1TZXQoSmFjLDEsMCwxKTsKKyAgICBjdm1TZXQoSmFjLDEsMSwxKTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgUmVzX0Z1bmMyKEN2TWF0ICp2ZWN0WCxDdk1hdCAqcmVzKQoreworICAgIGRvdWJsZSB4ID0gY3ZtR2V0KHZlY3RYLDAsMCk7CisgICAgZG91YmxlIHkgPSBjdm1HZXQodmVjdFgsMSwwKTsKKyAgICBjdm1TZXQocmVzLDAsMCwoeC0yKSooeC0yKSsoeSszKSooeSszKSk7CisgICAgY3ZtU2V0KHJlcywxLDAseCt5KTsKKworICAgIHJldHVybjsKK30KKworCitkb3VibGUgRXJyX0Z1bmMyKEN2TWF0ICpvYnMsQ3ZNYXQgKnJlcykKK3sKKyAgICBDdk1hdCAqdG1wOworICAgIHRtcCA9IGN2Q3JlYXRlTWF0KG9icy0+cm93cywxLENWXzY0Rik7CisgICAgY3ZTdWIob2JzLHJlcyx0bXApOworCisgICAgZG91YmxlIGU7CisgICAgZSA9IGN2Tm9ybSh0bXApOworCisgICAgcmV0dXJuIGU7Cit9CisKKwordm9pZCBUZXN0T3B0aW1YMlkyKCkKK3sKKyAgICBDdk1hdCB2ZWN0WDA7CisgICAgZG91YmxlIHZlY3RYMF9kYXRbMl07CisgICAgdmVjdFgwID0gY3ZNYXQoMiwxLENWXzY0Rix2ZWN0WDBfZGF0KTsKKyAgICB2ZWN0WDBfZGF0WzBdID0gNTsKKyAgICB2ZWN0WDBfZGF0WzFdID0gLTc7CisKKyAgICBDdk1hdCBvYnNlcnZSZXM7CisgICAgZG91YmxlIG9ic2VydlJlc19kYXRbMl07CisgICAgb2JzZXJ2UmVzID0gY3ZNYXQoMiwxLENWXzY0RixvYnNlcnZSZXNfZGF0KTsKKyAgICBvYnNlcnZSZXNfZGF0WzBdID0gMDsKKyAgICBvYnNlcnZSZXNfZGF0WzFdID0gLTE7CisgICAgb2JzZXJ2UmVzX2RhdFswXSA9IDA7CisgICAgb2JzZXJ2UmVzX2RhdFsxXSA9IC0xLjI7CisKKyAgICBDdk1hdCBvcHRpbVg7CisgICAgZG91YmxlIG9wdGltWF9kYXRbMl07CisgICAgb3B0aW1YID0gY3ZNYXQoMiwxLENWXzY0RixvcHRpbVhfZGF0KTsKKworCisgICAgTGV2ZW5iZWdyTWFycXVhcmR0T3B0aW1pemF0aW9uKCBKYWNfRnVuYzIsIFJlc19GdW5jMiwgRXJyX0Z1bmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlY3RYMCwmb2JzZXJ2UmVzLCZvcHRpbVgsMTAwLDAuMDAwMDAxKTsKKworICAgIHJldHVybjsKKworfQorCisjZW5kaWYKKworCisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdmxldm1hcnByb2piYW5kbGUuY3BwIGIvY3ZhdXgvc3JjL2N2bGV2bWFycHJvamJhbmRsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRjOGRlYQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmxldm1hcnByb2piYW5kbGUuY3BwCkBAIC0wLDAgKzEsMTc4MyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKworI2luY2x1ZGUgIl9jdmF1eC5oIgorLy8jaW5jbHVkZSAiY3Z0eXBlcy5oIgorI2luY2x1ZGUgPGZsb2F0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisvLyNpbmNsdWRlICJjdi5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKwordm9pZCBpY3ZSZWNvbnN0cnVjdFBvaW50czREU3RhdHVzKEN2TWF0KiogcHJvalBvaW50cywgQ3ZNYXQgKipwcm9qTWF0cnMsIEN2TWF0KiogcHJlc1BvaW50cywgQ3ZNYXQgKnBvaW50czRELGludCBudW1JbWFnZXMsQ3ZNYXQgKipwcm9qRXJyb3I9MCk7CisKKy8qIFZhbGVyeSBNb3N5YWdpbiAqLworCisvKiBJZiB5b3Ugd2FudCB0byBzYXZlIGludGVybmFsIGRlYnVnIGluZm8gdG8gZmlsZXMgdW5jb21tZW50IG5leHQgbGluZXMgYW5kIHNldCBwYXRocyB0byBmaWxlcyBpZiBuZWVkICovCisvKiBOb3RlIHRoZXNlIGZpbGUgbWF5IGJlIHZlcnkgbGFyZ2UgKi8KKy8qCisjZGVmaW5lIFRSQUNLX0JVTkRMRQorI2RlZmluZSBUUkFDS19CVU5ETEVfRklMRSAgICAgICAgICAgICJkOlxcdGVzdFxcYnVuZGxlLnR4dCIKKyNkZWZpbmUgVFJBQ0tfQlVORExFX0ZJTEVfSkFDICAgICAgICAiZDpcXHRlc3RcXGJ1bmRsZS50eHQiCisjZGVmaW5lIFRSQUNLX0JVTkRMRV9GSUxFX0pBQ0VSUlBST0ogImQ6XFx0ZXN0XFxKYWNFcnJQcm9qLnR4dCIKKyNkZWZpbmUgVFJBQ0tfQlVORExFX0ZJTEVfSkFDRVJSUE5UICAiZDpcXHRlc3RcXEphY0VyclBvaW50LnR4dCIKKyNkZWZpbmUgVFJBQ0tfQlVORExFX0ZJTEVfTUFUUlcgICAgICAiZDpcXHRlc3RcXG1hdHJXdC50eHQiCisjZGVmaW5lIFRSQUNLX0JVTkRMRV9GSUxFX0RFTFRBUCAgICAgImQ6XFx0ZXN0XFxkZWx0YVAudHh0IgorKi8KKyNkZWZpbmUgVFJBQ0tfQlVORExFX0ZJTEUgICAgICAgICAgICAiZDpcXHRlc3RcXGJ1bmRsZS50eHQiCisKKworLyogPT09PT09PT09PT09PT0gQnVuZGxlIGFkanVzdG1lbnQgb3B0aW1pemF0aW9uID09PT09PT09PT09PT09PT09ICovCit2b2lkIGljdkNvbXB1dGVEZXJpdmF0ZVByb2ooQ3ZNYXQgKnBvaW50czRELEN2TWF0ICpwcm9qTWF0ciwgQ3ZNYXQgKnN0YXR1cywgQ3ZNYXQgKmRlcml2UHJvaikKK3sKKyAgICAvKiBDb21wdXRlIGRlcml2YXRlIGZvciBnaXZlbiBwcm9qZWN0aW9uIG1hdHJpeCBwb2ludHMgYW5kIHN0YXR1cyBvZiBwb2ludHMgKi8KKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29tcHV0ZURlcml2YXRlUHJvaiIgKTsKKyAgICBfX0JFR0lOX187CisKKworICAgIC8qIC0tLS0tIFRlc3QgaW5wdXQgcGFyYW1zIGZvciBlcnJvcnMgLS0tLS0gKi8KKyAgICBpZiggcG9pbnRzNEQgPT0gMCB8fCBwcm9qTWF0ciA9PSAwIHx8IHN0YXR1cyA9PSAwIHx8IGRlcml2UHJvaiA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQocG9pbnRzNEQpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgInBvaW50czREIG11c3QgYmUgYSBtYXRyaXggNHhOIiApOworICAgIH0KKworICAgIC8qIENvbXB1dGUgbnVtYmVyIG9mIHBvaW50cyAqLworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcG9pbnRzNEQtPmNvbHM7CisKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHM0RCBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHM0RC0+cm93cyAhPSA0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIG9mIHBvaW50czREIG11c3QgYmUgNCIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwcm9qTWF0cikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAicHJvak1hdHIgbXVzdCBiZSBhIG1hdHJpeCAzeDQiICk7CisgICAgfQorCisgICAgaWYoIHByb2pNYXRyLT5yb3dzICE9IDMgfHwgcHJvak1hdHItPmNvbHMgIT0gNCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNpemUgb2YgcHJvamVjdGlvbiBtYXRyaXggKHByb2pNYXRyKSBtdXN0IGJlIDN4NCIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzdGF0dXMpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlN0YXR1cyBtdXN0IGJlIGEgbWF0cml4IDF4TiIgKTsKKyAgICB9CisKKyAgICBpZiggc3RhdHVzLT5yb3dzICE9IDEgfHwgc3RhdHVzLT5jb2xzICE9IG51bVBvaW50cyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNpemUgb2Ygc3RhdHVzIG9mIHBvaW50cyBtdXN0IGJlIDF4TiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChkZXJpdlByb2opICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImRlcml2UHJvaiBtdXN0IGJlIGEgbWF0cml4IFZpc04geCAxMiIgKTsKKyAgICB9CisKKyAgICBpZiggZGVyaXZQcm9qLT5jb2xzICE9IDEyICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiZGVyaXZQcm9qIG11c3QgYmUgYSBtYXRyaXggVmlzTiB4IDEyIiApOworICAgIH0KKyAgICAvKiAtLS0tLSBFbmQgdGVzdCAtLS0tLSAqLworCisgICAgaW50IGk7CisKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGRlcml2YXRlcyAqLworCisgICAgZG91YmxlIHBbMTJdOworICAgIC8qIENvcHkgcHJvamVjdGlvbiBtYXRyaXggKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgMTI7IGkrKyApCisgICAgeworICAgICAgICBwW2ldID0gY3ZtR2V0KHByb2pNYXRyLGkvNCxpJTQpOworICAgIH0KKworICAgIC8qIEZpbGwgZGVyaXYgbWF0cml4ICovCisgICAgaW50IGN1cnJWaXNQb2ludDsKKyAgICBpbnQgY3VyclBvaW50OworCisgICAgY3VyclZpc1BvaW50ID0gMDsKKyAgICBmb3IoIGN1cnJQb2ludCA9IDA7IGN1cnJQb2ludCA8IG51bVBvaW50czsgY3VyclBvaW50KysgKQorICAgIHsKKyAgICAgICAgaWYoIGN2bUdldChzdGF0dXMsMCxjdXJyUG9pbnQpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBYWzRdOworICAgICAgICAgICAgWFswXSA9IGN2bUdldChwb2ludHM0RCwwLGN1cnJWaXNQb2ludCk7CisgICAgICAgICAgICBYWzFdID0gY3ZtR2V0KHBvaW50czRELDEsY3VyclZpc1BvaW50KTsKKyAgICAgICAgICAgIFhbMl0gPSBjdm1HZXQocG9pbnRzNEQsMixjdXJyVmlzUG9pbnQpOworICAgICAgICAgICAgWFszXSA9IGN2bUdldChwb2ludHM0RCwzLGN1cnJWaXNQb2ludCk7CisKKyAgICAgICAgICAgIC8qIENvbXB1dGUgZGVyaXZhdGUgZm9yIHRoaXMgcG9pbnQgKi8KKworICAgICAgICAgICAgZG91YmxlIHBpWFszXTsKKyAgICAgICAgICAgIHBpWFswXSA9IFhbMF0qcFswXSArIFhbMV0qcFsxXSArIFhbMl0qcFsyXSAgKyBYWzNdKnBbM107CisgICAgICAgICAgICBwaVhbMV0gPSBYWzBdKnBbNF0gKyBYWzFdKnBbNV0gKyBYWzJdKnBbNl0gICsgWFszXSpwWzddOworICAgICAgICAgICAgcGlYWzJdID0gWFswXSpwWzhdICsgWFsxXSpwWzldICsgWFsyXSpwWzEwXSArIFhbM10qcFsxMV07CisKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgLyogZmlsbCBkZXJpdmF0ZSBieSBwb2ludCAqLworCisgICAgICAgICAgICBkb3VibGUgdG1wMyA9IDEvKHBpWFsyXSpwaVhbMl0pOworCisgICAgICAgICAgICBkb3VibGUgdG1wMSA9IC1waVhbMF0qdG1wMzsKKyAgICAgICAgICAgIGRvdWJsZSB0bXAyID0gLXBpWFsxXSp0bXAzOworCisgICAgICAgICAgICAvKiBmaWxsIGRlcml2YXRlIGJ5IHByb2plY3Rpb24gbWF0cml4ICovCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBkZXJpdmF0ZSBmb3IgeCAqLworICAgICAgICAgICAgICAgIGN2bVNldChkZXJpdlByb2osY3VyclZpc1BvaW50KjIsaSxYW2ldL3BpWFsyXSk7Ly94JyBwMWkKKyAgICAgICAgICAgICAgICBjdm1TZXQoZGVyaXZQcm9qLGN1cnJWaXNQb2ludCoyLDQraSwwKTsvL3gnIHAxaQorICAgICAgICAgICAgICAgIGN2bVNldChkZXJpdlByb2osY3VyclZpc1BvaW50KjIsOCtpLFhbaV0qdG1wMSk7Ly94JyBwM2kKKworICAgICAgICAgICAgICAgIC8qIGRlcml2YXRlIGZvciB5ICovCisgICAgICAgICAgICAgICAgY3ZtU2V0KGRlcml2UHJvaixjdXJyVmlzUG9pbnQqMisxLGksMCk7Ly95JyBwMmkKKyAgICAgICAgICAgICAgICBjdm1TZXQoZGVyaXZQcm9qLGN1cnJWaXNQb2ludCoyKzEsNCtpLFhbaV0vcGlYWzJdKTsvL3knIHAyaQorICAgICAgICAgICAgICAgIGN2bVNldChkZXJpdlByb2osY3VyclZpc1BvaW50KjIrMSw4K2ksWFtpXSp0bXAyKTsvL3knIHAzaQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyVmlzUG9pbnQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBkZXJpdlByb2otPnJvd3MgIT0gY3VyclZpc1BvaW50ICogMiApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImRlcml2UHJvaiBtdXN0IGJlIGEgbWF0cml4IDJWaXNOIHggMTIiICk7CisgICAgfQorCisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIGljdkNvbXB1dGVEZXJpdmF0ZVByb2pBbGwoQ3ZNYXQgKnBvaW50czRELCBDdk1hdCAqKnByb2pNYXRycywgQ3ZNYXQgKipwb2ludFByZXMsIGludCBudW1JbWFnZXMsQ3ZNYXQgKipwcm9qRGVyaXZlcykKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVEZXJpdmF0ZVByb2pBbGwiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKyAgICBpZiggcHJvak1hdHJzID09IDAgfHwgcG9pbnRQcmVzID09IDAgfHwgcHJvakRlcml2ZXMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisgICAgLyogLS0tLS0gRW5kIHRlc3QgLS0tLS0gKi8KKworICAgIGludCBjdXJySW1hZ2U7CisgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICB7CisgICAgICAgIGljdkNvbXB1dGVEZXJpdmF0ZVByb2oocG9pbnRzNEQscHJvak1hdHJzW2N1cnJJbWFnZV0sIHBvaW50UHJlc1tjdXJySW1hZ2VdLCBwcm9qRGVyaXZlc1tjdXJySW1hZ2VdKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIGljdkNvbXB1dGVEZXJpdmF0ZVBvaW50cyhDdk1hdCAqcG9pbnRzNEQsQ3ZNYXQgKnByb2pNYXRyLCBDdk1hdCAqcHJlc1BvaW50cywgQ3ZNYXQgKmRlcml2UG9pbnQpCit7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVEZXJpdmF0ZVBvaW50cyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiAtLS0tLSBUZXN0IGlucHV0IHBhcmFtcyBmb3IgZXJyb3JzIC0tLS0tICovCisgICAgaWYoIHBvaW50czREID09IDAgfHwgcHJvak1hdHIgPT0gMCB8fCBwcmVzUG9pbnRzID09IDAgfHwgZGVyaXZQb2ludCA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQocG9pbnRzNEQpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgInBvaW50czREIG11c3QgYmUgYSBtYXRyaXggTiB4IDQiICk7CisgICAgfQorCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwcmVzUG9pbnRzLT5jb2xzOworCisgICAgaWYoIG51bVBvaW50cyA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgbW9yZSB0aGFuIHplcm8iICk7CisgICAgfQorCisgICAgaWYoIHBvaW50czRELT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJwb2ludHM0RCBtdXN0IGJlIGEgbWF0cml4IE4geCA0IiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHByb2pNYXRyKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJwcm9qTWF0ciBtdXN0IGJlIGEgbWF0cml4IDN4NCIgKTsKKyAgICB9CisKKyAgICBpZiggcHJvak1hdHItPnJvd3MgIT0gMyB8fCBwcm9qTWF0ci0+Y29scyAhPSA0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiU2l6ZSBvZiBwcm9qZWN0aW9uIG1hdHJpeCAocHJvak1hdHIpIG11c3QgYmUgM3g0IiApOworICAgIH0KKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChwcmVzUG9pbnRzKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJTdGF0dXMgbXVzdCBiZSBhIG1hdHJpeCAxeE4iICk7CisgICAgfQorCisgICAgaWYoIHByZXNQb2ludHMtPnJvd3MgIT0gMSB8fCBwcmVzUG9pbnRzLT5jb2xzICE9IG51bVBvaW50cyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNpemUgb2YgcHJlc1BvaW50cyBzdGF0dXMgbXVzdCBiZSAxeE4iICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoZGVyaXZQb2ludCkgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiZGVyaXZQb2ludCBtdXN0IGJlIGEgbWF0cml4IDIgeCA0VmlzTnVtIiApOworICAgIH0KKyAgICAvKiAtLS0tLSBFbmQgdGVzdCAtLS0tLSAqLyAgICAKKyAgICAKKyAgICAvKiBDb21wdXRlIGRlcml2YXRlcyBieSBwb2ludHMgKi8KKyAgICAgICAgCisgICAgZG91YmxlIHBbMTJdOworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICB7CisgICAgICAgIHBbaV0gPSBjdm1HZXQocHJvak1hdHIsaS80LGklNCk7CisgICAgfQorCisgICAgaW50IGN1cnJWaXNQb2ludDsKKyAgICBpbnQgY3VyclByb2pQb2ludDsKKworICAgIGN1cnJWaXNQb2ludCA9IDA7CisgICAgZm9yKCBjdXJyUHJvalBvaW50ID0gMDsgY3VyclByb2pQb2ludCA8IG51bVBvaW50czsgY3VyclByb2pQb2ludCsrICkKKyAgICB7CisgICAgICAgIGlmKCBjdm1HZXQocHJlc1BvaW50cywwLGN1cnJQcm9qUG9pbnQpID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBYWzRdOworICAgICAgICAgICAgWFswXSA9IGN2bUdldChwb2ludHM0RCwwLGN1cnJQcm9qUG9pbnQpOworICAgICAgICAgICAgWFsxXSA9IGN2bUdldChwb2ludHM0RCwxLGN1cnJQcm9qUG9pbnQpOworICAgICAgICAgICAgWFsyXSA9IGN2bUdldChwb2ludHM0RCwyLGN1cnJQcm9qUG9pbnQpOworICAgICAgICAgICAgWFszXSA9IGN2bUdldChwb2ludHM0RCwzLGN1cnJQcm9qUG9pbnQpOworCisgICAgICAgICAgICBkb3VibGUgcGlYWzNdOworICAgICAgICAgICAgcGlYWzBdID0gWFswXSpwWzBdICsgWFsxXSpwWzFdICsgWFsyXSpwWzJdICArIFhbM10qcFszXTsKKyAgICAgICAgICAgIHBpWFsxXSA9IFhbMF0qcFs0XSArIFhbMV0qcFs1XSArIFhbMl0qcFs2XSAgKyBYWzNdKnBbN107CisgICAgICAgICAgICBwaVhbMl0gPSBYWzBdKnBbOF0gKyBYWzFdKnBbOV0gKyBYWzJdKnBbMTBdICsgWFszXSpwWzExXTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaW50IGksajsKKworICAgICAgICAgICAgZG91YmxlIHRtcDMgPSAxLyhwaVhbMl0qcGlYWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAyOyBqKysgKS8vZm9yIHggYW5kIHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkvLyBmb3IgWCxZLFosVworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KCBkZXJpdlBvaW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBjdXJyVmlzUG9pbnQqNCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwW2oqNCtpXSpwaVhbMl0tcFs4K2ldKnBpWFtqXSkgKiB0bXAzICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJWaXNQb2ludCsrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGRlcml2UG9pbnQtPnJvd3MgIT0gMiB8fCBkZXJpdlBvaW50LT5jb2xzICE9IGN1cnJWaXNQb2ludCo0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImRlcml2UG9pbnQgbXVzdCBiZSBhIG1hdHJpeCAyIHggNFZpc051bSIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBpY3ZDb21wdXRlRGVyaXZhdGVQb2ludHNBbGwoQ3ZNYXQgKnBvaW50czRELCBDdk1hdCAqKnByb2pNYXRycywgQ3ZNYXQgKipwb2ludFByZXMsIGludCBudW1JbWFnZXMsQ3ZNYXQgKipwb2ludERlcml2ZXMpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDb21wdXRlRGVyaXZhdGVQb2ludHNBbGwiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKyAgICBpZiggcHJvak1hdHJzID09IDAgfHwgcG9pbnRQcmVzID09IDAgfHwgcG9pbnREZXJpdmVzID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorICAgIC8qIC0tLS0tIEVuZCB0ZXN0IC0tLS0tICovCisKKyAgICBpbnQgY3VyckltYWdlOworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICBpY3ZDb21wdXRlRGVyaXZhdGVQb2ludHMocG9pbnRzNEQsIHByb2pNYXRyc1tjdXJySW1hZ2VdLCBwb2ludFByZXNbY3VyckltYWdlXSwgcG9pbnREZXJpdmVzW2N1cnJJbWFnZV0pOworICAgIH0KKworICAgIF9fRU5EX187CisgICAgcmV0dXJuOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIGljdkNvbXB1dGVNYXRyaXhWQWxsKGludCBudW1JbWFnZXMsQ3ZNYXQgKipwb2ludERlcml2LEN2TWF0ICoqcHJlc1BvaW50cywgQ3ZNYXQgKiptYXRyVikKK3sKKyAgICBpbnQgKnNoaWZ0cyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVNYXRyaXhWQWxsIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIC0tLS0tIFRlc3QgaW5wdXQgcGFyYW1zIGZvciBlcnJvcnMgLS0tLS0gKi8KKyAgICBpZiggbnVtSW1hZ2VzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBpbWFnZXMgbXVzdCBtb3JlIHRoYW4gemVybyIgKTsKKyAgICB9CisgICAgaWYoIHBvaW50RGVyaXYgPT0gMCB8fCBwcmVzUG9pbnRzID09IDAgfHwgbWF0clYgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisgICAgLyogICEhISBub3QgdGVzdGVkIGFsbCBwYXJhbWV0ZXJzICovCisgICAgLyogLS0tLS0gRW5kIHRlc3QgLS0tLS0gKi8KKworICAgIC8qIENvbXB1dGUgYWxsIG1hdHJpY2VzIFUgKi8KKyAgICBpbnQgY3VyckltYWdlOworICAgIGludCBjdXJyUG9pbnQ7CisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwcmVzUG9pbnRzWzBdLT5jb2xzOworICAgIENWX0NBTEwoc2hpZnRzID0gKGludCopY3ZBbGxvYyhzaXplb2YoaW50KSpudW1JbWFnZXMpKTsKKyAgICBtZW1zZXQoc2hpZnRzLDAsc2l6ZW9mKGludCkqbnVtSW1hZ2VzKTsKKworICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApLy9Gb3IgZWFjaCBwb2ludCAobWF0cml4IFYpCisgICAgeworICAgICAgICBpbnQgaSxqOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgNDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGN2bUdldChwcmVzUG9pbnRzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpID4gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjdm1HZXQocG9pbnREZXJpdltjdXJySW1hZ2VdLDAsc2hpZnRzW2N1cnJJbWFnZV0qNCtpKSAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2bUdldChwb2ludERlcml2W2N1cnJJbWFnZV0sMCxzaGlmdHNbY3VyckltYWdlXSo0K2opOworCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY3ZtR2V0KHBvaW50RGVyaXZbY3VyckltYWdlXSwxLHNoaWZ0c1tjdXJySW1hZ2VdKjQraSkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQocG9pbnREZXJpdltjdXJySW1hZ2VdLDEsc2hpZnRzW2N1cnJJbWFnZV0qNCtqKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGN2bVNldChtYXRyVltjdXJyUG9pbnRdLGksaixzdW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKiBzaGlmdCBwb3NpdGlvbiBvZiB2aXNpYmxlIHBvaW50cyAqLworICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY3ZtR2V0KHByZXNQb2ludHNbY3VyckltYWdlXSwwLGN1cnJQb2ludCkgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaGlmdHNbY3VyckltYWdlXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKyAgICBjdkZyZWUoICZzaGlmdHMpOworICAgIAorICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBpY3ZDb21wdXRlTWF0cml4VUFsbChpbnQgbnVtSW1hZ2VzLEN2TWF0ICoqcHJvakRlcml2LEN2TWF0KiogbWF0clUpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDb21wdXRlTWF0cml4VkFsbCIgKTsKKyAgICBfX0JFR0lOX187CisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKyAgICBpZiggcHJvakRlcml2ID09IDAgfHwgbWF0clUgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisgICAgLyogISEhIE5vdCB0ZXN0ZWQgYWxsIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICAvKiAtLS0tLSBFbmQgdGVzdCAtLS0tLSAqLworCisgICAgLyogQ29tcHV0ZSBtYXRyaWNlcyBWICovCisgICAgaW50IGN1cnJJbWFnZTsKKyAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgIHsKKyAgICAgICAgY3ZNdWxUcmFuc3Bvc2VkKHByb2pEZXJpdltjdXJySW1hZ2VdLG1hdHJVW2N1cnJJbWFnZV0sMSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgaWN2Q29tcHV0ZU1hdHJpeFcoaW50IG51bUltYWdlcywgQ3ZNYXQgKipwcm9qRGVyaXYsIEN2TWF0ICoqcG9pbnREZXJpdiwgQ3ZNYXQgKipwcmVzUG9pbnRzLCBDdk1hdCAqbWF0clcpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDb21wdXRlTWF0cml4VyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiAtLS0tLSBUZXN0IGlucHV0IHBhcmFtcyBmb3IgZXJyb3JzIC0tLS0tICovCisgICAgaWYoIG51bUltYWdlcyA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgaW1hZ2VzIG11c3QgbW9yZSB0aGFuIHplcm8iICk7CisgICAgfQorICAgIGlmKCBwcm9qRGVyaXYgPT0gMCB8fCBwb2ludERlcml2ID09IDAgfHwgcHJlc1BvaW50cyA9PSAwIHx8IG1hdHJXID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcHJlc1BvaW50c1swXS0+Y29sczsKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHMgbXVzdCBtb3JlIHRoYW4gemVybyIgKTsKKyAgICB9CisgICAgaWYoICFDVl9JU19NQVQobWF0clcpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIm1hdHJXIG11c3QgYmUgYSBtYXRyaXggMTJOdW1JbSB4IDROdW1QbnQiICk7CisgICAgfQorICAgIGlmKCBtYXRyVy0+cm93cyAhPSBudW1JbWFnZXMqMTIgfHwgbWF0clctPmNvbHMgIT0gbnVtUG9pbnRzKjQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJtYXRyVyBtdXN0IGJlIGEgbWF0cml4IDEyTnVtSW0geCA0TnVtUG50IiApOworICAgIH0KKyAgICAvKiAhISEgTm90IHRlc3RlZCBhbGwgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIC8qIC0tLS0tIEVuZCB0ZXN0IC0tLS0tICovCisKKyAgICAvKiBDb21wdXRlIG51bWJlciBvZiBwb2ludHMgKi8KKyAgICAvKiBDb21wdXRlIG1hdHJpeCBXIHVzaW5nIGRlcml2YXRlIHByb2ogYW5kIHBvaW50cyAqLworCisgICAgaW50IGN1cnJJbWFnZTsKKworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICBmb3IoIGludCBjdXJyTGluZSA9IDA7IGN1cnJMaW5lIDwgMTI7IGN1cnJMaW5lKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY3VyclZpcyA9IDA7CisgICAgICAgICAgICBmb3IoIGludCBjdXJyUG9pbnQgPSAwOyBjdXJyUG9pbnQgPCBudW1Qb2ludHM7IGN1cnJQb2ludCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY3ZtR2V0KHByZXNQb2ludHNbY3VyckltYWdlXSwwLGN1cnJQb2ludCkgPiAwICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgY3VyckNvbCA9IDA7IGN1cnJDb2wgPCA0OyBjdXJyQ29sKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3VtOworICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gY3ZtR2V0KHByb2pEZXJpdltjdXJySW1hZ2VdLGN1cnJWaXMqMiswLGN1cnJMaW5lKSAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZtR2V0KHBvaW50RGVyaXZbY3VyckltYWdlXSwwLGN1cnJWaXMqNCtjdXJyQ29sKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGN2bUdldChwcm9qRGVyaXZbY3VyckltYWdlXSxjdXJyVmlzKjIrMSxjdXJyTGluZSkgKiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2bUdldChwb2ludERlcml2W2N1cnJJbWFnZV0sMSxjdXJyVmlzKjQrY3VyckNvbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldChtYXRyVyxjdXJySW1hZ2UqMTIrY3VyckxpbmUsY3VyclBvaW50KjQrY3VyckNvbCxzdW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1cnJWaXMrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsvKiBzZXQgYWxsIHN1YiBlbGVtZW50cyB0byB6ZXJvICovCisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGN1cnJDb2wgPSAwOyBjdXJyQ29sIDwgNDsgY3VyckNvbCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KG1hdHJXLGN1cnJJbWFnZSoxMitjdXJyTGluZSxjdXJyUG9pbnQqNCtjdXJyQ29sLDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorI2lmZGVmIFRSQUNLX0JVTkRMRQorICAgIHsKKyAgICAgICAgRklMRSAqZmlsZTsKKyAgICAgICAgZmlsZSA9IGZvcGVuKCBUUkFDS19CVU5ETEVfRklMRV9NQVRSVyAsInciKTsKKyAgICAgICAgaW50IGN1cnJQb2ludCxjdXJySW1hZ2U7CisgICAgICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG5Qb2ludD0lZFxuIixjdXJyUG9pbnQpOworICAgICAgICAgICAgaW50IGN1cnJSb3c7CisgICAgICAgICAgICBmb3IoIGN1cnJSb3cgPSAwOyBjdXJyUm93IDwgNDsgY3VyclJvdysrICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2U8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGN2bUdldChtYXRyVywgY3VyckltYWdlICogMTIgKyBpLCBjdXJyUG9pbnQgKiA0ICsgY3VyclJvdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIiVsZiAiLHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisjZW5kaWYKKworICAgIF9fRU5EX187CisgICAgcmV0dXJuOworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBDb21wdXRlIGphY29iaWFuIG11bHQgcHJvamVjdGlvbiBtYXRyaWNlcyBlcnJvciAqLwordm9pZCBpY3ZDb21wdXRlSmFjRXJyb3JQcm9qKGludCBudW1JbWFnZXMsQ3ZNYXQgKipwcm9qRGVyaXYsQ3ZNYXQgKipwcm9qRXJyb3JzLEN2TWF0ICpqYWNQcm9qRXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVKYWNFcnJvclByb2oiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKyAgICBpZiggcHJvakRlcml2ID09IDAgfHwgcHJvakVycm9ycyA9PSAwIHx8IGphY1Byb2pFcnIgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisgICAgaWYoICFDVl9JU19NQVQoamFjUHJvakVycikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiamFjUHJvakVyciBtdXN0IGJlIGEgbWF0cml4IDEyTnVtSW0geCAxIiApOworICAgIH0KKyAgICBpZiggamFjUHJvakVyci0+cm93cyAhPSBudW1JbWFnZXMqMTIgfHwgamFjUHJvakVyci0+Y29scyAhPSAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiamFjUHJvakVyciBtdXN0IGJlIGEgbWF0cml4IDEyTnVtSW0geCAxIiApOworICAgIH0KKyAgICAvKiAhISEgTm90IHRlc3RlZCBhbGwgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIC8qIC0tLS0tIEVuZCB0ZXN0IC0tLS0tICovCisKKyAgICBpbnQgY3VyckltYWdlOworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICBmb3IoIGludCBjdXJyQ29sID0gMDsgY3VyckNvbCA8IDEyOyBjdXJyQ29sKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbnVtID0gcHJvakRlcml2W2N1cnJJbWFnZV0tPnJvd3M7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnVtOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBjdm1HZXQocHJvakRlcml2W2N1cnJJbWFnZV0saSxjdXJyQ29sKSAqIAorICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQocHJvakVycm9yc1tjdXJySW1hZ2VdLGklMixpLzIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3ZtU2V0KGphY1Byb2pFcnIsY3VyckltYWdlKjEyK2N1cnJDb2wsMCxzdW0pOworICAgICAgICB9CisgICAgfQorCisjaWZkZWYgVFJBQ0tfQlVORExFCisgICAgeworICAgICAgICBGSUxFICpmaWxlOworICAgICAgICBmaWxlID0gZm9wZW4oIFRSQUNLX0JVTkRMRV9GSUxFX0pBQ0VSUlBST0ogLCJ3Iik7CisgICAgICAgIGludCBjdXJySW1hZ2U7CisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG5JbWFnZT0lZFxuIixjdXJySW1hZ2UpOworICAgICAgICAgICAgaW50IGN1cnJSb3c7CisgICAgICAgICAgICBmb3IoIGN1cnJSb3cgPSAwOyBjdXJyUm93IDwgMTI7IGN1cnJSb3crKyAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBjdm1HZXQoamFjUHJvakVyciwgY3VyckltYWdlICogMTIgKyBjdXJyUm93LCAwKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIiVsZlxuIix2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbiIpOworICAgICAgICB9CisgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICB9CisjZW5kaWYKKworCisgICAgX19FTkRfXzsKKyAgICByZXR1cm47Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIENvbXB1dGUgamFjb2JpYW4gbXVsdCBwb2ludHMgZXJyb3IgKi8KK3ZvaWQgaWN2Q29tcHV0ZUphY0Vycm9yUG9pbnQoaW50IG51bUltYWdlcyxDdk1hdCAqKnBvaW50RGVyaXYsQ3ZNYXQgKipwcm9qRXJyb3JzLCBDdk1hdCAqKnByZXNQb2ludHMsQ3ZNYXQgKmphY1BvaW50RXJyICkKK3sKKyAgICBpbnQgKnNoaWZ0cyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVKYWNFcnJvclBvaW50IiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIC0tLS0tIFRlc3QgaW5wdXQgcGFyYW1zIGZvciBlcnJvcnMgLS0tLS0gKi8KKyAgICBpZiggbnVtSW1hZ2VzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBpbWFnZXMgbXVzdCBtb3JlIHRoYW4gemVybyIgKTsKKyAgICB9CisKKyAgICBpZiggcG9pbnREZXJpdiA9PSAwIHx8IHByb2pFcnJvcnMgPT0gMCB8fCBwcmVzUG9pbnRzID09IDAgfHwgamFjUG9pbnRFcnIgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpbnQgbnVtUG9pbnRzOworICAgIG51bVBvaW50cyA9IHByZXNQb2ludHNbMF0tPmNvbHM7CisgICAgaWYoIG51bVBvaW50cyA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgbW9yZSB0aGFuIHplcm8iICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoamFjUG9pbnRFcnIpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImphY1BvaW50RXJyIG11c3QgYmUgYSBtYXRyaXggNE51bVBudCB4IDEiICk7CisgICAgfQorCisgICAgaWYoIGphY1BvaW50RXJyLT5yb3dzICE9IG51bVBvaW50cyo0IHx8IGphY1BvaW50RXJyLT5jb2xzICE9IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJqYWNQb2ludEVyciBtdXN0IGJlIGEgbWF0cml4IDROdW1QbnQgeCAxIiApOworICAgIH0KKyAgICAvKiAhISEgTm90IHRlc3RlZCBhbGwgaW5wdXQgcGFyYW1ldGVycyAqLworICAgIC8qIC0tLS0tIEVuZCB0ZXN0IC0tLS0tICovCisKKyAgICBpbnQgY3VyckltYWdlOworICAgIGludCBjdXJyUG9pbnQ7CisgICAgQ1ZfQ0FMTChzaGlmdHMgPSAoaW50KiljdkFsbG9jKHNpemVvZihpbnQpKm51bUltYWdlcykpOworICAgIG1lbXNldChzaGlmdHMsMCxzaXplb2YoaW50KSpudW1JbWFnZXMpOworICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgeworICAgICAgICBmb3IoIGludCBjdXJyQ29vcmQgPSAwOyBjdXJyQ29vcmQgPCA0OyBjdXJyQ29vcmQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjdXJyVmlzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGN2bUdldChwcmVzUG9pbnRzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpID4gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjdm1HZXQocG9pbnREZXJpdltjdXJySW1hZ2VdLDAsc2hpZnRzW2N1cnJJbWFnZV0qNCtjdXJyQ29vcmQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQocHJvakVycm9yc1tjdXJySW1hZ2VdLDAsc2hpZnRzW2N1cnJJbWFnZV0pOy8vY3VyclZpcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBjdm1HZXQocG9pbnREZXJpdltjdXJySW1hZ2VdLDEsc2hpZnRzW2N1cnJJbWFnZV0qNCtjdXJyQ29vcmQpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQocHJvakVycm9yc1tjdXJySW1hZ2VdLDEsc2hpZnRzW2N1cnJJbWFnZV0pOy8vY3VyclZpcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJWaXMrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3ZtU2V0KGphY1BvaW50RXJyLGN1cnJQb2ludCo0K2N1cnJDb29yZCwwLHN1bSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbmNyZWFzZSBzaGlmdHMgKi8KKyAgICAgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGN2bUdldChwcmVzUG9pbnRzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2hpZnRzW2N1cnJJbWFnZV0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisjaWZkZWYgVFJBQ0tfQlVORExFCisgICAgeworICAgICAgICBGSUxFICpmaWxlOworICAgICAgICBmaWxlID0gZm9wZW4oVFJBQ0tfQlVORExFX0ZJTEVfSkFDRVJSUE5ULCJ3Iik7CisgICAgICAgIGludCBjdXJyUG9pbnQ7CisgICAgICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG5Qb2ludD0lZFxuIixjdXJyUG9pbnQpOworICAgICAgICAgICAgaW50IGN1cnJSb3c7CisgICAgICAgICAgICBmb3IoIGN1cnJSb3cgPSAwOyBjdXJyUm93IDwgNDsgY3VyclJvdysrICApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGN2bUdldChqYWNQb2ludEVyciwgY3VyclBvaW50ICogNCArIGN1cnJSb3csIDApOworICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiJWxmXG4iLHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KKyNlbmRpZgorCisKKworICAgIF9fRU5EX187CisgICAgY3ZGcmVlKCAmc2hpZnRzKTsKKworfQorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIFJlY29uc3RydWN0IDREIHBvaW50cyB1c2luZyBzdGF0dXMgKi8KK3ZvaWQgaWN2UmVjb25zdHJ1Y3RQb2ludHM0RFN0YXR1cyhDdk1hdCoqIHByb2pQb2ludHMsIEN2TWF0ICoqcHJvak1hdHJzLCBDdk1hdCoqIHByZXNQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKnBvaW50czRELGludCBudW1JbWFnZXMsQ3ZNYXQgKipwcm9qRXJyb3IpCit7CisKKyAgICBkb3VibGUqIG1hdHJBX2RhdCA9IDA7CisgICAgZG91YmxlKiBtYXRyV19kYXQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWNvbnN0cnVjdFBvaW50czREU3RhdHVzIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIC0tLS0tIFRlc3QgaW5wdXQgcGFyYW1zIGZvciBlcnJvcnMgLS0tLS0gKi8KKyAgICBpZiggbnVtSW1hZ2VzIDwgMiApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBpbWFnZXMgbXVzdCBiZSBtb3JlIHRoYW4gb25lIiApOworICAgIH0KKworICAgIGlmKCBwcm9qUG9pbnRzID09IDAgfHwgcHJvak1hdHJzID09IDAgfHwgcHJlc1BvaW50cyA9PSAwIHx8IHBvaW50czREID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwb2ludHM0RC0+Y29sczsKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHM0RCBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHM0RC0+cm93cyAhPSA0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiUG9pbnRzIG11c3QgaGF2ZSA0IGNvcmRpbmF0ZXMiICk7CisgICAgfQorCisgICAgLyogISEhIE5vdCB0ZXN0ZWQgYWxsIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICAvKiAtLS0tLSBFbmQgdGVzdCAtLS0tLSAqLworCisgICAgaW50IGN1cnJJbWFnZTsKKyAgICBpbnQgY3VyclBvaW50OworCisgICAgLyogQWxsb2NhdGUgbWF4aW11bSBkYXRhICovCisKKworICAgIEN2TWF0IG1hdHJWOworICAgIGRvdWJsZSBtYXRyVl9kYXRbNCo0XTsKKyAgICBtYXRyViA9IGN2TWF0KDQsNCxDVl82NEYsbWF0clZfZGF0KTsKKworICAgIENWX0NBTEwobWF0ckFfZGF0ID0gKGRvdWJsZSopY3ZBbGxvYygzKm51bUltYWdlcyAqIDQgKiBzaXplb2YoZG91YmxlKSkpOworICAgIENWX0NBTEwobWF0cldfZGF0ID0gKGRvdWJsZSopY3ZBbGxvYygzKm51bUltYWdlcyAqIDQgKiBzaXplb2YoZG91YmxlKSkpOworCisgICAgLyogcmVjb25zdHJ1Y3QgZWFjaCBwb2ludCAqLworICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgeworICAgICAgICAvKiBSZWNvbnN0cnVjdCBjdXJyZW50IHBvaW50ICovCisgICAgICAgIC8qIERlZmluZSBudW1iZXIgb2YgdmlzaWJsZSBwcm9qZWN0aW9ucyAqLworICAgICAgICBpbnQgbnVtVmlzUHJvaiA9IDA7CisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjdm1HZXQocHJlc1BvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG51bVZpc1Byb2orKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoIG51bVZpc1Byb2ogPCAyICkKKyAgICAgICAgeworICAgICAgICAgICAgLyogVGhpcyBwb2ludCBjYW4ndCBiZSByZWNvbnN0cnVjdGVkICovCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBhbmQgY3JlYXRlIG1hdHJpY2VzICovCisgICAgICAgIEN2TWF0IG1hdHJBOworICAgICAgICBtYXRyQSA9IGN2TWF0KDMqbnVtVmlzUHJvaiw0LENWXzY0RixtYXRyQV9kYXQpOworCisgICAgICAgIEN2TWF0IG1hdHJXOworICAgICAgICBtYXRyVyA9IGN2TWF0KDMqbnVtVmlzUHJvaiw0LENWXzY0RixtYXRyV19kYXQpOworCisgICAgICAgIGludCBjdXJyVmlzUHJvaiA9IDA7CisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApLyogRm9yIGVhY2ggdmlldyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZiggY3ZtR2V0KHByZXNQb2ludHNbY3VyckltYWdlXSwwLGN1cnJQb2ludCkgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgeCx5OworICAgICAgICAgICAgICAgIHggPSBjdm1HZXQocHJvalBvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KTsKKyAgICAgICAgICAgICAgICB5ID0gY3ZtR2V0KHByb2pQb2ludHNbY3VyckltYWdlXSwxLGN1cnJQb2ludCk7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgayA9IDA7IGsgPCA0OyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF0ckFfZGF0W2N1cnJWaXNQcm9qKjEyICAgKyBrXSA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAqIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwyLGspIC0gICAgIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwwLGspOworCisgICAgICAgICAgICAgICAgICAgIG1hdHJBX2RhdFtjdXJyVmlzUHJvaioxMis0ICsga10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAqIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwyLGspIC0gICAgIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwxLGspOworCisgICAgICAgICAgICAgICAgICAgIG1hdHJBX2RhdFtjdXJyVmlzUHJvaioxMis4ICsga10gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeCAqIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwxLGspIC0geSAqIGN2bUdldChwcm9qTWF0cnNbY3VyckltYWdlXSwwLGspOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyVmlzUHJvaisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogU29sdmUgc3lzdGVtIGZvciBjdXJyZW50IHBvaW50ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2U1ZEKCZtYXRyQSwmbWF0clcsMCwmbWF0clYsQ1ZfU1ZEX1ZfVCk7CisKKyAgICAgICAgICAgIC8qIENvcHkgY29tcHV0ZWQgcG9pbnQgKi8KKyAgICAgICAgICAgIGN2bVNldChwb2ludHM0RCwwLGN1cnJQb2ludCxjdm1HZXQoJm1hdHJWLDMsMCkpOy8vWAorICAgICAgICAgICAgY3ZtU2V0KHBvaW50czRELDEsY3VyclBvaW50LGN2bUdldCgmbWF0clYsMywxKSk7Ly9ZCisgICAgICAgICAgICBjdm1TZXQocG9pbnRzNEQsMixjdXJyUG9pbnQsY3ZtR2V0KCZtYXRyViwzLDIpKTsvL1oKKyAgICAgICAgICAgIGN2bVNldChwb2ludHM0RCwzLGN1cnJQb2ludCxjdm1HZXQoJm1hdHJWLDMsMykpOy8vVworICAgICAgICB9CisKKyAgICB9CisKKyAgICB7LyogQ29tcHV0ZSBwcm9qZWN0aW9uIGVycm9yICovCisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0IHBvaW50NEQ7CisgICAgICAgICAgICBDdk1hdCBwb2ludDNEOworICAgICAgICAgICAgZG91YmxlIHBvaW50M0RfZGF0WzNdOworICAgICAgICAgICAgcG9pbnQzRCA9IGN2TWF0KDMsMSxDVl82NEYscG9pbnQzRF9kYXQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgY3VyclBvaW50OworICAgICAgICAgICAgaW50IG51bVZpcyA9IDA7CisgICAgICAgICAgICBkb3VibGUgdG90YWxFcnJvciA9IDA7CisgICAgICAgICAgICBmb3IoIGN1cnJQb2ludCA9IDA7IGN1cnJQb2ludCA8IG51bVBvaW50czsgY3VyclBvaW50KysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBjdm1HZXQocHJlc1BvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KSA+IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgIGR4LGR5OworICAgICAgICAgICAgICAgICAgICBjdkdldENvbChwb2ludHM0RCwmcG9pbnQ0RCxjdXJyUG9pbnQpOworICAgICAgICAgICAgICAgICAgICBjdm1NdWwocHJvak1hdHJzW2N1cnJJbWFnZV0sJnBvaW50NEQsJnBvaW50M0QpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHBvaW50M0RfZGF0WzJdOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCA9IHBvaW50M0RfZGF0WzBdIC8gdzsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHkgPSBwb2ludDNEX2RhdFsxXSAvIHc7CisKKyAgICAgICAgICAgICAgICAgICAgZHggPSBjdm1HZXQocHJvalBvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KSAtIHg7CisgICAgICAgICAgICAgICAgICAgIGR5ID0gY3ZtR2V0KHByb2pQb2ludHNbY3VyckltYWdlXSwxLGN1cnJQb2ludCkgLSB5OworICAgICAgICAgICAgICAgICAgICBpZiggcHJvakVycm9yICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHByb2pFcnJvcltjdXJySW1hZ2VdLDAsY3VyclBvaW50LGR4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldChwcm9qRXJyb3JbY3VyckltYWdlXSwxLGN1cnJQb2ludCxkeSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdG90YWxFcnJvciArPSBzcXJ0KGR4KmR4K2R5KmR5KTsKKyAgICAgICAgICAgICAgICAgICAgbnVtVmlzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL2RvdWJsZSBtZWFuRXJyb3IgPSB0b3RhbEVycm9yIC8gKGRvdWJsZSludW1WaXM7CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJm1hdHJBX2RhdCk7CisgICAgY3ZGcmVlKCAmbWF0cldfZGF0KTsKKworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgaWN2UHJvalBvaW50c1N0YXR1c0Z1bmMoIGludCBudW1JbWFnZXMsIEN2TWF0ICpwb2ludHM0RCwgQ3ZNYXQgKipwcm9qTWF0cnMsIEN2TWF0ICoqcG9pbnRzUHJlcywgQ3ZNYXQgKipwcm9qUG9pbnRzKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2UHJvalBvaW50c1N0YXR1c0Z1bmMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHM0RCA9PSAwIHx8IHByb2pNYXRycyA9PSAwIHx8IHBvaW50c1ByZXMgPT0gMCB8fCBwcm9qUG9pbnRzID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwb2ludHM0RC0+Y29sczsKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHM0RCBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKworICAgIGlmKCBwb2ludHM0RC0+cm93cyAhPSA0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiUG9pbnRzIG11c3QgaGF2ZSA0IGNvcmRpbmF0ZXMiICk7CisgICAgfQorCisgICAgLyogISEhIE5vdCB0ZXN0ZWQgYWxsIGlucHV0IHBhcmFtZXRlcnMgKi8KKyAgICAvKiAtLS0tLSBFbmQgdGVzdCAtLS0tLSAqLworCisgICAgQ3ZNYXQgcG9pbnQ0RDsKKyAgICBDdk1hdCBwb2ludDNEOworICAgIGRvdWJsZSBwb2ludDREX2RhdFs0XTsKKyAgICBkb3VibGUgcG9pbnQzRF9kYXRbM107CisgICAgcG9pbnQ0RCA9IGN2TWF0KDQsMSxDVl82NEYscG9pbnQ0RF9kYXQpOworICAgIHBvaW50M0QgPSBjdk1hdCgzLDEsQ1ZfNjRGLHBvaW50M0RfZGF0KTsKKworI2lmZGVmIFRSQUNLX0JVTkRMRQorICAgICAgICB7CisgICAgICAgICAgICBGSUxFICpmaWxlOworICAgICAgICAgICAgZmlsZSA9IGZvcGVuKCBUUkFDS19CVU5ETEVfRklMRSAsImEiKTsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG4tLS0tLSB0ZXN0IDE0LjAxIGljdlByb2pQb2ludHNTdGF0dXNGdW5jIC0tLS0tXG4iKTsKKyAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgCisgICAgaW50IGN1cnJJbWFnZTsKKyAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgIHsKKyAgICAgICAgLyogR2V0IHByb2plY3QgbWF0cml4ICovCisgICAgICAgIC8qIHByb2plY3QgdmlzaWJsZSBwb2ludHMgdXNpbmcgY3VycmVudCBwcm9qZWN0aW9uIG1hdHJpeCAqLworICAgICAgICBpbnQgY3VyclZpc1BvaW50ID0gMDsKKyAgICAgICAgZm9yKCBpbnQgY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjdm1HZXQocG9pbnRzUHJlc1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIHByb2plY3QgY3VycmVudCBwb2ludCAqLworICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdChwb2ludHM0RCwmcG9pbnQ0RCxjdlJlY3QoY3VyclBvaW50LDAsMSw0KSk7CisKKyNpZmRlZiBUUkFDS19CVU5ETEUKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZJTEUgKmZpbGU7CisgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG4tLS0tLSB0ZXN0IDE0LjAyIHBvaW50NEQgKCVsZiwgJWxmLCAlbGYsICVsZikgLS0tLS1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQoJnBvaW50NEQsMCwwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2bUdldCgmcG9pbnQ0RCwxLDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZtR2V0KCZwb2ludDRELDIsMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQoJnBvaW50NEQsMywwKSk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjdm1NdWwocHJvak1hdHJzW2N1cnJJbWFnZV0sJnBvaW50NEQsJnBvaW50M0QpOworICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gcG9pbnQzRF9kYXRbMl07CisgICAgICAgICAgICAgICAgY3ZtU2V0KHByb2pQb2ludHNbY3VyckltYWdlXSwwLGN1cnJWaXNQb2ludCxwb2ludDNEX2RhdFswXS93KTsKKyAgICAgICAgICAgICAgICBjdm1TZXQocHJvalBvaW50c1tjdXJySW1hZ2VdLDEsY3VyclZpc1BvaW50LHBvaW50M0RfZGF0WzFdL3cpOworCisjaWZkZWYgVFJBQ0tfQlVORExFCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBGSUxFICpmaWxlOworICAgICAgICAgICAgICAgICAgICBmaWxlID0gZm9wZW4oIFRSQUNLX0JVTkRMRV9GSUxFICwiYSIpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuLS0tLS0gdGVzdCAxNC4wMyAoJWxmLCAlbGYsICVsZikgLT4gKCVsZiwgJWxmKS0tLS0tXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQzRF9kYXRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludDNEX2RhdFsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50M0RfZGF0WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQzRF9kYXRbMF0vdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50M0RfZGF0WzFdL3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmaWxlKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBjdXJyVmlzUG9pbnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBpY3ZGcmVlTWF0cml4QXJyYXkoQ3ZNYXQgKioqbWF0ckFycmF5LGludCBudW1NYXRyKQoreworICAgIC8qIEZyZWUgZWFjaCBtYXRyaXggKi8KKyAgICBpbnQgY3Vyck1hdHI7CisgICAgCisgICAgaWYoICptYXRyQXJyYXkgIT0gMCApCisgICAgey8qIE5lZWQgZGVsZXRlICovCisgICAgICAgIGZvciggY3Vyck1hdHIgPSAwOyBjdXJyTWF0ciA8IG51bU1hdHI7IGN1cnJNYXRyKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoKCptYXRyQXJyYXkpK2N1cnJNYXRyKTsKKyAgICAgICAgfQorICAgICAgICBjdkZyZWUoIG1hdHJBcnJheSk7CisgICAgfQorICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkICppY3ZDbGVhckFsbG9jKGludCBzaXplKQoreworICAgIHZvaWQgKnB0ciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNsZWFyQWxsb2MiICk7CisgICAgX19CRUdJTl9fOworCisgICAgaWYoIHNpemUgPiAwICkKKyAgICB7CisgICAgICAgIENWX0NBTEwocHRyID0gY3ZBbGxvYyhzaXplKSk7CisgICAgICAgIG1lbXNldChwdHIsMCxzaXplKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybiBwdHI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIDAKK3ZvaWQgY3ZPcHRpbWl6ZUxldmVuYmVyZ01hcnF1YXJkdEJ1bmRsZVdyYXBlciggQ3ZNYXQqKiBwcm9qTWF0cnMsIEN2TWF0Kiogb2JzZXJ2UHJvalBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiogcG9pbnRzUHJlcywgaW50IG51bUltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiogcmVzdWx0UHJvak1hdHJzLCBDdk1hdCogcmVzdWx0UG9pbnRzNEQsaW50IG1heEl0ZXIsZG91YmxlIGVwc2lsb24gKQoreworICAgIC8qIERlbGV0ZSBhbCBzcGFyc2UgcG9pbnRzICovCisKK2ludCBpY3ZEZWxldGVTcGFyc0luUG9pbnRzKCAgaW50IG51bUltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKipwb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICoqc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCAqd2FzU3RhdHVzKS8qIHN0YXR1cyBvZiBwcmV2aW91cyBjb25maWd1cmF0aW9uICovCisKK30KKyNlbmRpZgorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiAhISEgbWF5IGJlIHVzZWZ1bCB0byByZXR1cm4gbm9ybSBvZiBlcnJvciAqLworLyogISEhIG1heSBiZSBkb2VzIG5vdCB3b3JrIGNvcnJlY3Qgd2l0aCBub3QgYWxsIHZpc2libGUgNEQgcG9pbnRzICovCit2b2lkIGN2T3B0aW1pemVMZXZlbmJlcmdNYXJxdWFyZHRCdW5kbGUoIEN2TWF0KiogcHJvak1hdHJzLCBDdk1hdCoqIG9ic2VydlByb2pQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIHBvaW50c1ByZXMsIGludCBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIHJlc3VsdFByb2pNYXRycywgQ3ZNYXQqIHJlc3VsdFBvaW50czRELGludCBtYXhJdGVyLGRvdWJsZSBlcHNpbG9uICkKK3sKKyAgICAKKyAgICBDdk1hdCAgKnZlY3RvclhfcG9pbnRzNEQgPSAwOworICAgIEN2TWF0ICoqdmVjdG9yWF9wcm9qTWF0cnMgPSAwOyAgICAKKworICAgIEN2TWF0ICAqbmV3VmVjdG9yWF9wb2ludHM0RCA9IDA7CisgICAgQ3ZNYXQgKipuZXdWZWN0b3JYX3Byb2pNYXRycyA9IDA7CisKKyAgICBDdk1hdCAgKmNoYW5nZVZlY3RvclhfcG9pbnRzNEQgPSAwOworICAgIEN2TWF0ICAqY2hhbmdlVmVjdG9yWF9wcm9qTWF0cnMgPSAwOyAgCisKKyAgICBDdk1hdCAqKm9ic2VydlZpc1BvaW50cyA9IDA7CisgICAgQ3ZNYXQgKipwcm9qVmlzUG9pbnRzID0gMDsKKyAgICBDdk1hdCAqKmVycm9yUHJvalBvaW50cyA9IDA7CisgICAgQ3ZNYXQgKipEZXJpdlByb2ogPSAwOworICAgIEN2TWF0ICoqRGVyaXZQb2ludCA9IDA7CisgICAgQ3ZNYXQgKm1hdHJXID0gMDsKKyAgICBDdk1hdCAqKm1hdHJzVWsgPSAwOworICAgIEN2TWF0ICoqd29ya01hdHJzVWsgPSAwOworICAgIEN2TWF0ICoqbWF0cnNWaSA9IDA7CisgICAgQ3ZNYXQgKndvcmtNYXRyVmkgPSAwOworICAgIEN2TWF0ICoqd29ya01hdHJzSW52VmkgPSAwOworICAgIEN2TWF0ICpqYWNQcm9qRXJyID0gMDsKKyAgICBDdk1hdCAqamFjUG9pbnRFcnIgPSAwOworCisgICAgQ3ZNYXQgKm1hdHJUbXBTeXMxID0gMDsKKyAgICBDdk1hdCAqbWF0clN5c0RlbHRhUCA9IDA7CisgICAgQ3ZNYXQgKnZlY3RUbXBTeXMzID0gMDsKKyAgICBDdk1hdCAqdmVjdFN5c0RlbHRhUCA9IDA7CisgICAgQ3ZNYXQgKmRlbHRhUCA9IDA7CisgICAgQ3ZNYXQgKmRlbHRhTSA9IDA7CisgICAgQ3ZNYXQgKnZlY3RUbXBTeXNNID0gMDsKKworICAgIGludCBudW1Qb2ludHMgPSAwOworCisKKyAgICBDVl9GVU5DTkFNRSggImN2T3B0aW1pemVMZXZlbmJlcmdNYXJxdWFyZHRCdW5kbGUiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogLS0tLS0gVGVzdCBpbnB1dCBwYXJhbXMgZm9yIGVycm9ycyAtLS0tLSAqLworICAgIGlmKCBudW1JbWFnZXMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIGltYWdlcyBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKyAgICAKKyAgICBpZiggbWF4SXRlciA8IDEgfHwgbWF4SXRlciA+IDIwMDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJNYXhpbXVtIG51bWJlciBvZiBpdGVyYXRpb24gbXVzdCBiZSBpbiBbMS4uMTAwMF0iICk7CisgICAgfQorICAgIAorICAgIGlmKCBlcHNpbG9uIDwgMCAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJFcHNpbG9uIHBhcmFtZXRlciBtdXN0IGJlID49IDAiICk7CisgICAgfQorICAgIAorICAgIGlmKCAhQ1ZfSVNfTUFUKHJlc3VsdFBvaW50czREKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJyZXN1bHRQb2ludHM0RCBtdXN0IGJlIGEgbWF0cml4IDQgeCBOdW1QbnQiICk7CisgICAgfQorCisgICAgbnVtUG9pbnRzID0gcmVzdWx0UG9pbnRzNEQtPmNvbHM7CisgICAgaWYoIG51bVBvaW50cyA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgbW9yZSB0aGFuIHplcm8iICk7Ly8hISEKKyAgICB9CisKKyAgICBpZiggcmVzdWx0UG9pbnRzNEQtPnJvd3MgIT0gNCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInJlc3VsdFBvaW50czREIG11c3QgaGF2ZSA0IGNvcmRpbmF0ZXMiICk7CisgICAgfQorCisgICAgLyogLS0tLS0gRW5kIHRlc3QgLS0tLS0gKi8KKworICAgIC8qIE9wdGltaXphdGlvbiB1c2luZyBidW5kbGUgYWRqdXN0bWVudCAqLworICAgIC8qIHdvcmsgd2l0aCBub24gdmlzaWJsZSBwb2ludHMgKi8KKworICAgIENWX0NBTEwoIHZlY3RvclhfcG9pbnRzNEQgID0gY3ZDcmVhdGVNYXQoNCxudW1Qb2ludHMsQ1ZfNjRGKSk7CisgICAgQ1ZfQ0FMTCggdmVjdG9yWF9wcm9qTWF0cnMgPSAoQ3ZNYXQqKilpY3ZDbGVhckFsbG9jKHNpemVvZihDdk1hdCopKm51bUltYWdlcykpOworCisgICAgQ1ZfQ0FMTCggbmV3VmVjdG9yWF9wb2ludHM0RCAgPSBjdkNyZWF0ZU1hdCg0LG51bVBvaW50cyxDVl82NEYpKTsKKyAgICBDVl9DQUxMKCBuZXdWZWN0b3JYX3Byb2pNYXRycyA9IChDdk1hdCoqKWljdkNsZWFyQWxsb2Moc2l6ZW9mKEN2TWF0KikqbnVtSW1hZ2VzKSk7CisKKyAgICBDVl9DQUxMKCBjaGFuZ2VWZWN0b3JYX3BvaW50czREICA9IGN2Q3JlYXRlTWF0KDQsbnVtUG9pbnRzLENWXzY0RikpOworICAgIENWX0NBTEwoIGNoYW5nZVZlY3RvclhfcHJvak1hdHJzID0gY3ZDcmVhdGVNYXQoMyw0LENWXzY0RikpOworCisgICAgaW50IGN1cnJJbWFnZTsKKyAgICAKKyAgICAvKiAtLS0tLSBUZXN0IGlucHV0IHBhcmFtcyAtLS0tLSAqLworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICAvKiBUZXN0IHNpemUgb2YgaW5wdXQgaW5pdGlhbCBhbmQgcmVzdWx0IHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgaWYoICFDVl9JU19NQVQocHJvak1hdHJzW2N1cnJJbWFnZV0pICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiZWFjaCBvZiBpbml0aWFsIHByb2pNYXRycyBtdXN0IGJlIGEgbWF0cml4IDMgeCA0IiApOworICAgICAgICB9CisgICAgICAgIGlmKCBwcm9qTWF0cnNbY3VyckltYWdlXS0+cm93cyAhPSAzIHx8IHByb2pNYXRyc1tjdXJySW1hZ2VdLT5jb2xzICE9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImVhY2ggb2YgaW5pdGlhbCBwcm9qTWF0cnMgbXVzdCBiZSBhIG1hdHJpeCAzIHggNCIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYoICFDVl9JU19NQVQob2JzZXJ2UHJvalBvaW50c1tjdXJySW1hZ2VdKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImVhY2ggb2Ygb2JzZXJ2UHJvalBvaW50cyBtdXN0IGJlIGEgbWF0cml4IDIgeCBOdW1QbnRzIiApOworICAgICAgICB9CisgICAgICAgIGlmKCBvYnNlcnZQcm9qUG9pbnRzW2N1cnJJbWFnZV0tPnJvd3MgIT0gMiB8fCBvYnNlcnZQcm9qUG9pbnRzW2N1cnJJbWFnZV0tPmNvbHMgIT0gbnVtUG9pbnRzICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJlYWNoIG9mIG9ic2VydlByb2pQb2ludHMgbXVzdCBiZSBhIG1hdHJpeCAyIHggTnVtUG50cyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHBvaW50c1ByZXNbY3VyckltYWdlXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJlYWNoIG9mIHBvaW50c1ByZXMgbXVzdCBiZSBhIG1hdHJpeCAxIHggTnVtUG50IiApOworICAgICAgICB9CisgICAgICAgIGlmKCBwb2ludHNQcmVzW2N1cnJJbWFnZV0tPnJvd3MgIT0gMSB8fCBwb2ludHNQcmVzW2N1cnJJbWFnZV0tPmNvbHMgIT0gbnVtUG9pbnRzICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJlYWNoIG9mIHBvaW50c1ByZXMgbXVzdCBiZSBhIG1hdHJpeCAxIHggTnVtUG50IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFDVl9JU19NQVQocmVzdWx0UHJvak1hdHJzW2N1cnJJbWFnZV0pICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiZWFjaCBvZiByZXN1bHRQcm9qTWF0cnMgbXVzdCBiZSBhIG1hdHJpeCAzIHggNCIgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggcmVzdWx0UHJvak1hdHJzW2N1cnJJbWFnZV0tPnJvd3MgIT0gMyB8fCByZXN1bHRQcm9qTWF0cnNbY3VyckltYWdlXS0+Y29scyAhPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJlYWNoIG9mIHJlc3VsdFByb2pNYXRycyBtdXN0IGJlIGEgbWF0cml4IDMgeCA0IiApOworICAgICAgICB9CisKKyAgICB9CisgICAgLyogLS0tLS0gRW5kIHRlc3QgLS0tLS0gKi8KKworICAgIC8qIENvcHkgcHJvamVjdGlvbiBtYXRyaWNlcyB0byB2ZWN0b3JYMCAqLworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCB2ZWN0b3JYX3Byb2pNYXRyc1tjdXJySW1hZ2VdID0gY3ZDcmVhdGVNYXQoMyw0LENWXzY0RikpOworICAgICAgICBDVl9DQUxMKCBuZXdWZWN0b3JYX3Byb2pNYXRyc1tjdXJySW1hZ2VdID0gY3ZDcmVhdGVNYXQoMyw0LENWXzY0RikpOworICAgICAgICBjdkNvcHkocHJvak1hdHJzW2N1cnJJbWFnZV0sdmVjdG9yWF9wcm9qTWF0cnNbY3VyckltYWdlXSk7CisgICAgfQorCisgICAgLyogUmVjb25zdHJ1Y3QgcG9pbnRzNEQgdXNpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyBhbmQgc3RhdHVzIGluZm9ybWF0aW9uICovCisgICAgaWN2UmVjb25zdHJ1Y3RQb2ludHM0RFN0YXR1cyhvYnNlcnZQcm9qUG9pbnRzLCBwcm9qTWF0cnMsIHBvaW50c1ByZXMsIHZlY3RvclhfcG9pbnRzNEQsIG51bUltYWdlcyk7CisKKyAgICAvKiAtLS0tLSBBbGxvY2F0ZSBtZW1vcnkgZm9yIHdvcmsgbWF0cmljZXMgLS0tLS0gKi8KKyAgICAvKiBDb21wdXRlIG51bWJlciBvZiBnb29kIHBvaW50cyBvbiBlYWNoIGltYWdlcyAqLworCisgICAgQ1ZfQ0FMTCggb2JzZXJ2VmlzUG9pbnRzID0gKEN2TWF0KiopaWN2Q2xlYXJBbGxvYyhzaXplb2YoQ3ZNYXQqKSpudW1JbWFnZXMpICk7CisgICAgQ1ZfQ0FMTCggcHJvalZpc1BvaW50cyAgID0gKEN2TWF0KiopaWN2Q2xlYXJBbGxvYyhzaXplb2YoQ3ZNYXQqKSpudW1JbWFnZXMpICk7CisgICAgQ1ZfQ0FMTCggZXJyb3JQcm9qUG9pbnRzID0gKEN2TWF0KiopaWN2Q2xlYXJBbGxvYyhzaXplb2YoQ3ZNYXQqKSpudW1JbWFnZXMpICk7CisgICAgQ1ZfQ0FMTCggRGVyaXZQcm9qICAgICAgID0gKEN2TWF0KiopaWN2Q2xlYXJBbGxvYyhzaXplb2YoQ3ZNYXQqKSpudW1JbWFnZXMpICk7CisgICAgQ1ZfQ0FMTCggRGVyaXZQb2ludCAgICAgID0gKEN2TWF0KiopaWN2Q2xlYXJBbGxvYyhzaXplb2YoQ3ZNYXQqKSpudW1JbWFnZXMpICk7CisgICAgQ1ZfQ0FMTCggbWF0clcgICAgICAgICAgID0gY3ZDcmVhdGVNYXQoMTIqbnVtSW1hZ2VzLDQqbnVtUG9pbnRzLENWXzY0RikgKTsKKyAgICBDVl9DQUxMKCBtYXRyc1VrICAgICAgICAgPSAoQ3ZNYXQqKilpY3ZDbGVhckFsbG9jKHNpemVvZihDdk1hdCopKm51bUltYWdlcykgKTsKKyAgICBDVl9DQUxMKCB3b3JrTWF0cnNVayAgICAgPSAoQ3ZNYXQqKilpY3ZDbGVhckFsbG9jKHNpemVvZihDdk1hdCopKm51bUltYWdlcykgKTsKKyAgICBDVl9DQUxMKCBtYXRyc1ZpICAgICAgICAgPSAoQ3ZNYXQqKilpY3ZDbGVhckFsbG9jKHNpemVvZihDdk1hdCopKm51bVBvaW50cykgKTsKKyAgICBDVl9DQUxMKCB3b3JrTWF0clZpICAgICAgPSBjdkNyZWF0ZU1hdCg0LDQsQ1ZfNjRGKSApOworICAgIENWX0NBTEwoIHdvcmtNYXRyc0ludlZpICA9IChDdk1hdCoqKWljdkNsZWFyQWxsb2Moc2l6ZW9mKEN2TWF0KikqbnVtUG9pbnRzKSApOworCisgICAgQ1ZfQ0FMTCggamFjUHJvakVyciAgICAgID0gY3ZDcmVhdGVNYXQoMTIqbnVtSW1hZ2VzLDEsQ1ZfNjRGKSApOworICAgIENWX0NBTEwoIGphY1BvaW50RXJyICAgICA9IGN2Q3JlYXRlTWF0KDQqbnVtUG9pbnRzLDEsQ1ZfNjRGKSApOworCisKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggbWF0cnNWaVtpXSAgICAgICAgPSBjdkNyZWF0ZU1hdCg0LDQsQ1ZfNjRGKSApOworICAgICAgICBDVl9DQUxMKCB3b3JrTWF0cnNJbnZWaVtpXSA9IGN2Q3JlYXRlTWF0KDQsNCxDVl82NEYpICk7CisgICAgfQorCisgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hdHJzVWtbY3VyckltYWdlXSAgICAgPSBjdkNyZWF0ZU1hdCgxMiwxMixDVl82NEYpICk7CisgICAgICAgIENWX0NBTEwoIHdvcmtNYXRyc1VrW2N1cnJJbWFnZV0gPSBjdkNyZWF0ZU1hdCgxMiwxMixDVl82NEYpICk7CisKKyAgICAgICAgaW50IGN1cnJWaXNQb2ludCA9IDAsIGN1cnJQb2ludCwgbnVtVmlzUG9pbnQ7CisgICAgICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjdm1HZXQocG9pbnRzUHJlc1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJWaXNQb2ludCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbnVtVmlzUG9pbnQgPSBjdXJyVmlzUG9pbnQ7CisKKyAgICAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBjdXJyZW50IGltYWdlIGRhdGEgKi8KKyAgICAgICAgQ1ZfQ0FMTCggb2JzZXJ2VmlzUG9pbnRzW2N1cnJJbWFnZV0gID0gY3ZDcmVhdGVNYXQoMixudW1WaXNQb2ludCxDVl82NEYpICk7CisgICAgICAgIENWX0NBTEwoIHByb2pWaXNQb2ludHNbY3VyckltYWdlXSAgICA9IGN2Q3JlYXRlTWF0KDIsbnVtVmlzUG9pbnQsQ1ZfNjRGKSApOworCisgICAgICAgIC8qIGNyZWF0ZSBlcnJvciBtYXRyaXggKi8KKyAgICAgICAgQ1ZfQ0FMTCggZXJyb3JQcm9qUG9pbnRzW2N1cnJJbWFnZV0gPSBjdkNyZWF0ZU1hdCgyLG51bVZpc1BvaW50LENWXzY0RikgKTsKKworICAgICAgICAvKiBDcmVhdGUgZGVyaXZhdGUgbWF0cmljZXMgKi8KKyAgICAgICAgQ1ZfQ0FMTCggRGVyaXZQcm9qW2N1cnJJbWFnZV0gID0gY3ZDcmVhdGVNYXQoMipudW1WaXNQb2ludCwxMixDVl82NEYpICk7CisgICAgICAgIENWX0NBTEwoIERlcml2UG9pbnRbY3VyckltYWdlXSA9IGN2Q3JlYXRlTWF0KDIsbnVtVmlzUG9pbnQqNCxDVl82NEYpICk7CisKKyAgICAgICAgLyogQ29weSBvYnNlcnZlZCBwcm9qZWN0ZWQgdmlzaWJsZSBwb2ludHMgKi8KKyAgICAgICAgY3VyclZpc1BvaW50ID0gMDsKKyAgICAgICAgZm9yKCBjdXJyUG9pbnQgPSAwOyBjdXJyUG9pbnQgPCBudW1Qb2ludHM7IGN1cnJQb2ludCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGN2bUdldChwb2ludHNQcmVzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZtU2V0KG9ic2VydlZpc1BvaW50c1tjdXJySW1hZ2VdLDAsY3VyclZpc1BvaW50LGN2bUdldChvYnNlcnZQcm9qUG9pbnRzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpKTsKKyAgICAgICAgICAgICAgICBjdm1TZXQob2JzZXJ2VmlzUG9pbnRzW2N1cnJJbWFnZV0sMSxjdXJyVmlzUG9pbnQsY3ZtR2V0KG9ic2VydlByb2pQb2ludHNbY3VyckltYWdlXSwxLGN1cnJQb2ludCkpOworICAgICAgICAgICAgICAgIGN1cnJWaXNQb2ludCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworICAgIENWX0NBTEwoIG1hdHJUbXBTeXMxICAgPSBjdkNyZWF0ZU1hdChudW1Qb2ludHMqNCwgbnVtSW1hZ2VzKjEyLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0clN5c0RlbHRhUCA9IGN2Q3JlYXRlTWF0KG51bUltYWdlcyoxMiwgbnVtSW1hZ2VzKjEyLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggdmVjdFRtcFN5czMgICA9IGN2Q3JlYXRlTWF0KG51bVBvaW50cyo0LDEsQ1ZfNjRGKSApOworICAgIENWX0NBTEwoIHZlY3RTeXNEZWx0YVAgPSBjdkNyZWF0ZU1hdChudW1JbWFnZXMqMTIsMSxDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggZGVsdGFQICAgICAgICA9IGN2Q3JlYXRlTWF0KG51bUltYWdlcyoxMiwxLENWXzY0RikgKTsKKyAgICBDVl9DQUxMKCBkZWx0YU0gICAgICAgID0gY3ZDcmVhdGVNYXQobnVtUG9pbnRzKjQsMSxDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggdmVjdFRtcFN5c00gICA9IGN2Q3JlYXRlTWF0KG51bVBvaW50cyo0LDEsQ1ZfNjRGKSApOworCisKKy8vI2lmZGVmIFRSQUNLX0JVTkRMRQorI2lmIDEKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBmaWxlIHRvIHRyYWNrICovCisgICAgICAgIEZJTEUqIGZpbGU7CisgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJ3Iik7CisgICAgICAgIGZwcmludGYoZmlsZSwiYmVnaW5cbiIpOworICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiA9PT09PT09PT09PT09IG1haW4gb3B0aW1pemF0aW9uIGxvb3AgPT09PT09PT09PT09PT0gKi8KKworICAgIC8qIHByb2plY3QgYWxsIHBvaW50cyB1c2luZyBjdXJyZW50IHZlY3RvciBYICovCisgICAgaWN2UHJvalBvaW50c1N0YXR1c0Z1bmMobnVtSW1hZ2VzLCB2ZWN0b3JYX3BvaW50czRELCB2ZWN0b3JYX3Byb2pNYXRycywgcG9pbnRzUHJlcywgcHJvalZpc1BvaW50cyk7CisKKyAgICAvKiBDb21wdXRlIGVycm9yIHdpdGggb2JzZXJ2ZWQgdmFsdWUgYW5kIGNvbXB1dGVkIHByb2plY3Rpb24gKi8KKyAgICBkb3VibGUgcHJldkVycm9yOworICAgIHByZXZFcnJvciA9IDA7CisgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICB7CisgICAgICAgIGN2U3ViKG9ic2VydlZpc1BvaW50c1tjdXJySW1hZ2VdLHByb2pWaXNQb2ludHNbY3VyckltYWdlXSxlcnJvclByb2pQb2ludHNbY3VyckltYWdlXSk7CisgICAgICAgIGRvdWJsZSBjdXJyTm9ybSA9IGN2Tm9ybShlcnJvclByb2pQb2ludHNbY3VyckltYWdlXSk7CisgICAgICAgIHByZXZFcnJvciArPSBjdXJyTm9ybSAqIGN1cnJOb3JtOworICAgIH0KKyAgICBwcmV2RXJyb3IgPSBzcXJ0KHByZXZFcnJvcik7CisKKyAgICBpbnQgY3Vyckl0ZXI7CisgICAgZG91YmxlIGNoYW5nZTsKKyAgICBkb3VibGUgYWxwaGE7CisKKy8vI2lmZGVmIFRSQUNLX0JVTkRMRQorI2lmIDEKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBmaWxlIHRvIHRyYWNrICovCisgICAgICAgIEZJTEUqIGZpbGU7CisgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgIGZwcmludGYoZmlsZSwiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTs7CisgICAgICAgIGZwcmludGYoZmlsZSwiSXRlcj0wXG4iKTsKKyAgICAgICAgZnByaW50ZihmaWxlLCJFcnJvciA9ICUyMC4xNWxmXG4iLHByZXZFcnJvcik7CisgICAgICAgIGZwcmludGYoZmlsZSwiQ2hhbmdlID0gJTIwLjE1bGZcbiIsMS4wKTsKKworICAgICAgICBmcHJpbnRmKGZpbGUsInByb2plY3Rpb24gZXJyb3JzXG4iKTsKKworICAgICAgICAvKiBQcmludCBhbGwgcHJvZWpjdGlvbiBlcnJvcnMgKi8KKyAgICAgICAgaW50IGN1cnJJbWFnZTsKKyAgICAgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrKQorICAgICAgICB7CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuSW1hZ2U9JWRcbiIsY3VyckltYWdlKTsKKyAgICAgICAgICAgIGludCBudW1QbiA9IGVycm9yUHJvalBvaW50c1tjdXJySW1hZ2VdLT5jb2xzOworICAgICAgICAgICAgZm9yKCBpbnQgY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG47IGN1cnJQb2ludCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZXgsZXk7CisgICAgICAgICAgICAgICAgZXggPSBjdm1HZXQoZXJyb3JQcm9qUG9pbnRzW2N1cnJJbWFnZV0sMCxjdXJyUG9pbnQpOworICAgICAgICAgICAgICAgIGV5ID0gY3ZtR2V0KGVycm9yUHJvalBvaW50c1tjdXJySW1hZ2VdLDEsY3VyclBvaW50KTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIiU0MC4zNWxmLCAlNDAuMzVsZlxuIixleCxleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmNsb3NlKGZpbGUpOworICAgIH0KKyNlbmRpZgorCisgICAgY3Vyckl0ZXIgPSAwOworICAgIGNoYW5nZSA9IDE7CisgICAgYWxwaGEgPSAwLjAwMTsKKworCisgICAgZG8KKyAgICB7CisKKyNpZmRlZiBUUkFDS19CVU5ETEUKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSAqZmlsZTsKKyAgICAgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuLS0tLS0gdGVzdCA2IGRvIG1haW4gLS0tLS1cbiIpOworCisgICAgICAgICAgICBkb3VibGUgbm9ybSA9IGN2Tm9ybSh2ZWN0b3JYX3BvaW50czREKTsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiICAgICAgICB0ZXN0IDYuMDEgcHJldiBub3JtUG50cz0lbGZcbiIsbm9ybSk7CisKKyAgICAgICAgICAgIGZvciggaW50IGk9MDtpPG51bUltYWdlcztpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtID0gY3ZOb3JtKHZlY3RvclhfcHJvak1hdHJzW2ldKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIiAgICAgICAgdGVzdCA2LjAxIHByZXYgbm9ybVByb2o9JWxmXG4iLG5vcm0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIENvbXB1dGUgZGVyaXZhdGVzIGJ5IHByb2plY3Rpbm9uIG1hdHJpY2VzICovCisgICAgICAgIGljdkNvbXB1dGVEZXJpdmF0ZVByb2pBbGwodmVjdG9yWF9wb2ludHM0RCx2ZWN0b3JYX3Byb2pNYXRycyxwb2ludHNQcmVzLG51bUltYWdlcyxEZXJpdlByb2opOworCisgICAgICAgIC8qIENvbXB1dGUgZGVyaXZhdGVzIGJ5IDREIHBvaW50cyAqLworICAgICAgICBpY3ZDb21wdXRlRGVyaXZhdGVQb2ludHNBbGwodmVjdG9yWF9wb2ludHM0RCx2ZWN0b3JYX3Byb2pNYXRycyxwb2ludHNQcmVzLG51bUltYWdlcyxEZXJpdlBvaW50KTsKKworICAgICAgICAvKiBDb21wdXRlIG1hdHJjZXMgVWsgKi8KKyAgICAgICAgaWN2Q29tcHV0ZU1hdHJpeFVBbGwobnVtSW1hZ2VzLERlcml2UHJvaixtYXRyc1VrKTsKKyAgICAgICAgaWN2Q29tcHV0ZU1hdHJpeFZBbGwobnVtSW1hZ2VzLERlcml2UG9pbnQscG9pbnRzUHJlcyxtYXRyc1ZpKTsKKyAgICAgICAgaWN2Q29tcHV0ZU1hdHJpeFcobnVtSW1hZ2VzLERlcml2UHJvaixEZXJpdlBvaW50LHBvaW50c1ByZXMsbWF0clcpOworCisKKyNpZmRlZiBUUkFDS19CVU5ETEUKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSAqZmlsZTsKKyAgICAgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuLS0tLS0gdGVzdCA2LjAzIGRvIG1hdHJzIFUgViAtLS0tLVxuIik7CisKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bUltYWdlczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbm9ybSA9IGN2Tm9ybShtYXRyc1VrW2ldKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIiAgICAgICAgdGVzdCA2LjAxIHByZXYgbWF0cnNVaz0lbGZcbiIsbm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIG5vcm0gPSBjdk5vcm0obWF0cnNWaVtpXSk7CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCIgICAgICAgIHRlc3QgNi4wMSBwcmV2IG1hdHJzVmk9JWxmXG4iLG5vcm0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIENvbXB1dGUgamFjIGVycm9ycyAqLworICAgICAgICBpY3ZDb21wdXRlSmFjRXJyb3JQcm9qKG51bUltYWdlcywgRGVyaXZQcm9qLCBlcnJvclByb2pQb2ludHMsIGphY1Byb2pFcnIpOworICAgICAgICBpY3ZDb21wdXRlSmFjRXJyb3JQb2ludChudW1JbWFnZXMsIERlcml2UG9pbnQsIGVycm9yUHJvalBvaW50cywgcG9pbnRzUHJlcywgamFjUG9pbnRFcnIpOworCisjaWZkZWYgVFJBQ0tfQlVORExFCisgICAgICAgIHsKKyAgICAgICAgICAgIEZJTEUgKmZpbGU7CisgICAgICAgICAgICBmaWxlID0gZm9wZW4oIFRSQUNLX0JVTkRMRV9GSUxFICwiYSIpOworICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbi0tLS0tIHRlc3QgNiBkbyBtYWluIC0tLS0tXG4iKTsKKyAgICAgICAgICAgIGRvdWJsZSBub3JtMSA9IGN2Tm9ybSh2ZWN0b3JYX3BvaW50czREKTsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiICAgICAgICB0ZXN0IDYuMDIgcG9zdCBub3JtUG50cz0lbGZcbiIsbm9ybTEpOworICAgICAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgLyogQ29weSBtYXRyaWNlcyBVayB0byB3b3JrIG1hdHJpY2VzIFVrICovCisgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Q29weShtYXRyc1VrW2N1cnJJbWFnZV0sd29ya01hdHJzVWtbY3VyckltYWdlXSk7CisgICAgICAgIH0KKworI2lmZGVmIFRSQUNLX0JVTkRMRQorICAgICAgICB7CisgICAgICAgICAgICBGSUxFICpmaWxlOworICAgICAgICAgICAgZmlsZSA9IGZvcGVuKCBUUkFDS19CVU5ETEVfRklMRSAsImEiKTsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG4tLS0tLSB0ZXN0IDYwLjMgZG8gbWF0cnMgVSBWIC0tLS0tXG4iKTsKKworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtSW1hZ2VzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtID0gY3ZOb3JtKG1hdHJzVWtbaV0pOworICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiICAgICAgICB0ZXN0IDYuMDEgcG9zdDEgbWF0cnNVaz0lbGZcbiIsbm9ybSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIG5vcm0gPSBjdk5vcm0obWF0cnNWaVtpXSk7CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCIgICAgICAgIHRlc3QgNi4wMSBwb3N0MSBtYXRyc1ZpPSVsZlxuIixub3JtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvKiA9PT09PT09PT09IFNvbHZlIG5vcm1hbCBlcXVhdGlvbiBmb3IgZ2l2ZW4gYWxwaGEgYW5kIEphY29iaWFuID09PT09PT09PT09PSAqLworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIC0tLS0gQWRkIGFscGhhIHRvIG1hdHJpY2VzIC0tLSAqLworICAgICAgICAgICAgLyogQWRkIGFscGhhIHRvIG1hdHJJbnZWaSBhbmQgbWFrZSB3b3JrTWF0cnNJbnZWaSAqLworCisgICAgICAgICAgICBpbnQgY3VyclY7CisgICAgICAgICAgICBmb3IoIGN1cnJWID0gMDsgY3VyclYgPCBudW1Qb2ludHM7IGN1cnJWKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Q29weShtYXRyc1ZpW2N1cnJWXSx3b3JrTWF0clZpKTsKKworICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldCh3b3JrTWF0clZpLGksaSxjdm1HZXQobWF0cnNWaVtjdXJyVl0saSxpKSooMSthbHBoYSkgKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjdkludmVydCh3b3JrTWF0clZpLHdvcmtNYXRyc0ludlZpW2N1cnJWXSxDVl9MVS8qLCZjdXJyViovKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQWRkIGFscGhhIHRvIG1hdHJVayBhbmQgbWFrZSBtYXRyaXggd29ya01hdHJzVWsgKi8KKyAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldCh3b3JrTWF0cnNVa1tjdXJySW1hZ2VdLGksaSxjdm1HZXQobWF0cnNVa1tjdXJySW1hZ2VdLGksaSkqKDErYWxwaGEpKTsKKyAgICAgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGaWxsIG1hdHJpeCB0byBtYWtlIHN5c3RlbSBmb3IgY29tcHV0aW5nIGRlbHRhIFAgKG1hdHJUbXBTeXMxID0gaW52KFYpKnRyKFcpICkqLworICAgICAgICAgICAgZm9yKCBjdXJyViA9IDA7IGN1cnJWIDwgbnVtUG9pbnRzOyBjdXJyVisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VyclJvd1Y7CisgICAgICAgICAgICAgICAgZm9yKCBjdXJyUm93ViA9IDA7IGN1cnJSb3dWIDwgNDsgY3VyclJvd1YrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBjdXJyQ29sID0gMDsgY3VyckNvbCA8IDEyOyBjdXJyQ29sKysgKS8qIEZvciBlYWNoIGNvbHVtbiBvZiB0cmFuc3Bvc2VkIG1hdHJpeCBXICovCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY3ZtR2V0KHdvcmtNYXRyc0ludlZpW2N1cnJWXSxjdXJyUm93VixpKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdm1HZXQobWF0clcsY3VyckltYWdlKjEyK2N1cnJDb2wsY3VyclYqNCtpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KG1hdHJUbXBTeXMxLGN1cnJWKjQrY3VyclJvd1YsY3VyckltYWdlKjEyK2N1cnJDb2wsc3VtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICAvKiBGaWxsIG1hdHJpeCB0byBtYWtlIHN5c3RlbSBmb3IgY29tcHV0aW5nIGRlbHRhIFAgKG1hdHJUbXBTeXMyID0gVyAqIG1hdHJUbXBTeXMgKSAqLworICAgICAgICAgICAgY3ZtTXVsKG1hdHJXLG1hdHJUbXBTeXMxLG1hdHJTeXNEZWx0YVApOworCisgICAgICAgICAgICAvKiBuZWVkIHRvIGNvbXB1dGUgVS1tYXRyVG1wU3lzMi4gQnV0IHdlIGNvbXB1dGUgbWF0VG1wU3lzMi1VICovCisgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2TWF0IHN1Yk1hdHI7CisgICAgICAgICAgICAgICAgY3ZHZXRTdWJSZWN0KG1hdHJTeXNEZWx0YVAsJnN1Yk1hdHIsY3ZSZWN0KGN1cnJJbWFnZSoxMixjdXJySW1hZ2UqMTIsMTIsMTIpKTsKKyAgICAgICAgICAgICAgICBjdlN1Yigmc3ViTWF0cix3b3JrTWF0cnNVa1tjdXJySW1hZ2VdLCZzdWJNYXRyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tcHV0ZSByaWdodCBzaWRlIG9mIG5vcm1hbCBlcXVhdGlvbiAgKi8KKyAgICAgICAgICAgIGZvciggY3VyclYgPSAwOyBjdXJyViA8IG51bVBvaW50czsgY3VyclYrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZNYXQgc3ViTWF0ckVyUG50czsKKyAgICAgICAgICAgICAgICBDdk1hdCBzdWJNYXRyOworICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdChqYWNQb2ludEVyciwmc3ViTWF0ckVyUG50cyxjdlJlY3QoMCxjdXJyVio0LDEsNCkpOworICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdCh2ZWN0VG1wU3lzMywmc3ViTWF0cixjdlJlY3QoMCxjdXJyVio0LDEsNCkpOworICAgICAgICAgICAgICAgIGN2bU11bCh3b3JrTWF0cnNJbnZWaVtjdXJyVl0sJnN1Yk1hdHJFclBudHMsJnN1Yk1hdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdm1NdWwobWF0clcsdmVjdFRtcFN5czMsdmVjdFN5c0RlbHRhUCk7CisgICAgICAgICAgICBjdlN1Yih2ZWN0U3lzRGVsdGFQLGphY1Byb2pFcnIsdmVjdFN5c0RlbHRhUCk7CisKKyAgICAgICAgICAgIC8qIE5vdyB3ZSBjYW4gY29tcHV0ZSBwYXJ0IG9mIG5vcm1hbCBzeXN0ZW0gLSBkZWx0YVAgKi8KKyAgICAgICAgICAgIGN2U29sdmUobWF0clN5c0RlbHRhUCAsdmVjdFN5c0RlbHRhUCwgZGVsdGFQLCBDVl9TVkQpOworCisgICAgICAgICAgICAvKiBQcmludCBkZWx0YVAgdG8gZmlsZSAqLworCisjaWZkZWYgVFJBQ0tfQlVORExFCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRklMRSogZmlsZTsKKyAgICAgICAgICAgICAgICBmaWxlID0gZm9wZW4oIFRSQUNLX0JVTkRMRV9GSUxFX0RFTFRBUCAsInciKTsKKworICAgICAgICAgICAgICAgIGludCBjdXJySW1hZ2U7CisgICAgICAgICAgICAgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCBudW1JbWFnZXM7IGN1cnJJbWFnZSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiXG5JbWFnZT0lZFxuIixjdXJySW1hZ2UpOworICAgICAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDEyOyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gY3ZtR2V0KGRlbHRhUCxjdXJySW1hZ2UqMTIraSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiJWxmXG4iLHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIC8qIFdlIGtub3cgZGVsdGFQIGFuZCBub3cgd2UgY2FuIGNvbXB1dGUgc3lzdGVtIGZvciBkZWx0YU0gKi8KKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHMgKiA0OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnVtSW1hZ2VzICogMTI7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gY3ZtR2V0KG1hdHJXLGosaSkgKiBjdm1HZXQoZGVsdGFQLGosMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN2bVNldCh2ZWN0VG1wU3lzTSxpLDAsY3ZtR2V0KGphY1BvaW50RXJyLGksMCktc3VtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tcHV0ZSBkZWx0YU0gKi8KKyAgICAgICAgICAgIGZvciggY3VyclYgPSAwOyBjdXJyViA8IG51bVBvaW50czsgY3VyclYrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZNYXQgc3ViTWF0cjsKKyAgICAgICAgICAgICAgICBDdk1hdCBzdWJNYXRyTTsKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QodmVjdFRtcFN5c00sJnN1Yk1hdHIsY3ZSZWN0KDAsY3VyclYqNCwxLDQpKTsKKyAgICAgICAgICAgICAgICBjdkdldFN1YlJlY3QoZGVsdGFNLCZzdWJNYXRyTSxjdlJlY3QoMCxjdXJyVio0LDEsNCkpOworICAgICAgICAgICAgICAgIGN2bU11bCh3b3JrTWF0cnNJbnZWaVtjdXJyVl0sJnN1Yk1hdHIsJnN1Yk1hdHJNKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogV2Uga25vdyBkZWx0YSBhbmQgY29tcHV0ZSBuZXcgdmFsdWUgb2YgdmVjdG9yIFg6IG5leHRWZWN0WCA9IHZlY3RYICsgZGVsdGFzICovCisKKyAgICAgICAgICAgIC8qIENvbXB1dGUgbmV3IFAgKi8KKyAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldChuZXdWZWN0b3JYX3Byb2pNYXRyc1tjdXJySW1hZ2VdLGksaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZtR2V0KHZlY3RvclhfcHJvak1hdHJzW2N1cnJJbWFnZV0saSxqKSArIGN2bUdldChkZWx0YVAsY3VyckltYWdlKjEyK2kqNCtqLDApKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogQ29tcHV0ZSBuZXcgTSAqLworICAgICAgICAgICAgaW50IGN1cnJQb2ludDsKKyAgICAgICAgICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdm1TZXQobmV3VmVjdG9yWF9wb2ludHM0RCxpLGN1cnJQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bUdldCh2ZWN0b3JYX3BvaW50czRELGksY3VyclBvaW50KSArIGN2bUdldChkZWx0YU0sY3VyclBvaW50KjQraSwwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiAtLS0tLSBDb21wdXRlIGVycm9ycyBmb3IgbmV3IHZlY3RvclggLS0tLS0gKi8KKyAgICAgICAgICAgIC8qIFByb2plY3QgcG9pbnRzIHVzaW5nIG5ldyB2ZWN0b3JYIGFuZCBzdGF0dXMgb2YgZWFjaCBwb2ludCAqLworICAgICAgICAgICAgaWN2UHJvalBvaW50c1N0YXR1c0Z1bmMobnVtSW1hZ2VzLCBuZXdWZWN0b3JYX3BvaW50czRELCBuZXdWZWN0b3JYX3Byb2pNYXRycywgcG9pbnRzUHJlcywgcHJvalZpc1BvaW50cyk7CisgICAgICAgICAgICAvKiBDb21wdXRlIGVycm9yIHdpdGggb2JzZXJ2ZWQgdmFsdWUgYW5kIGNvbXB1dGVkIHByb2plY3Rpb24gKi8KKyAgICAgICAgICAgIGRvdWJsZSBuZXdFcnJvciA9IDA7CisgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2U3ViKG9ic2VydlZpc1BvaW50c1tjdXJySW1hZ2VdLHByb2pWaXNQb2ludHNbY3VyckltYWdlXSxlcnJvclByb2pQb2ludHNbY3VyckltYWdlXSk7CisgICAgICAgICAgICAgICAgZG91YmxlIGN1cnJOb3JtID0gY3ZOb3JtKGVycm9yUHJvalBvaW50c1tjdXJySW1hZ2VdKTsKKworLy8jaWZkZWYgVFJBQ0tfQlVORExFCisjaWYgMQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRklMRSAqZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgZmlsZSA9IGZvcGVuKCBUUkFDS19CVU5ETEVfRklMRSAsImEiKTsKKyAgICAgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbi0tLS0tIHRlc3QgMTMsMDEgY3VyckltYWdlPSVkIGN1cnJOb3JtPSVsZiAtLS0tLVxuIixjdXJySW1hZ2UsY3Vyck5vcm0pOworICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgbmV3RXJyb3IgKz0gY3Vyck5vcm0gKiBjdXJyTm9ybTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5ld0Vycm9yID0gc3FydChuZXdFcnJvcik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGN1cnJJdGVyKys7CisKKworCisKKy8vI2lmZGVmIFRSQUNLX0JVTkRMRQorI2lmIDEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgZmlsZSB0byB0cmFjayAqLworICAgICAgICAgICAgICAgIEZJTEUqIGZpbGU7CisgICAgICAgICAgICAgICAgZmlsZSA9IGZvcGVuKCBUUkFDS19CVU5ETEVfRklMRSAsImEiKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJudW1Qb2ludHM9JWRcbiIsbnVtUG9pbnRzKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIkl0ZXI9JWRcbiIsY3Vyckl0ZXIpOworICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiRXJyb3IgPSAlMjAuMTVsZlxuIixuZXdFcnJvcik7CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJDaGFuZ2UgPSAlMjAuMTVsZlxuIixjaGFuZ2UpOworCisKKyAgICAgICAgICAgICAgICAvKiBQcmludCBhbGwgcHJvamVjdGlvbiBlcnJvcnMgKi8KKyNpZiAwCisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJwcm9qZWN0aW9uIGVycm9yc1xuIik7CisgICAgICAgICAgICAgICAgaW50IGN1cnJJbWFnZTsKKyAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IG51bUltYWdlczsgY3VyckltYWdlKyspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuSW1hZ2U9JWRcbiIsY3VyckltYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG51bVBuID0gZXJyb3JQcm9qUG9pbnRzW2N1cnJJbWFnZV0tPmNvbHM7CisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGN1cnJQb2ludCA9IDA7IGN1cnJQb2ludCA8IG51bVBuOyBjdXJyUG9pbnQrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBleCxleTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ID0gY3ZtR2V0KGVycm9yUHJvalBvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV5ID0gY3ZtR2V0KGVycm9yUHJvalBvaW50c1tjdXJySW1hZ2VdLDEsY3VyclBvaW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiJWxmLCVsZlxuIixleCxleSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnByaW50ZihmaWxlLCJcbi0tLS0gdGVzdCAwIC0tLS0tXG4iKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICAgICAgfQorI2VuZGlmCisKKworCisgICAgICAgICAgICAvKiBDb21wYXJlIG5ldyBlcnJvciBhbmQgbGFzdCBlcnJvciAqLworICAgICAgICAgICAgaWYoIG5ld0Vycm9yIDwgcHJldkVycm9yICkKKyAgICAgICAgICAgIHsvKiBhY2NlcHQgbmV3IHZhbHVlICovCisgICAgICAgICAgICAgICAgcHJldkVycm9yID0gbmV3RXJyb3I7CisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSByZWxhdGl2ZSBjaGFuZ2Ugb2YgcmVxdWlyZWQgcGFyYW1ldGVyIHZlY3RvclguIGNoYW5nZSA9IG5vcm0oY3Vyci1wcmV2KSAvIG5vcm0oY3VycikgKSAgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtQWxsMSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBub3JtQWxsMiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjdXJyTm9ybTEgPSAwOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgY3Vyck5vcm0yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLyogY29tcHV0ZSBub3JtIGZvciBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisgICAgICAgICAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJOb3JtMSA9IGN2Tm9ybShuZXdWZWN0b3JYX3Byb2pNYXRyc1tjdXJySW1hZ2VdLHZlY3RvclhfcHJvak1hdHJzW2N1cnJJbWFnZV0pOworICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck5vcm0yID0gY3ZOb3JtKG5ld1ZlY3RvclhfcHJvak1hdHJzW2N1cnJJbWFnZV0pOworCisgICAgICAgICAgICAgICAgICAgICAgICBub3JtQWxsMSArPSBjdXJyTm9ybTEgKiBjdXJyTm9ybTE7CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtQWxsMiArPSBjdXJyTm9ybTIgKiBjdXJyTm9ybTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvKiBjb21wdXRlIG5vcm0gZm9yIHBvaW50cyAqLworICAgICAgICAgICAgICAgICAgICBjdXJyTm9ybTEgPSBjdk5vcm0obmV3VmVjdG9yWF9wb2ludHM0RCx2ZWN0b3JYX3BvaW50czREKTsKKyAgICAgICAgICAgICAgICAgICAgY3Vyck5vcm0yID0gY3ZOb3JtKG5ld1ZlY3RvclhfcG9pbnRzNEQpOworCisgICAgICAgICAgICAgICAgICAgIG5vcm1BbGwxICs9IGN1cnJOb3JtMSAqIGN1cnJOb3JtMTsKKyAgICAgICAgICAgICAgICAgICAgbm9ybUFsbDIgKz0gY3Vyck5vcm0yICogY3Vyck5vcm0yOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbXB1dGUgY2hhbmdlICovCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZSA9IHNxcnQobm9ybUFsbDEpIC8gc3FydChub3JtQWxsMik7CisKKworLy8jaWZkZWYgVFJBQ0tfQlVORExFCisjaWYgMQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBDcmVhdGUgZmlsZSB0byB0cmFjayAqLworICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogZmlsZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuQ2hhbmdlIGluc2lkZSBuZXdWYWwgY2hhbmdlID0gJTIwLjE1bGZcbiIsY2hhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiICAgbm9ybUFsbDE9ICUyMC4xNWxmXG4iLHNxcnQobm9ybUFsbDEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZmlsZSwiICAgbm9ybUFsbDI9ICUyMC4xNWxmXG4iLHNxcnQobm9ybUFsbDIpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGFscGhhIC89IDEwOworICAgICAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdkNvcHkobmV3VmVjdG9yWF9wcm9qTWF0cnNbY3VyckltYWdlXSx2ZWN0b3JYX3Byb2pNYXRyc1tjdXJySW1hZ2VdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3ZDb3B5KG5ld1ZlY3RvclhfcG9pbnRzNEQsdmVjdG9yWF9wb2ludHM0RCk7CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHBoYSAqPSAxMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IHdoaWxlKCBjaGFuZ2UgPiBlcHNpbG9uICYmIGN1cnJJdGVyIDwgbWF4SXRlciApOy8qIHNvbHZlIG5vcm1hbCBlcXVhdGlvbiB1c2luZyBjdXJyZW50IGFscGhhICovCisKKy8vI2lmZGVmIFRSQUNLX0JVTkRMRQorI2lmIDEKKyAgICAgICAgeworICAgICAgICAgICAgRklMRSogZmlsZTsKKyAgICAgICAgICAgIGZpbGUgPSBmb3BlbiggVFJBQ0tfQlVORExFX0ZJTEUgLCJhIik7CisgICAgICAgICAgICBmcHJpbnRmKGZpbGUsIlxuQmVzdCBlcnJvciA9ICU0MC4zNWxmXG4iLHByZXZFcnJvcik7CisgICAgICAgICAgICBmY2xvc2UoZmlsZSk7CisgICAgICAgIH0KKworI2VuZGlmCisKKworICAgIH0gd2hpbGUoIGNoYW5nZSA+IGVwc2lsb24gJiYgY3Vyckl0ZXIgPCBtYXhJdGVyICk7CisgICAgIAorICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworICAgIC8qIE9wdGltaXphdGlvbiBjb21wbGV0ZSBjb3B5IGNvbXB1dGVkIHBhcmFtcyAqLworICAgIC8qIENvcHkgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgbnVtSW1hZ2VzOyBjdXJySW1hZ2UrKyApCisgICAgeworICAgICAgICBjdkNvcHkobmV3VmVjdG9yWF9wcm9qTWF0cnNbY3VyckltYWdlXSxyZXN1bHRQcm9qTWF0cnNbY3VyckltYWdlXSk7CisgICAgfQorICAgIC8qIENvcHkgNEQgcG9pbnRzICovCisgICAgY3ZDb3B5KG5ld1ZlY3RvclhfcG9pbnRzNEQscmVzdWx0UG9pbnRzNEQpOworCisvLyAgICBmcmVlKG1lbW9yeSk7CisKKyAgICBfX0VORF9fOworCisgICAgLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisKKyAgICAvKiBGcmVlIHNpbXBsZSBtYXRyaWNlcyAqLworICAgIGN2RnJlZSgmdmVjdG9yWF9wb2ludHM0RCk7CisgICAgY3ZGcmVlKCZuZXdWZWN0b3JYX3BvaW50czREKTsKKyAgICBjdkZyZWUoJmNoYW5nZVZlY3RvclhfcG9pbnRzNEQpOworICAgIGN2RnJlZSgmY2hhbmdlVmVjdG9yWF9wcm9qTWF0cnMpOworICAgIGN2RnJlZSgmbWF0clcpOworICAgIGN2RnJlZSgmd29ya01hdHJWaSk7CisgICAgY3ZGcmVlKCZqYWNQcm9qRXJyKTsKKyAgICBjdkZyZWUoJmphY1BvaW50RXJyKTsKKyAgICBjdkZyZWUoJm1hdHJUbXBTeXMxKTsKKyAgICBjdkZyZWUoJm1hdHJTeXNEZWx0YVApOworICAgIGN2RnJlZSgmdmVjdFRtcFN5czMpOworICAgIGN2RnJlZSgmdmVjdFN5c0RlbHRhUCk7CisgICAgY3ZGcmVlKCZkZWx0YVApOworICAgIGN2RnJlZSgmZGVsdGFNKTsKKyAgICBjdkZyZWUoJnZlY3RUbXBTeXNNKTsKKworICAgIC8qIEZyZWUgYXJyYXlzIG9mIG1hdHJpY2VzICovCisgICAgaWN2RnJlZU1hdHJpeEFycmF5KCZ2ZWN0b3JYX3Byb2pNYXRycyxudW1JbWFnZXMpOworICAgIGljdkZyZWVNYXRyaXhBcnJheSgmbmV3VmVjdG9yWF9wcm9qTWF0cnMsbnVtSW1hZ2VzKTsKKyAgICBpY3ZGcmVlTWF0cml4QXJyYXkoJm9ic2VydlZpc1BvaW50cyxudW1JbWFnZXMpOworICAgIGljdkZyZWVNYXRyaXhBcnJheSgmcHJvalZpc1BvaW50cyxudW1JbWFnZXMpOworICAgIGljdkZyZWVNYXRyaXhBcnJheSgmZXJyb3JQcm9qUG9pbnRzLG51bUltYWdlcyk7CisgICAgaWN2RnJlZU1hdHJpeEFycmF5KCZEZXJpdlByb2osbnVtSW1hZ2VzKTsKKyAgICBpY3ZGcmVlTWF0cml4QXJyYXkoJkRlcml2UG9pbnQsbnVtSW1hZ2VzKTsKKyAgICBpY3ZGcmVlTWF0cml4QXJyYXkoJm1hdHJzVWssbnVtSW1hZ2VzKTsKKyAgICBpY3ZGcmVlTWF0cml4QXJyYXkoJndvcmtNYXRyc1VrLG51bUltYWdlcyk7CisgICAgaWN2RnJlZU1hdHJpeEFycmF5KCZtYXRyc1ZpLG51bVBvaW50cyk7CisgICAgaWN2RnJlZU1hdHJpeEFycmF5KCZ3b3JrTWF0cnNJbnZWaSxudW1Qb2ludHMpOworCisgICAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2bGV2bWFydHJpZi5jcHAgYi9jdmF1eC9zcmMvY3ZsZXZtYXJ0cmlmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBiMTNkCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2bGV2bWFydHJpZi5jcHAKQEAgLTAsMCArMSw0OTcgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKyNpbmNsdWRlICJjdnR5cGVzLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJjdi5oIgorCisvKiBWYWxlcnkgTW9zeWFnaW4gKi8KKwordHlwZWRlZiB2b2lkICgqcG9pbnRlcl9MTUphYykoIGNvbnN0IEN2TWF0KiBzcmMsIEN2TWF0KiBkc3QgKTsKK3R5cGVkZWYgdm9pZCAoKnBvaW50ZXJfTE1GdW5jKSggY29uc3QgQ3ZNYXQqIHNyYywgQ3ZNYXQqIGRzdCApOworCit2b2lkIGN2TGV2ZW5iZXJnTWFycXVhcmR0T3B0aW1pemF0aW9uKHBvaW50ZXJfTE1KYWMgSmFjb2JpYW5GdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfTE1GdW5jIGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwb2ludGVyX0VyciBlcnJvcl9mdW5jdGlvbiwqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgKlgwLEN2TWF0ICpvYnNlcnZSZXMsQ3ZNYXQgKnJlc3VsdFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SXRlcixkb3VibGUgZXBzaWxvbik7CisKK3ZvaWQgaWN2UmVjb25zdHJ1Y3RQb2ludHNGb3IzVmlldyggQ3ZNYXQqIHByb2pNYXRyMSxDdk1hdCogcHJvak1hdHIyLEN2TWF0KiBwcm9qTWF0cjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qUG9pbnRzMSxDdk1hdCogcHJvalBvaW50czIsQ3ZNYXQqIHByb2pQb2ludHMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcG9pbnRzNEQpOworCisKKy8qIEphY29iaWFuIGNvbXB1dGF0aW9uIGZvciB0cmlmb2NhbCBjYXNlICovCit2b2lkIGljdkphY29iaWFuRnVuY3Rpb25fUHJvalRyaWZvY2FsKGNvbnN0IEN2TWF0ICp2ZWN0WCxDdk1hdCAqSmFjb2JpYW4pCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZKYWNvYmlhbkZ1bmN0aW9uX1Byb2pUcmlmb2NhbCIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGRhdGEgZm9yIGVycm9ycyAqLworICAgIGlmKCB2ZWN0WCA9PSAwIHx8IEphY29iaWFuID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQodmVjdFgpIHx8ICFDVl9JU19NQVQoSmFjb2JpYW4pICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gKHZlY3RYLT5yb3dzIC0gMzYpLzQ7CisKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApLy8hISEgTmVlZCB0byBjb3JyZWN0IHRoaXMgbWluaW1hbCBudW1iZXIgb2YgcG9pbnRzCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJudW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgbW9yZSB0aGFuIDAiICk7CisgICAgfQorCisgICAgaWYoIEphY29iaWFuLT5yb3dzID09IG51bVBvaW50cyo2IHx8IEphY29iaWFuLT5jb2xzICE9IDM2K251bVBvaW50cyo0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgSmFjb2JpYW4gaXMgbm90IGNvcnJlY3QgaXQgbXVzdCBiZSA2Km51bVBvaW50cyB4ICgzNitudW1Qb2ludHMqNCkiICk7CisgICAgfQorCisgICAgLyogQ29tcHV0ZWQgSmFjb2JpYW4gaW4gYSBnaXZlbiBwb2ludCAqLworICAgIC8qIFRoaXMgaXMgZm9yIGZ1bmN0aW9uIHdpdGggMyBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisgICAgLyogdmVjdG9yIFggY29uc2lzdHMgb2YgcHJvamVjdGlvbiBtYXRyaWNlcyBhbmQgcG9pbnRzM0QgKi8KKyAgICAvKiBlYWNoIDNEIHBvaW50cyBoYXMgWCxZLFosVyAqLworICAgIC8qIGVhY2ggcHJvamVjdGlvbiBtYXRyaWNlcyBoYXMgM3g0IGNvZWZmcyAqLworICAgIC8qIEZvciBOIHBvaW50cyA0RCB3ZSBoYXZlIEphY29iaWFuIDJOIHggKDEyKjMrNE4pICovCisKKyAgICAvKiBXaWxsIHN0b3JlIGRlcml2YXRlcyBhcyAgKi8KKyAgICAvKiBGaWxsIEphY29iaWFuIG1hdHJpeCAqLworICAgIGludCBjdXJyUHJvalBvaW50OworICAgIGludCBjdXJyTWF0cjsKKyAgICAKKyAgICBjdlplcm8oSmFjb2JpYW4pOworICAgIGZvciggY3Vyck1hdHIgPSAwOyBjdXJyTWF0ciA8IDM7IGN1cnJNYXRyKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHBbMTJdOworICAgICAgICBmb3IoIGludCBpPTA7aTwxMjtpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBwW2ldID0gY3ZtR2V0KHZlY3RYLGN1cnJNYXRyKjEyK2ksMCk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgY3VyclZhbCA9IDM2OworICAgICAgICBmb3IoIGN1cnJQcm9qUG9pbnQgPSAwOyBjdXJyUHJvalBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUHJvalBvaW50KysgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb21wdXRlICovCisgICAgICAgICAgICBkb3VibGUgWFs0XTsKKyAgICAgICAgICAgIFhbMF0gPSBjdm1HZXQodmVjdFgsY3VyclZhbCsrLDApOworICAgICAgICAgICAgWFsxXSA9IGN2bUdldCh2ZWN0WCxjdXJyVmFsKyssMCk7CisgICAgICAgICAgICBYWzJdID0gY3ZtR2V0KHZlY3RYLGN1cnJWYWwrKywwKTsKKyAgICAgICAgICAgIFhbM10gPSBjdm1HZXQodmVjdFgsY3VyclZhbCsrLDApOworCisgICAgICAgICAgICBkb3VibGUgcGlYWzNdOworICAgICAgICAgICAgcGlYWzBdID0gWFswXSpwWzBdICsgWFsxXSpwWzFdICsgWFsyXSpwWzJdICArIFhbM10qcFszXTsKKyAgICAgICAgICAgIHBpWFsxXSA9IFhbMF0qcFs0XSArIFhbMV0qcFs1XSArIFhbMl0qcFs2XSAgKyBYWzNdKnBbN107CisgICAgICAgICAgICBwaVhbMl0gPSBYWzBdKnBbOF0gKyBYWzFdKnBbOV0gKyBYWzJdKnBbMTBdICsgWFszXSpwWzExXTsKKworICAgICAgICAgICAgaW50IGksajsKKyAgICAgICAgICAgIC8qIGZpbGwgZGVyaXZhdGUgYnkgcG9pbnQgKi8KKworICAgICAgICAgICAgZG91YmxlIHRtcDMgPSAxLyhwaVhbMl0qcGlYWzJdKTsKKworICAgICAgICAgICAgZG91YmxlIHRtcDEgPSAtcGlYWzBdKnRtcDM7CisgICAgICAgICAgICBkb3VibGUgdG1wMiA9IC1waVhbMV0qdG1wMzsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAyOyBqKysgKS8vZm9yIHggYW5kIHkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkvLyBmb3IgWCxZLFosVworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KCBKYWNvYmlhbiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3Vyck1hdHIqbnVtUG9pbnRzKjIrY3VyclByb2pQb2ludCoyK2osIDM2K2N1cnJQcm9qUG9pbnQqNCtpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwW2oqNCtpXSpwaVhbMl0tcFs4K2ldKnBpWFtqXSkgKiB0bXAzICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmaWxsIGRlcml2YXRlIGJ5IHByb2plY3Rpb24gbWF0cml4ICovCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBkZXJpdmF0ZSBmb3IgeCAqLworICAgICAgICAgICAgICAgIGN2bVNldChKYWNvYmlhbixjdXJyTWF0cipudW1Qb2ludHMqMitjdXJyUHJvalBvaW50KjIsY3Vyck1hdHIqMTIraSxYW2ldL3BpWFsyXSk7Ly94JyBwMWkKKyAgICAgICAgICAgICAgICBjdm1TZXQoSmFjb2JpYW4sY3Vyck1hdHIqbnVtUG9pbnRzKjIrY3VyclByb2pQb2ludCoyLGN1cnJNYXRyKjEyKzgraSxYW2ldKnRtcDEpOy8veCcgcDNpCisKKyAgICAgICAgICAgICAgICAvKiBkZXJpdmF0ZSBmb3IgeSAqLworICAgICAgICAgICAgICAgIGN2bVNldChKYWNvYmlhbixjdXJyTWF0cipudW1Qb2ludHMqMitjdXJyUHJvalBvaW50KjIrMSxjdXJyTWF0cioxMis0K2ksWFtpXS9waVhbMl0pOy8veScgcDJpCisgICAgICAgICAgICAgICAgY3ZtU2V0KEphY29iaWFuLGN1cnJNYXRyKm51bVBvaW50cyoyK2N1cnJQcm9qUG9pbnQqMisxLGN1cnJNYXRyKjEyKzgraSxYW2ldKnRtcDIpOy8veScgcDNpCisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisgICAgcmV0dXJuOworfQorCit2b2lkIGljdkZ1bmNfUHJvalRyaWZvY2FsKGNvbnN0IEN2TWF0ICp2ZWN0WCwgQ3ZNYXQgKnJlc0Z1bmMpCit7CisgICAgLyogQ29tcHV0ZXMgZnVuY3Rpb24gaW4gYSBnaXZlbiBwb2ludCAqLworICAgIC8qIENvbXB1dGVycyBwcm9qZWN0IHBvaW50cyB1c2luZyAzIHByb2plY3Rpb24gbWF0cmljZXMgYW5kIHBvaW50cyAzRCAqLworCisgICAgLyogdmVjdG9yIFggY29uc2lzdHMgb2YgcHJvamVjdGlvbiBtYXRyaWNlcyBhbmQgcG9pbnRzM0QgKi8KKyAgICAvKiBlYWNoIHByb2plY3Rpb24gbWF0cmljZXMgaGFzIDN4NCBjb2VmZnMgKi8KKyAgICAvKiBlYWNoIDNEIHBvaW50cyBoYXMgWCxZLFosVyg/KSAqLworCisgICAgLyogcmVzdWx0IG9mIGZ1bmN0aW9uIGlzIHByb2plY3Rpb24gb2YgTiAzRCBwb2ludHMgdXNpbmcgMyBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisgICAgLyogcHJvamVjdGVkIHBvaW50cyBzdG9yZSBhcyAocHJvamVjdGlvbiBieSBtYXRyaXggUDEpLChwcm9qZWN0aW9uIGJ5IG1hdHJpeCBQMiksKHByb2plY3Rpb24gYnkgbWF0cml4IFAzKSAqLworICAgIC8qIGVhY2ggcHJvamVjdGlvbiBpcyB4MSx5MSx4Mix5Mix4Myx5Myx4NCx5NCAqLworCisgICAgLyogQ29tcHV0ZSBwcm9qZWN0aW9uIG9mIHBvaW50cyAqLworCisgICAgLyogRmlsbCBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisKKyAgICBDVl9GVU5DTkFNRSggImljdkZ1bmNfUHJvalRyaWZvY2FsIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIFRlc3QgZGF0YSBmb3IgZXJyb3JzICovCisgICAgaWYoIHZlY3RYID09IDAgfHwgcmVzRnVuYyA9PSAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHZlY3RYKSB8fCAhQ1ZfSVNfTUFUKHJlc0Z1bmMpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gKHZlY3RYLT5yb3dzIC0gMzYpLzQ7CisKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApLy8hISEgTmVlZCB0byBjb3JyZWN0IHRoaXMgbWluaW1hbCBudW1iZXIgb2YgcG9pbnRzCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJudW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgbW9yZSB0aGFuIDAiICk7CisgICAgfQorCisgICAgaWYoIHJlc0Z1bmMtPnJvd3MgPT0gMipudW1Qb2ludHMqMyB8fCByZXNGdW5jLT5jb2xzICE9IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiByZXNGdW5jIGlzIG5vdCBjb3JyZWN0IGl0IG11c3QgYmUgMipudW1Qb2ludHMqMyB4IDEiKTsKKyAgICB9CisKKworICAgIEN2TWF0IHByb2pNYXRyc1szXTsKKyAgICBkb3VibGUgcHJvak1hdHJzX2RhdFszNl07CisgICAgcHJvak1hdHJzWzBdID0gY3ZNYXQoMyw0LENWXzY0Rixwcm9qTWF0cnNfZGF0KTsKKyAgICBwcm9qTWF0cnNbMV0gPSBjdk1hdCgzLDQsQ1ZfNjRGLHByb2pNYXRyc19kYXQrMTIpOworICAgIHByb2pNYXRyc1syXSA9IGN2TWF0KDMsNCxDVl82NEYscHJvak1hdHJzX2RhdCsyNCk7CisKKyAgICBDdk1hdCBwb2ludDNEOworICAgIGRvdWJsZSBwb2ludDNEX2RhdFszXTsKKyAgICBwb2ludDNEID0gY3ZNYXQoMywxLENWXzY0Rixwb2ludDNEX2RhdCk7CisKKyAgICBpbnQgY3Vyck1hdHI7CisgICAgaW50IGN1cnJWOworICAgIGludCBpLGo7CisKKyAgICBjdXJyVj0wOworICAgIGZvciggY3Vyck1hdHIgPSAwOyBjdXJyTWF0ciA8IDM7IGN1cnJNYXRyKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7aiA8IDQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGN2bUdldCh2ZWN0WCxjdXJyViwwKTsKKyAgICAgICAgICAgICAgICBjdm1TZXQoJnByb2pNYXRyc1tjdXJyTWF0cl0saSxqLHZhbCk7CisgICAgICAgICAgICAgICAgY3VyclYrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFByb2plY3QgcG9pbnRzICovCisgICAgaW50IGN1cnJQb2ludDsKKyAgICBDdk1hdCBwb2ludDREOworICAgIGRvdWJsZSBwb2ludDREX2RhdFs0XTsKKyAgICBwb2ludDREID0gY3ZNYXQoNCwxLENWXzY0Rixwb2ludDREX2RhdCk7CisgICAgZm9yKCBjdXJyUG9pbnQgPSAwOyBjdXJyUG9pbnQgPCBudW1Qb2ludHM7IGN1cnJQb2ludCsrICkKKyAgICB7CisgICAgICAgIC8qIGdldCBjdXJyIHBvaW50ICovCisgICAgICAgIHBvaW50NERfZGF0WzBdID0gY3ZtR2V0KHZlY3RYLGN1cnJWKyssMCk7CisgICAgICAgIHBvaW50NERfZGF0WzFdID0gY3ZtR2V0KHZlY3RYLGN1cnJWKyssMCk7CisgICAgICAgIHBvaW50NERfZGF0WzJdID0gY3ZtR2V0KHZlY3RYLGN1cnJWKyssMCk7CisgICAgICAgIHBvaW50NERfZGF0WzNdID0gY3ZtR2V0KHZlY3RYLGN1cnJWKyssMCk7CisKKyAgICAgICAgZm9yKCBjdXJyTWF0ciA9IDA7IGN1cnJNYXRyIDwgMzsgY3Vyck1hdHIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIENvbXB1dGUgcHJvamVjdGlvbiBmb3IgY3VycmVudCBwb2ludCAqLworICAgICAgICAgICAgY3ZtTXVsKCZwcm9qTWF0cnNbY3Vyck1hdHJdLCZwb2ludDRELCZwb2ludDNEKTsKKyAgICAgICAgICAgIGRvdWJsZSB6ID0gcG9pbnQzRF9kYXRbMl07CisgICAgICAgICAgICBjdm1TZXQocmVzRnVuYyxjdXJyTWF0cipudW1Qb2ludHMqMiArIGN1cnJQb2ludCoyLCAgMCxwb2ludDNEX2RhdFswXS96KTsKKyAgICAgICAgICAgIGN2bVNldChyZXNGdW5jLGN1cnJNYXRyKm51bVBvaW50cyoyICsgY3VyclBvaW50KjIrMSwwLHBvaW50M0RfZGF0WzFdL3opOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKyAgICByZXR1cm47Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBpY3ZPcHRpbWl6ZVByb2plY3Rpb25Ucmlmb2NhbChDdk1hdCAqKnByb2pNYXRycyxDdk1hdCAqKnByb2pQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0ICoqcmVzdWx0UHJvak1hdHJzLCBDdk1hdCAqcmVzdWx0UG9pbnRzNEQpCit7CisKKyAgICBDdk1hdCAqb3B0aW1YICAgID0gMDsKKyAgICBDdk1hdCAqcG9pbnRzNEQgID0gMDsKKyAgICBDdk1hdCAqdmVjdG9yWDAgID0gMDsKKyAgICBDdk1hdCAqb2JzZXJ2UmVzID0gMDsKKyAgICAvL0N2TWF0ICplcnJvciAgICAgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZPcHRpbWl6ZVByb2plY3Rpb25Ucmlmb2NhbCIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGRhdGEgZm9yIGVycm9ycyAqLworICAgIGlmKCBwcm9qTWF0cnMgPT0gMCB8fCBwcm9qUG9pbnRzID09IDAgfHwgcmVzdWx0UHJvak1hdHJzID09IDAgfHwgcmVzdWx0UG9pbnRzNEQgPT0gMCkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHJlc3VsdFBvaW50czREKSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJyZXN1bHRQb2ludHM0RCBtdXN0IGJlIGEgbWF0cml4IiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcmVzdWx0UG9pbnRzNEQtPmNvbHM7CisgICAgaWYoIG51bVBvaW50cyA8IDEgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgcG9pbnRzIG9mIHJlc3VsdFBvaW50czREIG11c3QgYmUgbW9yZSB0aGFuIDAiICk7CisgICAgfQorCisgICAgaWYoIHJlc3VsdFBvaW50czRELT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIG9mIHBvaW50czREIG11c3QgYmUgNCIgKTsKKyAgICB9CisKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBwcm9qTWF0cnNbaV0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwcm9qTWF0cnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggcHJvalBvaW50c1tpXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHByb2pQb2ludHMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgaWYoIHJlc3VsdFByb2pNYXRyc1tpXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHJlc3VsdFByb2pNYXRycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIC0tLS0tLS0tLS0tIHRlc3QgZm9yIG1hdHJpeCAtLS0tLS0tLS0tLS0tICovCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHByb2pNYXRyc1tpXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJFYWNoIG9mIHByb2pNYXRycyBtdXN0IGJlIGEgbWF0cml4IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFDVl9JU19NQVQocHJvalBvaW50c1tpXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJFYWNoIG9mIHByb2pQb2ludHMgbXVzdCBiZSBhIG1hdHJpeCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHJlc3VsdFByb2pNYXRyc1tpXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJFYWNoIG9mIHJlc3VsdFByb2pNYXRycyBtdXN0IGJlIGEgbWF0cml4IiApOworICAgICAgICB9CisKKyAgICAgICAgLyogLS0tLS0tLS0tLS0tLSBUZXN0IHNpemVzIC0tLS0tLS0tLS0tLS0tLSAqLworICAgICAgICBpZiggcHJvak1hdHJzW2ldLT5yb3dzICE9IDMgfHwgcHJvak1hdHJzW2ldLT5jb2xzICE9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHByb2pNYXRyIG11c3QgYmUgM3g0IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHByb2pQb2ludHNbaV0tPnJvd3MgIT0gMiB8fCBwcm9qUG9pbnRzW2ldLT5jb2xzICE9IG51bVBvaW50cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgcmVzdWx0UHJvak1hdHJzIG11c3QgYmUgM3g0IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHJlc3VsdFByb2pNYXRyc1tpXS0+cm93cyAhPSAzIHx8IHJlc3VsdFByb2pNYXRyc1tpXS0+Y29scyAhPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiByZXN1bHRQcm9qTWF0cnMgbXVzdCBiZSAzeDQiICk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgcG9pbnRzIDREICovCisgICAgQ1ZfQ0FMTCggcG9pbnRzNEQgID0gY3ZDcmVhdGVNYXQoNCxudW1Qb2ludHMsQ1ZfNjRGKSApOworICAgIENWX0NBTEwoIHZlY3RvclgwICA9IGN2Q3JlYXRlTWF0KDM2ICsgbnVtUG9pbnRzKjQsMSxDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggb2JzZXJ2UmVzID0gY3ZDcmVhdGVNYXQoMipudW1Qb2ludHMqMywxLENWXzY0RikgKTsKKyAgICBDVl9DQUxMKCBvcHRpbVggICAgPSBjdkNyZWF0ZU1hdCgzNitudW1Qb2ludHMqNCwxLENWXzY0RikgKTsKKyAgICAvL0NWX0NBTEwoIGVycm9yICAgICA9IGN2Q3JlYXRlTWF0KG51bVBvaW50cyoyKjMsMSxDVl82NEYpICk7CisKKworICAgIC8qIFJlY29uc3RydWN0IHBvaW50cyA0RCB1c2luZyBwcm9qZWN0ZWQgcG9pbnRzIGFuZCBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisgICAgaWN2UmVjb25zdHJ1Y3RQb2ludHNGb3IzVmlldyggcHJvak1hdHJzWzBdLHByb2pNYXRyc1sxXSxwcm9qTWF0cnNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvalBvaW50c1swXSxwcm9qUG9pbnRzWzFdLHByb2pQb2ludHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzNEQpOworCisKKworICAgIC8qIEZpbGwgb2JzZXJ2ZWQgcG9pbnRzIG9uIGltYWdlcyAqLworICAgIC8qIHJlc3VsdCBvZiBmdW5jdGlvbiBpcyBwcm9qZWN0aW9uIG9mIE4gM0QgcG9pbnRzIHVzaW5nIDMgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgIC8qIHByb2plY3RlZCBwb2ludHMgc3RvcmUgYXMgKHByb2plY3Rpb24gYnkgbWF0cml4IFAxKSwocHJvamVjdGlvbiBieSBtYXRyaXggUDIpLChwcm9qZWN0aW9uIGJ5IG1hdHJpeCBQMykgKi8KKyAgICAvKiBlYWNoIHByb2plY3Rpb24gaXMgeDEseTEseDIseTIseDMseTMseDQseTQgKi8KKyAgICBpbnQgY3Vyck1hdHI7CisgICAgZm9yKCBjdXJyTWF0ciA9IDA7IGN1cnJNYXRyIDwgMzsgY3Vyck1hdHIrKyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjdm1TZXQob2JzZXJ2UmVzLGN1cnJNYXRyKm51bVBvaW50cyoyK2kqMiAgLDAsY3ZtR2V0KHByb2pQb2ludHNbY3Vyck1hdHJdLDAsaSkgKTsvKiB4ICovCisgICAgICAgICAgICBjdm1TZXQob2JzZXJ2UmVzLGN1cnJNYXRyKm51bVBvaW50cyoyK2kqMisxLDAsY3ZtR2V0KHByb2pQb2ludHNbY3Vyck1hdHJdLDEsaSkgKTsvKiB5ICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaWxsIHdpdGggcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgIGZvciggY3Vyck1hdHIgPSAwOyBjdXJyTWF0ciA8IDM7IGN1cnJNYXRyKysgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZtU2V0KHZlY3RvclgwLGN1cnJNYXRyKjEyK2ksMCxjdm1HZXQocHJvak1hdHJzW2N1cnJNYXRyXSxpLzQsaSU0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBGaWxsIHdpdGggNEQgcG9pbnRzICovCisKKyAgICBpbnQgY3VyclBvaW50OworICAgIGZvciggY3VyclBvaW50ID0gMDsgY3VyclBvaW50IDwgbnVtUG9pbnRzOyBjdXJyUG9pbnQrKyApCisgICAgeworICAgICAgICBjdm1TZXQodmVjdG9yWDAsMzYgKyBjdXJyUG9pbnQqNCArIDAsMCxjdm1HZXQocG9pbnRzNEQsMCxjdXJyUG9pbnQpKTsKKyAgICAgICAgY3ZtU2V0KHZlY3RvclgwLDM2ICsgY3VyclBvaW50KjQgKyAxLDAsY3ZtR2V0KHBvaW50czRELDEsY3VyclBvaW50KSk7CisgICAgICAgIGN2bVNldCh2ZWN0b3JYMCwzNiArIGN1cnJQb2ludCo0ICsgMiwwLGN2bUdldChwb2ludHM0RCwyLGN1cnJQb2ludCkpOworICAgICAgICBjdm1TZXQodmVjdG9yWDAsMzYgKyBjdXJyUG9pbnQqNCArIDMsMCxjdm1HZXQocG9pbnRzNEQsMyxjdXJyUG9pbnQpKTsKKyAgICB9CisKKyAgICAKKyAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHJlc3VsdCAqLworICAgIGN2TGV2ZW5iZXJnTWFycXVhcmR0T3B0aW1pemF0aW9uKCBpY3ZKYWNvYmlhbkZ1bmN0aW9uX1Byb2pUcmlmb2NhbCwgaWN2RnVuY19Qcm9qVHJpZm9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvclgwLG9ic2VydlJlcyxvcHRpbVgsMTAwLDFlLTYpOworCisgICAgLyogQ29weSByZXN1bHRzICovCisgICAgZm9yKCBjdXJyTWF0ciA9IDA7IGN1cnJNYXRyIDwgMzsgY3Vyck1hdHIrKyApCisgICAgeworICAgICAgICAvKiBDb3B5IHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgZm9yKGludCBpPTA7aTwxMjtpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2bVNldChyZXN1bHRQcm9qTWF0cnNbY3Vyck1hdHJdLGkvNCxpJTQsY3ZtR2V0KG9wdGltWCxjdXJyTWF0cioxMitpLDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvcHkgNEQgcG9pbnRzICovCisgICAgZm9yKCBjdXJyUG9pbnQgPSAwOyBjdXJyUG9pbnQgPCBudW1Qb2ludHM7IGN1cnJQb2ludCsrICkKKyAgICB7CisgICAgICAgIGN2bVNldChyZXN1bHRQb2ludHM0RCwwLGN1cnJQb2ludCxjdm1HZXQob3B0aW1YLDM2ICsgY3VyclBvaW50KjQsMCkpOworICAgICAgICBjdm1TZXQocmVzdWx0UG9pbnRzNEQsMSxjdXJyUG9pbnQsY3ZtR2V0KG9wdGltWCwzNiArIGN1cnJQb2ludCo0KzEsMCkpOworICAgICAgICBjdm1TZXQocmVzdWx0UG9pbnRzNEQsMixjdXJyUG9pbnQsY3ZtR2V0KG9wdGltWCwzNiArIGN1cnJQb2ludCo0KzIsMCkpOworICAgICAgICBjdm1TZXQocmVzdWx0UG9pbnRzNEQsMyxjdXJyUG9pbnQsY3ZtR2V0KG9wdGltWCwzNiArIGN1cnJQb2ludCo0KzMsMCkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICAvKiBGcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBjdlJlbGVhc2VNYXQoJm9wdGltWCk7CisgICAgY3ZSZWxlYXNlTWF0KCZwb2ludHM0RCk7CisgICAgY3ZSZWxlYXNlTWF0KCZ2ZWN0b3JYMCk7CisgICAgY3ZSZWxlYXNlTWF0KCZvYnNlcnZSZXMpOworCisgICAgcmV0dXJuOworCisKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogQ3JlYXRlIGdvb2QgcG9pbnRzIHVzaW5nIHN0YXR1cyBpbmZvcm1hdGlvbiAqLwordm9pZCBpY3ZDcmVhdGVHb29kUG9pbnRzKEN2TWF0ICpwb2ludHMsQ3ZNYXQgKipnb29kUG9pbnRzLCBDdk1hdCAqc3RhdHVzKQoreworICAgICpnb29kUG9pbnRzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q3JlYXRlR29vZFBvaW50cyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgbnVtUG9pbnRzOworICAgIG51bVBvaW50cyA9IHBvaW50cy0+Y29sczsKKworICAgIGlmKCBudW1Qb2ludHMgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlIG1vcmUgdGhhbiAwIiApOworICAgIH0KKworICAgIGludCBudW1Db29yZDsKKyAgICBudW1Db29yZCA9IHBvaW50cy0+cm93czsKKyAgICBpZiggbnVtQ29vcmQgPCAxICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIG9mIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlIG1vcmUgdGhhbiAwIiApOworICAgIH0KKworICAgIC8qIERlZmluZSBudW1iZXIgb2YgZ29vZCBwb2ludHMgKi8KKyAgICBpbnQgZ29vZE51bTsKKyAgICBpbnQgaSxqOworCisgICAgZ29vZE51bSA9IDA7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrKQorICAgIHsKKyAgICAgICAgaWYoIGN2bUdldChzdGF0dXMsMCxpKSA+IDAgKQorICAgICAgICAgICAgZ29vZE51bSsrOworICAgIH0KKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgZ29vZCBwb2ludHMgKi8KKyAgICBDVl9DQUxMKCAqZ29vZFBvaW50cyA9IGN2Q3JlYXRlTWF0KG51bUNvb3JkLGdvb2ROdW0sQ1ZfNjRGKSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IG51bUNvb3JkOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGN1cnJQb2ludCA9IDA7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBudW1Qb2ludHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGN2bUdldChzdGF0dXMsMCxqKSA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2bVNldCgqZ29vZFBvaW50cyxpLGN1cnJQb2ludCxjdm1HZXQocG9pbnRzLGksaikpOworICAgICAgICAgICAgICAgIGN1cnJQb2ludCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIF9fRU5EX187CisgICAgcmV0dXJuOworfQorCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZsaW5lcy5jcHAgYi9jdmF1eC9zcmMvY3ZsaW5lcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZlY2U3MgotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmxpbmVzLmNwcApAQCAtMCwwICsxLDQ4MyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKyNpZiAwCitDdlN0YXR1cworaWN2RmV0Y2hMaW5lOHVDM1IoIHVjaGFyICogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgdWNoYXIgKiBkc3QsIGludCAqZHN0X251bSwgQ3ZTaXplIHNyY19zaXplLCBDdlBvaW50IHN0YXJ0LCBDdlBvaW50IGVuZCApCit7CisgICAgaW50IGk7CisgICAgaW50IGR4ID0gZW5kLnggLSBzdGFydC54LCBkeSA9IGVuZC55IC0gc3RhcnQueTsKKyAgICBpbnQgZXJyOworCisgICAgaWYoICFzcmMgfHwgIWRzdCB8fCAoc3JjX3NpemUud2lkdGggfCBzcmNfc2l6ZS5oZWlnaHQpIDwgMCB8fAorICAgICAgICBzcmNfc3RlcCA8IHNyY19zaXplLndpZHRoICogMyB8fAorICAgICAgICAodW5zaWduZWQpIHN0YXJ0LnggPj0gKHVuc2lnbmVkKSBzcmNfc2l6ZS53aWR0aCB8fAorICAgICAgICAodW5zaWduZWQpIHN0YXJ0LnkgPj0gKHVuc2lnbmVkKSBzcmNfc2l6ZS5oZWlnaHQgfHwKKyAgICAgICAgKHVuc2lnbmVkKSBlbmQueCA+PSAodW5zaWduZWQpIHNyY19zaXplLndpZHRoIHx8CisgICAgICAgICh1bnNpZ25lZCkgZW5kLnkgPj0gKHVuc2lnbmVkKSBzcmNfc2l6ZS5oZWlnaHQgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIGlmKCBkeCA8IDAgKQorICAgIHsKKyAgICAgICAgZHggPSAtZHg7CisgICAgICAgIGR5ID0gLWR5OworICAgICAgICBzdGFydC54ID0gZW5kLng7CisgICAgICAgIHN0YXJ0LnkgPSBlbmQueTsKKyAgICB9CisKKyAgICBzcmMgKz0gc3RhcnQueSAqIHNyY19zdGVwICsgc3RhcnQueCAqIDM7CisKKyAgICBpID0gZHkgPj4gMzE7CisgICAgZHkgPSAoZHkgXiBpKSAtIGk7CisgICAgc3JjX3N0ZXAgPSAoc3JjX3N0ZXAgXiBpKSAtIGk7CisKKyAgICBpZiggZHggPiBkeSApCisgICAgeworICAgICAgICBpZiggZHN0X251bSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqZHN0X251bSA8PSBkeCApCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgICAgICAgICAgKmRzdF9udW0gPSBkeCArIDE7CisgICAgICAgIH0KKyAgICAgICAgZXJyID0gZHg7CisgICAgICAgIGR4ICs9IGR4OworICAgICAgICBkeSArPSBkeTsKKyAgICAgICAgZm9yKCBpID0gZHg7IGkgPj0gMDsgaSAtPSAyLCBkc3QgKz0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXNrID0gKGVyciAtPSBkeSkgPCAwID8gLTEgOiAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgICAgICBkc3RbMl0gPSBzcmNbMl07CisKKyAgICAgICAgICAgIGVyciArPSBkeCAmIG1hc2s7CisgICAgICAgICAgICBzcmMgKz0gKHNyY19zdGVwICYgbWFzaykgKyAzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBkc3RfbnVtICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICpkc3RfbnVtIDw9IGR5ICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisgICAgICAgICAgICAqZHN0X251bSA9IGR5ICsgMTsKKyAgICAgICAgfQorICAgICAgICBlcnIgPSBkeTsKKyAgICAgICAgZHggKz0gZHg7CisgICAgICAgIGR5ICs9IGR5OworICAgICAgICBmb3IoIGkgPSBkeTsgaSA+PSAwOyBpIC09IDIsIGRzdCArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1hc2sgPSAoZXJyIC09IGR4KSA8IDAgPyAtMSA6IDA7CisKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKKyAgICAgICAgICAgIGRzdFsyXSA9IHNyY1syXTsKKworICAgICAgICAgICAgZXJyICs9IGR5ICYgbWFzazsKKyAgICAgICAgICAgIHNyYyArPSBzcmNfc3RlcCArIChtYXNrICYgMyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworQ3ZTdGF0dXMKK2ljdkRyYXdMaW5lOHVDM1IoIHVjaGFyICogc3JjLCBpbnQgc3JjX251bSwKKyAgICAgICAgICAgICAgICAgIHVjaGFyICogZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSBkc3Rfc2l6ZSwgQ3ZQb2ludCBzdGFydCwgQ3ZQb2ludCBlbmQgKQoreworICAgIGludCBpOworICAgIGludCBkeCA9IGVuZC54IC0gc3RhcnQueCwgZHkgPSBlbmQueSAtIHN0YXJ0Lnk7CisgICAgaW50IGVycjsKKworICAgIGlmKCAhc3JjIHx8ICFkc3QgfHwgKGRzdF9zaXplLndpZHRoIHwgZHN0X3NpemUuaGVpZ2h0KSA8IDAgfHwKKyAgICAgICAgZHN0X3N0ZXAgPCBkc3Rfc2l6ZS53aWR0aCAqIDMgfHwKKyAgICAgICAgKHVuc2lnbmVkKSBzdGFydC54ID49ICh1bnNpZ25lZCkgZHN0X3NpemUud2lkdGggfHwKKyAgICAgICAgKHVuc2lnbmVkKSBzdGFydC55ID49ICh1bnNpZ25lZCkgZHN0X3NpemUuaGVpZ2h0IHx8CisgICAgICAgICh1bnNpZ25lZCkgZW5kLnggPj0gKHVuc2lnbmVkKSBkc3Rfc2l6ZS53aWR0aCB8fAorICAgICAgICAodW5zaWduZWQpIGVuZC55ID49ICh1bnNpZ25lZCkgZHN0X3NpemUuaGVpZ2h0ICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBpZiggZHggPCAwICkKKyAgICB7CisgICAgICAgIGR4ID0gLWR4OworICAgICAgICBkeSA9IC1keTsKKyAgICAgICAgc3RhcnQueCA9IGVuZC54OworICAgICAgICBzdGFydC55ID0gZW5kLnk7CisgICAgfQorCisgICAgZHN0ICs9IHN0YXJ0LnkgKiBkc3Rfc3RlcCArIHN0YXJ0LnggKiAzOworCisgICAgaSA9IGR5ID4+IDMxOworICAgIGR5ID0gKGR5IF4gaSkgLSBpOworICAgIGRzdF9zdGVwID0gKGRzdF9zdGVwIF4gaSkgLSBpOworCisgICAgaWYoIGR4ID4gZHkgKQorICAgIHsKKyAgICAgICAgaWYoICh1bnNpZ25lZCkgKHNyY19udW0gLSAxKSA8ICh1bnNpZ25lZCkgZHggKQorICAgICAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgICAgICBlcnIgPSBkeDsKKyAgICAgICAgZHggKz0gZHg7CisgICAgICAgIGR5ICs9IGR5OworICAgICAgICBmb3IoIGkgPSBkeDsgaSA+PSAwOyBpIC09IDIsIHNyYyArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1hc2sgPSAoZXJyIC09IGR5KSA8IDAgPyAtMSA6IDA7CisKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1sxXTsKKyAgICAgICAgICAgIGRzdFsyXSA9IHNyY1syXTsKKyAgICAgICAgICAgIGVyciArPSBkeCAmIG1hc2s7CisgICAgICAgICAgICBkc3QgKz0gKGRzdF9zdGVwICYgbWFzaykgKyAzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAodW5zaWduZWQpIChzcmNfbnVtIC0gMSkgPCAodW5zaWduZWQpIGR5ICkKKyAgICAgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICAgICAgZXJyID0gZHk7CisgICAgICAgIGR4ICs9IGR4OworICAgICAgICBkeSArPSBkeTsKKyAgICAgICAgZm9yKCBpID0gZHk7IGkgPj0gMDsgaSAtPSAyLCBzcmMgKz0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtYXNrID0gKGVyciAtPSBkeCkgPCAwID8gLTEgOiAwOworCisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgICAgICBkc3RbMl0gPSBzcmNbMl07CisgICAgICAgICAgICBlcnIgKz0gZHkgJiBtYXNrOworICAgICAgICAgICAgZHN0ICs9IGRzdF9zdGVwICsgKG1hc2sgJiAzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorI2VuZGlmCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdlByZVdhcnBJbWFnZTh1QzNSKCBpbnQgbnVtTGluZXMsICAgICAvKiBudW1iZXIgb2Ygc2NhbmxpbmVzICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIHNyYywgICAgICAvKiBzb3VyY2UgaW1hZ2UgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgc3JjX3N0ZXAsICAgICAvKiBsaW5lIHN0ZXAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICogZHN0LCAgICAgIC8qIGRlc3QgYnVmZmVycyAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqZHN0X251bXMsICAgIC8qIGxlbnMgb2YgYnVmZmVyICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzcmNfc2l6ZSwgIC8qIGltYWdlIHNpemUgaW4gcGl4ZWxzICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FubGluZXMgKSAgLyogc2NhbmxpbmVzIGFycmF5ICAgICAgICovCit7CisgICAgaW50IGs7CisgICAgQ3ZQb2ludCBzdGFydDsKKyAgICBDdlBvaW50IGVuZDsKKyAgICBpbnQgY3VycjsKKyAgICBpbnQgY3Vycl9kc3Q7CisgICAgQ3ZNYXQgbWF0OworCisgICAgY3VyciA9IDA7CisgICAgY3Vycl9kc3QgPSAwOworCisgICAgY3ZJbml0TWF0SGVhZGVyKCAmbWF0LCBzcmNfc2l6ZS5oZWlnaHQsIHNyY19zaXplLndpZHRoLCBDVl84VUMzLCBzcmMsIHNyY19zdGVwICk7CisKKyAgICBmb3IoIGsgPSAwOyBrIDwgbnVtTGluZXM7IGsrKyApCisgICAgeworICAgICAgICBzdGFydC54ID0gc2NhbmxpbmVzW2N1cnIrK107CisgICAgICAgIHN0YXJ0LnkgPSBzY2FubGluZXNbY3VycisrXTsKKworICAgICAgICBlbmQueCA9IHNjYW5saW5lc1tjdXJyKytdOworICAgICAgICBlbmQueSA9IHNjYW5saW5lc1tjdXJyKytdOworCisjaWZkZWYgX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgQ3ZMaW5lSXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIGFzc2VydCggY3ZJbml0TGluZUl0ZXJhdG9yKCAmbWF0LCBzdGFydCwgZW5kLCAmaXRlcmF0b3IsIDggKSA9PSBkc3RfbnVtc1trXSApOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgY3ZTYW1wbGVMaW5lKCAmbWF0LCBzdGFydCwgZW5kLCBkc3QgKyBjdXJyX2RzdCwgOCApOworICAgICAgICBjdXJyX2RzdCArPSBkc3RfbnVtc1trXSAqIDM7CisKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdlBvc3RXYXJwSW1hZ2U4dUMzUiggaW50IG51bUxpbmVzLCAgICAvKiBudW1iZXIgb2Ygc2NhbmxpbmVzICAqLworICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIHNyYywgICAgIC8qIHNvdXJjZSBidWZmZXJzICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqc3JjX251bXMsICAgLyogbGVucyBvZiBidWZmZXJzICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKiBkc3QsICAgICAvKiBkZXN0IGltYWdlICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0X3N0ZXAsICAgIC8qIGRlc3QgaW1hZ2Ugc3RlcCAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBkc3Rfc2l6ZSwgLyogZGVzdCBpbWFnZSBzaXplICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FubGluZXMgKSAvKiBzY2FubGluZSAgICAgICAgICAgICAqLworeworICAgIGludCBpLCBrOworICAgIEN2UG9pbnQgc3RhcnQ7CisgICAgQ3ZQb2ludCBlbmQ7CisgICAgaW50IGN1cnI7CisgICAgaW50IHNyY19udW07CisgICAgaW50IGN1cnJfc3JjOworICAgIEN2TWF0IG1hdDsKKyAgICBDdkxpbmVJdGVyYXRvciBpdGVyYXRvcjsKKworICAgIGN1cnIgPSAwOworICAgIGN1cnJfc3JjID0gMDsKKworICAgIGN2SW5pdE1hdEhlYWRlciggJm1hdCwgZHN0X3NpemUuaGVpZ2h0LCBkc3Rfc2l6ZS53aWR0aCwgQ1ZfOFVDMywgZHN0LCBkc3Rfc3RlcCApOworCisgICAgZm9yKCBrID0gMDsgayA8IG51bUxpbmVzOyBrKysgKQorICAgIHsKKyAgICAgICAgc3RhcnQueCA9IHNjYW5saW5lc1tjdXJyKytdOworICAgICAgICBzdGFydC55ID0gc2NhbmxpbmVzW2N1cnIrK107CisKKyAgICAgICAgZW5kLnggPSBzY2FubGluZXNbY3VycisrXTsKKyAgICAgICAgZW5kLnkgPSBzY2FubGluZXNbY3VycisrXTsKKworICAgICAgICBzcmNfbnVtID0gc3JjX251bXNba107CisKKyAgICAgICAgaWYoIGN2SW5pdExpbmVJdGVyYXRvciggJm1hdCwgc3RhcnQsIGVuZCwgJml0ZXJhdG9yLCA4ICkgIT0gc3JjX251bSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgICAgIHJldHVybiBDVl9OT1RERUZJTkVEX0VSUjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzcmNfbnVtOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoIGl0ZXJhdG9yLnB0ciwgc3JjICsgY3Vycl9zcmMsIDMgKTsKKyAgICAgICAgICAgIENWX05FWFRfTElORV9QT0lOVCggaXRlcmF0b3IgKTsKKyAgICAgICAgICAgIGN1cnJfc3JjICs9IDM7CisgICAgICAgIH0KKworI2lmIDAKKyAgICAgICAgZXJyID0gaWN2RHJhd0xpbmU4dUMzUiggc3JjICsgY3Vycl9zcmMsIC8qIHNvdXJzZSBidWZmZXIgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX251bSwgICAgICAgIC8qIGxlbiBvZiBidWZmZXIgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCAgICAvKiBkZXN0IGltYWdlICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCAgICAgICAvKiBkZXN0IGltYWdlIHN0ZXAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zaXplLCAgICAgICAvKiBkZXN0IGltYWdlIHNpemUgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCAgLyogc3RhcnQgcG9pbnQgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmQgKTsgIC8qIGVuZCBwb2ludCAgICAgICAgKi8KKyAgICAgICAgY3Vycl9zcmMgKz0gc3JjX251bSAqIDM7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogICAgaWN2RGVsZXRlTW9pcmU4dUMzUgorLy8gICAgUHVycG9zZToKKy8vICAgICAgRnVuY3Rpb24gZGVsZXRlcyBtb2lyZSAtIHJlcGxhY2VzIGJsYWNrIHVuY292ZXJlZCBwaXhlbHMgd2l0aCB0aGVpciBuZWlnaGJvb3JzLgorLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6CisvLyAgICAgIGltZyAgICAgICAtIGltYWdlIGRhdGEKKy8vICAgICAgaW1nX3N0ZXAgIC0gZGlzdGFuY2UgYmV0d2VlbiBsaW5lcyBpbiBieXRlcworLy8gICAgICBpbWdfc2l6ZSAgLSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBpbWFnZSBpbiBwaXhlbHMKKy8vICAgIFJldHVybnM6CisvLyAgICAgIENWX05PX0VSUiBpZiBhbGwgT2sgb3IgZXJyb3IgY29kZQorLy8gICAgTm90ZXM6CisvL0YqLworc3RhdGljIEN2U3RhdHVzCitpY3ZEZWxldGVNb2lyZTh1KCB1Y2hhciAqIGltZywgaW50IGltZ19zdGVwLCBDdlNpemUgaW1nX3NpemUsIGludCBjbiApCit7CisgICAgaW50IHgsIHk7CisgICAgdWNoYXIgKnNyYyA9IGltZywgKmRzdCA9IGltZyArIGltZ19zdGVwOworCisgICAgaWYoICFpbWcgfHwgaW1nX3NpemUud2lkdGggPD0gMCB8fCBpbWdfc2l6ZS5oZWlnaHQgPD0gMCB8fCBpbWdfc3RlcCA8IGltZ19zaXplLndpZHRoICogMyApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgaW1nX3NpemUud2lkdGggKj0gY247CisKKyAgICBmb3IoIHkgPSAxOyB5IDwgaW1nX3NpemUuaGVpZ2h0OyB5KyssIHNyYyA9IGRzdCwgZHN0ICs9IGltZ19zdGVwICkKKyAgICB7CisgICAgICAgIHN3aXRjaCggY24gKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBpbWdfc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZHN0W3hdID09IDAgKQorICAgICAgICAgICAgICAgICAgICBkc3RbeF0gPSBzcmNbeF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGltZ19zaXplLndpZHRoOyB4ICs9IDMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBkc3RbeF0gPT0gMCAmJiBkc3RbeCArIDFdID09IDAgJiYgZHN0W3ggKyAyXSA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4XSA9IHNyY1t4XTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3ggKyAxXSA9IHNyY1t4ICsgMV07CisgICAgICAgICAgICAgICAgICAgIGRzdFt4ICsgMl0gPSBzcmNbeCArIDJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZEZWxldGVNb2lyZQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9ucyBkZWxldGUgbW9pcmUgb24gdGhlIGltYWdlIGFmdGVyIFZpZXdNb3JwaGluZworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICBpbWcgICAgICAgIC0gaW1hZ2Ugb24gd2hpY2ggd2lsbCBkZWxldGUgbW9pcmUKKy8vCisvLyAgICBOb3RlczoKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2RGVsZXRlTW9pcmUoIElwbEltYWdlICogaW1nICkKK3sKKyAgICB1Y2hhciAqaW1nX2RhdGEgPSAwOworICAgIGludCBpbWdfc3RlcCA9IDA7CisgICAgQ3ZTaXplIGltZ19zaXplOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkRlbGV0ZU1vaXJlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIGltZywgJmltZ19kYXRhLCAmaW1nX3N0ZXAsICZpbWdfc2l6ZSApOworCisgICAgaWYoIGltZy0+bkNoYW5uZWxzICE9IDEgJiYgaW1nLT5uQ2hhbm5lbHMgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIlNvdXJjZSBpbWFnZSBtdXN0IGhhdmUgMyBjaGFubmVsLiIgKTsKKyAgICBpZiggaW1nLT5kZXB0aCAhPSBJUExfREVQVEhfOFUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsICJDaGFubmVsIGRlcHRoIG9mIHNvdXJjZSBpbWFnZSBtdXN0IGJlIDguIiApOworCisgICAgQ1ZfQ0FMTCggaWN2RGVsZXRlTW9pcmU4dSggaW1nX2RhdGEsIGltZ19zdGVwLCBpbWdfc2l6ZSwgaW1nLT5uQ2hhbm5lbHMgKSk7CisKKyAgICBfX0NMRUFOVVBfXzsKKyAgICBfX0VORF9fOworCit9CisKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiBjdlByZVdhcnBJbWFnZQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9ucyB3YXJwIGltYWdlIGZvciBuZXh0IHN0YWdlIG9mIFZpZXdNb3JwaGluZworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICBpbWcgICAgICAgIC0gaW5pdGlhbCBpbWFnZSAoaW4gdGhlIGJlZ2lubmluZykKKy8vCisvLyAgICBOb3RlczoKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2UHJlV2FycEltYWdlKCBpbnQgbnVtTGluZXMsICAgLyogbnVtYmVyIG9mIHNjYW5saW5lcyAqLworICAgICAgICAgICAgICAgIElwbEltYWdlICogaW1nLCAvKiBTb3VyY2UgSW1hZ2UgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1Y2hhciAqIGRzdCwgICAgLyogZGVzdCBidWZmZXJzICAgICAgICovCisgICAgICAgICAgICAgICAgaW50ICpkc3RfbnVtcywgIC8qIGxlbnMgb2YgYnVmZmVyICAgICAqLworICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzIC8qIHNjYW5saW5lcyBhcnJheSAgICAqLyAgKQoreworICAgIHVjaGFyICppbWdfZGF0YSA9IDA7CisgICAgaW50IGltZ19zdGVwID0gMDsKKyAgICBDdlNpemUgaW1nX3NpemU7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UHJlV2FycEltYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIGltZywgJmltZ19kYXRhLCAmaW1nX3N0ZXAsICZpbWdfc2l6ZSApOworCisgICAgaWYoIGltZy0+bkNoYW5uZWxzICE9IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICJTb3VyY2UgaW1hZ2UgbXVzdCBoYXZlIDMgY2hhbm5lbC4iICk7CisgICAgaWYoIGltZy0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCAiQ2hhbm5lbCBkZXB0aCBvZiBpbWFnZSBtdXN0IGJlIDguIiApOworCisgICAgQ1ZfQ0FMTCggaWN2UHJlV2FycEltYWdlOHVDM1IoIG51bUxpbmVzLCAgICAvKiBudW1iZXIgb2Ygc2NhbmxpbmVzICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdfZGF0YSwgICAgLyogc291cmNlIGltYWdlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX3N0ZXAsICAgIC8qIGxpbmUgc3RlcCAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCwgLyogZGVzdCBidWZmZXJzICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X251bXMsICAgIC8qIGxlbnMgb2YgYnVmZmVyICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19zaXplLCAgICAvKiBpbWFnZSBzaXplIGluIHBpeGVscyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXMgLyogc2NhbmxpbmVzIGFycmF5ICAgICAgKi8gICkpOworCisgICAgX19DTEVBTlVQX187CisgICAgX19FTkRfXzsKKworfQorCisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZQb3N0V2FycEltYWdlCisvLyAgICBQdXJwb3NlOiBUaGUgZnVuY3Rpb25zIHBvc3R3YXJwIHRoZSBpbWFnZSBhZnRlciBtb3JwaGluZworLy8gICAgQ29udGV4dDoKKy8vICAgIFBhcmFtZXRlcnM6ICBpbWcgICAgICAgIC0gaW5pdGlhbCBpbWFnZSAoaW4gdGhlIGJlZ2lubmluZykKKy8vCisvLyAgICBOb3RlczogICAKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2UG9zdFdhcnBJbWFnZSggaW50IG51bUxpbmVzLCAgLyogbnVtYmVyIG9mIHNjYW5saW5lcyAgKi8KKyAgICAgICAgICAgICAgICAgdWNoYXIgKiBzcmMsICAgLyogc291cmNlIGJ1ZmZlcnMgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgaW50ICpzcmNfbnVtcywgLyogbGVucyBvZiBidWZmZXJzICAgICAgKi8KKyAgICAgICAgICAgICAgICAgSXBsSW1hZ2UgKiBpbWcsICAgICAgICAvKiBkZXN0IGltYWdlICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICBpbnQgKnNjYW5saW5lcyAvKiBzY2FubGluZSAgICAgICAgICAgICAqLyAgKQoreworICAgIHVjaGFyICppbWdfZGF0YSA9IDA7CisgICAgaW50IGltZ19zdGVwID0gMDsKKyAgICBDdlNpemUgaW1nX3NpemU7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UG9zdFdhcnBJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGN2R2V0SW1hZ2VSYXdEYXRhKCBpbWcsICZpbWdfZGF0YSwgJmltZ19zdGVwLCAmaW1nX3NpemUgKTsKKworICAgIGlmKCBpbWctPm5DaGFubmVscyAhPSAzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiU291cmNlIGltYWdlIG11c3QgaGF2ZSAzIGNoYW5uZWwuIiApOworICAgIGlmKCBpbWctPmRlcHRoICE9IElQTF9ERVBUSF84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIkNoYW5uZWwgZGVwdGggb2YgaW1hZ2UgbXVzdCBiZSA4LiIgKTsKKworICAgIENWX0NBTEwoIGljdlBvc3RXYXJwSW1hZ2U4dUMzUiggbnVtTGluZXMsICAgLyogbnVtYmVyIG9mIHNjYW5saW5lcyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsICAgICAgICAvKiBzb3VyY2UgYnVmZmVycyAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX251bXMsICAgLyogbGVucyBvZiBidWZmZXJzICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ19kYXRhLCAgIC8qIGRlc3QgaW1hZ2UgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdfc3RlcCwgICAvKiBkZXN0IGltYWdlIHN0ZXAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nX3NpemUsICAgLyogZGVzdCBpbWFnZSBzaXplICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lcyAvKiBzY2FubGluZSAgICAgICAgICAgICAqLyAgKSk7CisKKyAgICBfX0NMRUFOVVBfXzsKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZsbWVkcy5jcHAgYi9jdmF1eC9zcmMvY3ZsbWVkcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkNzg4MgotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdmxtZWRzLmNwcApAQCAtMCwwICsxLDE3NjYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jdmF1eC5oIgorI2luY2x1ZGUgIl9jdnZtLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNkZWZpbmUgU2duKHgpICAgICAgICAgICAgICAoICh4KTwwID8gLTE6MSApICAgIC8qIFNnbigwKSA9IDEgISAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ3ZTdGF0dXMKK2ljdkxNZWRTKCBpbnQgKnBvaW50czEsIGludCAqcG9pbnRzMiwgaW50IG51bVBvaW50cywgQ3ZNYXRyaXgzICogZnVuZGFtZW50YWxNYXRyaXggKQoreworICAgIGludCBzYW1wbGUsIGosIGFtb3VudF9zYW1wbGVzLCBkb25lOworICAgIGludCBhbW91bnRfc29sdXRpb25zOworICAgIGludCBtbDdbMjFdLCBtcjdbMjFdOworCisgICAgZG91YmxlIEZfdHJ5WzkgKiAzXTsKKyAgICBkb3VibGUgRls5XTsKKyAgICBkb3VibGUgTWosIE1qX25ldzsKKworICAgIGludCBpLCBudW07CisKKyAgICBpbnQgKm1sOworICAgIGludCAqbXI7CisgICAgaW50ICpuZXdfbWw7CisgICAgaW50ICpuZXdfbXI7CisgICAgaW50IG5ld19udW07CisgICAgQ3ZTdGF0dXMgZXJyb3I7CisKKyAgICBlcnJvciA9IENWX05PX0VSUjsKKworICAgIGlmKCBmdW5kYW1lbnRhbE1hdHJpeCA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBudW0gPSBudW1Qb2ludHM7CisKKyAgICBpZiggbnVtIDwgNiApCisgICAgeworICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIG1sID0gKGludCAqKSBjdkFsbG9jKCBzaXplb2YoIGludCApICogbnVtICogMyApOworICAgIG1yID0gKGludCAqKSBjdkFsbG9jKCBzaXplb2YoIGludCApICogbnVtICogMyApOworCisgICAgZm9yKCBpID0gMDsgaSA8IG51bTsgaSsrICkKKyAgICB7CisKKyAgICAgICAgbWxbaSAqIDNdID0gcG9pbnRzMVtpICogMl07CisgICAgICAgIG1sW2kgKiAzICsgMV0gPSBwb2ludHMxW2kgKiAyICsgMV07CisKKyAgICAgICAgbWxbaSAqIDMgKyAyXSA9IDE7CisKKyAgICAgICAgbXJbaSAqIDNdID0gcG9pbnRzMltpICogMl07CisgICAgICAgIG1yW2kgKiAzICsgMV0gPSBwb2ludHMyW2kgKiAyICsgMV07CisKKyAgICAgICAgbXJbaSAqIDMgKyAyXSA9IDE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgaWYoIG51bSA+IDcgKQorICAgIHsKKworICAgICAgICBNaiA9IC0xOworICAgICAgICBhbW91bnRfc2FtcGxlcyA9IDEwMDA7ICAvKiAgLS0tLS0tLSAgTXVzdCBiZSBjaGFuZ2VkICEgIC0tLS0tLS0tLSAqLworCisgICAgICAgIGZvciggc2FtcGxlID0gMDsgc2FtcGxlIDwgYW1vdW50X3NhbXBsZXM7IHNhbXBsZSsrICkKKyAgICAgICAgeworCisgICAgICAgICAgICBpY3ZDaG9vc2U3KCBtbCwgbXIsIG51bSwgbWw3LCBtcjcgKTsKKyAgICAgICAgICAgIGljdlBvaW50NyggbWw3LCBtcjcsIEZfdHJ5LCAmYW1vdW50X3NvbHV0aW9ucyApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYW1vdW50X3NvbHV0aW9ucyAvIDk7IGkrKyApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBNal9uZXcgPSBpY3ZNZWRpYW4oIG1sLCBtciwgbnVtLCBGX3RyeSArIGkgKiA5ICk7CisKKyAgICAgICAgICAgICAgICBpZiggTWpfbmV3ID49IDAgJiYgKE1qID09IC0xIHx8IE1qX25ldyA8IE1qKSApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCA5OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZbal0gPSBGX3RyeVtpICogOSArIGpdOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgICAgICAgICBNaiA9IE1qX25ldzsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgIGlmKCBNaiA9PSAtMSApCisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgICAgICBkb25lID0gaWN2Qm9sdGluZ1BvaW50cyggbWwsIG1yLCBudW0sIEYsIE1qLCAmbmV3X21sLCAmbmV3X21yLCAmbmV3X251bSApOworCisgICAgICAgIGlmKCBkb25lID09IC0xICkKKyAgICAgICAgeworCisgICAgICAgICAgICBjdkZyZWUoICZtciApOworICAgICAgICAgICAgY3ZGcmVlKCAmbWwgKTsKKyAgICAgICAgICAgIHJldHVybiBDVl9PVVRPRk1FTV9FUlI7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgaWYoIGRvbmUgPiA3ICkKKyAgICAgICAgICAgIGVycm9yID0gaWN2UG9pbnRzOCggbmV3X21sLCBuZXdfbXIsIG5ld19udW0sIEYgKTsKKworICAgICAgICBjdkZyZWUoICZuZXdfbXIgKTsKKyAgICAgICAgY3ZGcmVlKCAmbmV3X21sICk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBpY3ZQb2ludDcoIG1sLCBtciwgRiwgJmkgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCBlcnJvciA9PSBDVl9OT19FUlIgKQorICAgICAgICBlcnJvciA9IGljdlJhbmsyQ29uc3RyYWludCggRiApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICAgICAgZnVuZGFtZW50YWxNYXRyaXgtPm1baV1bal0gPSAoZmxvYXQpIEZbaSAqIDMgKyBqXTsKKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZMTWVkUyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkCitpY3ZDaG9vc2U3KCBpbnQgKm1sLCBpbnQgKm1yLCBpbnQgbnVtLCBpbnQgKm1sNywgaW50ICptcjcgKQoreworICAgIGludCBpbmRleGVzWzddLCBpLCBqOworCisgICAgaWYoICFtbCB8fCAhbXIgfHwgbnVtIDwgNyB8fCAhbWw3IHx8ICFtcjcgKQorICAgICAgICByZXR1cm47CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNzsgaSsrICkKKyAgICB7CisKKyAgICAgICAgaW5kZXhlc1tpXSA9IChpbnQpICgoZG91YmxlKSByYW5kKCkgLyBSQU5EX01BWCAqIG51bSk7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGk7IGorKyApCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoIGluZGV4ZXNbaV0gPT0gaW5kZXhlc1tqXSApCisgICAgICAgICAgICAgICAgaS0tOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMjE7IGkrKyApCisgICAgeworCisgICAgICAgIG1sN1tpXSA9IG1sWzMgKiBpbmRleGVzW2kgLyAzXSArIGkgJSAzXTsKKyAgICAgICAgbXI3W2ldID0gbXJbMyAqIGluZGV4ZXNbaSAvIDNdICsgaSAlIDNdOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3NfQ2hvb3NlNyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cworaWN2Q3ViaWMoIGRvdWJsZSBhMiwgZG91YmxlIGExLCBkb3VibGUgYTAsIGRvdWJsZSAqc3F1YXJlcyApCit7CisgICAgZG91YmxlIHAsIHEsIEQsIGMxLCBjMiwgYjEsIGIyLCBybzEsIHJvMiwgZmkxLCBmaTIsIHR0OworICAgIGRvdWJsZSB4WzZdWzNdOworICAgIGludCBpLCBqLCB0OworCisgICAgaWYoICFzcXVhcmVzICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBwID0gYTEgLSBhMiAqIGEyIC8gMzsKKyAgICBxID0gKDkgKiBhMSAqIGEyIC0gMjcgKiBhMCAtIDIgKiBhMiAqIGEyICogYTIpIC8gMjc7CisgICAgRCA9IHEgKiBxIC8gNCArIHAgKiBwICogcCAvIDI3OworCisgICAgaWYoIEQgPCAwICkKKyAgICB7CisKKyAgICAgICAgYzEgPSBxIC8gMjsKKyAgICAgICAgYzIgPSBjMTsKKyAgICAgICAgYjEgPSBzcXJ0KCAtRCApOworICAgICAgICBiMiA9IC1iMTsKKworICAgICAgICBybzEgPSBzcXJ0KCBjMSAqIGMxIC0gRCApOworICAgICAgICBybzIgPSBybzE7CisKKyAgICAgICAgZmkxID0gYXRhbjIoIGIxLCBjMSApOworICAgICAgICBmaTIgPSAtZmkxOworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGMxID0gcSAvIDIgKyBzcXJ0KCBEICk7CisgICAgICAgIGMyID0gcSAvIDIgLSBzcXJ0KCBEICk7CisgICAgICAgIGIxID0gMDsKKyAgICAgICAgYjIgPSAwOworCisgICAgICAgIHJvMSA9IGZhYnMoIGMxICk7CisgICAgICAgIHJvMiA9IGZhYnMoIGMyICk7CisgICAgICAgIGZpMSA9IENWX1BJICogKDEgLSBTSUdOKCBjMSApKSAvIDI7CisgICAgICAgIGZpMiA9IENWX1BJICogKDEgLSBTSUdOKCBjMiApKSAvIDI7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisKKyAgICAgICAgeFtpXVswXSA9IC1hMiAvIDM7CisgICAgICAgIHhbaV1bMV0gPSAwOworICAgICAgICB4W2ldWzJdID0gMDsKKworICAgICAgICBzcXVhcmVzW2ldID0geFtpXVtpICUgMl07CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgaWYoICFSRUFMX1pFUk8oIHJvMSApKQorICAgIHsKKyAgICAgICAgdHQgPSBTSUdOKCBybzEgKSAqIHBvdyggZmFicyggcm8xICksIDAuMzMzMzMzMzMzMzMzICk7CisgICAgICAgIGMxID0gdHQgLSBwIC8gKDMuICogdHQpOworICAgICAgICBjMiA9IHR0ICsgcCAvICgzLiAqIHR0KTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCAhUkVBTF9aRVJPKCBybzIgKSkKKyAgICB7CisgICAgICAgIHR0ID0gU0lHTiggcm8yICkgKiBwb3coIGZhYnMoIHJvMiApLCAwLjMzMzMzMzMzMzMzMyApOworICAgICAgICBiMSA9IHR0IC0gcCAvICgzLiAqIHR0KTsKKyAgICAgICAgYjIgPSB0dCArIHAgLyAoMy4gKiB0dCk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNjsgaSsrICkKKyAgICB7CisKKyAgICAgICAgaWYoIGkgPCAzICkKKyAgICAgICAgeworCisgICAgICAgICAgICBpZiggIVJFQUxfWkVSTyggcm8xICkpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB4W2ldWzBdID0gY29zKCBmaTEgLyAzLiArIDIgKiBDVl9QSSAqIChpICUgMykgLyAzLiApICogYzEgLSBhMiAvIDM7CisgICAgICAgICAgICAgICAgeFtpXVsxXSA9IHNpbiggZmkxIC8gMy4gKyAyICogQ1ZfUEkgKiAoaSAlIDMpIC8gMy4gKSAqIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgeFtpXVsyXSA9IDE7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBybzIgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHhbaV1bMF0gPSBjb3MoIGZpMiAvIDMuICsgMiAqIENWX1BJICogKGkgJSAzKSAvIDMuICkgKiBiMSAtIGEyIC8gMzsKKyAgICAgICAgICAgICAgICB4W2ldWzFdID0gc2luKCBmaTIgLyAzLiArIDIgKiBDVl9QSSAqIChpICUgMykgLyAzLiApICogYjI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICB4W2ldWzJdID0gMTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICB0ID0gMDsKKworICAgIGZvciggaSA9IDA7IGkgPCA2OyBpKysgKQorICAgIHsKKworICAgICAgICBpZiggIXhbaV1bMl0gKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHNxdWFyZXNbdCsrXSA9IHhbaV1bMF07CisgICAgICAgICAgICBzcXVhcmVzW3QrK10gPSB4W2ldWzFdOworICAgICAgICAgICAgeFtpXVsyXSA9IDE7CisKKyAgICAgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgNjsgaisrICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmKCAheFtqXVsyXSAmJiBSRUFMX1pFUk8oIHhbaV1bMF0gLSB4W2pdWzBdICkKKyAgICAgICAgICAgICAgICAgICAgJiYgUkVBTF9aRVJPKCB4W2ldWzFdIC0geFtqXVsxXSApKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICB4W2pdWzJdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZDdWJpYyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2RvdWJsZQoraWN2RGV0KCBkb3VibGUgKk0gKQoreworICAgIGRvdWJsZSB2YWx1ZTsKKworICAgIGlmKCAhTSApCisgICAgICAgIHJldHVybiAwOworCisgICAgdmFsdWUgPSBNWzBdICogTVs0XSAqIE1bOF0gKyBNWzJdICogTVszXSAqIE1bN10gKyBNWzFdICogTVs1XSAqIE1bNl0gLQorICAgICAgICBNWzJdICogTVs0XSAqIE1bNl0gLSBNWzBdICogTVs1XSAqIE1bN10gLSBNWzFdICogTVszXSAqIE1bOF07CisKKyAgICByZXR1cm4gdmFsdWU7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2RGV0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitkb3VibGUKK2ljdk1pbm9yKCBkb3VibGUgKk0sIGludCB4LCBpbnQgeSApCit7CisgICAgaW50IHJvdzEsIHJvdzIsIGNvbDEsIGNvbDI7CisgICAgZG91YmxlIHZhbHVlOworCisgICAgaWYoICFNIHx8IHggPCAwIHx8IHggPiAyIHx8IHkgPCAwIHx8IHkgPiAyICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByb3cxID0gKHkgPT0gMCA/IDEgOiAwKTsKKyAgICByb3cyID0gKHkgPT0gMiA/IDEgOiAyKTsKKyAgICBjb2wxID0gKHggPT0gMCA/IDEgOiAwKTsKKyAgICBjb2wyID0gKHggPT0gMiA/IDEgOiAyKTsKKworICAgIHZhbHVlID0gTVtyb3cxICogMyArIGNvbDFdICogTVtyb3cyICogMyArIGNvbDJdIC0gTVtyb3cyICogMyArIGNvbDFdICogTVtyb3cxICogMyArIGNvbDJdOworCisgICAgdmFsdWUgKj0gMSAtICh4ICsgeSkgJSAyICogMjsKKworICAgIHJldHVybiB2YWx1ZTsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZNaW5vciAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRDb2VmKCBkb3VibGUgKmYxLCBkb3VibGUgKmYyLCBkb3VibGUgKmEyLCBkb3VibGUgKmExLCBkb3VibGUgKmEwICkKK3sKKyAgICBkb3VibGUgR1s5XSwgYTM7CisgICAgaW50IGk7CisKKyAgICBpZiggIWYxIHx8ICFmMiB8fCAhYTAgfHwgIWExIHx8ICFhMiApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgZm9yKCBpID0gMDsgaSA8IDk7IGkrKyApCisgICAgeworCisgICAgICAgIEdbaV0gPSBmMVtpXSAtIGYyW2ldOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIGEzID0gaWN2RGV0KCBHICk7CisKKyAgICBpZiggUkVBTF9aRVJPKCBhMyApKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgICphMiA9IDA7CisgICAgKmExID0gMDsKKyAgICAqYTAgPSBpY3ZEZXQoIGYyICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgOTsgaSsrICkKKyAgICB7CisKKyAgICAgICAgKmEyICs9IGYyW2ldICogaWN2TWlub3IoIEcsIChpbnQpIChpICUgMyksIChpbnQpIChpIC8gMykgKTsKKyAgICAgICAgKmExICs9IEdbaV0gKiBpY3ZNaW5vciggZjIsIChpbnQpIChpICUgMyksIChpbnQpIChpIC8gMykgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqYTAgLz0gYTM7CisgICAgKmExIC89IGEzOworICAgICphMiAvPSBhMzsKKworICAgIHJldHVybiBDVl9OT19FUlI7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2R2V0Q29lZiAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitkb3VibGUKK2ljdk1lZGlhbiggaW50ICptbCwgaW50ICptciwgaW50IG51bSwgZG91YmxlICpGICkKK3sKKyAgICBkb3VibGUgbDEsIGwyLCBsMywgZDEsIGQyLCB2YWx1ZTsKKyAgICBkb3VibGUgKmRldmlhdGlvbjsKKyAgICBpbnQgaSwgaTM7CisKKyAgICBpZiggIW1sIHx8ICFtciB8fCAhRiApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIGRldmlhdGlvbiA9IChkb3VibGUgKikgY3ZBbGxvYyggKG51bSkgKiBzaXplb2YoIGRvdWJsZSApKTsKKworICAgIGlmKCAhZGV2aWF0aW9uICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yKCBpID0gMCwgaTMgPSAwOyBpIDwgbnVtOyBpKyssIGkzICs9IDMgKQorICAgIHsKKworICAgICAgICBsMSA9IEZbMF0gKiBtcltpM10gKyBGWzFdICogbXJbaTMgKyAxXSArIEZbMl07CisgICAgICAgIGwyID0gRlszXSAqIG1yW2kzXSArIEZbNF0gKiBtcltpMyArIDFdICsgRls1XTsKKyAgICAgICAgbDMgPSBGWzZdICogbXJbaTNdICsgRls3XSAqIG1yW2kzICsgMV0gKyBGWzhdOworCisgICAgICAgIGQxID0gKGwxICogbWxbaTNdICsgbDIgKiBtbFtpMyArIDFdICsgbDMpIC8gc3FydCggbDEgKiBsMSArIGwyICogbDIgKTsKKworICAgICAgICBsMSA9IEZbMF0gKiBtbFtpM10gKyBGWzNdICogbWxbaTMgKyAxXSArIEZbNl07CisgICAgICAgIGwyID0gRlsxXSAqIG1sW2kzXSArIEZbNF0gKiBtbFtpMyArIDFdICsgRls3XTsKKyAgICAgICAgbDMgPSBGWzJdICogbWxbaTNdICsgRls1XSAqIG1sW2kzICsgMV0gKyBGWzhdOworCisgICAgICAgIGQyID0gKGwxICogbXJbaTNdICsgbDIgKiBtcltpMyArIDFdICsgbDMpIC8gc3FydCggbDEgKiBsMSArIGwyICogbDIgKTsKKworICAgICAgICBkZXZpYXRpb25baV0gPSAoZG91YmxlKSAoZDEgKiBkMSArIGQyICogZDIpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIGlmKCBpY3ZTb3J0KCBkZXZpYXRpb24sIG51bSApICE9IENWX05PX0VSUiApCisgICAgeworCisgICAgICAgIGN2RnJlZSggJmRldmlhdGlvbiApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICB2YWx1ZSA9IGRldmlhdGlvbltudW0gLyAyXTsKKyAgICBjdkZyZWUoICZkZXZpYXRpb24gKTsKKyAgICByZXR1cm4gdmFsdWU7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3NfTWVkaWFuICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZTb3J0KCBkb3VibGUgKmFycmF5LCBpbnQgbGVuZ3RoICkKK3sKKyAgICBpbnQgaSwgaiwgaW5kZXg7CisgICAgZG91YmxlIHN3YXBkOworCisgICAgaWYoICFhcnJheSB8fCBsZW5ndGggPCAxICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbGVuZ3RoIC0gMTsgaSsrICkKKyAgICB7CisKKyAgICAgICAgaW5kZXggPSBpOworCisgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgbGVuZ3RoOyBqKysgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKCBhcnJheVtqXSA8IGFycmF5W2luZGV4XSApCisgICAgICAgICAgICAgICAgaW5kZXggPSBqOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICBpZiggaW5kZXggLSBpICkKKyAgICAgICAgeworCisgICAgICAgICAgICBzd2FwZCA9IGFycmF5W2ldOworICAgICAgICAgICAgYXJyYXlbaV0gPSBhcnJheVtpbmRleF07CisgICAgICAgICAgICBhcnJheVtpbmRleF0gPSBzd2FwZDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNzX1NvcnQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworaW50CitpY3ZCb2x0aW5nUG9pbnRzKCBpbnQgKm1sLCBpbnQgKm1yLAorICAgICAgICAgICAgICAgICAgaW50IG51bSwgZG91YmxlICpGLCBkb3VibGUgTWosIGludCAqKm5ld19tbCwgaW50ICoqbmV3X21yLCBpbnQgKm5ld19udW0gKQoreworICAgIGRvdWJsZSBsMSwgbDIsIGwzLCBkMSwgZDIsIHNpZ21hOworICAgIGludCBpLCBqLCBsZW5ndGg7CisgICAgaW50ICppbmRleDsKKworICAgIGlmKCAhbWwgfHwgIW1yIHx8IG51bSA8IDEgfHwgIUYgfHwgTWogPCAwICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgaW5kZXggPSAoaW50ICopIGN2QWxsb2MoIChudW0pICogc2l6ZW9mKCBpbnQgKSk7CisKKyAgICBpZiggIWluZGV4ICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgbGVuZ3RoID0gMDsKKyAgICBzaWdtYSA9IChkb3VibGUpICgyLjUgKiAxLjQ4MjYgKiAoMSArIDUuIC8gKG51bSAtIDcpKSAqIHNxcnQoIE1qICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IG51bSAqIDM7IGkgKz0gMyApCisgICAgeworCisgICAgICAgIGwxID0gRlswXSAqIG1yW2ldICsgRlsxXSAqIG1yW2kgKyAxXSArIEZbMl07CisgICAgICAgIGwyID0gRlszXSAqIG1yW2ldICsgRls0XSAqIG1yW2kgKyAxXSArIEZbNV07CisgICAgICAgIGwzID0gRls2XSAqIG1yW2ldICsgRls3XSAqIG1yW2kgKyAxXSArIEZbOF07CisKKyAgICAgICAgZDEgPSAobDEgKiBtbFtpXSArIGwyICogbWxbaSArIDFdICsgbDMpIC8gc3FydCggbDEgKiBsMSArIGwyICogbDIgKTsKKworICAgICAgICBsMSA9IEZbMF0gKiBtbFtpXSArIEZbM10gKiBtbFtpICsgMV0gKyBGWzZdOworICAgICAgICBsMiA9IEZbMV0gKiBtbFtpXSArIEZbNF0gKiBtbFtpICsgMV0gKyBGWzddOworICAgICAgICBsMyA9IEZbMl0gKiBtbFtpXSArIEZbNV0gKiBtbFtpICsgMV0gKyBGWzhdOworCisgICAgICAgIGQyID0gKGwxICogbXJbaV0gKyBsMiAqIG1yW2kgKyAxXSArIGwzKSAvIHNxcnQoIGwxICogbDEgKyBsMiAqIGwyICk7CisKKyAgICAgICAgaWYoIGQxICogZDEgKyBkMiAqIGQyIDw9IHNpZ21hICogc2lnbWEgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGluZGV4W2kgLyAzXSA9IDE7CisgICAgICAgICAgICBsZW5ndGgrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgaW5kZXhbaSAvIDNdID0gMDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqbmV3X251bSA9IGxlbmd0aDsKKworICAgICpuZXdfbWwgPSAoaW50ICopIGN2QWxsb2MoIChsZW5ndGggKiAzKSAqIHNpemVvZiggaW50ICkpOworCisgICAgaWYoICFuZXdfbWwgKQorICAgIHsKKworICAgICAgICBjdkZyZWUoICZpbmRleCApOworICAgICAgICByZXR1cm4gLTE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAqbmV3X21yID0gKGludCAqKSBjdkFsbG9jKCAobGVuZ3RoICogMykgKiBzaXplb2YoIGludCApKTsKKworICAgIGlmKCAhbmV3X21yICkKKyAgICB7CisKKyAgICAgICAgY3ZGcmVlKCAmbmV3X21sICk7CisgICAgICAgIGN2RnJlZSggJmluZGV4ICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGogPSAwOworCisgICAgZm9yKCBpID0gMDsgaSA8IG51bSAqIDM7ICkKKyAgICB7CisKKyAgICAgICAgaWYoIGluZGV4W2kgLyAzXSApCisgICAgICAgIHsKKworICAgICAgICAgICAgKCpuZXdfbWwpW2pdID0gbWxbaV07CisgICAgICAgICAgICAoKm5ld19tcilbaisrXSA9IG1yW2krK107CisgICAgICAgICAgICAoKm5ld19tbClbal0gPSBtbFtpXTsKKyAgICAgICAgICAgICgqbmV3X21yKVtqKytdID0gbXJbaSsrXTsKKyAgICAgICAgICAgICgqbmV3X21sKVtqXSA9IG1sW2ldOworICAgICAgICAgICAgKCpuZXdfbXIpW2orK10gPSBtcltpKytdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGkgKz0gMzsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICBjdkZyZWUoICZpbmRleCApOworICAgIHJldHVybiBsZW5ndGg7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3NfQm9sdGluZ1BvaW50cyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cworaWN2UG9pbnRzOCggaW50ICptbCwgaW50ICptciwgaW50IG51bSwgZG91YmxlICpGICkKK3sKKyAgICBkb3VibGUgKlU7CisgICAgZG91YmxlIGwxLCBsMiwgdywgb2xkX25vcm0gPSAtMSwgbmV3X25vcm0gPSAtMiwgc3VtbTsKKyAgICBpbnQgaTMsIGk5LCBqLCBudW0zLCBpdHMgPSAwLCBhLCB0OworCisgICAgaWYoICFtbCB8fCAhbXIgfHwgbnVtIDwgOCB8fCAhRiApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgVSA9IChkb3VibGUgKikgY3ZBbGxvYyggKG51bSAqIDkpICogc2l6ZW9mKCBkb3VibGUgKSk7CisKKyAgICBpZiggIVUgKQorICAgICAgICByZXR1cm4gQ1ZfT1VUT0ZNRU1fRVJSOworCisgICAgbnVtMyA9IG51bSAqIDM7CisKKyAgICB3aGlsZSggIVJFQUxfWkVSTyggbmV3X25vcm0gLSBvbGRfbm9ybSApKQorICAgIHsKKworICAgICAgICBpZiggaXRzKysgPiAxZSsyICkKKyAgICAgICAgeworCisgICAgICAgICAgICBjdkZyZWUoICZVICk7CisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICBvbGRfbm9ybSA9IG5ld19ub3JtOworCisgICAgICAgIGZvciggaTMgPSAwLCBpOSA9IDA7IGkzIDwgbnVtMzsgaTMgKz0gMywgaTkgKz0gOSApCisgICAgICAgIHsKKworICAgICAgICAgICAgbDEgPSBGWzBdICogbXJbaTNdICsgRlsxXSAqIG1yW2kzICsgMV0gKyBGWzJdOworICAgICAgICAgICAgbDIgPSBGWzNdICogbXJbaTNdICsgRls0XSAqIG1yW2kzICsgMV0gKyBGWzVdOworCisgICAgICAgICAgICBpZiggUkVBTF9aRVJPKCBsMSApICYmIFJFQUxfWkVSTyggbDIgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGN2RnJlZSggJlUgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICAgICAgdyA9IDEgLyAobDEgKiBsMSArIGwyICogbDIpOworCisgICAgICAgICAgICBsMSA9IEZbMF0gKiBtbFtpM10gKyBGWzNdICogbWxbaTMgKyAxXSArIEZbNl07CisgICAgICAgICAgICBsMiA9IEZbMV0gKiBtbFtpM10gKyBGWzRdICogbWxbaTMgKyAxXSArIEZbN107CisKKyAgICAgICAgICAgIGlmKCBSRUFMX1pFUk8oIGwxICkgJiYgUkVBTF9aRVJPKCBsMiApKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmVSApOworICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICB3ICs9IDEgLyAobDEgKiBsMSArIGwyICogbDIpOworICAgICAgICAgICAgdyA9IHNxcnQoIHcgKTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDk7IGorKyApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBVW2k5ICsgal0gPSB3ICogKGRvdWJsZSkgbWxbaTMgKyBqIC8gM10gKiAoZG91YmxlKSBtcltpMyArIGogJSAzXTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgIG5ld19ub3JtID0gMDsKKworICAgICAgICBmb3IoIGEgPSAwOyBhIDwgbnVtOyBhKysgKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiByb3cgKi8KKworICAgICAgICAgICAgc3VtbSA9IDA7CisKKyAgICAgICAgICAgIGZvciggdCA9IDA7IHQgPCA5OyB0KysgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgc3VtbSArPSBVW2EgKiA5ICsgdF0gKiBGW3RdOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgbmV3X25vcm0gKz0gc3VtbSAqIHN1bW07CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgIG5ld19ub3JtID0gc3FydCggbmV3X25vcm0gKTsKKworICAgICAgICBpY3ZBbmFseXRpY1BvaW50czgoIFUsIG51bSwgRiApOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAqLworCisgICAgY3ZGcmVlKCAmVSApOworICAgIHJldHVybiBDVl9OT19FUlI7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogY3NfUG9pbnRzOCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitkb3VibGUKK2ljdkFuYWx5dGljUG9pbnRzOCggZG91YmxlICpBLCBpbnQgbnVtLCBkb3VibGUgKkYgKQoreworICAgIGRvdWJsZSAqVTsKKyAgICBkb3VibGUgVls4ICogOF07CisgICAgZG91YmxlIFdbOF07CisgICAgZG91YmxlICpmOworICAgIGRvdWJsZSBzb2x1dGlvbls5XTsKKyAgICBkb3VibGUgdGVtcDFbOCAqIDhdOworICAgIGRvdWJsZSAqdGVtcDI7CisgICAgZG91YmxlICpBX3Nob3J0OworICAgIGRvdWJsZSBub3JtLCBzdW1tLCBiZXN0X25vcm07CisgICAgaW50IG51bTggPSBudW0gKiA4LCBudW05ID0gbnVtICogOTsKKyAgICBpbnQgaSwgaiwgajgsIGo5LCB2YWx1ZSwgYSwgYTgsIGE5LCBhX251bSwgYiwgYjgsIHQ7CisKKyAgICAvKiAtLS0tLS0tLS0gSW5pdGlhbGl6YXRpb24gZGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGlmKCAhQSB8fCBudW0gPCA4IHx8ICFGICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgYmVzdF9ub3JtID0gLTE7CisgICAgVSA9IChkb3VibGUgKikgY3ZBbGxvYyggKG51bTgpICogc2l6ZW9mKCBkb3VibGUgKSk7CisKKyAgICBpZiggIVUgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmID0gKGRvdWJsZSAqKSBjdkFsbG9jKCAobnVtKSAqIHNpemVvZiggZG91YmxlICkpOworCisgICAgaWYoICFmICkKKyAgICB7CisgICAgICAgIGN2RnJlZSggJlUgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgdGVtcDIgPSAoZG91YmxlICopIGN2QWxsb2MoIChudW04KSAqIHNpemVvZiggZG91YmxlICkpOworCisgICAgaWYoICF0ZW1wMiApCisgICAgeworICAgICAgICBjdkZyZWUoICZmICk7CisgICAgICAgIGN2RnJlZSggJlUgKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgQV9zaG9ydCA9IChkb3VibGUgKikgY3ZBbGxvYyggKG51bTgpICogc2l6ZW9mKCBkb3VibGUgKSk7CisKKyAgICBpZiggIUFfc2hvcnQgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmdGVtcDIgKTsKKyAgICAgICAgY3ZGcmVlKCAmZiApOworICAgICAgICBjdkZyZWUoICZVICk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGZvciggaSA9IDA7IGkgPCA4OyBpKysgKQorICAgIHsKKyAgICAgICAgZm9yKCBqOCA9IDAsIGo5ID0gMDsgajkgPCBudW05OyBqOCArPSA4LCBqOSArPSA5ICkKKyAgICAgICAgeworICAgICAgICAgICAgQV9zaG9ydFtqOCArIGldID0gQVtqOSArIGkgKyAxXTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgZm9yKCBpID0gMDsgaSA8IDk7IGkrKyApCisgICAgeworCisgICAgICAgIGZvciggaiA9IDAsIGo4ID0gMCwgajkgPSAwOyBqIDwgbnVtOyBqKyssIGo4ICs9IDgsIGo5ICs9IDkgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZbal0gPSAtQVtqOSArIGldOworCisgICAgICAgICAgICBpZiggaSApCisgICAgICAgICAgICAgICAgQV9zaG9ydFtqOCArIGkgLSAxXSA9IEFbajkgKyBpIC0gMV07CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgIHZhbHVlID0gaWN2U2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24oIG51bSwgOCwgQV9zaG9ydCwgVywgMSwgVSwgMSwgViApOworCisgICAgICAgIGlmKCAhdmFsdWUgKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLSAgY29tcHV0aW5nIHRoZSBzb2x1dGlvbiAgLS0tLS0tLS0tLS0gKi8KKworICAgICAgICAgICAgLyogIC0tLS0tLS0tLS0tICBXID0gVygtMSkgIC0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgODsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIVJFQUxfWkVSTyggV1tqXSApKQorICAgICAgICAgICAgICAgICAgICBXW2pdID0gMSAvIFdbal07CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLSAgdGVtcDEgPSBWICogVygtMSkgIC0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBmb3IoIGE4ID0gMDsgYTggPCA2NDsgYTggKz0gOCApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgIC8qIHJvdyAqLworICAgICAgICAgICAgICAgIGZvciggYiA9IDA7IGIgPCA4OyBiKysgKQorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAvKiBjb2x1bW4gKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDFbYTggKyBiXSA9IFZbYTggKyBiXSAqIFdbYl07CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgLyogIC0tLS0tLS0tLS0tICB0ZW1wMiA9IFYgKiBXKC0xKSAqIFUoVCkgIC0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBmb3IoIGE4ID0gMCwgYV9udW0gPSAwOyBhOCA8IDY0OyBhOCArPSA4LCBhX251bSArPSBudW0gKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAvKiByb3cgKi8KKyAgICAgICAgICAgICAgICBmb3IoIGIgPSAwLCBiOCA9IDA7IGIgPCBudW07IGIrKywgYjggKz0gOCApCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgIC8qIGNvbHVtbiAqLworCisgICAgICAgICAgICAgICAgICAgIHRlbXAyW2FfbnVtICsgYl0gPSAwOworCisgICAgICAgICAgICAgICAgICAgIGZvciggdCA9IDA7IHQgPCA4OyB0KysgKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAyW2FfbnVtICsgYl0gKz0gdGVtcDFbYTggKyB0XSAqIFVbYjggKyB0XTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgLyogZm9yICovCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgLyogLS0tLS0tLS0tLS0gIHNvbHV0aW9uID0gViAqIFcoLTEpICogVShUKSAqIGYgIC0tLS0tLS0tLS0tICovCisgICAgICAgICAgICBmb3IoIGEgPSAwLCBhX251bSA9IDA7IGEgPCA4OyBhKyssIGFfbnVtICs9IG51bSApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgIC8qIHJvdyAqLworICAgICAgICAgICAgICAgIGZvciggYiA9IDA7IGIgPCBudW07IGIrKyApCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgIC8qIGNvbHVtbiAqLworCisgICAgICAgICAgICAgICAgICAgIHNvbHV0aW9uW2FdID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHQgPSAwOyB0IDwgbnVtICYmIFdbYV07IHQrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvbHV0aW9uW2FdICs9IHRlbXAyW2FfbnVtICsgdF0gKiBmW3RdOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAvKiBmb3IgKi8KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICBmb3IoIGEgPSA4OyBhID4gMDsgYS0tICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGlmKCBhID09IGkgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzb2x1dGlvblthXSA9IHNvbHV0aW9uW2EgLSAxXTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgIHNvbHV0aW9uW2FdID0gMTsKKworICAgICAgICAgICAgbm9ybSA9IDA7CisKKyAgICAgICAgICAgIGZvciggYTkgPSAwOyBhOSA8IG51bTk7IGE5ICs9IDkgKQorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAvKiByb3cgKi8KKworICAgICAgICAgICAgICAgIHN1bW0gPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCB0ID0gMDsgdCA8IDk7IHQrKyApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHN1bW0gKz0gQVthOSArIHRdICogc29sdXRpb25bdF07CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICAgICAgbm9ybSArPSBzdW1tICogc3VtbTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgIG5vcm0gPSBzcXJ0KCBub3JtICk7CisKKyAgICAgICAgICAgIGlmKCBiZXN0X25vcm0gPT0gLTEgfHwgbm9ybSA8IGJlc3Rfbm9ybSApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgOTsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgRltqXSA9IHNvbHV0aW9uW2pdOworCisgICAgICAgICAgICAgICAgYmVzdF9ub3JtID0gbm9ybTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICBjdkZyZWUoICZBX3Nob3J0ICk7CisgICAgY3ZGcmVlKCAmdGVtcDIgKTsKKyAgICBjdkZyZWUoICZmICk7CisgICAgY3ZGcmVlKCAmVSApOworCisgICAgcmV0dXJuIGJlc3Rfbm9ybTsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjc19BbmFseXRpY1BvaW50czggKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ3ZTdGF0dXMKK2ljdlJhbmsyQ29uc3RyYWludCggZG91YmxlICpGICkKK3sKKyAgICBkb3VibGUgVVs5XSwgVls5XSwgV1szXTsKKyAgICBkb3VibGUgYVdbM107IAorICAgIGludCBpLCBpMywgaiwgajMsIHQ7CisKKyAgICBpZiggRiA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBpZiggaWN2U2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24oIDMsIDMsIEYsIFcsIDEsIFUsIDEsIFYgKSkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBhV1swXSA9IGZhYnMoV1swXSk7CisgICAgYVdbMV0gPSBmYWJzKFdbMV0pOworICAgIGFXWzJdID0gZmFicyhXWzJdKTsKKworICAgIGlmKCBhV1swXSA8IGFXWzFdICkKKyAgICB7CisgICAgICAgIGlmKCBhV1swXSA8IGFXWzJdICkKKyAgICAgICAgeworCisgICAgICAgICAgICBpZiggUkVBTF9aRVJPKCBXWzBdICkpCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBXWzBdID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoIFJFQUxfWkVSTyggV1syXSApKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9OT19FUlI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgV1syXSA9IDA7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgaWYoIGFXWzFdIDwgYVdbMl0gKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGlmKCBSRUFMX1pFUk8oIFdbMV0gKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfTk9fRVJSOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIFdbMV0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIFJFQUxfWkVSTyggV1syXSApKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9OT19FUlI7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgV1syXSA9IDA7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggajMgPSAwOyBqMyA8IDk7IGozICs9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBVW2ozICsgaV0gKj0gV1tpXTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgZm9yKCBpID0gMCwgaTMgPSAwOyBpIDwgMzsgaSsrLCBpMyArPSAzICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDAsIGozID0gMDsgaiA8IDM7IGorKywgajMgKz0gMyApCisgICAgICAgIHsKKworICAgICAgICAgICAgRltpMyArIGpdID0gMDsKKworICAgICAgICAgICAgZm9yKCB0ID0gMDsgdCA8IDM7IHQrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRltpMyArIGpdICs9IFVbaTMgKyB0XSAqIFZbajMgKyB0XTsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNzX1JhbmsyQ29uc3RyYWludCAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworaW50CitpY3ZTaW5ndWxhclZhbHVlRGVjb21wb3NpdGlvbiggaW50IE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqVywgaW50IGdldF9VLCBkb3VibGUgKlUsIGludCBnZXRfViwgZG91YmxlICpWICkKK3sKKyAgICBpbnQgaSA9IDAsIGosIGssIGwgPSAwLCBpMSwgazEsIGwxID0gMDsKKyAgICBpbnQgaXRlcmF0aW9ucywgZXJyb3IgPSAwLCBqTiwgaU4sIGtOLCBsTiA9IDA7CisgICAgZG91YmxlICpydjE7CisgICAgZG91YmxlIGMsIGYsIGcsIGgsIHMsIHgsIHksIHosIHNjYWxlLCBhbm9ybTsKKyAgICBkb3VibGUgYWYsIGFnLCBhaCwgdDsKKyAgICBpbnQgTU4gPSBNICogTjsKKyAgICBpbnQgTk4gPSBOICogTjsKKworICAgIC8qICBtYXhfaXRlcmF0aW9ucyAtIG1heGltdW0gbnVtYmVyIFFSLWl0ZXJhdGlvbnMKKyAgICAgICBjYyAtIHJlZHVjZXMgcmVxdWlyZW1lbnRzIHRvIG51bWJlciBzdGl0Y2ggKGNjPjEpCisgICAgICovCisKKyAgICBpbnQgbWF4X2l0ZXJhdGlvbnMgPSAxMDA7CisgICAgZG91YmxlIGNjID0gMTAwOworCisgICAgaWYoIE0gPCBOICkKKyAgICAgICAgcmV0dXJuIE47CisKKyAgICBydjEgPSAoZG91YmxlICopIGN2QWxsb2MoIE4gKiBzaXplb2YoIGRvdWJsZSApKTsKKworICAgIGlmKCBydjEgPT0gMCApCisgICAgICAgIHJldHVybiBOOworCisgICAgZm9yKCBpTiA9IDA7IGlOIDwgTU47IGlOICs9IE4gKQorICAgIHsKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IE47IGorKyApCisgICAgICAgICAgICBVW2lOICsgal0gPSBBW2lOICsgal07CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgLyogIEFkZHVjdGlvbiB0byBiaWRpYWdvbmFsIHR5cGUgKHRyYW5zZm9ybWF0aW9ucyBvZiByZWZsZWN0aW9uKS4KKyAgICAgICBCaWRpYWdvbmFsIG1hdHJpeCBpcyBsb2NhdGVkIGluIFcgKGRpYWdvbmFsIGVsZW1lbnRzKQorICAgICAgIGFuZCBpbiBydjEgKHVwcGVyZGlhZ29uYWwgZWxlbWVudHMpCisgICAgICovCisKKyAgICBnID0gMDsKKyAgICBzY2FsZSA9IDA7CisgICAgYW5vcm0gPSAwOworCisgICAgZm9yKCBpID0gMCwgaU4gPSAwOyBpIDwgTjsgaSsrLCBpTiArPSBOICkKKyAgICB7CisKKyAgICAgICAgbCA9IGkgKyAxOworICAgICAgICBsTiA9IGlOICsgTjsKKyAgICAgICAgcnYxW2ldID0gc2NhbGUgKiBnOworCisgICAgICAgIC8qICBNdWx0aXBseWluZ3Mgb24gdGhlIGxlZnQgICovCisKKyAgICAgICAgZyA9IDA7CisgICAgICAgIHMgPSAwOworICAgICAgICBzY2FsZSA9IDA7CisKKyAgICAgICAgZm9yKCBrTiA9IGlOOyBrTiA8IE1OOyBrTiArPSBOICkKKyAgICAgICAgICAgIHNjYWxlICs9IGZhYnMoIFVba04gKyBpXSApOworCisgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBzY2FsZSApKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZvcigga04gPSBpTjsga04gPCBNTjsga04gKz0gTiApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBVW2tOICsgaV0gLz0gc2NhbGU7CisgICAgICAgICAgICAgICAgcyArPSBVW2tOICsgaV0gKiBVW2tOICsgaV07CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICBmID0gVVtpTiArIGldOworICAgICAgICAgICAgZyA9IC1zcXJ0KCBzICkgKiBTZ24oIGYgKTsKKyAgICAgICAgICAgIGggPSBmICogZyAtIHM7CisgICAgICAgICAgICBVW2lOICsgaV0gPSBmIC0gZzsKKworICAgICAgICAgICAgZm9yKCBqID0gbDsgaiA8IE47IGorKyApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgIGZvcigga04gPSBpTjsga04gPCBNTjsga04gKz0gTiApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIHMgKz0gVVtrTiArIGldICogVVtrTiArIGpdOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgICAgIGYgPSBzIC8gaDsKKworICAgICAgICAgICAgICAgIGZvcigga04gPSBpTjsga04gPCBNTjsga04gKz0gTiApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIFVba04gKyBqXSArPSBmICogVVtrTiArIGldOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgIGZvcigga04gPSBpTjsga04gPCBNTjsga04gKz0gTiApCisgICAgICAgICAgICAgICAgVVtrTiArIGldICo9IHNjYWxlOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgIFdbaV0gPSBzY2FsZSAqIGc7CisKKyAgICAgICAgLyogIE11bHRpcGx5aW5ncyBvbiB0aGUgcmlnaHQgICovCisKKyAgICAgICAgZyA9IDA7CisgICAgICAgIHMgPSAwOworICAgICAgICBzY2FsZSA9IDA7CisKKyAgICAgICAgZm9yKCBrID0gbDsgayA8IE47IGsrKyApCisgICAgICAgICAgICBzY2FsZSArPSBmYWJzKCBVW2lOICsga10gKTsKKworICAgICAgICBpZiggIVJFQUxfWkVSTyggc2NhbGUgKSkKKyAgICAgICAgeworCisgICAgICAgICAgICBmb3IoIGsgPSBsOyBrIDwgTjsgaysrICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIFVbaU4gKyBrXSAvPSBzY2FsZTsKKyAgICAgICAgICAgICAgICBzICs9IChVW2lOICsga10pICogKFVbaU4gKyBrXSk7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICBmID0gVVtpTiArIGxdOworICAgICAgICAgICAgZyA9IC1zcXJ0KCBzICkgKiBTZ24oIGYgKTsKKyAgICAgICAgICAgIGggPSBmICogZyAtIHM7CisgICAgICAgICAgICBVW2kgKiBOICsgbF0gPSBmIC0gZzsKKworICAgICAgICAgICAgZm9yKCBrID0gbDsgayA8IE47IGsrKyApCisgICAgICAgICAgICAgICAgcnYxW2tdID0gVVtpTiArIGtdIC8gaDsKKworICAgICAgICAgICAgZm9yKCBqTiA9IGxOOyBqTiA8IE1OOyBqTiArPSBOICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIHMgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBrID0gbDsgayA8IE47IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHMgKz0gVVtqTiArIGtdICogVVtpTiArIGtdOworCisgICAgICAgICAgICAgICAgZm9yKCBrID0gbDsgayA8IE47IGsrKyApCisgICAgICAgICAgICAgICAgICAgIFVbak4gKyBrXSArPSBzICogcnYxW2tdOworCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICBmb3IoIGsgPSBsOyBrIDwgTjsgaysrICkKKyAgICAgICAgICAgICAgICBVW2lOICsga10gKj0gc2NhbGU7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgdCA9IGZhYnMoIFdbaV0gKTsKKyAgICAgICAgdCArPSBmYWJzKCBydjFbaV0gKTsKKyAgICAgICAgYW5vcm0gPSBNQVgoIGFub3JtLCB0ICk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgYW5vcm0gKj0gY2M7CisKKyAgICAvKiAgYWNjdW11bGF0aW9uIG9mIHJpZ2h0IHRyYW5zZm9ybWF0aW9ucywgaWYgbmVlZGVkICAqLworCisgICAgaWYoIGdldF9WICkKKyAgICB7CisKKyAgICAgICAgZm9yKCBpID0gTiAtIDEsIGlOID0gTk4gLSBOOyBpID49IDA7IGktLSwgaU4gLT0gTiApCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoIGkgPCBOIC0gMSApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAvKiAgcGFzcy1ieSBzbWFsbCBnICAqLworICAgICAgICAgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBnICkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IGwsIGpOID0gbE47IGogPCBOOyBqKyssIGpOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICAgICAgVltqTiArIGldID0gVVtpTiArIGpdIC8gVVtpTiArIGxdIC8gZzsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSBsOyBqIDwgTjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gbCwga04gPSBsTjsgayA8IE47IGsrKywga04gKz0gTiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBVW2lOICsga10gKiBWW2tOICsgal07CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcigga04gPSBsTjsga04gPCBOTjsga04gKz0gTiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVltrTiArIGpdICs9IHMgKiBWW2tOICsgaV07CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gbCwgak4gPSBsTjsgaiA8IE47IGorKywgak4gKz0gTiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWW2lOICsgal0gPSAwOworICAgICAgICAgICAgICAgICAgICBWW2pOICsgaV0gPSAwOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBmb3IgKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICAgICAgVltpTiArIGldID0gMTsKKyAgICAgICAgICAgIGcgPSBydjFbaV07CisgICAgICAgICAgICBsID0gaTsKKyAgICAgICAgICAgIGxOID0gaU47CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgLyogIGFjY3VtdWxhdGlvbiBvZiBsZWZ0IHRyYW5zZm9ybWF0aW9ucywgaWYgbmVlZGVkICAqLworCisgICAgaWYoIGdldF9VICkKKyAgICB7CisKKyAgICAgICAgZm9yKCBpID0gTiAtIDEsIGlOID0gTk4gLSBOOyBpID49IDA7IGktLSwgaU4gLT0gTiApCisgICAgICAgIHsKKworICAgICAgICAgICAgbCA9IGkgKyAxOworICAgICAgICAgICAgbE4gPSBpTiArIE47CisgICAgICAgICAgICBnID0gV1tpXTsKKworICAgICAgICAgICAgZm9yKCBqID0gbDsgaiA8IE47IGorKyApCisgICAgICAgICAgICAgICAgVVtpTiArIGpdID0gMDsKKworICAgICAgICAgICAgLyogIHBhc3MtYnkgc21hbGwgZyAgKi8KKyAgICAgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBnICkpCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBsOyBqIDwgTjsgaisrICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgcyA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrTiA9IGxOOyBrTiA8IE1OOyBrTiArPSBOICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gVVtrTiArIGldICogVVtrTiArIGpdOworCisgICAgICAgICAgICAgICAgICAgIGYgPSBzIC8gVVtpTiArIGldIC8gZzsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGtOID0gaU47IGtOIDwgTU47IGtOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICAgICAgVVtrTiArIGpdICs9IGYgKiBVW2tOICsgaV07CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICAgICAgZm9yKCBqTiA9IGlOOyBqTiA8IE1OOyBqTiArPSBOICkKKyAgICAgICAgICAgICAgICAgICAgVVtqTiArIGldIC89IGc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBmb3IoIGpOID0gaU47IGpOIDwgTU47IGpOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICBVW2pOICsgaV0gPSAwOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICBVW2lOICsgaV0gKz0gMTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAvKiAgSXRlcmF0aW9ucyBRUi1hbGdvcml0aG0gZm9yIGJpZGlhZ29uYWwgbWF0cml4ZXMKKyAgICAgICBXW2ldIC0gaXMgdGhlIG1haW4gZGlhZ29uYWwKKyAgICAgICBydjFbaV0gLSBpcyB0aGUgdG9wIGRpYWdvbmFsLCBydjFbMF09MC4KKyAgICAgKi8KKworICAgIGZvciggayA9IE4gLSAxOyBrID49IDA7IGstLSApCisgICAgeworCisgICAgICAgIGsxID0gayAtIDE7CisgICAgICAgIGl0ZXJhdGlvbnMgPSAwOworCisgICAgICAgIGZvciggOzsgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qICBDeWNsZTogY2hlY2tpbmcgYSBwb3NzaWJpbGl0eSBvZiBmaXNzaW9uIG1hdHJpeCAgKi8KKyAgICAgICAgICAgIGZvciggbCA9IGs7IGwgPj0gMDsgbC0tICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGwxID0gbCAtIDE7CisKKyAgICAgICAgICAgICAgICBpZiggUkVBTF9aRVJPKCBydjFbbF0gKSB8fCBSRUFMX1pFUk8oIFdbbDFdICkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgaWYoICFSRUFMX1pFUk8oIHJ2MVtsXSApKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgLyogIFdbbDFdID0gMCwgIG1hdHJpeCBwb3NzaWJsZSB0byBmaXNzaW9uCisgICAgICAgICAgICAgICAgICAgYnkgY2xlYXJpbmcgb3V0IHJ2MVtsXSAgKi8KKworICAgICAgICAgICAgICAgIGMgPSAwOworICAgICAgICAgICAgICAgIHMgPSAxOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gbDsgaSA8PSBrOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBmID0gcyAqIHJ2MVtpXTsKKyAgICAgICAgICAgICAgICAgICAgcnYxW2ldID0gYyAqIHJ2MVtpXTsKKworICAgICAgICAgICAgICAgICAgICAvKiAgUm90YXRpb25zIGFyZSBkb25lIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgb3Igd2hlbiBlbGVtZW50IGluIHRoZSBsaW5lIGlzIGZpbmFnbGUuCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIGlmKCBSRUFMX1pFUk8oIGYgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGcgPSBXW2ldOworCisgICAgICAgICAgICAgICAgICAgIC8qICBTY2FsaW5nIHByZXZlbnRzIGZpbmFnbGluZyBIICggRiE9MCEpICovCisKKyAgICAgICAgICAgICAgICAgICAgYWYgPSBmYWJzKCBmICk7CisgICAgICAgICAgICAgICAgICAgIGFnID0gZmFicyggZyApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBhZiA8IGFnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGggPSBhZyAqIHNxcnQoIDEgKyAoZiAvIGcpICogKGYgLyBnKSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBoID0gYWYgKiBzcXJ0KCAxICsgKGYgLyBnKSAqIChmIC8gZykgKTsKKworICAgICAgICAgICAgICAgICAgICBXW2ldID0gaDsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGcgLyBoOworICAgICAgICAgICAgICAgICAgICBzID0gLWYgLyBoOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBnZXRfVSApCisgICAgICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBqTiA9IDA7IGpOIDwgTU47IGpOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFVbak4gKyBsMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeiA9IFVbak4gKyBpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVW2pOICsgbDFdID0geSAqIGMgKyB6ICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVW2pOICsgaV0gPSAteSAqIHMgKyB6ICogYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgLyogZm9yICovCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgIC8qIGlmICovCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisKKyAgICAgICAgICAgIC8qICBPdXRwdXQgaW4gdGhpcyBwbGFjZSBvZiBwcm9ncmFtIG1lYW5zLAorICAgICAgICAgICAgICAgdGhhdCBydjFbTF0gPSAwLCBtYXRyaXggZmlzc2lvbmVkCisgICAgICAgICAgICAgICBJdGVyYXRpb25zIG9mIHRoZSBwcm9jZXNzIG9mIHRoZSBwZXJzZWN1dGlvbgorICAgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCBhbHdheXMgZm9yCisgICAgICAgICAgICAgICB0aGUgYm90dG9tIGJsb2NrICggZnJvbSBsIGJlZm9yZSBrICksCisgICAgICAgICAgICAgICB3aXRoIGluY3JlYXNlIGwgcG9zc2libGUuCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgeiA9IFdba107CisKKyAgICAgICAgICAgIGlmKCBsID09IGsgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiAgQ29tcGxldGlvbiBpdGVyYXRpb25zOiBsb3dlciBibG9jaworICAgICAgICAgICAgICAgYmVjYW1lIHRyaXZpYWwgKCBydjFbS109MCkgICovCisKKyAgICAgICAgICAgIGlmKCBpdGVyYXRpb25zKysgPT0gbWF4X2l0ZXJhdGlvbnMgKQorICAgICAgICAgICAgICAgIHJldHVybiBrOworCisgICAgICAgICAgICAvKiAgU2hpZnQgaXMgY29tcHV0ZWQgb24gdGhlIGxvd2VzdCBvcmRlciAyIG1pbm9yLiAgKi8KKworICAgICAgICAgICAgeCA9IFdbbF07CisgICAgICAgICAgICB5ID0gV1trMV07CisgICAgICAgICAgICBnID0gcnYxW2sxXTsKKyAgICAgICAgICAgIGggPSBydjFba107CisKKyAgICAgICAgICAgIC8qICBjb25zZXF1ZW50IGZpc3Npb24gcHJldmVudHMgZm9ybWluZyBhIG1hY2hpbmUgemVybyAgKi8KKyAgICAgICAgICAgIGYgPSAoKHkgLSB6KSAqICh5ICsgeikgKyAoZyAtIGgpICogKGcgKyBoKSkgLyAoMiAqIGgpIC8geTsKKworICAgICAgICAgICAgLyogIHByZXZlbnRlZCBvdmVyZmxvdyAgKi8KKyAgICAgICAgICAgIGlmKCBmYWJzKCBmICkgPiAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnID0gZmFicyggZiApOworICAgICAgICAgICAgICAgIGcgKj0gc3FydCggMSArICgxIC8gZikgKiAoMSAvIGYpICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZyA9IHNxcnQoIGYgKiBmICsgMSApOworCisgICAgICAgICAgICBmID0gKCh4IC0geikgKiAoeCArIHopICsgaCAqICh5IC8gKGYgKyBmYWJzKCBnICkgKiBTZ24oIGYgKSkgLSBoKSkgLyB4OworICAgICAgICAgICAgYyA9IDE7CisgICAgICAgICAgICBzID0gMTsKKworICAgICAgICAgICAgZm9yKCBpMSA9IGw7IGkxIDw9IGsxOyBpMSsrICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGkgPSBpMSArIDE7CisgICAgICAgICAgICAgICAgZyA9IHJ2MVtpXTsKKyAgICAgICAgICAgICAgICB5ID0gV1tpXTsKKyAgICAgICAgICAgICAgICBoID0gcyAqIGc7CisgICAgICAgICAgICAgICAgZyAqPSBjOworCisgICAgICAgICAgICAgICAgLyogIFNjYWxpbmcgYXQgY2FsY3VsYXRpb24gWiBwcmV2ZW50cyBpdHMgY2xlYXJpbmcsCisgICAgICAgICAgICAgICAgICAgaG93ZXZlciBpZiBGIGFuZCBIIGJvdGggYXJlIHplcm8gLSBwYXNzLWJ5IG9mIGZpc3Npb24gb24gWi4KKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGFmID0gZmFicyggZiApOworICAgICAgICAgICAgICAgIGFoID0gZmFicyggaCApOworCisgICAgICAgICAgICAgICAgaWYoIGFmIDwgYWggKQorICAgICAgICAgICAgICAgICAgICB6ID0gYWggKiBzcXJ0KCAxICsgKGYgLyBoKSAqIChmIC8gaCkgKTsKKworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBhZiApKQorICAgICAgICAgICAgICAgICAgICAgICAgeiA9IGFmICogc3FydCggMSArIChoIC8gZikgKiAoaCAvIGYpICk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgICAgICAgICBydjFbaTFdID0gejsKKworICAgICAgICAgICAgICAgIC8qICBpZiBaPTAsIHRoZSByb3RhdGlvbiBpcyBmcmVlLiAgKi8KKyAgICAgICAgICAgICAgICBpZiggIVJFQUxfWkVSTyggeiApKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBjID0gZiAvIHo7CisgICAgICAgICAgICAgICAgICAgIHMgPSBoIC8gejsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICAgICAgICAgIGYgPSB4ICogYyArIGcgKiBzOworICAgICAgICAgICAgICAgIGcgPSAteCAqIHMgKyBnICogYzsKKyAgICAgICAgICAgICAgICBoID0geSAqIHM7CisgICAgICAgICAgICAgICAgeSAqPSBjOworCisgICAgICAgICAgICAgICAgaWYoIGdldF9WICkKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqTiA9IDA7IGpOIDwgTk47IGpOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHggPSBWW2pOICsgaTFdOworICAgICAgICAgICAgICAgICAgICAgICAgeiA9IFZbak4gKyBpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZbak4gKyBpMV0gPSB4ICogYyArIHogKiBzOworICAgICAgICAgICAgICAgICAgICAgICAgVltqTiArIGldID0gLXggKiBzICsgeiAqIGM7CisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgICAgICAgICAgYWYgPSBmYWJzKCBmICk7CisgICAgICAgICAgICAgICAgYWggPSBmYWJzKCBoICk7CisKKyAgICAgICAgICAgICAgICBpZiggYWYgPCBhaCApCisgICAgICAgICAgICAgICAgICAgIHogPSBhaCAqIHNxcnQoIDEgKyAoZiAvIGgpICogKGYgLyBoKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgeiA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhUkVBTF9aRVJPKCBhZiApKQorICAgICAgICAgICAgICAgICAgICAgICAgeiA9IGFmICogc3FydCggMSArIChoIC8gZikgKiAoaCAvIGYpICk7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgICAgICAgICBXW2kxXSA9IHo7CisKKyAgICAgICAgICAgICAgICBpZiggIVJFQUxfWkVSTyggeiApKQorICAgICAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgICAgICBjID0gZiAvIHo7CisgICAgICAgICAgICAgICAgICAgIHMgPSBoIC8gejsKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICAgICAgICAgIGYgPSBjICogZyArIHMgKiB5OworICAgICAgICAgICAgICAgIHggPSAtcyAqIGcgKyBjICogeTsKKworICAgICAgICAgICAgICAgIGlmKCBnZXRfVSApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGZvciggak4gPSAwOyBqTiA8IE1OOyBqTiArPSBOICkKKyAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICB5ID0gVVtqTiArIGkxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBVW2pOICsgaV07CisgICAgICAgICAgICAgICAgICAgICAgICBVW2pOICsgaTFdID0geSAqIGMgKyB6ICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgIFVbak4gKyBpXSA9IC15ICogcyArIHogKiBjOworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAvKiBmb3IgKi8KKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgIHJ2MVtsXSA9IDA7CisgICAgICAgICAgICBydjFba10gPSBmOworICAgICAgICAgICAgV1trXSA9IHg7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgIGlmKCB6IDwgMCApCisgICAgICAgIHsKKworICAgICAgICAgICAgV1trXSA9IC16OworCisgICAgICAgICAgICBpZiggZ2V0X1YgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgZm9yKCBqTiA9IDA7IGpOIDwgTk47IGpOICs9IE4gKQorICAgICAgICAgICAgICAgICAgICBWW2pOICsga10gKj0gLTE7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgY3ZGcmVlKCAmcnYxICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdm1fU2luZ3VsYXJWYWx1ZURlY29tcG9zaXRpb24gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBPYnNvbGV0ZSBmdW5jdGlvbnMuIEp1c3QgZm9yIFZpZXdNb3JwaW5nICovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitpbnQKK2ljdkdhdXNzTXhOKCBkb3VibGUgKkEsIGRvdWJsZSAqQiwgaW50IE0sIGludCBOLCBkb3VibGUgKipzb2x1dGlvbnMgKQoreworICAgIGludCAqdmFyaWFibGVzOworICAgIGludCByb3csIHN3YXBpLCBpLCBpX2Jlc3QgPSAwLCBqLCBqX2Jlc3QgPSAwLCB0OworICAgIGRvdWJsZSBzd2FwZCwgcmF0aW8sIGJpZ2VzdDsKKworICAgIGlmKCAhQSB8fCAhQiB8fCAhTSB8fCAhTiApCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHZhcmlhYmxlcyA9IChpbnQgKikgY3ZBbGxvYyggKHNpemVfdCkgTiAqIHNpemVvZiggaW50ICkpOworCisgICAgaWYoIHZhcmlhYmxlcyA9PSAwICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yKCBpID0gMDsgaSA8IE47IGkrKyApCisgICAgeworICAgICAgICB2YXJpYWJsZXNbaV0gPSBpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIC8qIC0tLS0tICBEaXJlY3Qgd2F5ICAtLS0tLSAqLworCisgICAgZm9yKCByb3cgPSAwOyByb3cgPCBNOyByb3crKyApCisgICAgeworCisgICAgICAgIGJpZ2VzdCA9IDA7CisKKyAgICAgICAgZm9yKCBqID0gcm93OyBqIDwgTTsgaisrICkKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogc2VhcmNoIG5vbiBudWxsIGVsZW1lbnQgKi8KKyAgICAgICAgICAgIGZvciggaSA9IHJvdzsgaSA8IE47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGEgPSBmYWJzKCBBW2ogKiBOICsgaV0gKSwgYiA9IGZhYnMoIGJpZ2VzdCApOworICAgICAgICAgICAgICAgIGlmKCBhID4gYiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiaWdlc3QgPSBBW2ogKiBOICsgaV07CisgICAgICAgICAgICAgICAgICAgIGlfYmVzdCA9IGk7CisgICAgICAgICAgICAgICAgICAgIGpfYmVzdCA9IGo7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICBpZiggUkVBTF9aRVJPKCBiaWdlc3QgKSkKKyAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogaWYgYWxsIHNoYW5rIGVsZW1lbnRzIGFyZSBudWxsICovCisKKyAgICAgICAgaWYoIGpfYmVzdCAtIHJvdyApCisgICAgICAgIHsKKworICAgICAgICAgICAgZm9yKCB0ID0gMDsgdCA8IE47IHQrKyApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgIC8qIHN3YXAgYSByb3dzICovCisKKyAgICAgICAgICAgICAgICBzd2FwZCA9IEFbcm93ICogTiArIHRdOworICAgICAgICAgICAgICAgIEFbcm93ICogTiArIHRdID0gQVtqX2Jlc3QgKiBOICsgdF07CisgICAgICAgICAgICAgICAgQVtqX2Jlc3QgKiBOICsgdF0gPSBzd2FwZDsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgIHN3YXBkID0gQltyb3ddOworICAgICAgICAgICAgQltyb3ddID0gQltqX2Jlc3RdOworICAgICAgICAgICAgQltqX2Jlc3RdID0gc3dhcGQ7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgaWYoIGlfYmVzdCAtIHJvdyApCisgICAgICAgIHsKKworICAgICAgICAgICAgZm9yKCB0ID0gMDsgdCA8IE07IHQrKyApCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgIC8qIHN3YXAgYSBjb2x1bW5zICAqLworCisgICAgICAgICAgICAgICAgc3dhcGQgPSBBW3QgKiBOICsgaV9iZXN0XTsKKyAgICAgICAgICAgICAgICBBW3QgKiBOICsgaV9iZXN0XSA9IEFbdCAqIE4gKyByb3ddOworICAgICAgICAgICAgICAgIEFbdCAqIE4gKyByb3ddID0gc3dhcGQ7CisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgICAgICAgICBzd2FwaSA9IHZhcmlhYmxlc1tyb3ddOworICAgICAgICAgICAgdmFyaWFibGVzW3Jvd10gPSB2YXJpYWJsZXNbaV9iZXN0XTsKKyAgICAgICAgICAgIHZhcmlhYmxlc1tpX2Jlc3RdID0gc3dhcGk7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgZm9yKCBpID0gcm93ICsgMTsgaSA8IE07IGkrKyApCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIHJlY291bnRpbmcgQSBhbmQgQiAqLworCisgICAgICAgICAgICByYXRpbyA9IC1BW2kgKiBOICsgcm93XSAvIEFbcm93ICogTiArIHJvd107CisgICAgICAgICAgICBCW2ldICs9IEJbcm93XSAqIHJhdGlvOworCisgICAgICAgICAgICBmb3IoIGogPSBOIC0gMTsgaiA+PSByb3c7IGotLSApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBBW2kgKiBOICsgal0gKz0gQVtyb3cgKiBOICsgal0gKiByYXRpbzsKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIGlmKCByb3cgPCBNICkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgcmFuayhBKTxNICovCisKKyAgICAgICAgZm9yKCBqID0gcm93OyBqIDwgTTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFSRUFMX1pFUk8oIEJbal0gKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGN2RnJlZSggJnZhcmlhYmxlcyApOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsgICAgICAvKiBpZiBzeXN0ZW0gaXMgYW50aXRoZXRpYyAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICBNID0gcm93OyAgICAgICAgICAgICAgICAvKiBkZWNyZWFzaW5nIHNpemUgb2YgdGhlIHRhc2sgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIC8qIC0tLS0tIFJldmVyc2Ugd2F5IC0tLS0tICovCisKKyAgICBpZiggTSA8IE4gKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiBzb2x1dGlvbiBhcmUgbm90IGV4Y2x1c2l2ZSAqLworCisgICAgICAgICpzb2x1dGlvbnMgPSAoZG91YmxlICopIGN2QWxsb2MoICgoTiAtIE0gKyAxKSAqIE4pICogc2l6ZW9mKCBkb3VibGUgKSk7CisKKyAgICAgICAgaWYoICpzb2x1dGlvbnMgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2RnJlZSggJnZhcmlhYmxlcyApOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKworICAgICAgICBmb3IoIHQgPSBNOyB0IDw9IE47IHQrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IE07IGogPCBOOyBqKysgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgKCpzb2x1dGlvbnMpWyh0IC0gTSkgKiBOICsgdmFyaWFibGVzW2pdXSA9IChkb3VibGUpICh0ID09IGopOworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgZm9yKCBpID0gTSAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgLyogZmluZGluZyBjb21wb25lbnQgb2Ygc29sdXRpb24gKi8KKworICAgICAgICAgICAgICAgIGlmKCB0IDwgTiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKnNvbHV0aW9ucylbKHQgLSBNKSAqIE4gKyB2YXJpYWJsZXNbaV1dID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCpzb2x1dGlvbnMpWyh0IC0gTSkgKiBOICsgdmFyaWFibGVzW2ldXSA9IEJbaV0gLyBBW2kgKiBOICsgaV07CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBpICsgMTsgaiA8IE47IGorKyApCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICgqc29sdXRpb25zKVsodCAtIE0pICogTiArIHZhcmlhYmxlc1tpXV0gLT0KKyAgICAgICAgICAgICAgICAgICAgICAgICgqc29sdXRpb25zKVsodCAtIE0pICogTiArIHZhcmlhYmxlc1tqXV0gKiBBW2kgKiBOICsgal0gLyBBW2kgKiBOICsgaV07CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgY3ZGcmVlKCAmdmFyaWFibGVzICk7CisgICAgICAgIHJldHVybiBOIC0gTTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICpzb2x1dGlvbnMgPSAoZG91YmxlICopIGN2QWxsb2MoIChOKSAqIHNpemVvZiggZG91YmxlICkpOworCisgICAgaWYoIHNvbHV0aW9ucyA9PSAwICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgZm9yKCBpID0gTiAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZmluZGluZyBleGNsdXNpdmUgc29sdXRpb24gKi8KKworICAgICAgICAoKnNvbHV0aW9ucylbdmFyaWFibGVzW2ldXSA9IEJbaV0gLyBBW2kgKiBOICsgaV07CisKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPCBOOyBqKysgKQorICAgICAgICB7CisKKyAgICAgICAgICAgICgqc29sdXRpb25zKVt2YXJpYWJsZXNbaV1dIC09CisgICAgICAgICAgICAgICAgKCpzb2x1dGlvbnMpW3ZhcmlhYmxlc1tqXV0gKiBBW2kgKiBOICsgal0gLyBBW2kgKiBOICsgaV07CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIGN2RnJlZSggJnZhcmlhYmxlcyApOworICAgIHJldHVybiAwOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGljdkdhdXNzTXhOICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKgorc3RhdGljIEN2U3RhdHVzCitpY3ZHZXRDb29mKCBkb3VibGUgKmYxLCBkb3VibGUgKmYyLCBkb3VibGUgKmEyLCBkb3VibGUgKmExLCBkb3VibGUgKmEwICkKK3sKKyAgICBkb3VibGUgR1s5XSwgYTM7CisgICAgaW50IGk7CisKKyAgICBpZiggIWYxIHx8ICFmMiB8fCAhYTAgfHwgIWExIHx8ICFhMiApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgZm9yKCBpID0gMDsgaSA8IDk7IGkrKyApCisgICAgeworCisgICAgICAgIEdbaV0gPSBmMVtpXSAtIGYyW2ldOworICAgIH0KKworICAgIGEzID0gaWN2RGV0KCBHICk7CisKKyAgICBpZiggUkVBTF9aRVJPKCBhMyApKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgICphMiA9IDA7CisgICAgKmExID0gMDsKKyAgICAqYTAgPSBpY3ZEZXQoIGYyICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgOTsgaSsrICkKKyAgICB7CisKKyAgICAgICAgKmEyICs9IGYyW2ldICogaWN2TWlub3IoIEcsIChpbnQpIChpICUgMyksIChpbnQpIChpIC8gMykgKTsKKyAgICAgICAgKmExICs9IEdbaV0gKiBpY3ZNaW5vciggZjIsIChpbnQpIChpICUgMyksIChpbnQpIChpIC8gMykgKTsKKyAgICB9CisKKyAgICAqYTAgLz0gYTM7CisgICAgKmExIC89IGEzOworICAgICphMiAvPSBhMzsKKworICAgIHJldHVybiBDVl9OT19FUlI7CisKK30qLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZHZXRDb29mICovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICBpY3ZMTWVkUzcKKy8vICAgIFB1cnBvc2U6CisvLyAgICAgIAorLy8gICAgICAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgIAorLy8gICAgICAKKy8vICAgICAgCisvLyAgICAgCisvLyAgICAgIAorLy8gICAgCisvLyAgICAgCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBDVl9OT19FUlIgaWYgYWxsIE9rIG9yIGVycm9yIGNvZGUKKy8vICAgIE5vdGVzOgorLy9GKi8KKworQ3ZTdGF0dXMKK2ljdkxNZWRTNyggaW50ICpwb2ludHMxLCBpbnQgKnBvaW50czIsIEN2TWF0cml4MyAqIG1hdHJpeCApCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY29ycmVjdCByZWFsaXphdGlvbiAqLworICAgIEN2U3RhdHVzIGVycm9yID0gQ1ZfTk9fRVJSOworCisvKiAgICBpbnQgICAgICAgICBhbW91bnQ7ICovCisgICAgbWF0cml4ID0gbWF0cml4OworICAgIHBvaW50czEgPSBwb2ludHMxOworICAgIHBvaW50czIgPSBwb2ludHMyOworCisvKiAgICBlcnJvciA9IGNzX1BvaW50NyggcG9pbnRzMSwgcG9pbnRzMiwgbWF0cml4ICk7ICovCisvKiAgICBlcnJvciA9IGljdlBvaW50NyAgICAoIHBvaW50czEsIHBvaW50czIsIG1hdHJpeCwmYW1vdW50ICk7ICovCisgICAgcmV0dXJuIGVycm9yOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGljdkxNZWRTNyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lOiAgICBpY3ZQb2ludDcKKy8vICAgIFB1cnBvc2U6CisvLyAgICAgIAorLy8gICAgICAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOgorLy8gICAgIAorLy8gICAgICAKKy8vICAgICAgCisvLyAgICAgCisvLyAgICAgIAorLy8gICAgCisvLyAgICAgCisvLyAgICBSZXR1cm5zOgorLy8gICAgICBDVl9OT19FUlIgaWYgYWxsIE9rIG9yIGVycm9yIGNvZGUKKy8vICAgIE5vdGVzOgorLy9GKi8KKworQ3ZTdGF0dXMKK2ljdlBvaW50NyggaW50ICptbCwgaW50ICptciwgZG91YmxlICpGLCBpbnQgKmFtb3VudCApCit7CisgICAgZG91YmxlIEFbNjNdLCBCWzddOworICAgIGRvdWJsZSAqc29sdXRpb25zOworICAgIGRvdWJsZSBhMiwgYTEsIGEwOworICAgIGRvdWJsZSBzcXVhcmVzWzZdOworICAgIGludCBpLCBqOworCisvKiAgICBpbnQgICAgICAgICBhbW91bnQ7ICovCisvKiAgICBmbG9hdCogICAgIEY7ICovCisKKyAgICBDdlN0YXR1cyBlcnJvciA9IENWX0JBREZBQ1RPUl9FUlI7CisKKy8qICAgIEYgPSAoZmxvYXQqKW1hdHJpeC0+bTsgKi8KKworICAgIGlmKCAhbWwgfHwgIW1yIHx8ICFGICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgNzsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCA5OyBqKysgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIEFbaSAqIDkgKyBqXSA9IChkb3VibGUpIG1sW2kgKiAzICsgaiAvIDNdICogKGRvdWJsZSkgbXJbaSAqIDMgKyBqICUgM107CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICBCW2ldID0gMDsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqYW1vdW50ID0gMDsKKworICAgIGlmKCBpY3ZHYXVzc014TiggQSwgQiwgNywgOSwgJnNvbHV0aW9ucyApID09IDIgKQorICAgIHsKKyAgICAgICAgaWYoIGljdkdldENvZWYoIHNvbHV0aW9ucywgc29sdXRpb25zICsgOSwgJmEyLCAmYTEsICZhMCApID09IENWX05PX0VSUiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkN1YmljKCBhMiwgYTEsIGEwLCBzcXVhcmVzICk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAxOyBpKysgKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYoIFJFQUxfWkVSTyggc3F1YXJlc1tpICogMiArIDFdICkpCisgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCA5OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEZbKmFtb3VudCArIGpdID0gKGZsb2F0KSAoc3F1YXJlc1tpXSAqIHNvbHV0aW9uc1tqXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxIC0gc3F1YXJlc1tpXSkgKiBzb2x1dGlvbnNbaiArIDldKTsKKyAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgLyogZm9yICovCisKKyAgICAgICAgICAgICAgICAgICAgKmFtb3VudCArPSA5OworCisgICAgICAgICAgICAgICAgICAgIGVycm9yID0gQ1ZfTk9fRVJSOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKiBpZiAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICAgICAgICAgY3ZGcmVlKCAmc29sdXRpb25zICk7CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZzb2x1dGlvbnMgKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdkZyZWUoICZzb2x1dGlvbnMgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIHJldHVybiBlcnJvcjsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2UG9pbnQ3ICovCisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdm1hdC5jcHAgYi9jdmF1eC9zcmMvY3ZtYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZDJiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZtYXQuY3BwCkBAIC0wLDAgKzEsODc5IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCisvLyB0ZW1wb3JhcmlseSByZW1vdmUgaXQgZnJvbSBidWlsZAorI2lmIDAgJiYgKChfTVNDX1ZFUj49MTIwMCkgfHwgZGVmaW5lZCBfX0JPUkxBTkRDX18pCisKK2RvdWJsZSBDdk1BVDo6Z2V0KCBjb25zdCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGNvaSApCit7CisgICAgZG91YmxlIHQgPSAwOworICAgIGFzc2VydCggKHVuc2lnbmVkKWNvaSA8ICh1bnNpZ25lZClDVl9NQVRfQ04odHlwZSkgKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpICkKKyAgICB7CisgICAgY2FzZSBDVl84VToKKyAgICAgICAgdCA9ICgodWNoYXIqKXB0cilbY29pXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl84UzoKKyAgICAgICAgdCA9ICgoY2hhciopcHRyKVtjb2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzE2UzoKKyAgICAgICAgdCA9ICgoc2hvcnQqKXB0cilbY29pXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8zMlM6CisgICAgICAgIHQgPSAoKGludCopcHRyKVtjb2ldOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRjoKKyAgICAgICAgdCA9ICgoZmxvYXQqKXB0cilbY29pXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl82NEY6CisgICAgICAgIHQgPSAoKGRvdWJsZSopcHRyKVtjb2ldOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gdDsKK30KKwordm9pZCBDdk1BVDo6c2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGNvaSwgZG91YmxlIGQgKQoreworICAgIGludCBpOworICAgIGFzc2VydCggKHVuc2lnbmVkKWNvaSA8ICh1bnNpZ25lZClDVl9NQVRfQ04odHlwZSkgKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIENWXzhVOgorICAgICAgICBpID0gY3ZSb3VuZChkKTsKKyAgICAgICAgKCh1Y2hhciopcHRyKVtjb2ldID0gQ1ZfQ0FTVF84VShpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl84UzoKKyAgICAgICAgaSA9IGN2Um91bmQoZCk7CisgICAgICAgICgoY2hhciopcHRyKVtjb2ldID0gQ1ZfQ0FTVF84UyhpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8xNlM6CisgICAgICAgIGkgPSBjdlJvdW5kKGQpOworICAgICAgICAoKHNob3J0KilwdHIpW2NvaV0gPSBDVl9DQVNUXzE2UyhpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8zMlM6CisgICAgICAgIGkgPSBjdlJvdW5kKGQpOworICAgICAgICAoKGludCopcHRyKVtjb2ldID0gQ1ZfQ0FTVF8zMlMoaSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICAoKGZsb2F0KilwdHIpW2NvaV0gPSAoZmxvYXQpZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl82NEY6CisgICAgICAgICgoZG91YmxlKilwdHIpW2NvaV0gPSBkOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBDdk1BVDo6c2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGNvaSwgaW50IGkgKQoreworICAgIGFzc2VydCggKHVuc2lnbmVkKWNvaSA8ICh1bnNpZ25lZClDVl9NQVRfQ04odHlwZSkgKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIENWXzhVOgorICAgICAgICAoKHVjaGFyKilwdHIpW2NvaV0gPSBDVl9DQVNUXzhVKGkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzhTOgorICAgICAgICAoKGNoYXIqKXB0cilbY29pXSA9IENWX0NBU1RfOFMoaSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICAoKHNob3J0KilwdHIpW2NvaV0gPSBDVl9DQVNUXzE2UyhpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8zMlM6CisgICAgICAgICgoaW50KilwdHIpW2NvaV0gPSBpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRjoKKyAgICAgICAgKChmbG9hdCopcHRyKVtjb2ldID0gKGZsb2F0KWk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfNjRGOgorICAgICAgICAoKGRvdWJsZSopcHRyKVtjb2ldID0gKGRvdWJsZSlpOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBDdk1BVDo6c2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgZG91YmxlIGQgKQoreworICAgIGludCBpLCBjbiA9IENWX01BVF9DTih0eXBlKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIENWXzhVOgorICAgICAgICBpID0gY3ZSb3VuZChkKTsKKyAgICAgICAgKCh1Y2hhciopcHRyKVswXSA9IENWX0NBU1RfOFUoaSk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgodWNoYXIqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzhTOgorICAgICAgICBpID0gY3ZSb3VuZChkKTsKKyAgICAgICAgKChjaGFyKilwdHIpWzBdID0gQ1ZfQ0FTVF84UyhpKTsKKyAgICAgICAgaSA9IGNuOworICAgICAgICB3aGlsZSggLS1pICkgKChjaGFyKilwdHIpW2ldID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8xNlM6CisgICAgICAgIGkgPSBjdlJvdW5kKGQpOworICAgICAgICAoKHNob3J0KilwdHIpWzBdID0gQ1ZfQ0FTVF8xNlMoaSk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgoc2hvcnQqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyUzoKKyAgICAgICAgaSA9IGN2Um91bmQoZCk7CisgICAgICAgICgoaW50KilwdHIpWzBdID0gaTsKKyAgICAgICAgaSA9IGNuOworICAgICAgICB3aGlsZSggLS1pICkgKChpbnQqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRjoKKyAgICAgICAgKChmbG9hdCopcHRyKVswXSA9IChmbG9hdClkOworICAgICAgICBpID0gY247CisgICAgICAgIHdoaWxlKCAtLWkgKSAoKGZsb2F0KilwdHIpW2ldID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl82NEY6CisgICAgICAgICgoZG91YmxlKilwdHIpWzBdID0gZDsKKyAgICAgICAgaSA9IGNuOworICAgICAgICB3aGlsZSggLS1pICkgKChkb3VibGUqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKKwordm9pZCBDdk1BVDo6c2V0KCB1Y2hhciogcHRyLCBpbnQgdHlwZSwgaW50IGkgKQoreworICAgIGludCBjbiA9IENWX01BVF9DTih0eXBlKTsKKworICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpKQorICAgIHsKKyAgICBjYXNlIENWXzhVOgorICAgICAgICAoKHVjaGFyKilwdHIpWzBdID0gQ1ZfQ0FTVF84VShpKTsKKyAgICAgICAgaSA9IGNuOworICAgICAgICB3aGlsZSggLS1pICkgKCh1Y2hhciopcHRyKVtpXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfOFM6CisgICAgICAgICgoY2hhciopcHRyKVswXSA9IENWX0NBU1RfOFMoaSk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgoY2hhciopcHRyKVtpXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICAoKHNob3J0KilwdHIpWzBdID0gQ1ZfQ0FTVF8xNlMoaSk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgoc2hvcnQqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyUzoKKyAgICAgICAgKChpbnQqKXB0cilbMF0gPSBpOworICAgICAgICBpID0gY247CisgICAgICAgIHdoaWxlKCAtLWkgKSAoKGludCopcHRyKVtpXSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICAoKGZsb2F0KilwdHIpWzBdID0gKGZsb2F0KWk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgoZmxvYXQqKXB0cilbaV0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzY0RjoKKyAgICAgICAgKChkb3VibGUqKXB0cilbMF0gPSAoZG91YmxlKWk7CisgICAgICAgIGkgPSBjbjsKKyAgICAgICAgd2hpbGUoIC0taSApICgoZG91YmxlKilwdHIpW2ldID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX1RfJiBtYXRfdCApCit7CisgICAgZGF0YS5wdHIgPSAwOworICAgIHR5cGUgPSAwOworICAgIHJlZmNvdW50ID0gMDsKKyAgICAqdGhpcyA9IG1hdF90OworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX0FERF8mIG1hdF9hZGQgKQoreworICAgIGRhdGEucHRyID0gMDsKKyAgICB0eXBlID0gMDsKKyAgICByZWZjb3VudCA9IDA7CisgICAgKnRoaXMgPSBtYXRfYWRkOworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX0FERF9FWF8mIG1hdF9hZGQgKQoreworICAgIGRhdGEucHRyID0gMDsKKyAgICB0eXBlID0gMDsKKyAgICByZWZjb3VudCA9IDA7CisgICAgKnRoaXMgPSBtYXRfYWRkOworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX1NDQUxFXyYgc2NhbGVfbWF0ICkKK3sKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgdHlwZSA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gc2NhbGVfbWF0OworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX1NDQUxFX1NISUZUXyYgc2NhbGVfc2hpZnRfbWF0ICkKK3sKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgdHlwZSA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gc2NhbGVfc2hpZnRfbWF0OworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX01VTF8mIG1tdWwgKQoreworICAgIGRhdGEucHRyID0gMDsKKyAgICB0eXBlID0gMDsKKyAgICByZWZjb3VudCA9IDA7CisgICAgKnRoaXMgPSBtbXVsOworfQorCisKK0N2TUFUOjpDdk1BVCggY29uc3QgX0N2TUFUX01VTF9BRERfJiBtbXVsYWRkICkKK3sKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgdHlwZSA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gbW11bGFkZDsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9JTlZfJiBpbnZfbWF0ICkKK3sKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgdHlwZSA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gaW52X21hdDsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9OT1RfJiBub3RfbWF0ICkKK3sKKyAgICB0eXBlID0gMDsKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gbm90X21hdDsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9VTl9MT0dJQ18mIG1hdF9sb2dpYyApCit7CisgICAgdHlwZSA9IDA7CisgICAgZGF0YS5wdHIgPSAwOworICAgIHJlZmNvdW50ID0gMDsKKyAgICAqdGhpcyA9IG1hdF9sb2dpYzsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9MT0dJQ18mIG1hdF9sb2dpYyApCit7CisgICAgdHlwZSA9IDA7CisgICAgZGF0YS5wdHIgPSAwOworICAgIHJlZmNvdW50ID0gMDsKKyAgICAqdGhpcyA9IG1hdF9sb2dpYzsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9DT1BZXyYgbWF0X2NvcHkgKQoreworICAgIEN2TUFUKiBzcmMgPSAoQ3ZNQVQqKW1hdF9jb3B5LmE7CisgICAgY3JlYXRlKCBzcmMtPmhlaWdodCwgc3JjLT53aWR0aCwgc3JjLT50eXBlICk7CisgICAgY3ZDb3B5KCBzcmMsIHRoaXMgKTsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9DVlRfJiBtYXRfY3Z0ICkKK3sKKyAgICB0eXBlID0gMDsKKyAgICBkYXRhLnB0ciA9IDA7CisgICAgcmVmY291bnQgPSAwOworICAgICp0aGlzID0gbWF0X2N2dDsKK30KKworCitDdk1BVDo6Q3ZNQVQoIGNvbnN0IF9Ddk1BVF9ET1RfT1BfJiBkb3Rfb3AgKQoreworICAgIGRhdGEucHRyID0gMDsKKyAgICB0eXBlID0gMDsKKyAgICByZWZjb3VudCA9IDA7CisgICAgKnRoaXMgPSBkb3Rfb3A7Cit9CisKKworQ3ZNQVQ6OkN2TUFUKCBjb25zdCBfQ3ZNQVRfU09MVkVfJiBzb2x2ZV9tYXQgKQoreworICAgIHR5cGUgPSAwOworICAgIGRhdGEucHRyID0gMDsKKyAgICByZWZjb3VudCA9IDA7CisgICAgKnRoaXMgPSBzb2x2ZV9tYXQ7Cit9CisKKworQ3ZNQVQ6OkN2TUFUKCBjb25zdCBfQ3ZNQVRfQ01QXyYgY21wX21hdCApCit7CisgICAgdHlwZSA9IDA7CisgICAgZGF0YS5wdHIgPSAwOworICAgIHJlZmNvdW50ID0gMDsKKyAgICAqdGhpcyA9IGNtcF9tYXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TUFUOjpvcGVyYXRvciA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfVF8mIG1hdF90ICkKK3sKKyAgICBDdk1BVCogc3JjID0gKEN2TUFUKikmbWF0X3QuYTsKKyAgICBpZiggIWRhdGEucHRyICkKKyAgICB7CisgICAgICAgIGNyZWF0ZSggc3JjLT53aWR0aCwgc3JjLT5oZWlnaHQsIHNyYy0+dHlwZSApOworICAgIH0KKworICAgIGN2VHJhbnNwb3NlKCBzcmMsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0FERF8mIG1hdF9hZGQgKQoreworICAgIEN2TUFUKiBhID0gbWF0X2FkZC5hOworICAgIEN2TUFUKiBiID0gbWF0X2FkZC5iOworCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIGEtPmhlaWdodCwgYS0+d2lkdGgsIGEtPnR5cGUgKTsKKyAgICB9CisKKyAgICBpZiggbWF0X2FkZC5iZXRhID09IDEgKQorICAgIHsKKyAgICAgICAgY3ZBZGQoIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlmKCBtYXRfYWRkLmJldGEgPT0gLTEgKQorICAgIHsKKyAgICAgICAgY3ZTdWIoIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKGEtPnR5cGUpID49IENWXzMyRiAmJiBDVl9NQVRfQ04oYS0+dHlwZSkgPD0gMiApCisgICAgICAgIGN2U2NhbGVBZGQoIGIsIGN2U2NhbGFyKG1hdF9hZGQuYmV0YSksIGEsIHRoaXMgKTsKKyAgICBlbHNlCisgICAgICAgIGN2QWRkV2VpZ2h0ZWQoIGEsIDEsIGIsIG1hdF9hZGQuYmV0YSwgMCwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfQUREX0VYXyYgbWF0X2FkZCApCit7CisgICAgQ3ZNQVQqIGEgPSBtYXRfYWRkLmE7CisgICAgQ3ZNQVQqIGIgPSBtYXRfYWRkLmI7CisKKyAgICBpZiggIWRhdGEucHRyICkKKyAgICB7CisgICAgICAgIGNyZWF0ZSggYS0+aGVpZ2h0LCBhLT53aWR0aCwgYS0+dHlwZSApOworICAgIH0KKworICAgIGN2QWRkV2VpZ2h0ZWQoIGEsIG1hdF9hZGQuYWxwaGEsIGIsIG1hdF9hZGQuYmV0YSwgbWF0X2FkZC5nYW1tYSwgdGhpcyApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfU0NBTEVfJiBzY2FsZV9tYXQgKQoreworICAgIEN2TUFUKiBzcmMgPSBzY2FsZV9tYXQuYTsKKworICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBzcmMtPmhlaWdodCwgc3JjLT53aWR0aCwgc3JjLT50eXBlICk7CisgICAgfQorCisgICAgY3ZDb252ZXJ0U2NhbGUoIHNyYywgdGhpcywgc2NhbGVfbWF0LmFscGhhLCAwICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK0N2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9TQ0FMRV9TSElGVF8mIHNjYWxlX3NoaWZ0X21hdCApCit7CisgICAgQ3ZNQVQqIHNyYyA9IHNjYWxlX3NoaWZ0X21hdC5hOworICAgIAorICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBzcmMtPmhlaWdodCwgc3JjLT53aWR0aCwgc3JjLT50eXBlICk7CisgICAgfQorCisgICAgY3ZDb252ZXJ0U2NhbGUoIHNyYywgdGhpcywgc2NhbGVfc2hpZnRfbWF0LmFscGhhLCBzY2FsZV9zaGlmdF9tYXQuYmV0YSApOworICAgIHJldHVybiAqdGhpczsKK30KKworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfTVVMXyYgbW11bCApCit7CisgICAgQ3ZNQVQqIGEgPSBtbXVsLmE7CisgICAgQ3ZNQVQqIGIgPSBtbXVsLmI7CisgICAgaW50IHRfYSA9IG1tdWwudF9hYiAmIDE7CisgICAgaW50IHRfYiA9IChtbXVsLnRfYWIgJiAyKSAhPSAwOworICAgIGludCBtID0gKCYoYS0+cm93cykpW3RfYV07CisgICAgaW50IG4gPSAoJihiLT5yb3dzKSlbdF9iIF4gMV07CisgICAgLyogdGhpcyhtIHggbikgPSAoYV5vMSh0KSkobSB4IGwpICogKGJebzIodCkpKGwgeCBuKSAqLworCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIG0sIG4sIGEtPnR5cGUgKTsKKyAgICB9CisKKyAgICBpZiggbW11bC5hbHBoYSA9PSAxICkKKyAgICB7CisgICAgICAgIGlmKCBtbXVsLnRfYWIgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2TWF0TXVsQWRkKCBhLCBiLCAwLCB0aGlzICk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKCBhLT5kYXRhLnB0ciA9PSBiLT5kYXRhLnB0ciAmJiBtbXVsLnRfYWIgPCAzICYmCisgICAgICAgICAgICBhLT5yb3dzID09IGItPnJvd3MgJiYgYS0+Y29scyA9PSBiLT5jb2xzICYmCisgICAgICAgICAgICBhLT5kYXRhLnB0ciAhPSBkYXRhLnB0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2TXVsVHJhbnNwb3NlZCggYSwgdGhpcywgbW11bC50X2FiICYgMSApOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgY3ZHRU1NKCBhLCBiLCBtbXVsLmFscGhhLCAwLCAwLCB0aGlzLCBtbXVsLnRfYWIgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX01VTF9BRERfJiBtbXVsYWRkICkKK3sKKyAgICBDdk1BVCogYSA9IG1tdWxhZGQuYTsKKyAgICBDdk1BVCogYiA9IG1tdWxhZGQuYjsKKyAgICBDdk1BVCogYyA9IG1tdWxhZGQuYzsKKyAgICBpbnQgdF9hID0gbW11bGFkZC50X2FiYyAmIDE7CisgICAgaW50IHRfYiA9IChtbXVsYWRkLnRfYWJjICYgMikgIT0gMDsKKyAgICBpbnQgbSA9ICgmKGEtPnJvd3MpKVt0X2FdOworICAgIGludCBuID0gKCYoYi0+cm93cykpW3RfYiBeIDFdOworICAgIC8qIHRoaXMobSB4IG4pID0gKGFebzEodCkpKG0geCBsKSAqIChiXm8yKHQpKShsIHggbikgKi8KKworICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBtLCBuLCBhLT50eXBlICk7CisgICAgfQorCisgICAgaWYoIG1tdWxhZGQudF9hYmMgPT0gMCAmJiBtbXVsYWRkLmFscGhhID09IDEgJiYgbW11bGFkZC5iZXRhID09IDEgKQorICAgICAgICBjdk1hdE11bEFkZCggYSwgYiwgYywgdGhpcyApOworICAgIGVsc2UKKyAgICAgICAgY3ZHRU1NKCBhLCBiLCBtbXVsYWRkLmFscGhhLCBjLCBtbXVsYWRkLmJldGEsIHRoaXMsIG1tdWxhZGQudF9hYmMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0lOVl8mIGludl9tYXQgKQoreworICAgIEN2TUFUKiBzcmMgPSAoQ3ZNQVQqKSZpbnZfbWF0LmE7CisgICAgCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIHNyYy0+aGVpZ2h0LCBzcmMtPndpZHRoLCBzcmMtPnR5cGUgKTsKKyAgICB9CisKKyAgICBpZiggaW52X21hdC5tZXRob2QgPT0gMCApCisgICAgICAgIGN2SW52ZXJ0KCBzcmMsIHRoaXMgKTsKKyAgICBlbHNlCisgICAgICAgIGN2UHNldWRvSW52KCBzcmMsIHRoaXMgKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX05PVF8mIG5vdF9tYXQgKQoreworICAgIEN2TUFUKiBzcmMgPSBub3RfbWF0LmE7CisgICAgCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIHNyYy0+aGVpZ2h0LCBzcmMtPndpZHRoLCBzcmMtPnR5cGUgKTsKKyAgICB9CisKKyAgICBjdk5vdCggc3JjLCB0aGlzICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK0N2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9MT0dJQ18mIG1hdF9sb2dpYyApCit7CisgICAgQ3ZNQVQqIGEgPSBtYXRfbG9naWMuYTsKKyAgICBDdk1BVCogYiA9IG1hdF9sb2dpYy5iOworICAgIGludCBmbGFncyA9IG1hdF9sb2dpYy5mbGFnczsKKyAgICBfQ3ZNQVRfTE9HSUNfOjpPcCBvcCA9IG1hdF9sb2dpYy5vcDsKKworICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBhLT5oZWlnaHQsIGEtPndpZHRoLCBhLT50eXBlICk7CisgICAgfQorCisgICAgc3dpdGNoKCBvcCApCisgICAgeworICAgIGNhc2UgX0N2TUFUX0xPR0lDXzo6QU5EOgorCisgICAgICAgIGlmKCBmbGFncyA9PSAwICkKKyAgICAgICAgICAgIGN2QW5kKCBhLCBiLCB0aGlzICk7CisgICAgICAgIGVsc2UgaWYoIGZsYWdzID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBjdk9yKCBhLCBiLCB0aGlzICk7CisgICAgICAgICAgICBjdk5vdCggdGhpcywgdGhpcyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGZsYWdzID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZGF0YS5wdHIgPT0gYi0+ZGF0YS5wdHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Tm90KCBiLCB0aGlzICk7CisgICAgICAgICAgICAgICAgY3ZPciggdGhpcywgYSwgdGhpcyApOworICAgICAgICAgICAgICAgIGN2Tm90KCB0aGlzLCB0aGlzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZOb3QoIGEsIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBjdkFuZCggdGhpcywgYiwgdGhpcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGRhdGEucHRyID09IGEtPmRhdGEucHRyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdk5vdCggYSwgdGhpcyApOworICAgICAgICAgICAgICAgIGN2T3IoIHRoaXMsIGIsIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBjdk5vdCggdGhpcywgdGhpcyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Tm90KCBiLCB0aGlzICk7CisgICAgICAgICAgICAgICAgY3ZBbmQoIHRoaXMsIGEsIHRoaXMgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgX0N2TUFUX0xPR0lDXzo6T1I6CisKKyAgICAgICAgaWYoIGZsYWdzID09IDAgKQorICAgICAgICAgICAgY3ZPciggYSwgYiwgdGhpcyApOworICAgICAgICBlbHNlIGlmKCBmbGFncyA9PSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZBbmQoIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgICAgIGN2Tm90KCB0aGlzLCB0aGlzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggZmxhZ3MgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkYXRhLnB0ciA9PSBiLT5kYXRhLnB0ciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZOb3QoIGIsIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBjdkFuZCggdGhpcywgYSwgdGhpcyApOworICAgICAgICAgICAgICAgIGN2Tm90KCB0aGlzLCB0aGlzICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZOb3QoIGEsIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBjdk9yKCB0aGlzLCBiLCB0aGlzICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZGF0YS5wdHIgPT0gYS0+ZGF0YS5wdHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Tm90KCBhLCB0aGlzICk7CisgICAgICAgICAgICAgICAgY3ZBbmQoIHRoaXMsIGIsIHRoaXMgKTsKKyAgICAgICAgICAgICAgICBjdk5vdCggdGhpcywgdGhpcyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Tm90KCBiLCB0aGlzICk7CisgICAgICAgICAgICAgICAgY3ZPciggdGhpcywgYSwgdGhpcyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBfQ3ZNQVRfTE9HSUNfOjpYT1I6CisKKyAgICAgICAgY3ZYb3IoIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgaWYoIGZsYWdzID09IDEgfHwgZmxhZ3MgPT0gMiApCisgICAgICAgICAgICBjdk5vdCggdGhpcywgdGhpcyApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX1VOX0xPR0lDXyYgbWF0X2xvZ2ljICkKK3sKKyAgICBDdk1BVCogYSA9IG1hdF9sb2dpYy5hOworICAgIEN2U2NhbGFyIHNjYWxhciA9IGN2U2NhbGFyQWxsKCBtYXRfbG9naWMuYWxwaGEgKTsKKyAgICBpbnQgZmxhZ3MgPSBtYXRfbG9naWMuZmxhZ3M7CisgICAgX0N2TUFUX0xPR0lDXzo6T3Agb3AgPSBtYXRfbG9naWMub3A7CisKKyAgICBpZiggIWRhdGEucHRyICkKKyAgICB7CisgICAgICAgIGNyZWF0ZSggYS0+aGVpZ2h0LCBhLT53aWR0aCwgYS0+dHlwZSApOworICAgIH0KKworICAgIHN3aXRjaCggb3AgKQorICAgIHsKKyAgICBjYXNlIF9Ddk1BVF9MT0dJQ186OkFORDoKKworICAgICAgICBpZiggZmxhZ3MgPT0gMCApCisgICAgICAgICAgICBjdkFuZFMoIGEsIHNjYWxhciwgdGhpcyApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Tm90KCBhLCB0aGlzICk7CisgICAgICAgICAgICBjdkFuZFMoIHRoaXMsIHNjYWxhciwgdGhpcyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBfQ3ZNQVRfTE9HSUNfOjpPUjoKKworICAgICAgICBpZiggZmxhZ3MgPT0gMCApCisgICAgICAgICAgICBjdk9yUyggYSwgc2NhbGFyLCB0aGlzICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3ZOb3QoIGEsIHRoaXMgKTsKKyAgICAgICAgICAgIGN2T3JTKCB0aGlzLCBzY2FsYXIsIHRoaXMgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgX0N2TUFUX0xPR0lDXzo6WE9SOgorCisgICAgICAgIGlmKCBmbGFncyA9PSAwICkKKyAgICAgICAgICAgIGN2WG9yUyggYSwgc2NhbGFyLCB0aGlzICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2WG9yUyggYSwgfnNjYWxhciwgdGhpcyApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0NPUFlfJiBtYXRfY29weSApCit7CisgICAgQ3ZNQVQqIHNyYyA9IChDdk1BVCopbWF0X2NvcHkuYTsKKworICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBzcmMtPmhlaWdodCwgc3JjLT53aWR0aCwgc3JjLT50eXBlICk7CisgICAgfQorCisgICAgaWYoIHNyYyAhPSB0aGlzICkKKyAgICAgICAgY3ZDb3B5KCBzcmMsIHRoaXMgKTsKKworICAgIHJldHVybiAqdGhpczsKK30KKworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfQ1ZUXyYgbWF0X2N2dCApCit7CisgICAgQ3ZNQVQqIHNyYyA9IChDdk1BVCopJm1hdF9jdnQuYTsKKyAgICAKKyAgICBpZiggIWRhdGEucHRyICkKKyAgICB7CisgICAgICAgIGludCBkZXB0aCA9IG1hdF9jdnQubmV3ZGVwdGg7CisgICAgICAgIGNyZWF0ZSggc3JjLT5oZWlnaHQsIHNyYy0+d2lkdGgsIGRlcHRoIDwgMCA/IHNyYy0+dHlwZSA6CisgICAgICAgICAgICAgICAgQ1ZfTUFUX0NOKHNyYy0+dHlwZSl8Q1ZfTUFUX0RFUFRIKGRlcHRoKSk7CisgICAgfQorCisgICAgY3ZDdnRTY2FsZSggc3JjLCB0aGlzLCBtYXRfY3Z0LnNjYWxlLCBtYXRfY3Z0LnNoaWZ0ICk7CisgICAgcmV0dXJuICp0aGlzOworfQorCisKK0N2TUFUJiBDdk1BVDo6b3BlcmF0b3IgPSAoIGNvbnN0IF9Ddk1BVF9ET1RfT1BfJiBkb3Rfb3AgKQoreworICAgIEN2TUFUKiBhID0gKEN2TUFUKikmKGRvdF9vcC5hKTsKKyAgICBDdk1BVCogYiA9IGRvdF9vcC5iOworICAgIAorICAgIGlmKCAhZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgY3JlYXRlKCBhLT5oZWlnaHQsIGEtPndpZHRoLCBhLT50eXBlICk7CisgICAgfQorCisgICAgc3dpdGNoKCBkb3Rfb3Aub3AgKQorICAgIHsKKyAgICBjYXNlICcqJzoKKyAgICAgICAgY3ZNdWwoIGEsIGIsIHRoaXMsIGRvdF9vcC5hbHBoYSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlICcvJzoKKyAgICAgICAgaWYoIGIgIT0gMCApCisgICAgICAgICAgICBjdkRpdiggYSwgYiwgdGhpcywgZG90X29wLmFscGhhICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2RGl2KCAwLCBhLCB0aGlzLCBkb3Rfb3AuYWxwaGEgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnbSc6CisgICAgICAgIGlmKCBiICE9IDAgKQorICAgICAgICAgICAgY3ZNaW4oIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZNaW5TKCBhLCBkb3Rfb3AuYWxwaGEsIHRoaXMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnTSc6CisgICAgICAgIGlmKCBiICE9IDAgKQorICAgICAgICAgICAgY3ZNYXgoIGEsIGIsIHRoaXMgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZNYXhTKCBhLCBkb3Rfb3AuYWxwaGEsIHRoaXMgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAnYSc6CisgICAgICAgIGlmKCBiICE9IDAgKQorICAgICAgICAgICAgY3ZBYnNEaWZmKCBhLCBiLCB0aGlzICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2QWJzRGlmZlMoIGEsIHRoaXMsIGN2U2NhbGFyKGRvdF9vcC5hbHBoYSkgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDApOworICAgIH0KKworICAgIHJldHVybiAqdGhpczsKK30KKworCitDdk1BVCYgQ3ZNQVQ6Om9wZXJhdG9yID0gKCBjb25zdCBfQ3ZNQVRfU09MVkVfJiBzb2x2ZV9tYXQgKQoreworICAgIEN2TUFUKiBhID0gKEN2TUFUKikoc29sdmVfbWF0LmEpOworICAgIEN2TUFUKiBiID0gKEN2TUFUKikoc29sdmVfbWF0LmIpOworCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIGEtPmhlaWdodCwgYi0+d2lkdGgsIGEtPnR5cGUgKTsKKyAgICB9CisKKyAgICBpZiggc29sdmVfbWF0Lm1ldGhvZCA9PSAwICkKKyAgICAgICAgY3ZTb2x2ZSggYSwgYiwgdGhpcyApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2TUFUIHRlbXA7CisgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJnRlbXAsIGEtPmNvbHMsIGEtPnJvd3MsIGEtPnR5cGUgKTsKKyAgICAgICAgY3ZDcmVhdGVEYXRhKCAmdGVtcCApOworCisgICAgICAgIGN2UHNldWRvSW52KCBhLCAmdGVtcCApOworICAgICAgICBjdk1hdE11bCggJnRlbXAsIGIsIHRoaXMgKTsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKKworQ3ZNQVQmIEN2TUFUOjpvcGVyYXRvciA9ICggY29uc3QgX0N2TUFUX0NNUF8mIG1hdF9jbXAgKQoreworICAgIEN2TUFUKiBhID0gbWF0X2NtcC5hOworICAgIEN2TUFUKiBiID0gbWF0X2NtcC5iOworCisgICAgaWYoICFkYXRhLnB0ciApCisgICAgeworICAgICAgICBjcmVhdGUoIGEtPmhlaWdodCwgYS0+d2lkdGgsIENWXzhVQzEgKTsKKyAgICB9CisKKyAgICBpZiggYiApCisgICAgICAgIGN2Q21wKCBhLCBiLCB0aGlzLCBtYXRfY21wLmNtcF9vcCApOworICAgIGVsc2UKKyAgICAgICAgY3ZDbXBTKCBhLCBtYXRfY21wLmFscGhhLCB0aGlzLCBtYXRfY21wLmNtcF9vcCApOworICAgIHJldHVybiAqdGhpczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNQVQgSS9PIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgIEN2TUFUOjp3cml0ZSggY29uc3QgY2hhciogbmFtZSwgRklMRSogZiwgY29uc3QgY2hhciogZm10ICkKK3sKKyAgICBpbnQgaSwgaiwgdyA9IHdpZHRoICogQ1ZfTUFUX0NOKHR5cGUpOworICAgIEZJTEUqIG91dCA9IGYgPyBmIDogc3Rkb3V0OworCisgICAgaWYoIG5hbWUgKQorICAgICAgICBmcHJpbnRmKCBzdGRvdXQsICIlcyglZCB4ICVkKSA9XG5cdCIsIG5hbWUsIHJvd3MsIGNvbHMgKTsKKyAgICAKKyAgICBmb3IoIGkgPSAwOyBpIDwgcm93czsgaSsrICkKKyAgICB7CisgICAgICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHR5cGUpKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfOFU6IGlmKCAhZm10ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZtdCA9ICIlNGQiOworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgdzsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIG91dCwgZm10LCAoKHVjaGFyKikoZGF0YS5wdHIgKyBpKnN0ZXApKVtqXSApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl84UzogaWYoICFmbXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIiU1ZCI7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB3OyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggb3V0LCBmbXQsICgoY2hhciopKGRhdGEucHRyICsgaSpzdGVwKSlbal0gKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMTZTOiBpZiggIWZtdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmbXQgPSAiJTdkIjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHc7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBvdXQsIGZtdCwgKChzaG9ydCopKGRhdGEucHRyICsgaSpzdGVwKSlbal0gKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMzJTOiBpZiggIWZtdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmbXQgPSAiICUwOHgiOworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgdzsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIG91dCwgZm10LCAoKGludCopKGRhdGEucHRyICsgaSpzdGVwKSlbal0gKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMzJGOiBpZiggIWZtdCApCisgICAgICAgICAgICAgICAgICAgICAgICBmbXQgPSAiJTE1ZyI7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB3OyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50Ziggb3V0LCBmbXQsICgoZmxvYXQqKShkYXRhLnB0ciArIGkqc3RlcCkpW2pdICk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWXzY0RjogaWYoICFmbXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgZm10ID0gIiUxNWciOworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgdzsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIG91dCwgZm10LCAoKGRvdWJsZSopKGRhdGEucHRyICsgaSpzdGVwKSlbal0gKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZnByaW50Ziggb3V0LCAiXG4lcyIsIGkgPCByb3dzIC0gMSA/ICJcdCIgOiAiIiApOworICAgIH0KKyAgICBmcHJpbnRmKCBvdXQsICJcbiIgKTsKK30KKworI2VuZGlmIC8qIF9NU0NfVkVSIHx8IF9fQk9STEFORENfXyAqLworCisvKiBFbmQgb2YgZmlsZS4gKi8KKworCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3Ztb3JwaGNvbnRvdXJzLmNwcCBiL2N2YXV4L3NyYy9jdm1vcnBoY29udG91cnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMzQyOTEKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3Ztb3JwaGNvbnRvdXJzLmNwcApAQCAtMCwwICsxLDg1NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2RlZmluZSBQQVRIX1RPX0UgICAgICAgMQorI2RlZmluZSBQQVRIX1RPX1NFICAgICAgMgorI2RlZmluZSBQQVRIX1RPX1MgICAgICAgMworCisjZGVmaW5lIEtfUyAgICAgICAgIDIKKyNkZWZpbmUgRV9TICAgICAgICAgMgorI2RlZmluZSBDX1MgICAgICAgICAuMDEKKyNkZWZpbmUgS19aICAgICAgICAgNTAwMAorI2RlZmluZSBLX05NICAgICAgICA1MDAwMAorI2RlZmluZSBLX0IgICAgICAgICA0MAorI2RlZmluZSBOVUxMX0VER0UgICAwLjAwMWYKKyNkZWZpbmUgaW5mICAgICAgICAgREJMX01BWAorCit0eXBlZGVmIHN0cnVjdCBfX0N2V29yaworeworICAgIGRvdWJsZSB3X2Vhc3Q7CisgICAgZG91YmxlIHdfc291dGhlYXN0OworICAgIGRvdWJsZSB3X3NvdXRoOworICAgIGNoYXIgcGF0aF9lOworICAgIGNoYXIgcGF0aF9zZTsKKyAgICBjaGFyIHBhdGhfczsKK31fQ3ZXb3JrOworCisKK2RvdWJsZSBfY3ZCZW5kaW5nV29yayggIEN2UG9pbnQyRDMyZiogQjAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIEYwLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBCMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogRjEvKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQqIEsgKi8pOworCitkb3VibGUgX2N2U3RyZXRjaGluZ1dvcmsoQ3ZQb2ludDJEMzJmKiBQMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIFAyKTsKKwordm9pZCBfY3ZXb3JrRWFzdCAgICAgKGludCBpLCBpbnQgaiwgX0N2V29yayoqIFcsIEN2UG9pbnQyRDMyZiogZWRnZXMxLCBDdlBvaW50MkQzMmYqIGVkZ2VzMik7Cit2b2lkIF9jdldvcmtTb3V0aEVhc3QoaW50IGksIGludCBqLCBfQ3ZXb3JrKiogVywgQ3ZQb2ludDJEMzJmKiBlZGdlczEsIEN2UG9pbnQyRDMyZiogZWRnZXMyKTsKK3ZvaWQgX2N2V29ya1NvdXRoICAgIChpbnQgaSwgaW50IGosIF9DdldvcmsqKiBXLCBDdlBvaW50MkQzMmYqIGVkZ2VzMSwgQ3ZQb2ludDJEMzJmKiBlZGdlczIpOworCitzdGF0aWMgQ3ZQb2ludDJEMzJmIG51bGxfZWRnZSA9IHswLDB9OworCitkb3VibGUgX2N2U3RyZXRjaGluZ1dvcmsoQ3ZQb2ludDJEMzJmKiBQMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIFAyKQoreworICAgIGRvdWJsZSBMMSxMMiwgTF9taW4sIGRMOworCisgICAgTDEgPSBzcXJ0KCAoZG91YmxlKVAxLT54KlAxLT54ICsgUDEtPnkqUDEtPnkpOworICAgIEwyID0gc3FydCggKGRvdWJsZSlQMi0+eCpQMi0+eCArIFAyLT55KlAyLT55KTsKKyAgICAKKyAgICBMX21pbiA9IE1JTihMMSwgTDIpOworICAgIGRMID0gZmFicyggTDEgLSBMMiApOworCisgICAgcmV0dXJuIEtfUyAqIHBvdyggZEwsIEVfUyApIC8gKCBMX21pbiArIENfUypkTCApOworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworZG91YmxlIF9jdkJlbmRpbmdXb3JrKCAgQ3ZQb2ludDJEMzJmKiBCMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiogRjAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50MkQzMmYqIEIxLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludDJEMzJmKiBGMS8qLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCogSyovKQoreworICAgIEN2UG9pbnQyRDMyZiBRKCBDdlBvaW50MkQzMmYgcTAsIEN2UG9pbnQyRDMyZiBxMSwgQ3ZQb2ludDJEMzJmIHEyLCBkb3VibGUgdCApOworICAgIGRvdWJsZSBhbmdsZSggQ3ZQb2ludDJEMzJmIEEsIEN2UG9pbnQyRDMyZiBCICk7CisKKyAgICBDdlBvaW50MkQzMmYgUTAsIFExLCBRMjsKKyAgICBDdlBvaW50MkQzMmYgUTFfbm0gPSB7IDAsIDAgfSwgUTJfbm0gPSB7IDAsIDAgfTsKKyAgICBkb3VibGUgZDAsIGQxLCBkMiwgZGVzLCB0X3plcm87CisgICAgZG91YmxlIGtfemVybywga19ub25tb247CisgICAgQ3ZQb2ludDJEMzJmIGNlbnRlcjsKKyAgICBkb3VibGUgY2hlY2swMSwgY2hlY2swMjsKKyAgICBjaGFyIGNoZWNrX29yaWdpbjsKKyAgICBkb3VibGUgZF9hbmdsZSwgZF9ubV9hbmdsZTsKKy8qCisgICAgaWYoIChCMC0+eD09MCkgJiYgKEIwLT55PT0wKSApCisgICAgeworICAgICAgICBpZiggKEYwLT54PT0wKSAmJiAoRjAtPnk9PTApICkKKyAgICAgICAgeworICAgICAgICAgICAgQjEtPnggPSAtQjEtPng7CisgICAgICAgICAgICBCMS0+eSA9IC1CMS0+eTsKKworICAgICAgICAgICAgZF9hbmdsZSA9IGFjb3MoIChCMS0+eCpGMS0+eCArIEIxLT55KkYxLT55KS9zcXJ0KCAoQjEtPngqQjEtPnggKyBCMS0+eSpCMS0+eSkqKEYxLT54KkYxLT54ICsgRjEtPnkqRjEtPnkpICkgKTsKKyAgICAgICAgICAgIGRfYW5nbGUgPSBDVl9QSSAtIGRfYW5nbGU7CisKKyAgICAgICAgICAgIEIxLT54ID0gLUIxLT54OworICAgICAgICAgICAgQjEtPnkgPSAtQjEtPnk7CisKKyAgICAgICAgICAgIC8vcmV0dXJuIGRfYW5nbGUqS19COworICAgICAgICAgICAgcmV0dXJuIDEwMDsKKyAgICAgICAgfQorICAgICAgICBLLT54ID0gLUstPng7CisgICAgICAgIEstPnkgPSAtSy0+eTsKKyAgICAgICAgQjEtPnggPSAtQjEtPng7CisgICAgICAgIEIxLT55ID0gLUIxLT55OworCisgICAgICAgIGRfYW5nbGUgPSBhY29zKCAoQjEtPngqRjEtPnggKyBCMS0+eSpGMS0+eSkvc3FydCggKEIxLT54KkIxLT54ICsgQjEtPnkqQjEtPnkpKihGMS0+eCpGMS0+eCArIEYxLT55KkYxLT55KSApICk7CisgICAgICAgIGRfYW5nbGUgPSBkX2FuZ2xlIC0gYWNvcyggKEYwLT54KkstPnggKyBGMC0+eSpLLT55KS9zcXJ0KCAoRjAtPngqRjAtPnggKyBGMC0+eSpGMC0+eSkqKEstPngqSy0+eCArIEstPnkqSy0+eSkgKSApOworICAgICAgICBkX2FuZ2xlID0gZF9hbmdsZSAtIENWX1BJKjAuNTsKKyAgICAgICAgZF9hbmdsZSA9IGZhYnMoZF9hbmdsZSk7CisKKyAgICAgICAgCisgICAgICAgIEstPnggPSAtSy0+eDsKKyAgICAgICAgSy0+eSA9IC1LLT55OworICAgICAgICBCMS0+eCA9IC1CMS0+eDsKKyAgICAgICAgQjEtPnkgPSAtQjEtPnk7CisKKyAgICAgICAgLy9yZXR1cm4gZF9hbmdsZSpLX0I7CisgICAgICAgIHJldHVybiAxMDA7CisgICAgfQorCisKKyAgICBpZiggKEYwLT54PT0wKSAmJiAoRjAtPnk9PTApICkKKyAgICAgICAgeworICAgICAgICAgICAgSy0+eCA9IC1LLT54OworICAgICAgICAgICAgSy0+eSA9IC1LLT55OworICAgICAgICAgICAgQjEtPnggPSAtQjEtPng7CisgICAgICAgICAgICBCMS0+eSA9IC1CMS0+eTsKKworICAgICAgICAgICAgZF9hbmdsZSA9IGFjb3MoIChCMS0+eCpGMS0+eCArIEIxLT55KkYxLT55KS9zcXJ0KCAoQjEtPngqQjEtPnggKyBCMS0+eSpCMS0+eSkqKEYxLT54KkYxLT54ICsgRjEtPnkqRjEtPnkpICkgKTsKKyAgICAgICAgICAgIGRfYW5nbGUgPSBkX2FuZ2xlIC0gYWNvcyggKEIwLT54KkstPnggKyBCMC0+eSpLLT55KS9zcXJ0KCAoQjAtPngqQjAtPnggKyBCMC0+eSpCMC0+eSkqKEstPngqSy0+eCArIEstPnkqSy0+eSkgKSApOworICAgICAgICAgICAgZF9hbmdsZSA9IGRfYW5nbGUgLSBDVl9QSSowLjU7CisgICAgICAgICAgICBkX2FuZ2xlID0gZmFicyhkX2FuZ2xlKTsKKworICAgICAgICAgICAgSy0+eCA9IC1LLT54OworICAgICAgICAgICAgSy0+eSA9IC1LLT55OworICAgICAgICAgICAgQjEtPnggPSAtQjEtPng7CisgICAgICAgICAgICBCMS0+eSA9IC1CMS0+eTsKKworICAgICAgICAgICAgLy9yZXR1cm4gZF9hbmdsZSpLX0I7CisgICAgICAgICAgICByZXR1cm4gMTAwOworICAgICAgICB9CisvLy8vLy8vLy8vLy8vLy8KKworICAgIGlmKCAoQjEtPng9PTApICYmIChCMS0+eT09MCkgKQorICAgIHsKKyAgICAgICAgaWYoIChGMS0+eD09MCkgJiYgKEYxLT55PT0wKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEIwLT54ID0gLUIwLT54OworICAgICAgICAgICAgQjAtPnkgPSAtQjAtPnk7CisKKyAgICAgICAgICAgIGRfYW5nbGUgPSBhY29zKCAoQjAtPngqRjAtPnggKyBCMC0+eSpGMC0+eSkvc3FydCggKEIwLT54KkIwLT54ICsgQjAtPnkqQjAtPnkpKihGMC0+eCpGMC0+eCArIEYwLT55KkYwLT55KSApICk7CisgICAgICAgICAgICBkX2FuZ2xlID0gQ1ZfUEkgLSBkX2FuZ2xlOworCisgICAgICAgICAgICBCMC0+eCA9IC1CMC0+eDsKKyAgICAgICAgICAgIEIwLT55ID0gLUIwLT55OworCisgICAgICAgICAgICAvL3JldHVybiBkX2FuZ2xlKktfQjsKKyAgICAgICAgICAgIHJldHVybiAxMDA7CisgICAgICAgIH0KKyAgICAgICAgSy0+eCA9IC1LLT54OworICAgICAgICBLLT55ID0gLUstPnk7CisgICAgICAgIEIwLT54ID0gLUIwLT54OworICAgICAgICBCMC0+eSA9IC1CMC0+eTsKKworICAgICAgICBkX2FuZ2xlID0gYWNvcyggKEIwLT54KkYwLT54ICsgQjAtPnkqRjAtPnkpL3NxcnQoIChCMC0+eCpCMC0+eCArIEIwLT55KkIwLT55KSooRjAtPngqRjAtPnggKyBGMC0+eSpGMC0+eSkgKSApOworICAgICAgICBkX2FuZ2xlID0gZF9hbmdsZSAtIGFjb3MoIChGMS0+eCpLLT54ICsgRjEtPnkqSy0+eSkvc3FydCggKEYxLT54KkYxLT54ICsgRjEtPnkqRjEtPnkpKihLLT54KkstPnggKyBLLT55KkstPnkpICkgKTsKKyAgICAgICAgZF9hbmdsZSA9IGRfYW5nbGUgLSBDVl9QSSowLjU7CisgICAgICAgIGRfYW5nbGUgPSBmYWJzKGRfYW5nbGUpOworCisgICAgICAgIEstPnggPSAtSy0+eDsKKyAgICAgICAgSy0+eSA9IC1LLT55OworICAgICAgICBCMC0+eCA9IC1CMC0+eDsKKyAgICAgICAgQjAtPnkgPSAtQjAtPnk7CisKKyAgICAgICAgLy9yZXR1cm4gZF9hbmdsZSpLX0I7CisgICAgICAgIHJldHVybiAxMDA7CisgICAgfQorCisKKyAgICBpZiggKEYxLT54PT0wKSAmJiAoRjEtPnk9PTApICkKKyAgICAgICAgeworICAgICAgICAgICAgSy0+eCA9IC1LLT54OworICAgICAgICAgICAgSy0+eSA9IC1LLT55OworICAgICAgICAgICAgQjAtPnggPSAtQjAtPng7CisgICAgICAgICAgICBCMC0+eSA9IC1CMC0+eTsKKworICAgICAgICAgICAgZF9hbmdsZSA9IGFjb3MoIChCMC0+eCpGMC0+eCArIEIwLT55KkYwLT55KS9zcXJ0KCAoQjAtPngqQjAtPnggKyBCMC0+eSpCMC0+eSkqKEYwLT54KkYwLT54ICsgRjAtPnkqRjAtPnkpICkgKTsKKyAgICAgICAgICAgIGRfYW5nbGUgPSBkX2FuZ2xlIC0gYWNvcyggKEIxLT54KkstPnggKyBCMS0+eSpLLT55KS9zcXJ0KCAoQjEtPngqQjEtPnggKyBCMS0+eSpCMS0+eSkqKEstPngqSy0+eCArIEstPnkqSy0+eSkgKSApOworICAgICAgICAgICAgZF9hbmdsZSA9IGRfYW5nbGUgLSBDVl9QSSowLjU7CisgICAgICAgICAgICBkX2FuZ2xlID0gZmFicyhkX2FuZ2xlKTsKKworICAgICAgICAgICAgSy0+eCAgPSAtSy0+eDsKKyAgICAgICAgICAgIEstPnkgID0gLUstPnk7CisgICAgICAgICAgICBCMC0+eCA9IC1CMC0+eDsKKyAgICAgICAgICAgIEIwLT55ID0gLUIwLT55OworCisgICAgICAgICAgICAvL3JldHVybiBkX2FuZ2xlKktfQjsKKyAgICAgICAgICAgIHJldHVybiAxMDA7CisgICAgICAgIH0KKworKi8KKworLyoKKyAgICBCMC0+eCA9IC1CMC0+eDsKKyAgICBCMC0+eSA9IC1CMC0+eTsKKyAgICBCMS0+eCA9IC1CMS0+eDsKKyAgICBCMS0+eSA9IC1CMS0+eTsKKyovCisgICAgUTAueCA9IEYwLT54ICogKC1CMC0+eCkgKyBGMC0+eSAqICgtQjAtPnkpOworICAgIFEwLnkgPSBGMC0+eCAqICgtQjAtPnkpIC0gRjAtPnkgKiAoLUIwLT54KTsKKworICAgIFExLnggPSAwLjVmKiggKEYxLT54ICogKC1CMC0+eCkgKyBGMS0+eSAqICgtQjAtPnkpKSArIChGMC0+eCAqICgtQjEtPngpICsgRjAtPnkgKiAoLUIxLT55KSkgKTsKKyAgICBRMS55ID0gMC41ZiooIChGMS0+eCAqICgtQjAtPnkpIC0gRjEtPnkgKiAoLUIwLT54KSkgKyAoRjAtPnggKiAoLUIxLT55KSAtIEYwLT55ICogKC1CMS0+eCkpICk7CisKKyAgICBRMi54ID0gRjEtPnggKiAoLUIxLT54KSArIEYxLT55ICogKC1CMS0+eSk7CisgICAgUTIueSA9IEYxLT54ICogKC1CMS0+eSkgLSBGMS0+eSAqICgtQjEtPngpOworCisgICAgZDAgPSBRMC54ICogUTEueSAtIFEwLnkgKiBRMS54OworICAgIGQxID0gMC41ZiooUTAueCAqIFEyLnkgLSBRMC55ICogUTIueCk7CisgICAgZDIgPSBRMS54ICogUTIueSAtIFExLnkgKiBRMi54OworCisgICAgLy8gQ2hlY2sgYW5nbGVzIGdvZXMgdG8gemVybworICAgIGRlcyA9IFExLnkqUTEueSAtIFEwLnkqUTIueTsKKworICAgIGtfemVybyA9IDA7CisKKyAgICBpZiggZGVzID49IDAgKQorICAgIHsKKyAgICAgICAgdF96ZXJvID0gKCBRMC55IC0gUTEueSArIHNxcnQoZGVzKSApLyggUTAueSAtIDIqUTEueSArIFEyLnkgKTsKKworICAgICAgICBpZiggKDAgPCB0X3plcm8pICYmICh0X3plcm8gPCAxKSAmJiAoIFEoUTAsIFExLCBRMiwgdF96ZXJvKS54ID4gMCApICkKKyAgICAgICAgeworICAgICAgICAgICAga196ZXJvID0gaW5mOworICAgICAgICB9CisKKyAgICAgICAgdF96ZXJvID0gKCBRMC55IC0gUTEueSAtIHNxcnQoZGVzKSApLyggUTAueSAtIDIqUTEueSArIFEyLnkgKTsKKworICAgICAgICBpZiggKDAgPCB0X3plcm8pICYmICh0X3plcm8gPCAxKSAmJiAoIFEoUTAsIFExLCBRMiwgdF96ZXJvKS54ID4gMCApICkKKyAgICAgICAgeworICAgICAgICAgICAga196ZXJvID0gaW5mOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2hlY2sgbm9ubW9ub3RvbmljCisgICAgZGVzID0gZDEqZDEgLSBkMCpkMjsKKworICAgIGtfbm9ubW9uID0gMDsKKworICAgIGlmKCBkZXMgPj0gMCApCisgICAgeworICAgICAgICB0X3plcm8gPSAoIGQwIC0gZDEgLSBzcXJ0KGRlcykgKS8oIGQwIC0gMipkMSArIGQyICk7CisKKyAgICAgICAgaWYoICgwIDwgdF96ZXJvKSAmJiAodF96ZXJvIDwgMSkgKQorICAgICAgICB7CisgICAgICAgICAgICBrX25vbm1vbiA9IDE7CisgICAgICAgICAgICBRMV9ubSA9IFEoUTAsIFExLCBRMiwgdF96ZXJvKTsKKyAgICAgICAgfQorCisgICAgICAgIHRfemVybyA9ICggZDAgLSBkMSArIHNxcnQoZGVzKSApLyggZDAgLSAyKmQxICsgZDIgKTsKKworICAgICAgICBpZiggKDAgPCB0X3plcm8pICYmICh0X3plcm8gPCAxKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGtfbm9ubW9uICs9IDI7CisgICAgICAgICAgICBRMl9ubSA9IFEoUTAsIFExLCBRMiwgdF96ZXJvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZpbmRlIG9yaWdpbiBsaWUgaW4gUTBRMVEyCisgICAgY2hlY2tfb3JpZ2luID0gMTsKKworICAgIGNlbnRlci54ID0gKFEwLnggKyBRMS54ICsgUTIueCkvMzsKKyAgICBjZW50ZXIueSA9IChRMC55ICsgUTEueSArIFEyLnkpLzM7CisKKyAgICBjaGVjazAxID0gKGNlbnRlci54IC0gUTAueCkqKFExLnkgLSBRMC55KSArIChjZW50ZXIueSAtIFEwLnkpKihRMS54IC0gUTAueCk7CisgICAgY2hlY2swMiA9ICgtUTAueCkqKFExLnkgLSBRMC55KSArICgtUTAueSkqKFExLnggLSBRMC54KTsKKyAgICBpZiggY2hlY2swMSpjaGVjazAyID4gMCApCisgICAgeworICAgICAgICBjaGVjazAxID0gKGNlbnRlci54IC0gUTEueCkqKFEyLnkgLSBRMS55KSArIChjZW50ZXIueSAtIFExLnkpKihRMi54IC0gUTEueCk7CisgICAgICAgIGNoZWNrMDIgPSAoLVExLngpKihRMi55IC0gUTEueSkgKyAoLVExLnkpKihRMi54IC0gUTEueCk7CisgICAgICAgIGlmKCBjaGVjazAxKmNoZWNrMDIgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hlY2swMSA9IChjZW50ZXIueCAtIFEyLngpKihRMC55IC0gUTIueSkgKyAoY2VudGVyLnkgLSBRMi55KSooUTAueCAtIFEyLngpOworICAgICAgICAgICAgY2hlY2swMiA9ICgtUTIueCkqKFEwLnkgLSBRMi55KSArICgtUTIueSkqKFEwLnggLSBRMi54KTsKKyAgICAgICAgICAgIGlmKCBjaGVjazAxKmNoZWNrMDIgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGVja19vcmlnaW4gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsY3VsYXRlIGFuZ2xlCisgICAgZF9ubV9hbmdsZSA9IDA7CisgICAgZF9hbmdsZSA9IGFuZ2xlKFEwLFEyKTsKKyAgICBpZigga19ub25tb24gPT0gMCApCisgICAgeworICAgICAgICBpZiggY2hlY2tfb3JpZ2luID09IDAgKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkX2FuZ2xlID0gMipDVl9QSSAtIGRfYW5nbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIGtfbm9ubW9uID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBkX25tX2FuZ2xlID0gYW5nbGUoUTAsUTFfbm0pOworICAgICAgICAgICAgaWYoZF9ubV9hbmdsZSA+IGRfYW5nbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZF9ubV9hbmdsZSA9IGRfbm1fYW5nbGUgLSBkX2FuZ2xlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGtfbm9ubW9uID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBkX25tX2FuZ2xlID0gYW5nbGUoUTAsUTJfbm0pOworICAgICAgICAgICAgaWYoZF9ubV9hbmdsZSA+IGRfYW5nbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZF9ubV9hbmdsZSA9IGRfbm1fYW5nbGUgLSBkX2FuZ2xlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGtfbm9ubW9uID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBkX25tX2FuZ2xlID0gYW5nbGUoUTAsUTFfbm0pOworICAgICAgICAgICAgaWYoZF9ubV9hbmdsZSA+IGRfYW5nbGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZF9ubV9hbmdsZSA9IGRfbm1fYW5nbGUgLSBkX2FuZ2xlOworICAgICAgICAgICAgICAgIGRfbm1fYW5nbGUgPSBkX25tX2FuZ2xlICsgYW5nbGUoUTAsIFEyX25tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkX25tX2FuZ2xlID0gZF9ubV9hbmdsZSArIGFuZ2xlKFEyLFEyX25tKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKy8qCisgICAgQjAtPnggPSAtQjAtPng7CisgICAgQjAtPnkgPSAtQjAtPnk7CisgICAgQjEtPnggPSAtQjEtPng7CisgICAgQjEtPnkgPSAtQjEtPnk7CisqLworICAgIHJldHVybiBkX2FuZ2xlKktfQiArIGRfbm1fYW5nbGUqS19OTSArIGtfemVybypLX1o7CisgICAgLy9yZXR1cm4gMDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK3ZvaWQgX2N2V29ya0Vhc3QoaW50IGksIGludCBqLCBfQ3ZXb3JrKiogVywgQ3ZQb2ludDJEMzJmKiBlZGdlczEsIEN2UG9pbnQyRDMyZiogZWRnZXMyKQoreworICAgIGRvdWJsZSB3MSx3MjsKKyAgICBDdlBvaW50MkQzMmYgc21hbGxfZWRnZTsKKworICAgIC8vV1tpLGpdLndfZWFzdAorICAgIHcxID0gV1tpLTFdW2pdLndfZWFzdCAvKisgX2N2QmVuZGluZ1dvcmsoICAgJmVkZ2VzMVtpLTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMxW2ktMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudWxsX2VkZ2UgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVsbF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSovOworCisgICAgc21hbGxfZWRnZS54ID0gTlVMTF9FREdFKmVkZ2VzMVtpLTFdLng7CisgICAgc21hbGxfZWRnZS55ID0gTlVMTF9FREdFKmVkZ2VzMVtpLTFdLnk7CisKKyAgICB3MiA9IFdbaS0xXVtqXS53X3NvdXRoZWFzdCArIF9jdkJlbmRpbmdXb3JrKCZlZGdlczFbaS0yXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczFbaS0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczJbai0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qJm51bGxfZWRnZSovJnNtYWxsX2VkZ2UvKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczJbal0qLyk7CisKKyAgICBpZih3MTx3MikKKyAgICB7CisgICAgICAgIFdbaV1bal0ud19lYXN0ID0gdzEgKyBfY3ZTdHJldGNoaW5nV29yayggJmVkZ2VzMVtpLTFdLCAmbnVsbF9lZGdlICk7CisgICAgICAgIFdbaV1bal0ucGF0aF9lID0gUEFUSF9UT19FOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBXW2ldW2pdLndfZWFzdCA9IHcyICsgX2N2U3RyZXRjaGluZ1dvcmsoICZlZGdlczFbaS0xXSwgJm51bGxfZWRnZSApOworICAgICAgICBXW2ldW2pdLnBhdGhfZSA9IFBBVEhfVE9fU0U7CisgICAgfQorfQorCisKKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwordm9pZCBfY3ZXb3JrU291dGhFYXN0KGludCBpLCBpbnQgaiwgX0N2V29yayoqIFcsIEN2UG9pbnQyRDMyZiogZWRnZXMxLCBDdlBvaW50MkQzMmYqIGVkZ2VzMikKK3sKKyAgICBkb3VibGUgdzEsdzIsdzM7CisgICAgQ3ZQb2ludDJEMzJmIHNtYWxsX2VkZ2U7CisKKyAgICAvL1dbaSxqXS53X3NvdXRoZWFzdAorICAgIHNtYWxsX2VkZ2UueCA9IE5VTExfRURHRSplZGdlczFbaS0yXS54OworICAgIHNtYWxsX2VkZ2UueSA9IE5VTExfRURHRSplZGdlczFbaS0yXS55OworCisgICAgdzEgPSBXW2ktMV1bai0xXS53X2Vhc3QgKyBfY3ZCZW5kaW5nV29yaygmZWRnZXMxW2ktMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczFbaS0xXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qJm51bGxfZWRnZSovJnNtYWxsX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczJbai0xXS8qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMyW2otMl0qLyk7CisKKyAgICB3MiA9IFdbaS0xXVtqLTFdLndfc291dGhlYXN0ICsgX2N2QmVuZGluZ1dvcmsoICAmZWRnZXMxW2ktMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVkZ2VzMVtpLTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczJbai0yXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMyW2otMV0vKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKi8pOworCisgICAgc21hbGxfZWRnZS54ID0gTlVMTF9FREdFKmVkZ2VzMltqLTJdLng7CisgICAgc21hbGxfZWRnZS55ID0gTlVMTF9FREdFKmVkZ2VzMltqLTJdLnk7CisKKyAgICB3MyA9IFdbaS0xXVtqLTFdLndfc291dGggKyBfY3ZCZW5kaW5nV29yayggIC8qJm51bGxfZWRnZSovJnNtYWxsX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMxW2ktMV0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVkZ2VzMltqLTJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVkZ2VzMltqLTFdLyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMxW2ktMl0qLyk7CisKKyAgICBpZiggdzE8dzIgKQorICAgIHsKKyAgICAgICAgaWYodzE8dzMpCisgICAgICAgIHsKKyAgICAgICAgICAgIFdbaV1bal0ud19zb3V0aGVhc3QgPSB3MSArIF9jdlN0cmV0Y2hpbmdXb3JrKCAmZWRnZXMxW2ktMV0sICZlZGdlczJbai0xXSApOworICAgICAgICAgICAgV1tpXVtqXS5wYXRoX3NlID0gUEFUSF9UT19FOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV1tpXVtqXS53X3NvdXRoZWFzdCA9IHczICsgX2N2U3RyZXRjaGluZ1dvcmsoICZlZGdlczFbaS0xXSwgJmVkZ2VzMltqLTFdICk7CisgICAgICAgICAgICBXW2ldW2pdLnBhdGhfc2UgPSAzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCB3Mjx3MykKKyAgICAgICAgeworICAgICAgICAgICAgV1tpXVtqXS53X3NvdXRoZWFzdCA9IHcyICsgX2N2U3RyZXRjaGluZ1dvcmsoICZlZGdlczFbaS0xXSwgJmVkZ2VzMltqLTFdICk7CisgICAgICAgICAgICBXW2ldW2pdLnBhdGhfc2UgPSBQQVRIX1RPX1NFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgV1tpXVtqXS53X3NvdXRoZWFzdCA9IHczICsgX2N2U3RyZXRjaGluZ1dvcmsoICZlZGdlczFbaS0xXSwgJmVkZ2VzMltqLTFdICk7CisgICAgICAgICAgICBXW2ldW2pdLnBhdGhfc2UgPSAzOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCit2b2lkIF9jdldvcmtTb3V0aChpbnQgaSwgaW50IGosIF9DdldvcmsqKiBXLCBDdlBvaW50MkQzMmYqIGVkZ2VzMSwgQ3ZQb2ludDJEMzJmKiBlZGdlczIpCit7CisgICAgZG91YmxlIHcxLHcyOworICAgIEN2UG9pbnQyRDMyZiBzbWFsbF9lZGdlOworCisgICAgLy9XW2ksal0ud19zb3V0aAorCisgICAgc21hbGxfZWRnZS54ID0gTlVMTF9FREdFKmVkZ2VzMltqLTFdLng7CisgICAgc21hbGxfZWRnZS55ID0gTlVMTF9FREdFKmVkZ2VzMltqLTFdLnk7CisKKyAgICB3MSA9IFdbaV1bai0xXS53X3NvdXRoZWFzdCArIF9jdkJlbmRpbmdXb3JrKCZlZGdlczFbaS0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qJm51bGxfZWRnZSovJnNtYWxsX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMyW2otMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMyW2otMV0vKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczFbaV0qLyk7CisKKyAgICB3MiA9IFdbaV1bai0xXS53X3NvdXRoIC8qKyBfY3ZCZW5kaW5nV29yayggICZudWxsX2VkZ2UgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVsbF9lZGdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZWRnZXMyW2otMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlZGdlczJbai0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCkqLzsKKworICAgIGlmKCB3MTx3MiApCisgICAgeworICAgICAgICBXW2ldW2pdLndfc291dGggPSB3MSArIF9jdlN0cmV0Y2hpbmdXb3JrKCAmbnVsbF9lZGdlLCAmZWRnZXMyW2otMV0gKTsKKyAgICAgICAgV1tpXVtqXS5wYXRoX3MgPSBQQVRIX1RPX1NFOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBXW2ldW2pdLndfc291dGggPSB3MiArIF9jdlN0cmV0Y2hpbmdXb3JrKCAmbnVsbF9lZGdlLCAmZWRnZXMyW2otMV0gKTsKKyAgICAgICAgV1tpXVtqXS5wYXRoX3MgPSAzOworICAgIH0KK30KKworLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0N2UG9pbnQyRDMyZiBRKEN2UG9pbnQyRDMyZiBxMCxDdlBvaW50MkQzMmYgcTEsQ3ZQb2ludDJEMzJmIHEyLGRvdWJsZSB0KQoreworICAgIEN2UG9pbnQyRDMyZiBxOworCisgICAgcS54ID0gKGZsb2F0KShxMC54KigxLXQpKigxLXQpICsgMipxMS54KnQqKDEtdCkgKyBxMi54KnQqdCk7CisgICAgcS55ID0gKGZsb2F0KShxMC55KigxLXQpKigxLXQpICsgMipxMS55KnQqKDEtdCkgKyBxMi55KnQqdCk7CisKKyAgICByZXR1cm4gcTsgICAgICAgCit9CisKK2RvdWJsZSBhbmdsZShDdlBvaW50MkQzMmYgQSwgQ3ZQb2ludDJEMzJmIEIpCit7CisgICAgcmV0dXJuIGFjb3MoIChBLngqQi54ICsgQS55KkIueSkvc3FydCggKGRvdWJsZSkoQS54KkEueCArIEEueSpBLnkpKihCLngqQi54ICsgQi55KkIueSkgKSApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKgorKiAgIFRoaXMgZnVuY3Rpb24gY29tcHV0ZSBpbnRlcm1lZGlhdGUgcG9seWdvbiBiZXR3ZWVuIGNvbnRvdXIxIGFuZCBjb250b3VyMgorKgorKiAgIENvcnJlc3BvbmRlbmNlIGJldHdlZW4gcG9pbnRzIG9mIGNvbnRvdXJzIHNwZWNpZnkgYnkgY29ycgorKgorKiAgIHBhcmFtID0gWzAsMV07ICAwIGNvcnJlc3BvbmRlbmNlIHRvIGNvbnRvdXIxLCAxIC0gY29udG91cjIKKyoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitDdlNlcSogaWN2QmxlbmRDb250b3VycyhDdlNlcSogY29udG91cjEsIAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGNvbnRvdXIyLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTZXEqIGNvcnIsCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UpCit7CisgICAgaW50IGo7CisgICAgCisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyMDE7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyMDE7CisKKyAgICBpbnQgTmksTmo7ICAgICAgICAgICAgICAvLyBzaXplIG9mIGNvbnRvdXJzCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgLy8gY291bnRlcgorCisgICAgQ3ZQb2ludCogcG9pbnQxOyAgICAgICAgLy8gYXJyYXkgb2YgZmlyc3QgY29udG91ciBwb2ludAorICAgIEN2UG9pbnQqIHBvaW50MjsgICAgICAgIC8vIGFycmF5IG9mIHNlY29uZCBjb250b3VyIHBvaW50CisKKyAgICBDdlBvaW50IHBvaW50X291dHB1dDsgICAvLyBpbnRlcm1lZGlhdGUgc3RvcmFnZSBvZiBvdXB1dCBwb2ludAorCisgICAgaW50IGNvcnJfcG9pbnQ7CisKKyAgICAvLyBDcmVhdGUgb3V0cHV0IHNlcXVlbmNlLgorICAgIEN2U2VxKiBvdXRwdXQgPSBjdkNyZWF0ZVNlcSgwLCAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2U2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2UG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlICk7CisKKyAgICAvLyBGaW5kIHNpemUgb2YgY29udG91cnMuCisgICAgTmkgPSBjb250b3VyMS0+dG90YWwgKyAxOworICAgIE5qID0gY29udG91cjItPnRvdGFsICsgMTsKKworICAgIHBvaW50MSA9IChDdlBvaW50KiApbWFsbG9jKCBOaSpzaXplb2YoQ3ZQb2ludCkgKTsKKyAgICBwb2ludDIgPSAoQ3ZQb2ludCogKW1hbGxvYyggTmoqc2l6ZW9mKEN2UG9pbnQpICk7CisKKyAgICAvLyBJbml0aWFsaXplIGFycmF5cyBvZiBwb2ludCAKKyAgICBjdkN2dFNlcVRvQXJyYXkoIGNvbnRvdXIxLCBwb2ludDEsIENWX1dIT0xFX1NFUSApOworICAgIGN2Q3Z0U2VxVG9BcnJheSggY29udG91cjIsIHBvaW50MiwgQ1ZfV0hPTEVfU0VRICk7CisKKyAgICAvLyBGaXJzdCBhbmQgbGFzdCBwb2ludCBtYXN0IGJlIGVxdWFsLgorICAgIHBvaW50MVtOaS0xXSA9IHBvaW50MVswXTsKKyAgICBwb2ludDJbTmotMV0gPSBwb2ludDJbMF07CisKKyAgICAvLyBJbml0aWFsaXplcyBwcm9jZXNzIG9mIHdyaXRpbmcgdG8gc2VxdWVuY2UuCisgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBvdXRwdXQsICZ3cml0ZXIwMSk7CisKKyAgICBpID0gTmktMTsgLy9jb3JyZXNwb25kZW5jZSB0byBwb2ludHMgb2YgY29udG91cjEKKyAgICBmb3IoIDsgY29ycjsgY29yciA9IGNvcnItPmhfbmV4dCApCisgICAgeyAgICAgICAKKyAgICAgICAgLy9Jbml0aWFsaXplcyBwcm9jZXNzIG9mIHNlcXVlbnRpYWwgcmVhZGluZyBmcm9tIHNlcXVlbmNlCisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBjb3JyLCAmcmVhZGVyMDEsIDAgKTsKKworICAgICAgICBmb3Ioaj0wOyBqIDwgY29yci0+dG90YWw7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgLy8gUmVhZCBlbGVtZW50IGZyb20gc2VxdWVuY2UuCisgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBjb3JyX3BvaW50LCByZWFkZXIwMSApOworCisgICAgICAgICAgICAvLyBDb21wdXRlIHBvaW50IG9mIGludGVybWVkaWF0ZSBwb2x5Z29uLgorICAgICAgICAgICAgcG9pbnRfb3V0cHV0LnggPSBjdlJvdW5kKHBvaW50MVtpXS54ICsgcGFyYW0qKCBwb2ludDJbY29ycl9wb2ludF0ueCAtIHBvaW50MVtpXS54ICkpOworICAgICAgICAgICAgcG9pbnRfb3V0cHV0LnkgPSBjdlJvdW5kKHBvaW50MVtpXS55ICsgcGFyYW0qKCBwb2ludDJbY29ycl9wb2ludF0ueSAtIHBvaW50MVtpXS55ICkpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBXcml0ZSBlbGVtZW50IHRvIHNlcXVlbmNlLgorICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHBvaW50X291dHB1dCwgd3JpdGVyMDEgKTsKKyAgICAgICAgfQorICAgICAgICBpLS07CisgICAgfQorICAgIC8vIFVwZGF0ZXMgc2VxdWVuY2UgaGVhZGVyLgorICAgIGN2Rmx1c2hTZXFXcml0ZXIoICZ3cml0ZXIwMSApOworICAgIAorICAgIHJldHVybiBvdXRwdXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKgorKgorKgorKgorKgorKgorKgorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwordm9pZCBpY3ZDYWxjQ29udG91cnNDb3JyZXNwb25kZW5jZShDdlNlcSogY29udG91cjEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSogY29udG91cjIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSoqIGNvcnIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UpCit7CisgICAgaW50IGksajsgICAgICAgICAgICAgICAgICAgIC8vIGNvdW50ZXIgb2YgY3ljbGVzCisgICAgaW50IE5pLE5qOyAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgY29udG91cnMKKyAgICBfQ3ZXb3JrKiogVzsgICAgICAgICAgICAgICAgLy8gZ3JhcGggZm9yIHNlYXJjaCBtaW5pbXVtIG9mIHdvcmsKKworICAgIEN2UG9pbnQqIHBvaW50MTsgICAgICAgICAgICAvLyBhcnJheSBvZiBmaXJzdCBjb250b3VyIHBvaW50CisgICAgQ3ZQb2ludCogcG9pbnQyOyAgICAgICAgICAgIC8vIGFycmF5IG9mIHNlY29uZCBjb250b3VyIHBvaW50CisgICAgQ3ZQb2ludDJEMzJmKiBlZGdlczE7ICAgICAgIC8vIGFycmF5IG9mIGZpcnN0IGNvbnRvdXIgZWRnZQorICAgIEN2UG9pbnQyRDMyZiogZWRnZXMyOyAgICAgICAvLyBhcnJheSBvZiBzZWNvbmQgY29udG91ciBlZGdlCisKKyAgICAvL0N2UG9pbnQgbnVsbF9lZGdlID0gezAsMH07ICAgIC8vCisgICAgQ3ZQb2ludDJEMzJmIHNtYWxsX2VkZ2U7CisgICAgLy9kb3VibGUgaW5mOyAgICAgICAgICAgICAgICAgICAvLyBpbmZpbml0eQorCisgICAgQ3ZTZXEqIGNvcnIwMTsKKyAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisKKyAgICBjaGFyIHBhdGg7ICAgICAgICAgICAgICAgICAgLy8KKworICAgIC8vIEZpbmQgc2l6ZSBvZiBjb250b3VycworICAgIE5pID0gY29udG91cjEtPnRvdGFsICsgMTsKKyAgICBOaiA9IGNvbnRvdXIyLT50b3RhbCArIDE7CisKKyAgICAvLyBDcmVhdGUgYXJyYXlzCisgICAgVyA9IChfQ3ZXb3JrKiopbWFsbG9jKHNpemVvZihfQ3ZXb3JrKikqTmkpOworICAgIGZvcihpPTA7IGk8Tmk7IGkrKykKKyAgICB7CisgICAgICAgIFdbaV0gPSAoX0N2V29yayopbWFsbG9jKHNpemVvZihfQ3ZXb3JrKSpOaik7CisgICAgfQorCisgICAgcG9pbnQxID0gKEN2UG9pbnQqICltYWxsb2MoIE5pKnNpemVvZihDdlBvaW50KSApOworICAgIHBvaW50MiA9IChDdlBvaW50KiApbWFsbG9jKCBOaipzaXplb2YoQ3ZQb2ludCkgKTsKKyAgICBlZGdlczEgPSAoQ3ZQb2ludDJEMzJmKiApbWFsbG9jKCAoTmktMSkqc2l6ZW9mKEN2UG9pbnQyRDMyZikgKTsKKyAgICBlZGdlczIgPSAoQ3ZQb2ludDJEMzJmKiApbWFsbG9jKCAoTmotMSkqc2l6ZW9mKEN2UG9pbnQyRDMyZikgKTsKKworICAgIC8vIEluaXRpYWxpemUgYXJyYXlzIG9mIHBvaW50IAorICAgIGN2Q3Z0U2VxVG9BcnJheSggY29udG91cjEsIHBvaW50MSwgQ1ZfV0hPTEVfU0VRICk7CisgICAgY3ZDdnRTZXFUb0FycmF5KCBjb250b3VyMiwgcG9pbnQyLCBDVl9XSE9MRV9TRVEgKTsKKworICAgIHBvaW50MVtOaS0xXSA9IHBvaW50MVswXTsKKyAgICBwb2ludDJbTmotMV0gPSBwb2ludDJbMF07CisKKyAgICBmb3IoaT0wO2k8TmktMTtpKyspCisgICAgeworICAgICAgICBlZGdlczFbaV0ueCA9IChmbG9hdCkoIHBvaW50MVtpKzFdLnggLSBwb2ludDFbaV0ueCApOworICAgICAgICBlZGdlczFbaV0ueSA9IChmbG9hdCkoIHBvaW50MVtpKzFdLnkgLSBwb2ludDFbaV0ueSApOworICAgIH07CisKKyAgICBmb3IoaT0wO2k8TmotMTtpKyspCisgICAgeworICAgICAgICBlZGdlczJbaV0ueCA9IChmbG9hdCkoIHBvaW50MltpKzFdLnggLSBwb2ludDJbaV0ueCApOworICAgICAgICBlZGdlczJbaV0ueSA9IChmbG9hdCkoIHBvaW50MltpKzFdLnkgLSBwb2ludDJbaV0ueSApOworICAgIH07CisKKyAgICAvLyBGaW5kIGluZmluaXR5IGNvbnN0YW50IAorICAgIC8vaW5mPTE7CisvLy8vLy8vLy8vLy8vCisKKy8vRmluZCBtaW4gcGF0aCBpbiBncmFwaAorCisvLy8vLy8vLy8vLy8vCisgICAgV1swXVswXS53X2Vhc3QgICAgICA9IDA7CisgICAgV1swXVswXS53X3NvdXRoICAgICA9IDA7CisgICAgV1swXVswXS53X3NvdXRoZWFzdCA9IDA7CisKKyAgICBXWzFdWzFdLndfc291dGhlYXN0ID0gX2N2U3RyZXRjaGluZ1dvcmsoICZlZGdlczFbMF0sICZlZGdlczJbMF0gKTsKKyAgICBXWzFdWzFdLndfZWFzdCA9IGluZjsKKyAgICBXWzFdWzFdLndfc291dGggPSBpbmY7CisgICAgV1sxXVsxXS5wYXRoX3NlID0gUEFUSF9UT19TRTsKKworICAgIFdbMF1bMV0ud19zb3V0aCA9ICBfY3ZTdHJldGNoaW5nV29yayggJm51bGxfZWRnZSwgJmVkZ2VzMlswXSApOworICAgIFdbMF1bMV0ucGF0aF9zID0gMzsKKyAgICBXWzFdWzBdLndfZWFzdCA9ICBfY3ZTdHJldGNoaW5nV29yayggJmVkZ2VzMlswXSwgJm51bGxfZWRnZSApOworICAgIFdbMV1bMF0ucGF0aF9lID0gUEFUSF9UT19FOworCisgICAgZm9yKCBpPTE7IGk8Tmk7IGkrKyApCisgICAgeworICAgICAgICBXW2ldWzBdLndfc291dGggICAgID0gaW5mOworICAgICAgICBXW2ldWzBdLndfc291dGhlYXN0ID0gaW5mOworICAgIH0KKworICAgIGZvcihqPTE7IGo8Tmo7IGorKykKKyAgICB7CisgICAgICAgIFdbMF1bal0ud19lYXN0ICAgICAgPSBpbmY7CisgICAgICAgIFdbMF1bal0ud19zb3V0aGVhc3QgPSBpbmY7CisgICAgfQorCisgICAgZm9yKGk9MjsgaTxOaTsgaSsrKQorICAgIHsKKyAgICAgICAgaj0wOy8vLy8vLy8vLworICAgICAgICBXW2ldW2pdLndfZWFzdCA9IFdbaS0xXVtqXS53X2Vhc3Q7CisgICAgICAgIFdbaV1bal0ud19lYXN0ID0gV1tpXVtqXS53X2Vhc3QgLyorIAorICAgICAgICAgICAgX2N2QmVuZGluZ1dvcmsoICZlZGdlczFbaS0yXSwgJmVkZ2VzMVtpLTFdLCAmbnVsbF9lZGdlLCAmbnVsbF9lZGdlLCBOVUxMICkqLzsKKyAgICAgICAgV1tpXVtqXS53X2Vhc3QgPSBXW2ldW2pdLndfZWFzdCArIF9jdlN0cmV0Y2hpbmdXb3JrKCAmZWRnZXMyW2ktMV0sICZudWxsX2VkZ2UgKTsKKyAgICAgICAgV1tpXVtqXS5wYXRoX2UgPSBQQVRIX1RPX0U7CisgICAgICAgIAorICAgICAgICBqPTE7Ly8vLy8vLy8vLworICAgICAgICBXW2ldW2pdLndfc291dGggPSBpbmY7CisKKyAgICAgICAgX2N2V29ya0Vhc3QgKGksIGosIFcsIGVkZ2VzMSwgZWRnZXMyKTsKKworICAgICAgICBXW2ldW2pdLndfc291dGhlYXN0ID0gV1tpLTFdW2otMV0ud19lYXN0OworICAgICAgICBXW2ldW2pdLndfc291dGhlYXN0ID0gV1tpXVtqXS53X3NvdXRoZWFzdCArIF9jdlN0cmV0Y2hpbmdXb3JrKCAmZWRnZXMxW2ktMV0sICZlZGdlczJbai0xXSApOworCisgICAgICAgIHNtYWxsX2VkZ2UueCA9IE5VTExfRURHRSplZGdlczFbaS0yXS54OworICAgICAgICBzbWFsbF9lZGdlLnkgPSBOVUxMX0VER0UqZWRnZXMxW2ktMl0ueTsKKworICAgICAgICBXW2ldW2pdLndfc291dGhlYXN0ID0gV1tpXVtqXS53X3NvdXRoZWFzdCArIAorICAgICAgICAgICAgX2N2QmVuZGluZ1dvcmsoICZlZGdlczFbaS0yXSwgJmVkZ2VzMVtpLTFdLCAvKiZudWxsX2VkZ2UqLyZzbWFsbF9lZGdlLCAmZWRnZXMyW2otMV0vKiwgJmVkZ2VzMltOai0yXSovKTsKKworICAgICAgICBXW2ldW2pdLnBhdGhfc2UgPSBQQVRIX1RPX0U7CisgICAgfQorCisgICAgZm9yKGo9MjsgajxOajsgaisrKQorICAgIHsgICAgICAgCisgICAgICAgIGk9MDsvLy8vLy8vLy8vCisgICAgICAgIFdbaV1bal0ud19zb3V0aCA9IFdbaV1bai0xXS53X3NvdXRoOworICAgICAgICBXW2ldW2pdLndfc291dGggPSBXW2ldW2pdLndfc291dGggKyBfY3ZTdHJldGNoaW5nV29yayggJm51bGxfZWRnZSwgJmVkZ2VzMltqLTFdICk7CisgICAgICAgIFdbaV1bal0ud19zb3V0aCA9IFdbaV1bal0ud19zb3V0aCAvKisgCisgICAgICAgICAgICBfY3ZCZW5kaW5nV29yayggJm51bGxfZWRnZSwgJm51bGxfZWRnZSwgJmVkZ2VzMltqLTJdLCAmZWRnZXMyW2otMV0sIE5VTEwgKSovOworICAgICAgICBXW2ldW2pdLnBhdGhfcyA9IDM7CisKKyAgICAgICAgaT0xOy8vLy8vLy8vLy8vCisgICAgICAgIFdbaV1bal0ud19lYXN0PSBpbmY7CisKKyAgICAgICAgX2N2V29ya1NvdXRoKGksIGosIFcsIGVkZ2VzMSwgZWRnZXMyKTsKKworICAgICAgICBXW2ldW2pdLndfc291dGhlYXN0ID0gV1tpLTFdW2otMV0ud19zb3V0aDsKKyAgICAgICAgV1tpXVtqXS53X3NvdXRoZWFzdCA9IFdbaV1bal0ud19zb3V0aGVhc3QgKyBfY3ZTdHJldGNoaW5nV29yayggJmVkZ2VzMVtpLTFdLCAmZWRnZXMyW2otMV0gKTsKKworICAgICAgICBzbWFsbF9lZGdlLnggPSBOVUxMX0VER0UqZWRnZXMyW2otMl0ueDsKKyAgICAgICAgc21hbGxfZWRnZS55ID0gTlVMTF9FREdFKmVkZ2VzMltqLTJdLnk7CisKKyAgICAgICAgV1tpXVtqXS53X3NvdXRoZWFzdCA9IFdbaV1bal0ud19zb3V0aGVhc3QgKyAKKyAgICAgICAgICAgIF9jdkJlbmRpbmdXb3JrKCAvKiZudWxsX2VkZ2UqLyZzbWFsbF9lZGdlLCAmZWRnZXMxW2ktMV0sICZlZGdlczJbai0yXSwgJmVkZ2VzMltqLTFdLyosICZlZGdlczFbTmktMl0qLyk7CisgICAgICAgIFdbaV1bal0ucGF0aF9zZSA9IDM7CisgICAgfQorCisgICAgZm9yKGk9MjsgaTxOaTsgaSsrKQorICAgICAgICBmb3Ioaj0yOyBqPE5qOyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIF9jdldvcmtFYXN0ICAgICAoaSwgaiwgVywgZWRnZXMxLCBlZGdlczIpOworICAgICAgICAgICAgX2N2V29ya1NvdXRoRWFzdChpLCBqLCBXLCBlZGdlczEsIGVkZ2VzMik7CisgICAgICAgICAgICBfY3ZXb3JrU291dGggICAgKGksIGosIFcsIGVkZ2VzMSwgZWRnZXMyKTsKKyAgICAgICAgfQorCisgICAgaT1OaS0xO2o9TmotMTsKKworICAgICpjb3JyID0gY3ZDcmVhdGVTZXEoMCwgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2U2VxKSwgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlICk7CisKKyAgICBjb3JyMDEgPSAqY29ycjsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIGNvcnIwMSwgJndyaXRlciApOworICAgIGlmKCBXW2ldW2pdLndfZWFzdCA+IFdbaV1bal0ud19zb3V0aGVhc3QgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggV1tpXVtqXS53X3NvdXRoZWFzdCA+IFdbaV1bal0ud19zb3V0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aCA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aCA9IFBBVEhfVE9fU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggV1tpXVtqXS53X2Vhc3QgPCBXW2ldW2pdLndfc291dGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBhdGggPSBQQVRIX1RPX0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcGF0aCA9IDM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICBkbworICAgIHsKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGosIHdyaXRlciApOworCisgICAgICAgIHN3aXRjaCggcGF0aCApIAorICAgICAgICB7CisgICAgICAgIGNhc2UgUEFUSF9UT19FOgorICAgICAgICAgICAgcGF0aCA9IFdbaV1bal0ucGF0aF9lOworICAgICAgICAgICAgaS0tOworICAgICAgICAgICAgY3ZGbHVzaFNlcVdyaXRlciggJndyaXRlciApOworICAgICAgICAgICAgY29ycjAxLT5oX25leHQgPSBjdkNyZWF0ZVNlcSggICAwLCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdlNlcSksICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgKTsKKyAgICAgICAgICAgIGNvcnIwMSA9IGNvcnIwMS0+aF9uZXh0OworICAgICAgICAgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBjb3JyMDEsICZ3cml0ZXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgY2FzZSBQQVRIX1RPX1NFOgorICAgICAgICAgICAgcGF0aCA9IFdbaV1bal0ucGF0aF9zZTsKKyAgICAgICAgICAgIGotLTsgaS0tOworICAgICAgICAgICAgY3ZGbHVzaFNlcVdyaXRlciggJndyaXRlciApOworICAgICAgICAgICAgY29ycjAxLT5oX25leHQgPSBjdkNyZWF0ZVNlcSggICAwLCAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdlNlcSksICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UgKTsKKyAgICAgICAgICAgIGNvcnIwMSA9IGNvcnIwMS0+aF9uZXh0OworICAgICAgICAgICAgY3ZTdGFydEFwcGVuZFRvU2VxKCBjb3JyMDEsICZ3cml0ZXIgKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgIHBhdGggPSBXW2ldW2pdLnBhdGhfczsKKyAgICAgICAgICAgIGotLTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICB9IHdoaWxlKCAoaT49MCkgJiYgKGo+PTApICk7CisgICAgY3ZGbHVzaFNlcVdyaXRlciggJndyaXRlciApOworCisgICAgLy8gRnJlZSBtZW1vcnkKKyAgICBmb3IoaT0xO2k8Tmk7aSsrKQorICAgIHsKKyAgICAgICAgZnJlZShXW2ldKTsKKyAgICB9CisgICAgZnJlZShXKTsKKyAgICBmcmVlKHBvaW50MSk7CisgICAgZnJlZShwb2ludDIpOworICAgIGZyZWUoZWRnZXMxKTsKKyAgICBmcmVlKGVkZ2VzMik7Cit9CisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdm1vcnBoaW5nLmNwcCBiL2N2YXV4L3NyYy9jdm1vcnBoaW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTAwYzYzCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2bW9ycGhpbmcuY3BwCkBAIC0wLDAgKzEsMzk2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdk1vcnBoRXBpbGluZXM4dUMzKCB1Y2hhciAqIGZpcnN0X3BpeCwgICAgICAgIC8qIHJhc3RlciBlcGlsaW5lIGZyb20gaW1hZ2UgMSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKiBzZWNvbmRfcGl4LCAgICAgICAvKiByYXN0ZXIgZXBpbGluZSBmcm9tIGltYWdlIDIgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICogZHN0X3BpeCwgIC8qIHJhc3RlciBlcGlsaW5lIGZyb20gZGVzdCBpbWFnZSAgICovCisgICAgICAgICAgICAgICAgICAgICAgLyogKGl0J3MgYW4gb3V0cHV0IHBhcmFtZXRlcikgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSwgICAgICAvKiByZWxhdGl2ZSBwb3NpdGlvbiBvZiBjYW1lcmEgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqZmlyc3QsICAgICAgIC8qIGZpcnN0IHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50IGZpcnN0X3J1bnMsICAgLyogaXQncyBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlY29uZCwgICAgICAvKiBzZWNvbmQgc2VxdWVuY2Ugb2YgcnVucyAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCBzZWNvbmRfcnVucywgaW50ICpmaXJzdF9jb3JyLCAvKiBjb3JyIGRhdGEgZm9yIHRoZSAxc3Qgc2VxICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kX2NvcnIsIC8qIGNvcnIgZGF0YSBmb3IgdGhlIDJuZCBzZXEgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdF9sZW4gKQoreworCisgICAgZmxvYXQgYWxwaGExOyAgICAgICAgICAgICAgIC8qIGFscGhhIC0gMS4wICovCisgICAgaW50IHMsIHMxOyAgICAgICAgICAgICAgICAgIC8qIGludGVnZXIgdmFyaWFudCBvZiBhbHBoYSBhbmQgYWxwaGExICggMCA8PSBzLHMxIDw9IDI1NiApICovCisgICAgaW50IGN1cnI7ICAgICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgaW5kZXggaW4gcnVuJ3MgYXJyYXkgKi8KKworICAgIGZsb2F0IGJlZ0xpbmU7ICAgICAgICAgICAgICAvKiBiZWdpbiBvZiBjdXJyZW50IHJ1biAqLworICAgIGZsb2F0IGVuZExpbmU7ICAgICAgICAgICAgICAvKiBlbmQgICBvZiBjdXJyZW50IHJ1biAqLworCisgICAgZmxvYXQgYmVnQ29ycjsgICAgICAgICAgICAgIC8qIGJlZ2luIG9mIGNvcnJlc3BvbmRlbmNlIGRlc3RpbmF0aW9uIG9mIHJ1biAqLworICAgIGZsb2F0IGVuZENvcnI7ICAgICAgICAgICAgICAvKiBlbmQgICBvZiBjb3JyZXNwb25kZW5jZSBkZXN0aW5hdGlvbiBvZiBydW4gKi8KKworICAgIGludCBiZWdEZXN0TGluZTsgICAgICAgICAgICAvKiBiZWdpbiBvZiBjdXJyZW50IGRlc3RhbmF0aW9uIG9mIHJ1biAqLworICAgIGludCBlbmREZXN0TGluZTsgICAgICAgICAgICAvKiBlbmQgICBvZiBjdXJyZW50IGRlc3RhbmF0aW9uIG9mIHJ1biAqLworICAgIGludCBiZWdMaW5lSW5kZXg7CisgICAgaW50IGVuZExpbmVJbmRleDsKKyAgICBpbnQgaW5kZXhJbWcxOworICAgIGZsb2F0IHN0ZXAgPSAwOworICAgIGludCBuOworCisgICAgbWVtc2V0KCBkc3RfcGl4LCAwLCBkc3RfbGVuICk7CisgICAgYWxwaGExID0gKGZsb2F0KSAoMS4wIC0gYWxwaGEpOworCisgICAgcyA9IChpbnQpIChhbHBoYSAqIDI1Nik7CisgICAgczEgPSAyNTYgLSBzOworCisgICAgLyogLS0tLS0tLS0tLS0tLS1DcmVhdGUgZmlyc3QgbGluZS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGJlZ0xpbmVJbmRleCA9IGZpcnN0WzBdOworICAgIGJlZ0xpbmUgPSAoZmxvYXQpIGJlZ0xpbmVJbmRleDsKKworICAgIGN1cnIgPSAwOworCisgICAgZm9yKCBuID0gMDsgbiA8IGZpcnN0X3J1bnM7IG4rKyApCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBlYWNoIHJ1biAqLworCisgICAgICAgIGJlZ0NvcnIgPSAoZmxvYXQpIGZpcnN0X2NvcnJbY3Vycl07CisgICAgICAgIGN1cnIrKzsKKyAgICAgICAgZW5kQ29yciA9IChmbG9hdCkgZmlyc3RfY29ycltjdXJyXTsKKyAgICAgICAgY3VycisrOworICAgICAgICBlbmRMaW5lSW5kZXggPSBmaXJzdFtjdXJyXTsKKyAgICAgICAgZW5kTGluZSA9IChmbG9hdCkgZW5kTGluZUluZGV4OworCisgICAgICAgIGJlZ0Rlc3RMaW5lID0gKGludCkgKGFscGhhICogYmVnTGluZSArIGFscGhhMSAqIGJlZ0NvcnIpOworICAgICAgICBlbmREZXN0TGluZSA9IChpbnQpIChhbHBoYSAqIGVuZExpbmUgKyBhbHBoYTEgKiBlbmRDb3JyKTsKKworICAgICAgICBpbmRleEltZzEgPSBiZWdEZXN0TGluZSAqIDM7CisKKyAgICAgICAgc3RlcCA9IDA7CisgICAgICAgIGlmKCBlbmREZXN0TGluZSAhPSBiZWdEZXN0TGluZSApCisgICAgICAgICAgICBzdGVwID0gKGVuZExpbmUgLSBiZWdMaW5lKSAvICgoZmxvYXQpIChlbmREZXN0TGluZSAtIGJlZ0Rlc3RMaW5lKSk7CisKKyAgICAgICAgaWYoIGJlZ0NvcnIgIT0gZW5kQ29yciApCisgICAgICAgIHsKKworICAgICAgICAgICAgZm9yKCA7IGJlZ0Rlc3RMaW5lIDwgZW5kRGVzdExpbmU7IGJlZ0Rlc3RMaW5lKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGZvciBlYWNoIHBpeGVsICovCisKKyAgICAgICAgICAgICAgICBiZWdMaW5lSW5kZXggPSAoaW50KSBiZWdMaW5lOworICAgICAgICAgICAgICAgIGJlZ0xpbmVJbmRleCAqPSAzOworCisgICAgICAgICAgICAgICAgLyogQmxlbmQgUiAqLworICAgICAgICAgICAgICAgIGRzdF9waXhbaW5kZXhJbWcxXSA9ICh1Y2hhcikgKCgoaW50KSAoZmlyc3RfcGl4W2JlZ0xpbmVJbmRleF0pICogcykgPj4gOCk7CisKKyAgICAgICAgICAgICAgICBpbmRleEltZzErKzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIEcgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPSAodWNoYXIpICgoKGludCkgKGZpcnN0X3BpeFtiZWdMaW5lSW5kZXggKyAxXSkgKiBzKSA+PiA4KTsKKworICAgICAgICAgICAgICAgIGluZGV4SW1nMSsrOworCisgICAgICAgICAgICAgICAgLyogQmxlbmQgQiAqLworICAgICAgICAgICAgICAgIGRzdF9waXhbaW5kZXhJbWcxXSA9ICh1Y2hhcikgKCgoaW50KSAoZmlyc3RfcGl4W2JlZ0xpbmVJbmRleCArIDJdKSAqIHMpID4+IDgpOworCisgICAgICAgICAgICAgICAgaW5kZXhJbWcxKys7CisKKyAgICAgICAgICAgICAgICBiZWdMaW5lICs9IHN0ZXA7CisKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciggOyBiZWdEZXN0TGluZSA8IGVuZERlc3RMaW5lOyBiZWdEZXN0TGluZSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmb3IgZWFjaCBwaXhlbCAqLworCisgICAgICAgICAgICAgICAgYmVnTGluZUluZGV4ID0gKGludCkgYmVnTGluZTsKKyAgICAgICAgICAgICAgICBiZWdMaW5lSW5kZXggKj0gMzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIFIgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPSBmaXJzdF9waXhbYmVnTGluZUluZGV4XTsKKyAgICAgICAgICAgICAgICBpbmRleEltZzErKzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIEcgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPSBmaXJzdF9waXhbYmVnTGluZUluZGV4ICsgMV07CisgICAgICAgICAgICAgICAgaW5kZXhJbWcxKys7CisKKyAgICAgICAgICAgICAgICAvKiBCbGVuZCBCICovCisgICAgICAgICAgICAgICAgZHN0X3BpeFtpbmRleEltZzFdID0gZmlyc3RfcGl4W2JlZ0xpbmVJbmRleCArIDJdOworCisgICAgICAgICAgICAgICAgaW5kZXhJbWcxKys7CisKKyAgICAgICAgICAgICAgICBiZWdMaW5lICs9IHN0ZXA7CisKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgYmVnTGluZUluZGV4ID0gZW5kTGluZUluZGV4OworICAgICAgICBiZWdMaW5lID0gZW5kTGluZTsKKworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciBlYWNoIHJ1bnMgaW4gZmlyc3QgbGluZSAqLworCisgICAgYmVnTGluZUluZGV4ID0gc2Vjb25kWzBdOworICAgIGJlZ0xpbmUgPSAoZmxvYXQpIGJlZ0xpbmVJbmRleDsKKworICAgIGN1cnIgPSAwOworCisgICAgLyogLS0tLS0tLS0tLS0tLS1DcmVhdGUgc2Vjb25kIGxpbmUtLS0tLS0tLS0tLS0tICovCisgICAgY3VyciA9IDA7OworICAgIGZvciggbiA9IDA7IG4gPCBzZWNvbmRfcnVuczsgbisrICkKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGVhY2ggcnVuICovCisKKyAgICAgICAgYmVnQ29yciA9IChmbG9hdCkgc2Vjb25kX2NvcnJbY3Vycl07CisgICAgICAgIGN1cnIrKzsKKyAgICAgICAgZW5kQ29yciA9IChmbG9hdCkgc2Vjb25kX2NvcnJbY3Vycl07CisgICAgICAgIGN1cnIrKzsKKyAgICAgICAgZW5kTGluZUluZGV4ID0gc2Vjb25kW2N1cnJdOworICAgICAgICBlbmRMaW5lID0gKGZsb2F0KSBlbmRMaW5lSW5kZXg7CisKKyAgICAgICAgYmVnRGVzdExpbmUgPSAoaW50KSAoYWxwaGExICogYmVnTGluZSArIGFscGhhICogYmVnQ29ycik7CisgICAgICAgIGVuZERlc3RMaW5lID0gKGludCkgKGFscGhhMSAqIGVuZExpbmUgKyBhbHBoYSAqIGVuZENvcnIpOworCisgICAgICAgIGluZGV4SW1nMSA9IGJlZ0Rlc3RMaW5lICogMzsKKworICAgICAgICBzdGVwID0gMDsKKyAgICAgICAgaWYgKGVuZERlc3RMaW5lICE9IGJlZ0Rlc3RMaW5lKQorICAgICAgICAgICAgc3RlcCA9IChlbmRMaW5lIC0gYmVnTGluZSkgLyAoKGZsb2F0KSAoZW5kRGVzdExpbmUgLSBiZWdEZXN0TGluZSkpOworCisgICAgICAgIGlmKCBiZWdDb3JyICE9IGVuZENvcnIgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciggOyBiZWdEZXN0TGluZSA8IGVuZERlc3RMaW5lOyBiZWdEZXN0TGluZSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBmb3IgZWFjaCBwaXhlbCAqLworCisgICAgICAgICAgICAgICAgYmVnTGluZUluZGV4ID0gKGludCkgYmVnTGluZTsKKyAgICAgICAgICAgICAgICBiZWdMaW5lSW5kZXggKj0gMzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIFIgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPQorICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChkc3RfcGl4W2luZGV4SW1nMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpICgoKHVuc2lnbmVkIGludCkgKHNlY29uZF9waXhbYmVnTGluZUluZGV4XSkgKiBzMSkgPj4gOCkpOworCisgICAgICAgICAgICAgICAgaW5kZXhJbWcxKys7CisKKyAgICAgICAgICAgICAgICAvKiBCbGVuZCBHICovCisgICAgICAgICAgICAgICAgZHN0X3BpeFtpbmRleEltZzFdID0KKyAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoZHN0X3BpeFtpbmRleEltZzFdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKSAoKCh1bnNpZ25lZCBpbnQpIChzZWNvbmRfcGl4W2JlZ0xpbmVJbmRleCArIDFdKSAqIHMxKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4KSk7CisKKyAgICAgICAgICAgICAgICBpbmRleEltZzErKzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIEIgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPQorICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChkc3RfcGl4W2luZGV4SW1nMV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWNoYXIpICgoKHVuc2lnbmVkIGludCkgKHNlY29uZF9waXhbYmVnTGluZUluZGV4ICsgMl0pICogczEpID4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgpKTsKKworICAgICAgICAgICAgICAgIGluZGV4SW1nMSsrOworCisgICAgICAgICAgICAgICAgYmVnTGluZSArPSBzdGVwOworCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBmb3IoIDsgYmVnRGVzdExpbmUgPCBlbmREZXN0TGluZTsgYmVnRGVzdExpbmUrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZm9yIGVhY2ggcGl4ZWwgKi8KKworICAgICAgICAgICAgICAgIGJlZ0xpbmVJbmRleCA9IChpbnQpIGJlZ0xpbmU7CisgICAgICAgICAgICAgICAgYmVnTGluZUluZGV4ICo9IDM7CisKKyAgICAgICAgICAgICAgICAvKiBCbGVuZCBSICovCisgICAgICAgICAgICAgICAgZHN0X3BpeFtpbmRleEltZzFdID0gKHVjaGFyKSAoZHN0X3BpeFtpbmRleEltZzFdICsgc2Vjb25kX3BpeFtiZWdMaW5lSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBpbmRleEltZzErKzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIEcgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPQorICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChkc3RfcGl4W2luZGV4SW1nMV0gKyBzZWNvbmRfcGl4W2JlZ0xpbmVJbmRleCArIDFdKTsKKyAgICAgICAgICAgICAgICBpbmRleEltZzErKzsKKworICAgICAgICAgICAgICAgIC8qIEJsZW5kIEIgKi8KKyAgICAgICAgICAgICAgICBkc3RfcGl4W2luZGV4SW1nMV0gPQorICAgICAgICAgICAgICAgICAgICAodWNoYXIpIChkc3RfcGl4W2luZGV4SW1nMV0gKyBzZWNvbmRfcGl4W2JlZ0xpbmVJbmRleCArIDJdKTsKKyAgICAgICAgICAgICAgICAvKmFzc2VydChpbmRleEltZzEgPCBkc3RfbGVuKTsgKi8KKworICAgICAgICAgICAgICAgIGluZGV4SW1nMSsrOworCisgICAgICAgICAgICAgICAgYmVnTGluZSArPSBzdGVwOworCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgICAgIGJlZ0xpbmVJbmRleCA9IGVuZExpbmVJbmRleDsKKyAgICAgICAgYmVnTGluZSA9IGVuZExpbmU7CisKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGVhY2ggcnVucyBpbiBzZWNvbmQgbGluZSAqLworCisgICAgcmV0dXJuIENWX05PX0VSUjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZNb3JwaEVwaWxpbmVzOHVDMyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdk1vcnBoRXBpbGluZXM4dUMzTXVsdGkoIGludCBsaW5lcywgICAvKiBudW1iZXIgb2YgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKiBmaXJzdF9waXgsICAgLyogcmFzdGVyIGVwaWxpbmVzIGZyb20gdGhlIGZpcnN0IGltYWdlICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmlyc3RfbnVtLCAgICAgIC8qIG51bWJlcnMgb2YgcGl4ZWwgaW4gZmlyc3QgbGluZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIHNlY29uZF9waXgsICAvKiByYXN0ZXIgZXBpbGluZXMgZnJvbSB0aGUgc2Vjb25kIGltYWdlICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmRfbnVtLCAgICAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBzZWNvbmQgbGluZSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyICogZHN0X3BpeCwgICAgIC8qIHJhc3RlciBlcGlsaW5lIGZyb20gdGhlIGRlc3RpbmF0aW9uIGltYWdlICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAoaXQncyBhbiBvdXRwdXQgcGFyYW1ldGVyKSAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpkc3RfbnVtLCAgICAgICAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBvdXRwdXQgbGluZSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFscGhhLCAvKiByZWxhdGl2ZSBwb3NpdGlvbiBvZiBjYW1lcmEgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpmaXJzdCwgIC8qIGZpcnN0IHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZpcnN0X3J1bnMsICAgICAvKiBpdCdzIGxlbmd0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmQsIC8qIHNlY29uZCBzZXF1ZW5jZSBvZiBydW5zICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlY29uZF9ydW5zLCBpbnQgKmZpcnN0X2NvcnIsICAgLyogY29ycmVzcG9uZCBpbmZvcm1hdGlvbiBmb3IgdGhlIDFzdCBzZXEgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kX2NvcnIgKSAgIC8qIGNvcnJlc3BvbmQgaW5mb3JtYXRpb24gZm9yIHRoZSAybmQgc2VxICAgICAgICovCit7CisgICAgQ3ZTdGF0dXMgZXJyb3I7CisgICAgaW50IGN1cnJMaW5lOworICAgIGludCBjdXJyRmlyc3RQaXggPSAwOworICAgIC8vaW50IGN1cnJGaXJzdE51bSA9IDA7CisgICAgaW50IGN1cnJTZWNvbmRQaXggPSAwOworICAgIC8vaW50IGN1cnJTZWNvbmROdW0gPSAwOworICAgIGludCBjdXJyRHN0UGl4ID0gMDsKKyAgICBpbnQgY3VyckZpcnN0ID0gMDsKKyAgICAvL2ludCBjdXJyRmlyc3RSdW5zID0gMDsKKyAgICBpbnQgY3VyclNlY29uZCA9IDA7CisgICAgLy9pbnQgY3VyclNlY29uZFJ1bnMgPSAwOworICAgIGludCBjdXJyRmlyc3RDb3JyID0gMDsKKyAgICBpbnQgY3VyclNlY29uZENvcnIgPSAwOworCisgICAgaWYoIGxpbmVzIDwgMSB8fAorICAgICAgICBmaXJzdF9waXggPT0gMCB8fAorICAgICAgICBmaXJzdF9udW0gPT0gMCB8fAorICAgICAgICBzZWNvbmRfcGl4ID09IDAgfHwKKyAgICAgICAgc2Vjb25kX251bSA9PSAwIHx8CisgICAgICAgIGRzdF9waXggPT0gMCB8fAorICAgICAgICBkc3RfbnVtID09IDAgfHwKKyAgICAgICAgYWxwaGEgPCAwIHx8CisgICAgICAgIGFscGhhID4gMSB8fAorICAgICAgICBmaXJzdCA9PSAwIHx8CisgICAgICAgIGZpcnN0X3J1bnMgPT0gMCB8fAorICAgICAgICBzZWNvbmQgPT0gMCB8fCBzZWNvbmRfcnVucyA9PSAwIHx8IGZpcnN0X2NvcnIgPT0gMCB8fCBzZWNvbmRfY29yciA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBmb3IoIGN1cnJMaW5lID0gMDsgY3VyckxpbmUgPCBsaW5lczsgY3VyckxpbmUrKyApCisgICAgeworCisgICAgICAgIGVycm9yID0gaWN2TW9ycGhFcGlsaW5lczh1QzMoICYoZmlyc3RfcGl4W2N1cnJGaXJzdFBpeF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNlY29uZF9waXhbY3VyclNlY29uZFBpeF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGRzdF9waXhbY3VyckRzdFBpeF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihmaXJzdFtjdXJyRmlyc3RdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcnVuc1tjdXJyTGluZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYoc2Vjb25kW2N1cnJTZWNvbmRdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3J1bnNbY3VyckxpbmVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGZpcnN0X2NvcnJbY3VyckZpcnN0Q29ycl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHNlY29uZF9jb3JyW2N1cnJTZWNvbmRDb3JyXSksIGRzdF9udW1bY3VyckxpbmVdICogMyApOworCisKKyAgICAgICAgaWYoIGVycm9yICE9IENWX05PX0VSUiApCisgICAgICAgICAgICByZXR1cm4gQ1ZfTk9fRVJSOworCisgICAgICAgIGN1cnJGaXJzdFBpeCArPSBmaXJzdF9udW1bY3VyckxpbmVdICogMzsKKyAgICAgICAgY3VyclNlY29uZFBpeCArPSBzZWNvbmRfbnVtW2N1cnJMaW5lXSAqIDM7CisgICAgICAgIGN1cnJEc3RQaXggKz0gZHN0X251bVtjdXJyTGluZV0gKiAzOworICAgICAgICBjdXJyRmlyc3QgKz0gKGZpcnN0X3J1bnNbY3VyckxpbmVdICogMikgKyAxOworICAgICAgICBjdXJyU2Vjb25kICs9IChzZWNvbmRfcnVuc1tjdXJyTGluZV0gKiAyKSArIDE7CisgICAgICAgIGN1cnJGaXJzdENvcnIgKz0gZmlyc3RfcnVuc1tjdXJyTGluZV0gKiAyOworICAgICAgICBjdXJyU2Vjb25kQ29yciArPSBzZWNvbmRfcnVuc1tjdXJyTGluZV0gKiAyOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgcmV0dXJuIENWX05PX0VSUjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZNb3JwaEVwaWxpbmVzOHVDM011bHRpICovCisKKworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitDVl9JTVBMIHZvaWQKK2N2TW9ycGhFcGlsaW5lc011bHRpKCBpbnQgbGluZXMsICAgICAgICAvKiBudW1iZXIgb2YgbGluZXMgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIGZpcnN0X3BpeCwgICAgICAgIC8qIHJhc3RlciBlcGlsaW5lcyBmcm9tIHRoZSBmaXJzdCBpbWFnZSAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpmaXJzdF9udW0sICAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBmaXJzdCBsaW5lICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIHNlY29uZF9waXgsICAgICAgIC8qIHJhc3RlciBlcGlsaW5lcyBmcm9tIHRoZSBzZWNvbmQgaW1hZ2UgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmRfbnVtLCAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBzZWNvbmQgbGluZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIGRzdF9waXgsICAvKiByYXN0ZXIgZXBpbGluZSBmcm9tIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSAqLworICAgICAgICAgICAgICAgICAgICAgIC8qIChpdCdzIGFuIG91dHB1dCBwYXJhbWV0ZXIpICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpkc3RfbnVtLCAgICAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBvdXRwdXQgbGluZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbHBoYSwgICAgICAvKiByZWxhdGl2ZSBwb3NpdGlvbiBvZiBjYW1lcmEgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqZmlyc3QsICAgICAgIC8qIGZpcnN0IHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpmaXJzdF9ydW5zLCAgLyogaXQncyBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNlY29uZCwgICAgICAvKiBzZWNvbmQgc2VxdWVuY2Ugb2YgcnVucyAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgIGludCAqc2Vjb25kX3J1bnMsIGludCAqZmlyc3RfY29yciwgICAgICAgIC8qIGNvcnJlc3BvbmQgaW5mb3JtYXRpb24gZm9yIHRoZSAxc3Qgc2VxICAgICovCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpzZWNvbmRfY29yciAgLyogY29ycmVzcG9uZCBpbmZvcm1hdGlvbiBmb3IgdGhlIDJuZCBzZXEgICAgICovCisgICAgICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TW9ycGhFcGlsaW5lc011bHRpIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIElQUElfQ0FMTCggaWN2TW9ycGhFcGlsaW5lczh1QzNNdWx0aSggbGluZXMsICAgICAgICAvKiBudW1iZXIgb2YgbGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfcGl4LCAgICAvKiByYXN0ZXIgZXBpbGluZXMgZnJvbSB0aGUgZmlyc3QgaW1hZ2UgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbnVtLCAgICAvKiBudW1iZXJzIG9mIHBpeGVsIGluIGZpcnN0IGxpbmUgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX3BpeCwgICAvKiByYXN0ZXIgZXBpbGluZXMgZnJvbSB0aGUgc2Vjb25kIGltYWdlICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kX251bSwgICAvKiBudW1iZXJzIG9mIHBpeGVsIGluIHNlY29uZCBsaW5lICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BpeCwgICAgICAvKiByYXN0ZXIgZXBpbGluZSBmcm9tIHRoZSBkZXN0aW5hdGlvbiBpbWFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKGl0J3MgYW4gb3V0cHV0IHBhcmFtZXRlcikgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9udW0sICAgICAgLyogbnVtYmVycyBvZiBwaXhlbCBpbiBvdXRwdXQgbGluZSAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhLCAgICAgICAgLyogcmVsYXRpdmUgcG9zaXRpb24gb2YgY2FtZXJhICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCAgICAgICAgLyogZmlyc3Qgc2VxdWVuY2Ugb2YgcnVucyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3J1bnMsICAgLyogaXQncyBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCwgICAgICAgLyogc2Vjb25kIHNlcXVlbmNlIG9mIHJ1bnMgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZF9ydW5zLCBmaXJzdF9jb3JyLCAgICAgIC8qIGNvcnJlc3BvbmQgaW5mb3JtYXRpb24gZm9yIHRoZSAxc3Qgc2VxICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRfY29yciAgIC8qIGNvcnJlc3BvbmQgaW5mb3JtYXRpb24gZm9yIHRoZSAybmQgc2VxICAgICAqLworICAgICAgICAgICAgICAgICkpOworICAgIF9fRU5EX187Cit9CisKZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdnByZXdhcnAuY3BwIGIvY3ZhdXgvc3JjL2N2cHJld2FycC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRmN2M2ZQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdnByZXdhcnAuY3BwCkBAIC0wLDAgKzEsMTY4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKyNpbmNsdWRlICJfY3ZhdXguaCIKKyNpbmNsdWRlICJfY3Z2bS5oIgorCisvKiBWYWxlcnkgTW9zeWFnaW4gKi8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZGaW5kUnVucyggaW50IG51bUxpbmVzLCAgICAgIC8qIG51bWJlciBvZiBzY2FubGluZXMgICAgICAqLworICAgICAgICAgICAgIHVjaGFyICogcHJld2FycF8xLCAvKiBwcmV3YXJwIGltYWdlIDEgICAgICAgICAgKi8KKyAgICAgICAgICAgICB1Y2hhciAqIHByZXdhcnBfMiwgLyogcHJld2FycCBpbWFnZSAyICAgICAgICAgICovCisgICAgICAgICAgICAgaW50ICpsaW5lX2xlbnNfMSwgIC8qIGxpbmUgbGVuZ3RocyAxICAgICAgICAgICAqLworICAgICAgICAgICAgIGludCAqbGluZV9sZW5zXzIsICAvKiBsaW5lIGxlbmd0aHMgMiAgICAgICAgICAgKi8KKyAgICAgICAgICAgICBpbnQgKnJ1bnNfMSwgICAgICAgLyogcmVzdWx0IHJ1bnMgIDEgICAgICAgICAgICovCisgICAgICAgICAgICAgaW50ICpydW5zXzIsICAgICAgIC8qIHJlc3VsdCBydW5zICAyICAgICAgICAgICAqLworICAgICAgICAgICAgIGludCAqbnVtX3J1bnNfMSwgICAvKiBudW1iZXJzIG9mIGZpcnN0IHJ1bnMgICAgKi8KKyAgICAgICAgICAgICBpbnQgKm51bV9ydW5zXzIgKQoreworICAgIEN2U3RhdHVzIGVycjsKKworICAgIGVyciA9IGljdkZpbmRSdW5zSW5PbmVJbWFnZSggbnVtTGluZXMsIHByZXdhcnBfMSwgbGluZV9sZW5zXzEsIHJ1bnNfMSwgbnVtX3J1bnNfMSApOworCisgICAgaWYoIGVyciAhPSBDVl9OT19FUlIgKQorICAgICAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gaWN2RmluZFJ1bnNJbk9uZUltYWdlKCBudW1MaW5lcywgcHJld2FycF8yLCBsaW5lX2xlbnNfMiwgcnVuc18yLCBudW1fcnVuc18yICk7CisKKyAgICByZXR1cm4gZXJyOworCit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK0NWX0lOTElORSBpbnQKK2ljdkdldENvbG9yKCB1Y2hhciAqIHZhbHVlUkdCICkKK3sKKyAgICBpbnQgUiA9ICp2YWx1ZVJHQjsKKyAgICBpbnQgRyA9ICoodmFsdWVSR0IgKyAxKTsKKyAgICBpbnQgQiA9ICoodmFsdWVSR0IgKyAyKTsKKworICAgIHJldHVybiAoICgoUiArIEcgKyBCKSA+PiAzKSAmIDB4RkZGQyApOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2bV9HZXRDb2xvciAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitDdlN0YXR1cworaWN2RmluZFJ1bnNJbk9uZUltYWdlKCBpbnQgbnVtTGluZXMsICAgIC8qIG51bWJlciBvZiBzY2FubGluZXMgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciAqIHByZXdhcnAsIC8qIHByZXdhcnAgaW1hZ2UgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmxpbmVfbGVucywgIC8qIGxpbmUgbGVuZ3RocyBpbiBwaXhlbHMgICAqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnJ1bnMsICAgICAgIC8qIHJlc3VsdCBydW5zICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICBpbnQgKm51bV9ydW5zICkKK3sKKyAgICBpbnQgZXBpTGluZTsKKyAgICBpbnQgcnVuX2luZGV4OworICAgIGludCBjdXJyX2NvbG9yOworICAgIGludCBpbmRleDsKKyAgICBpbnQgY29sb3I7CisgICAgdWNoYXIgKmN1cnJfcG9pbnQ7CisgICAgaW50IG51bTsKKworCisgICAgcnVuX2luZGV4ID0gMDsKKworICAgIGN1cnJfcG9pbnQgPSBwcmV3YXJwOworCisgICAgZm9yKCBlcGlMaW5lID0gMDsgZXBpTGluZSA8IG51bUxpbmVzOyBlcGlMaW5lKysgKQorICAgIHsKKworICAgICAgICBjdXJyX2NvbG9yID0gaWN2R2V0Q29sb3IoIGN1cnJfcG9pbnQgKTsKKworICAgICAgICBydW5zW3J1bl9pbmRleCsrXSA9IDA7CisgICAgICAgIHJ1bnNbcnVuX2luZGV4KytdID0gY3Vycl9jb2xvcjsKKworICAgICAgICBjdXJyX3BvaW50ICs9IDM7CisKKyAgICAgICAgbnVtID0gMTsKKyAgICAgICAgZm9yKCBpbmRleCA9IDE7IGluZGV4IDwgbGluZV9sZW5zW2VwaUxpbmVdOyBpbmRleCsrICkKKyAgICAgICAgeworCisgICAgICAgICAgICBjb2xvciA9IGljdkdldENvbG9yKCBjdXJyX3BvaW50ICk7CisKKyAgICAgICAgICAgIGlmKCBjb2xvciAhPSBjdXJyX2NvbG9yICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBydW5zW3J1bl9pbmRleCsrXSA9IGluZGV4OworICAgICAgICAgICAgICAgIHJ1bnNbcnVuX2luZGV4KytdID0gY29sb3I7CisgICAgICAgICAgICAgICAgY3Vycl9jb2xvciA9IGNvbG9yOworICAgICAgICAgICAgICAgIG51bSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdXJyX3BvaW50ICs9IDM7CisgICAgICAgIH0KKworICAgICAgICBydW5zW3J1bl9pbmRleCsrXSA9IGluZGV4OworICAgICAgICBudW1fcnVuc1tlcGlMaW5lXSA9IG51bTsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitDVl9JTVBMIHZvaWQKK2N2RmluZFJ1bnMoIGludCBudW1MaW5lcywgICAgICAgLyogbnVtYmVyIG9mIHNjYW5saW5lcyAgICovCisgICAgICAgICAgICB1Y2hhciAqIHByZXdhcnBfMSwgIC8qIHByZXdhcnAgaW1hZ2UgMSAgICAgICAqLworICAgICAgICAgICAgdWNoYXIgKiBwcmV3YXJwXzIsICAvKiBwcmV3YXJwIGltYWdlIDIgICAgICAgKi8KKyAgICAgICAgICAgIGludCAqbGluZV9sZW5zXzEsICAgLyogbGluZSBsZW5ndGhzIDEgICAgICAgICovCisgICAgICAgICAgICBpbnQgKmxpbmVfbGVuc18yLCAgIC8qIGxpbmUgbGVuZ3RocyAyICAgICAgICAqLworICAgICAgICAgICAgaW50ICpydW5zXzEsICAgICAgICAvKiByZXN1bHQgcnVucyAgMSAgICAgICAgKi8KKyAgICAgICAgICAgIGludCAqcnVuc18yLCAgICAgICAgLyogcmVzdWx0IHJ1bnMgIDIgICAgICAgICovCisgICAgICAgICAgICBpbnQgKm51bV9ydW5zXzEsICAgIC8qIG51bWJlcnMgb2YgZmlyc3QgcnVucyAqLworICAgICAgICAgICAgaW50ICpudW1fcnVuc18yICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZFJ1bnMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZGaW5kUnVucyggbnVtTGluZXMsICAgLyogbnVtYmVyIG9mIHNjYW5saW5lcyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJld2FycF8xLCAgLyogcHJld2FycCBpbWFnZSAxICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJld2FycF8yLCAgLyogcHJld2FycCBpbWFnZSAyICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZV9sZW5zXzEsICAgICAgICAvKiBsaW5lIGxlbmd0aHMgMSAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2xlbnNfMiwgICAgICAgIC8qIGxpbmUgbGVuZ3RocyAyICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNfMSwgICAgIC8qIHJlc3VsdCBydW5zICAxICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNfMiwgICAgIC8qIHJlc3VsdCBydW5zICAyICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5zXzEsIC8qIG51bWJlcnMgb2YgZmlyc3QgcnVucyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ydW5zXzIgKSk7CisgICAgX19DTEVBTlVQX187CisgICAgX19FTkRfXzsKK30KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdnNjYW5saW5lcy5jcHAgYi9jdmF1eC9zcmMvY3ZzY2FubGluZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTdhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZzY2FubGluZXMuY3BwCkBAIC0wLDAgKzEsMjAzMyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N2YXV4LmgiCisjaW5jbHVkZSAiX2N2dm0uaCIKKworLy8jZGVmaW5lIFJFQUxfWkVSTyh4KSAoICh4KSA8IDFlLTggJiYgKHgpID4gLTFlLTgpCisKK3N0YXRpYyBDdlN0YXR1cworaWN2R2V0Tm9ybWFsVmVjdG9yMyggQ3ZNYXRyaXgzICogTWF0cml4LCBmbG9hdCAqdiApCit7CisvKiAgcmV0dXJuIHZlY3RvciB2IHRoYXQgaXMgYW55IDMtdmVjdG9yIHBlcnBlbmRpY3VsYXIKKyAgICB0byBhbGwgdGhlIHJvdyB2ZWN0b3JzIG9mIE1hdHJpeCAqLworCisgICAgZG91YmxlICpzb2x1dGlvbnMgPSAwOworICAgIGRvdWJsZSBNWzMgKiAzXTsKKyAgICBkb3VibGUgQlszXSA9IHsgMC5mLCAwLmYsIDAuZiB9OworICAgIGludCBpLCBqLCByZXM7CisKKyAgICBpZiggTWF0cml4ID09IDAgfHwgdiA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgMzsgaisrICkKKyAgICAgICAgICAgIE1baSAqIDMgKyBqXSA9IChkb3VibGUpIChNYXRyaXgtPm1baV1bal0pOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgIHJlcyA9IGljdkdhdXNzTXhOKCBNLCBCLCAzLCAzLCAmc29sdXRpb25zICk7CisKKyAgICBpZiggcmVzID09IC0xICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBpZiggcmVzID4gMCAmJiBzb2x1dGlvbnMgKQorICAgIHsKKyAgICAgICAgdlswXSA9IChmbG9hdCkgc29sdXRpb25zWzBdOworICAgICAgICB2WzFdID0gKGZsb2F0KSBzb2x1dGlvbnNbMV07CisgICAgICAgIHZbMl0gPSAoZmxvYXQpIHNvbHV0aW9uc1syXTsKKyAgICAgICAgcmVzID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICByZXMgPSAxOworCisgICAgaWYoIHNvbHV0aW9ucyApCisgICAgICAgIGN2RnJlZSggJnNvbHV0aW9ucyApOworCisgICAgaWYoIHJlcyApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZnZXROb3JtYWxWZWN0b3IzICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZNdWx0TWF0cml4VmVjdG9yMyggQ3ZNYXRyaXgzICogbSwgZmxvYXQgKnNyYywgZmxvYXQgKmRzdCApCit7CisgICAgaWYoIG0gPT0gMCB8fCBzcmMgPT0gMCB8fCBkc3QgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKworICAgIGRzdFswXSA9IG0tPm1bMF1bMF0gKiBzcmNbMF0gKyBtLT5tWzBdWzFdICogc3JjWzFdICsgbS0+bVswXVsyXSAqIHNyY1syXTsKKyAgICBkc3RbMV0gPSBtLT5tWzFdWzBdICogc3JjWzBdICsgbS0+bVsxXVsxXSAqIHNyY1sxXSArIG0tPm1bMV1bMl0gKiBzcmNbMl07CisgICAgZHN0WzJdID0gbS0+bVsyXVswXSAqIHNyY1swXSArIG0tPm1bMl1bMV0gKiBzcmNbMV0gKyBtLT5tWzJdWzJdICogc3JjWzJdOworCisgICAgcmV0dXJuIENWX05PX0VSUjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZNdWx0TWF0cml4VmVjdG9yMyAqLworCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3N0YXRpYyBDdlN0YXR1cworaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBDdk1hdHJpeDMgKiBtLCBmbG9hdCAqc3JjLCBmbG9hdCAqZHN0ICkKK3sKKyAgICBpZiggbSA9PSAwIHx8IHNyYyA9PSAwIHx8IGRzdCA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZHN0WzBdID0gbS0+bVswXVswXSAqIHNyY1swXSArIG0tPm1bMV1bMF0gKiBzcmNbMV0gKyBtLT5tWzJdWzBdICogc3JjWzJdOworICAgIGRzdFsxXSA9IG0tPm1bMF1bMV0gKiBzcmNbMF0gKyBtLT5tWzFdWzFdICogc3JjWzFdICsgbS0+bVsyXVsxXSAqIHNyY1syXTsKKyAgICBkc3RbMl0gPSBtLT5tWzBdWzJdICogc3JjWzBdICsgbS0+bVsxXVsyXSAqIHNyY1sxXSArIG0tPm1bMl1bMl0gKiBzcmNbMl07CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGljdk11bHRNYXRyaXhUVmVjdG9yMyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdkNyb3NzTGluZXMoIGZsb2F0ICpsaW5lMSwgZmxvYXQgKmxpbmUyLCBmbG9hdCAqY3Jvc3NfcG9pbnQgKQoreworICAgIGZsb2F0IGRlbHRhOworCisgICAgaWYoIGxpbmUxID09IDAgJiYgbGluZTIgPT0gMCAmJiBjcm9zc19wb2ludCA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgZGVsdGEgPSBsaW5lMVswXSAqIGxpbmUyWzFdIC0gbGluZTFbMV0gKiBsaW5lMlswXTsKKworICAgIGlmKCBSRUFMX1pFUk8oIGRlbHRhICkpCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgY3Jvc3NfcG9pbnRbMF0gPSAoLWxpbmUxWzJdICogbGluZTJbMV0gKyBsaW5lMVsxXSAqIGxpbmUyWzJdKSAvIGRlbHRhOworICAgIGNyb3NzX3BvaW50WzFdID0gKC1saW5lMVswXSAqIGxpbmUyWzJdICsgbGluZTFbMl0gKiBsaW5lMlswXSkgLyBkZWx0YTsKKyAgICBjcm9zc19wb2ludFsyXSA9IDE7CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZDcm9zc0xpbmVzICovCisKKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZNYWtlU2NhbmxpbmVzKCBDdk1hdHJpeDMgKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICBDdlNpemUgaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsIGludCAqbGVuc18xLCBpbnQgKmxlbnNfMiwgaW50ICpudW1saW5lcyApCit7CisKKyAgICBDdlN0YXR1cyBlcnJvcjsKKworICAgIGVycm9yID0gaWN2R2V0Q29lZmZpY2llbnQoIG1hdHJpeCwgaW1nU2l6ZSwgc2NhbmxpbmVzXzIsIHNjYW5saW5lc18xLCBudW1saW5lcyApOworCisgICAgLyogTWFrZSBMZW5ndGggb2Ygc2NhbmxpbmVzICovCisKKyAgICBpZiggc2NhbmxpbmVzXzEgPT0gMCAmJiBzY2FubGluZXNfMiA9PSAwICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgaWN2TWFrZVNjYW5saW5lc0xlbmd0aHMoIHNjYW5saW5lc18xLCAqbnVtbGluZXMsIGxlbnNfMSApOworCisgICAgaWN2TWFrZVNjYW5saW5lc0xlbmd0aHMoIHNjYW5saW5lc18yLCAqbnVtbGluZXMsIGxlbnNfMiApOworCisgICAgbWF0cml4ID0gbWF0cml4OworICAgIHJldHVybiBDVl9OT19FUlI7CisKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZNYWtlU2NhbmxpbmVzICovCisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK0N2U3RhdHVzCitpY3ZNYWtlU2NhbmxpbmVzTGVuZ3RocyggaW50ICpzY2FubGluZXMsIGludCBudW1saW5lcywgaW50ICpsZW5zICkKK3sKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IHgxLCB5MSwgeDIsIHkyLCBkeCwgZHk7CisgICAgaW50IGN1cnI7CisKKyAgICBjdXJyID0gMDsKKworICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IG51bWxpbmVzOyBpbmRleCsrICkKKyAgICB7CisKKyAgICAgICAgeDEgPSBzY2FubGluZXNbY3VycisrXTsKKyAgICAgICAgeTEgPSBzY2FubGluZXNbY3VycisrXTsKKyAgICAgICAgeDIgPSBzY2FubGluZXNbY3VycisrXTsKKyAgICAgICAgeTIgPSBzY2FubGluZXNbY3VycisrXTsKKworICAgICAgICBkeCA9IGFicyggeDEgLSB4MiApICsgMTsKKyAgICAgICAgZHkgPSBhYnMoIHkxIC0geTIgKSArIDE7CisKKyAgICAgICAgbGVuc1tpbmRleF0gPSBNQVgoIGR4LCBkeSApOworCisgICAgfQorICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCitzdGF0aWMgQ3ZTdGF0dXMKK2ljdk1ha2VBbHBoYVNjYW5saW5lcyggaW50ICpzY2FubGluZXNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FubGluZXNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FubGluZXNfYSwgaW50ICpsZW5zLCBpbnQgbnVtbGluZXMsIGZsb2F0IGFscGhhICkKK3sKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IHgxLCB5MSwgeDIsIHkyOworICAgIGludCBjdXJyOworICAgIGludCBkeCwgZHk7CisgICAgaW50IGN1cnJfbGVuOworCisgICAgY3VyciA9IDA7CisgICAgY3Vycl9sZW4gPSAwOworICAgIGZvciggaW5kZXggPSAwOyBpbmRleCA8IG51bWxpbmVzOyBpbmRleCsrICkKKyAgICB7CisKKyAgICAgICAgeDEgPSAoaW50KSAoc2NhbmxpbmVzXzFbY3Vycl0gKiBhbHBoYSArIHNjYW5saW5lc18yW2N1cnJdICogKDEuMCAtIGFscGhhKSk7CisKKyAgICAgICAgc2NhbmxpbmVzX2FbY3VycisrXSA9IHgxOworCisgICAgICAgIHkxID0gKGludCkgKHNjYW5saW5lc18xW2N1cnJdICogYWxwaGEgKyBzY2FubGluZXNfMltjdXJyXSAqICgxLjAgLSBhbHBoYSkpOworCisgICAgICAgIHNjYW5saW5lc19hW2N1cnIrK10gPSB5MTsKKworICAgICAgICB4MiA9IChpbnQpIChzY2FubGluZXNfMVtjdXJyXSAqIGFscGhhICsgc2NhbmxpbmVzXzJbY3Vycl0gKiAoMS4wIC0gYWxwaGEpKTsKKworICAgICAgICBzY2FubGluZXNfYVtjdXJyKytdID0geDI7CisKKyAgICAgICAgeTIgPSAoaW50KSAoc2NhbmxpbmVzXzFbY3Vycl0gKiBhbHBoYSArIHNjYW5saW5lc18yW2N1cnJdICogKDEuMCAtIGFscGhhKSk7CisKKyAgICAgICAgc2NhbmxpbmVzX2FbY3VycisrXSA9IHkyOworCisgICAgICAgIGR4ID0gYWJzKCB4MSAtIHgyICkgKyAxOworICAgICAgICBkeSA9IGFicyggeTEgLSB5MiApICsgMTsKKworICAgICAgICBsZW5zW2N1cnJfbGVuKytdID0gTUFYKCBkeCwgZHkgKTsKKworICAgIH0KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisKKworCisKKworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gKi8KKworQ3ZTdGF0dXMKK2ljdkdldENvZWZmaWNpZW50KCBDdk1hdHJpeDMgKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltZ1NpemUsIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsIGludCAqbnVtbGluZXMgKQoreworICAgIGZsb2F0IGxfZXBpcG9sZVszXTsKKyAgICBmbG9hdCByX2VwaXBvbGVbM107CisgICAgQ3ZNYXRyaXgzICpGOworICAgIEN2TWF0cml4MyBGdDsKKyAgICBDdlN0YXR1cyBlcnJvcjsKKyAgICBpbnQgaSwgajsKKworICAgIEYgPSBtYXRyaXg7CisKKyAgICBsX2VwaXBvbGVbMl0gPSAtMTsKKyAgICByX2VwaXBvbGVbMl0gPSAtMTsKKworICAgIGlmKCBGID09IDAgKQorICAgIHsKKyAgICAgICAgZXJyb3IgPSBpY3ZHZXRDb2VmZmljaWVudERlZmF1bHQoIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1NpemUsIHNjYW5saW5lc18xLCBzY2FubGluZXNfMiwgbnVtbGluZXMgKTsKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0KKworCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgICAgICAgICAgRnQubVtpXVtqXSA9IEYtPm1bal1baV07CisKKworICAgIGVycm9yID0gaWN2R2V0Tm9ybWFsVmVjdG9yMyggJkZ0LCBsX2VwaXBvbGUgKTsKKyAgICBpZiggZXJyb3IgPT0gQ1ZfTk9fRVJSICYmICFSRUFMX1pFUk8oIGxfZXBpcG9sZVsyXSApICYmICFSRUFMX1pFUk8oIGxfZXBpcG9sZVsyXSAtIDEgKSkKKyAgICB7CisKKyAgICAgICAgbF9lcGlwb2xlWzBdIC89IGxfZXBpcG9sZVsyXTsKKyAgICAgICAgbF9lcGlwb2xlWzFdIC89IGxfZXBpcG9sZVsyXTsKKyAgICAgICAgbF9lcGlwb2xlWzJdID0gMTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGVycm9yID0gaWN2R2V0Tm9ybWFsVmVjdG9yMyggRiwgcl9lcGlwb2xlICk7CisgICAgaWYoIGVycm9yID09IENWX05PX0VSUiAmJiAhUkVBTF9aRVJPKCByX2VwaXBvbGVbMl0gKSAmJiAhUkVBTF9aRVJPKCByX2VwaXBvbGVbMl0gLSAxICkpCisgICAgeworCisgICAgICAgIHJfZXBpcG9sZVswXSAvPSByX2VwaXBvbGVbMl07CisgICAgICAgIHJfZXBpcG9sZVsxXSAvPSByX2VwaXBvbGVbMl07CisgICAgICAgIHJfZXBpcG9sZVsyXSA9IDE7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggUkVBTF9aRVJPKCBsX2VwaXBvbGVbMl0gLSAxICkgJiYgUkVBTF9aRVJPKCByX2VwaXBvbGVbMl0gLSAxICkpCisgICAgeworICAgICAgICBlcnJvciA9IGljdkdldENvZWZmaWNpZW50U3RlcmVvKCBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9lcGlwb2xlLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisgICAgICAgIGlmKCBlcnJvciA9PSBDVl9OT19FUlIgKQorICAgICAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIFJFQUxfWkVSTyggbF9lcGlwb2xlWzJdICkgJiYgUkVBTF9aRVJPKCByX2VwaXBvbGVbMl0gKSkKKyAgICAgICAgeworICAgICAgICAgICAgZXJyb3IgPSBpY3ZHZXRDb2VmZmljaWVudE9ydG8oIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWdTaXplLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisgICAgICAgICAgICBpZiggZXJyb3IgPT0gQ1ZfTk9fRVJSICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfTk9fRVJSOworICAgICAgICB9CisgICAgfQorCisKKyAgICBlcnJvciA9IGljdkdldENvZWZmaWNpZW50RGVmYXVsdCggbWF0cml4LCBpbWdTaXplLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisKKyAgICByZXR1cm4gZXJyb3I7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2bEdldENvZWZmaWNpZW50ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRDb2VmZmljaWVudERlZmF1bHQoIEN2TWF0cml4MyAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltZ1NpemUsIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsIGludCAqbnVtbGluZXMgKQoreworICAgIGludCBjdXJyOworICAgIGludCB5OworCisgICAgKm51bWxpbmVzID0gaW1nU2l6ZS5oZWlnaHQ7CisKKyAgICBpZiggc2NhbmxpbmVzXzEgPT0gMCAmJiBzY2FubGluZXNfMiA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKworICAgIGN1cnIgPSAwOworICAgIGZvciggeSA9IDA7IHkgPCBpbWdTaXplLmhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIHNjYW5saW5lc18xW2N1cnJdID0gMDsKKyAgICAgICAgc2NhbmxpbmVzXzFbY3VyciArIDFdID0geTsKKyAgICAgICAgc2NhbmxpbmVzXzFbY3VyciArIDJdID0gaW1nU2l6ZS53aWR0aCAtIDE7CisgICAgICAgIHNjYW5saW5lc18xW2N1cnIgKyAzXSA9IHk7CisKKyAgICAgICAgc2NhbmxpbmVzXzJbY3Vycl0gPSAwOworICAgICAgICBzY2FubGluZXNfMltjdXJyICsgMV0gPSB5OworICAgICAgICBzY2FubGluZXNfMltjdXJyICsgMl0gPSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICAgICAgc2NhbmxpbmVzXzJbY3VyciArIDNdID0geTsKKworICAgICAgICBjdXJyICs9IDQ7CisgICAgfQorCisgICAgbWF0cml4ID0gbWF0cml4OworICAgIHJldHVybiBDVl9OT19FUlI7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2bEdldENvZWZmaWNpZW50RGVmYXVsdCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cworaWN2R2V0Q29lZmZpY2llbnRPcnRvKCBDdk1hdHJpeDMgKiBtYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWdTaXplLCBpbnQgKnNjYW5saW5lc18xLCBpbnQgKnNjYW5saW5lc18yLCBpbnQgKm51bWxpbmVzICkKK3sKKyAgICBmbG9hdCBsX3N0YXJ0X2VuZFs0XSwgcl9zdGFydF9lbmRbNF07CisgICAgZG91YmxlIGEsIGI7CisgICAgQ3ZTdGF0dXMgZXJyb3I7CisgICAgQ3ZNYXRyaXgzICpGOworCisgICAgRiA9IG1hdHJpeDsKKworICAgIGlmKCBGLT5tWzBdWzJdICogRi0+bVsxXVsyXSA8IDAgKQorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiBsZWZ0IC8gKi8KKworICAgICAgICBpZiggRi0+bVsyXVswXSAqIEYtPm1bMl1bMV0gPCAwICkKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogb24gcmlnaHQgLyAqLworICAgICAgICAgICAgZXJyb3IgPSBpY3ZHZXRTdGFydEVuZDEoIEYsIGltZ1NpemUsIGxfc3RhcnRfZW5kLCByX3N0YXJ0X2VuZCApOworCisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIHJpZ2h0IFwgKi8KKyAgICAgICAgICAgIGVycm9yID0gaWN2R2V0U3RhcnRFbmQyKCBGLCBpbWdTaXplLCBsX3N0YXJ0X2VuZCwgcl9zdGFydF9lbmQgKTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIH0KKyAgICBlbHNlCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG9uIGxlZnQgXCAqLworCisgICAgICAgIGlmKCBGLT5tWzJdWzBdICogRi0+bVsyXVsxXSA8IDAgKQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiByaWdodCAvICovCisgICAgICAgICAgICBlcnJvciA9IGljdkdldFN0YXJ0RW5kMyggRiwgaW1nU2l6ZSwgbF9zdGFydF9lbmQsIHJfc3RhcnRfZW5kICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBvbiByaWdodCBcICovCisgICAgICAgICAgICBlcnJvciA9IGljdkdldFN0YXJ0RW5kNCggRiwgaW1nU2l6ZSwgbF9zdGFydF9lbmQsIHJfc3RhcnRfZW5kICk7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggZXJyb3IgIT0gQ1ZfTk9fRVJSICkKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgYSA9IGZhYnMoIGxfc3RhcnRfZW5kWzBdIC0gbF9zdGFydF9lbmRbMl0gKTsKKyAgICBiID0gZmFicyggcl9zdGFydF9lbmRbMF0gLSByX3N0YXJ0X2VuZFsyXSApOworICAgIGlmKCBhID4gYiApCisgICAgeworCisgICAgICAgIGVycm9yID0gaWN2QnVpbGRTY2FubGluZUxlZnQoIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xLCBzY2FubGluZXNfMiwgbF9zdGFydF9lbmQsIG51bWxpbmVzICk7CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBlcnJvciA9IGljdkJ1aWxkU2NhbmxpbmVSaWdodCggRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIHJfc3RhcnRfZW5kLCBudW1saW5lcyApOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICByZXR1cm4gZXJyb3I7CisKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2bEdldENvZWZmaWNpZW50T3J0byAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cworaWN2R2V0U3RhcnRFbmQxKCBDdk1hdHJpeDMgKiBtYXRyaXgsIEN2U2l6ZSBpbWdTaXplLCBmbG9hdCAqbF9zdGFydF9lbmQsIGZsb2F0ICpyX3N0YXJ0X2VuZCApCit7CisKKyAgICBDdk1hdHJpeDMgKkY7CisgICAgaW50IHdpZHRoLCBoZWlnaHQ7CisgICAgZmxvYXQgbF9kaWFnb25hbFszXTsKKyAgICBmbG9hdCByX2RpYWdvbmFsWzNdOworICAgIGZsb2F0IGxfcG9pbnRbM10sIHJfcG9pbnRbM10sIGVwaWxpbmVbM107CisgICAgQ3ZTdGF0dXMgZXJyb3IgPSBDVl9PSzsKKworICAgIEYgPSBtYXRyaXg7CisgICAgd2lkdGggPSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICBoZWlnaHQgPSBpbWdTaXplLmhlaWdodCAtIDE7CisKKyAgICBsX2RpYWdvbmFsWzBdID0gKGZsb2F0KSAxIC8gd2lkdGg7CisgICAgbF9kaWFnb25hbFsxXSA9IChmbG9hdCkgMSAvIGhlaWdodDsKKyAgICBsX2RpYWdvbmFsWzJdID0gLTE7CisKKyAgICByX2RpYWdvbmFsWzBdID0gKGZsb2F0KSAxIC8gd2lkdGg7CisgICAgcl9kaWFnb25hbFsxXSA9IChmbG9hdCkgMSAvIGhlaWdodDsKKyAgICByX2RpYWdvbmFsWzJdID0gLTE7CisKKyAgICByX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICByX3BvaW50WzFdID0gMDsKKyAgICByX3BvaW50WzJdID0gMTsKKworICAgIGljdk11bHRNYXRyaXhWZWN0b3IzKCBGLCByX3BvaW50LCBlcGlsaW5lICk7CisgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCBsX2RpYWdvbmFsLCBlcGlsaW5lLCBsX3BvaW50ICk7CisKKyAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgaWYoIGxfcG9pbnRbMF0gPj0gMCAmJiBsX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICB7CisKKyAgICAgICAgbF9zdGFydF9lbmRbMF0gPSBsX3BvaW50WzBdOworICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgcl9zdGFydF9lbmRbMF0gPSByX3BvaW50WzBdOworICAgICAgICByX3N0YXJ0X2VuZFsxXSA9IHJfcG9pbnRbMV07CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBpZiggbF9wb2ludFswXSA8IDAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsxXSA9IChmbG9hdCkgaGVpZ2h0OworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMV0gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiggbF9wb2ludFswXSA+IHdpZHRoICkgKi8KKworICAgICAgICAgICAgbF9wb2ludFswXSA9IChmbG9hdCkgd2lkdGg7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gMDsKKyAgICAgICAgICAgIGxfcG9pbnRbMl0gPSAxOworCisgICAgICAgICAgICBpY3ZNdWx0TWF0cml4VFZlY3RvcjMoIEYsIGxfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICAgICAgICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggcl9kaWFnb25hbCwgZXBpbGluZSwgcl9wb2ludCApOworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMV0gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICByX3BvaW50WzBdID0gMDsKKyAgICByX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgcl9wb2ludFsyXSA9IDE7CisKKyAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgZXBpbGluZSApOworICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggbF9kaWFnb25hbCwgZXBpbGluZSwgbF9wb2ludCApOworICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICBpZiggbF9wb2ludFswXSA+PSAwICYmIGxfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgIHsKKworICAgICAgICBsX3N0YXJ0X2VuZFsyXSA9IGxfcG9pbnRbMF07CisgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICByX3N0YXJ0X2VuZFsyXSA9IHJfcG9pbnRbMF07CisgICAgICAgIHJfc3RhcnRfZW5kWzNdID0gcl9wb2ludFsxXTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCBsX3BvaW50WzBdIDwgMCApCisgICAgICAgIHsKKworICAgICAgICAgICAgbF9wb2ludFswXSA9IDA7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCBlcGlsaW5lICk7CisgICAgICAgICAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIHJfZGlhZ29uYWwsIGVwaWxpbmUsIHJfcG9pbnQgKTsKKyAgICAgICAgICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICAgICAgICAgIGlmKCByX3BvaW50WzBdID49IDAgJiYgcl9wb2ludFswXSA8PSB3aWR0aCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsyXSA9IGxfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbM10gPSBsX3BvaW50WzFdOworCisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMl0gPSByX3BvaW50WzBdOworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzNdID0gcl9wb2ludFsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogaWYoIGxfcG9pbnRbMF0gPiB3aWR0aCApICovCisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSAoZmxvYXQpIHdpZHRoOworICAgICAgICAgICAgbF9wb2ludFsxXSA9IDA7CisgICAgICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCBlcGlsaW5lICk7CisgICAgICAgICAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIHJfZGlhZ29uYWwsIGVwaWxpbmUsIHJfcG9pbnQgKTsKKyAgICAgICAgICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICAgICAgICAgIGlmKCByX3BvaW50WzBdID49IDAgJiYgcl9wb2ludFswXSA8PSB3aWR0aCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsyXSA9IGxfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbM10gPSBsX3BvaW50WzFdOworCisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMl0gPSByX3BvaW50WzBdOworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzNdID0gcl9wb2ludFsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZsR2V0U3RhcnRFbmQxICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRTdGFydEVuZDIoIEN2TWF0cml4MyAqIG1hdHJpeCwgQ3ZTaXplIGltZ1NpemUsIGZsb2F0ICpsX3N0YXJ0X2VuZCwgZmxvYXQgKnJfc3RhcnRfZW5kICkKK3sKKworCisgICAgQ3ZNYXRyaXgzICpGOworICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgIGZsb2F0IGxfZGlhZ29uYWxbM107CisgICAgZmxvYXQgcl9kaWFnb25hbFszXTsKKyAgICBmbG9hdCBsX3BvaW50WzNdLCByX3BvaW50WzNdLCBlcGlsaW5lWzNdOworICAgIEN2U3RhdHVzIGVycm9yID0gQ1ZfT0s7CisKKyAgICBGID0gbWF0cml4OworCisgICAgd2lkdGggPSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICBoZWlnaHQgPSBpbWdTaXplLmhlaWdodCAtIDE7CisKKyAgICBsX2RpYWdvbmFsWzBdID0gKGZsb2F0KSAxIC8gd2lkdGg7CisgICAgbF9kaWFnb25hbFsxXSA9IChmbG9hdCkgMSAvIGhlaWdodDsKKyAgICBsX2RpYWdvbmFsWzJdID0gLTE7CisKKyAgICByX2RpYWdvbmFsWzBdID0gKGZsb2F0KSBoZWlnaHQgLyB3aWR0aDsKKyAgICByX2RpYWdvbmFsWzFdID0gLTE7CisgICAgcl9kaWFnb25hbFsyXSA9IDA7CisKKyAgICByX3BvaW50WzBdID0gMDsKKyAgICByX3BvaW50WzFdID0gMDsKKyAgICByX3BvaW50WzJdID0gMTsKKworICAgIGljdk11bHRNYXRyaXhWZWN0b3IzKCBGLCByX3BvaW50LCBlcGlsaW5lICk7CisKKyAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIGxfZGlhZ29uYWwsIGVwaWxpbmUsIGxfcG9pbnQgKTsKKworICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICBpZiggbF9wb2ludFswXSA+PSAwICYmIGxfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgIHsKKworICAgICAgICBsX3N0YXJ0X2VuZFswXSA9IGxfcG9pbnRbMF07CisgICAgICAgIGxfc3RhcnRfZW5kWzFdID0gbF9wb2ludFsxXTsKKworICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgIHJfc3RhcnRfZW5kWzFdID0gcl9wb2ludFsxXTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCBsX3BvaW50WzBdIDwgMCApCisgICAgICAgIHsKKworICAgICAgICAgICAgbF9wb2ludFswXSA9IDA7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCBlcGlsaW5lICk7CisgICAgICAgICAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIHJfZGlhZ29uYWwsIGVwaWxpbmUsIHJfcG9pbnQgKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMV0gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiggbF9wb2ludFswXSA+IHdpZHRoICkgKi8KKworICAgICAgICAgICAgbF9wb2ludFswXSA9IChmbG9hdCkgd2lkdGg7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gMDsKKyAgICAgICAgICAgIGxfcG9pbnRbMl0gPSAxOworCisgICAgICAgICAgICBpY3ZNdWx0TWF0cml4VFZlY3RvcjMoIEYsIGxfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICAgICAgICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggcl9kaWFnb25hbCwgZXBpbGluZSwgcl9wb2ludCApOworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMV0gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgcl9wb2ludFswXSA9IChmbG9hdCkgd2lkdGg7CisgICAgcl9wb2ludFsxXSA9IChmbG9hdCkgaGVpZ2h0OworICAgIHJfcG9pbnRbMl0gPSAxOworCisgICAgaWN2TXVsdE1hdHJpeFZlY3RvcjMoIEYsIHJfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIGxfZGlhZ29uYWwsIGVwaWxpbmUsIGxfcG9pbnQgKTsKKyAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgaWYoIGxfcG9pbnRbMF0gPj0gMCAmJiBsX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICB7CisKKyAgICAgICAgbF9zdGFydF9lbmRbMl0gPSBsX3BvaW50WzBdOworICAgICAgICBsX3N0YXJ0X2VuZFszXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgcl9zdGFydF9lbmRbMl0gPSByX3BvaW50WzBdOworICAgICAgICByX3N0YXJ0X2VuZFszXSA9IHJfcG9pbnRbMV07CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBpZiggbF9wb2ludFswXSA8IDAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsxXSA9IChmbG9hdCkgaGVpZ2h0OworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMl0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzJdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFszXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmKCBsX3BvaW50WzBdID4gd2lkdGggKSAqLworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMl0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzJdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFszXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisgICAgICAgIH0KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZsR2V0U3RhcnRFbmQyICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRTdGFydEVuZDMoIEN2TWF0cml4MyAqIG1hdHJpeCwgQ3ZTaXplIGltZ1NpemUsIGZsb2F0ICpsX3N0YXJ0X2VuZCwgZmxvYXQgKnJfc3RhcnRfZW5kICkKK3sKKworICAgIEN2TWF0cml4MyAqRjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBmbG9hdCBsX2RpYWdvbmFsWzNdOworICAgIGZsb2F0IHJfZGlhZ29uYWxbM107CisgICAgZmxvYXQgbF9wb2ludFszXSwgcl9wb2ludFszXSwgZXBpbGluZVszXTsKKyAgICBDdlN0YXR1cyBlcnJvciA9IENWX09LOworCisgICAgRiA9IG1hdHJpeDsKKworICAgIHdpZHRoID0gaW1nU2l6ZS53aWR0aCAtIDE7CisgICAgaGVpZ2h0ID0gaW1nU2l6ZS5oZWlnaHQgLSAxOworCisgICAgbF9kaWFnb25hbFswXSA9IChmbG9hdCkgaGVpZ2h0IC8gd2lkdGg7CisgICAgbF9kaWFnb25hbFsxXSA9IC0xOworICAgIGxfZGlhZ29uYWxbMl0gPSAwOworCisgICAgcl9kaWFnb25hbFswXSA9IChmbG9hdCkgMSAvIHdpZHRoOworICAgIHJfZGlhZ29uYWxbMV0gPSAoZmxvYXQpIDEgLyBoZWlnaHQ7CisgICAgcl9kaWFnb25hbFsyXSA9IC0xOworCisgICAgcl9wb2ludFswXSA9IDA7CisgICAgcl9wb2ludFsxXSA9IDA7CisgICAgcl9wb2ludFsyXSA9IDE7CisKKyAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgZXBpbGluZSApOworCisgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCBsX2RpYWdvbmFsLCBlcGlsaW5lLCBsX3BvaW50ICk7CisKKyAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgaWYoIGxfcG9pbnRbMF0gPj0gMCAmJiBsX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICB7CisKKyAgICAgICAgbF9zdGFydF9lbmRbMF0gPSBsX3BvaW50WzBdOworICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgcl9zdGFydF9lbmRbMF0gPSByX3BvaW50WzBdOworICAgICAgICByX3N0YXJ0X2VuZFsxXSA9IHJfcG9pbnRbMV07CisKKyAgICB9CisgICAgZWxzZQorICAgIHsKKworICAgICAgICBpZiggbF9wb2ludFswXSA8IDAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsxXSA9IChmbG9hdCkgaGVpZ2h0OworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMF0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzFdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzBdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFsxXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmKCBsX3BvaW50WzBdID4gd2lkdGggKSAqLworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMF0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzFdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzBdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFsxXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICByX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICByX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgcl9wb2ludFsyXSA9IDE7CisKKyAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgZXBpbGluZSApOworICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggbF9kaWFnb25hbCwgZXBpbGluZSwgbF9wb2ludCApOworICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICBpZiggbF9wb2ludFswXSA+PSAwICYmIGxfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgIHsKKworICAgICAgICBsX3N0YXJ0X2VuZFsyXSA9IGxfcG9pbnRbMF07CisgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICByX3N0YXJ0X2VuZFsyXSA9IHJfcG9pbnRbMF07CisgICAgICAgIHJfc3RhcnRfZW5kWzNdID0gcl9wb2ludFsxXTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCBsX3BvaW50WzBdIDwgMCApCisgICAgICAgIHsKKworICAgICAgICAgICAgbF9wb2ludFswXSA9IDA7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCBlcGlsaW5lICk7CisKKyAgICAgICAgICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggcl9kaWFnb25hbCwgZXBpbGluZSwgcl9wb2ludCApOworCisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMl0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzJdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFszXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmKCBsX3BvaW50WzBdID4gd2lkdGggKSAqLworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworCisgICAgICAgICAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIHJfZGlhZ29uYWwsIGVwaWxpbmUsIHJfcG9pbnQgKTsKKworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzJdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFszXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFsyXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbM10gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgcmV0dXJuIGVycm9yOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGljdmxHZXRTdGFydEVuZDMgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ3ZTdGF0dXMKK2ljdkdldFN0YXJ0RW5kNCggQ3ZNYXRyaXgzICogbWF0cml4LCBDdlNpemUgaW1nU2l6ZSwgZmxvYXQgKmxfc3RhcnRfZW5kLCBmbG9hdCAqcl9zdGFydF9lbmQgKQoreworICAgIEN2TWF0cml4MyAqRjsKKyAgICBpbnQgd2lkdGgsIGhlaWdodDsKKyAgICBmbG9hdCBsX2RpYWdvbmFsWzNdOworICAgIGZsb2F0IHJfZGlhZ29uYWxbM107CisgICAgZmxvYXQgbF9wb2ludFszXSwgcl9wb2ludFszXSwgZXBpbGluZVszXTsKKyAgICBDdlN0YXR1cyBlcnJvcjsKKworICAgIEYgPSBtYXRyaXg7CisKKyAgICB3aWR0aCA9IGltZ1NpemUud2lkdGggLSAxOworICAgIGhlaWdodCA9IGltZ1NpemUuaGVpZ2h0IC0gMTsKKworICAgIGxfZGlhZ29uYWxbMF0gPSAoZmxvYXQpIGhlaWdodCAvIHdpZHRoOworICAgIGxfZGlhZ29uYWxbMV0gPSAtMTsKKyAgICBsX2RpYWdvbmFsWzJdID0gMDsKKworICAgIHJfZGlhZ29uYWxbMF0gPSAoZmxvYXQpIGhlaWdodCAvIHdpZHRoOworICAgIHJfZGlhZ29uYWxbMV0gPSAtMTsKKyAgICByX2RpYWdvbmFsWzJdID0gMDsKKworICAgIHJfcG9pbnRbMF0gPSAwOworICAgIHJfcG9pbnRbMV0gPSAwOworICAgIHJfcG9pbnRbMl0gPSAxOworCisgICAgaWN2TXVsdE1hdHJpeFZlY3RvcjMoIEYsIHJfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIGxfZGlhZ29uYWwsIGVwaWxpbmUsIGxfcG9pbnQgKTsKKworICAgIGlmKCBlcnJvciAhPSBDVl9OT19FUlIgKQorICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICBpZiggbF9wb2ludFswXSA+PSAwICYmIGxfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgIHsKKworICAgICAgICBsX3N0YXJ0X2VuZFswXSA9IGxfcG9pbnRbMF07CisgICAgICAgIGxfc3RhcnRfZW5kWzFdID0gbF9wb2ludFsxXTsKKworICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgIHJfc3RhcnRfZW5kWzFdID0gcl9wb2ludFsxXTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCBsX3BvaW50WzBdIDwgMCApCisgICAgICAgIHsKKworICAgICAgICAgICAgbF9wb2ludFswXSA9IDA7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gMDsKKyAgICAgICAgICAgIGxfcG9pbnRbMl0gPSAxOworCisgICAgICAgICAgICBpY3ZNdWx0TWF0cml4VFZlY3RvcjMoIEYsIGxfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICAgICAgICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggcl9kaWFnb25hbCwgZXBpbGluZSwgcl9wb2ludCApOworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFsxXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMV0gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiggbF9wb2ludFswXSA+IHdpZHRoICkgKi8KKworICAgICAgICAgICAgbF9wb2ludFswXSA9IChmbG9hdCkgd2lkdGg7CisgICAgICAgICAgICBsX3BvaW50WzFdID0gKGZsb2F0KSBoZWlnaHQ7CisgICAgICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCBlcGlsaW5lICk7CisgICAgICAgICAgICBlcnJvciA9IGljdkNyb3NzTGluZXMoIHJfZGlhZ29uYWwsIGVwaWxpbmUsIHJfcG9pbnQgKTsKKyAgICAgICAgICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICAgICAgICAgIGlmKCByX3BvaW50WzBdID49IDAgJiYgcl9wb2ludFswXSA8PSB3aWR0aCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFswXSA9IGxfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMV0gPSBsX3BvaW50WzFdOworCisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbMF0gPSByX3BvaW50WzBdOworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzFdID0gcl9wb2ludFsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIHJfcG9pbnRbMF0gPSAoZmxvYXQpIHdpZHRoOworICAgIHJfcG9pbnRbMV0gPSAoZmxvYXQpIGhlaWdodDsKKyAgICByX3BvaW50WzJdID0gMTsKKworICAgIGljdk11bHRNYXRyaXhWZWN0b3IzKCBGLCByX3BvaW50LCBlcGlsaW5lICk7CisgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCBsX2RpYWdvbmFsLCBlcGlsaW5lLCBsX3BvaW50ICk7CisgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgIGlmKCBsX3BvaW50WzBdID49IDAgJiYgbF9wb2ludFswXSA8PSB3aWR0aCApCisgICAgeworCisgICAgICAgIGxfc3RhcnRfZW5kWzJdID0gbF9wb2ludFswXTsKKyAgICAgICAgbF9zdGFydF9lbmRbM10gPSBsX3BvaW50WzFdOworCisgICAgICAgIHJfc3RhcnRfZW5kWzJdID0gcl9wb2ludFswXTsKKyAgICAgICAgcl9zdGFydF9lbmRbM10gPSByX3BvaW50WzFdOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisKKyAgICAgICAgaWYoIGxfcG9pbnRbMF0gPCAwICkKKyAgICAgICAgeworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gMDsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSAwOworICAgICAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICAgICAgZXJyb3IgPSBpY3ZDcm9zc0xpbmVzKCByX2RpYWdvbmFsLCBlcGlsaW5lLCByX3BvaW50ICk7CisgICAgICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgICAgICBpZiggcl9wb2ludFswXSA+PSAwICYmIHJfcG9pbnRbMF0gPD0gd2lkdGggKQorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMl0gPSBsX3BvaW50WzBdOworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzNdID0gbF9wb2ludFsxXTsKKworICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzJdID0gcl9wb2ludFswXTsKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFszXSA9IHJfcG9pbnRbMV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmKCBsX3BvaW50WzBdID4gd2lkdGggKSAqLworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gKGZsb2F0KSB3aWR0aDsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSAoZmxvYXQpIGhlaWdodDsKKyAgICAgICAgICAgIGxfcG9pbnRbMl0gPSAxOworCisgICAgICAgICAgICBpY3ZNdWx0TWF0cml4VFZlY3RvcjMoIEYsIGxfcG9pbnQsIGVwaWxpbmUgKTsKKyAgICAgICAgICAgIGVycm9yID0gaWN2Q3Jvc3NMaW5lcyggcl9kaWFnb25hbCwgZXBpbGluZSwgcl9wb2ludCApOworICAgICAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICAgICAgaWYoIHJfcG9pbnRbMF0gPj0gMCAmJiByX3BvaW50WzBdIDw9IHdpZHRoICkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzJdID0gbF9wb2ludFswXTsKKyAgICAgICAgICAgICAgICBsX3N0YXJ0X2VuZFszXSA9IGxfcG9pbnRbMV07CisKKyAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFsyXSA9IHJfcG9pbnRbMF07CisgICAgICAgICAgICAgICAgcl9zdGFydF9lbmRbM10gPSByX3BvaW50WzFdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgcmV0dXJuIENWX05PX0VSUjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZsR2V0U3RhcnRFbmQ0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZCdWlsZFNjYW5saW5lTGVmdCggQ3ZNYXRyaXgzICogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsIGZsb2F0ICpsX3N0YXJ0X2VuZCwgaW50ICpudW1saW5lcyApCit7CisgICAgaW50IHByZXdhcnBfaGVpZ2h0OworICAgIGZsb2F0IGxfcG9pbnRbM107CisgICAgZmxvYXQgcl9wb2ludFszXTsKKyAgICBmbG9hdCBoZWlnaHQ7CisgICAgZmxvYXQgZGVsdGFfeDsKKyAgICBmbG9hdCBkZWx0YV95OworICAgIEN2U3RhdHVzIGVycm9yID0gQ1ZfT0s7CisgICAgQ3ZNYXRyaXgzICpGOworICAgIGZsb2F0IGk7CisgICAgaW50IG9mZnNldDsKKyAgICBmbG9hdCBlcGlsaW5lWzNdOworICAgIGRvdWJsZSBhLCBiOworCisgICAgYXNzZXJ0KCBsX3N0YXJ0X2VuZCAhPSAwICk7CisKKyAgICBhID0gZmFicyggbF9zdGFydF9lbmRbMl0gLSBsX3N0YXJ0X2VuZFswXSApOworICAgIGIgPSBmYWJzKCBsX3N0YXJ0X2VuZFszXSAtIGxfc3RhcnRfZW5kWzFdICk7CisgICAgcHJld2FycF9oZWlnaHQgPSBjdlJvdW5kKCBNQVgoYSwgYikgKTsKKworICAgICpudW1saW5lcyA9IHByZXdhcnBfaGVpZ2h0OworCisgICAgaWYoIHNjYW5saW5lc18xID09IDAgJiYgc2NhbmxpbmVzXzIgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9OT19FUlI7CisKKyAgICBGID0gbWF0cml4OworCisKKyAgICBsX3BvaW50WzJdID0gMTsKKyAgICBoZWlnaHQgPSAoZmxvYXQpIHByZXdhcnBfaGVpZ2h0OworCisgICAgZGVsdGFfeCA9IChsX3N0YXJ0X2VuZFsyXSAtIGxfc3RhcnRfZW5kWzBdKSAvIGhlaWdodDsKKworICAgIGxfc3RhcnRfZW5kWzBdICs9IGRlbHRhX3g7CisgICAgbF9zdGFydF9lbmRbMl0gLT0gZGVsdGFfeDsKKworICAgIGRlbHRhX3ggPSAobF9zdGFydF9lbmRbMl0gLSBsX3N0YXJ0X2VuZFswXSkgLyBoZWlnaHQ7CisgICAgZGVsdGFfeSA9IChsX3N0YXJ0X2VuZFszXSAtIGxfc3RhcnRfZW5kWzFdKSAvIGhlaWdodDsKKworICAgIGxfc3RhcnRfZW5kWzFdICs9IGRlbHRhX3k7CisgICAgbF9zdGFydF9lbmRbM10gLT0gZGVsdGFfeTsKKworICAgIGRlbHRhX3kgPSAobF9zdGFydF9lbmRbM10gLSBsX3N0YXJ0X2VuZFsxXSkgLyBoZWlnaHQ7CisKKyAgICBmb3IoIGkgPSAwLCBvZmZzZXQgPSAwOyBpIDwgaGVpZ2h0OyBpKyssIG9mZnNldCArPSA0ICkKKyAgICB7CisKKyAgICAgICAgbF9wb2ludFswXSA9IGxfc3RhcnRfZW5kWzBdICsgaSAqIGRlbHRhX3g7CisgICAgICAgIGxfcG9pbnRbMV0gPSBsX3N0YXJ0X2VuZFsxXSArIGkgKiBkZWx0YV95OworCisgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworCisgICAgICAgIGVycm9yID0gaWN2R2V0Q3Jvc3NFcGlsaW5lRnJhbWUoIGltZ1NpemUsIGVwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzIgKyBvZmZzZXQgKyAzICk7CisKKworCisgICAgICAgIGFzc2VydCggZXJyb3IgPT0gQ1ZfTk9fRVJSICk7CisKKyAgICAgICAgcl9wb2ludFswXSA9IC0oZmxvYXQpICgqKHNjYW5saW5lc18yICsgb2Zmc2V0KSk7CisgICAgICAgIHJfcG9pbnRbMV0gPSAtKGZsb2F0KSAoKihzY2FubGluZXNfMiArIG9mZnNldCArIDEpKTsKKyAgICAgICAgcl9wb2ludFsyXSA9IC0xOworCisgICAgICAgIGljdk11bHRNYXRyaXhWZWN0b3IzKCBGLCByX3BvaW50LCBlcGlsaW5lICk7CisKKyAgICAgICAgZXJyb3IgPSBpY3ZHZXRDcm9zc0VwaWxpbmVGcmFtZSggaW1nU2l6ZSwgZXBpbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmVzXzEgKyBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0ICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmVzXzEgKyBvZmZzZXQgKyAyLCBzY2FubGluZXNfMSArIG9mZnNldCArIDMgKTsKKworICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmb3IgKi8KKworICAgICpudW1saW5lcyA9IHByZXdhcnBfaGVpZ2h0OworCisgICAgcmV0dXJuIGVycm9yOworCit9IC8qaWN2bEJ1aWxkU2NhbmxpbmVMZWZ0ICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZCdWlsZFNjYW5saW5lUmlnaHQoIEN2TWF0cml4MyAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsIGZsb2F0ICpyX3N0YXJ0X2VuZCwgaW50ICpudW1saW5lcyApCit7CisgICAgaW50IHByZXdhcnBfaGVpZ2h0OworICAgIGZsb2F0IGxfcG9pbnRbM107CisgICAgZmxvYXQgcl9wb2ludFszXTsKKyAgICBmbG9hdCBoZWlnaHQ7CisgICAgZmxvYXQgZGVsdGFfeDsKKyAgICBmbG9hdCBkZWx0YV95OworICAgIEN2U3RhdHVzIGVycm9yID0gQ1ZfT0s7CisgICAgQ3ZNYXRyaXgzICpGOworICAgIGZsb2F0IGk7CisgICAgaW50IG9mZnNldDsKKyAgICBmbG9hdCBlcGlsaW5lWzNdOworICAgIGRvdWJsZSBhLCBiOworCisgICAgYXNzZXJ0KCByX3N0YXJ0X2VuZCAhPSAwICk7CisKKyAgICBhID0gZmFicyggcl9zdGFydF9lbmRbMl0gLSByX3N0YXJ0X2VuZFswXSApOworICAgIGIgPSBmYWJzKCByX3N0YXJ0X2VuZFszXSAtIHJfc3RhcnRfZW5kWzFdICk7CisgICAgcHJld2FycF9oZWlnaHQgPSBjdlJvdW5kKCBNQVgoYSwgYikgKTsKKworICAgICpudW1saW5lcyA9IHByZXdhcnBfaGVpZ2h0OworCisgICAgaWYoIHNjYW5saW5lc18xID09IDAgJiYgc2NhbmxpbmVzXzIgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9OT19FUlI7CisKKyAgICBGID0gbWF0cml4OworCisgICAgcl9wb2ludFsyXSA9IDE7CisgICAgaGVpZ2h0ID0gKGZsb2F0KSBwcmV3YXJwX2hlaWdodDsKKworICAgIGRlbHRhX3ggPSAocl9zdGFydF9lbmRbMl0gLSByX3N0YXJ0X2VuZFswXSkgLyBoZWlnaHQ7CisKKyAgICByX3N0YXJ0X2VuZFswXSArPSBkZWx0YV94OworICAgIHJfc3RhcnRfZW5kWzJdIC09IGRlbHRhX3g7CisKKyAgICBkZWx0YV94ID0gKHJfc3RhcnRfZW5kWzJdIC0gcl9zdGFydF9lbmRbMF0pIC8gaGVpZ2h0OworICAgIGRlbHRhX3kgPSAocl9zdGFydF9lbmRbM10gLSByX3N0YXJ0X2VuZFsxXSkgLyBoZWlnaHQ7CisKKyAgICByX3N0YXJ0X2VuZFsxXSArPSBkZWx0YV95OworICAgIHJfc3RhcnRfZW5kWzNdIC09IGRlbHRhX3k7CisKKyAgICBkZWx0YV95ID0gKHJfc3RhcnRfZW5kWzNdIC0gcl9zdGFydF9lbmRbMV0pIC8gaGVpZ2h0OworCisgICAgZm9yKCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IGhlaWdodDsgaSsrLCBvZmZzZXQgKz0gNCApCisgICAgeworCisgICAgICAgIHJfcG9pbnRbMF0gPSByX3N0YXJ0X2VuZFswXSArIGkgKiBkZWx0YV94OworICAgICAgICByX3BvaW50WzFdID0gcl9zdGFydF9lbmRbMV0gKyBpICogZGVsdGFfeTsKKworICAgICAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgZXBpbGluZSApOworCisgICAgICAgIGVycm9yID0gaWN2R2V0Q3Jvc3NFcGlsaW5lRnJhbWUoIGltZ1NpemUsIGVwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMSArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzEgKyBvZmZzZXQgKyAzICk7CisKKworICAgICAgICBhc3NlcnQoIGVycm9yID09IENWX05PX0VSUiApOworCisgICAgICAgIGxfcG9pbnRbMF0gPSAtKGZsb2F0KSAoKihzY2FubGluZXNfMSArIG9mZnNldCkpOworICAgICAgICBsX3BvaW50WzFdID0gLShmbG9hdCkgKCooc2NhbmxpbmVzXzEgKyBvZmZzZXQgKyAxKSk7CisKKyAgICAgICAgbF9wb2ludFsyXSA9IC0xOworCisgICAgICAgIGljdk11bHRNYXRyaXhUVmVjdG9yMyggRiwgbF9wb2ludCwgZXBpbGluZSApOworICAgICAgICBlcnJvciA9IGljdkdldENyb3NzRXBpbGluZUZyYW1lKCBpbWdTaXplLCBlcGlsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiArIG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmxpbmVzXzIgKyBvZmZzZXQgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiArIG9mZnNldCArIDIsIHNjYW5saW5lc18yICsgb2Zmc2V0ICsgMyApOworCisKKyAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqbnVtbGluZXMgPSBwcmV3YXJwX2hlaWdodDsKKworICAgIHJldHVybiBlcnJvcjsKKworfSAvKmljdmxCdWlsZFNjYW5saW5lUmlnaHQgKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2RlZmluZSBBYnMoeCkgICAgICAgICAgICAgICggKHgpPDAgPyAtKHgpOih4KSApCisjZGVmaW5lIFNnbih4KSAgICAgICAgICAgICAgKCAoeCk8MCA/IC0xOjEgKSAgICAvKiBTZ24oMCkgPSAxICEgKi8KKworc3RhdGljIEN2U3RhdHVzCitpY3ZCdWlsZFNjYW5saW5lKCBDdlNpemUgaW1nU2l6ZSwgZmxvYXQgKmVwaWxpbmUsIGZsb2F0ICpreCwgZmxvYXQgKmN4LCBmbG9hdCAqa3ksIGZsb2F0ICpjeSApCit7CisgICAgZmxvYXQgcG9pbnRbNF1bMl0sIGQ7CisgICAgaW50IHNpZ25bNF0sIGk7CisKKyAgICBmbG9hdCB3aWR0aCwgaGVpZ2h0OworCisgICAgaWYoIFJFQUxfWkVSTyggZXBpbGluZVswXSApICYmIFJFQUxfWkVSTyggZXBpbGluZVsxXSApKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIHdpZHRoID0gKGZsb2F0KSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICBoZWlnaHQgPSAoZmxvYXQpIGltZ1NpemUuaGVpZ2h0IC0gMTsKKworICAgIHNpZ25bMF0gPSBTZ24oIGVwaWxpbmVbMl0gKTsKKyAgICBzaWduWzFdID0gU2duKCBlcGlsaW5lWzBdICogd2lkdGggKyBlcGlsaW5lWzJdICk7CisgICAgc2lnblsyXSA9IFNnbiggZXBpbGluZVsxXSAqIGhlaWdodCArIGVwaWxpbmVbMl0gKTsKKyAgICBzaWduWzNdID0gU2duKCBlcGlsaW5lWzBdICogd2lkdGggKyBlcGlsaW5lWzFdICogaGVpZ2h0ICsgZXBpbGluZVsyXSApOworCisgICAgaSA9IDA7CisKKyAgICBpZiggc2lnblswXSAqIHNpZ25bMV0gPCAwICkKKyAgICB7CisKKyAgICAgICAgcG9pbnRbaV1bMF0gPSAtZXBpbGluZVsyXSAvIGVwaWxpbmVbMF07CisgICAgICAgIHBvaW50W2ldWzFdID0gMDsKKyAgICAgICAgaSsrOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIHNpZ25bMF0gKiBzaWduWzJdIDwgMCApCisgICAgeworCisgICAgICAgIHBvaW50W2ldWzBdID0gMDsKKyAgICAgICAgcG9pbnRbaV1bMV0gPSAtZXBpbGluZVsyXSAvIGVwaWxpbmVbMV07CisgICAgICAgIGkrKzsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCBzaWduWzFdICogc2lnblszXSA8IDAgKQorICAgIHsKKworICAgICAgICBwb2ludFtpXVswXSA9IHdpZHRoOworICAgICAgICBwb2ludFtpXVsxXSA9IC0oZXBpbGluZVswXSAqIHdpZHRoICsgZXBpbGluZVsyXSkgLyBlcGlsaW5lWzFdOworICAgICAgICBpKys7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggc2lnblsyXSAqIHNpZ25bM10gPCAwICkKKyAgICB7CisKKyAgICAgICAgcG9pbnRbaV1bMF0gPSAtKGVwaWxpbmVbMV0gKiBoZWlnaHQgKyBlcGlsaW5lWzJdKSAvIGVwaWxpbmVbMF07CisgICAgICAgIHBvaW50W2ldWzFdID0gaGVpZ2h0OworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIHNpZ25bMF0gPT0gc2lnblsxXSAmJiBzaWduWzBdID09IHNpZ25bMl0gJiYgc2lnblswXSA9PSBzaWduWzNdICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBpZiggIWt4ICYmICFreSAmJiAhY3ggJiYgIWN5ICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBpZigga3ggJiYga3kgKQorICAgIHsKKworICAgICAgICAqa3ggPSAtZXBpbGluZVsxXTsKKyAgICAgICAgKmt5ID0gZXBpbGluZVswXTsKKworICAgICAgICBkID0gKGZsb2F0KSBNQVgoIEFicyggKmt4ICksIEFicyggKmt5ICkpOworCisgICAgICAgICpreCAvPSBkOworICAgICAgICAqa3kgLz0gZDsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCBjeCAmJiBjeSApCisgICAgeworCisgICAgICAgIGlmKCAocG9pbnRbMF1bMF0gLSBwb2ludFsxXVswXSkgKiBlcGlsaW5lWzFdICsKKyAgICAgICAgICAgIChwb2ludFsxXVsxXSAtIHBvaW50WzBdWzFdKSAqIGVwaWxpbmVbMF0gPiAwICkKKyAgICAgICAgeworCisgICAgICAgICAgICAqY3ggPSBwb2ludFswXVswXTsKKyAgICAgICAgICAgICpjeSA9IHBvaW50WzBdWzFdOworCisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisKKyAgICAgICAgICAgICpjeCA9IHBvaW50WzFdWzBdOworICAgICAgICAgICAgKmN5ID0gcG9pbnRbMV1bMV07CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGljdmxCdWlsZFNjYW5saW5lICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRDb2VmZmljaWVudFN0ZXJlbyggQ3ZNYXRyaXgzICogbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsX2VwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnJfZXBpcG9sZSwgaW50ICpzY2FubGluZXNfMSwgaW50ICpzY2FubGluZXNfMiwgaW50ICpudW1saW5lcyApCit7CisgICAgaW50IGksIGosIHR1cm47CisgICAgZmxvYXQgd2lkdGgsIGhlaWdodDsKKyAgICBmbG9hdCBsX2FuZ2xlWzJdLCByX2FuZ2xlWzJdOworICAgIGZsb2F0IGxfcmFkaXVzLCByX3JhZGl1czsKKyAgICBmbG9hdCByX3BvaW50WzNdLCBsX3BvaW50WzNdOworICAgIGZsb2F0IGxfZXBpbGluZVszXSwgcl9lcGlsaW5lWzNdLCB4LCB5OworICAgIGZsb2F0IHN3YXA7CisKKyAgICBmbG9hdCByYWRpdXMxLCByYWRpdXMyLCByYWRpdXMzLCByYWRpdXM0OworCisgICAgZmxvYXQgbF9zdGFydF9lbmRbNF0sIHJfc3RhcnRfZW5kWzRdOworICAgIEN2TWF0cml4MyAqRjsKKyAgICBDdlN0YXR1cyBlcnJvcjsKKyAgICBmbG9hdCBSZWdpb25bM11bM11bNF0gPSB7CisgICAgICAge3swLmYsIDAuZiwgMS5mLCAxLmZ9LCB7MC5mLCAxLmYsIDEuZiwgMS5mfSwgezAuZiwgMS5mLCAxLmYsIDAuZn19LAorICAgICAgICB7ezAuZiwgMC5mLCAwLmYsIDEuZn0sIHsyLmYsIDIuZiwgMi5mLCAyLmZ9LCB7MS5mLCAxLmYsIDEuZiwgMC5mfX0sCisgICAgICAgIHt7MS5mLCAwLmYsIDAuZiwgMS5mfSwgezEuZiwgMC5mLCAwLmYsIDAuZn0sIHsxLmYsIDEuZiwgMC5mLCAwLmZ9fQorICAgIH07CisKKworICAgIHdpZHRoID0gKGZsb2F0KSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICBoZWlnaHQgPSAoZmxvYXQpIGltZ1NpemUuaGVpZ2h0IC0gMTsKKworICAgIEYgPSBtYXRyaXg7CisKKyAgICBpZiggRi0+bVswXVswXSAqIEYtPm1bMV1bMV0gLSBGLT5tWzFdWzBdICogRi0+bVswXVsxXSA+IDAgKQorICAgICAgICB0dXJuID0gMTsKKyAgICBlbHNlCisgICAgICAgIHR1cm4gPSAtMTsKKworICAgIGlmKCBsX2VwaXBvbGVbMF0gPCAwICkKKyAgICAgICAgaSA9IDA7CisgICAgZWxzZSBpZiggbF9lcGlwb2xlWzBdIDwgd2lkdGggKQorICAgICAgICBpID0gMTsKKyAgICBlbHNlCisgICAgICAgIGkgPSAyOworCisgICAgaWYoIGxfZXBpcG9sZVsxXSA8IDAgKQorICAgICAgICBqID0gMjsKKyAgICBlbHNlIGlmKCBsX2VwaXBvbGVbMV0gPCBoZWlnaHQgKQorICAgICAgICBqID0gMTsKKyAgICBlbHNlCisgICAgICAgIGogPSAwOworCisgICAgbF9zdGFydF9lbmRbMF0gPSBSZWdpb25bal1baV1bMF07CisgICAgbF9zdGFydF9lbmRbMV0gPSBSZWdpb25bal1baV1bMV07CisgICAgbF9zdGFydF9lbmRbMl0gPSBSZWdpb25bal1baV1bMl07CisgICAgbF9zdGFydF9lbmRbM10gPSBSZWdpb25bal1baV1bM107CisKKyAgICBpZiggcl9lcGlwb2xlWzBdIDwgMCApCisgICAgICAgIGkgPSAwOworICAgIGVsc2UgaWYoIHJfZXBpcG9sZVswXSA8IHdpZHRoICkKKyAgICAgICAgaSA9IDE7CisgICAgZWxzZQorICAgICAgICBpID0gMjsKKworICAgIGlmKCByX2VwaXBvbGVbMV0gPCAwICkKKyAgICAgICAgaiA9IDI7CisgICAgZWxzZSBpZiggcl9lcGlwb2xlWzFdIDwgaGVpZ2h0ICkKKyAgICAgICAgaiA9IDE7CisgICAgZWxzZQorICAgICAgICBqID0gMDsKKworICAgIHJfc3RhcnRfZW5kWzBdID0gUmVnaW9uW2pdW2ldWzBdOworICAgIHJfc3RhcnRfZW5kWzFdID0gUmVnaW9uW2pdW2ldWzFdOworICAgIHJfc3RhcnRfZW5kWzJdID0gUmVnaW9uW2pdW2ldWzJdOworICAgIHJfc3RhcnRfZW5kWzNdID0gUmVnaW9uW2pdW2ldWzNdOworCisgICAgcmFkaXVzMSA9IGxfZXBpcG9sZVswXSAqIGxfZXBpcG9sZVswXSArIChsX2VwaXBvbGVbMV0gLSBoZWlnaHQpICogKGxfZXBpcG9sZVsxXSAtIGhlaWdodCk7CisKKyAgICByYWRpdXMyID0gKGxfZXBpcG9sZVswXSAtIHdpZHRoKSAqIChsX2VwaXBvbGVbMF0gLSB3aWR0aCkgKworICAgICAgICAobF9lcGlwb2xlWzFdIC0gaGVpZ2h0KSAqIChsX2VwaXBvbGVbMV0gLSBoZWlnaHQpOworCisgICAgcmFkaXVzMyA9IGxfZXBpcG9sZVswXSAqIGxfZXBpcG9sZVswXSArIGxfZXBpcG9sZVsxXSAqIGxfZXBpcG9sZVsxXTsKKworICAgIHJhZGl1czQgPSAobF9lcGlwb2xlWzBdIC0gd2lkdGgpICogKGxfZXBpcG9sZVswXSAtIHdpZHRoKSArIGxfZXBpcG9sZVsxXSAqIGxfZXBpcG9sZVsxXTsKKworCisgICAgbF9yYWRpdXMgPSAoZmxvYXQpIHNxcnQoIChkb3VibGUpTUFYKCBNQVgoIHJhZGl1czEsIHJhZGl1czIgKSwgTUFYKCByYWRpdXMzLCByYWRpdXM0ICkpKTsKKworICAgIHJhZGl1czEgPSByX2VwaXBvbGVbMF0gKiByX2VwaXBvbGVbMF0gKyAocl9lcGlwb2xlWzFdIC0gaGVpZ2h0KSAqIChyX2VwaXBvbGVbMV0gLSBoZWlnaHQpOworCisgICAgcmFkaXVzMiA9IChyX2VwaXBvbGVbMF0gLSB3aWR0aCkgKiAocl9lcGlwb2xlWzBdIC0gd2lkdGgpICsKKyAgICAgICAgKHJfZXBpcG9sZVsxXSAtIGhlaWdodCkgKiAocl9lcGlwb2xlWzFdIC0gaGVpZ2h0KTsKKworICAgIHJhZGl1czMgPSByX2VwaXBvbGVbMF0gKiByX2VwaXBvbGVbMF0gKyByX2VwaXBvbGVbMV0gKiByX2VwaXBvbGVbMV07CisKKyAgICByYWRpdXM0ID0gKHJfZXBpcG9sZVswXSAtIHdpZHRoKSAqIChyX2VwaXBvbGVbMF0gLSB3aWR0aCkgKyByX2VwaXBvbGVbMV0gKiByX2VwaXBvbGVbMV07CisKKworICAgIHJfcmFkaXVzID0gKGZsb2F0KSBzcXJ0KCAoZG91YmxlKU1BWCggTUFYKCByYWRpdXMxLCByYWRpdXMyICksIE1BWCggcmFkaXVzMywgcmFkaXVzNCApKSk7CisKKyAgICBpZiggbF9zdGFydF9lbmRbMF0gPT0gMiAmJiByX3N0YXJ0X2VuZFswXSA9PSAyICkKKworICAgICAgICBpZiggbF9yYWRpdXMgPiByX3JhZGl1cyApCisgICAgICAgIHsKKworICAgICAgICAgICAgbF9hbmdsZVswXSA9IDAuMGY7CisgICAgICAgICAgICBsX2FuZ2xlWzFdID0gKGZsb2F0KSBDVl9QSTsKKworICAgICAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lTGVmdFN0ZXJlbyggaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX3JhZGl1cywgc2NhbmxpbmVzXzEsIHNjYW5saW5lc18yLCBudW1saW5lcyApOworCisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKworICAgICAgICAgICAgcl9hbmdsZVswXSA9IDAuMGY7CisgICAgICAgICAgICByX2FuZ2xlWzFdID0gKGZsb2F0KSBDVl9QSTsKKworICAgICAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lUmlnaHRTdGVyZW8oIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xLCBzY2FubGluZXNfMiwgbnVtbGluZXMgKTsKKworICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIGxfc3RhcnRfZW5kWzBdID09IDIgKQorICAgIHsKKworICAgICAgICByX2FuZ2xlWzBdID0gKGZsb2F0KSBhdGFuMiggcl9zdGFydF9lbmRbMV0gKiBoZWlnaHQgLSByX2VwaXBvbGVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByX3N0YXJ0X2VuZFswXSAqIHdpZHRoIC0gcl9lcGlwb2xlWzBdICk7CisgICAgICAgIHJfYW5nbGVbMV0gPSAoZmxvYXQpIGF0YW4yKCByX3N0YXJ0X2VuZFszXSAqIGhlaWdodCAtIHJfZXBpcG9sZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfc3RhcnRfZW5kWzJdICogd2lkdGggLSByX2VwaXBvbGVbMF0gKTsKKworICAgICAgICBpZiggcl9hbmdsZVswXSA+IHJfYW5nbGVbMV0gKQorICAgICAgICAgICAgcl9hbmdsZVsxXSArPSAoZmxvYXQpIChDVl9QSSAqIDIpOworCisgICAgICAgIGVycm9yID0gaWN2QnVpbGRTY2FubGluZVJpZ2h0U3RlcmVvKCBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9lcGlwb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcmFkaXVzLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisKKyAgICAgICAgcmV0dXJuIGVycm9yOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIHJfc3RhcnRfZW5kWzBdID09IDIgKQorICAgIHsKKworICAgICAgICBsX3BvaW50WzBdID0gbF9zdGFydF9lbmRbMF0gKiB3aWR0aDsKKyAgICAgICAgbF9wb2ludFsxXSA9IGxfc3RhcnRfZW5kWzFdICogaGVpZ2h0OworICAgICAgICBsX3BvaW50WzJdID0gMTsKKworICAgICAgICBpY3ZNdWx0TWF0cml4VFZlY3RvcjMoIEYsIGxfcG9pbnQsIHJfZXBpbGluZSApOworCisgICAgICAgIGxfYW5nbGVbMF0gPSAoZmxvYXQpIGF0YW4yKCBsX3N0YXJ0X2VuZFsxXSAqIGhlaWdodCAtIGxfZXBpcG9sZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc3RhcnRfZW5kWzBdICogd2lkdGggLSBsX2VwaXBvbGVbMF0gKTsKKyAgICAgICAgbF9hbmdsZVsxXSA9IChmbG9hdCkgYXRhbjIoIGxfc3RhcnRfZW5kWzNdICogaGVpZ2h0IC0gbF9lcGlwb2xlWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zdGFydF9lbmRbMl0gKiB3aWR0aCAtIGxfZXBpcG9sZVswXSApOworCisgICAgICAgIGlmKCBsX2FuZ2xlWzBdID4gbF9hbmdsZVsxXSApCisgICAgICAgICAgICBsX2FuZ2xlWzFdICs9IChmbG9hdCkgKENWX1BJICogMik7CisKKyAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lTGVmdFN0ZXJlbyggaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2VwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcmFkaXVzLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisKKyAgICAgICAgcmV0dXJuIGVycm9yOworCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBsX3N0YXJ0X2VuZFswXSAqPSB3aWR0aDsKKyAgICBsX3N0YXJ0X2VuZFsxXSAqPSBoZWlnaHQ7CisgICAgbF9zdGFydF9lbmRbMl0gKj0gd2lkdGg7CisgICAgbF9zdGFydF9lbmRbM10gKj0gaGVpZ2h0OworCisgICAgcl9zdGFydF9lbmRbMF0gKj0gd2lkdGg7CisgICAgcl9zdGFydF9lbmRbMV0gKj0gaGVpZ2h0OworICAgIHJfc3RhcnRfZW5kWzJdICo9IHdpZHRoOworICAgIHJfc3RhcnRfZW5kWzNdICo9IGhlaWdodDsKKworICAgIHJfcG9pbnRbMF0gPSByX3N0YXJ0X2VuZFswXTsKKyAgICByX3BvaW50WzFdID0gcl9zdGFydF9lbmRbMV07CisgICAgcl9wb2ludFsyXSA9IDE7CisKKyAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgbF9lcGlsaW5lICk7CisgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lKCBpbWdTaXplLCBsX2VwaWxpbmUsIDAsICZ4LCAwLCAmeSApOworCisgICAgaWYoIGVycm9yID09IENWX05PX0VSUiApCisgICAgeworCisgICAgICAgIGxfYW5nbGVbMF0gPSAoZmxvYXQpIGF0YW4yKCB5IC0gbF9lcGlwb2xlWzFdLCB4IC0gbF9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgcl9hbmdsZVswXSA9IChmbG9hdCkgYXRhbjIoIHJfcG9pbnRbMV0gLSByX2VwaXBvbGVbMV0sIHJfcG9pbnRbMF0gLSByX2VwaXBvbGVbMF0gKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCB0dXJuID09IDEgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSBsX3N0YXJ0X2VuZFswXTsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSBsX3N0YXJ0X2VuZFsxXTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gbF9zdGFydF9lbmRbMl07CisgICAgICAgICAgICBsX3BvaW50WzFdID0gbF9zdGFydF9lbmRbM107CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCByX2VwaWxpbmUgKTsKKyAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lKCBpbWdTaXplLCByX2VwaWxpbmUsIDAsICZ4LCAwLCAmeSApOworCisgICAgICAgIGlmKCBlcnJvciA9PSBDVl9OT19FUlIgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHJfYW5nbGVbMF0gPSAoZmxvYXQpIGF0YW4yKCB5IC0gcl9lcGlwb2xlWzFdLCB4IC0gcl9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgICAgIGxfYW5nbGVbMF0gPSAoZmxvYXQpIGF0YW4yKCBsX3BvaW50WzFdIC0gbF9lcGlwb2xlWzFdLCBsX3BvaW50WzBdIC0gbF9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIHJfcG9pbnRbMF0gPSByX3N0YXJ0X2VuZFsyXTsKKyAgICByX3BvaW50WzFdID0gcl9zdGFydF9lbmRbM107CisgICAgcl9wb2ludFsyXSA9IDE7CisKKyAgICBpY3ZNdWx0TWF0cml4VmVjdG9yMyggRiwgcl9wb2ludCwgbF9lcGlsaW5lICk7CisgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lKCBpbWdTaXplLCBsX2VwaWxpbmUsIDAsICZ4LCAwLCAmeSApOworCisgICAgaWYoIGVycm9yID09IENWX05PX0VSUiApCisgICAgeworCisgICAgICAgIGxfYW5nbGVbMV0gPSAoZmxvYXQpIGF0YW4yKCB5IC0gbF9lcGlwb2xlWzFdLCB4IC0gbF9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgcl9hbmdsZVsxXSA9IChmbG9hdCkgYXRhbjIoIHJfcG9pbnRbMV0gLSByX2VwaXBvbGVbMV0sIHJfcG9pbnRbMF0gLSByX2VwaXBvbGVbMF0gKTsKKworICAgIH0KKyAgICBlbHNlCisgICAgeworCisgICAgICAgIGlmKCB0dXJuID09IDEgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfcG9pbnRbMF0gPSBsX3N0YXJ0X2VuZFsyXTsKKyAgICAgICAgICAgIGxfcG9pbnRbMV0gPSBsX3N0YXJ0X2VuZFszXTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworCisgICAgICAgICAgICBsX3BvaW50WzBdID0gbF9zdGFydF9lbmRbMF07CisgICAgICAgICAgICBsX3BvaW50WzFdID0gbF9zdGFydF9lbmRbMV07CisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICAgICAgbF9wb2ludFsyXSA9IDE7CisKKyAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCByX2VwaWxpbmUgKTsKKyAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lKCBpbWdTaXplLCByX2VwaWxpbmUsIDAsICZ4LCAwLCAmeSApOworCisgICAgICAgIGlmKCBlcnJvciA9PSBDVl9OT19FUlIgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHJfYW5nbGVbMV0gPSAoZmxvYXQpIGF0YW4yKCB5IC0gcl9lcGlwb2xlWzFdLCB4IC0gcl9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgICAgIGxfYW5nbGVbMV0gPSAoZmxvYXQpIGF0YW4yKCBsX3BvaW50WzFdIC0gbF9lcGlwb2xlWzFdLCBsX3BvaW50WzBdIC0gbF9lcGlwb2xlWzBdICk7CisKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCBsX2FuZ2xlWzBdID4gbF9hbmdsZVsxXSApCisgICAgeworCisgICAgICAgIHN3YXAgPSBsX2FuZ2xlWzBdOworICAgICAgICBsX2FuZ2xlWzBdID0gbF9hbmdsZVsxXTsKKyAgICAgICAgbF9hbmdsZVsxXSA9IHN3YXA7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggbF9hbmdsZVsxXSAtIGxfYW5nbGVbMF0gPiBDVl9QSSApCisgICAgeworCisgICAgICAgIHN3YXAgPSBsX2FuZ2xlWzBdOworICAgICAgICBsX2FuZ2xlWzBdID0gbF9hbmdsZVsxXTsKKyAgICAgICAgbF9hbmdsZVsxXSA9IHN3YXAgKyAoZmxvYXQpIChDVl9QSSAqIDIpOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIHJfYW5nbGVbMF0gPiByX2FuZ2xlWzFdICkKKyAgICB7CisKKyAgICAgICAgc3dhcCA9IHJfYW5nbGVbMF07CisgICAgICAgIHJfYW5nbGVbMF0gPSByX2FuZ2xlWzFdOworICAgICAgICByX2FuZ2xlWzFdID0gc3dhcDsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCByX2FuZ2xlWzFdIC0gcl9hbmdsZVswXSA+IENWX1BJICkKKyAgICB7CisKKyAgICAgICAgc3dhcCA9IHJfYW5nbGVbMF07CisgICAgICAgIHJfYW5nbGVbMF0gPSByX2FuZ2xlWzFdOworICAgICAgICByX2FuZ2xlWzFdID0gc3dhcCArIChmbG9hdCkgKENWX1BJICogMik7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggbF9yYWRpdXMgKiAobF9hbmdsZVsxXSAtIGxfYW5nbGVbMF0pID4gcl9yYWRpdXMgKiAocl9hbmdsZVsxXSAtIHJfYW5nbGVbMF0pICkKKyAgICAgICAgZXJyb3IgPSBpY3ZCdWlsZFNjYW5saW5lTGVmdFN0ZXJlbyggaW1nU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsX2VwaXBvbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfcmFkaXVzLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisKKyAgICBlbHNlCisgICAgICAgIGVycm9yID0gaWN2QnVpbGRTY2FubGluZVJpZ2h0U3RlcmVvKCBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9lcGlwb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcl9hbmdsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJfcmFkaXVzLCBzY2FubGluZXNfMSwgc2NhbmxpbmVzXzIsIG51bWxpbmVzICk7CisKKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZHZXRDb2VmZmljaWVudFN0ZXJlbyAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitDdlN0YXR1cworaWN2QnVpbGRTY2FubGluZUxlZnRTdGVyZW8oIEN2U2l6ZSBpbWdTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqbF9lcGlwb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpsX2FuZ2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGxfcmFkaXVzLCBpbnQgKnNjYW5saW5lc18xLCBpbnQgKnNjYW5saW5lc18yLCBpbnQgKm51bWxpbmVzICkKK3sKKyAgICAvL2ludCBwcmV3YXJwX3dpZHRoOworICAgIGludCBwcmV3YXJwX2hlaWdodDsKKyAgICBmbG9hdCBpOworICAgIGludCBvZmZzZXQ7CisgICAgZmxvYXQgaGVpZ2h0OworICAgIGZsb2F0IGRlbHRhOworICAgIGZsb2F0IGFuZ2xlOworICAgIGZsb2F0IGxfcG9pbnRbM107CisgICAgZmxvYXQgbF9lcGlsaW5lWzNdOworICAgIGZsb2F0IHJfZXBpbGluZVszXTsKKyAgICBDdlN0YXR1cyBlcnJvciA9IENWX09LOworICAgIEN2TWF0cml4MyAqRjsKKworCisgICAgYXNzZXJ0KCBsX2FuZ2xlICE9IDAgJiYgIVJFQUxfWkVSTyggbF9yYWRpdXMgKSk7CisKKyAgICAvKnByZXdhcnBfd2lkdGggPSAoaW50KSAoc3FydCggaW1hZ2Vfd2lkdGggKiBpbWFnZV93aWR0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9oZWlnaHQgKiBpbWFnZV9oZWlnaHQgKSArIDEpOyovCisKKyAgICBwcmV3YXJwX2hlaWdodCA9IChpbnQpIChsX3JhZGl1cyAqIChsX2FuZ2xlWzFdIC0gbF9hbmdsZVswXSkpOworCisgICAgKm51bWxpbmVzID0gcHJld2FycF9oZWlnaHQ7CisKKyAgICBpZiggc2NhbmxpbmVzXzEgPT0gMCAmJiBzY2FubGluZXNfMiA9PSAwICkKKyAgICAgICAgcmV0dXJuIENWX05PX0VSUjsKKworICAgIEYgPSBtYXRyaXg7CisKKyAgICBsX3BvaW50WzJdID0gMTsKKyAgICBoZWlnaHQgPSAoZmxvYXQpIHByZXdhcnBfaGVpZ2h0OworCisgICAgZGVsdGEgPSAobF9hbmdsZVsxXSAtIGxfYW5nbGVbMF0pIC8gaGVpZ2h0OworCisgICAgbF9hbmdsZVswXSArPSBkZWx0YTsKKyAgICBsX2FuZ2xlWzFdIC09IGRlbHRhOworCisgICAgZGVsdGEgPSAobF9hbmdsZVsxXSAtIGxfYW5nbGVbMF0pIC8gaGVpZ2h0OworCisgICAgZm9yKCBpID0gMCwgb2Zmc2V0ID0gMDsgaSA8IGhlaWdodDsgaSsrLCBvZmZzZXQgKz0gNCApCisgICAgeworCisgICAgICAgIGFuZ2xlID0gbF9hbmdsZVswXSArIGkgKiBkZWx0YTsKKworICAgICAgICBsX3BvaW50WzBdID0gbF9lcGlwb2xlWzBdICsgbF9yYWRpdXMgKiAoZmxvYXQpIGNvcyggYW5nbGUgKTsKKyAgICAgICAgbF9wb2ludFsxXSA9IGxfZXBpcG9sZVsxXSArIGxfcmFkaXVzICogKGZsb2F0KSBzaW4oIGFuZ2xlICk7CisKKyAgICAgICAgaWN2TXVsdE1hdHJpeFRWZWN0b3IzKCBGLCBsX3BvaW50LCByX2VwaWxpbmUgKTsKKworICAgICAgICBlcnJvciA9IGljdkdldENyb3NzRXBpbGluZUZyYW1lKCBpbWdTaXplLCByX2VwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzIgKyBvZmZzZXQgKyAzICk7CisKKworICAgICAgICBsX2VwaWxpbmVbMF0gPSBsX3BvaW50WzFdIC0gbF9lcGlwb2xlWzFdOworICAgICAgICBsX2VwaWxpbmVbMV0gPSBsX2VwaXBvbGVbMF0gLSBsX3BvaW50WzBdOworICAgICAgICBsX2VwaWxpbmVbMl0gPSBsX3BvaW50WzBdICogbF9lcGlwb2xlWzFdIC0gbF9wb2ludFsxXSAqIGxfZXBpcG9sZVswXTsKKworICAgICAgICBpZiggU2duKCBsX2VwaWxpbmVbMF0gKiByX2VwaWxpbmVbMF0gKyBsX2VwaWxpbmVbMV0gKiByX2VwaWxpbmVbMV0gKSA8IDAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIGxfZXBpbGluZVswXSA9IC1sX2VwaWxpbmVbMF07CisgICAgICAgICAgICBsX2VwaWxpbmVbMV0gPSAtbF9lcGlsaW5lWzFdOworICAgICAgICAgICAgbF9lcGlsaW5lWzJdID0gLWxfZXBpbGluZVsyXTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICBlcnJvciA9IGljdkdldENyb3NzRXBpbGluZUZyYW1lKCBpbWdTaXplLCBsX2VwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMSArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzEgKyBvZmZzZXQgKyAzICk7CisKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqbnVtbGluZXMgPSBwcmV3YXJwX2hlaWdodDsKKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZsQnVpbGRTY2FubGluZUxlZnRTdGVyZW8gKi8KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworQ3ZTdGF0dXMKK2ljdkJ1aWxkU2NhbmxpbmVSaWdodFN0ZXJlbyggQ3ZTaXplIGltZ1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0cml4MyAqIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnJfZXBpcG9sZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKnJfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJfcmFkaXVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnNjYW5saW5lc18xLCBpbnQgKnNjYW5saW5lc18yLCBpbnQgKm51bWxpbmVzICkKK3sKKyAgICAvL2ludCBwcmV3YXJwX3dpZHRoOworICAgIGludCBwcmV3YXJwX2hlaWdodDsKKyAgICBmbG9hdCBpOworICAgIGludCBvZmZzZXQ7CisgICAgZmxvYXQgaGVpZ2h0OworICAgIGZsb2F0IGRlbHRhOworICAgIGZsb2F0IGFuZ2xlOworICAgIGZsb2F0IHJfcG9pbnRbM107CisgICAgZmxvYXQgbF9lcGlsaW5lWzNdOworICAgIGZsb2F0IHJfZXBpbGluZVszXTsKKyAgICBDdlN0YXR1cyBlcnJvciA9IENWX09LOworICAgIEN2TWF0cml4MyAqRjsKKworICAgIGFzc2VydCggcl9hbmdsZSAhPSAwICYmICFSRUFMX1pFUk8oIHJfcmFkaXVzICkpOworCisgICAgLypwcmV3YXJwX3dpZHRoID0gKGludCkgKHNxcnQoIGltYWdlX3dpZHRoICogaW1hZ2Vfd2lkdGggKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VfaGVpZ2h0ICogaW1hZ2VfaGVpZ2h0ICkgKyAxKTsqLworCisgICAgcHJld2FycF9oZWlnaHQgPSAoaW50KSAocl9yYWRpdXMgKiAocl9hbmdsZVsxXSAtIHJfYW5nbGVbMF0pKTsKKworICAgICpudW1saW5lcyA9IHByZXdhcnBfaGVpZ2h0OworCisgICAgaWYoIHNjYW5saW5lc18xID09IDAgJiYgc2NhbmxpbmVzXzIgPT0gMCApCisgICAgICAgIHJldHVybiBDVl9OT19FUlI7CisKKyAgICBGID0gbWF0cml4OworCisgICAgcl9wb2ludFsyXSA9IDE7CisgICAgaGVpZ2h0ID0gKGZsb2F0KSBwcmV3YXJwX2hlaWdodDsKKworICAgIGRlbHRhID0gKHJfYW5nbGVbMV0gLSByX2FuZ2xlWzBdKSAvIGhlaWdodDsKKworICAgIHJfYW5nbGVbMF0gKz0gZGVsdGE7CisgICAgcl9hbmdsZVsxXSAtPSBkZWx0YTsKKworICAgIGRlbHRhID0gKHJfYW5nbGVbMV0gLSByX2FuZ2xlWzBdKSAvIGhlaWdodDsKKworICAgIGZvciggaSA9IDAsIG9mZnNldCA9IDA7IGkgPCBoZWlnaHQ7IGkrKywgb2Zmc2V0ICs9IDQgKQorICAgIHsKKworICAgICAgICBhbmdsZSA9IHJfYW5nbGVbMF0gKyBpICogZGVsdGE7CisKKyAgICAgICAgcl9wb2ludFswXSA9IHJfZXBpcG9sZVswXSArIHJfcmFkaXVzICogKGZsb2F0KSBjb3MoIGFuZ2xlICk7CisgICAgICAgIHJfcG9pbnRbMV0gPSByX2VwaXBvbGVbMV0gKyByX3JhZGl1cyAqIChmbG9hdCkgc2luKCBhbmdsZSApOworCisgICAgICAgIGljdk11bHRNYXRyaXhWZWN0b3IzKCBGLCByX3BvaW50LCBsX2VwaWxpbmUgKTsKKworICAgICAgICBlcnJvciA9IGljdkdldENyb3NzRXBpbGluZUZyYW1lKCBpbWdTaXplLCBsX2VwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMSArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18xICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzEgKyBvZmZzZXQgKyAzICk7CisKKyAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKworICAgICAgICByX2VwaWxpbmVbMF0gPSByX3BvaW50WzFdIC0gcl9lcGlwb2xlWzFdOworICAgICAgICByX2VwaWxpbmVbMV0gPSByX2VwaXBvbGVbMF0gLSByX3BvaW50WzBdOworICAgICAgICByX2VwaWxpbmVbMl0gPSByX3BvaW50WzBdICogcl9lcGlwb2xlWzFdIC0gcl9wb2ludFsxXSAqIHJfZXBpcG9sZVswXTsKKworICAgICAgICBpZiggU2duKCBsX2VwaWxpbmVbMF0gKiByX2VwaWxpbmVbMF0gKyBsX2VwaWxpbmVbMV0gKiByX2VwaWxpbmVbMV0gKSA8IDAgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIHJfZXBpbGluZVswXSA9IC1yX2VwaWxpbmVbMF07CisgICAgICAgICAgICByX2VwaWxpbmVbMV0gPSAtcl9lcGlsaW5lWzFdOworICAgICAgICAgICAgcl9lcGlsaW5lWzJdID0gLXJfZXBpbGluZVsyXTsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgICAgICBlcnJvciA9IGljdkdldENyb3NzRXBpbGluZUZyYW1lKCBpbWdTaXplLCByX2VwaWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiArIG9mZnNldCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5saW5lc18yICsgb2Zmc2V0ICsgMiwgc2NhbmxpbmVzXzIgKyBvZmZzZXQgKyAzICk7CisKKyAgICAgICAgYXNzZXJ0KCBlcnJvciA9PSBDVl9OT19FUlIgKTsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisKKyAgICAqbnVtbGluZXMgPSBwcmV3YXJwX2hlaWdodDsKKworICAgIHJldHVybiBlcnJvcjsKKworfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpY3ZsQnVpbGRTY2FubGluZVJpZ2h0U3RlcmVvICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK0N2U3RhdHVzCitpY3ZHZXRDcm9zc0VwaWxpbmVGcmFtZSggQ3ZTaXplIGltZ1NpemUsIGZsb2F0ICplcGlsaW5lLCBpbnQgKngxLCBpbnQgKnkxLCBpbnQgKngyLCBpbnQgKnkyICkKK3sKKyAgICBpbnQgdHgsIHR5OworICAgIGZsb2F0IHBvaW50WzJdWzJdOworICAgIGludCBzaWduWzRdLCBpOworICAgIGZsb2F0IHdpZHRoLCBoZWlnaHQ7CisgICAgZG91YmxlIHRtcHZhbHVlOworCisgICAgaWYoIFJFQUxfWkVSTyggZXBpbGluZVswXSApICYmIFJFQUxfWkVSTyggZXBpbGluZVsxXSApKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIHdpZHRoID0gKGZsb2F0KSBpbWdTaXplLndpZHRoIC0gMTsKKyAgICBoZWlnaHQgPSAoZmxvYXQpIGltZ1NpemUuaGVpZ2h0IC0gMTsKKworICAgIHRtcHZhbHVlID0gZXBpbGluZVsyXTsKKyAgICBzaWduWzBdID0gU0lHTiggdG1wdmFsdWUgKTsKKworICAgIHRtcHZhbHVlID0gZXBpbGluZVswXSAqIHdpZHRoICsgZXBpbGluZVsyXTsKKyAgICBzaWduWzFdID0gU0lHTiggdG1wdmFsdWUgKTsKKworICAgIHRtcHZhbHVlID0gZXBpbGluZVsxXSAqIGhlaWdodCArIGVwaWxpbmVbMl07CisgICAgc2lnblsyXSA9IFNJR04oIHRtcHZhbHVlICk7CisKKyAgICB0bXB2YWx1ZSA9IGVwaWxpbmVbMF0gKiB3aWR0aCArIGVwaWxpbmVbMV0gKiBoZWlnaHQgKyBlcGlsaW5lWzJdOworICAgIHNpZ25bM10gPSBTSUdOKCB0bXB2YWx1ZSApOworCisgICAgaSA9IDA7CisgICAgZm9yKCB0eCA9IDA7IHR4IDwgMjsgdHgrKyApCisgICAgeworICAgICAgICBmb3IoIHR5ID0gMDsgdHkgPCAyOyB0eSsrICkKKyAgICAgICAgeworCisgICAgICAgICAgICBpZiggc2lnblt0eSAqIDIgKyB0eF0gPT0gMCApCisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgICAgICBwb2ludFtpXVswXSA9IHdpZHRoICogdHg7CisgICAgICAgICAgICAgICAgcG9pbnRbaV1bMV0gPSBoZWlnaHQgKiB0eTsKKyAgICAgICAgICAgICAgICBpKys7CisKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yICovCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvciAqLworCisgICAgaWYoIHNpZ25bMF0gKiBzaWduWzFdIDwgMCApCisgICAgeworICAgICAgICBwb2ludFtpXVswXSA9IC1lcGlsaW5lWzJdIC8gZXBpbGluZVswXTsKKyAgICAgICAgcG9pbnRbaV1bMV0gPSAwOworICAgICAgICBpKys7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggc2lnblswXSAqIHNpZ25bMl0gPCAwICkKKyAgICB7CisgICAgICAgIHBvaW50W2ldWzBdID0gMDsKKyAgICAgICAgcG9pbnRbaV1bMV0gPSAtZXBpbGluZVsyXSAvIGVwaWxpbmVbMV07CisgICAgICAgIGkrKzsKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgKi8KKworICAgIGlmKCBzaWduWzFdICogc2lnblszXSA8IDAgKQorICAgIHsKKyAgICAgICAgcG9pbnRbaV1bMF0gPSB3aWR0aDsKKyAgICAgICAgcG9pbnRbaV1bMV0gPSAtKGVwaWxpbmVbMF0gKiB3aWR0aCArIGVwaWxpbmVbMl0pIC8gZXBpbGluZVsxXTsKKyAgICAgICAgaSsrOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgaWYoIHNpZ25bMl0gKiBzaWduWzNdIDwgMCApCisgICAgeworICAgICAgICBwb2ludFtpXVswXSA9IC0oZXBpbGluZVsxXSAqIGhlaWdodCArIGVwaWxpbmVbMl0pIC8gZXBpbGluZVswXTsKKyAgICAgICAgcG9pbnRbaV1bMV0gPSBoZWlnaHQ7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmICovCisKKyAgICBpZiggc2lnblswXSA9PSBzaWduWzFdICYmIHNpZ25bMF0gPT0gc2lnblsyXSAmJiBzaWduWzBdID09IHNpZ25bM10gKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIGlmKCAocG9pbnRbMF1bMF0gLSBwb2ludFsxXVswXSkgKiBlcGlsaW5lWzFdICsKKyAgICAgICAgKHBvaW50WzFdWzFdIC0gcG9pbnRbMF1bMV0pICogZXBpbGluZVswXSA+IDAgKQorICAgIHsKKyAgICAgICAgKngxID0gKGludCkgcG9pbnRbMF1bMF07CisgICAgICAgICp5MSA9IChpbnQpIHBvaW50WzBdWzFdOworICAgICAgICAqeDIgPSAoaW50KSBwb2ludFsxXVswXTsKKyAgICAgICAgKnkyID0gKGludCkgcG9pbnRbMV1bMV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgICp4MSA9IChpbnQpIHBvaW50WzFdWzBdOworICAgICAgICAqeTEgPSAoaW50KSBwb2ludFsxXVsxXTsKKyAgICAgICAgKngyID0gKGludCkgcG9pbnRbMF1bMF07CisgICAgICAgICp5MiA9IChpbnQpIHBvaW50WzBdWzFdOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiAqLworCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWN2bEdldENyb3NzRXBpbGluZUZyYW1lICovCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK0NWX0lNUEwgdm9pZAorY3ZNYWtlU2NhbmxpbmVzKCBjb25zdCBDdk1hdHJpeDMqIG1hdHJpeCwgQ3ZTaXplIGltZ1NpemUsCisgICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzXzEsIGludCAqc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgIGludCAqbGVuc18xLCBpbnQgKmxlbnNfMiwgaW50ICpudW1saW5lcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdk1ha2VTY2FubGluZXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBJUFBJX0NBTEwoIGljdk1ha2VTY2FubGluZXMoIChDdk1hdHJpeDMqKW1hdHJpeCwgaW1nU2l6ZSwgc2NhbmxpbmVzXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZXNfMiwgbGVuc18xLCBsZW5zXzIsIG51bWxpbmVzICkpOworICAgIF9fRU5EX187Cit9CisKKy8qRi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgTmFtZTogY3ZEZWxldGVNb2lyZQorLy8gICAgUHVycG9zZTogVGhlIGZ1bmN0aW9ucyAKKy8vICAgIENvbnRleHQ6CisvLyAgICBQYXJhbWV0ZXJzOiAgCisvLworLy8gICAgTm90ZXM6ICAKKy8vRiovCitDVl9JTVBMIHZvaWQKK2N2TWFrZUFscGhhU2NhbmxpbmVzKCBpbnQgKnNjYW5saW5lc18xLAorICAgICAgICAgICAgICAgICAgICAgIGludCAqc2NhbmxpbmVzXzIsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICpzY2FubGluZXNfYSwgaW50ICpsZW5zLCBpbnQgbnVtbGluZXMsIGZsb2F0IGFscGhhICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TWFrZUFscGhhU2NhbmxpbmVzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSVBQSV9DQUxMKCBpY3ZNYWtlQWxwaGFTY2FubGluZXMoIHNjYW5saW5lc18xLCBzY2FubGluZXNfMiwgc2NhbmxpbmVzX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbnMsIG51bWxpbmVzLCBhbHBoYSApKTsKKworICAgIF9fRU5EX187Cit9CmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3ZzZWdtZW50LmNwcCBiL2N2YXV4L3NyYy9jdnNlZ21lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ODgzYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jdmF1eC9zcmMvY3ZzZWdtZW50LmNwcApAQCAtMCwwICsxLDU4NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKwordHlwZWRlZiBzdHJ1Y3QgU2VnCit7CisgICAgdXNob3J0IHk7CisgICAgdXNob3J0IGw7CisgICAgdXNob3J0IHI7CisgICAgdXNob3J0IFByZXZsOworICAgIHVzaG9ydCBQcmV2cjsKKyAgICBzaG9ydCAgZmw7Cit9CitTZWc7CisKKyNkZWZpbmUgVVAgMQorI2RlZmluZSBET1dOIC0xICAgICAgICAgICAgIAorCisjZGVmaW5lIFBVU0goWSxJTCxJUixJUEwsSVBSLEZMKSB7ICBzdGFja1tTdEluXS55PSh1c2hvcnQpKFkpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1tTdEluXS5sPSh1c2hvcnQpKElMKTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbU3RJbl0ucj0odXNob3J0KShJUik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW1N0SW5dLlByZXZsPSh1c2hvcnQpKElQTCk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW1N0SW5dLlByZXZyPSh1c2hvcnQpKElQUik7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW1N0SW5dLmZsPShzaG9ydCkoRkwpOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdEluKys7IH0KKworI2RlZmluZSBQT1AoWSxJTCxJUixJUEwsSVBSLEZMKSAgeyAgU3RJbi0tOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZPXN0YWNrW1N0SW5dLnk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElMPXN0YWNrW1N0SW5dLmw7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSPXN0YWNrW1N0SW5dLnI7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBMPXN0YWNrW1N0SW5dLlByZXZsOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUFI9c3RhY2tbU3RJbl0uUHJldnI7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMPXN0YWNrW1N0SW5dLmZsOyB9CisKKworI2RlZmluZSBESUZGKHAxLHAyKSAoKHVuc2lnbmVkKSgocDEpWzBdIC0gKHAyKVswXSArIGRfbHcpPD1JbnRlcnZhbCAmJiBcCisgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpKChwMSlbMV0gLSAocDIpWzFdICsgZF9sdyk8PUludGVydmFsICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCkoKHAxKVsyXSAtIChwMilbMl0gKyBkX2x3KTw9SW50ZXJ2YWwpCisKKy8qI2RlZmluZSBESUZGKHAxLHAyKSAoQ1ZfSUFCUygocDEpWzBdIC0gKHAyKVswXSkgKyBcCisgICAgICAgICAgICAgICAgICAgICBDVl9JQUJTKChwMSlbMV0gLSAocDIpWzFdKSArIFwKKyAgICAgICAgICAgICAgICAgICAgIENWX0lBQlMoKHAxKVsyXSAtIChwMilbMl0pIDw9SW50ZXJ2YWwgKSovCisKK3N0YXRpYyBDdlN0YXR1cworaWN2U2VnbUZsb29kRmlsbF9TdGFnZTEoIHVjaGFyKiBwSW1hZ2UsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBwTWFzaywgaW50IG1hc2tTdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSAvKnJvaSovLCBDdlBvaW50IHNlZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBuZXdWYWwsIGludCBkX2x3LCBpbnQgZF91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdkNvbm5lY3RlZENvbXAgKiByZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFN0YWNrICkKK3sKKyAgICB1Y2hhciogaW1nID0gcEltYWdlICsgc3RlcCAqIHNlZWQueTsKKyAgICB1Y2hhciogbWFzayA9IHBNYXNrICsgbWFza1N0ZXAgKiAoc2VlZC55ICsgMSk7CisgICAgdW5zaWduZWQgSW50ZXJ2YWwgPSAodW5zaWduZWQpIChkX3VwICsgZF9sdyk7CisgICAgU2VnICpzdGFjayA9IChTZWcqKXBTdGFjazsKKyAgICBpbnQgU3RJbiA9IDA7CisgICAgaW50IGksIEwsIFI7IAorICAgIGludCBhcmVhID0gMDsKKyAgICBpbnQgc3VtW10gPSB7IDAsIDAsIDAgfTsKKyAgICBpbnQgWE1pbiwgWE1heCwgWU1pbiA9IHNlZWQueSwgWU1heCA9IHNlZWQueTsKKyAgICBpbnQgdmFsMFszXTsKKworICAgIEwgPSBSID0gc2VlZC54OworICAgIGltZyA9IHBJbWFnZSArIHNlZWQueSpzdGVwOworICAgIG1hc2sgPSBwTWFzayArIHNlZWQueSptYXNrU3RlcDsKKyAgICBtYXNrW0xdID0gMTsKKworICAgIHZhbDBbMF0gPSBpbWdbc2VlZC54KjNdOworICAgIHZhbDBbMV0gPSBpbWdbc2VlZC54KjMgKyAxXTsKKyAgICB2YWwwWzJdID0gaW1nW3NlZWQueCozICsgMl07CisKKyAgICB3aGlsZSggRElGRiggaW1nICsgKFIrMSkqMywgLyppbWcgKyBSKjMqL3ZhbDAgKSAmJiAhbWFza1tSICsgMV0gKQorICAgICAgICBtYXNrWysrUl0gPSAyOworCisgICAgd2hpbGUoIERJRkYoIGltZyArIChMLTEpKjMsIC8qaW1nICsgTCozKi92YWwwICkgJiYgIW1hc2tbTCAtIDFdICkKKyAgICAgICAgbWFza1stLUxdID0gMjsKKworICAgIFhNYXggPSBSOworICAgIFhNaW4gPSBMOworICAgIFBVU0goIHNlZWQueSwgTCwgUiwgUiArIDEsIFIsIFVQICk7CisKKyAgICB3aGlsZSggU3RJbiApCisgICAgeworICAgICAgICBpbnQgaywgWUMsIFBMLCBQUiwgZmxhZy8qLCBjdXJzdGVwKi87CisKKyAgICAgICAgUE9QKCBZQywgTCwgUiwgUEwsIFBSLCBmbGFnICk7CisKKyAgICAgICAgaW50IGRhdGFbXVszXSA9IHsgey1mbGFnLCBMLCBSfSwge2ZsYWcsIEwsIFBMLTF9LCB7ZmxhZyxQUisxLFJ9fTsKKworICAgICAgICBpZiggWE1heCA8IFIgKQorICAgICAgICAgICAgWE1heCA9IFI7CisKKyAgICAgICAgaWYoIFhNaW4gPiBMICkKKyAgICAgICAgICAgIFhNaW4gPSBMOworCisgICAgICAgIGlmKCBZTWF4IDwgWUMgKQorICAgICAgICAgICAgWU1heCA9IFlDOworCisgICAgICAgIGlmKCBZTWluID4gWUMgKQorICAgICAgICAgICAgWU1pbiA9IFlDOworCisgICAgICAgIGZvciggayA9IDA7IGsgPCAzOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbGFnID0gZGF0YVtrXVswXTsKKyAgICAgICAgICAgIC8qY3Vyc3RlcCA9IGZsYWcgKiBzdGVwOyovCisgICAgICAgICAgICBpbWcgPSBwSW1hZ2UgKyAoWUMgKyBmbGFnKSAqIHN0ZXA7CisgICAgICAgICAgICBtYXNrID0gcE1hc2sgKyAoWUMgKyBmbGFnKSAqIG1hc2tTdGVwOworICAgICAgICAgICAgaW50IGxlZnQgPSBkYXRhW2tdWzFdOworICAgICAgICAgICAgaW50IHJpZ2h0ID0gZGF0YVtrXVsyXTsKKworICAgICAgICAgICAgZm9yKCBpID0gbGVmdDsgaSA8PSByaWdodDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIW1hc2tbaV0gJiYgRElGRiggaW1nICsgaSozLCAvKmltZyAtIGN1cnN0ZXAgKyBpKjMqL3ZhbDAgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBqID0gaTsKKyAgICAgICAgICAgICAgICAgICAgbWFza1tpXSA9IDI7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAhbWFza1tqIC0gMV0gJiYgRElGRiggaW1nICsgKGogLSAxKSozLCAvKmltZyArIGoqMyovdmFsMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFza1stLWpdID0gMjsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSggIW1hc2tbaSArIDFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoRElGRiggaW1nICsgKGkrMSkqMywgLyppbWcgKyBpKjMqL3ZhbDAgKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKERJRkYoIGltZyArIChpKzEpKjMsIC8qaW1nICsgKGkrMSkqMyAtIGN1cnN0ZXAqL3ZhbDApICYmIGkgPCBSKSkpCisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrWysraV0gPSAyOworCisgICAgICAgICAgICAgICAgICAgIFBVU0goIFlDICsgZmxhZywgaiwgaSwgTCwgUiwgLWZsYWcgKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaW1nID0gcEltYWdlICsgWUMgKiBzdGVwOworCisgICAgICAgIGZvciggaSA9IEw7IGkgPD0gUjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3VtWzBdICs9IGltZ1tpKjNdOworICAgICAgICAgICAgc3VtWzFdICs9IGltZ1tpKjMgKyAxXTsKKyAgICAgICAgICAgIHN1bVsyXSArPSBpbWdbaSozICsgMl07CisgICAgICAgIH0KKworICAgICAgICBhcmVhICs9IFIgLSBMICsgMTsKKyAgICB9CisgICAgCisgICAgcmVnaW9uLT5hcmVhID0gYXJlYTsKKyAgICByZWdpb24tPnJlY3QueCA9IFhNaW47CisgICAgcmVnaW9uLT5yZWN0LnkgPSBZTWluOworICAgIHJlZ2lvbi0+cmVjdC53aWR0aCA9IFhNYXggLSBYTWluICsgMTsKKyAgICByZWdpb24tPnJlY3QuaGVpZ2h0ID0gWU1heCAtIFlNaW4gKyAxOworICAgIHJlZ2lvbi0+dmFsdWUgPSBjdlNjYWxhckFsbCgwKTsKKworICAgIHsKKyAgICAgICAgZG91YmxlIGludl9hcmVhID0gYXJlYSA/IDEuL2FyZWEgOiAwOworICAgICAgICBuZXdWYWxbMF0gPSBjdlJvdW5kKCBzdW1bMF0gKiBpbnZfYXJlYSApOworICAgICAgICBuZXdWYWxbMV0gPSBjdlJvdW5kKCBzdW1bMV0gKiBpbnZfYXJlYSApOworICAgICAgICBuZXdWYWxbMl0gPSBjdlJvdW5kKCBzdW1bMl0gKiBpbnZfYXJlYSApOworICAgIH0KKworICAgIHJldHVybiBDVl9OT19FUlI7Cit9CisKKworI3VuZGVmIFBVU0gKKyN1bmRlZiBQT1AKKyN1bmRlZiBESUZGCisKKworc3RhdGljIEN2U3RhdHVzCitpY3ZTZWdtRmxvb2RGaWxsX1N0YWdlMiggdWNoYXIqIHBJbWFnZSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIHBNYXNrLCBpbnQgbWFza1N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIC8qcm9pKi8sIGludCogbmV3VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2UmVjdCByZWN0ICkKK3sKKyAgICB1Y2hhciogaW1nID0gcEltYWdlICsgc3RlcCAqIHJlY3QueSArIHJlY3QueCAqIDM7CisgICAgdWNoYXIqIG1hc2sgPSBwTWFzayArIG1hc2tTdGVwICogcmVjdC55ICsgcmVjdC54OworICAgIHVjaGFyIHV2W10gPSB7ICh1Y2hhciluZXdWYWxbMF0sICh1Y2hhciluZXdWYWxbMV0sICh1Y2hhciluZXdWYWxbMl0gfTsKKyAgICBpbnQgeCwgeTsKKworICAgIGZvciggeSA9IDA7IHkgPCByZWN0LmhlaWdodDsgeSsrLCBpbWcgKz0gc3RlcCwgbWFzayArPSBtYXNrU3RlcCApCisgICAgICAgIGZvciggeCA9IDA7IHggPCByZWN0LndpZHRoOyB4KysgKQorICAgICAgICAgICAgaWYoIG1hc2tbeF0gPT0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWFza1t4XSA9IDE7CisgICAgICAgICAgICAgICAgaW1nW3gqM10gPSB1dlswXTsKKyAgICAgICAgICAgICAgICBpbWdbeCozKzFdID0gdXZbMV07CisgICAgICAgICAgICAgICAgaW1nW3gqMysyXSA9IHV2WzJdOworICAgICAgICAgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisjaWYgMAorc3RhdGljIHZvaWQgY29sb3JfZGVydiggY29uc3QgQ3ZBcnIqIHNyY0FyciwgQ3ZBcnIqIGRzdEFyciwgaW50IHRocmVzaCApCit7CisgICAgc3RhdGljIGludCB0YWJbXSA9IHsgMCwgMiwgMiwgMSB9OworICAgIAorICAgIHVjaGFyICpzcmMgPSAwLCAqZHN0ID0gMDsKKyAgICBpbnQgZHN0X3N0ZXAsIHNyY19zdGVwOworICAgIGludCB4LCB5OworICAgIEN2U2l6ZSBzaXplOworCisgICAgY3ZHZXRSYXdEYXRhKCBzcmNBcnIsICh1Y2hhcioqKSZzcmMsICZzcmNfc3RlcCwgJnNpemUgKTsKKyAgICBjdkdldFJhd0RhdGEoIGRzdEFyciwgKHVjaGFyKiopJmRzdCwgJmRzdF9zdGVwLCAwICk7CisKKyAgICBtZW1zZXQoIGRzdCwgMCwgc2l6ZS53aWR0aCpzaXplb2YoZHN0WzBdKSk7CisgICAgbWVtc2V0KCAodWNoYXIqKWRzdCArIGRzdF9zdGVwKihzaXplLmhlaWdodC0xKSwgMCwgc2l6ZS53aWR0aCpzaXplb2YoZHN0WzBdKSk7CisgICAgc3JjICs9IDM7CisKKyAgICAjZGVmaW5lICBDVl9JQUJTKGEpICAgICAoKChhKSBeICgoYSkgPCAwID8gLTEgOiAwKSkgLSAoKGEpIDwgMCA/IC0xIDogMCkpCisgICAgCisgICAgZm9yKCB5ID0gMTsgeSA8IHNpemUuaGVpZ2h0IC0gMTsgeSsrICkKKyAgICB7CisgICAgICAgIHNyYyArPSBzcmNfc3RlcDsKKyAgICAgICAgZHN0ICs9IGRzdF9zdGVwOworICAgICAgICB1Y2hhciogc3JjMCA9IHNyYzsKKyAgICAgICAgCisgICAgICAgIGRzdFswXSA9IGRzdFtzaXplLndpZHRoIC0gMV0gPSAwOworCisgICAgICAgIGZvciggeCA9IDE7IHggPCBzaXplLndpZHRoIC0gMTsgeCsrLCBzcmMgKz0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qaW50IGRbM107CisgICAgICAgICAgICBpbnQgYWRbM107CisgICAgICAgICAgICBpbnQgZjAsIGYxOworICAgICAgICAgICAgaW50IHZhbDsqLworICAgICAgICAgICAgaW50IG1bM107CisgICAgICAgICAgICBkb3VibGUgdmFsOworICAgICAgICAgICAgLy9kb3VibGUgeHgsIHl5OworICAgICAgICAgICAgaW50IGRoWzNdOworICAgICAgICAgICAgaW50IGR2WzNdOworICAgICAgICAgICAgZGhbMF0gPSBzcmNbMF0gLSBzcmNbLTNdOworICAgICAgICAgICAgZHZbMF0gPSBzcmNbMF0gLSBzcmNbLXNyY19zdGVwXTsKKyAgICAgICAgICAgIGRoWzFdID0gc3JjWzFdIC0gc3JjWy0yXTsKKyAgICAgICAgICAgIGR2WzFdID0gc3JjWzFdIC0gc3JjWzEtc3JjX3N0ZXBdOworICAgICAgICAgICAgZGhbMl0gPSBzcmNbMl0gLSBzcmNbLTFdOworICAgICAgICAgICAgZHZbMl0gPSBzcmNbMl0gLSBzcmNbMi1zcmNfc3RlcF07CisKKyAgICAgICAgICAgIG1bMF0gPSBkaFswXSpkaFswXSArIGRoWzFdKmRoWzFdICsgZGhbMl0qZGhbMl07CisgICAgICAgICAgICBtWzJdID0gZGhbMF0qZHZbMF0gKyBkaFsxXSpkdlsxXSArIGRoWzJdKmR2WzJdOworICAgICAgICAgICAgbVsxXSA9IGR2WzBdKmR2WzBdICsgZHZbMV0qZHZbMV0gKyBkaFsyXSpkaFsyXTsKKworICAgICAgICAgICAgdmFsID0gKG1bMF0gKyBtWzJdKSArIAorICAgICAgICAgICAgICAgIHNxcnQoKChkb3VibGUpKChkb3VibGUpbVswXSAtIG1bMl0pKSoobVswXSAtIG1bMl0pICsgKDQuKm1bMV0pKm1bMV0pOworCisgICAgICAgICAgICAvKgorCisgICAgICAgICAgICB4eCA9IG1bMV07CisgICAgICAgICAgICB5eSA9IHYgLSBtWzBdOworICAgICAgICAgICAgdiAvPSBzcXJ0KHh4Knh4ICsgeXkqeXkpICsgMWUtNzsKKyAgICAgICAgICAgIHh4ICo9IHY7CisgICAgICAgICAgICB5eSAqPSB2OworICAgICAgICAgICAgCisgICAgICAgICAgICBkeFt4XSA9IChzaG9ydCljdlJvdW5kKHh4KTsKKyAgICAgICAgICAgIGR5W3hdID0gKHNob3J0KWN2Um91bmQoeXkpOworCisgICAgICAgICAgICAvL2R4W3hdID0gKHNob3J0KWN2Um91bmQodik7CisKKyAgICAgICAgICAgIC8vZHhbeF0gPSBkeVt4XSA9IChzaG9ydCl2OworICAgICAgICAgICAgZFswXSA9IHNyY1swXSAtIHNyY1stM107CisgICAgICAgICAgICBhZFswXSA9IENWX0lBQlMoZFswXSk7CisKKyAgICAgICAgICAgIGRbMV0gPSBzcmNbMV0gLSBzcmNbLTJdOworICAgICAgICAgICAgYWRbMV0gPSBDVl9JQUJTKGRbMV0pOworCisgICAgICAgICAgICBkWzJdID0gc3JjWzJdIC0gc3JjWy0xXTsKKyAgICAgICAgICAgIGFkWzJdID0gQ1ZfSUFCUyhkWzJdKTsKKworICAgICAgICAgICAgZjAgPSBhZFsxXSA+IGFkWzBdOworICAgICAgICAgICAgZjEgPSBhZFsyXSA+IGFkW2YwXTsgIAorCisgICAgICAgICAgICB2YWwgPSBkW3RhYltmMCoyICsgZjFdXTsKKworICAgICAgICAgICAgZFswXSA9IHNyY1swXSAtIHNyY1stc3JjX3N0ZXBdOworICAgICAgICAgICAgYWRbMF0gPSBDVl9JQUJTKGRbMF0pOworCisgICAgICAgICAgICBkWzFdID0gc3JjWzFdIC0gc3JjWzEtc3JjX3N0ZXBdOworICAgICAgICAgICAgYWRbMV0gPSBDVl9JQUJTKGRbMV0pOworCisgICAgICAgICAgICBkWzJdID0gc3JjWzJdIC0gc3JjWzItc3JjX3N0ZXBdOworICAgICAgICAgICAgYWRbMl0gPSBDVl9JQUJTKGRbMl0pOworCisgICAgICAgICAgICBmMCA9IGFkWzFdID4gYWRbMF07CisgICAgICAgICAgICBmMSA9IGFkWzJdID4gYWRbZjBdOyAgCisKKyAgICAgICAgICAgIGRzdFt4XSA9ICh1Y2hhcikodmFsICsgZFt0YWJbZjAqMiArIGYxXV0gPiB0aHJlc2ggPyAyNTUgOiAwKTsqLworICAgICAgICAgICAgZHN0W3hdID0gKHVjaGFyKSh2YWwgPiB0aHJlc2gpOworICAgICAgICB9CisKKyAgICAgICAgc3JjID0gc3JjMDsKKyAgICB9CisKK30KKyNlbmRpZgorCitjb25zdCBDdlBvaW50IGljdkNvZGVEZWx0YXNbOF0gPQorICAgIHsgezEsIDB9LCB7MSwgLTF9LCB7MCwgLTF9LCB7LTEsIC0xfSwgey0xLCAwfSwgey0xLCAxfSwgezAsIDF9LCB7MSwgMX0gfTsKKworc3RhdGljIEN2U2VxKgoraWN2R2V0Q29tcG9uZW50KCB1Y2hhciogaW1nLCBpbnQgc3RlcCwgQ3ZSZWN0IHJlY3QsCisgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgY29uc3QgY2hhciBuYmQgPSA0OworICAgIGludCAgZGVsdGFzWzE2XTsKKyAgICBpbnQgIHgsIHk7CisgICAgQ3ZTZXEqIGV4dGVyaW9yID0gMDsKKyAgICBjaGFyKiBwdHI7CisKKyAgICAvKiBpbml0aWFsaXplIGxvY2FsIHN0YXRlICovCisgICAgQ1ZfSU5JVF8zWDNfREVMVEFTKCBkZWx0YXMsIHN0ZXAsIDEgKTsKKyAgICBtZW1jcHkoIGRlbHRhcyArIDgsIGRlbHRhcywgOCAqIHNpemVvZiggZGVsdGFzWzBdICkpOworCisgICAgcHRyID0gKGNoYXIqKShpbWcgKyBzdGVwKnJlY3QueSk7CisgICAgcmVjdC53aWR0aCArPSByZWN0Lng7CisgICAgcmVjdC5oZWlnaHQgKz0gcmVjdC55OworCisgICAgZm9yKCB5ID0gcmVjdC55OyB5IDwgcmVjdC5oZWlnaHQ7IHkrKywgcHRyICs9IHN0ZXAgKQorICAgIHsKKyAgICAgICAgaW50IHByZXYgPSBwdHJbcmVjdC54IC0gMV0gJiAtMjsKKyAgICAgICAgCisgICAgICAgIGZvciggeCA9IHJlY3QueDsgeCA8IHJlY3Qud2lkdGg7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwID0gcHRyW3hdICYgLTI7CisKKyAgICAgICAgICAgIC8vYXNzZXJ0KCBleHRlcmlvciB8fCAoKHAgfCBwcmV2KSAmIC00KSA9PSAwICk7CisKKyAgICAgICAgICAgIGlmKCBwICE9IHByZXYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U2VxICpzZXEgPSAwOworICAgICAgICAgICAgICAgIGludCBpc19ob2xlID0gMDsKKyAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciAgd3JpdGVyOworICAgICAgICAgICAgICAgIGNoYXIgICppMCwgKmkxLCAqaTMsICppNCA9IDA7CisgICAgICAgICAgICAgICAgaW50ICBwcmV2X3MgPSAtMSwgcywgc19lbmQ7CisgICAgICAgICAgICAgICAgQ3ZQb2ludCBwdCA9IHsgeCwgeSB9OworCisgICAgICAgICAgICAgICAgaWYoICEocHJldiA9PSAwICYmIHAgPT0gMikgKSAgICAvKiBpZiBub3QgZXh0ZXJuYWwgY29udG91ciAqLworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaG9sZSAqLworICAgICAgICAgICAgICAgICAgICBpZiggcCAhPSAwIHx8IHByZXYgPCAxICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJldiA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlzX2hvbGUgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiggIWV4dGVyaW9yICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjdlN0YXJ0V3JpdGVTZXEoIENWX1NFUV9DT05UT1VSIHwgKGlzX2hvbGUgPyBDVl9TRVFfRkxBR19IT0xFIDogMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ3ZDb250b3VyKSwgc2l6ZW9mKEN2UG9pbnQpLCBzdG9yYWdlLCAmd3JpdGVyICk7CisgICAgICAgICAgICAgICAgc19lbmQgPSBzID0gaXNfaG9sZSA/IDAgOiA0OworICAgICAgICAgICAgICAgIGkwID0gcHRyICsgeCAtIGlzX2hvbGU7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcyA9IChzIC0gMSkgJiA3OworICAgICAgICAgICAgICAgICAgICBpMSA9IGkwICsgZGVsdGFzW3NdOworICAgICAgICAgICAgICAgICAgICBpZiggKCppMSAmIC0yKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggcyAhPSBzX2VuZCApOworCisgICAgICAgICAgICAgICAgaWYoIHMgPT0gc19lbmQgKSAgICAgICAgICAgIC8qIHNpbmdsZSBwaXhlbCBkb21haW4gKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICppMCA9IChjaGFyKSAobmJkIHwgLTEyOCk7CisgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGkzID0gaTA7CisgICAgICAgICAgICAgICAgICAgIHByZXZfcyA9IHMgXiA0OworCisgICAgICAgICAgICAgICAgICAgIC8qIGZvbGxvdyBib3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7OyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5kID0gczsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCA7OyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaTQgPSBpMyArIGRlbHRhc1srK3NdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoKmk0ICYgLTIpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHMgJj0gNzsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgInJpZ2h0IiBib3VuZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZCkgKHMgLSAxKSA8ICh1bnNpZ25lZCkgc19lbmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICppMyA9IChjaGFyKSAobmJkIHwgLTEyOCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAqaTMgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaTMgPSBuYmQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzICE9IHByZXZfcyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIHB0LCB3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3MgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwdC54ICs9IGljdkNvZGVEZWx0YXNbc10ueDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0LnkgKz0gaWN2Q29kZURlbHRhc1tzXS55OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaTQgPT0gaTAgJiYgaTMgPT0gaTEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICBpMyA9IGk0OworICAgICAgICAgICAgICAgICAgICAgICAgcyA9IChzICsgNCkgJiA3OworICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgYm9yZGVyIGZvbGxvd2luZyBsb29wICovCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2VxID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgICAgICAgICAgICAgIGN2Q29udG91ckJvdW5kaW5nUmVjdCggc2VxLCAxICk7CisKKyAgICAgICAgICAgICAgICBpZiggIWlzX2hvbGUgKQorICAgICAgICAgICAgICAgICAgICBleHRlcmlvciA9IHNlcTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzZXEtPnZfcHJldiA9IGV4dGVyaW9yOworICAgICAgICAgICAgICAgICAgICBzZXEtPmhfbmV4dCA9IGV4dGVyaW9yLT52X25leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzZXEtPmhfbmV4dCApCisgICAgICAgICAgICAgICAgICAgICAgICBzZXEtPmhfbmV4dC0+aF9wcmV2ID0gc2VxOworICAgICAgICAgICAgICAgICAgICBleHRlcmlvci0+dl9uZXh0ID0gc2VxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByZXYgPSBwdHJbeF0gJiAtMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBleHRlcmlvcjsKK30KKworCisKK0NWX0lNUEwgQ3ZTZXEqCitjdlNlZ21lbnRJbWFnZSggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwKKyAgICAgICAgICAgICAgICBkb3VibGUgY2FubnlfdGhyZXNob2xkLAorICAgICAgICAgICAgICAgIGRvdWJsZSBmZmlsbF90aHJlc2hvbGQsCisgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDdlNlcSogcm9vdCA9IDA7CisgICAgQ3ZNYXQqIGdyYXkgPSAwOworICAgIEN2TWF0KiBjYW5ueSA9IDA7CisgICAgLy9Ddk1hdCogdGVtcCA9IDA7CisgICAgdm9pZCogc3RhY2sgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZTZWdtZW50SW1hZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3Q7CisgICAgQ3ZNYXQqIG1hc2s7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZQb2ludCBwdDsKKyAgICBpbnQgZmZpbGxfbHdfdXAgPSBjdlJvdW5kKCBmYWJzKGZmaWxsX3RocmVzaG9sZCkgKTsKKyAgICBDdlNlcSogcHJldl9zZXEgPSAwOworCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyY2FyciwgJnNyY3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdGFyciwgJmRzdHN0dWIgKSk7CisKKyAgICBzaXplID0gY3ZHZXRTaXplKCBzcmMgKTsKKworICAgIENWX0NBTEwoIGdyYXkgPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIENWXzhVQzEgKSk7CisgICAgQ1ZfQ0FMTCggY2FubnkgPSBjdkNyZWF0ZU1hdCggc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIENWXzhVQzEgKSk7CisgICAgLy9DVl9DQUxMKCB0ZW1wID0gY3ZDcmVhdGVNYXQoIHNpemUuaGVpZ2h0LzIsIHNpemUud2lkdGgvMiwgQ1ZfOFVDMyApKTsKKworICAgIENWX0NBTEwoIHN0YWNrID0gY3ZBbGxvYyggc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0ICogc2l6ZW9mKFNlZykpKTsKKworICAgIGN2Q3Z0Q29sb3IoIHNyYywgZ3JheSwgQ1ZfQkdSMkdSQVkgKTsKKyAgICBjdkNhbm55KCBncmF5LCBjYW5ueSwgMC8qY2FubnlfdGhyZXNob2xkKjAuNCovLCBjYW5ueV90aHJlc2hvbGQsIDMgKTsKKyAgICBjdlRocmVzaG9sZCggY2FubnksIGNhbm55LCAxLCAxLCBDVl9USFJFU0hfQklOQVJZICk7CisgICAgLy9jdlplcm8oIGNhbm55ICk7CisgICAgLy9jb2xvcl9kZXJ2KCBzcmMsIGNhbm55LCBjYW5ueV90aHJlc2hvbGQgKTsKKworICAgIC8vY3ZQeXJEb3duKCBzcmMsIHRlbXAgKTsKKyAgICAvL2N2UHlyVXAoIHRlbXAsIGRzdCApOworCisgICAgLy9zcmMgPSBkc3Q7CisgICAgbWFzayA9IGNhbm55OyAvLyBhIG5ldyBuYW1lIGZvciBuZXcgcm9sZQorCisgICAgLy8gbWFrZSBhIG5vbi16ZXJvIGJvcmRlci4KKyAgICBjdlJlY3RhbmdsZSggbWFzaywgY3ZQb2ludCgwLDApLCBjdlBvaW50KHNpemUud2lkdGgtMSxzaXplLmhlaWdodC0xKSwgY3ZTY2FsYXJBbGwoMSksIDEgKTsKKworICAgIGZvciggcHQueSA9IDA7IHB0LnkgPCBzaXplLmhlaWdodDsgcHQueSsrICkKKyAgICB7CisgICAgICAgIGZvciggcHQueCA9IDA7IHB0LnggPCBzaXplLndpZHRoOyBwdC54KysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbWFzay0+ZGF0YS5wdHJbbWFzay0+c3RlcCpwdC55ICsgcHQueF0gPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZDb25uZWN0ZWRDb21wIHJlZ2lvbjsKKyAgICAgICAgICAgICAgICBpbnQgYXZnVmFsWzNdID0geyAwLCAwLCAwIH07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWN2U2VnbUZsb29kRmlsbF9TdGFnZTEoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzay0+ZGF0YS5wdHIsIG1hc2stPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHB0LCBhdmdWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmaWxsX2x3X3VwLCBmZmlsbF9sd191cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlZ2lvbiwgc3RhY2sgKTsKKworICAgICAgICAgICAgICAgIC8qYXZnVmFsWzBdID0gKGF2Z1ZhbFswXSArIDE1KSAmIC0zMjsKKyAgICAgICAgICAgICAgICBpZiggYXZnVmFsWzBdID4gMjU1ICkKKyAgICAgICAgICAgICAgICAgICAgYXZnVmFsWzBdID0gMjU1OworICAgICAgICAgICAgICAgIGF2Z1ZhbFsxXSA9IChhdmdWYWxbMV0gKyAxNSkgJiAtMzI7CisgICAgICAgICAgICAgICAgaWYoIGF2Z1ZhbFsxXSA+IDI1NSApCisgICAgICAgICAgICAgICAgICAgIGF2Z1ZhbFsxXSA9IDI1NTsKKyAgICAgICAgICAgICAgICBhdmdWYWxbMl0gPSAoYXZnVmFsWzJdICsgMTUpICYgLTMyOworICAgICAgICAgICAgICAgIGlmKCBhdmdWYWxbMl0gPiAyNTUgKQorICAgICAgICAgICAgICAgICAgICBhdmdWYWxbMl0gPSAyNTU7Ki8KKworICAgICAgICAgICAgICAgIGlmKCBzdG9yYWdlICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2U2VxKiB0bXBzZXEgPSBpY3ZHZXRDb21wb25lbnQoIG1hc2stPmRhdGEucHRyLCBtYXNrLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWdpb24ucmVjdCwgc3RvcmFnZSApOworICAgICAgICAgICAgICAgICAgICBpZiggdG1wc2VxICE9IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKEN2Q29udG91ciopdG1wc2VxKS0+Y29sb3IgPSBhdmdWYWxbMF0gKyAoYXZnVmFsWzFdIDw8IDgpICsgKGF2Z1ZhbFsyXSA8PCAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBzZXEtPmhfcHJldiA9IHByZXZfc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHByZXZfc2VxICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3NlcS0+aF9uZXh0ID0gdG1wc2VxOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSB0bXBzZXE7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2X3NlcSA9IHRtcHNlcTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGljdlNlZ21GbG9vZEZpbGxfU3RhZ2UyKCBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2stPmRhdGEucHRyLCBtYXNrLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBhdmdWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lvbi5yZWN0ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgLy9jdlJlbGVhc2VNYXQoICZ0ZW1wICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmZ3JheSApOworICAgIGN2UmVsZWFzZU1hdCggJmNhbm55ICk7CisgICAgY3ZGcmVlKCAmc3RhY2sgKTsKKworICAgIHJldHVybiByb290OworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N2YXV4L3NyYy9jdnN1YmRpdjIuY3BwIGIvY3ZhdXgvc3JjL2N2c3ViZGl2Mi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg3NmUzNwotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdnN1YmRpdjIuY3BwCkBAIC0wLDAgKzEsMTg3IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCitDVl9JTVBMIGludAoraWN2U3ViZGl2MkRDaGVjayggQ3ZTdWJkaXYyRCogc3ViZGl2ICkKK3sKKyAgICBpbnQgaSwgaiwgdG90YWwgPSBzdWJkaXYtPmVkZ2VzLT50b3RhbDsKKyAgICBpbnQgY2hlY2tfcmVzdWx0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSgiaWN2U3ViZGl2MkRDaGVjayIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdWJkaXYgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX1NUQVRVUyggQ1ZfTlVMTFBUUl9FUlIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2UXVhZEVkZ2UyRCogZWRnZSA9IChDdlF1YWRFZGdlMkQqKWN2R2V0U2V0RWxlbShzdWJkaXYtPmVkZ2VzLGkpOworICAgICAgICAKKyAgICAgICAgaWYoIGVkZ2UgJiYgQ1ZfSVNfU0VUX0VMRU0oIGVkZ2UgKSkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2UgZSA9IChDdlN1YmRpdjJERWRnZSllZGdlICsgajsKKyAgICAgICAgICAgICAgICBDdlN1YmRpdjJERWRnZSBvX25leHQgPSBjdlN1YmRpdjJETmV4dEVkZ2UoZSk7CisgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2Ugb19wcmV2ID0gY3ZTdWJkaXYyREdldEVkZ2UoZSwgQ1ZfUFJFVl9BUk9VTkRfT1JHICk7CisgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2UgZF9wcmV2ID0gY3ZTdWJkaXYyREdldEVkZ2UoZSwgQ1ZfUFJFVl9BUk9VTkRfRFNUICk7CisgICAgICAgICAgICAgICAgQ3ZTdWJkaXYyREVkZ2UgZF9uZXh0ID0gY3ZTdWJkaXYyREdldEVkZ2UoZSwgQ1ZfTkVYVF9BUk9VTkRfRFNUICk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBwb2ludHMKKyAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREVkZ2VPcmcoZSkgIT0gY3ZTdWJkaXYyREVkZ2VPcmcob19uZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREVkZ2VPcmcoZSkgIT0gY3ZTdWJkaXYyREVkZ2VPcmcob19wcmV2KSkKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREVkZ2VEc3QoZSkgIT0gY3ZTdWJkaXYyREVkZ2VEc3QoZF9uZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREVkZ2VEc3QoZSkgIT0gY3ZTdWJkaXYyREVkZ2VEc3QoZF9wcmV2KSkKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICBpZiggaiAlIDIgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREVkZ2VEc3Qob19uZXh0KSAhPSBjdlN1YmRpdjJERWRnZU9yZyhkX3ByZXYpKQorICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGN2U3ViZGl2MkRFZGdlRHN0KG9fcHJldikgIT0gY3ZTdWJkaXYyREVkZ2VPcmcoZF9uZXh0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjdlN1YmRpdjJER2V0RWRnZShjdlN1YmRpdjJER2V0RWRnZShjdlN1YmRpdjJER2V0RWRnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGUsQ1ZfTkVYVF9BUk9VTkRfTEVGVCksQ1ZfTkVYVF9BUk9VTkRfTEVGVCksQ1ZfTkVYVF9BUk9VTkRfTEVGVCkgIT0gZSApCisgICAgICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgICAgICBpZiggY3ZTdWJkaXYyREdldEVkZ2UoY3ZTdWJkaXYyREdldEVkZ2UoY3ZTdWJkaXYyREdldEVkZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICBlLENWX05FWFRfQVJPVU5EX1JJR0hUKSxDVl9ORVhUX0FST1VORF9SSUdIVCksQ1ZfTkVYVF9BUk9VTkRfUklHSFQpICE9IGUpCisgICAgICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNoZWNrX3Jlc3VsdCA9IDE7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGNoZWNrX3Jlc3VsdDsKK30KKworCisKK3N0YXRpYyB2b2lkCitkcmF3X3N1YmRpdl9mYWNldCggQ3ZTdWJkaXYyRCAqIHN1YmRpdiwgSXBsSW1hZ2UgKiBkc3QsIElwbEltYWdlICogc3JjLCBDdlN1YmRpdjJERWRnZSBlZGdlICkKK3sKKyAgICBDdlN1YmRpdjJERWRnZSB0ID0gZWRnZTsKKyAgICBpbnQgaSwgY291bnQgPSAwOworICAgIEN2UG9pbnQgbG9jYWxfYnVmWzEwMF07CisgICAgQ3ZQb2ludCAqYnVmID0gbG9jYWxfYnVmOworCisgICAgLy8gY291bnQgbnVtYmVyIG9mIGVkZ2VzIGluIGZhY2V0IAorICAgIGRvCisgICAgeworICAgICAgICBjb3VudCsrOworICAgICAgICB0ID0gY3ZTdWJkaXYyREdldEVkZ2UoIHQsIENWX05FWFRfQVJPVU5EX0xFRlQgKTsKKyAgICB9CisgICAgd2hpbGUoIHQgIT0gZWRnZSAmJiBjb3VudCA8IHN1YmRpdi0+cXVhZF9lZGdlcyAqIDQgKTsKKworICAgIGlmKCBjb3VudCAqIHNpemVvZiggYnVmWzBdICkgPiBzaXplb2YoIGxvY2FsX2J1ZiApKQorICAgIHsKKyAgICAgICAgYnVmID0gKEN2UG9pbnQgKikgbWFsbG9jKCBjb3VudCAqIHNpemVvZiggYnVmWzBdICkpOworICAgIH0KKworICAgIC8vIGdhdGhlciBwb2ludHMKKyAgICB0ID0gZWRnZTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDdlN1YmRpdjJEUG9pbnQgKnB0ID0gY3ZTdWJkaXYyREVkZ2VPcmcoIHQgKTsKKworICAgICAgICBpZiggIXB0ICkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBhc3NlcnQoIGZhYnMoIHB0LT5wdC54ICkgPCAxMDAwMCAmJiBmYWJzKCBwdC0+cHQueSApIDwgMTAwMDAgKTsKKyAgICAgICAgYnVmW2ldID0gY3ZQb2ludCggY3ZSb3VuZCggcHQtPnB0LnggKSwgY3ZSb3VuZCggcHQtPnB0LnkgKSk7CisgICAgICAgIHQgPSBjdlN1YmRpdjJER2V0RWRnZSggdCwgQ1ZfTkVYVF9BUk9VTkRfTEVGVCApOworICAgIH0KKworICAgIGlmKCBpID09IGNvdW50ICkKKyAgICB7CisgICAgICAgIEN2U3ViZGl2MkRQb2ludCAqcHQgPSBjdlN1YmRpdjJERWRnZURzdCggY3ZTdWJkaXYyRFJvdGF0ZUVkZ2UoIGVkZ2UsIDEgKSk7CisgICAgICAgIEN2UG9pbnQgaXAgPSBjdlBvaW50KCBjdlJvdW5kKCBwdC0+cHQueCApLCBjdlJvdW5kKCBwdC0+cHQueSApKTsKKyAgICAgICAgQ3ZTY2FsYXIgY29sb3IgPSB7ezAsMCwwLDB9fTsKKworICAgICAgICAvL3ByaW50ZigiY291bnQgPSAlZCwgKCVkLCVkKVxuIiwgaXAueCwgaXAueSApOworCisgICAgICAgIGlmKCAwIDw9IGlwLnggJiYgaXAueCA8IHNyYy0+d2lkdGggJiYgMCA8PSBpcC55ICYmIGlwLnkgPCBzcmMtPmhlaWdodCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyICpwdHIgPSAodWNoYXIqKShzcmMtPmltYWdlRGF0YSArIGlwLnkgKiBzcmMtPndpZHRoU3RlcCArIGlwLnggKiAzKTsKKyAgICAgICAgICAgIGNvbG9yID0gQ1ZfUkdCKCBwdHJbMl0sIHB0clsxXSwgcHRyWzBdICk7CisgICAgICAgIH0KKworICAgICAgICBjdkZpbGxDb252ZXhQb2x5KCBkc3QsIGJ1ZiwgY291bnQsIGNvbG9yICk7CisgICAgICAgIC8vZHJhd19zdWJkaXZfcG9pbnQoIGRzdCwgcHQtPnB0LCBDVl9SR0IoMCwwLDApKTsKKyAgICB9CisKKyAgICBpZiggYnVmICE9IGxvY2FsX2J1ZiApCisgICAgICAgIGZyZWUoIGJ1ZiApOworfQorCisKK0NWX0lNUEwgdm9pZAoraWN2RHJhd01vc2FpYyggQ3ZTdWJkaXYyRCAqIHN1YmRpdiwgSXBsSW1hZ2UgKiBzcmMsIElwbEltYWdlICogZHN0ICkKK3sKKyAgICBpbnQgaSwgdG90YWwgPSBzdWJkaXYtPmVkZ2VzLT50b3RhbDsKKworICAgIGN2Q2FsY1N1YmRpdlZvcm9ub2kyRCggc3ViZGl2ICk7CisKKyAgICAvL2ljdlNldCggZHN0LCAyNTUgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdlF1YWRFZGdlMkQgKmVkZ2UgPSAoQ3ZRdWFkRWRnZTJEICopIGN2R2V0U2V0RWxlbSggc3ViZGl2LT5lZGdlcywgaSApOworCisgICAgICAgIGlmKCBlZGdlICYmIENWX0lTX1NFVF9FTEVNKCBlZGdlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U3ViZGl2MkRFZGdlIGUgPSAoQ3ZTdWJkaXYyREVkZ2UpIGVkZ2U7CisKKyAgICAgICAgICAgIC8vIGxlZnQKKyAgICAgICAgICAgIGRyYXdfc3ViZGl2X2ZhY2V0KCBzdWJkaXYsIGRzdCwgc3JjLCBjdlN1YmRpdjJEUm90YXRlRWRnZSggZSwgMSApKTsKKyAgICAgICAgICAgIC8vIHJpZ2h0CisgICAgICAgICAgICBkcmF3X3N1YmRpdl9mYWNldCggc3ViZGl2LCBkc3QsIHNyYywgY3ZTdWJkaXYyRFJvdGF0ZUVkZ2UoIGUsIDMgKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2dGV4dHVyZS5jcHAgYi9jdmF1eC9zcmMvY3Z0ZXh0dXJlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzRiYWFmCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2N2dGV4dHVyZS5jcHAKQEAgLTAsMCArMSw2NDggQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKworICAgICAgQ2FsY3VsYXRpb24gb2YgYSB0ZXh0dXJlIGRlc2NyaXB0b3JzIGZyb20gR0xDTSAoR3JleSBMZXZlbCBDby1vY2N1cnJlbmNlIE1hdHJpeCdlcykKKyAgICAgIFRoZSBjb2RlIHdhcyBzdWJtaXR0ZWQgYnkgRGFuaWVsIEVhdG9uIFtkYW5pZWxqYW1lc2VhdG9uQHlhaG9vLmNvbV0KKworXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2RlZmluZSBDVl9NQVhfTlVNX0dSRVlfTEVWRUxTXzhVICAyNTYKKworc3RydWN0IEN2R0xDTQoreworICAgIGludCBtYXRyaXhTaWRlTGVuZ3RoOworICAgIGludCBudW1NYXRyaWNlczsKKyAgICBkb3VibGUqKiogbWF0cmljZXM7CisKKyAgICBpbnQgIG51bUxvb2t1cFRhYmxlRWxlbWVudHM7CisgICAgaW50ICBmb3J3YXJkTG9va3VwVGFibGVbQ1ZfTUFYX05VTV9HUkVZX0xFVkVMU184VV07CisgICAgaW50ICByZXZlcnNlTG9va3VwVGFibGVbQ1ZfTUFYX05VTV9HUkVZX0xFVkVMU184VV07CisKKyAgICBkb3VibGUqKiBkZXNjcmlwdG9yczsKKyAgICBpbnQgbnVtRGVzY3JpcHRvcnM7CisgICAgaW50IGRlc2NyaXB0b3JPcHRpbWl6YXRpb25UeXBlOworICAgIGludCBvcHRpbWl6YXRpb25UeXBlOworfTsKKworCitzdGF0aWMgdm9pZCBpY3ZDcmVhdGVHTENNX0xvb2t1cFRhYmxlXzh1X0MxUiggY29uc3QgdWNoYXIqIHNyY0ltYWdlRGF0YSwgaW50IHNyY0ltYWdlU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzcmNJbWFnZVNpemUsIEN2R0xDTSogZGVzdEdMQ00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHN0ZXBzLCBpbnQgbnVtU3RlcHMsIGludCogbWVtb3J5U3RlcHMgKTsKKworc3RhdGljIHZvaWQKK2ljdkNyZWF0ZUdMQ01EZXNjcmlwdG9yc19BbGxvd0RvdWJsZU5lc3QoIEN2R0xDTSogZGVzdEdMQ00sIGludCBtYXRyaXhJbmRleCApOworCisKK0NWX0lNUEwgQ3ZHTENNKgorY3ZDcmVhdGVHTENNKCBjb25zdCBJcGxJbWFnZSogc3JjSW1hZ2UsCisgICAgICAgICAgICAgIGludCBzdGVwTWFnbml0dWRlLAorICAgICAgICAgICAgICBjb25zdCBpbnQqIHNyY1N0ZXBEaXJlY3Rpb25zLC8qIHNob3VsZCBiZSBzdGF0aWMgYXJyYXkuLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgbm90IHRoZSB1c2VyIHNob3VsZCBoYW5kbGUgZGUtYWxsb2NhdGlvbiAqLworICAgICAgICAgICAgICBpbnQgbnVtU3RlcERpcmVjdGlvbnMsCisgICAgICAgICAgICAgIGludCBvcHRpbWl6YXRpb25UeXBlICkKK3sKKyAgICBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRTdGVwRGlyZWN0aW9uc1tdID0geyAwLDEsIC0xLDEsIC0xLDAsIC0xLC0xIH07CisKKyAgICBpbnQqIG1lbW9yeVN0ZXBzID0gMDsKKyAgICBDdkdMQ00qIG5ld0dMQ00gPSAwOworICAgIGludCogc3RlcERpcmVjdGlvbnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUdMQ00iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICB1Y2hhciogc3JjSW1hZ2VEYXRhID0gMDsKKyAgICBDdlNpemUgc3JjSW1hZ2VTaXplOworICAgIGludCBzcmNJbWFnZVN0ZXA7CisgICAgaW50IHN0ZXBMb29wOworICAgIGNvbnN0IGludCBtYXhOdW1HcmV5TGV2ZWxzOHUgPSBDVl9NQVhfTlVNX0dSRVlfTEVWRUxTXzhVOworCisgICAgaWYoICFzcmNJbWFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIHNyY0ltYWdlLT5uQ2hhbm5lbHMgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIk51bWJlciBvZiBjaGFubmVscyBtdXN0IGJlIDEiKTsKKworICAgIGlmKCBzcmNJbWFnZS0+ZGVwdGggIT0gSVBMX0RFUFRIXzhVICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZERlcHRoLCAiRGVwdGggbXVzdCBiZSBlcXVhbCBJUExfREVQVEhfOFUiKTsKKworICAgIC8vIG5vIERpcmVjdGlvbnMgcHJvdmlkZWQsIHVzZSB0aGUgZGVmYXVsdCBvbmVzIC0gMCBkZWcsIDQ1LCA5MCwgMTM1CisgICAgaWYoICFzcmNTdGVwRGlyZWN0aW9ucyApCisgICAgeworICAgICAgICBzcmNTdGVwRGlyZWN0aW9ucyA9IGRlZmF1bHRTdGVwRGlyZWN0aW9uczsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBzdGVwRGlyZWN0aW9ucyA9IChpbnQqKWN2QWxsb2MoIG51bVN0ZXBEaXJlY3Rpb25zKjIqc2l6ZW9mKHN0ZXBEaXJlY3Rpb25zWzBdKSkpOworICAgIG1lbWNweSggc3RlcERpcmVjdGlvbnMsIHNyY1N0ZXBEaXJlY3Rpb25zLCBudW1TdGVwRGlyZWN0aW9ucyoyKnNpemVvZihzdGVwRGlyZWN0aW9uc1swXSkpOworCisgICAgY3ZHZXRJbWFnZVJhd0RhdGEoIHNyY0ltYWdlLCAmc3JjSW1hZ2VEYXRhLCAmc3JjSW1hZ2VTdGVwLCAmc3JjSW1hZ2VTaXplICk7CisKKyAgICAvLyByb2xsIHRvZ2V0aGVyIERpcmVjdGlvbnMgYW5kIG1hZ25pdHVkZXMgdG9nZXRoZXIgd2l0aCBrbm93bGVkZ2Ugb2YgaW1hZ2UgKHN0ZXApCisgICAgQ1ZfQ0FMTCggbWVtb3J5U3RlcHMgPSAoaW50KiljdkFsbG9jKCBudW1TdGVwRGlyZWN0aW9ucypzaXplb2YobWVtb3J5U3RlcHNbMF0pKSk7CisKKyAgICBmb3IoIHN0ZXBMb29wID0gMDsgc3RlcExvb3AgPCBudW1TdGVwRGlyZWN0aW9uczsgc3RlcExvb3ArKyApCisgICAgeworICAgICAgICBzdGVwRGlyZWN0aW9uc1tzdGVwTG9vcCoyICsgMF0gKj0gc3RlcE1hZ25pdHVkZTsKKyAgICAgICAgc3RlcERpcmVjdGlvbnNbc3RlcExvb3AqMiArIDFdICo9IHN0ZXBNYWduaXR1ZGU7CisKKyAgICAgICAgbWVtb3J5U3RlcHNbc3RlcExvb3BdID0gc3RlcERpcmVjdGlvbnNbc3RlcExvb3AqMiArIDBdKnNyY0ltYWdlU3RlcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEaXJlY3Rpb25zW3N0ZXBMb29wKjIgKyAxXTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBuZXdHTENNID0gKEN2R0xDTSopY3ZBbGxvYyhzaXplb2YobmV3R0xDTSkpKTsKKyAgICBtZW1zZXQoIG5ld0dMQ00sIDAsIHNpemVvZihuZXdHTENNKSApOworCisgICAgbmV3R0xDTS0+bWF0cmljZXMgPSAwOworICAgIG5ld0dMQ00tPm51bU1hdHJpY2VzID0gbnVtU3RlcERpcmVjdGlvbnM7CisgICAgbmV3R0xDTS0+b3B0aW1pemF0aW9uVHlwZSA9IG9wdGltaXphdGlvblR5cGU7CisKKyAgICBpZiggb3B0aW1pemF0aW9uVHlwZSA8PSBDVl9HTENNX09QVElNSVpBVElPTl9MVVQgKQorICAgIHsKKyAgICAgICAgaW50IGxvb2t1cFRhYmxlTG9vcCwgaW1hZ2VDb2xMb29wLCBpbWFnZVJvd0xvb3AsIGxpbmVPZmZzZXQgPSAwOworCisgICAgICAgIC8vIGlmIG9wdGltaXphdGlvbiB0eXBlIGlzIHNldCB0byBsdXQsIHRoZW4gbWFrZSBvbmUgZm9yIHRoZSBpbWFnZQorICAgICAgICBpZiggb3B0aW1pemF0aW9uVHlwZSA9PSBDVl9HTENNX09QVElNSVpBVElPTl9MVVQgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGltYWdlUm93TG9vcCA9IDA7IGltYWdlUm93TG9vcCA8IHNyY0ltYWdlU2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUm93TG9vcCsrLCBsaW5lT2Zmc2V0ICs9IHNyY0ltYWdlU3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpbWFnZUNvbExvb3AgPSAwOyBpbWFnZUNvbExvb3AgPCBzcmNJbWFnZVNpemUud2lkdGg7IGltYWdlQ29sTG9vcCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5ld0dMQ00tPmZvcndhcmRMb29rdXBUYWJsZVtzcmNJbWFnZURhdGFbbGluZU9mZnNldCtpbWFnZUNvbExvb3BdXT0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbmV3R0xDTS0+bnVtTG9va3VwVGFibGVFbGVtZW50cyA9IDA7CisKKyAgICAgICAgICAgIGZvciggbG9va3VwVGFibGVMb29wID0gMDsgbG9va3VwVGFibGVMb29wIDwgbWF4TnVtR3JleUxldmVsczh1OyBsb29rdXBUYWJsZUxvb3ArKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG5ld0dMQ00tPmZvcndhcmRMb29rdXBUYWJsZVsgbG9va3VwVGFibGVMb29wIF0gIT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBuZXdHTENNLT5mb3J3YXJkTG9va3VwVGFibGVbIGxvb2t1cFRhYmxlTG9vcCBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0dMQ00tPm51bUxvb2t1cFRhYmxlRWxlbWVudHM7CisgICAgICAgICAgICAgICAgICAgIG5ld0dMQ00tPnJldmVyc2VMb29rdXBUYWJsZVsgbmV3R0xDTS0+bnVtTG9va3VwVGFibGVFbGVtZW50cyBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFRhYmxlTG9vcDsKKworICAgICAgICAgICAgICAgICAgICBuZXdHTENNLT5udW1Mb29rdXBUYWJsZUVsZW1lbnRzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG90aGVyd2lzZSBtYWtlIGEgIkxVVCIgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBncmF5LWxldmVscyAoZm9yIGNvZGUtcmV1c2UpCisgICAgICAgIGVsc2UgaWYoIG9wdGltaXphdGlvblR5cGUgPT0gQ1ZfR0xDTV9PUFRJTUlaQVRJT05fTk9ORSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggbG9va3VwVGFibGVMb29wID0gMDsgbG9va3VwVGFibGVMb29wIDxtYXhOdW1HcmV5TGV2ZWxzOHU7IGxvb2t1cFRhYmxlTG9vcCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuZXdHTENNLT5mb3J3YXJkTG9va3VwVGFibGVbIGxvb2t1cFRhYmxlTG9vcCBdID0gbG9va3VwVGFibGVMb29wOworICAgICAgICAgICAgICAgIG5ld0dMQ00tPnJldmVyc2VMb29rdXBUYWJsZVsgbG9va3VwVGFibGVMb29wIF0gPSBsb29rdXBUYWJsZUxvb3A7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdHTENNLT5udW1Mb29rdXBUYWJsZUVsZW1lbnRzID0gbWF4TnVtR3JleUxldmVsczh1OworICAgICAgICB9CisKKyAgICAgICAgbmV3R0xDTS0+bWF0cml4U2lkZUxlbmd0aCA9IG5ld0dMQ00tPm51bUxvb2t1cFRhYmxlRWxlbWVudHM7CisgICAgICAgIGljdkNyZWF0ZUdMQ01fTG9va3VwVGFibGVfOHVfQzFSKCBzcmNJbWFnZURhdGEsIHNyY0ltYWdlU3RlcCwgc3JjSW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3R0xDTSwgc3RlcERpcmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1TdGVwRGlyZWN0aW9ucywgbWVtb3J5U3RlcHMgKTsKKyAgICB9CisgICAgZWxzZSBpZiggb3B0aW1pemF0aW9uVHlwZSA9PSBDVl9HTENNX09QVElNSVpBVElPTl9ISVNUT0dSQU0gKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJIaXN0b2dyYW0tYmFzZWQgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCIgKTsKKworICAgIC8qICBuZXdHTENNLT5udW1NYXRyaWNlcyAqPSAyOworICAgICAgICBuZXdHTENNLT5tYXRyaXhTaWRlTGVuZ3RoID0gbWF4TnVtR3JleUxldmVsczh1KjI7CisKKyAgICAgICAgaWN2Q3JlYXRlR0xDTV9IaXN0b2dyYW1fOHVDMVIoIHNyY0ltYWdlU3RlcCwgc3JjSW1hZ2VTaXplLCBzcmNJbWFnZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdHTENNLCBudW1TdGVwRGlyZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBEaXJlY3Rpb25zLCBtZW1vcnlTdGVwcyApOworICAgICovCisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJm1lbW9yeVN0ZXBzICk7CisgICAgY3ZGcmVlKCAmc3RlcERpcmVjdGlvbnMgKTsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBjdkZyZWUoICZuZXdHTENNICk7CisgICAgfQorCisgICAgcmV0dXJuIG5ld0dMQ007Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlJlbGVhc2VHTENNKCBDdkdMQ00qKiBHTENNLCBpbnQgZmxhZyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VHTENNIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG1hdHJpeExvb3A7CisKKyAgICBpZiggIUdMQ00gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAqR0xDTSApCisgICAgICAgIEVYSVQ7IC8vIHJlcGVhdGVkIGRlYWxsb2NhdGlvbjoganVzdCBza2lwIGl0LgorCisgICAgaWYoIChmbGFnID09IENWX0dMQ01fR0xDTSB8fCBmbGFnID09IENWX0dMQ01fQUxMKSAmJiAoKkdMQ00pLT5tYXRyaWNlcyApCisgICAgeworICAgICAgICBmb3IoIG1hdHJpeExvb3AgPSAwOyBtYXRyaXhMb29wIDwgKCpHTENNKS0+bnVtTWF0cmljZXM7IG1hdHJpeExvb3ArKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoKkdMQ00pLT5tYXRyaWNlc1sgbWF0cml4TG9vcCBdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkZyZWUoICgqR0xDTSktPm1hdHJpY2VzW21hdHJpeExvb3BdICk7CisgICAgICAgICAgICAgICAgY3ZGcmVlKCAoKkdMQ00pLT5tYXRyaWNlcyArIG1hdHJpeExvb3AgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN2RnJlZSggJigoKkdMQ00pLT5tYXRyaWNlcykgKTsKKyAgICB9CisKKyAgICBpZiggKGZsYWcgPT0gQ1ZfR0xDTV9ERVNDIHx8IGZsYWcgPT0gQ1ZfR0xDTV9BTEwpICYmICgqR0xDTSktPmRlc2NyaXB0b3JzICkKKyAgICB7CisgICAgICAgIGZvciggbWF0cml4TG9vcCA9IDA7IG1hdHJpeExvb3AgPCAoKkdMQ00pLT5udW1NYXRyaWNlczsgbWF0cml4TG9vcCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZGcmVlKCAoKkdMQ00pLT5kZXNjcmlwdG9ycyArIG1hdHJpeExvb3AgKTsKKyAgICAgICAgfQorICAgICAgICBjdkZyZWUoICYoKCpHTENNKS0+ZGVzY3JpcHRvcnMpICk7CisgICAgfQorCisgICAgaWYoIGZsYWcgPT0gQ1ZfR0xDTV9BTEwgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCBHTENNICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2Q3JlYXRlR0xDTV9Mb29rdXBUYWJsZV84dV9DMVIoIGNvbnN0IHVjaGFyKiBzcmNJbWFnZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNyY0ltYWdlU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc3JjSW1hZ2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2R0xDTSogZGVzdEdMQ00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzdGVwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtU3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZW1vcnlTdGVwcyApCit7CisgICAgaW50KiBzdGVwSW5jcmVtZW50c0NvdW50ZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDcmVhdGVHTENNX0xvb2t1cFRhYmxlXzh1X0MxUiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBtYXRyaXhTaWRlTGVuZ3RoID0gZGVzdEdMQ00tPm1hdHJpeFNpZGVMZW5ndGg7CisgICAgaW50IHN0ZXBMb29wLCBzaWRlTG9vcDEsIHNpZGVMb29wMjsKKyAgICBpbnQgY29sTG9vcCwgcm93TG9vcCwgbGluZU9mZnNldCA9IDA7CisgICAgZG91YmxlKioqIG1hdHJpY2VzID0gMDsKKworICAgIC8vIGFsbG9jYXRlIG1lbW9yeSB0byB0aGUgbWF0cmljZXMKKyAgICBDVl9DQUxMKCBkZXN0R0xDTS0+bWF0cmljZXMgPSAoZG91YmxlKioqKWN2QWxsb2MoIHNpemVvZihtYXRyaWNlc1swXSkqbnVtU3RlcHMgKSk7CisgICAgbWF0cmljZXMgPSBkZXN0R0xDTS0+bWF0cmljZXM7CisKKyAgICBmb3IoIHN0ZXBMb29wPTA7IHN0ZXBMb29wPG51bVN0ZXBzOyBzdGVwTG9vcCsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hdHJpY2VzW3N0ZXBMb29wXSA9IChkb3VibGUqKiljdkFsbG9jKCBzaXplb2YobWF0cmljZXNbMF0pKm1hdHJpeFNpZGVMZW5ndGggKSk7CisgICAgICAgIENWX0NBTEwoIG1hdHJpY2VzW3N0ZXBMb29wXVswXSA9IChkb3VibGUqKWN2QWxsb2MoIHNpemVvZihtYXRyaWNlc1swXVswXSkqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeFNpZGVMZW5ndGgqbWF0cml4U2lkZUxlbmd0aCApKTsKKworICAgICAgICBtZW1zZXQoIG1hdHJpY2VzW3N0ZXBMb29wXVswXSwgMCwgbWF0cml4U2lkZUxlbmd0aCptYXRyaXhTaWRlTGVuZ3RoKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1hdHJpY2VzWzBdWzBdKSApOworCisgICAgICAgIGZvciggc2lkZUxvb3AxID0gMTsgc2lkZUxvb3AxIDwgbWF0cml4U2lkZUxlbmd0aDsgc2lkZUxvb3AxKysgKQorICAgICAgICB7CisgICAgICAgICAgICBtYXRyaWNlc1tzdGVwTG9vcF1bc2lkZUxvb3AxXSA9IG1hdHJpY2VzW3N0ZXBMb29wXVtzaWRlTG9vcDEtMV0gKyBtYXRyaXhTaWRlTGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3RlcEluY3JlbWVudHNDb3VudGVyID0gKGludCopY3ZBbGxvYyggbnVtU3RlcHMqc2l6ZW9mKHN0ZXBJbmNyZW1lbnRzQ291bnRlclswXSkpKTsKKyAgICBtZW1zZXQoIHN0ZXBJbmNyZW1lbnRzQ291bnRlciwgMCwgbnVtU3RlcHMqc2l6ZW9mKHN0ZXBJbmNyZW1lbnRzQ291bnRlclswXSkgKTsKKworICAgIC8vIGdlbmVyYXRlIEdMQ00gZm9yIGVhY2ggc3RlcAorICAgIGZvciggcm93TG9vcD0wOyByb3dMb29wPHNyY0ltYWdlU2l6ZS5oZWlnaHQ7IHJvd0xvb3ArKywgbGluZU9mZnNldCs9c3JjSW1hZ2VTdGVwICkKKyAgICB7CisgICAgICAgIGZvciggY29sTG9vcD0wOyBjb2xMb29wPHNyY0ltYWdlU2l6ZS53aWR0aDsgY29sTG9vcCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBpeGVsVmFsdWUxID0gZGVzdEdMQ00tPmZvcndhcmRMb29rdXBUYWJsZVtzcmNJbWFnZURhdGFbbGluZU9mZnNldCArIGNvbExvb3BdXTsKKworICAgICAgICAgICAgZm9yKCBzdGVwTG9vcD0wOyBzdGVwTG9vcDxudW1TdGVwczsgc3RlcExvb3ArKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvbDIsIHJvdzI7CisgICAgICAgICAgICAgICAgcm93MiA9IHJvd0xvb3AgKyBzdGVwc1tzdGVwTG9vcCoyICsgMF07CisgICAgICAgICAgICAgICAgY29sMiA9IGNvbExvb3AgKyBzdGVwc1tzdGVwTG9vcCoyICsgMV07CisKKyAgICAgICAgICAgICAgICBpZiggY29sMj49MCAmJiByb3cyPj0wICYmIGNvbDI8c3JjSW1hZ2VTaXplLndpZHRoICYmIHJvdzI8c3JjSW1hZ2VTaXplLmhlaWdodCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWVtb3J5U3RlcCA9IG1lbW9yeVN0ZXBzWyBzdGVwTG9vcCBdOworICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ZWxWYWx1ZTIgPSBkZXN0R0xDTS0+Zm9yd2FyZExvb2t1cFRhYmxlWyBzcmNJbWFnZURhdGFbIGxpbmVPZmZzZXQgKyBjb2xMb29wICsgbWVtb3J5U3RlcCBdIF07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFpbnRhaW4gc3ltbWV0cnkKKyAgICAgICAgICAgICAgICAgICAgbWF0cmljZXNbc3RlcExvb3BdW3BpeGVsVmFsdWUxXVtwaXhlbFZhbHVlMl0gKys7CisgICAgICAgICAgICAgICAgICAgIG1hdHJpY2VzW3N0ZXBMb29wXVtwaXhlbFZhbHVlMl1bcGl4ZWxWYWx1ZTFdICsrOworCisgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVuZXQgY291bnRlciBvZiB0b3RhbCBudW1iZXIgb2YgaW5jcmVtZW50cworICAgICAgICAgICAgICAgICAgICBzdGVwSW5jcmVtZW50c0NvdW50ZXJbc3RlcExvb3BdICs9IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gbm9ybWFsaXplIG1hdHJpY2VzLiBlYWNoIGVsZW1lbnQgaXMgYSBwcm9iYWJpbGl0eSBvZiBncmF5IHZhbHVlIGksaiBhZGphY2VuY3kgaW4gZGlyZWN0aW9uL21hZ25pdHVkZSBrCisgICAgZm9yKCBzaWRlTG9vcDE9MDsgc2lkZUxvb3AxPG1hdHJpeFNpZGVMZW5ndGg7IHNpZGVMb29wMSsrICkKKyAgICB7CisgICAgICAgIGZvciggc2lkZUxvb3AyPTA7IHNpZGVMb29wMjxtYXRyaXhTaWRlTGVuZ3RoOyBzaWRlTG9vcDIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggc3RlcExvb3A9MDsgc3RlcExvb3A8bnVtU3RlcHM7IHN0ZXBMb29wKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1hdHJpY2VzW3N0ZXBMb29wXVtzaWRlTG9vcDFdW3NpZGVMb29wMl0gLz0gZG91YmxlKHN0ZXBJbmNyZW1lbnRzQ291bnRlcltzdGVwTG9vcF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZGVzdEdMQ00tPm1hdHJpY2VzID0gbWF0cmljZXM7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmc3RlcEluY3JlbWVudHNDb3VudGVyICk7CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdlJlbGVhc2VHTENNKCAmZGVzdEdMQ00sIENWX0dMQ01fR0xDTSApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZDcmVhdGVHTENNRGVzY3JpcHRvcnMoIEN2R0xDTSogZGVzdEdMQ00sIGludCBkZXNjcmlwdG9yT3B0aW1pemF0aW9uVHlwZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUdMQ01EZXNjcmlwdG9ycyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBtYXRyaXhMb29wOworCisgICAgaWYoICFkZXN0R0xDTSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICEoZGVzdEdMQ00tPm1hdHJpY2VzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTWF0cmljZXMgYXJlIG5vdCBhbGxvY2F0ZWQiICk7CisKKyAgICBDVl9DQUxMKCBjdlJlbGVhc2VHTENNKCAmZGVzdEdMQ00sIENWX0dMQ01fREVTQyApKTsKKworICAgIGlmKCBkZXN0R0xDTS0+b3B0aW1pemF0aW9uVHlwZSAhPSBDVl9HTENNX09QVElNSVpBVElPTl9ISVNUT0dSQU0gKQorICAgIHsKKyAgICAgICAgZGVzdEdMQ00tPmRlc2NyaXB0b3JPcHRpbWl6YXRpb25UeXBlID0gZGVzdEdMQ00tPm51bURlc2NyaXB0b3JzID0gZGVzY3JpcHRvck9wdGltaXphdGlvblR5cGU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiSGlzdG9ncmFtLWJhc2VkIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQiICk7CisvLyAgICAgIGRlc3RHTENNLT5kZXNjcmlwdG9yT3B0aW1pemF0aW9uVHlwZSA9IGRlc3RHTENNLT5udW1EZXNjcmlwdG9ycyA9IENWX0dMQ01ERVNDX09QVElNSVpBVElPTl9ISVNUT0dSQU07CisgICAgfQorCisgICAgQ1ZfQ0FMTCggZGVzdEdMQ00tPmRlc2NyaXB0b3JzID0gKGRvdWJsZSoqKQorICAgICAgICAgICAgY3ZBbGxvYyggZGVzdEdMQ00tPm51bU1hdHJpY2VzKnNpemVvZihkZXN0R0xDTS0+ZGVzY3JpcHRvcnNbMF0pKSk7CisKKyAgICBmb3IoIG1hdHJpeExvb3AgPSAwOyBtYXRyaXhMb29wIDwgZGVzdEdMQ00tPm51bU1hdHJpY2VzOyBtYXRyaXhMb29wICsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRlc3RHTENNLT5kZXNjcmlwdG9yc1sgbWF0cml4TG9vcCBdID0KKyAgICAgICAgICAgICAgICAoZG91YmxlKiljdkFsbG9jKCBkZXN0R0xDTS0+bnVtRGVzY3JpcHRvcnMqc2l6ZW9mKGRlc3RHTENNLT5kZXNjcmlwdG9yc1swXVswXSkpKTsKKyAgICAgICAgbWVtc2V0KCBkZXN0R0xDTS0+ZGVzY3JpcHRvcnNbbWF0cml4TG9vcF0sIDAsIGRlc3RHTENNLT5udW1EZXNjcmlwdG9ycypzaXplb2YoZG91YmxlKSApOworCisgICAgICAgIHN3aXRjaCggZGVzdEdMQ00tPmRlc2NyaXB0b3JPcHRpbWl6YXRpb25UeXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBDVl9HTENNREVTQ19PUFRJTUlaQVRJT05fQUxMT1dET1VCTEVORVNUOgorICAgICAgICAgICAgICAgIGljdkNyZWF0ZUdMQ01EZXNjcmlwdG9yc19BbGxvd0RvdWJsZU5lc3QoIGRlc3RHTENNLCBtYXRyaXhMb29wICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLAorICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yT3B0aW1pemF0aW9uVHlwZSBkaWZmZXJlbnQgZnJvbSBDVl9HTENNREVTQ19PUFRJTUlaQVRJT05fQUxMT1dET1VCTEVORVNUXG4iCisgICAgICAgICAgICAgICAgImlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgY2FzZSBDVl9HTENNREVTQ19PUFRJTUlaQVRJT05fQUxMT1dUUklQTEVORVNUOgorICAgICAgICAgICAgICAgIGljdkNyZWF0ZUdMQ01EZXNjcmlwdG9yc19BbGxvd1RyaXBsZU5lc3QoIGRlc3RHTENNLCBtYXRyaXhMb29wICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENWX0dMQ01ERVNDX09QVElNSVpBVElPTl9ISVNUT0dSQU06CisgICAgICAgICAgICAgICAgaWYobWF0cml4TG9vcCA8IGRlc3RHTENNLT5udW1NYXRyaWNlcz4+MSkKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3JlYXRlR0xDTURlc2NyaXB0b3JzX0hpc3RvZ3JhbSggZGVzdEdMQ00sIG1hdHJpeExvb3ApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICovCisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlR0xDTSggJmRlc3RHTENNLCBDVl9HTENNX0RFU0MgKTsKK30KKworCitzdGF0aWMgdm9pZAoraWN2Q3JlYXRlR0xDTURlc2NyaXB0b3JzX0FsbG93RG91YmxlTmVzdCggQ3ZHTENNKiBkZXN0R0xDTSwgaW50IG1hdHJpeEluZGV4ICkKK3sKKyAgICBpbnQgc2lkZUxvb3AxLCBzaWRlTG9vcDI7CisgICAgaW50IG1hdHJpeFNpZGVMZW5ndGggPSBkZXN0R0xDTS0+bWF0cml4U2lkZUxlbmd0aDsKKworICAgIGRvdWJsZSoqIG1hdHJpeCA9IGRlc3RHTENNLT5tYXRyaWNlc1sgbWF0cml4SW5kZXggXTsKKyAgICBkb3VibGUqIGRlc2NyaXB0b3JzID0gZGVzdEdMQ00tPmRlc2NyaXB0b3JzWyBtYXRyaXhJbmRleCBdOworCisgICAgZG91YmxlKiBtYXJnaW5hbFByb2JhYmlsaXR5ID0KKyAgICAgICAgKGRvdWJsZSopY3ZBbGxvYyggbWF0cml4U2lkZUxlbmd0aCAqIHNpemVvZihtYXJnaW5hbFByb2JhYmlsaXR5WzBdKSk7CisgICAgbWVtc2V0KCBtYXJnaW5hbFByb2JhYmlsaXR5LCAwLCBtYXRyaXhTaWRlTGVuZ3RoICogc2l6ZW9mKGRvdWJsZSkgKTsKKworICAgIGRvdWJsZSBtYXhpbXVtUHJvYmFiaWxpdHkgPSAwOworICAgIGRvdWJsZSBtYXJnaW5hbFByb2JhYmlsaXR5RW50cm9weSA9IDA7CisgICAgZG91YmxlIGNvcnJlbGF0aW9uTWVhbiA9IDAsIGNvcnJlbGF0aW9uU3RkRGV2aWF0aW9uID0gMCwgY29ycmVsYXRpb25Qcm9kdWN0VGVybSA9IDA7CisKKyAgICBmb3IoIHNpZGVMb29wMT0wOyBzaWRlTG9vcDE8bWF0cml4U2lkZUxlbmd0aDsgc2lkZUxvb3AxKysgKQorICAgIHsKKyAgICAgICAgaW50IGFjdHVhbFNpZGVMb29wMSA9IGRlc3RHTENNLT5yZXZlcnNlTG9va3VwVGFibGVbIHNpZGVMb29wMSBdOworCisgICAgICAgIGZvciggc2lkZUxvb3AyPTA7IHNpZGVMb29wMjxtYXRyaXhTaWRlTGVuZ3RoOyBzaWRlTG9vcDIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBlbnRyeVZhbHVlID0gbWF0cml4WyBzaWRlTG9vcDEgXVsgc2lkZUxvb3AyIF07CisKKyAgICAgICAgICAgIGludCBhY3R1YWxTaWRlTG9vcDIgPSBkZXN0R0xDTS0+cmV2ZXJzZUxvb2t1cFRhYmxlWyBzaWRlTG9vcDIgXTsKKyAgICAgICAgICAgIGludCBzaWRlTG9vcERpZmZlcmVuY2UgPSBhY3R1YWxTaWRlTG9vcDEgLSBhY3R1YWxTaWRlTG9vcDI7CisgICAgICAgICAgICBpbnQgc2lkZUxvb3BEaWZmZXJlbmNlU3F1YXJlZCA9IHNpZGVMb29wRGlmZmVyZW5jZSpzaWRlTG9vcERpZmZlcmVuY2U7CisKKyAgICAgICAgICAgIG1hcmdpbmFsUHJvYmFiaWxpdHlbIHNpZGVMb29wMSBdICs9IGVudHJ5VmFsdWU7CisgICAgICAgICAgICBjb3JyZWxhdGlvbk1lYW4gKz0gYWN0dWFsU2lkZUxvb3AxKmVudHJ5VmFsdWU7CisKKyAgICAgICAgICAgIG1heGltdW1Qcm9iYWJpbGl0eSA9IE1BWCggbWF4aW11bVByb2JhYmlsaXR5LCBlbnRyeVZhbHVlICk7CisKKyAgICAgICAgICAgIGlmKCBhY3R1YWxTaWRlTG9vcDIgPiBhY3R1YWxTaWRlTG9vcDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19DT05UUkFTVCBdICs9IHNpZGVMb29wRGlmZmVyZW5jZVNxdWFyZWQgKiBlbnRyeVZhbHVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXNjcmlwdG9yc1sgQ1ZfR0xDTURFU0NfSE9NT0dFTklUWSBdICs9IGVudHJ5VmFsdWUgLyAoIDEuMCArIHNpZGVMb29wRGlmZmVyZW5jZVNxdWFyZWQgKTsKKworICAgICAgICAgICAgaWYoIGVudHJ5VmFsdWUgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yc1sgQ1ZfR0xDTURFU0NfRU5UUk9QWSBdICs9IGVudHJ5VmFsdWUgKiBsb2coIGVudHJ5VmFsdWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVzY3JpcHRvcnNbIENWX0dMQ01ERVNDX0VORVJHWSBdICs9IGVudHJ5VmFsdWUqZW50cnlWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYXJnaW5hbFByb2JhYmlsaXR5PjAgKQorICAgICAgICAgICAgbWFyZ2luYWxQcm9iYWJpbGl0eUVudHJvcHkgKz0gbWFyZ2luYWxQcm9iYWJpbGl0eVsgYWN0dWFsU2lkZUxvb3AxIF0qbG9nKG1hcmdpbmFsUHJvYmFiaWxpdHlbIGFjdHVhbFNpZGVMb29wMSBdKTsKKyAgICB9CisKKyAgICBtYXJnaW5hbFByb2JhYmlsaXR5RW50cm9weSA9IC1tYXJnaW5hbFByb2JhYmlsaXR5RW50cm9weTsKKworICAgIGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19DT05UUkFTVCBdICs9IGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19DT05UUkFTVCBdOworICAgIGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19FTlRST1BZIF0gPSAtZGVzY3JpcHRvcnNbIENWX0dMQ01ERVNDX0VOVFJPUFkgXTsKKyAgICBkZXNjcmlwdG9yc1sgQ1ZfR0xDTURFU0NfTUFYSU1VTVBST0JBQklMSVRZIF0gPSBtYXhpbXVtUHJvYmFiaWxpdHk7CisKKyAgICBkb3VibGUgSFhZID0gMCwgSFhZMSA9IDAsIEhYWTIgPSAwOworCisgICAgSFhZID0gZGVzY3JpcHRvcnNbIENWX0dMQ01ERVNDX0VOVFJPUFkgXTsKKworICAgIGZvciggc2lkZUxvb3AxPTA7IHNpZGVMb29wMTxtYXRyaXhTaWRlTGVuZ3RoOyBzaWRlTG9vcDErKyApCisgICAgeworICAgICAgICBkb3VibGUgc2lkZUVudHJ5VmFsdWVTdW0gPSAwOworICAgICAgICBpbnQgYWN0dWFsU2lkZUxvb3AxID0gZGVzdEdMQ00tPnJldmVyc2VMb29rdXBUYWJsZVsgc2lkZUxvb3AxIF07CisKKyAgICAgICAgZm9yKCBzaWRlTG9vcDI9MDsgc2lkZUxvb3AyPG1hdHJpeFNpZGVMZW5ndGg7IHNpZGVMb29wMisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGVudHJ5VmFsdWUgPSBtYXRyaXhbIHNpZGVMb29wMSBdWyBzaWRlTG9vcDIgXTsKKworICAgICAgICAgICAgc2lkZUVudHJ5VmFsdWVTdW0gKz0gZW50cnlWYWx1ZTsKKworICAgICAgICAgICAgaW50IGFjdHVhbFNpZGVMb29wMiA9IGRlc3RHTENNLT5yZXZlcnNlTG9va3VwVGFibGVbIHNpZGVMb29wMiBdOworCisgICAgICAgICAgICBjb3JyZWxhdGlvblByb2R1Y3RUZXJtICs9IChhY3R1YWxTaWRlTG9vcDEgLSBjb3JyZWxhdGlvbk1lYW4pICogKGFjdHVhbFNpZGVMb29wMiAtIGNvcnJlbGF0aW9uTWVhbikgKiBlbnRyeVZhbHVlOworCisgICAgICAgICAgICBkb3VibGUgY2x1c3RlclRlcm0gPSBhY3R1YWxTaWRlTG9vcDEgKyBhY3R1YWxTaWRlTG9vcDIgLSBjb3JyZWxhdGlvbk1lYW4gLSBjb3JyZWxhdGlvbk1lYW47CisKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19DTFVTVEVSVEVOREVOQ1kgXSArPSBjbHVzdGVyVGVybSAqIGNsdXN0ZXJUZXJtICogZW50cnlWYWx1ZTsKKyAgICAgICAgICAgIGRlc2NyaXB0b3JzWyBDVl9HTENNREVTQ19DTFVTVEVSU0hBREUgXSArPSBjbHVzdGVyVGVybSAqIGNsdXN0ZXJUZXJtICogY2x1c3RlclRlcm0gKiBlbnRyeVZhbHVlOworCisgICAgICAgICAgICBkb3VibGUgSFhZVmFsdWUgPSBtYXJnaW5hbFByb2JhYmlsaXR5WyBhY3R1YWxTaWRlTG9vcDEgXSAqIG1hcmdpbmFsUHJvYmFiaWxpdHlbIGFjdHVhbFNpZGVMb29wMiBdOworICAgICAgICAgICAgaWYoIEhYWVZhbHVlPjAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBIWFlWYWx1ZUxvZyA9IGxvZyggSFhZVmFsdWUgKTsKKyAgICAgICAgICAgICAgICBIWFkxICs9IGVudHJ5VmFsdWUgKiBIWFlWYWx1ZUxvZzsKKyAgICAgICAgICAgICAgICBIWFkyICs9IEhYWVZhbHVlICogSFhZVmFsdWVMb2c7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb3JyZWxhdGlvblN0ZERldmlhdGlvbiArPSAoYWN0dWFsU2lkZUxvb3AxLWNvcnJlbGF0aW9uTWVhbikgKiAoYWN0dWFsU2lkZUxvb3AxLWNvcnJlbGF0aW9uTWVhbikgKiBzaWRlRW50cnlWYWx1ZVN1bTsKKyAgICB9CisKKyAgICBIWFkxID0tIEhYWTE7CisgICAgSFhZMiA9LSBIWFkyOworCisgICAgZGVzY3JpcHRvcnNbIENWX0dMQ01ERVNDX0NPUlJFTEFUSU9OSU5GTzEgXSA9ICggSFhZIC0gSFhZMSApIC8gKCBjb3JyZWxhdGlvbk1lYW4gKTsKKyAgICBkZXNjcmlwdG9yc1sgQ1ZfR0xDTURFU0NfQ09SUkVMQVRJT05JTkZPMiBdID0gc3FydCggMS4wIC0gZXhwKCAtMi4wICogKEhYWTIgLSBIWFkgKSApICk7CisKKyAgICBjb3JyZWxhdGlvblN0ZERldmlhdGlvbiA9IHNxcnQoIGNvcnJlbGF0aW9uU3RkRGV2aWF0aW9uICk7CisKKyAgICBkZXNjcmlwdG9yc1sgQ1ZfR0xDTURFU0NfQ09SUkVMQVRJT04gXSA9IGNvcnJlbGF0aW9uUHJvZHVjdFRlcm0gLyAoY29ycmVsYXRpb25TdGREZXZpYXRpb24qY29ycmVsYXRpb25TdGREZXZpYXRpb24gKTsKKworICAgIGRlbGV0ZSBbXSBtYXJnaW5hbFByb2JhYmlsaXR5OworfQorCisKK0NWX0lNUEwgZG91YmxlIGN2R2V0R0xDTURlc2NyaXB0b3IoIEN2R0xDTSogR0xDTSwgaW50IHN0ZXAsIGludCBkZXNjcmlwdG9yICkKK3sKKyAgICBkb3VibGUgdmFsdWUgPSBEQkxfTUFYOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldEdMQ01EZXNjcmlwdG9yIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFHTENNICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggIShHTENNLT5kZXNjcmlwdG9ycykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAodW5zaWduZWQpc3RlcCA+PSAodW5zaWduZWQpKEdMQ00tPm51bU1hdHJpY2VzKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzdGVwIGlzIG5vdCBpbiAwIC4uIEdMQ00tPm51bU1hdHJpY2VzIC0gMSIgKTsKKworICAgIGlmKCAodW5zaWduZWQpZGVzY3JpcHRvciA+PSAodW5zaWduZWQpKEdMQ00tPm51bURlc2NyaXB0b3JzKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJkZXNjcmlwdG9yIGlzIG5vdCBpbiAwIC4uIEdMQ00tPm51bURlc2NyaXB0b3JzIC0gMSIgKTsKKworICAgIHZhbHVlID0gR0xDTS0+ZGVzY3JpcHRvcnNbc3RlcF1bZGVzY3JpcHRvcl07CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZHZXRHTENNRGVzY3JpcHRvclN0YXRpc3RpY3MoIEN2R0xDTSogR0xDTSwgaW50IGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBfYXZlcmFnZSwgZG91YmxlKiBfc3RhbmRhcmREZXZpYXRpb24gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRHTENNRGVzY3JpcHRvclN0YXRpc3RpY3MiICk7CisKKyAgICBpZiggX2F2ZXJhZ2UgKQorICAgICAgICAqX2F2ZXJhZ2UgPSBEQkxfTUFYOworCisgICAgaWYoIF9zdGFuZGFyZERldmlhdGlvbiApCisgICAgICAgICpfc3RhbmRhcmREZXZpYXRpb24gPSBEQkxfTUFYOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG1hdHJpeExvb3AsIG51bU1hdHJpY2VzOworICAgIGRvdWJsZSBhdmVyYWdlID0gMCwgc3F1YXJlU3VtID0gMDsKKworICAgIGlmKCAhR0xDTSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICEoR0xDTS0+ZGVzY3JpcHRvcnMpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIkRlc2NyaXB0b3JzIGFyZSBub3QgY2FsY3VsYXRlZCIgKTsKKworICAgIGlmKCAodW5zaWduZWQpZGVzY3JpcHRvciA+PSAodW5zaWduZWQpKEdMQ00tPm51bURlc2NyaXB0b3JzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiRGVzY3JpcHRvciBpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICBudW1NYXRyaWNlcyA9IEdMQ00tPm51bU1hdHJpY2VzOworCisgICAgZm9yKCBtYXRyaXhMb29wID0gMDsgbWF0cml4TG9vcCA8IG51bU1hdHJpY2VzOyBtYXRyaXhMb29wKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHRlbXAgPSBHTENNLT5kZXNjcmlwdG9yc1sgbWF0cml4TG9vcCBdWyBkZXNjcmlwdG9yIF07CisgICAgICAgIGF2ZXJhZ2UgKz0gdGVtcDsKKyAgICAgICAgc3F1YXJlU3VtICs9IHRlbXAqdGVtcDsKKyAgICB9CisKKyAgICBhdmVyYWdlIC89IG51bU1hdHJpY2VzOworCisgICAgaWYoIF9hdmVyYWdlICkKKyAgICAgICAgKl9hdmVyYWdlID0gYXZlcmFnZTsKKworICAgIGlmKCBfc3RhbmRhcmREZXZpYXRpb24gKQorICAgICAgICAqX3N0YW5kYXJkRGV2aWF0aW9uID0gc3FydCggKHNxdWFyZVN1bSAtIGF2ZXJhZ2UqYXZlcmFnZSpudW1NYXRyaWNlcykvKG51bU1hdHJpY2VzLTEpKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCBJcGxJbWFnZSoKK2N2Q3JlYXRlR0xDTUltYWdlKCBDdkdMQ00qIEdMQ00sIGludCBzdGVwICkKK3sKKyAgICBJcGxJbWFnZSogZGVzdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlR0xDTUltYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZmxvYXQqIGRlc3REYXRhOworICAgIGludCBzaWRlTG9vcDEsIHNpZGVMb29wMjsKKworICAgIGlmKCAhR0xDTSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICEoR0xDTS0+bWF0cmljZXMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJNYXRyaWNlcyBhcmUgbm90IGFsbG9jYXRlZCIgKTsKKworICAgIGlmKCAodW5zaWduZWQpc3RlcCA+PSAodW5zaWduZWQpKEdMQ00tPm51bU1hdHJpY2VzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIHN0ZXAgaW5kZXggaXMgb3V0IG9mIHJhbmdlIiApOworCisgICAgZGVzdCA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSggR0xDTS0+bWF0cml4U2lkZUxlbmd0aCwgR0xDTS0+bWF0cml4U2lkZUxlbmd0aCApLCBJUExfREVQVEhfMzJGLCAxICk7CisgICAgZGVzdERhdGEgPSAoZmxvYXQqKShkZXN0LT5pbWFnZURhdGEpOworCisgICAgZm9yKCBzaWRlTG9vcDEgPSAwOyBzaWRlTG9vcDEgPCBHTENNLT5tYXRyaXhTaWRlTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgc2lkZUxvb3AxKyssIChmbG9hdComKWRlc3REYXRhICs9IGRlc3QtPndpZHRoU3RlcCApCisgICAgeworICAgICAgICBmb3IoIHNpZGVMb29wMj0wOyBzaWRlTG9vcDIgPCBHTENNLT5tYXRyaXhTaWRlTGVuZ3RoOyBzaWRlTG9vcDIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBtYXRyaXhWYWx1ZSA9IEdMQ00tPm1hdHJpY2VzW3N0ZXBdW3NpZGVMb29wMV1bc2lkZUxvb3AyXTsKKyAgICAgICAgICAgIGRlc3REYXRhWyBzaWRlTG9vcDIgXSA9IChmbG9hdCltYXRyaXhWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmRlc3QgKTsKKworICAgIHJldHVybiBkZXN0OworfQorCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3Z0cmlmb2NhbC5jcHAgYi9jdmF1eC9zcmMvY3Z0cmlmb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwY2RiMgotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdnRyaWZvY2FsLmNwcApAQCAtMCwwICsxLDI3OTIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKy8vI2luY2x1ZGUgImN2dHlwZXMuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorLy8jaW5jbHVkZSAiY3YuaCIKKy8vI2luY2x1ZGUgIndpbmRvd3MuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKy8qIFZhbGVyeSBNb3N5YWdpbiAqLworCisvKiBGdW5jdGlvbiBkZWZlbml0aW9ucyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkIGN2T3B0aW1pemVMZXZlbmJlcmdNYXJxdWFyZHRCdW5kbGUoIEN2TWF0KiogcHJvak1hdHJzLCBDdk1hdCoqIG9ic2VydlByb2pQb2ludHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIHBvaW50c1ByZXMsIGludCBudW1JbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIHJlc3VsdFByb2pNYXRycywgQ3ZNYXQqIHJlc3VsdFBvaW50czRELGludCBtYXhJdGVyLGRvdWJsZSBlcHNpbG9uICk7CisKK2ludCBpY3ZDb21wdXRlUHJvamVjdE1hdHJpY2VzNlBvaW50cyggIEN2TWF0KiBwb2ludHMxLEN2TWF0KiBwb2ludHMyLEN2TWF0KiBwb2ludHMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qTWF0cjEsQ3ZNYXQqIHByb2pNYXRyMixDdk1hdCogcHJvak1hdHIzKTsKKwordm9pZCBpY3ZGaW5kQmFzZVRyYW5zZm9ybShDdk1hdCogcG9pbnRzLEN2TWF0KiByZXN1bHRUKTsKKwordm9pZCBHZXRHZW5lcmF0b3JSZWR1Y2VGdW5kU29sdXRpb24oQ3ZNYXQqIHBvaW50czEsQ3ZNYXQqIHBvaW50czIsQ3ZNYXQqIGZ1bmRSZWR1Y2VDb2VmMSxDdk1hdCogZnVuZFJlZHVjZUNvZWYyKTsKKworaW50IEdldEdvb2RSZWR1Y2VGdW5kYW1NYXRyRnJvbVR3byhDdk1hdCogZnVuZFJlZHVjZUNvZWYxLEN2TWF0KiBmdW5kUmVkdWNlQ29lZjIsQ3ZNYXQqIHJlc0Z1bmRSZWR1Y2VDb2VmKTsKKwordm9pZCBHZXRQcm9qTWF0ckZyb21SZWR1Y2VkRnVuZGFtZW50YWwoQ3ZNYXQqIGZ1bmRSZWR1Y2VDb2VmcyxDdk1hdCogcHJvak1hdHJDb2Vmcyk7CisKK3ZvaWQgaWN2Q29tcHV0ZVByb2plY3RNYXRyaXgoQ3ZNYXQqIG9ialBvaW50cyxDdk1hdCogcHJvalBvaW50cyxDdk1hdCogcHJvak1hdHIpOworCit2b2lkIGljdkNvbXB1dGVUcmFuc2Zvcm00RChDdk1hdCogcG9pbnRzMSxDdk1hdCogcG9pbnRzMixDdk1hdCogdHJhbnNNYXRyKTsKKworaW50IGljdkNvbXB1dGVQcm9qZWN0TWF0cmljZXNOUG9pbnRzKCAgQ3ZNYXQqIHBvaW50czEsQ3ZNYXQqIHBvaW50czIsQ3ZNYXQqIHBvaW50czMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcHJvak1hdHIxLEN2TWF0KiBwcm9qTWF0cjIsQ3ZNYXQqIHByb2pNYXRyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0aHJlc2hvbGQsLyogVGhyZXNob2xkIGZvciBnb29kIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcCwvKiBQcm9iYWJpbGl0eSBvZiBnb29kIHJlc3VsdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcG9pbnRzNEQpOworCitpbnQgaWN2Q29tcHV0ZVByb2plY3RNYXRyaWNlc05Qb2ludHMoICBDdk1hdCogcG9pbnRzMSxDdk1hdCogcG9pbnRzMixDdk1hdCogcG9pbnRzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qTWF0cjEsQ3ZNYXQqIHByb2pNYXRyMixDdk1hdCogcHJvak1hdHIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCwvKiBUaHJlc2hvbGQgZm9yIGdvb2QgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwLC8qIFByb2JhYmlsaXR5IG9mIGdvb2QgcmVzdWx0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwb2ludHM0RCk7CisKK3ZvaWQgaWN2UmVjb25zdHJ1Y3RQb2ludHNGb3IzVmlldyggQ3ZNYXQqIHByb2pNYXRyMSxDdk1hdCogcHJvak1hdHIyLEN2TWF0KiBwcm9qTWF0cjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qUG9pbnRzMSxDdk1hdCogcHJvalBvaW50czIsQ3ZNYXQqIHByb2pQb2ludHMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcG9pbnRzNEQpOworCit2b2lkIGljdlJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXcoIEN2TWF0KiBwcm9qTWF0cjEsQ3ZNYXQqIHByb2pNYXRyMixDdk1hdCogcHJvak1hdHIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcHJvalBvaW50czEsQ3ZNYXQqIHByb2pQb2ludHMyLEN2TWF0KiBwcm9qUG9pbnRzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHBvaW50czREKTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbnMgZm9yIGNhbGN1bGF0aW9uIHRoZSB0ZW5zb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIDEKK3ZvaWQgZnByaW50TWF0cml4KEZJTEUqIGZpbGUsQ3ZNYXQqIG1hdHJpeCkKK3sKKyAgICBpbnQgaSxqOworICAgIGZwcmludGYoZmlsZSwiXG4iKTsKKyAgICBmb3IoIGk9MDtpPG1hdHJpeC0+cm93cztpKysgKQorICAgIHsKKyAgICAgICAgZm9yKGo9MDtqPG1hdHJpeC0+Y29scztqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZwcmludGYoZmlsZSwiJTEwLjdsZiAgIixjdm1HZXQobWF0cml4LGksaikpOworICAgICAgICB9CisgICAgICAgIGZwcmludGYoZmlsZSwiXG4iKTsKKyAgICB9Cit9CisjZW5kaWYKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBpY3ZOb3JtYWxpemVQb2ludHMoIEN2TWF0KiBwb2ludHMsIEN2TWF0KiBub3JtUG9pbnRzLEN2TWF0KiBjYW1lcmFNYXRyICkKK3sKKyAgICAvKiBOb3JtYWxpemUgaW1hZ2UgcG9pbnRzIHVzaW5nIGNhbWVyYSBtYXRyaXggKi8KKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImljdk5vcm1hbGl6ZVBvaW50cyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGZvciBudWxsIHBvaW50ZXJzICovCisgICAgaWYoIHBvaW50cyA9PSAwIHx8IG5vcm1Qb2ludHMgPT0gMCB8fCBjYW1lcmFNYXRyID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorICAgIAorICAgIGlmKCAhQ1ZfSVNfTUFUKHBvaW50cykgfHwgIUNWX0lTX01BVChub3JtUG9pbnRzKSB8fCAhQ1ZfSVNfTUFUKGNhbWVyYU1hdHIpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcG9pbnRzLT5jb2xzOworICAgIGlmKCBudW1Qb2ludHMgPD0gMCB8fCBudW1Qb2ludHMgIT0gbm9ybVBvaW50cy0+Y29scyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgdGhlIHNhbWUgYW5kIG1vcmUgdGhhbiAwIiApOworICAgIH0KKworICAgIGlmKCBub3JtUG9pbnRzLT5yb3dzICE9IDIgfHwgbm9ybVBvaW50cy0+cm93cyAhPSBwb2ludHMtPnJvd3MgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiUG9pbnRzIG11c3QgaGF2ZSAyIGNvb3JkaW5hdGVzIiApOworICAgIH0KKworICAgIGlmKGNhbWVyYU1hdHItPnJvd3MgIT0gMyB8fCBjYW1lcmFNYXRyLT5jb2xzICE9IDMpCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIGNhbWVyYSBtYXRyaXggbXVzdCBiZSAzeDMiICk7CisgICAgfQorCisgICAgZG91YmxlIGZ4LGZ5LGN4LGN5OworCisgICAgZnggPSBjdm1HZXQoY2FtZXJhTWF0ciwwLDApOworICAgIGZ5ID0gY3ZtR2V0KGNhbWVyYU1hdHIsMSwxKTsKKyAgICBjeCA9IGN2bUdldChjYW1lcmFNYXRyLDAsMik7CisgICAgY3kgPSBjdm1HZXQoY2FtZXJhTWF0ciwxLDIpOworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGN2bVNldChub3JtUG9pbnRzLCAwLCBpLCAoY3ZtR2V0KHBvaW50cywwLGkpIC0gY3gpIC8gZnggKTsKKyAgICAgICAgY3ZtU2V0KG5vcm1Qb2ludHMsIDEsIGksIChjdm1HZXQocG9pbnRzLDEsaSkgLSBjeSkgLyBmeSApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm47Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qCitDb21wdXRlcyBwcm9qZWN0aW9uIG1hdHJpY2VzIGZvciBnaXZlbiA2IHBvaW50cyBvbiAzIGltYWdlcworTWF5IHJldHVybnMgMyByZXN1bHRzLiAqLworaW50IGljdkNvbXB1dGVQcm9qZWN0TWF0cmljZXM2UG9pbnRzKCBDdk1hdCogcG9pbnRzMSxDdk1hdCogcG9pbnRzMixDdk1hdCogcG9pbnRzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHByb2pNYXRyMSxDdk1hdCogcHJvak1hdHIyLEN2TWF0KiBwcm9qTWF0cjMvKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHBvaW50czREKi8pCit7CisgICAgLyogVGVzdCBpbnB1dCBkYXRhIGNvcnJlY3RuZXNzICovCisKKyAgICBpbnQgbnVtU29sID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29tcHV0ZVByb2plY3RNYXRyaWNlczZQb2ludHMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBmb3IgbnVsbCBwb2ludGVycyAqLworICAgIGlmKCBwb2ludHMxICAgPT0gMCB8fCBwb2ludHMyICAgPT0gMCB8fCBwb2ludHMzICAgPT0gMCB8fAorICAgICAgICBwcm9qTWF0cjEgPT0gMCB8fCBwcm9qTWF0cjIgPT0gMCB8fCBwcm9qTWF0cjMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMxKSAgIHx8ICFDVl9JU19NQVQocG9pbnRzMikgICB8fCAhQ1ZfSVNfTUFUKHBvaW50czMpICAgfHwKKyAgICAgICAgIUNWX0lTX01BVChwcm9qTWF0cjEpIHx8ICFDVl9JU19NQVQocHJvak1hdHIyKSB8fCAhQ1ZfSVNfTUFUKHByb2pNYXRyMykgICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGlmKCAocG9pbnRzMS0+Y29scyAhPSBwb2ludHMyLT5jb2xzKSB8fCAocG9pbnRzMS0+Y29scyAhPSBwb2ludHMzLT5jb2xzKSB8fCAocG9pbnRzMS0+Y29scyAhPSA2KSAvKiB8fCAocG9pbnRzNEQtPmNvbHMgIT02KSAqLykKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBwb2ludHMgbXVzdCBiZSBzYW1lIGFuZCA9PSA2IiApOworICAgIH0KKworICAgIGlmKCBwb2ludHMxLT5yb3dzICE9IDIgfHwgcG9pbnRzMi0+cm93cyAhPSAyIHx8IHBvaW50czMtPnJvd3MgIT0gMiApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIGNvb3JkaW5hdGVzIG11c3QgYmUgMiIgKTsKKyAgICB9CisKKyAgICBpZiggcHJvak1hdHIxLT5jb2xzICE9IDQgfHwgcHJvak1hdHIyLT5jb2xzICE9IDQgfHwgcHJvak1hdHIzLT5jb2xzICE9IDQgfHwKKyAgICAgICAgIShwcm9qTWF0cjEtPnJvd3MgPT0gMyAmJiBwcm9qTWF0cjItPnJvd3MgPT0gMyAmJiBwcm9qTWF0cjMtPnJvd3MgPT0gMykgJiYKKyAgICAgICAgIShwcm9qTWF0cjEtPnJvd3MgPT0gOSAmJiBwcm9qTWF0cjItPnJvd3MgPT0gOSAmJiBwcm9qTWF0cjMtPnJvd3MgPT0gOSkgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qZWN0IG1hdHJpeCBtdXN0IGJlIDN4NCBvciA5eDQgKGZvciAzIG1hdHJpY2VzKSIgKTsKKyAgICB9CisKKyNpZiAwCisgICAgaWYoIHBvaW50czRELT5yb3cgIT0gNCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgY29vcmRpbmF0ZXMgb2YgcG9pbnRzNEQgIG11c3QgYmUgNCIgKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIEZpbmQgdHJhbnNmb3JtIG1hdHJpeCBmb3IgZWFjaCBjYW1lcmEgKi8KKyAgICBpbnQgaTsKKyAgICBDdk1hdCogcG9pbnRzWzNdOworICAgIHBvaW50c1swXSA9IHBvaW50czE7CisgICAgcG9pbnRzWzFdID0gcG9pbnRzMjsKKyAgICBwb2ludHNbMl0gPSBwb2ludHMzOworCisgICAgQ3ZNYXQqIHByb2pNYXRyc1szXTsKKyAgICBwcm9qTWF0cnNbMF0gPSBwcm9qTWF0cjE7CisgICAgcHJvak1hdHJzWzFdID0gcHJvak1hdHIyOworICAgIHByb2pNYXRyc1syXSA9IHByb2pNYXRyMzsKKworICAgIEN2TWF0IHRyYW5zTWF0cjsKKyAgICBkb3VibGUgdHJhbnNNYXRyX2RhdFs5XTsKKyAgICB0cmFuc01hdHIgPSBjdk1hdCgzLDMsQ1ZfNjRGLHRyYW5zTWF0cl9kYXQpOworCisgICAgQ3ZNYXQgY29yclBvaW50czE7CisgICAgQ3ZNYXQgY29yclBvaW50czI7CisKKyAgICBkb3VibGUgY29yclBvaW50c19kYXRbMyozKjJdOy8qIDMtcG9pbnQoaW1hZ2VzKSBieSAzLWNvb3JkaW5hdGVzIGJ5IDItY29ycmVzcG9uZGVuY2UqLworCisgICAgY29yclBvaW50czEgPSBjdk1hdCgzLDMsQ1ZfNjRGLGNvcnJQb2ludHNfZGF0KTsgIC8qIDMtY29vcmRpbmF0ZXMgZm9yIGVhY2ggb2YgMy1wb2ludHMoMy1pbWFnZSkgKi8KKyAgICBjb3JyUG9pbnRzMiA9IGN2TWF0KDMsMyxDVl82NEYsY29yclBvaW50c19kYXQrOSk7LyogMy1jb29yZGluYXRlcyBmb3IgZWFjaCBvZiAzLXBvaW50cygzLWltYWdlKSAqLworCisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApLyogZm9yIGVhY2ggaW1hZ2UgKi8KKyAgICB7CisgICAgICAgIC8qIEdldCBsYXN0IDQgcG9pbnRzIGZvciBjb21wdXRpbmcgdHJhbnNmb3JtYXRpb24gKi8KKyAgICAgICAgQ3ZNYXQgdG1wUG9pbnRzOworICAgICAgICAvKiBmaW5kIGJhc2UgcG9pbnRzIHRyYW5zZm9ybSBmb3IgbGFzdCBmb3VyIHBvaW50cyBvbiBpLXRoIGltYWdlICovCisgICAgICAgIGN2R2V0U3ViUmVjdChwb2ludHNbaV0sJnRtcFBvaW50cyxjdlJlY3QoMiwwLDQsMikpOworICAgICAgICBpY3ZGaW5kQmFzZVRyYW5zZm9ybSgmdG1wUG9pbnRzLCZ0cmFuc01hdHIpOworICAgICAgICAKKyAgICAgICAgey8qIFdlIGhhdmUgYmFzZSB0cmFuc2Zvcm0uIENvbXB1dGUgZXJyb3Igc2NhbGVzIGZvciB0aHJlZSBmaXJzdCBwb2ludHMgKi8KKyAgICAgICAgICAgIEN2TWF0IHRyUG9pbnQ7CisgICAgICAgICAgICBkb3VibGUgdHJQb2ludF9kYXRbMyozXTsKKyAgICAgICAgICAgIHRyUG9pbnQgPSBjdk1hdCgzLDMsQ1ZfNjRGLHRyUG9pbnRfZGF0KTsKKyAgICAgICAgICAgIC8qIGZpbGwgcG9pbnRzICovCisgICAgICAgICAgICBmb3IoIGludCBrayA9IDA7IGtrIDwgMzsga2srKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZtU2V0KCZ0clBvaW50LDAsa2ssY3ZtR2V0KHBvaW50c1tpXSwwLGtrKzIpKTsKKyAgICAgICAgICAgICAgICBjdm1TZXQoJnRyUG9pbnQsMSxrayxjdm1HZXQocG9pbnRzW2ldLDEsa2srMikpOworICAgICAgICAgICAgICAgIGN2bVNldCgmdHJQb2ludCwyLGtrLDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBUcmFuc2Zvcm0gcG9pbnRzICovCisgICAgICAgICAgICBDdk1hdCByZXNQbnRzOworICAgICAgICAgICAgZG91YmxlIHJlc1BudHNfZGF0WzldOworICAgICAgICAgICAgcmVzUG50cyA9IGN2TWF0KDMsMyxDVl82NEYscmVzUG50c19kYXQpOworICAgICAgICAgICAgY3ZtTXVsKCZ0cmFuc01hdHIsJnRyUG9pbnQsJnJlc1BudHMpOworICAgICAgICB9CisKKyAgICAgICAgLyogVHJhbnNmb3JtIHR3byBmaXJzdCBwb2ludHMgKi8KKyAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCAyOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdk1hdCBwbnQ7CisgICAgICAgICAgICBkb3VibGUgcG50X2RhdFszXTsKKyAgICAgICAgICAgIHBudCA9IGN2TWF0KDMsMSxDVl82NEYscG50X2RhdCk7CisgICAgICAgICAgICBwbnRfZGF0WzBdID0gY3ZtR2V0KHBvaW50c1tpXSwwLGopOworICAgICAgICAgICAgcG50X2RhdFsxXSA9IGN2bUdldChwb2ludHNbaV0sMSxqKTsKKyAgICAgICAgICAgIHBudF9kYXRbMl0gPSAxLjA7CisKKyAgICAgICAgICAgIEN2TWF0IHRyUG50OworICAgICAgICAgICAgZG91YmxlIHRyUG50X2RhdFszXTsKKyAgICAgICAgICAgIHRyUG50ID0gY3ZNYXQoMywxLENWXzY0Rix0clBudF9kYXQpOworCisgICAgICAgICAgICBjdm1NdWwoJnRyYW5zTWF0ciwmcG50LCZ0clBudCk7CisKKyAgICAgICAgICAgIC8qIENvbGxlY3QgdHJhbnNmb3JtZWQgcG9pbnRzICAqLworICAgICAgICAgICAgY29yclBvaW50c19kYXRbaiAqIDkgKyAwICogMyArIGldID0gdHJQbnRfZGF0WzBdOy8qIHggKi8KKyAgICAgICAgICAgIGNvcnJQb2ludHNfZGF0W2ogKiA5ICsgMSAqIDMgKyBpXSA9IHRyUG50X2RhdFsxXTsvKiB5ICovCisgICAgICAgICAgICBjb3JyUG9pbnRzX2RhdFtqICogOSArIDIgKiAzICsgaV0gPSB0clBudF9kYXRbMl07LyogdyAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyogV2UgaGF2ZSBjb21wdXRlZCBjb3JyIHBvaW50cy4gTm93IHdlIGNhbiBjb21wdXRlIGdlbmVyYXRvcnMgZm9yIHJlZHVjZWQgZnVuZGFtZW50YWwgbWF0cml4ICovCisKKyAgICAvKiBDb21wdXRlIGdlbmVyYXRvcnMgZm9yIHJlZHVjZWQgZnVuZGFtZW50YWwgbWF0cml4IGZyb20gMyBwYWlyIG9mIGNvbGxlY3QgcG9pbnRzICovCisgICAgQ3ZNYXQgZnVuZFJlZHVjZUNvZWYxOworICAgIEN2TWF0IGZ1bmRSZWR1Y2VDb2VmMjsKKyAgICBkb3VibGUgZnVuZFJlZHVjZUNvZWYxX2RhdFs1XTsKKyAgICBkb3VibGUgZnVuZFJlZHVjZUNvZWYyX2RhdFs1XTsKKworICAgIGZ1bmRSZWR1Y2VDb2VmMSA9IGN2TWF0KDEsNSxDVl82NEYsZnVuZFJlZHVjZUNvZWYxX2RhdCk7CisgICAgZnVuZFJlZHVjZUNvZWYyID0gY3ZNYXQoMSw1LENWXzY0RixmdW5kUmVkdWNlQ29lZjJfZGF0KTsKKworICAgIEdldEdlbmVyYXRvclJlZHVjZUZ1bmRTb2x1dGlvbigmY29yclBvaW50czEsICZjb3JyUG9pbnRzMiwgJmZ1bmRSZWR1Y2VDb2VmMSwgJmZ1bmRSZWR1Y2VDb2VmMik7CisKKyAgICAvKiBDaG9vc2UgYmVzdCBzb2x1dGlvbnMgZm9yIHR3byBnZW5lcmF0b3JzLiBXZSBjYW4gZ2V0IDMgc29sdXRpb25zICovCisgICAgQ3ZNYXQgcmVzRnVuZFJlZHVjZUNvZWY7CisgICAgZG91YmxlIHJlc0Z1bmRSZWR1Y2VDb2VmX2RhdFszKjVdOworCisgICAgcmVzRnVuZFJlZHVjZUNvZWYgPSBjdk1hdCgzLDUsQ1ZfNjRGLHJlc0Z1bmRSZWR1Y2VDb2VmX2RhdCk7CisKKyAgICBudW1Tb2wgPSBHZXRHb29kUmVkdWNlRnVuZGFtTWF0ckZyb21Ud28oJmZ1bmRSZWR1Y2VDb2VmMSwgJmZ1bmRSZWR1Y2VDb2VmMiwmcmVzRnVuZFJlZHVjZUNvZWYpOworCisgICAgaW50IG1heFNvbDsKKyAgICBtYXhTb2wgPSBwcm9qTWF0cnNbMF0tPnJvd3MgLyAzOworCisgICAgaW50IGN1cnJTb2w7CisgICAgZm9yKCBjdXJyU29sID0gMDsgKGN1cnJTb2wgPCBudW1Tb2wgJiYgY3VyclNvbCA8IG1heFNvbCk7IGN1cnJTb2wrKyApCisgICAgeworICAgICAgICAvKiBGb3IgY3VycmVudCBzb2x1dGlvbiBjb21wdXRlIHByb2plY3Rpb24gbWF0cml4ICovCisgICAgICAgIEN2TWF0IGZ1bmRDb2VmczsKKyAgICAgICAgY3ZHZXRTdWJSZWN0KCZyZXNGdW5kUmVkdWNlQ29lZiwgJmZ1bmRDb2VmcywgY3ZSZWN0KDAsY3VyclNvbCw1LDEpKTsKKworICAgICAgICBDdk1hdCBwcm9qTWF0ckNvZWZzOworICAgICAgICBkb3VibGUgcHJvak1hdHJDb2Vmc19kYXRbNF07CisgICAgICAgIHByb2pNYXRyQ29lZnMgPSBjdk1hdCgxLDQsQ1ZfNjRGLHByb2pNYXRyQ29lZnNfZGF0KTsKKworICAgICAgICBHZXRQcm9qTWF0ckZyb21SZWR1Y2VkRnVuZGFtZW50YWwoJmZ1bmRDb2VmcywmcHJvak1hdHJDb2Vmcyk7CisgICAgICAgIC8qIHdlIGhhdmUgY29tcHV0ZWQgY29lZmZzIGZvciByZWR1Y2VkIHByb2plY3QgbWF0cml4ICovCisKKyAgICAgICAgQ3ZNYXQgb2JqUG9pbnRzOworICAgICAgICBkb3VibGUgb2JqUG9pbnRzX2RhdFs0KjZdOworICAgICAgICBvYmpQb2ludHMgID0gY3ZNYXQoNCw2LENWXzY0RixvYmpQb2ludHNfZGF0KTsKKyAgICAgICAgY3ZaZXJvKCZvYmpQb2ludHMpOworCisgICAgICAgIC8qIGZpbGwgb2JqZWN0IHBvaW50cyAqLworICAgICAgICBmb3IoIGkgPTA7IGkgPCA0OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBvYmpQb2ludHNfZGF0W2kqNl0gICA9IDE7CisgICAgICAgICAgICBvYmpQb2ludHNfZGF0W2kqNisxXSA9IHByb2pNYXRyQ29lZnNfZGF0W2ldOworICAgICAgICAgICAgb2JqUG9pbnRzX2RhdFtpKjcrMl0gPSAxOworICAgICAgICB9CisKKyAgICAgICAgaW50IGN1cnJDYW1lcmE7CisgICAgICAgIGZvciggY3VyckNhbWVyYSA9IDA7IGN1cnJDYW1lcmEgPCAzOyBjdXJyQ2FtZXJhKysgKQorICAgICAgICB7CisKKyAgICAgICAgICAgIEN2TWF0IHByb2pQb2ludHM7CisgICAgICAgICAgICBkb3VibGUgcHJvalBvaW50c19kYXRbMyo2XTsKKyAgICAgICAgICAgIHByb2pQb2ludHMgPSBjdk1hdCgzLDYsQ1ZfNjRGLHByb2pQb2ludHNfZGF0KTsKKworICAgICAgICAgICAgLyogZmlsbCBwcm9qZWN0ZWQgcG9pbnRzIGZvciBjdXJyZW50IGNhbWVyYSAqLworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDY7IGkrKyApLyogZm9yIGVhY2ggcG9pbnRzIGZvciBjdXJyZW50IGNhbWVyYSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHByb2pQb2ludHNfZGF0WzYqMCtpXSA9IGN2bUdldChwb2ludHNbY3VyckNhbWVyYV0sMCxpKTsvKiB4ICovCisgICAgICAgICAgICAgICAgcHJvalBvaW50c19kYXRbNioxK2ldID0gY3ZtR2V0KHBvaW50c1tjdXJyQ2FtZXJhXSwxLGkpOy8qIHkgKi8KKyAgICAgICAgICAgICAgICBwcm9qUG9pbnRzX2RhdFs2KjIraV0gPSAxOy8qIHcgKi8KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogY29tcHV0ZSBwcm9qZWN0IG1hdHJpeCBmb3IgY3VycmVudCBjYW1lcmEgKi8KKyAgICAgICAgICAgIEN2TWF0IHByb2pNYXRyaXg7CisgICAgICAgICAgICBkb3VibGUgcHJvak1hdHJpeF9kYXRbMyo0XTsKKyAgICAgICAgICAgIHByb2pNYXRyaXggPSBjdk1hdCgzLDQsQ1ZfNjRGLHByb2pNYXRyaXhfZGF0KTsKKworICAgICAgICAgICAgaWN2Q29tcHV0ZVByb2plY3RNYXRyaXgoJm9ialBvaW50cywmcHJvalBvaW50cywmcHJvak1hdHJpeCk7CisKKyAgICAgICAgICAgIC8qIEFkZCB0aGlzIG1hdHJpeCB0byByZXN1bHQgKi8KKyAgICAgICAgICAgIEN2TWF0IHRtcFN1YlJlczsKKyAgICAgICAgICAgIGN2R2V0U3ViUmVjdChwcm9qTWF0cnNbY3VyckNhbWVyYV0sJnRtcFN1YlJlcyxjdlJlY3QoMCxjdXJyU29sKjMsNCwzKSk7CisgICAgICAgICAgICBjdkNvbnZlcnQoJnByb2pNYXRyaXgsJnRtcFN1YlJlcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBrbm93IHByb2plY3QgbWF0cmljZXMuIEFuZCB3ZSBjYW4gcmVjb25zdHJ1Y3QgNiAzRC1wb2ludHMgaWYgbmVlZCAqLworI2lmIDAKKyAgICAgICAgaWYoIHBvaW50czREICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGN1cnJTb2wgPCBwb2ludHM0RC0+cm93cyAvIDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2TWF0IHRtcFBvaW50czREOworICAgICAgICAgICAgICAgIGRvdWJsZSB0bXBQb2ludHM0RF9kYXRbNCo2XTsKKyAgICAgICAgICAgICAgICB0bXBQb2ludHM0RCA9IGN2TWF0KDQsNixDVl82NEYsdG1wUG9pbnRzNERfZGF0KTsKKworICAgICAgICAgICAgICAgIGljdlJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXcoICZ3UHJvak1hdHJbMF0sICZ3UHJvak1hdHJbMV0sICZ3UHJvak1hdHJbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzMSwgcG9pbnRzMiwgcG9pbnRzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wUG9pbnRzNEQpOworCisgICAgICAgICAgICAgICAgQ3ZNYXQgdG1wU3ViUmVzOworICAgICAgICAgICAgICAgIGN2R2V0U3ViUmVjdChwb2ludHM0RCx0bXBTdWJSZXMsY3ZSZWN0KDAsY3VyclNvbCo0LDYsNCkpOworICAgICAgICAgICAgICAgIGN2Q29udmVydCh0bXBQb2ludHM0RCxwb2ludHM0RCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgfS8qIGZvciBhbGwgc29sbHV0aW9ucyAqLworCisgICAgX19FTkRfXzsKKyAgICByZXR1cm4gbnVtU29sOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaWN2R2V0UmFuZE51bWJlcnMoaW50IHJhbmdlLGludCBjb3VudCxpbnQqIGFycikKK3sKKyAgICAvKiBHZW5lcmF0ZSByYW5kb20gbnVtYmVycyBbMCxyYW5nZS0xXSAqLworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZHZXRSYW5kTnVtYmVycyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGlucHV0IGRhdGEgKi8KKyAgICBpZiggYXJyID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJQYXJhbWV0ZXIgJ2FycicgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisKKyAgICAvKiBUZXN0IGZvciBlcnJvcnMgaW5wdXQgZGF0YSAgKi8KKyAgICBpZiggcmFuZ2UgPCBjb3VudCB8fCByYW5nZSA8PSAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiQ2FuJ3QgZ2VuZXJhdGUgc3VjaCBudW1iZXJzLiBDb3VudCBtdXN0IGJlIDw9IHJhbmdlIGFuZCByYW5nZSBtdXN0IGJlID4gMCIgKTsKKyAgICB9CisgICAgCisgICAgaW50IGksajsKKyAgICBpbnQgbmV3UmFuZDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworCisgICAgICAgIGludCBoYXZlUmVwID0gMDsvKiBmaXJzdGx5IHdlIGhhdmUgbm90IHJlcGVhdHMgKi8KKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgLyogZ2VuZXJhdGUgbmV3IG51bWJlciAqLworICAgICAgICAgICAgbmV3UmFuZCA9IHJhbmQoKSVyYW5nZTsKKyAgICAgICAgICAgIGhhdmVSZXAgPSAwOworICAgICAgICAgICAgLyogVGVzdCBmb3IgcmVwZWF0cyBpbiBwcmV2aW91cyBudW1iZXJzICovCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgaTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggYXJyW2pdID09IG5ld1JhbmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaGF2ZVJlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZShoYXZlUmVwKTsKKyAgICAgICAgCisgICAgICAgIC8qIFdlIGhhdmUgZ29vZCByYW5kb20gbnVtYmVyICovCisgICAgICAgIGFycltpXSA9IG5ld1JhbmQ7CisgICAgfQorICAgIF9fRU5EX187CisgICAgcmV0dXJuIDE7Cit9CisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCit2b2lkIGljdlNlbGVjdENvbHNCeU51bWJlcnMoQ3ZNYXQqIHNyY01hdHIsIEN2TWF0KiBkc3RNYXRyLCBpbnQqIGluZGV4ZXMsaW50IG51bWJlcikKK3sKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2U2VsZWN0Q29sc0J5TnVtYmVycyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGlucHV0IGRhdGEgKi8KKyAgICBpZiggc3JjTWF0ciA9PSAwIHx8IGRzdE1hdHIgPT0gMCB8fCBpbmRleGVzID09IDApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmNNYXRyKSB8fCAhQ1ZfSVNfTUFUKGRzdE1hdHIpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgInNyY01hdHIgYW5kIGRzdE1hdHIgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBzcmNTaXplOworICAgIGludCBudW1Sb3dzOworICAgIG51bVJvd3MgPSBzcmNNYXRyLT5yb3dzOworICAgIHNyY1NpemUgPSBzcmNNYXRyLT5jb2xzOworICAgIAorICAgIGlmKCBudW1Sb3dzICE9IGRzdE1hdHItPnJvd3MgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2Ygcm93cyBvZiBtYXRyaWNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGludCBkc3Q7CisgICAgZm9yKCBkc3QgPSAwOyBkc3QgPCBudW1iZXI7IGRzdCsrICkKKyAgICB7CisgICAgICAgIGludCBzcmMgPSBpbmRleGVzW2RzdF07CisgICAgICAgIGlmKCBzcmMgPj0wICYmIHNyYyA8IHNyY1NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb3B5IGVhY2ggZWxlbWVudHMgaW4gY29sdW1uICovCisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Sb3dzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2bVNldChkc3RNYXRyLGksZHN0LGN2bUdldChzcmNNYXRyLGksc3JjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwordm9pZCBpY3ZQcm9qZWN0NERQb2ludHMoQ3ZNYXQqIHBvaW50czRELEN2TWF0KiBwcm9qTWF0ciwgQ3ZNYXQqIHByb2pQb2ludHMpCit7CisKKyAgICBDdk1hdCogdG1wUHJvalBvaW50cyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZQcm9qZWN0NERQb2ludHMiICk7CisgICAgCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCBwb2ludHM0RCA9PSAwIHx8IHByb2pNYXRyID09IDAgfHwgcHJvalBvaW50cyA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQocG9pbnRzNEQpIHx8ICFDVl9JU19NQVQocHJvak1hdHIpIHx8ICFDVl9JU19NQVQocHJvalBvaW50cykgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyBtdXN0IGJlIGEgbWF0cmljZXMiICk7CisgICAgfQorCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwb2ludHM0RC0+Y29sczsKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHM0RCBtdXN0IGJlIG1vcmUgdGhhbiB6ZXJvIiApOworICAgIH0KKworICAgIGlmKCBudW1Qb2ludHMgIT0gcHJvalBvaW50cy0+Y29scyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgICB9CisKKyAgICBpZiggcHJvalBvaW50cy0+cm93cyAhPSAyICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBjb29yZGluYXRlcyBvZiBwcm9qZWN0ZWQgcG9pbnRzIG11c3QgYmUgMiIpOworICAgIH0KKworICAgIGlmKCBwb2ludHM0RC0+cm93cyAhPSA0ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIG9mIDREIHBvaW50cyBtdXN0IGJlIDQiKTsKKyAgICB9CisKKyAgICBpZiggcHJvak1hdHItPmNvbHMgIT0gNCB8fCBwcm9qTWF0ci0+cm93cyAhPSAzICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgcHJvamVjdGlvbiBtYXRyaXggbXVzdCBiZSAzeDQiKTsKKyAgICB9CisKKworICAgIENWX0NBTEwoIHRtcFByb2pQb2ludHMgPSBjdkNyZWF0ZU1hdCgzLG51bVBvaW50cyxDVl82NEYpICk7CisKKyAgICBjdm1NdWwocHJvak1hdHIscG9pbnRzNEQsdG1wUHJvalBvaW50cyk7CisgICAgCisgICAgLyogU2NhbGUgcG9pbnRzICovCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzY2FsZSx4LHk7CisKKyAgICAgICAgc2NhbGUgPSBjdm1HZXQodG1wUHJvalBvaW50cywyLGkpOworICAgICAgICB4ID0gY3ZtR2V0KHRtcFByb2pQb2ludHMsMCxpKTsKKyAgICAgICAgeSA9IGN2bUdldCh0bXBQcm9qUG9pbnRzLDEsaSk7CisKKyAgICAgICAgaWYoIGZhYnMoc2NhbGUpID4gMWUtNyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHggLz0gc2NhbGU7CisgICAgICAgICAgICB5IC89IHNjYWxlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgeCA9IDFlODsKKyAgICAgICAgICAgIHkgPSAxZTg7CisgICAgICAgIH0KKworICAgICAgICBjdm1TZXQocHJvalBvaW50cywwLGkseCk7CisgICAgICAgIGN2bVNldChwcm9qUG9pbnRzLDEsaSx5KTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCZ0bXBQcm9qUG9pbnRzKTsKKworICAgIHJldHVybjsKK30KKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK2ludCBpY3ZDb21wdXRlM1Byb2plY3RNYXRyaWNlc05Qb2ludHNTdGF0dXMoIEN2TWF0KiogcG9pbnRzLC8qIDMgYXJyYXlzIG9mIHBvaW50cyBvbiBpbWFnZSAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiogcHJvak1hdHJzLC8qIGFycmF5IG9mIDMgcHJlamVjdGlvbiBtYXRyaWNlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqKiBzdGF0dXNlcywvKiAzIGFycmF5cyBvZiBzdGF0dXMgb2YgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGhyZXNob2xkLC8qIFRocmVzaG9sZCBmb3IgZ29vZCBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHAsLyogUHJvYmFiaWxpdHkgb2YgZ29vZCByZXN1bHQuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcmVzU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHBvaW50czREKQoreworICAgIGludCBudW1Qcm9qTWF0cnMgPSAwOworICAgIHVuc2lnbmVkIGNoYXIgKmNvbVN0YXQgPSAwOworICAgIEN2TWF0ICp0cmlQb2ludHNbM10gPSB7MCwwLDB9OworICAgIEN2TWF0ICpzdGF0dXMgPSAwOworICAgIEN2TWF0ICp0cmlQb2ludHM0RCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGUzUHJvamVjdE1hdHJpY2VzTlBvaW50c1N0YXR1cyIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBUZXN0IGZvciBlcnJvcnMgKi8KKyAgICBpZiggcG9pbnRzID09IDAgfHwgcHJvak1hdHJzID09IDAgfHwgc3RhdHVzZXMgPT0gMCB8fCByZXNTdGF0dXMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpbnQgY3VyckltYWdlOworICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgMzsgY3VyckltYWdlKysgKQorICAgIHsKKyAgICAgICAgLyogVGVzdCBmb3IgbnVsbCBwb2ludGVycyAqLworICAgICAgICBpZiggcG9pbnRzW2N1cnJJbWFnZV0gPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwb2ludHMgYXJyYXlzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHByb2pNYXRyc1tjdXJySW1hZ2VdID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcHJvak1hdHIgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3RhdHVzZXNbY3VyckltYWdlXSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHN0YXR1cyBhcnJheXMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBUZXN0IGZvciBtYXRyaWNlcyAqLworICAgICAgICBpZiggIUNWX0lTX01BVChwb2ludHNbY3VyckltYWdlXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcG9pbnRzIGFycmF5cyBpcyBub3QgYSBtYXRyaXgiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggIUNWX0lTX01BVChwcm9qTWF0cnNbY3VyckltYWdlXSkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcHJvak1hdHIgaXMgbm90IGEgbWF0cml4IiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUihzdGF0dXNlc1tjdXJySW1hZ2VdKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBzdGF0dXMgYXJyYXlzIGlzIG5vdCBhIG1hc2sgYXJyYXkiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQgbnVtUG9pbnRzOworICAgIG51bVBvaW50cyA9IHBvaW50c1swXS0+Y29sczsKKyAgICBpZiggbnVtUG9pbnRzIDwgNiApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBwb2ludHMgbXVzdCBiZSBtb3JlIHRoYW4gNiIgKTsKKyAgICB9CisKKyAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IDM7IGN1cnJJbWFnZSsrICkKKyAgICB7CisgICAgICAgIGlmKCBwb2ludHNbY3VyckltYWdlXS0+Y29scyAhPSBudW1Qb2ludHMgfHwgc3RhdHVzZXNbY3VyckltYWdlXS0+Y29scyAhPSBudW1Qb2ludHMgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIGFuZCBzdGF0dXNlcyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHBvaW50c1tjdXJySW1hZ2VdLT5yb3dzICE9IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHMgY29vcmRpbmF0ZXMgbXVzdCBiZSA9PSAyIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHN0YXR1c2VzW2N1cnJJbWFnZV0tPnJvd3MgIT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiRWFjaCBvZiBzdGF0dXMgbXVzdCBiZSBtYXRyaXggMXhOIiApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHByb2pNYXRyc1tjdXJySW1hZ2VdLT5yb3dzICE9IDMgfHwgcHJvak1hdHJzW2N1cnJJbWFnZV0tPmNvbHMgIT0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiRWFjaCBvZiBwcm9qZWN0aW9uIG1hdHJpeCBtdXN0IGJlIDN4NCIgKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgLyogQ3JlYXRlIGNvbW1vbiBzdGF0dXMgZm9yIGFsbCBwb2ludHMgKi8KKyAgICAKKyAgICBpbnQgaTsKKworICAgIENWX0NBTEwoIGNvbVN0YXQgPSAodW5zaWduZWQgY2hhciopY3ZBbGxvYyhzaXplb2YodW5zaWduZWQgY2hhcikqbnVtUG9pbnRzKSApOworCisgICAgdW5zaWduZWQgY2hhciAqc3RhdHNbM107CisKKyAgICBzdGF0c1swXSA9IHN0YXR1c2VzWzBdLT5kYXRhLnB0cjsKKyAgICBzdGF0c1sxXSA9IHN0YXR1c2VzWzFdLT5kYXRhLnB0cjsKKyAgICBzdGF0c1syXSA9IHN0YXR1c2VzWzJdLT5kYXRhLnB0cjsKKworICAgIGludCBudW1UcmlwbDsKKyAgICBudW1UcmlwbCA9IDA7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbVN0YXRbaV0gPSAodW5zaWduZWQgY2hhcikoc3RhdHNbMF1baV0gKiBzdGF0c1sxXVtpXSAqIHN0YXRzWzJdW2ldKTsKKyAgICAgICAgbnVtVHJpcGwgKz0gY29tU3RhdFtpXTsKKyAgICB9CisKKyAgICBpZiggbnVtVHJpcGwgPiAwICkKKyAgICB7CisgICAgICAgIC8qIENyZWF0ZSBuZXcgYXJyYXlzIHdpdGggcG9pbnRzICovCisgICAgICAgIENWX0NBTEwoIHRyaVBvaW50c1swXSA9IGN2Q3JlYXRlTWF0KDIsbnVtVHJpcGwsQ1ZfNjRGKSApOworICAgICAgICBDVl9DQUxMKCB0cmlQb2ludHNbMV0gPSBjdkNyZWF0ZU1hdCgyLG51bVRyaXBsLENWXzY0RikgKTsKKyAgICAgICAgQ1ZfQ0FMTCggdHJpUG9pbnRzWzJdID0gY3ZDcmVhdGVNYXQoMixudW1UcmlwbCxDVl82NEYpICk7CisgICAgICAgIGlmKCBwb2ludHM0RCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHRyaVBvaW50czREICA9IGN2Q3JlYXRlTWF0KDQsbnVtVHJpcGwsQ1ZfNjRGKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogQ3JlYXRlIHN0YXR1cyBhcnJheSAqLworICAgICAgICBDVl9DQUxMKCBzdGF0dXMgPSBjdkNyZWF0ZU1hdCgxLG51bVRyaXBsLENWXzY0RikgKTsKKworICAgICAgICAvKiBDb3B5IHBvaW50cyB0byBuZXcgYXJyYXlzICovCisgICAgICAgIGludCBjdXJyUG50ID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNvbVN0YXRbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgMzsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KHRyaVBvaW50c1tjdXJySW1hZ2VdLDAsY3VyclBudCxjdm1HZXQocG9pbnRzW2N1cnJJbWFnZV0sMCxpKSk7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldCh0cmlQb2ludHNbY3VyckltYWdlXSwxLGN1cnJQbnQsY3ZtR2V0KHBvaW50c1tjdXJySW1hZ2VdLDEsaSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyUG50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBDYWxsIGZ1bmN0aW9uICovCisgICAgICAgIG51bVByb2pNYXRycyA9IGljdkNvbXB1dGVQcm9qZWN0TWF0cmljZXNOUG9pbnRzKCB0cmlQb2ludHNbMF0sdHJpUG9pbnRzWzFdLHRyaVBvaW50c1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2pNYXRyc1swXSxwcm9qTWF0cnNbMV0scHJvak1hdHJzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkLC8qIFRocmVzaG9sZCBmb3IgZ29vZCBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwvKiBQcm9iYWJpbGl0eSBvZiBnb29kIHJlc3VsdC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaVBvaW50czREKTsKKworICAgICAgICAvKiBHZXQgY29tcHV0ZWQgc3RhdHVzIGFuZCBzZXQgdG8gcmVzdWx0ICovCisgICAgICAgIGN2WmVybyhyZXNTdGF0dXMpOworICAgICAgICBjdXJyUG50ID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNvbVN0YXRbaV0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBjdm1HZXQoc3RhdHVzLDAsY3VyclBudCkgPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJlc1N0YXR1cy0+ZGF0YS5wdHJbaV0gPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyUG50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggdHJpUG9pbnRzNEQgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBDb3B5IGNvcG11dGVkIDREIHBvaW50cyAqLworICAgICAgICAgICAgY3ZaZXJvKHBvaW50czREKTsKKyAgICAgICAgICAgIGN1cnJQbnQgPSAwOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY29tU3RhdFtpXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggY3ZtR2V0KHN0YXR1cywwLGN1cnJQbnQpID4gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldCggcG9pbnRzNEQsIDAsIGksIGN2bUdldCggdHJpUG9pbnRzNEQgLCAwLCBjdXJyUG50KSApOworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KCBwb2ludHM0RCwgMSwgaSwgY3ZtR2V0KCB0cmlQb2ludHM0RCAsIDEsIGN1cnJQbnQpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdm1TZXQoIHBvaW50czRELCAyLCBpLCBjdm1HZXQoIHRyaVBvaW50czREICwgMiwgY3VyclBudCkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2bVNldCggcG9pbnRzNEQsIDMsIGksIGN2bUdldCggdHJpUG9pbnRzNEQgLCAzLCBjdXJyUG50KSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1cnJQbnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgLyogRnJlZSBhbGxvY2F0ZWQgbWVtb3J5ICovCisgICAgY3ZSZWxlYXNlTWF0KCZzdGF0dXMpOworICAgIGN2RnJlZSggJmNvbVN0YXQpOworICAgIGN2UmVsZWFzZU1hdCgmc3RhdHVzKTsKKworICAgIGN2UmVsZWFzZU1hdCgmdHJpUG9pbnRzWzBdKTsKKyAgICBjdlJlbGVhc2VNYXQoJnRyaVBvaW50c1sxXSk7CisgICAgY3ZSZWxlYXNlTWF0KCZ0cmlQb2ludHNbMl0pOworICAgIGN2UmVsZWFzZU1hdCgmdHJpUG9pbnRzNEQpOworCisgICAgcmV0dXJuIG51bVByb2pNYXRyczsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCitpbnQgaWN2Q29tcHV0ZVByb2plY3RNYXRyaWNlc05Qb2ludHMoICBDdk1hdCogcG9pbnRzMSxDdk1hdCogcG9pbnRzMixDdk1hdCogcG9pbnRzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qTWF0cjEsQ3ZNYXQqIHByb2pNYXRyMixDdk1hdCogcHJvak1hdHIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRocmVzaG9sZCwvKiBUaHJlc2hvbGQgZm9yIGdvb2QgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBwLC8qIFByb2JhYmlsaXR5IG9mIGdvb2QgcmVzdWx0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwb2ludHM0RCkKK3sKKyAgICAvKiBSZXR1cm5zIHN0YXR1cyBmb3IgZWFjaCBwb2ludCwgR29vZCBvciBiYWQgKi8KKworICAgIC8qIENvbXB1dGUgcHJvamVjdGlvbiBtYXRyaWNlcyB1c2luZyBOIHBvaW50cyAqLworCisgICAgY2hhciogZmxhZ3MgPSAwOworICAgIGNoYXIqIGJlc3RGbGFncyA9IDA7CisKKyAgICBpbnQgbnVtUHJvak1hdHJzID0gMDsKKworICAgIEN2TWF0KiB0bXBQcm9qUG9pbnRzWzNdPXswLDAsMH07CisgICAgQ3ZNYXQqIHJlY1BvaW50czREID0gMDsKKyAgICBDdk1hdCAqcmVjb25Qb2ludHM0RCA9IDA7CisKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29tcHV0ZVByb2plY3RNYXRyaWNlc05Qb2ludHMiICk7CisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQqIHBvaW50c1szXTsKKyAgICBwb2ludHNbMF0gPSBwb2ludHMxOworICAgIHBvaW50c1sxXSA9IHBvaW50czI7CisgICAgcG9pbnRzWzJdID0gcG9pbnRzMzsKKworICAgIC8qIFRlc3QgZm9yIGVycm9ycyAqLworICAgIGlmKCBwb2ludHMxICAgPT0gMCB8fCBwb2ludHMyICAgPT0gMCB8fCBwb2ludHMzICAgPT0gMCB8fAorICAgICAgICBwcm9qTWF0cjEgPT0gMCB8fCBwcm9qTWF0cjIgPT0gMCB8fCBwcm9qTWF0cjMgPT0gMCB8fAorICAgICAgICBzdGF0dXMgPT0gMCkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHBvaW50czEpICAgfHwgIUNWX0lTX01BVChwb2ludHMyKSAgIHx8ICFDVl9JU19NQVQocG9pbnRzMykgICB8fAorICAgICAgICAhQ1ZfSVNfTUFUKHByb2pNYXRyMSkgfHwgIUNWX0lTX01BVChwcm9qTWF0cjIpIHx8ICFDVl9JU19NQVQocHJvak1hdHIzKSAgfHwKKyAgICAgICAgIUNWX0lTX01BVChzdGF0dXMpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcG9pbnRzMS0+Y29sczsKKworICAgIGlmKCBudW1Qb2ludHMgPCA2ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTnVtYmVyIHBvaW50cyBtdXN0IGJlIG1vcmUgdGhhbiA2IiApOworICAgIH0KKworICAgIGlmKCBudW1Qb2ludHMgIT0gcG9pbnRzMi0+Y29scyB8fCBudW1Qb2ludHMgIT0gcG9pbnRzMy0+Y29scyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJudW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgdGhlIHNhbWUiICk7CisgICAgfQorCisgICAgaWYoIHAgPCAwIHx8IHAgPiAxLjAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJQcm9iYWJpbGl0eSBtdXN0IGJlID49MCBhbmQgPD0xIiApOworICAgIH0KKworICAgIGlmKCB0aHJlc2hvbGQgPCAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhyZXNob2xkIGZvciBnb29kIHBvaW50cyBtdXN0IGJlIGF0IGxlYXN0ID49IDAiICk7CisgICAgfQorCisgICAgQ3ZNYXQqIHByb2pNYXRyc1szXTsKKworICAgIHByb2pNYXRyc1swXSA9IHByb2pNYXRyMTsKKyAgICBwcm9qTWF0cnNbMV0gPSBwcm9qTWF0cjI7CisgICAgcHJvak1hdHJzWzJdID0gcHJvak1hdHIzOworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgeworICAgICAgICBpZiggcHJvak1hdHJzW2ldLT5jb2xzICE9IDQgfHwgcHJvak1hdHJzW2ldLT5yb3dzICE9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHByb2plY3Rpb24gbWF0cmljZXMgbXVzdCBiZSAzeDQiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBwb2ludHNbaV0tPnJvd3MgIT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIG9mIHBvaW50cyBtdXN0IGJlIDIiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiB1c2UgUkFOU0FDIGFsZ29yaXRobSB0byBjb21wdXRlIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKworICAgIENWX0NBTEwoIHJlY1BvaW50czREID0gY3ZDcmVhdGVNYXQoNCxudW1Qb2ludHMsQ1ZfNjRGKSApOworICAgIENWX0NBTEwoIHRtcFByb2pQb2ludHNbMF0gPSBjdkNyZWF0ZU1hdCgyLG51bVBvaW50cyxDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggdG1wUHJvalBvaW50c1sxXSA9IGN2Q3JlYXRlTWF0KDIsbnVtUG9pbnRzLENWXzY0RikgKTsKKyAgICBDVl9DQUxMKCB0bXBQcm9qUG9pbnRzWzJdID0gY3ZDcmVhdGVNYXQoMixudW1Qb2ludHMsQ1ZfNjRGKSApOworCisgICAgQ1ZfQ0FMTCggZmxhZ3MgPSAoY2hhciopY3ZBbGxvYyhzaXplb2YoY2hhcikqbnVtUG9pbnRzKSApOworICAgIENWX0NBTEwoIGJlc3RGbGFncyA9IChjaGFyKiljdkFsbG9jKHNpemVvZihjaGFyKSpudW1Qb2ludHMpICk7CisKKyAgICB7CisgICAgICAgIGludCBOdW1TYW1wbGVzID0gNTAwOy8qIGp1c3QgaW5pdCBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgICAgICBpbnQgd2FzQ291bnQgPSAwOyAgLyogY291bnQgb2YgY2hvb3Npbmcgc2FtcGxlcyAqLworICAgICAgICBpbnQgbWF4R29vZFBvaW50cyA9IDA7CisgICAgICAgIGludCBudW1Hb29kUG9pbnRzID0gMDsKKworICAgICAgICBkb3VibGUgYmVzdFByb2pNYXRyc19kYXRbMzZdOworICAgICAgICBDdk1hdCAgYmVzdFByb2pNYXRyc1szXTsKKyAgICAgICAgYmVzdFByb2pNYXRyc1swXSA9IGN2TWF0KDMsNCxDVl82NEYsYmVzdFByb2pNYXRyc19kYXQpOworICAgICAgICBiZXN0UHJvak1hdHJzWzFdID0gY3ZNYXQoMyw0LENWXzY0RixiZXN0UHJvak1hdHJzX2RhdCsxMik7CisgICAgICAgIGJlc3RQcm9qTWF0cnNbMl0gPSBjdk1hdCgzLDQsQ1ZfNjRGLGJlc3RQcm9qTWF0cnNfZGF0KzI0KTsKKworICAgICAgICBkb3VibGUgdG1wUHJvak1hdHJfZGF0WzM2KjNdOworICAgICAgICBDdk1hdCAgdG1wUHJvak1hdHJbM107CisgICAgICAgIHRtcFByb2pNYXRyWzBdID0gY3ZNYXQoOSw0LENWXzY0Rix0bXBQcm9qTWF0cl9kYXQpOworICAgICAgICB0bXBQcm9qTWF0clsxXSA9IGN2TWF0KDksNCxDVl82NEYsdG1wUHJvak1hdHJfZGF0KzM2KTsKKyAgICAgICAgdG1wUHJvak1hdHJbMl0gPSBjdk1hdCg5LDQsQ1ZfNjRGLHRtcFByb2pNYXRyX2RhdCs3Mik7CisKKyAgICAgICAgLyogY2hvb3NlbiBwb2ludHMgKi8gICAgICAgIAorCisgICAgICAgIHdoaWxlKCB3YXNDb3VudCA8IE51bVNhbXBsZXMgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBzZWxlY3Qgc2FtcGxlcyAqLworICAgICAgICAgICAgaW50IHJhbmROdW1ic1s2XTsKKyAgICAgICAgICAgIGljdkdldFJhbmROdW1iZXJzKG51bVBvaW50cyw2LHJhbmROdW1icyk7CisKKyAgICAgICAgICAgIC8qIHJhbmRvbSBudW1iZXJzIG9mIHBvaW50cyB3YXMgZ2VuZXJhdGVkICovCisgICAgICAgICAgICAvKiBzZWxlY3QgcG9pbnRzICovCisKKyAgICAgICAgICAgIGRvdWJsZSBzZWxQb2ludHNfZGF0WzIqNiozXTsKKyAgICAgICAgICAgIEN2TWF0IHNlbFBvaW50c1szXTsKKyAgICAgICAgICAgIHNlbFBvaW50c1swXSA9IGN2TWF0KDIsNixDVl82NEYsc2VsUG9pbnRzX2RhdCk7CisgICAgICAgICAgICBzZWxQb2ludHNbMV0gPSBjdk1hdCgyLDYsQ1ZfNjRGLHNlbFBvaW50c19kYXQrMTIpOworICAgICAgICAgICAgc2VsUG9pbnRzWzJdID0gY3ZNYXQoMiw2LENWXzY0RixzZWxQb2ludHNfZGF0KzI0KTsKKworICAgICAgICAgICAgLyogQ29weSA2IHBvaW50IGZvciByYW5kb20gaW5kZXhlcyAqLworICAgICAgICAgICAgaWN2U2VsZWN0Q29sc0J5TnVtYmVycyggcG9pbnRzWzBdLCAmc2VsUG9pbnRzWzBdLCByYW5kTnVtYnMsNik7CisgICAgICAgICAgICBpY3ZTZWxlY3RDb2xzQnlOdW1iZXJzKCBwb2ludHNbMV0sICZzZWxQb2ludHNbMV0sIHJhbmROdW1icyw2KTsKKyAgICAgICAgICAgIGljdlNlbGVjdENvbHNCeU51bWJlcnMoIHBvaW50c1syXSwgJnNlbFBvaW50c1syXSwgcmFuZE51bWJzLDYpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvKiBDb21wdXRlIHByb2plY3Rpb24gbWF0cmljZXMgZm9yIHRoaXMgcG9pbnRzICovCisgICAgICAgICAgICBpbnQgbnVtUHJvaiA9IGljdkNvbXB1dGVQcm9qZWN0TWF0cmljZXM2UG9pbnRzKCAmc2VsUG9pbnRzWzBdLCZzZWxQb2ludHNbMV0sJnNlbFBvaW50c1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBQcm9qTWF0clswXSwmdG1wUHJvak1hdHJbMV0sJnRtcFByb2pNYXRyWzJdKTsKKworICAgICAgICAgICAgLyogQ29tcHV0ZSBudW1iZXIgb2YgZ29vZCBwb2ludHMgZm9yIGVhY2ggbWF0cml4ICovCisgICAgICAgICAgICBDdk1hdCBwcm9qNlszXTsKKyAgICAgICAgICAgIGZvciggaW50IGN1cnJQcm9qID0gMDsgY3VyclByb2ogPCBudW1Qcm9qOyBjdXJyUHJvaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkdldFN1YkFycigmdG1wUHJvak1hdHJbMF0sJnByb2o2WzBdLGN2UmVjdCgwLGN1cnJQcm9qKjMsNCwzKSk7CisgICAgICAgICAgICAgICAgY3ZHZXRTdWJBcnIoJnRtcFByb2pNYXRyWzFdLCZwcm9qNlsxXSxjdlJlY3QoMCxjdXJyUHJvaiozLDQsMykpOworICAgICAgICAgICAgICAgIGN2R2V0U3ViQXJyKCZ0bXBQcm9qTWF0clsyXSwmcHJvajZbMl0sY3ZSZWN0KDAsY3VyclByb2oqMyw0LDMpKTsKKworICAgICAgICAgICAgICAgIC8qIFJlY29uc3RydWN0IHBvaW50cyBmb3IgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgICAgICAgICAgICAgIGljdlJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXcoICZwcm9qNlswXSwmcHJvajZbMV0sJnByb2o2WzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjUG9pbnRzNEQpOworCisgICAgICAgICAgICAgICAgLyogUHJvamVjdCBwb2ludHMgdG8gaW1hZ2VzIHVzaW5nIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgICAgICAgICBpY3ZQcm9qZWN0NERQb2ludHMocmVjUG9pbnRzNEQsJnByb2o2WzBdLHRtcFByb2pQb2ludHNbMF0pOworICAgICAgICAgICAgICAgIGljdlByb2plY3Q0RFBvaW50cyhyZWNQb2ludHM0RCwmcHJvajZbMV0sdG1wUHJvalBvaW50c1sxXSk7CisgICAgICAgICAgICAgICAgaWN2UHJvamVjdDREUG9pbnRzKHJlY1BvaW50czRELCZwcm9qNlsyXSx0bXBQcm9qUG9pbnRzWzJdKTsKKworICAgICAgICAgICAgICAgIC8qIENvbXB1dGUgZGlzdGFuY2VzIGFuZCBudW1iZXIgb2YgZ29vZCBwb2ludHMgKGlubGllcnMpICovCisgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgaW50IGN1cnJJbWFnZTsKKyAgICAgICAgICAgICAgICBudW1Hb29kUG9pbnRzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3Q9LTE7CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAvKiBDaG9vc2UgbWF4IGRpc3RhbmNlIGZvciBlYWNoIG9mIHRocmVlIHBvaW50cyAqLworICAgICAgICAgICAgICAgICAgICBmb3IoIGN1cnJJbWFnZSA9IDA7IGN1cnJJbWFnZSA8IDM7IGN1cnJJbWFnZSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgxLHkxLHgyLHkyOworICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSBjdm1HZXQodG1wUHJvalBvaW50c1tjdXJySW1hZ2VdLDAsaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IGN2bUdldCh0bXBQcm9qUG9pbnRzW2N1cnJJbWFnZV0sMSxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gY3ZtR2V0KHBvaW50c1tjdXJySW1hZ2VdLDAsaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB5MiA9IGN2bUdldChwb2ludHNbY3VyckltYWdlXSwxLGkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHgsZHk7CisgICAgICAgICAgICAgICAgICAgICAgICBkeCA9IHgxLXgyOworICAgICAgICAgICAgICAgICAgICAgICAgZHkgPSB5MS15MjsKKyNpZiAxCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbmV3RGlzdCA9IGR4KmR4K2R5KmR5OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5ld0Rpc3QgPiBkaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gbmV3RGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHNxcnQoZHgqZHgrZHkqZHkpLzMuMDsKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBzcXJ0KGRpc3QpOworICAgICAgICAgICAgICAgICAgICBmbGFnc1tpXSA9IChjaGFyKShkaXN0ID4gdGhyZXNob2xkID8gMCA6IDEpOworICAgICAgICAgICAgICAgICAgICBudW1Hb29kUG9pbnRzICs9IGZsYWdzW2ldOworCisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBpZiggbnVtR29vZFBvaW50cyA+IG1heEdvb2RQb2ludHMgKQorICAgICAgICAgICAgICAgIHsvKiBDb3B5IGN1cnJlbnQgcHJvamVjdGlvbiBtYXRyaWNlcyBhcyBiZXN0ICovCisKKyAgICAgICAgICAgICAgICAgICAgY3ZDb3B5KCZwcm9qNlswXSwmYmVzdFByb2pNYXRyc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGN2Q29weSgmcHJvajZbMV0sJmJlc3RQcm9qTWF0cnNbMV0pOworICAgICAgICAgICAgICAgICAgICBjdkNvcHkoJnByb2o2WzJdLCZiZXN0UHJvak1hdHJzWzJdKTsKKworICAgICAgICAgICAgICAgICAgICBtYXhHb29kUG9pbnRzID0gbnVtR29vZFBvaW50czsKKyAgICAgICAgICAgICAgICAgICAgLyogY29weSBiZXN0IGZsYWdzICovCisgICAgICAgICAgICAgICAgICAgIG1lbWNweShiZXN0RmxhZ3MsZmxhZ3Msc2l6ZW9mKGZsYWdzWzBdKSpudW1Qb2ludHMpOworCisgICAgICAgICAgICAgICAgICAgIC8qIEFkYXB0aXZlIG51bWJlciBvZiBzYW1wbGVzIHRvIGNvdW50Ki8KKwkJCSAgICAgICAgZG91YmxlIGVwID0gMSAtIChkb3VibGUpbnVtR29vZFBvaW50cyAvIChkb3VibGUpbnVtUG9pbnRzOworICAgICAgICAgICAgICAgICAgICBpZiggZXAgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVwID0gMC41Oy8qIGlmIHRoZXJlIGlzIG5vdCBnb29kIHBvaW50cyBzZXQgcmF0aW9uIG9mIG91dGxpZXJzIHRvIDUwJSAqLworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKwkJCSAgICAgICAgZG91YmxlIG5ld051bVNhbXBsZXMgPSAobG9nKDEtcCkgLyBsb2coMS1wb3coMS1lcCw2KSkpOworICAgICAgICAgICAgICAgICAgICBpZiggIG5ld051bVNhbXBsZXMgPCBkb3VibGUoTnVtU2FtcGxlcykgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzID0gY3ZSb3VuZChuZXdOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2FzQ291bnQrKzsKKyAgICAgICAgfQorI2lmIDAKKyAgICAgICAgY2hhciBzdHJbMzAwXTsKKyAgICAgICAgc3ByaW50ZihzdHIsIkluaXRpYWwgbnVtUG9pbnRzID0gJWRcbm1heEdvb2RQb2ludHM9JWRcblJBTlNBQyBtYWRlICVkIHN0ZXBzIiwKKyAgICAgICAgICAgICAgICAgICAgbnVtUG9pbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgbWF4R29vZFBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCh3YXNDb3VudCkpOworICAgICAgICBNZXNzYWdlQm94KDAsc3RyLCJJbmZvIixNQl9PS3xNQl9UQVNLTU9EQUwpOworI2VuZGlmCisKKyAgICAgICAgLyogd2UgbWF5IGhhdmUgYmVzdCA2LXBvaW50IHByb2plY3Rpb24gbWF0cmljZXMuICovCisgICAgICAgIC8qIGFuZCBiZXN0IHBvaW50cyAqLworICAgICAgICAvKiB1c2UgdGhlc2UgcG9pbnRzIHRvIGltcHJvdmUgbWF0cmljZXMgKi8KKworICAgICAgICBpZiggbWF4R29vZFBvaW50cyA8IDYgKQorICAgICAgICB7CisgICAgICAgICAgICAvKiAgbWF0cml4IG5vdCBmb3VuZCAqLworICAgICAgICAgICAgbnVtUHJvak1hdHJzID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFdlIG1heSBJbXByb292ZSBtYXRyaWNlcyB1c2luZyAtLS0tIG1ldGhvZCAqLworICAgICAgICAgICAgLyogV2UgbWF5IHRyeSB0byB1c2UgTGV2ZW5iZXJnLU1hcnF1YXJkdCBvcHRpbWl6YXRpb24gKi8KKyAgICAgICAgICAgIC8vaW50IGN1cnJJdGVyID0gMDsKKyAgICAgICAgICAgIGludCBmaW5hbEdvb2RQb2ludHMgPSAwOworICAgICAgICAgICAgY2hhciAqZ29vZEZsYWdzID0gMDsKKyAgICAgICAgICAgIGdvb2RGbGFncyA9IChjaGFyKiljdkFsbG9jKG51bVBvaW50cypzaXplb2YoY2hhcikpOworCisgICAgICAgICAgICBpbnQgbmVlZFJlcGVhdDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisjaWYgMAorLyogVmVyc2lvbiB3aXRob3V0IHVzaW5nIHN0YXR1cyBmb3IgTGV2ZW5iZXJnLU1hcnF1YXJkdCBtaW5pbWl6YXRpb24gKi8KKworICAgICAgICAgICAgICAgIEN2TWF0ICpvcHRTdGF0dXM7CisgICAgICAgICAgICAgICAgb3B0U3RhdHVzID0gY3ZDcmVhdGVNYXQoMSxudW1Qb2ludHMsQ1ZfNjRGKTsKKyAgICAgICAgICAgICAgICBpbnQgdGVzdE51bWJlciA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpPTA7aTxudW1Qb2ludHM7aSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldChvcHRTdGF0dXMsMCxpLChkb3VibGUpYmVzdEZsYWdzW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgdGVzdE51bWJlciArPSBiZXN0RmxhZ3NbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hhciBzdHIyWzIwMF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIyLCJ0ZXN0IGdvb2QgbnVtPSVkXG5tYXhHb29kUG9pbnRzPSVkIix0ZXN0TnVtYmVyLG1heEdvb2RQb2ludHMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3goMCxzdHIyLCJJbmZvIixNQl9PS3xNQl9UQVNLTU9EQUwpOworCisgICAgICAgICAgICAgICAgQ3ZNYXQgKmdQcmVzUG9pbnRzOworICAgICAgICAgICAgICAgIGdQcmVzUG9pbnRzID0gY3ZDcmVhdGVNYXQoMSxtYXhHb29kUG9pbnRzLENWXzY0Rik7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1heEdvb2RQb2ludHM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldChnUHJlc1BvaW50cywwLGksMS4wKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgYXJyYXkgb2YgcG9pbnRzIHByZXMgKi8KKyAgICAgICAgICAgICAgICBDdk1hdCAqcG9pbnRzUHJlc1szXTsKKyAgICAgICAgICAgICAgICBwb2ludHNQcmVzWzBdID0gZ1ByZXNQb2ludHM7CisgICAgICAgICAgICAgICAgcG9pbnRzUHJlc1sxXSA9IGdQcmVzUG9pbnRzOworICAgICAgICAgICAgICAgIHBvaW50c1ByZXNbMl0gPSBnUHJlc1BvaW50czsKKworICAgICAgICAgICAgICAgIC8qIENyZWF0ZSBqdXN0IGdvb2QgcG9pbnRzIDJEICovCisgICAgICAgICAgICAgICAgQ3ZNYXQgKmdQb2ludHNbM107CisgICAgICAgICAgICAgICAgaWN2Q3JlYXRlR29vZFBvaW50cyhwb2ludHNbMF0sJmdQb2ludHNbMF0sb3B0U3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpY3ZDcmVhdGVHb29kUG9pbnRzKHBvaW50c1sxXSwmZ1BvaW50c1sxXSxvcHRTdGF0dXMpOworICAgICAgICAgICAgICAgIGljdkNyZWF0ZUdvb2RQb2ludHMocG9pbnRzWzJdLCZnUG9pbnRzWzJdLG9wdFN0YXR1cyk7CisKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgNEQgcG9pbnRzIGFycmF5IGZvciBnb29kIHBvaW50cyAqLworICAgICAgICAgICAgICAgIEN2TWF0ICpyZXNQb2ludHM0RDsKKyAgICAgICAgICAgICAgICByZXNQb2ludHM0RCA9IGN2Q3JlYXRlTWF0KDQsbWF4R29vZFBvaW50cyxDVl82NEYpOworCisgICAgICAgICAgICAgICAgQ3ZNYXQqIHByb2pNc1szXTsKKworICAgICAgICAgICAgICAgIHByb2pNc1swXSA9ICZiZXN0UHJvak1hdHJzWzBdOworICAgICAgICAgICAgICAgIHByb2pNc1sxXSA9ICZiZXN0UHJvak1hdHJzWzFdOworICAgICAgICAgICAgICAgIHByb2pNc1syXSA9ICZiZXN0UHJvak1hdHJzWzJdOworCisKKyAgICAgICAgICAgICAgICBDdk1hdCByZXNQcm9qTWF0cnNbM107CisgICAgICAgICAgICAgICAgZG91YmxlIHJlc1Byb2pNYXRyc19kYXRbMzZdOworICAgICAgICAgICAgICAgIHJlc1Byb2pNYXRyc1swXSA9IGN2TWF0KDMsNCxDVl82NEYscmVzUHJvak1hdHJzX2RhdCk7CisgICAgICAgICAgICAgICAgcmVzUHJvak1hdHJzWzFdID0gY3ZNYXQoMyw0LENWXzY0RixyZXNQcm9qTWF0cnNfZGF0KzEyKTsKKyAgICAgICAgICAgICAgICByZXNQcm9qTWF0cnNbMl0gPSBjdk1hdCgzLDQsQ1ZfNjRGLHJlc1Byb2pNYXRyc19kYXQrMjQpOworCisgICAgICAgICAgICAgICAgQ3ZNYXQqIHJlc01hdHJzWzNdOworICAgICAgICAgICAgICAgIHJlc01hdHJzWzBdID0gJnJlc1Byb2pNYXRyc1swXTsKKyAgICAgICAgICAgICAgICByZXNNYXRyc1sxXSA9ICZyZXNQcm9qTWF0cnNbMV07CisgICAgICAgICAgICAgICAgcmVzTWF0cnNbMl0gPSAmcmVzUHJvak1hdHJzWzJdOworCisgICAgICAgICAgICAgICAgY3ZPcHRpbWl6ZUxldmVuYmVyZ01hcnF1YXJkdEJ1bmRsZSggcHJvak1zLC8vcHJvak1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnUG9pbnRzLC8vcG9pbnRzLC8vcG9pbnRzMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzUHJlcywvL3BvaW50c1ByZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNNYXRycywvL3Jlc1Byb2pNYXRycywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUG9pbnRzNEQsLy9yZXNQb2ludHM0RCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwLCAxZS05ICk7CisKKyAgICAgICAgICAgICAgICAvKiBXZSBmb3VuZCBvcHRpbWl6ZWQgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworCisgICAgICAgICAgICAgICAgQ3ZNYXQgKnJlY29uUG9pbnRzNEQ7CisgICAgICAgICAgICAgICAgcmVjb25Qb2ludHM0RCA9IGN2Q3JlYXRlTWF0KDQsbnVtUG9pbnRzLENWXzY0Rik7CisKKyAgICAgICAgICAgICAgICAvKiBSZWNvbnN0cnVjdCBhbGwgcG9pbnRzIHVzaW5nIGZvdW5kIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgICAgICAgICBpY3ZSZWNvbnN0cnVjdFBvaW50c0ZvcjNWaWV3KCAmcmVzUHJvak1hdHJzWzBdLCZyZXNQcm9qTWF0cnNbMV0sJnJlc1Byb2pNYXRyc1syXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNbMF0sIHBvaW50c1sxXSwgcG9pbnRzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29uUG9pbnRzNEQpOworCisgICAgICAgICAgICAgICAgLyogUHJvamVjdCBwb2ludHMgdG8gaW1hZ2VzIHVzaW5nIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgICAgICAgICBpY3ZQcm9qZWN0NERQb2ludHMocmVjb25Qb2ludHM0RCwmcmVzUHJvak1hdHJzWzBdLHRtcFByb2pQb2ludHNbMF0pOworICAgICAgICAgICAgICAgIGljdlByb2plY3Q0RFBvaW50cyhyZWNvblBvaW50czRELCZyZXNQcm9qTWF0cnNbMV0sdG1wUHJvalBvaW50c1sxXSk7CisgICAgICAgICAgICAgICAgaWN2UHJvamVjdDREUG9pbnRzKHJlY29uUG9pbnRzNEQsJnJlc1Byb2pNYXRyc1syXSx0bXBQcm9qUG9pbnRzWzJdKTsKKworCisgICAgICAgICAgICAgICAgLyogQ29tcHV0ZSBlcnJvciBmb3IgZWFjaCBwb2ludCBhbmQgc2VsZWN0IGdvb2QgKi8KKworICAgICAgICAgICAgICAgIGludCBjdXJySW1hZ2U7CisgICAgICAgICAgICAgICAgZmluYWxHb29kUG9pbnRzID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3Q9LTE7CisgICAgICAgICAgICAgICAgICAgIC8qIENob29zZSBtYXggZGlzdGFuY2UgZm9yIGVhY2ggb2YgdGhyZWUgcG9pbnRzICovCisgICAgICAgICAgICAgICAgICAgIGZvciggY3VyckltYWdlID0gMDsgY3VyckltYWdlIDwgMzsgY3VyckltYWdlKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeDEseTEseDIseTI7CisgICAgICAgICAgICAgICAgICAgICAgICB4MSA9IGN2bUdldCh0bXBQcm9qUG9pbnRzW2N1cnJJbWFnZV0sMCxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gY3ZtR2V0KHRtcFByb2pQb2ludHNbY3VyckltYWdlXSwxLGkpOworICAgICAgICAgICAgICAgICAgICAgICAgeDIgPSBjdm1HZXQocG9pbnRzW2N1cnJJbWFnZV0sMCxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gY3ZtR2V0KHBvaW50c1tjdXJySW1hZ2VdLDEsaSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkeCxkeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR4ID0geDEteDI7CisgICAgICAgICAgICAgICAgICAgICAgICBkeSA9IHkxLXkyOworCisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbmV3RGlzdCA9IGR4KmR4K2R5KmR5OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG5ld0Rpc3QgPiBkaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ID0gbmV3RGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkaXN0ID0gc3FydChkaXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZ29vZEZsYWdzW2ldID0gKGNoYXIpKGRpc3QgPiB0aHJlc2hvbGQgPyAwIDogMSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsR29vZFBvaW50cyArPSBnb29kRmxhZ3NbaV07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2hhciBzdHJbMjAwXTsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKHN0ciwiV2FzIG51bSA9ICVkXG5OZXcgbnVtPSVkIixtYXhHb29kUG9pbnRzLGZpbmFsR29vZFBvaW50cyk7CisgICAgICAgICAgICAgICAgTWVzc2FnZUJveCgwLHN0ciwiSW5mbyIsTUJfT0t8TUJfVEFTS01PREFMKTsKKyAgICAgICAgICAgICAgICBpZiggZmluYWxHb29kUG9pbnRzID4gbWF4R29vZFBvaW50cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKiBDb3B5IG5ldyB2ZXJzaW9uIG9mIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgY3ZDb3B5KCZyZXNQcm9qTWF0cnNbMF0sJmJlc3RQcm9qTWF0cnNbMF0pOworICAgICAgICAgICAgICAgICAgICBjdkNvcHkoJnJlc1Byb2pNYXRyc1sxXSwmYmVzdFByb2pNYXRyc1sxXSk7CisgICAgICAgICAgICAgICAgICAgIGN2Q29weSgmcmVzUHJvak1hdHJzWzJdLCZiZXN0UHJvak1hdHJzWzJdKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJlc3RGbGFncyxnb29kRmxhZ3MsbnVtUG9pbnRzKnNpemVvZihjaGFyKSk7CisgICAgICAgICAgICAgICAgICAgIG1heEdvb2RQb2ludHMgPSBmaW5hbEdvb2RQb2ludHM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCZvcHRTdGF0dXMpOworICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCgmcmVzUG9pbnRzNEQpOworI2Vsc2UKKy8qIFZlcnNpb24gd2l0aCB1c2luZyBzdGF0dXMgZm9yIExldmVuYmVyZC1NYXJxdWFyZHQgbWluaW1pemF0aW9uICovCisKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgc3RhdHVzICovCisgICAgICAgICAgICAgICAgQ3ZNYXQgKm9wdFN0YXR1czsKKyAgICAgICAgICAgICAgICBvcHRTdGF0dXMgPSBjdkNyZWF0ZU1hdCgxLG51bVBvaW50cyxDVl82NEYpOworICAgICAgICAgICAgICAgIGZvciggaT0wO2k8bnVtUG9pbnRzO2krKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdm1TZXQob3B0U3RhdHVzLDAsaSwoZG91YmxlKWJlc3RGbGFnc1tpXSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ3ZNYXQgKnBvaW50c1ByZXNbM107CisgICAgICAgICAgICAgICAgcG9pbnRzUHJlc1swXSA9IG9wdFN0YXR1czsKKyAgICAgICAgICAgICAgICBwb2ludHNQcmVzWzFdID0gb3B0U3RhdHVzOworICAgICAgICAgICAgICAgIHBvaW50c1ByZXNbMl0gPSBvcHRTdGF0dXM7CisKKyAgICAgICAgICAgICAgICAvKiBDcmVhdGUgNEQgcG9pbnRzIGFycmF5IGZvciBnb29kIHBvaW50cyAqLworICAgICAgICAgICAgICAgIEN2TWF0ICpyZXNQb2ludHM0RDsKKyAgICAgICAgICAgICAgICByZXNQb2ludHM0RCA9IGN2Q3JlYXRlTWF0KDQsbnVtUG9pbnRzLENWXzY0Rik7CisKKyAgICAgICAgICAgICAgICBDdk1hdCogcHJvak1zWzNdOworCisgICAgICAgICAgICAgICAgcHJvak1zWzBdID0gJmJlc3RQcm9qTWF0cnNbMF07CisgICAgICAgICAgICAgICAgcHJvak1zWzFdID0gJmJlc3RQcm9qTWF0cnNbMV07CisgICAgICAgICAgICAgICAgcHJvak1zWzJdID0gJmJlc3RQcm9qTWF0cnNbMl07CisKKyAgICAgICAgICAgICAgICBDdk1hdCByZXNQcm9qTWF0cnNbM107CisgICAgICAgICAgICAgICAgZG91YmxlIHJlc1Byb2pNYXRyc19kYXRbMzZdOworICAgICAgICAgICAgICAgIHJlc1Byb2pNYXRyc1swXSA9IGN2TWF0KDMsNCxDVl82NEYscmVzUHJvak1hdHJzX2RhdCk7CisgICAgICAgICAgICAgICAgcmVzUHJvak1hdHJzWzFdID0gY3ZNYXQoMyw0LENWXzY0RixyZXNQcm9qTWF0cnNfZGF0KzEyKTsKKyAgICAgICAgICAgICAgICByZXNQcm9qTWF0cnNbMl0gPSBjdk1hdCgzLDQsQ1ZfNjRGLHJlc1Byb2pNYXRyc19kYXQrMjQpOworCisgICAgICAgICAgICAgICAgQ3ZNYXQqIHJlc01hdHJzWzNdOworICAgICAgICAgICAgICAgIHJlc01hdHJzWzBdID0gJnJlc1Byb2pNYXRyc1swXTsKKyAgICAgICAgICAgICAgICByZXNNYXRyc1sxXSA9ICZyZXNQcm9qTWF0cnNbMV07CisgICAgICAgICAgICAgICAgcmVzTWF0cnNbMl0gPSAmcmVzUHJvak1hdHJzWzJdOworCisgICAgICAgICAgICAgICAgY3ZPcHRpbWl6ZUxldmVuYmVyZ01hcnF1YXJkdEJ1bmRsZSggcHJvak1zLC8vcHJvak1zLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHMsLy9wb2ludHMyRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludHNQcmVzLC8vcG9pbnRzUHJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc01hdHJzLC8vcmVzUHJvak1hdHJzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNQb2ludHM0RCwvL3Jlc1BvaW50czRELCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAsIDFlLTkgKTsKKworICAgICAgICAgICAgICAgIC8qIFdlIGZvdW5kIG9wdGltaXplZCBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisKKyAgICAgICAgICAgICAgICByZWNvblBvaW50czREID0gY3ZDcmVhdGVNYXQoNCxudW1Qb2ludHMsQ1ZfNjRGKTsKKworICAgICAgICAgICAgICAgIC8qIFJlY29uc3RydWN0IGFsbCBwb2ludHMgdXNpbmcgZm91bmQgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgICAgICAgICAgICAgIGljdlJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXcoICZyZXNQcm9qTWF0cnNbMF0sJnJlc1Byb2pNYXRyc1sxXSwmcmVzUHJvak1hdHJzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb25Qb2ludHM0RCk7CisKKyAgICAgICAgICAgICAgICAvKiBQcm9qZWN0IHBvaW50cyB0byBpbWFnZXMgdXNpbmcgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgICAgICAgICAgICAgIGljdlByb2plY3Q0RFBvaW50cyhyZWNvblBvaW50czRELCZyZXNQcm9qTWF0cnNbMF0sdG1wUHJvalBvaW50c1swXSk7CisgICAgICAgICAgICAgICAgaWN2UHJvamVjdDREUG9pbnRzKHJlY29uUG9pbnRzNEQsJnJlc1Byb2pNYXRyc1sxXSx0bXBQcm9qUG9pbnRzWzFdKTsKKyAgICAgICAgICAgICAgICBpY3ZQcm9qZWN0NERQb2ludHMocmVjb25Qb2ludHM0RCwmcmVzUHJvak1hdHJzWzJdLHRtcFByb2pQb2ludHNbMl0pOworCisKKyAgICAgICAgICAgICAgICAvKiBDb21wdXRlIGVycm9yIGZvciBlYWNoIHBvaW50IGFuZCBzZWxlY3QgZ29vZCAqLworCisgICAgICAgICAgICAgICAgaW50IGN1cnJJbWFnZTsKKyAgICAgICAgICAgICAgICBmaW5hbEdvb2RQb2ludHMgPSAwOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGlzdD0tMTsKKyAgICAgICAgICAgICAgICAgICAgLyogQ2hvb3NlIG1heCBkaXN0YW5jZSBmb3IgZWFjaCBvZiB0aHJlZSBwb2ludHMgKi8KKyAgICAgICAgICAgICAgICAgICAgZm9yKCBjdXJySW1hZ2UgPSAwOyBjdXJySW1hZ2UgPCAzOyBjdXJySW1hZ2UrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB4MSx5MSx4Mix5MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHgxID0gY3ZtR2V0KHRtcFByb2pQb2ludHNbY3VyckltYWdlXSwwLGkpOworICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSBjdm1HZXQodG1wUHJvalBvaW50c1tjdXJySW1hZ2VdLDEsaSk7CisgICAgICAgICAgICAgICAgICAgICAgICB4MiA9IGN2bUdldChwb2ludHNbY3VyckltYWdlXSwwLGkpOworICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBjdm1HZXQocG9pbnRzW2N1cnJJbWFnZV0sMSxpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGR4LGR5OworICAgICAgICAgICAgICAgICAgICAgICAgZHggPSB4MS14MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR5ID0geTEteTI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBuZXdEaXN0ID0gZHgqZHgrZHkqZHk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV3RGlzdCA+IGRpc3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBuZXdEaXN0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSBzcXJ0KGRpc3QpOworICAgICAgICAgICAgICAgICAgICBnb29kRmxhZ3NbaV0gPSAoY2hhcikoZGlzdCA+IHRocmVzaG9sZCA/IDAgOiAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxHb29kUG9pbnRzICs9IGdvb2RGbGFnc1tpXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKmNoYXIgc3RyWzIwMF07CisgICAgICAgICAgICAgICAgc3ByaW50ZihzdHIsIldhcyBudW0gPSAlZFxuTmV3IG51bT0lZCIsbWF4R29vZFBvaW50cyxmaW5hbEdvb2RQb2ludHMpOworICAgICAgICAgICAgICAgIE1lc3NhZ2VCb3goMCxzdHIsIkluZm8iLE1CX09LfE1CX1RBU0tNT0RBTCk7Ki8KKworICAgICAgICAgICAgICAgIG5lZWRSZXBlYXQgPSAwOworICAgICAgICAgICAgICAgIGlmKCBmaW5hbEdvb2RQb2ludHMgPiBtYXhHb29kUG9pbnRzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIENvcHkgbmV3IHZlcnNpb24gb2YgcHJvamVjdGlvbiBtYXRyaWNlcyAqLworICAgICAgICAgICAgICAgICAgICBjdkNvcHkoJnJlc1Byb2pNYXRyc1swXSwmYmVzdFByb2pNYXRyc1swXSk7CisgICAgICAgICAgICAgICAgICAgIGN2Q29weSgmcmVzUHJvak1hdHJzWzFdLCZiZXN0UHJvak1hdHJzWzFdKTsKKyAgICAgICAgICAgICAgICAgICAgY3ZDb3B5KCZyZXNQcm9qTWF0cnNbMl0sJmJlc3RQcm9qTWF0cnNbMl0pOworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYmVzdEZsYWdzLGdvb2RGbGFncyxudW1Qb2ludHMqc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgbWF4R29vZFBvaW50cyA9IGZpbmFsR29vZFBvaW50czsKKyAgICAgICAgICAgICAgICAgICAgbmVlZFJlcGVhdCA9IDE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCZvcHRTdGF0dXMpOworICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCgmcmVzUG9pbnRzNEQpOworCisgICAKKyNlbmRpZgorICAgICAgICAgICAgfSB3aGlsZSAoIG5lZWRSZXBlYXQgKTsKKworICAgICAgICAgICAgY3ZGcmVlKCAmZ29vZEZsYWdzKTsKKworCisKKworICAgICAgICAgICAgbnVtUHJvak1hdHJzID0gMTsKKworICAgICAgICAgICAgLyogQ29weSBwcm9qZWN0aW9uIG1hdHJpY2VzICovCisgICAgICAgICAgICBjdkNvbnZlcnQoJmJlc3RQcm9qTWF0cnNbMF0scHJvak1hdHIxKTsKKyAgICAgICAgICAgIGN2Q29udmVydCgmYmVzdFByb2pNYXRyc1sxXSxwcm9qTWF0cjIpOworICAgICAgICAgICAgY3ZDb252ZXJ0KCZiZXN0UHJvak1hdHJzWzJdLHByb2pNYXRyMyk7CisKKyAgICAgICAgICAgIGlmKCBzdGF0dXMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIGNvcHkgc3RhdHVzIGZvciBlYWNoIHBvaW50cyBpZiBuZWVkICovCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGN2bVNldChzdGF0dXMsMCxpLChkb3VibGUpYmVzdEZsYWdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggcG9pbnRzNEQgKQorICAgIHsvKiBGaWxsIHJlY29uc3RydWN0ZWQgcG9pbnRzICovCisKKyAgICAgICAgY3ZaZXJvKHBvaW50czREKTsKKyAgICAgICAgaWN2UmVjb25zdHJ1Y3RQb2ludHNGb3IzVmlldyggcHJvak1hdHIxLHByb2pNYXRyMixwcm9qTWF0cjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50c1swXSwgcG9pbnRzWzFdLCBwb2ludHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50czREKTsKKyAgICB9CisKKworCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJmZsYWdzKTsKKyAgICBjdkZyZWUoICZiZXN0RmxhZ3MpOworCisgICAgY3ZSZWxlYXNlTWF0KCZyZWNQb2ludHM0RCk7CisgICAgY3ZSZWxlYXNlTWF0KCZ0bXBQcm9qUG9pbnRzWzBdKTsKKyAgICBjdlJlbGVhc2VNYXQoJnRtcFByb2pQb2ludHNbMV0pOworICAgIGN2UmVsZWFzZU1hdCgmdG1wUHJvalBvaW50c1syXSk7CisKKyAgICByZXR1cm4gbnVtUHJvak1hdHJzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgaWN2RmluZEJhc2VUcmFuc2Zvcm0oQ3ZNYXQqIHBvaW50cyxDdk1hdCogcmVzdWx0VCkKK3sKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2RmluZEJhc2VUcmFuc2Zvcm0iICk7CisgICAgX19CRUdJTl9fOworCisgICAgaWYoIHBvaW50cyA9PSAwIHx8IHJlc3VsdFQgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMpIHx8ICFDVl9JU19NQVQocmVzdWx0VCkgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAicG9pbnRzIGFuZCByZXN1bHRUIG11c3QgYmUgYSBtYXRyaWNlcyIgKTsKKyAgICB9CisKKyAgICBpZiggcG9pbnRzLT5yb3dzICE9IDIgfHwgcG9pbnRzLT5jb2xzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlIDQuIEFuZCB0aGV5IG11c3QgaGF2ZSAyIGNvb3JkaW5hdGVzIiApOworICAgIH0KKworICAgIGlmKCByZXN1bHRULT5yb3dzICE9IDMgfHwgcmVzdWx0VC0+Y29scyAhPSAzICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgInNpemUgb2YgbWF0cml4IHJlc3VsdFQgbXVzdCBiZSAzeDMiICk7CisgICAgfQorICAgIAorICAgIC8qIEZ1bmN0aW9uIGdldHMgZm91ciBwb2ludHMgYW5kIGNvbXB1dGUgdHJhbnNmb3JtYXRpb24gdG8gZTE9KDEwMCkgZTI9KDAxMCkgZTM9KDAwMSkgZTQ9KDExMSkgKi8KKyAgICAKKyAgICAvKiAhISEgdGVzdCBlYWNoIHRocmVlIHBvaW50cyBub3QgY29sbGluZWFyLiBOZWVkIHRvIHRlc3QgKi8KKworICAgIC8qIENyZWF0ZSBtYXRyaWNlcyAqLworICAgIEN2TWF0IG1hdHJBOworICAgIEN2TWF0IHZlY3RCOworICAgIGRvdWJsZSBtYXRyQV9kYXRbMyozXTsKKyAgICBkb3VibGUgdmVjdEJfZGF0WzNdOworICAgIG1hdHJBID0gY3ZNYXQoMywzLENWXzY0RixtYXRyQV9kYXQpOworICAgIHZlY3RCID0gY3ZNYXQoMywxLENWXzY0Rix2ZWN0Ql9kYXQpOworCisgICAgLyogZmlsbCBtYXRyaWNlcyAqLworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgIHsKKyAgICAgICAgY3ZtU2V0KCZtYXRyQSwwLGksY3ZtR2V0KHBvaW50cywwLGkpKTsKKyAgICAgICAgY3ZtU2V0KCZtYXRyQSwxLGksY3ZtR2V0KHBvaW50cywxLGkpKTsKKyAgICAgICAgY3ZtU2V0KCZtYXRyQSwyLGksMSk7CisgICAgfQorCisgICAgLyogRmlsbCB2ZWN0b3IgQiAqLworICAgIGN2bVNldCgmdmVjdEIsMCwwLGN2bUdldChwb2ludHMsMCwzKSk7CisgICAgY3ZtU2V0KCZ2ZWN0QiwxLDAsY3ZtR2V0KHBvaW50cywxLDMpKTsKKyAgICBjdm1TZXQoJnZlY3RCLDIsMCwxKTsKKworICAgIC8qIHJlc3VsdCBzY2FsZSAqLworICAgIEN2TWF0IHNjYWxlOworICAgIGRvdWJsZSBzY2FsZV9kYXRbM107CisgICAgc2NhbGUgPSBjdk1hdCgzLDEsQ1ZfNjRGLHNjYWxlX2RhdCk7CisKKyAgICBjdlNvbHZlKCZtYXRyQSwmdmVjdEIsJnNjYWxlLENWX1NWRCk7CisKKyAgICAvKiBtdWx0aXBseSBieSBzY2FsZSAqLworICAgIGludCBqOworICAgIGZvciggaiA9IDA7IGogPCAzOyBqKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHNjID0gc2NhbGVfZGF0W2pdOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbWF0ckFfZGF0W2kqMytqXSAqPSBzYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIENvbnZlcnQgaW52ZXJzZSBtYXRyaXggKi8KKyAgICBDdk1hdCB0bXBSZXM7CisgICAgZG91YmxlIHRtcFJlc19kYXRbOV07CisgICAgdG1wUmVzID0gY3ZNYXQoMywzLENWXzY0Rix0bXBSZXNfZGF0KTsKKyAgICBjdkludmVydCgmbWF0ckEsJnRtcFJlcyk7CisKKyAgICBjdkNvbnZlcnQoJnRtcFJlcyxyZXN1bHRUKTsKKyAgICAKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuOworfQorCisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KK3ZvaWQgR2V0R2VuZXJhdG9yUmVkdWNlRnVuZFNvbHV0aW9uKEN2TWF0KiBwb2ludHMxLEN2TWF0KiBwb2ludHMyLEN2TWF0KiBmdW5kUmVkdWNlQ29lZjEsQ3ZNYXQqIGZ1bmRSZWR1Y2VDb2VmMikKK3sKKworICAgIENWX0ZVTkNOQU1FKCAiR2V0R2VuZXJhdG9yUmVkdWNlRnVuZFNvbHV0aW9uIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIFRlc3QgaW5wdXQgZGF0YSBmb3IgZXJyb3JzICovCisgICAgCisgICAgaWYoIHBvaW50czEgPT0gMCB8fCBwb2ludHMyID09IDAgfHwgZnVuZFJlZHVjZUNvZWYxID09IDAgfHwgZnVuZFJlZHVjZUNvZWYyID09IDApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwb2ludHMxKSB8fCAhQ1ZfSVNfTUFUKHBvaW50czIpIHx8ICFDVl9JU19NQVQoZnVuZFJlZHVjZUNvZWYxKSB8fCAhQ1ZfSVNfTUFUKGZ1bmRSZWR1Y2VDb2VmMikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyBtdXN0IGJlIGEgbWF0cmljZXMiICk7CisgICAgfQorICAgIAorICAgIAorICAgIAorICAgIGlmKCBwb2ludHMxLT5yb3dzICE9IDMgfHwgcG9pbnRzMS0+Y29scyAhPSAzICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBwb2ludHMxIG11c3QgYmUgMyBhbmQgYW5kIGhhdmUgMyBjb29yZGluYXRlcyIgKTsKKyAgICB9CisKKyAgICBpZiggcG9pbnRzMi0+cm93cyAhPSAzIHx8IHBvaW50czItPmNvbHMgIT0gMyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzMiBtdXN0IGJlIDMgYW5kIGFuZCBoYXZlIDMgY29vcmRpbmF0ZXMiICk7CisgICAgfQorCisgICAgaWYoIGZ1bmRSZWR1Y2VDb2VmMS0+cm93cyAhPSAxIHx8IGZ1bmRSZWR1Y2VDb2VmMS0+Y29scyAhPSA1ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgZnVuZFJlZHVjZUNvZWYxIG11c3QgYmUgMXg1IiApOworICAgIH0KKworICAgIGlmKCBmdW5kUmVkdWNlQ29lZjItPnJvd3MgIT0gMSB8fCBmdW5kUmVkdWNlQ29lZjItPmNvbHMgIT0gNSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIGZ1bmRSZWR1Y2VDb2VmMiBtdXN0IGJlIDF4NSIgKTsKKyAgICB9CisKKyAgICAvKiBVc2luZyAzIGNvcnIuIHBvaW50cyBjb21wdXRlIHJlZHVjZSAqLworCisgICAgLyogQ3JlYXRlIG1hdHJpeCAqLworICAgIEN2TWF0IG1hdHJBOworICAgIGRvdWJsZSBtYXRyQV9kYXRbMyo1XTsKKyAgICBtYXRyQSA9IGN2TWF0KDMsNSxDVl82NEYsbWF0ckFfZGF0KTsKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4MSx5MSx3MSx4Mix5Mix3MjsKKyAgICAgICAgeDEgPSBjdm1HZXQocG9pbnRzMSwwLGkpOworICAgICAgICB5MSA9IGN2bUdldChwb2ludHMxLDEsaSk7CisgICAgICAgIHcxID0gY3ZtR2V0KHBvaW50czEsMixpKTsKKworICAgICAgICB4MiA9IGN2bUdldChwb2ludHMyLDAsaSk7CisgICAgICAgIHkyID0gY3ZtR2V0KHBvaW50czIsMSxpKTsKKyAgICAgICAgdzIgPSBjdm1HZXQocG9pbnRzMiwyLGkpOworCisgICAgICAgIGN2bVNldCgmbWF0ckEsaSwwLHkxKngyLXkxKncyKTsKKyAgICAgICAgY3ZtU2V0KCZtYXRyQSxpLDEsdzEqeDIteTEqdzIpOworICAgICAgICBjdm1TZXQoJm1hdHJBLGksMix4MSp5Mi15MSp3Mik7CisgICAgICAgIGN2bVNldCgmbWF0ckEsaSwzLHcxKnkyLXkxKncyKTsKKyAgICAgICAgY3ZtU2V0KCZtYXRyQSxpLDQseDEqdzIteTEqdzIpOworICAgIH0KKworICAgIC8qIHNvbHZlIHN5c3RlbSB1c2luZyBzdmQgKi8KKyAgICBDdk1hdCBtYXRyVTsKKyAgICBDdk1hdCBtYXRyVzsKKyAgICBDdk1hdCBtYXRyVjsKKyAgICAKKyAgICBkb3VibGUgbWF0clVfZGF0WzMqM107CisgICAgZG91YmxlIG1hdHJXX2RhdFszKjVdOworICAgIGRvdWJsZSBtYXRyVl9kYXRbNSo1XTsKKworICAgIG1hdHJVID0gY3ZNYXQoMywzLENWXzY0RixtYXRyVV9kYXQpOworICAgIG1hdHJXID0gY3ZNYXQoMyw1LENWXzY0RixtYXRyV19kYXQpOworICAgIG1hdHJWID0gY3ZNYXQoNSw1LENWXzY0RixtYXRyVl9kYXQpOworCisgICAgLyogRnJvbSBzdmQgd2UgbmVlZCBqdXN0IHR3byBsYXN0IHZlY3RvcnMgb2YgViBvciB0d28gbGFzdCByb3cgVicgKi8KKyAgICAvKiBXZSBnZXQgdHJhbnNwb3NlZCBtYXRyaXhlcyBVIGFuZCBWICovCisKKyAgICBjdlNWRCgmbWF0ckEsJm1hdHJXLDAsJm1hdHJWLENWX1NWRF9WX1QpOworCisgICAgLyogY29weSByZXN1bHRzIHRvIGZ1bmRhbWVudGFsIG1hdHJpY2VzICovCisgICAgZm9yKGk9MDtpPDU7aSsrKQorICAgIHsKKyAgICAgICAgY3ZtU2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLGksY3ZtR2V0KCZtYXRyViwzLGkpKTsKKyAgICAgICAgY3ZtU2V0KGZ1bmRSZWR1Y2VDb2VmMiwwLGksY3ZtR2V0KCZtYXRyViw0LGkpKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKKworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK2ludCBHZXRHb29kUmVkdWNlRnVuZGFtTWF0ckZyb21Ud28oQ3ZNYXQqIGZ1bmRSZWR1Y2VDb2VmMSxDdk1hdCogZnVuZFJlZHVjZUNvZWYyLEN2TWF0KiByZXNGdW5kUmVkdWNlQ29lZikKK3sKKyAgICBpbnQgbnVtUm9vdHMgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiR2V0R29vZFJlZHVjZUZ1bmRhbU1hdHJGcm9tVHdvIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBmdW5kUmVkdWNlQ29lZjEgPT0gMCB8fCBmdW5kUmVkdWNlQ29lZjIgPT0gMCB8fCByZXNGdW5kUmVkdWNlQ29lZiA9PSAwICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiBwYXJhbWV0ZXJzIGlzIGEgTlVMTCBwb2ludGVyIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGZ1bmRSZWR1Y2VDb2VmMSkgfHwgIUNWX0lTX01BVChmdW5kUmVkdWNlQ29lZjIpIHx8ICFDVl9JU19NQVQocmVzRnVuZFJlZHVjZUNvZWYpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIC8qIHVzaW5nIHR3byBmdW5kYW1lbnRhbCBtYXRyaXggY29tdXRlIG1hdHJpeGVzIGZvciBkZXQoRik9MCAqLworICAgIC8qIE1heSBjb21wdXRlIDEgb3IgMyBtYXRyaWNlcy4gUmV0dXJucyBudW1iZXIgb2Ygc29sdXRpb25zICovCisgICAgLyogSGVyZSB3ZSB3aWxsIHVzZSBjYXNlIEY9YSpGMSsoMS1hKSpGMiAgaW5zdGVhZCBvZiBGPW0qRjErbCpGMiAqLworCisgICAgLyogVGVzdCBmb3IgZXJyb3JzICovCisgICAgaWYoIGZ1bmRSZWR1Y2VDb2VmMS0+cm93cyAhPSAxIHx8IGZ1bmRSZWR1Y2VDb2VmMS0+Y29scyAhPSA1ICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgZnVuZFJlZHVjZUNvZWYxIG11c3QgYmUgMXg1IiApOworICAgIH0KKworICAgIGlmKCBmdW5kUmVkdWNlQ29lZjItPnJvd3MgIT0gMSB8fCBmdW5kUmVkdWNlQ29lZjItPmNvbHMgIT0gNSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIGZ1bmRSZWR1Y2VDb2VmMiBtdXN0IGJlIDF4NSIgKTsKKyAgICB9CisKKyAgICBpZiggKHJlc0Z1bmRSZWR1Y2VDb2VmLT5yb3dzICE9IDEgJiYgcmVzRnVuZFJlZHVjZUNvZWYtPnJvd3MgIT0gMykgIHx8IHJlc0Z1bmRSZWR1Y2VDb2VmLT5jb2xzICE9IDUgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiByZXNGdW5kUmVkdWNlQ29lZiBtdXN0IGJlIDF4NSIgKTsKKyAgICB9CisKKyAgICBkb3VibGUgcDEscTEscjEsczEsdDE7CisgICAgZG91YmxlIHAyLHEyLHIyLHMyLHQyOworICAgIHAxID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLDApOworICAgIHExID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLDEpOworICAgIHIxID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLDIpOworICAgIHMxID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLDMpOworICAgIHQxID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmMSwwLDQpOworCisgICAgcDIgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWYyLDAsMCk7CisgICAgcTIgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWYyLDAsMSk7CisgICAgcjIgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWYyLDAsMik7CisgICAgczIgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWYyLDAsMyk7CisgICAgdDIgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWYyLDAsNCk7CisKKyAgICAvKiBzb2x2ZSBlcXVhdGlvbiAqLworICAgIEN2TWF0IHJlc3VsdDsKKyAgICBDdk1hdCBjb2VmZnM7CisgICAgZG91YmxlIHJlc3VsdF9kYXRbMiozXTsKKyAgICBkb3VibGUgY29lZmZzX2RhdFs0XTsKKyAgICByZXN1bHQgPSBjdk1hdCgyLDMsQ1ZfNjRGLHJlc3VsdF9kYXQpOworICAgIGNvZWZmcyA9IGN2TWF0KDEsNCxDVl82NEYsY29lZmZzX2RhdCk7CisKKyAgICBjb2VmZnNfZGF0WzBdID0gKChyMS1yMikqKC1wMS1xMS1yMS1zMS10MStwMitxMityMitzMit0MikqKHExLXEyKSsocDEtcDIpKihzMS1zMikqKHQxLXQyKSk7LyogKmFeMyAqLworICAgIGNvZWZmc19kYXRbMV0gPSAoKHIyKigtcDEtcTEtcjEtczEtdDErcDIrcTIrcjIrczIrdDIpKyhyMS1yMikqKC1wMi1xMi1yMi1zMi10MikpKihxMS1xMikrKHIxLXIyKSooLXAxLXExLXIxLXMxLXQxK3AyK3EyK3IyK3MyK3QyKSpxMisocDIqKHMxLXMyKSsocDEtcDIpKnMyKSoodDEtdDIpKyhwMS1wMikqKHMxLXMyKSp0Mik7LyogKmFeMiAqLworICAgIGNvZWZmc19kYXRbMl0gPSAocjIqKC1wMi1xMi1yMi1zMi10MikqKHExLXEyKSsocjIqKC1wMS1xMS1yMS1zMS10MStwMitxMityMitzMit0MikrKHIxLXIyKSooLXAyLXEyLXIyLXMyLXQyKSkqcTIrcDIqczIqKHQxLXQyKSsocDIqKHMxLXMyKSsocDEtcDIpKnMyKSp0Mik7LyogKmEgKi8KKyAgICBjb2VmZnNfZGF0WzNdID0gcjIqKC1wMi1xMi1yMi1zMi10MikqcTIrcDIqczIqdDI7LyogMSAqLworICAgIAorICAgIGludCBudW07CisgICAgbnVtID0gY3ZTb2x2ZUN1YmljKCZjb2VmZnMsJnJlc3VsdCk7CisKKyAgICAKKyAgICAvKiB0ZXN0IG51bWJlciBvZiBzb2x1dGlvbnMgYW5kIHRlc3QgZm9yIHJlYWwgc29sdXRpb25zICovCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bTsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBmYWJzKGN2bUdldCgmcmVzdWx0LDEsaSkpIDwgMWUtOCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IGN2bUdldCgmcmVzdWx0LDAsaSk7CisgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCA1OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2bVNldChyZXNGdW5kUmVkdWNlQ29lZixudW1Sb290cyxqLAorICAgICAgICAgICAgICAgICAgICBhbHBoYSAqIGN2bUdldChmdW5kUmVkdWNlQ29lZjEsMCxqKSArICgxLWFscGhhKSAqIGN2bUdldChmdW5kUmVkdWNlQ29lZjIsMCxqKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUm9vdHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisgICAgcmV0dXJuIG51bVJvb3RzOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgR2V0UHJvak1hdHJGcm9tUmVkdWNlZEZ1bmRhbWVudGFsKEN2TWF0KiBmdW5kUmVkdWNlQ29lZnMsQ3ZNYXQqIHByb2pNYXRyQ29lZnMpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJHZXRQcm9qTWF0ckZyb21SZWR1Y2VkRnVuZGFtZW50YWwiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBmb3IgZXJyb3JzICovCisgICAgaWYoIGZ1bmRSZWR1Y2VDb2VmcyA9PSAwIHx8IHByb2pNYXRyQ29lZnMgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChmdW5kUmVkdWNlQ29lZnMpIHx8ICFDVl9JU19NQVQocHJvak1hdHJDb2VmcykgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyBtdXN0IGJlIGEgbWF0cmljZXMiICk7CisgICAgfQorCisKKyAgICBpZiggZnVuZFJlZHVjZUNvZWZzLT5yb3dzICE9IDEgfHwgZnVuZFJlZHVjZUNvZWZzLT5jb2xzICE9IDUgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBmdW5kUmVkdWNlQ29lZnMgbXVzdCBiZSAxeDUiICk7CisgICAgfQorCisgICAgaWYoIHByb2pNYXRyQ29lZnMtPnJvd3MgIT0gMSB8fCBwcm9qTWF0ckNvZWZzLT5jb2xzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qTWF0ckNvZWZzIG11c3QgYmUgMXg0IiApOworICAgIH0KKworICAgIC8qIENvbXB1dGVzIHByb2plY3QgbWF0cml4IGZyb20gZ2l2ZW4gcmVkdWNlZCBtYXRyaXggKi8KKyAgICAvKiB3ZSBoYXZlIHAscSxyLHMsdCBhbmQgbmVlZCBnZXQgYSxiLGMsZCAqLworICAgIC8qIEZpbGwgbWF0cml4IHRvIGNvbXB1dGUgcmF0aW8gYTpiOmMgYXMgQTpCOkMgKi8KKyAgICAKKyAgICBDdk1hdCBtYXRyQTsKKyAgICBkb3VibGUgbWF0ckFfZGF0WzMqM107CisgICAgbWF0ckEgPSBjdk1hdCgzLDMsQ1ZfNjRGLG1hdHJBX2RhdCk7CisgICAgCisgICAgZG91YmxlIHAscSxyLHMsdDsKKyAgICBwID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmcywwLDApOworICAgIHEgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWZzLDAsMSk7CisgICAgciA9IGN2bUdldChmdW5kUmVkdWNlQ29lZnMsMCwyKTsKKyAgICBzID0gY3ZtR2V0KGZ1bmRSZWR1Y2VDb2VmcywwLDMpOworICAgIHQgPSBjdm1HZXQoZnVuZFJlZHVjZUNvZWZzLDAsNCk7CisKKyAgICBtYXRyQV9kYXRbMF0gPSBwOworICAgIG1hdHJBX2RhdFsxXSA9IHI7CisgICAgbWF0ckFfZGF0WzJdID0gMDsKKworICAgIG1hdHJBX2RhdFszXSA9IHE7CisgICAgbWF0ckFfZGF0WzRdID0gMDsKKyAgICBtYXRyQV9kYXRbNV0gPSB0OworCisgICAgbWF0ckFfZGF0WzZdID0gMDsKKyAgICBtYXRyQV9kYXRbN10gPSBzOworICAgIG1hdHJBX2RhdFs4XSA9IC0ocCtxK3Ircyt0KTsKKworICAgIEN2TWF0IG1hdHJVOworICAgIEN2TWF0IG1hdHJXOworICAgIEN2TWF0IG1hdHJWOworICAgIAorICAgIGRvdWJsZSBtYXRyVV9kYXRbMyozXTsKKyAgICBkb3VibGUgbWF0cldfZGF0WzMqM107CisgICAgZG91YmxlIG1hdHJWX2RhdFszKjNdOworCisgICAgbWF0clUgPSBjdk1hdCgzLDMsQ1ZfNjRGLG1hdHJVX2RhdCk7CisgICAgbWF0clcgPSBjdk1hdCgzLDMsQ1ZfNjRGLG1hdHJXX2RhdCk7CisgICAgbWF0clYgPSBjdk1hdCgzLDMsQ1ZfNjRGLG1hdHJWX2RhdCk7CisKKyAgICAvKiBGcm9tIHN2ZCB3ZSBuZWVkIGp1c3QgbGFzdCB2ZWN0b3Igb2YgViBvciBsYXN0IHJvdyBWJyAqLworICAgIC8qIFdlIGdldCB0cmFuc3Bvc2VkIG1hdHJpeGVzIFUgYW5kIFYgKi8KKworICAgIGN2U1ZEKCZtYXRyQSwmbWF0clcsMCwmbWF0clYsQ1ZfU1ZEX1ZfVCk7CisKKyAgICBkb3VibGUgQTEsQjEsQzE7CisgICAgQTEgPSBtYXRyVl9kYXRbNl07CisgICAgQjEgPSBtYXRyVl9kYXRbN107CisgICAgQzEgPSBtYXRyVl9kYXRbOF07CisKKyAgICAvKiBHZXQgc2Vjb25kIGNvZWZmcyAqLworICAgIG1hdHJBX2RhdFswXSA9IDA7CisgICAgbWF0ckFfZGF0WzFdID0gcjsKKyAgICBtYXRyQV9kYXRbMl0gPSB0OworCisgICAgbWF0ckFfZGF0WzNdID0gcDsKKyAgICBtYXRyQV9kYXRbNF0gPSAwOworICAgIG1hdHJBX2RhdFs1XSA9IC0ocCtxK3Ircyt0KTsKKworICAgIG1hdHJBX2RhdFs2XSA9IHE7CisgICAgbWF0ckFfZGF0WzddID0gczsKKyAgICBtYXRyQV9kYXRbOF0gPSAwOworCisgICAgY3ZTVkQoJm1hdHJBLCZtYXRyVywwLCZtYXRyVixDVl9TVkRfVl9UKTsKKworICAgIGRvdWJsZSBBMixCMixDMjsKKyAgICBBMiA9IG1hdHJWX2RhdFs2XTsKKyAgICBCMiA9IG1hdHJWX2RhdFs3XTsKKyAgICBDMiA9IG1hdHJWX2RhdFs4XTsKKworICAgIGRvdWJsZSBhLGIsYyxkOworICAgIHsKKyAgICAgICAgQ3ZNYXQgbWF0cks7CisgICAgICAgIGRvdWJsZSBtYXRyS19kYXRbMzZdOworICAgICAgICBtYXRySyA9IGN2TWF0KDYsNixDVl82NEYsbWF0cktfZGF0KTsKKyAgICAgICAgY3ZaZXJvKCZtYXRySyk7CisKKyAgICAgICAgbWF0cktfZGF0WzBdICA9IDE7CisgICAgICAgIG1hdHJLX2RhdFs3XSAgPSAxOworICAgICAgICBtYXRyS19kYXRbMTRdID0gMTsKKworICAgICAgICBtYXRyS19kYXRbMThdID0gLTE7CisgICAgICAgIG1hdHJLX2RhdFsyNV0gPSAtMTsKKyAgICAgICAgbWF0cktfZGF0WzMyXSA9IC0xOworCisgICAgICAgIG1hdHJLX2RhdFsyMV0gPSAxOworICAgICAgICBtYXRyS19kYXRbMjddID0gMTsKKyAgICAgICAgbWF0cktfZGF0WzMzXSA9IDE7CisKKyAgICAgICAgbWF0cktfZGF0WzAqNis0XSA9IC1BMTsKKyAgICAgICAgbWF0cktfZGF0WzEqNis0XSA9IC1CMTsKKyAgICAgICAgbWF0cktfZGF0WzIqNis0XSA9IC1DMTsKKworICAgICAgICBtYXRyS19kYXRbMyo2KzVdID0gLUEyOworICAgICAgICBtYXRyS19kYXRbNCo2KzVdID0gLUIyOworICAgICAgICBtYXRyS19kYXRbNSo2KzVdID0gLUMyOworCisgICAgICAgIEN2TWF0IG1hdHJVOworICAgICAgICBDdk1hdCBtYXRyVzsKKyAgICAgICAgQ3ZNYXQgbWF0clY7CisgICAgCisgICAgICAgIGRvdWJsZSBtYXRyVV9kYXRbMzZdOworICAgICAgICBkb3VibGUgbWF0cldfZGF0WzM2XTsKKyAgICAgICAgZG91YmxlIG1hdHJWX2RhdFszNl07CisKKyAgICAgICAgbWF0clUgPSBjdk1hdCg2LDYsQ1ZfNjRGLG1hdHJVX2RhdCk7CisgICAgICAgIG1hdHJXID0gY3ZNYXQoNiw2LENWXzY0RixtYXRyV19kYXQpOworICAgICAgICBtYXRyViA9IGN2TWF0KDYsNixDVl82NEYsbWF0clZfZGF0KTsKKworICAgICAgICAvKiBGcm9tIHN2ZCB3ZSBuZWVkIGp1c3QgbGFzdCB2ZWN0b3Igb2YgViBvciBsYXN0IHJvdyBWJyAqLworICAgICAgICAvKiBXZSBnZXQgdHJhbnNwb3NlZCBtYXRyaXhlcyBVIGFuZCBWICovCisKKyAgICAgICAgY3ZTVkQoJm1hdHJLLCZtYXRyVywwLCZtYXRyVixDVl9TVkRfVl9UKTsKKyAgICAgICAgCisgICAgICAgIGEgPSBtYXRyVl9kYXRbNio1KzBdOworICAgICAgICBiID0gbWF0clZfZGF0WzYqNSsxXTsKKyAgICAgICAgYyA9IG1hdHJWX2RhdFs2KjUrMl07CisgICAgICAgIGQgPSBtYXRyVl9kYXRbNio1KzNdOworICAgICAgICAvKiB3ZSBkb24ndCBuZWVkIGxhc3QgdHdvIGNvZWZmaWNpZW50cy4gQmVjYXVzZSBpdCBqdXN0IGEgazEsazIgKi8KKworICAgICAgICBjdm1TZXQocHJvak1hdHJDb2VmcywwLDAsYSk7CisgICAgICAgIGN2bVNldChwcm9qTWF0ckNvZWZzLDAsMSxiKTsKKyAgICAgICAgY3ZtU2V0KHByb2pNYXRyQ29lZnMsMCwyLGMpOworICAgICAgICBjdm1TZXQocHJvak1hdHJDb2VmcywwLDMsZCk7CisKKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCit2b2lkIGljdkNvbXB1dGVQcm9qZWN0TWF0cml4KEN2TWF0KiBvYmpQb2ludHMsQ3ZNYXQqIHByb2pQb2ludHMsQ3ZNYXQqIHByb2pNYXRyKQorey8qIFVzaW5nIFNWRCBtZXRob2QgKi8KKworICAgIC8qIFJlY29uc3RydWN0IHBvaW50cyB1c2luZyBvYmplY3QgcG9pbnRzIGFuZCBwcm9qZWN0ZWQgcG9pbnRzICovCisgICAgLyogTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlID49NiAqLworICAgIAorICAgIEN2TWF0IG1hdHJWOworICAgIEN2TWF0KiBtYXRyQSA9IDA7CisgICAgQ3ZNYXQqIG1hdHJXID0gMDsKKyAgICBDdk1hdCogd29ya1Byb2pQb2ludHMgPSAwOworICAgIEN2TWF0KiB0bXBQcm9qUG9pbnRzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29tcHV0ZVByb2plY3RNYXRyaXgiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBmb3IgZXJyb3JzICovCisgICAgaWYoIG9ialBvaW50cyA9PSAwIHx8IHByb2pQb2ludHMgPT0gMCB8fCBwcm9qTWF0ciA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQob2JqUG9pbnRzKSB8fCAhQ1ZfSVNfTUFUKHByb2pQb2ludHMpIHx8ICFDVl9JU19NQVQocHJvak1hdHIpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGlmKCBwcm9qTWF0ci0+cm93cyAhPSAzIHx8IHByb2pNYXRyLT5jb2xzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qTWF0ciBtdXN0IGJlIDN4NCIgKTsKKyAgICB9CisKKyAgICBpbnQgbnVtUG9pbnRzOworICAgIG51bVBvaW50cyA9IHByb2pQb2ludHMtPmNvbHM7CisgICAgaWYoIG51bVBvaW50cyA8IDYgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgYXQgbGVhc3QgNiIgKTsKKyAgICB9CisKKyAgICBpZiggbnVtUG9pbnRzICE9IG9ialBvaW50cy0+Y29scyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgc2FtZSIgKTsKKyAgICB9CisKKyAgICBpZiggb2JqUG9pbnRzLT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiT2JqZWN0IHBvaW50cyBtdXN0IGhhdmUgNCBjb29yZGluYXRlcyIgKTsKKyAgICB9CisKKyAgICBpZiggcHJvalBvaW50cy0+cm93cyAhPSAzICYmICBwcm9qUG9pbnRzLT5yb3dzICE9IDIgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiUHJvamVjdGVkIHBvaW50cyBtdXN0IGhhdmUgMiBvciAzIGNvb3JkaW5hdGVzIiApOworICAgIH0KKworICAgIC8qIENyZWF0ZSBhbmQgZmlsbCBtYXRyaXggQSAqLworICAgIENWX0NBTEwoIG1hdHJBID0gY3ZDcmVhdGVNYXQobnVtUG9pbnRzKjMsIDEyLCBDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0clcgPSBjdkNyZWF0ZU1hdChudW1Qb2ludHMqMywgMTIsIENWXzY0RikgKTsKKworICAgIGlmKCBwcm9qUG9pbnRzLT5yb3dzID09IDIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggdG1wUHJvalBvaW50cyA9IGN2Q3JlYXRlTWF0KDMsbnVtUG9pbnRzLENWXzY0RikgKTsKKyAgICAgICAgY3ZNYWtlM0RQb2ludHMocHJvalBvaW50cyx0bXBQcm9qUG9pbnRzKTsKKyAgICAgICAgd29ya1Byb2pQb2ludHMgPSB0bXBQcm9qUG9pbnRzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3b3JrUHJvalBvaW50cyA9IHByb2pQb2ludHM7CisgICAgfQorCisgICAgZG91YmxlIG1hdHJWX2RhdFsxNDRdOworICAgIG1hdHJWID0gY3ZNYXQoMTIsMTIsQ1ZfNjRGLG1hdHJWX2RhdCk7CisgICAgaW50IGk7CisKKyAgICBjaGFyKiBkYXQ7CisgICAgZGF0ID0gKGNoYXIqKShtYXRyQS0+ZGF0YS5kYik7CisKKyNpZiAxCisgICAgRklMRSAqZmlsZTsKKyAgICBmaWxlID0gZm9wZW4oImQ6XFx0ZXN0XFxyZWNQcm9qTWF0ci50eHQiLCJ3Iik7CisKKyNlbmRpZgorICAgIGZvciggaSA9IDA7aSA8IG51bVBvaW50czsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4LHksdzsKKyAgICAgICAgZG91YmxlIFgsWSxaLFc7CisgICAgICAgIGRvdWJsZSogIG1hdHJEYXQgPSAoZG91YmxlKilkYXQ7CisKKyAgICAgICAgeCA9IGN2bUdldCh3b3JrUHJvalBvaW50cywwLGkpOworICAgICAgICB5ID0gY3ZtR2V0KHdvcmtQcm9qUG9pbnRzLDEsaSk7CisgICAgICAgIHcgPSBjdm1HZXQod29ya1Byb2pQb2ludHMsMixpKTsKKworCisgICAgICAgIFggPSBjdm1HZXQob2JqUG9pbnRzLDAsaSk7CisgICAgICAgIFkgPSBjdm1HZXQob2JqUG9pbnRzLDEsaSk7CisgICAgICAgIFogPSBjdm1HZXQob2JqUG9pbnRzLDIsaSk7CisgICAgICAgIFcgPSBjdm1HZXQob2JqUG9pbnRzLDMsaSk7CisKKyNpZiAxCisgICAgICAgIGZwcmludGYoZmlsZSwiJWQgKCVsZiAlbGYgJWxmICVsZikgLSAoJWxmICVsZiAlbGYpXG4iLGksWCxZLFosVyx4LHksdyApOworI2VuZGlmCisKKy8qLS0tKi8KKyAgICAgICAgbWF0ckRhdFsgMF0gPSAwOworICAgICAgICBtYXRyRGF0WyAxXSA9IDA7CisgICAgICAgIG1hdHJEYXRbIDJdID0gMDsKKyAgICAgICAgbWF0ckRhdFsgM10gPSAwOworCisgICAgICAgIG1hdHJEYXRbIDRdID0gLXcqWDsKKyAgICAgICAgbWF0ckRhdFsgNV0gPSAtdypZOworICAgICAgICBtYXRyRGF0WyA2XSA9IC13Klo7CisgICAgICAgIG1hdHJEYXRbIDddID0gLXcqVzsKKworICAgICAgICBtYXRyRGF0WyA4XSA9IHkqWDsKKyAgICAgICAgbWF0ckRhdFsgOV0gPSB5Klk7CisgICAgICAgIG1hdHJEYXRbMTBdID0geSpaOworICAgICAgICBtYXRyRGF0WzExXSA9IHkqVzsKKy8qLS0tKi8KKyAgICAgICAgbWF0ckRhdFsxMl0gPSB3Klg7CisgICAgICAgIG1hdHJEYXRbMTNdID0gdypZOworICAgICAgICBtYXRyRGF0WzE0XSA9IHcqWjsKKyAgICAgICAgbWF0ckRhdFsxNV0gPSB3Klc7CisgICAgCisgICAgICAgIG1hdHJEYXRbMTZdID0gMDsKKyAgICAgICAgbWF0ckRhdFsxN10gPSAwOworICAgICAgICBtYXRyRGF0WzE4XSA9IDA7CisgICAgICAgIG1hdHJEYXRbMTldID0gMDsKKyAgICAKKyAgICAgICAgbWF0ckRhdFsyMF0gPSAteCpYOworICAgICAgICBtYXRyRGF0WzIxXSA9IC14Klk7CisgICAgICAgIG1hdHJEYXRbMjJdID0gLXgqWjsKKyAgICAgICAgbWF0ckRhdFsyM10gPSAteCpXOworLyotLS0qLworICAgICAgICBtYXRyRGF0WzI0XSA9IC15Klg7CisgICAgICAgIG1hdHJEYXRbMjVdID0gLXkqWTsKKyAgICAgICAgbWF0ckRhdFsyNl0gPSAteSpaOworICAgICAgICBtYXRyRGF0WzI3XSA9IC15Klc7CisgICAgCisgICAgICAgIG1hdHJEYXRbMjhdID0geCpYOworICAgICAgICBtYXRyRGF0WzI5XSA9IHgqWTsKKyAgICAgICAgbWF0ckRhdFszMF0gPSB4Klo7CisgICAgICAgIG1hdHJEYXRbMzFdID0geCpXOworICAgIAorICAgICAgICBtYXRyRGF0WzMyXSA9IDA7CisgICAgICAgIG1hdHJEYXRbMzNdID0gMDsKKyAgICAgICAgbWF0ckRhdFszNF0gPSAwOworICAgICAgICBtYXRyRGF0WzM1XSA9IDA7CisvKi0tLSovCisgICAgICAgIGRhdCArPSAobWF0ckEtPnN0ZXApKjM7CisgICAgfQorI2lmIDEKKyAgICBmY2xvc2UoZmlsZSk7CisKKyNlbmRpZgorCisgICAgLyogU29sdmUgdGhpcyBzeXN0ZW0gKi8KKworICAgIC8qIEZyb20gc3ZkIHdlIG5lZWQganVzdCBsYXN0IHZlY3RvciBvZiBWIG9yIGxhc3Qgcm93IFYnICovCisgICAgLyogV2UgZ2V0IHRyYW5zcG9zZWQgbWF0cml4IFYgKi8KKworICAgIGN2U1ZEKG1hdHJBLG1hdHJXLDAsJm1hdHJWLENWX1NWRF9WX1QpOworCisgICAgLyogcHJvamVjdGVkIG1hdHJpeCB3YXMgY29tcHV0ZWQgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgMTI7IGkrKyApCisgICAgeworICAgICAgICBjdm1TZXQocHJvak1hdHIsaS80LGklNCxjdm1HZXQoJm1hdHJWLDExLGkpKTsKKyAgICB9CisKKyAgICBjdlJlbGVhc2VNYXQoJm1hdHJBKTsKKyAgICBjdlJlbGVhc2VNYXQoJm1hdHJXKTsKKyAgICBjdlJlbGVhc2VNYXQoJnRtcFByb2pQb2ludHMpOworICAgIF9fRU5EX187Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogIE1heSBiZSB1c2VsZXNzIGZ1bmN0aW9uICovCit2b2lkIGljdkNvbXB1dGVUcmFuc2Zvcm00RChDdk1hdCogcG9pbnRzMSxDdk1hdCogcG9pbnRzMixDdk1hdCogdHJhbnNNYXRyKQoreworICAgIEN2TWF0KiBtYXRyQSA9IDA7CisgICAgQ3ZNYXQqIG1hdHJXID0gMDsKKworICAgIGRvdWJsZSBtYXRyVl9kYXRbMjU2XTsKKyAgICBDdk1hdCAgbWF0clYgPSBjdk1hdCgxNiwxNixDVl82NEYsbWF0clZfZGF0KTsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q29tcHV0ZVRyYW5zZm9ybTREIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBwb2ludHMxID09IDAgfHwgcG9pbnRzMiA9PSAwIHx8IHRyYW5zTWF0ciA9PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQocG9pbnRzMSkgfHwgIUNWX0lTX01BVChwb2ludHMyKSB8fCAhQ1ZfSVNfTUFUKHRyYW5zTWF0cikgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgcGFyYW1ldGVycyBtdXN0IGJlIGEgbWF0cmljZXMiICk7CisgICAgfQorCisgICAgLyogQ29tcHV0ZXMgdHJhbnNmb3JtYXRpb24gbWF0cml4ICg0eDQpIGZvciBwb2ludHMxIC0+IHBvaW50czIgKi8KKyAgICAvKiBwMj1IKnAxICovCisKKyAgICAvKiBUZXN0IGZvciBlcnJvcnMgKi8KKyAgICBpbnQgbnVtUG9pbnRzOworICAgIG51bVBvaW50cyA9IHBvaW50czEtPmNvbHM7CisKKyAgICAvKiB3ZSBtdXN0IGhhdmUgYXQgbGVhc3QgNSBwb2ludHMgKi8KKyAgICBpZiggbnVtUG9pbnRzIDwgNSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgcG9pbnRzIG11c3QgYmUgYXQgbGVhc3QgNSIgKTsKKyAgICB9CisKKyAgICBpZiggbnVtUG9pbnRzICE9IHBvaW50czItPmNvbHMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCB0cmFuc01hdHItPnJvd3MgIT0gNCB8fCB0cmFuc01hdHItPmNvbHMgIT0gNCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHRyYW5zTWF0ciBtdXN0IGJlIDR4NCIgKTsKKyAgICB9CisKKyAgICBpZiggcG9pbnRzMS0+cm93cyAhPSA0IHx8IHBvaW50czItPnJvd3MgIT0gNCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJOdW1iZXIgb2YgY29vcmRpbmF0ZXMgb2YgcG9pbnRzIG11c3QgYmUgNCIgKTsKKyAgICB9CisKKyAgICAvKiBDcmVhdGUgbWF0cml4ICovCisgICAgQ1ZfQ0FMTCggbWF0ckEgPSBjdkNyZWF0ZU1hdCg2Km51bVBvaW50cywxNixDVl82NEYpICk7CisgICAgQ1ZfQ0FMTCggbWF0clcgPSBjdkNyZWF0ZU1hdCg2Km51bVBvaW50cywxNixDVl82NEYpICk7CisKKyAgICBjdlplcm8obWF0ckEpOworCisgICAgLyogRmlsbCBtYXRyaWNlcyAqLworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApLyogRm9yIGVhY2ggcG9pbnQgKi8KKyAgICB7CisgICAgICAgIGRvdWJsZSBYMSxZMSxaMSxXMTsKKyAgICAgICAgZG91YmxlIFBbNF07CisKKyAgICAgICAgUFswXSA9IGN2bUdldChwb2ludHMxLDAsaSk7CisgICAgICAgIFBbMV0gPSBjdm1HZXQocG9pbnRzMSwxLGkpOworICAgICAgICBQWzJdID0gY3ZtR2V0KHBvaW50czEsMixpKTsKKyAgICAgICAgUFszXSA9IGN2bUdldChwb2ludHMxLDMsaSk7CisKKyAgICAgICAgWDEgPSBjdm1HZXQocG9pbnRzMiwwLGkpOworICAgICAgICBZMSA9IGN2bUdldChwb2ludHMyLDEsaSk7CisgICAgICAgIFoxID0gY3ZtR2V0KHBvaW50czIsMixpKTsKKyAgICAgICAgVzEgPSBjdm1HZXQocG9pbnRzMiwzLGkpOworCisgICAgICAgIC8qIEZpbGwgbWF0ckEgKi8KKyAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCA0OyBqKysgKS8qIEZvciBlYWNoIGNvb3JkaW5hdGUgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHgseSx6LHc7CisKKyAgICAgICAgICAgIHggPSBYMSpQW2pdOworICAgICAgICAgICAgeSA9IFkxKlBbal07CisgICAgICAgICAgICB6ID0gWjEqUFtqXTsKKyAgICAgICAgICAgIHcgPSBXMSpQW2pdOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzAsNCowK2oseSk7CisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzAsNCoxK2osLXgpOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzEsNCowK2oseik7CisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzEsNCoyK2osLXgpOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzIsNCowK2osdyk7CisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzIsNCozK2osLXgpOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzMsNCoxK2osLXopOworICAgICAgICAgICAgY3ZtU2V0KG1hdHJBLDYqaSszLDQqMitqLHkpOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzQsNCoxK2osLXcpOworICAgICAgICAgICAgY3ZtU2V0KG1hdHJBLDYqaSs0LDQqMytqLHkpOworCisgICAgICAgICAgICBjdm1TZXQobWF0ckEsNippKzUsNCoyK2osLXcpOworICAgICAgICAgICAgY3ZtU2V0KG1hdHJBLDYqaSs1LDQqMytqLHopOworICAgICAgICB9CisgICAgfQorCisgICAgLyogRnJvbSBzdmQgd2UgbmVlZCBqdXN0IHR3byBsYXN0IHZlY3RvcnMgb2YgViBvciB0d28gbGFzdCByb3cgVicgKi8KKyAgICAvKiBXZSBnZXQgdHJhbnNwb3NlZCBtYXRyaXhlcyBVIGFuZCBWICovCisKKyAgICBjdlNWRChtYXRyQSxtYXRyVywwLCZtYXRyVixDVl9TVkRfVl9UKTsKKworICAgIC8qIENvcHkgcmVzdWx0IHRvIHJlc3VsdCBtYXRyaXggKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgMTY7IGkrKyApCisgICAgeworICAgICAgICBjdm1TZXQodHJhbnNNYXRyLGkvNCxpJTQsY3ZtR2V0KCZtYXRyViwxNSxpKSk7CisgICAgfQorICAgIAorICAgIGN2UmVsZWFzZU1hdCgmbWF0ckEpOworICAgIGN2UmVsZWFzZU1hdCgmbWF0clcpOworCisgICAgX19FTkRfXzsKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBpY3ZSZWNvbnN0cnVjdFBvaW50c0ZvcjNWaWV3KCBDdk1hdCogcHJvak1hdHIxLEN2TWF0KiBwcm9qTWF0cjIsQ3ZNYXQqIHByb2pNYXRyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHByb2pQb2ludHMxLEN2TWF0KiBwcm9qUG9pbnRzMixDdk1hdCogcHJvalBvaW50czMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwb2ludHM0RCkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdlJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXciICk7CisgICAgX19CRUdJTl9fOworCisgICAgaWYoIHByb2pNYXRyMSA9PSAwIHx8IHByb2pNYXRyMiA9PSAwIHx8IHByb2pNYXRyMyA9PSAwIHx8CisgICAgICAgIHByb2pQb2ludHMxID09IDAgfHwgcHJvalBvaW50czIgPT0gMCB8fCBwcm9qUG9pbnRzMyA9PSAwIHx8CisgICAgICAgIHBvaW50czREID09IDApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwcm9qTWF0cjEpIHx8ICFDVl9JU19NQVQocHJvak1hdHIyKSB8fCAhQ1ZfSVNfTUFUKHByb2pNYXRyMykgfHwKKyAgICAgICAgIUNWX0lTX01BVChwcm9qUG9pbnRzMSkgfHwgIUNWX0lTX01BVChwcm9qUG9pbnRzMikgfHwgIUNWX0lTX01BVChwcm9qUG9pbnRzMykgIHx8CisgICAgICAgICFDVl9JU19NQVQocG9pbnRzNEQpICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHBhcmFtZXRlcnMgbXVzdCBiZSBhIG1hdHJpY2VzIiApOworICAgIH0KKworICAgIGludCBudW1Qb2ludHM7CisgICAgbnVtUG9pbnRzID0gcHJvalBvaW50czEtPmNvbHM7CisKKyAgICBpZiggbnVtUG9pbnRzIDwgMSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIk51bWJlciBvZiBwb2ludHMgbXVzdCBiZSBtb3JlIHRoYW4gemVybyIgKTsKKyAgICB9CisKKyAgICBpZiggcHJvalBvaW50czItPmNvbHMgIT0gbnVtUG9pbnRzIHx8IHByb2pQb2ludHMzLT5jb2xzICE9IG51bVBvaW50cyB8fCBwb2ludHM0RC0+Y29scyAhPSBudW1Qb2ludHMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCBwcm9qUG9pbnRzMS0+cm93cyAhPSAyIHx8IHByb2pQb2ludHMyLT5yb3dzICE9IDIgfHwgcHJvalBvaW50czMtPnJvd3MgIT0gMikKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBwcm9qIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlID09IDIiICk7CisgICAgfQorCisgICAgaWYoIHBvaW50czRELT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHdvcmxkIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlID09IDQiICk7CisgICAgfQorCisgICAgaWYoIHByb2pNYXRyMS0+Y29scyAhPSA0IHx8IHByb2pNYXRyMS0+cm93cyAhPSAzIHx8CisgICAgICAgIHByb2pNYXRyMi0+Y29scyAhPSA0IHx8IHByb2pNYXRyMi0+cm93cyAhPSAzIHx8CisgICAgICAgIHByb2pNYXRyMy0+Y29scyAhPSA0IHx8IHByb2pNYXRyMy0+cm93cyAhPSAzKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qZWN0aW9uIG1hdHJpY2VzIG11c3QgYmUgM3g0IiApOworICAgIH0KKworICAgIEN2TWF0IG1hdHJBOworICAgIGRvdWJsZSBtYXRyQV9kYXRbMzZdOworICAgIG1hdHJBID0gY3ZNYXQoOSw0LENWXzY0RixtYXRyQV9kYXQpOworCisgICAgLy9Ddk1hdCBtYXRyVTsKKyAgICBDdk1hdCBtYXRyVzsKKyAgICBDdk1hdCBtYXRyVjsKKyAgICAvL2RvdWJsZSBtYXRyVV9kYXRbOSo5XTsKKyAgICBkb3VibGUgbWF0cldfZGF0WzkqNF07CisgICAgZG91YmxlIG1hdHJWX2RhdFs0KjRdOworCisgICAgLy9tYXRyVSA9IGN2TWF0KDksOSxDVl82NEYsbWF0clVfZGF0KTsKKyAgICBtYXRyVyA9IGN2TWF0KDksNCxDVl82NEYsbWF0cldfZGF0KTsKKyAgICBtYXRyViA9IGN2TWF0KDQsNCxDVl82NEYsbWF0clZfZGF0KTsKKworICAgIEN2TWF0KiBwcm9qUG9pbnRzWzNdOworICAgIEN2TWF0KiBwcm9qTWF0cnNbM107CisgICAgCisgICAgcHJvalBvaW50c1swXSA9IHByb2pQb2ludHMxOworICAgIHByb2pQb2ludHNbMV0gPSBwcm9qUG9pbnRzMjsKKyAgICBwcm9qUG9pbnRzWzJdID0gcHJvalBvaW50czM7CisKKyAgICBwcm9qTWF0cnNbMF0gPSBwcm9qTWF0cjE7CisgICAgcHJvak1hdHJzWzFdID0gcHJvak1hdHIyOworICAgIHByb2pNYXRyc1syXSA9IHByb2pNYXRyMzsKKworICAgIC8qIFNvbHZlIHN5c3RlbSBmb3IgZWFjaCBwb2ludCAqLworICAgIGludCBpLGo7CisgICAgZm9yKCBpID0gMDsgaSA8IG51bVBvaW50czsgaSsrICkvKiBGb3IgZWFjaCBwb2ludCAqLworICAgIHsKKyAgICAgICAgLyogRmlsbCBtYXRyaXggZm9yIGN1cnJlbnQgcG9pbnQgKi8KKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IDM7IGorKyApLyogRm9yIGVhY2ggdmlldyAqLworICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgeCx5OworICAgICAgICAgICAgeCA9IGN2bUdldChwcm9qUG9pbnRzW2pdLDAsaSk7CisgICAgICAgICAgICB5ID0gY3ZtR2V0KHByb2pQb2ludHNbal0sMSxpKTsKKyAgICAgICAgICAgIGZvciggaW50IGsgPSAwOyBrIDwgNDsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdm1TZXQoJm1hdHJBLCBqKjMrMCwgaywgeCAqIGN2bUdldChwcm9qTWF0cnNbal0sMixrKSAtICAgICBjdm1HZXQocHJvak1hdHJzW2pdLDAsaykgKTsKKyAgICAgICAgICAgICAgICBjdm1TZXQoJm1hdHJBLCBqKjMrMSwgaywgeSAqIGN2bUdldChwcm9qTWF0cnNbal0sMixrKSAtICAgICBjdm1HZXQocHJvak1hdHJzW2pdLDEsaykgKTsKKyAgICAgICAgICAgICAgICBjdm1TZXQoJm1hdHJBLCBqKjMrMiwgaywgeCAqIGN2bUdldChwcm9qTWF0cnNbal0sMSxrKSAtIHkgKiBjdm1HZXQocHJvak1hdHJzW2pdLDAsaykgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBTb2x2ZSBzeXN0ZW0gZm9yIGN1cnJlbnQgcG9pbnQgKi8KKyAgICAgICAgeworICAgICAgICAgICAgY3ZTVkQoJm1hdHJBLCZtYXRyVywwLCZtYXRyVixDVl9TVkRfVl9UKTsKKworICAgICAgICAgICAgLyogQ29weSBjb21wdXRlZCBwb2ludCAqLworICAgICAgICAgICAgY3ZtU2V0KHBvaW50czRELDAsaSxjdm1HZXQoJm1hdHJWLDMsMCkpOy8qIFggKi8KKyAgICAgICAgICAgIGN2bVNldChwb2ludHM0RCwxLGksY3ZtR2V0KCZtYXRyViwzLDEpKTsvKiBZICovCisgICAgICAgICAgICBjdm1TZXQocG9pbnRzNEQsMixpLGN2bUdldCgmbWF0clYsMywyKSk7LyogWiAqLworICAgICAgICAgICAgY3ZtU2V0KHBvaW50czRELDMsaSxjdm1HZXQoJm1hdHJWLDMsMykpOy8qIFcgKi8KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFBvaW50cyB3YXMgcmVjb25zdHJ1Y3RlZC4gVHJ5IHRvIHJlcHJvamVjdCBwb2ludHMgKi8KKyAgICAvKiBXZSBjYW4gY29tcHV0ZSByZXByb2plY3Rpb24gZXJyb3IgaWYgbmVlZCAqLworICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIEN2TWF0IHBvaW50M0Q7CisgICAgICAgIGRvdWJsZSBwb2ludDNEX2RhdFs0XTsKKyAgICAgICAgcG9pbnQzRCA9IGN2TWF0KDQsMSxDVl82NEYscG9pbnQzRF9kYXQpOworCisgICAgICAgIEN2TWF0IHBvaW50MkQ7CisgICAgICAgIGRvdWJsZSBwb2ludDJEX2RhdFszXTsKKyAgICAgICAgcG9pbnQyRCA9IGN2TWF0KDMsMSxDVl82NEYscG9pbnQyRF9kYXQpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBXID0gY3ZtR2V0KHBvaW50czRELDMsaSk7CisKKyAgICAgICAgICAgIHBvaW50M0RfZGF0WzBdID0gY3ZtR2V0KHBvaW50czRELDAsaSkvVzsKKyAgICAgICAgICAgIHBvaW50M0RfZGF0WzFdID0gY3ZtR2V0KHBvaW50czRELDEsaSkvVzsKKyAgICAgICAgICAgIHBvaW50M0RfZGF0WzJdID0gY3ZtR2V0KHBvaW50czRELDIsaSkvVzsKKyAgICAgICAgICAgIHBvaW50M0RfZGF0WzNdID0gMTsKKworICAgICAgICAgICAgICAgIC8qICEhISBQcm9qZWN0IHRoaXMgcG9pbnQgZm9yIGVhY2ggY2FtZXJhICovCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgY3VyckNhbWVyYSA9IDA7IGN1cnJDYW1lcmEgPCAzOyBjdXJyQ2FtZXJhKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3ZtTXVsKHByb2pNYXRyc1tjdXJyQ2FtZXJhXSwgJnBvaW50M0QsICZwb2ludDJEKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4LHk7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHhyLHlyLHdyOworICAgICAgICAgICAgICAgICAgICB4ID0gKGZsb2F0KWN2bUdldChwcm9qUG9pbnRzW2N1cnJDYW1lcmFdLDAsaSk7CisgICAgICAgICAgICAgICAgICAgIHkgPSAoZmxvYXQpY3ZtR2V0KHByb2pQb2ludHNbY3VyckNhbWVyYV0sMSxpKTsKKworICAgICAgICAgICAgICAgICAgICB3ciA9IChmbG9hdClwb2ludDJEX2RhdFsyXTsKKyAgICAgICAgICAgICAgICAgICAgeHIgPSAoZmxvYXQpKHBvaW50MkRfZGF0WzBdL3dyKTsKKyAgICAgICAgICAgICAgICAgICAgeXIgPSAoZmxvYXQpKHBvaW50MkRfZGF0WzFdL3dyKTsKKworICAgICAgICAgICAgICAgICAgICBmbG9hdCBkZWx0YVgsZGVsdGFZOworICAgICAgICAgICAgICAgICAgICBkZWx0YVggPSAoZmxvYXQpZmFicyh4LXhyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGFZID0gKGZsb2F0KWZhYnMoeS15cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKyAgICByZXR1cm47Cit9CisKKworCisKKyNpZiAwCit2b2lkIFJlY29uc3RydWN0UG9pbnRzRm9yM1ZpZXdfYnlTb2x2ZSggQ3ZNYXQqIHByb2pNYXRyMSxDdk1hdCogcHJvak1hdHIyLEN2TWF0KiBwcm9qTWF0cjMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBwcm9qUG9pbnRzMSxDdk1hdCogcHJvalBvaW50czIsQ3ZNYXQqIHByb2pQb2ludHMzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcG9pbnRzM0QpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJSZWNvbnN0cnVjdFBvaW50c0ZvcjNWaWV3IiApOworICAgIF9fQkVHSU5fXzsKKworCisgICAgaW50IG51bVBvaW50czsKKyAgICBudW1Qb2ludHMgPSBwcm9qUG9pbnRzMS0+Y29sczsKKyAgICBpZiggcHJvalBvaW50czItPmNvbHMgIT0gbnVtUG9pbnRzIHx8IHByb2pQb2ludHMzLT5jb2xzICE9IG51bVBvaW50cyB8fCBwb2ludHMzRC0+Y29scyAhPSBudW1Qb2ludHMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHBvaW50cyBtdXN0IGJlIHRoZSBzYW1lIiApOworICAgIH0KKworICAgIGlmKCBwcm9qUG9pbnRzMS0+cm93cyAhPSAyIHx8IHByb2pQb2ludHMyLT5yb3dzICE9IDIgfHwgcHJvalBvaW50czMtPnJvd3MgIT0gMikKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIk51bWJlciBvZiBwcm9qIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlID09IDIiICk7CisgICAgfQorCisgICAgaWYoIHBvaW50czNELT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHdvcmxkIHBvaW50cyBjb29yZGluYXRlcyBtdXN0IGJlID09IDQiICk7CisgICAgfQorCisgICAgaWYoIHByb2pNYXRyMS0+Y29scyAhPSA0IHx8IHByb2pNYXRyMS0+cm93cyAhPSAzIHx8CisgICAgICAgIHByb2pNYXRyMi0+Y29scyAhPSA0IHx8IHByb2pNYXRyMi0+cm93cyAhPSAzIHx8CisgICAgICAgIHByb2pNYXRyMy0+Y29scyAhPSA0IHx8IHByb2pNYXRyMy0+cm93cyAhPSAzKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qIG1hdHJpeCBtdXN0IGJlIDN4NCIgKTsKKyAgICB9CisKKyAgICBDdk1hdCBtYXRyQTsKKyAgICBkb3VibGUgbWF0ckFfZGF0WzMqMyozXTsKKyAgICBtYXRyQSA9IGN2TWF0KDMqMywzLENWXzY0RixtYXRyQV9kYXQpOworCisgICAgQ3ZNYXQgdmVjdEI7CisgICAgZG91YmxlIHZlY3RCX2RhdFs5XTsKKyAgICB2ZWN0QiA9IGN2TWF0KDksMSxDVl82NEYsdmVjdEJfZGF0KTsKKworICAgIEN2TWF0IHJlc3VsdDsKKyAgICBkb3VibGUgcmVzdWx0X2RhdFszXTsKKyAgICByZXN1bHQgPSBjdk1hdCgzLDEsQ1ZfNjRGLHJlc3VsdF9kYXQpOworCisgICAgQ3ZNYXQqIHByb2pQb2ludHNbM107CisgICAgQ3ZNYXQqIHByb2pNYXRyc1szXTsKKyAgICAKKyAgICBwcm9qUG9pbnRzWzBdID0gcHJvalBvaW50czE7CisgICAgcHJvalBvaW50c1sxXSA9IHByb2pQb2ludHMyOworICAgIHByb2pQb2ludHNbMl0gPSBwcm9qUG9pbnRzMzsKKworICAgIHByb2pNYXRyc1swXSA9IHByb2pNYXRyMTsKKyAgICBwcm9qTWF0cnNbMV0gPSBwcm9qTWF0cjI7CisgICAgcHJvak1hdHJzWzJdID0gcHJvak1hdHIzOworCisgICAgLyogU29sdmUgc3lzdGVtIGZvciBlYWNoIHBvaW50ICovCisgICAgaW50IGksajsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKS8qIEZvciBlYWNoIHBvaW50ICovCisgICAgeworICAgICAgICAvKiBGaWxsIG1hdHJpeCBmb3IgY3VycmVudCBwb2ludCAqLworICAgICAgICBmb3IoIGogPSAwOyBqIDwgMzsgaisrICkvKiBGb3IgZWFjaCB2aWV3ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB4LHk7CisgICAgICAgICAgICB4ID0gY3ZtR2V0KHByb2pQb2ludHNbal0sMCxpKTsKKyAgICAgICAgICAgIHkgPSBjdm1HZXQocHJvalBvaW50c1tqXSwxLGkpOworCisgICAgICAgICAgICBjdm1TZXQoJnZlY3RCLGoqMyswLDAseC1jdm1HZXQocHJvak1hdHJzW2pdLDAsMykpOworICAgICAgICAgICAgY3ZtU2V0KCZ2ZWN0QixqKjMrMSwwLHktY3ZtR2V0KHByb2pNYXRyc1tqXSwxLDMpKTsKKyAgICAgICAgICAgIGN2bVNldCgmdmVjdEIsaiozKzIsMCwxLWN2bUdldChwcm9qTWF0cnNbal0sMiwzKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaW50IHQgPSAwOyB0IDwgMzsgdCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBrID0gMDsgayA8IDM7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdm1TZXQoJm1hdHJBLCBqKjMrdCwgaywgY3ZtR2V0KHByb2pNYXRyc1tqXSx0LGspICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICAvKiBTb2x2ZSBzeXN0ZW0gZm9yIGN1cnJlbnQgcG9pbnQgKi8KKyAgICAgICAgY3ZTb2x2ZSgmbWF0ckEsJnZlY3RCLCZyZXN1bHQsQ1ZfU1ZEKTsKKworICAgICAgICBjdm1TZXQocG9pbnRzM0QsMCxpLHJlc3VsdF9kYXRbMF0pOy8qIFggKi8KKyAgICAgICAgY3ZtU2V0KHBvaW50czNELDEsaSxyZXN1bHRfZGF0WzFdKTsvKiBZICovCisgICAgICAgIGN2bVNldChwb2ludHMzRCwyLGkscmVzdWx0X2RhdFsyXSk7LyogWiAqLworICAgICAgICBjdm1TZXQocG9pbnRzM0QsMyxpLDEpOy8qIFcgKi8KKworICAgIH0KKworICAgIC8qIFBvaW50cyB3YXMgcmVjb25zdHJ1Y3RlZC4gVHJ5IHRvIHJlcHJvamVjdCBwb2ludHMgKi8KKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBDdk1hdCBwb2ludDNEOworICAgICAgICBkb3VibGUgcG9pbnQzRF9kYXRbNF07CisgICAgICAgIHBvaW50M0QgPSBjdk1hdCg0LDEsQ1ZfNjRGLHBvaW50M0RfZGF0KTsKKworICAgICAgICBDdk1hdCBwb2ludDJEOworICAgICAgICBkb3VibGUgcG9pbnQyRF9kYXRbM107CisgICAgICAgIHBvaW50MkQgPSBjdk1hdCgzLDEsQ1ZfNjRGLHBvaW50MkRfZGF0KTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtUG9pbnRzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgVyA9IGN2bUdldChwb2ludHMzRCwzLGkpOworCisgICAgICAgICAgICBwb2ludDNEX2RhdFswXSA9IGN2bUdldChwb2ludHMzRCwwLGkpL1c7CisgICAgICAgICAgICBwb2ludDNEX2RhdFsxXSA9IGN2bUdldChwb2ludHMzRCwxLGkpL1c7CisgICAgICAgICAgICBwb2ludDNEX2RhdFsyXSA9IGN2bUdldChwb2ludHMzRCwyLGkpL1c7CisgICAgICAgICAgICBwb2ludDNEX2RhdFszXSA9IDE7CisKKyAgICAgICAgICAgICAgICAvKiBQcm9qZWN0IHRoaXMgcG9pbnQgZm9yIGVhY2ggY2FtZXJhICovCisgICAgICAgICAgICAgICAgZm9yKCBpbnQgY3VyckNhbWVyYSA9IDA7IGN1cnJDYW1lcmEgPCAzOyBjdXJyQ2FtZXJhKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3ZtTXVsKHByb2pNYXRyc1tjdXJyQ2FtZXJhXSwgJnBvaW50M0QsICZwb2ludDJEKTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgeCx5OworICAgICAgICAgICAgICAgICAgICBmbG9hdCB4cix5cix3cjsKKyAgICAgICAgICAgICAgICAgICAgeCA9IChmbG9hdCljdm1HZXQocHJvalBvaW50c1tjdXJyQ2FtZXJhXSwwLGkpOworICAgICAgICAgICAgICAgICAgICB5ID0gKGZsb2F0KWN2bUdldChwcm9qUG9pbnRzW2N1cnJDYW1lcmFdLDEsaSk7CisKKyAgICAgICAgICAgICAgICAgICAgd3IgPSAoZmxvYXQpcG9pbnQyRF9kYXRbMl07CisgICAgICAgICAgICAgICAgICAgIHhyID0gKGZsb2F0KShwb2ludDJEX2RhdFswXS93cik7CisgICAgICAgICAgICAgICAgICAgIHlyID0gKGZsb2F0KShwb2ludDJEX2RhdFsxXS93cik7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIHJldHVybjsKK30KKyNlbmRpZgorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKK3ZvaWQgaWN2Q29tcHV0ZUNhbWVyYUV4cmlubnNpY0J5UG9zaXRpb24oQ3ZNYXQqIGNhbVBvcywgQ3ZNYXQqIHJvdE1hdHIsIEN2TWF0KiB0cmFuc1ZlY3QpCit7CisgICAgLyogV2Uga25vdyBwb3NpdGlvbiBvZiBjYW1lcmEuIHdlIG11c3QgdG8gY29tcHV0ZSByb3RhdGUgbWF0cml4IGFuZCB0cmFuc2xhdGUgdmVjdG9yICovCisKKyAgICBDVl9GVU5DTkFNRSggImljdkNvbXB1dGVDYW1lcmFFeHJpbm5zaWNCeVBvc2l0aW9uIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIC8qIFRlc3QgaW5wdXQgcGFyYW1hdGVycyAqLworICAgIGlmKCBjYW1Qb3MgPT0gMCB8fCByb3RNYXRyID09IDAgfHwgdHJhbnNWZWN0ID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHBhcmFtZXRlcnMgaXMgYSBOVUxMIHBvaW50ZXIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoY2FtUG9zKSB8fCAhQ1ZfSVNfTUFUKHJvdE1hdHIpIHx8ICFDVl9JU19NQVQodHJhbnNWZWN0KSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnB1dCBwYXJhbWV0ZXJzIG11c3QgYmUgYSBtYXRyaWNlcyIgKTsKKyAgICB9CisKKyAgICBpZiggY2FtUG9zLT5jb2xzICE9IDEgfHwgY2FtUG9zLT5yb3dzICE9IDMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIGNvb3JkaW5hdGVzIG9mIGNhbWVyYSBwb3NpdGlvbiBtdXN0IGJlIDN4MSB2ZWN0b3IiICk7CisgICAgfQorCisgICAgaWYoIHJvdE1hdHItPmNvbHMgIT0gMyB8fCByb3RNYXRyLT5yb3dzICE9IDMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiUm90YXRlIG1hdHJpeCBtdXN0IGJlIDN4MyIgKTsKKyAgICB9CisKKyAgICBpZiggdHJhbnNWZWN0LT5jb2xzICE9IDEgfHwgdHJhbnNWZWN0LT5yb3dzICE9IDMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVHJhbnNsYXRlIHZlY3RvciBtdXN0IGJlIDN4MSIgKTsKKyAgICB9CisKKyAgICBkb3VibGUgeCx5LHo7CisgICAgeCA9IGN2bUdldChjYW1Qb3MsMCwwKTsKKyAgICB5ID0gY3ZtR2V0KGNhbVBvcywxLDApOworICAgIHogPSBjdm1HZXQoY2FtUG9zLDIsMCk7CisKKyAgICAvKiBTZXQgdHJhbnNsYXRlIHZlY3Rvci4gSXQgc2FtZSBhcyBjYW1lYSBwb3NpdGlvbiAqLworICAgIGN2bVNldCh0cmFuc1ZlY3QsMCwwLHgpOworICAgIGN2bVNldCh0cmFuc1ZlY3QsMSwwLHkpOworICAgIGN2bVNldCh0cmFuc1ZlY3QsMiwwLHopOworCisgICAgLyogQ29tcHV0ZSByb3RhdGUgbWF0cml4LiBDb21wdXRlIGVhY2ggdW5pdCB0cmFuc2Zvcm1lZCB2ZWN0b3IgKi8KKworICAgIC8qIG5vcm1hbGl6ZSBmbGF0IGRpcmVjdGlvbiB4LHkgKi8KKyAgICBkb3VibGUgdmVjdG9yWFszXTsKKyAgICBkb3VibGUgdmVjdG9yWVszXTsKKyAgICBkb3VibGUgdmVjdG9yWlszXTsKKworICAgIHZlY3RvclhbMF0gPSAtejsKKyAgICB2ZWN0b3JYWzFdID0gIDA7CisgICAgdmVjdG9yWFsyXSA9ICB4OworCisgICAgdmVjdG9yWVswXSA9ICB4Knk7CisgICAgdmVjdG9yWVsxXSA9ICB4Kngreip6OworICAgIHZlY3RvcllbMl0gPSAgeip5OworCisgICAgdmVjdG9yWlswXSA9IC14OworICAgIHZlY3RvclpbMV0gPSAteTsKKyAgICB2ZWN0b3JaWzJdID0gLXo7CisKKyAgICAvKiBub3JtYWl6ZSB2ZWN0b3JzICovCisgICAgZG91YmxlIG5vcm07CisgICAgaW50IGk7CisgICAgCisgICAgLyogTm9ybSBYICovCisgICAgbm9ybSA9IDA7CisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIG5vcm0gKz0gdmVjdG9yWFtpXSp2ZWN0b3JYW2ldOworICAgIG5vcm0gPSBzcXJ0KG5vcm0pOworICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgICAgICB2ZWN0b3JYW2ldIC89IG5vcm07CisKKyAgICAvKiBOb3JtIFkgKi8KKyAgICBub3JtID0gMDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICAgICAgbm9ybSArPSB2ZWN0b3JZW2ldKnZlY3RvcllbaV07CisgICAgbm9ybSA9IHNxcnQobm9ybSk7CisgICAgZm9yKCBpID0gMDsgaSA8IDM7IGkrKyApCisgICAgICAgIHZlY3RvcllbaV0gLz0gbm9ybTsKKworICAgIC8qIE5vcm0gWiAqLworICAgIG5vcm0gPSAwOworICAgIGZvciggaSA9IDA7IGkgPCAzOyBpKysgKQorICAgICAgICBub3JtICs9IHZlY3RvclpbaV0qdmVjdG9yWltpXTsKKyAgICBub3JtID0gc3FydChub3JtKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICAgICAgdmVjdG9yWltpXSAvPSBub3JtOworCisgICAgLyogU2V0IG91dHB1dCByZXN1bHRzICovCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgMzsgaSsrICkKKyAgICB7CisgICAgICAgIGN2bVNldChyb3RNYXRyLGksMCx2ZWN0b3JYW2ldKTsKKyAgICAgICAgY3ZtU2V0KHJvdE1hdHIsaSwxLHZlY3RvcllbaV0pOworICAgICAgICBjdm1TZXQocm90TWF0cixpLDIsdmVjdG9yWltpXSk7CisgICAgfQorCisgICAgey8qIFRyeSB0byBpbnZlcnNlIHJvdGF0ZSBtYXRyaXggKi8KKyAgICAgICAgQ3ZNYXQgdG1wSW52Um90OworICAgICAgICBkb3VibGUgdG1wSW52Um90X2RhdFs5XTsKKyAgICAgICAgdG1wSW52Um90ID0gY3ZNYXQoMywzLENWXzY0Rix0bXBJbnZSb3RfZGF0KTsKKyAgICAgICAgY3ZJbnZlcnQocm90TWF0ciwmdG1wSW52Um90LENWX1NWRCk7CisgICAgICAgIGN2Q29udmVydCgmdG1wSW52Um90LHJvdE1hdHIpOworCisKKworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKwordm9pZCBGaW5kVHJhbnNmb3JtRm9yUHJvamVjdE1hdHJpY2VzKEN2TWF0KiBwcm9qTWF0cjEsQ3ZNYXQqIHByb2pNYXRyMixDdk1hdCogcm90TWF0cixDdk1hdCogdHJhbnNWZWN0KQoreworICAgIC8qIENvbXB1dGVzIGhvbW9ncmFwaHkgZm9yIHByb2plY3QgbWF0cml4IGJlICJjYW5vbmljYWwiIGZvcm0gKi8KKyAgICBDVl9GVU5DTkFNRSggImNvbXB1dGVQcm9qTWF0ckhvbW9ncmFwaHkiICk7CisgICAgX19CRUdJTl9fOworCisgICAgLyogVGVzdCBpbnB1dCBwYXJhbWF0ZXJzICovCisgICAgaWYoIHByb2pNYXRyMSA9PSAwIHx8IHByb2pNYXRyMiA9PSAwIHx8IHJvdE1hdHIgPT0gMCB8fCB0cmFuc1ZlY3QgPT0gMCApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIlNvbWUgb2YgcGFyYW1ldGVycyBpcyBhIE5VTEwgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChwcm9qTWF0cjEpIHx8ICFDVl9JU19NQVQocHJvak1hdHIyKSB8fCAhQ1ZfSVNfTUFUKHJvdE1hdHIpIHx8ICFDVl9JU19NQVQodHJhbnNWZWN0KSApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnB1dCBwYXJhbWV0ZXJzIG11c3QgYmUgYSBtYXRyaWNlcyIgKTsKKyAgICB9CisgICAgCisgICAgaWYoIHByb2pNYXRyMS0+Y29scyAhPSA0IHx8IHByb2pNYXRyMS0+cm93cyAhPSAzICkKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgcHJvamVjdCBtYXRyaXggMSBtdXN0IGJlIDN4NCIgKTsKKyAgICB9CisKKyAgICBpZiggcHJvak1hdHIyLT5jb2xzICE9IDQgfHwgcHJvak1hdHIyLT5yb3dzICE9IDMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBwcm9qZWN0IG1hdHJpeCAyIG11c3QgYmUgM3g0IiApOworICAgIH0KKyAgICAKKyAgICBpZiggcm90TWF0ci0+Y29scyAhPSAzIHx8IHJvdE1hdHItPnJvd3MgIT0gMyApCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIHJvdGF0aW9uIG1hdHJpeCBtdXN0IGJlIDN4MyIgKTsKKyAgICB9CisKKyAgICBpZiggdHJhbnNWZWN0LT5jb2xzICE9IDEgfHwgdHJhbnNWZWN0LT5yb3dzICE9IDMgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiB0cmFuc2xhdGlvbiB2ZWN0b3IgbXVzdCBiZSAzeDEiICk7CisgICAgfQorCisgICAgQ3ZNYXQgbWF0ckE7CisgICAgZG91YmxlIG1hdHJBX2RhdFsxMioxMl07CisgICAgbWF0ckEgPSBjdk1hdCgxMiwxMixDVl82NEYsbWF0ckFfZGF0KTsKKyAgICBDdk1hdCB2ZWN0QjsKKyAgICBkb3VibGUgdmVjdEJfZGF0WzEyXTsKKyAgICB2ZWN0QiA9IGN2TWF0KDEyLDEsQ1ZfNjRGLHZlY3RCX2RhdCk7CisKKyAgICBjdlplcm8oJm1hdHJBKTsKKyAgICBjdlplcm8oJnZlY3RCKTsKKyAgICBpbnQgaSxqOworICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCAxMjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZtU2V0KCZtYXRyQSxpLGosY3ZtR2V0KHByb2pNYXRyMSxpLzQsaiU0KSk7CisgICAgICAgIH0KKyAgICAgICAgLyogRmlsbCB2ZWN0b3IgQiAqLworICAgICAgICAKKyAgICAgICAgZG91YmxlIHZhbCA9IGN2bUdldChwcm9qTWF0cjIsaS80LGklNCk7CisgICAgICAgIGlmKCAoaSsxKSU0ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgLT0gY3ZtR2V0KHByb2pNYXRyMSxpLzQsMyk7CisKKyAgICAgICAgfQorICAgICAgICBjdm1TZXQoJnZlY3RCLGksMCx2YWwpOworICAgIH0KKworICAgIC8qIFNvbHZlIHN5c3RlbSAqLworICAgIEN2TWF0IHJlc1ZlY3Q7CisgICAgZG91YmxlIHJlc1ZlY3RfZGF0WzEyXTsKKyAgICByZXNWZWN0ID0gY3ZNYXQoMTIsMSxDVl82NEYscmVzVmVjdF9kYXQpOworCisgICAgaW50IHNpbmc7CisgICAgc2luZyA9IGN2U29sdmUoJm1hdHJBLCZ2ZWN0QiwmcmVzVmVjdCk7CisKKyAgICAvKiBGaWxsIHJvdGF0aW9uIG1hdHJpeCAqLworICAgIGZvciggaSA9IDA7IGkgPCAxMjsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB2YWwgPSBjdm1HZXQoJnJlc1ZlY3QsaSwwKTsKKyAgICAgICAgaWYoIGkgPCA5ICkKKyAgICAgICAgICAgIGN2bVNldChyb3RNYXRyLGklMyxpLzMsdmFsKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZtU2V0KHRyYW5zVmVjdCxpLTksMCx2YWwpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm47Cit9CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZiAwCit2b2lkIGljdkNvbXB1dGVRa25vd1ByaW5jaXBhbFBvaW50KGludCBudW1JbWFnZXMsIEN2TWF0ICoqcHJvak1hdHJzLEN2TWF0ICptYXRyUSwgZG91YmxlIGN4LGRvdWJsZSBjeSkKK3sKKyAgICAvKiBDb21wdXRlcyBtYXRyaXggUSAqLworICAgIC8qIGZvY2FsIHggYW5kIHkgZXFhdWxzICgpICovCisgICAgLyogd2Uga25vdyBwcmluY2lwYWwgcG9pbnQgZm9yIGNhbWVyYSAqLworICAgIC8qIGZvY2FsIG1heSBkaWZmZXIgZnJvbSBpbWFnZSB0byBpbWFnZSAqLworICAgIC8qIGltYWdlIHNrZXcgaXMgMCAqLworCisgICAgaWYoIG51bUltYWdlcyA8IDEwICkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgICAgLy9FcnJvci4gTnVtYmVyIG9mIGltYWdlcyB0b28gZmV3CisgICAgfQorCisgICAgLyogQ3JlYXRlICAqLworCisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvKiBQYXJ0IHdpdGggbWV0cmljIHJlY29uc3RydWN0aW9uICovCisKKyNpZiAxCit2b2lkIGljdkNvbXB1dGVRKGludCBudW1NYXRyLCBDdk1hdCoqIHByb2pNYXRyLCBDdk1hdCoqIGNhbWVyYU1hdHIsIEN2TWF0KiBtYXRyUSkKK3sKKyAgICAvKiBLKksnID0gUCpRKlAnICovCisgICAgLyogdHJ5IHRvIHNvbHZlIFEgYnkgbGluZWFyIG1ldGhvZCAqLworCisgICAgQ3ZNYXQqIG1hdHJBID0gMDsKKyAgICBDdk1hdCogdmVjdEIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDb21wdXRlUSIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICAvKiBEZWZpbmUgbnVtYmVyIG9mIHByb2plY3Rpb24gbWF0cmljZXMgKi8KKyAgICBpZiggbnVtTWF0ciA8IDIgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiTnVtYmVyIG9mIHByb2plY3Rpb24gbWF0cmljZXMgbXVzdCBiZSBhdCBsZWFzdCAyIiApOworICAgIH0KKworCisgICAgLyogdGVzdCBtYXRyaWNlcyBzaXplcyAqLworICAgIGlmKCBtYXRyUS0+Y29scyAhPSA0IHx8IG1hdHJRLT5yb3dzICE9IDQgKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiU2l6ZSBvZiBtYXRyaXggUSBtdXN0IGJlIDN4MyIgKTsKKyAgICB9CisKKyAgICBpbnQgY3Vyck1hdHI7CisgICAgZm9yKCBjdXJyTWF0ciA9IDA7IGN1cnJNYXRyIDwgbnVtTWF0cjsgY3Vyck1hdHIrKyApCisgICAgeworCisgICAgICAgIGlmKCBjYW1lcmFNYXRyW2N1cnJNYXRyXS0+Y29scyAhPSAzIHx8IGNhbWVyYU1hdHJbY3Vyck1hdHJdLT5yb3dzICE9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJTaXplIG9mIGVhY2ggY2FtZXJhIG1hdHJpeCBtdXN0IGJlIDN4MyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBwcm9qTWF0cltjdXJyTWF0cl0tPmNvbHMgIT0gNCB8fCBwcm9qTWF0cltjdXJyTWF0cl0tPnJvd3MgIT0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlNpemUgb2YgZWFjaCBjYW1lcmEgbWF0cml4IG11c3QgYmUgM3gzIiApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIEN2TWF0IG1hdHJ3OworICAgIGRvdWJsZSBtYXRyd19kYXRbOV07CisgICAgbWF0cncgPSBjdk1hdCgzLDMsQ1ZfNjRGLG1hdHJ3X2RhdCk7CisKKyAgICBDdk1hdCBtYXRyS3Q7CisgICAgZG91YmxlIG1hdHJLdF9kYXRbOV07CisgICAgbWF0ckt0ID0gY3ZNYXQoMywzLENWXzY0RixtYXRyS3RfZGF0KTsKKworCisgICAgLyogQ3JlYXRlIG1hdHJpeCBBIGFuZCB2ZWN0b3IgQiAqLworICAgIENWX0NBTEwoIG1hdHJBID0gY3ZDcmVhdGVNYXQoOSpudW1NYXRyLDEwLENWXzY0RikgKTsKKyAgICBDVl9DQUxMKCB2ZWN0QiA9IGN2Q3JlYXRlTWF0KDkqbnVtTWF0ciwxLENWXzY0RikgKTsKKworICAgIGRvdWJsZSBkYXRhUVsxNl07CisKKyAgICBmb3IoIGN1cnJNYXRyID0gMDsgY3Vyck1hdHIgPCBudW1NYXRyOyBjdXJyTWF0cisrICkKKyAgICB7CisgICAgICAgIGludCBvcmQxMFsxMF0gPSB7MCwxLDIsMyw1LDYsNywxMCwxMSwxNX07CisgICAgICAgIC8qIEZpbGwgYXRyaXggQSBieSBkYXRhIGZyb20gbWF0cmljZXMgICovCisKKyAgICAgICAgLyogQ29tcHV0ZSBtYXRyaXggdyBmb3IgY3VycmVudCBjYW1lcmEgbWF0cml4ICovCisgICAgICAgIGN2VHJhbnNwb3NlKGNhbWVyYU1hdHJbY3Vyck1hdHJdLCZtYXRyS3QpOworICAgICAgICBjdm1NdWwoY2FtZXJhTWF0cltjdXJyTWF0cl0sJm1hdHJLdCwmbWF0cncpOworCisgICAgICAgIC8qIEZpbGwgbWF0cml4IEEgYW5kIHZlY3RvciBCICovCisKKyAgICAgICAgaW50IGN1cnJXaSxjdXJyV2o7CisgICAgICAgIGludCBjdXJyTWF0cjsKKyAgICAgICAgZm9yKCBjdXJyTWF0ciA9IDA7IGN1cnJNYXRyIDwgbnVtTWF0cjsgY3Vyck1hdHIrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggY3VycldpID0gMDsgY3VycldpIDwgMzsgY3VycldpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggY3VycldqID0gMDsgY3VycldqIDwgMzsgY3VycldqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGksajsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCA0OyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGdldCBlbGVtZW50cyBmcm9tIGN1cnJlbnQgcHJvamVjdGlvbiBtYXRyaXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUVtpKjQral0gPSBjdm1HZXQocHJvak1hdHJbY3Vyck1hdHJdLGN1cnJXaSxqKSAqIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2bUdldChwcm9qTWF0cltjdXJyTWF0cl0sY3VycldqLGkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogd2Uga25vdyAxNiBlbGVtZW50cyBpbiBkYXRhUSBtb3ZlIHRoZW0gdG8gbWF0clEgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgZGF0YVFbMV0gICs9IGRhdGFRWzRdOworICAgICAgICAgICAgICAgICAgICBkYXRhUVsyXSAgKz0gZGF0YVFbOF07CisgICAgICAgICAgICAgICAgICAgIGRhdGFRWzNdICArPSBkYXRhUVsxMl07CisgICAgICAgICAgICAgICAgICAgIGRhdGFRWzZdICArPSBkYXRhUVs5XTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVFbN10gICs9IGRhdGFRWzEzXTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YVFbMTFdICs9IGRhdGFRWzE0XTsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGZpcnN0IDEwIGVsZW1lbnRzIGhhcyBjb2VmZnMgKi8KKworICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IHRvIG1hdHJpeCBBICovCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZtU2V0KG1hdHJBLGN1cnJNYXRyKjkgKyBjdXJyV2kqMytjdXJyV2osaSxkYXRhUVtvcmQxMFtpXV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBGaWxsIHZlY3RvciBCICovCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IDk7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZtU2V0KHZlY3RCLGN1cnJNYXRyKjkraSwwLG1hdHJ3X2RhdFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBNYXRyaXggQSBhbmQgdmVjdG9yIEIgZmlsbGVkIGFuZCB3ZSBjYW4gc29sdmUgc3lzdGVtICovCisKKyAgICAvKiBTb2x2ZSBzeXN0ZW0gKi8KKyAgICBDdk1hdCByZXNROworICAgIGRvdWJsZSByZXNRX2RhdFsxMF07CisgICAgcmVzUSA9IGN2TWF0KDEwLDEsQ1ZfNjRGLHJlc1FfZGF0KTsKKworICAgIGN2U29sdmUobWF0ckEsdmVjdEIsJnJlc1EsQ1ZfU1ZEKTsKKworICAgIC8qIFN5c3RlbSB3YXMgc29sdmVkLiBXZSBrbm93IG1hdHJpeCBRLiBCdXQgd2UgbXVzdCBoYXZlIGNvbmRpdGlvbiBkZXQgUT0wICovCisgICAgLyogSnVzdCBjb3B5IHJlc3VsdCBtYXRyaXggUSAqLworICAgIHsKKyAgICAgICAgaW50IGN1cnIgPSAwOworICAgICAgICBpbnQgb3JkMTZbMTZdID0gezAsMSwyLDMsMSw0LDUsNiwyLDUsNyw4LDMsNiw4LDl9OworCisgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCA0OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2bVNldChtYXRyUSxpLGoscmVzUV9kYXRbb3JkMTZbY3VycisrXV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgCisgICAgX19FTkRfXzsKKworICAgIC8qIEZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGN2UmVsZWFzZU1hdCgmbWF0ckEpOworICAgIGN2UmVsZWFzZU1hdCgmdmVjdEIpOworCisgICAgcmV0dXJuOworfQorI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordm9pZCBpY3ZEZWNvbXBvc2VRKEN2TWF0KiAvKm1hdHJRKi8sQ3ZNYXQqIC8qbWF0ckgqLykKK3sKKyNpZiAwCisgICAgLyogVXNlIFNWRCB0byBkZWNvbXBvc2UgbWF0cml4IFE9SCpJKkgnICovCisgICAgLyogdGVzdCBpbnB1dCBkYXRhICovCisKKyAgICBDdk1hdCBtYXRyVzsKKyAgICBDdk1hdCBtYXRyVTsKKy8vICAgIEN2TWF0IG1hdHJWOworICAgIGRvdWJsZSBtYXRyV19kYXRbMTZdOworICAgIGRvdWJsZSBtYXRyVV9kYXRbMTZdOworLy8gICAgZG91YmxlIG1hdHJWX2RhdFsxNl07CisKKyAgICBtYXRyVyA9IGN2TWF0KDQsNCxDVl82NEYsbWF0cldfZGF0KTsKKyAgICBtYXRyVSA9IGN2TWF0KDQsNCxDVl82NEYsbWF0clVfZGF0KTsKKy8vICAgIG1hdHJWID0gY3ZNYXQoNCw0LENWXzY0RixtYXRyVl9kYXQpOworCisgICAgY3ZTVkQobWF0clEsJm1hdHJXLCZtYXRyVSwwKTsKKworICAgIGRvdWJsZSBlaWdbM107CisgICAgZWlnWzBdID0gZnNxcnQoY3ZtR2V0KCZtYXRyVywwLDApKTsKKyAgICBlaWdbMV0gPSBmc3FydChjdm1HZXQoJm1hdHJXLDEsMSkpOworICAgIGVpZ1syXSA9IGZzcXJ0KGN2bUdldCgmbWF0clcsMiwyKSk7CisKKyAgICBDdk1hdCBtYXRySVM7CisgICAgZG91YmxlIG1hdHJJU19kYXRbMTZdOworICAgIG1hdHJJUyA9IAorCisKKworCisvKiBkZXQgZm9yIG1hdHJpeCBRIHdpdGggcTEtcTEwICovCisvKgorKyBxMSpxNSpxOCpxMTAgCistIHExKnE1KnE5KnE5CistIHExKnE2KnE2KnExMCAKKysgMipxMSpxNipxNypxOSAKKy0gcTEqcTcqcTcqcTggCistIHEyKnEyKnE4KnExMCAKKysgcTIqcTIqcTkqcTkgCisrIDIqcTIqcTYqcTMqcTEwIAorLSAyKnEyKnE2KnE0KnE5IAorLSAyKnEyKnE3KnEzKnE5IAorKyAyKnEyKnE3KnE0KnE4IAorLSBxNSpxMypxMypxMTAgCisrIDIqcTMqcTUqcTQqcTkgCisrIHEzKnEzKnE3KnE3IAorLSAyKnEzKnE3KnE0KnE2IAorLSBxNSpxNCpxNCpxOCAKKysgcTQqcTQqcTYqcTYKKyovCisKKy8vICAoMS1hKV40ID0gMSAgLSAgNCAqIGEgICsgIDYgKiBhICogYSAgLSAgNCAqIGEgKiBhICogYSAgKyAgYSAqIGEgKiBhICogYTsKKworCisjZW5kaWYKK30KKwpkaWZmIC0tZ2l0IGEvY3ZhdXgvc3JjL2N2dmVjZmFjZXRyYWNraW5nLmNwcCBiL2N2YXV4L3NyYy9jdnZlY2ZhY2V0cmFja2luZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlMzUwOQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdnZlY2ZhY2V0cmFja2luZy5jcHAKQEAgLTAsMCArMSw5NzUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICAgIENvbnRvdXItYmFzZWQgZmFjZSBmZWF0dXJlIHRyYWNraW5nCisgICAgICBUaGUgY29kZSB3YXMgY3JlYXRlZCBieSBUYXRpYW5hIENoZXJlcGFub3ZhICh0YXRhQHNsLmlhZS5uc2suc3UpCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorI2luY2x1ZGUgIl9jdnZlY3RyYWNrLmgiCisKKyNkZWZpbmUgX0FTU0VSVCAgICAgYXNzZXJ0CisjZGVmaW5lIE5VTV9GQUNFX0VMRU1FTlRTICAgMworZW51bSAKK3sKKyAgICBNT1VUSCA9IDAsCisgICAgTEVZRSA9IDEsCisgICAgUkVZRSA9IDIsCit9OworCisjZGVmaW5lIE1BWF9MQVlFUlMgICAgICA2NAorCitjb25zdCBkb3VibGUgcGkgPSAzLjE0MTU5MjY1MzU7CisKK3N0cnVjdCBDdkZhY2VUcmFja2VyOworc3RydWN0IEN2VHJhY2tpbmdSZWN0OworY2xhc3MgQ3ZGYWNlRWxlbWVudDsKKwordm9pZCBUaHJlc2hvbGRpbmdQYXJhbShJcGxJbWFnZSAqaW1nR3JheSwgaW50IGlOdW1MYXllcnMsIGludCAmaU1pbkxldmVsLCBpbnQgJmlNYXhMZXZlbCwgZmxvYXQgJnN0ZXAsIGZsb2F0JiBwb3dlciwgaW50IGlIaXN0TWluIC8qPSBISVNUX01JTiovKTsKK2ludCBDaG9pY2VUcmFja2luZ0ZhY2UzKEN2RmFjZVRyYWNrZXIqIHBURiwgY29uc3QgaW50IG5FbGVtZW50cywgY29uc3QgQ3ZGYWNlRWxlbWVudCogYmlnX2ZhY2UsIEN2VHJhY2tpbmdSZWN0KiBmYWNlLCBpbnQmIG5ld19lbmVyZ3kpOworaW50IENob2ljZVRyYWNraW5nRmFjZTIoQ3ZGYWNlVHJhY2tlciogcFRGLCBjb25zdCBpbnQgbkVsZW1lbnRzLCBjb25zdCBDdkZhY2VFbGVtZW50KiBiaWdfZmFjZSwgQ3ZUcmFja2luZ1JlY3QqIGZhY2UsIGludCYgbmV3X2VuZXJneSwgaW50IG5vZWwpOworaW5saW5lIGludCBHZXRFbmVyZ3koQ3ZUcmFja2luZ1JlY3QqKiBwcE5ldywgY29uc3QgQ3ZUcmFja2luZ1JlY3QqIHBQcmV2LCBDdlBvaW50KiBwdFRlbXBsLCBDdlJlY3QqIHJUZW1wbCk7CitpbmxpbmUgaW50IEdldEVuZXJneTIoQ3ZUcmFja2luZ1JlY3QqKiBwcE5ldywgY29uc3QgQ3ZUcmFja2luZ1JlY3QqIHBQcmV2LCBDdlBvaW50KiBwdFRlbXBsLCBDdlJlY3QqIHJUZW1wbCwgaW50KiBlbGVtZW50KTsKK2lubGluZSBkb3VibGUgQ2FsY3VsYXRlVHJhbnNmb3JtYXRpb25MTVMzXzAoIEN2UG9pbnQqIHBUZW1wbFBvaW50cywgQ3ZQb2ludCogcFNyY1BvaW50cyk7CitpbmxpbmUgZG91YmxlIENhbGN1bGF0ZVRyYW5zZm9ybWF0aW9uTE1TMyggQ3ZQb2ludCogcFRlbXBsUG9pbnRzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCogcFNyY1BvaW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiAgICAgICBwZGJBdmVyYWdlU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogICAgICAgcGRiQXZlcmFnZVJvdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiAgICAgICBwZGJBdmVyYWdlU2hpZnRYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqICAgICAgIHBkYkF2ZXJhZ2VTaGlmdFkgKTsKKworc3RydWN0IEN2VHJhY2tpbmdSZWN0Cit7CisgICAgQ3ZSZWN0IHI7CisgICAgQ3ZQb2ludCBwdENlbnRlcjsKKyAgICBpbnQgaUNvbG9yOworICAgIGludCBpRW5lcmd5OworICAgIGludCBuUmVjdHNJblRoaXM7CisgICAgaW50IG5SZWN0c09uTGVmdDsKKyAgICBpbnQgblJlY3RzT25SaWdodDsKKyAgICBpbnQgblJlY3RzT25Ub3A7CisgICAgaW50IG5SZWN0c09uQm90dG9tOworICAgIEN2VHJhY2tpbmdSZWN0KCkgeyBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKEN2VHJhY2tpbmdSZWN0KSk7IH07CisgICAgaW50IEVuZXJneShjb25zdCBDdlRyYWNraW5nUmVjdCYgcHJldikKKyAgICB7CisgICAgICAgIGludCBwcmV2X2NvbG9yID0gMCA9PSBwcmV2LmlDb2xvciA/IGlDb2xvciA6IHByZXYuaUNvbG9yOworICAgICAgICBpRW5lcmd5ID0JMSAqIHBvdzIoci53aWR0aCAtIHByZXYuci53aWR0aCkgKyAKKyAgICAgICAgICAgIDEgKiBwb3cyKHIuaGVpZ2h0IC0gcHJldi5yLmhlaWdodCkgKyAKKyAgICAgICAgICAgIDEgKiBwb3cyKGlDb2xvciAtIHByZXZfY29sb3IpIC8gNCArIAorICAgICAgICAgICAgLSAxICogblJlY3RzSW5UaGlzICsgCisgICAgICAgICAgICAtIDAgKiBuUmVjdHNPblRvcCArIAorICAgICAgICAgICAgKyAwICogblJlY3RzT25MZWZ0ICsgCisgICAgICAgICAgICArIDAgKiBuUmVjdHNPblJpZ2h0ICsgCisgICAgICAgICAgICArIDAgKiBuUmVjdHNPbkJvdHRvbTsKKyAgICAgICAgcmV0dXJuIGlFbmVyZ3k7CisgICAgfQorfTsKKworc3RydWN0IEN2RmFjZVRyYWNrZXIKK3sKKyAgICBDdlRyYWNraW5nUmVjdCBmYWNlW05VTV9GQUNFX0VMRU1FTlRTXTsKKyAgICBpbnQgaVRyYWNraW5nRmFjZVR5cGU7CisgICAgZG91YmxlIGRiUm90YXRlRGVsdGE7CisgICAgZG91YmxlIGRiUm90YXRlQW5nbGU7CisgICAgQ3ZQb2ludCBwdFJvdGF0ZTsKKyAgICAKKyAgICBDdlBvaW50IHB0VGVtcGxbTlVNX0ZBQ0VfRUxFTUVOVFNdOworICAgIEN2UmVjdCByVGVtcGxbTlVNX0ZBQ0VfRUxFTUVOVFNdOworICAgIAorICAgIElwbEltYWdlKiBpbWdHcmF5OworICAgIElwbEltYWdlKiBpbWdUaHJlc2g7CisgICAgQ3ZNZW1TdG9yYWdlKiBtc3RnQ29udG91cnM7CisgICAgQ3ZGYWNlVHJhY2tlcigpCisgICAgeworICAgICAgICBwdFJvdGF0ZS54ID0gMDsKKyAgICAgICAgcHRSb3RhdGUueSA9IDA7CisgICAgICAgIGRiUm90YXRlRGVsdGEgPSAwOworICAgICAgICBkYlJvdGF0ZUFuZ2xlID0gMDsKKyAgICAgICAgaVRyYWNraW5nRmFjZVR5cGUgPSAtMTsKKyAgICAgICAgaW1nVGhyZXNoID0gTlVMTDsKKyAgICAgICAgaW1nR3JheSA9IE5VTEw7CisgICAgICAgIG1zdGdDb250b3VycyA9IE5VTEw7CisgICAgfTsKKyAgICB+Q3ZGYWNlVHJhY2tlcigpCisgICAgeworICAgICAgICBpZiAoTlVMTCAhPSBpbWdHcmF5KQorICAgICAgICAgICAgZGVsZXRlIGltZ0dyYXk7CisgICAgICAgIGlmIChOVUxMICE9IGltZ1RocmVzaCkKKyAgICAgICAgICAgIGRlbGV0ZSBpbWdUaHJlc2g7CisgICAgICAgIGlmIChOVUxMICE9IG1zdGdDb250b3VycykKKyAgICAgICAgICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoJm1zdGdDb250b3Vycyk7CisgICAgfTsKKyAgICBpbnQgSW5pdChDdlJlY3QqIHBSZWN0cywgSXBsSW1hZ2UqIGltZ0dyYXkpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGZhY2VbaV0uciA9IHBSZWN0c1tpXTsKKyAgICAgICAgICAgIGZhY2VbaV0ucHRDZW50ZXIgPSBDZW50ZXIoZmFjZVtpXS5yKTsKKyAgICAgICAgICAgIHB0VGVtcGxbaV0gPSBmYWNlW2ldLnB0Q2VudGVyOworICAgICAgICAgICAgclRlbXBsW2ldID0gZmFjZVtpXS5yOworICAgICAgICB9CisgICAgICAgIGltZ0dyYXkgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZShpbWdHcmF5LT53aWR0aCwgaW1nR3JheS0+aGVpZ2h0KSwgOCwgMSk7CisgICAgICAgIGltZ1RocmVzaCA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKGltZ0dyYXktPndpZHRoLCBpbWdHcmF5LT5oZWlnaHQpLCA4LCAxKTsKKyAgICAgICAgbXN0Z0NvbnRvdXJzID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCk7CisgICAgICAgIGlmICgoTlVMTCA9PSBpbWdHcmF5KSB8fCAKKyAgICAgICAgICAgIChOVUxMID09IGltZ1RocmVzaCkgfHwgCisgICAgICAgICAgICAoTlVMTCA9PSBtc3RnQ29udG91cnMpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9OworICAgIGludCBJbml0TmV4dEltYWdlKElwbEltYWdlKiBpbWcpCisgICAgeworICAgICAgICBDdlNpemUgc3ogPSB7aW1nLT53aWR0aCwgaW1nLT5oZWlnaHR9OworICAgICAgICBSZWFsbG9jSW1hZ2UoJmltZ0dyYXksIHN6LCAxKTsKKyAgICAgICAgUmVhbGxvY0ltYWdlKCZpbWdUaHJlc2gsIHN6LCAxKTsKKyAgICAgICAgcHRSb3RhdGUgPSBmYWNlW01PVVRIXS5wdENlbnRlcjsKKyAgICAgICAgZmxvYXQgbVs2XTsKKyAgICAgICAgQ3ZNYXQgbWF0ID0gY3ZNYXQoIDIsIDMsIENWXzMyRkMxLCBtICk7IAorCisgICAgICAgIGlmIChOVUxMID09IGltZ0dyYXkgfHwgTlVMTCA9PSBpbWdUaHJlc2gpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIAorICAgICAgICAvKm1bMF0gPSAoZmxvYXQpY29zKC1kYlJvdGF0ZUFuZ2xlKkNWX1BJLzE4MC4pOworICAgICAgICBtWzFdID0gKGZsb2F0KXNpbigtZGJSb3RhdGVBbmdsZSpDVl9QSS8xODAuKTsKKyAgICAgICAgbVsyXSA9IChmbG9hdClwdFJvdGF0ZS54OworICAgICAgICBtWzNdID0gLW1bMV07CisgICAgICAgIG1bNF0gPSBtWzBdOworICAgICAgICBtWzVdID0gKGZsb2F0KXB0Um90YXRlLnk7Ki8KKyAgICAgICAgY3YyRFJvdGF0aW9uTWF0cml4KCBjdlBvaW50VG8zMmYocHRSb3RhdGUpLCAtZGJSb3RhdGVBbmdsZSwgMS4sICZtYXQgKTsKKyAgICAgICAgY3ZXYXJwQWZmaW5lKCBpbWcsIGltZ0dyYXksICZtYXQgKTsKKyAgICAgICAgCisgICAgICAgIGlmIChOVUxMID09IG1zdGdDb250b3VycykKKyAgICAgICAgICAgIG1zdGdDb250b3VycyA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBjdkNsZWFyTWVtU3RvcmFnZShtc3RnQ29udG91cnMpOworICAgICAgICBpZiAoTlVMTCA9PSBtc3RnQ29udG91cnMpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KK307CisKK2NsYXNzIEN2RmFjZUVsZW1lbnQKK3sKK3B1YmxpYzoKKyAgICBDdlNlcSogbV9zZXFSZWN0czsKKyAgICBDdk1lbVN0b3JhZ2UqIG1fbXN0Z1JlY3RzOworICAgIEN2UmVjdCBtX3JST0k7CisgICAgQ3ZUcmFja2luZ1JlY3QgbV90clByZXY7CisgICAgaW5saW5lIEN2RmFjZUVsZW1lbnQoKQorICAgIHsKKyAgICAgICAgbV9zZXFSZWN0cyA9IE5VTEw7CisgICAgICAgIG1fbXN0Z1JlY3RzID0gTlVMTDsKKyAgICAgICAgbV9yUk9JLnggPSAwOworICAgICAgICBtX3JST0kueSA9IDA7CisgICAgICAgIG1fclJPSS53aWR0aCA9IDA7CisgICAgICAgIG1fclJPSS5oZWlnaHQgPSAwOworICAgIH07CisgICAgaW5saW5lIGludCBJbml0KGNvbnN0IEN2UmVjdCYgcm9pLCBjb25zdCBDdlRyYWNraW5nUmVjdCYgcHJldiwgQ3ZNZW1TdG9yYWdlKiBtc3RnID0gTlVMTCkKKyAgICB7CisgICAgICAgIG1fclJPSSA9IHJvaTsKKyAgICAgICAgbV90clByZXYgPSBwcmV2OworICAgICAgICBpZiAoTlVMTCAhPSBtc3RnKQorICAgICAgICAgICAgbV9tc3RnUmVjdHMgPSBtc3RnOworICAgICAgICBpZiAoTlVMTCA9PSBtX21zdGdSZWN0cykKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKE5VTEwgPT0gbV9zZXFSZWN0cykKKyAgICAgICAgICAgIG1fc2VxUmVjdHMgPSBjdkNyZWF0ZVNlcSgwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZUcmFja2luZ1JlY3QpLCBtX21zdGdSZWN0cyk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2Q2xlYXJTZXEobV9zZXFSZWN0cyk7CisgICAgICAgIGlmIChOVUxMID09IG1fc2VxUmVjdHMpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH07CisgICAgdm9pZCBGaW5kUmVjdHMoSXBsSW1hZ2UqIGltZywgSXBsSW1hZ2UqIHRocmVzaCwgaW50IG5MYXllcnMsIGludCBkTWluU2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBGaW5kQ29udG91cnMoSXBsSW1hZ2UqIGltZywgSXBsSW1hZ2UqIHRocmVzaCwgaW50IG5MYXllcnMsIGludCBkTWluU2l6ZSk7CisgICAgdm9pZCBNZXJnZVJlY3RzKGludCBkKTsKKyAgICB2b2lkIEVuZXJneSgpOworfTsgLy9jbGFzcyBDdkZhY2VFbGVtZW50CisKK2ludCBDVl9DREVDTCBDb21wYXJlRW5lcmd5KGNvbnN0IHZvaWQqIGVsMSwgY29uc3Qgdm9pZCogZWwyLCB2b2lkKikKK3sKKyAgICByZXR1cm4gKChDdlRyYWNraW5nUmVjdCopZWwxKS0+aUVuZXJneSAtICgoQ3ZUcmFja2luZ1JlY3QqKWVsMiktPmlFbmVyZ3k7Cit9Ly8gaW50IENWX0NERUNMIENvbXBhcmVFbmVyZ3koY29uc3Qgdm9pZCogZWwxLCBjb25zdCB2b2lkKiBlbDIsIHZvaWQqKQorCit2b2lkIEN2RmFjZUVsZW1lbnQ6OkZpbmRSZWN0cyhJcGxJbWFnZSogaW1nLCBJcGxJbWFnZSogdGhyZXNoLCBpbnQgbkxheWVycywgaW50IGRNaW5TaXplKQoreworICAgIEZpbmRDb250b3VycyhpbWcsIHRocmVzaCwgbkxheWVycywgZE1pblNpemUgLyA0KTsKKyAgICBpZiAoMCA9PSBtX3NlcVJlY3RzLT50b3RhbCkKKyAgICAgICAgcmV0dXJuOworICAgIEVuZXJneSgpOworICAgIGN2U2VxU29ydChtX3NlcVJlY3RzLCBDb21wYXJlRW5lcmd5LCBOVUxMKTsKKyAgICBDdlRyYWNraW5nUmVjdCogcFIgPSAoQ3ZUcmFja2luZ1JlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCAwKTsKKyAgICBpZiAobV9zZXFSZWN0cy0+dG90YWwgPCAzMikKKyAgICB7CisgICAgICAgIE1lcmdlUmVjdHMoZE1pblNpemUgLyA4KTsKKyAgICAgICAgRW5lcmd5KCk7CisgICAgICAgIGN2U2VxU29ydChtX3NlcVJlY3RzLCBDb21wYXJlRW5lcmd5LCBOVUxMKTsKKyAgICB9CisgICAgcFIgPSAoQ3ZUcmFja2luZ1JlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCAwKTsKKyAgICBpZiAoKHBSLT5pRW5lcmd5ID4gMTAwICYmIG1fc2VxUmVjdHMtPnRvdGFsIDwgMzIpIHx8IChtX3NlcVJlY3RzLT50b3RhbCA8IDE2KSkKKyAgICB7CisgICAgICAgIE1lcmdlUmVjdHMoZE1pblNpemUgLyA0KTsKKyAgICAgICAgRW5lcmd5KCk7CisgICAgICAgIGN2U2VxU29ydChtX3NlcVJlY3RzLCBDb21wYXJlRW5lcmd5LCBOVUxMKTsKKyAgICB9CisgICAgcFIgPSAoQ3ZUcmFja2luZ1JlY3QqKWN2R2V0U2VxRWxlbShtX3NlcVJlY3RzLCAwKTsKKyAgICBpZiAoKHBSLT5pRW5lcmd5ID4gMTAwICYmIG1fc2VxUmVjdHMtPnRvdGFsIDwgMTYpIHx8IChwUi0+aUVuZXJneSA+IDIwMCAmJiBtX3NlcVJlY3RzLT50b3RhbCA8IDMyKSkKKyAgICB7CisgICAgICAgIE1lcmdlUmVjdHMoZE1pblNpemUgLyAyKTsKKyAgICAgICAgRW5lcmd5KCk7CisgICAgICAgIGN2U2VxU29ydChtX3NlcVJlY3RzLCBDb21wYXJlRW5lcmd5LCBOVUxMKTsKKyAgICB9CisKK30vLyB2b2lkIEN2RmFjZUVsZW1lbnQ6OkZpbmRSZWN0cyhJcGxJbWFnZSogaW1nLCBJcGxJbWFnZSogdGhyZXNoLCBpbnQgbkxheWVycywgaW50IGRNaW5TaXplKQorCit2b2lkIEN2RmFjZUVsZW1lbnQ6OkZpbmRDb250b3VycyhJcGxJbWFnZSogaW1nLCBJcGxJbWFnZSogdGhyZXNoLCBpbnQgbkxheWVycywgaW50IGRNaW5TaXplKQoreworICAgIEN2U2VxKiBzZXE7CisgICAgQ3ZSZWN0IHJvaSA9IG1fclJPSTsKKyAgICBFeHRlbmQocm9pLCAxKTsKKyAgICBjdlNldEltYWdlUk9JKGltZywgcm9pKTsKKyAgICBjdlNldEltYWdlUk9JKHRocmVzaCwgcm9pKTsKKyAgICAvLyBsYXllcnMKKyAgICBpbnQgY29sb3JzW01BWF9MQVlFUlNdID0gezB9OworICAgIGludCBpTWluTGV2ZWwgPSAwLCBpTWF4TGV2ZWwgPSAyNTU7CisgICAgZmxvYXQgc3RlcCwgcG93ZXI7CisgICAgVGhyZXNob2xkaW5nUGFyYW0oaW1nLCBuTGF5ZXJzIC8gMiwgaU1pbkxldmVsLCBpTWF4TGV2ZWwsIHN0ZXAsIHBvd2VyLCA0KTsKKyAgICBpbnQgaU1pbkxldmVsUHJldiA9IGlNaW5MZXZlbDsKKyAgICBpbnQgaU1heExldmVsUHJldiA9IGlNaW5MZXZlbDsKKyAgICBpZiAobV90clByZXYuaUNvbG9yICE9IDApCisgICAgeworICAgICAgICBpTWluTGV2ZWxQcmV2ID0gbV90clByZXYuaUNvbG9yIC0gbkxheWVycyAvIDI7CisgICAgICAgIGlNYXhMZXZlbFByZXYgPSBtX3RyUHJldi5pQ29sb3IgKyBuTGF5ZXJzIC8gMjsKKyAgICB9CisgICAgaWYgKGlNaW5MZXZlbFByZXYgPCBpTWluTGV2ZWwpCisgICAgeworICAgICAgICBpTWF4TGV2ZWxQcmV2ICs9IGlNaW5MZXZlbCAtIGlNaW5MZXZlbFByZXY7CisgICAgICAgIGlNaW5MZXZlbFByZXYgPSBpTWluTGV2ZWw7CisgICAgfQorICAgIGlmIChpTWF4TGV2ZWxQcmV2ID4gaU1heExldmVsKQorICAgIHsKKyAgICAgICAgaU1pbkxldmVsUHJldiAtPSBpTWF4TGV2ZWxQcmV2IC0gaU1heExldmVsOworICAgICAgICBpZiAoaU1pbkxldmVsUHJldiA8IGlNaW5MZXZlbCkKKyAgICAgICAgICAgIGlNaW5MZXZlbFByZXYgPSBpTWluTGV2ZWw7CisgICAgICAgIGlNYXhMZXZlbFByZXYgPSBpTWF4TGV2ZWw7CisgICAgfQorICAgIGludCBuID0gbkxheWVyczsKKyAgICBuIC09IChpTWF4TGV2ZWxQcmV2IC0gaU1pbkxldmVsUHJldiArIDEpIC8gMjsKKyAgICBzdGVwID0gZmxvYXQoaU1pbkxldmVsUHJldiAtIGlNaW5MZXZlbCArIGlNYXhMZXZlbCAtIGlNYXhMZXZlbFByZXYpIC8gZmxvYXQobik7CisgICAgaW50IGogPSAwOworICAgIGZsb2F0IGxldmVsOworICAgIGZvciAobGV2ZWwgPSAoZmxvYXQpaU1pbkxldmVsOyBsZXZlbCA8IGlNaW5MZXZlbFByZXYgJiYgaiA8IG5MYXllcnM7IGxldmVsICs9IHN0ZXAsIGorKykKKyAgICAgICAgY29sb3JzW2pdID0gaW50KGxldmVsICsgMC41KTsKKyAgICBmb3IgKGxldmVsID0gKGZsb2F0KWlNaW5MZXZlbFByZXY7IGxldmVsIDwgaU1heExldmVsUHJldiAmJiBqIDwgbkxheWVyczsgbGV2ZWwgKz0gMi4wLCBqKyspCisgICAgICAgIGNvbG9yc1tqXSA9IGludChsZXZlbCArIDAuNSk7CisgICAgZm9yIChsZXZlbCA9IChmbG9hdClpTWF4TGV2ZWxQcmV2OyBsZXZlbCA8IGlNYXhMZXZlbCAmJiBqIDwgbkxheWVyczsgbGV2ZWwgKz0gc3RlcCwgaisrKQorICAgICAgICBjb2xvcnNbal0gPSBpbnQobGV2ZWwgKyAwLjUpOworICAgIC8vCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTGF5ZXJzOyBpKyspCisgICAgeworICAgICAgICBjdlRocmVzaG9sZChpbWcsIHRocmVzaCwgY29sb3JzW2ldLCAyNTUuMCwgQ1ZfVEhSRVNIX0JJTkFSWSk7CisgICAgICAgIGlmIChjdkZpbmRDb250b3Vycyh0aHJlc2gsIG1fbXN0Z1JlY3RzLCAmc2VxLCBzaXplb2YoQ3ZDb250b3VyKSwgQ1ZfUkVUUl9DQ09NUCwgQ1ZfQ0hBSU5fQVBQUk9YX1NJTVBMRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2VHJhY2tpbmdSZWN0IGNyOworICAgICAgICAgICAgZm9yIChDdlNlcSogZXh0ZXJuYWwgPSBzZXE7IGV4dGVybmFsOyBleHRlcm5hbCA9IGV4dGVybmFsLT5oX25leHQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3IuciA9IGN2Q29udG91ckJvdW5kaW5nUmVjdChleHRlcm5hbCk7CisgICAgICAgICAgICAgICAgTW92ZShjci5yLCByb2kueCwgcm9pLnkpOworICAgICAgICAgICAgICAgIGlmIChSZWN0SW5SZWN0KGNyLnIsIG1fclJPSSkgJiYgY3Iuci53aWR0aCA+IGRNaW5TaXplICAmJiBjci5yLmhlaWdodCA+IGRNaW5TaXplKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3IucHRDZW50ZXIgPSBDZW50ZXIoY3Iucik7CisgICAgICAgICAgICAgICAgICAgIGNyLmlDb2xvciA9IGNvbG9yc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKG1fc2VxUmVjdHMsICZjcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoQ3ZTZXEqIGludGVybmFsID0gZXh0ZXJuYWwtPnZfbmV4dDsgaW50ZXJuYWw7IGludGVybmFsID0gaW50ZXJuYWwtPmhfbmV4dCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNyLnIgPSBjdkNvbnRvdXJCb3VuZGluZ1JlY3QoaW50ZXJuYWwpOwkgIAorICAgICAgICAgICAgICAgICAgICBNb3ZlKGNyLnIsIHJvaS54LCByb2kueSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChSZWN0SW5SZWN0KGNyLnIsIG1fclJPSSkgJiYgY3Iuci53aWR0aCA+IGRNaW5TaXplICAmJiBjci5yLmhlaWdodCA+IGRNaW5TaXplKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjci5wdENlbnRlciA9IENlbnRlcihjci5yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyLmlDb2xvciA9IGNvbG9yc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2U2VxUHVzaChtX3NlcVJlY3RzLCAmY3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY3ZDbGVhclNlcShzZXEpOworICAgICAgICB9CisgICAgfQorICAgIGN2UmVzZXRJbWFnZVJPSShpbWcpOworICAgIGN2UmVzZXRJbWFnZVJPSSh0aHJlc2gpOworfS8vdm9pZCBDdkZhY2VFbGVtZW50OjpGaW5kQ29udG91cnMoSXBsSW1hZ2UqIGltZywgSXBsSW1hZ2UqIHRocmVzaCwgaW50IG5MYXllcnMpCisKK3ZvaWQgQ3ZGYWNlRWxlbWVudDo6TWVyZ2VSZWN0cyhpbnQgZCkKK3sKKyAgICBpbnQgblJlY3RzID0gbV9zZXFSZWN0cy0+dG90YWw7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyLCByZWFkZXIyOworICAgIGN2U3RhcnRSZWFkU2VxKCBtX3NlcVJlY3RzLCAmcmVhZGVyICk7CisgICAgaW50IGksIGo7CisgICAgZm9yIChpID0gMDsgaSA8IG5SZWN0czsgaSsrKQorICAgIHsKKyAgICAgICAgQ3ZUcmFja2luZ1JlY3QqIHBSZWN0MSA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlci5wdHIpOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggbV9zZXFSZWN0cywgJnJlYWRlcjIgKTsKKyAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoJnJlYWRlcjIsIGkgKyAxKTsKKyAgICAgICAgZm9yIChqID0gaSArIDE7IGogPCBuUmVjdHM7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZUcmFja2luZ1JlY3QqIHBSZWN0MiA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlcjIucHRyKTsKKyAgICAgICAgICAgIGlmIChhYnMocFJlY3QxLT5wdENlbnRlci55IC0gcFJlY3QyLT5wdENlbnRlci55KSA8IGQgJiYgCisgICAgICAgICAgICAgICAgYWJzKHBSZWN0MS0+ci5oZWlnaHQgLSBwUmVjdDItPnIuaGVpZ2h0KSA8IGQpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZUcmFja2luZ1JlY3Qgck5ldzsKKyAgICAgICAgICAgICAgICByTmV3LmlDb2xvciA9IChwUmVjdDEtPmlDb2xvciArIHBSZWN0Mi0+aUNvbG9yICsgMSkgLyAyOworICAgICAgICAgICAgICAgIHJOZXcuci54ID0gbWluKHBSZWN0MS0+ci54LCBwUmVjdDItPnIueCk7CisgICAgICAgICAgICAgICAgck5ldy5yLnkgPSBtaW4ocFJlY3QxLT5yLnksIHBSZWN0Mi0+ci55KTsKKyAgICAgICAgICAgICAgICByTmV3LnIud2lkdGggPSBtYXgocFJlY3QxLT5yLnggKyBwUmVjdDEtPnIud2lkdGgsIHBSZWN0Mi0+ci54ICsgcFJlY3QyLT5yLndpZHRoKSAtIHJOZXcuci54OworICAgICAgICAgICAgICAgIHJOZXcuci5oZWlnaHQgPSBtaW4ocFJlY3QxLT5yLnkgKyBwUmVjdDEtPnIuaGVpZ2h0LCBwUmVjdDItPnIueSArIHBSZWN0Mi0+ci5oZWlnaHQpIC0gck5ldy5yLnk7CisgICAgICAgICAgICAgICAgaWYgKHJOZXcuciAhPSBwUmVjdDEtPnIgJiYgck5ldy5yICE9IHBSZWN0Mi0+cikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJOZXcucHRDZW50ZXIgPSBDZW50ZXIock5ldy5yKTsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXFQdXNoKG1fc2VxUmVjdHMsICZyTmV3KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoQ3ZUcmFja2luZ1JlY3QpLCByZWFkZXIyICk7CisgICAgICAgIH0KKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKEN2VHJhY2tpbmdSZWN0KSwgcmVhZGVyICk7CisgICAgfQorICAgIC8vIGRlbGV0ZSBlcXVhbCByZWN0cworICAgIGZvciAoaSA9IDA7IGkgPCBtX3NlcVJlY3RzLT50b3RhbDsgaSsrKQorICAgIHsKKyAgICAgICAgQ3ZUcmFja2luZ1JlY3QqIHBSZWN0MSA9IChDdlRyYWNraW5nUmVjdCopY3ZHZXRTZXFFbGVtKG1fc2VxUmVjdHMsIGkpOworICAgICAgICBpbnQgal9iZWdpbiA9IGkgKyAxOworICAgICAgICBmb3IgKGogPSBqX2JlZ2luOyBqIDwgbV9zZXFSZWN0cy0+dG90YWw7KQorICAgICAgICB7CisgICAgICAgICAgICBDdlRyYWNraW5nUmVjdCogcFJlY3QyID0gKEN2VHJhY2tpbmdSZWN0KiljdkdldFNlcUVsZW0obV9zZXFSZWN0cywgaik7CisgICAgICAgICAgICBpZiAocFJlY3QxLT5yID09IHBSZWN0Mi0+cikKKyAgICAgICAgICAgICAgICBjdlNlcVJlbW92ZShtX3NlcVJlY3RzLCBqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBqKys7CisgICAgICAgIH0KKyAgICB9CisKK30vL3ZvaWQgQ3ZGYWNlRWxlbWVudDo6TWVyZ2VSZWN0cyhpbnQgZCkKKwordm9pZCBDdkZhY2VFbGVtZW50OjpFbmVyZ3koKQoreworICAgIEN2U2VxUmVhZGVyIHJlYWRlciwgcmVhZGVyMjsKKyAgICBjdlN0YXJ0UmVhZFNlcSggbV9zZXFSZWN0cywgJnJlYWRlciApOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9zZXFSZWN0cy0+dG90YWw7IGkrKykKKyAgICB7CisgICAgICAgIEN2VHJhY2tpbmdSZWN0KiBwUmVjdCA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlci5wdHIpOworICAgICAgICAvLyBvdXRzaWRlIGFuZCBpbnNpZGUgcmVjdHMKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIG1fc2VxUmVjdHMsICZyZWFkZXIyICk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbV9zZXFSZWN0cy0+dG90YWw7IGorKykKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZUcmFja2luZ1JlY3QqIHBSZWN0MiA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlcjIucHRyKTsKKyAgICAgICAgICAgIGlmIChpICE9IGopCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKFJlY3RJblJlY3QocFJlY3QyLT5yLCBwUmVjdC0+cikpCisgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5uUmVjdHNJblRoaXMgKys7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocFJlY3QyLT5yLnkgKyBwUmVjdDItPnIuaGVpZ2h0IDw9IHBSZWN0LT5yLnkpCisgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5uUmVjdHNPblRvcCArKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwUmVjdDItPnIueSA+PSBwUmVjdC0+ci55ICsgcFJlY3QtPnIuaGVpZ2h0KQorICAgICAgICAgICAgICAgICAgICBwUmVjdC0+blJlY3RzT25Cb3R0b20gKys7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocFJlY3QyLT5yLnggKyBwUmVjdDItPnIud2lkdGggPD0gcFJlY3QtPnIueCkKKyAgICAgICAgICAgICAgICAgICAgcFJlY3QtPm5SZWN0c09uTGVmdCArKzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwUmVjdDItPnIueCA+PSBwUmVjdC0+ci54ICsgcFJlY3QtPnIud2lkdGgpCisgICAgICAgICAgICAgICAgICAgIHBSZWN0LT5uUmVjdHNPblJpZ2h0ICsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKEN2VHJhY2tpbmdSZWN0KSwgcmVhZGVyMiApOworICAgICAgICB9CisgICAgICAgIC8vIGVuZXJneQorICAgICAgICBwUmVjdC0+RW5lcmd5KG1fdHJQcmV2KTsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKEN2VHJhY2tpbmdSZWN0KSwgcmVhZGVyICk7CisgICAgfQorfS8vdm9pZCBDdkZhY2VFbGVtZW50OjpFbmVyZ3koKQorCitDVl9JTVBMIEN2RmFjZVRyYWNrZXIqCitjdkluaXRGYWNlVHJhY2tlcihDdkZhY2VUcmFja2VyKiBwRmFjZVRyYWNrZXIsIGNvbnN0IElwbEltYWdlKiBpbWdHcmF5LCBDdlJlY3QqIHBSZWN0cywgaW50IG5SZWN0cykKK3sKKyAgICBfQVNTRVJUKE5VTEwgIT0gaW1nR3JheSk7CisgICAgX0FTU0VSVChOVUxMICE9IHBSZWN0cyk7CisgICAgX0FTU0VSVChuUmVjdHMgPj0gTlVNX0ZBQ0VfRUxFTUVOVFMpOworICAgIGlmICgoTlVMTCA9PSBpbWdHcmF5KSB8fAorICAgICAgICAoTlVMTCA9PSBwUmVjdHMpIHx8CisgICAgICAgIChuUmVjdHMgPCBOVU1fRkFDRV9FTEVNRU5UUykpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIAorICAgIGludCBuZXdfZmFjZSA9IEZBTFNFOworICAgIEN2RmFjZVRyYWNrZXIqIHBGYWNlID0gcEZhY2VUcmFja2VyOworICAgIGlmIChOVUxMID09IHBGYWNlKQorICAgIHsKKyAgICAgICAgcEZhY2UgPSBuZXcgQ3ZGYWNlVHJhY2tlcjsKKyAgICAgICAgaWYgKE5VTEwgPT0gcEZhY2UpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgbmV3X2ZhY2UgPSBUUlVFOworICAgIH0KKyAgICBwRmFjZS0+SW5pdChwUmVjdHMsIChJcGxJbWFnZSopaW1nR3JheSk7CisgICAgcmV0dXJuIHBGYWNlOworfS8vQ3ZGYWNlVHJhY2tlciogSW5pdEZhY2VUcmFja2VyKElwbEltYWdlKiBpbWdHcmF5LCBDdlJlY3QqIHBSZWN0cywgaW50IG5SZWN0cykKKworQ1ZfSU1QTCB2b2lkCitjdlJlbGVhc2VGYWNlVHJhY2tlcihDdkZhY2VUcmFja2VyKiogcHBGYWNlVHJhY2tlcikKK3sKKyAgICBpZiAoTlVMTCA9PSAqcHBGYWNlVHJhY2tlcikKKyAgICAgICAgcmV0dXJuOworICAgIGRlbGV0ZSAqcHBGYWNlVHJhY2tlcjsKKyAgICAqcHBGYWNlVHJhY2tlciA9IE5VTEw7Cit9Ly92b2lkIFJlbGVhc2VGYWNlVHJhY2tlcihDdkZhY2VUcmFja2VyKiogcHBGYWNlVHJhY2tlcikKKworCitDVl9JTVBMIGludAorY3ZUcmFja0ZhY2UoQ3ZGYWNlVHJhY2tlciogcEZhY2VUcmFja2VyLCBJcGxJbWFnZSogaW1nR3JheSwgQ3ZSZWN0KiBwUmVjdHMsIGludCBuUmVjdHMsIEN2UG9pbnQqIHB0Um90YXRlLCBkb3VibGUqIGRiQW5nbGVSb3RhdGUpCit7CisgICAgX0FTU0VSVChOVUxMICE9IHBGYWNlVHJhY2tlcik7CisgICAgX0FTU0VSVChOVUxMICE9IGltZ0dyYXkpOworICAgIF9BU1NFUlQoTlVMTCAhPSBwUmVjdHMgJiYgblJlY3RzID49IE5VTV9GQUNFX0VMRU1FTlRTKTsKKyAgICBpZiAoKE5VTEwgPT0gcEZhY2VUcmFja2VyKSB8fAorICAgICAgICAoTlVMTCA9PSBpbWdHcmF5KSkKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIHBGYWNlVHJhY2tlci0+SW5pdE5leHRJbWFnZShpbWdHcmF5KTsKKyAgICAqcHRSb3RhdGUgPSBwRmFjZVRyYWNrZXItPnB0Um90YXRlOworICAgICpkYkFuZ2xlUm90YXRlID0gcEZhY2VUcmFja2VyLT5kYlJvdGF0ZUFuZ2xlOworICAgIAorICAgIGludCBuRWxlbWVudHMgPSAxNjsKKyAgICBkb3VibGUgZHggPSBwRmFjZVRyYWNrZXItPmZhY2VbTEVZRV0ucHRDZW50ZXIueCAtIHBGYWNlVHJhY2tlci0+ZmFjZVtSRVlFXS5wdENlbnRlci54OworICAgIGRvdWJsZSBkeSA9IHBGYWNlVHJhY2tlci0+ZmFjZVtMRVlFXS5wdENlbnRlci55IC0gcEZhY2VUcmFja2VyLT5mYWNlW1JFWUVdLnB0Q2VudGVyLnk7CisgICAgZG91YmxlIGRfZXllcyA9IHNxcnQoZHgqZHggKyBkeSpkeSk7CisgICAgaW50IGQgPSBjdlJvdW5kKDAuMjUgKiBkX2V5ZXMpOworICAgIGludCBkTWluU2l6ZSA9IGQ7CisgICAgaW50IG5SZXN0YXJ0cyA9IDA7CisgICAgCisgICAgaW50IGVsZW07CisgICAgCisgICAgQ3ZGYWNlRWxlbWVudCBiaWdfZmFjZVtOVU1fRkFDRV9FTEVNRU5UU107CitTVEFSVDoKKyAgICAvLyBpbml0CisgICAgZm9yIChlbGVtID0gMDsgZWxlbSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBlbGVtKyspCisgICAgeworICAgICAgICBDdlJlY3QgciA9IHBGYWNlVHJhY2tlci0+ZmFjZVtlbGVtXS5yOworICAgICAgICBFeHRlbmQociwgZCk7CisgICAgICAgIGlmIChyLndpZHRoIDwgNCpkKQorICAgICAgICB7CisgICAgICAgICAgICByLnggLT0gKDQqZCAtIHIud2lkdGgpIC8gMjsKKyAgICAgICAgICAgIHIud2lkdGggKz0gNCpkIC0gci53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoci5oZWlnaHQgPCAzKmQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHIueSAtPSAoMypkIC0gci5oZWlnaHQpIC8gMjsKKyAgICAgICAgICAgIHIuaGVpZ2h0ICs9IDMqZCAtIHIuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIGlmIChyLnggPCAxKQorICAgICAgICAgICAgci54ID0gMTsKKyAgICAgICAgaWYgKHIueSA8IDEpCisgICAgICAgICAgICByLnkgPSAxOworICAgICAgICBpZiAoci54ICsgci53aWR0aCA+IHBGYWNlVHJhY2tlci0+aW1nR3JheS0+d2lkdGggLSAyKQorICAgICAgICAgICAgci53aWR0aCA9IHBGYWNlVHJhY2tlci0+aW1nR3JheS0+d2lkdGggLSAyIC0gci54OworICAgICAgICBpZiAoci55ICsgci5oZWlnaHQgPiBwRmFjZVRyYWNrZXItPmltZ0dyYXktPmhlaWdodCAtIDIpCisgICAgICAgICAgICByLmhlaWdodCA9IHBGYWNlVHJhY2tlci0+aW1nR3JheS0+aGVpZ2h0IC0gMiAtIHIueTsKKyAgICAgICAgaWYgKCFiaWdfZmFjZVtlbGVtXS5Jbml0KHIsIHBGYWNlVHJhY2tlci0+ZmFjZVtlbGVtXSwgcEZhY2VUcmFja2VyLT5tc3RnQ29udG91cnMpKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAvLyBmaW5kIGNvbnRvdXJzCisgICAgZm9yIChlbGVtID0gMDsgZWxlbSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBlbGVtKyspCisgICAgICAgIGJpZ19mYWNlW2VsZW1dLkZpbmRSZWN0cyhwRmFjZVRyYWNrZXItPmltZ0dyYXksIHBGYWNlVHJhY2tlci0+aW1nVGhyZXNoLCAzMiwgZE1pblNpemUpOworICAgIC8vIGNhbmRpZGF0cworICAgIEN2VHJhY2tpbmdSZWN0IG5ld19mYWNlW05VTV9GQUNFX0VMRU1FTlRTXTsKKyAgICBpbnQgbmV3X2VuZXJneSA9IDA7CisgICAgaW50IGZvdW5kID0gQ2hvaWNlVHJhY2tpbmdGYWNlMyhwRmFjZVRyYWNrZXIsIG5FbGVtZW50cywgYmlnX2ZhY2UsIG5ld19mYWNlLCBuZXdfZW5lcmd5KTsKKyAgICBpbnQgcmVzdGFydCA9IEZBTFNFOworICAgIGludCBmaW5kMiA9IEZBTFNFOworICAgIGludCBub2VsID0gLTE7CisgICAgaWYgKGZvdW5kKQorICAgIHsKKyAgICAgICAgaWYgKG5ld19lbmVyZ3kgPiAxMDAwMDAgJiYgLTEgIT0gcEZhY2VUcmFja2VyLT5pVHJhY2tpbmdGYWNlVHlwZSkKKyAgICAgICAgICAgIGZpbmQyID0gVFJVRTsKKyAgICAgICAgZWxzZSBpZiAobmV3X2VuZXJneSA+IDE1MDAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGVsZW1lbnRzID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGVsID0gMDsgZWwgPCBOVU1fRkFDRV9FTEVNRU5UUzsgZWwrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoYmlnX2ZhY2VbZWxdLm1fc2VxUmVjdHMtPnRvdGFsID4gMTYgfHwgKGJpZ19mYWNlW2VsXS5tX3NlcVJlY3RzLT50b3RhbCA+IDggJiYgbmV3X2ZhY2VbZWxdLmlFbmVyZ3kgPCAxMDApKQorICAgICAgICAgICAgICAgICAgICBlbGVtZW50cysrOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9lbCA9IGVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKDIgPT0gZWxlbWVudHMpCisgICAgICAgICAgICAgICAgZmluZDIgPSBUUlVFOworICAgICAgICAgICAgZWxzZSAKKyAgICAgICAgICAgICAgICByZXN0YXJ0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAoLTEgIT0gcEZhY2VUcmFja2VyLT5pVHJhY2tpbmdGYWNlVHlwZSkKKyAgICAgICAgICAgIGZpbmQyID0gVFJVRTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdGFydCA9IFRSVUU7CisgICAgfQorUkVTVEFSVDoKKyAgICBpZiAocmVzdGFydCkKKyAgICB7CisgICAgICAgIGlmIChuUmVzdGFydHMrKyA8IDIpCisgICAgICAgIHsKKyAgICAgICAgICAgIGQgPSBkICsgZC80OworICAgICAgICAgICAgZ290byBTVEFSVDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChmaW5kMikKKyAgICB7CisgICAgICAgIGlmICgtMSAhPSBwRmFjZVRyYWNrZXItPmlUcmFja2luZ0ZhY2VUeXBlKQorICAgICAgICAgICAgbm9lbCA9IHBGYWNlVHJhY2tlci0+aVRyYWNraW5nRmFjZVR5cGU7CisgICAgICAgIGludCBmb3VuZDIgPSBDaG9pY2VUcmFja2luZ0ZhY2UyKHBGYWNlVHJhY2tlciwgbkVsZW1lbnRzLCBiaWdfZmFjZSwgbmV3X2ZhY2UsIG5ld19lbmVyZ3ksIG5vZWwpOworICAgICAgICBpZiAoZm91bmQyICYmIG5ld19lbmVyZ3kgPCAxMDAwMDApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBGYWNlVHJhY2tlci0+aVRyYWNraW5nRmFjZVR5cGUgPSBub2VsOworICAgICAgICAgICAgZm91bmQgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UgCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3RhcnQgPSBUUlVFOworICAgICAgICAgICAgZ290byBSRVNUQVJUOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmIChmb3VuZCkKKyAgICB7CisgICAgICAgIC8vIGFuZ2xlIGJ5IG1vdXRoICYgZXllcworICAgICAgICBkb3VibGUgdnhfcHJldiA9IGRvdWJsZShwRmFjZVRyYWNrZXItPmZhY2VbTEVZRV0ucHRDZW50ZXIueCArIHBGYWNlVHJhY2tlci0+ZmFjZVtSRVlFXS5wdENlbnRlci54KSAvIDIuMCAtIHBGYWNlVHJhY2tlci0+ZmFjZVtNT1VUSF0ucHRDZW50ZXIueDsKKyAgICAgICAgZG91YmxlIHZ5X3ByZXYgPSBkb3VibGUocEZhY2VUcmFja2VyLT5mYWNlW0xFWUVdLnB0Q2VudGVyLnkgKyBwRmFjZVRyYWNrZXItPmZhY2VbUkVZRV0ucHRDZW50ZXIueSkgLyAyLjAgLSBwRmFjZVRyYWNrZXItPmZhY2VbTU9VVEhdLnB0Q2VudGVyLnk7CisgICAgICAgIGRvdWJsZSB2eF9wcmV2MSA9IHZ4X3ByZXYgKiBjb3MocEZhY2VUcmFja2VyLT5kYlJvdGF0ZURlbHRhKSAtIHZ5X3ByZXYgKiBzaW4ocEZhY2VUcmFja2VyLT5kYlJvdGF0ZURlbHRhKTsKKyAgICAgICAgZG91YmxlIHZ5X3ByZXYxID0gdnhfcHJldiAqIHNpbihwRmFjZVRyYWNrZXItPmRiUm90YXRlRGVsdGEpICsgdnlfcHJldiAqIGNvcyhwRmFjZVRyYWNrZXItPmRiUm90YXRlRGVsdGEpOworICAgICAgICB2eF9wcmV2ID0gdnhfcHJldjE7CisgICAgICAgIHZ5X3ByZXYgPSB2eV9wcmV2MTsKKyAgICAgICAgZm9yIChlbGVtID0gMDsgZWxlbSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBlbGVtKyspCisgICAgICAgICAgICBwRmFjZVRyYWNrZXItPmZhY2VbZWxlbV0gPSBuZXdfZmFjZVtlbGVtXTsKKyAgICAgICAgZG91YmxlIHZ4ID0gZG91YmxlKHBGYWNlVHJhY2tlci0+ZmFjZVtMRVlFXS5wdENlbnRlci54ICsgcEZhY2VUcmFja2VyLT5mYWNlW1JFWUVdLnB0Q2VudGVyLngpIC8gMi4wIC0gcEZhY2VUcmFja2VyLT5mYWNlW01PVVRIXS5wdENlbnRlci54OworICAgICAgICBkb3VibGUgdnkgPSBkb3VibGUocEZhY2VUcmFja2VyLT5mYWNlW0xFWUVdLnB0Q2VudGVyLnkgKyBwRmFjZVRyYWNrZXItPmZhY2VbUkVZRV0ucHRDZW50ZXIueSkgLyAyLjAgLSBwRmFjZVRyYWNrZXItPmZhY2VbTU9VVEhdLnB0Q2VudGVyLnk7CisgICAgICAgIHBGYWNlVHJhY2tlci0+ZGJSb3RhdGVEZWx0YSA9IDA7CisgICAgICAgIGRvdWJsZSBuMV9uMiA9ICh2eCAqIHZ4ICsgdnkgKiB2eSkgKiAodnhfcHJldiAqIHZ4X3ByZXYgKyB2eV9wcmV2ICogdnlfcHJldik7CisgICAgICAgIGlmIChuMV9uMiAhPSAwKQorICAgICAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZURlbHRhID0gYXNpbigodnggKiB2eV9wcmV2IC0gdnhfcHJldiAqIHZ5KSAvIHNxcnQobjFfbjIpKTsKKyAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZUFuZ2xlIC09IHBGYWNlVHJhY2tlci0+ZGJSb3RhdGVEZWx0YTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZURlbHRhID0gMDsKKyAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZUFuZ2xlID0gMDsKKyAgICB9CisgICAgaWYgKChwRmFjZVRyYWNrZXItPmRiUm90YXRlQW5nbGUgPj0gcGkvMiAmJiBwRmFjZVRyYWNrZXItPmRiUm90YXRlQW5nbGUgPiAwKSB8fAorICAgICAgICAocEZhY2VUcmFja2VyLT5kYlJvdGF0ZUFuZ2xlIDw9IC1waS8yICYmIHBGYWNlVHJhY2tlci0+ZGJSb3RhdGVBbmdsZSA8IDApKQorICAgIHsKKyAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZURlbHRhID0gMDsKKyAgICAgICAgcEZhY2VUcmFja2VyLT5kYlJvdGF0ZUFuZ2xlID0gMDsKKyAgICAgICAgZm91bmQgPSBGQUxTRTsKKyAgICB9CisgICAgaWYgKGZvdW5kKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRkFDRV9FTEVNRU5UUyAmJiBpIDwgblJlY3RzOyBpKyspCisgICAgICAgICAgICBwUmVjdHNbaV0gPSBwRmFjZVRyYWNrZXItPmZhY2VbaV0ucjsKKyAgICB9CisgICAgcmV0dXJuIGZvdW5kOworfS8vaW50IEZpbmRGYWNlVHJhY2tlcihDdkZhY2VUcmFja2VyKiBwRmFjZVRyYWNrZXIsIElwbEltYWdlKiBpbWdHcmF5LCBDdlJlY3QqIHBSZWN0cywgaW50IG5SZWN0cywgQ3ZQb2ludCYgcHRSb3RhdGUsIGRvdWJsZSYgZGJBbmdsZVJvdGF0ZSkKKwordm9pZCBUaHJlc2hvbGRpbmdQYXJhbShJcGxJbWFnZSAqaW1nR3JheSwgaW50IGlOdW1MYXllcnMsIGludCAmaU1pbkxldmVsLCBpbnQgJmlNYXhMZXZlbCwgZmxvYXQgJnN0ZXAsIGZsb2F0JiBwb3dlciwgaW50IGlIaXN0TWluIC8qPSBISVNUX01JTiovKQoreworICAgIF9BU1NFUlQoaW1nR3JheSAhPSBOVUxMKTsKKyAgICBfQVNTRVJUKGltZ0dyYXktPm5DaGFubmVscyA9PSAxKTsKKyAgICBpbnQgaSwgajsgCisgICAgLy8gY3JlYXRlIGhpc3RvZ3JhbQorICAgIGludCBoaXN0SW1nWzI1Nl0gPSB7MH07CisgICAgdWNoYXIqIGJ1ZmZJbWcgPSAodWNoYXIqKWltZ0dyYXktPmltYWdlRGF0YTsKKyAgICBDdlJlY3QgclJPSSA9IGN2R2V0SW1hZ2VST0koaW1nR3JheSk7CisgICAgYnVmZkltZyArPSByUk9JLnkgKiBpbWdHcmF5LT53aWR0aFN0ZXAgKyByUk9JLng7CisgICAgZm9yIChqID0gMDsgaiA8IHJST0kuaGVpZ2h0OyBqKyspCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgclJPSS53aWR0aDsgaSsrKQorICAgICAgICAgICAgaGlzdEltZ1tidWZmSW1nW2ldXSArKzsKKyAgICAgICAgYnVmZkltZyArPSBpbWdHcmF5LT53aWR0aFN0ZXA7CisgICAgfQorICAgIC8vIHBhcmFtcworICAgIGZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChoaXN0SW1nW2ldID4gaUhpc3RNaW4pCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgaU1pbkxldmVsID0gaTsKKyAgICBmb3IgKGkgPSAyNTU7IGkgPj0gMDsgaS0tKQorICAgIHsKKyAgICAgICAgaWYgKGhpc3RJbWdbaV0gPiBpSGlzdE1pbikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpTWF4TGV2ZWwgPSBpOworICAgIGlmIChpTWF4TGV2ZWwgPD0gaU1pbkxldmVsKQorICAgIHsKKyAgICAgICAgaU1heExldmVsID0gMjU1OworICAgICAgICBpTWluTGV2ZWwgPSAwOworICAgIH0KKyAgICAvLyBwb3dlcgorICAgIGRvdWJsZSBibGFjayA9IDE7CisgICAgZG91YmxlIHdoaXRlID0gMTsKKyAgICBmb3IgKGkgPSBpTWluTGV2ZWw7IGkgPCAoaU1pbkxldmVsICsgaU1heExldmVsKSAvIDI7IGkrKykKKyAgICAgICAgYmxhY2sgKz0gaGlzdEltZ1tpXTsKKyAgICBmb3IgKGkgPSAoaU1pbkxldmVsICsgaU1heExldmVsKSAvIDI7IGkgPCBpTWF4TGV2ZWw7IGkrKykKKyAgICAgICAgd2hpdGUgKz0gaGlzdEltZ1tpXTsKKyAgICBwb3dlciA9IGZsb2F0KGJsYWNrKSAvIGZsb2F0KDIgKiB3aGl0ZSk7CisgICAgLy8KKyAgICBzdGVwID0gZmxvYXQoaU1heExldmVsIC0gaU1pbkxldmVsKSAvIGZsb2F0KGlOdW1MYXllcnMpOworICAgIGlmIChzdGVwIDwgMS4wKQorICAgICAgICBzdGVwID0gMS4wOworfS8vIHZvaWQgVGhyZXNob2xkaW5nUGFyYW0oSXBsSW1hZ2UgKmltZ0dyYXksIGludCBpTnVtTGF5ZXJzLCBpbnQgJmlNaW5MZXZlbCwgaW50ICZpTWF4TGV2ZWwsIGludCAmaVN0ZXApCisKK2ludCBDaG9pY2VUcmFja2luZ0ZhY2UzKEN2RmFjZVRyYWNrZXIqIHBURiwgY29uc3QgaW50IG5FbGVtZW50cywgY29uc3QgQ3ZGYWNlRWxlbWVudCogYmlnX2ZhY2UsIEN2VHJhY2tpbmdSZWN0KiBmYWNlLCBpbnQmIG5ld19lbmVyZ3kpCit7CisgICAgQ3ZUcmFja2luZ1JlY3QqIGN1cnJfZmFjZVtOVU1fRkFDRV9FTEVNRU5UU10gPSB7TlVMTH07CisgICAgQ3ZUcmFja2luZ1JlY3QqIG5ld19mYWNlW05VTV9GQUNFX0VMRU1FTlRTXSA9IHtOVUxMfTsKKyAgICBuZXdfZW5lcmd5ID0gMHg3ZmZmZmZmZjsKKyAgICBpbnQgY3Vycl9lbmVyZ3kgPSAweDdmZmZmZmZmOworICAgIGludCBmb3VuZCA9IEZBTFNFOworICAgIGludCBOID0gMDsKKyAgICBDdlNlcVJlYWRlciByZWFkZXJfbSwgcmVhZGVyX2wsIHJlYWRlcl9yOworICAgIGN2U3RhcnRSZWFkU2VxKCBiaWdfZmFjZVtNT1VUSF0ubV9zZXFSZWN0cywgJnJlYWRlcl9tICk7CisgICAgZm9yIChpbnQgaV9tb3V0aCA9IDA7IGlfbW91dGggPCBiaWdfZmFjZVtNT1VUSF0ubV9zZXFSZWN0cy0+dG90YWwgJiYgaV9tb3V0aCA8IG5FbGVtZW50czsgaV9tb3V0aCsrKQorICAgIHsKKyAgICAgICAgY3Vycl9mYWNlW01PVVRIXSA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlcl9tLnB0cik7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBiaWdfZmFjZVtMRVlFXS5tX3NlcVJlY3RzLCAmcmVhZGVyX2wgKTsKKyAgICAgICAgZm9yIChpbnQgaV9sZWZ0ID0gMDsgaV9sZWZ0IDwgYmlnX2ZhY2VbTEVZRV0ubV9zZXFSZWN0cy0+dG90YWwgJiYgaV9sZWZ0IDwgbkVsZW1lbnRzOyBpX2xlZnQrKykKKyAgICAgICAgeworICAgICAgICAgICAgY3Vycl9mYWNlW0xFWUVdID0gKEN2VHJhY2tpbmdSZWN0KikocmVhZGVyX2wucHRyKTsKKyAgICAgICAgICAgIGlmIChjdXJyX2ZhY2VbTEVZRV0tPnIueSArIGN1cnJfZmFjZVtMRVlFXS0+ci5oZWlnaHQgPCBjdXJyX2ZhY2VbTU9VVEhdLT5yLnkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZTdGFydFJlYWRTZXEoIGJpZ19mYWNlW1JFWUVdLm1fc2VxUmVjdHMsICZyZWFkZXJfciApOworICAgICAgICAgICAgICAgIGZvciAoaW50IGlfcmlnaHQgPSAwOyBpX3JpZ2h0IDwgYmlnX2ZhY2VbUkVZRV0ubV9zZXFSZWN0cy0+dG90YWwgJiYgaV9yaWdodCA8IG5FbGVtZW50czsgaV9yaWdodCsrKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3Vycl9mYWNlW1JFWUVdID0gKEN2VHJhY2tpbmdSZWN0KikocmVhZGVyX3IucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJfZmFjZVtSRVlFXS0+ci55ICsgY3Vycl9mYWNlW1JFWUVdLT5yLmhlaWdodCA8IGN1cnJfZmFjZVtNT1VUSF0tPnIueSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9mYWNlW1JFWUVdLT5yLnggPiBjdXJyX2ZhY2VbTEVZRV0tPnIueCArIGN1cnJfZmFjZVtMRVlFXS0+ci53aWR0aCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3Vycl9lbmVyZ3kgPSBHZXRFbmVyZ3koY3Vycl9mYWNlLCBwVEYtPmZhY2UsIHBURi0+cHRUZW1wbCwgcFRGLT5yVGVtcGwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJfZW5lcmd5IDwgbmV3X2VuZXJneSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBlbGVtID0gMDsgZWxlbSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBlbGVtKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19mYWNlW2VsZW1dID0gY3Vycl9mYWNlW2VsZW1dOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld19lbmVyZ3kgPSBjdXJyX2VuZXJneTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IFRSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBOKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGZvdW5kKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgZWxlbSA9IDA7IGVsZW0gPCBOVU1fRkFDRV9FTEVNRU5UUzsgZWxlbSsrKQorICAgICAgICAgICAgZmFjZVtlbGVtXSA9ICoobmV3X2ZhY2VbZWxlbV0pOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9IC8vIGludCBDaG9pY2VUcmFja2luZ0ZhY2UzKGNvbnN0IEN2VHJhY2tpbmdSZWN0KiB0cl9mYWNlLCBDdlRyYWNraW5nUmVjdCogbmV3X2ZhY2UsIGludCYgbmV3X2VuZXJneSkKKworaW50IENob2ljZVRyYWNraW5nRmFjZTIoQ3ZGYWNlVHJhY2tlciogcFRGLCBjb25zdCBpbnQgbkVsZW1lbnRzLCBjb25zdCBDdkZhY2VFbGVtZW50KiBiaWdfZmFjZSwgQ3ZUcmFja2luZ1JlY3QqIGZhY2UsIGludCYgbmV3X2VuZXJneSwgaW50IG5vZWwpCit7CisgICAgaW50IGVsZW1lbnRbTlVNX0ZBQ0VfRUxFTUVOVFNdOworICAgIGZvciAoaW50IGkgPSAwLCBlbGVtID0gMDsgaSA8IE5VTV9GQUNFX0VMRU1FTlRTOyBpKyspCisgICAgeworICAgICAgICBpZiAoaSAhPSBub2VsKQorICAgICAgICB7CisgICAgICAgICAgICBlbGVtZW50W2VsZW1dID0gaTsKKyAgICAgICAgICAgIGVsZW0gKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZWxlbWVudFsyXSA9IGk7CisgICAgfQorICAgIEN2VHJhY2tpbmdSZWN0KiBjdXJyX2ZhY2VbTlVNX0ZBQ0VfRUxFTUVOVFNdID0ge05VTEx9OworICAgIEN2VHJhY2tpbmdSZWN0KiBuZXdfZmFjZVtOVU1fRkFDRV9FTEVNRU5UU10gPSB7TlVMTH07CisgICAgbmV3X2VuZXJneSA9IDB4N2ZmZmZmZmY7CisgICAgaW50IGN1cnJfZW5lcmd5ID0gMHg3ZmZmZmZmZjsKKyAgICBpbnQgZm91bmQgPSBGQUxTRTsKKyAgICBpbnQgTiA9IDA7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyMCwgcmVhZGVyMTsKKyAgICBjdlN0YXJ0UmVhZFNlcSggYmlnX2ZhY2VbZWxlbWVudFswXV0ubV9zZXFSZWN0cywgJnJlYWRlcjAgKTsKKyAgICBmb3IgKGludCBpMCA9IDA7IGkwIDwgYmlnX2ZhY2VbZWxlbWVudFswXV0ubV9zZXFSZWN0cy0+dG90YWwgJiYgaTAgPCBuRWxlbWVudHM7IGkwKyspCisgICAgeworICAgICAgICBjdXJyX2ZhY2VbZWxlbWVudFswXV0gPSAoQ3ZUcmFja2luZ1JlY3QqKShyZWFkZXIwLnB0cik7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBiaWdfZmFjZVtlbGVtZW50WzFdXS5tX3NlcVJlY3RzLCAmcmVhZGVyMSApOworICAgICAgICBmb3IgKGludCBpMSA9IDA7IGkxIDwgYmlnX2ZhY2VbZWxlbWVudFsxXV0ubV9zZXFSZWN0cy0+dG90YWwgJiYgaTEgPCBuRWxlbWVudHM7IGkxKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJfZmFjZVtlbGVtZW50WzFdXSA9IChDdlRyYWNraW5nUmVjdCopKHJlYWRlcjEucHRyKTsKKyAgICAgICAgICAgIGN1cnJfZW5lcmd5ID0gR2V0RW5lcmd5MihjdXJyX2ZhY2UsIHBURi0+ZmFjZSwgcFRGLT5wdFRlbXBsLCBwVEYtPnJUZW1wbCwgZWxlbWVudCk7CisgICAgICAgICAgICBpZiAoY3Vycl9lbmVyZ3kgPCBuZXdfZW5lcmd5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGVsZW0gPSAwOyBlbGVtIDwgTlVNX0ZBQ0VfRUxFTUVOVFM7IGVsZW0rKykKKyAgICAgICAgICAgICAgICAgICAgbmV3X2ZhY2VbZWxlbV0gPSBjdXJyX2ZhY2VbZWxlbV07CisgICAgICAgICAgICAgICAgbmV3X2VuZXJneSA9IGN1cnJfZW5lcmd5OworICAgICAgICAgICAgICAgIGZvdW5kID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE4rKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZm91bmQpCisgICAgeworICAgICAgICBmYWNlW2VsZW1lbnRbMF1dID0gKihuZXdfZmFjZVtlbGVtZW50WzBdXSk7CisgICAgICAgIGZhY2VbZWxlbWVudFsxXV0gPSAqKG5ld19mYWNlW2VsZW1lbnRbMV1dKTsKKyAgICAgICAgLy8gMyBlbGVtZW50IGZpbmQgYnkgdGVtcGxhdGUKKyAgICAgICAgQ3ZQb2ludCB0ZW1wbF92MDEgPSB7cFRGLT5wdFRlbXBsW2VsZW1lbnRbMV1dLnggLSBwVEYtPnB0VGVtcGxbZWxlbWVudFswXV0ueCwgcFRGLT5wdFRlbXBsW2VsZW1lbnRbMV1dLnkgLSBwVEYtPnB0VGVtcGxbZWxlbWVudFswXV0ueX07CisgICAgICAgIEN2UG9pbnQgdGVtcGxfdjAyID0ge3BURi0+cHRUZW1wbFtlbGVtZW50WzJdXS54IC0gcFRGLT5wdFRlbXBsW2VsZW1lbnRbMF1dLngsIHBURi0+cHRUZW1wbFtlbGVtZW50WzJdXS55IC0gcFRGLT5wdFRlbXBsW2VsZW1lbnRbMF1dLnl9OworICAgICAgICBDdlBvaW50IHByZXZfdjAxID0ge3BURi0+ZmFjZVtlbGVtZW50WzFdXS5wdENlbnRlci54IC0gcFRGLT5mYWNlW2VsZW1lbnRbMF1dLnB0Q2VudGVyLngsIHBURi0+ZmFjZVtlbGVtZW50WzFdXS5wdENlbnRlci55IC0gcFRGLT5mYWNlW2VsZW1lbnRbMF1dLnB0Q2VudGVyLnl9OworICAgICAgICBDdlBvaW50IHByZXZfdjAyID0ge3BURi0+ZmFjZVtlbGVtZW50WzJdXS5wdENlbnRlci54IC0gcFRGLT5mYWNlW2VsZW1lbnRbMF1dLnB0Q2VudGVyLngsIHBURi0+ZmFjZVtlbGVtZW50WzJdXS5wdENlbnRlci55IC0gcFRGLT5mYWNlW2VsZW1lbnRbMF1dLnB0Q2VudGVyLnl9OworICAgICAgICBDdlBvaW50IG5ld192MDEgPSB7bmV3X2ZhY2VbZWxlbWVudFsxXV0tPnB0Q2VudGVyLnggLSBuZXdfZmFjZVtlbGVtZW50WzBdXS0+cHRDZW50ZXIueCwgbmV3X2ZhY2VbZWxlbWVudFsxXV0tPnB0Q2VudGVyLnkgLSBuZXdfZmFjZVtlbGVtZW50WzBdXS0+cHRDZW50ZXIueX07CisgICAgICAgIGRvdWJsZSB0ZW1wbF9kMDEgPSBzcXJ0KChkb3VibGUpdGVtcGxfdjAxLngqdGVtcGxfdjAxLnggKyB0ZW1wbF92MDEueSp0ZW1wbF92MDEueSk7CisgICAgICAgIGRvdWJsZSB0ZW1wbF9kMDIgPSBzcXJ0KChkb3VibGUpdGVtcGxfdjAyLngqdGVtcGxfdjAyLnggKyB0ZW1wbF92MDIueSp0ZW1wbF92MDIueSk7CisgICAgICAgIGRvdWJsZSBwcmV2X2QwMSA9IHNxcnQoKGRvdWJsZSlwcmV2X3YwMS54KnByZXZfdjAxLnggKyBwcmV2X3YwMS55KnByZXZfdjAxLnkpOworICAgICAgICBkb3VibGUgcHJldl9kMDIgPSBzcXJ0KChkb3VibGUpcHJldl92MDIueCpwcmV2X3YwMi54ICsgcHJldl92MDIueSpwcmV2X3YwMi55KTsKKyAgICAgICAgZG91YmxlIG5ld19kMDEgPSBzcXJ0KChkb3VibGUpbmV3X3YwMS54Km5ld192MDEueCArIG5ld192MDEueSpuZXdfdjAxLnkpOworICAgICAgICBkb3VibGUgc2NhbGUgPSB0ZW1wbF9kMDEgLyBuZXdfZDAxOworICAgICAgICBkb3VibGUgbmV3X2QwMiA9IHRlbXBsX2QwMiAvIHNjYWxlOyAKKyAgICAgICAgZG91YmxlIHNpbl9hID0gZG91YmxlKHByZXZfdjAxLnggKiBwcmV2X3YwMi55IC0gcHJldl92MDEueSAqIHByZXZfdjAyLngpIC8gKHByZXZfZDAxICogcHJldl9kMDIpOworICAgICAgICBkb3VibGUgY29zX2EgPSBjb3MoYXNpbihzaW5fYSkpOworICAgICAgICBkb3VibGUgeCA9IGRvdWJsZShuZXdfdjAxLngpICogY29zX2EgLSBkb3VibGUobmV3X3YwMS55KSAqIHNpbl9hOworICAgICAgICBkb3VibGUgeSA9IGRvdWJsZShuZXdfdjAxLngpICogc2luX2EgKyBkb3VibGUobmV3X3YwMS55KSAqIGNvc19hOworICAgICAgICB4ID0geCAqIG5ld19kMDIgLyBuZXdfZDAxOworICAgICAgICB5ID0geSAqIG5ld19kMDIgLyBuZXdfZDAxOworICAgICAgICBDdlBvaW50IG5ld192MDIgPSB7aW50KHggKyAwLjUpLCBpbnQoeSArIDAuNSl9OworICAgICAgICBmYWNlW2VsZW1lbnRbMl1dLmlDb2xvciA9IDA7CisgICAgICAgIGZhY2VbZWxlbWVudFsyXV0uaUVuZXJneSA9IDA7CisgICAgICAgIGZhY2VbZWxlbWVudFsyXV0ublJlY3RzSW5UaGlzID0gMDsKKyAgICAgICAgZmFjZVtlbGVtZW50WzJdXS5uUmVjdHNPbkJvdHRvbSA9IDA7CisgICAgICAgIGZhY2VbZWxlbWVudFsyXV0ublJlY3RzT25MZWZ0ID0gMDsKKyAgICAgICAgZmFjZVtlbGVtZW50WzJdXS5uUmVjdHNPblJpZ2h0ID0gMDsKKyAgICAgICAgZmFjZVtlbGVtZW50WzJdXS5uUmVjdHNPblRvcCA9IDA7CisgICAgICAgIGZhY2VbZWxlbWVudFsyXV0ucHRDZW50ZXIueCA9IG5ld192MDIueCArIG5ld19mYWNlW2VsZW1lbnRbMF1dLT5wdENlbnRlci54OworICAgICAgICBmYWNlW2VsZW1lbnRbMl1dLnB0Q2VudGVyLnkgPSBuZXdfdjAyLnkgKyBuZXdfZmFjZVtlbGVtZW50WzBdXS0+cHRDZW50ZXIueTsKKyAgICAgICAgZmFjZVtlbGVtZW50WzJdXS5yLndpZHRoID0gaW50KGRvdWJsZShwVEYtPnJUZW1wbFtlbGVtZW50WzJdXS53aWR0aCkgLyAoc2NhbGUpICsgMC41KTsKKyAgICAgICAgZmFjZVtlbGVtZW50WzJdXS5yLmhlaWdodCA9IGludChkb3VibGUocFRGLT5yVGVtcGxbZWxlbWVudFsyXV0uaGVpZ2h0KSAvIChzY2FsZSkgKyAwLjUpOworICAgICAgICBmYWNlW2VsZW1lbnRbMl1dLnIueCA9IGZhY2VbZWxlbWVudFsyXV0ucHRDZW50ZXIueCAtIChmYWNlW2VsZW1lbnRbMl1dLnIud2lkdGggKyAxKSAvIDI7CisgICAgICAgIGZhY2VbZWxlbWVudFsyXV0uci55ID0gZmFjZVtlbGVtZW50WzJdXS5wdENlbnRlci55IC0gKGZhY2VbZWxlbWVudFsyXV0uci5oZWlnaHQgKyAxKSAvIDI7CisgICAgICAgIF9BU1NFUlQoZmFjZVtMRVlFXS5yLnggKyBmYWNlW0xFWUVdLnIud2lkdGggPD0gZmFjZVtSRVlFXS5yLngpOworICAgIH0KKyAgICByZXR1cm4gZm91bmQ7Cit9IC8vIGludCBDaG9pY2VUcmFja2luZ0ZhY2UzKGNvbnN0IEN2VHJhY2tpbmdSZWN0KiB0cl9mYWNlLCBDdlRyYWNraW5nUmVjdCogbmV3X2ZhY2UsIGludCYgbmV3X2VuZXJneSkKKworaW5saW5lIGludCBHZXRFbmVyZ3koQ3ZUcmFja2luZ1JlY3QqKiBwcE5ldywgY29uc3QgQ3ZUcmFja2luZ1JlY3QqIHBQcmV2LCBDdlBvaW50KiBwdFRlbXBsLCBDdlJlY3QqIHJUZW1wbCkKK3sKKyAgICBpbnQgZW5lcmd5ID0gMDsKKyAgICBDdlBvaW50IHB0TmV3W05VTV9GQUNFX0VMRU1FTlRTXTsKKyAgICBDdlBvaW50IHB0UHJldltOVU1fRkFDRV9FTEVNRU5UU107CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fRkFDRV9FTEVNRU5UUzsgaSsrKQorICAgIHsKKyAgICAgICAgcHROZXdbaV0gPSBwcE5ld1tpXS0+cHRDZW50ZXI7CisgICAgICAgIHB0UHJldltpXSA9IHBQcmV2W2ldLnB0Q2VudGVyOworICAgICAgICBlbmVyZ3kgKz0gcHBOZXdbaV0tPmlFbmVyZ3kgLSAyICogcHBOZXdbaV0tPm5SZWN0c0luVGhpczsKKyAgICB9CisgICAgZG91YmxlIGR4ID0gMCwgZHkgPSAwLCBzY2FsZSA9IDEsIHJvdGF0ZSA9IDA7CisgICAgZG91YmxlIGVfdGVtcGwgPSBDYWxjdWxhdGVUcmFuc2Zvcm1hdGlvbkxNUzMocHRUZW1wbCwgcHROZXcsICZzY2FsZSwgJnJvdGF0ZSwgJmR4LCAmZHkpOworICAgIGRvdWJsZSBlX3ByZXYgPSBDYWxjdWxhdGVUcmFuc2Zvcm1hdGlvbkxNUzNfMChwdFByZXYsIHB0TmV3KTsKKyAgICBkb3VibGUgd19leWUgPSBkb3VibGUocHBOZXdbTEVZRV0tPnIud2lkdGggKyBwcE5ld1tSRVlFXS0+ci53aWR0aCkgKiBzY2FsZSAvIDIuMDsKKyAgICBkb3VibGUgaF9leWUgPSBkb3VibGUocHBOZXdbTEVZRV0tPnIuaGVpZ2h0ICsgcHBOZXdbUkVZRV0tPnIuaGVpZ2h0KSAqIHNjYWxlIC8gMi4wOworICAgIGRvdWJsZSB3X21vdXRoID0gZG91YmxlKHBwTmV3W01PVVRIXS0+ci53aWR0aCkgKiBzY2FsZTsKKyAgICBkb3VibGUgaF9tb3V0aCA9IGRvdWJsZShwcE5ld1tNT1VUSF0tPnIuaGVpZ2h0KSAqIHNjYWxlOworICAgIGVuZXJneSArPQorICAgICAgICBpbnQoNTEyLjAgKiAoZV9wcmV2ICsgMTYuMCAqIGVfdGVtcGwpKSArCisgICAgICAgIDQgKiBwb3cyKHBwTmV3W0xFWUVdLT5yLndpZHRoIC0gcHBOZXdbUkVZRV0tPnIud2lkdGgpICsgCisgICAgICAgIDQgKiBwb3cyKHBwTmV3W0xFWUVdLT5yLmhlaWdodCAtIHBwTmV3W1JFWUVdLT5yLmhlaWdodCkgKyAKKyAgICAgICAgNCAqIChpbnQpcG93KHdfZXllIC0gZG91YmxlKHJUZW1wbFtMRVlFXS53aWR0aCArIHJUZW1wbFtSRVlFXS53aWR0aCkgLyAyLjAsIDIpICsgCisgICAgICAgIDIgKiAoaW50KXBvdyhoX2V5ZSAtIGRvdWJsZShyVGVtcGxbTEVZRV0uaGVpZ2h0ICsgclRlbXBsW1JFWUVdLmhlaWdodCkgLyAyLjAsIDIpICsgCisgICAgICAgIDEgKiAoaW50KXBvdyh3X21vdXRoIC0gZG91YmxlKHJUZW1wbFtNT1VUSF0ud2lkdGgpLCAyKSArIAorICAgICAgICAxICogKGludClwb3coaF9tb3V0aCAtIGRvdWJsZShyVGVtcGxbTU9VVEhdLmhlaWdodCksIDIpICsgCisgICAgICAgIDA7CisgICAgcmV0dXJuIGVuZXJneTsKK30KKworaW5saW5lIGludCBHZXRFbmVyZ3kyKEN2VHJhY2tpbmdSZWN0KiogcHBOZXcsIGNvbnN0IEN2VHJhY2tpbmdSZWN0KiBwUHJldiwgQ3ZQb2ludCogcHRUZW1wbCwgQ3ZSZWN0KiByVGVtcGwsIGludCogZWxlbWVudCkKK3sKKyAgICBDdlBvaW50IG5ld192ID0ge3BwTmV3W2VsZW1lbnRbMF1dLT5wdENlbnRlci54IC0gcHBOZXdbZWxlbWVudFsxXV0tPnB0Q2VudGVyLngsCisgICAgICAgIHBwTmV3W2VsZW1lbnRbMF1dLT5wdENlbnRlci55IC0gcHBOZXdbZWxlbWVudFsxXV0tPnB0Q2VudGVyLnl9OworICAgIEN2UG9pbnQgcHJldl92ID0ge3BQcmV2W2VsZW1lbnRbMF1dLnB0Q2VudGVyLnggLSBwUHJldltlbGVtZW50WzFdXS5wdENlbnRlci54LAorICAgICAgICBwUHJldltlbGVtZW50WzBdXS5wdENlbnRlci55IC0gcFByZXZbZWxlbWVudFsxXV0ucHRDZW50ZXIueX07CisgICAgZG91YmxlIG5ld19kID0gc3FydCgoZG91YmxlKW5ld192LngqbmV3X3YueCArIG5ld192LnkqbmV3X3YueSk7CisgICAgZG91YmxlIHByZXZfZCA9IHNxcnQoKGRvdWJsZSlwcmV2X3YueCpwcmV2X3YueCArIHByZXZfdi55KnByZXZfdi55KTsKKyAgICBkb3VibGUgZHggPSBwdFRlbXBsW2VsZW1lbnRbMF1dLnggLSBwdFRlbXBsW2VsZW1lbnRbMV1dLng7CisgICAgZG91YmxlIGR5ID0gcHRUZW1wbFtlbGVtZW50WzBdXS55IC0gcHRUZW1wbFtlbGVtZW50WzFdXS55OworICAgIGRvdWJsZSB0ZW1wbF9kID0gc3FydChkeCpkeCArIGR5KmR5KTsKKyAgICBkb3VibGUgc2NhbGVfdGVtcGwgPSBuZXdfZCAvIHRlbXBsX2Q7CisgICAgZG91YmxlIHcwID0gKGRvdWJsZSlwcE5ld1tlbGVtZW50WzBdXS0+ci53aWR0aCAqIHNjYWxlX3RlbXBsOworICAgIGRvdWJsZSBoMCA9IChkb3VibGUpcHBOZXdbZWxlbWVudFswXV0tPnIuaGVpZ2h0ICogc2NhbGVfdGVtcGw7CisgICAgZG91YmxlIHcxID0gKGRvdWJsZSlwcE5ld1tlbGVtZW50WzFdXS0+ci53aWR0aCAqIHNjYWxlX3RlbXBsOworICAgIGRvdWJsZSBoMSA9IChkb3VibGUpcHBOZXdbZWxlbWVudFsxXV0tPnIuaGVpZ2h0ICogc2NhbGVfdGVtcGw7CisgICAgCisgICAgaW50IGVuZXJneSA9IHBwTmV3W2VsZW1lbnRbMF1dLT5pRW5lcmd5ICsgcHBOZXdbZWxlbWVudFsxXV0tPmlFbmVyZ3kgKworICAgICAgICAtIDIgKiAocHBOZXdbZWxlbWVudFswXV0tPm5SZWN0c0luVGhpcyAtIHBwTmV3W2VsZW1lbnRbMV1dLT5uUmVjdHNJblRoaXMpICsgCisgICAgICAgIChpbnQpcG93KHcwIC0gKGRvdWJsZSlyVGVtcGxbZWxlbWVudFswXV0ud2lkdGgsIDIpICsKKyAgICAgICAgKGludClwb3coaDAgLSAoZG91YmxlKXJUZW1wbFtlbGVtZW50WzBdXS5oZWlnaHQsIDIpICsKKyAgICAgICAgKGludClwb3codzEgLSAoZG91YmxlKXJUZW1wbFtlbGVtZW50WzFdXS53aWR0aCwgMikgKworICAgICAgICAoaW50KXBvdyhoMSAtIChkb3VibGUpclRlbXBsW2VsZW1lbnRbMV1dLmhlaWdodCwgMikgKworICAgICAgICAoaW50KXBvdyhuZXdfZCAtIHByZXZfZCwgMikgKworICAgICAgICAwOworICAgIAorICAgIHJldHVybiBlbmVyZ3k7Cit9CisKK2lubGluZSBkb3VibGUgQ2FsY3VsYXRlVHJhbnNmb3JtYXRpb25MTVMzKCBDdlBvaW50KiBwVGVtcGxQb2ludHMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50KiBwU3JjUG9pbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqICAgICAgIHBkYkF2ZXJhZ2VTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiAgICAgICBwZGJBdmVyYWdlUm90YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqICAgICAgIHBkYkF2ZXJhZ2VTaGlmdFgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogICAgICAgcGRiQXZlcmFnZVNoaWZ0WSApCit7CisvLyAgICBkb3VibGUgV1MgPSAwOworICAgIGRvdWJsZSBkYkF2ZXJhZ2VTY2FsZSA9IDE7CisgICAgZG91YmxlIGRiQXZlcmFnZVJvdGF0ZSA9IDA7CisgICAgZG91YmxlIGRiQXZlcmFnZVNoaWZ0WCA9IDA7CisgICAgZG91YmxlIGRiQXZlcmFnZVNoaWZ0WSA9IDA7CisgICAgZG91YmxlIGRiTE1TID0gMDsKKworICAgIF9BU1NFUlQoIE5VTEwgIT0gcFRlbXBsUG9pbnRzKTsKKyAgICBfQVNTRVJUKCBOVUxMICE9IHBTcmNQb2ludHMpOworCisgICAgZG91YmxlIGRiWHQgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnggKyBwVGVtcGxQb2ludHNbMV0ueCArIHBUZW1wbFBvaW50c1syXS54KSAvIDMuMDsKKyAgICBkb3VibGUgZGJZdCA9IGRvdWJsZShwVGVtcGxQb2ludHNbMF0ueSArIHBUZW1wbFBvaW50c1sxXS55ICsgcFRlbXBsUG9pbnRzWzJdLnkgKSAvIDMuMDsKKyAgICBkb3VibGUgZGJYcyA9IGRvdWJsZShwU3JjUG9pbnRzWzBdLnggKyBwU3JjUG9pbnRzWzFdLnggKyBwU3JjUG9pbnRzWzJdLngpIC8gMy4wOworICAgIGRvdWJsZSBkYllzID0gZG91YmxlKHBTcmNQb2ludHNbMF0ueSArIHBTcmNQb2ludHNbMV0ueSArIHBTcmNQb2ludHNbMl0ueSkgLyAzLjA7CisgICAgCisgICAgZG91YmxlIGRiWHRYdCA9IGRvdWJsZShwb3cyKHBUZW1wbFBvaW50c1swXS54KSArIHBvdzIocFRlbXBsUG9pbnRzWzFdLngpICsgcG93MihwVGVtcGxQb2ludHNbMl0ueCkpIC8gMy4wOworICAgIGRvdWJsZSBkYll0WXQgPSBkb3VibGUocG93MihwVGVtcGxQb2ludHNbMF0ueSkgKyBwb3cyKHBUZW1wbFBvaW50c1sxXS55KSArIHBvdzIocFRlbXBsUG9pbnRzWzJdLnkpKSAvIDMuMDsKKyAgICAKKyAgICBkb3VibGUgZGJYc1hzID0gZG91YmxlKHBvdzIocFNyY1BvaW50c1swXS54KSArIHBvdzIocFNyY1BvaW50c1sxXS54KSArIHBvdzIocFNyY1BvaW50c1syXS54KSkgLyAzLjA7CisgICAgZG91YmxlIGRiWXNZcyA9IGRvdWJsZShwb3cyKHBTcmNQb2ludHNbMF0ueSkgKyBwb3cyKHBTcmNQb2ludHNbMV0ueSkgKyBwb3cyKHBTcmNQb2ludHNbMl0ueSkpIC8gMy4wOworICAgIAorICAgIGRvdWJsZSBkYlh0WHMgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnggKiBwU3JjUG9pbnRzWzBdLnggKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzFdLnggKiBwU3JjUG9pbnRzWzFdLnggKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzJdLnggKiBwU3JjUG9pbnRzWzJdLngpIC8gMy4wOworICAgIGRvdWJsZSBkYll0WXMgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnkgKiBwU3JjUG9pbnRzWzBdLnkgKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzFdLnkgKiBwU3JjUG9pbnRzWzFdLnkgKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzJdLnkgKiBwU3JjUG9pbnRzWzJdLnkpIC8gMy4wOworICAgIAorICAgIGRvdWJsZSBkYlh0WXMgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnggKiBwU3JjUG9pbnRzWzBdLnkgKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzFdLnggKiBwU3JjUG9pbnRzWzFdLnkgKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzJdLnggKiBwU3JjUG9pbnRzWzJdLnkpIC8gMy4wOworICAgIGRvdWJsZSBkYll0WHMgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnkgKiBwU3JjUG9pbnRzWzBdLnggKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzFdLnkgKiBwU3JjUG9pbnRzWzFdLnggKyAKKyAgICAgICAgcFRlbXBsUG9pbnRzWzJdLnkgKiBwU3JjUG9pbnRzWzJdLnggKSAvIDMuMDsKKyAgICAKKyAgICBkYlh0WHQgLT0gZGJYdCAqIGRiWHQ7CisgICAgZGJZdFl0IC09IGRiWXQgKiBkYll0OworICAgIAorICAgIGRiWHNYcyAtPSBkYlhzICogZGJYczsKKyAgICBkYllzWXMgLT0gZGJZcyAqIGRiWXM7CisgICAgCisgICAgZGJYdFhzIC09IGRiWHQgKiBkYlhzOworICAgIGRiWXRZcyAtPSBkYll0ICogZGJZczsKKyAgICAKKyAgICBkYlh0WXMgLT0gZGJYdCAqIGRiWXM7CisgICAgZGJZdFhzIC09IGRiWXQgKiBkYlhzOworICAgIAorICAgIGRiQXZlcmFnZVJvdGF0ZSA9IGF0YW4yKCBkYlh0WXMgLSBkYll0WHMsIGRiWHRYcyArIGRiWXRZcyApOworICAgIAorICAgIGRvdWJsZSBjb3NSID0gY29zKGRiQXZlcmFnZVJvdGF0ZSk7CisgICAgZG91YmxlIHNpblIgPSBzaW4oZGJBdmVyYWdlUm90YXRlKTsKKyAgICBkb3VibGUgZGVsID0gZGJYc1hzICsgZGJZc1lzOworICAgIGlmKCBkZWwgIT0gMCApCisgICAgeworICAgICAgICBkYkF2ZXJhZ2VTY2FsZSA9IChkb3VibGUoZGJYdFhzICsgZGJZdFlzKSAqIGNvc1IgKyBkb3VibGUoZGJYdFlzIC0gZGJZdFhzKSAqIHNpblIpIC8gZGVsOworICAgICAgICBkYkxNUyA9IGRiWHRYdCArIGRiWXRZdCAtICgoZG91YmxlKXBvdyhkYlh0WHMgKyBkYll0WXMsMikgKyAoZG91YmxlKXBvdyhkYlh0WXMgLSBkYll0WHMsMikpIC8gZGVsOworICAgIH0KKyAgICAKKyAgICBkYkF2ZXJhZ2VTaGlmdFggPSBkb3VibGUoZGJYdCkgLSBkYkF2ZXJhZ2VTY2FsZSAqIChkb3VibGUoZGJYcykgKiBjb3NSICsgZG91YmxlKGRiWXMpICogc2luUik7CisgICAgZGJBdmVyYWdlU2hpZnRZID0gZG91YmxlKGRiWXQpIC0gZGJBdmVyYWdlU2NhbGUgKiAoZG91YmxlKGRiWXMpICogY29zUiAtIGRvdWJsZShkYlhzKSAqIHNpblIpOworICAgIAorICAgIGlmKCBwZGJBdmVyYWdlU2NhbGUgIT0gTlVMTCApICpwZGJBdmVyYWdlU2NhbGUgPSBkYkF2ZXJhZ2VTY2FsZTsKKyAgICBpZiggcGRiQXZlcmFnZVJvdGF0ZSAhPSBOVUxMICkgKnBkYkF2ZXJhZ2VSb3RhdGUgPSBkYkF2ZXJhZ2VSb3RhdGU7CisgICAgaWYoIHBkYkF2ZXJhZ2VTaGlmdFggIT0gTlVMTCApICpwZGJBdmVyYWdlU2hpZnRYID0gZGJBdmVyYWdlU2hpZnRYOworICAgIGlmKCBwZGJBdmVyYWdlU2hpZnRZICE9IE5VTEwgKSAqcGRiQXZlcmFnZVNoaWZ0WSA9IGRiQXZlcmFnZVNoaWZ0WTsKKyAgICAKKyAgICBfQVNTRVJUKGRiTE1TID49IDApOworICAgIHJldHVybiBkYkxNUzsKK30KKworaW5saW5lIGRvdWJsZSBDYWxjdWxhdGVUcmFuc2Zvcm1hdGlvbkxNUzNfMCggQ3ZQb2ludCogcFRlbXBsUG9pbnRzLCBDdlBvaW50KiBwU3JjUG9pbnRzKQoreworICAgIGRvdWJsZSBkYkxNUyA9IDA7CisKKyAgICBfQVNTRVJUKCBOVUxMICE9IHBUZW1wbFBvaW50cyk7CisgICAgX0FTU0VSVCggTlVMTCAhPSBwU3JjUG9pbnRzKTsKKworICAgIGRvdWJsZSBkYlh0ID0gZG91YmxlKHBUZW1wbFBvaW50c1swXS54ICsgcFRlbXBsUG9pbnRzWzFdLnggKyBwVGVtcGxQb2ludHNbMl0ueCkgLyAzLjA7CisgICAgZG91YmxlIGRiWXQgPSBkb3VibGUocFRlbXBsUG9pbnRzWzBdLnkgKyBwVGVtcGxQb2ludHNbMV0ueSArIHBUZW1wbFBvaW50c1syXS55ICkgLyAzLjA7CisgICAgZG91YmxlIGRiWHMgPSBkb3VibGUocFNyY1BvaW50c1swXS54ICsgcFNyY1BvaW50c1sxXS54ICsgcFNyY1BvaW50c1syXS54KSAvIDMuMDsKKyAgICBkb3VibGUgZGJZcyA9IGRvdWJsZShwU3JjUG9pbnRzWzBdLnkgKyBwU3JjUG9pbnRzWzFdLnkgKyBwU3JjUG9pbnRzWzJdLnkpIC8gMy4wOworICAgIAorICAgIGRvdWJsZSBkYlh0WHQgPSBkb3VibGUocG93MihwVGVtcGxQb2ludHNbMF0ueCkgKyBwb3cyKHBUZW1wbFBvaW50c1sxXS54KSArIHBvdzIocFRlbXBsUG9pbnRzWzJdLngpKSAvIDMuMDsKKyAgICBkb3VibGUgZGJZdFl0ID0gZG91YmxlKHBvdzIocFRlbXBsUG9pbnRzWzBdLnkpICsgcG93MihwVGVtcGxQb2ludHNbMV0ueSkgKyBwb3cyKHBUZW1wbFBvaW50c1syXS55KSkgLyAzLjA7CisgICAgCisgICAgZG91YmxlIGRiWHNYcyA9IGRvdWJsZShwb3cyKHBTcmNQb2ludHNbMF0ueCkgKyBwb3cyKHBTcmNQb2ludHNbMV0ueCkgKyBwb3cyKHBTcmNQb2ludHNbMl0ueCkpIC8gMy4wOworICAgIGRvdWJsZSBkYllzWXMgPSBkb3VibGUocG93MihwU3JjUG9pbnRzWzBdLnkpICsgcG93MihwU3JjUG9pbnRzWzFdLnkpICsgcG93MihwU3JjUG9pbnRzWzJdLnkpKSAvIDMuMDsKKyAgICAKKyAgICBkb3VibGUgZGJYdFhzID0gZG91YmxlKHBUZW1wbFBvaW50c1swXS54ICogcFNyY1BvaW50c1swXS54ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1sxXS54ICogcFNyY1BvaW50c1sxXS54ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1syXS54ICogcFNyY1BvaW50c1syXS54KSAvIDMuMDsKKyAgICBkb3VibGUgZGJZdFlzID0gZG91YmxlKHBUZW1wbFBvaW50c1swXS55ICogcFNyY1BvaW50c1swXS55ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1sxXS55ICogcFNyY1BvaW50c1sxXS55ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1syXS55ICogcFNyY1BvaW50c1syXS55KSAvIDMuMDsKKyAgICAKKyAgICBkb3VibGUgZGJYdFlzID0gZG91YmxlKHBUZW1wbFBvaW50c1swXS54ICogcFNyY1BvaW50c1swXS55ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1sxXS54ICogcFNyY1BvaW50c1sxXS55ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1syXS54ICogcFNyY1BvaW50c1syXS55KSAvIDMuMDsKKyAgICBkb3VibGUgZGJZdFhzID0gZG91YmxlKHBUZW1wbFBvaW50c1swXS55ICogcFNyY1BvaW50c1swXS54ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1sxXS55ICogcFNyY1BvaW50c1sxXS54ICsgCisgICAgICAgIHBUZW1wbFBvaW50c1syXS55ICogcFNyY1BvaW50c1syXS54ICkgLyAzLjA7CisgICAgCisgICAgZGJYdFh0IC09IGRiWHQgKiBkYlh0OworICAgIGRiWXRZdCAtPSBkYll0ICogZGJZdDsKKyAgICAKKyAgICBkYlhzWHMgLT0gZGJYcyAqIGRiWHM7CisgICAgZGJZc1lzIC09IGRiWXMgKiBkYllzOworICAgIAorICAgIGRiWHRYcyAtPSBkYlh0ICogZGJYczsKKyAgICBkYll0WXMgLT0gZGJZdCAqIGRiWXM7CisgICAgCisgICAgZGJYdFlzIC09IGRiWHQgKiBkYllzOworICAgIGRiWXRYcyAtPSBkYll0ICogZGJYczsKKyAgICAKKyAgICBkb3VibGUgZGVsID0gZGJYc1hzICsgZGJZc1lzOworICAgIGlmKCBkZWwgIT0gMCApCisgICAgICAgIGRiTE1TID0gZGJYdFh0ICsgZGJZdFl0IC0gKChkb3VibGUpcG93KGRiWHRYcyArIGRiWXRZcywyKSArIChkb3VibGUpcG93KGRiWHRZcyAtIGRiWXRYcywyKSkgLyBkZWw7CisgICAgcmV0dXJuIGRiTE1TOworfQorCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvY3Z2aWRlby5jcHAgYi9jdmF1eC9zcmMvY3Z2aWRlby5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjMDIyYQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9jdnZpZGVvLmNwcApAQCAtMCwwICsxLDg0IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgorCitDVl9JTVBMIHZvaWQKK2N2RGVJbnRlcmxhY2UoIGNvbnN0IEN2QXJyKiBmcmFtZWFyciwgQ3ZBcnIqIGZpZWxkRXZlbiwgQ3ZBcnIqIGZpZWxkT2RkICkKK3sKKyAgICBDVl9GVU5DTkFNRSgiY3ZEZUludGVybGFjZSIpOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IGZyYW1lX3N0dWIsICpmcmFtZSA9IChDdk1hdCopZnJhbWVhcnI7CisgICAgQ3ZNYXQgZXZlbl9zdHViLCAqZXZlbiA9IChDdk1hdCopZmllbGRFdmVuOworICAgIEN2TWF0IG9kZF9zdHViLCAqb2RkID0gKEN2TWF0KilmaWVsZE9kZDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgeTsKKworICAgIENWX0NBTEwoIGZyYW1lID0gY3ZHZXRNYXQoIGZyYW1lLCAmZnJhbWVfc3R1YiApKTsKKyAgICBDVl9DQUxMKCBldmVuID0gY3ZHZXRNYXQoIGV2ZW4sICZldmVuX3N0dWIgKSk7CisgICAgQ1ZfQ0FMTCggb2RkID0gY3ZHZXRNYXQoIG9kZCwgJm9kZF9zdHViICkpOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIGZyYW1lLCBldmVuICkgfHwgIUNWX0FSRV9UWVBFU19FUSggZnJhbWUsIG9kZCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIkFsbCB0aGUgaW5wdXQgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIiApOworCisgICAgaWYoIGZyYW1lLT5jb2xzICE9IGV2ZW4tPmNvbHMgfHwgZnJhbWUtPmNvbHMgIT0gb2RkLT5jb2xzIHx8CisgICAgICAgIGZyYW1lLT5yb3dzICE9IGV2ZW4tPnJvd3MqMiB8fCBvZGQtPnJvd3MgIT0gZXZlbi0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlVuY29ycmVsYXRlZCBzaXplcyBvZiB0aGUgaW5wdXQgaW1hZ2UgYW5kIG91dHB1dCBmaWVsZHMiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBldmVuICk7CisgICAgc2l6ZS53aWR0aCAqPSBDVl9FTEVNX1NJWkUoIGV2ZW4tPnR5cGUgKTsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIG1lbWNweSggZXZlbi0+ZGF0YS5wdHIgKyBldmVuLT5zdGVwKnksCisgICAgICAgICAgICAgICAgZnJhbWUtPmRhdGEucHRyICsgZnJhbWUtPnN0ZXAqeSoyLCBzaXplLndpZHRoICk7CisgICAgICAgIG1lbWNweSggb2RkLT5kYXRhLnB0ciArIGV2ZW4tPnN0ZXAqeSwKKyAgICAgICAgICAgICAgICBmcmFtZS0+ZGF0YS5wdHIgKyBmcmFtZS0+c3RlcCooeSoyKzEpLCBzaXplLndpZHRoICk7CisgICAgfSAgCisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KKworCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvZGVjb21wcG9seS5jcHAgYi9jdmF1eC9zcmMvZGVjb21wcG9seS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEzYTM3OAotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9kZWNvbXBwb2x5LmNwcApAQCAtMCwwICsxLDYyOSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2lmIDAKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorLy8jaW5jbHVkZSAiZGVjb21wcG9seS5oIgorCisjZGVmaW5lIFpFUk9fQ0xPU0UgMC4wMDAwMWYKKyNkZWZpbmUgT05FX0NMT1NFICAwLjk5OTk5ZgorCisjZGVmaW5lIENIRUNLX0NPTExJTkVBUklUWSh2ZWMxX3gsdmVjMV95LHZlYzJfeCx2ZWMyX3kpIFwKKyAgICBpZiggdmVjMV94ID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggdmVjMV95ICogdmVjMl95ID4gMCApIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHZlYzFfeCAqIHZlYzJfeCA+IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIGRldGVybWluZXMgaWYgZWRnZSBudW1iZXIgb25lIGxpZXMgaW4gY291bnRlcmNsb2Nrd2lzZQorLy8gIGVhcmxpZXIgdGhhbiBlZGdlIG51bWJlciB0d28KK2lubGluZSBpbnQgIGljdklzRmlyc3RFZGdlQ2xvc2llciggaW50IHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5MV9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4Ml9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5Ml9lbmQgKQoreworICAgIGludCBtdWx0LCBtdWx0MSwgbXVsdDI7CisgICAgaW50IHZlYzBfeCwgdmVjMF95OworICAgIGludCB2ZWMxX3gsIHZlYzFfeTsKKyAgICBpbnQgdmVjMl94LCB2ZWMyX3k7CisKKyAgICB2ZWMwX3ggPSB4MF9lbmQgLSB4MDsKKyAgICB2ZWMwX3kgPSB5MF9lbmQgLSB5MDsKKyAgICB2ZWMxX3ggPSB4MV9lbmQgLSB4MDsKKyAgICB2ZWMxX3kgPSB5MV9lbmQgLSB5MDsKKyAgICB2ZWMyX3ggPSB4Ml9lbmQgLSB4MDsKKyAgICB2ZWMyX3kgPSB5Ml9lbmQgLSB5MDsKKworICAgIG11bHQxID0gdmVjMV94ICogdmVjMF95IC0gdmVjMF94ICogdmVjMV95OworICAgIG11bHQyID0gdmVjMl94ICogdmVjMF95IC0gdmVjMF94ICogdmVjMl95OworCisgICAgaWYoIG11bHQxID09IDAgKSB7CisgICAgICAgIENIRUNLX0NPTExJTkVBUklUWSggdmVjMF94LCB2ZWMwX3ksIHZlYzFfeCwgdmVjMV95ICk7CisgICAgfQorICAgIGlmKCBtdWx0MiA9PSAwICkgeworICAgICAgICBDSEVDS19DT0xMSU5FQVJJVFkoIHZlYzBfeCwgdmVjMF95LCB2ZWMyX3gsIHZlYzJfeSApOworICAgIH0KKyAgICBpZiggbXVsdDEgPiAwICYmIG11bHQyIDwgMCApIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCBtdWx0MSA8IDAgJiYgbXVsdDIgPiAwICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgbXVsdCA9IHZlYzFfeCAqIHZlYzJfeSAtIHZlYzJfeCAqIHZlYzFfeTsKKyAgICBpZiggbXVsdCA9PSAwICkgeworICAgICAgICBDSEVDS19DT0xMSU5FQVJJVFkoIHZlYzFfeCwgdmVjMV95LCB2ZWMyX3gsIHZlYzJfeSApOworICAgIH0KKworICAgIGlmKCBtdWx0MSA+IDAgKQorICAgIHsKKyAgICAgICAgaWYoIG11bHQgPiAwICkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9IC8vIGlmKCBtdWx0MSA+IDAgKQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBtdWx0MSAhPSAwICkgeworICAgICAgICAgICAgaWYoIG11bHQgPiAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGlmKCBtdWx0MSAhPSAwICkKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiggbXVsdDIgPiAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICB9IC8vIGlmKCBtdWx0MSAhPSAwICkgZWxzZQorCisgICAgfSAvLyBpZiggbXVsdDEgPiAwICkgZWxzZQorCit9IC8vIGljdklzRmlyc3RFZGdlQ2xvc2llcgorCitib29sIGljdkVhckN1dFRyaWFuZ3VsYXRpb24oIEN2UG9pbnQqIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dEVkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbnVtRWRnZXMgKQoreworICAgIGludCBpOworICAgIGludCBub3RGb3VuZEZsYWcgPSAwOworICAgIGludCBiZWdJbmRleCA9IC0xOworICAgIGludCBpc0ludGVybmFsOworICAgIGludCBjdXJyZW50TnVtID0gbnVtOworICAgIGludCBpbmRleDEsIGluZGV4MiwgaW5kZXgzOworICAgIGludCBpeDAsIGl5MCwgaXgxLCBpeTEsIGl4MiwgaXkyOworICAgIGludCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzOworICAgIGludCBkeDEsIGR5MSwgZHgyLCBkeTI7CisgICAgaW50KiBwb2ludEV4aXN0ID0gKCBpbnQqICkwOworICAgIGludCBkZXQsIGRldDEsIGRldDI7CisgICAgZmxvYXQgdDEsIHQyOworCisgICAgKCpudW1FZGdlcykgPSAwOworCisgICAgaWYoIG51bSA8PSAyICkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcG9pbnRFeGlzdCA9ICggaW50KiApbWFsbG9jKCBudW0gKiBzaXplb2YoIGludCApICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtOyBpICsrICkgeworICAgICAgICBwb2ludEV4aXN0W2ldID0gMTsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtOyBpICsrICkgeworICAgICAgICBvdXRFZGdlc1sgKCpudW1FZGdlcykgKiAyIF0gPSBpOworICAgICAgICBpZiggaSAhPSBudW0gLSAxICkgeworICAgICAgICAgICAgb3V0RWRnZXNbICgqbnVtRWRnZXMpICogMiArIDEgXSA9IGkgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgb3V0RWRnZXNbICgqbnVtRWRnZXMpICogMiArIDEgXSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgKCpudW1FZGdlcykgKys7CisgICAgfSAvLyBmb3IoIGkgPSAwOyBpIDwgbnVtOyBpICsrICkKKworICAgIC8vIGluaXRpYWxpemluZyBkYXRhIGJlZm9yZSB3aGlsZSBjeWNsZQorICAgIGluZGV4MSA9IDA7CisgICAgaW5kZXgyID0gMTsKKyAgICBpbmRleDMgPSAyOworICAgIHgxID0gY29udG91clsgaW5kZXgxIF0ueDsKKyAgICB5MSA9IGNvbnRvdXJbIGluZGV4MSBdLnk7CisgICAgeDIgPSBjb250b3VyWyBpbmRleDIgXS54OworICAgIHkyID0gY29udG91clsgaW5kZXgyIF0ueTsKKyAgICB4MyA9IGNvbnRvdXJbIGluZGV4MyBdLng7CisgICAgeTMgPSBjb250b3VyWyBpbmRleDMgXS55OworCisgICAgd2hpbGUoIGN1cnJlbnROdW0gPiAzICkKKyAgICB7CisgICAgICAgIGR4MSA9IHgyIC0geDE7CisgICAgICAgIGR5MSA9IHkyIC0geTE7CisgICAgICAgIGR4MiA9IHgzIC0geDI7CisgICAgICAgIGR5MiA9IHkzIC0geTI7CisgICAgICAgIGlmKCBkeDEgKiBkeTIgLSBkeDIgKiBkeTEgPCAwICkgLy8gY29udmV4IGNvbmRpdGlvbgorICAgICAgICB7CisgICAgICAgICAgICAvLyBjaGVja2luZyBmb3Igbm9uY3Jvc3NpbmcgZWRnZQorICAgICAgICAgICAgaXgxID0geDMgLSB4MTsKKyAgICAgICAgICAgIGl5MSA9IHkzIC0geTE7CisgICAgICAgICAgICBpc0ludGVybmFsID0gMTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW07IGkgKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBpICE9IG51bSAtIDEgKSB7CisgICAgICAgICAgICAgICAgICAgIGl4MiA9IGNvbnRvdXJbIGkgKyAxIF0ueCAtIGNvbnRvdXJbIGkgXS54OworICAgICAgICAgICAgICAgICAgICBpeTIgPSBjb250b3VyWyBpICsgMSBdLnkgLSBjb250b3VyWyBpIF0ueTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGl4MiA9IGNvbnRvdXJbIDAgXS54IC0gY29udG91clsgaSBdLng7CisgICAgICAgICAgICAgICAgICAgIGl5MiA9IGNvbnRvdXJbIDAgXS55IC0gY29udG91clsgaSBdLnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGl4MCA9IGNvbnRvdXJbIGkgXS54IC0geDE7CisgICAgICAgICAgICAgICAgaXkwID0gY29udG91clsgaSBdLnkgLSB5MTsKKworICAgICAgICAgICAgICAgIGRldCAgPSBpeDIgKiBpeTEgLSBpeDEgKiBpeTI7CisgICAgICAgICAgICAgICAgZGV0MSA9IGl4MiAqIGl5MCAtIGl4MCAqIGl5MjsKKyAgICAgICAgICAgICAgICBpZiggZGV0ICE9IDAuMGYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdDEgPSAoICggZmxvYXQgKSggZGV0MSApICkgLyBkZXQ7CisgICAgICAgICAgICAgICAgICAgIGlmKCB0MSA+IFpFUk9fQ0xPU0UgJiYgdDEgPCBPTkVfQ0xPU0UgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXQyID0gaXgxICogaXkwIC0gaXgwICogaXkxOworICAgICAgICAgICAgICAgICAgICAgICAgdDIgPSAoICggZmxvYXQgKSggZGV0MiApICkgLyBkZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggdDIgPiBaRVJPX0NMT1NFICYmIHQyIDwgT05FX0NMT1NFICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJuYWwgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgIAorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmKCB0MSA+IFpFUk9fQ0xPU0UgJiYgdDEgPCBPTkVfQ0xPU0UgKQorCisgICAgICAgICAgICAgICAgfSAvLyBpZiggZGV0ICE9IDAuMGYgKQorCisgICAgICAgICAgICB9IC8vIGZvciggaSA9IDA7IGkgPCAoKm51bUVkZ2VzKTsgaSArKyApCisKKyAgICAgICAgICAgIGlmKCBpc0ludGVybmFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIGVkZ2UgaXMgaW50ZXJuYWwKKyAgICAgICAgICAgICAgICBub3RGb3VuZEZsYWcgPSAwOworICAgICAgICAgICAgICAgIG91dEVkZ2VzWyAoKm51bUVkZ2VzKSAqIDIgICAgIF0gPSBpbmRleDE7CisgICAgICAgICAgICAgICAgb3V0RWRnZXNbICgqbnVtRWRnZXMpICogMiArIDEgXSA9IGluZGV4MzsKKyAgICAgICAgICAgICAgICAoKm51bUVkZ2VzKSArKzsKKyAgICAgICAgICAgICAgICBwb2ludEV4aXN0WyBpbmRleDIgXSA9IDA7CisgICAgICAgICAgICAgICAgaW5kZXgyID0gaW5kZXgzOworICAgICAgICAgICAgICAgIHgyID0geDM7CisgICAgICAgICAgICAgICAgeTIgPSB5MzsKKyAgICAgICAgICAgICAgICBjdXJyZW50TnVtIC0tOworICAgICAgICAgICAgICAgIGlmKCBjdXJyZW50TnVtID49IDMgKSB7CisgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MyArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpbmRleDMgPT0gbnVtICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUoICFwb2ludEV4aXN0WyBpbmRleDMgXSApOworICAgICAgICAgICAgICAgICAgICB4MyA9IGNvbnRvdXJbIGluZGV4MyBdLng7CisgICAgICAgICAgICAgICAgICAgIHkzID0gY29udG91clsgaW5kZXgzIF0ueTsKKyAgICAgICAgICAgICAgICB9IC8vIGlmKCBjdXJyZW50TnVtID49IDMgKQorCisgICAgICAgICAgICB9IC8vIGlmKCBpc0ludGVybmFsICkKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgZWRnZSBpbnRlcnNlY3RzIHNvbWUgb3RoZXIgaW5pdGlhbCBlZGdlcworICAgICAgICAgICAgICAgIGlmKCAhbm90Rm91bmRGbGFnICkgeworICAgICAgICAgICAgICAgICAgICBub3RGb3VuZEZsYWcgPSAxOworICAgICAgICAgICAgICAgICAgICBiZWdJbmRleCA9IGluZGV4MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5kZXgxID0gaW5kZXgyOworICAgICAgICAgICAgICAgIHgxID0geDI7CisgICAgICAgICAgICAgICAgeTEgPSB5MjsKKyAgICAgICAgICAgICAgICBpbmRleDIgPSBpbmRleDM7CisgICAgICAgICAgICAgICAgeDIgPSB4MzsKKyAgICAgICAgICAgICAgICB5MiA9IHkzOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgzICsrOworICAgICAgICAgICAgICAgICAgICBpZiggaW5kZXgzID09IG51bSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4MyA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIGluZGV4MyA9PSBiZWdJbmRleCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwb2ludEV4aXN0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWUoIHBvaW50RXhpc3QgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gd2hpbGUoICFwb2ludEV4aXN0WyBpbmRleDMgXSApOworICAgICAgICAgICAgICAgIHgzID0gY29udG91clsgaW5kZXgzIF0ueDsKKyAgICAgICAgICAgICAgICB5MyA9IGNvbnRvdXJbIGluZGV4MyBdLnk7CisgICAgICAgICAgICB9IC8vIGlmKCBpc0ludGVybmFsICkgZWxzZQorCisgICAgICAgIH0gLy8gaWYoIGR4MSAqIGR5MiAtIGR4MiAqIGR5MSA8IDAgKQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhbm90Rm91bmRGbGFnICkgeworICAgICAgICAgICAgICAgIG5vdEZvdW5kRmxhZyA9IDE7CisgICAgICAgICAgICAgICAgYmVnSW5kZXggPSBpbmRleDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleDEgPSBpbmRleDI7CisgICAgICAgICAgICB4MSA9IHgyOworICAgICAgICAgICAgeTEgPSB5MjsKKyAgICAgICAgICAgIGluZGV4MiA9IGluZGV4MzsKKyAgICAgICAgICAgIHgyID0geDM7CisgICAgICAgICAgICB5MiA9IHkzOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGluZGV4MyArKzsKKyAgICAgICAgICAgICAgICBpZiggaW5kZXgzID09IG51bSApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5kZXgzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGluZGV4MyA9PSBiZWdJbmRleCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBvaW50RXhpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmVlKCBwb2ludEV4aXN0ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUoICFwb2ludEV4aXN0WyBpbmRleDMgXSApOworICAgICAgICAgICAgeDMgPSBjb250b3VyWyBpbmRleDMgXS54OworICAgICAgICAgICAgeTMgPSBjb250b3VyWyBpbmRleDMgXS55OworICAgICAgICB9IC8vIGlmKCBkeDEgKiBkeTIgLSBkeDIgKiBkeTEgPCAwICkgZWxzZQorCisgICAgfSAvLyB3aGlsZSggY3VycmVudE51bSA+IDMgKQorCisgICAgaWYoIHBvaW50RXhpc3QgKSB7CisgICAgICAgIGZyZWUoIHBvaW50RXhpc3QgKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKworfSAvLyBpY3ZFYXJDdXRUcmlhbmd1bGF0aW9uCisKK2lubGluZSBib29sIGljdkZpbmRUd29OZWlnaGJvdXJFZGdlcyggQ3ZQb2ludCogY29udG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBlZGdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUVkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnR4SWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFpbkVkZ2VJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogbGVmdEVkZ2VJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogcmlnaHRFZGdlSWR4ICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY29tcFJlczsKKyAgICBpbnQgdmVjMF94LCB2ZWMwX3k7CisgICAgaW50IHgwLCB5MCwgeDBfZW5kLCB5MF9lbmQ7CisgICAgaW50IHgxX2xlZnQgPSAwLCB5MV9sZWZ0ID0gMCwgeDFfcmlnaHQgPSAwLCB5MV9yaWdodCA9IDAsIHgyLCB5MjsKKworICAgICgqbGVmdEVkZ2VJZHgpICA9IC0xOworICAgICgqcmlnaHRFZGdlSWR4KSA9IC0xOworCisgICAgaWYoIGVkZ2VzWyBtYWluRWRnZUlkeCAqIDIgXSA9PSB2dHhJZHggKSB7CisgICAgICAgIHgwID0gY29udG91clsgdnR4SWR4IF0ueDsKKyAgICAgICAgeTAgPSBjb250b3VyWyB2dHhJZHggXS55OworICAgICAgICB4MF9lbmQgPSBjb250b3VyWyBlZGdlc1sgbWFpbkVkZ2VJZHggKiAyICsgMSBdIF0ueDsKKyAgICAgICAgeTBfZW5kID0gY29udG91clsgZWRnZXNbIG1haW5FZGdlSWR4ICogMiArIDEgXSBdLnk7CisgICAgICAgIHZlYzBfeCA9IHgwX2VuZCAtIHgwOworICAgICAgICB2ZWMwX3kgPSB5MF9lbmQgLSB5MDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8veDAgPSBjb250b3VyWyBlZGdlc1sgbWFpbkVkZ2VJZHggKiAyIF0gXS54OworICAgICAgICAvL3kwID0gY29udG91clsgZWRnZXNbIG1haW5FZGdlSWR4ICogMiBdIF0ueTsKKyAgICAgICAgLy94MF9lbmQgPSBjb250b3VyWyB2dHhJZHggXS54OworICAgICAgICAvL3kwX2VuZCA9IGNvbnRvdXJbIHZ0eElkeCBdLnk7CisgICAgICAgIHgwID0gY29udG91clsgdnR4SWR4IF0ueDsKKyAgICAgICAgeTAgPSBjb250b3VyWyB2dHhJZHggXS55OworICAgICAgICB4MF9lbmQgPSBjb250b3VyWyBlZGdlc1sgbWFpbkVkZ2VJZHggKiAyIF0gXS54OworICAgICAgICB5MF9lbmQgPSBjb250b3VyWyBlZGdlc1sgbWFpbkVkZ2VJZHggKiAyIF0gXS55OworICAgICAgICB2ZWMwX3ggPSB4MF9lbmQgLSB4MDsKKyAgICAgICAgdmVjMF95ID0geTBfZW5kIC0geTA7CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IG51bUVkZ2VzOyBpICsrICkKKyAgICB7CisgICAgICAgIGlmKCAoIGkgIT0gbWFpbkVkZ2VJZHggKSAmJgorICAgICAgICAgICAgKCBlZGdlc1sgaSAqIDIgXSA9PSB2dHhJZHggfHwgZWRnZXNbIGkgKiAyICsgMSBdID09IHZ0eElkeCApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICgqbGVmdEVkZ2VJZHgpID09IC0xICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKmxlZnRFZGdlSWR4KSA9ICgqcmlnaHRFZGdlSWR4KSA9IGk7CisgICAgICAgICAgICAgICAgaWYoIGVkZ2VzWyBpICogMiBdID09IHZ0eElkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgeDFfbGVmdCA9IHgxX3JpZ2h0ID0gY29udG91clsgZWRnZXNbIGkgKiAyICsgMSBdIF0ueDsKKyAgICAgICAgICAgICAgICAgICAgeTFfbGVmdCA9IHkxX3JpZ2h0ID0gY29udG91clsgZWRnZXNbIGkgKiAyICsgMSBdIF0ueTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHgxX2xlZnQgPSB4MV9yaWdodCA9IGNvbnRvdXJbIGVkZ2VzWyBpICogMiBdIF0ueDsKKyAgICAgICAgICAgICAgICAgICAgeTFfbGVmdCA9IHkxX3JpZ2h0ID0gY29udG91clsgZWRnZXNbIGkgKiAyIF0gXS55OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSAvLyBpZiggKCpsZWZ0RWRnZUlkeCkgPT0gLTEgKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBlZGdlc1sgaSAqIDIgXSA9PSB2dHhJZHggKSB7CisgICAgICAgICAgICAgICAgICAgIHgyID0gY29udG91clsgZWRnZXNbIGkgKiAyICsgMSBdIF0ueDsKKyAgICAgICAgICAgICAgICAgICAgeTIgPSBjb250b3VyWyBlZGdlc1sgaSAqIDIgKyAxIF0gXS55OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgeDIgPSBjb250b3VyWyBlZGdlc1sgaSAqIDIgXSBdLng7CisgICAgICAgICAgICAgICAgICAgIHkyID0gY29udG91clsgZWRnZXNbIGkgKiAyIF0gXS55OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbXBSZXMgPSBpY3ZJc0ZpcnN0RWRnZUNsb3NpZXIoIHgwLAorICAgICAgICAgICAgICAgICAgICB5MCwgeDBfZW5kLCB5MF9lbmQsIHgxX2xlZnQsIHkxX2xlZnQsIHgyLCB5MiApOworICAgICAgICAgICAgICAgIGlmKCBjb21wUmVzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGNvbXBSZXMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICgqbGVmdEVkZ2VJZHgpID0gaTsKKyAgICAgICAgICAgICAgICAgICAgeDFfbGVmdCA9IHgyOworICAgICAgICAgICAgICAgICAgICB5MV9sZWZ0ID0geTI7CisgICAgICAgICAgICAgICAgfSAvLyBpZiggY29tcFJlcyA9PSAtMSApCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBSZXMgPSBpY3ZJc0ZpcnN0RWRnZUNsb3NpZXIoIHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgeTAsIHgwX2VuZCwgeTBfZW5kLCB4MV9yaWdodCwgeTFfcmlnaHQsIHgyLCB5MiApOworICAgICAgICAgICAgICAgICAgICBpZiggY29tcFJlcyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb21wUmVzID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJpZ2h0RWRnZUlkeCkgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgeDFfcmlnaHQgPSB4MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHkxX3JpZ2h0ID0geTI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gLy8gaWYoIGNvbXBSZXMgPT0gLTEgKSBlbHNlCisKKyAgICAgICAgICAgIH0gLy8gaWYoICgqbGVmdEVkZ2VJZHgpID09IC0xICkgZWxzZQorCisgICAgICAgIH0gLy8gaWYoICggaSAhPSBtYWluRWRnZXNJZHggKSAmJiAuLi4KKworICAgIH0gLy8gZm9yKCBpID0gMDsgaSA8IG51bUVkZ2VzOyBpICsrICkKKworICAgIHJldHVybiB0cnVlOworCit9IC8vIGljdkZpbmRUd29OZWlnaGJvdXJFZGdlcworCitib29sIGljdkZpbmRSZWZlcmVuY2VzKCBDdlBvaW50KiBjb250b3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0RWRnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHJlZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBudW1FZGdlcyApCit7CisgICAgaW50IGk7CisgICAgaW50IGN1cnJQbnRJZHg7CisgICAgaW50IGxlZnRFZGdlSWR4LCByaWdodEVkZ2VJZHg7CisKKyAgICBpZiggaWN2RWFyQ3V0VHJpYW5ndWxhdGlvbiggY29udG91ciwgbnVtLCBvdXRFZGdlcywgbnVtRWRnZXMgKSApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgKCpudW1FZGdlcyk7IGkgKysgKQorICAgICAgICB7CisgICAgICAgICAgICByZWZlclsgaSAqIDQgICAgIF0gPSAtMTsKKyAgICAgICAgICAgIHJlZmVyWyBpICogNCArIDEgXSA9IC0xOworICAgICAgICAgICAgcmVmZXJbIGkgKiA0ICsgMiBdID0gLTE7CisgICAgICAgICAgICByZWZlclsgaSAqIDQgKyAzIF0gPSAtMTsKKyAgICAgICAgfSAvLyBmb3IoIGkgPSAwOyBpIDwgKCpudW1FZGdlcyk7IGkgKysgKQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAoKm51bUVkZ2VzKTsgaSArKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN1cnJQbnRJZHggPSBvdXRFZGdlc1sgaSAqIDIgXTsKKyAgICAgICAgICAgIGlmKCAhaWN2RmluZFR3b05laWdoYm91ckVkZ2VzKCBjb250b3VyLAorICAgICAgICAgICAgICAgIG91dEVkZ2VzLCAoKm51bUVkZ2VzKSwgY3VyclBudElkeCwKKyAgICAgICAgICAgICAgICBpLCAmbGVmdEVkZ2VJZHgsICZyaWdodEVkZ2VJZHggKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSAvLyBpZiggIWljdkZpbmRUd29OZWlnaGJvdXJFZGdlcyggY29udG91ciwgLi4uCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG91dEVkZ2VzWyBsZWZ0RWRnZUlkeCAqIDIgXSA9PSBjdXJyUG50SWR4ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVmZXJbIGkgKiA0ICAgICBdID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJbIGkgKiA0ICAgICBdID0gKCBsZWZ0RWRnZUlkeCA8PCAyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZWZlclsgaSAqIDQgICAgIF0gPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZlclsgaSAqIDQgICAgIF0gPSAoIGxlZnRFZGdlSWR4IDw8IDIgKSB8IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG91dEVkZ2VzWyByaWdodEVkZ2VJZHggKiAyIF0gPT0gY3VyclBudElkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlZmVyWyBpICogNCArIDEgXSA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyWyBpICogNCArIDEgXSA9ICggcmlnaHRFZGdlSWR4IDw8IDIgKSB8IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZWZlclsgaSAqIDQgKyAxIF0gPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZlclsgaSAqIDQgKyAxIF0gPSAoIHJpZ2h0RWRnZUlkeCA8PCAyICkgfCAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IC8vIGlmKCAhaWN2RmluZFR3b05laWdoYm91ckVkZ2VzKCBjb250b3VyLCAuLi4gKSBlbHNlCisKKyAgICAgICAgICAgIGN1cnJQbnRJZHggPSBvdXRFZGdlc1sgaSAqIDIgKyAxIF07CisgICAgICAgICAgICBpZiggaSA9PSAxOCApIHsKKyAgICAgICAgICAgICAgICBpID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhaWN2RmluZFR3b05laWdoYm91ckVkZ2VzKCBjb250b3VyLAorICAgICAgICAgICAgICAgIG91dEVkZ2VzLCAoKm51bUVkZ2VzKSwgY3VyclBudElkeCwKKyAgICAgICAgICAgICAgICBpLCAmbGVmdEVkZ2VJZHgsICZyaWdodEVkZ2VJZHggKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSAvLyBpZiggIWljdkZpbmRUd29OZWlnaGJvdXJFZGdlcyggY29udG91ciwgLi4uCisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG91dEVkZ2VzWyBsZWZ0RWRnZUlkeCAqIDIgXSA9PSBjdXJyUG50SWR4ICkgeworICAgICAgICAgICAgICAgICAgICBpZiggcmVmZXJbIGkgKiA0ICsgMyBdID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJbIGkgKiA0ICsgMyBdID0gKCBsZWZ0RWRnZUlkeCA8PCAyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZWZlclsgaSAqIDQgKyAzIF0gPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZlclsgaSAqIDQgKyAzIF0gPSAoIGxlZnRFZGdlSWR4IDw8IDIgKSB8IDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG91dEVkZ2VzWyByaWdodEVkZ2VJZHggKiAyIF0gPT0gY3VyclBudElkeCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlZmVyWyBpICogNCArIDIgXSA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyWyBpICogNCArIDIgXSA9ICggcmlnaHRFZGdlSWR4IDw8IDIgKSB8IDM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCByZWZlclsgaSAqIDQgKyAyIF0gPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWZlclsgaSAqIDQgKyAyIF0gPSAoIHJpZ2h0RWRnZUlkeCA8PCAyICkgfCAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IC8vIGlmKCAhaWN2RmluZFR3b05laWdoYm91ckVkZ2VzKCBjb250b3VyLCAuLi4gKSBlbHNlCisKKyAgICAgICAgfSAvLyBmb3IoIGkgPSAwOyBpIDwgKCpudW1FZGdlcyk7IGkgKysgKQorCisgICAgfSAvLyBpZiggaWN2RWFyQ3V0VHJpYW5ndWxhdGlvbiggY29udG91ciwgbnVtLCBvdXRFZGdlcywgbnVtRWRnZXMgKSApCisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IC8vIGlmKCBpY3ZFYXJDdXRUcmlhbmd1bGF0aW9uKCBjb250b3VyLCBudW0sIG91dEVkZ2VzLCAuLi4gKSBlbHNlCisKKyAgICByZXR1cm4gdHJ1ZTsKKworfSAvLyBpY3ZGaW5kUmVmZXJlbmNlcworCit2b2lkIGN2RGVjb21wUG9seSggQ3ZDb250b3VyKiBjb250LAorICAgICAgICAgICAgICAgICAgICAgIEN2U3ViZGl2MkQqKiBzdWJkaXYsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBpbnQqICAgIG1lbW9yeTsKKyAgICBDdlBvaW50KiAgICBjb250b3VyOworICAgIGludCogICAgICAgIG91dEVkZ2VzOworICAgIGludCogICAgICAgIHJlZmVyOworICAgIEN2U3ViZGl2MkRQb2ludCoqICAgcG50c1B0cnM7CisgICAgQ3ZRdWFkRWRnZTJEKiogICAgICBlZGdlc1B0cnM7CisgICAgaW50IG51bVZ0eDsKKyAgICBpbnQgbnVtRWRnZXM7CisgICAgaW50IGk7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2UG9pbnQyRDMyZiBwbnQ7CisgICAgQ3ZRdWFkRWRnZTJEKiBxdWFkRWRnZTsKKyAgICAKKyAgICBudW1WdHggPSBjb250IC0+IHRvdGFsOworICAgIGlmKCBudW1WdHggPCAzICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKnN1YmRpdiA9ICggQ3ZTdWJkaXYyRCogKTA7CisKKyAgICBtZW1vcnkgPSAoIGludCogKW1hbGxvYyggc2l6ZW9mKCBpbnQgKSAqICggbnVtVnR4ICogMgorICAgICAgICArIG51bVZ0eCAqIG51bVZ0eCAqIDIgKiA1ICkKKyAgICAgICAgKyBzaXplb2YoIEN2UXVhZEVkZ2UyRCogKSAqICggbnVtVnR4ICogbnVtVnR4ICkKKyAgICAgICAgKyBzaXplb2YoIEN2U3ViZGl2MkRQb2ludCogKSAqICggbnVtVnR4ICogMiApICk7CisgICAgY29udG91ciAgICAgPSAoIEN2UG9pbnQqICltZW1vcnk7CisgICAgb3V0RWRnZXMgICAgPSAoIGludCogKSggY29udG91ciArIG51bVZ0eCApOworICAgIHJlZmVyICAgICAgID0gb3V0RWRnZXMgKyBudW1WdHggKiBudW1WdHggKiAyOworICAgIGVkZ2VzUHRycyAgID0gKCBDdlF1YWRFZGdlMkQqKiApKCByZWZlciArIG51bVZ0eCAqIG51bVZ0eCAqIDQgKTsKKyAgICBwbnRzUHRycyAgICA9ICggQ3ZTdWJkaXYyRFBvaW50KiogKSggZWRnZXNQdHJzICsgbnVtVnR4ICogbnVtVnR4ICk7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggKCBDdlNlcSogKWNvbnQsICZyZWFkZXIsIDAgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtVnR4OyBpICsrICkKKyAgICB7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIChjb250b3VyWyBpIF0pLCByZWFkZXIgKTsKKyAgICB9IC8vIGZvciggaSA9IDA7IGkgPCBudW1WdHg7IGkgKysgKQorCisgICAgaWYoICFpY3ZGaW5kUmVmZXJlbmNlcyggY29udG91ciwgbnVtVnR4LCBvdXRFZGdlcywgcmVmZXIsICZudW1FZGdlcyApICkKKyAgICB7CisgICAgICAgIGZyZWUoIG1lbW9yeSApOworICAgICAgICByZXR1cm47CisgICAgfSAvLyBpZiggIWljdkZpbmRSZWZlcmVuY2VzKCBjb250b3VyLCBudW1WdHgsIG91dEVkZ2VzLCByZWZlciwgLi4uCisKKyAgICAqc3ViZGl2ID0gY3ZDcmVhdGVTdWJkaXYyRCggQ1ZfU0VRX0tJTkRfU1VCRElWMkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZTdWJkaXYyRCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIEN2U3ViZGl2MkRQb2ludCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIEN2UXVhZEVkZ2UyRCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtVnR4OyBpICsrICkKKyAgICB7CisgICAgICAgIHBudC54ID0gKCBmbG9hdCApY29udG91clsgaSBdLng7CisgICAgICAgIHBudC55ID0gKCBmbG9hdCApY29udG91clsgaSBdLnk7CisgICAgICAgIHBudHNQdHJzWyBpIF0gPSBjdlN1YmRpdjJEQWRkUG9pbnQoICpzdWJkaXYsIHBudCwgMCApOworICAgIH0gLy8gZm9yKCBpID0gMDsgaSA8IG51bVZ0eDsgaSArKyApCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtRWRnZXM7IGkgKysgKQorICAgIHsKKyAgICAgICAgZWRnZXNQdHJzWyBpIF0gPSAoIEN2UXVhZEVkZ2UyRCogKQorICAgICAgICAgICAgKCBjdlN1YmRpdjJETWFrZUVkZ2UoICpzdWJkaXYgKSAmIDB4ZmZmZmZmZmMgKTsKKyAgICB9IC8vIGZvciggaSA9IDA7IGkgPCBudW1FZGdlczsgaSArKyApCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtRWRnZXM7IGkgKysgKQorICAgIHsKKyAgICAgICAgcXVhZEVkZ2UgPSBlZGdlc1B0cnNbIGkgXTsKKyAgICAgICAgcXVhZEVkZ2UgLT4gbmV4dFsgMCBdID0KKyAgICAgICAgICAgICggKCBDdlN1YmRpdjJERWRnZSApZWRnZXNQdHJzWyByZWZlclsgaSAqIDQgICAgIF0gPj4gMiBdICkKKyAgICAgICAgICAgIHwgKCByZWZlclsgaSAqIDQgICAgIF0gJiAzICk7CisgICAgICAgIHF1YWRFZGdlIC0+IG5leHRbIDEgXSA9CisgICAgICAgICAgICAoICggQ3ZTdWJkaXYyREVkZ2UgKWVkZ2VzUHRyc1sgcmVmZXJbIGkgKiA0ICsgMSBdID4+IDIgXSApCisgICAgICAgICAgICB8ICggcmVmZXJbIGkgKiA0ICsgMSBdICYgMyApOworICAgICAgICBxdWFkRWRnZSAtPiBuZXh0WyAyIF0gPQorICAgICAgICAgICAgKCAoIEN2U3ViZGl2MkRFZGdlICllZGdlc1B0cnNbIHJlZmVyWyBpICogNCArIDIgXSA+PiAyIF0gKQorICAgICAgICAgICAgfCAoIHJlZmVyWyBpICogNCArIDIgXSAmIDMgKTsKKyAgICAgICAgcXVhZEVkZ2UgLT4gbmV4dFsgMyBdID0KKyAgICAgICAgICAgICggKCBDdlN1YmRpdjJERWRnZSApZWRnZXNQdHJzWyByZWZlclsgaSAqIDQgKyAzIF0gPj4gMiBdICkKKyAgICAgICAgICAgIHwgKCByZWZlclsgaSAqIDQgKyAzIF0gJiAzICk7CisgICAgICAgIHF1YWRFZGdlIC0+IHB0WyAwIF0gPSBwbnRzUHRyc1sgb3V0RWRnZXNbIGkgKiAyICAgICBdIF07CisgICAgICAgIHF1YWRFZGdlIC0+IHB0WyAxIF0gPSAoIEN2U3ViZGl2MkRQb2ludCogKTA7CisgICAgICAgIHF1YWRFZGdlIC0+IHB0WyAyIF0gPSBwbnRzUHRyc1sgb3V0RWRnZXNbIGkgKiAyICsgMSBdIF07CisgICAgICAgIHF1YWRFZGdlIC0+IHB0WyAzIF0gPSAoIEN2U3ViZGl2MkRQb2ludCogKTA7CisgICAgfSAvLyBmb3IoIGkgPSAwOyBpIDwgbnVtRWRnZXM7IGkgKysgKQorCisgICAgKCpzdWJkaXYpIC0+IHRvcGxlZnQueCA9ICggZmxvYXQgKWNvbnQgLT4gcmVjdC54OworICAgICgqc3ViZGl2KSAtPiB0b3BsZWZ0LnkgPSAoIGZsb2F0ICljb250IC0+IHJlY3QueTsKKyAgICAoKnN1YmRpdikgLT4gYm90dG9tcmlnaHQueCA9CisgICAgICAgICggZmxvYXQgKSggY29udCAtPiByZWN0LnggKyBjb250IC0+IHJlY3Qud2lkdGggKTsKKyAgICAoKnN1YmRpdikgLT4gYm90dG9tcmlnaHQueSA9CisgICAgICAgICggZmxvYXQgKSggY29udCAtPiByZWN0LnkgKyBjb250IC0+IHJlY3QuaGVpZ2h0ICk7CisKKyAgICBmcmVlKCBtZW1vcnkgKTsKKyAgICByZXR1cm47CisKK30gLy8gY3ZEZWNvbXBQb2x5CisKKyNlbmRpZgorCisvLyBFbmQgb2YgZmlsZSBkZWNvbXBwb2x5LmNwcAorCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvZW5taW4uY3BwIGIvY3ZhdXgvc3JjL2VubWluLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDgzMzgwCi0tLSAvZGV2L251bGwKKysrIGIvY3ZhdXgvc3JjL2VubWluLmNwcApAQCAtMCwwICsxLDEzODEgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N2YXV4LmgiCisKKyNpZiAwCisKKy8vI2luY2x1ZGUgIndpbmRvd3MuaCIKKworLy8jZGVmaW5lIEFMUEhBX0VYUEFOU0lPTgorCisjaWZuZGVmIEFMUEhBX0VYUEFOU0lPTgorICAgICNkZWZpbmUgQUxQSEFfQkVUQV9FWENIQU5HRQorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0xBQkVMIDIwCisKKyNkZWZpbmUgQ1ZfTU9EVUxFKHh4eCkgXAorICAgICggKHh4eCkgPCAwID8gLSh4eHgpIDogKHh4eCkgKQorCisjZGVmaW5lIENWX01BWDMoeHh4MSx4eHgyLHh4eDMpIFwKKyAgICAoICh4eHgxKSA+ICh4eHgyKSAmJiAoeHh4MSkgPiAoeHh4MykgPyAoeHh4MSkgOiBcCisgICAgICAgICh4eHgyKSA+ICh4eHgzKSA/ICh4eHgyKSA6ICh4eHgzKSApCisKKyNkZWZpbmUgQ1ZfTUlOMih4eHgxLHh4eDIpIFwKKyAgICAoICh4eHgxKSA8ICh4eHgyKSA/ICh4eHgxKSA6ICh4eHgyKSApCisKKyNkZWZpbmUgZ2V0U2l6ZUZvckdyYXBoKHh4eFR5cGUpIFwKKyAgICAoIHNpemVvZih4eHhUeXBlKSA8IDggPyA4IDogc2l6ZW9mKHh4eFR5cGUpICsgNCAtIHNpemVvZih4eHhUeXBlKSAlIDQgKQorCisjZGVmaW5lIElOVF9JTkZJTklUWSAxMDAwMDAwMDAwCisjZGVmaW5lIE1BWF9ESUZGRVJFTkNFIDEwCisKKworLy8gc3RydWN0IFZlcnRleCBpcyB1c2VkIGZvciBzdG9yaW5nIHZlcnRpY2VzIG9mIGdyYXBoCisvLyAgICAgIGNvb3JkICAgICAgIC0gY29vcmRpbmF0ZSBjb3JyZXNwb25kaW5nIHBpeGVsIG9uIHRoZSByZWFsIGltYWdlIGxpbmUKK3N0cnVjdCBWZXJ0ZXgKK3sKKyAgICBDdkdyYXBoVnR4IHZ0eDsKKyAgICBpbnQgY29vcmQ7Cit9OworCisvLyBzdHJ1Y3QgRWRnZSBpcyB1c2VkIGZvciBzdG9yaW5nIGVkZ2VzIG9mIGdyYXBoCisvLyAgICAgIHdlaWdodCAgICAgIC0gd2VpZ2h0IG9mIHRoZSBlZGdlICggbWF4aW11bSBmbG93IHZpYSB0aGUgZWRnZSApCisvLyAgICAgIGZsb3cgICAgICAgIC0gY3VycmVudCBmbG93IHZpYSB0aGUgZWRnZQorLy8gICAgICBzcmNWdHggICAgICAtIGNvb3JkaW5hdGUgb2Ygc291cmNlIHZlcnRleCBvbiB0aGUgcmVhbCBpbWFnZSBsaW5lCisvLyAgICAgIGRlc3RWdHggICAgIC0gY29vcmRpbmF0ZSBvZiBkZXN0aW5hdGlvbiB2ZXJ0ZXggb24gdGhlIHJlYWwgaW1hZ2UgbGluZQorc3RydWN0IEVkZ2UKK3sKKyAgICBDVl9HUkFQSF9FREdFX0ZJRUxEUygpCisgICAgaW50IHdlaWdodDsKKyAgICBpbnQgZmxvdzsKKyAgICBpbnQgc3JjVnR4OworICAgIGludCBkZXN0VnR4OworfTsKKworLy8gZnVuY3Rpb24gdkZ1bmMgaXMgZW5lcmd5IGZ1bmN0aW9uIHdoaWNoIGRldGVybWluZXMgdGhlIGRpZmZlcmVuY2UKKy8vICAgYmV0d2VlbiB0d28gbGFiZWxzICggYWxwaGEgYW5kIGJldGEgKQorLy8gICAgICBhbHBoYSAgICAgICAtIGxhYmVsIG51bWJlciBvbmUKKy8vICAgICAgYmV0YSAgICAgICAgLSBsYWJlbCBudW1iZXIgdHdvCitpbmxpbmUgaW50IHZGdW5jKCBpbnQgYWxwaGEsIGludCBiZXRhICkKK3sKKyAgICBpZiggYWxwaGEgPT0gYmV0YSApCisgICAgICAgIHJldHVybiAwOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIC8qMSovLyo1Ki8xMDsKK30KKworLy8gZnVuY3Rpb24gZEZ1bmMgaXMgZW5lcmd5IGZ1bmN0aW9uIHdoaWNoIGRldGVybWluZXMgZW5lcmd5IG9mIGludGVyYWN0aW9uCisvLyAgIGJldHdlZW4gcGl4ZWwgKCBoYXZpbmcgY29vcmRpbmF0ZSB4Q29vcmQgKSBhbmQgbGFiZWwKKy8vICAgICAgICAgIGxlZnRMaW5lICAgICAgICAtIGxpbmUgb2YgbGVmdCBpbWFnZQorLy8gICAgICAgICAgcmlnaHRMaW5lICAgICAgIC0gbGluZSBvZiByaWdodCBpbWFnZQorLy8gICAgICAgICAgeENvb3JkICAgICAgICAgIC0gY29vcmRpbmF0ZSBvZiBwaXhlbCBvbiB0aGUgbGVmdCBpbWFnZQorLy8gICAgICAgICAgbGFiZWwgICAgICAgICAgIC0gbGFiZWwgY29ycmVzcG9uZGluZyB0byB0aGUgcGl4ZWwKKy8vICAgICAgICAgIHdpZHRoICAgICAgICAgICAtIHdpZHRoIG9mIHRoZSBpbWFnZSBsaW5lIGluIHBpeGVscworaW5saW5lIGludCBkRnVuYyggdW5zaWduZWQgY2hhciogbGVmdExpbmUsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiByaWdodExpbmUsCisgICAgICAgICAgICAgICAgICBpbnQgeENvb3JkLAorICAgICAgICAgICAgICAgICAgaW50IGxhYmVsLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoKQoreworICAgIGFzc2VydCggeENvb3JkID49IDAgJiYgeENvb3JkIDwgd2lkdGggKTsKKyAgICBpbnQgciwgZywgYjsKKyAgICBpbnQgeUNvb3JkID0geENvb3JkICsgbGFiZWw7CisKKyAgICBpZiggeUNvb3JkID49IHdpZHRoICkKKyAgICAgICAgeUNvb3JkID0gd2lkdGg7CisgICAgaWYoIHlDb29yZCA8IDAgKQorICAgICAgICB5Q29vcmQgPSAwOworCisgICAgciA9IGxlZnRMaW5lWyAzICogeENvb3JkICAgICBdIC0gcmlnaHRMaW5lWyAzICogeUNvb3JkICAgICBdOworICAgIGcgPSBsZWZ0TGluZVsgMyAqIHhDb29yZCArIDEgXSAtIHJpZ2h0TGluZVsgMyAqIHlDb29yZCArIDEgXTsKKyAgICBiID0gbGVmdExpbmVbIDMgKiB4Q29vcmQgKyAyIF0gLSByaWdodExpbmVbIDMgKiB5Q29vcmQgKyAyIF07CisKKyAgICByID0gQ1ZfTU9EVUxFKCByICk7CisgICAgZyA9IENWX01PRFVMRSggZyApOworICAgIGIgPSBDVl9NT0RVTEUoIGIgKTsKKworICAgIHJldHVybiBDVl9NQVgzKCByLCBnLCBiICk7Cit9CisKKy8vIGZ1bmN0aW9uIGFsbG9jVGVtcE1lbSBhbGxvY2F0ZXMgYWxsIHRlbXBvcmFyeSBtZW1vcnkgbmVlZGVkIGZvciB3b3JrCisvLyAgIG9mIHNvbWUgZnVuY3Rpb24KKy8vICAgICAgbWVtUHRyICAgICAgICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBsYXJnZSBibG9jayBvZiBtZW1vcnkKKy8vICAgICAgdmVydGljZXNQdHIgICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIGJsb2NrIG9mIG1lbW9yeSBmb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgdGVtcG9yYXJ5IHN0b3JpbmcgdmVydGljZXMKKy8vICAgICAgd2lkdGggICAgICAgICAgIC0gd2lkdGggb2YgbGluZSBpbiBwaXhlbHMKK3ZvaWQgYWxsb2NUZW1wTWVtKCBpbnQqKiBtZW1QdHIsCisgICAgICAgICAgICAgICAgICAgaW50KiogdmVydGljZXNQdHIsCisgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoICkKK3sKKyAgICBpbnQqIHRlbXBQdHIgPSAoIGludCogKSBtYWxsb2MoICggd2lkdGggKyAyICkgKiA3ICogc2l6ZW9mKCBpbnQgKSApOworICAgICp2ZXJ0aWNlc1B0ciA9IHRlbXBQdHI7CisgICAgKm1lbVB0ciA9ICp2ZXJ0aWNlc1B0ciArIHdpZHRoICsgMjsKK30KKworLy8gZnVuY3Rpb24gZnJlZVRlbXBNZW0gZnJlZXMgYWxsIGFsbG9jYXRlZCBieSBhbGxvY1RlbXBNZW0gZnVuY3Rpb24gbWVtb3J5CisvLyAgICAgIG1lbVB0ciAgICAgICAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgbGFyZ2UgYmxvY2sgb2YgbWVtb3J5CisvLyAgICAgIHZlcnRpY2VzUHRyICAgICAtIHBvaW50ZXIgdG8gcG9pbnRlciB0byBibG9jayBvZiBtZW1vcnkgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBzdG9yaW5nIHZlcnRpY2VzCit2b2lkIGZyZWVUZW1wTWVtKCBpbnQqKiBtZW1QdHIsCisgICAgICAgICAgICAgICAgICBpbnQqKiB2ZXJ0aWNlc1B0ciApCit7CisgICAgZnJlZSggKCB2b2lkKiApKCAqdmVydGljZXNQdHIgKSApOworICAgICp2ZXJ0aWNlc1B0ciA9IE5VTEw7CisgICAgKm1lbVB0ciA9IE5VTEw7Cit9CisKKy8vIGZ1bmN0aW9uIG1ha2VHcmFwaCBjcmVhdGVzIGluaXRpYWwgZ3JhcGggdG8gZmluZCBtYXhpbXVtIGZsb3cgaW4gaXQKKy8vICAgICAgZ3JhcGhQdHIgICAgICAgIC0gcG9pbnRlciB0byBwb2ludGVyIHRvIEN2R3JhcGggc3RydWN0dXJlIHRvIGJlIGZpbGxlZAorLy8gICAgICBsZWZ0TGluZSAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBsZWZ0IGltYWdlIGxpbmUKKy8vICAgICAgcmlnaHRMaW5lICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmlnaHQgaW1hZ2UgbGluZQorLy8gICAgICBhbHBoYSAgICAgICAgICAgLSBsYWJlbCBudW1iZXIgb25lIGZvciBkb2luZyBleGNoYW5nZQorLy8gICAgICBiZXRhICAgICAgICAgICAgLSBsYWJlbCBudW1iZXIgdHdvIGZvciBkb2luZyBleGNoYW5nZQorLy8gICAgICBjb3JyICAgICAgICAgICAgLSBwb2ludGVyIHRvIGFycmF5IG9mIGNvcnJlc3BvbmRlbmNlcyAoIGVhY2ggZWxlbWVudAorLy8gICAgICAgICAgICAgICAgICAgICAgICBvZiBhcnJheSBpbmNsdWRlcyBkaXNwYXJpdHkgb2YgcGl4ZWwgb24gcmlnaHQgaW1hZ2UKKy8vICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHBpeGVsIGVhY2ggb24gbGVmdCBpbWFnZSApLiBUaGlzIHBvaW50ZXIgZGlyZWN0CisvLyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNvcnJlc3BvbmRlbmNlIG9mciBvbmUgbGluZSBvbmx5CisvLyAgICAgIHdpZHRoICAgICAgICAgICAtIHdpZHRoIG9mIGltYWdlIGxpbmVzIGluIHBpeGVscworLy8gICAgICBzdG9yYWdlICAgICAgICAgLSBwb2ludGVyIHRvIEN2TWVtU3RvcmFnZSBzdHJ1Y3R1cmUgd2hpY2ggY29udGFpbnMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgbWVtb3J5IHN0b3JhZ2UKK3ZvaWQgbWFrZUdyYXBoKCBDdkdyYXBoKiogZ3JhcGhQdHIsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogbGVmdExpbmUsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcmlnaHRMaW5lLAorICAgICAgICAgICAgICAgIGludCBhbHBoYSwKKyAgICAgICAgICAgICAgICBpbnQgYmV0YSwKKyAgICAgICAgICAgICAgICBpbnQqIGNvcnIsCisgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgaW50IGk7CisKKyAgICBpZiggKmdyYXBoUHRyICkgIHsKKyAgICAgICAgY3ZDbGVhckdyYXBoKCAqZ3JhcGhQdHIgKTsKKyAgICB9CisgICAgLyplbHNlIHsqLworICAgICAgICAqZ3JhcGhQdHIgPSBjdkNyZWF0ZUdyYXBoKCBDVl9TRVFfS0lORF9HUkFQSCB8IENWX0dSQVBIX0ZMQUdfT1JJRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZHcmFwaCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXplRm9yR3JhcGgoIFZlcnRleCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXplRm9yR3JhcGgoIEVkZ2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSApOworICAgIC8qfSovCisKKyAgICBDdkdyYXBoKiBncmFwaCA9ICpncmFwaFB0cjsKKworICAgICNpZmRlZiBBTFBIQV9CRVRBX0VYQ0hBTkdFCisKKyAgICBDdkdyYXBoVnR4KiBuZXdWdHhQdHI7CisgICAgZm9yKCBpID0gMDsgaSA8IHdpZHRoOyBpICsrICkKKyAgICB7CisgICAgICAgIGlmKCBjb3JyW2ldID09IGFscGhhIHx8IGNvcnJbaV0gPT0gYmV0YSApIHsKKyAgICAgICAgICAgIGN2R3JhcGhBZGRWdHgoIGdyYXBoLCBOVUxMLCAmbmV3VnR4UHRyICk7CisgICAgICAgICAgICAoICggVmVydGV4KiApbmV3VnR4UHRyICkgLT4gY29vcmQgPSBpOworICAgICAgICB9CisgICAgfSAvKiBmb3IoIGkgPSAwOyBpIDwgd2lkdGg7IGkgKysgKSAqLworICAgIGN2R3JhcGhBZGRWdHgoIGdyYXBoLCBOVUxMLCAmbmV3VnR4UHRyICk7CisgICAgaWYoIG5ld1Z0eFB0ciApCisgICAgICAgICggKCBWZXJ0ZXgqICluZXdWdHhQdHIgKSAtPiBjb29yZCA9IC0yOyAvKiBhZGRpbmcgYWxwaGEgdmVydGV4ICovCisgICAgY3ZHcmFwaEFkZFZ0eCggZ3JhcGgsIE5VTEwsICZuZXdWdHhQdHIgKTsKKyAgICBpZiggbmV3VnR4UHRyICkKKyAgICAgICAgKCAoIFZlcnRleCogKW5ld1Z0eFB0ciApIC0+IGNvb3JkID0gLTE7IC8qIGFkZGluZyBiZXRhIHZlcnRleCAqLworCisgICAgaW50IGFscGhhVnR4ID0gZ3JhcGggLT4gdG90YWwgLSAyOworICAgIGludCBiZXRhVnR4ID0gZ3JhcGggLT4gdG90YWwgLSAxOworICAgIEN2R3JhcGhFZGdlKiBuZXdFZGdlUHRyOworICAgIEN2R3JhcGhWdHgqIHZ0eFB0cjsKKyAgICBpZiggZ3JhcGggLT4gdG90YWwgPiAyICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBhbHBoYVZ0eDsgaSArKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZ0eFB0ciA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBpICk7CisKKyAgICAgICAgICAgIC8qIGFkZGluZyBlZGdlIG9yaWVudGVkIGZyb20gYWxwaGEgdmVydGV4IHRvIGN1cnJlbnQgdmVydGV4ICovCisgICAgICAgICAgICBjdkdyYXBoQWRkRWRnZSggZ3JhcGgsIGFscGhhVnR4LCBpLCBOVUxMLCAmbmV3RWRnZVB0ciApOworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gd2VpZ2h0ID0gZEZ1bmMoIGxlZnRMaW5lLAorICAgICAgICAgICAgICAgIHJpZ2h0TGluZSwKKyAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQsCisgICAgICAgICAgICAgICAgYWxwaGEsCisgICAgICAgICAgICAgICAgd2lkdGggKTsKKyAgICAgICAgICAgICggKCBFZGdlKiApbmV3RWRnZVB0ciApIC0+IGZsb3cgPSAwOworICAgICAgICAgICAgaWYoIGkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiB0ZW1wVnR4UHRyID0gY3ZHZXRHcmFwaFZ0eCggZ3JhcGgsIGkgLSAxICk7CisgICAgICAgICAgICAgICAgLyogaWYgdmVydGljZXMgYXJlIG5laWdoYm91cnMgKi8KKyAgICAgICAgICAgICAgICBpZiggKCAoIFZlcnRleCogKXRlbXBWdHhQdHIgKSAtPiBjb29yZCArIDEgPT0KKyAgICAgICAgICAgICAgICAgICAgKCAoIFZlcnRleCogKXZ0eFB0ciApIC0+IGNvb3JkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApbmV3RWRnZVB0ciApIC0+IHdlaWdodCArPQorICAgICAgICAgICAgICAgICAgICAgICAgdkZ1bmMoIGNvcnJbICggKCBWZXJ0ZXgqICl0ZW1wVnR4UHRyICkgLT4gY29vcmQgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSApOworICAgICAgICAgICAgICAgICAgICAvKiBhZGRpbmcgbmVpZ2hib3VyIGVkZ2Ugb3JpZW50ZWQgZnJvbSBjdXJyZW50IHZlcnRleAorICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcHJldmlvdXMgb25lICovCisgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhFZGdlKiB0ZW1wRWRnZVB0cjsKKyAgICAgICAgICAgICAgICAgICAgY3ZHcmFwaEFkZEVkZ2UoIGdyYXBoLCBpLCBpIC0gMSwgTlVMTCwgJnRlbXBFZGdlUHRyICk7CisgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApdGVtcEVkZ2VQdHIgKSAtPiB3ZWlnaHQgPSB2RnVuYyggYWxwaGEsIGJldGEgKTsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wRWRnZVB0ciApIC0+IGZsb3cgPSAwOworICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBFZGdlUHRyICkgLT4gc3JjVnR4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICggKCBWZXJ0ZXgqICl2dHhQdHIgKSAtPiBjb29yZDsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wRWRnZVB0ciApIC0+IGRlc3RWdHggPQorICAgICAgICAgICAgICAgICAgICAgICAgKCAoIFZlcnRleCogKXRlbXBWdHhQdHIgKSAtPiBjb29yZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGlmKCBpICE9IDAgKSAqLworICAgICAgICAgICAgaWYoIGkgIT0gYWxwaGFWdHggLSAxICkgeworICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIHRlbXBWdHhQdHIgPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSArIDEgKTsKKyAgICAgICAgICAgICAgICAvKiBpZiB2ZXJ0aWNlcyBhcmUgbmVpZ2hib3VycyAqLworICAgICAgICAgICAgICAgIGlmKCAoICggVmVydGV4KiApdGVtcFZ0eFB0ciApIC0+IGNvb3JkIC0gMSA9PQorICAgICAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gd2VpZ2h0ICs9CisgICAgICAgICAgICAgICAgICAgICAgICB2RnVuYyggY29yclsgKCAoIFZlcnRleCogKXRlbXBWdHhQdHIgKSAtPiBjb29yZCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFscGhhICk7CisgICAgICAgICAgICAgICAgICAgIC8qIGFkZGluZyBuZWlnaGJvdXIgZWRnZSBvcmllbnRlZCBmcm9tIGN1cnJlbnQgdmVydGV4CisgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogdGVtcEVkZ2VQdHI7CisgICAgICAgICAgICAgICAgICAgIGN2R3JhcGhBZGRFZGdlKCBncmFwaCwgaSwgaSArIDEsIE5VTEwsICZ0ZW1wRWRnZVB0ciApOworICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBFZGdlUHRyICkgLT4gd2VpZ2h0ID0gdkZ1bmMoIGFscGhhLCBiZXRhICk7CisgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApdGVtcEVkZ2VQdHIgKSAtPiBmbG93ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wRWRnZVB0ciApIC0+IHNyY1Z0eCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQ7CisgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApdGVtcEVkZ2VQdHIgKSAtPiBkZXN0VnR4ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICggKCBWZXJ0ZXgqICl0ZW1wVnR4UHRyICkgLT4gY29vcmQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSAvKiBpZiggaSAhPSBhbHBoYVZ0eCAtIDEgKSAqLworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gZmxvdyA9IDA7CisgICAgICAgICAgICAoICggRWRnZSogKW5ld0VkZ2VQdHIgKSAtPiBzcmNWdHggPSAtMTsgLyogc291cmNlIHZlcnRleCBpcyBhbHBoYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleCAqLworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gZGVzdFZ0eCA9ICggKCBWZXJ0ZXgqICl2dHhQdHIgKSAtPiBjb29yZDsKKworICAgICAgICAgICAgLyogYWRkaW5nIGVkZ2Ugb3JpZW50ZWQgZnJvbSBjdXJyZW50IHZlcnRleCB0byBiZXRhIHZlcnRleCAqLworICAgICAgICAgICAgY3ZHcmFwaEFkZEVkZ2UoIGdyYXBoLCBpLCBiZXRhVnR4LCBOVUxMLCAmbmV3RWRnZVB0ciApOworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gd2VpZ2h0ID0gZEZ1bmMoIGxlZnRMaW5lLAorICAgICAgICAgICAgICAgIHJpZ2h0TGluZSwKKyAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQsCisgICAgICAgICAgICAgICAgYmV0YSwKKyAgICAgICAgICAgICAgICB3aWR0aCApOworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gZmxvdyA9IDA7CisgICAgICAgICAgICBpZiggaSAhPSAwICkgeworICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIHRlbXBWdHhQdHIgPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSAtIDEgKTsKKyAgICAgICAgICAgICAgICAvKiBpZiB2ZXJ0aWNlcyBhcmUgbmVpZ2hib3VycyAqLworICAgICAgICAgICAgICAgIGlmKCAoICggVmVydGV4KiApdGVtcFZ0eFB0ciApIC0+IGNvb3JkICsgMSA9PQorICAgICAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gd2VpZ2h0ICs9CisgICAgICAgICAgICAgICAgICAgICAgICB2RnVuYyggY29yclsgKCAoIFZlcnRleCogKXRlbXBWdHhQdHIgKSAtPiBjb29yZCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldGEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGlmKCBpICE9IDAgKSAqLworICAgICAgICAgICAgaWYoIGkgIT0gYWxwaGFWdHggLSAxICkgeworICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIHRlbXBWdHhQdHIgPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSArIDEgKTsKKyAgICAgICAgICAgICAgICAvKiBpZiB2ZXJ0aWNlcyBhcmUgbmVpZ2hib3VycyAqLworICAgICAgICAgICAgICAgIGlmKCAoICggVmVydGV4KiApdGVtcFZ0eFB0ciApIC0+IGNvb3JkIC0gMSA9PQorICAgICAgICAgICAgICAgICAgICAoICggVmVydGV4KiApdnR4UHRyICkgLT4gY29vcmQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gd2VpZ2h0ICs9CisgICAgICAgICAgICAgICAgICAgICAgICB2RnVuYyggY29yclsgKCAoIFZlcnRleCogKXRlbXBWdHhQdHIgKSAtPiBjb29yZCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJldGEgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGlmKCBpICE9IGFscGhhVnR4IC0gMSApICovCisgICAgICAgICAgICAoICggRWRnZSogKW5ld0VkZ2VQdHIgKSAtPiBmbG93ID0gMDsKKyAgICAgICAgICAgICggKCBFZGdlKiApbmV3RWRnZVB0ciApIC0+IHNyY1Z0eCA9CisgICAgICAgICAgICAgICAgKCAoIFZlcnRleCogKXZ0eFB0ciApIC0+IGNvb3JkOworICAgICAgICAgICAgKCAoIEVkZ2UqICluZXdFZGdlUHRyICkgLT4gZGVzdFZ0eCA9IC0yOyAvKiBkZXN0aW5hdGlvbiB2ZXJ0ZXggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmV0YSB2ZXJ0ZXggKi8KKworICAgICAgICB9IC8qIGZvciggaSA9IDA7IGkgPCBncmFwaCAtPiB0b3RhbCAtIDI7IGkgKysgKSAqLworCisgICAgfSAvKiBpZiggZ3JhcGggLT4gdG90YWwgPiAyICkgKi8KKworICAgICNlbmRpZiAvKiAjaWZkZWYgQUxQSEFfQkVUQV9FWENIQU5HRSAqLworCisgICAgI2lmZGVmIEFMUEhBX0VYUEFOU0lPTgorICAgICNlbmRpZiAvKiAjaWZkZWYgQUxQSEFfRVhQQU5TSU9OICovCisKK30gLyogbWFrZUdyYXBoICovCisKKy8vIGZ1bmN0aW9uIG1ha2VIZWxwR3JhcGggY3JlYXRlcyBoZWxwIGdyYXBoIHVzaW5nIGluaXRpYWwgZ3JhcGgKKy8vICAgICAgZ3JhcGggICAgICAgICAgIC0gcG9pbnRlciB0byBpbml0aWFsIGdyYXBoICggcmVwcmVzZW50ZWQgYnkgQ3ZHcmFwaAorLy8gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgKQorLy8gICAgICBobHBHcmFwaFB0ciAgICAgLSBwb2ludGVyIHRvIHBvaW50ZXIgdG8gbmV3IGhlbHAgZ3JhcGgKKy8vICAgICAgc3RvcmFnZSAgICAgICAgIC0gcG9pbnRlciB0byBDdlN0b3JhZ2Ugc3RydWN0dXJlCisvLyAgICAgIG1lbSAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY1RlbXBNZW0gZnVuY3Rpb24KKy8vICAgICAgdmVydGljZXMgICAgICAgIC0gcG9pbnRlciB0byBtZW1vcnkgYWxsb2NhdGVkIGJ5IGFsbG9jVGVtcE1lbSBmdW5jdGlvbgorLy8gICAgICB2ZXJ0aWNlc0NvdW50UHRyLSBwb2ludGVyIHRvIHZhbHVlIGNvbnRhaW5pbmcgbnVtYmVyIG9mIHZlcnRpY2VzCisvLyAgICAgICAgICAgICAgICAgICAgICAgIGluIHZlcnRpY2VzIGFycmF5CisvLyAgICAgIHdpZHRoICAgICAgICAgICAtIHdpZHRoIG9mIGltYWdlIGxpbmUgaW4gcGl4ZWxzCitpbnQgbWFrZUhlbHBHcmFwaCggQ3ZHcmFwaCogZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaCoqIGhscEdyYXBoUHRyLAorICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICBpbnQqIG1lbSwKKyAgICAgICAgICAgICAgICAgICBpbnQqIHZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgIGludCogdmVydGljZXNDb3VudFB0ciwKKyAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggKQoreworICAgIGludCB1LCB2OworICAgIGludCogb3JkZXIgPSBtZW07CisgICAgaW50KiBsZW5ndGhBcnIgPSBvcmRlciArIHdpZHRoICsgMjsKKyAgICBpbnQgcyA9IGdyYXBoIC0+IHRvdGFsIC0gMjsgLyogc291cmNlIHZlcnRleCAqLworICAgIGludCB0ID0gZ3JhcGggLT4gdG90YWwgLSAxOyAvKiB0ZXJtaW5hdGUgdmVydGV4ICovCisgICAgaW50IG9yZGVyRmlyc3Q7CisgICAgaW50IG9yZGVyQ291bnQ7CisgICAgaW50ICZ2ZXJ0aWNlc0NvdW50ID0gKnZlcnRpY2VzQ291bnRQdHI7CisgICAgQ3ZHcmFwaCogaGxwR3JhcGg7CisKKyAgICBpZiggKmhscEdyYXBoUHRyICkgIHsKKyAgICAgICAgY3ZDbGVhckdyYXBoKCAqaGxwR3JhcGhQdHIgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpobHBHcmFwaFB0ciA9IGN2Q3JlYXRlR3JhcGgoIENWX1NFUV9LSU5EX0dSQVBIIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0dSQVBIX0ZMQUdfT1JJRU5URUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZHcmFwaCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXplRm9yR3JhcGgoIFZlcnRleCApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTaXplRm9yR3JhcGgoIEVkZ2UgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSApOworICAgIH0KKworICAgIGhscEdyYXBoID0gKmhscEdyYXBoUHRyOworCisgICAgLyogaW5pdGlhbGl6YXRpb24gKi8KKyAgICBmb3IoIHUgPSAwOyB1IDwgZ3JhcGggLT4gdG90YWw7IHUgKysgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoQXJyWyB1IF0gPSBJTlRfSU5GSU5JVFk7CisgICAgICAgIGN2R3JhcGhBZGRWdHgoIGhscEdyYXBoLCBOVUxMLCBOVUxMICk7CisgICAgfSAvKiBmb3IoIHUgPSAwOyB1IDwgZ3JhcGggLT4gdG90YWwgLSAxOyB1ICsrICkgKi8KKworICAgIG9yZGVyRmlyc3QgPSAwOworICAgIG9yZGVyQ291bnQgPSAwOworICAgIHZlcnRpY2VzQ291bnQgPSAwOworICAgIGxlbmd0aEFyclsgcyBdID0gMDsKKworICAgIC8qIGFkZCB2ZXJ0ZXggcyB0byBvcmRlciAqLworICAgIG9yZGVyWyBvcmRlckNvdW50IF0gPSBzOworICAgIG9yZGVyQ291bnQgKys7CisKKyAgICB3aGlsZSggb3JkZXJDb3VudCAhPSBvcmRlckZpcnN0ICkKKyAgICB7CisgICAgICAgIC8qIGdldHRpbmcgdSBmcm9tIG9yZGVyICovCisgICAgICAgIHUgPSBvcmRlclsgb3JkZXJGaXJzdCBdOworICAgICAgICBvcmRlckZpcnN0ICsrOworCisgICAgICAgIC8qIGFkZGluZyB1IHRvIHZlcnRleCBhcnJheSAqLworICAgICAgICB2ZXJ0aWNlc1sgdmVydGljZXNDb3VudCBdID0gdTsKKyAgICAgICAgdmVydGljZXNDb3VudCArKzsKKworICAgICAgICBpbnQgb2ZzOworICAgICAgICBDdkdyYXBoVnR4KiBncmFwaFZ0eCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCB1ICk7CisKKyAgICAgICAgLyogcHJvY2Vzc2luZyBhbGwgdmVydGljZXMgb3V0Z29pbmcgZnJvbSB2ZXJ0ZXggdSAqLworICAgICAgICBDdkdyYXBoRWRnZSogZ3JhcGhFZGdlID0gZ3JhcGhWdHggLT4gZmlyc3Q7CisgICAgICAgIHdoaWxlKCBncmFwaEVkZ2UgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGVtcFZ0eElkeCA9IGN2R3JhcGhWdHhJZHgoIGdyYXBoLCBncmFwaEVkZ2UgLT4gdnR4WzFdICk7CisgICAgICAgICAgICBvZnMgPSB0ZW1wVnR4SWR4ID09IHU7CisgICAgICAgICAgICBpZiggIW9mcyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdiA9IHRlbXBWdHhJZHg7CisKKyAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogdGVtcEdyYXBoRWRnZSA9IGN2RmluZEdyYXBoRWRnZSggZ3JhcGgsIHUsIHYgKTsKKyAgICAgICAgICAgICAgICBpZiggKCBsZW5ndGhBcnJbIHUgXSA8IGxlbmd0aEFyclsgdiBdICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCBsZW5ndGhBcnJbIHYgXSA8PSBsZW5ndGhBcnJbIHQgXSApCisgICAgICAgICAgICAgICAgICAgICYmICggKCAoIEVkZ2UqICl0ZW1wR3JhcGhFZGdlICkgLT4gZmxvdyA8CisgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UgKSAtPiB3ZWlnaHQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbGVuZ3RoQXJyWyB2IF0gPT0gSU5UX0lORklOSVRZICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRkaW5nIHZlcnRleCB2IHRvIG9yZGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICBvcmRlclsgb3JkZXJDb3VudCBdID0gdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyQ291bnQgKys7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aEFyclsgdiBdID0gbGVuZ3RoQXJyWyB1IF0gKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIHRlbXBHcmFwaEVkZ2UyOworCisgICAgICAgICAgICAgICAgICAgICAgICBjdkdyYXBoQWRkRWRnZSggaGxwR3JhcGgsIHUsIHYsIE5VTEwsICZ0ZW1wR3JhcGhFZGdlMiApOworICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wR3JhcGhFZGdlMiApIC0+IGZsb3cgPSAwOworCisgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UyICkgLT4gd2VpZ2h0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UgKSAtPiB3ZWlnaHQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApdGVtcEdyYXBoRWRnZSApIC0+IGZsb3c7CisKKyAgICAgICAgICAgICAgICAgICAgfSAvKiBpZiggbGVuZ3RoWyB2IF0gPT0gSU5UX0lORklOSVRZICkgKi8KKworICAgICAgICAgICAgICAgIH0gLyogaWYoICggbGVuZ3RoQXJyWyB1IF0gPCBsZW5ndGhBcnJbIHYgXSApIC4uLiAqLworCisgICAgICAgICAgICB9IC8qIGlmKCAhb2ZzICkgKi8KKworICAgICAgICAgICAgZ3JhcGhFZGdlID0gZ3JhcGhFZGdlIC0+IG5leHRbIG9mcyBdOworCisgICAgICAgIH0gLyogd2hpbGUoIGdyYXBoRWRnZSApICovCisKKyAgICAgICAgLyogcHJvY2Vzc2luZyBhbGwgdmVydGljZXMgaW5jb21pbmcgdG8gdmVydGV4IHUgKi8KKyAgICAgICAgZ3JhcGhFZGdlID0gZ3JhcGhWdHggLT4gZmlyc3Q7CisgICAgICAgIHdoaWxlKCBncmFwaEVkZ2UgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGVtcFZ0eElkeCA9IGN2R3JhcGhWdHhJZHgoIGdyYXBoLCBncmFwaEVkZ2UgLT4gdnR4WzFdICk7CisgICAgICAgICAgICBvZnMgPSB0ZW1wVnR4SWR4ID09IHU7CisgICAgICAgICAgICBpZiggb2ZzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZW1wVnR4SWR4ID0gY3ZHcmFwaFZ0eElkeCggZ3JhcGgsIGdyYXBoRWRnZSAtPiB2dHhbMF0gKTsKKyAgICAgICAgICAgICAgICB2ID0gdGVtcFZ0eElkeDsKKworICAgICAgICAgICAgICAgIEN2R3JhcGhFZGdlKiB0ZW1wR3JhcGhFZGdlID0gY3ZGaW5kR3JhcGhFZGdlKCBncmFwaCwgdiwgdSApOworICAgICAgICAgICAgICAgIGlmKCAoIGxlbmd0aEFyclsgdSBdIDwgbGVuZ3RoQXJyWyB2IF0gKQorICAgICAgICAgICAgICAgICAgICAmJiAoIGxlbmd0aEFyclsgdiBdIDw9IGxlbmd0aEFyclsgdCBdICkKKyAgICAgICAgICAgICAgICAgICAgJiYgKCAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UgKSAtPiBmbG93ID4gMCApICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBsZW5ndGhBcnJbIHYgXSA9PSBJTlRfSU5GSU5JVFkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBhZGRpbmcgdmVydGV4IHYgdG8gb3JkZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyWyBvcmRlckNvdW50IF0gPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJDb3VudCArKzsKKworICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoQXJyWyB2IF0gPSBsZW5ndGhBcnJbIHUgXSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogdGVtcEdyYXBoRWRnZTMgPSBjdkZpbmRHcmFwaEVkZ2UoIGhscEdyYXBoLCB1LCB2ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0ZW1wR3JhcGhFZGdlMyA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wR3JhcGhFZGdlMyApIC0+IHdlaWdodCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogdGVtcEdyYXBoRWRnZTI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZHcmFwaEFkZEVkZ2UoIGhscEdyYXBoLCB1LCB2LCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVtcEdyYXBoRWRnZTIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UyICkgLT4gZmxvdyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wR3JhcGhFZGdlMiApIC0+IHdlaWdodCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGlmKCB0ZW1wR3JhcGhFZGdlMyA9PSBOVUxMIHx8IC4uLiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKXRlbXBHcmFwaEVkZ2UzICkgLT4gd2VpZ2h0ICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqICl0ZW1wR3JhcGhFZGdlICkgLT4gZmxvdzsKKworICAgICAgICAgICAgICAgICAgICB9IC8qIGlmKCBsZW5ndGhbIHYgXSA9PSBJTlRfSU5GSU5JVFkgKSAqLworCisgICAgICAgICAgICAgICAgfSAvKiBpZiggKCBsZW5ndGhBcnJbIHUgXSA8IGxlbmd0aEFyclsgdiBdICkgLi4uICovCisKKyAgICAgICAgICAgIH0gLyogaWYoIG9mcyApICovCisKKyAgICAgICAgICAgIGdyYXBoRWRnZSA9IGdyYXBoRWRnZSAtPiBuZXh0WyBvZnMgXTsKKworICAgICAgICB9IC8qIHdoaWxlKCBncmFwaEVkZ2UgKSAqLworICAKKyAgICB9IC8qIHdoaWxlKCBvcmRlckNvdW50ICE9IG9yZGVyRmlyc3QgKSAqLworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGhscEdyYXBoIC0+IHRvdGFsIC0gMjsgaSArKyApCisgICAgeworICAgICAgICBDdkdyYXBoVnR4KiBobHBHcmFwaFZ0eFRlbXAgPSBjdkdldEdyYXBoVnR4KCBobHBHcmFwaCwgaSApOworICAgICAgICBpZiggaGxwR3JhcGhWdHhUZW1wICkgeworICAgICAgICAgICAgaWYoICFobHBHcmFwaFZ0eFRlbXAgLT4gZmlyc3QgKSB7CisgICAgICAgICAgICAgICAgY3ZHcmFwaFJlbW92ZVZ0eEJ5UHRyKCBobHBHcmFwaCwgaGxwR3JhcGhWdHhUZW1wICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IC8qIGZvciggaSA9IDA7IGkgPCBobHBHcmFwaCAtPiB0b3RhbCAtIDI7IGkgKysgKSAqLworCisgICAgcmV0dXJuIGxlbmd0aEFyclsgdCBdOworCit9IC8qIG1ha2VIZWxwR3JhcGggKi8KKworLy8gZnVuY3Rpb24gbWFrZVBzZXVkb01heEZsb3cgaW5jcmVhc2VzIGZsb3cgaW4gZ3JhcGggYnkgdXNpbmcgaGxwR3JhcGgKKy8vICAgICAgZ3JhcGggICAgICAgICAgIC0gcG9pbnRlciB0byBpbml0aWFsIGdyYXBoCisvLyAgICAgIGhscEdyYXBoICAgICAgICAtIHBvaW50ZXIgdG8gaGVscCBncmFwaAorLy8gICAgICB2ZXJ0aWNlcyAgICAgICAgLSBwb2ludGVyIHRvIHZlcnRpY2VzIGFycmF5CisvLyAgICAgIHZlcnRpY2VzQ291bnQgICAtIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB2ZXJ0aWNlcyBhcnJheQorLy8gICAgICBtZW0gICAgICAgICAgICAgLSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYWxsb2NUZW1wTWVtIGZ1bmN0aW9uCisvLyAgICAgIHdpZHRoICAgICAgICAgICAtIHdpZHRoIG9mIGltYWdlIGxpbmUgaW4gcGl4ZWxzCit2b2lkIG1ha2VQc2V1ZG9NYXhGbG93KCBDdkdyYXBoKiBncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGgqIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiB2ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ZXJ0aWNlc0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGggKQoreworICAgIGludCBzdGVrQ291bnQ7CisgICAgaW50IG9yZGVyRmlyc3Q7CisgICAgaW50IG9yZGVyQ291bnQ7CisgICAgaW50IGk7CisgICAgaW50IHYsIHU7CisgICAgaW50KiBzdGVrID0gbWVtOworICAgIGludCogb3JkZXIgPSBzdGVrICsgd2lkdGggKyAyOworICAgIGludCogaW5jb21GbG93ID0gb3JkZXIgKyB3aWR0aCArIDI7CisgICAgaW50KiBvdXRnb0Zsb3cgPSBpbmNvbUZsb3cgKyB3aWR0aCArIDI7CisgICAgaW50KiBmbG93ID0gb3V0Z29GbG93ICsgd2lkdGggKyAyOworICAgIGludCogY2FyZ28gPSBmbG93KyB3aWR0aCArIDI7CisgICAgaW50IHMgPSBncmFwaCAtPiB0b3RhbCAtIDI7IC8qIHNvdXJjZSB2ZXJ0ZXggKi8KKyAgICBpbnQgdCA9IGdyYXBoIC0+IHRvdGFsIC0gMTsgLyogdGVybWluYXRlIHZlcnRleCAqLworICAgIGludCByZWFsVmVydGljZXNDb3VudCA9IHZlcnRpY2VzQ291bnQ7CisKKyAgICBzdGVrQ291bnQgPSAwOworCisgICAgZm9yKCBpID0gMDsgaSA8IHZlcnRpY2VzQ291bnQ7IGkgKysgKQorICAgIHsKKyAgICAgICAgdiA9IHZlcnRpY2VzWyBpIF07CisKKyAgICAgICAgaW5jb21GbG93WyB2IF0gPSBvdXRnb0Zsb3dbIHYgXSA9IDA7CisKKyAgICAgICAgaWYoIHYgPT0gcyApIHsKKyAgICAgICAgICAgIGluY29tRmxvd1sgdiBdID0gSU5UX0lORklOSVRZOworICAgICAgICB9IC8qIGlmKCB2ID09IHMgKSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEN2R3JhcGhWdHgqIGhscEdyYXBoVnR4ID0gY3ZHZXRHcmFwaFZ0eCggaGxwR3JhcGgsIHYgKTsKKyAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBobHBHcmFwaEVkZ2UgPSBobHBHcmFwaFZ0eCAtPiBmaXJzdDsKKyAgICAgICAgICAgIGludCBvZnM7CisKKyAgICAgICAgICAgIHdoaWxlKCBobHBHcmFwaEVkZ2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2dHhJZHggPSBjdkdyYXBoVnR4SWR4KCBobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlIC0+IHZ0eFsxXSApOworICAgICAgICAgICAgICAgIG9mcyA9IHZ0eElkeCA9PSB2OworCisgICAgICAgICAgICAgICAgaWYoIG9mcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmNvbUZsb3dbIHYgXSArPSAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IHdlaWdodDsKKyAgICAgICAgICAgICAgICB9IC8qIGlmKCBvZnMgKSAqLworCisgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlID0gaGxwR3JhcGhFZGdlIC0+IG5leHRbIG9mcyBdOworICAgICAgICAgICAgfSAvKiB3aGlsZSggaGxwR3JhcGhFZGdlICkgKi8KKworICAgICAgICB9IC8qIGlmKCB2ID09IHMgKSBlbHNlICovCisKKyAgICAgICAgaWYoIHYgPT0gdCApIHsKKyAgICAgICAgICAgIG91dGdvRmxvd1sgdiBdID0gSU5UX0lORklOSVRZOworICAgICAgICB9IC8qIGlmKCB2ID09IHQgKSAqLworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEN2R3JhcGhWdHgqIGhscEdyYXBoVnR4ID0gY3ZHZXRHcmFwaFZ0eCggaGxwR3JhcGgsIHYgKTsKKyAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBobHBHcmFwaEVkZ2UgPSBobHBHcmFwaFZ0eCAtPiBmaXJzdDsKKyAgICAgICAgICAgIGludCBvZnM7CisKKyAgICAgICAgICAgIHdoaWxlKCBobHBHcmFwaEVkZ2UgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB2dHhJZHggPSBjdkdyYXBoVnR4SWR4KCBobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlIC0+IHZ0eFsxXSApOworICAgICAgICAgICAgICAgIG9mcyA9IHZ0eElkeCA9PSB2OworCisgICAgICAgICAgICAgICAgaWYoICFvZnMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Z29GbG93WyB2IF0gKz0gKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiB3ZWlnaHQ7CisgICAgICAgICAgICAgICAgfSAvKiBpZiggb2ZzICkgKi8KKworICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSA9IGhscEdyYXBoRWRnZSAtPiBuZXh0WyBvZnMgXTsKKyAgICAgICAgICAgIH0gLyogd2hpbGUoIGhscEdyYXBoRWRnZSApICovCisKKyAgICAgICAgfSAvKiBpZiggdiA9PSB0ICkgZWxzZSAqLworCisgICAgICAgIGZsb3dbIHYgXSA9IENWX01JTjIoIGluY29tRmxvd1sgdiBdLCBvdXRnb0Zsb3dbIHYgXSApOworCisgICAgICAgIGlmKCAhZmxvd1sgdiBdICkgeworICAgICAgICAgICAgc3Rla1sgc3Rla0NvdW50IF0gPSB2OworICAgICAgICAgICAgc3Rla0NvdW50ICsrOworICAgICAgICB9IC8qIGlmKCAhZmxvd1sgdiBdICkgKi8KKworICAgIH0gLyogZm9yKCBpID0gMDsgaSA8IHZlcnRpY2VzQ291bnQ7IGkgKysgKSAqLworCisgICAgZm9yKCBpID0gMDsgaSA8IHZlcnRpY2VzQ291bnQ7IGkgKysgKQorICAgIHsKKyAgICAgICAgdiA9IHZlcnRpY2VzWyBpIF07CisgICAgICAgIGNhcmdvWyB2IF0gPSAwOworICAgIH0gLyogZm9yKCBpID0gMDsgaSA8IHZlcnRpY2VzQ291bnQ7IGkgKysgKSAqLworCisgICAgd2hpbGUoIHJlYWxWZXJ0aWNlc0NvdW50ID4gMiApCisgICAgeworICAgICAgICAvKiBkZWxldGluZyBhbGwgdmVydGljZXMgaW5jbHVkZWQgaW4gc3RlayAqLworICAgICAgICB3aGlsZSggc3Rla0NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgdiA9IHN0ZWtbIHN0ZWtDb3VudCAtIDEgXTsKKyAgICAgICAgICAgIHN0ZWtDb3VudCAtLTsKKworICAgICAgICAgICAgLyogZGVsZXRpbmcgZWRnZXMgaW5jb21pbmcgdG8gdiBhbmQgb3V0Z29pbmcgZnJvbSB2ICovCisgICAgICAgICAgICBpbnQgb2ZzOworICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogaGxwR3JhcGhWdHggPSBjdkdldEdyYXBoVnR4KCBobHBHcmFwaCwgdiApOworICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIGhscEdyYXBoRWRnZTsKKyAgICAgICAgICAgIGlmKCBobHBHcmFwaFZ0eCApIHsKKyAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UgPSBobHBHcmFwaFZ0eCAtPiBmaXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggaGxwR3JhcGhFZGdlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiBobHBHcmFwaFZ0eDIgPSBobHBHcmFwaEVkZ2UgLT4gdnR4WyAxIF07CisgICAgICAgICAgICAgICAgaW50IGhscEdyYXBoVnR4SWR4MiA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICBobHBHcmFwaFZ0eDIgKTsKKyAgICAgICAgICAgICAgICBvZnMgPSBobHBHcmFwaFZ0eElkeDIgPT0gdjsKKworICAgICAgICAgICAgICAgIGlmKCBvZnMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGxwR3JhcGhFZGdlIGlzIGluY29taW5nIGVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogaGxwR3JhcGhWdHgzID0gaGxwR3JhcGhFZGdlIC0+IHZ0eFswXTsKKyAgICAgICAgICAgICAgICAgICAgdSA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhWdHgzICk7CisgICAgICAgICAgICAgICAgICAgIG91dGdvRmxvd1sgdSBdIC09ICggKCBFZGdlKiApaGxwR3JhcGhFZGdlICkgLT4gd2VpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAtICggKCBFZGdlKiApaGxwR3JhcGhFZGdlICkgLT4gZmxvdzsKKyAgICAgICAgICAgICAgICAgICAgY3ZHcmFwaFJlbW92ZUVkZ2VCeVB0ciggaGxwR3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscEdyYXBoVnR4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhWdHgyICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmbG93WyB1IF0gIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dbIHUgXSA9IENWX01JTjIoIGluY29tRmxvd1t1XSwgb3V0Z29GbG93W3VdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZmxvd1sgdSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rla1sgc3Rla0NvdW50IF0gPSB1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZWtDb3VudCArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLyogaWYoIG9mcyApICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyogaGxwR3JhcGhFZGdlIGlzIG91dGdvaW5nIGVkZ2UgKi8KKyAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogaGxwR3JhcGhWdHgzID0gaGxwR3JhcGhFZGdlIC0+IHZ0eFsxXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHUgPSBjdkdyYXBoVnR4SWR4KCBobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaFZ0eDMgKTsKKyAgICAgICAgICAgICAgICAgICAgaW5jb21GbG93WyB1IF0gLT0gKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiB3ZWlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC0gKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiBmbG93OworICAgICAgICAgICAgICAgICAgICBjdkdyYXBoUmVtb3ZlRWRnZUJ5UHRyKCBobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhWdHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaFZ0eDMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZsb3dbIHUgXSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1sgdSBdID0gQ1ZfTUlOMiggaW5jb21GbG93W3VdLCBvdXRnb0Zsb3dbdV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBmbG93WyB1IF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVrWyBzdGVrQ291bnQgXSA9IHU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rla0NvdW50ICsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBpZiggb2ZzICkgZWxzZSAqLworCisgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlID0gaGxwR3JhcGhFZGdlIC0+IG5leHRbIG9mcyBdOworCisgICAgICAgICAgICB9IC8qIHdoaWxlKCBobHBHcmFwaEVkZ2UgKSAqLworCisgICAgICAgICAgICAvKiBkZWxldGluZyB2ZXJ0ZXggdiAqLworICAgICAgICAgICAgY3ZHcmFwaFJlbW92ZVZ0eCggaGxwR3JhcGgsIHYgKTsKKyAgICAgICAgICAgIHJlYWxWZXJ0aWNlc0NvdW50IC0tOworCisgICAgICAgIH0gLyogd2hpbGUoIHN0ZWtDb3VudCApICovCisKKyAgICAgICAgaWYoIHJlYWxWZXJ0aWNlc0NvdW50ID4gMiApIC8qIHRoZSBmbG93IGlzIG5vdCBtYXggc3RpbGwgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW50IHAgPSBJTlRfSU5GSU5JVFk7CisgICAgICAgICAgICBpbnQgciA9IC0xOworICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogZ3JhcGhWdHg7CisKKyAgICAgICAgICAgIGlmKCByZWFsVmVydGljZXNDb3VudCA9PSAzICkgeworICAgICAgICAgICAgICAgIHIgPSByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGhscEdyYXBoIC0+IHRvdGFsIC0gMjsgaSArKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ3JhcGhWdHggPSBjdkdldEdyYXBoVnR4KCBobHBHcmFwaCwgaSApOworICAgICAgICAgICAgICAgIGlmKCBncmFwaFZ0eCApIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLCBncmFwaFZ0eCApOworICAgICAgICAgICAgICAgICAgICBpZiggZmxvd1sgdiBdIDwgcCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHIgPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IGZsb3dbIHYgXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSAvKiBmb3IoIGkgPSAwOyBpIDwgaGxwR3JhcGggLT4gdG90YWwgLSAyOyBpICsrICkgKi8KKworICAgICAgICAgICAgLyogYnVpbGRpbmcgb2Ygc2l6ZSBwIGZsb3cgZnJvbSByIHRvIHQgKi8KKyAgICAgICAgICAgIG9yZGVyQ291bnQgPSBvcmRlckZpcnN0ID0gMDsKKyAgICAgICAgICAgIG9yZGVyWyBvcmRlckNvdW50IF0gPSByOworICAgICAgICAgICAgb3JkZXJDb3VudCArKzsKKworICAgICAgICAgICAgdiA9IG9yZGVyWyBvcmRlckZpcnN0IF07CisgICAgICAgICAgICBvcmRlckZpcnN0ICsrOworCisgICAgICAgICAgICBjYXJnb1sgciBdID0gcDsKKyAgICAgICAgICAgIGRvIC8qIHdoaWxlKCB2ICE9IHQgKSAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGluY29tRmxvd1sgdiBdIC09IGNhcmdvWyB2IF07CisgICAgICAgICAgICAgICAgb3V0Z29GbG93WyB2IF0gLT0gY2FyZ29bIHYgXTsKKyAgICAgICAgICAgICAgICBmbG93WyB2IF0gLT0gY2FyZ29bIHYgXTsKKworICAgICAgICAgICAgICAgIGlmKCBmbG93WyB2IF0gPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3Rla1sgc3Rla0NvdW50IF0gPSB2OworICAgICAgICAgICAgICAgICAgICBzdGVrQ291bnQgKys7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHYgPT0gdCApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FyZ29bIHYgXSA9IHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBvZnM7CisgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIGhscEdyYXBoVnR4MjsKKyAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogaGxwR3JhcGhWdHggPSBjdkdldEdyYXBoVnR4KCBobHBHcmFwaCwgdiApOworICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogaGxwR3JhcGhFZGdlID0gaGxwR3JhcGhWdHggLT4gZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBobHBHcmFwaEVkZ2UyID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaGxwR3JhcGhFZGdlICYmIGNhcmdvWyB2IF0gPiAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhWdHgyID0gaGxwR3JhcGhFZGdlIC0+IHZ0eFsgMSBdOworICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLCBobHBHcmFwaFZ0eDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mcyA9IHUgPT0gdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFvZnMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjYXJnb1sgdSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZGVyWyBvcmRlckNvdW50IF0gPSB1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlckNvdW50ICsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IHdlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICggKCBFZGdlKiApaGxwR3JhcGhFZGdlICkgLT4gZmxvdzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IENWX01JTjIoIGNhcmdvWyB2IF0sIGRlbHRhICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiBmbG93ICs9IGRlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvWyB2IF0gLT0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ29bIHUgXSArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiB3ZWlnaHQgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiBmbG93ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRlbGV0aW5nIGhscEdyYXBoRWRnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UyID0gaGxwR3JhcGhFZGdlIC0+IG5leHRbIG9mcyBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSogZ3JhcGhFZGdlID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2RmluZEdyYXBoRWRnZSggZ3JhcGgsIHYsIHUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqIClncmFwaEVkZ2UgKSAtPiBmbG93ICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IGZsb3c7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2R3JhcGhSZW1vdmVFZGdlQnlQdHIoIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlIC0+IHZ0eFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSAtPiB2dHhbMV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGlmKCAhb2ZzICkgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGhscEdyYXBoRWRnZTIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlID0gaGxwR3JhcGhFZGdlMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSA9IGhscEdyYXBoRWRnZSAtPiBuZXh0WyBvZnMgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAvKiB3aGlsZSggaGxwR3JhcGhFZGdlICYmIGNhcmdvWyB2IF0gPiAwICkgKi8KKworICAgICAgICAgICAgICAgIH0gLyogaWYoIHYgPT0gdCApIGVsc2UgKi8KKworICAgICAgICAgICAgICAgIHYgPSBvcmRlclsgb3JkZXJGaXJzdCBdOworICAgICAgICAgICAgICAgIG9yZGVyRmlyc3QgKys7CisKKyAgICAgICAgICAgIH0gd2hpbGUoIHYgIT0gdCApOyAvKiBkbyAqLworCisgICAgICAgICAgICAvKiBidWlsZGluZyBvZiBzaXplIHAgZmxvdyBmcm9tIHMgdG8gciAqLworICAgICAgICAgICAgb3JkZXJDb3VudCA9IG9yZGVyRmlyc3QgPSAwOworICAgICAgICAgICAgb3JkZXJbIG9yZGVyQ291bnQgXSA9IHI7CisgICAgICAgICAgICBvcmRlckNvdW50ICsrOworCisgICAgICAgICAgICB2ID0gb3JkZXJbIG9yZGVyRmlyc3QgXTsKKyAgICAgICAgICAgIG9yZGVyRmlyc3QgKys7CisKKyAgICAgICAgICAgIGNhcmdvWyByIF0gPSBwOworICAgICAgICAgICAgZG8gLyogd2hpbGUoIHYgIT0gcyApICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHYgIT0gciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbmNvbUZsb3dbIHYgXSAtPSBjYXJnb1sgdiBdOworICAgICAgICAgICAgICAgICAgICBvdXRnb0Zsb3dbIHYgXSAtPSBjYXJnb1sgdiBdOworICAgICAgICAgICAgICAgICAgICBmbG93WyB2IF0gLT0gY2FyZ29bIHYgXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZsb3dbIHYgXSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Rla1sgc3Rla0NvdW50IF0gPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgc3Rla0NvdW50ICsrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvKiBpZiggdiAhPSByICkgKi8KKworICAgICAgICAgICAgICAgIGlmKCB2ID09IHMgKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcmdvWyB2IF0gPSAwOworICAgICAgICAgICAgICAgIH0gLyogaWYoIHYgPT0gcyApICovCisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG9mczsKKworICAgICAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiBobHBHcmFwaFZ0eCA9IGN2R2V0R3JhcGhWdHgoIGhscEdyYXBoLCB2ICk7CisgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBobHBHcmFwaEVkZ2UgPSBobHBHcmFwaFZ0eCAtPiBmaXJzdDsKKyAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIGhscEdyYXBoRWRnZTIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB3aGlsZSggaGxwR3JhcGhFZGdlICYmIGNhcmdvWyB2IF0gPiAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UgLT4gdnR4WyAxIF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mcyA9IHUgPT0gdjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9mcyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSA9IGN2R3JhcGhWdHhJZHgoIGhscEdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlIC0+IHZ0eFsgMCBdICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggY2FyZ29bIHUgXSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlclsgb3JkZXJDb3VudCBdID0gdTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXJDb3VudCArKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IHdlaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICggKCBFZGdlKiApaGxwR3JhcGhFZGdlICkgLT4gZmxvdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gQ1ZfTUlOMiggY2FyZ29bIHYgXSwgZGVsdGEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiBmbG93KSArPSBkZWx0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmdvWyB2IF0gLT0gZGVsdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZ29bIHUgXSArPSBkZWx0YTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IHdlaWdodCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICggRWRnZSogKWhscEdyYXBoRWRnZSApIC0+IGZsb3cgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlMiA9IGhscEdyYXBoRWRnZSAtPiBuZXh0WyBvZnMgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIGdyYXBoRWRnZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkZpbmRHcmFwaEVkZ2UoIGdyYXBoLCB1LCB2ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCBFZGdlKiApZ3JhcGhFZGdlICkgLT4gZmxvdyArPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIEVkZ2UqIClobHBHcmFwaEVkZ2UgKSAtPiBmbG93OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkdyYXBoUmVtb3ZlRWRnZUJ5UHRyKCBobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSAtPiB2dHhbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UgLT4gdnR4WzFdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBpZiggb2ZzICkgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGhscEdyYXBoRWRnZTIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGhFZGdlID0gaGxwR3JhcGhFZGdlMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBobHBHcmFwaEVkZ2UyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhscEdyYXBoRWRnZSA9IGhscEdyYXBoRWRnZSAtPiBuZXh0WyBvZnMgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSAvKiB3aGlsZSggaGxwR3JhcGhFZGdlICYmIGNhcmdvWyB2IF0gPiAwICkgKi8KKworICAgICAgICAgICAgICAgIH0gLyogaWYoIHYgPT0gcyApIGVsc2UgKi8KKworICAgICAgICAgICAgICAgIHYgPSBvcmRlclsgb3JkZXJGaXJzdCBdOyAvL2FkZGVkCisgICAgICAgICAgICAgICAgb3JkZXJGaXJzdCArKzsgLy9hZGRlZAorCisgICAgICAgICAgICB9IHdoaWxlKCB2ICE9IHMgKTsgLyogZG8gKi8KKworICAgICAgICB9IC8qIGlmKCBobHBHcmFwaCAtPiB0b3RhbCA+IDIgKSAqLworCisgICAgfSAvKiB3aGlsZSggaGxwR3JhcGggLT4gdG90YWwgPiAyICkgKi8KKworfSAvKiBtYWtlUHNldWRvTWF4RmxvdyAqLworCisKKy8vIGZ1bmN0aW9uIG9uZVN0ZXAgcHJvZHVjZXMgb25lIGFscGhhLWJldGEgZXhjaGFuZ2UgZm9yIG9uZSBsaW5lIG9mIGltYWdlcworLy8gICAgICBsZWZ0TGluZSAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBsZWZ0IGltYWdlIGxpbmUKKy8vICAgICAgcmlnaHRMaW5lICAgICAgIC0gcG9pbnRlciB0byB0aGUgcmlnaHQgaW1hZ2UgbGluZQorLy8gICAgICBhbHBoYSAgICAgICAgICAgLSBsYWJlbCBudW1iZXIgb25lCisvLyAgICAgIGJldGEgICAgICAgICAgICAtIGxhYmVsIG51bWJlciB0d28KKy8vICAgICAgY29yciAgICAgICAgICAgIC0gcG9pbnRlciB0byBjb3JyZXNwb25kZW5jZSBhcnJheSBmb3IgdGhpcyBsaW5lCisvLyAgICAgIHdpZHRoICAgICAgICAgICAtIHdpZHRoIG9mIGltYWdlIGxpbmUgaW4gcGl4ZWxzCisvLyAgICAgIG1lbSAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gbWVtb3J5IGFsbG9jYXRlZCBieSBhbGxvY1RlbXBNZW0gZnVuY3Rpb24KKy8vICAgICAgdmVydGljZXMgICAgICAgIC0gcG9pbnRlciB0byB2ZXJ0aWNlcyBhcnJheSBhbGxvY2F0ZWQgYnkgYWxsb2NUZW1wTWVtCisvLyAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uCisvLyAgICAgIHN0b3JhZ2UgICAgICAgICAtIHBvaW50ZXIgdG8gQ3ZNZW1TdG9yYWdlIHN0cnVjdHVyZQorYm9vbCBvbmVTdGVwKCB1bnNpZ25lZCBjaGFyKiBsZWZ0TGluZSwKKyAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcmlnaHRMaW5lLAorICAgICAgICAgICAgICBpbnQgYWxwaGEsCisgICAgICAgICAgICAgIGludCBiZXRhLAorICAgICAgICAgICAgICBpbnQqIGNvcnIsCisgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgaW50KiBtZW0sCisgICAgICAgICAgICAgIGludCogdmVydGljZXMsCisgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgQ3ZHcmFwaCogZ3JhcGggPSBOVUxMOworICAgIEN2R3JhcGgqIGhscEdyYXBoID0gTlVMTDsKKyAgICBDdk1lbVN0b3JhZ2VQb3Mgc3RvcmFnZVBvczsKKyAgICBpbnQgaTsKKyAgICBib29sIGNoYW5nZSA9IGZhbHNlOworICAgIGN2U2F2ZU1lbVN0b3JhZ2VQb3MoIHN0b3JhZ2UsICZzdG9yYWdlUG9zICk7CisKKyAgICBpbnQgdmVydGljZXNDb3VudDsKKworICAgIG1ha2VHcmFwaCggJmdyYXBoLCBsZWZ0TGluZSwgcmlnaHRMaW5lLCBhbHBoYSwgYmV0YSwgY29yciwgd2lkdGgsIHN0b3JhZ2UgKTsKKworICAgIGludCBzID0gZ3JhcGggLT4gdG90YWwgLSAyOyAvKiBzb3VyY2UgdmVydGV4IC0gYWxwaGEgdmVydGV4ICovCisgICAgLy9pbnQgdCA9IGdyYXBoIC0+IHRvdGFsIC0gMTsgLyogdGVybWluYXRlIHZlcnRleCAtIGJldGEgdmVydGV4ICovCisKKyAgICBpbnQgbGVuZ3RoID0gbWFrZUhlbHBHcmFwaCggZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZobHBHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlcnRpY2VzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICk7CisgICAgd2hpbGUoIGxlbmd0aCAhPSBJTlRfSU5GSU5JVFkgKQorICAgIHsKKyAgICAgICAgY2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgbWFrZVBzZXVkb01heEZsb3coIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGxwR3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCApOworICAgICAgICBjdkNsZWFyR3JhcGgoIGhscEdyYXBoICk7CisgICAgICAgIGxlbmd0aCA9IG1ha2VIZWxwR3JhcGgoIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGxwR3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVydGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0aWNlc0NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCApOworICAgIH0gLyogd2hpbGUoIGxlbmd0aCAhPSBJTlRfSU5GSU5JVFkgKSAqLworCisgICAgaW50IGNvb3JkOworICAgIEN2R3JhcGhWdHgqIGdyYXBoVnR4OworICAgIGZvciggaSA9IDA7IGkgPCBzOyBpICsrICkKKyAgICB7CisgICAgICAgIEN2R3JhcGhFZGdlKiBncmFwaEVkZ2UgPSBjdkZpbmRHcmFwaEVkZ2UoIGdyYXBoLCBzLCBpICk7CisKKyAgICAgICAgaWYoICggKCBFZGdlKiApZ3JhcGhFZGdlICkgLT4gd2VpZ2h0ID09CisgICAgICAgICAgICAoICggRWRnZSogKWdyYXBoRWRnZSApIC0+IGZsb3cgKQorICAgICAgICB7IC8qIHRoaXMgdmVydGV4IG11c3QgaGF2ZSBhbHBoYSBsYWJlbCAqLworICAgICAgICAgICAgZ3JhcGhWdHggPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSApOworICAgICAgICAgICAgY29vcmQgPSAoICggVmVydGV4KiApZ3JhcGhWdHggKS0+IGNvb3JkOworICAgICAgICAgICAgaWYoIGNvcnJbIGNvb3JkIF0gIT0gYWxwaGEgKSB7CisgICAgICAgICAgICAgICAgY29yclsgY29vcmQgXSA9IGFscGhhOyAvL2FkZGVkCisgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNvcnJbIGNvb3JkIF0gPSBhbHBoYTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBpZiggKCAoIEVkZ2UqIClncmFwaEVkZ2UgKSAtPiB3ZWlnaHQgPT0gLi4uICovCisgICAgICAgIGVsc2UKKyAgICAgICAgeyAvKiB0aGlzIHZlcnRleCBtdXN0IGhhdmUgYmV0YSBsYWJlbCAqLworICAgICAgICAgICAgZ3JhcGhWdHggPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaSApOworICAgICAgICAgICAgY29vcmQgPSAoICggVmVydGV4KiApZ3JhcGhWdHggKS0+IGNvb3JkOworICAgICAgICAgICAgaWYoIGNvcnJbIGNvb3JkIF0gIT0gYmV0YSApIHsKKyAgICAgICAgICAgICAgICBjb3JyWyBjb29yZCBdID0gYmV0YTsgLy9hZGRlZAorICAgICAgICAgICAgICAgIGNoYW5nZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb3JyWyBjb29yZCBdID0gYmV0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvKiBpZiggKCAoIEVkZ2UqIClncmFwaEVkZ2UgKSAtPiB3ZWlnaHQgPT0gLi4uIGVsc2UgKi8KKworICAgIH0gLyogZm9yKCBpID0gMDsgaSA8IHM7IGkgKysgKSAqLworCisgICAgY3ZDbGVhckdyYXBoKCBobHBHcmFwaCApOworICAgIGN2Q2xlYXJHcmFwaCggZ3JhcGggKTsKKworICAgIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MoIHN0b3JhZ2UsICZzdG9yYWdlUG9zICk7CisKKyAgICByZXR1cm4gY2hhbmdlOworCit9IC8qIG9uZVN0ZXAgKi8KKworLy8gZnVuY3Rpb24gaW5pdENvcnIgZmlsbHMgY29ycmVzcG9uZGVuY2UgYXJyYXkgd2l0aCBpbml0aWFsIHZhbHVlcworLy8gICAgICBjb3JyICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBjb3JyZXNwb25kZW5jZSBhcnJheSBmb3IgdGhpcyBsaW5lCisvLyAgICAgIHdpZHRoICAgICAgICAgICAgICAgLSAgd2lkdGggb2YgaW1hZ2UgbGluZSBpbiBwaXhlbHMKKy8vICAgICAgbWF4UGl4ZWxEaWZmZXJlbmNlICAtIG1heGltdW0gdmFsdWUgb2YgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzYW1lCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludCBwYWludGVkIG9uIHR3byBpbWFnZXMKK3ZvaWQgaW5pdENvcnIoIGludCogY29yciwgaW50IHdpZHRoLCBpbnQgbWF4UGl4ZWxEaWZmZXJlbmNlICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcGl4ZWxEaWZmZXJlbmNlUmFuZ2UgPSBtYXhQaXhlbERpZmZlcmVuY2UgKiAyICsgMTsKKworICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSArKyApCisgICAgeworICAgICAgICBjb3JyWyBpIF0gPSBpICUgcGl4ZWxEaWZmZXJlbmNlUmFuZ2UgLSBtYXhQaXhlbERpZmZlcmVuY2U7CisgICAgfQorfSAvKiBpbml0Q29yciAqLworCisvLyBmdW5jdGlvbiBvbmVMaW5lQ29yciBmdWxseSBjb21wdXRlcyBvbmUgbGluZSBvZiBpbWFnZXMKKy8vICAgICAgbGVmdExpbmUgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBsZWZ0IGltYWdlIGxpbmUKKy8vICAgICAgcmlnaHRMaW5lICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSByaWdodCBpbWFnZSBsaW5lCisvLyAgICAgIGNvcnIgICAgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGVuY2UgYXJyYXkgZm9yIG9uZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUKKy8vICAgICAgbWVtICAgICAgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYWxsb2NUZW1wTWVtCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKy8vICAgICAgdmVydGljZXMgICAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIG1lbW9yeSBhbGxvY2F0ZWQgYnkgYWxsb2NUZW1wTWVtCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24KKy8vICAgICAgd2lkdGggICAgICAgICAgICAgICAgICAgLSB3aWR0aCBvZiBpbWFnZSBsaW5lIGluIHBpeGVscworLy8gICAgICBtYXhQaXhlbERpZmZlcmVuY2UgICAgICAtIG1heGltdW0gdmFsdWUgb2YgcGl4ZWwgZGlmZmVyZW5jZXMgaW4gcGl4ZWxzCisvLyAgICAgIHN0b3JhZ2UgICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBDdk1lbVN0b3JhZ2Ugc3RydWN0IHdoaWNoCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgbWVtb3J5IHN0b3JhZ2UKK3ZvaWQgb25lTGluZUNvcnIoIHVuc2lnbmVkIGNoYXIqIGxlZnRMaW5lLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogcmlnaHRMaW5lLAorICAgICAgICAgICAgICAgICAgaW50KiBjb3JyLAorICAgICAgICAgICAgICAgICAgaW50KiBtZW0sCisgICAgICAgICAgICAgICAgICBpbnQqIHZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgaW50IG1heFBpeGVsRGlmZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisgICAgaW50IGNvdW50ID0gMDsKKyAgICBpbnQgaSwgajsKKworICAgIGluaXRDb3JyKCBjb3JyLCB3aWR0aCwgbWF4UGl4ZWxEaWZmZXJlbmNlICk7CisgICAgd2hpbGUoIHJlc3VsdCApCisgICAgeworICAgICAgICByZXN1bHQgPSAwOworCisgICAgICAgIGZvciggaSA9IC0gbWF4UGl4ZWxEaWZmZXJlbmNlOyBpIDwgbWF4UGl4ZWxEaWZmZXJlbmNlOyBpICsrICkKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPD0gbWF4UGl4ZWxEaWZmZXJlbmNlOyBqICsrICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ICs9IChpbnQpb25lU3RlcCggbGVmdExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlICk7CisgICAgICAgIH0gLyogZm9yKCBqID0gaSArIDE7IGogPCB3aWR0aDsgaiArKyApICovCisKKyAgICAgICAgY291bnQgKys7CisgICAgICAgIGlmKCBjb3VudCA+IC8qMCovLyoxKi8yICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgIH0gLyogd2hpbGUoIHJlc3VsdCApICovCisKK30gLyogb25lTGluZUNvcnIgKi8KKworLy8gZnVuY3Rpb24gYWxsTGluZXNDb3JyIGNvbXB1dGVzIGFsbCBsaW5lcyBvbiB0aGUgaW1hZ2VzCisvLyAgICAgIGxlZnRJbWFnZSAgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBsZWZ0IGltYWdlCisvLyAgICAgIGxlZnRMaW5lU3RlcCAgICAgICAgLSBzaXplIG9mIGxpbmUgb24gdGhlIGxlZnQgaW1hZ2UgaW4gYnl0ZXMKKy8vICAgICAgcmlnaHRJbWFnZSAgICAgICAgICAtIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IGltYWdlCisvLyAgICAgIHJpZ2h0TGluZVN0ZXAgICAgICAgLSBzaXplIG9mIGxpbmUgb24gdGhlIHJpZ2h0IGltYWdlIGluIGJ5dGVzCisvLyAgICAgIHdpZHRoICAgICAgICAgICAgICAgLSB3aWR0aCBvZiBsaW5lIGluIHBpeGVscworLy8gICAgICBoZWlnaHQgICAgICAgICAgICAgIC0gaGVpZ2h0IG9mIGltYWdlIGluIHBpeGVscworLy8gICAgICBjb3JyICAgICAgICAgICAgICAgIC0gcG9pbnRlciB0byBjb3JyZXNwb25kZW5jZSBhcnJheSBmb3IgYWxsIGxpbmVzCisvLyAgICAgIG1heFBpeGVsRGlmZmVyZW5jZSAgLSBtYXhpbXVtIHZhbHVlIG9mIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgc2FtZQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnQgcGFpbnRlZCBvbiB0d28gaW1hZ2VzCisvLyAgICAgIHN0b3JhZ2UgICAgICAgICAgICAgLSBwb2ludGVyIHRvIEN2TWVtU3RvcmFnZSB3aGljaCBjb250YWlucyBtZW1vcnkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2UKK3ZvaWQgYWxsTGluZXNDb3JyKCB1bnNpZ25lZCBjaGFyKiBsZWZ0SW1hZ2UsCisgICAgICAgICAgICAgICAgICAgaW50IGxlZnRMaW5lU3RlcCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiByaWdodEltYWdlLAorICAgICAgICAgICAgICAgICAgIGludCByaWdodExpbmVTdGVwLAorICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgIGludCogY29yciwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWF4UGl4ZWxEaWZmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciogbGVmdExpbmUgPSBsZWZ0SW1hZ2U7CisgICAgdW5zaWduZWQgY2hhciogcmlnaHRMaW5lID0gcmlnaHRJbWFnZTsKKyAgICBpbnQqIG1lbTsKKyAgICBpbnQqIHZlcnRpY2VzOworCisgICAgYWxsb2NUZW1wTWVtKCAmbWVtLAorICAgICAgICAgICAgICAgICAgJnZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgd2lkdGggKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBoZWlnaHQ7IGkgKysgKQorICAgIHsKKyAgICAgICAgb25lTGluZUNvcnIoIGxlZnRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgcmlnaHRMaW5lLAorICAgICAgICAgICAgICAgICAgICAgY29yciArIGkgKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgIG1lbSwKKyAgICAgICAgICAgICAgICAgICAgIHZlcnRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICBtYXhQaXhlbERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlICk7CisgICAgICAgIGxlZnRMaW5lICs9IGxlZnRMaW5lU3RlcDsKKyAgICAgICAgcmlnaHRMaW5lICs9IHJpZ2h0TGluZVN0ZXA7CisgICAgfSAvKiBmb3IoIGkgPSAwOyBpIDwgaGVpZ2h0OyBpICsrICkgKi8KKworICAgIGZyZWVUZW1wTWVtKCAmbWVtLAorICAgICAgICAgICAgICAgICAmdmVydGljZXMgKTsKKworfSAvKiBhbGxMaW5lc0NvcnIgKi8KKworLy8gVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBtb3JwaGluZyBvZiB0d28gaW1hZ2VzIGludG8gb25lIGltYWdlLCB3aGljaCBpbmNsdWRlcyBtb3JwaGVkCisvLyBpbWFnZSBvciBkZXB0aCBtYXAKKy8vICAgICAgX2xlZnRJbWFnZSAgICAgICAgICAgICAgLSBwb2ludGVyIHRvIGxlZnQgaW1hZ2UKKy8vICAgICAgX2xlZnRMaW5lU3RlcCAgICAgICAgICAgLSBzaXplIG9mIGxpbmUgb24gbGVmdCBpbWFnZSBpbiBieXRlcworLy8gICAgICBfcmlnaHRJbWFnZSAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gcmlnaHQgaW1hZ2UKKy8vICAgICAgX3JpZ2h0TGluZVN0ZXAgICAgICAgICAgLSBzaXplIG9mIGxpbmUgb24gcmlnaHQgaW1hZ2UgaW4gYnl0ZXMKKy8vICAgICAgX3Jlc3VsdEltYWdlICAgICAgICAgICAgLSBwb2ludGVyIHRvIHJlc3VsdCBtb3JwaGVkIGltYWdlCisvLyAgICAgIF9yZXN1bHRMaW5lU3RlcCAgICAgICAgIC0gc2l6ZSBvZiBsaW5lIG9uIHJlc3VsdCBpbWFnZSBpbiBieXRlcworLy8gICAgICBfY29yckFycmF5ICAgICAgICAgICAgICAtIHBvaW50ZXIgdG8gYXJyYXkgd2l0aCBjb3JyZXNwb25kZW5jZXMKKy8vICAgICAgX251bUNvcnJBcnJheSAgICAgICAgICAgLSBwb2ludGVyIHRvIGFycmF5IHdpdGggbnVtYmVycyBjb3JyZXNwb25kZWNlcyBvbiBlYWNoIGxpbmUKKy8vICAgICAgd2lkdGggICAgICAgICAgICAgICAgICAgLSB3aWR0aCBvZiBpbWFnZXMKKy8vICAgICAgaGVpZ2h0ICAgICAgICAgICAgICAgICAgLSBoZWlnaHQgb2YgaW1hZ2VzCisvLyAgICAgIGFscGhhICAgICAgICAgICAgICAgICAgIC0gcG9zaXRpb24gb2YgdmlydHVhbCBjYW1lcmEgKCAwIGNvcnJlc3BvbmRzIHRvIGxlZnQgaW1hZ2UsIDEgLSB0byByaWdodCBvbmUgKQorLy8gICAgICBpbWFnZU5lZWQgICAgICAgICAgICAgICAtIGRlZmluZXMgeW91ciB3aXNoZXMuIGlmIHlvdSB3YW50IHRvIHNlZSBub3JtYWwgbW9ycGhlZCBpbWFnZSB5b3UgaGF2ZSB0byBzZXQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciB0byBtb3JwaE5vcm1hbEltYWdlICggdGhpcyBpcyBkZWZhdWx0IHZhbHVlICksIGVsc2UgaWYgeW91IHdhbnQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZWUgZGVwdGggbWFwIHlvdSBoYXZlIHRvIHNldCB0aGlzIHBhcmFtZXRlciB0byBtb3JwaERlcHRoTWFwIGFuZCBzZXQgdGhlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBwYXJhbWV0ZXIgKCBtYXhQaXhlbERpZmZlcmVuY2UgKSB0byByZWFsIHZhbHVlCisvLyAgICAgIG1heFBpeGVsRGlmZmVyZW5jZSAgICAgIC0gbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBkaWZmZXJlbmNlIG9uIHR3byBpbWFnZXMKK3ZvaWQgQ0N2R3JhcGhDdXRNb3JwaGVyOjpNb3JwaCggdW5zaWduZWQgY2hhciogX2xlZnRJbWFnZSwKKyAgICAgICAgICAgIGludCBfbGVmdExpbmVTdGVwLAorICAgICAgICAgICAgdW5zaWduZWQgY2hhciogX3JpZ2h0SW1hZ2UsCisgICAgICAgICAgICBpbnQgX3JpZ2h0TGluZVN0ZXAsCisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBfcmVzdWx0SW1hZ2UsCisgICAgICAgICAgICBpbnQgX3Jlc3VsdExpbmVTdGVwLAorICAgICAgICAgICAgaW50KiBfY29yckFycmF5LAorICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgaW50IGhlaWdodCwKKyAgICAgICAgICAgIGZsb2F0IGFscGhhLAorICAgICAgICAgICAgbW9ycGhJbWFnZVR5cGUgaW1hZ2VOZWVkLAorICAgICAgICAgICAgaW50IG1heERpZmZlcmVuY2UKKyAgICAgICAgICApCit7CisgICAgdW5zaWduZWQgY2hhciogbGVmdEFycmF5ICAgID0gX2xlZnRJbWFnZTsKKyAgICB1bnNpZ25lZCBjaGFyKiBtaWRkbGVBcnJheSAgPSBfcmVzdWx0SW1hZ2U7CisgICAgdW5zaWduZWQgY2hhciogcmlnaHRBcnJheSAgID0gX3JpZ2h0SW1hZ2U7CisgICAgaW50IGxlZnRMaW5lU2l6ZSAgICAgICAgICAgID0gX2xlZnRMaW5lU3RlcDsKKyAgICBpbnQgbWlkZGxlTGluZVNpemUgICAgICAgICAgPSBfcmVzdWx0TGluZVN0ZXA7CisgICAgaW50IHJpZ2h0TGluZVNpemUgICAgICAgICAgID0gX3JpZ2h0TGluZVN0ZXA7CisKKyAgICBpbnQgbGluZU51bWJlcjsKKyAgICB1bnNpZ25lZCBjaGFyKiBsZWZ0VGVtcDsKKyAgICB1bnNpZ25lZCBjaGFyKiBtaWRkbGVUZW1wOworICAgIHVuc2lnbmVkIGNoYXIqIHJpZ2h0VGVtcDsKKyAgICBpbnQgbGVmdFBpeGVsOworICAgIGludCBwcmV2TGVmdFBpeGVsOworICAgIGludCBtaWRkbGVQaXhlbDsKKyAgICBpbnQgcHJldk1pZGRsZVBpeGVsOworICAgIGludCByaWdodFBpeGVsOworICAgIGludCBwcmV2UmlnaHRQaXhlbDsKKyAgICBpbnQgbGVmdFBpeGVsMzsKKyAgICBpbnQgbWlkZGxlUGl4ZWwzOworICAgIGludCByaWdodFBpeGVsMzsKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKyAgICBpbnQgdGVtcEluZGV4OworICAgIGludCogcmVzdWx0OworICAgIGludCBudW1iZXI7CisgICAgZmxvYXQgYWxwaGExICAgICAgICA9IDEuMGYgLSBhbHBoYTsKKyAgICAKKyAgICBmb3IoIGxpbmVOdW1iZXIgPSAwOyBsaW5lTnVtYmVyIDwgaGVpZ2h0OyBsaW5lTnVtYmVyICsrICkKKyAgICB7CisgICAgICAgIGxlZnRUZW1wICAgID0gbGVmdEFycmF5ICsgbGVmdExpbmVTaXplICogbGluZU51bWJlcjsKKyAgICAgICAgbWlkZGxlVGVtcCAgPSBtaWRkbGVBcnJheSArIG1pZGRsZUxpbmVTaXplICogbGluZU51bWJlcjsKKyAgICAgICAgcmlnaHRUZW1wICAgPSByaWdodEFycmF5ICsgcmlnaHRMaW5lU2l6ZSAqIGxpbmVOdW1iZXI7CisgICAgICAgIG1lbXNldCggKCB2b2lkKiApbWlkZGxlVGVtcCwgMCwgbWlkZGxlTGluZVNpemUgKTsKKworICAgICAgICByZXN1bHQgPSBfY29yckFycmF5ICsgd2lkdGggKiBsaW5lTnVtYmVyOworICAgICAgICBudW1iZXIgPSB3aWR0aDsKKyAgICAgICAgCisgICAgICAgIHByZXZMZWZ0UGl4ZWwgICA9IDA7CisgICAgICAgIHByZXZSaWdodFBpeGVsICA9IHByZXZMZWZ0UGl4ZWwgKyByZXN1bHRbIDAgXTsKKyAgICAgICAgaWYoIHByZXZSaWdodFBpeGVsID49IHdpZHRoICkgeworICAgICAgICAgICAgcHJldlJpZ2h0UGl4ZWwgPSB3aWR0aCAtIDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIHByZXZSaWdodFBpeGVsIDwgMCApIHsKKyAgICAgICAgICAgIHByZXZSaWdodFBpeGVsID0gMDsKKyAgICAgICAgfQorICAgICAgICBwcmV2TWlkZGxlUGl4ZWwgPQorICAgICAgICAgICAgKGludCkoIHByZXZMZWZ0UGl4ZWwgKiBhbHBoYTEgKyBwcmV2UmlnaHRQaXhlbCAqIGFscGhhICk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBudW1iZXIgLSAxOyBpICsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbGVmdFBpeGVsICAgICAgID0gaTsKKyAgICAgICAgICAgIHJpZ2h0UGl4ZWwgICAgICA9IGkgKyByZXN1bHRbIGkgXTsKKyAgICAgICAgICAgIGlmKCByaWdodFBpeGVsID49IHdpZHRoICkgeworICAgICAgICAgICAgICAgIHJpZ2h0UGl4ZWwgPSB3aWR0aCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCByaWdodFBpeGVsIDwgMCApIHsKKyAgICAgICAgICAgICAgICByaWdodFBpeGVsID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1pZGRsZVBpeGVsICAgICA9CisgICAgICAgICAgICAgICAgKGludCkoIGxlZnRQaXhlbCAqIGFscGhhMSArIHJpZ2h0UGl4ZWwgKiBhbHBoYSApOworICAgICAgICAgICAgbGVmdFBpeGVsMyAgICAgID0gbGVmdFBpeGVsICogMzsKKyAgICAgICAgICAgIG1pZGRsZVBpeGVsMyAgICA9IG1pZGRsZVBpeGVsICogMzsKKyAgICAgICAgICAgIHJpZ2h0UGl4ZWwzICAgICA9IHJpZ2h0UGl4ZWwgKiAzOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggaW1hZ2VOZWVkID09IG1vcnBoRGVwdGhNYXAgKSB7CisgICAgICAgICAgICAgICAgaW50IHQgICA9IGxlZnRQaXhlbCAtIHJpZ2h0UGl4ZWwgKyBtYXhEaWZmZXJlbmNlOworICAgICAgICAgICAgICAgIHQgICAgICAgPSB0IDwgMCA/IC10IDogdDsKKyAgICAgICAgICAgICAgICB0ICAgICAgID0gdCAqIDI1NSAvIG1heERpZmZlcmVuY2UgLyAyOworICAgICAgICAgICAgICAgIG1pZGRsZVRlbXBbIG1pZGRsZVBpeGVsMyBdICAgICAgPSAoIHVuc2lnbmVkIGNoYXIgKXQ7CisgICAgICAgICAgICAgICAgbWlkZGxlVGVtcFsgbWlkZGxlUGl4ZWwzICsgMSBdICA9ICggdW5zaWduZWQgY2hhciApdDsKKyAgICAgICAgICAgICAgICBtaWRkbGVUZW1wWyBtaWRkbGVQaXhlbDMgKyAyIF0gID0gKCB1bnNpZ25lZCBjaGFyICl0OworICAgICAgICAgICAgfSAvLyBpZiggaW1hZ2VOZWVkID09IG1vcnBoRGVwdGhNYXAgKQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pZGRsZVRlbXBbIG1pZGRsZVBpeGVsMyBdID0KKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKCBsZWZ0VGVtcFsgbGVmdFBpeGVsMyBdICogYWxwaGExCisgICAgICAgICAgICAgICAgICAgICsgcmlnaHRUZW1wWyByaWdodFBpeGVsMyBdICogYWxwaGEgKTsKKyAgICAgICAgICAgICAgICBtaWRkbGVUZW1wWyBtaWRkbGVQaXhlbDMgKyAxIF0gPQorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhcikoIGxlZnRUZW1wWyBsZWZ0UGl4ZWwzICsgMSBdICogYWxwaGExCisgICAgICAgICAgICAgICAgICAgICsgcmlnaHRUZW1wWyByaWdodFBpeGVsMyArIDEgXSAqIGFscGhhICk7CisgICAgICAgICAgICAgICAgbWlkZGxlVGVtcFsgbWlkZGxlUGl4ZWwzICsgMiBdID0KKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIpKCBsZWZ0VGVtcFsgbGVmdFBpeGVsMyArIDIgXSAqIGFscGhhMQorICAgICAgICAgICAgICAgICAgICArIHJpZ2h0VGVtcFsgcmlnaHRQaXhlbDMgKyAyIF0gKiBhbHBoYSApOworCisgICAgICAgICAgICAgICAgaWYoIG1pZGRsZVBpeGVsIC0gcHJldk1pZGRsZVBpeGVsID4gMSApIC8vIG9jY2x1c2lvbgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxlZnRQaXhlbCAtIHByZXZMZWZ0UGl4ZWwgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExlblNyYyAgPSBsZWZ0UGl4ZWwgLSBwcmV2TGVmdFBpeGVsIC0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBMZW5EZXN0ID0gbWlkZGxlUGl4ZWwgLSBwcmV2TWlkZGxlUGl4ZWwgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gcHJldk1pZGRsZVBpeGVsICsgMTsgaiA8IG1pZGRsZVBpeGVsOyBqICsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wSW5kZXggICA9IHByZXZMZWZ0UGl4ZWwgKyAxICsgTGVuU3JjICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBqIC0gcHJldk1pZGRsZVBpeGVsIC0gMSApIC8gTGVuRGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRkbGVUZW1wWyBqICogMyBdICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRUZW1wWyB0ZW1wSW5kZXggKiAzIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlkZGxlVGVtcFsgaiAqIDMgKyAxIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0VGVtcFsgdGVtcEluZGV4ICogMyArIDEgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRkbGVUZW1wWyBqICogMyArIDIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRUZW1wWyB0ZW1wSW5kZXggKiAzICsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmKCBsZWZ0UGl4ZWwgLSBwcmV2TGVmdFBpeGVsID4gMSApCisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExlblNyYyAgPSByaWdodFBpeGVsIC0gcHJldlJpZ2h0UGl4ZWwgLSAyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IExlbkRlc3QgPSBtaWRkbGVQaXhlbCAtIHByZXZNaWRkbGVQaXhlbCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSBwcmV2TWlkZGxlUGl4ZWwgKyAxOyBqIDwgbWlkZGxlUGl4ZWw7IGogKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBJbmRleCAgID0gcHJldlJpZ2h0UGl4ZWwgKyAxICsgTGVuU3JjICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBqIC0gcHJldk1pZGRsZVBpeGVsIC0gMSApIC8gTGVuRGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWRkbGVUZW1wWyBqICogMyBdICAgICA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0VGVtcFsgdGVtcEluZGV4ICogMyBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZVRlbXBbIGogKiAzICsgMSBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRUZW1wWyB0ZW1wSW5kZXggKiAzICsgMSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZGRsZVRlbXBbIGogKiAzICsgMiBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRUZW1wWyB0ZW1wSW5kZXggKiAzICsgMiBdOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmKCBsZWZ0UGl4ZWwgLSBwcmV2TGVmdFBpeGVsID4gMSApIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgfSAvLyBpZiggbWlkZGxlUGl4ZWwgLSBwcmV2TWlkZGxlUGl4ZWwgPiAxICkKKworICAgICAgICAgICAgfSAvLyBpZiggaW1hZ2VOZWVkID09IG1vcnBoRGVwdGhNYXAgKSBlbHNlCisKKyAgICAgICAgICAgIGlmKCBtaWRkbGVQaXhlbCA+IHByZXZNaWRkbGVQaXhlbCApIHsKKyAgICAgICAgICAgICAgICBpZiggbGVmdFBpeGVsID4gcHJldkxlZnRQaXhlbCApCisgICAgICAgICAgICAgICAgICAgIHByZXZMZWZ0UGl4ZWwgICA9IGxlZnRQaXhlbDsKKyAgICAgICAgICAgICAgICBpZiggcmlnaHRQaXhlbCA+IHByZXZSaWdodFBpeGVsICkKKyAgICAgICAgICAgICAgICAgICAgcHJldlJpZ2h0UGl4ZWwgID0gcmlnaHRQaXhlbDsKKyAgICAgICAgICAgICAgICBwcmV2TWlkZGxlUGl4ZWwgPSBtaWRkbGVQaXhlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAvLyBmb3IoIGkgPSBudW1iZXIgLSAxOyBpID49IDA7IGkgLS0gKQorICAgICAgICAKKyAgICB9IC8vIGZvciggbGluZU51bWJlciA9IDA7IGxpbmVOdW1iZXIgPCBMZWZ0SW1hZ2UgLT4gbV9SYXN0ZXIgLT4gR2V0SGVpZ2h0KCkgKQorCit9IC8vIE1vcnBoCisKK2Jvb2wgIENDdkdyYXBoQ3V0TW9ycGhlcjo6T25DYWxjdWxhdGVTdGVyZW8oKQoreworICAgIEN2U2l6ZSBpbWFnZVNpemVMZWZ0ID0gR2V0SW1hZ2VTaXplKCBtX2xlZnRfaW1nICksCisgICAgICAgICAgIGltYWdlU2l6ZVJpZ2h0ID0gR2V0SW1hZ2VTaXplKCBtX3JpZ2h0X2ltZyApOworCisgICAgaWYoICggaW1hZ2VTaXplTGVmdC53aWR0aCAhPSBpbWFnZVNpemVSaWdodC53aWR0aCApCisgICAgICAgIHx8ICggaW1hZ2VTaXplTGVmdC5oZWlnaHQgIT0gaW1hZ2VTaXplUmlnaHQuaGVpZ2h0ICkgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmKCBtX2NvcnIgKSB7CisgICAgICAgIGZyZWUoIG1fY29yciApOworICAgICAgICBtX2NvcnIgPSBOVUxMOworICAgIH0KKyAgICBtX2NvcnIgPSAoIGludCogKSBtYWxsb2MoIG1fbGVmdF9pbWcgLT4gd2lkdGgKKyAgICAgICAgKiBtX2xlZnRfaW1nIC0+IGhlaWdodAorICAgICAgICAqIHNpemVvZiggaW50ICkgKTsKKworICAgIGlmKCAhbV9zdG9yYWdlICkgeworICAgICAgICBtX3N0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIDAgKTsKKyAgICAgICAgbV9pc1N0b3JhZ2VBbGxvY2F0ZWQgPSB0cnVlOworICAgIH0KKyAgICAvLyBGaW5kIGNvcnJlc3BvbmRlbmNlIGZvciBmdWxsIGltYWdlIGFuZCBzdG9yZSBpdCB0byBjb3JyIGFycmF5CisgICAgYWxsTGluZXNDb3JyKCAoIHVuc2lnbmVkIGNoYXIqICltX2xlZnRfaW1nIC0+IGltYWdlRGF0YSwKKyAgICAgICAgICAgICAgICAgIG1fbGVmdF9pbWcgLT4gd2lkdGhTdGVwLAorICAgICAgICAgICAgICAgICAgKCB1bnNpZ25lZCBjaGFyKiApbV9yaWdodF9pbWcgLT4gaW1hZ2VEYXRhLAorICAgICAgICAgICAgICAgICAgbV9yaWdodF9pbWcgLT4gd2lkdGhTdGVwLAorICAgICAgICAgICAgICAgICAgbV9sZWZ0X2ltZyAtPiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgIG1fbGVmdF9pbWcgLT4gaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgbV9jb3JyLAorICAgICAgICAgICAgICAgICAgbV9tYXhQaXhlbERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICBtX3N0b3JhZ2UgKTsKKworICAgIG1faXNTdGVyZW9SZWFkeSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAgQ0N2R3JhcGhDdXRNb3JwaGVyOjpPbkNhbGN1bGF0ZVZpcnR1YWxJbWFnZSgpCit7CisgICAgLy8gT3V0cHV0IGltYWdlIHRvIFJlc3VsdEltYWdlIHdpbmRvdworICAgIE1vcnBoKCAoIHVuc2lnbmVkIGNoYXIqICltX2xlZnRfaW1nIC0+IGltYWdlRGF0YSwKKyAgICAgICAgICAgbV9sZWZ0X2ltZyAtPndpZHRoU3RlcCwKKyAgICAgICAgICAgKCB1bnNpZ25lZCBjaGFyKiApbV9yaWdodF9pbWcgLT4gaW1hZ2VEYXRhLAorICAgICAgICAgICBtX3JpZ2h0X2ltZyAtPiB3aWR0aFN0ZXAsCisgICAgICAgICAgICggdW5zaWduZWQgY2hhciogKW1fdmlydHVhbF9pbWcgLT4gaW1hZ2VEYXRhLAorICAgICAgICAgICBtX3ZpcnR1YWxfaW1nIC0+IHdpZHRoU3RlcCwKKyAgICAgICAgICAgbV9jb3JyLAorICAgICAgICAgICBtX2xlZnRfaW1nIC0+IHdpZHRoLAorICAgICAgICAgICBtX2xlZnRfaW1nIC0+IGhlaWdodCwKKyAgICAgICAgICAgbV9wYW4gKTsKKworICAgIG1faXNWaXJ0dWFsSW1hZ2VSZWFkeSA9IHRydWU7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAgQ0N2R3JhcGhDdXRNb3JwaGVyOjpPbkNhbGN1bGF0ZURpc3Bhcml0eSgpCit7CisgICAgTW9ycGgoICggdW5zaWduZWQgY2hhciogKW1fbGVmdF9pbWcgLT4gaW1hZ2VEYXRhLAorICAgICAgICAgICBtX2xlZnRfaW1nIC0+d2lkdGhTdGVwLAorICAgICAgICAgICAoIHVuc2lnbmVkIGNoYXIqICltX3JpZ2h0X2ltZyAtPiBpbWFnZURhdGEsCisgICAgICAgICAgIG1fcmlnaHRfaW1nIC0+IHdpZHRoU3RlcCwKKyAgICAgICAgICAgKCB1bnNpZ25lZCBjaGFyKiApbV9kaXNwYXJpdHlfaW1nIC0+IGltYWdlRGF0YSwKKyAgICAgICAgICAgbV9kaXNwYXJpdHlfaW1nIC0+IHdpZHRoU3RlcCwKKyAgICAgICAgICAgbV9jb3JyLAorICAgICAgICAgICBtX2xlZnRfaW1nIC0+IHdpZHRoLAorICAgICAgICAgICBtX2xlZnRfaW1nIC0+IGhlaWdodCwKKyAgICAgICAgICAgbV9wYW4sCisgICAgICAgICAgIG1vcnBoRGVwdGhNYXAsCisgICAgICAgICAgIG1fbWF4UGl4ZWxEaWZmZXJlbmNlICk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCAgQ0N2R3JhcGhDdXRNb3JwaGVyOjpPbkNhbGN1bGF0ZURpc3Bhcml0eUltYWdlKCkKK3sKKyAgICBNb3JwaCggKCB1bnNpZ25lZCBjaGFyKiApbV9sZWZ0X2ltZyAtPiBpbWFnZURhdGEsCisgICAgICAgICAgIG1fbGVmdF9pbWcgLT53aWR0aFN0ZXAsCisgICAgICAgICAgICggdW5zaWduZWQgY2hhciogKW1fcmlnaHRfaW1nIC0+IGltYWdlRGF0YSwKKyAgICAgICAgICAgbV9yaWdodF9pbWcgLT4gd2lkdGhTdGVwLAorICAgICAgICAgICAoIHVuc2lnbmVkIGNoYXIqICltX2Rpc3Bhcml0eV9pbWcgLT4gaW1hZ2VEYXRhLAorICAgICAgICAgICBtX2Rpc3Bhcml0eV9pbWcgLT4gd2lkdGhTdGVwLAorICAgICAgICAgICBtX2NvcnIsCisgICAgICAgICAgIG1fbGVmdF9pbWcgLT4gd2lkdGgsCisgICAgICAgICAgIG1fbGVmdF9pbWcgLT4gaGVpZ2h0LAorICAgICAgICAgICBtX3BhbiwKKyAgICAgICAgICAgbW9ycGhEZXB0aE1hcCwKKyAgICAgICAgICAgbV9tYXhQaXhlbERpZmZlcmVuY2UgKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitDQ3ZHcmFwaEN1dE1vcnBoZXI6OkNDdkdyYXBoQ3V0TW9ycGhlcigpCit7CisgICAgbV9tYXhQaXhlbERpZmZlcmVuY2UgPSBNQVhfRElGRkVSRU5DRTsKKyAgICBtX2NvcnIgPSAwOworICAgIG1faXNTdGVyZW9SZWFkeSA9IGZhbHNlOworICAgIG1faXNWaXJ0dWFsSW1hZ2VSZWFkeSA9IGZhbHNlOworICAgIG1faXNEaXNwYXJpdHlSZWFkeSA9IGZhbHNlOworICAgIG1fc3RvcmFnZSA9IE5VTEw7CisgICAgbV9pc1N0b3JhZ2VBbGxvY2F0ZWQgPSBmYWxzZTsKK30KKworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvZXh0ZW5kZWRlZGdlcy5jcHAgYi9jdmF1eC9zcmMvZXh0ZW5kZWRlZGdlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzZmYwYgotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9leHRlbmRlZGVkZ2VzLmNwcApAQCAtMCwwICsxLDI2OCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3ZhdXguaCIKKworI2lmZGVmIFdJTjMyIC8qIG1ha2Ugc3VyZSBpdCBidWlsZHMgdW5kZXIgTGludXggd2hlbmV2ZXIgaXQgaXMgaW5jbHVkZWQgaW50byBNYWtlZmlsZS5hbSBvciBub3QuICovIAorCisvL3ZvaWQgaWN2Q3V0Q29udG91ciggQ3ZTZXEqIGN1cnJlbnQsIElwbEltYWdlKiBpbWFnZSApOworQ3ZTZXEqIGljdkN1dENvbnRvdXJSYXN0ZXIoIEN2U2VxKiBjdXJyZW50LCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIElwbEltYWdlKiBpbWFnZSApOworCisKKy8vY3JlYXRlIGxpc3RzIG9mIHNlZ21lbnRzIG9mIGFsbCBjb250b3VycyBmcm9tIGltYWdlCitDdlNlcSogY3ZFeHRyYWN0U2luZ2xlRWRnZXMoIElwbEltYWdlKiBpbWFnZSwgLy9idyBpbWFnZSAtIGl0J3MgY29udGVudCB3aWxsIGJlIGRlc3Ryb3llZCBieSBjdkZpbmRDb250b3VycyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDdk1lbVN0b3JhZ2UqIHRtcF9zdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoIHN0b3JhZ2UgKTsKKyAgICBDdlNlcSogY29udG91cnMgPSAwOworICAgIGN2RmluZENvbnRvdXJzKCBpbWFnZSwgdG1wX3N0b3JhZ2UsICZjb250b3Vycywgc2l6ZW9mKEN2Q29udG91ciksIENWX1JFVFJfTElTVCwgQ1ZfQ0hBSU5fQVBQUk9YX05PTkUgKTsKKyAgICBjdlplcm8oIGltYWdlICk7CisKKyAgICAvL2l0ZXJhdGUgdGhyb3VnaCBjb250b3VycworICAgICAgLy9pdGVyYXRlIHRocm91Z2ggdHJlZSAKKyAgICBDdlNlcSogY3VycmVudCA9IGNvbnRvdXJzOworICAgIGludCBudW1iZXIgPSAwOworICAgIGludCBsZXZlbCA9IDE7CisKKyAgICBDdlNlcSogb3V0cHV0ID0gMDsKKyAgICBDdlNlcSogdGFpbF9zZXEgPSAwOyAKKworICAgIC8vYWN0dWFsbHkgdGhpcyBsb29wIGNhbiBpdGVyYXRlcyB0aHJvdWdoIHRyZWUsCisgICAgLy9idXQgc3RpbGwgd2UgdXNlIENWX1JFVFJfTElTVCBpdCBpcyBub3QgdXNlZnVsCisgICAgd2hpbGUoIGN1cnJlbnQgKQorICAgIHsKKyAgICAgICAgbnVtYmVyKys7IAorICAgICAgICAKKyAgICAgICAgLy9nZXQgdmVydGljYWwgbGlzdCBvZiBzZWdtZW50cyBmb3Igb25lIGNvbnRvdXIKKyAgICAgICAgQ3ZTZXEqIG5ld19zZXEgPSBpY3ZDdXRDb250b3VyUmFzdGVyKCBjdXJyZW50LCBzdG9yYWdlLCAgaW1hZ2UgKTsKKworICAgICAgICAvL2FkZCB0aGlzIHZlcnRpY2FsIGxpc3QgdG8gaG9yaXNvbnRhbCBsaXN0CisgICAgICAgIGlmKCBuZXdfc2VxICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHRhaWxfc2VxICkgCisgICAgICAgICAgICB7IAorICAgICAgICAgICAgICAgIHRhaWxfc2VxLT5oX25leHQgPSBuZXdfc2VxOyAKKyAgICAgICAgICAgICAgICBuZXdfc2VxLT5oX3ByZXYgPSB0YWlsX3NlcTsKKyAgICAgICAgICAgICAgICB0YWlsX3NlcSA9IG5ld19zZXE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3V0cHV0ID0gdGFpbF9zZXEgPSBuZXdfc2VxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9pdGVyYXRpb24gdGhyb3VnaCB0cmVlCisgICAgICAgIGlmKCBjdXJyZW50LT52X25leHQgKSAKKyAgICAgICAgeyAgIAorICAgICAgICAgICAgLy9nb3RvIGNoaWxkCisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+dl9uZXh0OworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIAorICAgICAgICB7CisgICAgICAgICAgICAvL2dvIHBhcmVudAorICAgICAgICAgICAgd2hpbGUoICFjdXJyZW50LT5oX25leHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT52X3ByZXY7CisgICAgICAgICAgICAgICAgbGV2ZWwtLTsKKyAgICAgICAgICAgICAgICBpZiggIWxldmVsICkgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBjdXJyZW50ICkgLy9nbyBicm90aGVyCisgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQtPmhfbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vZnJlZSB0ZW1wb3JhcnkgbWVtc3RvcmFnZSB3aXRoIGluaXRpYWwgY29udG91cnMKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdG1wX3N0b3JhZ2UgKTsKKworICAgIHJldHVybiBvdXRwdXQ7IAorfQorCisvL21ha2VzIHZlcnRpY2FsIGxpc3Qgb2Ygc2VnbWVudHMgZm9yIDEgY29udG91cgorQ3ZTZXEqIGljdkN1dENvbnRvdXJSYXN0ZXIoIEN2U2VxKiBjdXJyZW50LCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIElwbEltYWdlKiBpbWFnZSAvKnRtcCBpbWFnZSovKQoreworICAgIC8vaXBsU2V0KGltYWdlLCAwICk7IC8vIHRoaXMgY2FuIGNhdXNlIGRvdWJsZSBlZGdlcyBpZiB0d28gY29udG91cnMgaGF2ZSBjb21tb24gZWRnZQorICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSBpZiBvYmplY3QgaXMgY2lyY2xlIHdpdGggMSBwaXhlbCB3aWR0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gcmVtb3ZlIHN1Y2ggcHJvYmxlbSAtIHJlbW92ZSB0aGlzIGlwbFNldCAKKworICAgIC8vYXBwcm94IGNvbnRvdXIgYnkgc2luZ2xlIGVkZ2VzCisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICAgICAgCisgICAgaW50IHdyaXRpbmcgPSAwOworICAgIGN2U3RhcnRSZWFkU2VxKCBjdXJyZW50LCAmcmVhZGVyLCAwICk7CisgICAgLy9iZWxvdyBsaW5lIGp1c3QgdG8gYXZvaWQgd2FybmluZworICAgIGN2U3RhcnRXcml0ZVNlcSggY3VycmVudC0+ZmxhZ3MsIHNpemVvZihDdkNvbnRvdXIpLCBzaXplb2YoQ3ZQb2ludCksIHN0b3JhZ2UsICZ3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICAKKyAgICBDdlNlcSogb3V0cHV0ID0gMDsKKyAgICBDdlNlcSogdGFpbCA9IDA7CisKKyAgICAvL2ZpcnN0IHBhc3MgdGhyb3VnaCBjb250b3VyIC0gY29tcHV0ZSBudW1iZXIgb2YgYnJhbmNoZXMgYXQgZXZlcnkgcG9pbnQKKyAgICBpbnQgaTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgY3VycmVudC0+dG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdlBvaW50IGN1cjsKKworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBjdXIsIHJlYWRlciApOworCisgICAgICAgIC8vbWFyayBwb2ludAorICAgICAgICAoKHVjaGFyKilpbWFnZS0+aW1hZ2VEYXRhKVtpbWFnZS0+d2lkdGhTdGVwICogY3VyLnkgKyBjdXIueF0rKzsKKyAgICAgICAgYXNzZXJ0KCAoKHVjaGFyKilpbWFnZS0+aW1hZ2VEYXRhKVtpbWFnZS0+d2lkdGhTdGVwICogY3VyLnkgKyBjdXIueF0gIT0gMjU1ICk7CisgICAgICAgIAorICAgIH0KKworICAgIC8vc2Vjb25kIHBhc3MgLSBjcmVhdGUgc2VwYXJhdGUgZWRnZXMKKyAgICBmb3IoIGkgPSAwOyBpIDwgY3VycmVudC0+dG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdlBvaW50IGN1cjsKKworICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBjdXIsIHJlYWRlciApOworCisgICAgICAgIC8vZ2V0IHBpeGVsIGF0IHRoaXMgcG9pbnQKKyAgICAgICAgdWNoYXIgZmxhZyA9IGltYWdlLT5pbWFnZURhdGFbaW1hZ2UtPndpZHRoU3RlcCAqIGN1ci55ICsgY3VyLnhdOworICAgICAgICBpZiggZmxhZyAhPSAyNTUgJiYgZmxhZyA8IDMpIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCF3cml0aW5nKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdlN0YXJ0V3JpdGVTZXEoIGN1cnJlbnQtPmZsYWdzLCBzaXplb2YoQ3ZDb250b3VyKSwgc2l6ZW9mKEN2UG9pbnQpLCBzdG9yYWdlLCAmd3JpdGVyICk7CisgICAgICAgICAgICAgICAgd3JpdGluZyA9IDEgOyAKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9tYXJrIHBvaW50CisgICAgICAgICAgICBpZiggZmxhZyA8IDMgKSAoKHVjaGFyKilpbWFnZS0+aW1hZ2VEYXRhKVtpbWFnZS0+d2lkdGhTdGVwICogY3VyLnkgKyBjdXIueF0gPSAyNTU7CisgICAgICAgICAgICAvL2FkZCBpdCB0byBhbm90aGVyIHNlcQorICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGN1ciwgd3JpdGVyICk7CisgICAgICAgICAgICAKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vZXhjbHVkZSB0aGlzIHBvaW50IGZyb20gY29udG91cgorICAgICAgICAgICBpZiggd3JpdGluZyApIAorICAgICAgICAgICB7CisgICAgICAgICAgICAgICBDdlNlcSogbmV3c2VxID0gY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgICAgICAgICAgICAgd3JpdGluZyA9IDA7CisKKyAgICAgICAgICAgICAgIGlmKCB0YWlsICkKKyAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICB0YWlsLT52X25leHQgPSBuZXdzZXE7CisgICAgICAgICAgICAgICAgICAgbmV3c2VxLT52X3ByZXYgPSB0YWlsOworICAgICAgICAgICAgICAgICAgIHRhaWwgPSBuZXdzZXE7CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gdGFpbCA9IG5ld3NlcTsKKyAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgfSAgICAKKyAgICAgICAgfQorICAgIH0KKworCisgICBpZiggd3JpdGluZyApIC8vaWYgd2VyZSBub3Qgc2VsZiBpbnRlcnNlY3Rpb25zCisgICB7CisgICAgICAgQ3ZTZXEqIG5ld3NlcSA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKTsKKyAgICAgICB3cml0aW5nID0gMDsKKworICAgICAgIGlmKCB0YWlsICkKKyAgICAgICB7CisgICAgICAgICAgIHRhaWwtPnZfbmV4dCA9IG5ld3NlcTsKKyAgICAgICAgICAgbmV3c2VxLT52X3ByZXYgPSB0YWlsOworICAgICAgICAgICB0YWlsID0gbmV3c2VxOworICAgICAgIH0KKyAgICAgICBlbHNlCisgICAgICAgeworICAgICAgICAgICBvdXRwdXQgPSB0YWlsID0gbmV3c2VxOworICAgICAgIH0KKyAgIH0gICAgCisKKworICAgIHJldHVybiBvdXRwdXQ7CisKK30KKworCisvKnZvaWQgaWN2Q3V0Q29udG91ciggQ3ZTZXEqIGN1cnJlbnQsIElwbEltYWdlKiBpbWFnZSApCit7CisgICAgLy9hcHByb3ggY29udG91ciBieSBzaW5nbGUgZWRnZXMKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZTZXFSZWFkZXIgcmV2X3JlYWRlcjsKKyAgICAKKyAgICBjdlN0YXJ0UmVhZFNlcSggY3VycmVudCwgJnJlYWRlciwgMCApOworCisgICAgaW50NjQqIGN1cl9wdCA9IChpbnQ2NCopcmVhZGVyLnB0cjsKKyAgICBpbnQ2NCogcHJldl9wdCA9IChpbnQ2NCopcmVhZGVyLnByZXZfZWxlbTsKKyAgICAKKyAgICAvL3NlYXJjaCBmb3IgcG9pbnQgYSBpbiBhYmEgcG9zaXRpb24KKyAgICBmb3IoIGludCBpID0gMDsgaSA8IGN1cnJlbnQtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2l6ZW9mKGludDY0KSwgcmVhZGVyICk7CisKKyAgICAgICAgLy9jb21wYXJlIGN1cnJlbnQgcmVhZGVyIHBvcyBlbGVtZW50IHdpdGggb2xkIHByZXZpb3VzCisgICAgICAgIGlmKCBwcmV2X3B0WzBdID09ICgoaW50NjQqKXJlYWRlci5wdHIpWzBdICkKKyAgICAgICAgeworICAgICAgICAgICAgLy9yZXR1cm4gdG8gcHJldiBwb3MKKyAgICAgICAgICAgIENWX1BSRVZfU0VRX0VMRU0oIHNpemVvZihpbnQ2NCksIHJlYWRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCisgICAgICAgICAgICAvL3RoaXMgcG9pbnQgaXMgZW5kIG9mIGVkZ2UKKyAgICAgICAgICAgIC8vc3RhcnQgZ29pbmcgYm90aCBkaXJlY3Rpb25zIGFuZCBjb2xsZWN0IGVkZ2UKKyAgICAgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBjdXJyZW50LCAmcmV2X3JlYWRlciwgMSApOworCisgICAgICAgICAgICBpbnQgcG9zID0gY3ZHZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIgKTsKKyAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmV2X3JlYWRlciwgcG9zICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vd2FsayBpbiBib3RoIGRpcmVjdGlvbnMKKyAgICAgICAgICAgIHdoaWxlKDEpOworCisKKyAgICAgICAgfQorICAgICAgICBpbnQ2NCogY3VyX3B0ID0gKGludDY0KilyZWFkZXIucHRyOworICAgICAgICBpbnQ2NCogcHJldl9wdCA9IChpbnQ2NCopcmVhZGVyLnByZXZfZWxlbTsKKworICAgIH0KK30KKyAgICAgICAgCisqLworI2VuZGlmIC8qIFdJTjMyICovCisKKworCisgICAgICAgICAgICAgICAgICAgICAgCmRpZmYgLS1naXQgYS9jdmF1eC9zcmMvcHJlY29tcC5jcHAgYi9jdmF1eC9zcmMvcHJlY29tcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY4M2I0YQotLS0gL2Rldi9udWxsCisrKyBiL2N2YXV4L3NyYy9wcmVjb21wLmNwcApAQCAtMCwwICsxLDQyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jdmF1eC5oIgpkaWZmIC0tZ2l0IGEvY3ZqbmkuY3BwIGIvY3ZqbmkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NzMxYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jdmpuaS5jcHAKQEAgLTAsMCArMSw3OTYgQEAKKy8qDQorT3BlbkNWIGZvciBBbmRyb2lkIE5ESw0KK0NvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNJUHJvcCBQcm9qZWN0IGh0dHA6Ly93d3cuc2lwcm9wLm9yZy8NCisNCitUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4NCitJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KK1Blcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLA0KK2luY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQgZnJlZWx5LA0KK3N1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQorDQorMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuDQorMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KKzMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uDQorKi8NCisjaW5jbHVkZSAiY3ZqbmkuaCINCisjaW5jbHVkZSA8dGltZS5oPg0KKw0KKw0KKyNkZWZpbmUgVEhSRVNIT0xECTEwDQorI2RlZmluZSBUSFJFU0hPTERfTUFYX1ZBTFVFCTI1NQ0KKw0KKyNkZWZpbmUgQ09OVE9VUl9NQVhfTEVWRUwJMQ0KKyNkZWZpbmUgTElORV9USElDS05FU1MJMg0KKyNkZWZpbmUgTElORV9UWVBFCTgNCisNCisjZGVmaW5lIEhBQVJfU0NBTEUgKDEuNCkNCisjZGVmaW5lIElNQUdFX1NDQUxFICgyKQ0KKyNkZWZpbmUgTUlOX05FSUdIQk9SUyAoMikNCisjZGVmaW5lIEhBQVJfRkxBR1NfU0lOR0xFX0ZBQ0UgKDAgfCBDVl9IQUFSX0ZJTkRfQklHR0VTVF9PQkpFQ1QgfCBDVl9IQUFSX0RPX1JPVUdIX1NFQVJDSCkNCisjZGVmaW5lIEhBQVJfRkxBR1NfQUxMX0ZBQ0VTICgwKQ0KKy8vIE90aGVyIG9wdGlvbnMgd2UgZHJvcHBlZCBvdXQ6DQorLy8gQ1ZfSEFBUl9ET19DQU5OWV9QUlVOSU5HIHwgQ1ZfSEFBUl9TQ0FMRV9JTUFHRQ0KKyNkZWZpbmUgTUlOX1NJWkVfV0lEVEggKDIwKQ0KKyNkZWZpbmUgTUlOX1NJWkVfSEVJR0hUICgyMCkNCisjZGVmaW5lIFBBRF9GQUNFX1NJWkUgKDEwKQ0KKyNkZWZpbmUgUEFEX0ZBQ0VfQVJFQSAoNDApDQorI2RlZmluZSBQQURfRkFDRV9BUkVBXzIgKFBBRF9GQUNFX0FSRUEgKiAyKQ0KKw0KKy8vIEluaXRpYWxpemUgYSBzb2NrZXQgY2FwdHVyZSB0byBncmFiIGltYWdlcyBmcm9tIGEgc29ja2V0IGNvbm5lY3Rpb24uDQorSk5JRVhQT1JUDQoramJvb2xlYW4NCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfY3JlYXRlU29ja2V0Q2FwdHVyZShKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQkgIGpvYmplY3QgdGhpeiwNCisJCQkJCQkJCQkJCQkgIGpzdHJpbmcgYWRkcmVzc19zdHIsDQorCQkJCQkJCQkJCQkJICBqc3RyaW5nIHBvcnRfc3RyLA0KKwkJCQkJCQkJCQkJCSAgamludCB3aWR0aCwNCisJCQkJCQkJCQkJCQkgIGppbnQgaGVpZ2h0KSB7DQorCWNvbnN0IGNoYXIgKmFkZHJlc3NfY2hhcnMgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGFkZHJlc3Nfc3RyLCAwKTsNCisJaWYgKGFkZHJlc3NfY2hhcnMgPT0gMCkgew0KKwkJTE9HVigiRXJyb3IgbG9hZGluZyBzb2NrZXQgYWRkcmVzcy4iKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkNCisJY29uc3QgY2hhciAqcG9ydF9jaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMocG9ydF9zdHIsIDApOw0KKwlpZiAocG9ydF9jaGFycyA9PSAwKSB7DQorCQllbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhZGRyZXNzX3N0ciwgYWRkcmVzc19jaGFycyk7DQorCQlMT0dWKCJFcnJvciBsb2FkaW5nIHNvY2tldCBwb3J0LiIpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorCQkJCQkJCQkJCQkJCQ0KKwltX2NhcHR1cmUgPSBjdkNyZWF0ZVNvY2tldENhcHR1cmUoYWRkcmVzc19jaGFycywgcG9ydF9jaGFycywgd2lkdGgsIGhlaWdodCk7DQorCWVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3Nfc3RyLCBhZGRyZXNzX2NoYXJzKTsNCisJZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMocG9ydF9zdHIsIHBvcnRfY2hhcnMpOw0KKwlpZiAobV9jYXB0dXJlID09IDApDQorCXsNCisJCUxPR1YoIkVycm9yIGNyZWF0aW5nIHNvY2tldCBjYXB0dXJlLiIpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9DQorCQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorSk5JRVhQT1JUDQordm9pZA0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9yZWxlYXNlU29ja2V0Q2FwdHVyZShKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQkgICBqb2JqZWN0IHRoaXopIHsNCisJaWYgKG1fY2FwdHVyZSkgew0KKwkJY3ZSZWxlYXNlQ2FwdHVyZSgmbV9jYXB0dXJlKTsNCisJCW1fY2FwdHVyZSA9IDA7DQorCX0NCit9DQorDQorSk5JRVhQT1JUDQoramJvb2xlYW4NCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZ3JhYlNvdXJjZUltYWdlRnJvbUNhcHR1cmUoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJCQkJCQkgam9iamVjdCB0aGl6KSB7DQorCWlmIChtX2NhcHR1cmUgPT0gMCkNCisJew0KKwkJTE9HRSgiQ2FwdHVyZSB3YXMgbmV2ZXIgaW5pdGlhbGl6ZWQuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJDQorCWlmIChjdkdyYWJGcmFtZShtX2NhcHR1cmUpID09IDApDQorCXsNCisJCUxPR0UoIkZhaWxlZCB0byBncmFiIGZyYW1lIGZyb20gdGhlIGNhcHR1cmUuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJDQorCUlwbEltYWdlICpmcmFtZSA9IGN2UmV0cmlldmVGcmFtZShtX2NhcHR1cmUpOw0KKwlpZiAoZnJhbWUgPT0gMCkNCisJew0KKwkJTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGZyYW1lIGZyb20gdGhlIGNhcHR1cmUuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJDQorCWlmIChtX3NvdXJjZUltYWdlKSB7DQorCQljdlJlbGVhc2VJbWFnZSgmbV9zb3VyY2VJbWFnZSk7DQorCQltX3NvdXJjZUltYWdlID0gMDsNCisJfQ0KKwkNCisJbV9zb3VyY2VJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZHZXRTaXplKGZyYW1lKSwgSVBMX0RFUFRIXzhVLCANCisJCWZyYW1lLT5uQ2hhbm5lbHMpOw0KKwkNCisJLy8gQ2hlY2sgdGhlIG9yaWdpbiBvZiBpbWFnZS4gSWYgdG9wIGxlZnQsIGNvcHkgdGhlIGltYWdlIGZyYW1lIHRvIGZyYW1lX2NvcHkuDQorCS8vIEVsc2UgZmxpcCBhbmQgY29weSB0aGUgaW1hZ2UuDQorCWlmIChmcmFtZS0+b3JpZ2luID09IElQTF9PUklHSU5fVEwpIHsNCisJICAgIGN2Q29weShmcmFtZSwgbV9zb3VyY2VJbWFnZSwgMCk7DQorCX0NCisJZWxzZSB7DQorCSAgICBjdkZsaXAoZnJhbWUsIG1fc291cmNlSW1hZ2UsIDApOw0KKwl9DQorCQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLy8gR2VuZXJhdGUgYW5kIHJldHVybiBhIGJvb2xlYW4gYXJyYXkgZnJvbSB0aGUgc291cmNlIGltYWdlLg0KKy8vIFJldHVybiAwIGlmIGEgZmFpbHVyZSBvY2N1cnMgb3IgaWYgdGhlIHNvdXJjZSBpbWFnZSBpcyB1bmRlZmluZWQuDQorSk5JRVhQT1JUDQoramJvb2xlYW5BcnJheQ0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9nZXRTb3VyY2VJbWFnZShKTklFbnYqIGVudiwNCisJCQkJCQkJCQkgICAgCSBqb2JqZWN0IHRoaXopDQorew0KKwlpZiAobV9zb3VyY2VJbWFnZSA9PSAwKSB7DQorCQlMT0dFKCJFcnJvciBzb3VyY2UgaW1hZ2Ugd2FzIG5vdCBzZXQuIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJQ3ZNYXQgc3R1YjsNCisgICAgQ3ZNYXQgKm1hdF9pbWFnZSA9IGN2R2V0TWF0KG1fc291cmNlSW1hZ2UsICZzdHViKTsNCisgICAgaW50IGNoYW5uZWxzID0gQ1ZfTUFUX0NOKCBtYXRfaW1hZ2UtPnR5cGUgKTsNCisgICAgaW50IGlwbF9kZXB0aCA9IGN2Q3ZUb0lwbERlcHRoKG1hdF9pbWFnZS0+dHlwZSk7DQorDQorCVdMTm9uRmlsZUJ5dGVTdHJlYW0gKnN0cm0gPSBuZXcgV0xOb25GaWxlQnl0ZVN0cmVhbSgpOw0KKyAgICBsb2FkSW1hZ2VCeXRlcyhtYXRfaW1hZ2UtPmRhdGEucHRyLCBtYXRfaW1hZ2UtPnN0ZXAsIG1hdF9pbWFnZS0+d2lkdGgsDQorCQltYXRfaW1hZ2UtPmhlaWdodCwgaXBsX2RlcHRoLCBjaGFubmVscywgc3RybSk7DQorCQ0KKwlpbnQgaW1hZ2VTaXplID0gc3RybS0+R2V0U2l6ZSgpOw0KKwlqYm9vbGVhbkFycmF5IHJlc19hcnJheSA9IGVudi0+TmV3Qm9vbGVhbkFycmF5KGltYWdlU2l6ZSk7DQorICAgIGlmIChyZXNfYXJyYXkgPT0gMCkgew0KKwkJTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIGEgbmV3IGJvb2xlYW4gYXJyYXkgZm9yIHRoZSBzb3VyY2UgaW1hZ2UuIik7DQorICAgICAgICByZXR1cm4gMDsNCisgICAgfQ0KKyAgICBlbnYtPlNldEJvb2xlYW5BcnJheVJlZ2lvbihyZXNfYXJyYXksIDAsIGltYWdlU2l6ZSwgKGpib29sZWFuKilzdHJtLT5HZXRCeXRlKCkpOw0KKwkNCisJc3RybS0+Q2xvc2UoKTsNCisJU0FGRV9ERUxFVEUoc3RybSk7DQorCQ0KKwlyZXR1cm4gcmVzX2FycmF5Ow0KK30NCisNCisvLyBHaXZlbiBhbiBpbnRlZ2VyIGFycmF5IG9mIGltYWdlIGRhdGEsIGxvYWQgYW4gSXBsSW1hZ2UuDQorLy8gSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIgdG8gcmVsZWFzZSB0aGUgSXBsSW1hZ2UuDQorSXBsSW1hZ2UqIGdldElwbEltYWdlRnJvbUludEFycmF5KEpOSUVudiogZW52LCBqaW50QXJyYXkgYXJyYXlfZGF0YSwgDQorCQkJCQkJCQkgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7DQorCS8vIExvYWQgSW1hZ2UNCisJaW50ICpwaXhlbHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMoYXJyYXlfZGF0YSwgMCk7DQorCWlmIChwaXhlbHMgPT0gMCkgew0KKwkJTE9HRSgiRXJyb3IgZ2V0dGluZyBpbnQgYXJyYXkgb2YgcGl4ZWxzLiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCUlwbEltYWdlICppbWFnZSA9IGxvYWRQaXhlbHMocGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KTsNCisJZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheV9kYXRhLCBwaXhlbHMsIDApOw0KKwlpZihpbWFnZSA9PSAwKSB7DQorCQlMT0dFKCJFcnJvciBsb2FkaW5nIHBpeGVsIGFycmF5LiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCXJldHVybiBpbWFnZTsNCit9DQorDQorLy8gU2V0IHRoZSBzb3VyY2UgaW1hZ2UgYW5kIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgZmFsc2Ugb3RoZXJ3aXNlLg0KK0pOSUVYUE9SVA0KK2pib29sZWFuDQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX3NldFNvdXJjZUltYWdlKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQkJIGpvYmplY3QgdGhpeiwNCisJCQkJCQkJCQkJCSBqaW50QXJyYXkgcGhvdG9fZGF0YSwNCisJCQkJCQkJCQkJCSBqaW50IHdpZHRoLA0KKwkJCQkJCQkJCQkJIGppbnQgaGVpZ2h0KQ0KK3sJDQorCS8vIFJlbGVhc2UgdGhlIGltYWdlIGlmIGl0IGhhc24ndCBhbHJlYWR5IGJlZW4gcmVsZWFzZWQuDQorCWlmIChtX3NvdXJjZUltYWdlKSB7DQorCQljdlJlbGVhc2VJbWFnZSgmbV9zb3VyY2VJbWFnZSk7DQorCQltX3NvdXJjZUltYWdlID0gMDsNCisJfQ0KKwltX2ZhY2VzRm91bmQgPSAwOw0KKwkNCisJbV9zb3VyY2VJbWFnZSA9IGdldElwbEltYWdlRnJvbUludEFycmF5KGVudiwgcGhvdG9fZGF0YSwgd2lkdGgsIGhlaWdodCk7DQorCWlmIChtX3NvdXJjZUltYWdlID09IDApIHsNCisJCUxPR0UoIkVycm9yIHNvdXJjZSBpbWFnZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4iKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK0pOSUVYUE9SVA0KK2pib29sZWFuQXJyYXkNCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZmluZENvbnRvdXJzKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCWppbnQgd2lkdGgsDQorCQkJCQkJCQkJCWppbnQgaGVpZ2h0KSB7DQorCUlwbEltYWdlICpncmF5SW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdkdldFNpemUobV9zb3VyY2VJbWFnZSksIElQTF9ERVBUSF84VSwgMSApOwkJLy8Jg0+DjIFbg1iDUIFbg4uJ5pGcl3BJcGxJbWFnZQ0KKwlJcGxJbWFnZSAqYmluYXJ5SW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdkdldFNpemUobV9zb3VyY2VJbWFnZSksIElQTF9ERVBUSF84VSwgMSApOwkvLwkykmyJ5pGcl3BJcGxJbWFnZQ0KKwlJcGxJbWFnZSAqY29udG91ckltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZHZXRTaXplKG1fc291cmNlSW1hZ2UpLCBJUExfREVQVEhfOFUsIDMgKTsJLy8Jl9aKc4nmkZyXcElwbEltYWdlDQorDQorCS8vCUJHUoKpgueDT4OMgVuDWINQgVuDi4LJlc+Kt4K3gukNCisJY3ZDdnRDb2xvciggbV9zb3VyY2VJbWFnZSwgZ3JheUltYWdlLCBDVl9CR1IyR1JBWSApOw0KKw0KKwkvLwmDT4OMgVuDWINQgVuDi4KpgucykmyCyZXPireCt4LpDQorCWN2VGhyZXNob2xkKCBncmF5SW1hZ2UsIGJpbmFyeUltYWdlLCBUSFJFU0hPTEQsIFRIUkVTSE9MRF9NQVhfVkFMVUUsIENWX1RIUkVTSF9CSU5BUlkgKTsNCisNCisJLy8Jl9aKc5KKj2+XcILMg4GDgoOKgvCKbZXbgreC6Q0KKwlDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIDAgKTsJLy8JkoqPb4KzguqCvZfWinOC8JXbkbaCt4Lpl8yI5g0KKwlDdlNlcSogZmluZF9jb250b3VyID0gMDsJCS8vCZfWinOC1oLMg3yDQ4OTg14gICAgICAgICAgIA0KKw0KKwkvLwkykmyJ5pGckoaCzJfWinOC8IypgsKCr4FBgruCzJCUgvCV1IK3DQorCWludCBmaW5kX2NvbnRvdXJfbnVtID0gY3ZGaW5kQ29udG91cnMoIA0KKwkJYmluYXJ5SW1hZ2UsCQkJLy8Jk/yXzYnmkZwogleDcoNig2eDVoOTg0+Di4Ngg4ODk4Nsg4uBag0KKwkJc3RvcmFnZSwJCQkJLy8JkoqPb4KzguqCvZfWinOC8JXbkbaCt4Lpl8yI5g0KKwkJJmZpbmRfY29udG91ciwJCQkvLwmI6pTUik+RpILMl9aKc4LWgsyDfINDg5ODXoLWgsyDfINDg5ODXg0KKwkJc2l6ZW9mKCBDdkNvbnRvdXIgKSwJLy8Jg1aBW4NQg5ODWIN3g2KDX4LMg1SDQ4NZDQorCQlDVl9SRVRSX0xJU1QsCQkJLy8JkoqPb4OCgVuDaCANCisJCUNWX0NIQUlOX0FQUFJPWF9OT05FLAkvLwmQhJLojuiWQA0KKwkJY3ZQb2ludCggMCwgMCApCQkJLy8Jg0mDdINag2KDZw0KKwkpOw0KKw0KKwkvLwmVqJHMgsyX1opzgvCQ1JBGgsWVYInmgreC6Q0KKwlDdlNjYWxhciByZWQgPSBDVl9SR0IoIDI1NSwgMCwgMCApOw0KKwljdkRyYXdDb250b3VycyggDQorCQltX3NvdXJjZUltYWdlLAkJCS8vCZfWinOC8JVgieaCt4LpieaRnA0KKwkJZmluZF9jb250b3VyLAkJCS8vCY3Fj4mCzJfWinOC1oLMg3yDQ4OTg14NCisJCXJlZCwJCQkJCS8vCYpPkaSX1opzkPyCzJBGDQorCQlyZWQsCQkJCQkvLwmT4JGkl9aKc5D8gWmMioFqgsyQRg0KKwkJQ09OVE9VUl9NQVhfTEVWRUwsCQkvLwmVYInmgrOC6oLpl9aKc4LMjcWR5YOMg3iDiw0KKwkJTElORV9USElDS05FU1MsCQkJLy8JlWCJ5oKzguqC6ZfWinOQ/ILMkb6Csw0KKwkJTElORV9UWVBFLAkJCQkvLwmQ/ILMju2X3g0KKwkJY3ZQb2ludCggMCwgMCApCQkJLy8Jg0mDdINag2KDZw0KKwkpOyAgIA0KKw0KKwlpbnQgaW1hZ2VTaXplOw0KKwlDdk1hdCBzdHViLCAqbWF0X2ltYWdlOw0KKyAgICBpbnQgY2hhbm5lbHMsIGlwbF9kZXB0aDsNCisgICAgbWF0X2ltYWdlID0gY3ZHZXRNYXQoIG1fc291cmNlSW1hZ2UsICZzdHViICk7DQorICAgIGNoYW5uZWxzID0gQ1ZfTUFUX0NOKCBtYXRfaW1hZ2UtPnR5cGUgKTsNCisNCisgICAgaXBsX2RlcHRoID0gY3ZDdlRvSXBsRGVwdGgobWF0X2ltYWdlLT50eXBlKTsNCisNCisJTE9HVigiTG9hZCBsb2FkSW1hZ2VCeXRlcy4iKTsNCisJV0xOb25GaWxlQnl0ZVN0cmVhbSogc3RybSA9IG5ldyBXTE5vbkZpbGVCeXRlU3RyZWFtKCk7DQorICAgIGxvYWRJbWFnZUJ5dGVzKG1hdF9pbWFnZS0+ZGF0YS5wdHIsIG1hdF9pbWFnZS0+c3RlcCwgbWF0X2ltYWdlLT53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdF9pbWFnZS0+aGVpZ2h0LCBpcGxfZGVwdGgsIGNoYW5uZWxzLCBzdHJtKTsNCisNCisJaW1hZ2VTaXplID0gc3RybS0+R2V0U2l6ZSgpOw0KKwlqYm9vbGVhbkFycmF5IHJlc19hcnJheSA9IGVudi0+TmV3Qm9vbGVhbkFycmF5KGltYWdlU2l6ZSk7DQorCUxPR1YoIkxvYWQgTmV3Qm9vbGVhbkFycmF5LiIpOw0KKyAgICBpZiAocmVzX2FycmF5ID09IDApIHsNCisgICAgICAgIHJldHVybiAwOw0KKyAgICB9DQorICAgIGVudi0+U2V0Qm9vbGVhbkFycmF5UmVnaW9uKHJlc19hcnJheSwgMCwgaW1hZ2VTaXplLCAoamJvb2xlYW4qKXN0cm0tPkdldEJ5dGUoKSk7DQorCUxPR1YoIkxvYWQgU2V0Qm9vbGVhbkFycmF5UmVnaW9uLiIpOw0KKw0KKwlMT0dWKCJSZWxlYXNlIHNvdXJjZUltYWdlIik7DQorCWlmIChtX3NvdXJjZUltYWdlKSB7DQorCQljdlJlbGVhc2VJbWFnZSgmbV9zb3VyY2VJbWFnZSk7DQorCQltX3NvdXJjZUltYWdlID0gMDsNCisJfQ0KKwlMT0dWKCJSZWxlYXNlIGJpbmFyeUltYWdlIik7DQorCWN2UmVsZWFzZUltYWdlKCAmYmluYXJ5SW1hZ2UgKTsNCisJTE9HVigiUmVsZWFzZSBncmF5SW1hZ2UiKTsNCisJY3ZSZWxlYXNlSW1hZ2UoICZncmF5SW1hZ2UgKTsNCisJTE9HVigiUmVsZWFzZSBjb250b3VySW1hZ2UiKTsNCisJY3ZSZWxlYXNlSW1hZ2UoICZjb250b3VySW1hZ2UgKTsNCisJTE9HVigiUmVsZWFzZSBzdG9yYWdlIik7DQorCWN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7DQorCUxPR1YoIkRlbGV0ZSBzdHJtIik7DQorCXN0cm0tPkNsb3NlKCk7DQorCVNBRkVfREVMRVRFKHN0cm0pOw0KKw0KKwlyZXR1cm4gcmVzX2FycmF5Ow0KK30NCisNCitKTklFWFBPUlQNCitqYm9vbGVhbg0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9pbml0RmFjZURldGVjdGlvbihKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCQkJanN0cmluZyBjYXNjYWRlX3BhdGhfc3RyKSB7DQorCQ0KKwkvLyBGaXJzdCBjYWxsIHJlbGVhc2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgaXMgZW1wdHkuDQorCUphdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX3JlbGVhc2VGYWNlRGV0ZWN0aW9uKGVudiwgdGhpeik7DQorCQkJCQkJCQkJCQkJDQorCWNoYXIgYnVmZmVyWzEwMF07DQorCWNsb2NrX3QgdG90YWxfdGltZV9zdGFydCA9IGNsb2NrKCk7DQorCQ0KKwltX3NtYWxsZXN0RmFjZVNpemUud2lkdGggPSBNSU5fU0laRV9XSURUSDsNCisJbV9zbWFsbGVzdEZhY2VTaXplLmhlaWdodCA9IE1JTl9TSVpFX0hFSUdIVDsNCisJDQorCWNvbnN0IGNoYXIgKmNhc2NhZGVfcGF0aF9jaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY2FzY2FkZV9wYXRoX3N0ciwgMCk7DQorCWlmIChjYXNjYWRlX3BhdGhfY2hhcnMgPT0gMCkgew0KKwkJTE9HRSgiRXJyb3IgZ2V0dGluZyBjYXNjYWRlIHN0cmluZy4iKTsNCisJCXJldHVybiBmYWxzZTsNCisJfQ0KKwkNCisJbV9jYXNjYWRlID0gKEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiljdkxvYWQoY2FzY2FkZV9wYXRoX2NoYXJzKTsNCisJZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoY2FzY2FkZV9wYXRoX3N0ciwgY2FzY2FkZV9wYXRoX2NoYXJzKTsNCisJaWYgKG1fY2FzY2FkZSA9PSAwKSB7DQorCQlMT0dFKCJFcnJvciBsb2FkaW5nIGNhc2NhZGUuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisJDQorCW1fc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgwKTsNCisJDQorCWNsb2NrX3QgdG90YWxfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gdG90YWxfdGltZV9zdGFydDsNCisJc3ByaW50ZihidWZmZXIsICJUb3RhbCBUaW1lIHRvIGluaXQ6ICVmIiwgKGRvdWJsZSl0b3RhbF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KKwlMT0dWKGJ1ZmZlcik7DQorCQ0KKwlyZXR1cm4gdHJ1ZTsNCit9DQorDQorLy8gUmVsZWFzZSBhbGwgb2YgdGhlIG1lbW9yeSB1c2VkIGJ5IGZhY2UgdHJhY2tpbmcuDQorSk5JRVhQT1JUDQordm9pZA0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9yZWxlYXNlRmFjZURldGVjdGlvbihKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQkgICBqb2JqZWN0IHRoaXopIHsNCisJCQkJCQkJCQkJCQ0KKwltX2ZhY2VzRm91bmQgPSAwOw0KKwltX2ZhY2VDcm9wQXJlYS53aWR0aCA9IG1fZmFjZUNyb3BBcmVhLmhlaWdodCA9IDA7DQorCQ0KKwlpZiAobV9jYXNjYWRlKSB7DQorCQljdlJlbGVhc2VIYWFyQ2xhc3NpZmllckNhc2NhZGUoJm1fY2FzY2FkZSk7DQorCQltX2Nhc2NhZGUgPSAwOw0KKwl9DQorCQ0KKwlpZiAobV9zb3VyY2VJbWFnZSkgew0KKwkJY3ZSZWxlYXNlSW1hZ2UoJm1fc291cmNlSW1hZ2UpOw0KKwkJbV9zb3VyY2VJbWFnZSA9IDA7DQorCX0NCisJDQorCWlmIChtX2dyYXlJbWFnZSkgew0KKwkJY3ZSZWxlYXNlSW1hZ2UoJm1fZ3JheUltYWdlKTsNCisJCW1fZ3JheUltYWdlID0gMDsNCisJfQ0KKwkNCisJaWYgKG1fc21hbGxJbWFnZSkgew0KKwkJY3ZSZWxlYXNlSW1hZ2UoJm1fc21hbGxJbWFnZSk7DQorCQltX3NtYWxsSW1hZ2UgPSAwOw0KKwl9DQorCQ0KKwlpZiAobV9zdG9yYWdlKSB7DQorCQljdlJlbGVhc2VNZW1TdG9yYWdlKCZtX3N0b3JhZ2UpOw0KKwkJbV9zdG9yYWdlID0gMDsNCisJfQ0KK30NCisNCisvLyBJbml0YWxpemUgdGhlIHNtYWxsIGltYWdlIGFuZCB0aGUgZ3JheSBpbWFnZSB1c2luZyB0aGUgaW5wdXQgc291cmNlIGltYWdlLg0KKy8vIElmIGEgcHJldmlvdXMgZmFjZSB3YXMgc3BlY2lmaWVkLCB3ZSB3aWxsIGxpbWl0IHRoZSBST0kgdG8gdGhhdCBmYWNlLg0KK3ZvaWQgaW5pdEZhY2VEZXRlY3Rpb25JbWFnZXMoSXBsSW1hZ2UgKnNvdXJjZUltYWdlLCBkb3VibGUgc2NhbGUgPSAxLjApIHsNCisJaWYgKG1fZ3JheUltYWdlID09IDApIHsNCisJCW1fZ3JheUltYWdlID0gY3ZDcmVhdGVJbWFnZShjdkdldFNpemUoc291cmNlSW1hZ2UpLCBJUExfREVQVEhfOFUsIDEpOw0KKwl9DQorCQ0KKwlpZiAobV9zbWFsbEltYWdlID09IDApIHsNCisJCW1fc21hbGxJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKGN2Um91bmQoc291cmNlSW1hZ2UtPndpZHRoIC8gc2NhbGUpLCANCisJCQljdlJvdW5kKHNvdXJjZUltYWdlLT5oZWlnaHQgLyBzY2FsZSkpLCBJUExfREVQVEhfOFUsIDEpOw0KKwl9DQorCQ0KKwlpZihtX2ZhY2VDcm9wQXJlYS53aWR0aCA+IDAgJiYgbV9mYWNlQ3JvcEFyZWEuaGVpZ2h0ID4gMCkgew0KKwkJY3ZTZXRJbWFnZVJPSShtX3NtYWxsSW1hZ2UsIG1fZmFjZUNyb3BBcmVhKTsNCisJDQorCQlDdlJlY3QgdFByZXYgPSBjdlJlY3QobV9mYWNlQ3JvcEFyZWEueCAqIHNjYWxlLCBtX2ZhY2VDcm9wQXJlYS55ICogc2NhbGUsIA0KKwkJCW1fZmFjZUNyb3BBcmVhLndpZHRoICogc2NhbGUsIG1fZmFjZUNyb3BBcmVhLmhlaWdodCAqIHNjYWxlKTsNCisJCWN2U2V0SW1hZ2VST0koc291cmNlSW1hZ2UsIHRQcmV2KTsNCisJCWN2U2V0SW1hZ2VST0kobV9ncmF5SW1hZ2UsIHRQcmV2KTsNCisJfSBlbHNlIHsNCisJCWN2UmVzZXRJbWFnZVJPSShtX3NtYWxsSW1hZ2UpOw0KKwkJY3ZSZXNldEltYWdlUk9JKG1fZ3JheUltYWdlKTsNCisJfQ0KKwkNCisgICAgY3ZDdnRDb2xvcihzb3VyY2VJbWFnZSwgbV9ncmF5SW1hZ2UsIENWX0JHUjJHUkFZKTsNCisgICAgY3ZSZXNpemUobV9ncmF5SW1hZ2UsIG1fc21hbGxJbWFnZSwgQ1ZfSU5URVJfTElORUFSKTsNCisgICAgY3ZFcXVhbGl6ZUhpc3QobV9zbWFsbEltYWdlLCBtX3NtYWxsSW1hZ2UpOw0KKwljdkNsZWFyTWVtU3RvcmFnZShtX3N0b3JhZ2UpOw0KKwkNCisJY3ZSZXNldEltYWdlUk9JKHNvdXJjZUltYWdlKTsNCit9DQorDQorLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiByZWN0YW5nbGVzLCByZXR1cm4gYW4gYXJyYXkgb2YgQW5kcm9pZCBSZWN0IG9iamVjdHMNCisvLyBvciBudWxsIGlmIGFueSBlcnJvcnMgb2NjdXIuDQoram9iamVjdEFycmF5IHNlcVJlY3RzVG9BbmRyb2lkUmVjdHMoSk5JRW52KiBlbnYsIEN2U2VxICpyZWN0cykgew0KKwlpZiAocmVjdHMgPT0gMCB8fCByZWN0cy0+dG90YWwgPD0gMCkgew0KKwkJTE9HRSgiTm8gcmVjdGFuZ2xlcyB3ZXJlIHNwZWNpZmllZCEiKTsNCisJCXJldHVybiAwOw0KKwl9DQorCQ0KKwlqY2xhc3MgamNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL1JlY3QiKTsNCisJaWYgKGpjbHMgPT0gMCkgew0KKwkJTE9HRSgiVW5hYmxlIHRvIGZpbmQgY2xhc3MgYW5kcm9pZC5ncmFwaGljcy5SZWN0Iik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJam1ldGhvZElEIGpjb25zdHJ1Y3QgPSBlbnYtPkdldE1ldGhvZElEKGpjbHMsICI8aW5pdD4iLCAiKElJSUkpViIpOw0KKwlpZiAoamNvbnN0cnVjdCA9PSAwKSB7DQorCQlMT0dFKCJVbmFibGUgdG8gZmluZCBjb25zdHJ1Y3RvciBSZWN0KGludCwgaW50LCBpbnQsIGludCkiKTsNCisJCXJldHVybiAwOw0KKwl9DQorCQ0KKwlqb2JqZWN0QXJyYXkgYXJ5ID0gZW52LT5OZXdPYmplY3RBcnJheShyZWN0cy0+dG90YWwsIGpjbHMsIDApOw0KKwlpZiAoYXJ5ID09IDApIHsNCisJCUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgUmVjdCBhcnJheSIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjdHMtPnRvdGFsOyBpKyspIHsNCisJCWNoYXIgYnVmZmVyWzEwMF07DQorCQlDdlJlY3QgKnJlY3QgPSAoQ3ZSZWN0KiljdkdldFNlcUVsZW0ocmVjdHMsIGkpOw0KKwkJaWYgKHJlY3QgPT0gMCkgew0KKwkJCXNwcmludGYoYnVmZmVyLCAiSW52YWxpZCBSZWN0YW5nbGUgIyVkIiwgaSk7DQorCQkJTE9HRShidWZmZXIpOw0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKwkJDQorCQlqb2JqZWN0IGpyZWN0ID0gZW52LT5OZXdPYmplY3QoamNscywgamNvbnN0cnVjdCwgcmVjdC0+eCwgcmVjdC0+eSwgDQorCQkJcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7DQorCQlpZiAoanJlY3QgPT0gMCkgew0KKwkJCXNwcmludGYoYnVmZmVyLCAiVW5hYmxlIHRvIGNyZWF0ZSBBbmRyb2lkIFJlY3Qgb2JqZWN0IGZvciByZWN0YW5nbGUgIyVkIiwgaSk7DQorCQkJTE9HRShidWZmZXIpOw0KKwkJCXJldHVybiAwOw0KKwkJfQ0KKwkJDQorCQllbnYtPlNldE9iamVjdEFycmF5RWxlbWVudChhcnksIGksIGpyZWN0KTsNCisJCWVudi0+RGVsZXRlTG9jYWxSZWYoanJlY3QpOw0KKwl9DQorCQ0KKwlyZXR1cm4gYXJ5Ow0KK30NCisNCisvLyBJZGVudGlmeSBhbGwgb2YgdGhlIGZhY2VzIGluIHRoZSBzb3VyY2UgaW1hZ2UgYW5kIHJldHVybiBhbiBhcnJheQ0KKy8vIG9mIEFuZHJvaWQgUmVjdCBvYmplY3RzIHdpdGggdGhlIGZhY2UgY29vcmRpbmF0ZXMuICBJZiBhbnkgZXJyb3JzDQorLy8gb2NjdXIsIGEgMCBhcnJheSB3aWxsIGJlIHJldHVybmVkLg0KK0pOSUVYUE9SVA0KK2pvYmplY3RBcnJheQ0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9maW5kQWxsRmFjZXMoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJICAgICAgIGpvYmplY3QgdGhpeikgew0KKwljaGFyIGJ1ZmZlclsxMDBdOw0KKwljbG9ja190IHRvdGFsX3RpbWVfc3RhcnQgPSBjbG9jaygpOw0KKwkNCisJaWYgKG1fY2FzY2FkZSA9PSAwIHx8IG1fc3RvcmFnZSA9PSAwKSB7DQorCQlMT0dFKCJFcnJvciBmaW5kIGZhY2VzIHdhcyBub3QgaW5pdGlhbGl6ZWQuIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJaWYgKG1fc291cmNlSW1hZ2UgPT0gMCkgew0KKwkJTE9HRSgiRXJyb3Igc291cmNlIGltYWdlIHdhcyBub3Qgc2V0LiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCWluaXRGYWNlRGV0ZWN0aW9uSW1hZ2VzKG1fc291cmNlSW1hZ2UsIElNQUdFX1NDQUxFKTsNCisNCisJY2xvY2tfdCBoYWFyX2RldGVjdF90aW1lX3N0YXJ0ID0gY2xvY2soKTsNCisgICAgbV9mYWNlc0ZvdW5kID0gbXljdkhhYXJEZXRlY3RPYmplY3RzKG1fc21hbGxJbWFnZSwgbV9jYXNjYWRlLCBtX3N0b3JhZ2UsIEhBQVJfU0NBTEUsIA0KKwkJTUlOX05FSUdIQk9SUywgSEFBUl9GTEFHU19BTExfRkFDRVMsIGN2U2l6ZShNSU5fU0laRV9XSURUSCwgTUlOX1NJWkVfSEVJR0hUKSk7DQorCQkNCisJY2xvY2tfdCBoYWFyX2RldGVjdF90aW1lX2ZpbmlzaCA9IGNsb2NrKCkgLSBoYWFyX2RldGVjdF90aW1lX3N0YXJ0Ow0KKwlzcHJpbnRmKGJ1ZmZlciwgIlRvdGFsIFRpbWUgdG8gY3ZIYWFyRGV0ZWN0T2JqZWN0cyBpbiBmaW5kQWxsRmFjZXM6ICVmIiwgKGRvdWJsZSloYWFyX2RldGVjdF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KKwlMT0dWKGJ1ZmZlcik7DQorCQ0KKwlqb2JqZWN0QXJyYXkgZmFjZVJlY3RzID0gMDsNCisJaWYgKG1fZmFjZXNGb3VuZCA9PSAwIHx8IG1fZmFjZXNGb3VuZC0+dG90YWwgPD0gMCkgew0KKwkJTE9HVigiRkFDRVNfREVURUNURUQgMCIpOw0KKwl9IGVsc2Ugew0KKwkJc3ByaW50ZihidWZmZXIsICJGQUNFU19ERVRFQ1RFRCAlZCIsIG1fZmFjZXNGb3VuZC0+dG90YWwpOw0KKwkJTE9HVihidWZmZXIpOw0KKwkJbV9mYWNlQ3JvcEFyZWEud2lkdGggPSBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPSAwOw0KKwkJZmFjZVJlY3RzID0gc2VxUmVjdHNUb0FuZHJvaWRSZWN0cyhlbnYsIG1fZmFjZXNGb3VuZCk7DQorCX0NCisJDQorCWNsb2NrX3QgdG90YWxfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gdG90YWxfdGltZV9zdGFydDsNCisJc3ByaW50ZihidWZmZXIsICJUb3RhbCBUaW1lIHRvIGZpbmRBbGxGYWNlczogJWYiLCAoZG91YmxlKXRvdGFsX3RpbWVfZmluaXNoIC8gKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk7DQorCUxPR1YoYnVmZmVyKTsNCisJDQorCXJldHVybiBmYWNlUmVjdHM7DQorfQ0KKw0KKy8vIFN0b3JlIHRoZSBwcmV2aW91cyBmYWNlIGZvdW5kIGluIHRoZSBzY2VuZS4NCit2b2lkIHN0b3JlUHJldmlvdXNGYWNlKEN2UmVjdCogZmFjZSkgew0KKwljaGFyIGJ1ZmZlclsxMDBdOw0KKwlpZiAobV9mYWNlQ3JvcEFyZWEud2lkdGggPiAwICYmIG1fZmFjZUNyb3BBcmVhLmhlaWdodCA+IDApIHsNCisJCWZhY2UtPnggKz0gbV9mYWNlQ3JvcEFyZWEueDsNCisJCWZhY2UtPnkgKz0gbV9mYWNlQ3JvcEFyZWEueTsNCisJCXNwcmludGYoYnVmZmVyLCAiRmFjZSByZWN0ICsgbV9mYWNlQ3JvcEFyZWE6ICglZCwgJWQpIHRvICglZCwgJWQpIiwgZmFjZS0+eCwgZmFjZS0+eSwgDQorCQkJZmFjZS0+eCArIGZhY2UtPndpZHRoLCBmYWNlLT55ICsgZmFjZS0+aGVpZ2h0KTsNCisJCUxPR1YoYnVmZmVyKTsNCisJfQ0KKwkNCisJaW50IHN0YXJ0WCA9IE1BWChmYWNlLT54IC0gUEFEX0ZBQ0VfQVJFQSwgMCk7DQorCWludCBzdGFydFkgPSBNQVgoZmFjZS0+eSAtIFBBRF9GQUNFX0FSRUEsIDApOw0KKwlpbnQgdyA9IG1fc21hbGxJbWFnZS0+d2lkdGggLSBzdGFydFggLSBmYWNlLT53aWR0aCAtIFBBRF9GQUNFX0FSRUFfMjsNCisJaW50IGggPSBtX3NtYWxsSW1hZ2UtPmhlaWdodCAtIHN0YXJ0WSAtIGZhY2UtPmhlaWdodCAtIFBBRF9GQUNFX0FSRUFfMjsNCisJaW50IHN3ID0gZmFjZS0+eCAtIFBBRF9GQUNFX0FSRUEsIHNoID0gZmFjZS0+eSAtIFBBRF9GQUNFX0FSRUE7DQorCW1fZmFjZUNyb3BBcmVhID0gY3ZSZWN0KHN0YXJ0WCwgc3RhcnRZLCANCisJCWZhY2UtPndpZHRoICsgUEFEX0ZBQ0VfQVJFQV8yICsgKCh3IDwgMCkgPyB3IDogMCkgKyAoKHN3IDwgMCkgPyBzdyA6IDApLA0KKwkJZmFjZS0+aGVpZ2h0ICsgUEFEX0ZBQ0VfQVJFQV8yICsgKChoIDwgMCkgPyBoIDogMCkgKyAoKHNoIDwgMCkgPyBzaCA6IDApKTsNCisJc3ByaW50ZihidWZmZXIsICJtX2ZhY2VDcm9wQXJlYTogKCVkLCAlZCkgdG8gKCVkLCAlZCkiLCBtX2ZhY2VDcm9wQXJlYS54LCBtX2ZhY2VDcm9wQXJlYS55LCANCisJCW1fZmFjZUNyb3BBcmVhLnggKyBtX2ZhY2VDcm9wQXJlYS53aWR0aCwgbV9mYWNlQ3JvcEFyZWEueSArIG1fZmFjZUNyb3BBcmVhLmhlaWdodCk7DQorCUxPR1YoYnVmZmVyKTsNCit9DQorDQorLy8gR2l2ZW4gYSByZWN0YW5nbGUsIHJldHVybiBhbiBBbmRyb2lkIFJlY3Qgb2JqZWN0IG9yIG51bGwgaWYgYW55IA0KKy8vIGVycm9ycyBvY2N1ci4NCitqb2JqZWN0IHJlY3RUb0FuZHJvaWRSZWN0KEpOSUVudiogZW52LCBDdlJlY3QgKnJlY3QpIHsNCisJaWYgKHJlY3QgPT0gMCkgew0KKwkJTE9HRSgiTm8gcmVjdGFuZ2xlIHdhcyBzcGVjaWZpZWQhIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJamNsYXNzIGpjbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7DQorCWlmIChqY2xzID09IDApIHsNCisJCUxPR0UoIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCWptZXRob2RJRCBqY29uc3RydWN0ID0gZW52LT5HZXRNZXRob2RJRChqY2xzLCAiPGluaXQ+IiwgIihJSUlJKVYiKTsNCisJaWYgKGpjb25zdHJ1Y3QgPT0gMCkgew0KKwkJTE9HRSgiVW5hYmxlIHRvIGZpbmQgY29uc3RydWN0b3IgUmVjdChpbnQsIGludCwgaW50LCBpbnQpIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJcmV0dXJuIGVudi0+TmV3T2JqZWN0KGpjbHMsIGpjb25zdHJ1Y3QsIHJlY3QtPngsIHJlY3QtPnksIA0KKwkJcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7DQorfQ0KKw0KKy8vIElkZW50aWZ5IGEgc2luZ2xlIGZhY2UgaW4gdGhlIHNvdXJjZSBpbWFnZSBhbmQgcmV0dXJuIGFuIEFuZHJvaWQNCisvLyBBbmRyb2lkIFJlY3Qgb2JqZWN0IHdpdGggdGhlIGZhY2UgY29vcmRpbmF0ZXMuICBUaGlzIG1ldGhvZCBpcw0KKy8vIG9wdGltaXplZCBieSBmb2N1c2luZyBvbiBhIHNpbmdsZSBmYWNlIGFuZCBjcm9wcGluZyB0aGUgZGV0ZWN0aW9uDQorLy8gcmVnaW9uIHRvIHRoZSBhcmVhIHdoZXJlIHRoZSBmYWNlIGlzIGxvY2F0ZWQgcGx1cyBzb21lIGFkZGl0aW9uYWwNCisvLyBwYWRkaW5nIHRvIGFjY291bnQgZm9yIHNsaWdodCBoZWFkIG1vdmVtZW50cy4gIElmIGFueSBlcnJvcnMgb2NjdXIsIA0KKy8vIGEgMCBhcnJheSB3aWxsIGJlIHJldHVybmVkLg0KK0pOSUVYUE9SVA0KK2pvYmplY3QNCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZmluZFNpbmdsZUZhY2UoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJCQkgam9iamVjdCB0aGl6KSB7DQorCWNoYXIgYnVmZmVyWzEwMF07DQorCWNsb2NrX3QgdG90YWxfdGltZV9zdGFydCA9IGNsb2NrKCk7DQorCQ0KKwlpZiAobV9jYXNjYWRlID09IDAgfHwgbV9zdG9yYWdlID09IDApIHsNCisJCUxPR0UoIkVycm9yIGZpbmQgZmFjZXMgd2FzIG5vdCBpbml0aWFsaXplZC4iKTsNCisJCXJldHVybiAwOw0KKwl9DQorCQ0KKwlpZiAobV9zb3VyY2VJbWFnZSA9PSAwKSB7DQorCQlMT0dFKCJFcnJvciBzb3VyY2UgaW1hZ2Ugd2FzIG5vdCBzZXQuIik7DQorCQlyZXR1cm4gMDsNCisJfQ0KKwkNCisJaW5pdEZhY2VEZXRlY3Rpb25JbWFnZXMobV9zb3VyY2VJbWFnZSwgSU1BR0VfU0NBTEUpOw0KKw0KKwljbG9ja190IGhhYXJfZGV0ZWN0X3RpbWVfc3RhcnQgPSBjbG9jaygpOw0KKyAgICBtX2ZhY2VzRm91bmQgPSBteWN2SGFhckRldGVjdE9iamVjdHMobV9zbWFsbEltYWdlLCBtX2Nhc2NhZGUsIG1fc3RvcmFnZSwgSEFBUl9TQ0FMRSwgDQorCQlNSU5fTkVJR0hCT1JTLCBIQUFSX0ZMQUdTX1NJTkdMRV9GQUNFLCBtX3NtYWxsZXN0RmFjZVNpemUpOw0KKwkJDQorCWNsb2NrX3QgaGFhcl9kZXRlY3RfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gaGFhcl9kZXRlY3RfdGltZV9zdGFydDsNCisJc3ByaW50ZihidWZmZXIsICJUb3RhbCBUaW1lIHRvIGN2SGFhckRldGVjdE9iamVjdHMgaW4gZmluZFNpbmdsZUZhY2U6ICVmIiwgKGRvdWJsZSloYWFyX2RldGVjdF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KKwlMT0dWKGJ1ZmZlcik7DQorCQ0KKwlqb2JqZWN0IGZhY2VSZWN0ID0gMDsNCisJaWYgKG1fZmFjZXNGb3VuZCA9PSAwIHx8IG1fZmFjZXNGb3VuZC0+dG90YWwgPD0gMCkgew0KKwkJTE9HVigiRkFDRVNfREVURUNURUQgMCIpOw0KKwkJbV9mYWNlQ3JvcEFyZWEud2lkdGggPSBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPSAwOw0KKwkJbV9zbWFsbGVzdEZhY2VTaXplLndpZHRoID0gTUlOX1NJWkVfV0lEVEg7DQorCQltX3NtYWxsZXN0RmFjZVNpemUuaGVpZ2h0ID0gTUlOX1NJWkVfSEVJR0hUOw0KKwl9IGVsc2Ugew0KKwkJTE9HVigiRkFDRVNfREVURUNURUQgMSIpOw0KKwkJQ3ZSZWN0ICpmYWNlID0gKEN2UmVjdCopY3ZHZXRTZXFFbGVtKG1fZmFjZXNGb3VuZCwgMCk7DQorCQlpZiAoZmFjZSA9PSAwKSB7DQorCQkJTE9HRSgiSW52YWxpZCByZWN0YW5nbGUgZGV0ZWN0ZWQiKTsNCisJCQlyZXR1cm4gMDsNCisJCX0NCisJCW1fc21hbGxlc3RGYWNlU2l6ZS53aWR0aCA9IE1BWChmYWNlLT53aWR0aCAtIFBBRF9GQUNFX1NJWkUsIE1JTl9TSVpFX1dJRFRIKTsNCisJCW1fc21hbGxlc3RGYWNlU2l6ZS5oZWlnaHQgPSBNQVgoZmFjZS0+aGVpZ2h0IC0gUEFEX0ZBQ0VfU0laRSwgTUlOX1NJWkVfSEVJR0hUKTsNCisJCWZhY2VSZWN0ID0gcmVjdFRvQW5kcm9pZFJlY3QoZW52LCBmYWNlKTsNCisJCXN0b3JlUHJldmlvdXNGYWNlKGZhY2UpOw0KKwl9DQorCQ0KKwljbG9ja190IHRvdGFsX3RpbWVfZmluaXNoID0gY2xvY2soKSAtIHRvdGFsX3RpbWVfc3RhcnQ7DQorCXNwcmludGYoYnVmZmVyLCAiVG90YWwgVGltZSB0byBmaW5kU2luZ2xlRmFjZTogJWYiLCAoZG91YmxlKXRvdGFsX3RpbWVfZmluaXNoIC8gKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk7DQorCUxPR1YoYnVmZmVyKTsNCisJDQorCXJldHVybiBmYWNlUmVjdDsNCit9DQorDQorLy8gRHJhdyBhIHJlY3RhbmdsZSBvbiB0aGUgc291cmNlIGltYWdlIGFyb3VuZCB0aGUgc3BlY2lmaWVkIGZhY2UgcmVjdGFuZ2xlLg0KKy8vIFNjYWxlIHRoZSBmYWNlIGFyZWEgdG8gdGhlIGRyYXcgYXJlYSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHNjYWxlLg0KK3ZvaWQgaGlnaGxpZ2h0RmFjZShJcGxJbWFnZSAqc291cmNlSW1hZ2UsIEN2UmVjdCAqZmFjZSwgZG91YmxlIHNjYWxlID0gMS4wKSB7DQorCWNoYXIgYnVmZmVyWzEwMF07DQorCXNwcmludGYoYnVmZmVyLCAiRmFjZSBSZWN0YW5nbGU6ICh4OiAlZCwgeTogJWQpIHRvICh3OiAlZCwgaDogJWQpIiwgDQorCQlmYWNlLT54LCBmYWNlLT55LCBmYWNlLT53aWR0aCwgZmFjZS0+aGVpZ2h0KTsNCisJTE9HVihidWZmZXIpOw0KKwlDdlBvaW50IHB0MSA9IGN2UG9pbnQoaW50KGZhY2UtPnggKiBzY2FsZSksIGludChmYWNlLT55ICogc2NhbGUpKTsNCisJQ3ZQb2ludCBwdDIgPSBjdlBvaW50KGludCgoZmFjZS0+eCArIGZhY2UtPndpZHRoKSAqIHNjYWxlKSwgDQorCQlpbnQoKGZhY2UtPnkgKyBmYWNlLT5oZWlnaHQpICogc2NhbGUpKTsNCisJc3ByaW50ZihidWZmZXIsICJEcmF3IFJlY3RhbmdsZTogKCVkLCAlZCkgdG8gKCVkLCAlZCkiLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSk7DQorCUxPR1YoYnVmZmVyKTsNCisgICAgY3ZSZWN0YW5nbGUoc291cmNlSW1hZ2UsIHB0MSwgcHQyLCBDVl9SR0IoMjU1LCAwLCAwKSwgMywgOCwgMCk7DQorfQ0KKw0KKy8vIERyYXcgcmVjdGFuZ2xlcyBvbiB0aGUgc291cmNlIGltYWdlIGFyb3VuZCBlYWNoIGZhY2UgdGhhdCB3YXMgZm91bmQuDQorLy8gU2NhbGUgdGhlIGZhY2UgYXJlYSB0byB0aGUgZHJhdyBhcmVhIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc2NhbGUuDQorLy8gUmV0dXJuIHRydWUgaWYgYXQgbGVhc3Qgb25lIGZhY2Ugd2FzIGhpZ2hsaWdodGVkIGFuZCBmYWxzZSBvdGhlcndpc2UuDQorYm9vbCBoaWdobGlnaHRGYWNlcyhJcGxJbWFnZSAqc291cmNlSW1hZ2UsIEN2U2VxICpmYWNlcywgZG91YmxlIHNjYWxlID0gMS4wKSB7DQorCWlmIChmYWNlcyA9PSAwIHx8IGZhY2VzLT50b3RhbCA8PSAwKSB7DQorCQlMT0dWKCJObyBmYWNlcyB3ZXJlIGhpZ2hsaWdodGVkISIpOw0KKwkJcmV0dXJuIGZhbHNlOw0KKwl9IGVsc2Ugew0KKwkJTE9HVigiRHJhd2luZyByZWN0YW5nbGVzIG9uIGVhY2ggZmFjZSIpOw0KKwkJaW50IGNvdW50Ow0KKwkJQ3ZSZWN0KiBmYWNlOw0KKwkJZm9yIChpbnQgaSA9IDA7IGkgPCBmYWNlcy0+dG90YWw7IGkrKykgew0KKwkJCWZhY2UgPSAoQ3ZSZWN0KiljdkdldFNlcUVsZW0oZmFjZXMsIGkpOw0KKwkJCWhpZ2hsaWdodEZhY2Uoc291cmNlSW1hZ2UsIGZhY2UsIHNjYWxlKTsNCisJCX0NCisJfQ0KKwkNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKy8vIEhpZ2hsaWdodCB0aGUgZmFjZXMgdGhhdCB3ZXJlIGRldGVjdGVkIGluIHRoZSBzb3VyY2UgaW1hZ2UuDQorLy8gUmV0dXJuIHRydWUgaWYgb25lIG9yIG1vcmUgZmFjZXMgaXMgaGlnaGxpZ2h0ZWQgb3IgZmFsc2Ugb3RoZXJ3aXNlLg0KK0pOSUVYUE9SVA0KK2pib29sZWFuDQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2hpZ2hsaWdodEZhY2VzKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCSAgICAJIGpvYmplY3QgdGhpeikgew0KKwlpZiAobV9mYWNlc0ZvdW5kID09IDAgfHwgbV9mYWNlc0ZvdW5kLT50b3RhbCA8PSAwKSB7DQorCQlMT0dWKCJObyBmYWNlcyBmb3VuZCB0byBoaWdobGlnaHQhIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0gZWxzZSB7DQorCQloaWdobGlnaHRGYWNlcyhtX3NvdXJjZUltYWdlLCBtX2ZhY2VzRm91bmQsIElNQUdFX1NDQUxFKTsNCisJfQ0KKwkNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KKyNpZiAwDQorDQorSk5JRVhQT1JUDQoramJvb2xlYW5BcnJheQ0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9mYWNlRGV0ZWN0KEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCWppbnRBcnJheSBwaG90b19kYXRhMSwNCisJCQkJCQkJCQkJamludEFycmF5IHBob3RvX2RhdGEyLA0KKwkJCQkJCQkJCQlqaW50IHdpZHRoLA0KKwkJCQkJCQkJCQlqaW50IGhlaWdodCkgew0KKwlMT0dWKCJMb2FkIGRlc3AuIik7DQorDQorCWludCBpLCB4LCB5Ow0KKwlpbnQqIHBpeGVsczsNCisJSXBsSW1hZ2UgKmZyYW1lSW1hZ2U7DQorCQ0KKwlJcGxJbWFnZSAqYmFja2dyb3VuZEltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCisJSXBsSW1hZ2UgKmdyYXlJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQorCUlwbEltYWdlICpkaWZmZXJlbmNlSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdlNpemUod2lkdGgsIGhlaWdodCksIElQTF9ERVBUSF84VSwgMSApOw0KKwkNCisJSXBsSW1hZ2UgKmhzdkltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDMgKTsNCisJSXBsSW1hZ2UgKmh1ZUltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCisJSXBsSW1hZ2UgKnNhdHVyYXRpb25JbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQorCUlwbEltYWdlICp2YWx1ZUltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCisJSXBsSW1hZ2UgKnRocmVzaG9sZEltYWdlMSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQorCUlwbEltYWdlICp0aHJlc2hvbGRJbWFnZTIgPSBjdkNyZWF0ZUltYWdlKCBjdlNpemUod2lkdGgsIGhlaWdodCksIElQTF9ERVBUSF84VSwgMSApOw0KKwlJcGxJbWFnZSAqdGhyZXNob2xkSW1hZ2UzID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCisJSXBsSW1hZ2UgKmZhY2VJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQorCQ0KKwlDdk1vbWVudHMgbW9tZW50Ow0KKwlkb3VibGUgbV8wMDsNCisJZG91YmxlIG1fMTA7DQorCWRvdWJsZSBtXzAxOw0KKwlpbnQgZ3Jhdml0eVg7DQorCWludCBncmF2aXR5WTsNCisNCisJamJvb2xlYW5BcnJheSByZXNfYXJyYXk7DQorCWludCBpbWFnZVNpemU7DQorDQorDQorDQorCS8vIExvYWQgSW1hZ2UNCisJcGl4ZWxzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBob3RvX2RhdGExLCAwKTsNCisJZnJhbWVJbWFnZSA9IGxvYWRQaXhlbHMocGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KTsNCisJaWYoZnJhbWVJbWFnZSA9PSAwKSB7DQorCQlMT0dWKCJFcnJvciBsb2FkUGl4ZWxzLiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJDQorCQ0KKwljdkN2dENvbG9yKCBmcmFtZUltYWdlLCBiYWNrZ3JvdW5kSW1hZ2UsIENWX0JHUjJHUkFZICk7DQorCQ0KKwkNCisJcGl4ZWxzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBob3RvX2RhdGEyLCAwKTsNCisJZnJhbWVJbWFnZSA9IGxvYWRQaXhlbHMocGl4ZWxzLCB3aWR0aCwgaGVpZ2h0KTsNCisJaWYoZnJhbWVJbWFnZSA9PSAwKSB7DQorCQlMT0dWKCJFcnJvciBsb2FkUGl4ZWxzLiIpOw0KKwkJcmV0dXJuIDA7DQorCX0NCisJY3ZDdnRDb2xvciggZnJhbWVJbWFnZSwgZ3JheUltYWdlLCBDVl9CR1IyR1JBWSApOw0KKwljdkFic0RpZmYoIGdyYXlJbWFnZSwgYmFja2dyb3VuZEltYWdlLCBkaWZmZXJlbmNlSW1hZ2UgKTsNCisJDQorCWN2Q3Z0Q29sb3IoIGZyYW1lSW1hZ2UsIGhzdkltYWdlLCBDVl9CR1IySFNWICk7DQorCUxPR1YoIkxvYWQgY3ZDdnRDb2xvci4iKTsNCisJY3ZTcGxpdCggaHN2SW1hZ2UsIGh1ZUltYWdlLCBzYXR1cmF0aW9uSW1hZ2UsIHZhbHVlSW1hZ2UsIDAgKTsNCisJTE9HVigiTG9hZCBjdlNwbGl0LiIpOw0KKwljdlRocmVzaG9sZCggaHVlSW1hZ2UsIHRocmVzaG9sZEltYWdlMSwgVEhSRVNIX0JPVFRPTSwgVEhSRVNIT0xEX01BWF9WQUxVRSwgQ1ZfVEhSRVNIX0JJTkFSWSApOw0KKwljdlRocmVzaG9sZCggaHVlSW1hZ2UsIHRocmVzaG9sZEltYWdlMiwgVEhSRVNIX1RPUCwgVEhSRVNIT0xEX01BWF9WQUxVRSwgQ1ZfVEhSRVNIX0JJTkFSWV9JTlYgKTsNCisJY3ZBbmQoIHRocmVzaG9sZEltYWdlMSwgdGhyZXNob2xkSW1hZ2UyLCB0aHJlc2hvbGRJbWFnZTMsIDAgKTsNCisJTE9HVigiTG9hZCBjdkFuZC4iKTsNCisJDQorCWN2QW5kKCBkaWZmZXJlbmNlSW1hZ2UsIHRocmVzaG9sZEltYWdlMywgZmFjZUltYWdlLCAwICk7DQorCQ0KKwljdk1vbWVudHMoIGZhY2VJbWFnZSwgJm1vbWVudCwgMCApOw0KKwltXzAwID0gY3ZHZXRTcGF0aWFsTW9tZW50KCAmbW9tZW50LCAwLCAwICk7DQorCW1fMTAgPSBjdkdldFNwYXRpYWxNb21lbnQoICZtb21lbnQsIDEsIDAgKTsNCisJbV8wMSA9IGN2R2V0U3BhdGlhbE1vbWVudCggJm1vbWVudCwgMCwgMSApOw0KKwlncmF2aXR5WCA9IG1fMTAgLyBtXzAwOw0KKwlncmF2aXR5WSA9IG1fMDEgLyBtXzAwOw0KKwlMT0dWKCJMb2FkIGN2TW9tZW50cy4iKTsNCisNCisNCisJY3ZDaXJjbGUoIGZyYW1lSW1hZ2UsIGN2UG9pbnQoIGdyYXZpdHlYLCBncmF2aXR5WSApLCBDSVJDTEVfUkFESVVTLA0KKwkJIENWX1JHQiggMjU1LCAwLCAwICksIExJTkVfVEhJQ0tORVNTLCBMSU5FX1RZUEUsIDAgKTsNCisNCisNCisNCisNCisJQ3ZNYXQgc3R1YiwgKm1hdF9pbWFnZTsNCisgICAgaW50IGNoYW5uZWxzLCBpcGxfZGVwdGg7DQorICAgIG1hdF9pbWFnZSA9IGN2R2V0TWF0KCBmcmFtZUltYWdlLCAmc3R1YiApOw0KKyAgICBjaGFubmVscyA9IENWX01BVF9DTiggbWF0X2ltYWdlLT50eXBlICk7DQorDQorICAgIGlwbF9kZXB0aCA9IGN2Q3ZUb0lwbERlcHRoKG1hdF9pbWFnZS0+dHlwZSk7DQorDQorCVdMTm9uRmlsZUJ5dGVTdHJlYW0qIG1fc3RybSA9IG5ldyBXTE5vbkZpbGVCeXRlU3RyZWFtKCk7DQorICAgIGxvYWRJbWFnZUJ5dGVzKG1hdF9pbWFnZS0+ZGF0YS5wdHIsIG1hdF9pbWFnZS0+c3RlcCwgbWF0X2ltYWdlLT53aWR0aCwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdF9pbWFnZS0+aGVpZ2h0LCBpcGxfZGVwdGgsIGNoYW5uZWxzLCBtX3N0cm0pOw0KKwlMT0dWKCJMb2FkIGxvYWRJbWFnZUJ5dGVzLiIpOw0KKw0KKw0KKwlpbWFnZVNpemUgPSBtX3N0cm0tPkdldFNpemUoKTsNCisJcmVzX2FycmF5ID0gZW52LT5OZXdCb29sZWFuQXJyYXkoaW1hZ2VTaXplKTsNCisJTE9HVigiTG9hZCBOZXdCeXRlQXJyYXkuIik7DQorICAgIGlmIChyZXNfYXJyYXkgPT0gMCkgew0KKyAgICAgICAgcmV0dXJuIDA7DQorICAgIH0NCisgICAgZW52LT5TZXRCb29sZWFuQXJyYXlSZWdpb24ocmVzX2FycmF5LCAwLCBpbWFnZVNpemUsIChqYm9vbGVhbiopbV9zdHJtLT5HZXRCeXRlKCkpOw0KKwlMT0dWKCJMb2FkIFNldEJvb2xlYW5BcnJheVJlZ2lvbi4iKTsNCisNCisNCisNCisNCisJY3ZSZWxlYXNlSW1hZ2UoICZiYWNrZ3JvdW5kSW1hZ2UgKTsNCisJY3ZSZWxlYXNlSW1hZ2UoICZncmF5SW1hZ2UgKTsNCisJY3ZSZWxlYXNlSW1hZ2UoICZkaWZmZXJlbmNlSW1hZ2UgKTsNCisJY3ZSZWxlYXNlSW1hZ2UoICZoc3ZJbWFnZSApOw0KKwljdlJlbGVhc2VJbWFnZSggJmh1ZUltYWdlICk7DQorCWN2UmVsZWFzZUltYWdlKCAmc2F0dXJhdGlvbkltYWdlICk7DQorCWN2UmVsZWFzZUltYWdlKCAmdmFsdWVJbWFnZSApOw0KKwljdlJlbGVhc2VJbWFnZSggJnRocmVzaG9sZEltYWdlMSApOw0KKwljdlJlbGVhc2VJbWFnZSggJnRocmVzaG9sZEltYWdlMiApOw0KKwljdlJlbGVhc2VJbWFnZSggJnRocmVzaG9sZEltYWdlMyApOw0KKwljdlJlbGVhc2VJbWFnZSggJmZhY2VJbWFnZSApOw0KKwljdlJlbGVhc2VJbWFnZSggJmZyYW1lSW1hZ2UgKTsNCisJbV9zdHJtLT5DbG9zZSgpOw0KKwlTQUZFX0RFTEVURShtX3N0cm0pOw0KKw0KKwlyZXR1cm4gcmVzX2FycmF5Ow0KKw0KK30NCisjZW5kaWYNCisNCmRpZmYgLS1naXQgYS9jdmpuaS5oIGIvY3ZqbmkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmYwY2FlCi0tLSAvZGV2L251bGwKKysrIGIvY3ZqbmkuaApAQCAtMCwwICsxLDM0MiBAQAorLyoNCitPcGVuQ1YgZm9yIEFuZHJvaWQgTkRLDQorQ29weXJpZ2h0IChjKSAyMDA2LTIwMDkgU0lQcm9wIFByb2plY3QgaHR0cDovL3d3dy5zaXByb3Aub3JnLw0KKw0KK1RoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5Lg0KK0luIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuDQorUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQoraW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdCBmcmVlbHksDQorc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCisNCisxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdCBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZSBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCisyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQorMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCisqLw0KKyNpbmNsdWRlIDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8c3RyaW5nLmg+DQorI2luY2x1ZGUgPGpuaS5oPg0KKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPg0KKw0KKyNpbmNsdWRlICJjdi5oIg0KKyNpbmNsdWRlICJjeGNvcmUuaCINCisjaW5jbHVkZSAiY3ZhdXguaCINCisjaW5jbHVkZSAiaGlnaGd1aS5oIg0KKyNpbmNsdWRlICJtbC5oIg0KKyNpbmNsdWRlICJ1dGlscy5oIg0KKyNpbmNsdWRlICJXTE5vbkZpbGVCeXRlU3RyZWFtLmgiDQorI2luY2x1ZGUgImdyZm10X2JtcC5oIg0KKw0KKyNkZWZpbmUgTE9HViguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfU0lMRU5ULCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykNCisjZGVmaW5lIExPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykNCisvL0FORFJPSURfTE9HX1VOS05PV04sIEFORFJPSURfTE9HX0RFRkFVTFQsIEFORFJPSURfTE9HX1ZFUkJPU0UsIEFORFJPSURfTE9HX0RFQlVHLCBBTkRST0lEX0xPR19JTkZPLCBBTkRST0lEX0xPR19XQVJOLCBBTkRST0lEX0xPR19FUlJPUiwgQU5EUk9JRF9MT0dfRkFUQUwsIEFORFJPSURfTE9HX1NJTEVOVA0KKy8vTE9HVihBTkRST0lEX0xPR19ERUJVRywgIkpOSSIsICIiKTsNCisNCisjZGVmaW5lIEFORFJPSURfTE9HX1ZFUkJPU0UgQU5EUk9JRF9MT0dfREVCVUcNCisjZGVmaW5lIExPR19UQUcgIkNWSk5JIg0KKyNkZWZpbmUgSU5WQUxJRF9BUkdVTUVOVCAtMTg0NTYNCisNCisjZGVmaW5lCQlTQUZFX0RFTEVURShwKQkJCXsgaWYocCl7IGRlbGV0ZSAocCk7IChwKT0wOyB9IH0NCisjZGVmaW5lCQlTQUZFX0RFTEVURV9BUlJBWShwKQl7IGlmKHApeyBkZWxldGUgW10ocCk7IChwKT0wOyB9IH0NCisNCisNCisjZGVmaW5lIElNQUdFKCBpLCB4LCB5LCBuICkgICAqKCggdW5zaWduZWQgY2hhciAqICkoKCBpICktPmltYWdlRGF0YSAgICAgIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICggeCApICogc2l6ZW9mKCB1bnNpZ25lZCBjaGFyICkgKiAzIFwNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICggeSApICogKCBpICktPndpZHRoU3RlcCApICsgKCBuICkpDQorDQorLy8gQ1YgT2JqZWN0cw0KK3N0YXRpYyBjb25zdCBjaGFyKiBmbXRTaWduQm1wID0gIkJNIjsNCisNCitDdkNhcHR1cmUgKm1fY2FwdHVyZSA9IDA7DQorQ3ZIYWFyQ2xhc3NpZmllckNhc2NhZGUgKm1fY2FzY2FkZSA9IDA7DQorSXBsSW1hZ2UgKm1fc291cmNlSW1hZ2UgPSAwOw0KK0lwbEltYWdlICptX2dyYXlJbWFnZSA9IDA7DQorSXBsSW1hZ2UgKm1fc21hbGxJbWFnZSA9IDA7DQorQ3ZNZW1TdG9yYWdlICptX3N0b3JhZ2UgPSAwOw0KK0N2U2VxICptX2ZhY2VzRm91bmQgPSAwOw0KK0N2UmVjdCBtX2ZhY2VDcm9wQXJlYTsNCitDdlNpemUgbV9zbWFsbGVzdEZhY2VTaXplOw0KKw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK2V4dGVybiAiQyIgew0KKyNlbmRpZg0KKw0KK0pOSUVYUE9SVA0KK2pib29sZWFuDQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2NyZWF0ZVNvY2tldENhcHR1cmUoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJCQkJICBqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCQkJICBqc3RyaW5nIGFkZHJlc3Nfc3RyLA0KKwkJCQkJCQkJCQkJCSAganN0cmluZyBwb3J0X3N0ciwNCisJCQkJCQkJCQkJCQkgIGppbnQgd2lkdGgsDQorCQkJCQkJCQkJCQkJICBqaW50IGhlaWdodCk7DQorDQorSk5JRVhQT1JUDQordm9pZA0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9yZWxlYXNlU29ja2V0Q2FwdHVyZShKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQkgICBqb2JqZWN0IHRoaXopOw0KKw0KK0pOSUVYUE9SVA0KK2pib29sZWFuDQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2dyYWJTb3VyY2VJbWFnZUZyb21DYXB0dXJlKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQkJCQkJIGpvYmplY3QgdGhpeik7DQorCQkJCQkJCQkJCQkJCQkNCitKTklFWFBPUlQNCitqYm9vbGVhbkFycmF5DQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2dldFNvdXJjZUltYWdlKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQkJIGpvYmplY3QgdGhpeik7DQorDQorSk5JRVhQT1JUDQoramJvb2xlYW4NCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1Zfc2V0U291cmNlSW1hZ2UoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJICAgIAkgam9iamVjdCB0aGl6LA0KKwkJCQkJCQkJCQkJIGppbnRBcnJheSBwaG90b19kYXRhLA0KKwkJCQkJCQkJCQkJIGppbnQgd2lkdGgsDQorCQkJCQkJCQkJCQkgamludCBoZWlnaHQpOw0KKw0KK0pOSUVYUE9SVA0KK2pib29sZWFuQXJyYXkNCitKTklDQUxMDQorSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZmluZENvbnRvdXJzKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCWppbnQgd2lkdGgsDQorCQkJCQkJCQkJCWppbnQgaGVpZ2h0KTsNCisNCitKTklFWFBPUlQNCitqYm9vbGVhbg0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9pbml0RmFjZURldGVjdGlvbihKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQorCQkJCQkJCQkJCQkJanN0cmluZyBjYXNjYWRlX3BhdGhfc3RyKTsNCisJCQkJCQkJCQkJCQkNCitKTklFWFBPUlQNCit2b2lkDQorSk5JQ0FMTA0KK0phdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX3JlbGVhc2VGYWNlRGV0ZWN0aW9uKEpOSUVudiogZW52LA0KKwkJCQkJCQkJCSAgICAgICAJICAJICAgam9iamVjdCB0aGl6KTsNCisNCitKTklFWFBPUlQNCitqYm9vbGVhbg0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9oaWdobGlnaHRGYWNlcyhKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCSBqb2JqZWN0IHRoaXopOw0KKw0KK0pOSUVYUE9SVA0KK2pvYmplY3RBcnJheQ0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9maW5kQWxsRmFjZXMoSk5JRW52KiBlbnYsDQorCQkJCQkJCQkJICAgICAgIGpvYmplY3QgdGhpeik7DQorCQkJCQkJCQkJDQorSk5JRVhQT1JUDQoram9iamVjdA0KK0pOSUNBTEwNCitKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9maW5kU2luZ2xlRmFjZShKTklFbnYqIGVudiwNCisJCQkJCQkJCQkJCSBqb2JqZWN0IHRoaXopOw0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KK30NCisjZW5kaWYNCisNCisNCisNCitJcGxJbWFnZSogbG9hZFBpeGVscyhpbnQqIHBpeGVscywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7DQorDQorCWludCB4LCB5Ow0KKwlJcGxJbWFnZSAqaW1nID0gY3ZDcmVhdGVJbWFnZShjdlNpemUod2lkdGgsIGhlaWdodCksIElQTF9ERVBUSF84VSwgMyk7DQorDQorCWZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KysgKSB7DQorICAgICAgICBmb3IgKCB4ID0gMDsgeCA8IHdpZHRoOyB4KysgKSB7DQorICAgICAgICAgICAgLy8gYmx1ZQ0KKyAgICAgICAgICAgIElNQUdFKCBpbWcsIHgsIHksIDAgKSA9IHBpeGVsc1t4K3kqd2lkdGhdICYgMHhGRjsNCisgICAgICAgICAgICAvLyBncmVlbg0KKyAgICAgICAgICAgIElNQUdFKCBpbWcsIHgsIHksIDEgKSA9IHBpeGVsc1t4K3kqd2lkdGhdID4+IDggJiAweEZGOw0KKyAgICAgICAgICAgIC8vIHJlZA0KKyAgICAgICAgICAgIElNQUdFKCBpbWcsIHgsIHksIDIgKSA9IHBpeGVsc1t4K3kqd2lkdGhdID4+IDE2ICYgMHhGRjsNCisgICAgICAgIH0NCisgICAgfQ0KKw0KKwlyZXR1cm4gaW1nOw0KK30NCisNCisNCit2b2lkIGxvYWRJbWFnZUJ5dGVzKGNvbnN0IHVjaGFyKiBkYXRhLCANCisgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLA0KKyAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCANCisgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIA0KKyAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoLCANCisgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVscywgDQorICAgICAgICAgICAgICAgICAgICBXTE5vbkZpbGVCeXRlU3RyZWFtKiBtX3N0cm0pIHsNCisNCisgICAgaW50IGZpbGVTdGVwID0gKHdpZHRoKmNoYW5uZWxzICsgMykgJiAtNDsNCisgICAgdWNoYXIgemVyb3BhZFtdID0gIlwwXDBcMFwwIjsNCisgICAgY2hhciBsb2dfc3RyWzEwMF07DQorDQorDQorICAgIGFzc2VydCggZGF0YSAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCAmJiBzdGVwID49IGZpbGVTdGVwICk7DQorDQorICAgIGludCAgYml0bWFwSGVhZGVyU2l6ZSA9IDQwOw0KKyAgICBpbnQgIHBhbGV0dGVTaXplID0gY2hhbm5lbHMgPiAxID8gMCA6IDEwMjQ7DQorICAgIGludCAgaGVhZGVyU2l6ZSA9IDE0IC8qIGZpbGVoZWFkZXIgKi8gKyBiaXRtYXBIZWFkZXJTaXplICsgcGFsZXR0ZVNpemU7DQorICAgIFBhbGV0dGVFbnRyeSBwYWxldHRlWzI1Nl07DQorICAgIA0KKyAgICBpbnQgdGVzdFNpemUgPSBmaWxlU3RlcCpoZWlnaHQgKyBoZWFkZXJTaXplOw0KKyAgICBtX3N0cm0tPk9wZW4odGVzdFNpemUpOw0KKwlzcHJpbnRmKGxvZ19zdHIsICJmaWxlU3RlcCpoZWlnaHQgKyBoZWFkZXJTaXplPSVpIiwgdGVzdFNpemUpOw0KKwlMT0dWKGxvZ19zdHIpOw0KKyAgICANCisgICAgLy8gd3JpdGUgc2lnbmF0dXJlICdCTScNCisgICAgbV9zdHJtLT5QdXRCeXRlcyggZm10U2lnbkJtcCwgKGludClzdHJsZW4oZm10U2lnbkJtcCkgKTsNCisNCisgICAgLy8gd3JpdGUgZmlsZSBoZWFkZXINCisgICAgbV9zdHJtLT5QdXREV29yZCggZmlsZVN0ZXAqaGVpZ2h0ICsgaGVhZGVyU2l6ZSApOyAvLyBmaWxlIHNpemUNCisgICAgbV9zdHJtLT5QdXREV29yZCggMCApOw0KKyAgICBtX3N0cm0tPlB1dERXb3JkKCBoZWFkZXJTaXplICk7DQorDQorICAgIC8vIHdyaXRlIGJpdG1hcCBoZWFkZXINCisgICAgbV9zdHJtLT5QdXREV29yZCggYml0bWFwSGVhZGVyU2l6ZSApOw0KKyAgICBtX3N0cm0tPlB1dERXb3JkKCB3aWR0aCApOw0KKyAgICBtX3N0cm0tPlB1dERXb3JkKCBoZWlnaHQgKTsNCisgICAgbV9zdHJtLT5QdXRXb3JkKCAxICk7DQorICAgIG1fc3RybS0+UHV0V29yZCggY2hhbm5lbHMgPDwgMyApOw0KKyAgICBtX3N0cm0tPlB1dERXb3JkKCBCTVBfUkdCICk7DQorICAgIG1fc3RybS0+UHV0RFdvcmQoIDAgKTsNCisgICAgbV9zdHJtLT5QdXREV29yZCggMCApOw0KKyAgICBtX3N0cm0tPlB1dERXb3JkKCAwICk7DQorICAgIG1fc3RybS0+UHV0RFdvcmQoIDAgKTsNCisgICAgbV9zdHJtLT5QdXREV29yZCggMCApOw0KKw0KKyAgICBpZiggY2hhbm5lbHMgPT0gMSApDQorICAgIHsNCisgICAgICAgIEZpbGxHcmF5UGFsZXR0ZSggcGFsZXR0ZSwgOCApOw0KKyAgICAgICAgbV9zdHJtLT5QdXRCeXRlcyggcGFsZXR0ZSwgc2l6ZW9mKHBhbGV0dGUpKTsNCisgICAgfQ0KKw0KKyAgICB3aWR0aCAqPSBjaGFubmVsczsNCisgICAgZGF0YSArPSBzdGVwKihoZWlnaHQgLSAxKTsNCisgICAgZm9yKCA7IGhlaWdodC0tOyBkYXRhIC09IHN0ZXAgKQ0KKyAgICB7DQorICAgICAgICBtX3N0cm0tPlB1dEJ5dGVzKCBkYXRhLCB3aWR0aCApOw0KKyAgICAgICAgaWYoIGZpbGVTdGVwID4gd2lkdGggKQ0KKyAgICAgICAgICAgIG1fc3RybS0+UHV0Qnl0ZXMoIHplcm9wYWQsIGZpbGVTdGVwIC0gd2lkdGggKTsNCisgICAgfQ0KK30NCisNCisNCisNCisNCitib29sIGlzX05VTExfZmllbGRfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSwgY29uc3QgY2hhciogZmllbGRfdHlwZSkgew0KKw0KKw0KKwlMT0dWKCJpbiBpc19OVUxMX2ZpZWxkX0phdmFPYmohIik7DQorCWpjbGFzcyBjbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3MoamF2YV9vYmopOw0KKw0KKw0KKwkvLyBnZXQgZmllbGQNCisJamZpZWxkSUQgZmlkID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCBmaWVsZF9uYW1lLCBmaWVsZF90eXBlKTsNCisNCisJam9iamVjdCBvYmogPSBlbnYtPkdldE9iamVjdEZpZWxkKGphdmFfb2JqLCBmaWQpOw0KKwlpZihvYmogPT0gMCkgew0KKwkJTE9HVigiT2JqZWN0IGlzIE5VTEwhIik7DQorCQlyZXR1cm4gdHJ1ZTsNCisJfQ0KKwlyZXR1cm4gZmFsc2U7DQorfQ0KKw0KK2Jvb2wgaXNfTlVMTF92ZWNfZmllbGRfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSkgew0KKwlyZXR1cm4gaXNfTlVMTF9maWVsZF9KYXZhT2JqKGVudiwgamF2YV9vYmosIGZpZWxkX25hbWUsICJMb3JnL3NpcHJvcC9vcGVuY3YvdXRpbC9WZWN0b3IzOyIpOw0KK30NCisNCitib29sIGlzX05VTExfcG9pbnRfZmllbGRfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSkgew0KKwlyZXR1cm4gaXNfTlVMTF9maWVsZF9KYXZhT2JqKGVudiwgamF2YV9vYmosIGZpZWxkX25hbWUsICJMb3JnL3NpcHJvcC9vcGVuY3YvdXRpbC9Qb2ludDM7Iik7DQorfQ0KKw0KK2Jvb2wgaXNfTlVMTF9heGlzX2ZpZWxkX0phdmFPYmooSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YV9vYmosIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpIHsNCisJcmV0dXJuIGlzX05VTExfZmllbGRfSmF2YU9iaihlbnYsIGphdmFfb2JqLCBmaWVsZF9uYW1lLCAiTG9yZy9zaXByb3Avb3BlbmN2L3V0aWwvQXhpczsiKTsNCit9DQorDQorYm9vbCBpc19OVUxMX3Bpdm90X2ZpZWxkX0phdmFPYmooSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YV9vYmosIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpIHsNCisJcmV0dXJuIGlzX05VTExfZmllbGRfSmF2YU9iaihlbnYsIGphdmFfb2JqLCBmaWVsZF9uYW1lLCAiTG9yZy9zaXByb3Avb3BlbmN2L3V0aWwvUGl2b3QzOyIpOw0KK30NCisNCitib29sIGlzX05VTExfcXVhdF9maWVsZF9KYXZhT2JqKEpOSUVudiogZW52LCBqb2JqZWN0IGphdmFfb2JqLCBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKSB7DQorCXJldHVybiBpc19OVUxMX2ZpZWxkX0phdmFPYmooZW52LCBqYXZhX29iaiwgZmllbGRfbmFtZSwgIkxvcmcvc2lwcm9wL29wZW5jdi91dGlsL1F1YXRlcm5pb247Iik7DQorfQ0KKw0KK2Jvb2wgaXNfTlVMTF9tYXQzeDNfZmllbGRfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSkgew0KKwlyZXR1cm4gaXNfTlVMTF9maWVsZF9KYXZhT2JqKGVudiwgamF2YV9vYmosIGZpZWxkX25hbWUsICJMb3JnL3NpcHJvcC9vcGVuY3YvdXRpbC9NYXRyaXgzeDM7Iik7DQorfQ0KK2Jvb2wgaXNfTlVMTF9tYXQzeDFfZmllbGRfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSkgew0KKwlyZXR1cm4gaXNfTlVMTF9maWVsZF9KYXZhT2JqKGVudiwgamF2YV9vYmosIGZpZWxkX25hbWUsICJMb3JnL3NpcHJvcC9vcGVuY3YvdXRpbC9NYXRyaXgzeDE7Iik7DQorfQ0KKw0KKw0KKw0KKw0KK3ZvaWQgc2V0X0phdmFPYmpfaW50KEpOSUVudiogZW52LCBqb2JqZWN0IGphdmFfb2JqLCBjb25zdCBjaGFyKiBmaWVsZF9uYW1lLCBqaW50IHZhbCkgew0KKw0KKwlMT0dWKCJpbiBzZXRfSmF2YU9ial9pbnQhIik7DQorDQorCWpjbGFzcyBjbGF6eiA9IGVudi0+R2V0T2JqZWN0Q2xhc3MoamF2YV9vYmopOw0KKwlqZmllbGRJRCBmaWQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosIGZpZWxkX25hbWUsICJJIik7DQorDQorCWVudi0+U2V0SW50RmllbGQoamF2YV9vYmosIGZpZCwgdmFsKTsNCisNCit9DQorDQoraW50IGdldF9pZF9ieV9KYXZhT2JqKEpOSUVudiogZW52LCBqb2JqZWN0IGphdmFfb2JqKSB7DQorDQorCUxPR1YoImluIGdldF9pZF9ieV9KYXZhT2JqISIpOw0KKw0KKwlqY2xhc3MgbWV0aG9kX2NsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhqYXZhX29iaik7DQorCWptZXRob2RJRCBnZXRfdHlwZV9taWQgPSBlbnYtPkdldE1ldGhvZElEKG1ldGhvZF9jbGF6eiwgImdldElEIiwgIigpSSIpOw0KKwlyZXR1cm4gZW52LT5DYWxsSW50TWV0aG9kKGphdmFfb2JqLCBnZXRfdHlwZV9taWQpOw0KKw0KK30NCisNCitpbnQgZ2V0X3R5cGVfYnlfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaikgew0KKw0KKwlMT0dWKCJpbiBnZXRfdHlwZV9ieV9KYXZhT2JqISIpOw0KKw0KKwlqY2xhc3MgbWV0aG9kX2NsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhqYXZhX29iaik7DQorCWptZXRob2RJRCBnZXRfdHlwZV9taWQgPSBlbnYtPkdldE1ldGhvZElEKG1ldGhvZF9jbGF6eiwgImdldFR5cGUiLCAiKClJIik7DQorCXJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QoamF2YV9vYmosIGdldF90eXBlX21pZCk7DQorDQorfQ0KKw0KKw0KK2ludCBnZXRfaW50X2J5X0phdmFPYmooSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YV9vYmosIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpIHsNCisJDQorCUxPR1YoImluIGdldF9pbnRfYnlfSmF2YU9iaiEiKTsNCisNCisJamNsYXNzIGNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhqYXZhX29iaik7DQorCWpmaWVsZElEIGludF9maWQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosIGZpZWxkX25hbWUsICJJIik7DQorCXJldHVybiBlbnYtPkdldEludEZpZWxkKGphdmFfb2JqLCBpbnRfZmlkKTsNCisNCit9DQorDQorDQorZmxvYXQgZ2V0X2Zsb2F0X2J5X0phdmFPYmooSk5JRW52KiBlbnYsIGpvYmplY3QgamF2YV9vYmosIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpIHsNCisJDQorCUxPR1YoImluIGdldF9mbG9hdF9ieV9KYXZhT2JqISIpOw0KKw0KKwlqY2xhc3MgY2xhenogPSBlbnYtPkdldE9iamVjdENsYXNzKGphdmFfb2JqKTsNCisJamZpZWxkSUQgZmxvYXRfZmlkID0gZW52LT5HZXRGaWVsZElEKGNsYXp6LCBmaWVsZF9uYW1lLCAiRiIpOw0KKwlyZXR1cm4gZW52LT5HZXRGbG9hdEZpZWxkKGphdmFfb2JqLCBmbG9hdF9maWQpOw0KKw0KK30NCisNCisNCitqb2JqZWN0IGdldF9vYmpfYnlfSmF2YU9iaihKTklFbnYqIGVudiwgam9iamVjdCBqYXZhX29iaiwgY29uc3QgY2hhciogZmllbGRfbmFtZSwgY29uc3QgY2hhciogb2JqX3R5cGUpIHsNCisJDQorCUxPR1YoImluIGdldF9vYmpfYnlfSmF2YU9iaiEiKTsNCisNCisJamNsYXNzIGNsYXp6ID0gZW52LT5HZXRPYmplY3RDbGFzcyhqYXZhX29iaik7DQorCWpmaWVsZElEIG9ial9maWQgPSBlbnYtPkdldEZpZWxkSUQoY2xhenosIGZpZWxkX25hbWUsIG9ial90eXBlKTsNCisJcmV0dXJuIGVudi0+R2V0T2JqZWN0RmllbGQoamF2YV9vYmosIG9ial9maWQpOw0KKw0KK30NCisNCmRpZmYgLS1naXQgYS9jeGNvcmUvaW5jbHVkZS9jdnZlci5oIGIvY3hjb3JlL2luY2x1ZGUvY3Z2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ3OTk2Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL2luY2x1ZGUvY3Z2ZXIuaApAQCAtMCwwICsxLDU1IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCggQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyhpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0KGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qCisgIGRlZmluaXRpb24gb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBPcGVuQ1YKKyAgVXNlZnVsbCB0byB0ZXN0IGluIHVzZXIgcHJvZ3JhbXMKKyovCisKKyNpZm5kZWYgX0NWVkVSU0lPTl9IXworI2RlZmluZSBfQ1ZWRVJTSU9OX0hfCisKKyNkZWZpbmUgQ1ZfTUFKT1JfVkVSU0lPTiAgICAxCisjZGVmaW5lIENWX01JTk9SX1ZFUlNJT04gICAgMQorI2RlZmluZSBDVl9TVUJNSU5PUl9WRVJTSU9OIDAKKyNkZWZpbmUgQ1ZfVkVSU0lPTiAgICAgICAgICAiMS4xLjAiCisKKyNlbmRpZiAvKl9DVlZFUlNJT05fSF8qLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL2luY2x1ZGUvY3Z3aW1hZ2UuaCBiL2N4Y29yZS9pbmNsdWRlL2N2d2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhNTBhNwotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9pbmNsdWRlL2N2d2ltYWdlLmgKQEAgLTAsMCArMSw2MjEgQEAKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIAorLy8gIHRoaXMgbGljZW5zZS4gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIAorLy8gIGluc3RhbGwsIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIEdvb2dsZSwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCAKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2UKKy8vICAgICBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMKKy8vICAgICBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIAorLy8gYW5kIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSAKKy8vIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIAorLy8gYXJlIGRpc2NsYWltZWQuIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgCisvLyBsaWFibGUgZm9yIGFueSBkaXJlY3QsIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIAorLy8gY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gSW1hZ2UgY2xhc3Mgd2hpY2ggcHJvdmlkZXMgYSB0aGluIGxheWVyIGFyb3VuZCBhbiBJcGxJbWFnZS4gIFRoZSBnb2FscworLy8gb2YgdGhlIGNsYXNzIGRlc2lnbiBhcmU6CisvLyAgICAxLiBBbGwgdGhlIGRhdGEgaGFzIGV4cGxpY2l0IG93bmVyc2hpcCB0byBhdm9pZCBtZW1vcnkgbGVha3MKKy8vICAgIDIuIE5vIGhpZGRlbiBhbGxvY2F0aW9ucyBvciBjb3BpZXMgZm9yIHBlcmZvcm1hbmNlLgorLy8gICAgMy4gRWFzeSBhY2Nlc3MgdG8gT3BlbkNWIG1ldGhvZHMgKHdoaWNoIHdpbGwgYWNjZXNzIElQUCBpZiBhdmFpbGFibGUpCisvLyAgICA0LiBDYW4gZWFzaWx5IHRyZWF0IGV4dGVybmFsIGRhdGEgYXMgYW4gaW1hZ2UKKy8vICAgIDUuIEVhc3kgdG8gY3JlYXRlIGltYWdlcyB3aGljaCBhcmUgc3Vic2V0cyBvZiBvdGhlciBpbWFnZXMKKy8vICAgIDYuIEZhc3QgcGl4ZWwgYWNjZXNzIHdoaWNoIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBudW1iZXIgb2YgY2hhbm5lbHMKKy8vICAgICAgICAgIGlmIGtub3duIGF0IGNvbXBpbGUgdGltZS4KKy8vCisvLyBUaGUgV0ltYWdlIGNsYXNzIGlzIHRoZSBpbWFnZSBjbGFzcyB3aGljaCBwcm92aWRlcyB0aGUgZGF0YSBhY2Nlc3NvcnMuCisvLyBUaGUgJ1cnIGNvbWVzIGZyb20gdGhlIGZhY3QgdGhhdCBpdCBpcyBhbHNvIGEgd3JhcHBlciBhcm91bmQgdGhlIHBvcHVsYXIKKy8vIGJ1dCBpbmNvbnZlbmllbnQgSXBsSW1hZ2UgY2xhc3MuIEEgV0ltYWdlIGNhbiBiZSBjb25zdHJ1Y3RlZCBlaXRoZXIgdXNpbmcgYQorLy8gV0ltYWdlQnVmZmVyIGNsYXNzIHdoaWNoIGFsbG9jYXRlcyBhbmQgZnJlZXMgdGhlIGRhdGEsCisvLyBvciB1c2luZyBhIFdJbWFnZVZpZXcgY2xhc3Mgd2hpY2ggY29uc3RydWN0cyBhIHN1YmltYWdlIG9yIGEgdmlldyBpbnRvCisvLyBleHRlcm5hbCBkYXRhLiAgVGhlIHZpZXcgY2xhc3MgZG9lcyBubyBtZW1vcnkgbWFuYWdlbWVudC4gIEVhY2ggY2xhc3MKKy8vIGFjdHVhbGx5IGhhcyB0d28gdmVyc2lvbnMsIG9uZSB3aGVuIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaXMga25vd24gYXQKKy8vIGNvbXBpbGUgdGltZSBhbmQgb25lIHdoZW4gaXQgaXNuJ3QuICBVc2luZyB0aGUgb25lIHdpdGggdGhlIG51bWJlciBvZgorLy8gY2hhbm5lbHMgc3BlY2lmaWVkIGNhbiBwcm92aWRlIHNvbWUgY29tcGlsZSB0aW1lIG9wdGltaXphdGlvbnMgYnkgdXNpbmcgdGhlCisvLyBmYWN0IHRoYXQgdGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBhIGNvbnN0YW50LgorLy8KKy8vIFdlIHVzZSB0aGUgY29udmVudGlvbiAoYyxyKSB0byByZWZlciB0byBjb2x1bW4gYyBhbmQgcm93IHIgd2l0aCAoMCwwKSBiZWluZworLy8gdGhlIHVwcGVyIGxlZnQgY29ybmVyLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHN0YW5kYXJkIEV1Y2xpZGVhbiBjb29yZGluYXRlcworLy8gd2l0aCB0aGUgZmlyc3QgY29vcmRpbmF0ZSB2YXJ5aW5nIGluIHRoZSBob3Jpem9udGFsIGRpcmVjdGlvbiBhbmQgdGhlIHNlY29uZAorLy8gY29vcmRpbmF0ZSB2YXJ5aW5nIGluIHRoZSB2ZXJ0aWNhbCBkaXJlY3Rpb24uCisvLyBUaHVzIChjLHIpIGlzIHVzdWFsbHkgaW4gdGhlIGRvbWFpbiBbMCwgd2lkdGgpIFggWzAsIGhlaWdodCkKKy8vCisvLyBFeGFtcGxlIHVzYWdlOgorLy8gV0ltYWdlQnVmZmVyM19iICBpbSg1LDcpOyAgLy8gTWFrZSBhIDVYNyAzIGNoYW5uZWwgaW1hZ2Ugb2YgdHlwZSB1Y2hhcgorLy8gV0ltYWdlVmlldzNfYiAgc3ViX2ltKGltLCAyLDIsIDMsMyk7IC8vIDNYMyBzdWJtYXRyaXgKKy8vIHZlY3RvcjxmbG9hdD4gdmVjKDEwLCAzLjBmKTsKKy8vIFdJbWFnZVZpZXcxX2YgdXNlcl9pbSgmdmVjWzBdLCAyLCA1KTsgIC8vIDJYNSBpbWFnZSB3LyBzdXBwbGllZCBkYXRhCisvLworLy8gaW0uU2V0WmVybygpOyAgLy8gc2FtZSBhcyBjdlNldFplcm8oaW0uSXBsKCkpCisvLyAqaW0oMiwgMykgPSAxNTsgIC8vIE1vZGlmeSB0aGUgZWxlbWVudCBhdCBjb2x1bW4gMiwgcm93IDMKKy8vIE15U2V0UmFuZCgmc3ViX2ltKTsKKy8vCisvLyAvLyBDb3B5IHRoZSBzZWNvbmQgcm93IGludG8gdGhlIGZpcnN0LiAgVGhpcyBjYW4gYmUgZG9uZSB3aXRoIG5vIG1lbW9yeQorLy8gLy8gYWxsb2NhdGlvbiBhbmQgd2lsbCB1c2UgU1NFIGlmIElQUCBpcyBhdmFpbGFibGUuCisvLyBpbnQgdyA9IGltLldpZHRoKCk7CisvLyBpbS5WaWV3KDAsMCwgdywxKS5Db3B5RnJvbShpbS5WaWV3KDAsMSwgdywxKSk7CisvLworLy8gLy8gRG9lc24ndCBjYXJlIGFib3V0IHNvdXJjZSBvZiBkYXRhIHNpbmNlIHVzaW5nIFdJbWFnZQorLy8gdm9pZCBNeVNldFJhbmQoV0ltYWdlX2IqIGltKSB7IC8vIFdvcmtzIHdpdGggYW55IG51bWJlciBvZiBjaGFubmVscworLy8gICBmb3IgKGludCByID0gMDsgciA8IGltLT5IZWlnaHQoKTsgKytyKSB7CisvLyAgICAgZmxvYXQqIHJvdyA9IGltLT5Sb3cocik7CisvLyAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBpbS0+V2lkdGgoKTsgKytjKSB7CisvLyAgICAgICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGltLT5DaGFubmVscygpOyArK2NoLCArK3JvdykgeworLy8gICAgICAgICAgKnJvdyA9IHVjaGFyKHJhbmQoKSAmIDI1NSk7CisvLyAgICAgICAgfQorLy8gICAgIH0KKy8vICAgfQorLy8gfQorLy8KKy8vIEZ1bmN0aW9ucyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgYmFzaWMgaW1hZ2UgYWxsb2NhdGlvbiwgdmlld2luZywgYW5kCisvLyBhY2Nlc3Mgc2hvdWxkIGNvbWUgZnJvbSBPcGVuQ1YsIGV4Y2VwdCBzb21lIHVzZWZ1bCBmdW5jdGlvbnMgdGhhdCBhcmUgbm90CisvLyBwYXJ0IG9mIE9wZW5DViBjYW4gYmUgZm91bmQgaW4gd2ltYWdlX3V0aWwuaAorI2lmbmRlZiBfQ1ZfV0lNQUdFX0hfCisjZGVmaW5lIF9DVl9XSU1BR0VfSF8KKworI2luY2x1ZGUgImN4Y29yZS5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKworbmFtZXNwYWNlIGN2IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFdJbWFnZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBXSW1hZ2VCdWZmZXI7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgV0ltYWdlVmlldzsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IEM+IGNsYXNzIFdJbWFnZUM7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4gY2xhc3MgV0ltYWdlQnVmZmVyQzsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBDPiBjbGFzcyBXSW1hZ2VWaWV3QzsKKworLy8gQ29tbW9ubHkgdXNlZCB0eXBlZGVmcy4KK3R5cGVkZWYgV0ltYWdlPHVjaGFyPiAgICAgICAgICAgIFdJbWFnZV9iOwordHlwZWRlZiBXSW1hZ2VWaWV3PHVjaGFyPiAgICAgICAgV0ltYWdlVmlld19iOwordHlwZWRlZiBXSW1hZ2VCdWZmZXI8dWNoYXI+ICAgICAgV0ltYWdlQnVmZmVyX2I7CisKK3R5cGVkZWYgV0ltYWdlQzx1Y2hhciwgMT4gICAgICAgIFdJbWFnZTFfYjsKK3R5cGVkZWYgV0ltYWdlVmlld0M8dWNoYXIsIDE+ICAgIFdJbWFnZVZpZXcxX2I7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8dWNoYXIsIDE+ICBXSW1hZ2VCdWZmZXIxX2I7CisKK3R5cGVkZWYgV0ltYWdlQzx1Y2hhciwgMz4gICAgICAgIFdJbWFnZTNfYjsKK3R5cGVkZWYgV0ltYWdlVmlld0M8dWNoYXIsIDM+ICAgIFdJbWFnZVZpZXczX2I7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8dWNoYXIsIDM+ICBXSW1hZ2VCdWZmZXIzX2I7CisKK3R5cGVkZWYgV0ltYWdlPGZsb2F0PiAgICAgICAgICAgIFdJbWFnZV9mOwordHlwZWRlZiBXSW1hZ2VWaWV3PGZsb2F0PiAgICAgICAgV0ltYWdlVmlld19mOwordHlwZWRlZiBXSW1hZ2VCdWZmZXI8ZmxvYXQ+ICAgICAgV0ltYWdlQnVmZmVyX2Y7CisKK3R5cGVkZWYgV0ltYWdlQzxmbG9hdCwgMT4gICAgICAgIFdJbWFnZTFfZjsKK3R5cGVkZWYgV0ltYWdlVmlld0M8ZmxvYXQsIDE+ICAgIFdJbWFnZVZpZXcxX2Y7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8ZmxvYXQsIDE+ICBXSW1hZ2VCdWZmZXIxX2Y7CisKK3R5cGVkZWYgV0ltYWdlQzxmbG9hdCwgMz4gICAgICAgIFdJbWFnZTNfZjsKK3R5cGVkZWYgV0ltYWdlVmlld0M8ZmxvYXQsIDM+ICAgIFdJbWFnZVZpZXczX2Y7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8ZmxvYXQsIDM+ICBXSW1hZ2VCdWZmZXIzX2Y7CisKKy8vIFRoZXJlIGlzbid0IGEgc3RhbmRhcmQgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgc2hvcnQgc28gYmUgbW9yZQorLy8gZXhwbGljaXQgaW4gdGhlIHR5cGVuYW1lIGZvciB0aGVzZSBjYXNlcy4KK3R5cGVkZWYgV0ltYWdlPHNob3J0PiAgICAgICAgICAgIFdJbWFnZV8xNnM7Cit0eXBlZGVmIFdJbWFnZVZpZXc8c2hvcnQ+ICAgICAgICBXSW1hZ2VWaWV3XzE2czsKK3R5cGVkZWYgV0ltYWdlQnVmZmVyPHNob3J0PiAgICAgIFdJbWFnZUJ1ZmZlcl8xNnM7CisKK3R5cGVkZWYgV0ltYWdlQzxzaG9ydCwgMT4gICAgICAgIFdJbWFnZTFfMTZzOwordHlwZWRlZiBXSW1hZ2VWaWV3QzxzaG9ydCwgMT4gICAgV0ltYWdlVmlldzFfMTZzOwordHlwZWRlZiBXSW1hZ2VCdWZmZXJDPHNob3J0LCAxPiAgV0ltYWdlQnVmZmVyMV8xNnM7CisKK3R5cGVkZWYgV0ltYWdlQzxzaG9ydCwgMz4gICAgICAgIFdJbWFnZTNfMTZzOwordHlwZWRlZiBXSW1hZ2VWaWV3QzxzaG9ydCwgMz4gICAgV0ltYWdlVmlldzNfMTZzOwordHlwZWRlZiBXSW1hZ2VCdWZmZXJDPHNob3J0LCAzPiAgV0ltYWdlQnVmZmVyM18xNnM7CisKK3R5cGVkZWYgV0ltYWdlPHVzaG9ydD4gICAgICAgICAgICBXSW1hZ2VfMTZ1OwordHlwZWRlZiBXSW1hZ2VWaWV3PHVzaG9ydD4gICAgICAgIFdJbWFnZVZpZXdfMTZ1OwordHlwZWRlZiBXSW1hZ2VCdWZmZXI8dXNob3J0PiAgICAgIFdJbWFnZUJ1ZmZlcl8xNnU7CisKK3R5cGVkZWYgV0ltYWdlQzx1c2hvcnQsIDE+ICAgICAgICBXSW1hZ2UxXzE2dTsKK3R5cGVkZWYgV0ltYWdlVmlld0M8dXNob3J0LCAxPiAgICBXSW1hZ2VWaWV3MV8xNnU7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8dXNob3J0LCAxPiAgV0ltYWdlQnVmZmVyMV8xNnU7CisKK3R5cGVkZWYgV0ltYWdlQzx1c2hvcnQsIDM+ICAgICAgICBXSW1hZ2UzXzE2dTsKK3R5cGVkZWYgV0ltYWdlVmlld0M8dXNob3J0LCAzPiAgICBXSW1hZ2VWaWV3M18xNnU7Cit0eXBlZGVmIFdJbWFnZUJ1ZmZlckM8dXNob3J0LCAzPiAgV0ltYWdlQnVmZmVyM18xNnU7CisKKy8vCisvLyBXSW1hZ2UgZGVmaW5pdGlvbnMKKy8vCisvLyBUaGlzIFdJbWFnZSBjbGFzcyBnaXZlcyBhY2Nlc3MgdG8gdGhlIGRhdGEgaXQgcmVmZXJzIHRvLiAgSXQgY2FuIGJlCisvLyBjb25zdHJ1Y3RlZCBlaXRoZXIgYnkgYWxsb2NhdGluZyB0aGUgZGF0YSB3aXRoIGEgV0ltYWdlQnVmZmVyIGNsYXNzIG9yCisvLyB1c2luZyB0aGUgV0ltYWdlVmlldyBjbGFzcyB0byByZWZlciB0byBhIHN1YmltYWdlIG9yIG91dHNpZGUgZGF0YS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBXSW1hZ2UKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIFQgQmFzZVR5cGU7CisKKyAgICAvLyBXSW1hZ2UgaXMgYW4gYWJzdHJhY3QgY2xhc3Mgd2l0aCBubyBvdGhlciB2aXJ0dWFsIG1ldGhvZHMgc28gbWFrZSB0aGUKKyAgICAvLyBkZXN0cnVjdG9yIHZpcnR1YWwuCisgICAgdmlydHVhbCB+V0ltYWdlKCkgPSAwOworCisgICAgLy8gQWNjZXNzb3JzCisgICAgSXBsSW1hZ2UqIElwbCgpIHtyZXR1cm4gaW1hZ2VfOyB9CisgICAgY29uc3QgSXBsSW1hZ2UqIElwbCgpIGNvbnN0IHtyZXR1cm4gaW1hZ2VfOyB9CisgICAgVCogSW1hZ2VEYXRhKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oaW1hZ2VfLT5pbWFnZURhdGEpOyB9CisgICAgY29uc3QgVCogSW1hZ2VEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oaW1hZ2VfLT5pbWFnZURhdGEpOworICAgIH0KKworICAgIGludCBXaWR0aCgpIGNvbnN0IHtyZXR1cm4gaW1hZ2VfLT53aWR0aDsgfQorICAgIGludCBIZWlnaHQoKSBjb25zdCB7cmV0dXJuIGltYWdlXy0+aGVpZ2h0OyB9CisKKyAgICAvLyBXaWR0aFN0ZXAgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnbyB0byB0aGUgcGl4ZWwgd2l0aCB0aGUgbmV4dCB5IGNvb3JkCisgICAgaW50IFdpZHRoU3RlcCgpIGNvbnN0IHtyZXR1cm4gaW1hZ2VfLT53aWR0aFN0ZXA7IH0KKworICAgIGludCBDaGFubmVscygpIGNvbnN0IHtyZXR1cm4gaW1hZ2VfLT5uQ2hhbm5lbHM7IH0KKyAgICBpbnQgQ2hhbm5lbFNpemUoKSBjb25zdCB7cmV0dXJuIHNpemVvZihUKTsgfSAgLy8gbnVtYmVyIG9mIGJ5dGVzIHBlciBjaGFubmVsCisKKyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgcGVyIHBpeGVsCisgICAgaW50IFBpeGVsU2l6ZSgpIGNvbnN0IHtyZXR1cm4gQ2hhbm5lbHMoKSAqIENoYW5uZWxTaXplKCk7IH0KKworICAgIC8vIFJldHVybiBkZXB0aCB0eXBlIChlLmcuIElQTF9ERVBUSF84VSwgSVBMX0RFUFRIXzMyRikgd2hpY2ggaXMgdGhlIG51bWJlcgorICAgIC8vIG9mIGJpdHMgcGVyIGNoYW5uZWwgYW5kIHdpdGggdGhlIHNpZ25lZCBiaXQgc2V0LgorICAgIC8vIFRoaXMgaXMga25vd24gYXQgY29tcGlsZSB0aW1lIHVzaW5nIHNwZWNpYWxpemF0aW9ucy4KKyAgICBpbnQgRGVwdGgoKSBjb25zdDsKKworICAgIGlubGluZSBjb25zdCBUKiBSb3coaW50IHIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGltYWdlXy0+aW1hZ2VEYXRhICsgcippbWFnZV8tPndpZHRoU3RlcCk7CisgICAgfQorCisgICAgaW5saW5lIFQqIFJvdyhpbnQgcikgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oaW1hZ2VfLT5pbWFnZURhdGEgKyByKmltYWdlXy0+d2lkdGhTdGVwKTsKKyAgICB9CisKKyAgICAvLyBQaXhlbCBhY2Nlc3NvcnMgd2hpY2ggcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjaGFubmVsCisgICAgaW5saW5lIFQqIG9wZXJhdG9yKCkgKGludCBjLCBpbnQgcikgIHsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KGltYWdlXy0+aW1hZ2VEYXRhICsgcippbWFnZV8tPndpZHRoU3RlcCkgKworICAgICAgICAgICAgYypDaGFubmVscygpOworICAgIH0KKworICAgIGlubGluZSBjb25zdCBUKiBvcGVyYXRvcigpIChpbnQgYywgaW50IHIpIGNvbnN0ICB7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqPihpbWFnZV8tPmltYWdlRGF0YSArIHIqaW1hZ2VfLT53aWR0aFN0ZXApICsKKyAgICAgICAgICAgIGMqQ2hhbm5lbHMoKTsKKyAgICB9CisKKyAgICAvLyBDb3B5IHRoZSBjb250ZW50cyBmcm9tIGFub3RoZXIgaW1hZ2Ugd2hpY2ggaXMganVzdCBhIGNvbnZlbmllbmNlIHRvIGN2Q29weQorICAgIHZvaWQgQ29weUZyb20oY29uc3QgV0ltYWdlPFQ+JiBzcmMpIHsgY3ZDb3B5KHNyYy5JcGwoKSwgaW1hZ2VfKTsgfQorCisgICAgLy8gU2V0IGNvbnRlbnRzIHRvIHplcm8gd2hpY2ggaXMganVzdCBhIGNvbnZlbmllbnQgdG8gY3ZTZXRaZXJvCisgICAgdm9pZCBTZXRaZXJvKCkgeyBjdlNldFplcm8oaW1hZ2VfKTsgfQorCisgICAgLy8gQ29uc3RydWN0IGEgdmlldyBpbnRvIGEgcmVnaW9uIG9mIHRoaXMgaW1hZ2UKKyAgICBXSW1hZ2VWaWV3PFQ+IFZpZXcoaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRGlzYWxsb3cgY29weSBhbmQgYXNzaWdubWVudAorICAgIFdJbWFnZShjb25zdCBXSW1hZ2UmKTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBXSW1hZ2UmKTsKKworICAgIGV4cGxpY2l0IFdJbWFnZShJcGxJbWFnZSogaW1nKSA6IGltYWdlXyhpbWcpIHsKKyAgICAgICAgYXNzZXJ0KCFpbWcgfHwgaW1nLT5kZXB0aCA9PSBEZXB0aCgpKTsKKyAgICB9CisKKyAgICB2b2lkIFNldElwbChJcGxJbWFnZSogaW1hZ2UpIHsKKyAgICAgICAgYXNzZXJ0KCFpbWFnZSB8fCBpbWFnZS0+ZGVwdGggPT0gRGVwdGgoKSk7CisgICAgICAgIGltYWdlXyA9IGltYWdlOworICAgIH0KKworICAgIElwbEltYWdlKiBpbWFnZV87Cit9OworCisKKworLy8gSW1hZ2UgY2xhc3Mgd2hlbiBib3RoIHRoZSBwaXhlbCB0eXBlIGFuZCBudW1iZXIgb2YgY2hhbm5lbHMKKy8vIGFyZSBrbm93biBhdCBjb21waWxlIHRpbWUuICBUaGlzIHdyYXBwZXIgd2lsbCBzcGVlZCB1cCBzb21lIG9mIHRoZSBvcGVyYXRpb25zCisvLyBsaWtlIGFjY2Vzc2luZyBpbmRpdmlkdWFsIHBpeGVscyB1c2luZyB0aGUgKCkgb3BlcmF0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4KK2NsYXNzIFdJbWFnZUMgOiBwdWJsaWMgV0ltYWdlPFQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBXSW1hZ2U8VD46OkJhc2VUeXBlIEJhc2VUeXBlOworICAgIGVudW0geyBrQ2hhbm5lbHMgPSBDIH07CisKKyAgICBleHBsaWNpdCBXSW1hZ2VDKElwbEltYWdlKiBpbWcpIDogV0ltYWdlPFQ+KGltZykgeworICAgICAgICBhc3NlcnQoIWltZyB8fCBpbWctPm5DaGFubmVscyA9PSBDaGFubmVscygpKTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSB2aWV3IGludG8gYSByZWdpb24gb2YgdGhpcyBpbWFnZQorICAgIFdJbWFnZVZpZXdDPFQsIEM+IFZpZXcoaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLy8gQ29weSB0aGUgY29udGVudHMgZnJvbSBhbm90aGVyIGltYWdlIHdoaWNoIGlzIGp1c3QgYSBjb252ZW5pZW5jZSB0byBjdkNvcHkKKyAgICB2b2lkIENvcHlGcm9tKGNvbnN0IFdJbWFnZUM8VCwgQz4mIHNyYykgeworICAgICAgICBjdkNvcHkoc3JjLklwbCgpLCBXSW1hZ2U8VD46OmltYWdlXyk7CisgICAgfQorCisgICAgLy8gV0ltYWdlQyBpcyBhbiBhYnN0cmFjdCBjbGFzcyB3aXRoIG5vIG90aGVyIHZpcnR1YWwgbWV0aG9kcyBzbyBtYWtlIHRoZQorICAgIC8vIGRlc3RydWN0b3IgdmlydHVhbC4KKyAgICB2aXJ0dWFsIH5XSW1hZ2VDKCkgPSAwOworCisgICAgaW50IENoYW5uZWxzKCkgY29uc3Qge3JldHVybiBDOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ25tZW50CisgICAgV0ltYWdlQyhjb25zdCBXSW1hZ2VDJik7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgV0ltYWdlQyYpOworCisgICAgdm9pZCBTZXRJcGwoSXBsSW1hZ2UqIGltYWdlKSB7CisgICAgICAgIGFzc2VydCghaW1hZ2UgfHwgaW1hZ2UtPmRlcHRoID09IFdJbWFnZTxUPjo6RGVwdGgoKSk7CisgICAgICAgIFdJbWFnZTxUPjo6U2V0SXBsKGltYWdlKTsKKyAgICB9Cit9OworCisvLworLy8gV0ltYWdlQnVmZmVyIGRlZmluaXRpb25zCisvLworLy8gSW1hZ2UgY2xhc3Mgd2hpY2ggb3ducyB0aGUgZGF0YSwgc28gaXQgY2FuIGJlIGFsbG9jYXRlZCBhbmQgaXMgYWx3YXlzCisvLyBmcmVlZC4gIEl0IGNhbm5vdCBiZSBjb3BpZWQgYnV0IGNhbiBiZSBleHBsaWNpdHkgY2xvbmVkLgorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBXSW1hZ2VCdWZmZXIgOiBwdWJsaWMgV0ltYWdlPFQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBXSW1hZ2U8VD46OkJhc2VUeXBlIEJhc2VUeXBlOworCisgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciB3aGljaCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGNhbiBiZQorICAgIFdJbWFnZUJ1ZmZlcigpIDogV0ltYWdlPFQ+KDApIHt9CisKKyAgICBXSW1hZ2VCdWZmZXIoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgbmNoYW5uZWxzKSA6IFdJbWFnZTxUPigwKSB7CisgICAgICAgIEFsbG9jYXRlKHdpZHRoLCBoZWlnaHQsIG5jaGFubmVscyk7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0b3Igd2hpY2ggdGFrZXMgb3duZXJzaGlwIG9mIGEgZ2l2ZW4gSXBsSW1hZ2Ugc28gcmVsZWFzZXMKKyAgICAvLyB0aGUgaW1hZ2Ugb24gZGVzdHJ1Y3Rpb24uCisgICAgZXhwbGljaXQgV0ltYWdlQnVmZmVyKElwbEltYWdlKiBpbWcpIDogV0ltYWdlPFQ+KGltZykge30KKworICAgIC8vIEFsbG9jYXRlIGFuIGltYWdlLiAgRG9lcyBub3RoaW5nIGlmIGN1cnJlbnQgc2l6ZSBpcyB0aGUgc2FtZSBhcworICAgIC8vIHRoZSBuZXcgc2l6ZS4KKyAgICB2b2lkIEFsbG9jYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5jaGFubmVscyk7CisKKyAgICAvLyBTZXQgdGhlIGRhdGEgdG8gcG9pbnQgdG8gYW4gaW1hZ2UsIHJlbGVhc2luZyB0aGUgb2xkIGRhdGEKKyAgICB2b2lkIFNldElwbChJcGxJbWFnZSogaW1nKSB7CisgICAgICAgIFJlbGVhc2VJbWFnZSgpOworICAgICAgICBXSW1hZ2U8VD46OlNldElwbChpbWcpOworICAgIH0KKworICAgIC8vIENsb25lIGFuIGltYWdlIHdoaWNoIHJlYWxsb2NhdGVzIHRoZSBpbWFnZSBpZiBvZiBhIGRpZmZlcmVudCBkaW1lbnNpb24uCisgICAgdm9pZCBDbG9uZUZyb20oY29uc3QgV0ltYWdlPFQ+JiBzcmMpIHsKKyAgICAgICAgQWxsb2NhdGUoc3JjLldpZHRoKCksIHNyYy5IZWlnaHQoKSk7CisgICAgICAgIENvcHlGcm9tKHNyYyk7CisgICAgfQorCisgICAgfldJbWFnZUJ1ZmZlcigpIHsKKyAgICAgICAgUmVsZWFzZUltYWdlKCk7CisgICAgfQorCisgICAgLy8gUmVsZWFzZSB0aGUgaW1hZ2UgaWYgaXQgaXNuJ3QgbnVsbC4KKyAgICB2b2lkIFJlbGVhc2VJbWFnZSgpIHsKKyAgICAgICAgaWYgKFdJbWFnZTxUPjo6aW1hZ2VfKSB7CisgICAgICAgICAgICBJcGxJbWFnZSogaW1hZ2UgPSBXSW1hZ2U8VD46OmltYWdlXzsKKyAgICAgICAgICAgIGN2UmVsZWFzZUltYWdlKCZpbWFnZSk7CisgICAgICAgICAgICBXSW1hZ2U8VD46OlNldElwbCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgSXNOdWxsKCkgY29uc3Qge3JldHVybiBXSW1hZ2U8VD46OmltYWdlXyA9PSBOVUxMOyB9CisKK3ByaXZhdGU6CisgICAgLy8gRGlzYWxsb3cgY29weSBhbmQgYXNzaWdubWVudAorICAgIFdJbWFnZUJ1ZmZlcihjb25zdCBXSW1hZ2VCdWZmZXImKTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBXSW1hZ2VCdWZmZXImKTsKK307CisKKy8vIExpa2UgYSBXSW1hZ2VCdWZmZXIgY2xhc3MgYnV0IHdoZW4gdGhlIG51bWJlciBvZiBjaGFubmVscyBpcyBrbm93bgorLy8gYXQgY29tcGlsZSB0aW1lLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IEM+CitjbGFzcyBXSW1hZ2VCdWZmZXJDIDogcHVibGljIFdJbWFnZUM8VCwgQz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFdJbWFnZTxUPjo6QmFzZVR5cGUgQmFzZVR5cGU7CisgICAgZW51bSB7IGtDaGFubmVscyA9IEMgfTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3Igd2hpY2ggY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBjYW4gYmUKKyAgICBXSW1hZ2VCdWZmZXJDKCkgOiBXSW1hZ2VDPFQsIEM+KDApIHt9CisKKyAgICBXSW1hZ2VCdWZmZXJDKGludCB3aWR0aCwgaW50IGhlaWdodCkgOiBXSW1hZ2VDPFQsIEM+KDApIHsKKyAgICAgICAgQWxsb2NhdGUod2lkdGgsIGhlaWdodCk7CisgICAgfQorCisgICAgLy8gQ29uc3RydWN0b3Igd2hpY2ggdGFrZXMgb3duZXJzaGlwIG9mIGEgZ2l2ZW4gSXBsSW1hZ2Ugc28gcmVsZWFzZXMKKyAgICAvLyB0aGUgaW1hZ2Ugb24gZGVzdHJ1Y3Rpb24uCisgICAgZXhwbGljaXQgV0ltYWdlQnVmZmVyQyhJcGxJbWFnZSogaW1nKSA6IFdJbWFnZUM8VCwgQz4oaW1nKSB7fQorCisgICAgLy8gQWxsb2NhdGUgYW4gaW1hZ2UuICBEb2VzIG5vdGhpbmcgaWYgY3VycmVudCBzaXplIGlzIHRoZSBzYW1lIGFzCisgICAgLy8gdGhlIG5ldyBzaXplLgorICAgIHZvaWQgQWxsb2NhdGUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKworICAgIC8vIFNldCB0aGUgZGF0YSB0byBwb2ludCB0byBhbiBpbWFnZSwgcmVsZWFzaW5nIHRoZSBvbGQgZGF0YQorICAgIHZvaWQgU2V0SXBsKElwbEltYWdlKiBpbWcpIHsKKyAgICAgICAgUmVsZWFzZUltYWdlKCk7CisgICAgICAgIFdJbWFnZUM8VCwgQz46OlNldElwbChpbWcpOworICAgIH0KKworICAgIC8vIENsb25lIGFuIGltYWdlIHdoaWNoIHJlYWxsb2NhdGVzIHRoZSBpbWFnZSBpZiBvZiBhIGRpZmZlcmVudCBkaW1lbnNpb24uCisgICAgdm9pZCBDbG9uZUZyb20oY29uc3QgV0ltYWdlQzxULCBDPiYgc3JjKSB7CisgICAgICAgIEFsbG9jYXRlKHNyYy5XaWR0aCgpLCBzcmMuSGVpZ2h0KCkpOworICAgICAgICBDb3B5RnJvbShzcmMpOworICAgIH0KKworICAgIH5XSW1hZ2VCdWZmZXJDKCkgeworICAgICAgICBSZWxlYXNlSW1hZ2UoKTsKKyAgICB9CisKKyAgICAvLyBSZWxlYXNlIHRoZSBpbWFnZSBpZiBpdCBpc24ndCBudWxsLgorICAgIHZvaWQgUmVsZWFzZUltYWdlKCkgeworICAgICAgICBpZiAoV0ltYWdlPFQ+OjppbWFnZV8pIHsKKyAgICAgICAgICAgIElwbEltYWdlKiBpbWFnZSA9IFdJbWFnZTxUPjo6aW1hZ2VfOworICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoJmltYWdlKTsKKyAgICAgICAgICAgIFdJbWFnZUM8VCwgQz46OlNldElwbCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgSXNOdWxsKCkgY29uc3Qge3JldHVybiBXSW1hZ2U8VD46OmltYWdlXyA9PSBOVUxMOyB9CisKK3ByaXZhdGU6CisgICAgLy8gRGlzYWxsb3cgY29weSBhbmQgYXNzaWdubWVudAorICAgIFdJbWFnZUJ1ZmZlckMoY29uc3QgV0ltYWdlQnVmZmVyQyYpOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFdJbWFnZUJ1ZmZlckMmKTsKK307CisKKy8vCisvLyBXSW1hZ2VWaWV3IGRlZmluaXRpb25zCisvLworLy8gVmlldyBpbnRvIGFuIGltYWdlIGNsYXNzIHdoaWNoIGFsbG93cyB0cmVhdGluZyBhIHN1YmltYWdlIGFzIGFuIGltYWdlCisvLyBvciB0cmVhdGluZyBleHRlcm5hbCBkYXRhIGFzIGFuIGltYWdlCisvLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFdJbWFnZVZpZXcgOiBwdWJsaWMgV0ltYWdlPFQ+Cit7CitwdWJsaWM6CisgICAgdHlwZWRlZiB0eXBlbmFtZSBXSW1hZ2U8VD46OkJhc2VUeXBlIEJhc2VUeXBlOworCisgICAgLy8gQ29uc3RydWN0IGEgc3ViaW1hZ2UuICBObyBjaGVja3MgYXJlIGRvbmUgdGhhdCB0aGUgc3ViaW1hZ2UgbGllcworICAgIC8vIGNvbXBsZXRlbHkgaW5zaWRlIHRoZSBvcmlnaW5hbCBpbWFnZS4KKyAgICBXSW1hZ2VWaWV3KFdJbWFnZTxUPiogaW1nLCBpbnQgYywgaW50IHIsIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisKKyAgICAvLyBSZWZlciB0byBleHRlcm5hbCBkYXRhLgorICAgIC8vIElmIG5vdCBnaXZlbiB3aWR0aF9zdGVwIGFzc3VtZWQgdG8gYmUgc2FtZSBhcyB3aWR0aC4KKyAgICBXSW1hZ2VWaWV3KFQqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGNoYW5uZWxzLCBpbnQgd2lkdGhfc3RlcCA9IC0xKTsKKworICAgIC8vIFJlZmVyIHRvIGV4dGVybmFsIGRhdGEuICBUaGlzIGRvZXMgTk9UIHRha2Ugb3duZXJzaGlwCisgICAgLy8gb2YgdGhlIHN1cHBsaWVkIElwbEltYWdlLgorICAgIFdJbWFnZVZpZXcoSXBsSW1hZ2UqIGltZykgOiBXSW1hZ2U8VD4oaW1nKSB7fQorCisgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgIFdJbWFnZVZpZXcoY29uc3QgV0ltYWdlPFQ+JiBpbWcpIDogV0ltYWdlPFQ+KDApIHsKKyAgICAgICAgaGVhZGVyXyA9ICooaW1nLklwbCgpKTsKKyAgICAgICAgV0ltYWdlPFQ+OjpTZXRJcGwoJmhlYWRlcl8pOworICAgIH0KKworICAgIFdJbWFnZVZpZXcmIG9wZXJhdG9yPShjb25zdCBXSW1hZ2U8VD4mIGltZykgeworICAgICAgICBoZWFkZXJfID0gKihpbWcuSXBsKCkpOworICAgICAgICBXSW1hZ2U8VD46OlNldElwbCgmaGVhZGVyXyk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBJcGxJbWFnZSBoZWFkZXJfOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4KK2NsYXNzIFdJbWFnZVZpZXdDIDogcHVibGljIFdJbWFnZUM8VCwgQz4KK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHR5cGVuYW1lIFdJbWFnZTxUPjo6QmFzZVR5cGUgQmFzZVR5cGU7CisgICAgZW51bSB7IGtDaGFubmVscyA9IEMgfTsKKworICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGZvciB2ZWN0b3JzIG9mIHZpZXdzLgorICAgIFdJbWFnZVZpZXdDKCk7CisKKyAgICB2aXJ0dWFsIH5XSW1hZ2VWaWV3QygpIHt9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBzdWJpbWFnZS4gIE5vIGNoZWNrcyBhcmUgZG9uZSB0aGF0IHRoZSBzdWJpbWFnZSBsaWVzCisgICAgLy8gY29tcGxldGVseSBpbnNpZGUgdGhlIG9yaWdpbmFsIGltYWdlLgorICAgIFdJbWFnZVZpZXdDKFdJbWFnZUM8VCwgQz4qIGltZywKKyAgICAgICAgaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOworCisgICAgLy8gUmVmZXIgdG8gZXh0ZXJuYWwgZGF0YQorICAgIFdJbWFnZVZpZXdDKFQqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHdpZHRoX3N0ZXAgPSAtMSk7CisKKyAgICAvLyBSZWZlciB0byBleHRlcm5hbCBkYXRhLiAgVGhpcyBkb2VzIE5PVCB0YWtlIG93bmVyc2hpcAorICAgIC8vIG9mIHRoZSBzdXBwbGllZCBJcGxJbWFnZS4KKyAgICBXSW1hZ2VWaWV3QyhJcGxJbWFnZSogaW1nKSA6IFdJbWFnZUM8VCwgQz4oaW1nKSB7fQorCisgICAgLy8gQ29weSBjb25zdHJ1Y3RvciB3aGljaCBkb2VzIGEgc2hhbGxvdyBjb3B5IHRvIGFsbG93IG11bHRpcGxlIHZpZXdzCisgICAgLy8gb2Ygc2FtZSBkYXRhLiAgZ2NjLTQuMS4xIGdldHMgY29uZnVzZWQgaWYgYm90aCB2ZXJzaW9ucyBvZgorICAgIC8vIHRoZSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvciBhcmUgbm90IHByb3ZpZGVkLgorICAgIFdJbWFnZVZpZXdDKGNvbnN0IFdJbWFnZUM8VCwgQz4mIGltZykgOiBXSW1hZ2VDPFQsIEM+KDApIHsKKyAgICAgICAgaGVhZGVyXyA9ICooaW1nLklwbCgpKTsKKyAgICAgICAgV0ltYWdlQzxULCBDPjo6U2V0SXBsKCZoZWFkZXJfKTsKKyAgICB9CisgICAgV0ltYWdlVmlld0MoY29uc3QgV0ltYWdlVmlld0M8VCwgQz4mIGltZykgOiBXSW1hZ2VDPFQsIEM+KDApIHsKKyAgICAgICAgaGVhZGVyXyA9ICooaW1nLklwbCgpKTsKKyAgICAgICAgV0ltYWdlQzxULCBDPjo6U2V0SXBsKCZoZWFkZXJfKTsKKyAgICB9CisKKyAgICBXSW1hZ2VWaWV3QyYgb3BlcmF0b3I9KGNvbnN0IFdJbWFnZUM8VCwgQz4mIGltZykgeworICAgICAgICBoZWFkZXJfID0gKihpbWcuSXBsKCkpOworICAgICAgICBXSW1hZ2VDPFQsIEM+OjpTZXRJcGwoJmhlYWRlcl8pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIFdJbWFnZVZpZXdDJiBvcGVyYXRvcj0oY29uc3QgV0ltYWdlVmlld0M8VCwgQz4mIGltZykgeworICAgICAgICBoZWFkZXJfID0gKihpbWcuSXBsKCkpOworICAgICAgICBXSW1hZ2VDPFQsIEM+OjpTZXRJcGwoJmhlYWRlcl8pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSXBsSW1hZ2UgaGVhZGVyXzsKK307CisKKworLy8gU3BlY2lhbGl6YXRpb25zIGZvciBkZXB0aAordGVtcGxhdGU8PgoraW5saW5lIGludCBXSW1hZ2U8dWNoYXI+OjpEZXB0aCgpIGNvbnN0IHtyZXR1cm4gSVBMX0RFUFRIXzhVOyB9Cit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50IFdJbWFnZTxzY2hhcj46OkRlcHRoKCkgY29uc3Qge3JldHVybiBJUExfREVQVEhfOFM7IH0KK3RlbXBsYXRlPD4KK2lubGluZSBpbnQgV0ltYWdlPHNob3J0Pjo6RGVwdGgoKSBjb25zdCB7cmV0dXJuIElQTF9ERVBUSF8xNlM7IH0KK3RlbXBsYXRlPD4KK2lubGluZSBpbnQgV0ltYWdlPHVzaG9ydD46OkRlcHRoKCkgY29uc3Qge3JldHVybiBJUExfREVQVEhfMTZVOyB9Cit0ZW1wbGF0ZTw+CitpbmxpbmUgaW50IFdJbWFnZTxpbnQ+OjpEZXB0aCgpIGNvbnN0IHtyZXR1cm4gSVBMX0RFUFRIXzMyUzsgfQordGVtcGxhdGU8PgoraW5saW5lIGludCBXSW1hZ2U8ZmxvYXQ+OjpEZXB0aCgpIGNvbnN0IHtyZXR1cm4gSVBMX0RFUFRIXzMyRjsgfQordGVtcGxhdGU8PgoraW5saW5lIGludCBXSW1hZ2U8ZG91YmxlPjo6RGVwdGgoKSBjb25zdCB7cmV0dXJuIElQTF9ERVBUSF82NEY7IH0KKworLy8KKy8vIFB1cmUgdmlydHVhbCBkZXN0cnVjdG9ycyBzdGlsbCBuZWVkIHRvIGJlIGRlZmluZWQuCisvLwordGVtcGxhdGU8dHlwZW5hbWUgVD4gaW5saW5lIFdJbWFnZTxUPjo6fldJbWFnZSgpIHt9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4gaW5saW5lIFdJbWFnZUM8VCwgQz46On5XSW1hZ2VDKCkge30KKworLy8KKy8vIEFsbG9jYXRlIEltYWdlRGF0YQorLy8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBXSW1hZ2VCdWZmZXI8VD46OkFsbG9jYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5jaGFubmVscykKK3sKKyAgICBpZiAoSXNOdWxsKCkgfHwgV0ltYWdlPFQ+OjpXaWR0aCgpICE9IHdpZHRoIHx8CisgICAgICAgIFdJbWFnZTxUPjo6SGVpZ2h0KCkgIT0gaGVpZ2h0IHx8IFdJbWFnZTxUPjo6Q2hhbm5lbHMoKSAhPSBuY2hhbm5lbHMpIHsKKyAgICAgICAgUmVsZWFzZUltYWdlKCk7CisgICAgICAgIFdJbWFnZTxUPjo6aW1hZ2VfID0gY3ZDcmVhdGVJbWFnZShjdlNpemUod2lkdGgsIGhlaWdodCksCisgICAgICAgICAgICBXSW1hZ2U8VD46OkRlcHRoKCksIG5jaGFubmVscyk7CisgICAgfQorfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4KK2lubGluZSB2b2lkIFdJbWFnZUJ1ZmZlckM8VCwgQz46OkFsbG9jYXRlKGludCB3aWR0aCwgaW50IGhlaWdodCkKK3sKKyAgICBpZiAoSXNOdWxsKCkgfHwgV0ltYWdlPFQ+OjpXaWR0aCgpICE9IHdpZHRoIHx8IFdJbWFnZTxUPjo6SGVpZ2h0KCkgIT0gaGVpZ2h0KSB7CisgICAgICAgIFJlbGVhc2VJbWFnZSgpOworICAgICAgICBXSW1hZ2VDPFQsIEM+OjpTZXRJcGwoY3ZDcmVhdGVJbWFnZShjdlNpemUod2lkdGgsIGhlaWdodCksV0ltYWdlPFQ+OjpEZXB0aCgpLCBDKSk7CisgICAgfQorfQorCisvLworLy8gSW1hZ2VWaWV3IG1ldGhvZHMKKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorV0ltYWdlVmlldzxUPjo6V0ltYWdlVmlldyhXSW1hZ2U8VD4qIGltZywgaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgICAgIDogV0ltYWdlPFQ+KDApCit7CisgICAgaGVhZGVyXyA9ICooaW1nLT5JcGwoKSk7CisgICAgaGVhZGVyXy5pbWFnZURhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigoKmltZykoYywgcikpOworICAgIGhlYWRlcl8ud2lkdGggPSB3aWR0aDsKKyAgICBoZWFkZXJfLmhlaWdodCA9IGhlaWdodDsKKyAgICBXSW1hZ2U8VD46OlNldElwbCgmaGVhZGVyXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitXSW1hZ2VWaWV3PFQ+OjpXSW1hZ2VWaWV3KFQqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IG5jaGFubmVscywgaW50IHdpZHRoX3N0ZXApCisgICAgICAgICAgOiBXSW1hZ2U8VD4oMCkKK3sKKyAgICBjdkluaXRJbWFnZUhlYWRlcigmaGVhZGVyXywgY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBXSW1hZ2U8VD46OkRlcHRoKCksIG5jaGFubmVscyk7CisgICAgaGVhZGVyXy5pbWFnZURhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhKTsKKyAgICBpZiAod2lkdGhfc3RlcCA+IDApIHsKKyAgICAgICAgaGVhZGVyXy53aWR0aFN0ZXAgPSB3aWR0aF9zdGVwOworICAgIH0KKyAgICBXSW1hZ2U8VD46OlNldElwbCgmaGVhZGVyXyk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGludCBDPgorV0ltYWdlVmlld0M8VCwgQz46OldJbWFnZVZpZXdDKFdJbWFnZUM8VCwgQz4qIGltZywgaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCisgICAgICAgIDogV0ltYWdlQzxULCBDPigwKQoreworICAgIGhlYWRlcl8gPSAqKGltZy0+SXBsKCkpOworICAgIGhlYWRlcl8uaW1hZ2VEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oKCppbWcpKGMsIHIpKTsKKyAgICBoZWFkZXJfLndpZHRoID0gd2lkdGg7CisgICAgaGVhZGVyXy5oZWlnaHQgPSBoZWlnaHQ7CisgICAgV0ltYWdlQzxULCBDPjo6U2V0SXBsKCZoZWFkZXJfKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgaW50IEM+CitXSW1hZ2VWaWV3QzxULCBDPjo6V0ltYWdlVmlld0MoKSA6IFdJbWFnZUM8VCwgQz4oMCkgeworICAgIGN2SW5pdEltYWdlSGVhZGVyKCZoZWFkZXJfLCBjdlNpemUoMCwgMCksIFdJbWFnZTxUPjo6RGVwdGgoKSwgQyk7CisgICAgaGVhZGVyXy5pbWFnZURhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPigwKTsKKyAgICBXSW1hZ2VDPFQsIEM+OjpTZXRJcGwoJmhlYWRlcl8pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4KK1dJbWFnZVZpZXdDPFQsIEM+OjpXSW1hZ2VWaWV3QyhUKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB3aWR0aF9zdGVwKQorICAgIDogV0ltYWdlQzxULCBDPigwKQoreworICAgIGN2SW5pdEltYWdlSGVhZGVyKCZoZWFkZXJfLCBjdlNpemUod2lkdGgsIGhlaWdodCksIFdJbWFnZTxUPjo6RGVwdGgoKSwgQyk7CisgICAgaGVhZGVyXy5pbWFnZURhdGEgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkYXRhKTsKKyAgICBpZiAod2lkdGhfc3RlcCA+IDApIHsKKyAgICAgICAgaGVhZGVyXy53aWR0aFN0ZXAgPSB3aWR0aF9zdGVwOworICAgIH0KKyAgICBXSW1hZ2VDPFQsIEM+OjpTZXRJcGwoJmhlYWRlcl8pOworfQorCisvLyBDb25zdHJ1Y3QgYSB2aWV3IGludG8gYSByZWdpb24gb2YgYW4gaW1hZ2UKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitXSW1hZ2VWaWV3PFQ+IFdJbWFnZTxUPjo6VmlldyhpbnQgYywgaW50IHIsIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAgIHJldHVybiBXSW1hZ2VWaWV3PFQ+KHRoaXMsIGMsIHIsIHdpZHRoLCBoZWlnaHQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBpbnQgQz4KK1dJbWFnZVZpZXdDPFQsIEM+IFdJbWFnZUM8VCwgQz46OlZpZXcoaW50IGMsIGludCByLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKKyAgICByZXR1cm4gV0ltYWdlVmlld0M8VCwgQz4odGhpcywgYywgciwgd2lkdGgsIGhlaWdodCk7Cit9CisKK30gIC8vIGVuZCBvZiBuYW1lc3BhY2UKKworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAgLy8gX0NWX1dJTUFHRV9IXwpkaWZmIC0tZ2l0IGEvY3hjb3JlL2luY2x1ZGUvY3hjb3JlLmggYi9jeGNvcmUvaW5jbHVkZS9jeGNvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzljYmEzCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL2luY2x1ZGUvY3hjb3JlLmgKQEAgLTAsMCArMSwxNzgwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworCisjaWZuZGVmIF9DWENPUkVfSF8KKyNkZWZpbmUgX0NYQ09SRV9IXworCisjaWZkZWYgX19JUExfSF9fCisjZGVmaW5lIEhBVkVfSVBMCisjZW5kaWYKKworI2lmbmRlZiBTS0lQX0lOQ0xVREVTCisgICNpZiBkZWZpbmVkIEhBVkVfSVBMICYmICFkZWZpbmVkIF9fSVBMX0hfXworICAgICNpZm5kZWYgX0lOQ19XSU5ET1dTCisgICAgICAgICNkZWZpbmUgQ1ZfUFJFVEVORF9XSU5ET1dTCisgICAgICAgICNkZWZpbmUgX0lOQ19XSU5ET1dTCisgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0JJVE1BUElORk9IRUFERVIgQklUTUFQSU5GT0hFQURFUjsKKyAgICAgICAgdHlwZWRlZiBpbnQgQk9PTDsKKyAgICAjZW5kaWYKKyAgICAjaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0CisgICAgICAjaW5jbHVkZSAiaXBsLmgiCisgICAgI2Vsc2UKKyAgICAgICNpbmNsdWRlICJpcGwvaXBsLmgiCisgICAgI2VuZGlmCisgICAgI2lmZGVmIENWX1BSRVRFTkRfV0lORE9XUworICAgICAgICAjdW5kZWYgX0lOQ19XSU5ET1dTCisgICAgI2VuZGlmCisgICNlbmRpZgorI2VuZGlmIC8vIFNLSVBfSU5DTFVERVMKKworI2luY2x1ZGUgImN4dHlwZXMuaCIKKyNpbmNsdWRlICJjeGVycm9yLmgiCisjaW5jbHVkZSAiY3Z2ZXIuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgQXJyYXkgYWxsb2NhdGlvbiwgZGVhbGxvY2F0aW9uLCBpbml0aWFsaXphdGlvbiBhbmQgYWNjZXNzIHRvIGVsZW1lbnRzICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIDxtYWxsb2M+IHdyYXBwZXIuCisgICBJZiB0aGVyZSBpcyBubyBlbm91Z2ggbWVtb3J5LCB0aGUgZnVuY3Rpb24KKyAgIChhcyB3ZWxsIGFzIG90aGVyIE9wZW5DViBmdW5jdGlvbnMgdGhhdCBjYWxsIGN2QWxsb2MpCisgICByYWlzZXMgYW4gZXJyb3IuICovCitDVkFQSSh2b2lkKikgIGN2QWxsb2MoIHNpemVfdCBzaXplICk7CisKKy8qIDxmcmVlPiB3cmFwcGVyLgorICAgSGVyZSBhbmQgZnVydGhlciBhbGwgdGhlIG1lbW9yeSByZWxlYXNpbmcgZnVuY3Rpb25zCisgICAodGhhdCBhbGwgY2FsbCBjdkZyZWUpIHRha2UgZG91YmxlIHBvaW50ZXIgaW4gb3JkZXIgdG8KKyAgIHRvIGNsZWFyIHBvaW50ZXIgdG8gdGhlIGRhdGEgYWZ0ZXIgcmVsZWFzaW5nIGl0LgorICAgUGFzc2luZyBwb2ludGVyIHRvIE5VTEwgcG9pbnRlciBpcyBPazogbm90aGluZyBoYXBwZW5zIGluIHRoaXMgY2FzZQorKi8KK0NWQVBJKHZvaWQpICAgY3ZGcmVlXyggdm9pZCogcHRyICk7CisjZGVmaW5lIGN2RnJlZShwdHIpIChjdkZyZWVfKCoocHRyKSksICoocHRyKT0wKQorCisvKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIElwbEltYWdlIGhlYWRlciAqLworQ1ZBUEkoSXBsSW1hZ2UqKSAgY3ZDcmVhdGVJbWFnZUhlYWRlciggQ3ZTaXplIHNpemUsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICk7CisKKy8qIEluaWFsaXplcyBJcGxJbWFnZSBoZWFkZXIgKi8KK0NWQVBJKElwbEltYWdlKikgY3ZJbml0SW1hZ2VIZWFkZXIoIElwbEltYWdlKiBpbWFnZSwgQ3ZTaXplIHNpemUsIGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgb3JpZ2luIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGlnbiBDVl9ERUZBVUxUKDQpKTsKKworLyogQ3JlYXRlcyBJUEwgaW1hZ2UgKGhlYWRlciBhbmQgZGF0YSkgKi8KK0NWQVBJKElwbEltYWdlKikgIGN2Q3JlYXRlSW1hZ2UoIEN2U2l6ZSBzaXplLCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApOworCisvKiBSZWxlYXNlcyAoaS5lLiBkZWFsbG9jYXRlcykgSVBMIGltYWdlIGhlYWRlciAqLworQ1ZBUEkodm9pZCkgIGN2UmVsZWFzZUltYWdlSGVhZGVyKCBJcGxJbWFnZSoqIGltYWdlICk7CisKKy8qIFJlbGVhc2VzIElQTCBpbWFnZSBoZWFkZXIgYW5kIGRhdGEgKi8KK0NWQVBJKHZvaWQpICBjdlJlbGVhc2VJbWFnZSggSXBsSW1hZ2UqKiBpbWFnZSApOworCisvKiBDcmVhdGVzIGEgY29weSBvZiBJUEwgaW1hZ2UgKHdpZHRoU3RlcCBtYXkgZGlmZmVyKSAqLworQ1ZBUEkoSXBsSW1hZ2UqKSBjdkNsb25lSW1hZ2UoIGNvbnN0IElwbEltYWdlKiBpbWFnZSApOworCisvKiBTZXRzIGEgQ2hhbm5lbCBPZiBJbnRlcmVzdCAob25seSBhIGZldyBmdW5jdGlvbnMgc3VwcG9ydCBDT0kpIC0KKyAgIHVzZSBjdkNvcHkgdG8gZXh0cmFjdCB0aGUgc2VsZWN0ZWQgY2hhbm5lbCBhbmQvb3IgcHV0IGl0IGJhY2sgKi8KK0NWQVBJKHZvaWQpICBjdlNldEltYWdlQ09JKCBJcGxJbWFnZSogaW1hZ2UsIGludCBjb2kgKTsKKworLyogUmV0cmlldmVzIGltYWdlIENoYW5uZWwgT2YgSW50ZXJlc3QgKi8KK0NWQVBJKGludCkgIGN2R2V0SW1hZ2VDT0koIGNvbnN0IElwbEltYWdlKiBpbWFnZSApOworCisvKiBTZXRzIGltYWdlIFJPSSAocmVnaW9uIG9mIGludGVyZXN0KSAoQ09JIGlzIG5vdCBjaGFuZ2VkKSAqLworQ1ZBUEkodm9pZCkgIGN2U2V0SW1hZ2VST0koIElwbEltYWdlKiBpbWFnZSwgQ3ZSZWN0IHJlY3QgKTsKKworLyogUmVzZXRzIGltYWdlIFJPSSBhbmQgQ09JICovCitDVkFQSSh2b2lkKSAgY3ZSZXNldEltYWdlUk9JKCBJcGxJbWFnZSogaW1hZ2UgKTsKKworLyogUmV0cmlldmVzIGltYWdlIFJPSSAqLworQ1ZBUEkoQ3ZSZWN0KSBjdkdldEltYWdlUk9JKCBjb25zdCBJcGxJbWFnZSogaW1hZ2UgKTsKKworLyogQWxsb2NhdGVzIGFuZCBpbml0YWxpemVzIEN2TWF0IGhlYWRlciAqLworQ1ZBUEkoQ3ZNYXQqKSAgY3ZDcmVhdGVNYXRIZWFkZXIoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUgKTsKKworI2RlZmluZSBDVl9BVVRPU1RFUCAgMHg3ZmZmZmZmZgorCisvKiBJbml0aWFsaXplcyBDdk1hdCBoZWFkZXIgKi8KK0NWQVBJKEN2TWF0KikgY3ZJbml0TWF0SGVhZGVyKCBDdk1hdCogbWF0LCBpbnQgcm93cywgaW50IGNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgdm9pZCogZGF0YSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAgQ1ZfREVGQVVMVChDVl9BVVRPU1RFUCkgKTsKKworLyogQWxsb2NhdGVzIGFuZCBpbml0aWFsaXplcyBDdk1hdCBoZWFkZXIgYW5kIGFsbG9jYXRlcyBkYXRhICovCitDVkFQSShDdk1hdCopICBjdkNyZWF0ZU1hdCggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSApOworCisvKiBSZWxlYXNlcyBDdk1hdCBoZWFkZXIgYW5kIGRlYWxsb2NhdGVzIG1hdHJpeCBkYXRhCisgICAocmVmZXJlbmNlIGNvdW50aW5nIGlzIHVzZWQgZm9yIGRhdGEpICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlTWF0KCBDdk1hdCoqIG1hdCApOworCisvKiBEZWNyZW1lbnRzIEN2TWF0IGRhdGEgcmVmZXJlbmNlIGNvdW50ZXIgYW5kIGRlYWxsb2NhdGVzIHRoZSBkYXRhIGlmCisgICBpdCByZWFjaGVzIDAgKi8KK0NWX0lOTElORSAgdm9pZCAgY3ZEZWNSZWZEYXRhKCBDdkFyciogYXJyICkKK3sKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICAgICAgbWF0LT5kYXRhLnB0ciA9IE5VTEw7CisgICAgICAgIGlmKCBtYXQtPnJlZmNvdW50ICE9IE5VTEwgJiYgLS0qbWF0LT5yZWZjb3VudCA9PSAwICkKKyAgICAgICAgICAgIGN2RnJlZSggJm1hdC0+cmVmY291bnQgKTsKKyAgICAgICAgbWF0LT5yZWZjb3VudCA9IE5VTEw7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX01BVE5EKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgIG1hdC0+ZGF0YS5wdHIgPSBOVUxMOworICAgICAgICBpZiggbWF0LT5yZWZjb3VudCAhPSBOVUxMICYmIC0tKm1hdC0+cmVmY291bnQgPT0gMCApCisgICAgICAgICAgICBjdkZyZWUoICZtYXQtPnJlZmNvdW50ICk7CisgICAgICAgIG1hdC0+cmVmY291bnQgPSBOVUxMOworICAgIH0KK30KKworLyogSW5jcmVtZW50cyBDdk1hdCBkYXRhIHJlZmVyZW5jZSBjb3VudGVyICovCitDVl9JTkxJTkUgIGludCAgY3ZJbmNSZWZEYXRhKCBDdkFyciogYXJyICkKK3sKKyAgICBpbnQgcmVmY291bnQgPSAwOworICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworICAgICAgICBpZiggbWF0LT5yZWZjb3VudCAhPSBOVUxMICkKKyAgICAgICAgICAgIHJlZmNvdW50ID0gKysqbWF0LT5yZWZjb3VudDsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXRORCogbWF0ID0gKEN2TWF0TkQqKWFycjsKKyAgICAgICAgaWYoIG1hdC0+cmVmY291bnQgIT0gTlVMTCApCisgICAgICAgICAgICByZWZjb3VudCA9ICsrKm1hdC0+cmVmY291bnQ7CisgICAgfQorICAgIHJldHVybiByZWZjb3VudDsKK30KKworCisvKiBDcmVhdGVzIGFuIGV4YWN0IGNvcHkgb2YgdGhlIGlucHV0IG1hdHJpeCAoZXhjZXB0LCBtYXkgYmUsIHN0ZXAgdmFsdWUpICovCitDVkFQSShDdk1hdCopIGN2Q2xvbmVNYXQoIGNvbnN0IEN2TWF0KiBtYXQgKTsKKworCisvKiBNYWtlcyBhIG5ldyBtYXRyaXggZnJvbSA8cmVjdD4gc3VicmVjdGFuZ2xlIG9mIGlucHV0IGFycmF5LgorICAgTm8gZGF0YSBpcyBjb3BpZWQgKi8KK0NWQVBJKEN2TWF0KikgY3ZHZXRTdWJSZWN0KCBjb25zdCBDdkFyciogYXJyLCBDdk1hdCogc3VibWF0LCBDdlJlY3QgcmVjdCApOworI2RlZmluZSBjdkdldFN1YkFyciBjdkdldFN1YlJlY3QKKworLyogU2VsZWN0cyByb3cgc3BhbiBvZiB0aGUgaW5wdXQgYXJyYXk6IGFycihzdGFydF9yb3c6ZGVsdGFfcm93OmVuZF9yb3csOikKKyAgICAoZW5kX3JvdyBpcyBub3QgaW5jbHVkZWQgaW50byB0aGUgc3BhbikuICovCitDVkFQSShDdk1hdCopIGN2R2V0Um93cyggY29uc3QgQ3ZBcnIqIGFyciwgQ3ZNYXQqIHN1Ym1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9yb3csIGludCBlbmRfcm93LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhX3JvdyBDVl9ERUZBVUxUKDEpKTsKKworQ1ZfSU5MSU5FICBDdk1hdCogIGN2R2V0Um93KCBjb25zdCBDdkFyciogYXJyLCBDdk1hdCogc3VibWF0LCBpbnQgcm93ICkKK3sKKyAgICByZXR1cm4gY3ZHZXRSb3dzKCBhcnIsIHN1Ym1hdCwgcm93LCByb3cgKyAxLCAxICk7Cit9CisKKworLyogU2VsZWN0cyBjb2x1bW4gc3BhbiBvZiB0aGUgaW5wdXQgYXJyYXk6IGFycig6LHN0YXJ0X2NvbDplbmRfY29sKQorICAgKGVuZF9jb2wgaXMgbm90IGluY2x1ZGVkIGludG8gdGhlIHNwYW4pICovCitDVkFQSShDdk1hdCopIGN2R2V0Q29scyggY29uc3QgQ3ZBcnIqIGFyciwgQ3ZNYXQqIHN1Ym1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydF9jb2wsIGludCBlbmRfY29sICk7CisKK0NWX0lOTElORSAgQ3ZNYXQqICBjdkdldENvbCggY29uc3QgQ3ZBcnIqIGFyciwgQ3ZNYXQqIHN1Ym1hdCwgaW50IGNvbCApCit7CisgICAgcmV0dXJuIGN2R2V0Q29scyggYXJyLCBzdWJtYXQsIGNvbCwgY29sICsgMSApOworfQorCisvKiBTZWxlY3QgYSBkaWFnb25hbCBvZiB0aGUgaW5wdXQgYXJyYXkuCisgICAoZGlhZyA9IDAgbWVhbnMgdGhlIG1haW4gZGlhZ29uYWwsID4wIG1lYW5zIGEgZGlhZ29uYWwgYWJvdmUgdGhlIG1haW4gb25lLAorICAgPDAgLSBiZWxvdyB0aGUgbWFpbiBvbmUpLgorICAgVGhlIGRpYWdvbmFsIHdpbGwgYmUgcmVwcmVzZW50ZWQgYXMgYSBjb2x1bW4gKG54MSBtYXRyaXgpLiAqLworQ1ZBUEkoQ3ZNYXQqKSBjdkdldERpYWcoIGNvbnN0IEN2QXJyKiBhcnIsIEN2TWF0KiBzdWJtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRpYWcgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIGxvdy1sZXZlbCBzY2FsYXIgPC0+IHJhdyBkYXRhIGNvbnZlcnNpb24gZnVuY3Rpb25zICovCitDVkFQSSh2b2lkKSBjdlNjYWxhclRvUmF3RGF0YSggY29uc3QgQ3ZTY2FsYXIqIHNjYWxhciwgdm9pZCogZGF0YSwgaW50IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0ZW5kX3RvXzEyIENWX0RFRkFVTFQoMCkgKTsKKworQ1ZBUEkodm9pZCkgY3ZSYXdEYXRhVG9TY2FsYXIoIGNvbnN0IHZvaWQqIGRhdGEsIGludCB0eXBlLCBDdlNjYWxhciogc2NhbGFyICk7CisKKy8qIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgQ3ZNYXRORCBoZWFkZXIgKi8KK0NWQVBJKEN2TWF0TkQqKSAgY3ZDcmVhdGVNYXROREhlYWRlciggaW50IGRpbXMsIGNvbnN0IGludCogc2l6ZXMsIGludCB0eXBlICk7CisKKy8qIEFsbG9jYXRlcyBhbmQgaW5pdGlhbGl6ZXMgQ3ZNYXRORCBoZWFkZXIgYW5kIGFsbG9jYXRlcyBkYXRhICovCitDVkFQSShDdk1hdE5EKikgIGN2Q3JlYXRlTWF0TkQoIGludCBkaW1zLCBjb25zdCBpbnQqIHNpemVzLCBpbnQgdHlwZSApOworCisvKiBJbml0aWFsaXplcyBwcmVhbGxvY2F0ZWQgQ3ZNYXRORCBoZWFkZXIgKi8KK0NWQVBJKEN2TWF0TkQqKSAgY3ZJbml0TWF0TkRIZWFkZXIoIEN2TWF0TkQqIG1hdCwgaW50IGRpbXMsIGNvbnN0IGludCogc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgdm9pZCogZGF0YSBDVl9ERUZBVUxUKE5VTEwpICk7CisKKy8qIFJlbGVhc2VzIEN2TWF0TkQgKi8KK0NWX0lOTElORSAgdm9pZCAgY3ZSZWxlYXNlTWF0TkQoIEN2TWF0TkQqKiBtYXQgKQoreworICAgIGN2UmVsZWFzZU1hdCggKEN2TWF0KiopbWF0ICk7Cit9CisKKy8qIENyZWF0ZXMgYSBjb3B5IG9mIEN2TWF0TkQgKGV4Y2VwdCwgbWF5IGJlLCBzdGVwcykgKi8KK0NWQVBJKEN2TWF0TkQqKSBjdkNsb25lTWF0TkQoIGNvbnN0IEN2TWF0TkQqIG1hdCApOworCisvKiBBbGxvY2F0ZXMgYW5kIGluaXRpYWxpemVzIEN2U3BhcnNlTWF0IGhlYWRlciBhbmQgYWxsb2NhdGVzIGRhdGEgKi8KK0NWQVBJKEN2U3BhcnNlTWF0KikgIGN2Q3JlYXRlU3BhcnNlTWF0KCBpbnQgZGltcywgY29uc3QgaW50KiBzaXplcywgaW50IHR5cGUgKTsKKworLyogUmVsZWFzZXMgQ3ZTcGFyc2VNYXQgKi8KK0NWQVBJKHZvaWQpICBjdlJlbGVhc2VTcGFyc2VNYXQoIEN2U3BhcnNlTWF0KiogbWF0ICk7CisKKy8qIENyZWF0ZXMgYSBjb3B5IG9mIEN2U3BhcnNlTWF0IChleGNlcHQsIG1heSBiZSwgemVybyBpdGVtcykgKi8KK0NWQVBJKEN2U3BhcnNlTWF0KikgY3ZDbG9uZVNwYXJzZU1hdCggY29uc3QgQ3ZTcGFyc2VNYXQqIG1hdCApOworCisvKiBJbml0aWFsaXplcyBzcGFyc2UgYXJyYXkgaXRlcmF0b3IKKyAgIChyZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9yIE5VTEwgaWYgdGhlIGFycmF5IGlzIGVtcHR5KSAqLworQ1ZBUEkoQ3ZTcGFyc2VOb2RlKikgY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIGNvbnN0IEN2U3BhcnNlTWF0KiBtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTcGFyc2VNYXRJdGVyYXRvciogbWF0X2l0ZXJhdG9yICk7CisKKy8vIHJldHVybnMgbmV4dCBzcGFyc2UgYXJyYXkgbm9kZSAob3IgTlVMTCBpZiB0aGVyZSBpcyBubyBtb3JlIG5vZGVzKQorQ1ZfSU5MSU5FIEN2U3BhcnNlTm9kZSogY3ZHZXROZXh0U3BhcnNlTm9kZSggQ3ZTcGFyc2VNYXRJdGVyYXRvciogbWF0X2l0ZXJhdG9yICkKK3sKKyAgICBpZiggbWF0X2l0ZXJhdG9yLT5ub2RlLT5uZXh0ICkKKyAgICAgICAgcmV0dXJuIG1hdF9pdGVyYXRvci0+bm9kZSA9IG1hdF9pdGVyYXRvci0+bm9kZS0+bmV4dDsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWR4OworICAgICAgICBmb3IoIGlkeCA9ICsrbWF0X2l0ZXJhdG9yLT5jdXJpZHg7IGlkeCA8IG1hdF9pdGVyYXRvci0+bWF0LT5oYXNoc2l6ZTsgaWR4KysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlNwYXJzZU5vZGUqIG5vZGUgPSAoQ3ZTcGFyc2VOb2RlKiltYXRfaXRlcmF0b3ItPm1hdC0+aGFzaHRhYmxlW2lkeF07CisgICAgICAgICAgICBpZiggbm9kZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWF0X2l0ZXJhdG9yLT5jdXJpZHggPSBpZHg7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hdF9pdGVyYXRvci0+bm9kZSA9IG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCisvKioqKioqKioqKioqKioqKiBtYXRyaXggaXRlcmF0b3I6IHVzZWQgZm9yIG4tYXJ5IG9wZXJhdGlvbnMgb24gZGVuc2UgYXJyYXlzICoqKioqKioqKi8KKworI2RlZmluZSBDVl9NQVhfQVJSIDEwCisKK3R5cGVkZWYgc3RydWN0IEN2TkFycmF5SXRlcmF0b3IKK3sKKyAgICBpbnQgY291bnQ7IC8qIG51bWJlciBvZiBhcnJheXMgKi8KKyAgICBpbnQgZGltczsgLyogbnVtYmVyIG9mIGRpbWVuc2lvbnMgdG8gaXRlcmF0ZSAqLworICAgIEN2U2l6ZSBzaXplOyAvKiBtYXhpbWFsIGNvbW1vbiBsaW5lYXIgc2l6ZTogeyB3aWR0aCA9IHNpemUsIGhlaWdodCA9IDEgfSAqLworICAgIHVjaGFyKiBwdHJbQ1ZfTUFYX0FSUl07IC8qIHBvaW50ZXJzIHRvIHRoZSBhcnJheSBzbGljZXMgKi8KKyAgICBpbnQgc3RhY2tbQ1ZfTUFYX0RJTV07IC8qIGZvciBpbnRlcm5hbCB1c2UgKi8KKyAgICBDdk1hdE5EKiBoZHJbQ1ZfTUFYX0FSUl07IC8qIHBvaW50ZXJzIHRvIHRoZSBoZWFkZXJzIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0cmljZXMgdGhhdCBhcmUgcHJvY2Vzc2VkICovCit9CitDdk5BcnJheUl0ZXJhdG9yOworCisjZGVmaW5lIENWX05PX0RFUFRIX0NIRUNLICAgICAxCisjZGVmaW5lIENWX05PX0NOX0NIRUNLICAgICAgICAyCisjZGVmaW5lIENWX05PX1NJWkVfQ0hFQ0sgICAgICA0CisKKy8qIGluaXRpYWxpemVzIGl0ZXJhdG9yIHRoYXQgdHJhdmVyc2VzIHRocm91Z2ggc2V2ZXJhbCBhcnJheXMgc2ltdWx0ZW5lb3VzbHkKKyAgICh0aGUgZnVuY3Rpb24gdG9nZXRoZXIgd2l0aCBjdk5leHRBcnJheVNsaWNlIGlzIHVzZWQgZm9yCisgICAgTi1hcmkgZWxlbWVudC13aXNlIG9wZXJhdGlvbnMpICovCitDVkFQSShpbnQpIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCBpbnQgY291bnQsIEN2QXJyKiogYXJycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrLCBDdk1hdE5EKiBzdHVicywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TkFycmF5SXRlcmF0b3IqIGFycmF5X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzIENWX0RFRkFVTFQoMCkgKTsKKworLyogcmV0dXJucyB6ZXJvIHZhbHVlIGlmIGl0ZXJhdGlvbiBpcyBmaW5pc2hlZCwgbm9uLXplcm8gKHNsaWNlIGxlbmd0aCkgb3RoZXJ3aXNlICovCitDVkFQSShpbnQpIGN2TmV4dE5BcnJheVNsaWNlKCBDdk5BcnJheUl0ZXJhdG9yKiBhcnJheV9pdGVyYXRvciApOworCisKKy8qIFJldHVybnMgdHlwZSBvZiBhcnJheSBlbGVtZW50czoKKyAgIENWXzhVQzEgLi4uIENWXzY0RkM0IC4uLiAqLworQ1ZBUEkoaW50KSBjdkdldEVsZW1UeXBlKCBjb25zdCBDdkFyciogYXJyICk7CisKKy8qIFJldHJpZXZlcyBudW1iZXIgb2YgYW4gYXJyYXkgZGltZW5zaW9ucyBhbmQKKyAgIG9wdGlvbmFsbHkgc2l6ZXMgb2YgdGhlIGRpbWVuc2lvbnMgKi8KK0NWQVBJKGludCkgY3ZHZXREaW1zKCBjb25zdCBDdkFyciogYXJyLCBpbnQqIHNpemVzIENWX0RFRkFVTFQoTlVMTCkgKTsKKworCisvKiBSZXRyaWV2ZXMgc2l6ZSBvZiBhIHBhcnRpY3VsYXIgYXJyYXkgZGltZW5zaW9uLgorICAgRm9yIDJkIGFycmF5cyBjdkdldERpbVNpemUoYXJyLDApIHJldHVybnMgbnVtYmVyIG9mIHJvd3MgKGltYWdlIGhlaWdodCkKKyAgIGFuZCBjdkdldERpbVNpemUoYXJyLDEpIHJldHVybnMgbnVtYmVyIG9mIGNvbHVtbnMgKGltYWdlIHdpZHRoKSAqLworQ1ZBUEkoaW50KSBjdkdldERpbVNpemUoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpbmRleCApOworCisKKy8qIHB0ciA9ICZhcnIoaWR4MCxpZHgxLC4uLikuIEFsbCBpbmRleGVzIGFyZSB6ZXJvLWJhc2VkLAorICAgdGhlIG1ham9yIGRpbWVuc2lvbnMgZ28gZmlyc3QgKGUuZy4gKHkseCkgZm9yIDJELCAoeix5LHgpIGZvciAzRCAqLworQ1ZBUEkodWNoYXIqKSBjdlB0cjFEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4MCwgaW50KiB0eXBlIENWX0RFRkFVTFQoTlVMTCkpOworQ1ZBUEkodWNoYXIqKSBjdlB0cjJEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4MCwgaW50IGlkeDEsIGludCogdHlwZSBDVl9ERUZBVUxUKE5VTEwpICk7CitDVkFQSSh1Y2hhciopIGN2UHRyM0QoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpZHgwLCBpbnQgaWR4MSwgaW50IGlkeDIsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiB0eXBlIENWX0RFRkFVTFQoTlVMTCkpOworCisvKiBGb3IgQ3ZNYXQgb3IgSXBsSW1hZ2UgbnVtYmVyIG9mIGluZGljZXMgc2hvdWxkIGJlIDIKKyAgIChyb3cgaW5kZXggKHkpIGdvZXMgZmlyc3QsIGNvbHVtbiBpbmRleCAoeCkgZ29lcyBuZXh0KS4KKyAgIEZvciBDdk1hdE5EIG9yIEN2U3BhcnNlTWF0IG51bWJlciBvZiBpbmZpY2VzIHNob3VsZCBtYXRjaCBudW1iZXIgb2YgPGRpbXM+IGFuZAorICAgaW5kaWNlcyBvcmRlciBzaG91bGQgbWF0Y2ggdGhlIGFycmF5IGRpbWVuc2lvbiBvcmRlci4gKi8KK0NWQVBJKHVjaGFyKikgY3ZQdHJORCggY29uc3QgQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHgsIGludCogdHlwZSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgIGludCBjcmVhdGVfbm9kZSBDVl9ERUZBVUxUKDEpLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKiBwcmVjYWxjX2hhc2h2YWwgQ1ZfREVGQVVMVChOVUxMKSk7CisKKy8qIHZhbHVlID0gYXJyKGlkeDAsaWR4MSwuLi4pICovCitDVkFQSShDdlNjYWxhcikgY3ZHZXQxRCggY29uc3QgQ3ZBcnIqIGFyciwgaW50IGlkeDAgKTsKK0NWQVBJKEN2U2NhbGFyKSBjdkdldDJEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4MCwgaW50IGlkeDEgKTsKK0NWQVBJKEN2U2NhbGFyKSBjdkdldDNEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4MCwgaW50IGlkeDEsIGludCBpZHgyICk7CitDVkFQSShDdlNjYWxhcikgY3ZHZXRORCggY29uc3QgQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHggKTsKKworLyogZm9yIDEtY2hhbm5lbCBhcnJheXMgKi8KK0NWQVBJKGRvdWJsZSkgY3ZHZXRSZWFsMUQoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpZHgwICk7CitDVkFQSShkb3VibGUpIGN2R2V0UmVhbDJEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4MCwgaW50IGlkeDEgKTsKK0NWQVBJKGRvdWJsZSkgY3ZHZXRSZWFsM0QoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpZHgwLCBpbnQgaWR4MSwgaW50IGlkeDIgKTsKK0NWQVBJKGRvdWJsZSkgY3ZHZXRSZWFsTkQoIGNvbnN0IEN2QXJyKiBhcnIsIGNvbnN0IGludCogaWR4ICk7CisKKy8qIGFycihpZHgwLGlkeDEsLi4uKSA9IHZhbHVlICovCitDVkFQSSh2b2lkKSBjdlNldDFEKCBDdkFyciogYXJyLCBpbnQgaWR4MCwgQ3ZTY2FsYXIgdmFsdWUgKTsKK0NWQVBJKHZvaWQpIGN2U2V0MkQoIEN2QXJyKiBhcnIsIGludCBpZHgwLCBpbnQgaWR4MSwgQ3ZTY2FsYXIgdmFsdWUgKTsKK0NWQVBJKHZvaWQpIGN2U2V0M0QoIEN2QXJyKiBhcnIsIGludCBpZHgwLCBpbnQgaWR4MSwgaW50IGlkeDIsIEN2U2NhbGFyIHZhbHVlICk7CitDVkFQSSh2b2lkKSBjdlNldE5EKCBDdkFyciogYXJyLCBjb25zdCBpbnQqIGlkeCwgQ3ZTY2FsYXIgdmFsdWUgKTsKKworLyogZm9yIDEtY2hhbm5lbCBhcnJheXMgKi8KK0NWQVBJKHZvaWQpIGN2U2V0UmVhbDFEKCBDdkFyciogYXJyLCBpbnQgaWR4MCwgZG91YmxlIHZhbHVlICk7CitDVkFQSSh2b2lkKSBjdlNldFJlYWwyRCggQ3ZBcnIqIGFyciwgaW50IGlkeDAsIGludCBpZHgxLCBkb3VibGUgdmFsdWUgKTsKK0NWQVBJKHZvaWQpIGN2U2V0UmVhbDNEKCBDdkFyciogYXJyLCBpbnQgaWR4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZHgxLCBpbnQgaWR4MiwgZG91YmxlIHZhbHVlICk7CitDVkFQSSh2b2lkKSBjdlNldFJlYWxORCggQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHgsIGRvdWJsZSB2YWx1ZSApOworCisvKiBjbGVhcnMgZWxlbWVudCBvZiBORCBkZW5zZSBhcnJheSwKKyAgIGluIGNhc2Ugb2Ygc3BhcnNlIGFycmF5cyBpdCBkZWxldGVzIHRoZSBzcGVjaWZpZWQgbm9kZSAqLworQ1ZBUEkodm9pZCkgY3ZDbGVhck5EKCBDdkFyciogYXJyLCBjb25zdCBpbnQqIGlkeCApOworCisvKiBDb252ZXJ0cyBDdkFyciAoSXBsSW1hZ2Ugb3IgQ3ZNYXQsLi4uKSB0byBDdk1hdC4KKyAgIElmIHRoZSBsYXN0IHBhcmFtZXRlciBpcyBub24temVybywgZnVuY3Rpb24gY2FuCisgICBjb252ZXJ0IG11bHRpKD4yKS1kaW1lbnNpb25hbCBhcnJheSB0byBDdk1hdCBhcyBsb25nIGFzCisgICB0aGUgbGFzdCBhcnJheSdzIGRpbWVuc2lvbiBpcyBjb250aW5vdXMuIFRoZSByZXN1bHRhbnQKKyAgIG1hdHJpeCB3aWxsIGJlIGhhdmUgYXBwcm9wcmlhdGUgKGEgaHVnZSkgbnVtYmVyIG9mIHJvd3MgKi8KK0NWQVBJKEN2TWF0KikgY3ZHZXRNYXQoIGNvbnN0IEN2QXJyKiBhcnIsIEN2TWF0KiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogY29pIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgIGludCBhbGxvd05EIENWX0RFRkFVTFQoMCkpOworCisvKiBDb252ZXJ0cyBDdkFyciAoSXBsSW1hZ2Ugb3IgQ3ZNYXQpIHRvIElwbEltYWdlICovCitDVkFQSShJcGxJbWFnZSopIGN2R2V0SW1hZ2UoIGNvbnN0IEN2QXJyKiBhcnIsIElwbEltYWdlKiBpbWFnZV9oZWFkZXIgKTsKKworCisvKiBDaGFuZ2VzIGEgc2hhcGUgb2YgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkuCisgICBuZXdfY24gPT0gMCBtZWFucyB0aGF0IG51bWJlciBvZiBjaGFubmVscyByZW1haW5zIHVuY2hhbmdlZC4KKyAgIG5ld19kaW1zID09IDAgbWVhbnMgdGhhdCBudW1iZXIgYW5kIHNpemVzIG9mIGRpbWVuc2lvbnMgcmVtYWluIHRoZSBzYW1lCisgICAodW5sZXNzIHRoZXkgbmVlZCB0byBiZSBjaGFuZ2VkIHRvIHNldCB0aGUgbmV3IG51bWJlciBvZiBjaGFubmVscykKKyAgIGlmIG5ld19kaW1zID09IDEsIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3BlY2lmeSBuZXcgZGltZW5zaW9uIHNpemVzCisgICBUaGUgcmVzdWx0YW50IGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIGFjaGlldmFibGUgdy9vIGRhdGEgY29weWluZy4KKyAgIElmIHRoZSByZXN1bHRhbnQgYXJyYXkgaXMgc3BhcnNlLCBDdlNwYXJzZU1hdCBoZWFkZXIgc2hvdWxkIGJlIHBhc3NlZAorICAgdG8gdGhlIGZ1bmN0aW9uIGVsc2UgaWYgdGhlIHJlc3VsdCBpcyAxIG9yIDIgZGltZW5zaW9uYWwsCisgICBDdk1hdCBoZWFkZXIgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb24KKyAgIGVsc2UgQ3ZNYXRORCBoZWFkZXIgc2hvdWxkIGJlIHBhc3NlZCAqLworQ1ZBUEkoQ3ZBcnIqKSBjdlJlc2hhcGVNYXRORCggY29uc3QgQ3ZBcnIqIGFyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemVvZl9oZWFkZXIsIEN2QXJyKiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdfY24sIGludCBuZXdfZGltcywgaW50KiBuZXdfc2l6ZXMgKTsKKworI2RlZmluZSBjdlJlc2hhcGVORCggYXJyLCBoZWFkZXIsIG5ld19jbiwgbmV3X2RpbXMsIG5ld19zaXplcyApICAgXAorICAgICAgY3ZSZXNoYXBlTWF0TkQoIChhcnIpLCBzaXplb2YoKihoZWFkZXIpKSwgKGhlYWRlciksICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIChuZXdfY24pLCAobmV3X2RpbXMpLCAobmV3X3NpemVzKSkKKworQ1ZBUEkoQ3ZNYXQqKSBjdlJlc2hhcGUoIGNvbnN0IEN2QXJyKiBhcnIsIEN2TWF0KiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2NuLCBpbnQgbmV3X3Jvd3MgQ1ZfREVGQVVMVCgwKSApOworCisvKiBSZXBlYXRzIHNvdXJjZSAyZCBhcnJheSBzZXZlcmFsIHRpbWVzIGluIGJvdGggaG9yaXpvbnRhbCBhbmQKKyAgIHZlcnRpY2FsIGRpcmVjdGlvbiB0byBmaWxsIGRlc3RpbmF0aW9uIGFycmF5ICovCitDVkFQSSh2b2lkKSBjdlJlcGVhdCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCApOworCisvKiBBbGxvY2F0ZXMgYXJyYXkgZGF0YSAqLworQ1ZBUEkodm9pZCkgIGN2Q3JlYXRlRGF0YSggQ3ZBcnIqIGFyciApOworCisvKiBSZWxlYXNlcyBhcnJheSBkYXRhICovCitDVkFQSSh2b2lkKSAgY3ZSZWxlYXNlRGF0YSggQ3ZBcnIqIGFyciApOworCisvKiBBdHRhY2hlcyB1c2VyIGRhdGEgdG8gdGhlIGFycmF5IGhlYWRlci4gVGhlIHN0ZXAgaXMgcmVmZmVyZWQgdG8KKyAgIHRoZSBwcmUtbGFzdCBkaW1lbnNpb24uIFRoYXQgaXMsIGFsbCB0aGUgcGxhbmVzIG9mIHRoZSBhcnJheQorICAgbXVzdCBiZSBqb2ludCAody9vIGdhcHMpICovCitDVkFQSSh2b2lkKSAgY3ZTZXREYXRhKCBDdkFyciogYXJyLCB2b2lkKiBkYXRhLCBpbnQgc3RlcCApOworCisvKiBSZXRyaWV2ZXMgcmF3IGRhdGEgb2YgQ3ZNYXQsIElwbEltYWdlIG9yIEN2TWF0TkQuCisgICBJbiB0aGUgbGF0dGVyIGNhc2UgdGhlIGZ1bmN0aW9uIHJhaXNlcyBhbiBlcnJvciBpZgorICAgdGhlIGFycmF5IGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgYXMgYSBtYXRyaXggKi8KK0NWQVBJKHZvaWQpIGN2R2V0UmF3RGF0YSggY29uc3QgQ3ZBcnIqIGFyciwgdWNoYXIqKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc3RlcCBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSogcm9pX3NpemUgQ1ZfREVGQVVMVChOVUxMKSk7CisKKy8qIFJldHVybnMgd2lkdGggYW5kIGhlaWdodCBvZiBhcnJheSBpbiBlbGVtZW50cyAqLworQ1ZBUEkoQ3ZTaXplKSBjdkdldFNpemUoIGNvbnN0IEN2QXJyKiBhcnIgKTsKKworLyogQ29waWVzIHNvdXJjZSBhcnJheSB0byBkZXN0aW5hdGlvbiBhcnJheSAqLworQ1ZBUEkodm9pZCkgIGN2Q29weSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogU2V0cyBhbGwgb3IgIm1hc2tlZCIgZWxlbWVudHMgb2YgaW5wdXQgYXJyYXkKKyAgIHRvIHRoZSBzYW1lIHZhbHVlKi8KK0NWQVBJKHZvaWQpICBjdlNldCggQ3ZBcnIqIGFyciwgQ3ZTY2FsYXIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogQ2xlYXJzIGFsbCB0aGUgYXJyYXkgZWxlbWVudHMgKHNldHMgdGhlbSB0byAwKSAqLworQ1ZBUEkodm9pZCkgIGN2U2V0WmVybyggQ3ZBcnIqIGFyciApOworI2RlZmluZSBjdlplcm8gIGN2U2V0WmVybworCisKKy8qIFNwbGl0cyBhIG11bHRpLWNoYW5uZWwgYXJyYXkgaW50byB0aGUgc2V0IG9mIHNpbmdsZS1jaGFubmVsIGFycmF5cyBvcgorICAgZXh0cmFjdHMgcGFydGljdWxhciBbY29sb3JdIHBsYW5lICovCitDVkFQSSh2b2lkKSAgY3ZTcGxpdCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdDAsIEN2QXJyKiBkc3QxLAorICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBkc3QyLCBDdkFyciogZHN0MyApOworCisvKiBNZXJnZXMgYSBzZXQgb2Ygc2luZ2xlLWNoYW5uZWwgYXJyYXlzIGludG8gdGhlIHNpbmdsZSBtdWx0aS1jaGFubmVsIGFycmF5CisgICBvciBpbnNlcnRzIG9uZSBwYXJ0aWN1bGFyIFtjb2xvcl0gcGxhbmUgdG8gdGhlIGFycmF5ICovCitDVkFQSSh2b2lkKSAgY3ZNZXJnZSggY29uc3QgQ3ZBcnIqIHNyYzAsIGNvbnN0IEN2QXJyKiBzcmMxLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzcmMyLCBjb25zdCBDdkFyciogc3JjMywKKyAgICAgICAgICAgICAgICAgICAgICBDdkFyciogZHN0ICk7CisKKy8qIENvcGllcyBzZXZlcmFsIGNoYW5uZWxzIGZyb20gaW5wdXQgYXJyYXlzIHRvCisgICBjZXJ0YWluIGNoYW5uZWxzIG9mIG91dHB1dCBhcnJheXMgKi8KK0NWQVBJKHZvaWQpICBjdk1peENoYW5uZWxzKCBjb25zdCBDdkFycioqIHNyYywgaW50IHNyY19jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFycioqIGRzdCwgaW50IGRzdF9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGZyb21fdG8sIGludCBwYWlyX2NvdW50ICk7CisKKy8qIFBlcmZvcm1zIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBvbiBldmVyeSBzb3VyY2UgYXJyYXkgZWxlbWVudDoKKyAgIGRzdCh4LHksYykgPSBzY2FsZSpzcmMoeCx5LGMpK3NoaWZ0LgorICAgQXJiaXRyYXJ5IGNvbWJpbmF0aW9uIG9mIGlucHV0IGFuZCBvdXRwdXQgYXJyYXkgZGVwdGhzIGFyZSBhbGxvd2VkCisgICAobnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgYmUgdGhlIHNhbWUpLCB0aHVzIHRoZSBmdW5jdGlvbiBjYW4gYmUgdXNlZAorICAgZm9yIHR5cGUgY29udmVyc2lvbiAqLworQ1ZBUEkodm9pZCkgIGN2Q29udmVydFNjYWxlKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUgQ1ZfREVGQVVMVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNoaWZ0IENWX0RFRkFVTFQoMCkgKTsKKyNkZWZpbmUgY3ZDdnRTY2FsZSBjdkNvbnZlcnRTY2FsZQorI2RlZmluZSBjdlNjYWxlICBjdkNvbnZlcnRTY2FsZQorI2RlZmluZSBjdkNvbnZlcnQoIHNyYywgZHN0ICkgIGN2Q29udmVydFNjYWxlKCAoc3JjKSwgKGRzdCksIDEsIDAgKQorCisKKy8qIFBlcmZvcm1zIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBvbiBldmVyeSBzb3VyY2UgYXJyYXkgZWxlbWVudCwKKyAgIHN0b3JlcyBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgcmVzdWx0OgorICAgZHN0KHgseSxjKSA9IGFicyhzY2FsZSpzcmMoeCx5LGMpK3NoaWZ0KS4KKyAgIGRlc3RpbmF0aW9uIGFycmF5IG11c3QgaGF2ZSA4dSB0eXBlLgorICAgSW4gb3RoZXIgY2FzZXMgb25lIG1heSB1c2UgY3ZDb252ZXJ0U2NhbGUgKyBjdkFic0RpZmZTICovCitDVkFQSSh2b2lkKSAgY3ZDb252ZXJ0U2NhbGVBYnMoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSBDVl9ERUZBVUxUKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2hpZnQgQ1ZfREVGQVVMVCgwKSApOworI2RlZmluZSBjdkN2dFNjYWxlQWJzICBjdkNvbnZlcnRTY2FsZUFicworCisKKy8qIGNoZWNrcyB0ZXJtaW5hdGlvbiBjcml0ZXJpYSB2YWxpZGl0eSBhbmQKKyAgIHNldHMgZXBzIHRvIGRlZmF1bHRfZXBzIChpZiBpdCBpcyBub3Qgc2V0KSwKKyAgIG1heF9pdGVyIHRvIGRlZmF1bHRfbWF4X2l0ZXJzIChpZiBpdCBpcyBub3Qgc2V0KQorKi8KK0NWQVBJKEN2VGVybUNyaXRlcmlhKSBjdkNoZWNrVGVybUNyaXRlcmlhKCBDdlRlcm1Dcml0ZXJpYSBjcml0ZXJpYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZGVmYXVsdF9lcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZmF1bHRfbWF4X2l0ZXJzICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBBcml0aG1ldGljLCBsb2dpYyBhbmQgY29tcGFyaXNvbiBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogZHN0KG1hc2spID0gc3JjMShtYXNrKSArIHNyYzIobWFzaykgKi8KK0NWQVBJKHZvaWQpICBjdkFkZCggY29uc3QgQ3ZBcnIqIHNyYzEsIGNvbnN0IEN2QXJyKiBzcmMyLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KG1hc2spID0gc3JjKG1hc2spICsgdmFsdWUgKi8KK0NWQVBJKHZvaWQpICBjdkFkZFMoIGNvbnN0IEN2QXJyKiBzcmMsIEN2U2NhbGFyIHZhbHVlLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSk7CisKKy8qIGRzdChtYXNrKSA9IHNyYzEobWFzaykgLSBzcmMyKG1hc2spICovCitDVkFQSSh2b2lkKSAgY3ZTdWIoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSk7CisKKy8qIGRzdChtYXNrKSA9IHNyYyhtYXNrKSAtIHZhbHVlID0gc3JjKG1hc2spICsgKC12YWx1ZSkgKi8KK0NWX0lOTElORSAgdm9pZCAgY3ZTdWJTKCBjb25zdCBDdkFyciogc3JjLCBDdlNjYWxhciB2YWx1ZSwgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKQoreworICAgIGN2QWRkUyggc3JjLCBjdlNjYWxhciggLXZhbHVlLnZhbFswXSwgLXZhbHVlLnZhbFsxXSwgLXZhbHVlLnZhbFsyXSwgLXZhbHVlLnZhbFszXSksCisgICAgICAgICAgICBkc3QsIG1hc2sgKTsKK30KKworLyogZHN0KG1hc2spID0gdmFsdWUgLSBzcmMobWFzaykgKi8KK0NWQVBJKHZvaWQpICBjdlN1YlJTKCBjb25zdCBDdkFyciogc3JjLCBDdlNjYWxhciB2YWx1ZSwgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KGlkeCkgPSBzcmMxKGlkeCkgKiBzcmMyKGlkeCkgKiBzY2FsZQorICAgKHNjYWxlZCBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gb2YgMiBhcnJheXMpICovCitDVkFQSSh2b2lkKSAgY3ZNdWwoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRzdCwgZG91YmxlIHNjYWxlIENWX0RFRkFVTFQoMSkgKTsKKworLyogZWxlbWVudC13aXNlIGRpdmlzaW9uL2ludmVyc2lvbiB3aXRoIHNjYWxpbmc6CisgICAgZHN0KGlkeCkgPSBzcmMxKGlkeCkgKiBzY2FsZSAvIHNyYzIoaWR4KQorICAgIG9yIGRzdChpZHgpID0gc2NhbGUgLyBzcmMyKGlkeCkgaWYgc3JjMSA9PSAwICovCitDVkFQSSh2b2lkKSAgY3ZEaXYoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRzdCwgZG91YmxlIHNjYWxlIENWX0RFRkFVTFQoMSkpOworCisvKiBkc3QgPSBzcmMxICogc2NhbGUgKyBzcmMyICovCitDVkFQSSh2b2lkKSAgY3ZTY2FsZUFkZCggY29uc3QgQ3ZBcnIqIHNyYzEsIEN2U2NhbGFyIHNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzcmMyLCBDdkFyciogZHN0ICk7CisjZGVmaW5lIGN2QVhQWSggQSwgcmVhbF9zY2FsYXIsIEIsIEMgKSBjdlNjYWxlQWRkKEEsIGN2UmVhbFNjYWxhcihyZWFsX3NjYWxhciksIEIsIEMpCisKKy8qIGRzdCA9IHNyYzEgKiBhbHBoYSArIHNyYzIgKiBiZXRhICsgZ2FtbWEgKi8KK0NWQVBJKHZvaWQpICBjdkFkZFdlaWdodGVkKCBjb25zdCBDdkFyciogc3JjMSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzcmMyLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZ2FtbWEsIEN2QXJyKiBkc3QgKTsKKworLyogcmVzdWx0ID0gc3VtX2koc3JjMShpKSAqIHNyYzIoaSkpIChyZXN1bHRzIGZvciBhbGwgY2hhbm5lbHMgYXJlIGFjY3VtdWxhdGVkIHRvZ2V0aGVyKSAqLworQ1ZBUEkoZG91YmxlKSAgY3ZEb3RQcm9kdWN0KCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIgKTsKKworLyogZHN0KGlkeCkgPSBzcmMxKGlkeCkgJiBzcmMyKGlkeCkgKi8KK0NWQVBJKHZvaWQpIGN2QW5kKCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsCisgICAgICAgICAgICAgICAgICBDdkFyciogZHN0LCBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KGlkeCkgPSBzcmMoaWR4KSAmIHZhbHVlICovCitDVkFQSSh2b2lkKSBjdkFuZFMoIGNvbnN0IEN2QXJyKiBzcmMsIEN2U2NhbGFyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgIEN2QXJyKiBkc3QsIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkpOworCisvKiBkc3QoaWR4KSA9IHNyYzEoaWR4KSB8IHNyYzIoaWR4KSAqLworQ1ZBUEkodm9pZCkgY3ZPciggY29uc3QgQ3ZBcnIqIHNyYzEsIGNvbnN0IEN2QXJyKiBzcmMyLAorICAgICAgICAgICAgICAgICBDdkFyciogZHN0LCBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KGlkeCkgPSBzcmMoaWR4KSB8IHZhbHVlICovCitDVkFQSSh2b2lkKSBjdk9yUyggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZTY2FsYXIgdmFsdWUsCisgICAgICAgICAgICAgICAgICBDdkFyciogZHN0LCBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KGlkeCkgPSBzcmMxKGlkeCkgXiBzcmMyKGlkeCkgKi8KK0NWQVBJKHZvaWQpIGN2WG9yKCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsCisgICAgICAgICAgICAgICAgICBDdkFyciogZHN0LCBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZHN0KGlkeCkgPSBzcmMoaWR4KSBeIHZhbHVlICovCitDVkFQSSh2b2lkKSBjdlhvclMoIGNvbnN0IEN2QXJyKiBzcmMsIEN2U2NhbGFyIHZhbHVlLAorICAgICAgICAgICAgICAgICAgIEN2QXJyKiBkc3QsIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkpOworCisvKiBkc3QoaWR4KSA9IH5zcmMoaWR4KSAqLworQ1ZBUEkodm9pZCkgY3ZOb3QoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QgKTsKKworLyogZHN0KGlkeCkgPSBsb3dlcihpZHgpIDw9IHNyYyhpZHgpIDwgdXBwZXIoaWR4KSAqLworQ1ZBUEkodm9pZCkgY3ZJblJhbmdlKCBjb25zdCBDdkFyciogc3JjLCBjb25zdCBDdkFyciogbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIHVwcGVyLCBDdkFyciogZHN0ICk7CisKKy8qIGRzdChpZHgpID0gbG93ZXIgPD0gc3JjKGlkeCkgPCB1cHBlciAqLworQ1ZBUEkodm9pZCkgY3ZJblJhbmdlUyggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZTY2FsYXIgbG93ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIHVwcGVyLCBDdkFyciogZHN0ICk7CisKKyNkZWZpbmUgQ1ZfQ01QX0VRICAgMAorI2RlZmluZSBDVl9DTVBfR1QgICAxCisjZGVmaW5lIENWX0NNUF9HRSAgIDIKKyNkZWZpbmUgQ1ZfQ01QX0xUICAgMworI2RlZmluZSBDVl9DTVBfTEUgICA0CisjZGVmaW5lIENWX0NNUF9ORSAgIDUKKworLyogVGhlIGNvbXBhcmlzb24gb3BlcmF0aW9uIHN1cHBvcnQgc2luZ2xlLWNoYW5uZWwgYXJyYXlzIG9ubHkuCisgICBEZXN0aW5hdGlvbiBpbWFnZSBzaG91bGQgYmUgOHVDMSBvciA4c0MxICovCisKKy8qIGRzdChpZHgpID0gc3JjMShpZHgpIF9jbXBfb3BfIHNyYzIoaWR4KSAqLworQ1ZBUEkodm9pZCkgY3ZDbXAoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwgQ3ZBcnIqIGRzdCwgaW50IGNtcF9vcCApOworCisvKiBkc3QoaWR4KSA9IHNyYzEoaWR4KSBfY21wX29wXyB2YWx1ZSAqLworQ1ZBUEkodm9pZCkgY3ZDbXBTKCBjb25zdCBDdkFyciogc3JjLCBkb3VibGUgdmFsdWUsIEN2QXJyKiBkc3QsIGludCBjbXBfb3AgKTsKKworLyogZHN0KGlkeCkgPSBtaW4oc3JjMShpZHgpLHNyYzIoaWR4KSkgKi8KK0NWQVBJKHZvaWQpIGN2TWluKCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsIEN2QXJyKiBkc3QgKTsKKworLyogZHN0KGlkeCkgPSBtYXgoc3JjMShpZHgpLHNyYzIoaWR4KSkgKi8KK0NWQVBJKHZvaWQpIGN2TWF4KCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsIEN2QXJyKiBkc3QgKTsKKworLyogZHN0KGlkeCkgPSBtaW4oc3JjKGlkeCksdmFsdWUpICovCitDVkFQSSh2b2lkKSBjdk1pblMoIGNvbnN0IEN2QXJyKiBzcmMsIGRvdWJsZSB2YWx1ZSwgQ3ZBcnIqIGRzdCApOworCisvKiBkc3QoaWR4KSA9IG1heChzcmMoaWR4KSx2YWx1ZSkgKi8KK0NWQVBJKHZvaWQpIGN2TWF4UyggY29uc3QgQ3ZBcnIqIHNyYywgZG91YmxlIHZhbHVlLCBDdkFyciogZHN0ICk7CisKKy8qIGRzdCh4LHksYykgPSBhYnMoc3JjMSh4LHksYykgLSBzcmMyKHgseSxjKSkgKi8KK0NWQVBJKHZvaWQpIGN2QWJzRGlmZiggY29uc3QgQ3ZBcnIqIHNyYzEsIGNvbnN0IEN2QXJyKiBzcmMyLCBDdkFyciogZHN0ICk7CisKKy8qIGRzdCh4LHksYykgPSBhYnMoc3JjKHgseSxjKSAtIHZhbHVlKGMpKSAqLworQ1ZBUEkodm9pZCkgY3ZBYnNEaWZmUyggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgQ3ZTY2FsYXIgdmFsdWUgKTsKKyNkZWZpbmUgY3ZBYnMoIHNyYywgZHN0ICkgY3ZBYnNEaWZmUyggKHNyYyksIChkc3QpLCBjdlNjYWxhckFsbCgwKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoIG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEb2VzIGNhcnRlc2lhbi0+cG9sYXIgY29vcmRpbmF0ZXMgY29udmVyc2lvbi4KKyAgIEVpdGhlciBvZiBvdXRwdXQgY29tcG9uZW50cyAobWFnbml0dWRlIG9yIGFuZ2xlKSBpcyBvcHRpb25hbCAqLworQ1ZBUEkodm9pZCkgIGN2Q2FydFRvUG9sYXIoIGNvbnN0IEN2QXJyKiB4LCBjb25zdCBDdkFyciogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogbWFnbml0dWRlLCBDdkFyciogYW5nbGUgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYW5nbGVfaW5fZGVncmVlcyBDVl9ERUZBVUxUKDApKTsKKworLyogRG9lcyBwb2xhci0+Y2FydGVzaWFuIGNvb3JkaW5hdGVzIGNvbnZlcnNpb24uCisgICBFaXRoZXIgb2Ygb3V0cHV0IGNvbXBvbmVudHMgKG1hZ25pdHVkZSBvciBhbmdsZSkgaXMgb3B0aW9uYWwuCisgICBJZiBtYWduaXR1ZGUgaXMgbWlzc2luZyBpdCBpcyBhc3N1bWVkIHRvIGJlIGFsbCAxJ3MgKi8KK0NWQVBJKHZvaWQpICBjdlBvbGFyVG9DYXJ0KCBjb25zdCBDdkFyciogbWFnbml0dWRlLCBjb25zdCBDdkFyciogYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIHgsIEN2QXJyKiB5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhbmdsZV9pbl9kZWdyZWVzIENWX0RFRkFVTFQoMCkpOworCisvKiBEb2VzIHBvd2VyaW5nOiBkc3QoaWR4KSA9IHNyYyhpZHgpXnBvd2VyICovCitDVkFQSSh2b2lkKSAgY3ZQb3coIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsIGRvdWJsZSBwb3dlciApOworCisvKiBEb2VzIGV4cG9uZW50aW9uOiBkc3QoaWR4KSA9IGV4cChzcmMoaWR4KSkuCisgICBPdmVyZmxvdyBpcyBub3QgaGFuZGxlZCB5ZXQuIFVuZGVyZmxvdyBpcyBoYW5kbGVkLgorICAgTWF4aW1hbCByZWxhdGl2ZSBlcnJvciBpcyB+N2UtNiBmb3Igc2luZ2xlLXByZWNpc2lvbiBpbnB1dCAqLworQ1ZBUEkodm9pZCkgIGN2RXhwKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0ICk7CisKKy8qIENhbGN1bGF0ZXMgbmF0dXJhbCBsb2dhcml0aG1zOiBkc3QoaWR4KSA9IGxvZyhhYnMoc3JjKGlkeCkpKS4KKyAgIExvZ2FyaXRobSBvZiAwIGdpdmVzIGxhcmdlIG5lZ2F0aXZlIG51bWJlcih+LTcwMCkKKyAgIE1heGltYWwgcmVsYXRpdmUgZXJyb3IgaXMgfjNlLTcgZm9yIHNpbmdsZS1wcmVjaXNpb24gb3V0cHV0CisqLworQ1ZBUEkodm9pZCkgIGN2TG9nKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0ICk7CisKKy8qIEZhc3QgYXJjdGFuZ2VudCBjYWxjdWxhdGlvbiAqLworQ1ZBUEkoZmxvYXQpIGN2RmFzdEFyY3RhbiggZmxvYXQgeSwgZmxvYXQgeCApOworCisvKiBGYXN0IGN1YmljIHJvb3QgY2FsY3VsYXRpb24gKi8KK0NWQVBJKGZsb2F0KSAgY3ZDYnJ0KCBmbG9hdCB2YWx1ZSApOworCisvKiBDaGVja3MgYXJyYXkgdmFsdWVzIGZvciBOYU5zLCBJbmZzIG9yIHNpbXBseSBmb3IgdG9vIGxhcmdlIG51bWJlcnMKKyAgIChpZiBDVl9DSEVDS19SQU5HRSBpcyBzZXQpLiBJZiBDVl9DSEVDS19RVUlFVCBpcyBzZXQsCisgICBubyBydW50aW1lIGVycm9ycyBpcyByYWlzZWQgKGZ1bmN0aW9uIHJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mICJiYWQiIHZhbHVlcykuCisgICBPdGhlcndpc2UgY3ZFcnJvciBpcyBjYWxsZWQgKi8KKyNkZWZpbmUgIENWX0NIRUNLX1JBTkdFICAgIDEKKyNkZWZpbmUgIENWX0NIRUNLX1FVSUVUICAgIDIKK0NWQVBJKGludCkgIGN2Q2hlY2tBcnIoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBmbGFncyBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pbl92YWwgQ1ZfREVGQVVMVCgwKSwgZG91YmxlIG1heF92YWwgQ1ZfREVGQVVMVCgwKSk7CisjZGVmaW5lIGN2Q2hlY2tBcnJheSBjdkNoZWNrQXJyCisKKyNkZWZpbmUgQ1ZfUkFORF9VTkkgICAgICAwCisjZGVmaW5lIENWX1JBTkRfTk9STUFMICAgMQorQ1ZBUEkodm9pZCkgY3ZSYW5kQXJyKCBDdlJORyogcm5nLCBDdkFyciogYXJyLCBpbnQgZGlzdF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIHBhcmFtMSwgQ3ZTY2FsYXIgcGFyYW0yICk7CisKK0NWQVBJKHZvaWQpIGN2UmFuZFNodWZmbGUoIEN2QXJyKiBtYXQsIEN2Uk5HKiBybmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaXRlcl9mYWN0b3IgQ1ZfREVGQVVMVCgxLikpOworCisjZGVmaW5lIENWX1NPUlRfRVZFUllfUk9XIDAKKyNkZWZpbmUgQ1ZfU09SVF9FVkVSWV9DT0xVTU4gMQorI2RlZmluZSBDVl9TT1JUX0FTQ0VORElORyAwCisjZGVmaW5lIENWX1NPUlRfREVTQ0VORElORyAxNgorCitDVkFQSSh2b2lkKSBjdlNvcnQoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGlkeG1hdCBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIEZpbmRzIHJlYWwgcm9vdHMgb2YgYSBjdWJpYyBlcXVhdGlvbiAqLworQ1ZBUEkoaW50KSBjdlNvbHZlQ3ViaWMoIGNvbnN0IEN2TWF0KiBjb2VmZnMsIEN2TWF0KiByb290cyApOworCisvKiBGaW5kcyBhbGwgcmVhbCBhbmQgY29tcGxleCByb290cyBvZiBhIHBvbHlub21pYWwgZXF1YXRpb24gKi8KK0NWQVBJKHZvaWQpIGN2U29sdmVQb2x5KGNvbnN0IEN2TWF0KiBjb2VmZnMsIEN2TWF0ICpyb290cywKKwkJCWludCBtYXhpdGVyIENWX0RFRkFVTFQoMCksIGludCBmaWcgQ1ZfREVGQVVMVCgwKSk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4IG9wZXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ2FsY3VsYXRlcyBjcm9zcyBwcm9kdWN0IG9mIHR3byAzZCB2ZWN0b3JzICovCitDVkFQSSh2b2lkKSAgY3ZDcm9zc1Byb2R1Y3QoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwgQ3ZBcnIqIGRzdCApOworCisvKiBNYXRyaXggdHJhbnNmb3JtOiBkc3QgPSBBKkIgKyBDLCBDIGlzIG9wdGlvbmFsICovCisjZGVmaW5lIGN2TWF0TXVsQWRkKCBzcmMxLCBzcmMyLCBzcmMzLCBkc3QgKSBjdkdFTU0oIChzcmMxKSwgKHNyYzIpLCAxLiwgKHNyYzMpLCAxLiwgKGRzdCksIDAgKQorI2RlZmluZSBjdk1hdE11bCggc3JjMSwgc3JjMiwgZHN0ICkgIGN2TWF0TXVsQWRkKCAoc3JjMSksIChzcmMyKSwgTlVMTCwgKGRzdCkpCisKKyNkZWZpbmUgQ1ZfR0VNTV9BX1QgMQorI2RlZmluZSBDVl9HRU1NX0JfVCAyCisjZGVmaW5lIENWX0dFTU1fQ19UIDQKKy8qIEV4dGVuZGVkIG1hdHJpeCB0cmFuc2Zvcm06CisgICBkc3QgPSBhbHBoYSpvcChBKSpvcChCKSArIGJldGEqb3AoQyksIHdoZXJlIG9wKFgpIGlzIFggb3IgWF5UICovCitDVkFQSSh2b2lkKSAgY3ZHRU1NKCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzcmMzLCBkb3VibGUgYmV0YSwgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCB0QUJDIENWX0RFRkFVTFQoMCkpOworI2RlZmluZSBjdk1hdE11bEFkZEV4IGN2R0VNTQorCisvKiBUcmFuc2Zvcm1zIGVhY2ggZWxlbWVudCBvZiBzb3VyY2UgYXJyYXkgYW5kIHN0b3JlcworICAgcmVzdWx0YW50IHZlY3RvcnMgaW4gZGVzdGluYXRpb24gYXJyYXkgKi8KK0NWQVBJKHZvaWQpICBjdlRyYW5zZm9ybSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHRyYW5zbWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogc2hpZnR2ZWMgQ1ZfREVGQVVMVChOVUxMKSk7CisjZGVmaW5lIGN2TWF0TXVsQWRkUyBjdlRyYW5zZm9ybQorCisvKiBEb2VzIHBlcnNwZWN0aXZlIHRyYW5zZm9ybSBvbiBldmVyeSBlbGVtZW50IG9mIGlucHV0IGFycmF5ICovCitDVkFQSSh2b2lkKSAgY3ZQZXJzcGVjdGl2ZVRyYW5zZm9ybSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbWF0ICk7CisKKy8qIENhbGN1bGF0ZXMgKEEtZGVsdGEpKihBLWRlbHRhKV5UIChvcmRlcj0wKSBvciAoQS1kZWx0YSleVCooQS1kZWx0YSkgKG9yZGVyPTEpICovCitDVkFQSSh2b2lkKSBjdk11bFRyYW5zcG9zZWQoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsIGludCBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIGRlbHRhIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSBDVl9ERUZBVUxUKDEuKSApOworCisvKiBUcmFucG9zZXMgbWF0cml4LiBTcXVhcmUgbWF0cmljZXMgY2FuIGJlIHRyYW5zcG9zZWQgaW4tcGxhY2UgKi8KK0NWQVBJKHZvaWQpICBjdlRyYW5zcG9zZSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCApOworI2RlZmluZSBjdlQgY3ZUcmFuc3Bvc2UKKworLyogQ29tcGxldGVzIHRoZSBzeW1tZXRyaWMgbWF0cml4IGZyb20gdGhlIGxvd2VyIChMdG9SPTApIG9yIGZyb20gdGhlIHVwcGVyIChMdG9SIT0wKSBwYXJ0ICovCitDVkFQSSh2b2lkKSAgY3ZDb21wbGV0ZVN5bW0oIEN2TWF0KiBtYXRyaXgsIGludCBMdG9SIENWX0RFRkFVTFQoMCkgKTsKKworLyogTWlycm9yIGFycmF5IGRhdGEgYXJvdW5kIGhvcml6b250YWwgKGZsaXA9MCksCisgICB2ZXJ0aWNhbCAoZmxpcD0xKSBvciBib3RoKGZsaXA9LTEpIGF4aXNlczoKKyAgIGN2RmxpcChzcmMpIGZsaXBzIGltYWdlcyB2ZXJ0aWNhbGx5IGFuZCBzZXF1ZW5jZXMgaG9yaXpvbnRhbGx5IChpbnBsYWNlKSAqLworQ1ZBUEkodm9pZCkgIGN2RmxpcCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgaW50IGZsaXBfbW9kZSBDVl9ERUZBVUxUKDApKTsKKyNkZWZpbmUgY3ZNaXJyb3IgY3ZGbGlwCisKKworI2RlZmluZSBDVl9TVkRfTU9ESUZZX0EgICAxCisjZGVmaW5lIENWX1NWRF9VX1QgICAgICAgIDIKKyNkZWZpbmUgQ1ZfU1ZEX1ZfVCAgICAgICAgNAorCisvKiBQZXJmb3JtcyBTaW5ndWxhciBWYWx1ZSBEZWNvbXBvc2l0aW9uIG9mIGEgbWF0cml4ICovCitDVkFQSSh2b2lkKSAgIGN2U1ZEKCBDdkFyciogQSwgQ3ZBcnIqIFcsIEN2QXJyKiBVIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICBDdkFyciogViBDVl9ERUZBVUxUKE5VTEwpLCBpbnQgZmxhZ3MgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIFBlcmZvcm1zIFNpbmd1bGFyIFZhbHVlIEJhY2sgU3Vic3RpdHV0aW9uIChzb2x2ZXMgQSpYID0gQik6CisgICBmbGFncyBtdXN0IGJlIHRoZSBzYW1lIGFzIGluIGN2U1ZEICovCitDVkFQSSh2b2lkKSAgIGN2U1ZCa1NiKCBjb25zdCBDdkFyciogVywgY29uc3QgQ3ZBcnIqIFUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogViwgY29uc3QgQ3ZBcnIqIEIsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogWCwgaW50IGZsYWdzICk7CisKKyNkZWZpbmUgQ1ZfTFUgIDAKKyNkZWZpbmUgQ1ZfU1ZEIDEKKyNkZWZpbmUgQ1ZfU1ZEX1NZTSAyCisjZGVmaW5lIENWX0xTUSA4CisKKy8qIEludmVydHMgbWF0cml4ICovCitDVkFQSShkb3VibGUpICBjdkludmVydCggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kIENWX0RFRkFVTFQoQ1ZfTFUpKTsKKyNkZWZpbmUgY3ZJbnYgY3ZJbnZlcnQKKworLyogU29sdmVzIGxpbmVhciBzeXN0ZW0gKHNyYzEpKihkc3QpID0gKHNyYzIpCisgICAocmV0dXJucyAwIGlmIHNyYzEgaXMgYSBzaW5ndWxhciBhbmQgQ1ZfTFUgbWV0aG9kIGlzIHVzZWQpICovCitDVkFQSShpbnQpICBjdlNvbHZlKCBjb25zdCBDdkFyciogc3JjMSwgY29uc3QgQ3ZBcnIqIHNyYzIsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICBpbnQgbWV0aG9kIENWX0RFRkFVTFQoQ1ZfTFUpKTsKKworLyogQ2FsY3VsYXRlcyBkZXRlcm1pbmFudCBvZiBpbnB1dCBtYXRyaXggKi8KK0NWQVBJKGRvdWJsZSkgY3ZEZXQoIGNvbnN0IEN2QXJyKiBtYXQgKTsKKworLyogQ2FsY3VsYXRlcyB0cmFjZSBvZiB0aGUgbWF0cml4IChzdW0gb2YgZWxlbWVudHMgb24gdGhlIG1haW4gZGlhZ29uYWwpICovCitDVkFQSShDdlNjYWxhcikgY3ZUcmFjZSggY29uc3QgQ3ZBcnIqIG1hdCApOworCisvKiBGaW5kcyBlaWdlbiB2YWx1ZXMgYW5kIHZlY3RvcnMgb2YgYSBzeW1tZXRyaWMgbWF0cml4ICovCitDVkFQSSh2b2lkKSAgY3ZFaWdlblZWKCBDdkFyciogbWF0LCBDdkFyciogZXZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGV2YWxzLCBkb3VibGUgZXBzIENWX0RFRkFVTFQoMCkpOworCisvKiBNYWtlcyBhbiBpZGVudGl0eSBtYXRyaXggKG1hdF9paiA9IGkgPT0gaikgKi8KK0NWQVBJKHZvaWQpICBjdlNldElkZW50aXR5KCBDdkFyciogbWF0LCBDdlNjYWxhciB2YWx1ZSBDVl9ERUZBVUxUKGN2UmVhbFNjYWxhcigxKSkgKTsKKworLyogRmlsbHMgbWF0cml4IHdpdGggZ2l2ZW4gcmFuZ2Ugb2YgbnVtYmVycyAqLworQ1ZBUEkoQ3ZBcnIqKSAgY3ZSYW5nZSggQ3ZBcnIqIG1hdCwgZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kICk7CisKKy8qIENhbGN1bGF0ZXMgY292YXJpYXRpb24gbWF0cml4IGZvciBhIHNldCBvZiB2ZWN0b3JzICovCisvKiB0cmFuc3Bvc2UoW3YxLWF2ZywgdjItYXZnLC4uLl0pICogW3YxLWF2Zyx2Mi1hdmcsLi4uXSAqLworI2RlZmluZSBDVl9DT1ZBUl9TQ1JBTUJMRUQgMAorCisvKiBbdjEtYXZnLCB2Mi1hdmcsLi4uXSAqIHRyYW5zcG9zZShbdjEtYXZnLHYyLWF2ZywuLi5dKSAqLworI2RlZmluZSBDVl9DT1ZBUl9OT1JNQUwgICAgMQorCisvKiBkbyBub3QgY2FsYyBhdmVyYWdlIChpLmUuIG1lYW4gdmVjdG9yKSAtIHVzZSB0aGUgaW5wdXQgdmVjdG9yIGluc3RlYWQKKyAgICh1c2VmdWwgZm9yIGNhbGN1bGF0aW5nIGNvdmFyaWFuY2UgbWF0cml4IGJ5IHBhcnRzKSAqLworI2RlZmluZSBDVl9DT1ZBUl9VU0VfQVZHICAgMgorCisvKiBzY2FsZSB0aGUgY292YXJpYW5jZSBtYXRyaXggY29lZmZpY2llbnRzIGJ5IG51bWJlciBvZiB0aGUgdmVjdG9ycyAqLworI2RlZmluZSBDVl9DT1ZBUl9TQ0FMRSAgICAgNAorCisvKiBhbGwgdGhlIGlucHV0IHZlY3RvcnMgYXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBtYXRyaXgsIGFzIGl0cyByb3dzICovCisjZGVmaW5lIENWX0NPVkFSX1JPV1MgICAgICA4CisKKy8qIGFsbCB0aGUgaW5wdXQgdmVjdG9ycyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIG1hdHJpeCwgYXMgaXRzIGNvbHVtbnMgKi8KKyNkZWZpbmUgQ1ZfQ09WQVJfQ09MUyAgICAgMTYKKworQ1ZBUEkodm9pZCkgIGN2Q2FsY0NvdmFyTWF0cml4KCBjb25zdCBDdkFycioqIHZlY3RzLCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QXJyKiBjb3ZfbWF0LCBDdkFyciogYXZnLCBpbnQgZmxhZ3MgKTsKKworI2RlZmluZSBDVl9QQ0FfREFUQV9BU19ST1cgMAorI2RlZmluZSBDVl9QQ0FfREFUQV9BU19DT0wgMQorI2RlZmluZSBDVl9QQ0FfVVNFX0FWRyAyCitDVkFQSSh2b2lkKSAgY3ZDYWxjUENBKCBjb25zdCBDdkFyciogZGF0YSwgQ3ZBcnIqIG1lYW4sCisgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogZWlnZW52YWxzLCBDdkFyciogZWlnZW52ZWN0cywgaW50IGZsYWdzICk7CisKK0NWQVBJKHZvaWQpICBjdlByb2plY3RQQ0EoIGNvbnN0IEN2QXJyKiBkYXRhLCBjb25zdCBDdkFyciogbWVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBlaWdlbnZlY3RzLCBDdkFyciogcmVzdWx0ICk7CisKK0NWQVBJKHZvaWQpICBjdkJhY2tQcm9qZWN0UENBKCBjb25zdCBDdkFyciogcHJvaiwgY29uc3QgQ3ZBcnIqIG1lYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIGVpZ2VudmVjdHMsIEN2QXJyKiByZXN1bHQgKTsKKworLyogQ2FsY3VsYXRlcyBNYWhhbGFub2Jpcyh3ZWlnaHRlZCkgZGlzdGFuY2UgKi8KK0NWQVBJKGRvdWJsZSkgIGN2TWFoYWxhbm9iaXMoIGNvbnN0IEN2QXJyKiB2ZWMxLCBjb25zdCBDdkFyciogdmVjMiwgQ3ZBcnIqIG1hdCApOworI2RlZmluZSBjdk1haGFsb25vYmlzICBjdk1haGFsYW5vYmlzCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5IFN0YXRpc3RpY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRmluZHMgc3VtIG9mIGFycmF5IGVsZW1lbnRzICovCitDVkFQSShDdlNjYWxhcikgIGN2U3VtKCBjb25zdCBDdkFyciogYXJyICk7CisKKy8qIENhbGN1bGF0ZXMgbnVtYmVyIG9mIG5vbi16ZXJvIHBpeGVscyAqLworQ1ZBUEkoaW50KSAgY3ZDb3VudE5vblplcm8oIGNvbnN0IEN2QXJyKiBhcnIgKTsKKworLyogQ2FsY3VsYXRlcyBtZWFuIHZhbHVlIG9mIGFycmF5IGVsZW1lbnRzICovCitDVkFQSShDdlNjYWxhcikgIGN2QXZnKCBjb25zdCBDdkFyciogYXJyLCBjb25zdCBDdkFyciogbWFzayBDVl9ERUZBVUxUKE5VTEwpICk7CisKKy8qIENhbGN1bGF0ZXMgbWVhbiBhbmQgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHBpeGVsIHZhbHVlcyAqLworQ1ZBUEkodm9pZCkgIGN2QXZnU2R2KCBjb25zdCBDdkFyciogYXJyLCBDdlNjYWxhciogbWVhbiwgQ3ZTY2FsYXIqIHN0ZF9kZXYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogRmluZHMgZ2xvYmFsIG1pbmltdW0sIG1heGltdW0gYW5kIHRoZWlyIHBvc2l0aW9ucyAqLworQ1ZBUEkodm9pZCkgIGN2TWluTWF4TG9jKCBjb25zdCBDdkFyciogYXJyLCBkb3VibGUqIG1pbl92YWwsIGRvdWJsZSogbWF4X3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCogbWluX2xvYyBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlBvaW50KiBtYXhfbG9jIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBtYXNrIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogdHlwZXMgb2YgYXJyYXkgbm9ybSAqLworI2RlZmluZSBDVl9DICAgICAgICAgICAgMQorI2RlZmluZSBDVl9MMSAgICAgICAgICAgMgorI2RlZmluZSBDVl9MMiAgICAgICAgICAgNAorI2RlZmluZSBDVl9OT1JNX01BU0sgICAgNworI2RlZmluZSBDVl9SRUxBVElWRSAgICAgOAorI2RlZmluZSBDVl9ESUZGICAgICAgICAgMTYKKyNkZWZpbmUgQ1ZfTUlOTUFYICAgICAgIDMyCisKKyNkZWZpbmUgQ1ZfRElGRl9DICAgICAgIChDVl9ESUZGIHwgQ1ZfQykKKyNkZWZpbmUgQ1ZfRElGRl9MMSAgICAgIChDVl9ESUZGIHwgQ1ZfTDEpCisjZGVmaW5lIENWX0RJRkZfTDIgICAgICAoQ1ZfRElGRiB8IENWX0wyKQorI2RlZmluZSBDVl9SRUxBVElWRV9DICAgKENWX1JFTEFUSVZFIHwgQ1ZfQykKKyNkZWZpbmUgQ1ZfUkVMQVRJVkVfTDEgIChDVl9SRUxBVElWRSB8IENWX0wxKQorI2RlZmluZSBDVl9SRUxBVElWRV9MMiAgKENWX1JFTEFUSVZFIHwgQ1ZfTDIpCisKKy8qIEZpbmRzIG5vcm0sIGRpZmZlcmVuY2Ugbm9ybSBvciByZWxhdGl2ZSBkaWZmZXJlbmNlIG5vcm0gZm9yIGFuIGFycmF5IChvciB0d28gYXJyYXlzKSAqLworQ1ZBUEkoZG91YmxlKSAgY3ZOb3JtKCBjb25zdCBDdkFyciogYXJyMSwgY29uc3QgQ3ZBcnIqIGFycjIgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1fdHlwZSBDVl9ERUZBVUxUKENWX0wyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSApOworCitDVkFQSSh2b2lkKSAgY3ZOb3JtYWxpemUoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhIENWX0RFRkFVTFQoMS4pLCBkb3VibGUgYiBDVl9ERUZBVUxUKDAuKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5vcm1fdHlwZSBDVl9ERUZBVUxUKENWX0wyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZBcnIqIG1hc2sgQ1ZfREVGQVVMVChOVUxMKSApOworCisKKyNkZWZpbmUgQ1ZfUkVEVUNFX1NVTSAwCisjZGVmaW5lIENWX1JFRFVDRV9BVkcgMQorI2RlZmluZSBDVl9SRURVQ0VfTUFYIDIKKyNkZWZpbmUgQ1ZfUkVEVUNFX01JTiAzCisKK0NWQVBJKHZvaWQpICBjdlJlZHVjZSggY29uc3QgQ3ZBcnIqIHNyYywgQ3ZBcnIqIGRzdCwgaW50IGRpbSBDVl9ERUZBVUxUKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IG9wIENWX0RFRkFVTFQoQ1ZfUkVEVUNFX1NVTSkgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIERpc2NyZXRlIExpbmVhciBUcmFuc2Zvcm1zIGFuZCBSZWxhdGVkIEZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENWX0RYVF9GT1JXQVJEICAwCisjZGVmaW5lIENWX0RYVF9JTlZFUlNFICAxCisjZGVmaW5lIENWX0RYVF9TQ0FMRSAgICAyIC8qIGRpdmlkZSByZXN1bHQgYnkgc2l6ZSBvZiBhcnJheSAqLworI2RlZmluZSBDVl9EWFRfSU5WX1NDQUxFIChDVl9EWFRfSU5WRVJTRSArIENWX0RYVF9TQ0FMRSkKKyNkZWZpbmUgQ1ZfRFhUX0lOVkVSU0VfU0NBTEUgQ1ZfRFhUX0lOVl9TQ0FMRQorI2RlZmluZSBDVl9EWFRfUk9XUyAgICAgNCAvKiB0cmFuc2Zvcm0gZWFjaCByb3cgaW5kaXZpZHVhbGx5ICovCisjZGVmaW5lIENWX0RYVF9NVUxfQ09OSiA4IC8qIGNvbmp1Z2F0ZSB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIGN2TXVsU3BlY3RydW1zICovCisKKy8qIERpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3JtOgorICAgIGNvbXBsZXgtPmNvbXBsZXgsCisgICAgcmVhbC0+Y2NzIChmb3J3YXJkKSwKKyAgICBjY3MtPnJlYWwgKGludmVyc2UpICovCitDVkFQSSh2b2lkKSAgY3ZERlQoIGNvbnN0IEN2QXJyKiBzcmMsIEN2QXJyKiBkc3QsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgaW50IG5vbnplcm9fcm93cyBDVl9ERUZBVUxUKDApICk7CisjZGVmaW5lIGN2RkZUIGN2REZUCisKKy8qIE11bHRpcGx5IHJlc3VsdHMgb2YgREZUczogREZUKFgpKkRGVChZKSBvciBERlQoWCkqY29uaihERlQoWSkpICovCitDVkFQSSh2b2lkKSAgY3ZNdWxTcGVjdHJ1bXMoIGNvbnN0IEN2QXJyKiBzcmMxLCBjb25zdCBDdkFyciogc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBcnIqIGRzdCwgaW50IGZsYWdzICk7CisKKy8qIEZpbmRzIG9wdGltYWwgREZUIHZlY3RvciBzaXplID49IHNpemUwICovCitDVkFQSShpbnQpICBjdkdldE9wdGltYWxERlRTaXplKCBpbnQgc2l6ZTAgKTsKKworLyogRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybSAqLworQ1ZBUEkodm9pZCkgIGN2RENUKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LCBpbnQgZmxhZ3MgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pYyBkYXRhIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDYWxjdWxhdGVzIGxlbmd0aCBvZiBzZXF1ZW5jZSBzbGljZSAod2l0aCBzdXBwb3J0IG9mIG5lZ2F0aXZlIGluZGljZXMpLiAqLworQ1ZBUEkoaW50KSBjdlNsaWNlTGVuZ3RoKCBDdlNsaWNlIHNsaWNlLCBjb25zdCBDdlNlcSogc2VxICk7CisKKworLyogQ3JlYXRlcyBuZXcgbWVtb3J5IHN0b3JhZ2UuCisgICBibG9ja19zaXplID09IDAgbWVhbnMgdGhhdCBkZWZhdWx0LAorICAgc29tZXdoYXQgb3B0aW1hbCBzaXplLCBpcyB1c2VkIChjdXJyZW50bHksIGl0IGlzIDY0SykgKi8KK0NWQVBJKEN2TWVtU3RvcmFnZSopICBjdkNyZWF0ZU1lbVN0b3JhZ2UoIGludCBibG9ja19zaXplIENWX0RFRkFVTFQoMCkpOworCisKKy8qIENyZWF0ZXMgYSBtZW1vcnkgc3RvcmFnZSB0aGF0IHdpbGwgYm9ycm93IG1lbW9yeSBibG9ja3MgZnJvbSBwYXJlbnQgc3RvcmFnZSAqLworQ1ZBUEkoQ3ZNZW1TdG9yYWdlKikgIGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBDdk1lbVN0b3JhZ2UqIHBhcmVudCApOworCisKKy8qIFJlbGVhc2VzIG1lbW9yeSBzdG9yYWdlLiBBbGwgdGhlIGNoaWxkcmVuIG9mIGEgcGFyZW50IG11c3QgYmUgcmVsZWFzZWQgYmVmb3JlCisgICB0aGUgcGFyZW50LiBBIGNoaWxkIHN0b3JhZ2UgcmV0dXJucyBhbGwgdGhlIGJsb2NrcyB0byBwYXJlbnQgd2hlbiBpdCBpcyByZWxlYXNlZCAqLworQ1ZBUEkodm9pZCkgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoIEN2TWVtU3RvcmFnZSoqIHN0b3JhZ2UgKTsKKworCisvKiBDbGVhcnMgbWVtb3J5IHN0b3JhZ2UuIFRoaXMgaXMgdGhlIG9ubHkgd2F5KCEhISkgKGJlc2lkZXMgY3ZSZXN0b3JlTWVtU3RvcmFnZVBvcykKKyAgIHRvIHJldXNlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBzdG9yYWdlIC0gY3ZDbGVhclNlcSxjdkNsZWFyU2V0IC4uLgorICAgZG8gbm90IGZyZWUgYW55IG1lbW9yeS4KKyAgIEEgY2hpbGQgc3RvcmFnZSByZXR1cm5zIGFsbCB0aGUgYmxvY2tzIHRvIHRoZSBwYXJlbnQgd2hlbiBpdCBpcyBjbGVhcmVkICovCitDVkFQSSh2b2lkKSAgY3ZDbGVhck1lbVN0b3JhZ2UoIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKiBSZW1lbWJlciBhIHN0b3JhZ2UgImZyZWUgbWVtb3J5IiBwb3NpdGlvbiAqLworQ1ZBUEkodm9pZCkgIGN2U2F2ZU1lbVN0b3JhZ2VQb3MoIGNvbnN0IEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZNZW1TdG9yYWdlUG9zKiBwb3MgKTsKKworLyogUmVzdG9yZSBhIHN0b3JhZ2UgImZyZWUgbWVtb3J5IiBwb3NpdGlvbiAqLworQ1ZBUEkodm9pZCkgIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MoIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZNZW1TdG9yYWdlUG9zKiBwb3MgKTsKKworLyogQWxsb2NhdGVzIGNvbnRpbnVvdXMgYnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBpbiB0aGUgc3RvcmFnZSAqLworQ1ZBUEkodm9pZCopIGN2TWVtU3RvcmFnZUFsbG9jKCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIHNpemVfdCBzaXplICk7CisKKy8qIEFsbG9jYXRlcyBzdHJpbmcgaW4gbWVtb3J5IHN0b3JhZ2UgKi8KK0NWQVBJKEN2U3RyaW5nKSBjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyggQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBjb25zdCBjaGFyKiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiBDVl9ERUZBVUxUKC0xKSApOworCisvKiBDcmVhdGVzIG5ldyBlbXB0eSBzZXF1ZW5jZSB0aGF0IHdpbGwgcmVzaWRlIGluIHRoZSBzcGVjaWZpZWQgc3RvcmFnZSAqLworQ1ZBUEkoQ3ZTZXEqKSAgY3ZDcmVhdGVTZXEoIGludCBzZXFfZmxhZ3MsIGludCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxlbV9zaXplLCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgKTsKKworLyogQ2hhbmdlcyBkZWZhdWx0IHNpemUgKGdyYW51bGFyaXR5KSBvZiBzZXF1ZW5jZSBibG9ja3MuCisgICBUaGUgZGVmYXVsdCBzaXplIGlzIH4xS2J5dGUgKi8KK0NWQVBJKHZvaWQpICBjdlNldFNlcUJsb2NrU2l6ZSggQ3ZTZXEqIHNlcSwgaW50IGRlbHRhX2VsZW1zICk7CisKKworLyogQWRkcyBuZXcgZWxlbWVudCB0byB0aGUgZW5kIG9mIHNlcXVlbmNlLiBSZXR1cm5zIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgKi8KK0NWQVBJKHNjaGFyKikgIGN2U2VxUHVzaCggQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudCBDVl9ERUZBVUxUKE5VTEwpKTsKKworCisvKiBBZGRzIG5ldyBlbGVtZW50IHRvIHRoZSBiZWdpbm5pbmcgb2Ygc2VxdWVuY2UuIFJldHVybnMgcG9pbnRlciB0byBpdCAqLworQ1ZBUEkoc2NoYXIqKSAgY3ZTZXFQdXNoRnJvbnQoIEN2U2VxKiBzZXEsIHZvaWQqIGVsZW1lbnQgQ1ZfREVGQVVMVChOVUxMKSk7CisKKworLyogUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IGZyb20gc2VxdWVuY2UgYW5kIG9wdGlvbmFsbHkgc2F2ZXMgaXQgKi8KK0NWQVBJKHZvaWQpICBjdlNlcVBvcCggQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudCBDVl9ERUZBVUxUKE5VTEwpKTsKKworCisvKiBSZW1vdmVzIHRoZSBmaXJzdCBlbGVtZW50IGZyb20gc2VxdWVuY2UgYW5kIG9wdGlvYW5hbGx5IHNhdmVzIGl0ICovCitDVkFQSSh2b2lkKSAgY3ZTZXFQb3BGcm9udCggQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudCBDVl9ERUZBVUxUKE5VTEwpKTsKKworCisjZGVmaW5lIENWX0ZST05UIDEKKyNkZWZpbmUgQ1ZfQkFDSyAwCisvKiBBZGRzIHNldmVyYWwgbmV3IGVsZW1lbnRzIHRvIHRoZSBlbmQgb2Ygc2VxdWVuY2UgKi8KK0NWQVBJKHZvaWQpICBjdlNlcVB1c2hNdWx0aSggQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgaW50IGluX2Zyb250IENWX0RFRkFVTFQoMCkgKTsKKworLyogUmVtb3ZlcyBzZXZlcmFsIGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiBzZXF1ZW5jZSBhbmQgb3B0aW9uYWxseSBzYXZlcyB0aGVtICovCitDVkFQSSh2b2lkKSAgY3ZTZXFQb3BNdWx0aSggQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgaW5fZnJvbnQgQ1ZfREVGQVVMVCgwKSApOworCisvKiBJbnNlcnRzIGEgbmV3IGVsZW1lbnQgaW4gdGhlIG1pZGRsZSBvZiBzZXF1ZW5jZS4KKyAgIGN2U2VxSW5zZXJ0KHNlcSwwLGVsZW0pID09IGN2U2VxUHVzaEZyb250KHNlcSxlbGVtKSAqLworQ1ZBUEkoc2NoYXIqKSAgY3ZTZXFJbnNlcnQoIEN2U2VxKiBzZXEsIGludCBiZWZvcmVfaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZWxlbWVudCBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogUmVtb3ZlcyBzcGVjaWZpZWQgc2VxdWVuY2UgZWxlbWVudCAqLworQ1ZBUEkodm9pZCkgIGN2U2VxUmVtb3ZlKCBDdlNlcSogc2VxLCBpbnQgaW5kZXggKTsKKworCisvKiBSZW1vdmVzIGFsbCB0aGUgZWxlbWVudHMgZnJvbSB0aGUgc2VxdWVuY2UuIFRoZSBmcmVlZCBtZW1vcnkKKyAgIGNhbiBiZSByZXVzZWQgbGF0ZXIgb25seSBieSB0aGUgc2FtZSBzZXF1ZW5jZSB1bmxlc3MgY3ZDbGVhck1lbVN0b3JhZ2UKKyAgIG9yIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MgaXMgY2FsbGVkICovCitDVkFQSSh2b2lkKSAgY3ZDbGVhclNlcSggQ3ZTZXEqIHNlcSApOworCisKKy8qIFJldHJpZXZlcyBwb2ludGVyIHRvIHNwZWNpZmllZCBzZXF1ZW5jZSBlbGVtZW50LgorICAgTmVnYXRpdmUgaW5kaWNlcyBhcmUgc3VwcG9ydGVkIGFuZCBtZWFuIGNvdW50aW5nIGZyb20gdGhlIGVuZAorICAgKGUuZyAtMSBtZWFucyB0aGUgbGFzdCBzZXF1ZW5jZSBlbGVtZW50KSAqLworQ1ZBUEkoc2NoYXIqKSAgY3ZHZXRTZXFFbGVtKCBjb25zdCBDdlNlcSogc2VxLCBpbnQgaW5kZXggKTsKKworLyogQ2FsY3VsYXRlcyBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIHNlcXVlbmNlIGVsZW1lbnQuCisgICBSZXR1cm5zIC0xIGlmIGVsZW1lbnQgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBzZXF1ZW5jZSAqLworQ1ZBUEkoaW50KSAgY3ZTZXFFbGVtSWR4KCBjb25zdCBDdlNlcSogc2VxLCBjb25zdCB2b2lkKiBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2VxQmxvY2sqKiBibG9jayBDVl9ERUZBVUxUKE5VTEwpICk7CisKKy8qIEluaXRpYWxpemVzIHNlcXVlbmNlIHdyaXRlci4gVGhlIG5ldyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2Ygc2VxdWVuY2UgKi8KK0NWQVBJKHZvaWQpICBjdlN0YXJ0QXBwZW5kVG9TZXEoIEN2U2VxKiBzZXEsIEN2U2VxV3JpdGVyKiB3cml0ZXIgKTsKKworCisvKiBDb21iaW5hdGlvbiBvZiBjdkNyZWF0ZVNlcSBhbmQgY3ZTdGFydEFwcGVuZFRvU2VxICovCitDVkFQSSh2b2lkKSAgY3ZTdGFydFdyaXRlU2VxKCBpbnQgc2VxX2ZsYWdzLCBpbnQgaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZWxlbV9zaXplLCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVdyaXRlciogd3JpdGVyICk7CisKKy8qIENsb3NlcyBzZXF1ZW5jZSB3cml0ZXIsIHVwZGF0ZXMgc2VxdWVuY2UgaGVhZGVyIGFuZCByZXR1cm5zIHBvaW50ZXIKKyAgIHRvIHRoZSByZXN1bHRhbnQgc2VxdWVuY2UKKyAgICh3aGljaCBtYXkgYmUgdXNlZnVsIGlmIHRoZSBzZXF1ZW5jZSB3YXMgY3JlYXRlZCB1c2luZyBjdlN0YXJ0V3JpdGVTZXEpKQorKi8KK0NWQVBJKEN2U2VxKikgIGN2RW5kV3JpdGVTZXEoIEN2U2VxV3JpdGVyKiB3cml0ZXIgKTsKKworCisvKiBVcGRhdGVzIHNlcXVlbmNlIGhlYWRlci4gTWF5IGJlIHVzZWZ1bCB0byBnZXQgYWNjZXNzIHRvIHNvbWUgb2YgcHJldmlvdXNseQorICAgd3JpdHRlbiBlbGVtZW50cyB2aWEgY3ZHZXRTZXFFbGVtIG9yIHNlcXVlbmNlIHJlYWRlciAqLworQ1ZBUEkodm9pZCkgICBjdkZsdXNoU2VxV3JpdGVyKCBDdlNlcVdyaXRlciogd3JpdGVyICk7CisKKworLyogSW5pdGlhbGl6ZXMgc2VxdWVuY2UgcmVhZGVyLgorICAgVGhlIHNlcXVlbmNlIGNhbiBiZSByZWFkIGluIGZvcndhcmQgb3IgYmFja3dhcmQgZGlyZWN0aW9uICovCitDVkFQSSh2b2lkKSBjdlN0YXJ0UmVhZFNlcSggY29uc3QgQ3ZTZXEqIHNlcSwgQ3ZTZXFSZWFkZXIqIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZXZlcnNlIENWX0RFRkFVTFQoMCkgKTsKKworCisvKiBSZXR1cm5zIGN1cnJlbnQgc2VxdWVuY2UgcmVhZGVyIHBvc2l0aW9uIChjdXJyZW50bHkgb2JzZXJ2ZWQgc2VxdWVuY2UgZWxlbWVudCkgKi8KK0NWQVBJKGludCkgIGN2R2V0U2VxUmVhZGVyUG9zKCBDdlNlcVJlYWRlciogcmVhZGVyICk7CisKKworLyogQ2hhbmdlcyBzZXF1ZW5jZSByZWFkZXIgcG9zaXRpb24uIEl0IG1heSBzZWVrIHRvIGFuIGFic29sdXRlIG9yCisgICB0byByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBwb3NpdGlvbiAqLworQ1ZBUEkodm9pZCkgICBjdlNldFNlcVJlYWRlclBvcyggQ3ZTZXFSZWFkZXIqIHJlYWRlciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3JlbGF0aXZlIENWX0RFRkFVTFQoMCkpOworCisvKiBDb3BpZXMgc2VxdWVuY2UgY29udGVudCB0byBhIGNvbnRpbnVvdXMgcGllY2Ugb2YgbWVtb3J5ICovCitDVkFQSSh2b2lkKikgIGN2Q3Z0U2VxVG9BcnJheSggY29uc3QgQ3ZTZXEqIHNlcSwgdm9pZCogZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTbGljZSBzbGljZSBDVl9ERUZBVUxUKENWX1dIT0xFX1NFUSkgKTsKKworLyogQ3JlYXRlcyBzZXF1ZW5jZSBoZWFkZXIgZm9yIGFycmF5LgorICAgQWZ0ZXIgdGhhdCBhbGwgdGhlIG9wZXJhdGlvbnMgb24gc2VxdWVuY2VzIHRoYXQgZG8gbm90IGFsdGVyIHRoZSBjb250ZW50CisgICBjYW4gYmUgYXBwbGllZCB0byB0aGUgcmVzdWx0YW50IHNlcXVlbmNlICovCitDVkFQSShDdlNlcSopIGN2TWFrZVNlcUhlYWRlckZvckFycmF5KCBpbnQgc2VxX3R5cGUsIGludCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbGVtX3NpemUsIHZvaWQqIGVsZW1lbnRzLCBpbnQgdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSogc2VxLCBDdlNlcUJsb2NrKiBibG9jayApOworCisvKiBFeHRyYWN0cyBzZXF1ZW5jZSBzbGljZSAod2l0aCBvciB3aXRob3V0IGNvcHlpbmcgc2VxdWVuY2UgZWxlbWVudHMpICovCitDVkFQSShDdlNlcSopIGN2U2VxU2xpY2UoIGNvbnN0IEN2U2VxKiBzZXEsIEN2U2xpY2Ugc2xpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcHlfZGF0YSBDVl9ERUZBVUxUKDApKTsKKworQ1ZfSU5MSU5FIEN2U2VxKiBjdkNsb25lU2VxKCBjb25zdCBDdlNlcSogc2VxLCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgQ1ZfREVGQVVMVChOVUxMKSkKK3sKKyAgICByZXR1cm4gY3ZTZXFTbGljZSggc2VxLCBDVl9XSE9MRV9TRVEsIHN0b3JhZ2UsIDEgKTsKK30KKworLyogUmVtb3ZlcyBzZXF1ZW5jZSBzbGljZSAqLworQ1ZBUEkodm9pZCkgIGN2U2VxUmVtb3ZlU2xpY2UoIEN2U2VxKiBzZXEsIEN2U2xpY2Ugc2xpY2UgKTsKKworLyogSW5zZXJ0cyBhIHNlcXVlbmNlIG9yIGFycmF5IGludG8gYW5vdGhlciBzZXF1ZW5jZSAqLworQ1ZBUEkodm9pZCkgIGN2U2VxSW5zZXJ0U2xpY2UoIEN2U2VxKiBzZXEsIGludCBiZWZvcmVfaW5kZXgsIGNvbnN0IEN2QXJyKiBmcm9tX2FyciApOworCisvKiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCAqLwordHlwZWRlZiBpbnQgKENWX0NERUNMKiBDdkNtcEZ1bmMpKGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIsIHZvaWQqIHVzZXJkYXRhICk7CisKKy8qIFNvcnRzIHNlcXVlbmNlIGluLXBsYWNlIGdpdmVuIGVsZW1lbnQgY29tcGFyaXNvbiBmdW5jdGlvbiAqLworQ1ZBUEkodm9pZCkgY3ZTZXFTb3J0KCBDdlNlcSogc2VxLCBDdkNtcEZ1bmMgZnVuYywgdm9pZCogdXNlcmRhdGEgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKiBGaW5kcyBlbGVtZW50IGluIGEgW3NvcnRlZF0gc2VxdWVuY2UgKi8KK0NWQVBJKHNjaGFyKikgY3ZTZXFTZWFyY2goIEN2U2VxKiBzZXEsIGNvbnN0IHZvaWQqIGVsZW0sIEN2Q21wRnVuYyBmdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX3NvcnRlZCwgaW50KiBlbGVtX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHVzZXJkYXRhIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogUmV2ZXJzZXMgb3JkZXIgb2Ygc2VxdWVuY2UgZWxlbWVudHMgaW4tcGxhY2UgKi8KK0NWQVBJKHZvaWQpIGN2U2VxSW52ZXJ0KCBDdlNlcSogc2VxICk7CisKKy8qIFNwbGl0cyBzZXF1ZW5jZSBpbnRvIG9uZSBvciBtb3JlIGVxdWl2YWxlbmNlIGNsYXNzZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBjcml0ZXJpYSAqLworQ1ZBUEkoaW50KSAgY3ZTZXFQYXJ0aXRpb24oIGNvbnN0IEN2U2VxKiBzZXEsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcSoqIGxhYmVscywgQ3ZDbXBGdW5jIGlzX2VxdWFsLCB2b2lkKiB1c2VyZGF0YSApOworCisvKioqKioqKioqKioqIEludGVybmFsIHNlcXVlbmNlIGZ1bmN0aW9ucyAqKioqKioqKioqKiovCitDVkFQSSh2b2lkKSAgY3ZDaGFuZ2VTZXFCbG9jayggdm9pZCogcmVhZGVyLCBpbnQgZGlyZWN0aW9uICk7CitDVkFQSSh2b2lkKSAgY3ZDcmVhdGVTZXFCbG9jayggQ3ZTZXFXcml0ZXIqIHdyaXRlciApOworCisKKy8qIENyZWF0ZXMgYSBuZXcgc2V0ICovCitDVkFQSShDdlNldCopICBjdkNyZWF0ZVNldCggaW50IHNldF9mbGFncywgaW50IGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbGVtX3NpemUsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKiBBZGRzIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgYW5kIHJldHVybnMgcG9pbnRlciB0byBpdCAqLworQ1ZBUEkoaW50KSAgY3ZTZXRBZGQoIEN2U2V0KiBzZXRfaGVhZGVyLCBDdlNldEVsZW0qIGVsZW0gQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICBDdlNldEVsZW0qKiBpbnNlcnRlZF9lbGVtIENWX0RFRkFVTFQoTlVMTCkgKTsKKworLyogRmFzdCB2YXJpYW50IG9mIGN2U2V0QWRkICovCitDVl9JTkxJTkUgIEN2U2V0RWxlbSogY3ZTZXROZXcoIEN2U2V0KiBzZXRfaGVhZGVyICkKK3sKKyAgICBDdlNldEVsZW0qIGVsZW0gPSBzZXRfaGVhZGVyLT5mcmVlX2VsZW1zOworICAgIGlmKCBlbGVtICkKKyAgICB7CisgICAgICAgIHNldF9oZWFkZXItPmZyZWVfZWxlbXMgPSBlbGVtLT5uZXh0X2ZyZWU7CisgICAgICAgIGVsZW0tPmZsYWdzID0gZWxlbS0+ZmxhZ3MgJiBDVl9TRVRfRUxFTV9JRFhfTUFTSzsKKyAgICAgICAgc2V0X2hlYWRlci0+YWN0aXZlX2NvdW50Kys7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3ZTZXRBZGQoIHNldF9oZWFkZXIsIE5VTEwsIChDdlNldEVsZW0qKikmZWxlbSApOworICAgIHJldHVybiBlbGVtOworfQorCisvKiBSZW1vdmVzIHNldCBlbGVtZW50IGdpdmVuIGl0cyBwb2ludGVyICovCitDVl9JTkxJTkUgIHZvaWQgY3ZTZXRSZW1vdmVCeVB0ciggQ3ZTZXQqIHNldF9oZWFkZXIsIHZvaWQqIGVsZW0gKQoreworICAgIEN2U2V0RWxlbSogX2VsZW0gPSAoQ3ZTZXRFbGVtKillbGVtOworICAgIGFzc2VydCggX2VsZW0tPmZsYWdzID49IDAgLyomJiAoZWxlbS0+ZmxhZ3MgJiBDVl9TRVRfRUxFTV9JRFhfTUFTSykgPCBzZXRfaGVhZGVyLT50b3RhbCovICk7CisgICAgX2VsZW0tPm5leHRfZnJlZSA9IHNldF9oZWFkZXItPmZyZWVfZWxlbXM7CisgICAgX2VsZW0tPmZsYWdzID0gKF9lbGVtLT5mbGFncyAmIENWX1NFVF9FTEVNX0lEWF9NQVNLKSB8IENWX1NFVF9FTEVNX0ZSRUVfRkxBRzsKKyAgICBzZXRfaGVhZGVyLT5mcmVlX2VsZW1zID0gX2VsZW07CisgICAgc2V0X2hlYWRlci0+YWN0aXZlX2NvdW50LS07Cit9CisKKy8qIFJlbW92ZXMgZWxlbWVudCBmcm9tIHRoZSBzZXQgYnkgaXRzIGluZGV4ICAqLworQ1ZBUEkodm9pZCkgICBjdlNldFJlbW92ZSggQ3ZTZXQqIHNldF9oZWFkZXIsIGludCBpbmRleCApOworCisvKiBSZXR1cm5zIGEgc2V0IGVsZW1lbnQgYnkgaW5kZXguIElmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYmVsb25nIHRvIHRoZSBzZXQsCisgICBOVUxMIGlzIHJldHVybmVkICovCitDVl9JTkxJTkUgQ3ZTZXRFbGVtKiBjdkdldFNldEVsZW0oIGNvbnN0IEN2U2V0KiBzZXRfaGVhZGVyLCBpbnQgaW5kZXggKQoreworICAgIEN2U2V0RWxlbSogZWxlbSA9IChDdlNldEVsZW0qKWN2R2V0U2VxRWxlbSggKEN2U2VxKilzZXRfaGVhZGVyLCBpbmRleCApOworICAgIHJldHVybiBlbGVtICYmIENWX0lTX1NFVF9FTEVNKCBlbGVtICkgPyBlbGVtIDogMDsKK30KKworLyogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhlIHNldCAqLworQ1ZBUEkodm9pZCkgIGN2Q2xlYXJTZXQoIEN2U2V0KiBzZXRfaGVhZGVyICk7CisKKy8qIENyZWF0ZXMgbmV3IGdyYXBoICovCitDVkFQSShDdkdyYXBoKikgIGN2Q3JlYXRlR3JhcGgoIGludCBncmFwaF9mbGFncywgaW50IGhlYWRlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdnR4X3NpemUsIGludCBlZGdlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKiBBZGRzIG5ldyB2ZXJ0ZXggdG8gdGhlIGdyYXBoICovCitDVkFQSShpbnQpICBjdkdyYXBoQWRkVnR4KCBDdkdyYXBoKiBncmFwaCwgY29uc3QgQ3ZHcmFwaFZ0eCogdnR4IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiogaW5zZXJ0ZWRfdnR4IENWX0RFRkFVTFQoTlVMTCkgKTsKKworCisvKiBSZW1vdmVzIHZlcnRleCBmcm9tIHRoZSBncmFwaCB0b2dldGhlciB3aXRoIGFsbCBpbmNpZGVudCBlZGdlcyAqLworQ1ZBUEkoaW50KSAgY3ZHcmFwaFJlbW92ZVZ0eCggQ3ZHcmFwaCogZ3JhcGgsIGludCBpbmRleCApOworQ1ZBUEkoaW50KSAgY3ZHcmFwaFJlbW92ZVZ0eEJ5UHRyKCBDdkdyYXBoKiBncmFwaCwgQ3ZHcmFwaFZ0eCogdnR4ICk7CisKKworLyogTGluayB0d28gdmVydGljZXMgc3BlY2lmZWQgYnkgaW5kaWNlcyBvciBwb2ludGVycyBpZiB0aGV5CisgICBhcmUgbm90IGNvbm5lY3RlZCBvciByZXR1cm4gcG9pbnRlciB0byBhbHJlYWR5IGV4aXN0aW5nIGVkZ2UKKyAgIGNvbm5lY3RpbmcgdGhlIHZlcnRpY2VzLgorICAgRnVuY3Rpb25zIHJldHVybiAxIGlmIGEgbmV3IGVkZ2Ugd2FzIGNyZWF0ZWQsIDAgb3RoZXJ3aXNlICovCitDVkFQSShpbnQpICBjdkdyYXBoQWRkRWRnZSggQ3ZHcmFwaCogZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2lkeCwgaW50IGVuZF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHcmFwaEVkZ2UqIGVkZ2UgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSoqIGluc2VydGVkX2VkZ2UgQ1ZfREVGQVVMVChOVUxMKSApOworCitDVkFQSShpbnQpICBjdkdyYXBoQWRkRWRnZUJ5UHRyKCBDdkdyYXBoKiBncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiBzdGFydF92dHgsIEN2R3JhcGhWdHgqIGVuZF92dHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHcmFwaEVkZ2UqIGVkZ2UgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSoqIGluc2VydGVkX2VkZ2UgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKiBSZW1vdmUgZWRnZSBjb25uZWN0aW5nIHR3byB2ZXJ0aWNlcyAqLworQ1ZBUEkodm9pZCkgIGN2R3JhcGhSZW1vdmVFZGdlKCBDdkdyYXBoKiBncmFwaCwgaW50IHN0YXJ0X2lkeCwgaW50IGVuZF9pZHggKTsKK0NWQVBJKHZvaWQpICBjdkdyYXBoUmVtb3ZlRWRnZUJ5UHRyKCBDdkdyYXBoKiBncmFwaCwgQ3ZHcmFwaFZ0eCogc3RhcnRfdnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIGVuZF92dHggKTsKKworLyogRmluZCBlZGdlIGNvbm5lY3RpbmcgdHdvIHZlcnRpY2VzICovCitDVkFQSShDdkdyYXBoRWRnZSopICBjdkZpbmRHcmFwaEVkZ2UoIGNvbnN0IEN2R3JhcGgqIGdyYXBoLCBpbnQgc3RhcnRfaWR4LCBpbnQgZW5kX2lkeCApOworQ1ZBUEkoQ3ZHcmFwaEVkZ2UqKSAgY3ZGaW5kR3JhcGhFZGdlQnlQdHIoIGNvbnN0IEN2R3JhcGgqIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2R3JhcGhWdHgqIHN0YXJ0X3Z0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdyYXBoVnR4KiBlbmRfdnR4ICk7CisjZGVmaW5lIGN2R3JhcGhGaW5kRWRnZSBjdkZpbmRHcmFwaEVkZ2UKKyNkZWZpbmUgY3ZHcmFwaEZpbmRFZGdlQnlQdHIgY3ZGaW5kR3JhcGhFZGdlQnlQdHIKKworLyogUmVtb3ZlIGFsbCB2ZXJ0aWNlcyBhbmQgZWRnZXMgZnJvbSB0aGUgZ3JhcGggKi8KK0NWQVBJKHZvaWQpICBjdkNsZWFyR3JhcGgoIEN2R3JhcGgqIGdyYXBoICk7CisKKworLyogQ291bnQgbnVtYmVyIG9mIGVkZ2VzIGluY2lkZW50IHRvIHRoZSB2ZXJ0ZXggKi8KK0NWQVBJKGludCkgIGN2R3JhcGhWdHhEZWdyZWUoIGNvbnN0IEN2R3JhcGgqIGdyYXBoLCBpbnQgdnR4X2lkeCApOworQ1ZBUEkoaW50KSAgY3ZHcmFwaFZ0eERlZ3JlZUJ5UHRyKCBjb25zdCBDdkdyYXBoKiBncmFwaCwgY29uc3QgQ3ZHcmFwaFZ0eCogdnR4ICk7CisKKworLyogUmV0cmlldmVzIGdyYXBoIHZlcnRleCBieSBnaXZlbiBpbmRleCAqLworI2RlZmluZSBjdkdldEdyYXBoVnR4KCBncmFwaCwgaWR4ICkgKEN2R3JhcGhWdHgqKWN2R2V0U2V0RWxlbSgoQ3ZTZXQqKShncmFwaCksIChpZHgpKQorCisvKiBSZXRyaWV2ZXMgaW5kZXggb2YgYSBncmFwaCB2ZXJ0ZXggZ2l2ZW4gaXRzIHBvaW50ZXIgKi8KKyNkZWZpbmUgY3ZHcmFwaFZ0eElkeCggZ3JhcGgsIHZ0eCApICgodnR4KS0+ZmxhZ3MgJiBDVl9TRVRfRUxFTV9JRFhfTUFTSykKKworLyogUmV0cmlldmVzIGluZGV4IG9mIGEgZ3JhcGggZWRnZSBnaXZlbiBpdHMgcG9pbnRlciAqLworI2RlZmluZSBjdkdyYXBoRWRnZUlkeCggZ3JhcGgsIGVkZ2UgKSAoKGVkZ2UpLT5mbGFncyAmIENWX1NFVF9FTEVNX0lEWF9NQVNLKQorCisjZGVmaW5lIGN2R3JhcGhHZXRWdHhDb3VudCggZ3JhcGggKSAoKGdyYXBoKS0+YWN0aXZlX2NvdW50KQorI2RlZmluZSBjdkdyYXBoR2V0RWRnZUNvdW50KCBncmFwaCApICgoZ3JhcGgpLT5lZGdlcy0+YWN0aXZlX2NvdW50KQorCisjZGVmaW5lICBDVl9HUkFQSF9WRVJURVggICAgICAgIDEKKyNkZWZpbmUgIENWX0dSQVBIX1RSRUVfRURHRSAgICAgMgorI2RlZmluZSAgQ1ZfR1JBUEhfQkFDS19FREdFICAgICA0CisjZGVmaW5lICBDVl9HUkFQSF9GT1JXQVJEX0VER0UgIDgKKyNkZWZpbmUgIENWX0dSQVBIX0NST1NTX0VER0UgICAgMTYKKyNkZWZpbmUgIENWX0dSQVBIX0FOWV9FREdFICAgICAgMzAKKyNkZWZpbmUgIENWX0dSQVBIX05FV19UUkVFICAgICAgMzIKKyNkZWZpbmUgIENWX0dSQVBIX0JBQ0tUUkFDS0lORyAgNjQKKyNkZWZpbmUgIENWX0dSQVBIX09WRVIgICAgICAgICAgLTEKKworI2RlZmluZSAgQ1ZfR1JBUEhfQUxMX0lURU1TICAgIC0xCisKKy8qIGZsYWdzIGZvciBncmFwaCB2ZXJ0aWNlcyBhbmQgZWRnZXMgKi8KKyNkZWZpbmUgIENWX0dSQVBIX0lURU1fVklTSVRFRF9GTEFHICAoMSA8PCAzMCkKKyNkZWZpbmUgIENWX0lTX0dSQVBIX1ZFUlRFWF9WSVNJVEVEKHZ0eCkgXAorICAgICgoKEN2R3JhcGhWdHgqKSh2dHgpKS0+ZmxhZ3MgJiBDVl9HUkFQSF9JVEVNX1ZJU0lURURfRkxBRykKKyNkZWZpbmUgIENWX0lTX0dSQVBIX0VER0VfVklTSVRFRChlZGdlKSBcCisgICAgKCgoQ3ZHcmFwaEVkZ2UqKShlZGdlKSktPmZsYWdzICYgQ1ZfR1JBUEhfSVRFTV9WSVNJVEVEX0ZMQUcpCisjZGVmaW5lICBDVl9HUkFQSF9TRUFSQ0hfVFJFRV9OT0RFX0ZMQUcgICAoMSA8PCAyOSkKKyNkZWZpbmUgIENWX0dSQVBIX0ZPUldBUkRfRURHRV9GTEFHICAgICAgICgxIDw8IDI4KQorCit0eXBlZGVmIHN0cnVjdCBDdkdyYXBoU2Nhbm5lcgoreworICAgIEN2R3JhcGhWdHgqIHZ0eDsgICAgICAgLyogY3VycmVudCBncmFwaCB2ZXJ0ZXggKG9yIGN1cnJlbnQgZWRnZSBvcmlnaW4pICovCisgICAgQ3ZHcmFwaFZ0eCogZHN0OyAgICAgICAvKiBjdXJyZW50IGdyYXBoIGVkZ2UgZGVzdGluYXRpb24gdmVydGV4ICovCisgICAgQ3ZHcmFwaEVkZ2UqIGVkZ2U7ICAgICAvKiBjdXJyZW50IGVkZ2UgKi8KKworICAgIEN2R3JhcGgqIGdyYXBoOyAgICAgICAgLyogdGhlIGdyYXBoICovCisgICAgQ3ZTZXEqICAgc3RhY2s7ICAgICAgICAvKiB0aGUgZ3JhcGggdmVydGV4IHN0YWNrICovCisgICAgaW50ICAgICAgaW5kZXg7ICAgICAgICAvKiB0aGUgbG93ZXIgYm91bmQgb2YgY2VydGFpbmx5IHZpc2l0ZWQgdmVydGljZXMgKi8KKyAgICBpbnQgICAgICBtYXNrOyAgICAgICAgIC8qIGV2ZW50IG1hc2sgKi8KK30KK0N2R3JhcGhTY2FubmVyOworCisvKiBDcmVhdGVzIG5ldyBncmFwaCBzY2FubmVyLiAqLworQ1ZBUEkoQ3ZHcmFwaFNjYW5uZXIqKSAgY3ZDcmVhdGVHcmFwaFNjYW5uZXIoIEN2R3JhcGgqIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogdnR4IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayBDVl9ERUZBVUxUKENWX0dSQVBIX0FMTF9JVEVNUykpOworCisvKiBSZWxlYXNlcyBncmFwaCBzY2FubmVyLiAqLworQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlR3JhcGhTY2FubmVyKCBDdkdyYXBoU2Nhbm5lcioqIHNjYW5uZXIgKTsKKworLyogR2V0IG5leHQgZ3JhcGggZWxlbWVudCAqLworQ1ZBUEkoaW50KSAgY3ZOZXh0R3JhcGhJdGVtKCBDdkdyYXBoU2Nhbm5lciogc2Nhbm5lciApOworCisvKiBDcmVhdGVzIGEgY29weSBvZiBncmFwaCAqLworQ1ZBUEkoQ3ZHcmFwaCopIGN2Q2xvbmVHcmFwaCggY29uc3QgQ3ZHcmFwaCogZ3JhcGgsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICBEcmF3aW5nIGZ1bmN0aW9ucyB3b3JrIHdpdGggaW1hZ2VzL21hdHJpY2VzIG9mIGFyYml0cmFyeSB0eXBlLiAgICAgICAgICAgICAgICAgICAqCisqICAgICAgIEZvciBjb2xvciBpbWFnZXMgdGhlIGNoYW5uZWwgb3JkZXIgaXMgQkdSW0FdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgQW50aWFsaWFzaW5nIGlzIHN1cHBvcnRlZCBvbmx5IGZvciA4LWJpdCBpbWFnZSBub3cuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICBBbGwgdGhlIGZ1bmN0aW9ucyBpbmNsdWRlIHBhcmFtZXRlciBjb2xvciB0aGF0IG1lYW5zIHJnYiB2YWx1ZSAodGhhdCBtYXkgYmUgICAgICAqCisqICAgICAgIGNvbnN0cnVjdGVkIHdpdGggQ1ZfUkdCIG1hY3JvKSBmb3IgY29sb3IgaW1hZ2VzIGFuZCBicmlnaHRuZXNzICAgICAgICAgICAgICAgICAgICoKKyogICAgICAgZm9yIGdyYXlzY2FsZSBpbWFnZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiAgICAgICBJZiBhIGRyYXduIGZpZ3VyZSBpcyBwYXJ0aWFsbHkgb3IgY29tcGxldGVseSBvdXRzaWRlIG9mIHRoZSBpbWFnZSwgaXQgaXMgY2xpcHBlZC4qCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9SR0IoIHIsIGcsIGIgKSAgY3ZTY2FsYXIoIChiKSwgKGcpLCAociksIDAgKQorI2RlZmluZSBDVl9GSUxMRUQgLTEKKworI2RlZmluZSBDVl9BQSAxNgorCisvKiBEcmF3cyA0LWNvbm5lY3RlZCwgOC1jb25uZWN0ZWQgb3IgYW50aWFsaWFzZWQgbGluZSBzZWdtZW50IGNvbm5lY3RpbmcgdHdvIHBvaW50cyAqLworQ1ZBUEkodm9pZCkgIGN2TGluZSggQ3ZBcnIqIGltZywgQ3ZQb2ludCBwdDEsIEN2UG9pbnQgcHQyLAorICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgY29sb3IsIGludCB0aGlja25lc3MgQ1ZfREVGQVVMVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUgQ1ZfREVGQVVMVCg4KSwgaW50IHNoaWZ0IENWX0RFRkFVTFQoMCkgKTsKKworLyogRHJhd3MgYSByZWN0YW5nbGUgZ2l2ZW4gdHdvIG9wcG9zaXRlIGNvcm5lcnMgb2YgdGhlIHJlY3RhbmdsZSAocHQxICYgcHQyKSwKKyAgIGlmIHRoaWNrbmVzczwwIChlLmcuIHRoaWNrbmVzcyA9PSBDVl9GSUxMRUQpLCB0aGUgZmlsbGVkIGJveCBpcyBkcmF3biAqLworQ1ZBUEkodm9pZCkgIGN2UmVjdGFuZ2xlKCBDdkFyciogaW1nLCBDdlBvaW50IHB0MSwgQ3ZQb2ludCBwdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2NhbGFyIGNvbG9yLCBpbnQgdGhpY2tuZXNzIENWX0RFRkFVTFQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUgQ1ZfREVGQVVMVCg4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0IENWX0RFRkFVTFQoMCkpOworCisvKiBEcmF3cyBhIGNpcmNsZSB3aXRoIHNwZWNpZmllZCBjZW50ZXIgYW5kIHJhZGl1cy4KKyAgIFRoaWNrbmVzcyB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgd2l0aCBjdlJlY3RhbmdsZSAqLworQ1ZBUEkodm9pZCkgIGN2Q2lyY2xlKCBDdkFyciogaW1nLCBDdlBvaW50IGNlbnRlciwgaW50IHJhZGl1cywKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgY29sb3IsIGludCB0aGlja25lc3MgQ1ZfREVGQVVMVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfdHlwZSBDVl9ERUZBVUxUKDgpLCBpbnQgc2hpZnQgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIERyYXdzIGVsbGlwc2Ugb3V0bGluZSwgZmlsbGVkIGVsbGlwc2UsIGVsbGlwdGljIGFyYyBvciBmaWxsZWQgZWxsaXB0aWMgc2VjdG9yLAorICAgZGVwZW5kaW5nIG9uIDx0aGlja25lc3M+LCA8c3RhcnRfYW5nbGU+IGFuZCA8ZW5kX2FuZ2xlPiBwYXJhbWV0ZXJzLiBUaGUgcmVzdWx0YW50IGZpZ3VyZQorICAgaXMgcm90YXRlZCBieSA8YW5nbGU+LiBBbGwgdGhlIGFuZ2xlcyBhcmUgaW4gZGVncmVlcyAqLworQ1ZBUEkodm9pZCkgIGN2RWxsaXBzZSggQ3ZBcnIqIGltZywgQ3ZQb2ludCBjZW50ZXIsIEN2U2l6ZSBheGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFuZ2xlLCBkb3VibGUgc3RhcnRfYW5nbGUsIGRvdWJsZSBlbmRfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBjb2xvciwgaW50IHRoaWNrbmVzcyBDVl9ERUZBVUxUKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfdHlwZSBDVl9ERUZBVUxUKDgpLCBpbnQgc2hpZnQgQ1ZfREVGQVVMVCgwKSk7CisKK0NWX0lOTElORSAgdm9pZCAgY3ZFbGxpcHNlQm94KCBDdkFyciogaW1nLCBDdkJveDJEIGJveCwgQ3ZTY2FsYXIgY29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRoaWNrbmVzcyBDVl9ERUZBVUxUKDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUgQ1ZfREVGQVVMVCg4KSwgaW50IHNoaWZ0IENWX0RFRkFVTFQoMCkgKQoreworICAgIEN2U2l6ZSBheGVzOworICAgIGF4ZXMud2lkdGggPSBjdlJvdW5kKGJveC5zaXplLmhlaWdodCowLjUpOworICAgIGF4ZXMuaGVpZ2h0ID0gY3ZSb3VuZChib3guc2l6ZS53aWR0aCowLjUpOworCisgICAgY3ZFbGxpcHNlKCBpbWcsIGN2UG9pbnRGcm9tMzJmKCBib3guY2VudGVyICksIGF4ZXMsIGJveC5hbmdsZSwKKyAgICAgICAgICAgICAgIDAsIDM2MCwgY29sb3IsIHRoaWNrbmVzcywgbGluZV90eXBlLCBzaGlmdCApOworfQorCisvKiBGaWxscyBjb252ZXggb3IgbW9ub3Rvbm91cyBwb2x5Z29uLiAqLworQ1ZBUEkodm9pZCkgIGN2RmlsbENvbnZleFBvbHkoIEN2QXJyKiBpbWcsIEN2UG9pbnQqIHB0cywgaW50IG5wdHMsIEN2U2NhbGFyIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUgQ1ZfREVGQVVMVCg4KSwgaW50IHNoaWZ0IENWX0RFRkFVTFQoMCkpOworCisvKiBGaWxscyBhbiBhcmVhIGJvdW5kZWQgYnkgb25lIG9yIG1vcmUgYXJiaXRyYXJ5IHBvbHlnb25zICovCitDVkFQSSh2b2lkKSAgY3ZGaWxsUG9seSggQ3ZBcnIqIGltZywgQ3ZQb2ludCoqIHB0cywgaW50KiBucHRzLCBpbnQgY29udG91cnMsIEN2U2NhbGFyIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUgQ1ZfREVGQVVMVCg4KSwgaW50IHNoaWZ0IENWX0RFRkFVTFQoMCkgKTsKKworLyogRHJhd3Mgb25lIG9yIG1vcmUgcG9seWdvbmFsIGN1cnZlcyAqLworQ1ZBUEkodm9pZCkgIGN2UG9seUxpbmUoIEN2QXJyKiBpbWcsIEN2UG9pbnQqKiBwdHMsIGludCogbnB0cywgaW50IGNvbnRvdXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19jbG9zZWQsIEN2U2NhbGFyIGNvbG9yLCBpbnQgdGhpY2tuZXNzIENWX0RFRkFVTFQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfdHlwZSBDVl9ERUZBVUxUKDgpLCBpbnQgc2hpZnQgQ1ZfREVGQVVMVCgwKSApOworCisjZGVmaW5lIGN2RHJhd1JlY3QgY3ZSZWN0YW5nbGUKKyNkZWZpbmUgY3ZEcmF3TGluZSBjdkxpbmUKKyNkZWZpbmUgY3ZEcmF3Q2lyY2xlIGN2Q2lyY2xlCisjZGVmaW5lIGN2RHJhd0VsbGlwc2UgY3ZFbGxpcHNlCisjZGVmaW5lIGN2RHJhd1BvbHlMaW5lIGN2UG9seUxpbmUKKworLyogQ2xpcHMgdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nICpwdDEgYW5kICpwdDIKKyAgIGJ5IHRoZSByZWN0YW5ndWxhciB3aW5kb3cKKyAgICgwPD14PGltZ19zaXplLndpZHRoLCAwPD15PGltZ19zaXplLmhlaWdodCkuICovCitDVkFQSShpbnQpIGN2Q2xpcExpbmUoIEN2U2l6ZSBpbWdfc2l6ZSwgQ3ZQb2ludCogcHQxLCBDdlBvaW50KiBwdDIgKTsKKworLyogSW5pdGlhbGl6ZXMgbGluZSBpdGVyYXRvci4gSW5pdGlhbGx5LCBsaW5lX2l0ZXJhdG9yLT5wdHIgd2lsbCBwb2ludAorICAgdG8gcHQxIChvciBwdDIsIHNlZSBsZWZ0X3RvX3JpZ2h0IGRlc2NyaXB0aW9uKSBsb2NhdGlvbiBpbiB0aGUgaW1hZ2UuCisgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIG9uIHRoZSBsaW5lIGJldHdlZW4gdGhlIGVuZGluZyBwb2ludHMuICovCitDVkFQSShpbnQpICBjdkluaXRMaW5lSXRlcmF0b3IoIGNvbnN0IEN2QXJyKiBpbWFnZSwgQ3ZQb2ludCBwdDEsIEN2UG9pbnQgcHQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkxpbmVJdGVyYXRvciogbGluZV9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbm5lY3Rpdml0eSBDVl9ERUZBVUxUKDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVmdF90b19yaWdodCBDVl9ERUZBVUxUKDApKTsKKworLyogTW92ZXMgaXRlcmF0b3IgdG8gdGhlIG5leHQgbGluZSBwb2ludCAqLworI2RlZmluZSBDVl9ORVhUX0xJTkVfUE9JTlQoIGxpbmVfaXRlcmF0b3IgKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9saW5lX2l0ZXJhdG9yX21hc2sgPSAobGluZV9pdGVyYXRvcikuZXJyIDwgMCA/IC0xIDogMDsgXAorICAgIChsaW5lX2l0ZXJhdG9yKS5lcnIgKz0gKGxpbmVfaXRlcmF0b3IpLm1pbnVzX2RlbHRhICsgICAgICAgIFwKKyAgICAgICAgKChsaW5lX2l0ZXJhdG9yKS5wbHVzX2RlbHRhICYgX2xpbmVfaXRlcmF0b3JfbWFzayk7ICAgICBcCisgICAgKGxpbmVfaXRlcmF0b3IpLnB0ciArPSAobGluZV9pdGVyYXRvcikubWludXNfc3RlcCArICAgICAgICAgXAorICAgICAgICAoKGxpbmVfaXRlcmF0b3IpLnBsdXNfc3RlcCAmIF9saW5lX2l0ZXJhdG9yX21hc2spOyAgICAgIFwKK30KKworCisvKiBiYXNpYyBmb250IHR5cGVzICovCisjZGVmaW5lIENWX0ZPTlRfSEVSU0hFWV9TSU1QTEVYICAgICAgICAgMAorI2RlZmluZSBDVl9GT05UX0hFUlNIRVlfUExBSU4gICAgICAgICAgIDEKKyNkZWZpbmUgQ1ZfRk9OVF9IRVJTSEVZX0RVUExFWCAgICAgICAgICAyCisjZGVmaW5lIENWX0ZPTlRfSEVSU0hFWV9DT01QTEVYICAgICAgICAgMworI2RlZmluZSBDVl9GT05UX0hFUlNIRVlfVFJJUExFWCAgICAgICAgIDQKKyNkZWZpbmUgQ1ZfRk9OVF9IRVJTSEVZX0NPTVBMRVhfU01BTEwgICA1CisjZGVmaW5lIENWX0ZPTlRfSEVSU0hFWV9TQ1JJUFRfU0lNUExFWCAgNgorI2RlZmluZSBDVl9GT05UX0hFUlNIRVlfU0NSSVBUX0NPTVBMRVggIDcKKworLyogZm9udCBmbGFncyAqLworI2RlZmluZSBDVl9GT05UX0lUQUxJQyAgICAgICAgICAgICAgICAgMTYKKworI2RlZmluZSBDVl9GT05UX1ZFQ1RPUjAgICAgQ1ZfRk9OVF9IRVJTSEVZX1NJTVBMRVgKKworLyogRm9udCBzdHJ1Y3R1cmUgKi8KK3R5cGVkZWYgc3RydWN0IEN2Rm9udAoreworICAgIGludCAgICAgICAgIGZvbnRfZmFjZTsgLyogPUNWX0ZPTlRfKiAqLworICAgIGNvbnN0IGludCogIGFzY2lpOyAvKiBmb250IGRhdGEgYW5kIG1ldHJpY3MgKi8KKyAgICBjb25zdCBpbnQqICBncmVlazsKKyAgICBjb25zdCBpbnQqICBjeXJpbGxpYzsKKyAgICBmbG9hdCAgICAgICBoc2NhbGUsIHZzY2FsZTsKKyAgICBmbG9hdCAgICAgICBzaGVhcjsgLyogc2xvcGUgY29lZmZpY2llbnQ6IDAgLSBub3JtYWwsID4wIC0gaXRhbGljICovCisgICAgaW50ICAgICAgICAgdGhpY2tuZXNzOyAvKiBsZXR0ZXJzIHRoaWNrbmVzcyAqLworICAgIGZsb2F0ICAgICAgIGR4OyAvKiBob3Jpem9udGFsIGludGVydmFsIGJldHdlZW4gbGV0dGVycyAqLworICAgIGludCAgICAgICAgIGxpbmVfdHlwZTsKK30KK0N2Rm9udDsKKworLyogSW5pdGlhbGl6ZXMgZm9udCBzdHJ1Y3R1cmUgdXNlZCBmdXJ0aGVyIGluIGN2UHV0VGV4dCAqLworQ1ZBUEkodm9pZCkgIGN2SW5pdEZvbnQoIEN2Rm9udCogZm9udCwgaW50IGZvbnRfZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaHNjYWxlLCBkb3VibGUgdnNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzaGVhciBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aGlja25lc3MgQ1ZfREVGQVVMVCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZV90eXBlIENWX0RFRkFVTFQoOCkpOworCitDVl9JTkxJTkUgQ3ZGb250IGN2Rm9udCggZG91YmxlIHNjYWxlLCBpbnQgdGhpY2tuZXNzIENWX0RFRkFVTFQoMSkgKQoreworICAgIEN2Rm9udCBmb250OworICAgIGN2SW5pdEZvbnQoICZmb250LCBDVl9GT05UX0hFUlNIRVlfUExBSU4sIHNjYWxlLCBzY2FsZSwgMCwgdGhpY2tuZXNzLCBDVl9BQSApOworICAgIHJldHVybiBmb250OworfQorCisvKiBSZW5kZXJzIHRleHQgc3Ryb2tlIHdpdGggc3BlY2lmaWVkIGZvbnQgYW5kIGNvbG9yIGF0IHNwZWNpZmllZCBsb2NhdGlvbi4KKyAgIEN2Rm9udCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCBjdkluaXRGb250ICovCitDVkFQSSh2b2lkKSAgY3ZQdXRUZXh0KCBDdkFyciogaW1nLCBjb25zdCBjaGFyKiB0ZXh0LCBDdlBvaW50IG9yZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Rm9udCogZm9udCwgQ3ZTY2FsYXIgY29sb3IgKTsKKworLyogQ2FsY3VsYXRlcyBib3VuZGluZyBib3ggb2YgdGV4dCBzdHJva2UgKHVzZWZ1bCBmb3IgYWxpZ25tZW50KSAqLworQ1ZBUEkodm9pZCkgIGN2R2V0VGV4dFNpemUoIGNvbnN0IGNoYXIqIHRleHRfc3RyaW5nLCBjb25zdCBDdkZvbnQqIGZvbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplKiB0ZXh0X3NpemUsIGludCogYmFzZWxpbmUgKTsKKworLyogVW5wYWNrcyBjb2xvciB2YWx1ZSwgaWYgYXJydHlwZSBpcyBDVl84VUM/LCA8Y29sb3I+IGlzIHRyZWF0ZWQgYXMKKyAgIHBhY2tlZCBjb2xvciB2YWx1ZSwgb3RoZXJ3aXNlIHRoZSBmaXJzdCBjaGFubmVscyAoZGVwZW5kaW5nIG9uIGFycnR5cGUpCisgICBvZiBkZXN0aW5hdGlvbiBzY2FsYXIgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZSA9IDxjb2xvcj4gKi8KK0NWQVBJKEN2U2NhbGFyKSAgY3ZDb2xvclRvU2NhbGFyKCBkb3VibGUgcGFja2VkX2NvbG9yLCBpbnQgYXJydHlwZSApOworCisvKiBSZXR1cm5zIHRoZSBwb2x5Z29uIHBvaW50cyB3aGljaCBtYWtlIHVwIHRoZSBnaXZlbiBlbGxpcHNlLiAgVGhlIGVsbGlwc2UgaXMgZGVmaW5lIGJ5CisgICB0aGUgYm94IG9mIHNpemUgJ2F4ZXMnIHJvdGF0ZWQgJ2FuZ2xlJyBhcm91bmQgdGhlICdjZW50ZXInLiAgQSBwYXJ0aWFsIHN3ZWVwCisgICBvZiB0aGUgZWxsaXBzZSBhcmMgY2FuIGJlIGRvbmUgYnkgc3BjaWZ5aW5nIGFyY19zdGFydCBhbmQgYXJjX2VuZCB0byBiZSBzb21ldGhpbmcKKyAgIG90aGVyIHRoYW4gMCBhbmQgMzYwLCByZXNwZWN0aXZlbHkuICBUaGUgaW5wdXQgYXJyYXkgJ3B0cycgbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8KKyAgIGhvbGQgdGhlIHJlc3VsdC4gIFRoZSB0b3RhbCBudW1iZXIgb2YgcG9pbnRzIHN0b3JlZCBpbnRvICdwdHMnIGlzIHJldHVybmVkIGJ5IHRoaXMKKyAgIGZ1bmN0aW9uLiAqLworQ1ZBUEkoaW50KSBjdkVsbGlwc2UyUG9seSggQ3ZQb2ludCBjZW50ZXIsIEN2U2l6ZSBheGVzLAorICAgICAgICAgICAgICAgICBpbnQgYW5nbGUsIGludCBhcmNfc3RhcnQsIGludCBhcmNfZW5kLCBDdlBvaW50ICogcHRzLCBpbnQgZGVsdGEgKTsKKworLyogRHJhd3MgY29udG91ciBvdXRsaW5lcyBvciBmaWxsZWQgaW50ZXJpb3JzIG9uIHRoZSBpbWFnZSAqLworQ1ZBUEkodm9pZCkgIGN2RHJhd0NvbnRvdXJzKCBDdkFyciAqaW1nLCBDdlNlcSogY29udG91ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciBleHRlcm5hbF9jb2xvciwgQ3ZTY2FsYXIgaG9sZV9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2xldmVsLCBpbnQgdGhpY2tuZXNzIENWX0RFRkFVTFQoMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpbmVfdHlwZSBDVl9ERUZBVUxUKDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgb2Zmc2V0IENWX0RFRkFVTFQoY3ZQb2ludCgwLDApKSk7CisKKy8qIERvZXMgbG9vay11cCB0cmFuc2Zvcm1hdGlvbi4gRWxlbWVudHMgb2YgdGhlIHNvdXJjZSBhcnJheQorICAgKHRoYXQgc2hvdWxkIGJlIDh1QzEgb3IgOHNDMSkgYXJlIHVzZWQgYXMgaW5kZXhlcyBpbiBsdXRhcnIgMjU2LWVsZW1lbnQgdGFibGUgKi8KK0NWQVBJKHZvaWQpIGN2TFVUKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LCBjb25zdCBDdkFyciogbHV0ICk7CisKKworLyoqKioqKioqKioqKioqKioqKiogSXRlcmF0aW9uIHRocm91Z2ggdGhlIHNlcXVlbmNlIHRyZWUgKioqKioqKioqKioqKioqKiovCit0eXBlZGVmIHN0cnVjdCBDdlRyZWVOb2RlSXRlcmF0b3IKK3sKKyAgICBjb25zdCB2b2lkKiBub2RlOworICAgIGludCBsZXZlbDsKKyAgICBpbnQgbWF4X2xldmVsOworfQorQ3ZUcmVlTm9kZUl0ZXJhdG9yOworCitDVkFQSSh2b2lkKSBjdkluaXRUcmVlTm9kZUl0ZXJhdG9yKCBDdlRyZWVOb2RlSXRlcmF0b3IqIHRyZWVfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpcnN0LCBpbnQgbWF4X2xldmVsICk7CitDVkFQSSh2b2lkKikgY3ZOZXh0VHJlZU5vZGUoIEN2VHJlZU5vZGVJdGVyYXRvciogdHJlZV9pdGVyYXRvciApOworQ1ZBUEkodm9pZCopIGN2UHJldlRyZWVOb2RlKCBDdlRyZWVOb2RlSXRlcmF0b3IqIHRyZWVfaXRlcmF0b3IgKTsKKworLyogSW5zZXJ0cyBzZXF1ZW5jZSBpbnRvIHRyZWUgd2l0aCBzcGVjaWZpZWQgInBhcmVudCIgc2VxdWVuY2UuCisgICBJZiBwYXJlbnQgaXMgZXF1YWwgdG8gZnJhbWUgKGUuZy4gdGhlIG1vc3QgZXh0ZXJuYWwgY29udG91ciksCisgICB0aGVuIGFkZGVkIGNvbnRvdXIgd2lsbCBoYXZlIG51bGwgcG9pbnRlciB0byBwYXJlbnQuICovCitDVkFQSSh2b2lkKSBjdkluc2VydE5vZGVJbnRvVHJlZSggdm9pZCogbm9kZSwgdm9pZCogcGFyZW50LCB2b2lkKiBmcmFtZSApOworCisvKiBSZW1vdmVzIGNvbnRvdXIgZnJvbSB0cmVlICh0b2dldGhlciB3aXRoIHRoZSBjb250b3VyIGNoaWxkcmVuKS4gKi8KK0NWQVBJKHZvaWQpIGN2UmVtb3ZlTm9kZUZyb21UcmVlKCB2b2lkKiBub2RlLCB2b2lkKiBmcmFtZSApOworCisvKiBHYXRoZXJzIHBvaW50ZXJzIHRvIGFsbCB0aGUgc2VxdWVuY2VzLAorICAgYWNjZXNzaWJsZSBmcm9tIHRoZSA8Zmlyc3Q+LCB0byB0aGUgc2luZ2xlIHNlcXVlbmNlICovCitDVkFQSShDdlNlcSopIGN2VHJlZVRvTm9kZVNlcSggY29uc3Qgdm9pZCogZmlyc3QsIGludCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApOworCisvKiBUaGUgZnVuY3Rpb24gaW1wbGVtZW50cyB0aGUgSy1tZWFucyBhbGdvcml0aG0gZm9yIGNsdXN0ZXJpbmcgYW4gYXJyYXkgb2Ygc2FtcGxlCisgICB2ZWN0b3JzIGluIGEgc3BlY2lmaWVkIG51bWJlciBvZiBjbGFzc2VzICovCitDVkFQSSh2b2lkKSAgY3ZLTWVhbnMyKCBjb25zdCBDdkFyciogc2FtcGxlcywgaW50IGNsdXN0ZXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkFyciogbGFiZWxzLCBDdlRlcm1Dcml0ZXJpYSB0ZXJtY3JpdCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0gZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEFkZCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdGFibGUgd2l0aCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uIHRvIHRoZSBJUFAgcHJpbWl0aXZlcyBsaXN0ICovCitDVkFQSShpbnQpICBjdlJlZ2lzdGVyTW9kdWxlKCBjb25zdCBDdk1vZHVsZUluZm8qIG1vZHVsZV9pbmZvICk7CisKKy8qIExvYWRzIG9wdGltaXplZCBmdW5jdGlvbnMgZnJvbSBJUFAsIE1LTCBldGMuIG9yIHN3aXRjaGVzIGJhY2sgdG8gcHVyZSBDIGNvZGUgKi8KK0NWQVBJKGludCkgIGN2VXNlT3B0aW1pemVkKCBpbnQgb25fb2ZmICk7CisKKy8qIFJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVnaXN0ZXJlZCBtb2R1bGVzIGFuZCBsb2FkZWQgb3B0aW1pemVkIHBsdWdpbnMgKi8KK0NWQVBJKHZvaWQpICBjdkdldE1vZHVsZUluZm8oIGNvbnN0IGNoYXIqIG1vZHVsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIHZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogbG9hZGVkX2FkZG9uX3BsdWdpbnMgKTsKKworLyogR2V0IGN1cnJlbnQgT3BlbkNWIGVycm9yIHN0YXR1cyAqLworQ1ZBUEkoaW50KSBjdkdldEVyclN0YXR1cyggdm9pZCApOworCisvKiBTZXRzIGVycm9yIHN0YXR1cyBzaWxlbnRseSAqLworQ1ZBUEkodm9pZCkgY3ZTZXRFcnJTdGF0dXMoIGludCBzdGF0dXMgKTsKKworI2RlZmluZSBDVl9FcnJNb2RlTGVhZiAgICAgMCAgIC8qIFByaW50IGVycm9yIGFuZCBleGl0IHByb2dyYW0gKi8KKyNkZWZpbmUgQ1ZfRXJyTW9kZVBhcmVudCAgIDEgICAvKiBQcmludCBlcnJvciBhbmQgY29udGludWUgKi8KKyNkZWZpbmUgQ1ZfRXJyTW9kZVNpbGVudCAgIDIgICAvKiBEb24ndCBwcmludCBhbmQgY29udGludWUgKi8KKworLyogUmV0cml2ZXMgY3VycmVudCBlcnJvciBwcm9jZXNzaW5nIG1vZGUgKi8KK0NWQVBJKGludCkgIGN2R2V0RXJyTW9kZSggdm9pZCApOworCisvKiBTZXRzIGVycm9yIHByb2Nlc3NpbmcgbW9kZSwgcmV0dXJucyBwcmV2aW91c2x5IHVzZWQgbW9kZSAqLworQ1ZBUEkoaW50KSBjdlNldEVyck1vZGUoIGludCBtb2RlICk7CisKKy8qIFNldHMgZXJyb3Igc3RhdHVzIGFuZCBwZXJmb3JtcyBzb21lIGFkZGl0b25hbCBhY3Rpb25zIChkaXNwbGF5aW5nIG1lc3NhZ2UgYm94LAorICAgd3JpdGluZyBtZXNzYWdlIHRvIHN0ZGVyciwgdGVybWluYXRpbmcgYXBwbGljYXRpb24gZXRjLikKKyAgIGRlcGVuZGluZyBvbiB0aGUgY3VycmVudCBlcnJvciBtb2RlICovCitDVkFQSSh2b2lkKSBjdkVycm9yKCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycl9tc2csIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwgaW50IGxpbmUgKTsKKworLyogUmV0cmlldmVzIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGdpdmVuIGl0cyBjb2RlICovCitDVkFQSShjb25zdCBjaGFyKikgY3ZFcnJvclN0ciggaW50IHN0YXR1cyApOworCisvKiBSZXRyaWV2ZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgZXJyb3Igb2NjdXJlZCAqLworQ1ZBUEkoaW50KSBjdkdldEVyckluZm8oIGNvbnN0IGNoYXIqKiBlcnJjb2RlX2Rlc2MsIGNvbnN0IGNoYXIqKiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBmaWxlbmFtZSwgaW50KiBsaW5lICk7CisKKy8qIE1hcHMgSVBQIGVycm9yIGNvZGVzIHRvIHRoZSBjb3VudGVycGFydHMgZnJvbSBPcGVuQ1YgKi8KK0NWQVBJKGludCkgY3ZFcnJvckZyb21JcHBTdGF0dXMoIGludCBpcHBfc3RhdHVzICk7CisKK3R5cGVkZWYgaW50IChDVl9DREVDTCAqQ3ZFcnJvckNhbGxiYWNrKSggaW50IHN0YXR1cywgY29uc3QgY2hhciogZnVuY19uYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJfbXNnLCBjb25zdCBjaGFyKiBmaWxlX25hbWUsIGludCBsaW5lLCB2b2lkKiB1c2VyZGF0YSApOworCisvKiBBc3NpZ25zIGEgbmV3IGVycm9yLWhhbmRsaW5nIGZ1bmN0aW9uICovCitDVkFQSShDdkVycm9yQ2FsbGJhY2spIGN2UmVkaXJlY3RFcnJvciggQ3ZFcnJvckNhbGxiYWNrIGVycm9yX2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyZGF0YSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIHByZXZfdXNlcmRhdGEgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKgorICAgIE91dHB1dCB0bzoKKyAgICAgICAgY3ZOdWxEZXZSZXBvcnQgLSBub3RoaW5nCisgICAgICAgIGN2U3RkRXJyUmVwb3J0IC0gY29uc29sZShmcHJpbnRmKHN0ZGVyciwuLi4pKQorICAgICAgICBjdkd1aUJveFJlcG9ydCAtIE1lc3NhZ2VCb3goV0lOMzIpCisqLworQ1ZBUEkoaW50KSBjdk51bERldlJlcG9ydCggaW50IHN0YXR1cywgY29uc3QgY2hhciogZnVuY19uYW1lLCBjb25zdCBjaGFyKiBlcnJfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsIGludCBsaW5lLCB2b2lkKiB1c2VyZGF0YSApOworCitDVkFQSShpbnQpIGN2U3RkRXJyUmVwb3J0KCBpbnQgc3RhdHVzLCBjb25zdCBjaGFyKiBmdW5jX25hbWUsIGNvbnN0IGNoYXIqIGVycl9tc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVfbmFtZSwgaW50IGxpbmUsIHZvaWQqIHVzZXJkYXRhICk7CisKK0NWQVBJKGludCkgY3ZHdWlCb3hSZXBvcnQoIGludCBzdGF0dXMsIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZSwgY29uc3QgY2hhciogZXJyX21zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmlsZV9uYW1lLCBpbnQgbGluZSwgdm9pZCogdXNlcmRhdGEgKTsKKwordHlwZWRlZiB2b2lkKiAoQ1ZfQ0RFQ0wgKkN2QWxsb2NGdW5jKShzaXplX3Qgc2l6ZSwgdm9pZCogdXNlcmRhdGEpOwordHlwZWRlZiBpbnQgKENWX0NERUNMICpDdkZyZWVGdW5jKSh2b2lkKiBwcHRyLCB2b2lkKiB1c2VyZGF0YSk7CisKKy8qIFNldCB1c2VyLWRlZmluZWQgbWVtb3J5IG1hbmFnbWVudCBmdW5jdGlvbnMgKHN1YnN0aXR1dG9ycyBmb3IgbWFsbG9jIGFuZCBmcmVlKSB0aGF0CisgICB3aWxsIGJlIGNhbGxlZCBieSBjdkFsbG9jLCBjdkZyZWUgYW5kIGhpZ2hlci1sZXZlbCBmdW5jdGlvbnMgKGUuZy4gY3ZDcmVhdGVJbWFnZSkgKi8KK0NWQVBJKHZvaWQpIGN2U2V0TWVtb3J5TWFuYWdlciggQ3ZBbGxvY0Z1bmMgYWxsb2NfZnVuYyBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RnJlZUZ1bmMgZnJlZV9mdW5jIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlcmRhdGEgQ1ZfREVGQVVMVChOVUxMKSk7CisKKwordHlwZWRlZiBJcGxJbWFnZSogKENWX1NURENBTEwqIEN2X2lwbENyZWF0ZUltYWdlSGVhZGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQsaW50LGludCxjaGFyKixjaGFyKixpbnQsaW50LGludCxpbnQsaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElwbFJPSSosSXBsSW1hZ2UqLHZvaWQqLElwbFRpbGVJbmZvKik7Cit0eXBlZGVmIHZvaWQgKENWX1NURENBTEwqIEN2X2lwbEFsbG9jYXRlSW1hZ2VEYXRhKShJcGxJbWFnZSosaW50LGludCk7Cit0eXBlZGVmIHZvaWQgKENWX1NURENBTEwqIEN2X2lwbERlYWxsb2NhdGUpKElwbEltYWdlKixpbnQpOwordHlwZWRlZiBJcGxST0kqIChDVl9TVERDQUxMKiBDdl9pcGxDcmVhdGVST0kpKGludCxpbnQsaW50LGludCxpbnQpOwordHlwZWRlZiBJcGxJbWFnZSogKENWX1NURENBTEwqIEN2X2lwbENsb25lSW1hZ2UpKGNvbnN0IElwbEltYWdlKik7CisKKy8qIE1ha2VzIE9wZW5DViB1c2UgSVBMIGZ1bmN0aW9ucyBmb3IgSXBsSW1hZ2UgYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gKi8KK0NWQVBJKHZvaWQpIGN2U2V0SVBMQWxsb2NhdG9ycyggQ3ZfaXBsQ3JlYXRlSW1hZ2VIZWFkZXIgY3JlYXRlX2hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdl9pcGxBbGxvY2F0ZUltYWdlRGF0YSBhbGxvY2F0ZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2X2lwbERlYWxsb2NhdGUgZGVhbGxvY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdl9pcGxDcmVhdGVST0kgY3JlYXRlX3JvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdl9pcGxDbG9uZUltYWdlIGNsb25lX2ltYWdlICk7CisKKyNkZWZpbmUgQ1ZfVFVSTl9PTl9JUExfQ09NUEFUSUJJTElUWSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjdlNldElQTEFsbG9jYXRvcnMoIGlwbENyZWF0ZUltYWdlSGVhZGVyLCBpcGxBbGxvY2F0ZUltYWdlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlwbERlYWxsb2NhdGUsIGlwbENyZWF0ZVJPSSwgaXBsQ2xvbmVJbWFnZSApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgUGVyc2lzdGVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSGlnaC1sZXZlbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIG9wZW5zIGV4aXN0aW5nIG9yIGNyZWF0ZXMgbmV3IGZpbGUgc3RvcmFnZSAqLworQ1ZBUEkoQ3ZGaWxlU3RvcmFnZSopICBjdk9wZW5GaWxlU3RvcmFnZSggY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIG1lbXN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MgKTsKKworLyogY2xvc2VzIGZpbGUgc3RvcmFnZSBhbmQgZGVhbGxvY2F0ZXMgYnVmZmVycyAqLworQ1ZBUEkodm9pZCkgY3ZSZWxlYXNlRmlsZVN0b3JhZ2UoIEN2RmlsZVN0b3JhZ2UqKiBmcyApOworCisvKiByZXR1cm5zIGF0dHJpYnV0ZSB2YWx1ZSBvciAwIChOVUxMKSBpZiB0aGVyZSBpcyBubyBzdWNoIGF0dHJpYnV0ZSAqLworQ1ZBUEkoY29uc3QgY2hhciopIGN2QXR0clZhbHVlKCBjb25zdCBDdkF0dHJMaXN0KiBhdHRyLCBjb25zdCBjaGFyKiBhdHRyX25hbWUgKTsKKworLyogc3RhcnRzIHdyaXRpbmcgY29tcG91bmQgc3RydWN0dXJlIChtYXAgb3Igc2VxdWVuY2UpICovCitDVkFQSSh2b2lkKSBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RydWN0X2ZsYWdzLCBjb25zdCBjaGFyKiB0eXBlX25hbWUgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBdHRyTGlzdCBhdHRyaWJ1dGVzIENWX0RFRkFVTFQoY3ZBdHRyTGlzdCgpKSk7CisKKy8qIGZpbmlzaGVzIHdyaXRpbmcgY29tcG91bmQgc3RydWN0dXJlICovCitDVkFQSSh2b2lkKSBjdkVuZFdyaXRlU3RydWN0KCBDdkZpbGVTdG9yYWdlKiBmcyApOworCisvKiB3cml0ZXMgYW4gaW50ZWdlciAqLworQ1ZBUEkodm9pZCkgY3ZXcml0ZUludCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGludCB2YWx1ZSApOworCisvKiB3cml0ZXMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KK0NWQVBJKHZvaWQpIGN2V3JpdGVSZWFsKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlICk7CisKKy8qIHdyaXRlcyBhIHN0cmluZyAqLworQ1ZBUEkodm9pZCkgY3ZXcml0ZVN0cmluZyggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsIGludCBxdW90ZSBDVl9ERUZBVUxUKDApICk7CisKKy8qIHdyaXRlcyBhIGNvbW1lbnQgKi8KK0NWQVBJKHZvaWQpIGN2V3JpdGVDb21tZW50KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW9sX2NvbW1lbnQgKTsKKworLyogd3JpdGVzIGluc3RhbmNlIG9mIGEgc3RhbmRhcmQgdHlwZSAobWF0cml4LCBpbWFnZSwgc2VxdWVuY2UsIGdyYXBoIGV0Yy4pCisgICBvciB1c2VyLWRlZmluZWQgdHlwZSAqLworQ1ZBUEkodm9pZCkgY3ZXcml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdkF0dHJMaXN0IGF0dHJpYnV0ZXMgQ1ZfREVGQVVMVChjdkF0dHJMaXN0KCkpKTsKKworLyogc3RhcnRzIHRoZSBuZXh0IHN0cmVhbSAqLworQ1ZBUEkodm9pZCkgY3ZTdGFydE5leHRTdHJlYW0oIEN2RmlsZVN0b3JhZ2UqIGZzICk7CisKKy8qIGhlbHBlciBmdW5jdGlvbjogd3JpdGVzIG11bHRpcGxlIGludGVnZXIgb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycyAqLworQ1ZBUEkodm9pZCkgY3ZXcml0ZVJhd0RhdGEoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCB2b2lkKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGNvbnN0IGNoYXIqIGR0ICk7CisKKy8qIHJldHVybnMgdGhlIGhhc2ggZW50cnkgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGxpdGVyYWwga2V5IHN0cmluZyBvciAwCisgICBpZiB0aGVyZSBpcyBubyBzdWNoIGEga2V5IGluIHRoZSBzdG9yYWdlICovCitDVkFQSShDdlN0cmluZ0hhc2hOb2RlKikgY3ZHZXRIYXNoZWRLZXkoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gQ1ZfREVGQVVMVCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNyZWF0ZV9taXNzaW5nIENWX0RFRkFVTFQoMCkpOworCisvKiByZXR1cm5zIGZpbGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIG1hcAorICAgKGNvbGxlY3Rpb24gb2YgbmFtZWQgbm9kZXMpICovCitDVkFQSShDdkZpbGVOb2RlKikgY3ZHZXRSb290RmlsZU5vZGUoIGNvbnN0IEN2RmlsZVN0b3JhZ2UqIGZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdHJlYW1faW5kZXggQ1ZfREVGQVVMVCgwKSApOworCisvKiByZXR1cm5zIGZpbGUgbm9kZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5IHdpdGhpbiB0aGUgc3BlY2lmaWVkIG1hcAorICAgKGNvbGxlY3Rpb24gb2YgbmFtZWQgbm9kZXMpICovCitDVkFQSShDdkZpbGVOb2RlKikgY3ZHZXRGaWxlTm9kZSggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2U3RyaW5nSGFzaE5vZGUqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjcmVhdGVfbWlzc2luZyBDVl9ERUZBVUxUKDApICk7CisKKy8qIHRoaXMgaXMgYSBzbG93ZXIgdmVyc2lvbiBvZiBjdkdldEZpbGVOb2RlIHRoYXQgdGFrZXMgdGhlIGtleSBhcyBhIGxpdGVyYWwgc3RyaW5nICovCitDVkFQSShDdkZpbGVOb2RlKikgY3ZHZXRGaWxlTm9kZUJ5TmFtZSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkZpbGVOb2RlKiBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lICk7CisKK0NWX0lOTElORSBpbnQgY3ZSZWFkSW50KCBjb25zdCBDdkZpbGVOb2RlKiBub2RlLCBpbnQgZGVmYXVsdF92YWx1ZSBDVl9ERUZBVUxUKDApICkKK3sKKyAgICByZXR1cm4gIW5vZGUgPyBkZWZhdWx0X3ZhbHVlIDoKKyAgICAgICAgQ1ZfTk9ERV9JU19JTlQobm9kZS0+dGFnKSA/IG5vZGUtPmRhdGEuaSA6CisgICAgICAgIENWX05PREVfSVNfUkVBTChub2RlLT50YWcpID8gY3ZSb3VuZChub2RlLT5kYXRhLmYpIDogMHg3ZmZmZmZmZjsKK30KKworCitDVl9JTkxJTkUgaW50IGN2UmVhZEludEJ5TmFtZSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IEN2RmlsZU5vZGUqIG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBpbnQgZGVmYXVsdF92YWx1ZSBDVl9ERUZBVUxUKDApICkKK3sKKyAgICByZXR1cm4gY3ZSZWFkSW50KCBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbWFwLCBuYW1lICksIGRlZmF1bHRfdmFsdWUgKTsKK30KKworCitDVl9JTkxJTkUgZG91YmxlIGN2UmVhZFJlYWwoIGNvbnN0IEN2RmlsZU5vZGUqIG5vZGUsIGRvdWJsZSBkZWZhdWx0X3ZhbHVlIENWX0RFRkFVTFQoMC4pICkKK3sKKyAgICByZXR1cm4gIW5vZGUgPyBkZWZhdWx0X3ZhbHVlIDoKKyAgICAgICAgQ1ZfTk9ERV9JU19JTlQobm9kZS0+dGFnKSA/IChkb3VibGUpbm9kZS0+ZGF0YS5pIDoKKyAgICAgICAgQ1ZfTk9ERV9JU19SRUFMKG5vZGUtPnRhZykgPyBub2RlLT5kYXRhLmYgOiAxZTMwMDsKK30KKworCitDVl9JTkxJTkUgZG91YmxlIGN2UmVhZFJlYWxCeU5hbWUoIGNvbnN0IEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBDdkZpbGVOb2RlKiBtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lLCBkb3VibGUgZGVmYXVsdF92YWx1ZSBDVl9ERUZBVUxUKDAuKSApCit7CisgICAgcmV0dXJuIGN2UmVhZFJlYWwoIGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBtYXAsIG5hbWUgKSwgZGVmYXVsdF92YWx1ZSApOworfQorCisKK0NWX0lOTElORSBjb25zdCBjaGFyKiBjdlJlYWRTdHJpbmcoIGNvbnN0IEN2RmlsZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWZhdWx0X3ZhbHVlIENWX0RFRkFVTFQoTlVMTCkgKQoreworICAgIHJldHVybiAhbm9kZSA/IGRlZmF1bHRfdmFsdWUgOiBDVl9OT0RFX0lTX1NUUklORyhub2RlLT50YWcpID8gbm9kZS0+ZGF0YS5zdHIucHRyIDogMDsKK30KKworCitDVl9JTkxJTkUgY29uc3QgY2hhciogY3ZSZWFkU3RyaW5nQnlOYW1lKCBjb25zdCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgQ3ZGaWxlTm9kZSogbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogZGVmYXVsdF92YWx1ZSBDVl9ERUZBVUxUKE5VTEwpICkKK3sKKyAgICByZXR1cm4gY3ZSZWFkU3RyaW5nKCBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbWFwLCBuYW1lICksIGRlZmF1bHRfdmFsdWUgKTsKK30KKworCisvKiBkZWNvZGVzIHN0YW5kYXJkIG9yIHVzZXItZGVmaW5lZCBvYmplY3QgYW5kIHJldHVybnMgaXQgKi8KK0NWQVBJKHZvaWQqKSBjdlJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZBdHRyTGlzdCogYXR0cmlidXRlcyBDVl9ERUZBVUxUKE5VTEwpKTsKKworLyogZGVjb2RlcyBzdGFuZGFyZCBvciB1c2VyLWRlZmluZWQgb2JqZWN0IGFuZCByZXR1cm5zIGl0ICovCitDVl9JTkxJTkUgdm9pZCogY3ZSZWFkQnlOYW1lKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgQ3ZGaWxlTm9kZSogbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgQ3ZBdHRyTGlzdCogYXR0cmlidXRlcyBDVl9ERUZBVUxUKE5VTEwpICkKK3sKKyAgICByZXR1cm4gY3ZSZWFkKCBmcywgY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG1hcCwgbmFtZSApLCBhdHRyaWJ1dGVzICk7Cit9CisKKworLyogc3RhcnRzIHJlYWRpbmcgZGF0YSBmcm9tIHNlcXVlbmNlIG9yIHNjYWxhciBudW1lcmljIG5vZGUgKi8KK0NWQVBJKHZvaWQpIGN2U3RhcnRSZWFkUmF3RGF0YSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IEN2RmlsZU5vZGUqIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNlcVJlYWRlciogcmVhZGVyICk7CisKKy8qIHJlYWRzIG11bHRpcGxlIG51bWJlcnMgYW5kIHN0b3JlcyB0aGVtIHRvIGFycmF5ICovCitDVkFQSSh2b2lkKSBjdlJlYWRSYXdEYXRhU2xpY2UoIGNvbnN0IEN2RmlsZVN0b3JhZ2UqIGZzLCBDdlNlcVJlYWRlciogcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb3VudCwgdm9pZCogZHN0LCBjb25zdCBjaGFyKiBkdCApOworCisvKiBjb21iaW5hdGlvbiBvZiB0d28gcHJldmlvdXMgZnVuY3Rpb25zIGZvciBlYXNpZXIgcmVhZGluZyBvZiB3aG9sZSBzZXF1ZW5jZXMgKi8KK0NWQVBJKHZvaWQpIGN2UmVhZFJhd0RhdGEoIGNvbnN0IEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBDdkZpbGVOb2RlKiBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgY29uc3QgY2hhciogZHQgKTsKKworLyogd3JpdGVzIGEgY29weSBvZiBmaWxlIG5vZGUgdG8gZmlsZSBzdG9yYWdlICovCitDVkFQSSh2b2lkKSBjdldyaXRlRmlsZU5vZGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuZXdfbm9kZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2RmlsZU5vZGUqIG5vZGUsIGludCBlbWJlZCApOworCisvKiByZXR1cm5zIG5hbWUgb2YgZmlsZSBub2RlICovCitDVkFQSShjb25zdCBjaGFyKikgY3ZHZXRGaWxlTm9kZU5hbWUoIGNvbnN0IEN2RmlsZU5vZGUqIG5vZGUgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEFkZGluZyBvd24gdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWQVBJKHZvaWQpIGN2UmVnaXN0ZXJUeXBlKCBjb25zdCBDdlR5cGVJbmZvKiBpbmZvICk7CitDVkFQSSh2b2lkKSBjdlVucmVnaXN0ZXJUeXBlKCBjb25zdCBjaGFyKiB0eXBlX25hbWUgKTsKK0NWQVBJKEN2VHlwZUluZm8qKSBjdkZpcnN0VHlwZSh2b2lkKTsKK0NWQVBJKEN2VHlwZUluZm8qKSBjdkZpbmRUeXBlKCBjb25zdCBjaGFyKiB0eXBlX25hbWUgKTsKK0NWQVBJKEN2VHlwZUluZm8qKSBjdlR5cGVPZiggY29uc3Qgdm9pZCogc3RydWN0X3B0ciApOworCisvKiB1bml2ZXJzYWwgZnVuY3Rpb25zICovCitDVkFQSSh2b2lkKSBjdlJlbGVhc2UoIHZvaWQqKiBzdHJ1Y3RfcHRyICk7CitDVkFQSSh2b2lkKikgY3ZDbG9uZSggY29uc3Qgdm9pZCogc3RydWN0X3B0ciApOworCisvKiBzaW1wbGUgQVBJIGZvciByZWFkaW5nL3dyaXRpbmcgZGF0YSAqLworQ1ZBUEkodm9pZCkgY3ZTYXZlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3Qgdm9pZCogc3RydWN0X3B0ciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSBDVl9ERUZBVUxUKE5VTEwpLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBjb21tZW50IENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgIEN2QXR0ckxpc3QgYXR0cmlidXRlcyBDVl9ERUZBVUxUKGN2QXR0ckxpc3QoKSkpOworQ1ZBUEkodm9pZCopIGN2TG9hZCggY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIG1lbXN0b3JhZ2UgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgQ1ZfREVGQVVMVChOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiByZWFsX25hbWUgQ1ZfREVGQVVMVChOVUxMKSApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogTWVhc3VyaW5nIEV4ZWN1dGlvbiBUaW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaGVscGVyIGZ1bmN0aW9ucyBmb3IgUk5HIGluaXRpYWxpemF0aW9uIGFuZCBhY2N1cmF0ZSB0aW1lIG1lYXN1cmVtZW50OgorICAgdXNlcyBpbnRlcm5hbCBjbG9jayBjb3VudGVyIG9uIHg4NiAqLworQ1ZBUEkoaW50NjQpICBjdkdldFRpY2tDb3VudCggdm9pZCApOworQ1ZBUEkoZG91YmxlKSBjdkdldFRpY2tGcmVxdWVuY3koIHZvaWQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE11bHRpLVRocmVhZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHJldHJpZXZlL3NldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdXNlZCBpbiBPcGVuTVAgaW1wbGVtZW50YXRpb25zICovCitDVkFQSShpbnQpICBjdkdldE51bVRocmVhZHMoIHZvaWQgKTsKK0NWQVBJKHZvaWQpIGN2U2V0TnVtVGhyZWFkcyggaW50IHRocmVhZHMgQ1ZfREVGQVVMVCgwKSApOworLyogZ2V0IGluZGV4IG9mIHRoZSB0aHJlYWQgYmVpbmcgZXhlY3V0ZWQgKi8KK0NWQVBJKGludCkgIGN2R2V0VGhyZWFkTnVtKCB2b2lkICk7CisKKy8qKioqKioqKioqKioqKiogQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBiZXR0ZXIgaW50ZXJhY3Rpb24gd2l0aCBIaWdoR1VJICoqKioqKioqKioqKioqLworCit0eXBlZGVmIElwbEltYWdlKiAoQ1ZfQ0RFQ0wgKiBDdkxvYWRJbWFnZUZ1bmMpKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGNvbG9ybmVzcyApOwordHlwZWRlZiBDdk1hdCogKENWX0NERUNMICogQ3ZMb2FkSW1hZ2VNRnVuYykoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgY29sb3JuZXNzICk7Cit0eXBlZGVmIGludCAoQ1ZfQ0RFQ0wgKiBDdlNhdmVJbWFnZUZ1bmMpKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgQ3ZBcnIqIGltYWdlICk7Cit0eXBlZGVmIHZvaWQgKENWX0NERUNMICogQ3ZTaG93SW1hZ2VGdW5jKSggY29uc3QgY2hhciogd2luZG93bmFtZSwgY29uc3QgQ3ZBcnIqIGltYWdlICk7CisKK0NWQVBJKGludCkgY3ZTZXRJbWFnZUlPRnVuY3Rpb25zKCBDdkxvYWRJbWFnZUZ1bmMgX2xvYWRfaW1hZ2UsIEN2TG9hZEltYWdlTUZ1bmMgX2xvYWRfaW1hZ2VfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNhdmVJbWFnZUZ1bmMgX3NhdmVfaW1hZ2UsIEN2U2hvd0ltYWdlRnVuYyBfc2hvd19pbWFnZSApOworCisjZGVmaW5lIENWX1NFVF9JTUFHRV9JT19GVU5DVElPTlMoKSBcCisgICAgY3ZTZXRJbWFnZUlPRnVuY3Rpb25zKCBjdkxvYWRJbWFnZSwgY3ZMb2FkSW1hZ2VNLCBjdlNhdmVJbWFnZSwgY3ZTaG93SW1hZ2UgKQorCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKworI2luY2x1ZGUgImN4Y29yZS5ocHAiCisjZW5kaWYKKworI2VuZGlmIC8qX0NYQ09SRV9IXyovCmRpZmYgLS1naXQgYS9jeGNvcmUvaW5jbHVkZS9jeGNvcmUuaHBwIGIvY3hjb3JlL2luY2x1ZGUvY3hjb3JlLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmVmMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL2luY2x1ZGUvY3hjb3JlLmhwcApAQCAtMCwwICsxLDM3NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKworI2lmbmRlZiBfQ1hDT1JFX0hQUF8KKyNkZWZpbmUgX0NYQ09SRV9IUFBfCisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZJbWFnZQoreworcHVibGljOgorICAgIEN2SW1hZ2UoKSA6IGltYWdlKDApLCByZWZjb3VudCgwKSB7fQorICAgIEN2SW1hZ2UoIEN2U2l6ZSBzaXplLCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApCisgICAgeworICAgICAgICBpbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIHNpemUsIGRlcHRoLCBjaGFubmVscyApOworICAgICAgICByZWZjb3VudCA9IGltYWdlID8gbmV3IGludCgxKSA6IDA7CisgICAgfQorCisgICAgQ3ZJbWFnZSggSXBsSW1hZ2UqIGltZyApIDogaW1hZ2UoaW1nKQorICAgIHsKKyAgICAgICAgcmVmY291bnQgPSBpbWFnZSA/IG5ldyBpbnQoMSkgOiAwOworICAgIH0KKworICAgIEN2SW1hZ2UoIGNvbnN0IEN2SW1hZ2UmIGltZyApIDogaW1hZ2UoaW1nLmltYWdlKSwgcmVmY291bnQoaW1nLnJlZmNvdW50KQorICAgIHsKKyAgICAgICAgaWYoIHJlZmNvdW50ICkgKysoKnJlZmNvdW50KTsKKyAgICB9CisKKyAgICBDdkltYWdlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogaW1nbmFtZT0wLCBpbnQgY29sb3I9LTEgKSA6IGltYWdlKDApLCByZWZjb3VudCgwKQorICAgIHsgbG9hZCggZmlsZW5hbWUsIGltZ25hbWUsIGNvbG9yICk7IH0KKworICAgIEN2SW1hZ2UoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBtYXBuYW1lLCBjb25zdCBjaGFyKiBpbWduYW1lICkgOiBpbWFnZSgwKSwgcmVmY291bnQoMCkKKyAgICB7IHJlYWQoIGZzLCBtYXBuYW1lLCBpbWduYW1lICk7IH0KKworICAgIEN2SW1hZ2UoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBzZXFuYW1lLCBpbnQgaWR4ICkgOiBpbWFnZSgwKSwgcmVmY291bnQoMCkKKyAgICB7IHJlYWQoIGZzLCBzZXFuYW1lLCBpZHggKTsgfQorCisgICAgfkN2SW1hZ2UoKQorICAgIHsKKyAgICAgICAgaWYoIHJlZmNvdW50ICYmICEoLS0qcmVmY291bnQpICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZpbWFnZSApOworICAgICAgICAgICAgZGVsZXRlIHJlZmNvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgQ3ZJbWFnZSBjbG9uZSgpIHsgcmV0dXJuIEN2SW1hZ2UoaW1hZ2UgPyBjdkNsb25lSW1hZ2UoaW1hZ2UpIDogMCk7IH0KKworICAgIHZvaWQgY3JlYXRlKCBDdlNpemUgc2l6ZSwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKQorICAgIHsKKyAgICAgICAgaWYoICFpbWFnZSB8fCAhcmVmY291bnQgfHwKKyAgICAgICAgICAgIGltYWdlLT53aWR0aCAhPSBzaXplLndpZHRoIHx8IGltYWdlLT5oZWlnaHQgIT0gc2l6ZS5oZWlnaHQgfHwKKyAgICAgICAgICAgIGltYWdlLT5kZXB0aCAhPSBkZXB0aCB8fCBpbWFnZS0+bkNoYW5uZWxzICE9IGNoYW5uZWxzICkKKyAgICAgICAgICAgIGF0dGFjaCggY3ZDcmVhdGVJbWFnZSggc2l6ZSwgZGVwdGgsIGNoYW5uZWxzICkpOworICAgIH0KKworICAgIHZvaWQgcmVsZWFzZSgpIHsgZGV0YWNoKCk7IH0KKyAgICB2b2lkIGNsZWFyKCkgeyBkZXRhY2goKTsgfQorCisgICAgdm9pZCBhdHRhY2goIElwbEltYWdlKiBpbWcsIGJvb2wgdXNlX3JlZmNvdW50PXRydWUgKQorICAgIHsKKyAgICAgICAgaWYoIHJlZmNvdW50ICYmIC0tKnJlZmNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltYWdlICk7CisgICAgICAgICAgICBkZWxldGUgcmVmY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaW1hZ2UgPSBpbWc7CisgICAgICAgIHJlZmNvdW50ID0gdXNlX3JlZmNvdW50ICYmIGltYWdlID8gbmV3IGludCgxKSA6IDA7CisgICAgfQorCisgICAgdm9pZCBkZXRhY2goKQorICAgIHsKKyAgICAgICAgaWYoIHJlZmNvdW50ICYmIC0tKnJlZmNvdW50ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltYWdlICk7CisgICAgICAgICAgICBkZWxldGUgcmVmY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaW1hZ2UgPSAwOworICAgICAgICByZWZjb3VudCA9IDA7CisgICAgfQorCisgICAgYm9vbCBsb2FkKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogaW1nbmFtZT0wLCBpbnQgY29sb3I9LTEgKTsKKyAgICBib29sIHJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBtYXBuYW1lLCBjb25zdCBjaGFyKiBpbWduYW1lICk7CisgICAgYm9vbCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogc2VxbmFtZSwgaW50IGlkeCApOworICAgIHZvaWQgc2F2ZSggY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGltZ25hbWUgKTsKKyAgICB2b2lkIHdyaXRlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogaW1nbmFtZSApOworCisgICAgdm9pZCBzaG93KCBjb25zdCBjaGFyKiB3aW5kb3dfbmFtZSApOworICAgIGJvb2wgaXNfdmFsaWQoKSB7IHJldHVybiBpbWFnZSAhPSAwOyB9CisKKyAgICBpbnQgd2lkdGgoKSBjb25zdCB7IHJldHVybiBpbWFnZSA/IGltYWdlLT53aWR0aCA6IDA7IH0KKyAgICBpbnQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gaW1hZ2UgPyBpbWFnZS0+aGVpZ2h0IDogMDsgfQorCisgICAgQ3ZTaXplIHNpemUoKSBjb25zdCB7IHJldHVybiBpbWFnZSA/IGN2U2l6ZShpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQpIDogY3ZTaXplKDAsMCk7IH0KKworICAgIEN2U2l6ZSByb2lfc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIWltYWdlID8gY3ZTaXplKDAsMCkgOgorICAgICAgICAgICAgIWltYWdlLT5yb2kgPyBjdlNpemUoaW1hZ2UtPndpZHRoLGltYWdlLT5oZWlnaHQpIDoKKyAgICAgICAgICAgIGN2U2l6ZShpbWFnZS0+cm9pLT53aWR0aCwgaW1hZ2UtPnJvaS0+aGVpZ2h0KTsKKyAgICB9CisKKyAgICBDdlJlY3Qgcm9pKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhaW1hZ2UgPyBjdlJlY3QoMCwwLDAsMCkgOgorICAgICAgICAgICAgIWltYWdlLT5yb2kgPyBjdlJlY3QoMCwwLGltYWdlLT53aWR0aCxpbWFnZS0+aGVpZ2h0KSA6CisgICAgICAgICAgICBjdlJlY3QoaW1hZ2UtPnJvaS0+eE9mZnNldCxpbWFnZS0+cm9pLT55T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGltYWdlLT5yb2ktPndpZHRoLGltYWdlLT5yb2ktPmhlaWdodCk7CisgICAgfQorCisgICAgaW50IGNvaSgpIGNvbnN0IHsgcmV0dXJuICFpbWFnZSB8fCAhaW1hZ2UtPnJvaSA/IDAgOiBpbWFnZS0+cm9pLT5jb2k7IH0KKworICAgIHZvaWQgc2V0X3JvaShDdlJlY3Qgcm9pKSB7IGN2U2V0SW1hZ2VST0koaW1hZ2Uscm9pKTsgfQorICAgIHZvaWQgcmVzZXRfcm9pKCkgeyBjdlJlc2V0SW1hZ2VST0koaW1hZ2UpOyB9CisgICAgdm9pZCBzZXRfY29pKGludCBjb2kpIHsgY3ZTZXRJbWFnZUNPSShpbWFnZSxjb2kpOyB9CisgICAgaW50IGRlcHRoKCkgY29uc3QgeyByZXR1cm4gaW1hZ2UgPyBpbWFnZS0+ZGVwdGggOiAwOyB9CisgICAgaW50IGNoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gaW1hZ2UgPyBpbWFnZS0+bkNoYW5uZWxzIDogMDsgfQorICAgIGludCBwaXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGltYWdlID8gKChpbWFnZS0+ZGVwdGggJiAyNTUpPj4zKSppbWFnZS0+bkNoYW5uZWxzIDogMDsgfQorCisgICAgdWNoYXIqIGRhdGEoKSB7IHJldHVybiBpbWFnZSA/ICh1Y2hhciopaW1hZ2UtPmltYWdlRGF0YSA6IDA7IH0KKyAgICBjb25zdCB1Y2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGltYWdlID8gKGNvbnN0IHVjaGFyKilpbWFnZS0+aW1hZ2VEYXRhIDogMDsgfQorICAgIGludCBzdGVwKCkgY29uc3QgeyByZXR1cm4gaW1hZ2UgPyBpbWFnZS0+d2lkdGhTdGVwIDogMDsgfQorICAgIGludCBvcmlnaW4oKSBjb25zdCB7IHJldHVybiBpbWFnZSA/IGltYWdlLT5vcmlnaW4gOiAwOyB9CisKKyAgICB1Y2hhciogcm9pX3JvdyhpbnQgeSkKKyAgICB7CisgICAgICAgIGFzc2VydCgwPD15KTsKKyAgICAgICAgYXNzZXJ0KCFpbWFnZSA/CisgICAgICAgICAgICAgICAgMSA6IGltYWdlLT5yb2kgPworICAgICAgICAgICAgICAgIHk8aW1hZ2UtPnJvaS0+aGVpZ2h0IDogeTxpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiAhaW1hZ2UgPyAwIDoKKyAgICAgICAgICAgICFpbWFnZS0+cm9pID8KKyAgICAgICAgICAgICAgICAodWNoYXIqKShpbWFnZS0+aW1hZ2VEYXRhICsgeSppbWFnZS0+d2lkdGhTdGVwKSA6CisgICAgICAgICAgICAgICAgKHVjaGFyKikoaW1hZ2UtPmltYWdlRGF0YSArICh5K2ltYWdlLT5yb2ktPnlPZmZzZXQpKmltYWdlLT53aWR0aFN0ZXAgKworICAgICAgICAgICAgICAgIGltYWdlLT5yb2ktPnhPZmZzZXQqKChpbWFnZS0+ZGVwdGggJiAyNTUpPj4zKSppbWFnZS0+bkNoYW5uZWxzKTsKKyAgICB9CisKKyAgICBjb25zdCB1Y2hhciogcm9pX3JvdyhpbnQgeSkgY29uc3QKKyAgICB7CisgICAgICAgIGFzc2VydCgwPD15KTsKKyAgICAgICAgYXNzZXJ0KCFpbWFnZSA/CisgICAgICAgICAgICAgICAgMSA6IGltYWdlLT5yb2kgPworICAgICAgICAgICAgICAgIHk8aW1hZ2UtPnJvaS0+aGVpZ2h0IDogeTxpbWFnZS0+aGVpZ2h0KTsgCisKKyAgICAgICAgcmV0dXJuICFpbWFnZSA/IDAgOgorICAgICAgICAgICAgIWltYWdlLT5yb2kgPworICAgICAgICAgICAgICAgIChjb25zdCB1Y2hhciopKGltYWdlLT5pbWFnZURhdGEgKyB5KmltYWdlLT53aWR0aFN0ZXApIDoKKyAgICAgICAgICAgICAgICAoY29uc3QgdWNoYXIqKShpbWFnZS0+aW1hZ2VEYXRhICsgKHkraW1hZ2UtPnJvaS0+eU9mZnNldCkqaW1hZ2UtPndpZHRoU3RlcCArCisgICAgICAgICAgICAgICAgaW1hZ2UtPnJvaS0+eE9mZnNldCooKGltYWdlLT5kZXB0aCAmIDI1NSk+PjMpKmltYWdlLT5uQ2hhbm5lbHMpOworICAgIH0KKworICAgIG9wZXJhdG9yIGNvbnN0IElwbEltYWdlKiAoKSBjb25zdCB7IHJldHVybiBpbWFnZTsgfQorICAgIG9wZXJhdG9yIElwbEltYWdlKiAoKSB7IHJldHVybiBpbWFnZTsgfQorCisgICAgQ3ZJbWFnZSYgb3BlcmF0b3IgPSAoY29uc3QgQ3ZJbWFnZSYgaW1nKQorICAgIHsKKyAgICAgICAgaWYoIGltZy5yZWZjb3VudCApCisgICAgICAgICAgICArKyppbWcucmVmY291bnQ7CisgICAgICAgIGlmKCByZWZjb3VudCAmJiAhKC0tKnJlZmNvdW50KSApCisgICAgICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltYWdlICk7CisgICAgICAgIGltYWdlPWltZy5pbWFnZTsKKyAgICAgICAgcmVmY291bnQ9aW1nLnJlZmNvdW50OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgSXBsSW1hZ2UqIGltYWdlOworICAgIGludCogcmVmY291bnQ7Cit9OworCisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZNYXRyaXgKK3sKK3B1YmxpYzoKKyAgICBDdk1hdHJpeCgpIDogbWF0cml4KDApIHt9CisgICAgQ3ZNYXRyaXgoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUgKQorICAgIHsgbWF0cml4ID0gY3ZDcmVhdGVNYXQoIHJvd3MsIGNvbHMsIHR5cGUgKTsgfQorCisgICAgQ3ZNYXRyaXgoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUsIEN2TWF0KiBoZHIsCisgICAgICAgICAgICAgIHZvaWQqIGRhdGE9MCwgaW50IHN0ZXA9Q1ZfQVVUT1NURVAgKQorICAgIHsgbWF0cml4ID0gY3ZJbml0TWF0SGVhZGVyKCBoZHIsIHJvd3MsIGNvbHMsIHR5cGUsIGRhdGEsIHN0ZXAgKTsgfQorCisgICAgQ3ZNYXRyaXgoIGludCByb3dzLCBpbnQgY29scywgaW50IHR5cGUsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgYm9vbCBhbGxvY19kYXRhPXRydWUgKTsKKworICAgIEN2TWF0cml4KCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlLCB2b2lkKiBkYXRhLCBpbnQgc3RlcD1DVl9BVVRPU1RFUCApCisgICAgeyBtYXRyaXggPSBjdkNyZWF0ZU1hdEhlYWRlciggcm93cywgY29scywgdHlwZSApOworICAgICAgY3ZTZXREYXRhKCBtYXRyaXgsIGRhdGEsIHN0ZXAgKTsgfQorCisgICAgQ3ZNYXRyaXgoIEN2TWF0KiBtICkKKyAgICB7IG1hdHJpeCA9IG07IH0KKworICAgIEN2TWF0cml4KCBjb25zdCBDdk1hdHJpeCYgbSApCisgICAgeworICAgICAgICBtYXRyaXggPSBtLm1hdHJpeDsKKyAgICAgICAgYWRkcmVmKCk7CisgICAgfQorCisgICAgQ3ZNYXRyaXgoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBtYXRuYW1lPTAsIGludCBjb2xvcj0tMSApIDogbWF0cml4KDApCisgICAgeyAgbG9hZCggZmlsZW5hbWUsIG1hdG5hbWUsIGNvbG9yICk7IH0KKworICAgIEN2TWF0cml4KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbWFwbmFtZSwgY29uc3QgY2hhciogbWF0bmFtZSApIDogbWF0cml4KDApCisgICAgeyAgcmVhZCggZnMsIG1hcG5hbWUsIG1hdG5hbWUgKTsgfQorCisgICAgQ3ZNYXRyaXgoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBzZXFuYW1lLCBpbnQgaWR4ICkgOiBtYXRyaXgoMCkKKyAgICB7ICByZWFkKCBmcywgc2VxbmFtZSwgaWR4ICk7IH0KKworICAgIH5Ddk1hdHJpeCgpCisgICAgeworICAgICAgICByZWxlYXNlKCk7CisgICAgfQorCisgICAgQ3ZNYXRyaXggY2xvbmUoKSB7IHJldHVybiBDdk1hdHJpeChtYXRyaXggPyBjdkNsb25lTWF0KG1hdHJpeCkgOiAwKTsgfQorCisgICAgdm9pZCBzZXQoIEN2TWF0KiBtLCBib29sIGFkZF9yZWYgKQorICAgIHsKKyAgICAgICAgcmVsZWFzZSgpOworICAgICAgICBtYXRyaXggPSBtOworICAgICAgICBpZiggYWRkX3JlZiApCisgICAgICAgICAgICBhZGRyZWYoKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZSggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSApCisgICAgeworICAgICAgICBpZiggIW1hdHJpeCB8fCAhbWF0cml4LT5yZWZjb3VudCB8fAorICAgICAgICAgICAgbWF0cml4LT5yb3dzICE9IHJvd3MgfHwgbWF0cml4LT5jb2xzICE9IGNvbHMgfHwKKyAgICAgICAgICAgIENWX01BVF9UWVBFKG1hdHJpeC0+dHlwZSkgIT0gdHlwZSApCisgICAgICAgICAgICBzZXQoIGN2Q3JlYXRlTWF0KCByb3dzLCBjb2xzLCB0eXBlICksIGZhbHNlICk7CisgICAgfQorCisgICAgdm9pZCBhZGRyZWYoKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYoIG1hdHJpeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtYXRyaXgtPmhkcl9yZWZjb3VudCApCisgICAgICAgICAgICAgICAgKyttYXRyaXgtPmhkcl9yZWZjb3VudDsKKyAgICAgICAgICAgIGVsc2UgaWYoIG1hdHJpeC0+cmVmY291bnQgKQorICAgICAgICAgICAgICAgICsrKm1hdHJpeC0+cmVmY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2UoKQorICAgIHsKKyAgICAgICAgaWYoIG1hdHJpeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtYXRyaXgtPmhkcl9yZWZjb3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIC0tbWF0cml4LT5oZHJfcmVmY291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJm1hdHJpeCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbWF0cml4LT5yZWZjb3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIC0tKm1hdHJpeC0+cmVmY291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGN2RnJlZSggJm1hdHJpeC0+cmVmY291bnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hdHJpeCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkKKyAgICB7CisgICAgICAgIHJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBib29sIGxvYWQoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBtYXRuYW1lPTAsIGludCBjb2xvcj0tMSApOworICAgIGJvb2wgcmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG1hcG5hbWUsIGNvbnN0IGNoYXIqIG1hdG5hbWUgKTsKKyAgICBib29sIHJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBzZXFuYW1lLCBpbnQgaWR4ICk7CisgICAgdm9pZCBzYXZlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogbWF0bmFtZSApOworICAgIHZvaWQgd3JpdGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBtYXRuYW1lICk7CisKKyAgICB2b2lkIHNob3coIGNvbnN0IGNoYXIqIHdpbmRvd19uYW1lICk7CisKKyAgICBib29sIGlzX3ZhbGlkKCkgeyByZXR1cm4gbWF0cml4ICE9IDA7IH0KKworICAgIGludCByb3dzKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gbWF0cml4LT5yb3dzIDogMDsgfQorICAgIGludCBjb2xzKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gbWF0cml4LT5jb2xzIDogMDsgfQorCisgICAgQ3ZTaXplIHNpemUoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICFtYXRyaXggPyBjdlNpemUoMCwwKSA6IGN2U2l6ZShtYXRyaXgtPnJvd3MsbWF0cml4LT5jb2xzKTsKKyAgICB9CisKKyAgICBpbnQgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1hdHJpeCA/IENWX01BVF9UWVBFKG1hdHJpeC0+dHlwZSkgOiAwOyB9CisgICAgaW50IGRlcHRoKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gQ1ZfTUFUX0RFUFRIKG1hdHJpeC0+dHlwZSkgOiAwOyB9CisgICAgaW50IGNoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gQ1ZfTUFUX0NOKG1hdHJpeC0+dHlwZSkgOiAwOyB9CisgICAgaW50IHBpeF9zaXplKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gQ1ZfRUxFTV9TSVpFKG1hdHJpeC0+dHlwZSkgOiAwOyB9CisKKyAgICB1Y2hhciogZGF0YSgpIHsgcmV0dXJuIG1hdHJpeCA/IG1hdHJpeC0+ZGF0YS5wdHIgOiAwOyB9CisgICAgY29uc3QgdWNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBtYXRyaXggPyBtYXRyaXgtPmRhdGEucHRyIDogMDsgfQorICAgIGludCBzdGVwKCkgY29uc3QgeyByZXR1cm4gbWF0cml4ID8gbWF0cml4LT5zdGVwIDogMDsgfQorCisgICAgdm9pZCBzZXRfZGF0YSggdm9pZCogZGF0YSwgaW50IHN0ZXA9Q1ZfQVVUT1NURVAgKQorICAgIHsgY3ZTZXREYXRhKCBtYXRyaXgsIGRhdGEsIHN0ZXAgKTsgfQorCisgICAgdWNoYXIqIHJvdyhpbnQgaSkgeyByZXR1cm4gIW1hdHJpeCA/IDAgOiBtYXRyaXgtPmRhdGEucHRyICsgaSptYXRyaXgtPnN0ZXA7IH0KKyAgICBjb25zdCB1Y2hhciogcm93KGludCBpKSBjb25zdAorICAgIHsgcmV0dXJuICFtYXRyaXggPyAwIDogbWF0cml4LT5kYXRhLnB0ciArIGkqbWF0cml4LT5zdGVwOyB9CisKKyAgICBvcGVyYXRvciBjb25zdCBDdk1hdCogKCkgY29uc3QgeyByZXR1cm4gbWF0cml4OyB9CisgICAgb3BlcmF0b3IgQ3ZNYXQqICgpIHsgcmV0dXJuIG1hdHJpeDsgfQorCisgICAgQ3ZNYXRyaXgmIG9wZXJhdG9yID0gKGNvbnN0IEN2TWF0cml4JiBfbSkKKyAgICB7CisgICAgICAgIF9tLmFkZHJlZigpOworICAgICAgICByZWxlYXNlKCk7CisgICAgICAgIG1hdHJpeCA9IF9tLm1hdHJpeDsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEN2TWF0KiBtYXRyaXg7Cit9OworCisKKy8vIGNsYXNzZXMgZm9yIGF1dG9tYXRpYyBtb2R1bGUvUlRUSSBkYXRhIHJlZ2lzdHJhdGlvbi91bnJlZ2lzdHJhdGlvbgorc3RydWN0IENWX0VYUE9SVFMgQ3ZNb2R1bGUKK3sKKyAgICBDdk1vZHVsZSggQ3ZNb2R1bGVJbmZvKiBfaW5mbyApOworICAgIH5Ddk1vZHVsZSgpOworICAgIEN2TW9kdWxlSW5mbyogaW5mbzsKKworICAgIHN0YXRpYyBDdk1vZHVsZUluZm8qIGZpcnN0OworICAgIHN0YXRpYyBDdk1vZHVsZUluZm8qIGxhc3Q7Cit9OworCitzdHJ1Y3QgQ1ZfRVhQT1JUUyBDdlR5cGUKK3sKKyAgICBDdlR5cGUoIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSwKKyAgICAgICAgICAgIEN2SXNJbnN0YW5jZUZ1bmMgaXNfaW5zdGFuY2UsIEN2UmVsZWFzZUZ1bmMgcmVsZWFzZT0wLAorICAgICAgICAgICAgQ3ZSZWFkRnVuYyByZWFkPTAsIEN2V3JpdGVGdW5jIHdyaXRlPTAsIEN2Q2xvbmVGdW5jIGNsb25lPTAgKTsKKyAgICB+Q3ZUeXBlKCk7CisgICAgQ3ZUeXBlSW5mbyogaW5mbzsKKworICAgIHN0YXRpYyBDdlR5cGVJbmZvKiBmaXJzdDsKKyAgICBzdGF0aWMgQ3ZUeXBlSW5mbyogbGFzdDsKK307CisKKyNlbmRpZiAvKl9DWENPUkVfSFBQXyovCmRpZmYgLS1naXQgYS9jeGNvcmUvaW5jbHVkZS9jeGVycm9yLmggYi9jeGNvcmUvaW5jbHVkZS9jeGVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0MDExYQotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9pbmNsdWRlL2N4ZXJyb3IuaApAQCAtMCwwICsxLDE4OSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NYQ09SRV9FUlJPUl9IXworI2RlZmluZSBfQ1hDT1JFX0VSUk9SX0hfCisKKy8qKioqKioqKioqKipCZWxvdyBpcyBkZWNsYXJhdGlvbiBvZiBlcnJvciBoYW5kbGluZyBzdHVmZiBpbiBQTFN1aXRlIG1hbm5lcioqLworCit0eXBlZGVmIGludCBDVlN0YXR1czsKKworLyogdGhpcyBwYXJ0IG9mIENWU3RhdHVzIGlzIGNvbXBhdGlibGUgd2l0aCBJUExTdGF0dXMgCisgIFNvbWUgb2YgYmVsb3cgc3ltYm9scyBhcmUgbm90IFt5ZXRdIHVzZWQgaW4gT3BlbkNWCisqLworI2RlZmluZSBDVl9TdHNPayAgICAgICAgICAgICAgICAgICAgMCAgLyogZXZlcml0aGluZyBpcyBvayAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDVl9TdHNCYWNrVHJhY2UgICAgICAgICAgICAtMSAgLyogcHNldWRvIGVycm9yIGZvciBiYWNrIHRyYWNlICAgICAqLworI2RlZmluZSBDVl9TdHNFcnJvciAgICAgICAgICAgICAgICAtMiAgLyogdW5rbm93biAvdW5zcGVjaWZpZWQgZXJyb3IgICAgICAqLworI2RlZmluZSBDVl9TdHNJbnRlcm5hbCAgICAgICAgICAgICAtMyAgLyogaW50ZXJuYWwgZXJyb3IgKGJhZCBzdGF0ZSkgICAgICAqLworI2RlZmluZSBDVl9TdHNOb01lbSAgICAgICAgICAgICAgICAtNCAgLyogaW5zdWZmaWNpZW50IG1lbW9yeSAgICAgICAgICAgICAqLworI2RlZmluZSBDVl9TdHNCYWRBcmcgICAgICAgICAgICAgICAtNSAgLyogZnVuY3Rpb24gYXJnL3BhcmFtIGlzIGJhZCAgICAgICAqLworI2RlZmluZSBDVl9TdHNCYWRGdW5jICAgICAgICAgICAgICAtNiAgLyogdW5zdXBwb3J0ZWQgZnVuY3Rpb24gICAgICAgICAgICAqLworI2RlZmluZSBDVl9TdHNOb0NvbnYgICAgICAgICAgICAgICAtNyAgLyogaXRlci4gZGlkbid0IGNvbnZlcmdlICAgICAgICAgICAqLworI2RlZmluZSBDVl9TdHNBdXRvVHJhY2UgICAgICAgICAgICAtOCAgLyogdHJhY2luZyAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisjZGVmaW5lIENWX0hlYWRlcklzTnVsbCAgICAgICAgICAgIC05ICAvKiBpbWFnZSBoZWFkZXIgaXMgTlVMTCAgICAgICAgICAgICovCisjZGVmaW5lIENWX0JhZEltYWdlU2l6ZSAgICAgICAgICAgIC0xMCAvKiBpbWFnZSBzaXplIGlzIGludmFsaWQgICAgICAgICAgICovCisjZGVmaW5lIENWX0JhZE9mZnNldCAgICAgICAgICAgICAgIC0xMSAvKiBvZmZzZXQgaXMgaW52YWxpZCAgICAgICAgICAgICAgICovCisjZGVmaW5lIENWX0JhZERhdGFQdHIgICAgICAgICAgICAgIC0xMiAvKiovCisjZGVmaW5lIENWX0JhZFN0ZXAgICAgICAgICAgICAgICAgIC0xMyAvKiovCisjZGVmaW5lIENWX0JhZE1vZGVsT3JDaFNlcSAgICAgICAgIC0xNCAvKiovCisjZGVmaW5lIENWX0JhZE51bUNoYW5uZWxzICAgICAgICAgIC0xNSAvKiovCisjZGVmaW5lIENWX0JhZE51bUNoYW5uZWwxVSAgICAgICAgIC0xNiAvKiovCisjZGVmaW5lIENWX0JhZERlcHRoICAgICAgICAgICAgICAgIC0xNyAvKiovCisjZGVmaW5lIENWX0JhZEFscGhhQ2hhbm5lbCAgICAgICAgIC0xOCAvKiovCisjZGVmaW5lIENWX0JhZE9yZGVyICAgICAgICAgICAgICAgIC0xOSAvKiovCisjZGVmaW5lIENWX0JhZE9yaWdpbiAgICAgICAgICAgICAgIC0yMCAvKiovCisjZGVmaW5lIENWX0JhZEFsaWduICAgICAgICAgICAgICAgIC0yMSAvKiovCisjZGVmaW5lIENWX0JhZENhbGxCYWNrICAgICAgICAgICAgIC0yMiAvKiovCisjZGVmaW5lIENWX0JhZFRpbGVTaXplICAgICAgICAgICAgIC0yMyAvKiovCisjZGVmaW5lIENWX0JhZENPSSAgICAgICAgICAgICAgICAgIC0yNCAvKiovCisjZGVmaW5lIENWX0JhZFJPSVNpemUgICAgICAgICAgICAgIC0yNSAvKiovCisKKyNkZWZpbmUgQ1ZfTWFza0lzVGlsZWQgICAgICAgICAgICAgLTI2IC8qKi8KKworI2RlZmluZSBDVl9TdHNOdWxsUHRyICAgICAgICAgICAgICAgIC0yNyAvKiBudWxsIHBvaW50ZXIgKi8KKyNkZWZpbmUgQ1ZfU3RzVmVjTGVuZ3RoRXJyICAgICAgICAgICAtMjggLyogaW5jb3JyZWN0IHZlY3RvciBsZW5ndGggKi8KKyNkZWZpbmUgQ1ZfU3RzRmlsdGVyU3RydWN0Q29udGVudEVyciAtMjkgLyogaW5jb3JyLiBmaWx0ZXIgc3RydWN0dXJlIGNvbnRlbnQgKi8KKyNkZWZpbmUgQ1ZfU3RzS2VybmVsU3RydWN0Q29udGVudEVyciAtMzAgLyogaW5jb3JyLiB0cmFuc2Zvcm0ga2VybmVsIGNvbnRlbnQgKi8KKyNkZWZpbmUgQ1ZfU3RzRmlsdGVyT2Zmc2V0RXJyICAgICAgICAtMzEgLyogaW5jb3JyZWN0IGZpbHRlciBvZnNldCB2YWx1ZSAqLworCisvKmV4dHJhIGZvciBDViAqLworI2RlZmluZSBDVl9TdHNCYWRTaXplICAgICAgICAgICAgICAgIC0yMDEgLyogdGhlIGlucHV0L291dHB1dCBzdHJ1Y3R1cmUgc2l6ZSBpcyBpbmNvcnJlY3QgICovCisjZGVmaW5lIENWX1N0c0RpdkJ5WmVybyAgICAgICAgICAgICAgLTIwMiAvKiBkaXZpc2lvbiBieSB6ZXJvICovCisjZGVmaW5lIENWX1N0c0lucGxhY2VOb3RTdXBwb3J0ZWQgICAgLTIwMyAvKiBpbi1wbGFjZSBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCAqLworI2RlZmluZSBDVl9TdHNPYmplY3ROb3RGb3VuZCAgICAgICAgIC0yMDQgLyogcmVxdWVzdCBjYW4ndCBiZSBjb21wbGV0ZWQgKi8KKyNkZWZpbmUgQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyAgICAgICAtMjA1IC8qIGZvcm1hdHMgb2YgaW5wdXQvb3V0cHV0IGFycmF5cyBkaWZmZXIgKi8KKyNkZWZpbmUgQ1ZfU3RzQmFkRmxhZyAgICAgICAgICAgICAgICAtMjA2IC8qIGZsYWcgaXMgd3Jvbmcgb3Igbm90IHN1cHBvcnRlZCAqLyAgCisjZGVmaW5lIENWX1N0c0JhZFBvaW50ICAgICAgICAgICAgICAgLTIwNyAvKiBiYWQgQ3ZQb2ludCAqLyAKKyNkZWZpbmUgQ1ZfU3RzQmFkTWFzayAgICAgICAgICAgICAgICAtMjA4IC8qIGJhZCBmb3JtYXQgb2YgbWFzayAobmVpdGhlciA4dUMxIG5vciA4c0MxKSovCisjZGVmaW5lIENWX1N0c1VubWF0Y2hlZFNpemVzICAgICAgICAgLTIwOSAvKiBzaXplcyBvZiBpbnB1dC9vdXRwdXQgc3RydWN0dXJlcyBkbyBub3QgbWF0Y2ggKi8KKyNkZWZpbmUgQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQgICAgICAtMjEwIC8qIHRoZSBkYXRhIGZvcm1hdC90eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGZ1bmN0aW9uKi8KKyNkZWZpbmUgQ1ZfU3RzT3V0T2ZSYW5nZSAgICAgICAgICAgICAtMjExIC8qIHNvbWUgb2YgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICovCisjZGVmaW5lIENWX1N0c1BhcnNlRXJyb3IgICAgICAgICAgICAgLTIxMiAvKiBpbnZhbGlkIHN5bnRheC9zdHJ1Y3R1cmUgb2YgdGhlIHBhcnNlZCBmaWxlICovCisjZGVmaW5lIENWX1N0c05vdEltcGxlbWVudGVkICAgICAgICAgLTIxMyAvKiB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uL2ZlYXR1cmUgaXMgbm90IGltcGxlbWVudGVkICovCisjZGVmaW5lIENWX1N0c0JhZE1lbUJsb2NrICAgICAgICAgICAgLTIxNCAvKiBhbiBhbGxvY2F0ZWQgYmxvY2sgaGFzIGJlZW4gY29ycnVwdGVkICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogRXJyb3IgaGFuZGxpbmcgTWFjcm9zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIE9QRU5DVl9FUlJPUihzdGF0dXMsZnVuYyxjb250ZXh0KSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjdkVycm9yKChzdGF0dXMpLChmdW5jKSwoY29udGV4dCksX19GSUxFX18sX19MSU5FX18pCisKKyNkZWZpbmUgT1BFTkNWX0VSUkNISyhmdW5jLGNvbnRleHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHtpZiAoY3ZHZXRFcnJTdGF0dXMoKSA+PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHtPUEVOQ1ZfRVJST1IoQ1ZfU3RzQmFja1RyYWNlLChmdW5jKSwoY29udGV4dCkpO319CisKKyNkZWZpbmUgT1BFTkNWX0FTU0VSVChleHByLGZ1bmMsY29udGV4dCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHtpZiAoISAoZXhwcikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIHtPUEVOQ1ZfRVJST1IoQ1ZfU3RzSW50ZXJuYWwsKGZ1bmMpLChjb250ZXh0KSk7fX0KKworI2RlZmluZSBPUEVOQ1ZfUlNURVJSKCkgKGN2U2V0RXJyU3RhdHVzKENWX1N0c09rKSkKKworI2RlZmluZSBPUEVOQ1ZfQ0FMTCggRnVuYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBPcGVuQ1Ytc3R5bGUgZXJyb3IgaGFuZGxpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ1ZfRlVOQ05BTUUgbWFjcm8gZGVmaW5lcyBpY3ZGdW5jTmFtZSBjb25zdGFudCB3aGljaCBpcyB1c2VkIGJ5IENWX0VSUk9SIG1hY3JvICovCisjaWZkZWYgQ1ZfTk9fRlVOQ19OQU1FUworICAgICNkZWZpbmUgQ1ZfRlVOQ05BTUUoIE5hbWUgKQorICAgICNkZWZpbmUgY3ZGdW5jTmFtZSAiIgorI2Vsc2UgICAgCisgICAgI2RlZmluZSBDVl9GVU5DTkFNRSggTmFtZSApICBcCisgICAgc3RhdGljIGNoYXIgY3ZGdW5jTmFtZVtdID0gTmFtZQorI2VuZGlmCisKKworLyoKKyAgQ1ZfRVJST1IgbWFjcm8gdW5jb25kaXRpb25hbGx5IHJhaXNlcyBlcnJvciB3aXRoIHBhc3NlZCBjb2RlIGFuZCBtZXNzYWdlLgorICBBZnRlciByYWlzaW5nIGVycm9yLCBjb250cm9sIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8gdGhlIGV4aXQgbGFiZWwuCisqLworI2RlZmluZSBDVl9FUlJPUiggQ29kZSwgTXNnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgY3ZFcnJvciggKENvZGUpLCBjdkZ1bmNOYW1lLCBNc2csIF9fRklMRV9fLCBfX0xJTkVfXyApOyAgICAgICAgXAorICAgICBFWElUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8qIFNpbXBsaWZpZWQgZm9ybSBvZiBDVl9FUlJPUiAqLworI2RlZmluZSBDVl9FUlJPUl9GUk9NX0NPREUoIGNvZGUgKSAgIFwKKyAgICBDVl9FUlJPUiggY29kZSwgIiIgKQorCisvKgorIENWX0NIRUNLIG1hY3JvIGNoZWNrcyBlcnJvciBzdGF0dXMgYWZ0ZXIgQ1YgKG9yIElQTCkKKyBmdW5jdGlvbiBjYWxsLiBJZiBlcnJvciBkZXRlY3RlZCwgY29udHJvbCB3aWxsIGJlIHRyYW5zZmVycmVkIHRvIHRoZSBleGl0CisgbGFiZWwuCisqLworI2RlZmluZSBDVl9DSEVDSygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFja1RyYWNlLCAiSW5uZXIgZnVuY3Rpb24gZmFpbGVkLiIgKTsgICAgICBcCit9CisKKworLyoKKyBDVl9DQUxMIG1hY3JvIGNhbGxzIENWIChvciBJUEwpIGZ1bmN0aW9uLCBjaGVja3MgZXJyb3Igc3RhdHVzIGFuZAorIHNpZ25hbHMgYSBlcnJvciBpZiB0aGUgZnVuY3Rpb24gZmFpbGVkLiBVc2VmdWwgaW4gInBhcmVudCBub2RlIgorIGVycm9yIHByb2Nlc2luZyBtb2RlCisqLworI2RlZmluZSBDVl9DQUxMKCBGdW5jICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBGdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX0NIRUNLKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogUnVudGltZSBhc3NlcnRpb24gbWFjcm8gKi8KKyNkZWZpbmUgQ1ZfQVNTRVJUKCBDb25kaXRpb24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIShDb25kaXRpb24pICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0ludGVybmFsLCAiQXNzZXJ0aW9uOiAiICNDb25kaXRpb24gIiBmYWlsZWQiICk7IFwKK30KKworI2RlZmluZSBfX0JFR0lOX18gICAgICAgeworI2RlZmluZSBfX0VORF9fICAgICAgICAgZ290byBleGl0OyBleGl0OiA7IH0KKyNkZWZpbmUgX19DTEVBTlVQX18KKyNkZWZpbmUgRVhJVCAgICAgICAgICAgIGdvdG8gZXhpdAorCisjZW5kaWYgLyogX0NYQ09SRV9FUlJPUl9IXyAqLworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9pbmNsdWRlL2N4bWlzYy5oIGIvY3hjb3JlL2luY2x1ZGUvY3htaXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmNGI3NwotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9pbmNsdWRlL2N4bWlzYy5oCkBAIC0wLDAgKzEsOTE4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogVGhlIGhlYWRlciBpcyBtb3N0bHkgZm9yIGludGVybmFsIHVzZSBhbmQgaXQgaXMgbGlrZWx5IHRvIGNoYW5nZS4KKyAgIEl0IGNvbnRhaW5zIHNvbWUgbWFjcm8gZGVmaW5pdGlvbnMgdGhhdCBhcmUgdXNlZCBpbiBjeGNvcmUsIGN2LCBjdmF1eAorICAgYW5kLCBwcm9iYWJseSwgb3RoZXIgbGlicmFyaWVzLiBJZiB5b3UgbmVlZCBzb21lIG9mIHRoaXMgZnVuY3Rpb25hbGl0eSwKKyAgIHRoZSBzYWZlIHdheSBpcyB0byBjb3B5IGl0IGludG8geW91ciBjb2RlIGFuZCByZW5hbWUgdGhlIG1hY3Jvcy4KKyovCisjaWZuZGVmIF9DWENPUkVfTUlTQ19IXworI2RlZmluZSBfQ1hDT1JFX01JU0NfSF8KKworI2lmZGVmIEhBVkVfQ09ORklHX0gKKyAgICAjaW5jbHVkZSAiY3Zjb25maWcuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaWZkZWYgX09QRU5NUAorI2luY2x1ZGUgIm9tcC5oIgorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBpbGUtdGltZSB0dW5pbmcgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogbWF4aW1hbCBzaXplIG9mIHZlY3RvciB0byBydW4gbWF0cml4IG9wZXJhdGlvbnMgb24gaXQgaW5saW5lIChpLmUuIHcvbyBpcHAgY2FsbHMpICovCisjZGVmaW5lICBDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFICAxMAorCisvKiBtYXhpbWFsIGxpbmVhciBzaXplIG9mIG1hdHJpeCB0byBhbGxvY2F0ZSBpdCBvbiBzdGFjay4gKi8KKyNkZWZpbmUgIENWX01BWF9MT0NBTF9NQVRfU0laRSAgMzIKKworLyogbWF4aW1hbCBzaXplIG9mIGxvY2FsIG1lbW9yeSBzdG9yYWdlICovCisjZGVmaW5lICBDVl9NQVhfTE9DQUxfU0laRSAgXAorICAgIChDVl9NQVhfTE9DQUxfTUFUX1NJWkUqQ1ZfTUFYX0xPQ0FMX01BVF9TSVpFKihpbnQpc2l6ZW9mKGRvdWJsZSkpCisKKy8qIGRlZmF1bHQgaW1hZ2Ugcm93IGFsaWduIChpbiBieXRlcykgKi8KKyNkZWZpbmUgIENWX0RFRkFVTFRfSU1BR0VfUk9XX0FMSUdOICA0CisKKy8qIG1hdHJpY2VzIGFyZSBjb250aW51b3VzIGJ5IGRlZmF1bHQgKi8KKyNkZWZpbmUgIENWX0RFRkFVTFRfTUFUX1JPV19BTElHTiAgMQorCisvKiBtYXhpbXVtIHNpemUgb2YgZHluYW1pYyBtZW1vcnkgYnVmZmVyLgorICAgY3ZBbGxvYyByZXBvcnRzIGFuIGVycm9yIGlmIGEgbGFyZ2VyIGJsb2NrIGlzIHJlcXVlc3RlZC4gKi8KKyNkZWZpbmUgIENWX01BWF9BTExPQ19TSVpFICAgICgoKHNpemVfdCkxIDw8IChzaXplb2Yoc2l6ZV90KSo4LTIpKSkKKworLyogdGhlIGFsaWdubWVudCBvZiBhbGwgdGhlIGFsbG9jYXRlZCBidWZmZXJzICovCisjZGVmaW5lICBDVl9NQUxMT0NfQUxJR04gICAgMzIKKworLyogZGVmYXVsdCBhbGlnbm1lbnQgZm9yIGR5bmFtaWMgZGF0YSBzdHJ1Y3V0dXJlcywgcmVzaWRlZCBpbiBzdG9yYWdlcy4gKi8KKyNkZWZpbmUgIENWX1NUUlVDVF9BTElHTiAgICAoKGludClzaXplb2YoZG91YmxlKSkKKworLyogZGVmYXVsdCBzdG9yYWdlIGJsb2NrIHNpemUgKi8KKyNkZWZpbmUgIENWX1NUT1JBR0VfQkxPQ0tfU0laRSAgICgoMTw8MTYpIC0gMTI4KQorCisvKiBkZWZhdWx0IG1lbW9yeSBibG9jayBmb3Igc3BhcnNlIGFycmF5IGVsZW1lbnRzICovCisjZGVmaW5lICBDVl9TUEFSU0VfTUFUX0JMT0NLICAgICgxPDwxMikKKworLyogaW5pdGlhbCBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgIENWX1NQQVJTRV9IQVNIX1NJWkUwICAgICgxPDwxMCkKKworLyogbWF4aW1hbCBhdmVyYWdlIG5vZGVfY291bnQvaGFzaF9zaXplIHJhdGlvIGJleW9uZCB3aGljaCBoYXNoIHRhYmxlIGlzIHJlc2l6ZWQgKi8KKyNkZWZpbmUgIENWX1NQQVJTRV9IQVNIX1JBVElPICAgIDMKKworLyogbWF4IGxlbmd0aCBvZiBzdHJpbmdzICovCisjZGVmaW5lICBDVl9NQVhfU1RSTEVOICAxMDI0CisKKy8qIG1heGltdW0gcG9zc2libGUgbnVtYmVyIG9mIHRocmVhZHMgaW4gcGFyYWxsZWwgaW1wbGVtZW50YXRpb25zICovCisjaWZkZWYgX09QRU5NUAorI2RlZmluZSBDVl9NQVhfVEhSRUFEUyAxMjgKKyNlbHNlCisjZGVmaW5lIENWX01BWF9USFJFQURTIDEKKyNlbmRpZgorCisjaWYgMCAvKmRlZiAgQ1ZfQ0hFQ0tfRk9SX05BTlMqLworICAgICNkZWZpbmUgQ1ZfQ0hFQ0tfTkFOUyggYXJyICkgY3ZDaGVja0FycmF5KChhcnIpKQorI2Vsc2UKKyAgICAjZGVmaW5lIENWX0NIRUNLX05BTlMoIGFyciApCisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbiBkZWNsYXJhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBnZXQgYWxsb2NhIGRlY2xhcmF0aW9uICovCisjaWZkZWYgX19HTlVDX18KKyAgICAjdW5kZWYgYWxsb2NhCisgICAgI2RlZmluZSBhbGxvY2EgX19idWlsdGluX2FsbG9jYQorI2VsaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0CisgICAgI2lmIGRlZmluZWQgX01TQ19WRVIgfHwgZGVmaW5lZCBfX0JPUkxBTkRDX18KKyAgICAgICAgI2luY2x1ZGUgPG1hbGxvYy5oPgorICAgICNlbmRpZgorI2VsaWYgZGVmaW5lZCBIQVZFX0FMTE9DQV9ICisgICAgI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VsaWYgZGVmaW5lZCBIQVZFX0FMTE9DQQorICAgICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisgICAgI2Vycm9yCisjZW5kaWYKKworLyogISBETyBOT1QgbWFrZSBpdCBhbiBpbmxpbmUgZnVuY3Rpb24gKi8KKyNkZWZpbmUgY3ZTdGFja0FsbG9jKHNpemUpIGN2QWxpZ25QdHIoIGFsbG9jYSgoc2l6ZSkgKyBDVl9NQUxMT0NfQUxJR04pLCBDVl9NQUxMT0NfQUxJR04gKQorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fQk9STEFORENfXworICAgICNkZWZpbmUgQ1ZfQklHX0lOVChuKSAgIG4jI0k2NAorICAgICNkZWZpbmUgQ1ZfQklHX1VJTlQobikgIG4jI1VJNjQKKyNlbHNlCisgICAgI2RlZmluZSBDVl9CSUdfSU5UKG4pICAgbiMjTEwKKyAgICAjZGVmaW5lIENWX0JJR19VSU5UKG4pICBuIyNVTEwKKyNlbmRpZgorCisjZGVmaW5lIENWX0lNUEwgQ1ZfRVhURVJOX0MKKworI2RlZmluZSBDVl9EQkdfQlJFQUsoKSB7IHZvbGF0aWxlIGludCogY3Jhc2hNZSA9IDA7ICpjcmFzaE1lID0gMDsgfQorCisvKiBkZWZhdWx0IHN0ZXAsIHNldCBpbiBjYXNlIG9mIGNvbnRpbnVvdXMgZGF0YQorICAgdG8gd29yayBhcm91bmQgY2hlY2tzIGZvciB2YWxpZCBzdGVwIGluIHNvbWUgaXBwIGZ1bmN0aW9ucyAqLworI2RlZmluZSAgQ1ZfU1RVQl9TVEVQICAgICAoMSA8PCAzMCkKKworI2RlZmluZSAgQ1ZfU0laRU9GX0ZMT0FUICgoaW50KXNpemVvZihmbG9hdCkpCisjZGVmaW5lICBDVl9TSVpFT0ZfU0hPUlQgKChpbnQpc2l6ZW9mKHNob3J0KSkKKworI2RlZmluZSAgQ1ZfT1JJR0lOX1RMICAwCisjZGVmaW5lICBDVl9PUklHSU5fQkwgIDEKKworLyogSUVFRTc1NCBjb25zdGFudHMgYW5kIG1hY3JvcyAqLworI2RlZmluZSAgQ1ZfUE9TX0lORiAgICAgICAweDdmODAwMDAwCisjZGVmaW5lICBDVl9ORUdfSU5GICAgICAgIDB4ODA3ZmZmZmYgLyogQ1ZfVE9HR0xFX0ZMVCgweGZmODAwMDAwKSAqLworI2RlZmluZSAgQ1ZfMUYgICAgICAgICAgICAweDNmODAwMDAwCisjZGVmaW5lICBDVl9UT0dHTEVfRkxUKHgpICgoeCleKChpbnQpKHgpIDwgMCA/IDB4N2ZmZmZmZmYgOiAwKSkKKyNkZWZpbmUgIENWX1RPR0dMRV9EQkwoeCkgXAorICAgICgoeCleKChpbnQ2NCkoeCkgPCAwID8gQ1ZfQklHX0lOVCgweDdmZmZmZmZmZmZmZmZmZmYpIDogMCkpCisKKyNkZWZpbmUgIENWX05PUChhKSAgICAgIChhKQorI2RlZmluZSAgQ1ZfQUREKGEsIGIpICAgKChhKSArIChiKSkKKyNkZWZpbmUgIENWX1NVQihhLCBiKSAgICgoYSkgLSAoYikpCisjZGVmaW5lICBDVl9NVUwoYSwgYikgICAoKGEpICogKGIpKQorI2RlZmluZSAgQ1ZfQU5EKGEsIGIpICAgKChhKSAmIChiKSkKKyNkZWZpbmUgIENWX09SKGEsIGIpICAgICgoYSkgfCAoYikpCisjZGVmaW5lICBDVl9YT1IoYSwgYikgICAoKGEpIF4gKGIpKQorI2RlZmluZSAgQ1ZfQU5ETihhLCBiKSAgKH4oYSkgJiAoYikpCisjZGVmaW5lICBDVl9PUk4oYSwgYikgICAofihhKSB8IChiKSkKKyNkZWZpbmUgIENWX1NRUihhKSAgICAgICgoYSkgKiAoYSkpCisKKyNkZWZpbmUgIENWX0xUKGEsIGIpICAgICgoYSkgPCAoYikpCisjZGVmaW5lICBDVl9MRShhLCBiKSAgICAoKGEpIDw9IChiKSkKKyNkZWZpbmUgIENWX0VRKGEsIGIpICAgICgoYSkgPT0gKGIpKQorI2RlZmluZSAgQ1ZfTkUoYSwgYikgICAgKChhKSAhPSAoYikpCisjZGVmaW5lICBDVl9HVChhLCBiKSAgICAoKGEpID4gKGIpKQorI2RlZmluZSAgQ1ZfR0UoYSwgYikgICAgKChhKSA+PSAoYikpCisKKyNkZWZpbmUgIENWX05PTlpFUk8oYSkgICAgICAoKGEpICE9IDApCisjZGVmaW5lICBDVl9OT05aRVJPX0ZMVChhKSAgKCgoYSkrKGEpKSAhPSAwKQorCisvKiBnZW5lcmFsLXB1cnBvc2Ugc2F0dXJhdGlvbiBtYWNyb3MgKi8KKyNkZWZpbmUgIENWX0NBU1RfOFUodCkgICh1Y2hhcikoISgodCkgJiB+MjU1KSA/ICh0KSA6ICh0KSA+IDAgPyAyNTUgOiAwKQorI2RlZmluZSAgQ1ZfQ0FTVF84Uyh0KSAgKHNjaGFyKSghKCgodCkrMTI4KSAmIH4yNTUpID8gKHQpIDogKHQpID4gMCA/IDEyNyA6IC0xMjgpCisjZGVmaW5lICBDVl9DQVNUXzE2VSh0KSAodXNob3J0KSghKCh0KSAmIH42NTUzNSkgPyAodCkgOiAodCkgPiAwID8gNjU1MzUgOiAwKQorI2RlZmluZSAgQ1ZfQ0FTVF8xNlModCkgKHNob3J0KSghKCgodCkrMzI3NjgpICYgfjY1NTM1KSA/ICh0KSA6ICh0KSA+IDAgPyAzMjc2NyA6IC0zMjc2OCkKKyNkZWZpbmUgIENWX0NBU1RfMzJTKHQpIChpbnQpKHQpCisjZGVmaW5lICBDVl9DQVNUXzY0Uyh0KSAoaW50NjQpKHQpCisjZGVmaW5lICBDVl9DQVNUXzMyRih0KSAoZmxvYXQpKHQpCisjZGVmaW5lICBDVl9DQVNUXzY0Rih0KSAoZG91YmxlKSh0KQorCisjZGVmaW5lICBDVl9QQVNURTIoYSxiKSBhIyNiCisjZGVmaW5lICBDVl9QQVNURShhLGIpICBDVl9QQVNURTIoYSxiKQorCisjZGVmaW5lICBDVl9FTVBUWQorI2RlZmluZSAgQ1ZfTUFLRV9TVFIoYSkgI2EKKworI2RlZmluZSAgQ1ZfREVGSU5FX01BU0sgICAgICAgICBcCisgICAgZmxvYXQgbWFza1RhYlsyXTsgbWFza1RhYlswXSA9IDAuZjsgbWFza1RhYlsxXSA9IDEuZjsKKyNkZWZpbmUgIENWX0FORE1BU0soIG0sIHggKSAgICAgKCh4KSAmICgoKG0pID09IDApIC0gMSkpCisKKy8qICh4KSAqICgobSkgPT0gMSA/IDEuZiA6IChtKSA9PSAwID8gMC5mIDogPEVSUj4gKi8KKyNkZWZpbmUgIENWX01VTE1BU0soIG0sIHggKSAgICAgICAobWFza1RhYlsobSkgIT0gMF0qKHgpKQorCisvKiAoeCkgKiAoKG0pID09IC0xID8gMS5mIDogKG0pID09IDAgPyAwLmYgOiA8RVJSPiAqLworI2RlZmluZSAgQ1ZfTVVMTUFTSzEoIG0sIHggKSAgICAgIChtYXNrVGFiWyhtKSsxXSooeCkpCisKKyNkZWZpbmUgIENWX1pFUk9fT0JKKHgpICBtZW1zZXQoKHgpLCAwLCBzaXplb2YoKih4KSkpCisKKyNkZWZpbmUgIENWX0RJTShzdGF0aWNfYXJyYXkpICgoaW50KShzaXplb2Yoc3RhdGljX2FycmF5KS9zaXplb2YoKHN0YXRpY19hcnJheSlbMF0pKSkKKworI2RlZmluZSAgQ1ZfVU5fRU5UUllfQzEod29ya3R5cGUpICAgICAgICAgICBcCisgICAgd29ya3R5cGUgczAgPSBzY2FsYXJbMF0KKworI2RlZmluZSAgQ1ZfVU5fRU5UUllfQzIod29ya3R5cGUpICAgICAgICAgICBcCisgICAgd29ya3R5cGUgczAgPSBzY2FsYXJbMF0sIHMxID0gc2NhbGFyWzFdCisKKyNkZWZpbmUgIENWX1VOX0VOVFJZX0MzKHdvcmt0eXBlKSAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gc2NhbGFyWzBdLCBzMSA9IHNjYWxhclsxXSwgczIgPSBzY2FsYXJbMl0KKworI2RlZmluZSAgQ1ZfVU5fRU5UUllfQzQod29ya3R5cGUpICAgICAgICAgICBcCisgICAgd29ya3R5cGUgczAgPSBzY2FsYXJbMF0sIHMxID0gc2NhbGFyWzFdLCBzMiA9IHNjYWxhclsyXSwgczMgPSBzY2FsYXJbM10KKworI2RlZmluZSAgY3ZVbnN1cHBvcnRlZEZvcm1hdCAiVW5zdXBwb3J0ZWQgZm9ybWF0IgorCitDVl9JTkxJTkUgdm9pZCogY3ZBbGlnblB0ciggY29uc3Qgdm9pZCogcHRyLCBpbnQgYWxpZ249MzIgKQoreworICAgIGFzc2VydCggKGFsaWduICYgKGFsaWduLTEpKSA9PSAwICk7CisgICAgcmV0dXJuICh2b2lkKikoICgoc2l6ZV90KXB0ciArIGFsaWduIC0gMSkgJiB+KHNpemVfdCkoYWxpZ24tMSkgKTsKK30KKworQ1ZfSU5MSU5FIGludCBjdkFsaWduKCBpbnQgc2l6ZSwgaW50IGFsaWduICkKK3sKKyAgICBhc3NlcnQoIChhbGlnbiAmIChhbGlnbi0xKSkgPT0gMCAmJiBzaXplIDwgSU5UX01BWCApOworICAgIHJldHVybiAoc2l6ZSArIGFsaWduIC0gMSkgJiAtYWxpZ247Cit9CisKK0NWX0lOTElORSAgQ3ZTaXplICBjdkdldE1hdFNpemUoIGNvbnN0IEN2TWF0KiBtYXQgKQoreworICAgIEN2U2l6ZSBzaXplID0geyBtYXQtPndpZHRoLCBtYXQtPmhlaWdodCB9OworICAgIHJldHVybiBzaXplOworfQorCisjZGVmaW5lICBDVl9ERVNDQUxFKHgsbikgICAgICgoKHgpICsgKDEgPDwgKChuKS0xKSkpID4+IChuKSkKKyNkZWZpbmUgIENWX0ZMVF9UT19GSVgoeCxuKSAgY3ZSb3VuZCgoeCkqKDE8PChuKSkpCisKKyNpZiAwCisvKiBUaGlzIGlzIGEgc21hbGwgZW5naW5lIGZvciBwZXJmb3JtaW5nIGZhc3QgZGl2aXNpb24gb2YgbXVsdGlwbGUgbnVtYmVycworICAgYnkgdGhlIHNhbWUgY29uc3RhbnQuIE1vc3QgY29tcGlsZXJzIGRvIGl0IHRvbyBpZiB0aGV5IGtub3cgdGhlIGRpdmlzb3IgdmFsdWUKKyAgIGF0IGNvbXBpbGUtdGltZS4gVGhlIGFsZ29yaXRobSB3YXMgdGFrZW4gZnJvbSBBZ25lciBGb2cncyBvcHRpbWl6YXRpb24gZ3VpZGUKKyAgIGF0IGh0dHA6Ly93d3cuYWduZXIub3JnL2Fzc2VtICovCit0eXBlZGVmIHN0cnVjdCBDdkZhc3REaXYKK3sKKyAgICB1bnNpZ25lZCBkZWx0YSwgc2NhbGUsIGRpdmlzb3I7Cit9CitDdkZhc3REaXY7CisKKyNkZWZpbmUgQ1ZfRkFTVF9ESVZfU0hJRlQgMzIKKworQ1ZfSU5MSU5FIEN2RmFzdERpdiBjdkZhc3REaXYoIGludCBkaXZpc29yICkKK3sKKyAgICBDdkZhc3REaXYgZmFzdGRpdjsKKworICAgIGFzc2VydCggZGl2aXNvciA+PSAxICk7CisgICAgdWludDY0IHRlbXAgPSAoKHVpbnQ2NCkxIDw8IENWX0ZBU1RfRElWX1NISUZUKS9kaXZpc29yOworCisgICAgZmFzdGRpdi5kaXZpc29yID0gZGl2aXNvcjsKKyAgICBmYXN0ZGl2LmRlbHRhID0gKHVuc2lnbmVkKSgoKHRlbXAgJiAxKSBeIDEpICsgZGl2aXNvciAtIDEpOworICAgIGZhc3RkaXYuc2NhbGUgPSAodW5zaWduZWQpKCh0ZW1wICsgMSkgPj4gMSk7CisKKyAgICByZXR1cm4gZmFzdGRpdjsKK30KKworI2RlZmluZSBDVl9GQVNUX0RJViggeCwgZmFzdGRpdiApICBcCisgICAgKChpbnQpKCgoaW50NjQpKCh4KSoyICsgKGludCkoZmFzdGRpdikuZGVsdGEpKSooaW50KShmYXN0ZGl2KS5zY2FsZT4+Q1ZfRkFTVF9ESVZfU0hJRlQpKQorCisjZGVmaW5lIENWX0ZBU1RfVURJViggeCwgZmFzdGRpdiApICBcCisgICAgKChpbnQpKCgodWludDY0KSgoeCkqMiArIChmYXN0ZGl2KS5kZWx0YSkpKihmYXN0ZGl2KS5zY2FsZT4+Q1ZfRkFTVF9ESVZfU0hJRlQpKQorI2VuZGlmCisKKyNkZWZpbmUgQ1ZfTUVNQ1BZX0NIQVIoIGRzdCwgc3JjLCBsZW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3QgX2ljdl9tZW1jcHlfaV8sIF9pY3ZfbWVtY3B5X2xlbl8gPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyKiBfaWN2X21lbWNweV9kc3RfID0gKGNoYXIqKShkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBjaGFyKiBfaWN2X21lbWNweV9zcmNfID0gKGNvbnN0IGNoYXIqKShzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIF9pY3ZfbWVtY3B5X2lfID0gMDsgX2ljdl9tZW1jcHlfaV8gPCBfaWN2X21lbWNweV9sZW5fOyBfaWN2X21lbWNweV9pXysrICkgIFwKKyAgICAgICAgX2ljdl9tZW1jcHlfZHN0X1tfaWN2X21lbWNweV9pX10gPSBfaWN2X21lbWNweV9zcmNfW19pY3ZfbWVtY3B5X2lfXTsgICAgICAgIFwKK30KKworCisjZGVmaW5lIENWX01FTUNQWV9JTlQoIGRzdCwgc3JjLCBsZW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV90IF9pY3ZfbWVtY3B5X2lfLCBfaWN2X21lbWNweV9sZW5fID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50KiBfaWN2X21lbWNweV9kc3RfID0gKGludCopKGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgaW50KiBfaWN2X21lbWNweV9zcmNfID0gKGNvbnN0IGludCopKHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCAoKHNpemVfdClfaWN2X21lbWNweV9zcmNfJihzaXplb2YoaW50KS0xKSkgPT0gMCAmJiAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoKHNpemVfdClfaWN2X21lbWNweV9kc3RfJihzaXplb2YoaW50KS0xKSkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKF9pY3ZfbWVtY3B5X2lfPTA7X2ljdl9tZW1jcHlfaV88X2ljdl9tZW1jcHlfbGVuXztfaWN2X21lbWNweV9pXysrKSAgICAgICAgICBcCisgICAgICAgIF9pY3ZfbWVtY3B5X2RzdF9bX2ljdl9tZW1jcHlfaV9dID0gX2ljdl9tZW1jcHlfc3JjX1tfaWN2X21lbWNweV9pX107ICAgICAgICBcCit9CisKKworI2RlZmluZSBDVl9NRU1DUFlfQVVUTyggZHN0LCBzcmMsIGxlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemVfdCBfaWN2X21lbWNweV9pXywgX2ljdl9tZW1jcHlfbGVuXyA9IChsZW4pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNoYXIqIF9pY3ZfbWVtY3B5X2RzdF8gPSAoY2hhciopKGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGNoYXIqIF9pY3ZfbWVtY3B5X3NyY18gPSAoY29uc3QgY2hhciopKHNyYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAoX2ljdl9tZW1jcHlfbGVuXyAmIChzaXplb2YoaW50KS0xKSkgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQoICgoc2l6ZV90KV9pY3ZfbWVtY3B5X3NyY18mKHNpemVvZihpbnQpLTEpKSA9PSAwICYmICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoc2l6ZV90KV9pY3ZfbWVtY3B5X2RzdF8mKHNpemVvZihpbnQpLTEpKSA9PSAwICk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIF9pY3ZfbWVtY3B5X2lfID0gMDsgX2ljdl9tZW1jcHlfaV8gPCBfaWN2X21lbWNweV9sZW5fOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2ljdl9tZW1jcHlfaV8rPXNpemVvZihpbnQpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKihpbnQqKShfaWN2X21lbWNweV9kc3RfK19pY3ZfbWVtY3B5X2lfKSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKihjb25zdCBpbnQqKShfaWN2X21lbWNweV9zcmNfK19pY3ZfbWVtY3B5X2lfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoX2ljdl9tZW1jcHlfaV8gPSAwOyBfaWN2X21lbWNweV9pXyA8IF9pY3ZfbWVtY3B5X2xlbl87IF9pY3ZfbWVtY3B5X2lfKyspXAorICAgICAgICAgICAgX2ljdl9tZW1jcHlfZHN0X1tfaWN2X21lbWNweV9pX10gPSBfaWN2X21lbWNweV9zcmNfW19pY3ZfbWVtY3B5X2lfXTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgQ1ZfWkVST19DSEFSKCBkc3QsIGxlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3QgX2ljdl9tZW1jcHlfaV8sIF9pY3ZfbWVtY3B5X2xlbl8gPSAobGVuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjaGFyKiBfaWN2X21lbWNweV9kc3RfID0gKGNoYXIqKShkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIF9pY3ZfbWVtY3B5X2lfID0gMDsgX2ljdl9tZW1jcHlfaV8gPCBfaWN2X21lbWNweV9sZW5fOyBfaWN2X21lbWNweV9pXysrICkgIFwKKyAgICAgICAgX2ljdl9tZW1jcHlfZHN0X1tfaWN2X21lbWNweV9pX10gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIENWX1pFUk9fSU5UKCBkc3QsIGxlbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV90IF9pY3ZfbWVtY3B5X2lfLCBfaWN2X21lbWNweV9sZW5fID0gKGxlbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50KiBfaWN2X21lbWNweV9kc3RfID0gKGludCopKGRzdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCAoKHNpemVfdClfaWN2X21lbWNweV9kc3RfJihzaXplb2YoaW50KS0xKSkgPT0gMCApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKF9pY3ZfbWVtY3B5X2lfPTA7X2ljdl9tZW1jcHlfaV88X2ljdl9tZW1jcHlfbGVuXztfaWN2X21lbWNweV9pXysrKSAgICAgICAgICBcCisgICAgICAgIF9pY3ZfbWVtY3B5X2RzdF9bX2ljdl9tZW1jcHlfaV9dID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisKKyAgR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBRdWlja1NvcnQgYWxnb3JpdGhtLgorICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIFVzaW5nIHRoaXMgbWFjcm8gdXNlciBjYW4gZGVjbGFyZSBjdXN0b21pemVkIHNvcnQgZnVuY3Rpb24gdGhhdCBjYW4gYmUgbXVjaCBmYXN0ZXIKKyAgdGhhbiBidWlsdC1pbiBxc29ydCBmdW5jdGlvbiBiZWNhdXNlIG9mIGxvd2VyIG92ZXJoZWFkIG9uIGVsZW1lbnRzCisgIGNvbXBhcmlzb24gYW5kIGV4Y2hhbmdlLiBUaGUgbWFjcm8gdGFrZXMgbGVzc190aGFuIChvciBMVCkgYXJndW1lbnQgLSBhIG1hY3JvIG9yIGZ1bmN0aW9uCisgIHRoYXQgdGFrZXMgMiBhcmd1bWVudHMgcmV0dXJucyBub24temVybyBpZiB0aGUgZmlyc3QgYXJndW1lbnQgc2hvdWxkIGJlIGJlZm9yZSB0aGUgc2Vjb25kCisgIG9uZSBpbiB0aGUgc29ydGVkIHNlcXVlbmNlIGFuZCB6ZXJvIG90aGVyd2lzZS4KKworICBFeGFtcGxlOgorCisgICAgU3VwcG9zZSB0aGF0IHRoZSB0YXNrIGlzIHRvIHNvcnQgcG9pbnRzIGJ5IGFzY2VuZGluZyBvZiB5IGNvb3JkaW5hdGVzIGFuZCBpZgorICAgIHkncyBhcmUgZXF1YWwgeCdzIHNob3VsZCBhc2NlbmQuCisKKyAgICBUaGUgY29kZSBpczoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgI2RlZmluZSBjbXBfcHRzKCBwdDEsIHB0MiApIFwKKyAgICAgICAgICAgICAgICgocHQxKS55IDwgKHB0MikueSB8fCAoKHB0MSkueSA8IChwdDIpLnkgJiYgKHB0MSkueCA8IChwdDIpLngpKQorCisgICAgICAgICAgIFtzdGF0aWNdIENWX0lNUExFTUVOVF9RU09SVCggaWN2U29ydFBvaW50cywgQ3ZQb2ludCwgY21wX3B0cyApCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBZnRlciB0aGF0IHRoZSBmdW5jdGlvbiAidm9pZCBpY3ZTb3J0UG9pbnRzKCBDdlBvaW50KiBhcnJheSwgc2l6ZV90IHRvdGFsLCBpbnQgYXV4ICk7IgorICAgIGlzIGF2YWlsYWJsZSB0byB1c2VyLgorCisgIGF1eCBpcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciwgd2hpY2ggY2FuIGJlIHVzZWQgd2hlbiBjb21wYXJpbmcgZWxlbWVudHMuCisgIFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdhcyBkZXJpdmVkIGZyb20gKkJTRCBzeXN0ZW0gcXNvcnQoKToKKworICAgICogQ29weXJpZ2h0IChjKSAxOTkyLCAxOTkzCisgICAgKiAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgICAgKgorICAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAgICAqIGFyZSBtZXQ6CisgICAgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKyAgICAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAgICAqICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgICAgKiAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgICAgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICAgICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgICAgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgICAqCisgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICAgICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgICAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICAgICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgICAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICAgICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAgICAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICAgICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAgICAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAgICAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAgICAqIFNVQ0ggREFNQUdFLgorCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGZ1bmNfbmFtZSwgVCwgTFQsIHVzZXJfZGF0YV90eXBlICkgICAgICAgICAgICAgICAgICAgXAordm9pZCBmdW5jX25hbWUoIFQgKmFycmF5LCBzaXplX3QgdG90YWwsIHVzZXJfZGF0YV90eXBlIGF1eCApICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpc29ydF90aHJlc2ggPSA3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFQgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBzcCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUICpsYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUICp1YjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YWNrWzQ4XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGF1eCA9IGF1eDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCB0b3RhbCA8PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YWNrWzBdLmxiID0gYXJyYXk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YWNrWzBdLnViID0gYXJyYXkgKyAodG90YWwgLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlKCBzcCA+PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUKiBsZWZ0ID0gc3RhY2tbc3BdLmxiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUKiByaWdodCA9IHN0YWNrW3NwLS1dLnViOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoOzspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGksIG4gPSAoaW50KShyaWdodCAtIGxlZnQpICsgMSwgbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVCogcHRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgVCogcHRyMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG4gPD0gaXNvcnRfdGhyZXNoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW5zZXJ0X3NvcnQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggcHRyID0gbGVmdCArIDE7IHB0ciA8PSByaWdodDsgcHRyKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmb3IoIHB0cjIgPSBwdHI7IHB0cjIgPiBsZWZ0ICYmIExUKHB0cjJbMF0scHRyMlstMV0pOyBwdHIyLS0pICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUCggcHRyMlswXSwgcHRyMlstMV0sIHQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIGxlZnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIGxlZnQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIHJpZ2h0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIHJpZ2h0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIHBpdm90OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIFQqIGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBzd2FwX2NudCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGxlZnQwID0gbGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJpZ2h0MCA9IHJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBpdm90ID0gbGVmdCArIChuLzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBuID4gNDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IG4gLyA4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhID0gbGVmdCwgYiA9IGxlZnQgKyBkLCBjID0gbGVmdCArIDIqZDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gTFQoKmEsICpiKSA/IChMVCgqYiwgKmMpID8gYiA6IChMVCgqYSwgKmMpID8gYyA6IGEpKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChMVCgqYywgKmIpID8gYiA6IChMVCgqYSwgKmMpID8gYSA6IGMpKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhID0gcGl2b3QgLSBkLCBiID0gcGl2b3QsIGMgPSBwaXZvdCArIGQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwaXZvdCA9IExUKCphLCAqYikgPyAoTFQoKmIsICpjKSA/IGIgOiAoTFQoKmEsICpjKSA/IGMgOiBhKSkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChMVCgqYywgKmIpID8gYiA6IChMVCgqYSwgKmMpID8gYSA6IGMpKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhID0gcmlnaHQgLSAyKmQsIGIgPSByaWdodCAtIGQsIGMgPSByaWdodDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByaWdodCA9IExUKCphLCAqYikgPyAoTFQoKmIsICpjKSA/IGIgOiAoTFQoKmEsICpjKSA/IGMgOiBhKSkgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChMVCgqYywgKmIpID8gYiA6IChMVCgqYSwgKmMpID8gYSA6IGMpKTsgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgPSBsZWZ0LCBiID0gcGl2b3QsIGMgPSByaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHBpdm90ID0gTFQoKmEsICpiKSA/IChMVCgqYiwgKmMpID8gYiA6IChMVCgqYSwgKmMpID8gYyA6IGEpKSAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChMVCgqYywgKmIpID8gYiA6IChMVCgqYSwgKmMpID8gYSA6IGMpKTsgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBwaXZvdCAhPSBsZWZ0MCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCAqcGl2b3QsICpsZWZ0MCwgdCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwaXZvdCA9IGxlZnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0MSA9IGxlZnQwICsgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQxID0gcmlnaHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvcig7OykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB3aGlsZSggbGVmdCA8PSByaWdodCAmJiAhTFQoKnBpdm90LCAqbGVmdCkgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFMVCgqbGVmdCwgKnBpdm90KSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsZWZ0ID4gbGVmdDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCAqbGVmdDEsICpsZWZ0LCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfY250ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQxKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB3aGlsZSggbGVmdCA8PSByaWdodCAmJiAhTFQoKnJpZ2h0LCAqcGl2b3QpICkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFMVCgqcGl2b3QsICpyaWdodCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByaWdodCA8IHJpZ2h0MSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCAqcmlnaHQxLCAqcmlnaHQsIHQgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXBfY250ID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0MS0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQtLTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiggbGVmdCA+IHJpZ2h0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCAqbGVmdCwgKnJpZ2h0LCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzd2FwX2NudCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBsZWZ0Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICByaWdodC0tOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBzd2FwX2NudCA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdDAsIHJpZ2h0ID0gcmlnaHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBnb3RvIGluc2VydF9zb3J0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG4gPSBNSU4oIChpbnQpKGxlZnQxIC0gbGVmdDApLCAoaW50KShsZWZ0IC0gbGVmdDEpICk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCBsZWZ0MFtpXSwgbGVmdFtpLW5dLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG4gPSBNSU4oIChpbnQpKHJpZ2h0MCAtIHJpZ2h0MSksIChpbnQpKHJpZ2h0MSAtIHJpZ2h0KSApOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCBsZWZ0W2ldLCByaWdodDBbaS1uKzFdLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG4gPSAoaW50KShsZWZ0IC0gbGVmdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG0gPSAoaW50KShyaWdodDEgLSByaWdodCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBuID4gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiggbSA+IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG4gPiBtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrWysrc3BdLmxiID0gbGVmdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW3NwXS51YiA9IGxlZnQwICsgbiAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodDAgLSBtICsgMSwgcmlnaHQgPSByaWdodDA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrWysrc3BdLmxiID0gcmlnaHQwIC0gbSArIDE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW3NwXS51YiA9IHJpZ2h0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBsZWZ0MCwgcmlnaHQgPSBsZWZ0MCArIG4gLSAxOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IGxlZnQwLCByaWdodCA9IGxlZnQwICsgbiAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVsc2UgaWYoIG0gPiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQwIC0gbSArIDEsIHJpZ2h0ID0gcmlnaHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENWX0lNUExFTUVOVF9RU09SVCggZnVuY19uYW1lLCBULCBjbXAgKSAgXAorICAgIENWX0lNUExFTUVOVF9RU09SVF9FWCggZnVuY19uYW1lLCBULCBjbXAsIGludCApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgIFN0cnVjdHVyZXMgYW5kIG1hY3JvcyBmb3IgaW50ZWdyYXRpb24gd2l0aCBJUFAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSVBQLWNvbXBhdGlibGUgcmV0dXJuIGNvZGVzICovCit0eXBlZGVmIGVudW0gQ3ZTdGF0dXMKK3sKKyAgICBDVl9CQURNRU1CTE9DS19FUlIgICAgICAgICAgPSAtMTEzLAorICAgIENWX0lOUExBQ0VfTk9UX1NVUFBPUlRFRF9FUlI9IC0xMTIsCisgICAgQ1ZfVU5NQVRDSEVEX1JPSV9FUlIgICAgICAgID0gLTExMSwKKyAgICBDVl9OT1RGT1VORF9FUlIgICAgICAgICAgICAgPSAtMTEwLAorICAgIENWX0JBRENPTlZFUkdFTkNFX0VSUiAgICAgICA9IC0xMDksCisKKyAgICBDVl9CQURERVBUSF9FUlIgICAgICAgICAgICAgPSAtMTA3LAorICAgIENWX0JBRFJPSV9FUlIgICAgICAgICAgICAgICA9IC0xMDYsCisgICAgQ1ZfQkFESEVBREVSX0VSUiAgICAgICAgICAgID0gLTEwNSwKKyAgICBDVl9VTk1BVENIRURfRk9STUFUU19FUlIgICAgPSAtMTA0LAorICAgIENWX1VOU1VQUE9SVEVEX0NPSV9FUlIgICAgICA9IC0xMDMsCisgICAgQ1ZfVU5TVVBQT1JURURfQ0hBTk5FTFNfRVJSID0gLTEwMiwKKyAgICBDVl9VTlNVUFBPUlRFRF9ERVBUSF9FUlIgICAgPSAtMTAxLAorICAgIENWX1VOU1VQUE9SVEVEX0ZPUk1BVF9FUlIgICA9IC0xMDAsCisKKyAgICBDVl9CQURBUkdfRVJSICAgICAgPSAtNDksICAvL2lwcCBjb21wCisgICAgQ1ZfTk9UREVGSU5FRF9FUlIgID0gLTQ4LCAgLy9pcHAgY29tcAorCisgICAgQ1ZfQkFEQ0hBTk5FTFNfRVJSID0gLTQ3LCAgLy9pcHAgY29tcAorICAgIENWX0JBRFJBTkdFX0VSUiAgICA9IC00NCwgIC8vaXBwIGNvbXAKKyAgICBDVl9CQURTVEVQX0VSUiAgICAgPSAtMjksICAvL2lwcCBjb21wCisKKyAgICBDVl9CQURGTEFHX0VSUiAgICAgPSAgLTEyLAorICAgIENWX0RJVl9CWV9aRVJPX0VSUiA9ICAtMTEsIC8vaXBwIGNvbXAKKyAgICBDVl9CQURDT0VGX0VSUiAgICAgPSAgLTEwLAorCisgICAgQ1ZfQkFERkFDVE9SX0VSUiAgID0gIC03LAorICAgIENWX0JBRFBPSU5UX0VSUiAgICA9ICAtNiwKKyAgICBDVl9CQURTQ0FMRV9FUlIgICAgPSAgLTQsCisgICAgQ1ZfT1VUT0ZNRU1fRVJSICAgID0gIC0zLAorICAgIENWX05VTExQVFJfRVJSICAgICA9ICAtMiwKKyAgICBDVl9CQURTSVpFX0VSUiAgICAgPSAgLTEsCisgICAgQ1ZfTk9fRVJSICAgICAgICAgID0gICAwLAorICAgIENWX09LICAgICAgICAgICAgICA9ICAgQ1ZfTk9fRVJSCit9CitDdlN0YXR1czsKKworI2RlZmluZSBDVl9FUlJPUl9GUk9NX1NUQVRVUyggcmVzdWx0ICkgICAgICAgICAgICAgICAgXAorICAgIENWX0VSUk9SKCBjdkVycm9yRnJvbUlwcFN0YXR1cyggcmVzdWx0ICksICJPcGVuQ1YgZnVuY3Rpb24gZmFpbGVkIiApCisKKyNkZWZpbmUgSVBQSV9DQUxMKCBGdW5jICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDdlN0YXR1cyAgaXBwaV9jYWxsX3Jlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlwcGlfY2FsbF9yZXN1bHQgPSBGdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiggaXBwaV9jYWxsX3Jlc3VsdCA8IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SX0ZST01fU1RBVFVTKCAoaXBwaV9jYWxsX3Jlc3VsdCkpOyAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIENWX1BMVUdJTl9OT05FICAgICAgMAorI2RlZmluZSBDVl9QTFVHSU5fT1BUQ1YgICAgIDEgLyogY3VzdG9tICJlbWVyZ2VkIiBpcHBvcGVuY3YgbGlicmFyeSAqLworI2RlZmluZSBDVl9QTFVHSU5fSVBQQ1YgICAgIDIgLyogSVBQOiBjb21wdXRlciB2aXNpb24gKi8KKyNkZWZpbmUgQ1ZfUExVR0lOX0lQUEkgICAgICAzIC8qIElQUDogaW1hZ2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBDVl9QTFVHSU5fSVBQUyAgICAgIDQgLyogSVBQOiBzaWduYWwgcHJvY2Vzc2luZyAqLworI2RlZmluZSBDVl9QTFVHSU5fSVBQVk0gICAgIDUgLyogSVBQOiB2ZWN0b3IgbWF0aCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgQ1ZfUExVR0lOX0lQUENDICAgICA2IC8qIElQUDogY29sb3Igc3BhY2UgY29udmVyc2lvbiAqLworI2RlZmluZSBDVl9QTFVHSU5fTUtMICAgICAgIDggLyogSW50ZWwgTWF0aCBLZXJuZWwgTGlicmFyeSAqLworCisjZGVmaW5lIENWX1BMVUdJTl9NQVggICAgICAxNgorCisjZGVmaW5lIENWX1BMVUdJTlMxKGxpYjEpICgobGliMSkmMTUpCisjZGVmaW5lIENWX1BMVUdJTlMyKGxpYjEsbGliMikgKCgobGliMSkmMTUpfCgoKGxpYjIpJjE1KTw8NCkpCisjZGVmaW5lIENWX1BMVUdJTlMzKGxpYjEsbGliMixsaWIzKSAoKChsaWIxKSYxNSl8KCgobGliMikmMTUpPDw0KXwoKChsaWIyKSYxNSk8PDgpKQorCisjZGVmaW5lIENWX05PVEhST1cgdGhyb3coKQorCisjaWZuZGVmIElQQ1ZBUEkKKyNkZWZpbmUgSVBDVkFQSSh0eXBlLGRlY2xzcGVjLG5hbWUsYXJncykgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogZnVuY3Rpb24gcG9pbnRlciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZSAoZGVjbHNwZWMqIG5hbWUjI190KSBhcmdzOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHRlcm4gbmFtZSMjX3QgbmFtZSMjX3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdHlwZSBkZWNsc3BlYyBuYW1lIGFyZ3M7CisjZW5kaWYKKworI2RlZmluZSBJUENWQVBJX0VYKHR5cGUsbmFtZSxpcHBfbmFtZSxpcHBfc2VhcmNoX21vZHVsZXMsYXJncykgIFwKKyAgICBJUENWQVBJKHR5cGUsQ1ZfU1REQ0FMTCxuYW1lLGFyZ3MpCisKKyNkZWZpbmUgSVBDVkFQSV9DX0VYKHR5cGUsbmFtZSxpcHBfbmFtZSxpcHBfc2VhcmNoX21vZHVsZXMsYXJncylcCisgICAgSVBDVkFQSSh0eXBlLENWX0NERUNMLG5hbWUsYXJncykKKworI2lmbmRlZiBJUENWQVBJX0lNUEwKKyNkZWZpbmUgSVBDVkFQSV9JTVBMKHR5cGUsbmFtZSxhcmdzLGFyZ19uYW1lcykgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHR5cGUgQ1ZfU1REQ0FMTCBuYW1lIyNfZiBhcmdzOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5hbWUjI190IG5hbWUjI19wID0gbmFtZSMjX2Y7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlIENWX1NURENBTEwgbmFtZSBhcmdzIHsgcmV0dXJuIG5hbWUjI19wIGFyZ19uYW1lczsgfSAgICBcCisgICAgc3RhdGljIHR5cGUgQ1ZfU1REQ0FMTCBuYW1lIyNfZiBhcmdzCisjZW5kaWYKKworLyogSVBQIHR5cGVzJyBlbnVtZXJhdGlvbiAqLwordHlwZWRlZiBlbnVtIEN2RGF0YVR5cGUgeworICAgIGN2MXUsCisgICAgY3Y4dSwgY3Y4cywKKyAgICBjdjE2dSwgY3YxNnMsIGN2MTZzYywKKyAgICBjdjMydSwgY3YzMnMsIGN2MzJzYywKKyAgICBjdjMyZiwgY3YzMmZjLAorICAgIGN2NjR1LCBjdjY0cywgY3Y2NHNjLAorICAgIGN2NjRmLCBjdjY0ZmMKK30gQ3ZEYXRhVHlwZTsKKwordHlwZWRlZiBlbnVtIEN2SGludEFsZ29yaXRobSB7CisgICAgY3ZBbGdIaW50Tm9uZSwKKyAgICBjdkFsZ0hpbnRGYXN0LAorICAgIGN2QWxnSGludEFjY3VyYXRlCit9IEN2SGludEFsZ29yaXRobTsKKwordHlwZWRlZiBlbnVtIEN2Q21wT3AgeworICAgIGN2Q21wTGVzcywKKyAgICBjdkNtcExlc3NFcSwKKyAgICBjdkNtcEVxLAorICAgIGN2Q21wR3JlYXRlckVxLAorICAgIGN2Q21wR3JlYXRlcgorfSBDdkNtcE9wOworCit0eXBlZGVmIHN0cnVjdCBDdkZ1bmNUYWJsZQoreworICAgIHZvaWQqICAgZm5fMmRbQ1ZfREVQVEhfTUFYXTsKK30KK0N2RnVuY1RhYmxlOworCit0eXBlZGVmIHN0cnVjdCBDdkJpZ0Z1bmNUYWJsZQoreworICAgIHZvaWQqICAgZm5fMmRbQ1ZfREVQVEhfTUFYKkNWX0NOX01BWF07Cit9CitDdkJpZ0Z1bmNUYWJsZTsKKworCit0eXBlZGVmIHN0cnVjdCBDdkJ0RnVuY1RhYmxlCit7CisgICAgdm9pZCogICBmbl8yZFszM107Cit9CitDdkJ0RnVuY1RhYmxlOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRF8xQSkodm9pZCogYXJyLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUpOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRF8xQTFQKSh2b2lkKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgdm9pZCogcGFyYW0pOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRF8xQTFQMUkpKHZvaWQqIGFyciwgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbSwgaW50IGZsYWcpOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzFBMVApKCB2b2lkKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbiwgaW50IGNvaSwgdm9pZCogcGFyYW0gKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRuQ18xQTFQKSggdm9pZCogYXJyLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY24sIGludCBjb2ksIHZvaWQqIHBhcmFtICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEXzFBMlApKCB2b2lkKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTEsIHZvaWQqIHBhcmFtMiApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzFBMlApKCB2b2lkKiBhcnIsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtMSwgdm9pZCogcGFyYW0yICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEXzFBNFApKCB2b2lkKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTEsIHZvaWQqIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTMsIHZvaWQqIHBhcmFtNCApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzFBNFApKCB2b2lkKiBhcnIsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtMSwgdm9pZCogcGFyYW0yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0zLCB2b2lkKiBwYXJhbTQgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRfMkEpKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFycjEsIGludCBzdGVwMSwgQ3ZTaXplIHNpemUgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRfMkExUCkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIHZvaWQqIHBhcmFtICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEbkNfMkExUCkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFycjEsIGludCBzdGVwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29pLCB2b2lkKiBwYXJhbSApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzJBMVApKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvaSwgdm9pZCogcGFyYW0gKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRfMkEyUCkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtMSwgdm9pZCogcGFyYW0yICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEbkNfMkEyUCkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFycjEsIGludCBzdGVwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sIGludCBjb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTEsIHZvaWQqIHBhcmFtMiApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRF8yQTFQMUkpKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0sIGludCBmbGFnICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEXzJBNFApKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJyMSwgaW50IHN0ZXAxLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTEsIHZvaWQqIHBhcmFtMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTMsIHZvaWQqIHBhcmFtNCApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzJBNFApKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNuLCBpbnQgY29pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW0xLCB2b2lkKiBwYXJhbTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwYXJhbTMsIHZvaWQqIHBhcmFtNCApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRF8zQSkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJyMSwgaW50IHN0ZXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIyLCBpbnQgc3RlcDIsIEN2U2l6ZSBzaXplICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzJEXzNBMVApKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJyMSwgaW50IHN0ZXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFycjIsIGludCBzdGVwMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgdm9pZCogcGFyYW0gKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRfM0ExSSkoIHZvaWQqIGFycjAsIGludCBzdGVwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJyMiwgaW50IHN0ZXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZmxhZyApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkZ1bmMyRG5DXzNBMVApKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIxLCBpbnQgc3RlcDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIyLCBpbnQgc3RlcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvaSwgdm9pZCogcGFyYW0gKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZGdW5jMkRfNEEpKCB2b2lkKiBhcnIwLCBpbnQgc3RlcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGFycjEsIGludCBzdGVwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYXJyMiwgaW50IHN0ZXAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBhcnIzLCBpbnQgc3RlcDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2RnVuYzBEKSggY29uc3Qgdm9pZCogc3JjLCB2b2lkKiBkc3QsIGludCBwYXJhbSApOworCisjZGVmaW5lIENWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBGVU5DTkFNRSwgRkxBRyApICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICBpY3ZJbml0IyNGVU5DTkFNRSMjRkxBRyMjVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCB0YWIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFVdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfIyNGTEFHOyAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84U10gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184c18jI0ZMQUc7ICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2dV8jI0ZMQUc7ICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZTXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZzXyMjRkxBRzsgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMnNfIyNGTEFHOyAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl8jI0ZMQUc7ICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRmXyMjRkxBRzsgICAgICAgICBcCit9CisKKworI2RlZmluZSBDVl9ERUZfSU5JVF9CSUdfRlVOQ19UQUJfMkQoIEZVTkNOQU1FLCBGTEFHICkgICAgICAgICAgICAgICBcCitzdGF0aWMgdm9pZCAgaWN2SW5pdCMjRlVOQ05BTUUjI0ZMQUcjI1RhYmxlKCBDdkJpZ0Z1bmNUYWJsZSogdGFiICkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggdGFiICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVQzFdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfQzEjI0ZMQUc7ICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFVDMl0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV9DMiMjRkxBRzsgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84VUMzXSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1X0MzIyNGTEFHOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVQzRdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfQzQjI0ZMQUc7ICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84U0MxXSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzhzX0MxIyNGTEFHOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTQzJdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHNfQzIjI0ZMQUc7ICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFNDM10gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184c19DMyMjRkxBRzsgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84U0M0XSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzhzX0M0IyNGTEFHOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZVQzFdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnVfQzEjI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlVDMl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2dV9DMiMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VUMzXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZ1X0MzIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZVQzRdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnVfQzQjI0ZMQUc7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U0MxXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZzX0MxIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZTQzJdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnNfQzIjI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlNDM10gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2c19DMyMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U0M0XSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZzX0M0IyNGTEFHOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMlNDMV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyc19DMSMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU0MyXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJzX0MyIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJTQzNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMnNfQzMjI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMlNDNF0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyc19DNCMjRkxBRzsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGQzFdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMmZfQzEjI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMkZDMl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl9DMiMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRkMzXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmX0MzIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGQzRdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMmZfQzQjI0ZMQUc7ICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0RkMxXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRmX0MxIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGQzJdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NGZfQzIjI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl82NEZDM10gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzY0Zl9DMyMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0RkM0XSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRmX0M0IyNGTEFHOyAgICAgXAorfQorCisjZGVmaW5lIENWX0RFRl9JTklUX0ZVTkNfVEFCXzBEKCBGVU5DTkFNRSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICBpY3ZJbml0IyNGVU5DTkFNRSMjVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIgKSAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84VV0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dTsgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTXSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzhzOyAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZ1OyAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnM7ICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU10gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyczsgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmOyAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NGY7ICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDVl9ERUZfSU5JVF9GVU5DX1RBQl8xRCAgQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMEQKKworCisjZGVmaW5lIENWX0RFRl9JTklUX1BJWFNJWkVfVEFCXzJEKCBGVU5DTkFNRSwgRkxBRyApICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGljdkluaXQjI0ZVTkNOQU1FIyNGTEFHIyNUYWJsZSggQ3ZCdEZ1bmNUYWJsZSogdGFibGUgKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzFdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfQzEjI0ZMQUc7ICAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbMl0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV9DMiMjRkxBRzsgICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFszXSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1X0MzIyNGTEFHOyAgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzRdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZ1X0MyIyNGTEFHOyAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbNl0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnVfQzMjI0ZMQUc7ICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFs4XSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyc19DMiMjRkxBRzsgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzEyXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJzX0MzIyNGTEFHOyAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbMTZdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NHNfQzIjI0ZMQUc7ICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFsyNF0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzY0c19DMyMjRkxBRzsgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzMyXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRzX0M0IyNGTEFHOyAgICAgICAgIFwKK30KKworI2RlZmluZSAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCB0YWJsZV9lbnRyeSApICBcCisgICAgZnVuYyA9ICh0YWJsZV9lbnRyeSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAhZnVuYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKQorCisKKyNlbmRpZiAvKl9DWENPUkVfTUlTQ19IXyovCmRpZmYgLS1naXQgYS9jeGNvcmUvaW5jbHVkZS9jeHR5cGVzLmggYi9jeGNvcmUvaW5jbHVkZS9jeHR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5MjE4ZQotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9pbmNsdWRlL2N4dHlwZXMuaApAQCAtMCwwICsxLDE3ODAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9DWENPUkVfVFlQRVNfSF8KKyNkZWZpbmUgX0NYQ09SRV9UWVBFU19IXworCisjaWYgIWRlZmluZWQgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFICYmIF9NU0NfVkVSID4gMTMwMAorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUgLyogdG8gYXZvaWQgbXVsdGlwbGUgVmlzdWFsIFN0dWRpbyAyMDA1IHdhcm5pbmdzICovCisjZW5kaWYKKworI2lmbmRlZiBTS0lQX0lOQ0xVREVTCisgICNpbmNsdWRlIDxhc3NlcnQuaD4KKyAgI2luY2x1ZGUgPHN0ZGxpYi5oPgorICAjaW5jbHVkZSA8c3RyaW5nLmg+CisgICNpbmNsdWRlIDxmbG9hdC5oPgorCisgICNpZiBkZWZpbmVkIF9fSUNMCisgICAgI2RlZmluZSBDVl9JQ0MgICBfX0lDTAorICAjZWxpZiBkZWZpbmVkIF9fSUNDCisgICAgI2RlZmluZSBDVl9JQ0MgICBfX0lDQworICAjZWxpZiBkZWZpbmVkIF9fRUNMCisgICAgI2RlZmluZSBDVl9JQ0MgICBfX0VDTAorICAjZWxpZiBkZWZpbmVkIF9fRUNDCisgICAgI2RlZmluZSBDVl9JQ0MgICBfX0VDQworICAjZW5kaWYKKworICAjaWYgZGVmaW5lZCBXSU4zMiAmJiAoIWRlZmluZWQgV0lONjQgfHwgZGVmaW5lZCBFTTY0VCkgJiYgXAorICAgICAgKF9NU0NfVkVSID49IDE0MDAgfHwgZGVmaW5lZCBDVl9JQ0MpIFwKKyAgICAgIHx8IChkZWZpbmVkIF9fU1NFMl9fICYmIGRlZmluZWQgX19HTlVDX18gJiYgX19HTlVDX18gPj0gNCkKKyAgICAjaW5jbHVkZSA8ZW1taW50cmluLmg+CisgICAgI2RlZmluZSBDVl9TU0UyIDEKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIENWX1NTRTIgMAorICAjZW5kaWYKKworICAjaWYgZGVmaW5lZCBfX0JPUkxBTkRDX18KKyAgICAjaW5jbHVkZSA8ZmFzdG1hdGguaD4KKyAgI2VsaWYgZGVmaW5lZCBXSU42NCAmJiAhZGVmaW5lZCBFTTY0VCAmJiBkZWZpbmVkIENWX0lDQworICAgICNpbmNsdWRlIDxtYXRoaW1mLmg+CisgICNlbHNlCisgICAgI2luY2x1ZGUgPG1hdGguaD4KKyAgI2VuZGlmCisKKyAgI2lmZGVmIEhBVkVfSVBMCisgICAgICAjaWZuZGVmIF9fSVBMX0hfXworICAgICAgICAgICNpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQKKyAgICAgICAgICAgICAgI2luY2x1ZGUgPGlwbC5oPgorICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICNpbmNsdWRlIDxpcGwvaXBsLmg+CisgICAgICAgICAgI2VuZGlmCisgICAgICAjZW5kaWYKKyAgI2VsaWYgZGVmaW5lZCBfX0lQTF9IX18KKyAgICAgICNkZWZpbmUgSEFWRV9JUEwKKyAgI2VuZGlmCisjZW5kaWYgLy8gU0tJUF9JTkNMVURFUworCisjaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0CisgICAgI2RlZmluZSBDVl9DREVDTCBfX2NkZWNsCisgICAgI2RlZmluZSBDVl9TVERDQUxMIF9fc3RkY2FsbAorI2Vsc2UKKyAgICAjZGVmaW5lIENWX0NERUNMCisgICAgI2RlZmluZSBDVl9TVERDQUxMCisjZW5kaWYKKworI2lmbmRlZiBDVl9FWFRFUk5fQworICAgICNpZmRlZiBfX2NwbHVzcGx1cworICAgICAgICAjZGVmaW5lIENWX0VYVEVSTl9DIGV4dGVybiAiQyIKKyAgICAgICAgI2RlZmluZSBDVl9ERUZBVUxUKHZhbCkgPSB2YWwKKyAgICAjZWxzZQorICAgICAgICAjZGVmaW5lIENWX0VYVEVSTl9DCisgICAgICAgICNkZWZpbmUgQ1ZfREVGQVVMVCh2YWwpCisgICAgI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBDVl9FWFRFUk5fQ19GVU5DUFRSCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgICAgICNkZWZpbmUgQ1ZfRVhURVJOX0NfRlVOQ1BUUih4KSBleHRlcm4gIkMiIHsgdHlwZWRlZiB4OyB9CisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBDVl9FWFRFUk5fQ19GVU5DUFRSKHgpIHR5cGVkZWYgeAorICAgICNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgQ1ZfSU5MSU5FCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cworICAgICNkZWZpbmUgQ1ZfSU5MSU5FIGlubGluZQorI2VsaWYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NCkgJiYgIWRlZmluZWQgX19HTlVDX18KKyAgICAjZGVmaW5lIENWX0lOTElORSBfX2lubGluZQorI2Vsc2UKKyAgICAjZGVmaW5lIENWX0lOTElORSBzdGF0aWMKKyNlbmRpZgorI2VuZGlmIC8qIENWX0lOTElORSAqLworCisjaWYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NCkgJiYgZGVmaW5lZCBDVkFQSV9FWFBPUlRTCisgICAgI2RlZmluZSBDVl9FWFBPUlRTIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorI2Vsc2UKKyAgICAjZGVmaW5lIENWX0VYUE9SVFMKKyNlbmRpZgorCisjaWZuZGVmIENWQVBJCisgICAgI2RlZmluZSBDVkFQSShyZXR0eXBlKSBDVl9FWFRFUk5fQyBDVl9FWFBPUlRTIHJldHR5cGUgQ1ZfQ0RFQ0wKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fQk9STEFORENfXwordHlwZWRlZiBfX2ludDY0IGludDY0OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0IHVpbnQ2NDsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBpbnQ2NDsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVpbnQ2NDsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfSVBMCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKyNlbmRpZgorCit0eXBlZGVmIHNpZ25lZCBjaGFyIHNjaGFyOworCisvKiBDdkFyciogaXMgdXNlZCB0byBwYXNzIGFyYml0cmFyeQorICogYXJyYXktbGlrZSBkYXRhIHN0cnVjdHVyZXMKKyAqIGludG8gZnVuY3Rpb25zIHdoZXJlIHRoZSBwYXJ0aWN1bGFyCisgKiBhcnJheSB0eXBlIGlzIHJlY29nbml6ZWQgYXQgcnVudGltZToKKyAqLwordHlwZWRlZiB2b2lkIEN2QXJyOworCit0eXBlZGVmIHVuaW9uIEN2MzJzdWYKK3sKKyAgICBpbnQgaTsKKyAgICB1bnNpZ25lZCB1OworICAgIGZsb2F0IGY7Cit9CitDdjMyc3VmOworCit0eXBlZGVmIHVuaW9uIEN2NjRzdWYKK3sKKyAgICBpbnQ2NCBpOworICAgIHVpbnQ2NCB1OworICAgIGRvdWJsZSBmOworfQorQ3Y2NHN1ZjsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb24gbWFjcm9zIGFuZCBpbmxpbmUgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENWX1BJICAgMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMzODMyNzk1CisjZGVmaW5lIENWX0xPRzIgMC42OTMxNDcxODA1NTk5NDUzMDk0MTcyMzIxMjE0NTgxOAorCisjZGVmaW5lIENWX1NXQVAoYSxiLHQpICgodCkgPSAoYSksIChhKSA9IChiKSwgKGIpID0gKHQpKQorCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAgKChhKSA+IChiKSA/IChiKSA6IChhKSkKKyNlbmRpZgorCisjaWZuZGVmIE1BWAorI2RlZmluZSBNQVgoYSxiKSAgKChhKSA8IChiKSA/IChiKSA6IChhKSkKKyNlbmRpZgorCisvKiBtaW4gJiBtYXggd2l0aG91dCBqdW1wcyAqLworI2RlZmluZSAgQ1ZfSU1JTihhLCBiKSAgKChhKSBeICgoKGEpXihiKSkgJiAoKChhKSA8IChiKSkgLSAxKSkpCisKKyNkZWZpbmUgIENWX0lNQVgoYSwgYikgICgoYSkgXiAoKChhKV4oYikpICYgKCgoYSkgPiAoYikpIC0gMSkpKQorCisvKiBhYnNvbHV0ZSB2YWx1ZSB3aXRob3V0IGp1bXBzICovCisjaWZuZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lICBDVl9JQUJTKGEpICAgICAoKChhKSBeICgoYSkgPCAwID8gLTEgOiAwKSkgLSAoKGEpIDwgMCA/IC0xIDogMCkpCisjZWxzZQorI2RlZmluZSAgQ1ZfSUFCUyhhKSAgICAgYWJzKGEpCisjZW5kaWYKKyNkZWZpbmUgIENWX0NNUChhLGIpICAgICgoKGEpID4gKGIpKSAtICgoYSkgPCAoYikpKQorI2RlZmluZSAgQ1ZfU0lHTihhKSAgICAgQ1ZfQ01QKChhKSwwKQorCitDVl9JTkxJTkUgIGludCAgY3ZSb3VuZCggZG91YmxlIHZhbHVlICkKK3sKKyNpZiBDVl9TU0UyCisgICAgX19tMTI4ZCB0ID0gX21tX2xvYWRfc2QoICZ2YWx1ZSApOworICAgIHJldHVybiBfbW1fY3Z0c2Rfc2kzMih0KTsKKyNlbGlmIGRlZmluZWQgV0lOMzIgJiYgIWRlZmluZWQgV0lONjQgJiYgZGVmaW5lZCBfTVNDX1ZFUgorICAgIGludCB0OworICAgIF9fYXNtCisgICAgeworICAgICAgICBmbGQgdmFsdWU7CisgICAgICAgIGZpc3RwIHQ7CisgICAgfQorICAgIHJldHVybiB0OworI2VsaWYgKGRlZmluZWQgSEFWRV9MUklOVCkgfHwgKGRlZmluZWQgV0lONjQgJiYgIWRlZmluZWQgRU02NFQgJiYgZGVmaW5lZCBDVl9JQ0MpCisgICAgcmV0dXJuIChpbnQpbHJpbnQodmFsdWUpOworI2Vsc2UKKyAgICAvKgorICAgICB0aGUgYWxnb3JpdGhtIHdhcyB0YWtlbiBmcm9tIEFnbmVyIEZvZydzIG9wdGltaXphdGlvbiBndWlkZQorICAgICBhdCBodHRwOi8vd3d3LmFnbmVyLm9yZy9hc3NlbQorICAgICAqLworICAgIEN2NjRzdWYgdGVtcDsKKyAgICB0ZW1wLmYgPSB2YWx1ZSArIDY3NTUzOTk0NDEwNTU3NDQuMDsKKyAgICByZXR1cm4gKGludCl0ZW1wLnU7CisjZW5kaWYKK30KKworCitDVl9JTkxJTkUgIGludCAgY3ZGbG9vciggZG91YmxlIHZhbHVlICkKK3sKKyNpZiBDVl9TU0UyCisgICAgX19tMTI4ZCB0ID0gX21tX2xvYWRfc2QoICZ2YWx1ZSApOworICAgIGludCBpID0gX21tX2N2dHNkX3NpMzIodCk7CisgICAgcmV0dXJuIGkgLSBfbW1fbW92ZW1hc2tfcGQoX21tX2NtcGx0X3NkKHQsX21tX2N2dHNpMzJfc2QodCxpKSkpOworI2Vsc2UKKyAgICBpbnQgdGVtcCA9IGN2Um91bmQodmFsdWUpOworICAgIEN2MzJzdWYgZGlmZjsKKyAgICBkaWZmLmYgPSAoZmxvYXQpKHZhbHVlIC0gdGVtcCk7CisgICAgcmV0dXJuIHRlbXAgLSAoZGlmZi5pIDwgMCk7CisjZW5kaWYKK30KKworCitDVl9JTkxJTkUgIGludCAgY3ZDZWlsKCBkb3VibGUgdmFsdWUgKQoreworI2lmIENWX1NTRTIKKyAgICBfX20xMjhkIHQgPSBfbW1fbG9hZF9zZCggJnZhbHVlICk7CisgICAgaW50IGkgPSBfbW1fY3Z0c2Rfc2kzMih0KTsKKyAgICByZXR1cm4gaSArIF9tbV9tb3ZlbWFza19wZChfbW1fY21wbHRfc2QoX21tX2N2dHNpMzJfc2QodCxpKSx0KSk7CisjZWxzZQorICAgIGludCB0ZW1wID0gY3ZSb3VuZCh2YWx1ZSk7CisgICAgQ3YzMnN1ZiBkaWZmOworICAgIGRpZmYuZiA9IChmbG9hdCkodGVtcCAtIHZhbHVlKTsKKyAgICByZXR1cm4gdGVtcCArIChkaWZmLmkgPCAwKTsKKyNlbmRpZgorfQorCisjZGVmaW5lIGN2SW52U3FydCh2YWx1ZSkgKChmbG9hdCkoMS4vc3FydCh2YWx1ZSkpKQorI2RlZmluZSBjdlNxcnQodmFsdWUpICAoKGZsb2F0KXNxcnQodmFsdWUpKQorCitDVl9JTkxJTkUgaW50IGN2SXNOYU4oIGRvdWJsZSB2YWx1ZSApCit7CisjaWYgMS8qZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fQk9STEFORENfXworICAgIHJldHVybiBfaXNuYW4odmFsdWUpOworI2VsaWYgZGVmaW5lZCBfX0dOVUNfXworICAgIHJldHVybiBpc25hbih2YWx1ZSk7CisjZWxzZSovCisgICAgQ3Y2NHN1ZiBpZWVlNzU0OworICAgIGllZWU3NTQuZiA9IHZhbHVlOworICAgIHJldHVybiAoKHVuc2lnbmVkKShpZWVlNzU0LnUgPj4gMzIpICYgMHg3ZmZmZmZmZikgKworICAgICAgICAgICAoKHVuc2lnbmVkKWllZWU3NTQudSAhPSAwKSA+IDB4N2ZmMDAwMDA7CisjZW5kaWYKK30KKworCitDVl9JTkxJTkUgaW50IGN2SXNJbmYoIGRvdWJsZSB2YWx1ZSApCit7CisjaWYgMS8qZGVmaW5lZCBfTVNDX1ZFUiB8fCBkZWZpbmVkIF9fQk9STEFORENfXworICAgIHJldHVybiAhX2Zpbml0ZSh2YWx1ZSk7CisjZWxpZiBkZWZpbmVkIF9fR05VQ19fCisgICAgcmV0dXJuIGlzaW5mKHZhbHVlKTsKKyNlbHNlKi8KKyAgICBDdjY0c3VmIGllZWU3NTQ7CisgICAgaWVlZTc1NC5mID0gdmFsdWU7CisgICAgcmV0dXJuICgodW5zaWduZWQpKGllZWU3NTQudSA+PiAzMikgJiAweDdmZmZmZmZmKSA9PSAweDdmZjAwMDAwICYmCisgICAgICAgICAgICh1bnNpZ25lZClpZWVlNzU0LnUgPT0gMDsKKyNlbmRpZgorfQorCisKKy8qKioqKioqKioqKioqKiogUmFuZG9tIG51bWJlciBnZW5lcmF0aW9uICoqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgdWludDY0IEN2Uk5HOworCitDVl9JTkxJTkUgQ3ZSTkcgY3ZSTkcoIGludDY0IHNlZWQgQ1ZfREVGQVVMVCgtMSkpCit7CisgICAgQ3ZSTkcgcm5nID0gc2VlZCA/ICh1aW50NjQpc2VlZCA6ICh1aW50NjQpKGludDY0KS0xOworICAgIHJldHVybiBybmc7Cit9CisKKy8qIFJldHVybiByYW5kb20gMzItYml0IHVuc2lnbmVkIGludGVnZXI6ICovCitDVl9JTkxJTkUgdW5zaWduZWQgY3ZSYW5kSW50KCBDdlJORyogcm5nICkKK3sKKyAgICB1aW50NjQgdGVtcCA9ICpybmc7CisgICAgdGVtcCA9ICh1aW50NjQpKHVuc2lnbmVkKXRlbXAqMTU1NDExNTU1NCArICh0ZW1wID4+IDMyKTsKKyAgICAqcm5nID0gdGVtcDsKKyAgICByZXR1cm4gKHVuc2lnbmVkKXRlbXA7Cit9CisKKy8qIFJldHVybnMgcmFuZG9tIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDE6ICovCitDVl9JTkxJTkUgZG91YmxlIGN2UmFuZFJlYWwoIEN2Uk5HKiBybmcgKQoreworICAgIHJldHVybiBjdlJhbmRJbnQocm5nKSoyLjMyODMwNjQzNjUzODY5NjI4OTA2MjVlLTEwIC8qIDJeLTMyICovOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgdHlwZSAoSXBsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgSEFWRV9JUEwKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgKHVudGlsICNlbmRpZikKKyAqIGlzIGFuIGV4dHJhY3QgZnJvbSBJUEwgaGVhZGVycy4KKyAqIENvcHlyaWdodCAoYykgMTk5NSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqLworI2RlZmluZSBJUExfREVQVEhfU0lHTiAweDgwMDAwMDAwCisKKyNkZWZpbmUgSVBMX0RFUFRIXzFVICAgICAxCisjZGVmaW5lIElQTF9ERVBUSF84VSAgICAgOAorI2RlZmluZSBJUExfREVQVEhfMTZVICAgMTYKKyNkZWZpbmUgSVBMX0RFUFRIXzMyRiAgIDMyCisKKyNkZWZpbmUgSVBMX0RFUFRIXzhTICAoSVBMX0RFUFRIX1NJR058IDgpCisjZGVmaW5lIElQTF9ERVBUSF8xNlMgKElQTF9ERVBUSF9TSUdOfDE2KQorI2RlZmluZSBJUExfREVQVEhfMzJTIChJUExfREVQVEhfU0lHTnwzMikKKworI2RlZmluZSBJUExfREFUQV9PUkRFUl9QSVhFTCAgMAorI2RlZmluZSBJUExfREFUQV9PUkRFUl9QTEFORSAgMQorCisjZGVmaW5lIElQTF9PUklHSU5fVEwgMAorI2RlZmluZSBJUExfT1JJR0lOX0JMIDEKKworI2RlZmluZSBJUExfQUxJR05fNEJZVEVTICAgNAorI2RlZmluZSBJUExfQUxJR05fOEJZVEVTICAgOAorI2RlZmluZSBJUExfQUxJR05fMTZCWVRFUyAxNgorI2RlZmluZSBJUExfQUxJR05fMzJCWVRFUyAzMgorCisjZGVmaW5lIElQTF9BTElHTl9EV09SRCAgIElQTF9BTElHTl80QllURVMKKyNkZWZpbmUgSVBMX0FMSUdOX1FXT1JEICAgSVBMX0FMSUdOXzhCWVRFUworCisjZGVmaW5lIElQTF9CT1JERVJfQ09OU1RBTlQgICAwCisjZGVmaW5lIElQTF9CT1JERVJfUkVQTElDQVRFICAxCisjZGVmaW5lIElQTF9CT1JERVJfUkVGTEVDVCAgICAyCisjZGVmaW5lIElQTF9CT1JERVJfV1JBUCAgICAgICAzCisKK3R5cGVkZWYgc3RydWN0IF9JcGxJbWFnZQoreworICAgIGludCAgblNpemU7ICAgICAgICAgICAgIC8qIHNpemVvZihJcGxJbWFnZSkgKi8KKyAgICBpbnQgIElEOyAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uICg9MCkqLworICAgIGludCAgbkNoYW5uZWxzOyAgICAgICAgIC8qIE1vc3Qgb2YgT3BlbkNWIGZ1bmN0aW9ucyBzdXBwb3J0IDEsMiwzIG9yIDQgY2hhbm5lbHMgKi8KKyAgICBpbnQgIGFscGhhQ2hhbm5lbDsgICAgICAvKiBJZ25vcmVkIGJ5IE9wZW5DViAqLworICAgIGludCAgZGVwdGg7ICAgICAgICAgICAgIC8qIFBpeGVsIGRlcHRoIGluIGJpdHM6IElQTF9ERVBUSF84VSwgSVBMX0RFUFRIXzhTLCBJUExfREVQVEhfMTZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQTF9ERVBUSF8zMlMsIElQTF9ERVBUSF8zMkYgYW5kIElQTF9ERVBUSF82NEYgYXJlIHN1cHBvcnRlZC4gICovCisgICAgY2hhciBjb2xvck1vZGVsWzRdOyAgICAgLyogSWdub3JlZCBieSBPcGVuQ1YgKi8KKyAgICBjaGFyIGNoYW5uZWxTZXFbNF07ICAgICAvKiBkaXR0byAqLworICAgIGludCAgZGF0YU9yZGVyOyAgICAgICAgIC8qIDAgLSBpbnRlcmxlYXZlZCBjb2xvciBjaGFubmVscywgMSAtIHNlcGFyYXRlIGNvbG9yIGNoYW5uZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Q3JlYXRlSW1hZ2UgY2FuIG9ubHkgY3JlYXRlIGludGVybGVhdmVkIGltYWdlcyAqLworICAgIGludCAgb3JpZ2luOyAgICAgICAgICAgIC8qIDAgLSB0b3AtbGVmdCBvcmlnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAtIGJvdHRvbS1sZWZ0IG9yaWdpbiAoV2luZG93cyBiaXRtYXBzIHN0eWxlKS4gICovCisgICAgaW50ICBhbGlnbjsgICAgICAgICAgICAgLyogQWxpZ25tZW50IG9mIGltYWdlIHJvd3MgKDQgb3IgOCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlbkNWIGlnbm9yZXMgaXQgYW5kIHVzZXMgd2lkdGhTdGVwIGluc3RlYWQuICAgICovCisgICAgaW50ICB3aWR0aDsgICAgICAgICAgICAgLyogSW1hZ2Ugd2lkdGggaW4gcGl4ZWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICBoZWlnaHQ7ICAgICAgICAgICAgLyogSW1hZ2UgaGVpZ2h0IGluIHBpeGVscy4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgc3RydWN0IF9JcGxST0kgKnJvaTsgICAgLyogSW1hZ2UgUk9JLiBJZiBOVUxMLCB0aGUgd2hvbGUgaW1hZ2UgaXMgc2VsZWN0ZWQuICovCisgICAgc3RydWN0IF9JcGxJbWFnZSAqbWFza1JPSTsgICAgICAvKiBNdXN0IGJlIE5VTEwuICovCisgICAgdm9pZCAgKmltYWdlSWQ7ICAgICAgICAgICAgICAgICAvKiAiICAgICAgICAgICAiICovCisgICAgc3RydWN0IF9JcGxUaWxlSW5mbyAqdGlsZUluZm87ICAvKiAiICAgICAgICAgICAiICovCisgICAgaW50ICBpbWFnZVNpemU7ICAgICAgICAgLyogSW1hZ2UgZGF0YSBzaXplIGluIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD09aW1hZ2UtPmhlaWdodCppbWFnZS0+d2lkdGhTdGVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gY2FzZSBvZiBpbnRlcmxlYXZlZCBkYXRhKSovCisgICAgY2hhciAqaW1hZ2VEYXRhOyAgICAgICAgLyogUG9pbnRlciB0byBhbGlnbmVkIGltYWdlIGRhdGEuICAgICAgICAgKi8KKyAgICBpbnQgIHdpZHRoU3RlcDsgICAgICAgICAvKiBTaXplIG9mIGFsaWduZWQgaW1hZ2Ugcm93IGluIGJ5dGVzLiAgICAqLworICAgIGludCAgQm9yZGVyTW9kZVs0XTsgICAgIC8qIElnbm9yZWQgYnkgT3BlbkNWLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICBCb3JkZXJDb25zdFs0XTsgICAgLyogRGl0dG8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBjaGFyICppbWFnZURhdGFPcmlnaW47ICAvKiBQb2ludGVyIHRvIHZlcnkgb3JpZ2luIG9mIGltYWdlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IG5lY2Vzc2FyaWx5IGFsaWduZWQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkZWQgZm9yIGNvcnJlY3QgZGVhbGxvY2F0aW9uICovCit9CitJcGxJbWFnZTsKKwordHlwZWRlZiBzdHJ1Y3QgX0lwbFRpbGVJbmZvIElwbFRpbGVJbmZvOworCit0eXBlZGVmIHN0cnVjdCBfSXBsUk9JCit7CisgICAgaW50ICBjb2k7IC8qIDAgLSBubyBDT0kgKGFsbCBjaGFubmVscyBhcmUgc2VsZWN0ZWQpLCAxIC0gMHRoIGNoYW5uZWwgaXMgc2VsZWN0ZWQgLi4uKi8KKyAgICBpbnQgIHhPZmZzZXQ7CisgICAgaW50ICB5T2Zmc2V0OworICAgIGludCAgd2lkdGg7CisgICAgaW50ICBoZWlnaHQ7Cit9CitJcGxST0k7CisKK3R5cGVkZWYgc3RydWN0IF9JcGxDb252S2VybmVsCit7CisgICAgaW50ICBuQ29sczsKKyAgICBpbnQgIG5Sb3dzOworICAgIGludCAgYW5jaG9yWDsKKyAgICBpbnQgIGFuY2hvclk7CisgICAgaW50ICp2YWx1ZXM7CisgICAgaW50ICBuU2hpZnRSOworfQorSXBsQ29udktlcm5lbDsKKwordHlwZWRlZiBzdHJ1Y3QgX0lwbENvbnZLZXJuZWxGUAoreworICAgIGludCAgbkNvbHM7CisgICAgaW50ICBuUm93czsKKyAgICBpbnQgIGFuY2hvclg7CisgICAgaW50ICBhbmNob3JZOworICAgIGZsb2F0ICp2YWx1ZXM7Cit9CitJcGxDb252S2VybmVsRlA7CisKKyNkZWZpbmUgSVBMX0lNQUdFX0hFQURFUiAxCisjZGVmaW5lIElQTF9JTUFHRV9EQVRBICAgMgorI2RlZmluZSBJUExfSU1BR0VfUk9JICAgIDQKKworI2VuZGlmLypIQVZFX0lQTCovCisKKy8qIGV4dHJhIGJvcmRlciBtb2RlICovCisjZGVmaW5lIElQTF9CT1JERVJfUkVGTEVDVF8xMDEgICAgNAorCisjZGVmaW5lIElQTF9JTUFHRV9NQUdJQ19WQUwgICgoaW50KXNpemVvZihJcGxJbWFnZSkpCisjZGVmaW5lIENWX1RZUEVfTkFNRV9JTUFHRSAib3BlbmN2LWltYWdlIgorCisjZGVmaW5lIENWX0lTX0lNQUdFX0hEUihpbWcpIFwKKyAgICAoKGltZykgIT0gTlVMTCAmJiAoKGNvbnN0IElwbEltYWdlKikoaW1nKSktPm5TaXplID09IHNpemVvZihJcGxJbWFnZSkpCisKKyNkZWZpbmUgQ1ZfSVNfSU1BR0UoaW1nKSBcCisgICAgKENWX0lTX0lNQUdFX0hEUihpbWcpICYmICgoSXBsSW1hZ2UqKWltZyktPmltYWdlRGF0YSAhPSBOVUxMKQorCisvKiBmb3Igc3RvcmluZyBkb3VibGUtcHJlY2lzaW9uCisgICBmbG9hdGluZyBwb2ludCBkYXRhIGluIElwbEltYWdlJ3MgKi8KKyNkZWZpbmUgSVBMX0RFUFRIXzY0RiAgNjQKKworLyogZ2V0IHJlZmVyZW5jZSB0byBwaXhlbCBhdCAoY29sLHJvdyksCisgICBmb3IgbXVsdGktY2hhbm5lbCBpbWFnZXMgKGNvbCkgc2hvdWxkIGJlIG11bHRpcGxpZWQgYnkgbnVtYmVyIG9mIGNoYW5uZWxzICovCisjZGVmaW5lIENWX0lNQUdFX0VMRU0oIGltYWdlLCBlbGVtdHlwZSwgcm93LCBjb2wgKSAgICAgICBcCisgICAgKCgoZWxlbXR5cGUqKSgoaW1hZ2UpLT5pbWFnZURhdGEgKyAoaW1hZ2UpLT53aWR0aFN0ZXAqKHJvdykpKVsoY29sKV0pCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXggdHlwZSAoQ3ZNYXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9DTl9NQVggICAgIDY0CisjZGVmaW5lIENWX0NOX1NISUZUICAgMworI2RlZmluZSBDVl9ERVBUSF9NQVggICgxIDw8IENWX0NOX1NISUZUKQorCisjZGVmaW5lIENWXzhVICAgMAorI2RlZmluZSBDVl84UyAgIDEKKyNkZWZpbmUgQ1ZfMTZVICAyCisjZGVmaW5lIENWXzE2UyAgMworI2RlZmluZSBDVl8zMlMgIDQKKyNkZWZpbmUgQ1ZfMzJGICA1CisjZGVmaW5lIENWXzY0RiAgNgorI2RlZmluZSBDVl9VU1JUWVBFMSA3CisKKyNkZWZpbmUgQ1ZfTUFLRVRZUEUoZGVwdGgsY24pICgoZGVwdGgpICsgKCgoY24pLTEpIDw8IENWX0NOX1NISUZUKSkKKyNkZWZpbmUgQ1ZfTUFLRV9UWVBFIENWX01BS0VUWVBFCisKKyNkZWZpbmUgQ1ZfOFVDMSBDVl9NQUtFVFlQRShDVl84VSwxKQorI2RlZmluZSBDVl84VUMyIENWX01BS0VUWVBFKENWXzhVLDIpCisjZGVmaW5lIENWXzhVQzMgQ1ZfTUFLRVRZUEUoQ1ZfOFUsMykKKyNkZWZpbmUgQ1ZfOFVDNCBDVl9NQUtFVFlQRShDVl84VSw0KQorI2RlZmluZSBDVl84VUMobikgQ1ZfTUFLRVRZUEUoQ1ZfOFUsKG4pKQorCisjZGVmaW5lIENWXzhTQzEgQ1ZfTUFLRVRZUEUoQ1ZfOFMsMSkKKyNkZWZpbmUgQ1ZfOFNDMiBDVl9NQUtFVFlQRShDVl84UywyKQorI2RlZmluZSBDVl84U0MzIENWX01BS0VUWVBFKENWXzhTLDMpCisjZGVmaW5lIENWXzhTQzQgQ1ZfTUFLRVRZUEUoQ1ZfOFMsNCkKKyNkZWZpbmUgQ1ZfOFNDKG4pIENWX01BS0VUWVBFKENWXzhTLChuKSkKKworI2RlZmluZSBDVl8xNlVDMSBDVl9NQUtFVFlQRShDVl8xNlUsMSkKKyNkZWZpbmUgQ1ZfMTZVQzIgQ1ZfTUFLRVRZUEUoQ1ZfMTZVLDIpCisjZGVmaW5lIENWXzE2VUMzIENWX01BS0VUWVBFKENWXzE2VSwzKQorI2RlZmluZSBDVl8xNlVDNCBDVl9NQUtFVFlQRShDVl8xNlUsNCkKKyNkZWZpbmUgQ1ZfMTZVQyhuKSBDVl9NQUtFVFlQRShDVl8xNlUsKG4pKQorCisjZGVmaW5lIENWXzE2U0MxIENWX01BS0VUWVBFKENWXzE2UywxKQorI2RlZmluZSBDVl8xNlNDMiBDVl9NQUtFVFlQRShDVl8xNlMsMikKKyNkZWZpbmUgQ1ZfMTZTQzMgQ1ZfTUFLRVRZUEUoQ1ZfMTZTLDMpCisjZGVmaW5lIENWXzE2U0M0IENWX01BS0VUWVBFKENWXzE2Uyw0KQorI2RlZmluZSBDVl8xNlNDKG4pIENWX01BS0VUWVBFKENWXzE2UywobikpCisKKyNkZWZpbmUgQ1ZfMzJTQzEgQ1ZfTUFLRVRZUEUoQ1ZfMzJTLDEpCisjZGVmaW5lIENWXzMyU0MyIENWX01BS0VUWVBFKENWXzMyUywyKQorI2RlZmluZSBDVl8zMlNDMyBDVl9NQUtFVFlQRShDVl8zMlMsMykKKyNkZWZpbmUgQ1ZfMzJTQzQgQ1ZfTUFLRVRZUEUoQ1ZfMzJTLDQpCisjZGVmaW5lIENWXzMyU0MobikgQ1ZfTUFLRVRZUEUoQ1ZfMzJTLChuKSkKKworI2RlZmluZSBDVl8zMkZDMSBDVl9NQUtFVFlQRShDVl8zMkYsMSkKKyNkZWZpbmUgQ1ZfMzJGQzIgQ1ZfTUFLRVRZUEUoQ1ZfMzJGLDIpCisjZGVmaW5lIENWXzMyRkMzIENWX01BS0VUWVBFKENWXzMyRiwzKQorI2RlZmluZSBDVl8zMkZDNCBDVl9NQUtFVFlQRShDVl8zMkYsNCkKKyNkZWZpbmUgQ1ZfMzJGQyhuKSBDVl9NQUtFVFlQRShDVl8zMkYsKG4pKQorCisjZGVmaW5lIENWXzY0RkMxIENWX01BS0VUWVBFKENWXzY0RiwxKQorI2RlZmluZSBDVl82NEZDMiBDVl9NQUtFVFlQRShDVl82NEYsMikKKyNkZWZpbmUgQ1ZfNjRGQzMgQ1ZfTUFLRVRZUEUoQ1ZfNjRGLDMpCisjZGVmaW5lIENWXzY0RkM0IENWX01BS0VUWVBFKENWXzY0Riw0KQorI2RlZmluZSBDVl82NEZDKG4pIENWX01BS0VUWVBFKENWXzY0RiwobikpCisKKyNkZWZpbmUgQ1ZfQVVUT19TVEVQICAweDdmZmZmZmZmCisjZGVmaW5lIENWX1dIT0xFX0FSUiAgY3ZTbGljZSggMCwgMHgzZmZmZmZmZiApCisKKyNkZWZpbmUgQ1ZfTUFUX0NOX01BU0sgICAgICAgICAgKChDVl9DTl9NQVggLSAxKSA8PCBDVl9DTl9TSElGVCkKKyNkZWZpbmUgQ1ZfTUFUX0NOKGZsYWdzKSAgICAgICAgKCgoKGZsYWdzKSAmIENWX01BVF9DTl9NQVNLKSA+PiBDVl9DTl9TSElGVCkgKyAxKQorI2RlZmluZSBDVl9NQVRfREVQVEhfTUFTSyAgICAgICAoQ1ZfREVQVEhfTUFYIC0gMSkKKyNkZWZpbmUgQ1ZfTUFUX0RFUFRIKGZsYWdzKSAgICAgKChmbGFncykgJiBDVl9NQVRfREVQVEhfTUFTSykKKyNkZWZpbmUgQ1ZfTUFUX1RZUEVfTUFTSyAgICAgICAgKENWX0RFUFRIX01BWCpDVl9DTl9NQVggLSAxKQorI2RlZmluZSBDVl9NQVRfVFlQRShmbGFncykgICAgICAoKGZsYWdzKSAmIENWX01BVF9UWVBFX01BU0spCisjZGVmaW5lIENWX01BVF9DT05UX0ZMQUdfU0hJRlQgIDE0CisjZGVmaW5lIENWX01BVF9DT05UX0ZMQUcgICAgICAgICgxIDw8IENWX01BVF9DT05UX0ZMQUdfU0hJRlQpCisjZGVmaW5lIENWX0lTX01BVF9DT05UKGZsYWdzKSAgICgoZmxhZ3MpICYgQ1ZfTUFUX0NPTlRfRkxBRykKKyNkZWZpbmUgQ1ZfSVNfQ09OVF9NQVQgICAgICAgICAgQ1ZfSVNfTUFUX0NPTlQKKyNkZWZpbmUgQ1ZfTUFUX1RFTVBfRkxBR19TSElGVCAgMTUKKyNkZWZpbmUgQ1ZfTUFUX1RFTVBfRkxBRyAgICAgICAgKDEgPDwgQ1ZfTUFUX1RFTVBfRkxBR19TSElGVCkKKyNkZWZpbmUgQ1ZfSVNfVEVNUF9NQVQoZmxhZ3MpICAgKChmbGFncykgJiBDVl9NQVRfVEVNUF9GTEFHKQorCisjZGVmaW5lIENWX01BR0lDX01BU0sgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBDVl9NQVRfTUFHSUNfVkFMICAgIDB4NDI0MjAwMDAKKyNkZWZpbmUgQ1ZfVFlQRV9OQU1FX01BVCAgICAib3BlbmN2LW1hdHJpeCIKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZNYXQKK3sKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgc3RlcDsKKworICAgIC8qIGZvciBpbnRlcm5hbCB1c2Ugb25seSAqLworICAgIGludCogcmVmY291bnQ7CisgICAgaW50IGhkcl9yZWZjb3VudDsKKworICAgIHVuaW9uCisgICAgeworICAgICAgICB1Y2hhciogcHRyOworICAgICAgICBzaG9ydCogczsKKyAgICAgICAgaW50KiBpOworICAgICAgICBmbG9hdCogZmw7CisgICAgICAgIGRvdWJsZSogZGI7CisgICAgfSBkYXRhOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgaW50IHJvd3M7CisgICAgICAgIGludCBoZWlnaHQ7CisgICAgfTsKKworICAgIHVuaW9uCisgICAgeworICAgICAgICBpbnQgY29sczsKKyAgICAgICAgaW50IHdpZHRoOworICAgIH07CisjZWxzZQorICAgIGludCByb3dzOworICAgIGludCBjb2xzOworI2VuZGlmCisKK30KK0N2TWF0OworCisKKyNkZWZpbmUgQ1ZfSVNfTUFUX0hEUihtYXQpIFwKKyAgICAoKG1hdCkgIT0gTlVMTCAmJiBcCisgICAgKCgoY29uc3QgQ3ZNYXQqKShtYXQpKS0+dHlwZSAmIENWX01BR0lDX01BU0spID09IENWX01BVF9NQUdJQ19WQUwgJiYgXAorICAgICgoY29uc3QgQ3ZNYXQqKShtYXQpKS0+Y29scyA+IDAgJiYgKChjb25zdCBDdk1hdCopKG1hdCkpLT5yb3dzID4gMCkKKworI2RlZmluZSBDVl9JU19NQVQobWF0KSBcCisgICAgKENWX0lTX01BVF9IRFIobWF0KSAmJiAoKGNvbnN0IEN2TWF0KikobWF0KSktPmRhdGEucHRyICE9IE5VTEwpCisKKyNkZWZpbmUgQ1ZfSVNfTUFTS19BUlIobWF0KSBcCisgICAgKCgobWF0KS0+dHlwZSAmIChDVl9NQVRfVFlQRV9NQVNLICYgfkNWXzhTQzEpKSA9PSAwKQorCisjZGVmaW5lIENWX0FSRV9UWVBFU19FUShtYXQxLCBtYXQyKSBcCisgICAgKCgoKG1hdDEpLT50eXBlIF4gKG1hdDIpLT50eXBlKSAmIENWX01BVF9UWVBFX01BU0spID09IDApCisKKyNkZWZpbmUgQ1ZfQVJFX0NOU19FUShtYXQxLCBtYXQyKSBcCisgICAgKCgoKG1hdDEpLT50eXBlIF4gKG1hdDIpLT50eXBlKSAmIENWX01BVF9DTl9NQVNLKSA9PSAwKQorCisjZGVmaW5lIENWX0FSRV9ERVBUSFNfRVEobWF0MSwgbWF0MikgXAorICAgICgoKChtYXQxKS0+dHlwZSBeIChtYXQyKS0+dHlwZSkgJiBDVl9NQVRfREVQVEhfTUFTSykgPT0gMCkKKworI2RlZmluZSBDVl9BUkVfU0laRVNfRVEobWF0MSwgbWF0MikgXAorICAgICgobWF0MSktPnJvd3MgPT0gKG1hdDIpLT5yb3dzICYmIChtYXQxKS0+Y29scyA9PSAobWF0MiktPmNvbHMpCisKKyNkZWZpbmUgQ1ZfSVNfTUFUX0NPTlNUKG1hdCkgIFwKKyAgICAoKChtYXQpLT5yb3dzfChtYXQpLT5jb2xzKSA9PSAxKQorCisvKiBTaXplIG9mIGVhY2ggY2hhbm5lbCBpdGVtLAorICAgMHgxMjQ0ODkgPSAxMDAwIDAxMDAgMDEwMCAwMDEwIDAwMTAgMDAwMSAwMDAxIH4gYXJyYXkgb2Ygc2l6ZW9mKGFycl90eXBlX2VsZW0pICovCisjZGVmaW5lIENWX0VMRU1fU0laRTEodHlwZSkgXAorICAgICgoKChzaXplb2Yoc2l6ZV90KTw8MjgpfDB4ODQ0MjIxMSkgPj4gQ1ZfTUFUX0RFUFRIKHR5cGUpKjQpICYgMTUpCisKKy8qIDB4M2E1MCA9IDExIDEwIDEwIDAxIDAxIDAwIDAwIH4gYXJyYXkgb2YgbG9nMihzaXplb2YoYXJyX3R5cGVfZWxlbSkpICovCisjZGVmaW5lIENWX0VMRU1fU0laRSh0eXBlKSBcCisgICAgKENWX01BVF9DTih0eXBlKSA8PCAoKCgoc2l6ZW9mKHNpemVfdCkvNCsxKSoxNjM4NHwweDNhNTApID4+IENWX01BVF9ERVBUSCh0eXBlKSoyKSAmIDMpKQorCisvKiBJbmxpbmUgY29uc3RydWN0b3IuIE5vIGRhdGEgaXMgYWxsb2NhdGVkIGludGVybmFsbHkhISEKKyAqIChVc2UgdG9nZXRoZXIgd2l0aCBjdkNyZWF0ZURhdGEsIG9yIHVzZSBjdkNyZWF0ZU1hdCBpbnN0ZWFkIHRvCisgKiBnZXQgYSBtYXRyaXggd2l0aCBhbGxvY2F0ZWQgZGF0YSk6CisgKi8KK0NWX0lOTElORSBDdk1hdCBjdk1hdCggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSwgdm9pZCogZGF0YSBDVl9ERUZBVUxUKE5VTEwpKQoreworICAgIEN2TWF0IG07CisKKyAgICBhc3NlcnQoICh1bnNpZ25lZClDVl9NQVRfREVQVEgodHlwZSkgPD0gQ1ZfNjRGICk7CisgICAgdHlwZSA9IENWX01BVF9UWVBFKHR5cGUpOworICAgIG0udHlwZSA9IENWX01BVF9NQUdJQ19WQUwgfCBDVl9NQVRfQ09OVF9GTEFHIHwgdHlwZTsKKyAgICBtLmNvbHMgPSBjb2xzOworICAgIG0ucm93cyA9IHJvd3M7CisgICAgbS5zdGVwID0gcm93cyA+IDEgPyBtLmNvbHMqQ1ZfRUxFTV9TSVpFKHR5cGUpIDogMDsKKyAgICBtLmRhdGEucHRyID0gKHVjaGFyKilkYXRhOworICAgIG0ucmVmY291bnQgPSBOVUxMOworICAgIG0uaGRyX3JlZmNvdW50ID0gMDsKKworICAgIHJldHVybiBtOworfQorCisKKyNkZWZpbmUgQ1ZfTUFUX0VMRU1fUFRSX0ZBU1QoIG1hdCwgcm93LCBjb2wsIHBpeF9zaXplICkgIFwKKyAgICAoYXNzZXJ0KCAodW5zaWduZWQpKHJvdykgPCAodW5zaWduZWQpKG1hdCkucm93cyAmJiAgIFwKKyAgICAgICAgICAgICAodW5zaWduZWQpKGNvbCkgPCAodW5zaWduZWQpKG1hdCkuY29scyApLCAgIFwKKyAgICAgKG1hdCkuZGF0YS5wdHIgKyAoc2l6ZV90KShtYXQpLnN0ZXAqKHJvdykgKyAocGl4X3NpemUpKihjb2wpKQorCisjZGVmaW5lIENWX01BVF9FTEVNX1BUUiggbWF0LCByb3csIGNvbCApICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfTUFUX0VMRU1fUFRSX0ZBU1QoIG1hdCwgcm93LCBjb2wsIENWX0VMRU1fU0laRSgobWF0KS50eXBlKSApCisKKyNkZWZpbmUgQ1ZfTUFUX0VMRU0oIG1hdCwgZWxlbXR5cGUsIHJvdywgY29sICkgICAgICAgICAgIFwKKyAgICAoKihlbGVtdHlwZSopQ1ZfTUFUX0VMRU1fUFRSX0ZBU1QoIG1hdCwgcm93LCBjb2wsIHNpemVvZihlbGVtdHlwZSkpKQorCisKK0NWX0lOTElORSAgZG91YmxlICBjdm1HZXQoIGNvbnN0IEN2TWF0KiBtYXQsIGludCByb3csIGludCBjb2wgKQoreworICAgIGludCB0eXBlOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgYXNzZXJ0KCAodW5zaWduZWQpcm93IDwgKHVuc2lnbmVkKW1hdC0+cm93cyAmJgorICAgICAgICAgICAgKHVuc2lnbmVkKWNvbCA8ICh1bnNpZ25lZCltYXQtPmNvbHMgKTsKKworICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgcmV0dXJuICgoZmxvYXQqKShtYXQtPmRhdGEucHRyICsgKHNpemVfdCltYXQtPnN0ZXAqcm93KSlbY29sXTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoIHR5cGUgPT0gQ1ZfNjRGQzEgKTsKKyAgICAgICAgcmV0dXJuICgoZG91YmxlKikobWF0LT5kYXRhLnB0ciArIChzaXplX3QpbWF0LT5zdGVwKnJvdykpW2NvbF07CisgICAgfQorfQorCisKK0NWX0lOTElORSAgdm9pZCAgY3ZtU2V0KCBDdk1hdCogbWF0LCBpbnQgcm93LCBpbnQgY29sLCBkb3VibGUgdmFsdWUgKQoreworICAgIGludCB0eXBlOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgIGFzc2VydCggKHVuc2lnbmVkKXJvdyA8ICh1bnNpZ25lZCltYXQtPnJvd3MgJiYKKyAgICAgICAgICAgICh1bnNpZ25lZCljb2wgPCAodW5zaWduZWQpbWF0LT5jb2xzICk7CisKKyAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICgoZmxvYXQqKShtYXQtPmRhdGEucHRyICsgKHNpemVfdCltYXQtPnN0ZXAqcm93KSlbY29sXSA9IChmbG9hdCl2YWx1ZTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBhc3NlcnQoIHR5cGUgPT0gQ1ZfNjRGQzEgKTsKKyAgICAgICAgKChkb3VibGUqKShtYXQtPmRhdGEucHRyICsgKHNpemVfdCltYXQtPnN0ZXAqcm93KSlbY29sXSA9IChkb3VibGUpdmFsdWU7CisgICAgfQorfQorCisKK0NWX0lOTElORSBpbnQgY3ZDdlRvSXBsRGVwdGgoIGludCB0eXBlICkKK3sKKyAgICBpbnQgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgcmV0dXJuIENWX0VMRU1fU0laRTEoZGVwdGgpKjggfCAoZGVwdGggPT0gQ1ZfOFMgfHwgZGVwdGggPT0gQ1ZfMTZTIHx8CisgICAgICAgICAgIGRlcHRoID09IENWXzMyUyA/IElQTF9ERVBUSF9TSUdOIDogMCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICBNdWx0aS1kaW1lbnNpb25hbCBkZW5zZSBhcnJheSAoQ3ZNYXRORCkgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENWX01BVE5EX01BR0lDX1ZBTCAgICAweDQyNDMwMDAwCisjZGVmaW5lIENWX1RZUEVfTkFNRV9NQVRORCAgICAib3BlbmN2LW5kLW1hdHJpeCIKKworI2RlZmluZSBDVl9NQVhfRElNICAgICAgICAgICAgMzIKKyNkZWZpbmUgQ1ZfTUFYX0RJTV9IRUFQICAgICAgICgxIDw8IDE2KQorCit0eXBlZGVmIHN0cnVjdCBDdk1hdE5ECit7CisgICAgaW50IHR5cGU7CisgICAgaW50IGRpbXM7CisKKyAgICBpbnQqIHJlZmNvdW50OworICAgIGludCBoZHJfcmVmY291bnQ7CisKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgdWNoYXIqIHB0cjsKKyAgICAgICAgZmxvYXQqIGZsOworICAgICAgICBkb3VibGUqIGRiOworICAgICAgICBpbnQqIGk7CisgICAgICAgIHNob3J0KiBzOworICAgIH0gZGF0YTsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgaW50IHNpemU7CisgICAgICAgIGludCBzdGVwOworICAgIH0KKyAgICBkaW1bQ1ZfTUFYX0RJTV07Cit9CitDdk1hdE5EOworCisjZGVmaW5lIENWX0lTX01BVE5EX0hEUihtYXQpIFwKKyAgICAoKG1hdCkgIT0gTlVMTCAmJiAoKChjb25zdCBDdk1hdE5EKikobWF0KSktPnR5cGUgJiBDVl9NQUdJQ19NQVNLKSA9PSBDVl9NQVRORF9NQUdJQ19WQUwpCisKKyNkZWZpbmUgQ1ZfSVNfTUFUTkQobWF0KSBcCisgICAgKENWX0lTX01BVE5EX0hEUihtYXQpICYmICgoY29uc3QgQ3ZNYXRORCopKG1hdCkpLT5kYXRhLnB0ciAhPSBOVUxMKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICBNdWx0aS1kaW1lbnNpb25hbCBzcGFyc2UgYXJyYXkgKEN2U3BhcnNlTWF0KSAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9TUEFSU0VfTUFUX01BR0lDX1ZBTCAgICAweDQyNDQwMDAwCisjZGVmaW5lIENWX1RZUEVfTkFNRV9TUEFSU0VfTUFUICAgICJvcGVuY3Ytc3BhcnNlLW1hdHJpeCIKKworc3RydWN0IEN2U2V0OworCit0eXBlZGVmIHN0cnVjdCBDdlNwYXJzZU1hdAoreworICAgIGludCB0eXBlOworICAgIGludCBkaW1zOworICAgIGludCogcmVmY291bnQ7CisgICAgaW50IGhkcl9yZWZjb3VudDsKKworICAgIHN0cnVjdCBDdlNldCogaGVhcDsKKyAgICB2b2lkKiogaGFzaHRhYmxlOworICAgIGludCBoYXNoc2l6ZTsKKyAgICBpbnQgdmFsb2Zmc2V0OworICAgIGludCBpZHhvZmZzZXQ7CisgICAgaW50IHNpemVbQ1ZfTUFYX0RJTV07Cit9CitDdlNwYXJzZU1hdDsKKworI2RlZmluZSBDVl9JU19TUEFSU0VfTUFUX0hEUihtYXQpIFwKKyAgICAoKG1hdCkgIT0gTlVMTCAmJiBcCisgICAgKCgoY29uc3QgQ3ZTcGFyc2VNYXQqKShtYXQpKS0+dHlwZSAmIENWX01BR0lDX01BU0spID09IENWX1NQQVJTRV9NQVRfTUFHSUNfVkFMKQorCisjZGVmaW5lIENWX0lTX1NQQVJTRV9NQVQobWF0KSBcCisgICAgQ1ZfSVNfU1BBUlNFX01BVF9IRFIobWF0KQorCisvKioqKioqKioqKioqKioqKiBpdGVyYXRpb24gdGhyb3VnaCBhIHNwYXJzZSBhcnJheSAqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTcGFyc2VOb2RlCit7CisgICAgdW5zaWduZWQgaGFzaHZhbDsKKyAgICBzdHJ1Y3QgQ3ZTcGFyc2VOb2RlKiBuZXh0OworfQorQ3ZTcGFyc2VOb2RlOworCit0eXBlZGVmIHN0cnVjdCBDdlNwYXJzZU1hdEl0ZXJhdG9yCit7CisgICAgQ3ZTcGFyc2VNYXQqIG1hdDsKKyAgICBDdlNwYXJzZU5vZGUqIG5vZGU7CisgICAgaW50IGN1cmlkeDsKK30KK0N2U3BhcnNlTWF0SXRlcmF0b3I7CisKKyNkZWZpbmUgQ1ZfTk9ERV9WQUwobWF0LG5vZGUpICAgKCh2b2lkKikoKHVjaGFyKikobm9kZSkgKyAobWF0KS0+dmFsb2Zmc2V0KSkKKyNkZWZpbmUgQ1ZfTk9ERV9JRFgobWF0LG5vZGUpICAgKChpbnQqKSgodWNoYXIqKShub2RlKSArIChtYXQpLT5pZHhvZmZzZXQpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvZ3JhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgaW50IEN2SGlzdFR5cGU7CisKKyNkZWZpbmUgQ1ZfSElTVF9NQUdJQ19WQUwgICAgIDB4NDI0NTAwMDAKKyNkZWZpbmUgQ1ZfSElTVF9VTklGT1JNX0ZMQUcgICgxIDw8IDEwKQorCisvKiBpbmRpY2F0ZXMgd2hldGhlciBiaW4gcmFuZ2VzIGFyZSBzZXQgYWxyZWFkeSBvciBub3QgKi8KKyNkZWZpbmUgQ1ZfSElTVF9SQU5HRVNfRkxBRyAgICgxIDw8IDExKQorCisjZGVmaW5lIENWX0hJU1RfQVJSQVkgICAgICAgICAwCisjZGVmaW5lIENWX0hJU1RfU1BBUlNFICAgICAgICAxCisjZGVmaW5lIENWX0hJU1RfVFJFRSAgICAgICAgICBDVl9ISVNUX1NQQVJTRQorCisvKiBzaG91bGQgYmUgdXNlZCBhcyBhIHBhcmFtZXRlciBvbmx5LAorICAgaXQgdHVybnMgdG8gQ1ZfSElTVF9VTklGT1JNX0ZMQUcgb2YgaGlzdC0+dHlwZSAqLworI2RlZmluZSBDVl9ISVNUX1VOSUZPUk0gICAgICAgMQorCit0eXBlZGVmIHN0cnVjdCBDdkhpc3RvZ3JhbQoreworICAgIGludCAgICAgdHlwZTsKKyAgICBDdkFyciogIGJpbnM7CisgICAgZmxvYXQgICB0aHJlc2hbQ1ZfTUFYX0RJTV1bMl07ICAvKiBGb3IgdW5pZm9ybSBoaXN0b2dyYW1zLiAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGZsb2F0KiogdGhyZXNoMjsgICAgICAgICAgICAgICAgLyogRm9yIG5vbi11bmlmb3JtIGhpc3RvZ3JhbXMuICAgICAgICAgICAgICAgICAgKi8KKyAgICBDdk1hdE5EIG1hdDsgICAgICAgICAgICAgICAgICAgIC8qIEVtYmVkZGVkIG1hdHJpeCBoZWFkZXIgZm9yIGFycmF5IGhpc3RvZ3JhbXMuICovCit9CitDdkhpc3RvZ3JhbTsKKworI2RlZmluZSBDVl9JU19ISVNUKCBoaXN0ICkgXAorICAgICgoaGlzdCkgIT0gTlVMTCAgJiYgXAorICAgICAoKChDdkhpc3RvZ3JhbSopKGhpc3QpKS0+dHlwZSAmIENWX01BR0lDX01BU0spID09IENWX0hJU1RfTUFHSUNfVkFMICYmIFwKKyAgICAgKGhpc3QpLT5iaW5zICE9IE5VTEwpCisKKyNkZWZpbmUgQ1ZfSVNfVU5JRk9STV9ISVNUKCBoaXN0ICkgXAorICAgICgoKGhpc3QpLT50eXBlICYgQ1ZfSElTVF9VTklGT1JNX0ZMQUcpICE9IDApCisKKyNkZWZpbmUgQ1ZfSVNfU1BBUlNFX0hJU1QoIGhpc3QgKSBcCisgICAgQ1ZfSVNfU1BBUlNFX01BVCgoaGlzdCktPmJpbnMpCisKKyNkZWZpbmUgQ1ZfSElTVF9IQVNfUkFOR0VTKCBoaXN0ICkgXAorICAgICgoKGhpc3QpLT50eXBlICYgQ1ZfSElTVF9SQU5HRVNfRkxBRykgIT0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgIE90aGVyIHN1cHBsZW1lbnRhcnkgZGF0YSB0eXBlIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN2UmVjdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZSZWN0Cit7CisgICAgaW50IHg7CisgICAgaW50IHk7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7Cit9CitDdlJlY3Q7CisKK0NWX0lOTElORSAgQ3ZSZWN0ICBjdlJlY3QoIGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICkKK3sKKyAgICBDdlJlY3QgcjsKKworICAgIHIueCA9IHg7CisgICAgci55ID0geTsKKyAgICByLndpZHRoID0gd2lkdGg7CisgICAgci5oZWlnaHQgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gcjsKK30KKworCitDVl9JTkxJTkUgIElwbFJPSSAgY3ZSZWN0VG9ST0koIEN2UmVjdCByZWN0LCBpbnQgY29pICkKK3sKKyAgICBJcGxST0kgcm9pOworICAgIHJvaS54T2Zmc2V0ID0gcmVjdC54OworICAgIHJvaS55T2Zmc2V0ID0gcmVjdC55OworICAgIHJvaS53aWR0aCA9IHJlY3Qud2lkdGg7CisgICAgcm9pLmhlaWdodCA9IHJlY3QuaGVpZ2h0OworICAgIHJvaS5jb2kgPSBjb2k7CisKKyAgICByZXR1cm4gcm9pOworfQorCisKK0NWX0lOTElORSAgQ3ZSZWN0ICBjdlJPSVRvUmVjdCggSXBsUk9JIHJvaSApCit7CisgICAgcmV0dXJuIGN2UmVjdCggcm9pLnhPZmZzZXQsIHJvaS55T2Zmc2V0LCByb2kud2lkdGgsIHJvaS5oZWlnaHQgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN2VGVybUNyaXRlcmlhICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfVEVSTUNSSVRfSVRFUiAgICAxCisjZGVmaW5lIENWX1RFUk1DUklUX05VTUJFUiAgQ1ZfVEVSTUNSSVRfSVRFUgorI2RlZmluZSBDVl9URVJNQ1JJVF9FUFMgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZUZXJtQ3JpdGVyaWEKK3sKKyAgICBpbnQgICAgdHlwZTsgIC8qIG1heSBiZSBjb21iaW5hdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgQ1ZfVEVSTUNSSVRfSVRFUgorICAgICAgICAgICAgICAgICAgICAgQ1ZfVEVSTUNSSVRfRVBTICovCisgICAgaW50ICAgIG1heF9pdGVyOworICAgIGRvdWJsZSBlcHNpbG9uOworfQorQ3ZUZXJtQ3JpdGVyaWE7CisKK0NWX0lOTElORSAgQ3ZUZXJtQ3JpdGVyaWEgIGN2VGVybUNyaXRlcmlhKCBpbnQgdHlwZSwgaW50IG1heF9pdGVyLCBkb3VibGUgZXBzaWxvbiApCit7CisgICAgQ3ZUZXJtQ3JpdGVyaWEgdDsKKworICAgIHQudHlwZSA9IHR5cGU7CisgICAgdC5tYXhfaXRlciA9IG1heF9pdGVyOworICAgIHQuZXBzaWxvbiA9IChmbG9hdCllcHNpbG9uOworCisgICAgcmV0dXJuIHQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3ZQb2ludCBhbmQgdmFyaWFudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2UG9pbnQKK3sKKyAgICBpbnQgeDsKKyAgICBpbnQgeTsKK30KK0N2UG9pbnQ7CisKKworQ1ZfSU5MSU5FICBDdlBvaW50ICBjdlBvaW50KCBpbnQgeCwgaW50IHkgKQoreworICAgIEN2UG9pbnQgcDsKKworICAgIHAueCA9IHg7CisgICAgcC55ID0geTsKKworICAgIHJldHVybiBwOworfQorCisKK3R5cGVkZWYgc3RydWN0IEN2UG9pbnQyRDMyZgoreworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKK30KK0N2UG9pbnQyRDMyZjsKKworCitDVl9JTkxJTkUgIEN2UG9pbnQyRDMyZiAgY3ZQb2ludDJEMzJmKCBkb3VibGUgeCwgZG91YmxlIHkgKQoreworICAgIEN2UG9pbnQyRDMyZiBwOworCisgICAgcC54ID0gKGZsb2F0KXg7CisgICAgcC55ID0gKGZsb2F0KXk7CisKKyAgICByZXR1cm4gcDsKK30KKworCitDVl9JTkxJTkUgIEN2UG9pbnQyRDMyZiAgY3ZQb2ludFRvMzJmKCBDdlBvaW50IHBvaW50ICkKK3sKKyAgICByZXR1cm4gY3ZQb2ludDJEMzJmKCAoZmxvYXQpcG9pbnQueCwgKGZsb2F0KXBvaW50LnkgKTsKK30KKworCitDVl9JTkxJTkUgIEN2UG9pbnQgIGN2UG9pbnRGcm9tMzJmKCBDdlBvaW50MkQzMmYgcG9pbnQgKQoreworICAgIEN2UG9pbnQgaXB0OworICAgIGlwdC54ID0gY3ZSb3VuZChwb2ludC54KTsKKyAgICBpcHQueSA9IGN2Um91bmQocG9pbnQueSk7CisKKyAgICByZXR1cm4gaXB0OworfQorCisKK3R5cGVkZWYgc3RydWN0IEN2UG9pbnQzRDMyZgoreworICAgIGZsb2F0IHg7CisgICAgZmxvYXQgeTsKKyAgICBmbG9hdCB6OworfQorQ3ZQb2ludDNEMzJmOworCisKK0NWX0lOTElORSAgQ3ZQb2ludDNEMzJmICBjdlBvaW50M0QzMmYoIGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlIHogKQoreworICAgIEN2UG9pbnQzRDMyZiBwOworCisgICAgcC54ID0gKGZsb2F0KXg7CisgICAgcC55ID0gKGZsb2F0KXk7CisgICAgcC56ID0gKGZsb2F0KXo7CisKKyAgICByZXR1cm4gcDsKK30KKworCit0eXBlZGVmIHN0cnVjdCBDdlBvaW50MkQ2NGYKK3sKKyAgICBkb3VibGUgeDsKKyAgICBkb3VibGUgeTsKK30KK0N2UG9pbnQyRDY0ZjsKKworCitDVl9JTkxJTkUgIEN2UG9pbnQyRDY0ZiAgY3ZQb2ludDJENjRmKCBkb3VibGUgeCwgZG91YmxlIHkgKQoreworICAgIEN2UG9pbnQyRDY0ZiBwOworCisgICAgcC54ID0geDsKKyAgICBwLnkgPSB5OworCisgICAgcmV0dXJuIHA7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZQb2ludDNENjRmCit7CisgICAgZG91YmxlIHg7CisgICAgZG91YmxlIHk7CisgICAgZG91YmxlIHo7Cit9CitDdlBvaW50M0Q2NGY7CisKKworQ1ZfSU5MSU5FICBDdlBvaW50M0Q2NGYgIGN2UG9pbnQzRDY0ZiggZG91YmxlIHgsIGRvdWJsZSB5LCBkb3VibGUgeiApCit7CisgICAgQ3ZQb2ludDNENjRmIHA7CisKKyAgICBwLnggPSB4OworICAgIHAueSA9IHk7CisgICAgcC56ID0gejsKKworICAgIHJldHVybiBwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdlNpemUncyAmIEN2Qm94ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCB3aWR0aDsKKyAgICBpbnQgaGVpZ2h0OworfQorQ3ZTaXplOworCitDVl9JTkxJTkUgIEN2U2l6ZSAgY3ZTaXplKCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworICAgIEN2U2l6ZSBzOworCisgICAgcy53aWR0aCA9IHdpZHRoOworICAgIHMuaGVpZ2h0ID0gaGVpZ2h0OworCisgICAgcmV0dXJuIHM7Cit9CisKK3R5cGVkZWYgc3RydWN0IEN2U2l6ZTJEMzJmCit7CisgICAgZmxvYXQgd2lkdGg7CisgICAgZmxvYXQgaGVpZ2h0OworfQorQ3ZTaXplMkQzMmY7CisKKworQ1ZfSU5MSU5FICBDdlNpemUyRDMyZiAgY3ZTaXplMkQzMmYoIGRvdWJsZSB3aWR0aCwgZG91YmxlIGhlaWdodCApCit7CisgICAgQ3ZTaXplMkQzMmYgczsKKworICAgIHMud2lkdGggPSAoZmxvYXQpd2lkdGg7CisgICAgcy5oZWlnaHQgPSAoZmxvYXQpaGVpZ2h0OworCisgICAgcmV0dXJuIHM7Cit9CisKK3R5cGVkZWYgc3RydWN0IEN2Qm94MkQKK3sKKyAgICBDdlBvaW50MkQzMmYgY2VudGVyOyAgLyogQ2VudGVyIG9mIHRoZSBib3guICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIEN2U2l6ZTJEMzJmICBzaXplOyAgICAvKiBCb3ggd2lkdGggYW5kIGxlbmd0aC4gICAgICAgICAgICAgICAgICAgICAgICovCisgICAgZmxvYXQgYW5nbGU7ICAgICAgICAgIC8qIEFuZ2xlIGJldHdlZW4gdGhlIGhvcml6b250YWwgYXhpcyAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYW5kIHRoZSBmaXJzdCBzaWRlIChpLmUuIGxlbmd0aCkgaW4gZGVncmVlcyAqLworfQorQ3ZCb3gyRDsKKworCisvKiBMaW5lIGl0ZXJhdG9yIHN0YXRlOiAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZMaW5lSXRlcmF0b3IKK3sKKyAgICAvKiBQb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvaW50OiAqLworICAgIHVjaGFyKiBwdHI7CisKKyAgICAvKiBCcmVzZW5oYW0gYWxnb3JpdGhtIHN0YXRlOiAqLworICAgIGludCAgZXJyOworICAgIGludCAgcGx1c19kZWx0YTsKKyAgICBpbnQgIG1pbnVzX2RlbHRhOworICAgIGludCAgcGx1c19zdGVwOworICAgIGludCAgbWludXNfc3RlcDsKK30KK0N2TGluZUl0ZXJhdG9yOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3ZTbGljZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2U2xpY2UKK3sKKyAgICBpbnQgIHN0YXJ0X2luZGV4LCBlbmRfaW5kZXg7Cit9CitDdlNsaWNlOworCitDVl9JTkxJTkUgIEN2U2xpY2UgIGN2U2xpY2UoIGludCBzdGFydCwgaW50IGVuZCApCit7CisgICAgQ3ZTbGljZSBzbGljZTsKKyAgICBzbGljZS5zdGFydF9pbmRleCA9IHN0YXJ0OworICAgIHNsaWNlLmVuZF9pbmRleCA9IGVuZDsKKworICAgIHJldHVybiBzbGljZTsKK30KKworI2RlZmluZSBDVl9XSE9MRV9TRVFfRU5EX0lOREVYIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQ1ZfV0hPTEVfU0VRICBjdlNsaWNlKDAsIENWX1dIT0xFX1NFUV9FTkRfSU5ERVgpCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ3ZTY2FsYXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2U2NhbGFyCit7CisgICAgZG91YmxlIHZhbFs0XTsKK30KK0N2U2NhbGFyOworCitDVl9JTkxJTkUgIEN2U2NhbGFyICBjdlNjYWxhciggZG91YmxlIHZhbDAsIGRvdWJsZSB2YWwxIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbDIgQ1ZfREVGQVVMVCgwKSwgZG91YmxlIHZhbDMgQ1ZfREVGQVVMVCgwKSkKK3sKKyAgICBDdlNjYWxhciBzY2FsYXI7CisgICAgc2NhbGFyLnZhbFswXSA9IHZhbDA7IHNjYWxhci52YWxbMV0gPSB2YWwxOworICAgIHNjYWxhci52YWxbMl0gPSB2YWwyOyBzY2FsYXIudmFsWzNdID0gdmFsMzsKKyAgICByZXR1cm4gc2NhbGFyOworfQorCisKK0NWX0lOTElORSAgQ3ZTY2FsYXIgIGN2UmVhbFNjYWxhciggZG91YmxlIHZhbDAgKQoreworICAgIEN2U2NhbGFyIHNjYWxhcjsKKyAgICBzY2FsYXIudmFsWzBdID0gdmFsMDsKKyAgICBzY2FsYXIudmFsWzFdID0gc2NhbGFyLnZhbFsyXSA9IHNjYWxhci52YWxbM10gPSAwOworICAgIHJldHVybiBzY2FsYXI7Cit9CisKK0NWX0lOTElORSAgQ3ZTY2FsYXIgIGN2U2NhbGFyQWxsKCBkb3VibGUgdmFsMDEyMyApCit7CisgICAgQ3ZTY2FsYXIgc2NhbGFyOworICAgIHNjYWxhci52YWxbMF0gPSB2YWwwMTIzOworICAgIHNjYWxhci52YWxbMV0gPSB2YWwwMTIzOworICAgIHNjYWxhci52YWxbMl0gPSB2YWwwMTIzOworICAgIHNjYWxhci52YWxbM10gPSB2YWwwMTIzOworICAgIHJldHVybiBzY2FsYXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pYyBEYXRhIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIE1lbW9yeSBzdG9yYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2TWVtQmxvY2sKK3sKKyAgICBzdHJ1Y3QgQ3ZNZW1CbG9jayogIHByZXY7CisgICAgc3RydWN0IEN2TWVtQmxvY2sqICBuZXh0OworfQorQ3ZNZW1CbG9jazsKKworI2RlZmluZSBDVl9TVE9SQUdFX01BR0lDX1ZBTCAgICAweDQyODkwMDAwCisKK3R5cGVkZWYgc3RydWN0IEN2TWVtU3RvcmFnZQoreworICAgIGludCBzaWduYXR1cmU7CisgICAgQ3ZNZW1CbG9jayogYm90dG9tOyAgICAgICAgICAgLyogRmlyc3QgYWxsb2NhdGVkIGJsb2NrLiAgICAgICAgICAgICAgICAgICAqLworICAgIEN2TWVtQmxvY2sqIHRvcDsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgbWVtb3J5IGJsb2NrIC0gdG9wIG9mIHRoZSBzdGFjay4gKi8KKyAgICBzdHJ1Y3QgIEN2TWVtU3RvcmFnZSogcGFyZW50OyAvKiBXZSBnZXQgbmV3IGJsb2NrcyBmcm9tIHBhcmVudCBhcyBuZWVkZWQuICovCisgICAgaW50IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgLyogQmxvY2sgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBmcmVlX3NwYWNlOyAgICAgICAgICAgICAgIC8qIFJlbWFpbmluZyBmcmVlIHNwYWNlIGluIGN1cnJlbnQgYmxvY2suICAgKi8KK30KK0N2TWVtU3RvcmFnZTsKKworI2RlZmluZSBDVl9JU19TVE9SQUdFKHN0b3JhZ2UpICBcCisgICAgKChzdG9yYWdlKSAhPSBOVUxMICYmICAgICAgIFwKKyAgICAoKChDdk1lbVN0b3JhZ2UqKShzdG9yYWdlKSktPnNpZ25hdHVyZSAmIENWX01BR0lDX01BU0spID09IENWX1NUT1JBR0VfTUFHSUNfVkFMKQorCisKK3R5cGVkZWYgc3RydWN0IEN2TWVtU3RvcmFnZVBvcworeworICAgIEN2TWVtQmxvY2sqIHRvcDsKKyAgICBpbnQgZnJlZV9zcGFjZTsKK30KK0N2TWVtU3RvcmFnZVBvczsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU2VxdWVuY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTZXFCbG9jaworeworICAgIHN0cnVjdCBDdlNlcUJsb2NrKiAgcHJldjsgLyogUHJldmlvdXMgc2VxdWVuY2UgYmxvY2suICAgICAgICAgICAgICAgICAgICovCisgICAgc3RydWN0IEN2U2VxQmxvY2sqICBuZXh0OyAvKiBOZXh0IHNlcXVlbmNlIGJsb2NrLiAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgaW50ICAgIHN0YXJ0X2luZGV4OyAgICAgICAgIC8qIEluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBibG9jayArICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc2VxdWVuY2UtPmZpcnN0LT5zdGFydF9pbmRleC4gICAgICAgICAgICAgICovCisgICAgaW50ICAgIGNvdW50OyAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGJsb2NrLiAgICAgICAgICAgKi8KKyAgICBzY2hhciogZGF0YTsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGJsb2NrLiAqLworfQorQ3ZTZXFCbG9jazsKKworCisjZGVmaW5lIENWX1RSRUVfTk9ERV9GSUVMRFMobm9kZV90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgIGZsYWdzOyAgICAgICAgICAgICAvKiBNaXNjZWxsYW5lb3VzIGZsYWdzLiAgICAgKi8gICAgICBcCisgICAgaW50ICAgICAgIGhlYWRlcl9zaXplOyAgICAgICAvKiBTaXplIG9mIHNlcXVlbmNlIGhlYWRlci4gKi8gICAgICBcCisgICAgc3RydWN0ICAgIG5vZGVfdHlwZSogaF9wcmV2OyAvKiBQcmV2aW91cyBzZXF1ZW5jZS4gICAgICAgKi8gICAgICBcCisgICAgc3RydWN0ICAgIG5vZGVfdHlwZSogaF9uZXh0OyAvKiBOZXh0IHNlcXVlbmNlLiAgICAgICAgICAgKi8gICAgICBcCisgICAgc3RydWN0ICAgIG5vZGVfdHlwZSogdl9wcmV2OyAvKiAybmQgcHJldmlvdXMgc2VxdWVuY2UuICAgKi8gICAgICBcCisgICAgc3RydWN0ICAgIG5vZGVfdHlwZSogdl9uZXh0ICAvKiAybmQgbmV4dCBzZXF1ZW5jZS4gICAgICAgKi8KKworLyoKKyAgIFJlYWQvV3JpdGUgc2VxdWVuY2UuCisgICBFbGVtZW50cyBjYW4gYmUgZHluYW1pY2FsbHkgaW5zZXJ0ZWQgdG8gb3IgZGVsZXRlZCBmcm9tIHRoZSBzZXF1ZW5jZS4KKyovCisjZGVmaW5lIENWX1NFUVVFTkNFX0ZJRUxEUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9UUkVFX05PREVfRklFTERTKEN2U2VxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCAgICAgICB0b3RhbDsgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzLiAgICAgICAgICAgICovICBcCisgICAgaW50ICAgICAgIGVsZW1fc2l6ZTsgICAgICAvKiBTaXplIG9mIHNlcXVlbmNlIGVsZW1lbnQgaW4gYnl0ZXMuICAgKi8gIFwKKyAgICBzY2hhciogICAgYmxvY2tfbWF4OyAgICAgIC8qIE1heGltYWwgYm91bmQgb2YgdGhlIGxhc3QgYmxvY2suICAgICAqLyAgXAorICAgIHNjaGFyKiAgICBwdHI7ICAgICAgICAgICAgLyogQ3VycmVudCB3cml0ZSBwb2ludGVyLiAgICAgICAgICAgICAgICovICBcCisgICAgaW50ICAgICAgIGRlbHRhX2VsZW1zOyAgICAvKiBHcm93IHNlcSB0aGlzIG1hbnkgYXQgYSB0aW1lLiAgICAgICAgKi8gIFwKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2U7ICAgIC8qIFdoZXJlIHRoZSBzZXEgaXMgc3RvcmVkLiAgICAgICAgICAgICAqLyAgXAorICAgIEN2U2VxQmxvY2sqIGZyZWVfYmxvY2tzOyAgLyogRnJlZSBibG9ja3MgbGlzdC4gICAgICAgICAgICAgICAgICAgICovICBcCisgICAgQ3ZTZXFCbG9jayogZmlyc3Q7ICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBmaXJzdCBzZXF1ZW5jZSBibG9jay4gKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTZXEKK3sKKyAgICBDVl9TRVFVRU5DRV9GSUVMRFMoKQorfQorQ3ZTZXE7CisKKyNkZWZpbmUgQ1ZfVFlQRV9OQU1FX1NFUSAgICAgICAgICAgICAib3BlbmN2LXNlcXVlbmNlIgorI2RlZmluZSBDVl9UWVBFX05BTUVfU0VRX1RSRUUgICAgICAgICJvcGVuY3Ytc2VxdWVuY2UtdHJlZSIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBTZXQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKgorICBTZXQuCisgIE9yZGVyIGlzIG5vdCBwcmVzZXJ2ZWQuIFRoZXJlIGNhbiBiZSBnYXBzIGJldHdlZW4gc2VxdWVuY2UgZWxlbWVudHMuCisgIEFmdGVyIHRoZSBlbGVtZW50IGhhcyBiZWVuIGluc2VydGVkIGl0IHN0YXlzIGluIHRoZSBzYW1lIHBsYWNlIGFsbCB0aGUgdGltZS4KKyAgVGhlIE1TQihtb3N0LXNpZ25pZmljYW50IG9yIHNpZ24gYml0KSBvZiB0aGUgZmlyc3QgZmllbGQgKGZsYWdzKSBpcyAwIGlmZiB0aGUgZWxlbWVudCBleGlzdHMuCisqLworI2RlZmluZSBDVl9TRVRfRUxFTV9GSUVMRFMoZWxlbV90eXBlKSAgIFwKKyAgICBpbnQgIGZsYWdzOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RydWN0IGVsZW1fdHlwZSogbmV4dF9mcmVlOworCit0eXBlZGVmIHN0cnVjdCBDdlNldEVsZW0KK3sKKyAgICBDVl9TRVRfRUxFTV9GSUVMRFMoQ3ZTZXRFbGVtKQorfQorQ3ZTZXRFbGVtOworCisjZGVmaW5lIENWX1NFVF9GSUVMRFMoKSAgICAgIFwKKyAgICBDVl9TRVFVRU5DRV9GSUVMRFMoKSAgICAgXAorICAgIEN2U2V0RWxlbSogZnJlZV9lbGVtczsgICBcCisgICAgaW50IGFjdGl2ZV9jb3VudDsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTZXQKK3sKKyAgICBDVl9TRVRfRklFTERTKCkKK30KK0N2U2V0OworCisKKyNkZWZpbmUgQ1ZfU0VUX0VMRU1fSURYX01BU0sgICAoKDEgPDwgMjYpIC0gMSkKKyNkZWZpbmUgQ1ZfU0VUX0VMRU1fRlJFRV9GTEFHICAoMSA8PCAoc2l6ZW9mKGludCkqOC0xKSkKKworLyogQ2hlY2tzIHdoZXRoZXIgdGhlIGVsZW1lbnQgcG9pbnRlZCBieSBwdHIgYmVsb25ncyB0byBhIHNldCBvciBub3QgKi8KKyNkZWZpbmUgQ1ZfSVNfU0VUX0VMRU0oIHB0ciApICAoKChDdlNldEVsZW0qKShwdHIpKS0+ZmxhZ3MgPj0gMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogR3JhcGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgIFdlIHJlcHJlc2VudCBhIGdyYXBoIGFzIGEgc2V0IG9mIHZlcnRpY2VzLgorICBWZXJ0aWNlcyBjb250YWluIHRoZWlyIGFkamFjZW5jeSBsaXN0cyAobW9yZSBleGFjdGx5LCBwb2ludGVycyB0byBmaXJzdCBpbmNvbWluZyBvcgorICBvdXRjb21pbmcgZWRnZSAob3IgMCBpZiBpc29sYXRlZCB2ZXJ0ZXgpKS4gRWRnZXMgYXJlIHN0b3JlZCBpbiBhbm90aGVyIHNldC4KKyAgVGhlcmUgaXMgYSBzaW5nbHktbGlua2VkIGxpc3Qgb2YgaW5jb21pbmcvb3V0Y29taW5nIGVkZ2VzIGZvciBlYWNoIHZlcnRleC4KKworICBFYWNoIGVkZ2UgY29uc2lzdHMgb2YKKworICAgICBvICAgVHdvIHBvaW50ZXJzIHRvIHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHZlcnRpY2VzCisgICAgICAgICAodnR4WzBdIGFuZCB2dHhbMV0gcmVzcGVjdGl2ZWx5KS4KKworCSBBIGdyYXBoIG1heSBiZSBvcmllbnRlZCBvciBub3QuIEluIHRoZSBsYXR0ZXIgY2FzZSwgZWRnZXMgYmV0d2VlbgorCSB2ZXJ0ZXggaSB0byB2ZXJ0ZXggaiBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZHVyaW5nIHNlYXJjaCBvcGVyYXRpb25zLgorCisgICAgIG8gICBUd28gcG9pbnRlcnMgdG8gbmV4dCBlZGdlcyBmb3IgdGhlIHN0YXJ0aW5nIGFuZCBlbmRpbmcgdmVydGljZXMsIHdoZXJlCisgICAgICAgICBuZXh0WzBdIHBvaW50cyB0byB0aGUgbmV4dCBlZGdlIGluIHRoZSB2dHhbMF0gYWRqYWNlbmN5IGxpc3QgYW5kCisgICAgICAgICBuZXh0WzFdIHBvaW50cyB0byB0aGUgbmV4dCBlZGdlIGluIHRoZSB2dHhbMV0gYWRqYWNlbmN5IGxpc3QuCisqLworI2RlZmluZSBDVl9HUkFQSF9FREdFX0ZJRUxEUygpICAgICAgXAorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IHdlaWdodDsgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBDdkdyYXBoRWRnZSogbmV4dFsyXTsgICAgXAorICAgIHN0cnVjdCBDdkdyYXBoVnR4KiB2dHhbMl07CisKKworI2RlZmluZSBDVl9HUkFQSF9WRVJURVhfRklFTERTKCkgICAgXAorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cnVjdCBDdkdyYXBoRWRnZSogZmlyc3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaEVkZ2UKK3sKKyAgICBDVl9HUkFQSF9FREdFX0ZJRUxEUygpCit9CitDdkdyYXBoRWRnZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaFZ0eAoreworICAgIENWX0dSQVBIX1ZFUlRFWF9GSUVMRFMoKQorfQorQ3ZHcmFwaFZ0eDsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaFZ0eDJECit7CisgICAgQ1ZfR1JBUEhfVkVSVEVYX0ZJRUxEUygpCisgICAgQ3ZQb2ludDJEMzJmKiBwdHI7Cit9CitDdkdyYXBoVnR4MkQ7CisKKy8qCisgICBHcmFwaCBpcyAiZGVyaXZlZCIgZnJvbSB0aGUgc2V0ICh0aGlzIGlzIHNldCBhIG9mIHZlcnRpY2VzKQorICAgYW5kIGluY2x1ZGVzIGFub3RoZXIgc2V0IChlZGdlcykKKyovCisjZGVmaW5lICBDVl9HUkFQSF9GSUVMRFMoKSAgIFwKKyAgICBDVl9TRVRfRklFTERTKCkgICAgICAgICAgXAorICAgIEN2U2V0KiBlZGdlczsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaAoreworICAgIENWX0dSQVBIX0ZJRUxEUygpCit9CitDdkdyYXBoOworCisjZGVmaW5lIENWX1RZUEVfTkFNRV9HUkFQSCAib3BlbmN2LWdyYXBoIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogQ2hhaW4vQ291bnRvdXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDaGFpbgoreworICAgIENWX1NFUVVFTkNFX0ZJRUxEUygpCisgICAgQ3ZQb2ludCAgb3JpZ2luOworfQorQ3ZDaGFpbjsKKworI2RlZmluZSBDVl9DT05UT1VSX0ZJRUxEUygpICBcCisgICAgQ1ZfU0VRVUVOQ0VfRklFTERTKCkgICAgIFwKKyAgICBDdlJlY3QgcmVjdDsgICAgICAgICAgICAgXAorICAgIGludCBjb2xvcjsgICAgICAgICAgICAgICBcCisgICAgaW50IHJlc2VydmVkWzNdOworCit0eXBlZGVmIHN0cnVjdCBDdkNvbnRvdXIKK3sKKyAgICBDVl9DT05UT1VSX0ZJRUxEUygpCit9CitDdkNvbnRvdXI7CisKK3R5cGVkZWYgQ3ZDb250b3VyIEN2UG9pbnQyRFNlcTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIENWX1NFUV9NQUdJQ19WQUwgICAgICAgICAgICAgMHg0Mjk5MDAwMAorCisjZGVmaW5lIENWX0lTX1NFUShzZXEpIFwKKyAgICAoKHNlcSkgIT0gTlVMTCAmJiAoKChDdlNlcSopKHNlcSkpLT5mbGFncyAmIENWX01BR0lDX01BU0spID09IENWX1NFUV9NQUdJQ19WQUwpCisKKyNkZWZpbmUgQ1ZfU0VUX01BR0lDX1ZBTCAgICAgICAgICAgICAweDQyOTgwMDAwCisjZGVmaW5lIENWX0lTX1NFVChzZXQpIFwKKyAgICAoKHNldCkgIT0gTlVMTCAmJiAoKChDdlNlcSopKHNldCkpLT5mbGFncyAmIENWX01BR0lDX01BU0spID09IENWX1NFVF9NQUdJQ19WQUwpCisKKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9CSVRTICAgICAgICAgICA5CisjZGVmaW5lIENWX1NFUV9FTFRZUEVfTUFTSyAgICAgICAgICAgKCgxIDw8IENWX1NFUV9FTFRZUEVfQklUUykgLSAxKQorCisjZGVmaW5lIENWX1NFUV9FTFRZUEVfUE9JTlQgICAgICAgICAgQ1ZfMzJTQzIgIC8qICh4LHkpICovCisjZGVmaW5lIENWX1NFUV9FTFRZUEVfQ09ERSAgICAgICAgICAgQ1ZfOFVDMSAgIC8qIGZyZWVtYW4gY29kZTogMC4uNyAqLworI2RlZmluZSBDVl9TRVFfRUxUWVBFX0dFTkVSSUMgICAgICAgIDAKKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9QVFIgICAgICAgICAgICBDVl9VU1JUWVBFMQorI2RlZmluZSBDVl9TRVFfRUxUWVBFX1BQT0lOVCAgICAgICAgIENWX1NFUV9FTFRZUEVfUFRSICAvKiAmKHgseSkgKi8KKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9JTkRFWCAgICAgICAgICBDVl8zMlNDMSAgLyogIyh4LHkpICovCisjZGVmaW5lIENWX1NFUV9FTFRZUEVfR1JBUEhfRURHRSAgICAgMCAgLyogJm5leHRfbywgJm5leHRfZCwgJnZ0eF9vLCAmdnR4X2QgKi8KKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9HUkFQSF9WRVJURVggICAwICAvKiBmaXJzdF9lZGdlLCAmKHgseSkgKi8KKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9UUklBTl9BVFIgICAgICAwICAvKiB2ZXJ0ZXggb2YgdGhlIGJpbmFyeSB0cmVlICAgKi8KKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRV9DT05ORUNURURfQ09NUCAwICAvKiBjb25uZWN0ZWQgY29tcG9uZW50ICAqLworI2RlZmluZSBDVl9TRVFfRUxUWVBFX1BPSU5UM0QgICAgICAgIENWXzMyRkMzICAvKiAoeCx5LHopICAqLworCisjZGVmaW5lIENWX1NFUV9LSU5EX0JJVFMgICAgICAgIDMKKyNkZWZpbmUgQ1ZfU0VRX0tJTkRfTUFTSyAgICAgICAgKCgoMSA8PCBDVl9TRVFfS0lORF9CSVRTKSAtIDEpPDxDVl9TRVFfRUxUWVBFX0JJVFMpCisKKy8qIHR5cGVzIG9mIHNlcXVlbmNlcyAqLworI2RlZmluZSBDVl9TRVFfS0lORF9HRU5FUklDICAgICAoMCA8PCBDVl9TRVFfRUxUWVBFX0JJVFMpCisjZGVmaW5lIENWX1NFUV9LSU5EX0NVUlZFICAgICAgICgxIDw8IENWX1NFUV9FTFRZUEVfQklUUykKKyNkZWZpbmUgQ1ZfU0VRX0tJTkRfQklOX1RSRUUgICAgKDIgPDwgQ1ZfU0VRX0VMVFlQRV9CSVRTKQorCisvKiB0eXBlcyBvZiBzcGFyc2Ugc2VxdWVuY2VzIChzZXRzKSAqLworI2RlZmluZSBDVl9TRVFfS0lORF9HUkFQSCAgICAgICAoMyA8PCBDVl9TRVFfRUxUWVBFX0JJVFMpCisjZGVmaW5lIENWX1NFUV9LSU5EX1NVQkRJVjJEICAgICg0IDw8IENWX1NFUV9FTFRZUEVfQklUUykKKworI2RlZmluZSBDVl9TRVFfRkxBR19TSElGVCAgICAgICAoQ1ZfU0VRX0tJTkRfQklUUyArIENWX1NFUV9FTFRZUEVfQklUUykKKworLyogZmxhZ3MgZm9yIGN1cnZlcyAqLworI2RlZmluZSBDVl9TRVFfRkxBR19DTE9TRUQgICAgICgxIDw8IENWX1NFUV9GTEFHX1NISUZUKQorI2RlZmluZSBDVl9TRVFfRkxBR19TSU1QTEUgICAgICgyIDw8IENWX1NFUV9GTEFHX1NISUZUKQorI2RlZmluZSBDVl9TRVFfRkxBR19DT05WRVggICAgICg0IDw8IENWX1NFUV9GTEFHX1NISUZUKQorI2RlZmluZSBDVl9TRVFfRkxBR19IT0xFICAgICAgICg4IDw8IENWX1NFUV9GTEFHX1NISUZUKQorCisvKiBmbGFncyBmb3IgZ3JhcGhzICovCisjZGVmaW5lIENWX0dSQVBIX0ZMQUdfT1JJRU5URUQgKDEgPDwgQ1ZfU0VRX0ZMQUdfU0hJRlQpCisKKyNkZWZpbmUgQ1ZfR1JBUEggICAgICAgICAgICAgICBDVl9TRVFfS0lORF9HUkFQSAorI2RlZmluZSBDVl9PUklFTlRFRF9HUkFQSCAgICAgIChDVl9TRVFfS0lORF9HUkFQSHxDVl9HUkFQSF9GTEFHX09SSUVOVEVEKQorCisvKiBwb2ludCBzZXRzICovCisjZGVmaW5lIENWX1NFUV9QT0lOVF9TRVQgICAgICAgKENWX1NFUV9LSU5EX0dFTkVSSUN8IENWX1NFUV9FTFRZUEVfUE9JTlQpCisjZGVmaW5lIENWX1NFUV9QT0lOVDNEX1NFVCAgICAgKENWX1NFUV9LSU5EX0dFTkVSSUN8IENWX1NFUV9FTFRZUEVfUE9JTlQzRCkKKyNkZWZpbmUgQ1ZfU0VRX1BPTFlMSU5FICAgICAgICAoQ1ZfU0VRX0tJTkRfQ1VSVkUgIHwgQ1ZfU0VRX0VMVFlQRV9QT0lOVCkKKyNkZWZpbmUgQ1ZfU0VRX1BPTFlHT04gICAgICAgICAoQ1ZfU0VRX0ZMQUdfQ0xPU0VEIHwgQ1ZfU0VRX1BPTFlMSU5FICkKKyNkZWZpbmUgQ1ZfU0VRX0NPTlRPVVIgICAgICAgICBDVl9TRVFfUE9MWUdPTgorI2RlZmluZSBDVl9TRVFfU0lNUExFX1BPTFlHT04gIChDVl9TRVFfRkxBR19TSU1QTEUgfCBDVl9TRVFfUE9MWUdPTiAgKQorCisvKiBjaGFpbi1jb2RlZCBjdXJ2ZXMgKi8KKyNkZWZpbmUgQ1ZfU0VRX0NIQUlOICAgICAgICAgICAoQ1ZfU0VRX0tJTkRfQ1VSVkUgIHwgQ1ZfU0VRX0VMVFlQRV9DT0RFKQorI2RlZmluZSBDVl9TRVFfQ0hBSU5fQ09OVE9VUiAgIChDVl9TRVFfRkxBR19DTE9TRUQgfCBDVl9TRVFfQ0hBSU4pCisKKy8qIGJpbmFyeSB0cmVlIGZvciB0aGUgY29udG91ciAqLworI2RlZmluZSBDVl9TRVFfUE9MWUdPTl9UUkVFICAgIChDVl9TRVFfS0lORF9CSU5fVFJFRSAgfCBDVl9TRVFfRUxUWVBFX1RSSUFOX0FUUikKKworLyogc2VxdWVuY2Ugb2YgdGhlIGNvbm5lY3RlZCBjb21wb25lbnRzICovCisjZGVmaW5lIENWX1NFUV9DT05ORUNURURfQ09NUCAgKENWX1NFUV9LSU5EX0dFTkVSSUMgIHwgQ1ZfU0VRX0VMVFlQRV9DT05ORUNURURfQ09NUCkKKworLyogc2VxdWVuY2Ugb2YgdGhlIGludGVnZXIgbnVtYmVycyAqLworI2RlZmluZSBDVl9TRVFfSU5ERVggICAgICAgICAgIChDVl9TRVFfS0lORF9HRU5FUklDICB8IENWX1NFUV9FTFRZUEVfSU5ERVgpCisKKyNkZWZpbmUgQ1ZfU0VRX0VMVFlQRSggc2VxICkgICAoKHNlcSktPmZsYWdzICYgQ1ZfU0VRX0VMVFlQRV9NQVNLKQorI2RlZmluZSBDVl9TRVFfS0lORCggc2VxICkgICAgICgoc2VxKS0+ZmxhZ3MgJiBDVl9TRVFfS0lORF9NQVNLICkKKworLyogZmxhZyBjaGVja2luZyAqLworI2RlZmluZSBDVl9JU19TRVFfSU5ERVgoIHNlcSApICAgICAgKChDVl9TRVFfRUxUWVBFKHNlcSkgPT0gQ1ZfU0VRX0VMVFlQRV9JTkRFWCkgJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDVl9TRVFfS0lORChzZXEpID09IENWX1NFUV9LSU5EX0dFTkVSSUMpKQorCisjZGVmaW5lIENWX0lTX1NFUV9DVVJWRSggc2VxICkgICAgICAoQ1ZfU0VRX0tJTkQoc2VxKSA9PSBDVl9TRVFfS0lORF9DVVJWRSkKKyNkZWZpbmUgQ1ZfSVNfU0VRX0NMT1NFRCggc2VxICkgICAgICgoKHNlcSktPmZsYWdzICYgQ1ZfU0VRX0ZMQUdfQ0xPU0VEKSAhPSAwKQorI2RlZmluZSBDVl9JU19TRVFfQ09OVkVYKCBzZXEgKSAgICAgKCgoc2VxKS0+ZmxhZ3MgJiBDVl9TRVFfRkxBR19DT05WRVgpICE9IDApCisjZGVmaW5lIENWX0lTX1NFUV9IT0xFKCBzZXEgKSAgICAgICAoKChzZXEpLT5mbGFncyAmIENWX1NFUV9GTEFHX0hPTEUpICE9IDApCisjZGVmaW5lIENWX0lTX1NFUV9TSU1QTEUoIHNlcSApICAgICAoKCgoc2VxKS0+ZmxhZ3MgJiBDVl9TRVFfRkxBR19TSU1QTEUpICE9IDApIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0lTX1NFUV9DT05WRVgoc2VxKSkKKworLyogdHlwZSBjaGVja2luZyBtYWNyb3MgKi8KKyNkZWZpbmUgQ1ZfSVNfU0VRX1BPSU5UX1NFVCggc2VxICkgXAorICAgICgoQ1ZfU0VRX0VMVFlQRShzZXEpID09IENWXzMyU0MyIHx8IENWX1NFUV9FTFRZUEUoc2VxKSA9PSBDVl8zMkZDMikpCisKKyNkZWZpbmUgQ1ZfSVNfU0VRX1BPSU5UX1NVQlNFVCggc2VxICkgXAorICAgIChDVl9JU19TRVFfSU5ERVgoIHNlcSApIHx8IENWX1NFUV9FTFRZUEUoc2VxKSA9PSBDVl9TRVFfRUxUWVBFX1BQT0lOVCkKKworI2RlZmluZSBDVl9JU19TRVFfUE9MWUxJTkUoIHNlcSApICAgXAorICAgIChDVl9TRVFfS0lORChzZXEpID09IENWX1NFUV9LSU5EX0NVUlZFICYmIENWX0lTX1NFUV9QT0lOVF9TRVQoc2VxKSkKKworI2RlZmluZSBDVl9JU19TRVFfUE9MWUdPTiggc2VxICkgICBcCisgICAgKENWX0lTX1NFUV9QT0xZTElORShzZXEpICYmIENWX0lTX1NFUV9DTE9TRUQoc2VxKSkKKworI2RlZmluZSBDVl9JU19TRVFfQ0hBSU4oIHNlcSApICAgXAorICAgIChDVl9TRVFfS0lORChzZXEpID09IENWX1NFUV9LSU5EX0NVUlZFICYmIChzZXEpLT5lbGVtX3NpemUgPT0gMSkKKworI2RlZmluZSBDVl9JU19TRVFfQ09OVE9VUiggc2VxICkgICBcCisgICAgKENWX0lTX1NFUV9DTE9TRUQoc2VxKSAmJiAoQ1ZfSVNfU0VRX1BPTFlMSU5FKHNlcSkgfHwgQ1ZfSVNfU0VRX0NIQUlOKHNlcSkpKQorCisjZGVmaW5lIENWX0lTX1NFUV9DSEFJTl9DT05UT1VSKCBzZXEgKSBcCisgICAgKENWX0lTX1NFUV9DSEFJTiggc2VxICkgJiYgQ1ZfSVNfU0VRX0NMT1NFRCggc2VxICkpCisKKyNkZWZpbmUgQ1ZfSVNfU0VRX1BPTFlHT05fVFJFRSggc2VxICkgXAorICAgIChDVl9TRVFfRUxUWVBFIChzZXEpID09ICBDVl9TRVFfRUxUWVBFX1RSSUFOX0FUUiAmJiAgICBcCisgICAgQ1ZfU0VRX0tJTkQoIHNlcSApID09ICBDVl9TRVFfS0lORF9CSU5fVFJFRSApCisKKyNkZWZpbmUgQ1ZfSVNfR1JBUEgoIHNlcSApICAgIFwKKyAgICAoQ1ZfSVNfU0VUKHNlcSkgJiYgQ1ZfU0VRX0tJTkQoKEN2U2V0Kikoc2VxKSkgPT0gQ1ZfU0VRX0tJTkRfR1JBUEgpCisKKyNkZWZpbmUgQ1ZfSVNfR1JBUEhfT1JJRU5URUQoIHNlcSApICAgXAorICAgICgoKHNlcSktPmZsYWdzICYgQ1ZfR1JBUEhfRkxBR19PUklFTlRFRCkgIT0gMCkKKworI2RlZmluZSBDVl9JU19TVUJESVYyRCggc2VxICkgIFwKKyAgICAoQ1ZfSVNfU0VUKHNlcSkgJiYgQ1ZfU0VRX0tJTkQoKEN2U2V0Kikoc2VxKSkgPT0gQ1ZfU0VRX0tJTkRfU1VCRElWMkQpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugd3JpdGVyICYgcmVhZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9TRVFfV1JJVEVSX0ZJRUxEUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgaGVhZGVyX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZTZXEqICAgICAgIHNlcTsgICAgICAgIC8qIHRoZSBzZXF1ZW5jZSB3cml0dGVuICovICAgICAgICAgICAgXAorICAgIEN2U2VxQmxvY2sqICBibG9jazsgICAgICAvKiBjdXJyZW50IGJsb2NrICovICAgICAgICAgICAgICAgICAgIFwKKyAgICBzY2hhciogICAgICAgcHRyOyAgICAgICAgLyogcG9pbnRlciB0byBmcmVlIHNwYWNlICovICAgICAgICAgICBcCisgICAgc2NoYXIqICAgICAgIGJsb2NrX21pbjsgIC8qIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiBibG9jayovXAorICAgIHNjaGFyKiAgICAgICBibG9ja19tYXg7ICAvKiBwb2ludGVyIHRvIHRoZSBlbmQgb2YgYmxvY2sgKi8KKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTZXFXcml0ZXIKK3sKKyAgICBDVl9TRVFfV1JJVEVSX0ZJRUxEUygpCit9CitDdlNlcVdyaXRlcjsKKworCisjZGVmaW5lIENWX1NFUV9SRUFERVJfRklFTERTKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgICAgICAgICAgaGVhZGVyX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2U2VxKiAgICAgICBzZXE7ICAgICAgICAvKiBzZXF1ZW5jZSwgYmVpZ24gcmVhZCAqLyAgICAgICAgICAgICBcCisgICAgQ3ZTZXFCbG9jayogIGJsb2NrOyAgICAgIC8qIGN1cnJlbnQgYmxvY2sgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBzY2hhciogICAgICAgcHRyOyAgICAgICAgLyogcG9pbnRlciB0byBlbGVtZW50IGJlIHJlYWQgbmV4dCAqLyAgXAorICAgIHNjaGFyKiAgICAgICBibG9ja19taW47ICAvKiBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgYmxvY2sgKi9cCisgICAgc2NoYXIqICAgICAgIGJsb2NrX21heDsgIC8qIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiBibG9jayAqLyAgICAgIFwKKyAgICBpbnQgICAgICAgICAgZGVsdGFfaW5kZXg7LyogPSBzZXEtPmZpcnN0LT5zdGFydF9pbmRleCAgICovICAgICAgXAorICAgIHNjaGFyKiAgICAgICBwcmV2X2VsZW07ICAvKiBwb2ludGVyIHRvIHByZXZpb3VzIGVsZW1lbnQgKi8KKworCit0eXBlZGVmIHN0cnVjdCBDdlNlcVJlYWRlcgoreworICAgIENWX1NFUV9SRUFERVJfRklFTERTKCkKK30KK0N2U2VxUmVhZGVyOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25zIG9uIHNlcXVlbmNlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgIENWX1NFUV9FTEVNKCBzZXEsIGVsZW1fdHlwZSwgaW5kZXggKSAgICAgICAgICAgICAgICAgICAgXAorLyogYXNzZXJ0IGdpdmVzIHNvbWUgZ3VhcmFudGVlIHRoYXQgPHNlcT4gcGFyYW1ldGVyIGlzIHZhbGlkICovICBcCisoICAgYXNzZXJ0KHNpemVvZigoc2VxKS0+Zmlyc3RbMF0pID09IHNpemVvZihDdlNlcUJsb2NrKSAmJiAgICAgIFwKKyAgICAoc2VxKS0+ZWxlbV9zaXplID09IHNpemVvZihlbGVtX3R5cGUpKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChlbGVtX3R5cGUqKSgoc2VxKS0+Zmlyc3QgJiYgKHVuc2lnbmVkKWluZGV4IDwgICAgICAgICAgICAgICBcCisgICAgKHVuc2lnbmVkKSgoc2VxKS0+Zmlyc3QtPmNvdW50KSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc2VxKS0+Zmlyc3QtPmRhdGEgKyAoaW5kZXgpICogc2l6ZW9mKGVsZW1fdHlwZSkgOiAgICAgICAgICAgXAorICAgIGN2R2V0U2VxRWxlbSggKEN2U2VxKikoc2VxKSwgKGluZGV4KSApKSkKKyNkZWZpbmUgQ1ZfR0VUX1NFUV9FTEVNKCBlbGVtX3R5cGUsIHNlcSwgaW5kZXggKSBDVl9TRVFfRUxFTSggKHNlcSksIGVsZW1fdHlwZSwgKGluZGV4KSApCisKKy8qIEFkZCBlbGVtZW50IHRvIHNlcXVlbmNlOiAqLworI2RlZmluZSBDVl9XUklURV9TRVFfRUxFTV9WQVIoIGVsZW1fcHRyLCB3cml0ZXIgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAod3JpdGVyKS5wdHIgPj0gKHdyaXRlcikuYmxvY2tfbWF4ICkgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdkNyZWF0ZVNlcUJsb2NrKCAmd3JpdGVyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lbWNweSgod3JpdGVyKS5wdHIsIGVsZW1fcHRyLCAod3JpdGVyKS5zZXEtPmVsZW1fc2l6ZSk7XAorICAgICh3cml0ZXIpLnB0ciArPSAod3JpdGVyKS5zZXEtPmVsZW1fc2l6ZTsgICAgICAgICAgXAorfQorCisjZGVmaW5lIENWX1dSSVRFX1NFUV9FTEVNKCBlbGVtLCB3cml0ZXIgKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCAod3JpdGVyKS5zZXEtPmVsZW1fc2l6ZSA9PSBzaXplb2YoZWxlbSkpOyBcCisgICAgaWYoICh3cml0ZXIpLnB0ciA+PSAod3JpdGVyKS5ibG9ja19tYXggKSAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGN2Q3JlYXRlU2VxQmxvY2soICZ3cml0ZXIpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXNzZXJ0KCAod3JpdGVyKS5wdHIgPD0gKHdyaXRlcikuYmxvY2tfbWF4IC0gc2l6ZW9mKGVsZW0pKTtcCisgICAgbWVtY3B5KCh3cml0ZXIpLnB0ciwgJihlbGVtKSwgc2l6ZW9mKGVsZW0pKTsgICAgICBcCisgICAgKHdyaXRlcikucHRyICs9IHNpemVvZihlbGVtKTsgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogTW92ZSByZWFkZXIgcG9zaXRpb24gZm9yd2FyZDogKi8KKyNkZWZpbmUgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKSAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICgocmVhZGVyKS5wdHIgKz0gKGVsZW1fc2l6ZSkpID49IChyZWFkZXIpLmJsb2NrX21heCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjdkNoYW5nZVNlcUJsb2NrKCAmKHJlYWRlciksIDEgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvKiBNb3ZlIHJlYWRlciBwb3NpdGlvbiBiYWNrd2FyZDogKi8KKyNkZWZpbmUgQ1ZfUFJFVl9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAoKHJlYWRlcikucHRyIC09IChlbGVtX3NpemUpKSA8IChyZWFkZXIpLmJsb2NrX21pbiApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGN2Q2hhbmdlU2VxQmxvY2soICYocmVhZGVyKSwgLTEgKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogUmVhZCBlbGVtZW50IGFuZCBtb3ZlIHJlYWQgcG9zaXRpb24gZm9yd2FyZDogKi8KKyNkZWZpbmUgQ1ZfUkVBRF9TRVFfRUxFTSggZWxlbSwgcmVhZGVyICkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIChyZWFkZXIpLnNlcS0+ZWxlbV9zaXplID09IHNpemVvZihlbGVtKSk7ICAgICAgICAgIFwKKyAgICBtZW1jcHkoICYoZWxlbSksIChyZWFkZXIpLnB0ciwgc2l6ZW9mKChlbGVtKSkpOyAgICAgICAgICAgIFwKKyAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoZWxlbSksIHJlYWRlciApICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogUmVhZCBlbGVtZW50IGFuZCBtb3ZlIHJlYWQgcG9zaXRpb24gYmFja3dhcmQ6ICovCisjZGVmaW5lIENWX1JFVl9SRUFEX1NFUV9FTEVNKCBlbGVtLCByZWFkZXIgKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggKHJlYWRlcikuc2VxLT5lbGVtX3NpemUgPT0gc2l6ZW9mKGVsZW0pKTsgICAgICAgICAgICBcCisgICAgbWVtY3B5KCYoZWxlbSksIChyZWFkZXIpLnB0ciwgc2l6ZW9mKChlbGVtKSkpOyAgICAgICAgICAgICAgIFwKKyAgICBDVl9QUkVWX1NFUV9FTEVNKCBzaXplb2YoZWxlbSksIHJlYWRlciApICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgQ1ZfUkVBRF9DSEFJTl9QT0lOVCggX3B0LCByZWFkZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoX3B0KSA9IChyZWFkZXIpLnB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggKHJlYWRlcikucHRyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggKHJlYWRlcikuY29kZSwgKHJlYWRlcikpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0KCAoKHJlYWRlcikuY29kZSAmIH43KSA9PSAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHJlYWRlcikucHQueCArPSAocmVhZGVyKS5kZWx0YXNbKGludCkocmVhZGVyKS5jb2RlXVswXTsgICAgICAgIFwKKyAgICAgICAgKHJlYWRlcikucHQueSArPSAocmVhZGVyKS5kZWx0YXNbKGludCkocmVhZGVyKS5jb2RlXVsxXTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBDVl9DVVJSRU5UX1BPSU5UKCByZWFkZXIgKSAgKCooKEN2UG9pbnQqKSgocmVhZGVyKS5wdHIpKSkKKyNkZWZpbmUgQ1ZfUFJFVl9QT0lOVCggcmVhZGVyICkgICAgICgqKChDdlBvaW50KikoKHJlYWRlcikucHJldl9lbGVtKSkpCisKKyNkZWZpbmUgQ1ZfUkVBRF9FREdFKCBwdDEsIHB0MiwgcmVhZGVyICkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggc2l6ZW9mKHB0MSkgPT0gc2l6ZW9mKEN2UG9pbnQpICYmICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVvZihwdDIpID09IHNpemVvZihDdlBvaW50KSAmJiAgICAgICAgICBcCisgICAgICAgICAgICByZWFkZXIuc2VxLT5lbGVtX3NpemUgPT0gc2l6ZW9mKEN2UG9pbnQpKTsgXAorICAgIChwdDEpID0gQ1ZfUFJFVl9QT0lOVCggcmVhZGVyICk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAocHQyKSA9IENWX0NVUlJFTlRfUE9JTlQoIHJlYWRlciApOyAgICAgICAgICAgICAgICBcCisgICAgKHJlYWRlcikucHJldl9lbGVtID0gKHJlYWRlcikucHRyOyAgICAgICAgICAgICAgICAgXAorICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihDdlBvaW50KSwgKHJlYWRlcikpOyAgICAgIFwKK30KKworLyoqKioqKioqKioqKiBHcmFwaCBtYWNyb3MgKioqKioqKioqKioqLworCisvKiBSZXR1cm4gbmV4dCBncmFwaCBlZGdlIGZvciBnaXZlbiB2ZXJ0ZXg6ICovCisjZGVmaW5lICBDVl9ORVhUX0dSQVBIX0VER0UoIGVkZ2UsIHZlcnRleCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoYXNzZXJ0KChlZGdlKS0+dnR4WzBdID09ICh2ZXJ0ZXgpIHx8IChlZGdlKS0+dnR4WzFdID09ICh2ZXJ0ZXgpKSwgIFwKKyAgICAgIChlZGdlKS0+bmV4dFsoZWRnZSktPnZ0eFsxXSA9PSAodmVydGV4KV0pCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgRGF0YSBzdHJ1Y3R1cmVzIGZvciBwZXJzaXN0ZW5jZSAoYS5rLmEgc2VyaWFsaXphdGlvbikgZnVuY3Rpb25hbGl0eSAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICJibGFjayBib3giIGZpbGUgc3RvcmFnZSAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZGaWxlU3RvcmFnZSBDdkZpbGVTdG9yYWdlOworCisvKiBTdG9yYWdlIGZsYWdzOiAqLworI2RlZmluZSBDVl9TVE9SQUdFX1JFQUQgICAgICAgICAgMAorI2RlZmluZSBDVl9TVE9SQUdFX1dSSVRFICAgICAgICAgMQorI2RlZmluZSBDVl9TVE9SQUdFX1dSSVRFX1RFWFQgICAgQ1ZfU1RPUkFHRV9XUklURQorI2RlZmluZSBDVl9TVE9SQUdFX1dSSVRFX0JJTkFSWSAgQ1ZfU1RPUkFHRV9XUklURQorI2RlZmluZSBDVl9TVE9SQUdFX0FQUEVORCAgICAgICAgMgorCisvKiBMaXN0IG9mIGF0dHJpYnV0ZXM6ICovCit0eXBlZGVmIHN0cnVjdCBDdkF0dHJMaXN0Cit7CisgICAgY29uc3QgY2hhcioqIGF0dHI7ICAgICAgICAgLyogTlVMTC10ZXJtaW5hdGVkIGFycmF5IG9mIChhdHRyaWJ1dGVfbmFtZSxhdHRyaWJ1dGVfdmFsdWUpIHBhaXJzLiAqLworICAgIHN0cnVjdCBDdkF0dHJMaXN0KiBuZXh0OyAgIC8qIFBvaW50ZXIgdG8gbmV4dCBjaHVuayBvZiB0aGUgYXR0cmlidXRlcyBsaXN0LiAgICAgICAgICAgICAgICAgICAgKi8KK30KK0N2QXR0ckxpc3Q7CisKK0NWX0lOTElORSBDdkF0dHJMaXN0IGN2QXR0ckxpc3QoIGNvbnN0IGNoYXIqKiBhdHRyIENWX0RFRkFVTFQoTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkF0dHJMaXN0KiBuZXh0IENWX0RFRkFVTFQoTlVMTCkgKQoreworICAgIEN2QXR0ckxpc3QgbDsKKyAgICBsLmF0dHIgPSBhdHRyOworICAgIGwubmV4dCA9IG5leHQ7CisKKyAgICByZXR1cm4gbDsKK30KKworc3RydWN0IEN2VHlwZUluZm87CisKKyNkZWZpbmUgQ1ZfTk9ERV9OT05FICAgICAgICAwCisjZGVmaW5lIENWX05PREVfSU5UICAgICAgICAgMQorI2RlZmluZSBDVl9OT0RFX0lOVEVHRVIgICAgIENWX05PREVfSU5UCisjZGVmaW5lIENWX05PREVfUkVBTCAgICAgICAgMgorI2RlZmluZSBDVl9OT0RFX0ZMT0FUICAgICAgIENWX05PREVfUkVBTAorI2RlZmluZSBDVl9OT0RFX1NUUiAgICAgICAgIDMKKyNkZWZpbmUgQ1ZfTk9ERV9TVFJJTkcgICAgICBDVl9OT0RFX1NUUgorI2RlZmluZSBDVl9OT0RFX1JFRiAgICAgICAgIDQgLyogbm90IHVzZWQgKi8KKyNkZWZpbmUgQ1ZfTk9ERV9TRVEgICAgICAgICA1CisjZGVmaW5lIENWX05PREVfTUFQICAgICAgICAgNgorI2RlZmluZSBDVl9OT0RFX1RZUEVfTUFTSyAgIDcKKworI2RlZmluZSBDVl9OT0RFX1RZUEUoZmxhZ3MpICAoKGZsYWdzKSAmIENWX05PREVfVFlQRV9NQVNLKQorCisvKiBmaWxlIG5vZGUgZmxhZ3MgKi8KKyNkZWZpbmUgQ1ZfTk9ERV9GTE9XICAgICAgICA4IC8qIFVzZWQgb25seSBmb3Igd3JpdGluZyBzdHJ1Y3R1cmVzIGluIFlBTUwgZm9ybWF0LiAqLworI2RlZmluZSBDVl9OT0RFX1VTRVIgICAgICAgIDE2CisjZGVmaW5lIENWX05PREVfRU1QVFkgICAgICAgMzIKKyNkZWZpbmUgQ1ZfTk9ERV9OQU1FRCAgICAgICA2NAorCisjZGVmaW5lIENWX05PREVfSVNfSU5UKGZsYWdzKSAgICAgICAgKENWX05PREVfVFlQRShmbGFncykgPT0gQ1ZfTk9ERV9JTlQpCisjZGVmaW5lIENWX05PREVfSVNfUkVBTChmbGFncykgICAgICAgKENWX05PREVfVFlQRShmbGFncykgPT0gQ1ZfTk9ERV9SRUFMKQorI2RlZmluZSBDVl9OT0RFX0lTX1NUUklORyhmbGFncykgICAgIChDVl9OT0RFX1RZUEUoZmxhZ3MpID09IENWX05PREVfU1RSSU5HKQorI2RlZmluZSBDVl9OT0RFX0lTX1NFUShmbGFncykgICAgICAgIChDVl9OT0RFX1RZUEUoZmxhZ3MpID09IENWX05PREVfU0VRKQorI2RlZmluZSBDVl9OT0RFX0lTX01BUChmbGFncykgICAgICAgIChDVl9OT0RFX1RZUEUoZmxhZ3MpID09IENWX05PREVfTUFQKQorI2RlZmluZSBDVl9OT0RFX0lTX0NPTExFQ1RJT04oZmxhZ3MpIChDVl9OT0RFX1RZUEUoZmxhZ3MpID49IENWX05PREVfU0VRKQorI2RlZmluZSBDVl9OT0RFX0lTX0ZMT1coZmxhZ3MpICAgICAgICgoKGZsYWdzKSAmIENWX05PREVfRkxPVykgIT0gMCkKKyNkZWZpbmUgQ1ZfTk9ERV9JU19FTVBUWShmbGFncykgICAgICAoKChmbGFncykgJiBDVl9OT0RFX0VNUFRZKSAhPSAwKQorI2RlZmluZSBDVl9OT0RFX0lTX1VTRVIoZmxhZ3MpICAgICAgICgoKGZsYWdzKSAmIENWX05PREVfVVNFUikgIT0gMCkKKyNkZWZpbmUgQ1ZfTk9ERV9IQVNfTkFNRShmbGFncykgICAgICAoKChmbGFncykgJiBDVl9OT0RFX05BTUVEKSAhPSAwKQorCisjZGVmaW5lIENWX05PREVfU0VRX1NJTVBMRSAyNTYKKyNkZWZpbmUgQ1ZfTk9ERV9TRVFfSVNfU0lNUExFKHNlcSkgKCgoc2VxKS0+ZmxhZ3MgJiBDVl9OT0RFX1NFUV9TSU1QTEUpICE9IDApCisKK3R5cGVkZWYgc3RydWN0IEN2U3RyaW5nCit7CisgICAgaW50IGxlbjsKKyAgICBjaGFyKiBwdHI7Cit9CitDdlN0cmluZzsKKworLyogQWxsIHRoZSBrZXlzIChuYW1lcykgb2YgZWxlbWVudHMgaW4gdGhlIHJlYWRlZCBmaWxlIHN0b3JhZ2UKKyAgIGFyZSBzdG9yZWQgaW4gdGhlIGhhc2ggdG8gc3BlZWQgdXAgdGhlIGxvb2t1cCBvcGVyYXRpb25zOiAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZTdHJpbmdIYXNoTm9kZQoreworICAgIHVuc2lnbmVkIGhhc2h2YWw7CisgICAgQ3ZTdHJpbmcgc3RyOworICAgIHN0cnVjdCBDdlN0cmluZ0hhc2hOb2RlKiBuZXh0OworfQorQ3ZTdHJpbmdIYXNoTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHZW5lcmljSGFzaCBDdkZpbGVOb2RlSGFzaDsKKworLyogQmFzaWMgZWxlbWVudCBvZiB0aGUgZmlsZSBzdG9yYWdlIC0gc2NhbGFyIG9yIGNvbGxlY3Rpb246ICovCit0eXBlZGVmIHN0cnVjdCBDdkZpbGVOb2RlCit7CisgICAgaW50IHRhZzsKKyAgICBzdHJ1Y3QgQ3ZUeXBlSW5mbyogaW5mbzsgLyogdHlwZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgKG9ubHkgZm9yIHVzZXItZGVmaW5lZCBvYmplY3QsIGZvciBvdGhlcnMgaXQgaXMgMCkgKi8KKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgZG91YmxlIGY7IC8qIHNjYWxhciBmbG9hdGluZy1wb2ludCBudW1iZXIgKi8KKyAgICAgICAgaW50IGk7ICAgIC8qIHNjYWxhciBpbnRlZ2VyIG51bWJlciAqLworICAgICAgICBDdlN0cmluZyBzdHI7IC8qIHRleHQgc3RyaW5nICovCisgICAgICAgIEN2U2VxKiBzZXE7IC8qIHNlcXVlbmNlIChvcmRlcmVkIGNvbGxlY3Rpb24gb2YgZmlsZSBub2RlcykgKi8KKyAgICAgICAgQ3ZGaWxlTm9kZUhhc2gqIG1hcDsgLyogbWFwIChjb2xsZWN0aW9uIG9mIG5hbWVkIGZpbGUgbm9kZXMpICovCisgICAgfSBkYXRhOworfQorQ3ZGaWxlTm9kZTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordHlwZWRlZiBpbnQgKENWX0NERUNMICpDdklzSW5zdGFuY2VGdW5jKSggY29uc3Qgdm9pZCogc3RydWN0X3B0ciApOwordHlwZWRlZiB2b2lkIChDVl9DREVDTCAqQ3ZSZWxlYXNlRnVuYykoIHZvaWQqKiBzdHJ1Y3RfZGJscHRyICk7Cit0eXBlZGVmIHZvaWQqIChDVl9DREVDTCAqQ3ZSZWFkRnVuYykoIEN2RmlsZVN0b3JhZ2UqIHN0b3JhZ2UsIEN2RmlsZU5vZGUqIG5vZGUgKTsKK3R5cGVkZWYgdm9pZCAoQ1ZfQ0RFQ0wgKkN2V3JpdGVGdW5jKSggQ3ZGaWxlU3RvcmFnZSogc3RvcmFnZSwgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3RydWN0X3B0ciwgQ3ZBdHRyTGlzdCBhdHRyaWJ1dGVzICk7Cit0eXBlZGVmIHZvaWQqIChDVl9DREVDTCAqQ3ZDbG9uZUZ1bmMpKCBjb25zdCB2b2lkKiBzdHJ1Y3RfcHRyICk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBDdlR5cGVJbmZvCit7CisgICAgaW50IGZsYWdzOworICAgIGludCBoZWFkZXJfc2l6ZTsKKyAgICBzdHJ1Y3QgQ3ZUeXBlSW5mbyogcHJldjsKKyAgICBzdHJ1Y3QgQ3ZUeXBlSW5mbyogbmV4dDsKKyAgICBjb25zdCBjaGFyKiB0eXBlX25hbWU7CisgICAgQ3ZJc0luc3RhbmNlRnVuYyBpc19pbnN0YW5jZTsKKyAgICBDdlJlbGVhc2VGdW5jIHJlbGVhc2U7CisgICAgQ3ZSZWFkRnVuYyByZWFkOworICAgIEN2V3JpdGVGdW5jIHdyaXRlOworICAgIEN2Q2xvbmVGdW5jIGNsb25lOworfQorQ3ZUeXBlSW5mbzsKKworCisvKioqKiBTeXN0ZW0gZGF0YSB0eXBlcyAqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IEN2UGx1Z2luRnVuY0luZm8KK3sKKyAgICB2b2lkKiogZnVuY19hZGRyOworICAgIHZvaWQqIGRlZmF1bHRfZnVuY19hZGRyOworICAgIGNvbnN0IGNoYXIqIGZ1bmNfbmFtZXM7CisgICAgaW50IHNlYXJjaF9tb2R1bGVzOworICAgIGludCBsb2FkZWRfZnJvbTsKK30KK0N2UGx1Z2luRnVuY0luZm87CisKK3R5cGVkZWYgc3RydWN0IEN2TW9kdWxlSW5mbworeworICAgIHN0cnVjdCBDdk1vZHVsZUluZm8qIG5leHQ7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBjb25zdCBjaGFyKiB2ZXJzaW9uOworICAgIEN2UGx1Z2luRnVuY0luZm8qIGZ1bmNfdGFiOworfQorQ3ZNb2R1bGVJbmZvOworCisjZW5kaWYgLypfQ1hDT1JFX1RZUEVTX0hfKi8KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL19jeGNvcmUuaCBiL2N4Y29yZS9zcmMvX2N4Y29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmQwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL19jeGNvcmUuaApAQCAtMCwwICsxLDM0NiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0NYQ09SRV9JTlRFUk5BTF9IXworI2RlZmluZSBfQ1hDT1JFX0lOVEVSTkFMX0hfCisKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKyAgICAvKiBkaXNhYmxlIHdhcm5pbmdzIHJlbGF0ZWQgdG8gaW5saW5lIGZ1bmN0aW9ucyAqLworICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogNDcxMSA0NzEwIDQ1MTQgKQorI2VuZGlmCisKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyB1bG9uZzsKKworI2lmZGVmIF9fQk9STEFORENfXworICAgICNkZWZpbmUgICAgIFdJTjMyCisgICAgI2RlZmluZSAgICAgQ1ZfRExMCisgICAgI3VuZGVmICAgICAgX0NWX0FMV0FZU19QUk9GSUxFXworICAgICNkZWZpbmUgICAgIF9DVl9BTFdBWVNfTk9fUFJPRklMRV8KKyNlbmRpZgorCisjaW5jbHVkZSAiY3hjb3JlLmgiCisjaW5jbHVkZSAiY3htaXNjLmgiCisjaW5jbHVkZSAiX2N4aXBwLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8ZmxvYXQuaD4KKworLy8gLTEyOC5mIC4uLiAyNTUuZgorZXh0ZXJuIGNvbnN0IGZsb2F0IGljdjh4MzJmVGFiW107CisjZGVmaW5lIENWXzhUTzMyRih4KSAgaWN2OHgzMmZUYWJbKHgpKzEyOF0KKworZXh0ZXJuIGNvbnN0IHVzaG9ydCBpY3Y4eDE2dVNxclRhYltdOworI2RlZmluZSBDVl9TUVJfOFUoeCkgIGljdjh4MTZ1U3FyVGFiWyh4KSsyNTVdCisKK2V4dGVybiBjb25zdCBjaGFyKiBpY3ZIZXJzaGV5R2x5cGhzW107CisKK2V4dGVybiBjb25zdCBzaWduZWQgY2hhciBpY3ZEZXB0aFRvVHlwZVtdOworCisjZGVmaW5lIGljdklwbFRvQ3ZEZXB0aCggZGVwdGggKSBcCisgICAgaWN2RGVwdGhUb1R5cGVbKCgoZGVwdGgpICYgMjU1KSA+PiAyKSArICgoZGVwdGgpIDwgMCldCisKK2V4dGVybiBjb25zdCB1Y2hhciBpY3ZTYXR1cmF0ZTh1W107CisjZGVmaW5lIENWX0ZBU1RfQ0FTVF84VSh0KSAgIChhc3NlcnQoLTI1NiA8PSAodCkgJiYgKHQpIDw9IDUxMiksIGljdlNhdHVyYXRlOHVbKHQpKzI1Nl0pCisjZGVmaW5lIENWX01JTl84VShhLGIpICAgICAgICgoYSkgLSBDVl9GQVNUX0NBU1RfOFUoKGEpIC0gKGIpKSkKKyNkZWZpbmUgQ1ZfTUFYXzhVKGEsYikgICAgICAgKChhKSArIENWX0ZBU1RfQ0FTVF84VSgoYikgLSAoYSkpKQorCit0eXBlZGVmIEN2RnVuYzJEXzNBMUkgQ3ZBcml0aG1CaW5NYXNrRnVuYzJEOwordHlwZWRlZiBDdkZ1bmMyRF8yQTFQMUkgQ3ZBcml0aG1VbmlNYXNrRnVuYzJEOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxleCBhcml0aG1ldGljcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IEN2Q29tcGxleDMyZjsKK3N0cnVjdCBDdkNvbXBsZXg2NGY7CisKK3N0cnVjdCBDdkNvbXBsZXgzMmYKK3sKKyAgICBmbG9hdCByZSwgaW07CisKKyAgICBDdkNvbXBsZXgzMmYoKSB7fQorICAgIEN2Q29tcGxleDMyZiggZmxvYXQgX3JlLCBmbG9hdCBfaW09MCApIDogcmUoX3JlKSwgaW0oX2ltKSB7fQorICAgIGV4cGxpY2l0IEN2Q29tcGxleDMyZiggY29uc3QgQ3ZDb21wbGV4NjRmJiB2ICk7CisgICAgLy9DdkNvbXBsZXgzMmYoIGNvbnN0IEN2Q29tcGxleDMyZiYgdiApIDogcmUodi5yZSksIGltKHYuaW0pIHt9CisgICAgLy9DdkNvbXBsZXgzMmYmIG9wZXJhdG9yID0gKGNvbnN0IEN2Q29tcGxleDMyZiYgdiApIHsgcmUgPSB2LnJlOyBpbSA9IHYuaW07IHJldHVybiAqdGhpczsgfQorICAgIG9wZXJhdG9yIEN2Q29tcGxleDY0ZigpIGNvbnN0OworfTsKKworc3RydWN0IEN2Q29tcGxleDY0ZgoreworICAgIGRvdWJsZSByZSwgaW07CisKKyAgICBDdkNvbXBsZXg2NGYoKSB7fQorICAgIEN2Q29tcGxleDY0ZiggZG91YmxlIF9yZSwgZG91YmxlIF9pbT0wICkgOiByZShfcmUpLCBpbShfaW0pIHt9CisgICAgZXhwbGljaXQgQ3ZDb21wbGV4NjRmKCBjb25zdCBDdkNvbXBsZXgzMmYmIHYgKTsKKyAgICAvL0N2Q29tcGxleDY0ZiggY29uc3QgQ3ZDb21wbGV4NjRmJiB2ICkgOiByZSh2LnJlKSwgaW0odi5pbSkge30KKyAgICAvL0N2Q29tcGxleDY0ZiYgb3BlcmF0b3IgPSAoY29uc3QgQ3ZDb21wbGV4NjRmJiB2ICkgeyByZSA9IHYucmU7IGltID0gdi5pbTsgcmV0dXJuICp0aGlzOyB9CisgICAgb3BlcmF0b3IgQ3ZDb21wbGV4MzJmKCkgY29uc3Q7Cit9OworCitpbmxpbmUgQ3ZDb21wbGV4MzJmOjpDdkNvbXBsZXgzMmYoIGNvbnN0IEN2Q29tcGxleDY0ZiYgdiApIDogcmUoKGZsb2F0KXYucmUpLCBpbSgoZmxvYXQpdi5pbSkge30KK2lubGluZSBDdkNvbXBsZXg2NGY6OkN2Q29tcGxleDY0ZiggY29uc3QgQ3ZDb21wbGV4MzJmJiB2ICkgOiByZSh2LnJlKSwgaW0odi5pbSkge30KKworaW5saW5lIEN2Q29tcGxleDMyZiBvcGVyYXRvciArIChDdkNvbXBsZXgzMmYgYSwgQ3ZDb21wbGV4MzJmIGIpCit7CisgICAgcmV0dXJuIEN2Q29tcGxleDMyZiggYS5yZSArIGIucmUsIGEuaW0gKyBiLmltICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXgzMmYmIG9wZXJhdG9yICs9IChDdkNvbXBsZXgzMmYmIGEsIEN2Q29tcGxleDMyZiBiKQoreworICAgIGEucmUgKz0gYi5yZTsKKyAgICBhLmltICs9IGIuaW07CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBDdkNvbXBsZXgzMmYgb3BlcmF0b3IgLSAoQ3ZDb21wbGV4MzJmIGEsIEN2Q29tcGxleDMyZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXgzMmYoIGEucmUgLSBiLnJlLCBhLmltIC0gYi5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4MzJmJiBvcGVyYXRvciAtPSAoQ3ZDb21wbGV4MzJmJiBhLCBDdkNvbXBsZXgzMmYgYikKK3sKKyAgICBhLnJlIC09IGIucmU7CisgICAgYS5pbSAtPSBiLmltOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgQ3ZDb21wbGV4MzJmIG9wZXJhdG9yIC0gKEN2Q29tcGxleDMyZiBhKQoreworICAgIHJldHVybiBDdkNvbXBsZXgzMmYoIC1hLnJlLCAtYS5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4MzJmIG9wZXJhdG9yICogKEN2Q29tcGxleDMyZiBhLCBDdkNvbXBsZXgzMmYgYikKK3sKKyAgICByZXR1cm4gQ3ZDb21wbGV4MzJmKCBhLnJlKmIucmUgLSBhLmltKmIuaW0sIGEucmUqYi5pbSArIGEuaW0qYi5yZSApOworfQorCitpbmxpbmUgZG91YmxlIGFicyhDdkNvbXBsZXgzMmYgYSkKK3sKKyAgICByZXR1cm4gc3FydCggKGRvdWJsZSlhLnJlKmEucmUgKyAoZG91YmxlKWEuaW0qYS5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4MzJmIGNvbmooQ3ZDb21wbGV4MzJmIGEpCit7CisgICAgcmV0dXJuIEN2Q29tcGxleDMyZiggYS5yZSwgLWEuaW0gKTsKK30KKworCitpbmxpbmUgQ3ZDb21wbGV4MzJmIG9wZXJhdG9yIC8gKEN2Q29tcGxleDMyZiBhLCBDdkNvbXBsZXgzMmYgYikKK3sKKyAgICBkb3VibGUgdCA9IDEuLygoZG91YmxlKWIucmUqYi5yZSArIChkb3VibGUpYi5pbSpiLmltKTsKKyAgICByZXR1cm4gQ3ZDb21wbGV4MzJmKCAoZmxvYXQpKChhLnJlKmIucmUgKyBhLmltKmIuaW0pKnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkoKC1hLnJlKmIuaW0gKyBhLmltKmIucmUpKnQpICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXgzMmYgb3BlcmF0b3IgKiAoZG91YmxlIGEsIEN2Q29tcGxleDMyZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXgzMmYoIChmbG9hdCkoYSpiLnJlKSwgKGZsb2F0KShhKmIuaW0pICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXgzMmYgb3BlcmF0b3IgKiAoQ3ZDb21wbGV4MzJmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXgzMmYoIChmbG9hdCkoYS5yZSpiKSwgKGZsb2F0KShhLmltKmIpICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXgzMmY6Om9wZXJhdG9yIEN2Q29tcGxleDY0ZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEN2Q29tcGxleDY0ZihyZSxpbSk7Cit9CisKKworaW5saW5lIEN2Q29tcGxleDY0ZiBvcGVyYXRvciArIChDdkNvbXBsZXg2NGYgYSwgQ3ZDb21wbGV4NjRmIGIpCit7CisgICAgcmV0dXJuIEN2Q29tcGxleDY0ZiggYS5yZSArIGIucmUsIGEuaW0gKyBiLmltICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYmIG9wZXJhdG9yICs9IChDdkNvbXBsZXg2NGYmIGEsIEN2Q29tcGxleDY0ZiBiKQoreworICAgIGEucmUgKz0gYi5yZTsKKyAgICBhLmltICs9IGIuaW07CisgICAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYgb3BlcmF0b3IgLSAoQ3ZDb21wbGV4NjRmIGEsIEN2Q29tcGxleDY0ZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEucmUgLSBiLnJlLCBhLmltIC0gYi5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmJiBvcGVyYXRvciAtPSAoQ3ZDb21wbGV4NjRmJiBhLCBDdkNvbXBsZXg2NGYgYikKK3sKKyAgICBhLnJlIC09IGIucmU7CisgICAgYS5pbSAtPSBiLmltOworICAgIHJldHVybiBhOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yIC0gKEN2Q29tcGxleDY0ZiBhKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIC1hLnJlLCAtYS5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yICogKEN2Q29tcGxleDY0ZiBhLCBDdkNvbXBsZXg2NGYgYikKK3sKKyAgICByZXR1cm4gQ3ZDb21wbGV4NjRmKCBhLnJlKmIucmUgLSBhLmltKmIuaW0sIGEucmUqYi5pbSArIGEuaW0qYi5yZSApOworfQorCitpbmxpbmUgZG91YmxlIGFicyhDdkNvbXBsZXg2NGYgYSkKK3sKKyAgICByZXR1cm4gc3FydCggKGRvdWJsZSlhLnJlKmEucmUgKyAoZG91YmxlKWEuaW0qYS5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yIC8gKEN2Q29tcGxleDY0ZiBhLCBDdkNvbXBsZXg2NGYgYikKK3sKKyAgICBkb3VibGUgdCA9IDEuLygoZG91YmxlKWIucmUqYi5yZSArIChkb3VibGUpYi5pbSpiLmltKTsKKyAgICByZXR1cm4gQ3ZDb21wbGV4NjRmKCAoYS5yZSpiLnJlICsgYS5pbSpiLmltKSp0LAorICAgICAgICAgICAgICAgICAgICAgICAgICgtYS5yZSpiLmltICsgYS5pbSpiLnJlKSp0ICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYgb3BlcmF0b3IgKiAoZG91YmxlIGEsIEN2Q29tcGxleDY0ZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEqYi5yZSwgYSpiLmltICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYgb3BlcmF0b3IgKiAoQ3ZDb21wbGV4NjRmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEucmUqYiwgYS5pbSpiICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGY6Om9wZXJhdG9yIEN2Q29tcGxleDMyZigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEN2Q29tcGxleDMyZigoZmxvYXQpcmUsKGZsb2F0KWltKTsKK30KKworaW5saW5lIEN2Q29tcGxleDY0ZiBjb25qKEN2Q29tcGxleDY0ZiBhKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEucmUsIC1hLmltICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYgb3BlcmF0b3IgKyAoQ3ZDb21wbGV4NjRmIGEsIEN2Q29tcGxleDMyZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEucmUgKyBiLnJlLCBhLmltICsgYi5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yICsgKEN2Q29tcGxleDMyZiBhLCBDdkNvbXBsZXg2NGYgYikKK3sKKyAgICByZXR1cm4gQ3ZDb21wbGV4NjRmKCBhLnJlICsgYi5yZSwgYS5pbSArIGIuaW0gKTsKK30KKworaW5saW5lIEN2Q29tcGxleDY0ZiBvcGVyYXRvciAtIChDdkNvbXBsZXg2NGYgYSwgQ3ZDb21wbGV4MzJmIGIpCit7CisgICAgcmV0dXJuIEN2Q29tcGxleDY0ZiggYS5yZSAtIGIucmUsIGEuaW0gLSBiLmltICk7Cit9CisKK2lubGluZSBDdkNvbXBsZXg2NGYgb3BlcmF0b3IgLSAoQ3ZDb21wbGV4MzJmIGEsIEN2Q29tcGxleDY0ZiBiKQoreworICAgIHJldHVybiBDdkNvbXBsZXg2NGYoIGEucmUgLSBiLnJlLCBhLmltIC0gYi5pbSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yICogKEN2Q29tcGxleDY0ZiBhLCBDdkNvbXBsZXgzMmYgYikKK3sKKyAgICByZXR1cm4gQ3ZDb21wbGV4NjRmKCBhLnJlKmIucmUgLSBhLmltKmIuaW0sIGEucmUqYi5pbSArIGEuaW0qYi5yZSApOworfQorCitpbmxpbmUgQ3ZDb21wbGV4NjRmIG9wZXJhdG9yICogKEN2Q29tcGxleDMyZiBhLCBDdkNvbXBsZXg2NGYgYikKK3sKKyAgICByZXR1cm4gQ3ZDb21wbGV4NjRmKCBhLnJlKmIucmUgLSBhLmltKmIuaW0sIGEucmUqYi5pbSArIGEuaW0qYi5yZSApOworfQorCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkNvcHlNYXNrRnVuYykoY29uc3Qgdm9pZCogc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbWFzaywgaW50IG1hc2tfc3RlcCk7CisKK0N2Q29weU1hc2tGdW5jIGljdkdldENvcHlNYXNrRnVuYyggaW50IGVsZW1fc2l6ZSApOworCitDdlN0YXR1cyBDVl9TVERDQUxMIGljdlNldFplcm9fOHVfQzFSKCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKTsKKworQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZTY2FsZV8zMmYoIGNvbnN0IGZsb2F0KiBzcmMsIGZsb2F0KiBkc3QsIGludCBsZW4sIGZsb2F0IGEsIGZsb2F0IGIgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2U2NhbGVfNjRmKCBjb25zdCBkb3VibGUqIHNyYywgZG91YmxlKiBkc3QsIGludCBsZW4sIGRvdWJsZSBhLCBkb3VibGUgYiApOworCitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkxVVF9UcmFuc2Zvcm04dV84dV9DMVIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IHVjaGFyKiBsdXQgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2TFVUX1RyYW5zZm9ybTh1XzE2dV9DMVIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1c2hvcnQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgdXNob3J0KiBsdXQgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2TFVUX1RyYW5zZm9ybTh1XzMyc19DMVIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBpbnQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgaW50KiBsdXQgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2TFVUX1RyYW5zZm9ybTh1XzY0Zl9DMVIoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCBkb3VibGUqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgZG91YmxlKiBsdXQgKTsKKworQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZMVVRfVHJhbnNmb3JtOHVfOHVfQzJSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgdWNoYXIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCBjb25zdCB1Y2hhciogbHV0ICk7CitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkxVVF9UcmFuc2Zvcm04dV84dV9DM1IoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNzdGVwLCB1Y2hhciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IHVjaGFyKiBsdXQgKTsKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0M0UiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIHVjaGFyKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgdWNoYXIqIGx1dCApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZMVVRfVHJhbnNmb3JtRnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCBjb25zdCB2b2lkKiBsdXQgKTsKKworQ1ZfSU5MSU5FIEN2U3RhdHVzCitpY3ZMVVRfVHJhbnNmb3JtOHVfOHNfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgc2NoYXIqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IHNjaGFyKiBsdXQgKQoreworICAgIHJldHVybiBpY3ZMVVRfVHJhbnNmb3JtOHVfOHVfQzFSKCBzcmMsIHNyY3N0ZXAsICh1Y2hhciopZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdGVwLCBzaXplLCAoY29uc3QgdWNoYXIqKWx1dCApOworfQorCitDVl9JTkxJTkUgQ3ZTdGF0dXMKK2ljdkxVVF9UcmFuc2Zvcm04dV8xNnNfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgc2hvcnQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IHNob3J0KiBsdXQgKQoreworICAgIHJldHVybiBpY3ZMVVRfVHJhbnNmb3JtOHVfMTZ1X0MxUiggc3JjLCBzcmNzdGVwLCAodXNob3J0Kilkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdGVwLCBzaXplLCAoY29uc3QgdXNob3J0KilsdXQgKTsKK30KKworQ1ZfSU5MSU5FIEN2U3RhdHVzCitpY3ZMVVRfVHJhbnNmb3JtOHVfMzJmX0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsIGZsb2F0KiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCBjb25zdCBmbG9hdCogbHV0ICkKK3sKKyAgICByZXR1cm4gaWN2TFVUX1RyYW5zZm9ybTh1XzMyc19DMVIoIHNyYywgc3Jjc3RlcCwgKGludCopZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0c3RlcCwgc2l6ZSwgKGNvbnN0IGludCopbHV0ICk7Cit9CisKKyNlbmRpZiAvKl9DWENPUkVfSU5URVJOQUxfSF8qLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9fY3hpcHAuaCBiL2N4Y29yZS9zcmMvX2N4aXBwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzMGVmNQotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvX2N4aXBwLmgKQEAgLTAsMCArMSw2NDYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9DWENPUkVfSVBQX0hfCisjZGVmaW5lIF9DWENPUkVfSVBQX0hfCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weS9TZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogdGVtcG9yYXJ5IGRpc2FibGUgaXBwIHplcm8gYW5kIGNvcHkgZnVuY3Rpb25zIGFzIHRoZXkgYWZmZWN0IHN1YnNlcXVlbnQgZnVuY3Rpb25zJyBwZXJmb3JtYW5jZSAqLworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfOHVfQzFSLCAiaXBwaUNvcHlfOHVfQzFSIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpKi8sCisgICAgICAgICAgICAgICAgICAoIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgc2l6ZSApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2U2V0Qnl0ZV84dV9DMVIsICJpcHBpU2V0Xzh1X0MxUiIsIDAvKkNWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSovLAorICAgICAgICAgICAgICAgICAgKCB1Y2hhciB2YWx1ZSwgdWNoYXIqIGRzdCwgaW50IGRzdF9zdGVwLCBDdlNpemUgc2l6ZSApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q3Z0XzMyZjY0ZiwgImlwcHNDb252ZXJ0XzMyZjY0ZiIsCisgICAgICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQUyksICggY29uc3QgZmxvYXQqIHNyYywgZG91YmxlKiBkc3QsIGludCBsZW4gKSkKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDdnRfNjRmMzJmLCAiaXBwc0NvbnZlcnRfNjRmMzJmIiwKKyAgICAgICAgICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBTKSwgKCBjb25zdCBkb3VibGUqIHNyYywgZmxvYXQqIGRzdCwgaW50IGxlbiApKQorCisjZGVmaW5lIElQQ1ZfQ09QWVNFVCggZmxhdm9yLCBhcnJ0eXBlLCBzY2FsYXJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q29weSMjZmxhdm9yLCAiaXBwaUNvcHkiICNmbGF2b3IsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCApKSAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2U2V0IyNmbGF2b3IsICJpcHBpU2V0IiAjZmxhdm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLypDVl9QTFVHSU5TMShDVl9QTFVHSU5fT1BUQ1YpKi8sICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgYXJydHlwZSogc2NhbGFyICkpCisKK0lQQ1ZfQ09QWVNFVCggXzh1X0MxTVIsIHVjaGFyLCBpbnQgKQorSVBDVl9DT1BZU0VUKCBfMTZzX0MxTVIsIHVzaG9ydCwgaW50ICkKK0lQQ1ZfQ09QWVNFVCggXzh1X0MzTVIsIHVjaGFyLCBpbnQgKQorSVBDVl9DT1BZU0VUKCBfOHVfQzRNUiwgaW50LCBpbnQgKQorSVBDVl9DT1BZU0VUKCBfMTZzX0MzTVIsIHVzaG9ydCwgaW50ICkKK0lQQ1ZfQ09QWVNFVCggXzE2c19DNE1SLCBpbnQ2NCwgaW50NjQgKQorSVBDVl9DT1BZU0VUKCBfMzJmX0MzTVIsIGludCwgaW50ICkKK0lQQ1ZfQ09QWVNFVCggXzMyZl9DNE1SLCBpbnQsIGludCApCitJUENWX0NPUFlTRVQoIF82NHNfQzNNUiwgaW50NjQsIGludDY0ICkKK0lQQ1ZfQ09QWVNFVCggXzY0c19DNE1SLCBpbnQ2NCwgaW50NjQgKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyaXRobWV0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJUENWX0JJTl9BUklUSE0oIG5hbWUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2IyNuYW1lIyNfOHVfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaSIgI25hbWUgIl84dV9DMVJTZnMiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgXAorKCBjb25zdCB1Y2hhciogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCB1Y2hhciogc3JjMiwgaW50IHNyY3N0ZXAyLCBcCisgIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgaW50IHNjYWxlZmFjdG9yICkpICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3YjI25hbWUjI18xNnVfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpIiAjbmFtZSAiXzE2dV9DMVJTZnMiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICBcCisoIGNvbnN0IHVzaG9ydCogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCB1c2hvcnQqIHNyYzIsIGludCBzcmNzdGVwMixcCisgIHVzaG9ydCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBzY2FsZWZhY3RvciApKSAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3YjI25hbWUjI18xNnNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpIiAjbmFtZSAiXzE2c19DMVJTZnMiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICBcCisoIGNvbnN0IHNob3J0KiBzcmMxLCBpbnQgc3Jjc3RlcDEsIGNvbnN0IHNob3J0KiBzcmMyLCBpbnQgc3Jjc3RlcDIsIFwKKyAgc2hvcnQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCBpbnQgc2NhbGVmYWN0b3IgKSkgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdiMjbmFtZSMjXzMyc19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGkiICNuYW1lICJfMzJzX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgIFwKKyggY29uc3QgaW50KiBzcmMxLCBpbnQgc3Jjc3RlcDEsIGNvbnN0IGludCogc3JjMiwgaW50IHNyY3N0ZXAyLCAgICAgXAorICBpbnQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2IyNuYW1lIyNfMzJmX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiaXBwaSIgI25hbWUgIl8zMmZfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgXAorKCBjb25zdCBmbG9hdCogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBmbG9hdCogc3JjMiwgaW50IHNyY3N0ZXAyLCBcCisgIGZsb2F0KiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3YjI25hbWUjI182NGZfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpIiAjbmFtZSAiXzY0Zl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICBcCisoIGNvbnN0IGRvdWJsZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBkb3VibGUqIHNyYzIsIGludCBzcmNzdGVwMixcCisgIGRvdWJsZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSkKKworCitJUENWX0JJTl9BUklUSE0oIEFkZCApCitJUENWX0JJTl9BUklUSE0oIFN1YiApCisKKyN1bmRlZiBJUENWX0JJTl9BUklUSE0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2ljYWwgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElQQ1ZfTE9HSUMoIG5hbWUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2IyNuYW1lIyNfOHVfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGkiICNuYW1lICJfOHVfQzFSIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpKi8sICAgICAgICAgICBcCisoIGNvbnN0IHVjaGFyKiBzcmMxLCBpbnQgc3Jjc3RlcDEsIGNvbnN0IHVjaGFyKiBzcmMyLCBpbnQgc3Jjc3RlcDIsICAgICBcCisgIHVjaGFyKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApKQorCitJUENWX0xPR0lDKCBBbmQgKQorSVBDVl9MT0dJQyggT3IgKQorSVBDVl9MT0dJQyggWG9yICkKKworI3VuZGVmIElQQ1ZfTE9HSUMKKworSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk5vdF84dV9DMVIsICJpcHBpTm90Xzh1X0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwKKyggY29uc3QgdWNoYXIqIHNyYywgaW50IHN0ZXAxLCB1Y2hhciogZHN0LCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUgKSkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbWFnZSBTdGF0aXN0aWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNZWFuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElQQ1ZfREVGX01FQU5fTUFTSyggZmxhdm9yLCBzcmN0eXBlICkgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZNZWFuXyMjZmxhdm9yIyNfQzFNUiwgICAgICAgICAgXAorImlwcGlNZWFuXyIgI2ZsYXZvciAiX0MxTVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpLCBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsIGNvbnN0IHVjaGFyKiBtYXNrLCAgIFwKKyAgaW50IG1hc2tTdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBtZWFuICkpICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1lYW5fIyNmbGF2b3IjI19DMk1SLCAgICAgICAgICBcCisiaXBwaU1lYW5fIiAjZmxhdm9yICJfQzJNUiIsIDAvKkNWX1BMVUdJTlMxKENWX1BMVUdJTl9PUFRDVikqLywgXAorKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCBjb25zdCB1Y2hhciogbWFzaywgICBcCisgIGludCBtYXNrU3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiApKSAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZNZWFuXyMjZmxhdm9yIyNfQzNNUiwgICAgICAgICAgXAorImlwcGlNZWFuXyIgI2ZsYXZvciAiX0MzTVIiLCAwLypDVl9QTFVHSU5TMShDVl9QTFVHSU5fT1BUQ1YpKi8sIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgY29uc3QgdWNoYXIqIG1hc2ssICAgXAorICBpbnQgbWFza1N0ZXAsIEN2U2l6ZSBzaXplLCBkb3VibGUqIG1lYW4gKSkgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl8jI2ZsYXZvciMjX0M0TVIsICAgICAgICAgIFwKKyJpcHBpTWVhbl8iICNmbGF2b3IgIl9DNE1SIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX09QVENWKSovLCBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsIGNvbnN0IHVjaGFyKiBtYXNrLCAgIFwKKyAgaW50IG1hc2tTdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBtZWFuICkpCisKK0lQQ1ZfREVGX01FQU5fTUFTSyggOHUsIHVjaGFyICkKK0lQQ1ZfREVGX01FQU5fTUFTSyggMTZ1LCB1c2hvcnQgKQorSVBDVl9ERUZfTUVBTl9NQVNLKCAxNnMsIHNob3J0ICkKK0lQQ1ZfREVGX01FQU5fTUFTSyggMzJzLCBpbnQgKQorSVBDVl9ERUZfTUVBTl9NQVNLKCAzMmYsIGZsb2F0ICkKK0lQQ1ZfREVGX01FQU5fTUFTSyggNjRmLCBkb3VibGUgKQorCisjdW5kZWYgSVBDVl9ERUZfTUVBTl9NQVNLCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNZWFuX1N0ZERldiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyN1bmRlZiBJUENWX01FQU5fU0RWX1BMVUdJTgorI2RlZmluZSBJQ1ZfTUVBTl9TRFZfUExVR0lOIDAgLyogQ1ZfUExVR0lOUzEoSVBQQ1YpICovCisKKyNkZWZpbmUgSVBDVl9ERUZfTUVBTl9TRFYoIGZsYXZvciwgc3JjdHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DMVIiLCBJQ1ZfTUVBTl9TRFZfUExVR0lOLCAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSlcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DMlIsICAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DMlIiLCBJQ1ZfTUVBTl9TRFZfUExVR0lOLCAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSlcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DM1IsICAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DM1IiLCBJQ1ZfTUVBTl9TRFZfUExVR0lOLCAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSlcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DNFIsICAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DNFIiLCBJQ1ZfTUVBTl9TRFZfUExVR0lOLCAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1lYW5fU3RkRGV2XyMjZmxhdm9yIyNfQzFNUiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyJpcHBpTWVhbl9TdGREZXZfIiAjZmxhdm9yICJfQzFNUiIsIElDVl9NRUFOX1NEVl9QTFVHSU4sICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tTdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DMk1SLCAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DMk1SIiwgSUNWX01FQU5fU0RWX1BMVUdJTiwgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza1N0ZXAsICAgICAgICBcCisgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG1lYW4sIGRvdWJsZSogc2R2ICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1lYW5fU3RkRGV2XyMjZmxhdm9yIyNfQzNNUiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyJpcHBpTWVhbl9TdGREZXZfIiAjZmxhdm9yICJfQzNNUiIsIElDVl9NRUFOX1NEVl9QTFVHSU4sICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tTdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DNE1SLCAgICAgICAgICAgICAgICAgICAgICAgXAorImlwcGlNZWFuX1N0ZERldl8iICNmbGF2b3IgIl9DNE1SIiwgSUNWX01FQU5fU0RWX1BMVUdJTiwgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza1N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDdlNpemUgc2l6ZSwgZG91YmxlKiBtZWFuLCBkb3VibGUqIHNkdiApKQorCitJUENWX0RFRl9NRUFOX1NEViggOHUsIHVjaGFyICkKK0lQQ1ZfREVGX01FQU5fU0RWKCAxNnUsIHVzaG9ydCApCitJUENWX0RFRl9NRUFOX1NEViggMTZzLCBzaG9ydCApCitJUENWX0RFRl9NRUFOX1NEViggMzJzLCBpbnQgKQorSVBDVl9ERUZfTUVBTl9TRFYoIDMyZiwgZmxvYXQgKQorSVBDVl9ERUZfTUVBTl9TRFYoIDY0ZiwgZG91YmxlICkKKworI3VuZGVmIElQQ1ZfREVGX01FQU5fU0RWCisjdW5kZWYgSVBDVl9NRUFOX1NEVl9QTFVHSU4KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIE1pbk1heEluZHggLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJUENWX0RFRl9NSU5fTUFYX0xPQyggZmxhdm9yLCBzcmN0eXBlLCBleHRydHlwZSwgcGx1Z2luICkgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1pbk1heEluZHhfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgIFwKKyJpcHBpTWluTWF4SW5keF8iICNmbGF2b3IgIl9DMVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBDdlNpemUgc2l6ZSwgZXh0cnR5cGUqIG1pblZhbCwgZXh0cnR5cGUqIG1heFZhbCwgICAgICAgICAgICAgIFwKKyAgQ3ZQb2ludCogbWluTG9jLCBDdlBvaW50KiBtYXhMb2MgKSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk1pbk1heEluZHhfIyNmbGF2b3IjI19DMU1SLCAgICAgICAgICAgIFwKKyJpcHBpTWluTWF4SW5keF8iICNmbGF2b3IgIl9DMU1SIiwgcGx1Z2luLCAgICAgICAgICAgICAgICAgICAgICBcCisoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tTdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHNpemUsIGV4dHJ0eXBlKiBtaW5WYWwsIGV4dHJ0eXBlKiBtYXhWYWwsICAgICAgICAgICAgICBcCisgIEN2UG9pbnQqIG1pbkxvYywgQ3ZQb2ludCogbWF4TG9jICkpCisKK0lQQ1ZfREVGX01JTl9NQVhfTE9DKCA4dSwgdWNoYXIsIGZsb2F0LCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpICkKK0lQQ1ZfREVGX01JTl9NQVhfTE9DKCAxNnUsIHVzaG9ydCwgZmxvYXQsIDAgKQorSVBDVl9ERUZfTUlOX01BWF9MT0MoIDE2cywgc2hvcnQsIGZsb2F0LCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQQ1YpICkKK0lQQ1ZfREVGX01JTl9NQVhfTE9DKCAzMnMsIGludCwgZG91YmxlLCAwICkKKyNpZiAhZGVmaW5lZCBXSU42NCAmJiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9faTM4Nl9fKQorSVBDVl9ERUZfTUlOX01BWF9MT0MoIDMyZiwgaW50LCBmbG9hdCwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSApCisjZWxzZQorSVBDVl9ERUZfTUlOX01BWF9MT0MoIDMyZiwgaW50LCBmbG9hdCwgMCApCisjZW5kaWYKK0lQQ1ZfREVGX01JTl9NQVhfTE9DKCA2NGYsIGludDY0LCBkb3VibGUsIDAgKQorCisjdW5kZWYgSVBDVl9ERUZfTUlOX01BWF9MT0MKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFN1bSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJUENWX0RFRl9TVU1fTk9ISU5UKCBmbGF2b3IsIHNyY3R5cGUsIHBsdWdpbiApICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiaXBwaVN1bV8iICNmbGF2b3IgIl9DMVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBzdW0gKSkgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DMlIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpU3VtXyIgI2ZsYXZvciAiX0MyUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBzdW0gKSkgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DM1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpU3VtXyIgI2ZsYXZvciAiX0MzUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBzdW0gKSkgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DNFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpU3VtXyIgI2ZsYXZvciAiX0M0UiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCBDdlNpemUgc2l6ZSwgZG91YmxlKiBzdW0gKSkKKworI2RlZmluZSBJUENWX0RFRl9TVU1fSElOVCggZmxhdm9yLCBzcmN0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiaXBwaVN1bV8iICNmbGF2b3IgIl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogc3VtLCBDdkhpbnRBbGdvcml0aG0gKSkgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2U3VtXyMjZmxhdm9yIyNfQzJSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaVN1bV8iICNmbGF2b3IgIl9DMlIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIHN1bSwgQ3ZIaW50QWxnb3JpdGhtICkpICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdlN1bV8jI2ZsYXZvciMjX0MzUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgImlwcGlTdW1fIiAjZmxhdm9yICJfQzNSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBzdW0sIEN2SGludEFsZ29yaXRobSApKSAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTdW1fIyNmbGF2b3IjI19DNFIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpU3VtXyIgI2ZsYXZvciAiX0M0UiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogc3VtLCBDdkhpbnRBbGdvcml0aG0gKSkKKworSVBDVl9ERUZfU1VNX05PSElOVCggOHUsIHVjaGFyLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSkgKQorSVBDVl9ERUZfU1VNX05PSElOVCggMTZzLCBzaG9ydCwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpICkKK0lQQ1ZfREVGX1NVTV9OT0hJTlQoIDE2dSwgdXNob3J0LCAwICkKK0lQQ1ZfREVGX1NVTV9OT0hJTlQoIDMycywgaW50LCAwICkKK0lQQ1ZfREVGX1NVTV9ISU5UKCAzMmYsIGZsb2F0ICkKK0lQQ1ZfREVGX1NVTV9OT0hJTlQoIDY0ZiwgZG91YmxlLCAwICkKKworI3VuZGVmIElQQ1ZfREVGX1NVTV9OT0hJTlQKKyN1bmRlZiBJUENWX0RFRl9TVU1fSElOVAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ291bnROb25aZXJvIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElQQ1ZfREVGX05PTl9aRVJPKCBmbGF2b3IsIHNyY3R5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q291bnROb25aZXJvXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICBcCisgICAgImlwcGlDb3VudE5vblplcm9fIiAjZmxhdm9yICJfQzFSIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX09QVENWKSovLCAgIFwKKyAgICAoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsIEN2U2l6ZSBzaXplLCBpbnQqIG5vbnplcm8gKSkKKworSVBDVl9ERUZfTk9OX1pFUk8oIDh1LCB1Y2hhciApCitJUENWX0RFRl9OT05fWkVSTyggMTZzLCB1c2hvcnQgKQorSVBDVl9ERUZfTk9OX1pFUk8oIDMycywgaW50ICkKK0lQQ1ZfREVGX05PTl9aRVJPKCAzMmYsIGludCApCitJUENWX0RFRl9OT05fWkVSTyggNjRmLCBpbnQ2NCApCisKKyN1bmRlZiBJUENWX0RFRl9OT05fWkVSTworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTm9ybXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSVBDVl9ERUZfTk9STV9OT0hJTlRfQzEoIGZsYXZvciwgc3JjdHlwZSwgcGx1Z2luICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybV9JbmZfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgImlwcGlOb3JtX0luZl8iICNmbGF2b3IgIl9DMVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSApKSAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybV9MMV8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1fTDFfIiAjZmxhdm9yICJfQzFSIiwgcGx1Z2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSApKSAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybV9MMl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1fTDJfIiAjZmxhdm9yICJfQzFSIiwgcGx1Z2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSApKSAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybURpZmZfSW5mXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1EaWZmX0luZl8iICNmbGF2b3IgIl9DMVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nMSwgaW50IGltZ3N0ZXAxLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUqIGltZzIsIGludCBpbWdzdGVwMiwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtICkpICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtRGlmZl9MMV8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybURpZmZfTDFfIiAjZmxhdm9yICJfQzFSIiwgcGx1Z2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcxLCBpbnQgaW1nc3RlcDEsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSogaW1nMiwgaW50IGltZ3N0ZXAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG5vcm0gKSkgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk5vcm1EaWZmX0wyXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgImlwcGlOb3JtRGlmZl9MMl8iICNmbGF2b3IgIl9DMVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHNyY3R5cGUqIGltZzEsIGludCBpbWdzdGVwMSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlKiBpbWcyLCBpbnQgaW1nc3RlcDIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSApKQorCisjZGVmaW5lIElQQ1ZfREVGX05PUk1fSElOVF9DMSggZmxhdm9yLCBzcmN0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk5vcm1fSW5mXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpTm9ybV9JbmZfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSApKSAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtX0wxXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybV9MMV8iICNmbGF2b3IgIl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG5vcm0sIEN2SGludEFsZ29yaXRobSApKSBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybV9MMl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1fTDJfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtLCBDdkhpbnRBbGdvcml0aG0gKSkgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk5vcm1EaWZmX0luZl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgImlwcGlOb3JtRGlmZl9JbmZfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcxLCBpbnQgaW1nc3RlcDEsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSogaW1nMiwgaW50IGltZ3N0ZXAyLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG5vcm0gKSkgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybURpZmZfTDFfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1EaWZmX0wxXyIgI2ZsYXZvciAiX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHNyY3R5cGUqIGltZzEsIGludCBpbWdzdGVwMSwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlKiBpbWcyLCBpbnQgaW1nc3RlcDIsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbm9ybSwgQ3ZIaW50QWxnb3JpdGhtICkpIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtRGlmZl9MMl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybURpZmZfTDJfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nMSwgaW50IGltZ3N0ZXAxLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUqIGltZzIsIGludCBpbWdzdGVwMiwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtLCBDdkhpbnRBbGdvcml0aG0gKSkKKworI2RlZmluZSBJUENWX0RFRl9OT1JNX01BU0tfQzEoIGZsYXZvciwgc3JjdHlwZSwgcGx1Z2luICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtX0luZl8jI2ZsYXZvciMjX0MxTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybV9JbmZfIiAjZmxhdm9yICJfQzFNUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcsIGludCBpbWdzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG5vcm0gKSkgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdk5vcm1fTDFfIyNmbGF2b3IjI19DMU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpTm9ybV9MMV8iICNmbGF2b3IgIl9DMU1SIiwgcGx1Z2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IHNyY3R5cGUqIGltZywgaW50IGltZ3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG5vcm0gKSkgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Tm9ybV9MMl8jI2ZsYXZvciMjX0MxTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAiaXBwaU5vcm1fTDJfIiAjZmxhdm9yICJfQzFNUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3Qgc3JjdHlwZSogaW1nLCBpbnQgaW1nc3RlcCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtICkpICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtRGlmZl9JbmZfIyNmbGF2b3IjI19DMU1SLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybURpZmZfSW5mXyIgI2ZsYXZvciAiX0MxTVIiLCBwbHVnaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcxLCBpbnQgaW1nc3RlcDEsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSogaW1nMiwgaW50IGltZ3N0ZXAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtICkpICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtRGlmZl9MMV8jI2ZsYXZvciMjX0MxTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybURpZmZfTDFfIiAjZmxhdm9yICJfQzFNUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcxLCBpbnQgaW1nc3RlcDEsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSogaW1nMiwgaW50IGltZ3N0ZXAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtICkpICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZOb3JtRGlmZl9MMl8jI2ZsYXZvciMjX0MxTVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICJpcHBpTm9ybURpZmZfTDJfIiAjZmxhdm9yICJfQzFNUiIsIHBsdWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBzcmN0eXBlKiBpbWcxLCBpbnQgaW1nc3RlcDEsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSogaW1nMiwgaW50IGltZ3N0ZXAyLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBub3JtICkpCisKK0lQQ1ZfREVGX05PUk1fTk9ISU5UX0MxKCA4dSwgdWNoYXIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSApCitJUENWX0RFRl9OT1JNX01BU0tfQzEoIDh1LCB1Y2hhciwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSApCisKK0lQQ1ZfREVGX05PUk1fTk9ISU5UX0MxKCAxNnUsIHVzaG9ydCwgMCApCitJUENWX0RFRl9OT1JNX01BU0tfQzEoIDE2dSwgdXNob3J0LCAwICkKKworSVBDVl9ERUZfTk9STV9OT0hJTlRfQzEoIDE2cywgc2hvcnQsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSApCitJUENWX0RFRl9OT1JNX01BU0tfQzEoIDE2cywgc2hvcnQsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDVikgKQorCitJUENWX0RFRl9OT1JNX05PSElOVF9DMSggMzJzLCBpbnQsIDAgKQorSVBDVl9ERUZfTk9STV9NQVNLX0MxKCAzMnMsIGludCwgMCApCisKK0lQQ1ZfREVGX05PUk1fSElOVF9DMSggMzJmLCBmbG9hdCApCitJUENWX0RFRl9OT1JNX01BU0tfQzEoIDMyZiwgZmxvYXQsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBDVikgKQorCitJUENWX0RFRl9OT1JNX05PSElOVF9DMSggNjRmLCBkb3VibGUsIDAgKQorSVBDVl9ERUZfTk9STV9NQVNLX0MxKCA2NGYsIGRvdWJsZSwgMCApCisKKyN1bmRlZiBJUENWX0RFRl9OT1JNX0hPTklOVF9DMQorI3VuZGVmIElQQ1ZfREVGX05PUk1fSElOVF9DMQorI3VuZGVmIElQQ1ZfREVGX05PUk1fTUFTS19DMQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEFic0RpZmYgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElQQ1ZfQUJTX0RJRkYoIGZsYXZvciwgYXJydHlwZSApICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2QWJzRGlmZl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICBcCisiaXBwaUFic0RpZmZfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSxcCisoIGNvbnN0IGFycnR5cGUqIHNyYzEsIGludCBzcmNzdGVwMSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzcmNzdGVwMiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpCisKK0lQQ1ZfQUJTX0RJRkYoIDh1LCB1Y2hhciApCitJUENWX0FCU19ESUZGKCAxNnUsIHVzaG9ydCApCitJUENWX0FCU19ESUZGKCAxNnMsIHNob3J0ICkKK0lQQ1ZfQUJTX0RJRkYoIDMycywgaW50ICkKK0lQQ1ZfQUJTX0RJRkYoIDMyZiwgZmxvYXQgKQorSVBDVl9BQlNfRElGRiggNjRmLCBkb3VibGUgKQorCisjdW5kZWYgSVBDVl9BQlNfRElGRgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29tcGFyaXNvbnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSVBDVl9DTVAoIGFycnR5cGUsIGZsYXZvciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDb21wYXJlXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpQ29tcGFyZV8iICNmbGF2b3IgIl9DMVIiLCBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQSSksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3Jjc3RlcDIsIFwKKyAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBjbXBfb3AgKSkgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDb21wYXJlQ18jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpQ29tcGFyZUNfIiAjZmxhdm9yICJfQzFSIiwgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUEkpLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHNyY3N0ZXAxLCBhcnJ0eXBlIHNjYWxhciwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGludCBjbXBfb3AgKSkgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZUaHJlc2hvbGRfR1RfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpVGhyZXNob2xkX0dUXyIgI2ZsYXZvciAiX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogcFNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIHBEc3QsIGludCBkc3RzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGFycnR5cGUgdGhyZXNob2xkICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZUaHJlc2hvbGRfTFRfIyNmbGF2b3IjI19DMVIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICJpcHBpVGhyZXNob2xkX0xUXyIgI2ZsYXZvciAiX0MxUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgIFwKKyAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogcFNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIHBEc3QsIGludCBkc3RzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGFycnR5cGUgdGhyZXNob2xkICkpCitJUENWX0NNUCggdWNoYXIsIDh1ICkKK0lQQ1ZfQ01QKCBzaG9ydCwgMTZzICkKK0lQQ1ZfQ01QKCBmbG9hdCwgMzJmICkKKyN1bmRlZiBJUENWX0NNUAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5IFBpeGVsIDwtPiBQbGFuZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJUENWX1BJWF9QTEFORSggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DMlAyUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9DMlAyUiIsIDAvKkNWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSovLCAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYXJydHlwZSoqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DM1AzUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9DM1AzUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYXJydHlwZSoqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DNFA0UiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9DNFA0UiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYXJydHlwZSoqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DbkMxQ1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9DbkMxQ1IiLCAwLypDVl9QTFVHSU5TMShDVl9QTFVHSU5fT1BUQ1YpKi8sICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DMUNuQ1IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9DbkMxQ1IiLCAwLypDVl9QTFVHSU5TMShDVl9QTFVHSU5fT1BUQ1YpKi8sICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19QMkMyUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9QMkMyUiIsIDAvKkNWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSovLCAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSoqIHNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19QM0MzUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9QM0MzUiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSoqIHNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19QNEM0UiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICJpcHBpQ29weV8iICNmbGF2b3IgIl9QNEM0UiIsIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBJKSwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSoqIHNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkpCisKK0lQQ1ZfUElYX1BMQU5FKCA4dSwgdWNoYXIgKQorSVBDVl9QSVhfUExBTkUoIDE2cywgdXNob3J0ICkKK0lQQ1ZfUElYX1BMQU5FKCAzMmYsIGludCApCitJUENWX1BJWF9QTEFORSggNjRmLCBpbnQ2NCApCisKKyN1bmRlZiBJUENWX1BJWF9QTEFORQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGggcm91dGluZXMgYW5kIFJOR3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZJbnZTcXJ0XzMyZiwgImlwcHNJbnZTcXJ0XzMyZl9BMjEiLAorICAgICAgICAgICBDVl9QTFVHSU5TMShDVl9QTFVHSU5fSVBQVk0pLAorICAgICAgICAgICAoIGNvbnN0IGZsb2F0KiBzcmMsIGZsb2F0KiBkc3QsIGludCBsZW4gKSkKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZTcXJ0XzMyZiwgImlwcHNTcXJ0XzMyZl9BMjEsIGlwcHNTcXJ0XzMyZiIsCisgICAgICAgICAgIENWX1BMVUdJTlMyKENWX1BMVUdJTl9JUFBWTSxDVl9QTFVHSU5fSVBQUyksCisgICAgICAgICAgICggY29uc3QgZmxvYXQqIHNyYywgZmxvYXQqIGRzdCwgaW50IGxlbiApKQorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkludlNxcnRfNjRmLCAiaXBwc0ludlNxcnRfNjRmX0E1MCIsCisgICAgICAgICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBWTSksCisgICAgICAgICAgICggY29uc3QgZG91YmxlKiBzcmMsIGRvdWJsZSogZHN0LCBpbnQgbGVuICkpCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2U3FydF82NGYsICJpcHBzU3FydF82NGZfQTUwLCBpcHBzU3FydF82NGYiLAorICAgICAgICAgICBDVl9QTFVHSU5TMihDVl9QTFVHSU5fSVBQVk0sQ1ZfUExVR0lOX0lQUFMpLAorICAgICAgICAgICAoIGNvbnN0IGRvdWJsZSogc3JjLCBkb3VibGUqIGRzdCwgaW50IGxlbiApKQorCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2TG9nXzMyZiwgImlwcHNMbl8zMmZfQTIxLCBpcHBzTG5fMzJmIiwKKyAgICAgICAgICAgQ1ZfUExVR0lOUzIoQ1ZfUExVR0lOX0lQUFZNLENWX1BMVUdJTl9JUFBTKSwKKyAgICAgICAgICAgKCBjb25zdCBmbG9hdCAqeCwgZmxvYXQgKnksIGludCBuICkgKQorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkxvZ182NGYsICJpcHBzTG5fNjRmX0E1MCwgaXBwc0xuXzY0ZiIsCisgICAgICAgICAgIENWX1BMVUdJTlMyKENWX1BMVUdJTl9JUFBWTSxDVl9QTFVHSU5fSVBQUyksCisgICAgICAgICAgICggY29uc3QgZG91YmxlICp4LCBkb3VibGUgKnksIGludCBuICkgKQorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkV4cF8zMmYsICJpcHBzRXhwXzMyZl9BMjEsIGlwcHNFeHBfMzJmIiwKKyAgICAgICAgICAgQ1ZfUExVR0lOUzIoQ1ZfUExVR0lOX0lQUFZNLENWX1BMVUdJTl9JUFBTKSwKKyAgICAgICAgICAgKCBjb25zdCBmbG9hdCAqeCwgZmxvYXQgKnksIGludCBuICkgKQorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkV4cF82NGYsICJpcHBzRXhwXzY0Zl9BNTAsIGlwcHNFeHBfNjRmIiwKKyAgICAgICAgICAgQ1ZfUExVR0lOUzIoQ1ZfUExVR0lOX0lQUFZNLENWX1BMVUdJTl9JUFBTKSwKKyAgICAgICAgICAgKCBjb25zdCBkb3VibGUgKngsIGRvdWJsZSAqeSwgaW50IG4gKSApCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2RmFzdEFyY3Rhbl8zMmYsICJpcHBpYkZhc3RBcmN0YW5fMzJmIiwKKyAgICAgICAgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUENWKSwKKyAgICAgICAgICAgKCBjb25zdCBmbG9hdCogeSwgY29uc3QgZmxvYXQqIHgsIGZsb2F0KiBhbmdsZSwgaW50IGxlbiApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yIGhhbmRsaW5nIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDaGVja0FycmF5XzMyZl9DMVIsCisgICAgICAgICAgICJpcHBpQ2hlY2tBcnJheV8zMmZfQzFSIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX09QVENWKSovLAorICAgICAgICAgICAoIGNvbnN0IGZsb2F0KiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZmxhZ3MsCisgICAgICAgICAgICAgZG91YmxlIG1pbl92YWwsIGRvdWJsZSBtYXhfdmFsICkpCisKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDaGVja0FycmF5XzY0Zl9DMVIsCisgICAgICAgICAgICJpcHBpQ2hlY2tBcnJheV82NGZfQzFSIiwgMC8qQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX09QVENWKSovLAorICAgICAgICAgICAoIGNvbnN0IGRvdWJsZSogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgIGRvdWJsZSBtaW5fdmFsLCBkb3VibGUgbWF4X3ZhbCApKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICBBZmZpbmUgdHJhbnNmb3JtYXRpb25zIG9mIG1hdHJpeC9pbWFnZSBlbGVtZW50cyAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSVBDVl9UUkFOU0ZPUk0oIHN1ZmZpeCwgaXBwX3N1ZmZpeCwgY24gKSAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2Q29sb3JUd2lzdCMjc3VmZml4IyNfQyMjY24jI1IsICAgICAgICAgXAorICAgICAgICAiaXBwaUNvbG9yVHdpc3QiICNpcHBfc3VmZml4ICJfQyIgI2NuICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIlIsaXBwaUNvbG9yVHdpc3QiICNpcHBfc3VmZml4ICJfQyIgI2NuICJSIiwgICAgICAgICAgICBcCisgICAgICAgIENWX1BMVUdJTlMyKENWX1BMVUdJTl9JUFBJLCBDVl9QTFVHSU5fSVBQQ0MpLCAgICAgICAgICAgXAorICAgICAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIFwKKyAgICAgICAgICBDdlNpemUgcm9pc2l6ZSwgY29uc3QgZmxvYXQqIHR3aXN0X21hdHJpeCApKQorCitJUENWX1RSQU5TRk9STSggXzh1LCAzMmZfOHUsIDMgKQorSVBDVl9UUkFOU0ZPUk0oIF8xNnUsIDMyZl8xNnUsIDMgKQorSVBDVl9UUkFOU0ZPUk0oIF8xNnMsIDMyZl8xNnMsIDMgKQorSVBDVl9UUkFOU0ZPUk0oIF8zMmYsIF8zMmYsIDMgKQorSVBDVl9UUkFOU0ZPUk0oIF8zMmYsIF8zMmYsIDQgKQorCisjdW5kZWYgSVBDVl9UUkFOU0ZPUk0KKworI2RlZmluZSBJUENWX1RSQU5TRk9STV9OMSggc3VmZml4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfRVgoIEN2U3RhdHVzLCBpY3ZDb2xvclRvR3JheSMjc3VmZml4LCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICJpcHBpQ29sb3JUb0dyYXkiICNzdWZmaXggIixpcHBpQ29sb3JUb0dyYXkiICNzdWZmaXgsICAgXAorICAgICAgICBDVl9QTFVHSU5TMihDVl9QTFVHSU5fSVBQSSxDVl9QTFVHSU5fSVBQQ0MpLCAgICAgICAgICAgIFwKKyAgICAgICAgKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLCB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBcCisgICAgICAgICAgQ3ZTaXplIHJvaXNpemUsIGNvbnN0IGZsb2F0KiBjb2VmZnMgKSkKKworSVBDVl9UUkFOU0ZPUk1fTjEoIF84dV9DM0MxUiApCitJUENWX1RSQU5TRk9STV9OMSggXzE2dV9DM0MxUiApCitJUENWX1RSQU5TRk9STV9OMSggXzE2c19DM0MxUiApCitJUENWX1RSQU5TRk9STV9OMSggXzMyZl9DM0MxUiApCitJUENWX1RSQU5TRk9STV9OMSggXzh1X0FDNEMxUiApCitJUENWX1RSQU5TRk9STV9OMSggXzE2dV9BQzRDMVIgKQorSVBDVl9UUkFOU0ZPUk1fTjEoIF8xNnNfQUM0QzFSICkKK0lQQ1ZfVFJBTlNGT1JNX04xKCBfMzJmX0FDNEMxUiApCisKKyN1bmRlZiBJUENWX1RSQU5TRk9STV9OMQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgTWF0cml4IHJvdXRpbmVzIGZyb20gQkxBUy9MQVBBQ0sgY29tcGF0aWJsZSBsaWJyYXJpZXMgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfQ19FWCggdm9pZCwgaWN2QkxBU19HRU1NXzMyZiwgInNnZW1tLCBta2xfc2dlbW0iLCBDVl9QTFVHSU5TMihDVl9QTFVHSU5fTUtMLENWX1BMVUdJTl9NS0wpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKnRyYW5zYSwgY29uc3QgY2hhciAqdHJhbnNiLCBpbnQgKm4sIGludCAqbSwgaW50ICprLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmFscGhhLCBjb25zdCB2b2lkICphLCBpbnQgKmxkYSwgY29uc3Qgdm9pZCAqYiwgaW50ICpsZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYmV0YSwgdm9pZCAqYywgaW50ICpsZGMgKSkKKworSVBDVkFQSV9DX0VYKCB2b2lkLCBpY3ZCTEFTX0dFTU1fNjRmLCAiZGdlbW0sIG1rbF9kZ2VtbSIsIENWX1BMVUdJTlMyKENWX1BMVUdJTl9NS0wsQ1ZfUExVR0lOX01LTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdHJhbnNhLCBjb25zdCBjaGFyICp0cmFuc2IsIGludCAqbiwgaW50ICptLCBpbnQgKmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYWxwaGEsIGNvbnN0IHZvaWQgKmEsIGludCAqbGRhLCBjb25zdCB2b2lkICpiLCBpbnQgKmxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpiZXRhLCB2b2lkICpjLCBpbnQgKmxkYyApKQorCitJUENWQVBJX0NfRVgoIHZvaWQsIGljdkJMQVNfR0VNTV8zMmZjLCAiY2dlbW0sIG1rbF9jZ2VtbSIsIENWX1BMVUdJTlMyKENWX1BMVUdJTl9NS0wsQ1ZfUExVR0lOX01LTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdHJhbnNhLCBjb25zdCBjaGFyICp0cmFuc2IsIGludCAqbiwgaW50ICptLCBpbnQgKmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYWxwaGEsIGNvbnN0IHZvaWQgKmEsIGludCAqbGRhLCBjb25zdCB2b2lkICpiLCBpbnQgKmxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpiZXRhLCB2b2lkICpjLCBpbnQgKmxkYyApKQorCitJUENWQVBJX0NfRVgoIHZvaWQsIGljdkJMQVNfR0VNTV82NGZjLCAiemdlbW0sIG1rbF96Z2VtbSIsIENWX1BMVUdJTlMyKENWX1BMVUdJTl9NS0wsQ1ZfUExVR0lOX01LTCksCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciAqdHJhbnNhLCBjb25zdCBjaGFyICp0cmFuc2IsIGludCAqbiwgaW50ICptLCBpbnQgKmssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYWxwaGEsIGNvbnN0IHZvaWQgKmEsIGludCAqbGRhLCBjb25zdCB2b2lkICpiLCBpbnQgKmxkYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpiZXRhLCB2b2lkICpjLCBpbnQgKmxkYyApKQorCisKKyNkZWZpbmUgSVBDVl9ERlQoIGluaXRfZmxhdm9yLCBmd2RfZmxhdm9yLCBpbnZfZmxhdm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2REZUSW5pdEFsbG9jXyMjaW5pdF9mbGF2b3IsICJpcHBzREZUSW5pdEFsbG9jXyIgI2luaXRfZmxhdm9yLCAgXAorICAgICAgICAgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUFMpLCAoIHZvaWQqKiwgaW50LCBpbnQsIEN2SGludEFsZ29yaXRobSApKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2REZURnJlZV8jI2luaXRfZmxhdm9yLCAiaXBwc0RGVEZyZWVfIiAjaW5pdF9mbGF2b3IsICAgICAgICAgICAgXAorICAgICAgICAgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUFMpLCAoIHZvaWQqICkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2REZUR2V0QnVmU2l6ZV8jI2luaXRfZmxhdm9yLCAiaXBwc0RGVEdldEJ1ZlNpemVfIiAjaW5pdF9mbGF2b3IsXAorICAgICAgICAgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUFMpLCAoIGNvbnN0IHZvaWQqIHNwZWMsIGludCogYnVmX3NpemUgKSkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0VYKCBDdlN0YXR1cywgaWN2REZURndkXyMjZndkX2ZsYXZvciwgImlwcHNERlRGd2RfIiAjZndkX2ZsYXZvciwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQ1ZfUExVR0lOUzEoQ1ZfUExVR0lOX0lQUFMpLCAoIGNvbnN0IHZvaWQqIHNyYywgdm9pZCogZHN0LCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWMsIHZvaWQqIGJ1ZmZlciApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSVBDVkFQSV9FWCggQ3ZTdGF0dXMsIGljdkRGVEludl8jI2ludl9mbGF2b3IsICJpcHBzREZUSW52XyIgI2ludl9mbGF2b3IsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX1BMVUdJTlMxKENWX1BMVUdJTl9JUFBTKSwgKCBjb25zdCB2b2lkKiBzcmMsIHZvaWQqIGRzdCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB2b2lkKiBzcGVjLCB2b2lkKiBidWZmZXIgKSkKKworSVBDVl9ERlQoIENfMzJmYywgQ1RvQ18zMmZjLCBDVG9DXzMyZmMgKQorSVBDVl9ERlQoIFJfMzJmLCBSVG9QYWNrXzMyZiwgUGFja1RvUl8zMmYgKQorSVBDVl9ERlQoIENfNjRmYywgQ1RvQ182NGZjLCBDVG9DXzY0ZmMgKQorSVBDVl9ERlQoIFJfNjRmLCBSVG9QYWNrXzY0ZiwgUGFja1RvUl82NGYgKQorI3VuZGVmIElQQ1ZfREZUCisKKyNlbmRpZiAvKl9DWENPUkVfSVBQX0hfKi8KKwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeGFsbG9jLmNwcCBiL2N4Y29yZS9zcmMvY3hhbGxvYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY2MGE2YwotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hhbGxvYy5jcHAKQEAgLTAsMCArMSwxMzUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisvLyBkZWZhdWx0IDxtYWxsb2M+CitzdGF0aWMgdm9pZCoKK2ljdkRlZmF1bHRBbGxvYyggc2l6ZV90IHNpemUsIHZvaWQqICkKK3sKKyAgICBjaGFyICpwdHIsICpwdHIwID0gKGNoYXIqKW1hbGxvYygKKyAgICAgICAgKHNpemVfdCkoc2l6ZSArIENWX01BTExPQ19BTElHTiooKHNpemUgPj0gNDA5NikgKyAxKSArIHNpemVvZihjaGFyKikpKTsKKworICAgIGlmKCAhcHRyMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gYWxpZ24gdGhlIHBvaW50ZXIKKyAgICBwdHIgPSAoY2hhciopY3ZBbGlnblB0cihwdHIwICsgc2l6ZW9mKGNoYXIqKSArIDEsIENWX01BTExPQ19BTElHTik7CisgICAgKihjaGFyKiopKHB0ciAtIHNpemVvZihjaGFyKikpID0gcHRyMDsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworLy8gZGVmYXVsdCA8ZnJlZT4KK3N0YXRpYyBpbnQKK2ljdkRlZmF1bHRGcmVlKCB2b2lkKiBwdHIsIHZvaWQqICkKK3sKKyAgICAvLyBQb2ludGVyIG11c3QgYmUgYWxpZ25lZCBieSBDVl9NQUxMT0NfQUxJR04KKyAgICBpZiggKChzaXplX3QpcHRyICYgKENWX01BTExPQ19BTElHTi0xKSkgIT0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURBUkdfRVJSOworICAgIGZyZWUoICooKGNoYXIqKilwdHIgLSAxKSApOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8vIHBvaW50ZXJzIHRvIGFsbG9jYXRpb24gZnVuY3Rpb25zLCBpbml0aWFsbHkgc2V0IHRvIGRlZmF1bHQKK3N0YXRpYyBDdkFsbG9jRnVuYyBwX2N2QWxsb2MgPSBpY3ZEZWZhdWx0QWxsb2M7CitzdGF0aWMgQ3ZGcmVlRnVuYyBwX2N2RnJlZSA9IGljdkRlZmF1bHRGcmVlOworc3RhdGljIHZvaWQqIHBfY3ZBbGxvY1VzZXJEYXRhID0gMDsKKworQ1ZfSU1QTCB2b2lkIGN2U2V0TWVtb3J5TWFuYWdlciggQ3ZBbGxvY0Z1bmMgYWxsb2NfZnVuYywgQ3ZGcmVlRnVuYyBmcmVlX2Z1bmMsIHZvaWQqIHVzZXJkYXRhICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0TWVtb3J5TWFuYWdlciIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpZiggKGFsbG9jX2Z1bmMgPT0gMCkgXiAoZnJlZV9mdW5jID09IDApICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJFaXRoZXIgYm90aCBwb2ludGVycyBzaG91bGQgYmUgTlVMTCBvciBub25lIG9mIHRoZW0iKTsKKworICAgIHBfY3ZBbGxvYyA9IGFsbG9jX2Z1bmMgPyBhbGxvY19mdW5jIDogaWN2RGVmYXVsdEFsbG9jOworICAgIHBfY3ZGcmVlID0gZnJlZV9mdW5jID8gZnJlZV9mdW5jIDogaWN2RGVmYXVsdEZyZWU7CisgICAgcF9jdkFsbG9jVXNlckRhdGEgPSB1c2VyZGF0YTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCAgdm9pZCogIGN2QWxsb2MoIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkKiBwdHIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZBbGxvYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAoc2l6ZV90KXNpemUgPiBDVl9NQVhfQUxMT0NfU0laRSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIG9yIHRvbyBsYXJnZSBhcmd1bWVudCBvZiBjdkFsbG9jIGZ1bmN0aW9uIiApOworCisgICAgcHRyID0gcF9jdkFsbG9jKCBzaXplLCBwX2N2QWxsb2NVc2VyRGF0YSApOworICAgIGlmKCAhcHRyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c05vTWVtLCAiT3V0IG9mIG1lbW9yeSIgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKK0NWX0lNUEwgIHZvaWQgIGN2RnJlZV8oIHZvaWQqIHB0ciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkZyZWVfIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoIHB0ciApCisgICAgeworICAgICAgICBDVlN0YXR1cyBzdGF0dXMgPSBwX2N2RnJlZSggcHRyLCBwX2N2QWxsb2NVc2VyRGF0YSApOworICAgICAgICBpZiggc3RhdHVzIDwgMCApCisgICAgICAgICAgICBDVl9FUlJPUiggc3RhdHVzLCAiRGVhbGxvY2F0aW9uIGVycm9yIiApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeGFyaXRobS5jcHAgYi9jeGNvcmUvc3JjL2N4YXJpdGhtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzE0MDkzCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeGFyaXRobS5jcHAKQEAgLTAsMCArMSwyMDUwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgQ3ZNYXQgYXJpdGhtZXRpYyBvcGVyYXRpb25zOiArLCAtIC4uLgorLy8KKy8vICovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICBBcml0aG1ldGljIG9wZXJhdGlvbnMgKCssIC0pIHdpdGhvdXQgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfREVGX0JJTl9BUklfT1BfQ0FTRSggX19vcF9fLCB3b3JrdHlwZSwgY2FzdF9tYWNybywgbGVuIClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8PSAobGVuKSAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc3JjMSlbaV0sIChzcmMyKVtpXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIHQxID0gX19vcF9fKChzcmMxKVtpKzFdLCAoc3JjMilbaSsxXSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVtpXSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2krMV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc3JjMSlbaSsyXSwoc3JjMilbaSsyXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX19vcF9fKChzcmMxKVtpKzNdLChzcmMyKVtpKzNdKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVtpKzJdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2krM10gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGkgPCAobGVuKTsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc3JjMSlbaV0sKHNyYzIpW2ldKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2ldID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIElDVl9ERUZfQklOX0FSSV9PUF8yRCggX19vcF9fLCBuYW1lLCB0eXBlLCB3b3JrdHlwZSwgY2FzdF9tYWNybyApICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIGNvbnN0IHR5cGUqIHNyYzEsIGludCBzdGVwMSwgY29uc3QgdHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICAgICAgICBcCisgICAgICB0eXBlKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHNyYzEsIHN0ZXAxLCBzcmMyLCBzdGVwMiwgZHN0LCBzdGVwLCBzaXplKSApICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEvPXNpemVvZihzcmMxWzBdKTsgc3RlcDIvPXNpemVvZihzcmMyWzBdKTsgc3RlcC89c2l6ZW9mKGRzdFswXSk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc2l6ZS53aWR0aCA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgZHN0ICs9IHN0ZXAgKSAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc3JjMSlbMF0sKHNyYzIpWzBdKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGRzdClbMF0gPSBjYXN0X21hY3JvKCB0MCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCBkc3QgKz0gc3RlcCApICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9ERUZfQklOX0FSSV9PUF9DQVNFKCBfX29wX18sIHdvcmt0eXBlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybywgc2l6ZS53aWR0aCApOyAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfQklOX0FSSV9PUF8yRF9TRlMoX19vcF9fLCBuYW1lLCB0eXBlLCB3b3JrdHlwZSwgY2FzdF9tYWNybykgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgbmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIGNvbnN0IHR5cGUqIHNyYzEsIGludCBzdGVwMSwgY29uc3QgdHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICAgICAgICBcCisgICAgICB0eXBlKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgaW50IC8qc2NhbGVmYWN0b3IqLyApLCAgICAgICAgICAgICAgXAorICAgICAgKHNyYzEsIHN0ZXAxLCBzcmMyLCBzdGVwMiwgZHN0LCBzdGVwLCBzaXplLCAwKSApICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEvPXNpemVvZihzcmMxWzBdKTsgc3RlcDIvPXNpemVvZihzcmMyWzBdKTsgc3RlcC89c2l6ZW9mKGRzdFswXSk7ICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc2l6ZS53aWR0aCA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgZHN0ICs9IHN0ZXAgKSAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc3JjMSlbMF0sKHNyYzIpWzBdKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGRzdClbMF0gPSBjYXN0X21hY3JvKCB0MCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCBkc3QgKz0gc3RlcCApICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9ERUZfQklOX0FSSV9PUF9DQVNFKCBfX29wX18sIHdvcmt0eXBlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybywgc2l6ZS53aWR0aCApOyAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfVU5fQVJJX09QX0NBU0UoIF9fb3BfXywgd29ya3R5cGUsIGNhc3RfbWFjcm8sICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIHNjYWxhciwgZHN0LCBsZW4gKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgKChsZW4pIC09IDEyKSA+PSAwOyAoZHN0KSArPSAxMiwgKHNyYykgKz0gMTIgKSAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc2NhbGFyKVswXSwgKHNyYylbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDEgPSBfX29wX18oKHNjYWxhcilbMV0sIChzcmMpWzFdKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVswXSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbMV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc2NhbGFyKVsyXSwgKHNyYylbMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfX29wX18oKHNjYWxhcilbM10sIChzcmMpWzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVsyXSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbM10gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc2NhbGFyKVs0XSwgKHNyYylbNF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfX29wX18oKHNjYWxhcilbNV0sIChzcmMpWzVdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVs0XSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbNV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc2NhbGFyKVs2XSwgKHNyYylbNl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfX29wX18oKHNjYWxhcilbN10sIChzcmMpWzddKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVs2XSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbN10gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc2NhbGFyKVs4XSwgKHNyYylbOF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfX29wX18oKHNjYWxhcilbOV0sIChzcmMpWzldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVs4XSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbOV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9fb3BfXygoc2NhbGFyKVsxMF0sIChzcmMpWzEwXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfX29wX18oKHNjYWxhcilbMTFdLCAoc3JjKVsxMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVsxMF0gPSBjYXN0X21hY3JvKCB0MCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbMTFdID0gY2FzdF9tYWNybyggdDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIChsZW4pICs9IDEyLCBpID0gMDsgaSA8IChsZW4pOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IF9fb3BfXygoc2NhbGFyKVtpXSwoc3JjKVtpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaV0gPSBjYXN0X21hY3JvKCB0MCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9VTl9BUklfT1BfMkQoIF9fb3BfXywgbmFtZSwgdHlwZSwgd29ya3R5cGUsIGNhc3RfbWFjcm8gKSAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggY29uc3QgdHlwZSogc3JjLCBpbnQgc3RlcDEsIHR5cGUqIGRzdCwgaW50IHN0ZXAsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEN2U2l6ZSBzaXplLCBjb25zdCB3b3JrdHlwZSogc2NhbGFyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmNbMF0pOyBzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIHNpemUud2lkdGggPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwMSwgZHN0ICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSBfX29wX18oKihzY2FsYXIpLCooc3JjKSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICooZHN0KSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAxLCBkc3QgKz0gc3RlcCApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCB0eXBlICp0c3JjID0gc3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZSAqdGRzdCA9IGRzdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCB3aWR0aCA9IHNpemUud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX0RFRl9VTl9BUklfT1BfQ0FTRSggX19vcF9fLCB3b3JrdHlwZSwgY2FzdF9tYWNybywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzcmMsIHNjYWxhciwgdGRzdCwgd2lkdGggKTsgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9CSU5fQVJJX0FMTCggX19vcF9fLCBuYW1lLCBjYXN0Xzh1ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRF9TRlMoIF9fb3BfXywgaWN2IyNuYW1lIyNfOHVfQzFSLCB1Y2hhciwgaW50LCBjYXN0Xzh1ICkgICAgICAgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRF9TRlMoIF9fb3BfXywgaWN2IyNuYW1lIyNfMTZ1X0MxUiwgdXNob3J0LCBpbnQsIENWX0NBU1RfMTZVICkgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRF9TRlMoIF9fb3BfXywgaWN2IyNuYW1lIyNfMTZzX0MxUiwgc2hvcnQsIGludCwgQ1ZfQ0FTVF8xNlMgKSAgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18zMnNfQzFSLCBpbnQsIGludCwgQ1ZfQ0FTVF8zMlMgKSAgICAgICAgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18zMmZfQzFSLCBmbG9hdCwgZmxvYXQsIENWX0NBU1RfMzJGICkgICAgIFwKK0lDVl9ERUZfQklOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI182NGZfQzFSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfQ0FTVF82NEYgKQorCisjZGVmaW5lIElDVl9ERUZfVU5fQVJJX0FMTCggX19vcF9fLCBuYW1lICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI184dV9DMVIsIHVjaGFyLCBpbnQsIENWX0NBU1RfOFUgKSAgICAgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18xNnVfQzFSLCB1c2hvcnQsIGludCwgQ1ZfQ0FTVF8xNlUgKSAgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18xNnNfQzFSLCBzaG9ydCwgaW50LCBDVl9DQVNUXzE2UyApICAgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18zMnNfQzFSLCBpbnQsIGludCwgQ1ZfQ0FTVF8zMlMgKSAgICAgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI18zMmZfQzFSLCBmbG9hdCwgZmxvYXQsIENWX0NBU1RfMzJGICkgICAgICBcCitJQ1ZfREVGX1VOX0FSSV9PUF8yRCggX19vcF9fLCBpY3YjI25hbWUjI182NGZfQzFSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfQ0FTVF82NEYgKQorCisjdW5kZWYgQ1ZfU1VCX1IKKyNkZWZpbmUgQ1ZfU1VCX1IoYSxiKSAoKGIpIC0gKGEpKQorCitJQ1ZfREVGX0JJTl9BUklfQUxMKCBDVl9BREQsIEFkZCwgQ1ZfRkFTVF9DQVNUXzhVICkKK0lDVl9ERUZfQklOX0FSSV9BTEwoIENWX1NVQl9SLCBTdWIsIENWX0ZBU1RfQ0FTVF84VSApCisKK0lDVl9ERUZfVU5fQVJJX0FMTCggQ1ZfQURELCBBZGRDICkKK0lDVl9ERUZfVU5fQVJJX0FMTCggQ1ZfU1VCLCBTdWJSQyApCisKKyNkZWZpbmUgSUNWX0RFRl9JTklUX0FSSVRITV9GVU5DX1RBQiggRlVOQ05BTUUsIEZMQUcgKSAgICAgICAgICBcCitzdGF0aWMgIHZvaWQgIGljdkluaXQjI0ZVTkNOQU1FIyNGTEFHIyNUYWJsZSggQ3ZGdW5jVGFibGUqIHRhYiApXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfIyNGTEFHOyAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84U10gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZ1XyMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U10gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2c18jI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8zMlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMnNfIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJmXyMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzY0Zl8jI0ZMQUc7ICAgICBcCit9CisKK0lDVl9ERUZfSU5JVF9BUklUSE1fRlVOQ19UQUIoIFN1YiwgQzFSICkKK0lDVl9ERUZfSU5JVF9BUklUSE1fRlVOQ19UQUIoIFN1YlJDLCBDMVIgKQorSUNWX0RFRl9JTklUX0FSSVRITV9GVU5DX1RBQiggQWRkLCBDMVIgKQorSUNWX0RFRl9JTklUX0FSSVRITV9GVU5DX1RBQiggQWRkQywgQzFSICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICBFeHRlcm5hbCBGdW5jdGlvbnMgZm9yIEFyaXRobWV0aWMgT3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIFMgVSBCICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCB2b2lkCitjdlN1YiggY29uc3Qgdm9pZCogc3JjYXJyMSwgY29uc3Qgdm9pZCogc3JjYXJyMiwKKyAgICAgICB2b2lkKiBkc3RhcnIsIGNvbnN0IHZvaWQqIG1hc2thcnIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBzdWJfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMTsKKyAgICB1Y2hhciogYnVmZmVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBDdkFyciogdG1wOworICAgIGludCB5LCBkeSwgdHlwZSwgZGVwdGgsIGNuLCBjb250X2ZsYWcgPSAwOworICAgIGludCBzcmMxX3N0ZXAsIHNyYzJfc3RlcCwgZHN0X3N0ZXAsIHRkc3Rfc3RlcCwgbWFza19zdGVwOworICAgIEN2TWF0IHNyY3N0dWIxLCBzcmNzdHViMiwgKnNyYzEsICpzcmMyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworICAgIEN2TWF0IGRzdGJ1ZiwgKnRkc3Q7CisgICAgQ3ZGdW5jMkRfM0EgZnVuYzsKKyAgICBDdkZ1bmMyRF8zQTFJIGZ1bmNfc2ZzOworICAgIEN2Q29weU1hc2tGdW5jIGNvcHltX2Z1bmM7CisgICAgQ3ZTaXplIHNpemUsIHRzaXplOworCisgICAgQ1ZfU1dBUCggc3JjYXJyMSwgc3JjYXJyMiwgdG1wICk7IC8vIHRvIGNvbXBseSB3aXRoIElQUAorICAgIHNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgc3JjMiA9IChDdk1hdCopc3JjYXJyMjsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzEpIHx8ICFDVl9JU19NQVQoc3JjMikgfHwgIUNWX0lTX01BVChkc3QpKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKHNyYzEpIHx8IENWX0lTX01BVE5EKHNyYzIpIHx8IENWX0lTX01BVE5EKGRzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2QXJyKiBhcnJzW10gPSB7IHNyYzEsIHNyYzIsIGRzdCB9OworICAgICAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgICAgICAgIGlmKCBtYXNrYXJyICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywKKyAgICAgICAgICAgICAgICAiVGhpcyBvcGVyYXRpb24gb24gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGRvZXMgbm90IHN1cHBvcnQgbWFzayIgKTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TkFycmF5SXRlcmF0b3IoIDMsIGFycnMsIDAsIHN0dWJzLCAmaXRlcmF0b3IgKSk7CisKKyAgICAgICAgICAgIHR5cGUgPSBpdGVyYXRvci5oZHJbMF0tPnR5cGU7CisgICAgICAgICAgICBpdGVyYXRvci5zaXplLndpZHRoICo9IENWX01BVF9DTih0eXBlKTsKKworICAgICAgICAgICAgaWYoICFpbml0dGFiICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpY3ZJbml0U3ViQzFSVGFibGUoICZzdWJfdGFiICk7CisgICAgICAgICAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHR5cGUpOworICAgICAgICAgICAgaWYoIGRlcHRoIDw9IENWXzE2UyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnVuY19zZnMgPSAoQ3ZGdW5jMkRfM0ExSSkoc3ViX3RhYi5mbl8yZFtkZXB0aF0pOworICAgICAgICAgICAgICAgIGlmKCAhZnVuY19zZnMgKQorICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jX3NmcyggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMl0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgMCApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnVuYyA9IChDdkZ1bmMyRF8zQSkoc3ViX3RhYi5mbl8yZFtkZXB0aF0pOworICAgICAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsyXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2kxID0gMCwgY29pMiA9IDAsIGNvaTMgPSAwOworICAgICAgICAgICAgCisgICAgICAgICAgICBDVl9DQUxMKCBzcmMxID0gY3ZHZXRNYXQoIHNyYzEsICZzcmNzdHViMSwgJmNvaTEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzcmNzdHViMiwgJmNvaTIgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaTMgKSk7CisgICAgICAgICAgICBpZiggY29pMSArIGNvaTIgKyBjb2kzICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgc3JjMiApIHx8ICFDVl9BUkVfVFlQRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMyICkgfHwgIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMxLT50eXBlKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMxICk7CisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgY24gPSBDVl9NQVRfQ04odHlwZSk7CisKKyAgICBpZiggIW1hc2sgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMxLT50eXBlICYgc3JjMi0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuID0gc2l6ZS53aWR0aCpzaXplLmhlaWdodCpjbjsKKworICAgICAgICAgICAgaWYoIGxlbiA8PSBDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFKkNWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNyYzFkYXRhID0gKGNvbnN0IGZsb2F0Kikoc3JjMS0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjMmRhdGEgPSAoY29uc3QgZmxvYXQqKShzcmMyLT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3RkYXRhID0gKGZsb2F0KikoZHN0LT5kYXRhLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZGF0YVtsZW4tMV0gPSAoZmxvYXQpKHNyYzJkYXRhW2xlbi0xXSAtIHNyYzFkYXRhW2xlbi0xXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIC0tbGVuICk7CisKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfNjRGICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjMWRhdGEgPSAoY29uc3QgZG91YmxlKikoc3JjMS0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYzJkYXRhID0gKGNvbnN0IGRvdWJsZSopKHNyYzItPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkc3RkYXRhID0gKGRvdWJsZSopKGRzdC0+ZGF0YS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdGRhdGFbbGVuLTFdID0gc3JjMmRhdGFbbGVuLTFdIC0gc3JjMWRhdGFbbGVuLTFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLWxlbiApOworCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udF9mbGFnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGR5ID0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIGNvcHltX2Z1bmMgPSAwOworICAgICAgICB0ZHN0ID0gZHN0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgYnVmX3NpemUsIGVsZW1fc2l6ZTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG1hc2spICkKKyAgICAgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIobWFzaykpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWFzaywgZHN0ICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAgICAgY29udF9mbGFnID0gQ1ZfSVNfTUFUX0NPTlQoIHNyYzEtPnR5cGUgJiBzcmMyLT50eXBlICYgZHN0LT50eXBlICYgbWFzay0+dHlwZSApOworICAgICAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgZHkgPSBDVl9NQVhfTE9DQUxfU0laRS8oZWxlbV9zaXplKnNpemUuaGVpZ2h0KTsKKyAgICAgICAgZHkgPSBNQVgoZHksMSk7CisgICAgICAgIGR5ID0gTUlOKGR5LHNpemUuaGVpZ2h0KTsKKyAgICAgICAgZHN0YnVmID0gY3ZNYXQoIGR5LCBzaXplLndpZHRoLCB0eXBlICk7CisgICAgICAgIGlmKCAhY29udF9mbGFnICkKKyAgICAgICAgICAgIGRzdGJ1Zi5zdGVwID0gY3ZBbGlnbiggZHN0YnVmLnN0ZXAsIDggKTsKKyAgICAgICAgYnVmX3NpemUgPSBkc3RidWYuc3RlcCA/IGRzdGJ1Zi5zdGVwKmR5IDogc2l6ZS53aWR0aCplbGVtX3NpemU7CisgICAgICAgIGlmKCBidWZfc2l6ZSA+IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKCBidWZfc2l6ZSApKTsKKyAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggYnVmX3NpemUgKTsKKyAgICAgICAgZHN0YnVmLmRhdGEucHRyID0gYnVmZmVyOworICAgICAgICB0ZHN0ID0gJmRzdGJ1ZjsKKyAgICAgICAgCisgICAgICAgIGNvcHltX2Z1bmMgPSBpY3ZHZXRDb3B5TWFza0Z1bmMoIGVsZW1fc2l6ZSApOworICAgIH0KKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0U3ViQzFSVGFibGUoICZzdWJfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCBkZXB0aCA8PSBDVl8xNlMgKQorICAgIHsKKyAgICAgICAgZnVuYyA9IDA7CisgICAgICAgIGZ1bmNfc2ZzID0gKEN2RnVuYzJEXzNBMUkpKHN1Yl90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICAgICAgaWYoICFmdW5jX3NmcyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGZ1bmNfc2ZzID0gMDsKKyAgICAgICAgZnVuYyA9IChDdkZ1bmMyRF8zQSkoc3ViX3RhYi5mbl8yZFtkZXB0aF0pOworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgIH0KKworICAgIHNyYzFfc3RlcCA9IHNyYzEtPnN0ZXA7CisgICAgc3JjMl9zdGVwID0gc3JjMi0+c3RlcDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICB0ZHN0X3N0ZXAgPSB0ZHN0LT5zdGVwOworICAgIG1hc2tfc3RlcCA9IG1hc2sgPyBtYXNrLT5zdGVwIDogMDsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSBkeSApCisgICAgeworICAgICAgICB0c2l6ZS53aWR0aCA9IHNpemUud2lkdGg7CisgICAgICAgIHRzaXplLmhlaWdodCA9IGR5OworICAgICAgICBpZiggeSArIGR5ID4gc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSB5OworICAgICAgICBpZiggY29udF9mbGFnIHx8IHRzaXplLmhlaWdodCA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgdHNpemUud2lkdGggKj0gdHNpemUuaGVpZ2h0OworICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIHNyYzFfc3RlcCA9IHNyYzJfc3RlcCA9IHRkc3Rfc3RlcCA9IGRzdF9zdGVwID0gbWFza19zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICB9CisKKyAgICAgICAgSVBQSV9DQUxMKCBkZXB0aCA8PSBDVl8xNlMgPworICAgICAgICAgICAgZnVuY19zZnMoIHNyYzEtPmRhdGEucHRyICsgeSpzcmMxLT5zdGVwLCBzcmMxX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgc3JjMi0+ZGF0YS5wdHIgKyB5KnNyYzItPnN0ZXAsIHNyYzJfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICB0ZHN0LT5kYXRhLnB0ciwgdGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSggdHNpemUud2lkdGgqY24sIHRzaXplLmhlaWdodCApLCAwICkgOgorICAgICAgICAgICAgZnVuYyggc3JjMS0+ZGF0YS5wdHIgKyB5KnNyYzEtPnN0ZXAsIHNyYzFfc3RlcCwKKyAgICAgICAgICAgICAgICAgIHNyYzItPmRhdGEucHRyICsgeSpzcmMyLT5zdGVwLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICB0ZHN0LT5kYXRhLnB0ciwgdGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgY3ZTaXplKCB0c2l6ZS53aWR0aCpjbiwgdHNpemUuaGVpZ2h0ICkpKTsKKworICAgICAgICBpZiggbWFzayApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggY29weW1fZnVuYyggdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwgZHN0LT5kYXRhLnB0ciArIHkqZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgdHNpemUsIG1hc2stPmRhdGEucHRyICsgeSptYXNrLT5zdGVwLCBtYXNrX3N0ZXAgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZTdWJSUyggY29uc3Qgdm9pZCogc3JjYXJyLCBDdlNjYWxhciBzY2FsYXIsIHZvaWQqIGRzdGFyciwgY29uc3Qgdm9pZCogbWFza2FyciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIHN1YnJfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMTsKKyAgICB1Y2hhciogYnVmZmVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdWJSUyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBzY3R5cGUsIHksIGR5LCB0eXBlLCBkZXB0aCwgY24sIGNvaSA9IDAsIGNvbnRfZmxhZyA9IDA7CisgICAgaW50IHNyY19zdGVwLCBkc3Rfc3RlcCwgdGRzdF9zdGVwLCBtYXNrX3N0ZXA7CisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdk1hdCBtYXNrc3R1YiwgKm1hc2sgPSAoQ3ZNYXQqKW1hc2thcnI7CisgICAgQ3ZNYXQgZHN0YnVmLCAqdGRzdDsKKyAgICBDdkZ1bmMyRF8yQTFQIGZ1bmM7CisgICAgQ3ZDb3B5TWFza0Z1bmMgY29weW1fZnVuYzsKKyAgICBkb3VibGUgYnVmWzEyXTsKKyAgICBpbnQgaXNfbmQgPSAwOworICAgIEN2U2l6ZSBzaXplLCB0c2l6ZTsgCisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFN1YlJDQzFSVGFibGUoICZzdWJyX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChzcmMpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaSApKTsKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKGRzdCkgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pICkpOworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGlzX25kICkKKyAgICB7CisgICAgICAgIEN2QXJyKiBhcnJzW10gPSB7IHNyYywgZHN0IH07CisgICAgICAgIEN2TWF0TkQgc3R1YnNbMl07CisgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgICAgaWYoIG1hc2thcnIgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssCisgICAgICAgICAgICAiVGhpcyBvcGVyYXRpb24gb24gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGRvZXMgbm90IHN1cHBvcnQgbWFzayIgKTsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMiwgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciApKTsKKworICAgICAgICBzY3R5cGUgPSB0eXBlID0gQ1ZfTUFUX1RZUEUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKTsKKyAgICAgICAgaWYoIENWX01BVF9ERVBUSChzY3R5cGUpIDwgQ1ZfMzJTICkKKyAgICAgICAgICAgIHNjdHlwZSA9ICh0eXBlICYgQ1ZfTUFUX0NOX01BU0spIHwgQ1ZfMzJTQzE7CisgICAgICAgIGl0ZXJhdG9yLnNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkoc3Vicl90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisgICAgICAgCisgICAgICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmc2NhbGFyLCBidWYsIHNjdHlwZSwgMSApKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgYnVmICkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBzY3R5cGUgPSB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBjbiA9IENWX01BVF9DTih0eXBlKTsKKyAgICBpZiggZGVwdGggPCBDVl8zMlMgKQorICAgICAgICBzY3R5cGUgPSAodHlwZSAmIENWX01BVF9DTl9NQVNLKSB8IENWXzMyU0MxOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisKKyAgICBpZiggIW1hc2thcnIgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHNpemUud2lkdGggPD0gQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHNpemUud2lkdGggKiBzaXplLmhlaWdodDsKKworICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmNkYXRhID0gKGNvbnN0IGZsb2F0Kikoc3JjLT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3RkYXRhID0gKGZsb2F0KikoZHN0LT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdGRhdGFbbGVuLTFdID0gKGZsb2F0KShzY2FsYXIudmFsWzBdIC0gc3JjZGF0YVtsZW4tMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLWxlbiApOworCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfNjRGQzEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzcmNkYXRhID0gKGNvbnN0IGRvdWJsZSopKHNyYy0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRzdGRhdGEgPSAoZG91YmxlKikoZHN0LT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdGRhdGFbbGVuLTFdID0gc2NhbGFyLnZhbFswXSAtIHNyY2RhdGFbbGVuLTFdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLWxlbiApOworCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udF9mbGFnID0gMTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZHkgPSBzaXplLmhlaWdodDsKKyAgICAgICAgY29weW1fZnVuYyA9IDA7CisgICAgICAgIHRkc3QgPSBkc3Q7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBidWZfc2l6ZSwgZWxlbV9zaXplOworICAgICAgICAKKyAgICAgICAgaWYoICFDVl9JU19NQVQobWFzaykgKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUihtYXNrKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXNrLCBkc3QgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICBjb250X2ZsYWcgPSBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICYgbWFzay0+dHlwZSApOworICAgICAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgZHkgPSBDVl9NQVhfTE9DQUxfU0laRS8oZWxlbV9zaXplKnNpemUuaGVpZ2h0KTsKKyAgICAgICAgZHkgPSBNQVgoZHksMSk7CisgICAgICAgIGR5ID0gTUlOKGR5LHNpemUuaGVpZ2h0KTsKKyAgICAgICAgZHN0YnVmID0gY3ZNYXQoIGR5LCBzaXplLndpZHRoLCB0eXBlICk7CisgICAgICAgIGlmKCAhY29udF9mbGFnICkKKyAgICAgICAgICAgIGRzdGJ1Zi5zdGVwID0gY3ZBbGlnbiggZHN0YnVmLnN0ZXAsIDggKTsKKyAgICAgICAgYnVmX3NpemUgPSBkc3RidWYuc3RlcCA/IGRzdGJ1Zi5zdGVwKmR5IDogc2l6ZS53aWR0aCplbGVtX3NpemU7CisgICAgICAgIGlmKCBidWZfc2l6ZSA+IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKCBidWZfc2l6ZSApKTsKKyAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggYnVmX3NpemUgKTsKKyAgICAgICAgZHN0YnVmLmRhdGEucHRyID0gYnVmZmVyOworICAgICAgICB0ZHN0ID0gJmRzdGJ1ZjsKKyAgICAgICAgCisgICAgICAgIGNvcHltX2Z1bmMgPSBpY3ZHZXRDb3B5TWFza0Z1bmMoIGVsZW1fc2l6ZSApOworICAgIH0KKworICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkoc3Vicl90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBzcmNfc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICB0ZHN0X3N0ZXAgPSB0ZHN0LT5zdGVwOworICAgIG1hc2tfc3RlcCA9IG1hc2sgPyBtYXNrLT5zdGVwIDogMDsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmc2NhbGFyLCBidWYsIHNjdHlwZSwgMSApKTsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSBkeSApCisgICAgeworICAgICAgICB0c2l6ZS53aWR0aCA9IHNpemUud2lkdGg7CisgICAgICAgIHRzaXplLmhlaWdodCA9IGR5OworICAgICAgICBpZiggeSArIGR5ID4gc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSB5OworICAgICAgICBpZiggY29udF9mbGFnIHx8IHRzaXplLmhlaWdodCA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgdHNpemUud2lkdGggKj0gdHNpemUuaGVpZ2h0OworICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIHNyY19zdGVwID0gdGRzdF9zdGVwID0gZHN0X3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIgKyB5KnNyYy0+c3RlcCwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIHRzaXplLndpZHRoKmNuLCB0c2l6ZS5oZWlnaHQgKSwgYnVmICkpOworICAgICAgICBpZiggbWFzayApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggY29weW1fZnVuYyggdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwgZHN0LT5kYXRhLnB0ciArIHkqZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgdHNpemUsIG1hc2stPmRhdGEucHRyICsgeSptYXNrLT5zdGVwLCBtYXNrX3N0ZXAgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEEgRCBEICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2QWRkKCBjb25zdCB2b2lkKiBzcmNhcnIxLCBjb25zdCB2b2lkKiBzcmNhcnIyLAorICAgICAgIHZvaWQqIGRzdGFyciwgY29uc3Qgdm9pZCogbWFza2FyciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGFkZF90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAxOworICAgIHVjaGFyKiBidWZmZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkFkZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB5LCBkeSwgdHlwZSwgZGVwdGgsIGNuLCBjb250X2ZsYWcgPSAwOworICAgIGludCBzcmMxX3N0ZXAsIHNyYzJfc3RlcCwgZHN0X3N0ZXAsIHRkc3Rfc3RlcCwgbWFza19zdGVwOworICAgIEN2TWF0IHNyY3N0dWIxLCAqc3JjMSA9IChDdk1hdCopc3JjYXJyMTsKKyAgICBDdk1hdCBzcmNzdHViMiwgKnNyYzIgPSAoQ3ZNYXQqKXNyY2FycjI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdk1hdCBtYXNrc3R1YiwgKm1hc2sgPSAoQ3ZNYXQqKW1hc2thcnI7CisgICAgQ3ZNYXQgZHN0YnVmLCAqdGRzdDsKKyAgICBDdkZ1bmMyRF8zQSBmdW5jOworICAgIEN2RnVuYzJEXzNBMUkgZnVuY19zZnM7CisgICAgQ3ZDb3B5TWFza0Z1bmMgY29weW1fZnVuYzsKKyAgICBDdlNpemUgc2l6ZSwgdHNpemU7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMxKSB8fCAhQ1ZfSVNfTUFUKHNyYzIpIHx8ICFDVl9JU19NQVQoZHN0KSkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChzcmMxKSB8fCBDVl9JU19NQVRORChzcmMyKSB8fCBDVl9JU19NQVRORChkc3QpKQorICAgICAgICB7CisgICAgICAgICAgICBDdkFyciogYXJyc1tdID0geyBzcmMxLCBzcmMyLCBkc3QgfTsKKyAgICAgICAgICAgIEN2TWF0TkQgc3R1YnNbM107CisgICAgICAgICAgICBDdk5BcnJheUl0ZXJhdG9yIGl0ZXJhdG9yOworCisgICAgICAgICAgICBpZiggbWFza2FyciApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssCisgICAgICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIG9uIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBkb2VzIG5vdCBzdXBwb3J0IG1hc2siICk7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAzLCBhcnJzLCAwLCBzdHVicywgJml0ZXJhdG9yICkpOworCisgICAgICAgICAgICB0eXBlID0gaXRlcmF0b3IuaGRyWzBdLT50eXBlOworICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04odHlwZSk7CisKKyAgICAgICAgICAgIGlmKCAhaW5pdHRhYiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWN2SW5pdEFkZEMxUlRhYmxlKCAmYWRkX3RhYiApOworICAgICAgICAgICAgICAgIGluaXR0YWIgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICAgICAgICAgIGlmKCBkZXB0aCA8PSBDVl8xNlMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1bmNfc2ZzID0gKEN2RnVuYzJEXzNBMUkpKGFkZF90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICAgICAgICAgICAgICBpZiggIWZ1bmNfc2ZzICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuY19zZnMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzJdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIDAgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfM0EpKGFkZF90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICAgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMl0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zaXplICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBjb2kzID0gMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBzcmMxLCAmc3Jjc3R1YjEsICZjb2kxICkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjMiA9IGN2R2V0TWF0KCBzcmMyLCAmc3Jjc3R1YjIsICZjb2kyICkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kzICkpOworICAgICAgICAgICAgaWYoIGNvaTEgKyBjb2kyICsgY29pMyAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYzEsIHNyYzIgKSB8fCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgc3JjMiApIHx8ICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjMS0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjMSApOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHR5cGUpOworICAgIGNuID0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgaWYoICFtYXNrICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIHNyYzItPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlbiA9IHNpemUud2lkdGgqc2l6ZS5oZWlnaHQqY247CisKKyAgICAgICAgICAgIGlmKCBsZW4gPD0gQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSpDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMxZGF0YSA9IChjb25zdCBmbG9hdCopKHNyYzEtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNyYzJkYXRhID0gKGNvbnN0IGZsb2F0Kikoc3JjMi0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZHN0ZGF0YSA9IChmbG9hdCopKGRzdC0+ZGF0YS5wdHIpOworCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdGRhdGFbbGVuLTFdID0gKGZsb2F0KShzcmMxZGF0YVtsZW4tMV0gKyBzcmMyZGF0YVtsZW4tMV0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLWxlbiApOworCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGRlcHRoID09IENWXzY0RiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYzFkYXRhID0gKGNvbnN0IGRvdWJsZSopKHNyYzEtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzcmMyZGF0YSA9IChjb25zdCBkb3VibGUqKShzcmMyLT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHN0ZGF0YSA9IChkb3VibGUqKShkc3QtPmRhdGEucHRyKTsKKworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2xlbi0xXSA9IHNyYzFkYXRhW2xlbi0xXSArIHNyYzJkYXRhW2xlbi0xXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1sZW4gKTsKKworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRfZmxhZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICBkeSA9IHNpemUuaGVpZ2h0OworICAgICAgICBjb3B5bV9mdW5jID0gMDsKKyAgICAgICAgdGRzdCA9IGRzdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGJ1Zl9zaXplLCBlbGVtX3NpemU7CisgICAgICAgIAorICAgICAgICBpZiggIUNWX0lTX01BVChtYXNrKSApCisgICAgICAgICAgICBDVl9DQUxMKCBtYXNrID0gY3ZHZXRNYXQoIG1hc2ssICZtYXNrc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKG1hc2spKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssICIiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hc2ssIGRzdCApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgICAgIGNvbnRfZmxhZyA9IENWX0lTX01BVF9DT05UKCBzcmMxLT50eXBlICYgc3JjMi0+dHlwZSAmIGRzdC0+dHlwZSAmIG1hc2stPnR5cGUgKTsKKyAgICAgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgICAgIGR5ID0gQ1ZfTUFYX0xPQ0FMX1NJWkUvKGVsZW1fc2l6ZSpzaXplLmhlaWdodCk7CisgICAgICAgIGR5ID0gTUFYKGR5LDEpOworICAgICAgICBkeSA9IE1JTihkeSxzaXplLmhlaWdodCk7CisgICAgICAgIGRzdGJ1ZiA9IGN2TWF0KCBkeSwgc2l6ZS53aWR0aCwgdHlwZSApOworICAgICAgICBpZiggIWNvbnRfZmxhZyApCisgICAgICAgICAgICBkc3RidWYuc3RlcCA9IGN2QWxpZ24oIGRzdGJ1Zi5zdGVwLCA4ICk7CisgICAgICAgIGJ1Zl9zaXplID0gZHN0YnVmLnN0ZXAgPyBkc3RidWYuc3RlcCpkeSA6IHNpemUud2lkdGgqZWxlbV9zaXplOworICAgICAgICBpZiggYnVmX3NpemUgPiBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgIGRzdGJ1Zi5kYXRhLnB0ciA9IGJ1ZmZlcjsKKyAgICAgICAgdGRzdCA9ICZkc3RidWY7CisgICAgICAgIAorICAgICAgICBjb3B5bV9mdW5jID0gaWN2R2V0Q29weU1hc2tGdW5jKCBlbGVtX3NpemUgKTsKKyAgICB9CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdEFkZEMxUlRhYmxlKCAmYWRkX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggZGVwdGggPD0gQ1ZfMTZTICkKKyAgICB7CisgICAgICAgIGZ1bmMgPSAwOworICAgICAgICBmdW5jX3NmcyA9IChDdkZ1bmMyRF8zQTFJKShhZGRfdGFiLmZuXzJkW2RlcHRoXSk7CisgICAgICAgIGlmKCAhZnVuY19zZnMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmdW5jX3NmcyA9IDA7CisgICAgICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfM0EpKGFkZF90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICB9CisKKyAgICBzcmMxX3N0ZXAgPSBzcmMxLT5zdGVwOworICAgIHNyYzJfc3RlcCA9IHNyYzItPnN0ZXA7CisgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgdGRzdF9zdGVwID0gdGRzdC0+c3RlcDsKKyAgICBtYXNrX3N0ZXAgPSBtYXNrID8gbWFzay0+c3RlcCA6IDA7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkgKz0gZHkgKQorICAgIHsKKyAgICAgICAgdHNpemUud2lkdGggPSBzaXplLndpZHRoOworICAgICAgICB0c2l6ZS5oZWlnaHQgPSBkeTsKKyAgICAgICAgaWYoIHkgKyBkeSA+IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHRzaXplLmhlaWdodCA9IHNpemUuaGVpZ2h0IC0geTsKKyAgICAgICAgaWYoIGNvbnRfZmxhZyB8fCB0c2l6ZS5oZWlnaHQgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRzaXplLndpZHRoICo9IHRzaXplLmhlaWdodDsKKyAgICAgICAgICAgIHRzaXplLmhlaWdodCA9IDE7CisgICAgICAgICAgICBzcmMxX3N0ZXAgPSBzcmMyX3N0ZXAgPSB0ZHN0X3N0ZXAgPSBkc3Rfc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorCisgICAgICAgIElQUElfQ0FMTCggZGVwdGggPD0gQ1ZfMTZTID8KKyAgICAgICAgICAgIGZ1bmNfc2ZzKCBzcmMxLT5kYXRhLnB0ciArIHkqc3JjMS0+c3RlcCwgc3JjMV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgIHNyYzItPmRhdGEucHRyICsgeSpzcmMyLT5zdGVwLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIHRzaXplLndpZHRoKmNuLCB0c2l6ZS5oZWlnaHQgKSwgMCApIDoKKyAgICAgICAgICAgIGZ1bmMoIHNyYzEtPmRhdGEucHRyICsgeSpzcmMxLT5zdGVwLCBzcmMxX3N0ZXAsCisgICAgICAgICAgICAgICAgICBzcmMyLT5kYXRhLnB0ciArIHkqc3JjMi0+c3RlcCwgc3JjMl9zdGVwLAorICAgICAgICAgICAgICAgICAgdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgIGN2U2l6ZSggdHNpemUud2lkdGgqY24sIHRzaXplLmhlaWdodCApKSk7CisKKyAgICAgICAgaWYoIG1hc2sgKQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGNvcHltX2Z1bmMoIHRkc3QtPmRhdGEucHRyLCB0ZHN0X3N0ZXAsIGRzdC0+ZGF0YS5wdHIgKyB5KmRzdC0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0ZXAsIHRzaXplLCBtYXNrLT5kYXRhLnB0ciArIHkqbWFzay0+c3RlcCwgbWFza19zdGVwICkpOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2QWRkUyggY29uc3Qgdm9pZCogc3JjYXJyLCBDdlNjYWxhciBzY2FsYXIsIHZvaWQqIGRzdGFyciwgY29uc3Qgdm9pZCogbWFza2FyciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGFkZF90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAxOworICAgIHVjaGFyKiBidWZmZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkFkZFMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc2N0eXBlLCB5LCBkeSwgdHlwZSwgZGVwdGgsIGNuLCBjb2kgPSAwLCBjb250X2ZsYWcgPSAwOworICAgIGludCBzcmNfc3RlcCwgZHN0X3N0ZXAsIHRkc3Rfc3RlcCwgbWFza19zdGVwOworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworICAgIEN2TWF0IGRzdGJ1ZiwgKnRkc3Q7CisgICAgQ3ZGdW5jMkRfMkExUCBmdW5jOworICAgIEN2Q29weU1hc2tGdW5jIGNvcHltX2Z1bmM7CisgICAgZG91YmxlIGJ1ZlsxMl07CisgICAgaW50IGlzX25kID0gMDsKKyAgICBDdlNpemUgc2l6ZSwgdHNpemU7IAorCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRBZGRDQzFSVGFibGUoICZhZGRfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYykgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKHNyYykgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pICkpOworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoZHN0KSApCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisgICAgICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaXNfbmQgKQorICAgIHsKKyAgICAgICAgQ3ZBcnIqIGFycnNbXSA9IHsgc3JjLCBkc3QgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1syXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBpZiggbWFza2FyciApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywKKyAgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBvbiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgZG9lcyBub3Qgc3VwcG9ydCBtYXNrIiApOworCisgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAyLCBhcnJzLCAwLCBzdHVicywgJml0ZXJhdG9yICkpOworCisgICAgICAgIHNjdHlwZSA9IHR5cGUgPSBDVl9NQVRfVFlQRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKHNjdHlwZSkgPCBDVl8zMlMgKQorICAgICAgICAgICAgc2N0eXBlID0gKHR5cGUgJiBDVl9NQVRfQ05fTUFTSykgfCBDVl8zMlNDMTsKKyAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04odHlwZSk7CisKKyAgICAgICAgZnVuYyA9IChDdkZ1bmMyRF8yQTFQKShhZGRfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgICAgIAorICAgICAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJnNjYWxhciwgYnVmLCBzY3R5cGUsIDEgKSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIGJ1ZiApKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgc2N0eXBlID0gdHlwZSA9IENWX01BVF9UWVBFKHNyYy0+dHlwZSk7CisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgY24gPSBDVl9NQVRfQ04odHlwZSk7CisgICAgaWYoIGRlcHRoIDwgQ1ZfMzJTICkKKyAgICAgICAgc2N0eXBlID0gKHR5cGUgJiBDVl9NQVRfQ05fTUFTSykgfCBDVl8zMlNDMTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworCisgICAgaWYoICFtYXNrYXJyICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzaXplLndpZHRoIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBzaXplLndpZHRoICogc2l6ZS5oZWlnaHQ7CisKKyAgICAgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjZGF0YSA9IChjb25zdCBmbG9hdCopKHNyYy0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZHN0ZGF0YSA9IChmbG9hdCopKGRzdC0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2xlbi0xXSA9IChmbG9hdCkoc2NhbGFyLnZhbFswXSArIHNyY2RhdGFbbGVuLTFdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1sZW4gKTsKKworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzY0RkMxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjZGF0YSA9IChjb25zdCBkb3VibGUqKShzcmMtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBkc3RkYXRhID0gKGRvdWJsZSopKGRzdC0+ZGF0YS5wdHIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW2xlbi0xXSA9IHNjYWxhci52YWxbMF0gKyBzcmNkYXRhW2xlbi0xXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1sZW4gKTsKKworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRfZmxhZyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGR5ID0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIGNvcHltX2Z1bmMgPSAwOworICAgICAgICB0ZHN0ID0gZHN0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgYnVmX3NpemUsIGVsZW1fc2l6ZTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG1hc2spICkKKyAgICAgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIobWFzaykpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWFzaywgZHN0ICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAgICAgY29udF9mbGFnID0gQ1ZfSVNfTUFUX0NPTlQoIHNyYy0+dHlwZSAmIGRzdC0+dHlwZSAmIG1hc2stPnR5cGUgKTsKKyAgICAgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgICAgIGR5ID0gQ1ZfTUFYX0xPQ0FMX1NJWkUvKGVsZW1fc2l6ZSpzaXplLmhlaWdodCk7CisgICAgICAgIGR5ID0gTUFYKGR5LDEpOworICAgICAgICBkeSA9IE1JTihkeSxzaXplLmhlaWdodCk7CisgICAgICAgIGRzdGJ1ZiA9IGN2TWF0KCBkeSwgc2l6ZS53aWR0aCwgdHlwZSApOworICAgICAgICBpZiggIWNvbnRfZmxhZyApCisgICAgICAgICAgICBkc3RidWYuc3RlcCA9IGN2QWxpZ24oIGRzdGJ1Zi5zdGVwLCA4ICk7CisgICAgICAgIGJ1Zl9zaXplID0gZHN0YnVmLnN0ZXAgPyBkc3RidWYuc3RlcCpkeSA6IHNpemUud2lkdGgqZWxlbV9zaXplOworICAgICAgICBpZiggYnVmX3NpemUgPiBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgIGRzdGJ1Zi5kYXRhLnB0ciA9IGJ1ZmZlcjsKKyAgICAgICAgdGRzdCA9ICZkc3RidWY7CisgICAgICAgIAorICAgICAgICBjb3B5bV9mdW5jID0gaWN2R2V0Q29weU1hc2tGdW5jKCBlbGVtX3NpemUgKTsKKyAgICB9CisKKyAgICBmdW5jID0gKEN2RnVuYzJEXzJBMVApKGFkZF90YWIuZm5fMmRbZGVwdGhdKTsKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBzcmNfc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICB0ZHN0X3N0ZXAgPSB0ZHN0LT5zdGVwOworICAgIG1hc2tfc3RlcCA9IG1hc2sgPyBtYXNrLT5zdGVwIDogMDsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmc2NhbGFyLCBidWYsIHNjdHlwZSwgMSApKTsKKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSArPSBkeSApCisgICAgeworICAgICAgICB0c2l6ZS53aWR0aCA9IHNpemUud2lkdGg7CisgICAgICAgIHRzaXplLmhlaWdodCA9IGR5OworICAgICAgICBpZiggeSArIGR5ID4gc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSB5OworICAgICAgICBpZiggY29udF9mbGFnIHx8IHRzaXplLmhlaWdodCA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgdHNpemUud2lkdGggKj0gdHNpemUuaGVpZ2h0OworICAgICAgICAgICAgdHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIHNyY19zdGVwID0gdGRzdF9zdGVwID0gZHN0X3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIgKyB5KnNyYy0+c3RlcCwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIHRzaXplLndpZHRoKmNuLCB0c2l6ZS5oZWlnaHQgKSwgYnVmICkpOworICAgICAgICBpZiggbWFzayApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggY29weW1fZnVuYyggdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwgZHN0LT5kYXRhLnB0ciArIHkqZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgdHNpemUsIG1hc2stPmRhdGEucHRyICsgeSptYXNrLT5zdGVwLCBtYXNrX3N0ZXAgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBNIFUgTCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfTVVMX09QX0NBU0UoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF9jYXN0X21hY3JvMV8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzJfLCBfY3Z0X21hY3JvXyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWN2TXVsXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlIHNjYWxlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmYWJzKHNjYWxlIC0gMS4pIDwgREJMX0VQU0lMT04gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxKz1zdGVwMSwgc3JjMis9c3RlcDIsIGRzdCs9c3RlcCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IHNyYzFbaV0gKiBzcmMyW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdDEgPSBzcmMxW2krMV0gKiBzcmMyW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMV0gPSBfY2FzdF9tYWNybzJfKHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9IHNyYzFbaSsyXSAqIHNyYzJbaSsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDEgPSBzcmMxW2krM10gKiBzcmMyW2krM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IF9jYXN0X21hY3JvMl8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krM10gPSBfY2FzdF9tYWNybzJfKHQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IHNyYzFbaV0gKiBzcmMyW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxKz1zdGVwMSwgc3JjMis9c3RlcDIsIGRzdCs9c3RlcCApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb3VibGUgZnQwID0gc2NhbGUqX2N2dF9tYWNyb18oc3JjMVtpXSkqX2N2dF9tYWNyb18oc3JjMltpXSk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGZ0MSA9IHNjYWxlKl9jdnRfbWFjcm9fKHNyYzFbaSsxXSkqX2N2dF9tYWNyb18oc3JjMltpKzFdKTsgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gX2Nhc3RfbWFjcm8xXyhmdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MSA9IF9jYXN0X21hY3JvMV8oZnQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpXSA9IF9jYXN0X21hY3JvMl8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsxXSA9IF9jYXN0X21hY3JvMl8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZ0MCA9IHNjYWxlKl9jdnRfbWFjcm9fKHNyYzFbaSsyXSkqX2N2dF9tYWNyb18oc3JjMltpKzJdKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmdDEgPSBzY2FsZSpfY3Z0X21hY3JvXyhzcmMxW2krM10pKl9jdnRfbWFjcm9fKHNyYzJbaSszXSk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBfY2FzdF9tYWNybzFfKGZ0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQxID0gX2Nhc3RfbWFjcm8xXyhmdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMl0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzNdID0gX2Nhc3RfbWFjcm8yXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQwID0gX2Nhc3RfbWFjcm8xXyhzY2FsZSpfY3Z0X21hY3JvXyhzcmMxW2ldKSpfY3Z0X21hY3JvXyhzcmMyW2ldKSk7ICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX01VTF9PUF9DQVNFKCA4dSwgdWNoYXIsIGludCwgY3ZSb3VuZCwgQ1ZfQ0FTVF84VSwgQ1ZfOFRPMzJGICkKK0lDVl9ERUZfTVVMX09QX0NBU0UoIDE2dSwgdXNob3J0LCBpbnQsIGN2Um91bmQsIENWX0NBU1RfMTZVLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxfT1BfQ0FTRSggMTZzLCBzaG9ydCwgaW50LCBjdlJvdW5kLCBDVl9DQVNUXzE2UywgQ1ZfTk9QICkKK0lDVl9ERUZfTVVMX09QX0NBU0UoIDMycywgaW50LCBpbnQsIGN2Um91bmQsIENWX0NBU1RfMzJTLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxfT1BfQ0FTRSggMzJmLCBmbG9hdCwgZG91YmxlLCBDVl9OT1AsIENWX0NBU1RfMzJGLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxfT1BfQ0FTRSggNjRmLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9DQVNUXzY0RiwgQ1ZfTk9QICkKKworCitJQ1ZfREVGX0lOSVRfQVJJVEhNX0ZVTkNfVEFCKCBNdWwsIEMxUiApCisKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2U2NhbGVkRWxXaXNlRnVuYykoIGNvbnN0IHZvaWQqIHNyYzEsIGludCBzdGVwMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmMyLCBpbnQgc3RlcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlIHNjYWxlICk7CisKK0NWX0lNUEwgdm9pZAorY3ZNdWwoIGNvbnN0IHZvaWQqIHNyY2FycjEsIGNvbnN0IHZvaWQqIHNyY2FycjIsIHZvaWQqIGRzdGFyciwgZG91YmxlIHNjYWxlICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgbXVsX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk11bCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlLCBkZXB0aCwgY29pID0gMDsKKyAgICBpbnQgc3JjMV9zdGVwLCBzcmMyX3N0ZXAsIGRzdF9zdGVwOworICAgIGludCBpc19uZCA9IDA7CisgICAgQ3ZNYXQgc3Jjc3R1YjEsICpzcmMxID0gKEN2TWF0KilzcmNhcnIxOworICAgIEN2TWF0IHNyY3N0dWIyLCAqc3JjMiA9IChDdk1hdCopc3JjYXJyMjsKKyAgICBDdk1hdCBkc3RzdHViLCAgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2U2NhbGVkRWxXaXNlRnVuYyBmdW5jOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRNdWxDMVJUYWJsZSggJm11bF90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMSkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKHNyYzEpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmMxID0gY3ZHZXRNYXQoIHNyYzEsICZzcmNzdHViMSwgJmNvaSApKTsKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzIpICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChzcmMyKSApCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjMiA9IGN2R2V0TWF0KCBzcmMyLCAmc3Jjc3R1YjIsICZjb2kgKSk7CisgICAgICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChkc3QpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaSApKTsKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpc19uZCApCisgICAgeworICAgICAgICBDdkFyciogYXJyc1tdID0geyBzcmMxLCBzcmMyLCBkc3QgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMywgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciApKTsKKworICAgICAgICB0eXBlID0gaXRlcmF0b3IuaGRyWzBdLT50eXBlOworICAgICAgICBpdGVyYXRvci5zaXplLndpZHRoICo9IENWX01BVF9DTih0eXBlKTsKKworICAgICAgICBmdW5jID0gKEN2U2NhbGVkRWxXaXNlRnVuYykobXVsX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSldKTsKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzJdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIHNjYWxlICkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBzcmMyICkgfHwgIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIHNyYzIgKSB8fCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKHNyYzEtPnR5cGUpOworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYzEgKTsKKworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHR5cGUpOworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKCB0eXBlICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYzEtPnR5cGUgJiBzcmMyLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworCisgICAgICAgIGlmKCBzaXplLndpZHRoIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUgJiYgc2NhbGUgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMxZGF0YSA9IChjb25zdCBmbG9hdCopKHNyYzEtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjMmRhdGEgPSAoY29uc3QgZmxvYXQqKShzcmMyLT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgZmxvYXQqIGRzdGRhdGEgPSAoZmxvYXQqKShkc3QtPmRhdGEucHRyKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW3NpemUud2lkdGgtMV0gPSAoZmxvYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAoc3JjMWRhdGFbc2l6ZS53aWR0aC0xXSAqIHNyYzJkYXRhW3NpemUud2lkdGgtMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfNjRGICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYzFkYXRhID0gKGNvbnN0IGRvdWJsZSopKHNyYzEtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYzJkYXRhID0gKGNvbnN0IGRvdWJsZSopKHNyYzItPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICBkb3VibGUqIGRzdGRhdGEgPSAoZG91YmxlKikoZHN0LT5kYXRhLnB0cik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZHN0ZGF0YVtzaXplLndpZHRoLTFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYzFkYXRhW3NpemUud2lkdGgtMV0gKiBzcmMyZGF0YVtzaXplLndpZHRoLTFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMl9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgc3JjMl9zdGVwID0gc3JjMi0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgZnVuYyA9IChDdlNjYWxlZEVsV2lzZUZ1bmMpKG11bF90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIHNyYzItPmRhdGEucHRyLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwgc2NhbGUgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBEIEkgViAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfRElWX09QX0NBU0UoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIGNoZWNrdHlwZSwgX3N0YXJ0X3Jvd19tYWNyb18sICAgXAorICAgIF9jYXN0X21hY3JvMV8sIF9jYXN0X21hY3JvMl8sIF9jdnRfbWFjcm9fLCBfY2hlY2tfbWFjcm9fLCBpc3JjICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2RGl2XyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogc3JjMiwgaW50IHN0ZXAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlIHNjYWxlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyBzdGVwMiAvPSBzaXplb2Yoc3JjMlswXSk7IHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSs9c3RlcDEsIHNyYzIrPXN0ZXAyLCBkc3QrPXN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfc3RhcnRfcm93X21hY3JvXyhjaGVja3R5cGUsIHNyYzIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIF9jaGVja19tYWNyb18oaXNyY1tpXSkgJiYgX2NoZWNrX21hY3JvXyhpc3JjW2krMV0pICYmICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfY2hlY2tfbWFjcm9fKGlzcmNbaSsyXSkgJiYgX2NoZWNrX21hY3JvXyhpc3JjW2krM10pKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBhID0gKGRvdWJsZSlfY3Z0X21hY3JvXyhzcmMyW2ldKSAqIF9jdnRfbWFjcm9fKHNyYzJbaSsxXSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb3VibGUgYiA9IChkb3VibGUpX2N2dF9tYWNyb18oc3JjMltpKzJdKSAqIF9jdnRfbWFjcm9fKHNyYzJbaSszXSk7ICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBzY2FsZS8oYSAqIGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBiICo9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYSAqPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MCA9IF9jYXN0X21hY3JvMV8oc3JjMltpKzFdICogX2N2dF9tYWNyb18oc3JjMVtpXSkgKiBiKTsgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejEgPSBfY2FzdF9tYWNybzFfKHNyYzJbaV0gKiBfY3Z0X21hY3JvXyhzcmMxW2krMV0pICogYik7ICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHoyID0gX2Nhc3RfbWFjcm8xXyhzcmMyW2krM10gKiBfY3Z0X21hY3JvXyhzcmMxW2krMl0pICogYSk7ICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MyA9IF9jYXN0X21hY3JvMV8oc3JjMltpKzJdICogX2N2dF9tYWNyb18oc3JjMVtpKzNdKSAqIGEpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpXSA9IF9jYXN0X21hY3JvMl8oejApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsxXSA9IF9jYXN0X21hY3JvMl8oejEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMl0gPSBfY2FzdF9tYWNybzJfKHoyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzNdID0gX2Nhc3RfbWFjcm8yXyh6Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MCA9IF9jaGVja19tYWNyb18oaXNyY1tpXSkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXyhfY3Z0X21hY3JvXyhzcmMxW2ldKSpzY2FsZS9fY3Z0X21hY3JvXyhzcmMyW2ldKSkgOiAwOyAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHoxID0gX2NoZWNrX21hY3JvXyhpc3JjW2krMV0pID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfKF9jdnRfbWFjcm9fKHNyYzFbaSsxXSkqc2NhbGUvX2N2dF9tYWNyb18oc3JjMltpKzFdKSk6MDtcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejIgPSBfY2hlY2tfbWFjcm9fKGlzcmNbaSsyXSkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIF9jYXN0X21hY3JvMV8oX2N2dF9tYWNyb18oc3JjMVtpKzJdKSpzY2FsZS9fY3Z0X21hY3JvXyhzcmMyW2krMl0pKTowO1wKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MyA9IF9jaGVja19tYWNyb18oaXNyY1tpKzNdKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXyhfY3Z0X21hY3JvXyhzcmMxW2krM10pKnNjYWxlL19jdnRfbWFjcm9fKHNyYzJbaSszXSkpOjA7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHowKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMV0gPSBfY2FzdF9tYWNybzJfKHoxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gX2Nhc3RfbWFjcm8yXyh6Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSszXSA9IF9jYXN0X21hY3JvMl8oejMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHowID0gX2NoZWNrX21hY3JvXyhpc3JjW2ldKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXyhfY3Z0X21hY3JvXyhzcmMxW2ldKSpzY2FsZS9fY3Z0X21hY3JvXyhzcmMyW2ldKSkgOiAwOyAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh6MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX1JFQ0lQX09QX0NBU0UoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIGNoZWNrdHlwZSwgICAgICAgICAgICBcCisgICAgX3N0YXJ0X3Jvd19tYWNyb18sIF9jYXN0X21hY3JvMV8sIF9jYXN0X21hY3JvMl8sICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfY3Z0X21hY3JvXywgX2NoZWNrX21hY3JvXywgaXNyYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlJlY2lwXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwMSwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSBzY2FsZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmNbMF0pOyBzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjKz1zdGVwMSwgZHN0Kz1zdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9zdGFydF9yb3dfbWFjcm9fKGNoZWNrdHlwZSwgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggX2NoZWNrX21hY3JvXyhpc3JjW2ldKSAmJiBfY2hlY2tfbWFjcm9fKGlzcmNbaSsxXSkgJiYgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfY2hlY2tfbWFjcm9fKGlzcmNbaSsyXSkgJiYgX2NoZWNrX21hY3JvXyhpc3JjW2krM10pKSAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZG91YmxlIGEgPSAoZG91YmxlKV9jdnRfbWFjcm9fKHNyY1tpXSkgKiBfY3Z0X21hY3JvXyhzcmNbaSsxXSk7IFwKKyAgICAgICAgICAgICAgICBkb3VibGUgYiA9IChkb3VibGUpX2N2dF9tYWNyb18oc3JjW2krMl0pICogX2N2dF9tYWNyb18oc3JjW2krM10pO1wKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IHNjYWxlLyhhICogYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYiAqPSBkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhICo9IGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejAgPSBfY2FzdF9tYWNybzFfKHNyY1tpKzFdICogYik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MSA9IF9jYXN0X21hY3JvMV8oc3JjW2ldICogYik7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHoyID0gX2Nhc3RfbWFjcm8xXyhzcmNbaSszXSAqIGEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejMgPSBfY2FzdF9tYWNybzFfKHNyY1tpKzJdICogYSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpXSA9IF9jYXN0X21hY3JvMl8oejApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMV0gPSBfY2FzdF9tYWNybzJfKHoxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IF9jYXN0X21hY3JvMl8oejIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzNdID0gX2Nhc3RfbWFjcm8yXyh6Myk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejAgPSBfY2hlY2tfbWFjcm9fKGlzcmNbaV0pID8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfKHNjYWxlL19jdnRfbWFjcm9fKHNyY1tpXSkpIDogMDsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHoxID0gX2NoZWNrX21hY3JvXyhpc3JjW2krMV0pID8gICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXyhzY2FsZS9fY3Z0X21hY3JvXyhzcmNbaSsxXSkpOjA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB6MiA9IF9jaGVja19tYWNyb18oaXNyY1tpKzJdKSA/ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIF9jYXN0X21hY3JvMV8oc2NhbGUvX2N2dF9tYWNyb18oc3JjW2krMl0pKTowOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgejMgPSBfY2hlY2tfbWFjcm9fKGlzcmNbaSszXSkgPyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfKHNjYWxlL19jdnRfbWFjcm9fKHNyY1tpKzNdKSk6MDsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh6MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsxXSA9IF9jYXN0X21hY3JvMl8oejEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gX2Nhc3RfbWFjcm8yXyh6Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krM10gPSBfY2FzdF9tYWNybzJfKHozKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB6MCA9IF9jaGVja19tYWNyb18oaXNyY1tpXSkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfKHNjYWxlL19jdnRfbWFjcm9fKHNyY1tpXSkpIDogMDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh6MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIGRpdl9zdGFydF9yb3dfaW50KGNoZWNrdHlwZSwgZGl2aXNvcikgXAorICAgIGludCBpCisKKyNkZWZpbmUgZGl2X3N0YXJ0X3Jvd19mbHQoY2hlY2t0eXBlLCBkaXZpc29yKSBcCisgICAgY29uc3QgY2hlY2t0eXBlKiBpc3JjID0gKGNvbnN0IGNoZWNrdHlwZSopZGl2aXNvcjsgaW50IGkKKworI2RlZmluZSBkaXZfY2hlY2tfemVyb19mbHQoeCkgICgoKHgpICYgMHg3ZmZmZmZmZikgIT0gMCkKKyNkZWZpbmUgZGl2X2NoZWNrX3plcm9fZGJsKHgpICAoKCh4KSAmIENWX0JJR19JTlQoMHg3ZmZmZmZmZmZmZmZmZmZmKSkgIT0gMCkKKworI2lmIGRlZmluZWQgV0lONjQgJiYgZGVmaW5lZCBFTTY0VCAmJiBkZWZpbmVkIF9NU0NfVkVSICYmICFkZWZpbmVkIENWX0lDQworI3ByYWdtYSBvcHRpbWl6ZSgiIixvZmYpCisjZW5kaWYKKworSUNWX0RFRl9ESVZfT1BfQ0FTRSggOHUsIHVjaGFyLCBpbnQsIHVjaGFyLCBkaXZfc3RhcnRfcm93X2ludCwKKyAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQsIENWX0NBU1RfOFUsIENWXzhUTzMyRiwgQ1ZfTk9OWkVSTywgc3JjMiApCisKKyNpZiBkZWZpbmVkIFdJTjY0ICYmIGRlZmluZWQgRU02NFQgJiYgZGVmaW5lZCBfTVNDX1ZFUiAmJiAhZGVmaW5lZCBDVl9JQ0MKKyNwcmFnbWEgb3B0aW1pemUoIiIsb24pCisjZW5kaWYKKworCitJQ1ZfREVGX0RJVl9PUF9DQVNFKCAxNnUsIHVzaG9ydCwgaW50LCB1c2hvcnQsIGRpdl9zdGFydF9yb3dfaW50LAorICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIENWX0NBU1RfNjRGLCBDVl9OT05aRVJPLCBzcmMyICkKK0lDVl9ERUZfRElWX09QX0NBU0UoIDE2cywgc2hvcnQsIGludCwgc2hvcnQsIGRpdl9zdGFydF9yb3dfaW50LAorICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMsIENWX05PUCwgQ1ZfTk9OWkVSTywgc3JjMiApCitJQ1ZfREVGX0RJVl9PUF9DQVNFKCAzMnMsIGludCwgaW50LCBpbnQsIGRpdl9zdGFydF9yb3dfaW50LAorICAgICAgICAgICAgICAgICAgICAgY3ZSb3VuZCwgQ1ZfQ0FTVF8zMlMsIENWX0NBU1RfNjRGLCBDVl9OT05aRVJPLCBzcmMyICkKK0lDVl9ERUZfRElWX09QX0NBU0UoIDMyZiwgZmxvYXQsIGRvdWJsZSwgaW50LCBkaXZfc3RhcnRfcm93X2ZsdCwKKyAgICAgICAgICAgICAgICAgICAgIENWX05PUCwgQ1ZfQ0FTVF8zMkYsIENWX05PUCwgZGl2X2NoZWNrX3plcm9fZmx0LCBpc3JjICkKK0lDVl9ERUZfRElWX09QX0NBU0UoIDY0ZiwgZG91YmxlLCBkb3VibGUsIGludDY0LCBkaXZfc3RhcnRfcm93X2ZsdCwKKyAgICAgICAgICAgICAgICAgICAgIENWX05PUCwgQ1ZfQ0FTVF82NEYsIENWX05PUCwgZGl2X2NoZWNrX3plcm9fZGJsLCBpc3JjICkKKworSUNWX0RFRl9SRUNJUF9PUF9DQVNFKCA4dSwgdWNoYXIsIGludCwgdWNoYXIsIGRpdl9zdGFydF9yb3dfaW50LAorICAgICAgICAgICAgICAgICAgICAgICBjdlJvdW5kLCBDVl9DQVNUXzhVLCBDVl84VE8zMkYsIENWX05PTlpFUk8sIHNyYyApCitJQ1ZfREVGX1JFQ0lQX09QX0NBU0UoIDE2dSwgdXNob3J0LCBpbnQsIHVzaG9ydCwgZGl2X3N0YXJ0X3Jvd19pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQsIENWX0NBU1RfMTZVLCBDVl9DQVNUXzY0RiwgQ1ZfTk9OWkVSTywgc3JjICkKK0lDVl9ERUZfUkVDSVBfT1BfQ0FTRSggMTZzLCBzaG9ydCwgaW50LCBzaG9ydCwgZGl2X3N0YXJ0X3Jvd19pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQsIENWX0NBU1RfMTZTLCBDVl9OT1AsIENWX05PTlpFUk8sIHNyYyApCitJQ1ZfREVGX1JFQ0lQX09QX0NBU0UoIDMycywgaW50LCBpbnQsIGludCwgZGl2X3N0YXJ0X3Jvd19pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGN2Um91bmQsIENWX0NBU1RfMzJTLCBDVl9DQVNUXzY0RiwgQ1ZfTk9OWkVSTywgc3JjICkKK0lDVl9ERUZfUkVDSVBfT1BfQ0FTRSggMzJmLCBmbG9hdCwgZG91YmxlLCBpbnQsIGRpdl9zdGFydF9yb3dfZmx0LAorICAgICAgICAgICAgICAgICAgICAgICBDVl9OT1AsIENWX0NBU1RfMzJGLCBDVl9OT1AsIGRpdl9jaGVja196ZXJvX2ZsdCwgaXNyYyAgKQorSUNWX0RFRl9SRUNJUF9PUF9DQVNFKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBpbnQ2NCwgZGl2X3N0YXJ0X3Jvd19mbHQsCisgICAgICAgICAgICAgICAgICAgICAgIENWX05PUCwgQ1ZfQ0FTVF82NEYsIENWX05PUCwgZGl2X2NoZWNrX3plcm9fZGJsLCBpc3JjICkKKworSUNWX0RFRl9JTklUX0FSSVRITV9GVU5DX1RBQiggRGl2LCBDMVIgKQorSUNWX0RFRl9JTklUX0FSSVRITV9GVU5DX1RBQiggUmVjaXAsIEMxUiApCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlY2lwRnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHN0ZXAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUgc2NhbGUgKTsKKworQ1ZfSU1QTCB2b2lkCitjdkRpdiggY29uc3Qgdm9pZCogc3JjYXJyMSwgY29uc3Qgdm9pZCogc3JjYXJyMiwgdm9pZCogZHN0YXJyLCBkb3VibGUgc2NhbGUgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBkaXZfdGFiOworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSByZWNpcF90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZEaXYiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSwgY29pID0gMDsKKyAgICBpbnQgaXNfbmQgPSAwOworICAgIGludCBzcmMxX3N0ZXAsIHNyYzJfc3RlcCwgZHN0X3N0ZXA7CisgICAgaW50IHNyYzFfY29udF9mbGFnID0gQ1ZfTUFUX0NPTlRfRkxBRzsKKyAgICBDdk1hdCBzcmNzdHViMSwgKnNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgQ3ZNYXQgc3Jjc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdERpdkMxUlRhYmxlKCAmZGl2X3RhYiApOworICAgICAgICBpY3ZJbml0UmVjaXBDMVJUYWJsZSggJnJlY2lwX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMyKSApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoc3JjMikpCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjMiA9IGN2R2V0TWF0KCBzcmMyLCAmc3Jjc3R1YjIsICZjb2kgKSk7CisgICAgICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggc3JjMSApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoc3JjMSkpCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFDVl9JU19NQVQoc3JjMSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX0NBTEwoIHNyYzEgPSBjdkdldE1hdCggc3JjMSwgJnNyY3N0dWIxLCAmY29pICkpOworICAgICAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBzcmMyICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMyICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworICAgICAgICAgICAgc3JjMV9jb250X2ZsYWcgPSBzcmMxLT50eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoZHN0KSkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaSApKTsKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpc19uZCApCisgICAgeworICAgICAgICBDdkFyciogYXJyc1tdID0geyBkc3QsIHNyYzIsIHNyYzEgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMiArIChzcmMxICE9IDApLCBhcnJzLCAwLCBzdHVicywgJml0ZXJhdG9yICkpOworCisgICAgICAgIHR5cGUgPSBpdGVyYXRvci5oZHJbMF0tPnR5cGU7CisgICAgICAgIGl0ZXJhdG9yLnNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgICAgIGlmKCBzcmMxICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTY2FsZWRFbFdpc2VGdW5jIGZ1bmMgPQorICAgICAgICAgICAgICAgIChDdlNjYWxlZEVsV2lzZUZ1bmMpKGRpdl90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clsyXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIHNjYWxlICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdlJlY2lwRnVuYyBmdW5jID0gKEN2UmVjaXBGdW5jKShyZWNpcF90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIHNjYWxlICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgIH0KKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMiwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzIsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjMi0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjMiApOworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKCB0eXBlICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYzFfY29udF9mbGFnICYgc3JjMi0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMl9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMSA/IHNyYzEtPnN0ZXAgOiAwOworICAgICAgICBzcmMyX3N0ZXAgPSBzcmMyLT5zdGVwOworICAgICAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICB9CisKKyAgICBpZiggc3JjMSApCisgICAgeworICAgICAgICBDdlNjYWxlZEVsV2lzZUZ1bmMgZnVuYyA9IChDdlNjYWxlZEVsV2lzZUZ1bmMpKGRpdl90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIHNyYzItPmRhdGEucHRyLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsIHNpemUsIHNjYWxlICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlJlY2lwRnVuYyBmdW5jID0gKEN2UmVjaXBGdW5jKShyZWNpcF90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzItPmRhdGEucHRyLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsIHNpemUsIHNjYWxlICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEEgRCBEICAgVyBFIEkgRyBUIEUgRCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9BRERfV0VJR0hURURfT1AoZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgbG9hZF9tYWNybywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xLCBjYXN0X21hY3JvMikgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkFkZFdlaWdodGVkXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsIGRvdWJsZSBhbHBoYSwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgZG91YmxlIGJldGEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGdhbW1hLCBhcnJ0eXBlKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSApXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyBzdGVwMiAvPSBzaXplb2Yoc3JjMlswXSk7IHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCBkc3QgKz0gc3RlcCApICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSBjYXN0X21hY3JvMShsb2FkX21hY3JvKChzcmMxKVtpXSkqYWxwaGEgKyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfbWFjcm8oKHNyYzIpW2ldKSpiZXRhICsgZ2FtbWEpOyAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQxID0gY2FzdF9tYWNybzEobG9hZF9tYWNybygoc3JjMSlbaSsxXSkqYWxwaGEgKyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKChzcmMyKVtpKzFdKSpiZXRhICsgZ2FtbWEpOyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChkc3QpW2ldID0gY2FzdF9tYWNybzIoIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKGRzdClbaSsxXSA9IGNhc3RfbWFjcm8yKCB0MSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEobG9hZF9tYWNybygoc3JjMSlbaSsyXSkqYWxwaGEgKyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkX21hY3JvKChzcmMyKVtpKzJdKSpiZXRhICsgZ2FtbWEpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IGNhc3RfbWFjcm8xKGxvYWRfbWFjcm8oKHNyYzEpW2krM10pKmFscGhhICsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybygoc3JjMilbaSszXSkqYmV0YSArIGdhbW1hKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAoZHN0KVtpKzJdID0gY2FzdF9tYWNybzIoIHQwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIChkc3QpW2krM10gPSBjYXN0X21hY3JvMiggdDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IGNhc3RfbWFjcm8xKGxvYWRfbWFjcm8oKHNyYzEpW2ldKSphbHBoYSArICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9tYWNybygoc3JjMilbaV0pKmJldGEgKyBnYW1tYSk7ICAgICAgXAorICAgICAgICAgICAgKGRzdClbaV0gPSBjYXN0X21hY3JvMiggdDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjdW5kZWYgc2hpZnQKKyNkZWZpbmUgc2hpZnQgMTQKKworc3RhdGljICBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZBZGRXZWlnaHRlZF84dV9mYXN0X0MxUiggY29uc3QgdWNoYXIqIHNyYzEsIGludCBzdGVwMSwgZG91YmxlIGFscGhhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcmMyLCBpbnQgc3RlcDIsIGRvdWJsZSBiZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBnYW1tYSwgdWNoYXIqIGRzdCwgaW50IHN0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgdGFiMVsyNTZdLCB0YWIyWzI1Nl07CisgICAgZG91YmxlIHQgPSAwOworICAgIGludCBqLCB0MCwgdDEsIHQyLCB0MzsKKworICAgIGFscGhhICo9IDEgPDwgc2hpZnQ7CisgICAgZ2FtbWEgPSBnYW1tYSooMSA8PCBzaGlmdCkgKyAoMSA8PCAoc2hpZnQgLSAxKSk7CisgICAgYmV0YSAqPSAxIDw8IHNoaWZ0OworCisgICAgZm9yKCBqID0gMDsgaiA8IDI1NjsgaisrICkKKyAgICB7CisgICAgICAgIHRhYjFbal0gPSBjdlJvdW5kKHQpOworICAgICAgICB0YWIyW2pdID0gY3ZSb3VuZChnYW1tYSk7CisgICAgICAgIHQgKz0gYWxwaGE7CisgICAgICAgIGdhbW1hICs9IGJldGE7CisgICAgfQorCisgICAgdDAgPSAodGFiMVswXSArIHRhYjJbMF0pID4+IHNoaWZ0OworICAgIHQxID0gKHRhYjFbMF0gKyB0YWIyWzI1NV0pID4+IHNoaWZ0OworICAgIHQyID0gKHRhYjFbMjU1XSArIHRhYjJbMF0pID4+IHNoaWZ0OworICAgIHQzID0gKHRhYjFbMjU1XSArIHRhYjJbMjU1XSkgPj4gc2hpZnQ7CisKKyAgICBpZiggKHVuc2lnbmVkKSh0MCsyNTYpIDwgNzY4ICYmICh1bnNpZ25lZCkodDErMjU2KSA8IDc2OCAmJgorICAgICAgICAodW5zaWduZWQpKHQyKzI1NikgPCA3NjggJiYgKHVuc2lnbmVkKSh0MysyNTYpIDwgNzY4ICkKKyAgICB7CisgICAgICAgIC8vIHVzZSBmYXN0ZXIgdGFibGUtYmFzZWQgY29udmVydGlvbiBiYWNrIHRvIDh1CisgICAgICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCBkc3QgKz0gc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQwID0gQ1ZfRkFTVF9DQVNUXzhVKCh0YWIxW3NyYzFbaV1dICsgdGFiMltzcmMyW2ldXSkgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgIHQxID0gQ1ZfRkFTVF9DQVNUXzhVKCh0YWIxW3NyYzFbaSsxXV0gKyB0YWIyW3NyYzJbaSsxXV0pID4+IHNoaWZ0KTsKKworICAgICAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcil0MDsKKyAgICAgICAgICAgICAgICBkc3RbaSsxXSA9ICh1Y2hhcil0MTsKKworICAgICAgICAgICAgICAgIHQwID0gQ1ZfRkFTVF9DQVNUXzhVKCh0YWIxW3NyYzFbaSsyXV0gKyB0YWIyW3NyYzJbaSsyXV0pID4+IHNoaWZ0KTsKKyAgICAgICAgICAgICAgICB0MSA9IENWX0ZBU1RfQ0FTVF84VSgodGFiMVtzcmMxW2krM11dICsgdGFiMltzcmMyW2krM11dKSA+PiBzaGlmdCk7CisKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9ICh1Y2hhcil0MDsKKyAgICAgICAgICAgICAgICBkc3RbaSszXSA9ICh1Y2hhcil0MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQwID0gQ1ZfRkFTVF9DQVNUXzhVKCh0YWIxW3NyYzFbaV1dICsgdGFiMltzcmMyW2ldXSkgPj4gc2hpZnQpOworICAgICAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcil0MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyB1c2UgdW5pdmVyc2FsIG1hY3JvIGZvciBjb252ZXJ0aW9uIGJhY2sgdG8gOHUKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIHNyYzIgKz0gc3RlcDIsIGRzdCArPSBzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDQ7IGkgKz0gNCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdDAgPSAodGFiMVtzcmMxW2ldXSArIHRhYjJbc3JjMltpXV0pID4+IHNoaWZ0OworICAgICAgICAgICAgICAgIHQxID0gKHRhYjFbc3JjMVtpKzFdXSArIHRhYjJbc3JjMltpKzFdXSkgPj4gc2hpZnQ7CisKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBDVl9DQVNUXzhVKCB0MCApOworICAgICAgICAgICAgICAgIGRzdFtpKzFdID0gQ1ZfQ0FTVF84VSggdDEgKTsKKworICAgICAgICAgICAgICAgIHQwID0gKHRhYjFbc3JjMVtpKzJdXSArIHRhYjJbc3JjMltpKzJdXSkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgdDEgPSAodGFiMVtzcmMxW2krM11dICsgdGFiMltzcmMyW2krM11dKSA+PiBzaGlmdDsKKworICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gQ1ZfQ0FTVF84VSggdDAgKTsKKyAgICAgICAgICAgICAgICBkc3RbaSszXSA9IENWX0NBU1RfOFUoIHQxICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0MCA9ICh0YWIxW3NyYzFbaV1dICsgdGFiMltzcmMyW2ldXSkgPj4gc2hpZnQ7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gQ1ZfQ0FTVF84VSggdDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitJQ1ZfREVGX0FERF9XRUlHSFRFRF9PUCggOHUsIHVjaGFyLCBpbnQsIENWXzhUTzMyRiwgY3ZSb3VuZCwgQ1ZfQ0FTVF84VSApCitJQ1ZfREVGX0FERF9XRUlHSFRFRF9PUCggMTZ1LCB1c2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2VSApCitJQ1ZfREVGX0FERF9XRUlHSFRFRF9PUCggMTZzLCBzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZTICkKK0lDVl9ERUZfQUREX1dFSUdIVEVEX09QKCAzMnMsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMzJTICkKK0lDVl9ERUZfQUREX1dFSUdIVEVEX09QKCAzMmYsIGZsb2F0LCBkb3VibGUsIENWX05PUCwgQ1ZfTk9QLCBDVl9DQVNUXzMyRiApCitJQ1ZfREVGX0FERF9XRUlHSFRFRF9PUCggNjRmLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfNjRGICkKKworCitJQ1ZfREVGX0lOSVRfQVJJVEhNX0ZVTkNfVEFCKCBBZGRXZWlnaHRlZCwgQzFSICkKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZBZGRXZWlnaHRlZEZ1bmMpKCBjb25zdCB2b2lkKiBzcmMxLCBpbnQgc3RlcDEsIGRvdWJsZSBhbHBoYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjMiwgaW50IHN0ZXAyLCBkb3VibGUgYmV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGdhbW1hLCB2b2lkKiBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBDdlNpemUgc2l6ZSApOworCitDVl9JTVBMIHZvaWQKK2N2QWRkV2VpZ2h0ZWQoIGNvbnN0IEN2QXJyKiBzcmNBYXJyLCBkb3VibGUgYWxwaGEsCisgICAgICAgICAgICAgICBjb25zdCBDdkFyciogc3JjQmFyciwgZG91YmxlIGJldGEsCisgICAgICAgICAgICAgICBkb3VibGUgZ2FtbWEsIEN2QXJyKiBkc3RhcnIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBhZGR3X3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZBZGRXZWlnaHRlZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0ICBzcmNBX3N0dWIsICpzcmNBID0gKEN2TWF0KilzcmNBYXJyOworICAgIEN2TWF0ICBzcmNCX3N0dWIsICpzcmNCID0gKEN2TWF0KilzcmNCYXJyOworICAgIEN2TWF0ICBkc3Rfc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIGludCAgY29pMSwgY29pMiwgY29pOworICAgIGludCAgc3JjQV9zdGVwLCBzcmNCX3N0ZXAsIGRzdF9zdGVwOworICAgIGludCAgdHlwZTsKKyAgICBDdkFkZFdlaWdodGVkRnVuYyBmdW5jOworICAgIEN2U2l6ZSBzaXplOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRBZGRXZWlnaHRlZEMxUlRhYmxlKCAmYWRkd190YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3JjQSA9IGN2R2V0TWF0KCBzcmNBLCAmc3JjQV9zdHViLCAmY29pMSApKTsKKyAgICBDVl9DQUxMKCBzcmNCID0gY3ZHZXRNYXQoIHNyY0IsICZzcmNCX3N0dWIsICZjb2kyICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3Rfc3R1YiwgJmNvaSApKTsKKworICAgIGlmKCBjb2kxIHx8IGNvaTIgfHwgY29pICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIkNPSSBtdXN0IG5vdCBiZSBzZXQiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjQSwgc3JjQiApIHx8CisgICAgICAgICFDVl9BUkVfVFlQRVNfRVEoIHNyY0EsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgIkFsbCBpbnB1dC9vdXRwdXQgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGUiKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmNBLCBzcmNCICkgfHwKKyAgICAgICAgIUNWX0FSRV9TSVpFU19FUSggc3JjQSwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgIkFsbCBpbnB1dC9vdXRwdXQgYXJyYXlzIHNob3VsZCBoYXZlIHRoZSBzYW1lIHNpemVzIik7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmNBICk7CisgICAgdHlwZSA9IENWX01BVF9UWVBFKCBzcmNBLT50eXBlICk7CisgICAgc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04oIHR5cGUgKTsKKyAgICBzcmNBX3N0ZXAgPSBzcmNBLT5zdGVwOworICAgIHNyY0Jfc3RlcCA9IHNyY0ItPnN0ZXA7CisgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHR5cGUgJiBzcmNCLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIHNyY0Ffc3RlcCA9IHNyY0Jfc3RlcCA9IGRzdF9zdGVwID0gQ1ZfQVVUT1NURVA7CisgICAgfQorCisgICAgaWYoIHR5cGUgPT0gQ1ZfOFVDMSAmJiBzaXplLndpZHRoICogc2l6ZS5oZWlnaHQgPj0gMTAyNCAmJgorICAgICAgICBmYWJzKGFscGhhKSA8IDI1NiAmJiBmYWJzKGJldGEpIDwgMjU2ICYmIGZhYnMoZ2FtbWEpIDwgMjU2KjI1NiApCisgICAgeworICAgICAgICBmdW5jID0gKEN2QWRkV2VpZ2h0ZWRGdW5jKWljdkFkZFdlaWdodGVkXzh1X2Zhc3RfQzFSOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmdW5jID0gKEN2QWRkV2VpZ2h0ZWRGdW5jKWFkZHdfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV07CisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGlzIGFycmF5IHR5cGUgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICB9CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyY0EtPmRhdGEucHRyLCBzcmNBX3N0ZXAsIGFscGhhLCBzcmNCLT5kYXRhLnB0ciwgc3JjQl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgYmV0YSwgZ2FtbWEsIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplICkpOworCisgICAgX19FTkRfXzsKK30KKworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hhcnJheS5jcHAgYi9jeGNvcmUvc3JjL2N4YXJyYXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZjZkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4YXJyYXkuY3BwCkBAIC0wLDAgKzEsMzcwMSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEN2TWF0LCBDdk1hdE5ELCBDdlNwYXJjZU1hdCBhbmQgSXBsSW1hZ2Ugc3VwcG9ydCBmdW5jdGlvbnMKKy8vICAoY3JlYXRpb24sIGRlbGV0aW9uLCBjb3B5aW5nLCByZXRyaWV2aW5nIGFuZCBzZXR0aW5nIGVsZW1lbnRzIGV0Yy4pCisvLworLy8gKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworc3RhdGljIHN0cnVjdAoreworICAgIEN2X2lwbENyZWF0ZUltYWdlSGVhZGVyICBjcmVhdGVIZWFkZXI7CisgICAgQ3ZfaXBsQWxsb2NhdGVJbWFnZURhdGEgIGFsbG9jYXRlRGF0YTsKKyAgICBDdl9pcGxEZWFsbG9jYXRlICBkZWFsbG9jYXRlOworICAgIEN2X2lwbENyZWF0ZVJPSSAgY3JlYXRlUk9JOworICAgIEN2X2lwbENsb25lSW1hZ2UgIGNsb25lSW1hZ2U7Cit9CitDdklQTDsKKworLy8gTWFrZXMgdGhlIGxpYnJhcnkgdXNlIG5hdGl2ZSBJUEwgaW1hZ2UgYWxsb2NhdG9ycworQ1ZfSU1QTCB2b2lkCitjdlNldElQTEFsbG9jYXRvcnMoIEN2X2lwbENyZWF0ZUltYWdlSGVhZGVyIGNyZWF0ZUhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgQ3ZfaXBsQWxsb2NhdGVJbWFnZURhdGEgYWxsb2NhdGVEYXRhLAorICAgICAgICAgICAgICAgICAgICBDdl9pcGxEZWFsbG9jYXRlIGRlYWxsb2NhdGUsCisgICAgICAgICAgICAgICAgICAgIEN2X2lwbENyZWF0ZVJPSSBjcmVhdGVST0ksCisgICAgICAgICAgICAgICAgICAgIEN2X2lwbENsb25lSW1hZ2UgY2xvbmVJbWFnZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlNldElQTEFsbG9jYXRvcnMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWNyZWF0ZUhlYWRlciB8fCAhYWxsb2NhdGVEYXRhIHx8ICFkZWFsbG9jYXRlIHx8ICFjcmVhdGVST0kgfHwgIWNsb25lSW1hZ2UgKQorICAgIHsKKyAgICAgICAgaWYoIGNyZWF0ZUhlYWRlciB8fCBhbGxvY2F0ZURhdGEgfHwgZGVhbGxvY2F0ZSB8fCBjcmVhdGVST0kgfHwgY2xvbmVJbWFnZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiRWl0aGVyIGFsbCB0aGUgcG9pbnRlcnMgc2hvdWxkIGJlIG51bGwgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZXkgYWxsIHNob3VsZCBiZSBub24tbnVsbCIgKTsKKyAgICB9CisKKyAgICBDdklQTC5jcmVhdGVIZWFkZXIgPSBjcmVhdGVIZWFkZXI7CisgICAgQ3ZJUEwuYWxsb2NhdGVEYXRhID0gYWxsb2NhdGVEYXRhOworICAgIEN2SVBMLmRlYWxsb2NhdGUgPSBkZWFsbG9jYXRlOworICAgIEN2SVBMLmNyZWF0ZVJPSSA9IGNyZWF0ZVJPSTsKKyAgICBDdklQTC5jbG9uZUltYWdlID0gY2xvbmVJbWFnZTsKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0IGNyZWF0aW9uIGFuZCBiYXNpYyBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBDcmVhdGVzIEN2TWF0IGFuZCB1bmRlcmx5aW5nIGRhdGEKK0NWX0lNUEwgQ3ZNYXQqCitjdkNyZWF0ZU1hdCggaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgdHlwZSApCit7CisgICAgQ3ZNYXQqIGFyciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlTWF0IiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NBTEwoIGFyciA9IGN2Q3JlYXRlTWF0SGVhZGVyKCBoZWlnaHQsIHdpZHRoLCB0eXBlICkpOworICAgIENWX0NBTEwoIGN2Q3JlYXRlRGF0YSggYXJyICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJmFyciApOworCisgICAgcmV0dXJuIGFycjsKK30KKworCitzdGF0aWMgdm9pZCBpY3ZDaGVja0h1Z2UoIEN2TWF0KiBhcnIgKQoreworICAgIGlmKCAoaW50NjQpYXJyLT5zdGVwKmFyci0+cm93cyA+IElOVF9NQVggKQorICAgICAgICBhcnItPnR5cGUgJj0gfkNWX01BVF9DT05UX0ZMQUc7Cit9CisKKy8vIENyZWF0ZXMgQ3ZNYXQgaGVhZGVyIG9ubHkKK0NWX0lNUEwgQ3ZNYXQqCitjdkNyZWF0ZU1hdEhlYWRlciggaW50IHJvd3MsIGludCBjb2xzLCBpbnQgdHlwZSApCit7CisgICAgQ3ZNYXQqIGFyciA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZU1hdEhlYWRlciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBtaW5fc3RlcDsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUodHlwZSk7CisKKyAgICBpZiggcm93cyA8PSAwIHx8IGNvbHMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiTm9uLXBvc2l0aXZlIHdpZHRoIG9yIGhlaWdodCIgKTsKKworICAgIG1pbl9zdGVwID0gQ1ZfRUxFTV9TSVpFKHR5cGUpKmNvbHM7CisgICAgaWYoIG1pbl9zdGVwIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJJbnZhbGlkIG1hdHJpeCB0eXBlIiApOworCisgICAgQ1ZfQ0FMTCggYXJyID0gKEN2TWF0KiljdkFsbG9jKCBzaXplb2YoKmFycikpKTsKKworICAgIGFyci0+c3RlcCA9IHJvd3MgPT0gMSA/IDAgOiBjdkFsaWduKG1pbl9zdGVwLCBDVl9ERUZBVUxUX01BVF9ST1dfQUxJR04pOworICAgIGFyci0+dHlwZSA9IENWX01BVF9NQUdJQ19WQUwgfCB0eXBlIHwKKyAgICAgICAgICAgICAgICAoYXJyLT5zdGVwID09IDAgfHwgYXJyLT5zdGVwID09IG1pbl9zdGVwID8gQ1ZfTUFUX0NPTlRfRkxBRyA6IDApOworICAgIGFyci0+cm93cyA9IHJvd3M7CisgICAgYXJyLT5jb2xzID0gY29sczsKKyAgICBhcnItPmRhdGEucHRyID0gMDsKKyAgICBhcnItPnJlZmNvdW50ID0gMDsKKyAgICBhcnItPmhkcl9yZWZjb3VudCA9IDE7CisKKyAgICBpY3ZDaGVja0h1Z2UoIGFyciApOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJmFyciApOworCisgICAgcmV0dXJuIGFycjsKK30KKworCisvLyBJbml0aWFsaXplcyBDdk1hdCBoZWFkZXIsIGFsbG9jYXRlZCBieSB0aGUgdXNlcgorQ1ZfSU1QTCBDdk1hdCoKK2N2SW5pdE1hdEhlYWRlciggQ3ZNYXQqIGFyciwgaW50IHJvd3MsIGludCBjb2xzLAorICAgICAgICAgICAgICAgICBpbnQgdHlwZSwgdm9pZCogZGF0YSwgaW50IHN0ZXAgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZJbml0TWF0SGVhZGVyIiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGludCBtYXNrLCBwaXhfc2l6ZSwgbWluX3N0ZXA7CisKKyAgICBpZiggIWFyciApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzTnVsbFB0ciApOworCisgICAgaWYoICh1bnNpZ25lZClDVl9NQVRfREVQVEgodHlwZSkgPiBDVl9ERVBUSF9NQVggKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX0JhZE51bUNoYW5uZWxzICk7CisKKyAgICBpZiggcm93cyA8PSAwIHx8IGNvbHMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiTm9uLXBvc2l0aXZlIGNvbHMgb3Igcm93cyIgKTsKKyAKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHR5cGUgKTsKKyAgICBhcnItPnR5cGUgPSB0eXBlIHwgQ1ZfTUFUX01BR0lDX1ZBTDsKKyAgICBhcnItPnJvd3MgPSByb3dzOworICAgIGFyci0+Y29scyA9IGNvbHM7CisgICAgYXJyLT5kYXRhLnB0ciA9ICh1Y2hhciopZGF0YTsKKyAgICBhcnItPnJlZmNvdW50ID0gMDsKKyAgICBhcnItPmhkcl9yZWZjb3VudCA9IDA7CisKKyAgICBtYXNrID0gKGFyci0+cm93cyA8PSAxKSAtIDE7CisgICAgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgbWluX3N0ZXAgPSBhcnItPmNvbHMqcGl4X3NpemUgJiBtYXNrOworCisgICAgaWYoIHN0ZXAgIT0gQ1ZfQVVUT1NURVAgJiYgc3RlcCAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzdGVwIDwgbWluX3N0ZXAgKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9CYWRTdGVwICk7CisgICAgICAgIGFyci0+c3RlcCA9IHN0ZXAgJiBtYXNrOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhcnItPnN0ZXAgPSBtaW5fc3RlcDsKKyAgICB9CisKKyAgICBhcnItPnR5cGUgPSBDVl9NQVRfTUFHSUNfVkFMIHwgdHlwZSB8CisgICAgICAgICAgICAgICAgKGFyci0+c3RlcCA9PSBtaW5fc3RlcCA/IENWX01BVF9DT05UX0ZMQUcgOiAwKTsKKworICAgIGljdkNoZWNrSHVnZSggYXJyICk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGFycjsKK30KKworCisvLyBEZWFsbG9jYXRlcyB0aGUgQ3ZNYXQgc3RydWN0dXJlIGFuZCB1bmRlcmx5aW5nIGRhdGEKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlTWF0KCBDdk1hdCoqIGFycmF5ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVsZWFzZU1hdCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWFycmF5ICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9IZWFkZXJJc051bGwgKTsKKworICAgIGlmKCAqYXJyYXkgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIGFyciA9ICphcnJheTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0hEUihhcnIpICYmICFDVl9JU19NQVRORF9IRFIoYXJyKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c0JhZEZsYWcgKTsKKworICAgICAgICAqYXJyYXkgPSAwOworCisgICAgICAgIGN2RGVjUmVmRGF0YSggYXJyICk7CisgICAgICAgIGN2RnJlZSggJmFyciApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gQ3JlYXRlcyBhIGNvcHkgb2YgbWF0cml4CitDVl9JTVBMIEN2TWF0KgorY3ZDbG9uZU1hdCggY29uc3QgQ3ZNYXQqIHNyYyApCit7CisgICAgQ3ZNYXQqIGRzdCA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsb25lTWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFDVl9JU19NQVRfSERSKCBzcmMgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkJhZCBDdk1hdCBoZWFkZXIiICk7CisKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkNyZWF0ZU1hdEhlYWRlciggc3JjLT5yb3dzLCBzcmMtPmNvbHMsIHNyYy0+dHlwZSApKTsKKworICAgIGlmKCBzcmMtPmRhdGEucHRyICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2Q3JlYXRlRGF0YSggZHN0ICkpOworICAgICAgICBDVl9DQUxMKCBjdkNvcHkoIHNyYywgZHN0ICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZHN0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdE5EIGNyZWF0aW9uIGFuZCBiYXNpYyBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCBDdk1hdE5EKgorY3ZJbml0TWF0TkRIZWFkZXIoIEN2TWF0TkQqIG1hdCwgaW50IGRpbXMsIGNvbnN0IGludCogc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCB2b2lkKiBkYXRhICkKK3sKKyAgICBDdk1hdE5EKiByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkluaXRNYXROREhlYWRlciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSh0eXBlKTsKKyAgICBpbnQgaTsKKyAgICBpbnQ2NCBzdGVwID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgaWYoICFtYXQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgbWF0cml4IGhlYWRlciBwb2ludGVyIiApOworCisgICAgaWYoIHN0ZXAgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgImludmFsaWQgYXJyYXkgZGF0YSB0eXBlIiApOworCisgICAgaWYoICFzaXplcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCA8c2l6ZXM+IHBvaW50ZXIiICk7CisKKyAgICBpZiggZGltcyA8PSAwIHx8IGRpbXMgPiBDVl9NQVhfRElNICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJub24tcG9zaXRpdmUgb3IgdG9vIGxhcmdlIG51bWJlciBvZiBkaW1lbnNpb25zIiApOworCisgICAgZm9yKCBpID0gZGltcyAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICB7CisgICAgICAgIGlmKCBzaXplc1tpXSA8PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAib25lIG9mIGRpbWVzaW9uIHNpemVzIGlzIG5vbi1wb3NpdGl2ZSIgKTsKKyAgICAgICAgbWF0LT5kaW1baV0uc2l6ZSA9IHNpemVzW2ldOworICAgICAgICBpZiggc3RlcCA+IElOVF9NQVggKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgYXJyYXkgaXMgdG9vIGJpZyIgKTsKKyAgICAgICAgbWF0LT5kaW1baV0uc3RlcCA9IChpbnQpc3RlcDsKKyAgICAgICAgc3RlcCAqPSBzaXplc1tpXTsKKyAgICB9CisKKyAgICBtYXQtPnR5cGUgPSBDVl9NQVRORF9NQUdJQ19WQUwgfCAoc3RlcCA8PSBJTlRfTUFYID8gQ1ZfTUFUX0NPTlRfRkxBRyA6IDApIHwgdHlwZTsKKyAgICBtYXQtPmRpbXMgPSBkaW1zOworICAgIG1hdC0+ZGF0YS5wdHIgPSAodWNoYXIqKWRhdGE7CisgICAgbWF0LT5yZWZjb3VudCA9IDA7CisgICAgbWF0LT5oZHJfcmVmY291bnQgPSAwOworICAgIHJlc3VsdCA9IG1hdDsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgJiYgbWF0ICkKKyAgICB7CisgICAgICAgIG1hdC0+dHlwZSA9IDA7CisgICAgICAgIG1hdC0+ZGF0YS5wdHIgPSAwOworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLy8gQ3JlYXRlcyBDdk1hdE5EIGFuZCB1bmRlcmx5aW5nIGRhdGEKK0NWX0lNUEwgQ3ZNYXRORCoKK2N2Q3JlYXRlTWF0TkQoIGludCBkaW1zLCBjb25zdCBpbnQqIHNpemVzLCBpbnQgdHlwZSApCit7CisgICAgQ3ZNYXRORCogYXJyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVNYXRORCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9DQUxMKCBhcnIgPSBjdkNyZWF0ZU1hdE5ESGVhZGVyKCBkaW1zLCBzaXplcywgdHlwZSApKTsKKyAgICBDVl9DQUxMKCBjdkNyZWF0ZURhdGEoIGFyciApKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdlJlbGVhc2VNYXRORCggJmFyciApOworCisgICAgcmV0dXJuIGFycjsKK30KKworCisvLyBDcmVhdGVzIEN2TWF0TkQgaGVhZGVyIG9ubHkKK0NWX0lNUEwgQ3ZNYXRORCoKK2N2Q3JlYXRlTWF0TkRIZWFkZXIoIGludCBkaW1zLCBjb25zdCBpbnQqIHNpemVzLCBpbnQgdHlwZSApCit7CisgICAgQ3ZNYXRORCogYXJyID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlTWF0TkRIZWFkZXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggZGltcyA8PSAwIHx8IGRpbXMgPiBDVl9NQVhfRElNICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJub24tcG9zaXRpdmUgb3IgdG9vIGxhcmdlIG51bWJlciBvZiBkaW1lbnNpb25zIiApOworCisgICAgQ1ZfQ0FMTCggYXJyID0gKEN2TWF0TkQqKWN2QWxsb2MoIHNpemVvZigqYXJyKSApKTsKKyAgICAKKyAgICBDVl9DQUxMKCBjdkluaXRNYXROREhlYWRlciggYXJyLCBkaW1zLCBzaXplcywgdHlwZSwgMCApKTsKKyAgICBhcnItPmhkcl9yZWZjb3VudCA9IDE7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0TkQoICZhcnIgKTsKKworICAgIHJldHVybiBhcnI7Cit9CisKKworLy8gQ3JlYXRlcyBhIGNvcHkgb2YgbkQgYXJyYXkKK0NWX0lNUEwgQ3ZNYXRORCoKK2N2Q2xvbmVNYXRORCggY29uc3QgQ3ZNYXRORCogc3JjICkKK3sKKyAgICBDdk1hdE5EKiBkc3QgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZDbG9uZU1hdE5EIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksICpzaXplczsKKworICAgIGlmKCAhQ1ZfSVNfTUFUTkRfSERSKCBzcmMgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkJhZCBDdk1hdE5EIGhlYWRlciIgKTsKKworICAgIHNpemVzID0gKGludCopYWxsb2NhKCBzcmMtPmRpbXMqc2l6ZW9mKHNpemVzWzBdKSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNyYy0+ZGltczsgaSsrICkKKyAgICAgICAgc2l6ZXNbaV0gPSBzcmMtPmRpbVtpXS5zaXplOworCisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZDcmVhdGVNYXROREhlYWRlciggc3JjLT5kaW1zLCBzaXplcywgc3JjLT50eXBlICkpOworCisgICAgaWYoIHNyYy0+ZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDcmVhdGVEYXRhKCBkc3QgKSk7CisgICAgICAgIENWX0NBTEwoIGN2Q29weSggc3JjLCBkc3QgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBkc3Q7Cit9CisKKworc3RhdGljIEN2TWF0TkQqCitjdkdldE1hdE5EKCBjb25zdCBDdkFyciogYXJyLCBDdk1hdE5EKiBtYXRuZCwgaW50KiBjb2kgKQoreworICAgIEN2TWF0TkQqIHJlc3VsdCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldE1hdE5EIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoIGNvaSApCisgICAgICAgICpjb2kgPSAwOworCisgICAgaWYoICFtYXRuZCB8fCAhYXJyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGFycmF5IHBvaW50ZXIgaXMgcGFzc2VkIiApOworCisgICAgaWYoIENWX0lTX01BVE5EX0hEUihhcnIpKQorICAgIHsKKyAgICAgICAgaWYoICEoKEN2TWF0TkQqKWFyciktPmRhdGEucHRyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIG1hdHJpeCBoYXMgTlVMTCBkYXRhIHBvaW50ZXIiICk7CisgICAgICAgIAorICAgICAgICByZXN1bHQgPSAoQ3ZNYXRORCopYXJyOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisgICAgICAgIAorICAgICAgICBpZiggQ1ZfSVNfSU1BR0VfSERSKCBtYXQgKSkKKyAgICAgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCBjb2kgKSk7CisKKyAgICAgICAgaWYoICFDVl9JU19NQVRfSERSKCBtYXQgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbnJlY29nbml6ZWQgb3IgdW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhbWF0LT5kYXRhLnB0ciApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIklucHV0IGFycmF5IGhhcyBOVUxMIGRhdGEgcG9pbnRlciIgKTsKKworICAgICAgICBtYXRuZC0+ZGF0YS5wdHIgPSBtYXQtPmRhdGEucHRyOworICAgICAgICBtYXRuZC0+cmVmY291bnQgPSAwOworICAgICAgICBtYXRuZC0+aGRyX3JlZmNvdW50ID0gMDsKKyAgICAgICAgbWF0bmQtPnR5cGUgPSBtYXQtPnR5cGU7CisgICAgICAgIG1hdG5kLT5kaW1zID0gMjsKKyAgICAgICAgbWF0bmQtPmRpbVswXS5zaXplID0gbWF0LT5yb3dzOworICAgICAgICBtYXRuZC0+ZGltWzBdLnN0ZXAgPSBtYXQtPnN0ZXA7CisgICAgICAgIG1hdG5kLT5kaW1bMV0uc2l6ZSA9IG1hdC0+Y29sczsKKyAgICAgICAgbWF0bmQtPmRpbVsxXS5zdGVwID0gQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSk7CisgICAgICAgIHJlc3VsdCA9IG1hdG5kOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8vIHJldHVybnMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdG8gaXRlcmF0ZS4KKy8qCitDaGVja3Mgd2hldGhlciA8Y291bnQ+IGFycmF5cyBoYXZlIGVxdWFsIHR5cGUsIHNpemVzIChtYXNrIGlzIG9wdGlvbmFsIGFycmF5Cit0aGF0IG5lZWRzIHRvIGhhdmUgdGhlIHNhbWUgc2l6ZSwgYnV0IDh1QzEgb3IgOHNDMSB0eXBlKS4KK1JldHVybnMgbnVtYmVyIG9mIGRpbWVuc2lvbnMgdG8gaXRlcmF0ZSB0aHJvdWdoOgorMCBtZWFucyB0aGF0IGFsbCBhcnJheXMgYXJlIGNvbnRpbnVvdXMsCisxIG1lYW5zIHRoYXQgYWxsIGFycmF5cyBhcmUgdmVjdG9ycyBvZiBjb250aW51b3VzIGFycmF5cyBldGMuCithbmQgdGhlIHNpemUgb2YgbGFyZ2VzdCBjb21tb24gY29udGludW91cyBwYXJ0IG9mIHRoZSBhcnJheXMgCisqLworQ1ZfSU1QTCBpbnQKK2N2SW5pdE5BcnJheUl0ZXJhdG9yKCBpbnQgY291bnQsIEN2QXJyKiogYXJycywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogbWFzaywgQ3ZNYXRORCogc3R1YnMsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciogaXRlcmF0b3IsIGludCBmbGFncyApCit7CisgICAgaW50IGRpbXMgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZJbml0QXJyYXlPcCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiwgc2l6ZSwgZGltMCA9IC0xOworICAgIGludDY0IHN0ZXA7CisgICAgQ3ZNYXRORCogaGRyMCA9IDA7CisKKyAgICBpZiggY291bnQgPCAxIHx8IGNvdW50ID4gQ1ZfTUFYX0FSUiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiSW5jb3JyZWN0IG51bWJlciBvZiBhcnJheXMiICk7CisKKyAgICBpZiggIWFycnMgfHwgIXN0dWJzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJTb21lIG9mIHJlcXVpcmVkIGFycmF5IHBvaW50ZXJzIGlzIE5VTEwiICk7CisKKyAgICBpZiggIWl0ZXJhdG9yICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJJdGVyYXRvciBwb2ludGVyIGlzIE5VTEwiICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZBcnIqIGFyciA9IGkgPCBjb3VudCA/IGFycnNbaV0gOiBtYXNrOworICAgICAgICBDdk1hdE5EKiBoZHI7CisgICAgICAgIAorICAgICAgICBpZiggIWFyciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpIDwgY291bnQgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiU29tZSBvZiByZXF1aXJlZCBhcnJheSBwb2ludGVycyBpcyBOVUxMIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoIGFyciApKQorICAgICAgICAgICAgaGRyID0gKEN2TWF0TkQqKWFycjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgICAgIENWX0NBTEwoIGhkciA9IGN2R2V0TWF0TkQoIGFyciwgc3R1YnMgKyBpLCAmY29pICkpOworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIHNldCBpcyBub3QgYWxsb3dlZCBoZXJlIiApOworICAgICAgICB9CisKKyAgICAgICAgaXRlcmF0b3ItPmhkcltpXSA9IGhkcjsKKworICAgICAgICBpZiggaSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaGRyLT5kaW1zICE9IGhkcjAtPmRpbXMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bWJlciBvZiBkaW1lbnNpb25zIGlzIHRoZSBzYW1lIGZvciBhbGwgYXJyYXlzIiApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggaSA8IGNvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2goIGZsYWdzICYgKENWX05PX0RFUFRIX0NIRUNLfENWX05PX0NOX0NIRUNLKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggaGRyLCBoZHIwICkpCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGF0YSB0eXBlIGlzIG5vdCB0aGUgc2FtZSBmb3IgYWxsIGFycmF5cyIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDVl9OT19ERVBUSF9DSEVDSzoKKyAgICAgICAgICAgICAgICAgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBoZHIsIGhkcjAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgY2hhbm5lbHMgaXMgbm90IHRoZSBzYW1lIGZvciBhbGwgYXJyYXlzIiApOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENWX05PX0NOX0NIRUNLOgorICAgICAgICAgICAgICAgICAgICBpZiggIUNWX0FSRV9DTlNfRVEoIGhkciwgaGRyMCApKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRlcHRoIGlzIG5vdCB0aGUgc2FtZSBmb3IgYWxsIGFycmF5cyIgKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIGhkciApKQorICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIk1hc2sgc2hvdWxkIGhhdmUgOHVDMSBvciA4c0MxIGRhdGEgdHlwZSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9OT19TSVpFX0NIRUNLKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGhkci0+ZGltczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgaWYoIGhkci0+ZGltW2pdLnNpemUgIT0gaGRyMC0+ZGltW2pdLnNpemUgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEaW1lbnNpb24gc2l6ZXMgYXJlIHRoZSBzYW1lIGZvciBhbGwgYXJyYXlzIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhkcjAgPSBoZHI7CisKKyAgICAgICAgc3RlcCA9IENWX0VMRU1fU0laRShoZHItPnR5cGUpOworICAgICAgICBmb3IoIGogPSBoZHItPmRpbXMgLSAxOyBqID4gZGltMDsgai0tICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0ZXAgIT0gaGRyLT5kaW1bal0uc3RlcCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBzdGVwICo9IGhkci0+ZGltW2pdLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZiggaiA9PSBkaW0wICYmIHN0ZXAgPiBJTlRfTUFYICkKKyAgICAgICAgICAgIGorKzsKKworICAgICAgICBpZiggaiA+IGRpbTAgKQorICAgICAgICAgICAgZGltMCA9IGo7CisKKyAgICAgICAgaXRlcmF0b3ItPmhkcltpXSA9IChDdk1hdE5EKiloZHI7CisgICAgICAgIGl0ZXJhdG9yLT5wdHJbaV0gPSAodWNoYXIqKWhkci0+ZGF0YS5wdHI7CisgICAgfQorCisgICAgc2l6ZSA9IDE7CisgICAgZm9yKCBqID0gaGRyMC0+ZGltcyAtIDE7IGogPiBkaW0wOyBqLS0gKQorICAgICAgICBzaXplICo9IGhkcjAtPmRpbVtqXS5zaXplOworCisgICAgZGltcyA9IGRpbTAgKyAxOworICAgIGl0ZXJhdG9yLT5kaW1zID0gZGltczsKKyAgICBpdGVyYXRvci0+Y291bnQgPSBjb3VudDsKKyAgICBpdGVyYXRvci0+c2l6ZSA9IGN2U2l6ZShzaXplLDEpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgIGl0ZXJhdG9yLT5zdGFja1tpXSA9IGhkcjAtPmRpbVtpXS5zaXplOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBkaW1zOworfQorCisKKy8vIHJldHVybnMgemVybyB2YWx1ZSBpZiBpdGVyYXRpb24gaXMgZmluaXNoZWQsIG5vbi16ZXJvIG90aGVyd2lzZQorQ1ZfSU1QTCAgaW50ICBjdk5leHROQXJyYXlTbGljZSggQ3ZOQXJyYXlJdGVyYXRvciogaXRlcmF0b3IgKQoreworICAgIGFzc2VydCggaXRlcmF0b3IgIT0gMCApOworICAgIGludCBpLCBkaW1zLCBzaXplID0gMDsKKworICAgIGZvciggZGltcyA9IGl0ZXJhdG9yLT5kaW1zOyBkaW1zID4gMDsgZGltcy0tICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpdGVyYXRvci0+Y291bnQ7IGkrKyApCisgICAgICAgICAgICBpdGVyYXRvci0+cHRyW2ldICs9IGl0ZXJhdG9yLT5oZHJbaV0tPmRpbVtkaW1zLTFdLnN0ZXA7CisKKyAgICAgICAgaWYoIC0taXRlcmF0b3ItPnN0YWNrW2RpbXMtMV0gPiAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHNpemUgPSBpdGVyYXRvci0+aGRyWzBdLT5kaW1bZGltcy0xXS5zaXplOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpdGVyYXRvci0+Y291bnQ7IGkrKyApCisgICAgICAgICAgICBpdGVyYXRvci0+cHRyW2ldIC09IChzaXplX3Qpc2l6ZSppdGVyYXRvci0+aGRyW2ldLT5kaW1bZGltcy0xXS5zdGVwOworCisgICAgICAgIGl0ZXJhdG9yLT5zdGFja1tkaW1zLTFdID0gc2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZGltcyA+IDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3BhcnNlTWF0IGNyZWF0aW9uIGFuZCBiYXNpYyBvcGVyYXRpb25zICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8vIENyZWF0ZXMgQ3ZNYXRORCBhbmQgdW5kZXJseWluZyBkYXRhCitDVl9JTVBMIEN2U3BhcnNlTWF0KgorY3ZDcmVhdGVTcGFyc2VNYXQoIGludCBkaW1zLCBjb25zdCBpbnQqIHNpemVzLCBpbnQgdHlwZSApCit7CisgICAgQ3ZTcGFyc2VNYXQqIGFyciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlU3BhcnNlTWF0IiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggdHlwZSApOworICAgIGludCBwaXhfc2l6ZTEgPSBDVl9FTEVNX1NJWkUxKHR5cGUpOworICAgIGludCBwaXhfc2l6ZSA9IHBpeF9zaXplMSpDVl9NQVRfQ04odHlwZSk7CisgICAgaW50IGksIHNpemU7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlOworCisgICAgaWYoIHBpeF9zaXplID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJpbnZhbGlkIGFycmF5IGRhdGEgdHlwZSIgKTsKKworICAgIGlmKCBkaW1zIDw9IDAgfHwgZGltcyA+IENWX01BWF9ESU1fSEVBUCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiYmFkIG51bWJlciBvZiBkaW1lbnNpb25zIiApOworCisgICAgaWYoICFzaXplcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCA8c2l6ZXM+IHBvaW50ZXIiICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGltczsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBzaXplc1tpXSA8PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAib25lIG9mIGRpbWVzaW9uIHNpemVzIGlzIG5vbi1wb3NpdGl2ZSIgKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBhcnIgPSAoQ3ZTcGFyc2VNYXQqKWN2QWxsb2Moc2l6ZW9mKCphcnIpK01BWCgwLGRpbXMtQ1ZfTUFYX0RJTSkqc2l6ZW9mKGFyci0+c2l6ZVswXSkpKTsKKworICAgIGFyci0+dHlwZSA9IENWX1NQQVJTRV9NQVRfTUFHSUNfVkFMIHwgdHlwZTsKKyAgICBhcnItPmRpbXMgPSBkaW1zOworICAgIGFyci0+cmVmY291bnQgPSAwOworICAgIGFyci0+aGRyX3JlZmNvdW50ID0gMTsKKyAgICBtZW1jcHkoIGFyci0+c2l6ZSwgc2l6ZXMsIGRpbXMqc2l6ZW9mKHNpemVzWzBdKSk7CisKKyAgICBhcnItPnZhbG9mZnNldCA9IChpbnQpY3ZBbGlnbihzaXplb2YoQ3ZTcGFyc2VOb2RlKSwgcGl4X3NpemUxKTsKKyAgICBhcnItPmlkeG9mZnNldCA9IChpbnQpY3ZBbGlnbihhcnItPnZhbG9mZnNldCArIHBpeF9zaXplLCBzaXplb2YoaW50KSk7CisgICAgc2l6ZSA9IChpbnQpY3ZBbGlnbihhcnItPmlkeG9mZnNldCArIGRpbXMqc2l6ZW9mKGludCksIHNpemVvZihDdlNldEVsZW0pKTsKKworICAgIENWX0NBTEwoIHN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIENWX1NQQVJTRV9NQVRfQkxPQ0sgKSk7CisgICAgQ1ZfQ0FMTCggYXJyLT5oZWFwID0gY3ZDcmVhdGVTZXQoIDAsIHNpemVvZihDdlNldCksIHNpemUsIHN0b3JhZ2UgKSk7CisKKyAgICBhcnItPmhhc2hzaXplID0gQ1ZfU1BBUlNFX0hBU0hfU0laRTA7CisgICAgc2l6ZSA9IGFyci0+aGFzaHNpemUqc2l6ZW9mKGFyci0+aGFzaHRhYmxlWzBdKTsKKyAgICAKKyAgICBDVl9DQUxMKCBhcnItPmhhc2h0YWJsZSA9ICh2b2lkKiopY3ZBbGxvYyggc2l6ZSApKTsKKyAgICBtZW1zZXQoIGFyci0+aGFzaHRhYmxlLCAwLCBzaXplICk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlU3BhcnNlTWF0KCAmYXJyICk7CisKKyAgICByZXR1cm4gYXJyOworfQorCisKKy8vIENyZWF0ZXMgQ3ZNYXRORCBhbmQgdW5kZXJseWluZyBkYXRhCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZVNwYXJzZU1hdCggQ3ZTcGFyc2VNYXQqKiBhcnJheSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VTcGFyc2VNYXQiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFhcnJheSApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfSGVhZGVySXNOdWxsICk7CisKKyAgICBpZiggKmFycmF5ICkKKyAgICB7CisgICAgICAgIEN2U3BhcnNlTWF0KiBhcnIgPSAqYXJyYXk7CisgICAgICAgIAorICAgICAgICBpZiggIUNWX0lTX1NQQVJTRV9NQVRfSERSKGFycikgKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNCYWRGbGFnICk7CisKKyAgICAgICAgKmFycmF5ID0gMDsKKworICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmYXJyLT5oZWFwLT5zdG9yYWdlICk7CisgICAgICAgIGN2RnJlZSggJmFyci0+aGFzaHRhYmxlICk7CisgICAgICAgIGN2RnJlZSggJmFyciApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gQ3JlYXRlcyBDdk1hdE5EIGFuZCB1bmRlcmx5aW5nIGRhdGEKK0NWX0lNUEwgQ3ZTcGFyc2VNYXQqCitjdkNsb25lU3BhcnNlTWF0KCBjb25zdCBDdlNwYXJzZU1hdCogc3JjICkKK3sKKyAgICBDdlNwYXJzZU1hdCogZHN0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2Q2xvbmVTcGFyc2VNYXQiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUX0hEUihzcmMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgc3BhcnNlIGFycmF5IGhlYWRlciIgKTsKKworICAgIENWX0NBTEwoIGRzdCA9IGN2Q3JlYXRlU3BhcnNlTWF0KCBzcmMtPmRpbXMsIHNyYy0+c2l6ZSwgc3JjLT50eXBlICkpOworICAgIENWX0NBTEwoIGN2Q29weSggc3JjLCBkc3QgKSk7IAorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2UmVsZWFzZVNwYXJzZU1hdCggJmRzdCApOworICAgIAorICAgIHJldHVybiBkc3Q7Cit9CisKKworQ3ZTcGFyc2VOb2RlKgorY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IoIGNvbnN0IEN2U3BhcnNlTWF0KiBtYXQsIEN2U3BhcnNlTWF0SXRlcmF0b3IqIGl0ZXJhdG9yICkKK3sKKyAgICBDdlNwYXJzZU5vZGUqIG5vZGUgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZJbml0U3BhcnNlTWF0SXRlcmF0b3IiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaWR4OworCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBtYXQgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgc3BhcnNlIG1hdHJpeCBoZWFkZXIiICk7CisKKyAgICBpZiggIWl0ZXJhdG9yICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGl0ZXJhdG9yIHBvaW50ZXIiICk7CisKKyAgICBpdGVyYXRvci0+bWF0ID0gKEN2U3BhcnNlTWF0KiltYXQ7CisgICAgaXRlcmF0b3ItPm5vZGUgPSAwOworCisgICAgZm9yKCBpZHggPSAwOyBpZHggPCBtYXQtPmhhc2hzaXplOyBpZHgrKyApCisgICAgICAgIGlmKCBtYXQtPmhhc2h0YWJsZVtpZHhdICkKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZSA9IGl0ZXJhdG9yLT5ub2RlID0gKEN2U3BhcnNlTm9kZSopbWF0LT5oYXNodGFibGVbaWR4XTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICBpdGVyYXRvci0+Y3VyaWR4ID0gaWR4OworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBub2RlOworfQorCisjZGVmaW5lIElDVl9TUEFSU0VfTUFUX0hBU0hfTVVMVElQTElFUiAgMzMKKworc3RhdGljIHVjaGFyKgoraWN2R2V0Tm9kZVB0ciggQ3ZTcGFyc2VNYXQqIG1hdCwgY29uc3QgaW50KiBpZHgsIGludCogX3R5cGUsCisgICAgICAgICAgICAgICBpbnQgY3JlYXRlX25vZGUsIHVuc2lnbmVkKiBwcmVjYWxjX2hhc2h2YWwgKQoreworICAgIHVjaGFyKiBwdHIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiaWN2R2V0Tm9kZVB0ciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCB0YWJpZHg7CisgICAgdW5zaWduZWQgaGFzaHZhbCA9IDA7CisgICAgQ3ZTcGFyc2VOb2RlICpub2RlOworICAgIGFzc2VydCggQ1ZfSVNfU1BBUlNFX01BVCggbWF0ICkpOworCisgICAgaWYoICFwcmVjYWxjX2hhc2h2YWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1hdC0+ZGltczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBpZHhbaV07CisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXQgPj0gKHVuc2lnbmVkKW1hdC0+c2l6ZVtpXSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJPbmUgb2YgaW5kaWNlcyBpcyBvdXQgb2YgcmFuZ2UiICk7CisgICAgICAgICAgICBoYXNodmFsID0gaGFzaHZhbCpJQ1ZfU1BBUlNFX01BVF9IQVNIX01VTFRJUExJRVIgKyB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhhc2h2YWwgPSAqcHJlY2FsY19oYXNodmFsOworICAgIH0KKworICAgIHRhYmlkeCA9IGhhc2h2YWwgJiAobWF0LT5oYXNoc2l6ZSAtIDEpOworICAgIGhhc2h2YWwgJj0gSU5UX01BWDsKKworICAgIGZvciggbm9kZSA9IChDdlNwYXJzZU5vZGUqKW1hdC0+aGFzaHRhYmxlW3RhYmlkeF07CisgICAgICAgICBub2RlICE9IDA7IG5vZGUgPSBub2RlLT5uZXh0ICkKKyAgICB7CisgICAgICAgIGlmKCBub2RlLT5oYXNodmFsID09IGhhc2h2YWwgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQqIG5vZGVpZHggPSBDVl9OT0RFX0lEWChtYXQsbm9kZSk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbWF0LT5kaW1zOyBpKysgKQorICAgICAgICAgICAgICAgIGlmKCBpZHhbaV0gIT0gbm9kZWlkeFtpXSApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYoIGkgPT0gbWF0LT5kaW1zICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwdHIgPSAodWNoYXIqKUNWX05PREVfVkFMKG1hdCxub2RlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAhcHRyICYmIGNyZWF0ZV9ub2RlICkKKyAgICB7CisgICAgICAgIGlmKCBtYXQtPmhlYXAtPmFjdGl2ZV9jb3VudCA+PSBtYXQtPmhhc2hzaXplKkNWX1NQQVJTRV9IQVNIX1JBVElPICkKKyAgICAgICAgeworICAgICAgICAgICAgdm9pZCoqIG5ld3RhYmxlOworICAgICAgICAgICAgaW50IG5ld3NpemUgPSBNQVgoIG1hdC0+aGFzaHNpemUqMiwgQ1ZfU1BBUlNFX0hBU0hfU0laRTApOworICAgICAgICAgICAgaW50IG5ld3Jhd3NpemUgPSBuZXdzaXplKnNpemVvZihuZXd0YWJsZVswXSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIEN2U3BhcnNlTWF0SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBhc3NlcnQoIChuZXdzaXplICYgKG5ld3NpemUgLSAxKSkgPT0gMCApOworCisgICAgICAgICAgICAvLyByZXNpemUgaGFzaCB0YWJsZQorICAgICAgICAgICAgQ1ZfQ0FMTCggbmV3dGFibGUgPSAodm9pZCoqKWN2QWxsb2MoIG5ld3Jhd3NpemUgKSk7CisgICAgICAgICAgICBtZW1zZXQoIG5ld3RhYmxlLCAwLCBuZXdyYXdzaXplICk7CisKKyAgICAgICAgICAgIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggbWF0LCAmaXRlcmF0b3IgKTsKKyAgICAgICAgICAgIHdoaWxlKCBub2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlNwYXJzZU5vZGUqIG5leHQgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKTsKKyAgICAgICAgICAgICAgICBpbnQgbmV3aWR4ID0gbm9kZS0+aGFzaHZhbCAmIChuZXdzaXplIC0gMSk7CisgICAgICAgICAgICAgICAgbm9kZS0+bmV4dCA9IChDdlNwYXJzZU5vZGUqKW5ld3RhYmxlW25ld2lkeF07CisgICAgICAgICAgICAgICAgbmV3dGFibGVbbmV3aWR4XSA9IG5vZGU7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2RnJlZSggJm1hdC0+aGFzaHRhYmxlICk7CisgICAgICAgICAgICBtYXQtPmhhc2h0YWJsZSA9IG5ld3RhYmxlOworICAgICAgICAgICAgbWF0LT5oYXNoc2l6ZSA9IG5ld3NpemU7CisgICAgICAgICAgICB0YWJpZHggPSBoYXNodmFsICYgKG5ld3NpemUgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUgPSAoQ3ZTcGFyc2VOb2RlKiljdlNldE5ldyggbWF0LT5oZWFwICk7CisgICAgICAgIG5vZGUtPmhhc2h2YWwgPSBoYXNodmFsOworICAgICAgICBub2RlLT5uZXh0ID0gKEN2U3BhcnNlTm9kZSopbWF0LT5oYXNodGFibGVbdGFiaWR4XTsKKyAgICAgICAgbWF0LT5oYXNodGFibGVbdGFiaWR4XSA9IG5vZGU7CisgICAgICAgIENWX01FTUNQWV9JTlQoIENWX05PREVfSURYKG1hdCxub2RlKSwgaWR4LCBtYXQtPmRpbXMgKTsKKyAgICAgICAgcHRyID0gKHVjaGFyKilDVl9OT0RFX1ZBTChtYXQsbm9kZSk7CisgICAgICAgIGlmKCBjcmVhdGVfbm9kZSA+IDAgKQorICAgICAgICAgICAgQ1ZfWkVST19DSEFSKCBwdHIsIENWX0VMRU1fU0laRShtYXQtPnR5cGUpKTsKKyAgICB9CisKKyAgICBpZiggX3R5cGUgKQorICAgICAgICAqX3R5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkRlbGV0ZU5vZGUoIEN2U3BhcnNlTWF0KiBtYXQsIGNvbnN0IGludCogaWR4LCB1bnNpZ25lZCogcHJlY2FsY19oYXNodmFsICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkRlbGV0ZU5vZGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgdGFiaWR4OworICAgIHVuc2lnbmVkIGhhc2h2YWwgPSAwOworICAgIEN2U3BhcnNlTm9kZSAqbm9kZSwgKnByZXYgPSAwOworICAgIGFzc2VydCggQ1ZfSVNfU1BBUlNFX01BVCggbWF0ICkpOworCisgICAgaWYoICFwcmVjYWxjX2hhc2h2YWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1hdC0+ZGltczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBpZHhbaV07CisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXQgPj0gKHVuc2lnbmVkKW1hdC0+c2l6ZVtpXSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJPbmUgb2YgaW5kaWNlcyBpcyBvdXQgb2YgcmFuZ2UiICk7CisgICAgICAgICAgICBoYXNodmFsID0gaGFzaHZhbCpJQ1ZfU1BBUlNFX01BVF9IQVNIX01VTFRJUExJRVIgKyB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGhhc2h2YWwgPSAqcHJlY2FsY19oYXNodmFsOworICAgIH0KKworICAgIHRhYmlkeCA9IGhhc2h2YWwgJiAobWF0LT5oYXNoc2l6ZSAtIDEpOworICAgIGhhc2h2YWwgJj0gSU5UX01BWDsKKworICAgIGZvciggbm9kZSA9IChDdlNwYXJzZU5vZGUqKW1hdC0+aGFzaHRhYmxlW3RhYmlkeF07CisgICAgICAgICBub2RlICE9IDA7IHByZXYgPSBub2RlLCBub2RlID0gbm9kZS0+bmV4dCApCisgICAgeworICAgICAgICBpZiggbm9kZS0+aGFzaHZhbCA9PSBoYXNodmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50KiBub2RlaWR4ID0gQ1ZfTk9ERV9JRFgobWF0LG5vZGUpOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1hdC0+ZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICBpZiggaWR4W2ldICE9IG5vZGVpZHhbaV0gKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKCBpID09IG1hdC0+ZGltcyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggbm9kZSApCisgICAgeworICAgICAgICBpZiggcHJldiApCisgICAgICAgICAgICBwcmV2LT5uZXh0ID0gbm9kZS0+bmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbWF0LT5oYXNodGFibGVbdGFiaWR4XSA9IG5vZGUtPm5leHQ7CisgICAgICAgIGN2U2V0UmVtb3ZlQnlQdHIoIG1hdC0+aGVhcCwgbm9kZSApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbiBmb3IgbXVsdGlwbGUgYXJyYXkgdHlwZXMgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIEFsbG9jYXRlcyB1bmRlcmx5aW5nIGFycmF5IGRhdGEKK0NWX0lNUEwgdm9pZAorY3ZDcmVhdGVEYXRhKCBDdkFyciogYXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlRGF0YSIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfSVNfTUFUX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBzaXplX3Qgc3RlcCwgdG90YWxfc2l6ZTsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworICAgICAgICBzdGVwID0gbWF0LT5zdGVwOworCisgICAgICAgIGlmKCBtYXQtPmRhdGEucHRyICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiRGF0YSBpcyBhbHJlYWR5IGFsbG9jYXRlZCIgKTsKKworICAgICAgICBpZiggc3RlcCA9PSAwICkKKyAgICAgICAgICAgIHN0ZXAgPSBDVl9FTEVNX1NJWkUobWF0LT50eXBlKSptYXQtPmNvbHM7CisKKyAgICAgICAgdG90YWxfc2l6ZSA9IHN0ZXAqbWF0LT5yb3dzICsgc2l6ZW9mKGludCkgKyBDVl9NQUxMT0NfQUxJR047CisgICAgICAgIENWX0NBTEwoIG1hdC0+cmVmY291bnQgPSAoaW50KiljdkFsbG9jKCAoc2l6ZV90KXRvdGFsX3NpemUgKSk7CisgICAgICAgIG1hdC0+ZGF0YS5wdHIgPSAodWNoYXIqKWN2QWxpZ25QdHIoIG1hdC0+cmVmY291bnQgKyAxLCBDVl9NQUxMT0NfQUxJR04gKTsKKyAgICAgICAgKm1hdC0+cmVmY291bnQgPSAxOworICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19JTUFHRV9IRFIoYXJyKSkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKWFycjsKKworICAgICAgICBpZiggaW1nLT5pbWFnZURhdGEgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJEYXRhIGlzIGFscmVhZHkgYWxsb2NhdGVkIiApOworCisgICAgICAgIGlmKCAhQ3ZJUEwuYWxsb2NhdGVEYXRhICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggaW1nLT5pbWFnZURhdGEgPSBpbWctPmltYWdlRGF0YU9yaWdpbiA9IAorICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKWN2QWxsb2MoIChzaXplX3QpaW1nLT5pbWFnZVNpemUgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGVwdGggPSBpbWctPmRlcHRoOworICAgICAgICAgICAgaW50IHdpZHRoID0gaW1nLT53aWR0aDsKKworICAgICAgICAgICAgaWYoIGltZy0+ZGVwdGggPT0gSVBMX0RFUFRIXzMyRiB8fCBpbWctPm5DaGFubmVscyA9PSA2NCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW1nLT53aWR0aCAqPSBpbWctPmRlcHRoID09IElQTF9ERVBUSF8zMkYgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgaW1nLT5kZXB0aCA9IElQTF9ERVBUSF84VTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ3ZJUEwuYWxsb2NhdGVEYXRhKCBpbWcsIDAsIDAgKTsKKworICAgICAgICAgICAgaW1nLT53aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgaW1nLT5kZXB0aCA9IGRlcHRoOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX01BVE5EX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBDdk1hdE5EKiBtYXQgPSAoQ3ZNYXRORCopYXJyOworICAgICAgICBpbnQgaTsKKyAgICAgICAgc2l6ZV90IHRvdGFsX3NpemUgPSBDVl9FTEVNX1NJWkUobWF0LT50eXBlKTsKKworICAgICAgICBpZiggbWF0LT5kYXRhLnB0ciAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIkRhdGEgaXMgYWxyZWFkeSBhbGxvY2F0ZWQiICk7CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgdG90YWxfc2l6ZSA9IChzaXplX3QpbWF0LT5kaW1bMF0uc2l6ZSoobWF0LT5kaW1bMF0uc3RlcCAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXQtPmRpbVswXS5zdGVwIDogdG90YWxfc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSBtYXQtPmRpbXMgLSAxOyBpID49IDA7IGktLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAoc2l6ZV90KW1hdC0+ZGltW2ldLnN0ZXAqbWF0LT5kaW1baV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmKCB0b3RhbF9zaXplIDwgc2l6ZSApCisgICAgICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgPSBzaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBtYXQtPnJlZmNvdW50ID0gKGludCopY3ZBbGxvYyggdG90YWxfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludCkgKyBDVl9NQUxMT0NfQUxJR04gKSk7CisgICAgICAgIG1hdC0+ZGF0YS5wdHIgPSAodWNoYXIqKWN2QWxpZ25QdHIoIG1hdC0+cmVmY291bnQgKyAxLCBDVl9NQUxMT0NfQUxJR04gKTsKKyAgICAgICAgKm1hdC0+cmVmY291bnQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAidW5yZWNvZ25pemVkIG9yIHVuc3VwcG9ydGVkIGFycmF5IHR5cGUiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvLyBBc3NpZ25zIGV4dGVybmFsIGRhdGEgdG8gYXJyYXkKK0NWX0lNUEwgdm9pZAorY3ZTZXREYXRhKCBDdkFyciogYXJyLCB2b2lkKiBkYXRhLCBpbnQgc3RlcCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlNldERhdGEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgcGl4X3NpemUsIG1pbl9zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9IRFIoYXJyKSB8fCBDVl9JU19NQVRORF9IRFIoYXJyKSApCisgICAgICAgIGN2UmVsZWFzZURhdGEoIGFyciApOworCisgICAgaWYoIENWX0lTX01BVF9IRFIoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworICAgIAorICAgICAgICBpbnQgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgICAgICBtaW5fc3RlcCA9IG1hdC0+Y29scypwaXhfc2l6ZSAmICgobWF0LT5yb3dzIDw9IDEpIC0gMSk7CisKKyAgICAgICAgaWYoIHN0ZXAgIT0gQ1ZfQVVUT1NURVAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RlcCA8IG1pbl9zdGVwICYmIGRhdGEgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9CYWRTdGVwICk7CisgICAgICAgICAgICBtYXQtPnN0ZXAgPSBzdGVwICYgKChtYXQtPnJvd3MgPD0gMSkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdC0+c3RlcCA9IG1pbl9zdGVwOworICAgICAgICB9CisKKyAgICAgICAgbWF0LT5kYXRhLnB0ciA9ICh1Y2hhciopZGF0YTsKKyAgICAgICAgbWF0LT50eXBlID0gQ1ZfTUFUX01BR0lDX1ZBTCB8IHR5cGUgfAorICAgICAgICAgICAgICAgICAgICAobWF0LT5zdGVwPT1taW5fc3RlcCA/IENWX01BVF9DT05UX0ZMQUcgOiAwKTsKKyAgICAgICAgaWN2Q2hlY2tIdWdlKCBtYXQgKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfSU1BR0VfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKWFycjsKKyAgICAKKyAgICAgICAgcGl4X3NpemUgPSAoKGltZy0+ZGVwdGggJiAyNTUpID4+IDMpKmltZy0+bkNoYW5uZWxzOworICAgICAgICBtaW5fc3RlcCA9IGltZy0+d2lkdGgqcGl4X3NpemU7CisKKyAgICAgICAgaWYoIHN0ZXAgIT0gQ1ZfQVVUT1NURVAgJiYgaW1nLT5oZWlnaHQgPiAxICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHN0ZXAgPCBtaW5fc3RlcCAmJiBkYXRhICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfQmFkU3RlcCApOworICAgICAgICAgICAgaW1nLT53aWR0aFN0ZXAgPSBzdGVwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW1nLT53aWR0aFN0ZXAgPSBtaW5fc3RlcDsKKyAgICAgICAgfQorCisgICAgICAgIGltZy0+aW1hZ2VTaXplID0gaW1nLT53aWR0aFN0ZXAgKiBpbWctPmhlaWdodDsKKyAgICAgICAgaW1nLT5pbWFnZURhdGEgPSBpbWctPmltYWdlRGF0YU9yaWdpbiA9IChjaGFyKilkYXRhOworCisgICAgICAgIGlmKCAoKChpbnQpKHNpemVfdClkYXRhIHwgc3RlcCkgJiA3KSA9PSAwICYmCisgICAgICAgICAgICBjdkFsaWduKGltZy0+d2lkdGggKiBwaXhfc2l6ZSwgOCkgPT0gc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGltZy0+YWxpZ24gPSA4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW1nLT5hbGlnbiA9IDQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkRfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQ2NCBjdXJfc3RlcDsKKyAgICAKKyAgICAgICAgaWYoIHN0ZXAgIT0gQ1ZfQVVUT1NURVAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZFN0ZXAsCisgICAgICAgICAgICAiRm9yIG11bHRpZGltZW5zaW9uYWwgYXJyYXkgb25seSBDVl9BVVRPU1RFUCBpcyBhbGxvd2VkIGhlcmUiICk7CisKKyAgICAgICAgbWF0LT5kYXRhLnB0ciA9ICh1Y2hhciopZGF0YTsKKyAgICAgICAgY3VyX3N0ZXAgPSBDVl9FTEVNX1NJWkUobWF0LT50eXBlKTsKKworICAgICAgICBmb3IoIGkgPSBtYXQtPmRpbXMgLSAxOyBpID49IDA7IGktLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjdXJfc3RlcCA+IElOVF9NQVggKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIGFycmF5IGlzIHRvbyBiaWciICk7CisgICAgICAgICAgICBtYXQtPmRpbVtpXS5zdGVwID0gKGludCljdXJfc3RlcDsKKyAgICAgICAgICAgIGN1cl9zdGVwICo9IG1hdC0+ZGltW2ldLnNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gRGVhbGxvY2F0ZXMgYXJyYXkncyBkYXRhCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZURhdGEoIEN2QXJyKiBhcnIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlRGF0YSIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfSVNfTUFUX0hEUiggYXJyICkgfHwgQ1ZfSVNfTUFUTkRfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICAgICAgY3ZEZWNSZWZEYXRhKCBtYXQgKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfSU1BR0VfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKWFycjsKKworICAgICAgICBpZiggIUN2SVBMLmRlYWxsb2NhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyKiBwdHIgPSBpbWctPmltYWdlRGF0YU9yaWdpbjsKKyAgICAgICAgICAgIGltZy0+aW1hZ2VEYXRhID0gaW1nLT5pbWFnZURhdGFPcmlnaW4gPSAwOworICAgICAgICAgICAgY3ZGcmVlKCAmcHRyICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdklQTC5kZWFsbG9jYXRlKCBpbWcsIElQTF9JTUFHRV9EQVRBICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gUmV0cmlldmVzIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBhYm91dCBpbWFnZSBST0kgb3IgQ3ZNYXQgZGF0YQorQ1ZfSU1QTCB2b2lkCitjdkdldFJhd0RhdGEoIGNvbnN0IEN2QXJyKiBhcnIsIHVjaGFyKiogZGF0YSwgaW50KiBzdGVwLCBDdlNpemUqIHJvaV9zaXplICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0UmF3RGF0YSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgKm1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIGlmKCBzdGVwICkKKyAgICAgICAgICAgICpzdGVwID0gbWF0LT5zdGVwOworCisgICAgICAgIGlmKCBkYXRhICkKKyAgICAgICAgICAgICpkYXRhID0gbWF0LT5kYXRhLnB0cjsKKworICAgICAgICBpZiggcm9pX3NpemUgKQorICAgICAgICAgICAgKnJvaV9zaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfSU1BR0UoIGFyciApKQorICAgIHsKKyAgICAgICAgSXBsSW1hZ2UqIGltZyA9IChJcGxJbWFnZSopYXJyOworCisgICAgICAgIGlmKCBzdGVwICkKKyAgICAgICAgICAgICpzdGVwID0gaW1nLT53aWR0aFN0ZXA7CisKKyAgICAgICAgaWYoIGRhdGEgKQorICAgICAgICAgICAgQ1ZfQ0FMTCggKmRhdGEgPSBjdlB0cjJEKCBpbWcsIDAsIDAgKSk7CisKKyAgICAgICAgaWYoIHJvaV9zaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGltZy0+cm9pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcm9pX3NpemUgPSBjdlNpemUoIGltZy0+cm9pLT53aWR0aCwgaW1nLT5yb2ktPmhlaWdodCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpyb2lfc2l6ZSA9IGN2U2l6ZSggaW1nLT53aWR0aCwgaW1nLT5oZWlnaHQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19NQVRORCggYXJyICkpCisgICAgeworICAgICAgICBDdk1hdE5EKiBtYXQgPSAoQ3ZNYXRORCopYXJyOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk9ubHkgY29udGludW91cyBuRCBhcnJheXMgYXJlIHN1cHBvcnRlZCBoZXJlIiApOworCisgICAgICAgIGlmKCBkYXRhICkKKyAgICAgICAgICAgICpkYXRhID0gbWF0LT5kYXRhLnB0cjsKKworICAgICAgICBpZiggcm9pX3NpemUgfHwgc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBzaXplMSA9IG1hdC0+ZGltWzBdLnNpemUsIHNpemUyID0gMTsKKworICAgICAgICAgICAgaWYoIG1hdC0+ZGltcyA+IDIgKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBtYXQtPmRpbXM7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHNpemUxICo9IG1hdC0+ZGltW2ldLnNpemU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2l6ZTIgPSBtYXQtPmRpbVsxXS5zaXplOworCisgICAgICAgICAgICBpZiggcm9pX3NpemUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJvaV9zaXplLT53aWR0aCA9IHNpemUyOworICAgICAgICAgICAgICAgIHJvaV9zaXplLT5oZWlnaHQgPSBzaXplMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0ZXAgKQorICAgICAgICAgICAgICAgICpzdGVwID0gc2l6ZTEgPT0gMSA/IDAgOiBtYXQtPmRpbVswXS5zdGVwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJ1bnJlY29nbml6ZWQgb3IgdW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgaW50CitjdkdldEVsZW1UeXBlKCBjb25zdCBDdkFyciogYXJyICkKK3sKKyAgICBpbnQgdHlwZSA9IC0xOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldEVsZW1UeXBlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoIENWX0lTX01BVF9IRFIoYXJyKSB8fCBDVl9JU19NQVRORF9IRFIoYXJyKSB8fCBDVl9JU19TUEFSU0VfTUFUX0hEUihhcnIpKQorICAgIHsKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKCAoKEN2TWF0KilhcnIpLT50eXBlICk7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX0lNQUdFKGFycikpCisgICAgeworICAgICAgICBJcGxJbWFnZSogaW1nID0gKElwbEltYWdlKilhcnI7CisgICAgICAgIHR5cGUgPSBDVl9NQUtFVFlQRSggaWN2SXBsVG9DdkRlcHRoKGltZy0+ZGVwdGgpLCBpbWctPm5DaGFubmVscyApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJ1bnJlY29nbml6ZWQgb3IgdW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gdHlwZTsKK30KKworCisvLyBSZXR1cm5zIGEgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMKK0NWX0lNUEwgaW50CitjdkdldERpbXMoIGNvbnN0IEN2QXJyKiBhcnIsIGludCogc2l6ZXMgKQoreworICAgIGludCBkaW1zID0gLTE7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldERpbXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfSVNfTUFUX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBDdk1hdCogbWF0ID0gKEN2TWF0KilhcnI7CisgICAgICAgIAorICAgICAgICBkaW1zID0gMjsKKyAgICAgICAgaWYoIHNpemVzICkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZXNbMF0gPSBtYXQtPnJvd3M7CisgICAgICAgICAgICBzaXplc1sxXSA9IG1hdC0+Y29sczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19JTUFHRSggYXJyICkpCisgICAgeworICAgICAgICBJcGxJbWFnZSogaW1nID0gKElwbEltYWdlKilhcnI7CisgICAgICAgIGRpbXMgPSAyOworCisgICAgICAgIGlmKCBzaXplcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemVzWzBdID0gaW1nLT5oZWlnaHQ7CisgICAgICAgICAgICBzaXplc1sxXSA9IGltZy0+d2lkdGg7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkRfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgIGRpbXMgPSBtYXQtPmRpbXM7CisgICAgICAgIAorICAgICAgICBpZiggc2l6ZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgIHNpemVzW2ldID0gbWF0LT5kaW1baV0uc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19TUEFSU0VfTUFUX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBDdlNwYXJzZU1hdCogbWF0ID0gKEN2U3BhcnNlTWF0KilhcnI7CisgICAgICAgIGRpbXMgPSBtYXQtPmRpbXM7CisgICAgICAgIAorICAgICAgICBpZiggc2l6ZXMgKQorICAgICAgICAgICAgbWVtY3B5KCBzaXplcywgbWF0LT5zaXplLCBkaW1zKnNpemVvZihzaXplc1swXSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAidW5yZWNvZ25pemVkIG9yIHVuc3VwcG9ydGVkIGFycmF5IHR5cGUiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBkaW1zOworfQorCisKKy8vIFJldHVybnMgdGhlIHNpemUgb2YgcGFydGljdWxhciBhcnJheSBkaW1lbnNpb24KK0NWX0lNUEwgaW50CitjdkdldERpbVNpemUoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpbmRleCApCit7CisgICAgaW50IHNpemUgPSAtMTsKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0RGltU2l6ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgKm1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIHN3aXRjaCggaW5kZXggKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIHNpemUgPSBtYXQtPnJvd3M7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc2l6ZSA9IG1hdC0+Y29sczsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJiYWQgZGltZW5zaW9uIGluZGV4IiApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX0lNQUdFKCBhcnIgKSkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKWFycjsKKworICAgICAgICBzd2l0Y2goIGluZGV4ICkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBzaXplID0gIWltZy0+cm9pID8gaW1nLT5oZWlnaHQgOiBpbWctPnJvaS0+aGVpZ2h0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIHNpemUgPSAhaW1nLT5yb2kgPyBpbWctPndpZHRoIDogaW1nLT5yb2ktPndpZHRoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImJhZCBkaW1lbnNpb24gaW5kZXgiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkRfSERSKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgIAorICAgICAgICBpZiggKHVuc2lnbmVkKWluZGV4ID49ICh1bnNpZ25lZCltYXQtPmRpbXMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJiYWQgZGltZW5zaW9uIGluZGV4IiApOworCisgICAgICAgIHNpemUgPSBtYXQtPmRpbVtpbmRleF0uc2l6ZTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfU1BBUlNFX01BVF9IRFIoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VNYXQqIG1hdCA9IChDdlNwYXJzZU1hdCopYXJyOworICAgICAgICAKKyAgICAgICAgaWYoICh1bnNpZ25lZClpbmRleCA+PSAodW5zaWduZWQpbWF0LT5kaW1zICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiYmFkIGRpbWVuc2lvbiBpbmRleCIgKTsKKworICAgICAgICBzaXplID0gbWF0LT5zaXplW2luZGV4XTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworCisvLyBSZXR1cm5zIHRoZSBzaXplIG9mIEN2TWF0IG9yIElwbEltYWdlCitDVl9JTVBMIEN2U2l6ZQorY3ZHZXRTaXplKCBjb25zdCBDdkFyciogYXJyICkKK3sKKyAgICBDdlNpemUgc2l6ZSA9IHsgMCwgMCB9OworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldFNpemUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfSVNfTUFUX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBDdk1hdCAqbWF0ID0gKEN2TWF0KilhcnI7CisKKyAgICAgICAgc2l6ZS53aWR0aCA9IG1hdC0+Y29sczsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSBtYXQtPnJvd3M7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX0lNQUdFX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBJcGxJbWFnZSogaW1nID0gKElwbEltYWdlKilhcnI7CisKKyAgICAgICAgaWYoIGltZy0+cm9pICkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCA9IGltZy0+cm9pLT53aWR0aDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gaW1nLT5yb2ktPmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggPSBpbWctPndpZHRoOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSBpbWctPmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiQXJyYXkgc2hvdWxkIGJlIEN2TWF0IG9yIElwbEltYWdlIiApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc2l6ZTsKK30KKworCisvLyBTZWxlY3RzIHN1Yi1hcnJheSAobm8gZGF0YSBpcyBjb3BpZWQpCitDVl9JTVBMICBDdk1hdCoKK2N2R2V0U3ViUmVjdCggY29uc3QgQ3ZBcnIqIGFyciwgQ3ZNYXQqIHN1Ym1hdCwgQ3ZSZWN0IHJlY3QgKQoreworICAgIEN2TWF0KiByZXMgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRSZWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopYXJyOworCisgICAgaWYoICFDVl9JU19NQVQoIG1hdCApKQorICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiApKTsKKworICAgIGlmKCAhc3VibWF0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggKHJlY3QueHxyZWN0Lnl8cmVjdC53aWR0aHxyZWN0LmhlaWdodCkgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICBpZiggcmVjdC54ICsgcmVjdC53aWR0aCA+IG1hdC0+Y29scyB8fAorICAgICAgICByZWN0LnkgKyByZWN0LmhlaWdodCA+IG1hdC0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworCisgICAgeworICAgIC8qCisgICAgaW50KiByZWZjb3VudCA9IG1hdC0+cmVmY291bnQ7CisKKyAgICBpZiggcmVmY291bnQgKQorICAgICAgICArKypyZWZjb3VudDsKKworICAgIGN2RGVjUmVmRGF0YSggc3VibWF0ICk7CisgICAgKi8KKyAgICBzdWJtYXQtPmRhdGEucHRyID0gbWF0LT5kYXRhLnB0ciArIChzaXplX3QpcmVjdC55Km1hdC0+c3RlcCArCisgICAgICAgICAgICAgICAgICAgICAgIHJlY3QueCpDVl9FTEVNX1NJWkUobWF0LT50eXBlKTsKKyAgICBzdWJtYXQtPnN0ZXAgPSBtYXQtPnN0ZXAgJiAocmVjdC5oZWlnaHQgPiAxID8gLTEgOiAwKTsKKyAgICBzdWJtYXQtPnR5cGUgPSAobWF0LT50eXBlICYgKHJlY3Qud2lkdGggPCBtYXQtPmNvbHMgPyB+Q1ZfTUFUX0NPTlRfRkxBRyA6IC0xKSkgfAorICAgICAgICAgICAgICAgICAgIChzdWJtYXQtPnN0ZXAgPT0gMCA/IENWX01BVF9DT05UX0ZMQUcgOiAwKTsKKyAgICBzdWJtYXQtPnJvd3MgPSByZWN0LmhlaWdodDsKKyAgICBzdWJtYXQtPmNvbHMgPSByZWN0LndpZHRoOworICAgIHN1Ym1hdC0+cmVmY291bnQgPSAwOworICAgIHJlcyA9IHN1Ym1hdDsKKyAgICB9CisgICAgCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXM7Cit9CisKKworLy8gU2VsZWN0cyBhcnJheSdzIHJvdyBzcGFuLgorQ1ZfSU1QTCAgQ3ZNYXQqCitjdkdldFJvd3MoIGNvbnN0IEN2QXJyKiBhcnIsIEN2TWF0KiBzdWJtYXQsCisgICAgICAgICAgIGludCBzdGFydF9yb3csIGludCBlbmRfcm93LCBpbnQgZGVsdGFfcm93ICkKK3sKKyAgICBDdk1hdCogcmVzID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0Um93cyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBtYXQgKSkKKyAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIgKSk7CisKKyAgICBpZiggIXN1Ym1hdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICh1bnNpZ25lZClzdGFydF9yb3cgPj0gKHVuc2lnbmVkKW1hdC0+cm93cyB8fAorICAgICAgICAodW5zaWduZWQpZW5kX3JvdyA+ICh1bnNpZ25lZCltYXQtPnJvd3MgfHwgZGVsdGFfcm93IDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKworICAgIHsKKyAgICAvKgorICAgIGludCogcmVmY291bnQgPSBtYXQtPnJlZmNvdW50OworCisgICAgaWYoIHJlZmNvdW50ICkKKyAgICAgICAgKysqcmVmY291bnQ7CisKKyAgICBjdkRlY1JlZkRhdGEoIHN1Ym1hdCApOworICAgICovCisgICAgaWYoIGRlbHRhX3JvdyA9PSAxICkKKyAgICB7CisgICAgICAgIHN1Ym1hdC0+cm93cyA9IGVuZF9yb3cgLSBzdGFydF9yb3c7CisgICAgICAgIHN1Ym1hdC0+c3RlcCA9IG1hdC0+c3RlcCAmIChzdWJtYXQtPnJvd3MgPiAxID8gLTEgOiAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3VibWF0LT5yb3dzID0gKGVuZF9yb3cgLSBzdGFydF9yb3cgKyBkZWx0YV9yb3cgLSAxKS9kZWx0YV9yb3c7CisgICAgICAgIHN1Ym1hdC0+c3RlcCA9IG1hdC0+c3RlcCAqIGRlbHRhX3JvdzsKKyAgICB9CisKKyAgICBzdWJtYXQtPmNvbHMgPSBtYXQtPmNvbHM7CisgICAgc3VibWF0LT5zdGVwICY9IHN1Ym1hdC0+cm93cyA+IDEgPyAtMSA6IDA7CisgICAgc3VibWF0LT5kYXRhLnB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KXN0YXJ0X3JvdyptYXQtPnN0ZXA7CisgICAgc3VibWF0LT50eXBlID0gKG1hdC0+dHlwZSB8IChzdWJtYXQtPnN0ZXAgPT0gMCA/IENWX01BVF9DT05UX0ZMQUcgOiAwKSkgJgorICAgICAgICAgICAgICAgICAgIChkZWx0YV9yb3cgIT0gMSA/IH5DVl9NQVRfQ09OVF9GTEFHIDogLTEpOworICAgIHN1Ym1hdC0+cmVmY291bnQgPSAwOworICAgIHN1Ym1hdC0+aGRyX3JlZmNvdW50ID0gMDsKKyAgICByZXMgPSBzdWJtYXQ7CisgICAgfQorICAgIAorICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzOworfQorCisKKy8vIFNlbGVjdHMgYXJyYXkncyBjb2x1bW4gc3Bhbi4KK0NWX0lNUEwgIEN2TWF0KgorY3ZHZXRDb2xzKCBjb25zdCBDdkFyciogYXJyLCBDdk1hdCogc3VibWF0LCBpbnQgc3RhcnRfY29sLCBpbnQgZW5kX2NvbCApCit7CisgICAgQ3ZNYXQqIHJlcyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldENvbHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisgICAgaW50IGNvbHM7CisKKyAgICBpZiggIUNWX0lTX01BVCggbWF0ICkpCisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgaWYoICFzdWJtYXQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICAKKyAgICBjb2xzID0gbWF0LT5jb2xzOworICAgIGlmKCAodW5zaWduZWQpc3RhcnRfY29sID49ICh1bnNpZ25lZCljb2xzIHx8CisgICAgICAgICh1bnNpZ25lZCllbmRfY29sID4gKHVuc2lnbmVkKWNvbHMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKworICAgIHsKKyAgICAvKgorICAgIGludCogcmVmY291bnQgPSBtYXQtPnJlZmNvdW50OworCisgICAgaWYoIHJlZmNvdW50ICkKKyAgICAgICAgKysqcmVmY291bnQ7CisKKyAgICBjdkRlY1JlZkRhdGEoIHN1Ym1hdCApOworICAgICovCisgICAgc3VibWF0LT5yb3dzID0gbWF0LT5yb3dzOworICAgIHN1Ym1hdC0+Y29scyA9IGVuZF9jb2wgLSBzdGFydF9jb2w7CisgICAgc3VibWF0LT5zdGVwID0gbWF0LT5zdGVwICYgKHN1Ym1hdC0+cm93cyA+IDEgPyAtMSA6IDApOworICAgIHN1Ym1hdC0+ZGF0YS5wdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdClzdGFydF9jb2wqQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSk7CisgICAgc3VibWF0LT50eXBlID0gbWF0LT50eXBlICYgKHN1Ym1hdC0+c3RlcCAmJiBzdWJtYXQtPmNvbHMgPCBjb2xzID8gfkNWX01BVF9DT05UX0ZMQUcgOiAtMSk7CisgICAgc3VibWF0LT5yZWZjb3VudCA9IDA7CisgICAgc3VibWF0LT5oZHJfcmVmY291bnQgPSAwOworICAgIHJlcyA9IHN1Ym1hdDsKKyAgICB9CisgICAgCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXM7Cit9CisKKworLy8gU2VsZWN0cyBhcnJheSBkaWFnb25hbAorQ1ZfSU1QTCAgQ3ZNYXQqCitjdkdldERpYWcoIGNvbnN0IEN2QXJyKiBhcnIsIEN2TWF0KiBzdWJtYXQsIGludCBkaWFnICkKK3sKKyAgICBDdk1hdCogcmVzID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0RGlhZyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICBpbnQgbGVuLCBwaXhfc2l6ZTsgCisKKyAgICBpZiggIUNWX0lTX01BVCggbWF0ICkpCisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgaWYoICFzdWJtYXQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSk7CisKKyAgICAvKnsKKyAgICBpbnQqIHJlZmNvdW50ID0gbWF0LT5yZWZjb3VudDsKKworICAgIGlmKCByZWZjb3VudCApCisgICAgICAgICsrKnJlZmNvdW50OworCisgICAgY3ZEZWNSZWZEYXRhKCBzdWJtYXQgKTsKKyAgICB9Ki8KKworICAgIGlmKCBkaWFnID49IDAgKQorICAgIHsKKyAgICAgICAgbGVuID0gbWF0LT5jb2xzIC0gZGlhZzsKKyAgICAgICAgCisgICAgICAgIGlmKCBsZW4gPD0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKworICAgICAgICBsZW4gPSBDVl9JTUlOKCBsZW4sIG1hdC0+cm93cyApOworICAgICAgICBzdWJtYXQtPmRhdGEucHRyID0gbWF0LT5kYXRhLnB0ciArIGRpYWcqcGl4X3NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGxlbiA9IG1hdC0+cm93cyArIGRpYWc7CisgICAgICAgIAorICAgICAgICBpZiggbGVuIDw9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICAgICAgbGVuID0gQ1ZfSU1JTiggbGVuLCBtYXQtPmNvbHMgKTsKKyAgICAgICAgc3VibWF0LT5kYXRhLnB0ciA9IG1hdC0+ZGF0YS5wdHIgLSBkaWFnKm1hdC0+c3RlcDsKKyAgICB9CisKKyAgICBzdWJtYXQtPnJvd3MgPSBsZW47CisgICAgc3VibWF0LT5jb2xzID0gMTsKKyAgICBzdWJtYXQtPnN0ZXAgPSAobWF0LT5zdGVwICsgcGl4X3NpemUpICYgKHN1Ym1hdC0+cm93cyA+IDEgPyAtMSA6IDApOworICAgIHN1Ym1hdC0+dHlwZSA9IG1hdC0+dHlwZTsKKyAgICBpZiggc3VibWF0LT5zdGVwICkKKyAgICAgICAgc3VibWF0LT50eXBlICY9IH5DVl9NQVRfQ09OVF9GTEFHOworICAgIGVsc2UKKyAgICAgICAgc3VibWF0LT50eXBlIHw9IENWX01BVF9DT05UX0ZMQUc7CisgICAgc3VibWF0LT5yZWZjb3VudCA9IDA7CisgICAgc3VibWF0LT5oZHJfcmVmY291bnQgPSAwOworICAgIHJlcyA9IHN1Ym1hdDsKKyAgICAKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9ucyBvbiBDdlNjYWxhciBhbmQgYWNjZXNzaW5nIGFycmF5IGVsZW1lbnRzICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIENvbnZlcnRzIEN2U2NhbGFyIHRvIHNwZWNpZmllZCB0eXBlCitDVl9JTVBMIHZvaWQKK2N2U2NhbGFyVG9SYXdEYXRhKCBjb25zdCBDdlNjYWxhciogc2NhbGFyLCB2b2lkKiBkYXRhLCBpbnQgdHlwZSwgaW50IGV4dGVuZF90b18xMiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlNjYWxhclRvUmF3RGF0YSIgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSh0eXBlKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oIHR5cGUgKTsKKyAgICBpbnQgZGVwdGggPSB0eXBlICYgQ1ZfTUFUX0RFUFRIX01BU0s7CisKKyAgICBhc3NlcnQoIHNjYWxhciAmJiBkYXRhICk7CisgICAgaWYoICh1bnNpZ25lZCkoY24gLSAxKSA+PSA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgYmUgMSwgMiwgMyBvciA0IiApOworCisgICAgc3dpdGNoKCBkZXB0aCApCisgICAgeworICAgIGNhc2UgQ1ZfOFVDMToKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IGN2Um91bmQoIHNjYWxhci0+dmFsW2NuXSApOworICAgICAgICAgICAgKCh1Y2hhciopZGF0YSlbY25dID0gQ1ZfQ0FTVF84VSh0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzhTQzE6CisgICAgICAgIHdoaWxlKCBjbi0tICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKCBzY2FsYXItPnZhbFtjbl0gKTsKKyAgICAgICAgICAgICgoY2hhciopZGF0YSlbY25dID0gQ1ZfQ0FTVF84Uyh0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzE2VUMxOgorICAgICAgICB3aGlsZSggY24tLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ID0gY3ZSb3VuZCggc2NhbGFyLT52YWxbY25dICk7CisgICAgICAgICAgICAoKHVzaG9ydCopZGF0YSlbY25dID0gQ1ZfQ0FTVF8xNlUodCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8xNlNDMToKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IGN2Um91bmQoIHNjYWxhci0+dmFsW2NuXSApOworICAgICAgICAgICAgKChzaG9ydCopZGF0YSlbY25dID0gQ1ZfQ0FTVF8xNlModCk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8zMlNDMToKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICAgICAgKChpbnQqKWRhdGEpW2NuXSA9IGN2Um91bmQoIHNjYWxhci0+dmFsW2NuXSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyRkMxOgorICAgICAgICB3aGlsZSggY24tLSApCisgICAgICAgICAgICAoKGZsb2F0KilkYXRhKVtjbl0gPSAoZmxvYXQpKHNjYWxhci0+dmFsW2NuXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfNjRGQzE6CisgICAgICAgIHdoaWxlKCBjbi0tICkKKyAgICAgICAgICAgICgoZG91YmxlKilkYXRhKVtjbl0gPSAoZG91YmxlKShzY2FsYXItPnZhbFtjbl0pOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfQmFkRGVwdGggKTsKKyAgICB9CisKKyAgICBpZiggZXh0ZW5kX3RvXzEyICkKKyAgICB7CisgICAgICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKyAgICAgICAgaW50IG9mZnNldCA9IENWX0VMRU1fU0laRTEoZGVwdGgpKjEyOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIG9mZnNldCAtPSBwaXhfc2l6ZTsKKyAgICAgICAgICAgIENWX01FTUNQWV9BVVRPKCAoY2hhciopZGF0YSArIG9mZnNldCwgZGF0YSwgcGl4X3NpemUgKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSggb2Zmc2V0ID4gcGl4X3NpemUgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8vIENvbnZlcnRzIGRhdGEgb2Ygc3BlY2lmaWVkIHR5cGUgdG8gQ3ZTY2FsYXIKK0NWX0lNUEwgdm9pZAorY3ZSYXdEYXRhVG9TY2FsYXIoIGNvbnN0IHZvaWQqIGRhdGEsIGludCBmbGFncywgQ3ZTY2FsYXIqIHNjYWxhciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJhd0RhdGFUb1NjYWxhciIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY24gPSBDVl9NQVRfQ04oIGZsYWdzICk7CisKKyAgICBhc3NlcnQoIHNjYWxhciAmJiBkYXRhICk7CisgICAgCisgICAgaWYoICh1bnNpZ25lZCkoY24gLSAxKSA+PSA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG11c3QgYmUgMSwgMiwgMyBvciA0IiApOworCisgICAgbWVtc2V0KCBzY2FsYXItPnZhbCwgMCwgc2l6ZW9mKHNjYWxhci0+dmFsKSk7CisKKyAgICBzd2l0Y2goIENWX01BVF9ERVBUSCggZmxhZ3MgKSkKKyAgICB7CisgICAgY2FzZSBDVl84VToKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICAgICAgc2NhbGFyLT52YWxbY25dID0gQ1ZfOFRPMzJGKCgodWNoYXIqKWRhdGEpW2NuXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfOFM6CisgICAgICAgIHdoaWxlKCBjbi0tICkKKyAgICAgICAgICAgIHNjYWxhci0+dmFsW2NuXSA9IENWXzhUTzMyRigoKGNoYXIqKWRhdGEpW2NuXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMTZVOgorICAgICAgICB3aGlsZSggY24tLSApCisgICAgICAgICAgICBzY2FsYXItPnZhbFtjbl0gPSAoKHVzaG9ydCopZGF0YSlbY25dOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzE2UzoKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICAgICAgc2NhbGFyLT52YWxbY25dID0gKChzaG9ydCopZGF0YSlbY25dOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWXzMyUzoKKyAgICAgICAgd2hpbGUoIGNuLS0gKQorICAgICAgICAgICAgc2NhbGFyLT52YWxbY25dID0gKChpbnQqKWRhdGEpW2NuXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl8zMkY6CisgICAgICAgIHdoaWxlKCBjbi0tICkKKyAgICAgICAgICAgIHNjYWxhci0+dmFsW2NuXSA9ICgoZmxvYXQqKWRhdGEpW2NuXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl82NEY6CisgICAgICAgIHdoaWxlKCBjbi0tICkKKyAgICAgICAgICAgIHNjYWxhci0+dmFsW2NuXSA9ICgoZG91YmxlKilkYXRhKVtjbl07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9CYWREZXB0aCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIGRvdWJsZSBpY3ZHZXRSZWFsKCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgdHlwZSApCit7CisgICAgc3dpdGNoKCB0eXBlICkKKyAgICB7CisgICAgY2FzZSBDVl84VToKKyAgICAgICAgcmV0dXJuICoodWNoYXIqKWRhdGE7CisgICAgY2FzZSBDVl84UzoKKyAgICAgICAgcmV0dXJuICooY2hhciopZGF0YTsKKyAgICBjYXNlIENWXzE2VToKKyAgICAgICAgcmV0dXJuICoodXNob3J0KilkYXRhOworICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICByZXR1cm4gKihzaG9ydCopZGF0YTsKKyAgICBjYXNlIENWXzMyUzoKKyAgICAgICAgcmV0dXJuICooaW50KilkYXRhOworICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICByZXR1cm4gKihmbG9hdCopZGF0YTsKKyAgICBjYXNlIENWXzY0RjoKKyAgICAgICAgcmV0dXJuICooZG91YmxlKilkYXRhOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGljdlNldFJlYWwoIGRvdWJsZSB2YWx1ZSwgY29uc3Qgdm9pZCogZGF0YSwgaW50IHR5cGUgKQoreworICAgIGlmKCB0eXBlIDwgQ1ZfMzJGICkKKyAgICB7CisgICAgICAgIGludCBpdmFsdWUgPSBjdlJvdW5kKHZhbHVlKTsKKyAgICAgICAgc3dpdGNoKCB0eXBlICkKKyAgICAgICAgeworICAgICAgICBjYXNlIENWXzhVOgorICAgICAgICAgICAgKih1Y2hhciopZGF0YSA9IENWX0NBU1RfOFUoaXZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWXzhTOgorICAgICAgICAgICAgKihjaGFyKilkYXRhID0gQ1ZfQ0FTVF84UyhpdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMTZVOgorICAgICAgICAgICAgKih1c2hvcnQqKWRhdGEgPSBDVl9DQVNUXzE2VShpdmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICAgICAgKihzaG9ydCopZGF0YSA9IENWX0NBU1RfMTZTKGl2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDVl8zMlM6CisgICAgICAgICAgICAqKGludCopZGF0YSA9IENWX0NBU1RfMzJTKGl2YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzd2l0Y2goIHR5cGUgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICAgICAgKihmbG9hdCopZGF0YSA9IChmbG9hdCl2YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENWXzY0RjoKKyAgICAgICAgICAgICooZG91YmxlKilkYXRhID0gdmFsdWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworCisvLyBSZXR1cm5zIHBvaW50ZXIgdG8gc3BlY2lmaWVkIGVsZW1lbnQgb2YgYXJyYXkgKGxpbmVhciBpbmRleCBpcyB1c2VkKQorQ1ZfSU1QTCAgdWNoYXIqCitjdlB0cjFEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4LCBpbnQqIF90eXBlICkKK3sKKyAgICB1Y2hhciogcHRyID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UHRyMUQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycjsKKworICAgICAgICBpbnQgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKworICAgICAgICBpZiggX3R5cGUgKQorICAgICAgICAgICAgKl90eXBlID0gdHlwZTsKKyAgICAgICAgCisgICAgICAgIC8vIHRoZSBmaXJzdCBwYXJ0IGlzIG11bC1mcmVlIHN1ZmZpY2llbnQgY2hlY2sKKyAgICAgICAgLy8gdGhhdCB0aGUgaW5kZXggaXMgd2l0aGluIHRoZSBtYXRyaXgKKyAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKShtYXQtPnJvd3MgKyBtYXQtPmNvbHMgLSAxKSAmJgorICAgICAgICAgICAgKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpKG1hdC0+cm93cyptYXQtPmNvbHMpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKG1hdC0+dHlwZSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KWlkeCpwaXhfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCByb3csIGNvbDsKKyAgICAgICAgICAgIGlmKCBtYXQtPmNvbHMgPT0gMSApCisgICAgICAgICAgICAgICAgcm93ID0gaWR4LCBjb2wgPSAwOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJvdyA9IGlkeC9tYXQtPmNvbHMsIGNvbCA9IGlkeCAtIHJvdyptYXQtPmNvbHM7CisgICAgICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdClyb3cqbWF0LT5zdGVwICsgY29sKnBpeF9zaXplOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX0lNQUdFX0hEUiggYXJyICkpCisgICAgeworICAgICAgICBJcGxJbWFnZSogaW1nID0gKElwbEltYWdlKilhcnI7CisgICAgICAgIGludCB3aWR0aCA9ICFpbWctPnJvaSA/IGltZy0+d2lkdGggOiBpbWctPnJvaS0+d2lkdGg7CisgICAgICAgIGludCB5ID0gaWR4L3dpZHRoLCB4ID0gaWR4IC0geSp3aWR0aDsKKworICAgICAgICBwdHIgPSBjdlB0cjJEKCBhcnIsIHksIHgsIF90eXBlICk7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX01BVE5EKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgIGludCBqLCB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtYXQtPmRpbVswXS5zaXplOworCisgICAgICAgIGlmKCBfdHlwZSApCisgICAgICAgICAgICAqX3R5cGUgPSB0eXBlOworCisgICAgICAgIGZvciggaiA9IDE7IGogPCBtYXQtPmRpbXM7IGorKyApCisgICAgICAgICAgICBzaXplICo9IG1hdC0+ZGltW2pdLnNpemU7CisKKyAgICAgICAgaWYoKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQobWF0LT50eXBlKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgICAgICAgICAgcHRyID0gbWF0LT5kYXRhLnB0ciArIChzaXplX3QpaWR4KnBpeF9zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHRyID0gbWF0LT5kYXRhLnB0cjsKKyAgICAgICAgICAgIGZvciggaiA9IG1hdC0+ZGltcyAtIDE7IGogPj0gMDsgai0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3ogPSBtYXQtPmRpbVtqXS5zaXplOworICAgICAgICAgICAgICAgIGlmKCBzeiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGlkeC9zejsKKyAgICAgICAgICAgICAgICAgICAgcHRyICs9IChpZHggLSB0KnN6KSptYXQtPmRpbVtqXS5zdGVwOworICAgICAgICAgICAgICAgICAgICBpZHggPSB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2U3BhcnNlTWF0KiBtID0gKEN2U3BhcnNlTWF0KilhcnI7CisgICAgICAgIGlmKCBtLT5kaW1zID09IDEgKQorICAgICAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsICZpZHgsIF90eXBlLCAxLCAwICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGksIG4gPSBtLT5kaW1zOworICAgICAgICAgICAgaW50KiBfaWR4ID0gKGludCopY3ZTdGFja0FsbG9jKG4qc2l6ZW9mKF9pZHhbMF0pKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gbiAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IGlkeCAvIG0tPnNpemVbaV07CisgICAgICAgICAgICAgICAgX2lkeFtpXSA9IGlkeCAtIHQqbS0+c2l6ZVtpXTsKKyAgICAgICAgICAgICAgICBpZHggPSB0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIF9pZHgsIF90eXBlLCAxLCAwICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8vIFJldHVybnMgcG9pbnRlciB0byBzcGVjaWZpZWQgZWxlbWVudCBvZiAyZCBhcnJheQorQ1ZfSU1QTCAgdWNoYXIqCitjdlB0cjJEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgeSwgaW50IHgsIGludCogX3R5cGUgKQoreworICAgIHVjaGFyKiBwdHIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZQdHIyRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworICAgICAgICBpbnQgdHlwZTsKKworICAgICAgICBpZiggKHVuc2lnbmVkKXkgPj0gKHVuc2lnbmVkKShtYXQtPnJvd3MpIHx8CisgICAgICAgICAgICAodW5zaWduZWQpeCA+PSAodW5zaWduZWQpKG1hdC0+Y29scykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgICAgIGlmKCBfdHlwZSApCisgICAgICAgICAgICAqX3R5cGUgPSB0eXBlOworCisgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KXkqbWF0LT5zdGVwICsgeCpDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX0lNQUdFKCBhcnIgKSkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKWFycjsKKyAgICAgICAgaW50IHBpeF9zaXplID0gKGltZy0+ZGVwdGggJiAyNTUpID4+IDM7CisgICAgICAgIGludCB3aWR0aCwgaGVpZ2h0OworICAgICAgICBwdHIgPSAodWNoYXIqKWltZy0+aW1hZ2VEYXRhOworCisgICAgICAgIGlmKCBpbWctPmRhdGFPcmRlciA9PSAwICkKKyAgICAgICAgICAgIHBpeF9zaXplICo9IGltZy0+bkNoYW5uZWxzOworCisgICAgICAgIGlmKCBpbWctPnJvaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdpZHRoID0gaW1nLT5yb2ktPndpZHRoOworICAgICAgICAgICAgaGVpZ2h0ID0gaW1nLT5yb2ktPmhlaWdodDsKKworICAgICAgICAgICAgcHRyICs9IGltZy0+cm9pLT55T2Zmc2V0KmltZy0+d2lkdGhTdGVwICsKKyAgICAgICAgICAgICAgICAgICBpbWctPnJvaS0+eE9mZnNldCpwaXhfc2l6ZTsKKworICAgICAgICAgICAgaWYoIGltZy0+ZGF0YU9yZGVyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY29pID0gaW1nLT5yb2ktPmNvaTsKKyAgICAgICAgICAgICAgICBpZiggIWNvaSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksCisgICAgICAgICAgICAgICAgICAgICAgICAiQ09JIG11c3QgYmUgbm9uLW51bGwgaW4gY2FzZSBvZiBwbGFuYXIgaW1hZ2VzIiApOworICAgICAgICAgICAgICAgIHB0ciArPSAoY29pIC0gMSkqaW1nLT5pbWFnZVNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3aWR0aCA9IGltZy0+d2lkdGg7CisgICAgICAgICAgICBoZWlnaHQgPSBpbWctPmhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAodW5zaWduZWQpeSA+PSAodW5zaWduZWQpaGVpZ2h0IHx8CisgICAgICAgICAgICAodW5zaWduZWQpeCA+PSAodW5zaWduZWQpd2lkdGggKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICAgICAgcHRyICs9IHkqaW1nLT53aWR0aFN0ZXAgKyB4KnBpeF9zaXplOworCisgICAgICAgIGlmKCBfdHlwZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0eXBlID0gaWN2SXBsVG9DdkRlcHRoKGltZy0+ZGVwdGgpOworICAgICAgICAgICAgaWYoIHR5cGUgPCAwIHx8ICh1bnNpZ25lZCkoaW1nLT5uQ2hhbm5lbHMgLSAxKSA+IDMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICAgICAgKl90eXBlID0gQ1ZfTUFLRVRZUEUoIHR5cGUsIGltZy0+bkNoYW5uZWxzICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXRORCogbWF0ID0gKEN2TWF0TkQqKWFycjsKKworICAgICAgICBpZiggbWF0LT5kaW1zICE9IDIgfHwgCisgICAgICAgICAgICAodW5zaWduZWQpeSA+PSAodW5zaWduZWQpKG1hdC0+ZGltWzBdLnNpemUpIHx8CisgICAgICAgICAgICAodW5zaWduZWQpeCA+PSAodW5zaWduZWQpKG1hdC0+ZGltWzFdLnNpemUpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiaW5kZXggaXMgb3V0IG9mIHJhbmdlIiApOworCisgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KXkqbWF0LT5kaW1bMF0uc3RlcCArIHgqbWF0LT5kaW1bMV0uc3RlcDsKKyAgICAgICAgaWYoIF90eXBlICkKKyAgICAgICAgICAgICpfdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgfQorICAgIGVsc2UgaWYoIENWX0lTX1NQQVJTRV9NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgaW50IGlkeFtdID0geyB5LCB4IH07CisgICAgICAgIHB0ciA9IGljdkdldE5vZGVQdHIoIChDdlNwYXJzZU1hdCopYXJyLCBpZHgsIF90eXBlLCAxLCAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJ1bnJlY29nbml6ZWQgb3IgdW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHB0cjsKK30KKworCisvLyBSZXR1cm5zIHBvaW50ZXIgdG8gc3BlY2lmaWVkIGVsZW1lbnQgb2YgM2QgYXJyYXkKK0NWX0lNUEwgIHVjaGFyKgorY3ZQdHIzRCggY29uc3QgQ3ZBcnIqIGFyciwgaW50IHosIGludCB5LCBpbnQgeCwgaW50KiBfdHlwZSApCit7CisgICAgdWNoYXIqIHB0ciA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdlB0cjNEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoIENWX0lTX01BVE5EKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisKKyAgICAgICAgaWYoIG1hdC0+ZGltcyAhPSAzIHx8IAorICAgICAgICAgICAgKHVuc2lnbmVkKXogPj0gKHVuc2lnbmVkKShtYXQtPmRpbVswXS5zaXplKSB8fAorICAgICAgICAgICAgKHVuc2lnbmVkKXkgPj0gKHVuc2lnbmVkKShtYXQtPmRpbVsxXS5zaXplKSB8fAorICAgICAgICAgICAgKHVuc2lnbmVkKXggPj0gKHVuc2lnbmVkKShtYXQtPmRpbVsyXS5zaXplKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdCl6Km1hdC0+ZGltWzBdLnN0ZXAgKworICAgICAgICAgICAgICAoc2l6ZV90KXkqbWF0LT5kaW1bMV0uc3RlcCArIHgqbWF0LT5kaW1bMl0uc3RlcDsKKworICAgICAgICBpZiggX3R5cGUgKQorICAgICAgICAgICAgKl90eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfU1BBUlNFX01BVCggYXJyICkpCisgICAgeworICAgICAgICBpbnQgaWR4W10gPSB7IHosIHksIHggfTsKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIGlkeCwgX3R5cGUsIDEsIDAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8vIFJldHVybnMgcG9pbnRlciB0byBzcGVjaWZpZWQgZWxlbWVudCBvZiBuLWQgYXJyYXkKK0NWX0lNUEwgIHVjaGFyKgorY3ZQdHJORCggY29uc3QgQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHgsIGludCogX3R5cGUsCisgICAgICAgICBpbnQgY3JlYXRlX25vZGUsIHVuc2lnbmVkKiBwcmVjYWxjX2hhc2h2YWwgKQoreworICAgIHVjaGFyKiBwdHIgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZQdHJORCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhaWR4ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHBvaW50ZXIgdG8gaW5kaWNlcyIgKTsKKworICAgIGlmKCBDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIGlkeCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90eXBlLCBjcmVhdGVfbm9kZSwgcHJlY2FsY19oYXNodmFsICk7CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUTkQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXRORCogbWF0ID0gKEN2TWF0TkQqKWFycjsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHI7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG1hdC0+ZGltczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHhbaV0gPj0gKHVuc2lnbmVkKShtYXQtPmRpbVtpXS5zaXplKSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisgICAgICAgICAgICBwdHIgKz0gKHNpemVfdClpZHhbaV0qbWF0LT5kaW1baV0uc3RlcDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBfdHlwZSApCisgICAgICAgICAgICAqX3R5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgIH0KKyAgICBlbHNlIGlmKCBDVl9JU19NQVRfSERSKGFycikgfHwgQ1ZfSVNfSU1BR0VfSERSKGFycikgKQorICAgICAgICBwdHIgPSBjdlB0cjJEKCBhcnIsIGlkeFswXSwgaWR4WzFdLCBfdHlwZSApOworICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInVucmVjb2duaXplZCBvciB1bnN1cHBvcnRlZCBhcnJheSB0eXBlIiApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworLy8gUmV0dXJucyBzcGVjaWZlZCBlbGVtZW50IG9mIG4tRCBhcnJheSBnaXZlbiBsaW5lYXIgaW5kZXgKK0NWX0lNUEwgIEN2U2NhbGFyCitjdkdldDFEKCBjb25zdCBDdkFyciogYXJyLCBpbnQgaWR4ICkKK3sKKyAgICBDdlNjYWxhciBzY2FsYXIgPSB7ezAsMCwwLDB9fTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXQxRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlID0gMDsKKyAgICB1Y2hhciogcHRyOworICAgIAorICAgIGlmKCBDVl9JU19NQVQoIGFyciApICYmIENWX0lTX01BVF9DT05UKCAoKEN2TWF0KilhcnIpLT50eXBlICkpCisgICAgeworICAgICAgICBDdk1hdCogbWF0ID0gKEN2TWF0KilhcnI7CisKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKworICAgICAgICAvLyB0aGUgZmlyc3QgcGFydCBpcyBtdWwtZnJlZSBzdWZmaWNpZW50IGNoZWNrCisgICAgICAgIC8vIHRoYXQgdGhlIGluZGV4IGlzIHdpdGhpbiB0aGUgbWF0cml4CisgICAgICAgIGlmKCAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZCkobWF0LT5yb3dzICsgbWF0LT5jb2xzIC0gMSkgJiYKKyAgICAgICAgICAgICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKShtYXQtPnJvd3MqbWF0LT5jb2xzKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiaW5kZXggaXMgb3V0IG9mIHJhbmdlIiApOworCisgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KWlkeCpwaXhfc2l6ZTsKKyAgICB9CisgICAgZWxzZSBpZiggIUNWX0lTX1NQQVJTRV9NQVQoIGFyciApIHx8ICgoQ3ZTcGFyc2VNYXQqKWFyciktPmRpbXMgPiAxICkKKyAgICAgICAgcHRyID0gY3ZQdHIxRCggYXJyLCBpZHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgJmlkeCwgJnR5cGUsIDAsIDAgKTsKKworICAgIGN2UmF3RGF0YVRvU2NhbGFyKCBwdHIsIHR5cGUsICZzY2FsYXIgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc2NhbGFyOworfQorCisKKy8vIFJldHVybnMgc3BlY2lmZWQgZWxlbWVudCBvZiAyRCBhcnJheQorQ1ZfSU1QTCAgQ3ZTY2FsYXIKK2N2R2V0MkQoIGNvbnN0IEN2QXJyKiBhcnIsIGludCB5LCBpbnQgeCApCit7CisgICAgQ3ZTY2FsYXIgc2NhbGFyID0ge3swLDAsMCwwfX07CisKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0MkQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKworICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIGlmKCAodW5zaWduZWQpeSA+PSAodW5zaWduZWQpKG1hdC0+cm93cykgfHwKKyAgICAgICAgICAgICh1bnNpZ25lZCl4ID49ICh1bnNpZ25lZCkobWF0LT5jb2xzKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICAgICAgcHRyID0gbWF0LT5kYXRhLnB0ciArIChzaXplX3QpeSptYXQtPnN0ZXAgKyB4KkNWX0VMRU1fU0laRSh0eXBlKTsKKyAgICB9CisgICAgZWxzZSBpZiggIUNWX0lTX1NQQVJTRV9NQVQoIGFyciApKQorICAgICAgICBwdHIgPSBjdlB0cjJEKCBhcnIsIHksIHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeFtdID0geyB5LCB4IH07CisgICAgICAgIHB0ciA9IGljdkdldE5vZGVQdHIoIChDdlNwYXJzZU1hdCopYXJyLCBpZHgsICZ0eXBlLCAwLCAwICk7CisgICAgfQorCisgICAgY3ZSYXdEYXRhVG9TY2FsYXIoIHB0ciwgdHlwZSwgJnNjYWxhciApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzY2FsYXI7Cit9CisKKworLy8gUmV0dXJucyBzcGVjaWZlZCBlbGVtZW50IG9mIDNEIGFycmF5CitDVl9JTVBMICBDdlNjYWxhcgorY3ZHZXQzRCggY29uc3QgQ3ZBcnIqIGFyciwgaW50IHosIGludCB5LCBpbnQgeCApCit7CisgICAgQ3ZTY2FsYXIgc2NhbGFyID0ge3swLDAsMCwwfX07CisKKyAgICAvKkNWX0ZVTkNOQU1FKCAiY3ZHZXQzRCIgKTsqLworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisKKyAgICBpZiggIUNWX0lTX1NQQVJTRV9NQVQoIGFyciApKQorICAgICAgICBwdHIgPSBjdlB0cjNEKCBhcnIsIHosIHksIHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlkeFtdID0geyB6LCB5LCB4IH07CisgICAgICAgIHB0ciA9IGljdkdldE5vZGVQdHIoIChDdlNwYXJzZU1hdCopYXJyLCBpZHgsICZ0eXBlLCAwLCAwICk7CisgICAgfQorCisgICAgY3ZSYXdEYXRhVG9TY2FsYXIoIHB0ciwgdHlwZSwgJnNjYWxhciApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzY2FsYXI7Cit9CisKKworLy8gUmV0dXJucyBzcGVjaWZlZCBlbGVtZW50IG9mIG5EIGFycmF5CitDVl9JTVBMICBDdlNjYWxhcgorY3ZHZXRORCggY29uc3QgQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHggKQoreworICAgIEN2U2NhbGFyIHNjYWxhciA9IHt7MCwwLDAsMH19OworCisgICAgLypDVl9GVU5DTkFNRSggImN2R2V0TkQiICk7Ki8KKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlID0gMDsKKyAgICB1Y2hhciogcHRyOworCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHJORCggYXJyLCBpZHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgMCwgMCApOworCisgICAgY3ZSYXdEYXRhVG9TY2FsYXIoIHB0ciwgdHlwZSwgJnNjYWxhciApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzY2FsYXI7Cit9CisKKworLy8gUmV0dXJucyBzcGVjaWZlZCBlbGVtZW50IG9mIG4tRCBhcnJheSBnaXZlbiBsaW5lYXIgaW5kZXgKK0NWX0lNUEwgIGRvdWJsZQorY3ZHZXRSZWFsMUQoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBpZHggKQoreworICAgIGRvdWJsZSB2YWx1ZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0UmVhbDFEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSAmJiBDVl9JU19NQVRfQ09OVCggKChDdk1hdCopYXJyKS0+dHlwZSApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgICAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgLy8gdGhlIGZpcnN0IHBhcnQgaXMgbXVsLWZyZWUgc3VmZmljaWVudCBjaGVjaworICAgICAgICAvLyB0aGF0IHRoZSBpbmRleCBpcyB3aXRoaW4gdGhlIG1hdHJpeAorICAgICAgICBpZiggKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpKG1hdC0+cm93cyArIG1hdC0+Y29scyAtIDEpICYmCisgICAgICAgICAgICAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZCkobWF0LT5yb3dzKm1hdC0+Y29scykpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdClpZHgqcGl4X3NpemU7CisgICAgfQorICAgIGVsc2UgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSB8fCAoKEN2U3BhcnNlTWF0KilhcnIpLT5kaW1zID4gMSApCisgICAgICAgIHB0ciA9IGN2UHRyMUQoIGFyciwgaWR4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsICZpZHgsICZ0eXBlLCAwLCAwICk7CisKKyAgICBpZiggcHRyICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfQ04oIHR5cGUgKSA+IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiY3ZHZXRSZWFsKiBzdXBwb3J0IG9ubHkgc2luZ2xlLWNoYW5uZWwgYXJyYXlzIiApOworCisgICAgICAgIHZhbHVlID0gaWN2R2V0UmVhbCggcHRyLCB0eXBlICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisvLyBSZXR1cm5zIHNwZWNpZmVkIGVsZW1lbnQgb2YgMkQgYXJyYXkKK0NWX0lNUEwgIGRvdWJsZQorY3ZHZXRSZWFsMkQoIGNvbnN0IEN2QXJyKiBhcnIsIGludCB5LCBpbnQgeCApCit7CisgICAgZG91YmxlIHZhbHVlID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRSZWFsMkQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKyAgICAKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSkKKyAgICB7CisgICAgICAgIEN2TWF0KiBtYXQgPSAoQ3ZNYXQqKWFycjsKKworICAgICAgICBpZiggKHVuc2lnbmVkKXkgPj0gKHVuc2lnbmVkKShtYXQtPnJvd3MpIHx8CisgICAgICAgICAgICAodW5zaWduZWQpeCA+PSAodW5zaWduZWQpKG1hdC0+Y29scykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgICAgIHB0ciA9IG1hdC0+ZGF0YS5wdHIgKyAoc2l6ZV90KXkqbWF0LT5zdGVwICsgeCpDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgfQorICAgIGVsc2UgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHIyRCggYXJyLCB5LCB4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHhbXSA9IHsgeSwgeCB9OworICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgMCwgMCApOworICAgIH0KKworICAgIGlmKCBwdHIgKQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9DTiggdHlwZSApID4gMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICJjdkdldFJlYWwqIHN1cHBvcnQgb25seSBzaW5nbGUtY2hhbm5lbCBhcnJheXMiICk7CisKKyAgICAgICAgdmFsdWUgPSBpY3ZHZXRSZWFsKCBwdHIsIHR5cGUgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisKKy8vIFJldHVybnMgc3BlY2lmZWQgZWxlbWVudCBvZiAzRCBhcnJheQorQ1ZfSU1QTCAgZG91YmxlCitjdkdldFJlYWwzRCggY29uc3QgQ3ZBcnIqIGFyciwgaW50IHosIGludCB5LCBpbnQgeCApCit7CisgICAgZG91YmxlIHZhbHVlID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRSZWFsM0QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKworICAgIGlmKCAhQ1ZfSVNfU1BBUlNFX01BVCggYXJyICkpCisgICAgICAgIHB0ciA9IGN2UHRyM0QoIGFyciwgeiwgeSwgeCwgJnR5cGUgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWR4W10gPSB7IHosIHksIHggfTsKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIGlkeCwgJnR5cGUsIDAsIDAgKTsKKyAgICB9CisgICAgCisgICAgaWYoIHB0ciApCisgICAgeworICAgICAgICBpZiggQ1ZfTUFUX0NOKCB0eXBlICkgPiAxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgImN2R2V0UmVhbCogc3VwcG9ydCBvbmx5IHNpbmdsZS1jaGFubmVsIGFycmF5cyIgKTsKKworICAgICAgICB2YWx1ZSA9IGljdkdldFJlYWwoIHB0ciwgdHlwZSApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKKworLy8gUmV0dXJucyBzcGVjaWZlZCBlbGVtZW50IG9mIG5EIGFycmF5CitDVl9JTVBMICBkb3VibGUKK2N2R2V0UmVhbE5EKCBjb25zdCBDdkFyciogYXJyLCBjb25zdCBpbnQqIGlkeCApCit7CisgICAgZG91YmxlIHZhbHVlID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRSZWFsTkQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKyAgICAKKyAgICBpZiggIUNWX0lTX1NQQVJTRV9NQVQoIGFyciApKQorICAgICAgICBwdHIgPSBjdlB0ck5EKCBhcnIsIGlkeCwgJnR5cGUgKTsKKyAgICBlbHNlCisgICAgICAgIHB0ciA9IGljdkdldE5vZGVQdHIoIChDdlNwYXJzZU1hdCopYXJyLCBpZHgsICZ0eXBlLCAwLCAwICk7CisKKyAgICBpZiggcHRyICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfQ04oIHR5cGUgKSA+IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiY3ZHZXRSZWFsKiBzdXBwb3J0IG9ubHkgc2luZ2xlLWNoYW5uZWwgYXJyYXlzIiApOworCisgICAgICAgIHZhbHVlID0gaWN2R2V0UmVhbCggcHRyLCB0eXBlICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisvLyBBc3NpZ25zIG5ldyB2YWx1ZSB0byBzcGVjaWZlZCBlbGVtZW50IG9mIG5EIGFycmF5IGdpdmVuIGxpbmVhciBpbmRleAorQ1ZfSU1QTCAgdm9pZAorY3ZTZXQxRCggQ3ZBcnIqIGFyciwgaW50IGlkeCwgQ3ZTY2FsYXIgc2NhbGFyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0MUQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKyAgICAKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSAmJiBDVl9JU19NQVRfQ09OVCggKChDdk1hdCopYXJyKS0+dHlwZSApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgICAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgLy8gdGhlIGZpcnN0IHBhcnQgaXMgbXVsLWZyZWUgc3VmZmljaWVudCBjaGVjaworICAgICAgICAvLyB0aGF0IHRoZSBpbmRleCBpcyB3aXRoaW4gdGhlIG1hdHJpeAorICAgICAgICBpZiggKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpKG1hdC0+cm93cyArIG1hdC0+Y29scyAtIDEpICYmCisgICAgICAgICAgICAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZCkobWF0LT5yb3dzKm1hdC0+Y29scykpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdClpZHgqcGl4X3NpemU7CisgICAgfQorICAgIGVsc2UgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSB8fCAoKEN2U3BhcnNlTWF0KilhcnIpLT5kaW1zID4gMSApCisgICAgICAgIHB0ciA9IGN2UHRyMUQoIGFyciwgaWR4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsICZpZHgsICZ0eXBlLCAtMSwgMCApOworCisgICAgY3ZTY2FsYXJUb1Jhd0RhdGEoICZzY2FsYXIsIHB0ciwgdHlwZSApOworCisgICAgX19FTkRfXzsKK30KKworCisvLyBBc3NpZ25zIG5ldyB2YWx1ZSB0byBzcGVjaWZlZCBlbGVtZW50IG9mIDJEIGFycmF5CitDVl9JTVBMICB2b2lkCitjdlNldDJEKCBDdkFyciogYXJyLCBpbnQgeSwgaW50IHgsIEN2U2NhbGFyIHNjYWxhciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlNldDJEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisgICAgCisgICAgaWYoIENWX0lTX01BVCggYXJyICkpCisgICAgeworICAgICAgICBDdk1hdCogbWF0ID0gKEN2TWF0KilhcnI7CisKKyAgICAgICAgaWYoICh1bnNpZ25lZCl5ID49ICh1bnNpZ25lZCkobWF0LT5yb3dzKSB8fAorICAgICAgICAgICAgKHVuc2lnbmVkKXggPj0gKHVuc2lnbmVkKShtYXQtPmNvbHMpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiaW5kZXggaXMgb3V0IG9mIHJhbmdlIiApOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdCl5Km1hdC0+c3RlcCArIHgqQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgIH0KKyAgICBlbHNlIGlmKCAhQ1ZfSVNfU1BBUlNFX01BVCggYXJyICkpCisgICAgICAgIHB0ciA9IGN2UHRyMkQoIGFyciwgeSwgeCwgJnR5cGUgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWR4W10gPSB7IHksIHggfTsKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIGlkeCwgJnR5cGUsIC0xLCAwICk7CisgICAgfQorICAgIGN2U2NhbGFyVG9SYXdEYXRhKCAmc2NhbGFyLCBwdHIsIHR5cGUgKTsKKworICAgIF9fRU5EX187Cit9CisKKworLy8gQXNzaWducyBuZXcgdmFsdWUgdG8gc3BlY2lmZWQgZWxlbWVudCBvZiAzRCBhcnJheQorQ1ZfSU1QTCAgdm9pZAorY3ZTZXQzRCggQ3ZBcnIqIGFyciwgaW50IHosIGludCB5LCBpbnQgeCwgQ3ZTY2FsYXIgc2NhbGFyICkKK3sKKyAgICAvKkNWX0ZVTkNOQU1FKCAiY3ZTZXQzRCIgKTsqLworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisgICAgCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHIzRCggYXJyLCB6LCB5LCB4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHhbXSA9IHsgeiwgeSwgeCB9OworICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgLTEsIDAgKTsKKyAgICB9CisgICAgY3ZTY2FsYXJUb1Jhd0RhdGEoICZzY2FsYXIsIHB0ciwgdHlwZSApOworCisgICAgX19FTkRfXzsKK30KKworCisvLyBBc3NpZ25zIG5ldyB2YWx1ZSB0byBzcGVjaWZlZCBlbGVtZW50IG9mIG5EIGFycmF5CitDVl9JTVBMICB2b2lkCitjdlNldE5EKCBDdkFyciogYXJyLCBjb25zdCBpbnQqIGlkeCwgQ3ZTY2FsYXIgc2NhbGFyICkKK3sKKyAgICAvKkNWX0ZVTkNOQU1FKCAiY3ZTZXRORCIgKTsqLworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisgICAgCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHJORCggYXJyLCBpZHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgLTEsIDAgKTsKKyAgICBjdlNjYWxhclRvUmF3RGF0YSggJnNjYWxhciwgcHRyLCB0eXBlICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgIHZvaWQKK2N2U2V0UmVhbDFEKCBDdkFyciogYXJyLCBpbnQgaWR4LCBkb3VibGUgdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRSZWFsMUQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgdWNoYXIqIHB0cjsKKyAgICAKKyAgICBpZiggQ1ZfSVNfTUFUKCBhcnIgKSAmJiBDVl9JU19NQVRfQ09OVCggKChDdk1hdCopYXJyKS0+dHlwZSApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgICAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgLy8gdGhlIGZpcnN0IHBhcnQgaXMgbXVsLWZyZWUgc3VmZmljaWVudCBjaGVjaworICAgICAgICAvLyB0aGF0IHRoZSBpbmRleCBpcyB3aXRoaW4gdGhlIG1hdHJpeAorICAgICAgICBpZiggKHVuc2lnbmVkKWlkeCA+PSAodW5zaWduZWQpKG1hdC0+cm93cyArIG1hdC0+Y29scyAtIDEpICYmCisgICAgICAgICAgICAodW5zaWduZWQpaWR4ID49ICh1bnNpZ25lZCkobWF0LT5yb3dzKm1hdC0+Y29scykpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICBwdHIgPSBtYXQtPmRhdGEucHRyICsgKHNpemVfdClpZHgqcGl4X3NpemU7CisgICAgfQorICAgIGVsc2UgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSB8fCAoKEN2U3BhcnNlTWF0KilhcnIpLT5kaW1zID4gMSApCisgICAgICAgIHB0ciA9IGN2UHRyMUQoIGFyciwgaWR4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsICZpZHgsICZ0eXBlLCAtMSwgMCApOworCisgICAgaWYoIENWX01BVF9DTiggdHlwZSApID4gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgImN2U2V0UmVhbCogc3VwcG9ydCBvbmx5IHNpbmdsZS1jaGFubmVsIGFycmF5cyIgKTsKKworICAgIGlmKCBwdHIgKQorICAgICAgICBpY3ZTZXRSZWFsKCB2YWx1ZSwgcHRyLCB0eXBlICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgIHZvaWQKK2N2U2V0UmVhbDJEKCBDdkFyciogYXJyLCBpbnQgeSwgaW50IHgsIGRvdWJsZSB2YWx1ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlNldFJlYWwyRCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlID0gMDsKKyAgICB1Y2hhciogcHRyOworICAgIAorICAgIGlmKCBDVl9JU19NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworCisgICAgICAgIGlmKCAodW5zaWduZWQpeSA+PSAodW5zaWduZWQpKG1hdC0+cm93cykgfHwKKyAgICAgICAgICAgICh1bnNpZ25lZCl4ID49ICh1bnNpZ25lZCkobWF0LT5jb2xzKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgImluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICAgICAgcHRyID0gbWF0LT5kYXRhLnB0ciArIChzaXplX3QpeSptYXQtPnN0ZXAgKyB4KkNWX0VMRU1fU0laRSh0eXBlKTsKKyAgICB9CisgICAgZWxzZSBpZiggIUNWX0lTX1NQQVJTRV9NQVQoIGFyciApKQorICAgIHsKKyAgICAgICAgcHRyID0gY3ZQdHIyRCggYXJyLCB5LCB4LCAmdHlwZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgaWR4W10gPSB7IHksIHggfTsKKyAgICAgICAgcHRyID0gaWN2R2V0Tm9kZVB0ciggKEN2U3BhcnNlTWF0KilhcnIsIGlkeCwgJnR5cGUsIC0xLCAwICk7CisgICAgfQorICAgIGlmKCBDVl9NQVRfQ04oIHR5cGUgKSA+IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICJjdlNldFJlYWwqIHN1cHBvcnQgb25seSBzaW5nbGUtY2hhbm5lbCBhcnJheXMiICk7CisKKyAgICBpZiggcHRyICkKKyAgICAgICAgaWN2U2V0UmVhbCggdmFsdWUsIHB0ciwgdHlwZSApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMICB2b2lkCitjdlNldFJlYWwzRCggQ3ZBcnIqIGFyciwgaW50IHosIGludCB5LCBpbnQgeCwgZG91YmxlIHZhbHVlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0UmVhbDNEIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisgICAgCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHIzRCggYXJyLCB6LCB5LCB4LCAmdHlwZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpZHhbXSA9IHsgeiwgeSwgeCB9OworICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgLTEsIDAgKTsKKyAgICB9CisgICAgaWYoIENWX01BVF9DTiggdHlwZSApID4gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgImN2U2V0UmVhbCogc3VwcG9ydCBvbmx5IHNpbmdsZS1jaGFubmVsIGFycmF5cyIgKTsKKworICAgIGlmKCBwdHIgKQorICAgICAgICBpY3ZTZXRSZWFsKCB2YWx1ZSwgcHRyLCB0eXBlICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgIHZvaWQKK2N2U2V0UmVhbE5EKCBDdkFyciogYXJyLCBjb25zdCBpbnQqIGlkeCwgZG91YmxlIHZhbHVlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0UmVhbE5EIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUgPSAwOworICAgIHVjaGFyKiBwdHI7CisgICAgCisgICAgaWYoICFDVl9JU19TUEFSU0VfTUFUKCBhcnIgKSkKKyAgICAgICAgcHRyID0gY3ZQdHJORCggYXJyLCBpZHgsICZ0eXBlICk7CisgICAgZWxzZQorICAgICAgICBwdHIgPSBpY3ZHZXROb2RlUHRyKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAmdHlwZSwgLTEsIDAgKTsKKworICAgIGlmKCBDVl9NQVRfQ04oIHR5cGUgKSA+IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICJjdlNldFJlYWwqIHN1cHBvcnQgb25seSBzaW5nbGUtY2hhbm5lbCBhcnJheXMiICk7CisKKyAgICBpZiggcHRyICkKKyAgICAgICAgaWN2U2V0UmVhbCggdmFsdWUsIHB0ciwgdHlwZSApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q2xlYXJORCggQ3ZBcnIqIGFyciwgY29uc3QgaW50KiBpZHggKQoreworICAgIC8qQ1ZfRlVOQ05BTUUoICJjdkNsZWFyTkQiICk7Ki8KKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhQ1ZfSVNfU1BBUlNFX01BVCggYXJyICkpCisgICAgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgdWNoYXIqIHB0cjsKKyAgICAgICAgcHRyID0gY3ZQdHJORCggYXJyLCBpZHgsICZ0eXBlICk7CisgICAgICAgIGlmKCBwdHIgKQorICAgICAgICAgICAgQ1ZfWkVST19DSEFSKCBwdHIsIENWX0VMRU1fU0laRSh0eXBlKSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpY3ZEZWxldGVOb2RlKCAoQ3ZTcGFyc2VNYXQqKWFyciwgaWR4LCAwICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gdG8gQ3ZNYXQgb3IgSXBsSW1hZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIGNvbnZlcnQgYXJyYXkgKEN2TWF0IG9yIElwbEltYWdlKSB0byBDdk1hdAorQ1ZfSU1QTCBDdk1hdCoKK2N2R2V0TWF0KCBjb25zdCBDdkFyciogYXJyYXksIEN2TWF0KiBtYXQsCisgICAgICAgICAgaW50KiBwQ09JLCBpbnQgYWxsb3dORCApCit7CisgICAgQ3ZNYXQqIHJlc3VsdCA9IDA7CisgICAgQ3ZNYXQqIHNyYyA9IChDdk1hdCopYXJyYXk7CisgICAgaW50IGNvaSA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldE1hdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhbWF0IHx8ICFzcmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgYXJyYXkgcG9pbnRlciBpcyBwYXNzZWQiICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0hEUihzcmMpKQorICAgIHsKKyAgICAgICAgaWYoICFzcmMtPmRhdGEucHRyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIG1hdHJpeCBoYXMgTlVMTCBkYXRhIHBvaW50ZXIiICk7CisgICAgICAgIAorICAgICAgICByZXN1bHQgPSAoQ3ZNYXQqKXNyYzsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfSVNfSU1BR0VfSERSKHNyYykgKQorICAgIHsKKyAgICAgICAgY29uc3QgSXBsSW1hZ2UqIGltZyA9IChjb25zdCBJcGxJbWFnZSopc3JjOworICAgICAgICBpbnQgZGVwdGgsIG9yZGVyOworCisgICAgICAgIGlmKCBpbWctPmltYWdlRGF0YSA9PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIGltYWdlIGhhcyBOVUxMIGRhdGEgcG9pbnRlciIgKTsKKworICAgICAgICBkZXB0aCA9IGljdklwbFRvQ3ZEZXB0aCggaW1nLT5kZXB0aCApOworICAgICAgICBpZiggZGVwdGggPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfQmFkRGVwdGggKTsKKworICAgICAgICBvcmRlciA9IGltZy0+ZGF0YU9yZGVyICYgKGltZy0+bkNoYW5uZWxzID4gMSA/IC0xIDogMCk7CisKKyAgICAgICAgaWYoIGltZy0+cm9pICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG9yZGVyID09IElQTF9EQVRBX09SREVSX1BMQU5FICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IGRlcHRoOworCisgICAgICAgICAgICAgICAgaWYoIGltZy0+cm9pLT5jb2kgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLAorICAgICAgICAgICAgICAgICAgICAiSW1hZ2VzIHdpdGggcGxhbmFyIGRhdGEgbGF5b3V0IHNob3VsZCBiZSB1c2VkIHdpdGggQ09JIHNlbGVjdGVkIiApOworCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TWF0SGVhZGVyKCBtYXQsIGltZy0+cm9pLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+cm9pLT53aWR0aCwgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5pbWFnZURhdGEgKyAoaW1nLT5yb2ktPmNvaS0xKSppbWctPmltYWdlU2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+cm9pLT55T2Zmc2V0KmltZy0+d2lkdGhTdGVwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1nLT5yb2ktPnhPZmZzZXQqQ1ZfRUxFTV9TSVpFKHR5cGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWctPndpZHRoU3RlcCApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgLyogcGl4ZWwgb3JkZXIgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdHlwZSA9IENWX01BS0VUWVBFKCBkZXB0aCwgaW1nLT5uQ2hhbm5lbHMgKTsKKyAgICAgICAgICAgICAgICBjb2kgPSBpbWctPnJvaS0+Y29pOworCisgICAgICAgICAgICAgICAgaWYoIGltZy0+bkNoYW5uZWxzID4gQ1ZfQ05fTUFYICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBpbWFnZSBpcyBpbnRlcmxlYXZlZCBhbmQgaGFzIG92ZXIgQ1ZfQ05fTUFYIGNoYW5uZWxzIiApOworCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TWF0SGVhZGVyKCBtYXQsIGltZy0+cm9pLT5oZWlnaHQsIGltZy0+cm9pLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIGltZy0+aW1hZ2VEYXRhICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+cm9pLT55T2Zmc2V0KmltZy0+d2lkdGhTdGVwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+cm9pLT54T2Zmc2V0KkNWX0VMRU1fU0laRSh0eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+d2lkdGhTdGVwICkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHR5cGUgPSBDVl9NQUtFVFlQRSggZGVwdGgsIGltZy0+bkNoYW5uZWxzICk7CisKKyAgICAgICAgICAgIGlmKCBvcmRlciAhPSBJUExfREFUQV9PUkRFUl9QSVhFTCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJQaXhlbCBvcmRlciBzaG91bGQgYmUgdXNlZCB3aXRoIGNvaSA9PSAwIiApOworCisgICAgICAgICAgICBDVl9DQUxMKCBjdkluaXRNYXRIZWFkZXIoIG1hdCwgaW1nLT5oZWlnaHQsIGltZy0+d2lkdGgsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+aW1hZ2VEYXRhLCBpbWctPndpZHRoU3RlcCApKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IG1hdDsKKyAgICB9CisgICAgZWxzZSBpZiggYWxsb3dORCAmJiBDVl9JU19NQVRORF9IRFIoc3JjKSApCisgICAgeworICAgICAgICBDdk1hdE5EKiBtYXRuZCA9IChDdk1hdE5EKilzcmM7CisgICAgICAgIGludCBpOworICAgICAgICBpbnQgc2l6ZTEgPSBtYXRuZC0+ZGltWzBdLnNpemUsIHNpemUyID0gMTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhc3JjLT5kYXRhLnB0ciApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIklucHV0IGFycmF5IGhhcyBOVUxMIGRhdGEgcG9pbnRlciIgKTsKKworICAgICAgICBpZiggIUNWX0lTX01BVF9DT05UKCBtYXRuZC0+dHlwZSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk9ubHkgY29udGludW91cyBuRCBhcnJheXMgYXJlIHN1cHBvcnRlZCBoZXJlIiApOworCisgICAgICAgIGlmKCBtYXRuZC0+ZGltcyA+IDIgKQorICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IG1hdG5kLT5kaW1zOyBpKysgKQorICAgICAgICAgICAgICAgIHNpemUyICo9IG1hdG5kLT5kaW1baV0uc2l6ZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc2l6ZTIgPSBtYXRuZC0+ZGltcyA9PSAxID8gMSA6IG1hdG5kLT5kaW1bMV0uc2l6ZTsKKworICAgICAgICBtYXQtPnJlZmNvdW50ID0gMDsKKyAgICAgICAgbWF0LT5oZHJfcmVmY291bnQgPSAwOworICAgICAgICBtYXQtPmRhdGEucHRyID0gbWF0bmQtPmRhdGEucHRyOworICAgICAgICBtYXQtPnJvd3MgPSBzaXplMTsKKyAgICAgICAgbWF0LT5jb2xzID0gc2l6ZTI7CisgICAgICAgIG1hdC0+dHlwZSA9IENWX01BVF9UWVBFKG1hdG5kLT50eXBlKSB8IENWX01BVF9NQUdJQ19WQUwgfCBDVl9NQVRfQ09OVF9GTEFHOworICAgICAgICBtYXQtPnN0ZXAgPSBzaXplMipDVl9FTEVNX1NJWkUobWF0bmQtPnR5cGUpOworICAgICAgICBtYXQtPnN0ZXAgJj0gc2l6ZTEgPiAxID8gLTEgOiAwOworCisgICAgICAgIGljdkNoZWNrSHVnZSggbWF0ICk7CisgICAgICAgIHJlc3VsdCA9IG1hdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEZsYWcsICJVbnJlY29nbml6ZWQgb3IgdW5zdXBwb3J0ZWQgYXJyYXkgdHlwZSIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIHBDT0kgKQorICAgICAgICAqcENPSSA9IGNvaTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworQ1ZfSU1QTCBDdkFycioKK2N2UmVzaGFwZU1hdE5EKCBjb25zdCBDdkFyciogYXJyLAorICAgICAgICAgICAgICAgIGludCBzaXplb2ZfaGVhZGVyLCBDdkFyciogX2hlYWRlciwKKyAgICAgICAgICAgICAgICBpbnQgbmV3X2NuLCBpbnQgbmV3X2RpbXMsIGludCogbmV3X3NpemVzICkKK3sKKyAgICBDdkFyciogcmVzdWx0ID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2UmVzaGFwZU1hdE5EIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGRpbXMsIGNvaSA9IDA7CisKKyAgICBpZiggIWFyciB8fCAhX2hlYWRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBwb2ludGVyIHRvIGFycmF5IG9yIGRlc3RpbmF0aW9uIGhlYWRlciIgKTsKKworICAgIGlmKCBuZXdfY24gPT0gMCAmJiBuZXdfZGltcyA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk5vbmUgb2YgYXJyYXkgcGFyYW1ldGVycyBpcyBjaGFuZ2VkOiBkdW1teSBjYWxsPyIgKTsKKworICAgIENWX0NBTEwoIGRpbXMgPSBjdkdldERpbXMoIGFyciApKTsKKworICAgIGlmKCBuZXdfZGltcyA9PSAwICkKKyAgICB7CisgICAgICAgIG5ld19zaXplcyA9IDA7CisgICAgICAgIG5ld19kaW1zID0gZGltczsKKyAgICB9CisgICAgZWxzZSBpZiggbmV3X2RpbXMgPT0gMSApCisgICAgeworICAgICAgICBuZXdfc2l6ZXMgPSAwOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggbmV3X2RpbXMgPD0gMCB8fCBuZXdfZGltcyA+IENWX01BWF9ESU0gKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOb24tcG9zaXRpdmUgb3IgdG9vIGxhcmdlIG51bWJlciBvZiBkaW1lbnNpb25zIiApOworICAgICAgICBpZiggIW5ld19zaXplcyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5ldyBkaW1lbnNpb24gc2l6ZXMgYXJlIG5vdCBzcGVjaWZpZWQiICk7CisgICAgfQorCisgICAgaWYoIG5ld19kaW1zIDw9IDIgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG1hdCA9IChDdk1hdCopYXJyOworICAgICAgICBDdk1hdCogaGVhZGVyID0gKEN2TWF0KilfaGVhZGVyOworICAgICAgICBpbnQqIHJlZmNvdW50ID0gMDsKKyAgICAgICAgaW50ICBoZHJfcmVmY291bnQgPSAwOworICAgICAgICBpbnQgIHRvdGFsX3dpZHRoLCBuZXdfcm93cywgY247CisKKyAgICAgICAgaWYoIHNpemVvZl9oZWFkZXIgIT0gc2l6ZW9mKEN2TWF0KSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgaGVhZGVyIHNob3VsZCBiZSBDdk1hdCIgKTsKKworICAgICAgICBpZiggbWF0ID09IGhlYWRlciApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZmNvdW50ID0gbWF0LT5yZWZjb3VudDsKKyAgICAgICAgICAgIGhkcl9yZWZjb3VudCA9IG1hdC0+aGRyX3JlZmNvdW50OworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoICFDVl9JU19NQVQoIG1hdCApKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgaGVhZGVyLCAmY29pLCAxICkpOworCisgICAgICAgIGNuID0gQ1ZfTUFUX0NOKCBtYXQtPnR5cGUgKTsKKyAgICAgICAgdG90YWxfd2lkdGggPSBtYXQtPmNvbHMgKiBjbjsKKworICAgICAgICBpZiggbmV3X2NuID09IDAgKQorICAgICAgICAgICAgbmV3X2NuID0gY247CisKKyAgICAgICAgaWYoIG5ld19zaXplcyApCisgICAgICAgICAgICBuZXdfcm93cyA9IG5ld19zaXplc1swXTsKKyAgICAgICAgZWxzZSBpZiggbmV3X2RpbXMgPT0gMSApCisgICAgICAgICAgICBuZXdfcm93cyA9IHRvdGFsX3dpZHRoKm1hdC0+cm93cy9uZXdfY247CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgbmV3X3Jvd3MgPSBtYXQtPnJvd3M7CisgICAgICAgICAgICBpZiggbmV3X2NuID4gdG90YWxfd2lkdGggKQorICAgICAgICAgICAgICAgIG5ld19yb3dzID0gbWF0LT5yb3dzICogdG90YWxfd2lkdGggLyBuZXdfY247CisgICAgICAgIH0KKworICAgICAgICBpZiggbmV3X3Jvd3MgIT0gbWF0LT5yb3dzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHRvdGFsX3NpemUgPSB0b3RhbF93aWR0aCAqIG1hdC0+cm93czsKKworICAgICAgICAgICAgaWYoICFDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZFN0ZXAsCisgICAgICAgICAgICAgICAgIlRoZSBtYXRyaXggaXMgbm90IGNvbnRpbnVvdXMgc28gdGhlIG51bWJlciBvZiByb3dzIGNhbiBub3QgYmUgY2hhbmdlZCIgKTsKKworICAgICAgICAgICAgdG90YWxfd2lkdGggPSB0b3RhbF9zaXplIC8gbmV3X3Jvd3M7CisKKyAgICAgICAgICAgIGlmKCB0b3RhbF93aWR0aCAqIG5ld19yb3dzICE9IHRvdGFsX3NpemUgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgdG90YWwgbnVtYmVyIG9mIG1hdHJpeCBlbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBkaXZpc2libGUgYnkgdGhlIG5ldyBudW1iZXIgb2Ygcm93cyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlci0+cm93cyA9IG5ld19yb3dzOworICAgICAgICBoZWFkZXItPmNvbHMgPSB0b3RhbF93aWR0aCAvIG5ld19jbjsKKworICAgICAgICBpZiggaGVhZGVyLT5jb2xzICogbmV3X2NuICE9IHRvdGFsX3dpZHRoIHx8CisgICAgICAgICAgICAobmV3X3NpemVzICYmIGhlYWRlci0+Y29scyAhPSBuZXdfc2l6ZXNbMV0pICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgdG90YWwgbWF0cml4IHdpZHRoIGlzIG5vdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRpdmlzaWJsZSBieSB0aGUgbmV3IG51bWJlciBvZiBjb2x1bW5zIiApOworCisgICAgICAgIGhlYWRlci0+dHlwZSA9IENWX01BS0VUWVBFKCBtYXQtPnR5cGUgJiB+Q1ZfTUFUX0NOX01BU0ssIG5ld19jbiApOworICAgICAgICBoZWFkZXItPnN0ZXAgPSBoZWFkZXItPmNvbHMgKiBDVl9FTEVNX1NJWkUobWF0LT50eXBlKTsKKyAgICAgICAgaGVhZGVyLT5zdGVwICY9IG5ld19yb3dzID4gMSA/IC0xIDogMDsKKyAgICAgICAgaGVhZGVyLT5yZWZjb3VudCA9IHJlZmNvdW50OworICAgICAgICBoZWFkZXItPmhkcl9yZWZjb3VudCA9IGhkcl9yZWZjb3VudDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZNYXRORCogaGVhZGVyID0gKEN2TWF0TkQqKV9oZWFkZXI7CisKKyAgICAgICAgaWYoIHNpemVvZl9oZWFkZXIgIT0gc2l6ZW9mKEN2TWF0TkQpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUaGUgaGVhZGVyIHNob3VsZCBiZSBDdk1hdE5EIiApOworICAgICAgICAKKyAgICAgICAgaWYoICFuZXdfc2l6ZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIUNWX0lTX01BVE5EKCBhcnIgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIHNvdXJjZSBhcnJheSBtdXN0IGJlIEN2TWF0TkQiICk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgICAgICBhc3NlcnQoIG5ld19jbiA+IDAgKTsKKyAgICAgICAgICAgIGludCBsYXN0X2RpbV9zaXplID0gbWF0LT5kaW1bbWF0LT5kaW1zLTFdLnNpemUqQ1ZfTUFUX0NOKG1hdC0+dHlwZSk7CisgICAgICAgICAgICBpbnQgbmV3X3NpemUgPSBsYXN0X2RpbV9zaXplL25ld19jbjsKKworICAgICAgICAgICAgaWYoIG5ld19zaXplKm5ld19jbiAhPSBsYXN0X2RpbV9zaXplICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICJUaGUgbGFzdCBkaW1lbnNpb24gZnVsbCBzaXplIGlzIG5vdCBkaXZpc2libGUgYnkgbmV3IG51bWJlciBvZiBjaGFubmVscyIpOworCisgICAgICAgICAgICBpZiggbWF0ICE9IGhlYWRlciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBoZWFkZXIsIG1hdCwgc2l6ZW9mKCpoZWFkZXIpKTsKKyAgICAgICAgICAgICAgICBoZWFkZXItPnJlZmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBoZWFkZXItPmhkcl9yZWZjb3VudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhlYWRlci0+ZGltW2hlYWRlci0+ZGltcy0xXS5zaXplID0gbmV3X3NpemU7CisgICAgICAgICAgICBoZWFkZXItPnR5cGUgPSBDVl9NQUtFVFlQRSggaGVhZGVyLT50eXBlICYgfkNWX01BVF9DTl9NQVNLLCBuZXdfY24gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0TkQgc3R1YjsKKyAgICAgICAgICAgIEN2TWF0TkQqIG1hdCA9IChDdk1hdE5EKilhcnI7CisgICAgICAgICAgICBpbnQgaSwgc2l6ZTEsIHNpemUyOworICAgICAgICAgICAgaW50IHN0ZXA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBuZXdfY24gIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICAgICAiU2ltdWx0YW5lb3VzIGNoYW5nZSBvZiBzaGFwZSBhbmQgbnVtYmVyIG9mIGNoYW5uZWxzIGlzIG5vdCBzdXBwb3J0ZWQuICIKKyAgICAgICAgICAgICAgICAiRG8gaXQgYnkgMiBzZXBhcmF0ZSBjYWxscyIgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoICFDVl9JU19NQVRORCggbWF0ICkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZHZXRNYXRORCggbWF0LCAmc3R1YiwgJmNvaSApKTsKKyAgICAgICAgICAgICAgICBtYXQgPSAmc3R1YjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiTm9uLWNvbnRpbnVvdXMgbkQgYXJyYXlzIGFyZSBub3Qgc3VwcG9ydGVkIiApOworCisgICAgICAgICAgICBzaXplMSA9IG1hdC0+ZGltWzBdLnNpemU7CisgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgZGltczsgaSsrICkKKyAgICAgICAgICAgICAgICBzaXplMSAqPSBtYXQtPmRpbVtpXS5zaXplOworCisgICAgICAgICAgICBzaXplMiA9IDE7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbmV3X2RpbXM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG5ld19zaXplc1tpXSA8PSAwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICJPbmUgb2YgbmV3IGRpbWVuc2lvbiBzaXplcyBpcyBub24tcG9zaXRpdmUiICk7CisgICAgICAgICAgICAgICAgc2l6ZTIgKj0gbmV3X3NpemVzW2ldOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggc2l6ZTEgIT0gc2l6ZTIgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgICAgICJOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIG9yaWdpbmFsIGFuZCByZXNoYXBlZCBhcnJheSBpcyBkaWZmZXJlbnQiICk7CisKKyAgICAgICAgICAgIGlmKCBoZWFkZXIgIT0gbWF0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoZWFkZXItPnJlZmNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBoZWFkZXItPmhkcl9yZWZjb3VudCA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhlYWRlci0+ZGltcyA9IG5ld19kaW1zOworICAgICAgICAgICAgaGVhZGVyLT50eXBlID0gbWF0LT50eXBlOworICAgICAgICAgICAgaGVhZGVyLT5kYXRhLnB0ciA9IG1hdC0+ZGF0YS5wdHI7CisgICAgICAgICAgICBzdGVwID0gQ1ZfRUxFTV9TSVpFKGhlYWRlci0+dHlwZSk7CisKKyAgICAgICAgICAgIGZvciggaSA9IG5ld19kaW1zIC0gMTsgaSA+PSAwOyBpLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGhlYWRlci0+ZGltW2ldLnNpemUgPSBuZXdfc2l6ZXNbaV07CisgICAgICAgICAgICAgICAgaGVhZGVyLT5kaW1baV0uc3RlcCA9IHN0ZXA7CisgICAgICAgICAgICAgICAgc3RlcCAqPSBuZXdfc2l6ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIWNvaSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICJDT0kgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIG9wZXJhdGlvbiIgKTsKKworICAgIHJlc3VsdCA9IF9oZWFkZXI7CisgICAgCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworQ1ZfSU1QTCBDdk1hdCoKK2N2UmVzaGFwZSggY29uc3QgQ3ZBcnIqIGFycmF5LCBDdk1hdCogaGVhZGVyLAorICAgICAgICAgICBpbnQgbmV3X2NuLCBpbnQgbmV3X3Jvd3MgKQoreworICAgIEN2TWF0KiByZXN1bHQgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZXNoYXBlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgKm1hdCA9IChDdk1hdCopYXJyYXk7CisgICAgaW50IHRvdGFsX3dpZHRoLCBuZXdfd2lkdGg7CisKKyAgICBpZiggIWhlYWRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICFDVl9JU19NQVQoIG1hdCApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsIGhlYWRlciwgJmNvaSwgMSApKTsKKyAgICAgICAgaWYoIGNvaSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiQ09JIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgfQorCisgICAgaWYoIG5ld19jbiA9PSAwICkKKyAgICAgICAgbmV3X2NuID0gQ1ZfTUFUX0NOKG1hdC0+dHlwZSk7CisgICAgZWxzZSBpZiggKHVuc2lnbmVkKShuZXdfY24gLSAxKSA+IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICIiICk7CisKKyAgICBpZiggbWF0ICE9IGhlYWRlciApCisgICAgeworICAgICAgICBpbnQgaGRyX3JlZmNvdW50ID0gaGVhZGVyLT5oZHJfcmVmY291bnQ7CisgICAgICAgICpoZWFkZXIgPSAqbWF0OworICAgICAgICBoZWFkZXItPnJlZmNvdW50ID0gMDsKKyAgICAgICAgaGVhZGVyLT5oZHJfcmVmY291bnQgPSBoZHJfcmVmY291bnQ7CisgICAgfQorCisgICAgdG90YWxfd2lkdGggPSBtYXQtPmNvbHMgKiBDVl9NQVRfQ04oIG1hdC0+dHlwZSApOworCisgICAgaWYoIChuZXdfY24gPiB0b3RhbF93aWR0aCB8fCB0b3RhbF93aWR0aCAlIG5ld19jbiAhPSAwKSAmJiBuZXdfcm93cyA9PSAwICkKKyAgICAgICAgbmV3X3Jvd3MgPSBtYXQtPnJvd3MgKiB0b3RhbF93aWR0aCAvIG5ld19jbjsKKworICAgIGlmKCBuZXdfcm93cyA9PSAwIHx8IG5ld19yb3dzID09IG1hdC0+cm93cyApCisgICAgeworICAgICAgICBoZWFkZXItPnJvd3MgPSBtYXQtPnJvd3M7CisgICAgICAgIGhlYWRlci0+c3RlcCA9IG1hdC0+c3RlcDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHRvdGFsX3NpemUgPSB0b3RhbF93aWR0aCAqIG1hdC0+cm93czsKKyAgICAgICAgaWYoICFDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkU3RlcCwKKyAgICAgICAgICAgICJUaGUgbWF0cml4IGlzIG5vdCBjb250aW51b3VzLCB0aHVzIGl0cyBudW1iZXIgb2Ygcm93cyBjYW4gbm90IGJlIGNoYW5nZWQiICk7CisKKyAgICAgICAgaWYoICh1bnNpZ25lZCluZXdfcm93cyA+ICh1bnNpZ25lZCl0b3RhbF9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiQmFkIG5ldyBudW1iZXIgb2Ygcm93cyIgKTsKKworICAgICAgICB0b3RhbF93aWR0aCA9IHRvdGFsX3NpemUgLyBuZXdfcm93czsKKworICAgICAgICBpZiggdG90YWxfd2lkdGggKiBuZXdfcm93cyAhPSB0b3RhbF9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgdG90YWwgbnVtYmVyIG9mIG1hdHJpeCBlbGVtZW50cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgbmV3IG51bWJlciBvZiByb3dzIiApOworCisgICAgICAgIGhlYWRlci0+cm93cyA9IG5ld19yb3dzOworICAgICAgICBoZWFkZXItPnN0ZXAgPSB0b3RhbF93aWR0aCAqIENWX0VMRU1fU0laRTEobWF0LT50eXBlKTsKKyAgICB9CisKKyAgICBuZXdfd2lkdGggPSB0b3RhbF93aWR0aCAvIG5ld19jbjsKKworICAgIGlmKCBuZXdfd2lkdGggKiBuZXdfY24gIT0gdG90YWxfd2lkdGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICJUaGUgdG90YWwgd2lkdGggaXMgbm90IGRpdmlzaWJsZSBieSB0aGUgbmV3IG51bWJlciBvZiBjaGFubmVscyIgKTsKKworICAgIGhlYWRlci0+Y29scyA9IG5ld193aWR0aDsKKyAgICBoZWFkZXItPnR5cGUgPSBDVl9NQUtFVFlQRSggbWF0LT50eXBlICYgfkNWX01BVF9DTl9NQVNLLCBuZXdfY24gKTsKKworICAgIHJlc3VsdCA9IGhlYWRlcjsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gIHJlc3VsdDsKK30KKworCisvLyBjb252ZXJ0IGFycmF5IChDdk1hdCBvciBJcGxJbWFnZSkgdG8gSXBsSW1hZ2UKK0NWX0lNUEwgSXBsSW1hZ2UqCitjdkdldEltYWdlKCBjb25zdCBDdkFyciogYXJyYXksIElwbEltYWdlKiBpbWcgKQoreworICAgIElwbEltYWdlKiByZXN1bHQgPSAwOworICAgIGNvbnN0IElwbEltYWdlKiBzcmMgPSAoY29uc3QgSXBsSW1hZ2UqKWFycmF5OworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBkZXB0aDsKKworICAgIGlmKCAhaW1nICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNOdWxsUHRyICk7CisKKyAgICBpZiggIUNWX0lTX0lNQUdFX0hEUihzcmMpICkKKyAgICB7CisgICAgICAgIGNvbnN0IEN2TWF0KiBtYXQgPSAoY29uc3QgQ3ZNYXQqKXNyYzsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0hEUihtYXQpKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNCYWRGbGFnICk7CisKKyAgICAgICAgaWYoIG1hdC0+ZGF0YS5wdHIgPT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c051bGxQdHIgKTsKKworICAgICAgICBkZXB0aCA9IGN2Q3ZUb0lwbERlcHRoKG1hdC0+dHlwZSk7CisKKyAgICAgICAgY3ZJbml0SW1hZ2VIZWFkZXIoIGltZywgY3ZTaXplKG1hdC0+Y29scywgbWF0LT5yb3dzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoLCBDVl9NQVRfQ04obWF0LT50eXBlKSApOworICAgICAgICBjdlNldERhdGEoIGltZywgbWF0LT5kYXRhLnB0ciwgbWF0LT5zdGVwICk7CisKKyAgICAgICAgcmVzdWx0ID0gaW1nOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXN1bHQgPSAoSXBsSW1hZ2UqKXNyYzsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXBsSW1hZ2Utc3BlY2lmaWMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBJcGxST0kqIGljdkNyZWF0ZVJPSSggaW50IGNvaSwgaW50IHhPZmZzZXQsIGludCB5T2Zmc2V0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworICAgIElwbFJPSSAqcm9pID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q3JlYXRlUk9JIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFDdklQTC5jcmVhdGVST0kgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcm9pID0gKElwbFJPSSopY3ZBbGxvYyggc2l6ZW9mKCpyb2kpKSk7CisKKyAgICAgICAgcm9pLT5jb2kgPSBjb2k7CisgICAgICAgIHJvaS0+eE9mZnNldCA9IHhPZmZzZXQ7CisgICAgICAgIHJvaS0+eU9mZnNldCA9IHlPZmZzZXQ7CisgICAgICAgIHJvaS0+d2lkdGggPSB3aWR0aDsKKyAgICAgICAgcm9pLT5oZWlnaHQgPSBoZWlnaHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJvaSA9IEN2SVBMLmNyZWF0ZVJPSSggY29pLCB4T2Zmc2V0LCB5T2Zmc2V0LCB3aWR0aCwgaGVpZ2h0ICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByb2k7Cit9CisKK3N0YXRpYyAgdm9pZAoraWN2R2V0Q29sb3JNb2RlbCggaW50IG5jaGFubmVscywgY29uc3QgY2hhcioqIGNvbG9yTW9kZWwsIGNvbnN0IGNoYXIqKiBjaGFubmVsU2VxICkKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciogdGFiW11bMl0gPQorICAgIHsKKyAgICAgICAgeyJHUkFZIiwgIkdSQVkifSwKKyAgICAgICAgeyIiLCIifSwKKyAgICAgICAgeyJSR0IiLCJCR1IifSwKKyAgICAgICAgeyJSR0IiLCJCR1JBIn0KKyAgICB9OworCisgICAgbmNoYW5uZWxzLS07CisgICAgKmNvbG9yTW9kZWwgPSAqY2hhbm5lbFNlcSA9ICIiOworCisgICAgaWYoICh1bnNpZ25lZCluY2hhbm5lbHMgPD0gMyApCisgICAgeworICAgICAgICAqY29sb3JNb2RlbCA9IHRhYltuY2hhbm5lbHNdWzBdOworICAgICAgICAqY2hhbm5lbFNlcSA9IHRhYltuY2hhbm5lbHNdWzFdOworICAgIH0KK30KKworCisvLyBjcmVhdGUgSXBsSW1hZ2UgaGVhZGVyCitDVl9JTVBMIElwbEltYWdlICoKK2N2Q3JlYXRlSW1hZ2VIZWFkZXIoIEN2U2l6ZSBzaXplLCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApCit7CisgICAgSXBsSW1hZ2UgKmltZyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlSW1hZ2VIZWFkZXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIUN2SVBMLmNyZWF0ZUhlYWRlciApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpbWcgPSAoSXBsSW1hZ2UgKiljdkFsbG9jKCBzaXplb2YoICppbWcgKSkpOworICAgICAgICBDVl9DQUxMKCBjdkluaXRJbWFnZUhlYWRlciggaW1nLCBzaXplLCBkZXB0aCwgY2hhbm5lbHMsIElQTF9PUklHSU5fVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9ERUZBVUxUX0lNQUdFX1JPV19BTElHTiApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqY29sb3JNb2RlbCwgKmNoYW5uZWxTZXE7CisKKyAgICAgICAgaWN2R2V0Q29sb3JNb2RlbCggY2hhbm5lbHMsICZjb2xvck1vZGVsLCAmY2hhbm5lbFNlcSApOworCisgICAgICAgIGltZyA9IEN2SVBMLmNyZWF0ZUhlYWRlciggY2hhbm5lbHMsIDAsIGRlcHRoLCAoY2hhciopY29sb3JNb2RlbCwgKGNoYXIqKWNoYW5uZWxTZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBMX0RBVEFfT1JERVJfUElYRUwsIElQTF9PUklHSU5fVEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfREVGQVVMVF9JTUFHRV9ST1dfQUxJR04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQsIDAsIDAsIDAsIDAgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICYmIGltZyApCisgICAgICAgIGN2UmVsZWFzZUltYWdlSGVhZGVyKCAmaW1nICk7CisKKyAgICByZXR1cm4gaW1nOworfQorCisKKy8vIGNyZWF0ZSBJcGxJbWFnZSBoZWFkZXIgYW5kIGFsbG9jYXRlIHVuZGVybHlpbmcgZGF0YQorQ1ZfSU1QTCBJcGxJbWFnZSAqCitjdkNyZWF0ZUltYWdlKCBDdlNpemUgc2l6ZSwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKQoreworICAgIElwbEltYWdlICppbWcgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUltYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0FMTCggaW1nID0gY3ZDcmVhdGVJbWFnZUhlYWRlciggc2l6ZSwgZGVwdGgsIGNoYW5uZWxzICkpOworICAgIGFzc2VydCggaW1nICk7CisgICAgQ1ZfQ0FMTCggY3ZDcmVhdGVEYXRhKCBpbWcgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZpbWcgKTsKKworICAgIHJldHVybiBpbWc7Cit9CisKKworLy8gaW5pdGFsaXplIElwbEltYWdlIGhlYWRlciwgYWxsb2NhdGVkIGJ5IHRoZSB1c2VyCitDVl9JTVBMIElwbEltYWdlKgorY3ZJbml0SW1hZ2VIZWFkZXIoIElwbEltYWdlICogaW1hZ2UsIEN2U2l6ZSBzaXplLCBpbnQgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxzLCBpbnQgb3JpZ2luLCBpbnQgYWxpZ24gKQoreworICAgIElwbEltYWdlKiByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkluaXRJbWFnZUhlYWRlciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGNoYXIgKmNvbG9yTW9kZWwsICpjaGFubmVsU2VxOworCisgICAgaWYoICFpbWFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9IZWFkZXJJc051bGwsICJudWxsIHBvaW50ZXIgdG8gaGVhZGVyIiApOworCisgICAgbWVtc2V0KCBpbWFnZSwgMCwgc2l6ZW9mKCAqaW1hZ2UgKSk7CisgICAgaW1hZ2UtPm5TaXplID0gc2l6ZW9mKCAqaW1hZ2UgKTsKKworICAgIENWX0NBTEwoIGljdkdldENvbG9yTW9kZWwoIGNoYW5uZWxzLCAmY29sb3JNb2RlbCwgJmNoYW5uZWxTZXEgKSk7CisgICAgc3RybmNweSggaW1hZ2UtPmNvbG9yTW9kZWwsIGNvbG9yTW9kZWwsIDQgKTsKKyAgICBzdHJuY3B5KCBpbWFnZS0+Y2hhbm5lbFNlcSwgY2hhbm5lbFNlcSwgNCApOworCisgICAgaWYoIHNpemUud2lkdGggPCAwIHx8IHNpemUuaGVpZ2h0IDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRST0lTaXplLCAiQmFkIGlucHV0IHJvaSIgKTsKKworICAgIGlmKCAoZGVwdGggIT0gKGludClJUExfREVQVEhfMVUgJiYgZGVwdGggIT0gKGludClJUExfREVQVEhfOFUgJiYKKyAgICAgICAgIGRlcHRoICE9IChpbnQpSVBMX0RFUFRIXzhTICYmIGRlcHRoICE9IChpbnQpSVBMX0RFUFRIXzE2VSAmJgorICAgICAgICAgZGVwdGggIT0gKGludClJUExfREVQVEhfMTZTICYmIGRlcHRoICE9IChpbnQpSVBMX0RFUFRIXzMyUyAmJgorICAgICAgICAgZGVwdGggIT0gKGludClJUExfREVQVEhfMzJGICYmIGRlcHRoICE9IChpbnQpSVBMX0RFUFRIXzY0RikgfHwKKyAgICAgICAgIGNoYW5uZWxzIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWREZXB0aCwgIlVuc3VwcG9ydGVkIGZvcm1hdCIgKTsKKyAgICBpZiggb3JpZ2luICE9IENWX09SSUdJTl9CTCAmJiBvcmlnaW4gIT0gQ1ZfT1JJR0lOX1RMICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE9yaWdpbiwgIkJhZCBpbnB1dCBvcmlnaW4iICk7CisKKyAgICBpZiggYWxpZ24gIT0gNCAmJiBhbGlnbiAhPSA4ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZEFsaWduLCAiQmFkIGlucHV0IGFsaWduIiApOworCisgICAgaW1hZ2UtPndpZHRoID0gc2l6ZS53aWR0aDsKKyAgICBpbWFnZS0+aGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7CisKKyAgICBpZiggaW1hZ2UtPnJvaSApCisgICAgeworICAgICAgICBpbWFnZS0+cm9pLT5jb2kgPSAwOworICAgICAgICBpbWFnZS0+cm9pLT54T2Zmc2V0ID0gaW1hZ2UtPnJvaS0+eU9mZnNldCA9IDA7CisgICAgICAgIGltYWdlLT5yb2ktPndpZHRoID0gc2l6ZS53aWR0aDsKKyAgICAgICAgaW1hZ2UtPnJvaS0+aGVpZ2h0ID0gc2l6ZS5oZWlnaHQ7CisgICAgfQorCisgICAgaW1hZ2UtPm5DaGFubmVscyA9IE1BWCggY2hhbm5lbHMsIDEgKTsKKyAgICBpbWFnZS0+ZGVwdGggPSBkZXB0aDsKKyAgICBpbWFnZS0+YWxpZ24gPSBhbGlnbjsKKyAgICBpbWFnZS0+d2lkdGhTdGVwID0gKCgoaW1hZ2UtPndpZHRoICogaW1hZ2UtPm5DaGFubmVscyAqCisgICAgICAgICAoaW1hZ2UtPmRlcHRoICYgfklQTF9ERVBUSF9TSUdOKSArIDcpLzgpKyBhbGlnbiAtIDEpICYgKH4oYWxpZ24gLSAxKSk7CisgICAgaW1hZ2UtPm9yaWdpbiA9IG9yaWdpbjsKKyAgICBpbWFnZS0+aW1hZ2VTaXplID0gaW1hZ2UtPndpZHRoU3RlcCAqIGltYWdlLT5oZWlnaHQ7CisKKyAgICByZXN1bHQgPSBpbWFnZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlSW1hZ2VIZWFkZXIoIElwbEltYWdlKiogaW1hZ2UgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZWxlYXNlSW1hZ2VIZWFkZXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWltYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggKmltYWdlICkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAqaW1hZ2U7CisgICAgICAgICppbWFnZSA9IDA7CisgICAgICAgIAorICAgICAgICBpZiggIUN2SVBMLmRlYWxsb2NhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZpbWctPnJvaSApOworICAgICAgICAgICAgY3ZGcmVlKCAmaW1nICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdklQTC5kZWFsbG9jYXRlKCBpbWcsIElQTF9JTUFHRV9IRUFERVIgfCBJUExfSU1BR0VfUk9JICk7CisgICAgICAgIH0KKyAgICB9CisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZUltYWdlKCBJcGxJbWFnZSAqKiBpbWFnZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXworCisgICAgaWYoICFpbWFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICppbWFnZSApCisgICAgeworICAgICAgICBJcGxJbWFnZSogaW1nID0gKmltYWdlOworICAgICAgICAqaW1hZ2UgPSAwOworICAgICAgICAKKyAgICAgICAgY3ZSZWxlYXNlRGF0YSggaW1nICk7CisgICAgICAgIGN2UmVsZWFzZUltYWdlSGVhZGVyKCAmaW1nICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2U2V0SW1hZ2VST0koIElwbEltYWdlKiBpbWFnZSwgQ3ZSZWN0IHJlY3QgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRJbWFnZVJPSSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhaW1hZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfSGVhZGVySXNOdWxsLCAiIiApOworCisgICAgaWYoIHJlY3QueCA+IGltYWdlLT53aWR0aCB8fCByZWN0LnkgPiBpbWFnZS0+aGVpZ2h0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZFJPSVNpemUsICIiICk7CisKKyAgICBpZiggcmVjdC54ICsgcmVjdC53aWR0aCA8IDAgfHwgcmVjdC55ICsgcmVjdC5oZWlnaHQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZFJPSVNpemUsICIiICk7CisKKyAgICBpZiggcmVjdC54IDwgMCApCisgICAgeworICAgICAgICByZWN0LndpZHRoICs9IHJlY3QueDsKKyAgICAgICAgcmVjdC54ID0gMDsKKyAgICB9CisKKyAgICBpZiggcmVjdC55IDwgMCApCisgICAgeworICAgICAgICByZWN0LmhlaWdodCArPSByZWN0Lnk7CisgICAgICAgIHJlY3QueSA9IDA7CisgICAgfQorCisgICAgaWYoIHJlY3QueCArIHJlY3Qud2lkdGggPiBpbWFnZS0+d2lkdGggKQorICAgICAgICByZWN0LndpZHRoID0gaW1hZ2UtPndpZHRoIC0gcmVjdC54OworCisgICAgaWYoIHJlY3QueSArIHJlY3QuaGVpZ2h0ID4gaW1hZ2UtPmhlaWdodCApCisgICAgICAgIHJlY3QuaGVpZ2h0ID0gaW1hZ2UtPmhlaWdodCAtIHJlY3QueTsKKworICAgIGlmKCBpbWFnZS0+cm9pICkKKyAgICB7CisgICAgICAgIGltYWdlLT5yb2ktPnhPZmZzZXQgPSByZWN0Lng7CisgICAgICAgIGltYWdlLT5yb2ktPnlPZmZzZXQgPSByZWN0Lnk7CisgICAgICAgIGltYWdlLT5yb2ktPndpZHRoID0gcmVjdC53aWR0aDsKKyAgICAgICAgaW1hZ2UtPnJvaS0+aGVpZ2h0ID0gcmVjdC5oZWlnaHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGltYWdlLT5yb2kgPSBpY3ZDcmVhdGVST0koIDAsIHJlY3QueCwgcmVjdC55LCByZWN0LndpZHRoLCByZWN0LmhlaWdodCApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZXNldEltYWdlUk9JKCBJcGxJbWFnZSogaW1hZ2UgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZXNldEltYWdlUk9JIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFpbWFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9IZWFkZXJJc051bGwsICIiICk7CisKKyAgICBpZiggaW1hZ2UtPnJvaSApCisgICAgeworICAgICAgICBpZiggIUN2SVBMLmRlYWxsb2NhdGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjdkZyZWUoICZpbWFnZS0+cm9pICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdklQTC5kZWFsbG9jYXRlKCBpbWFnZSwgSVBMX0lNQUdFX1JPSSApOworICAgICAgICAgICAgaW1hZ2UtPnJvaSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgQ3ZSZWN0CitjdkdldEltYWdlUk9JKCBjb25zdCBJcGxJbWFnZSogaW1nICkKK3sKKyAgICBDdlJlY3QgcmVjdCA9IHsgMCwgMCwgMCwgMCB9OworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRJbWFnZVJPSSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhaW1nICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHBvaW50ZXIgdG8gaW1hZ2UiICk7CisKKyAgICBpZiggaW1nLT5yb2kgKQorICAgICAgICByZWN0ID0gY3ZSZWN0KCBpbWctPnJvaS0+eE9mZnNldCwgaW1nLT5yb2ktPnlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGltZy0+cm9pLT53aWR0aCwgaW1nLT5yb2ktPmhlaWdodCApOworICAgIGVsc2UKKyAgICAgICAgcmVjdCA9IGN2UmVjdCggMCwgMCwgaW1nLT53aWR0aCwgaW1nLT5oZWlnaHQgKTsKKworICAgIF9fRU5EX187CisgICAgCisgICAgcmV0dXJuIHJlY3Q7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlNldEltYWdlQ09JKCBJcGxJbWFnZSogaW1hZ2UsIGludCBjb2kgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRJbWFnZUNPSSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhaW1hZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfSGVhZGVySXNOdWxsLCAiIiApOworCisgICAgaWYoICh1bnNpZ25lZCljb2kgPiAodW5zaWduZWQpKGltYWdlLT5uQ2hhbm5lbHMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIGlmKCBpbWFnZS0+cm9pIHx8IGNvaSAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBpbWFnZS0+cm9pICkKKyAgICAgICAgeworICAgICAgICAgICAgaW1hZ2UtPnJvaS0+Y29pID0gY29pOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggaW1hZ2UtPnJvaSA9IGljdkNyZWF0ZVJPSSggY29pLCAwLCAwLCBpbWFnZS0+d2lkdGgsIGltYWdlLT5oZWlnaHQgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgaW50CitjdkdldEltYWdlQ09JKCBjb25zdCBJcGxJbWFnZSogaW1hZ2UgKQoreworICAgIGludCBjb2kgPSAtMTsKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0SW1hZ2VDT0kiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWltYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0hlYWRlcklzTnVsbCwgIiIgKTsKKworICAgIGNvaSA9IGltYWdlLT5yb2kgPyBpbWFnZS0+cm9pLT5jb2kgOiAwOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjb2k7Cit9CisKKworQ1ZfSU1QTCBJcGxJbWFnZSoKK2N2Q2xvbmVJbWFnZSggY29uc3QgSXBsSW1hZ2UqIHNyYyApCit7CisgICAgSXBsSW1hZ2UqIGRzdCA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsb25lSW1hZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIUNWX0lTX0lNQUdFX0hEUiggc3JjICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJCYWQgaW1hZ2UgaGVhZGVyIiApOworCisgICAgaWYoICFDdklQTC5jbG9uZUltYWdlICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IChJcGxJbWFnZSopY3ZBbGxvYyggc2l6ZW9mKCpkc3QpKSk7CisKKyAgICAgICAgbWVtY3B5KCBkc3QsIHNyYywgc2l6ZW9mKCpzcmMpKTsKKyAgICAgICAgZHN0LT5pbWFnZURhdGEgPSBkc3QtPmltYWdlRGF0YU9yaWdpbiA9IDA7CisgICAgICAgIGRzdC0+cm9pID0gMDsKKworICAgICAgICBpZiggc3JjLT5yb2kgKQorICAgICAgICB7CisgICAgICAgICAgICBkc3QtPnJvaSA9IGljdkNyZWF0ZVJPSSggc3JjLT5yb2ktPmNvaSwgc3JjLT5yb2ktPnhPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+cm9pLT55T2Zmc2V0LCBzcmMtPnJvaS0+d2lkdGgsIHNyYy0+cm9pLT5oZWlnaHQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzcmMtPmltYWdlRGF0YSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzaXplID0gc3JjLT5pbWFnZVNpemU7CisgICAgICAgICAgICBjdkNyZWF0ZURhdGEoIGRzdCApOworICAgICAgICAgICAgbWVtY3B5KCBkc3QtPmltYWdlRGF0YSwgc3JjLT5pbWFnZURhdGEsIHNpemUgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkc3QgPSBDdklQTC5jbG9uZUltYWdlKCBzcmMgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGRzdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCBvcGVyYXRpb25zIG9uIEN2VGVybUNyaXRlcmlhICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWX0lNUEwgQ3ZUZXJtQ3JpdGVyaWEKK2N2Q2hlY2tUZXJtQ3JpdGVyaWEoIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhLCBkb3VibGUgZGVmYXVsdF9lcHMsCisgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF9tYXhfaXRlcnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDaGVja1Rlcm1Dcml0ZXJpYSIgKTsKKworICAgIEN2VGVybUNyaXRlcmlhIGNyaXQ7CisKKyAgICBjcml0LnR5cGUgPSBDVl9URVJNQ1JJVF9JVEVSfENWX1RFUk1DUklUX0VQUzsKKyAgICBjcml0Lm1heF9pdGVyID0gZGVmYXVsdF9tYXhfaXRlcnM7CisgICAgY3JpdC5lcHNpbG9uID0gKGZsb2F0KWRlZmF1bHRfZXBzOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAoY3JpdGVyaWEudHlwZSAmIH4oQ1ZfVEVSTUNSSVRfRVBTIHwgQ1ZfVEVSTUNSSVRfSVRFUikpICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICAgIlVua25vd24gdHlwZSBvZiB0ZXJtIGNyaXRlcmlhIiApOworCisgICAgaWYoIChjcml0ZXJpYS50eXBlICYgQ1ZfVEVSTUNSSVRfSVRFUikgIT0gMCApCisgICAgeworICAgICAgICBpZiggY3JpdGVyaWEubWF4X2l0ZXIgPD0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICAgIkl0ZXJhdGlvbnMgZmxhZyBpcyBzZXQgYW5kIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXMgPD0gMCIgKTsKKyAgICAgICAgY3JpdC5tYXhfaXRlciA9IGNyaXRlcmlhLm1heF9pdGVyOworICAgIH0KKyAgICAKKyAgICBpZiggKGNyaXRlcmlhLnR5cGUgJiBDVl9URVJNQ1JJVF9FUFMpICE9IDAgKQorICAgIHsKKyAgICAgICAgaWYoIGNyaXRlcmlhLmVwc2lsb24gPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJBY2N1cmFjeSBmbGFnIGlzIHNldCBhbmQgZXBzaWxvbiBpcyA8IDAiICk7CisKKyAgICAgICAgY3JpdC5lcHNpbG9uID0gY3JpdGVyaWEuZXBzaWxvbjsKKyAgICB9CisKKyAgICBpZiggKGNyaXRlcmlhLnR5cGUgJiAoQ1ZfVEVSTUNSSVRfRVBTIHwgQ1ZfVEVSTUNSSVRfSVRFUikpID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICAgIk5laXRoZXIgYWNjdXJhY3kgbm9yIG1heGltdW0gaXRlcmF0aW9ucyAiCisgICAgICAgICAgICAgICAgICAibnVtYmVyIGZsYWdzIGFyZSBzZXQgaW4gY3JpdGVyaWEgdHlwZSIgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjcml0LmVwc2lsb24gPSAoZmxvYXQpTUFYKCAwLCBjcml0LmVwc2lsb24gKTsKKyAgICBjcml0Lm1heF9pdGVyID0gTUFYKCAxLCBjcml0Lm1heF9pdGVyICk7CisKKyAgICByZXR1cm4gY3JpdDsKK30KKworCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hjbXAuY3BwIGIvY3hjb3JlL3NyYy9jeGNtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljYTljMgotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hjbXAuY3BwCkBAIC0wLDAgKzEsMTU1NyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEN2TWF0IGNvbXBhcmlzb24gZnVuY3Rpb25zOiByYW5nZSBjaGVja2luZywgbWluLCBtYXgKKy8vCisvLyAqLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluUmFuZ2VbU10gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9JTl9SQU5HRV9DQVNFX0MxKCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18gKSAgICBcCitmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgYTIgPSBzcmMyW3hdLCBhMyA9IHNyYzNbeF07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdFt4XSA9ICh1Y2hhciktKF90b2dnbGVfbWFjcm9fKGEyKSA8PSBhMSAmJiAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGExIDwgX3RvZ2dsZV9tYWNyb18oYTMpKTsgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX0lOX1JBTkdFX0NBU0VfQzIoIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgICAgICBcCitmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjJdKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgYTIgPSBzcmMyW3gqMl0sIGEzID0gc3JjM1t4KjJdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZiA9IF90b2dnbGVfbWFjcm9fKGEyKSA8PSBhMSAmJiBhMSA8IF90b2dnbGVfbWFjcm9fKGEzKTsgICAgXAorICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjIrMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTIgPSBzcmMyW3gqMisxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMyA9IHNyYzNbeCoyKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGYgJj0gX3RvZ2dsZV9tYWNyb18oYTIpIDw9IGExICYmIGExIDwgX3RvZ2dsZV9tYWNyb18oYTMpOyAgICAgICBcCisgICAgZHN0W3hdID0gKHVjaGFyKS1mOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfSU5fUkFOR0VfQ0FTRV9DMyggd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgICAgICAgIFwKK2ZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqM10pLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICBhMiA9IHNyYzJbeCozXSwgYTMgPSBzcmMzW3gqM107ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBmID0gX3RvZ2dsZV9tYWNyb18oYTIpIDw9IGExICYmIGExIDwgX3RvZ2dsZV9tYWNyb18oYTMpOyAgICBcCisgICAgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMiA9IHNyYzJbeCozKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEzID0gc3JjM1t4KjMrMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiAmPSBfdG9nZ2xlX21hY3JvXyhhMikgPD0gYTEgJiYgYTEgPCBfdG9nZ2xlX21hY3JvXyhhMyk7ICAgICAgIFwKKyAgICBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCozKzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEyID0gc3JjMlt4KjMrMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTMgPSBzcmMzW3gqMysyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmICY9IF90b2dnbGVfbWFjcm9fKGEyKSA8PSBhMSAmJiBhMSA8IF90b2dnbGVfbWFjcm9fKGEzKTsgICAgICAgXAorICAgIGRzdFt4XSA9ICh1Y2hhciktZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX0lOX1JBTkdFX0NBU0VfQzQoIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgICAgICBcCitmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjRdKSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgYTIgPSBzcmMyW3gqNF0sIGEzID0gc3JjM1t4KjRdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZiA9IF90b2dnbGVfbWFjcm9fKGEyKSA8PSBhMSAmJiBhMSA8IF90b2dnbGVfbWFjcm9fKGEzKTsgICAgXAorICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjQrMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTIgPSBzcmMyW3gqNCsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMyA9IHNyYzNbeCo0KzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGYgJj0gX3RvZ2dsZV9tYWNyb18oYTIpIDw9IGExICYmIGExIDwgX3RvZ2dsZV9tYWNyb18oYTMpOyAgICAgICBcCisgICAgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqNCsyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMiA9IHNyYzJbeCo0KzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEzID0gc3JjM1t4KjQrMl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiAmPSBfdG9nZ2xlX21hY3JvXyhhMikgPD0gYTEgJiYgYTEgPCBfdG9nZ2xlX21hY3JvXyhhMyk7ICAgICAgIFwKKyAgICBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCo0KzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEyID0gc3JjMlt4KjQrM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTMgPSBzcmMzW3gqNCszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmICY9IF90b2dnbGVfbWFjcm9fKGEyKSA8PSBhMSAmJiBhMSA8IF90b2dnbGVfbWFjcm9fKGEzKTsgICAgICAgXAorICAgIGRzdFt4XSA9ICh1Y2hhciktZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX0lOX1JBTkdFX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZV9tYWNyb18sIGNuICkgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2SW5SYW5nZV8jI2ZsYXZvciMjX0MjI2NuIyNSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogc3JjMywgaW50IHN0ZXAzLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgXAorICAgIHN0ZXAzIC89IHNpemVvZihzcmMzWzBdKTsgc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMzICs9IHN0ZXAzLCBkc3QgKz0gc3RlcCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0lOX1JBTkdFX0NBU0VfQyMjY24oIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX0lOX1JBTkdFX0NBU0VfQ09OU1RfQzEoIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICBcCitmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3hdID0gKHVjaGFyKS0oc2NhbGFyWzBdIDw9IGExICYmIGExIDwgc2NhbGFyWzFdKTsgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfSU5fUkFOR0VfQ0FTRV9DT05TVF9DMiggd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgIFwKK2ZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqMl0pOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZiA9IHNjYWxhclswXSA8PSBhMSAmJiBhMSA8IHNjYWxhclsyXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjIrMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiAmPSBzY2FsYXJbMV0gPD0gYTEgJiYgYTEgPCBzY2FsYXJbM107ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbeF0gPSAodWNoYXIpLWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9JTl9SQU5HRV9DQVNFX0NPTlNUX0MzKCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18gKSAgXAorZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCozXSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBmID0gc2NhbGFyWzBdIDw9IGExICYmIGExIDwgc2NhbGFyWzNdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqMysxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmICY9IHNjYWxhclsxXSA8PSBhMSAmJiBhMSA8IHNjYWxhcls0XTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjMrMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiAmPSBzY2FsYXJbMl0gPD0gYTEgJiYgYTEgPCBzY2FsYXJbNV07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbeF0gPSAodWNoYXIpLWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9JTl9SQU5HRV9DQVNFX0NPTlNUX0M0KCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18gKSAgXAorZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCo0XSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBmID0gc2NhbGFyWzBdIDw9IGExICYmIGExIDwgc2NhbGFyWzRdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYTEgPSBfdG9nZ2xlX21hY3JvXyhzcmMxW3gqNCsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmICY9IHNjYWxhclsxXSA8PSBhMSAmJiBhMSA8IHNjYWxhcls1XTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KjQrMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZiAmPSBzY2FsYXJbMl0gPD0gYTEgJiYgYTEgPCBzY2FsYXJbNl07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCo0KzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGYgJj0gc2NhbGFyWzNdIDw9IGExICYmIGExIDwgc2NhbGFyWzddOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3hdID0gKHVjaGFyKS1mOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfSU5fUkFOR0VfQ09OU1RfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdG9nZ2xlX21hY3JvXywgY24gKSAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZJblJhbmdlQ18jI2ZsYXZvciMjX0MjI2NuIyNSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3R5cGUqIHNjYWxhciApICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIGRzdCArPSBzdGVwICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfSU5fUkFOR0VfQ0FTRV9DT05TVF9DIyNjbiggd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fKVwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfSU5fUkFOR0VfQUxMKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgXAorSUNWX0RFRl9JTl9SQU5HRV9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXywgMSApICAgICAgIFwKK0lDVl9ERUZfSU5fUkFOR0VfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18sIDIgKSAgICAgICBcCitJQ1ZfREVGX0lOX1JBTkdFX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fLCAzICkgICAgICAgXAorSUNWX0RFRl9JTl9SQU5HRV9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXywgNCApICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJQ1ZfREVGX0lOX1JBTkdFX0NPTlNUX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fLCAxICkgXAorSUNWX0RFRl9JTl9SQU5HRV9DT05TVF9GVU5DKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXywgMiApIFwKK0lDVl9ERUZfSU5fUkFOR0VfQ09OU1RfRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18sIDMgKSBcCitJQ1ZfREVGX0lOX1JBTkdFX0NPTlNUX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fLCA0ICkKKworSUNWX0RFRl9JTl9SQU5HRV9BTEwoIDh1LCB1Y2hhciwgaW50LCBDVl9OT1AgKQorSUNWX0RFRl9JTl9SQU5HRV9BTEwoIDE2dSwgdXNob3J0LCBpbnQsIENWX05PUCApCitJQ1ZfREVGX0lOX1JBTkdFX0FMTCggMTZzLCBzaG9ydCwgaW50LCBDVl9OT1AgKQorSUNWX0RFRl9JTl9SQU5HRV9BTEwoIDMycywgaW50LCBpbnQsIENWX05PUCApCitJQ1ZfREVGX0lOX1JBTkdFX0FMTCggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCitJQ1ZfREVGX0lOX1JBTkdFX0FMTCggNjRmLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QICkKKworI2RlZmluZSBpY3ZJblJhbmdlXzhzX0MxUiAwCisjZGVmaW5lIGljdkluUmFuZ2VfOHNfQzJSIDAKKyNkZWZpbmUgaWN2SW5SYW5nZV84c19DM1IgMAorI2RlZmluZSBpY3ZJblJhbmdlXzhzX0M0UiAwCisKKyNkZWZpbmUgaWN2SW5SYW5nZUNfOHNfQzFSIDAKKyNkZWZpbmUgaWN2SW5SYW5nZUNfOHNfQzJSIDAKKyNkZWZpbmUgaWN2SW5SYW5nZUNfOHNfQzNSIDAKKyNkZWZpbmUgaWN2SW5SYW5nZUNfOHNfQzRSIDAKKworQ1ZfREVGX0lOSVRfQklHX0ZVTkNfVEFCXzJEKCBJblJhbmdlLCBSICkKK0NWX0RFRl9JTklUX0JJR19GVU5DX1RBQl8yRCggSW5SYW5nZUMsIFIgKQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZJblJhbmdlQ0Z1bmMpKCBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3Qgdm9pZCogc2NhbGFyICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogSW5SYW5nZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2SW5SYW5nZSggY29uc3Qgdm9pZCogc3JjYXJyMSwgY29uc3Qgdm9pZCogc3JjYXJyMiwKKyAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjYXJyMywgdm9pZCogZHN0YXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgaW5yYW5nZV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZJblJhbmdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGNvaSA9IDA7CisgICAgaW50IHNyYzFfc3RlcCwgc3JjMl9zdGVwLCBzcmMzX3N0ZXAsIGRzdF9zdGVwOworICAgIEN2TWF0IHNyY3N0dWIxLCAqc3JjMSA9IChDdk1hdCopc3JjYXJyMTsKKyAgICBDdk1hdCBzcmNzdHViMiwgKnNyYzIgPSAoQ3ZNYXQqKXNyY2FycjI7CisgICAgQ3ZNYXQgc3Jjc3R1YjMsICpzcmMzID0gKEN2TWF0KilzcmNhcnIzOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZGdW5jMkRfNEEgZnVuYzsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0SW5SYW5nZVJUYWJsZSggJmlucmFuZ2VfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzEpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNyYzEgPSBjdkdldE1hdCggc3JjMSwgJnNyY3N0dWIxLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMyKSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzcmNzdHViMiwgJmNvaSApKTsKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMykgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc3JjMyA9IGN2R2V0TWF0KCBzcmMzLCAmc3Jjc3R1YjMsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBzcmMyICkgfHwKKyAgICAgICAgIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgc3JjMyApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiRGVzdGluYXRpb24gaW1hZ2Ugc2hvdWxkIGJlIDh1QzEgb3IgOHNDMSIpOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIHNyYzIgKSB8fAorICAgICAgICAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMzICkgfHwKKyAgICAgICAgIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMxLT50eXBlKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMxICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYzEtPnR5cGUgJiBzcmMyLT50eXBlICYgc3JjMy0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMl9zdGVwID0gc3JjM19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgc3JjMl9zdGVwID0gc3JjMi0+c3RlcDsKKyAgICAgICAgc3JjM19zdGVwID0gc3JjMy0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBiZSAxLCAyLCAzIG9yIDQiICk7CisKKyAgICBmdW5jID0gKEN2RnVuYzJEXzRBKShpbnJhbmdlX3RhYi5mbl8yZFt0eXBlXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIHNyYzItPmRhdGEucHRyLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICBzcmMzLT5kYXRhLnB0ciwgc3JjM19zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEluUmFuZ2VTICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWX0lNUEwgdm9pZAorY3ZJblJhbmdlUyggY29uc3Qgdm9pZCogc3JjYXJyLCBDdlNjYWxhciBsb3dlciwgQ3ZTY2FsYXIgdXBwZXIsIHZvaWQqIGRzdGFyciApCit7CisgICAgc3RhdGljIEN2QmlnRnVuY1RhYmxlIGlucmFuZ2VfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2SW5SYW5nZVMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc2N0eXBlLCB0eXBlLCBjb2kgPSAwOworICAgIGludCBzcmMxX3N0ZXAsIGRzdF9zdGVwOworICAgIEN2TWF0IHNyY3N0dWIxLCAqc3JjMSA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZJblJhbmdlQ0Z1bmMgZnVuYzsKKyAgICBkb3VibGUgYnVmWzhdOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRJblJhbmdlQ1JUYWJsZSggJmlucmFuZ2VfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzEpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNyYzEgPSBjdkdldE1hdCggc3JjMSwgJnNyY3N0dWIxLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiRGVzdGluYXRpb24gaW1hZ2Ugc2hvdWxkIGJlIDh1QzEgb3IgOHNDMSIpOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBzY3R5cGUgPSB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjMS0+dHlwZSk7CisgICAgaWYoIENWX01BVF9ERVBUSChzY3R5cGUpIDwgQ1ZfMzJTICkKKyAgICAgICAgc2N0eXBlID0gKHR5cGUgJiBDVl9NQVRfQ05fTUFTSykgfCBDVl8zMlNDMTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYzEgKTsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBudW1iZXIgb2YgY2hhbm5lbHMgbXVzdCBiZSAxLCAyLCAzIG9yIDQiICk7CisKKyAgICBmdW5jID0gKEN2SW5SYW5nZUNGdW5jKShpbnJhbmdlX3RhYi5mbl8yZFt0eXBlXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBjdlNjYWxhclRvUmF3RGF0YSggJmxvd2VyLCBidWYsIHNjdHlwZSwgMCApOworICAgIGN2U2NhbGFyVG9SYXdEYXRhKCAmdXBwZXIsIChjaGFyKilidWYgKyBDVl9FTEVNX1NJWkUoc2N0eXBlKSwgc2N0eXBlLCAwICk7CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgc2l6ZSwgYnVmICkpOworCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENtcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9DTVBfQ0FTRV9DMSggX19vcF9fLCBfdG9nZ2xlX21hY3JvXyApICAgICAgICAgICAgICAgICAgIFwKK2ZvciggeCA9IDA7IHggPD0gc2l6ZS53aWR0aCAtIDQ7IHggKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZjAgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pLCBfdG9nZ2xlX21hY3JvXyhzcmMyW3hdKSk7IFwKKyAgICBpbnQgZjEgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeCsxXSksIF90b2dnbGVfbWFjcm9fKHNyYzJbeCsxXSkpOyBcCisgICAgZHN0W3hdID0gKHVjaGFyKS1mMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3grMV0gPSAodWNoYXIpLWYxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZjAgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeCsyXSksIF90b2dnbGVfbWFjcm9fKHNyYzJbeCsyXSkpOyBcCisgICAgZjEgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeCszXSksIF90b2dnbGVfbWFjcm9fKHNyYzJbeCszXSkpOyBcCisgICAgZHN0W3grMl0gPSAodWNoYXIpLWYwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3grM10gPSAodWNoYXIpLWYxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGYwID0gX19vcF9fKCBfdG9nZ2xlX21hY3JvXyhzcmMxW3hdKSwgX3RvZ2dsZV9tYWNyb18oc3JjMlt4XSkpOyBcCisgICAgZHN0W3hdID0gKHVjaGFyKS1mMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX0NNUF9GVU5DKCBfX29wX18sIG5hbWUsIGZsYXZvciwgYXJydHlwZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2IyNuYW1lIyNfIyNmbGF2b3IjI19DMVIoIGNvbnN0IGFycnR5cGUqIHNyYzEsIGludCBzdGVwMSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3RlcDIsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IHN0ZXAsIEN2U2l6ZSBzaXplICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ01QX0NBU0VfQzEoIF9fb3BfXywgX3RvZ2dsZV9tYWNyb18gKSAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9DTVBfQ09OU1RfQ0FTRV9DMSggX19vcF9fLCBfdG9nZ2xlX21hY3JvXyApICAgICBcCitmb3IoIHggPSAwOyB4IDw9IHNpemUud2lkdGggLSA0OyB4ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZjAgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pLCBzY2FsYXIgKTsgICAgICAgICBcCisgICAgaW50IGYxID0gX19vcF9fKCBfdG9nZ2xlX21hY3JvXyhzcmMxW3grMV0pLCBzY2FsYXIgKTsgICAgICAgXAorICAgIGRzdFt4XSA9ICh1Y2hhciktZjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbeCsxXSA9ICh1Y2hhciktZjE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZjAgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeCsyXSksIHNjYWxhciApOyAgICAgICAgICAgXAorICAgIGYxID0gX19vcF9fKCBfdG9nZ2xlX21hY3JvXyhzcmMxW3grM10pLCBzY2FsYXIgKTsgICAgICAgICAgIFwKKyAgICBkc3RbeCsyXSA9ICh1Y2hhciktZjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0W3grM10gPSAodWNoYXIpLWYxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgZjAgPSBfX29wX18oIF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pLCBzY2FsYXIgKTsgICAgICAgICBcCisgICAgZHN0W3hdID0gKHVjaGFyKS1mMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9DTVBfQ09OU1RfRlVOQyggX19vcF9fLCBuYW1lLCBmbGF2b3IsIGFycnR5cGUsICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXykgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdiMjbmFtZSMjQ18jI2ZsYXZvciMjX0MxUiggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBzdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgd29ya3R5cGUqIHBTY2FsYXIgKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgc2NhbGFyID0gKnBTY2FsYXI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIGRzdCArPSBzdGVwICkgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ01QX0NPTlNUX0NBU0VfQzEoIF9fb3BfXywgX3RvZ2dsZV9tYWNyb18gKSAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9DTVBfQUxMKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgICAgICAgICAgXAorSUNWX0RFRl9DTVBfRlVOQyggQ1ZfR1QsIENtcEdULCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXyApICAgICBcCitJQ1ZfREVGX0NNUF9GVU5DKCBDVl9FUSwgQ21wRVEsIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgICAgIFwKK0lDVl9ERUZfQ01QX0NPTlNUX0ZVTkMoIENWX0dULCBDbXBHVCwgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18pXAorSUNWX0RFRl9DTVBfQ09OU1RfRlVOQyggQ1ZfR0UsIENtcEdFLCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBfdG9nZ2xlX21hY3JvXylcCitJQ1ZfREVGX0NNUF9DT05TVF9GVU5DKCBDVl9FUSwgQ21wRVEsIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fKQorCitJQ1ZfREVGX0NNUF9BTEwoIDh1LCB1Y2hhciwgaW50LCBDVl9OT1AgKQorSUNWX0RFRl9DTVBfQUxMKCAxNnUsIHVzaG9ydCwgaW50LCBDVl9OT1AgKQorSUNWX0RFRl9DTVBfQUxMKCAxNnMsIHNob3J0LCBpbnQsIENWX05PUCApCitJQ1ZfREVGX0NNUF9BTEwoIDMycywgaW50LCBpbnQsIENWX05PUCApCitJQ1ZfREVGX0NNUF9BTEwoIDMyZiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QICkKK0lDVl9ERUZfQ01QX0FMTCggNjRmLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QICkKKworI2RlZmluZSBpY3ZDbXBHVF84c19DMVIgICAgIDAKKyNkZWZpbmUgaWN2Q21wRVFfOHNfQzFSICAgICAwCisjZGVmaW5lIGljdkNtcEdUQ184c19DMVIgICAgMAorI2RlZmluZSBpY3ZDbXBHRUNfOHNfQzFSICAgIDAKKyNkZWZpbmUgaWN2Q21wRVFDXzhzX0MxUiAgICAwCisKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBDbXBHVCwgQzFSICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBDbXBFUSwgQzFSICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBDbXBHVEMsIEMxUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggQ21wR0VDLCBDMVIgKQorQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIENtcEVRQywgQzFSICkKKworaWN2Q29tcGFyZV84dV9DMVJfdCBpY3ZDb21wYXJlXzh1X0MxUl9wID0gMDsKK2ljdkNvbXBhcmVfMTZzX0MxUl90IGljdkNvbXBhcmVfMTZzX0MxUl9wID0gMDsKK2ljdkNvbXBhcmVfMzJmX0MxUl90IGljdkNvbXBhcmVfMzJmX0MxUl9wID0gMDsKKworaWN2Q29tcGFyZUNfOHVfQzFSX3QgaWN2Q29tcGFyZUNfOHVfQzFSX3AgPSAwOworaWN2Q29tcGFyZUNfMTZzX0MxUl90IGljdkNvbXBhcmVDXzE2c19DMVJfcCA9IDA7CitpY3ZDb21wYXJlQ18zMmZfQzFSX3QgaWN2Q29tcGFyZUNfMzJmX0MxUl9wID0gMDsKKworaWN2VGhyZXNob2xkX0dUXzh1X0MxUl90IGljdlRocmVzaG9sZF9HVF84dV9DMVJfcCA9IDA7CitpY3ZUaHJlc2hvbGRfR1RfMTZzX0MxUl90IGljdlRocmVzaG9sZF9HVF8xNnNfQzFSX3AgPSAwOworaWN2VGhyZXNob2xkX0dUXzMyZl9DMVJfdCBpY3ZUaHJlc2hvbGRfR1RfMzJmX0MxUl9wID0gMDsKKworaWN2VGhyZXNob2xkX0xUXzh1X0MxUl90IGljdlRocmVzaG9sZF9MVF84dV9DMVJfcCA9IDA7CitpY3ZUaHJlc2hvbGRfTFRfMTZzX0MxUl90IGljdlRocmVzaG9sZF9MVF8xNnNfQzFSX3AgPSAwOworaWN2VGhyZXNob2xkX0xUXzMyZl9DMVJfdCBpY3ZUaHJlc2hvbGRfTFRfMzJmX0MxUl9wID0gMDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN2Q21wICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0NWX0lNUEwgdm9pZAorY3ZDbXAoIGNvbnN0IHZvaWQqIHNyY2FycjEsIGNvbnN0IHZvaWQqIHNyY2FycjIsCisgICAgICAgdm9pZCogZHN0YXJyLCBpbnQgY21wX29wICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgY21wX3RhYlsyXTsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNtcCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlLCBjb2kgPSAwOworICAgIGludCBpbnZmbGFnID0gMDsKKyAgICBDdkNtcE9wIGlwcF9jbXBfb3A7CisgICAgaW50IHNyYzFfc3RlcCwgc3JjMl9zdGVwLCBkc3Rfc3RlcDsKKyAgICBDdk1hdCBzcmNzdHViMSwgKnNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgQ3ZNYXQgc3Jjc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgKnRlbXA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZGdW5jMkRfM0EgZnVuYzsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0Q21wR1RDMVJUYWJsZSggJmNtcF90YWJbMF0gKTsKKyAgICAgICAgaWN2SW5pdENtcEVRQzFSVGFibGUoICZjbXBfdGFiWzFdICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzEpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNyYzEgPSBjdkdldE1hdCggc3JjMSwgJnNyY3N0dWIxLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMyKSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzcmNzdHViMiwgJmNvaSApKTsKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaSApKTsKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgfQorCisgICAgc3dpdGNoKCBjbXBfb3AgKQorICAgIHsKKyAgICBjYXNlIENWX0NNUF9HVDoKKyAgICBjYXNlIENWX0NNUF9FUToKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9DTVBfR0U6CisgICAgICAgIENWX1NXQVAoIHNyYzEsIHNyYzIsIHRlbXAgKTsKKyAgICAgICAgaW52ZmxhZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfQ01QX0xUOgorICAgICAgICBDVl9TV0FQKCBzcmMxLCBzcmMyLCB0ZW1wICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfQ01QX0xFOgorICAgICAgICBpbnZmbGFnID0gMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9DTVBfTkU6CisgICAgICAgIGNtcF9vcCA9IENWX0NNUF9FUTsKKyAgICAgICAgaW52ZmxhZyA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duIGNvbXBhcmlzb24gb3BlcmF0aW9uIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBzcmMyICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCBDVl9NQVRfQ04oIHNyYzEtPnR5cGUgKSAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgYXJyYXlzIG11c3QgYmUgc2luZ2xlLWNoYW5uZWwiKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJEZXN0aW5hdGlvbiBhcnJheSBzaG91bGQgYmUgOHVDMSBvciA4c0MxIik7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgc3JjMiApIHx8CisgICAgICAgICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjMS0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjMSApOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMxLT50eXBlICYgc3JjMi0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMl9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgc3JjMl9zdGVwID0gc3JjMi0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgZnVuYyA9IChDdkZ1bmMyRF8zQSkoY21wX3RhYltjbXBfb3AgPT0gQ1ZfQ01QX0VRXS5mbl8yZFt0eXBlXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBpcHBfY21wX29wID0gY21wX29wID09IENWX0NNUF9FUSA/IGN2Q21wRXEgOiBjdkNtcEdyZWF0ZXI7CisKKyAgICBpZiggdHlwZSA9PSBDVl84VSAmJiBpY3ZDb21wYXJlXzh1X0MxUl9wICkKKyAgICB7CisgICAgICAgIElQUElfQ0FMTCggaWN2Q29tcGFyZV84dV9DMVJfcCggc3JjMS0+ZGF0YS5wdHIsIHNyYzFfc3RlcCwgc3JjMi0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMl9zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwgaXBwX2NtcF9vcCApKTsKKyAgICB9CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8xNlMgJiYgaWN2Q29tcGFyZV8xNnNfQzFSX3AgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZDb21wYXJlXzE2c19DMVJfcCggc3JjMS0+ZGF0YS5zLCBzcmMxX3N0ZXAsIHNyYzItPmRhdGEucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyX3N0ZXAsIGRzdC0+ZGF0YS5zLCBkc3Rfc3RlcCwgc2l6ZSwgaXBwX2NtcF9vcCApKTsKKyAgICB9CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8zMkYgJiYgaWN2Q29tcGFyZV8zMmZfQzFSX3AgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZDb21wYXJlXzMyZl9DMVJfcCggc3JjMS0+ZGF0YS5mbCwgc3JjMV9zdGVwLCBzcmMyLT5kYXRhLmZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzJfc3RlcCwgZHN0LT5kYXRhLmZsLCBkc3Rfc3RlcCwgc2l6ZSwgaXBwX2NtcF9vcCApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMxLT5kYXRhLnB0ciwgc3JjMV9zdGVwLCBzcmMyLT5kYXRhLnB0ciwgc3JjMl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplICkpOworICAgIH0KKworICAgIGlmKCBpbnZmbGFnICkKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZOb3RfOHVfQzFSKCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplICkpOworCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN2Q21wUyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCB2b2lkCitjdkNtcFMoIGNvbnN0IHZvaWQqIHNyY2FyciwgZG91YmxlIHZhbHVlLCB2b2lkKiBkc3RhcnIsIGludCBjbXBfb3AgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBjbXBzX3RhYlszXTsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNtcFMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgeSwgdHlwZSwgY29pID0gMDsKKyAgICBpbnQgaW52ZmxhZyA9IDAsIGlwcF9jbXBfb3A7CisgICAgaW50IHNyYzFfc3RlcCwgZHN0X3N0ZXA7CisgICAgQ3ZNYXQgc3Jjc3R1YjEsICpzcmMxID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgaXZhbCA9IDA7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdENtcEVRQ0MxUlRhYmxlKCAmY21wc190YWJbQ1ZfQ01QX0VRXSApOworICAgICAgICBpY3ZJbml0Q21wR1RDQzFSVGFibGUoICZjbXBzX3RhYltDVl9DTVBfR1RdICk7CisgICAgICAgIGljdkluaXRDbXBHRUNDMVJUYWJsZSggJmNtcHNfdGFiW0NWX0NNUF9HRV0gKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMSkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBzcmMxLCAmc3Jjc3R1YjEsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIHN3aXRjaCggY21wX29wICkKKyAgICB7CisgICAgY2FzZSBDVl9DTVBfR1Q6CisgICAgY2FzZSBDVl9DTVBfRVE6CisgICAgY2FzZSBDVl9DTVBfR0U6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfQ01QX0xUOgorICAgICAgICBpbnZmbGFnID0gMTsKKyAgICAgICAgY21wX29wID0gQ1ZfQ01QX0dFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX0NNUF9MRToKKyAgICAgICAgaW52ZmxhZyA9IDE7CisgICAgICAgIGNtcF9vcCA9IENWX0NNUF9HVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9DTVBfTkU6CisgICAgICAgIGludmZsYWcgPSAxOworICAgICAgICBjbXBfb3AgPSBDVl9DTVBfRVE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duIGNvbXBhcmlzb24gb3BlcmF0aW9uIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJEZXN0aW5hdGlvbiBhcnJheSBzaG91bGQgYmUgOHVDMSBvciA4c0MxIik7CisKKyAgICBpZiggQ1ZfTUFUX0NOKCBzcmMxLT50eXBlICkgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IGFycmF5IG11c3QgYmUgc2luZ2xlLWNoYW5uZWwiKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKHNyYzEtPnR5cGUpOworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYzEgKTsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgaWYoIENWX01BVF9ERVBUSCh0eXBlKSA8PSBDVl8zMlMgKQorICAgIHsKKyAgICAgICAgaXZhbCA9IGN2Um91bmQodmFsdWUpOworICAgICAgICBpZiggdHlwZSA9PSBDVl84VSB8fCB0eXBlID09IENWXzE2UyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtaW52YWwgPSB0eXBlID09IENWXzhVID8gMCA6IC0zMjc2ODsKKyAgICAgICAgICAgIGludCBtYXh2YWwgPSB0eXBlID09IENWXzhVID8gMjU1IDogMzI3Njc7CisgICAgICAgICAgICBpbnQgZmlsbHZhbCA9IC0xOworICAgICAgICAgICAgaWYoIGl2YWwgPCBtaW52YWwgKQorICAgICAgICAgICAgICAgIGZpbGx2YWwgPSBjbXBfb3AgPT0gQ1ZfQ01QX05FIHx8IGNtcF9vcCA9PSBDVl9DTVBfR0UgfHwgY21wX29wID09IENWX0NNUF9HVCA/IDI1NSA6IDA7CisgICAgICAgICAgICBlbHNlIGlmKCBpdmFsID4gbWF4dmFsICkKKyAgICAgICAgICAgICAgICBmaWxsdmFsID0gY21wX29wID09IENWX0NNUF9ORSB8fCBjbXBfb3AgPT0gQ1ZfQ01QX0xFIHx8IGNtcF9vcCA9PSBDVl9DTVBfTFQgPyAyNTUgOiAwOworICAgICAgICAgICAgaWYoIGZpbGx2YWwgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsbHZhbCBePSBpbnZmbGFnID8gMjU1IDogMDsKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggZHN0LT5kYXRhLnB0ciArIHkqZHN0X3N0ZXAsIGZpbGx2YWwsIHNpemUud2lkdGggKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaXBwX2NtcF9vcCA9IGNtcF9vcCA9PSBDVl9DTVBfRVEgPyBjdkNtcEVxIDoKKyAgICAgICAgICAgICAgICAgY21wX29wID09IENWX0NNUF9HRSA/IGN2Q21wR3JlYXRlckVxIDogY3ZDbXBHcmVhdGVyOworICAgIGlmKCB0eXBlID09IENWXzhVICYmIGljdkNvbXBhcmVfOHVfQzFSX3AgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZDb21wYXJlQ184dV9DMVJfcCggc3JjMS0+ZGF0YS5wdHIsIHNyYzFfc3RlcCwgKHVjaGFyKWl2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplLCBpcHBfY21wX29wICkpOworICAgIH0KKyAgICBlbHNlIGlmKCB0eXBlID09IENWXzE2UyAmJiBpY3ZDb21wYXJlXzE2c19DMVJfcCApCisgICAgeworICAgICAgICBJUFBJX0NBTEwoIGljdkNvbXBhcmVDXzE2c19DMVJfcCggc3JjMS0+ZGF0YS5zLCBzcmMxX3N0ZXAsIChzaG9ydClpdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnMsIGRzdF9zdGVwLCBzaXplLCBpcHBfY21wX29wICkpOworICAgIH0KKyAgICBlbHNlIGlmKCB0eXBlID09IENWXzMyRiAmJiBpY3ZDb21wYXJlXzMyZl9DMVJfcCApCisgICAgeworICAgICAgICBJUFBJX0NBTEwoIGljdkNvbXBhcmVDXzMyZl9DMVJfcCggc3JjMS0+ZGF0YS5mbCwgc3JjMV9zdGVwLCAoZmxvYXQpdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEuZmwsIGRzdF9zdGVwLCBzaXplLCBpcHBfY21wX29wICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkZ1bmMyRF8yQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkoY21wc190YWJbY21wX29wXS5mbl8yZFt0eXBlXSk7CisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgaWYoIHR5cGUgPD0gQ1ZfMzJTICkKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMxLT5kYXRhLnB0ciwgc3JjMV9zdGVwLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgc2l6ZSwgJml2YWwgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCAmdmFsdWUgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaW52ZmxhZyApCisgICAgICAgIElQUElfQ0FMTCggaWN2Tm90Xzh1X0MxUiggZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluL01heCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhfRlVOQyggX19vcF9fLCBuYW1lLCBmbGF2b3IsIGFycnR5cGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdiMjbmFtZSMjXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsIFwKKyAgICBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3RlcDIsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSApICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNyYzIgKz0gc3RlcDIsIGRzdCArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gNDsgeCArPSA0ICkgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGEwID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4XSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGIwID0gX3RvZ2dsZV9tYWNyb18oc3JjMlt4XSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KzFdKTsgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGIxID0gX3RvZ2dsZV9tYWNyb18oc3JjMlt4KzFdKTsgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gX19vcF9fKCBhMCwgYjAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGExID0gX19vcF9fKCBhMSwgYjEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChhcnJ0eXBlKV90b2dnbGVfbWFjcm9fKGEwKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzFdID0gKGFycnR5cGUpX3RvZ2dsZV9tYWNyb18oYTEpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KzJdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGIwID0gX3RvZ2dsZV9tYWNyb18oc3JjMlt4KzJdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGExID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4KzNdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGIxID0gX3RvZ2dsZV9tYWNyb18oc3JjMlt4KzNdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gX19vcF9fKCBhMCwgYjAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGExID0gX19vcF9fKCBhMSwgYjEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzJdID0gKGFycnR5cGUpX3RvZ2dsZV9tYWNyb18oYTApOyAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4KzNdID0gKGFycnR5cGUpX3RvZ2dsZV9tYWNyb18oYTEpOyAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IHggPCBzaXplLndpZHRoOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGEwID0gX3RvZ2dsZV9tYWNyb18oc3JjMVt4XSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGIwID0gX3RvZ2dsZV9tYWNyb18oc3JjMlt4XSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gX19vcF9fKCBhMCwgYjAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChhcnJ0eXBlKV90b2dnbGVfbWFjcm9fKGEwKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYX0NPTlNUX0ZVTkMoIF9fb3BfXywgbmFtZSwgICAgICAgICAgICBcCisgICAgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18pICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3YjI25hbWUjI0NfIyNmbGF2b3IjI19DMVIoIGNvbnN0IGFycnR5cGUqIHNyYzEsIGludCBzdGVwMSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IHN0ZXAsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCB3b3JrdHlwZSogcFNjYWxhcilcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgc2NhbGFyID0gX3RvZ2dsZV9tYWNyb18oKnBTY2FsYXIpOyAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyBzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIGRzdCArPSBzdGVwICkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDA7IHggPD0gc2l6ZS53aWR0aCAtIDQ7IHggKz0gNCApICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBhMCA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pOyAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCsxXSk7ICAgICAgICBcCisgICAgICAgICAgICBhMCA9IF9fb3BfXyggYTAsIHNjYWxhciApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMSA9IF9fb3BfXyggYTEsIHNjYWxhciApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeF0gPSAoYXJydHlwZSlfdG9nZ2xlX21hY3JvXyhhMCk7ICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCsxXSA9IChhcnJ0eXBlKV90b2dnbGVfbWFjcm9fKGExKTsgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCsyXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMSA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeCszXSk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IF9fb3BfXyggYTAsIHNjYWxhciApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMSA9IF9fb3BfXyggYTEsIHNjYWxhciApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCsyXSA9IChhcnJ0eXBlKV90b2dnbGVfbWFjcm9fKGEwKTsgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCszXSA9IChhcnJ0eXBlKV90b2dnbGVfbWFjcm9fKGExKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBhMCA9IF90b2dnbGVfbWFjcm9fKHNyYzFbeF0pOyAgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IF9fb3BfXyggYTAsIHNjYWxhciApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeF0gPSAoYXJydHlwZSlfdG9nZ2xlX21hY3JvXyhhMCk7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX01JTk1BWF9BTEwoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3RvZ2dsZV9tYWNyb18sIF9taW5fb3BfLCBfbWF4X29wXyApICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTUlOTUFYX0ZVTkMoIF9taW5fb3BfLCBNaW4sIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fICkgICAgXAorSUNWX0RFRl9NSU5NQVhfRlVOQyggX21heF9vcF8sIE1heCwgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18gKSAgICBcCitJQ1ZfREVGX01JTk1BWF9DT05TVF9GVU5DKF9taW5fb3BfLCBNaW4sIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIF90b2dnbGVfbWFjcm9fKVwKK0lDVl9ERUZfTUlOTUFYX0NPTlNUX0ZVTkMoX21heF9vcF8sIE1heCwgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgX3RvZ2dsZV9tYWNyb18pCisKK0lDVl9ERUZfTUlOTUFYX0FMTCggOHUsIHVjaGFyLCBpbnQsIENWX05PUCwgQ1ZfTUlOXzhVLCBDVl9NQVhfOFUgKQorSUNWX0RFRl9NSU5NQVhfQUxMKCAxNnUsIHVzaG9ydCwgaW50LCBDVl9OT1AsIENWX0lNSU4sIENWX0lNQVggKQorSUNWX0RFRl9NSU5NQVhfQUxMKCAxNnMsIHNob3J0LCBpbnQsIENWX05PUCwgQ1ZfSU1JTiwgQ1ZfSU1BWCApCitJQ1ZfREVGX01JTk1BWF9BTEwoIDMycywgaW50LCBpbnQsIENWX05PUCwgQ1ZfSU1JTiwgQ1ZfSU1BWCApCitJQ1ZfREVGX01JTk1BWF9BTEwoIDMyZiwgaW50LCBpbnQsIENWX1RPR0dMRV9GTFQsIENWX0lNSU4sIENWX0lNQVggKQorSUNWX0RFRl9NSU5NQVhfQUxMKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AsIE1JTiwgTUFYICkKKworI2RlZmluZSBpY3ZNaW5fOHNfQzFSICAgICAwCisjZGVmaW5lIGljdk1heF84c19DMVIgICAgIDAKKyNkZWZpbmUgaWN2TWluQ184c19DMVIgICAgMAorI2RlZmluZSBpY3ZNYXhDXzhzX0MxUiAgICAwCisKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBNaW4sIEMxUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTWF4LCBDMVIgKQorQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIE1pbkMsIEMxUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTWF4QywgQzFSICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN2TWluICYgY3ZNYXggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpY3ZNaW5NYXgoIGNvbnN0IHZvaWQqIHNyY2FycjEsIGNvbnN0IHZvaWQqIHNyY2FycjIsCisgICAgICAgICAgIHZvaWQqIGRzdGFyciwgaW50IGlzX21heCApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG1pbm1heF90YWJbMl07CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2TWluTWF4IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGNvaSA9IDA7CisgICAgaW50IHNyYzFfc3RlcCwgc3JjMl9zdGVwLCBkc3Rfc3RlcDsKKyAgICBDdk1hdCBzcmNzdHViMSwgKnNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgQ3ZNYXQgc3Jjc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZGdW5jMkRfM0EgZnVuYzsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0TWluQzFSVGFibGUoICZtaW5tYXhfdGFiWzBdICk7CisgICAgICAgIGljdkluaXRNYXhDMVJUYWJsZSggJm1pbm1heF90YWJbMV0gKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMSkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBzcmMxLCAmc3Jjc3R1YjEsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYzIpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNyYzIgPSBjdkdldE1hdCggc3JjMiwgJnNyY3N0dWIyLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgc3JjMiApIHx8CisgICAgICAgICFDVl9BUkVfVFlQRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCBDVl9NQVRfQ04oIHNyYzEtPnR5cGUgKSAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiSW5wdXQgYXJyYXlzIG11c3QgYmUgc2luZ2xlLWNoYW5uZWwiKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMyICkgfHwKKyAgICAgICAgIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMxLT50eXBlKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMxICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYzEtPnR5cGUgJiBzcmMyLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzcmMxX3N0ZXAgPSBzcmMyX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzcmMxX3N0ZXAgPSBzcmMxLT5zdGVwOworICAgICAgICBzcmMyX3N0ZXAgPSBzcmMyLT5zdGVwOworICAgICAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICB9CisKKyAgICBmdW5jID0gKEN2RnVuYzJEXzNBKShtaW5tYXhfdGFiW2lzX21heCAhPSAwXS5mbl8yZFt0eXBlXSk7CisKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIHNyYzItPmRhdGEucHRyLCBzcmMyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdk1pbiggY29uc3Qgdm9pZCogc3JjYXJyMSwgY29uc3Qgdm9pZCogc3JjYXJyMiwgdm9pZCogZHN0YXJyICkKK3sKKyAgICBpY3ZNaW5NYXgoIHNyY2FycjEsIHNyY2FycjIsIGRzdGFyciwgMCApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZNYXgoIGNvbnN0IHZvaWQqIHNyY2FycjEsIGNvbnN0IHZvaWQqIHNyY2FycjIsIHZvaWQqIGRzdGFyciApCit7CisgICAgaWN2TWluTWF4KCBzcmNhcnIxLCBzcmNhcnIyLCBkc3RhcnIsIDEgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIGN2TWluUyAvIGN2TWF4UyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2ljdk1pbk1heFMoIGNvbnN0IHZvaWQqIHNyY2FyciwgZG91YmxlIHZhbHVlLCB2b2lkKiBkc3RhcnIsIGludCBpc19tYXggKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtaW5tYXhzX3RhYlsyXTsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZNaW5NYXhTIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGNvaSA9IDA7CisgICAgaW50IHNyYzFfc3RlcCwgZHN0X3N0ZXA7CisgICAgQ3ZNYXQgc3Jjc3R1YjEsICpzcmMxID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBDdkZ1bmMyRF8yQTFQIGZ1bmM7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmbG9hdCBmOworICAgICAgICBkb3VibGUgZDsKKyAgICB9CisgICAgYnVmOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRNaW5DQzFSVGFibGUoICZtaW5tYXhzX3RhYlswXSApOworICAgICAgICBpY3ZJbml0TWF4Q0MxUlRhYmxlKCAmbWlubWF4c190YWJbMV0gKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMSkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBzcmMxLCAmc3Jjc3R1YjEsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggQ1ZfTUFUX0NOKCBzcmMxLT50eXBlICkgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IGFycmF5IG11c3QgYmUgc2luZ2xlLWNoYW5uZWwiKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKHNyYzEtPnR5cGUpOworCisgICAgaWYoIENWX01BVF9ERVBUSCh0eXBlKSA8PSBDVl8zMlMgKQorICAgIHsKKyAgICAgICAgYnVmLmkgPSBjdlJvdW5kKHZhbHVlKTsKKyAgICAgICAgaWYoIENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl84VSApCisgICAgICAgICAgICBidWYuaSA9IENWX0NBU1RfOFUoYnVmLmkpOworICAgICAgICBlbHNlIGlmKCBDVl9NQVRfREVQVEgodHlwZSkgPT0gQ1ZfOFMgKQorICAgICAgICAgICAgYnVmLmkgPSBDVl9DQVNUXzhTKGJ1Zi5pKTsKKyAgICAgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzE2VSApCisgICAgICAgICAgICBidWYuaSA9IENWX0NBU1RfMTZVKGJ1Zi5pKTsKKyAgICAgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzE2UyApCisgICAgICAgICAgICBidWYuaSA9IENWX0NBU1RfMTZTKGJ1Zi5pKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzMyRiApCisgICAgICAgIGJ1Zi5mID0gKGZsb2F0KXZhbHVlOworICAgIGVsc2UKKyAgICAgICAgYnVmLmQgPSB2YWx1ZTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYzEgKTsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjMV9zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICAgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgfQorCisgICAgZnVuYyA9IChDdkZ1bmMyRF8yQTFQKShtaW5tYXhzX3RhYltpc19tYXhdLmZuXzJkW3R5cGVdKTsKKworICAgIGlmKCAhZnVuYyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCBpc19tYXggKQorICAgIHsKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfOFUgJiYgaWN2VGhyZXNob2xkX0xUXzh1X0MxUl9wICkKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZUaHJlc2hvbGRfTFRfOHVfQzFSX3AoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0ZXAsIHNpemUsICh1Y2hhcilidWYuaSApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8xNlMgJiYgaWN2VGhyZXNob2xkX0xUXzE2c19DMVJfcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggaWN2VGhyZXNob2xkX0xUXzE2c19DMVJfcCggc3JjMS0+ZGF0YS5zLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCAoc2hvcnQpYnVmLmkgKSk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGICYmIGljdlRocmVzaG9sZF9MVF8zMmZfQzFSX3AgKQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdlRocmVzaG9sZF9MVF8zMmZfQzFSX3AoIHNyYzEtPmRhdGEuZmwsIHNyYzFfc3RlcCwgZHN0LT5kYXRhLmZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCBidWYuZiApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfOFUgJiYgaWN2VGhyZXNob2xkX0dUXzh1X0MxUl9wICkKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZUaHJlc2hvbGRfR1RfOHVfQzFSX3AoIHNyYzEtPmRhdGEucHRyLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3N0ZXAsIHNpemUsICh1Y2hhcilidWYuaSApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8xNlMgJiYgaWN2VGhyZXNob2xkX0dUXzE2c19DMVJfcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggaWN2VGhyZXNob2xkX0dUXzE2c19DMVJfcCggc3JjMS0+ZGF0YS5zLCBzcmMxX3N0ZXAsIGRzdC0+ZGF0YS5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCAoc2hvcnQpYnVmLmkgKSk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGICYmIGljdlRocmVzaG9sZF9HVF8zMmZfQzFSX3AgKQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGljdlRocmVzaG9sZF9HVF8zMmZfQzFSX3AoIHNyYzEtPmRhdGEuZmwsIHNyYzFfc3RlcCwgZHN0LT5kYXRhLmZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCBidWYuZiApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggdHlwZSA9PSBDVl84VSAmJiBzaXplLndpZHRoKnNpemUuaGVpZ2h0ID49IDEwMjQgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHVjaGFyIHRhYlsyNTZdOworICAgICAgICBDdk1hdCBfdGFiID0gY3ZNYXQoIDEsIDI1NiwgQ1ZfOFUsIHRhYiApOworCisgICAgICAgIGlmKCBpc19tYXggKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYnVmLmk7IGkrKyApCisgICAgICAgICAgICAgICAgdGFiW2ldID0gKHVjaGFyKWJ1Zi5pOworICAgICAgICAgICAgZm9yKCA7IGkgPCAyNTY7IGkrKyApCisgICAgICAgICAgICAgICAgdGFiW2ldID0gKHVjaGFyKWk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgYnVmLmk7IGkrKyApCisgICAgICAgICAgICAgICAgdGFiW2ldID0gKHVjaGFyKWk7CisgICAgICAgICAgICBmb3IoIDsgaSA8IDI1NjsgaSsrICkKKyAgICAgICAgICAgICAgICB0YWJbaV0gPSAodWNoYXIpYnVmLmk7CisgICAgICAgIH0KKworICAgICAgICBjdkxVVCggc3JjMSwgZHN0LCAmX3RhYiApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIElQUElfQ0FMTCggZnVuYyggc3JjMS0+ZGF0YS5wdHIsIHNyYzFfc3RlcCwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCBzaXplLCAmYnVmICkpOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2TWluUyggY29uc3Qgdm9pZCogc3JjYXJyLCBkb3VibGUgdmFsdWUsIHZvaWQqIGRzdGFyciApCit7CisgICAgaWN2TWluTWF4Uyggc3JjYXJyLCB2YWx1ZSwgZHN0YXJyLCAwICk7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdk1heFMoIGNvbnN0IHZvaWQqIHNyY2FyciwgZG91YmxlIHZhbHVlLCB2b2lkKiBkc3RhcnIgKQoreworICAgIGljdk1pbk1heFMoIHNyY2FyciwgdmFsdWUsIGRzdGFyciwgMSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBYnNvbHV0ZSBEaWZmZXJlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgSUNWX0RFRl9CSU5fQUJTX0RJRkZfMkQobmFtZSwgYXJydHlwZSwgdGVtcHR5cGUsIGFic19tYWNybywgY2FzdF9tYWNybylcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUsKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICAgICAgICAgICAgICAgICAgXAorICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgYXJydHlwZSogZHN0LCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUgKSwgICAgICAgICAgIFwKKyAgICAgICAoc3JjMSwgc3RlcDEsIHNyYzIsIHN0ZXAyLCBkc3QsIHN0ZXAsIHNpemUpKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyBzdGVwMiAvPSBzaXplb2Yoc3JjMlswXSk7IFwKKyAgICBzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIHNyYzIgKz0gc3RlcDIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0ICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKSAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIHQwID0gc3JjMVtpXSAtIHNyYzJbaV07ICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcHR5cGUgdDEgPSBzcmMxW2krMV0gLSBzcmMyW2krMV07ICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gKHRlbXB0eXBlKWFic19tYWNybyh0MCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQxKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krMV0gPSBjYXN0X21hY3JvKHQxKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3JjMVtpKzJdIC0gc3JjMltpKzJdOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBzcmMxW2krM10gLSBzcmMyW2krM107ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gKHRlbXB0eXBlKWFic19tYWNybyh0MCk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQxKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gY2FzdF9tYWNybyh0MCk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2krM10gPSBjYXN0X21hY3JvKHQxKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIHQwID0gc3JjMVtpXSAtIHNyYzJbaV07ICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvKHQwKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfVU5fQUJTX0RJRkZfMkQoIG5hbWUsIGFycnR5cGUsIHRlbXB0eXBlLCBhYnNfbWFjcm8sIGNhc3RfbWFjcm8pXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCituYW1lKCBjb25zdCBhcnJ0eXBlKiBzcmMwLCBpbnQgc3RlcDEsICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGFycnR5cGUqIGRzdDAsIGludCBzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQ3ZTaXplIHNpemUsIGNvbnN0IHRlbXB0eXBlKiBzY2FsYXIgKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMFswXSk7IHN0ZXAgLz0gc2l6ZW9mKGRzdDBbMF0pOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzAgKz0gc3RlcDEsIGRzdDAgKz0gc3RlcCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgbGVuID0gc2l6ZS53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYyA9IHNyYzA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSogZHN0ID0gZHN0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyAobGVuIC09IDEyKSA+PSAwOyBkc3QgKz0gMTIsIHNyYyArPSAxMiApIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcHR5cGUgdDAgPSBzcmNbMF0gLSBzY2FsYXJbMF07ICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSB0MSA9IHNyY1sxXSAtIHNjYWxhclsxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzBdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbMV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbMl0gLSBzY2FsYXJbMl07ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNyY1szXSAtIHNjYWxhclszXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzJdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbM10gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbNF0gLSBzY2FsYXJbNF07ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNyY1s1XSAtIHNjYWxhcls1XTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzRdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbNV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbNl0gLSBzY2FsYXJbNl07ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNyY1s3XSAtIHNjYWxhcls3XTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzZdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbN10gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbOF0gLSBzY2FsYXJbOF07ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNyY1s5XSAtIHNjYWxhcls5XTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzhdID0gY2FzdF9tYWNybyggdDAgKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbOV0gPSBjYXN0X21hY3JvKCB0MSApOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbMTBdIC0gc2NhbGFyWzEwXTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNyY1sxMV0gLSBzY2FsYXJbMTFdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAodGVtcHR5cGUpYWJzX21hY3JvKHQwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0WzEwXSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbMTFdID0gY2FzdF9tYWNybyggdDEgKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggKGxlbikgKz0gMTIsIGkgPSAwOyBpIDwgKGxlbik7IGkrKyApICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcHR5cGUgdDAgPSBzcmNbaV0gLSBzY2FsYXJbaV07ICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9ICh0ZW1wdHlwZSlhYnNfbWFjcm8odDApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8oIHQwICk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX1RPXzhVKHgpICAgICAoKHVjaGFyKSh4KSkKKyNkZWZpbmUgIElDVl9UT18xNlUoeCkgICAgKCh1c2hvcnQpKHgpKQorCitJQ1ZfREVGX0JJTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZl84dV9DMVIsIHVjaGFyLCBpbnQsIENWX0lBQlMsIElDVl9UT184VSApCitJQ1ZfREVGX0JJTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZl8xNnVfQzFSLCB1c2hvcnQsIGludCwgQ1ZfSUFCUywgSUNWX1RPXzE2VSApCitJQ1ZfREVGX0JJTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZl8xNnNfQzFSLCBzaG9ydCwgaW50LCBDVl9JQUJTLCBDVl9DQVNUXzE2UyApCitJQ1ZfREVGX0JJTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZl8zMnNfQzFSLCBpbnQsIGludCwgQ1ZfSUFCUywgQ1ZfQ0FTVF8zMlMgKQorSUNWX0RFRl9CSU5fQUJTX0RJRkZfMkQoIGljdkFic0RpZmZfMzJmX0MxUiwgZmxvYXQsIGZsb2F0LCBmYWJzLCBDVl9DQVNUXzMyRiApCitJQ1ZfREVGX0JJTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZl82NGZfQzFSLCBkb3VibGUsIGRvdWJsZSwgZmFicywgQ1ZfQ0FTVF82NEYgKQorCitJQ1ZfREVGX1VOX0FCU19ESUZGXzJEKCBpY3ZBYnNEaWZmQ184dV9DblIsIHVjaGFyLCBpbnQsIENWX0lBQlMsIENWX0NBU1RfOFUgKQorSUNWX0RFRl9VTl9BQlNfRElGRl8yRCggaWN2QWJzRGlmZkNfMTZ1X0NuUiwgdXNob3J0LCBpbnQsIENWX0lBQlMsIENWX0NBU1RfMTZVICkKK0lDVl9ERUZfVU5fQUJTX0RJRkZfMkQoIGljdkFic0RpZmZDXzE2c19DblIsIHNob3J0LCBpbnQsIENWX0lBQlMsIENWX0NBU1RfMTZTICkKK0lDVl9ERUZfVU5fQUJTX0RJRkZfMkQoIGljdkFic0RpZmZDXzMyc19DblIsIGludCwgaW50LCBDVl9JQUJTLCBDVl9DQVNUXzMyUyApCitJQ1ZfREVGX1VOX0FCU19ESUZGXzJEKCBpY3ZBYnNEaWZmQ18zMmZfQ25SLCBmbG9hdCwgZmxvYXQsIGZhYnMsIENWX0NBU1RfMzJGICkKK0lDVl9ERUZfVU5fQUJTX0RJRkZfMkQoIGljdkFic0RpZmZDXzY0Zl9DblIsIGRvdWJsZSwgZG91YmxlLCBmYWJzLCBDVl9DQVNUXzY0RiApCisKKworI2RlZmluZSAgSUNWX0lOSVRfTUlOSV9GVU5DX1RBQl8yRCggRlVOQ05BTUUsIHN1ZmZpeCApICAgICAgICAgIFwKK3N0YXRpYyB2b2lkIGljdkluaXQjI0ZVTkNOQU1FIyNUYWJsZSggQ3ZGdW5jVGFibGUqIHRhYiApICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV8jI3N1ZmZpeDsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2dV8jI3N1ZmZpeDsgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnNfIyNzdWZmaXg7ICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJTXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJzXyMjc3VmZml4OyAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl8jI3N1ZmZpeDsgICBcCisgICAgdGFiLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NGZfIyNzdWZmaXg7ICAgXAorfQorCisKK0lDVl9JTklUX01JTklfRlVOQ19UQUJfMkQoIEFic0RpZmYsIEMxUiApCitJQ1ZfSU5JVF9NSU5JX0ZVTkNfVEFCXzJEKCBBYnNEaWZmQywgQ25SICkKKworCitDVl9JTVBMICB2b2lkCitjdkFic0RpZmYoIGNvbnN0IHZvaWQqIHNyY2FycjEsIGNvbnN0IHZvaWQqIHNyY2FycjIsIHZvaWQqIGRzdGFyciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGFkaWZmX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkFic0RpZmYiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBjb2kzID0gMDsKKyAgICBDdk1hdCBzcmNzdHViMSwgKnNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgQ3ZNYXQgc3Jjc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0IGRzdHN0dWIsICAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgaW50IHNyYzFfc3RlcCwgc3JjMl9zdGVwLCBkc3Rfc3RlcDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgdHlwZTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0QWJzRGlmZlRhYmxlKCAmYWRpZmZfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIENWX0NBTEwoIHNyYzEgPSBjdkdldE1hdCggc3JjMSwgJnNyY3N0dWIxLCAmY29pMSApKTsKKyAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzcmNzdHViMiwgJmNvaTIgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kzICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgfHwgY29pMyAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMxLCBzcmMyICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMxICk7CisgICAgdHlwZSA9IENWX01BVF9UWVBFKHNyYzEtPnR5cGUpOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgc3JjMiApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMxLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBzaXplLndpZHRoICo9IENWX01BVF9DTiggdHlwZSApOworCisgICAgc3JjMV9zdGVwID0gc3JjMS0+c3RlcDsKKyAgICBzcmMyX3N0ZXAgPSBzcmMyLT5zdGVwOworICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMxLT50eXBlICYgc3JjMi0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICBzcmMxX3N0ZXAgPSBzcmMyX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEN2RnVuYzJEXzNBIGZ1bmMgPSAoQ3ZGdW5jMkRfM0EpCisgICAgICAgICAgICAoYWRpZmZfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMxLT5kYXRhLnB0ciwgc3JjMV9zdGVwLCBzcmMyLT5kYXRhLnB0ciwgc3JjMl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkFic0RpZmZTKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgQ3ZTY2FsYXIgc2NhbGFyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgYWRpZmZzX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkFic0RpZmZTIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMDsKKyAgICBpbnQgdHlwZSwgc2N0eXBlOworICAgIEN2TWF0IHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgaW50IHNyY19zdGVwLCBkc3Rfc3RlcDsKKyAgICBkb3VibGUgYnVmWzEyXTsKKyAgICBDdlNpemUgc2l6ZTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0QWJzRGlmZkNUYWJsZSggJmFkaWZmc190YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKHNyYywgZHN0KSApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoc3JjLCBkc3QpICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgc2N0eXBlID0gdHlwZSA9IENWX01BVF9UWVBFKCBzcmMtPnR5cGUgKTsKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpIDwgQ1ZfMzJTICkKKyAgICAgICAgc2N0eXBlID0gKHR5cGUgJiBDVl9NQVRfQ05fTUFTSykgfCBDVl8zMlNDMTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKCB0eXBlICk7CisKKyAgICBzcmNfc3RlcCA9IHNyYy0+c3RlcDsKKyAgICBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIHNyY19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggY3ZTY2FsYXJUb1Jhd0RhdGEoICZzY2FsYXIsIGJ1Ziwgc2N0eXBlLCAxICkpOworCisgICAgeworICAgICAgICBDdkZ1bmMyRF8yQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkKKyAgICAgICAgICAgIChhZGlmZnNfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgc2l6ZSwgYnVmICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeGNvbnZlcnQuY3BwIGIvY3hjb3JlL3NyYy9jeGNvbnZlcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMjlmMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4Y29udmVydC5jcHAKQEAgLTAsMCArMSwxNzg4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwbGl0dGluZy9leHRyYWN0aW5nIGFycmF5IGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lICBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MyKCBhcnJ0eXBlX3B0ciwgcHRyICkgIFwKKyAgICBhcnJ0eXBlX3B0ciBwbGFuZTAgPSBwdHJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGVfcHRyIHBsYW5lMSA9IHB0clsxXTsKKworI2RlZmluZSAgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMyggYXJydHlwZV9wdHIsIHB0ciApICBcCisgICAgYXJydHlwZV9wdHIgcGxhbmUwID0gcHRyWzBdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlX3B0ciBwbGFuZTEgPSBwdHJbMV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGVfcHRyIHBsYW5lMiA9IHB0clsyXTsKKworI2RlZmluZSAgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DNCggYXJydHlwZV9wdHIsIHB0ciApICBcCisgICAgYXJydHlwZV9wdHIgcGxhbmUwID0gcHRyWzBdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlX3B0ciBwbGFuZTEgPSBwdHJbMV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGVfcHRyIHBsYW5lMiA9IHB0clsyXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZV9wdHIgcGxhbmUzID0gcHRyWzNdOworCisKKyNkZWZpbmUgIElDVl9ERUZfUFgyUExfQzIoIGFycnR5cGUsIGxlbiApICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBqID0gMDsgaiA8IChsZW4pOyBqKyssIChzcmMpICs9IDIgKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IChzcmMpWzBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDEgPSAoc3JjKVsxXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGxhbmUwW2pdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBsYW5lMVtqXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTAgKz0gZHN0c3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUxICs9IGRzdHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfUFgyUExfQzMoIGFycnR5cGUsIGxlbiApICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBqID0gMDsgaiA8IChsZW4pOyBqKyssIChzcmMpICs9IDMgKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IChzcmMpWzBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDEgPSAoc3JjKVsxXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlIHQyID0gKHNyYylbMl07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBsYW5lMFtqXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwbGFuZTFbal0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGxhbmUyW2pdID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5lMCArPSBkc3RzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTEgKz0gZHN0c3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUyICs9IGRzdHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfUFgyUExfQzQoIGFycnR5cGUsIGxlbiApICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBqID0gMDsgaiA8IChsZW4pOyBqKyssIChzcmMpICs9IDQgKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IChzcmMpWzBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDEgPSAoc3JjKVsxXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGxhbmUwW2pdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBsYW5lMVtqXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSAoc3JjKVsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gKHNyYylbM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGxhbmUyW2pdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBsYW5lM1tqXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTAgKz0gZHN0c3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUxICs9IGRzdHN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5lMiArPSBkc3RzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTMgKz0gZHN0c3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9QWDJQTF9DT0koIGFycnR5cGUsIGxlbiwgY24gKSAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAwOyBqIDw9IChsZW4pIC0gNDsgaiArPSA0LCAoc3JjKSArPSA0KihjbikpXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IChzcmMpWzBdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDEgPSAoc3JjKVsoY24pXTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbal0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2orMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSAoc3JjKVsoY24pKjJdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gKHNyYylbKGNuKSozXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaisyXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2orM10gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGogPCAobGVuKTsgaisrLCAoc3JjKSArPSAoY24pKSAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbal0gPSAoc3JjKVswXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCBhcnJ0eXBlLCBmbGF2b3IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuLCBlbnRyeV9tYWNybyApICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZDb3B5XyMjZmxhdm9yIyNfQyMjY24jI1AjI2NuIyNSLFwKKyggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgICAgXAorICBhcnJ0eXBlKiogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSwgICAgICAgICAgICBcCisgIChzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSkpICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudHJ5X21hY3JvKGFycnR5cGUqLCBkc3QpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF1bMF0pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX1BYMlBMX0MjI2NuKCBhcnJ0eXBlLCBzaXplLndpZHRoICk7ICAgICBcCisgICAgICAgIHNyYyAtPSBzaXplLndpZHRoKihjbik7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRF9DT0koIGFycnR5cGUsIGZsYXZvciApXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2Q29weV8jI2ZsYXZvciMjX0NuQzFDUiwgICAgICBcCisoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsXAorICBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pICksICAgICAgICAgICAgICAgICAgICAgICBcCisgIChzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwgY24sIGNvaSkpICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfUFgyUExfQ09JKCBhcnJ0eXBlLCBzaXplLndpZHRoLCBjbiApOyAgIFwKKyAgICAgICAgc3JjIC09IHNpemUud2lkdGgqKGNuKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCB1Y2hhciwgOHUsIDIsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzIgKQorSUNWX0RFRl9DT1BZX1BYMlBMX0ZVTkNfMkQoIHVjaGFyLCA4dSwgMywgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMyApCitJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRCggdWNoYXIsIDh1LCA0LCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0M0ICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCB1c2hvcnQsIDE2cywgMiwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMiApCitJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRCggdXNob3J0LCAxNnMsIDMsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzMgKQorSUNWX0RFRl9DT1BZX1BYMlBMX0ZVTkNfMkQoIHVzaG9ydCwgMTZzLCA0LCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0M0ICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCBpbnQsIDMyZiwgMiwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMiApCitJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRCggaW50LCAzMmYsIDMsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzMgKQorSUNWX0RFRl9DT1BZX1BYMlBMX0ZVTkNfMkQoIGludCwgMzJmLCA0LCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0M0ICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCBpbnQ2NCwgNjRmLCAyLCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MyICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCBpbnQ2NCwgNjRmLCAzLCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MzICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEKCBpbnQ2NCwgNjRmLCA0LCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0M0ICkKKworCitJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRF9DT0koIHVjaGFyLCA4dSApCitJQ1ZfREVGX0NPUFlfUFgyUExfRlVOQ18yRF9DT0koIHVzaG9ydCwgMTZzICkKK0lDVl9ERUZfQ09QWV9QWDJQTF9GVU5DXzJEX0NPSSggaW50LCAzMmYgKQorSUNWX0RFRl9DT1BZX1BYMlBMX0ZVTkNfMkRfQ09JKCBpbnQ2NCwgNjRmICkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVyZ2luZy9pbnNlcnRpbmcgYXJyYXkgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworI2RlZmluZSAgSUNWX0RFRl9QTDJQWF9DMiggYXJydHlwZSwgbGVuICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBqID0gMDsgaiA8IChsZW4pOyBqKyssIChkc3QpICs9IDIgKVwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlIHQwID0gcGxhbmUwW2pdOyAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDEgPSBwbGFuZTFbal07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5lMCArPSBzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUxICs9IHNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX1BMMlBYX0MzKCBhcnJ0eXBlLCBsZW4gKSAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAwOyBqIDwgKGxlbik7IGorKywgKGRzdCkgKz0gMyApXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUgdDAgPSBwbGFuZTBbal07ICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MSA9IHBsYW5lMVtqXTsgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlIHQyID0gcGxhbmUyW2pdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsyXSA9IHQyOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5lMCArPSBzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUxICs9IHNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTIgKz0gc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfUEwyUFhfQzQoIGFycnR5cGUsIGxlbiApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaiA9IDA7IGogPCAobGVuKTsgaisrLCAoZHN0KSArPSA0IClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IHBsYW5lMFtqXTsgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlIHQxID0gcGxhbmUxW2pdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSBwbGFuZTJbal07ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IHBsYW5lM1tqXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzJdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbM10gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTAgKz0gc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHBsYW5lMSArPSBzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcGxhbmUyICs9IHNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBwbGFuZTMgKz0gc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfUEwyUFhfQ09JKCBhcnJ0eXBlLCBsZW4sIGNuICkgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaiA9IDA7IGogPD0gKGxlbikgLSA0OyBqICs9IDQsIChkc3QpICs9IDQqKGNuKSlcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSB0MCA9IChzcmMpW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlIHQxID0gKHNyYylbaisxXTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVsoY24pXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSAoc3JjKVtqKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IChzcmMpW2orM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbKGNuKSoyXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVsoY24pKjNdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBqIDwgKGxlbik7IGorKywgKGRzdCkgKz0gKGNuKSkgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbMF0gPSAoc3JjKVtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9DT1BZX1BMMlBYX0ZVTkNfMkQoIGFycnR5cGUsIGZsYXZvciwgY24sIGVudHJ5X21hY3JvICkgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2Q29weV8jI2ZsYXZvciMjX1AjI2NuIyNDIyNjbiMjUiwgXAorKCBjb25zdCBhcnJ0eXBlKiogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApLCAgICAgICAgICAgICAgICAgXAorICAoc3JjLCBzcmNzdGVwLCBkc3QsIGRzdHN0ZXAsIHNpemUpKSAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVudHJ5X21hY3JvKGNvbnN0IGFycnR5cGUqLCBzcmMpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX1BMMlBYX0MjI2NuKCBhcnJ0eXBlLCBzaXplLndpZHRoICk7ICAgICAgICAgXAorICAgICAgICBkc3QgLT0gc2l6ZS53aWR0aCooY24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEX0NPSSggYXJydHlwZSwgZmxhdm9yICkgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkNvcHlfIyNmbGF2b3IjI19DMUNuQ1IsICAgICAgICAgIFwKKyggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSApLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgKHNyYywgc3Jjc3RlcCwgZHN0LCBkc3RzdGVwLCBzaXplLCBjbiwgY29pKSkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX0RFRl9QTDJQWF9DT0koIGFycnR5cGUsIHNpemUud2lkdGgsIGNuICk7ICAgICAgIFwKKyAgICAgICAgZHN0IC09IHNpemUud2lkdGgqKGNuKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggdWNoYXIsIDh1LCAyLCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MyICkKK0lDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEKCB1Y2hhciwgOHUsIDMsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzMgKQorSUNWX0RFRl9DT1BZX1BMMlBYX0ZVTkNfMkQoIHVjaGFyLCA4dSwgNCwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DNCApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggdXNob3J0LCAxNnMsIDIsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzIgKQorSUNWX0RFRl9DT1BZX1BMMlBYX0ZVTkNfMkQoIHVzaG9ydCwgMTZzLCAzLCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MzICkKK0lDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEKCB1c2hvcnQsIDE2cywgNCwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DNCApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggaW50LCAzMmYsIDIsIElDVl9ERUZfUFgyUEwyUFhfRU5UUllfQzIgKQorSUNWX0RFRl9DT1BZX1BMMlBYX0ZVTkNfMkQoIGludCwgMzJmLCAzLCBJQ1ZfREVGX1BYMlBMMlBYX0VOVFJZX0MzICkKK0lDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEKCBpbnQsIDMyZiwgNCwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DNCApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggaW50NjQsIDY0ZiwgMiwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMiApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggaW50NjQsIDY0ZiwgMywgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DMyApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRCggaW50NjQsIDY0ZiwgNCwgSUNWX0RFRl9QWDJQTDJQWF9FTlRSWV9DNCApCisKK0lDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEX0NPSSggdWNoYXIsIDh1ICkKK0lDVl9ERUZfQ09QWV9QTDJQWF9GVU5DXzJEX0NPSSggdXNob3J0LCAxNnMgKQorSUNWX0RFRl9DT1BZX1BMMlBYX0ZVTkNfMkRfQ09JKCBpbnQsIDMyZiApCitJQ1ZfREVGX0NPUFlfUEwyUFhfRlVOQ18yRF9DT0koIGludDY0LCA2NGYgKQorCisKKyNkZWZpbmUgIElDVl9ERUZfUFhQTFBYX1RBQiggbmFtZSwgRlJPTSwgVE8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUoIEN2QmlnRnVuY1RhYmxlKiB0YWIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVQzJdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzIjI1RPIyMyUjsgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVQzNdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzMjI1RPIyMzUjsgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVQzRdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzQjI1RPIyM0UjsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTQzJdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzIjI1RPIyMyUjsgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTQzNdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzMjI1RPIyMzUjsgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTQzRdID0gKHZvaWQqKWljdkNvcHkjI184dV8jI0ZST00jIzQjI1RPIyM0UjsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VUMyXSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjMiMjVE8jIzJSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VUMzXSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjMyMjVE8jIzNSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VUM0XSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjNCMjVE8jIzRSOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U0MyXSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjMiMjVE8jIzJSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U0MzXSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjMyMjVE8jIzNSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U0M0XSA9ICh2b2lkKilpY3ZDb3B5IyNfMTZzXyMjRlJPTSMjNCMjVE8jIzRSOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU0MyXSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjMiMjVE8jIzJSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU0MzXSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjMyMjVE8jIzNSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU0M0XSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjNCMjVE8jIzRSOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRkMyXSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjMiMjVE8jIzJSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRkMzXSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjMyMjVE8jIzNSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRkM0XSA9ICh2b2lkKilpY3ZDb3B5IyNfMzJmXyMjRlJPTSMjNCMjVE8jIzRSOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0RkMyXSA9ICh2b2lkKilpY3ZDb3B5IyNfNjRmXyMjRlJPTSMjMiMjVE8jIzJSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0RkMzXSA9ICh2b2lkKilpY3ZDb3B5IyNfNjRmXyMjRlJPTSMjMyMjVE8jIzNSOyAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0RkM0XSA9ICh2b2lkKilpY3ZDb3B5IyNfNjRmXyMjRlJPTSMjNCMjVE8jIzRSOyAgICAgIFwKK30KKworCisKKyNkZWZpbmUgIElDVl9ERUZfUFhQTENPSV9UQUIoIG5hbWUsIEZST00sIFRPICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK25hbWUoIEN2RnVuY1RhYmxlKiB0YWIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZDb3B5IyNfOHVfIyNGUk9NIyNUTyMjQ1I7ICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzhTXSA9ICh2b2lkKilpY3ZDb3B5IyNfOHVfIyNGUk9NIyNUTyMjQ1I7ICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2Q29weSMjXzE2c18jI0ZST00jI1RPIyNDUjsgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2U10gPSAodm9pZCopaWN2Q29weSMjXzE2c18jI0ZST00jI1RPIyNDUjsgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyU10gPSAodm9pZCopaWN2Q29weSMjXzMyZl8jI0ZST00jI1RPIyNDUjsgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2Q29weSMjXzMyZl8jI0ZST00jI1RPIyNDUjsgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2Q29weSMjXzY0Zl8jI0ZST00jI1RPIyNDUjsgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX1BYUExQWF9UQUIoIGljdkluaXRTcGxpdFJUYWJsZSwgQywgUCApCitJQ1ZfREVGX1BYUExDT0lfVEFCKCBpY3ZJbml0U3BsaXRSQ29pVGFibGUsIENuLCBDMSApCitJQ1ZfREVGX1BYUExQWF9UQUIoIGljdkluaXRDdnRQbGFuZVRvUGl4UlRhYmxlLCBQLCBDICkKK0lDVl9ERUZfUFhQTENPSV9UQUIoIGljdkluaXRDdnRQbGFuZVRvUGl4UkNvaVRhYmxlLCBDMSwgQ24gKQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdlNwbGl0RnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZFeHRyYWN0UGxhbmVGdW5jKSggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pICk7CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2TWVyZ2VGdW5jKSggY29uc3Qgdm9pZCoqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUpOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkluc2VydFBsYW5lRnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sIGludCBjb2kgKTsKKworQ1ZfSU1QTCB2b2lkCitjdlNwbGl0KCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFycjAsIHZvaWQqIGRzdGFycjEsIHZvaWQqIGRzdGFycjIsIHZvaWQqIGRzdGFycjMgKQoreworICAgIHN0YXRpYyBDdkJpZ0Z1bmNUYWJsZSAgcHhwbF90YWI7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlICBweHBsY29pX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNwbGl0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1Yls1XSwgKmRzdFs0XSwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2U2l6ZSBzaXplOworICAgIHZvaWQqIGRzdHB0cls0XSA9IHsgMCwgMCwgMCwgMCB9OworICAgIGludCB0eXBlLCBjbiwgY29pID0gMDsKKyAgICBpbnQgaSwgbnpwbGFuZXMgPSAwLCBuemlkeCA9IC0xOworICAgIGludCBjb250X2ZsYWc7CisgICAgaW50IHNyY19zdGVwLCBkc3Rfc3RlcCA9IDA7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFNwbGl0UlRhYmxlKCAmcHhwbF90YWIgKTsKKyAgICAgICAgaWN2SW5pdFNwbGl0UkNvaVRhYmxlKCAmcHhwbGNvaV90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgZHN0WzBdID0gKEN2TWF0Kilkc3RhcnIwOworICAgIGRzdFsxXSA9IChDdk1hdCopZHN0YXJyMTsKKyAgICBkc3RbMl0gPSAoQ3ZNYXQqKWRzdGFycjI7CisgICAgZHN0WzNdID0gKEN2TWF0Kilkc3RhcnIzOworCisgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgc3R1YiArIDQsICZjb2kgKSk7CisKKyAgICAvL2lmKCBjb2kgIT0gMCApCisgICAgLy8gICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisgICAgY24gPSBDVl9NQVRfQ04oIHR5cGUgKTsKKworICAgIGNvbnRfZmxhZyA9IHNyYy0+dHlwZTsKKworICAgIGlmKCBjbiA9PSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiIiApOworCisgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgeworICAgICAgICBpZiggZHN0W2ldICkKKyAgICAgICAgeworICAgICAgICAgICAgbnpwbGFuZXMrKzsKKyAgICAgICAgICAgIG56aWR4ID0gaTsKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdFtpXSA9IGN2R2V0TWF0KCBkc3RbaV0sIHN0dWIgKyBpICkpOworICAgICAgICAgICAgaWYoIENWX01BVF9DTiggZHN0W2ldLT50eXBlICkgIT0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCAiIiApOworICAgICAgICAgICAgaWYoICFDVl9BUkVfREVQVEhTX0VRKCBkc3RbaV0sIHNyYyApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworICAgICAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIGRzdFtpXSwgc3JjICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICAgICAgaWYoIG56cGxhbmVzID4gaSAmJiBpID4gMCAmJiBkc3RbaV0tPnN0ZXAgIT0gZHN0W2ktMV0tPnN0ZXAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRTdGVwLCAiIiApOworICAgICAgICAgICAgZHN0X3N0ZXAgPSBkc3RbaV0tPnN0ZXA7CisgICAgICAgICAgICBkc3RwdHJbbnpwbGFuZXMtMV0gPSBkc3RbaV0tPmRhdGEucHRyOworCisgICAgICAgICAgICBjb250X2ZsYWcgJj0gZHN0W2ldLT50eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIGNvbnRfZmxhZyApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgaWYoIG56cGxhbmVzID09IGNuICkKKyAgICB7CisgICAgICAgIEN2U3BsaXRGdW5jIGZ1bmMgPSAoQ3ZTcGxpdEZ1bmMpcHhwbF90YWIuZm5fMmRbdHlwZV07CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBkc3RwdHIsIGRzdF9zdGVwLCBzaXplICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBuenBsYW5lcyA9PSAxICkKKyAgICB7CisgICAgICAgIEN2RXh0cmFjdFBsYW5lRnVuYyBmdW5jID0gKEN2RXh0cmFjdFBsYW5lRnVuYylweHBsY29pX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSldOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3RbbnppZHhdLT5kYXRhLnB0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgY24sIG56aWR4ICsgMSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJFaXRoZXIgYWxsIG91dHB1dCBwbGFuZXMgb3Igb25seSBvbmUgb3V0cHV0IHBsYW5lIHNob3VsZCBiZSBub24gemVybyIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKworQ1ZfSU1QTCB2b2lkCitjdk1lcmdlKCBjb25zdCB2b2lkKiBzcmNhcnIwLCBjb25zdCB2b2lkKiBzcmNhcnIxLCBjb25zdCB2b2lkKiBzcmNhcnIyLAorICAgICAgICAgY29uc3Qgdm9pZCogc3JjYXJyMywgdm9pZCogZHN0YXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgcGxweF90YWI7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIHBscHhjb2lfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2TWVyZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc3JjX3N0ZXAgPSAwLCBkc3Rfc3RlcDsKKyAgICBDdk1hdCBzdHViWzVdLCAqc3JjWzRdLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgY29uc3Qgdm9pZCogc3JjcHRyWzRdID0geyAwLCAwLCAwLCAwIH07CisgICAgaW50IHR5cGUsIGNuLCBjb2kgPSAwOworICAgIGludCBpLCBuenBsYW5lcyA9IDAsIG56aWR4ID0gLTE7CisgICAgaW50IGNvbnRfZmxhZzsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0Q3Z0UGxhbmVUb1BpeFJUYWJsZSggJnBscHhfdGFiICk7CisgICAgICAgIGljdkluaXRDdnRQbGFuZVRvUGl4UkNvaVRhYmxlKCAmcGxweGNvaV90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgc3JjWzBdID0gKEN2TWF0KilzcmNhcnIwOworICAgIHNyY1sxXSA9IChDdk1hdCopc3JjYXJyMTsKKyAgICBzcmNbMl0gPSAoQ3ZNYXQqKXNyY2FycjI7CisgICAgc3JjWzNdID0gKEN2TWF0KilzcmNhcnIzOworCisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgc3R1YiArIDQsICZjb2kgKSk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIGRzdC0+dHlwZSApOworICAgIGNuID0gQ1ZfTUFUX0NOKCB0eXBlICk7CisKKyAgICBjb250X2ZsYWcgPSBkc3QtPnR5cGU7CisKKyAgICBpZiggY24gPT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIiIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCA0OyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIHNyY1tpXSApCisgICAgICAgIHsKKyAgICAgICAgICAgIG56cGxhbmVzKys7CisgICAgICAgICAgICBuemlkeCA9IGk7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmNbaV0gPSBjdkdldE1hdCggc3JjW2ldLCBzdHViICsgaSApKTsKKyAgICAgICAgICAgIGlmKCBDVl9NQVRfQ04oIHNyY1tpXS0+dHlwZSApICE9IDEgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIiIgKTsKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX0RFUFRIU19FUSggc3JjW2ldLCBkc3QgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKyAgICAgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmNbaV0sIGRzdCApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICAgICAgICAgIGlmKCBuenBsYW5lcyA+IGkgJiYgaSA+IDAgJiYgc3JjW2ldLT5zdGVwICE9IHNyY1tpLTFdLT5zdGVwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkU3RlcCwgIiIgKTsKKyAgICAgICAgICAgIHNyY19zdGVwID0gc3JjW2ldLT5zdGVwOworICAgICAgICAgICAgc3JjcHRyW256cGxhbmVzLTFdID0gKGNvbnN0IHZvaWQqKShzcmNbaV0tPmRhdGEucHRyKTsKKworICAgICAgICAgICAgY29udF9mbGFnICY9IHNyY1tpXS0+dHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIGRzdCApOworICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBjb250X2ZsYWcgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNyY19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBpZiggbnpwbGFuZXMgPT0gY24gKQorICAgIHsKKyAgICAgICAgQ3ZNZXJnZUZ1bmMgZnVuYyA9IChDdk1lcmdlRnVuYylwbHB4X3RhYi5mbl8yZFt0eXBlXTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggc3JjcHRyLCBzcmNfc3RlcCwgZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsIHNpemUgKSk7CisgICAgfQorICAgIGVsc2UgaWYoIG56cGxhbmVzID09IDEgKQorICAgIHsKKyAgICAgICAgQ3ZJbnNlcnRQbGFuZUZ1bmMgZnVuYyA9IChDdkluc2VydFBsYW5lRnVuYylwbHB4Y29pX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSldOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmNbbnppZHhdLT5kYXRhLnB0ciwgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgY24sIG56aWR4ICsgMSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJFaXRoZXIgYWxsIGlucHV0IHBsYW5lcyBvciBvbmx5IG9uZSBpbnB1dCBwbGFuZSBzaG91bGQgYmUgbm9uIHplcm8iICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYWxpemVkIHNwbGl0L21lcmdlOiBtaXhpbmcgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgIElDVl9ERUZfTUlYX0NIX0ZVTkNfMkQoIGFycnR5cGUsIGZsYXZvciApICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TWl4Q2hhbm5lbHNfIyNmbGF2b3IoIGNvbnN0IGFycnR5cGUqKiBzcmMsIGludCogc2RlbHRhMCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNkZWx0YTEsIGFycnR5cGUqKiBkc3QsICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBkZGVsdGEwLCBpbnQqIGRkZWx0YTEsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuLCBDdlNpemUgc2l6ZSApICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBibG9ja19zaXplMCA9IG4gPT0gMSA/IHNpemUud2lkdGggOiAxMDI0OyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHJlbWFpbmluZyA9IHNpemUud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyByZW1haW5pbmcgPiAwOyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBibG9ja19zaXplID0gTUlOKCByZW1haW5pbmcsIGJsb2NrX3NpemUwICk7ICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBzID0gc3JjW2tdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJydHlwZSogZCA9IGRzdFtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBkcyA9IHNkZWx0YTFba10sIGRkID0gZGRlbHRhMVtrXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IGJsb2NrX3NpemUgLSAyOyBpICs9IDIsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IGRzKjIsIGQgKz0gZGQqMiApICBcCisgICAgICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSB0MCA9IHNbMF0sIHQxID0gc1tkc107ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSB0MDsgZFtkZF0gPSB0MTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpZiggaSA8IGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSBzWzBdLCBzICs9IGRzLCBkICs9IGRkOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHNyY1trXSA9IHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8PSBibG9ja19zaXplLTI7IGkrPTIsIGQrPWRkKjIgKVwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSBkW2RkXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGlmKCBpIDwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZFswXSA9IDAsIGQgKz0gZGQ7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2tdID0gZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNyY1trXSArPSBzZGVsdGEwW2tdLCBkc3Rba10gKz0gZGRlbHRhMFtrXTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9NSVhfQ0hfRlVOQ18yRCggdWNoYXIsIDh1ICkKK0lDVl9ERUZfTUlYX0NIX0ZVTkNfMkQoIHVzaG9ydCwgMTZ1ICkKK0lDVl9ERUZfTUlYX0NIX0ZVTkNfMkQoIGludCwgMzJzICkKK0lDVl9ERUZfTUlYX0NIX0ZVTkNfMkQoIGludDY0LCA2NHMgKQorCitzdGF0aWMgdm9pZAoraWN2SW5pdE1peENoYW5uZWxzVGFiKCBDdkZ1bmNUYWJsZSogdGFiICkKK3sKKyAgICB0YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZNaXhDaGFubmVsc184dTsKKyAgICB0YWItPmZuXzJkW0NWXzhTXSA9ICh2b2lkKilpY3ZNaXhDaGFubmVsc184dTsKKyAgICB0YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2TWl4Q2hhbm5lbHNfMTZ1OworICAgIHRhYi0+Zm5fMmRbQ1ZfMTZTXSA9ICh2b2lkKilpY3ZNaXhDaGFubmVsc18xNnU7CisgICAgdGFiLT5mbl8yZFtDVl8zMlNdID0gKHZvaWQqKWljdk1peENoYW5uZWxzXzMyczsKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2TWl4Q2hhbm5lbHNfMzJzOworICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3ZNaXhDaGFubmVsc182NHM7Cit9CisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdk1peENoYW5uZWxzRnVuYykoIGNvbnN0IHZvaWQqKiBzcmMsIGludCogc2RlbHRhMCwKKyAgICAgICAgaW50KiBzZGVsdGExLCB2b2lkKiogZHN0LCBpbnQqIGRkZWx0YTAsIGludCogZGRlbHRhMSwgaW50IG4sIEN2U2l6ZSBzaXplICk7CisKK0NWX0lNUEwgdm9pZAorY3ZNaXhDaGFubmVscyggY29uc3QgQ3ZBcnIqKiBzcmMsIGludCBzcmNfY291bnQsCisgICAgICAgICAgICAgICBDdkFycioqIGRzdCwgaW50IGRzdF9jb3VudCwKKyAgICAgICAgICAgICAgIGNvbnN0IGludCogZnJvbV90bywgaW50IHBhaXJfY291bnQgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtaXhjbl90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICB1Y2hhciogYnVmZmVyID0gMDsKKyAgICBpbnQgaGVhcF9hbGxvYyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2TWl4Q2hhbm5lbHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUgc2l6ZSA9IHswLDB9OworICAgIGludCBkZXB0aCA9IC0xLCBlbGVtX3NpemUgPSAxOworICAgIGludCAqc2RlbHRhMCA9IDAsICpzZGVsdGExID0gMCwgKmRkZWx0YTAgPSAwLCAqZGRlbHRhMSA9IDA7CisgICAgdWNoYXIgKipzcHRyID0gMCwgKipkcHRyID0gMDsKKyAgICB1Y2hhciAqKnNyYzAgPSAwLCAqKmRzdDAgPSAwOworICAgIGludCogc3JjX2NuID0gMCwgKmRzdF9jbiA9IDA7CisgICAgaW50KiBzcmNfc3RlcCA9IDAsICpkc3Rfc3RlcCA9IDA7CisgICAgaW50IGJ1Zl9zaXplLCBpLCBrOworICAgIGludCBjb250X2ZsYWcgPSBDVl9NQVRfQ09OVF9GTEFHOworICAgIEN2TWl4Q2hhbm5lbHNGdW5jIGZ1bmM7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdE1peENoYW5uZWxzVGFiKCAmbWl4Y25fdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIHNyY19jb3VudCA9IE1BWCggc3JjX2NvdW50LCAwICk7CisKKyAgICBpZiggIXNyYyAmJiBzcmNfY291bnQgPiAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJUaGUgaW5wdXQgYXJyYXkgb2YgYXJyYXlzIGlzIE5VTEwiICk7CisKKyAgICBpZiggIWRzdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIG91dHB1dCBhcnJheSBvZiBhcnJheXMgaXMgTlVMTCIgKTsKKworICAgIGlmKCBkc3RfY291bnQgPD0gMCB8fCBwYWlyX2NvdW50IDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgIlRoZSBudW1iZXIgb2Ygb3V0cHV0IGFycmF5cyBhbmQgdGhlIG51bWJlciBvZiBjb3BpZWQgY2hhbm5lbHMgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCAhZnJvbV90byApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIGFycmF5IG9mIGNvcGllZCBjaGFubmVsIGluZGljZXMgaXMgTlVMTCIgKTsKKworICAgIGJ1Zl9zaXplID0gKHNyY19jb3VudCArIGRzdF9jb3VudCArIDIpKgorICAgICAgICAoc2l6ZW9mKHNyYzBbMF0pICsgc2l6ZW9mKHNyY19jblswXSkgKyBzaXplb2Yoc3JjX3N0ZXBbMF0pKSArCisgICAgICAgIHBhaXJfY291bnQqMiooc2l6ZW9mKHNwdHJbMF0pICsgc2l6ZW9mKHNkZWx0YTBbMF0pICsgc2l6ZW9mKHNkZWx0YTFbMF0pKTsKKworICAgIGlmKCBidWZfc2l6ZSA+IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSApOworICAgICAgICBoZWFwX2FsbG9jID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggYnVmX3NpemUgKTsKKworICAgIHNyYzAgPSAodWNoYXIqKilidWZmZXI7CisgICAgZHN0MCA9IHNyYzAgKyBzcmNfY291bnQ7CisgICAgc3JjX2NuID0gKGludCopKGRzdDAgKyBkc3RfY291bnQpOworICAgIGRzdF9jbiA9IHNyY19jbiArIHNyY19jb3VudCArIDE7CisgICAgc3JjX3N0ZXAgPSBkc3RfY24gKyBkc3RfY291bnQgKyAxOworICAgIGRzdF9zdGVwID0gc3JjX3N0ZXAgKyBzcmNfY291bnQ7CisKKyAgICBzcHRyID0gKHVjaGFyKiopY3ZBbGlnblB0ciggZHN0X3N0ZXAgKyBkc3RfY291bnQsIChpbnQpc2l6ZW9mKHZvaWQqKSApOworICAgIGRwdHIgPSBzcHRyICsgcGFpcl9jb3VudDsKKyAgICBzZGVsdGEwID0gKGludCopKGRwdHIgKyBwYWlyX2NvdW50KTsKKyAgICBzZGVsdGExID0gc2RlbHRhMCArIHBhaXJfY291bnQ7CisgICAgZGRlbHRhMCA9IHNkZWx0YTEgKyBwYWlyX2NvdW50OworICAgIGRkZWx0YTEgPSBkZGVsdGEwICsgcGFpcl9jb3VudDsKKworICAgIHNyY19jblswXSA9IGRzdF9jblswXSA9IDA7CisKKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCAoayA9PSAwID8gc3JjX2NvdW50IDogZHN0X2NvdW50KTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopKGsgPT0gMCA/IHNyY1tpXSA6IGRzdFtpXSk7CisgICAgICAgICAgICBpbnQgY247CisKKyAgICAgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG1hdCkgKQorICAgICAgICAgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgICAgICAgICBpZiggZGVwdGggPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZXB0aCA9IENWX01BVF9ERVBUSChtYXQtPnR5cGUpOworICAgICAgICAgICAgICAgIGVsZW1fc2l6ZSA9IENWX0VMRU1fU0laRTEoZGVwdGgpOworICAgICAgICAgICAgICAgIHNpemUgPSBjdkdldE1hdFNpemUobWF0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIENWX01BVF9ERVBUSChtYXQtPnR5cGUpICE9IGRlcHRoICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIkFsbCB0aGUgYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBiaXQgZGVwdGgiICk7CisKKyAgICAgICAgICAgIGlmKCBtYXQtPmNvbHMgIT0gc2l6ZS53aWR0aCB8fCBtYXQtPnJvd3MgIT0gc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIkFsbCB0aGUgYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIiApOworCisgICAgICAgICAgICBpZiggayA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcmMwW2ldID0gbWF0LT5kYXRhLnB0cjsKKyAgICAgICAgICAgICAgICBjbiA9IENWX01BVF9DTihtYXQtPnR5cGUpOworICAgICAgICAgICAgICAgIHNyY19jbltpKzFdID0gc3JjX2NuW2ldICsgY247CisgICAgICAgICAgICAgICAgc3JjX3N0ZXBbaV0gPSBtYXQtPnN0ZXAgLyBlbGVtX3NpemUgLSBzaXplLndpZHRoICogY247CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0MFtpXSA9IG1hdC0+ZGF0YS5wdHI7CisgICAgICAgICAgICAgICAgY24gPSBDVl9NQVRfQ04obWF0LT50eXBlKTsKKyAgICAgICAgICAgICAgICBkc3RfY25baSsxXSA9IGRzdF9jbltpXSArIGNuOworICAgICAgICAgICAgICAgIGRzdF9zdGVwW2ldID0gbWF0LT5zdGVwIC8gZWxlbV9zaXplIC0gc2l6ZS53aWR0aCAqIGNuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250X2ZsYWcgJj0gbWF0LT50eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGNvbnRfZmxhZyApCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgZm9yKCBpID0gMDsgaSA8IHBhaXJfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNuID0gZnJvbV90b1tpKjIgKyBrXTsKKyAgICAgICAgICAgIGNvbnN0IGludCogY25fYXJyID0gayA9PSAwID8gc3JjX2NuIDogZHN0X2NuOworICAgICAgICAgICAgaW50IGEgPSAwLCBiID0gayA9PSAwID8gc3JjX2NvdW50LTEgOiBkc3RfY291bnQtMTsKKworICAgICAgICAgICAgaWYoIGNuIDwgMCB8fCBjbiA+PSBjbl9hcnJbYisxXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGsgPT0gMCAmJiBjbiA8IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3B0cltpXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIHNkZWx0YTBbaV0gPSBzZGVsdGExW2ldID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgZXJyX3N0clsxMDBdOworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBlcnJfc3RyLCAiY2hhbm5lbCBpbmRleCAjJWQgaW4gdGhlIGFycmF5IG9mIHBhaXJzIGlzIG5lZ2F0aXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvciBleGNlZWRzIHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgaW4gYWxsIHRoZSAlcyBhcnJheXMiLCBpKjIraywKKyAgICAgICAgICAgICAgICAgICAgICAgIGsgPT0gMCA/ICJpbnB1dCIgOiAib3V0cHV0IiApOworICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgZXJyX3N0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGNuID49IGNuX2FyclthKzFdOyBhKysgKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgaWYoIGsgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3B0cltpXSA9IHNyYzBbYV0gKyAoY24gLSBjbl9hcnJbYV0pKmVsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBzZGVsdGExW2ldID0gY25fYXJyW2ErMV0gLSBjbl9hcnJbYV07CisgICAgICAgICAgICAgICAgc2RlbHRhMFtpXSA9IHNyY19zdGVwW2FdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRwdHJbaV0gPSBkc3QwW2FdICsgKGNuIC0gY25fYXJyW2FdKSplbGVtX3NpemU7CisgICAgICAgICAgICAgICAgZGRlbHRhMVtpXSA9IGNuX2FyclthKzFdIC0gY25fYXJyW2FdOworICAgICAgICAgICAgICAgIGRkZWx0YTBbaV0gPSBkc3Rfc3RlcFthXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZ1bmMgPSAoQ3ZNaXhDaGFubmVsc0Z1bmMpbWl4Y25fdGFiLmZuXzJkW2RlcHRoXTsKKyAgICBpZiggIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgZGF0YSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGZ1bmN0aW9uIiApOworCisgICAgSVBQSV9DQUxMKCBmdW5jKCAoY29uc3Qgdm9pZCoqKXNwdHIsIHNkZWx0YTAsIHNkZWx0YTEsICh2b2lkKiopZHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGRkZWx0YTAsIGRkZWx0YTEsIHBhaXJfY291bnQsIHNpemUgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiBoZWFwX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkNvbnZlcnRTY2FsZUFicyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfQ1ZUX1NDQUxFX0FCU19DQVNFKCBzcmN0eXBlLCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzY2FsZV9tYWNybywgYWJzX21hY3JvLCBjYXN0X21hY3JvLCBhLCBiICkgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3Qgc3JjdHlwZSogX3NyYyA9IChjb25zdCBzcmN0eXBlKilzcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2YoX3NyY1swXSk7IC8qZHN0c3RlcCAvPSBzaXplb2YoX2RzdFswXSk7Ki8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IF9zcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IHNjYWxlX21hY3JvKChhKSpfc3JjW2ldICsgKGIpKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MSA9IHNjYWxlX21hY3JvKChhKSpfc3JjW2krMV0gKyAoYikpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9ICh3b3JrdHlwZSlhYnNfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh3b3JrdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsxXSA9IGNhc3RfbWFjcm8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IHNjYWxlX21hY3JvKChhKSpfc3JjW2krMl0gKyAoYikpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IHNjYWxlX21hY3JvKChhKSpfc3JjW2krM10gKyAoYikpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9ICh3b3JrdHlwZSlhYnNfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9ICh3b3JrdHlwZSlhYnNfbWFjcm8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsyXSA9IGNhc3RfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSszXSA9IGNhc3RfbWFjcm8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IHNjYWxlX21hY3JvKChhKSpfc3JjW2ldICsgKGIpKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9ICh3b3JrdHlwZSlhYnNfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfRklYX1NISUZUICAxNQorI2RlZmluZSBJQ1ZfU0NBTEUoeCkgICAoKCh4KSArICgxIDw8IChJQ1ZfRklYX1NISUZULTEpKSkgPj4gSUNWX0ZJWF9TSElGVCkKKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkN2dFNjYWxlQWJzVG9fOHVfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlIHNjYWxlLCBkb3VibGUgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtICkKK3sKKyAgICBpbnQgc3JjdHlwZSA9IHBhcmFtOworICAgIGludCBzcmNkZXB0aCA9IENWX01BVF9ERVBUSChzcmN0eXBlKTsKKworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKHNyY3R5cGUpOworCisgICAgc3dpdGNoKCBzcmNkZXB0aCApCisgICAgeworICAgIGNhc2UgIENWXzhTOgorICAgIGNhc2UgIENWXzhVOgorICAgICAgICB7CisgICAgICAgIHVjaGFyIGx1dFsyNTZdOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZG91YmxlIHZhbCA9IHNoaWZ0OworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCAxMjg7IGkrKywgdmFsICs9IHNjYWxlICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKGZhYnModmFsKSk7CisgICAgICAgICAgICBsdXRbaV0gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNyY2RlcHRoID09IENWXzhTICkKKyAgICAgICAgICAgIHZhbCA9IC12YWw7CisKKyAgICAgICAgZm9yKCA7IGkgPCAyNTY7IGkrKywgdmFsICs9IHNjYWxlICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKGZhYnModmFsKSk7CisgICAgICAgICAgICBsdXRbaV0gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICB9CisKKyAgICAgICAgaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0MxUiggc3JjLCBzcmNzdGVwLCBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0ZXAsIHNpemUsIGx1dCApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIENWXzE2VToKKyAgICAgICAgaWYoIGZhYnMoIHNjYWxlICkgPD0gMS4gJiYgZmFicyhzaGlmdCkgPCBEQkxfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpc2NhbGUgPSBjdlJvdW5kKHNjYWxlKigxIDw8IElDVl9GSVhfU0hJRlQpKTsKKworICAgICAgICAgICAgaWYoIGlzY2FsZSA9PSBJQ1ZfRklYX1NISUZUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9BQlNfQ0FTRSggdXNob3J0LCBpbnQsIENWX05PUCwgQ1ZfSUFCUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FTVF84VSwgMSwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0FCU19DQVNFKCB1c2hvcnQsIGludCwgSUNWX1NDQUxFLCBDVl9JQUJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQVNUXzhVLCBpc2NhbGUsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0FCU19DQVNFKCB1c2hvcnQsIGludCwgY3ZSb3VuZCwgQ1ZfSUFCUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQVNUXzhVLCBzY2FsZSwgc2hpZnQgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlICBDVl8xNlM6CisgICAgICAgIGlmKCBmYWJzKCBzY2FsZSApIDw9IDEuICYmCisgICAgICAgICAgICBmYWJzKCBzaGlmdCApIDw9IChJTlRfTUFYKjAuNSkvKDEgPDwgSUNWX0ZJWF9TSElGVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpc2NhbGUgPSBjdlJvdW5kKHNjYWxlKigxIDw8IElDVl9GSVhfU0hJRlQpKTsKKyAgICAgICAgICAgIGludCBpc2hpZnQgPSBjdlJvdW5kKHNoaWZ0KigxIDw8IElDVl9GSVhfU0hJRlQpKTsKKworICAgICAgICAgICAgaWYoIGlzY2FsZSA9PSBJQ1ZfRklYX1NISUZUICYmIGlzaGlmdCA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9BQlNfQ0FTRSggc2hvcnQsIGludCwgQ1ZfTk9QLCBDVl9JQUJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQVNUXzhVLCAxLCAwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUNWX0RFRl9DVlRfU0NBTEVfQUJTX0NBU0UoIHNob3J0LCBpbnQsIElDVl9TQ0FMRSwgQ1ZfSUFCUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FTVF84VSwgaXNjYWxlLCBpc2hpZnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0FCU19DQVNFKCBzaG9ydCwgaW50LCBjdlJvdW5kLCBDVl9JQUJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0NBU1RfOFUsIHNjYWxlLCBzaGlmdCApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIENWXzMyUzoKKyAgICAgICAgSUNWX0RFRl9DVlRfU0NBTEVfQUJTX0NBU0UoIGludCwgaW50LCBjdlJvdW5kLCBDVl9JQUJTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FTVF84VSwgc2NhbGUsIHNoaWZ0ICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgIENWXzMyRjoKKyAgICAgICAgSUNWX0RFRl9DVlRfU0NBTEVfQUJTX0NBU0UoIGZsb2F0LCBpbnQsIGN2Um91bmQsIENWX0lBQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQVNUXzhVLCBzY2FsZSwgc2hpZnQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAgQ1ZfNjRGOgorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9BQlNfQ0FTRSggZG91YmxlLCBpbnQsIGN2Um91bmQsIENWX0lBQlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9DQVNUXzhVLCBzY2FsZSwgc2hpZnQgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7CisgICAgfQorCisgICAgcmV0dXJuICBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q29udmVydFNjYWxlQWJzKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUsIGRvdWJsZSBzaGlmdCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNvbnZlcnRTY2FsZUFicyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgQ3ZNYXQgIHNyY3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCAgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzaXplOworICAgIGludCBzcmNfc3RlcCwgZHN0X3N0ZXA7CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaTEgKSk7CisgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX0NOU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKCBkc3QtPnR5cGUgKSAhPSBDVl84VSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIHNyY19zdGVwID0gc3JjLT5zdGVwOworICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNyY19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBJUFBJX0NBTEwoIGljdkN2dFNjYWxlQWJzVG9fOHVfQzFSKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKikoZHN0LT5kYXRhLnB0ciksIGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBzY2FsZSwgc2hpZnQsIENWX01BVF9UWVBFKHNyYy0+dHlwZSkpKTsKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Q29udmVydFNjYWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9DVlRfU0NBTEVfQ0FTRSggc3JjdHlwZSwgd29ya3R5cGUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsZV9tYWNybywgY2FzdF9tYWNybywgYSwgYiApIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBzcmN0eXBlKiBfc3JjID0gKGNvbnN0IHNyY3R5cGUqKXNyYzsgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihfc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgX3NyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gc2NhbGVfbWFjcm8oKGEpKl9zcmNbaV0rKGIpKTsgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQxID0gc2NhbGVfbWFjcm8oKGEpKl9zcmNbaSsxXSsoYikpOyAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gY2FzdF9tYWNybyh0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc2NhbGVfbWFjcm8oKGEpKl9zcmNbaSsyXSArIChiKSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gc2NhbGVfbWFjcm8oKGEpKl9zcmNbaSszXSArIChiKSk7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gY2FzdF9tYWNybyh0MCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzNdID0gY2FzdF9tYWNybyh0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gc2NhbGVfbWFjcm8oKGEpKl9zcmNbaV0gKyAoYikpOyAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8odDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX0NWVF9TQ0FMRV9GVU5DX0lOVCggZmxhdm9yLCBkc3R0eXBlLCBjYXN0X21hY3JvICkgICAgICBcCitzdGF0aWMgIEN2U3RhdHVzICBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZDdnRTY2FsZVRvXyMjZmxhdm9yIyNfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2NhbGUsIGRvdWJsZSBzaGlmdCwgaW50IHBhcmFtICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIHNyY3R5cGUgPSBwYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0dHlwZSBsdXRbMjU2XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoKCBDVl9NQVRfREVQVEgoc3JjdHlwZSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfOFU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBzaXplLndpZHRoKnNpemUuaGVpZ2h0ID49IDI1NiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgdmFsID0gc2hpZnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKyssIHZhbCArPSBzY2FsZSApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbHV0W2ldID0gY2FzdF9tYWNybyh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpY3ZMVVRfVHJhbnNmb3JtOHVfIyNmbGF2b3IjI19DMVIoIHNyYywgc3Jjc3RlcCwgZHN0LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0ZXAqc2l6ZW9mKGRzdFswXSksIHNpemUsIGx1dCApOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIGZhYnMoIHNjYWxlICkgPD0gMTI4LiAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGZhYnMoIHNoaWZ0ICkgPD0gKElOVF9NQVgqMC41KS8oMSA8PCBJQ1ZfRklYX1NISUZUKSkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNjYWxlID0gY3ZSb3VuZChzY2FsZSooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNoaWZ0ID0gY3ZSb3VuZChzaGlmdCooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCB1Y2hhciwgaW50LCBJQ1ZfU0NBTEUsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBpc2NhbGUsIGlzaGlmdCApOyAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCB1Y2hhciwgaW50LCBjdlJvdW5kLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfOFM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBzaXplLndpZHRoKnNpemUuaGVpZ2h0ID49IDI1NiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgMjU2OyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHQgPSBjdlJvdW5kKCAoc2NoYXIpaSpzY2FsZSArIHNoaWZ0ICk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbHV0W2ldID0gY2FzdF9tYWNybyh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpY3ZMVVRfVHJhbnNmb3JtOHVfIyNmbGF2b3IjI19DMVIoIHNyYywgc3Jjc3RlcCwgZHN0LCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0ZXAqc2l6ZW9mKGRzdFswXSksIHNpemUsIGx1dCApOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIGZhYnMoIHNjYWxlICkgPD0gMTI4LiAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgIGZhYnMoIHNoaWZ0ICkgPD0gKElOVF9NQVgqMC41KS8oMSA8PCBJQ1ZfRklYX1NISUZUKSkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNjYWxlID0gY3ZSb3VuZChzY2FsZSooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNoaWZ0ID0gY3ZSb3VuZChzaGlmdCooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBzY2hhciwgaW50LCBJQ1ZfU0NBTEUsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBpc2NhbGUsIGlzaGlmdCApOyAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBzY2hhciwgaW50LCBjdlJvdW5kLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfMTZVOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmYWJzKCBzY2FsZSApIDw9IDEuICYmIGZhYnMoc2hpZnQpIDwgREJMX0VQU0lMT04gKSAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNjYWxlID0gY3ZSb3VuZChzY2FsZSooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCB1c2hvcnQsIGludCwgSUNWX1NDQUxFLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBpc2NhbGUsIDAgKTsgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCB1c2hvcnQsIGludCwgY3ZSb3VuZCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfMTZTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmYWJzKCBzY2FsZSApIDw9IDEuICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmYWJzKCBzaGlmdCApIDw9IChJTlRfTUFYKjAuNSkvKDEgPDwgSUNWX0ZJWF9TSElGVCkpICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNjYWxlID0gY3ZSb3VuZChzY2FsZSooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgaXNoaWZ0ID0gY3ZSb3VuZChzaGlmdCooMSA8PCBJQ1ZfRklYX1NISUZUKSk7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBzaG9ydCwgaW50LCBJQ1ZfU0NBTEUsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBpc2NhbGUsIGlzaGlmdCApOyAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBzaG9ydCwgaW50LCBjdlJvdW5kLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfMzJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0NBU0UoIGludCwgaW50LCBjdlJvdW5kLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8sIHNjYWxlLCBzaGlmdCApOyAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfMzJGOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0NBU0UoIGZsb2F0LCBpbnQsIGN2Um91bmQsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8sIHNjYWxlLCBzaGlmdCApOyAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSAgQ1ZfNjRGOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX1NDQUxFX0NBU0UoIGRvdWJsZSwgaW50LCBjdlJvdW5kLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8sIHNjYWxlLCBzaGlmdCApOyAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFzc2VydCgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBDVl9CQURGTEFHX0VSUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9DVlRfU0NBTEVfRlVOQ19GTFQoIGZsYXZvciwgZHN0dHlwZSwgY2FzdF9tYWNybyApICAgICAgXAorc3RhdGljICBDdlN0YXR1cyAgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2Q3Z0U2NhbGVUb18jI2ZsYXZvciMjX0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlLCBkb3VibGUgc2hpZnQsIGludCBwYXJhbSApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBzcmN0eXBlID0gcGFyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHR5cGUgbHV0WzI1Nl07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN3aXRjaCggQ1ZfTUFUX0RFUFRIKHNyY3R5cGUpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzhVOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggc2l6ZS53aWR0aCpzaXplLmhlaWdodCA+PSAyNTYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHZhbCA9IHNoaWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrLCB2YWwgKz0gc2NhbGUgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGx1dFtpXSA9IChkc3R0eXBlKXZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWN2TFVUX1RyYW5zZm9ybTh1XyMjZmxhdm9yIyNfQzFSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdGVwKnNpemVvZihkc3RbMF0pLCBzaXplLCBsdXQgKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX0RFRl9DVlRfU0NBTEVfQ0FTRSggdWNoYXIsIGRvdWJsZSwgQ1ZfTk9QLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybywgc2NhbGUsIHNoaWZ0ICk7ICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzhTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggc2l6ZS53aWR0aCpzaXplLmhlaWdodCA+PSAyNTYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGx1dFtpXSA9IChkc3R0eXBlKSgoc2NoYXIpaSpzY2FsZSArIHNoaWZ0KTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWN2TFVUX1RyYW5zZm9ybTh1XyMjZmxhdm9yIyNfQzFSKCBzcmMsIHNyY3N0ZXAsIGRzdCwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdGVwKnNpemVvZihkc3RbMF0pLCBzaXplLCBsdXQgKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX0RFRl9DVlRfU0NBTEVfQ0FTRSggc2NoYXIsIGRvdWJsZSwgQ1ZfTk9QLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybywgc2NhbGUsIHNoaWZ0ICk7ICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzE2VTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCB1c2hvcnQsIGRvdWJsZSwgQ1ZfTk9QLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzE2UzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBzaG9ydCwgZG91YmxlLCBDVl9OT1AsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzMyUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBpbnQsIGRvdWJsZSwgQ1ZfTk9QLCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzMyRjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBmbG9hdCwgZG91YmxlLCBDVl9OT1AsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgIENWXzY0RjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NWVF9TQ0FMRV9DQVNFKCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0X21hY3JvLCBzY2FsZSwgc2hpZnQgKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gQ1ZfQkFERkxBR19FUlI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAgQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfQ1ZUX1NDQUxFX0ZVTkNfSU5UKCA4dSwgdWNoYXIsIENWX0NBU1RfOFUgKQorSUNWX0RFRl9DVlRfU0NBTEVfRlVOQ19JTlQoIDhzLCBzY2hhciwgQ1ZfQ0FTVF84UyApCitJQ1ZfREVGX0NWVF9TQ0FMRV9GVU5DX0lOVCggMTZzLCBzaG9ydCwgQ1ZfQ0FTVF8xNlMgKQorSUNWX0RFRl9DVlRfU0NBTEVfRlVOQ19JTlQoIDE2dSwgdXNob3J0LCBDVl9DQVNUXzE2VSApCitJQ1ZfREVGX0NWVF9TQ0FMRV9GVU5DX0lOVCggMzJzLCBpbnQsIENWX0NBU1RfMzJTICkKKworSUNWX0RFRl9DVlRfU0NBTEVfRlVOQ19GTFQoIDMyZiwgZmxvYXQsIENWX0NBU1RfMzJGICkKK0lDVl9ERUZfQ1ZUX1NDQUxFX0ZVTkNfRkxUKCA2NGYsIGRvdWJsZSwgQ1ZfQ0FTVF82NEYgKQorCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggQ3Z0U2NhbGVUbywgQzFSICkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNpb24gdy9vIHNjYWxpbmcgbWFjcm9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9DVlRfQ0FTRV8yRCggc3JjdHlwZSwgd29ya3R5cGUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdF9tYWNybzEsIGNhc3RfbWFjcm8yICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBzcmN0eXBlKiBfc3JjID0gKGNvbnN0IHNyY3R5cGUqKXNyYzsgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihfc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgX3NyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gY2FzdF9tYWNybzEoX3NyY1tpXSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQxID0gY2FzdF9tYWNybzEoX3NyY1tpKzFdKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8yKHQwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gY2FzdF9tYWNybzIodDEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gY2FzdF9tYWNybzEoX3NyY1tpKzJdKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gY2FzdF9tYWNybzEoX3NyY1tpKzNdKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gY2FzdF9tYWNybzIodDApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzNdID0gY2FzdF9tYWNybzIodDEpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gY2FzdF9tYWNybzEoX3NyY1tpXSk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IGNhc3RfbWFjcm8yKHQwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfQ1ZUX0ZVTkNfMkQoIGZsYXZvciwgZHN0dHlwZSwgd29ya3R5cGUsIGNhc3RfbWFjcm8yLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoMSwgc3JjdHlwZTEsIGNhc3RfbWFjcm8xMSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoMiwgc3JjdHlwZTIsIGNhc3RfbWFjcm8xMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoMywgc3JjdHlwZTMsIGNhc3RfbWFjcm8xMywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoNCwgc3JjdHlwZTQsIGNhc3RfbWFjcm8xNCwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoNSwgc3JjdHlwZTUsIGNhc3RfbWFjcm8xNSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2RlcHRoNiwgc3JjdHlwZTYsIGNhc3RfbWFjcm8xNiApICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZDdnRUb18jI2ZsYXZvciMjX0MxUiggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBwYXJhbSApICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNyY3R5cGUgPSBwYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3dpdGNoKCBDVl9NQVRfREVQVEgoc3JjdHlwZSkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDE6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGUxLCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xMSwgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGUyLCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xMiwgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGUzLCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xMywgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGU0LCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xNCwgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGU1LCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xNSwgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2FzZSBzcmNkZXB0aDY6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfQ1ZUX0NBU0VfMkQoIHNyY3R5cGU2LCB3b3JrdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3RfbWFjcm8xNiwgY2FzdF9tYWNybzIgKTsgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9DVlRfRlVOQ18yRCggOHUsIHVjaGFyLCBpbnQsIENWX0NBU1RfOFUsCisgICAgICAgICAgICAgICAgICAgICBDVl84UywgIHNjaGFyLCAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZVLCB1c2hvcnQsIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzE2Uywgc2hvcnQsICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8zMlMsIGludCwgICAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMzJGLCBmbG9hdCwgIGN2Um91bmQsCisgICAgICAgICAgICAgICAgICAgICBDVl82NEYsIGRvdWJsZSwgY3ZSb3VuZCApCisKK0lDVl9ERUZfQ1ZUX0ZVTkNfMkQoIDhzLCBzY2hhciwgaW50LCBDVl9DQVNUXzhTLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfOFUsICB1Y2hhciwgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzE2VSwgdXNob3J0LCBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8xNlMsIHNob3J0LCAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMzJTLCBpbnQsICAgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyRiwgZmxvYXQsICBjdlJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfNjRGLCBkb3VibGUsIGN2Um91bmQgKQorCitJQ1ZfREVGX0NWVF9GVU5DXzJEKCAxNnUsIHVzaG9ydCwgaW50LCBDVl9DQVNUXzE2VSwKKyAgICAgICAgICAgICAgICAgICAgIENWXzhVLCAgdWNoYXIsICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl84UywgIHNjaGFyLCAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZTLCBzaG9ydCwgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyUywgaW50LCAgICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8zMkYsIGZsb2F0LCAgY3ZSb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzY0RiwgZG91YmxlLCBjdlJvdW5kICkKKworSUNWX0RFRl9DVlRfRlVOQ18yRCggMTZzLCBzaG9ydCwgaW50LCBDVl9DQVNUXzE2UywKKyAgICAgICAgICAgICAgICAgICAgIENWXzhVLCAgdWNoYXIsICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl84UywgIHNjaGFyLCAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZVLCB1c2hvcnQsIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyUywgaW50LCAgICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8zMkYsIGZsb2F0LCAgY3ZSb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzY0RiwgZG91YmxlLCBjdlJvdW5kICkKKworSUNWX0RFRl9DVlRfRlVOQ18yRCggMzJzLCBpbnQsIGludCwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfOFUsICB1Y2hhciwgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzhTLCAgc2NoYXIsICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8xNlUsIHVzaG9ydCwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZTLCBzaG9ydCwgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyRiwgZmxvYXQsICBjdlJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfNjRGLCBkb3VibGUsIGN2Um91bmQgKQorCitJQ1ZfREVGX0NWVF9GVU5DXzJEKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfOFUsICB1Y2hhciwgIENWXzhUTzMyRiwKKyAgICAgICAgICAgICAgICAgICAgIENWXzhTLCAgc2NoYXIsICBDVl84VE8zMkYsCisgICAgICAgICAgICAgICAgICAgICBDVl8xNlUsIHVzaG9ydCwgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZTLCBzaG9ydCwgIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzMyUywgaW50LCAgICBDVl9DQVNUXzMyRiwKKyAgICAgICAgICAgICAgICAgICAgIENWXzY0RiwgZG91YmxlLCBDVl9DQVNUXzMyRiApCisKK0lDVl9ERUZfQ1ZUX0ZVTkNfMkQoIDY0ZiwgZG91YmxlLCBkb3VibGUsIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzhVLCAgdWNoYXIsICBDVl84VE8zMkYsCisgICAgICAgICAgICAgICAgICAgICBDVl84UywgIHNjaGFyLCAgQ1ZfOFRPMzJGLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMTZVLCB1c2hvcnQsIENWX05PUCwKKyAgICAgICAgICAgICAgICAgICAgIENWXzE2Uywgc2hvcnQsICBDVl9OT1AsCisgICAgICAgICAgICAgICAgICAgICBDVl8zMlMsIGludCwgICAgQ1ZfTk9QLAorICAgICAgICAgICAgICAgICAgICAgQ1ZfMzJGLCBmbG9hdCwgIENWX05PUCApCisKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBDdnRUbywgQzFSICkKKworCit0eXBlZGVmICBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZDdnRGdW5jKSggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW0gKTsKKwordHlwZWRlZiAgQ3ZTdGF0dXMgKENWX1NURENBTEwgKkN2Q3Z0U2NhbGVGdW5jKSggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlLCBkb3VibGUgc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFyYW0gKTsKKworQ1ZfSU1QTCB2b2lkCitjdkNvbnZlcnRTY2FsZSggY29uc3Qgdm9pZCogc3JjYXJyLCB2b2lkKiBkc3RhcnIsCisgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlLCBkb3VibGUgc2hpZnQgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBjdnRfdGFiLCBjdnRzY2FsZV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb252ZXJ0U2NhbGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZTsKKyAgICBpbnQgaXNfbmQgPSAwOworICAgIEN2TWF0ICBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgIGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgc3JjX3N0ZXAsIGRzdF9zdGVwOworICAgIGludCBub19zY2FsZSA9IHNjYWxlID09IDEgJiYgc2hpZnQgPT0gMDsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYykgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKHNyYykgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kgKSk7CisKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKGRzdCkgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBpc19uZCApCisgICAgeworICAgICAgICBDdkFyciogYXJyc1tdID0geyBzcmMsIGRzdCB9OworICAgICAgICBDdk1hdE5EIHN0dWJzWzJdOworICAgICAgICBDdk5BcnJheUl0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICBpbnQgZHN0dHlwZTsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMiwgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciwgQ1ZfTk9fREVQVEhfQ0hFQ0sgKSk7CisKKyAgICAgICAgdHlwZSA9IGl0ZXJhdG9yLmhkclswXS0+dHlwZTsKKyAgICAgICAgZHN0dHlwZSA9IGl0ZXJhdG9yLmhkclsxXS0+dHlwZTsKKyAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04odHlwZSk7CisKKyAgICAgICAgaWYoICFpbml0dGFiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2SW5pdEN2dFRvQzFSVGFibGUoICZjdnRfdGFiICk7CisgICAgICAgICAgICBpY3ZJbml0Q3Z0U2NhbGVUb0MxUlRhYmxlKCAmY3Z0c2NhbGVfdGFiICk7CisgICAgICAgICAgICBpbml0dGFiID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBub19zY2FsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q3Z0RnVuYyBmdW5jID0gKEN2Q3Z0RnVuYykoY3Z0X3RhYi5mbl8yZFtDVl9NQVRfREVQVEgoZHN0dHlwZSldKTsKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIHR5cGUgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q3Z0U2NhbGVGdW5jIGZ1bmMgPQorICAgICAgICAgICAgICAgIChDdkN2dFNjYWxlRnVuYykoY3Z0c2NhbGVfdGFiLmZuXzJkW0NWX01BVF9ERVBUSChkc3R0eXBlKV0pOworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgc2NhbGUsIHNoaWZ0LCB0eXBlICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgIH0KKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggbm9fc2NhbGUgJiYgQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApICkKKyAgICB7CisgICAgICAgIGlmKCBzcmMgIT0gZHN0ICkKKyAgICAgICAgICBjdkNvcHkoIHNyYywgZHN0ICk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShzcmMtPnR5cGUpOworICAgIHNyY19zdGVwID0gc3JjLT5zdGVwOworICAgIGRzdF9zdGVwID0gZHN0LT5zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNyY19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBzaXplLndpZHRoICo9IENWX01BVF9DTiggdHlwZSApOworCisgICAgaWYoIENWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSAmJiBzaXplLmhlaWdodCA9PSAxICYmCisgICAgICAgIHNpemUud2lkdGggPD0gQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSApCisgICAgeworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmNkYXRhID0gKGNvbnN0IGZsb2F0Kikoc3JjLT5kYXRhLnB0cik7CisgICAgICAgICAgICBmbG9hdCogZHN0ZGF0YSA9IChmbG9hdCopKGRzdC0+ZGF0YS5wdHIpOworCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdGRhdGFbc2l6ZS53aWR0aCAtIDFdID0gKGZsb2F0KShzcmNkYXRhW3NpemUud2lkdGgtMV0qc2NhbGUgKyBzaGlmdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzY0RiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjZGF0YSA9IChjb25zdCBkb3VibGUqKShzcmMtPmRhdGEucHRyKTsKKyAgICAgICAgICAgIGRvdWJsZSogZHN0ZGF0YSA9IChkb3VibGUqKShkc3QtPmRhdGEucHRyKTsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3RkYXRhW3NpemUud2lkdGggLSAxXSA9IHNyY2RhdGFbc2l6ZS53aWR0aC0xXSpzY2FsZSArIHNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIC0tc2l6ZS53aWR0aCApOworCisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRDdnRUb0MxUlRhYmxlKCAmY3Z0X3RhYiApOworICAgICAgICBpY3ZJbml0Q3Z0U2NhbGVUb0MxUlRhYmxlKCAmY3Z0c2NhbGVfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX0NOU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggbm9fc2NhbGUgKQorICAgIHsKKyAgICAgICAgQ3ZDdnRGdW5jIGZ1bmMgPSAoQ3ZDdnRGdW5jKShjdnRfdGFiLmZuXzJkW0NWX01BVF9ERVBUSChkc3QtPnR5cGUpXSk7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdF9zdGVwLCBzaXplLCB0eXBlICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkN2dFNjYWxlRnVuYyBmdW5jID0gKEN2Q3Z0U2NhbGVGdW5jKQorICAgICAgICAgICAgKGN2dHNjYWxlX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgoZHN0LT50eXBlKV0pOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICBzY2FsZSwgc2hpZnQsIHR5cGUgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKiBoZWxwZXIgZnVuY3Rpb25zIGZvciBjb252ZXJ0aW5nIDMyZjwtPjY0ZiAqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkN2dF8zMmY2NGYsCisgICAgKCBjb25zdCBmbG9hdCogc3JjLCBkb3VibGUqIGRzdCwgaW50IGxlbiApLCAoc3JjLCBkc3QsIGxlbikgKQoreworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPD0gbGVuIC0gNDsgaSArPSA0ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0MCA9IHNyY1tpXTsKKyAgICAgICAgZG91YmxlIHQxID0gc3JjW2krMV07CisKKyAgICAgICAgZHN0W2ldID0gdDA7CisgICAgICAgIGRzdFtpKzFdID0gdDE7CisKKyAgICAgICAgdDAgPSBzcmNbaSsyXTsKKyAgICAgICAgdDEgPSBzcmNbaSszXTsKKworICAgICAgICBkc3RbaSsyXSA9IHQwOworICAgICAgICBkc3RbaSszXSA9IHQxOworICAgIH0KKworICAgIGZvciggOyBpIDwgbGVuOyBpKysgKQorICAgICAgICBkc3RbaV0gPSBzcmNbaV07CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2Q3Z0XzY0ZjMyZiwKKyAgICAoIGNvbnN0IGRvdWJsZSogc3JjLCBmbG9hdCogZHN0LCBpbnQgbGVuICksIChzcmMsIGRzdCwgbGVuKSApCit7CisgICAgaW50IGkgPSAwOworICAgIGZvciggOyBpIDw9IGxlbiAtIDQ7IGkgKz0gNCApCisgICAgeworICAgICAgICBkb3VibGUgdDAgPSBzcmNbaV07CisgICAgICAgIGRvdWJsZSB0MSA9IHNyY1tpKzFdOworCisgICAgICAgIGRzdFtpXSA9IChmbG9hdCl0MDsKKyAgICAgICAgZHN0W2krMV0gPSAoZmxvYXQpdDE7CisKKyAgICAgICAgdDAgPSBzcmNbaSsyXTsKKyAgICAgICAgdDEgPSBzcmNbaSszXTsKKworICAgICAgICBkc3RbaSsyXSA9IChmbG9hdCl0MDsKKyAgICAgICAgZHN0W2krM10gPSAoZmxvYXQpdDE7CisgICAgfQorCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IChmbG9hdClzcmNbaV07CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZTY2FsZV8zMmYoIGNvbnN0IGZsb2F0KiBzcmMsIGZsb2F0KiBkc3QsIGludCBsZW4sIGZsb2F0IGEsIGZsb2F0IGIgKQoreworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPD0gbGVuIC0gNDsgaSArPSA0ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0MCA9IHNyY1tpXSphICsgYjsKKyAgICAgICAgZG91YmxlIHQxID0gc3JjW2krMV0qYSArIGI7CisKKyAgICAgICAgZHN0W2ldID0gKGZsb2F0KXQwOworICAgICAgICBkc3RbaSsxXSA9IChmbG9hdCl0MTsKKworICAgICAgICB0MCA9IHNyY1tpKzJdKmEgKyBiOworICAgICAgICB0MSA9IHNyY1tpKzNdKmEgKyBiOworCisgICAgICAgIGRzdFtpKzJdID0gKGZsb2F0KXQwOworICAgICAgICBkc3RbaSszXSA9IChmbG9hdCl0MTsKKyAgICB9CisKKyAgICBmb3IoIDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gKGZsb2F0KShzcmNbaV0qYSArIGIpOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0N2U3RhdHVzIENWX1NURENBTEwgaWN2U2NhbGVfNjRmKCBjb25zdCBkb3VibGUqIHNyYywgZG91YmxlKiBkc3QsIGludCBsZW4sIGRvdWJsZSBhLCBkb3VibGUgYiApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8PSBsZW4gLSA0OyBpICs9IDQgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHQwID0gc3JjW2ldKmEgKyBiOworICAgICAgICBkb3VibGUgdDEgPSBzcmNbaSsxXSphICsgYjsKKworICAgICAgICBkc3RbaV0gPSB0MDsKKyAgICAgICAgZHN0W2krMV0gPSB0MTsKKworICAgICAgICB0MCA9IHNyY1tpKzJdKmEgKyBiOworICAgICAgICB0MSA9IHNyY1tpKzNdKmEgKyBiOworCisgICAgICAgIGRzdFtpKzJdID0gdDA7CisgICAgICAgIGRzdFtpKzNdID0gdDE7CisgICAgfQorCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IHNyY1tpXSphICsgYjsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4Y29weS5jcHAgYi9jeGNvcmUvc3JjL2N4Y29weS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI3NDA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hjb3B5LmNwcApAQCAtMCwwICsxLDEwNDIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBDdk1hdCBiYXNpYyBvcGVyYXRpb25zOiBjdkNvcHksIGN2U2V0CisvLworLy8gKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBML0wgQ09QWSAmIFNFVCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2Q29weV84dV9DMVIsICggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSkgKQoreworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKQorICAgICAgICBtZW1jcHkoIGRzdCwgc3JjLCBzaXplLndpZHRoICk7CisKKyAgICByZXR1cm4gIENWX09LOworfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZTZXRfOHVfQzFSKCB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2NhbGFyLCBpbnQgcGl4X3NpemUgKQoreworICAgIGludCBjb3B5X2xlbiA9IDEyKnBpeF9zaXplOworICAgIHVjaGFyKiBkc3RfbGltaXQgPSBkc3QgKyBzaXplLndpZHRoOworICAgIAorICAgIGlmKCBzaXplLmhlaWdodC0tICkKKyAgICB7CisgICAgICAgIHdoaWxlKCBkc3QgKyBjb3B5X2xlbiA8PSBkc3RfbGltaXQgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1jcHkoIGRzdCwgc2NhbGFyLCBjb3B5X2xlbiApOworICAgICAgICAgICAgZHN0ICs9IGNvcHlfbGVuOworICAgICAgICB9CisKKyAgICAgICAgbWVtY3B5KCBkc3QsIHNjYWxhciwgZHN0X2xpbWl0IC0gZHN0ICk7CisgICAgfQorCisgICAgaWYoIHNpemUuaGVpZ2h0ICkKKyAgICB7CisgICAgICAgIGRzdCA9IGRzdF9saW1pdCAtIHNpemUud2lkdGggKyBkc3Rfc3RlcDsKKworICAgICAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgICAgIG1lbWNweSggZHN0LCBkc3QgLSBkc3Rfc3RlcCwgc2l6ZS53aWR0aCApOworICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBML0wgQ09QWSBXSVRIIE1BU0sgRlVOQ1RJT05TICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCisjZGVmaW5lIElDVl9ERUZfQ09QWV9NQVNLX0MxX0NBU0UoIHR5cGUgKSAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGgtMjsgaSArPSAyICkgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW2ldICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY1tpXTsgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1tpKzFdICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSsxXSA9IHNyY1tpKzFdOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1tpXSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaV07ICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX0RFRl9DT1BZX01BU0tfQzNfQ0FTRSggdHlwZSApICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW2ldICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZSB0MCA9IHNyY1tpKjNdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB0eXBlIHQxID0gc3JjW2kqMysxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHR5cGUgdDIgPSBzcmNbaSozKzJdOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSozXSA9IHQwOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjMrMV0gPSB0MTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kqMysyXSA9IHQyOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworCisKKyNkZWZpbmUgSUNWX0RFRl9DT1BZX01BU0tfQzRfQ0FTRSggdHlwZSApICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW2ldICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHlwZSB0MCA9IHNyY1tpKjRdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB0eXBlIHQxID0gc3JjW2kqNCsxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjRdID0gdDA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kqNCsxXSA9IHQxOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3JjW2kqNCsyXTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBzcmNbaSo0KzNdOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSo0KzJdID0gdDA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjQrM10gPSB0MTsgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKworI2RlZmluZSBJQ1ZfREVGX0NPUFlfTUFTS18yRCggbmFtZSwgdHlwZSwgY24gKSAgICAgICAgICAgICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSwoIGNvbnN0IHR5cGUqIHNyYywgaW50IHNyY3N0ZXAsIHR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsXAorICAgICAgIEN2U2l6ZSBzaXplLCBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwICksICAgICAgXAorICAgICAgIChzcmMsIHNyY3N0ZXAsIGRzdCwgZHN0c3RlcCwgc2l6ZSwgbWFzaywgbWFza3N0ZXApKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7IGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0ICs9IGRzdHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0NPUFlfTUFTS19DIyNjbiMjX0NBU0UoIHR5cGUgKSAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAgQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9TRVRfTUFTS19DMV9DQVNFKCB0eXBlICkgICAgXAorICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aC0yOyBpICs9IDIgKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbaV0gKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2ldID0gczA7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW2krMV0gKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKzFdID0gczA7ICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW2ldICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9IHMwOyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9ERUZfU0VUX01BU0tfQzNfQ0FTRSggdHlwZSApICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkgICAgICAgXAorICAgICAgICBpZiggbWFza1tpXSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjNdID0gczA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kqMysxXSA9IHMxOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSozKzJdID0gczI7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjZGVmaW5lIElDVl9ERUZfU0VUX01BU0tfQzRfQ0FTRSggdHlwZSApICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkgICAgICAgXAorICAgICAgICBpZiggbWFza1tpXSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjRdID0gczA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2kqNCsxXSA9IHMxOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaSo0KzJdID0gczI7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpKjQrM10gPSBzMzsgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyNkZWZpbmUgSUNWX0RFRl9TRVRfTUFTS18yRCggbmFtZSwgdHlwZSwgY24gKSAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorbmFtZSwoIHR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCAgICAgICAgICAgICBcCisgICAgICAgQ3ZTaXplIHNpemUsIGNvbnN0IHR5cGUqIHNjYWxhciApLCAgICAgICAgICAgXAorICAgICAgIChkc3QsIGRzdHN0ZXAsIG1hc2ssIG1hc2tzdGVwLCBzaXplLCBzY2FsYXIpKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfVU5fRU5UUllfQyMjY24oIHR5cGUgKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IG1hc2sgKz0gbWFza3N0ZXAsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX1NFVF9NQVNLX0MjI2NuIyNfQ0FTRSggdHlwZSApICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX1NFVF9NQVNLXzJEKCBpY3ZTZXRfOHVfQzFNUiwgdWNoYXIsIDEgKQorSUNWX0RFRl9TRVRfTUFTS18yRCggaWN2U2V0XzE2c19DMU1SLCB1c2hvcnQsIDEgKQorSUNWX0RFRl9TRVRfTUFTS18yRCggaWN2U2V0Xzh1X0MzTVIsIHVjaGFyLCAzICkKK0lDVl9ERUZfU0VUX01BU0tfMkQoIGljdlNldF84dV9DNE1SLCBpbnQsIDEgKQorSUNWX0RFRl9TRVRfTUFTS18yRCggaWN2U2V0XzE2c19DM01SLCB1c2hvcnQsIDMgKQorSUNWX0RFRl9TRVRfTUFTS18yRCggaWN2U2V0XzE2c19DNE1SLCBpbnQ2NCwgMSApCitJQ1ZfREVGX1NFVF9NQVNLXzJEKCBpY3ZTZXRfMzJmX0MzTVIsIGludCwgMyApCitJQ1ZfREVGX1NFVF9NQVNLXzJEKCBpY3ZTZXRfMzJmX0M0TVIsIGludCwgNCApCitJQ1ZfREVGX1NFVF9NQVNLXzJEKCBpY3ZTZXRfNjRzX0MzTVIsIGludDY0LCAzICkKK0lDVl9ERUZfU0VUX01BU0tfMkQoIGljdlNldF82NHNfQzRNUiwgaW50NjQsIDQgKQorCitJQ1ZfREVGX0NPUFlfTUFTS18yRCggaWN2Q29weV84dV9DMU1SLCB1Y2hhciwgMSApCitJQ1ZfREVGX0NPUFlfTUFTS18yRCggaWN2Q29weV8xNnNfQzFNUiwgdXNob3J0LCAxICkKK0lDVl9ERUZfQ09QWV9NQVNLXzJEKCBpY3ZDb3B5Xzh1X0MzTVIsIHVjaGFyLCAzICkKK0lDVl9ERUZfQ09QWV9NQVNLXzJEKCBpY3ZDb3B5Xzh1X0M0TVIsIGludCwgMSApCitJQ1ZfREVGX0NPUFlfTUFTS18yRCggaWN2Q29weV8xNnNfQzNNUiwgdXNob3J0LCAzICkKK0lDVl9ERUZfQ09QWV9NQVNLXzJEKCBpY3ZDb3B5XzE2c19DNE1SLCBpbnQ2NCwgMSApCitJQ1ZfREVGX0NPUFlfTUFTS18yRCggaWN2Q29weV8zMmZfQzNNUiwgaW50LCAzICkKK0lDVl9ERUZfQ09QWV9NQVNLXzJEKCBpY3ZDb3B5XzMyZl9DNE1SLCBpbnQsIDQgKQorSUNWX0RFRl9DT1BZX01BU0tfMkQoIGljdkNvcHlfNjRzX0MzTVIsIGludDY0LCAzICkKK0lDVl9ERUZfQ09QWV9NQVNLXzJEKCBpY3ZDb3B5XzY0c19DNE1SLCBpbnQ2NCwgNCApCisKKyNkZWZpbmUgQ1ZfREVGX0lOSVRfQ09QWVNFVF9UQUJfMkQoIEZVTkNOQU1FLCBGTEFHICkgICAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgaWN2SW5pdCMjRlVOQ05BTUUjI0ZMQUcjI1RhYmxlKCBDdkJ0RnVuY1RhYmxlKiB0YWJsZSApICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbMV0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV9DMSMjRkxBRzsgICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFsyXSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2c19DMSMjRkxBRzsgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzNdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfOHVfQzMjI0ZMQUc7ICAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbNF0gID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI184dV9DNCMjRkxBRzsgICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFs2XSAgPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2c19DMyMjRkxBRzsgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzhdICA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMTZzX0M0IyNGTEFHOyAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbMTJdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18zMmZfQzMjI0ZMQUc7ICAgICAgICAgXAorICAgIHRhYmxlLT5mbl8yZFsxNl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl9DNCMjRkxBRzsgICAgICAgICBcCisgICAgdGFibGUtPmZuXzJkWzI0XSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfNjRzX0MzIyNGTEFHOyAgICAgICAgIFwKKyAgICB0YWJsZS0+Zm5fMmRbMzJdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NHNfQzQjI0ZMQUc7ICAgICAgICAgXAorfQorCitDVl9ERUZfSU5JVF9DT1BZU0VUX1RBQl8yRCggU2V0LCBNUiApCitDVl9ERUZfSU5JVF9DT1BZU0VUX1RBQl8yRCggQ29weSwgTVIgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIL0wgQ09QWSAmIFNFVCBGVU5DVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitDdkNvcHlNYXNrRnVuYworaWN2R2V0Q29weU1hc2tGdW5jKCBpbnQgZWxlbV9zaXplICkKK3sKKyAgICBzdGF0aWMgQ3ZCdEZ1bmNUYWJsZSBjb3B5bV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0Q29weU1SVGFibGUoICZjb3B5bV90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorICAgIHJldHVybiAoQ3ZDb3B5TWFza0Z1bmMpY29weW1fdGFiLmZuXzJkW2VsZW1fc2l6ZV07Cit9CisKKworLyogZHN0ID0gc3JjICovCitDVl9JTVBMIHZvaWQKK2N2Q29weSggY29uc3Qgdm9pZCogc3JjYXJyLCB2b2lkKiBkc3RhcnIsIGNvbnN0IHZvaWQqIG1hc2thcnIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb3B5IiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGludCBwaXhfc2l6ZTsKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzaXplOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjKSB8fCAhQ1ZfSVNfTUFUKGRzdCkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX1NQQVJTRV9NQVQoc3JjKSAmJiBDVl9JU19TUEFSU0VfTUFUKGRzdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U3BhcnNlTWF0KiBzcmMxID0gKEN2U3BhcnNlTWF0KilzcmM7CisgICAgICAgICAgICBDdlNwYXJzZU1hdCogZHN0MSA9IChDdlNwYXJzZU1hdCopZHN0OworICAgICAgICAgICAgQ3ZTcGFyc2VNYXRJdGVyYXRvciBpdGVyYXRvcjsKKyAgICAgICAgICAgIEN2U3BhcnNlTm9kZSogbm9kZTsKKworICAgICAgICAgICAgZHN0MS0+ZGltcyA9IHNyYzEtPmRpbXM7CisgICAgICAgICAgICBtZW1jcHkoIGRzdDEtPnNpemUsIHNyYzEtPnNpemUsIHNyYzEtPmRpbXMqc2l6ZW9mKHNyYzEtPnNpemVbMF0pKTsKKyAgICAgICAgICAgIGRzdDEtPnZhbG9mZnNldCA9IHNyYzEtPnZhbG9mZnNldDsKKyAgICAgICAgICAgIGRzdDEtPmlkeG9mZnNldCA9IHNyYzEtPmlkeG9mZnNldDsKKyAgICAgICAgICAgIGN2Q2xlYXJTZXQoIGRzdDEtPmhlYXAgKTsKKworICAgICAgICAgICAgaWYoIHNyYzEtPmhlYXAtPmFjdGl2ZV9jb3VudCA+PSBkc3QxLT5oYXNoc2l6ZSpDVl9TUEFSU0VfSEFTSF9SQVRJTyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZGcmVlKCAmZHN0MS0+aGFzaHRhYmxlICkpOworICAgICAgICAgICAgICAgIGRzdDEtPmhhc2hzaXplID0gc3JjMS0+aGFzaHNpemU7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggZHN0MS0+aGFzaHRhYmxlID0KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQqKiljdkFsbG9jKCBkc3QxLT5oYXNoc2l6ZSpzaXplb2YoZHN0MS0+aGFzaHRhYmxlWzBdKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1zZXQoIGRzdDEtPmhhc2h0YWJsZSwgMCwgZHN0MS0+aGFzaHNpemUqc2l6ZW9mKGRzdDEtPmhhc2h0YWJsZVswXSkpOworCisgICAgICAgICAgICBmb3IoIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggc3JjMSwgJml0ZXJhdG9yICk7CisgICAgICAgICAgICAgICAgIG5vZGUgIT0gMDsgbm9kZSA9IGN2R2V0TmV4dFNwYXJzZU5vZGUoICZpdGVyYXRvciApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U3BhcnNlTm9kZSogbm9kZV9jb3B5ID0gKEN2U3BhcnNlTm9kZSopY3ZTZXROZXcoIGRzdDEtPmhlYXAgKTsKKyAgICAgICAgICAgICAgICBpbnQgdGFiaWR4ID0gbm9kZS0+aGFzaHZhbCAmIChkc3QxLT5oYXNoc2l6ZSAtIDEpOworICAgICAgICAgICAgICAgIENWX01FTUNQWV9BVVRPKCBub2RlX2NvcHksIG5vZGUsIGRzdDEtPmhlYXAtPmVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIG5vZGVfY29weS0+bmV4dCA9IChDdlNwYXJzZU5vZGUqKWRzdDEtPmhhc2h0YWJsZVt0YWJpZHhdOworICAgICAgICAgICAgICAgIGRzdDEtPmhhc2h0YWJsZVt0YWJpZHhdID0gbm9kZV9jb3B5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBDVl9JU19NQVRORChzcmMpIHx8IENWX0lTX01BVE5EKGRzdCkgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkFyciogYXJyc1tdID0geyBzcmMsIGRzdCB9OworICAgICAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAyLCBhcnJzLCBtYXNrYXJyLCBzdHVicywgJml0ZXJhdG9yICkpOworICAgICAgICAgICAgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKTsKKworICAgICAgICAgICAgaWYoICFtYXNrYXJyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5zaXplLndpZHRoICo9IHBpeF9zaXplOworICAgICAgICAgICAgICAgIGlmKCBpdGVyYXRvci5zaXplLndpZHRoIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUqKGludClzaXplb2YoZG91YmxlKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggaXRlcmF0b3IucHRyWzFdLCBpdGVyYXRvci5wdHJbMF0sIGl0ZXJhdG9yLnNpemUud2lkdGggKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q29weV84dV9DMVIoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLCBpdGVyYXRvci5zaXplICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29weU1hc2tGdW5jIGZ1bmMgPSBpY3ZHZXRDb3B5TWFza0Z1bmMoIHBpeF9zaXplICk7CisgICAgICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzJdLCBDVl9TVFVCX1NURVAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMDsKKyAgICAgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pMSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgICAgICAgICAgaWYoIGNvaTEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2QXJyKiBwbGFuZXNbXSA9IHsgMCwgMCwgMCwgMCB9OworCisgICAgICAgICAgICAgICAgaWYoIG1hc2thcnIgKQorICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiQ09JICsgbWFzayBhcmUgbm90IHN1cHBvcnRlZCIgKTsKKworICAgICAgICAgICAgICAgIHBsYW5lc1tjb2kxLTFdID0gZHN0OworICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2U3BsaXQoIHNyYywgcGxhbmVzWzBdLCBwbGFuZXNbMV0sIHBsYW5lc1syXSwgcGxhbmVzWzNdICkpOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBjb2kyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkFyciogcGxhbmVzW10gPSB7IDAsIDAsIDAsIDAgfTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBtYXNrYXJyICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkNPSSArIG1hc2sgYXJlIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICAgICAgICAgICAgICBwbGFuZXNbY29pMi0xXSA9IHNyYzsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBjdk1lcmdlKCBwbGFuZXNbMF0sIHBsYW5lc1sxXSwgcGxhbmVzWzJdLCBwbGFuZXNbM10sIGRzdCApKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyYy0+dHlwZSk7CisKKyAgICBpZiggIW1hc2thcnIgKQorICAgIHsKKyAgICAgICAgaW50IHNyY19zdGVwID0gc3JjLT5zdGVwLCBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBwaXhfc2l6ZTsKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSAmJiAoc3JjX3N0ZXAgPT0gZHN0X3N0ZXApICYmIChzcmNfc3RlcCA9PSBzcmMtPndpZHRoICogcGl4X3NpemUpKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworCisgICAgICAgICAgICBpZiggc2l6ZS53aWR0aCA8PSBDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSooaW50KXNpemVvZihkb3VibGUpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1lbWNweSggZHN0LT5kYXRhLnB0ciwgc3JjLT5kYXRhLnB0ciwgc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIHNyY19zdGVwID0gZHN0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3JjLT5kYXRhLnB0ciAhPSBkc3QtPmRhdGEucHRyICkKKyAgICAgICAgICAgIGljdkNvcHlfOHVfQzFSKCBzcmMtPmRhdGEucHRyLCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkNvcHlNYXNrRnVuYyBmdW5jID0gaWN2R2V0Q29weU1hc2tGdW5jKHBpeF9zaXplKTsKKyAgICAgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworICAgICAgICBpbnQgc3JjX3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgICAgIGludCBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKyAgICAgICAgaW50IG1hc2tfc3RlcDsKKworICAgICAgICBpZiggIUNWX0lTX01BVCggbWFzayApKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICBtYXNrX3N0ZXAgPSBtYXNrLT5zdGVwOworICAgICAgICAKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgJiBtYXNrLT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgICAgICBzcmNfc3RlcCA9IGRzdF9zdGVwID0gbWFza19zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBtYXNrLT5kYXRhLnB0ciwgbWFza19zdGVwICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogZHN0KGlkeCkgPSB2YWx1ZSAqLworQ1ZfSU1QTCB2b2lkCitjdlNldCggdm9pZCogYXJyLCBDdlNjYWxhciB2YWx1ZSwgY29uc3Qgdm9pZCogbWFza2FyciApCit7CisgICAgc3RhdGljIEN2QnRGdW5jVGFibGUgc2V0bV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopYXJyOworICAgIGludCBwaXhfc2l6ZSwgdHlwZTsKKyAgICBkb3VibGUgYnVmWzEyXTsKKyAgICBpbnQgbWF0X3N0ZXA7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIXZhbHVlLnZhbFswXSAmJiAhdmFsdWUudmFsWzFdICYmCisgICAgICAgICF2YWx1ZS52YWxbMl0gJiYgIXZhbHVlLnZhbFszXSAmJiAhbWFza2FyciApCisgICAgeworICAgICAgICBjdlplcm8oIGFyciApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKG1hdCkpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQobWF0KSkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXRORCBuc3R1YjsKKyAgICAgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBpbnQgcGl4X3NpemUxOworICAgICAgICAgICAgCisgICAgICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMSwgJmFyciwgbWFza2FyciwgJm5zdHViLCAmaXRlcmF0b3IgKSk7CisKKyAgICAgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworICAgICAgICAgICAgcGl4X3NpemUxID0gQ1ZfRUxFTV9TSVpFMSh0eXBlKTsKKyAgICAgICAgICAgIHBpeF9zaXplID0gcGl4X3NpemUxKkNWX01BVF9DTih0eXBlKTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZTY2FsYXJUb1Jhd0RhdGEoICZ2YWx1ZSwgYnVmLCB0eXBlLCBtYXNrYXJyID09IDAgKSk7CisKKyAgICAgICAgICAgIGlmKCAhbWFza2FyciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBwaXhfc2l6ZTsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2U2V0Xzh1X0MxUiggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIGJ1ZiwgcGl4X3NpemUxICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RnVuYzJEXzJBMVAgZnVuYyA9IChDdkZ1bmMyRF8yQTFQKShzZXRtX3RhYi5mbl8yZFtwaXhfc2l6ZV0pOworICAgICAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIGJ1ZiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0gICAgCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaSApKTsKKworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgICAgICB9CisgICAgfQorCisgICAgdHlwZSA9IENWX01BVF9UWVBFKCBtYXQtPnR5cGUgKTsKKyAgICBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKworICAgIGlmKCAhbWFza2FyciApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAKKyAgICAgICAgICAgIGlmKCBzaXplLndpZHRoIDw9IChpbnQpKENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUqc2l6ZW9mKGRvdWJsZSkpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBkc3RkYXRhID0gKGZsb2F0KikobWF0LT5kYXRhLnB0cik7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbCA9IChmbG9hdCl2YWx1ZS52YWxbMF07CisKKyAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZHN0ZGF0YVtzaXplLndpZHRoLTFdID0gdmFsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAtLXNpemUud2lkdGggKTsKKworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzY0RkMxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHN0ZGF0YSA9IChkb3VibGUqKShtYXQtPmRhdGEucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IHZhbHVlLnZhbFswXTsKKworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkc3RkYXRhW3NpemUud2lkdGgtMV0gPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIC0tc2l6ZS53aWR0aCApOworCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXRfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBwaXhfc2l6ZTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTY2FsYXJUb1Jhd0RhdGEoICZ2YWx1ZSwgYnVmLCB0eXBlLCAxICkpOworCisgICAgICAgIElQUElfQ0FMTCggaWN2U2V0Xzh1X0MxUiggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIHNpemUsIGJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FTEVNX1NJWkUxKHR5cGUpKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2RnVuYzJEXzJBMVAgZnVuYzsKKyAgICAgICAgQ3ZNYXQgbWFza3N0dWIsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworICAgICAgICBpbnQgbWFza19zdGVwOworCisgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIoIG1hc2sgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhaW5pdHRhYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkluaXRTZXRNUlRhYmxlKCAmc2V0bV90YWIgKTsKKyAgICAgICAgICAgIGluaXR0YWIgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdCwgbWFzayApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgICAgIG1hc2tfc3RlcCA9IG1hc2stPnN0ZXA7CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgJiBtYXNrLT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBtYXRfc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkoc2V0bV90YWIuZm5fMmRbcGl4X3NpemVdKTsKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJnZhbHVlLCBidWYsIHR5cGUsIDAgKSk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgbWFzay0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zdGVwLCBzaXplLCBidWYgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhcmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ljdlNldEJ5dGVfOHVfQzFSX3QgaWN2U2V0Qnl0ZV84dV9DMVJfcCA9IDA7CisKK0N2U3RhdHVzIENWX1NURENBTEwKK2ljdlNldFplcm9fOHVfQzFSKCB1Y2hhciogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKQoreworICAgIGlmKCBzaXplLndpZHRoICsgc2l6ZS5oZWlnaHQgPiAyNTYgJiYgaWN2U2V0Qnl0ZV84dV9DMVJfcCApCisgICAgICAgIHJldHVybiBpY3ZTZXRCeXRlXzh1X0MxUl9wKCAwLCBkc3QsIGRzdHN0ZXAsIHNpemUgKTsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBkc3QgKz0gZHN0c3RlcCApCisgICAgICAgIG1lbXNldCggZHN0LCAwLCBzaXplLndpZHRoICk7CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZTZXRaZXJvKCBDdkFyciogYXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0WmVybyIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IG1hdF9zdGVwOworCisgICAgaWYoICFDVl9JU19NQVQoIG1hdCApKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVE5EKG1hdCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0TkQgbnN0dWI7CisgICAgICAgICAgICBDdk5BcnJheUl0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgCisgICAgICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMSwgJmFyciwgMCwgJm5zdHViLCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICBpdGVyYXRvci5zaXplLndpZHRoICo9IENWX0VMRU1fU0laRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworCisgICAgICAgICAgICBpZiggaXRlcmF0b3Iuc2l6ZS53aWR0aCA8PSBDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFKihpbnQpc2l6ZW9mKGRvdWJsZSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGl0ZXJhdG9yLnB0clswXSwgMCwgaXRlcmF0b3Iuc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2U2V0WmVyb184dV9DMVIoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLCBpdGVyYXRvci5zaXplICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfSAgICAKKyAgICAgICAgZWxzZSBpZiggQ1ZfSVNfU1BBUlNFX01BVChtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBDdlNwYXJzZU1hdCogbWF0MSA9IChDdlNwYXJzZU1hdCopbWF0OworICAgICAgICAgICAgY3ZDbGVhclNldCggbWF0MS0+aGVhcCApOworICAgICAgICAgICAgaWYoIG1hdDEtPmhhc2h0YWJsZSApCisgICAgICAgICAgICAgICAgbWVtc2V0KCBtYXQxLT5oYXNodGFibGUsIDAsIG1hdDEtPmhhc2hzaXplKnNpemVvZihtYXQxLT5oYXNodGFibGVbMF0pKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICBzaXplLndpZHRoICo9IENWX0VMRU1fU0laRShtYXQtPnR5cGUpOworICAgIG1hdF9zdGVwID0gbWF0LT5zdGVwOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisKKyAgICAgICAgaWYoIHNpemUud2lkdGggPD0gQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSooaW50KXNpemVvZihkb3VibGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCBtYXQtPmRhdGEucHRyLCAwLCBzaXplLndpZHRoICk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisKKyAgICAgICAgbWF0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBJUFBJX0NBTEwoIGljdlNldFplcm9fOHVfQzFSKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmxpcHBpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfRkxJUF9IWl9DQVNFX0MxKCB0eXBlICkgXAorICAgIGZvciggaSA9IDA7IGkgPCAobGVuKzEpLzI7IGkrKyApICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDAgPSBzcmNbaV07ICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIHQxID0gc3JjW2xlbiAtIGkgLSAxXTsgICAgIFwKKyAgICAgICAgZHN0W2ldID0gdDE7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtsZW4gLSBpIC0gMV0gPSB0MDsgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9ERUZfRkxJUF9IWl9DQVNFX0MzKCB0eXBlICkgXAorICAgIGZvciggaSA9IDA7IGkgPCAobGVuKzEpLzI7IGkrKyApICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDAgPSBzcmNbaSozXTsgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIHQxID0gc3JjWyhsZW4gLSBpKSozIC0gM107IFwKKyAgICAgICAgZHN0W2kqM10gPSB0MTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsobGVuIC0gaSkqMyAtIDNdID0gdDA7ICAgICAgXAorICAgICAgICB0MCA9IHNyY1tpKjMgKyAxXTsgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBzcmNbKGxlbiAtIGkpKjMgLSAyXTsgICAgICBcCisgICAgICAgIGRzdFtpKjMgKyAxXSA9IHQxOyAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbKGxlbiAtIGkpKjMgLSAyXSA9IHQwOyAgICAgIFwKKyAgICAgICAgdDAgPSBzcmNbaSozICsgMl07ICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gc3JjWyhsZW4gLSBpKSozIC0gMV07ICAgICAgXAorICAgICAgICBkc3RbaSozICsgMl0gPSB0MTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WyhsZW4gLSBpKSozIC0gMV0gPSB0MDsgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX0RFRl9GTElQX0haX0NBU0VfQzQoIHR5cGUgKSBcCisgICAgZm9yKCBpID0gMDsgaSA8IChsZW4rMSkvMjsgaSsrICkgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdHlwZSB0MCA9IHNyY1tpKjRdOyAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDEgPSBzcmNbKGxlbiAtIGkpKjQgLSA0XTsgXAorICAgICAgICBkc3RbaSo0XSA9IHQxOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WyhsZW4gLSBpKSo0IC0gNF0gPSB0MDsgICAgICBcCisgICAgICAgIHQwID0gc3JjW2kqNCArIDFdOyAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IHNyY1sobGVuIC0gaSkqNCAtIDNdOyAgICAgIFwKKyAgICAgICAgZHN0W2kqNCArIDFdID0gdDE7ICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsobGVuIC0gaSkqNCAtIDNdID0gdDA7ICAgICAgXAorICAgICAgICB0MCA9IHNyY1tpKjQgKyAyXTsgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBzcmNbKGxlbiAtIGkpKjQgLSAyXTsgICAgICBcCisgICAgICAgIGRzdFtpKjQgKyAyXSA9IHQxOyAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbKGxlbiAtIGkpKjQgLSAyXSA9IHQwOyAgICAgIFwKKyAgICAgICAgdDAgPSBzcmNbaSo0ICsgM107ICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gc3JjWyhsZW4gLSBpKSo0IC0gMV07ICAgICAgXAorICAgICAgICBkc3RbaSo0ICsgM10gPSB0MTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WyhsZW4gLSBpKSo0IC0gMV0gPSB0MDsgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX0RFRl9GTElQX0haX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgY24gKSAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZGbGlwSG9yel8jI2ZsYXZvciggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGxlbiA9IHNpemUud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX0ZMSVBfSFpfQ0FTRV9DIyNjbiggYXJydHlwZSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9GTElQX0haX0ZVTkMoIDh1X0MxUiwgdWNoYXIsIDEgKQorSUNWX0RFRl9GTElQX0haX0ZVTkMoIDh1X0MyUiwgdXNob3J0LCAxICkKK0lDVl9ERUZfRkxJUF9IWl9GVU5DKCA4dV9DM1IsIHVjaGFyLCAzICkKK0lDVl9ERUZfRkxJUF9IWl9GVU5DKCAxNnVfQzJSLCBpbnQsIDEgKQorSUNWX0RFRl9GTElQX0haX0ZVTkMoIDE2dV9DM1IsIHVzaG9ydCwgMyApCitJQ1ZfREVGX0ZMSVBfSFpfRlVOQyggMzJzX0MyUiwgaW50NjQsIDEgKQorSUNWX0RFRl9GTElQX0haX0ZVTkMoIDMyc19DM1IsIGludCwgMyApCitJQ1ZfREVGX0ZMSVBfSFpfRlVOQyggNjRzX0MyUiwgaW50LCA0ICkKK0lDVl9ERUZfRkxJUF9IWl9GVU5DKCA2NHNfQzNSLCBpbnQ2NCwgMyApCitJQ1ZfREVGX0ZMSVBfSFpfRlVOQyggNjRzX0M0UiwgaW50NjQsIDQgKQorCitDVl9ERUZfSU5JVF9QSVhTSVpFX1RBQl8yRCggRmxpcEhvcnosIFIgKQorCisKK3N0YXRpYyBDdlN0YXR1cworaWN2RmxpcFZlcnRfOHVfQzFSKCBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgeSwgaTsKKyAgICBjb25zdCB1Y2hhciogc3JjMSA9IHNyYyArIChzaXplLmhlaWdodCAtIDEpKnNyY3N0ZXA7CisgICAgdWNoYXIqIGRzdDEgPSBkc3QgKyAoc2l6ZS5oZWlnaHQgLSAxKSpkc3RzdGVwOworCisgICAgZm9yKCB5ID0gMDsgeSA8IChzaXplLmhlaWdodCArIDEpLzI7IHkrKywgc3JjICs9IHNyY3N0ZXAsIHNyYzEgLT0gc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgKz0gZHN0c3RlcCwgZHN0MSAtPSBkc3RzdGVwICkKKyAgICB7CisgICAgICAgIGkgPSAwOworICAgICAgICBpZiggKChzaXplX3QpKHNyYyl8KHNpemVfdCkoZHN0KXwoc2l6ZV90KXNyYzF8KHNpemVfdClkc3QxKSAlIHNpemVvZihpbnQpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIDsgaSA8PSBzaXplLndpZHRoIC0gMTY7IGkgKz0gMTYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0MCA9ICgoaW50Kikoc3JjICsgaSkpWzBdOworICAgICAgICAgICAgICAgIGludCB0MSA9ICgoaW50Kikoc3JjMSArIGkpKVswXTsKKworICAgICAgICAgICAgICAgICgoaW50KikoZHN0ICsgaSkpWzBdID0gdDE7CisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QxICsgaSkpWzBdID0gdDA7CisKKyAgICAgICAgICAgICAgICB0MCA9ICgoaW50Kikoc3JjICsgaSkpWzFdOworICAgICAgICAgICAgICAgIHQxID0gKChpbnQqKShzcmMxICsgaSkpWzFdOworCisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QgKyBpKSlbMV0gPSB0MTsKKyAgICAgICAgICAgICAgICAoKGludCopKGRzdDEgKyBpKSlbMV0gPSB0MDsKKworICAgICAgICAgICAgICAgIHQwID0gKChpbnQqKShzcmMgKyBpKSlbMl07CisgICAgICAgICAgICAgICAgdDEgPSAoKGludCopKHNyYzEgKyBpKSlbMl07CisKKyAgICAgICAgICAgICAgICAoKGludCopKGRzdCArIGkpKVsyXSA9IHQxOworICAgICAgICAgICAgICAgICgoaW50KikoZHN0MSArIGkpKVsyXSA9IHQwOworCisgICAgICAgICAgICAgICAgdDAgPSAoKGludCopKHNyYyArIGkpKVszXTsKKyAgICAgICAgICAgICAgICB0MSA9ICgoaW50Kikoc3JjMSArIGkpKVszXTsKKworICAgICAgICAgICAgICAgICgoaW50KikoZHN0ICsgaSkpWzNdID0gdDE7CisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QxICsgaSkpWzNdID0gdDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0MCA9ICgoaW50Kikoc3JjICsgaSkpWzBdOworICAgICAgICAgICAgICAgIGludCB0MSA9ICgoaW50Kikoc3JjMSArIGkpKVswXTsKKworICAgICAgICAgICAgICAgICgoaW50KikoZHN0ICsgaSkpWzBdID0gdDE7CisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QxICsgaSkpWzBdID0gdDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyIHQwID0gc3JjW2ldOworICAgICAgICAgICAgdWNoYXIgdDEgPSBzcmMxW2ldOworCisgICAgICAgICAgICBkc3RbaV0gPSB0MTsKKyAgICAgICAgICAgIGRzdDFbaV0gPSB0MDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2RmxpcCggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwgaW50IGZsaXBfbW9kZSApCit7CisgICAgc3RhdGljIEN2QnRGdW5jVGFibGUgdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkZsaXAiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2RnVuYzJEXzJBIGZ1bmMgPSAwOworICAgIGludCBwaXhfc2l6ZTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0RmxpcEhvcnpSVGFibGUoICZ0YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoIHNyYyApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzc3R1YiwgJmNvaSApKTsKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICJjb2kgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICB9CisKKyAgICBpZiggIWRzdCApCisgICAgICAgIGRzdCA9IHNyYzsKKyAgICBlbHNlIGlmKCAhQ1ZfSVNfTUFUKCBkc3QgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgfQorCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworICAgIHBpeF9zaXplID0gQ1ZfRUxFTV9TSVpFKCBzcmMtPnR5cGUgKTsKKworICAgIGlmKCBmbGlwX21vZGUgPT0gMCApCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHBpeF9zaXplOworICAgICAgICAKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZGbGlwVmVydF84dV9DMVIoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwgc2l6ZSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGlucGxhY2UgPSBzcmMtPmRhdGEucHRyID09IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgIHVjaGFyKiBkc3RfZGF0YSA9IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgIGludCBkc3Rfc3RlcCA9IGRzdC0+c3RlcDsKKworICAgICAgICBmdW5jID0gKEN2RnVuYzJEXzJBKSh0YWIuZm5fMmRbcGl4X3NpemVdKTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIGlmKCBmbGlwX21vZGUgPCAwICYmICFpbnBsYWNlICkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0X2RhdGEgKz0gZHN0X3N0ZXAgKiAoZHN0LT5oZWlnaHQgLSAxKTsKKyAgICAgICAgICAgIGRzdF9zdGVwID0gLWRzdF9zdGVwOworICAgICAgICB9CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIGRzdF9kYXRhLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBmbGlwX21vZGUgPCAwICYmIGlucGxhY2UgKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHBpeF9zaXplOworICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZGbGlwVmVydF84dV9DMVIoIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAsIHNpemUgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZXBlYXQoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZXBlYXQiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2U2l6ZSBzcmNzaXplLCBkc3RzaXplOworICAgIGludCBwaXhfc2l6ZTsKKyAgICBpbnQgeCwgeSwgaywgbDsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3N0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoIGRzdCApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3R1YiwgJmNvaSApKTsKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICJjb2kgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBzcmNzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICBkc3RzaXplID0gY3ZHZXRNYXRTaXplKCBkc3QgKTsKKyAgICBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSggc3JjLT50eXBlICk7CisKKyAgICBmb3IoIHkgPSAwLCBrID0gMDsgeSA8IGRzdHNpemUuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IGRzdHNpemUud2lkdGg7IHggKz0gc3Jjc2l6ZS53aWR0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGwgPSBzcmNzaXplLndpZHRoOworICAgICAgICAgICAgaWYoIGwgPiBkc3RzaXplLndpZHRoIC0geCApCisgICAgICAgICAgICAgICAgbCA9IGRzdHNpemUud2lkdGggLSB4OworICAgICAgICAgICAgbWVtY3B5KCBkc3QtPmRhdGEucHRyICsgeSpkc3QtPnN0ZXAgKyB4KnBpeF9zaXplLAorICAgICAgICAgICAgICAgICAgICBzcmMtPmRhdGEucHRyICsgaypzcmMtPnN0ZXAsIGwqcGl4X3NpemUgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggKytrID09IHNyY3NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIGsgPSAwOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLworCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4ZGF0YXN0cnVjdHMuY3BwIGIvY3hjb3JlL3NyYy9jeGRhdGFzdHJ1Y3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFiMDZmCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeGRhdGFzdHJ1Y3RzLmNwcApAQCAtMCwwICsxLDQwMDkgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworI2RlZmluZSBJQ1ZfRlJFRV9QVFIoc3RvcmFnZSkgIFwKKyAgICAoKHNjaGFyKikoc3RvcmFnZSktPnRvcCArIChzdG9yYWdlKS0+YmxvY2tfc2l6ZSAtIChzdG9yYWdlKS0+ZnJlZV9zcGFjZSkKKworI2RlZmluZSBJQ1ZfQUxJR05FRF9TRVFfQkxPQ0tfU0laRSAgXAorICAgIChpbnQpY3ZBbGlnbihzaXplb2YoQ3ZTZXFCbG9jayksIENWX1NUUlVDVF9BTElHTikKKworQ1ZfSU5MSU5FIGludAorY3ZBbGlnbkxlZnQoIGludCBzaXplLCBpbnQgYWxpZ24gKQoreworICAgIHJldHVybiBzaXplICYgLWFsaWduOworfQorCisjZGVmaW5lIENWX0dFVF9MQVNUX0VMRU0oIHNlcSwgYmxvY2sgKSBcCisgICAgKChibG9jayktPmRhdGEgKyAoKGJsb2NrKS0+Y291bnQgLSAxKSooKHNlcSktPmVsZW1fc2l6ZSkpCisKKyNkZWZpbmUgQ1ZfU1dBUF9FTEVNUyhhLGIsZWxlbV9zaXplKSAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGsgPSAwOyBrIDwgZWxlbV9zaXplOyBrKysgKSAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNoYXIgdDAgPSAoYSlba107ICAgICAgICAgICAgIFwKKyAgICAgICAgY2hhciB0MSA9IChiKVtrXTsgICAgICAgICAgICAgXAorICAgICAgICAoYSlba10gPSB0MTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChiKVtrXSA9IHQwOyAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIElDVl9TSElGVF9UQUJfTUFYIDMyCitzdGF0aWMgY29uc3Qgc2NoYXIgaWN2UG93ZXIyU2hpZnRUYWJbXSA9Cit7CisgICAgMCwgMSwgLTEsIDIsIC0xLCAtMSwgLTEsIDMsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0LAorICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDUKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIG1lbW9yeSBzdG9yYWdlIC0gbGlzdCBvZiBtZW1vcnkgYmxvY2tzICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhbGl6ZSBhbGxvY2F0ZWQgc3RvcmFnZTogKi8KK3N0YXRpYyB2b2lkCitpY3ZJbml0TWVtU3RvcmFnZSggQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBpbnQgYmxvY2tfc2l6ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZJbml0TWVtU3RvcmFnZSAiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBibG9ja19zaXplIDw9IDAgKQorICAgICAgICBibG9ja19zaXplID0gQ1ZfU1RPUkFHRV9CTE9DS19TSVpFOworCisgICAgYmxvY2tfc2l6ZSA9IGN2QWxpZ24oIGJsb2NrX3NpemUsIENWX1NUUlVDVF9BTElHTiApOworICAgIGFzc2VydCggc2l6ZW9mKEN2TWVtQmxvY2spICUgQ1ZfU1RSVUNUX0FMSUdOID09IDAgKTsKKworICAgIG1lbXNldCggc3RvcmFnZSwgMCwgc2l6ZW9mKCAqc3RvcmFnZSApKTsKKyAgICBzdG9yYWdlLT5zaWduYXR1cmUgPSBDVl9TVE9SQUdFX01BR0lDX1ZBTDsKKyAgICBzdG9yYWdlLT5ibG9ja19zaXplID0gYmxvY2tfc2l6ZTsKKworICAgIF9fRU5EX187Cit9CisKKworLyogQ3JlYXRlIHJvb3QgbWVtb3J5IHN0b3JhZ2U6ICovCitDVl9JTVBMIEN2TWVtU3RvcmFnZSoKK2N2Q3JlYXRlTWVtU3RvcmFnZSggaW50IGJsb2NrX3NpemUgKQoreworICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlTWVtU3RvcmFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NBTEwoIHN0b3JhZ2UgPSAoQ3ZNZW1TdG9yYWdlICopY3ZBbGxvYyggc2l6ZW9mKCBDdk1lbVN0b3JhZ2UgKSkpOworICAgIENWX0NBTEwoIGljdkluaXRNZW1TdG9yYWdlKCBzdG9yYWdlLCBibG9ja19zaXplICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2RnJlZSggJnN0b3JhZ2UgKTsKKworICAgIHJldHVybiBzdG9yYWdlOworfQorCisKKy8qIENyZWF0ZSBjaGlsZCBtZW1vcnkgc3RvcmFnZTogKi8KK0NWX0lNUEwgQ3ZNZW1TdG9yYWdlICoKK2N2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBDdk1lbVN0b3JhZ2UgKiBwYXJlbnQgKQoreworICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhcGFyZW50ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBDVl9DQUxMKCBzdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKHBhcmVudC0+YmxvY2tfc2l6ZSkpOworICAgIHN0b3JhZ2UtPnBhcmVudCA9IHBhcmVudDsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICBjdkZyZWUoICZzdG9yYWdlICk7CisKKyAgICByZXR1cm4gc3RvcmFnZTsKK30KKworCisvKiBSZWxlYXNlIGFsbCBibG9ja3Mgb2YgdGhlIHN0b3JhZ2UgKG9yIHJldHVybiB0aGVtIHRvIHBhcmVudCwgaWYgYW55KTogKi8KK3N0YXRpYyB2b2lkCitpY3ZEZXN0cm95TWVtU3RvcmFnZSggQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkRlc3Ryb3lNZW1TdG9yYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGsgPSAwOworCisgICAgQ3ZNZW1CbG9jayAqYmxvY2s7CisgICAgQ3ZNZW1CbG9jayAqZHN0X3RvcCA9IDA7CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBzdG9yYWdlLT5wYXJlbnQgKQorICAgICAgICBkc3RfdG9wID0gc3RvcmFnZS0+cGFyZW50LT50b3A7CisKKyAgICBmb3IoIGJsb2NrID0gc3RvcmFnZS0+Ym90dG9tOyBibG9jayAhPSAwOyBrKysgKQorICAgIHsKKyAgICAgICAgQ3ZNZW1CbG9jayAqdGVtcCA9IGJsb2NrOworCisgICAgICAgIGJsb2NrID0gYmxvY2stPm5leHQ7CisgICAgICAgIGlmKCBzdG9yYWdlLT5wYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZHN0X3RvcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGVtcC0+cHJldiA9IGRzdF90b3A7CisgICAgICAgICAgICAgICAgdGVtcC0+bmV4dCA9IGRzdF90b3AtPm5leHQ7CisgICAgICAgICAgICAgICAgaWYoIHRlbXAtPm5leHQgKQorICAgICAgICAgICAgICAgICAgICB0ZW1wLT5uZXh0LT5wcmV2ID0gdGVtcDsKKyAgICAgICAgICAgICAgICBkc3RfdG9wID0gZHN0X3RvcC0+bmV4dCA9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0X3RvcCA9IHN0b3JhZ2UtPnBhcmVudC0+Ym90dG9tID0gc3RvcmFnZS0+cGFyZW50LT50b3AgPSB0ZW1wOworICAgICAgICAgICAgICAgIHRlbXAtPnByZXYgPSB0ZW1wLT5uZXh0ID0gMDsKKyAgICAgICAgICAgICAgICBzdG9yYWdlLT5mcmVlX3NwYWNlID0gc3RvcmFnZS0+YmxvY2tfc2l6ZSAtIHNpemVvZiggKnRlbXAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2RnJlZSggJnRlbXAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0b3JhZ2UtPnRvcCA9IHN0b3JhZ2UtPmJvdHRvbSA9IDA7CisgICAgc3RvcmFnZS0+ZnJlZV9zcGFjZSA9IDA7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFJlbGVhc2UgbWVtb3J5IHN0b3JhZ2U6ICovCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZU1lbVN0b3JhZ2UoIEN2TWVtU3RvcmFnZSoqIHN0b3JhZ2UgKQoreworICAgIEN2TWVtU3RvcmFnZSAqc3Q7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlbGVhc2VNZW1TdG9yYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBzdCA9ICpzdG9yYWdlOworICAgICpzdG9yYWdlID0gMDsKKworICAgIGlmKCBzdCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZEZXN0cm95TWVtU3RvcmFnZSggc3QgKSk7CisgICAgICAgIGN2RnJlZSggJnN0ICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKiBDbGVhcnMgbWVtb3J5IHN0b3JhZ2UgKHJldHVybiBibG9ja3MgdG8gdGhlIHBhcmVudCwgaWYgYW55KTogKi8KK0NWX0lNUEwgdm9pZAorY3ZDbGVhck1lbVN0b3JhZ2UoIEN2TWVtU3RvcmFnZSAqIHN0b3JhZ2UgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDbGVhck1lbVN0b3JhZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBzdG9yYWdlLT5wYXJlbnQgKQorICAgIHsKKyAgICAgICAgaWN2RGVzdHJveU1lbVN0b3JhZ2UoIHN0b3JhZ2UgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RvcmFnZS0+dG9wID0gc3RvcmFnZS0+Ym90dG9tOworICAgICAgICBzdG9yYWdlLT5mcmVlX3NwYWNlID0gc3RvcmFnZS0+Ym90dG9tID8gc3RvcmFnZS0+YmxvY2tfc2l6ZSAtIHNpemVvZihDdk1lbUJsb2NrKSA6IDA7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKiBNb3ZlcyBzdGFjayBwb2ludGVyIHRvIG5leHQgYmxvY2suCisgICBJZiBubyBibG9ja3MsIGFsbG9jYXRlIG5ldyBvbmUgYW5kIGxpbmsgaXQgdG8gdGhlIHN0b3JhZ2U6ICovCitzdGF0aWMgdm9pZAoraWN2R29OZXh0TWVtQmxvY2soIEN2TWVtU3RvcmFnZSAqIHN0b3JhZ2UgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2R29OZXh0TWVtQmxvY2siICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhc3RvcmFnZS0+dG9wIHx8ICFzdG9yYWdlLT50b3AtPm5leHQgKQorICAgIHsKKyAgICAgICAgQ3ZNZW1CbG9jayAqYmxvY2s7CisKKyAgICAgICAgaWYoICEoc3RvcmFnZS0+cGFyZW50KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJsb2NrID0gKEN2TWVtQmxvY2sgKiljdkFsbG9jKCBzdG9yYWdlLT5ibG9ja19zaXplICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlICpwYXJlbnQgPSBzdG9yYWdlLT5wYXJlbnQ7CisgICAgICAgICAgICBDdk1lbVN0b3JhZ2VQb3MgcGFyZW50X3BvczsKKworICAgICAgICAgICAgY3ZTYXZlTWVtU3RvcmFnZVBvcyggcGFyZW50LCAmcGFyZW50X3BvcyApOworICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2R29OZXh0TWVtQmxvY2soIHBhcmVudCApKTsKKworICAgICAgICAgICAgYmxvY2sgPSBwYXJlbnQtPnRvcDsKKyAgICAgICAgICAgIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MoIHBhcmVudCwgJnBhcmVudF9wb3MgKTsKKworICAgICAgICAgICAgaWYoIGJsb2NrID09IHBhcmVudC0+dG9wICkgIC8qIHRoZSBzaW5nbGUgYWxsb2NhdGVkIGJsb2NrICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYXNzZXJ0KCBwYXJlbnQtPmJvdHRvbSA9PSBibG9jayApOworICAgICAgICAgICAgICAgIHBhcmVudC0+dG9wID0gcGFyZW50LT5ib3R0b20gPSAwOworICAgICAgICAgICAgICAgIHBhcmVudC0+ZnJlZV9zcGFjZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogY3V0IHRoZSBibG9jayBmcm9tIHRoZSBwYXJlbnQncyBsaXN0IG9mIGJsb2NrcyAqLworICAgICAgICAgICAgICAgIHBhcmVudC0+dG9wLT5uZXh0ID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICAgICAgaWYoIGJsb2NrLT5uZXh0ICkKKyAgICAgICAgICAgICAgICAgICAgYmxvY2stPm5leHQtPnByZXYgPSBwYXJlbnQtPnRvcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGxpbmsgYmxvY2sgKi8KKyAgICAgICAgYmxvY2stPm5leHQgPSAwOworICAgICAgICBibG9jay0+cHJldiA9IHN0b3JhZ2UtPnRvcDsKKworICAgICAgICBpZiggc3RvcmFnZS0+dG9wICkKKyAgICAgICAgICAgIHN0b3JhZ2UtPnRvcC0+bmV4dCA9IGJsb2NrOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzdG9yYWdlLT50b3AgPSBzdG9yYWdlLT5ib3R0b20gPSBibG9jazsKKyAgICB9CisKKyAgICBpZiggc3RvcmFnZS0+dG9wLT5uZXh0ICkKKyAgICAgICAgc3RvcmFnZS0+dG9wID0gc3RvcmFnZS0+dG9wLT5uZXh0OworICAgIHN0b3JhZ2UtPmZyZWVfc3BhY2UgPSBzdG9yYWdlLT5ibG9ja19zaXplIC0gc2l6ZW9mKEN2TWVtQmxvY2spOworICAgIGFzc2VydCggc3RvcmFnZS0+ZnJlZV9zcGFjZSAlIENWX1NUUlVDVF9BTElHTiA9PSAwICk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFJlbWVtYmVyIG1lbW9yeSBzdG9yYWdlIHBvc2l0aW9uOiAqLworQ1ZfSU1QTCB2b2lkCitjdlNhdmVNZW1TdG9yYWdlUG9zKCBjb25zdCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLCBDdk1lbVN0b3JhZ2VQb3MgKiBwb3MgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTYXZlTWVtU3RvcmFnZVBvcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3RvcmFnZSB8fCAhcG9zICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBwb3MtPnRvcCA9IHN0b3JhZ2UtPnRvcDsKKyAgICBwb3MtPmZyZWVfc3BhY2UgPSBzdG9yYWdlLT5mcmVlX3NwYWNlOworCisgICAgX19FTkRfXzsKK30KKworCisvKiBSZXN0b3JlIG1lbW9yeSBzdG9yYWdlIHBvc2l0aW9uOiAqLworQ1ZfSU1QTCB2b2lkCitjdlJlc3RvcmVNZW1TdG9yYWdlUG9zKCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlLCBDdk1lbVN0b3JhZ2VQb3MgKiBwb3MgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSZXN0b3JlTWVtU3RvcmFnZVBvcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc3RvcmFnZSB8fCAhcG9zICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisgICAgaWYoIHBvcy0+ZnJlZV9zcGFjZSA+IHN0b3JhZ2UtPmJsb2NrX3NpemUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIiIgKTsKKworICAgIC8qCisgICAgLy8gdGhpcyBicmVha3MgaWN2R29OZXh0TWVtQmxvY2ssIHNvIGNvbW1lbnQgaXQgb2ZmIGZvciBub3cKKyAgICBpZiggc3RvcmFnZS0+cGFyZW50ICYmICghcG9zLT50b3AgfHwgcG9zLT50b3AtPm5leHQpICkKKyAgICB7CisgICAgICAgIEN2TWVtQmxvY2sqIHNhdmVfYm90dG9tOworICAgICAgICBpZiggIXBvcy0+dG9wICkKKyAgICAgICAgICAgIHNhdmVfYm90dG9tID0gMDsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzYXZlX2JvdHRvbSA9IHN0b3JhZ2UtPmJvdHRvbTsKKyAgICAgICAgICAgIHN0b3JhZ2UtPmJvdHRvbSA9IHBvcy0+dG9wLT5uZXh0OworICAgICAgICAgICAgcG9zLT50b3AtPm5leHQgPSAwOworICAgICAgICAgICAgc3RvcmFnZS0+Ym90dG9tLT5wcmV2ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpY3ZEZXN0cm95TWVtU3RvcmFnZSggc3RvcmFnZSApOworICAgICAgICBzdG9yYWdlLT5ib3R0b20gPSBzYXZlX2JvdHRvbTsKKyAgICB9Ki8KKworICAgIHN0b3JhZ2UtPnRvcCA9IHBvcy0+dG9wOworICAgIHN0b3JhZ2UtPmZyZWVfc3BhY2UgPSBwb3MtPmZyZWVfc3BhY2U7CisKKyAgICBpZiggIXN0b3JhZ2UtPnRvcCApCisgICAgeworICAgICAgICBzdG9yYWdlLT50b3AgPSBzdG9yYWdlLT5ib3R0b207CisgICAgICAgIHN0b3JhZ2UtPmZyZWVfc3BhY2UgPSBzdG9yYWdlLT50b3AgPyBzdG9yYWdlLT5ibG9ja19zaXplIC0gc2l6ZW9mKEN2TWVtQmxvY2spIDogMDsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEFsbG9jYXRlIGNvbnRpbnVvdXMgYnVmZmVyIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBpbiB0aGUgc3RvcmFnZTogKi8KK0NWX0lNUEwgdm9pZCoKK2N2TWVtU3RvcmFnZUFsbG9jKCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIHNpemVfdCBzaXplICkKK3sKKyAgICBzY2hhciAqcHRyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZNZW1TdG9yYWdlQWxsb2MiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgc3RvcmFnZSBwb2ludGVyIiApOworCisgICAgaWYoIHNpemUgPiBJTlRfTUFYICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUb28gbGFyZ2UgbWVtb3J5IGJsb2NrIGlzIHJlcXVlc3RlZCIgKTsKKworICAgIGFzc2VydCggc3RvcmFnZS0+ZnJlZV9zcGFjZSAlIENWX1NUUlVDVF9BTElHTiA9PSAwICk7CisKKyAgICBpZiggKHNpemVfdClzdG9yYWdlLT5mcmVlX3NwYWNlIDwgc2l6ZSApCisgICAgeworICAgICAgICBzaXplX3QgbWF4X2ZyZWVfc3BhY2UgPSBjdkFsaWduTGVmdChzdG9yYWdlLT5ibG9ja19zaXplIC0gc2l6ZW9mKEN2TWVtQmxvY2spLCBDVl9TVFJVQ1RfQUxJR04pOworICAgICAgICBpZiggbWF4X2ZyZWVfc3BhY2UgPCBzaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAicmVxdWVzdGVkIHNpemUgaXMgbmVnYXRpdmUgb3IgdG9vIGJpZyIgKTsKKworICAgICAgICBDVl9DQUxMKCBpY3ZHb05leHRNZW1CbG9jayggc3RvcmFnZSApKTsKKyAgICB9CisKKyAgICBwdHIgPSBJQ1ZfRlJFRV9QVFIoc3RvcmFnZSk7CisgICAgYXNzZXJ0KCAoc2l6ZV90KXB0ciAlIENWX1NUUlVDVF9BTElHTiA9PSAwICk7CisgICAgc3RvcmFnZS0+ZnJlZV9zcGFjZSA9IGN2QWxpZ25MZWZ0KHN0b3JhZ2UtPmZyZWVfc3BhY2UgLSAoaW50KXNpemUsIENWX1NUUlVDVF9BTElHTiApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworQ1ZfSU1QTCBDdlN0cmluZworY3ZNZW1TdG9yYWdlQWxsb2NTdHJpbmcoIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgY29uc3QgY2hhciogcHRyLCBpbnQgbGVuICkKK3sKKyAgICBDdlN0cmluZyBzdHI7CisgICAgQ1ZfRlVOQ05BTUUoICJjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHN0ci5sZW4gPSBsZW4gPj0gMCA/IGxlbiA6IChpbnQpc3RybGVuKHB0cik7CisgICAgQ1ZfQ0FMTCggc3RyLnB0ciA9IChjaGFyKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc3RyLmxlbiArIDEgKSk7CisgICAgbWVtY3B5KCBzdHIucHRyLCBwdHIsIHN0ci5sZW4gKTsKKyAgICBzdHIucHRyW3N0ci5sZW5dID0gJ1wwJzsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc3RyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlIGVtcHR5IHNlcXVlbmNlOiAqLworQ1ZfSU1QTCBDdlNlcSAqCitjdkNyZWF0ZVNlcSggaW50IHNlcV9mbGFncywgaW50IGhlYWRlcl9zaXplLCBpbnQgZWxlbV9zaXplLCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlICkKK3sKKyAgICBDdlNlcSAqc2VxID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVTZXEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpZiggaGVhZGVyX3NpemUgPCAoaW50KXNpemVvZiggQ3ZTZXEgKSB8fCBlbGVtX3NpemUgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworCisgICAgLyogYWxsb2NhdGUgc2VxdWVuY2UgaGVhZGVyICovCisgICAgQ1ZfQ0FMTCggc2VxID0gKEN2U2VxKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgaGVhZGVyX3NpemUgKSk7CisgICAgbWVtc2V0KCBzZXEsIDAsIGhlYWRlcl9zaXplICk7CisKKyAgICBzZXEtPmhlYWRlcl9zaXplID0gaGVhZGVyX3NpemU7CisgICAgc2VxLT5mbGFncyA9IChzZXFfZmxhZ3MgJiB+Q1ZfTUFHSUNfTUFTSykgfCBDVl9TRVFfTUFHSUNfVkFMOworICAgIHsKKyAgICAgICAgaW50IGVsZW10eXBlID0gQ1ZfTUFUX1RZUEUoc2VxX2ZsYWdzKTsKKyAgICAgICAgaW50IHR5cGVzaXplID0gQ1ZfRUxFTV9TSVpFKGVsZW10eXBlKTsKKworICAgICAgICBpZiggZWxlbXR5cGUgIT0gQ1ZfU0VRX0VMVFlQRV9HRU5FUklDICYmCisgICAgICAgICAgICB0eXBlc2l6ZSAhPSAwICYmIHR5cGVzaXplICE9IGVsZW1fc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgICAgICJTcGVjaWZpZWQgZWxlbWVudCBzaXplIGRvZXNuJ3QgbWF0Y2ggdG8gdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUgIgorICAgICAgICAgICAgIih0cnkgdG8gdXNlIDAgZm9yIGVsZW1lbnQgdHlwZSkiICk7CisgICAgfQorICAgIHNlcS0+ZWxlbV9zaXplID0gZWxlbV9zaXplOworICAgIHNlcS0+c3RvcmFnZSA9IHN0b3JhZ2U7CisKKyAgICBDVl9DQUxMKCBjdlNldFNlcUJsb2NrU2l6ZSggc2VxLCAoMSA8PCAxMCkvZWxlbV9zaXplICkpOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzZXE7Cit9CisKKworLyogYWRqdXN0cyA8ZGVsdGFfZWxlbXM+IGZpZWxkIG9mIHNlcXVlbmNlLiBJdCBkZXRlcm1pbmVzIGhvdyBtdWNoIHRoZSBzZXF1ZW5jZQorICAgZ3Jvd3MgaWYgdGhlcmUgYXJlIG5vIGZyZWUgc3BhY2UgaW5zaWRlIHRoZSBzZXF1ZW5jZSBidWZmZXJzICovCitDVl9JTVBMIHZvaWQKK2N2U2V0U2VxQmxvY2tTaXplKCBDdlNlcSAqc2VxLCBpbnQgZGVsdGFfZWxlbWVudHMgKQoreworICAgIGludCBlbGVtX3NpemU7CisgICAgaW50IHVzZWZ1bF9ibG9ja19zaXplOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNldFNlcUJsb2NrU2l6ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc2VxIHx8ICFzZXEtPnN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpZiggZGVsdGFfZWxlbWVudHMgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICB1c2VmdWxfYmxvY2tfc2l6ZSA9IGN2QWxpZ25MZWZ0KHNlcS0+c3RvcmFnZS0+YmxvY2tfc2l6ZSAtIHNpemVvZihDdk1lbUJsb2NrKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQ3ZTZXFCbG9jayksIENWX1NUUlVDVF9BTElHTik7CisgICAgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisKKyAgICBpZiggZGVsdGFfZWxlbWVudHMgPT0gMCApCisgICAgeworICAgICAgICBkZWx0YV9lbGVtZW50cyA9ICgxIDw8IDEwKSAvIGVsZW1fc2l6ZTsKKyAgICAgICAgZGVsdGFfZWxlbWVudHMgPSBNQVgoIGRlbHRhX2VsZW1lbnRzLCAxICk7CisgICAgfQorICAgIGlmKCBkZWx0YV9lbGVtZW50cyAqIGVsZW1fc2l6ZSA+IHVzZWZ1bF9ibG9ja19zaXplICkKKyAgICB7CisgICAgICAgIGRlbHRhX2VsZW1lbnRzID0gdXNlZnVsX2Jsb2NrX3NpemUgLyBlbGVtX3NpemU7CisgICAgICAgIGlmKCBkZWx0YV9lbGVtZW50cyA9PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiU3RvcmFnZSBibG9jayBzaXplIGlzIHRvbyBzbWFsbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvIGZpdCB0aGUgc2VxdWVuY2UgZWxlbWVudHMiICk7CisgICAgfQorCisgICAgc2VxLT5kZWx0YV9lbGVtcyA9IGRlbHRhX2VsZW1lbnRzOworCisgICAgX19FTkRfXzsKK30KKworCisvKiBGaW5kIGEgc2VxdWVuY2UgZWxlbWVudCBieSBpdHMgaW5kZXg6ICovCitDVl9JTVBMIHNjaGFyKgorY3ZHZXRTZXFFbGVtKCBjb25zdCBDdlNlcSAqc2VxLCBpbnQgaW5kZXggKQoreworICAgIEN2U2VxQmxvY2sgKmJsb2NrOworICAgIGludCBjb3VudCwgdG90YWwgPSBzZXEtPnRvdGFsOworCisgICAgaWYoICh1bnNpZ25lZClpbmRleCA+PSAodW5zaWduZWQpdG90YWwgKQorICAgIHsKKyAgICAgICAgaW5kZXggKz0gaW5kZXggPCAwID8gdG90YWwgOiAwOworICAgICAgICBpbmRleCAtPSBpbmRleCA+PSB0b3RhbCA/IHRvdGFsIDogMDsKKyAgICAgICAgaWYoICh1bnNpZ25lZClpbmRleCA+PSAodW5zaWduZWQpdG90YWwgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworICAgIGlmKCBpbmRleCArIGluZGV4IDw9IHRvdGFsICkKKyAgICB7CisgICAgICAgIHdoaWxlKCBpbmRleCA+PSAoY291bnQgPSBibG9jay0+Y291bnQpICkKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2sgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgIGluZGV4IC09IGNvdW50OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrID0gYmxvY2stPnByZXY7CisgICAgICAgICAgICB0b3RhbCAtPSBibG9jay0+Y291bnQ7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGluZGV4IDwgdG90YWwgKTsKKyAgICAgICAgaW5kZXggLT0gdG90YWw7CisgICAgfQorCisgICAgcmV0dXJuIGJsb2NrLT5kYXRhICsgaW5kZXggKiBzZXEtPmVsZW1fc2l6ZTsKK30KKworCisvKiBDYWxjdWxhdGUgaW5kZXggb2YgYSBzZXF1ZW5jZSBlbGVtZW50OiAqLworQ1ZfSU1QTCBpbnQKK2N2U2VxRWxlbUlkeCggY29uc3QgQ3ZTZXEqIHNlcSwgY29uc3Qgdm9pZCogX2VsZW1lbnQsIEN2U2VxQmxvY2sqKiBfYmxvY2sgKQoreworICAgIGNvbnN0IHNjaGFyICplbGVtZW50ID0gKGNvbnN0IHNjaGFyICopX2VsZW1lbnQ7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBpbnQgaWQgPSAtMTsKKyAgICBDdlNlcUJsb2NrICpmaXJzdF9ibG9jazsKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFFbGVtSWR4IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzZXEgfHwgIWVsZW1lbnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGJsb2NrID0gZmlyc3RfYmxvY2sgPSBzZXEtPmZpcnN0OworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworCisgICAgZm9yKCA7OyApCisgICAgeworICAgICAgICBpZiggKHVuc2lnbmVkKShlbGVtZW50IC0gYmxvY2stPmRhdGEpIDwgKHVuc2lnbmVkKSAoYmxvY2stPmNvdW50ICogZWxlbV9zaXplKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBfYmxvY2sgKQorICAgICAgICAgICAgICAgICpfYmxvY2sgPSBibG9jazsKKyAgICAgICAgICAgIGlmKCBlbGVtX3NpemUgPD0gSUNWX1NISUZUX1RBQl9NQVggJiYgKGlkID0gaWN2UG93ZXIyU2hpZnRUYWJbZWxlbV9zaXplIC0gMV0pID49IDAgKQorICAgICAgICAgICAgICAgIGlkID0gKGludCkoKHNpemVfdCkoZWxlbWVudCAtIGJsb2NrLT5kYXRhKSA+PiBpZCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWQgPSAoaW50KSgoc2l6ZV90KShlbGVtZW50IC0gYmxvY2stPmRhdGEpIC8gZWxlbV9zaXplKTsKKyAgICAgICAgICAgIGlkICs9IGJsb2NrLT5zdGFydF9pbmRleCAtIHNlcS0+Zmlyc3QtPnN0YXJ0X2luZGV4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2sgPSBibG9jay0+bmV4dDsKKyAgICAgICAgaWYoIGJsb2NrID09IGZpcnN0X2Jsb2NrICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gaWQ7Cit9CisKKworQ1ZfSU1QTCBpbnQKK2N2U2xpY2VMZW5ndGgoIEN2U2xpY2Ugc2xpY2UsIGNvbnN0IEN2U2VxKiBzZXEgKQoreworICAgIGludCB0b3RhbCA9IHNlcS0+dG90YWw7CisgICAgaW50IGxlbmd0aCA9IHNsaWNlLmVuZF9pbmRleCAtIHNsaWNlLnN0YXJ0X2luZGV4OworCisgICAgaWYoIGxlbmd0aCAhPSAwICkKKyAgICB7CisgICAgICAgIGlmKCBzbGljZS5zdGFydF9pbmRleCA8IDAgKQorICAgICAgICAgICAgc2xpY2Uuc3RhcnRfaW5kZXggKz0gdG90YWw7CisgICAgICAgIGlmKCBzbGljZS5lbmRfaW5kZXggPD0gMCApCisgICAgICAgICAgICBzbGljZS5lbmRfaW5kZXggKz0gdG90YWw7CisKKyAgICAgICAgbGVuZ3RoID0gc2xpY2UuZW5kX2luZGV4IC0gc2xpY2Uuc3RhcnRfaW5kZXg7CisgICAgfQorCisgICAgaWYoIGxlbmd0aCA8IDAgKQorICAgIHsKKyAgICAgICAgbGVuZ3RoICs9IHRvdGFsOworICAgICAgICAvKmlmKCBsZW5ndGggPCAwICkKKyAgICAgICAgICAgIGxlbmd0aCArPSB0b3RhbDsqLworICAgIH0KKyAgICBlbHNlIGlmKCBsZW5ndGggPiB0b3RhbCApCisgICAgICAgIGxlbmd0aCA9IHRvdGFsOworCisgICAgcmV0dXJuIGxlbmd0aDsKK30KKworCisvKiBDb3B5IGFsbCBzZXF1ZW5jZSBlbGVtZW50cyBpbnRvIHNpbmdsZSBjb250aW51b3VzIGFycmF5OiAqLworQ1ZfSU1QTCB2b2lkKgorY3ZDdnRTZXFUb0FycmF5KCBjb25zdCBDdlNlcSAqc2VxLCB2b2lkICphcnJheSwgQ3ZTbGljZSBzbGljZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkN2dFNlcVRvQXJyYXkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgZWxlbV9zaXplLCB0b3RhbDsKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgY2hhciAqZHN0ID0gKGNoYXIqKWFycmF5OworCisgICAgaWYoICFzZXEgfHwgIWFycmF5ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICB0b3RhbCA9IGN2U2xpY2VMZW5ndGgoIHNsaWNlLCBzZXEgKSplbGVtX3NpemU7CisKKyAgICBpZiggdG90YWwgPT0gMCApCisgICAgICAgIEVYSVQ7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyLCAwICk7CisgICAgQ1ZfQ0FMTCggY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHNsaWNlLnN0YXJ0X2luZGV4LCAwICkpOworCisgICAgZG8KKyAgICB7CisgICAgICAgIGludCBjb3VudCA9IChpbnQpKHJlYWRlci5ibG9ja19tYXggLSByZWFkZXIucHRyKTsKKyAgICAgICAgaWYoIGNvdW50ID4gdG90YWwgKQorICAgICAgICAgICAgY291bnQgPSB0b3RhbDsKKworICAgICAgICBtZW1jcHkoIGRzdCwgcmVhZGVyLnB0ciwgY291bnQgKTsKKyAgICAgICAgZHN0ICs9IGNvdW50OworICAgICAgICByZWFkZXIuYmxvY2sgPSByZWFkZXIuYmxvY2stPm5leHQ7CisgICAgICAgIHJlYWRlci5wdHIgPSByZWFkZXIuYmxvY2stPmRhdGE7CisgICAgICAgIHJlYWRlci5ibG9ja19tYXggPSByZWFkZXIucHRyICsgcmVhZGVyLmJsb2NrLT5jb3VudCplbGVtX3NpemU7CisgICAgICAgIHRvdGFsIC09IGNvdW50OworICAgIH0KKyAgICB3aGlsZSggdG90YWwgPiAwICk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGFycmF5OworfQorCisKKy8qIENvbnN0cnVjdCBhIHNlcXVlbmNlIGZyb20gYW4gYXJyYXkgd2l0aG91dCBjb3B5aW5nIGFueSBkYXRhLgorICAgTkI6IFRoZSByZXN1bHRhbnQgc2VxdWVuY2UgY2Fubm90IGdyb3cgYmV5b25kIGl0cyBpbml0aWFsIHNpemU6ICovCitDVl9JTVBMIEN2U2VxKgorY3ZNYWtlU2VxSGVhZGVyRm9yQXJyYXkoIGludCBzZXFfZmxhZ3MsIGludCBoZWFkZXJfc2l6ZSwgaW50IGVsZW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICphcnJheSwgaW50IHRvdGFsLCBDdlNlcSAqc2VxLCBDdlNlcUJsb2NrICogYmxvY2sgKQoreworICAgIEN2U2VxKiByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1ha2VTZXFIZWFkZXJGb3JBcnJheSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBlbGVtX3NpemUgPD0gMCB8fCBoZWFkZXJfc2l6ZSA8IChpbnQpc2l6ZW9mKCBDdlNlcSApIHx8IHRvdGFsIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworCisgICAgaWYoICFzZXEgfHwgKCghYXJyYXkgfHwgIWJsb2NrKSAmJiB0b3RhbCA+IDApICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBtZW1zZXQoIHNlcSwgMCwgaGVhZGVyX3NpemUgKTsKKworICAgIHNlcS0+aGVhZGVyX3NpemUgPSBoZWFkZXJfc2l6ZTsKKyAgICBzZXEtPmZsYWdzID0gKHNlcV9mbGFncyAmIH5DVl9NQUdJQ19NQVNLKSB8IENWX1NFUV9NQUdJQ19WQUw7CisgICAgeworICAgICAgICBpbnQgZWxlbXR5cGUgPSBDVl9NQVRfVFlQRShzZXFfZmxhZ3MpOworICAgICAgICBpbnQgdHlwZXNpemUgPSBDVl9FTEVNX1NJWkUoZWxlbXR5cGUpOworCisgICAgICAgIGlmKCBlbGVtdHlwZSAhPSBDVl9TRVFfRUxUWVBFX0dFTkVSSUMgJiYKKyAgICAgICAgICAgIHR5cGVzaXplICE9IDAgJiYgdHlwZXNpemUgIT0gZWxlbV9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIkVsZW1lbnQgc2l6ZSBkb2Vzbid0IG1hdGNoIHRvIHRoZSBzaXplIG9mIHByZWRlZmluZWQgZWxlbWVudCB0eXBlICIKKyAgICAgICAgICAgICIodHJ5IHRvIHVzZSAwIGZvciBzZXF1ZW5jZSBlbGVtZW50IHR5cGUpIiApOworICAgIH0KKyAgICBzZXEtPmVsZW1fc2l6ZSA9IGVsZW1fc2l6ZTsKKyAgICBzZXEtPnRvdGFsID0gdG90YWw7CisgICAgc2VxLT5ibG9ja19tYXggPSBzZXEtPnB0ciA9IChzY2hhciAqKSBhcnJheSArIHRvdGFsICogZWxlbV9zaXplOworCisgICAgaWYoIHRvdGFsID4gMCApCisgICAgeworICAgICAgICBzZXEtPmZpcnN0ID0gYmxvY2s7CisgICAgICAgIGJsb2NrLT5wcmV2ID0gYmxvY2stPm5leHQgPSBibG9jazsKKyAgICAgICAgYmxvY2stPnN0YXJ0X2luZGV4ID0gMDsKKyAgICAgICAgYmxvY2stPmNvdW50ID0gdG90YWw7CisgICAgICAgIGJsb2NrLT5kYXRhID0gKHNjaGFyICopIGFycmF5OworICAgIH0KKworICAgIHJlc3VsdCA9IHNlcTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFRoZSBmdW5jdGlvbiBhbGxvY2F0ZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBtb3JlIHNlcXVlbmNlIGVsZW1lbnQuCisgICBJZiB0aGVyZSBhcmUgZnJlZSBzZXF1ZW5jZSBibG9ja3MgKHNlcS0+ZnJlZV9ibG9ja3MgIT0gMCkKKyAgIHRoZXkgYXJlIHJldXNlZCwgb3RoZXJ3aXNlIHRoZSBzcGFjZSBpcyBhbGxvY2F0ZWQgaW4gdGhlIHN0b3JhZ2U6ICovCitzdGF0aWMgdm9pZAoraWN2R3Jvd1NlcSggQ3ZTZXEgKnNlcSwgaW50IGluX2Zyb250X29mICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdkdyb3dTZXEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKworICAgIGlmKCAhc2VxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisgICAgYmxvY2sgPSBzZXEtPmZyZWVfYmxvY2tzOworCisgICAgaWYoICFibG9jayApCisgICAgeworICAgICAgICBpbnQgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisgICAgICAgIGludCBkZWx0YV9lbGVtcyA9IHNlcS0+ZGVsdGFfZWxlbXM7CisgICAgICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSA9IHNlcS0+c3RvcmFnZTsKKworICAgICAgICBpZiggc2VxLT50b3RhbCA+PSBkZWx0YV9lbGVtcyo0ICkKKyAgICAgICAgICAgIGN2U2V0U2VxQmxvY2tTaXplKCBzZXEsIGRlbHRhX2VsZW1zKjIgKTsKKworICAgICAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJUaGUgc2VxdWVuY2UgaGFzIE5VTEwgc3RvcmFnZSBwb2ludGVyIiApOworCisgICAgICAgIC8qIElmIHRoZXJlIGlzIGEgZnJlZSBzcGFjZSBqdXN0IGFmdGVyIGxhc3QgYWxsb2NhdGVkIGJsb2NrCisgICAgICAgICAgIGFuZCBpdCBpcyBiaWcgZW5vdWdoIHRoZW4gZW5sYXJnZSB0aGUgbGFzdCBibG9jay4KKyAgICAgICAgICAgVGhpcyBjYW4gaGFwcGVuIG9ubHkgaWYgdGhlIG5ldyBibG9jayBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHNlcXVlbmNlOiAqLworICAgICAgICBpZiggKHVuc2lnbmVkKShJQ1ZfRlJFRV9QVFIoc3RvcmFnZSkgLSBzZXEtPmJsb2NrX21heCkgPCBDVl9TVFJVQ1RfQUxJR04gJiYKKyAgICAgICAgICAgIHN0b3JhZ2UtPmZyZWVfc3BhY2UgPj0gc2VxLT5lbGVtX3NpemUgJiYgIWluX2Zyb250X29mICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlbHRhID0gc3RvcmFnZS0+ZnJlZV9zcGFjZSAvIGVsZW1fc2l6ZTsKKworICAgICAgICAgICAgZGVsdGEgPSBNSU4oIGRlbHRhLCBkZWx0YV9lbGVtcyApICogZWxlbV9zaXplOworICAgICAgICAgICAgc2VxLT5ibG9ja19tYXggKz0gZGVsdGE7CisgICAgICAgICAgICBzdG9yYWdlLT5mcmVlX3NwYWNlID0gY3ZBbGlnbkxlZnQoKGludCkoKChzY2hhciopc3RvcmFnZS0+dG9wICsgc3RvcmFnZS0+YmxvY2tfc2l6ZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcS0+YmxvY2tfbWF4KSwgQ1ZfU1RSVUNUX0FMSUdOICk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlbHRhID0gZWxlbV9zaXplICogZGVsdGFfZWxlbXMgKyBJQ1ZfQUxJR05FRF9TRVFfQkxPQ0tfU0laRTsKKworICAgICAgICAgICAgLyogVHJ5IHRvIGFsbG9jYXRlIDxkZWx0YV9lbGVtZW50cz4gZWxlbWVudHM6ICovCisgICAgICAgICAgICBpZiggc3RvcmFnZS0+ZnJlZV9zcGFjZSA8IGRlbHRhICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc21hbGxfYmxvY2tfc2l6ZSA9IE1BWCgxLCBkZWx0YV9lbGVtcy8zKSplbGVtX3NpemUgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX0FMSUdORURfU0VRX0JMT0NLX1NJWkU7CisgICAgICAgICAgICAgICAgLyogdHJ5IHRvIGFsbG9jYXRlIHNtYWxsZXIgcGFydCAqLworICAgICAgICAgICAgICAgIGlmKCBzdG9yYWdlLT5mcmVlX3NwYWNlID49IHNtYWxsX2Jsb2NrX3NpemUgKyBDVl9TVFJVQ1RfQUxJR04gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAoc3RvcmFnZS0+ZnJlZV9zcGFjZSAtIElDVl9BTElHTkVEX1NFUV9CTE9DS19TSVpFKS9zZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBkZWx0YSpzZXEtPmVsZW1fc2l6ZSArIElDVl9BTElHTkVEX1NFUV9CTE9DS19TSVpFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBpY3ZHb05leHRNZW1CbG9jayggc3RvcmFnZSApKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBzdG9yYWdlLT5mcmVlX3NwYWNlID49IGRlbHRhICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVl9DQUxMKCBibG9jayA9IChDdlNlcUJsb2NrKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgZGVsdGEgKSk7CisgICAgICAgICAgICBibG9jay0+ZGF0YSA9IChzY2hhciopY3ZBbGlnblB0ciggYmxvY2sgKyAxLCBDVl9TVFJVQ1RfQUxJR04gKTsKKyAgICAgICAgICAgIGJsb2NrLT5jb3VudCA9IGRlbHRhIC0gSUNWX0FMSUdORURfU0VRX0JMT0NLX1NJWkU7CisgICAgICAgICAgICBibG9jay0+cHJldiA9IGJsb2NrLT5uZXh0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzZXEtPmZyZWVfYmxvY2tzID0gYmxvY2stPm5leHQ7CisgICAgfQorCisgICAgaWYoICEoc2VxLT5maXJzdCkgKQorICAgIHsKKyAgICAgICAgc2VxLT5maXJzdCA9IGJsb2NrOworICAgICAgICBibG9jay0+cHJldiA9IGJsb2NrLT5uZXh0ID0gYmxvY2s7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJsb2NrLT5wcmV2ID0gc2VxLT5maXJzdC0+cHJldjsKKyAgICAgICAgYmxvY2stPm5leHQgPSBzZXEtPmZpcnN0OworICAgICAgICBibG9jay0+cHJldi0+bmV4dCA9IGJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2s7CisgICAgfQorCisgICAgLyogRm9yIGZyZWUgYmxvY2tzIHRoZSA8Y291bnQ+IGZpZWxkIG1lYW5zCisgICAgICogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIEZvciB1c2VkIGJsb2NrcyBpdCBtZWFucyBjdXJyZW50IG51bWJlcgorICAgICAqIG9mIHNlcXVlbmNlIGVsZW1lbnRzIGluIHRoZSBibG9jazoKKyAgICAgKi8KKyAgICBhc3NlcnQoIGJsb2NrLT5jb3VudCAlIHNlcS0+ZWxlbV9zaXplID09IDAgJiYgYmxvY2stPmNvdW50ID4gMCApOworCisgICAgaWYoICFpbl9mcm9udF9vZiApCisgICAgeworICAgICAgICBzZXEtPnB0ciA9IGJsb2NrLT5kYXRhOworICAgICAgICBzZXEtPmJsb2NrX21heCA9IGJsb2NrLT5kYXRhICsgYmxvY2stPmNvdW50OworICAgICAgICBibG9jay0+c3RhcnRfaW5kZXggPSBibG9jayA9PSBibG9jay0+cHJldiA/IDAgOgorICAgICAgICAgICAgYmxvY2stPnByZXYtPnN0YXJ0X2luZGV4ICsgYmxvY2stPnByZXYtPmNvdW50OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgZGVsdGEgPSBibG9jay0+Y291bnQgLyBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgYmxvY2stPmRhdGEgKz0gYmxvY2stPmNvdW50OworCisgICAgICAgIGlmKCBibG9jayAhPSBibG9jay0+cHJldiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggc2VxLT5maXJzdC0+c3RhcnRfaW5kZXggPT0gMCApOworICAgICAgICAgICAgc2VxLT5maXJzdCA9IGJsb2NrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2VxLT5ibG9ja19tYXggPSBzZXEtPnB0ciA9IGJsb2NrLT5kYXRhOworICAgICAgICB9CisKKyAgICAgICAgYmxvY2stPnN0YXJ0X2luZGV4ID0gMDsKKworICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2stPnN0YXJ0X2luZGV4ICs9IGRlbHRhOworICAgICAgICAgICAgYmxvY2sgPSBibG9jay0+bmV4dDsKKyAgICAgICAgICAgIGlmKCBibG9jayA9PSBzZXEtPmZpcnN0ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJsb2NrLT5jb3VudCA9IDA7CisKKyAgICBfX0VORF9fOworfQorCisvKiBSZWN5Y2xlIGEgc2VxdWVuY2UgYmxvY2s6ICovCitzdGF0aWMgdm9pZAoraWN2RnJlZVNlcUJsb2NrKCBDdlNlcSAqc2VxLCBpbnQgaW5fZnJvbnRfb2YgKQoreworICAgIC8qQ1ZfRlVOQ05BTUUoICJpY3ZGcmVlU2VxQmxvY2siICk7Ki8KKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxQmxvY2sgKmJsb2NrID0gc2VxLT5maXJzdDsKKworICAgIGFzc2VydCggKGluX2Zyb250X29mID8gYmxvY2sgOiBibG9jay0+cHJldiktPmNvdW50ID09IDAgKTsKKworICAgIGlmKCBibG9jayA9PSBibG9jay0+cHJldiApICAvKiBzaW5nbGUgYmxvY2sgY2FzZSAqLworICAgIHsKKyAgICAgICAgYmxvY2stPmNvdW50ID0gKGludCkoc2VxLT5ibG9ja19tYXggLSBibG9jay0+ZGF0YSkgKyBibG9jay0+c3RhcnRfaW5kZXggKiBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgYmxvY2stPmRhdGEgPSBzZXEtPmJsb2NrX21heCAtIGJsb2NrLT5jb3VudDsKKyAgICAgICAgc2VxLT5maXJzdCA9IDA7CisgICAgICAgIHNlcS0+cHRyID0gc2VxLT5ibG9ja19tYXggPSAwOworICAgICAgICBzZXEtPnRvdGFsID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICFpbl9mcm9udF9vZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJsb2NrID0gYmxvY2stPnByZXY7CisgICAgICAgICAgICBhc3NlcnQoIHNlcS0+cHRyID09IGJsb2NrLT5kYXRhICk7CisKKyAgICAgICAgICAgIGJsb2NrLT5jb3VudCA9IChpbnQpKHNlcS0+YmxvY2tfbWF4IC0gc2VxLT5wdHIpOworICAgICAgICAgICAgc2VxLT5ibG9ja19tYXggPSBzZXEtPnB0ciA9IGJsb2NrLT5wcmV2LT5kYXRhICsKKyAgICAgICAgICAgICAgICBibG9jay0+cHJldi0+Y291bnQgKiBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZWx0YSA9IGJsb2NrLT5zdGFydF9pbmRleDsKKworICAgICAgICAgICAgYmxvY2stPmNvdW50ID0gZGVsdGEgKiBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGJsb2NrLT5kYXRhIC09IGJsb2NrLT5jb3VudDsKKworICAgICAgICAgICAgLyogVXBkYXRlIHN0YXJ0IGluZGljZXMgb2Ygc2VxdWVuY2UgYmxvY2tzOiAqLworICAgICAgICAgICAgZm9yKCA7OyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2stPnN0YXJ0X2luZGV4IC09IGRlbHRhOworICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICAgICAgaWYoIGJsb2NrID09IHNlcS0+Zmlyc3QgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc2VxLT5maXJzdCA9IGJsb2NrLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgYmxvY2stPnByZXYtPm5leHQgPSBibG9jay0+bmV4dDsKKyAgICAgICAgYmxvY2stPm5leHQtPnByZXYgPSBibG9jay0+cHJldjsKKyAgICB9CisKKyAgICBhc3NlcnQoIGJsb2NrLT5jb3VudCA+IDAgJiYgYmxvY2stPmNvdW50ICUgc2VxLT5lbGVtX3NpemUgPT0gMCApOworICAgIGJsb2NrLT5uZXh0ID0gc2VxLT5mcmVlX2Jsb2NrczsKKyAgICBzZXEtPmZyZWVfYmxvY2tzID0gYmxvY2s7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2UgV3JpdGVyIGltcGxlbWVudGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhbGl6ZSBzZXF1ZW5jZSB3cml0ZXI6ICovCitDVl9JTVBMIHZvaWQKK2N2U3RhcnRBcHBlbmRUb1NlcSggQ3ZTZXEgKnNlcSwgQ3ZTZXFXcml0ZXIgKiB3cml0ZXIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdGFydEFwcGVuZFRvU2VxIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzZXEgfHwgIXdyaXRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgbWVtc2V0KCB3cml0ZXIsIDAsIHNpemVvZiggKndyaXRlciApKTsKKyAgICB3cml0ZXItPmhlYWRlcl9zaXplID0gc2l6ZW9mKCBDdlNlcVdyaXRlciApOworCisgICAgd3JpdGVyLT5zZXEgPSBzZXE7CisgICAgd3JpdGVyLT5ibG9jayA9IHNlcS0+Zmlyc3QgPyBzZXEtPmZpcnN0LT5wcmV2IDogMDsKKyAgICB3cml0ZXItPnB0ciA9IHNlcS0+cHRyOworICAgIHdyaXRlci0+YmxvY2tfbWF4ID0gc2VxLT5ibG9ja19tYXg7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIEluaXRpYWxpemUgc2VxdWVuY2Ugd3JpdGVyOiAqLworQ1ZfSU1QTCB2b2lkCitjdlN0YXJ0V3JpdGVTZXEoIGludCBzZXFfZmxhZ3MsIGludCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgaW50IGVsZW1fc2l6ZSwgQ3ZNZW1TdG9yYWdlICogc3RvcmFnZSwgQ3ZTZXFXcml0ZXIgKiB3cml0ZXIgKQoreworICAgIEN2U2VxICpzZXEgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlN0YXJ0V3JpdGVTZXEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgfHwgIXdyaXRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgQ1ZfQ0FMTCggc2VxID0gY3ZDcmVhdGVTZXEoIHNlcV9mbGFncywgaGVhZGVyX3NpemUsIGVsZW1fc2l6ZSwgc3RvcmFnZSApKTsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIHNlcSwgd3JpdGVyICk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFVwZGF0ZSBzZXF1ZW5jZSBoZWFkZXI6ICovCitDVl9JTVBMIHZvaWQKK2N2Rmx1c2hTZXFXcml0ZXIoIEN2U2VxV3JpdGVyICogd3JpdGVyICkKK3sKKyAgICBDdlNlcSAqc2VxID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZGbHVzaFNlcVdyaXRlciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhd3JpdGVyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBzZXEgPSB3cml0ZXItPnNlcTsKKyAgICBzZXEtPnB0ciA9IHdyaXRlci0+cHRyOworCisgICAgaWYoIHdyaXRlci0+YmxvY2sgKQorICAgIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgQ3ZTZXFCbG9jayAqZmlyc3RfYmxvY2sgPSB3cml0ZXItPnNlcS0+Zmlyc3Q7CisgICAgICAgIEN2U2VxQmxvY2sgKmJsb2NrID0gZmlyc3RfYmxvY2s7CisKKyAgICAgICAgd3JpdGVyLT5ibG9jay0+Y291bnQgPSAoaW50KSgod3JpdGVyLT5wdHIgLSB3cml0ZXItPmJsb2NrLT5kYXRhKSAvIHNlcS0+ZWxlbV9zaXplKTsKKyAgICAgICAgYXNzZXJ0KCB3cml0ZXItPmJsb2NrLT5jb3VudCA+IDAgKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICB0b3RhbCArPSBibG9jay0+Y291bnQ7CisgICAgICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBibG9jayAhPSBmaXJzdF9ibG9jayApOworCisgICAgICAgIHdyaXRlci0+c2VxLT50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogQ2FsbHMgaWN2Rmx1c2hTZXFXcml0ZXIgYW5kIGZpbmlzaGVzIHdyaXRpbmcgcHJvY2VzczogKi8KK0NWX0lNUEwgQ3ZTZXEgKgorY3ZFbmRXcml0ZVNlcSggQ3ZTZXFXcml0ZXIgKiB3cml0ZXIgKQoreworICAgIEN2U2VxICpzZXEgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkVuZFdyaXRlU2VxIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICF3cml0ZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIENWX0NBTEwoIGN2Rmx1c2hTZXFXcml0ZXIoIHdyaXRlciApKTsKKyAgICBzZXEgPSB3cml0ZXItPnNlcTsKKworICAgIC8qIFRydW5jYXRlIHRoZSBsYXN0IGJsb2NrOiAqLworICAgIGlmKCB3cml0ZXItPmJsb2NrICYmIHdyaXRlci0+c2VxLT5zdG9yYWdlICkKKyAgICB7CisgICAgICAgIEN2TWVtU3RvcmFnZSAqc3RvcmFnZSA9IHNlcS0+c3RvcmFnZTsKKyAgICAgICAgc2NoYXIgKnN0b3JhZ2VfYmxvY2tfbWF4ID0gKHNjaGFyICopIHN0b3JhZ2UtPnRvcCArIHN0b3JhZ2UtPmJsb2NrX3NpemU7CisKKyAgICAgICAgYXNzZXJ0KCB3cml0ZXItPmJsb2NrLT5jb3VudCA+IDAgKTsKKworICAgICAgICBpZiggKHVuc2lnbmVkKSgoc3RvcmFnZV9ibG9ja19tYXggLSBzdG9yYWdlLT5mcmVlX3NwYWNlKQorICAgICAgICAgICAgLSBzZXEtPmJsb2NrX21heCkgPCBDVl9TVFJVQ1RfQUxJR04gKQorICAgICAgICB7CisgICAgICAgICAgICBzdG9yYWdlLT5mcmVlX3NwYWNlID0gY3ZBbGlnbkxlZnQoKGludCkoc3RvcmFnZV9ibG9ja19tYXggLSBzZXEtPnB0ciksIENWX1NUUlVDVF9BTElHTik7CisgICAgICAgICAgICBzZXEtPmJsb2NrX21heCA9IHNlcS0+cHRyOworICAgICAgICB9CisgICAgfQorCisgICAgd3JpdGVyLT5wdHIgPSAwOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzZXE7Cit9CisKKworLyogQ3JlYXRlIG5ldyBzZXF1ZW5jZSBibG9jazogKi8KK0NWX0lNUEwgdm9pZAorY3ZDcmVhdGVTZXFCbG9jayggQ3ZTZXFXcml0ZXIgKiB3cml0ZXIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVTZXFCbG9jayIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxICpzZXE7CisKKyAgICBpZiggIXdyaXRlciB8fCAhd3JpdGVyLT5zZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHNlcSA9IHdyaXRlci0+c2VxOworCisgICAgY3ZGbHVzaFNlcVdyaXRlciggd3JpdGVyICk7CisKKyAgICBDVl9DQUxMKCBpY3ZHcm93U2VxKCBzZXEsIDAgKSk7CisKKyAgICB3cml0ZXItPmJsb2NrID0gc2VxLT5maXJzdC0+cHJldjsKKyAgICB3cml0ZXItPnB0ciA9IHNlcS0+cHRyOworICAgIHdyaXRlci0+YmxvY2tfbWF4ID0gc2VxLT5ibG9ja19tYXg7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBSZWFkZXIgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSW5pdGlhbGl6ZSBzZXF1ZW5jZSByZWFkZXI6ICovCitDVl9JTVBMIHZvaWQKK2N2U3RhcnRSZWFkU2VxKCBjb25zdCBDdlNlcSAqc2VxLCBDdlNlcVJlYWRlciAqIHJlYWRlciwgaW50IHJldmVyc2UgKQoreworICAgIEN2U2VxQmxvY2sgKmZpcnN0X2Jsb2NrOworICAgIEN2U2VxQmxvY2sgKmxhc3RfYmxvY2s7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U3RhcnRSZWFkU2VxIiApOworCisgICAgaWYoIHJlYWRlciApCisgICAgeworICAgICAgICByZWFkZXItPnNlcSA9IDA7CisgICAgICAgIHJlYWRlci0+YmxvY2sgPSAwOworICAgICAgICByZWFkZXItPnB0ciA9IHJlYWRlci0+YmxvY2tfbWF4ID0gcmVhZGVyLT5ibG9ja19taW4gPSAwOworICAgIH0KKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc2VxIHx8ICFyZWFkZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHJlYWRlci0+aGVhZGVyX3NpemUgPSBzaXplb2YoIEN2U2VxUmVhZGVyICk7CisgICAgcmVhZGVyLT5zZXEgPSAoQ3ZTZXEqKXNlcTsKKworICAgIGZpcnN0X2Jsb2NrID0gc2VxLT5maXJzdDsKKworICAgIGlmKCBmaXJzdF9ibG9jayApCisgICAgeworICAgICAgICBsYXN0X2Jsb2NrID0gZmlyc3RfYmxvY2stPnByZXY7CisgICAgICAgIHJlYWRlci0+cHRyID0gZmlyc3RfYmxvY2stPmRhdGE7CisgICAgICAgIHJlYWRlci0+cHJldl9lbGVtID0gQ1ZfR0VUX0xBU1RfRUxFTSggc2VxLCBsYXN0X2Jsb2NrICk7CisgICAgICAgIHJlYWRlci0+ZGVsdGFfaW5kZXggPSBzZXEtPmZpcnN0LT5zdGFydF9pbmRleDsKKworICAgICAgICBpZiggcmV2ZXJzZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaGFyICp0ZW1wID0gcmVhZGVyLT5wdHI7CisKKyAgICAgICAgICAgIHJlYWRlci0+cHRyID0gcmVhZGVyLT5wcmV2X2VsZW07CisgICAgICAgICAgICByZWFkZXItPnByZXZfZWxlbSA9IHRlbXA7CisKKyAgICAgICAgICAgIHJlYWRlci0+YmxvY2sgPSBsYXN0X2Jsb2NrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcmVhZGVyLT5ibG9jayA9IGZpcnN0X2Jsb2NrOworICAgICAgICB9CisKKyAgICAgICAgcmVhZGVyLT5ibG9ja19taW4gPSByZWFkZXItPmJsb2NrLT5kYXRhOworICAgICAgICByZWFkZXItPmJsb2NrX21heCA9IHJlYWRlci0+YmxvY2tfbWluICsgcmVhZGVyLT5ibG9jay0+Y291bnQgKiBzZXEtPmVsZW1fc2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVhZGVyLT5kZWx0YV9pbmRleCA9IDA7CisgICAgICAgIHJlYWRlci0+YmxvY2sgPSAwOworCisgICAgICAgIHJlYWRlci0+cHRyID0gcmVhZGVyLT5wcmV2X2VsZW0gPSByZWFkZXItPmJsb2NrX21pbiA9IHJlYWRlci0+YmxvY2tfbWF4ID0gMDsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIENoYW5nZSB0aGUgY3VycmVudCByZWFkaW5nIGJsb2NrCisgKiB0byB0aGUgcHJldmlvdXMgb3IgdG8gdGhlIG5leHQ6CisgKi8KK0NWX0lNUEwgdm9pZAorY3ZDaGFuZ2VTZXFCbG9jayggdm9pZCogX3JlYWRlciwgaW50IGRpcmVjdGlvbiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNoYW5nZVNlcUJsb2NrIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXFSZWFkZXIqIHJlYWRlciA9IChDdlNlcVJlYWRlciopX3JlYWRlcjsKKworICAgIGlmKCAhcmVhZGVyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggZGlyZWN0aW9uID4gMCApCisgICAgeworICAgICAgICByZWFkZXItPmJsb2NrID0gcmVhZGVyLT5ibG9jay0+bmV4dDsKKyAgICAgICAgcmVhZGVyLT5wdHIgPSByZWFkZXItPmJsb2NrLT5kYXRhOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZWFkZXItPmJsb2NrID0gcmVhZGVyLT5ibG9jay0+cHJldjsKKyAgICAgICAgcmVhZGVyLT5wdHIgPSBDVl9HRVRfTEFTVF9FTEVNKCByZWFkZXItPnNlcSwgcmVhZGVyLT5ibG9jayApOworICAgIH0KKyAgICByZWFkZXItPmJsb2NrX21pbiA9IHJlYWRlci0+YmxvY2stPmRhdGE7CisgICAgcmVhZGVyLT5ibG9ja19tYXggPSByZWFkZXItPmJsb2NrX21pbiArIHJlYWRlci0+YmxvY2stPmNvdW50ICogcmVhZGVyLT5zZXEtPmVsZW1fc2l6ZTsKKworICAgIF9fRU5EX187Cit9CisKKworLyogUmV0dXJuIHRoZSBjdXJyZW50IHJlYWRlciBwb3NpdGlvbjogKi8KK0NWX0lNUEwgaW50CitjdkdldFNlcVJlYWRlclBvcyggQ3ZTZXFSZWFkZXIqIHJlYWRlciApCit7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBpbnQgaW5kZXggPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRTZXFSZWFkZXJQb3MiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXJlYWRlciB8fCAhcmVhZGVyLT5wdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGVsZW1fc2l6ZSA9IHJlYWRlci0+c2VxLT5lbGVtX3NpemU7CisgICAgaWYoIGVsZW1fc2l6ZSA8PSBJQ1ZfU0hJRlRfVEFCX01BWCAmJiAoaW5kZXggPSBpY3ZQb3dlcjJTaGlmdFRhYltlbGVtX3NpemUgLSAxXSkgPj0gMCApCisgICAgICAgIGluZGV4ID0gKGludCkoKHJlYWRlci0+cHRyIC0gcmVhZGVyLT5ibG9ja19taW4pID4+IGluZGV4KTsKKyAgICBlbHNlCisgICAgICAgIGluZGV4ID0gKGludCkoKHJlYWRlci0+cHRyIC0gcmVhZGVyLT5ibG9ja19taW4pIC8gZWxlbV9zaXplKTsKKworICAgIGluZGV4ICs9IHJlYWRlci0+YmxvY2stPnN0YXJ0X2luZGV4IC0gcmVhZGVyLT5kZWx0YV9pbmRleDsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKKworLyogU2V0IHJlYWRlciBwb3NpdGlvbiB0byBnaXZlbiBwb3NpdGlvbiwKKyAqIGVpdGhlciBhYnNvbHV0ZSBvciByZWxhdGl2ZSB0byB0aGUKKyAqICBjdXJyZW50IG9uZToKKyAqLworQ1ZfSU1QTCB2b2lkCitjdlNldFNlcVJlYWRlclBvcyggQ3ZTZXFSZWFkZXIqIHJlYWRlciwgaW50IGluZGV4LCBpbnQgaXNfcmVsYXRpdmUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRTZXFSZWFkZXJQb3MiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKyAgICBpbnQgZWxlbV9zaXplLCBjb3VudCwgdG90YWw7CisKKyAgICBpZiggIXJlYWRlciB8fCAhcmVhZGVyLT5zZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHRvdGFsID0gcmVhZGVyLT5zZXEtPnRvdGFsOworICAgIGVsZW1fc2l6ZSA9IHJlYWRlci0+c2VxLT5lbGVtX3NpemU7CisKKyAgICBpZiggIWlzX3JlbGF0aXZlICkKKyAgICB7CisgICAgICAgIGlmKCBpbmRleCA8IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaW5kZXggPCAtdG90YWwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiIiApOworICAgICAgICAgICAgaW5kZXggKz0gdG90YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggaW5kZXggPj0gdG90YWwgKQorICAgICAgICB7CisgICAgICAgICAgICBpbmRleCAtPSB0b3RhbDsKKyAgICAgICAgICAgIGlmKCBpbmRleCA+PSB0b3RhbCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisgICAgICAgIH0KKworICAgICAgICBibG9jayA9IHJlYWRlci0+c2VxLT5maXJzdDsKKyAgICAgICAgaWYoIGluZGV4ID49IChjb3VudCA9IGJsb2NrLT5jb3VudCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaW5kZXggKyBpbmRleCA8PSB0b3RhbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrID0gYmxvY2stPm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGluZGV4IC09IGNvdW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggaW5kZXggPj0gKGNvdW50ID0gYmxvY2stPmNvdW50KSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBibG9jayA9IGJsb2NrLT5wcmV2OworICAgICAgICAgICAgICAgICAgICB0b3RhbCAtPSBibG9jay0+Y291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBpbmRleCA8IHRvdGFsICk7CisgICAgICAgICAgICAgICAgaW5kZXggLT0gdG90YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLT5wdHIgPSBibG9jay0+ZGF0YSArIGluZGV4ICogZWxlbV9zaXplOworICAgICAgICBpZiggcmVhZGVyLT5ibG9jayAhPSBibG9jayApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRlci0+YmxvY2sgPSBibG9jazsKKyAgICAgICAgICAgIHJlYWRlci0+YmxvY2tfbWluID0gYmxvY2stPmRhdGE7CisgICAgICAgICAgICByZWFkZXItPmJsb2NrX21heCA9IGJsb2NrLT5kYXRhICsgYmxvY2stPmNvdW50ICogZWxlbV9zaXplOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNjaGFyKiBwdHIgPSByZWFkZXItPnB0cjsKKyAgICAgICAgaW5kZXggKj0gZWxlbV9zaXplOworICAgICAgICBibG9jayA9IHJlYWRlci0+YmxvY2s7CisKKyAgICAgICAgaWYoIGluZGV4ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCBwdHIgKyBpbmRleCA+PSByZWFkZXItPmJsb2NrX21heCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gKGludCkocmVhZGVyLT5ibG9ja19tYXggLSBwdHIpOworICAgICAgICAgICAgICAgIGluZGV4IC09IGRlbHRhOworICAgICAgICAgICAgICAgIHJlYWRlci0+YmxvY2sgPSBibG9jayA9IGJsb2NrLT5uZXh0OworICAgICAgICAgICAgICAgIHJlYWRlci0+YmxvY2tfbWluID0gcHRyID0gYmxvY2stPmRhdGE7CisgICAgICAgICAgICAgICAgcmVhZGVyLT5ibG9ja19tYXggPSBibG9jay0+ZGF0YSArIGJsb2NrLT5jb3VudCplbGVtX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFkZXItPnB0ciA9IHB0ciArIGluZGV4OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd2hpbGUoIHB0ciArIGluZGV4IDwgcmVhZGVyLT5ibG9ja19taW4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBkZWx0YSA9IChpbnQpKHB0ciAtIHJlYWRlci0+YmxvY2tfbWluKTsKKyAgICAgICAgICAgICAgICBpbmRleCArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICByZWFkZXItPmJsb2NrID0gYmxvY2sgPSBibG9jay0+cHJldjsKKyAgICAgICAgICAgICAgICByZWFkZXItPmJsb2NrX21pbiA9IGJsb2NrLT5kYXRhOworICAgICAgICAgICAgICAgIHJlYWRlci0+YmxvY2tfbWF4ID0gcHRyID0gYmxvY2stPmRhdGEgKyBibG9jay0+Y291bnQqZWxlbV9zaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVhZGVyLT5wdHIgPSBwdHIgKyBpbmRleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogUHVzaCBlbGVtZW50IG9udG8gdGhlIHNlcXVlbmNlOiAqLworQ1ZfSU1QTCBzY2hhcioKK2N2U2VxUHVzaCggQ3ZTZXEgKnNlcSwgdm9pZCAqZWxlbWVudCApCit7CisgICAgc2NoYXIgKnB0ciA9IDA7CisgICAgc2l6ZV90IGVsZW1fc2l6ZTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFQdXNoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworICAgIHB0ciA9IHNlcS0+cHRyOworCisgICAgaWYoIHB0ciA+PSBzZXEtPmJsb2NrX21heCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZHcm93U2VxKCBzZXEsIDAgKSk7CisKKyAgICAgICAgcHRyID0gc2VxLT5wdHI7CisgICAgICAgIGFzc2VydCggcHRyICsgZWxlbV9zaXplIDw9IHNlcS0+YmxvY2tfbWF4IC8qJiYgcHRyID09IHNlcS0+YmxvY2tfbWluICovICApOworICAgIH0KKworICAgIGlmKCBlbGVtZW50ICkKKyAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIHB0ciwgZWxlbWVudCwgZWxlbV9zaXplICk7CisgICAgc2VxLT5maXJzdC0+cHJldi0+Y291bnQrKzsKKyAgICBzZXEtPnRvdGFsKys7CisgICAgc2VxLT5wdHIgPSBwdHIgKyBlbGVtX3NpemU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHB0cjsKK30KKworCisvKiBQb3AgbGFzdCBlbGVtZW50IG9mZiBvZiB0aGUgc2VxdWVuY2U6ICovCitDVl9JTVBMIHZvaWQKK2N2U2VxUG9wKCBDdlNlcSAqc2VxLCB2b2lkICplbGVtZW50ICkKK3sKKyAgICBzY2hhciAqcHRyOworICAgIGludCBlbGVtX3NpemU7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U2VxUG9wIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpZiggc2VxLT50b3RhbCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICIiICk7CisKKyAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICBzZXEtPnB0ciA9IHB0ciA9IHNlcS0+cHRyIC0gZWxlbV9zaXplOworCisgICAgaWYoIGVsZW1lbnQgKQorICAgICAgICBDVl9NRU1DUFlfQVVUTyggZWxlbWVudCwgcHRyLCBlbGVtX3NpemUgKTsKKyAgICBzZXEtPnB0ciA9IHB0cjsKKyAgICBzZXEtPnRvdGFsLS07CisKKyAgICBpZiggLS0oc2VxLT5maXJzdC0+cHJldi0+Y291bnQpID09IDAgKQorICAgIHsKKyAgICAgICAgaWN2RnJlZVNlcUJsb2NrKCBzZXEsIDAgKTsKKyAgICAgICAgYXNzZXJ0KCBzZXEtPnB0ciA9PSBzZXEtPmJsb2NrX21heCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogUHVzaCBlbGVtZW50IG9udG8gdGhlIGZyb250IG9mIHRoZSBzZXF1ZW5jZTogKi8KK0NWX0lNUEwgc2NoYXIqCitjdlNlcVB1c2hGcm9udCggQ3ZTZXEgKnNlcSwgdm9pZCAqZWxlbWVudCApCit7CisgICAgc2NoYXIqIHB0ciA9IDA7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFQdXNoRnJvbnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworCisgICAgaWYoICFibG9jayB8fCBibG9jay0+c3RhcnRfaW5kZXggPT0gMCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZHcm93U2VxKCBzZXEsIDEgKSk7CisKKyAgICAgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworICAgICAgICBhc3NlcnQoIGJsb2NrLT5zdGFydF9pbmRleCA+IDAgKTsKKyAgICB9CisKKyAgICBwdHIgPSBibG9jay0+ZGF0YSAtPSBlbGVtX3NpemU7CisKKyAgICBpZiggZWxlbWVudCApCisgICAgICAgIENWX01FTUNQWV9BVVRPKCBwdHIsIGVsZW1lbnQsIGVsZW1fc2l6ZSApOworICAgIGJsb2NrLT5jb3VudCsrOworICAgIGJsb2NrLT5zdGFydF9pbmRleC0tOworICAgIHNlcS0+dG90YWwrKzsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8qIFNoaWZ0IG91dCBmaXJzdCBlbGVtZW50IG9mIHRoZSBzZXF1ZW5jZTogKi8KK0NWX0lNUEwgdm9pZAorY3ZTZXFQb3BGcm9udCggQ3ZTZXEgKnNlcSwgdm9pZCAqZWxlbWVudCApCit7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFQb3BGcm9udCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc2VxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisgICAgaWYoIHNlcS0+dG90YWwgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworCisgICAgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworCisgICAgaWYoIGVsZW1lbnQgKQorICAgICAgICBDVl9NRU1DUFlfQVVUTyggZWxlbWVudCwgYmxvY2stPmRhdGEsIGVsZW1fc2l6ZSApOworICAgIGJsb2NrLT5kYXRhICs9IGVsZW1fc2l6ZTsKKyAgICBibG9jay0+c3RhcnRfaW5kZXgrKzsKKyAgICBzZXEtPnRvdGFsLS07CisKKyAgICBpZiggLS0oYmxvY2stPmNvdW50KSA9PSAwICkKKyAgICB7CisgICAgICAgIGljdkZyZWVTZXFCbG9jayggc2VxLCAxICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyogSW5zZXJ0IG5ldyBlbGVtZW50IGluIG1pZGRsZSBvZiBzZXF1ZW5jZTogKi8KK0NWX0lNUEwgc2NoYXIqCitjdlNlcUluc2VydCggQ3ZTZXEgKnNlcSwgaW50IGJlZm9yZV9pbmRleCwgdm9pZCAqZWxlbWVudCApCit7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBpbnQgYmxvY2tfc2l6ZTsKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKyAgICBpbnQgZGVsdGFfaW5kZXg7CisgICAgaW50IHRvdGFsOworICAgIHNjaGFyKiByZXRfcHRyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFJbnNlcnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgdG90YWwgPSBzZXEtPnRvdGFsOworICAgIGJlZm9yZV9pbmRleCArPSBiZWZvcmVfaW5kZXggPCAwID8gdG90YWwgOiAwOworICAgIGJlZm9yZV9pbmRleCAtPSBiZWZvcmVfaW5kZXggPiB0b3RhbCA/IHRvdGFsIDogMDsKKworICAgIGlmKCAodW5zaWduZWQpYmVmb3JlX2luZGV4ID4gKHVuc2lnbmVkKXRvdGFsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBpZiggYmVmb3JlX2luZGV4ID09IHRvdGFsICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHJldF9wdHIgPSBjdlNlcVB1c2goIHNlcSwgZWxlbWVudCApKTsKKyAgICB9CisgICAgZWxzZSBpZiggYmVmb3JlX2luZGV4ID09IDAgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggcmV0X3B0ciA9IGN2U2VxUHVzaEZyb250KCBzZXEsIGVsZW1lbnQgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworCisgICAgICAgIGlmKCBiZWZvcmVfaW5kZXggPj0gdG90YWwgPj4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjaGFyICpwdHIgPSBzZXEtPnB0ciArIGVsZW1fc2l6ZTsKKworICAgICAgICAgICAgaWYoIHB0ciA+IHNlcS0+YmxvY2tfbWF4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBpY3ZHcm93U2VxKCBzZXEsIDAgKSk7CisKKyAgICAgICAgICAgICAgICBwdHIgPSBzZXEtPnB0ciArIGVsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHB0ciA8PSBzZXEtPmJsb2NrX21heCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YV9pbmRleCA9IHNlcS0+Zmlyc3QtPnN0YXJ0X2luZGV4OworICAgICAgICAgICAgYmxvY2sgPSBzZXEtPmZpcnN0LT5wcmV2OworICAgICAgICAgICAgYmxvY2stPmNvdW50Kys7CisgICAgICAgICAgICBibG9ja19zaXplID0gKGludCkocHRyIC0gYmxvY2stPmRhdGEpOworCisgICAgICAgICAgICB3aGlsZSggYmVmb3JlX2luZGV4IDwgYmxvY2stPnN0YXJ0X2luZGV4IC0gZGVsdGFfaW5kZXggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U2VxQmxvY2sgKnByZXZfYmxvY2sgPSBibG9jay0+cHJldjsKKworICAgICAgICAgICAgICAgIG1lbW1vdmUoIGJsb2NrLT5kYXRhICsgZWxlbV9zaXplLCBibG9jay0+ZGF0YSwgYmxvY2tfc2l6ZSAtIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgPSBwcmV2X2Jsb2NrLT5jb3VudCAqIGVsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIGJsb2NrLT5kYXRhLCBwcmV2X2Jsb2NrLT5kYXRhICsgYmxvY2tfc2l6ZSAtIGVsZW1fc2l6ZSwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBwcmV2X2Jsb2NrOworCisgICAgICAgICAgICAgICAgLyogQ2hlY2sgdGhhdCB3ZSBkb24ndCBmYWxsIGludG8gYW4gaW5maW5pdGUgbG9vcDogKi8KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGJsb2NrICE9IHNlcS0+Zmlyc3QtPnByZXYgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmVmb3JlX2luZGV4ID0gKGJlZm9yZV9pbmRleCAtIGJsb2NrLT5zdGFydF9pbmRleCArIGRlbHRhX2luZGV4KSAqIGVsZW1fc2l6ZTsKKyAgICAgICAgICAgIG1lbW1vdmUoIGJsb2NrLT5kYXRhICsgYmVmb3JlX2luZGV4ICsgZWxlbV9zaXplLCBibG9jay0+ZGF0YSArIGJlZm9yZV9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgLSBiZWZvcmVfaW5kZXggLSBlbGVtX3NpemUgKTsKKworICAgICAgICAgICAgcmV0X3B0ciA9IGJsb2NrLT5kYXRhICsgYmVmb3JlX2luZGV4OworCisgICAgICAgICAgICBpZiggZWxlbWVudCApCisgICAgICAgICAgICAgICAgbWVtY3B5KCByZXRfcHRyLCBlbGVtZW50LCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgIHNlcS0+cHRyID0gcHRyOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworCisgICAgICAgICAgICBpZiggYmxvY2stPnN0YXJ0X2luZGV4ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX0NBTEwoIGljdkdyb3dTZXEoIHNlcSwgMSApKTsKKworICAgICAgICAgICAgICAgIGJsb2NrID0gc2VxLT5maXJzdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVsdGFfaW5kZXggPSBibG9jay0+c3RhcnRfaW5kZXg7CisgICAgICAgICAgICBibG9jay0+Y291bnQrKzsKKyAgICAgICAgICAgIGJsb2NrLT5zdGFydF9pbmRleC0tOworICAgICAgICAgICAgYmxvY2stPmRhdGEgLT0gZWxlbV9zaXplOworCisgICAgICAgICAgICB3aGlsZSggYmVmb3JlX2luZGV4ID4gYmxvY2stPnN0YXJ0X2luZGV4IC0gZGVsdGFfaW5kZXggKyBibG9jay0+Y291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2U2VxQmxvY2sgKm5leHRfYmxvY2sgPSBibG9jay0+bmV4dDsKKworICAgICAgICAgICAgICAgIGJsb2NrX3NpemUgPSBibG9jay0+Y291bnQgKiBlbGVtX3NpemU7CisgICAgICAgICAgICAgICAgbWVtbW92ZSggYmxvY2stPmRhdGEsIGJsb2NrLT5kYXRhICsgZWxlbV9zaXplLCBibG9ja19zaXplIC0gZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBibG9jay0+ZGF0YSArIGJsb2NrX3NpemUgLSBlbGVtX3NpemUsIG5leHRfYmxvY2stPmRhdGEsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIGJsb2NrID0gbmV4dF9ibG9jazsKKworICAgICAgICAgICAgICAgIC8qIENoZWNrIHRoYXQgd2UgZG9uJ3QgZmFsbCBpbnRvIGFuIGluZmluaXRlIGxvb3A6ICovCisgICAgICAgICAgICAgICAgYXNzZXJ0KCBibG9jayAhPSBzZXEtPmZpcnN0ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJlZm9yZV9pbmRleCA9IChiZWZvcmVfaW5kZXggLSBibG9jay0+c3RhcnRfaW5kZXggKyBkZWx0YV9pbmRleCkgKiBlbGVtX3NpemU7CisgICAgICAgICAgICBtZW1tb3ZlKCBibG9jay0+ZGF0YSwgYmxvY2stPmRhdGEgKyBlbGVtX3NpemUsIGJlZm9yZV9pbmRleCAtIGVsZW1fc2l6ZSApOworCisgICAgICAgICAgICByZXRfcHRyID0gYmxvY2stPmRhdGEgKyBiZWZvcmVfaW5kZXggLSBlbGVtX3NpemU7CisKKyAgICAgICAgICAgIGlmKCBlbGVtZW50ICkKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHJldF9wdHIsIGVsZW1lbnQsIGVsZW1fc2l6ZSApOworICAgICAgICB9CisKKyAgICAgICAgc2VxLT50b3RhbCA9IHRvdGFsICsgMTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJldF9wdHI7Cit9CisKKworLyogUmVtb3ZlcyBlbGVtZW50IGZyb20gc2VxdWVuY2U6ICovCitDVl9JTVBMIHZvaWQKK2N2U2VxUmVtb3ZlKCBDdlNlcSAqc2VxLCBpbnQgaW5kZXggKQoreworICAgIHNjaGFyICpwdHI7CisgICAgaW50IGVsZW1fc2l6ZTsKKyAgICBpbnQgYmxvY2tfc2l6ZTsKKyAgICBDdlNlcUJsb2NrICpibG9jazsKKyAgICBpbnQgZGVsdGFfaW5kZXg7CisgICAgaW50IHRvdGFsLCBmcm9udCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U2VxUmVtb3ZlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFzZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHRvdGFsID0gc2VxLT50b3RhbDsKKworICAgIGluZGV4ICs9IGluZGV4IDwgMCA/IHRvdGFsIDogMDsKKyAgICBpbmRleCAtPSBpbmRleCA+PSB0b3RhbCA/IHRvdGFsIDogMDsKKworICAgIGlmKCAodW5zaWduZWQpIGluZGV4ID49ICh1bnNpZ25lZCkgdG90YWwgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIkludmFsaWQgaW5kZXgiICk7CisKKyAgICBpZiggaW5kZXggPT0gdG90YWwgLSAxICkKKyAgICB7CisgICAgICAgIGN2U2VxUG9wKCBzZXEsIDAgKTsKKyAgICB9CisgICAgZWxzZSBpZiggaW5kZXggPT0gMCApCisgICAgeworICAgICAgICBjdlNlcVBvcEZyb250KCBzZXEsIDAgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworICAgICAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgZGVsdGFfaW5kZXggPSBibG9jay0+c3RhcnRfaW5kZXg7CisgICAgICAgIHdoaWxlKCBibG9jay0+c3RhcnRfaW5kZXggLSBkZWx0YV9pbmRleCArIGJsb2NrLT5jb3VudCA8PSBpbmRleCApCisgICAgICAgICAgICBibG9jayA9IGJsb2NrLT5uZXh0OworCisgICAgICAgIHB0ciA9IGJsb2NrLT5kYXRhICsgKGluZGV4IC0gYmxvY2stPnN0YXJ0X2luZGV4ICsgZGVsdGFfaW5kZXgpICogZWxlbV9zaXplOworCisgICAgICAgIGZyb250ID0gaW5kZXggPCB0b3RhbCA+PiAxOworICAgICAgICBpZiggIWZyb250ICkKKyAgICAgICAgeworICAgICAgICAgICAgYmxvY2tfc2l6ZSA9IGJsb2NrLT5jb3VudCAqIGVsZW1fc2l6ZSAtIChpbnQpKHB0ciAtIGJsb2NrLT5kYXRhKTsKKworICAgICAgICAgICAgd2hpbGUoIGJsb2NrICE9IHNlcS0+Zmlyc3QtPnByZXYgKSAgLyogd2hpbGUgbm90IHRoZSBsYXN0IGJsb2NrICovCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZTZXFCbG9jayAqbmV4dF9ibG9jayA9IGJsb2NrLT5uZXh0OworCisgICAgICAgICAgICAgICAgbWVtbW92ZSggcHRyLCBwdHIgKyBlbGVtX3NpemUsIGJsb2NrX3NpemUgLSBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHB0ciArIGJsb2NrX3NpemUgLSBlbGVtX3NpemUsIG5leHRfYmxvY2stPmRhdGEsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIGJsb2NrID0gbmV4dF9ibG9jazsKKyAgICAgICAgICAgICAgICBwdHIgPSBibG9jay0+ZGF0YTsKKyAgICAgICAgICAgICAgICBibG9ja19zaXplID0gYmxvY2stPmNvdW50ICogZWxlbV9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1tb3ZlKCBwdHIsIHB0ciArIGVsZW1fc2l6ZSwgYmxvY2tfc2l6ZSAtIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgc2VxLT5wdHIgLT0gZWxlbV9zaXplOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IGVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGJsb2NrX3NpemUgPSAoaW50KShwdHIgLSBibG9jay0+ZGF0YSk7CisKKyAgICAgICAgICAgIHdoaWxlKCBibG9jayAhPSBzZXEtPmZpcnN0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlNlcUJsb2NrICpwcmV2X2Jsb2NrID0gYmxvY2stPnByZXY7CisKKyAgICAgICAgICAgICAgICBtZW1tb3ZlKCBibG9jay0+ZGF0YSArIGVsZW1fc2l6ZSwgYmxvY2stPmRhdGEsIGJsb2NrX3NpemUgLSBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICBibG9ja19zaXplID0gcHJldl9ibG9jay0+Y291bnQgKiBlbGVtX3NpemU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCBibG9jay0+ZGF0YSwgcHJldl9ibG9jay0+ZGF0YSArIGJsb2NrX3NpemUgLSBlbGVtX3NpemUsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIGJsb2NrID0gcHJldl9ibG9jazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbWVtbW92ZSggYmxvY2stPmRhdGEgKyBlbGVtX3NpemUsIGJsb2NrLT5kYXRhLCBibG9ja19zaXplIC0gZWxlbV9zaXplICk7CisgICAgICAgICAgICBibG9jay0+ZGF0YSArPSBlbGVtX3NpemU7CisgICAgICAgICAgICBibG9jay0+c3RhcnRfaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIHNlcS0+dG90YWwgPSB0b3RhbCAtIDE7CisgICAgICAgIGlmKCAtLWJsb2NrLT5jb3VudCA9PSAwICkKKyAgICAgICAgICAgIGljdkZyZWVTZXFCbG9jayggc2VxLCBmcm9udCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyogQWRkIHNldmVyYWwgZWxlbWVudHMgdG8gdGhlIGJlZ2lubmluZyBvciBlbmQgb2YgYSBzZXF1ZW5jZTogKi8KK0NWX0lNUEwgdm9pZAorY3ZTZXFQdXNoTXVsdGkoIEN2U2VxICpzZXEsIHZvaWQgKl9lbGVtZW50cywgaW50IGNvdW50LCBpbnQgZnJvbnQgKQoreworICAgIGNoYXIgKmVsZW1lbnRzID0gKGNoYXIgKikgX2VsZW1lbnRzOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNlcVB1c2hNdWx0aSIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICBpbnQgZWxlbV9zaXplOworCisgICAgaWYoICFzZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgc2VxdWVuY2UgcG9pbnRlciIgKTsKKyAgICBpZiggY291bnQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJudW1iZXIgb2YgcmVtb3ZlZCBlbGVtZW50cyBpcyBuZWdhdGl2ZSIgKTsKKworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworCisgICAgaWYoICFmcm9udCApCisgICAgeworICAgICAgICB3aGlsZSggY291bnQgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlbHRhID0gKGludCkoKHNlcS0+YmxvY2tfbWF4IC0gc2VxLT5wdHIpIC8gZWxlbV9zaXplKTsKKworICAgICAgICAgICAgZGVsdGEgPSBNSU4oIGRlbHRhLCBjb3VudCApOworICAgICAgICAgICAgaWYoIGRlbHRhID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc2VxLT5maXJzdC0+cHJldi0+Y291bnQgKz0gZGVsdGE7CisgICAgICAgICAgICAgICAgc2VxLT50b3RhbCArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBkZWx0YTsKKyAgICAgICAgICAgICAgICBkZWx0YSAqPSBlbGVtX3NpemU7CisgICAgICAgICAgICAgICAgaWYoIGVsZW1lbnRzICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggc2VxLT5wdHIsIGVsZW1lbnRzLCBkZWx0YSApOworICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyArPSBkZWx0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VxLT5wdHIgKz0gZGVsdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjb3VudCA+IDAgKQorICAgICAgICAgICAgICAgIENWX0NBTEwoIGljdkdyb3dTZXEoIHNlcSwgMCApKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlNlcUJsb2NrKiBibG9jayA9IHNlcS0+Zmlyc3Q7CisKKyAgICAgICAgd2hpbGUoIGNvdW50ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkZWx0YTsKKworICAgICAgICAgICAgaWYoICFibG9jayB8fCBibG9jay0+c3RhcnRfaW5kZXggPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2R3Jvd1NlcSggc2VxLCAxICkpOworCisgICAgICAgICAgICAgICAgYmxvY2sgPSBzZXEtPmZpcnN0OworICAgICAgICAgICAgICAgIGFzc2VydCggYmxvY2stPnN0YXJ0X2luZGV4ID4gMCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWx0YSA9IE1JTiggYmxvY2stPnN0YXJ0X2luZGV4LCBjb3VudCApOworICAgICAgICAgICAgY291bnQgLT0gZGVsdGE7CisgICAgICAgICAgICBibG9jay0+c3RhcnRfaW5kZXggLT0gZGVsdGE7CisgICAgICAgICAgICBibG9jay0+Y291bnQgKz0gZGVsdGE7CisgICAgICAgICAgICBzZXEtPnRvdGFsICs9IGRlbHRhOworICAgICAgICAgICAgZGVsdGEgKj0gZWxlbV9zaXplOworICAgICAgICAgICAgYmxvY2stPmRhdGEgLT0gZGVsdGE7CisKKyAgICAgICAgICAgIGlmKCBlbGVtZW50cyApCisgICAgICAgICAgICAgICAgbWVtY3B5KCBibG9jay0+ZGF0YSwgZWxlbWVudHMgKyBjb3VudCplbGVtX3NpemUsIGRlbHRhICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFJlbW92ZSBzZXZlcmFsIGVsZW1lbnRzIGZyb20gdGhlIGVuZCBvZiBzZXF1ZW5jZTogKi8KK0NWX0lNUEwgdm9pZAorY3ZTZXFQb3BNdWx0aSggQ3ZTZXEgKnNlcSwgdm9pZCAqX2VsZW1lbnRzLCBpbnQgY291bnQsIGludCBmcm9udCApCit7CisgICAgY2hhciAqZWxlbWVudHMgPSAoY2hhciAqKSBfZWxlbWVudHM7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U2VxUG9wTXVsdGkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBzZXF1ZW5jZSBwb2ludGVyIiApOworICAgIGlmKCBjb3VudCA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIm51bWJlciBvZiByZW1vdmVkIGVsZW1lbnRzIGlzIG5lZ2F0aXZlIiApOworCisgICAgY291bnQgPSBNSU4oIGNvdW50LCBzZXEtPnRvdGFsICk7CisKKyAgICBpZiggIWZyb250ICkKKyAgICB7CisgICAgICAgIGlmKCBlbGVtZW50cyApCisgICAgICAgICAgICBlbGVtZW50cyArPSBjb3VudCAqIHNlcS0+ZWxlbV9zaXplOworCisgICAgICAgIHdoaWxlKCBjb3VudCA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZGVsdGEgPSBzZXEtPmZpcnN0LT5wcmV2LT5jb3VudDsKKworICAgICAgICAgICAgZGVsdGEgPSBNSU4oIGRlbHRhLCBjb3VudCApOworICAgICAgICAgICAgYXNzZXJ0KCBkZWx0YSA+IDAgKTsKKworICAgICAgICAgICAgc2VxLT5maXJzdC0+cHJldi0+Y291bnQgLT0gZGVsdGE7CisgICAgICAgICAgICBzZXEtPnRvdGFsIC09IGRlbHRhOworICAgICAgICAgICAgY291bnQgLT0gZGVsdGE7CisgICAgICAgICAgICBkZWx0YSAqPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICAgICAgICAgIHNlcS0+cHRyIC09IGRlbHRhOworCisgICAgICAgICAgICBpZiggZWxlbWVudHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGVsZW1lbnRzIC09IGRlbHRhOworICAgICAgICAgICAgICAgIG1lbWNweSggZWxlbWVudHMsIHNlcS0+cHRyLCBkZWx0YSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggc2VxLT5maXJzdC0+cHJldi0+Y291bnQgPT0gMCApCisgICAgICAgICAgICAgICAgaWN2RnJlZVNlcUJsb2NrKCBzZXEsIDAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3aGlsZSggY291bnQgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRlbHRhID0gc2VxLT5maXJzdC0+Y291bnQ7CisKKyAgICAgICAgICAgIGRlbHRhID0gTUlOKCBkZWx0YSwgY291bnQgKTsKKyAgICAgICAgICAgIGFzc2VydCggZGVsdGEgPiAwICk7CisKKyAgICAgICAgICAgIHNlcS0+Zmlyc3QtPmNvdW50IC09IGRlbHRhOworICAgICAgICAgICAgc2VxLT50b3RhbCAtPSBkZWx0YTsKKyAgICAgICAgICAgIGNvdW50IC09IGRlbHRhOworICAgICAgICAgICAgc2VxLT5maXJzdC0+c3RhcnRfaW5kZXggKz0gZGVsdGE7CisgICAgICAgICAgICBkZWx0YSAqPSBzZXEtPmVsZW1fc2l6ZTsKKworICAgICAgICAgICAgaWYoIGVsZW1lbnRzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIGVsZW1lbnRzLCBzZXEtPmZpcnN0LT5kYXRhLCBkZWx0YSApOworICAgICAgICAgICAgICAgIGVsZW1lbnRzICs9IGRlbHRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZXEtPmZpcnN0LT5kYXRhICs9IGRlbHRhOworICAgICAgICAgICAgaWYoIHNlcS0+Zmlyc3QtPmNvdW50ID09IDAgKQorICAgICAgICAgICAgICAgIGljdkZyZWVTZXFCbG9jayggc2VxLCAxICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSBhIHNlcXVlbmNlOiAqLworQ1ZfSU1QTCB2b2lkCitjdkNsZWFyU2VxKCBDdlNlcSAqc2VxICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2xlYXJTZXEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworICAgIGN2U2VxUG9wTXVsdGkoIHNlcSwgMCwgc2VxLT50b3RhbCApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIEN2U2VxKgorY3ZTZXFTbGljZSggY29uc3QgQ3ZTZXEqIHNlcSwgQ3ZTbGljZSBzbGljZSwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBpbnQgY29weV9kYXRhICkKK3sKKyAgICBDdlNlcSogc3Vic2VxID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdlNlcVNsaWNlIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgZWxlbV9zaXplLCBjb3VudCwgbGVuZ3RoOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdlNlcUJsb2NrICpibG9jaywgKmZpcnN0X2Jsb2NrID0gMCwgKmxhc3RfYmxvY2sgPSAwOworCisgICAgaWYoICFDVl9JU19TRVEoc2VxKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIHNlcXVlbmNlIGhlYWRlciIgKTsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgeworICAgICAgICBzdG9yYWdlID0gc2VxLT5zdG9yYWdlOworICAgICAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHN0b3JhZ2UgcG9pbnRlciIgKTsKKyAgICB9CisKKyAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICBsZW5ndGggPSBjdlNsaWNlTGVuZ3RoKCBzbGljZSwgc2VxICk7CisgICAgaWYoIHNsaWNlLnN0YXJ0X2luZGV4IDwgMCApCisgICAgICAgIHNsaWNlLnN0YXJ0X2luZGV4ICs9IHNlcS0+dG90YWw7CisgICAgZWxzZSBpZiggc2xpY2Uuc3RhcnRfaW5kZXggPj0gc2VxLT50b3RhbCApCisgICAgICAgIHNsaWNlLnN0YXJ0X2luZGV4IC09IHNlcS0+dG90YWw7CisgICAgaWYoICh1bnNpZ25lZClsZW5ndGggPiAodW5zaWduZWQpc2VxLT50b3RhbCB8fAorICAgICAgICAoKHVuc2lnbmVkKXNsaWNlLnN0YXJ0X2luZGV4ID49ICh1bnNpZ25lZClzZXEtPnRvdGFsICYmIGxlbmd0aCAhPSAwKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiQmFkIHNlcXVlbmNlIHNsaWNlIiApOworCisgICAgQ1ZfQ0FMTCggc3Vic2VxID0gY3ZDcmVhdGVTZXEoIHNlcS0+ZmxhZ3MsIHNlcS0+aGVhZGVyX3NpemUsIGVsZW1fc2l6ZSwgc3RvcmFnZSApKTsKKworICAgIGlmKCBsZW5ndGggPiAwICkKKyAgICB7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyZWFkZXIsIDAgKTsKKyAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXIsIHNsaWNlLnN0YXJ0X2luZGV4LCAwICk7CisgICAgICAgIGNvdW50ID0gKGludCkoKHJlYWRlci5ibG9ja19tYXggLSByZWFkZXIucHRyKS9lbGVtX3NpemUpOworCisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBibCA9IE1JTiggY291bnQsIGxlbmd0aCApOworCisgICAgICAgICAgICBpZiggIWNvcHlfZGF0YSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYmxvY2sgPSAoQ3ZTZXFCbG9jayopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIHNpemVvZigqYmxvY2spICk7CisgICAgICAgICAgICAgICAgaWYoICFmaXJzdF9ibG9jayApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmaXJzdF9ibG9jayA9IHN1YnNlcS0+Zmlyc3QgPSBibG9jay0+cHJldiA9IGJsb2NrLT5uZXh0ID0gYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5zdGFydF9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5wcmV2ID0gbGFzdF9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgYmxvY2stPm5leHQgPSBmaXJzdF9ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgbGFzdF9ibG9jay0+bmV4dCA9IGZpcnN0X2Jsb2NrLT5wcmV2ID0gYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIGJsb2NrLT5zdGFydF9pbmRleCA9IGxhc3RfYmxvY2stPnN0YXJ0X2luZGV4ICsgbGFzdF9ibG9jay0+Y291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RfYmxvY2sgPSBibG9jazsKKyAgICAgICAgICAgICAgICBibG9jay0+ZGF0YSA9IHJlYWRlci5wdHI7CisgICAgICAgICAgICAgICAgYmxvY2stPmNvdW50ID0gYmw7CisgICAgICAgICAgICAgICAgc3Vic2VxLT50b3RhbCArPSBibDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdlNlcVB1c2hNdWx0aSggc3Vic2VxLCByZWFkZXIucHRyLCBibCwgMCApOworICAgICAgICAgICAgbGVuZ3RoIC09IGJsOworICAgICAgICAgICAgcmVhZGVyLmJsb2NrID0gcmVhZGVyLmJsb2NrLT5uZXh0OworICAgICAgICAgICAgcmVhZGVyLnB0ciA9IHJlYWRlci5ibG9jay0+ZGF0YTsKKyAgICAgICAgICAgIGNvdW50ID0gcmVhZGVyLmJsb2NrLT5jb3VudDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSggbGVuZ3RoID4gMCApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc3Vic2VxOworfQorCisKKy8vIFJlbW92ZSBzbGljZSBmcm9tIHRoZSBtaWRkbGUgb2YgdGhlIHNlcXVlbmNlLgorLy8gISEhIFRPRE8gISEhIEltcGxlbWVudCBtb3JlIGVmZmljaWVudCBhbGdvcml0aG0KK0NWX0lNUEwgdm9pZAorY3ZTZXFSZW1vdmVTbGljZSggQ3ZTZXEqIHNlcSwgQ3ZTbGljZSBzbGljZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoImN2U2VxUmVtb3ZlU2xpY2UiKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0b3RhbCwgbGVuZ3RoOworCisgICAgaWYoICFDVl9JU19TRVEoc2VxKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIHNlcXVlbmNlIGhlYWRlciIgKTsKKworICAgIGxlbmd0aCA9IGN2U2xpY2VMZW5ndGgoIHNsaWNlLCBzZXEgKTsKKyAgICB0b3RhbCA9IHNlcS0+dG90YWw7CisKKyAgICBpZiggc2xpY2Uuc3RhcnRfaW5kZXggPCAwICkKKyAgICAgICAgc2xpY2Uuc3RhcnRfaW5kZXggKz0gdG90YWw7CisgICAgZWxzZSBpZiggc2xpY2Uuc3RhcnRfaW5kZXggPj0gdG90YWwgKQorICAgICAgICBzbGljZS5zdGFydF9pbmRleCAtPSB0b3RhbDsKKworICAgIGlmKCAodW5zaWduZWQpc2xpY2Uuc3RhcnRfaW5kZXggPj0gKHVuc2lnbmVkKXRvdGFsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzdGFydCBzbGljZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICBzbGljZS5lbmRfaW5kZXggPSBzbGljZS5zdGFydF9pbmRleCArIGxlbmd0aDsKKworICAgIGlmKCBzbGljZS5lbmRfaW5kZXggPCB0b3RhbCApCisgICAgeworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXJfdG8sIHJlYWRlcl9mcm9tOworICAgICAgICBpbnQgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlcl90byApOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyX2Zyb20gKTsKKworICAgICAgICBpZiggc2xpY2Uuc3RhcnRfaW5kZXggPiB0b3RhbCAtIHNsaWNlLmVuZF9pbmRleCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBjb3VudCA9IHNlcS0+dG90YWwgLSBzbGljZS5lbmRfaW5kZXg7CisgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlcl90bywgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyX2Zyb20sIHNsaWNlLmVuZF9pbmRleCApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIHJlYWRlcl90by5wdHIsIHJlYWRlcl9mcm9tLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXJfdG8gKTsKKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlcl9mcm9tICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2U2VxUG9wTXVsdGkoIHNlcSwgMCwgc2xpY2UuZW5kX2luZGV4IC0gc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBjb3VudCA9IHNsaWNlLnN0YXJ0X2luZGV4OworICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXJfdG8sIHNsaWNlLmVuZF9pbmRleCApOworICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXJfZnJvbSwgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX1BSRVZfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyX3RvICk7CisgICAgICAgICAgICAgICAgQ1ZfUFJFVl9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXJfZnJvbSApOworCisgICAgICAgICAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIHJlYWRlcl90by5wdHIsIHJlYWRlcl9mcm9tLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2U2VxUG9wTXVsdGkoIHNlcSwgMCwgc2xpY2UuZW5kX2luZGV4IC0gc2xpY2Uuc3RhcnRfaW5kZXgsIDEgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBjdlNlcVBvcE11bHRpKCBzZXEsIDAsIHRvdGFsIC0gc2xpY2Uuc3RhcnRfaW5kZXggKTsKKyAgICAgICAgY3ZTZXFQb3BNdWx0aSggc2VxLCAwLCBzbGljZS5lbmRfaW5kZXggLSB0b3RhbCwgMSApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLy8gSW5zZXJ0IGEgc2VxdWVuY2UgaW50byB0aGUgbWlkZGxlIG9mIGFub3RoZXIgc2VxdWVuY2U6CisvLyAhISEgVE9ETyAhISEgSW1wbGVtZW50IG1vcmUgZWZmaWNpZW50IGFsZ29yaXRobQorQ1ZfSU1QTCB2b2lkCitjdlNlcUluc2VydFNsaWNlKCBDdlNlcSogc2VxLCBpbnQgaW5kZXgsIGNvbnN0IEN2QXJyKiBmcm9tX2FyciApCit7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyX3RvLCByZWFkZXJfZnJvbTsKKyAgICBpbnQgaSwgZWxlbV9zaXplLCB0b3RhbCwgZnJvbV90b3RhbDsKKworICAgIENWX0ZVTkNOQU1FKCJjdlNlcUluc2VydFNsaWNlIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcSBmcm9tX2hlYWRlciwgKmZyb20gPSAoQ3ZTZXEqKWZyb21fYXJyOworICAgIEN2U2VxQmxvY2sgYmxvY2s7CisKKyAgICBpZiggIUNWX0lTX1NFUShzZXEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgZGVzdGluYXRpb24gc2VxdWVuY2UgaGVhZGVyIiApOworCisgICAgaWYoICFDVl9JU19TRVEoZnJvbSkpCisgICAgeworICAgICAgICBDdk1hdCogbWF0ID0gKEN2TWF0Kilmcm9tOworICAgICAgICBpZiggIUNWX0lTX01BVChtYXQpKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlNvdXJjZSBpcyBub3QgYSBzZXF1ZW5jZSBub3IgbWF0cml4IiApOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQobWF0LT50eXBlKSB8fCAobWF0LT5yb3dzICE9IDEgJiYgbWF0LT5jb2xzICE9IDEpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgc291cmNlIGFycmF5IG11c3QgYmUgMWQgY29uaW51b3VzIHZlY3RvciIgKTsKKworICAgICAgICBDVl9DQUxMKCBmcm9tID0gY3ZNYWtlU2VxSGVhZGVyRm9yQXJyYXkoIENWX1NFUV9LSU5EX0dFTkVSSUMsIHNpemVvZihmcm9tX2hlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LT5kYXRhLnB0ciwgbWF0LT5jb2xzICsgbWF0LT5yb3dzIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJvbV9oZWFkZXIsICZibG9jayApKTsKKyAgICB9CisKKyAgICBpZiggc2VxLT5lbGVtX3NpemUgIT0gZnJvbS0+ZWxlbV9zaXplICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiU291cmNlIGFuZCBkZXN0aW5hdGlvbiBzZXF1ZW5jZSBlbGVtZW50IHNpemVzIGFyZSBkaWZmZXJlbnQuIiApOworCisgICAgZnJvbV90b3RhbCA9IGZyb20tPnRvdGFsOworCisgICAgaWYoIGZyb21fdG90YWwgPT0gMCApCisgICAgICAgIEVYSVQ7CisKKyAgICB0b3RhbCA9IHNlcS0+dG90YWw7CisgICAgaW5kZXggKz0gaW5kZXggPCAwID8gdG90YWwgOiAwOworICAgIGluZGV4IC09IGluZGV4ID4gdG90YWwgPyB0b3RhbCA6IDA7CisKKyAgICBpZiggKHVuc2lnbmVkKWluZGV4ID4gKHVuc2lnbmVkKXRvdGFsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKworICAgIGlmKCBpbmRleCA8ICh0b3RhbCA+PiAxKSApCisgICAgeworICAgICAgICBjdlNlcVB1c2hNdWx0aSggc2VxLCAwLCBmcm9tX3RvdGFsLCAxICk7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlcl90byApOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyX2Zyb20gKTsKKyAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXJfZnJvbSwgZnJvbV90b3RhbCApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpbmRleDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIHJlYWRlcl90by5wdHIsIHJlYWRlcl9mcm9tLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlcl90byApOworICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXJfZnJvbSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN2U2VxUHVzaE11bHRpKCBzZXEsIDAsIGZyb21fdG90YWwgKTsKKworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyX3RvICk7CisgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyZWFkZXJfZnJvbSApOworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlcl9mcm9tLCB0b3RhbCApOworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlcl90bywgc2VxLT50b3RhbCApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbCAtIGluZGV4OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9QUkVWX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlcl90byApOworICAgICAgICAgICAgQ1ZfUFJFVl9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXJfZnJvbSApOworICAgICAgICAgICAgQ1ZfTUVNQ1BZX0FVVE8oIHJlYWRlcl90by5wdHIsIHJlYWRlcl9mcm9tLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggZnJvbSwgJnJlYWRlcl9mcm9tICk7CisgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZyZWFkZXJfdG8sIGluZGV4ICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZnJvbV90b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIENWX01FTUNQWV9BVVRPKCByZWFkZXJfdG8ucHRyLCByZWFkZXJfZnJvbS5wdHIsIGVsZW1fc2l6ZSApOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlcl90byApOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJlYWRlcl9mcm9tICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLy8gU29ydCB0aGUgc2VxdWVuY2UgdXNpbmcgdXNlci1zcGVjaWZpZWQgY29tcGFyaXNvbiBmdW5jdGlvbi4KKy8vIFRoZSBzZW1hbnRpY3MgaXMgc2ltaWxhciB0byBxc29ydCgpIGZ1bmN0aW9uLgorLy8gVGhlIGNvZGUgaXMgYmFzZWQgb24gQlNEIHN5c3RlbSBxc29ydCgpOgorLy8gICAgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKy8vICAgICogIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gICAgKgorLy8gICAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vICAgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisvLyAgICAqIGFyZSBtZXQ6CisvLyAgICAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyAgICAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorLy8gICAgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8gICAgKiAzLiBBbGwgYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzIG1lbnRpb25pbmcgZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUKKy8vICAgICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorLy8gICAgKiAgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgorLy8gICAgKiAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisvLyAgICAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisvLyAgICAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorLy8gICAgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vICAgICoKKy8vICAgICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKy8vICAgICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisvLyAgICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisvLyAgICAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorLy8gICAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorLy8gICAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworLy8gICAgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKy8vICAgICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKy8vICAgICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorLy8gICAgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisvLyAgICAqIFNVQ0ggREFNQUdFLgorCit0eXBlZGVmIHN0cnVjdCBDdlNlcVJlYWRlclBvcworeworICAgIEN2U2VxQmxvY2sqIGJsb2NrOworICAgIHNjaGFyKiBwdHI7CisgICAgc2NoYXIqIGJsb2NrX21pbjsKKyAgICBzY2hhciogYmxvY2tfbWF4OworfQorQ3ZTZXFSZWFkZXJQb3M7CisKKyNkZWZpbmUgQ1ZfU0FWRV9SRUFERVJfUE9TKCByZWFkZXIsIHBvcyApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHBvcykuYmxvY2sgPSAocmVhZGVyKS5ibG9jazsgICAgICAgICAgIFwKKyAgICAocG9zKS5wdHIgPSAocmVhZGVyKS5wdHI7ICAgICAgICAgICAgICAgXAorICAgIChwb3MpLmJsb2NrX21pbiA9IChyZWFkZXIpLmJsb2NrX21pbjsgICBcCisgICAgKHBvcykuYmxvY2tfbWF4ID0gKHJlYWRlcikuYmxvY2tfbWF4OyAgIFwKK30KKworI2RlZmluZSBDVl9SRVNUT1JFX1JFQURFUl9QT1MoIHJlYWRlciwgcG9zIClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAocmVhZGVyKS5ibG9jayA9IChwb3MpLmJsb2NrOyAgICAgICAgICAgXAorICAgIChyZWFkZXIpLnB0ciA9IChwb3MpLnB0cjsgICAgICAgICAgICAgICBcCisgICAgKHJlYWRlcikuYmxvY2tfbWluID0gKHBvcykuYmxvY2tfbWluOyAgIFwKKyAgICAocmVhZGVyKS5ibG9ja19tYXggPSAocG9zKS5ibG9ja19tYXg7ICAgXAorfQorCitpbmxpbmUgc2NoYXIqCitpY3ZNZWQzKCBzY2hhciogYSwgc2NoYXIqIGIsIHNjaGFyKiBjLCBDdkNtcEZ1bmMgY21wX2Z1bmMsIHZvaWQqIGF1eCApCit7CisgICAgcmV0dXJuIGNtcF9mdW5jKGEsIGIsIGF1eCkgPCAwID8KKyAgICAgIChjbXBfZnVuYyhiLCBjLCBhdXgpIDwgMCA/IGIgOiBjbXBfZnVuYyhhLCBjLCBhdXgpIDwgMCA/IGMgOiBhKQorICAgICA6KGNtcF9mdW5jKGIsIGMsIGF1eCkgPiAwID8gYiA6IGNtcF9mdW5jKGEsIGMsIGF1eCkgPCAwID8gYSA6IGMpOworfQorCitDVl9JTVBMIHZvaWQKK2N2U2VxU29ydCggQ3ZTZXEqIHNlcSwgQ3ZDbXBGdW5jIGNtcF9mdW5jLCB2b2lkKiBhdXggKQoreworICAgIGludCBlbGVtX3NpemU7CisgICAgaW50IGlzb3J0X3RocmVzaCA9IDc7CisgICAgQ3ZTZXFSZWFkZXIgbGVmdCwgcmlnaHQ7CisgICAgaW50IHNwID0gMDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgQ3ZTZXFSZWFkZXJQb3MgbGI7CisgICAgICAgIEN2U2VxUmVhZGVyUG9zIHViOworICAgIH0KKyAgICBzdGFja1s0OF07CisKKyAgICBDVl9GVU5DTkFNRSggImN2U2VxU29ydCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhQ1ZfSVNfU0VRKHNlcSkgKQorICAgICAgICBDVl9FUlJPUiggIXNlcSA/IENWX1N0c051bGxQdHIgOiBDVl9TdHNCYWRBcmcsICJCYWQgaW5wdXQgc2VxdWVuY2UiICk7CisKKyAgICBpZiggIWNtcF9mdW5jICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGNvbXBhcmUgZnVuY3Rpb24iICk7CisKKyAgICBpZiggc2VxLT50b3RhbCA8PSAxICkKKyAgICAgICAgRVhJVDsKKworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworICAgIGlzb3J0X3RocmVzaCAqPSBlbGVtX3NpemU7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmbGVmdCwgMCApOworICAgIHJpZ2h0ID0gbGVmdDsKKyAgICBDVl9TQVZFX1JFQURFUl9QT1MoIGxlZnQsIHN0YWNrWzBdLmxiICk7CisgICAgQ1ZfUFJFVl9TRVFfRUxFTSggZWxlbV9zaXplLCByaWdodCApOworICAgIENWX1NBVkVfUkVBREVSX1BPUyggcmlnaHQsIHN0YWNrWzBdLnViICk7CisKKyAgICB3aGlsZSggc3AgPj0gMCApCisgICAgeworICAgICAgICBDVl9SRVNUT1JFX1JFQURFUl9QT1MoIGxlZnQsIHN0YWNrW3NwXS5sYiApOworICAgICAgICBDVl9SRVNUT1JFX1JFQURFUl9QT1MoIHJpZ2h0LCBzdGFja1tzcF0udWIgKTsKKyAgICAgICAgc3AtLTsKKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBuLCBtOworICAgICAgICAgICAgQ3ZTZXFSZWFkZXIgcHRyLCBwdHIyOworCisgICAgICAgICAgICBpZiggbGVmdC5ibG9jayA9PSByaWdodC5ibG9jayApCisgICAgICAgICAgICAgICAgbiA9IChpbnQpKHJpZ2h0LnB0ciAtIGxlZnQucHRyKSArIGVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuID0gY3ZHZXRTZXFSZWFkZXJQb3MoICZyaWdodCApOworICAgICAgICAgICAgICAgIG4gPSAobiAtIGN2R2V0U2VxUmVhZGVyUG9zKCAmbGVmdCApICsgMSkqZWxlbV9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbiA8PSBpc29ydF90aHJlc2ggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgaW5zZXJ0X3NvcnQ6CisgICAgICAgICAgICAgICAgcHRyID0gcHRyMiA9IGxlZnQ7CisgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCBwdHIgKTsKKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJpZ2h0ICk7CisgICAgICAgICAgICAgICAgd2hpbGUoIHB0ci5wdHIgIT0gcmlnaHQucHRyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHB0cjIucHRyID0gcHRyLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHB0cjIuYmxvY2sgIT0gcHRyLmJsb2NrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcHRyMi5ibG9jayA9IHB0ci5ibG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cjIuYmxvY2tfbWluID0gcHRyLmJsb2NrX21pbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0cjIuYmxvY2tfbWF4ID0gcHRyLmJsb2NrX21heDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggcHRyMi5wdHIgIT0gbGVmdC5wdHIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hhciogY3VyID0gcHRyMi5wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9QUkVWX1NFUV9FTEVNKCBlbGVtX3NpemUsIHB0cjIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbXBfZnVuYyggcHRyMi5wdHIsIGN1ciwgYXV4ICkgPD0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9TV0FQX0VMRU1TKCBwdHIyLnB0ciwgY3VyLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHB0ciApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlNlcVJlYWRlciBsZWZ0MCwgbGVmdDEsIHJpZ2h0MCwgcmlnaHQxOworICAgICAgICAgICAgICAgIEN2U2VxUmVhZGVyIHRtcDAsIHRtcDE7CisgICAgICAgICAgICAgICAgc2NoYXIgKm0xLCAqbTIsICptMywgKnBpdm90OworICAgICAgICAgICAgICAgIGludCBzd2FwX2NudCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGwsIGwwLCBsMSwgciwgcjAsIHIxOworCisgICAgICAgICAgICAgICAgbGVmdDAgPSB0bXAwID0gbGVmdDsKKyAgICAgICAgICAgICAgICByaWdodDAgPSByaWdodDEgPSByaWdodDsKKyAgICAgICAgICAgICAgICBuIC89IGVsZW1fc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmKCBuID4gNDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGQgPSBuIC8gODsKKyAgICAgICAgICAgICAgICAgICAgc2NoYXIgKnAxLCAqcDIsICpwMzsKKyAgICAgICAgICAgICAgICAgICAgcDEgPSB0bXAwLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZ0bXAwLCBkLCAxICk7CisgICAgICAgICAgICAgICAgICAgIHAyID0gdG1wMC5wdHI7CisgICAgICAgICAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmdG1wMCwgZCwgMSApOworICAgICAgICAgICAgICAgICAgICBwMyA9IHRtcDAucHRyOworICAgICAgICAgICAgICAgICAgICBtMSA9IGljdk1lZDMoIHAxLCBwMiwgcDMsIGNtcF9mdW5jLCBhdXggKTsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZ0bXAwLCAobi8yKSAtIGQqMywgMSApOworICAgICAgICAgICAgICAgICAgICBwMSA9IHRtcDAucHRyOworICAgICAgICAgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnRtcDAsIGQsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgcDIgPSB0bXAwLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZ0bXAwLCBkLCAxICk7CisgICAgICAgICAgICAgICAgICAgIHAzID0gdG1wMC5wdHI7CisgICAgICAgICAgICAgICAgICAgIG0yID0gaWN2TWVkMyggcDEsIHAyLCBwMywgY21wX2Z1bmMsIGF1eCApOworICAgICAgICAgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnRtcDAsIG4gLSAxIC0gZCozIC0gbi8yLCAxICk7CisgICAgICAgICAgICAgICAgICAgIHAxID0gdG1wMC5wdHI7CisgICAgICAgICAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmdG1wMCwgZCwgMSApOworICAgICAgICAgICAgICAgICAgICBwMiA9IHRtcDAucHRyOworICAgICAgICAgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnRtcDAsIGQsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgcDMgPSB0bXAwLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgbTMgPSBpY3ZNZWQzKCBwMSwgcDIsIHAzLCBjbXBfZnVuYywgYXV4ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG0xID0gdG1wMC5wdHI7CisgICAgICAgICAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmdG1wMCwgbi8yLCAxICk7CisgICAgICAgICAgICAgICAgICAgIG0yID0gdG1wMC5wdHI7CisgICAgICAgICAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmdG1wMCwgbiAtIDEgLSBuLzIsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgbTMgPSB0bXAwLnB0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwaXZvdCA9IGljdk1lZDMoIG0xLCBtMiwgbTMsIGNtcF9mdW5jLCBhdXggKTsKKyAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdDA7CisgICAgICAgICAgICAgICAgaWYoIHBpdm90ICE9IGxlZnQucHRyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX1NXQVBfRUxFTVMoIHBpdm90LCBsZWZ0LnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIHBpdm90ID0gbGVmdC5wdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgbGVmdCApOworICAgICAgICAgICAgICAgIGxlZnQxID0gbGVmdDsKKworICAgICAgICAgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBsZWZ0LnB0ciAhPSByaWdodC5wdHIgJiYgKHIgPSBjbXBfZnVuYyhsZWZ0LnB0ciwgcGl2b3QsIGF1eCkpIDw9IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggciA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbGVmdDEucHRyICE9IGxlZnQucHRyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUF9FTEVNUyggbGVmdDEucHRyLCBsZWZ0LnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9jbnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgbGVmdDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgbGVmdCApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIGxlZnQucHRyICE9IHJpZ2h0LnB0ciAmJiAociA9IGNtcF9mdW5jKHJpZ2h0LnB0cixwaXZvdCwgYXV4KSkgPj0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByaWdodDEucHRyICE9IHJpZ2h0LnB0ciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVBfRUxFTVMoIHJpZ2h0MS5wdHIsIHJpZ2h0LnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9jbnQgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1BSRVZfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmlnaHQxICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9QUkVWX1NFUV9FTEVNKCBlbGVtX3NpemUsIHJpZ2h0ICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiggbGVmdC5wdHIgPT0gcmlnaHQucHRyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgciA9IGNtcF9mdW5jKGxlZnQucHRyLCBwaXZvdCwgYXV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsZWZ0MS5wdHIgIT0gbGVmdC5wdHIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9TV0FQX0VMRU1TKCBsZWZ0MS5wdHIsIGxlZnQucHRyLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwX2NudCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCBsZWZ0MSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHIgPD0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCBsZWZ0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUFJFVl9TRVFfRUxFTSggZWxlbV9zaXplLCByaWdodCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBDVl9TV0FQX0VMRU1TKCBsZWZ0LnB0ciwgcmlnaHQucHRyLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCBsZWZ0ICk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBsZWZ0LnB0ciA9PSByaWdodC5wdHI7CisgICAgICAgICAgICAgICAgICAgIENWX1BSRVZfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmlnaHQgKTsKKyAgICAgICAgICAgICAgICAgICAgc3dhcF9jbnQgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiggciApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggc3dhcF9jbnQgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdDAsIHJpZ2h0ID0gcmlnaHQwOworICAgICAgICAgICAgICAgICAgICBnb3RvIGluc2VydF9zb3J0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGwgPSBjdkdldFNlcVJlYWRlclBvcyggJmxlZnQgKTsKKyAgICAgICAgICAgICAgICBpZiggbCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgbCA9IHNlcS0+dG90YWw7CisgICAgICAgICAgICAgICAgbDAgPSBjdkdldFNlcVJlYWRlclBvcyggJmxlZnQwICk7CisgICAgICAgICAgICAgICAgbDEgPSBjdkdldFNlcVJlYWRlclBvcyggJmxlZnQxICk7CisgICAgICAgICAgICAgICAgaWYoIGwxID09IDAgKQorICAgICAgICAgICAgICAgICAgICBsMSA9IHNlcS0+dG90YWw7CisKKyAgICAgICAgICAgICAgICBuID0gTUlOKCBsIC0gbDEsIGwxIC0gbDAgKTsKKyAgICAgICAgICAgICAgICBpZiggbiA+IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMCA9IGxlZnQwOworICAgICAgICAgICAgICAgICAgICB0bXAxID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZ0bXAxLCAwLW4sIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVBfRUxFTVMoIHRtcDAucHRyLCB0bXAxLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHRtcDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgdG1wMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgciA9IGN2R2V0U2VxUmVhZGVyUG9zKCAmcmlnaHQgKTsKKyAgICAgICAgICAgICAgICByMCA9IGN2R2V0U2VxUmVhZGVyUG9zKCAmcmlnaHQwICk7CisgICAgICAgICAgICAgICAgcjEgPSBjdkdldFNlcVJlYWRlclBvcyggJnJpZ2h0MSApOworICAgICAgICAgICAgICAgIG0gPSBNSU4oIHIwIC0gcjEsIHIxIC0gciApOworICAgICAgICAgICAgICAgIGlmKCBtID4gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0bXAwID0gbGVmdDsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IHJpZ2h0MDsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZ0bXAxLCAxLW0sIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG07IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVBfRUxFTVMoIHRtcDAucHRyLCB0bXAxLnB0ciwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIHRtcDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgdG1wMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbiA9IGwgLSBsMTsKKyAgICAgICAgICAgICAgICBtID0gcjEgLSByOworICAgICAgICAgICAgICAgIGlmKCBuID4gMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbSA+IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbiA+IG0gKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU0FWRV9SRUFERVJfUE9TKCBsZWZ0MCwgc3RhY2tbc3BdLmxiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZsZWZ0MCwgbiAtIDEsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9TQVZFX1JFQURFUl9QT1MoIGxlZnQwLCBzdGFja1tzcF0udWIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPSByaWdodDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZsZWZ0LCAxIC0gbSwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU0FWRV9SRUFERVJfUE9TKCByaWdodDAsIHN0YWNrW3NwXS51YiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmlnaHQwLCAxIC0gbSwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NBVkVfUkVBREVSX1BPUyggcmlnaHQwLCBzdGFja1tzcF0ubGIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gcmlnaHQgPSBsZWZ0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJpZ2h0LCBuIC0gMSwgMSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gbGVmdDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJpZ2h0LCBuIC0gMSwgMSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIG0gPiAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSByaWdodCA9IHJpZ2h0MDsKKyAgICAgICAgICAgICAgICAgICAgY3ZTZXRTZXFSZWFkZXJQb3MoICZsZWZ0LCAxIC0gbSwgMSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHNjaGFyKgorY3ZTZXFTZWFyY2goIEN2U2VxKiBzZXEsIGNvbnN0IHZvaWQqIF9lbGVtLCBDdkNtcEZ1bmMgY21wX2Z1bmMsCisgICAgICAgICAgICAgaW50IGlzX3NvcnRlZCwgaW50KiBfaWR4LCB2b2lkKiB1c2VyZGF0YSApCit7CisgICAgc2NoYXIqIHJlc3VsdCA9IDA7CisgICAgY29uc3Qgc2NoYXIqIGVsZW0gPSAoY29uc3Qgc2NoYXIqKV9lbGVtOworICAgIGludCBpZHggPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCJjdlNlcVNlYXJjaCIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGVsZW1fc2l6ZSwgaSwgaiwgdG90YWw7CisKKyAgICBpZiggIUNWX0lTX1NFUShzZXEpICkKKyAgICAgICAgQ1ZfRVJST1IoICFzZXEgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiQmFkIGlucHV0IHNlcXVlbmNlIiApOworCisgICAgaWYoICFlbGVtICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGVsZW1lbnQgcG9pbnRlciIgKTsKKworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworICAgIHRvdGFsID0gc2VxLT50b3RhbDsKKworICAgIGlmKCB0b3RhbCA9PSAwICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCAhaXNfc29ydGVkICkKKyAgICB7CisgICAgICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlciwgMCApOworCisgICAgICAgIGlmKCBjbXBfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY21wX2Z1bmMoIGVsZW0sIHJlYWRlci5wdHIsIHVzZXJkYXRhICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggKGVsZW1fc2l6ZSAmIChzaXplb2YoaW50KS0xKSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZWxlbV9zaXplOyBqICs9IHNpemVvZihpbnQpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAqKGNvbnN0IGludCopKHJlYWRlci5wdHIgKyBqKSAhPSAqKGNvbnN0IGludCopKGVsZW0gKyBqKSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGogPT0gZWxlbV9zaXplICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZWxlbV9zaXplOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJlYWRlci5wdHJbal0gIT0gZWxlbVtqXSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIGogPT0gZWxlbV9zaXplICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlkeCA9IGk7CisgICAgICAgIGlmKCBpIDwgdG90YWwgKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVhZGVyLnB0cjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICFjbXBfZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgY29tcGFyZSBmdW5jdGlvbiIgKTsKKworICAgICAgICBpID0gMCwgaiA9IHRvdGFsOworCisgICAgICAgIHdoaWxlKCBqID4gaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBrID0gKGkraik+PjEsIGNvZGU7CisgICAgICAgICAgICBzY2hhciogcHRyID0gY3ZHZXRTZXFFbGVtKCBzZXEsIGsgKTsKKyAgICAgICAgICAgIGNvZGUgPSBjbXBfZnVuYyggZWxlbSwgcHRyLCB1c2VyZGF0YSApOworICAgICAgICAgICAgaWYoICFjb2RlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBwdHI7CisgICAgICAgICAgICAgICAgaWR4ID0gazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIGNvZGUgPCAwICkKKyAgICAgICAgICAgICAgICBqID0gazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpID0gaysxOworICAgICAgICB9CisgICAgICAgIGlkeCA9IGo7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBfaWR4ICkKKyAgICAgICAgKl9pZHggPSBpZHg7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZTZXFJbnZlcnQoIEN2U2VxKiBzZXEgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXFJbnZlcnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcVJlYWRlciBsZWZ0X3JlYWRlciwgcmlnaHRfcmVhZGVyOworICAgIGludCBlbGVtX3NpemU7CisgICAgaW50IGksIGNvdW50OworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNlcSwgJmxlZnRfcmVhZGVyLCAwICkpOworICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyaWdodF9yZWFkZXIsIDEgKSk7CisgICAgZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemU7CisgICAgY291bnQgPSBzZXEtPnRvdGFsID4+IDE7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDVl9TV0FQX0VMRU1TKCBsZWZ0X3JlYWRlci5wdHIsIHJpZ2h0X3JlYWRlci5wdHIsIGVsZW1fc2l6ZSApOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtX3NpemUsIGxlZnRfcmVhZGVyICk7CisgICAgICAgIENWX1BSRVZfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmlnaHRfcmVhZGVyICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit0eXBlZGVmIHN0cnVjdCBDdlBUcmVlTm9kZQoreworICAgIHN0cnVjdCBDdlBUcmVlTm9kZSogcGFyZW50OworICAgIHNjaGFyKiBlbGVtZW50OworICAgIGludCByYW5rOworfQorQ3ZQVHJlZU5vZGU7CisKKworLy8gVGhpcyBmdW5jdGlvbiBzcGxpdHMgdGhlIGlucHV0IHNlcXVlbmNlIG9yIHNldCBpbnRvIG9uZSBvciBtb3JlIGVxdWl2YWxlbmNlIGNsYXNzZXMuCisvLyBpc19lcXVhbChhLGIsLi4uKSByZXR1cm5zIG5vbi16ZXJvIGlmIHRoZSB0d28gc2VxdWVuY2UgZWxlbWVudHMKKy8vIGJlbG9uZyB0byB0aGUgc2FtZSBjbGFzcy4gIFRoZSBmdW5jdGlvbiByZXR1cm5zIHNlcXVlbmNlIG9mIGludGVnZXJzIC0KKy8vIDAtYmFzZWQgY2xhc3MgaW5kZXhlcyBmb3IgZWFjaCBlbGVtZW50LgorLy8KKy8vIFRoZSBhbGdvcml0aG0gaXMgZGVzY3JpYmVkIGluICJJbnRyb2R1Y3Rpb24gdG8gQWxnb3JpdGhtcyIKKy8vIGJ5IENvcm1lbiwgTGVpc2Vyc29uIGFuZCBSaXZlc3QsIGNoYXB0ZXIgIkRhdGEgc3RydWN0dXJlcyBmb3IgZGlzam9pbnQgc2V0cyIKK0NWX0lNUEwgIGludAorY3ZTZXFQYXJ0aXRpb24oIGNvbnN0IEN2U2VxKiBzZXEsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTZXEqKiBsYWJlbHMsCisgICAgICAgICAgICAgICAgQ3ZDbXBGdW5jIGlzX2VxdWFsLCB2b2lkKiB1c2VyZGF0YSApCit7CisgICAgQ3ZTZXEqIHJlc3VsdCA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2UgPSAwOworICAgIGludCBjbGFzc19pZHggPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNlcVBhcnRpdGlvbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxV3JpdGVyIHdyaXRlcjsKKyAgICBDdlNlcVJlYWRlciByZWFkZXIsIHJlYWRlcjA7CisgICAgQ3ZTZXEqIG5vZGVzOworICAgIGludCBpLCBqOworICAgIGludCBpc19zZXQ7CisKKyAgICBpZiggIWxhYmVscyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICFzZXEgfHwgIWlzX2VxdWFsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBzdG9yYWdlID0gc2VxLT5zdG9yYWdlOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpc19zZXQgPSBDVl9JU19TRVQoc2VxKTsKKworICAgIHRlbXBfc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBzdG9yYWdlICk7CisKKyAgICBub2RlcyA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZQVHJlZU5vZGUpLCB0ZW1wX3N0b3JhZ2UgKTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyZWFkZXIgKTsKKyAgICBtZW1zZXQoICZ3cml0ZXIsIDAsIHNpemVvZih3cml0ZXIpKTsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIG5vZGVzLCAmd3JpdGVyICk7CisKKyAgICAvLyBJbml0aWFsIE8oTikgcGFzcy4gTWFrZSBhIGZvcmVzdCBvZiBzaW5nbGUtdmVydGV4IHRyZWVzLgorICAgIGZvciggaSA9IDA7IGkgPCBzZXEtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZQVHJlZU5vZGUgbm9kZSA9IHsgMCwgMCwgMCB9OworICAgICAgICBpZiggIWlzX3NldCB8fCBDVl9JU19TRVRfRUxFTSggcmVhZGVyLnB0ciApKQorICAgICAgICAgICAgbm9kZS5lbGVtZW50ID0gcmVhZGVyLnB0cjsKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIG5vZGUsIHdyaXRlciApOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzZXEtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworCisgICAgLy8gQmVjYXVzZSBpbiB0aGUgbmV4dCBsb29wIHdlIHdpbGwgaXRlcmF0ZQorICAgIC8vIHRocm91Z2ggYWxsIHRoZSBzZXF1ZW5jZSBub2RlcyBlYWNoIHRpbWUsCisgICAgLy8gd2UgZG8gbm90IG5lZWQgdG8gaW5pdGlhbGl6ZSByZWFkZXIgZXZlcnkgdGltZToKKyAgICBjdlN0YXJ0UmVhZFNlcSggbm9kZXMsICZyZWFkZXIgKTsKKyAgICBjdlN0YXJ0UmVhZFNlcSggbm9kZXMsICZyZWFkZXIwICk7CisKKyAgICAvLyBUaGUgbWFpbiBPKE5eMikgcGFzcy4gTWVyZ2UgY29ubmVjdGVkIGNvbXBvbmVudHMuCisgICAgZm9yKCBpID0gMDsgaSA8IG5vZGVzLT50b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2UFRyZWVOb2RlKiBub2RlID0gKEN2UFRyZWVOb2RlKikocmVhZGVyMC5wdHIpOworICAgICAgICBDdlBUcmVlTm9kZSogcm9vdCA9IG5vZGU7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIG5vZGVzLT5lbGVtX3NpemUsIHJlYWRlcjAgKTsKKworICAgICAgICBpZiggIW5vZGUtPmVsZW1lbnQgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gZmluZCByb290CisgICAgICAgIHdoaWxlKCByb290LT5wYXJlbnQgKQorICAgICAgICAgICAgcm9vdCA9IHJvb3QtPnBhcmVudDsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgbm9kZXMtPnRvdGFsOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBUcmVlTm9kZSogbm9kZTIgPSAoQ3ZQVHJlZU5vZGUqKXJlYWRlci5wdHI7CisKKyAgICAgICAgICAgIGlmKCBub2RlMi0+ZWxlbWVudCAmJiBub2RlMiAhPSBub2RlICYmCisgICAgICAgICAgICAgICAgaXNfZXF1YWwoIG5vZGUtPmVsZW1lbnQsIG5vZGUyLT5lbGVtZW50LCB1c2VyZGF0YSApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2UFRyZWVOb2RlKiByb290MiA9IG5vZGUyOworCisgICAgICAgICAgICAgICAgLy8gdW5pdGUgYm90aCB0cmVlcworICAgICAgICAgICAgICAgIHdoaWxlKCByb290Mi0+cGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgcm9vdDIgPSByb290Mi0+cGFyZW50OworCisgICAgICAgICAgICAgICAgaWYoIHJvb3QyICE9IHJvb3QgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHJvb3QtPnJhbmsgPiByb290Mi0+cmFuayApCisgICAgICAgICAgICAgICAgICAgICAgICByb290Mi0+cGFyZW50ID0gcm9vdDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICByb290LT5wYXJlbnQgPSByb290MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QyLT5yYW5rICs9IHJvb3QtPnJhbmsgPT0gcm9vdDItPnJhbms7CisgICAgICAgICAgICAgICAgICAgICAgICByb290ID0gcm9vdDI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCByb290LT5wYXJlbnQgPT0gMCApOworCisgICAgICAgICAgICAgICAgICAgIC8vIENvbXByZXNzIHBhdGggZnJvbSBub2RlMiB0byB0aGUgcm9vdDoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoIG5vZGUyLT5wYXJlbnQgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDdlBUcmVlTm9kZSogdGVtcCA9IG5vZGUyOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTIgPSBub2RlMi0+cGFyZW50OworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcC0+cGFyZW50ID0gcm9vdDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIENvbXByZXNzIHBhdGggZnJvbSBub2RlIHRvIHRoZSByb290OgorICAgICAgICAgICAgICAgICAgICBub2RlMiA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBub2RlMi0+cGFyZW50ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZQVHJlZU5vZGUqIHRlbXAgPSBub2RlMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUyID0gbm9kZTItPnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAtPnBhcmVudCA9IHJvb3Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZigqbm9kZSksIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRmluYWwgTyhOKSBwYXNzIChFbnVtZXJhdGUgY2xhc3NlcykKKyAgICAvLyBSZXVzZSByZWFkZXIgb25lIG1vcmUgdGltZQorICAgIHJlc3VsdCA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoaW50KSwgc3RvcmFnZSApOworICAgIGN2U3RhcnRBcHBlbmRUb1NlcSggcmVzdWx0LCAmd3JpdGVyICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbm9kZXMtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZQVHJlZU5vZGUqIG5vZGUgPSAoQ3ZQVHJlZU5vZGUqKXJlYWRlci5wdHI7CisgICAgICAgIGludCBpZHggPSAtMTsKKworICAgICAgICBpZiggbm9kZS0+ZWxlbWVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCBub2RlLT5wYXJlbnQgKQorICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnQ7CisgICAgICAgICAgICBpZiggbm9kZS0+cmFuayA+PSAwICkKKyAgICAgICAgICAgICAgICBub2RlLT5yYW5rID0gfmNsYXNzX2lkeCsrOworICAgICAgICAgICAgaWR4ID0gfm5vZGUtPnJhbms7CisgICAgICAgIH0KKworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzaXplb2YoKm5vZGUpLCByZWFkZXIgKTsKKyAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGlkeCwgd3JpdGVyICk7CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBsYWJlbHMgKQorICAgICAgICAqbGFiZWxzID0gcmVzdWx0OworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworICAgIHJldHVybiBjbGFzc19pZHg7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDcmVhdGVzIGVtcHR5IHNldDogKi8KK0NWX0lNUEwgQ3ZTZXQqCitjdkNyZWF0ZVNldCggaW50IHNldF9mbGFncywgaW50IGhlYWRlcl9zaXplLCBpbnQgZWxlbV9zaXplLCBDdk1lbVN0b3JhZ2UgKiBzdG9yYWdlICkKK3sKKyAgICBDdlNldCAqc2V0ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVTZXQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXN0b3JhZ2UgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKyAgICBpZiggaGVhZGVyX3NpemUgPCAoaW50KXNpemVvZiggQ3ZTZXQgKSB8fAorICAgICAgICBlbGVtX3NpemUgPCAoaW50KXNpemVvZih2b2lkKikqMiB8fAorICAgICAgICAoZWxlbV9zaXplICYgKHNpemVvZih2b2lkKiktMSkpICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIiIgKTsKKworICAgIHNldCA9IChDdlNldCopIGN2Q3JlYXRlU2VxKCBzZXRfZmxhZ3MsIGhlYWRlcl9zaXplLCBlbGVtX3NpemUsIHN0b3JhZ2UgKTsKKyAgICBzZXQtPmZsYWdzID0gKHNldC0+ZmxhZ3MgJiB+Q1ZfTUFHSUNfTUFTSykgfCBDVl9TRVRfTUFHSUNfVkFMOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzZXQ7Cit9CisKKworLyogQWRkIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQ6ICovCitDVl9JTVBMIGludAorY3ZTZXRBZGQoIEN2U2V0KiBzZXQsIEN2U2V0RWxlbSogZWxlbWVudCwgQ3ZTZXRFbGVtKiogaW5zZXJ0ZWRfZWxlbWVudCApCit7CisgICAgaW50IGlkID0gLTE7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0QWRkIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXRFbGVtICpmcmVlX2VsZW07CisKKyAgICBpZiggIXNldCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoICEoc2V0LT5mcmVlX2VsZW1zKSApCisgICAgeworICAgICAgICBpbnQgY291bnQgPSBzZXQtPnRvdGFsOworICAgICAgICBpbnQgZWxlbV9zaXplID0gc2V0LT5lbGVtX3NpemU7CisgICAgICAgIHNjaGFyICpwdHI7CisgICAgICAgIENWX0NBTEwoIGljdkdyb3dTZXEoIChDdlNlcSAqKSBzZXQsIDAgKSk7CisKKyAgICAgICAgc2V0LT5mcmVlX2VsZW1zID0gKEN2U2V0RWxlbSopIChwdHIgPSBzZXQtPnB0cik7CisgICAgICAgIGZvciggOyBwdHIgKyBlbGVtX3NpemUgPD0gc2V0LT5ibG9ja19tYXg7IHB0ciArPSBlbGVtX3NpemUsIGNvdW50KysgKQorICAgICAgICB7CisgICAgICAgICAgICAoKEN2U2V0RWxlbSopcHRyKS0+ZmxhZ3MgPSBjb3VudCB8IENWX1NFVF9FTEVNX0ZSRUVfRkxBRzsKKyAgICAgICAgICAgICgoQ3ZTZXRFbGVtKilwdHIpLT5uZXh0X2ZyZWUgPSAoQ3ZTZXRFbGVtKikocHRyICsgZWxlbV9zaXplKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnQoIGNvdW50IDw9IENWX1NFVF9FTEVNX0lEWF9NQVNLKzEgKTsKKyAgICAgICAgKChDdlNldEVsZW0qKShwdHIgLSBlbGVtX3NpemUpKS0+bmV4dF9mcmVlID0gMDsKKyAgICAgICAgc2V0LT5maXJzdC0+cHJldi0+Y291bnQgKz0gY291bnQgLSBzZXQtPnRvdGFsOworICAgICAgICBzZXQtPnRvdGFsID0gY291bnQ7CisgICAgICAgIHNldC0+cHRyID0gc2V0LT5ibG9ja19tYXg7CisgICAgfQorCisgICAgZnJlZV9lbGVtID0gc2V0LT5mcmVlX2VsZW1zOworICAgIHNldC0+ZnJlZV9lbGVtcyA9IGZyZWVfZWxlbS0+bmV4dF9mcmVlOworCisgICAgaWQgPSBmcmVlX2VsZW0tPmZsYWdzICYgQ1ZfU0VUX0VMRU1fSURYX01BU0s7CisgICAgaWYoIGVsZW1lbnQgKQorICAgICAgICBDVl9NRU1DUFlfSU5UKCBmcmVlX2VsZW0sIGVsZW1lbnQsIChzaXplX3Qpc2V0LT5lbGVtX3NpemUvc2l6ZW9mKGludCkgKTsKKworICAgIGZyZWVfZWxlbS0+ZmxhZ3MgPSBpZDsKKyAgICBzZXQtPmFjdGl2ZV9jb3VudCsrOworCisgICAgaWYoIGluc2VydGVkX2VsZW1lbnQgKQorICAgICAgICAqaW5zZXJ0ZWRfZWxlbWVudCA9IGZyZWVfZWxlbTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gaWQ7Cit9CisKKworLyogUmVtb3ZlIGVsZW1lbnQgZnJvbSBhIHNldCBnaXZlbiBlbGVtZW50IGluZGV4OiAqLworQ1ZfSU1QTCB2b2lkCitjdlNldFJlbW92ZSggQ3ZTZXQqIHNldCwgaW50IGluZGV4ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U2V0UmVtb3ZlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXRFbGVtKiBlbGVtID0gY3ZHZXRTZXRFbGVtKCBzZXQsIGluZGV4ICk7CisgICAgaWYoIGVsZW0gKQorICAgICAgICBjdlNldFJlbW92ZUJ5UHRyKCBzZXQsIGVsZW0gKTsKKyAgICBlbHNlIGlmKCAhc2V0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qIFJlbW92ZSBhbGwgZWxlbWVudHMgZnJvbSBhIHNldDogKi8KK0NWX0lNUEwgdm9pZAorY3ZDbGVhclNldCggQ3ZTZXQqIHNldCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsZWFyU2V0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0FMTCggY3ZDbGVhclNlcSggKEN2U2VxKilzZXQgKSk7CisgICAgc2V0LT5mcmVlX2VsZW1zID0gMDsKKyAgICBzZXQtPmFjdGl2ZV9jb3VudCA9IDA7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoICBpbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogQ3JlYXRlIGEgbmV3IGdyYXBoOiAqLworQ1ZfSU1QTCBDdkdyYXBoICoKK2N2Q3JlYXRlR3JhcGgoIGludCBncmFwaF90eXBlLCBpbnQgaGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICBpbnQgdnR4X3NpemUsIGludCBlZGdlX3NpemUsIEN2TWVtU3RvcmFnZSAqIHN0b3JhZ2UgKQoreworICAgIEN2R3JhcGggKmdyYXBoID0gMDsKKyAgICBDdlNldCAqZWRnZXMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNsZWF0ZUdyYXBoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXQgKnZlcnRpY2VzID0gMDsKKworICAgIGlmKCBoZWFkZXJfc2l6ZSA8IChpbnQpIHNpemVvZiggQ3ZHcmFwaCAgICAgKQorICAgIHx8ICBlZGdlX3NpemUgICA8IChpbnQpIHNpemVvZiggQ3ZHcmFwaEVkZ2UgKQorICAgIHx8ICB2dHhfc2l6ZSAgICA8IChpbnQpIHNpemVvZiggQ3ZHcmFwaFZ0eCAgKQorICAgICl7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworICAgIH0KKworICAgIENWX0NBTEwoIHZlcnRpY2VzID0gY3ZDcmVhdGVTZXQoIGdyYXBoX3R5cGUsIGhlYWRlcl9zaXplLCB2dHhfc2l6ZSwgc3RvcmFnZSApKTsKKyAgICBDVl9DQUxMKCBlZGdlcyA9IGN2Q3JlYXRlU2V0KCBDVl9TRVFfS0lORF9HRU5FUklDIHwgQ1ZfU0VRX0VMVFlQRV9HUkFQSF9FREdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZiggQ3ZTZXQgKSwgZWRnZV9zaXplLCBzdG9yYWdlICkpOworCisgICAgZ3JhcGggPSAoQ3ZHcmFwaCopdmVydGljZXM7CisgICAgZ3JhcGgtPmVkZ2VzID0gZWRnZXM7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGdyYXBoOworfQorCisKKy8qIFJlbW92ZSBhbGwgdmVydGljZXMgYW5kIGVkZ2VzIGZyb20gYSBncmFwaDogKi8KK0NWX0lNUEwgdm9pZAorY3ZDbGVhckdyYXBoKCBDdkdyYXBoICogZ3JhcGggKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDbGVhckdyYXBoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFncmFwaCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgY3ZDbGVhclNldCggZ3JhcGgtPmVkZ2VzICk7CisgICAgY3ZDbGVhclNldCggKEN2U2V0KilncmFwaCApOworCisgICAgX19FTkRfXzsKK30KKworCisvKiBBZGQgYSB2ZXJ0ZXggdG8gYSBncmFwaDogKi8KK0NWX0lNUEwgaW50CitjdkdyYXBoQWRkVnR4KCBDdkdyYXBoKiBncmFwaCwgY29uc3QgQ3ZHcmFwaFZ0eCogX3ZlcnRleCwgQ3ZHcmFwaFZ0eCoqIF9pbnNlcnRlZF92ZXJ0ZXggKQoreworICAgIEN2R3JhcGhWdHggKnZlcnRleCA9IDA7CisgICAgaW50IGluZGV4ID0gLTE7CisKKyAgICBDVl9GVU5DTkFNRSggImN2R3JhcGhBZGRWdHgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWdyYXBoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICB2ZXJ0ZXggPSAoQ3ZHcmFwaFZ0eCopY3ZTZXROZXcoKEN2U2V0KilncmFwaCk7CisgICAgaWYoIHZlcnRleCApCisgICAgeworICAgICAgICBpZiggX3ZlcnRleCApCisgICAgICAgICAgICBDVl9NRU1DUFlfSU5UKCB2ZXJ0ZXggKyAxLCBfdmVydGV4ICsgMSwKKyAgICAgICAgICAgICAgICAoc2l6ZV90KShncmFwaC0+ZWxlbV9zaXplIC0gc2l6ZW9mKEN2R3JhcGhWdHgpKS9zaXplb2YoaW50KSApOworICAgICAgICB2ZXJ0ZXgtPmZpcnN0ID0gMDsKKyAgICAgICAgaW5kZXggPSB2ZXJ0ZXgtPmZsYWdzOworICAgIH0KKworICAgIGlmKCBfaW5zZXJ0ZWRfdmVydGV4ICkKKyAgICAgICAgKl9pbnNlcnRlZF92ZXJ0ZXggPSB2ZXJ0ZXg7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGluZGV4OworfQorCisKKy8qIFJlbW92ZSBhIHZlcnRleCBmcm9tIHRoZSBncmFwaCB0b2dldGhlciB3aXRoIGl0cyBpbmNpZGVudCBlZGdlczogKi8KK0NWX0lNUEwgaW50CitjdkdyYXBoUmVtb3ZlVnR4QnlQdHIoIEN2R3JhcGgqIGdyYXBoLCBDdkdyYXBoVnR4KiB2dHggKQoreworICAgIGludCBjb3VudCA9IC0xOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdyYXBoUmVtb3ZlVnR4QnlQdHIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWdyYXBoIHx8ICF2dHggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCAhQ1ZfSVNfU0VUX0VMRU0odnR4KSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSB2ZXJ0ZXggZG9lcyBub3QgYmVsb25nIHRvIHRoZSBncmFwaCIgKTsKKworICAgIGNvdW50ID0gZ3JhcGgtPmVkZ2VzLT5hY3RpdmVfY291bnQ7CisgICAgZm9yKCA7OyApCisgICAgeworICAgICAgICBDdkdyYXBoRWRnZSAqZWRnZSA9IHZ0eC0+Zmlyc3Q7CisgICAgICAgIGlmKCAhZWRnZSApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY3ZHcmFwaFJlbW92ZUVkZ2VCeVB0ciggZ3JhcGgsIGVkZ2UtPnZ0eFswXSwgZWRnZS0+dnR4WzFdICk7CisgICAgfQorICAgIGNvdW50IC09IGdyYXBoLT5lZGdlcy0+YWN0aXZlX2NvdW50OworICAgIGN2U2V0UmVtb3ZlQnlQdHIoIChDdlNldCopZ3JhcGgsIHZ0eCApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjb3VudDsKK30KKworCisvKiBSZW1vdmUgYSB2ZXJ0ZXggZnJvbSB0aGUgZ3JhcGggdG9nZXRoZXIgd2l0aCBpdHMgaW5jaWRlbnQgZWRnZXM6ICovCitDVl9JTVBMIGludAorY3ZHcmFwaFJlbW92ZVZ0eCggQ3ZHcmFwaCogZ3JhcGgsIGludCBpbmRleCApCit7CisgICAgaW50IGNvdW50ID0gLTE7CisgICAgQ3ZHcmFwaFZ0eCAqdnR4ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHcmFwaFJlbW92ZVZ0eCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZ3JhcGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHZ0eCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBpbmRleCApOworICAgIGlmKCAhdnR4ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSB2ZXJ0ZXggaXMgbm90IGZvdW5kIiApOworCisgICAgY291bnQgPSBncmFwaC0+ZWRnZXMtPmFjdGl2ZV9jb3VudDsKKyAgICBmb3IoIDs7ICkKKyAgICB7CisgICAgICAgIEN2R3JhcGhFZGdlICplZGdlID0gdnR4LT5maXJzdDsKKyAgICAgICAgY291bnQrKzsKKworICAgICAgICBpZiggIWVkZ2UgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGN2R3JhcGhSZW1vdmVFZGdlQnlQdHIoIGdyYXBoLCBlZGdlLT52dHhbMF0sIGVkZ2UtPnZ0eFsxXSApOworICAgIH0KKyAgICBjb3VudCAtPSBncmFwaC0+ZWRnZXMtPmFjdGl2ZV9jb3VudDsKKyAgICBjdlNldFJlbW92ZUJ5UHRyKCAoQ3ZTZXQqKWdyYXBoLCB2dHggKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKworLyogRmluZCBhIGdyYXBoIGVkZ2UgZ2l2ZW4gcG9pbnRlcnMgdG8gdGhlIGVuZGluZyB2ZXJ0aWNlczogKi8KK0NWX0lNUEwgQ3ZHcmFwaEVkZ2UqCitjdkZpbmRHcmFwaEVkZ2VCeVB0ciggY29uc3QgQ3ZHcmFwaCogZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZHcmFwaFZ0eCogc3RhcnRfdnR4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2R3JhcGhWdHgqIGVuZF92dHggKQoreworICAgIEN2R3JhcGhFZGdlICplZGdlID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2RmluZEdyYXBoRWRnZUJ5UHRyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG9mcyA9IDA7CisKKyAgICBpZiggIWdyYXBoIHx8ICFzdGFydF92dHggfHwgIWVuZF92dHggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBzdGFydF92dHggPT0gZW5kX3Z0eCApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggIUNWX0lTX0dSQVBIX09SSUVOVEVEKCBncmFwaCApICYmCisgICAgICAgIChzdGFydF92dHgtPmZsYWdzICYgQ1ZfU0VUX0VMRU1fSURYX01BU0spID4gKGVuZF92dHgtPmZsYWdzICYgQ1ZfU0VUX0VMRU1fSURYX01BU0spICkKKyAgICB7CisgICAgICAgIGNvbnN0IEN2R3JhcGhWdHgqIHQ7CisgICAgICAgIENWX1NXQVAoIHN0YXJ0X3Z0eCwgZW5kX3Z0eCwgdCApOworICAgIH0KKworICAgIGVkZ2UgPSBzdGFydF92dHgtPmZpcnN0OworICAgIGZvciggOyBlZGdlOyBlZGdlID0gZWRnZS0+bmV4dFtvZnNdICkKKyAgICB7CisgICAgICAgIG9mcyA9IHN0YXJ0X3Z0eCA9PSBlZGdlLT52dHhbMV07CisgICAgICAgIGFzc2VydCggb2ZzID09IDEgfHwgc3RhcnRfdnR4ID09IGVkZ2UtPnZ0eFswXSApOworICAgICAgICBpZiggZWRnZS0+dnR4WzFdID09IGVuZF92dHggKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBlZGdlOworfQorCisKKy8qIEZpbmQgYW4gZWRnZSBpbiB0aGUgZ3JhcGggZ2l2ZW4gaW5kaWNlcyBvZiB0aGUgZW5kaW5nIHZlcnRpY2VzOiAqLworQ1ZfSU1QTCBDdkdyYXBoRWRnZSAqCitjdkZpbmRHcmFwaEVkZ2UoIGNvbnN0IEN2R3JhcGgqIGdyYXBoLCBpbnQgc3RhcnRfaWR4LCBpbnQgZW5kX2lkeCApCit7CisgICAgQ3ZHcmFwaEVkZ2UgKmVkZ2UgPSAwOworICAgIEN2R3JhcGhWdHggKnN0YXJ0X3Z0eDsKKyAgICBDdkdyYXBoVnR4ICplbmRfdnR4OworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkZpbmRHcmFwaEVkZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWdyYXBoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJncmFwaCBwb2ludGVyIGlzIE5VTEwiICk7CisKKyAgICBzdGFydF92dHggPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgc3RhcnRfaWR4ICk7CisgICAgZW5kX3Z0eCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBlbmRfaWR4ICk7CisKKyAgICBlZGdlID0gY3ZGaW5kR3JhcGhFZGdlQnlQdHIoIGdyYXBoLCBzdGFydF92dHgsIGVuZF92dHggKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZWRnZTsKK30KKworCisvKiBHaXZlbiB0d28gdmVydGljZXMsIHJldHVybiB0aGUgZWRnZQorICogY29ubmVjdGluZyB0aGVtLCBjcmVhdGluZyBpdCBpZiBpdAorICogZGlkIG5vdCBhbHJlYWR5IGV4aXN0OgorICovCitDVl9JTVBMIGludAorY3ZHcmFwaEFkZEVkZ2VCeVB0ciggQ3ZHcmFwaCogZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoVnR4KiBzdGFydF92dHgsIEN2R3JhcGhWdHgqIGVuZF92dHgsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkdyYXBoRWRnZSogX2VkZ2UsCisgICAgICAgICAgICAgICAgICAgICBDdkdyYXBoRWRnZSAqKiBfaW5zZXJ0ZWRfZWRnZSApCit7CisgICAgQ3ZHcmFwaEVkZ2UgKmVkZ2UgPSAwOworICAgIGludCByZXN1bHQgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHcmFwaEFkZEVkZ2VCeVB0ciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBkZWx0YTsKKworICAgIGlmKCAhZ3JhcGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgImdyYXBoIHBvaW50ZXIgaXMgTlVMTCIgKTsKKworICAgIGlmKCAhQ1ZfSVNfR1JBUEhfT1JJRU5URUQoIGdyYXBoICkgJiYKKyAgICAgICAgKHN0YXJ0X3Z0eC0+ZmxhZ3MgJiBDVl9TRVRfRUxFTV9JRFhfTUFTSykgPiAoZW5kX3Z0eC0+ZmxhZ3MgJiBDVl9TRVRfRUxFTV9JRFhfTUFTSykgKQorICAgIHsKKyAgICAgICAgQ3ZHcmFwaFZ0eCogdDsKKyAgICAgICAgQ1ZfU1dBUCggc3RhcnRfdnR4LCBlbmRfdnR4LCB0ICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggZWRnZSA9IGN2RmluZEdyYXBoRWRnZUJ5UHRyKCBncmFwaCwgc3RhcnRfdnR4LCBlbmRfdnR4ICkpOworICAgIGlmKCBlZGdlICkKKyAgICB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIHN0YXJ0X3Z0eCA9PSBlbmRfdnR4ICkKKyAgICAgICAgQ1ZfRVJST1IoIHN0YXJ0X3Z0eCA/IENWX1N0c0JhZEFyZyA6IENWX1N0c051bGxQdHIsCisgICAgICAgICJ2ZXJ0ZXggcG9pbnRlcnMgY29pbnNpZGUgKG9yIHNldCB0byBOVUxMKSIgKTsKKworICAgIENWX0NBTEwoIGVkZ2UgPSAoQ3ZHcmFwaEVkZ2UqKWN2U2V0TmV3KCAoQ3ZTZXQqKShncmFwaC0+ZWRnZXMpICkpOworICAgIGFzc2VydCggZWRnZS0+ZmxhZ3MgPj0gMCApOworCisgICAgZWRnZS0+dnR4WzBdID0gc3RhcnRfdnR4OworICAgIGVkZ2UtPnZ0eFsxXSA9IGVuZF92dHg7CisgICAgZWRnZS0+bmV4dFswXSA9IHN0YXJ0X3Z0eC0+Zmlyc3Q7CisgICAgZWRnZS0+bmV4dFsxXSA9IGVuZF92dHgtPmZpcnN0OworICAgIHN0YXJ0X3Z0eC0+Zmlyc3QgPSBlbmRfdnR4LT5maXJzdCA9IGVkZ2U7CisKKyAgICBkZWx0YSA9IChncmFwaC0+ZWRnZXMtPmVsZW1fc2l6ZSAtIHNpemVvZigqZWRnZSkpL3NpemVvZihpbnQpOworICAgIGlmKCBfZWRnZSApCisgICAgeworICAgICAgICBpZiggZGVsdGEgPiAwICkKKyAgICAgICAgICAgIENWX01FTUNQWV9JTlQoIGVkZ2UgKyAxLCBfZWRnZSArIDEsIGRlbHRhICk7CisgICAgICAgIGVkZ2UtPndlaWdodCA9IF9lZGdlLT53ZWlnaHQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBkZWx0YSA+IDAgKQorICAgICAgICAgICAgQ1ZfWkVST19JTlQoIGVkZ2UgKyAxLCBkZWx0YSApOworICAgICAgICBlZGdlLT53ZWlnaHQgPSAxLmY7CisgICAgfQorCisgICAgcmVzdWx0ID0gMTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggX2luc2VydGVkX2VkZ2UgKQorICAgICAgICAqX2luc2VydGVkX2VkZ2UgPSBlZGdlOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogR2l2ZW4gdHdvIHZlcnRpY2VzLCByZXR1cm4gdGhlIGVkZ2UKKyAqIGNvbm5lY3RpbmcgdGhlbSwgY3JlYXRpbmcgaXQgaWYgaXQKKyAqIGRpZCBub3QgYWxyZWFkeSBleGlzdDoKKyAqLworQ1ZfSU1QTCBpbnQKK2N2R3JhcGhBZGRFZGdlKCBDdkdyYXBoKiBncmFwaCwKKyAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaWR4LCBpbnQgZW5kX2lkeCwKKyAgICAgICAgICAgICAgICBjb25zdCBDdkdyYXBoRWRnZSogX2VkZ2UsCisgICAgICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UgKiogX2luc2VydGVkX2VkZ2UgKQoreworICAgIEN2R3JhcGhWdHggKnN0YXJ0X3Z0eDsKKyAgICBDdkdyYXBoVnR4ICplbmRfdnR4OworICAgIGludCByZXN1bHQgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHcmFwaEFkZEVkZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWdyYXBoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBzdGFydF92dHggPSBjdkdldEdyYXBoVnR4KCBncmFwaCwgc3RhcnRfaWR4ICk7CisgICAgZW5kX3Z0eCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBlbmRfaWR4ICk7CisKKyAgICByZXN1bHQgPSBjdkdyYXBoQWRkRWRnZUJ5UHRyKCBncmFwaCwgc3RhcnRfdnR4LCBlbmRfdnR4LCBfZWRnZSwgX2luc2VydGVkX2VkZ2UgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIFJlbW92ZSB0aGUgZ3JhcGggZWRnZSBjb25uZWN0aW5nIHR3byBnaXZlbiB2ZXJ0aWNlczogKi8KK0NWX0lNUEwgdm9pZAorY3ZHcmFwaFJlbW92ZUVkZ2VCeVB0ciggQ3ZHcmFwaCogZ3JhcGgsIEN2R3JhcGhWdHgqIHN0YXJ0X3Z0eCwgQ3ZHcmFwaFZ0eCogZW5kX3Z0eCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkdyYXBoUmVtb3ZlRWRnZUJ5UHRyIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG9mcywgcHJldl9vZnM7CisgICAgQ3ZHcmFwaEVkZ2UgKmVkZ2UsICpuZXh0X2VkZ2UsICpwcmV2X2VkZ2U7CisKKyAgICBpZiggIWdyYXBoIHx8ICFzdGFydF92dHggfHwgIWVuZF92dHggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBzdGFydF92dHggPT0gZW5kX3Z0eCApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggIUNWX0lTX0dSQVBIX09SSUVOVEVEKCBncmFwaCApICYmCisgICAgICAgIChzdGFydF92dHgtPmZsYWdzICYgQ1ZfU0VUX0VMRU1fSURYX01BU0spID4gKGVuZF92dHgtPmZsYWdzICYgQ1ZfU0VUX0VMRU1fSURYX01BU0spICkKKyAgICB7CisgICAgICAgIEN2R3JhcGhWdHgqIHQ7CisgICAgICAgIENWX1NXQVAoIHN0YXJ0X3Z0eCwgZW5kX3Z0eCwgdCApOworICAgIH0KKworICAgIGZvciggb2ZzID0gcHJldl9vZnMgPSAwLCBwcmV2X2VkZ2UgPSAwLCBlZGdlID0gc3RhcnRfdnR4LT5maXJzdDsgZWRnZSAhPSAwOworICAgICAgICAgcHJldl9vZnMgPSBvZnMsIHByZXZfZWRnZSA9IGVkZ2UsIGVkZ2UgPSBlZGdlLT5uZXh0W29mc10gKQorICAgIHsKKyAgICAgICAgb2ZzID0gc3RhcnRfdnR4ID09IGVkZ2UtPnZ0eFsxXTsKKyAgICAgICAgYXNzZXJ0KCBvZnMgPT0gMSB8fCBzdGFydF92dHggPT0gZWRnZS0+dnR4WzBdICk7CisgICAgICAgIGlmKCBlZGdlLT52dHhbMV0gPT0gZW5kX3Z0eCApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiggIWVkZ2UgKQorICAgICAgICBFWElUOworCisgICAgbmV4dF9lZGdlID0gZWRnZS0+bmV4dFtvZnNdOworICAgIGlmKCBwcmV2X2VkZ2UgKQorICAgICAgICBwcmV2X2VkZ2UtPm5leHRbcHJldl9vZnNdID0gbmV4dF9lZGdlOworICAgIGVsc2UKKyAgICAgICAgc3RhcnRfdnR4LT5maXJzdCA9IG5leHRfZWRnZTsKKworICAgIGZvciggb2ZzID0gcHJldl9vZnMgPSAwLCBwcmV2X2VkZ2UgPSAwLCBlZGdlID0gZW5kX3Z0eC0+Zmlyc3Q7IGVkZ2UgIT0gMDsKKyAgICAgICAgIHByZXZfb2ZzID0gb2ZzLCBwcmV2X2VkZ2UgPSBlZGdlLCBlZGdlID0gZWRnZS0+bmV4dFtvZnNdICkKKyAgICB7CisgICAgICAgIG9mcyA9IGVuZF92dHggPT0gZWRnZS0+dnR4WzFdOworICAgICAgICBhc3NlcnQoIG9mcyA9PSAxIHx8IGVuZF92dHggPT0gZWRnZS0+dnR4WzBdICk7CisgICAgICAgIGlmKCBlZGdlLT52dHhbMF0gPT0gc3RhcnRfdnR4ICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGFzc2VydCggZWRnZSAhPSAwICk7CisKKyAgICBuZXh0X2VkZ2UgPSBlZGdlLT5uZXh0W29mc107CisgICAgaWYoIHByZXZfZWRnZSApCisgICAgICAgIHByZXZfZWRnZS0+bmV4dFtwcmV2X29mc10gPSBuZXh0X2VkZ2U7CisgICAgZWxzZQorICAgICAgICBlbmRfdnR4LT5maXJzdCA9IG5leHRfZWRnZTsKKworICAgIGN2U2V0UmVtb3ZlQnlQdHIoIGdyYXBoLT5lZGdlcywgZWRnZSApOworCisgICAgX19FTkRfXzsKK30KKworCisvKiBSZW1vdmUgdGhlIGdyYXBoIGVkZ2UgY29ubmVjdGluZyB0d28gZ2l2ZW4gdmVydGljZXM6ICovCitDVl9JTVBMIHZvaWQKK2N2R3JhcGhSZW1vdmVFZGdlKCBDdkdyYXBoKiBncmFwaCwgaW50IHN0YXJ0X2lkeCwgaW50IGVuZF9pZHggKQoreworICAgIEN2R3JhcGhWdHggKnN0YXJ0X3Z0eDsKKyAgICBDdkdyYXBoVnR4ICplbmRfdnR4OworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdyYXBoUmVtb3ZlRWRnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZ3JhcGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHN0YXJ0X3Z0eCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCBzdGFydF9pZHggKTsKKyAgICBlbmRfdnR4ID0gY3ZHZXRHcmFwaFZ0eCggZ3JhcGgsIGVuZF9pZHggKTsKKworICAgIGN2R3JhcGhSZW1vdmVFZGdlQnlQdHIoIGdyYXBoLCBzdGFydF92dHgsIGVuZF92dHggKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyogQ291bnQgbnVtYmVyIG9mIGVkZ2VzIGluY2lkZW50IHRvIGEgZ2l2ZW4gdmVydGV4OiAqLworQ1ZfSU1QTCBpbnQKK2N2R3JhcGhWdHhEZWdyZWVCeVB0ciggY29uc3QgQ3ZHcmFwaCogZ3JhcGgsIGNvbnN0IEN2R3JhcGhWdHgqIHZlcnRleCApCit7CisgICAgQ3ZHcmFwaEVkZ2UgKmVkZ2U7CisgICAgaW50IGNvdW50ID0gLTE7CisKKyAgICBDVl9GVU5DTkFNRSggImN2R3JhcGhWdHhEZWdyZWVCeVB0ciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZ3JhcGggfHwgIXZlcnRleCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgZm9yKCBlZGdlID0gdmVydGV4LT5maXJzdCwgY291bnQgPSAwOyBlZGdlOyApCisgICAgeworICAgICAgICBjb3VudCsrOworICAgICAgICBlZGdlID0gQ1ZfTkVYVF9HUkFQSF9FREdFKCBlZGdlLCB2ZXJ0ZXggKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGNvdW50OworfQorCisKKy8qIENvdW50IG51bWJlciBvZiBlZGdlcyBpbmNpZGVudCB0byBhIGdpdmVuIHZlcnRleDogKi8KK0NWX0lNUEwgaW50CitjdkdyYXBoVnR4RGVncmVlKCBjb25zdCBDdkdyYXBoKiBncmFwaCwgaW50IHZ0eF9pZHggKQoreworICAgIEN2R3JhcGhWdHggKnZlcnRleDsKKyAgICBDdkdyYXBoRWRnZSAqZWRnZTsKKyAgICBpbnQgY291bnQgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHcmFwaFZ0eERlZ3JlZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZ3JhcGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIHZlcnRleCA9IGN2R2V0R3JhcGhWdHgoIGdyYXBoLCB2dHhfaWR4ICk7CisgICAgaWYoICF2ZXJ0ZXggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT2JqZWN0Tm90Rm91bmQsICIiICk7CisKKyAgICBmb3IoIGVkZ2UgPSB2ZXJ0ZXgtPmZpcnN0LCBjb3VudCA9IDA7IGVkZ2U7ICkKKyAgICB7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGVkZ2UgPSBDVl9ORVhUX0dSQVBIX0VER0UoIGVkZ2UsIHZlcnRleCApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZHcmFwaEl0ZW0KK3sKKyAgICBDdkdyYXBoVnR4KiB2dHg7CisgICAgQ3ZHcmFwaEVkZ2UqIGVkZ2U7Cit9CitDdkdyYXBoSXRlbTsKKworCitzdGF0aWMgIHZvaWQKK2ljdlNlcUVsZW1zQ2xlYXJGbGFncyggQ3ZTZXEqIHNlcSwgaW50IG9mZnNldCwgaW50IGNsZWFyX21hc2sgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZTdGFydFNjYW5HcmFwaCIpOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIGludCBpLCB0b3RhbCwgZWxlbV9zaXplOworCisgICAgaWYoICFzZXEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGVsZW1fc2l6ZSA9IHNlcS0+ZWxlbV9zaXplOworICAgIHRvdGFsID0gc2VxLT50b3RhbDsKKworICAgIGlmKCAodW5zaWduZWQpb2Zmc2V0ID4gKHVuc2lnbmVkKWVsZW1fc2l6ZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50KiBmbGFnX3B0ciA9IChpbnQqKShyZWFkZXIucHRyICsgb2Zmc2V0KTsKKyAgICAgICAgKmZsYWdfcHRyICY9IH5jbGVhcl9tYXNrOworCisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgIHNjaGFyKgoraWN2U2VxRmluZE5leHRFbGVtKCBDdlNlcSogc2VxLCBpbnQgb2Zmc2V0LCBpbnQgbWFzaywKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLCBpbnQqIHN0YXJ0X2luZGV4ICkKK3sKKyAgICBzY2hhciogZWxlbV9wdHIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImljdlN0YXJ0U2NhbkdyYXBoIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgaW50IHRvdGFsLCBlbGVtX3NpemUsIGluZGV4OworCisgICAgaWYoICFzZXEgfHwgIXN0YXJ0X2luZGV4ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBlbGVtX3NpemUgPSBzZXEtPmVsZW1fc2l6ZTsKKyAgICB0b3RhbCA9IHNlcS0+dG90YWw7CisgICAgaW5kZXggPSAqc3RhcnRfaW5kZXg7CisKKyAgICBpZiggKHVuc2lnbmVkKW9mZnNldCA+ICh1bnNpZ25lZCllbGVtX3NpemUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiIiApOworCisgICAgaWYoIHRvdGFsID09IDAgKQorICAgICAgICBFWElUOworCisgICAgaWYoICh1bnNpZ25lZClpbmRleCA+PSAodW5zaWduZWQpdG90YWwgKQorICAgIHsKKyAgICAgICAgaW5kZXggJT0gdG90YWw7CisgICAgICAgIGluZGV4ICs9IGluZGV4IDwgMCA/IHRvdGFsIDogMDsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyICkpOworCisgICAgaWYoIGluZGV4ICE9IDAgKQorICAgICAgICBDVl9DQUxMKCBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgaW5kZXggKSk7CisKKyAgICBmb3IoIGluZGV4ID0gMDsgaW5kZXggPCB0b3RhbDsgaW5kZXgrKyApCisgICAgeworICAgICAgICBpbnQqIGZsYWdfcHRyID0gKGludCopKHJlYWRlci5wdHIgKyBvZmZzZXQpOworICAgICAgICBpZiggKCpmbGFnX3B0ciAmIG1hc2spID09IHZhbHVlICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgaWYoIGluZGV4IDwgdG90YWwgKQorICAgIHsKKyAgICAgICAgZWxlbV9wdHIgPSByZWFkZXIucHRyOworICAgICAgICAqc3RhcnRfaW5kZXggPSBpbmRleDsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuICBlbGVtX3B0cjsKK30KKworI2RlZmluZSBDVl9GSUVMRF9PRkZTRVQoIGZpZWxkLCBzdHJ1Y3R0eXBlICkgKChpbnQpKHNpemVfdCkmKChzdHJ1Y3R0eXBlKikwKS0+ZmllbGQpCisKK0NWX0lNUEwgQ3ZHcmFwaFNjYW5uZXIqCitjdkNyZWF0ZUdyYXBoU2Nhbm5lciggQ3ZHcmFwaCogZ3JhcGgsIEN2R3JhcGhWdHgqIHZ0eCwgaW50IG1hc2sgKQoreworICAgIEN2R3JhcGhTY2FubmVyKiBzY2FubmVyID0gMDsKKyAgICBDdk1lbVN0b3JhZ2UqIGNoaWxkX3N0b3JhZ2UgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2Q3JlYXRlR3JhcGhTY2FubmVyIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIWdyYXBoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGdyYXBoIHBvaW50ZXIiICk7CisKKyAgICBDVl9BU1NFUlQoIGdyYXBoLT5zdG9yYWdlICE9IDAgKTsKKworICAgIENWX0NBTEwoIHNjYW5uZXIgPSAoQ3ZHcmFwaFNjYW5uZXIqKWN2QWxsb2MoIHNpemVvZigqc2Nhbm5lcikgKSk7CisgICAgbWVtc2V0KCBzY2FubmVyLCAwLCBzaXplb2YoKnNjYW5uZXIpKTsKKworICAgIHNjYW5uZXItPmdyYXBoID0gZ3JhcGg7CisgICAgc2Nhbm5lci0+bWFzayA9IG1hc2s7CisgICAgc2Nhbm5lci0+dnR4ID0gdnR4OworICAgIHNjYW5uZXItPmluZGV4ID0gdnR4ID09IDAgPyAwIDogLTE7CisKKyAgICBDVl9DQUxMKCBjaGlsZF9zdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoIGdyYXBoLT5zdG9yYWdlICkpOworCisgICAgQ1ZfQ0FMTCggc2Nhbm5lci0+c3RhY2sgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2R3JhcGhJdGVtKSwgY2hpbGRfc3RvcmFnZSApKTsKKworICAgIENWX0NBTEwoIGljdlNlcUVsZW1zQ2xlYXJGbGFncyggKEN2U2VxKilncmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0ZJRUxEX09GRlNFVCggZmxhZ3MsIEN2R3JhcGhWdHgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfR1JBUEhfSVRFTV9WSVNJVEVEX0ZMQUd8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HUkFQSF9TRUFSQ0hfVFJFRV9OT0RFX0ZMQUcgKSk7CisKKyAgICBDVl9DQUxMKCBpY3ZTZXFFbGVtc0NsZWFyRmxhZ3MoIChDdlNlcSopKGdyYXBoLT5lZGdlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9GSUVMRF9PRkZTRVQoIGZsYWdzLCBDdkdyYXBoRWRnZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HUkFQSF9JVEVNX1ZJU0lURURfRkxBRyApKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJmNoaWxkX3N0b3JhZ2UgKTsKKyAgICAgICAgY3ZGcmVlKCAmc2Nhbm5lciApOworICAgIH0KKworICAgIHJldHVybiBzY2FubmVyOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWxlYXNlR3JhcGhTY2FubmVyKCBDdkdyYXBoU2Nhbm5lcioqIHNjYW5uZXIgKQoreworICAgIENWX0ZVTkNOQU1FKCJjdlJlbGVhc2VHcmFwaFNjYW5uZXIiKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhc2Nhbm5lciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBkb3VibGUgcG9pbnRlciB0byBncmFwaCBzY2FubmVyIiApOworCisgICAgaWYoICpzY2FubmVyICkKKyAgICB7CisgICAgICAgIGlmKCAoKnNjYW5uZXIpLT5zdGFjayApCisgICAgICAgICAgICBDVl9DQUxMKCBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmKCgqc2Nhbm5lciktPnN0YWNrLT5zdG9yYWdlKSkpOworICAgICAgICBjdkZyZWUoIHNjYW5uZXIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgaW50Citjdk5leHRHcmFwaEl0ZW0oIEN2R3JhcGhTY2FubmVyKiBzY2FubmVyICkKK3sKKyAgICBpbnQgY29kZSA9IC0xOworCisgICAgQ1ZfRlVOQ05BTUUoImN2TmV4dEdyYXBoSXRlbSIpOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZHcmFwaFZ0eCogdnR4OworICAgIEN2R3JhcGhWdHgqIGRzdDsKKyAgICBDdkdyYXBoRWRnZSogZWRnZTsKKyAgICBDdkdyYXBoSXRlbSBpdGVtOworCisgICAgaWYoICFzY2FubmVyIHx8ICEoc2Nhbm5lci0+c3RhY2spKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgZ3JhcGggc2Nhbm5lciIgKTsKKworICAgIGRzdCA9IHNjYW5uZXItPmRzdDsKKyAgICB2dHggPSBzY2FubmVyLT52dHg7CisgICAgZWRnZSA9IHNjYW5uZXItPmVkZ2U7CisKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkc3QgJiYgIUNWX0lTX0dSQVBIX1ZFUlRFWF9WSVNJVEVEKGRzdCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNjYW5uZXItPnZ0eCA9IHZ0eCA9IGRzdDsKKyAgICAgICAgICAgICAgICBlZGdlID0gdnR4LT5maXJzdDsKKyAgICAgICAgICAgICAgICBkc3QtPmZsYWdzIHw9IENWX0dSQVBIX0lURU1fVklTSVRFRF9GTEFHOworCisgICAgICAgICAgICAgICAgaWYoKHNjYW5uZXItPm1hc2sgJiBDVl9HUkFQSF9WRVJURVgpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci0+dnR4ID0gdnR4OworICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5lZGdlID0gdnR4LT5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci0+ZHN0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IENWX0dSQVBIX1ZFUlRFWDsKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlKCBlZGdlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkc3QgPSBlZGdlLT52dHhbdnR4ID09IGVkZ2UtPnZ0eFswXV07CisKKyAgICAgICAgICAgICAgICBpZiggIUNWX0lTX0dSQVBIX0VER0VfVklTSVRFRChlZGdlKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBlZGdlIGlzIG91dGdvaW5nOgorICAgICAgICAgICAgICAgICAgICBpZiggIUNWX0lTX0dSQVBIX09SSUVOVEVEKCBzY2FubmVyLT5ncmFwaCApIHx8IGRzdCAhPSBlZGdlLT52dHhbMF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncyB8PSBDVl9HUkFQSF9JVEVNX1ZJU0lURURfRkxBRzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICFDVl9JU19HUkFQSF9WRVJURVhfVklTSVRFRChkc3QpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnZ0eCA9IHZ0eDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmVkZ2UgPSBlZGdlOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR4LT5mbGFncyB8PSBDVl9HUkFQSF9TRUFSQ0hfVFJFRV9OT0RFX0ZMQUc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNlcVB1c2goIHNjYW5uZXItPnN0YWNrLCAmaXRlbSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHNjYW5uZXItPm1hc2sgJiBDVl9HUkFQSF9UUkVFX0VER0UgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSA9IENWX0dSQVBIX1RSRUVfRURHRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci0+dnR4ID0gdnR4OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5kc3QgPSBkc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmVkZ2UgPSBlZGdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggc2Nhbm5lci0+bWFzayAmIChDVl9HUkFQSF9CQUNLX0VER0V8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfR1JBUEhfQ1JPU1NfRURHRXwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HUkFQSF9GT1JXQVJEX0VER0UpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSAoZHN0LT5mbGFncyAmIENWX0dSQVBIX1NFQVJDSF9UUkVFX05PREVfRkxBRykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfR1JBUEhfQkFDS19FREdFIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZGdlLT5mbGFncyAmIENWX0dSQVBIX0ZPUldBUkRfRURHRV9GTEFHKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HUkFQSF9GT1JXQVJEX0VER0UgOiBDVl9HUkFQSF9DUk9TU19FREdFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncyAmPSB+Q1ZfR1JBUEhfRk9SV0FSRF9FREdFX0ZMQUc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzY2FubmVyLT5tYXNrICYgY29kZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPnZ0eCA9IHZ0eDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmRzdCA9IGRzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmVkZ2UgPSBlZGdlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCAoZHN0LT5mbGFncyAmIChDVl9HUkFQSF9JVEVNX1ZJU0lURURfRkxBR3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfR1JBUEhfU0VBUkNIX1RSRUVfTk9ERV9GTEFHKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENWX0dSQVBIX0lURU1fVklTSVRFRF9GTEFHfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9HUkFQSF9TRUFSQ0hfVFJFRV9OT0RFX0ZMQUcpKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBlZGdlLT5mbGFncyB8PSBDVl9HUkFQSF9GT1JXQVJEX0VER0VfRkxBRzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGVkZ2UgPSBDVl9ORVhUX0dSQVBIX0VER0UoIGVkZ2UsIHZ0eCApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIWVkZ2UgKSAvKiBuZWVkIHRvIGJhY2t0cmFjayAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBzY2FubmVyLT5zdGFjay0+dG90YWwgPT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc2Nhbm5lci0+aW5kZXggPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICB2dHggPSAwOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVyLT5pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdlNlcVBvcCggc2Nhbm5lci0+c3RhY2ssICZpdGVtICk7CisgICAgICAgICAgICAgICAgdnR4ID0gaXRlbS52dHg7CisgICAgICAgICAgICAgICAgdnR4LT5mbGFncyAmPSB+Q1ZfR1JBUEhfU0VBUkNIX1RSRUVfTk9ERV9GTEFHOworICAgICAgICAgICAgICAgIGVkZ2UgPSBpdGVtLmVkZ2U7CisgICAgICAgICAgICAgICAgZHN0ID0gMDsKKworICAgICAgICAgICAgICAgIGlmKCBzY2FubmVyLT5tYXNrICYgQ1ZfR1JBUEhfQkFDS1RSQUNLSU5HICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPnZ0eCA9IHZ0eDsKKyAgICAgICAgICAgICAgICAgICAgc2Nhbm5lci0+ZWRnZSA9IGVkZ2U7CisgICAgICAgICAgICAgICAgICAgIHNjYW5uZXItPmRzdCA9IGVkZ2UtPnZ0eFt2dHggPT0gZWRnZS0+dnR4WzBdXTsKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IENWX0dSQVBIX0JBQ0tUUkFDS0lORzsKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggIXZ0eCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZ0eCA9IChDdkdyYXBoVnR4KilpY3ZTZXFGaW5kTmV4dEVsZW0oIChDdlNlcSopKHNjYW5uZXItPmdyYXBoKSwKKyAgICAgICAgICAgICAgICAgIENWX0ZJRUxEX09GRlNFVCggZmxhZ3MsIEN2R3JhcGhWdHggKSwgQ1ZfR1JBUEhfSVRFTV9WSVNJVEVEX0ZMQUd8SU5UX01JTiwKKyAgICAgICAgICAgICAgICAgIDAsICYoc2Nhbm5lci0+aW5kZXgpICk7CisKKyAgICAgICAgICAgIGlmKCAhdnR4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb2RlID0gQ1ZfR1JBUEhfT1ZFUjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRzdCA9IHZ0eDsKKyAgICAgICAgaWYoIHNjYW5uZXItPm1hc2sgJiBDVl9HUkFQSF9ORVdfVFJFRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjYW5uZXItPmRzdCA9IGRzdDsKKyAgICAgICAgICAgIHNjYW5uZXItPmVkZ2UgPSAwOworICAgICAgICAgICAgc2Nhbm5lci0+dnR4ID0gMDsKKyAgICAgICAgICAgIGNvZGUgPSBDVl9HUkFQSF9ORVdfVFJFRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBjb2RlOworfQorCisKK0NWX0lNUEwgQ3ZHcmFwaCoKK2N2Q2xvbmVHcmFwaCggY29uc3QgQ3ZHcmFwaCogZ3JhcGgsIEN2TWVtU3RvcmFnZSogc3RvcmFnZSApCit7CisgICAgaW50KiBmbGFnX2J1ZmZlciA9IDA7CisgICAgQ3ZHcmFwaFZ0eCoqIHB0cl9idWZmZXIgPSAwOworICAgIEN2R3JhcGgqIHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2xvbmVHcmFwaCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBrOworICAgIGludCB2dHhfc2l6ZSwgZWRnZV9zaXplOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgIGlmKCAhQ1ZfSVNfR1JBUEgoZ3JhcGgpKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBncmFwaCBwb2ludGVyIiApOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgc3RvcmFnZSA9IGdyYXBoLT5zdG9yYWdlOworCisgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHN0b3JhZ2UgcG9pbnRlciIgKTsKKworICAgIHZ0eF9zaXplID0gZ3JhcGgtPmVsZW1fc2l6ZTsKKyAgICBlZGdlX3NpemUgPSBncmFwaC0+ZWRnZXMtPmVsZW1fc2l6ZTsKKworICAgIENWX0NBTEwoIGZsYWdfYnVmZmVyID0gKGludCopY3ZBbGxvYyggZ3JhcGgtPnRvdGFsKnNpemVvZihmbGFnX2J1ZmZlclswXSkpKTsKKyAgICBDVl9DQUxMKCBwdHJfYnVmZmVyID0gKEN2R3JhcGhWdHgqKiljdkFsbG9jKCBncmFwaC0+dG90YWwqc2l6ZW9mKHB0cl9idWZmZXJbMF0pKSk7CisgICAgQ1ZfQ0FMTCggcmVzdWx0ID0gY3ZDcmVhdGVHcmFwaCggZ3JhcGgtPmZsYWdzLCBncmFwaC0+aGVhZGVyX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnR4X3NpemUsIGVkZ2Vfc2l6ZSwgc3RvcmFnZSApKTsKKyAgICBtZW1jcHkoIHJlc3VsdCArIHNpemVvZihDdkdyYXBoKSwgZ3JhcGggKyBzaXplb2YoQ3ZHcmFwaCksCisgICAgICAgICAgICBncmFwaC0+aGVhZGVyX3NpemUgLSBzaXplb2YoQ3ZHcmFwaCkpOworCisgICAgLy8gUGFzcyAxLiAgU2F2ZSBmbGFncywgY29weSB2ZXJ0aWNlczoKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxKilncmFwaCwgJnJlYWRlciApOworICAgIGZvciggaSA9IDAsIGsgPSAwOyBpIDwgZ3JhcGgtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX1NFVF9FTEVNKCByZWFkZXIucHRyICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2R3JhcGhWdHgqIHZ0eCA9IChDdkdyYXBoVnR4KilyZWFkZXIucHRyOworICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogZHN0dnR4ID0gMDsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2R3JhcGhBZGRWdHgoIHJlc3VsdCwgdnR4LCAmZHN0dnR4ICkpOworICAgICAgICAgICAgZmxhZ19idWZmZXJba10gPSBkc3R2dHgtPmZsYWdzID0gdnR4LT5mbGFnczsKKyAgICAgICAgICAgIHZ0eC0+ZmxhZ3MgPSBrOworICAgICAgICAgICAgcHRyX2J1ZmZlcltrKytdID0gZHN0dnR4OworICAgICAgICB9CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHZ0eF9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICAvLyBQYXNzIDIuICBDb3B5IGVkZ2VzOgorICAgIGN2U3RhcnRSZWFkU2VxKCAoQ3ZTZXEqKWdyYXBoLT5lZGdlcywgJnJlYWRlciApOworICAgIGZvciggaSA9IDA7IGkgPCBncmFwaC0+ZWRnZXMtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX1NFVF9FTEVNKCByZWFkZXIucHRyICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBlZGdlID0gKEN2R3JhcGhFZGdlKilyZWFkZXIucHRyOworICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIGRzdGVkZ2UgPSAwOworICAgICAgICAgICAgQ3ZHcmFwaFZ0eCogbmV3X29yZyA9IHB0cl9idWZmZXJbZWRnZS0+dnR4WzBdLT5mbGFnc107CisgICAgICAgICAgICBDdkdyYXBoVnR4KiBuZXdfZHN0ID0gcHRyX2J1ZmZlcltlZGdlLT52dHhbMV0tPmZsYWdzXTsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2R3JhcGhBZGRFZGdlQnlQdHIoIHJlc3VsdCwgbmV3X29yZywgbmV3X2RzdCwgZWRnZSwgJmRzdGVkZ2UgKSk7CisgICAgICAgICAgICBkc3RlZGdlLT5mbGFncyA9IGVkZ2UtPmZsYWdzOworICAgICAgICB9CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVkZ2Vfc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgLy8gUGFzcyAzLiAgUmVzdG9yZSBmbGFnczoKKyAgICBjdlN0YXJ0UmVhZFNlcSggKEN2U2VxKilncmFwaCwgJnJlYWRlciApOworICAgIGZvciggaSA9IDAsIGsgPSAwOyBpIDwgZ3JhcGgtPmVkZ2VzLT50b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19TRVRfRUxFTSggcmVhZGVyLnB0ciApKQorICAgICAgICB7CisgICAgICAgICAgICBDdkdyYXBoVnR4KiB2dHggPSAoQ3ZHcmFwaFZ0eCopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgIHZ0eC0+ZmxhZ3MgPSBmbGFnX2J1ZmZlcltrKytdOworICAgICAgICB9CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHZ0eF9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZGcmVlKCAmZmxhZ19idWZmZXIgKTsKKyAgICBjdkZyZWUoICZwdHJfYnVmZmVyICk7CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgKQorICAgICAgICByZXN1bHQgPSAwOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JraW5nIHdpdGggc2VxdWVuY2UgdHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIEdhdGhlciBwb2ludGVycyB0byBhbGwgdGhlIHNlcXVlbmNlcywgYWNjZXNzaWJsZSBmcm9tIHRoZSA8Zmlyc3Q+LCB0byB0aGUgc2luZ2xlIHNlcXVlbmNlLgorQ1ZfSU1QTCBDdlNlcSoKK2N2VHJlZVRvTm9kZVNlcSggY29uc3Qgdm9pZCogZmlyc3QsIGludCBoZWFkZXJfc2l6ZSwgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlICkKK3sKKyAgICBDdlNlcSogYWxsc2VxID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdlRyZWVUb05vZGVTZXEiKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2VHJlZU5vZGVJdGVyYXRvciBpdGVyYXRvcjsKKworICAgIGlmKCAhc3RvcmFnZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBzdG9yYWdlIHBvaW50ZXIiICk7CisKKyAgICBDVl9DQUxMKCBhbGxzZXEgPSBjdkNyZWF0ZVNlcSggMCwgaGVhZGVyX3NpemUsIHNpemVvZihmaXJzdCksIHN0b3JhZ2UgKSk7CisKKyAgICBpZiggZmlyc3QgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0VHJlZU5vZGVJdGVyYXRvciggJml0ZXJhdG9yLCBmaXJzdCwgSU5UX01BWCApKTsKKworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQqIG5vZGUgPSBjdk5leHRUcmVlTm9kZSggJml0ZXJhdG9yICk7CisgICAgICAgICAgICBpZiggIW5vZGUgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY3ZTZXFQdXNoKCBhbGxzZXEsICZub2RlICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGFsbHNlcTsKK30KKworCit0eXBlZGVmIHN0cnVjdCBDdlRyZWVOb2RlCit7CisgICAgaW50ICAgICAgIGZsYWdzOyAgICAgICAgIC8qIG1pY3NlbGxhbmVvdXMgZmxhZ3MgKi8KKyAgICBpbnQgICAgICAgaGVhZGVyX3NpemU7ICAgLyogc2l6ZSBvZiBzZXF1ZW5jZSBoZWFkZXIgKi8KKyAgICBzdHJ1Y3QgICAgQ3ZUcmVlTm9kZSogaF9wcmV2OyAvKiBwcmV2aW91cyBzZXF1ZW5jZSAqLworICAgIHN0cnVjdCAgICBDdlRyZWVOb2RlKiBoX25leHQ7IC8qIG5leHQgc2VxdWVuY2UgKi8KKyAgICBzdHJ1Y3QgICAgQ3ZUcmVlTm9kZSogdl9wcmV2OyAvKiAybmQgcHJldmlvdXMgc2VxdWVuY2UgKi8KKyAgICBzdHJ1Y3QgICAgQ3ZUcmVlTm9kZSogdl9uZXh0OyAvKiAybmQgbmV4dCBzZXF1ZW5jZSAqLworfQorQ3ZUcmVlTm9kZTsKKworCisKKy8vIEluc2VydCBjb250b3VyIGludG8gdHJlZSBnaXZlbiBjZXJ0YWluIHBhcmVudCBzZXF1ZW5jZS4KKy8vIElmIHBhcmVudCBpcyBlcXVhbCB0byBmcmFtZSAodGhlIG1vc3QgZXh0ZXJuYWwgY29udG91ciksCisvLyB0aGVuIGFkZGVkIGNvbnRvdXIgd2lsbCBoYXZlIG51bGwgcG9pbnRlciB0byBwYXJlbnQ6CitDVl9JTVBMIHZvaWQKK2N2SW5zZXJ0Tm9kZUludG9UcmVlKCB2b2lkKiBfbm9kZSwgdm9pZCogX3BhcmVudCwgdm9pZCogX2ZyYW1lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2SW5zZXJ0Tm9kZUludG9UcmVlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZUcmVlTm9kZSogbm9kZSA9IChDdlRyZWVOb2RlKilfbm9kZTsKKyAgICBDdlRyZWVOb2RlKiBwYXJlbnQgPSAoQ3ZUcmVlTm9kZSopX3BhcmVudDsKKworICAgIGlmKCAhbm9kZSB8fCAhcGFyZW50ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBub2RlLT52X3ByZXYgPSBfcGFyZW50ICE9IF9mcmFtZSA/IHBhcmVudCA6IDA7CisgICAgbm9kZS0+aF9uZXh0ID0gcGFyZW50LT52X25leHQ7CisKKyAgICBhc3NlcnQoIHBhcmVudC0+dl9uZXh0ICE9IG5vZGUgKTsKKworICAgIGlmKCBwYXJlbnQtPnZfbmV4dCApCisgICAgICAgIHBhcmVudC0+dl9uZXh0LT5oX3ByZXYgPSBub2RlOworICAgIHBhcmVudC0+dl9uZXh0ID0gbm9kZTsKKworICAgIF9fRU5EX187Cit9CisKKworLy8gUmVtb3ZlIGNvbnRvdXIgZnJvbSB0cmVlLCB0b2dldGhlciB3aXRoIHRoZSBjb250b3VyJ3MgY2hpbGRyZW46CitDVl9JTVBMIHZvaWQKK2N2UmVtb3ZlTm9kZUZyb21UcmVlKCB2b2lkKiBfbm9kZSwgdm9pZCogX2ZyYW1lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVtb3ZlTm9kZUZyb21UcmVlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZUcmVlTm9kZSogbm9kZSA9IChDdlRyZWVOb2RlKilfbm9kZTsKKyAgICBDdlRyZWVOb2RlKiBmcmFtZSA9IChDdlRyZWVOb2RlKilfZnJhbWU7CisKKyAgICBpZiggIW5vZGUgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c051bGxQdHIgKTsKKworICAgIGlmKCBub2RlID09IGZyYW1lICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImZyYW1lIG5vZGUgY291bGQgbm90IGJlIGRlbGV0ZWQiICk7CisKKyAgICBpZiggbm9kZS0+aF9uZXh0ICkKKyAgICAgICAgbm9kZS0+aF9uZXh0LT5oX3ByZXYgPSBub2RlLT5oX3ByZXY7CisKKyAgICBpZiggbm9kZS0+aF9wcmV2ICkKKyAgICAgICAgbm9kZS0+aF9wcmV2LT5oX25leHQgPSBub2RlLT5oX25leHQ7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZUcmVlTm9kZSogcGFyZW50ID0gbm9kZS0+dl9wcmV2OworICAgICAgICBpZiggIXBhcmVudCApCisgICAgICAgICAgICBwYXJlbnQgPSBmcmFtZTsKKworICAgICAgICBpZiggcGFyZW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBwYXJlbnQtPnZfbmV4dCA9PSBub2RlICk7CisgICAgICAgICAgICBwYXJlbnQtPnZfbmV4dCA9IG5vZGUtPmhfbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkluaXRUcmVlTm9kZUl0ZXJhdG9yKCBDdlRyZWVOb2RlSXRlcmF0b3IqIHRyZWVJdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGZpcnN0LCBpbnQgbWF4X2xldmVsICkKK3sKKyAgICBDVl9GVU5DTkFNRSgiaWN2SW5pdFRyZWVOb2RlSXRlcmF0b3IiKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhdHJlZUl0ZXJhdG9yIHx8ICFmaXJzdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIG1heF9sZXZlbCA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKworICAgIHRyZWVJdGVyYXRvci0+bm9kZSA9ICh2b2lkKilmaXJzdDsKKyAgICB0cmVlSXRlcmF0b3ItPmxldmVsID0gMDsKKyAgICB0cmVlSXRlcmF0b3ItPm1heF9sZXZlbCA9IG1heF9sZXZlbDsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkKgorY3ZOZXh0VHJlZU5vZGUoIEN2VHJlZU5vZGVJdGVyYXRvciogdHJlZUl0ZXJhdG9yICkKK3sKKyAgICBDdlRyZWVOb2RlKiBwcmV2Tm9kZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZOZXh0VHJlZU5vZGUiKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2VHJlZU5vZGUqIG5vZGU7CisgICAgaW50IGxldmVsOworCisgICAgaWYoICF0cmVlSXRlcmF0b3IgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgaXRlcmF0b3IgcG9pbnRlciIgKTsKKworICAgIHByZXZOb2RlID0gbm9kZSA9IChDdlRyZWVOb2RlKil0cmVlSXRlcmF0b3ItPm5vZGU7CisgICAgbGV2ZWwgPSB0cmVlSXRlcmF0b3ItPmxldmVsOworCisgICAgaWYoIG5vZGUgKQorICAgIHsKKyAgICAgICAgaWYoIG5vZGUtPnZfbmV4dCAmJiBsZXZlbCsxIDwgdHJlZUl0ZXJhdG9yLT5tYXhfbGV2ZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+dl9uZXh0OworICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCBub2RlLT5oX25leHQgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnZfcHJldjsKKyAgICAgICAgICAgICAgICBpZiggLS1sZXZlbCA8IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5vZGUgPSBub2RlICYmIHRyZWVJdGVyYXRvci0+bWF4X2xldmVsICE9IDAgPyBub2RlLT5oX25leHQgOiAwOworICAgICAgICB9CisgICAgfQorCisgICAgdHJlZUl0ZXJhdG9yLT5ub2RlID0gbm9kZTsKKyAgICB0cmVlSXRlcmF0b3ItPmxldmVsID0gbGV2ZWw7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHByZXZOb2RlOworfQorCisKK0NWX0lNUEwgdm9pZCoKK2N2UHJldlRyZWVOb2RlKCBDdlRyZWVOb2RlSXRlcmF0b3IqIHRyZWVJdGVyYXRvciApCit7CisgICAgQ3ZUcmVlTm9kZSogcHJldk5vZGUgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2UHJldlRyZWVOb2RlIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlRyZWVOb2RlKiBub2RlOworICAgIGludCBsZXZlbDsKKworICAgIGlmKCAhdHJlZUl0ZXJhdG9yICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBwcmV2Tm9kZSA9IG5vZGUgPSAoQ3ZUcmVlTm9kZSopdHJlZUl0ZXJhdG9yLT5ub2RlOworICAgIGxldmVsID0gdHJlZUl0ZXJhdG9yLT5sZXZlbDsKKworICAgIGlmKCBub2RlICkKKyAgICB7CisgICAgICAgIGlmKCAhbm9kZS0+aF9wcmV2ICkKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnZfcHJldjsKKyAgICAgICAgICAgIGlmKCAtLWxldmVsIDwgMCApCisgICAgICAgICAgICAgICAgbm9kZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBub2RlID0gbm9kZS0+aF9wcmV2OworCisgICAgICAgICAgICB3aGlsZSggbm9kZS0+dl9uZXh0ICYmIGxldmVsIDwgdHJlZUl0ZXJhdG9yLT5tYXhfbGV2ZWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLT52X25leHQ7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKworICAgICAgICAgICAgICAgIHdoaWxlKCBub2RlLT5oX25leHQgKQorICAgICAgICAgICAgICAgICAgICBub2RlID0gbm9kZS0+aF9uZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdHJlZUl0ZXJhdG9yLT5ub2RlID0gbm9kZTsKKyAgICB0cmVlSXRlcmF0b3ItPmxldmVsID0gbGV2ZWw7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHByZXZOb2RlOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hkcmF3aW5nLmNwcCBiL2N4Y29yZS9zcmMvY3hkcmF3aW5nLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2JlMjJlCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeGRyYXdpbmcuY3BwCkBAIC0wLDAgKzEsMjU5NyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisjZGVmaW5lICBYWV9TSElGVCAgMTYKKyNkZWZpbmUgIFhZX09ORSAgICAoMSA8PCBYWV9TSElGVCkKKworI2RlZmluZSBDVl9EUkFXSU5HX1NUT1JBR0VfQkxPQ0sgKCgxIDw8IDEyKSAtIDI1NikKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZQb2x5RWRnZQoreworICAgIGludCB4LCBkeDsKKyAgICB1bmlvbgorICAgIHsKKyAgICAgICAgc3RydWN0IEN2UG9seUVkZ2UgKm5leHQ7CisgICAgICAgIGludCB5MDsKKyAgICB9OworICAgIGludCB5MTsKK30KK0N2UG9seUVkZ2U7CisKK3N0YXRpYyB2b2lkCitpY3ZDb2xsZWN0UG9seUVkZ2VzKCBDdk1hdCogaW1nLCBDdlNlcSogdiwgQ3ZDb250b3VyKiBlZGdlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbG9yLCBpbnQgbGluZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0LCBDdlBvaW50IG9mZnNldD1jdlBvaW50KDAsMCkgKTsKKworc3RhdGljIHZvaWQKK2ljdkZpbGxFZGdlQ29sbGVjdGlvbiggQ3ZNYXQqIGltZywgQ3ZDb250b3VyKiBlZGdlcywgY29uc3Qgdm9pZCogY29sb3IgKTsKKworc3RhdGljIHZvaWQKK2ljdlBvbHlMaW5lKCBDdk1hdCogaW1nLCBDdlBvaW50ICp2LCBpbnQgY291bnQsIGludCBjbG9zZWQsCisgICAgICAgICAgICAgY29uc3Qgdm9pZCogY29sb3IsIGludCB0aGlja25lc3MsIGludCBsaW5lX3R5cGUsIGludCBzaGlmdCApOworCitzdGF0aWMgdm9pZAoraWN2RmlsbENvbnZleFBvbHkoIEN2TWF0KiBpbWcsIEN2UG9pbnQqIHYsIGludCBucHRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGNvbG9yLCBpbnQgbGluZV90eXBlLCBpbnQgc2hpZnQgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIGludAorY3ZDbGlwTGluZSggQ3ZTaXplIGltZ19zaXplLCBDdlBvaW50KiBwdDEsIEN2UG9pbnQqIHB0MiApCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2xpcExpbmUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgeDEsIHkxLCB4MiwgeTI7CisgICAgaW50IGMxLCBjMjsKKyAgICBpbnQgcmlnaHQgPSBpbWdfc2l6ZS53aWR0aC0xLCBib3R0b20gPSBpbWdfc2l6ZS5oZWlnaHQtMTsKKworICAgIGlmKCAhcHQxIHx8ICFwdDIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk9uZSBvZiBwb2ludCBwb2ludGVycyBpcyBOVUxMIiApOworCisgICAgaWYoIHJpZ2h0IDwgMCB8fCBib3R0b20gPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJJbWFnZSB3aWR0aCBvciBoZWlnaHQgYXJlIG5lZ2F0aXZlIiApOworCisgICAgeDEgPSBwdDEtPng7IHkxID0gcHQxLT55OyB4MiA9IHB0Mi0+eDsgeTIgPSBwdDItPnk7CisgICAgYzEgPSAoeDEgPCAwKSArICh4MSA+IHJpZ2h0KSAqIDIgKyAoeTEgPCAwKSAqIDQgKyAoeTEgPiBib3R0b20pICogODsKKyAgICBjMiA9ICh4MiA8IDApICsgKHgyID4gcmlnaHQpICogMiArICh5MiA8IDApICogNCArICh5MiA+IGJvdHRvbSkgKiA4OworCisgICAgaWYoIChjMSAmIGMyKSA9PSAwICYmIChjMSB8IGMyKSAhPSAwICkKKyAgICB7CisgICAgICAgIGludCBhOworCisgICAgICAgIGlmKCBjMSAmIDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IGMxIDwgOCA/IDAgOiBib3R0b207CisgICAgICAgICAgICB4MSArPSAoaW50KSAoKChpbnQ2NCkgKGEgLSB5MSkpICogKHgyIC0geDEpIC8gKHkyIC0geTEpKTsKKyAgICAgICAgICAgIHkxID0gYTsKKyAgICAgICAgICAgIGMxID0gKHgxIDwgMCkgKyAoeDEgPiByaWdodCkgKiAyOworICAgICAgICB9CisgICAgICAgIGlmKCBjMiAmIDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgYSA9IGMyIDwgOCA/IDAgOiBib3R0b207CisgICAgICAgICAgICB4MiArPSAoaW50KSAoKChpbnQ2NCkgKGEgLSB5MikpICogKHgyIC0geDEpIC8gKHkyIC0geTEpKTsKKyAgICAgICAgICAgIHkyID0gYTsKKyAgICAgICAgICAgIGMyID0gKHgyIDwgMCkgKyAoeDIgPiByaWdodCkgKiAyOworICAgICAgICB9CisgICAgICAgIGlmKCAoYzEgJiBjMikgPT0gMCAmJiAoYzEgfCBjMikgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYSA9IGMxID09IDEgPyAwIDogcmlnaHQ7CisgICAgICAgICAgICAgICAgeTEgKz0gKGludCkgKCgoaW50NjQpIChhIC0geDEpKSAqICh5MiAtIHkxKSAvICh4MiAtIHgxKSk7CisgICAgICAgICAgICAgICAgeDEgPSBhOworICAgICAgICAgICAgICAgIGMxID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBjMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYSA9IGMyID09IDEgPyAwIDogcmlnaHQ7CisgICAgICAgICAgICAgICAgeTIgKz0gKGludCkgKCgoaW50NjQpIChhIC0geDIpKSAqICh5MiAtIHkxKSAvICh4MiAtIHgxKSk7CisgICAgICAgICAgICAgICAgeDIgPSBhOworICAgICAgICAgICAgICAgIGMyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydCggKGMxICYgYzIpICE9IDAgfHwgKHgxIHwgeTEgfCB4MiB8IHkyKSA+PSAwICk7CisKKyAgICAgICAgcHQxLT54ID0geDE7CisgICAgICAgIHB0MS0+eSA9IHkxOworICAgICAgICBwdDItPnggPSB4MjsKKyAgICAgICAgcHQyLT55ID0geTI7CisgICAgfQorCisgICAgcmVzdWx0ID0gKCBjMSB8IGMyICkgPT0gMDsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIAorICAgSW5pdGlhbGl6ZXMgbGluZSBpdGVyYXRvci4KKyAgIFJldHVybnMgbnVtYmVyIG9mIHBvaW50cyBvbiB0aGUgbGluZSBvciBuZWdhdGl2ZSBudW1iZXIgaWYgZXJyb3IuCisqLworQ1ZfSU1QTCBpbnQKK2N2SW5pdExpbmVJdGVyYXRvciggY29uc3QgQ3ZBcnIqIGltZywgQ3ZQb2ludCBwdDEsIEN2UG9pbnQgcHQyLAorICAgICAgICAgICAgICAgICAgICBDdkxpbmVJdGVyYXRvciogaXRlcmF0b3IsIGludCBjb25uZWN0aXZpdHksCisgICAgICAgICAgICAgICAgICAgIGludCBsZWZ0X3RvX3JpZ2h0ICkKK3sKKyAgICBpbnQgY291bnQgPSAtMTsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2SW5pdExpbmVJdGVyYXRvciIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgaW50IGR4LCBkeSwgczsKKyAgICBpbnQgYnRfcGl4LCBidF9waXgwLCBzdGVwOworCisgICAgaWYoICFDVl9JU19NQVQobWF0KSApCisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworCisgICAgaWYoICFpdGVyYXRvciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiUG9pbnRlciB0byB0aGUgaXRlcmF0b3Igc3RhdGUgaXMgTlVMTCIgKTsKKworICAgIGlmKCBjb25uZWN0aXZpdHkgIT0gOCAmJiBjb25uZWN0aXZpdHkgIT0gNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJDb25uZWN0aXZpdHkgbXVzdCBiZSA4IG9yIDQiICk7CisKKyAgICBpZiggKHVuc2lnbmVkKXB0MS54ID49ICh1bnNpZ25lZCkobWF0LT53aWR0aCkgfHwKKyAgICAgICAgKHVuc2lnbmVkKXB0Mi54ID49ICh1bnNpZ25lZCkobWF0LT53aWR0aCkgfHwKKyAgICAgICAgKHVuc2lnbmVkKXB0MS55ID49ICh1bnNpZ25lZCkobWF0LT5oZWlnaHQpIHx8CisgICAgICAgICh1bnNpZ25lZClwdDIueSA+PSAodW5zaWduZWQpKG1hdC0+aGVpZ2h0KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRQb2ludCwKKyAgICAgICAgICAgICJPbmUgb2YgdGhlIGVuZGluZyBwb2ludHMgaXMgb3V0c2lkZSBvZiB0aGUgaW1hZ2UsIHVzZSBjdkNsaXBMaW5lIiApOworCisgICAgYnRfcGl4MCA9IGJ0X3BpeCA9IENWX0VMRU1fU0laRShtYXQtPnR5cGUpOworICAgIHN0ZXAgPSBtYXQtPnN0ZXA7CisKKyAgICBkeCA9IHB0Mi54IC0gcHQxLng7CisgICAgZHkgPSBwdDIueSAtIHB0MS55OworICAgIHMgPSBkeCA8IDAgPyAtMSA6IDA7CisKKyAgICBpZiggbGVmdF90b19yaWdodCApCisgICAgeworICAgICAgICBkeCA9IChkeCBeIHMpIC0gczsKKyAgICAgICAgZHkgPSAoZHkgXiBzKSAtIHM7CisgICAgICAgIHB0MS54IF49IChwdDEueCBeIHB0Mi54KSAmIHM7CisgICAgICAgIHB0MS55IF49IChwdDEueSBeIHB0Mi55KSAmIHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGR4ID0gKGR4IF4gcykgLSBzOworICAgICAgICBidF9waXggPSAoYnRfcGl4IF4gcykgLSBzOworICAgIH0KKworICAgIGl0ZXJhdG9yLT5wdHIgPSAodWNoYXIqKShtYXQtPmRhdGEucHRyICsgcHQxLnkgKiBzdGVwICsgcHQxLnggKiBidF9waXgwKTsKKworICAgIHMgPSBkeSA8IDAgPyAtMSA6IDA7CisgICAgZHkgPSAoZHkgXiBzKSAtIHM7CisgICAgc3RlcCA9IChzdGVwIF4gcykgLSBzOworCisgICAgcyA9IGR5ID4gZHggPyAtMSA6IDA7CisgICAgCisgICAgLyogY29uZGl0aW9uYWwgc3dhcHMgKi8KKyAgICBkeCBePSBkeSAmIHM7CisgICAgZHkgXj0gZHggJiBzOworICAgIGR4IF49IGR5ICYgczsKKworICAgIGJ0X3BpeCBePSBzdGVwICYgczsKKyAgICBzdGVwIF49IGJ0X3BpeCAmIHM7CisgICAgYnRfcGl4IF49IHN0ZXAgJiBzOworCisgICAgaWYoIGNvbm5lY3Rpdml0eSA9PSA4ICkKKyAgICB7CisgICAgICAgIGFzc2VydCggZHggPj0gMCAmJiBkeSA+PSAwICk7CisgICAgICAgIAorICAgICAgICBpdGVyYXRvci0+ZXJyID0gZHggLSAoZHkgKyBkeSk7CisgICAgICAgIGl0ZXJhdG9yLT5wbHVzX2RlbHRhID0gZHggKyBkeDsKKyAgICAgICAgaXRlcmF0b3ItPm1pbnVzX2RlbHRhID0gLShkeSArIGR5KTsKKyAgICAgICAgaXRlcmF0b3ItPnBsdXNfc3RlcCA9IHN0ZXA7CisgICAgICAgIGl0ZXJhdG9yLT5taW51c19zdGVwID0gYnRfcGl4OworICAgICAgICBjb3VudCA9IGR4ICsgMTsKKyAgICB9CisgICAgZWxzZSAvKiBjb25uZWN0aXZpdHkgPT0gNCAqLworICAgIHsKKyAgICAgICAgYXNzZXJ0KCBkeCA+PSAwICYmIGR5ID49IDAgKTsKKyAgICAgICAgCisgICAgICAgIGl0ZXJhdG9yLT5lcnIgPSAwOworICAgICAgICBpdGVyYXRvci0+cGx1c19kZWx0YSA9IChkeCArIGR4KSArIChkeSArIGR5KTsKKyAgICAgICAgaXRlcmF0b3ItPm1pbnVzX2RlbHRhID0gLShkeSArIGR5KTsKKyAgICAgICAgaXRlcmF0b3ItPnBsdXNfc3RlcCA9IHN0ZXAgLSBidF9waXg7CisgICAgICAgIGl0ZXJhdG9yLT5taW51c19zdGVwID0gYnRfcGl4OworICAgICAgICBjb3VudCA9IGR4ICsgZHkgKyAxOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyB2b2lkCitpY3ZMaW5lKCBDdk1hdCogbWF0LCBDdlBvaW50IHB0MSwgQ3ZQb2ludCBwdDIsCisgICAgICAgICBjb25zdCB2b2lkKiBjb2xvciwgaW50IGNvbm5lY3Rpdml0eSA9IDggKQoreworICAgIGlmKCBjdkNsaXBMaW5lKCBjdkdldE1hdFNpemUobWF0KSwgJnB0MSwgJnB0MiApKQorICAgIHsKKyAgICAgICAgQ3ZMaW5lSXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRShtYXQtPnR5cGUpOworICAgICAgICBpbnQgaSwgY291bnQ7CisgICAgICAgIAorICAgICAgICBpZiggY29ubmVjdGl2aXR5ID09IDAgKQorICAgICAgICAgICAgY29ubmVjdGl2aXR5ID0gODsKKyAgICAgICAgaWYoIGNvbm5lY3Rpdml0eSA9PSAxICkKKyAgICAgICAgICAgIGNvbm5lY3Rpdml0eSA9IDQ7CisgICAgICAgIAorICAgICAgICBjb3VudCA9IGN2SW5pdExpbmVJdGVyYXRvciggbWF0LCBwdDEsIHB0MiwgJml0ZXJhdG9yLCBjb25uZWN0aXZpdHksIDEgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX01FTUNQWV9BVVRPKCBpdGVyYXRvci5wdHIsIGNvbG9yLCBwaXhfc2l6ZSApOworICAgICAgICAgICAgQ1ZfTkVYVF9MSU5FX1BPSU5UKCBpdGVyYXRvciApOworICAgICAgICB9CisgICAgfQorfQorCisKKy8qIENvcnJlY3Rpb24gdGFibGUgZGVwZW50IG9uIHRoZSBzbG9wZSAqLworc3RhdGljIGNvbnN0IHVjaGFyIGljdlNsb3BlQ29yclRhYmxlW10gPSB7CisgICAgMTgxLCAxODEsIDE4MSwgMTgyLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NywgMTg4LCAxOTAsIDE5MiwgMTk0LCAxOTYsIDE5OCwgMjAxLAorICAgIDIwMywgMjA2LCAyMDksIDIxMSwgMjE0LCAyMTgsIDIyMSwgMjI0LCAyMjcsIDIzMSwgMjM1LCAyMzgsIDI0MiwgMjQ2LCAyNTAsIDI1NAorfTsKKworLyogR2F1c3NpYW4gZm9yIGFudGlhbGlhc2luZyBmaWx0ZXIgKi8KK3N0YXRpYyBjb25zdCBpbnQgaWN2RmlsdGVyVGFibGVbXSA9IHsKKyAgICAxNjgsIDE3NywgMTg1LCAxOTQsIDIwMiwgMjEwLCAyMTgsIDIyNCwgMjMxLCAyMzYsIDI0MSwgMjQ2LCAyNDksIDI1MiwgMjU0LCAyNTQsCisgICAgMjU0LCAyNTQsIDI1MiwgMjQ5LCAyNDYsIDI0MSwgMjM2LCAyMzEsIDIyNCwgMjE4LCAyMTAsIDIwMiwgMTk0LCAxODUsIDE3NywgMTY4LAorICAgIDE1OCwgMTQ5LCAxNDAsIDEzMSwgMTIyLCAxMTQsIDEwNSwgOTcsIDg5LCA4MiwgNzUsIDY4LCA2MiwgNTYsIDUwLCA0NSwKKyAgICA0MCwgMzYsIDMyLCAyOCwgMjUsIDIyLCAxOSwgMTYsIDE0LCAxMiwgMTEsIDksIDgsIDcsIDUsIDUKK307CisKK3N0YXRpYyB2b2lkCitpY3ZMaW5lQUEoIEN2TWF0KiBpbWcsIEN2UG9pbnQgcHQxLCBDdlBvaW50IHB0MiwKKyAgICAgICAgICAgY29uc3Qgdm9pZCogY29sb3IgKQoreworICAgIGludCBkeCwgZHk7CisgICAgaW50IGVjb3VudCwgc2NvdW50ID0gMDsKKyAgICBpbnQgc2xvcGU7CisgICAgaW50IGF4LCBheTsKKyAgICBpbnQgeF9zdGVwLCB5X3N0ZXA7CisgICAgaW50IGksIGo7CisgICAgaW50IGVwX3RhYmxlWzldOworICAgIGludCBjYiA9ICgodWNoYXIqKWNvbG9yKVswXSwgY2cgPSAoKHVjaGFyKiljb2xvcilbMV0sIGNyID0gKCh1Y2hhciopY29sb3IpWzJdOworICAgIGludCBfY2IsIF9jZywgX2NyOworICAgIGludCBuY2ggPSBDVl9NQVRfQ04oIGltZy0+dHlwZSApOworICAgIHVjaGFyKiBwdHIgPSAodWNoYXIqKShpbWctPmRhdGEucHRyKTsKKyAgICBpbnQgc3RlcCA9IGltZy0+c3RlcDsKKyAgICBDdlNpemUgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggaW1nICk7CisKKyAgICBhc3NlcnQoIGltZyAmJiAobmNoID09IDEgfHwgbmNoID09IDMpICYmIENWX01BVF9ERVBUSChpbWctPnR5cGUpID09IENWXzhVICk7CisKKyAgICBwdDEueCAtPSBYWV9PTkUqMjsKKyAgICBwdDEueSAtPSBYWV9PTkUqMjsKKyAgICBwdDIueCAtPSBYWV9PTkUqMjsKKyAgICBwdDIueSAtPSBYWV9PTkUqMjsKKyAgICBwdHIgKz0gaW1nLT5zdGVwKjIgKyAyKm5jaDsKKworICAgIHNpemUud2lkdGggPSAoKHNpemUud2lkdGggLSA1KSA8PCBYWV9TSElGVCkgKyAxOworICAgIHNpemUuaGVpZ2h0ID0gKChzaXplLmhlaWdodCAtIDUpIDw8IFhZX1NISUZUKSArIDE7CisKKyAgICBpZiggIWN2Q2xpcExpbmUoIHNpemUsICZwdDEsICZwdDIgKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHggPSBwdDIueCAtIHB0MS54OworICAgIGR5ID0gcHQyLnkgLSBwdDEueTsKKworICAgIGogPSBkeCA8IDAgPyAtMSA6IDA7CisgICAgYXggPSAoZHggXiBqKSAtIGo7CisgICAgaSA9IGR5IDwgMCA/IC0xIDogMDsKKyAgICBheSA9IChkeSBeIGkpIC0gaTsKKworICAgIGlmKCBheCA+IGF5ICkKKyAgICB7CisgICAgICAgIGR4ID0gYXg7CisgICAgICAgIGR5ID0gKGR5IF4gaikgLSBqOworICAgICAgICBwdDEueCBePSBwdDIueCAmIGo7CisgICAgICAgIHB0Mi54IF49IHB0MS54ICYgajsKKyAgICAgICAgcHQxLnggXj0gcHQyLnggJiBqOworICAgICAgICBwdDEueSBePSBwdDIueSAmIGo7CisgICAgICAgIHB0Mi55IF49IHB0MS55ICYgajsKKyAgICAgICAgcHQxLnkgXj0gcHQyLnkgJiBqOworCisgICAgICAgIHhfc3RlcCA9IFhZX09ORTsKKyAgICAgICAgeV9zdGVwID0gKGludCkgKCgoaW50NjQpIGR5IDw8IFhZX1NISUZUKSAvIChheCB8IDEpKTsKKyAgICAgICAgcHQyLnggKz0gWFlfT05FOworICAgICAgICBlY291bnQgPSAocHQyLnggPj4gWFlfU0hJRlQpIC0gKHB0MS54ID4+IFhZX1NISUZUKTsKKyAgICAgICAgaiA9IC0ocHQxLnggJiAoWFlfT05FIC0gMSkpOworICAgICAgICBwdDEueSArPSAoaW50KSAoKCgoaW50NjQpIHlfc3RlcCkgKiBqKSA+PiBYWV9TSElGVCkgKyAoWFlfT05FID4+IDEpOworICAgICAgICBzbG9wZSA9ICh5X3N0ZXAgPj4gKFhZX1NISUZUIC0gNSkpICYgMHgzZjsKKyAgICAgICAgc2xvcGUgXj0gKHlfc3RlcCA8IDAgPyAweDNmIDogMCk7CisKKyAgICAgICAgLyogR2V0IDQtYml0IGZyYWN0aW9ucyBmb3IgZW5kLXBvaW50IGFkanVzdG1lbnRzICovCisgICAgICAgIGkgPSAocHQxLnggPj4gKFhZX1NISUZUIC0gNykpICYgMHg3ODsKKyAgICAgICAgaiA9IChwdDIueCA+PiAoWFlfU0hJRlQgLSA3KSkgJiAweDc4OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkeSA9IGF5OworICAgICAgICBkeCA9IChkeCBeIGkpIC0gaTsKKyAgICAgICAgcHQxLnggXj0gcHQyLnggJiBpOworICAgICAgICBwdDIueCBePSBwdDEueCAmIGk7CisgICAgICAgIHB0MS54IF49IHB0Mi54ICYgaTsKKyAgICAgICAgcHQxLnkgXj0gcHQyLnkgJiBpOworICAgICAgICBwdDIueSBePSBwdDEueSAmIGk7CisgICAgICAgIHB0MS55IF49IHB0Mi55ICYgaTsKKworICAgICAgICB4X3N0ZXAgPSAoaW50KSAoKChpbnQ2NCkgZHggPDwgWFlfU0hJRlQpIC8gKGF5IHwgMSkpOworICAgICAgICB5X3N0ZXAgPSBYWV9PTkU7CisgICAgICAgIHB0Mi55ICs9IFhZX09ORTsKKyAgICAgICAgZWNvdW50ID0gKHB0Mi55ID4+IFhZX1NISUZUKSAtIChwdDEueSA+PiBYWV9TSElGVCk7CisgICAgICAgIGogPSAtKHB0MS55ICYgKFhZX09ORSAtIDEpKTsKKyAgICAgICAgcHQxLnggKz0gKGludCkgKCgoKGludDY0KSB4X3N0ZXApICogaikgPj4gWFlfU0hJRlQpICsgKFhZX09ORSA+PiAxKTsKKyAgICAgICAgc2xvcGUgPSAoeF9zdGVwID4+IChYWV9TSElGVCAtIDUpKSAmIDB4M2Y7CisgICAgICAgIHNsb3BlIF49ICh4X3N0ZXAgPCAwID8gMHgzZiA6IDApOworCisgICAgICAgIC8qIEdldCA0LWJpdCBmcmFjdGlvbnMgZm9yIGVuZC1wb2ludCBhZGp1c3RtZW50cyAqLworICAgICAgICBpID0gKHB0MS55ID4+IChYWV9TSElGVCAtIDcpKSAmIDB4Nzg7CisgICAgICAgIGogPSAocHQyLnkgPj4gKFhZX1NISUZUIC0gNykpICYgMHg3ODsKKyAgICB9CisKKyAgICBzbG9wZSA9IChzbG9wZSAmIDB4MjApID8gMHgxMDAgOiBpY3ZTbG9wZUNvcnJUYWJsZVtzbG9wZV07CisKKyAgICAvKiBDYWxjIGVuZCBwb2ludCBjb3JyZWN0aW9uIHRhYmxlICovCisgICAgeworICAgICAgICBpbnQgdDAgPSBzbG9wZSA8PCA3OworICAgICAgICBpbnQgdDEgPSAoKDB4NzggLSBpKSB8IDQpICogc2xvcGU7CisgICAgICAgIGludCB0MiA9IChqIHwgNCkgKiBzbG9wZTsKKworICAgICAgICBlcF90YWJsZVswXSA9IDA7CisgICAgICAgIGVwX3RhYmxlWzhdID0gc2xvcGU7CisgICAgICAgIGVwX3RhYmxlWzFdID0gZXBfdGFibGVbM10gPSAoKCgoaiAtIGkpICYgMHg3OCkgfCA0KSAqIHNsb3BlID4+IDgpICYgMHgxZmY7CisgICAgICAgIGVwX3RhYmxlWzJdID0gKHQxID4+IDgpICYgMHgxZmY7CisgICAgICAgIGVwX3RhYmxlWzRdID0gKCgoKGogLSBpKSArIDB4ODApIHwgNCkgKiBzbG9wZSA+PiA4KSAmIDB4MWZmOworICAgICAgICBlcF90YWJsZVs1XSA9ICgodDEgKyB0MCkgPj4gOCkgJiAweDFmZjsKKyAgICAgICAgZXBfdGFibGVbNl0gPSAodDIgPj4gOCkgJiAweDFmZjsKKyAgICAgICAgZXBfdGFibGVbN10gPSAoKHQyICsgdDApID4+IDgpICYgMHgxZmY7CisgICAgfQorCisgICAgaWYoIG5jaCA9PSAzICkKKyAgICB7CisgICAgICAgICNkZWZpbmUgIElDVl9QVVRfUE9JTlQoKSAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2NiID0gdHB0clswXTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfY2IgKz0gKChjYiAtIF9jYikqYSArIDEyNyk+PiA4O1wKKyAgICAgICAgICAgIF9jZyA9IHRwdHJbMV07ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2NnICs9ICgoY2cgLSBfY2cpKmEgKyAxMjcpPj4gODtcCisgICAgICAgICAgICBfY3IgPSB0cHRyWzJdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9jciArPSAoKGNyIC0gX2NyKSphICsgMTI3KT4+IDg7XAorICAgICAgICAgICAgdHB0clswXSA9ICh1Y2hhcilfY2I7ICAgICAgICAgICBcCisgICAgICAgICAgICB0cHRyWzFdID0gKHVjaGFyKV9jZzsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRwdHJbMl0gPSAodWNoYXIpX2NyOyAgICAgICAgICAgXAorICAgICAgICB9CisgICAgICAgIGlmKCBheCA+IGF5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IChwdDEueCA+PiBYWV9TSElGVCkgKiAzOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyICp0cHRyID0gcHRyICsgKChwdDEueSA+PiBYWV9TSElGVCkgLSAxKSAqIHN0ZXA7CisKKyAgICAgICAgICAgICAgICBpbnQgZXBfY29yciA9IGVwX3RhYmxlWygoKHNjb3VudCA+PSAyKSArIDEpICYgKHNjb3VudCB8IDIpKSAqIDMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZWNvdW50ID49IDIpICsgMSkgJiAoZWNvdW50IHwgMikpXTsKKyAgICAgICAgICAgICAgICBpbnQgYSwgZGlzdCA9IChwdDEueSA+PiAoWFlfU0hJRlQgLSA1KSkgJiAzMTsKKworICAgICAgICAgICAgICAgIGEgPSAoZXBfY29yciAqIGljdkZpbHRlclRhYmxlW2Rpc3QgKyAzMl0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbZGlzdF0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbNjMgLSBkaXN0XSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKworICAgICAgICAgICAgICAgIHB0MS55ICs9IHlfc3RlcDsKKyAgICAgICAgICAgICAgICBwdHIgKz0gMzsKKyAgICAgICAgICAgICAgICBzY291bnQrKzsKKyAgICAgICAgICAgICAgICBlY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciArPSAocHQxLnkgPj4gWFlfU0hJRlQpICogc3RlcDsKKworICAgICAgICAgICAgd2hpbGUoIGVjb3VudCA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciAqdHB0ciA9IHB0ciArICgocHQxLnggPj4gWFlfU0hJRlQpIC0gMSkgKiAzOworCisgICAgICAgICAgICAgICAgaW50IGVwX2NvcnIgPSBlcF90YWJsZVsoKChzY291bnQgPj0gMikgKyAxKSAmIChzY291bnQgfCAyKSkgKiAzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKGVjb3VudCA+PSAyKSArIDEpICYgKGVjb3VudCB8IDIpKV07CisgICAgICAgICAgICAgICAgaW50IGEsIGRpc3QgPSAocHQxLnggPj4gKFhZX1NISUZUIC0gNSkpICYgMzE7CisKKyAgICAgICAgICAgICAgICBhID0gKGVwX2NvcnIgKiBpY3ZGaWx0ZXJUYWJsZVtkaXN0ICsgMzJdID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworCisgICAgICAgICAgICAgICAgdHB0ciArPSAzOworICAgICAgICAgICAgICAgIGEgPSAoZXBfY29yciAqIGljdkZpbHRlclRhYmxlW2Rpc3RdID4+IDgpICYgMHhmZjsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworCisgICAgICAgICAgICAgICAgdHB0ciArPSAzOworICAgICAgICAgICAgICAgIGEgPSAoZXBfY29yciAqIGljdkZpbHRlclRhYmxlWzYzIC0gZGlzdF0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICBwdDEueCArPSB4X3N0ZXA7CisgICAgICAgICAgICAgICAgcHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgc2NvdW50Kys7CisgICAgICAgICAgICAgICAgZWNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3VuZGVmIElDVl9QVVRfUE9JTlQKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgI2RlZmluZSAgSUNWX1BVVF9QT0lOVCgpICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfY2IgPSB0cHRyWzBdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9jYiArPSAoKGNiIC0gX2NiKSphICsgMTI3KT4+IDg7XAorICAgICAgICAgICAgdHB0clswXSA9ICh1Y2hhcilfY2I7ICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgICAgICBpZiggYXggPiBheSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciArPSAocHQxLnggPj4gWFlfU0hJRlQpOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyICp0cHRyID0gcHRyICsgKChwdDEueSA+PiBYWV9TSElGVCkgLSAxKSAqIHN0ZXA7CisKKyAgICAgICAgICAgICAgICBpbnQgZXBfY29yciA9IGVwX3RhYmxlWygoKHNjb3VudCA+PSAyKSArIDEpICYgKHNjb3VudCB8IDIpKSAqIDMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZWNvdW50ID49IDIpICsgMSkgJiAoZWNvdW50IHwgMikpXTsKKyAgICAgICAgICAgICAgICBpbnQgYSwgZGlzdCA9IChwdDEueSA+PiAoWFlfU0hJRlQgLSA1KSkgJiAzMTsKKworICAgICAgICAgICAgICAgIGEgPSAoZXBfY29yciAqIGljdkZpbHRlclRhYmxlW2Rpc3QgKyAzMl0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbZGlzdF0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbNjMgLSBkaXN0XSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKworICAgICAgICAgICAgICAgIHB0MS55ICs9IHlfc3RlcDsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICBzY291bnQrKzsKKyAgICAgICAgICAgICAgICBlY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciArPSAocHQxLnkgPj4gWFlfU0hJRlQpICogc3RlcDsKKworICAgICAgICAgICAgd2hpbGUoIGVjb3VudCA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciAqdHB0ciA9IHB0ciArICgocHQxLnggPj4gWFlfU0hJRlQpIC0gMSk7CisKKyAgICAgICAgICAgICAgICBpbnQgZXBfY29yciA9IGVwX3RhYmxlWygoKHNjb3VudCA+PSAyKSArIDEpICYgKHNjb3VudCB8IDIpKSAqIDMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoZWNvdW50ID49IDIpICsgMSkgJiAoZWNvdW50IHwgMikpXTsKKyAgICAgICAgICAgICAgICBpbnQgYSwgZGlzdCA9IChwdDEueCA+PiAoWFlfU0hJRlQgLSA1KSkgJiAzMTsKKworICAgICAgICAgICAgICAgIGEgPSAoZXBfY29yciAqIGljdkZpbHRlclRhYmxlW2Rpc3QgKyAzMl0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyKys7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbZGlzdF0gPj4gOCkgJiAweGZmOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisKKyAgICAgICAgICAgICAgICB0cHRyKys7CisgICAgICAgICAgICAgICAgYSA9IChlcF9jb3JyICogaWN2RmlsdGVyVGFibGVbNjMgLSBkaXN0XSA+PiA4KSAmIDB4ZmY7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKworICAgICAgICAgICAgICAgIHB0MS54ICs9IHhfc3RlcDsKKyAgICAgICAgICAgICAgICBwdHIgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICBzY291bnQrKzsKKyAgICAgICAgICAgICAgICBlY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAjdW5kZWYgSUNWX1BVVF9QT0lOVAorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2TGluZTIoIEN2TWF0KiBpbWcsIEN2UG9pbnQgcHQxLCBDdlBvaW50IHB0MiwgY29uc3Qgdm9pZCogY29sb3IgKQoreworICAgIGludCBkeCwgZHk7CisgICAgaW50IGVjb3VudDsKKyAgICBpbnQgYXgsIGF5OworICAgIGludCBpLCBqOworICAgIGludCB4X3N0ZXAsIHlfc3RlcDsKKyAgICBpbnQgY2IgPSAoKHVjaGFyKiljb2xvcilbMF07CisgICAgaW50IGNnID0gKCh1Y2hhciopY29sb3IpWzFdOworICAgIGludCBjciA9ICgodWNoYXIqKWNvbG9yKVsyXTsKKyAgICBpbnQgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUoIGltZy0+dHlwZSApOworICAgIHVjaGFyICpwdHIgPSAodWNoYXIqKShpbWctPmRhdGEucHRyKSwgKnRwdHI7CisgICAgaW50IHN0ZXAgPSBpbWctPnN0ZXA7CisgICAgQ3ZTaXplIHNpemUgPSBjdkdldE1hdFNpemUoIGltZyApOworCisgICAgLy9hc3NlcnQoIGltZyAmJiAobmNoID09IDEgfHwgbmNoID09IDMpICYmIENWX01BVF9ERVBUSChpbWctPnR5cGUpID09IENWXzhVICk7CisKKyAgICBwdDEueCAtPSBYWV9PTkUqMjsKKyAgICBwdDEueSAtPSBYWV9PTkUqMjsKKyAgICBwdDIueCAtPSBYWV9PTkUqMjsKKyAgICBwdDIueSAtPSBYWV9PTkUqMjsKKyAgICBwdHIgKz0gaW1nLT5zdGVwKjIgKyAyKnBpeF9zaXplOworCisgICAgc2l6ZS53aWR0aCA9ICgoc2l6ZS53aWR0aCAtIDUpIDw8IFhZX1NISUZUKSArIDE7CisgICAgc2l6ZS5oZWlnaHQgPSAoKHNpemUuaGVpZ2h0IC0gNSkgPDwgWFlfU0hJRlQpICsgMTsKKworICAgIGlmKCAhY3ZDbGlwTGluZSggc2l6ZSwgJnB0MSwgJnB0MiApKQorICAgICAgICByZXR1cm47CisKKyAgICBkeCA9IHB0Mi54IC0gcHQxLng7CisgICAgZHkgPSBwdDIueSAtIHB0MS55OworCisgICAgaiA9IGR4IDwgMCA/IC0xIDogMDsKKyAgICBheCA9IChkeCBeIGopIC0gajsKKyAgICBpID0gZHkgPCAwID8gLTEgOiAwOworICAgIGF5ID0gKGR5IF4gaSkgLSBpOworCisgICAgaWYoIGF4ID4gYXkgKQorICAgIHsKKyAgICAgICAgZHggPSBheDsKKyAgICAgICAgZHkgPSAoZHkgXiBqKSAtIGo7CisgICAgICAgIHB0MS54IF49IHB0Mi54ICYgajsKKyAgICAgICAgcHQyLnggXj0gcHQxLnggJiBqOworICAgICAgICBwdDEueCBePSBwdDIueCAmIGo7CisgICAgICAgIHB0MS55IF49IHB0Mi55ICYgajsKKyAgICAgICAgcHQyLnkgXj0gcHQxLnkgJiBqOworICAgICAgICBwdDEueSBePSBwdDIueSAmIGo7CisKKyAgICAgICAgeF9zdGVwID0gWFlfT05FOworICAgICAgICB5X3N0ZXAgPSAoaW50KSAoKChpbnQ2NCkgZHkgPDwgWFlfU0hJRlQpIC8gKGF4IHwgMSkpOworICAgICAgICBlY291bnQgPSAocHQyLnggLSBwdDEueCkgPj4gWFlfU0hJRlQ7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGR5ID0gYXk7CisgICAgICAgIGR4ID0gKGR4IF4gaSkgLSBpOworICAgICAgICBwdDEueCBePSBwdDIueCAmIGk7CisgICAgICAgIHB0Mi54IF49IHB0MS54ICYgaTsKKyAgICAgICAgcHQxLnggXj0gcHQyLnggJiBpOworICAgICAgICBwdDEueSBePSBwdDIueSAmIGk7CisgICAgICAgIHB0Mi55IF49IHB0MS55ICYgaTsKKyAgICAgICAgcHQxLnkgXj0gcHQyLnkgJiBpOworCisgICAgICAgIHhfc3RlcCA9IChpbnQpICgoKGludDY0KSBkeCA8PCBYWV9TSElGVCkgLyAoYXkgfCAxKSk7CisgICAgICAgIHlfc3RlcCA9IFhZX09ORTsKKyAgICAgICAgZWNvdW50ID0gKHB0Mi55IC0gcHQxLnkpID4+IFhZX1NISUZUOworICAgIH0KKworICAgIHB0MS54ICs9IChYWV9PTkUgPj4gMSk7CisgICAgcHQxLnkgKz0gKFhZX09ORSA+PiAxKTsKKworICAgIGlmKCBwaXhfc2l6ZSA9PSAzICkKKyAgICB7CisgICAgICAgICNkZWZpbmUgIElDVl9QVVRfUE9JTlQoKSAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0cHRyWzBdID0gKHVjaGFyKWNiOyAgICBcCisgICAgICAgICAgICB0cHRyWzFdID0gKHVjaGFyKWNnOyAgICBcCisgICAgICAgICAgICB0cHRyWzJdID0gKHVjaGFyKWNyOyAgICBcCisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHRwdHIgPSBwdHIgKyAoKHB0Mi54ICsgKFhZX09ORSA+PiAxKSk+PiBYWV9TSElGVCkqMyArCisgICAgICAgICAgICAoKHB0Mi55ICsgKFhZX09ORSA+PiAxKSkgPj4gWFlfU0hJRlQpKnN0ZXA7CisgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBheCA+IGF5ICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IChwdDEueCA+PiBYWV9TSElGVCkgKiAzOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwdHIgPSBwdHIgKyAocHQxLnkgPj4gWFlfU0hJRlQpICogc3RlcDsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgICAgICAgICAgcHQxLnkgKz0geV9zdGVwOworICAgICAgICAgICAgICAgIHB0ciArPSAzOworICAgICAgICAgICAgICAgIGVjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IChwdDEueSA+PiBYWV9TSElGVCkgKiBzdGVwOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwdHIgPSBwdHIgKyAocHQxLnggPj4gWFlfU0hJRlQpICogMzsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgICAgICAgICAgcHQxLnggKz0geF9zdGVwOworICAgICAgICAgICAgICAgIHB0ciArPSBzdGVwOworICAgICAgICAgICAgICAgIGVjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgI3VuZGVmIElDVl9QVVRfUE9JTlQKKyAgICB9CisgICAgZWxzZSBpZiggcGl4X3NpemUgPT0gMSApCisgICAgeworICAgICAgICAjZGVmaW5lICBJQ1ZfUFVUX1BPSU5UKCkgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRwdHJbMF0gPSAodWNoYXIpY2I7ICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAgICAgdHB0ciA9IHB0ciArICgocHQyLnggKyAoWFlfT05FID4+IDEpKT4+IFhZX1NISUZUKSArCisgICAgICAgICAgICAoKHB0Mi55ICsgKFhZX09ORSA+PiAxKSkgPj4gWFlfU0hJRlQpKnN0ZXA7CisgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKworICAgICAgICBpZiggYXggPiBheSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciArPSAocHQxLnggPj4gWFlfU0hJRlQpOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwdHIgPSBwdHIgKyAocHQxLnkgPj4gWFlfU0hJRlQpICogc3RlcDsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgICAgICAgICAgcHQxLnkgKz0geV9zdGVwOworICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgICAgIGVjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IChwdDEueSA+PiBYWV9TSElGVCkgKiBzdGVwOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwdHIgPSBwdHIgKyAocHQxLnggPj4gWFlfU0hJRlQpOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBwdDEueCArPSB4X3N0ZXA7CisgICAgICAgICAgICAgICAgcHRyICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgZWNvdW50LS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgI3VuZGVmIElDVl9QVVRfUE9JTlQKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgI2RlZmluZSAgSUNWX1BVVF9QT0lOVCgpICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBwaXhfc2l6ZTsgaisrICkgICAgIFwKKyAgICAgICAgICAgICAgICB0cHRyW2pdID0gKCh1Y2hhciopY29sb3IpW2pdOworCisgICAgICAgIHRwdHIgPSBwdHIgKyAoKHB0Mi54ICsgKFhZX09ORSA+PiAxKSk+PiBYWV9TSElGVCkqcGl4X3NpemUgKworICAgICAgICAgICAgKChwdDIueSArIChYWV9PTkUgPj4gMSkpID4+IFhZX1NISUZUKSpzdGVwOworICAgICAgICBJQ1ZfUFVUX1BPSU5UKCk7CisgICAgICAgIAorICAgICAgICBpZiggYXggPiBheSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHB0ciArPSAocHQxLnggPj4gWFlfU0hJRlQpICogcGl4X3NpemU7CisKKyAgICAgICAgICAgIHdoaWxlKCBlY291bnQgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdHB0ciA9IHB0ciArIChwdDEueSA+PiBYWV9TSElGVCkgKiBzdGVwOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoKTsKKyAgICAgICAgICAgICAgICBwdDEueSArPSB5X3N0ZXA7CisgICAgICAgICAgICAgICAgcHRyICs9IHBpeF9zaXplOworICAgICAgICAgICAgICAgIGVjb3VudC0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcHRyICs9IChwdDEueSA+PiBYWV9TSElGVCkgKiBzdGVwOworCisgICAgICAgICAgICB3aGlsZSggZWNvdW50ID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRwdHIgPSBwdHIgKyAocHQxLnggPj4gWFlfU0hJRlQpICogcGl4X3NpemU7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCgpOworICAgICAgICAgICAgICAgIHB0MS54ICs9IHhfc3RlcDsKKyAgICAgICAgICAgICAgICBwdHIgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICBlY291bnQtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICN1bmRlZiBJQ1ZfUFVUX1BPSU5UCisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICBBbnRpYWxpYXplZCBFbGxpcHRpYyBBcmNzIHZpYSBBbnRpYWxpYXplZCBMaW5lcyAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNvbnN0IGZsb2F0IGljdlNpblRhYmxlW10gPQorICAgIHsgMC4wMDAwMDAwZiwgMC4wMTc0NTI0ZiwgMC4wMzQ4OTk1ZiwgMC4wNTIzMzYwZiwgMC4wNjk3NTY1ZiwgMC4wODcxNTU3ZiwKKyAgICAwLjEwNDUyODVmLCAwLjEyMTg2OTNmLCAwLjEzOTE3MzFmLCAwLjE1NjQzNDVmLCAwLjE3MzY0ODJmLCAwLjE5MDgwOTBmLAorICAgIDAuMjA3OTExN2YsIDAuMjI0OTUxMWYsIDAuMjQxOTIxOWYsIDAuMjU4ODE5MGYsIDAuMjc1NjM3NGYsIDAuMjkyMzcxN2YsCisgICAgMC4zMDkwMTcwZiwgMC4zMjU1NjgyZiwgMC4zNDIwMjAxZiwgMC4zNTgzNjc5ZiwgMC4zNzQ2MDY2ZiwgMC4zOTA3MzExZiwKKyAgICAwLjQwNjczNjZmLCAwLjQyMjYxODNmLCAwLjQzODM3MTFmLCAwLjQ1Mzk5MDVmLCAwLjQ2OTQ3MTZmLCAwLjQ4NDgwOTZmLAorICAgIDAuNTAwMDAwMGYsIDAuNTE1MDM4MWYsIDAuNTI5OTE5M2YsIDAuNTQ0NjM5MGYsIDAuNTU5MTkyOWYsIDAuNTczNTc2NGYsCisgICAgMC41ODc3ODUzZiwgMC42MDE4MTUwZiwgMC42MTU2NjE1ZiwgMC42MjkzMjA0ZiwgMC42NDI3ODc2ZiwgMC42NTYwNTkwZiwKKyAgICAwLjY2OTEzMDZmLCAwLjY4MTk5ODRmLCAwLjY5NDY1ODRmLCAwLjcwNzEwNjhmLCAwLjcxOTMzOThmLCAwLjczMTM1MzdmLAorICAgIDAuNzQzMTQ0OGYsIDAuNzU0NzA5NmYsIDAuNzY2MDQ0NGYsIDAuNzc3MTQ2MGYsIDAuNzg4MDEwOGYsIDAuNzk4NjM1NWYsCisgICAgMC44MDkwMTcwZiwgMC44MTkxNTIwZiwgMC44MjkwMzc2ZiwgMC44Mzg2NzA2ZiwgMC44NDgwNDgxZiwgMC44NTcxNjczZiwKKyAgICAwLjg2NjAyNTRmLCAwLjg3NDYxOTdmLCAwLjg4Mjk0NzZmLCAwLjg5MTAwNjVmLCAwLjg5ODc5NDBmLCAwLjkwNjMwNzhmLAorICAgIDAuOTEzNTQ1NWYsIDAuOTIwNTA0OWYsIDAuOTI3MTgzOWYsIDAuOTMzNTgwNGYsIDAuOTM5NjkyNmYsIDAuOTQ1NTE4NmYsCisgICAgMC45NTEwNTY1ZiwgMC45NTYzMDQ4ZiwgMC45NjEyNjE3ZiwgMC45NjU5MjU4ZiwgMC45NzAyOTU3ZiwgMC45NzQzNzAxZiwKKyAgICAwLjk3ODE0NzZmLCAwLjk4MTYyNzJmLCAwLjk4NDgwNzhmLCAwLjk4NzY4ODNmLCAwLjk5MDI2ODFmLCAwLjk5MjU0NjJmLAorICAgIDAuOTk0NTIxOWYsIDAuOTk2MTk0N2YsIDAuOTk3NTY0MWYsIDAuOTk4NjI5NWYsIDAuOTk5MzkwOGYsIDAuOTk5ODQ3N2YsCisgICAgMS4wMDAwMDAwZiwgMC45OTk4NDc3ZiwgMC45OTkzOTA4ZiwgMC45OTg2Mjk1ZiwgMC45OTc1NjQxZiwgMC45OTYxOTQ3ZiwKKyAgICAwLjk5NDUyMTlmLCAwLjk5MjU0NjJmLCAwLjk5MDI2ODFmLCAwLjk4NzY4ODNmLCAwLjk4NDgwNzhmLCAwLjk4MTYyNzJmLAorICAgIDAuOTc4MTQ3NmYsIDAuOTc0MzcwMWYsIDAuOTcwMjk1N2YsIDAuOTY1OTI1OGYsIDAuOTYxMjYxN2YsIDAuOTU2MzA0OGYsCisgICAgMC45NTEwNTY1ZiwgMC45NDU1MTg2ZiwgMC45Mzk2OTI2ZiwgMC45MzM1ODA0ZiwgMC45MjcxODM5ZiwgMC45MjA1MDQ5ZiwKKyAgICAwLjkxMzU0NTVmLCAwLjkwNjMwNzhmLCAwLjg5ODc5NDBmLCAwLjg5MTAwNjVmLCAwLjg4Mjk0NzZmLCAwLjg3NDYxOTdmLAorICAgIDAuODY2MDI1NGYsIDAuODU3MTY3M2YsIDAuODQ4MDQ4MWYsIDAuODM4NjcwNmYsIDAuODI5MDM3NmYsIDAuODE5MTUyMGYsCisgICAgMC44MDkwMTcwZiwgMC43OTg2MzU1ZiwgMC43ODgwMTA4ZiwgMC43NzcxNDYwZiwgMC43NjYwNDQ0ZiwgMC43NTQ3MDk2ZiwKKyAgICAwLjc0MzE0NDhmLCAwLjczMTM1MzdmLCAwLjcxOTMzOThmLCAwLjcwNzEwNjhmLCAwLjY5NDY1ODRmLCAwLjY4MTk5ODRmLAorICAgIDAuNjY5MTMwNmYsIDAuNjU2MDU5MGYsIDAuNjQyNzg3NmYsIDAuNjI5MzIwNGYsIDAuNjE1NjYxNWYsIDAuNjAxODE1MGYsCisgICAgMC41ODc3ODUzZiwgMC41NzM1NzY0ZiwgMC41NTkxOTI5ZiwgMC41NDQ2MzkwZiwgMC41Mjk5MTkzZiwgMC41MTUwMzgxZiwKKyAgICAwLjUwMDAwMDBmLCAwLjQ4NDgwOTZmLCAwLjQ2OTQ3MTZmLCAwLjQ1Mzk5MDVmLCAwLjQzODM3MTFmLCAwLjQyMjYxODNmLAorICAgIDAuNDA2NzM2NmYsIDAuMzkwNzMxMWYsIDAuMzc0NjA2NmYsIDAuMzU4MzY3OWYsIDAuMzQyMDIwMWYsIDAuMzI1NTY4MmYsCisgICAgMC4zMDkwMTcwZiwgMC4yOTIzNzE3ZiwgMC4yNzU2Mzc0ZiwgMC4yNTg4MTkwZiwgMC4yNDE5MjE5ZiwgMC4yMjQ5NTExZiwKKyAgICAwLjIwNzkxMTdmLCAwLjE5MDgwOTBmLCAwLjE3MzY0ODJmLCAwLjE1NjQzNDVmLCAwLjEzOTE3MzFmLCAwLjEyMTg2OTNmLAorICAgIDAuMTA0NTI4NWYsIDAuMDg3MTU1N2YsIDAuMDY5NzU2NWYsIDAuMDUyMzM2MGYsIDAuMDM0ODk5NWYsIDAuMDE3NDUyNGYsCisgICAgMC4wMDAwMDAwZiwgLTAuMDE3NDUyNGYsIC0wLjAzNDg5OTVmLCAtMC4wNTIzMzYwZiwgLTAuMDY5NzU2NWYsIC0wLjA4NzE1NTdmLAorICAgIC0wLjEwNDUyODVmLCAtMC4xMjE4NjkzZiwgLTAuMTM5MTczMWYsIC0wLjE1NjQzNDVmLCAtMC4xNzM2NDgyZiwgLTAuMTkwODA5MGYsCisgICAgLTAuMjA3OTExN2YsIC0wLjIyNDk1MTFmLCAtMC4yNDE5MjE5ZiwgLTAuMjU4ODE5MGYsIC0wLjI3NTYzNzRmLCAtMC4yOTIzNzE3ZiwKKyAgICAtMC4zMDkwMTcwZiwgLTAuMzI1NTY4MmYsIC0wLjM0MjAyMDFmLCAtMC4zNTgzNjc5ZiwgLTAuMzc0NjA2NmYsIC0wLjM5MDczMTFmLAorICAgIC0wLjQwNjczNjZmLCAtMC40MjI2MTgzZiwgLTAuNDM4MzcxMWYsIC0wLjQ1Mzk5MDVmLCAtMC40Njk0NzE2ZiwgLTAuNDg0ODA5NmYsCisgICAgLTAuNTAwMDAwMGYsIC0wLjUxNTAzODFmLCAtMC41Mjk5MTkzZiwgLTAuNTQ0NjM5MGYsIC0wLjU1OTE5MjlmLCAtMC41NzM1NzY0ZiwKKyAgICAtMC41ODc3ODUzZiwgLTAuNjAxODE1MGYsIC0wLjYxNTY2MTVmLCAtMC42MjkzMjA0ZiwgLTAuNjQyNzg3NmYsIC0wLjY1NjA1OTBmLAorICAgIC0wLjY2OTEzMDZmLCAtMC42ODE5OTg0ZiwgLTAuNjk0NjU4NGYsIC0wLjcwNzEwNjhmLCAtMC43MTkzMzk4ZiwgLTAuNzMxMzUzN2YsCisgICAgLTAuNzQzMTQ0OGYsIC0wLjc1NDcwOTZmLCAtMC43NjYwNDQ0ZiwgLTAuNzc3MTQ2MGYsIC0wLjc4ODAxMDhmLCAtMC43OTg2MzU1ZiwKKyAgICAtMC44MDkwMTcwZiwgLTAuODE5MTUyMGYsIC0wLjgyOTAzNzZmLCAtMC44Mzg2NzA2ZiwgLTAuODQ4MDQ4MWYsIC0wLjg1NzE2NzNmLAorICAgIC0wLjg2NjAyNTRmLCAtMC44NzQ2MTk3ZiwgLTAuODgyOTQ3NmYsIC0wLjg5MTAwNjVmLCAtMC44OTg3OTQwZiwgLTAuOTA2MzA3OGYsCisgICAgLTAuOTEzNTQ1NWYsIC0wLjkyMDUwNDlmLCAtMC45MjcxODM5ZiwgLTAuOTMzNTgwNGYsIC0wLjkzOTY5MjZmLCAtMC45NDU1MTg2ZiwKKyAgICAtMC45NTEwNTY1ZiwgLTAuOTU2MzA0OGYsIC0wLjk2MTI2MTdmLCAtMC45NjU5MjU4ZiwgLTAuOTcwMjk1N2YsIC0wLjk3NDM3MDFmLAorICAgIC0wLjk3ODE0NzZmLCAtMC45ODE2MjcyZiwgLTAuOTg0ODA3OGYsIC0wLjk4NzY4ODNmLCAtMC45OTAyNjgxZiwgLTAuOTkyNTQ2MmYsCisgICAgLTAuOTk0NTIxOWYsIC0wLjk5NjE5NDdmLCAtMC45OTc1NjQxZiwgLTAuOTk4NjI5NWYsIC0wLjk5OTM5MDhmLCAtMC45OTk4NDc3ZiwKKyAgICAtMS4wMDAwMDAwZiwgLTAuOTk5ODQ3N2YsIC0wLjk5OTM5MDhmLCAtMC45OTg2Mjk1ZiwgLTAuOTk3NTY0MWYsIC0wLjk5NjE5NDdmLAorICAgIC0wLjk5NDUyMTlmLCAtMC45OTI1NDYyZiwgLTAuOTkwMjY4MWYsIC0wLjk4NzY4ODNmLCAtMC45ODQ4MDc4ZiwgLTAuOTgxNjI3MmYsCisgICAgLTAuOTc4MTQ3NmYsIC0wLjk3NDM3MDFmLCAtMC45NzAyOTU3ZiwgLTAuOTY1OTI1OGYsIC0wLjk2MTI2MTdmLCAtMC45NTYzMDQ4ZiwKKyAgICAtMC45NTEwNTY1ZiwgLTAuOTQ1NTE4NmYsIC0wLjkzOTY5MjZmLCAtMC45MzM1ODA0ZiwgLTAuOTI3MTgzOWYsIC0wLjkyMDUwNDlmLAorICAgIC0wLjkxMzU0NTVmLCAtMC45MDYzMDc4ZiwgLTAuODk4Nzk0MGYsIC0wLjg5MTAwNjVmLCAtMC44ODI5NDc2ZiwgLTAuODc0NjE5N2YsCisgICAgLTAuODY2MDI1NGYsIC0wLjg1NzE2NzNmLCAtMC44NDgwNDgxZiwgLTAuODM4NjcwNmYsIC0wLjgyOTAzNzZmLCAtMC44MTkxNTIwZiwKKyAgICAtMC44MDkwMTcwZiwgLTAuNzk4NjM1NWYsIC0wLjc4ODAxMDhmLCAtMC43NzcxNDYwZiwgLTAuNzY2MDQ0NGYsIC0wLjc1NDcwOTZmLAorICAgIC0wLjc0MzE0NDhmLCAtMC43MzEzNTM3ZiwgLTAuNzE5MzM5OGYsIC0wLjcwNzEwNjhmLCAtMC42OTQ2NTg0ZiwgLTAuNjgxOTk4NGYsCisgICAgLTAuNjY5MTMwNmYsIC0wLjY1NjA1OTBmLCAtMC42NDI3ODc2ZiwgLTAuNjI5MzIwNGYsIC0wLjYxNTY2MTVmLCAtMC42MDE4MTUwZiwKKyAgICAtMC41ODc3ODUzZiwgLTAuNTczNTc2NGYsIC0wLjU1OTE5MjlmLCAtMC41NDQ2MzkwZiwgLTAuNTI5OTE5M2YsIC0wLjUxNTAzODFmLAorICAgIC0wLjUwMDAwMDBmLCAtMC40ODQ4MDk2ZiwgLTAuNDY5NDcxNmYsIC0wLjQ1Mzk5MDVmLCAtMC40MzgzNzExZiwgLTAuNDIyNjE4M2YsCisgICAgLTAuNDA2NzM2NmYsIC0wLjM5MDczMTFmLCAtMC4zNzQ2MDY2ZiwgLTAuMzU4MzY3OWYsIC0wLjM0MjAyMDFmLCAtMC4zMjU1NjgyZiwKKyAgICAtMC4zMDkwMTcwZiwgLTAuMjkyMzcxN2YsIC0wLjI3NTYzNzRmLCAtMC4yNTg4MTkwZiwgLTAuMjQxOTIxOWYsIC0wLjIyNDk1MTFmLAorICAgIC0wLjIwNzkxMTdmLCAtMC4xOTA4MDkwZiwgLTAuMTczNjQ4MmYsIC0wLjE1NjQzNDVmLCAtMC4xMzkxNzMxZiwgLTAuMTIxODY5M2YsCisgICAgLTAuMTA0NTI4NWYsIC0wLjA4NzE1NTdmLCAtMC4wNjk3NTY1ZiwgLTAuMDUyMzM2MGYsIC0wLjAzNDg5OTVmLCAtMC4wMTc0NTI0ZiwKKyAgICAtMC4wMDAwMDAwZiwgMC4wMTc0NTI0ZiwgMC4wMzQ4OTk1ZiwgMC4wNTIzMzYwZiwgMC4wNjk3NTY1ZiwgMC4wODcxNTU3ZiwKKyAgICAwLjEwNDUyODVmLCAwLjEyMTg2OTNmLCAwLjEzOTE3MzFmLCAwLjE1NjQzNDVmLCAwLjE3MzY0ODJmLCAwLjE5MDgwOTBmLAorICAgIDAuMjA3OTExN2YsIDAuMjI0OTUxMWYsIDAuMjQxOTIxOWYsIDAuMjU4ODE5MGYsIDAuMjc1NjM3NGYsIDAuMjkyMzcxN2YsCisgICAgMC4zMDkwMTcwZiwgMC4zMjU1NjgyZiwgMC4zNDIwMjAxZiwgMC4zNTgzNjc5ZiwgMC4zNzQ2MDY2ZiwgMC4zOTA3MzExZiwKKyAgICAwLjQwNjczNjZmLCAwLjQyMjYxODNmLCAwLjQzODM3MTFmLCAwLjQ1Mzk5MDVmLCAwLjQ2OTQ3MTZmLCAwLjQ4NDgwOTZmLAorICAgIDAuNTAwMDAwMGYsIDAuNTE1MDM4MWYsIDAuNTI5OTE5M2YsIDAuNTQ0NjM5MGYsIDAuNTU5MTkyOWYsIDAuNTczNTc2NGYsCisgICAgMC41ODc3ODUzZiwgMC42MDE4MTUwZiwgMC42MTU2NjE1ZiwgMC42MjkzMjA0ZiwgMC42NDI3ODc2ZiwgMC42NTYwNTkwZiwKKyAgICAwLjY2OTEzMDZmLCAwLjY4MTk5ODRmLCAwLjY5NDY1ODRmLCAwLjcwNzEwNjhmLCAwLjcxOTMzOThmLCAwLjczMTM1MzdmLAorICAgIDAuNzQzMTQ0OGYsIDAuNzU0NzA5NmYsIDAuNzY2MDQ0NGYsIDAuNzc3MTQ2MGYsIDAuNzg4MDEwOGYsIDAuNzk4NjM1NWYsCisgICAgMC44MDkwMTcwZiwgMC44MTkxNTIwZiwgMC44MjkwMzc2ZiwgMC44Mzg2NzA2ZiwgMC44NDgwNDgxZiwgMC44NTcxNjczZiwKKyAgICAwLjg2NjAyNTRmLCAwLjg3NDYxOTdmLCAwLjg4Mjk0NzZmLCAwLjg5MTAwNjVmLCAwLjg5ODc5NDBmLCAwLjkwNjMwNzhmLAorICAgIDAuOTEzNTQ1NWYsIDAuOTIwNTA0OWYsIDAuOTI3MTgzOWYsIDAuOTMzNTgwNGYsIDAuOTM5NjkyNmYsIDAuOTQ1NTE4NmYsCisgICAgMC45NTEwNTY1ZiwgMC45NTYzMDQ4ZiwgMC45NjEyNjE3ZiwgMC45NjU5MjU4ZiwgMC45NzAyOTU3ZiwgMC45NzQzNzAxZiwKKyAgICAwLjk3ODE0NzZmLCAwLjk4MTYyNzJmLCAwLjk4NDgwNzhmLCAwLjk4NzY4ODNmLCAwLjk5MDI2ODFmLCAwLjk5MjU0NjJmLAorICAgIDAuOTk0NTIxOWYsIDAuOTk2MTk0N2YsIDAuOTk3NTY0MWYsIDAuOTk4NjI5NWYsIDAuOTk5MzkwOGYsIDAuOTk5ODQ3N2YsCisgICAgMS4wMDAwMDAwZgorfTsKKworCitzdGF0aWMgdm9pZAoraWN2U2luQ29zKCBpbnQgYW5nbGUsIGZsb2F0ICpjb3N2YWwsIGZsb2F0ICpzaW52YWwgKQoreworICAgIGFuZ2xlICs9IChhbmdsZSA8IDAgPyAzNjAgOiAwKTsKKyAgICAqc2ludmFsID0gaWN2U2luVGFibGVbYW5nbGVdOworICAgICpjb3N2YWwgPSBpY3ZTaW5UYWJsZVs0NTAgLSBhbmdsZV07Cit9CisKKy8qIAorICAgY29uc3RydWN0cyBwb2x5Z29uIHRoYXQgcmVwcmVzZW50cyBlbGxpcHRpYyBhcmMuCisqLworQ1ZfSU1QTCBpbnQKK2N2RWxsaXBzZTJQb2x5KCBDdlBvaW50IGNlbnRlciwgQ3ZTaXplIGF4ZXMsIGludCBhbmdsZSwKKyAgICAgICAgICAgICAgICBpbnQgYXJjX3N0YXJ0LCBpbnQgYXJjX2VuZCwgQ3ZQb2ludCogcHRzLCBpbnQgZGVsdGEgKQoreworICAgIGZsb2F0IGFscGhhLCBiZXRhOworICAgIGRvdWJsZSBzaXplX2EgPSBheGVzLndpZHRoLCBzaXplX2IgPSBheGVzLmhlaWdodDsKKyAgICBkb3VibGUgY3ggPSBjZW50ZXIueCwgY3kgPSBjZW50ZXIueTsKKyAgICBDdlBvaW50ICpwdHNfb3JpZ2luID0gcHRzOworICAgIGludCBpOworCisgICAgd2hpbGUoIGFuZ2xlIDwgMCApCisgICAgICAgIGFuZ2xlICs9IDM2MDsKKyAgICB3aGlsZSggYW5nbGUgPiAzNjAgKQorICAgICAgICBhbmdsZSAtPSAzNjA7CisKKyAgICBpZiggYXJjX3N0YXJ0ID4gYXJjX2VuZCApCisgICAgeworICAgICAgICBpID0gYXJjX3N0YXJ0OworICAgICAgICBhcmNfc3RhcnQgPSBhcmNfZW5kOworICAgICAgICBhcmNfZW5kID0gaTsKKyAgICB9CisgICAgd2hpbGUoIGFyY19zdGFydCA8IDAgKQorICAgIHsKKyAgICAgICAgYXJjX3N0YXJ0ICs9IDM2MDsKKyAgICAgICAgYXJjX2VuZCArPSAzNjA7CisgICAgfQorICAgIHdoaWxlKCBhcmNfZW5kID4gMzYwICkKKyAgICB7CisgICAgICAgIGFyY19lbmQgLT0gMzYwOworICAgICAgICBhcmNfc3RhcnQgLT0gMzYwOworICAgIH0KKyAgICBpZiggYXJjX2VuZCAtIGFyY19zdGFydCA+IDM2MCApCisgICAgeworICAgICAgICBhcmNfc3RhcnQgPSAwOworICAgICAgICBhcmNfZW5kID0gMzYwOworICAgIH0KKyAgICBpY3ZTaW5Db3MoIGFuZ2xlLCAmYWxwaGEsICZiZXRhICk7CisKKyAgICBmb3IoIGkgPSBhcmNfc3RhcnQ7IGkgPCBhcmNfZW5kICsgZGVsdGE7IGkgKz0gZGVsdGEgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHgsIHk7CisgICAgICAgIGFuZ2xlID0gaTsKKyAgICAgICAgaWYoIGFuZ2xlID4gYXJjX2VuZCApCisgICAgICAgICAgICBhbmdsZSA9IGFyY19lbmQ7CisgICAgICAgIGlmKCBhbmdsZSA8IDAgKQorICAgICAgICAgICAgYW5nbGUgKz0gMzYwOworICAgICAgICAKKyAgICAgICAgeCA9IHNpemVfYSAqIGljdlNpblRhYmxlWzQ1MC1hbmdsZV07CisgICAgICAgIHkgPSBzaXplX2IgKiBpY3ZTaW5UYWJsZVthbmdsZV07CisgICAgICAgIHB0cy0+eCA9IGN2Um91bmQoIGN4ICsgeCAqIGFscGhhIC0geSAqIGJldGEgKTsKKyAgICAgICAgcHRzLT55ID0gY3ZSb3VuZCggY3kgLSB4ICogYmV0YSAtIHkgKiBhbHBoYSApOworICAgICAgICBwdHMgKz0gaSA9PSBhcmNfc3RhcnQgfHwgcHRzLT54ICE9IHB0c1stMV0ueCB8fCBwdHMtPnkgIT0gcHRzWy0xXS55OworICAgIH0KKworICAgIGkgPSAoaW50KShwdHMgLSBwdHNfb3JpZ2luKTsKKyAgICBmb3IoIDsgaSA8IDI7IGkrKyApCisgICAgICAgIHB0c19vcmlnaW5baV0gPSBwdHNfb3JpZ2luW2ktMV07CisgICAgcmV0dXJuIGk7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkVsbGlwc2VFeCggQ3ZNYXQqIGltZywgQ3ZQb2ludCBjZW50ZXIsIEN2U2l6ZSBheGVzLAorICAgICAgICAgICAgICBpbnQgYW5nbGUsIGludCBhcmNfc3RhcnQsIGludCBhcmNfZW5kLAorICAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb2xvciwgaW50IHRoaWNrbmVzcywgaW50IGxpbmVfdHlwZSApCit7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkVsbGlwc2VFeCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlBvaW50IHZbMSA8PCA4XTsKKyAgICBpbnQgY291bnQsIGRlbHRhOworCisgICAgaWYoIGF4ZXMud2lkdGggPCAwIHx8IGF4ZXMuaGVpZ2h0IDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiIiApOworCisgICAgZGVsdGEgPSAoTUFYKGF4ZXMud2lkdGgsYXhlcy5oZWlnaHQpKyhYWV9PTkU+PjEpKT4+WFlfU0hJRlQ7CisgICAgZGVsdGEgPSBkZWx0YSA8IDMgPyA5MCA6IGRlbHRhIDwgMTAgPyAzMCA6IGRlbHRhIDwgMTUgPyAxOCA6IDU7CisKKyAgICBjb3VudCA9IGN2RWxsaXBzZTJQb2x5KCBjZW50ZXIsIGF4ZXMsIGFuZ2xlLCBhcmNfc3RhcnQsIGFyY19lbmQsIHYsIGRlbHRhICk7CisKKyAgICBpZiggdGhpY2tuZXNzID49IDAgKQorICAgIHsKKyAgICAgICAgaWN2UG9seUxpbmUoIGltZywgdiwgY291bnQsIDAsIGNvbG9yLCB0aGlja25lc3MsIGxpbmVfdHlwZSwgWFlfU0hJRlQgKTsKKyAgICB9CisgICAgZWxzZSBpZiggYXJjX2VuZCAtIGFyY19zdGFydCA+PSAzNjAgKQorICAgIHsKKyAgICAgICAgaWN2RmlsbENvbnZleFBvbHkoIGltZywgdiwgY291bnQsIGNvbG9yLCBsaW5lX3R5cGUsIFhZX1NISUZUICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2Q29udG91ciogZWRnZXM7CisgICAgICAgIEN2U2VxIHZ0eDsKKyAgICAgICAgQ3ZTZXFCbG9jayBibG9jazsKKyAgICAgICAgCisgICAgICAgIENWX0NBTEwoIHN0ID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCBDVl9EUkFXSU5HX1NUT1JBR0VfQkxPQ0sgKSk7CisgICAgICAgIENWX0NBTEwoIGVkZ2VzID0gKEN2Q29udG91ciopY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdkNvbnRvdXIpLCBzaXplb2YoQ3ZQb2x5RWRnZSksIHN0ICkpOworICAgICAgICB2W2NvdW50KytdID0gY2VudGVyOworCisgICAgICAgIENWX0NBTEwoIGN2TWFrZVNlcUhlYWRlckZvckFycmF5KCBDVl8zMlNDMiwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2UG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiwgY291bnQsICZ2dHgsICZibG9jayApKTsKKworICAgICAgICBDVl9DQUxMKCBpY3ZDb2xsZWN0UG9seUVkZ2VzKCBpbWcsICZ2dHgsIGVkZ2VzLCBjb2xvciwgbGluZV90eXBlLCBYWV9TSElGVCApKTsKKyAgICAgICAgQ1ZfQ0FMTCggaWN2RmlsbEVkZ2VDb2xsZWN0aW9uKCBpbWcsIGVkZ2VzLCBjb2xvciApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIHN0ICkKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2x5Z29ucyBmaWxsaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaGVscGVyIG1hY3JvczogZmlsbGluZyBob3Jpem9udGFsIHJvdyAqLworI2RlZmluZSBJQ1ZfSExJTkUoIHB0ciwgeGwsIHhyLCBjb2xvciwgcGl4X3NpemUgKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIGhsaW5lX3B0ciA9ICh1Y2hhciopKHB0cikgKyAoeGwpKihwaXhfc2l6ZSk7ICAgICAgXAorICAgIHVjaGFyKiBobGluZV9tYXhfcHRyID0gKHVjaGFyKikocHRyKSArICh4cikqKHBpeF9zaXplKTsgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGhsaW5lX3B0ciA8PSBobGluZV9tYXhfcHRyOyBobGluZV9wdHIgKz0gKHBpeF9zaXplKSlcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaGxpbmVfajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBobGluZV9qID0gMDsgaGxpbmVfaiA8IChwaXhfc2l6ZSk7IGhsaW5lX2orKyApICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaGxpbmVfcHRyW2hsaW5lX2pdID0gKCh1Y2hhciopY29sb3IpW2hsaW5lX2pdOyAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qIGZpbGxpbmcgY29udmV4IHBvbHlnb24uIHYgLSBhcnJheSBvZiB2ZXJ0aWNlcywgbnRwcyAtIG51bWJlciBvZiBwb2ludHMgKi8KK3N0YXRpYyB2b2lkCitpY3ZGaWxsQ29udmV4UG9seSggQ3ZNYXQqIGltZywgQ3ZQb2ludCAqdiwgaW50IG5wdHMsIGNvbnN0IHZvaWQqIGNvbG9yLCBpbnQgbGluZV90eXBlLCBpbnQgc2hpZnQgKQoreworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgaW50IGlkeCwgZGk7CisgICAgICAgIGludCB4LCBkeCwgeWU7CisgICAgfQorICAgIGVkZ2VbMl07CisKKyAgICBpbnQgZGVsdGEgPSBzaGlmdCA/IDEgPDwgKHNoaWZ0IC0gMSkgOiAwOworICAgIGludCBpLCB5LCBpbWluID0gMCwgbGVmdCA9IDAsIHJpZ2h0ID0gMSwgeDEsIHgyOworICAgIGludCBlZGdlcyA9IG5wdHM7CisgICAgaW50IHhtaW4sIHhtYXgsIHltaW4sIHltYXg7CisgICAgdWNoYXIqIHB0ciA9IGltZy0+ZGF0YS5wdHI7CisgICAgQ3ZTaXplIHNpemUgPSBjdkdldE1hdFNpemUoIGltZyApOworICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRShpbWctPnR5cGUpOworICAgIEN2UG9pbnQgcDA7CisgICAgaW50IGRlbHRhMSwgZGVsdGEyOworCisgICAgaWYoIGxpbmVfdHlwZSA8IENWX0FBICkKKyAgICAgICAgZGVsdGExID0gZGVsdGEyID0gWFlfT05FID4+IDE7CisgICAgICAgIC8vZGVsdGExID0gMCwgZGVsdGEyID0gWFlfT05FIC0gMTsKKyAgICBlbHNlCisgICAgICAgIGRlbHRhMSA9IFhZX09ORSAtIDEsIGRlbHRhMiA9IDA7CisKKyAgICBwMCA9IHZbbnB0cyAtIDFdOworICAgIHAwLnggPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisgICAgcDAueSA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKworICAgIGFzc2VydCggMCA8PSBzaGlmdCAmJiBzaGlmdCA8PSBYWV9TSElGVCApOworICAgIHhtaW4gPSB4bWF4ID0gdlswXS54OworICAgIHltaW4gPSB5bWF4ID0gdlswXS55OworCisgICAgZm9yKCBpID0gMDsgaSA8IG5wdHM7IGkrKyApCisgICAgeworICAgICAgICBDdlBvaW50IHAgPSB2W2ldOworICAgICAgICBpZiggcC55IDwgeW1pbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHltaW4gPSBwLnk7CisgICAgICAgICAgICBpbWluID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIHltYXggPSBNQVgoIHltYXgsIHAueSApOworICAgICAgICB4bWF4ID0gTUFYKCB4bWF4LCBwLnggKTsKKyAgICAgICAgeG1pbiA9IE1JTiggeG1pbiwgcC54ICk7CisKKyAgICAgICAgcC54IDw8PSBYWV9TSElGVCAtIHNoaWZ0OworICAgICAgICBwLnkgPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisKKyAgICAgICAgaWYoIGxpbmVfdHlwZSA8PSA4ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHNoaWZ0ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2UG9pbnQgcHQwLCBwdDE7CisgICAgICAgICAgICAgICAgcHQwLnggPSBwMC54ID4+IFhZX1NISUZUOworICAgICAgICAgICAgICAgIHB0MC55ID0gcDAueSA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgICAgICBwdDEueCA9IHAueCA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgICAgICBwdDEueSA9IHAueSA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgICAgICBpY3ZMaW5lKCBpbWcsIHB0MCwgcHQxLCBjb2xvciwgbGluZV90eXBlICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWN2TGluZTIoIGltZywgcDAsIHAsIGNvbG9yICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWN2TGluZUFBKCBpbWcsIHAwLCBwLCBjb2xvciApOworICAgICAgICBwMCA9IHA7CisgICAgfQorCisgICAgeG1pbiA9ICh4bWluICsgZGVsdGEpID4+IHNoaWZ0OworICAgIHhtYXggPSAoeG1heCArIGRlbHRhKSA+PiBzaGlmdDsKKyAgICB5bWluID0gKHltaW4gKyBkZWx0YSkgPj4gc2hpZnQ7CisgICAgeW1heCA9ICh5bWF4ICsgZGVsdGEpID4+IHNoaWZ0OworCisgICAgaWYoIG5wdHMgPCAzIHx8IHhtYXggPCAwIHx8IHltYXggPCAwIHx8IHhtaW4gPj0gc2l6ZS53aWR0aCB8fCB5bWluID49IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgcmV0dXJuOworCisgICAgeW1heCA9IE1JTiggeW1heCwgc2l6ZS5oZWlnaHQgLSAxICk7CisgICAgZWRnZVswXS5pZHggPSBlZGdlWzFdLmlkeCA9IGltaW47CisKKyAgICBlZGdlWzBdLnllID0gZWRnZVsxXS55ZSA9IHkgPSB5bWluOworICAgIGVkZ2VbMF0uZGkgPSAxOworICAgIGVkZ2VbMV0uZGkgPSBucHRzIC0gMTsKKworICAgIHB0ciArPSBpbWctPnN0ZXAqeTsKKworICAgIGRvCisgICAgeworICAgICAgICBpZiggbGluZV90eXBlIDwgQ1ZfQUEgfHwgeSA8IHltYXggfHwgeSA9PSB5bWluICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHkgPj0gZWRnZVtpXS55ZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gZWRnZVtpXS5pZHgsIGRpID0gZWRnZVtpXS5kaTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhzID0gMCwgeGUsIHllLCB0eSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKDs7KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB0eSA9ICh2W2lkeF0ueSArIGRlbHRhKSA+PiBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB0eSA+IHkgfHwgZWRnZXMgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB4cyA9IHZbaWR4XS54OworICAgICAgICAgICAgICAgICAgICAgICAgaWR4ICs9IGRpOworICAgICAgICAgICAgICAgICAgICAgICAgaWR4IC09ICgoaWR4IDwgbnB0cykgLSAxKSAmIG5wdHM7ICAgLyogaWR4IC09IGlkeCA+PSBucHRzID8gbnB0cyA6IDAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VzLS07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB5ZSA9IHR5OworICAgICAgICAgICAgICAgICAgICB4cyA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgeGUgPSB2W2lkeF0ueCA8PCAoWFlfU0hJRlQgLSBzaGlmdCk7CisKKyAgICAgICAgICAgICAgICAgICAgLyogbm8gbW9yZSBlZGdlcyAqLworICAgICAgICAgICAgICAgICAgICBpZiggeSA+PSB5ZSApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgICAgICAgICAgZWRnZVtpXS55ZSA9IHllOworICAgICAgICAgICAgICAgICAgICBlZGdlW2ldLmR4ID0gKCh4ZSAtIHhzKSoyICsgKHllIC0geSkpIC8gKDIgKiAoeWUgLSB5KSk7CisgICAgICAgICAgICAgICAgICAgIGVkZ2VbaV0ueCA9IHhzOworICAgICAgICAgICAgICAgICAgICBlZGdlW2ldLmlkeCA9IGlkeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggZWRnZVtsZWZ0XS54ID4gZWRnZVtyaWdodF0ueCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlZnQgXj0gMTsKKyAgICAgICAgICAgIHJpZ2h0IF49IDE7CisgICAgICAgIH0KKworICAgICAgICB4MSA9IGVkZ2VbbGVmdF0ueDsKKyAgICAgICAgeDIgPSBlZGdlW3JpZ2h0XS54OworCisgICAgICAgIGlmKCB5ID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeHgxID0gKHgxICsgZGVsdGExKSA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgIGludCB4eDIgPSAoeDIgKyBkZWx0YTIpID4+IFhZX1NISUZUOworCisgICAgICAgICAgICBpZiggeHgyID49IDAgJiYgeHgxIDwgc2l6ZS53aWR0aCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHh4MSA8IDAgKQorICAgICAgICAgICAgICAgICAgICB4eDEgPSAwOworICAgICAgICAgICAgICAgIGlmKCB4eDIgPj0gc2l6ZS53aWR0aCApCisgICAgICAgICAgICAgICAgICAgIHh4MiA9IHNpemUud2lkdGggLSAxOworICAgICAgICAgICAgICAgIElDVl9ITElORSggcHRyLCB4eDEsIHh4MiwgY29sb3IsIHBpeF9zaXplICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB4MSArPSBlZGdlW2xlZnRdLmR4OworICAgICAgICB4MiArPSBlZGdlW3JpZ2h0XS5keDsKKworICAgICAgICBlZGdlW2xlZnRdLnggPSB4MTsKKyAgICAgICAgZWRnZVtyaWdodF0ueCA9IHgyOworICAgICAgICBwdHIgKz0gaW1nLT5zdGVwOworICAgIH0KKyAgICB3aGlsZSggKyt5IDw9IHltYXggKTsKK30KKworCisvKioqKioqKiogQXJiaXRyYXJ5IHBvbHlnb24gKioqKioqKioqKi8KKworc3RhdGljIHZvaWQKK2ljdkNvbGxlY3RQb2x5RWRnZXMoIEN2TWF0KiBpbWcsIEN2U2VxKiB2LCBDdkNvbnRvdXIqIGVkZ2VzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogY29sb3IsIGludCBsaW5lX3R5cGUsIGludCBzaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQgb2Zmc2V0ICkKK3sKKyAgICBpbnQgIGksIGNvdW50ID0gdi0+dG90YWw7CisgICAgQ3ZSZWN0IGJvdW5kcyA9IGVkZ2VzLT5yZWN0OworICAgIGludCBkZWx0YSA9IG9mZnNldC55ICsgKHNoaWZ0ID8gMSA8PCAoc2hpZnQgLSAxKSA6IDApOworICAgIGludCBlbGVtX3R5cGUgPSBDVl9NQVRfVFlQRSh2LT5mbGFncyk7CisKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyOworCisgICAgY3ZTdGFydFJlYWRTZXEoIHYsICZyZWFkZXIgKTsKKyAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIChDdlNlcSopZWRnZXMsICZ3cml0ZXIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2UG9pbnQgcHQwLCBwdDEsIHQwLCB0MTsKKyAgICAgICAgQ3ZQb2x5RWRnZSBlZGdlOworICAgICAgICBDVl9SRUFEX0VER0UoIHB0MCwgcHQxLCByZWFkZXIgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBlbGVtX3R5cGUgPT0gQ1ZfMzJTQzIgKQorICAgICAgICB7CisgICAgICAgICAgICBwdDAueCA9IChwdDAueCArIG9mZnNldC54KSA8PCAoWFlfU0hJRlQgLSBzaGlmdCk7CisgICAgICAgICAgICBwdDAueSA9IChwdDAueSArIGRlbHRhKSA+PiBzaGlmdDsKKyAgICAgICAgICAgIHB0MS54ID0gKHB0MS54ICsgb2Zmc2V0LngpIDw8IChYWV9TSElGVCAtIHNoaWZ0KTsKKyAgICAgICAgICAgIHB0MS55ID0gKHB0MS55ICsgZGVsdGEpID4+IHNoaWZ0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3YzMnN1ZiB4LCB5OworICAgICAgICAgICAgYXNzZXJ0KCBzaGlmdCA9PSAwICk7CisKKyAgICAgICAgICAgIHguaSA9IHB0MC54OyB5LmkgPSBwdDAueTsKKyAgICAgICAgICAgIHB0MC54ID0gY3ZSb3VuZCgoeC5mICsgb2Zmc2V0LngpICogWFlfT05FKTsKKyAgICAgICAgICAgIHB0MC55ID0gY3ZSb3VuZCh5LmYgKyBvZmZzZXQueSk7CisgICAgICAgICAgICB4LmkgPSBwdDEueDsgeS5pID0gcHQxLnk7CisgICAgICAgICAgICBwdDEueCA9IGN2Um91bmQoKHguZiArIG9mZnNldC54KSAqIFhZX09ORSk7CisgICAgICAgICAgICBwdDEueSA9IGN2Um91bmQoeS5mICsgb2Zmc2V0LnkpOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGxpbmVfdHlwZSA8IENWX0FBICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAueSA9IHB0MC55OyB0MS55ID0gcHQxLnk7CisgICAgICAgICAgICB0MC54ID0gKHB0MC54ICsgKFhZX09ORSA+PiAxKSkgPj4gWFlfU0hJRlQ7CisgICAgICAgICAgICB0MS54ID0gKHB0MS54ICsgKFhZX09ORSA+PiAxKSkgPj4gWFlfU0hJRlQ7CisgICAgICAgICAgICBpY3ZMaW5lKCBpbWcsIHQwLCB0MSwgY29sb3IsIGxpbmVfdHlwZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdDAueCA9IHB0MC54OyB0MS54ID0gcHQxLng7CisgICAgICAgICAgICB0MC55ID0gcHQwLnkgPDwgWFlfU0hJRlQ7CisgICAgICAgICAgICB0MS55ID0gcHQxLnkgPDwgWFlfU0hJRlQ7CisgICAgICAgICAgICBpY3ZMaW5lQUEoIGltZywgdDAsIHQxLCBjb2xvciApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHB0MC55ID09IHB0MS55ICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmKCBwdDAueSA+IHB0MS55ICkKKyAgICAgICAgICAgIENWX1NXQVAoIHB0MCwgcHQxLCB0MCApOworCisgICAgICAgIGJvdW5kcy55ID0gTUlOKCBib3VuZHMueSwgcHQwLnkgKTsKKyAgICAgICAgYm91bmRzLmhlaWdodCA9IE1BWCggYm91bmRzLmhlaWdodCwgcHQxLnkgKTsKKworICAgICAgICBpZiggcHQwLnggPCBwdDEueCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvdW5kcy54ID0gTUlOKCBib3VuZHMueCwgcHQwLnggKTsKKyAgICAgICAgICAgIGJvdW5kcy53aWR0aCA9IE1BWCggYm91bmRzLndpZHRoLCBwdDEueCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYm91bmRzLnggPSBNSU4oIGJvdW5kcy54LCBwdDEueCApOworICAgICAgICAgICAgYm91bmRzLndpZHRoID0gTUFYKCBib3VuZHMud2lkdGgsIHB0MC54ICk7CisgICAgICAgIH0KKworICAgICAgICBlZGdlLnkwID0gcHQwLnk7CisgICAgICAgIGVkZ2UueTEgPSBwdDEueTsKKyAgICAgICAgZWRnZS54ID0gcHQwLng7CisgICAgICAgIGVkZ2UuZHggPSAocHQxLnggLSBwdDAueCkgLyAocHQxLnkgLSBwdDAueSk7CisgICAgICAgIGFzc2VydCggZWRnZS55MCA8IGVkZ2UueTEgKTsKKworICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggZWRnZSwgd3JpdGVyICk7CisgICAgfQorCisgICAgZWRnZXMtPnJlY3QgPSBib3VuZHM7CisgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworfQorCitzdGF0aWMgaW50CitpY3ZDbXBFZGdlcyggY29uc3Qgdm9pZCogX2UxLCBjb25zdCB2b2lkKiBfZTIsIHZvaWQqIC8qdXNlcmRhdGEqLyApCit7CisgICAgQ3ZQb2x5RWRnZSAqZTEgPSAoQ3ZQb2x5RWRnZSopX2UxLCAqZTIgPSAoQ3ZQb2x5RWRnZSopX2UyOworICAgIHJldHVybiBlMS0+eTAgLSBlMi0+eTAgPyBlMS0+eTAgLSBlMi0+eTAgOgorICAgICAgICAgICBlMS0+eCAtIGUyLT54ID8gZTEtPnggLSBlMi0+eCA6IGUxLT5keCAtIGUyLT5keDsKK30KKworLyoqKioqKioqKioqKioqKiogaGVscGVyIG1hY3JvcyBhbmQgZnVuY3Rpb25zIGZvciBzZXF1ZW5jZS9jb250b3VyIHByb2Nlc3NpbmcgKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpY3ZGaWxsRWRnZUNvbGxlY3Rpb24oIEN2TWF0KiBpbWcsIEN2Q29udG91ciogZWRnZXMsIGNvbnN0IHZvaWQqIGNvbG9yICkKK3sKKyAgICBDdlBvbHlFZGdlIHRtcDsKKyAgICBpbnQgaSwgeSwgdG90YWwgPSBlZGdlcy0+dG90YWw7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKGltZyk7CisgICAgQ3ZQb2x5RWRnZSogZTsKKyAgICBpbnQgeV9tYXggPSBJTlRfTUlOOworICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRShpbWctPnR5cGUpOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIG1lbXNldCggJnRtcCwgMCwgc2l6ZW9mKHRtcCkpOworICAgIAorICAgIC8qIGNoZWNrIHBhcmFtZXRlcnMgKi8KKyAgICBpZiggZWRnZXMtPnRvdGFsIDwgMiB8fCBlZGdlcy0+cmVjdC5oZWlnaHQgPCAwIHx8IGVkZ2VzLT5yZWN0LnkgPj0gc2l6ZS5oZWlnaHQgfHwKKyAgICAgICAgZWRnZXMtPnJlY3Qud2lkdGggPCAwIHx8IGVkZ2VzLT5yZWN0LnggPj0gc2l6ZS53aWR0aCApCisgICAgICAgIEVYSVQ7CisKKyAgICBjdlNlcVNvcnQoIChDdlNlcSopZWRnZXMsIGljdkNtcEVkZ2VzLCAwICk7CisgICAgY3ZTdGFydFJlYWRTZXEoIChDdlNlcSopZWRnZXMsICZyZWFkZXIgKTsKKworI2lmZGVmIF9ERUJVRworICAgIGUgPSAmdG1wOworICAgIHRtcC55MCA9IElOVF9NSU47CisjZW5kaWYKKworICAgIGZvciggaSA9IDA7IGkgPCB0b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2UG9seUVkZ2UqIGUxID0gKEN2UG9seUVkZ2UqKShyZWFkZXIucHRyKTsKKworI2lmZGVmIF9ERUJVRworICAgICAgICBhc3NlcnQoIGUxLT55MCA8IGUxLT55MSAmJiAoaSA9PSAwIHx8IGljdkNtcEVkZ2VzKCBlLCBlMSwgMCApIDw9IDApICk7CisgICAgICAgIGUgPSBlMTsKKyNlbmRpZgorICAgICAgICB5X21heCA9IE1BWCggeV9tYXgsIGUxLT55MSApOworCisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihDdlBvbHlFZGdlKSwgcmVhZGVyICk7CisgICAgfQorCisgICAgLyogc3RhcnQgZHJhd2luZyAqLworICAgIHRtcC55MCA9IElOVF9NQVg7CisgICAgY3ZTZXFQdXNoKCAoQ3ZTZXEqKWVkZ2VzLCAmdG1wICk7CisKKyAgICBpID0gMDsKKyAgICB0bXAubmV4dCA9IDA7CisgICAgY3ZTdGFydFJlYWRTZXEoIChDdlNlcSopZWRnZXMsICZyZWFkZXIgKTsKKyAgICBlID0gKEN2UG9seUVkZ2UqKShyZWFkZXIucHRyKTsKKyAgICB5X21heCA9IE1JTiggeV9tYXgsIHNpemUuaGVpZ2h0ICk7CisKKyAgICBmb3IoIHkgPSBlLT55MDsgeSA8IHlfbWF4OyB5KysgKQorICAgIHsKKyAgICAgICAgQ3ZQb2x5RWRnZSAqbGFzdCwgKnByZWxhc3QsICprZWVwX3ByZWxhc3Q7CisgICAgICAgIGludCBzb3J0X2ZsYWcgPSAwOworICAgICAgICBpbnQgZHJhdyA9IDA7CisgICAgICAgIGludCBjbGlwbGluZSA9IHkgPCAwOworCisgICAgICAgIHByZWxhc3QgPSAmdG1wOworICAgICAgICBsYXN0ID0gdG1wLm5leHQ7CisgICAgICAgIHdoaWxlKCBsYXN0IHx8IGUtPnkwID09IHkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbGFzdCAmJiBsYXN0LT55MSA9PSB5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBleGx1ZGUgZWRnZSBpZiB5IHJlYWNocyBpdHMgbG93ZXIgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICBwcmVsYXN0LT5uZXh0ID0gbGFzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtlZXBfcHJlbGFzdCA9IHByZWxhc3Q7CisgICAgICAgICAgICBpZiggbGFzdCAmJiAoZS0+eTAgPiB5IHx8IGxhc3QtPnggPCBlLT54KSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogZ28gdG8gdGhlIG5leHQgZWRnZSBpbiBhY3RpdmUgbGlzdCAqLworICAgICAgICAgICAgICAgIHByZWxhc3QgPSBsYXN0OworICAgICAgICAgICAgICAgIGxhc3QgPSBsYXN0LT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggaSA8IHRvdGFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBpbnNlcnQgbmV3IGVkZ2UgaW50byBhY3RpdmUgbGlzdCBpZiB5IHJlYWNocyBpdHMgdXBwZXIgcG9pbnQgKi8KKyAgICAgICAgICAgICAgICBwcmVsYXN0LT5uZXh0ID0gZTsKKyAgICAgICAgICAgICAgICBlLT5uZXh0ID0gbGFzdDsKKyAgICAgICAgICAgICAgICBwcmVsYXN0ID0gZTsKKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlZGdlcy0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICBlID0gKEN2UG9seUVkZ2UqKShyZWFkZXIucHRyKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGlmKCBkcmF3ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIWNsaXBsaW5lICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNvbnZlcnQgeCdzIGZyb20gZml4ZWQtcG9pbnQgdG8gaW1hZ2UgY29vcmRpbmF0ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgdWNoYXIgKnRpbWcgPSAodWNoYXIqKShpbWctPmRhdGEucHRyKSArIHkgKiBpbWctPnN0ZXA7CisgICAgICAgICAgICAgICAgICAgIGludCB4MSA9IGtlZXBfcHJlbGFzdC0+eDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHgyID0gcHJlbGFzdC0+eDsKKworICAgICAgICAgICAgICAgICAgICBpZiggeDEgPiB4MiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ID0geDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geDI7CisgICAgICAgICAgICAgICAgICAgICAgICB4MiA9IHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB4MSA9ICh4MSArIFhZX09ORSAtIDEpID4+IFhZX1NISUZUOworICAgICAgICAgICAgICAgICAgICB4MiA9IHgyID4+IFhZX1NISUZUOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNsaXAgYW5kIGRyYXcgdGhlIGxpbmUgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYoIHgxIDwgc2l6ZS53aWR0aCAmJiB4MiA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHgxIDwgMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDEgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHgyID49IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gc2l6ZS53aWR0aCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfSExJTkUoIHRpbWcsIHgxLCB4MiwgY29sb3IsIHBpeF9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAga2VlcF9wcmVsYXN0LT54ICs9IGtlZXBfcHJlbGFzdC0+ZHg7CisgICAgICAgICAgICAgICAgcHJlbGFzdC0+eCArPSBwcmVsYXN0LT5keDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRyYXcgXj0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNvcnQgZWRnZXMgKGJ1YmJsZSBzb3J0IG9uIGxpc3QpICovCisgICAgICAgIGtlZXBfcHJlbGFzdCA9IDA7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgcHJlbGFzdCA9ICZ0bXA7CisgICAgICAgICAgICBsYXN0ID0gdG1wLm5leHQ7CisKKyAgICAgICAgICAgIHdoaWxlKCBsYXN0ICE9IGtlZXBfcHJlbGFzdCAmJiBsYXN0LT5uZXh0ICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2UG9seUVkZ2UgKnRlID0gbGFzdC0+bmV4dDsKKworICAgICAgICAgICAgICAgIC8qIHN3YXAgZWRnZXMgKi8KKyAgICAgICAgICAgICAgICBpZiggbGFzdC0+eCA+IHRlLT54ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHByZWxhc3QtPm5leHQgPSB0ZTsKKyAgICAgICAgICAgICAgICAgICAgbGFzdC0+bmV4dCA9IHRlLT5uZXh0OworICAgICAgICAgICAgICAgICAgICB0ZS0+bmV4dCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgIHByZWxhc3QgPSB0ZTsKKyAgICAgICAgICAgICAgICAgICAgc29ydF9mbGFnID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSB0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrZWVwX3ByZWxhc3QgPSBwcmVsYXN0OworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBzb3J0X2ZsYWcgJiYga2VlcF9wcmVsYXN0ICE9IHRtcC5uZXh0ICYmIGtlZXBfcHJlbGFzdCAhPSAmdG1wICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKiBkcmF3cyBzaW1wbGUgb3IgZmlsbGVkIGNpcmNsZSAqLworc3RhdGljIHZvaWQKK2ljdkNpcmNsZSggQ3ZNYXQqIGltZywgQ3ZQb2ludCBjZW50ZXIsIGludCByYWRpdXMsIGNvbnN0IHZvaWQqIGNvbG9yLCBpbnQgZmlsbCApCit7CisgICAgQ3ZTaXplIHNpemUgPSBjdkdldE1hdFNpemUoIGltZyApOworICAgIGludCBzdGVwID0gaW1nLT5zdGVwOworICAgIGludCBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRShpbWctPnR5cGUpOworICAgIHVjaGFyKiBwdHIgPSAodWNoYXIqKShpbWctPmRhdGEucHRyKTsKKyAgICBpbnQgZXJyID0gMCwgZHggPSByYWRpdXMsIGR5ID0gMCwgcGx1cyA9IDEsIG1pbnVzID0gKHJhZGl1cyA8PCAxKSAtIDE7CisgICAgaW50IGluc2lkZSA9IGNlbnRlci54ID49IHJhZGl1cyAmJiBjZW50ZXIueCA8IHNpemUud2lkdGggLSByYWRpdXMgJiYKKyAgICAgICAgY2VudGVyLnkgPj0gcmFkaXVzICYmIGNlbnRlci55IDwgc2l6ZS5oZWlnaHQgLSByYWRpdXM7CisKKyAgICAjZGVmaW5lIElDVl9QVVRfUE9JTlQoIHB0ciwgeCApICAgICBcCisgICAgICAgIENWX01FTUNQWV9DSEFSKCBwdHIgKyAoeCkqcGl4X3NpemUsIGNvbG9yLCBwaXhfc2l6ZSApOworCisgICAgd2hpbGUoIGR4ID49IGR5ICkKKyAgICB7CisgICAgICAgIGludCBtYXNrOworICAgICAgICBpbnQgeTExID0gY2VudGVyLnkgLSBkeSwgeTEyID0gY2VudGVyLnkgKyBkeSwgeTIxID0gY2VudGVyLnkgLSBkeCwgeTIyID0gY2VudGVyLnkgKyBkeDsKKyAgICAgICAgaW50IHgxMSA9IGNlbnRlci54IC0gZHgsIHgxMiA9IGNlbnRlci54ICsgZHgsIHgyMSA9IGNlbnRlci54IC0gZHksIHgyMiA9IGNlbnRlci54ICsgZHk7CisKKyAgICAgICAgaWYoIGluc2lkZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyICp0cHRyMCA9IHB0ciArIHkxMSAqIHN0ZXA7CisgICAgICAgICAgICB1Y2hhciAqdHB0cjEgPSBwdHIgKyB5MTIgKiBzdGVwOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggIWZpbGwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIwLCB4MTEgKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCB0cHRyMSwgeDExICk7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCggdHB0cjAsIHgxMiApOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIxLCB4MTIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJQ1ZfSExJTkUoIHRwdHIwLCB4MTEsIHgxMiwgY29sb3IsIHBpeF9zaXplICk7CisgICAgICAgICAgICAgICAgSUNWX0hMSU5FKCB0cHRyMSwgeDExLCB4MTIsIGNvbG9yLCBwaXhfc2l6ZSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cHRyMCA9IHB0ciArIHkyMSAqIHN0ZXA7CisgICAgICAgICAgICB0cHRyMSA9IHB0ciArIHkyMiAqIHN0ZXA7CisKKyAgICAgICAgICAgIGlmKCAhZmlsbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCggdHB0cjAsIHgyMSApOworICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIxLCB4MjEgKTsKKyAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCB0cHRyMCwgeDIyICk7CisgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCggdHB0cjEsIHgyMiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElDVl9ITElORSggdHB0cjAsIHgyMSwgeDIyLCBjb2xvciwgcGl4X3NpemUgKTsKKyAgICAgICAgICAgICAgICBJQ1ZfSExJTkUoIHRwdHIxLCB4MjEsIHgyMiwgY29sb3IsIHBpeF9zaXplICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggeDExIDwgc2l6ZS53aWR0aCAmJiB4MTIgPj0gMCAmJiB5MjEgPCBzaXplLmhlaWdodCAmJiB5MjIgPj0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmaWxsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB4MTEgPSBNQVgoIHgxMSwgMCApOworICAgICAgICAgICAgICAgIHgxMiA9IE1JTiggeDEyLCBzaXplLndpZHRoIC0gMSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXkxMSA8ICh1bnNpZ25lZClzaXplLmhlaWdodCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIgKnRwdHIgPSBwdHIgKyB5MTEgKiBzdGVwOworCisgICAgICAgICAgICAgICAgaWYoICFmaWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCB4MTEgPj0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCB0cHRyLCB4MTEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHgxMiA8IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgSUNWX1BVVF9QT0lOVCggdHB0ciwgeDEyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgSUNWX0hMSU5FKCB0cHRyLCB4MTEsIHgxMiwgY29sb3IsIHBpeF9zaXplICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeTEyIDwgKHVuc2lnbmVkKXNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciAqdHB0ciA9IHB0ciArIHkxMiAqIHN0ZXA7CisKKyAgICAgICAgICAgICAgICBpZiggIWZpbGwgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHgxMSA+PSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIsIHgxMSApOworICAgICAgICAgICAgICAgICAgICBpZiggeDEyIDwgc2l6ZS53aWR0aCApCisgICAgICAgICAgICAgICAgICAgICAgICBJQ1ZfUFVUX1BPSU5UKCB0cHRyLCB4MTIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBJQ1ZfSExJTkUoIHRwdHIsIHgxMSwgeDEyLCBjb2xvciwgcGl4X3NpemUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHgyMSA8IHNpemUud2lkdGggJiYgeDIyID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBmaWxsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHgyMSA9IE1BWCggeDIxLCAwICk7CisgICAgICAgICAgICAgICAgICAgIHgyMiA9IE1JTiggeDIyLCBzaXplLndpZHRoIC0gMSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeTIxIDwgKHVuc2lnbmVkKXNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyICp0cHRyID0gcHRyICsgeTIxICogc3RlcDsKKworICAgICAgICAgICAgICAgICAgICBpZiggIWZpbGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggeDIxID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIsIHgyMSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHgyMiA8IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIsIHgyMiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIElDVl9ITElORSggdHB0ciwgeDIxLCB4MjIsIGNvbG9yLCBwaXhfc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpeTIyIDwgKHVuc2lnbmVkKXNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyICp0cHRyID0gcHRyICsgeTIyICogc3RlcDsKKworICAgICAgICAgICAgICAgICAgICBpZiggIWZpbGwgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggeDIxID49IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIsIHgyMSApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHgyMiA8IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDVl9QVVRfUE9JTlQoIHRwdHIsIHgyMiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIElDVl9ITElORSggdHB0ciwgeDIxLCB4MjIsIGNvbG9yLCBwaXhfc2l6ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBkeSsrOworICAgICAgICBlcnIgKz0gcGx1czsKKyAgICAgICAgcGx1cyArPSAyOworCisgICAgICAgIG1hc2sgPSAoZXJyIDw9IDApIC0gMTsKKworICAgICAgICBlcnIgLT0gbWludXMgJiBtYXNrOworICAgICAgICBkeCArPSBtYXNrOworICAgICAgICBtaW51cyAtPSBtYXNrICYgMjsKKyAgICB9CisKKyAgICAjdW5kZWYgIElDVl9QVVRfUE9JTlQKK30KKworCitzdGF0aWMgdm9pZAoraWN2VGhpY2tMaW5lKCBDdk1hdCogaW1nLCBDdlBvaW50IHAwLCBDdlBvaW50IHAxLCBjb25zdCB2b2lkKiBjb2xvciwKKyAgICAgICAgICAgICAgaW50IHRoaWNrbmVzcywgaW50IGxpbmVfdHlwZSwgaW50IGZsYWdzLCBpbnQgc2hpZnQgKQoreworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgSU5WX1hZX09ORSA9IDEuL1hZX09ORTsKKworICAgIHAwLnggPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisgICAgcDAueSA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICBwMS54IDw8PSBYWV9TSElGVCAtIHNoaWZ0OworICAgIHAxLnkgPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisKKyAgICBpZiggdGhpY2tuZXNzIDw9IDEgKQorICAgIHsKKyAgICAgICAgaWYoIGxpbmVfdHlwZSA8IENWX0FBICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGxpbmVfdHlwZSA9PSAxIHx8IGxpbmVfdHlwZSA9PSA0IHx8IHNoaWZ0ID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHAwLnggPSAocDAueCArIChYWV9PTkU+PjEpKSA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgICAgICBwMC55ID0gKHAwLnkgKyAoWFlfT05FPj4xKSkgPj4gWFlfU0hJRlQ7CisgICAgICAgICAgICAgICAgcDEueCA9IChwMS54ICsgKFhZX09ORT4+MSkpID4+IFhZX1NISUZUOworICAgICAgICAgICAgICAgIHAxLnkgPSAocDEueSArIChYWV9PTkU+PjEpKSA+PiBYWV9TSElGVDsKKyAgICAgICAgICAgICAgICBpY3ZMaW5lKCBpbWcsIHAwLCBwMSwgY29sb3IsIGxpbmVfdHlwZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGljdkxpbmUyKCBpbWcsIHAwLCBwMSwgY29sb3IgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBpY3ZMaW5lQUEoIGltZywgcDAsIHAxLCBjb2xvciApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlBvaW50IHB0WzRdLCBkcCA9IHswLDB9OworICAgICAgICBkb3VibGUgZHggPSAocDAueCAtIHAxLngpKklOVl9YWV9PTkUsIGR5ID0gKHAxLnkgLSBwMC55KSpJTlZfWFlfT05FOworICAgICAgICBkb3VibGUgciA9IGR4ICogZHggKyBkeSAqIGR5OworICAgICAgICBpbnQgaTsKKyAgICAgICAgdGhpY2tuZXNzIDw8PSBYWV9TSElGVCAtIDE7CisKKyAgICAgICAgaWYoIGZhYnMocikgPiBEQkxfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHIgPSB0aGlja25lc3MgKiBjdkludlNxcnQoIChmbG9hdCkgciApOworICAgICAgICAgICAgZHAueCA9IGN2Um91bmQoIGR5ICogciApOworICAgICAgICAgICAgZHAueSA9IGN2Um91bmQoIGR4ICogciApOworICAgICAgICB9CisKKyAgICAgICAgcHRbMF0ueCA9IHAwLnggKyBkcC54OworICAgICAgICBwdFswXS55ID0gcDAueSArIGRwLnk7CisgICAgICAgIHB0WzFdLnggPSBwMC54IC0gZHAueDsKKyAgICAgICAgcHRbMV0ueSA9IHAwLnkgLSBkcC55OworICAgICAgICBwdFsyXS54ID0gcDEueCAtIGRwLng7CisgICAgICAgIHB0WzJdLnkgPSBwMS55IC0gZHAueTsKKyAgICAgICAgcHRbM10ueCA9IHAxLnggKyBkcC54OworICAgICAgICBwdFszXS55ID0gcDEueSArIGRwLnk7CisKKyAgICAgICAgaWN2RmlsbENvbnZleFBvbHkoIGltZywgcHQsIDQsIGNvbG9yLCBsaW5lX3R5cGUsIFhZX1NISUZUICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmbGFncyAmIChpKzEpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggbGluZV90eXBlIDwgQ1ZfQUEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZQb2ludCBjZW50ZXI7CisgICAgICAgICAgICAgICAgICAgIGNlbnRlci54ID0gKHAwLnggKyAoWFlfT05FPj4xKSkgPj4gWFlfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIGNlbnRlci55ID0gKHAwLnkgKyAoWFlfT05FPj4xKSkgPj4gWFlfU0hJRlQ7CisgICAgICAgICAgICAgICAgICAgIGljdkNpcmNsZSggaW1nLCBjZW50ZXIsIHRoaWNrbmVzcyA+PiBYWV9TSElGVCwgY29sb3IsIDEgKTsgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGljdkVsbGlwc2VFeCggaW1nLCBwMCwgY3ZTaXplKHRoaWNrbmVzcywgdGhpY2tuZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAzNjAsIGNvbG9yLCAtMSwgbGluZV90eXBlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcDAgPSBwMTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2UG9seUxpbmUoIEN2TWF0KiBpbWcsIEN2UG9pbnQgKnYsIGludCBjb3VudCwgaW50IGlzX2Nsb3NlZCwKKyAgICAgICAgICAgICBjb25zdCB2b2lkKiBjb2xvciwgaW50IHRoaWNrbmVzcywKKyAgICAgICAgICAgICBpbnQgbGluZV90eXBlLCBpbnQgc2hpZnQgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZQb2x5TGluZSIpOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGlmKCBjb3VudCA+IDAgKQorICAgIHsKKyAgICAgICAgaW50IGkgPSBpc19jbG9zZWQgPyBjb3VudCAtIDEgOiAwOworICAgICAgICBpbnQgZmxhZ3MgPSAyICsgIWlzX2Nsb3NlZDsKKyAgICAgICAgQ3ZQb2ludCBwMDsKKyAgICAgICAgYXNzZXJ0KCAwIDw9IHNoaWZ0ICYmIHNoaWZ0IDw9IFhZX1NISUZUICk7CisgICAgICAgIGFzc2VydCggaW1nICYmIHRoaWNrbmVzcyA+PSAwICk7IAorICAgICAgICBhc3NlcnQoIHYgJiYgY291bnQgPj0gMCApOworCisgICAgICAgIGlmKCAhdiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgICAgICBwMCA9IHZbaV07CisgICAgICAgIGZvciggaSA9ICFpc19jbG9zZWQ7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQb2ludCBwID0gdltpXTsKKyAgICAgICAgICAgIGljdlRoaWNrTGluZSggaW1nLCBwMCwgcCwgY29sb3IsIHRoaWNrbmVzcywgbGluZV90eXBlLCBmbGFncywgc2hpZnQgKTsKKyAgICAgICAgICAgIHAwID0gcDsKKyAgICAgICAgICAgIGZsYWdzID0gMjsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVybmFsIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCBDdlNjYWxhciBjdkNvbG9yVG9TY2FsYXIoIGRvdWJsZSBwYWNrZWRfY29sb3IsIGludCB0eXBlICkKK3sKKyAgICBDdlNjYWxhciBzY2FsYXI7CisgICAgCisgICAgaWYoIENWX01BVF9ERVBUSCggdHlwZSApID09IENWXzhVICkKKyAgICB7CisgICAgICAgIGludCBpY29sb3IgPSBjdlJvdW5kKCBwYWNrZWRfY29sb3IgKTsKKyAgICAgICAgaWYoIENWX01BVF9DTiggdHlwZSApID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMF0gPSBpY29sb3IgJiAyNTU7CisgICAgICAgICAgICBzY2FsYXIudmFsWzFdID0gKGljb2xvciA+PiA4KSAmIDI1NTsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMl0gPSAoaWNvbG9yID4+IDE2KSAmIDI1NTsKKyAgICAgICAgICAgIHNjYWxhci52YWxbM10gPSAoaWNvbG9yID4+IDI0KSAmIDI1NTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMF0gPSBDVl9DQVNUXzhVKCBpY29sb3IgKTsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMV0gPSBzY2FsYXIudmFsWzJdID0gc2NhbGFyLnZhbFszXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKCB0eXBlICkgPT0gQ1ZfOFMgKQorICAgIHsKKyAgICAgICAgaW50IGljb2xvciA9IGN2Um91bmQoIHBhY2tlZF9jb2xvciApOworICAgICAgICBpZiggQ1ZfTUFUX0NOKCB0eXBlICkgPiAxICkKKyAgICAgICAgeworICAgICAgICAgICAgc2NhbGFyLnZhbFswXSA9IChjaGFyKWljb2xvcjsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMV0gPSAoY2hhcikoaWNvbG9yID4+IDgpOworICAgICAgICAgICAgc2NhbGFyLnZhbFsyXSA9IChjaGFyKShpY29sb3IgPj4gMTYpOworICAgICAgICAgICAgc2NhbGFyLnZhbFszXSA9IChjaGFyKShpY29sb3IgPj4gMjQpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc2NhbGFyLnZhbFswXSA9IENWX0NBU1RfOFMoIGljb2xvciApOworICAgICAgICAgICAgc2NhbGFyLnZhbFsxXSA9IHNjYWxhci52YWxbMl0gPSBzY2FsYXIudmFsWzNdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgY24gPSBDVl9NQVRfQ04oIHR5cGUgKTsKKyAgICAgICAgc3dpdGNoKCBjbiApCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgc2NhbGFyLnZhbFswXSA9IHBhY2tlZF9jb2xvcjsKKyAgICAgICAgICAgIHNjYWxhci52YWxbMV0gPSBzY2FsYXIudmFsWzJdID0gc2NhbGFyLnZhbFszXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgc2NhbGFyLnZhbFswXSA9IHNjYWxhci52YWxbMV0gPSBwYWNrZWRfY29sb3I7CisgICAgICAgICAgICBzY2FsYXIudmFsWzJdID0gc2NhbGFyLnZhbFszXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgc2NhbGFyLnZhbFswXSA9IHNjYWxhci52YWxbMV0gPSBzY2FsYXIudmFsWzJdID0gcGFja2VkX2NvbG9yOworICAgICAgICAgICAgc2NhbGFyLnZhbFszXSA9IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNjYWxhci52YWxbMF0gPSBzY2FsYXIudmFsWzFdID0KKyAgICAgICAgICAgICAgICBzY2FsYXIudmFsWzJdID0gc2NhbGFyLnZhbFszXSA9IHBhY2tlZF9jb2xvcjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNjYWxhcjsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2TGluZSggdm9pZCogaW1nLCBDdlBvaW50IHB0MSwgQ3ZQb2ludCBwdDIsIEN2U2NhbGFyIGNvbG9yLAorICAgICAgICBpbnQgdGhpY2tuZXNzLCBpbnQgbGluZV90eXBlLCBpbnQgc2hpZnQgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZMaW5lIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGNvaSA9IDA7CisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopaW1nOworICAgIGRvdWJsZSBidWZbNF07CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggaW1nLCAmc3R1YiwgJmNvaSApKTsKKworICAgIGlmKCBsaW5lX3R5cGUgPT0gQ1ZfQUEgJiYgQ1ZfTUFUX0RFUFRIKG1hdC0+dHlwZSkgIT0gQ1ZfOFUgKQorICAgICAgICBsaW5lX3R5cGUgPSA4OworCisgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgaWYoICh1bnNpZ25lZCl0aGlja25lc3MgPiAyNTUgICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBpZiggc2hpZnQgPCAwIHx8IFhZX1NISUZUIDwgc2hpZnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInNoaWZ0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNiIgKTsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmY29sb3IsIGJ1ZiwgbWF0LT50eXBlLCAwICkpOworICAgIGljdlRoaWNrTGluZSggbWF0LCBwdDEsIHB0MiwgYnVmLCB0aGlja25lc3MsIGxpbmVfdHlwZSwgMywgc2hpZnQgKTsgCisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWN0YW5nbGUoIHZvaWQqIGltZywgQ3ZQb2ludCBwdDEsIEN2UG9pbnQgcHQyLAorICAgICAgICAgICAgIEN2U2NhbGFyIGNvbG9yLCBpbnQgdGhpY2tuZXNzLAorICAgICAgICAgICAgIGludCBsaW5lX3R5cGUsIGludCBzaGlmdCApCit7CisgICAgQ3ZQb2ludCBwdFs0XTsKKworICAgIENWX0ZVTkNOQU1FKCJjdlJlY3RhbmdsZSIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGNvaSA9IDA7CisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopaW1nOworICAgIGRvdWJsZSBidWZbNF07CisKKyAgICBpZiggdGhpY2tuZXNzID4gMjU1ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggaW1nLCAmc3R1YiwgJmNvaSApKTsKKworICAgIGlmKCBsaW5lX3R5cGUgPT0gQ1ZfQUEgJiYgQ1ZfTUFUX0RFUFRIKG1hdC0+dHlwZSkgIT0gQ1ZfOFUgKQorICAgICAgICBsaW5lX3R5cGUgPSA4OworCisgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgaWYoIHNoaWZ0IDwgMCB8fCBYWV9TSElGVCA8IHNoaWZ0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzaGlmdCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTYiICk7CisKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmNvbG9yLCBidWYsIG1hdC0+dHlwZSwgMCApKTsKKworICAgIHB0WzBdID0gcHQxOworICAgIHB0WzFdLnggPSBwdDIueDsKKyAgICBwdFsxXS55ID0gcHQxLnk7CisgICAgcHRbMl0gPSBwdDI7CisgICAgcHRbM10ueCA9IHB0MS54OworICAgIHB0WzNdLnkgPSBwdDIueTsKKworICAgIGlmKCB0aGlja25lc3MgPj0gMCApCisgICAgICAgIGljdlBvbHlMaW5lKCBtYXQsIHB0LCA0LCAxLCBidWYsIHRoaWNrbmVzcywgbGluZV90eXBlLCBzaGlmdCApOworICAgIGVsc2UKKyAgICAgICAgaWN2RmlsbENvbnZleFBvbHkoIG1hdCwgcHQsIDQsIGJ1ZiwgbGluZV90eXBlLCBzaGlmdCApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q2lyY2xlKCB2b2lkICppbWcsIEN2UG9pbnQgY2VudGVyLCBpbnQgcmFkaXVzLAorICAgICAgICAgIEN2U2NhbGFyIGNvbG9yLCBpbnQgdGhpY2tuZXNzLCBpbnQgbGluZV90eXBlLCBpbnQgc2hpZnQgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDaXJjbGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMDsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgaWYoIGxpbmVfdHlwZSA9PSBDVl9BQSAmJiBDVl9NQVRfREVQVEgobWF0LT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIGxpbmVfdHlwZSA9IDg7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggcmFkaXVzIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiIiApOworCisgICAgaWYoIHRoaWNrbmVzcyA+IDI1NSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiIiApOworCisgICAgaWYoIHNoaWZ0IDwgMCB8fCBYWV9TSElGVCA8IHNoaWZ0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzaGlmdCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTYiICk7CisKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmNvbG9yLCBidWYsIG1hdC0+dHlwZSwgMCApKTsKKworICAgIGlmKCB0aGlja25lc3MgPiAxIHx8IGxpbmVfdHlwZSA+PSBDVl9BQSApCisgICAgeworICAgICAgICBjZW50ZXIueCA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICAgICAgY2VudGVyLnkgPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisgICAgICAgIHJhZGl1cyA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICAgICAgaWN2RWxsaXBzZUV4KCBtYXQsIGNlbnRlciwgY3ZTaXplKCByYWRpdXMsIHJhZGl1cyApLAorICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDM2MCwgYnVmLCB0aGlja25lc3MsIGxpbmVfdHlwZSApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpY3ZDaXJjbGUoIG1hdCwgY2VudGVyLCByYWRpdXMsIGJ1ZiwgdGhpY2tuZXNzIDwgMCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkVsbGlwc2UoIHZvaWQgKmltZywgQ3ZQb2ludCBjZW50ZXIsIEN2U2l6ZSBheGVzLAorICAgICAgICAgICBkb3VibGUgYW5nbGUsIGRvdWJsZSBzdGFydF9hbmdsZSwgZG91YmxlIGVuZF9hbmdsZSwKKyAgICAgICAgICAgQ3ZTY2FsYXIgY29sb3IsIGludCB0aGlja25lc3MsIGludCBsaW5lX3R5cGUsIGludCBzaGlmdCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdkVsbGlwc2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMDsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgaWYoIGxpbmVfdHlwZSA9PSBDVl9BQSAmJiBDVl9NQVRfREVQVEgobWF0LT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIGxpbmVfdHlwZSA9IDg7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggYXhlcy53aWR0aCA8IDAgfHwgYXhlcy5oZWlnaHQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBpZiggdGhpY2tuZXNzID4gMjU1ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBpZiggc2hpZnQgPCAwIHx8IFhZX1NISUZUIDwgc2hpZnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInNoaWZ0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNiIgKTsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmY29sb3IsIGJ1ZiwgbWF0LT50eXBlLCAwICkpOworCisgICAgeworICAgICAgICBpbnQgX2FuZ2xlID0gY3ZSb3VuZChhbmdsZSk7CisgICAgICAgIGludCBfc3RhcnRfYW5nbGUgPSBjdlJvdW5kKHN0YXJ0X2FuZ2xlKTsKKyAgICAgICAgaW50IF9lbmRfYW5nbGUgPSBjdlJvdW5kKGVuZF9hbmdsZSk7CisgICAgICAgIGNlbnRlci54IDw8PSBYWV9TSElGVCAtIHNoaWZ0OworICAgICAgICBjZW50ZXIueSA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICAgICAgYXhlcy53aWR0aCA8PD0gWFlfU0hJRlQgLSBzaGlmdDsKKyAgICAgICAgYXhlcy5oZWlnaHQgPDw9IFhZX1NISUZUIC0gc2hpZnQ7CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2RWxsaXBzZUV4KCBtYXQsIGNlbnRlciwgYXhlcywgX2FuZ2xlLCBfc3RhcnRfYW5nbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2VuZF9hbmdsZSwgYnVmLCB0aGlja25lc3MsIGxpbmVfdHlwZSApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZGaWxsQ29udmV4UG9seSggdm9pZCAqaW1nLCBDdlBvaW50ICpwdHMsIGludCBucHRzLCBDdlNjYWxhciBjb2xvciwgaW50IGxpbmVfdHlwZSwgaW50IHNoaWZ0ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2RmlsbENvbnZleFBvbHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMDsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgaWYoIGxpbmVfdHlwZSA9PSBDVl9BQSAmJiBDVl9NQVRfREVQVEgobWF0LT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIGxpbmVfdHlwZSA9IDg7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggIXB0cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIG5wdHMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiIiApOworCisgICAgaWYoIHNoaWZ0IDwgMCB8fCBYWV9TSElGVCA8IHNoaWZ0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzaGlmdCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTYiICk7CisKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmNvbG9yLCBidWYsIG1hdC0+dHlwZSwgMCApKTsKKyAgICBpY3ZGaWxsQ29udmV4UG9seSggbWF0LCBwdHMsIG5wdHMsIGJ1ZiwgbGluZV90eXBlLCBzaGlmdCApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2RmlsbFBvbHkoIHZvaWQgKmltZywgQ3ZQb2ludCAqKnB0cywgaW50ICpucHRzLCBpbnQgY29udG91cnMsCisgICAgICAgICAgICBDdlNjYWxhciBjb2xvciwgaW50IGxpbmVfdHlwZSwgaW50IHNoaWZ0ICkKK3sKKyAgICBDdk1lbVN0b3JhZ2UqIHN0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2RmlsbFBvbHkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMDsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgaWYoIGxpbmVfdHlwZSA9PSBDVl9BQSAmJiBDVl9NQVRfREVQVEgobWF0LT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIGxpbmVfdHlwZSA9IDg7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggY29udG91cnMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisKKyAgICBpZiggIXB0cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIG5wdHMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworCisgICAgaWYoIHNoaWZ0IDwgMCB8fCBYWV9TSElGVCA8IHNoaWZ0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJzaGlmdCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMTYiICk7CisKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmNvbG9yLCBidWYsIG1hdC0+dHlwZSwgMCApKTsKKworICAgIHsKKyAgICAgICAgQ3ZDb250b3VyKiBlZGdlcyA9IDA7CisgICAgICAgIEN2U2VxIHZ0eDsKKyAgICAgICAgQ3ZTZXFCbG9jayBibG9jazsKKworICAgICAgICBDVl9DQUxMKCBzdCA9IGN2Q3JlYXRlTWVtU3RvcmFnZSggQ1ZfRFJBV0lOR19TVE9SQUdFX0JMT0NLICkpOworICAgICAgICBDVl9DQUxMKCBlZGdlcyA9IChDdkNvbnRvdXIqKWN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZDb250b3VyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2UG9seUVkZ2UpLCBzdCApKTsKKworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IGNvbnRvdXJzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIXB0c1tpXSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICAgICAgICAgIGlmKCBucHRzW2ldIDwgMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGN2TWFrZVNlcUhlYWRlckZvckFycmF5KCBDVl8zMlNDMiwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2UG9pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0c1tpXSwgbnB0c1tpXSwgJnZ0eCwgJmJsb2NrICk7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGljdkNvbGxlY3RQb2x5RWRnZXMoIG1hdCwgJnZ0eCwgZWRnZXMsIGJ1ZiwgbGluZV90eXBlLCBzaGlmdCApKTsKKyAgICAgICAgfQorCisgICAgICAgIENWX0NBTEwoIGljdkZpbGxFZGdlQ29sbGVjdGlvbiggbWF0LCBlZGdlcywgYnVmICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmc3QgKTsKK30KKworCisKK0NWX0lNUEwgdm9pZAorY3ZQb2x5TGluZSggdm9pZCAqaW1nLCBDdlBvaW50ICoqcHRzLCBpbnQgKm5wdHMsCisgICAgICAgICAgICBpbnQgY29udG91cnMsIGludCBjbG9zZWQsIEN2U2NhbGFyIGNvbG9yLAorICAgICAgICAgICAgaW50IHRoaWNrbmVzcywgaW50IGxpbmVfdHlwZSwgaW50IHNoaWZ0ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UG9seUxpbmUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMCwgaTsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgaWYoIGxpbmVfdHlwZSA9PSBDVl9BQSAmJiBDVl9NQVRfREVQVEgobWF0LT50eXBlKSAhPSBDVl84VSApCisgICAgICAgIGxpbmVfdHlwZSA9IDg7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggY29udG91cnMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisKKyAgICBpZiggdGhpY2tuZXNzIDwgLTEgfHwgdGhpY2tuZXNzID4gMjU1ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKworICAgIGlmKCAhcHRzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggbnB0cyA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggc2hpZnQgPCAwIHx8IFhZX1NISUZUIDwgc2hpZnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInNoaWZ0IG11c3QgYmUgYmV0d2VlbiAwIGFuZCAxNiIgKTsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmY29sb3IsIGJ1ZiwgbWF0LT50eXBlLCAwICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvbnRvdXJzOyBpKysgKQorICAgICAgICBpY3ZQb2x5TGluZSggbWF0LCBwdHNbaV0sIG5wdHNbaV0sIGNsb3NlZCwgYnVmLCB0aGlja25lc3MsIGxpbmVfdHlwZSwgc2hpZnQgKTsKKworICAgIF9fRU5EX187Cit9CisKKworI2RlZmluZSBDVl9GT05UX1NJWkVfU0hJRlQgICAgIDgKKyNkZWZpbmUgQ1ZfRk9OVF9JVEFMSUNfQUxQSEEgICAoMSA8PCA4KQorI2RlZmluZSBDVl9GT05UX0lUQUxJQ19ESUdJVCAgICgyIDw8IDgpCisjZGVmaW5lIENWX0ZPTlRfSVRBTElDX1BVTkNUICAgKDQgPDwgOCkKKyNkZWZpbmUgQ1ZfRk9OVF9JVEFMSUNfQlJBQ0VTICAoOCA8PCA4KQorI2RlZmluZSBDVl9GT05UX0hBVkVfR1JFRUsgICAgICgxNiA8PCA4KQorI2RlZmluZSBDVl9GT05UX0hBVkVfQ1lSSUxMSUMgICgzMiA8PCA4KQorCitzdGF0aWMgY29uc3QgaW50IGljdkhlcnNoZXlQbGFpbltdID0geworKDUgKyA0KjE2KSArIENWX0ZPTlRfSEFWRV9HUkVFSywKKzE5OSwgMjE0LCAyMTcsIDIzMywgMjE5LCAxOTcsIDIzNCwgMjE2LCAyMjEsIDIyMiwgMjI4LCAyMjUsIDIxMSwgMjI0LCAyMTAsIDIyMCwKKzIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEyLCAyMTMsIDE5MSwgMjI2LCAxOTIsCisyMTUsIDE5MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsCisxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LCAyNiwgMTkzLCA4NCwKKzE5NCwgODUsIDg2LCA4NywgMTAxLCAxMDIsIDEwMywgMTA0LCAxMDUsIDEwNiwgMTA3LCAxMDgsIDEwOSwgMTEwLCAxMTEsCisxMTIsIDExMywgMTE0LCAxMTUsIDExNiwgMTE3LCAxMTgsIDExOSwgMTIwLCAxMjEsIDEyMiwgMTIzLCAxMjQsIDEyNSwgMTI2LAorMTk1LCAyMjMsIDE5NiwgODggfTsKKworc3RhdGljIGNvbnN0IGludCBpY3ZIZXJzaGV5UGxhaW5JdGFsaWNbXSA9IHsKKyg1ICsgNCoxNikgKyBDVl9GT05UX0lUQUxJQ19BTFBIQSArIENWX0ZPTlRfSEFWRV9HUkVFSywKKzE5OSwgMjE0LCAyMTcsIDIzMywgMjE5LCAxOTcsIDIzNCwgMjE2LCAyMjEsIDIyMiwgMjI4LCAyMjUsIDIxMSwgMjI0LCAyMTAsIDIyMCwKKzIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LCAyMDgsIDIwOSwgMjEyLCAyMTMsIDE5MSwgMjI2LCAxOTIsCisyMTUsIDE5MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsCis2NCwgNjUsIDY2LCA2NywgNjgsIDY5LCA3MCwgNzEsIDcyLCA3MywgNzQsIDc1LCA3NiwgMTkzLCA4NCwKKzE5NCwgODUsIDg2LCA4NywgMTUxLCAxNTIsIDE1MywgMTU0LCAxNTUsIDE1NiwgMTU3LCAxNTgsIDE1OSwgMTYwLCAxNjEsCisxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwgMTc2LAorMTk1LCAyMjMsIDE5NiwgODggfTsKKworc3RhdGljIGNvbnN0IGludCBpY3ZIZXJzaGV5Q29tcGxleFNtYWxsW10gPSB7CisoNiArIDcqMTYpICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMTE5OSwgMTIxNCwgMTIxNywgMTI3NSwgMTI3NCwgMTI3MSwgMTI3MiwgMTIxNiwgMTIyMSwgMTIyMiwgMTIxOSwgMTIzMiwgMTIxMSwgMTIzMSwgMTIxMCwgMTIyMCwKKzEyMDAsIDEyMDEsIDEyMDIsIDEyMDMsIDEyMDQsIDEyMDUsIDEyMDYsIDEyMDcsIDEyMDgsIDEyMDksIDEyMTIsIDIyMTMsIDEyNDEsIDEyMzgsIDEyNDIsCisxMjE1LCAxMjczLCAxMDAxLCAxMDAyLCAxMDAzLCAxMDA0LCAxMDA1LCAxMDA2LCAxMDA3LCAxMDA4LCAxMDA5LCAxMDEwLCAxMDExLCAxMDEyLCAxMDEzLAorMTAxNCwgMTAxNSwgMTAxNiwgMTAxNywgMTAxOCwgMTAxOSwgMTAyMCwgMTAyMSwgMTAyMiwgMTAyMywgMTAyNCwgMTAyNSwgMTAyNiwgMTIyMywgMTA4NCwKKzEyMjQsIDEyNDcsIDU4NiwgMTI0OSwgMTEwMSwgMTEwMiwgMTEwMywgMTEwNCwgMTEwNSwgMTEwNiwgMTEwNywgMTEwOCwgMTEwOSwgMTExMCwgMTExMSwKKzExMTIsIDExMTMsIDExMTQsIDExMTUsIDExMTYsIDExMTcsIDExMTgsIDExMTksIDExMjAsIDExMjEsIDExMjIsIDExMjMsIDExMjQsIDExMjUsIDExMjYsCisxMjI1LCAxMjI5LCAxMjI2LCAxMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleUNvbXBsZXhTbWFsbEl0YWxpY1tdID0geworKDYgKyA3KjE2KSArIENWX0ZPTlRfSVRBTElDX0FMUEhBICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMTE5OSwgMTIxNCwgMTIxNywgMTI3NSwgMTI3NCwgMTI3MSwgMTI3MiwgMTIxNiwgMTIyMSwgMTIyMiwgMTIxOSwgMTIzMiwgMTIxMSwgMTIzMSwgMTIxMCwgMTIyMCwKKzEyMDAsIDEyMDEsIDEyMDIsIDEyMDMsIDEyMDQsIDEyMDUsIDEyMDYsIDEyMDcsIDEyMDgsIDEyMDksIDEyMTIsIDEyMTMsIDEyNDEsIDEyMzgsIDEyNDIsCisxMjE1LCAxMjczLCAxMDUxLCAxMDUyLCAxMDUzLCAxMDU0LCAxMDU1LCAxMDU2LCAxMDU3LCAxMDU4LCAxMDU5LCAxMDYwLCAxMDYxLCAxMDYyLCAxMDYzLAorMTA2NCwgMTA2NSwgMTA2NiwgMTA2NywgMTA2OCwgMTA2OSwgMTA3MCwgMTA3MSwgMTA3MiwgMTA3MywgMTA3NCwgMTA3NSwgMTA3NiwgMTIyMywgMTA4NCwKKzEyMjQsIDEyNDcsIDU4NiwgMTI0OSwgMTE1MSwgMTE1MiwgMTE1MywgMTE1NCwgMTE1NSwgMTE1NiwgMTE1NywgMTE1OCwgMTE1OSwgMTE2MCwgMTE2MSwKKzExNjIsIDExNjMsIDExNjQsIDExNjUsIDExNjYsIDExNjcsIDExNjgsIDExNjksIDExNzAsIDExNzEsIDExNzIsIDExNzMsIDExNzQsIDExNzUsIDExNzYsCisxMjI1LCAxMjI5LCAxMjI2LCAxMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleVNpbXBsZXhbXSA9IHsKKyg5ICsgMTIqMTYpICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMjE5OSwgNzE0LCA3MTcsIDczMywgNzE5LCA2OTcsIDczNCwgNzE2LCA3MjEsIDcyMiwgNzI4LCA3MjUsIDcxMSwgNzI0LCA3MTAsIDcyMCwKKzcwMCwgNzAxLCA3MDIsIDcwMywgNzA0LCA3MDUsIDcwNiwgNzA3LCA3MDgsIDcwOSwgNzEyLCA3MTMsIDY5MSwgNzI2LCA2OTIsCis3MTUsIDY5MCwgNTAxLCA1MDIsIDUwMywgNTA0LCA1MDUsIDUwNiwgNTA3LCA1MDgsIDUwOSwgNTEwLCA1MTEsIDUxMiwgNTEzLAorNTE0LCA1MTUsIDUxNiwgNTE3LCA1MTgsIDUxOSwgNTIwLCA1MjEsIDUyMiwgNTIzLCA1MjQsIDUyNSwgNTI2LCA2OTMsIDU4NCwKKzY5NCwgMjI0NywgNTg2LCAyMjQ5LCA2MDEsIDYwMiwgNjAzLCA2MDQsIDYwNSwgNjA2LCA2MDcsIDYwOCwgNjA5LCA2MTAsIDYxMSwKKzYxMiwgNjEzLCA2MTQsIDYxNSwgNjE2LCA2MTcsIDYxOCwgNjE5LCA2MjAsIDYyMSwgNjIyLCA2MjMsIDYyNCwgNjI1LCA2MjYsCis2OTUsIDcyMywgNjk2LCAyMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleUR1cGxleFtdID0geworKDkgKyAxMioxNikgKyBDVl9GT05UX0hBVkVfR1JFRUssCisyMTk5LCAyNzE0LCAyNzI4LCAyNzMyLCAyNzE5LCAyNzMzLCAyNzE4LCAyNzI3LCAyNzIxLCAyNzIyLCAyNzIzLCAyNzI1LCAyNzExLCAyNzI0LCAyNzEwLCAyNzIwLAorMjcwMCwgMjcwMSwgMjcwMiwgMjcwMywgMjcwNCwgMjcwNSwgMjcwNiwgMjcwNywgMjcwOCwgMjcwOSwgMjcxMiwgMjcxMywgMjczMCwgMjcyNiwgMjczMSwKKzI3MTUsIDI3MzQsIDI1MDEsIDI1MDIsIDI1MDMsIDI1MDQsIDI1MDUsIDI1MDYsIDI1MDcsIDI1MDgsIDI1MDksIDI1MTAsIDI1MTEsIDI1MTIsIDI1MTMsCisyNTE0LCAyNTE1LCAyNTE2LCAyNTE3LCAyNTE4LCAyNTE5LCAyNTIwLCAyNTIxLCAyNTIyLCAyNTIzLCAyNTI0LCAyNTI1LCAyNTI2LCAyMjIzLCAyMDg0LAorMjIyNCwgMjI0NywgNTg3LCAyMjQ5LCAyNjAxLCAyNjAyLCAyNjAzLCAyNjA0LCAyNjA1LCAyNjA2LCAyNjA3LCAyNjA4LCAyNjA5LCAyNjEwLCAyNjExLAorMjYxMiwgMjYxMywgMjYxNCwgMjYxNSwgMjYxNiwgMjYxNywgMjYxOCwgMjYxOSwgMjYyMCwgMjYyMSwgMjYyMiwgMjYyMywgMjYyNCwgMjYyNSwgMjYyNiwKKzIyMjUsIDIyMjksIDIyMjYsIDIyNDYgfTsKKworc3RhdGljIGNvbnN0IGludCBpY3ZIZXJzaGV5Q29tcGxleFtdID0geworKDkgKyAxMioxNikgKyBDVl9GT05UX0hBVkVfR1JFRUsgKyBDVl9GT05UX0hBVkVfQ1lSSUxMSUMsCisyMTk5LCAyMjE0LCAyMjE3LCAyMjc1LCAyMjc0LCAyMjcxLCAyMjcyLCAyMjE2LCAyMjIxLCAyMjIyLCAyMjE5LCAyMjMyLCAyMjExLCAyMjMxLCAyMjEwLCAyMjIwLAorMjIwMCwgMjIwMSwgMjIwMiwgMjIwMywgMjIwNCwgMjIwNSwgMjIwNiwgMjIwNywgMjIwOCwgMjIwOSwgMjIxMiwgMjIxMywgMjI0MSwgMjIzOCwgMjI0MiwKKzIyMTUsIDIyNzMsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMsCisyMDE0LCAyMDE1LCAyMDE2LCAyMDE3LCAyMDE4LCAyMDE5LCAyMDIwLCAyMDIxLCAyMDIyLCAyMDIzLCAyMDI0LCAyMDI1LCAyMDI2LCAyMjIzLCAyMDg0LAorMjIyNCwgMjI0NywgNTg3LCAyMjQ5LCAyMTAxLCAyMTAyLCAyMTAzLCAyMTA0LCAyMTA1LCAyMTA2LCAyMTA3LCAyMTA4LCAyMTA5LCAyMTEwLCAyMTExLAorMjExMiwgMjExMywgMjExNCwgMjExNSwgMjExNiwgMjExNywgMjExOCwgMjExOSwgMjEyMCwgMjEyMSwgMjEyMiwgMjEyMywgMjEyNCwgMjEyNSwgMjEyNiwKKzIyMjUsIDIyMjksIDIyMjYsIDIyNDYgfTsKKworc3RhdGljIGNvbnN0IGludCBpY3ZIZXJzaGV5Q29tcGxleEl0YWxpY1tdID0geworKDkgKyAxMioxNikgKyBDVl9GT05UX0lUQUxJQ19BTFBIQSArIENWX0ZPTlRfSVRBTElDX0RJR0lUICsgQ1ZfRk9OVF9JVEFMSUNfUFVOQ1QgKworQ1ZfRk9OVF9IQVZFX0dSRUVLICsgQ1ZfRk9OVF9IQVZFX0NZUklMTElDLAorMjE5OSwgMjc2NCwgMjc3OCwgMjc4MiwgMjc2OSwgMjc4MywgMjc2OCwgMjc3NywgMjc3MSwgMjc3MiwgMjIxOSwgMjIzMiwgMjIxMSwgMjIzMSwgMjIxMCwgMjIyMCwKKzI3NTAsIDI3NTEsIDI3NTIsIDI3NTMsIDI3NTQsIDI3NTUsIDI3NTYsIDI3NTcsIDI3NTgsIDI3NTksIDIyMTIsIDIyMTMsIDIyNDEsIDIyMzgsIDIyNDIsCisyNzY1LCAyMjczLCAyMDUxLCAyMDUyLCAyMDUzLCAyMDU0LCAyMDU1LCAyMDU2LCAyMDU3LCAyMDU4LCAyMDU5LCAyMDYwLCAyMDYxLCAyMDYyLCAyMDYzLAorMjA2NCwgMjA2NSwgMjA2NiwgMjA2NywgMjA2OCwgMjA2OSwgMjA3MCwgMjA3MSwgMjA3MiwgMjA3MywgMjA3NCwgMjA3NSwgMjA3NiwgMjIyMywgMjA4NCwKKzIyMjQsIDIyNDcsIDU4NywgMjI0OSwgMjE1MSwgMjE1MiwgMjE1MywgMjE1NCwgMjE1NSwgMjE1NiwgMjE1NywgMjE1OCwgMjE1OSwgMjE2MCwgMjE2MSwKKzIxNjIsIDIxNjMsIDIxNjQsIDIxNjUsIDIxNjYsIDIxNjcsIDIxNjgsIDIxNjksIDIxNzAsIDIxNzEsIDIxNzIsIDIxNzMsIDIxNzQsIDIxNzUsIDIxNzYsCisyMjI1LCAyMjI5LCAyMjI2LCAyMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleVRyaXBsZXhbXSA9IHsKKyg5ICsgMTIqMTYpICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMjE5OSwgMzIxNCwgMzIyOCwgMzIzMiwgMzIxOSwgMzIzMywgMzIxOCwgMzIyNywgMzIyMSwgMzIyMiwgMzIyMywgMzIyNSwgMzIxMSwgMzIyNCwgMzIxMCwgMzIyMCwKKzMyMDAsIDMyMDEsIDMyMDIsIDMyMDMsIDMyMDQsIDMyMDUsIDMyMDYsIDMyMDcsIDMyMDgsIDMyMDksIDMyMTIsIDMyMTMsIDMyMzAsIDMyMjYsIDMyMzEsCiszMjE1LCAzMjM0LCAzMDAxLCAzMDAyLCAzMDAzLCAzMDA0LCAzMDA1LCAzMDA2LCAzMDA3LCAzMDA4LCAzMDA5LCAzMDEwLCAzMDExLCAzMDEyLCAzMDEzLAorMjAxNCwgMzAxNSwgMzAxNiwgMzAxNywgMzAxOCwgMzAxOSwgMzAyMCwgMzAyMSwgMzAyMiwgMzAyMywgMzAyNCwgMzAyNSwgMzAyNiwgMjIyMywgMjA4NCwKKzIyMjQsIDIyNDcsIDU4NywgMjI0OSwgMzEwMSwgMzEwMiwgMzEwMywgMzEwNCwgMzEwNSwgMzEwNiwgMzEwNywgMzEwOCwgMzEwOSwgMzExMCwgMzExMSwKKzMxMTIsIDMxMTMsIDMxMTQsIDMxMTUsIDMxMTYsIDMxMTcsIDMxMTgsIDMxMTksIDMxMjAsIDMxMjEsIDMxMjIsIDMxMjMsIDMxMjQsIDMxMjUsIDMxMjYsCisyMjI1LCAyMjI5LCAyMjI2LCAyMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleVRyaXBsZXhJdGFsaWNbXSA9IHsKKyg5ICsgMTIqMTYpICsgQ1ZfRk9OVF9JVEFMSUNfQUxQSEEgKyBDVl9GT05UX0lUQUxJQ19ESUdJVCArCitDVl9GT05UX0lUQUxJQ19QVU5DVCArIENWX0ZPTlRfSEFWRV9HUkVFSywKKzIxOTksIDMyNjQsIDMyNzgsIDMyODIsIDMyNjksIDMyMzMsIDMyNjgsIDMyNzcsIDMyNzEsIDMyNzIsIDMyMjMsIDMyMjUsIDMyNjEsIDMyMjQsIDMyNjAsIDMyNzAsCiszMjUwLCAzMjUxLCAzMjUyLCAzMjUzLCAzMjU0LCAzMjU1LCAzMjU2LCAzMjU3LCAzMjU4LCAzMjU5LCAzMjYyLCAzMjYzLCAzMjMwLCAzMjI2LCAzMjMxLAorMzI2NSwgMzIzNCwgMzA1MSwgMzA1MiwgMzA1MywgMzA1NCwgMzA1NSwgMzA1NiwgMzA1NywgMzA1OCwgMzA1OSwgMzA2MCwgMzA2MSwgMzA2MiwgMzA2MywKKzIwNjQsIDMwNjUsIDMwNjYsIDMwNjcsIDMwNjgsIDMwNjksIDMwNzAsIDMwNzEsIDMwNzIsIDMwNzMsIDMwNzQsIDMwNzUsIDMwNzYsIDIyMjMsIDIwODQsCisyMjI0LCAyMjQ3LCA1ODcsIDIyNDksIDMxNTEsIDMxNTIsIDMxNTMsIDMxNTQsIDMxNTUsIDMxNTYsIDMxNTcsIDMxNTgsIDMxNTksIDMxNjAsIDMxNjEsCiszMTYyLCAzMTYzLCAzMTY0LCAzMTY1LCAzMTY2LCAzMTY3LCAzMTY4LCAzMTY5LCAzMTcwLCAzMTcxLCAzMTcyLCAzMTczLCAzMTc0LCAzMTc1LCAzMTc2LAorMjIyNSwgMjIyOSwgMjIyNiwgMjI0NiB9OworCitzdGF0aWMgY29uc3QgaW50IGljdkhlcnNoZXlTY3JpcHRTaW1wbGV4W10gPSB7CisoOSArIDEyKjE2KSArIENWX0ZPTlRfSVRBTElDX0FMUEhBICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMjE5OSwgNzE0LCA3MTcsIDczMywgNzE5LCA2OTcsIDczNCwgNzE2LCA3MjEsIDcyMiwgNzI4LCA3MjUsIDcxMSwgNzI0LCA3MTAsIDcyMCwKKzcwMCwgNzAxLCA3MDIsIDcwMywgNzA0LCA3MDUsIDcwNiwgNzA3LCA3MDgsIDcwOSwgNzEyLCA3MTMsIDY5MSwgNzI2LCA2OTIsCis3MTUsIDY5MCwgNTUxLCA1NTIsIDU1MywgNTU0LCA1NTUsIDU1NiwgNTU3LCA1NTgsIDU1OSwgNTYwLCA1NjEsIDU2MiwgNTYzLAorNTY0LCA1NjUsIDU2NiwgNTY3LCA1NjgsIDU2OSwgNTcwLCA1NzEsIDU3MiwgNTczLCA1NzQsIDU3NSwgNTc2LCA2OTMsIDU4NCwKKzY5NCwgMjI0NywgNTg2LCAyMjQ5LCA2NTEsIDY1MiwgNjUzLCA2NTQsIDY1NSwgNjU2LCA2NTcsIDY1OCwgNjU5LCA2NjAsIDY2MSwKKzY2MiwgNjYzLCA2NjQsIDY2NSwgNjY2LCA2NjcsIDY2OCwgNjY5LCA2NzAsIDY3MSwgNjcyLCA2NzMsIDY3NCwgNjc1LCA2NzYsCis2OTUsIDcyMywgNjk2LCAyMjQ2IH07CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2SGVyc2hleVNjcmlwdENvbXBsZXhbXSA9IHsKKyg5ICsgMTIqMTYpICsgQ1ZfRk9OVF9JVEFMSUNfQUxQSEEgKyBDVl9GT05UX0lUQUxJQ19ESUdJVCArIENWX0ZPTlRfSVRBTElDX1BVTkNUICsgQ1ZfRk9OVF9IQVZFX0dSRUVLLAorMjE5OSwgMjc2NCwgMjc3OCwgMjc4MiwgMjc2OSwgMjc4MywgMjc2OCwgMjc3NywgMjc3MSwgMjc3MiwgMjIxOSwgMjIzMiwgMjIxMSwgMjIzMSwgMjIxMCwgMjIyMCwKKzI3NTAsIDI3NTEsIDI3NTIsIDI3NTMsIDI3NTQsIDI3NTUsIDI3NTYsIDI3NTcsIDI3NTgsIDI3NTksIDIyMTIsIDIyMTMsIDIyNDEsIDIyMzgsIDIyNDIsCisyMjE1LCAyMjczLCAyNTUxLCAyNTUyLCAyNTUzLCAyNTU0LCAyNTU1LCAyNTU2LCAyNTU3LCAyNTU4LCAyNTU5LCAyNTYwLCAyNTYxLCAyNTYyLCAyNTYzLAorMjU2NCwgMjU2NSwgMjU2NiwgMjU2NywgMjU2OCwgMjU2OSwgMjU3MCwgMjU3MSwgMjU3MiwgMjU3MywgMjU3NCwgMjU3NSwgMjU3NiwgMjIyMywgMjA4NCwKKzIyMjQsIDIyNDcsIDU4NiwgMjI0OSwgMjY1MSwgMjY1MiwgMjY1MywgMjY1NCwgMjY1NSwgMjY1NiwgMjY1NywgMjY1OCwgMjY1OSwgMjY2MCwgMjY2MSwKKzI2NjIsIDI2NjMsIDI2NjQsIDI2NjUsIDI2NjYsIDI2NjcsIDI2NjgsIDI2NjksIDI2NzAsIDI2NzEsIDI2NzIsIDI2NzMsIDI2NzQsIDI2NzUsIDI2NzYsCisyMjI1LCAyMjI5LCAyMjI2LCAyMjQ2IH07CisKKworQ1ZfSU1QTCB2b2lkCitjdlB1dFRleHQoIHZvaWQgKmltZywgY29uc3QgY2hhciAqdGV4dCwgQ3ZQb2ludCBvcmcsIGNvbnN0IEN2Rm9udCAqZm9udCwgQ3ZTY2FsYXIgY29sb3IgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZQdXRUZXh0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHZpZXdfeCwgdmlld195OworICAgIGludCBjb2kgPSAwOworICAgIGludCB0b3BfYm90dG9tID0gMCwgYmFzZV9saW5lOworICAgIGludCBoc2NhbGUsIHZzY2FsZSwgZGVmYXVsdF9zaGVhciwgaXRhbGljX3NoZWFyOworICAgIGludCB0aGlja25lc3MsIGxpbmVfdHlwZTsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGJ1Zls0XTsKKyAgICBDdlBvaW50IHB0WzEgPDwgMTBdOworICAgIGludCBjb3VudDsKKworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKipmYWNlcyA9IGljdkhlcnNoZXlHbHlwaHM7CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaSApKTsKKworICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgIGlmKCBDVl9JU19JTUFHRV9IRFIoaW1nKSAmJiAoKElwbEltYWdlKilpbWcpLT5vcmlnaW4gKQorICAgICAgICB0b3BfYm90dG9tID0gMTsKKworICAgIGlmKCAhdGV4dCB8fCAhZm9udCB8fCAhZm9udC0+YXNjaWkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIENWX0NBTEwoIGN2U2NhbGFyVG9SYXdEYXRhKCAmY29sb3IsIGJ1ZiwgbWF0LT50eXBlLCAwICkpOworICAgIGJhc2VfbGluZSA9IC0oZm9udC0+YXNjaWlbMF0gJiAxNSk7CisgICAgaHNjYWxlID0gY3ZSb3VuZChmb250LT5oc2NhbGUqWFlfT05FKTsKKyAgICB2c2NhbGUgPSBjdlJvdW5kKGZvbnQtPnZzY2FsZSpYWV9PTkUpOworICAgIGRlZmF1bHRfc2hlYXIgPSBjdlJvdW5kKGZvbnQtPnNoZWFyKmZvbnQtPnZzY2FsZSpYWV9PTkUpOworICAgIGl0YWxpY19zaGVhciA9ICEoZm9udC0+Zm9udF9mYWNlICYgQ1ZfRk9OVF9JVEFMSUMpID8gMCA6IGN2Um91bmQoZm9udC0+dnNjYWxlKi4yNSpYWV9PTkUpOworICAgIHRoaWNrbmVzcyA9IGZvbnQtPnRoaWNrbmVzczsKKyAgICBsaW5lX3R5cGUgPSBmb250LT5saW5lX3R5cGU7CisKKyAgICBpZiggbGluZV90eXBlID09IENWX0FBICYmIENWX01BVF9ERVBUSChtYXQtPnR5cGUpICE9IENWXzhVICkKKyAgICAgICAgbGluZV90eXBlID0gODsKKworICAgIGlmKCB0b3BfYm90dG9tICkKKyAgICAgICAgdnNjYWxlID0gLXZzY2FsZTsKKworICAgIHZpZXdfeCA9IG9yZy54IDw8IFhZX1NISUZUOworICAgIHZpZXdfeSA9IChvcmcueSA8PCBYWV9TSElGVCkgKyBiYXNlX2xpbmUqdnNjYWxlOworCisgICAgZm9yKCBpID0gMDsgdGV4dFtpXSAhPSAnXDAnOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGMgPSAodWNoYXIpdGV4dFtpXTsKKyAgICAgICAgaW50IGR4LCBzaGVhciA9IGRlZmF1bHRfc2hlYXI7CisgICAgICAgIGNvbnN0IGNoYXIqIHB0cjsKKyAgICAgICAgQ3ZQb2ludCBwOworCisgICAgICAgIGlmKCBjID4gMTI4IHx8IGMgPCAnICcgKQorICAgICAgICAgICAgYyA9ICc/JzsKKworICAgICAgICBpZiggaXRhbGljX3NoZWFyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ1onKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIShmb250LT5hc2NpaVswXSAmIENWX0ZPTlRfSVRBTElDX0FMUEhBKSApCisgICAgICAgICAgICAgICAgICAgIHNoZWFyICs9IGl0YWxpY19zaGVhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICcwJyA8PSBjICYmIGMgPD0gJzknICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIShmb250LT5hc2NpaVswXSAmIENWX0ZPTlRfSVRBTElDX0RJR0lUKSApCisgICAgICAgICAgICAgICAgICAgIHNoZWFyICs9IGl0YWxpY19zaGVhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGMgPCAnQScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhKGZvbnQtPmFzY2lpWzBdICYgQ1ZfRk9OVF9JVEFMSUNfUFVOQ1QpICkKKyAgICAgICAgICAgICAgICAgICAgc2hlYXIgKz0gaXRhbGljX3NoZWFyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNoZWFyICs9IGl0YWxpY19zaGVhcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB0ciA9IGZhY2VzW2ZvbnQtPmFzY2lpWyhjLScgJykrMV1dOworICAgICAgICBwLnggPSAodW5zaWduZWQgY2hhcilwdHJbMF0gLSAnUic7CisgICAgICAgIHAueSA9ICh1bnNpZ25lZCBjaGFyKXB0clsxXSAtICdSJzsKKyAgICAgICAgZHggPSBwLnkqaHNjYWxlOworICAgICAgICB2aWV3X3ggLT0gcC54KmhzY2FsZTsKKyAgICAgICAgY291bnQgPSAwOworCisgICAgICAgIGZvciggcHRyICs9IDI7OyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqcHRyID09ICcgJyB8fCAhKnB0ciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGNvdW50ID4gMSApCisgICAgICAgICAgICAgICAgICAgIGljdlBvbHlMaW5lKCBtYXQsIHB0LCBjb3VudCwgMCwgYnVmLCB0aGlja25lc3MsIGxpbmVfdHlwZSwgWFlfU0hJRlQgKTsgCisgICAgICAgICAgICAgICAgaWYoICEqcHRyKysgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjb3VudCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcC54ID0gKHVuc2lnbmVkIGNoYXIpcHRyWzBdIC0gJ1InOworICAgICAgICAgICAgICAgIHAueSA9ICh1bnNpZ25lZCBjaGFyKXB0clsxXSAtICdSJzsKKyAgICAgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgICAgICBwdFtjb3VudF0ueCA9IHAueCpoc2NhbGUgLSBwLnkqc2hlYXIgKyB2aWV3X3g7CisgICAgICAgICAgICAgICAgcHRbY291bnQrK10ueSA9IHAueSp2c2NhbGUgKyB2aWV3X3k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdmlld194ICs9IGR4OworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZJbml0Rm9udCggQ3ZGb250ICpmb250LCBpbnQgZm9udF9mYWNlLCBkb3VibGUgaHNjYWxlLCBkb3VibGUgdnNjYWxlLAorICAgICAgICAgICAgZG91YmxlIHNoZWFyLCBpbnQgdGhpY2tuZXNzLCBpbnQgbGluZV90eXBlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2SW5pdEZvbnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaXNfaXRhbGljID0gZm9udF9mYWNlICYgQ1ZfRk9OVF9JVEFMSUM7CisKKyAgICBpZiggIWZvbnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIiIgKTsKKworICAgIGlmKCBoc2NhbGUgPD0gMCB8fCB2c2NhbGUgPD0gMCB8fCB0aGlja25lc3MgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBzd2l0Y2goIChmb250X2ZhY2UgJiA3KSApCisgICAgeworICAgIGNhc2UgQ1ZfRk9OVF9IRVJTSEVZX1NJTVBMRVg6CisgICAgICAgIGZvbnQtPmFzY2lpID0gaWN2SGVyc2hleVNpbXBsZXg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfRk9OVF9IRVJTSEVZX1BMQUlOOgorICAgICAgICBmb250LT5hc2NpaSA9ICFpc19pdGFsaWMgPyBpY3ZIZXJzaGV5UGxhaW4gOiBpY3ZIZXJzaGV5UGxhaW5JdGFsaWM7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfRk9OVF9IRVJTSEVZX0RVUExFWDoKKyAgICAgICAgZm9udC0+YXNjaWkgPSBpY3ZIZXJzaGV5RHVwbGV4OworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX0ZPTlRfSEVSU0hFWV9DT01QTEVYOgorICAgICAgICBmb250LT5hc2NpaSA9ICFpc19pdGFsaWMgPyBpY3ZIZXJzaGV5Q29tcGxleCA6IGljdkhlcnNoZXlDb21wbGV4SXRhbGljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX0ZPTlRfSEVSU0hFWV9UUklQTEVYOgorICAgICAgICBmb250LT5hc2NpaSA9ICFpc19pdGFsaWMgPyBpY3ZIZXJzaGV5VHJpcGxleCA6IGljdkhlcnNoZXlUcmlwbGV4SXRhbGljOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX0ZPTlRfSEVSU0hFWV9DT01QTEVYX1NNQUxMOgorICAgICAgICBmb250LT5hc2NpaSA9ICFpc19pdGFsaWMgPyBpY3ZIZXJzaGV5Q29tcGxleFNtYWxsIDogaWN2SGVyc2hleUNvbXBsZXhTbWFsbEl0YWxpYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDVl9GT05UX0hFUlNIRVlfU0NSSVBUX1NJTVBMRVg6CisgICAgICAgIGZvbnQtPmFzY2lpID0gaWN2SGVyc2hleVNjcmlwdFNpbXBsZXg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfRk9OVF9IRVJTSEVZX1NDUklQVF9DT01QTEVYOgorICAgICAgICBmb250LT5hc2NpaSA9IGljdkhlcnNoZXlTY3JpcHRDb21wbGV4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlVua25vd24gZm9udCB0eXBlIiApOworICAgIH0KKworICAgIGZvbnQtPmZvbnRfZmFjZSA9IGZvbnRfZmFjZTsKKyAgICBmb250LT5oc2NhbGUgPSAoZmxvYXQpaHNjYWxlOworICAgIGZvbnQtPnZzY2FsZSA9IChmbG9hdCl2c2NhbGU7CisgICAgZm9udC0+dGhpY2tuZXNzID0gdGhpY2tuZXNzOworICAgIGZvbnQtPnNoZWFyID0gKGZsb2F0KXNoZWFyOworICAgIGZvbnQtPmdyZWVrID0gZm9udC0+Y3lyaWxsaWMgPSAwOworICAgIGZvbnQtPmxpbmVfdHlwZSA9IGxpbmVfdHlwZTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdkdldFRleHRTaXplKCBjb25zdCBjaGFyICp0ZXh0LCBjb25zdCBDdkZvbnQgKmZvbnQsIEN2U2l6ZSAqc2l6ZSwgaW50ICpfYmFzZV9saW5lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0VGV4dFNpemUiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgZmxvYXQgdmlld194ID0gMDsKKyAgICBpbnQgYmFzZV9saW5lLCBjYXBfbGluZTsKKworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKipmYWNlcyA9IGljdkhlcnNoZXlHbHlwaHM7CisKKyAgICBpZiggIXRleHQgfHwgIWZvbnQgfHwgIWZvbnQtPmFzY2lpIHx8ICFzaXplICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBiYXNlX2xpbmUgPSAoZm9udC0+YXNjaWlbMF0gJiAxNSk7CisgICAgY2FwX2xpbmUgPSAoZm9udC0+YXNjaWlbMF0gPj4gNCkgJiAxNTsKKyAgICBpZiggX2Jhc2VfbGluZSApCisgICAgICAgICpfYmFzZV9saW5lID0gY3ZSb3VuZChiYXNlX2xpbmUqZm9udC0+dnNjYWxlKTsKKyAgICBzaXplLT5oZWlnaHQgPSBjdlJvdW5kKChjYXBfbGluZSArIGJhc2VfbGluZSkqZm9udC0+dnNjYWxlICsgZm9udC0+dGhpY2tuZXNzKTsKKworICAgIGZvciggaSA9IDA7IHRleHRbaV0gIT0gJ1wwJzsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBjID0gKHVjaGFyKXRleHRbaV07CisgICAgICAgIGNvbnN0IGNoYXIqIHB0cjsKKyAgICAgICAgQ3ZQb2ludCBwOworCisgICAgICAgIGlmKCBjID4gMTI4IHx8IGMgPCAnICcgKQorICAgICAgICAgICAgYyA9ICc/JzsKKworICAgICAgICBwdHIgPSBmYWNlc1tmb250LT5hc2NpaVsoYy0nICcpKzFdXTsKKyAgICAgICAgcC54ID0gKHVuc2lnbmVkIGNoYXIpcHRyWzBdIC0gJ1InOworICAgICAgICBwLnkgPSAodW5zaWduZWQgY2hhcilwdHJbMV0gLSAnUic7CisgICAgICAgIHZpZXdfeCArPSAocC55IC0gcC54KSpmb250LT5oc2NhbGU7CisgICAgfQorCisgICAgc2l6ZS0+d2lkdGggPSBjdlJvdW5kKHZpZXdfeCArIGZvbnQtPnRoaWNrbmVzcyk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyBjb25zdCBDdlBvaW50IGljdkNvZGVEZWx0YXNbOF0gPQoreyB7MSwgMH0sIHsxLCAtMX0sIHswLCAtMX0sIHstMSwgLTF9LCB7LTEsIDB9LCB7LTEsIDF9LCB7MCwgMX0sIHsxLCAxfSB9OworCisjZGVmaW5lIENWX0FESlVTVF9FREdFX0NPVU5UKCBjb3VudCwgc2VxICkgIFwKKyAgICAoKGNvdW50KSAtPSAoKGNvdW50KSA9PSAoc2VxKS0+dG90YWwgJiYgIUNWX0lTX1NFUV9DTE9TRUQoc2VxKSkpCisKK0NWX0lNUEwgdm9pZAorY3ZEcmF3Q29udG91cnMoIHZvaWQqICBpbWcsICBDdlNlcSogIGNvbnRvdXIsCisgICAgICAgICAgICAgICAgQ3ZTY2FsYXIgZXh0ZXJuYWxDb2xvciwgQ3ZTY2FsYXIgaG9sZUNvbG9yLCAKKyAgICAgICAgICAgICAgICBpbnQgIG1heExldmVsLCBpbnQgdGhpY2tuZXNzLAorICAgICAgICAgICAgICAgIGludCBsaW5lX3R5cGUsIEN2UG9pbnQgb2Zmc2V0ICkKK3sKKyAgICBDdlNlcSAqY29udG91cjAgPSBjb250b3VyLCAqaF9uZXh0ID0gMDsKKyAgICBDdk1lbVN0b3JhZ2UqIHN0ID0gMDsKKyAgICBDdlNlcSogdHNlcSA9IDA7CisgICAgQ3ZDb250b3VyKiBlZGdlcyA9IDA7CisgICAgQ3ZTZXFXcml0ZXIgd3JpdGVyOworICAgIEN2VHJlZU5vZGVJdGVyYXRvciBpdGVyYXRvcjsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZEcmF3Q29udG91cnMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY29pID0gMDsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilpbWc7CisgICAgZG91YmxlIGV4dF9idWZbNF0sIGhvbGVfYnVmWzRdOworCisgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIsICZjb2kgKSk7CisKKyAgICBpZiggbGluZV90eXBlID09IENWX0FBICYmIENWX01BVF9ERVBUSChtYXQtPnR5cGUpICE9IENWXzhVICkKKyAgICAgICAgbGluZV90eXBlID0gODsKKworICAgIGlmKCAhY29udG91ciApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggY29pICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggdGhpY2tuZXNzIDwgLTEgfHwgdGhpY2tuZXNzID4gMjU1ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICIiICk7CisKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmV4dGVybmFsQ29sb3IsIGV4dF9idWYsIG1hdC0+dHlwZSwgMCApKTsKKyAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggJmhvbGVDb2xvciwgaG9sZV9idWYsIG1hdC0+dHlwZSwgMCApKTsKKworICAgIGlmKCBtYXhMZXZlbCA8IDAgKQorICAgIHsKKyAgICAgICAgaF9uZXh0ID0gY29udG91ci0+aF9uZXh0OworICAgICAgICBjb250b3VyLT5oX25leHQgPSAwOworICAgICAgICBtYXhMZXZlbCA9IC1tYXhMZXZlbCsxOworICAgIH0KKworICAgIGlmKCB0aGlja25lc3MgPCAwICkKKyAgICB7CisgICAgICAgIGlmKCBjb250b3VyLT5zdG9yYWdlICkKKyAgICAgICAgICAgIHN0ID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoIGNvbnRvdXItPnN0b3JhZ2UgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgc3QgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIENWX0RSQVdJTkdfU1RPUkFHRV9CTE9DSyApOworICAgICAgICB0c2VxID0gY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdkNvbnRvdXIpLCBzaXplb2YoQ3ZQb2ludCksIHN0ICk7CisgICAgICAgIGVkZ2VzID0gKEN2Q29udG91ciopY3ZDcmVhdGVTZXEoIDAsIHNpemVvZihDdkNvbnRvdXIpLCBzaXplb2YoQ3ZQb2x5RWRnZSksIHN0ICk7CisgICAgfQorCisgICAgbWVtc2V0KCAmd3JpdGVyLCAwLCBzaXplb2Yod3JpdGVyKSk7CisKKyAgICBjdkluaXRUcmVlTm9kZUl0ZXJhdG9yKCAmaXRlcmF0b3IsIGNvbnRvdXIsIG1heExldmVsICk7CisgICAgCisgICAgd2hpbGUoIChjb250b3VyID0gKEN2U2VxKiljdk5leHRUcmVlTm9kZSggJml0ZXJhdG9yICkpICE9IDAgKQorICAgIHsKKyAgICAgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgICAgICBpbnQgaSwgY291bnQgPSBjb250b3VyLT50b3RhbDsKKyAgICAgICAgaW50IGVsZW1fdHlwZSA9IENWX01BVF9UWVBFKGNvbnRvdXItPmZsYWdzKTsKKyAgICAgICAgdm9pZCogY2xyID0gKGNvbnRvdXItPmZsYWdzICYgQ1ZfU0VRX0ZMQUdfSE9MRSkgPT0gMCA/IGV4dF9idWYgOiBob2xlX2J1ZjsKKworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggY29udG91ciwgJnJlYWRlciwgMCApOworCisgICAgICAgIGlmKCBDVl9JU19TRVFfQ0hBSU5fQ09OVE9VUiggY29udG91ciApKQorICAgICAgICB7CisgICAgICAgICAgICBDdlBvaW50IHB0ID0gKChDdkNoYWluKiljb250b3VyKS0+b3JpZ2luOworICAgICAgICAgICAgQ3ZQb2ludCBwcmV2X3B0ID0gcHQ7CisgICAgICAgICAgICBjaGFyIHByZXZfY29kZSA9IHJlYWRlci5wdHIgPyByZWFkZXIucHRyWzBdIDogJ1wwJzsKKworICAgICAgICAgICAgaWYoIHRoaWNrbmVzcyA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2Q2xlYXJTZXEoIHRzZXEgKTsKKyAgICAgICAgICAgICAgICBjdlN0YXJ0QXBwZW5kVG9TZXEoIHRzZXEsICZ3cml0ZXIgKTsKKyAgICAgICAgICAgICAgICBDVl9XUklURV9TRVFfRUxFTSggcHQsIHdyaXRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmV2X3B0LnggKz0gb2Zmc2V0Lng7CisgICAgICAgICAgICBwcmV2X3B0LnkgKz0gb2Zmc2V0Lnk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNvZGU7CisgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggY29kZSwgcmVhZGVyICk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIChjb2RlICYgfjcpID09IDAgKTsKKworICAgICAgICAgICAgICAgIGlmKCBjb2RlICE9IHByZXZfY29kZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwcmV2X2NvZGUgPSBjb2RlOworICAgICAgICAgICAgICAgICAgICBpZiggdGhpY2tuZXNzID49IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZUaGlja0xpbmUoIG1hdCwgcHJldl9wdCwgcHQsIGNsciwgdGhpY2tuZXNzLCBsaW5lX3R5cGUsIDIsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHJldl9wdCA9IHB0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHB0LnggKz0gaWN2Q29kZURlbHRhc1soaW50KWNvZGVdLng7CisgICAgICAgICAgICAgICAgcHQueSArPSBpY3ZDb2RlRGVsdGFzWyhpbnQpY29kZV0ueTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHRoaWNrbmVzcyA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpY3ZUaGlja0xpbmUoIG1hdCwgcHJldl9wdCwgKChDdkNoYWluKiljb250b3VyKS0+b3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xyLCB0aGlja25lc3MsIGxpbmVfdHlwZSwgMiwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX1dSSVRFX1NFUV9FTEVNKCBwdCwgd3JpdGVyICk7CisgICAgICAgICAgICAgICAgY3ZFbmRXcml0ZVNlcSggJndyaXRlciApOworICAgICAgICAgICAgICAgIENWX0NBTEwoIGljdkNvbGxlY3RQb2x5RWRnZXMoIG1hdCwgdHNlcSwgZWRnZXMsIGV4dF9idWYsIGxpbmVfdHlwZSwgMCApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBDVl9JU19TRVFfUE9MWUxJTkUoIGNvbnRvdXIgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHRoaWNrbmVzcyA+PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdlBvaW50IHB0MSwgcHQyOworICAgICAgICAgICAgICAgIGludCBzaGlmdCA9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY291bnQgLT0gIUNWX0lTX1NFUV9DTE9TRUQoY29udG91cik7CisgICAgICAgICAgICAgICAgaWYoIGVsZW1fdHlwZSA9PSBDVl8zMlNDMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdDEsIHJlYWRlciApOworICAgICAgICAgICAgICAgICAgICBwdDEueCArPSBvZmZzZXQueDsKKyAgICAgICAgICAgICAgICAgICAgcHQxLnkgKz0gb2Zmc2V0Lnk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdDFmOworICAgICAgICAgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdDFmLCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgcHQxLnggPSBjdlJvdW5kKCAocHQxZi54ICsgb2Zmc2V0LngpICogWFlfT05FICk7CisgICAgICAgICAgICAgICAgICAgIHB0MS55ID0gY3ZSb3VuZCggKHB0MWYueSArIG9mZnNldC55KSAqIFhZX09ORSApOworICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IFhZX1NISUZUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBlbGVtX3R5cGUgPT0gQ1ZfMzJTQzIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBDVl9SRUFEX1NFUV9FTEVNKCBwdDIsIHJlYWRlciApOworICAgICAgICAgICAgICAgICAgICAgICAgcHQyLnggKz0gb2Zmc2V0Lng7CisgICAgICAgICAgICAgICAgICAgICAgICBwdDIueSArPSBvZmZzZXQueTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQyRDMyZiBwdDJmOworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggcHQyZiwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdDIueCA9IGN2Um91bmQoIHB0MmYueCAqIFhZX09ORSApOworICAgICAgICAgICAgICAgICAgICAgICAgcHQyLnkgPSBjdlJvdW5kKCBwdDJmLnkgKiBYWV9PTkUgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpY3ZUaGlja0xpbmUoIG1hdCwgcHQxLCBwdDIsIGNsciwgdGhpY2tuZXNzLCBsaW5lX3R5cGUsIDIsIHNoaWZ0ICk7CisgICAgICAgICAgICAgICAgICAgIHB0MSA9IHB0MjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2Q29sbGVjdFBvbHlFZGdlcyggbWF0LCBjb250b3VyLCBlZGdlcywgZXh0X2J1ZiwgbGluZV90eXBlLCAwLCBvZmZzZXQgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggdGhpY2tuZXNzIDwgMCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZGaWxsRWRnZUNvbGxlY3Rpb24oIG1hdCwgZWRnZXMsIGV4dF9idWYgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBoX25leHQgJiYgY29udG91cjAgKQorICAgICAgICBjb250b3VyMC0+aF9uZXh0ID0gaF9uZXh0OworCisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0ICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeGR4dC5jcHAgYi9jeGNvcmUvc3JjL2N4ZHh0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGIzYzg5Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeGR4dC5jcHAKQEAgLTAsMCArMSwzMDAzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLy8gT24gV2luNjQgKElBNjQpIG9wdGltaXplZCB2ZXJzaW9ucyBvZiBERlQgYW5kIERDVCBmYWlsIHRoZSB0ZXN0cworI2lmIGRlZmluZWQgV0lONjQgJiYgIWRlZmluZWQgRU02NFQKKyNwcmFnbWEgb3B0aW1pemUoIiIsIG9mZikKKyNlbmRpZgorCitpY3ZERlRJbml0QWxsb2NfQ18zMmZjX3QgaWN2REZUSW5pdEFsbG9jX0NfMzJmY19wID0gMDsKK2ljdkRGVEZyZWVfQ18zMmZjX3QgaWN2REZURnJlZV9DXzMyZmNfcCA9IDA7CitpY3ZERlRHZXRCdWZTaXplX0NfMzJmY190IGljdkRGVEdldEJ1ZlNpemVfQ18zMmZjX3AgPSAwOworaWN2REZURndkX0NUb0NfMzJmY190IGljdkRGVEZ3ZF9DVG9DXzMyZmNfcCA9IDA7CitpY3ZERlRJbnZfQ1RvQ18zMmZjX3QgaWN2REZUSW52X0NUb0NfMzJmY19wID0gMDsKKworaWN2REZUSW5pdEFsbG9jX0NfNjRmY190IGljdkRGVEluaXRBbGxvY19DXzY0ZmNfcCA9IDA7CitpY3ZERlRGcmVlX0NfNjRmY190IGljdkRGVEZyZWVfQ182NGZjX3AgPSAwOworaWN2REZUR2V0QnVmU2l6ZV9DXzY0ZmNfdCBpY3ZERlRHZXRCdWZTaXplX0NfNjRmY19wID0gMDsKK2ljdkRGVEZ3ZF9DVG9DXzY0ZmNfdCBpY3ZERlRGd2RfQ1RvQ182NGZjX3AgPSAwOworaWN2REZUSW52X0NUb0NfNjRmY190IGljdkRGVEludl9DVG9DXzY0ZmNfcCA9IDA7CisKK2ljdkRGVEluaXRBbGxvY19SXzMyZl90IGljdkRGVEluaXRBbGxvY19SXzMyZl9wID0gMDsKK2ljdkRGVEZyZWVfUl8zMmZfdCBpY3ZERlRGcmVlX1JfMzJmX3AgPSAwOworaWN2REZUR2V0QnVmU2l6ZV9SXzMyZl90IGljdkRGVEdldEJ1ZlNpemVfUl8zMmZfcCA9IDA7CitpY3ZERlRGd2RfUlRvUGFja18zMmZfdCBpY3ZERlRGd2RfUlRvUGFja18zMmZfcCA9IDA7CitpY3ZERlRJbnZfUGFja1RvUl8zMmZfdCBpY3ZERlRJbnZfUGFja1RvUl8zMmZfcCA9IDA7CisKK2ljdkRGVEluaXRBbGxvY19SXzY0Zl90IGljdkRGVEluaXRBbGxvY19SXzY0Zl9wID0gMDsKK2ljdkRGVEZyZWVfUl82NGZfdCBpY3ZERlRGcmVlX1JfNjRmX3AgPSAwOworaWN2REZUR2V0QnVmU2l6ZV9SXzY0Zl90IGljdkRGVEdldEJ1ZlNpemVfUl82NGZfcCA9IDA7CitpY3ZERlRGd2RfUlRvUGFja182NGZfdCBpY3ZERlRGd2RfUlRvUGFja182NGZfcCA9IDA7CitpY3ZERlRJbnZfUGFja1RvUl82NGZfdCBpY3ZERlRJbnZfUGFja1RvUl82NGZfcCA9IDA7CisKKy8qaWN2RENURndkSW5pdEFsbG9jXzMyZl90IGljdkRDVEZ3ZEluaXRBbGxvY18zMmZfcCA9IDA7CitpY3ZEQ1RGd2RGcmVlXzMyZl90IGljdkRDVEZ3ZEZyZWVfMzJmX3AgPSAwOworaWN2RENURndkR2V0QnVmU2l6ZV8zMmZfdCBpY3ZEQ1RGd2RHZXRCdWZTaXplXzMyZl9wID0gMDsKK2ljdkRDVEZ3ZF8zMmZfdCBpY3ZEQ1RGd2RfMzJmX3AgPSAwOworCitpY3ZEQ1RJbnZJbml0QWxsb2NfMzJmX3QgaWN2RENUSW52SW5pdEFsbG9jXzMyZl9wID0gMDsKK2ljdkRDVEludkZyZWVfMzJmX3QgaWN2RENUSW52RnJlZV8zMmZfcCA9IDA7CitpY3ZEQ1RJbnZHZXRCdWZTaXplXzMyZl90IGljdkRDVEludkdldEJ1ZlNpemVfMzJmX3AgPSAwOworaWN2RENUSW52XzMyZl90IGljdkRDVEludl8zMmZfcCA9IDA7CisKK2ljdkRDVEZ3ZEluaXRBbGxvY182NGZfdCBpY3ZEQ1RGd2RJbml0QWxsb2NfNjRmX3AgPSAwOworaWN2RENURndkRnJlZV82NGZfdCBpY3ZEQ1RGd2RGcmVlXzY0Zl9wID0gMDsKK2ljdkRDVEZ3ZEdldEJ1ZlNpemVfNjRmX3QgaWN2RENURndkR2V0QnVmU2l6ZV82NGZfcCA9IDA7CitpY3ZEQ1RGd2RfNjRmX3QgaWN2RENURndkXzY0Zl9wID0gMDsKKworaWN2RENUSW52SW5pdEFsbG9jXzY0Zl90IGljdkRDVEludkluaXRBbGxvY182NGZfcCA9IDA7CitpY3ZEQ1RJbnZGcmVlXzY0Zl90IGljdkRDVEludkZyZWVfNjRmX3AgPSAwOworaWN2RENUSW52R2V0QnVmU2l6ZV82NGZfdCBpY3ZEQ1RJbnZHZXRCdWZTaXplXzY0Zl9wID0gMDsKK2ljdkRDVEludl82NGZfdCBpY3ZEQ1RJbnZfNjRmX3AgPSAwOyovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2NyZXRlIEZvdXJpZXIgVHJhbnNmb3JtCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9NQVhfTE9DQUxfREZUX1NJWkUgICgxIDw8IDE1KQorCitzdGF0aWMgY29uc3QgdWNoYXIgbG9nMnRhYltdID0geyAwLCAwLCAxLCAwLCAyLCAwLCAwLCAwLCAzLCAwLCAwLCAwLCAwLCAwLCAwLCAwIH07CitzdGF0aWMgaW50IGljdmxvZzIoIGludCBuICkKK3sKKyAgICBpbnQgbSA9IDA7CisgICAgaW50IGYgPSAobiA+PSAoMSA8PCAxNikpKjE2OworICAgIG4gPj49IGY7CisgICAgbSArPSBmOworICAgIGYgPSAobiA+PSAoMSA8PCA4KSkqODsKKyAgICBuID4+PSBmOworICAgIG0gKz0gZjsKKyAgICBmID0gKG4gPj0gKDEgPDwgNCkpKjQ7CisgICAgbiA+Pj0gZjsKKyAgICByZXR1cm4gbSArIGYgKyBsb2cydGFiW25dOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBpY3ZSZXZUYWJsZVtdID0KK3sKKyAgMHgwMCwweDgwLDB4NDAsMHhjMCwweDIwLDB4YTAsMHg2MCwweGUwLDB4MTAsMHg5MCwweDUwLDB4ZDAsMHgzMCwweGIwLDB4NzAsMHhmMCwKKyAgMHgwOCwweDg4LDB4NDgsMHhjOCwweDI4LDB4YTgsMHg2OCwweGU4LDB4MTgsMHg5OCwweDU4LDB4ZDgsMHgzOCwweGI4LDB4NzgsMHhmOCwKKyAgMHgwNCwweDg0LDB4NDQsMHhjNCwweDI0LDB4YTQsMHg2NCwweGU0LDB4MTQsMHg5NCwweDU0LDB4ZDQsMHgzNCwweGI0LDB4NzQsMHhmNCwKKyAgMHgwYywweDhjLDB4NGMsMHhjYywweDJjLDB4YWMsMHg2YywweGVjLDB4MWMsMHg5YywweDVjLDB4ZGMsMHgzYywweGJjLDB4N2MsMHhmYywKKyAgMHgwMiwweDgyLDB4NDIsMHhjMiwweDIyLDB4YTIsMHg2MiwweGUyLDB4MTIsMHg5MiwweDUyLDB4ZDIsMHgzMiwweGIyLDB4NzIsMHhmMiwKKyAgMHgwYSwweDhhLDB4NGEsMHhjYSwweDJhLDB4YWEsMHg2YSwweGVhLDB4MWEsMHg5YSwweDVhLDB4ZGEsMHgzYSwweGJhLDB4N2EsMHhmYSwKKyAgMHgwNiwweDg2LDB4NDYsMHhjNiwweDI2LDB4YTYsMHg2NiwweGU2LDB4MTYsMHg5NiwweDU2LDB4ZDYsMHgzNiwweGI2LDB4NzYsMHhmNiwKKyAgMHgwZSwweDhlLDB4NGUsMHhjZSwweDJlLDB4YWUsMHg2ZSwweGVlLDB4MWUsMHg5ZSwweDVlLDB4ZGUsMHgzZSwweGJlLDB4N2UsMHhmZSwKKyAgMHgwMSwweDgxLDB4NDEsMHhjMSwweDIxLDB4YTEsMHg2MSwweGUxLDB4MTEsMHg5MSwweDUxLDB4ZDEsMHgzMSwweGIxLDB4NzEsMHhmMSwKKyAgMHgwOSwweDg5LDB4NDksMHhjOSwweDI5LDB4YTksMHg2OSwweGU5LDB4MTksMHg5OSwweDU5LDB4ZDksMHgzOSwweGI5LDB4NzksMHhmOSwKKyAgMHgwNSwweDg1LDB4NDUsMHhjNSwweDI1LDB4YTUsMHg2NSwweGU1LDB4MTUsMHg5NSwweDU1LDB4ZDUsMHgzNSwweGI1LDB4NzUsMHhmNSwKKyAgMHgwZCwweDhkLDB4NGQsMHhjZCwweDJkLDB4YWQsMHg2ZCwweGVkLDB4MWQsMHg5ZCwweDVkLDB4ZGQsMHgzZCwweGJkLDB4N2QsMHhmZCwKKyAgMHgwMywweDgzLDB4NDMsMHhjMywweDIzLDB4YTMsMHg2MywweGUzLDB4MTMsMHg5MywweDUzLDB4ZDMsMHgzMywweGIzLDB4NzMsMHhmMywKKyAgMHgwYiwweDhiLDB4NGIsMHhjYiwweDJiLDB4YWIsMHg2YiwweGViLDB4MWIsMHg5YiwweDViLDB4ZGIsMHgzYiwweGJiLDB4N2IsMHhmYiwKKyAgMHgwNywweDg3LDB4NDcsMHhjNywweDI3LDB4YTcsMHg2NywweGU3LDB4MTcsMHg5NywweDU3LDB4ZDcsMHgzNywweGI3LDB4NzcsMHhmNywKKyAgMHgwZiwweDhmLDB4NGYsMHhjZiwweDJmLDB4YWYsMHg2ZiwweGVmLDB4MWYsMHg5ZiwweDVmLDB4ZGYsMHgzZiwweGJmLDB4N2YsMHhmZgorfTsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBpY3ZEeHRUYWJbXVsyXSA9Cit7Cit7IDEuMDAwMDAwMDAwMDAwMDAwMDAsIDAuMDAwMDAwMDAwMDAwMDAwMDAgfSwKK3stMS4wMDAwMDAwMDAwMDAwMDAwMCwgMC4wMDAwMDAwMDAwMDAwMDAwMCB9LAoreyAwLjAwMDAwMDAwMDAwMDAwMDAwLCAxLjAwMDAwMDAwMDAwMDAwMDAwIH0sCit7IDAuNzA3MTA2NzgxMTg2NTQ3NTcsIDAuNzA3MTA2NzgxMTg2NTQ3NDYgfSwKK3sgMC45MjM4Nzk1MzI1MTEyODY3NCwgMC4zODI2ODM0MzIzNjUwODk3OCB9LAoreyAwLjk4MDc4NTI4MDQwMzIzMDQzLCAwLjE5NTA5MDMyMjAxNjEyODI1IH0sCit7IDAuOTk1MTg0NzI2NjcyMTk2OTMsIDAuMDk4MDE3MTQwMzI5NTYwNjAgfSwKK3sgMC45OTg3OTU0NTYyMDUxNzI0MSwgMC4wNDkwNjc2NzQzMjc0MTgwMiB9LAoreyAwLjk5OTY5ODgxODY5NjIwNDI1LCAwLjAyNDU0MTIyODUyMjkxMjI5IH0sCit7IDAuOTk5OTI0NzAxODM5MTQ0NTAsIDAuMDEyMjcxNTM4Mjg1NzE5OTMgfSwKK3sgMC45OTk5ODExNzUyODI2MDExMSwgMC4wMDYxMzU4ODQ2NDkxNTQ0OCB9LAoreyAwLjk5OTk5NTI5MzgwOTU3NjE5LCAwLjAwMzA2Nzk1Njc2Mjk2NTk4IH0sCit7IDAuOTk5OTk4ODIzNDUxNzAxODgsIDAuMDAxNTMzOTgwMTg2Mjg0NzcgfSwKK3sgMC45OTk5OTk3MDU4NjI4ODIyMywgMC4wMDA3NjY5OTAzMTg3NDI3MCB9LAoreyAwLjk5OTk5OTkyNjQ2NTcxNzg5LCAwLjAwMDM4MzQ5NTE4NzU3MTQwIH0sCit7IDAuOTk5OTk5OTgxNjE2NDI5MzMsIDAuMDAwMTkxNzQ3NTk3MzEwNzAgfSwKK3sgMC45OTk5OTk5OTU0MDQxMDczMywgMC4wMDAwOTU4NzM3OTkwOTU5OCB9LAoreyAwLjk5OTk5OTk5ODg1MTAyNjg2LCAwLjAwMDA0NzkzNjg5OTYwMzA3IH0sCit7IDAuOTk5OTk5OTk5NzEyNzU2NjYsIDAuMDAwMDIzOTY4NDQ5ODA4NDIgfSwKK3sgMC45OTk5OTk5OTk5MjgxODkyMiwgMC4wMDAwMTE5ODQyMjQ5MDUwNyB9LAoreyAwLjk5OTk5OTk5OTk4MjA0NzI1LCAwLjAwMDAwNTk5MjExMjQ1MjY0IH0sCit7IDAuOTk5OTk5OTk5OTk1NTExODEsIDAuMDAwMDAyOTk2MDU2MjI2MzMgfSwKK3sgMC45OTk5OTk5OTk5OTg4NzgwMSwgMC4wMDAwMDE0OTgwMjgxMTMxNyB9LAoreyAwLjk5OTk5OTk5OTk5OTcxOTQ1LCAwLjAwMDAwMDc0OTAxNDA1NjU4IH0sCit7IDAuOTk5OTk5OTk5OTk5OTI5ODMsIDAuMDAwMDAwMzc0NTA3MDI4MjkgfSwKK3sgMC45OTk5OTk5OTk5OTk5ODI0NiwgMC4wMDAwMDAxODcyNTM1MTQxNSB9LAoreyAwLjk5OTk5OTk5OTk5OTk5NTY3LCAwLjAwMDAwMDA5MzYyNjc1NzA3IH0sCit7IDAuOTk5OTk5OTk5OTk5OTk4ODksIDAuMDAwMDAwMDQ2ODEzMzc4NTQgfSwKK3sgMC45OTk5OTk5OTk5OTk5OTk3OCwgMC4wMDAwMDAwMjM0MDY2ODkyNyB9LAoreyAwLjk5OTk5OTk5OTk5OTk5OTg5LCAwLjAwMDAwMDAxMTcwMzM0NDYzIH0sCit7IDEuMDAwMDAwMDAwMDAwMDAwMDAsIDAuMDAwMDAwMDA1ODUxNjcyMzIgfSwKK3sgMS4wMDAwMDAwMDAwMDAwMDAwMCwgMC4wMDAwMDAwMDI5MjU4MzYxNiB9Cit9OworCisjZGVmaW5lIGljdkJpdFJldihpLHNoaWZ0KSBcCisgICAoKGludCkoKCgodW5zaWduZWQpaWN2UmV2VGFibGVbKGkpJjI1NV0gPDwgMjQpKyBcCisgICAgICAgICAgICgodW5zaWduZWQpaWN2UmV2VGFibGVbKChpKT4+IDgpJjI1NV0gPDwgMTYpKyBcCisgICAgICAgICAgICgodW5zaWduZWQpaWN2UmV2VGFibGVbKChpKT4+MTYpJjI1NV0gPDwgIDgpKyBcCisgICAgICAgICAgICgodW5zaWduZWQpaWN2UmV2VGFibGVbKChpKT4+MjQpXSkpID4+IChzaGlmdCkpKQorCitzdGF0aWMgaW50CitpY3ZERlRGYWN0b3JpemUoIGludCBuLCBpbnQqIGZhY3RvcnMgKQoreworICAgIGludCBuZiA9IDAsIGYsIGksIGo7CisKKyAgICBpZiggbiA8PSA1ICkKKyAgICB7CisgICAgICAgIGZhY3RvcnNbMF0gPSBuOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgCisgICAgZiA9ICgoKG4gLSAxKV5uKSsxKSA+PiAxOworICAgIGlmKCBmID4gMSApCisgICAgeworICAgICAgICBmYWN0b3JzW25mKytdID0gZjsKKyAgICAgICAgbiA9IGYgPT0gbiA/IDEgOiBuL2Y7CisgICAgfQorCisgICAgZm9yKCBmID0gMzsgbiA+IDE7ICkKKyAgICB7CisgICAgICAgIGludCBkID0gbi9mOworICAgICAgICBpZiggZCpmID09IG4gKQorICAgICAgICB7CisgICAgICAgICAgICBmYWN0b3JzW25mKytdID0gZjsKKyAgICAgICAgICAgIG4gPSBkOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZiArPSAyOworICAgICAgICAgICAgaWYoIGYqZiA+IG4gKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIG4gPiAxICkKKyAgICAgICAgZmFjdG9yc1tuZisrXSA9IG47CisKKyAgICBmID0gKGZhY3RvcnNbMF0gJiAxKSA9PSAwOworICAgIGZvciggaSA9IGY7IGkgPCAobmYrZikvMjsgaSsrICkKKyAgICAgICAgQ1ZfU1dBUCggZmFjdG9yc1tpXSwgZmFjdG9yc1tuZi1pLTErZl0sIGogKTsKKworICAgIHJldHVybiBuZjsKK30KKworc3RhdGljIHZvaWQKK2ljdkRGVEluaXQoIGludCBuMCwgaW50IG5mLCBpbnQqIGZhY3RvcnMsIGludCogaXRhYiwgaW50IGVsZW1fc2l6ZSwgdm9pZCogX3dhdmUsIGludCBpbnZfaXRhYiApCit7CisgICAgaW50IGRpZ2l0c1szNF0sIHJhZGl4WzM0XTsKKyAgICBpbnQgbiA9IGZhY3RvcnNbMF0sIG0gPSAwOworICAgIGludCogaXRhYjAgPSBpdGFiOworICAgIGludCBpLCBqLCBrOworICAgIEN2Q29tcGxleDY0ZiB3LCB3MTsKKyAgICBkb3VibGUgdDsKKworICAgIGlmKCBuMCA8PSA1ICkKKyAgICB7CisgICAgICAgIGl0YWJbMF0gPSAwOworICAgICAgICBpdGFiW24wLTFdID0gbjAtMTsKKyAgICAgICAgCisgICAgICAgIGlmKCBuMCAhPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IG4wLTE7IGkrKyApCisgICAgICAgICAgICAgICAgaXRhYltpXSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpdGFiWzFdID0gMjsKKyAgICAgICAgICAgIGl0YWJbMl0gPSAxOworICAgICAgICB9CisgICAgICAgIGlmKCBuMCA9PSA1ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoQ3ZDb21wbGV4NjRmKSApCisgICAgICAgICAgICAgICAgKChDdkNvbXBsZXg2NGYqKV93YXZlKVswXSA9IEN2Q29tcGxleDY0ZigxLiwwLik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKChDdkNvbXBsZXgzMmYqKV93YXZlKVswXSA9IEN2Q29tcGxleDMyZigxLmYsMC5mKTsKKyAgICAgICAgfQorICAgICAgICBpZiggbjAgIT0gNCApCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIG0gPSAyOworICAgIH0KKyAgICBlbHNlCisgICAgeworCS8vIHJhZGl4W10gaXMgaW5pdGlhbGl6ZWQgZnJvbSBpbmRleCAnbmYnIGRvd24gdG8gemVybworICAgICAgICBhc3NlcnQgKG5mIDwgMzQpOworICAgICAgICByYWRpeFtuZl0gPSAxOworICAgICAgICBkaWdpdHNbbmZdID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5mOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkaWdpdHNbaV0gPSAwOworICAgICAgICAgICAgcmFkaXhbbmYtaS0xXSA9IHJhZGl4W25mLWldKmZhY3RvcnNbbmYtaS0xXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpbnZfaXRhYiAmJiBmYWN0b3JzWzBdICE9IGZhY3RvcnNbbmYtMV0gKQorICAgICAgICAgICAgaXRhYiA9IChpbnQqKV93YXZlOworCisgICAgICAgIGlmKCAobiAmIDEpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYSA9IHJhZGl4WzFdLCBuYTIgPSBuKmE+PjEsIG5hNCA9IG5hMiA+PiAxOworICAgICAgICAgICAgbSA9IGljdmxvZzIobik7CisgICAgICAgIAorICAgICAgICAgICAgaWYoIG4gPD0gMiAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0YWJbMF0gPSAwOworICAgICAgICAgICAgICAgIGl0YWJbMV0gPSBuYTI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBuIDw9IDI1NiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNoaWZ0ID0gMTAgLSBtOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqID0gKGljdlJldlRhYmxlW2k+PjJdPj5zaGlmdCkqYTsKKyAgICAgICAgICAgICAgICAgICAgaXRhYltpXSA9IGo7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSsxXSA9IGogKyBuYTI7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSsyXSA9IGogKyBuYTQ7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSszXSA9IGogKyBuYTIgKyBuYTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzaGlmdCA9IDM0IC0gbTsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpNCA9IGkgPj4gMjsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGljdkJpdFJldihpNCxzaGlmdCkqYTsKKyAgICAgICAgICAgICAgICAgICAgaXRhYltpXSA9IGo7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSsxXSA9IGogKyBuYTI7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSsyXSA9IGogKyBuYTQ7CisgICAgICAgICAgICAgICAgICAgIGl0YWJbaSszXSA9IGogKyBuYTIgKyBuYTQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaWdpdHNbMV0rKzsKKworICAgICAgICAgICAgaWYoIG5mID49IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaSA9IG4sIGogPSByYWRpeFsyXTsgaSA8IG4wOyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0YWJbaStrXSA9IGl0YWJba10gKyBqOworICAgICAgICAgICAgICAgICAgICBpZiggKGkgKz0gbikgPj0gbjAgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGogKz0gcmFkaXhbMl07CisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDE7ICsrZGlnaXRzW2tdID49IGZhY3RvcnNba107IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2l0c1trXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBqICs9IHJhZGl4W2srMl0gLSByYWRpeFtrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDAsIGogPSAwOzsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGl0YWJbaV0gPSBqOworICAgICAgICAgICAgICAgIGlmKCArK2kgPj0gbjAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBqICs9IHJhZGl4WzFdOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7ICsrZGlnaXRzW2tdID49IGZhY3RvcnNba107IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkaWdpdHNba10gPSAwOworICAgICAgICAgICAgICAgICAgICBqICs9IHJhZGl4W2srMl0gLSByYWRpeFtrXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggaXRhYiAhPSBpdGFiMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGl0YWIwWzBdID0gMDsKKyAgICAgICAgICAgIGZvciggaSA9IG4wICYgMTsgaSA8IG4wOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBrMCA9IGl0YWJbaV07CisgICAgICAgICAgICAgICAgaW50IGsxID0gaXRhYltpKzFdOworICAgICAgICAgICAgICAgIGl0YWIwW2swXSA9IGk7CisgICAgICAgICAgICAgICAgaXRhYjBbazFdID0gaSsxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIChuMCAmIChuMC0xKSkgPT0gMCApCisgICAgeworICAgICAgICB3LnJlID0gdzEucmUgPSBpY3ZEeHRUYWJbbV1bMF07CisgICAgICAgIHcuaW0gPSB3MS5pbSA9IC1pY3ZEeHRUYWJbbV1bMV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHQgPSAtQ1ZfUEkqMi9uMDsKKyAgICAgICAgdy5pbSA9IHcxLmltID0gc2luKHQpOworICAgICAgICB3LnJlID0gdzEucmUgPSBzcXJ0KDEuIC0gdzEuaW0qdzEuaW0pOworICAgIH0KKyAgICBuID0gKG4wKzEpLzI7CisKKyAgICBpZiggZWxlbV9zaXplID09IHNpemVvZihDdkNvbXBsZXg2NGYpICkKKyAgICB7CisgICAgICAgIEN2Q29tcGxleDY0Ziogd2F2ZSA9IChDdkNvbXBsZXg2NGYqKV93YXZlOworCisgICAgICAgIHdhdmVbMF0ucmUgPSAxLjsKKyAgICAgICAgd2F2ZVswXS5pbSA9IDAuOworCisgICAgICAgIGlmKCAobjAgJiAxKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgd2F2ZVtuXS5yZSA9IC0xLjsKKyAgICAgICAgICAgIHdhdmVbbl0uaW0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMTsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhdmVbaV0gPSB3OworICAgICAgICAgICAgd2F2ZVtuMC1pXS5yZSA9IHcucmU7CisgICAgICAgICAgICB3YXZlW24wLWldLmltID0gLXcuaW07CisKKyAgICAgICAgICAgIHQgPSB3LnJlKncxLnJlIC0gdy5pbSp3MS5pbTsKKyAgICAgICAgICAgIHcuaW0gPSB3LnJlKncxLmltICsgdy5pbSp3MS5yZTsKKyAgICAgICAgICAgIHcucmUgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2Q29tcGxleDMyZiogd2F2ZSA9IChDdkNvbXBsZXgzMmYqKV93YXZlOworICAgICAgICBhc3NlcnQoIGVsZW1fc2l6ZSA9PSBzaXplb2YoQ3ZDb21wbGV4MzJmKSApOworICAgICAgICAKKyAgICAgICAgd2F2ZVswXS5yZSA9IDEuZjsKKyAgICAgICAgd2F2ZVswXS5pbSA9IDAuZjsKKworICAgICAgICBpZiggKG4wICYgMSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhdmVbbl0ucmUgPSAtMS5mOworICAgICAgICAgICAgd2F2ZVtuXS5pbSA9IDAuZjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDE7IGkgPCBuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICB3YXZlW2ldLnJlID0gKGZsb2F0KXcucmU7CisgICAgICAgICAgICB3YXZlW2ldLmltID0gKGZsb2F0KXcuaW07CisgICAgICAgICAgICB3YXZlW24wLWldLnJlID0gKGZsb2F0KXcucmU7CisgICAgICAgICAgICB3YXZlW24wLWldLmltID0gKGZsb2F0KS13LmltOworCisgICAgICAgICAgICB0ID0gdy5yZSp3MS5yZSAtIHcuaW0qdzEuaW07CisgICAgICAgICAgICB3LmltID0gdy5yZSp3MS5pbSArIHcuaW0qdzEucmU7CisgICAgICAgICAgICB3LnJlID0gdDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgY29uc3QgZG91YmxlIGljdl9zaW5fMTIwID0gMC44NjYwMjU0MDM3ODQ0Mzg2NDY3NjM3MjMxNzA3NTI5NDsKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2X3Npbl80NSA9IDAuNzA3MTA2NzgxMTg2NTQ3NTI0NDAwODQ0MzYyMTA0ODU7CitzdGF0aWMgY29uc3QgZG91YmxlIGljdl9mZnQ1XzIgPSAwLjU1OTAxNjk5NDM3NDk0NzQyNDEwMjI5MzQxNzE4MjgxOTsKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2X2ZmdDVfMyA9IC0wLjk1MTA1NjUxNjI5NTE1MzU3MjExNjQzOTMzMzM3OTM4MjsKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2X2ZmdDVfNCA9IC0xLjUzODg0MTc2ODU4NzYyNjcwMTI4NTE0NTI4ODAxODQ1NTsKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2X2ZmdDVfNSA9IDAuMzYzMjcxMjY0MDAyNjgwNDQyOTQ3NzMzMzc4NzQwMzA5OworCisjZGVmaW5lIElDVl9ERlRfTk9fUEVSTVVURSAyCisjZGVmaW5lIElDVl9ERlRfQ09NUExFWF9JTlBVVF9PUl9PVVRQVVQgNAorCisvLyBtaXhlZC1yYWRpeCBjb21wbGV4IGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtOiBkb3VibGUtcHJlY2lzaW9uIHZlcnNpb24KK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZERlRfNjRmYyggY29uc3QgQ3ZDb21wbGV4NjRmKiBzcmMsIEN2Q29tcGxleDY0ZiogZHN0LCBpbnQgbiwKKyAgICAgICAgICAgICBpbnQgbmYsIGludCogZmFjdG9ycywgY29uc3QgaW50KiBpdGFiLAorICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleDY0Ziogd2F2ZSwgaW50IHRhYl9zaXplLAorICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWMsIEN2Q29tcGxleDY0ZiogYnVmLAorICAgICAgICAgICAgIGludCBmbGFncywgZG91YmxlIHNjYWxlICkKK3sKKyAgICBpbnQgbjAgPSBuLCBmX2lkeCwgbng7CisgICAgaW50IGludiA9IGZsYWdzICYgQ1ZfRFhUX0lOVkVSU0U7CisgICAgaW50IGR3MCA9IHRhYl9zaXplLCBkdzsKKyAgICBpbnQgaSwgaiwgazsKKyAgICBDdkNvbXBsZXg2NGYgdDsKKyAgICBpbnQgdGFiX3N0ZXA7CisKKyAgICBpZiggc3BlYyApCisgICAgeworICAgICAgICBhc3NlcnQoIGljdkRGVEZ3ZF9DVG9DXzY0ZmNfcCAhPSAwICYmIGljdkRGVEludl9DVG9DXzY0ZmNfcCAhPSAwICk7CisgICAgICAgIHJldHVybiAhaW52ID8KKyAgICAgICAgICAgIGljdkRGVEZ3ZF9DVG9DXzY0ZmNfcCggc3JjLCBkc3QsIHNwZWMsIGJ1ZiApOgorICAgICAgICAgICAgaWN2REZUSW52X0NUb0NfNjRmY19wKCBzcmMsIGRzdCwgc3BlYywgYnVmICk7CisgICAgfQorCisgICAgdGFiX3N0ZXAgPSB0YWJfc2l6ZSA9PSBuID8gMSA6IHRhYl9zaXplID09IG4qMiA/IDIgOiB0YWJfc2l6ZS9uOworCisgICAgLy8gMC4gc2h1ZmZsZSBkYXRhCisgICAgaWYoIGRzdCAhPSBzcmMgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCAoZmxhZ3MgJiBJQ1ZfREZUX05PX1BFUk1VVEUpID09IDAgKTsKKyAgICAgICAgaWYoICFpbnYgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4gLSAyOyBpICs9IDIsIGl0YWIgKz0gMip0YWJfc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGswID0gaXRhYlswXSwgazEgPSBpdGFiW3RhYl9zdGVwXTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClrMCA8ICh1bnNpZ25lZCluICYmICh1bnNpZ25lZClrMSA8ICh1bnNpZ25lZCluICk7CisgICAgICAgICAgICAgICAgZHN0W2ldID0gc3JjW2swXTsgZHN0W2krMV0gPSBzcmNbazFdOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggaSA8IG4gKQorICAgICAgICAgICAgICAgIGRzdFtuLTFdID0gc3JjW24tMV07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4gLSAyOyBpICs9IDIsIGl0YWIgKz0gMip0YWJfc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGswID0gaXRhYlswXSwgazEgPSBpdGFiW3RhYl9zdGVwXTsKKyAgICAgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClrMCA8ICh1bnNpZ25lZCluICYmICh1bnNpZ25lZClrMSA8ICh1bnNpZ25lZCluICk7CisgICAgICAgICAgICAgICAgdC5yZSA9IHNyY1trMF0ucmU7IHQuaW0gPSAtc3JjW2swXS5pbTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSB0OworICAgICAgICAgICAgICAgIHQucmUgPSBzcmNbazFdLnJlOyB0LmltID0gLXNyY1trMV0uaW07CisgICAgICAgICAgICAgICAgZHN0W2krMV0gPSB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggaSA8IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHQucmUgPSBzcmNbbi0xXS5yZTsgdC5pbSA9IC1zcmNbbi0xXS5pbTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAoZmxhZ3MgJiBJQ1ZfREZUX05PX1BFUk1VVEUpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZmFjdG9yc1swXSAhPSBmYWN0b3JzW25mLTFdICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfSU5QTEFDRV9OT1RfU1VQUE9SVEVEX0VSUjsKKyAgICAgICAgICAgIGlmKCBuZiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggKG4gJiAzKSA9PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBuMiA9IG4vMjsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmKiBkc3RoID0gZHN0ICsgbjI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuMjsgaSArPSAyLCBpdGFiICs9IHRhYl9zdGVwKjIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBqID0gaXRhYlswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWogPCAodW5zaWduZWQpbjIgKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUChkc3RbaSsxXSwgZHN0aFtqXSwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaiA+IGkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoZHN0W2ldLCBkc3Rbal0sIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoZHN0aFtpKzFdLCBkc3RoW2orMV0sIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVsc2UgZG8gbm90aGluZworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKyssIGl0YWIgKz0gdGFiX3N0ZXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaiA9IGl0YWJbMF07CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWogPCAodW5zaWduZWQpbiApOworICAgICAgICAgICAgICAgICAgICBpZiggaiA+IGkgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUChkc3RbaV0sIGRzdFtqXSwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIGludiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDI7IGkgKz0gMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gLWRzdFtpXS5pbTsKKyAgICAgICAgICAgICAgICBkb3VibGUgdDEgPSAtZHN0W2krMV0uaW07CisgICAgICAgICAgICAgICAgZHN0W2ldLmltID0gdDA7IGRzdFtpKzFdLmltID0gdDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpIDwgbiApCisgICAgICAgICAgICAgICAgZHN0W24tMV0uaW0gPSAtZHN0W24tMV0uaW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBuID0gMTsKKyAgICAvLyAxLiBwb3dlci0yIHRyYW5zZm9ybXMKKyAgICBpZiggKGZhY3RvcnNbMF0gJiAxKSA9PSAwICkKKyAgICB7CisgICAgICAgIC8vIHJhZGl4LTQgdHJhbnNmb3JtCisgICAgICAgIGZvciggOyBuKjQgPD0gZmFjdG9yc1swXTsgKQorICAgICAgICB7CisgICAgICAgICAgICBueCA9IG47CisgICAgICAgICAgICBuICo9IDQ7CisgICAgICAgICAgICBkdzAgLz0gNDsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4wOyBpICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29tcGxleDY0ZiogdjA7CisgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmKiB2MTsKKyAgICAgICAgICAgICAgICBkb3VibGUgcjAsIGkwLCByMSwgaTEsIHIyLCBpMiwgcjMsIGkzLCByNCwgaTQ7CisKKyAgICAgICAgICAgICAgICB2MCA9IGRzdCArIGk7CisgICAgICAgICAgICAgICAgdjEgPSB2MCArIG54KjI7CisKKyAgICAgICAgICAgICAgICByMiA9IHYwWzBdLnJlOyBpMiA9IHYwWzBdLmltOworICAgICAgICAgICAgICAgIHIxID0gdjBbbnhdLnJlOyBpMSA9IHYwW254XS5pbTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByMCA9IHIxICsgcjI7IGkwID0gaTEgKyBpMjsKKyAgICAgICAgICAgICAgICByMiAtPSByMTsgaTIgLT0gaTE7CisKKyAgICAgICAgICAgICAgICBpMyA9IHYxW254XS5yZTsgcjMgPSB2MVtueF0uaW07CisgICAgICAgICAgICAgICAgaTQgPSB2MVswXS5yZTsgcjQgPSB2MVswXS5pbTsKKworICAgICAgICAgICAgICAgIHIxID0gaTQgKyBpMzsgaTEgPSByNCArIHIzOworICAgICAgICAgICAgICAgIHIzID0gcjQgLSByMzsgaTMgPSBpMyAtIGk0OworCisgICAgICAgICAgICAgICAgdjBbMF0ucmUgPSByMCArIHIxOyB2MFswXS5pbSA9IGkwICsgaTE7CisgICAgICAgICAgICAgICAgdjFbMF0ucmUgPSByMCAtIHIxOyB2MVswXS5pbSA9IGkwIC0gaTE7CisgICAgICAgICAgICAgICAgdjBbbnhdLnJlID0gcjIgKyByMzsgdjBbbnhdLmltID0gaTIgKyBpMzsKKyAgICAgICAgICAgICAgICB2MVtueF0ucmUgPSByMiAtIHIzOyB2MVtueF0uaW0gPSBpMiAtIGkzOworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMSwgZHcgPSBkdzA7IGogPCBueDsgaisrLCBkdyArPSBkdzAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdjAgPSBkc3QgKyBpICsgajsKKyAgICAgICAgICAgICAgICAgICAgdjEgPSB2MCArIG54KjI7CisKKyAgICAgICAgICAgICAgICAgICAgcjIgPSB2MFtueF0ucmUqd2F2ZVtkdyoyXS5yZSAtIHYwW254XS5pbSp3YXZlW2R3KjJdLmltOworICAgICAgICAgICAgICAgICAgICBpMiA9IHYwW254XS5yZSp3YXZlW2R3KjJdLmltICsgdjBbbnhdLmltKndhdmVbZHcqMl0ucmU7CisgICAgICAgICAgICAgICAgICAgIHIwID0gdjFbMF0ucmUqd2F2ZVtkd10uaW0gKyB2MVswXS5pbSp3YXZlW2R3XS5yZTsKKyAgICAgICAgICAgICAgICAgICAgaTAgPSB2MVswXS5yZSp3YXZlW2R3XS5yZSAtIHYxWzBdLmltKndhdmVbZHddLmltOworICAgICAgICAgICAgICAgICAgICByMyA9IHYxW254XS5yZSp3YXZlW2R3KjNdLmltICsgdjFbbnhdLmltKndhdmVbZHcqM10ucmU7CisgICAgICAgICAgICAgICAgICAgIGkzID0gdjFbbnhdLnJlKndhdmVbZHcqM10ucmUgLSB2MVtueF0uaW0qd2F2ZVtkdyozXS5pbTsKKworICAgICAgICAgICAgICAgICAgICByMSA9IGkwICsgaTM7IGkxID0gcjAgKyByMzsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSByMCAtIHIzOyBpMyA9IGkzIC0gaTA7CisgICAgICAgICAgICAgICAgICAgIHI0ID0gdjBbMF0ucmU7IGk0ID0gdjBbMF0uaW07CisKKyAgICAgICAgICAgICAgICAgICAgcjAgPSByNCArIHIyOyBpMCA9IGk0ICsgaTI7CisgICAgICAgICAgICAgICAgICAgIHIyID0gcjQgLSByMjsgaTIgPSBpNCAtIGkyOworCisgICAgICAgICAgICAgICAgICAgIHYwWzBdLnJlID0gcjAgKyByMTsgdjBbMF0uaW0gPSBpMCArIGkxOworICAgICAgICAgICAgICAgICAgICB2MVswXS5yZSA9IHIwIC0gcjE7IHYxWzBdLmltID0gaTAgLSBpMTsKKyAgICAgICAgICAgICAgICAgICAgdjBbbnhdLnJlID0gcjIgKyByMzsgdjBbbnhdLmltID0gaTIgKyBpMzsKKyAgICAgICAgICAgICAgICAgICAgdjFbbnhdLnJlID0gcjIgLSByMzsgdjFbbnhdLmltID0gaTIgLSBpMzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgbiA8IGZhY3RvcnNbMF07ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZG8gdGhlIHJlbWFpbmluZyByYWRpeC0yIHRyYW5zZm9ybQorICAgICAgICAgICAgbnggPSBuOworICAgICAgICAgICAgbiAqPSAyOworICAgICAgICAgICAgZHcwIC89IDI7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuMDsgaSArPSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkNvbXBsZXg2NGYqIHYgPSBkc3QgKyBpOworICAgICAgICAgICAgICAgIGRvdWJsZSByMCA9IHZbMF0ucmUgKyB2W254XS5yZTsKKyAgICAgICAgICAgICAgICBkb3VibGUgaTAgPSB2WzBdLmltICsgdltueF0uaW07CisgICAgICAgICAgICAgICAgZG91YmxlIHIxID0gdlswXS5yZSAtIHZbbnhdLnJlOworICAgICAgICAgICAgICAgIGRvdWJsZSBpMSA9IHZbMF0uaW0gLSB2W254XS5pbTsKKyAgICAgICAgICAgICAgICB2WzBdLnJlID0gcjA7IHZbMF0uaW0gPSBpMDsKKyAgICAgICAgICAgICAgICB2W254XS5yZSA9IHIxOyB2W254XS5pbSA9IGkxOworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMSwgZHcgPSBkdzA7IGogPCBueDsgaisrLCBkdyArPSBkdzAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGRzdCArIGkgKyBqOworICAgICAgICAgICAgICAgICAgICByMSA9IHZbbnhdLnJlKndhdmVbZHddLnJlIC0gdltueF0uaW0qd2F2ZVtkd10uaW07CisgICAgICAgICAgICAgICAgICAgIGkxID0gdltueF0uaW0qd2F2ZVtkd10ucmUgKyB2W254XS5yZSp3YXZlW2R3XS5pbTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSB2WzBdLnJlOyBpMCA9IHZbMF0uaW07CisKKyAgICAgICAgICAgICAgICAgICAgdlswXS5yZSA9IHIwICsgcjE7IHZbMF0uaW0gPSBpMCArIGkxOworICAgICAgICAgICAgICAgICAgICB2W254XS5yZSA9IHIwIC0gcjE7IHZbbnhdLmltID0gaTAgLSBpMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBhbGwgdGhlIG90aGVyIHRyYW5zZm9ybXMKKyAgICBmb3IoIGZfaWR4ID0gKGZhY3RvcnNbMF0mMSkgPyAwIDogMTsgZl9pZHggPCBuZjsgZl9pZHgrKyApCisgICAgeworICAgICAgICBpbnQgZmFjdG9yID0gZmFjdG9yc1tmX2lkeF07CisgICAgICAgIG54ID0gbjsKKyAgICAgICAgbiAqPSBmYWN0b3I7CisgICAgICAgIGR3MCAvPSBmYWN0b3I7CisKKyAgICAgICAgaWYoIGZhY3RvciA9PSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmFkaXgtMworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4wOyBpICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29tcGxleDY0ZiogdiA9IGRzdCArIGk7CisKKyAgICAgICAgICAgICAgICBkb3VibGUgcjEgPSB2W254XS5yZSArIHZbbngqMl0ucmU7CisgICAgICAgICAgICAgICAgZG91YmxlIGkxID0gdltueF0uaW0gKyB2W254KjJdLmltOworICAgICAgICAgICAgICAgIGRvdWJsZSByMCA9IHZbMF0ucmU7CisgICAgICAgICAgICAgICAgZG91YmxlIGkwID0gdlswXS5pbTsKKyAgICAgICAgICAgICAgICBkb3VibGUgcjIgPSBpY3Zfc2luXzEyMCoodltueF0uaW0gLSB2W254KjJdLmltKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgaTIgPSBpY3Zfc2luXzEyMCoodltueCoyXS5yZSAtIHZbbnhdLnJlKTsKKyAgICAgICAgICAgICAgICB2WzBdLnJlID0gcjAgKyByMTsgdlswXS5pbSA9IGkwICsgaTE7CisgICAgICAgICAgICAgICAgcjAgLT0gMC41KnIxOyBpMCAtPSAwLjUqaTE7CisgICAgICAgICAgICAgICAgdltueF0ucmUgPSByMCArIHIyOyB2W254XS5pbSA9IGkwICsgaTI7CisgICAgICAgICAgICAgICAgdltueCoyXS5yZSA9IHIwIC0gcjI7IHZbbngqMl0uaW0gPSBpMCAtIGkyOworCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMSwgZHcgPSBkdzA7IGogPCBueDsgaisrLCBkdyArPSBkdzAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdiA9IGRzdCArIGkgKyBqOworICAgICAgICAgICAgICAgICAgICByMCA9IHZbbnhdLnJlKndhdmVbZHddLnJlIC0gdltueF0uaW0qd2F2ZVtkd10uaW07CisgICAgICAgICAgICAgICAgICAgIGkwID0gdltueF0ucmUqd2F2ZVtkd10uaW0gKyB2W254XS5pbSp3YXZlW2R3XS5yZTsKKyAgICAgICAgICAgICAgICAgICAgaTIgPSB2W254KjJdLnJlKndhdmVbZHcqMl0ucmUgLSB2W254KjJdLmltKndhdmVbZHcqMl0uaW07CisgICAgICAgICAgICAgICAgICAgIHIyID0gdltueCoyXS5yZSp3YXZlW2R3KjJdLmltICsgdltueCoyXS5pbSp3YXZlW2R3KjJdLnJlOworICAgICAgICAgICAgICAgICAgICByMSA9IHIwICsgaTI7IGkxID0gaTAgKyByMjsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHIyID0gaWN2X3Npbl8xMjAqKGkwIC0gcjIpOyBpMiA9IGljdl9zaW5fMTIwKihpMiAtIHIwKTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSB2WzBdLnJlOyBpMCA9IHZbMF0uaW07CisgICAgICAgICAgICAgICAgICAgIHZbMF0ucmUgPSByMCArIHIxOyB2WzBdLmltID0gaTAgKyBpMTsKKyAgICAgICAgICAgICAgICAgICAgcjAgLT0gMC41KnIxOyBpMCAtPSAwLjUqaTE7CisgICAgICAgICAgICAgICAgICAgIHZbbnhdLnJlID0gcjAgKyByMjsgdltueF0uaW0gPSBpMCArIGkyOworICAgICAgICAgICAgICAgICAgICB2W254KjJdLnJlID0gcjAgLSByMjsgdltueCoyXS5pbSA9IGkwIC0gaTI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGZhY3RvciA9PSA1ICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmFkaXgtNQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4wOyBpICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDAsIGR3ID0gMDsgaiA8IG54OyBqKyssIGR3ICs9IGR3MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkNvbXBsZXg2NGYqIHYwID0gZHN0ICsgaSArIGo7CisgICAgICAgICAgICAgICAgICAgIEN2Q29tcGxleDY0ZiogdjEgPSB2MCArIG54KjI7CisgICAgICAgICAgICAgICAgICAgIEN2Q29tcGxleDY0ZiogdjIgPSB2MSArIG54KjI7CisKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIwLCBpMCwgcjEsIGkxLCByMiwgaTIsIHIzLCBpMywgcjQsIGk0LCByNSwgaTU7CisKKyAgICAgICAgICAgICAgICAgICAgcjMgPSB2MFtueF0ucmUqd2F2ZVtkd10ucmUgLSB2MFtueF0uaW0qd2F2ZVtkd10uaW07CisgICAgICAgICAgICAgICAgICAgIGkzID0gdjBbbnhdLnJlKndhdmVbZHddLmltICsgdjBbbnhdLmltKndhdmVbZHddLnJlOworICAgICAgICAgICAgICAgICAgICByMiA9IHYyWzBdLnJlKndhdmVbZHcqNF0ucmUgLSB2MlswXS5pbSp3YXZlW2R3KjRdLmltOworICAgICAgICAgICAgICAgICAgICBpMiA9IHYyWzBdLnJlKndhdmVbZHcqNF0uaW0gKyB2MlswXS5pbSp3YXZlW2R3KjRdLnJlOworCisgICAgICAgICAgICAgICAgICAgIHIxID0gcjMgKyByMjsgaTEgPSBpMyArIGkyOworICAgICAgICAgICAgICAgICAgICByMyAtPSByMjsgaTMgLT0gaTI7CisKKyAgICAgICAgICAgICAgICAgICAgcjQgPSB2MVtueF0ucmUqd2F2ZVtkdyozXS5yZSAtIHYxW254XS5pbSp3YXZlW2R3KjNdLmltOworICAgICAgICAgICAgICAgICAgICBpNCA9IHYxW254XS5yZSp3YXZlW2R3KjNdLmltICsgdjFbbnhdLmltKndhdmVbZHcqM10ucmU7CisgICAgICAgICAgICAgICAgICAgIHIwID0gdjFbMF0ucmUqd2F2ZVtkdyoyXS5yZSAtIHYxWzBdLmltKndhdmVbZHcqMl0uaW07CisgICAgICAgICAgICAgICAgICAgIGkwID0gdjFbMF0ucmUqd2F2ZVtkdyoyXS5pbSArIHYxWzBdLmltKndhdmVbZHcqMl0ucmU7CisKKyAgICAgICAgICAgICAgICAgICAgcjIgPSByNCArIHIwOyBpMiA9IGk0ICsgaTA7CisgICAgICAgICAgICAgICAgICAgIHI0IC09IHIwOyBpNCAtPSBpMDsKKworICAgICAgICAgICAgICAgICAgICByMCA9IHYwWzBdLnJlOyBpMCA9IHYwWzBdLmltOworICAgICAgICAgICAgICAgICAgICByNSA9IHIxICsgcjI7IGk1ID0gaTEgKyBpMjsKKworICAgICAgICAgICAgICAgICAgICB2MFswXS5yZSA9IHIwICsgcjU7IHYwWzBdLmltID0gaTAgKyBpNTsKKworICAgICAgICAgICAgICAgICAgICByMCAtPSAwLjI1KnI1OyBpMCAtPSAwLjI1Kmk1OworICAgICAgICAgICAgICAgICAgICByMSA9IGljdl9mZnQ1XzIqKHIxIC0gcjIpOyBpMSA9IGljdl9mZnQ1XzIqKGkxIC0gaTIpOworICAgICAgICAgICAgICAgICAgICByMiA9IC1pY3ZfZmZ0NV8zKihpMyArIGk0KTsgaTIgPSBpY3ZfZmZ0NV8zKihyMyArIHI0KTsKKworICAgICAgICAgICAgICAgICAgICBpMyAqPSAtaWN2X2ZmdDVfNTsgcjMgKj0gaWN2X2ZmdDVfNTsKKyAgICAgICAgICAgICAgICAgICAgaTQgKj0gLWljdl9mZnQ1XzQ7IHI0ICo9IGljdl9mZnQ1XzQ7CisKKyAgICAgICAgICAgICAgICAgICAgcjUgPSByMiArIGkzOyBpNSA9IGkyICsgcjM7CisgICAgICAgICAgICAgICAgICAgIHIyIC09IGk0OyBpMiAtPSByNDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHIzID0gcjAgKyByMTsgaTMgPSBpMCArIGkxOworICAgICAgICAgICAgICAgICAgICByMCAtPSByMTsgaTAgLT0gaTE7CisKKyAgICAgICAgICAgICAgICAgICAgdjBbbnhdLnJlID0gcjMgKyByMjsgdjBbbnhdLmltID0gaTMgKyBpMjsKKyAgICAgICAgICAgICAgICAgICAgdjJbMF0ucmUgPSByMyAtIHIyOyB2MlswXS5pbSA9IGkzIC0gaTI7CisKKyAgICAgICAgICAgICAgICAgICAgdjFbMF0ucmUgPSByMCArIHI1OyB2MVswXS5pbSA9IGkwICsgaTU7CisgICAgICAgICAgICAgICAgICAgIHYxW254XS5yZSA9IHIwIC0gcjU7IHYxW254XS5pbSA9IGkwIC0gaTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcmFkaXgtImZhY3RvciIgLSBhbiBvZGQgbnVtYmVyCisgICAgICAgICAgICBpbnQgcCwgcSwgZmFjdG9yMiA9IChmYWN0b3IgLSAxKS8yOworICAgICAgICAgICAgaW50IGQsIGRkLCBkd19mID0gdGFiX3NpemUvZmFjdG9yOworICAgICAgICAgICAgQ3ZDb21wbGV4NjRmKiBhID0gYnVmOworICAgICAgICAgICAgQ3ZDb21wbGV4NjRmKiBiID0gYnVmICsgZmFjdG9yMjsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4wOyBpICs9IG4gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDAsIGR3ID0gMDsgaiA8IG54OyBqKyssIGR3ICs9IGR3MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkNvbXBsZXg2NGYqIHYgPSBkc3QgKyBpICsgajsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmIHZfMCA9IHZbMF07CisgICAgICAgICAgICAgICAgICAgIEN2Q29tcGxleDY0ZiB2bl8wID0gdl8wOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBqID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHAgPSAxLCBrID0gbng7IHAgPD0gZmFjdG9yMjsgcCsrLCBrICs9IG54ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcjAgPSB2W2tdLnJlICsgdltuLWtdLnJlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMCA9IHZba10uaW0gLSB2W24ta10uaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIxID0gdltrXS5yZSAtIHZbbi1rXS5yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaTEgPSB2W2tdLmltICsgdltuLWtdLmltOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5fMC5yZSArPSByMDsgdm5fMC5pbSArPSBpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW3AtMV0ucmUgPSByMDsgYVtwLTFdLmltID0gaTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYltwLTFdLnJlID0gcjE7IGJbcC0xXS5pbSA9IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZDb21wbGV4NjRmKiB3YXZlXyA9IHdhdmUgKyBkdypmYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gZHc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggcCA9IDEsIGsgPSBueDsgcCA8PSBmYWN0b3IyOyBwKyssIGsgKz0gbngsIGQgKz0gZHcgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByMiA9IHZba10ucmUqd2F2ZVtkXS5yZSAtIHZba10uaW0qd2F2ZVtkXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaTIgPSB2W2tdLnJlKndhdmVbZF0uaW0gKyB2W2tdLmltKndhdmVbZF0ucmU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcjEgPSB2W24ta10ucmUqd2F2ZV9bLWRdLnJlIC0gdltuLWtdLmltKndhdmVfWy1kXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaTEgPSB2W24ta10ucmUqd2F2ZV9bLWRdLmltICsgdltuLWtdLmltKndhdmVfWy1kXS5yZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIwID0gcjIgKyByMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaTAgPSBpMiAtIGkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIxID0gcjIgLSByMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpMSA9IGkyICsgaTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bl8wLnJlICs9IHIwOyB2bl8wLmltICs9IGkxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbcC0xXS5yZSA9IHIwOyBhW3AtMV0uaW0gPSBpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiW3AtMV0ucmUgPSByMTsgYltwLTFdLmltID0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2WzBdID0gdm5fMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHAgPSAxLCBrID0gbng7IHAgPD0gZmFjdG9yMjsgcCsrLCBrICs9IG54ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmIHMwID0gdl8wLCBzMSA9IHZfMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkZCA9IGR3X2YqcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBxID0gMDsgcSA8IGZhY3RvcjI7IHErKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIwID0gd2F2ZVtkXS5yZSAqIGFbcV0ucmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGkwID0gd2F2ZVtkXS5pbSAqIGFbcV0uaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIxID0gd2F2ZVtkXS5yZSAqIGJbcV0uaW07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGkxID0gd2F2ZVtkXS5pbSAqIGJbcV0ucmU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMS5yZSArPSByMCArIGkwOyBzMC5yZSArPSByMCAtIGkwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxLmltICs9IHIxIC0gaTE7IHMwLmltICs9IHIxICsgaTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICs9IGRkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQgLT0gLShkID49IHRhYl9zaXplKSAmIHRhYl9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB2W2tdID0gczA7CisgICAgICAgICAgICAgICAgICAgICAgICB2W24ta10gPSBzMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBmYWJzKHNjYWxlIC0gMS4pID4gREJMX0VQU0lMT04gKQorICAgIHsKKyAgICAgICAgZG91YmxlIHJlX3NjYWxlID0gc2NhbGUsIGltX3NjYWxlID0gc2NhbGU7CisgICAgICAgIGlmKCBpbnYgKQorICAgICAgICAgICAgaW1fc2NhbGUgPSAtaW1fc2NhbGU7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4wOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdDAgPSBkc3RbaV0ucmUqcmVfc2NhbGU7CisgICAgICAgICAgICBkb3VibGUgdDEgPSBkc3RbaV0uaW0qaW1fc2NhbGU7CisgICAgICAgICAgICBkc3RbaV0ucmUgPSB0MDsKKyAgICAgICAgICAgIGRzdFtpXS5pbSA9IHQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGludiApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4wIC0gMjsgaSArPSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gLWRzdFtpXS5pbTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IC1kc3RbaSsxXS5pbTsKKyAgICAgICAgICAgIGRzdFtpXS5pbSA9IHQwOworICAgICAgICAgICAgZHN0W2krMV0uaW0gPSB0MTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpIDwgbjAgKQorICAgICAgICAgICAgZHN0W24wLTFdLmltID0gLWRzdFtuMC0xXS5pbTsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworLy8gbWl4ZWQtcmFkaXggY29tcGxleCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybTogc2luZ2xlLXByZWNpc2lvbiB2ZXJzaW9uCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTAoraWN2REZUXzMyZmMoIGNvbnN0IEN2Q29tcGxleDMyZiogc3JjLCBDdkNvbXBsZXgzMmYqIGRzdCwgaW50IG4sCisgICAgICAgICAgICAgaW50IG5mLCBpbnQqIGZhY3RvcnMsIGNvbnN0IGludCogaXRhYiwKKyAgICAgICAgICAgICBjb25zdCBDdkNvbXBsZXgzMmYqIHdhdmUsIGludCB0YWJfc2l6ZSwKKyAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcGVjLCBDdkNvbXBsZXgzMmYqIGJ1ZiwKKyAgICAgICAgICAgICBpbnQgZmxhZ3MsIGRvdWJsZSBzY2FsZSApCit7CisgICAgaW50IG4wID0gbiwgZl9pZHgsIG54OworICAgIGludCBpbnYgPSBmbGFncyAmIENWX0RYVF9JTlZFUlNFOworICAgIGludCBkdzAgPSB0YWJfc2l6ZSwgZHc7CisgICAgaW50IGksIGosIGs7CisgICAgQ3ZDb21wbGV4MzJmIHQ7CisgICAgaW50IHRhYl9zdGVwID0gdGFiX3NpemUgPT0gbiA/IDEgOiB0YWJfc2l6ZSA9PSBuKjIgPyAyIDogdGFiX3NpemUvbjsKKworICAgIGlmKCBzcGVjICkKKyAgICB7CisgICAgICAgIGFzc2VydCggaWN2REZURndkX0NUb0NfMzJmY19wICE9IDAgJiYgaWN2REZUSW52X0NUb0NfMzJmY19wICE9IDAgKTsKKyAgICAgICAgcmV0dXJuICFpbnYgPworICAgICAgICAgICAgaWN2REZURndkX0NUb0NfMzJmY19wKCBzcmMsIGRzdCwgc3BlYywgYnVmICk6CisgICAgICAgICAgICBpY3ZERlRJbnZfQ1RvQ18zMmZjX3AoIHNyYywgZHN0LCBzcGVjLCBidWYgKTsKKyAgICB9CisKKyAgICAvLyAwLiBzaHVmZmxlIGRhdGEKKyAgICBpZiggZHN0ICE9IHNyYyApCisgICAgeworICAgICAgICBhc3NlcnQoIChmbGFncyAmIElDVl9ERlRfTk9fUEVSTVVURSkgPT0gMCApOworICAgICAgICBpZiggIWludiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDI7IGkgKz0gMiwgaXRhYiArPSAyKnRhYl9zdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgazAgPSBpdGFiWzBdLCBrMSA9IGl0YWJbdGFiX3N0ZXBdOworICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWswIDwgKHVuc2lnbmVkKW4gJiYgKHVuc2lnbmVkKWsxIDwgKHVuc2lnbmVkKW4gKTsKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSBzcmNbazBdOyBkc3RbaSsxXSA9IHNyY1trMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpIDwgbiApCisgICAgICAgICAgICAgICAgZHN0W24tMV0gPSBzcmNbbi0xXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDI7IGkgKz0gMiwgaXRhYiArPSAyKnRhYl9zdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgazAgPSBpdGFiWzBdLCBrMSA9IGl0YWJbdGFiX3N0ZXBdOworICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWswIDwgKHVuc2lnbmVkKW4gJiYgKHVuc2lnbmVkKWsxIDwgKHVuc2lnbmVkKW4gKTsKKyAgICAgICAgICAgICAgICB0LnJlID0gc3JjW2swXS5yZTsgdC5pbSA9IC1zcmNbazBdLmltOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHQ7CisgICAgICAgICAgICAgICAgdC5yZSA9IHNyY1trMV0ucmU7IHQuaW0gPSAtc3JjW2sxXS5pbTsKKyAgICAgICAgICAgICAgICBkc3RbaSsxXSA9IHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpIDwgbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdC5yZSA9IHNyY1tuLTFdLnJlOyB0LmltID0gLXNyY1tuLTFdLmltOworICAgICAgICAgICAgICAgIGRzdFtpXSA9IHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIChmbGFncyAmIElDVl9ERlRfTk9fUEVSTVVURSkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBmYWN0b3JzWzBdICE9IGZhY3RvcnNbbmYtMV0gKQorICAgICAgICAgICAgICAgIHJldHVybiBDVl9JTlBMQUNFX05PVF9TVVBQT1JURURfRVJSOworICAgICAgICAgICAgaWYoIG5mID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAobiAmIDMpID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG4yID0gbi8yOworICAgICAgICAgICAgICAgICAgICBDdkNvbXBsZXgzMmYqIGRzdGggPSBkc3QgKyBuMjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4yOyBpICs9IDIsIGl0YWIgKz0gdGFiX3N0ZXAqMiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGogPSBpdGFiWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpaiA8ICh1bnNpZ25lZCluMiApOworCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKGRzdFtpKzFdLCBkc3RoW2pdLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBqID4gaSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUChkc3RbaV0sIGRzdFtqXSwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUChkc3RoW2krMV0sIGRzdGhbaisxXSwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gZWxzZSBkbyBub3RoaW5nCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgCisgICAgICAgICAgICAgICAgaSA8IG47IAorICAgICAgICAgICAgICAgIGkrKykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGogPSBpdGFiWzBdOworICAgICAgICAgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClqIDwgKHVuc2lnbmVkKW4gKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGogPiBpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoZHN0W2ldLCBkc3Rbal0sIHQpOworICAgICAgICAgICAgICAgICAgICBpdGFiICs9IHRhYl9zdGVwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpbnYgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBjb25qdWdhdGUgdGhlIHZlY3RvciAtIGkuZS4gaW52ZXJ0IHNpZ24gb2YgdGhlIGltYWdpbmFyeSBwYXJ0CisgICAgICAgICAgICBpbnQqIGlkc3QgPSAoaW50Kilkc3Q7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4gLSAyOyBpICs9IDIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0MCA9IGlkc3RbaSoyKzFdIF4gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgICAgICBpbnQgdDEgPSBpZHN0W2kqMiszXSBeIDB4ODAwMDAwMDA7CisgICAgICAgICAgICAgICAgaWRzdFtpKjIrMV0gPSB0MDsgaWRzdFtpKjIrM10gPSB0MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGkgPCBuICkKKyAgICAgICAgICAgICAgICBpZHN0WzIqaSsxXSBePSAweDgwMDAwMDAwOworICAgICAgICB9CisgICAgfQorCisgICAgbiA9IDE7CisgICAgLy8gMS4gcG93ZXItMiB0cmFuc2Zvcm1zCisgICAgaWYoIChmYWN0b3JzWzBdICYgMSkgPT0gMCApCisgICAgeworICAgICAgICAvLyByYWRpeC00IHRyYW5zZm9ybQorICAgICAgICBmb3IoIDsgbio0IDw9IGZhY3RvcnNbMF07ICkKKyAgICAgICAgeworICAgICAgICAgICAgbnggPSBuOworICAgICAgICAgICAgbiAqPSA0OworICAgICAgICAgICAgZHcwIC89IDQ7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuMDsgaSArPSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkNvbXBsZXgzMmYqIHYwOworICAgICAgICAgICAgICAgIEN2Q29tcGxleDMyZiogdjE7CisgICAgICAgICAgICAgICAgZG91YmxlIHIwLCBpMCwgcjEsIGkxLCByMiwgaTIsIHIzLCBpMywgcjQsIGk0OworCisgICAgICAgICAgICAgICAgdjAgPSBkc3QgKyBpOworICAgICAgICAgICAgICAgIHYxID0gdjAgKyBueCoyOworCisgICAgICAgICAgICAgICAgcjIgPSB2MFswXS5yZTsgaTIgPSB2MFswXS5pbTsKKyAgICAgICAgICAgICAgICByMSA9IHYwW254XS5yZTsgaTEgPSB2MFtueF0uaW07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcjAgPSByMSArIHIyOyBpMCA9IGkxICsgaTI7CisgICAgICAgICAgICAgICAgcjIgLT0gcjE7IGkyIC09IGkxOworCisgICAgICAgICAgICAgICAgaTMgPSB2MVtueF0ucmU7IHIzID0gdjFbbnhdLmltOworICAgICAgICAgICAgICAgIGk0ID0gdjFbMF0ucmU7IHI0ID0gdjFbMF0uaW07CisKKyAgICAgICAgICAgICAgICByMSA9IGk0ICsgaTM7IGkxID0gcjQgKyByMzsKKyAgICAgICAgICAgICAgICByMyA9IHI0IC0gcjM7IGkzID0gaTMgLSBpNDsKKworICAgICAgICAgICAgICAgIHYwWzBdLnJlID0gKGZsb2F0KShyMCArIHIxKTsgdjBbMF0uaW0gPSAoZmxvYXQpKGkwICsgaTEpOworICAgICAgICAgICAgICAgIHYxWzBdLnJlID0gKGZsb2F0KShyMCAtIHIxKTsgdjFbMF0uaW0gPSAoZmxvYXQpKGkwIC0gaTEpOworICAgICAgICAgICAgICAgIHYwW254XS5yZSA9IChmbG9hdCkocjIgKyByMyk7IHYwW254XS5pbSA9IChmbG9hdCkoaTIgKyBpMyk7CisgICAgICAgICAgICAgICAgdjFbbnhdLnJlID0gKGZsb2F0KShyMiAtIHIzKTsgdjFbbnhdLmltID0gKGZsb2F0KShpMiAtIGkzKTsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDEsIGR3ID0gZHcwOyBqIDwgbng7IGorKywgZHcgKz0gZHcwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHYwID0gZHN0ICsgaSArIGo7CisgICAgICAgICAgICAgICAgICAgIHYxID0gdjAgKyBueCoyOworCisgICAgICAgICAgICAgICAgICAgIHIyID0gdjBbbnhdLnJlKndhdmVbZHcqMl0ucmUgLSB2MFtueF0uaW0qd2F2ZVtkdyoyXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgaTIgPSB2MFtueF0ucmUqd2F2ZVtkdyoyXS5pbSArIHYwW254XS5pbSp3YXZlW2R3KjJdLnJlOworICAgICAgICAgICAgICAgICAgICByMCA9IHYxWzBdLnJlKndhdmVbZHddLmltICsgdjFbMF0uaW0qd2F2ZVtkd10ucmU7CisgICAgICAgICAgICAgICAgICAgIGkwID0gdjFbMF0ucmUqd2F2ZVtkd10ucmUgLSB2MVswXS5pbSp3YXZlW2R3XS5pbTsKKyAgICAgICAgICAgICAgICAgICAgcjMgPSB2MVtueF0ucmUqd2F2ZVtkdyozXS5pbSArIHYxW254XS5pbSp3YXZlW2R3KjNdLnJlOworICAgICAgICAgICAgICAgICAgICBpMyA9IHYxW254XS5yZSp3YXZlW2R3KjNdLnJlIC0gdjFbbnhdLmltKndhdmVbZHcqM10uaW07CisKKyAgICAgICAgICAgICAgICAgICAgcjEgPSBpMCArIGkzOyBpMSA9IHIwICsgcjM7CisgICAgICAgICAgICAgICAgICAgIHIzID0gcjAgLSByMzsgaTMgPSBpMyAtIGkwOworICAgICAgICAgICAgICAgICAgICByNCA9IHYwWzBdLnJlOyBpNCA9IHYwWzBdLmltOworCisgICAgICAgICAgICAgICAgICAgIHIwID0gcjQgKyByMjsgaTAgPSBpNCArIGkyOworICAgICAgICAgICAgICAgICAgICByMiA9IHI0IC0gcjI7IGkyID0gaTQgLSBpMjsKKworICAgICAgICAgICAgICAgICAgICB2MFswXS5yZSA9IChmbG9hdCkocjAgKyByMSk7IHYwWzBdLmltID0gKGZsb2F0KShpMCArIGkxKTsKKyAgICAgICAgICAgICAgICAgICAgdjFbMF0ucmUgPSAoZmxvYXQpKHIwIC0gcjEpOyB2MVswXS5pbSA9IChmbG9hdCkoaTAgLSBpMSk7CisgICAgICAgICAgICAgICAgICAgIHYwW254XS5yZSA9IChmbG9hdCkocjIgKyByMyk7IHYwW254XS5pbSA9IChmbG9hdCkoaTIgKyBpMyk7CisgICAgICAgICAgICAgICAgICAgIHYxW254XS5yZSA9IChmbG9hdCkocjIgLSByMyk7IHYxW254XS5pbSA9IChmbG9hdCkoaTIgLSBpMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IG4gPCBmYWN0b3JzWzBdOyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGRvIHRoZSByZW1haW5pbmcgcmFkaXgtMiB0cmFuc2Zvcm0KKyAgICAgICAgICAgIG54ID0gbjsKKyAgICAgICAgICAgIG4gKj0gMjsKKyAgICAgICAgICAgIGR3MCAvPSAyOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjA7IGkgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZDb21wbGV4MzJmKiB2ID0gZHN0ICsgaTsKKyAgICAgICAgICAgICAgICBkb3VibGUgcjAgPSB2WzBdLnJlICsgdltueF0ucmU7CisgICAgICAgICAgICAgICAgZG91YmxlIGkwID0gdlswXS5pbSArIHZbbnhdLmltOworICAgICAgICAgICAgICAgIGRvdWJsZSByMSA9IHZbMF0ucmUgLSB2W254XS5yZTsKKyAgICAgICAgICAgICAgICBkb3VibGUgaTEgPSB2WzBdLmltIC0gdltueF0uaW07CisgICAgICAgICAgICAgICAgdlswXS5yZSA9IChmbG9hdClyMDsgdlswXS5pbSA9IChmbG9hdClpMDsKKyAgICAgICAgICAgICAgICB2W254XS5yZSA9IChmbG9hdClyMTsgdltueF0uaW0gPSAoZmxvYXQpaTE7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxLCBkdyA9IGR3MDsgaiA8IG54OyBqKyssIGR3ICs9IGR3MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ID0gZHN0ICsgaSArIGo7CisgICAgICAgICAgICAgICAgICAgIHIxID0gdltueF0ucmUqd2F2ZVtkd10ucmUgLSB2W254XS5pbSp3YXZlW2R3XS5pbTsKKyAgICAgICAgICAgICAgICAgICAgaTEgPSB2W254XS5pbSp3YXZlW2R3XS5yZSArIHZbbnhdLnJlKndhdmVbZHddLmltOworICAgICAgICAgICAgICAgICAgICByMCA9IHZbMF0ucmU7IGkwID0gdlswXS5pbTsKKworICAgICAgICAgICAgICAgICAgICB2WzBdLnJlID0gKGZsb2F0KShyMCArIHIxKTsgdlswXS5pbSA9IChmbG9hdCkoaTAgKyBpMSk7CisgICAgICAgICAgICAgICAgICAgIHZbbnhdLnJlID0gKGZsb2F0KShyMCAtIHIxKTsgdltueF0uaW0gPSAoZmxvYXQpKGkwIC0gaTEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDIuIGFsbCB0aGUgb3RoZXIgdHJhbnNmb3JtcworICAgIGZvciggZl9pZHggPSAoZmFjdG9yc1swXSYxKSA/IDAgOiAxOyBmX2lkeCA8IG5mOyBmX2lkeCsrICkKKyAgICB7CisgICAgICAgIGludCBmYWN0b3IgPSBmYWN0b3JzW2ZfaWR4XTsKKyAgICAgICAgbnggPSBuOworICAgICAgICBuICo9IGZhY3RvcjsKKyAgICAgICAgZHcwIC89IGZhY3RvcjsKKworICAgICAgICBpZiggZmFjdG9yID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyByYWRpeC0zCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjA7IGkgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZDb21wbGV4MzJmKiB2ID0gZHN0ICsgaTsKKworICAgICAgICAgICAgICAgIGRvdWJsZSByMSA9IHZbbnhdLnJlICsgdltueCoyXS5yZTsKKyAgICAgICAgICAgICAgICBkb3VibGUgaTEgPSB2W254XS5pbSArIHZbbngqMl0uaW07CisgICAgICAgICAgICAgICAgZG91YmxlIHIwID0gdlswXS5yZTsKKyAgICAgICAgICAgICAgICBkb3VibGUgaTAgPSB2WzBdLmltOworICAgICAgICAgICAgICAgIGRvdWJsZSByMiA9IGljdl9zaW5fMTIwKih2W254XS5pbSAtIHZbbngqMl0uaW0pOworICAgICAgICAgICAgICAgIGRvdWJsZSBpMiA9IGljdl9zaW5fMTIwKih2W254KjJdLnJlIC0gdltueF0ucmUpOworICAgICAgICAgICAgICAgIHZbMF0ucmUgPSAoZmxvYXQpKHIwICsgcjEpOyB2WzBdLmltID0gKGZsb2F0KShpMCArIGkxKTsKKyAgICAgICAgICAgICAgICByMCAtPSAwLjUqcjE7IGkwIC09IDAuNSppMTsKKyAgICAgICAgICAgICAgICB2W254XS5yZSA9IChmbG9hdCkocjAgKyByMik7IHZbbnhdLmltID0gKGZsb2F0KShpMCArIGkyKTsKKyAgICAgICAgICAgICAgICB2W254KjJdLnJlID0gKGZsb2F0KShyMCAtIHIyKTsgdltueCoyXS5pbSA9IChmbG9hdCkoaTAgLSBpMik7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxLCBkdyA9IGR3MDsgaiA8IG54OyBqKyssIGR3ICs9IGR3MCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2ID0gZHN0ICsgaSArIGo7CisgICAgICAgICAgICAgICAgICAgIHIwID0gdltueF0ucmUqd2F2ZVtkd10ucmUgLSB2W254XS5pbSp3YXZlW2R3XS5pbTsKKyAgICAgICAgICAgICAgICAgICAgaTAgPSB2W254XS5yZSp3YXZlW2R3XS5pbSArIHZbbnhdLmltKndhdmVbZHddLnJlOworICAgICAgICAgICAgICAgICAgICBpMiA9IHZbbngqMl0ucmUqd2F2ZVtkdyoyXS5yZSAtIHZbbngqMl0uaW0qd2F2ZVtkdyoyXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgcjIgPSB2W254KjJdLnJlKndhdmVbZHcqMl0uaW0gKyB2W254KjJdLmltKndhdmVbZHcqMl0ucmU7CisgICAgICAgICAgICAgICAgICAgIHIxID0gcjAgKyBpMjsgaTEgPSBpMCArIHIyOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcjIgPSBpY3Zfc2luXzEyMCooaTAgLSByMik7IGkyID0gaWN2X3Npbl8xMjAqKGkyIC0gcjApOworICAgICAgICAgICAgICAgICAgICByMCA9IHZbMF0ucmU7IGkwID0gdlswXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgdlswXS5yZSA9IChmbG9hdCkocjAgKyByMSk7IHZbMF0uaW0gPSAoZmxvYXQpKGkwICsgaTEpOworICAgICAgICAgICAgICAgICAgICByMCAtPSAwLjUqcjE7IGkwIC09IDAuNSppMTsKKyAgICAgICAgICAgICAgICAgICAgdltueF0ucmUgPSAoZmxvYXQpKHIwICsgcjIpOyB2W254XS5pbSA9IChmbG9hdCkoaTAgKyBpMik7CisgICAgICAgICAgICAgICAgICAgIHZbbngqMl0ucmUgPSAoZmxvYXQpKHIwIC0gcjIpOyB2W254KjJdLmltID0gKGZsb2F0KShpMCAtIGkyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggZmFjdG9yID09IDUgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyByYWRpeC01CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjA7IGkgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMCwgZHcgPSAwOyBqIDwgbng7IGorKywgZHcgKz0gZHcwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2Q29tcGxleDMyZiogdjAgPSBkc3QgKyBpICsgajsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4MzJmKiB2MSA9IHYwICsgbngqMjsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4MzJmKiB2MiA9IHYxICsgbngqMjsKKworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcjAsIGkwLCByMSwgaTEsIHIyLCBpMiwgcjMsIGkzLCByNCwgaTQsIHI1LCBpNTsKKworICAgICAgICAgICAgICAgICAgICByMyA9IHYwW254XS5yZSp3YXZlW2R3XS5yZSAtIHYwW254XS5pbSp3YXZlW2R3XS5pbTsKKyAgICAgICAgICAgICAgICAgICAgaTMgPSB2MFtueF0ucmUqd2F2ZVtkd10uaW0gKyB2MFtueF0uaW0qd2F2ZVtkd10ucmU7CisgICAgICAgICAgICAgICAgICAgIHIyID0gdjJbMF0ucmUqd2F2ZVtkdyo0XS5yZSAtIHYyWzBdLmltKndhdmVbZHcqNF0uaW07CisgICAgICAgICAgICAgICAgICAgIGkyID0gdjJbMF0ucmUqd2F2ZVtkdyo0XS5pbSArIHYyWzBdLmltKndhdmVbZHcqNF0ucmU7CisKKyAgICAgICAgICAgICAgICAgICAgcjEgPSByMyArIHIyOyBpMSA9IGkzICsgaTI7CisgICAgICAgICAgICAgICAgICAgIHIzIC09IHIyOyBpMyAtPSBpMjsKKworICAgICAgICAgICAgICAgICAgICByNCA9IHYxW254XS5yZSp3YXZlW2R3KjNdLnJlIC0gdjFbbnhdLmltKndhdmVbZHcqM10uaW07CisgICAgICAgICAgICAgICAgICAgIGk0ID0gdjFbbnhdLnJlKndhdmVbZHcqM10uaW0gKyB2MVtueF0uaW0qd2F2ZVtkdyozXS5yZTsKKyAgICAgICAgICAgICAgICAgICAgcjAgPSB2MVswXS5yZSp3YXZlW2R3KjJdLnJlIC0gdjFbMF0uaW0qd2F2ZVtkdyoyXS5pbTsKKyAgICAgICAgICAgICAgICAgICAgaTAgPSB2MVswXS5yZSp3YXZlW2R3KjJdLmltICsgdjFbMF0uaW0qd2F2ZVtkdyoyXS5yZTsKKworICAgICAgICAgICAgICAgICAgICByMiA9IHI0ICsgcjA7IGkyID0gaTQgKyBpMDsKKyAgICAgICAgICAgICAgICAgICAgcjQgLT0gcjA7IGk0IC09IGkwOworCisgICAgICAgICAgICAgICAgICAgIHIwID0gdjBbMF0ucmU7IGkwID0gdjBbMF0uaW07CisgICAgICAgICAgICAgICAgICAgIHI1ID0gcjEgKyByMjsgaTUgPSBpMSArIGkyOworCisgICAgICAgICAgICAgICAgICAgIHYwWzBdLnJlID0gKGZsb2F0KShyMCArIHI1KTsgdjBbMF0uaW0gPSAoZmxvYXQpKGkwICsgaTUpOworCisgICAgICAgICAgICAgICAgICAgIHIwIC09IDAuMjUqcjU7IGkwIC09IDAuMjUqaTU7CisgICAgICAgICAgICAgICAgICAgIHIxID0gaWN2X2ZmdDVfMioocjEgLSByMik7IGkxID0gaWN2X2ZmdDVfMiooaTEgLSBpMik7CisgICAgICAgICAgICAgICAgICAgIHIyID0gLWljdl9mZnQ1XzMqKGkzICsgaTQpOyBpMiA9IGljdl9mZnQ1XzMqKHIzICsgcjQpOworCisgICAgICAgICAgICAgICAgICAgIGkzICo9IC1pY3ZfZmZ0NV81OyByMyAqPSBpY3ZfZmZ0NV81OworICAgICAgICAgICAgICAgICAgICBpNCAqPSAtaWN2X2ZmdDVfNDsgcjQgKj0gaWN2X2ZmdDVfNDsKKworICAgICAgICAgICAgICAgICAgICByNSA9IHIyICsgaTM7IGk1ID0gaTIgKyByMzsKKyAgICAgICAgICAgICAgICAgICAgcjIgLT0gaTQ7IGkyIC09IHI0OworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgcjMgPSByMCArIHIxOyBpMyA9IGkwICsgaTE7CisgICAgICAgICAgICAgICAgICAgIHIwIC09IHIxOyBpMCAtPSBpMTsKKworICAgICAgICAgICAgICAgICAgICB2MFtueF0ucmUgPSAoZmxvYXQpKHIzICsgcjIpOyB2MFtueF0uaW0gPSAoZmxvYXQpKGkzICsgaTIpOworICAgICAgICAgICAgICAgICAgICB2MlswXS5yZSA9IChmbG9hdCkocjMgLSByMik7IHYyWzBdLmltID0gKGZsb2F0KShpMyAtIGkyKTsKKworICAgICAgICAgICAgICAgICAgICB2MVswXS5yZSA9IChmbG9hdCkocjAgKyByNSk7IHYxWzBdLmltID0gKGZsb2F0KShpMCArIGk1KTsKKyAgICAgICAgICAgICAgICAgICAgdjFbbnhdLnJlID0gKGZsb2F0KShyMCAtIHI1KTsgdjFbbnhdLmltID0gKGZsb2F0KShpMCAtIGk1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvLyByYWRpeC0iZmFjdG9yIiAtIGFuIG9kZCBudW1iZXIKKyAgICAgICAgICAgIGludCBwLCBxLCBmYWN0b3IyID0gKGZhY3RvciAtIDEpLzI7CisgICAgICAgICAgICBpbnQgZCwgZGQsIGR3X2YgPSB0YWJfc2l6ZS9mYWN0b3I7CisgICAgICAgICAgICBDdkNvbXBsZXgzMmYqIGEgPSBidWY7CisgICAgICAgICAgICBDdkNvbXBsZXgzMmYqIGIgPSBidWYgKyBmYWN0b3IyOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjA7IGkgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMCwgZHcgPSAwOyBqIDwgbng7IGorKywgZHcgKz0gZHcwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2Q29tcGxleDMyZiogdiA9IGRzdCArIGkgKyBqOworICAgICAgICAgICAgICAgICAgICBDdkNvbXBsZXgzMmYgdl8wID0gdlswXTsKKyAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmIHZuXzAodl8wKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggaiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBwID0gMSwgayA9IG54OyBwIDw9IGZhY3RvcjI7IHArKywgayArPSBueCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIwID0gdltrXS5yZSArIHZbbi1rXS5yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaTAgPSB2W2tdLmltIC0gdltuLWtdLmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByMSA9IHZba10ucmUgLSB2W24ta10ucmU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGkxID0gdltrXS5pbSArIHZbbi1rXS5pbTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuXzAucmUgKz0gcjA7IHZuXzAuaW0gKz0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtwLTFdLnJlID0gKGZsb2F0KXIwOyBhW3AtMV0uaW0gPSAoZmxvYXQpaTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYltwLTFdLnJlID0gKGZsb2F0KXIxOyBiW3AtMV0uaW0gPSAoZmxvYXQpaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkNvbXBsZXgzMmYqIHdhdmVfID0gd2F2ZSArIGR3KmZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBkdzsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBwID0gMSwgayA9IG54OyBwIDw9IGZhY3RvcjI7IHArKywgayArPSBueCwgZCArPSBkdyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHIyID0gdltrXS5yZSp3YXZlW2RdLnJlIC0gdltrXS5pbSp3YXZlW2RdLmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMiA9IHZba10ucmUqd2F2ZVtkXS5pbSArIHZba10uaW0qd2F2ZVtkXS5yZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByMSA9IHZbbi1rXS5yZSp3YXZlX1stZF0ucmUgLSB2W24ta10uaW0qd2F2ZV9bLWRdLmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMSA9IHZbbi1rXS5yZSp3YXZlX1stZF0uaW0gKyB2W24ta10uaW0qd2F2ZV9bLWRdLnJlOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcjAgPSByMiArIHIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMCA9IGkyIC0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjEgPSByMiAtIHIxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkxID0gaTIgKyBpMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuXzAucmUgKz0gcjA7IHZuXzAuaW0gKz0gaTE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVtwLTFdLnJlID0gKGZsb2F0KXIwOyBhW3AtMV0uaW0gPSAoZmxvYXQpaTA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYltwLTFdLnJlID0gKGZsb2F0KXIxOyBiW3AtMV0uaW0gPSAoZmxvYXQpaTE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB2WzBdLnJlID0gKGZsb2F0KXZuXzAucmU7CisgICAgICAgICAgICAgICAgICAgIHZbMF0uaW0gPSAoZmxvYXQpdm5fMC5pbTsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIHAgPSAxLCBrID0gbng7IHAgPD0gZmFjdG9yMjsgcCsrLCBrICs9IG54ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQ3ZDb21wbGV4NjRmIHMwKHZfMCksIHMxID0gczA7CisgICAgICAgICAgICAgICAgICAgICAgICBkID0gZGQgPSBkd19mKnA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggcSA9IDA7IHEgPCBmYWN0b3IyOyBxKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByMCA9IHdhdmVbZF0ucmUgKiBhW3FdLnJlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMCA9IHdhdmVbZF0uaW0gKiBhW3FdLmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByMSA9IHdhdmVbZF0ucmUgKiBiW3FdLmltOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpMSA9IHdhdmVbZF0uaW0gKiBiW3FdLnJlOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEucmUgKz0gcjAgKyBpMDsgczAucmUgKz0gcjAgLSBpMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMS5pbSArPSByMSAtIGkxOyBzMC5pbSArPSByMSArIGkxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZCArPSBkZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkIC09IC0oZCA+PSB0YWJfc2l6ZSkgJiB0YWJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgdltrXS5yZSA9IChmbG9hdClzMC5yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZba10uaW0gPSAoZmxvYXQpczAuaW07CisgICAgICAgICAgICAgICAgICAgICAgICB2W24ta10ucmUgPSAoZmxvYXQpczEucmU7CisgICAgICAgICAgICAgICAgICAgICAgICB2W24ta10uaW0gPSAoZmxvYXQpczEuaW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggZmFicyhzY2FsZSAtIDEuKSA+IERCTF9FUFNJTE9OICkKKyAgICB7CisgICAgICAgIGRvdWJsZSByZV9zY2FsZSA9IHNjYWxlLCBpbV9zY2FsZSA9IHNjYWxlOworICAgICAgICBpZiggaW52ICkKKyAgICAgICAgICAgIGltX3NjYWxlID0gLWltX3NjYWxlOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuMDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gZHN0W2ldLnJlKnJlX3NjYWxlOworICAgICAgICAgICAgZG91YmxlIHQxID0gZHN0W2ldLmltKmltX3NjYWxlOworICAgICAgICAgICAgZHN0W2ldLnJlID0gKGZsb2F0KXQwOworICAgICAgICAgICAgZHN0W2ldLmltID0gKGZsb2F0KXQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGludiApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4wIC0gMjsgaSArPSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gLWRzdFtpXS5pbTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IC1kc3RbaSsxXS5pbTsKKyAgICAgICAgICAgIGRzdFtpXS5pbSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgIGRzdFtpKzFdLmltID0gKGZsb2F0KXQxOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGkgPCBuMCApCisgICAgICAgICAgICBkc3RbbjAtMV0uaW0gPSAtZHN0W24wLTFdLmltOworICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKiBGRlQgb2YgcmVhbCB2ZWN0b3IKKyAgIG91dHB1dCB2ZWN0b3IgZm9ybWF0OgorICAgICByZSgwKSwgcmUoMSksIGltKDEpLCAuLi4gLCByZShuLzItMSksIGltKChuKzEpLzItMSkgWywgcmUoKG4rMSkvMildIE9SIC4uLgorICAgICByZSgwKSwgMCwgcmUoMSksIGltKDEpLCAuLi4sIHJlKG4vMi0xKSwgaW0oKG4rMSkvMi0xKSBbLCByZSgobisxKS8yKSwgMF0gKi8KKyNkZWZpbmUgSUNWX1JFQUxfREZUKCBmbGF2b3IsIGRhdGF0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlJlYWxERlRfIyNmbGF2b3IoIGNvbnN0IGRhdGF0eXBlKiBzcmMsIGRhdGF0eXBlKiBkc3QsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgbmYsIGludCogZmFjdG9ycywgY29uc3QgaW50KiBpdGFiLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleCMjZmxhdm9yKiB3YXZlLCBpbnQgdGFiX3NpemUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWMsIEN2Q29tcGxleCMjZmxhdm9yKiBidWYsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgZG91YmxlIHNjYWxlICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY29tcGxleF9vdXRwdXQgPSAoZmxhZ3MgJiBJQ1ZfREZUX0NPTVBMRVhfSU5QVVRfT1JfT1VUUFVUKSAhPSAwO1wKKyAgICBpbnQgaiwgbjIgPSBuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gY29tcGxleF9vdXRwdXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc3BlYyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2REZURndkX1JUb1BhY2tfIyNmbGF2b3IjI19wKCBzcmMsIGRzdCwgc3BlYywgYnVmICk7ICAgICAgICAgIFwKKyAgICAgICAgZ290byBmaW5hbGl6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIHRhYl9zaXplID09IG4gKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggbiA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gKGRhdGF0eXBlKShzcmNbMF0qc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKCBuID09IDIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHQgPSAoc3JjWzBdICsgc3JjWzFdKSpzY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzFdID0gKGRhdGF0eXBlKSgoc3JjWzBdIC0gc3JjWzFdKSpzY2FsZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gKGRhdGF0eXBlKXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKCBuICYgMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0IC09IGNvbXBsZXhfb3V0cHV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ3ZDb21wbGV4IyNmbGF2b3IqIF9kc3QgPSAoQ3ZDb21wbGV4IyNmbGF2b3IqKWRzdDsgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RzdFswXS5yZSA9IChkYXRhdHlwZSkoc3JjWzBdKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX2RzdFswXS5pbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBqID0gMTsgaiA8IG47IGogKz0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSB0MCA9IHNyY1tpdGFiW2pdXSpzY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IHNyY1tpdGFiW2orMV1dKnNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9kc3Rbal0ucmUgPSAoZGF0YXR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9kc3Rbal0uaW0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9kc3RbaisxXS5yZSA9IChkYXRhdHlwZSl0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIF9kc3RbaisxXS5pbSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2REZUXyMjZmxhdm9yIyNjKCBfZHN0LCBfZHN0LCBuLCBuZiwgZmFjdG9ycywgaXRhYiwgd2F2ZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJfc2l6ZSwgMCwgYnVmLCBJQ1ZfREZUX05PX1BFUk1VVEUsIDEuICk7IFwKKyAgICAgICAgaWYoICFjb21wbGV4X291dHB1dCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFsxXSA9IGRzdFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHQwLCB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIGgxX3JlLCBoMV9pbSwgaDJfcmUsIGgyX2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHNjYWxlMiA9IHNjYWxlKjAuNTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmFjdG9yc1swXSA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWN2REZUXyMjZmxhdm9yIyNjKCAoQ3ZDb21wbGV4IyNmbGF2b3IqKXNyYywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQ3ZDb21wbGV4IyNmbGF2b3IqKWRzdCwgbjIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZiAtIChmYWN0b3JzWzBdID09IDEpLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JzICsgKGZhY3RvcnNbMF0gPT0gMSksICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGFiLCB3YXZlLCB0YWJfc2l6ZSwgMCwgYnVmLCAwLCAxLiApOyAgICAgIFwKKyAgICAgICAgZmFjdG9yc1swXSA8PD0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdCA9IGRzdFswXSAtIGRzdFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gKGRhdGF0eXBlKSgoZHN0WzBdICsgZHN0WzFdKSpzY2FsZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzFdID0gKGRhdGF0eXBlKSh0KnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSBkc3RbbjJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdCA9IGRzdFtuLTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W24tMV0gPSBkc3RbMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBqID0gMiwgd2F2ZSsrOyBqIDwgbjI7IGogKz0gMiwgd2F2ZSsrICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIGNhbGMgb2RkICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgyX3JlID0gc2NhbGUyKihkc3RbaisxXSArIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgyX2ltID0gc2NhbGUyKihkc3Rbbi1qXSAtIGRzdFtqXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIGNhbGMgZXZlbiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgxX3JlID0gc2NhbGUyKihkc3Rbal0gKyBkc3Rbbi1qXSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgxX2ltID0gc2NhbGUyKihkc3RbaisxXSAtIHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIC8qIHJvdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQgPSBoMl9yZSp3YXZlLT5yZSAtIGgyX2ltKndhdmUtPmltOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgyX2ltID0gaDJfcmUqd2F2ZS0+aW0gKyBoMl9pbSp3YXZlLT5yZTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGgyX3JlID0gdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQgPSBkc3Rbbi1qLTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtqLTFdID0gKGRhdGF0eXBlKShoMV9yZSArIGgyX3JlKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtuLWotMV0gPSAoZGF0YXR5cGUpKGgxX3JlIC0gaDJfcmUpOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtqXSA9IChkYXRhdHlwZSkoaDFfaW0gKyBoMl9pbSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtuLWpdID0gKGRhdGF0eXBlKShoMl9pbSAtIGgxX2ltKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGogPD0gbjIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtuMi0xXSA9IChkYXRhdHlwZSkodDAqc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtuMl0gPSAoZGF0YXR5cGUpKC10KnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ZpbmFsaXplOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggY29tcGxleF9vdXRwdXQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0Wy0xXSA9IGRzdFswXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIChuICYgMSkgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtuXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisvKiBJbnZlcnNlIEZGVCBvZiBjb21wbGV4IGNvbmp1Z2F0ZS1zeW1tZXRyaWMgdmVjdG9yCisgICBpbnB1dCB2ZWN0b3IgZm9ybWF0OgorICAgICAgcmVbMF0sIHJlWzFdLCBpbVsxXSwgLi4uICwgcmVbbi8yLTFdLCBpbVtuLzItMV0sIHJlW24vMl0gT1IKKyAgICAgIHJlKDApLCAwLCByZSgxKSwgaW0oMSksIC4uLiwgcmUobi8yLTEpLCBpbSgobisxKS8yLTEpIFssIHJlKChuKzEpLzIpLCAwXSAqLworI2RlZmluZSBJQ1ZfQ0NTX0lERlQoIGZsYXZvciwgZGF0YXR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2Q0NTSURGVF8jI2ZsYXZvciggY29uc3QgZGF0YXR5cGUqIHNyYywgZGF0YXR5cGUqIGRzdCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgaW50IG4sIGludCBuZiwgaW50KiBmYWN0b3JzLCBjb25zdCBpbnQqIGl0YWIsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZDb21wbGV4IyNmbGF2b3IqIHdhdmUsIGludCB0YWJfc2l6ZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3BlYywgQ3ZDb21wbGV4IyNmbGF2b3IqIGJ1ZiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBkb3VibGUgc2NhbGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBjb21wbGV4X2lucHV0ID0gKGZsYWdzICYgSUNWX0RGVF9DT01QTEVYX0lOUFVUX09SX09VVFBVVCkgIT0gMDsgXAorICAgIGludCBqLCBrLCBuMiA9IChuKzEpID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSBzYXZlX3MxID0gMC47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSB0MCwgdDEsIHQyLCB0MywgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggdGFiX3NpemUgPT0gbiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBjb21wbGV4X2lucHV0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhc3NlcnQoIHNyYyAhPSBkc3QgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzYXZlX3MxID0gc3JjWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGRhdGF0eXBlKilzcmMpWzFdID0gc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBzcGVjICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3ZERlRJbnZfUGFja1RvUl8jI2ZsYXZvciMjX3AoIHNyYywgZHN0LCBzcGVjLCBidWYgKTsgICAgICAgICAgXAorICAgICAgICBnb3RvIGZpbmFsaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBuID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMF0gPSAoZGF0YXR5cGUpKHNyY1swXSpzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoIG4gPT0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ID0gKHNyY1swXSArIHNyY1sxXSkqc2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMV0gPSAoZGF0YXR5cGUpKChzcmNbMF0gLSBzcmNbMV0pKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMF0gPSAoZGF0YXR5cGUpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoIG4gJiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDdkNvbXBsZXgjI2ZsYXZvciogX3NyYyA9IChDdkNvbXBsZXgjI2ZsYXZvciopKHNyYy0xKTsgICAgICAgICAgXAorICAgICAgICBDdkNvbXBsZXgjI2ZsYXZvciogX2RzdCA9IChDdkNvbXBsZXgjI2ZsYXZvciopZHN0OyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZHN0WzBdLnJlID0gc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfZHN0WzBdLmltID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAxOyBqIDwgbjI7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGswID0gaXRhYltqXSwgazEgPSBpdGFiW24tal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfc3JjW2pdLnJlOyB0MSA9IF9zcmNbal0uaW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX2RzdFtrMF0ucmUgPSAoZGF0YXR5cGUpdDA7IF9kc3RbazBdLmltID0gKGRhdGF0eXBlKS10MTsgICAgXAorICAgICAgICAgICAgX2RzdFtrMV0ucmUgPSAoZGF0YXR5cGUpdDA7IF9kc3RbazFdLmltID0gKGRhdGF0eXBlKXQxOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3ZERlRfIyNmbGF2b3IjI2MoIF9kc3QsIF9kc3QsIG4sIG5mLCBmYWN0b3JzLCBpdGFiLCB3YXZlLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYl9zaXplLCAwLCBidWYsIElDVl9ERlRfTk9fUEVSTVVURSwgMS4gKTsgXAorICAgICAgICBkc3RbMF0gPSAoZGF0YXR5cGUpKGRzdFswXSpzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAxOyBqIDwgbjsgaiArPSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBkc3RbaioyXSpzY2FsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBkc3RbaioyKzJdKnNjYWxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2pdID0gKGRhdGF0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2orMV0gPSAoZGF0YXR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaW5wbGFjZSA9IHNyYyA9PSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBDdkNvbXBsZXgjI2ZsYXZvciogdyA9IHdhdmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ID0gc3JjWzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IChzcmNbMF0gKyBzcmNbbi0xXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IChzcmNbbi0xXSAtIHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMF0gPSAoZGF0YXR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMV0gPSAoZGF0YXR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAyLCB3Kys7IGogPCBuMjsgaiArPSAyLCB3KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIGgxX3JlLCBoMV9pbSwgaDJfcmUsIGgyX2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDFfcmUgPSAodCArIHNyY1tuLWotMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDFfaW0gPSAoc3JjW2pdIC0gc3JjW24tal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDJfcmUgPSAodCAtIHNyY1tuLWotMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDJfaW0gPSAoc3JjW2pdICsgc3JjW24tal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdCA9IGgyX3JlKnctPnJlICsgaDJfaW0qdy0+aW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDJfaW0gPSBoMl9pbSp3LT5yZSAtIGgyX3JlKnctPmltOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaDJfcmUgPSB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdCA9IHNyY1tqKzFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBoMV9yZSAtIGgyX2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSAtaDFfaW0gLSBoMl9yZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDIgPSBoMV9yZSArIGgyX2ltOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDMgPSBoMV9pbSAtIGgyX3JlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGlucGxhY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqXSA9IChkYXRhdHlwZSl0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtqKzFdID0gKGRhdGF0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtuLWpdID0gKGRhdGF0eXBlKXQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtuLWorMV09IChkYXRhdHlwZSl0MzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGludCBqMiA9IGogPj4gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGsgPSBpdGFiW2oyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrXSA9IChkYXRhdHlwZSl0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrKzFdID0gKGRhdGF0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGsgPSBpdGFiW24yLWoyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrXSA9IChkYXRhdHlwZSl0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrKzFdPSAoZGF0YXR5cGUpdDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggaiA8PSBuMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSB0KjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBzcmNbbjJdKjI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGlucGxhY2UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtuMl0gPSAoZGF0YXR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtuMisxXSA9IChkYXRhdHlwZSl0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGsgPSBpdGFiW24yXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrKjJdID0gKGRhdGF0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtrKjIrMV0gPSAoZGF0YXR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmYWN0b3JzWzBdID4+PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpY3ZERlRfIyNmbGF2b3IjI2MoIChDdkNvbXBsZXgjI2ZsYXZvciopZHN0LCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDdkNvbXBsZXgjI2ZsYXZvciopZHN0LCBuMiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5mIC0gKGZhY3RvcnNbMF0gPT0gMSksICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnMgKyAoZmFjdG9yc1swXSA9PSAxKSwgaXRhYiwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdmUsIHRhYl9zaXplLCAwLCBidWYsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucGxhY2UgPyAwIDogSUNWX0RGVF9OT19QRVJNVVRFLCAxLiApOyAgICAgXAorICAgICAgICBmYWN0b3JzWzBdIDw8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjsgaiArPSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBkc3Rbal0qc2NhbGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBkc3RbaisxXSooLXNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2pdID0gKGRhdGF0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2orMV0gPSAoZGF0YXR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZmluYWxpemU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBjb21wbGV4X2lucHV0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKGRhdGF0eXBlKilzcmMpWzBdID0gKGRhdGF0eXBlKXNhdmVfczE7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9SRUFMX0RGVCggNjRmLCBkb3VibGUgKQorSUNWX0NDU19JREZUKCA2NGYsIGRvdWJsZSApCitJQ1ZfUkVBTF9ERlQoIDMyZiwgZmxvYXQgKQorSUNWX0NDU19JREZUKCAzMmYsIGZsb2F0ICkKKworCitzdGF0aWMgdm9pZAoraWN2Q29weUNvbHVtbiggY29uc3QgdWNoYXIqIF9zcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgIHVjaGFyKiBfZHN0LCBpbnQgZHN0X3N0ZXAsCisgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgZWxlbV9zaXplICkKK3sKKyAgICBpbnQgaSwgdDAsIHQxOworICAgIGNvbnN0IGludCogc3JjID0gKGNvbnN0IGludCopX3NyYzsKKyAgICBpbnQqIGRzdCA9IChpbnQqKV9kc3Q7CisgICAgc3JjX3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7CisgICAgZHN0X3N0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisKKyAgICBpZiggZWxlbV9zaXplID09IHNpemVvZihpbnQpICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKywgc3JjICs9IHNyY19zdGVwLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgIH0KKyAgICBlbHNlIGlmKCBlbGVtX3NpemUgPT0gc2l6ZW9mKGludCkqMiApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKyssIHNyYyArPSBzcmNfc3RlcCwgZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAgPSBzcmNbMF07IHQxID0gc3JjWzFdOworICAgICAgICAgICAgZHN0WzBdID0gdDA7IGRzdFsxXSA9IHQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoaW50KSo0ICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKywgc3JjICs9IHNyY19zdGVwLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICB0MCA9IHNyY1swXTsgdDEgPSBzcmNbMV07CisgICAgICAgICAgICBkc3RbMF0gPSB0MDsgZHN0WzFdID0gdDE7CisgICAgICAgICAgICB0MCA9IHNyY1syXTsgdDEgPSBzcmNbM107CisgICAgICAgICAgICBkc3RbMl0gPSB0MDsgZHN0WzNdID0gdDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkNvcHlGcm9tMkNvbHVtbnMoIGNvbnN0IHVjaGFyKiBfc3JjLCBpbnQgc3JjX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICB1Y2hhciogX2RzdDAsIHVjaGFyKiBfZHN0MSwKKyAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBlbGVtX3NpemUgKQoreworICAgIGludCBpLCB0MCwgdDE7CisgICAgY29uc3QgaW50KiBzcmMgPSAoY29uc3QgaW50Kilfc3JjOworICAgIGludCogZHN0MCA9IChpbnQqKV9kc3QwOworICAgIGludCogZHN0MSA9IChpbnQqKV9kc3QxOworICAgIHNyY19zdGVwIC89IHNpemVvZihzcmNbMF0pOworCisgICAgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoaW50KSApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKyssIHNyYyArPSBzcmNfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHQwID0gc3JjWzBdOyB0MSA9IHNyY1sxXTsKKyAgICAgICAgICAgIGRzdDBbaV0gPSB0MDsgZHN0MVtpXSA9IHQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoaW50KSoyICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW4qMjsgaSArPSAyLCBzcmMgKz0gc3JjX3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICB0MCA9IHNyY1swXTsgdDEgPSBzcmNbMV07CisgICAgICAgICAgICBkc3QwW2ldID0gdDA7IGRzdDBbaSsxXSA9IHQxOworICAgICAgICAgICAgdDAgPSBzcmNbMl07IHQxID0gc3JjWzNdOworICAgICAgICAgICAgZHN0MVtpXSA9IHQwOyBkc3QxW2krMV0gPSB0MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBlbGVtX3NpemUgPT0gc2l6ZW9mKGludCkqNCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuKjQ7IGkgKz0gNCwgc3JjICs9IHNyY19zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAgPSBzcmNbMF07IHQxID0gc3JjWzFdOworICAgICAgICAgICAgZHN0MFtpXSA9IHQwOyBkc3QwW2krMV0gPSB0MTsKKyAgICAgICAgICAgIHQwID0gc3JjWzJdOyB0MSA9IHNyY1szXTsKKyAgICAgICAgICAgIGRzdDBbaSsyXSA9IHQwOyBkc3QwW2krM10gPSB0MTsKKyAgICAgICAgICAgIHQwID0gc3JjWzRdOyB0MSA9IHNyY1s1XTsKKyAgICAgICAgICAgIGRzdDFbaV0gPSB0MDsgZHN0MVtpKzFdID0gdDE7CisgICAgICAgICAgICB0MCA9IHNyY1s2XTsgdDEgPSBzcmNbN107CisgICAgICAgICAgICBkc3QxW2krMl0gPSB0MDsgZHN0MVtpKzNdID0gdDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkNvcHlUbzJDb2x1bW5zKCBjb25zdCB1Y2hhciogX3NyYzAsIGNvbnN0IHVjaGFyKiBfc3JjMSwKKyAgICAgICAgICAgICAgICAgICB1Y2hhciogX2RzdCwgaW50IGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgIGludCBsZW4sIGludCBlbGVtX3NpemUgKQoreworICAgIGludCBpLCB0MCwgdDE7CisgICAgY29uc3QgaW50KiBzcmMwID0gKGNvbnN0IGludCopX3NyYzA7CisgICAgY29uc3QgaW50KiBzcmMxID0gKGNvbnN0IGludCopX3NyYzE7CisgICAgaW50KiBkc3QgPSAoaW50KilfZHN0OworICAgIGRzdF9zdGVwIC89IHNpemVvZihkc3RbMF0pOworCisgICAgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoaW50KSApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKyssIGRzdCArPSBkc3Rfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHQwID0gc3JjMFtpXTsgdDEgPSBzcmMxW2ldOworICAgICAgICAgICAgZHN0WzBdID0gdDA7IGRzdFsxXSA9IHQxOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGVsZW1fc2l6ZSA9PSBzaXplb2YoaW50KSoyICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW4qMjsgaSArPSAyLCBkc3QgKz0gZHN0X3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICB0MCA9IHNyYzBbaV07IHQxID0gc3JjMFtpKzFdOworICAgICAgICAgICAgZHN0WzBdID0gdDA7IGRzdFsxXSA9IHQxOworICAgICAgICAgICAgdDAgPSBzcmMxW2ldOyB0MSA9IHNyYzFbaSsxXTsKKyAgICAgICAgICAgIGRzdFsyXSA9IHQwOyBkc3RbM10gPSB0MTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBlbGVtX3NpemUgPT0gc2l6ZW9mKGludCkqNCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuKjQ7IGkgKz0gNCwgZHN0ICs9IGRzdF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgdDAgPSBzcmMwW2ldOyB0MSA9IHNyYzBbaSsxXTsKKyAgICAgICAgICAgIGRzdFswXSA9IHQwOyBkc3RbMV0gPSB0MTsKKyAgICAgICAgICAgIHQwID0gc3JjMFtpKzJdOyB0MSA9IHNyYzBbaSszXTsKKyAgICAgICAgICAgIGRzdFsyXSA9IHQwOyBkc3RbM10gPSB0MTsKKyAgICAgICAgICAgIHQwID0gc3JjMVtpXTsgdDEgPSBzcmMxW2krMV07CisgICAgICAgICAgICBkc3RbNF0gPSB0MDsgZHN0WzVdID0gdDE7CisgICAgICAgICAgICB0MCA9IHNyYzFbaSsyXTsgdDEgPSBzcmMxW2krM107CisgICAgICAgICAgICBkc3RbNl0gPSB0MDsgZHN0WzddID0gdDE7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkV4cGFuZENDUyggdWNoYXIqIF9wdHIsIGludCBsZW4sIGludCBlbGVtX3NpemUgKQoreworICAgIGludCBpOworICAgIF9wdHIgLT0gZWxlbV9zaXplOworICAgIG1lbWNweSggX3B0ciwgX3B0ciArIGVsZW1fc2l6ZSwgZWxlbV9zaXplICk7CisgICAgbWVtc2V0KCBfcHRyICsgZWxlbV9zaXplLCAwLCBlbGVtX3NpemUgKTsKKyAgICBpZiggKGxlbiAmIDEpID09IDAgKQorICAgICAgICBtZW1zZXQoIF9wdHIgKyAobGVuKzEpKmVsZW1fc2l6ZSwgMCwgZWxlbV9zaXplICk7CisKKyAgICBpZiggZWxlbV9zaXplID09IHNpemVvZihmbG9hdCkgKQorICAgIHsKKyAgICAgICAgQ3ZDb21wbGV4MzJmKiBwdHIgPSAoQ3ZDb21wbGV4MzJmKilfcHRyOworCisgICAgICAgIGZvciggaSA9IDE7IGkgPCAobGVuKzEpLzI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q29tcGxleDMyZiB0OworICAgICAgICAgICAgdC5yZSA9IHB0cltpXS5yZTsKKyAgICAgICAgICAgIHQuaW0gPSAtcHRyW2ldLmltOworICAgICAgICAgICAgcHRyW2xlbi1pXSA9IHQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZDb21wbGV4NjRmKiBwdHIgPSAoQ3ZDb21wbGV4NjRmKilfcHRyOworCisgICAgICAgIGZvciggaSA9IDE7IGkgPCAobGVuKzEpLzI7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q29tcGxleDY0ZiB0OworICAgICAgICAgICAgdC5yZSA9IHB0cltpXS5yZTsKKyAgICAgICAgICAgIHQuaW0gPSAtcHRyW2ldLmltOworICAgICAgICAgICAgcHRyW2xlbi1pXSA9IHQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZERlRGdW5jKSgKKyAgICAgY29uc3Qgdm9pZCogc3JjLCB2b2lkKiBkc3QsIGludCBuLCBpbnQgbmYsIGludCogZmFjdG9ycywKKyAgICAgY29uc3QgaW50KiBpdGFiLCBjb25zdCB2b2lkKiB3YXZlLCBpbnQgdGFiX3NpemUsCisgICAgIGNvbnN0IHZvaWQqIHNwZWMsIHZvaWQqIGJ1ZiwgaW50IGludiwgZG91YmxlIHNjYWxlICk7CisKK0NWX0lNUEwgdm9pZAorY3ZERlQoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGludCBmbGFncywgaW50IG5vbnplcm9fcm93cyApCit7CisgICAgc3RhdGljIEN2REZURnVuYyBkZnRfdGJsWzZdOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgCisgICAgdm9pZCogYnVmZmVyID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAxOworICAgIGludCBkZXB0aCA9IC0xOworICAgIHZvaWQgKnNwZWNfYyA9IDAsICpzcGVjX3IgPSAwLCAqc3BlYyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkRGVCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBwcmV2X2xlbiA9IDAsIGJ1Zl9zaXplID0gMCwgc3RhZ2UgPSAwOworICAgIGludCBuZiA9IDAsIGludiA9IChmbGFncyAmIENWX0RYVF9JTlZFUlNFKSAhPSAwOworICAgIGludCByZWFsX3RyYW5zZm9ybSA9IDA7CisgICAgQ3ZNYXQgKnNyYyA9IChDdk1hdCopc3JjYXJyLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgc3Jjc3R1YiwgZHN0c3R1YiwgKnNyYzA7CisgICAgaW50IGNvbXBsZXhfZWxlbV9zaXplLCBlbGVtX3NpemU7CisgICAgaW50IGZhY3RvcnNbMzRdLCBpbnBsYWNlX3RyYW5zZm9ybSA9IDA7CisgICAgaW50IGlwcF9ub3JtX2ZsYWcgPSAwOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGRmdF90YmxbMF0gPSAoQ3ZERlRGdW5jKWljdkRGVF8zMmZjOworICAgICAgICBkZnRfdGJsWzFdID0gKEN2REZURnVuYylpY3ZSZWFsREZUXzMyZjsKKyAgICAgICAgZGZ0X3RibFsyXSA9IChDdkRGVEZ1bmMpaWN2Q0NTSURGVF8zMmY7CisgICAgICAgIGRmdF90YmxbM10gPSAoQ3ZERlRGdW5jKWljdkRGVF82NGZjOworICAgICAgICBkZnRfdGJsWzRdID0gKEN2REZURnVuYylpY3ZSZWFsREZUXzY0ZjsKKyAgICAgICAgZGZ0X3RibFs1XSA9IChDdkRGVEZ1bmMpaWN2Q0NTSURGVF82NGY7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaSApKTsKKworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVCggZHN0ICkpCisgICAgeworICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kgKSk7CisKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgfQorCisgICAgc3JjMCA9IHNyYzsKKyAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUxKHNyYy0+dHlwZSk7CisgICAgY29tcGxleF9lbGVtX3NpemUgPSBlbGVtX3NpemUqMjsKKworICAgIC8vIGNoZWNrIHR5cGVzIGFuZCBzaXplcworICAgIGlmKCAhQ1ZfQVJFX0RFUFRIU19FUShzcmMsIGRzdCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKHNyYy0+dHlwZSk7CisgICAgaWYoIGRlcHRoIDwgQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiT25seSAzMmZDMSwgMzJmQzIsIDY0ZkMxIGFuZCA2NGZDMiBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQiICk7CisKKyAgICBpZiggQ1ZfQVJFX0NOU19FUShzcmMsIGRzdCkgKQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9DTihzcmMtPnR5cGUpID4gMiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICAgICAiT25seSAzMmZDMSwgMzJmQzIsIDY0ZkMxIGFuZCA2NGZDMiBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoc3JjLCBkc3QpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICAgICAgcmVhbF90cmFuc2Zvcm0gPSBDVl9NQVRfQ04oc3JjLT50eXBlKSA9PSAxOworICAgICAgICBpZiggIXJlYWxfdHJhbnNmb3JtICkKKyAgICAgICAgICAgIGVsZW1fc2l6ZSA9IGNvbXBsZXhfZWxlbV9zaXplOworICAgIH0KKyAgICBlbHNlIGlmKCAhaW52ICYmIENWX01BVF9DTihzcmMtPnR5cGUpID09IDEgJiYgQ1ZfTUFUX0NOKGRzdC0+dHlwZSkgPT0gMiApCisgICAgeworICAgICAgICBpZiggKHNyYy0+Y29scyAhPSAxIHx8IGRzdC0+Y29scyAhPSAxIHx8CisgICAgICAgICAgICAoc3JjLT5yb3dzLzIrMSAhPSBkc3QtPnJvd3MgJiYgc3JjLT5yb3dzICE9IGRzdC0+cm93cykpICYmCisgICAgICAgICAgICAoc3JjLT5jb2xzLzIrMSAhPSBkc3QtPmNvbHMgfHwgc3JjLT5yb3dzICE9IGRzdC0+cm93cykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICByZWFsX3RyYW5zZm9ybSA9IDE7CisgICAgfQorICAgIGVsc2UgaWYoIGludiAmJiBDVl9NQVRfQ04oc3JjLT50eXBlKSA9PSAyICYmIENWX01BVF9DTihkc3QtPnR5cGUpID09IDEgKQorICAgIHsKKyAgICAgICAgaWYoIChzcmMtPmNvbHMgIT0gMSB8fCBkc3QtPmNvbHMgIT0gMSB8fAorICAgICAgICAgICAgKGRzdC0+cm93cy8yKzEgIT0gc3JjLT5yb3dzICYmIHNyYy0+cm93cyAhPSBkc3QtPnJvd3MpKSAmJgorICAgICAgICAgICAgKGRzdC0+Y29scy8yKzEgIT0gc3JjLT5jb2xzIHx8IHNyYy0+cm93cyAhPSBkc3QtPnJvd3MpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICAgICAgcmVhbF90cmFuc2Zvcm0gPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAiSW5jb3JyZWN0IG9yIHVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGlucHV0ICYgb3V0cHV0IGZvcm1hdHMiICk7CisKKyAgICBpZiggc3JjLT5jb2xzID09IDEgJiYgbm9uemVyb19yb3dzID4gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOb3RJbXBsZW1lbnRlZCwKKyAgICAgICAgIlRoaXMgbW9kZSAodXNpbmcgbm9uemVyb19yb3dzIHdpdGggYSBzaW5nbGUtY29sdW1uIG1hdHJpeCkgYnJlYWtzIHRoZSBmdW5jdGlvbiBsb2dpYywgc28gaXQgaXMgcHJvaGliaXRlZC5cbiIKKyAgICAgICAgIkZvciBmYXN0IGNvbnZvbHV0aW9uL2NvcnJlbGF0aW9uIHVzZSAyLWNvbHVtbiBtYXRyaXggb3Igc2luZ2xlLXJvdyBtYXRyaXggaW5zdGVhZCIgKTsKKworICAgIC8vIGRldGVybWluZSwgd2hpY2ggdHJhbnNmb3JtIHRvIGRvIGZpcnN0IC0gcm93LXdpc2UKKyAgICAvLyAoc3RhZ2UgMCkgb3IgY29sdW1uLXdpc2UgKHN0YWdlIDEpIHRyYW5zZm9ybQorICAgIGlmKCAhKGZsYWdzICYgQ1ZfRFhUX1JPV1MpICYmIHNyYy0+cm93cyA+IDEgJiYKKyAgICAgICAgKChzcmMtPmNvbHMgPT0gMSAmJiAhQ1ZfSVNfTUFUX0NPTlQoc3JjLT50eXBlICYgZHN0LT50eXBlKSkgfHwKKyAgICAgICAgKHNyYy0+Y29scyA+IDEgJiYgaW52ICYmIHJlYWxfdHJhbnNmb3JtKSkgKQorICAgICAgICBzdGFnZSA9IDE7CisKKyAgICBpcHBfbm9ybV9mbGFnID0gIShmbGFncyAmIENWX0RYVF9TQ0FMRSkgPyA4IDogKGZsYWdzICYgQ1ZfRFhUX0lOVkVSU0UpID8gMiA6IDE7CisKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBkb3VibGUgc2NhbGUgPSAxOworICAgICAgICB1Y2hhciogd2F2ZSA9IDA7CisgICAgICAgIGludCogaXRhYiA9IDA7CisgICAgICAgIHVjaGFyKiBwdHI7CisgICAgICAgIGludCBpLCBsZW4sIGNvdW50LCBzeiA9IDA7CisgICAgICAgIGludCB1c2VfYnVmID0gMCwgb2RkX3JlYWwgPSAwOworICAgICAgICBDdkRGVEZ1bmMgZGZ0X2Z1bmM7CisKKyAgICAgICAgaWYoIHN0YWdlID09IDAgKSAvLyByb3ctd2lzZSB0cmFuc2Zvcm0KKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gIWludiA/IHNyYy0+Y29scyA6IGRzdC0+Y29sczsKKyAgICAgICAgICAgIGNvdW50ID0gc3JjLT5yb3dzOworICAgICAgICAgICAgaWYoIGxlbiA9PSAxICYmICEoZmxhZ3MgJiBDVl9EWFRfUk9XUykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9ICFpbnYgPyBzcmMtPnJvd3MgOiBkc3QtPnJvd3M7CisgICAgICAgICAgICAgICAgY291bnQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb2RkX3JlYWwgPSByZWFsX3RyYW5zZm9ybSAmJiAobGVuICYgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZW4gPSBkc3QtPnJvd3M7CisgICAgICAgICAgICBjb3VudCA9ICFpbnYgPyBzcmMwLT5jb2xzIDogZHN0LT5jb2xzOworICAgICAgICAgICAgc3ogPSAyKmxlbipjb21wbGV4X2VsZW1fc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwZWMgPSAwOworICAgICAgICBpZiggbGVuKmNvdW50ID49IDY0ICYmIGljdkRGVEluaXRBbGxvY19SXzMyZl9wICE9IDAgKSAvLyB1c2UgSVBQIERGVCBpZiBhdmFpbGFibGUKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlwcF9zeiA9IDA7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCByZWFsX3RyYW5zZm9ybSAmJiBzdGFnZSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBzcGVjX3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRGcmVlX1JfMzJmX3AoIHNwZWNfciApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRJbml0QWxsb2NfUl8zMmZfcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICZzcGVjX3IsIGxlbiwgaXBwX25vcm1fZmxhZywgY3ZBbGdIaW50Tm9uZSApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRHZXRCdWZTaXplX1JfMzJmX3AoIHNwZWNfciwgJmlwcF9zeiApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNwZWNfciApCisgICAgICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEZyZWVfUl82NGZfcCggc3BlY19yICkpOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEluaXRBbGxvY19SXzY0Zl9wKAorICAgICAgICAgICAgICAgICAgICAgICAgJnNwZWNfciwgbGVuLCBpcHBfbm9ybV9mbGFnLCBjdkFsZ0hpbnROb25lICkpOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEdldEJ1ZlNpemVfUl82NGZfcCggc3BlY19yLCAmaXBwX3N6ICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGVjID0gc3BlY19yOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNwZWNfYyApCisgICAgICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEZyZWVfQ18zMmZjX3AoIHNwZWNfYyApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRJbml0QWxsb2NfQ18zMmZjX3AoCisgICAgICAgICAgICAgICAgICAgICAgICAmc3BlY19jLCBsZW4sIGlwcF9ub3JtX2ZsYWcsIGN2QWxnSGludE5vbmUgKSk7CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaWN2REZUR2V0QnVmU2l6ZV9DXzMyZmNfcCggc3BlY19jLCAmaXBwX3N6ICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc3BlY19jICkKKyAgICAgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaWN2REZURnJlZV9DXzY0ZmNfcCggc3BlY19jICkpOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEluaXRBbGxvY19DXzY0ZmNfcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICZzcGVjX2MsIGxlbiwgaXBwX25vcm1fZmxhZywgY3ZBbGdIaW50Tm9uZSApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRHZXRCdWZTaXplX0NfNjRmY19wKCBzcGVjX2MsICZpcHBfc3ogKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwZWMgPSBzcGVjX2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN6ICs9IGlwcF9zejsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBsZW4gIT0gcHJldl9sZW4gKQorICAgICAgICAgICAgICAgIG5mID0gaWN2REZURmFjdG9yaXplKCBsZW4sIGZhY3RvcnMgKTsKKworICAgICAgICAgICAgaW5wbGFjZV90cmFuc2Zvcm0gPSBmYWN0b3JzWzBdID09IGZhY3RvcnNbbmYtMV07CisgICAgICAgICAgICBzeiArPSBsZW4qKGNvbXBsZXhfZWxlbV9zaXplICsgc2l6ZW9mKGludCkpOworICAgICAgICAgICAgaSA9IG5mID4gMSAmJiAoZmFjdG9yc1swXSAmIDEpID09IDA7CisgICAgICAgICAgICBpZiggKGZhY3RvcnNbaV0gJiAxKSAhPSAwICYmIGZhY3RvcnNbaV0gPiA1ICkKKyAgICAgICAgICAgICAgICBzeiArPSAoZmFjdG9yc1tpXSsxKSpjb21wbGV4X2VsZW1fc2l6ZTsKKworICAgICAgICAgICAgaWYoIChzdGFnZSA9PSAwICYmICgoc3JjLT5kYXRhLnB0ciA9PSBkc3QtPmRhdGEucHRyICYmICFpbnBsYWNlX3RyYW5zZm9ybSkgfHwgb2RkX3JlYWwpKSB8fAorICAgICAgICAgICAgICAgIChzdGFnZSA9PSAxICYmICFpbnBsYWNlX3RyYW5zZm9ybSkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVzZV9idWYgPSAxOworICAgICAgICAgICAgICAgIHN6ICs9IGxlbipjb21wbGV4X2VsZW1fc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzeiA+IGJ1Zl9zaXplICkKKyAgICAgICAgeworICAgICAgICAgICAgcHJldl9sZW4gPSAwOyAvLyBiZWNhdXNlIHdlIHJlbGVhc2UgdGhlIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yY2UgcmVjYWxjdWxhdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0d2lkZGxlIGZhY3RvcnMgYW5kIHBlcm11dGF0aW9uIHRhYmxlCisgICAgICAgICAgICBpZiggIWxvY2FsX2FsbG9jICYmIGJ1ZmZlciApCisgICAgICAgICAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisgICAgICAgICAgICBpZiggc3ogPD0gQ1ZfTUFYX0xPQ0FMX0RGVF9TSVpFICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBidWZfc2l6ZSA9IHN6ID0gQ1ZfTUFYX0xPQ0FMX0RGVF9TSVpFOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyhzeiArIDMyKTsKKyAgICAgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gY3ZBbGxvYyhzeiArIDMyKSApOworICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gc3o7CisgICAgICAgICAgICAgICAgbG9jYWxfYWxsb2MgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHRyID0gKHVjaGFyKilidWZmZXI7CisgICAgICAgIGlmKCAhc3BlYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhdmUgPSBwdHI7CisgICAgICAgICAgICBwdHIgKz0gbGVuKmNvbXBsZXhfZWxlbV9zaXplOworICAgICAgICAgICAgaXRhYiA9IChpbnQqKXB0cjsKKyAgICAgICAgICAgIHB0ciA9ICh1Y2hhciopY3ZBbGlnblB0ciggcHRyICsgbGVuKnNpemVvZihpbnQpLCAxNiApOworCisgICAgICAgICAgICBpZiggbGVuICE9IHByZXZfbGVuIHx8ICghaW5wbGFjZV90cmFuc2Zvcm0gJiYgaW52ICYmIHJlYWxfdHJhbnNmb3JtKSkKKyAgICAgICAgICAgICAgICBpY3ZERlRJbml0KCBsZW4sIG5mLCBmYWN0b3JzLCBpdGFiLCBjb21wbGV4X2VsZW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLCBzdGFnZSA9PSAwICYmIGludiAmJiByZWFsX3RyYW5zZm9ybSApOworICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIHJldXNlIHRoZSB0YWJsZXMgY2FsY3VsYXRlZCBvbiB0aGUgcHJldmlvdXMgc3RhZ2UKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdGFnZSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHRtcF9idWYgPSAwOworICAgICAgICAgICAgaW50IGRwdHJfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGludCBkc3RfZnVsbF9sZW4gPSBsZW4qZWxlbV9zaXplOworICAgICAgICAgICAgaW50IF9mbGFncyA9IGludiArIChDVl9NQVRfQ04oc3JjLT50eXBlKSAhPSBDVl9NQVRfQ04oZHN0LT50eXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgSUNWX0RGVF9DT01QTEVYX0lOUFVUX09SX09VVFBVVCA6IDApOworICAgICAgICAgICAgaWYoIHVzZV9idWYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRtcF9idWYgPSBwdHI7CisgICAgICAgICAgICAgICAgcHRyICs9IGxlbipjb21wbGV4X2VsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiggb2RkX3JlYWwgJiYgIWludiAmJiBsZW4gPiAxICYmCisgICAgICAgICAgICAgICAgICAgICEoX2ZsYWdzICYgSUNWX0RGVF9DT01QTEVYX0lOUFVUX09SX09VVFBVVCkpCisgICAgICAgICAgICAgICAgICAgIGRwdHJfb2Zmc2V0ID0gZWxlbV9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIWludiAmJiAoX2ZsYWdzICYgSUNWX0RGVF9DT01QTEVYX0lOUFVUX09SX09VVFBVVCkgKQorICAgICAgICAgICAgICAgIGRzdF9mdWxsX2xlbiArPSAobGVuICYgMSkgPyBlbGVtX3NpemUgOiBjb21wbGV4X2VsZW1fc2l6ZTsKKworICAgICAgICAgICAgZGZ0X2Z1bmMgPSBkZnRfdGJsWyghcmVhbF90cmFuc2Zvcm0gPyAwIDogIWludiA/IDEgOiAyKSArIChkZXB0aCA9PSBDVl82NEYpKjNdOworCisgICAgICAgICAgICBpZiggY291bnQgPiAxICYmICEoZmxhZ3MgJiBDVl9EWFRfUk9XUykgJiYgKCFpbnYgfHwgIXJlYWxfdHJhbnNmb3JtKSApCisgICAgICAgICAgICAgICAgc3RhZ2UgPSAxOworICAgICAgICAgICAgZWxzZSBpZiggZmxhZ3MgJiBDVl9EWFRfU0NBTEUgKQorICAgICAgICAgICAgICAgIHNjYWxlID0gMS4vKGxlbiAqIChmbGFncyAmIENWX0RYVF9ST1dTID8gMSA6IGNvdW50KSk7CisKKyAgICAgICAgICAgIGlmKCBub256ZXJvX3Jvd3MgPD0gMCB8fCBub256ZXJvX3Jvd3MgPiBjb3VudCApCisgICAgICAgICAgICAgICAgbm9uemVyb19yb3dzID0gY291bnQ7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBub256ZXJvX3Jvd3M7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIHNwdHIgPSBzcmMtPmRhdGEucHRyICsgaSpzcmMtPnN0ZXA7CisgICAgICAgICAgICAgICAgdWNoYXIqIGRwdHIwID0gZHN0LT5kYXRhLnB0ciArIGkqZHN0LT5zdGVwOworICAgICAgICAgICAgICAgIHVjaGFyKiBkcHRyID0gZHB0cjA7CisKKyAgICAgICAgICAgICAgICBpZiggdG1wX2J1ZiApCisgICAgICAgICAgICAgICAgICAgIGRwdHIgPSB0bXBfYnVmOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGRmdF9mdW5jKCBzcHRyLCBkcHRyLCBsZW4sIG5mLCBmYWN0b3JzLCBpdGFiLCB3YXZlLCBsZW4sIHNwZWMsIHB0ciwgX2ZsYWdzLCBzY2FsZSApOworICAgICAgICAgICAgICAgIGlmKCBkcHRyICE9IGRwdHIwICkKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBkcHRyMCwgZHB0ciArIGRwdHJfb2Zmc2V0LCBkc3RfZnVsbF9sZW4gKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogZHB0cjAgPSBkc3QtPmRhdGEucHRyICsgaSpkc3QtPnN0ZXA7CisgICAgICAgICAgICAgICAgbWVtc2V0KCBkcHRyMCwgMCwgZHN0X2Z1bGxfbGVuICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzdGFnZSAhPSAxICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHNyYyA9IGRzdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBhID0gMCwgYiA9IGNvdW50OworICAgICAgICAgICAgdWNoYXIgKmJ1ZjAsICpidWYxLCAqZGJ1ZjAsICpkYnVmMTsKKyAgICAgICAgICAgIHVjaGFyKiBzcHRyMCA9IHNyYy0+ZGF0YS5wdHI7CisgICAgICAgICAgICB1Y2hhciogZHB0cjAgPSBkc3QtPmRhdGEucHRyOworICAgICAgICAgICAgYnVmMCA9IHB0cjsKKyAgICAgICAgICAgIHB0ciArPSBsZW4qY29tcGxleF9lbGVtX3NpemU7CisgICAgICAgICAgICBidWYxID0gcHRyOworICAgICAgICAgICAgcHRyICs9IGxlbipjb21wbGV4X2VsZW1fc2l6ZTsKKyAgICAgICAgICAgIGRidWYwID0gYnVmMCwgZGJ1ZjEgPSBidWYxOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggdXNlX2J1ZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGJ1ZjEgPSBwdHI7CisgICAgICAgICAgICAgICAgZGJ1ZjAgPSBidWYxOworICAgICAgICAgICAgICAgIHB0ciArPSBsZW4qY29tcGxleF9lbGVtX3NpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRmdF9mdW5jID0gZGZ0X3RibFsoZGVwdGggPT0gQ1ZfNjRGKSozXTsKKworICAgICAgICAgICAgaWYoIHJlYWxfdHJhbnNmb3JtICYmIGludiAmJiBzcmMtPmNvbHMgPiAxICkKKyAgICAgICAgICAgICAgICBzdGFnZSA9IDA7CisgICAgICAgICAgICBlbHNlIGlmKCBmbGFncyAmIENWX0RYVF9TQ0FMRSApCisgICAgICAgICAgICAgICAgc2NhbGUgPSAxLi8obGVuICogY291bnQpOworCisgICAgICAgICAgICBpZiggcmVhbF90cmFuc2Zvcm0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBldmVuOworICAgICAgICAgICAgICAgIGEgPSAxOworICAgICAgICAgICAgICAgIGV2ZW4gPSAoY291bnQgJiAxKSA9PSAwOworICAgICAgICAgICAgICAgIGIgPSAoY291bnQrMSkvMjsKKyAgICAgICAgICAgICAgICBpZiggIWludiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGJ1ZjAsIDAsIGxlbipjb21wbGV4X2VsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBzcHRyMCwgc3JjLT5zdGVwLCBidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgbGVuLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgc3B0cjAgKz0gQ1ZfTUFUX0NOKGRzdC0+dHlwZSkqZWxlbV9zaXplOworICAgICAgICAgICAgICAgICAgICBpZiggZXZlbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCggYnVmMSwgMCwgbGVuKmNvbXBsZXhfZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBzcHRyMCArIChjb3VudC0yKSplbGVtX3NpemUsIHNyYy0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZjEsIGNvbXBsZXhfZWxlbV9zaXplLCBsZW4sIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIENWX01BVF9DTihzcmMtPnR5cGUpID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2Q29weUNvbHVtbiggc3B0cjAsIHNyYy0+c3RlcCwgYnVmMCArIGVsZW1fc2l6ZSwgZWxlbV9zaXplLCBsZW4sIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBpY3ZFeHBhbmRDQ1MoIGJ1ZjAgKyBlbGVtX3NpemUsIGxlbiwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBldmVuICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q29weUNvbHVtbiggc3B0cjAgKyAoY291bnQtMSkqZWxlbV9zaXplLCBzcmMtPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYxICsgZWxlbV9zaXplLCBlbGVtX3NpemUsIGxlbiwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZFeHBhbmRDQ1MoIGJ1ZjEgKyBlbGVtX3NpemUsIGxlbiwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3B0cjAgKz0gZWxlbV9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBzcHRyMCwgc3JjLT5zdGVwLCBidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgbGVuLCBjb21wbGV4X2VsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAvL21lbWNweSggYnVmMCArIGVsZW1fc2l6ZSwgYnVmMCwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIC8vaWN2RXhwYW5kQ0NTKCBidWYwICsgZWxlbV9zaXplLCBsZW4sIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBpZiggZXZlbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkNvcHlDb2x1bW4oIHNwdHIwICsgYipjb21wbGV4X2VsZW1fc2l6ZSwgc3JjLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmMSwgY29tcGxleF9lbGVtX3NpemUsIGxlbiwgY29tcGxleF9lbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVtY3B5KCBidWYwICsgZWxlbV9zaXplLCBidWYwLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vaWN2RXhwYW5kQ0NTKCBidWYwICsgZWxlbV9zaXplLCBsZW4sIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwdHIwICs9IGNvbXBsZXhfZWxlbV9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggZXZlbiApCisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZGZ0X2Z1bmMoIGJ1ZjEsIGRidWYxLCBsZW4sIG5mLCBmYWN0b3JzLCBpdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLCBsZW4sIHNwZWMsIHB0ciwgaW52LCBzY2FsZSApKTsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGRmdF9mdW5jKCBidWYwLCBkYnVmMCwgbGVuLCBuZiwgZmFjdG9ycywgaXRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLCBsZW4sIHNwZWMsIHB0ciwgaW52LCBzY2FsZSApKTsKKworICAgICAgICAgICAgICAgIGlmKCBDVl9NQVRfQ04oZHN0LT50eXBlKSA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhaW52ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgaGFsZiBvZiBvdXRwdXQgdmVjdG9yIHRvIHRoZSBmaXJzdC9sYXN0IGNvbHVtbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBkb2luZyB0aGF0LCBkZWZncmFnbWVudCB0aGUgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGRidWYwICsgZWxlbV9zaXplLCBkYnVmMCwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBkYnVmMCArIGVsZW1fc2l6ZSwgZWxlbV9zaXplLCBkcHRyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgbGVuLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBldmVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGRidWYxICsgZWxlbV9zaXplLCBkYnVmMSwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q29weUNvbHVtbiggZGJ1ZjEgKyBlbGVtX3NpemUsIGVsZW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHRyMCArIChjb3VudC0xKSplbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5zdGVwLCBsZW4sIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHB0cjAgKz0gZWxlbV9zaXplOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgcmVhbCBwYXJ0IG9mIHRoZSBjb21wbGV4IHZlY3RvciB0byB0aGUgZmlyc3QvbGFzdCBjb2x1bW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkNvcHlDb2x1bW4oIGRidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgZHB0cjAsIGRzdC0+c3RlcCwgbGVuLCBlbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBldmVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBkYnVmMSwgY29tcGxleF9lbGVtX3NpemUsIGRwdHIwICsgKGNvdW50LTEpKmVsZW1fc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIGxlbiwgZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICAgICBkcHRyMCArPSBlbGVtX3NpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCAhaW52ICk7CisgICAgICAgICAgICAgICAgICAgIGljdkNvcHlDb2x1bW4oIGRidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgZHB0cjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+c3RlcCwgbGVuLCBjb21wbGV4X2VsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBpZiggZXZlbiApCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBkYnVmMSwgY29tcGxleF9lbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcHRyMCArIGIqY29tcGxleF9lbGVtX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIGxlbiwgY29tcGxleF9lbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgZHB0cjAgKz0gY29tcGxleF9lbGVtX3NpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGkgPSBhOyBpIDwgYjsgaSArPSAyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggaSsxIDwgYiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5RnJvbTJDb2x1bW5zKCBzcHRyMCwgc3JjLT5zdGVwLCBidWYwLCBidWYxLCBsZW4sIGNvbXBsZXhfZWxlbV9zaXplICk7CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZGZ0X2Z1bmMoIGJ1ZjEsIGRidWYxLCBsZW4sIG5mLCBmYWN0b3JzLCBpdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXZlLCBsZW4sIHNwZWMsIHB0ciwgaW52LCBzY2FsZSApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5Q29sdW1uKCBzcHRyMCwgc3JjLT5zdGVwLCBidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgbGVuLCBjb21wbGV4X2VsZW1fc2l6ZSApOworCisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBkZnRfZnVuYyggYnVmMCwgZGJ1ZjAsIGxlbiwgbmYsIGZhY3RvcnMsIGl0YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F2ZSwgbGVuLCBzcGVjLCBwdHIsIGludiwgc2NhbGUgKSk7CisKKyAgICAgICAgICAgICAgICBpZiggaSsxIDwgYiApCisgICAgICAgICAgICAgICAgICAgIGljdkNvcHlUbzJDb2x1bW5zKCBkYnVmMCwgZGJ1ZjEsIGRwdHIwLCBkc3QtPnN0ZXAsIGxlbiwgY29tcGxleF9lbGVtX3NpemUgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGljdkNvcHlDb2x1bW4oIGRidWYwLCBjb21wbGV4X2VsZW1fc2l6ZSwgZHB0cjAsIGRzdC0+c3RlcCwgbGVuLCBjb21wbGV4X2VsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgIHNwdHIwICs9IDIqY29tcGxleF9lbGVtX3NpemU7CisgICAgICAgICAgICAgICAgZHB0cjAgKz0gMipjb21wbGV4X2VsZW1fc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHN0YWdlICE9IDAgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgc3JjID0gZHN0OworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBidWZmZXIgJiYgIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisKKyAgICBpZiggc3BlY19jICkKKyAgICB7CisgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgaWN2REZURnJlZV9DXzMyZmNfcCggc3BlY19jICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGljdkRGVEZyZWVfQ182NGZjX3AoIHNwZWNfYyApOworICAgIH0KKworICAgIGlmKCBzcGVjX3IgKQorICAgIHsKKyAgICAgICAgaWYoIGRlcHRoID09IENWXzMyRiApCisgICAgICAgICAgICBpY3ZERlRGcmVlX1JfMzJmX3AoIHNwZWNfciApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpY3ZERlRGcmVlX1JfNjRmX3AoIHNwZWNfciApOworICAgIH0KK30KKworCitDVl9JTVBMIHZvaWQKK2N2TXVsU3BlY3RydW1zKCBjb25zdCBDdkFyciogc3JjQWFyciwgY29uc3QgQ3ZBcnIqIHNyY0JhcnIsCisgICAgICAgICAgICAgICAgQ3ZBcnIqIGRzdGFyciwgaW50IGZsYWdzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TXVsU3BlY3RydW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YkEsICpzcmNBID0gKEN2TWF0KilzcmNBYXJyOworICAgIEN2TWF0IHN0dWJCLCAqc3JjQiA9IChDdk1hdCopc3JjQmFycjsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgaW50IHN0ZXBBLCBzdGVwQiwgc3RlcEM7CisgICAgaW50IHR5cGUsIGNuLCBpc18xZDsKKyAgICBpbnQgaiwgajAsIGoxLCBrLCByb3dzLCBjb2xzLCBuY29sczsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyY0EpKQorICAgICAgICBDVl9DQUxMKCBzcmNBID0gY3ZHZXRNYXQoIHNyY0EsICZzdHViQSwgMCApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyY0IpKQorICAgICAgICBDVl9DQUxMKCBzcmNCID0gY3ZHZXRNYXQoIHNyY0IsICZzdHViQiwgMCApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAwICkpOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyY0EsIHNyY0IgKSB8fCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmNBLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjQSwgc3JjQiApIHx8ICFDVl9BUkVfU0laRVNfRVEoIHNyY0EsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIGRzdC0+dHlwZSApOworICAgIGNuID0gQ1ZfTUFUX0NOKHR5cGUpOworICAgIHJvd3MgPSBzcmNBLT5yb3dzOworICAgIGNvbHMgPSBzcmNBLT5jb2xzOworICAgIGlzXzFkID0gKGZsYWdzICYgQ1ZfRFhUX1JPV1MpIHx8CisgICAgICAgICAgICAocm93cyA9PSAxIHx8IChjb2xzID09IDEgJiYKKyAgICAgICAgICAgICBDVl9JU19NQVRfQ09OVCggc3JjQS0+dHlwZSAmIHNyY0ItPnR5cGUgJiBkc3QtPnR5cGUgKSkpOworCisgICAgaWYoIGlzXzFkICYmICEoZmxhZ3MgJiBDVl9EWFRfUk9XUykgKQorICAgICAgICBjb2xzID0gY29scyArIHJvd3MgLSAxLCByb3dzID0gMTsKKyAgICBuY29scyA9IGNvbHMqY247CisgICAgajAgPSBjbiA9PSAxOworICAgIGoxID0gbmNvbHMgLSAoY29scyAlIDIgPT0gMCAmJiBjbiA9PSAxKTsKKworICAgIGlmKCBDVl9NQVRfREVQVEgodHlwZSkgPT0gQ1ZfMzJGICkKKyAgICB7CisgICAgICAgIGZsb2F0KiBkYXRhQSA9IHNyY0EtPmRhdGEuZmw7CisgICAgICAgIGZsb2F0KiBkYXRhQiA9IHNyY0ItPmRhdGEuZmw7CisgICAgICAgIGZsb2F0KiBkYXRhQyA9IGRzdC0+ZGF0YS5mbDsKKworICAgICAgICBzdGVwQSA9IHNyY0EtPnN0ZXAvc2l6ZW9mKGRhdGFBWzBdKTsKKyAgICAgICAgc3RlcEIgPSBzcmNCLT5zdGVwL3NpemVvZihkYXRhQlswXSk7CisgICAgICAgIHN0ZXBDID0gZHN0LT5zdGVwL3NpemVvZihkYXRhQ1swXSk7CisKKyAgICAgICAgaWYoICFpc18xZCAmJiBjbiA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IChjb2xzICUgMiA/IDEgOiAyKTsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggayA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUEgKz0gY29scyAtIDEsIGRhdGFCICs9IGNvbHMgLSAxLCBkYXRhQyArPSBjb2xzIC0gMTsKKyAgICAgICAgICAgICAgICBkYXRhQ1swXSA9IGRhdGFBWzBdKmRhdGFCWzBdOworICAgICAgICAgICAgICAgIGlmKCByb3dzICUgMiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUNbKHJvd3MtMSkqc3RlcENdID0gZGF0YUFbKHJvd3MtMSkqc3RlcEFdKmRhdGFCWyhyb3dzLTEpKnN0ZXBCXTsKKyAgICAgICAgICAgICAgICBpZiggIShmbGFncyAmIENWX0RYVF9NVUxfQ09OSikgKQorICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDw9IHJvd3MgLSAyOyBqICs9IDIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmUgPSAoZG91YmxlKWRhdGFBW2oqc3RlcEFdKmRhdGFCW2oqc3RlcEJdIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YUFbKGorMSkqc3RlcEFdKmRhdGFCWyhqKzEpKnN0ZXBCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbSA9IChkb3VibGUpZGF0YUFbaipzdGVwQV0qZGF0YUJbKGorMSkqc3RlcEJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpZGF0YUFbKGorMSkqc3RlcEFdKmRhdGFCW2oqc3RlcEJdOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUNbaipzdGVwQ10gPSAoZmxvYXQpcmU7IGRhdGFDWyhqKzEpKnN0ZXBDXSA9IChmbG9hdClpbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8PSByb3dzIC0gMjsgaiArPSAyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlID0gKGRvdWJsZSlkYXRhQVtqKnN0ZXBBXSpkYXRhQltqKnN0ZXBCXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGFBWyhqKzEpKnN0ZXBBXSpkYXRhQlsoaisxKSpzdGVwQl07CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgaW0gPSAoZG91YmxlKWRhdGFBWyhqKzEpKnN0ZXBBXSpkYXRhQltqKnN0ZXBCXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKWRhdGFBW2oqc3RlcEFdKmRhdGFCWyhqKzEpKnN0ZXBCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFDW2oqc3RlcENdID0gKGZsb2F0KXJlOyBkYXRhQ1soaisxKSpzdGVwQ10gPSAoZmxvYXQpaW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggayA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUEgLT0gY29scyAtIDEsIGRhdGFCIC09IGNvbHMgLSAxLCBkYXRhQyAtPSBjb2xzIC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyByb3dzLS07IGRhdGFBICs9IHN0ZXBBLCBkYXRhQiArPSBzdGVwQiwgZGF0YUMgKz0gc3RlcEMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaXNfMWQgJiYgY24gPT0gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZGF0YUNbMF0gPSBkYXRhQVswXSpkYXRhQlswXTsKKyAgICAgICAgICAgICAgICBpZiggY29scyAlIDIgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGRhdGFDW2oxXSA9IGRhdGFBW2oxXSpkYXRhQltqMV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfRFhUX01VTF9DT05KKSApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gajA7IGogPCBqMTsgaiArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZSA9IChkb3VibGUpZGF0YUFbal0qZGF0YUJbal0gLSAoZG91YmxlKWRhdGFBW2orMV0qZGF0YUJbaisxXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGltID0gKGRvdWJsZSlkYXRhQVtqKzFdKmRhdGFCW2pdICsgKGRvdWJsZSlkYXRhQVtqXSpkYXRhQltqKzFdOworICAgICAgICAgICAgICAgICAgICBkYXRhQ1tqXSA9IChmbG9hdClyZTsgZGF0YUNbaisxXSA9IChmbG9hdClpbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gajA7IGogPCBqMTsgaiArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSByZSA9IChkb3VibGUpZGF0YUFbal0qZGF0YUJbal0gKyAoZG91YmxlKWRhdGFBW2orMV0qZGF0YUJbaisxXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGltID0gKGRvdWJsZSlkYXRhQVtqKzFdKmRhdGFCW2pdIC0gKGRvdWJsZSlkYXRhQVtqXSpkYXRhQltqKzFdOworICAgICAgICAgICAgICAgICAgICBkYXRhQ1tqXSA9IChmbG9hdClyZTsgZGF0YUNbaisxXSA9IChmbG9hdClpbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzY0RiApCisgICAgeworICAgICAgICBkb3VibGUqIGRhdGFBID0gc3JjQS0+ZGF0YS5kYjsKKyAgICAgICAgZG91YmxlKiBkYXRhQiA9IHNyY0ItPmRhdGEuZGI7CisgICAgICAgIGRvdWJsZSogZGF0YUMgPSBkc3QtPmRhdGEuZGI7CisKKyAgICAgICAgc3RlcEEgPSBzcmNBLT5zdGVwL3NpemVvZihkYXRhQVswXSk7CisgICAgICAgIHN0ZXBCID0gc3JjQi0+c3RlcC9zaXplb2YoZGF0YUJbMF0pOworICAgICAgICBzdGVwQyA9IGRzdC0+c3RlcC9zaXplb2YoZGF0YUNbMF0pOworCisgICAgICAgIGlmKCAhaXNfMWQgJiYgY24gPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCAoY29scyAlIDIgPyAxIDogMik7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGsgPT0gMSApCisgICAgICAgICAgICAgICAgICAgIGRhdGFBICs9IGNvbHMgLSAxLCBkYXRhQiArPSBjb2xzIC0gMSwgZGF0YUMgKz0gY29scyAtIDE7CisgICAgICAgICAgICAgICAgZGF0YUNbMF0gPSBkYXRhQVswXSpkYXRhQlswXTsKKyAgICAgICAgICAgICAgICBpZiggcm93cyAlIDIgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGRhdGFDWyhyb3dzLTEpKnN0ZXBDXSA9IGRhdGFBWyhyb3dzLTEpKnN0ZXBBXSpkYXRhQlsocm93cy0xKSpzdGVwQl07CisgICAgICAgICAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9EWFRfTVVMX0NPTkopICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8PSByb3dzIC0gMjsgaiArPSAyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlID0gZGF0YUFbaipzdGVwQV0qZGF0YUJbaipzdGVwQl0gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUFbKGorMSkqc3RlcEFdKmRhdGFCWyhqKzEpKnN0ZXBCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbSA9IGRhdGFBW2oqc3RlcEFdKmRhdGFCWyhqKzEpKnN0ZXBCXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQVsoaisxKSpzdGVwQV0qZGF0YUJbaipzdGVwQl07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ1tqKnN0ZXBDXSA9IHJlOyBkYXRhQ1soaisxKSpzdGVwQ10gPSBpbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8PSByb3dzIC0gMjsgaiArPSAyICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlID0gZGF0YUFbaipzdGVwQV0qZGF0YUJbaipzdGVwQl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUFbKGorMSkqc3RlcEFdKmRhdGFCWyhqKzEpKnN0ZXBCXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbSA9IGRhdGFBWyhqKzEpKnN0ZXBBXSpkYXRhQltqKnN0ZXBCXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQVtqKnN0ZXBBXSpkYXRhQlsoaisxKSpzdGVwQl07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhQ1tqKnN0ZXBDXSA9IHJlOyBkYXRhQ1soaisxKSpzdGVwQ10gPSBpbTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBrID09IDEgKQorICAgICAgICAgICAgICAgICAgICBkYXRhQSAtPSBjb2xzIC0gMSwgZGF0YUIgLT0gY29scyAtIDEsIGRhdGFDIC09IGNvbHMgLSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IHJvd3MtLTsgZGF0YUEgKz0gc3RlcEEsIGRhdGFCICs9IHN0ZXBCLCBkYXRhQyArPSBzdGVwQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpc18xZCAmJiBjbiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhQ1swXSA9IGRhdGFBWzBdKmRhdGFCWzBdOworICAgICAgICAgICAgICAgIGlmKCBjb2xzICUgMiA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgZGF0YUNbajFdID0gZGF0YUFbajFdKmRhdGFCW2oxXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9EWFRfTVVMX0NPTkopICkKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBqMDsgaiA8IGoxOyBqICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHJlID0gZGF0YUFbal0qZGF0YUJbal0gLSBkYXRhQVtqKzFdKmRhdGFCW2orMV07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBpbSA9IGRhdGFBW2orMV0qZGF0YUJbal0gKyBkYXRhQVtqXSpkYXRhQltqKzFdOworICAgICAgICAgICAgICAgICAgICBkYXRhQ1tqXSA9IHJlOyBkYXRhQ1tqKzFdID0gaW07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaiA9IGowOyBqIDwgajE7IGogKz0gMiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgcmUgPSBkYXRhQVtqXSpkYXRhQltqXSArIGRhdGFBW2orMV0qZGF0YUJbaisxXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGltID0gZGF0YUFbaisxXSpkYXRhQltqXSAtIGRhdGFBW2pdKmRhdGFCW2orMV07CisgICAgICAgICAgICAgICAgICAgIGRhdGFDW2pdID0gcmU7IGRhdGFDW2orMV0gPSBpbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiT25seSAzMmYgYW5kIDY0ZiB0eXBlcyBhcmUgc3VwcG9ydGVkIiApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzY3JldGUgQ29zaW5lIFRyYW5zZm9ybQorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERDVCBpcyBjYWxjdWxhdGVkIHVzaW5nIERGVCwgYXMgZGVzY3JpYmVkIGhlcmU6CisgICBodHRwOi8vd3d3LmVjZS51dGV4YXMuZWR1L35iZXZhbnMvY291cnNlcy9lZTM4MWsvbGVjdHVyZXMvMDlfRENUL2xlY3R1cmU5LzoKKyovCisjZGVmaW5lIElDVl9EQ1RfRldEKCBmbGF2b3IsIGRhdGF0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZEQ1RfZndkXyMjZmxhdm9yKCBjb25zdCBkYXRhdHlwZSogc3JjLCBpbnQgc3JjX3N0ZXAsIGRhdGF0eXBlKiBkZnRfc3JjLFwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlKiBkZnRfZHN0LCBkYXRhdHlwZSogZHN0LCBpbnQgZHN0X3N0ZXAsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgbmYsIGludCogZmFjdG9ycywgY29uc3QgaW50KiBpdGFiLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleCMjZmxhdm9yKiBkZnRfd2F2ZSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleCMjZmxhdm9yKiBkY3Rfd2F2ZSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWMsIEN2Q29tcGxleCMjZmxhdm9yKiBidWYgKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaiwgbjIgPSBuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNfc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkYXRhdHlwZSogZHN0MSA9IGRzdCArIChuLTEpKmRzdF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggbiA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAwOyBqIDwgbjI7IGorKywgc3JjICs9IHNyY19zdGVwKjIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGZ0X3NyY1tqXSA9IHNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGZ0X3NyY1tuLWotMV0gPSBzcmNbc3JjX3N0ZXBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpY3ZSZWFsREZUXyMjZmxhdm9yKCBkZnRfc3JjLCBkZnRfZHN0LCBuLCBuZiwgZmFjdG9ycywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpdGFiLCBkZnRfd2F2ZSwgbiwgc3BlYywgYnVmLCAwLCAxLjAgKTsgICAgICAgIFwKKyAgICBzcmMgPSBkZnRfZHN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMF0gPSAoZGF0YXR5cGUpKHNyY1swXSpkY3Rfd2F2ZS0+cmUqaWN2X3Npbl80NSk7ICAgICAgICAgICAgICAgIFwKKyAgICBkc3QgKz0gZHN0X3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAxLCBkY3Rfd2F2ZSsrOyBqIDwgbjI7IGorKywgZGN0X3dhdmUrKywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdCArPSBkc3Rfc3RlcCwgZHN0MSAtPSBkc3Rfc3RlcCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHQwID0gZGN0X3dhdmUtPnJlKnNyY1tqKjItMV0gLSBkY3Rfd2F2ZS0+aW0qc3JjW2oqMl07ICAgIFwKKyAgICAgICAgZG91YmxlIHQxID0gLWRjdF93YXZlLT5pbSpzcmNbaioyLTFdIC0gZGN0X3dhdmUtPnJlKnNyY1tqKjJdOyAgIFwKKyAgICAgICAgZHN0WzBdID0gKGRhdGF0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0MVswXSA9IChkYXRhdHlwZSl0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RbMF0gPSAoZGF0YXR5cGUpKHNyY1tuLTFdKmRjdF93YXZlLT5yZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9EQ1RfSU5WKCBmbGF2b3IsIGRhdGF0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZEQ1RfaW52XyMjZmxhdm9yKCBjb25zdCBkYXRhdHlwZSogc3JjLCBpbnQgc3JjX3N0ZXAsIGRhdGF0eXBlKiBkZnRfc3JjLFwKKyAgICAgICAgICAgICAgICAgICAgIGRhdGF0eXBlKiBkZnRfZHN0LCBkYXRhdHlwZSogZHN0LCBpbnQgZHN0X3N0ZXAsICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGludCBuLCBpbnQgbmYsIGludCogZmFjdG9ycywgY29uc3QgaW50KiBpdGFiLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleCMjZmxhdm9yKiBkZnRfd2F2ZSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q29tcGxleCMjZmxhdm9yKiBkY3Rfd2F2ZSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNwZWMsIEN2Q29tcGxleCMjZmxhdm9yKiBidWYgKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaiwgbjIgPSBuID4+IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNfc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3Rfc3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBkYXRhdHlwZSogc3JjMSA9IHNyYyArIChuLTEpKnNyY19zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggbiA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gc3JjWzBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZnRfc3JjWzBdID0gKGRhdGF0eXBlKShzcmNbMF0qMipkY3Rfd2F2ZS0+cmUqaWN2X3Npbl80NSk7ICAgICAgICAgIFwKKyAgICBzcmMgKz0gc3JjX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAxLCBkY3Rfd2F2ZSsrOyBqIDwgbjI7IGorKywgZGN0X3dhdmUrKywgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYyArPSBzcmNfc3RlcCwgc3JjMSAtPSBzcmNfc3RlcCApIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHQwID0gZGN0X3dhdmUtPnJlKnNyY1swXSAtIGRjdF93YXZlLT5pbSpzcmMxWzBdOyAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIHQxID0gLWRjdF93YXZlLT5pbSpzcmNbMF0gLSBkY3Rfd2F2ZS0+cmUqc3JjMVswXTsgICAgICAgIFwKKyAgICAgICAgZGZ0X3NyY1tqKjItMV0gPSAoZGF0YXR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGZ0X3NyY1tqKjJdID0gKGRhdGF0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZnRfc3JjW24tMV0gPSAoZGF0YXR5cGUpKHNyY1swXSoyKmRjdF93YXZlLT5yZSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBpY3ZDQ1NJREZUXyMjZmxhdm9yKCBkZnRfc3JjLCBkZnRfZHN0LCBuLCBuZiwgZmFjdG9ycywgaXRhYiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkZnRfd2F2ZSwgbiwgc3BlYywgYnVmLCBDVl9EWFRfSU5WRVJTRSwgMS4wICk7IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGogPSAwOyBqIDwgbjI7IGorKywgZHN0ICs9IGRzdF9zdGVwKjIgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0WzBdID0gZGZ0X2RzdFtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2RzdF9zdGVwXSA9IGRmdF9kc3Rbbi1qLTFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfRENUX0ZXRCggNjRmLCBkb3VibGUgKQorSUNWX0RDVF9JTlYoIDY0ZiwgZG91YmxlICkKK0lDVl9EQ1RfRldEKCAzMmYsIGZsb2F0ICkKK0lDVl9EQ1RfSU5WKCAzMmYsIGZsb2F0ICkKKworc3RhdGljIHZvaWQKK2ljdkRDVEluaXQoIGludCBuLCBpbnQgZWxlbV9zaXplLCB2b2lkKiBfd2F2ZSwgaW50IGludiApCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBpY3ZEY3RTY2FsZVtdID0KKyAgICB7CisgICAgMC43MDcxMDY3ODExODY1NDc1NzAsIDAuNTAwMDAwMDAwMDAwMDAwMDAwLCAwLjM1MzU1MzM5MDU5MzI3Mzc5MCwKKyAgICAwLjI1MDAwMDAwMDAwMDAwMDAwMCwgMC4xNzY3NzY2OTUyOTY2MzY4OTAsIDAuMTI1MDAwMDAwMDAwMDAwMDAwLAorICAgIDAuMDg4Mzg4MzQ3NjQ4MzE4NDQ3LCAwLjA2MjUwMDAwMDAwMDAwMDAwMCwgMC4wNDQxOTQxNzM4MjQxNTkyMjMsCisgICAgMC4wMzEyNTAwMDAwMDAwMDAwMDAsIDAuMDIyMDk3MDg2OTEyMDc5NjEyLCAwLjAxNTYyNTAwMDAwMDAwMDAwMCwKKyAgICAwLjAxMTA0ODU0MzQ1NjAzOTgwNiwgMC4wMDc4MTI1MDAwMDAwMDAwMDAsIDAuMDA1NTI0MjcxNzI4MDE5OTAzLAorICAgIDAuMDAzOTA2MjUwMDAwMDAwMDAwLCAwLjAwMjc2MjEzNTg2NDAwOTk1MiwgMC4wMDE5NTMxMjUwMDAwMDAwMDAsCisgICAgMC4wMDEzODEwNjc5MzIwMDQ5NzYsIDAuMDAwOTc2NTYyNTAwMDAwMDAwLCAwLjAwMDY5MDUzMzk2NjAwMjQ4OCwKKyAgICAwLjAwMDQ4ODI4MTI1MDAwMDAwMCwgMC4wMDAzNDUyNjY5ODMwMDEyNDQsIDAuMDAwMjQ0MTQwNjI1MDAwMDAwLAorICAgIDAuMDAwMTcyNjMzNDkxNTAwNjIyLCAwLjAwMDEyMjA3MDMxMjUwMDAwMCwgMC4wMDAwODYzMTY3NDU3NTAzMTEsCisgICAgMC4wMDAwNjEwMzUxNTYyNTAwMDAsIDAuMDAwMDQzMTU4MzcyODc1MTU1LCAwLjAwMDAzMDUxNzU3ODEyNTAwMAorICAgIH07CisKKyAgICBpbnQgaTsKKyAgICBDdkNvbXBsZXg2NGYgdywgdzE7CisgICAgZG91YmxlIHQsIHNjYWxlOworICAgIAorICAgIGlmKCBuID09IDEgKQorICAgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQoIChuJjEpID09IDAgKTsKKworICAgIGlmKCAobiAmIChuIC0gMSkpID09IDAgKQorICAgIHsKKyAgICAgICAgaW50IG0gPSBpY3Zsb2cyKG4pOworICAgICAgICBzY2FsZSA9ICghaW52ID8gMiA6IDEpKmljdkRjdFNjYWxlW21dOworICAgICAgICB3MS5yZSA9IGljdkR4dFRhYlttKzJdWzBdOworICAgICAgICB3MS5pbSA9IC1pY3ZEeHRUYWJbbSsyXVsxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdCA9IDEuLygyKm4pOworICAgICAgICBzY2FsZSA9ICghaW52ID8gMiA6IDEpKnNxcnQodCk7CisgICAgICAgIHcxLmltID0gc2luKC1DVl9QSSp0KTsKKyAgICAgICAgdzEucmUgPSBzcXJ0KDEuIC0gdzEuaW0qdzEuaW0pOworICAgIH0KKyAgICBuID4+PSAxOworICAgIAorICAgIGlmKCBlbGVtX3NpemUgPT0gc2l6ZW9mKEN2Q29tcGxleDY0ZikgKQorICAgIHsKKyAgICAgICAgQ3ZDb21wbGV4NjRmKiB3YXZlID0gKEN2Q29tcGxleDY0ZiopX3dhdmU7CisKKyAgICAgICAgdy5yZSA9IHNjYWxlOworICAgICAgICB3LmltID0gMC47CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICB3YXZlW2ldID0gdzsKKyAgICAgICAgICAgIHQgPSB3LnJlKncxLnJlIC0gdy5pbSp3MS5pbTsKKyAgICAgICAgICAgIHcuaW0gPSB3LnJlKncxLmltICsgdy5pbSp3MS5yZTsKKyAgICAgICAgICAgIHcucmUgPSB0OworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2Q29tcGxleDMyZiogd2F2ZSA9IChDdkNvbXBsZXgzMmYqKV93YXZlOworICAgICAgICBhc3NlcnQoIGVsZW1fc2l6ZSA9PSBzaXplb2YoQ3ZDb21wbGV4MzJmKSApOworICAgICAgICAKKyAgICAgICAgdy5yZSA9IChmbG9hdClzY2FsZTsKKyAgICAgICAgdy5pbSA9IDAuZjsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdhdmVbaV0ucmUgPSAoZmxvYXQpdy5yZTsKKyAgICAgICAgICAgIHdhdmVbaV0uaW0gPSAoZmxvYXQpdy5pbTsKKyAgICAgICAgICAgIHQgPSB3LnJlKncxLnJlIC0gdy5pbSp3MS5pbTsKKyAgICAgICAgICAgIHcuaW0gPSB3LnJlKncxLmltICsgdy5pbSp3MS5yZTsKKyAgICAgICAgICAgIHcucmUgPSB0OworICAgICAgICB9CisgICAgfQorfQorCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkRDVEZ1bmMpKAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY19zdGVwLCB2b2lkKiBkZnRfc3JjLAorICAgICAgICAgICAgICAgIHZvaWQqIGRmdF9kc3QsIHZvaWQqIGRzdCwgaW50IGRzdF9zdGVwLCBpbnQgbiwKKyAgICAgICAgICAgICAgICBpbnQgbmYsIGludCogZmFjdG9ycywgY29uc3QgaW50KiBpdGFiLCBjb25zdCB2b2lkKiBkZnRfd2F2ZSwKKyAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkY3Rfd2F2ZSwgY29uc3Qgdm9pZCogc3BlYywgdm9pZCogYnVmICk7CisKK0NWX0lNUEwgdm9pZAorY3ZEQ1QoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGludCBmbGFncyApCit7CisgICAgc3RhdGljIEN2RENURnVuYyBkY3RfdGJsWzRdOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgCisgICAgdm9pZCogYnVmZmVyID0gMDsKKyAgICBpbnQgbG9jYWxfYWxsb2MgPSAxOworICAgIGludCBpbnYgPSAoZmxhZ3MgJiBDVl9EWFRfSU5WRVJTRSkgIT0gMCwgZGVwdGggPSAtMTsKKyAgICB2b2lkICpzcGVjX2RmdCA9IDAsICpzcGVjID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2RENUIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIHNjYWxlID0gMS47CisgICAgaW50IHByZXZfbGVuID0gMCwgYnVmX3NpemUgPSAwLCBuZiA9IDAsIHN0YWdlLCBlbmRfc3RhZ2U7CisgICAgQ3ZNYXQgKnNyYyA9IChDdk1hdCopc3JjYXJyLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgdWNoYXIgKnNyY19kZnRfYnVmID0gMCwgKmRzdF9kZnRfYnVmID0gMDsKKyAgICB1Y2hhciAqZGZ0X3dhdmUgPSAwLCAqZGN0X3dhdmUgPSAwOworICAgIGludCogaXRhYiA9IDA7CisgICAgdWNoYXIqIHB0ciA9IDA7CisgICAgQ3ZNYXQgc3Jjc3R1YiwgZHN0c3R1YjsKKyAgICBpbnQgY29tcGxleF9lbGVtX3NpemUsIGVsZW1fc2l6ZTsKKyAgICBpbnQgZmFjdG9yc1szNF0sIGlucGxhY2VfdHJhbnNmb3JtOworICAgIGludCBpLCBsZW4sIGNvdW50OworICAgIEN2RENURnVuYyBkY3RfZnVuYzsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBkY3RfdGJsWzBdID0gKEN2RENURnVuYylpY3ZEQ1RfZndkXzMyZjsKKyAgICAgICAgZGN0X3RibFsxXSA9IChDdkRDVEZ1bmMpaWN2RENUX2ludl8zMmY7CisgICAgICAgIGRjdF90YmxbMl0gPSAoQ3ZEQ1RGdW5jKWljdkRDVF9md2RfNjRmOworICAgICAgICBkY3RfdGJsWzNdID0gKEN2RENURnVuYylpY3ZEQ1RfaW52XzY0ZjsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoIHNyYyApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pICkpOworCisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBkc3QgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaSApKTsKKworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSChzcmMtPnR5cGUpOworICAgIGVsZW1fc2l6ZSA9IENWX0VMRU1fU0laRTEoZGVwdGgpOworICAgIGNvbXBsZXhfZWxlbV9zaXplID0gZWxlbV9zaXplKjI7CisKKyAgICAvLyBjaGVjayB0eXBlcyBhbmQgc2l6ZXMKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUShzcmMsIGRzdCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCBkZXB0aCA8IENWXzMyRiB8fCBDVl9NQVRfQ04oc3JjLT50eXBlKSAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiT25seSAzMmZDMSBhbmQgNjRmQzEgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIiApOworCisgICAgZGN0X2Z1bmMgPSBkY3RfdGJsW2ludiArIChkZXB0aCA9PSBDVl82NEYpKjJdOworCisgICAgaWYoIChmbGFncyAmIENWX0RYVF9ST1dTKSB8fCBzcmMtPnJvd3MgPT0gMSB8fAorICAgICAgICAoc3JjLT5jb2xzID09IDEgJiYgQ1ZfSVNfTUFUX0NPTlQoc3JjLT50eXBlICYgZHN0LT50eXBlKSkpCisgICAgeworICAgICAgICBzdGFnZSA9IGVuZF9zdGFnZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHN0YWdlID0gc3JjLT5jb2xzID09IDE7CisgICAgICAgIGVuZF9zdGFnZSA9IDE7CisgICAgfQorCisgICAgZm9yKCA7IHN0YWdlIDw9IGVuZF9zdGFnZTsgc3RhZ2UrKyApCisgICAgeworICAgICAgICB1Y2hhciAqc3B0ciA9IHNyYy0+ZGF0YS5wdHIsICpkcHRyID0gZHN0LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHNzdGVwMCwgc3N0ZXAxLCBkc3RlcDAsIGRzdGVwMTsKKyAgICAgICAgCisgICAgICAgIGlmKCBzdGFnZSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbGVuID0gc3JjLT5jb2xzOworICAgICAgICAgICAgY291bnQgPSBzcmMtPnJvd3M7CisgICAgICAgICAgICBpZiggbGVuID09IDEgJiYgIShmbGFncyAmIENWX0RYVF9ST1dTKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbGVuID0gc3JjLT5yb3dzOworICAgICAgICAgICAgICAgIGNvdW50ID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNzdGVwMCA9IHNyYy0+c3RlcDsKKyAgICAgICAgICAgIGRzdGVwMCA9IGRzdC0+c3RlcDsKKyAgICAgICAgICAgIHNzdGVwMSA9IGRzdGVwMSA9IGVsZW1fc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGxlbiA9IGRzdC0+cm93czsKKyAgICAgICAgICAgIGNvdW50ID0gZHN0LT5jb2xzOworICAgICAgICAgICAgc3N0ZXAxID0gc3JjLT5zdGVwOworICAgICAgICAgICAgZHN0ZXAxID0gZHN0LT5zdGVwOworICAgICAgICAgICAgc3N0ZXAwID0gZHN0ZXAwID0gZWxlbV9zaXplOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGxlbiAhPSBwcmV2X2xlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzejsKKworICAgICAgICAgICAgaWYoIGxlbiA+IDEgJiYgKGxlbiAmIDEpICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsICJPZGQtc2l6ZSBEQ1RcJ3MgYXJlIG5vdCBpbXBsZW1lbnRlZCIgKTsKKworICAgICAgICAgICAgc3ogPSBsZW4qZWxlbV9zaXplOworICAgICAgICAgICAgc3ogKz0gKGxlbi8yICsgMSkqY29tcGxleF9lbGVtX3NpemU7CisKKyAgICAgICAgICAgIHNwZWMgPSAwOworICAgICAgICAgICAgaW5wbGFjZV90cmFuc2Zvcm0gPSAxOworICAgICAgICAgICAgaWYoIGxlbipjb3VudCA+PSA2NCAmJiBpY3ZERlRJbml0QWxsb2NfUl8zMmZfcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlwcF9zeiA9IDA7CisgICAgICAgICAgICAgICAgaWYoIGRlcHRoID09IENWXzMyRiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc3BlY19kZnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRGcmVlX1JfMzJmX3AoIHNwZWNfZGZ0ICkpOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEluaXRBbGxvY19SXzMyZl9wKCAmc3BlY19kZnQsIGxlbiwgOCwgY3ZBbGdIaW50Tm9uZSApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRHZXRCdWZTaXplX1JfMzJmX3AoIHNwZWNfZGZ0LCAmaXBwX3N6ICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc3BlY19kZnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRGcmVlX1JfNjRmX3AoIHNwZWNfZGZ0ICkpOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGljdkRGVEluaXRBbGxvY19SXzY0Zl9wKCAmc3BlY19kZnQsIGxlbiwgOCwgY3ZBbGdIaW50Tm9uZSApKTsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZERlRHZXRCdWZTaXplX1JfNjRmX3AoIHNwZWNfZGZ0LCAmaXBwX3N6ICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcGVjID0gc3BlY19kZnQ7CisgICAgICAgICAgICAgICAgc3ogKz0gaXBwX3N6OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN6ICs9IGxlbiooY29tcGxleF9lbGVtX3NpemUgKyBzaXplb2YoaW50KSkgKyBjb21wbGV4X2VsZW1fc2l6ZTsKKworICAgICAgICAgICAgICAgIG5mID0gaWN2REZURmFjdG9yaXplKCBsZW4sIGZhY3RvcnMgKTsKKyAgICAgICAgICAgICAgICBpbnBsYWNlX3RyYW5zZm9ybSA9IGZhY3RvcnNbMF0gPT0gZmFjdG9yc1tuZi0xXTsKKworICAgICAgICAgICAgICAgIGkgPSBuZiA+IDEgJiYgKGZhY3RvcnNbMF0gJiAxKSA9PSAwOworICAgICAgICAgICAgICAgIGlmKCAoZmFjdG9yc1tpXSAmIDEpICE9IDAgJiYgZmFjdG9yc1tpXSA+IDUgKQorICAgICAgICAgICAgICAgICAgICBzeiArPSAoZmFjdG9yc1tpXSsxKSpjb21wbGV4X2VsZW1fc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmKCAhaW5wbGFjZV90cmFuc2Zvcm0gKQorICAgICAgICAgICAgICAgICAgICBzeiArPSBsZW4qZWxlbV9zaXplOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggc3ogPiBidWZfc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFsb2NhbF9hbGxvYyAmJiBidWZmZXIgKQorICAgICAgICAgICAgICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICAgICAgICAgICAgICBpZiggc3ogPD0gQ1ZfTUFYX0xPQ0FMX0RGVF9TSVpFICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gc3ogPSBDVl9NQVhfTE9DQUxfREZUX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyhzeiArIDMyKTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxfYWxsb2MgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSBjdkFsbG9jKHN6ICsgMzIpICk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zl9zaXplID0gc3o7CisgICAgICAgICAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB0ciA9ICh1Y2hhciopYnVmZmVyOworICAgICAgICAgICAgaWYoICFzcGVjICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkZnRfd2F2ZSA9IHB0cjsKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGVuKmNvbXBsZXhfZWxlbV9zaXplOworICAgICAgICAgICAgICAgIGl0YWIgPSAoaW50KilwdHI7CisgICAgICAgICAgICAgICAgcHRyID0gKHVjaGFyKiljdkFsaWduUHRyKCBwdHIgKyBsZW4qc2l6ZW9mKGludCksIDE2ICk7CisgICAgICAgICAgICAgICAgaWN2REZUSW5pdCggbGVuLCBuZiwgZmFjdG9ycywgaXRhYiwgY29tcGxleF9lbGVtX3NpemUsIGRmdF93YXZlLCBpbnYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGRjdF93YXZlID0gcHRyOworICAgICAgICAgICAgcHRyICs9IChsZW4vMiArIDEpKmNvbXBsZXhfZWxlbV9zaXplOworICAgICAgICAgICAgc3JjX2RmdF9idWYgPSBkc3RfZGZ0X2J1ZiA9IHB0cjsKKyAgICAgICAgICAgIHB0ciArPSBsZW4qZWxlbV9zaXplOworICAgICAgICAgICAgaWYoICFpbnBsYWNlX3RyYW5zZm9ybSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZHN0X2RmdF9idWYgPSBwdHI7CisgICAgICAgICAgICAgICAgcHRyICs9IGxlbiplbGVtX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpY3ZEQ1RJbml0KCBsZW4sIGNvbXBsZXhfZWxlbV9zaXplLCBkY3Rfd2F2ZSwgaW52ICk7CisgICAgICAgICAgICBpZiggIWludiApCisgICAgICAgICAgICAgICAgc2NhbGUgKz0gc2NhbGU7CisgICAgICAgICAgICBwcmV2X2xlbiA9IGxlbjsKKyAgICAgICAgfQorICAgICAgICAvLyBvdGhlcndpc2UgcmV1c2UgdGhlIHRhYmxlcyBjYWxjdWxhdGVkIG9uIHRoZSBwcmV2aW91cyBzdGFnZQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZGN0X2Z1bmMoIHNwdHIgKyBpKnNzdGVwMCwgc3N0ZXAxLCBzcmNfZGZ0X2J1ZiwgZHN0X2RmdF9idWYsCisgICAgICAgICAgICAgICAgICAgICAgZHB0ciArIGkqZHN0ZXAwLCBkc3RlcDEsIGxlbiwgbmYsIGZhY3RvcnMsCisgICAgICAgICAgICAgICAgICAgICAgaXRhYiwgZGZ0X3dhdmUsIGRjdF93YXZlLCBzcGVjLCBwdHIgKTsKKyAgICAgICAgfQorICAgICAgICBzcmMgPSBkc3Q7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBzcGVjX2RmdCApCisgICAgeworICAgICAgICBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgIGljdkRGVEZyZWVfUl8zMmZfcCggc3BlY19kZnQgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaWN2REZURnJlZV9SXzY0Zl9wKCBzcGVjX2RmdCApOworICAgIH0KKworICAgIGlmKCBidWZmZXIgJiYgIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKworc3RhdGljIGNvbnN0IGludCBpY3ZPcHRpbWFsREZUU2l6ZVtdID0geworMSwgMiwgMywgNCwgNSwgNiwgOCwgOSwgMTAsIDEyLCAxNSwgMTYsIDE4LCAyMCwgMjQsIDI1LCAyNywgMzAsIDMyLCAzNiwgNDAsIDQ1LCA0OCwgCis1MCwgNTQsIDYwLCA2NCwgNzIsIDc1LCA4MCwgODEsIDkwLCA5NiwgMTAwLCAxMDgsIDEyMCwgMTI1LCAxMjgsIDEzNSwgMTQ0LCAxNTAsIDE2MCwgCisxNjIsIDE4MCwgMTkyLCAyMDAsIDIxNiwgMjI1LCAyNDAsIDI0MywgMjUwLCAyNTYsIDI3MCwgMjg4LCAzMDAsIDMyMCwgMzI0LCAzNjAsIDM3NSwgCiszODQsIDQwMCwgNDA1LCA0MzIsIDQ1MCwgNDgwLCA0ODYsIDUwMCwgNTEyLCA1NDAsIDU3NiwgNjAwLCA2MjUsIDY0MCwgNjQ4LCA2NzUsIDcyMCwgCis3MjksIDc1MCwgNzY4LCA4MDAsIDgxMCwgODY0LCA5MDAsIDk2MCwgOTcyLCAxMDAwLCAxMDI0LCAxMDgwLCAxMTI1LCAxMTUyLCAxMjAwLCAKKzEyMTUsIDEyNTAsIDEyODAsIDEyOTYsIDEzNTAsIDE0NDAsIDE0NTgsIDE1MDAsIDE1MzYsIDE2MDAsIDE2MjAsIDE3MjgsIDE4MDAsIDE4NzUsIAorMTkyMCwgMTk0NCwgMjAwMCwgMjAyNSwgMjA0OCwgMjE2MCwgMjE4NywgMjI1MCwgMjMwNCwgMjQwMCwgMjQzMCwgMjUwMCwgMjU2MCwgMjU5MiwgCisyNzAwLCAyODgwLCAyOTE2LCAzMDAwLCAzMDcyLCAzMTI1LCAzMjAwLCAzMjQwLCAzMzc1LCAzNDU2LCAzNjAwLCAzNjQ1LCAzNzUwLCAzODQwLCAKKzM4ODgsIDQwMDAsIDQwNTAsIDQwOTYsIDQzMjAsIDQzNzQsIDQ1MDAsIDQ2MDgsIDQ4MDAsIDQ4NjAsIDUwMDAsIDUxMjAsIDUxODQsIDU0MDAsIAorNTYyNSwgNTc2MCwgNTgzMiwgNjAwMCwgNjA3NSwgNjE0NCwgNjI1MCwgNjQwMCwgNjQ4MCwgNjU2MSwgNjc1MCwgNjkxMiwgNzIwMCwgNzI5MCwgCis3NTAwLCA3NjgwLCA3Nzc2LCA4MDAwLCA4MTAwLCA4MTkyLCA4NjQwLCA4NzQ4LCA5MDAwLCA5MjE2LCA5Mzc1LCA5NjAwLCA5NzIwLCAxMDAwMCwgCisxMDEyNSwgMTAyNDAsIDEwMzY4LCAxMDgwMCwgMTA5MzUsIDExMjUwLCAxMTUyMCwgMTE2NjQsIDEyMDAwLCAxMjE1MCwgMTIyODgsIDEyNTAwLCAKKzEyODAwLCAxMjk2MCwgMTMxMjIsIDEzNTAwLCAxMzgyNCwgMTQ0MDAsIDE0NTgwLCAxNTAwMCwgMTUzNjAsIDE1NTUyLCAxNTYyNSwgMTYwMDAsIAorMTYyMDAsIDE2Mzg0LCAxNjg3NSwgMTcyODAsIDE3NDk2LCAxODAwMCwgMTgyMjUsIDE4NDMyLCAxODc1MCwgMTkyMDAsIDE5NDQwLCAxOTY4MywgCisyMDAwMCwgMjAyNTAsIDIwNDgwLCAyMDczNiwgMjE2MDAsIDIxODcwLCAyMjUwMCwgMjMwNDAsIDIzMzI4LCAyNDAwMCwgMjQzMDAsIDI0NTc2LCAKKzI1MDAwLCAyNTYwMCwgMjU5MjAsIDI2MjQ0LCAyNzAwMCwgMjc2NDgsIDI4MTI1LCAyODgwMCwgMjkxNjAsIDMwMDAwLCAzMDM3NSwgMzA3MjAsIAorMzExMDQsIDMxMjUwLCAzMjAwMCwgMzI0MDAsIDMyNzY4LCAzMjgwNSwgMzM3NTAsIDM0NTYwLCAzNDk5MiwgMzYwMDAsIDM2NDUwLCAzNjg2NCwgCiszNzUwMCwgMzg0MDAsIDM4ODgwLCAzOTM2NiwgNDAwMDAsIDQwNTAwLCA0MDk2MCwgNDE0NzIsIDQzMjAwLCA0Mzc0MCwgNDUwMDAsIDQ2MDgwLCAKKzQ2NjU2LCA0Njg3NSwgNDgwMDAsIDQ4NjAwLCA0OTE1MiwgNTAwMDAsIDUwNjI1LCA1MTIwMCwgNTE4NDAsIDUyNDg4LCA1NDAwMCwgNTQ2NzUsIAorNTUyOTYsIDU2MjUwLCA1NzYwMCwgNTgzMjAsIDU5MDQ5LCA2MDAwMCwgNjA3NTAsIDYxNDQwLCA2MjIwOCwgNjI1MDAsIDY0MDAwLCA2NDgwMCwgCis2NTUzNiwgNjU2MTAsIDY3NTAwLCA2OTEyMCwgNjk5ODQsIDcyMDAwLCA3MjkwMCwgNzM3MjgsIDc1MDAwLCA3NjgwMCwgNzc3NjAsIDc4MTI1LCAKKzc4NzMyLCA4MDAwMCwgODEwMDAsIDgxOTIwLCA4Mjk0NCwgODQzNzUsIDg2NDAwLCA4NzQ4MCwgOTAwMDAsIDkxMTI1LCA5MjE2MCwgOTMzMTIsIAorOTM3NTAsIDk2MDAwLCA5NzIwMCwgOTgzMDQsIDk4NDE1LCAxMDAwMDAsIDEwMTI1MCwgMTAyNDAwLCAxMDM2ODAsIDEwNDk3NiwgMTA4MDAwLCAKKzEwOTM1MCwgMTEwNTkyLCAxMTI1MDAsIDExNTIwMCwgMTE2NjQwLCAxMTgwOTgsIDEyMDAwMCwgMTIxNTAwLCAxMjI4ODAsIDEyNDQxNiwgMTI1MDAwLCAKKzEyODAwMCwgMTI5NjAwLCAxMzEwNzIsIDEzMTIyMCwgMTM1MDAwLCAxMzgyNDAsIDEzOTk2OCwgMTQwNjI1LCAxNDQwMDAsIDE0NTgwMCwgMTQ3NDU2LCAKKzE1MDAwMCwgMTUxODc1LCAxNTM2MDAsIDE1NTUyMCwgMTU2MjUwLCAxNTc0NjQsIDE2MDAwMCwgMTYyMDAwLCAxNjM4NDAsIDE2NDAyNSwgMTY1ODg4LCAKKzE2ODc1MCwgMTcyODAwLCAxNzQ5NjAsIDE3NzE0NywgMTgwMDAwLCAxODIyNTAsIDE4NDMyMCwgMTg2NjI0LCAxODc1MDAsIDE5MjAwMCwgMTk0NDAwLCAKKzE5NjYwOCwgMTk2ODMwLCAyMDAwMDAsIDIwMjUwMCwgMjA0ODAwLCAyMDczNjAsIDIwOTk1MiwgMjE2MDAwLCAyMTg3MDAsIDIyMTE4NCwgMjI1MDAwLCAKKzIzMDQwMCwgMjMzMjgwLCAyMzQzNzUsIDIzNjE5NiwgMjQwMDAwLCAyNDMwMDAsIDI0NTc2MCwgMjQ4ODMyLCAyNTAwMDAsIDI1MzEyNSwgMjU2MDAwLCAKKzI1OTIwMCwgMjYyMTQ0LCAyNjI0NDAsIDI3MDAwMCwgMjczMzc1LCAyNzY0ODAsIDI3OTkzNiwgMjgxMjUwLCAyODgwMDAsIDI5MTYwMCwgMjk0OTEyLCAKKzI5NTI0NSwgMzAwMDAwLCAzMDM3NTAsIDMwNzIwMCwgMzExMDQwLCAzMTI1MDAsIDMxNDkyOCwgMzIwMDAwLCAzMjQwMDAsIDMyNzY4MCwgMzI4MDUwLCAKKzMzMTc3NiwgMzM3NTAwLCAzNDU2MDAsIDM0OTkyMCwgMzU0Mjk0LCAzNjAwMDAsIDM2NDUwMCwgMzY4NjQwLCAzNzMyNDgsIDM3NTAwMCwgMzg0MDAwLCAKKzM4ODgwMCwgMzkwNjI1LCAzOTMyMTYsIDM5MzY2MCwgNDAwMDAwLCA0MDUwMDAsIDQwOTYwMCwgNDE0NzIwLCA0MTk5MDQsIDQyMTg3NSwgNDMyMDAwLCAKKzQzNzQwMCwgNDQyMzY4LCA0NTAwMDAsIDQ1NTYyNSwgNDYwODAwLCA0NjY1NjAsIDQ2ODc1MCwgNDcyMzkyLCA0ODAwMDAsIDQ4NjAwMCwgNDkxNTIwLCAKKzQ5MjA3NSwgNDk3NjY0LCA1MDAwMDAsIDUwNjI1MCwgNTEyMDAwLCA1MTg0MDAsIDUyNDI4OCwgNTI0ODgwLCA1MzE0NDEsIDU0MDAwMCwgNTQ2NzUwLCAKKzU1Mjk2MCwgNTU5ODcyLCA1NjI1MDAsIDU3NjAwMCwgNTgzMjAwLCA1ODk4MjQsIDU5MDQ5MCwgNjAwMDAwLCA2MDc1MDAsIDYxNDQwMCwgNjIyMDgwLCAKKzYyNTAwMCwgNjI5ODU2LCA2NDAwMDAsIDY0ODAwMCwgNjU1MzYwLCA2NTYxMDAsIDY2MzU1MiwgNjc1MDAwLCA2OTEyMDAsIDY5OTg0MCwgNzAzMTI1LCAKKzcwODU4OCwgNzIwMDAwLCA3MjkwMDAsIDczNzI4MCwgNzQ2NDk2LCA3NTAwMDAsIDc1OTM3NSwgNzY4MDAwLCA3Nzc2MDAsIDc4MTI1MCwgNzg2NDMyLCAKKzc4NzMyMCwgODAwMDAwLCA4MTAwMDAsIDgxOTIwMCwgODIwMTI1LCA4Mjk0NDAsIDgzOTgwOCwgODQzNzUwLCA4NjQwMDAsIDg3NDgwMCwgODg0NzM2LCAKKzg4NTczNSwgOTAwMDAwLCA5MTEyNTAsIDkyMTYwMCwgOTMzMTIwLCA5Mzc1MDAsIDk0NDc4NCwgOTYwMDAwLCA5NzIwMDAsIDk4MzA0MCwgOTg0MTUwLCAKKzk5NTMyOCwgMTAwMDAwMCwgMTAxMjUwMCwgMTAyNDAwMCwgMTAzNjgwMCwgMTA0ODU3NiwgMTA0OTc2MCwgMTA2Mjg4MiwgMTA4MDAwMCwgMTA5MzUwMCwgCisxMTA1OTIwLCAxMTE5NzQ0LCAxMTI1MDAwLCAxMTUyMDAwLCAxMTY2NDAwLCAxMTcxODc1LCAxMTc5NjQ4LCAxMTgwOTgwLCAxMjAwMDAwLCAKKzEyMTUwMDAsIDEyMjg4MDAsIDEyNDQxNjAsIDEyNTAwMDAsIDEyNTk3MTIsIDEyNjU2MjUsIDEyODAwMDAsIDEyOTYwMDAsIDEzMTA3MjAsIAorMTMxMjIwMCwgMTMyNzEwNCwgMTM1MDAwMCwgMTM2Njg3NSwgMTM4MjQwMCwgMTM5OTY4MCwgMTQwNjI1MCwgMTQxNzE3NiwgMTQ0MDAwMCwgCisxNDU4MDAwLCAxNDc0NTYwLCAxNDc2MjI1LCAxNDkyOTkyLCAxNTAwMDAwLCAxNTE4NzUwLCAxNTM2MDAwLCAxNTU1MjAwLCAxNTYyNTAwLCAKKzE1NzI4NjQsIDE1NzQ2NDAsIDE1OTQzMjMsIDE2MDAwMDAsIDE2MjAwMDAsIDE2Mzg0MDAsIDE2NDAyNTAsIDE2NTg4ODAsIDE2Nzk2MTYsIAorMTY4NzUwMCwgMTcyODAwMCwgMTc0OTYwMCwgMTc2OTQ3MiwgMTc3MTQ3MCwgMTgwMDAwMCwgMTgyMjUwMCwgMTg0MzIwMCwgMTg2NjI0MCwgCisxODc1MDAwLCAxODg5NTY4LCAxOTIwMDAwLCAxOTQ0MDAwLCAxOTUzMTI1LCAxOTY2MDgwLCAxOTY4MzAwLCAxOTkwNjU2LCAyMDAwMDAwLCAKKzIwMjUwMDAsIDIwNDgwMDAsIDIwNzM2MDAsIDIwOTcxNTIsIDIwOTk1MjAsIDIxMDkzNzUsIDIxMjU3NjQsIDIxNjAwMDAsIDIxODcwMDAsIAorMjIxMTg0MCwgMjIzOTQ4OCwgMjI1MDAwMCwgMjI3ODEyNSwgMjMwNDAwMCwgMjMzMjgwMCwgMjM0Mzc1MCwgMjM1OTI5NiwgMjM2MTk2MCwgCisyNDAwMDAwLCAyNDMwMDAwLCAyNDU3NjAwLCAyNDYwMzc1LCAyNDg4MzIwLCAyNTAwMDAwLCAyNTE5NDI0LCAyNTMxMjUwLCAyNTYwMDAwLCAKKzI1OTIwMDAsIDI2MjE0NDAsIDI2MjQ0MDAsIDI2NTQyMDgsIDI2NTcyMDUsIDI3MDAwMDAsIDI3MzM3NTAsIDI3NjQ4MDAsIDI3OTkzNjAsIAorMjgxMjUwMCwgMjgzNDM1MiwgMjg4MDAwMCwgMjkxNjAwMCwgMjk0OTEyMCwgMjk1MjQ1MCwgMjk4NTk4NCwgMzAwMDAwMCwgMzAzNzUwMCwgCiszMDcyMDAwLCAzMTEwNDAwLCAzMTI1MDAwLCAzMTQ1NzI4LCAzMTQ5MjgwLCAzMTg4NjQ2LCAzMjAwMDAwLCAzMjQwMDAwLCAzMjc2ODAwLCAKKzMyODA1MDAsIDMzMTc3NjAsIDMzNTkyMzIsIDMzNzUwMDAsIDM0NTYwMDAsIDM0OTkyMDAsIDM1MTU2MjUsIDM1Mzg5NDQsIDM1NDI5NDAsIAorMzYwMDAwMCwgMzY0NTAwMCwgMzY4NjQwMCwgMzczMjQ4MCwgMzc1MDAwMCwgMzc3OTEzNiwgMzc5Njg3NSwgMzg0MDAwMCwgMzg4ODAwMCwgCiszOTA2MjUwLCAzOTMyMTYwLCAzOTM2NjAwLCAzOTgxMzEyLCA0MDAwMDAwLCA0MDUwMDAwLCA0MDk2MDAwLCA0MTAwNjI1LCA0MTQ3MjAwLCAKKzQxOTQzMDQsIDQxOTkwNDAsIDQyMTg3NTAsIDQyNTE1MjgsIDQzMjAwMDAsIDQzNzQwMDAsIDQ0MjM2ODAsIDQ0Mjg2NzUsIDQ0Nzg5NzYsIAorNDUwMDAwMCwgNDU1NjI1MCwgNDYwODAwMCwgNDY2NTYwMCwgNDY4NzUwMCwgNDcxODU5MiwgNDcyMzkyMCwgNDc4Mjk2OSwgNDgwMDAwMCwgCis0ODYwMDAwLCA0OTE1MjAwLCA0OTIwNzUwLCA0OTc2NjQwLCA1MDAwMDAwLCA1MDM4ODQ4LCA1MDYyNTAwLCA1MTIwMDAwLCA1MTg0MDAwLCAKKzUyNDI4ODAsIDUyNDg4MDAsIDUzMDg0MTYsIDUzMTQ0MTAsIDU0MDAwMDAsIDU0Njc1MDAsIDU1Mjk2MDAsIDU1OTg3MjAsIDU2MjUwMDAsIAorNTY2ODcwNCwgNTc2MDAwMCwgNTgzMjAwMCwgNTg1OTM3NSwgNTg5ODI0MCwgNTkwNDkwMCwgNTk3MTk2OCwgNjAwMDAwMCwgNjA3NTAwMCwgCis2MTQ0MDAwLCA2MjIwODAwLCA2MjUwMDAwLCA2MjkxNDU2LCA2Mjk4NTYwLCA2MzI4MTI1LCA2Mzc3MjkyLCA2NDAwMDAwLCA2NDgwMDAwLCAKKzY1NTM2MDAsIDY1NjEwMDAsIDY2MzU1MjAsIDY3MTg0NjQsIDY3NTAwMDAsIDY4MzQzNzUsIDY5MTIwMDAsIDY5OTg0MDAsIDcwMzEyNTAsIAorNzA3Nzg4OCwgNzA4NTg4MCwgNzIwMDAwMCwgNzI5MDAwMCwgNzM3MjgwMCwgNzM4MTEyNSwgNzQ2NDk2MCwgNzUwMDAwMCwgNzU1ODI3MiwgCis3NTkzNzUwLCA3NjgwMDAwLCA3Nzc2MDAwLCA3ODEyNTAwLCA3ODY0MzIwLCA3ODczMjAwLCA3OTYyNjI0LCA3OTcxNjE1LCA4MDAwMDAwLCAKKzgxMDAwMDAsIDgxOTIwMDAsIDgyMDEyNTAsIDgyOTQ0MDAsIDgzODg2MDgsIDgzOTgwODAsIDg0Mzc1MDAsIDg1MDMwNTYsIDg2NDAwMDAsIAorODc0ODAwMCwgODg0NzM2MCwgODg1NzM1MCwgODk1Nzk1MiwgOTAwMDAwMCwgOTExMjUwMCwgOTIxNjAwMCwgOTMzMTIwMCwgOTM3NTAwMCwgCis5NDM3MTg0LCA5NDQ3ODQwLCA5NTY1OTM4LCA5NjAwMDAwLCA5NzIwMDAwLCA5NzY1NjI1LCA5ODMwNDAwLCA5ODQxNTAwLCA5OTUzMjgwLCAKKzEwMDAwMDAwLCAxMDA3NzY5NiwgMTAxMjUwMDAsIDEwMjQwMDAwLCAxMDM2ODAwMCwgMTA0ODU3NjAsIDEwNDk3NjAwLCAxMDU0Njg3NSwgMTA2MTY4MzIsIAorMTA2Mjg4MjAsIDEwODAwMDAwLCAxMDkzNTAwMCwgMTEwNTkyMDAsIDExMTk3NDQwLCAxMTI1MDAwMCwgMTEzMzc0MDgsIDExMzkwNjI1LCAxMTUyMDAwMCwgCisxMTY2NDAwMCwgMTE3MTg3NTAsIDExNzk2NDgwLCAxMTgwOTgwMCwgMTE5NDM5MzYsIDEyMDAwMDAwLCAxMjE1MDAwMCwgMTIyODgwMDAsIDEyMzAxODc1LCAKKzEyNDQxNjAwLCAxMjUwMDAwMCwgMTI1ODI5MTIsIDEyNTk3MTIwLCAxMjY1NjI1MCwgMTI3NTQ1ODQsIDEyODAwMDAwLCAxMjk2MDAwMCwgMTMxMDcyMDAsIAorMTMxMjIwMDAsIDEzMjcxMDQwLCAxMzI4NjAyNSwgMTM0MzY5MjgsIDEzNTAwMDAwLCAxMzY2ODc1MCwgMTM4MjQwMDAsIDEzOTk2ODAwLCAxNDA2MjUwMCwgCisxNDE1NTc3NiwgMTQxNzE3NjAsIDE0NDAwMDAwLCAxNDU4MDAwMCwgMTQ3NDU2MDAsIDE0NzYyMjUwLCAxNDkyOTkyMCwgMTUwMDAwMDAsIDE1MTE2NTQ0LCAKKzE1MTg3NTAwLCAxNTM2MDAwMCwgMTU1NTIwMDAsIDE1NjI1MDAwLCAxNTcyODY0MCwgMTU3NDY0MDAsIDE1OTI1MjQ4LCAxNTk0MzIzMCwgMTYwMDAwMDAsIAorMTYyMDAwMDAsIDE2Mzg0MDAwLCAxNjQwMjUwMCwgMTY1ODg4MDAsIDE2Nzc3MjE2LCAxNjc5NjE2MCwgMTY4NzUwMDAsIDE3MDA2MTEyLCAxNzI4MDAwMCwgCisxNzQ5NjAwMCwgMTc1NzgxMjUsIDE3Njk0NzIwLCAxNzcxNDcwMCwgMTc5MTU5MDQsIDE4MDAwMDAwLCAxODIyNTAwMCwgMTg0MzIwMDAsIDE4NjYyNDAwLCAKKzE4NzUwMDAwLCAxODg3NDM2OCwgMTg4OTU2ODAsIDE4OTg0Mzc1LCAxOTEzMTg3NiwgMTkyMDAwMDAsIDE5NDQwMDAwLCAxOTUzMTI1MCwgMTk2NjA4MDAsIAorMTk2ODMwMDAsIDE5OTA2NTYwLCAyMDAwMDAwMCwgMjAxNTUzOTIsIDIwMjUwMDAwLCAyMDQ4MDAwMCwgMjA1MDMxMjUsIDIwNzM2MDAwLCAyMDk3MTUyMCwgCisyMDk5NTIwMCwgMjEwOTM3NTAsIDIxMjMzNjY0LCAyMTI1NzY0MCwgMjE2MDAwMDAsIDIxODcwMDAwLCAyMjExODQwMCwgMjIxNDMzNzUsIDIyMzk0ODgwLCAKKzIyNTAwMDAwLCAyMjY3NDgxNiwgMjI3ODEyNTAsIDIzMDQwMDAwLCAyMzMyODAwMCwgMjM0Mzc1MDAsIDIzNTkyOTYwLCAyMzYxOTYwMCwgMjM4ODc4NzIsIAorMjM5MTQ4NDUsIDI0MDAwMDAwLCAyNDMwMDAwMCwgMjQ1NzYwMDAsIDI0NjAzNzUwLCAyNDg4MzIwMCwgMjUwMDAwMDAsIDI1MTY1ODI0LCAyNTE5NDI0MCwgCisyNTMxMjUwMCwgMjU1MDkxNjgsIDI1NjAwMDAwLCAyNTkyMDAwMCwgMjYyMTQ0MDAsIDI2MjQ0MDAwLCAyNjU0MjA4MCwgMjY1NzIwNTAsIDI2ODczODU2LCAKKzI3MDAwMDAwLCAyNzMzNzUwMCwgMjc2NDgwMDAsIDI3OTkzNjAwLCAyODEyNTAwMCwgMjgzMTE1NTIsIDI4MzQzNTIwLCAyODgwMDAwMCwgMjkxNjAwMDAsIAorMjkyOTY4NzUsIDI5NDkxMjAwLCAyOTUyNDUwMCwgMjk4NTk4NDAsIDMwMDAwMDAwLCAzMDIzMzA4OCwgMzAzNzUwMDAsIDMwNzIwMDAwLCAzMTEwNDAwMCwgCiszMTI1MDAwMCwgMzE0NTcyODAsIDMxNDkyODAwLCAzMTY0MDYyNSwgMzE4NTA0OTYsIDMxODg2NDYwLCAzMjAwMDAwMCwgMzI0MDAwMDAsIDMyNzY4MDAwLCAKKzMyODA1MDAwLCAzMzE3NzYwMCwgMzM1NTQ0MzIsIDMzNTkyMzIwLCAzMzc1MDAwMCwgMzQwMTIyMjQsIDM0MTcxODc1LCAzNDU2MDAwMCwgMzQ5OTIwMDAsIAorMzUxNTYyNTAsIDM1Mzg5NDQwLCAzNTQyOTQwMCwgMzU4MzE4MDgsIDM2MDAwMDAwLCAzNjQ1MDAwMCwgMzY4NjQwMDAsIDM2OTA1NjI1LCAzNzMyNDgwMCwgCiszNzUwMDAwMCwgMzc3NDg3MzYsIDM3NzkxMzYwLCAzNzk2ODc1MCwgMzgyNjM3NTIsIDM4NDAwMDAwLCAzODg4MDAwMCwgMzkwNjI1MDAsIDM5MzIxNjAwLCAKKzM5MzY2MDAwLCAzOTgxMzEyMCwgMzk4NTgwNzUsIDQwMDAwMDAwLCA0MDMxMDc4NCwgNDA1MDAwMDAsIDQwOTYwMDAwLCA0MTAwNjI1MCwgNDE0NzIwMDAsIAorNDE5NDMwNDAsIDQxOTkwNDAwLCA0MjE4NzUwMCwgNDI0NjczMjgsIDQyNTE1MjgwLCA0MzIwMDAwMCwgNDM3NDAwMDAsIDQ0MjM2ODAwLCA0NDI4Njc1MCwgCis0NDc4OTc2MCwgNDUwMDAwMDAsIDQ1MzQ5NjMyLCA0NTU2MjUwMCwgNDYwODAwMDAsIDQ2NjU2MDAwLCA0Njg3NTAwMCwgNDcxODU5MjAsIDQ3MjM5MjAwLCAKKzQ3Nzc1NzQ0LCA0NzgyOTY5MCwgNDgwMDAwMDAsIDQ4NjAwMDAwLCA0ODgyODEyNSwgNDkxNTIwMDAsIDQ5MjA3NTAwLCA0OTc2NjQwMCwgNTAwMDAwMDAsIAorNTAzMzE2NDgsIDUwMzg4NDgwLCA1MDYyNTAwMCwgNTEwMTgzMzYsIDUxMjAwMDAwLCA1MTg0MDAwMCwgNTI0Mjg4MDAsIDUyNDg4MDAwLCA1MjczNDM3NSwgCis1MzA4NDE2MCwgNTMxNDQxMDAsIDUzNzQ3NzEyLCA1NDAwMDAwMCwgNTQ2NzUwMDAsIDU1Mjk2MDAwLCA1NTk4NzIwMCwgNTYyNTAwMDAsIDU2NjIzMTA0LCAKKzU2Njg3MDQwLCA1Njk1MzEyNSwgNTc2MDAwMDAsIDU4MzIwMDAwLCA1ODU5Mzc1MCwgNTg5ODI0MDAsIDU5MDQ5MDAwLCA1OTcxOTY4MCwgNjAwMDAwMDAsIAorNjA0NjYxNzYsIDYwNzUwMDAwLCA2MTQ0MDAwMCwgNjE1MDkzNzUsIDYyMjA4MDAwLCA2MjUwMDAwMCwgNjI5MTQ1NjAsIDYyOTg1NjAwLCA2MzI4MTI1MCwgCis2MzcwMDk5MiwgNjM3NzI5MjAsIDY0MDAwMDAwLCA2NDgwMDAwMCwgNjU1MzYwMDAsIDY1NjEwMDAwLCA2NjM1NTIwMCwgNjY0MzAxMjUsIDY3MTA4ODY0LCAKKzY3MTg0NjQwLCA2NzUwMDAwMCwgNjgwMjQ0NDgsIDY4MzQzNzUwLCA2OTEyMDAwMCwgNjk5ODQwMDAsIDcwMzEyNTAwLCA3MDc3ODg4MCwgNzA4NTg4MDAsIAorNzE2NjM2MTYsIDcyMDAwMDAwLCA3MjkwMDAwMCwgNzM3MjgwMDAsIDczODExMjUwLCA3NDY0OTYwMCwgNzUwMDAwMDAsIDc1NDk3NDcyLCA3NTU4MjcyMCwgCis3NTkzNzUwMCwgNzY1Mjc1MDQsIDc2ODAwMDAwLCA3Nzc2MDAwMCwgNzgxMjUwMDAsIDc4NjQzMjAwLCA3ODczMjAwMCwgNzk2MjYyNDAsIDc5NzE2MTUwLCAKKzgwMDAwMDAwLCA4MDYyMTU2OCwgODEwMDAwMDAsIDgxOTIwMDAwLCA4MjAxMjUwMCwgODI5NDQwMDAsIDgzODg2MDgwLCA4Mzk4MDgwMCwgODQzNzUwMDAsIAorODQ5MzQ2NTYsIDg1MDMwNTYwLCA4NjQwMDAwMCwgODc0ODAwMDAsIDg3ODkwNjI1LCA4ODQ3MzYwMCwgODg1NzM1MDAsIDg5NTc5NTIwLCA5MDAwMDAwMCwgCis5MDY5OTI2NCwgOTExMjUwMDAsIDkyMTYwMDAwLCA5MzMxMjAwMCwgOTM3NTAwMDAsIDk0MzcxODQwLCA5NDQ3ODQwMCwgOTQ5MjE4NzUsIDk1NTUxNDg4LCAKKzk1NjU5MzgwLCA5NjAwMDAwMCwgOTcyMDAwMDAsIDk3NjU2MjUwLCA5ODMwNDAwMCwgOTg0MTUwMDAsIDk5NTMyODAwLCAxMDAwMDAwMDAsIAorMTAwNjYzMjk2LCAxMDA3NzY5NjAsIDEwMTI1MDAwMCwgMTAyMDM2NjcyLCAxMDI0MDAwMDAsIDEwMjUxNTYyNSwgMTAzNjgwMDAwLCAxMDQ4NTc2MDAsIAorMTA0OTc2MDAwLCAxMDU0Njg3NTAsIDEwNjE2ODMyMCwgMTA2Mjg4MjAwLCAxMDc0OTU0MjQsIDEwODAwMDAwMCwgMTA5MzUwMDAwLCAxMTA1OTIwMDAsIAorMTEwNzE2ODc1LCAxMTE5NzQ0MDAsIDExMjUwMDAwMCwgMTEzMjQ2MjA4LCAxMTMzNzQwODAsIDExMzkwNjI1MCwgMTE1MjAwMDAwLCAxMTY2NDAwMDAsIAorMTE3MTg3NTAwLCAxMTc5NjQ4MDAsIDExODA5ODAwMCwgMTE5NDM5MzYwLCAxMTk1NzQyMjUsIDEyMDAwMDAwMCwgMTIwOTMyMzUyLCAxMjE1MDAwMDAsIAorMTIyODgwMDAwLCAxMjMwMTg3NTAsIDEyNDQxNjAwMCwgMTI1MDAwMDAwLCAxMjU4MjkxMjAsIDEyNTk3MTIwMCwgMTI2NTYyNTAwLCAxMjc0MDE5ODQsIAorMTI3NTQ1ODQwLCAxMjgwMDAwMDAsIDEyOTYwMDAwMCwgMTMxMDcyMDAwLCAxMzEyMjAwMDAsIDEzMjcxMDQwMCwgMTMyODYwMjUwLCAxMzQyMTc3MjgsIAorMTM0MzY5MjgwLCAxMzUwMDAwMDAsIDEzNjA0ODg5NiwgMTM2Njg3NTAwLCAxMzgyNDAwMDAsIDEzOTk2ODAwMCwgMTQwNjI1MDAwLCAxNDE1NTc3NjAsIAorMTQxNzE3NjAwLCAxNDMzMjcyMzIsIDE0NDAwMDAwMCwgMTQ1ODAwMDAwLCAxNDY0ODQzNzUsIDE0NzQ1NjAwMCwgMTQ3NjIyNTAwLCAxNDkyOTkyMDAsIAorMTUwMDAwMDAwLCAxNTA5OTQ5NDQsIDE1MTE2NTQ0MCwgMTUxODc1MDAwLCAxNTMwNTUwMDgsIDE1MzYwMDAwMCwgMTU1NTIwMDAwLCAxNTYyNTAwMDAsIAorMTU3Mjg2NDAwLCAxNTc0NjQwMDAsIDE1ODIwMzEyNSwgMTU5MjUyNDgwLCAxNTk0MzIzMDAsIDE2MDAwMDAwMCwgMTYxMjQzMTM2LCAxNjIwMDAwMDAsIAorMTYzODQwMDAwLCAxNjQwMjUwMDAsIDE2NTg4ODAwMCwgMTY3NzcyMTYwLCAxNjc5NjE2MDAsIDE2ODc1MDAwMCwgMTY5ODY5MzEyLCAxNzAwNjExMjAsIAorMTcwODU5Mzc1LCAxNzI4MDAwMDAsIDE3NDk2MDAwMCwgMTc1NzgxMjUwLCAxNzY5NDcyMDAsIDE3NzE0NzAwMCwgMTc5MTU5MDQwLCAxODAwMDAwMDAsIAorMTgxMzk4NTI4LCAxODIyNTAwMDAsIDE4NDMyMDAwMCwgMTg0NTI4MTI1LCAxODY2MjQwMDAsIDE4NzUwMDAwMCwgMTg4NzQzNjgwLCAxODg5NTY4MDAsIAorMTg5ODQzNzUwLCAxOTExMDI5NzYsIDE5MTMxODc2MCwgMTkyMDAwMDAwLCAxOTQ0MDAwMDAsIDE5NTMxMjUwMCwgMTk2NjA4MDAwLCAxOTY4MzAwMDAsIAorMTk5MDY1NjAwLCAxOTkyOTAzNzUsIDIwMDAwMDAwMCwgMjAxMzI2NTkyLCAyMDE1NTM5MjAsIDIwMjUwMDAwMCwgMjA0MDczMzQ0LCAyMDQ4MDAwMDAsIAorMjA1MDMxMjUwLCAyMDczNjAwMDAsIDIwOTcxNTIwMCwgMjA5OTUyMDAwLCAyMTA5Mzc1MDAsIDIxMjMzNjY0MCwgMjEyNTc2NDAwLCAyMTQ5OTA4NDgsIAorMjE2MDAwMDAwLCAyMTg3MDAwMDAsIDIyMTE4NDAwMCwgMjIxNDMzNzUwLCAyMjM5NDg4MDAsIDIyNTAwMDAwMCwgMjI2NDkyNDE2LCAyMjY3NDgxNjAsIAorMjI3ODEyNTAwLCAyMzA0MDAwMDAsIDIzMzI4MDAwMCwgMjM0Mzc1MDAwLCAyMzU5Mjk2MDAsIDIzNjE5NjAwMCwgMjM4ODc4NzIwLCAyMzkxNDg0NTAsIAorMjQwMDAwMDAwLCAyNDE4NjQ3MDQsIDI0MzAwMDAwMCwgMjQ0MTQwNjI1LCAyNDU3NjAwMDAsIDI0NjAzNzUwMCwgMjQ4ODMyMDAwLCAyNTAwMDAwMDAsIAorMjUxNjU4MjQwLCAyNTE5NDI0MDAsIDI1MzEyNTAwMCwgMjU0ODAzOTY4LCAyNTUwOTE2ODAsIDI1NjAwMDAwMCwgMjU5MjAwMDAwLCAyNjIxNDQwMDAsIAorMjYyNDQwMDAwLCAyNjM2NzE4NzUsIDI2NTQyMDgwMCwgMjY1NzIwNTAwLCAyNjg0MzU0NTYsIDI2ODczODU2MCwgMjcwMDAwMDAwLCAyNzIwOTc3OTIsIAorMjczMzc1MDAwLCAyNzY0ODAwMDAsIDI3OTkzNjAwMCwgMjgxMjUwMDAwLCAyODMxMTU1MjAsIDI4MzQzNTIwMCwgMjg0NzY1NjI1LCAyODY2NTQ0NjQsIAorMjg4MDAwMDAwLCAyOTE2MDAwMDAsIDI5Mjk2ODc1MCwgMjk0OTEyMDAwLCAyOTUyNDUwMDAsIDI5ODU5ODQwMCwgMzAwMDAwMDAwLCAzMDE5ODk4ODgsIAorMzAyMzMwODgwLCAzMDM3NTAwMDAsIDMwNjExMDAxNiwgMzA3MjAwMDAwLCAzMDc1NDY4NzUsIDMxMTA0MDAwMCwgMzEyNTAwMDAwLCAzMTQ1NzI4MDAsIAorMzE0OTI4MDAwLCAzMTY0MDYyNTAsIDMxODUwNDk2MCwgMzE4ODY0NjAwLCAzMjAwMDAwMDAsIDMyMjQ4NjI3MiwgMzI0MDAwMDAwLCAzMjc2ODAwMDAsIAorMzI4MDUwMDAwLCAzMzE3NzYwMDAsIDMzMjE1MDYyNSwgMzM1NTQ0MzIwLCAzMzU5MjMyMDAsIDMzNzUwMDAwMCwgMzM5NzM4NjI0LCAzNDAxMjIyNDAsIAorMzQxNzE4NzUwLCAzNDU2MDAwMDAsIDM0OTkyMDAwMCwgMzUxNTYyNTAwLCAzNTM4OTQ0MDAsIDM1NDI5NDAwMCwgMzU4MzE4MDgwLCAzNjAwMDAwMDAsIAorMzYyNzk3MDU2LCAzNjQ1MDAwMDAsIDM2ODY0MDAwMCwgMzY5MDU2MjUwLCAzNzMyNDgwMDAsIDM3NTAwMDAwMCwgMzc3NDg3MzYwLCAzNzc5MTM2MDAsIAorMzc5Njg3NTAwLCAzODIyMDU5NTIsIDM4MjYzNzUyMCwgMzg0MDAwMDAwLCAzODg4MDAwMDAsIDM5MDYyNTAwMCwgMzkzMjE2MDAwLCAzOTM2NjAwMDAsIAorMzk4MTMxMjAwLCAzOTg1ODA3NTAsIDQwMDAwMDAwMCwgNDAyNjUzMTg0LCA0MDMxMDc4NDAsIDQwNTAwMDAwMCwgNDA4MTQ2Njg4LCA0MDk2MDAwMDAsIAorNDEwMDYyNTAwLCA0MTQ3MjAwMDAsIDQxOTQzMDQwMCwgNDE5OTA0MDAwLCA0MjE4NzUwMDAsIDQyNDY3MzI4MCwgNDI1MTUyODAwLCA0Mjk5ODE2OTYsIAorNDMyMDAwMDAwLCA0Mzc0MDAwMDAsIDQzOTQ1MzEyNSwgNDQyMzY4MDAwLCA0NDI4Njc1MDAsIDQ0Nzg5NzYwMCwgNDUwMDAwMDAwLCA0NTI5ODQ4MzIsIAorNDUzNDk2MzIwLCA0NTU2MjUwMDAsIDQ2MDgwMDAwMCwgNDY2NTYwMDAwLCA0Njg3NTAwMDAsIDQ3MTg1OTIwMCwgNDcyMzkyMDAwLCA0NzQ2MDkzNzUsIAorNDc3NzU3NDQwLCA0NzgyOTY5MDAsIDQ4MDAwMDAwMCwgNDgzNzI5NDA4LCA0ODYwMDAwMDAsIDQ4ODI4MTI1MCwgNDkxNTIwMDAwLCA0OTIwNzUwMDAsIAorNDk3NjY0MDAwLCA1MDAwMDAwMDAsIDUwMzMxNjQ4MCwgNTAzODg0ODAwLCA1MDYyNTAwMDAsIDUwOTYwNzkzNiwgNTEwMTgzMzYwLCA1MTIwMDAwMDAsIAorNTEyNTc4MTI1LCA1MTg0MDAwMDAsIDUyNDI4ODAwMCwgNTI0ODgwMDAwLCA1MjczNDM3NTAsIDUzMDg0MTYwMCwgNTMxNDQxMDAwLCA1MzY4NzA5MTIsIAorNTM3NDc3MTIwLCA1NDAwMDAwMDAsIDU0NDE5NTU4NCwgNTQ2NzUwMDAwLCA1NTI5NjAwMDAsIDU1MzU4NDM3NSwgNTU5ODcyMDAwLCA1NjI1MDAwMDAsIAorNTY2MjMxMDQwLCA1NjY4NzA0MDAsIDU2OTUzMTI1MCwgNTczMzA4OTI4LCA1NzYwMDAwMDAsIDU4MzIwMDAwMCwgNTg1OTM3NTAwLCA1ODk4MjQwMDAsIAorNTkwNDkwMDAwLCA1OTcxOTY4MDAsIDU5Nzg3MTEyNSwgNjAwMDAwMDAwLCA2MDM5Nzk3NzYsIDYwNDY2MTc2MCwgNjA3NTAwMDAwLCA2MTIyMjAwMzIsIAorNjE0NDAwMDAwLCA2MTUwOTM3NTAsIDYyMjA4MDAwMCwgNjI1MDAwMDAwLCA2MjkxNDU2MDAsIDYyOTg1NjAwMCwgNjMyODEyNTAwLCA2MzcwMDk5MjAsIAorNjM3NzI5MjAwLCA2NDAwMDAwMDAsIDY0NDk3MjU0NCwgNjQ4MDAwMDAwLCA2NTUzNjAwMDAsIDY1NjEwMDAwMCwgNjYzNTUyMDAwLCA2NjQzMDEyNTAsIAorNjcxMDg4NjQwLCA2NzE4NDY0MDAsIDY3NTAwMDAwMCwgNjc5NDc3MjQ4LCA2ODAyNDQ0ODAsIDY4MzQzNzUwMCwgNjkxMjAwMDAwLCA2OTk4NDAwMDAsIAorNzAzMTI1MDAwLCA3MDc3ODg4MDAsIDcwODU4ODAwMCwgNzE2NjM2MTYwLCA3MjAwMDAwMDAsIDcyNTU5NDExMiwgNzI5MDAwMDAwLCA3MzI0MjE4NzUsIAorNzM3MjgwMDAwLCA3MzgxMTI1MDAsIDc0NjQ5NjAwMCwgNzUwMDAwMDAwLCA3NTQ5NzQ3MjAsIDc1NTgyNzIwMCwgNzU5Mzc1MDAwLCA3NjQ0MTE5MDQsIAorNzY1Mjc1MDQwLCA3NjgwMDAwMDAsIDc3NzYwMDAwMCwgNzgxMjUwMDAwLCA3ODY0MzIwMDAsIDc4NzMyMDAwMCwgNzkxMDE1NjI1LCA3OTYyNjI0MDAsIAorNzk3MTYxNTAwLCA4MDAwMDAwMDAsIDgwNTMwNjM2OCwgODA2MjE1NjgwLCA4MTAwMDAwMDAsIDgxNjI5MzM3NiwgODE5MjAwMDAwLCA4MjAxMjUwMDAsIAorODI5NDQwMDAwLCA4Mzg4NjA4MDAsIDgzOTgwODAwMCwgODQzNzUwMDAwLCA4NDkzNDY1NjAsIDg1MDMwNTYwMCwgODU0Mjk2ODc1LCA4NTk5NjMzOTIsIAorODY0MDAwMDAwLCA4NzQ4MDAwMDAsIDg3ODkwNjI1MCwgODg0NzM2MDAwLCA4ODU3MzUwMDAsIDg5NTc5NTIwMCwgOTAwMDAwMDAwLCA5MDU5Njk2NjQsIAorOTA2OTkyNjQwLCA5MTEyNTAwMDAsIDkyMTYwMDAwMCwgOTIyNjQwNjI1LCA5MzMxMjAwMDAsIDkzNzUwMDAwMCwgOTQzNzE4NDAwLCA5NDQ3ODQwMDAsIAorOTQ5MjE4NzUwLCA5NTU1MTQ4ODAsIDk1NjU5MzgwMCwgOTYwMDAwMDAwLCA5Njc0NTg4MTYsIDk3MjAwMDAwMCwgOTc2NTYyNTAwLCA5ODMwNDAwMDAsIAorOTg0MTUwMDAwLCA5OTUzMjgwMDAsIDk5NjQ1MTg3NSwgMTAwMDAwMDAwMCwgMTAwNjYzMjk2MCwgMTAwNzc2OTYwMCwgMTAxMjUwMDAwMCwgCisxMDE5MjE1ODcyLCAxMDIwMzY2NzIwLCAxMDI0MDAwMDAwLCAxMDI1MTU2MjUwLCAxMDM2ODAwMDAwLCAxMDQ4NTc2MDAwLCAxMDQ5NzYwMDAwLCAKKzEwNTQ2ODc1MDAsIDEwNjE2ODMyMDAsIDEwNjI4ODIwMDAsIDEwNzM3NDE4MjQsIDEwNzQ5NTQyNDAsIDEwODAwMDAwMDAsIDEwODgzOTExNjgsIAorMTA5MzUwMDAwMCwgMTEwNTkyMDAwMCwgMTEwNzE2ODc1MCwgMTExOTc0NDAwMCwgMTEyNTAwMDAwMCwgMTEzMjQ2MjA4MCwgMTEzMzc0MDgwMCwgCisxMTM5MDYyNTAwLCAxMTQ2NjE3ODU2LCAxMTUyMDAwMDAwLCAxMTY2NDAwMDAwLCAxMTcxODc1MDAwLCAxMTc5NjQ4MDAwLCAxMTgwOTgwMDAwLCAKKzExOTQzOTM2MDAsIDExOTU3NDIyNTAsIDEyMDAwMDAwMDAsIDEyMDc5NTk1NTIsIDEyMDkzMjM1MjAsIDEyMTUwMDAwMDAsIDEyMjA3MDMxMjUsIAorMTIyNDQ0MDA2NCwgMTIyODgwMDAwMCwgMTIzMDE4NzUwMCwgMTI0NDE2MDAwMCwgMTI1MDAwMDAwMCwgMTI1ODI5MTIwMCwgMTI1OTcxMjAwMCwgCisxMjY1NjI1MDAwLCAxMjc0MDE5ODQwLCAxMjc1NDU4NDAwLCAxMjgwMDAwMDAwLCAxMjg5OTQ1MDg4LCAxMjk2MDAwMDAwLCAxMzEwNzIwMDAwLCAKKzEzMTIyMDAwMDAsIDEzMTgzNTkzNzUsIDEzMjcxMDQwMDAsIDEzMjg2MDI1MDAsIDEzNDIxNzcyODAsIDEzNDM2OTI4MDAsIDEzNTAwMDAwMDAsIAorMTM1ODk1NDQ5NiwgMTM2MDQ4ODk2MCwgMTM2Njg3NTAwMCwgMTM4MjQwMDAwMCwgMTM5OTY4MDAwMCwgMTQwNjI1MDAwMCwgMTQxNTU3NzYwMCwgCisxNDE3MTc2MDAwLCAxNDIzODI4MTI1LCAxNDMzMjcyMzIwLCAxNDQwMDAwMDAwLCAxNDUxMTg4MjI0LCAxNDU4MDAwMDAwLCAxNDY0ODQzNzUwLCAKKzE0NzQ1NjAwMDAsIDE0NzYyMjUwMDAsIDE0OTI5OTIwMDAsIDE1MDAwMDAwMDAsIDE1MDk5NDk0NDAsIDE1MTE2NTQ0MDAsIDE1MTg3NTAwMDAsIAorMTUyODgyMzgwOCwgMTUzMDU1MDA4MCwgMTUzNjAwMDAwMCwgMTUzNzczNDM3NSwgMTU1NTIwMDAwMCwgMTU2MjUwMDAwMCwgMTU3Mjg2NDAwMCwgCisxNTc0NjQwMDAwLCAxNTgyMDMxMjUwLCAxNTkyNTI0ODAwLCAxNTk0MzIzMDAwLCAxNjAwMDAwMDAwLCAxNjEwNjEyNzM2LCAxNjEyNDMxMzYwLCAKKzE2MjAwMDAwMDAsIDE2MzI1ODY3NTIsIDE2Mzg0MDAwMDAsIDE2NDAyNTAwMDAsIDE2NTg4ODAwMDAsIDE2NjA3NTMxMjUsIDE2Nzc3MjE2MDAsIAorMTY3OTYxNjAwMCwgMTY4NzUwMDAwMCwgMTY5ODY5MzEyMCwgMTcwMDYxMTIwMCwgMTcwODU5Mzc1MCwgMTcxOTkyNjc4NCwgMTcyODAwMDAwMCwgCisxNzQ5NjAwMDAwLCAxNzU3ODEyNTAwLCAxNzY5NDcyMDAwLCAxNzcxNDcwMDAwLCAxNzkxNTkwNDAwLCAxODAwMDAwMDAwLCAxODExOTM5MzI4LCAKKzE4MTM5ODUyODAsIDE4MjI1MDAwMDAsIDE4NDMyMDAwMDAsIDE4NDUyODEyNTAsIDE4NjYyNDAwMDAsIDE4NzUwMDAwMDAsIDE4ODc0MzY4MDAsIAorMTg4OTU2ODAwMCwgMTg5ODQzNzUwMCwgMTkxMTAyOTc2MCwgMTkxMzE4NzYwMCwgMTkyMDAwMDAwMCwgMTkzNDkxNzYzMiwgMTk0NDAwMDAwMCwgCisxOTUzMTI1MDAwLCAxOTY2MDgwMDAwLCAxOTY4MzAwMDAwLCAxOTkwNjU2MDAwLCAxOTkyOTAzNzUwLCAyMDAwMDAwMDAwLCAyMDEzMjY1OTIwLCAKKzIwMTU1MzkyMDAsIDIwMjUwMDAwMDAsIDIwMzg0MzE3NDQsIDIwNDA3MzM0NDAsIDIwNDgwMDAwMDAsIDIwNTAzMTI1MDAsIDIwNzM2MDAwMDAsIAorMjA5NzE1MjAwMCwgMjA5OTUyMDAwMCwgMjEwOTM3NTAwMCwgMjEyMzM2NjQwMCwgMjEyNTc2NDAwMAorfTsKKworCitDVl9JTVBMIGludAorY3ZHZXRPcHRpbWFsREZUU2l6ZSggaW50IHNpemUwICkKK3sKKyAgICBpbnQgYSA9IDAsIGIgPSBzaXplb2YoaWN2T3B0aW1hbERGVFNpemUpL3NpemVvZihpY3ZPcHRpbWFsREZUU2l6ZVswXSkgLSAxOworICAgIGlmKCAodW5zaWduZWQpc2l6ZTAgPj0gKHVuc2lnbmVkKWljdk9wdGltYWxERlRTaXplW2JdICkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgd2hpbGUoIGEgPCBiICkKKyAgICB7CisgICAgICAgIGludCBjID0gKGEgKyBiKSA+PiAxOworICAgICAgICBpZiggc2l6ZTAgPD0gaWN2T3B0aW1hbERGVFNpemVbY10gKQorICAgICAgICAgICAgYiA9IGM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGEgPSBjKzE7CisgICAgfQorCisgICAgcmV0dXJuIGljdk9wdGltYWxERlRTaXplW2JdOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hlcnJvci5jcHAgYi9jeGNvcmUvc3JjL2N4ZXJyb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5MDFmYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4ZXJyb3IuY3BwCkBAIC0wLDAgKzEsNDYwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKyNpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZWxzZQorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IGNoYXIqIGZpbGU7CisgICAgaW50ICAgICAgICAgbGluZTsKK30KK0N2U3RhY2tSZWNvcmQ7CisKK3R5cGVkZWYgc3RydWN0IEN2Q29udGV4dAoreworICAgIGludCAgZXJyX2NvZGU7CisgICAgaW50ICBlcnJfbW9kZTsKKyAgICBDdkVycm9yQ2FsbGJhY2sgZXJyb3JfY2FsbGJhY2s7CisgICAgdm9pZCogIHVzZXJkYXRhOworICAgIGNoYXIgIGVycl9tc2dbNDA5Nl07CisgICAgQ3ZTdGFja1JlY29yZCAgZXJyX2N0eDsKK30gQ3ZDb250ZXh0OworCisjaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0CisjZGVmaW5lIENWX0RFRkFVTFRfRVJST1JfQ0FMTEJBQ0sgIGN2R3VpQm94UmVwb3J0CisjZWxzZQorI2RlZmluZSBDVl9ERUZBVUxUX0VSUk9SX0NBTExCQUNLICBjdlN0ZEVyclJlcG9ydAorI2VuZGlmCisKK3N0YXRpYyBDdkNvbnRleHQqCitpY3ZDcmVhdGVDb250ZXh0KHZvaWQpCit7CisgICAgQ3ZDb250ZXh0KiBjb250ZXh0ID0gKEN2Q29udGV4dCopbWFsbG9jKCBzaXplb2YoKmNvbnRleHQpICk7CisKKyAgICBjb250ZXh0LT5lcnJfbW9kZSA9IENWX0Vyck1vZGVMZWFmOworICAgIGNvbnRleHQtPmVycl9jb2RlID0gQ1ZfU3RzT2s7CisKKyAgICBjb250ZXh0LT5lcnJvcl9jYWxsYmFjayA9IENWX0RFRkFVTFRfRVJST1JfQ0FMTEJBQ0s7CisgICAgY29udGV4dC0+dXNlcmRhdGEgPSAwOworCisgICAgcmV0dXJuIGNvbnRleHQ7Cit9CisKK3N0YXRpYyB2b2lkCitpY3ZEZXN0cm95Q29udGV4dChDdkNvbnRleHQqIGNvbnRleHQpCit7CisgICAgZnJlZShjb250ZXh0KTsKK30KKworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorICAgIHN0YXRpYyBEV09SRCBnX1Rsc0luZGV4ID0gVExTX09VVF9PRl9JTkRFWEVTOworI2Vsc2UKKyAgICBzdGF0aWMgcHRocmVhZF9rZXlfdCBnX1Rsc0luZGV4OworI2VuZGlmCisKK3N0YXRpYyBDdkNvbnRleHQqCitpY3ZHZXRDb250ZXh0KHZvaWQpCit7CisjaWZkZWYgQ1ZfRExMCisjaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0CisgICAgQ3ZDb250ZXh0KiBjb250ZXh0OworCisgICAgLy9hc3NlcnQoZ19UbHNJbmRleCAhPSBUTFNfT1VUX09GX0lOREVYRVMpOworICAgIGlmKCBnX1Rsc0luZGV4ID09IFRMU19PVVRfT0ZfSU5ERVhFUyApCisgICAgeworICAgICAgICBnX1Rsc0luZGV4ID0gVGxzQWxsb2MoKTsKKyAgICAgICAgaWYoIGdfVGxzSW5kZXggPT0gVExTX09VVF9PRl9JTkRFWEVTICkKKyAgICAgICAgICAgIEZhdGFsQXBwRXhpdCggMCwgIk9ubHkgc2V0IENWX0RMTCBmb3IgRExMIHVzYWdlIiApOworICAgIH0KKworICAgIGNvbnRleHQgPSAoQ3ZDb250ZXh0KilUbHNHZXRWYWx1ZSggZ19UbHNJbmRleCApOworICAgIGlmKCAhY29udGV4dCApCisgICAgeworICAgICAgICBjb250ZXh0ID0gaWN2Q3JlYXRlQ29udGV4dCgpOworICAgICAgICBpZiggIWNvbnRleHQgKQorICAgICAgICAgICAgRmF0YWxBcHBFeGl0KCAwLCAiT3BlbkNWLiBQcm9ibGVtIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgVExTIE9wZW5DViBjb250ZXh0LiIgKTsKKworICAgICAgICBUbHNTZXRWYWx1ZSggZ19UbHNJbmRleCwgY29udGV4dCApOworICAgIH0KKyAgICByZXR1cm4gY29udGV4dDsKKyNlbHNlCisgICAgQ3ZDb250ZXh0KiBjb250ZXh0ID0gKEN2Q29udGV4dCopcHRocmVhZF9nZXRzcGVjaWZpYyggZ19UbHNJbmRleCApOworICAgIGlmKCAhY29udGV4dCApCisgICAgeworICAgIGNvbnRleHQgPSBpY3ZDcmVhdGVDb250ZXh0KCk7CisgICAgaWYoICFjb250ZXh0ICkKKyAgICB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiT3BlbkNWLiBQcm9ibGVtIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgT3BlbkNWIGNvbnRleHQuIik7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHB0aHJlYWRfc2V0c3BlY2lmaWMoIGdfVGxzSW5kZXgsIGNvbnRleHQgKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRleHQ7CisjZW5kaWYKKyNlbHNlIC8qIHN0YXRpYyBzaW5nbGUtdGhyZWFkIGxpYnJhcnkgY2FzZSAqLworICAgIHN0YXRpYyBDdkNvbnRleHQqIGNvbnRleHQgPSAwOworCisgICAgaWYoICFjb250ZXh0ICkKKyAgICAgICAgY29udGV4dCA9IGljdkNyZWF0ZUNvbnRleHQoKTsKKworICAgIHJldHVybiBjb250ZXh0OworI2VuZGlmCit9CisKKworQ1ZfSU1QTCBpbnQKK2N2U3RkRXJyUmVwb3J0KCBpbnQgY29kZSwgY29uc3QgY2hhciAqZnVuY19uYW1lLCBjb25zdCBjaGFyICplcnJfbXNnLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkKiApCit7CisgICAgaWYoIGNvZGUgPT0gQ1ZfU3RzQmFja1RyYWNlIHx8IGNvZGUgPT0gQ1ZfU3RzQXV0b1RyYWNlICkKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXHRjYWxsZWQgZnJvbSAiICk7CisgICAgZWxzZQorICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJPcGVuQ1YgRVJST1I6ICVzICglcylcblx0aW4gZnVuY3Rpb24gIiwKKyAgICAgICAgICAgICAgICAgY3ZFcnJvclN0cihjb2RlKSwgZXJyX21zZyA/IGVycl9tc2cgOiAibm8gZGVzY3JpcHRpb24iICk7CisKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIlcywgJXMoJWQpXG4iLCBmdW5jX25hbWUgPyBmdW5jX25hbWUgOiAiPHVua25vd24+IiwKKyAgICAgICAgICAgICBmaWxlICE9IE5VTEwgPyBmaWxlIDogIiIsIGxpbmUgKTsKKworICAgIGlmKCBjdkdldEVyck1vZGUoKSA9PSBDVl9FcnJNb2RlTGVhZiApCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJUZXJtaW5hdGluZyB0aGUgYXBwbGljYXRpb24uLi5cbiIgKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworQ1ZfSU1QTCBpbnQKK2N2R3VpQm94UmVwb3J0KCBpbnQgY29kZSwgY29uc3QgY2hhciAqZnVuY19uYW1lLCBjb25zdCBjaGFyICplcnJfbXNnLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCB2b2lkKiApCit7CisjaWYgIWRlZmluZWQgV0lOMzIgJiYgIWRlZmluZWQgV0lONjQKKyAgICByZXR1cm4gY3ZTdGRFcnJSZXBvcnQoIGNvZGUsIGZ1bmNfbmFtZSwgZXJyX21zZywgZmlsZSwgbGluZSwgMCApOworI2Vsc2UKKyAgICBpZiggY29kZSAhPSBDVl9TdHNCYWNrVHJhY2UgJiYgY29kZSAhPSBDVl9TdHNBdXRvVHJhY2UgKQorICAgIHsKKyAgICAgICAgc2l6ZV90IG1zZ19sZW4gPSBzdHJsZW4oZXJyX21zZyA/IGVycl9tc2cgOiAiIikgKyAxMDI0OworICAgICAgICBjaGFyKiBtZXNzYWdlID0gKGNoYXIqKWFsbG9jYShtc2dfbGVuKTsKKyAgICAgICAgY2hhciB0aXRsZVsxMDBdOworCisgICAgICAgIHdzcHJpbnRmKCBtZXNzYWdlLCAiJXMgKCVzKVxuaW4gZnVuY3Rpb24gJXMsICVzKCVkKVxuXG4iCisgICAgICAgICAgICAgICAgICAiUHJlc3MgXCJBYm9ydFwiIHRvIHRlcm1pbmF0ZSBhcHBsaWNhdGlvbi5cbiIKKyAgICAgICAgICAgICAgICAgICJQcmVzcyBcIlJldHJ5XCIgdG8gZGVidWcgKGlmIHRoZSBhcHAgaXMgcnVubmluZyB1bmRlciBkZWJ1Z2dlcikuXG4iCisgICAgICAgICAgICAgICAgICAiUHJlc3MgXCJJZ25vcmVcIiB0byBjb250aW51ZSAodGhpcyBpcyBub3Qgc2FmZSkuXG4iLAorICAgICAgICAgICAgICAgICAgY3ZFcnJvclN0cihjb2RlKSwgZXJyX21zZyA/IGVycl9tc2cgOiAibm8gZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgZnVuY19uYW1lLCBmaWxlLCBsaW5lICk7CisKKyAgICAgICAgd3NwcmludGYoIHRpdGxlLCAiT3BlbkNWIEdVSSBFcnJvciBIYW5kbGVyIiApOworCisgICAgICAgIGludCBhbnN3ZXIgPSBNZXNzYWdlQm94KCBOVUxMLCBtZXNzYWdlLCB0aXRsZSwgTUJfSUNPTkVSUk9SfE1CX0FCT1JUUkVUUllJR05PUkV8TUJfU1lTVEVNTU9EQUwgKTsKKworICAgICAgICBpZiggYW5zd2VyID09IElEUkVUUlkgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9EQkdfQlJFQUsoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW5zd2VyICE9IElESUdOT1JFOworICAgIH0KKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCisKK0NWX0lNUEwgaW50IGN2TnVsRGV2UmVwb3J0KCBpbnQgLypjb2RlKi8sIGNvbnN0IGNoYXIqIC8qZnVuY19uYW1lKi8sCisgICAgY29uc3QgY2hhciogLyplcnJfbXNnKi8sIGNvbnN0IGNoYXIqIC8qZmlsZSovLCBpbnQgLypsaW5lKi8sIHZvaWQqICkKK3sKKyAgICByZXR1cm4gY3ZHZXRFcnJNb2RlKCkgPT0gQ1ZfRXJyTW9kZUxlYWY7Cit9CisKKworQ1ZfSU1QTCBDdkVycm9yQ2FsbGJhY2sKK2N2UmVkaXJlY3RFcnJvciggQ3ZFcnJvckNhbGxiYWNrIGZ1bmMsIHZvaWQqIHVzZXJkYXRhLCB2b2lkKiogcHJldl91c2VyZGF0YSApCit7CisgICAgQ3ZDb250ZXh0KiBjb250ZXh0ID0gaWN2R2V0Q29udGV4dCgpOworCisgICAgQ3ZFcnJvckNhbGxiYWNrIG9sZCA9IGNvbnRleHQtPmVycm9yX2NhbGxiYWNrOworICAgIGlmKCBwcmV2X3VzZXJkYXRhICkKKyAgICAgICAgKnByZXZfdXNlcmRhdGEgPSBjb250ZXh0LT51c2VyZGF0YTsKKyAgICBpZiggZnVuYyApCisgICAgeworICAgICAgICBjb250ZXh0LT5lcnJvcl9jYWxsYmFjayA9IGZ1bmM7CisgICAgICAgIGNvbnRleHQtPnVzZXJkYXRhID0gdXNlcmRhdGE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbnRleHQtPmVycm9yX2NhbGxiYWNrID0gQ1ZfREVGQVVMVF9FUlJPUl9DQUxMQkFDSzsKKyAgICAgICAgY29udGV4dC0+dXNlcmRhdGEgPSAwOworICAgIH0KKworICAgIHJldHVybiBvbGQ7Cit9CisKKworQ1ZfSU1QTCBpbnQgY3ZHZXRFcnJJbmZvKCBjb25zdCBjaGFyKiogZXJyb3Jjb2RlX2Rlc2MsIGNvbnN0IGNoYXIqKiBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqIGZpbGVuYW1lLCBpbnQqIGxpbmUgKQoreworICAgIGludCBjb2RlID0gY3ZHZXRFcnJTdGF0dXMoKTsKKworICAgIGlmKCBlcnJvcmNvZGVfZGVzYyApCisgICAgICAgICplcnJvcmNvZGVfZGVzYyA9IGN2RXJyb3JTdHIoIGNvZGUgKTsKKworICAgIGlmKCBjb2RlID49IDAgKQorICAgIHsKKyAgICAgICAgaWYoIGRlc2NyaXB0aW9uICkKKyAgICAgICAgICAgICpkZXNjcmlwdGlvbiA9IDA7CisgICAgICAgIGlmKCBmaWxlbmFtZSApCisgICAgICAgICAgICAqZmlsZW5hbWUgPSAwOworICAgICAgICBpZiggbGluZSApCisgICAgICAgICAgICAqbGluZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2Q29udGV4dCogY3R4ID0gaWN2R2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKCBkZXNjcmlwdGlvbiApCisgICAgICAgICAgICAqZGVzY3JpcHRpb24gPSBjdHgtPmVycl9tc2c7CisgICAgICAgIGlmKCBmaWxlbmFtZSApCisgICAgICAgICAgICAqZmlsZW5hbWUgPSBjdHgtPmVycl9jdHguZmlsZTsKKyAgICAgICAgaWYoIGxpbmUgKQorICAgICAgICAgICAgKmxpbmUgPSBjdHgtPmVycl9jdHgubGluZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29kZTsKK30KKworCitDVl9JTVBMIGNvbnN0IGNoYXIqIGN2RXJyb3JTdHIoIGludCBzdGF0dXMgKQoreworICAgIHN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisgICAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgQ1ZfU3RzT2sgOiAgICAgICAgcmV0dXJuICJObyBFcnJvciI7CisgICAgY2FzZSBDVl9TdHNCYWNrVHJhY2UgOiByZXR1cm4gIkJhY2t0cmFjZSI7CisgICAgY2FzZSBDVl9TdHNFcnJvciA6ICAgICByZXR1cm4gIlVuc3BlY2lmaWVkIGVycm9yIjsKKyAgICBjYXNlIENWX1N0c0ludGVybmFsIDogIHJldHVybiAiSW50ZXJuYWwgZXJyb3IiOworICAgIGNhc2UgQ1ZfU3RzTm9NZW0gOiAgICAgcmV0dXJuICJJbnN1ZmZpY2llbnQgbWVtb3J5IjsKKyAgICBjYXNlIENWX1N0c0JhZEFyZyA6ICAgIHJldHVybiAiQmFkIGFyZ3VtZW50IjsKKyAgICBjYXNlIENWX1N0c05vQ29udiA6ICAgIHJldHVybiAiSXRlcmF0aW9ucyBkbyBub3QgY29udmVyZ2UiOworICAgIGNhc2UgQ1ZfU3RzQXV0b1RyYWNlIDogcmV0dXJuICJBdXRvdHJhY2UgY2FsbCI7CisgICAgY2FzZSBDVl9TdHNCYWRTaXplIDogICByZXR1cm4gIkluY29ycmVjdCBzaXplIG9mIGlucHV0IGFycmF5IjsKKyAgICBjYXNlIENWX1N0c051bGxQdHIgOiAgIHJldHVybiAiTnVsbCBwb2ludGVyIjsKKyAgICBjYXNlIENWX1N0c0RpdkJ5WmVybyA6IHJldHVybiAiRGl2aXppb24gYnkgemVybyBvY2N1cmVkIjsKKyAgICBjYXNlIENWX0JhZFN0ZXAgOiAgICAgIHJldHVybiAiSW1hZ2Ugc3RlcCBpcyB3cm9uZyI7CisgICAgY2FzZSBDVl9TdHNJbnBsYWNlTm90U3VwcG9ydGVkIDogcmV0dXJuICJJbnBsYWNlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIENWX1N0c09iamVjdE5vdEZvdW5kIDogICAgICByZXR1cm4gIlJlcXVlc3RlZCBvYmplY3Qgd2FzIG5vdCBmb3VuZCI7CisgICAgY2FzZSBDVl9CYWREZXB0aCA6ICAgICByZXR1cm4gIklucHV0IGltYWdlIGRlcHRoIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZnVuY3Rpb24iOworICAgIGNhc2UgQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyA6IHJldHVybiAiRm9ybWF0cyBvZiBpbnB1dCBhcmd1bWVudHMgZG8gbm90IG1hdGNoIjsKKyAgICBjYXNlIENWX1N0c1VubWF0Y2hlZFNpemVzIDogIHJldHVybiAiU2l6ZXMgb2YgaW5wdXQgYXJndW1lbnRzIGRvIG5vdCBtYXRjaCI7CisgICAgY2FzZSBDVl9TdHNPdXRPZlJhbmdlIDogcmV0dXJuICJPbmUgb2YgYXJndW1lbnRzXCcgdmFsdWVzIGlzIG91dCBvZiByYW5nZSI7CisgICAgY2FzZSBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCA6IHJldHVybiAiVW5zdXBwb3J0ZWQgZm9ybWF0IG9yIGNvbWJpbmF0aW9uIG9mIGZvcm1hdHMiOworICAgIGNhc2UgQ1ZfQmFkQ09JIDogICAgICByZXR1cm4gIklucHV0IENPSSBpcyBub3Qgc3VwcG9ydGVkIjsKKyAgICBjYXNlIENWX0JhZE51bUNoYW5uZWxzIDogcmV0dXJuICJCYWQgbnVtYmVyIG9mIGNoYW5uZWxzIjsKKyAgICBjYXNlIENWX1N0c0JhZEZsYWcgOiAgIHJldHVybiAiQmFkIGZsYWcgKHBhcmFtZXRlciBvciBzdHJ1Y3R1cmUgZmllbGQpIjsKKyAgICBjYXNlIENWX1N0c0JhZFBvaW50IDogIHJldHVybiAiQmFkIHBhcmFtZXRlciBvZiB0eXBlIEN2UG9pbnQiOworICAgIGNhc2UgQ1ZfU3RzQmFkTWFzayA6IHJldHVybiAiQmFkIHR5cGUgb2YgbWFzayBhcmd1bWVudCI7CisgICAgY2FzZSBDVl9TdHNQYXJzZUVycm9yIDogcmV0dXJuICJQYXJzaW5nIGVycm9yIjsKKyAgICBjYXNlIENWX1N0c05vdEltcGxlbWVudGVkIDogcmV0dXJuICJUaGUgZnVuY3Rpb24vZmVhdHVyZSBpcyBub3QgaW1wbGVtZW50ZWQiOworICAgIGNhc2UgQ1ZfU3RzQmFkTWVtQmxvY2sgOiAgcmV0dXJuICJNZW1vcnkgYmxvY2sgaGFzIGJlZW4gY29ycnVwdGVkIjsKKyAgICB9OworCisgICAgc3ByaW50ZihidWYsICJVbmtub3duICVzIGNvZGUgJWQiLCBzdGF0dXMgPj0gMCA/ICJzdGF0dXMiOiJlcnJvciIsIHN0YXR1cyk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKworQ1ZfSU1QTCBpbnQgY3ZHZXRFcnJNb2RlKHZvaWQpCit7CisgICAgcmV0dXJuIGljdkdldENvbnRleHQoKS0+ZXJyX21vZGU7Cit9CisKK0NWX0lNUEwgaW50IGN2U2V0RXJyTW9kZSggaW50IG1vZGUgKQoreworICAgIEN2Q29udGV4dCogY29udGV4dCA9IGljdkdldENvbnRleHQoKTsKKyAgICBpbnQgcHJldl9tb2RlID0gY29udGV4dC0+ZXJyX21vZGU7CisgICAgY29udGV4dC0+ZXJyX21vZGUgPSBtb2RlOworICAgIHJldHVybiBwcmV2X21vZGU7Cit9CisKK0NWX0lNUEwgaW50IGN2R2V0RXJyU3RhdHVzKCkKK3sKKyAgICByZXR1cm4gaWN2R2V0Q29udGV4dCgpLT5lcnJfY29kZTsKK30KKworQ1ZfSU1QTCB2b2lkIGN2U2V0RXJyU3RhdHVzKCBpbnQgY29kZSApCit7CisgICAgaWN2R2V0Q29udGV4dCgpLT5lcnJfY29kZSA9IGNvZGU7Cit9CisKKworQ1ZfSU1QTCB2b2lkIGN2RXJyb3IoIGludCBjb2RlLCBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXJyX21zZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX25hbWUsIGludCBsaW5lICkKK3sKKyAgICBpZiggY29kZSA9PSBDVl9TdHNPayApCisgICAgICAgIGN2U2V0RXJyU3RhdHVzKCBjb2RlICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZDb250ZXh0KiBjb250ZXh0ID0gaWN2R2V0Q29udGV4dCgpOworCisgICAgICAgIGlmKCBjb2RlICE9IENWX1N0c0JhY2tUcmFjZSAmJiBjb2RlICE9IENWX1N0c0F1dG9UcmFjZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIqIG1lc3NhZ2UgPSBjb250ZXh0LT5lcnJfbXNnOworICAgICAgICAgICAgY29udGV4dC0+ZXJyX2NvZGUgPSBjb2RlOworCisgICAgICAgICAgICBzdHJjcHkoIG1lc3NhZ2UsIGVycl9tc2cgKTsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycl9jdHguZmlsZSA9IGZpbGVfbmFtZTsKKyAgICAgICAgICAgIGNvbnRleHQtPmVycl9jdHgubGluZSA9IGxpbmU7CisgICAgICAgIH0KKworICAgICAgICBpZiggY29udGV4dC0+ZXJyX21vZGUgIT0gQ1ZfRXJyTW9kZVNpbGVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ZXJtaW5hdGUgPSBjb250ZXh0LT5lcnJvcl9jYWxsYmFjayggY29kZSwgZnVuY19uYW1lLCBlcnJfbXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbmFtZSwgbGluZSwgY29udGV4dC0+dXNlcmRhdGEgKTsKKyAgICAgICAgICAgIGlmKCB0ZXJtaW5hdGUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENWX0RCR19CUkVBSygpOworICAgICAgICAgICAgICAgIC8vZXhpdCgtYWJzKHRlcm1pbmF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKiBFbmQgb2YgaW1wbGVtZW50YXRpb24gb2YgcHJvZmlsaW5nIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKkRsbE1haW4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorQk9PTCBXSU5BUEkgRGxsTWFpbiggSElOU1RBTkNFLCBEV09SRCAgZmR3UmVhc29uLCBMUFZPSUQgKQoreworICAgIEN2Q29udGV4dCAqcENvbnRleHQ7CisKKyAgICBzd2l0Y2ggKGZkd1JlYXNvbikKKyAgICB7CisgICAgY2FzZSBETExfUFJPQ0VTU19BVFRBQ0g6CisgICAgICAgIGdfVGxzSW5kZXggPSBUbHNBbGxvYygpOworICAgICAgICBpZiggZ19UbHNJbmRleCA9PSBUTFNfT1VUX09GX0lOREVYRVMgKSByZXR1cm4gRkFMU0U7CisgICAgICAgIC8vYnJlYWs7CisKKyAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICBwQ29udGV4dCA9IGljdkNyZWF0ZUNvbnRleHQoKTsKKyAgICAgICAgaWYoIHBDb250ZXh0ID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIFRsc1NldFZhbHVlKCBnX1Rsc0luZGV4LCAoTFBWT0lEKXBDb250ZXh0ICk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBETExfVEhSRUFEX0RFVEFDSDoKKyAgICAgICAgaWYoIGdfVGxzSW5kZXggIT0gVExTX09VVF9PRl9JTkRFWEVTICkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbnRleHQgPSAoQ3ZDb250ZXh0KilUbHNHZXRWYWx1ZSggZ19UbHNJbmRleCApOworICAgICAgICAgICAgaWYoIHBDb250ZXh0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgIGljdkRlc3Ryb3lDb250ZXh0KCBwQ29udGV4dCApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBETExfUFJPQ0VTU19ERVRBQ0g6CisgICAgICAgIGlmKCBnX1Rsc0luZGV4ICE9IFRMU19PVVRfT0ZfSU5ERVhFUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBDb250ZXh0ID0gKEN2Q29udGV4dCopVGxzR2V0VmFsdWUoIGdfVGxzSW5kZXggKTsKKyAgICAgICAgICAgIGlmKCBwQ29udGV4dCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICBpY3ZEZXN0cm95Q29udGV4dCggcENvbnRleHQgKTsKKyAgICAgICAgfQorICAgICAgICBUbHNGcmVlKCBnX1Rsc0luZGV4ICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisjZWxzZQorLyogUE9TSVggcHRocmVhZCAqLworCisvKiBmdW5jdGlvbiAtIGRlc3RydWN0b3Igb2YgdGhyZWFkICovCit2b2lkIGljdlB0aHJlYWREZXN0cnVjdG9yKHZvaWQqIGtleV92YWwpCit7CisgICAgQ3ZDb250ZXh0KiBjb250ZXh0ID0gKEN2Q29udGV4dCopIGtleV92YWw7CisgICAgaWN2RGVzdHJveUNvbnRleHQoIGNvbnRleHQgKTsKK30KKworaW50IHB0aHJlcnIgPSBwdGhyZWFkX2tleV9jcmVhdGUoICZnX1Rsc0luZGV4LCBpY3ZQdGhyZWFkRGVzdHJ1Y3RvciApOworCisjZW5kaWYKKworLyogZnVuY3Rpb24sIHdoaWNoIGNvbnZlcnRzIGludCB0byBpbnQgKi8KK0NWX0lNUEwgaW50CitjdkVycm9yRnJvbUlwcFN0YXR1cyggaW50IHN0YXR1cyApCit7CisgICAgc3dpdGNoIChzdGF0dXMpCisgICAgeworICAgIGNhc2UgQ1ZfQkFEU0laRV9FUlI6IHJldHVybiBDVl9TdHNCYWRTaXplOworICAgIGNhc2UgQ1ZfQkFETUVNQkxPQ0tfRVJSOiByZXR1cm4gQ1ZfU3RzQmFkTWVtQmxvY2s7CisgICAgY2FzZSBDVl9OVUxMUFRSX0VSUjogcmV0dXJuIENWX1N0c051bGxQdHI7CisgICAgY2FzZSBDVl9ESVZfQllfWkVST19FUlI6IHJldHVybiBDVl9TdHNEaXZCeVplcm87CisgICAgY2FzZSBDVl9CQURTVEVQX0VSUjogcmV0dXJuIENWX0JhZFN0ZXAgOworICAgIGNhc2UgQ1ZfT1VUT0ZNRU1fRVJSOiByZXR1cm4gQ1ZfU3RzTm9NZW07CisgICAgY2FzZSBDVl9CQURBUkdfRVJSOiByZXR1cm4gQ1ZfU3RzQmFkQXJnOworICAgIGNhc2UgQ1ZfTk9UREVGSU5FRF9FUlI6IHJldHVybiBDVl9TdHNFcnJvcjsKKyAgICBjYXNlIENWX0lOUExBQ0VfTk9UX1NVUFBPUlRFRF9FUlI6IHJldHVybiBDVl9TdHNJbnBsYWNlTm90U3VwcG9ydGVkOworICAgIGNhc2UgQ1ZfTk9URk9VTkRfRVJSOiByZXR1cm4gQ1ZfU3RzT2JqZWN0Tm90Rm91bmQ7CisgICAgY2FzZSBDVl9CQURDT05WRVJHRU5DRV9FUlI6IHJldHVybiBDVl9TdHNOb0NvbnY7CisgICAgY2FzZSBDVl9CQURERVBUSF9FUlI6IHJldHVybiBDVl9CYWREZXB0aDsKKyAgICBjYXNlIENWX1VOTUFUQ0hFRF9GT1JNQVRTX0VSUjogcmV0dXJuIENWX1N0c1VubWF0Y2hlZEZvcm1hdHM7CisgICAgY2FzZSBDVl9VTlNVUFBPUlRFRF9DT0lfRVJSOiByZXR1cm4gQ1ZfQmFkQ09JOworICAgIGNhc2UgQ1ZfVU5TVVBQT1JURURfQ0hBTk5FTFNfRVJSOiByZXR1cm4gQ1ZfQmFkTnVtQ2hhbm5lbHM7CisgICAgY2FzZSBDVl9CQURGTEFHX0VSUjogcmV0dXJuIENWX1N0c0JhZEZsYWc7CisgICAgY2FzZSBDVl9CQURSQU5HRV9FUlI6IHJldHVybiBDVl9TdHNCYWRBcmc7CisgICAgY2FzZSBDVl9CQURDT0VGX0VSUjogcmV0dXJuIENWX1N0c0JhZEFyZzsKKyAgICBjYXNlIENWX0JBREZBQ1RPUl9FUlI6IHJldHVybiBDVl9TdHNCYWRBcmc7CisgICAgY2FzZSBDVl9CQURQT0lOVF9FUlI6IHJldHVybiBDVl9TdHNCYWRQb2ludDsKKworICAgIGRlZmF1bHQ6IHJldHVybiBDVl9TdHNFcnJvcjsKKyAgICB9Cit9CisvKiBFbmQgb2YgZmlsZSAqLworCisKZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hpbWFnZS5jcHAgYi9jeGNvcmUvc3JjL2N4aW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjQwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4aW1hZ2UuY3BwCkBAIC0wLDAgKzEsMzk3IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgQysrIGNsYXNzZXMgZm9yIGltYWdlIGFuZCBtYXRyaWNlcworLy8KKy8vICovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ3ZJbWFnZSBpbXBsZW1lbnRhdGlvbiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBDdkxvYWRJbWFnZUZ1bmMgbG9hZF9pbWFnZSA9IDA7CitzdGF0aWMgQ3ZMb2FkSW1hZ2VNRnVuYyBsb2FkX2ltYWdlX20gPSAwOworc3RhdGljIEN2U2F2ZUltYWdlRnVuYyBzYXZlX2ltYWdlID0gMDsKK3N0YXRpYyBDdlNob3dJbWFnZUZ1bmMgc2hvd19pbWFnZSA9IE5VTEw7CisKK3N0YXRpYyBib29sCitpY3ZJc1htbE9yWWFtbCggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIGNvbnN0IGNoYXIqIHN1ZmZpeCA9IHN0cnJjaHIoIGZpbGVuYW1lLCAnLicgKTsKKyAgICByZXR1cm4gc3VmZml4ICYmCisgICAgICAgIChzdHJjbXAoIHN1ZmZpeCwgIi54bWwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi5YbWwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi5YTUwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi55bWwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi5ZbWwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi5ZTUwiICkgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIHN1ZmZpeCwgIi55YW1sIiApID09IDAgfHwKKyAgICAgICAgc3RyY21wKCBzdWZmaXgsICIuWWFtbCIgKSA9PSAwIHx8CisgICAgICAgIHN0cmNtcCggc3VmZml4LCAiLllBTUwiICkgPT0gMCk7Cit9CisKKworc3RhdGljIElwbEltYWdlKgoraWN2UmV0cmlldmVJbWFnZSggdm9pZCogb2JqICkKK3sKKyAgICBJcGxJbWFnZSogaW1nID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2UmV0cmlldmVJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19JTUFHRShvYmopICkKKyAgICAgICAgaW1nID0gKElwbEltYWdlKilvYmo7CisgICAgZWxzZSBpZiggQ1ZfSVNfTUFUKG9iaikgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQqIG0gPSAoQ3ZNYXQqKW9iajsKKyAgICAgICAgQ1ZfQ0FMTCggaW1nID0gY3ZDcmVhdGVJbWFnZUhlYWRlciggY3ZTaXplKG0tPmNvbHMsbS0+cm93cyksCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQVRfREVQVEgobS0+dHlwZSksIENWX01BVF9DTihtLT50eXBlKSApKTsKKyAgICAgICAgY3ZTZXREYXRhKCBpbWcsIG0tPmRhdGEucHRyLCBtLT5zdGVwICk7CisgICAgICAgIGltZy0+aW1hZ2VEYXRhT3JpZ2luID0gKGNoYXIqKW0tPnJlZmNvdW50OworICAgICAgICBtLT5kYXRhLnB0ciA9IDA7IG0tPnN0ZXAgPSAwOworICAgICAgICBjdlJlbGVhc2VNYXQoICZtICk7CisgICAgfQorICAgIGVsc2UgaWYoIG9iaiApCisgICAgeworICAgICAgICBjdlJlbGVhc2UoICZvYmogKTsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiVGhlIG9iamVjdCBpcyBuZWl0aGVyIGFuIGltYWdlLCBub3IgYSBtYXRyaXgiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBpbWc7Cit9CisKKworYm9vbCBDdkltYWdlOjpsb2FkKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogaW1nbmFtZSwgaW50IGNvbG9yICkKK3sKKyAgICBJcGxJbWFnZSogaW1nID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZJbWFnZTo6cmVhZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBpY3ZJc1htbE9yWWFtbChmaWxlbmFtZSkgKQorICAgIHsKKyAgICAgICAgaW1nID0gaWN2UmV0cmlldmVJbWFnZShjdkxvYWQoZmlsZW5hbWUsMCxpbWduYW1lKSk7CisgICAgICAgIGlmKCAoaW1nLT5uQ2hhbm5lbHMgPiAxKSAhPSAoY29sb3IgPT0gMCkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c05vdEltcGxlbWVudGVkLAorICAgICAgICAgICAgIlJHQjwtPkdyYXlzY2FsZSBjb252ZXJzaW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgaW1hZ2VzIHN0b3JlZCBpbiBYTUwvWUFNTCIgKTsKKyAgICAgICAgLyp7CisgICAgICAgICAgICBJcGxJbWFnZSogdGVtcF9pbWcgPSAwOworICAgICAgICAgICAgQ1ZfQ0FMTCggdGVtcF9pbWcgPSBjdkNyZWF0ZUltYWdlKCBjdkdldFNpemUoaW1nKSwgaW1nLT5kZXB0aCwgY29sb3IgPiAwID8gMyA6IDEgKSk7CisgICAgICAgICAgICBjdkN2dENvbG9yKCBpbWcsIHRlbXBfaW1nLCBjb2xvciA+IDAgPyBDVl9HUkFZMkJHUiA6IENWX0JHUjJHUkFZICk7CisgICAgICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltZyApOworICAgICAgICAgICAgaW1nID0gdGVtcF9pbWc7CisgICAgICAgIH0qLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggbG9hZF9pbWFnZSApCisgICAgICAgICAgICBpbWcgPSBsb2FkX2ltYWdlKCBmaWxlbmFtZSwgY29sb3IgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c05vdEltcGxlbWVudGVkLAorICAgICAgICAgICAgIkxvYWRpbmcgYW4gaW1hZ2Ugc3RvcmVkIGluIHN1Y2ggYSBmb3JtYXQgcmVxdWlyZXMgSGlnR1VJLlxuIgorICAgICAgICAgICAgIkxpbmsgaXQgdG8geW91ciBwcm9ncmFtIGFuZCBjYWxsIGFueSBmdW5jdGlvbiBmcm9tIGl0XG4iICk7CisgICAgfQorCisgICAgYXR0YWNoKCBpbWcgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gaW1nICE9IDA7Cit9CisKKworYm9vbCBDdkltYWdlOjpyZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbWFwbmFtZSwgY29uc3QgY2hhciogaW1nbmFtZSApCit7CisgICAgdm9pZCogb2JqID0gMDsKKyAgICBJcGxJbWFnZSogaW1nID0gMDsKKworICAgIGlmKCBtYXBuYW1lICkKKyAgICB7CisgICAgICAgIEN2RmlsZU5vZGUqIG1hcG5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgMCwgbWFwbmFtZSApOworICAgICAgICBpZiggIW1hcG5vZGUgKQorICAgICAgICAgICAgb2JqID0gY3ZSZWFkQnlOYW1lKCBmcywgbWFwbm9kZSwgaW1nbmFtZSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG9iaiA9IGN2UmVhZEJ5TmFtZSggZnMsIDAsIGltZ25hbWUgKTsKKworICAgIGltZyA9IGljdlJldHJpZXZlSW1hZ2Uob2JqKTsKKyAgICBhdHRhY2goIGltZyApOworICAgIHJldHVybiBpbWcgIT0gMDsKK30KKworCitib29sIEN2SW1hZ2U6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBzZXFuYW1lLCBpbnQgaWR4ICkKK3sKKyAgICB2b2lkKiBvYmogPSAwOworICAgIElwbEltYWdlKiBpbWcgPSAwOworICAgIEN2RmlsZU5vZGUqIHNlcW5vZGUgPSBzZXFuYW1lID8KKyAgICAgICAgY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIDAsIHNlcW5hbWUgKSA6IGN2R2V0Um9vdEZpbGVOb2RlKGZzLDApOworCisgICAgaWYoIHNlcW5vZGUgJiYgQ1ZfTk9ERV9JU19TRVEoc2Vxbm9kZS0+dGFnKSApCisgICAgICAgIG9iaiA9IGN2UmVhZCggZnMsIChDdkZpbGVOb2RlKiljdkdldFNlcUVsZW0oIHNlcW5vZGUtPmRhdGEuc2VxLCBpZHggKSk7CisgICAgaW1nID0gaWN2UmV0cmlldmVJbWFnZShvYmopOworICAgIGF0dGFjaCggaW1nICk7CisgICAgcmV0dXJuIGltZyAhPSAwOworfQorCisKK3ZvaWQgQ3ZJbWFnZTo6c2F2ZSggY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGltZ25hbWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZJbWFnZTo6d3JpdGUiICk7CisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFpbWFnZSApCisgICAgICAgIHJldHVybjsKKyAgICBpZiggaWN2SXNYbWxPcllhbWwoIGZpbGVuYW1lICkgKQorICAgICAgICBjdlNhdmUoIGZpbGVuYW1lLCBpbWFnZSwgaW1nbmFtZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBzYXZlX2ltYWdlICkKKyAgICAgICAgICAgIHNhdmVfaW1hZ2UoIGZpbGVuYW1lLCBpbWFnZSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsCisgICAgICAgICAgICAiU2F2aW5nIGFuIGltYWdlIGluIHN1Y2ggYSBmb3JtYXQgcmVxdWlyZXMgSGlnR1VJLlxuIgorICAgICAgICAgICAgIkxpbmsgaXQgdG8geW91ciBwcm9ncmFtIGFuZCBjYWxsIGFueSBmdW5jdGlvbiBmcm9tIGl0XG4iICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2SW1hZ2U6OndyaXRlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogaW1nbmFtZSApCit7CisgICAgaWYoIGltYWdlICkKKyAgICAgICAgY3ZXcml0ZSggZnMsIGltZ25hbWUsIGltYWdlICk7Cit9CisKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEN2TWF0cml4IGltcGxlbWVudGF0aW9uIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ3ZNYXRyaXg6OkN2TWF0cml4KCBpbnQgcm93cywgaW50IGNvbHMsIGludCB0eXBlLCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIGJvb2wgYWxsb2NfZGF0YSApCit7CisgICAgaWYoIHN0b3JhZ2UgKQorICAgIHsKKyAgICAgICAgbWF0cml4ID0gKEN2TWF0Kiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc2l6ZW9mKCptYXRyaXgpICk7CisgICAgICAgIGN2SW5pdE1hdEhlYWRlciggbWF0cml4LCByb3dzLCBjb2xzLCB0eXBlLCBhbGxvY19kYXRhID8KKyAgICAgICAgICAgIGN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCByb3dzKmNvbHMqQ1ZfRUxFTV9TSVpFKHR5cGUpICkgOiAwICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbWF0cml4ID0gMDsKK30KKworc3RhdGljIEN2TWF0KgoraWN2UmV0cmlldmVNYXRyaXgoIHZvaWQqIG9iaiApCit7CisgICAgQ3ZNYXQqIG0gPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZXRyaWV2ZU1hdHJpeCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9JU19NQVQob2JqKSApCisgICAgICAgIG0gPSAoQ3ZNYXQqKW9iajsKKyAgICBlbHNlIGlmKCBDVl9JU19JTUFHRShvYmopICkKKyAgICB7CisgICAgICAgIElwbEltYWdlKiBpbWcgPSAoSXBsSW1hZ2UqKW9iajsKKyAgICAgICAgQ3ZNYXQgaGRyLCAqc3JjID0gY3ZHZXRNYXQoIGltZywgJmhkciApOworICAgICAgICBDVl9DQUxMKCBtID0gY3ZDcmVhdGVNYXQoIHNyYy0+cm93cywgc3JjLT5jb2xzLCBzcmMtPnR5cGUgKSk7CisgICAgICAgIENWX0NBTEwoIGN2Q29weSggc3JjLCBtICkpOworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltZyApOworICAgIH0KKyAgICBlbHNlIGlmKCBvYmogKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlKCAmb2JqICk7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBvYmplY3QgaXMgbmVpdGhlciBhbiBpbWFnZSwgbm9yIGEgbWF0cml4IiApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbTsKK30KKworCitib29sIEN2TWF0cml4Ojpsb2FkKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgY2hhciogbWF0bmFtZSwgaW50IGNvbG9yICkKK3sKKyAgICBDdk1hdCogbSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2TWF0cml4OjpyZWFkIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoIGljdklzWG1sT3JZYW1sKGZpbGVuYW1lKSApCisgICAgeworICAgICAgICBtID0gaWN2UmV0cmlldmVNYXRyaXgoY3ZMb2FkKGZpbGVuYW1lLDAsbWF0bmFtZSkpOworCisgICAgICAgIGlmKCAoQ1ZfTUFUX0NOKG0tPnR5cGUpID4gMSkgIT0gKGNvbG9yID09IDApICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOb3RJbXBsZW1lbnRlZCwKKyAgICAgICAgICAgICJSR0I8LT5HcmF5c2NhbGUgY29udmVyc2lvbiBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIG1hdHJpY2VzIHN0b3JlZCBpbiBYTUwvWUFNTCIgKTsKKyAgICAgICAgLyp7CisgICAgICAgICAgICBDdk1hdCogdGVtcF9tYXQ7CisgICAgICAgICAgICBDVl9DQUxMKCB0ZW1wX21hdCA9IGN2Q3JlYXRlTWF0KCBtLT5yb3dzLCBtLT5jb2xzLAorICAgICAgICAgICAgICAgIENWX01BS0VUWVBFKENWX01BVF9ERVBUSChtLT50eXBlKSwgY29sb3IgPiAwID8gMyA6IDEgKSkpOworICAgICAgICAgICAgY3ZDdnRDb2xvciggbSwgdGVtcF9tYXQsIGNvbG9yID4gMCA/IENWX0dSQVkyQkdSIDogQ1ZfQkdSMkdSQVkgKTsKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJm0gKTsKKyAgICAgICAgICAgIG0gPSB0ZW1wX21hdDsKKyAgICAgICAgfSovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBsb2FkX2ltYWdlX20gKQorICAgICAgICAgICAgbSA9IGxvYWRfaW1hZ2VfbSggZmlsZW5hbWUsIGNvbG9yICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOb3RJbXBsZW1lbnRlZCwKKyAgICAgICAgICAgICJMb2FkaW5nIGFuIGltYWdlIHN0b3JlZCBpbiBzdWNoIGEgZm9ybWF0IHJlcXVpcmVzIEhpZ0dVSS5cbiIKKyAgICAgICAgICAgICJMaW5rIGl0IHRvIHlvdXIgcHJvZ3JhbSBhbmQgY2FsbCBhbnkgZnVuY3Rpb24gZnJvbSBpdFxuIiApOworICAgIH0KKworICAgIHNldCggbSwgZmFsc2UgKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbSAhPSAwOworfQorCisKK2Jvb2wgQ3ZNYXRyaXg6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBtYXBuYW1lLCBjb25zdCBjaGFyKiBtYXRuYW1lICkKK3sKKyAgICB2b2lkKiBvYmogPSAwOworICAgIEN2TWF0KiBtID0gMDsKKworICAgIGlmKCBtYXBuYW1lICkKKyAgICB7CisgICAgICAgIEN2RmlsZU5vZGUqIG1hcG5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgMCwgbWFwbmFtZSApOworICAgICAgICBpZiggIW1hcG5vZGUgKQorICAgICAgICAgICAgb2JqID0gY3ZSZWFkQnlOYW1lKCBmcywgbWFwbm9kZSwgbWF0bmFtZSApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIG9iaiA9IGN2UmVhZEJ5TmFtZSggZnMsIDAsIG1hdG5hbWUgKTsKKworICAgIG0gPSBpY3ZSZXRyaWV2ZU1hdHJpeChvYmopOworICAgIHNldCggbSwgZmFsc2UgKTsKKyAgICByZXR1cm4gbSAhPSAwOworfQorCisKK2Jvb2wgQ3ZNYXRyaXg6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBzZXFuYW1lLCBpbnQgaWR4ICkKK3sKKyAgICB2b2lkKiBvYmogPSAwOworICAgIEN2TWF0KiBtID0gMDsKKyAgICBDdkZpbGVOb2RlKiBzZXFub2RlID0gc2VxbmFtZSA/CisgICAgICAgIGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCAwLCBzZXFuYW1lICkgOiBjdkdldFJvb3RGaWxlTm9kZShmcywwKTsKKworICAgIGlmKCBzZXFub2RlICYmIENWX05PREVfSVNfU0VRKHNlcW5vZGUtPnRhZykgKQorICAgICAgICBvYmogPSBjdlJlYWQoIGZzLCAoQ3ZGaWxlTm9kZSopY3ZHZXRTZXFFbGVtKCBzZXFub2RlLT5kYXRhLnNlcSwgaWR4ICkpOworICAgIG0gPSBpY3ZSZXRyaWV2ZU1hdHJpeChvYmopOworICAgIHNldCggbSwgZmFsc2UgKTsKKyAgICByZXR1cm4gbSAhPSAwOworfQorCisKK3ZvaWQgQ3ZNYXRyaXg6OnNhdmUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBtYXRuYW1lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2TWF0cml4Ojp3cml0ZSIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIW1hdHJpeCApCisgICAgICAgIHJldHVybjsKKyAgICBpZiggaWN2SXNYbWxPcllhbWwoIGZpbGVuYW1lICkgKQorICAgICAgICBjdlNhdmUoIGZpbGVuYW1lLCBtYXRyaXgsIG1hdG5hbWUgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggc2F2ZV9pbWFnZSApCisgICAgICAgICAgICBzYXZlX2ltYWdlKCBmaWxlbmFtZSwgbWF0cml4ICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOb3RJbXBsZW1lbnRlZCwKKyAgICAgICAgICAgICJTYXZpbmcgYSBtYXRyaXhlIGluIHN1Y2ggYSBmb3JtYXQgcmVxdWlyZXMgSGlnR1VJLlxuIgorICAgICAgICAgICAgIkxpbmsgaXQgdG8geW91ciBwcm9ncmFtIGFuZCBjYWxsIGFueSBmdW5jdGlvbiBmcm9tIGl0XG4iICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2TWF0cml4Ojp3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG1hdG5hbWUgKQoreworICAgIGlmKCBtYXRyaXggKQorICAgICAgICBjdldyaXRlKCBmcywgbWF0bmFtZSwgbWF0cml4ICk7Cit9CisKKworCitDVl9JTVBMIGludAorY3ZTZXRJbWFnZUlPRnVuY3Rpb25zKCBDdkxvYWRJbWFnZUZ1bmMgX2xvYWRfaW1hZ2UsIEN2TG9hZEltYWdlTUZ1bmMgX2xvYWRfaW1hZ2VfbSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZTYXZlSW1hZ2VGdW5jIF9zYXZlX2ltYWdlLCBDdlNob3dJbWFnZUZ1bmMgX3Nob3dfaW1hZ2U9TlVMTCApCit7CisgICAgbG9hZF9pbWFnZSA9IF9sb2FkX2ltYWdlOworICAgIGxvYWRfaW1hZ2VfbSA9IF9sb2FkX2ltYWdlX207CisgICAgc2F2ZV9pbWFnZSA9IF9zYXZlX2ltYWdlOworICAgIHNob3dfaW1hZ2UgPSBfc2hvd19pbWFnZTsKKyAgICByZXR1cm4gMTsKK30KKworCisvKnZvaWQgbWFpbih2b2lkKQoreworICAgIEN2SW1hZ2UgYShjdlNpemUoMzAwLDIwMCksOCwzKSwgYihjdlNpemUoMzAwLDIwMCksOCwzKTsKKyAgICBDdlJORyBybmcgPSBjdlJORygtMSk7CisKKyAgICBDVl9TRVRfSU1BR0VfSU9fRlVOQ1RJT05TKCk7CisKKyAgICBjdk5hbWVkV2luZG93KCAidGVzdCIsIDEgKTsKKyAgICAvL2N2WmVybyggYSApOworICAgIGN2WmVybyggYiApOworICAgIGN2UmFuZEFyciggJnJuZywgYSwgQ1ZfUkFORF9VTkksIGN2U2NhbGFyQWxsKDApLCBjdlNjYWxhckFsbCgxMDApICk7CisgICAgY3ZDaXJjbGUoIGIsIGN2UG9pbnQoMTAwLDEwMCksIDcwLCBjdlNjYWxhcigwLDI1NSwwKSwgLTEsIENWX0FBLCAwICk7CisgICAgY3ZBZGQoIGEsIGIsIGEgKTsKKyAgICBhLnNob3coICJ0ZXN0IiApOworCisgICAgY3ZXYWl0S2V5KCk7Cit9Ki8KKworLyogRW5kIG9mIGZpbGUuICovCisKZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hqYWNvYmllaWdlbnMuY3BwIGIvY3hjb3JlL3NyYy9jeGphY29iaWVpZ2Vucy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMwNzA5NAotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hqYWNvYmllaWdlbnMuY3BwCkBAIC0wLDAgKzEsNDMxIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLypGLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICBOYW1lczogICAgICBpY3ZKYWNvYmlFaWdlbnNfMzJmLCBpY3ZKYWNvYmlFaWdlbnNfNjRkCisvLyAgICBQdXJwb3NlOiAgICBFaWdlbnZhbHVlcyAmIGVpZ2VudmVjdG9ycyBjYWxjdWxhdGlvbiBvZiBhIHN5bW1ldHJpYyBtYXRyaXg6CisvLyAgICAgICAgICAgICAgICBBIFZpICA9ICBFaSBWaQorLy8gICAgQ29udGV4dDogICAKKy8vICAgIFBhcmFtZXRlcnM6IEEobiwgbikgLSBzb3VyY2Ugc3ltbWV0cmljIG1hdHJpeCAobiAtIHJvd3MgJiBjb2x1bW5zIG51bWJlciksCisvLyAgICAgICAgICAgICAgICBWKG4sIG4pIC0gbWF0cml4IG9mIGl0cyBlaWdlbnZlY3RvcnMgCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKGktdGggcm93IGlzIGFuIGVpZ2VudmVjdG9yIFZpKSwKKy8vICAgICAgICAgICAgICAgIEUobikgICAgLSB2ZWN0b3Igb2YgaXRzIGVpZ2VudmFsdWVzCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgKGktdGggZWxlbWVudCBpcyBhbiBlaWdlbnZhbHVlIEVpKSwKKy8vICAgICAgICAgICAgICAgIGVwcyAgICAgLSBhY2N1cmFjeSBvZiBkaWFnb25hbGl6YXRpb24uCisvLyAgICAgICAgICAgICAgIAorLy8gICAgUmV0dXJuczoKKy8vICAgIENWX05PX0VSUk9SIG9yIGVycm9yIGNvZGUgICAgIAorLy8gICAgTm90ZXM6CisvLyAgICAgICAgMS4gVGhlIGZ1bmN0aW9ucyBkZXN0cm95IHNvdXJjZSBtYXRyaXggQSwgc28gaWYgeW91IG5lZWQgaXQgZnVydGhlciwgeW91CisvLyAgICAgICAgICAgaGF2ZSB0byBjb3B5IGl0IGJlZm9yZSB0aGUgcHJvY2Vzc2luZy4KKy8vICAgICAgICAyLiBFaWdlbnZhbGllcyBhbmQgZWlnZW52ZWN0b3JzIGFyZSBzb3J0ZWQgaW4gRWkgYWJzb2x1dGUgdmFsdWUgZGVzY2VuZGluZy4KKy8vICAgICAgICAzLiBDYWxjdWxhdGlvbiB0aW1lIGRlcGVuZHMgb24gZXBzIHZhbHVlLiBJZiB0aGUgdGltZSBpc24ndCB2ZXJ5IGltcG9ydGFudCwKKy8vICAgICAgICAgICB3ZSByZWNvbW1lbmQgdG8gc2V0IGVwcyA9IDAuCisvL0YqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PSBTaW5nbGUgcHJlY2lzaW9uIGZ1bmN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkphY29iaUVpZ2Vuc18zMmYoZmxvYXQgKkEsIGZsb2F0ICpWLCBmbG9hdCAqRSwgaW50IG4sIGZsb2F0IGVwcykKK3sKKyAgICBpbnQgaSwgaiwgaywgaW5kLCBpdGVycyA9IDA7CisgICAgZmxvYXQgKkFBID0gQSwgKlZWID0gVjsKKyAgICBkb3VibGUgQW1heCwgYW5vcm0gPSAwLCBheDsKKworICAgIGlmKCBBID09IE5VTEwgfHwgViA9PSBOVUxMIHx8IEUgPT0gTlVMTCApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggbiA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworICAgIGlmKCBlcHMgPCBEQkxfRVBTSUxPTiApCisgICAgICAgIGVwcyA9IERCTF9FUFNJTE9OOworCisgICAgLyotLS0tLS0tLSBQcmVwYXJlIC0tLS0tLS0tKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCBWViArPSBuLCBBQSArPSBuICkKKyAgICB7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBpOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgQW0gPSBBQVtqXTsKKworICAgICAgICAgICAgYW5vcm0gKz0gQW0gKiBBbTsKKyAgICAgICAgfQorICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjsgaisrICkKKyAgICAgICAgICAgIFZWW2pdID0gMC5mOworICAgICAgICBWVltpXSA9IDEuZjsKKyAgICB9CisKKyAgICBhbm9ybSA9IHNxcnQoIGFub3JtICsgYW5vcm0gKTsKKyAgICBheCA9IGFub3JtICogZXBzIC8gbjsKKyAgICBBbWF4ID0gYW5vcm07CisKKyAgICB3aGlsZSggQW1heCA+IGF4ICYmIGl0ZXJzKysgPCAxMDAgKQorICAgIHsKKyAgICAgICAgQW1heCAvPSBuOworICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSAoaW5kKSAqLworICAgICAgICB7CisgICAgICAgICAgICBpbnQgcCwgcTsKKyAgICAgICAgICAgIGZsb2F0ICpWMSA9IFYsICpBMSA9IEE7CisKKyAgICAgICAgICAgIGluZCA9IDA7CisgICAgICAgICAgICBmb3IoIHAgPSAwOyBwIDwgbiAtIDE7IHArKywgQTEgKz0gbiwgVjEgKz0gbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgKkEyID0gQSArIG4gKiAocCArIDEpLCAqVjIgPSBWICsgbiAqIChwICsgMSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIHEgPSBwICsgMTsgcSA8IG47IHErKywgQTIgKz0gbiwgVjIgKz0gbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwgeSwgYywgcywgYzIsIHMyLCBhOworICAgICAgICAgICAgICAgICAgICBmbG9hdCAqQTMsIEFwcSA9IEExW3FdLCBBcHAsIEFxcSwgQWlwLCBBaXEsIFZwaSwgVnFpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKCBBcHEgKSA8IEFtYXggKQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgaW5kID0gMTsKKworICAgICAgICAgICAgICAgICAgICAvKi0tLS0gQ2FsY3VsYXRpb24gb2Ygcm90YXRpb24gYW5nbGUncyBzaW5lICYgY29zaW5lIC0tLS0qLworICAgICAgICAgICAgICAgICAgICBBcHAgPSBBMVtwXTsKKyAgICAgICAgICAgICAgICAgICAgQXFxID0gQTJbcV07CisgICAgICAgICAgICAgICAgICAgIHkgPSA1LjBlLTEgKiAoQXBwIC0gQXFxKTsKKyAgICAgICAgICAgICAgICAgICAgeCA9IC1BcHEgLyBzcXJ0KCAoZG91YmxlKUFwcSAqIEFwcSArIChkb3VibGUpeSAqIHkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHkgPCAwLjAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeCA9IC14OworICAgICAgICAgICAgICAgICAgICBzID0geCAvIHNxcnQoIDIuMCAqICgxLjAgKyBzcXJ0KCAxLjAgLSAoZG91YmxlKXggKiB4ICkpKTsKKyAgICAgICAgICAgICAgICAgICAgczIgPSBzICogczsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHNxcnQoIDEuMCAtIHMyICk7CisgICAgICAgICAgICAgICAgICAgIGMyID0gYyAqIGM7CisgICAgICAgICAgICAgICAgICAgIGEgPSAyLjAgKiBBcHEgKiBjICogczsKKworICAgICAgICAgICAgICAgICAgICAvKi0tLS0gQXBxIGFubnVsYXRpb24gLS0tLSovCisgICAgICAgICAgICAgICAgICAgIEEzID0gQTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHA7IGkrKywgQTMgKz0gbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcCA9IEEzW3BdOworICAgICAgICAgICAgICAgICAgICAgICAgQWlxID0gQTNbcV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcGkgPSBWMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZxaSA9IFYyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQTNbcF0gPSAoZmxvYXQpIChBaXAgKiBjIC0gQWlxICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBM1txXSA9IChmbG9hdCkgKEFpcSAqIGMgKyBBaXAgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYxW2ldID0gKGZsb2F0KSAoVnBpICogYyAtIFZxaSAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgVjJbaV0gPSAoZmxvYXQpIChWcWkgKiBjICsgVnBpICogcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGkgPCBxOyBpKyssIEEzICs9IG4gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBBaXAgPSBBMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcSA9IEEzW3FdOworICAgICAgICAgICAgICAgICAgICAgICAgVnBpID0gVjFbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcWkgPSBWMltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEExW2ldID0gKGZsb2F0KSAoQWlwICogYyAtIEFpcSAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgQTNbcV0gPSAoZmxvYXQpIChBaXEgKiBjICsgQWlwICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBWMVtpXSA9IChmbG9hdCkgKFZwaSAqIGMgLSBWcWkgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYyW2ldID0gKGZsb2F0KSAoVnFpICogYyArIFZwaSAqIHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciggOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgQWlwID0gQTFbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBBaXEgPSBBMltpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZwaSA9IFYxW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgVnFpID0gVjJbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBBMVtpXSA9IChmbG9hdCkgKEFpcCAqIGMgLSBBaXEgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEyW2ldID0gKGZsb2F0KSAoQWlxICogYyArIEFpcCAqIHMpOworICAgICAgICAgICAgICAgICAgICAgICAgVjFbaV0gPSAoZmxvYXQpIChWcGkgKiBjIC0gVnFpICogcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBWMltpXSA9IChmbG9hdCkgKFZxaSAqIGMgKyBWcGkgKiBzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBMVtwXSA9IChmbG9hdCkgKEFwcCAqIGMyICsgQXFxICogczIgLSBhKTsKKyAgICAgICAgICAgICAgICAgICAgQTJbcV0gPSAoZmxvYXQpIChBcHAgKiBzMiArIEFxcSAqIGMyICsgYSk7CisgICAgICAgICAgICAgICAgICAgIEExW3FdID0gQTJbcF0gPSAwLjBmOworICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAvKnEgKi8KKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLypwICovCisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGluZCApOworICAgICAgICBBbWF4IC89IG47CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlICggQW1heCA+IGF4ICkgKi8KKworICAgIGZvciggaSA9IDAsIGsgPSAwOyBpIDwgbjsgaSsrLCBrICs9IG4gKyAxICkKKyAgICAgICAgRVtpXSA9IEFba107CisgICAgLypwcmludGYoIiBNID0gJWRcbiIsIE0pOyAqLworCisgICAgLyogLS0tLS0tLS0gb3JkZXJpbmcgLS0tLS0tLS0gKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBtID0gaTsKKyAgICAgICAgZmxvYXQgRW0gPSAoZmxvYXQpIGZhYnMoIEVbaV0gKTsKKworICAgICAgICBmb3IoIGogPSBpICsgMTsgaiA8IG47IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IEVqID0gKGZsb2F0KSBmYWJzKCBFW2pdICk7CisKKyAgICAgICAgICAgIG0gPSAoRW0gPCBFaikgPyBqIDogbTsKKyAgICAgICAgICAgIEVtID0gKEVtIDwgRWopID8gRWogOiBFbTsKKyAgICAgICAgfQorICAgICAgICBpZiggbSAhPSBpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGw7CisgICAgICAgICAgICBmbG9hdCBiID0gRVtpXTsKKworICAgICAgICAgICAgRVtpXSA9IEVbbV07CisgICAgICAgICAgICBFW21dID0gYjsKKyAgICAgICAgICAgIGZvciggaiA9IDAsIGsgPSBpICogbiwgbCA9IG0gKiBuOyBqIDwgbjsgaisrLCBrKyssIGwrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYiA9IFZba107CisgICAgICAgICAgICAgICAgVltrXSA9IFZbbF07CisgICAgICAgICAgICAgICAgVltsXSA9IGI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOworfQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PSBEb3VibGUgcHJlY2lzaW9uIGZ1bmN0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwKK2ljdkphY29iaUVpZ2Vuc182NGQoZG91YmxlICpBLCBkb3VibGUgKlYsIGRvdWJsZSAqRSwgaW50IG4sIGRvdWJsZSBlcHMpCit7CisgICAgaW50IGksIGosIGssIHAsIHEsIGluZCwgaXRlcnMgPSAwOworICAgIGRvdWJsZSAqQTEgPSBBLCAqVjEgPSBWLCAqQTIgPSBBLCAqVjIgPSBWOworICAgIGRvdWJsZSBBbWF4ID0gMC4wLCBhbm9ybSA9IDAuMCwgYXg7CisKKyAgICBpZiggQSA9PSBOVUxMIHx8IFYgPT0gTlVMTCB8fCBFID09IE5VTEwgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIG4gPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKyAgICBpZiggZXBzIDwgREJMX0VQU0lMT04gKQorICAgICAgICBlcHMgPSBEQkxfRVBTSUxPTjsKKworICAgIC8qLS0tLS0tLS0gUHJlcGFyZSAtLS0tLS0tLSovCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKywgVjEgKz0gbiwgQTEgKz0gbiApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDwgaTsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIEFtID0gQTFbal07CisKKyAgICAgICAgICAgIGFub3JtICs9IEFtICogQW07CisgICAgICAgIH0KKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICBWMVtqXSA9IDAuMDsKKyAgICAgICAgVjFbaV0gPSAxLjA7CisgICAgfQorCisgICAgYW5vcm0gPSBzcXJ0KCBhbm9ybSArIGFub3JtICk7CisgICAgYXggPSBhbm9ybSAqIGVwcyAvIG47CisgICAgQW1heCA9IGFub3JtOworCisgICAgd2hpbGUoIEFtYXggPiBheCAmJiBpdGVycysrIDwgMTAwICkKKyAgICB7CisgICAgICAgIEFtYXggLz0gbjsKKyAgICAgICAgZG8gICAgICAgICAgICAgICAgICAgICAgLyogd2hpbGUgKGluZCkgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaW5kID0gMDsKKyAgICAgICAgICAgIEExID0gQTsKKyAgICAgICAgICAgIFYxID0gVjsKKyAgICAgICAgICAgIGZvciggcCA9IDA7IHAgPCBuIC0gMTsgcCsrLCBBMSArPSBuLCBWMSArPSBuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBMiA9IEEgKyBuICogKHAgKyAxKTsKKyAgICAgICAgICAgICAgICBWMiA9IFYgKyBuICogKHAgKyAxKTsKKyAgICAgICAgICAgICAgICBmb3IoIHEgPSBwICsgMTsgcSA8IG47IHErKywgQTIgKz0gbiwgVjIgKz0gbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCwgeSwgYywgcywgYzIsIHMyLCBhOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgKkEzLCBBcHEsIEFwcCwgQXFxLCBBcHAyLCBBcXEyLCBBaXAsIEFpcSwgVnBpLCBWcWk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnMoIEExW3FdICkgPCBBbWF4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICBBcHEgPSBBMVtxXTsKKworICAgICAgICAgICAgICAgICAgICBpbmQgPSAxOworCisgICAgICAgICAgICAgICAgICAgIC8qLS0tLSBDYWxjdWxhdGlvbiBvZiByb3RhdGlvbiBhbmdsZSdzIHNpbmUgJiBjb3NpbmUgLS0tLSovCisgICAgICAgICAgICAgICAgICAgIEFwcCA9IEExW3BdOworICAgICAgICAgICAgICAgICAgICBBcXEgPSBBMltxXTsKKyAgICAgICAgICAgICAgICAgICAgeSA9IDUuMGUtMSAqIChBcHAgLSBBcXEpOworICAgICAgICAgICAgICAgICAgICB4ID0gLUFwcSAvIHNxcnQoIEFwcSAqIEFwcSArIChkb3VibGUpeSAqIHkgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHkgPCAwLjAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeCA9IC14OworICAgICAgICAgICAgICAgICAgICBzID0geCAvIHNxcnQoIDIuMCAqICgxLjAgKyBzcXJ0KCAxLjAgLSAoZG91YmxlKXggKiB4ICkpKTsKKyAgICAgICAgICAgICAgICAgICAgczIgPSBzICogczsKKyAgICAgICAgICAgICAgICAgICAgYyA9IHNxcnQoIDEuMCAtIHMyICk7CisgICAgICAgICAgICAgICAgICAgIGMyID0gYyAqIGM7CisgICAgICAgICAgICAgICAgICAgIGEgPSAyLjAgKiBBcHEgKiBjICogczsKKworICAgICAgICAgICAgICAgICAgICAvKi0tLS0gQXBxIGFubnVsYXRpb24gLS0tLSovCisgICAgICAgICAgICAgICAgICAgIEEzID0gQTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHA7IGkrKywgQTMgKz0gbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcCA9IEEzW3BdOworICAgICAgICAgICAgICAgICAgICAgICAgQWlxID0gQTNbcV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcGkgPSBWMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZxaSA9IFYyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQTNbcF0gPSBBaXAgKiBjIC0gQWlxICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEzW3FdID0gQWlxICogYyArIEFpcCAqIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBWMVtpXSA9IFZwaSAqIGMgLSBWcWkgKiBzOworICAgICAgICAgICAgICAgICAgICAgICAgVjJbaV0gPSBWcWkgKiBjICsgVnBpICogczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IHE7IGkrKywgQTMgKz0gbiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcCA9IEExW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQWlxID0gQTNbcV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcGkgPSBWMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZxaSA9IFYyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQTFbaV0gPSBBaXAgKiBjIC0gQWlxICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEzW3FdID0gQWlxICogYyArIEFpcCAqIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBWMVtpXSA9IFZwaSAqIGMgLSBWcWkgKiBzOworICAgICAgICAgICAgICAgICAgICAgICAgVjJbaV0gPSBWcWkgKiBjICsgVnBpICogczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFpcCA9IEExW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQWlxID0gQTJbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBWcGkgPSBWMVtpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZxaSA9IFYyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgQTFbaV0gPSBBaXAgKiBjIC0gQWlxICogczsKKyAgICAgICAgICAgICAgICAgICAgICAgIEEyW2ldID0gQWlxICogYyArIEFpcCAqIHM7CisgICAgICAgICAgICAgICAgICAgICAgICBWMVtpXSA9IFZwaSAqIGMgLSBWcWkgKiBzOworICAgICAgICAgICAgICAgICAgICAgICAgVjJbaV0gPSBWcWkgKiBjICsgVnBpICogczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBBcHAyID0gQXBwICogYzIgKyBBcXEgKiBzMiAtIGE7CisgICAgICAgICAgICAgICAgICAgIEFxcTIgPSBBcHAgKiBzMiArIEFxcSAqIGMyICsgYTsKKyAgICAgICAgICAgICAgICAgICAgQTFbcF0gPSBBcHAyOworICAgICAgICAgICAgICAgICAgICBBMltxXSA9IEFxcTI7CisgICAgICAgICAgICAgICAgICAgIEExW3FdID0gQTJbcF0gPSAwLjA7CisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgIC8qcSAqLworICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKnAgKi8KKyAgICAgICAgfQorICAgICAgICB3aGlsZSggaW5kICk7CisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlICggQW1heCA+IGF4ICkgKi8KKworICAgIGZvciggaSA9IDAsIGsgPSAwOyBpIDwgbjsgaSsrLCBrICs9IG4gKyAxICkKKyAgICAgICAgRVtpXSA9IEFba107CisKKyAgICAvKiAtLS0tLS0tLSBvcmRlcmluZyAtLS0tLS0tLSAqLworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IG0gPSBpOworICAgICAgICBkb3VibGUgRW0gPSBmYWJzKCBFW2ldICk7CisKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPCBuOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgRWogPSBmYWJzKCBFW2pdICk7CisKKyAgICAgICAgICAgIG0gPSAoRW0gPCBFaikgPyBqIDogbTsKKyAgICAgICAgICAgIEVtID0gKEVtIDwgRWopID8gRWogOiBFbTsKKyAgICAgICAgfQorICAgICAgICBpZiggbSAhPSBpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGw7CisgICAgICAgICAgICBkb3VibGUgYiA9IEVbaV07CisKKyAgICAgICAgICAgIEVbaV0gPSBFW21dOworICAgICAgICAgICAgRVttXSA9IGI7CisgICAgICAgICAgICBmb3IoIGogPSAwLCBrID0gaSAqIG4sIGwgPSBtICogbjsgaiA8IG47IGorKywgaysrLCBsKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSBWW2tdOworICAgICAgICAgICAgICAgIFZba10gPSBWW2xdOworICAgICAgICAgICAgICAgIFZbbF0gPSBiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX05PX0VSUjsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2RWlnZW5WViggQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGV2ZWN0c2FyciwgQ3ZBcnIqIGV2YWxzYXJyLCBkb3VibGUgZXBzICkKK3sKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZFaWdlblZWIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBlc3R1YjEsICpldmVjdHMgPSAoQ3ZNYXQqKWV2ZWN0c2FycjsKKyAgICBDdk1hdCBlc3R1YjIsICpldmFscyA9IChDdk1hdCopZXZhbHNhcnI7CisKKyAgICBpZiggIUNWX0lTX01BVCggc3JjICkpCisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBldmVjdHMgKSkKKyAgICAgICAgQ1ZfQ0FMTCggZXZlY3RzID0gY3ZHZXRNYXQoIGV2ZWN0cywgJmVzdHViMSApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBldmFscyApKQorICAgICAgICBDVl9DQUxMKCBldmFscyA9IGN2R2V0TWF0KCBldmFscywgJmVzdHViMiApKTsKKworICAgIGlmKCBzcmMtPmNvbHMgIT0gc3JjLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAic291cmNlIGlzIG5vdCBxdWFkcmF0aWMgbWF0cml4IiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZXZlY3RzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgImVpZ2VudmVjdG9ycyBtYXRyaXggaGFzIGluYXBwcm9wcmlhdGUgc2l6ZSIgKTsKKworICAgIGlmKCAoZXZhbHMtPnJvd3MgIT0gc3JjLT5yb3dzIHx8IGV2YWxzLT5jb2xzICE9IDEpICYmCisgICAgICAgIChldmFscy0+Y29scyAhPSBzcmMtPnJvd3MgfHwgZXZhbHMtPnJvd3MgIT0gMSkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiZWlnZW52YWx1ZXMgdmVjdG9yIGhhcyBpbmFwcHJvcHJpYXRlIHNpemUiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBldmVjdHMgKSB8fCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGV2YWxzICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLAorICAgICAgICAiaW5wdXQgbWF0cml4LCBlaWdlbnZhbHVlcyBhbmQgZWlnZW52ZWN0b3JzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIiApOworCisgICAgaWYoICFDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZXZhbHMtPnR5cGUgJiBldmVjdHMtPnR5cGUgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZFN0ZXAsICJhbGwgdGhlIG1hdHJpY2VzIG11c3QgYmUgY29udGludW91cyIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShzcmMtPnR5cGUpID09IENWXzMyRkMxICkKKyAgICB7CisgICAgICAgIElQUElfQ0FMTCggaWN2SmFjb2JpRWlnZW5zXzMyZiggc3JjLT5kYXRhLmZsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZWN0cy0+ZGF0YS5mbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFscy0+ZGF0YS5mbCwgc3JjLT5jb2xzLCAoZmxvYXQpZXBzICkpOworCisgICAgfQorICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKHNyYy0+dHlwZSkgPT0gQ1ZfNjRGQzEgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBpY3ZKYWNvYmlFaWdlbnNfNjRkKCBzcmMtPmRhdGEuZGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlY3RzLT5kYXRhLmRiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWxzLT5kYXRhLmRiLCBzcmMtPmNvbHMsIGVwcyApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiT25seSAzMmZDMSBhbmQgNjRmQzEgdHlwZXMgYXJlIHN1cHBvcnRlZCIgKTsKKyAgICB9CisKKyAgICBDVl9DSEVDS19OQU5TKCBldmVjdHMgKTsKKyAgICBDVl9DSEVDS19OQU5TKCBldmFscyApOworCisgICAgX19FTkRfXzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hsb2dpYy5jcHAgYi9jeGNvcmUvc3JjL2N4bG9naWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmMjNkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4bG9naWMuY3BwCkBAIC0wLDAgKzEsNjk2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgQ3ZNYXQgbG9naWNhbCBvcGVyYXRpb25zOiAmLCB8LCBeIC4uLgorLy8KKy8vICovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY3JvcyBmb3IgbG9naWMgb3BlcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXQgb3AgTWF0CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisKKyNkZWZpbmUgSUNWX0RFRl9CSU5fTE9HX09QXzJEKCBfX29wX18sIG5hbWUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdiMjbmFtZSMjXzh1X0MxUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyggY29uc3QgdWNoYXIqIHNyYzEsIGludCBzdGVwMSwgY29uc3QgdWNoYXIqIHNyYzIsIGludCBzdGVwMiwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdWNoYXIqIGRzdCwgaW50IHN0ZXAsIEN2U2l6ZSBzaXplICksIChzcmMxLCBzdGVwMSwgc3JjMiwgc3RlcDIsIGRzdCwgc3RlcCwgc2l6ZSkgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgZHN0ICs9IHN0ZXAgKSAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGkgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICgoKHNpemVfdClzcmMxIHwgKHNpemVfdClzcmMyIHwgKHNpemVfdClkc3QpICYgMykgPT0gMCApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBpIDw9IHNpemUud2lkdGggLSAxNjsgaSArPSAxNiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpbnQgdDAgPSBfX29wX18oKChjb25zdCBpbnQqKShzcmMxK2kpKVswXSwgKChjb25zdCBpbnQqKShzcmMyK2kpKVswXSk7XAorICAgICAgICAgICAgICAgIGludCB0MSA9IF9fb3BfXygoKGNvbnN0IGludCopKHNyYzEraSkpWzFdLCAoKGNvbnN0IGludCopKHNyYzIraSkpWzFdKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzBdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDAgPSBfX29wX18oKChjb25zdCBpbnQqKShzcmMxK2kpKVsyXSwgKChjb25zdCBpbnQqKShzcmMyK2kpKVsyXSk7ICBcCisgICAgICAgICAgICAgICAgdDEgPSBfX29wX18oKChjb25zdCBpbnQqKShzcmMxK2kpKVszXSwgKChjb25zdCBpbnQqKShzcmMyK2kpKVszXSk7ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzJdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzNdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaW50IHQgPSBfX29wX18oKihjb25zdCBpbnQqKShzcmMxK2kpLCAqKGNvbnN0IGludCopKHNyYzIraSkpOyAgICAgICBcCisgICAgICAgICAgICAgICAgKihpbnQqKShkc3QraSkgPSB0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgdCA9IF9fb3BfXygoKGNvbnN0IHVjaGFyKilzcmMxKVtpXSwoKGNvbnN0IHVjaGFyKilzcmMyKVtpXSk7ICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSAodWNoYXIpdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuICBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXQgb3AgU2NhbGFyCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqLworCisKKyNkZWZpbmUgSUNWX0RFRl9VTl9MT0dfT1BfMkQoIF9fb3BfXywgbmFtZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3YjI25hbWUjI184dV9DblIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKCBjb25zdCB1Y2hhciogc3JjMCwgaW50IHN0ZXAxLCB1Y2hhciogZHN0MCwgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgdWNoYXIqIHNjYWxhciwgaW50IHBpeF9zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBkZWx0YSA9IDEyKnBpeF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzAgKz0gc3RlcDEsIGRzdDAgKz0gc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgdWNoYXIqIHNyYyA9IChjb25zdCB1Y2hhciopc3JjMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVjaGFyKiBkc3QgPSBkc3QwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgbGVuID0gc2l6ZS53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCAoKChzaXplX3Qpc3JjfChzaXplX3QpZHN0KSAmIDMpID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdoaWxlKCAobGVuIC09IGRlbHRhKSA+PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCAoZGVsdGEpOyBpICs9IDEyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGludCB0MCA9IF9fb3BfXygoKGNvbnN0IGludCopKHNyYytpKSlbMF0sICgoY29uc3QgaW50Kikoc2NhbGFyK2kpKVswXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgaW50IHQxID0gX19vcF9fKCgoY29uc3QgaW50Kikoc3JjK2kpKVsxXSwgKChjb25zdCBpbnQqKShzY2FsYXIraSkpWzFdKTsgXAorICAgICAgICAgICAgICAgICAgICAoKGludCopKGRzdCtpKSlbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0MCA9IF9fb3BfXygoKGNvbnN0IGludCopKHNyYytpKSlbMl0sICgoY29uc3QgaW50Kikoc2NhbGFyK2kpKVsyXSk7IFwKKyAgICAgICAgICAgICAgICAgICAgKChpbnQqKShkc3QraSkpWzJdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNyYyArPSBkZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3QgKz0gZGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd2hpbGUoIChsZW4gLT0gZGVsdGEpID49IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IChkZWx0YSk7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaW50IHQwID0gX19vcF9fKHNyY1tpXSwgc2NhbGFyW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGludCB0MSA9IF9fb3BfXyhzcmNbaSsxXSwgc2NhbGFyW2krMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbaV0gPSAodWNoYXIpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2krMV0gPSAodWNoYXIpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0MCA9IF9fb3BfXyhzcmNbaSsyXSwgc2NhbGFyW2krMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdDEgPSBfX29wX18oc3JjW2krM10sIHNjYWxhcltpKzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRzdFtpKzJdID0gKHVjaGFyKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkc3RbaSszXSA9ICh1Y2hhcil0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgc3JjICs9IGRlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdCArPSBkZWx0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBsZW4gKz0gZGVsdGEsIGkgPSAwOyBpIDwgbGVuOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IHQgPSBfX29wX18oc3JjW2ldLHNjYWxhcltpXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcil0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dJQyBPUEVSQVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdGljIHZvaWQKK2ljdkxvZ2ljUyggY29uc3Qgdm9pZCogc3JjYXJyLCBDdlNjYWxhciogc2NhbGFyLCB2b2lkKiBkc3RhcnIsCisgICAgICAgICAgIGNvbnN0IHZvaWQqIG1hc2thcnIsIEN2RnVuYzJEXzJBMVAxSSBmbl8yZCApCit7CisgICAgdWNoYXIqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMTsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImljdkxvZ2ljUyIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2TWF0IG1hc2tzdHViLCAqbWFzayA9IChDdk1hdCopbWFza2FycjsKKyAgICBDdk1hdCBkc3RidWYsICp0ZHN0OworICAgIEN2Q29weU1hc2tGdW5jIGNvcHltX2Z1bmMgPSAwOworICAgIAorICAgIGludCB5LCBkeTsKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwOworICAgIGludCBpc19uZCA9IDAsIGNvbnRfZmxhZyA9IDA7CisgICAgaW50IGVsZW1fc2l6ZSwgZWxlbV9zaXplMSwgdHlwZSwgZGVwdGg7CisgICAgZG91YmxlIGJ1ZlsxMl07CisgICAgQ3ZTaXplIHNpemUsIHRzaXplOworICAgIGludCBzcmNfc3RlcCwgZHN0X3N0ZXAsIHRkc3Rfc3RlcCwgbWFza19zdGVwOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjKSkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChzcmMpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoZHN0KSApCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKyAgICB9CisKKyAgICBpZiggaXNfbmQgKQorICAgIHsKKyAgICAgICAgQ3ZBcnIqIGFycnNbXSA9IHsgc3JjLCBkc3QgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1syXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBpZiggbWFza2FyciApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywKKyAgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBvbiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgZG9lcyBub3Qgc3VwcG9ydCBtYXNrIiApOworCisgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAyLCBhcnJzLCAwLCBzdHVicywgJml0ZXJhdG9yICkpOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworICAgICAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgICAgIGVsZW1fc2l6ZTEgPSBDVl9FTEVNX1NJWkUxKGRlcHRoKTsKKworICAgICAgICBDVl9DQUxMKCBjdlNjYWxhclRvUmF3RGF0YSggc2NhbGFyLCBidWYsIHR5cGUsIDEgKSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBmbl8yZCggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5wdHJbMV0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsIGJ1ZiwgZWxlbV9zaXplMSApKTsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYywgZHN0ICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKTsKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgZWxlbV9zaXplMSA9IENWX0VMRU1fU0laRTEoZGVwdGgpOworCisgICAgaWYoICFtYXNrICkKKyAgICB7CisgICAgICAgIGNvbnRfZmxhZyA9IENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKTsKKyAgICAgICAgZHkgPSBzaXplLmhlaWdodDsKKyAgICAgICAgdGRzdCA9IGRzdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGJ1Zl9zaXplOworICAgICAgICAKKyAgICAgICAgaWYoICFDVl9JU19NQVQobWFzaykgKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUihtYXNrKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXNrLCBkc3QgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICBjb250X2ZsYWcgPSBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICYgbWFzay0+dHlwZSApOworICAgICAgICBkeSA9IENWX01BWF9MT0NBTF9TSVpFLyhlbGVtX3NpemUqc2l6ZS5oZWlnaHQpOworICAgICAgICBkeSA9IE1BWChkeSwxKTsKKyAgICAgICAgZHkgPSBNSU4oZHksc2l6ZS5oZWlnaHQpOworICAgICAgICBkc3RidWYgPSBjdk1hdCggZHksIHNpemUud2lkdGgsIHR5cGUgKTsKKyAgICAgICAgaWYoICFjb250X2ZsYWcgKQorICAgICAgICAgICAgZHN0YnVmLnN0ZXAgPSBjdkFsaWduKCBkc3RidWYuc3RlcCwgOCApOworICAgICAgICBidWZfc2l6ZSA9IGRzdGJ1Zi5zdGVwID8gZHN0YnVmLnN0ZXAqZHkgOiBzaXplLndpZHRoKmVsZW1fc2l6ZTsKKyAgICAgICAgaWYoIGJ1Zl9zaXplID4gQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSAodWNoYXIqKWN2QWxsb2MoIGJ1Zl9zaXplICkpOworICAgICAgICAgICAgbG9jYWxfYWxsb2MgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJ1ZmZlciA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBidWZfc2l6ZSApOworICAgICAgICBkc3RidWYuZGF0YS5wdHIgPSBidWZmZXI7CisgICAgICAgIHRkc3QgPSAmZHN0YnVmOworICAgICAgICAKKyAgICAgICAgY29weW1fZnVuYyA9IGljdkdldENvcHlNYXNrRnVuYyggZWxlbV9zaXplICk7CisgICAgfQorCisgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgdGRzdF9zdGVwID0gdGRzdC0+c3RlcDsKKyAgICBtYXNrX3N0ZXAgPSBtYXNrID8gbWFzay0+c3RlcCA6IDA7CisgICAgQ1ZfQ0FMTCggY3ZTY2FsYXJUb1Jhd0RhdGEoIHNjYWxhciwgYnVmLCB0eXBlLCAxICkpOworCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5ICs9IGR5ICkKKyAgICB7CisgICAgICAgIHRzaXplLndpZHRoID0gc2l6ZS53aWR0aDsKKyAgICAgICAgdHNpemUuaGVpZ2h0ID0gZHk7CisgICAgICAgIGlmKCB5ICsgZHkgPiBzaXplLmhlaWdodCApCisgICAgICAgICAgICB0c2l6ZS5oZWlnaHQgPSBzaXplLmhlaWdodCAtIHk7CisgICAgICAgIGlmKCBjb250X2ZsYWcgfHwgdHNpemUuaGVpZ2h0ID09IDEgKQorICAgICAgICB7CisgICAgICAgICAgICB0c2l6ZS53aWR0aCAqPSB0c2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICB0c2l6ZS5oZWlnaHQgPSAxOworICAgICAgICAgICAgc3JjX3N0ZXAgPSB0ZHN0X3N0ZXAgPSBkc3Rfc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorICAgICAgICBJUFBJX0NBTEwoIGZuXzJkKCBzcmMtPmRhdGEucHRyICsgeSpzcmMtPnN0ZXAsIHNyY19zdGVwLCB0ZHN0LT5kYXRhLnB0ciwgdGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUodHNpemUud2lkdGgqZWxlbV9zaXplLCB0c2l6ZS5oZWlnaHQpLCBidWYsIGVsZW1fc2l6ZTEgKSk7CisgICAgICAgIGlmKCBtYXNrICkKKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBjb3B5bV9mdW5jKCB0ZHN0LT5kYXRhLnB0ciwgdGRzdF9zdGVwLCBkc3QtPmRhdGEucHRyICsgeSpkc3QtPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9zdGVwLCB0c2l6ZSwgbWFzay0+ZGF0YS5wdHIgKyB5Km1hc2stPnN0ZXAsIG1hc2tfc3RlcCApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkxvZ2ljKCBjb25zdCB2b2lkKiBzcmNhcnIxLCBjb25zdCB2b2lkKiBzcmNhcnIyLCB2b2lkKiBkc3RhcnIsCisgICAgICAgICAgY29uc3Qgdm9pZCogbWFza2FyciwgQ3ZGdW5jMkRfM0EgZm5fMmQgKQoreworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDE7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkxvZ2ljIiApOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGludCB5LCBkeTsKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBjb2kzID0gMDsKKyAgICBpbnQgdHlwZSwgZWxlbV9zaXplOworICAgIGludCBpc19uZCA9IDAsIGNvbnRfZmxhZyA9IDA7CisgICAgQ3ZNYXQgIHNyY3N0dWIxLCAqc3JjMSA9IChDdk1hdCopc3JjYXJyMTsKKyAgICBDdk1hdCAgc3Jjc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0ICBkc3RzdHViLCAgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIEN2TWF0ICBtYXNrc3R1YiwgKm1hc2sgPSAoQ3ZNYXQqKW1hc2thcnI7CisgICAgQ3ZNYXQgIGRzdGJ1ZiwgKnRkc3Q7CisgICAgaW50IHNyYzFfc3RlcCwgc3JjMl9zdGVwLCB0ZHN0X3N0ZXAsIGRzdF9zdGVwLCBtYXNrX3N0ZXA7CisgICAgQ3ZTaXplIHNpemUsIHRzaXplOworICAgIEN2Q29weU1hc2tGdW5jIGNvcHltX2Z1bmMgPSAwOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjMSkpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoc3JjMSkgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9DQUxMKCBzcmMxID0gY3ZHZXRNYXQoIHNyYzEsICZzcmNzdHViMSwgJmNvaTEgKSk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjMikpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoc3JjMikgKQorICAgICAgICAgICAgaXNfbmQgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzcmNzdHViMiwgJmNvaTIgKSk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChkc3QpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kzICkpOworICAgIH0KKworICAgIGlmKCBpc19uZCApCisgICAgeworICAgICAgICBDdkFyciogYXJyc1tdID0geyBzcmMxLCBzcmMyLCBkc3QgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1szXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBpZiggbWFza2FyciApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywKKyAgICAgICAgICAgICJUaGlzIG9wZXJhdGlvbiBvbiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMgZG9lcyBub3Qgc3VwcG9ydCBtYXNrIiApOworCisgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAzLCBhcnJzLCAwLCBzdHVicywgJml0ZXJhdG9yICkpOworCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworICAgICAgICBpdGVyYXRvci5zaXplLndpZHRoICo9IENWX0VMRU1fU0laRSh0eXBlKTsKKworICAgICAgICBkbworICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGZuXzJkKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzJdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zaXplICkpOworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICBFWElUOworICAgIH0KKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwIHx8IGNvaTMgIT0gMCApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfQmFkQ09JICk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgc3JjMiApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjMSwgc3JjMiApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYzEsIGRzdCApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisgICAgCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjMSApOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjMS0+dHlwZSApOworICAgIGVsZW1fc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKworICAgIGlmKCAhbWFzayApCisgICAgeworICAgICAgICBjb250X2ZsYWcgPSBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIHNyYzItPnR5cGUgJiBkc3QtPnR5cGUgKTsKKyAgICAgICAgZHkgPSBzaXplLmhlaWdodDsKKyAgICAgICAgdGRzdCA9IGRzdDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGJ1Zl9zaXplOworICAgICAgICAKKyAgICAgICAgaWYoICFDVl9JU19NQVQobWFzaykgKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWFzayA9IGN2R2V0TWF0KCBtYXNrLCAmbWFza3N0dWIgKSk7CisKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUihtYXNrKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLCAiIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYXNrLCBkc3QgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICBjb250X2ZsYWcgPSBDVl9JU19NQVRfQ09OVCggc3JjMS0+dHlwZSAmIHNyYzItPnR5cGUgJiBkc3QtPnR5cGUgJiBtYXNrLT50eXBlICk7CisgICAgICAgIGR5ID0gQ1ZfTUFYX0xPQ0FMX1NJWkUvKGVsZW1fc2l6ZSpzaXplLmhlaWdodCk7CisgICAgICAgIGR5ID0gTUFYKGR5LDEpOworICAgICAgICBkeSA9IE1JTihkeSxzaXplLmhlaWdodCk7CisgICAgICAgIGRzdGJ1ZiA9IGN2TWF0KCBkeSwgc2l6ZS53aWR0aCwgdHlwZSApOworICAgICAgICBpZiggIWNvbnRfZmxhZyApCisgICAgICAgICAgICBkc3RidWYuc3RlcCA9IGN2QWxpZ24oIGRzdGJ1Zi5zdGVwLCA4ICk7CisgICAgICAgIGJ1Zl9zaXplID0gZHN0YnVmLnN0ZXAgPyBkc3RidWYuc3RlcCpkeSA6IHNpemUud2lkdGgqZWxlbV9zaXplOworICAgICAgICBpZiggYnVmX3NpemUgPiBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgIGRzdGJ1Zi5kYXRhLnB0ciA9IGJ1ZmZlcjsKKyAgICAgICAgdGRzdCA9ICZkc3RidWY7CisgICAgICAgIAorICAgICAgICBjb3B5bV9mdW5jID0gaWN2R2V0Q29weU1hc2tGdW5jKCBlbGVtX3NpemUgKTsKKyAgICB9CisKKyAgICBzcmMxX3N0ZXAgPSBzcmMxLT5zdGVwOworICAgIHNyYzJfc3RlcCA9IHNyYzItPnN0ZXA7CisgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisgICAgdGRzdF9zdGVwID0gdGRzdC0+c3RlcDsKKyAgICBtYXNrX3N0ZXAgPSBtYXNrID8gbWFzay0+c3RlcCA6IDA7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkgKz0gZHkgKQorICAgIHsKKyAgICAgICAgdHNpemUud2lkdGggPSBzaXplLndpZHRoOworICAgICAgICB0c2l6ZS5oZWlnaHQgPSBkeTsKKyAgICAgICAgaWYoIHkgKyBkeSA+IHNpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIHRzaXplLmhlaWdodCA9IHNpemUuaGVpZ2h0IC0geTsKKyAgICAgICAgaWYoIGNvbnRfZmxhZyB8fCB0c2l6ZS5oZWlnaHQgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRzaXplLndpZHRoICo9IHRzaXplLmhlaWdodDsKKyAgICAgICAgICAgIHRzaXplLmhlaWdodCA9IDE7CisgICAgICAgICAgICBzcmMxX3N0ZXAgPSBzcmMyX3N0ZXAgPSB0ZHN0X3N0ZXAgPSBkc3Rfc3RlcCA9IG1hc2tfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorICAgICAgICBJUFBJX0NBTEwoIGZuXzJkKCBzcmMxLT5kYXRhLnB0ciArIHkqc3JjMS0+c3RlcCwgc3JjMV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLT5kYXRhLnB0ciArIHkqc3JjMi0+c3RlcCwgc3JjMl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZHN0LT5kYXRhLnB0ciwgdGRzdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUodHNpemUud2lkdGgqZWxlbV9zaXplLCB0c2l6ZS5oZWlnaHQpICkpOworICAgICAgICBpZiggbWFzayApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggY29weW1fZnVuYyggdGRzdC0+ZGF0YS5wdHIsIHRkc3Rfc3RlcCwgZHN0LT5kYXRhLnB0ciArIHkqZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfc3RlcCwgdHNpemUsIG1hc2stPmRhdGEucHRyICsgeSptYXNrLT5zdGVwLCBtYXNrX3N0ZXAgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCitJQ1ZfREVGX0JJTl9MT0dfT1BfMkQoIENWX1hPUiwgWG9yICkKK0lDVl9ERUZfVU5fTE9HX09QXzJEKCBDVl9YT1IsIFhvckMgKQorCitJQ1ZfREVGX0JJTl9MT0dfT1BfMkQoIENWX0FORCwgQW5kICkKK0lDVl9ERUZfVU5fTE9HX09QXzJEKCBDVl9BTkQsIEFuZEMgKQorCitJQ1ZfREVGX0JJTl9MT0dfT1BfMkQoIENWX09SLCBPciApCitJQ1ZfREVGX1VOX0xPR19PUF8yRCggQ1ZfT1IsIE9yQyApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWCBPIFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDVl9JTVBMIHZvaWQKK2N2WG9yUyggY29uc3Qgdm9pZCogc3JjLCBDdlNjYWxhciBzY2FsYXIsIHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgaWN2TG9naWNTKCBzcmMsICZzY2FsYXIsIGRzdCwgbWFzaywgKEN2RnVuYzJEXzJBMVAxSSlpY3ZYb3JDXzh1X0NuUiApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZYb3IoIGNvbnN0IHZvaWQqIHNyYzEsIGNvbnN0IHZvaWQqIHNyYzIsIHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgaWN2TG9naWMoIHNyYzEsIHNyYzIsIGRzdCwgbWFzaywgKEN2RnVuYzJEXzNBKWljdlhvcl84dV9DMVIgKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSBOIEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDVl9JTVBMIHZvaWQKK2N2QW5kUyggY29uc3Qgdm9pZCogc3JjLCBDdlNjYWxhciBzY2FsYXIsIHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgaWN2TG9naWNTKCBzcmMsICZzY2FsYXIsIGRzdCwgbWFzaywgKEN2RnVuYzJEXzJBMVAxSSlpY3ZBbmRDXzh1X0NuUiApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZBbmQoIGNvbnN0IHZvaWQqIHNyYzEsIGNvbnN0IHZvaWQqIHNyYzIsIHZvaWQqIGRzdCwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgaWN2TG9naWMoIHNyYzEsIHNyYzIsIGRzdCwgbWFzaywgKEN2RnVuYzJEXzNBKWljdkFuZF84dV9DMVIgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE8gUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0NWX0lNUEwgdm9pZAorY3ZPclMoIGNvbnN0IHZvaWQqIHNyYywgQ3ZTY2FsYXIgc2NhbGFyLCB2b2lkKiBkc3QsIGNvbnN0IHZvaWQqIG1hc2sgKQoreworICAgIGljdkxvZ2ljUyggc3JjLCAmc2NhbGFyLCBkc3QsIG1hc2ssIChDdkZ1bmMyRF8yQTFQMUkpaWN2T3JDXzh1X0NuUiApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZPciggY29uc3Qgdm9pZCogc3JjMSwgY29uc3Qgdm9pZCogc3JjMiwgdm9pZCogZHN0LCBjb25zdCB2b2lkKiBtYXNrICkKK3sKKyAgICBpY3ZMb2dpYyggc3JjMSwgc3JjMiwgZHN0LCBtYXNrLCAoQ3ZGdW5jMkRfM0EpaWN2T3JfOHVfQzFSICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOIE8gVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdk5vdF84dV9DMVIsCisoIGNvbnN0IHVjaGFyKiBzcmMxLCBpbnQgc3RlcDEsIHVjaGFyKiBkc3QsIGludCBzdGVwLCBDdlNpemUgc2l6ZSApLAorICAoc3JjMSwgc3RlcDEsIGRzdCwgc3RlcCwgc2l6ZSkgKQoreworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBkc3QgKz0gc3RlcCApCisgICAgeworICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgaWYoICgoKHNpemVfdClzcmMxIHwgKHNpemVfdClkc3QpICYgMykgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggOyBpIDw9IHNpemUud2lkdGggLSAxNjsgaSArPSAxNiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gfigoY29uc3QgaW50Kikoc3JjMStpKSlbMF07CisgICAgICAgICAgICAgICAgaW50IHQxID0gfigoY29uc3QgaW50Kikoc3JjMStpKSlbMV07CisKKyAgICAgICAgICAgICAgICAoKGludCopKGRzdCtpKSlbMF0gPSB0MDsKKyAgICAgICAgICAgICAgICAoKGludCopKGRzdCtpKSlbMV0gPSB0MTsKKworICAgICAgICAgICAgICAgIHQwID0gfigoY29uc3QgaW50Kikoc3JjMStpKSlbMl07CisgICAgICAgICAgICAgICAgdDEgPSB+KChjb25zdCBpbnQqKShzcmMxK2kpKVszXTsKKworICAgICAgICAgICAgICAgICgoaW50KikoZHN0K2kpKVsyXSA9IHQwOworICAgICAgICAgICAgICAgICgoaW50KikoZHN0K2kpKVszXSA9IHQxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IH4qKGNvbnN0IGludCopKHNyYzEraSk7CisgICAgICAgICAgICAgICAgKihpbnQqKShkc3QraSkgPSB0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IH4oKGNvbnN0IHVjaGFyKilzcmMxKVtpXTsKKyAgICAgICAgICAgIGRzdFtpXSA9ICh1Y2hhcil0OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICBDVl9PSzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Tm90KCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdk5vdCIgKTsKKyAgICAKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIAorICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgaW50IHR5cGUsIGlzX25kID0gMDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgc3JjX3N0ZXAsIGRzdF9zdGVwOworCisgICAgaWYoICFDVl9JU19NQVQoc3JjKSkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChzcmMpICkKKyAgICAgICAgICAgIGlzX25kID0gMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQoc3JjKSApCisgICAgICAgICAgICBpc19uZCA9IDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKyAgICB9CisKKyAgICBpZiggaXNfbmQgKQorICAgIHsKKyAgICAgICAgQ3ZBcnIqIGFycnNbXSA9IHsgc3JjLCBkc3QgfTsKKyAgICAgICAgQ3ZNYXRORCBzdHVic1syXTsKKyAgICAgICAgQ3ZOQXJyYXlJdGVyYXRvciBpdGVyYXRvcjsKKworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMiwgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciApKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKTsKKyAgICAgICAgaXRlcmF0b3Iuc2l6ZS53aWR0aCAqPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBpY3ZOb3RfOHVfQzFSKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUgKSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggc3JjICk7CisgICAgc3JjX3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgZHN0X3N0ZXAgPSBkc3QtPnN0ZXA7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYy0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc3JjX3N0ZXAgPSBkc3Rfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisgICAgc2l6ZS53aWR0aCAqPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICBJUFBJX0NBTEwoIGljdk5vdF84dV9DMVIoIHNyYy0+ZGF0YS5wdHIsIHNyY19zdGVwLCBkc3QtPmRhdGEucHRyLCBkc3Rfc3RlcCwgc2l6ZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeGx1dC5jcHAgYi9jeGNvcmUvc3JjL2N4bHV0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODlkOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeGx1dC5jcHAKQEAgLTAsMCArMSwzMjQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVVQgVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0xVVF9DQVNFX0MxKCB0eXBlICkgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aC00OyBpICs9IDQgKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdHlwZSB0MCA9IGx1dFtzcmNbaV1dOyAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIHQxID0gbHV0W3NyY1tpKzFdXTsgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2krMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gbHV0W3NyY1tpKzJdXTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBsdXRbc3JjW2krM11dOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSsyXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzNdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIHQwID0gbHV0W3NyY1tpXV07ICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBJQ1ZfTFVUX0NBU0VfQzIoIHR5cGUgKSAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkgKz0gMiApICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0eXBlIHQwID0gbHV0W3NyY1tpXSoyXTsgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDEgPSBsdXRbc3JjW2krMV0qMiArIDFdOyAgICAgIFwKKyAgICAgICAgZHN0W2ldID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIElDVl9MVVRfQ0FTRV9DMyggdHlwZSApICAgICAgICAgICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzICkgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDAgPSBsdXRbc3JjW2ldKjNdOyAgICAgICAgICAgIFwKKyAgICAgICAgdHlwZSB0MSA9IGx1dFtzcmNbaSsxXSozICsgMV07ICAgICAgXAorICAgICAgICB0eXBlIHQyID0gbHV0W3NyY1tpKzJdKjMgKyAyXTsgICAgICBcCisgICAgICAgIGRzdFtpXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2krMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSsyXSA9IHQyOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZGVmaW5lIElDVl9MVVRfQ0FTRV9DNCggdHlwZSApICAgICAgICAgICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSA0ICkgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHR5cGUgdDAgPSBsdXRbc3JjW2ldKjRdOyAgICAgICAgICAgIFwKKyAgICAgICAgdHlwZSB0MSA9IGx1dFtzcmNbaSsxXSo0ICsgMV07ICAgICAgXAorICAgICAgICBkc3RbaV0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSBsdXRbc3JjW2krMl0qNCArIDJdOyAgICAgICAgICAgXAorICAgICAgICB0MSA9IGx1dFtzcmNbaSszXSo0ICsgM107ICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzJdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2krM10gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lICBJQ1ZfREVGX0xVVF9GVU5DXzhVX0NOKCBmbGF2b3IsIGRzdHR5cGUsIGNuICkgICAgICBcCitDdlN0YXR1cyBDVl9TVERDQUxMIGljdkxVVF9UcmFuc2Zvcm04dV8jI2ZsYXZvciMjX0MjI2NuIyNSKCBcCisgICAgY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0dHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICAgICAgICAgICBcCisgICAgY29uc3QgZHN0dHlwZSogbHV0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9MVVRfQ0FTRV9DIyNjbiggZHN0dHlwZSApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9MVVRfRlVOQ184VV9DTiggOHUsIHVjaGFyLCAxICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFVfQ04oIDE2dSwgdXNob3J0LCAxICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFVfQ04oIDMycywgaW50LCAxICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFVfQ04oIDY0ZiwgZG91YmxlLCAxICkKKworSUNWX0RFRl9MVVRfRlVOQ184VV9DTiggOHUsIHVjaGFyLCAyICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFVfQ04oIDh1LCB1Y2hhciwgMyApCitJQ1ZfREVGX0xVVF9GVU5DXzhVX0NOKCA4dSwgdWNoYXIsIDQgKQorCisKKyNkZWZpbmUgIElDVl9ERUZfTFVUX0ZVTkNfOFUoIGZsYXZvciwgZHN0dHlwZSApICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkxVVF9UcmFuc2Zvcm04dV8jI2ZsYXZvciMjX0NuUiggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCB1Y2hhciogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3R0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBkc3R0eXBlKiBfbHV0LCBpbnQgY24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbWF4X2Jsb2NrX3NpemUgPSAoMSA8PCAxMCkqY247ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3R0eXBlIGx1dHBbMTAyNF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggc2l6ZS53aWR0aCpzaXplLmhlaWdodCA8IDI1NiApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYys9c3Jjc3RlcCwgZHN0Kz1kc3RzdGVwICkgIFwKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSBjbiApICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2kra10gPSBfbHV0W3NyY1tpK2tdKmNuK2tdOyAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiByZXBhY2sgdGhlIGx1dCB0byBwbGFuYXIgbGF5b3V0ICovICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGsgPSAwOyBrIDwgY247IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI1NjsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGx1dHBbaStrKjI1Nl0gPSBfbHV0W2kqY24ra107ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7ICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBqLCBsaW1pdCA9IE1JTihzaXplLndpZHRoLGkrbWF4X2Jsb2NrX3NpemUpO1wKKyAgICAgICAgICAgIGZvciggaz0wOyBrPGNuOyBrKyssIHNyYysrLCBkc3QrKyApICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBkc3R0eXBlKiBsdXQgPSBsdXRwICsgayoyNTY7ICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDw9IGxpbWl0IC0gY24qMjsgaiArPSBjbioyICkgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSB0MCA9IGx1dFtzcmNbal1dOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSB0MSA9IGx1dFtzcmNbaitjbl1dOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gdDA7IGRzdFtqK2NuXSA9IHQxOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIDsgaiA8IGxpbWl0OyBqICs9IGNuICkgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gbHV0W3NyY1tqXV07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNyYyAtPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdCAtPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgKz0gbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSUNWX0RFRl9MVVRfRlVOQ184VSggOHUsIHVjaGFyICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFUoIDE2dSwgdXNob3J0ICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFUoIDMycywgaW50ICkKK0lDVl9ERUZfTFVUX0ZVTkNfOFUoIDY0ZiwgZG91YmxlICkKKworI3VuZGVmICAgaWN2TFVUX1RyYW5zZm9ybTh1XzhzX0MxUgorI3VuZGVmICAgaWN2TFVUX1RyYW5zZm9ybTh1XzE2c19DMVIKKyN1bmRlZiAgIGljdkxVVF9UcmFuc2Zvcm04dV8zMmZfQzFSCisKKyNkZWZpbmUgIGljdkxVVF9UcmFuc2Zvcm04dV84c19DMVIgICAgaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0MxUgorI2RlZmluZSAgaWN2TFVUX1RyYW5zZm9ybTh1XzE2c19DMVIgICBpY3ZMVVRfVHJhbnNmb3JtOHVfMTZ1X0MxUgorI2RlZmluZSAgaWN2TFVUX1RyYW5zZm9ybTh1XzMyZl9DMVIgICBpY3ZMVVRfVHJhbnNmb3JtOHVfMzJzX0MxUgorCisjZGVmaW5lICBpY3ZMVVRfVHJhbnNmb3JtOHVfOHNfQ25SICAgIGljdkxVVF9UcmFuc2Zvcm04dV84dV9DblIKKyNkZWZpbmUgIGljdkxVVF9UcmFuc2Zvcm04dV8xNnNfQ25SICAgaWN2TFVUX1RyYW5zZm9ybTh1XzE2dV9DblIKKyNkZWZpbmUgIGljdkxVVF9UcmFuc2Zvcm04dV8zMmZfQ25SICAgaWN2TFVUX1RyYW5zZm9ybTh1XzMyc19DblIKKworQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIExVVF9UcmFuc2Zvcm04dSwgQzFSICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBMVVRfVHJhbnNmb3JtOHUsIENuUiApCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdkxVVF9UcmFuc2Zvcm1DbkZ1bmMpKAorICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwKKyAgICBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsIGNvbnN0IHZvaWQqIGx1dCwgaW50IGNuICk7CisKK0NWX0lNUEwgIHZvaWQKK2N2TFVUKCBjb25zdCB2b2lkKiBzcmNhcnIsIHZvaWQqIGRzdGFyciwgY29uc3Qgdm9pZCogbHV0YXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgbHV0X2MxX3RhYiwgbHV0X2NuX3RhYjsKKyAgICBzdGF0aWMgQ3ZMVVRfVHJhbnNmb3JtRnVuYyBsdXRfOHVfdGFiWzRdOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2TFVUIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50ICBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgaW50ICBkZXB0aCwgY24sIGx1dF9jbjsKKyAgICBDdk1hdCAgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0ICBkc3RzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZNYXQgIGx1dHN0dWIsICpsdXQgPSAoQ3ZNYXQqKWx1dGFycjsKKyAgICB1Y2hhciogbHV0X2RhdGE7CisgICAgdWNoYXIqIHNodWZmbGVkX2x1dCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdExVVF9UcmFuc2Zvcm04dUMxUlRhYmxlKCAmbHV0X2MxX3RhYiApOworICAgICAgICBpY3ZJbml0TFVUX1RyYW5zZm9ybTh1Q25SVGFibGUoICZsdXRfY25fdGFiICk7CisgICAgICAgIGx1dF84dV90YWJbMF0gPSAoQ3ZMVVRfVHJhbnNmb3JtRnVuYylpY3ZMVVRfVHJhbnNmb3JtOHVfOHVfQzFSOworICAgICAgICBsdXRfOHVfdGFiWzFdID0gKEN2TFVUX1RyYW5zZm9ybUZ1bmMpaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0MyUjsKKyAgICAgICAgbHV0Xzh1X3RhYlsyXSA9IChDdkxVVF9UcmFuc2Zvcm1GdW5jKWljdkxVVF9UcmFuc2Zvcm04dV84dV9DM1I7CisgICAgICAgIGx1dF84dV90YWJbM10gPSAoQ3ZMVVRfVHJhbnNmb3JtRnVuYylpY3ZMVVRfVHJhbnNmb3JtOHVfOHVfQzRSOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChzcmMpICkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kxICkpOworCisgICAgaWYoICFDVl9JU19NQVQoZHN0KSApCisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGx1dCkgKQorICAgICAgICBDVl9DQUxMKCBsdXQgPSBjdkdldE1hdCggbHV0LCAmbHV0c3R1YiApKTsKKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9DTlNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSCggc3JjLT50eXBlICkgPiBDVl84UyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKCBkc3QtPnR5cGUgKTsKKyAgICBjbiA9IENWX01BVF9DTiggZHN0LT50eXBlICk7CisgICAgbHV0X2NuID0gQ1ZfTUFUX0NOKCBsdXQtPnR5cGUgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQobHV0LT50eXBlKSB8fCAobHV0X2NuICE9IDEgJiYgbHV0X2NuICE9IGNuKSB8fAorICAgICAgICAhQ1ZfQVJFX0RFUFRIU19FUSggZHN0LCBsdXQgKSB8fCBsdXQtPndpZHRoKmx1dC0+aGVpZ2h0ICE9IDI1NiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgTFVUIG11c3QgYmUgY29udGludW91cyBhcnJheSBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggMjU2IGVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgYXMgZGVzdGluYXRpb24iICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICBpZiggbHV0X2NuID09IDEgKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBjbjsKKyAgICAgICAgY24gPSAxOworICAgIH0KKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgbHV0X2RhdGEgPSBsdXQtPmRhdGEucHRyOworCisgICAgaWYoIENWX01BVF9ERVBUSCggc3JjLT50eXBlICkgPT0gQ1ZfOFMgKQorICAgIHsKKyAgICAgICAgaW50IGhhbGZfc2l6ZSA9IENWX0VMRU1fU0laRTEoZGVwdGgpKmNuKjEyODsKKyAgICAgICAgc2h1ZmZsZWRfbHV0ID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoaGFsZl9zaXplKjIpOworCisgICAgICAgIC8vIHNodWZmbGUgbHV0CisgICAgICAgIG1lbWNweSggc2h1ZmZsZWRfbHV0LCBsdXRfZGF0YSArIGhhbGZfc2l6ZSwgaGFsZl9zaXplICk7CisgICAgICAgIG1lbWNweSggc2h1ZmZsZWRfbHV0ICsgaGFsZl9zaXplLCBsdXRfZGF0YSwgaGFsZl9zaXplICk7CisKKyAgICAgICAgbHV0X2RhdGEgPSBzaHVmZmxlZF9sdXQ7CisgICAgfQorCisgICAgaWYoIGx1dF9jbiA9PSAxIHx8IChsdXRfY24gPD0gNCAmJiBkZXB0aCA9PSBDVl84VSkgKQorICAgIHsKKyAgICAgICAgQ3ZMVVRfVHJhbnNmb3JtRnVuYyBmdW5jID0gZGVwdGggPT0gQ1ZfOFUgPyBsdXRfOHVfdGFiW2NuLTFdIDoKKyAgICAgICAgICAgIChDdkxVVF9UcmFuc2Zvcm1GdW5jKShsdXRfYzFfdGFiLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIHNpemUsIGx1dF9kYXRhICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkxVVF9UcmFuc2Zvcm1DbkZ1bmMgZnVuYyA9CisgICAgICAgICAgICAoQ3ZMVVRfVHJhbnNmb3JtQ25GdW5jKShsdXRfY25fdGFiLmZuXzJkW2RlcHRoXSk7CisgICAgCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5zdGVwLCBzaXplLCBsdXRfZGF0YSwgY24gKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4bWF0aGZ1bmNzLmNwcCBiL2N4Y29yZS9zcmMvY3htYXRoZnVuY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYWM0N2IKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4bWF0aGZ1bmNzLmNwcApAQCAtMCwwICsxLDE5OTggQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisjaWZkZWYgSEFWRV9DT05GSUdfSAorI2luY2x1ZGUgPGN2Y29uZmlnLmg+CisjZW5kaWYKKworI2RlZmluZSBJQ1ZfTUFUSF9CTE9DS19TSVpFICAyNTYKKworI2RlZmluZSBfQ1ZfU1FSVF9NQUdJQyAgICAgMHhiZTZmMDAwMAorCisjZGVmaW5lIF9DVl9TUVJUX01BR0lDX0RCTCBDVl9CSUdfVUlOVCgweGJmY2Q0NjAwMDAwMDAwMDApCisKKyNkZWZpbmUgX0NWX0FUQU5fQ0YwICAoLTE1LjgxMzE4OTA3OTZmKQorI2RlZmluZSBfQ1ZfQVRBTl9DRjEgICg2MS4wOTQxOTQ1NTk2ZikKKyNkZWZpbmUgX0NWX0FUQU5fQ0YyICAwLmYgLyooLTAuMTQwNTAwNDA2MzIyZikqLworCitzdGF0aWMgY29uc3QgZmxvYXQgaWN2QXRhblRhYls4XSA9IHsgMC5mICsgX0NWX0FUQU5fQ0YyLCA5MC5mIC0gX0NWX0FUQU5fQ0YyLAorICAgIDE4MC5mIC0gX0NWX0FUQU5fQ0YyLCA5MC5mICsgX0NWX0FUQU5fQ0YyLAorICAgIDM2MC5mIC0gX0NWX0FUQU5fQ0YyLCAyNzAuZiArIF9DVl9BVEFOX0NGMiwKKyAgICAxODAuZiArIF9DVl9BVEFOX0NGMiwgMjcwLmYgLSBfQ1ZfQVRBTl9DRjIKK307CisKK3N0YXRpYyBjb25zdCBpbnQgaWN2QXRhblNpZ25bOF0gPQorICAgIHsgMCwgMHg4MDAwMDAwMCwgMHg4MDAwMDAwMCwgMCwgMHg4MDAwMDAwMCwgMCwgMCwgMHg4MDAwMDAwMCB9OworCitDVl9JTVBMIGZsb2F0CitjdkZhc3RBcmN0YW4oIGZsb2F0IHksIGZsb2F0IHggKQoreworICAgIEN2MzJzdWYgX3gsIF95OworICAgIGludCBpeCwgaXksIHlneCwgaWR4OworICAgIGRvdWJsZSB6OworCisgICAgX3guZiA9IHg7IF95LmYgPSB5OworICAgIGl4ID0gX3guaTsgaXkgPSBfeS5pOworICAgIGlkeCA9IChpeCA8IDApICogMiArIChpeSA8IDApICogNDsKKworICAgIGl4ICY9IDB4N2ZmZmZmZmY7CisgICAgaXkgJj0gMHg3ZmZmZmZmZjsKKworICAgIHlneCA9IChpeSA8PSBpeCkgLSAxOworICAgIGlkeCAtPSB5Z3g7CisKKyAgICBpZHggJj0gKChpeCA9PSAwKSAtIDEpIHwgKChpeSA9PSAwKSAtIDEpOworCisgICAgLyogc3dhcCBpeCBhbmQgaXkgaWYgaXggPCBpeSAqLworICAgIGl4IF49IGl5ICYgeWd4OworICAgIGl5IF49IGl4ICYgeWd4OworICAgIGl4IF49IGl5ICYgeWd4OworCisgICAgX3kuaSA9IGl5IF4gaWN2QXRhblNpZ25baWR4XTsKKworICAgIC8qIGl4ID0gaXggIT0gMCA/IGl4IDogMS5mICovCisgICAgX3guaSA9ICgoaXggXiBDVl8xRikgJiAoKGl4ID09IDApIC0gMSkpIF4gQ1ZfMUY7CisgICAgCisgICAgeiA9IF95LmYgLyBfeC5mOworICAgIHJldHVybiAoZmxvYXQpKChfQ1ZfQVRBTl9DRjAqZmFicyh6KSArIF9DVl9BVEFOX0NGMSkqeiArIGljdkF0YW5UYWJbaWR4XSk7Cit9CisKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2RmFzdEFyY3Rhbl8zMmYsCisgICAgKGNvbnN0IGZsb2F0ICpfX3ksIGNvbnN0IGZsb2F0ICpfX3gsIGZsb2F0ICphbmdsZSwgaW50IGxlbiApLCAoX195LCBfX3gsIGFuZ2xlLCBsZW4pICkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgY29uc3QgaW50ICp5ID0gKGNvbnN0IGludCopX195LCAqeCA9IChjb25zdCBpbnQqKV9feDsKKworICAgIGlmKCAhKHkgJiYgeCAmJiBhbmdsZSAmJiBsZW4gPj0gMCkgKQorICAgICAgICByZXR1cm4gQ1ZfQkFERkFDVE9SX0VSUjsKKworICAgIC8qIHVucm9sbGVkIGJ5IDQgbG9vcCAqLworICAgIGZvciggOyBpIDw9IGxlbiAtIDQ7IGkgKz0gNCApCisgICAgeworICAgICAgICBpbnQgaiwgaWR4WzRdOworICAgICAgICBmbG9hdCB4Zls0XSwgeWZbNF07CisgICAgICAgIGRvdWJsZSBkID0gMS47CisKKyAgICAgICAgLyogY2FsYyBudW1lcmF0b3JzIGFuZCBkZW5vbWluYXRvcnMgKi8KKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IDQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpeCA9IHhbaSArIGpdLCBpeSA9IHlbaSArIGpdOworICAgICAgICAgICAgaW50IHlneCwgayA9IChpeCA8IDApICogMiArIChpeSA8IDApICogNDsKKyAgICAgICAgICAgIEN2MzJzdWYgX3gsIF95OworCisgICAgICAgICAgICBpeCAmPSAweDdmZmZmZmZmOworICAgICAgICAgICAgaXkgJj0gMHg3ZmZmZmZmZjsKKworICAgICAgICAgICAgeWd4ID0gKGl5IDw9IGl4KSAtIDE7CisgICAgICAgICAgICBrIC09IHlneDsKKworICAgICAgICAgICAgayAmPSAoKGl4ID09IDApIC0gMSkgfCAoKGl5ID09IDApIC0gMSk7CisKKyAgICAgICAgICAgIC8qIHN3YXAgaXggYW5kIGl5IGlmIGl4IDwgaXkgKi8KKyAgICAgICAgICAgIGl4IF49IGl5ICYgeWd4OworICAgICAgICAgICAgaXkgXj0gaXggJiB5Z3g7CisgICAgICAgICAgICBpeCBePSBpeSAmIHlneDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgX3kuaSA9IGl5IF4gaWN2QXRhblNpZ25ba107CisKKyAgICAgICAgICAgIC8qIGl4ID0gaXggIT0gMCA/IGl4IDogMS5mICovCisgICAgICAgICAgICBfeC5pID0gKChpeCBeIENWXzFGKSAmICgoaXggPT0gMCkgLSAxKSkgXiBDVl8xRjsKKyAgICAgICAgICAgIGlkeFtqXSA9IGs7CisgICAgICAgICAgICB5ZltqXSA9IF95LmY7CisgICAgICAgICAgICBkICo9ICh4ZltqXSA9IF94LmYpOworICAgICAgICB9CisKKyAgICAgICAgZCA9IDEuIC8gZDsKKworICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYiA9IHhmWzJdICogeGZbM10sIGEgPSB4ZlswXSAqIHhmWzFdOworCisgICAgICAgICAgICBmbG9hdCB6MCA9IChmbG9hdCkgKHlmWzBdICogeGZbMV0gKiBiICogZCk7CisgICAgICAgICAgICBmbG9hdCB6MSA9IChmbG9hdCkgKHlmWzFdICogeGZbMF0gKiBiICogZCk7CisgICAgICAgICAgICBmbG9hdCB6MiA9IChmbG9hdCkgKHlmWzJdICogeGZbM10gKiBhICogZCk7CisgICAgICAgICAgICBmbG9hdCB6MyA9IChmbG9hdCkgKHlmWzNdICogeGZbMl0gKiBhICogZCk7CisKKyAgICAgICAgICAgIHowID0gKGZsb2F0KSgoX0NWX0FUQU5fQ0YwKmZhYnMoejApICsgX0NWX0FUQU5fQ0YxKSp6MCArIGljdkF0YW5UYWJbaWR4WzBdXSk7CisgICAgICAgICAgICB6MSA9IChmbG9hdCkoKF9DVl9BVEFOX0NGMCpmYWJzKHoxKSArIF9DVl9BVEFOX0NGMSkqejEgKyBpY3ZBdGFuVGFiW2lkeFsxXV0pOworICAgICAgICAgICAgejIgPSAoZmxvYXQpKChfQ1ZfQVRBTl9DRjAqZmFicyh6MikgKyBfQ1ZfQVRBTl9DRjEpKnoyICsgaWN2QXRhblRhYltpZHhbMl1dKTsKKyAgICAgICAgICAgIHozID0gKGZsb2F0KSgoX0NWX0FUQU5fQ0YwKmZhYnMoejMpICsgX0NWX0FUQU5fQ0YxKSp6MyArIGljdkF0YW5UYWJbaWR4WzNdXSk7CisKKyAgICAgICAgICAgIGFuZ2xlW2ldID0gejA7CisgICAgICAgICAgICBhbmdsZVtpKzFdID0gejE7CisgICAgICAgICAgICBhbmdsZVtpKzJdID0gejI7CisgICAgICAgICAgICBhbmdsZVtpKzNdID0gejM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBwcm9jZXNzIHRoZSByZXN0ICovCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGFuZ2xlW2ldID0gY3ZGYXN0QXJjdGFuKCBfX3lbaV0sIF9feFtpXSApOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICpcCisgICBGYXN0IGN1YmUgcm9vdCBieSBLZW4gVHVya293c2tpCisgICAoaHR0cDovL3d3dy53b3JsZHNlcnZlci5jb20vdHVyay9jb21wdXRlcmdyYXBoaWNzL3BhcGVycy5odG1sKQorXCogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK0NWX0lNUEwgIGZsb2F0ICBjdkNicnQoIGZsb2F0IHZhbHVlICkKK3sKKyAgICBmbG9hdCBmcjsKKyAgICBDdjMyc3VmIHYsIG07CisgICAgaW50IGl4LCBzOworICAgIGludCBleCwgc2h4OworCisgICAgdi5mID0gdmFsdWU7CisgICAgaXggPSB2LmkgJiAweDdmZmZmZmZmOworICAgIHMgPSB2LmkgJiAweDgwMDAwMDAwOworICAgIGV4ID0gKGl4ID4+IDIzKSAtIDEyNzsKKyAgICBzaHggPSBleCAlIDM7CisgICAgc2h4IC09IHNoeCA+PSAwID8gMyA6IDA7CisgICAgZXggPSAoZXggLSBzaHgpIC8gMzsgLyogZXhwb25lbnQgb2YgY3ViZSByb290ICovCisgICAgdi5pID0gKGl4ICYgKCgxPDwyMyktMSkpIHwgKChzaHggKyAxMjcpPDwyMyk7CisgICAgZnIgPSB2LmY7CisKKyAgICAvKiAwLjEyNSA8PSBmciA8IDEuMCAqLworICAgIC8qIFVzZSBxdWFydGljIHJhdGlvbmFsIHBvbHlub21pYWwgd2l0aCBlcnJvciA8IDJeKC0yNCkgKi8KKyAgICBmciA9IChmbG9hdCkoKCgoKDQ1LjI1NDgzMzk3NTY4MDMwMjI1MTE5ODc0OTQgKiBmciArCisgICAgMTkyLjI3OTgzNjgzNTUwNjEwNTA0NTgxMzQ2MjUpICogZnIgKworICAgIDExOS4xNjU0ODI0Mjg1NTgxNjI4OTU2OTE0MTQzKSAqIGZyICsKKyAgICAxMy40MzI1MDEzOTA4NjIzOTg3MjE3MjgzNzMxNCkgKiBmciArCisgICAgMC4xNjM2MTYxMjI2NTg1NzU0MjQwOTU4MzU1MDYzKS8KKyAgICAoKCgoMTQuODA4ODQwOTMyMTkxMzQ1NzM3ODY0ODA4NDUgKiBmciArCisgICAgMTUxLjk3MTQwNTEwNDQ0MzU2NDg2NTg1NTc2NjgpICogZnIgKworICAgIDE2OC41MjU0NDE0MTAxNTY4MjgzOTU3NjY4MzQzKSAqIGZyICsKKyAgICAzMy45OTA1OTQxMzUwMjE1NTk4NzU0MTkxODcyKSAqIGZyICsKKyAgICAxLjApKTsKKworICAgIC8qIGZyICo9IDJeZXggKiBzaWduICovCisgICAgbS5mID0gdmFsdWU7CisgICAgdi5mID0gZnI7CisgICAgdi5pID0gKHYuaSArIChleCA8PCAyMykgKyBzKSAmIChtLmkqMiAhPSAwID8gLTEgOiAwKTsKKyAgICByZXR1cm4gdi5mOworfQorCisvL3N0YXRpYyBjb25zdCBkb3VibGUgXzBfNSA9IDAuNSwgXzFfNSA9IDEuNTsKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2SW52U3FydF8zMmYsIChjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCAqZHN0LCBpbnQgbGVuKSwgKHNyYywgZHN0LCBsZW4pICkKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiggIShzcmMgJiYgZHN0ICYmIGxlbiA+PSAwKSApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IChmbG9hdCkoMS5mL3NxcnQoc3JjW2ldKSk7CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2U3FydF8zMmYsIChjb25zdCBmbG9hdCAqc3JjLCBmbG9hdCAqZHN0LCBpbnQgbGVuKSwgKHNyYywgZHN0LCBsZW4pICkKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiggIShzcmMgJiYgZHN0ICYmIGxlbiA+PSAwKSApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IChmbG9hdClzcXJ0KHNyY1tpXSk7CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2U3FydF82NGYsIChjb25zdCBkb3VibGUgKnNyYywgZG91YmxlICpkc3QsIGludCBsZW4pLCAoc3JjLCBkc3QsIGxlbikgKQoreworICAgIGludCBpID0gMDsKKworICAgIGlmKCAhKHNyYyAmJiBkc3QgJiYgbGVuID49IDApICkKKyAgICAgICAgcmV0dXJuIENWX0JBREZBQ1RPUl9FUlI7CisKKyAgICBmb3IoIDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgZHN0W2ldID0gc3FydChzcmNbaV0pOworCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkludlNxcnRfNjRmLCAoY29uc3QgZG91YmxlICpzcmMsIGRvdWJsZSAqZHN0LCBpbnQgbGVuKSwgKHNyYywgZHN0LCBsZW4pICkKK3sKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiggIShzcmMgJiYgZHN0ICYmIGxlbiA+PSAwKSApCisgICAgICAgIHJldHVybiBDVl9CQURGQUNUT1JfRVJSOworCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApCisgICAgICAgIGRzdFtpXSA9IDEuL3NxcnQoc3JjW2ldKTsKKworICAgIHJldHVybiBDVl9PSzsKK30KKworCisjZGVmaW5lIElDVl9ERUZfU1FSX01BR05JVFVERV9GVU5DKGZsYXZvciwgYXJydHlwZSwgbWFndHlwZSlcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZTcXJNYWduaXR1ZGVfIyNmbGF2b3IoY29uc3QgYXJydHlwZSogeCwgY29uc3QgYXJydHlwZSogeSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgbWFndHlwZSogbWFnLCBpbnQgbGVuKSAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8PSBsZW4gLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ3R5cGUgeDAgPSAobWFndHlwZSl4W2ldLCB5MCA9IChtYWd0eXBlKXlbaV07ICAgICBcCisgICAgICAgIG1hZ3R5cGUgeDEgPSAobWFndHlwZSl4W2krMV0sIHkxID0gKG1hZ3R5cGUpeVtpKzFdOyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHgwID0geDAqeDAgKyB5MCp5MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHgxID0geDEqeDEgKyB5MSp5MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ1tpXSA9IHgwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ1tpKzFdID0geDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHgwID0gKG1hZ3R5cGUpeFtpKzJdLCB5MCA9IChtYWd0eXBlKXlbaSsyXTsgICAgICAgICBcCisgICAgICAgIHgxID0gKG1hZ3R5cGUpeFtpKzNdLCB5MSA9IChtYWd0eXBlKXlbaSszXTsgICAgICAgICBcCisgICAgICAgIHgwID0geDAqeDAgKyB5MCp5MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHgxID0geDEqeDEgKyB5MSp5MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ1tpKzJdID0geDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ1tpKzNdID0geDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IGkgPCBsZW47IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG1hZ3R5cGUgeDAgPSAobWFndHlwZSl4W2ldLCB5MCA9IChtYWd0eXBlKXlbaV07ICAgICBcCisgICAgICAgIG1hZ1tpXSA9IHgwKngwICsgeTAqeTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9TUVJfTUFHTklUVURFX0ZVTkMoIDMyZiwgZmxvYXQsIGZsb2F0ICkKK0lDVl9ERUZfU1FSX01BR05JVFVERV9GVU5DKCA2NGYsIGRvdWJsZSwgZG91YmxlICkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcnRlemlhbiAtPiBQb2xhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2Q2FydFRvUG9sYXIoIGNvbnN0IEN2QXJyKiB4YXJyLCBjb25zdCBDdkFyciogeWFyciwKKyAgICAgICAgICAgICAgIEN2QXJyKiBtYWdhcnIsIEN2QXJyKiBhbmdsZWFyciwKKyAgICAgICAgICAgICAgIGludCBhbmdsZV9pbl9kZWdyZWVzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2FydFRvUG9sYXIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBmbG9hdCogbWFnX2J1ZmZlciA9IDA7CisgICAgZmxvYXQqIHhfYnVmZmVyID0gMDsKKyAgICBmbG9hdCogeV9idWZmZXIgPSAwOworICAgIGludCBibG9ja19zaXplID0gMDsKKyAgICBDdk1hdCB4c3R1YiwgKnhtYXQgPSAoQ3ZNYXQqKXhhcnI7CisgICAgQ3ZNYXQgeXN0dWIsICp5bWF0ID0gKEN2TWF0Kil5YXJyOworICAgIEN2TWF0IG1hZ3N0dWIsICptYWcgPSAoQ3ZNYXQqKW1hZ2FycjsKKyAgICBDdk1hdCBhbmdsZXN0dWIsICphbmdsZSA9IChDdk1hdCopYW5nbGVhcnI7CisgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMCwgY29pMyA9IDAsIGNvaTQgPSAwOworICAgIGludCBkZXB0aDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY29udF9mbGFnID0gQ1ZfTUFUX0NPTlRfRkxBRzsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVCh4bWF0KSkKKyAgICAgICAgQ1ZfQ0FMTCggeG1hdCA9IGN2R2V0TWF0KCB4bWF0LCAmeHN0dWIsICZjb2kxICkpOworCisgICAgaWYoICFDVl9JU19NQVQoeW1hdCkpCisgICAgICAgIENWX0NBTEwoIHltYXQgPSBjdkdldE1hdCggeW1hdCwgJnlzdHViLCAmY29pMiApKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCB4bWF0LCB5bWF0ICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCB4bWF0LCB5bWF0ICkgKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICBkZXB0aCA9IENWX01BVF9ERVBUSCggeG1hdC0+dHlwZSApOworICAgIGlmKCBkZXB0aCA8IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCBtYWcgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggbWFnID0gY3ZHZXRNYXQoIG1hZywgJm1hZ3N0dWIsICZjb2kzICkpOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBtYWcsIHhtYXQgKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBtYWcsIHhtYXQgKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisgICAgICAgIGNvbnRfZmxhZyA9IG1hZy0+dHlwZTsKKyAgICB9CisKKyAgICBpZiggYW5nbGUgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYW5nbGUgPSBjdkdldE1hdCggYW5nbGUsICZhbmdsZXN0dWIsICZjb2k0ICkpOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBhbmdsZSwgeG1hdCApICkKKyAgICAgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cyApOworICAgICAgICAKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIGFuZ2xlLCB4bWF0ICkgKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworICAgICAgICBjb250X2ZsYWcgJj0gYW5nbGUtPnR5cGU7CisgICAgfQorCisgICAgaWYoIGNvaTEgIT0gMCB8fCBjb2kyICE9IDAgfHwgY29pMyAhPSAwIHx8IGNvaTQgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKHhtYXQpOworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKHhtYXQtPnR5cGUpOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCB4bWF0LT50eXBlICYgeW1hdC0+dHlwZSAmIGNvbnRfZmxhZyApKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIGJsb2NrX3NpemUgPSBNSU4oIHNpemUud2lkdGgsIElDVl9NQVRIX0JMT0NLX1NJWkUgKTsKKyAgICBpZiggZGVwdGggPT0gQ1ZfNjRGICYmIGFuZ2xlICkKKyAgICB7CisgICAgICAgIHhfYnVmZmVyID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIHlfYnVmZmVyID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgfQorICAgIGVsc2UgaWYoIGRlcHRoID09IENWXzMyRiAmJiBtYWcgKQorICAgIHsKKyAgICAgICAgbWFnX2J1ZmZlciA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBibG9ja19zaXplKnNpemVvZihmbG9hdCkpOworICAgIH0KKworICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgIHsKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogeF9kYXRhID0gKGZsb2F0KikoeG1hdC0+ZGF0YS5wdHIgKyB4bWF0LT5zdGVwKnkpOworICAgICAgICAgICAgZmxvYXQqIHlfZGF0YSA9IChmbG9hdCopKHltYXQtPmRhdGEucHRyICsgeW1hdC0+c3RlcCp5KTsKKyAgICAgICAgICAgIGZsb2F0KiBtYWdfZGF0YSA9IG1hZyA/IChmbG9hdCopKG1hZy0+ZGF0YS5wdHIgKyBtYWctPnN0ZXAqeSkgOiAwOworICAgICAgICAgICAgZmxvYXQqIGFuZ2xlX2RhdGEgPSBhbmdsZSA/IChmbG9hdCopKGFuZ2xlLT5kYXRhLnB0ciArIGFuZ2xlLT5zdGVwKnkpIDogMDsKKworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHggKz0gYmxvY2tfc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IE1JTiggc2l6ZS53aWR0aCAtIHgsIGJsb2NrX3NpemUgKTsKKworICAgICAgICAgICAgICAgIGlmKCBtYWcgKQorICAgICAgICAgICAgICAgICAgICBpY3ZTcXJNYWduaXR1ZGVfMzJmKCB4X2RhdGEgKyB4LCB5X2RhdGEgKyB4LCBtYWdfYnVmZmVyLCBsZW4gKTsKKworICAgICAgICAgICAgICAgIGlmKCBhbmdsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZGYXN0QXJjdGFuXzMyZiggeV9kYXRhICsgeCwgeF9kYXRhICsgeCwgYW5nbGVfZGF0YSArIHgsIGxlbiApOworICAgICAgICAgICAgICAgICAgICBpZiggIWFuZ2xlX2luX2RlZ3JlZXMgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWN2U2NhbGVfMzJmKCBhbmdsZV9kYXRhICsgeCwgYW5nbGVfZGF0YSArIHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiwgKGZsb2F0KShDVl9QSS8xODAuKSwgMCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBtYWcgKQorICAgICAgICAgICAgICAgICAgICBpY3ZTcXJ0XzMyZiggbWFnX2J1ZmZlciwgbWFnX2RhdGEgKyB4LCBsZW4gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIHkgPSAwOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSogeF9kYXRhID0gKGRvdWJsZSopKHhtYXQtPmRhdGEucHRyICsgeG1hdC0+c3RlcCp5KTsKKyAgICAgICAgICAgIGRvdWJsZSogeV9kYXRhID0gKGRvdWJsZSopKHltYXQtPmRhdGEucHRyICsgeW1hdC0+c3RlcCp5KTsKKyAgICAgICAgICAgIGRvdWJsZSogbWFnX2RhdGEgPSBtYWcgPyAoZG91YmxlKikobWFnLT5kYXRhLnB0ciArIG1hZy0+c3RlcCp5KSA6IDA7CisgICAgICAgICAgICBkb3VibGUqIGFuZ2xlX2RhdGEgPSBhbmdsZSA/IChkb3VibGUqKShhbmdsZS0+ZGF0YS5wdHIgKyBhbmdsZS0+c3RlcCp5KSA6IDA7CisKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4ICs9IGJsb2NrX3NpemUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBNSU4oIHNpemUud2lkdGggLSB4LCBibG9ja19zaXplICk7CisKKyAgICAgICAgICAgICAgICBpZiggYW5nbGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0XzY0ZjMyZiggeF9kYXRhICsgeCwgeF9idWZmZXIsIGxlbiApOworICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfNjRmMzJmKCB5X2RhdGEgKyB4LCB5X2J1ZmZlciwgbGVuICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIG1hZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZTcXJNYWduaXR1ZGVfNjRmKCB4X2RhdGEgKyB4LCB5X2RhdGEgKyB4LCBtYWdfZGF0YSArIHgsIGxlbiApOworICAgICAgICAgICAgICAgICAgICBpY3ZTcXJ0XzY0ZiggbWFnX2RhdGEgKyB4LCBtYWdfZGF0YSArIHgsIGxlbiApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBhbmdsZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpY3ZGYXN0QXJjdGFuXzMyZiggeV9idWZmZXIsIHhfYnVmZmVyLCB4X2J1ZmZlciwgbGVuICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhYW5nbGVfaW5fZGVncmVlcyApCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZTY2FsZV8zMmYoIHhfYnVmZmVyLCB4X2J1ZmZlciwgbGVuLCAoZmxvYXQpKENWX1BJLzE4MC4pLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGljdkN2dF8zMmY2NGYoIHhfYnVmZmVyLCBhbmdsZV9kYXRhICsgeCwgbGVuICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9sYXIgLT4gQ2FydGV6aWFuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZTaW5Db3NfMzJmKCBjb25zdCBmbG9hdCAqYW5nbGUsZmxvYXQgKnNpbnZhbCwgZmxvYXQqIGNvc3ZhbCwKKyAgICAgICAgICAgICAgICBpbnQgbGVuLCBpbnQgYW5nbGVfaW5fZGVncmVlcyApCit7CisgICAgY29uc3QgaW50IE4gPSA2NDsKKworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2luX3RhYmxlW10gPQorICAgIHsgCisgICAgIDAuMDAwMDAwMDAwMDAwMDAwMDAwMDAsICAgICAwLjA5ODAxNzE0MDMyOTU2MDYwNDAwLAorICAgICAwLjE5NTA5MDMyMjAxNjEyODI1MDAwLCAgICAgMC4yOTAyODQ2NzcyNTQ0NjIzMzAwMCwKKyAgICAgMC4zODI2ODM0MzIzNjUwODk3ODAwMCwgICAgIDAuNDcxMzk2NzM2ODI1OTk3NjQwMDAsCisgICAgIDAuNTU1NTcwMjMzMDE5NjAyMTgwMDAsICAgICAwLjYzNDM5MzI4NDE2MzY0NTQ5MDAwLAorICAgICAwLjcwNzEwNjc4MTE4NjU0NzQ2MDAwLCAgICAgMC43NzMwMTA0NTMzNjI3MzY5OTAwMCwKKyAgICAgMC44MzE0Njk2MTIzMDI1NDUyNDAwMCwgICAgIDAuODgxOTIxMjY0MzQ4MzU0OTQwMDAsCisgICAgIDAuOTIzODc5NTMyNTExMjg2NzQwMDAsICAgICAwLjk1Njk0MDMzNTczMjIwODk0MDAwLAorICAgICAwLjk4MDc4NTI4MDQwMzIzMDQzMDAwLCAgICAgMC45OTUxODQ3MjY2NzIxOTY4MjAwMCwKKyAgICAgMS4wMDAwMDAwMDAwMDAwMDAwMDAwMCwgICAgIDAuOTk1MTg0NzI2NjcyMTk2OTMwMDAsCisgICAgIDAuOTgwNzg1MjgwNDAzMjMwNDMwMDAsICAgICAwLjk1Njk0MDMzNTczMjIwODk0MDAwLAorICAgICAwLjkyMzg3OTUzMjUxMTI4Njc0MDAwLCAgICAgMC44ODE5MjEyNjQzNDgzNTUwNTAwMCwKKyAgICAgMC44MzE0Njk2MTIzMDI1NDU0NjAwMCwgICAgIDAuNzczMDEwNDUzMzYyNzM3MTAwMDAsCisgICAgIDAuNzA3MTA2NzgxMTg2NTQ3NTcwMDAsICAgICAwLjYzNDM5MzI4NDE2MzY0NTQ5MDAwLAorICAgICAwLjU1NTU3MDIzMzAxOTYwMjE4MDAwLCAgICAgMC40NzEzOTY3MzY4MjU5OTc4NjAwMCwKKyAgICAgMC4zODI2ODM0MzIzNjUwODk4OTAwMCwgICAgIDAuMjkwMjg0Njc3MjU0NDYyMzkwMDAsCisgICAgIDAuMTk1MDkwMzIyMDE2MTI4NjEwMDAsICAgICAwLjA5ODAxNzE0MDMyOTU2MDgyNjAwLAorICAgICAwLjAwMDAwMDAwMDAwMDAwMDEyMjQ2LCAgICAtMC4wOTgwMTcxNDAzMjk1NjA1OTAwMCwKKyAgICAtMC4xOTUwOTAzMjIwMTYxMjgzNjAwMCwgICAgLTAuMjkwMjg0Njc3MjU0NDYyMTEwMDAsCisgICAgLTAuMzgyNjgzNDMyMzY1MDg5NjcwMDAsICAgIC0wLjQ3MTM5NjczNjgyNTk5NzY0MDAwLAorICAgIC0wLjU1NTU3MDIzMzAxOTYwMTk2MDAwLCAgICAtMC42MzQzOTMyODQxNjM2NDUyNzAwMCwKKyAgICAtMC43MDcxMDY3ODExODY1NDc0NjAwMCwgICAgLTAuNzczMDEwNDUzMzYyNzM2NjYwMDAsCisgICAgLTAuODMxNDY5NjEyMzAyNTQ1MjQwMDAsICAgIC0wLjg4MTkyMTI2NDM0ODM1NDk0MDAwLAorICAgIC0wLjkyMzg3OTUzMjUxMTI4NjUyMDAwLCAgICAtMC45NTY5NDAzMzU3MzIyMDg4MjAwMCwKKyAgICAtMC45ODA3ODUyODA0MDMyMzAzMjAwMCwgICAgLTAuOTk1MTg0NzI2NjcyMTk2OTMwMDAsCisgICAgLTEuMDAwMDAwMDAwMDAwMDAwMDAwMDAsICAgIC0wLjk5NTE4NDcyNjY3MjE5NjkzMDAwLAorICAgIC0wLjk4MDc4NTI4MDQwMzIzMDQzMDAwLCAgICAtMC45NTY5NDAzMzU3MzIyMDg5NDAwMCwKKyAgICAtMC45MjM4Nzk1MzI1MTEyODY2MzAwMCwgICAgLTAuODgxOTIxMjY0MzQ4MzU1MDUwMDAsCisgICAgLTAuODMxNDY5NjEyMzAyNTQ1NDYwMDAsICAgIC0wLjc3MzAxMDQ1MzM2MjczNjg4MDAwLAorICAgIC0wLjcwNzEwNjc4MTE4NjU0NzY4MDAwLCAgICAtMC42MzQzOTMyODQxNjM2NDU5MzAwMCwKKyAgICAtMC41NTU1NzAyMzMwMTk2MDIxODAwMCwgICAgLTAuNDcxMzk2NzM2ODI1OTk3OTIwMDAsCisgICAgLTAuMzgyNjgzNDMyMzY1MDkwMzkwMDAsICAgIC0wLjI5MDI4NDY3NzI1NDQ2MjUwMDAwLAorICAgIC0wLjE5NTA5MDMyMjAxNjEyODcyMDAwLCAgICAtMC4wOTgwMTcxNDAzMjk1NjA1MDYwMCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBrMiA9ICgyKkNWX1BJKS9OOworICAgIAorICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2luX2EwID0gLTAuMTY2NjMwMjkzMzQ1NjQ3KmsyKmsyKmsyOworICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2luX2EyID0gazI7CisKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGNvc19hMCA9IC0wLjQ5OTgxODEzODQ1MDMyNiprMiprMjsKKyAgICAvKnN0YXRpYyBjb25zdCBkb3VibGUgY29zX2EyID0gIDE7Ki8KKworICAgIGRvdWJsZSBrMTsKKyAgICBpbnQgaTsKKworICAgIGlmKCAhYW5nbGVfaW5fZGVncmVlcyApCisgICAgICAgIGsxID0gTi8oMipDVl9QSSk7CisgICAgZWxzZQorICAgICAgICBrMSA9IE4vMzYwLjsKKworICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgdCA9IGFuZ2xlW2ldKmsxOworICAgICAgICBpbnQgaXQgPSBjdlJvdW5kKHQpOworICAgICAgICB0IC09IGl0OworICAgICAgICBpbnQgc2luX2lkeCA9IGl0ICYgKE4gLSAxKTsKKyAgICAgICAgaW50IGNvc19pZHggPSAoTi80IC0gc2luX2lkeCkgJiAoTiAtIDEpOworCisgICAgICAgIGRvdWJsZSBzaW5fYiA9IChzaW5fYTAqdCp0ICsgc2luX2EyKSp0OworICAgICAgICBkb3VibGUgY29zX2IgPSBjb3NfYTAqdCp0ICsgMTsKKworICAgICAgICBkb3VibGUgc2luX2EgPSBzaW5fdGFibGVbc2luX2lkeF07CisgICAgICAgIGRvdWJsZSBjb3NfYSA9IHNpbl90YWJsZVtjb3NfaWR4XTsKKworICAgICAgICBkb3VibGUgc2luX3ZhbCA9IHNpbl9hKmNvc19iICsgY29zX2Eqc2luX2I7CisgICAgICAgIGRvdWJsZSBjb3NfdmFsID0gY29zX2EqY29zX2IgLSBzaW5fYSpzaW5fYjsKKworICAgICAgICBzaW52YWxbaV0gPSAoZmxvYXQpc2luX3ZhbDsKKyAgICAgICAgY29zdmFsW2ldID0gKGZsb2F0KWNvc192YWw7CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZQb2xhclRvQ2FydCggY29uc3QgQ3ZBcnIqIG1hZ2FyciwgY29uc3QgQ3ZBcnIqIGFuZ2xlYXJyLAorICAgICAgICAgICAgICAgQ3ZBcnIqIHhhcnIsIEN2QXJyKiB5YXJyLCBpbnQgYW5nbGVfaW5fZGVncmVlcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlBvbGFyVG9DYXJ0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZmxvYXQqIHhfYnVmZmVyID0gMDsKKyAgICBmbG9hdCogeV9idWZmZXIgPSAwOworICAgIGludCBibG9ja19zaXplID0gMDsKKyAgICBDdk1hdCB4c3R1YiwgKnhtYXQgPSAoQ3ZNYXQqKXhhcnI7CisgICAgQ3ZNYXQgeXN0dWIsICp5bWF0ID0gKEN2TWF0Kil5YXJyOworICAgIEN2TWF0IG1hZ3N0dWIsICptYWcgPSAoQ3ZNYXQqKW1hZ2FycjsKKyAgICBDdk1hdCBhbmdsZXN0dWIsICphbmdsZSA9IChDdk1hdCopYW5nbGVhcnI7CisgICAgaW50IGNvaTEgPSAwLCBjb2kyID0gMCwgY29pMyA9IDAsIGNvaTQgPSAwOworICAgIGludCBkZXB0aDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgY29udF9mbGFnOworICAgIAorICAgIGlmKCAhQ1ZfSVNfTUFUKGFuZ2xlKSkKKyAgICAgICAgQ1ZfQ0FMTCggYW5nbGUgPSBjdkdldE1hdCggYW5nbGUsICZhbmdsZXN0dWIsICZjb2k0ICkpOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoIGFuZ2xlLT50eXBlICk7CisgICAgaWYoIGRlcHRoIDwgQ1ZfMzJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgIGNvbnRfZmxhZyA9IGFuZ2xlLT50eXBlOworCisgICAgaWYoIG1hZyApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChtYWcpKQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWFnID0gY3ZHZXRNYXQoIG1hZywgJm1hZ3N0dWIsICZjb2kzICkpOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBhbmdsZSwgbWFnICkgKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIGFuZ2xlLCBtYWcgKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisKKyAgICAgICAgY29udF9mbGFnICY9IG1hZy0+dHlwZTsKKyAgICB9CisKKyAgICBpZiggeG1hdCApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVCh4bWF0KSkKKyAgICAgICAgICAgIENWX0NBTEwoIHhtYXQgPSBjdkdldE1hdCggeG1hdCwgJnhzdHViLCAmY29pMSApKTsKKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggYW5nbGUsIHhtYXQgKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBhbmdsZSwgeG1hdCApICkKKyAgICAgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKyAgICAgICAgCisgICAgICAgIGNvbnRfZmxhZyAmPSB4bWF0LT50eXBlOworICAgIH0KKworICAgIGlmKCB5bWF0ICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHltYXQpKQorICAgICAgICAgICAgQ1ZfQ0FMTCggeW1hdCA9IGN2R2V0TWF0KCB5bWF0LCAmeXN0dWIsICZjb2kyICkpOyAgICAgICAgCisKKyAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIGFuZ2xlLCB5bWF0ICkgKQorICAgICAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisgICAgICAgIAorICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggYW5nbGUsIHltYXQgKSApCisgICAgICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZFNpemVzICk7CisgICAgICAgIAorICAgICAgICBjb250X2ZsYWcgJj0geW1hdC0+dHlwZTsKKyAgICB9CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCB8fCBjb2kzICE9IDAgfHwgY29pNCAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoYW5nbGUpOworICAgIHNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKGFuZ2xlLT50eXBlKTsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggY29udF9mbGFnICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgYmxvY2tfc2l6ZSA9IE1JTiggc2l6ZS53aWR0aCwgSUNWX01BVEhfQkxPQ0tfU0laRSApOworICAgIHhfYnVmZmVyID0gKGZsb2F0KiljdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqc2l6ZW9mKGZsb2F0KSk7CisgICAgeV9idWZmZXIgPSAoZmxvYXQqKWN2U3RhY2tBbGxvYyggYmxvY2tfc2l6ZSpzaXplb2YoZmxvYXQpKTsKKworICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgIHsKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogeF9kYXRhID0gKGZsb2F0KikoeG1hdCA/IHhtYXQtPmRhdGEucHRyICsgeG1hdC0+c3RlcCp5IDogMCk7CisgICAgICAgICAgICBmbG9hdCogeV9kYXRhID0gKGZsb2F0KikoeW1hdCA/IHltYXQtPmRhdGEucHRyICsgeW1hdC0+c3RlcCp5IDogMCk7CisgICAgICAgICAgICBmbG9hdCogbWFnX2RhdGEgPSAoZmxvYXQqKShtYWcgPyBtYWctPmRhdGEucHRyICsgbWFnLT5zdGVwKnkgOiAwKTsKKyAgICAgICAgICAgIGZsb2F0KiBhbmdsZV9kYXRhID0gKGZsb2F0KikoYW5nbGUtPmRhdGEucHRyICsgYW5nbGUtPnN0ZXAqeSk7CisKKyAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4ICs9IGJsb2NrX3NpemUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpLCBsZW4gPSBNSU4oIHNpemUud2lkdGggLSB4LCBibG9ja19zaXplICk7CisKKyAgICAgICAgICAgICAgICBpY3ZTaW5Db3NfMzJmKCBhbmdsZV9kYXRhK3gsIHlfYnVmZmVyLCB4X2J1ZmZlciwgbGVuLCBhbmdsZV9pbl9kZWdyZWVzICk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdHggPSB4X2J1ZmZlcltpXTsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdHkgPSB5X2J1ZmZlcltpXTsKKworICAgICAgICAgICAgICAgICAgICBpZiggbWFnX2RhdGEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtYWd2YWwgPSBtYWdfZGF0YVt4K2ldOworICAgICAgICAgICAgICAgICAgICAgICAgdHggKj0gbWFndmFsOworICAgICAgICAgICAgICAgICAgICAgICAgdHkgKj0gbWFndmFsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHhtYXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeF9kYXRhW3graV0gPSB0eDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHltYXQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeV9kYXRhW3graV0gPSB0eTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIHhfZGF0YSA9IChkb3VibGUqKSh4bWF0ID8geG1hdC0+ZGF0YS5wdHIgKyB4bWF0LT5zdGVwKnkgOiAwKTsKKyAgICAgICAgICAgIGRvdWJsZSogeV9kYXRhID0gKGRvdWJsZSopKHltYXQgPyB5bWF0LT5kYXRhLnB0ciArIHltYXQtPnN0ZXAqeSA6IDApOworICAgICAgICAgICAgZG91YmxlKiBtYWdfZGF0YSA9IChkb3VibGUqKShtYWcgPyBtYWctPmRhdGEucHRyICsgbWFnLT5zdGVwKnkgOiAwKTsKKyAgICAgICAgICAgIGRvdWJsZSogYW5nbGVfZGF0YSA9IChkb3VibGUqKShhbmdsZS0+ZGF0YS5wdHIgKyBhbmdsZS0+c3RlcCp5KTsKKyAgICAgICAgICAgIGRvdWJsZSBDID0gYW5nbGVfaW5fZGVncmVlcyA/IENWX1BJLzE4MC4gOiAxOworCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcGhpID0gYW5nbGVfZGF0YVt4XSpDOworICAgICAgICAgICAgICAgIGRvdWJsZSBtYWd2YWwgPSBtYWdfZGF0YSA/IG1hZ19kYXRhW3hdIDogMS47CisgICAgICAgICAgICAgICAgaWYoIHhtYXQgKQorICAgICAgICAgICAgICAgICAgICB4X2RhdGFbeF0gPSBjb3MocGhpKSptYWd2YWw7CisgICAgICAgICAgICAgICAgaWYoIHltYXQgKQorICAgICAgICAgICAgICAgICAgICB5X2RhdGFbeF0gPSBzaW4ocGhpKSptYWd2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFIFggUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBzdHJ1Y3QgeworI2lmICggZGVmaW5lZCggV09SRFNfQklHRU5ESUFOICkgJiYgIWRlZmluZWQoIE9QRU5DVl9VTklWRVJTQUxfQlVJTEQgKSApIHx8IGRlZmluZWQoIF9fQklHX0VORElBTl9fICkKKyAgICAgICAgaW50IGhpOworICAgICAgICBpbnQgbG87CisjZWxzZQorICAgICAgICBpbnQgbG87CisgICAgICAgIGludCBoaTsKKyNlbmRpZgorICAgIH0gaTsKKyAgICBkb3VibGUgZDsKK30KK0RCTElOVDsKKworI2RlZmluZSBFWFBUQUJfU0NBTEUgNgorI2RlZmluZSBFWFBUQUJfTUFTSyAgKCgxIDw8IEVYUFRBQl9TQ0FMRSkgLSAxKQorCisjZGVmaW5lIEVYUFBPTFlfMzJGX0EwIC45NjcwMzcxMTM5NTcyMzM3NzE5MTI1ODQwNDEzNjcyMDA0NDA5Mjg4ZS0yCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2RXhwVGFiW10gPSB7CisgICAgMS4wICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wMTA4ODkyODYwNTE3MDA0NjAwMjA0MDk3OTA1NjE5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wMjE4OTcxNDg2NTQxMTY2NzgyMzQ0ODAxMzQ3ODMzICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wMzMwMjQ4NzkwMjEyMjg0MjI1MDAxMDgyODM5NzA1ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wNDQyNzM3ODI0Mjc0MTM4NDAzMjE5NjY0Nzg3Mzk5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wNTU2NDUxNzgzNjA1NTcxNTg4MDgzNDEzMjUxNTI5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wNjcxNDA0MDA2NzY4MjM2MTgxNjk1MjExMjA5OTI4ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wNzg3NjA3OTc3NTcxMTk3OTM3NDA2ODAwMzc0Mzg1ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4wOTA1MDc3MzI2NjUyNTc2NTkyMDcwMTA2NTU3NjA3ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4xMDIzODI1ODMzMDc4NDA5NDM1NTY0MTQyMDk0MjU2ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4xMTQzODY3NDI1OTU4OTI1MzYzMDg4MTI5NTY5MTk2ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS4xMjY1MjE2MTg2MDgyNDE4OTk3OTQ3OTg2NDM3ODcgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjEzODc4ODYzNDc1NjY5MTY1MzcwMzgzMDI4Mzg0MTUgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjE1MTE4OTIyOTk1Mjk4MjcwNTgxNzc1OTYzNTIwMiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMTYzNzI0ODU4Nzc3NTc3NTEzODEzNTczNTk5MDkyMiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMTc2Mzk2OTkxNjUwMjgxMjc2Mjg0NjQ1NzI4NDgzOCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMTg5MjA3MTE1MDAyNzIxMDY2NzE3NDk5OTcwNTYwNSAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjAyMTU2NzMxNDUyNzAzMTQyMDk2Mzk2OTU3NDk3OCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjE1MjQ3MzU5OTgwNDY4ODc4MTE2NTIwMjUxMzM4OCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjI4NDgwNTM2MTA2ODcwMDA1Njk0MDA4OTU3NzkyOCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjQxODU3ODEyMDczNDg0MDQ4NTkzNjc3NDY4NzI2NiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjU1MzgwNzU3MDI0NjkxMDg5NTc5MzkwNjU3NDQyMyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjY5MDUwOTU3MTkxNzMzMjIyNTU0NDE5MDgxMDMyMyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjgyODcwMDE2MDc4Nzc4MjgwNzI2NjY5NzgxMDIxNSAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMjk2ODM5NTU0NjUxMDA5NjY1OTMzNzU0MTE3NzkyNSAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzEwOTYxMjExNTI0NzY0MzQxOTIyOTkxNzg2MzMwOCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzI1MjM2NjQzMTU5NzQxMjk0NjI5NTM3MDk1NDk4NyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzM5NjY3NTI0MDUzMzAzMDA1MzYwMDMwNjY5NzI0NCAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzU0MjU1NTQ2OTM2ODkyNzI4Mjk4MDE0NzQwMTQwNyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzY5MDAyNDIyOTc0NTkwNjExOTI5NjAxMTMyOTgyMiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzgzOTA5ODgxOTYzODMxOTU0ODcyNjU5NTI3MjY1MiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuMzk4OTc5NjcyNTM4MzExMTQwMjA5NTI4MTM2NzE1MiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuNDE0MjEzNTYyMzczMDk1MDQ4ODAxNjg4NzI0MjA5NyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuNDI5NjEzMzM4MzkxOTcwMDExMjM1MDY1Nzc4Mjc1MSAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuNDQ1MTgwODA2OTc3MDQ2NjIwMDM3MDA2MjQxNDcxNyAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuNDYwOTE3Nzk0MTgwNjQ2OTg4NjUxMzAyODkwMzEwNiAqIEVYUFBPTFlfMzJGX0EwLAorICAgIDEuNDc2ODI2MTQ1OTM5NDk5MzExMzg2OTA3NDgwMzc0ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS40OTI5MDc3MjgyOTEyNjQ4NDkyMDA2NDM1MzE0ODY3ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41MDkxNjQ0Mjc1OTM0MjI3Mzk3NjYwMTk1NTEwMzMyICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41MjU1OTgxNTA3NDQ1MzgzMDY4NTEyNTM2ODk1MTY5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41NDIyMTA4MjU0MDc5NDA4MjM2MTIyOTE4NjIwOTA3ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41NTkwMDQ0MDAyMzc4MzY5NjcwMzM3MjgwODk0NzQ5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41NzU5ODA4NDUxMDc4ODY0ODY0NTUyNzAxNjAxODE5ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS41OTMxNDIxNTEzNDIyNjY4OTc5MzcyNDg2NDMxMTkxICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS42MTA0OTAzMzE5NDkyNTQzMDgxNzk1MjA2NjczNTc0ICogRVhQUE9MWV8zMkZfQTAsCisgICAgMS42MjgwMjc0MjE4NTczNDc3NjY4NDgyMTg1MjIwMTQgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjY0NTc1NTQ3ODE1Mzk2NDg0NDUxODc1NjcyNDcyNTggKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjY2MzY3NjU4MDMyNjczNjQzNTA0NjMzNjQ1Njk3NjQgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjY4MTc5MjgzMDUwNzQyOTA4NjA2MjI1MDk1MjQ2NjQgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjcwMDEwNjM1MzcxODUyMzQ2OTUwMTM2MjU3MzQ5NzUgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjcxODYxOTI5ODEyMjQ3NzkxNTYyOTM0NDM3NjQ1NjMgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjczNzMzMzgzNTI3MzcwNjI0ODk5NDIwMjA4MTg3MjIgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjc1NjI1MjE2MDM3MzI5OTQ4MzExMjE2MDYxOTM3NTMgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjc3NTM3NjQ5MjUyNjUyMTI1MjU1MDU1OTIwMDE5OTMgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjc5NDcwOTA3NTAwMzEwNzE4NjQyNzcwMzI0MjEyNzggKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjgxNDI1MjE3NTUwMDM5ODc1NjI0OTgzNDYwMDM2MjMgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjgzNDAwODA4NjQwOTM0MjQ2MzQ4NzA4MzE4OTU4ODMgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjg1Mzk3OTEyNTA4MzM4NTU2ODM5MjQ1MzA3MDMzNzcgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjg3NDE2NzYzNDExMDI5OTkwMTMyOTk5ODk0OTk1NDQgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjg5NDU3NTk4MTU4Njk2NTY0MTM0MDIxODY1MzQyNjkgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjkxNTIwNjU2MTM5NzE0NzI5Mzg3MjYxMTI3MDI5NTggKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjkzNjA2MTc5MzQ5MjI5NDQ1MDU5ODA1NTkwNDU2NjcgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjk1NzE0NDEyNDE3NTQwMDI2OTAxODMyMjI1MTYyNjkgKiBFWFBQT0xZXzMyRl9BMCwKKyAgICAxLjk3ODQ1NjAyNjM4Nzk1MDk2ODI1ODI0OTkxODEzMTIgKiBFWFBQT0xZXzMyRl9BMCwKK307CisKK3N0YXRpYyBjb25zdCBkb3VibGUgZXhwX3ByZXNjYWxlID0gMS40NDI2OTUwNDA4ODg5NjM0MDczNTk5MjQ2ODEwMDE5ICogKDEgPDwgRVhQVEFCX1NDQUxFKTsKK3N0YXRpYyBjb25zdCBkb3VibGUgZXhwX3Bvc3RzY2FsZSA9IDEuLygxIDw8IEVYUFRBQl9TQ0FMRSk7CitzdGF0aWMgY29uc3QgZG91YmxlIGV4cF9tYXhfdmFsID0gMzAwMC4qKDEgPDwgRVhQVEFCX1NDQUxFKTsgLy8gbG9nMTAoREJMX01BWCkgPCAzMDAwCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkV4cF8zMmYsICggY29uc3QgZmxvYXQgKl94LCBmbG9hdCAqeSwgaW50IG4gKSwgKF94LCB5LCBuKSApCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZQorICAgICAgICBFWFBQT0xZXzMyRl9BNCA9IDEuMDAwMDAwMDAwMDAwMDAyNDM4NTMyOTcwNzk1MTgxODkwOTMzNzc2IC8gRVhQUE9MWV8zMkZfQTAsCisgICAgICAgIEVYUFBPTFlfMzJGX0EzID0gLjY5MzE0NzE4MDU1MjE0NDgxOTY4MDA2Njk2MTU4NjQ3NzMxNDQ2NDEgLyBFWFBQT0xZXzMyRl9BMCwKKyAgICAgICAgRVhQUE9MWV8zMkZfQTIgPSAuMjQwMjI2NTEwOTUxMzMwMTQ5MDEwMzM3MjQyMjY4NjUzNTUyNjU3MyAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBFWFBQT0xZXzMyRl9BMSA9IC41NTUwMzM5MzY2NzUzMTI1MjExOTE1MzIyMDQ3MDA0NjY2OTM5MTI4ZS0xIC8gRVhQUE9MWV8zMkZfQTA7CisKKyAgICAjdW5kZWYgRVhQUE9MWQorICAgICNkZWZpbmUgRVhQUE9MWSh4KSAgXAorICAgICAgICAoKCgoKHgpICsgRVhQUE9MWV8zMkZfQTEpKih4KSArIEVYUFBPTFlfMzJGX0EyKSooeCkgKyBFWFBQT0xZXzMyRl9BMykqKHgpICsgRVhQUE9MWV8zMkZfQTQpCisKKyAgICBpbnQgaSA9IDA7CisgICAgREJMSU5UIGJ1Zls0XTsKKyAgICBjb25zdCBDdjMyc3VmKiB4ID0gKGNvbnN0IEN2MzJzdWYqKV94OworCisgICAgaWYoICF4IHx8ICF5ICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBuIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBidWZbMF0uaS5sbyA9IGJ1ZlsxXS5pLmxvID0gYnVmWzJdLmkubG8gPSBidWZbM10uaS5sbyA9IDA7CisKKyAgICBmb3IoIDsgaSA8PSBuIC0gNDsgaSArPSA0ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4MCA9IHhbaV0uZiAqIGV4cF9wcmVzY2FsZTsKKyAgICAgICAgZG91YmxlIHgxID0geFtpICsgMV0uZiAqIGV4cF9wcmVzY2FsZTsKKyAgICAgICAgZG91YmxlIHgyID0geFtpICsgMl0uZiAqIGV4cF9wcmVzY2FsZTsKKyAgICAgICAgZG91YmxlIHgzID0geFtpICsgM10uZiAqIGV4cF9wcmVzY2FsZTsKKyAgICAgICAgaW50IHZhbDAsIHZhbDEsIHZhbDIsIHZhbDMsIHQ7CisKKyAgICAgICAgaWYoICgoeFtpXS5pID4+IDIzKSAmIDI1NSkgPiAxMjcgKyAxMCApCisgICAgICAgICAgICB4MCA9IHhbaV0uaSA8IDAgPyAtZXhwX21heF92YWwgOiBleHBfbWF4X3ZhbDsKKworICAgICAgICBpZiggKCh4W2krMV0uaSA+PiAyMykgJiAyNTUpID4gMTI3ICsgMTAgKQorICAgICAgICAgICAgeDEgPSB4W2krMV0uaSA8IDAgPyAtZXhwX21heF92YWwgOiBleHBfbWF4X3ZhbDsKKworICAgICAgICBpZiggKCh4W2krMl0uaSA+PiAyMykgJiAyNTUpID4gMTI3ICsgMTAgKQorICAgICAgICAgICAgeDIgPSB4W2krMl0uaSA8IDAgPyAtZXhwX21heF92YWwgOiBleHBfbWF4X3ZhbDsKKworICAgICAgICBpZiggKCh4W2krM10uaSA+PiAyMykgJiAyNTUpID4gMTI3ICsgMTAgKQorICAgICAgICAgICAgeDMgPSB4W2krM10uaSA8IDAgPyAtZXhwX21heF92YWwgOiBleHBfbWF4X3ZhbDsKKworICAgICAgICB2YWwwID0gY3ZSb3VuZCh4MCk7CisgICAgICAgIHZhbDEgPSBjdlJvdW5kKHgxKTsKKyAgICAgICAgdmFsMiA9IGN2Um91bmQoeDIpOworICAgICAgICB2YWwzID0gY3ZSb3VuZCh4Myk7CisKKyAgICAgICAgeDAgPSAoeDAgLSB2YWwwKSpleHBfcG9zdHNjYWxlOworICAgICAgICB4MSA9ICh4MSAtIHZhbDEpKmV4cF9wb3N0c2NhbGU7CisgICAgICAgIHgyID0gKHgyIC0gdmFsMikqZXhwX3Bvc3RzY2FsZTsKKyAgICAgICAgeDMgPSAoeDMgLSB2YWwzKSpleHBfcG9zdHNjYWxlOworCisgICAgICAgIHQgPSAodmFsMCA+PiBFWFBUQUJfU0NBTEUpICsgMTAyMzsKKyAgICAgICAgdCA9ICh0IHwgKCh0IDwgMjA0NykgLSAxKSkgJiAoKCh0IDwgMCkgLSAxKSAmIDIwNDcpOworICAgICAgICBidWZbMF0uaS5oaSA9IHQgPDwgMjA7CisKKyAgICAgICAgdCA9ICh2YWwxID4+IEVYUFRBQl9TQ0FMRSkgKyAxMDIzOworICAgICAgICB0ID0gKHQgfCAoKHQgPCAyMDQ3KSAtIDEpKSAmICgoKHQgPCAwKSAtIDEpICYgMjA0Nyk7CisgICAgICAgIGJ1ZlsxXS5pLmhpID0gdCA8PCAyMDsKKworICAgICAgICB0ID0gKHZhbDIgPj4gRVhQVEFCX1NDQUxFKSArIDEwMjM7CisgICAgICAgIHQgPSAodCB8ICgodCA8IDIwNDcpIC0gMSkpICYgKCgodCA8IDApIC0gMSkgJiAyMDQ3KTsKKyAgICAgICAgYnVmWzJdLmkuaGkgPSB0IDw8IDIwOworCisgICAgICAgIHQgPSAodmFsMyA+PiBFWFBUQUJfU0NBTEUpICsgMTAyMzsKKyAgICAgICAgdCA9ICh0IHwgKCh0IDwgMjA0NykgLSAxKSkgJiAoKCh0IDwgMCkgLSAxKSAmIDIwNDcpOworICAgICAgICBidWZbM10uaS5oaSA9IHQgPDwgMjA7CisKKyAgICAgICAgeDAgPSBidWZbMF0uZCAqIGljdkV4cFRhYlt2YWwwICYgRVhQVEFCX01BU0tdICogRVhQUE9MWSggeDAgKTsKKyAgICAgICAgeDEgPSBidWZbMV0uZCAqIGljdkV4cFRhYlt2YWwxICYgRVhQVEFCX01BU0tdICogRVhQUE9MWSggeDEgKTsKKyAgICAgICAgCisgICAgICAgIHlbaV0gPSAoZmxvYXQpeDA7CisgICAgICAgIHlbaSArIDFdID0gKGZsb2F0KXgxOworICAgICAgICAKKyAgICAgICAgeDIgPSBidWZbMl0uZCAqIGljdkV4cFRhYlt2YWwyICYgRVhQVEFCX01BU0tdICogRVhQUE9MWSggeDIgKTsKKyAgICAgICAgeDMgPSBidWZbM10uZCAqIGljdkV4cFRhYlt2YWwzICYgRVhQVEFCX01BU0tdICogRVhQUE9MWSggeDMgKTsKKyAgICAgICAgCisgICAgICAgIHlbaSArIDJdID0gKGZsb2F0KXgyOworICAgICAgICB5W2kgKyAzXSA9IChmbG9hdCl4MzsKKyAgICB9CisKKyAgICBmb3IoIDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgeDAgPSB4W2ldLmYgKiBleHBfcHJlc2NhbGU7CisgICAgICAgIGludCB2YWwwLCB0OworCisgICAgICAgIGlmKCAoKHhbaV0uaSA+PiAyMykgJiAyNTUpID4gMTI3ICsgMTAgKQorICAgICAgICAgICAgeDAgPSB4W2ldLmkgPCAwID8gLWV4cF9tYXhfdmFsIDogZXhwX21heF92YWw7CisKKyAgICAgICAgdmFsMCA9IGN2Um91bmQoeDApOworICAgICAgICB0ID0gKHZhbDAgPj4gRVhQVEFCX1NDQUxFKSArIDEwMjM7CisgICAgICAgIHQgPSAodCB8ICgodCA8IDIwNDcpIC0gMSkpICYgKCgodCA8IDApIC0gMSkgJiAyMDQ3KTsKKworICAgICAgICBidWZbMF0uaS5oaSA9IHQgPDwgMjA7CisgICAgICAgIHgwID0gKHgwIC0gdmFsMCkqZXhwX3Bvc3RzY2FsZTsKKworICAgICAgICB5W2ldID0gKGZsb2F0KShidWZbMF0uZCAqIGljdkV4cFRhYlt2YWwwICYgRVhQVEFCX01BU0tdICogRVhQUE9MWSh4MCkpOworICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZFeHBfNjRmLCAoIGNvbnN0IGRvdWJsZSAqX3gsIGRvdWJsZSAqeSwgaW50IG4gKSwgKF94LCB5LCBuKSApCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZQorICAgICAgICBBNSA9IC45OTk5OTk5OTk5OTk5OTk5OTk5ODI4NTIyNzUwNDk5OSAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBBNCA9IC42OTMxNDcxODA1NTk5NDU0Njc0MzAyOTY0MzgyNTMyMiAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBBMyA9IC4yNDAyMjY1MDY5NTg4NjQ3NzkxODE4MTMzODA1NDMwOCAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBBMiA9IC41NTUwNDEwODc5MzY0OTU2Nzk5ODQ2NjA0OTA0MjcyOWUtMSAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBBMSA9IC45NjE4MDk3MzE0MDczMjkxODAxMDAwMjM3MjY4NjE4NmUtMiAvIEVYUFBPTFlfMzJGX0EwLAorICAgICAgICBBMCA9IC4xMzM2OTcxMzc1NzE4MDEyMzI0NDgwNjY1NDgzOTQyNGUtMiAvIEVYUFBPTFlfMzJGX0EwOworCisgICAgI3VuZGVmIEVYUFBPTFkKKyAgICAjZGVmaW5lIEVYUFBPTFkoeCkgICgoKCgoQTAqKHgpICsgQTEpKih4KSArIEEyKSooeCkgKyBBMykqKHgpICsgQTQpKih4KSArIEE1KQorCisgICAgaW50IGkgPSAwOworICAgIERCTElOVCBidWZbNF07CisgICAgY29uc3QgQ3Y2NHN1ZiogeCA9IChjb25zdCBDdjY0c3VmKilfeDsKKworICAgIGlmKCAheCB8fCAheSApCisgICAgICAgIHJldHVybiBDVl9OVUxMUFRSX0VSUjsKKyAgICBpZiggbiA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgYnVmWzBdLmkubG8gPSBidWZbMV0uaS5sbyA9IGJ1ZlsyXS5pLmxvID0gYnVmWzNdLmkubG8gPSAwOworCisgICAgZm9yKCA7IGkgPD0gbiAtIDQ7IGkgKz0gNCApCisgICAgeworICAgICAgICBkb3VibGUgeDAgPSB4W2ldLmYgKiBleHBfcHJlc2NhbGU7CisgICAgICAgIGRvdWJsZSB4MSA9IHhbaSArIDFdLmYgKiBleHBfcHJlc2NhbGU7CisgICAgICAgIGRvdWJsZSB4MiA9IHhbaSArIDJdLmYgKiBleHBfcHJlc2NhbGU7CisgICAgICAgIGRvdWJsZSB4MyA9IHhbaSArIDNdLmYgKiBleHBfcHJlc2NhbGU7CisKKyAgICAgICAgZG91YmxlIHkwLCB5MSwgeTIsIHkzOworICAgICAgICBpbnQgdmFsMCwgdmFsMSwgdmFsMiwgdmFsMywgdDsKKworICAgICAgICB0ID0gKGludCkoeFtpXS5pID4+IDUyKTsKKyAgICAgICAgaWYoICh0ICYgMjA0NykgPiAxMDIzICsgMTAgKQorICAgICAgICAgICAgeDAgPSB0IDwgMCA/IC1leHBfbWF4X3ZhbCA6IGV4cF9tYXhfdmFsOworCisgICAgICAgIHQgPSAoaW50KSh4W2krMV0uaSA+PiA1Mik7CisgICAgICAgIGlmKCAodCAmIDIwNDcpID4gMTAyMyArIDEwICkKKyAgICAgICAgICAgIHgxID0gdCA8IDAgPyAtZXhwX21heF92YWwgOiBleHBfbWF4X3ZhbDsKKworICAgICAgICB0ID0gKGludCkoeFtpKzJdLmkgPj4gNTIpOworICAgICAgICBpZiggKHQgJiAyMDQ3KSA+IDEwMjMgKyAxMCApCisgICAgICAgICAgICB4MiA9IHQgPCAwID8gLWV4cF9tYXhfdmFsIDogZXhwX21heF92YWw7CisKKyAgICAgICAgdCA9IChpbnQpKHhbaSszXS5pID4+IDUyKTsKKyAgICAgICAgaWYoICh0ICYgMjA0NykgPiAxMDIzICsgMTAgKQorICAgICAgICAgICAgeDMgPSB0IDwgMCA/IC1leHBfbWF4X3ZhbCA6IGV4cF9tYXhfdmFsOworCisgICAgICAgIHZhbDAgPSBjdlJvdW5kKHgwKTsKKyAgICAgICAgdmFsMSA9IGN2Um91bmQoeDEpOworICAgICAgICB2YWwyID0gY3ZSb3VuZCh4Mik7CisgICAgICAgIHZhbDMgPSBjdlJvdW5kKHgzKTsKKworICAgICAgICB4MCA9ICh4MCAtIHZhbDApKmV4cF9wb3N0c2NhbGU7CisgICAgICAgIHgxID0gKHgxIC0gdmFsMSkqZXhwX3Bvc3RzY2FsZTsKKyAgICAgICAgeDIgPSAoeDIgLSB2YWwyKSpleHBfcG9zdHNjYWxlOworICAgICAgICB4MyA9ICh4MyAtIHZhbDMpKmV4cF9wb3N0c2NhbGU7CisKKyAgICAgICAgdCA9ICh2YWwwID4+IEVYUFRBQl9TQ0FMRSkgKyAxMDIzOworICAgICAgICB0ID0gKHQgfCAoKHQgPCAyMDQ3KSAtIDEpKSAmICgoKHQgPCAwKSAtIDEpICYgMjA0Nyk7CisgICAgICAgIGJ1ZlswXS5pLmhpID0gdCA8PCAyMDsKKworICAgICAgICB0ID0gKHZhbDEgPj4gRVhQVEFCX1NDQUxFKSArIDEwMjM7CisgICAgICAgIHQgPSAodCB8ICgodCA8IDIwNDcpIC0gMSkpICYgKCgodCA8IDApIC0gMSkgJiAyMDQ3KTsKKyAgICAgICAgYnVmWzFdLmkuaGkgPSB0IDw8IDIwOworCisgICAgICAgIHQgPSAodmFsMiA+PiBFWFBUQUJfU0NBTEUpICsgMTAyMzsKKyAgICAgICAgdCA9ICh0IHwgKCh0IDwgMjA0NykgLSAxKSkgJiAoKCh0IDwgMCkgLSAxKSAmIDIwNDcpOworICAgICAgICBidWZbMl0uaS5oaSA9IHQgPDwgMjA7CisKKyAgICAgICAgdCA9ICh2YWwzID4+IEVYUFRBQl9TQ0FMRSkgKyAxMDIzOworICAgICAgICB0ID0gKHQgfCAoKHQgPCAyMDQ3KSAtIDEpKSAmICgoKHQgPCAwKSAtIDEpICYgMjA0Nyk7CisgICAgICAgIGJ1ZlszXS5pLmhpID0gdCA8PCAyMDsKKworICAgICAgICB5MCA9IGJ1ZlswXS5kICogaWN2RXhwVGFiW3ZhbDAgJiBFWFBUQUJfTUFTS10gKiBFWFBQT0xZKCB4MCApOworICAgICAgICB5MSA9IGJ1ZlsxXS5kICogaWN2RXhwVGFiW3ZhbDEgJiBFWFBUQUJfTUFTS10gKiBFWFBQT0xZKCB4MSApOworCisgICAgICAgIHlbaV0gPSB5MDsKKyAgICAgICAgeVtpICsgMV0gPSB5MTsKKworICAgICAgICB5MiA9IGJ1ZlsyXS5kICogaWN2RXhwVGFiW3ZhbDIgJiBFWFBUQUJfTUFTS10gKiBFWFBQT0xZKCB4MiApOworICAgICAgICB5MyA9IGJ1ZlszXS5kICogaWN2RXhwVGFiW3ZhbDMgJiBFWFBUQUJfTUFTS10gKiBFWFBQT0xZKCB4MyApOworCisgICAgICAgIHlbaSArIDJdID0geTI7CisgICAgICAgIHlbaSArIDNdID0geTM7CisgICAgfQorCisgICAgZm9yKCA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHgwID0geFtpXS5mICogZXhwX3ByZXNjYWxlOworICAgICAgICBpbnQgdmFsMCwgdDsKKworICAgICAgICB0ID0gKGludCkoeFtpXS5pID4+IDUyKTsKKyAgICAgICAgaWYoICh0ICYgMjA0NykgPiAxMDIzICsgMTAgKQorICAgICAgICAgICAgeDAgPSB0IDwgMCA/IC1leHBfbWF4X3ZhbCA6IGV4cF9tYXhfdmFsOworCisgICAgICAgIHZhbDAgPSBjdlJvdW5kKHgwKTsKKyAgICAgICAgdCA9ICh2YWwwID4+IEVYUFRBQl9TQ0FMRSkgKyAxMDIzOworICAgICAgICB0ID0gKHQgfCAoKHQgPCAyMDQ3KSAtIDEpKSAmICgoKHQgPCAwKSAtIDEpICYgMjA0Nyk7CisKKyAgICAgICAgYnVmWzBdLmkuaGkgPSB0IDw8IDIwOworICAgICAgICB4MCA9ICh4MCAtIHZhbDApKmV4cF9wb3N0c2NhbGU7CisKKyAgICAgICAgeVtpXSA9IGJ1ZlswXS5kICogaWN2RXhwVGFiW3ZhbDAgJiBFWFBUQUJfTUFTS10gKiBFWFBQT0xZKCB4MCApOworICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworI3VuZGVmIEVYUFRBQl9TQ0FMRQorI3VuZGVmIEVYUFRBQl9NQVNLCisjdW5kZWYgRVhQUE9MWV8zMkZfQTAKKworQ1ZfSU1QTCB2b2lkIGN2RXhwKCBjb25zdCBDdkFyciogc3JjYXJyLCBDdkFyciogZHN0YXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2RXhwIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBzcmNfZGVwdGgsIGRzdF9kZXB0aDsKKyAgICBkb3VibGUqIGJ1ZmZlciA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IHgsIHksIGR4ID0gMDsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChzcmMpKQorICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaTEgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpKQorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaTIgKSk7CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBzcmNfZGVwdGggPSBDVl9NQVRfREVQVEgoc3JjLT50eXBlKTsKKyAgICBkc3RfZGVwdGggPSBDVl9NQVRfREVQVEgoZHN0LT50eXBlKTsKKworICAgIGlmKCAhQ1ZfQVJFX0NOU19FUSggc3JjLCBkc3QgKSB8fCBzcmNfZGVwdGggPCBDVl8zMkYgfHwgZHN0X2RlcHRoIDwgc3JjX2RlcHRoICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBzaXplLndpZHRoICo9IENWX01BVF9DTihzcmMtPnR5cGUpOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIHNyYywgZHN0ICkpCisgICAgeworICAgICAgICBkeCA9IE1JTiggMTAyNCwgc2l6ZS53aWR0aCApOworICAgICAgICBidWZmZXIgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIGR4KnNpemVvZihidWZmZXJbMF0pICk7CisgICAgfQorCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIHNyY19kYXRhID0gc3JjLT5kYXRhLnB0ciArIHNyYy0+c3RlcCp5OworICAgICAgICB1Y2hhciogZHN0X2RhdGEgPSBkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKnk7CisKKyAgICAgICAgaWYoIHNyY19kZXB0aCA9PSBDVl82NEYgKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZFeHBfNjRmKCAoZG91YmxlKilzcmNfZGF0YSwgKGRvdWJsZSopZHN0X2RhdGEsIHNpemUud2lkdGggKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzcmNfZGVwdGggPT0gZHN0X2RlcHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2RXhwXzMyZiggKGZsb2F0KilzcmNfZGF0YSwgKGZsb2F0Kilkc3RfZGF0YSwgc2l6ZS53aWR0aCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHggKz0gZHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBkeDsKKyAgICAgICAgICAgICAgICBpZiggeCArIGxlbiA+IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBzaXplLndpZHRoIC0geDsKKyAgICAgICAgICAgICAgICBpY3ZDdnRfMzJmNjRmKCAoZmxvYXQqKXNyY19kYXRhICsgeCwgYnVmZmVyLCBsZW4gKTsKKyAgICAgICAgICAgICAgICBpY3ZFeHBfNjRmKCBidWZmZXIsIChkb3VibGUqKWRzdF9kYXRhICsgeCwgbGVuICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwgTyBHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMT0dUQUJfU0NBTEUgICAgOAorI2RlZmluZSBMT0dUQUJfTUFTSyAgICAgICAgICgoMSA8PCBMT0dUQUJfU0NBTEUpIC0gMSkKKyNkZWZpbmUgTE9HVEFCX01BU0syICAgICAgICAoKDEgPDwgKDIwIC0gTE9HVEFCX1NDQUxFKSkgLSAxKQorI2RlZmluZSBMT0dUQUJfTUFTSzJfMzJGICAgICgoMSA8PCAoMjMgLSBMT0dUQUJfU0NBTEUpKSAtIDEpCisKK3N0YXRpYyBjb25zdCBkb3VibGUgaWN2TG9nVGFiW10gPSB7CiswLjAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAsICAgIDEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLAorLjAwMzg5ODY0MDQxNTY1NzMyMjg4ODUyMDc1MjcxMjc5MzE4MjU4MTY2LCAgICAuOTk2MTA4OTQ5NDE2MzQyNDEyNDUxMzYxODY3NzA0MjgwMTU1NjQyMCwKKy4wMDc3ODIxNDA0NDIwNTQ5NDgwOTI5MjAzNDExOTYwNzcwNjA4ODU3MywgICAgLjk5MjI0ODA2MjAxNTUwMzg3NTk2ODk5MjI0ODA2MjAxNTUwMzg3NjAsCisuMDExNjUwNjE3MjE5OTc1MjcyNjM3MDU1ODUxOTg3NDk3NTkwMDE2NTcsICAgIC45ODg0MTY5ODg0MTY5ODg0MTY5ODg0MTY5ODg0MTY5ODg0MTY5ODg0LAorLjAxNTUwNDE4NjUzNTk2NTI1Mjc0Mzk2MjY3MjM1NDg4MjY3MDMzMzYxLCAgICAuOTg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NiwKKy4wMTkzNDI5NjI4NDMxMzA5MzEzOTQwNjQ0NzU2MjU3ODI1MDY1NDA0MiwgICAgLjk4MDg0MjkxMTg3NzM5NDYzNjAxNTMyNTY3MDQ5ODA4NDI5MTE4NzcsCisuMDIzMTY3MDU5MjgxNTM0Mzc1OTM2MzA2NzAyMjE1MDA2MjI1NzQyNDEsICAgIC45NzcwOTkyMzY2NDEyMjEzNzQwNDU4MDE1MjY3MTc1NTcyNTE5MDg0LAorLjAyNjk3NjU4NzY5ODIwMjA3MjMzNTE0MDc1NTM5OTE1MjExMjY1OTA2LCAgICAuOTczMzg0MDMwNDE4MjUwOTUwNTcwMzQyMjA1MzIzMTkzOTE2MzQ5OCwKKy4wMzA3NzE2NTg2NjY3NTM2ODczMjc4NTUwMDQ2OTYxNzU0NTYwNDcwNiwgICAgLjk2OTY5Njk2OTY5Njk2OTY5Njk2OTY5Njk2OTY5Njk2OTY5Njk2OTcsCisuMDM0NTUyMzgxNTA2NjU5NzI4MTI3NTgzOTc0ODEwNDc3MjI5NzY2NTYsICAgIC45NjYwMzc3MzU4NDkwNTY2MDM3NzM1ODQ5MDU2NjAzNzczNTg0OTA2LAorLjAzODMxODg2NDMwMjEzNjU5NDYxMjg1NzU3ODU2Nzg1NDk0MzY4NTIyLCAgICAuOTYyNDA2MDE1MDM3NTkzOTg0OTYyNDA2MDE1MDM3NTkzOTg0OTYyNCwKKy4wNDIwNzEyMTM5MjA2ODcwNTA1NjkyMTM3Mzg1MjY3NDE1MDgzOTQ0NywgICAgLjk1ODgwMTQ5ODEyNzM0MDgyMzk3MDAzNzQ1MzE4MzUyMDU5OTI1MDksCisuMDQ1ODA5NTM2MDMxMjk0MjAxMjYzNzE5NDAxMTQwNDA2MjYyMTI5NTMsICAgIC45NTUyMjM4ODA1OTcwMTQ5MjUzNzMxMzQzMjgzNTgyMDg5NTUyMjM5LAorLjA0OTUzMzkzNTEyMjI3NjYyNzQ4MjkyOTAwMTE4OTQwNDUxNjQ4MDg4LCAgICAuOTUxNjcyODYyNDUzNTMxNTk4NTEzMDExMTUyNDE2MzU2ODc3MzIzNCwKKy4wNTMyNDQ1MTQ1MTg4MTIyNzc1OTI1NTIxMDY4NTI5NjMzMzM5NDk0NCwgICAgLjk0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODE0ODEsCisuMDU2OTQxMzc2NDAwMTM4NDI0Mjc0MTExMDU5NzMwNzg1MjAwMzcyMzQsICAgIC45NDQ2NDk0NDY0OTQ0NjQ5NDQ2NDk0NDY0OTQ0NjQ5NDQ2NDk0NDY1LAorLjA2MDYyNDYyMTgxNjQzNDgzOTkzODIwMzUzODE2NzcyNjk0Njk5NDY2LCAgICAuOTQxMTc2NDcwNTg4MjM1Mjk0MTE3NjQ3MDU4ODIzNTI5NDExNzY0NywKKy4wNjQyOTQzNTA3MDUzOTcyNTQ2MDgzNjQyMjE0Mzk4NDIzNjc1NDQ3NSwgICAgLjkzNzcyODkzNzcyODkzNzcyODkzNzcyODkzNzcyODkzNzcyODkzNzcsCisuMDY3OTUwNjYxOTA4NTA3NzM2Nzk2OTkxNTk0MDE5MzQ1OTM5MTU5MzgsICAgIC45MzQzMDY1NjkzNDMwNjU2OTM0MzA2NTY5MzQzMDY1NjkzNDMwNjU3LAorLjA3MTU5MzY1MzE4NzAwODgwNDQyODI1OTYyMjkwOTUzNjExOTU1MDQ0LCAgICAuOTMwOTA5MDkwOTA5MDkwOTA5MDkwOTA5MDkwOTA5MDkwOTA5MDkwOSwKKy4wNzUyMjM0MjEyMzc1ODc1MTc3NTE0MjE3Mjg0NjI0NDY0ODA5ODk0NCwgICAgLjkyNzUzNjIzMTg4NDA1Nzk3MTAxNDQ5Mjc1MzYyMzE4ODQwNTc5NzEsCisuMDc4ODQwMDYxNzA3Nzc2MDIxMjkzNjI1NDkwMjE2MDcyNjQ4NzYzNjksICAgIC45MjQxODc3MjU2MzE3Njg5NTMwNjg1OTIwNTc3NjE3MzI4NTE5ODU2LAorLjA4MjQ0MzY2OTIxMTA3NDU4NTU2NzcyMjI5NDg1NDMyMDM1Mjg5NzA2LCAgICAuOTIwODYzMzA5MzUyNTE3OTg1NjExNTEwNzkxMzY2OTA2NDc0ODIwMSwKKy4wODYwMzQzMzczNDE4MDMxNDM3Mzk0MDQ5MDIxMzQ5OTI4ODA3NDY3NSwgICAgLjkxNzU2MjcyNDAxNDMzNjkxNzU2MjcyNDAxNDMzNjkxNzU2MjcyNDAsCisuMDg5NjEyMTU4Njg5Njg3MTI0MTY4OTc2NTk1MjI4NzQxNjQzOTUwMzEsICAgIC45MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQyODU3MTQzLAorLjA5MzE3NzIyNDg1NDE4MzI4MjU5ODU0MDkyNzIxMDcwNjI4NjEzMjMxLCAgICAuOTExMDMyMDI4NDY5NzUwODg5Njc5NzE1MzAyNDkxMTAzMjAyODQ3MCwKKy4wOTY3Mjk2MjY0NTg1NTEwOTg5Nzc1MjI5OTczMDIwMDMyMDQ4MjI1NiwgICAgLjkwNzgwMTQxODQzOTcxNjMxMjA1NjczNzU4ODY1MjQ4MjI2OTUwMzUsCisuMTAwMjY5NDUzMTYzNjc1MTM3Mzg1OTc5NDk2Njg0NzQwMjk3NDk2MzAsICAgIC45MDQ1OTM2Mzk1NzU5NzE3MzE0NDg3NjMyNTA4ODMzOTIyMjYxNDg0LAorLjEwMzc5Njc5MzY4MTY0MzU1OTM0ODMzNzY0NjQ5NzM4NDQxMjIxNDIwLCAgICAuOTAxNDA4NDUwNzA0MjI1MzUyMTEyNjc2MDU2MzM4MDI4MTY5MDE0MSwKKy4xMDczMTE3MzU3ODkwODgwNTAyMTkxNDIxODk2ODk1OTE3NTk4MTU4MCwgICAgLjg5ODI0NTYxNDAzNTA4NzcxOTI5ODI0NTYxNDAzNTA4NzcxOTI5ODIsCisuMTEwODE0MzY2MzQwMjkwMTEzMDExMDU3ODI2NDk3NTYyOTI4MTI1MzAsICAgIC44OTUxMDQ4OTUxMDQ4OTUxMDQ4OTUxMDQ4OTUxMDQ4OTUxMDQ4OTUxLAorLjExNDMwNDc3MTI4MDA1ODYyODUyNDIyMzI1MjA0MzE1NzExNzQ0MTMwLCAgICAuODkxOTg2MDYyNzE3NzcwMDM0ODQzMjA1NTc0OTEyODkxOTg2MDYyNywKKy4xMTc3ODMwMzU2NTYzODM0NDE4NTgxNzQ4NzY0MTU0MzI2NjM2MzQ0MCwgICAgLjg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODksCisuMTIxMjQ5MjQzNjMyODY5Njc5ODc2NDA3MDc2MzM1NDUzODkzOTg5MzAsICAgIC44ODU4MTMxNDg3ODg5MjczMzU2NDAxMzg0MDgzMDQ0OTgyNjk4OTYyLAorLjEyNDcwMzQ3ODUwMDk1NzIyNjYzNzg3OTY3MTIxNjA2OTI1NTAyNDIwLCAgICAuODgyNzU4NjIwNjg5NjU1MTcyNDEzNzkzMTAzNDQ4Mjc1ODYyMDY5MCwKKy4xMjgxNDU4MjI2OTE5MzAwMzM2MDk5NjM4NTcwODg1ODcyNDY4MzUzMCwgICAgLjg3OTcyNTA4NTkxMDY1MjkyMDk2MjE5OTMxMjcxNDc3NjYzMjMwMjQsCisuMTMxNTc2MzU3Nzg4NzE5MjYxNDY1NzE1MjQ4OTU5ODk1Njg5MDQwNDAsICAgIC44NzY3MTIzMjg3NjcxMjMyODc2NzEyMzI4NzY3MTIzMjg3NjcxMjMzLAorLjEzNDk5NTE2NDUzNzUwNDgxOTI1NzY2MjgwMjU1NjI5NjgxMDUwNzgwLCAgICAuODczNzIwMTM2NTE4NzcxMzMxMDU4MDIwNDc3ODE1Njk5NjU4NzAzMSwKKy4xMzg0MDIzMjI4NTkxMTkxMzEyMzc1NDg1NzIyNDQxMjI2MjQzOTczMCwgICAgLjg3MDc0ODI5OTMxOTcyNzg5MTE1NjQ2MjU4NTAzNDAxMzYwNTQ0MjIsCisuMTQxNzk3OTExODYwMjU3MzM2MjkxNzI0MDcyOTA3NTI3NDQzMDIxNTAsICAgIC44Njc3OTY2MTAxNjk0OTE1MjU0MjM3Mjg4MTM1NTkzMjIwMzM4OTgzLAorLjE0NTE4MjAwOTg0NDQ5Nzg4OTAzOTUxNjI4MDcxODA4OTU0NzAwODMwLCAgICAuODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0ODY0OSwKKy4xNDg1NTQ2OTQzMjMxMzcxMTUzMDgyNDIwNzMyOTcxNTEzNjQzODYxMCwgICAgLjg2MTk1Mjg2MTk1Mjg2MTk1Mjg2MTk1Mjg2MTk1Mjg2MTk1Mjg2MjAsCisuMTUxOTE2MDQyMDI1ODQxOTY4NTg3OTQwMzAwNDk0NjY1Mjc5OTg0NTAsICAgIC44NTkwNjA0MDI2ODQ1NjM3NTgzODkyNjE3NDQ5NjY0NDI5NTMwMjAxLAorLjE1NTI2NjEyODkxMTEyMzkyOTU1NjgzNjc0MjQ0OTM3NzE5Nzc3MjMwLCAgICAuODU2MTg3MjkwOTY5ODk5NjY1NTUxODM5NDY0ODgyOTQzMTQzODEyNywKKy4xNTg2MDUwMzAxNzY2Mzg1NzI4MzYzNjczMDI0NDMyNTAwODI0MzMzMCwgICAgLjg1MzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMsCisuMTYxOTMyODIwMjY5MzEzMjQzNDY2NDEzNjA5ODk0NTE2NDEyMTY4ODAsICAgIC44NTA0OTgzMzg4NzA0MzE4OTM2ODc3MDc2NDExOTYwMTMyODkwMzY1LAorLjE2NTI0OTU3Mjg5NTMwNzE0NTIxNDk3MTQ1NTk3MDk1MzY4NDMwMDEwLCAgICAuODQ3NjgyMTE5MjA1Mjk4MDEzMjQ1MDMzMTEyNTgyNzgxNDU2OTUzNiwKKy4xNjg1NTUzNjEwMjk4MDY2NDQwMzUzODkyNDAzNDM2NDc1NDMzNDA5MCwgICAgLjg0NDg4NDQ4ODQ0ODg0NDg4NDQ4ODQ0ODg0NDg4NDQ4ODQ0ODg0NDksCisuMTcxODUwMjU2OTI2NjU5MjAwNjA2OTc3MTUxNDM3NjA0MzM0MjA1NDAsICAgIC44NDIxMDUyNjMxNTc4OTQ3MzY4NDIxMDUyNjMxNTc4OTQ3MzY4NDIxLAorLjE3NTEzNDMzMjEyNzg0OTEyMzg1MDE4Mjg3NzUwNDI2Njc5ODQ5NjMwLCAgICAuODM5MzQ0MjYyMjk1MDgxOTY3MjEzMTE0NzU0MDk4MzYwNjU1NzM3NywKKy4xNzg0MDc2NTc0NzI4MTgyODE3OTYzNzg0MTQ1ODMxNTk2MTA2MjkxMCwgICAgLjgzNjYwMTMwNzE4OTU0MjQ4MzY2MDEzMDcxODk1NDI0ODM2NjAxMzEsCisuMTgxNjcwMzAzMTA3NjM0NjU2MzkyMTIxOTk2NzU5NjY5ODU1MjM3MDAsICAgIC44MzM4NzYyMjE0OTgzNzEzMzU1MDQ4ODU5OTM0ODUzNDIwMTk1NDQwLAorLjE4NDkyMjMzODQ5NDAxMTk4OTY0MDI0MjE3NzMwMTg0MzE4NDk3NzgwLCAgICAuODMxMTY4ODMxMTY4ODMxMTY4ODMxMTY4ODMxMTY4ODMxMTY4ODMxMiwKKy4xODgxNjM4MzI0MTgxODI5NjM1NjgzOTgyMzYwMjA1ODQ1OTA3MzMwMCwgICAgLjgyODQ3ODk2NDQwMTI5NDQ5ODM4MTg3NzAyMjY1MzcyMTY4Mjg0NzksCisuMTkxMzk0ODUyOTk5NjI5NDM4OTgzMjIwMDk3NzI1Mjc5NjI5MjMwNTAsICAgIC44MjU4MDY0NTE2MTI5MDMyMjU4MDY0NTE2MTI5MDMyMjU4MDY0NTE2LAorLjE5NDYxNTQ2NzY5OTY3MTY0MDM4OTE2OTYyNDU0MDk1NDgyODI2MjQwLCAgICAuODIzMTUxMTI1NDAxOTI5MjYwNDUwMTYwNzcxNzA0MTgwMDY0MzA4NywKKy4xOTc4MjU3NDMzMjk5MTk4Njc1NDEzNzc2OTgyMTY4MjAxMzU3MTI2MCwgICAgLjgyMDUxMjgyMDUxMjgyMDUxMjgyMDUxMjgyMDUxMjgyMDUxMjgyMDUsCisuMjAxMDI1NzQ2MDYwNTkwNzMyMDMzOTAxNDE3NzA3OTY2MTc0OTMwNDAsICAgIC44MTc4OTEzNzM4MDE5MTY5MzI5MDczNDgyNDI4MTE1MDE1OTc0NDQxLAorLjIwNDIxNTU0MTQyODY5MDg4ODc2OTk5MjI4NDMyMzk2MTkzOTY2MjgwLCAgICAuODE1Mjg2NjI0MjAzODIxNjU2MDUwOTU1NDE0MDEyNzM4ODUzNTAzMiwKKy4yMDczOTUxOTQzNDYwNzA1NjYwMjcxNTE0NzE2NDQxNzQzMDc1ODQ4MCwgICAgLjgxMjY5ODQxMjY5ODQxMjY5ODQxMjY5ODQxMjY5ODQxMjY5ODQxMjcsCisuMjEwNTY0NzY5MTA3MzQ5NjE0MTYzMzgyNTExODMzMzMzNDEwMzIyNjAsICAgIC44MTAxMjY1ODIyNzg0ODEwMTI2NTgyMjc4NDgxMDEyNjU4MjI3ODQ4LAorLjIxMzcyNDMyOTM5NzcxODEyNjg3NzIzNjk1NDg5Njk0MzY0MzY4OTEwLCAgICAuODA3NTcwOTc3OTE3OTgxMDcyNTU1MjA1MDQ3MzE4NjExOTg3MzgxNywKKy4yMTY4NzM5MzgzMDA2MTQzNTUwNjgwNjMzMzI1MTAwNjQzNTYwMjkwMCwgICAgLjgwNTAzMTQ0NjU0MDg4MDUwMzE0NDY1NDA4ODA1MDMxNDQ2NTQwODgsCisuMjIwMDEzNjU4MzA1MjgyMDc4MjMxMzU3NDQ1NDc0NzE0MDQwNzU2MzAsICAgIC44MDI1MDc4MzY5OTA1OTU2MTEyODUyNjY0NTc2ODAyNTA3ODM2OTkxLAorLjIyMzE0MzU1MTMxNDIwOTczNzEwMTk5MDA3MjAwNTcxOTQxMjExODMwLCAgICAuODAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwKKy4yMjYyNjM2Nzg2NTA0NTMzODE0NTc5MDc2NTMzODQ2MDkxNDc5MDYzMCwgICAgLjc5NzUwNzc4ODE2MTk5Mzc2OTQ3MDQwNDk4NDQyMzY3NjAxMjQ2MTEsCisuMjI5Mzc0MTAxMDY0ODQ1ODIwMDYzODA4OTAxMDY4MTE0MjA5OTIwMTAsICAgIC43OTUwMzEwNTU5MDA2MjExMTgwMTI0MjIzNjAyNDg0NDcyMDQ5Njg5LAorLjIzMjQ3NDg3ODc0MzA5NDA1NDQyMjk2ODQ5NzQxOTc4ODAzNjQ5NTUwLCAgICAuNzkyNTY5NjU5NDQyNzI0NDU4MjA0MzM0MzY1MzI1MDc3Mzk5MzgwOCwKKy4yMzU1NjYwNzEzMTI3NjY4ODM3MTYzNDk3NTI4MzA4NjUzMjcyNjg5MCwgICAgLjc5MDEyMzQ1Njc5MDEyMzQ1Njc5MDEyMzQ1Njc5MDEyMzQ1Njc5MDEsCisuMjM4NjQ3NzM3ODUwMTc0OTg0NjQxNzgyMzE2NDMwMTgwNzk5MjE2MDAsICAgIC43ODc2OTIzMDc2OTIzMDc2OTIzMDc2OTIzMDc2OTIzMDc2OTIzMDc3LAorLjI0MTcxOTkzNjg4NzE0NTE1OTI0MzMxNzQ5Mzc0Njg3MjA2MDAwMDkwLCAgICAuNzg1Mjc2MDczNjE5NjMxOTAxODQwNDkwNzk3NTQ2MDEyMjY5OTM4NywKKy4yNDQ3ODI3MjY0MTc2OTA5MTU2NjU2NTkxOTAzODExMjA0MjQ3MTc2MCwgICAgLjc4Mjg3NDYxNzczNzAwMzA1ODEwMzk3NTUzNTE2ODE5NTcxODY1NDQsCisuMjQ3ODM2MTYzOTA0NTgxMjQxNDU3MjM2NzI4ODIwMTM0ODg1NjA5MTAsICAgIC43ODA0ODc4MDQ4NzgwNDg3ODA0ODc4MDQ4NzgwNDg3ODA0ODc4MDQ5LAorLjI1MDg4MDMwNjI4NTgwOTM3MzUzNDMzNDU1NDI3ODc1NzQyMzE2MjUwLCAgICAuNzc4MTE1NTAxNTE5NzU2ODM4OTA1Nzc1MDc1OTg3ODQxOTQ1Mjg4OCwKKy4yNTM5MTUyMDk5ODA5NjMzOTY2NzQyNjk0NjEwNzI5ODEzNTc1NzQ1MCwgICAgLjc3NTc1NzU3NTc1NzU3NTc1NzU3NTc1NzU3NTc1NzU3NTc1NzU3NTgsCisuMjU2OTQwOTMwODk3NTAwNDE5MTM4ODc5MTI0MTQ3OTMzOTA3ODA2ODAsICAgIC43NzM0MTM4OTcyODA5NjY3NjczNzE2MDEyMDg0NTkyMTQ1MDE1MTA2LAorLjI1OTk1NzUyNDQzNjkyNjA0NjI3NDAxMDEwNDc1Mjk2MDYxNDg2MDAwLCAgICAuNzcxMDg0MzM3MzQ5Mzk3NTkwMzYxNDQ1NzgzMTMyNTMwMTIwNDgxOSwKKy4yNjI5NjUwNDU1MDA4ODEzNDQ3NzU0Nzg5NjQ5NDc5Nzg5NjU5MzgwMCwgICAgLjc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODc2ODgsCisuMjY1OTYzNTQ4NDk3MTM3OTM1OTk5NzQ1NjUwNDA2MTExOTYzMDkzMzAsICAgIC43NjY0NjcwNjU4NjgyNjM0NzMwNTM4OTIyMTU1Njg4NjIyNzU0NDkxLAorLjI2ODk1MzA4NzM0NTUwMzkzODM2NTcwOTQ3MzE0NjEyNTY3NDI0NzgwLCAgICAuNzY0MTc5MTA0NDc3NjExOTQwMjk4NTA3NDYyNjg2NTY3MTY0MTc5MSwKKy4yNzE5MzM3MTU0ODM2NDE3NTgwNDgzNDk4NTY4MzU1NTcxNDc4NjA1MCwgICAgLjc2MTkwNDc2MTkwNDc2MTkwNDc2MTkwNDc2MTkwNDc2MTkwNDc2MTksCisuMjc0OTA1NDg1ODcyNzk5MjI2NzY1Mjk1MDg4NjI1ODYyMjYzMTQzMDAsICAgIC43NTk2NDM5MTY5MTM5NDY1ODc1MzcwOTE5ODgxMzA1NjM3OTgyMTk2LAorLjI3Nzg2ODQ1MTAwMzQ1NjI1MTU5MTIxNzA5NjU3NDgzNzM0MTkwNDgwLCAgICAuNzU3Mzk2NDQ5NzA0MTQyMDExODM0MzE5NTI2NjI3MjE4OTM0OTExMiwKKy4yODA4MjI2NjI5MDA4ODc3NTM5NTYxNjk0OTAyNjU4OTI4MTg1NzAzMCwgICAgLjc1NTE2MjI0MTg4NzkwNTYwNDcxOTc2NDAxMTc5OTQxMDAyOTQ5ODUsCisuMjgzNzY4MTczMTMwNjQ0NTYzMTYyNDA1ODAyMzU4OTg5NjAzODE3NTAsICAgIC43NTI5NDExNzY0NzA1ODgyMzUyOTQxMTc2NDcwNTg4MjM1Mjk0MTE4LAorLjI4NjcwNTAzMjgwMzk1NDI2MjgyMTEyMjI1NjM1NTAxMDkwNDM3MTgwLCAgICAuNzUwNzMzMTM3ODI5OTEyMDIzNDYwNDEwNTU3MTg0NzUwNzMzMTM3OCwKKy4yODk2MzMyOTI1ODMwNDI2NTYzNDI5Mzk4MzU2Njc0OTM3NTMxMzUzMCwgICAgLjc0ODUzODAxMTY5NTkwNjQzMjc0ODUzODAxMTY5NTkwNjQzMjc0ODUsCisuMjkyNTUzMDAyNjg2Mzc3NDA1Nzk0MzYwMTI5MjIwODc2ODQyNzM3MzAsICAgIC43NDYzNTU2ODUxMzExOTUzMzUyNzY5Njc5MzAwMjkxNTQ1MTg5NTA0LAorLjI5NTQ2NDIxMjg5MzgzNTg0MjUyMTYzOTI3ODg1NzAzNzQyNTA0MTMwLCAgICAuNzQ0MTg2MDQ2NTExNjI3OTA2OTc2NzQ0MTg2MDQ2NTExNjI3OTA3MCwKKy4yOTgzNjY5NzI1NTE3OTcyMjcwOTc4MzYxODQ4MzkyNTIzODI1MTY4MCwgICAgLjc0MjAyODk4NTUwNzI0NjM3NjgxMTU5NDIwMjg5ODU1MDcyNDYzNzcsCisuMzAxMjYxMzMwNTc4MTYxNzM0NTUwMjM1NDUxMDI0NDkxMzM5OTIyMDAsICAgIC43Mzk4ODQzOTMwNjM1ODM4MTUwMjg5MDE3MzQxMDQwNDYyNDI3NzQ2LAorLjMwNDE0NzMzNTQ2NzI5NjY2NDQ2ODUwNjE1MTAyNDQ4NTAwNjkyODUwLCAgICAuNzM3NzUyMTYxMzgzMjg1MzAyNTkzNjU5OTQyMzYzMTEyMzkxOTMwOCwKKy4zMDcwMjUwMzUyOTQ5MTE4MTg4ODM4ODk1MDkzNzk1MTQ0OTMwNDgzMCwgICAgLjczNTYzMjE4MzkwODA0NTk3NzAxMTQ5NDI1Mjg3MzU2MzIxODM5MDgsCisuMzA5ODk0NDc3NzIyODY0NjU4NTQyMDc5MDQxNTgxMDE4ODI3ODU1NTAsICAgIC43MzM1MjQzNTUzMDA4NTk1OTg4NTM4NjgxOTQ4NDI0MDY4NzY3OTA4LAorLjMxMjc1NTcxMDAwMzg5Njg0NzM5MzE3ODg1OTQyMDAwNDMwMDc3MzMwLCAgICAuNzMxNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNDI4NTcxNCwKKy4zMTU2MDg3Nzg5ODYzMDMyOTU1MjE3NjQ3NjY4MTc3OTYwNDQwNTE4MCwgICAgLjcyOTM0NDcyOTM0NDcyOTM0NDcyOTM0NDcyOTM0NDcyOTM0NDcyOTMsCisuMzE4NDUzNzMxMTE4NTM0NTg4Njk1NDY3ODQ2MjY0MzY0MTk3ODUwMzAsICAgIC43MjcyNzI3MjcyNzI3MjcyNzI3MjcyNzI3MjcyNzI3MjcyNzI3MjczLAorLjMyMTI5MDYxMjQ1MzczNDI0NzgyMjAxMjU0ODU2NzcyNzIwODEzNzUwLCAgICAuNzI1MjEyNDY0NTg5MjM1MTI3NDc4NzUzNTQxMDc2NDg3MjUyMTI0NiwKKy4zMjQxMTk0Njg2NTQyMTE5Mjg1Mzc3MzM5MTEwNzA5NzI2ODEwNDU1MCwgICAgLjcyMzE2Mzg0MTgwNzkwOTYwNDUxOTc3NDAxMTI5OTQzNTAyODI0ODYsCisuMzI2OTQwMzQ0OTk1ODUzMjgyNTcyNTM5OTEwNjg4NjQ3MDY5MDM3MDAsICAgIC43MjExMjY3NjA1NjMzODAyODE2OTAxNDA4NDUwNzA0MjI1MzUyMTEzLAorLjMyOTc1MzI4NjM3MjQ2Nzk3OTY5MjQwMjE5NTcyMzg0Mzc2MDc4ODUwLCAgICAuNzE5MTAxMTIzNTk1NTA1NjE3OTc3NTI4MDg5ODg3NjQwNDQ5NDM4MiwKKy4zMzI1NTgzMzczMDAwNzY1NTYzNTMxODk5NzE1NTk5MTM4Mjg5NjkwMCwgICAgLjcxNzA4NjgzNDczMzg5MzU1NzQyMjk2OTE4NzY3NTA3MDAyODAxMTIsCisuMzM1MzU1NTQxOTIxMTM3ODExOTExNTM1MjA5MjE5NDM3MDkyNTQyODAsICAgIC43MTUwODM3OTg4ODI2ODE1NjQyNDU4MTAwNTU4NjU5MjE3ODc3MDk1LAorLjMzODE0NDk0NDAwODcxNjM2MzgxNDY3MDU1Nzk4NTY2NDM0NTMyNDAwLCAgICAuNzEzMDkxOTIyMDA1NTcxMDMwNjQwNjY4NTIzNjc2ODgwMjIyODQxMiwKKy4zNDA5MjY1ODY5NzA1OTMxOTI4Mzc5NTI3NTYyMzU2MDg4MzEwNDgwMCwgICAgLjcxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEsCisuMzQzNzAwNTEzODUzMzE4NDAxMjEzOTU0MzAyODc1MjA4NjY4NDEwODAsICAgIC43MDkxNDEyNzQyMzgyMjcxNDY4MTQ0MDQ0MzIxMzI5NjM5ODg5MTk3LAorLjM0NjQ2Njc2NzM0NjIwODU3MDYzMjYyNjMzMzQ2MzEyMjEzNjg5MTAwLCAgICAuNzA3MTgyMzIwNDQxOTg4OTUwMjc2MjQzMDkzOTIyNjUxOTMzNzAxNywKKy4zNDkyMjUzODk3ODUyODgyNzYwMjMzMjI4NTA5NjA1Mzk2NTM4OTczMCwgICAgLjcwNTIzNDE1OTc3OTYxNDMyNTA2ODg3MDUyMzQxNTk3Nzk2MTQzMjUsCisuMzUxOTc2NDIzMTU3MTc4MTQyMDk4MTg5MjU1MTkzNTc0MzU0MDUyNTAsICAgIC43MDMyOTY3MDMyOTY3MDMyOTY3MDMyOTY3MDMyOTY3MDMyOTY3MDMzLAorLjM1NDcxOTkwOTEwMjkyODk5ODU2NzcwNTMyMDk2NTYxNTEwMTE1ODUwLCAgICAuNzAxMzY5ODYzMDEzNjk4NjMwMTM2OTg2MzAxMzY5ODYzMDEzNjk4NiwKKy4zNTc0NTU4ODg5MjE4MDM3NDM4NTE3NjgzMzEyOTY2MjU1NDcxMTEwMCwgICAgLjY5OTQ1MzU1MTkxMjU2ODMwNjAxMDkyODk2MTc0ODYzMzg3OTc4MTQsCisuMzYwMTg0NDAzNTc1MDA3NzQ5OTUzNTg0ODM0NjU2Nzk0NTU1NDg1MzAsICAgIC42OTc1NDc2ODM5MjM3MDU3MjIwNzA4NDQ2ODY2NDg1MDEzNjIzOTc4LAorLjM2MjkwNTQ5MzY4OTM2ODQxOTExOTAzNDU3MDAzMDYzNTIyMjc5MjgwLCAgICAuNjk1NjUyMTczOTEzMDQzNDc4MjYwODY5NTY1MjE3MzkxMzA0MzQ3OCwKKy4zNjU2MTkxOTk1NjA5NjQ2Njk0Mzc2MjM3OTc0MjExMTA3OTM5NDgzMCwgICAgLjY5Mzc2NjkzNzY2OTM3NjY5Mzc2NjkzNzY2OTM3NjY5Mzc2NjkzNzcsCisuMzY4MzI1NTYxMTU4NzA3NjI2MTQxNTA2MzUyNzIzODA4OTU5MTI2NTAsICAgIC42OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE4OTE5LAorLjM3MTAyNDYxODEyNzg3MjYyOTYyNDg3NDg4OTQ4NjgxODU3NDM2OTAwLCAgICAuNjkwMDI2OTU0MTc3ODk3NTc0MTIzOTg5MjE4MzI4ODQwOTcwMzUwNCwKKy4zNzM3MTY0MDk3OTM1ODQwNTg5ODQ4MDU1NTE1MTc2MzgzNzc4NDUzMCwgICAgLjY4ODE3MjA0MzAxMDc1MjY4ODE3MjA0MzAxMDc1MjY4ODE3MjA0MzAsCisuMzc2NDAwOTc1MTY0MjUzMDI2NTk0NzA3MzA3NTk0OTQ0NzIyOTUwNTAsICAgIC42ODYzMjcwNzc3NDc5ODkyNzYxMzk0MTAxODc2Njc1NjAzMjE3MTU4LAorLjM3OTA3ODM1MjkzNDk2OTQ0MjUxMTQ1OTE5MjI0NjU0NzkwMDE0MDMwLCAgICAuNjg0NDkxOTc4NjA5NjI1NjY4NDQ5MTk3ODYwOTYyNTY2ODQ0OTE5OCwKKy4zODE3NDg1ODE0OTA4NDgzMzc2OTM5MzI5OTAwNzc4ODMwMDUxNDIzMCwgICAgLjY4MjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjcsCisuMzg0NDExNjk4OTEwMzMyMDAwMzQ1MTM1ODM4ODcwMTkxOTQ2NjI1ODAsICAgIC42ODA4NTEwNjM4Mjk3ODcyMzQwNDI1NTMxOTE0ODkzNjE3MDIxMjc3LAorLjM4NzA2Nzc0Mjk2ODQ0ODI1ODQ0NDg4MDEzODk5NTM1ODcyMDQyMTgwLCAgICAuNjc5MDQ1MDkyODM4MTk2Mjg2NDcyMTQ4NTQxMTE0MDU4MzU1NDM3NywKKy4zODk3MTY3NTExNDAwMjUxODYwMjg3MzY5MjU0MzY1MzMwNTYxOTk1MCwgICAgLjY3NzI0ODY3NzI0ODY3NzI0ODY3NzI0ODY3NzI0ODY3NzI0ODY3NzIsCisuMzkyMzU4NzYwNjAyODYzODQzMDM2NjU4NDA4ODkxNTI2MDUwODY1ODAsICAgIC42NzU0NjE3NDE0MjQ4MDIxMTA4MTc5NDE5NTI1MDY1OTYzMDYwNjg2LAorLjM5NDk5MzgwODI0MDg2ODkzNzcwODk2NzIyMzQ0MzMyMzc0NjMyMzUwLCAgICAuNjczNjg0MjEwNTI2MzE1Nzg5NDczNjg0MjEwNTI2MzE1Nzg5NDczNywKKy4zOTc2MjE5MzA2NDcxMzg0NjYyNDE1ODU3NzQ2OTY0MzIwNTQwNDI4MCwgICAgLjY3MTkxNjAxMDQ5ODY4NzY2NDA0MTk5NDc1MDY1NjE2Nzk3OTAwMjYsCisuNDAwMjQzMTY0MTI3MDEyNjYyNzY3NDEzMDc1OTI2MDE1MTUzNTI3MzAsICAgIC42NzAxNTcwNjgwNjI4MjcyMjUxMzA4OTAwNTIzNTYwMjA5NDI0MDg0LAorLjQwMjg1NzU0NDcwMTA4MzQ4MDkwOTE3NjE1OTkxMjAyMTgzMDY3ODAwLCAgICAuNjY4NDA3MzEwNzA0OTYwODM1NTA5MTM4MzgxMjAxMDQ0Mzg2NDIzMCwKKy40MDU0NjUxMDgxMDgxNjQzMjkzNDc5OTk5MTAxNjkxNjQ2NTAxNDIzMCwgICAgLjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjcsCisuNDA4MDY1ODg5ODA4MjIxNzI2NzQyMjMyMjQ5MzA3NTYyNTk3MDk2MDAsICAgIC42NjQ5MzUwNjQ5MzUwNjQ5MzUwNjQ5MzUwNjQ5MzUwNjQ5MzUwNjQ5LAorLjQxMDY1OTkyNDk4NTI2ODM3NjM5NjE2MzYwMzIwMzYwMzk5NzgyNjUwLCAgICAuNjYzMjEyNDM1MjMzMTYwNjIxNzYxNjU4MDMxMDg4MDgyOTAxNTU0NCwKKy40MTMyNDcyNDg1NTAyMTkzMjYwMTMxNzc1Nzg3MTU4NDAzNTQ1NjE4MCwgICAgLjY2MTQ5ODcwODAxMDMzNTkxNzMxMjY2MTQ5ODcwODAxMDMzNTkxNzMsCisuNDE1ODI3ODk1MTQzNzEwOTM0OTc3NTc2Njk4NjU2Nzc1OTg4NjM4NTAsICAgIC42NTk3OTM4MTQ0MzI5ODk2OTA3MjE2NDk0ODQ1MzYwODI0NzQyMjY4LAorLjQxODQwMTg5OTEzODg4MzgxNDg5OTI1OTA1MDQzNDkyMDkzNjgyMzAwLCAgICAuNjU4MDk3Njg2Mzc1MzIxMzM2NzYwOTI1NDQ5ODcxNDY1Mjk1NjI5OCwKKy40MjA5NjkyOTQ2NDQxMjk2MzIzOTg5NDMzODU4NTE0NTMwNTg0MjE1MCwgICAgLjY1NjQxMDI1NjQxMDI1NjQxMDI1NjQxMDI1NjQxMDI1NjQxMDI1NjQsCisuNDIzNTMwMTE1NTA1ODAzMjcyOTM1MDI1OTE2MDEyODE4OTI1MDgyODAsICAgIC42NTQ3MzE0NTc4MDA1MTE1MDg5NTE0MDY2NDk2MTYzNjgyODY0NDUwLAorLjQyNjA4NDM5NTMxMDkwMDAzMjYwNTE2MTQxMzgxMjMxMTM2NjIwMDUwLCAgICAuNjUzMDYxMjI0NDg5Nzk1OTE4MzY3MzQ2OTM4Nzc1NTEwMjA0MDgxNiwKKy40Mjg2MzIxNjczODk2OTg3MjYxMDA5ODgzMjQxMDU4NTYwMDg4Mjc4MCwgICAgLjY1MTM5OTQ5MTA5NDE0NzU4MjY5NzIwMTAxNzgxMTcwNDgzNDYwNTYsCisuNDMxMTczNDY0ODE4MzcxMzIxNDM4NjYxNDI1NDE4MTA0MDQ1MDkzMDAsICAgIC42NDk3NDYxOTI4OTM0MDEwMTUyMjg0MjYzOTU5MzkwODYyOTQ0MTYyLAorLjQzMzcwODMyMDQyMTU1OTM3OTAyMDk0ODE5OTQ2Nzk2NjMzMzAzMTgwLCAgICAuNjQ4MTAxMjY1ODIyNzg0ODEwMTI2NTgyMjc4NDgxMDEyNjU4MjI3OCwKKy40MzYyMzY3NjY3NzQ5MTgwMTY2NzU4NTQ5MTQ4NjUzNDAxMDYxODkzMCwgICAgLjY0NjQ2NDY0NjQ2NDY0NjQ2NDY0NjQ2NDY0NjQ2NDY0NjQ2NDY0NjUsCisuNDM4NzU4ODM2MjA3NjI3OTAwMjcyMTQzNTA2Mjk5NDcxNDgyNjM0NTAsICAgIC42NDQ4MzYyNzIwNDAzMDIyNjcwMDI1MTg4OTE2ODc2NTc0MzA3MzA1LAorLjQ0MTI3NDU2MDgwNDg3NTIwNDQwMDU4ODAxNzk2MTEyNjc1MjE5NzgwLCAgICAuNjQzMjE2MDgwNDAyMDEwMDUwMjUxMjU2MjgxNDA3MDM1MTc1ODc5NCwKKy40NDM3ODM5NzI0MTAzMDA5MzA4OTk3NTEzOTI2NDQyNDc5NzE0NzUwMCwgICAgLjY0MTYwNDAxMDAyNTA2MjY1NjY0MTYwNDAxMDAyNTA2MjY1NjY0MTYsCisuNDQ2Mjg3MTAyNjI4NDE5NDc0MjAzOTgwMTQ0MDExNDM4ODI0MjM2NTAsICAgIC42NDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLAorLjQ0ODc4Mzk4MjgyNzAwNjY1NTU1ODIyMTgzNzA1NDU4ODgzMTk2MTMwLCAgICAuNjM4NDAzOTkwMDI0OTM3NjU1ODYwMzQ5MTI3MTgyMDQ0ODg3NzgwNSwKKy40NTEyNzQ2NDQxMzk0NTg1NTgzNjcyOTQ5MjY5Mzg0ODQ0MjI4NjI1MCwgICAgLjYzNjgxNTkyMDM5ODAwOTk1MDI0ODc1NjIxODkwNTQ3MjYzNjgxNTksCisuNDUzNzU5MTE3NDY3MTIwNDk4NTQ1Nzk2MTgxMTMzNDgyNjA1MjE5MDAsICAgIC42MzUyMzU3MzIwMDk5MjU1NTgzMTI2NTUwODY4NDg2MzUyMzU3MzIwLAorLjQ1NjIzNzQzMzQ4MTU4NzU3MzE1ODU3NzY5NzU0MDc0OTc5NTczNTAwLCAgICAuNjMzNjYzMzY2MzM2NjMzNjYzMzY2MzM2NjMzNjYzMzY2MzM2NjMzNywKKy40NTg3MDk2MjI2MjY5NzY2MjA4MTgzMzk4MjQ4MzY1ODQ3MzkzODcwMCwgICAgLjYzMjA5ODc2NTQzMjA5ODc2NTQzMjA5ODc2NTQzMjA5ODc2NTQzMjEsCisuNDYxMTc1NzE1MTIyMTcwMTQ4OTUxODUyMjk3NjE0MDk1NzMyNTY5ODAsICAgIC42MzA1NDE4NzE5MjExODIyNjYwMDk4NTIyMTY3NDg3Njg0NzI5MDY0LAorLjQ2MzYzNTc0MDk2MzAzMjUwNTQ5MDU1OTc0MjYxMTM2NzI1NTQ0OTMwLCAgICAuNjI4OTkyNjI4OTkyNjI4OTkyNjI4OTkyNjI4OTkyNjI4OTkyNjI5MCwKKy40NjYwODk3Mjk5MjQ1OTkxODMxNjM5OTEyNTYxNTEzNDgzNTI0MzIzMCwgICAgLjYyNzQ1MDk4MDM5MjE1Njg2Mjc0NTA5ODAzOTIxNTY4NjI3NDUwOTgsCisuNDY4NTM3NzExNTYzMjM5MjU2Mzk1OTc0MDUyNzkzNDYyNzYwNzQ2NTAsICAgIC42MjU5MTY4NzA0MTU2NDc5MjE3NjAzOTExOTgwNDQwMDk3Nzk5NTExLAorLjQ3MDk3OTcxNTIxODc5MTAwNjMxNDgwMjQxNjQ1NDc2NzgwODMxODMwLCAgICAuNjI0MzkwMjQzOTAyNDM5MDI0MzkwMjQzOTAyNDM5MDI0MzkwMjQzOSwKKy40NzM0MTU3NzAwMTY2NzIxMjE2NTYxNDI3MzU0NDYzMzc2MTA0ODMzMCwgICAgLjYyMjg3MTA0NjIyODcxMDQ2MjI4NzEwNDYyMjg3MTA0NjIyODcxMDUsCisuNDc1ODQ1OTA0ODY5OTYzODY0OTM2MDExMDc3NTg4NzczMzMyNTM2MzAsICAgIC42MjEzNTkyMjMzMDA5NzA4NzM3ODY0MDc3NjY5OTAyOTEyNjIxMzU5LAorLjQ3ODI3MDE0ODQ4MTQ3MDI1ODYwNTY5NjY5OTMwNTU1MzkyMDU2NzAwLCAgICAuNjE5ODU0NzIxNTQ5NjM2ODAzODc0MDkyMDA5Njg1MjMwMDI0MjEzMSwKKy40ODA2ODg1MjkzNDU3NTE5MDI2MTA1NzI4Njk4ODk0MzgxNTIzMTMzMCwgICAgLjYxODM1NzQ4NzkyMjcwNTMxNDAwOTY2MTgzNTc0ODc5MjI3MDUzMTQsCisuNDgzMTAxMDc1NzUxMTM1ODExMTMxNTc1NzkyMzg3NTkzNTM3NTY5MDAsICAgIC42MTY4Njc0Njk4Nzk1MTgwNzIyODkxNTY2MjY1MDYwMjQwOTYzODU1LAorLjQ4NTUwNzgxNTc4MTcwMDc2ODkwODk5MDUzOTc4NTAwODg3NzUxNTgwLCAgICAuNjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1Mzg0NjE1NCwKKy40ODc5MDg3NzczMTkyMzg5Mjg3OTM1MTAwMTI4Mzc5NDE3NTgzMzQ4MCwgICAgLjYxMzkwODg3MjkwMTY3ODY1NzA3NDM0MDUyNzU3NzkzNzY0OTg4MDEsCisuNDkwMzAzOTg4MDQ1MTkzODE3MDU4MDIwNjEzMzMwODgyMDQyNjQ2NTAsICAgIC42MTI0NDAxOTEzODc1NTk4MDg2MTI0NDAxOTEzODc1NTk4MDg2MTI0LAorLjQ5MjY5MzQ3NTQ0MjU3NTI0NjA3MDQ3NTcxNDA3NzQ3NDU0OTQxMjgwLCAgICAuNjEwOTc4NTIwMjg2Mzk2MTgxMzg0MjQ4MjEwMDIzODY2MzQ4NDQ4NywKKy40OTUwNzcyNjY3OTc4NTE0NjczOTQ3NjQzMTMyMTIzNjMwNDkzODgwMCwgICAgLjYwOTUyMzgwOTUyMzgwOTUyMzgwOTUyMzgwOTUyMzgwOTUyMzgwOTUsCisuNDk3NDU1Mzg5MjAyODE4ODk4Mzg2NDgyMjYwMzIwOTE3NzAzMjExMzAsICAgIC42MDgwNzYwMDk1MDExODc2NDg0NTYwNTcwMDcxMjU4OTA3MzYzNDIwLAorLjQ5OTgyNzg2OTU1NjQ0OTMxMTI2MTMwMzU5MTg5MTE5MTg5OTc3NjUwLCAgICAuNjA2NjM1MDcxMDkwMDQ3MzkzMzY0OTI4OTA5OTUyNjA2NjM1MDcxMSwKKy41MDIxOTQ3MzQ1NjY3MTU0ODM4MzY2NzQxMzg3Mjg5OTQ4NzYxNDY1MCwgICAgLjYwNTIwMDk0NTYyNjQ3NzU0MTM3MTE1ODM5MjQzNDk4ODE3OTY2OTAsCisuNTA0NTU2MDEwNzUyMzk1MjAwOTI0NTI0OTQyODIwNDI2MDc2NjUwNTAsICAgIC42MDM3NzM1ODQ5MDU2NjAzNzczNTg0OTA1NjYwMzc3MzU4NDkwNTY2LAorLjUwNjkxMTcyNDQ0NDg1NDMyODAxOTk3MTQ4OTk5MzYyMjUyNjUyNjUwLCAgICAuNjAyMzUyOTQxMTc2NDcwNTg4MjM1Mjk0MTE3NjQ3MDU4ODIzNTI5NCwKKy41MDkyNjE5MDE3ODk4MDc5MDI1NzQxMjUzNjQ0ODEwMDU4MTc2NTE1MCwgICAgLjYwMDkzODk2NzEzNjE1MDIzNDc0MTc4NDAzNzU1ODY4NTQ0NjAwOTQsCisuNTExNjA2NTY4NzQ5MDYyMDczOTE5NzMxMTE5NTMxMjA2Nzg2NjMyNTAsICAgIC41OTk1MzE2MTU5MjUwNTg1NDgwMDkzNjc2ODE0OTg4MjkwMzk4MTI2LAorLjUxMzk0NTc1MTEwMjIzNDI4MjgyNTUyMDQ5NDk1Mjc5Nzg4OTcwOTUwLCAgICAuNTk4MTMwODQxMTIxNDk1MzI3MTAyODAzNzM4MzE3NzU3MDA5MzQ1OCwKKy41MTYyNzk0NzQ0NDg0NTQ0NTYyMzY4NDU1NDQ0ODExODQzMzM1NjMwMCwgICAgLjU5NjczNjU5NjczNjU5NjczNjU5NjczNjU5NjczNjU5NjczNjU5NjcsCisuNTE4NjA3NzY0MjA4MDQ1NTUxODY4MDUzNzM1MjMzODQzMzI2NTY4NTAsICAgIC41OTUzNDg4MzcyMDkzMDIzMjU1ODEzOTUzNDg4MzcyMDkzMDIzMjU2LAorLjUyMDkzMDY0NTYyNDE4NTIyOTAwMzQ0NDQxOTUwNDM3NjEyODMxNjAwLCAgICAuNTkzOTY3NTE3NDAxMzkyMTExMzY4OTA5NTEyNzYxMDIwODgxNjcwNSwKKy41MjMyNDgxNDM3NjQ1NDc3NTczMjgzODY5Nzg3NzAxNDA1NTg0ODEwMCwgICAgLjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjU5MjYsCisuNTI1NTYwMjgzNTIyOTI3Mjc0MDEzNjI1MjY1MDcwMDA0Mzg4NjkwMDAsICAgIC41OTEyMjQwMTg0NzU3NTA1NzczNjcyMDU1NDI3MjUxNzMyMTAxNjE3LAorLjUyNzg2NzA4OTYyMDg0MjI3ODAzMDQ2NTg3NzIzNjU2NTU3NTAwMzUwLCAgICAuNTg5ODYxNzUxMTUyMDczNzMyNzE4ODk0MDA5MjE2NTg5ODYxNzUxMiwKKy41MzAxNjg1ODY2MDkxMjE1ODM3NDE0NTUxOTcwMTQxNDc0MTU3NTcwMCwgICAgLjU4ODUwNTc0NzEyNjQzNjc4MTYwOTE5NTQwMjI5ODg1MDU3NDcxMjYsCisuNTMyNDY0Nzk4ODY5NDcxNzMzNzY2NTQ1MTg1MDYyNTY4NjM0NzQ4NTAsICAgIC41ODcxNTU5NjMzMDI3NTIyOTM1Nzc5ODE2NTEzNzYxNDY3ODg5OTA4LAorLjUzNDc1NTc1MDYxNjAyNzY0NzQ4MTU4NzMzNzA5NzE1MzA2NzU4OTAwLCAgICAuNTg1ODEyMzU2OTc5NDA1MDM0MzI0OTQyNzkxNzYyMDEzNzI5OTc3MSwKKy41MzcwNDE0NjU4OTY4ODM2MTg1NjkyOTA3NzQ3NTc5NzM4NDk3NzM1MCwgICAgLjU4NDQ3NDg4NTg0NDc0ODg1ODQ0NzQ4ODU4NDQ3NDg4NTg0NDc0ODksCisuNTM5MzIxOTY4NTk1NjA4NzY5NDQ3ODM1NTg0Mjg3NTMxNjczOTA4MDAsICAgIC41ODMxNDM1MDc5NzI2NjUxNDgwNjM3ODEzMjExODQ1MTAyNTA1Njk1LAorLjU0MTU5NzI4MjQzMjc0NDI5ODA0MTg4MjMwMjY0MTE3MDA5OTM3NzUwLCAgICAuNTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxODE4MTgxOCwKKy41NDM4Njc0MzA5NjcyODM1MTYwOTY2OTk3MTM2NzExMTQyOTU3MjEwMCwgICAgLjU4MDQ5ODg2NjIxMzE1MTkyNzQzNzY0MTcyMzM1NjAwOTA3MDI5NDgsCisuNTQ2MTMyNDM3NTk4MTM1NTY3MjEzODMwNjU0NTA5MzY1NTU4NjI0NTAsICAgIC41NzkxODU1MjAzNjE5OTA5NTAyMjYyNDQzNDM4OTE0MDI3MTQ5MzIxLAorLjU0ODM5MjMyNTU2NTU3MzE1NzY3NTIwMzIxOTY5NjQxMzcyNTYxNDUwLCAgICAuNTc3ODc4MTAzODM3NDcxNzgzMjk1NzExMDYwOTQ4MDgxMjY0MTA4NCwKKy41NTA2NDcxMTc5NTI2NjIxOTA2MzE5NDA1NzUyNTgzNDA2ODY1NTk1MCwgICAgLjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjU3NjYsCisuNTUyODk2ODM3Njg2Njc3NjMzNTI3NjY1NDIwODQyODIyNjQxMTM0NTAsICAgIC41NzUyODA4OTg4NzY0MDQ0OTQzODIwMjI0NzE5MTAxMTIzNTk1NTA2LAorLjU1NTE0MTUwNzU0MDUwMTUxMDkzMTEwNzk4NjgzNDgzMTUzNTgxNjAwLCAgICAuNTczOTkxMDMxMzkwMTM0NTI5MTQ3OTgyMDYyNzgwMjY5MDU4Mjk2MCwKKy41NTczODExNTAxMzQwMDYzNTM0NDcwOTE0NDE5MjE2NTY5NTEzMDg1MCwgICAgLjU3MjcwNjkzNTEyMzA0MjUwNTU5Mjg0MTE2MzMxMDk2MTk2ODY4MDEsCisuNTU5NjE1Nzg3OTM1NDIyNjU5NDE1OTYyNjk4NDAzNzQ1ODg5NjYzNTAsICAgIC41NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0Mjg1NzE0LAorLjU2MTg0NTQ0MzI2MjY5MTgxMjY5MTQwMDYyNzk1NDg2MzAxMTgzNzAwLCAgICAuNTcwMTU1OTAyMDA0NDU0MzQyOTg0NDA5Nzk5NTU0NTY1NzAxNTU5MCwKKy41NjQwNzAxMzgyODQ4MDI5MDIxODQzNjcyMTI2MTI0MTQ3MzI1NzU1MCwgICAgLjU2ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODksCisuNTY2Mjg5ODk1MDIzMTE1Nzc0NjQxNTUzMzQzODI2NjcyMDYyMjc4MDAsICAgIC41Njc2Mjc0OTQ0NTY3NjI3NDk0NDU2NzYyNzQ5NDQ1Njc2Mjc0OTQ1LAorLjU2ODUwNDczNTM1MjY2ODY1NTMyMzc4MjMzMTgzNDA4MTU2MDM3MzUwLCAgICAuNTY2MzcxNjgxNDE1OTI5MjAzNTM5ODIzMDA4ODQ5NTU3NTIyMTIzOSwKKy41NzA3MTQ2ODEwMDM0NzE0NDY4MDczOTU3NTA1MTEyMDQ4MjM4NTE1MCwgICAgLjU2NTEyMTQxMjgwMzUzMjAwODgzMDAyMjA3NTA1NTE4NzYzNzk2OTEsCisuNTcyOTE5NzUzNTYxNzg1NDgzMDY0NzM4ODU1MzE4ODY0ODA3NDg2NTAsICAgIC41NjM4NzY2NTE5ODIzNzg4NTQ2MjU1NTA2NjA3OTI5NTE1NDE4NTAyLAorLjU3NTExOTk3NDQ3MTM4Nzg1MTQ0NDYwMzcxMTU3MDM4MDI1NTU4MDAwLCAgICAuNTYyNjM3MzYyNjM3MzYyNjM3MzYyNjM3MzYyNjM3MzYyNjM3MzYyNiwKKy41NzczMTUzNjUwMzQ4MjM1MDIxOTk0MDE0NDU5Nzc4NTU0NzM3NTcwMCwgICAgLjU2MTQwMzUwODc3MTkyOTgyNDU2MTQwMzUwODc3MTkyOTgyNDU2MTQsCisuNTc5NTA1OTQ2NDE0NjQyMTQ3OTU2ODk3MTMzNTUzODY2Mjk3MDA2NTAsICAgIC41NjAxNzUwNTQ3MDQ1OTUxODU5OTU2MjM2MzIzODUxMjAzNTAxMDk0LAorLjU4MTY5MTczOTYzNDYyMjM5NTYyNzE2MTQ5NTIxMjkzMTE4NTk2MTAwLCAgICAuNTU4OTUxOTY1MDY1NTAyMTgzNDA2MTEzNTM3MTE3OTAzOTMwMTMxMCwKKy41ODM4NzI3NjU1ODA5ODI2NjY2NTU1Mjk1NTYwMTAxNTEyODE5NTMwMCwgICAgLjU1NzczNDIwNDc5MzAyODMyMjQ0MDA4NzE0NTk2OTQ5ODkxMDY3NTQsCisuNTg2MDQ5MDQ1MDAzNTc4MTI4NDY1NDQ5MDI2NDA3NDQxMTI0MzIwMDAsICAgIC41NTY1MjE3MzkxMzA0MzQ3ODI2MDg2OTU2NTIxNzM5MTMwNDM0NzgzLAorLjU4ODIyMDU5ODUxNzA4NTk2ODU1OTU3MDExOTM5NjA4NDkxOTU3MjAwLCAgICAuNTU1MzE0NTMzNjIyNTU5NjUyOTI4NDE2NDg1OTAwMjE2OTE5NzM5NywKKy41OTAzODc0NDY2MDIxNzYzNDY3NDM4MTc3MDMwOTk5MjEzNDU3MTEwMCwgICAgLjU1NDExMjU1NDExMjU1NDExMjU1NDExMjU1NDExMjU1NDExMjU1NDEsCisuNTkyNTQ5NjA5NjA2NjcxNTc4OTg3NDAyNDI2NzE5MTk5ODY2MDU2NTAsICAgIC41NTI5MTU3NjY3Mzg2NjA5MDcxMjc0Mjk4MDU2MTU1NTA3NTU5Mzk1LAorLjU5NDcwNzEwNzc0NjY5Mjc3NTc2MjY1MzU4MjIwNTUzMDI1NjAzMzAwLCAgICAuNTUxNzI0MTM3OTMxMDM0NDgyNzU4NjIwNjg5NjU1MTcyNDEzNzkzMSwKKy41OTY4NTk5NjExMDc3OTM4MjM4NDIzNzEyMzkxNTIyNzEzMDA1NTQ1MCwgICAgLjU1MDUzNzYzNDQwODYwMjE1MDUzNzYzNDQwODYwMjE1MDUzNzYzNDQsCisuNTk5MDA4MTg5NjQ2MDgzMzc3Njg4NTEyNDI3OTk0MjgyOTE2MTg4MDAsICAgIC41NDkzNTYyMjMxNzU5NjU2NjUyMzYwNTE1MDIxNDU5MjI3NDY3ODExLAorLjYwMTE1MTgxMzE4OTMzNDc0OTQwOTkwODkwOTAwMTM4NzY1NTczNTAwLCAgICAuNTQ4MTc5ODcxNTIwMzQyNjEyNDE5NzAwMjE0MTMyNzYyMzEyNjMzOCwKKy42MDMyOTA4NTE0MzgwODQyNTI0MDA1Mjg4Mzk2NDM4MTE4MDcwMzY1MCwgICAgLjU0NzAwODU0NzAwODU0NzAwODU0NzAwODU0NzAwODU0NzAwODU0NzAsCisuNjA1NDI1MzIzOTY2NzE2ODg4NDM1MjU3NzE1MTczMDY1NjYyMzg0MDAsICAgIC41NDU4NDIyMTc0ODQwMDg1Mjg3ODQ2NDgxODc2MzMyNjIyNjAxMjc5LAorLjYwNzU1NTI1MDIyNDU0MTcwOTY5MTU1MDI5NTI0Njk5Nzg0ODE1MzAwLCAgICAuNTQ0NjgwODUxMDYzODI5Nzg3MjM0MDQyNTUzMTkxNDg5MzYxNzAyMSwKKy42MDk2ODA2NDk1MzY4NTUxOTAzNjI0MTY1Nzg4NjQyMTMwNzkyMTQwMCwgICAgLjU0MzUyNDQxNjEzNTg4MTEwNDAzMzk3MDI3NjAwODQ5MjU2OTAwMjEsCisuNjExODAxNTQxMTA1OTkyODI5OTA1MzQ2NzUyNjM5MTYxNDIyODQ4NTAsICAgIC41NDIzNzI4ODEzNTU5MzIyMDMzODk4MzA1MDg0NzQ1NzYyNzExODY0LAorLjYxMzkxNzk0NDAxMjM3MDQzMTIxNzEwNzEyNTEyMTQwMTYyMjg5MTUwLCAgICAuNTQxMjI2MjE1NjQ0ODIwMjk1OTgzMDg2NjgwNzYxMDk5MzY1NzUwNSwKKy42MTYwMjk4NzcyMTU1MTM5NDM1MTEzODI0MjIwMDI0OTgwNjA0NjUwMCwgICAgLjU0MDA4NDM4ODE4NTY1NDAwODQzODgxODU2NTQwMDg0Mzg4MTg1NjUsCisuNjE4MTM3MzU5NTU1MDc4NjQ3MDU1MzgxNjc5ODIwMTI5NjQ3ODUxMDAsICAgIC41Mzg5NDczNjg0MjEwNTI2MzE1Nzg5NDczNjg0MjEwNTI2MzE1Nzg5LAorLjYyMDI0MDQwOTc1MTg1NzQ1NzcyMDgwMjgxMzEyODEwMjU3MDc3MjAwLCAgICAuNTM3ODE1MTI2MDUwNDIwMTY4MDY3MjI2ODkwNzU2MzAyNTIxMDA4NCwKKy42MjIzMzkwNDY0MDg3Nzg2ODQ0MTYwNjMyNDI2NzkyMjkwMDYxNzEwMCwgICAgLjUzNjY4NzYzMTAyNzI1MzY2ODc2MzEwMjcyNTM2Njg3NjMxMDI3MjUsCisuNjI0NDMzMjg4MDExODkzNDYxNDQ0NDAxNTA5NjUyMzc5OTAwMjE3MDAsICAgIC41MzU1NjQ4NTM1NTY0ODUzNTU2NDg1MzU1NjQ4NTM1NTY0ODUzNTU2LAorLjYyNjUyMzE1MjkzMTM1Mjc0NDc2NTU0NzQxMzQwODA1Nzc2NDE3MjUwLCAgICAuNTM0NDQ2NzY0MDkxODU4MDM3NTc4Mjg4MTAwMjA4NzY4MjY3MjIzNCwKKy42Mjg2MDg2NTk0MjIzNzQwOTQyMDU1NjU1OTc4MDM3OTc1NzI4NTEwMCwgICAgLjUzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMsCisuNjMwNjg5ODI1NjI2MTk4Njg1NzA0MDgyNDM2MTMyMDExOTM1MTE1MDAsICAgIC41MzIyMjQ1MzIyMjQ1MzIyMjQ1MzIyMjQ1MzIyMjQ1MzIyMjQ1MzIyLAorLjYzMjc2NjY2OTU3MTAzNzc3NjQ0Mjc3ODk3NzA3MDcwMjIzOTg3MTAwLCAgICAuNTMxMTIwMzMxOTUwMjA3NDY4ODc5NjY4MDQ5NzkyNTMxMTIwMzMyMCwKKy42MzQ4MzkyMDkxNzMwMTAxNzcxNjczODQ0MjY4NjYxOTIzNzA2NTMwMCwgICAgLjUzMDAyMDcwMzkzMzc0NzQxMjAwODI4MTU3MzQ5ODk2NDgwMzMxMjYsCisuNjM2OTA3NDYyMjM3MDY5MTc3MzkwOTM1NjkyNTI4NzI4Mzk1NzAwNTAsICAgIC41Mjg5MjU2MTk4MzQ3MTA3NDM4MDE2NTI4OTI1NjE5ODM0NzEwNzQ0LAorLjYzODk3MTQ0NjQ1NzkyMDY5OTgzNTE0MjM4NjI5MTQwODkxMTM0NzUwLCAgICAuNTI3ODM1MDUxNTQ2MzkxNzUyNTc3MzE5NTg3NjI4ODY1OTc5MzgxNCwKKy42NDEwMzExNzk0MjA5MzEyNDA4MTk5MjUyNzg2Mjg5NDM0ODgwMDIwMCwgICAgLjUyNjc0ODk3MTE5MzQxNTYzNzg2MDA4MjMwNDUyNjc0ODk3MTE5MzQsCisuNjQzMDg2Njc4NjAzMDI3MjYxOTM1NjY1MTM3NTcxMDQ5ODU0MTU5NTAsICAgIC41MjU2NjczNTExMjkzNjM0NDk2OTE5OTE3ODY0NDc2Mzg2MDM2OTYxLAorLjY0NTEzNzk2MTM3MzU4NDcwMDczMDUzMjQwNDEyMjY0MTMxMDA5NjAwLCAgICAuNTI0NTkwMTYzOTM0NDI2MjI5NTA4MTk2NzIxMzExNDc1NDA5ODM2MSwKKy42NDcxODUwNDQ5OTUzMDk0ODg1OTEzMTc0MDM5MTYwMzY3MTAxNDMwMCwgICAgLjUyMzUxNzM4MjQxMzA4NzkzNDU2MDMyNzE5ODM2NDAwODE3OTk1OTEsCisuNjQ5MjI3OTQ2NjI1MTA5NzQxOTUxNTc1ODcwMTg5MTE3MjY3NzI4MDAsICAgIC41MjI0NDg5Nzk1OTE4MzY3MzQ2OTM4Nzc1NTEwMjA0MDgxNjMyNjUzLAorLjY1MTI2NjY4MzMxNDk1ODA3MjUxNDg1NTMwMjg3MDI3MzU5MDA4ODAwLCAgICAuNTIxMzg0OTI4NzE2OTA0Mjc2OTg1NzQzMzgwODU1Mzk3MTQ4Njc2MiwKKy42NTMzMDEyNzIwMTI3NDU1NzA4MDUyMzY2Mzg5ODkyOTk1MzU3NTE1MCwgICAgLjUyMDMyNTIwMzI1MjAzMjUyMDMyNTIwMzI1MjAzMjUyMDMyNTIwMzMsCisuNjU1MzMxNzI5NTYzMTI3NTc0MDY3NDkzNjk2OTI5ODg2OTM3MTQxNTAsICAgIC41MTkyNjk3NzY4NzYyNjc3NDg0Nzg3MDE4MjU1NTc4MDkzMzA2Mjg4LAorLjY1NzM1ODA3MjcwODM1OTk5NzI3MTU0MzMwNjg1MTUyNjcyMjMxMjAwLCAgICAuNTE4MjE4NjIzNDgxNzgxMzc2NTE4MjE4NjIzNDgxNzgxMzc2NTE4MiwKKy42NTkzODAzMTgwODkxMjc3ODE1MzM0MjA2MDI0OTk5NzMwMjg4OTgwMCwgICAgLjUxNzE3MTcxNzE3MTcxNzE3MTcxNzE3MTcxNzE3MTcxNzE3MTcxNzIsCisuNjYxMzk4NDgyMjQ1MzY0OTA0ODQxMjY3MTYxODI4MDAwMDk4NDY3MDAsICAgIC41MTYxMjkwMzIyNTgwNjQ1MTYxMjkwMzIyNTgwNjQ1MTYxMjkwMzIzLAorLjY2MzQxMjU4MTYxNzA2NjE3NzEzMDkzNjkyMTQ1Nzc2MDAzNTk5MTUwLCAgICAuNTE1MDkwNTQzMjU5NTU3MzQ0MDY0Mzg2MzE3OTA3NDQ0NjY4MDA4MCwKKy42NjU0MjI2MzI1NDUwOTAzNzU2MjIwMTAwMTQ5MjIxMjUyNjUwMDI1MCwgICAgLjUxNDA1NjIyNDg5OTU5ODM5MzU3NDI5NzE4ODc1NTAyMDA4MDMyMTMsCisuNjY3NDI4NjUxMjcxOTU2MTYzNzA0MTQ2NTQ3Mzg4NTE4MjI5MTI3MDAsICAgIC41MTMwMjYwNTIxMDQyMDg0MTY4MzM2NjczMzQ2NjkzMzg2NzczNTQ3LAorLjY2OTQzMDY1Mzk0MjYyOTIzOTA2MTU0NTgzMTY0NjA3MTc0Njk0NTUwLCAgICAuNTEyMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCwKKy42NzE0Mjg2NTY2MDUzMDIyNjUzNDc3NDU1NjA1NzUyNzY2MTMyMzU1MCwgICAgLjUxMDk3ODA0MzkxMjE3NTY0ODcwMjU5NDgxMDM3OTI0MTUxNjk2NjEsCisuNjczNDIyNjc1MjEyMTY2Njk5MjMyMzQxMjE1OTc0ODg0MTA3NzA5MDAsICAgIC41MDk5NjAxNTkzNjI1NDk4MDA3OTY4MTI3NDkwMDM5ODQwNjM3NDUwLAorLjY3NTQxMjcyNTYyMDE3NjYyMzg0MTkyODE3NjI2MTcxNzQ1MzU5OTAwLCAgICAuNTA4OTQ2MzIyMDY3NTk0NDMzMzk5NjAyMzg1Njg1ODg0NjkxODQ4OSwKKy42NzczOTg4MjM1OTE4MDYwMzE4ODUxOTg1MzU3NDY4OTQ3NzY4MjEwMCwgICAgLjUwNzkzNjUwNzkzNjUwNzkzNjUwNzkzNjUwNzkzNjUwNzkzNjUwNzksCisuNjc5MzgwOTg0Nzk1Nzk3MzM4MDE2MTQzMzg1MTc1MzgyNzE4NDQ0MDAsICAgIC41MDY5MzA2OTMwNjkzMDY5MzA2OTMwNjkzMDY5MzA2OTMwNjkzMDY5LAorLjY4MTM1OTIyNDgwNzkwMzAwNzgxNDUwMjQxNjI5NDk5OTQyMDY0MzAwLCAgICAuNTA1OTI4ODUzNzU0OTQwNzExNDYyNDUwNTkyODg1Mzc1NDk0MDcxMSwKKy42ODMzMzM1NTkxMTE2MjA2MzY0NTAzNjgyMzgwMDE4MjkwMTMyMjg1MCwgICAgLjUwNDkzMDk2NjQ2OTQyODAwNzg4OTU0NjM1MTA4NDgxMjYyMzI3NDIsCisuNjg1MzA0MDAzMDk4OTE5MzY3NjA5MTk4NjE2MjY0NjIwNzk1ODQ2MDAsICAgIC41MDM5MzcwMDc4NzQwMTU3NDgwMzE0OTYwNjI5OTIxMjU5ODQyNTIwLAorLjY4NzI3MDU3MjA3MDk2MDIwNjE5MDE5MzI3NTY4ODIxNjA5MDIwMjUwLCAgICAuNTAyOTQ2OTU0ODEzMzU5NTI4NDg3MjI5ODYyNDc1NDQyMDQzMjIyMCwKKy42ODkyMzMyODEyMzg4MDg4OTI1MTA0MDU3MTI1MjgxNTQyNTM5NTk1MCwgICAgLjUwMTk2MDc4NDMxMzcyNTQ5MDE5NjA3ODQzMTM3MjU0OTAxOTYwNzgsCisuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTgsIDUuMGUtMDEsCit9OworCisKKworI2RlZmluZSBMT0dUQUJfVFJBTlNMQVRFKHgsaCkgKCgoeCkgLSAxLikqaWN2TG9nVGFiWyhoKSsxXSkKK3N0YXRpYyBjb25zdCBkb3VibGUgbG5fMiA9IDAuNjkzMTQ3MTgwNTU5OTQ1MzA5NDE3MjMyMTIxNDU4MTg7CisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkxvZ18zMmYsICggY29uc3QgZmxvYXQgKl94LCBmbG9hdCAqeSwgaW50IG4gKSwgKF94LCB5LCBuKSApCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBzaGlmdFtdID0geyAwLCAtMS4vNTEyIH07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZQorICAgICAgICBBMCA9IDAuMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMywKKyAgICAgICAgQTEgPSAtMC41LAorICAgICAgICBBMiA9IDE7CisKKyAgICAjdW5kZWYgTE9HUE9MWQorICAgICNkZWZpbmUgTE9HUE9MWSh4LGspICgoeCkrPXNoaWZ0W2tdLCgoQTAqKHgpICsgQTEpKih4KSArIEEyKSooeCkpCisKKyAgICBpbnQgaSA9IDA7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmbG9hdCBmOworICAgIH0KKyAgICBidWZbNF07CisgICAgCisgICAgY29uc3QgaW50KiB4ID0gKGNvbnN0IGludCopX3g7CisKKyAgICBpZiggIXggfHwgIXkgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisgICAgaWYoIG4gPD0gMCApCisgICAgICAgIHJldHVybiBDVl9CQURTSVpFX0VSUjsKKworICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gNCApCisgICAgeworICAgICAgICBkb3VibGUgeDAsIHgxLCB4MiwgeDM7CisgICAgICAgIGRvdWJsZSB5MCwgeTEsIHkyLCB5MzsKKyAgICAgICAgaW50IGgwLCBoMSwgaDIsIGgzOworCisgICAgICAgIGgwID0geFtpXTsKKyAgICAgICAgaDEgPSB4W2krMV07CisgICAgICAgIGJ1ZlswXS5pID0gKGgwICYgTE9HVEFCX01BU0syXzMyRikgfCAoMTI3IDw8IDIzKTsKKyAgICAgICAgYnVmWzFdLmkgPSAoaDEgJiBMT0dUQUJfTUFTSzJfMzJGKSB8ICgxMjcgPDwgMjMpOworCisgICAgICAgIHkwID0gKCgoaDAgPj4gMjMpICYgMHhmZikgLSAxMjcpICogbG5fMjsKKyAgICAgICAgeTEgPSAoKChoMSA+PiAyMykgJiAweGZmKSAtIDEyNykgKiBsbl8yOworCisgICAgICAgIGgwID0gKGgwID4+ICgyMyAtIExPR1RBQl9TQ0FMRSAtIDEpKSAmIExPR1RBQl9NQVNLICogMjsKKyAgICAgICAgaDEgPSAoaDEgPj4gKDIzIC0gTE9HVEFCX1NDQUxFIC0gMSkpICYgTE9HVEFCX01BU0sgKiAyOworCisgICAgICAgIHkwICs9IGljdkxvZ1RhYltoMF07CisgICAgICAgIHkxICs9IGljdkxvZ1RhYltoMV07CisKKyAgICAgICAgaDIgPSB4W2krMl07CisgICAgICAgIGgzID0geFtpKzNdOworCisgICAgICAgIHgwID0gTE9HVEFCX1RSQU5TTEFURSggYnVmWzBdLmYsIGgwICk7CisgICAgICAgIHgxID0gTE9HVEFCX1RSQU5TTEFURSggYnVmWzFdLmYsIGgxICk7CisKKyAgICAgICAgYnVmWzJdLmkgPSAoaDIgJiBMT0dUQUJfTUFTSzJfMzJGKSB8ICgxMjcgPDwgMjMpOworICAgICAgICBidWZbM10uaSA9IChoMyAmIExPR1RBQl9NQVNLMl8zMkYpIHwgKDEyNyA8PCAyMyk7CisKKyAgICAgICAgeTIgPSAoKChoMiA+PiAyMykgJiAweGZmKSAtIDEyNykgKiBsbl8yOworICAgICAgICB5MyA9ICgoKGgzID4+IDIzKSAmIDB4ZmYpIC0gMTI3KSAqIGxuXzI7CisKKyAgICAgICAgaDIgPSAoaDIgPj4gKDIzIC0gTE9HVEFCX1NDQUxFIC0gMSkpICYgTE9HVEFCX01BU0sgKiAyOworICAgICAgICBoMyA9IChoMyA+PiAoMjMgLSBMT0dUQUJfU0NBTEUgLSAxKSkgJiBMT0dUQUJfTUFTSyAqIDI7CisKKyAgICAgICAgeTIgKz0gaWN2TG9nVGFiW2gyXTsKKyAgICAgICAgeTMgKz0gaWN2TG9nVGFiW2gzXTsKKworICAgICAgICB4MiA9IExPR1RBQl9UUkFOU0xBVEUoIGJ1ZlsyXS5mLCBoMiApOworICAgICAgICB4MyA9IExPR1RBQl9UUkFOU0xBVEUoIGJ1ZlszXS5mLCBoMyApOworCisgICAgICAgIHkwICs9IExPR1BPTFkoIHgwLCBoMCA9PSA1MTAgKTsKKyAgICAgICAgeTEgKz0gTE9HUE9MWSggeDEsIGgxID09IDUxMCApOworCisgICAgICAgIHlbaV0gPSAoZmxvYXQpIHkwOworICAgICAgICB5W2kgKyAxXSA9IChmbG9hdCkgeTE7CisKKyAgICAgICAgeTIgKz0gTE9HUE9MWSggeDIsIGgyID09IDUxMCApOworICAgICAgICB5MyArPSBMT0dQT0xZKCB4MywgaDMgPT0gNTEwICk7CisKKyAgICAgICAgeVtpICsgMl0gPSAoZmxvYXQpIHkyOworICAgICAgICB5W2kgKyAzXSA9IChmbG9hdCkgeTM7CisgICAgfQorCisgICAgZm9yKCA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGgwID0geFtpXTsKKyAgICAgICAgZG91YmxlIHgwLCB5MDsKKworICAgICAgICB5MCA9ICgoKGgwID4+IDIzKSAmIDB4ZmYpIC0gMTI3KSAqIGxuXzI7CisKKyAgICAgICAgYnVmWzBdLmkgPSAoaDAgJiBMT0dUQUJfTUFTSzJfMzJGKSB8ICgxMjcgPDwgMjMpOworICAgICAgICBoMCA9IChoMCA+PiAoMjMgLSBMT0dUQUJfU0NBTEUgLSAxKSkgJiBMT0dUQUJfTUFTSyAqIDI7CisKKyAgICAgICAgeTAgKz0gaWN2TG9nVGFiW2gwXTsKKyAgICAgICAgeDAgPSBMT0dUQUJfVFJBTlNMQVRFKCBidWZbMF0uZiwgaDAgKTsKKyAgICAgICAgeTAgKz0gTE9HUE9MWSggeDAsIGgwID09IDUxMCApOworCisgICAgICAgIHlbaV0gPSAoZmxvYXQpeTA7CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkxvZ182NGYsICggY29uc3QgZG91YmxlICp4LCBkb3VibGUgKnksIGludCBuICksICh4LCB5LCBuKSApCit7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBzaGlmdFtdID0geyAwLCAtMS4vNTEyIH07CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZQorICAgICAgICBBMCA9IC0uMTY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NiwKKyAgICAgICAgQTEgPSArMC4yLAorICAgICAgICBBMiA9IC0wLjI1LAorICAgICAgICBBMyA9ICswLjMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMzMsCisgICAgICAgIEE0ID0gLTAuNSwKKyAgICAgICAgQTUgPSArMS4wOworCisgICAgI3VuZGVmIExPR1BPTFkKKyAgICAjZGVmaW5lIExPR1BPTFkoeCxrKSAoKHgpKz1zaGlmdFtrXSwgKHhxKSA9ICh4KSooeCksXAorICAgICAgICAoKEEwKih4cSkgKyBBMikqKHhxKSArIEE0KSooeHEpICsgKChBMSooeHEpICsgQTMpKih4cSkgKyBBNSkqKHgpKQorCisgICAgaW50IGkgPSAwOworICAgIERCTElOVCBidWZbNF07CisgICAgREJMSU5UICpYID0gKERCTElOVCAqKSB4OworCisgICAgaWYoICF4IHx8ICF5ICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworICAgIGlmKCBuIDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBmb3IoIDsgaSA8PSBuIC0gNDsgaSArPSA0ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB4cTsKKyAgICAgICAgZG91YmxlIHgwLCB4MSwgeDIsIHgzOworICAgICAgICBkb3VibGUgeTAsIHkxLCB5MiwgeTM7CisgICAgICAgIGludCBoMCwgaDEsIGgyLCBoMzsKKworICAgICAgICBoMCA9IFhbaV0uaS5sbzsKKyAgICAgICAgaDEgPSBYW2kgKyAxXS5pLmxvOworICAgICAgICBidWZbMF0uaS5sbyA9IGgwOworICAgICAgICBidWZbMV0uaS5sbyA9IGgxOworICAgICAgICAKKyAgICAgICAgaDAgPSBYW2ldLmkuaGk7CisgICAgICAgIGgxID0gWFtpICsgMV0uaS5oaTsKKyAgICAgICAgYnVmWzBdLmkuaGkgPSAoaDAgJiBMT0dUQUJfTUFTSzIpIHwgKDEwMjMgPDwgMjApOworICAgICAgICBidWZbMV0uaS5oaSA9IChoMSAmIExPR1RBQl9NQVNLMikgfCAoMTAyMyA8PCAyMCk7CisKKyAgICAgICAgeTAgPSAoKChoMCA+PiAyMCkgJiAweDdmZikgLSAxMDIzKSAqIGxuXzI7CisgICAgICAgIHkxID0gKCgoaDEgPj4gMjApICYgMHg3ZmYpIC0gMTAyMykgKiBsbl8yOworCisgICAgICAgIGgyID0gWFtpICsgMl0uaS5sbzsKKyAgICAgICAgaDMgPSBYW2kgKyAzXS5pLmxvOworICAgICAgICBidWZbMl0uaS5sbyA9IGgyOworICAgICAgICBidWZbM10uaS5sbyA9IGgzOworCisgICAgICAgIGgwID0gKGgwID4+ICgyMCAtIExPR1RBQl9TQ0FMRSAtIDEpKSAmIExPR1RBQl9NQVNLICogMjsKKyAgICAgICAgaDEgPSAoaDEgPj4gKDIwIC0gTE9HVEFCX1NDQUxFIC0gMSkpICYgTE9HVEFCX01BU0sgKiAyOworCisgICAgICAgIHkwICs9IGljdkxvZ1RhYltoMF07CisgICAgICAgIHkxICs9IGljdkxvZ1RhYltoMV07CisKKyAgICAgICAgaDIgPSBYW2kgKyAyXS5pLmhpOworICAgICAgICBoMyA9IFhbaSArIDNdLmkuaGk7CisKKyAgICAgICAgeDAgPSBMT0dUQUJfVFJBTlNMQVRFKCBidWZbMF0uZCwgaDAgKTsKKyAgICAgICAgeDEgPSBMT0dUQUJfVFJBTlNMQVRFKCBidWZbMV0uZCwgaDEgKTsKKworICAgICAgICBidWZbMl0uaS5oaSA9IChoMiAmIExPR1RBQl9NQVNLMikgfCAoMTAyMyA8PCAyMCk7CisgICAgICAgIGJ1ZlszXS5pLmhpID0gKGgzICYgTE9HVEFCX01BU0syKSB8ICgxMDIzIDw8IDIwKTsKKworICAgICAgICB5MiA9ICgoKGgyID4+IDIwKSAmIDB4N2ZmKSAtIDEwMjMpICogbG5fMjsKKyAgICAgICAgeTMgPSAoKChoMyA+PiAyMCkgJiAweDdmZikgLSAxMDIzKSAqIGxuXzI7CisKKyAgICAgICAgaDIgPSAoaDIgPj4gKDIwIC0gTE9HVEFCX1NDQUxFIC0gMSkpICYgTE9HVEFCX01BU0sgKiAyOworICAgICAgICBoMyA9IChoMyA+PiAoMjAgLSBMT0dUQUJfU0NBTEUgLSAxKSkgJiBMT0dUQUJfTUFTSyAqIDI7CisKKyAgICAgICAgeTIgKz0gaWN2TG9nVGFiW2gyXTsKKyAgICAgICAgeTMgKz0gaWN2TG9nVGFiW2gzXTsKKworICAgICAgICB4MiA9IExPR1RBQl9UUkFOU0xBVEUoIGJ1ZlsyXS5kLCBoMiApOworICAgICAgICB4MyA9IExPR1RBQl9UUkFOU0xBVEUoIGJ1ZlszXS5kLCBoMyApOworCisgICAgICAgIHkwICs9IExPR1BPTFkoIHgwLCBoMCA9PSA1MTAgKTsKKyAgICAgICAgeTEgKz0gTE9HUE9MWSggeDEsIGgxID09IDUxMCApOworCisgICAgICAgIHlbaV0gPSB5MDsKKyAgICAgICAgeVtpICsgMV0gPSB5MTsKKworICAgICAgICB5MiArPSBMT0dQT0xZKCB4MiwgaDIgPT0gNTEwICk7CisgICAgICAgIHkzICs9IExPR1BPTFkoIHgzLCBoMyA9PSA1MTAgKTsKKworICAgICAgICB5W2kgKyAyXSA9IHkyOworICAgICAgICB5W2kgKyAzXSA9IHkzOworICAgIH0KKworICAgIGZvciggOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBoMCA9IFhbaV0uaS5oaTsKKyAgICAgICAgZG91YmxlIHhxOworICAgICAgICBkb3VibGUgeDAsIHkwID0gKCgoaDAgPj4gMjApICYgMHg3ZmYpIC0gMTAyMykgKiBsbl8yOworCisgICAgICAgIGJ1ZlswXS5pLmhpID0gKGgwICYgTE9HVEFCX01BU0syKSB8ICgxMDIzIDw8IDIwKTsKKyAgICAgICAgYnVmWzBdLmkubG8gPSBYW2ldLmkubG87CisgICAgICAgIGgwID0gKGgwID4+ICgyMCAtIExPR1RBQl9TQ0FMRSAtIDEpKSAmIExPR1RBQl9NQVNLICogMjsKKworICAgICAgICB5MCArPSBpY3ZMb2dUYWJbaDBdOworICAgICAgICB4MCA9IExPR1RBQl9UUkFOU0xBVEUoIGJ1ZlswXS5kLCBoMCApOworICAgICAgICB5MCArPSBMT0dQT0xZKCB4MCwgaDAgPT0gNTEwICk7CisgICAgICAgIHlbaV0gPSB5MDsKKyAgICB9CisKKyAgICByZXR1cm4gQ1ZfT0s7Cit9CisKKworQ1ZfSU1QTCB2b2lkIGN2TG9nKCBjb25zdCBDdkFyciogc3JjYXJyLCBDdkFyciogZHN0YXJyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2TG9nIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBzcmNfZGVwdGgsIGRzdF9kZXB0aDsKKyAgICBkb3VibGUqIGJ1ZmZlciA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IHgsIHksIGR4ID0gMDsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChzcmMpKQorICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3Jjc3R1YiwgJmNvaTEgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpKQorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0c3R1YiwgJmNvaTIgKSk7CisKKyAgICBpZiggY29pMSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBzcmNfZGVwdGggPSBDVl9NQVRfREVQVEgoc3JjLT50eXBlKTsKKyAgICBkc3RfZGVwdGggPSBDVl9NQVRfREVQVEgoZHN0LT50eXBlKTsKKworICAgIGlmKCAhQ1ZfQVJFX0NOU19FUSggc3JjLCBkc3QgKSB8fCBkc3RfZGVwdGggPCBDVl8zMkYgfHwgc3JjX2RlcHRoIDwgZHN0X2RlcHRoICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSApCisgICAgICAgIENWX0VSUk9SX0ZST01fQ09ERSggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKyAgICBzaXplLndpZHRoICo9IENWX01BVF9DTihzcmMtPnR5cGUpOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoIHNyYywgZHN0ICkpCisgICAgeworICAgICAgICBkeCA9IE1JTiggMTAyNCwgc2l6ZS53aWR0aCApOworICAgICAgICBidWZmZXIgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIGR4KnNpemVvZihidWZmZXJbMF0pICk7CisgICAgfQorCisgICAgZm9yKCB5ID0gMDsgeSA8IHNpemUuaGVpZ2h0OyB5KysgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIHNyY19kYXRhID0gc3JjLT5kYXRhLnB0ciArIHNyYy0+c3RlcCp5OworICAgICAgICB1Y2hhciogZHN0X2RhdGEgPSBkc3QtPmRhdGEucHRyICsgZHN0LT5zdGVwKnk7CisKKyAgICAgICAgaWYoIGRzdF9kZXB0aCA9PSBDVl82NEYgKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZMb2dfNjRmKCAoZG91YmxlKilzcmNfZGF0YSwgKGRvdWJsZSopZHN0X2RhdGEsIHNpemUud2lkdGggKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzcmNfZGVwdGggPT0gZHN0X2RlcHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2TG9nXzMyZiggKGZsb2F0KilzcmNfZGF0YSwgKGZsb2F0Kilkc3RfZGF0YSwgc2l6ZS53aWR0aCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHggKz0gZHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBsZW4gPSBkeDsKKyAgICAgICAgICAgICAgICBpZiggeCArIGxlbiA+IHNpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICBsZW4gPSBzaXplLndpZHRoIC0geDsKKyAgICAgICAgICAgICAgICBpY3ZMb2dfNjRmKCAoZG91YmxlKilzcmNfZGF0YSArIHgsIGJ1ZmZlciwgbGVuICk7CisgICAgICAgICAgICAgICAgaWN2Q3Z0XzY0ZjMyZiggYnVmZmVyLCAoZmxvYXQqKWRzdF9kYXRhICsgeCwgbGVuICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFAgTyBXIEUgUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfREVGX0lQT1dfT1AoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIGNhc3RfbWFjcm8gKSAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2SVBvd18jI2ZsYXZvciggY29uc3QgYXJydHlwZSogc3JjLCBhcnJ0eXBlKiBkc3QsIGludCBsZW4sIGludCBwb3dlciApICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSBhID0gMSwgYiA9IHNyY1tpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgcCA9IHBvd2VyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggcCA+IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHAgJiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGEgKj0gYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYiAqPSBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcCA+Pj0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhICo9IGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSBjYXN0X21hY3JvKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfSVBPV19PUCggOHUsIHVjaGFyLCBpbnQsIENWX0NBU1RfOFUgKQorSUNWX0RFRl9JUE9XX09QKCAxNnUsIHVzaG9ydCwgaW50LCBDVl9DQVNUXzE2VSApCitJQ1ZfREVGX0lQT1dfT1AoIDE2cywgc2hvcnQsIGludCwgQ1ZfQ0FTVF8xNlMgKQorSUNWX0RFRl9JUE9XX09QKCAzMnMsIGludCwgaW50LCBDVl9DQVNUXzMyUyApCitJQ1ZfREVGX0lQT1dfT1AoIDMyZiwgZmxvYXQsIGRvdWJsZSwgQ1ZfQ0FTVF8zMkYgKQorSUNWX0RFRl9JUE9XX09QKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBDVl9DQVNUXzY0RiApCisKKyNkZWZpbmUgaWN2SVBvd184cyAwCisKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzFEKCBJUG93ICkKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2SVBvd0Z1bmMpKCBjb25zdCB2b2lkKiBzcmMsIHZvaWQqIGRzdCwgaW50IGxlbiwgaW50IHBvd2VyICk7Cit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZTcXJ0RnVuYykoIGNvbnN0IHZvaWQqIHNyYywgdm9pZCogZHN0LCBpbnQgbGVuICk7CisKK0NWX0lNUEwgdm9pZCBjdlBvdyggY29uc3QgQ3ZBcnIqIHNyY2FyciwgQ3ZBcnIqIGRzdGFyciwgZG91YmxlIHBvd2VyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgaXBvd190YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UG93IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgdm9pZCogdGVtcF9idWZmZXIgPSAwOworICAgIGludCBibG9ja19zaXplID0gMDsKKyAgICBDdk1hdCBzcmNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0c3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIGludCBjb2kxID0gMCwgY29pMiA9IDA7CisgICAgaW50IGRlcHRoOworICAgIEN2U2l6ZSBzaXplOworICAgIGludCB4LCB5OworICAgIGludCBpcG93ZXIgPSBjdlJvdW5kKCBwb3dlciApOworICAgIGludCBpc19pcG93ZXIgPSAwOworICAgIAorICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYykpCisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzcmNzdHViLCAmY29pMSApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3RzdHViLCAmY29pMiApKTsKKworICAgIGlmKCBjb2kxICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUl9GUk9NX0NPREUoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApICkKKyAgICAgICAgQ1ZfRVJST1JfRlJPTV9DT0RFKCBDVl9TdHNVbm1hdGNoZWRTaXplcyApOworCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoIHNyYy0+dHlwZSApOworCisgICAgaWYoIGZhYnMoaXBvd2VyIC0gcG93ZXIpIDwgREJMX0VQU0lMT04gKQorICAgIHsKKyAgICAgICAgaWYoICFpbml0dGFiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2SW5pdElQb3dUYWJsZSggJmlwb3dfdGFiICk7CisgICAgICAgICAgICBpbml0dGFiID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpcG93ZXIgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZEaXYoIDAsIHNyYywgZHN0ICkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggaXBvd2VyID09IC0xICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgaXBvd2VyID0gLWlwb3dlcjsKKyAgICAgICAgICAgIHNyYyA9IGRzdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgc3dpdGNoKCBpcG93ZXIgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGN2U2V0KCBkc3QsIGN2U2NhbGFyQWxsKDEpKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGN2Q29weSggc3JjLCBkc3QgKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIGN2TXVsKCBzcmMsIHNyYywgZHN0ICk7CisgICAgICAgICAgICBFWElUOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgaXNfaXBvd2VyID0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBkZXB0aCA8IENWXzMyRiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgIkZyYWN0aW9uYWwgb3IgbmVnYXRpdmUgaW50ZWdlciBwb3dlciBmYWN0b3IgY2FuIGJlIHVzZWQgIgorICAgICAgICAid2l0aCBmbG9hdGluZy1wb2ludCB0eXBlcyBvbmx5Iik7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKHNyYyk7CisgICAgc2l6ZS53aWR0aCAqPSBDVl9NQVRfQ04oc3JjLT50eXBlKTsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggc3JjLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgaWYoIGlzX2lwb3dlciApCisgICAgeworICAgICAgICBDdklQb3dGdW5jIHBvd19mdW5jID0gKEN2SVBvd0Z1bmMpaXBvd190YWIuZm5fMmRbZGVwdGhdOworICAgICAgICBpZiggIXBvd19mdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBkYXRhIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICAgICAgCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHNyY19kYXRhID0gc3JjLT5kYXRhLnB0ciArIHNyYy0+c3RlcCp5OworICAgICAgICAgICAgdWNoYXIqIGRzdF9kYXRhID0gZHN0LT5kYXRhLnB0ciArIGRzdC0+c3RlcCp5OworCisgICAgICAgICAgICBwb3dfZnVuYyggc3JjX2RhdGEsIGRzdF9kYXRhLCBzaXplLndpZHRoLCBpcG93ZXIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBmYWJzKGZhYnMocG93ZXIpIC0gMC41KSA8IERCTF9FUFNJTE9OICkKKyAgICB7CisgICAgICAgIEN2U3FydEZ1bmMgc3FydF9mdW5jID0gcG93ZXIgPCAwID8gCisgICAgICAgICAgICAoZGVwdGggPT0gQ1ZfMzJGID8gKEN2U3FydEZ1bmMpaWN2SW52U3FydF8zMmYgOiAoQ3ZTcXJ0RnVuYylpY3ZJbnZTcXJ0XzY0ZikgOgorICAgICAgICAgICAgKGRlcHRoID09IENWXzMyRiA/IChDdlNxcnRGdW5jKWljdlNxcnRfMzJmIDogKEN2U3FydEZ1bmMpaWN2U3FydF82NGYpOworCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHNyY19kYXRhID0gc3JjLT5kYXRhLnB0ciArIHNyYy0+c3RlcCp5OworICAgICAgICAgICAgdWNoYXIqIGRzdF9kYXRhID0gZHN0LT5kYXRhLnB0ciArIGRzdC0+c3RlcCp5OworCisgICAgICAgICAgICBzcXJ0X2Z1bmMoIHNyY19kYXRhLCBkc3RfZGF0YSwgc2l6ZS53aWR0aCApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJsb2NrX3NpemUgPSBNSU4oIHNpemUud2lkdGgsIElDVl9NQVRIX0JMT0NLX1NJWkUgKTsKKyAgICAgICAgdGVtcF9idWZmZXIgPSBjdlN0YWNrQWxsb2MoIGJsb2NrX3NpemUqQ1ZfRUxFTV9TSVpFKGRlcHRoKSApOworCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHNyY19kYXRhID0gc3JjLT5kYXRhLnB0ciArIHNyYy0+c3RlcCp5OworICAgICAgICAgICAgdWNoYXIqIGRzdF9kYXRhID0gZHN0LT5kYXRhLnB0ciArIGRzdC0+c3RlcCp5OworCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCArPSBibG9ja19zaXplICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gTUlOKCBzaXplLndpZHRoIC0geCwgYmxvY2tfc2l6ZSApOworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2TG9nXzMyZiggKGZsb2F0KilzcmNfZGF0YSArIHgsIChmbG9hdCopdGVtcF9idWZmZXIsIGxlbiApOworICAgICAgICAgICAgICAgICAgICBpY3ZTY2FsZV8zMmYoIChmbG9hdCopdGVtcF9idWZmZXIsIChmbG9hdCopdGVtcF9idWZmZXIsIGxlbiwgKGZsb2F0KXBvd2VyLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGljdkV4cF8zMmYoIChmbG9hdCopdGVtcF9idWZmZXIsIChmbG9hdCopZHN0X2RhdGEgKyB4LCBsZW4gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2TG9nXzY0ZiggKGRvdWJsZSopc3JjX2RhdGEgKyB4LCAoZG91YmxlKil0ZW1wX2J1ZmZlciwgbGVuICk7CisgICAgICAgICAgICAgICAgICAgIGljdlNjYWxlXzY0ZiggKGRvdWJsZSopdGVtcF9idWZmZXIsIChkb3VibGUqKXRlbXBfYnVmZmVyLCBsZW4sIHBvd2VyLCAwICk7CisgICAgICAgICAgICAgICAgICAgIGljdkV4cF82NGYoIChkb3VibGUqKXRlbXBfYnVmZmVyLCAoZG91YmxlKilkc3RfZGF0YSArIHgsIGxlbiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqIENoZWNrQXJyYXkgZm9yIE5hTidzLCBJbmYncyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdkNoZWNrQXJyYXlfMzJmX0MxUiwKKyAgICAoIGNvbnN0IGZsb2F0KiBzcmMsIGludCBzcmNzdGVwLCBDdlNpemUgc2l6ZSwgaW50IGZsYWdzLCBkb3VibGUgbWluX3ZhbCwgZG91YmxlIG1heF92YWwgKSwKKyAgICAgKHNyYywgc3Jjc3RlcCwgc2l6ZSwgZmxhZ3MsIG1pbl92YWwsIG1heF92YWwpICkKK3sKKyAgICBDdjMyc3VmIGEsIGI7CisgICAgaW50IGlhLCBpYjsKKyAgICBjb25zdCBpbnQqIGlzcmMgPSAoY29uc3QgaW50KilzcmM7CisgICAgCisgICAgaWYoICFzcmMgKQorICAgICAgICByZXR1cm4gQ1ZfTlVMTFBUUl9FUlI7CisKKyAgICBpZiggc2l6ZS53aWR0aCA8PSAwIHx8IHNpemUuaGVpZ2h0IDw9IDAgKQorICAgICAgICByZXR1cm4gQ1ZfQkFEU0laRV9FUlI7CisKKyAgICBpZiggZmxhZ3MgJiBDVl9DSEVDS19SQU5HRSApCisgICAgeworICAgICAgICBhLmYgPSAoZmxvYXQpbWluX3ZhbDsKKyAgICAgICAgYi5mID0gKGZsb2F0KW1heF92YWw7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGEuZiA9IC1GTFRfTUFYOworICAgICAgICBiLmYgPSBGTFRfTUFYOworICAgIH0KKworICAgIGlhID0gQ1ZfVE9HR0xFX0ZMVChhLmkpOworICAgIGliID0gQ1ZfVE9HR0xFX0ZMVChiLmkpOworCisgICAgc3Jjc3RlcCAvPSBzaXplb2YoaXNyY1swXSk7CisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGlzcmMgKz0gc3Jjc3RlcCApCisgICAgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBpc3JjW2ldOworICAgICAgICAgICAgdmFsID0gQ1ZfVE9HR0xFX0ZMVCh2YWwpOworCisgICAgICAgICAgICBpZiggdmFsIDwgaWEgfHwgdmFsID49IGliICkKKyAgICAgICAgICAgICAgICByZXR1cm4gQ1ZfQkFEUkFOR0VfRVJSOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENWX09LOworfQorCisKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsICBpY3ZDaGVja0FycmF5XzY0Zl9DMVIsCisgICAgKCBjb25zdCBkb3VibGUqIHNyYywgaW50IHNyY3N0ZXAsIEN2U2l6ZSBzaXplLCBpbnQgZmxhZ3MsIGRvdWJsZSBtaW5fdmFsLCBkb3VibGUgbWF4X3ZhbCApLAorICAgIChzcmMsIHNyY3N0ZXAsIHNpemUsIGZsYWdzLCBtaW5fdmFsLCBtYXhfdmFsKSApCit7CisgICAgQ3Y2NHN1ZiBhLCBiOworICAgIGludDY0IGlhLCBpYjsKKyAgICBjb25zdCBpbnQ2NCogaXNyYyA9IChjb25zdCBpbnQ2NCopc3JjOworICAgIAorICAgIGlmKCAhc3JjICkKKyAgICAgICAgcmV0dXJuIENWX05VTExQVFJfRVJSOworCisgICAgaWYoIHNpemUud2lkdGggPD0gMCB8fCBzaXplLmhlaWdodCA8PSAwICkKKyAgICAgICAgcmV0dXJuIENWX0JBRFNJWkVfRVJSOworCisgICAgaWYoIGZsYWdzICYgQ1ZfQ0hFQ0tfUkFOR0UgKQorICAgIHsKKyAgICAgICAgYS5mID0gbWluX3ZhbDsKKyAgICAgICAgYi5mID0gbWF4X3ZhbDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYS5mID0gLURCTF9NQVg7CisgICAgICAgIGIuZiA9IERCTF9NQVg7CisgICAgfQorCisgICAgaWEgPSBDVl9UT0dHTEVfREJMKGEuaSk7CisgICAgaWIgPSBDVl9UT0dHTEVfREJMKGIuaSk7CisKKyAgICBzcmNzdGVwIC89IHNpemVvZihpc3JjWzBdKTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgaXNyYyArPSBzcmNzdGVwICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50NjQgdmFsID0gaXNyY1tpXTsKKyAgICAgICAgICAgIHZhbCA9IENWX1RPR0dMRV9EQkwodmFsKTsKKworICAgICAgICAgICAgaWYoIHZhbCA8IGlhIHx8IHZhbCA+PSBpYiApCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX0JBRFJBTkdFX0VSUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDVl9PSzsKK30KKworCitDVl9JTVBMICBpbnQgIGN2Q2hlY2tBcnIoIGNvbnN0IEN2QXJyKiBhcnIsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIG1pblZhbCwgZG91YmxlIG1heFZhbCApCit7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2Q2hlY2tBcnIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggYXJyICkKKyAgICB7CisgICAgICAgIEN2U3RhdHVzIHN0YXR1cyA9IENWX09LOworICAgICAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisgICAgICAgIGludCB0eXBlOworICAgICAgICBDdlNpemUgc2l6ZTsKKworICAgICAgICBpZiggIUNWX0lTX01BVCggbWF0ICkpCisgICAgICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgMCwgMSApKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworICAgICAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKworICAgICAgICBzaXplLndpZHRoICo9IENWX01BVF9DTiggdHlwZSApOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzMyRiApCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGljdkNoZWNrQXJyYXlfMzJmX0MxUiggbWF0LT5kYXRhLmZsLCBtYXQtPnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtaW5WYWwsIG1heFZhbCApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl82NEYgKQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0dXMgPSBpY3ZDaGVja0FycmF5XzY0Zl9DMVIoIG1hdC0+ZGF0YS5kYiwgbWF0LT5zdGVwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbWluVmFsLCBtYXhWYWwgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBzdGF0dXMgPCAwICkgIAorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RhdHVzICE9IENWX0JBRFJBTkdFX0VSUiB8fCAhKGZsYWdzICYgQ1ZfQ0hFQ0tfUVVJRVQpKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiQ2hlY2tBcnJheSBmYWlsZWQiICk7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gMTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeG1hdG11bC5jcHAgYi9jeGNvcmUvc3JjL2N4bWF0bXVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQzMTQyCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeG1hdG11bC5jcHAKQEAgLTAsMCArMSwzMzc4IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdkdFTU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitpY3ZCTEFTX0dFTU1fMzJmX3QgaWN2QkxBU19HRU1NXzMyZl9wID0gMDsKK2ljdkJMQVNfR0VNTV82NGZfdCBpY3ZCTEFTX0dFTU1fNjRmX3AgPSAwOworaWN2QkxBU19HRU1NXzMyZmNfdCBpY3ZCTEFTX0dFTU1fMzJmY19wID0gMDsKK2ljdkJMQVNfR0VNTV82NGZjX3QgaWN2QkxBU19HRU1NXzY0ZmNfcCA9IDA7CisKK3N0YXRpYyB2b2lkCitpY3ZHRU1NX0NvcHlCbG9jayggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLAorICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IHBpeF9zaXplICkKK3sKKyAgICBpbnQgajsKKyAgICBzaXplLndpZHRoID0gc2l6ZS53aWR0aCAqIChwaXhfc2l6ZSAvIHNpemVvZihpbnQpKTsKKworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3JjX3N0ZXAsIGRzdCArPSBkc3Rfc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGogPSAwOyBqIDw9IHNpemUud2lkdGggLSA0OyBqICs9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdDAgPSAoKGNvbnN0IGludCopc3JjKVtqXTsKKyAgICAgICAgICAgIGludCB0MSA9ICgoY29uc3QgaW50KilzcmMpW2orMV07CisgICAgICAgICAgICAoKGludCopZHN0KVtqXSA9IHQwOworICAgICAgICAgICAgKChpbnQqKWRzdClbaisxXSA9IHQxOworICAgICAgICAgICAgdDAgPSAoKGNvbnN0IGludCopc3JjKVtqKzJdOworICAgICAgICAgICAgdDEgPSAoKGNvbnN0IGludCopc3JjKVtqKzNdOworICAgICAgICAgICAgKChpbnQqKWRzdClbaisyXSA9IHQwOworICAgICAgICAgICAgKChpbnQqKWRzdClbaiszXSA9IHQxOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGogPCBzaXplLndpZHRoOyBqKysgKQorICAgICAgICAgICAgKChpbnQqKWRzdClbal0gPSAoKGNvbnN0IGludCopc3JjKVtqXTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdkdFTU1fVHJhbnNwb3NlQmxvY2soIGNvbnN0IHVjaGFyKiBzcmMsIGludCBzcmNfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBkc3QsIGludCBkc3Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgcGl4X3NpemUgKQoreworICAgIGludCBpLCBqOworICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIGRzdCArPSBkc3Rfc3RlcCwgc3JjICs9IHBpeF9zaXplICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVjaGFyKiBfc3JjID0gc3JjOworICAgICAgICBzd2l0Y2goIHBpeF9zaXplICkKKyAgICAgICAgeworICAgICAgICBjYXNlIHNpemVvZihpbnQpOgorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUuaGVpZ2h0OyBqKyssIF9zcmMgKz0gc3JjX3N0ZXAgKQorICAgICAgICAgICAgICAgICgoaW50Kilkc3QpW2pdID0gKChpbnQqKV9zcmMpWzBdOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc2l6ZW9mKGludCkqMjoKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBzaXplLmhlaWdodCoyOyBqICs9IDIsIF9zcmMgKz0gc3JjX3N0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0MCA9ICgoaW50Kilfc3JjKVswXTsKKyAgICAgICAgICAgICAgICBpbnQgdDEgPSAoKGludCopX3NyYylbMV07CisgICAgICAgICAgICAgICAgKChpbnQqKWRzdClbal0gPSB0MDsKKyAgICAgICAgICAgICAgICAoKGludCopZHN0KVtqKzFdID0gdDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzaXplb2YoaW50KSo0OgorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUuaGVpZ2h0KjQ7IGogKz0gNCwgX3NyYyArPSBzcmNfc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gKChpbnQqKV9zcmMpWzBdOworICAgICAgICAgICAgICAgIGludCB0MSA9ICgoaW50Kilfc3JjKVsxXTsKKyAgICAgICAgICAgICAgICAoKGludCopZHN0KVtqXSA9IHQwOworICAgICAgICAgICAgICAgICgoaW50Kilkc3QpW2orMV0gPSB0MTsKKyAgICAgICAgICAgICAgICB0MCA9ICgoaW50Kilfc3JjKVsyXTsKKyAgICAgICAgICAgICAgICB0MSA9ICgoaW50Kilfc3JjKVszXTsKKyAgICAgICAgICAgICAgICAoKGludCopZHN0KVtqKzJdID0gdDA7CisgICAgICAgICAgICAgICAgKChpbnQqKWRzdClbaiszXSA9IHQxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNkZWZpbmUgSUNWX0RFRl9HRU1NX1NJTkdMRV9NVUwoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUgKSAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2R0VNTVNpbmdsZU11bF8jI2ZsYXZvciggY29uc3QgYXJydHlwZSogYV9kYXRhLCBzaXplX3QgYV9zdGVwLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBiX2RhdGEsIHNpemVfdCBiX3N0ZXAsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogY19kYXRhLCBzaXplX3QgY19zdGVwLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRfZGF0YSwgc2l6ZV90IGRfc3RlcCwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgYV9zaXplLCBDdlNpemUgZF9zaXplLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhLCBkb3VibGUgYmV0YSwgaW50IGZsYWdzICkgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgaiwgaywgbiA9IGFfc2l6ZS53aWR0aCwgbSA9IGRfc2l6ZS53aWR0aCwgZHJvd3MgPSBkX3NpemUuaGVpZ2h0OyBcCisgICAgY29uc3QgYXJydHlwZSAqX2FfZGF0YSA9IGFfZGF0YSwgKl9iX2RhdGEgPSBiX2RhdGEsICpfY19kYXRhID0gY19kYXRhOyAgXAorICAgIGFycnR5cGUqIGFfYnVmID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3QgYV9zdGVwMCwgYV9zdGVwMSwgY19zdGVwMCwgY19zdGVwMSwgdF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFfc3RlcCAvPSBzaXplb2YoYV9kYXRhWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiX3N0ZXAgLz0gc2l6ZW9mKGJfZGF0YVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY19zdGVwIC89IHNpemVvZihjX2RhdGFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRfc3RlcCAvPSBzaXplb2YoZF9kYXRhWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhX3N0ZXAwID0gYV9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYV9zdGVwMSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIWNfZGF0YSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfc3RlcDAgPSBjX3N0ZXAxID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoICEoZmxhZ3MgJiBDVl9HRU1NX0NfVCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY19zdGVwMCA9IGNfc3RlcCwgY19zdGVwMSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjX3N0ZXAwID0gMSwgY19zdGVwMSA9IGNfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWdzICYgQ1ZfR0VNTV9BX1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfU1dBUCggYV9zdGVwMCwgYV9zdGVwMSwgdF9zdGVwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG4gPSBhX3NpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggYV9zdGVwID4gMSAmJiBuID4gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFfYnVmID0gKGFycnR5cGUqKWN2U3RhY2tBbGxvYyhuKnNpemVvZihhX2RhdGFbMF0pKTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggbiA9PSAxICkgLyogZXh0ZXJuYWwgcHJvZHVjdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlKiBiX2J1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBhX3N0ZXAgPiAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFfYnVmID0gKGFycnR5cGUqKWN2U3RhY2tBbGxvYyhkcm93cypzaXplb2YoYV9kYXRhWzBdKSk7ICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZHJvd3M7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFfYnVmW2tdID0gYV9kYXRhW2Ffc3RlcCprXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFfZGF0YSA9IGFfYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGJfc3RlcCA+IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYl9idWYgPSAoYXJydHlwZSopY3ZTdGFja0FsbG9jKGRfc2l6ZS53aWR0aCpzaXplb2YoYl9idWZbMF0pICk7IFwKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkX3NpemUud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYl9idWZbal0gPSBiX2RhdGFbaipiX3N0ZXBdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYl9kYXRhID0gYl9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHJvd3M7IGkrKywgX2NfZGF0YSArPSBjX3N0ZXAwLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfZGF0YSArPSBkX3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgYWwgPSB3b3JrdHlwZShhX2RhdGFbaV0pKmFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNfZGF0YSA9IF9jX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGRfc2l6ZS53aWR0aCAtIDI7IGogKz0gMiwgY19kYXRhICs9IDIqY19zdGVwMSApXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IGFsKmJfZGF0YVtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczEgPSBhbCpiX2RhdGFbaisxXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAhY19kYXRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUoczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbaisxXSA9IGFycnR5cGUoczEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZShzMCArIGNfZGF0YVswXSpiZXRhKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqKzFdID0gYXJydHlwZShzMSArIGNfZGF0YVtjX3N0ZXAxXSpiZXRhKTsgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGogPCBkX3NpemUud2lkdGg7IGorKywgY19kYXRhICs9IGNfc3RlcDEgKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczAgPSBhbCpiX2RhdGFbal07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAhY19kYXRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZShzMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbal0gPSBhcnJ0eXBlKHMwICsgY19kYXRhWzBdKmJldGEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlIGlmKCBmbGFncyAmIENWX0dFTU1fQl9UICkgLyogQSAqIEJ0ICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHJvd3M7IGkrKywgX2FfZGF0YSArPSBhX3N0ZXAwLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jX2RhdGEgKz0gY19zdGVwMCwgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkX2RhdGEgKz0gZF9zdGVwICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFfZGF0YSA9IF9hX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBiX2RhdGEgPSBfYl9kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY19kYXRhID0gX2NfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggYV9idWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFfYnVmW2tdID0gYV9kYXRhW2Ffc3RlcDEqa107ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFfZGF0YSA9IGFfYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRfc2l6ZS53aWR0aDsgaisrLCBiX2RhdGEgKz0gYl9zdGVwLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kYXRhICs9IGNfc3RlcDEgKSAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwKDApLCBzMSgwKSwgczIoMCksIHMzKDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8PSBuIC0gNDsgayArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gd29ya3R5cGUoYV9kYXRhW2tdKSpiX2RhdGFba107ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMxICs9IHdvcmt0eXBlKGFfZGF0YVtrKzFdKSpiX2RhdGFbaysxXTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiArPSB3b3JrdHlwZShhX2RhdGFbaysyXSkqYl9kYXRhW2srMl07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczMgKz0gd29ya3R5cGUoYV9kYXRhW2srM10pKmJfZGF0YVtrKzNdOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIDsgayA8IG47IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IHdvcmt0eXBlKGFfZGF0YVtrXSkqYl9kYXRhW2tdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHMwID0gKHMwK3MxK3MyK3MzKSphbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYoICFjX2RhdGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbal0gPSBhcnJ0eXBlKHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUoczAgKyBjX2RhdGFbMF0qYmV0YSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoIGRfc2l6ZS53aWR0aCpzaXplb2YoZF9kYXRhWzBdKSA8PSAxNjAwICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkcm93czsgaSsrLCBfYV9kYXRhICs9IGFfc3RlcDAsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NfZGF0YSArPSBjX3N0ZXAwLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfZGF0YSArPSBkX3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYV9kYXRhID0gX2FfZGF0YSwgY19kYXRhID0gX2NfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggYV9idWYgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFfYnVmW2tdID0gYV9kYXRhW2Ffc3RlcDEqa107ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFfZGF0YSA9IGFfYnVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBtIC0gNDsgaiArPSA0LCBjX2RhdGEgKz0gNCpjX3N0ZXAxICkgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogYiA9IF9iX2RhdGEgKyBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwKDApLCBzMSgwKSwgczIoMCksIHMzKDApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG47IGsrKywgYiArPSBiX3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUgYShhX2RhdGFba10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IGEgKiBiWzBdOyBzMSArPSBhICogYlsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiArPSBhICogYlsyXTsgczMgKz0gYSAqIGJbM107ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAhY19kYXRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUoczAqYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbaisxXSA9IGFycnR5cGUoczEqYWxwaGEpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9kYXRhW2orMl0gPSBhcnJ0eXBlKHMyKmFscGhhKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqKzNdID0gYXJydHlwZShzMyphbHBoYSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCA9IHMwKmFscGhhOyBzMSA9IHMxKmFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczIgPSBzMiphbHBoYTsgczMgPSBzMyphbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUoczAgKyBjX2RhdGFbMF0qYmV0YSk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbaisxXSA9IGFycnR5cGUoczEgKyBjX2RhdGFbY19zdGVwMV0qYmV0YSk7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9kYXRhW2orMl0gPSBhcnJ0eXBlKHMyICsgY19kYXRhW2Nfc3RlcDEqMl0qYmV0YSk7ICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqKzNdID0gYXJydHlwZShzMyArIGNfZGF0YVtjX3N0ZXAxKjNdKmJldGEpOyAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGogPCBtOyBqKyssIGNfZGF0YSArPSBjX3N0ZXAxICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogYiA9IF9iX2RhdGEgKyBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG47IGsrKywgYiArPSBiX3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCArPSB3b3JrdHlwZShhX2RhdGFba10pICogYlswXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgczAgPSBzMCphbHBoYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAhY19kYXRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZShzMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbal0gPSBhcnJ0eXBlKHMwICsgY19kYXRhWzBdKmJldGEpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSogZF9idWYgPSAod29ya3R5cGUqKWN2U3RhY2tBbGxvYyhtKnNpemVvZihkX2J1ZlswXSkpOyAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkcm93czsgaSsrLCBfYV9kYXRhICs9IGFfc3RlcDAsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY19kYXRhICs9IGNfc3RlcDAsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9kYXRhICs9IGRfc3RlcCApICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYV9kYXRhID0gX2FfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJfZGF0YSA9IF9iX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjX2RhdGEgPSBfY19kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBhX2J1ZiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgYV9idWZba10gPSBfYV9kYXRhW2Ffc3RlcDEqa107ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYV9kYXRhID0gYV9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRfYnVmW2pdID0gd29ya3R5cGUoMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrLCBiX2RhdGEgKz0gYl9zdGVwICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBhbChhX2RhdGFba10pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gbSAtIDQ7IGogKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gZF9idWZbal0gKyBiX2RhdGFbal0qYWw7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MSA9IGRfYnVmW2orMV0gKyBiX2RhdGFbaisxXSphbDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9idWZbal0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfYnVmW2orMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0MCA9IGRfYnVmW2orMl0gKyBiX2RhdGFbaisyXSphbDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgdDEgPSBkX2J1ZltqKzNdICsgYl9kYXRhW2orM10qYWw7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfYnVmW2orMl0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2J1ZltqKzNdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggOyBqIDwgbTsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZF9idWZbal0gKz0gYl9kYXRhW2pdKmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAhY19kYXRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkX2RhdGFbal0gPSBhcnJ0eXBlKGRfYnVmW2pdKmFscGhhKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKywgY19kYXRhICs9IGNfc3RlcDEgKSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUgdCA9IGRfYnVmW2pdKmFscGhhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUodCArIGNfZGF0YVswXSpiZXRhKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfR0VNTV9CTE9DS19NVUwoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUgKSAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2R0VNTUJsb2NrTXVsXyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiBhX2RhdGEsIHNpemVfdCBhX3N0ZXAsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJ0eXBlKiBiX2RhdGEsIHNpemVfdCBiX3N0ZXAsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlKiBkX2RhdGEsIHNpemVfdCBkX3N0ZXAsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGFfc2l6ZSwgQ3ZTaXplIGRfc2l6ZSwgaW50IGZsYWdzICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgaiwgaywgbiA9IGFfc2l6ZS53aWR0aCwgbSA9IGRfc2l6ZS53aWR0aDsgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUgKl9hX2RhdGEgPSBhX2RhdGEsICpfYl9kYXRhID0gYl9kYXRhOyAgICAgICAgICAgICBcCisgICAgYXJydHlwZSogYV9idWYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplX3QgYV9zdGVwMCwgYV9zdGVwMSwgdF9zdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBkb19hY2MgPSBmbGFncyAmIDE2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhX3N0ZXAgLz0gc2l6ZW9mKGFfZGF0YVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGJfc3RlcCAvPSBzaXplb2YoYl9kYXRhWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZF9zdGVwIC89IHNpemVvZihkX2RhdGFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFfc3RlcDAgPSBhX3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYV9zdGVwMSA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFncyAmIENWX0dFTU1fQV9UICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfU1dBUCggYV9zdGVwMCwgYV9zdGVwMSwgdF9zdGVwICk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuID0gYV9zaXplLmhlaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFfYnVmID0gKGFycnR5cGUqKWN2U3RhY2tBbGxvYyhuKnNpemVvZihhX2RhdGFbMF0pKTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWdzICYgQ1ZfR0VNTV9CX1QgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBzZWNvbmQgb3BlcmFuZCBpcyB0cmFuc3Bvc2VkICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX3NpemUuaGVpZ2h0OyBpKyssIF9hX2RhdGEgKz0gYV9zdGVwMCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9kYXRhICs9IGRfc3RlcCApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhX2RhdGEgPSBfYV9kYXRhOyBiX2RhdGEgPSBfYl9kYXRhOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGFfYnVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhX2J1ZltrXSA9IGFfZGF0YVthX3N0ZXAxKmtdOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYV9kYXRhID0gYV9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZF9zaXplLndpZHRoOyBqKyssIGJfZGF0YSArPSBiX3N0ZXAgKSAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwID0gZG9fYWNjID8gZF9kYXRhW2pdOndvcmt0eXBlKDApLCBzMSgwKTtcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8PSBuIC0gMjsgayArPSAyICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCArPSB3b3JrdHlwZShhX2RhdGFba10pKmJfZGF0YVtrXTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMxICs9IHdvcmt0eXBlKGFfZGF0YVtrKzFdKSpiX2RhdGFbaysxXTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCA7IGsgPCBuOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gd29ya3R5cGUoYV9kYXRhW2tdKSpiX2RhdGFba107ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gczAgKyBzMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX3NpemUuaGVpZ2h0OyBpKyssIF9hX2RhdGEgKz0gYV9zdGVwMCwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9kYXRhICs9IGRfc3RlcCApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhX2RhdGEgPSBfYV9kYXRhLCBiX2RhdGEgPSBfYl9kYXRhOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGFfYnVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhX2J1ZltrXSA9IGFfZGF0YVthX3N0ZXAxKmtdOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYV9kYXRhID0gYV9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IG0gLSA0OyBqICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHMwLCBzMSwgczIsIHMzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3QgYXJydHlwZSogYiA9IGJfZGF0YSArIGo7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBkb19hY2MgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczAgPSBkX2RhdGFbal07IHMxID0gZF9kYXRhW2orMV07ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiA9IGRfZGF0YVtqKzJdOyBzMyA9IGRfZGF0YVtqKzNdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCA9IHMxID0gczIgPSBzMyA9IHdvcmt0eXBlKDApOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbjsgaysrLCBiICs9IGJfc3RlcCApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlIGEoYV9kYXRhW2tdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gYSAqIGJbMF07IHMxICs9IGEgKiBiWzFdOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiArPSBhICogYlsyXTsgczMgKz0gYSAqIGJbM107ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IHMwOyBkX2RhdGFbaisxXSA9IHMxOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2orMl0gPSBzMjsgZF9kYXRhW2orM10gPSBzMzsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IG07IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIGIgPSBiX2RhdGEgKyBqOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgczAgPSBkb19hY2MgPyBkX2RhdGFbal0gOiB3b3JrdHlwZSgwKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBuOyBrKyssIGIgKz0gYl9zdGVwICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IHdvcmt0eXBlKGFfZGF0YVtrXSkgKiBiWzBdOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IHMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9HRU1NX1NUT1JFKCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlICkgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZHRU1NU3RvcmVfIyNmbGF2b3IoIGNvbnN0IGFycnR5cGUqIGNfZGF0YSwgc2l6ZV90IGNfc3RlcCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd29ya3R5cGUqIGRfYnVmLCBzaXplX3QgZF9idWZfc3RlcCwgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkX2RhdGEsIHNpemVfdCBkX3N0ZXAsIEN2U2l6ZSBkX3NpemUsXAorICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBpbnQgZmxhZ3MgKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBhcnJ0eXBlKiBfY19kYXRhID0gY19kYXRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZV90IGNfc3RlcDAsIGNfc3RlcDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNfc3RlcCAvPSBzaXplb2YoY19kYXRhWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZF9idWZfc3RlcCAvPSBzaXplb2YoZF9idWZbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkX3N0ZXAgLz0gc2l6ZW9mKGRfZGF0YVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICFjX2RhdGEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY19zdGVwMCA9IGNfc3RlcDEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVsc2UgaWYoICEoZmxhZ3MgJiBDVl9HRU1NX0NfVCkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNfc3RlcDAgPSBjX3N0ZXAsIGNfc3RlcDEgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjX3N0ZXAwID0gMSwgY19zdGVwMSA9IGNfc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgZF9zaXplLmhlaWdodC0tOyBfY19kYXRhICs9IGNfc3RlcDAsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRfYnVmICs9IGRfYnVmX3N0ZXAsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZF9kYXRhICs9IGRfc3RlcCApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggX2NfZGF0YSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNfZGF0YSA9IF9jX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBkX3NpemUud2lkdGggLSA0OyBqICs9IDQsIGNfZGF0YSArPSA0KmNfc3RlcDEgKVwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gYWxwaGEqZF9idWZbal07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd29ya3R5cGUgdDEgPSBhbHBoYSpkX2J1ZltqKzFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCArPSBiZXRhKndvcmt0eXBlKGNfZGF0YVswXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQxICs9IGJldGEqd29ya3R5cGUoY19kYXRhW2Nfc3RlcDFdKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZSh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkX2RhdGFbaisxXSA9IGFycnR5cGUodDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQwID0gYWxwaGEqZF9idWZbaisyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDEgPSBhbHBoYSpkX2J1ZltqKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCArPSBiZXRhKndvcmt0eXBlKGNfZGF0YVtjX3N0ZXAxKjJdKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQxICs9IGJldGEqd29ya3R5cGUoY19kYXRhW2Nfc3RlcDEqM10pOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2orMl0gPSBhcnJ0eXBlKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkX2RhdGFbaiszXSA9IGFycnR5cGUodDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IGRfc2l6ZS53aWR0aDsgaisrLCBjX2RhdGEgKz0gY19zdGVwMSApICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gYWxwaGEqZF9idWZbal07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZSh0MCArIGJldGEqY19kYXRhWzBdKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBkX3NpemUud2lkdGggLSA0OyBqICs9IDQgKSAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IGFscGhhKmRfYnVmW2pdOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIHQxID0gYWxwaGEqZF9idWZbaisxXTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZF9kYXRhW2pdID0gYXJydHlwZSh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkX2RhdGFbaisxXSA9IGFycnR5cGUodDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHQwID0gYWxwaGEqZF9idWZbaisyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdDEgPSBhbHBoYSpkX2J1ZltqKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkX2RhdGFbaisyXSA9IGFycnR5cGUodDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRfZGF0YVtqKzNdID0gYXJydHlwZSh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBqIDwgZF9zaXplLndpZHRoOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRfZGF0YVtqXSA9IGFycnR5cGUoYWxwaGEqZF9idWZbal0pOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9HRU1NX1NJTkdMRV9NVUwoIDMyZl9DMVIsIGZsb2F0LCBkb3VibGUpCitJQ1ZfREVGX0dFTU1fQkxPQ0tfTVVMKCAzMmZfQzFSLCBmbG9hdCwgZG91YmxlKQorSUNWX0RFRl9HRU1NX1NUT1JFKCAzMmZfQzFSLCBmbG9hdCwgZG91YmxlKQorCitJQ1ZfREVGX0dFTU1fU0lOR0xFX01VTCggNjRmX0MxUiwgZG91YmxlLCBkb3VibGUpCitJQ1ZfREVGX0dFTU1fQkxPQ0tfTVVMKCA2NGZfQzFSLCBkb3VibGUsIGRvdWJsZSkKK0lDVl9ERUZfR0VNTV9TVE9SRSggNjRmX0MxUiwgZG91YmxlLCBkb3VibGUpCisKK0lDVl9ERUZfR0VNTV9TSU5HTEVfTVVMKCAzMmZfQzJSLCBDdkNvbXBsZXgzMmYsIEN2Q29tcGxleDY0ZikKK0lDVl9ERUZfR0VNTV9CTE9DS19NVUwoIDMyZl9DMlIsIEN2Q29tcGxleDMyZiwgQ3ZDb21wbGV4NjRmKQorSUNWX0RFRl9HRU1NX1NUT1JFKCAzMmZfQzJSLCBDdkNvbXBsZXgzMmYsIEN2Q29tcGxleDY0ZikKKworSUNWX0RFRl9HRU1NX1NJTkdMRV9NVUwoIDY0Zl9DMlIsIEN2Q29tcGxleDY0ZiwgQ3ZDb21wbGV4NjRmKQorSUNWX0RFRl9HRU1NX0JMT0NLX01VTCggNjRmX0MyUiwgQ3ZDb21wbGV4NjRmLCBDdkNvbXBsZXg2NGYpCitJQ1ZfREVGX0dFTU1fU1RPUkUoIDY0Zl9DMlIsIEN2Q29tcGxleDY0ZiwgQ3ZDb21wbGV4NjRmKQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkdFTU1TaW5nbGVNdWxGdW5jKSggY29uc3Qgdm9pZCogc3JjMSwgc2l6ZV90IHN0ZXAxLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyYzIsIHNpemVfdCBzdGVwMiwgY29uc3Qgdm9pZCogc3JjMywgc2l6ZV90IHN0ZXAzLAorICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgc2l6ZV90IGRzdHN0ZXAsIEN2U2l6ZSBzcmNzaXplLCBDdlNpemUgZHN0c2l6ZSwKKyAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBpbnQgZmxhZ3MgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqQ3ZHRU1NQmxvY2tNdWxGdW5jKSggY29uc3Qgdm9pZCogc3JjMSwgc2l6ZV90IHN0ZXAxLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyYzIsIHNpemVfdCBzdGVwMiwgdm9pZCogZHN0LCBzaXplX3QgZHN0c3RlcCwKKyAgICAgICAgICAgICAgICAgICBDdlNpemUgc3Jjc2l6ZSwgQ3ZTaXplIGRzdHNpemUsIGludCBmbGFncyApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICpDdkdFTU1TdG9yZUZ1bmMpKCBjb25zdCB2b2lkKiBzcmMxLCBzaXplX3Qgc3RlcDEsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjMiwgc2l6ZV90IHN0ZXAyLCB2b2lkKiBkc3QsIHNpemVfdCBkc3RzdGVwLAorICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBkc3RzaXplLCBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhLCBpbnQgZmxhZ3MgKTsKKworCitzdGF0aWMgdm9pZCBpY3ZJbml0R0VNTVRhYmxlKCBDdkJpZ0Z1bmNUYWJsZSogc2luZ2xlX211bF90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkJpZ0Z1bmNUYWJsZSogYmxvY2tfbXVsX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2QmlnRnVuY1RhYmxlKiBzdG9yZV90YWIgKQoreworICAgIHNpbmdsZV9tdWxfdGFiLT5mbl8yZFtDVl8zMkZDMV0gPSAodm9pZCopaWN2R0VNTVNpbmdsZU11bF8zMmZfQzFSOworICAgIHNpbmdsZV9tdWxfdGFiLT5mbl8yZFtDVl82NEZDMV0gPSAodm9pZCopaWN2R0VNTVNpbmdsZU11bF82NGZfQzFSOworICAgIHNpbmdsZV9tdWxfdGFiLT5mbl8yZFtDVl8zMkZDMl0gPSAodm9pZCopaWN2R0VNTVNpbmdsZU11bF8zMmZfQzJSOworICAgIHNpbmdsZV9tdWxfdGFiLT5mbl8yZFtDVl82NEZDMl0gPSAodm9pZCopaWN2R0VNTVNpbmdsZU11bF82NGZfQzJSOworICAgIGJsb2NrX211bF90YWItPmZuXzJkW0NWXzMyRkMxXSA9ICh2b2lkKilpY3ZHRU1NQmxvY2tNdWxfMzJmX0MxUjsKKyAgICBibG9ja19tdWxfdGFiLT5mbl8yZFtDVl82NEZDMV0gPSAodm9pZCopaWN2R0VNTUJsb2NrTXVsXzY0Zl9DMVI7CisgICAgYmxvY2tfbXVsX3RhYi0+Zm5fMmRbQ1ZfMzJGQzJdID0gKHZvaWQqKWljdkdFTU1CbG9ja011bF8zMmZfQzJSOworICAgIGJsb2NrX211bF90YWItPmZuXzJkW0NWXzY0RkMyXSA9ICh2b2lkKilpY3ZHRU1NQmxvY2tNdWxfNjRmX0MyUjsKKyAgICBzdG9yZV90YWItPmZuXzJkW0NWXzMyRkMxXSA9ICh2b2lkKilpY3ZHRU1NU3RvcmVfMzJmX0MxUjsKKyAgICBzdG9yZV90YWItPmZuXzJkW0NWXzY0RkMxXSA9ICh2b2lkKilpY3ZHRU1NU3RvcmVfNjRmX0MxUjsKKyAgICBzdG9yZV90YWItPmZuXzJkW0NWXzMyRkMyXSA9ICh2b2lkKilpY3ZHRU1NU3RvcmVfMzJmX0MyUjsKKyAgICBzdG9yZV90YWItPmZuXzJkW0NWXzY0RkMyXSA9ICh2b2lkKilpY3ZHRU1NU3RvcmVfNjRmX0MyUjsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2R0VNTSggY29uc3QgQ3ZBcnIqIEFhcnIsIGNvbnN0IEN2QXJyKiBCYXJyLCBkb3VibGUgYWxwaGEsCisgICAgICAgIGNvbnN0IEN2QXJyKiBDYXJyLCBkb3VibGUgYmV0YSwgQ3ZBcnIqIERhcnIsIGludCBmbGFncyApCit7CisgICAgY29uc3QgaW50IGJsb2NrX2xpbl9zaXplID0gMTI4OworICAgIGNvbnN0IGludCBibG9ja19zaXplID0gYmxvY2tfbGluX3NpemUgKiBibG9ja19saW5fc2l6ZTsKKworICAgIHN0YXRpYyBDdkJpZ0Z1bmNUYWJsZSBzaW5nbGVfbXVsX3RhYiwgYmxvY2tfbXVsX3RhYiwgc3RvcmVfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisgICAgc3RhdGljIGRvdWJsZSB6ZXJvW10gPSB7MCwwLDAsMH07CisgICAgc3RhdGljIGZsb2F0IHplcm9mW10gPSB7MCwwLDAsMH07CisgICAgCisgICAgdWNoYXIqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKyAgICB1Y2hhciogYmxvY2tfYnVmZmVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZHRU1NIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgKkEgPSAoQ3ZNYXQqKUFhcnI7CisgICAgQ3ZNYXQgKkIgPSAoQ3ZNYXQqKUJhcnI7CisgICAgQ3ZNYXQgKkMgPSAoQ3ZNYXQqKUNhcnI7CisgICAgQ3ZNYXQgKkQgPSAoQ3ZNYXQqKURhcnI7CisgICAgaW50IGxlbiA9IDA7CisgICAgCisgICAgQ3ZNYXQgc3R1Yiwgc3R1YjEsIHN0dWIyLCBzdHViMzsKKyAgICBDdlNpemUgYV9zaXplLCBkX3NpemU7CisgICAgaW50IHR5cGU7CisKKyAgICBpZiggIUNWX0lTX01BVCggQSApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIEEgPSBjdkdldE1hdCggQSwgJnN0dWIxLCAmY29pICkpOworCisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBCICkpCisgICAgeworICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggQiA9IGN2R2V0TWF0KCBCLCAmc3R1YjIsICZjb2kgKSk7CisKKyAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoIEQgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBEID0gY3ZHZXRNYXQoIEQsICZzdHViLCAmY29pICkpOworCisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCBiZXRhID09IDAgKQorICAgICAgICBDID0gMDsKKworICAgIGlmKCBDICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKCBDICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICAgICAgQ1ZfQ0FMTCggQyA9IGN2R2V0TWF0KCBDLCAmc3R1YjMsICZjb2kgKSk7CisKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBDLCBEICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgICAgICBpZiggKChmbGFncyZDVl9HRU1NX0NfVCkgPT0gMCAmJiAoQy0+Y29scyAhPSBELT5jb2xzIHx8IEMtPnJvd3MgIT0gRC0+cm93cykpIHx8CisgICAgICAgICAgICAoKGZsYWdzJkNWX0dFTU1fQ19UKSAhPSAwICYmIChDLT5yb3dzICE9IEQtPmNvbHMgfHwgQy0+Y29scyAhPSBELT5yb3dzKSkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAgICAgaWYoIChmbGFncyAmIENWX0dFTU1fQ19UKSAhPSAwICYmIEMtPmRhdGEucHRyID09IEQtPmRhdGEucHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZUcmFuc3Bvc2UoIEMsIEQgKTsKKyAgICAgICAgICAgIEMgPSBEOworICAgICAgICAgICAgZmxhZ3MgJj0gfkNWX0dFTU1fQ19UOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEMgPSAmc3R1YjM7CisgICAgICAgIEMtPmRhdGEucHRyID0gMDsKKyAgICAgICAgQy0+c3RlcCA9IDA7CisgICAgICAgIEMtPnR5cGUgPSBDVl9NQVRfQ09OVF9GTEFHOworICAgIH0KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShBLT50eXBlKTsKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggQSwgQiApIHx8ICFDVl9BUkVfVFlQRVNfRVEoIEEsIEQgKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgYV9zaXplLndpZHRoID0gQS0+Y29sczsKKyAgICBhX3NpemUuaGVpZ2h0ID0gQS0+cm93czsKKyAgICBkX3NpemUud2lkdGggPSBELT5jb2xzOworICAgIGRfc2l6ZS5oZWlnaHQgPSBELT5yb3dzOworCisgICAgc3dpdGNoKCBmbGFncyAmIChDVl9HRU1NX0FfVHxDVl9HRU1NX0JfVCkgKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGxlbiA9IEItPnJvd3M7CisgICAgICAgIGlmKCBhX3NpemUud2lkdGggIT0gbGVuIHx8CisgICAgICAgICAgICBCLT5jb2xzICE9IGRfc2l6ZS53aWR0aCB8fAorICAgICAgICAgICAgYV9zaXplLmhlaWdodCAhPSBkX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBsZW4gPSBCLT5yb3dzOworICAgICAgICBpZiggYV9zaXplLmhlaWdodCAhPSBsZW4gfHwKKyAgICAgICAgICAgIEItPmNvbHMgIT0gZF9zaXplLndpZHRoIHx8CisgICAgICAgICAgICBhX3NpemUud2lkdGggIT0gZF9zaXplLmhlaWdodCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgbGVuID0gQi0+Y29sczsKKyAgICAgICAgaWYoIGFfc2l6ZS53aWR0aCAhPSBsZW4gfHwKKyAgICAgICAgICAgIEItPnJvd3MgIT0gZF9zaXplLndpZHRoIHx8CisgICAgICAgICAgICBhX3NpemUuaGVpZ2h0ICE9IGRfc2l6ZS5oZWlnaHQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGxlbiA9IEItPmNvbHM7CisgICAgICAgIGlmKCBhX3NpemUuaGVpZ2h0ICE9IGxlbiB8fAorICAgICAgICAgICAgQi0+cm93cyAhPSBkX3NpemUud2lkdGggfHwKKyAgICAgICAgICAgIGFfc2l6ZS53aWR0aCAhPSBkX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYoIGZsYWdzID09IDAgJiYgMiA8PSBsZW4gJiYgbGVuIDw9IDQgJiYgKGxlbiA9PSBkX3NpemUud2lkdGggfHwgbGVuID09IGRfc2l6ZS5oZWlnaHQpICkKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBpZiggdHlwZSA9PSBDVl82NEYgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIGQgPSBELT5kYXRhLmRiOworICAgICAgICAgICAgY29uc3QgZG91YmxlICphID0gQS0+ZGF0YS5kYiwgKmIgPSBCLT5kYXRhLmRiLCAqYyA9IEMtPmRhdGEuZGI7CisgICAgICAgICAgICBzaXplX3QgZF9zdGVwID0gRC0+c3RlcC9zaXplb2YoZFswXSksCisgICAgICAgICAgICAgICAgICAgYV9zdGVwID0gQS0+c3RlcC9zaXplb2YoYVswXSksCisgICAgICAgICAgICAgICAgICAgYl9zdGVwID0gQi0+c3RlcC9zaXplb2YoYlswXSksCisgICAgICAgICAgICAgICAgICAgY19zdGVwID0gQy0+c3RlcC9zaXplb2YoY1swXSk7CisKKyAgICAgICAgICAgIGlmKCAhYyApCisgICAgICAgICAgICAgICAgYyA9IHplcm87CisKKyAgICAgICAgICAgIHN3aXRjaCggbGVuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiggbGVuID09IGRfc2l6ZS53aWR0aCAmJiBiICE9IGQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfc2l6ZS5oZWlnaHQ7IGkrKywgZCArPSBkX3N0ZXAsIGEgKz0gYV9zdGVwLCBjICs9IGNfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQxID0gYVswXSpiWzFdICsgYVsxXSpiW2Jfc3RlcCsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSB0MCphbHBoYSArIGNbMF0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMV0gPSB0MSphbHBoYSArIGNbMV0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBhICE9IGQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNfc3RlcDAgPSAxOworICAgICAgICAgICAgICAgICAgICBpZiggYyA9PSB6ZXJvICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY19zdGVwMCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBjX3N0ZXAgPSAxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfc2l6ZS53aWR0aDsgaSsrLCBkKyssIGIrKywgYyArPSBjX3N0ZXAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gYVswXSpiWzBdICsgYVsxXSpiW2Jfc3RlcF07CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDEgPSBhW2Ffc3RlcF0qYlswXSArIGFbYV9zdGVwKzFdKmJbYl9zdGVwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSB0MCphbHBoYSArIGNbMF0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZF9zdGVwXSA9IHQxKmFscGhhICsgY1tjX3N0ZXBdKmJldGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmKCBsZW4gPT0gZF9zaXplLndpZHRoICYmIGIgIT0gZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLmhlaWdodDsgaSsrLCBkICs9IGRfc3RlcCwgYSArPSBhX3N0ZXAsIGMgKz0gY19zdGVwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gYVswXSpiWzBdICsgYVsxXSpiW2Jfc3RlcF0gKyBhWzJdKmJbYl9zdGVwKjJdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQxID0gYVswXSpiWzFdICsgYVsxXSpiW2Jfc3RlcCsxXSArIGFbMl0qYltiX3N0ZXAqMisxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MiA9IGFbMF0qYlsyXSArIGFbMV0qYltiX3N0ZXArMl0gKyBhWzJdKmJbYl9zdGVwKjIrMl07CisgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gdDAqYWxwaGEgKyBjWzBdKmJldGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkWzFdID0gdDEqYWxwaGEgKyBjWzFdKmJldGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkWzJdID0gdDIqYWxwaGEgKyBjWzJdKmJldGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYSAhPSBkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjX3N0ZXAwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gemVybyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RlcDAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY19zdGVwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX3NpemUud2lkdGg7IGkrKywgZCsrLCBiKyssIGMgKz0gY19zdGVwMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdICsgYVsyXSpiW2Jfc3RlcCoyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MSA9IGFbYV9zdGVwXSpiWzBdICsgYVthX3N0ZXArMV0qYltiX3N0ZXBdICsgYVthX3N0ZXArMl0qYltiX3N0ZXAqMl07CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDIgPSBhW2Ffc3RlcCoyXSpiWzBdICsgYVthX3N0ZXAqMisxXSpiW2Jfc3RlcF0gKyBhW2Ffc3RlcCoyKzJdKmJbYl9zdGVwKjJdOworCisgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gdDAqYWxwaGEgKyBjWzBdKmJldGE7CisgICAgICAgICAgICAgICAgICAgICAgICBkW2Rfc3RlcF0gPSB0MSphbHBoYSArIGNbY19zdGVwXSpiZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXAqMl0gPSB0MiphbHBoYSArIGNbY19zdGVwKjJdKmJldGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmKCBsZW4gPT0gZF9zaXplLndpZHRoICYmIGIgIT0gZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLmhlaWdodDsgaSsrLCBkICs9IGRfc3RlcCwgYSArPSBhX3N0ZXAsIGMgKz0gY19zdGVwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gYVswXSpiWzBdICsgYVsxXSpiW2Jfc3RlcF0gKyBhWzJdKmJbYl9zdGVwKjJdICsgYVszXSpiW2Jfc3RlcCozXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MSA9IGFbMF0qYlsxXSArIGFbMV0qYltiX3N0ZXArMV0gKyBhWzJdKmJbYl9zdGVwKjIrMV0gKyBhWzNdKmJbYl9zdGVwKjMrMV07CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDIgPSBhWzBdKmJbMl0gKyBhWzFdKmJbYl9zdGVwKzJdICsgYVsyXSpiW2Jfc3RlcCoyKzJdICsgYVszXSpiW2Jfc3RlcCozKzJdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQzID0gYVswXSpiWzNdICsgYVsxXSpiW2Jfc3RlcCszXSArIGFbMl0qYltiX3N0ZXAqMiszXSArIGFbM10qYltiX3N0ZXAqMyszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSB0MCphbHBoYSArIGNbMF0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMV0gPSB0MSphbHBoYSArIGNbMV0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMl0gPSB0MiphbHBoYSArIGNbMl0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbM10gPSB0MyphbHBoYSArIGNbM10qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBkX3NpemUud2lkdGggPD0gMTYgJiYgYSAhPSBkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjX3N0ZXAwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gemVybyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RlcDAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgY19zdGVwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX3NpemUud2lkdGg7IGkrKywgZCsrLCBiKyssIGMgKz0gY19zdGVwMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdICsgYVsyXSpiW2Jfc3RlcCoyXSArIGFbM10qYltiX3N0ZXAqM107CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDEgPSBhW2Ffc3RlcF0qYlswXSArIGFbYV9zdGVwKzFdKmJbYl9zdGVwXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhW2Ffc3RlcCsyXSpiW2Jfc3RlcCoyXSArIGFbYV9zdGVwKzNdKmJbYl9zdGVwKjNdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gYVthX3N0ZXAqMl0qYlswXSArIGFbYV9zdGVwKjIrMV0qYltiX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYV9zdGVwKjIrMl0qYltiX3N0ZXAqMl0gKyBhW2Ffc3RlcCoyKzNdKmJbYl9zdGVwKjNdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQzID0gYVthX3N0ZXAqM10qYlswXSArIGFbYV9zdGVwKjMrMV0qYltiX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYV9zdGVwKjMrMl0qYltiX3N0ZXAqMl0gKyBhW2Ffc3RlcCozKzNdKmJbYl9zdGVwKjNdOworICAgICAgICAgICAgICAgICAgICAgICAgZFswXSA9IHQwKmFscGhhICsgY1swXSpiZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXBdID0gdDEqYWxwaGEgKyBjW2Nfc3RlcF0qYmV0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZF9zdGVwKjJdID0gdDIqYWxwaGEgKyBjW2Nfc3RlcCoyXSpiZXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXAqM10gPSB0MyphbHBoYSArIGNbY19zdGVwKjNdKmJldGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIGQgPSBELT5kYXRhLmZsOworICAgICAgICAgICAgY29uc3QgZmxvYXQgKmEgPSBBLT5kYXRhLmZsLCAqYiA9IEItPmRhdGEuZmwsICpjID0gQy0+ZGF0YS5mbDsKKyAgICAgICAgICAgIHNpemVfdCBkX3N0ZXAgPSBELT5zdGVwL3NpemVvZihkWzBdKSwKKyAgICAgICAgICAgICAgICAgICBhX3N0ZXAgPSBBLT5zdGVwL3NpemVvZihhWzBdKSwKKyAgICAgICAgICAgICAgICAgICBiX3N0ZXAgPSBCLT5zdGVwL3NpemVvZihiWzBdKSwKKyAgICAgICAgICAgICAgICAgICBjX3N0ZXAgPSBDLT5zdGVwL3NpemVvZihjWzBdKTsKKworICAgICAgICAgICAgaWYoICFjICkKKyAgICAgICAgICAgICAgICBjID0gemVyb2Y7CisKKyAgICAgICAgICAgIHN3aXRjaCggbGVuICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICBpZiggbGVuID09IGRfc2l6ZS53aWR0aCAmJiBiICE9IGQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfc2l6ZS5oZWlnaHQ7IGkrKywgZCArPSBkX3N0ZXAsIGEgKz0gYV9zdGVwLCBjICs9IGNfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gYVswXSpiWzBdICsgYVsxXSpiW2Jfc3RlcF07CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGFbMF0qYlsxXSArIGFbMV0qYltiX3N0ZXArMV07CisgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gKGZsb2F0KSh0MCphbHBoYSArIGNbMF0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkWzFdID0gKGZsb2F0KSh0MSphbHBoYSArIGNbMV0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYSAhPSBkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjX3N0ZXAwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gemVyb2YgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjX3N0ZXAwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLndpZHRoOyBpKyssIGQrKywgYisrLCBjICs9IGNfc3RlcDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdOworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDEgPSBhW2Ffc3RlcF0qYlswXSArIGFbYV9zdGVwKzFdKmJbYl9zdGVwXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSAoZmxvYXQpKHQwKmFscGhhICsgY1swXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZF9zdGVwXSA9IChmbG9hdCkodDEqYWxwaGEgKyBjW2Nfc3RlcF0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmKCBsZW4gPT0gZF9zaXplLndpZHRoICYmIGIgIT0gZCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLmhlaWdodDsgaSsrLCBkICs9IGRfc3RlcCwgYSArPSBhX3N0ZXAsIGMgKz0gY19zdGVwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSBhWzBdKmJbMF0gKyBhWzFdKmJbYl9zdGVwXSArIGFbMl0qYltiX3N0ZXAqMl07CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGFbMF0qYlsxXSArIGFbMV0qYltiX3N0ZXArMV0gKyBhWzJdKmJbYl9zdGVwKjIrMV07CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MiA9IGFbMF0qYlsyXSArIGFbMV0qYltiX3N0ZXArMl0gKyBhWzJdKmJbYl9zdGVwKjIrMl07CisgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gKGZsb2F0KSh0MCphbHBoYSArIGNbMF0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkWzFdID0gKGZsb2F0KSh0MSphbHBoYSArIGNbMV0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkWzJdID0gKGZsb2F0KSh0MiphbHBoYSArIGNbMl0qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYSAhPSBkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjX3N0ZXAwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gemVyb2YgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjX3N0ZXAwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLndpZHRoOyBpKyssIGQrKywgYisrLCBjICs9IGNfc3RlcDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdICsgYVsyXSpiW2Jfc3RlcCoyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gYVthX3N0ZXBdKmJbMF0gKyBhW2Ffc3RlcCsxXSpiW2Jfc3RlcF0gKyBhW2Ffc3RlcCsyXSpiW2Jfc3RlcCoyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQyID0gYVthX3N0ZXAqMl0qYlswXSArIGFbYV9zdGVwKjIrMV0qYltiX3N0ZXBdICsgYVthX3N0ZXAqMisyXSpiW2Jfc3RlcCoyXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZFswXSA9IChmbG9hdCkodDAqYWxwaGEgKyBjWzBdKmJldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXBdID0gKGZsb2F0KSh0MSphbHBoYSArIGNbY19zdGVwXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZF9zdGVwKjJdID0gKGZsb2F0KSh0MiphbHBoYSArIGNbY19zdGVwKjJdKmJldGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBpZiggbGVuID09IGRfc2l6ZS53aWR0aCAmJiBiICE9IGQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRfc2l6ZS5oZWlnaHQ7IGkrKywgZCArPSBkX3N0ZXAsIGEgKz0gYV9zdGVwLCBjICs9IGNfc3RlcCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQwID0gYVswXSpiWzBdICsgYVsxXSpiW2Jfc3RlcF0gKyBhWzJdKmJbYl9zdGVwKjJdICsgYVszXSpiW2Jfc3RlcCozXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gYVswXSpiWzFdICsgYVsxXSpiW2Jfc3RlcCsxXSArIGFbMl0qYltiX3N0ZXAqMisxXSArIGFbM10qYltiX3N0ZXAqMysxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQyID0gYVswXSpiWzJdICsgYVsxXSpiW2Jfc3RlcCsyXSArIGFbMl0qYltiX3N0ZXAqMisyXSArIGFbM10qYltiX3N0ZXAqMysyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQzID0gYVswXSpiWzNdICsgYVsxXSpiW2Jfc3RlcCszXSArIGFbMl0qYltiX3N0ZXAqMiszXSArIGFbM10qYltiX3N0ZXAqMyszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMF0gPSAoZmxvYXQpKHQwKmFscGhhICsgY1swXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMV0gPSAoZmxvYXQpKHQxKmFscGhhICsgY1sxXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbMl0gPSAoZmxvYXQpKHQyKmFscGhhICsgY1syXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbM10gPSAoZmxvYXQpKHQzKmFscGhhICsgY1szXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBsZW4gPD0gMTYgJiYgYSAhPSBkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjX3N0ZXAwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGMgPT0gemVyb2YgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjX3N0ZXAwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNfc3RlcCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZF9zaXplLndpZHRoOyBpKyssIGQrKywgYisrLCBjICs9IGNfc3RlcDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MCA9IGFbMF0qYlswXSArIGFbMV0qYltiX3N0ZXBdICsgYVsyXSpiW2Jfc3RlcCoyXSArIGFbM10qYltiX3N0ZXAqM107CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MSA9IGFbYV9zdGVwXSpiWzBdICsgYVthX3N0ZXArMV0qYltiX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVthX3N0ZXArMl0qYltiX3N0ZXAqMl0gKyBhW2Ffc3RlcCszXSpiW2Jfc3RlcCozXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHQyID0gYVthX3N0ZXAqMl0qYlswXSArIGFbYV9zdGVwKjIrMV0qYltiX3N0ZXBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVthX3N0ZXAqMisyXSpiW2Jfc3RlcCoyXSArIGFbYV9zdGVwKjIrM10qYltiX3N0ZXAqM107CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0MyA9IGFbYV9zdGVwKjNdKmJbMF0gKyBhW2Ffc3RlcCozKzFdKmJbYl9zdGVwXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbYV9zdGVwKjMrMl0qYltiX3N0ZXAqMl0gKyBhW2Ffc3RlcCozKzNdKmJbYl9zdGVwKjNdOworICAgICAgICAgICAgICAgICAgICAgICAgZFswXSA9IChmbG9hdCkodDAqYWxwaGEgKyBjWzBdKmJldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXBdID0gKGZsb2F0KSh0MSphbHBoYSArIGNbY19zdGVwXSpiZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRbZF9zdGVwKjJdID0gKGZsb2F0KSh0MiphbHBoYSArIGNbY19zdGVwKjJdKmJldGEpOworICAgICAgICAgICAgICAgICAgICAgICAgZFtkX3N0ZXAqM10gPSAoZmxvYXQpKHQzKmFscGhhICsgY1tjX3N0ZXAqM10qYmV0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorIAorICAgIHsKKyAgICAgICAgaW50IGJfc3RlcCA9IEItPnN0ZXA7CisgICAgICAgIEN2R0VNTVNpbmdsZU11bEZ1bmMgc2luZ2xlX211bF9mdW5jOworICAgICAgICBDdk1hdCB0bWF0LCAqRDAgPSBEOworICAgICAgICBpY3ZCTEFTX0dFTU1fMzJmX3QgYmxhc19mdW5jID0gMDsKKworICAgICAgICBpZiggIWluaXR0YWIgKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZJbml0R0VNTVRhYmxlKCAmc2luZ2xlX211bF90YWIsICZibG9ja19tdWxfdGFiLCAmc3RvcmVfdGFiICk7CisgICAgICAgICAgICBpbml0dGFiID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNpbmdsZV9tdWxfZnVuYyA9IChDdkdFTU1TaW5nbGVNdWxGdW5jKXNpbmdsZV9tdWxfdGFiLmZuXzJkW3R5cGVdOworICAgICAgICBpZiggIXNpbmdsZV9tdWxfZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgaWYoIEQtPmRhdGEucHRyID09IEEtPmRhdGEucHRyIHx8IEQtPmRhdGEucHRyID09IEItPmRhdGEucHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGJ1Zl9zaXplID0gZF9zaXplLndpZHRoKmRfc2l6ZS5oZWlnaHQqQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgICAgICAgICAgaWYoIGRfc2l6ZS53aWR0aCA8PSBDVl9NQVhfTE9DQUxfTUFUX1NJWkUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlciA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBidWZfc2l6ZSApOworICAgICAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSAodWNoYXIqKWN2QWxsb2MoIGJ1Zl9zaXplICkpOworCisgICAgICAgICAgICB0bWF0ID0gY3ZNYXQoIGRfc2l6ZS5oZWlnaHQsIGRfc2l6ZS53aWR0aCwgdHlwZSwgYnVmZmVyICk7CisgICAgICAgICAgICBEID0gJnRtYXQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggKGRfc2l6ZS53aWR0aCA9PSAxIHx8IGxlbiA9PSAxKSAmJiAhKGZsYWdzICYgQ1ZfR0VNTV9CX1QpICYmIENWX0lTX01BVF9DT05UKEItPnR5cGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgYl9zdGVwID0gZF9zaXplLndpZHRoID09IDEgPyAwIDogQ1ZfRUxFTV9TSVpFKHR5cGUpOworICAgICAgICAgICAgZmxhZ3MgfD0gQ1ZfR0VNTV9CX1Q7CisgICAgICAgIH0KKworICAgICAgICBpZiggKGRfc2l6ZS53aWR0aCB8IGRfc2l6ZS5oZWlnaHQgfCBsZW4pID49IDE2ICYmIGljdkJMQVNfR0VNTV8zMmZfcCAhPSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgYmxhc19mdW5jID0gdHlwZSA9PSBDVl8zMkZDMSA/IChpY3ZCTEFTX0dFTU1fMzJmX3QpaWN2QkxBU19HRU1NXzMyZl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfNjRGQzEgPyAoaWN2QkxBU19HRU1NXzMyZl90KWljdkJMQVNfR0VNTV82NGZfcCA6CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkMyID8gKGljdkJMQVNfR0VNTV8zMmZfdClpY3ZCTEFTX0dFTU1fMzJmY19wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfNjRGQzIgPyAoaWN2QkxBU19HRU1NXzMyZl90KWljdkJMQVNfR0VNTV82NGZjX3AgOiAwOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGJsYXNfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRyYW5zYSA9IGZsYWdzICYgQ1ZfR0VNTV9BX1QgPyAidCIgOiAibiI7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0cmFuc2IgPSBmbGFncyAmIENWX0dFTU1fQl9UID8gInQiIDogIm4iOworICAgICAgICAgICAgaW50IGxkYSwgbGRiLCBsZGQ7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBDLT5kYXRhLnB0ciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIEMtPmRhdGEucHRyICE9IEQtPmRhdGEucHRyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfR0VNTV9DX1QpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2Q29weSggQywgRCApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBjdlRyYW5zcG9zZSggQywgRCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl8zMkYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2Q29tcGxleDMyZiBfYWxwaGEsIF9iZXRhOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxkYSA9IEEtPnN0ZXAvc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgICAgICAgICBsZGIgPSBiX3N0ZXAvc2l6ZW9mKGZsb2F0KTsKKyAgICAgICAgICAgICAgICBsZGQgPSBELT5zdGVwL3NpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgX2FscGhhLnJlID0gKGZsb2F0KWFscGhhOworICAgICAgICAgICAgICAgIF9hbHBoYS5pbSA9IDA7CisgICAgICAgICAgICAgICAgX2JldGEucmUgPSBDLT5kYXRhLnB0ciA/IChmbG9hdCliZXRhIDogMDsKKyAgICAgICAgICAgICAgICBfYmV0YS5pbSA9IDA7CisgICAgICAgICAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA9PSAyICkKKyAgICAgICAgICAgICAgICAgICAgbGRhIC89IDIsIGxkYiAvPSAyLCBsZGQgLz0gMjsKKworICAgICAgICAgICAgICAgIGJsYXNfZnVuYyggdHJhbnNiLCB0cmFuc2EsICZkX3NpemUud2lkdGgsICZkX3NpemUuaGVpZ2h0LCAmbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAmX2FscGhhLCBCLT5kYXRhLnB0ciwgJmxkYiwgQS0+ZGF0YS5wdHIsICZsZGEsCisgICAgICAgICAgICAgICAgICAgICAgICZfYmV0YSwgRC0+ZGF0YS5wdHIsICZsZGQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkNvbXBsZXg2NGYgX2FscGhhLCBfYmV0YTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsZGEgPSBBLT5zdGVwL3NpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgIGxkYiA9IGJfc3RlcC9zaXplb2YoZG91YmxlKTsKKyAgICAgICAgICAgICAgICBsZGQgPSBELT5zdGVwL3NpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgIF9hbHBoYS5yZSA9IGFscGhhOworICAgICAgICAgICAgICAgIF9hbHBoYS5pbSA9IDA7CisgICAgICAgICAgICAgICAgX2JldGEucmUgPSBDLT5kYXRhLnB0ciA/IGJldGEgOiAwOworICAgICAgICAgICAgICAgIF9iZXRhLmltID0gMDsKKyAgICAgICAgICAgICAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID09IDIgKQorICAgICAgICAgICAgICAgICAgICBsZGEgLz0gMiwgbGRiIC89IDIsIGxkZCAvPSAyOworCisgICAgICAgICAgICAgICAgYmxhc19mdW5jKCB0cmFuc2IsIHRyYW5zYSwgJmRfc2l6ZS53aWR0aCwgJmRfc2l6ZS5oZWlnaHQsICZsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICZfYWxwaGEsIEItPmRhdGEucHRyLCAmbGRiLCBBLT5kYXRhLnB0ciwgJmxkYSwKKyAgICAgICAgICAgICAgICAgICAgICAgJl9iZXRhLCBELT5kYXRhLnB0ciwgJmxkZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoICgoZF9zaXplLmhlaWdodCA8PSBibG9ja19saW5fc2l6ZS8yIHx8IGRfc2l6ZS53aWR0aCA8PSBibG9ja19saW5fc2l6ZS8yKSAmJgorICAgICAgICAgICAgbGVuIDw9IDEwMDAwKSB8fCBsZW4gPD0gMTAgfHwKKyAgICAgICAgICAgIChkX3NpemUud2lkdGggPD0gYmxvY2tfbGluX3NpemUgJiYgZF9zaXplLmhlaWdodCA8PSBibG9ja19saW5fc2l6ZSAmJiBsZW4gPD0gYmxvY2tfbGluX3NpemUpICkKKyAgICAgICAgeworICAgICAgICAgICAgc2luZ2xlX211bF9mdW5jKCBBLT5kYXRhLnB0ciwgQS0+c3RlcCwgQi0+ZGF0YS5wdHIsIGJfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQy0+ZGF0YS5wdHIsIEMtPnN0ZXAsIEQtPmRhdGEucHRyLCBELT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX3NpemUsIGRfc2l6ZSwgYWxwaGEsIGJldGEsIGZsYWdzICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaXNfYV90ID0gZmxhZ3MgJiBDVl9HRU1NX0FfVDsKKyAgICAgICAgICAgIGludCBpc19iX3QgPSBmbGFncyAmIENWX0dFTU1fQl9UOworICAgICAgICAgICAgaW50IGVsZW1fc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKyAgICAgICAgICAgIGludCBkazBfMSwgZGswXzI7CisgICAgICAgICAgICBpbnQgYV9idWZfc2l6ZSA9IDAsIGJfYnVmX3NpemUsIGRfYnVmX3NpemU7CisgICAgICAgICAgICB1Y2hhciogYV9idWYgPSAwOworICAgICAgICAgICAgdWNoYXIqIGJfYnVmID0gMDsKKyAgICAgICAgICAgIHVjaGFyKiBkX2J1ZiA9IDA7CisgICAgICAgICAgICBpbnQgaSwgaiwgaywgZGkgPSAwLCBkaiA9IDAsIGRrID0gMDsKKyAgICAgICAgICAgIGludCBkbTAsIGRuMCwgZGswOworICAgICAgICAgICAgaW50IGFfc3RlcDAsIGFfc3RlcDEsIGJfc3RlcDAsIGJfc3RlcDEsIGNfc3RlcDAsIGNfc3RlcDE7CisgICAgICAgICAgICBpbnQgd29ya19lbGVtX3NpemUgPSBlbGVtX3NpemUgPDwgKENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl8zMkYgPyAxIDogMCk7CisgICAgICAgICAgICBDdkdFTU1CbG9ja011bEZ1bmMgYmxvY2tfbXVsX2Z1bmMgPSAoQ3ZHRU1NQmxvY2tNdWxGdW5jKWJsb2NrX211bF90YWIuZm5fMmRbdHlwZV07CisgICAgICAgICAgICBDdkdFTU1TdG9yZUZ1bmMgc3RvcmVfZnVuYyA9IChDdkdFTU1TdG9yZUZ1bmMpc3RvcmVfdGFiLmZuXzJkW3R5cGVdOworCisgICAgICAgICAgICBhc3NlcnQoIGJsb2NrX211bF9mdW5jICYmIHN0b3JlX2Z1bmMgKTsKKworICAgICAgICAgICAgaWYoICFpc19hX3QgKQorICAgICAgICAgICAgICAgIGFfc3RlcDAgPSBBLT5zdGVwLCBhX3N0ZXAxID0gZWxlbV9zaXplOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGFfc3RlcDAgPSBlbGVtX3NpemUsIGFfc3RlcDEgPSBBLT5zdGVwOworCisgICAgICAgICAgICBpZiggIWlzX2JfdCApCisgICAgICAgICAgICAgICAgYl9zdGVwMCA9IGJfc3RlcCwgYl9zdGVwMSA9IGVsZW1fc2l6ZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBiX3N0ZXAwID0gZWxlbV9zaXplLCBiX3N0ZXAxID0gYl9zdGVwOworCisgICAgICAgICAgICBpZiggIUMtPmRhdGEucHRyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjX3N0ZXAwID0gY19zdGVwMSA9IDA7CisgICAgICAgICAgICAgICAgZmxhZ3MgJj0gfkNWX0dFTU1fQ19UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggIShmbGFncyAmIENWX0dFTU1fQ19UKSApCisgICAgICAgICAgICAgICAgY19zdGVwMCA9IEMtPnN0ZXAsIGNfc3RlcDEgPSBlbGVtX3NpemU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY19zdGVwMCA9IGVsZW1fc2l6ZSwgY19zdGVwMSA9IEMtPnN0ZXA7CisKKyAgICAgICAgICAgIGRtMCA9IE1JTiggYmxvY2tfbGluX3NpemUsIGRfc2l6ZS5oZWlnaHQgKTsKKyAgICAgICAgICAgIGRuMCA9IE1JTiggYmxvY2tfbGluX3NpemUsIGRfc2l6ZS53aWR0aCApOworICAgICAgICAgICAgZGswXzEgPSBibG9ja19zaXplIC8gZG0wOworICAgICAgICAgICAgZGswXzIgPSBibG9ja19zaXplIC8gZG4wOworICAgICAgICAgICAgZGswID0gTUFYKCBkazBfMSwgZGswXzIgKTsKKyAgICAgICAgICAgIGRrMCA9IE1JTiggZGswLCBsZW4gKTsKKyAgICAgICAgICAgIGlmKCBkazAqZG0wID4gYmxvY2tfc2l6ZSApCisgICAgICAgICAgICAgICAgZG0wID0gYmxvY2tfc2l6ZSAvIGRrMDsKKyAgICAgICAgICAgIGlmKCBkazAqZG4wID4gYmxvY2tfc2l6ZSApCisgICAgICAgICAgICAgICAgZG4wID0gYmxvY2tfc2l6ZSAvIGRrMDsKKworICAgICAgICAgICAgZGswXzEgPSAoZG4wK2RuMC84KzIpICYgLTI7CisgICAgICAgICAgICBiX2J1Zl9zaXplID0gKGRrMCtkazAvOCsxKSpkazBfMSplbGVtX3NpemU7CisgICAgICAgICAgICBkX2J1Zl9zaXplID0gKGRrMCtkazAvOCsxKSpkazBfMSp3b3JrX2VsZW1fc2l6ZTsKKyAgICAgICAgCisgICAgICAgICAgICBpZiggaXNfYV90ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhX2J1Zl9zaXplID0gKGRtMCtkbTAvOCsxKSooKGRrMCtkazAvOCsyKSYtMikqZWxlbV9zaXplOworICAgICAgICAgICAgICAgIGZsYWdzICY9IH5DVl9HRU1NX0FfVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ1ZfQ0FMTCggYmxvY2tfYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKGFfYnVmX3NpemUgKyBiX2J1Zl9zaXplICsgZF9idWZfc2l6ZSkpOworICAgICAgICAgICAgZF9idWYgPSBibG9ja19idWZmZXI7CisgICAgICAgICAgICBiX2J1ZiA9IGRfYnVmICsgZF9idWZfc2l6ZTsKKworICAgICAgICAgICAgaWYoIGlzX2FfdCApCisgICAgICAgICAgICAgICAgYV9idWYgPSBiX2J1ZiArIGJfYnVmX3NpemU7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkX3NpemUuaGVpZ2h0OyBpICs9IGRpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkaSA9IGRtMDsKKyAgICAgICAgICAgICAgICBpZiggaSArIGRpID49IGRfc2l6ZS5oZWlnaHQgfHwgOCooaSArIGRpKSArIGRpID4gOCpkX3NpemUuaGVpZ2h0ICkKKyAgICAgICAgICAgICAgICAgICAgZGkgPSBkX3NpemUuaGVpZ2h0IC0gaTsKKworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkX3NpemUud2lkdGg7IGogKz0gZGogKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIqIF9kID0gRC0+ZGF0YS5wdHIgKyBpKkQtPnN0ZXAgKyBqKmVsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIF9jID0gQy0+ZGF0YS5wdHIgKyBpKmNfc3RlcDAgKyBqKmNfc3RlcDE7CisgICAgICAgICAgICAgICAgICAgIGludCBfZF9zdGVwID0gRC0+c3RlcDsKKyAgICAgICAgICAgICAgICAgICAgZGogPSBkbjA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGogKyBkaiA+PSBkX3NpemUud2lkdGggfHwgOCooaiArIGRqKSArIGRqID4gOCpkX3NpemUud2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgZGogPSBkX3NpemUud2lkdGggLSBqOworCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICY9IDE1OworICAgICAgICAgICAgICAgICAgICBpZiggZGswIDwgbGVuICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX2QgPSBkX2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9kX3N0ZXAgPSBkaip3b3JrX2VsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBsZW47IGsgKz0gZGsgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogX2EgPSBBLT5kYXRhLnB0ciArIGkqYV9zdGVwMCArIGsqYV9zdGVwMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBfYV9zdGVwID0gQS0+c3RlcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBfYiA9IEItPmRhdGEucHRyICsgaypiX3N0ZXAwICsgaipiX3N0ZXAxOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IF9iX3N0ZXAgPSBiX3N0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgYV9ibF9zaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICBkayA9IGRrMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBrICsgZGsgPj0gbGVuIHx8IDgqKGsgKyBkaykgKyBkayA+IDgqbGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkayA9IGxlbiAtIGs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNfYV90ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX2JsX3NpemUud2lkdGggPSBkaywgYV9ibF9zaXplLmhlaWdodCA9IGRpOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfYmxfc2l6ZS53aWR0aCA9IGRpLCBhX2JsX3NpemUuaGVpZ2h0ID0gZGs7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBhX2J1ZiAmJiBpc19hX3QgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hX3N0ZXAgPSBkayplbGVtX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2R0VNTV9UcmFuc3Bvc2VCbG9jayggX2EsIEEtPnN0ZXAsIGFfYnVmLCBfYV9zdGVwLCBhX2JsX3NpemUsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIGFfYmxfc2l6ZS53aWR0aCwgYV9ibF9zaXplLmhlaWdodCwgdCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hID0gYV9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkaiA8IGRfc2l6ZS53aWR0aCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIGJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggIWlzX2JfdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJfc2l6ZS53aWR0aCA9IGRqLCBiX3NpemUuaGVpZ2h0ID0gZGs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiX3NpemUud2lkdGggPSBkaywgYl9zaXplLmhlaWdodCA9IGRqOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Jfc3RlcCA9IGJfc2l6ZS53aWR0aCplbGVtX3NpemU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2R0VNTV9Db3B5QmxvY2soIF9iLCBiX3N0ZXAsIGJfYnVmLCBfYl9zdGVwLCBiX3NpemUsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9iID0gYl9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkazAgPCBsZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrX211bF9mdW5jKCBfYSwgX2Ffc3RlcCwgX2IsIF9iX3N0ZXAsIF9kLCBfZF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhX2JsX3NpemUsIGN2U2l6ZShkaixkaSksIGZsYWdzICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX211bF9mdW5jKCBfYSwgX2Ffc3RlcCwgX2IsIF9iX3N0ZXAsIF9jLCBDLT5zdGVwLCBfZCwgX2Rfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFfYmxfc2l6ZSwgY3ZTaXplKGRqLGRpKSwgYWxwaGEsIGJldGEsIGZsYWdzICk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSAxNjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCBkazAgPCBsZW4gKQorICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmVfZnVuYyggX2MsIEMtPnN0ZXAsIF9kLCBfZF9zdGVwLCBELT5kYXRhLnB0ciArIGkqRC0+c3RlcCArIGoqZWxlbV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRC0+c3RlcCwgY3ZTaXplKGRqLGRpKSwgYWxwaGEsIGJldGEsIGZsYWdzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIEQwICE9IEQgKQorICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb3B5KCBELCBEMCApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKyAgICBpZiggYmxvY2tfYnVmZmVyICkKKyAgICAgICAgY3ZGcmVlKCAmYmxvY2tfYnVmZmVyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2VHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lICBJQ1ZfREVGX1RSQU5TRk9STV9DQVNFX0MxKCBhcnJ0eXBlLCB0ZW1wdHlwZSwgX2xkXywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXywgX2Nhc3RfbWFjcm8yXyApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgZHN0ICs9IGRzdF9jbiApICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUqIF9tYXQgPSBtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB2MCA9IF9sZF8oc3JjW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IGRzdF9jbjsgaysrLCBfbWF0ICs9IDIgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSB0MCA9IF9jYXN0X21hY3JvMV8oX21hdFswXSp2MCArIF9tYXRbMV0pOyAgICAgIFwKKyAgICAgICAgICAgIGRzdFtrXSA9IF9jYXN0X21hY3JvMl8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMgKz0gc2l6ZS53aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfRElBR19UUkFOU0ZPUk1fQ0FTRV9DMSggYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYXN0X21hY3JvMV8sIF9jYXN0X21hY3JvMl8gKSAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgZnQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQwID0gbWF0WzBdKl9sZF8oc3JjW2ldKSArIG1hdFsxXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9jYXN0X21hY3JvMV8oZnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpXSA9IF9jYXN0X21hY3JvMl8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSAgSUNWX0RFRl9UUkFOU0ZPUk1fQ0FTRV9DMiggYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXywgX2Nhc3RfbWFjcm8yXyApICAgIFwKK2lmKCBkc3RfY24gPT0gMiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGgqMjsgaSArPSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgZnQwLCBmdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQwID0gbWF0WzBdKl9sZF8oc3JjW2ldKSArIG1hdFsxXSpfbGRfKHNyY1tpKzFdKSArIG1hdFsyXTsgXAorICAgICAgICBmdDEgPSBtYXRbM10qX2xkXyhzcmNbaV0pICsgbWF0WzRdKl9sZF8oc3JjW2krMV0pICsgbWF0WzVdOyBcCisgICAgICAgIHQwID0gX2Nhc3RfbWFjcm8xXyhmdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfY2FzdF9tYWNybzFfKGZ0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzFdID0gX2Nhc3RfbWFjcm8yXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBzaXplLndpZHRoKjI7IGRzdCArPSBzaXplLndpZHRoKjI7ICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIHNyYyArPSAyLCBkc3QgKz0gZHN0X2NuICkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgZG91YmxlKiBfbWF0ID0gbWF0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgdjAgPSBfbGRfKHNyY1swXSksIHYxID0gc3JjWzFdOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggayA9IDA7IGsgPCBkc3RfY247IGsrKywgX21hdCArPSAzICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcHR5cGUgdDAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXyhfbWF0WzBdKnYwICsgX21hdFsxXSp2MSArIF9tYXRbMl0pOyAgIFwKKyAgICAgICAgICAgIGRzdFtrXSA9IF9jYXN0X21hY3JvMl8odDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgIElDVl9ERUZfRElBR19UUkFOU0ZPUk1fQ0FTRV9DMiggYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYXN0X21hY3JvMV8sIF9jYXN0X21hY3JvMl8gKSAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGgqMjsgaSArPSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgZnQwLCBmdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwLCB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQwID0gbWF0WzBdKl9sZF8oc3JjW2ldKSArIG1hdFsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmdDEgPSBtYXRbNF0qX2xkXyhzcmNbaSsxXSkgKyBtYXRbNV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gX2Nhc3RfbWFjcm8xXyhmdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBfY2FzdF9tYWNybzFfKGZ0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzFdID0gX2Nhc3RfbWFjcm8yXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSAgSUNWX0RFRl9UUkFOU0ZPUk1fQ0FTRV9DMyggYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXywgX2Nhc3RfbWFjcm8yXyApICAgIFwKK2lmKCBkc3RfY24gPT0gMyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGgqMzsgaSArPSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgZnQwLCBmdDEsIGZ0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwLCB0MSwgdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQwID0gbWF0WzBdKl9sZF8oc3JjW2ldKSArIG1hdFsxXSpfbGRfKHNyY1tpKzFdKSArICAgICAgICAgXAorICAgICAgICAgICAgICBtYXRbMl0qX2xkXyhzcmNbaSsyXSkgKyBtYXRbM107ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ0MSA9IG1hdFs0XSpfbGRfKHNyY1tpXSkgKyBtYXRbNV0qX2xkXyhzcmNbaSsxXSkgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgbWF0WzZdKl9sZF8oc3JjW2krMl0pICsgbWF0WzddOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmdDIgPSBtYXRbOF0qX2xkXyhzcmNbaV0pICsgbWF0WzldKl9sZF8oc3JjW2krMV0pICsgICAgICAgICBcCisgICAgICAgICAgICAgIG1hdFsxMF0qX2xkXyhzcmNbaSsyXSkgKyBtYXRbMTFdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSBfY2FzdF9tYWNybzFfKGZ0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IF9jYXN0X21hY3JvMV8oZnQxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQyID0gX2Nhc3RfbWFjcm8xXyhmdDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSsxXSA9IF9jYXN0X21hY3JvMl8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzJdID0gX2Nhc3RfbWFjcm8yXyh0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBzaXplLndpZHRoKjM7IGRzdCArPSBzaXplLndpZHRoKjM7ICAgICAgICAgICAgICAgICAgICAgICBcCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2Vsc2UgaWYoIGRzdF9jbiA9PSAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgc3JjICs9IDMgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wdHlwZSB0MCA9IF9jYXN0X21hY3JvMV8obWF0WzBdKl9sZF8oc3JjWzBdKSArICAgICAgICAgICBcCisgICAgICAgICAgICBtYXRbMV0qX2xkXyhzcmNbMV0pICsgbWF0WzJdKl9sZF8oc3JjWzJdKSArIG1hdFszXSk7ICAgIFwKKyAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0ICs9IHNpemUud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgc3JjICs9IDMsIGRzdCArPSBkc3RfY24gKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUqIF9tYXQgPSBtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB2MD1fbGRfKHNyY1swXSksIHYxPV9sZF8oc3JjWzFdKSwgdjI9X2xkXyhzcmNbMl0pOyAgIFwKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IGRzdF9jbjsgaysrLCBfbWF0ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wdHlwZSB0MCA9IF9jYXN0X21hY3JvMV8oX21hdFswXSp2MCArICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX21hdFsxXSp2MSArIF9tYXRbMl0qdjIgKyBfbWF0WzNdKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2tdID0gX2Nhc3RfbWFjcm8yXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSAgSUNWX0RFRl9ESUFHX1RSQU5TRk9STV9DQVNFX0MzKCBhcnJ0eXBlLCB0ZW1wdHlwZSwgX2xkXywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXywgX2Nhc3RfbWFjcm8yXyApICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aCozOyBpICs9IDMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSBmdDAsIGZ0MSwgZnQyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdDAsIHQxLCB0MjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmdDAgPSBtYXRbMF0qX2xkXyhzcmNbaV0pICsgbWF0WzNdOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ0MSA9IG1hdFs1XSpfbGRfKHNyY1tpKzFdKSArIG1hdFs3XTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQyID0gbWF0WzEwXSpfbGRfKHNyY1tpKzJdKSArIG1hdFsxMV07ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9jYXN0X21hY3JvMV8oZnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX2Nhc3RfbWFjcm8xXyhmdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDIgPSBfY2FzdF9tYWNybzFfKGZ0Mik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaV0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFtpKzFdID0gX2Nhc3RfbWFjcm8yXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2krMl0gPSBfY2FzdF9tYWNybzJfKHQyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lICBJQ1ZfREVGX1RSQU5TRk9STV9DQVNFX0M0KCBhcnJ0eXBlLCB0ZW1wdHlwZSwgX2xkXywgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfLCBfY2FzdF9tYWNybzJfICkgICAgXAorZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgc3JjICs9IDQsIGRzdCArPSBkc3RfY24gKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdCBkb3VibGUqIF9tYXQgPSBtYXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSB2MCA9IF9sZF8oc3JjWzBdKSwgdjEgPSBfbGRfKHNyY1sxXSksICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHYyID0gX2xkXyhzcmNbMl0pLCB2MyA9IF9sZF8oc3JjWzNdKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGsgPSAwOyBrIDwgZHN0X2NuOyBrKyssIF9tYXQgKz0gNSApICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwID1fY2FzdF9tYWNybzFfKF9tYXRbMF0qdjArX21hdFsxXSp2MSsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX21hdFsyXSp2MitfbWF0WzNdKnYzK19tYXRbNF0pOyAgXAorICAgICAgICBkc3Rba10gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0NBU0VfQzQoIGFycnR5cGUsIHRlbXB0eXBlLCBfbGRfLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfLCBfY2FzdF9tYWNybzJfICkgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoKjQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZG91YmxlIGZ0MCwgZnQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wdHlwZSB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ0MCA9IG1hdFswXSpfbGRfKHNyY1tpXSkgKyBtYXRbNF07ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQxID0gbWF0WzZdKl9sZF8oc3JjW2krMV0pICsgbWF0WzldOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9jYXN0X21hY3JvMV8oZnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX2Nhc3RfbWFjcm8xXyhmdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2ldID0gX2Nhc3RfbWFjcm8yXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSsxXSA9IF9jYXN0X21hY3JvMl8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZ0MCA9IG1hdFsxMl0qX2xkXyhzcmNbaSsyXSkgKyBtYXRbMTRdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnQxID0gbWF0WzE4XSpfbGRfKHNyY1tpKzNdKSArIG1hdFsxOV07ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9jYXN0X21hY3JvMV8oZnQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX2Nhc3RfbWFjcm8xXyhmdDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2krMl0gPSBfY2FzdF9tYWNybzJfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbaSszXSA9IF9jYXN0X21hY3JvMl8odDEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKworI2RlZmluZSAgSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggZmxhdm9yLCBhcnJ0eXBlLCB0ZW1wdHlwZSwgX2xkXywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfLCBfY2FzdF9tYWNybzJfLCBjbiAgKVwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2VHJhbnNmb3JtXyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBtYXQsIGludCBkc3RfY24gKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCA9IHNyY3N0ZXAvc2l6ZW9mKHNyY1swXSkgLSBzaXplLndpZHRoKmNuOyAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwID0gZHN0c3RlcC9zaXplb2YoZHN0WzBdKSAtIHNpemUud2lkdGgqZHN0X2NuOyAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGksIGs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX1RSQU5TRk9STV9DQVNFX0MjI2NuKCBhcnJ0eXBlLCB0ZW1wdHlwZSwgX2xkXywgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nhc3RfbWFjcm8xXywgX2Nhc3RfbWFjcm8yXyApIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jYXN0X21hY3JvMV8sIF9jYXN0X21hY3JvMl8sIGNuICApXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZEaWFnVHJhbnNmb3JtXyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIG1hdCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfRElBR19UUkFOU0ZPUk1fQ0FTRV9DIyNjbiggYXJydHlwZSwgdGVtcHR5cGUsIF9sZF8sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2FzdF9tYWNybzFfLCBfY2FzdF9tYWNybzJfICkgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDh1X0MxUiwgdWNoYXIsIGludCwgQ1ZfOFRPMzJGLCBjdlJvdW5kLCBDVl9DQVNUXzhVLCAxICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDh1X0MyUiwgdWNoYXIsIGludCwgQ1ZfOFRPMzJGLCBjdlJvdW5kLCBDVl9DQVNUXzhVLCAyICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDh1X0MzUiwgdWNoYXIsIGludCwgQ1ZfOFRPMzJGLCBjdlJvdW5kLCBDVl9DQVNUXzhVLCAzICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDh1X0M0UiwgdWNoYXIsIGludCwgQ1ZfOFRPMzJGLCBjdlJvdW5kLCBDVl9DQVNUXzhVLCA0ICkKKworSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMTZ1X0MxUiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDEgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMTZ1X0MyUiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDIgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMTZ1X0MzUiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDMgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMTZ1X0M0UiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDQgKQorCitJQ1ZfREVGX1RSQU5TRk9STV9GVU5DKCAxNnNfQzFSLCBzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZTLCAxICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDE2c19DMlIsIHNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMsIDIgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMTZzX0MzUiwgc2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2UywgMyApCitJQ1ZfREVGX1RSQU5TRk9STV9GVU5DKCAxNnNfQzRSLCBzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZTLCA0ICkKKworSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMzJzX0MxUiwgaW50LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfTk9QLCAxICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDMyc19DMlIsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX05PUCwgMiApCitJQ1ZfREVGX1RSQU5TRk9STV9GVU5DKCAzMnNfQzNSLCBpbnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9OT1AsIDMgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMzJzX0M0UiwgaW50LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfTk9QLCA0ICkKKworSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMzJmX0MxUiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCAxICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDMyZl9DMlIsIGZsb2F0LCBkb3VibGUsIENWX05PUCwgQ1ZfTk9QLCBDVl9DQVNUXzMyRiwgMiApCitJQ1ZfREVGX1RSQU5TRk9STV9GVU5DKCAzMmZfQzNSLCBmbG9hdCwgZG91YmxlLCBDVl9OT1AsIENWX05PUCwgQ1ZfQ0FTVF8zMkYsIDMgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggMzJmX0M0UiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCA0ICkKKworSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggNjRmX0MxUiwgZG91YmxlLCBkb3VibGUsIENWX05PUCwgQ1ZfTk9QLCBDVl9DQVNUXzY0RiwgMSApCitJQ1ZfREVGX1RSQU5TRk9STV9GVU5DKCA2NGZfQzJSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfNjRGLCAyICkKK0lDVl9ERUZfVFJBTlNGT1JNX0ZVTkMoIDY0Zl9DM1IsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AsIENWX05PUCwgQ1ZfQ0FTVF82NEYsIDMgKQorSUNWX0RFRl9UUkFOU0ZPUk1fRlVOQyggNjRmX0M0UiwgZG91YmxlLCBkb3VibGUsIENWX05PUCwgQ1ZfTk9QLCBDVl9DQVNUXzY0RiwgNCApCisKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMTZ1X0MxUiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDEgKQorSUNWX0RFRl9ESUFHX1RSQU5TRk9STV9GVU5DKCAxNnVfQzJSLCB1c2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2VSwgMiApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDE2dV9DM1IsIHVzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZVLCAzICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMTZ1X0M0UiwgdXNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlUsIDQgKQorCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDE2c19DMVIsIHNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMsIDEgKQorSUNWX0RFRl9ESUFHX1RSQU5TRk9STV9GVU5DKCAxNnNfQzJSLCBzaG9ydCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX0NBU1RfMTZTLCAyICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMTZzX0MzUiwgc2hvcnQsIGludCwgQ1ZfTk9QLCBjdlJvdW5kLCBDVl9DQVNUXzE2UywgMyApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDE2c19DNFIsIHNob3J0LCBpbnQsIENWX05PUCwgY3ZSb3VuZCwgQ1ZfQ0FTVF8xNlMsIDQgKQorCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDMyc19DMVIsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX05PUCwgMSApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDMyc19DMlIsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX05PUCwgMiApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDMyc19DM1IsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX05PUCwgMyApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDMyc19DNFIsIGludCwgaW50LCBDVl9OT1AsIGN2Um91bmQsIENWX05PUCwgNCApCisKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMzJmX0MxUiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCAxICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMzJmX0MyUiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCAyICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMzJmX0MzUiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCAzICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggMzJmX0M0UiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfMzJGLCA0ICkKKworSUNWX0RFRl9ESUFHX1RSQU5TRk9STV9GVU5DKCA2NGZfQzFSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfNjRGLCAxICkKK0lDVl9ERUZfRElBR19UUkFOU0ZPUk1fRlVOQyggNjRmX0MyUiwgZG91YmxlLCBkb3VibGUsIENWX05PUCwgQ1ZfTk9QLCBDVl9DQVNUXzY0RiwgMiApCitJQ1ZfREVGX0RJQUdfVFJBTlNGT1JNX0ZVTkMoIDY0Zl9DM1IsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AsIENWX05PUCwgQ1ZfQ0FTVF82NEYsIDMgKQorSUNWX0RFRl9ESUFHX1RSQU5TRk9STV9GVU5DKCA2NGZfQzRSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QLCBDVl9OT1AsIENWX0NBU1RfNjRGLCA0ICkKKworI2RlZmluZSBpY3ZUcmFuc2Zvcm1fOHNfQzFSIDAKKyNkZWZpbmUgaWN2VHJhbnNmb3JtXzhzX0MyUiAwCisjZGVmaW5lIGljdlRyYW5zZm9ybV84c19DM1IgMAorI2RlZmluZSBpY3ZUcmFuc2Zvcm1fOHNfQzRSIDAKKworI2RlZmluZSBpY3ZEaWFnVHJhbnNmb3JtXzhzX0MxUiAwCisjZGVmaW5lIGljdkRpYWdUcmFuc2Zvcm1fOHNfQzJSIDAKKyNkZWZpbmUgaWN2RGlhZ1RyYW5zZm9ybV84c19DM1IgMAorI2RlZmluZSBpY3ZEaWFnVHJhbnNmb3JtXzhzX0M0UiAwCisKKyNkZWZpbmUgaWN2RGlhZ1RyYW5zZm9ybV84dV9DMVIgMAorI2RlZmluZSBpY3ZEaWFnVHJhbnNmb3JtXzh1X0MyUiAwCisjZGVmaW5lIGljdkRpYWdUcmFuc2Zvcm1fOHVfQzNSIDAKKyNkZWZpbmUgaWN2RGlhZ1RyYW5zZm9ybV84dV9DNFIgMAorCitDVl9ERUZfSU5JVF9CSUdfRlVOQ19UQUJfMkQoIFRyYW5zZm9ybSwgUiApCitDVl9ERUZfSU5JVF9CSUdfRlVOQ19UQUJfMkQoIERpYWdUcmFuc2Zvcm0sIFIgKQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZUcmFuc2Zvcm1GdW5jKSgKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIG1hdCwgaW50IGRzdF9jbiApOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZEaWFnVHJhbnNmb3JtRnVuYykoCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtYXQgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2RGlhZ1RyYW5zZm9ybUZ1bmMpKAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzcmMsIGludCBzcmNzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogbWF0ICk7CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJUFAgdHJhbnNmb3JtIGZ1bmN0aW9ucyAvLy8vLy8vLy8vLy8vLy8vLy8KKworaWN2Q29sb3JUd2lzdF84dV9DM1JfdCBpY3ZDb2xvclR3aXN0Xzh1X0MzUl9wID0gMDsKK2ljdkNvbG9yVHdpc3RfMTZ1X0MzUl90IGljdkNvbG9yVHdpc3RfMTZ1X0MzUl9wID0gMDsKK2ljdkNvbG9yVHdpc3RfMTZzX0MzUl90IGljdkNvbG9yVHdpc3RfMTZzX0MzUl9wID0gMDsKK2ljdkNvbG9yVHdpc3RfMzJmX0MzUl90IGljdkNvbG9yVHdpc3RfMzJmX0MzUl9wID0gMDsKK2ljdkNvbG9yVHdpc3RfMzJmX0M0Ul90IGljdkNvbG9yVHdpc3RfMzJmX0M0Ul9wID0gMDsKKworaWN2Q29sb3JUb0dyYXlfOHVfQzNDMVJfdCBpY3ZDb2xvclRvR3JheV84dV9DM0MxUl9wID0gMDsKK2ljdkNvbG9yVG9HcmF5XzE2dV9DM0MxUl90IGljdkNvbG9yVG9HcmF5XzE2dV9DM0MxUl9wID0gMDsKK2ljdkNvbG9yVG9HcmF5XzE2c19DM0MxUl90IGljdkNvbG9yVG9HcmF5XzE2c19DM0MxUl9wID0gMDsKK2ljdkNvbG9yVG9HcmF5XzMyZl9DM0MxUl90IGljdkNvbG9yVG9HcmF5XzMyZl9DM0MxUl9wID0gMDsKKworaWN2Q29sb3JUb0dyYXlfOHVfQUM0QzFSX3QgaWN2Q29sb3JUb0dyYXlfOHVfQUM0QzFSX3AgPSAwOworaWN2Q29sb3JUb0dyYXlfMTZ1X0FDNEMxUl90IGljdkNvbG9yVG9HcmF5XzE2dV9BQzRDMVJfcCA9IDA7CitpY3ZDb2xvclRvR3JheV8xNnNfQUM0QzFSX3QgaWN2Q29sb3JUb0dyYXlfMTZzX0FDNEMxUl9wID0gMDsKK2ljdkNvbG9yVG9HcmF5XzMyZl9BQzRDMVJfdCBpY3ZDb2xvclRvR3JheV8zMmZfQUM0QzFSX3AgPSAwOworCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZDb2xvclR3aXN0SVBQRnVuYykoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgY29uc3QgZmxvYXQqIGNvZWZmcyApOworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0NWX0lNUEwgdm9pZAorY3ZUcmFuc2Zvcm0oIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsCisgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHRyYW5zbWF0LCBjb25zdCBDdk1hdCogc2hpZnR2ZWMgKQoreworICAgIHN0YXRpYyBDdkJpZ0Z1bmNUYWJsZSB0cmFuc2Zvcm1fdGFiLCBkaWFnX3RyYW5zZm9ybV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBDdk1hdCogbHV0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2VHJhbnNmb3JtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdk1hdCByb3RzdHViLCAqcm90ID0gKEN2TWF0Kil0cmFuc21hdDsKKyAgICBDdk1hdCBzaGlmdHN0dWIsICpzaGlmdCA9IChDdk1hdCopc2hpZnR2ZWM7CisgICAgQ3ZTZXEgKnNyY19zZXEgPSAwLCAqZHN0X3NlcSA9IDA7CisgICAgQ3ZTZXEgaGRyOyAvLyBuZWVkIG9ubHkgb25lIGNvcHkgb2Ygc3R1YiBoZWFkZXIgJiBzZXFibG9jayAoZWl0aGVyIGZvciBzcmMgb3IgZHN0KQorICAgIEN2U2VxQmxvY2sgYmxvY2tfaGRyOworICAgIGludCBpLCBqLCB0eXBlLCBjbiwgZHN0X2NuOworICAgIGludCBjb2kgPSAwLCBjb2kyID0gMDsKKyAgICBkb3VibGUqIGJ1ZmZlciA9IChkb3VibGUqKWN2U3RhY2tBbGxvYyggQ1ZfQ05fTUFYKihDVl9DTl9NQVgrMSkqc2l6ZW9mKGJ1ZmZlclswXSkgKTsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0VHJhbnNmb3JtUlRhYmxlKCAmdHJhbnNmb3JtX3RhYiApOworICAgICAgICBpY3ZJbml0RGlhZ1RyYW5zZm9ybVJUYWJsZSggJmRpYWdfdHJhbnNmb3JtX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggQ1ZfSVNfU0VRKCBzcmMgKSkKKyAgICB7CisgICAgICAgIHNyY19zZXEgPSAoQ3ZTZXEqKXNyYzsKKyAgICAgICAgaWYoIENWX0VMRU1fU0laRShzcmNfc2VxLT5mbGFncykgIT0gc3JjX3NlcS0+ZWxlbV9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIHR5cGUgb2Ygc2VxdWVuY2UgZWxlbWVudHMiICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNyY3N0dWIsICZjb2kgKSk7CisKKyAgICBpZiggQ1ZfSVNfU0VRKCBkc3QgKSkKKyAgICB7CisgICAgICAgIGRzdF9zZXEgPSAoQ3ZTZXEqKWRzdDsKKyAgICAgICAgaWYoIENWX0VMRU1fU0laRShkc3Rfc2VxLT5mbGFncykgIT0gZHN0X3NlcS0+ZWxlbV9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIHR5cGUgb2Ygc2VxdWVuY2UgZWxlbWVudHMiICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHN0dWIsICZjb2kyICkpOworCisgICAgaWYoIGNvaSAhPSAwIHx8IGNvaTIgIT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICIiICk7CisKKyAgICBpZiggIUNWX0FSRV9ERVBUSFNfRVEoc3JjLCBkc3QpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICBpZiggc3JjX3NlcSB8fCBkc3Rfc2VxICkKKyAgICB7CisgICAgICAgIGlmKCAhc3JjX3NlcSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVChzcmMtPnR5cGUpIHx8IChzcmMtPnJvd3MgIT0gMSAmJiBzcmMtPmNvbHMgIT0gMSkgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiaWYgZWlnaGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gaXMgYSBzZXF1ZW5jZSwgIgorICAgICAgICAgICAgICAgICJ0aGUgb3RoZXIgYXJyYXkgbXVzdCBiZSBhbHNvIGEgc2VxdWVuY2Ugb2YgY29udGlub3VzIDFkIHZlY3RvciIgKTsKKyAgICAgICAgICAgIHNyY19zZXEgPSBjdk1ha2VTZXFIZWFkZXJGb3JBcnJheSggQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSwgc2l6ZW9mKGhkciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FTEVNX1NJWkUoc3JjLT50eXBlKSwgc3JjLT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYy0+cm93cyArIHNyYy0+Y29scyArIDEsICZoZHIsICZibG9ja19oZHIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhZHN0X3NlcSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVChkc3QtPnR5cGUpIHx8IChkc3QtPnJvd3MgIT0gMSAmJiBkc3QtPmNvbHMgIT0gMSkgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiaWYgZWlnaGVyIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gaXMgYSBzZXF1ZW5jZSwgIgorICAgICAgICAgICAgICAgICJ0aGUgb3RoZXIgYXJyYXkgbXVzdCBiZSBhbHNvIGEgc2VxdWVuY2Ugb2YgY29udGlub3VzIDFkIHZlY3RvciIgKTsKKyAgICAgICAgICAgIGlmKCBkc3QtPnJvd3MgKyBkc3QtPmNvbHMgLSAxICE9IHNyY19zZXEtPnRvdGFsICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgICAgICAgICAic291cmNlIHNlcXVlbmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3IgaGF2ZSBkaWZmZXJlbnQgc2l6ZXMiICk7CisgICAgICAgICAgICBkc3Rfc2VxID0gY3ZNYWtlU2VxSGVhZGVyRm9yQXJyYXkoIENWX01BVF9UWVBFKGRzdC0+dHlwZSksIHNpemVvZihoZHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX0VMRU1fU0laRShkc3QtPnR5cGUpLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+cm93cyArIGRzdC0+Y29scyArIDEsICZoZHIsICZibG9ja19oZHIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBkc3Rfc2VxLT50b3RhbCAhPSBzcmNfc2VxLT50b3RhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBkc3Rfc2VxLT50b3RhbCA+IHNyY19zZXEtPnRvdGFsICkKKyAgICAgICAgICAgICAgICBjdlNlcVBvcE11bHRpKCBkc3Rfc2VxLCAwLCBkc3Rfc2VxLT50b3RhbCAtIHNyY19zZXEtPnRvdGFsICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY3ZTZXFQdXNoTXVsdGkoIGRzdF9zZXEsIDAsIHNyY19zZXEtPnRvdGFsIC0gZHN0X3NlcS0+dG90YWwgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyYy0+dHlwZSApOworICAgIGNuID0gQ1ZfTUFUX0NOKCB0eXBlICk7CisgICAgZHN0X2NuID0gQ1ZfTUFUX0NOKCBkc3QtPnR5cGUgKTsKKworICAgIGlmKCBjbiA+IDQgfHwgZHN0X2NuID4gNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiQm90aCBpbnB1dCBhbmQgb3V0cHV0IGFycmF5IG11c3QgaGF2ZSBhdCBtb3N0IDQgY2hhbm5lbHMiICk7CisKKyAgICBpZiggIUNWX0lTX01BVCggcm90ICkpCisgICAgICAgIENWX0NBTEwoIHJvdCA9IGN2R2V0TWF0KCByb3QsICZyb3RzdHViLCAmY29pICkpOworCisgICAgaWYoIHJvdC0+cm93cyAhPSBkc3RfY24gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgIlRoZSBoZWlnaHQgb2YgdHJhbnNtYXQgbWF0cml4IG11c3QgYmUgZXF1YWwgdG8gbnVtYmVyIG9mIGNoYW5uZWxzIiApOworCisgICAgaWYoIHJvdC0+Y29scyA9PSBjbiArIDEgfHwgcm90LT5jb2xzID09IGNuICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfVFlQRSggcm90LT50eXBlICkgPT0gQ1ZfNjRGQzEgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHN0X2NuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJ1ZmZlcltpKihjbisxKSArIGNuXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHJvdC0+Y29sczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2kqKGNuKzEpICsgal0gPSAoKGRvdWJsZSopKHJvdC0+ZGF0YS5wdHIgKyByb3QtPnN0ZXAqaSkpW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKCByb3QtPnR5cGUgKSA9PSBDVl8zMkZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkc3RfY247IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnVmZmVyW2kqKGNuKzEpICsgY25dID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgcm90LT5jb2xzOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBidWZmZXJbaSooY24rMSkgKyBqXSA9ICgoZmxvYXQqKShyb3QtPmRhdGEucHRyICsgcm90LT5zdGVwKmkpKVtqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJSb3RhdGlvbiBtYXRyaXggbXVzdCBiZSAzMmZDMSBvciA2NGZDMSIgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJJZiB0aGUgc291cmNlIGFycmF5IGhhcyA8Y24+IGNoYW5uZWxzLCAiCisgICAgICAgICAgICJ0aGUgdHJhbnNmb3JtYXRpb24gbWF0cml4IG11c3QgaGF2ZSA8Y24+IHggPGNuPisxIG9yIDxjbj4geCA8Y24+IHNpemUiICk7CisKKyAgICBpZiggc2hpZnQgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoIHNoaWZ0ICkpCisgICAgICAgICAgICBDVl9DQUxMKCBzaGlmdCA9IGN2R2V0TWF0KCBzaGlmdCwgJnNoaWZ0c3R1YiwgJmNvaSApKTsKKworICAgICAgICBpZiggQ1ZfTUFUX0NOKCBzaGlmdC0+dHlwZSApICogc2hpZnQtPmNvbHMgKiBzaGlmdC0+cm93cyA9PSBkc3RfY24gJiYKKyAgICAgICAgICAgIChzaGlmdC0+cm93cyA9PSAxIHx8IHNoaWZ0LT5jb2xzID09IDEpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIENWX01BVF9ERVBUSCggc2hpZnQtPnR5cGUgKSA9PSBDVl82NEYgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzdGVwID0gc2hpZnQtPnN0ZXAgPyBzaGlmdC0+c3RlcC9zaXplb2YoZG91YmxlKSA6IDE7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRzdF9jbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2kqKGNuKzEpICsgY25dICs9IHNoaWZ0LT5kYXRhLmRiW2kqc3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBDVl9NQVRfREVQVEgoIHNoaWZ0LT50eXBlICkgPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgc3RlcCA9IHNoaWZ0LT5zdGVwID8gc2hpZnQtPnN0ZXAvc2l6ZW9mKGZsb2F0KSA6IDE7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRzdF9jbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2kqKGNuKzEpICsgY25dICs9IHNoaWZ0LT5kYXRhLmZsW2kqc3RlcF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiU2hpZnQgdmVjdG9yIG11c3QgYmUgMzJmIG9yIDY0ZiIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgICAgICAgICAiU2hpZnQgKGlmIHByZXNlbnQpIG11c3QgYmUgMSBkaW1lbnNpb25hbCB2ZWN0b3Igd2l0aCB0aGUgbnVtYmVyICIKKyAgICAgICAgICAgICAgICAib2YgZWxlbWVudHMgZXF1YWwgdG8gbnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBwcm9jZXNzZWQgYXJyYXkiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggY29pICE9IDAgfHwgY29pMiAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgIHsKKyAgICAgICAgQ3ZUcmFuc2Zvcm1GdW5jIGZ1bmMgPSAoQ3ZUcmFuc2Zvcm1GdW5jKSh0cmFuc2Zvcm1fdGFiLmZuXzJkW3R5cGVdKTsKKyAgICAgICAgQ3ZEaWFnVHJhbnNmb3JtRnVuYyBkaWFnX2Z1bmMgPSAwOworICAgICAgICBDdkxVVF9UcmFuc2Zvcm1GdW5jIGx1dF9mdW5jID0gMDsKKyAgICAgICAgaW50IGRpYWdfdHJhbnNmb3JtID0gMDsKKyAgICAgICAgQ3ZDb2xvclR3aXN0SVBQRnVuYyBpcHBfZnVuYyA9IDA7CisgICAgICAgIEN2U2l6ZSBzaXplOworICAgICAgICBmbG9hdCogaXBwX2NvZWZmcyA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCAxNipzaXplb2YoaXBwX2NvZWZmc1swXSkgKTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIGlmKCBjbiA9PSBkc3RfY24gKQorICAgICAgICAgICAgaXBwX2Z1bmMgPSB0eXBlID09IENWXzhVQzMgPyBpY3ZDb2xvclR3aXN0Xzh1X0MzUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8xNlVDMyA/IGljdkNvbG9yVHdpc3RfMTZ1X0MzUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8xNlNDMyA/IGljdkNvbG9yVHdpc3RfMTZzX0MzUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDMyA/IGljdkNvbG9yVHdpc3RfMzJmX0MzUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDNCAmJiBmYWJzKGJ1ZmZlcls0XSkgPCBEQkxfRVBTSUxPTiAmJgorICAgICAgICAgICAgICAgICAgICAgICBmYWJzKGJ1ZmZlcls5XSkgPCBEQkxfRVBTSUxPTiAmJiBmYWJzKGJ1ZmZlclsxNF0pIDwgREJMX0VQU0lMT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZmFicyhidWZmZXJbMTldKSA8IERCTF9FUFNJTE9OID8gaWN2Q29sb3JUd2lzdF8zMmZfQzRSX3AgOiAwOworICAgICAgICBlbHNlIGlmKCBkc3RfY24gPT0gMSAmJiAoY24gPT0gMyB8fCBjbiA9PSA0KSAmJgorICAgICAgICAgICAgICAgICBidWZmZXJbMF0gPj0gMCAmJiBidWZmZXJbMV0gPj0gMCAmJiBidWZmZXJbMl0gPj0gMCAmJgorICAgICAgICAgICAgICAgICBidWZmZXJbMF0gKyBidWZmZXJbMV0gKyBidWZmZXJbMl0gPD0gMS4wMSAmJgorICAgICAgICAgICAgICAgICBmYWJzKGJ1ZmZlclszXSkgPCBEQkxfRVBTSUxPTiAmJiAoY24gPT0gMyB8fCBmYWJzKGJ1ZmZlcls0XSkgPCBEQkxfRVBTSUxPTikgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY24gPT0gMyApCisgICAgICAgICAgICAgICAgaXBwX2Z1bmMgPSB0eXBlID09IENWXzhVQzMgPyBpY3ZDb2xvclRvR3JheV84dV9DM0MxUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMTZVQzMgPyBpY3ZDb2xvclRvR3JheV8xNnVfQzNDMVJfcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzE2U0MzID8gaWN2Q29sb3JUb0dyYXlfMTZzX0MzQzFSX3AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8zMkZDMyA/IGljdkNvbG9yVG9HcmF5XzMyZl9DM0MxUl9wIDogMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpcHBfZnVuYyA9IHR5cGUgPT0gQ1ZfOFVDNCA/IGljdkNvbG9yVG9HcmF5Xzh1X0FDNEMxUl9wIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gQ1ZfMTZVQzQgPyBpY3ZDb2xvclRvR3JheV8xNnVfQUM0QzFSX3AgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBDVl8xNlNDNCA/IGljdkNvbG9yVG9HcmF5XzE2c19BQzRDMVJfcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IENWXzMyRkM0ID8gaWN2Q29sb3JUb0dyYXlfMzJmX0FDNEMxUl9wIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkc3RfY24gPT0gY24gKQorICAgICAgICB7CisgICAgICAgICAgICBkaWFnX3RyYW5zZm9ybSA9IDE7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZHN0X2NuOyBpKysgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjbjsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpICE9IGogJiYgZmFicyhidWZmZXJbaSooY24rMSkgKyBqXSkgPiBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpYWdfdHJhbnNmb3JtID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggZGlhZ190cmFuc2Zvcm0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBDVl9NQVRfREVQVEgodHlwZSkgPT0gQ1ZfOFUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggbHV0ID0gY3ZDcmVhdGVNYXQoIDEsIDI1NiwgdHlwZSApKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNuOyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSA9IGJ1ZmZlcltpKihjbisxKSArIGldLCBiID0gYnVmZmVyW2kqKGNuKzEpICsgY25dOworICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGx0YWIgPSBsdXQtPmRhdGEucHRyOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IDI1NjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IGN2Um91bmQoYSpqICsgYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHRhYltqKmNuICsgaV0gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGx1dF9mdW5jID0gY24gPT0gMSA/IChDdkxVVF9UcmFuc2Zvcm1GdW5jKWljdkxVVF9UcmFuc2Zvcm04dV84dV9DMVIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuID09IDIgPyAoQ3ZMVVRfVHJhbnNmb3JtRnVuYylpY3ZMVVRfVHJhbnNmb3JtOHVfOHVfQzJSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbiA9PSAzID8gKEN2TFVUX1RyYW5zZm9ybUZ1bmMpaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0MzUiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEN2TFVUX1RyYW5zZm9ybUZ1bmMpaWN2TFVUX1RyYW5zZm9ybTh1Xzh1X0M0UjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBkaWFnX2Z1bmMgPSAoQ3ZEaWFnVHJhbnNmb3JtRnVuYykoZGlhZ190cmFuc2Zvcm1fdGFiLmZuXzJkW3R5cGVdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBpcHBfZnVuYyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcHRyID0gYnVmZmVyOworCisgICAgICAgICAgICAvLyBmaWxsIGNuIHggNCBpcHBfY29lZmZzIGFycmF5CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY24qNDsgaSArPSA0LCBwdHIgKz0gY24rMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdDAgPSAoZmxvYXQpcHRyWzBdOworICAgICAgICAgICAgICAgIGZsb2F0IHQxID0gKGZsb2F0KXB0clsxXTsKKyAgICAgICAgICAgICAgICBpcHBfY29lZmZzW2ldID0gdDA7CisgICAgICAgICAgICAgICAgaXBwX2NvZWZmc1tpKzFdID0gdDE7CisgICAgICAgICAgICAgICAgdDAgPSAoZmxvYXQpcHRyWzJdOworICAgICAgICAgICAgICAgIHQxID0gKGZsb2F0KXB0clszXTsKKyAgICAgICAgICAgICAgICBpcHBfY29lZmZzW2krMl0gPSB0MDsKKyAgICAgICAgICAgICAgICBpcHBfY29lZmZzW2krM10gPSB0MTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhc3JjX3NlcSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwOworICAgICAgICAgICAgaW50IGRzdHN0ZXAgPSBkc3QtPnN0ZXA7CisgICAgICAgICAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgICAgICBzcmNzdGVwID0gZHN0c3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGx1dF9mdW5jICkKKyAgICAgICAgICAgICAgICBsdXRfZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIHNpemUsIGx1dC0+ZGF0YS5wdHIgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIGlwcF9mdW5jICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGlwcF9mdW5jKCBzcmMtPmRhdGEucHRyLCBzcmNzdGVwLCBkc3QtPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0ZXAsIHNpemUsIGlwcF9jb2VmZnMgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBkaWFnX3RyYW5zZm9ybSApCisgICAgICAgICAgICAgICAgZGlhZ19mdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAsIGRzdC0+ZGF0YS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIHNpemUsIGJ1ZmZlciApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgZHN0LT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBkc3QtPnN0ZXAsIHNpemUsIGJ1ZmZlciwgZHN0X2NuICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdlNlcUJsb2NrKiBzcmNfYmxvY2sgPSBzcmNfc2VxLT5maXJzdDsKKyAgICAgICAgICAgIEN2U2VxQmxvY2sqIGRzdF9ibG9jayA9IGRzdF9zZXEtPmZpcnN0OworICAgICAgICAgICAgaW50IHNyY19pZHggPSAwLCBkc3RfaWR4ID0gMDsKKyAgICAgICAgICAgIGludCBzcmNfZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyY19zZXEtPmZsYWdzKTsKKyAgICAgICAgICAgIGludCBkc3RfZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKGRzdF9zZXEtPmZsYWdzKTsKKworICAgICAgICAgICAgZm9yKCBpID0gc3JjX3NlcS0+dG90YWw7IGkgPiAwOyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHNyY19sZW4gPSBzcmNfYmxvY2stPmNvdW50IC0gc3JjX2lkeDsKKyAgICAgICAgICAgICAgICBpbnQgZHN0X2xlbiA9IGRzdF9ibG9jay0+Y291bnQgLSBkc3RfaWR4OworICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNyY3B0ciA9IHNyY19ibG9jay0+ZGF0YSArIHNyY19pZHgqc3JjX2VsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICB2b2lkKiBkc3RwdHIgPSBkc3RfYmxvY2stPmRhdGEgKyBkc3RfaWR4KmRzdF9lbGVtX3NpemU7CisgICAgICAgICAgICAgICAgc3JjX2xlbiA9IE1JTihzcmNfbGVuLCBkc3RfbGVuKTsKKworICAgICAgICAgICAgICAgIGlmKCBsdXRfZnVuYyApCisgICAgICAgICAgICAgICAgICAgIGx1dF9mdW5jKCBzcmNwdHIsIENWX1NUVUJfU1RFUCwgZHN0cHRyLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIHNyY19sZW4sIDEgKSwgbHV0LT5kYXRhLnB0ciApOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGlwcF9mdW5jICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggaXBwX2Z1bmMoIHNyY3B0ciwgQ1ZfU1RVQl9TVEVQLCBkc3RwdHIsIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTaXplKCBzcmNfbGVuLCAxICksIGlwcF9jb2VmZnMgKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIGRpYWdfdHJhbnNmb3JtICkKKyAgICAgICAgICAgICAgICAgICAgZGlhZ19mdW5jKCBzcmNwdHIsIENWX1NUVUJfU1RFUCwgZHN0cHRyLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTaXplKCBzcmNfbGVuLCAxICksIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZnVuYyggc3JjcHRyLCBDVl9TVFVCX1NURVAsIGRzdHB0ciwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIHNyY19sZW4sIDEgKSwgYnVmZmVyLCBkc3RfY24gKTsKKworICAgICAgICAgICAgICAgIGlmKCAoc3JjX2lkeCArPSBzcmNfbGVuKSA9PSBzcmNfYmxvY2stPmNvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgc3JjX2Jsb2NrID0gc3JjX2Jsb2NrLT5uZXh0LCBzcmNfaWR4ID0gMDsKKyAgICAgICAgICAgICAgICBpZiggKGRzdF9pZHggKz0gc3JjX2xlbikgPT0gZHN0X2Jsb2NrLT5jb3VudCApCisgICAgICAgICAgICAgICAgICAgIGRzdF9ibG9jayA9IGRzdF9ibG9jay0+bmV4dCwgZHN0X2lkeCA9IDA7CisgICAgICAgICAgICAgICAgaSAtPSBzcmNfbGVuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmx1dCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlBlcnNwZWN0aXZlVHJhbnNmb3JtICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfUEVSU1BFQ1RJVkVfVFJBTlNGT1JNX0ZVTkNfMiggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZQZXJzcGVjdGl2ZVRyYW5zZm9ybV8jI2ZsYXZvciMjX0MyUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgY29uc3QgZG91YmxlKiBtYXQgKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHggPSBzcmNbaV0sIHkgPSBzcmNbaSArIDFdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHcgPSB4Km1hdFs2XSArIHkqbWF0WzddICsgbWF0WzhdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggZmFicyh3KSA+IEZMVF9FUFNJTE9OICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3ID0gMS4vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpKCh4Km1hdFswXSArIHkqbWF0WzFdICsgbWF0WzJdKSAqIHcpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpKCh4Km1hdFszXSArIHkqbWF0WzRdICsgbWF0WzVdKSAqIHcpOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaV0gPSAoYXJydHlwZSkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2krMV0gPSAoYXJydHlwZSkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfUEVSU1BFQ1RJVkVfVFJBTlNGT1JNX0ZVTkNfMyggZmxhdm9yLCBhcnJ0eXBlICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZQZXJzcGVjdGl2ZVRyYW5zZm9ybV8jI2ZsYXZvciMjX0MzUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBjb25zdCBkb3VibGUqIG1hdCApICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHggPSBzcmNbaV0sIHkgPSBzcmNbaSArIDFdLCB6ID0gc3JjW2kgKyAyXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHcgPSB4Km1hdFsxMl0gKyB5Km1hdFsxM10gKyB6Km1hdFsxNF0gKyBtYXRbMTVdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggZmFicyh3KSA+IEZMVF9FUFNJTE9OICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3ID0gMS4vdzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpKCh4Km1hdFswXSArIHkqbWF0WzFdICsgeiptYXRbMl0gKyBtYXRbM10pICogdyk7ICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpKCh4Km1hdFs0XSArIHkqbWF0WzVdICsgeiptYXRbNl0gKyBtYXRbN10pICogdyk7ICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IChhcnJ0eXBlKSgoeCptYXRbOF0gKyB5Km1hdFs5XSArIHoqbWF0WzEwXSArIG1hdFsxMV0pICogdyk7ICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZHN0W2ldID0gKGFycnR5cGUpMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRzdFtpKzFdID0gKGFycnR5cGUpMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkc3RbaSsyXSA9IChhcnJ0eXBlKTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSUNWX1BFUlNQRUNUSVZFX1RSQU5TRk9STV9GVU5DXzIoIDMyZiwgZmxvYXQgKQorSUNWX1BFUlNQRUNUSVZFX1RSQU5TRk9STV9GVU5DXzIoIDY0ZiwgZG91YmxlICkKK0lDVl9QRVJTUEVDVElWRV9UUkFOU0ZPUk1fRlVOQ18zKCAzMmYsIGZsb2F0ICkKK0lDVl9QRVJTUEVDVElWRV9UUkFOU0ZPUk1fRlVOQ18zKCA2NGYsIGRvdWJsZSApCisKK3N0YXRpYyB2b2lkIGljdkluaXRQZXJzcGVjdGl2ZVRyYW5zZm9ybVRhYmxlKCBDdkZ1bmNUYWJsZSogdGFiMiwgQ3ZGdW5jVGFibGUqIHRhYjMgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWIyLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdlBlcnNwZWN0aXZlVHJhbnNmb3JtXzMyZl9DMlI7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWIyLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdlBlcnNwZWN0aXZlVHJhbnNmb3JtXzY0Zl9DMlI7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWIzLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdlBlcnNwZWN0aXZlVHJhbnNmb3JtXzMyZl9DM1I7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWIzLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdlBlcnNwZWN0aXZlVHJhbnNmb3JtXzY0Zl9DM1I7ICAgICAgICAgICAgICAgICAgIFwKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UGVyc3BlY3RpdmVUcmFuc2Zvcm0oIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGNvbnN0IEN2TWF0KiBtYXQgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSB0YWJbMl07CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICBkb3VibGUgYnVmZmVyWzE2XTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZQZXJzcGVjdGl2ZVByb2plY3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgaW50IGksIGosIHR5cGUsIGNuOworICAgIEN2RnVuYzJEXzJBMVAgZnVuYyA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFBlcnNwZWN0aXZlVHJhbnNmb3JtVGFibGUoICZ0YWJbMF0sICZ0YWJbMV0gKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoIHNyYyApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzc3R1YiwgJmNvaSApKTsKKworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVCggZHN0ICkpCisgICAgeworICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHViLCAmY29pICkpOworCisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiIiApOworICAgIH0KKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBzcmMsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyYy0+dHlwZSApOworICAgIGNuID0gQ1ZfTUFUX0NOKCB0eXBlICk7CisKKyAgICBpZiggY24gIT0gMiAmJiBjbiAhPSAzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX0JhZE51bUNoYW5uZWxzLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICBpZiggIUNWX0lTX01BVCggbWF0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIHRyYW5zZm9ybWF0aW9uIG1hdHJpeCIgKTsKKworICAgIGlmKCBtYXQtPnJvd3MgIT0gY24gKyAxICYmIG1hdC0+Y29scyAhPSBtYXQtPnJvd3MgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgIlRoZSBzaXplIG9mIHRyYW5zZm9ybSBtYXRyaXggbXVzdCBiZSBlcXVhbCB0byBudW1iZXIgb2YgY2hhbm5lbHMiICk7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApID09IENWXzY0RkMxICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gY247IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gY247IGorKyApCisgICAgICAgICAgICAgICAgYnVmZmVyW2kqKGNuKzEpICsgal0gPSAoKGRvdWJsZSopKG1hdC0+ZGF0YS5wdHIgKyBtYXQtPnN0ZXAqaSkpW2pdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKCBtYXQtPnR5cGUgKSA9PSBDVl8zMkZDMSApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IGNuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGNuOyBqKysgKQorICAgICAgICAgICAgICAgIGJ1ZmZlcltpKihjbisxKSArIGpdID0gKChmbG9hdCopKG1hdC0+ZGF0YS5wdHIgKyBtYXQtPnN0ZXAqaSkpW2pdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlJvdGF0aW9uIG1hdHJpeCBtdXN0IGJlIDMyZkMxIG9yIDY0ZkMxIiApOworICAgIH0KKworICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCl0YWJbY24gPT0gM10uZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXTsKKworICAgIGlmKCAhZnVuYyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIHNyYyApOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBzcmMtPnR5cGUgJiBkc3QtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBzaXplLCBidWZmZXIpKTsKKworICAgIENWX0NIRUNLX05BTlMoIGRzdCApOworCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlNjYWxlQWRkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgIElDVl9ERUZfTVVMQUREQ19DQVNFX0MxKCBhcnJ0eXBlLCB0ZW1wdHlwZSwgc3JjMSwgc3JjMiwgZHN0LCBsZW4gKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPD0gKGxlbikgLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdDAgPSAoc3JjMSlbaV0qczAgKyAoc3JjMilbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wdHlwZSB0MSA9IChzcmMxKVtpKzFdKnMwICsgKHNyYzIpW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaV0gPSAoYXJydHlwZSl0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVtpKzFdID0gKGFycnR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSAoc3JjMSlbaSsyXSpzMCArIChzcmMyKVtpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IChzcmMxKVtpKzNdKnMwICsgKHNyYzIpW2krM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaSsyXSA9IChhcnJ0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVtpKzNdID0gKGFycnR5cGUpdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBpIDwgKGxlbik7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdDAgPSAoc3JjMSlbaV0qczAgKyAoc3JjMilbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoZHN0KVtpXSA9IChhcnJ0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX01VTEFERENfQ0FTRV9DMiggYXJydHlwZSwgdGVtcHR5cGUsIHNyYzEsIHNyYzIsIGRzdCwgbGVuICkgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGkgPSAwOyBpIDw9IChsZW4pIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwID0gKHNyYzEpW2ldKnMwIC0gKHNyYzEpW2krMV0qczEgKyAoc3JjMilbaV07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdDEgPSAoc3JjMSlbaV0qczEgKyAoc3JjMSlbaSsxXSpzMCArIChzcmMyKVtpKzFdOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2ldID0gKGFycnR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaSsxXSA9IChhcnJ0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gKHNyYzEpW2krMl0qczAgLSAoc3JjMSlbaSszXSpzMSArIChzcmMyKVtpKzJdOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSAoc3JjMSlbaSsyXSpzMSArIChzcmMxKVtpKzNdKnMwICsgKHNyYzIpW2krM107ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2krMl0gPSAoYXJydHlwZSl0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaSszXSA9IChhcnJ0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgaSA8IChsZW4pOyBpICs9IDIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHQwID0gKHNyYzEpW2ldKnMwIC0gKHNyYzEpW2krMV0qczEgKyAoc3JjMilbaV07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdDEgPSAoc3JjMSlbaV0qczEgKyAoc3JjMSlbaSsxXSpzMCArIChzcmMyKVtpKzFdOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChkc3QpW2ldID0gKGFycnR5cGUpdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGRzdClbaSsxXSA9IChhcnJ0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9NVUxBRERTX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgc2NhbGFydHlwZSwgZW50cnksIGNuICkgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZNdWxBZGRDXyMjZmxhdm9yKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3Jjc3RlcDEsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzcmNzdGVwMiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGFydHlwZSogc2NhbGFyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbnRyeShzY2FsYXJ0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSAoY24pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgc3Jjc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxKz1zcmNzdGVwMSwgc3JjMis9c3Jjc3RlcDIsIGRzdCs9ZHN0c3RlcCApICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfTVVMQUREQ19DQVNFX0MjI2NuKCBhcnJ0eXBlLCBzY2FsYXJ0eXBlLCBzcmMxLCBzcmMyLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX01VTEFERFNfRlVOQyggMzJmX0MxUiwgZmxvYXQsIGRvdWJsZSwgQ1ZfVU5fRU5UUllfQzEsIDEgKQorSUNWX0RFRl9NVUxBRERTX0ZVTkMoIDMyZl9DMlIsIGZsb2F0LCBkb3VibGUsIENWX1VOX0VOVFJZX0MyLCAyICkKK0lDVl9ERUZfTVVMQUREU19GVU5DKCA2NGZfQzFSLCBkb3VibGUsIGRvdWJsZSwgQ1ZfVU5fRU5UUllfQzEsIDEgKQorSUNWX0RFRl9NVUxBRERTX0ZVTkMoIDY0Zl9DMlIsIGRvdWJsZSwgZG91YmxlLCBDVl9VTl9FTlRSWV9DMiwgMiApCisKKworc3RhdGljIHZvaWQKK2ljdkluaXRNdWxBZGRDVGFibGUoIEN2QmlnRnVuY1RhYmxlKiB0YWIgKQoreworICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGQzFdID0gKHZvaWQqKWljdk11bEFkZENfMzJmX0MxUjsKKyAgICB0YWItPmZuXzJkW0NWXzMyRkMyXSA9ICh2b2lkKilpY3ZNdWxBZGRDXzMyZl9DMlI7CisgICAgdGFiLT5mbl8yZFtDVl82NEZDMV0gPSAodm9pZCopaWN2TXVsQWRkQ182NGZfQzFSOworICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGQzJdID0gKHZvaWQqKWljdk11bEFkZENfNjRmX0MyUjsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2U2NhbGVBZGQoIGNvbnN0IEN2QXJyKiBzcmNhcnIxLCBDdlNjYWxhciBzY2FsZSwKKyAgICAgICAgICAgIGNvbnN0IEN2QXJyKiBzcmNhcnIyLCBDdkFyciogZHN0YXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgbXVsYWRkc190YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2U2NhbGVBZGQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViMSwgKnNyYzEgPSAoQ3ZNYXQqKXNyY2FycjE7CisgICAgQ3ZNYXQgc3R1YjIsICpzcmMyID0gKEN2TWF0KilzcmNhcnIyOworICAgIEN2TWF0IHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgdHlwZTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMxICkgfHwgIUNWX0lTX01BVChzcmMyKSB8fCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgeworICAgICAgICBpbnQgY29pMSA9IDAsIGNvaTIgPSAwLCBjb2kzID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggc3JjMSA9IGN2R2V0TWF0KCBzcmMxLCAmc3R1YjEsICZjb2kxICkpOworICAgICAgICBDVl9DQUxMKCBzcmMyID0gY3ZHZXRNYXQoIHNyYzIsICZzdHViMiwgJmNvaTIgKSk7CisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZzdHViLCAmY29pMyApKTsKKworICAgICAgICBpZiggY29pMSArIGNvaTIgKyBjb2kzICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjMSwgZHN0ICkgfHwgIUNWX0FSRV9UWVBFU19FUSggc3JjMiwgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyYzEsIGRzdCApIHx8ICFDVl9BUkVfU0laRVNfRVEoIHNyYzIsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyYzEtPnR5cGUgKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMxICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyYzEtPnR5cGUgJiBzcmMyLT50eXBlICYgZHN0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworCisgICAgICAgIGlmKCBzaXplLndpZHRoIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQqIG1BID0gc3JjMS0+ZGF0YS5mbDsKKyAgICAgICAgICAgICAgICBmbG9hdCogbUIgPSBzcmMyLT5kYXRhLmZsOworICAgICAgICAgICAgICAgIGZsb2F0KiBtQyA9IGRzdC0+ZGF0YS5mbDsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtQ1tzaXplLndpZHRoIC0gMV0gPSAoZmxvYXQpKG1BW3NpemUud2lkdGggLSAxXSpzY2FsZS52YWxbMF0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQltzaXplLndpZHRoIC0gMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl82NEZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtQSA9IHNyYzEtPmRhdGEuZGI7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtQiA9IHNyYzItPmRhdGEuZGI7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtQyA9IGRzdC0+ZGF0YS5kYjsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtQ1tzaXplLndpZHRoIC0gMV0gPSBtQVtzaXplLndpZHRoIC0gMV0qc2NhbGUudmFsWzBdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJbc2l6ZS53aWR0aCAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0TXVsQWRkQ1RhYmxlKCAmbXVsYWRkc190YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIDEtIGFuZCAyLWNoYW5uZWwgYXJyYXlzIiApOworCisgICAgeworICAgICAgICBDdkZ1bmMyRF8zQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRfM0ExUCkobXVsYWRkc190YWIuZm5fMmRbdHlwZV0pOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmMxLT5kYXRhLnB0ciwgc3JjMS0+c3RlcCwgc3JjMi0+ZGF0YS5wdHIsIHNyYzItPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBzaXplLCBzY2FsZS52YWwgKSk7CisgICAgfQorCisgICAgQ1ZfQ0hFQ0tfTkFOUyggZHN0ICk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2Q2FsY0NvdmFyTWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfRE9UX1BST0RVQ1RfQ0FTRSggZmxhdm9yLCBzcmN0eXBlLCBhdmd0eXBlLCBsb2FkX21hY3JvICkgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZEb3RQcm9kdWN0U2hpZnRlZF8jI2ZsYXZvciMjX0MxUiggY29uc3Qgc3JjdHlwZSogdmVjMSwgaW50IHZlY3N0ZXAxLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUqIHZlYzIsIGludCB2ZWNzdGVwMiwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdmd0eXBlKiBhdmcsIGludCBhdmdzdGVwLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogX3Jlc3VsdCApICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjc3RlcDEgLz0gc2l6ZW9mKHZlYzFbMF0pOyB2ZWNzdGVwMiAvPSBzaXplb2YodmVjMlswXSk7IGF2Z3N0ZXAgLz0gc2l6ZW9mKGF2Z1swXSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgdmVjMSArPSB2ZWNzdGVwMSwgdmVjMiArPSB2ZWNzdGVwMiwgYXZnICs9IGF2Z3N0ZXAgKSAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gNDsgeCArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXN1bHQgKz0gKGxvYWRfbWFjcm8odmVjMVt4XSkgLSBhdmdbeF0pKihsb2FkX21hY3JvKHZlYzJbeF0pIC0gYXZnW3hdKSArICAgXAorICAgICAgICAgICAgICAgIChsb2FkX21hY3JvKHZlYzFbeCsxXSkgLSBhdmdbeCsxXSkqKGxvYWRfbWFjcm8odmVjMlt4KzFdKSAtIGF2Z1t4KzFdKSArIFwKKyAgICAgICAgICAgICAgICAobG9hZF9tYWNybyh2ZWMxW3grMl0pIC0gYXZnW3grMl0pKihsb2FkX21hY3JvKHZlYzJbeCsyXSkgLSBhdmdbeCsyXSkgKyBcCisgICAgICAgICAgICAgICAgKGxvYWRfbWFjcm8odmVjMVt4KzNdKSAtIGF2Z1t4KzNdKSoobG9hZF9tYWNybyh2ZWMyW3grM10pIC0gYXZnW3grM10pOyAgXAorICAgICAgICBmb3IoIDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlc3VsdCArPSAobG9hZF9tYWNybyh2ZWMxW3hdKSAtIGF2Z1t4XSkqKGxvYWRfbWFjcm8odmVjMlt4XSkgLSBhdmdbeF0pOyAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX3Jlc3VsdCA9IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ET1RfUFJPRFVDVF9DQVNFKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0RPVF9QUk9EVUNUX0NBU0UoIDh1NjRmLCB1Y2hhciwgZG91YmxlLCBDVl84VE8zMkYgKQorSUNWX0RPVF9QUk9EVUNUX0NBU0UoIDE2dTMyZiwgdXNob3J0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ET1RfUFJPRFVDVF9DQVNFKCAxNnU2NGYsIHVzaG9ydCwgZG91YmxlLCBDVl9OT1AgKQorSUNWX0RPVF9QUk9EVUNUX0NBU0UoIDE2czMyZiwgc2hvcnQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0RPVF9QUk9EVUNUX0NBU0UoIDE2czY0Ziwgc2hvcnQsIGRvdWJsZSwgQ1ZfTk9QICkKK0lDVl9ET1RfUFJPRFVDVF9DQVNFKCAzMmYsIGZsb2F0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ET1RfUFJPRFVDVF9DQVNFKCAzMmY2NGYsIGZsb2F0LCBkb3VibGUsIENWX05PUCApCitJQ1ZfRE9UX1BST0RVQ1RfQ0FTRSggNjRmLCBkb3VibGUsIGRvdWJsZSwgQ1ZfTk9QICkKKworc3RhdGljIHZvaWQgIGljdkluaXREb3RQcm9kdWN0U2hpZnRlZFRhYmxlKCBDdkZ1bmNUYWJsZSogdGFiZmwsIEN2RnVuY1RhYmxlKiB0YWJkYiApCit7CisgICAgdGFiZmwtPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZEb3RQcm9kdWN0U2hpZnRlZF84dTMyZl9DMVI7CisgICAgdGFiZmwtPmZuXzJkW0NWXzhTXSA9IDA7CisgICAgdGFiZmwtPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2RG90UHJvZHVjdFNoaWZ0ZWRfMTZ1MzJmX0MxUjsKKyAgICB0YWJmbC0+Zm5fMmRbQ1ZfMTZTXSA9ICh2b2lkKilpY3ZEb3RQcm9kdWN0U2hpZnRlZF8xNnMzMmZfQzFSOworICAgIHRhYmZsLT5mbl8yZFtDVl8zMlNdID0gMDsKKyAgICB0YWJmbC0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZEb3RQcm9kdWN0U2hpZnRlZF8zMmZfQzFSOworICAgIHRhYmZsLT5mbl8yZFtDVl82NEZdID0gMDsKKworICAgIHRhYmRiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2RG90UHJvZHVjdFNoaWZ0ZWRfOHU2NGZfQzFSOworICAgIHRhYmRiLT5mbl8yZFtDVl84U10gPSAwOworICAgIHRhYmRiLT5mbl8yZFtDVl8xNlVdID0gKHZvaWQqKWljdkRvdFByb2R1Y3RTaGlmdGVkXzE2dTY0Zl9DMVI7CisgICAgdGFiZGItPmZuXzJkW0NWXzE2U10gPSAodm9pZCopaWN2RG90UHJvZHVjdFNoaWZ0ZWRfMTZzNjRmX0MxUjsKKyAgICB0YWJkYi0+Zm5fMmRbQ1ZfMzJTXSA9IDA7CisgICAgdGFiZGItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2RG90UHJvZHVjdFNoaWZ0ZWRfMzJmNjRmX0MxUjsKKyAgICB0YWJkYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3ZEb3RQcm9kdWN0U2hpZnRlZF82NGZfQzFSOworfQorCisjZGVmaW5lIElDVl9FWFRfUFJPRFVDVF9DQVNFKCBmbGF2b3IsIHNyY3R5cGUsIGF2Z3R5cGUsIGxvYWRfbWFjcm8gKSAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkV4dFByb2R1Y3RTaGlmdGVkXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBzcmN0eXBlKiB2ZWMsIGludCB2ZWNzdGVwLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXZndHlwZSogYXZnLCBpbnQgYXZnc3RlcCwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2Z3R5cGUqIGRzdCwgaW50IGRzdHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgYXZndHlwZSogdGVtcGJ1ZiApICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4LCB5LCBkc3RzaXplID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdmVjc3RlcCAvPSBzaXplb2YodmVjWzBdKTsgYXZnc3RlcCAvPSBzaXplb2YoYXZnWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrLCB2ZWMgKz0gdmVjc3RlcCwgYXZnICs9IGF2Z3N0ZXAgKSAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHNpemUud2lkdGg7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqdGVtcGJ1ZisrID0gbG9hZF9tYWNybyh2ZWNbeF0pIC0gYXZnW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBidWYgLT0gZHN0c2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBkc3RzaXplOyB5KyssIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB0eSA9IHRlbXBidWZbeV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDw9IHkgLSAzOyB4ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkb3VibGUgdDAgPSBkc3RbeF0gKyB0eSp0ZW1wYnVmW3hdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZG91YmxlIHQxID0gZHN0W3grMV0gKyB0eSp0ZW1wYnVmW3grMV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFt4XSA9IChhdmd0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCsxXSA9IChhdmd0eXBlKXQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBkc3RbeCsyXSArIHR5KnRlbXBidWZbeCsyXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gZHN0W3grM10gKyB0eSp0ZW1wYnVmW3grM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbeCsyXSA9IChhdmd0eXBlKXQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3grM10gPSAoYXZndHlwZSl0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyB4IDw9IHk7IHgrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W3hdID0gKGF2Z3R5cGUpKGRzdFt4XSArIHR5KnRlbXBidWZbeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSUNWX0VYVF9QUk9EVUNUX0NBU0UoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfRVhUX1BST0RVQ1RfQ0FTRSggOHU2NGYsIHVjaGFyLCBkb3VibGUsIENWXzhUTzMyRiApCitJQ1ZfRVhUX1BST0RVQ1RfQ0FTRSggMTZ1MzJmLCB1c2hvcnQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0VYVF9QUk9EVUNUX0NBU0UoIDE2dTY0ZiwgdXNob3J0LCBkb3VibGUsIENWX05PUCApCitJQ1ZfRVhUX1BST0RVQ1RfQ0FTRSggMTZzMzJmLCBzaG9ydCwgZmxvYXQsIENWX05PUCApCitJQ1ZfRVhUX1BST0RVQ1RfQ0FTRSggMTZzNjRmLCBzaG9ydCwgZG91YmxlLCBDVl9OT1AgKQorSUNWX0VYVF9QUk9EVUNUX0NBU0UoIDMyZiwgZmxvYXQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0VYVF9QUk9EVUNUX0NBU0UoIDMyZjY0ZiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QICkKK0lDVl9FWFRfUFJPRFVDVF9DQVNFKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AgKQorCisKK3N0YXRpYyB2b2lkICBpY3ZJbml0RXh0UHJvZHVjdFNoaWZ0ZWRUYWJsZSggQ3ZGdW5jVGFibGUqIHRhYmZsLCBDdkZ1bmNUYWJsZSogdGFiZGIgKQoreworICAgIHRhYmZsLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2RXh0UHJvZHVjdFNoaWZ0ZWRfOHUzMmZfQzFSOworICAgIHRhYmZsLT5mbl8yZFtDVl84U10gPSAwOworICAgIHRhYmZsLT5mbl8yZFtDVl8xNlVdID0gKHZvaWQqKWljdkV4dFByb2R1Y3RTaGlmdGVkXzE2dTMyZl9DMVI7CisgICAgdGFiZmwtPmZuXzJkW0NWXzE2U10gPSAodm9pZCopaWN2RXh0UHJvZHVjdFNoaWZ0ZWRfMTZzMzJmX0MxUjsKKyAgICB0YWJmbC0+Zm5fMmRbQ1ZfMzJTXSA9IDA7CisgICAgdGFiZmwtPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2RXh0UHJvZHVjdFNoaWZ0ZWRfMzJmX0MxUjsKKyAgICB0YWJmbC0+Zm5fMmRbQ1ZfNjRGXSA9IDA7CisKKyAgICB0YWJkYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdkV4dFByb2R1Y3RTaGlmdGVkXzh1NjRmX0MxUjsKKyAgICB0YWJkYi0+Zm5fMmRbQ1ZfOFNdID0gMDsKKyAgICB0YWJkYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3ZFeHRQcm9kdWN0U2hpZnRlZF8xNnU2NGZfQzFSOworICAgIHRhYmRiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdkV4dFByb2R1Y3RTaGlmdGVkXzE2czY0Zl9DMVI7CisgICAgdGFiZGItPmZuXzJkW0NWXzMyU10gPSAwOworICAgIHRhYmRiLT5mbl8yZFtDVl8zMkZdID0gKHZvaWQqKWljdkV4dFByb2R1Y3RTaGlmdGVkXzMyZjY0Zl9DMVI7CisgICAgdGFiZGItPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2RXh0UHJvZHVjdFNoaWZ0ZWRfNjRmX0MxUjsKK30KKworCit0eXBlZGVmIHN0cnVjdCB2ZWNfZGF0YQoreworICAgIHZvaWQqIHB0cjsKKyAgICBpbnQgc3RlcDsKK30KK3ZlY19kYXRhOworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY0NvdmFyTWF0cml4KCBjb25zdCBDdkFycioqIHZlY2FyciwgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgIEN2QXJyKiBjb3ZhcnIsIEN2QXJyKiBhdmdhcnIsIGludCBmbGFncyApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGRvdF90YWJbMl07CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIGV4dF90YWJbMl07CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKyAgICB2ZWNfZGF0YSogdmVjZGF0YSA9IDA7CisgICAgQ3ZNYXQgKnRlbXB2ZWMgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjQ292YXJNYXRyaXgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBjb3ZzdHViLCAqY292ID0gKEN2TWF0Kiljb3ZhcnI7CisgICAgQ3ZNYXQgYXZnc3R1YiwgKmF2ZyA9IChDdk1hdCopYXZnYXJyOworICAgIEN2TWF0IHZlY3N0dWIwLCAqdmVjbWF0ID0gMDsKKyAgICBDdlNpemUgc3Jjc2l6ZSwgY29udHNpemU7CisgICAgaW50IHNyY3R5cGUgPSAwLCBkc3R0eXBlID0gMDsKKyAgICBpbnQgaSwgajsKKyAgICBpbnQgY29udF9mbGFnLCB2ZWNfZGVsdGEgPSAwLCB2ZWNfc3RlcCA9IDA7CisgICAgaW50IGlzX2NvdmFyX25vcm1hbCA9IChmbGFncyAmIENWX0NPVkFSX05PUk1BTCkgIT0gMDsKKyAgICBkb3VibGUgc2NhbGU7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdERvdFByb2R1Y3RTaGlmdGVkVGFibGUoIGRvdF90YWIgKyAwLCBkb3RfdGFiICsgMSApOworICAgICAgICBpY3ZJbml0RXh0UHJvZHVjdFNoaWZ0ZWRUYWJsZSggZXh0X3RhYiArIDAsIGV4dF90YWIgKyAxICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhdmVjYXJyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHZlYyBwb2ludGVyIiApOworCisgICAgQ1ZfQ0FMTCggY292ID0gY3ZHZXRNYXQoIGNvdiwgJmNvdnN0dWIgKSk7CisgICAgQ1ZfQ0FMTCggYXZnID0gY3ZHZXRNYXQoIGF2ZywgJmF2Z3N0dWIgKSk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggY292LCBhdmcgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsCisgICAgICAgICJDb3ZhcmlhdGlvbiBtYXRyaXggYW5kIGF2ZXJhZ2UgdmVjdG9yIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGVzIiApOworCisgICAgZHN0dHlwZSA9IENWX01BVF9UWVBFKCBjb3YtPnR5cGUgKTsKKyAgICBpZiggZHN0dHlwZSAhPSBDVl8zMkZDMSAmJiBkc3R0eXBlICE9IENWXzY0RkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiQ292YXJpYXRpb24gbWF0cml4IG11c3QgYmUgMzJmQzEgb3IgNjRmQzEiICk7CisKKyAgICBpZiggY292LT5yb3dzICE9IGNvdi0+Y29scyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiQ292YXJpYXRpb24gbWF0cml4IG11c3QgYmUgc3F1YXJlIiApOworCisgICAgc3Jjc2l6ZSA9IGN2R2V0TWF0U2l6ZSggYXZnICk7CisgICAgY29udHNpemUud2lkdGggPSBzcmNzaXplLndpZHRoICogc3Jjc2l6ZS5oZWlnaHQ7CisgICAgY29udHNpemUuaGVpZ2h0ID0gMTsKKyAgICBjb250X2ZsYWcgPSBhdmctPnR5cGU7CisKKyAgICBpZiggZmxhZ3MgJiAoQ1ZfQ09WQVJfUk9XU3xDVl9DT1ZBUl9DT0xTKSApCisgICAgeworICAgICAgICBDVl9DQUxMKCB2ZWNtYXQgPSBjdkdldE1hdCggdmVjYXJyWzBdLCAmdmVjc3R1YjAgKSk7CisgICAgICAgIHNyY3R5cGUgPSBDVl9NQVRfVFlQRSh2ZWNtYXQtPnR5cGUpOworICAgICAgICBpZiggZmxhZ3MgJiBDVl9DT1ZBUl9DT0xTICkKKyAgICAgICAgeworICAgICAgICAgICAgY291bnQgPSB2ZWNtYXQtPmNvbHM7CisgICAgICAgICAgICBpZiggYXZnLT5jb2xzICE9IDEgfHwgYXZnLT5yb3dzICE9IHZlY21hdC0+cm93cyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICJUaGUgbnVtYmVyIG9mIGlucHV0IHZlY3RvcnMgZG9lcyBub3QgbWF0Y2ggdG8gYXZnIHZlY3RvciBzaXplIiApOworICAgICAgICAgICAgY29udF9mbGFnID0gMDsKKyAgICAgICAgICAgIHZlY19kZWx0YSA9IENWX0VMRU1fU0laRSh2ZWNtYXQtPnR5cGUpOworICAgICAgICAgICAgdmVjX3N0ZXAgPSB2ZWNtYXQtPnN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb3VudCA9IHZlY21hdC0+cm93czsKKyAgICAgICAgICAgIGlmKCBhdmctPnJvd3MgIT0gMSB8fCBhdmctPmNvbHMgIT0gdmVjbWF0LT5jb2xzICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAgICAgIlRoZSBudW1iZXIgb2YgaW5wdXQgdmVjdG9ycyBkb2VzIG5vdCBtYXRjaCB0byBhdmcgdmVjdG9yIHNpemUiICk7CisgICAgICAgICAgICB2ZWNfZGVsdGEgPSB2ZWNtYXQtPnN0ZXA7CisgICAgICAgICAgICB2ZWNfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9DT1ZBUl9VU0VfQVZHKSApCisgICAgICAgICAgICBDVl9DQUxMKCBjdlJlZHVjZSggdmVjbWF0LCBhdmcsIC0xLCBDVl9SRURVQ0VfQVZHICkpOworCisgICAgICAgIHNjYWxlID0gIShmbGFncyAmIENWX0NPVkFSX1NDQUxFKSA/IDEuIDogMS4vY291bnQ7CisKKyAgICAgICAgY3ZNdWxUcmFuc3Bvc2VkKCB2ZWNtYXQsIGNvdiwgKChmbGFncyAmIENWX0NPVkFSX1JPV1MpIT0wKSBeICgoZmxhZ3MgJiBDVl9DT1ZBUl9OT1JNQUwpPT0wKSwgYXZnLCBzY2FsZSApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIHNjYWxlID0gIShmbGFncyAmIENWX0NPVkFSX1NDQUxFKSA/IDEuIDogMS4vY291bnQ7CisKKyAgICBpZiggaXNfY292YXJfbm9ybWFsICkKKyAgICB7CisgICAgICAgIGlmKCBjb3VudCA8PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIlRoZSBudW1iZXIgb2YgdmVjdG9ycyBpcyB6ZXJvIG9yIG5lZ2F0aXZlIiApOworICAgICAgICBpZiggY292LT5yb3dzICE9IGNvbnRzaXplLndpZHRoICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgICAgICJUaGUgc2l6ZSBvZiBpbnB1dCB2ZWN0b3JzIGRvZXMgbm90IG1hdGNoIHdpdGggdGhlIHNpemUgb2YgY292YXJpYXRpb24gbWF0cml4IiApOworCisgICAgICAgIENWX0NBTEwoIHRlbXB2ZWMgPSBjdkNyZWF0ZU1hdCggYXZnLT5yb3dzLCBhdmctPmNvbHMsIGRzdHR5cGUgKSk7CisgICAgfQorICAgIGVsc2UgaWYoIGNvdW50ICE9IGNvdi0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgIlRoZSB2ZWN0b3IgY291bnQgYW5kIGNvdmFyaWFuY2UgbWF0cml4IHNpemUgZG8gbm90IG1hdGNoIiApOworCisgICAgaWYoICEoZmxhZ3MgJiAoQ1ZfQ09WQVJfUk9XU3xDVl9DT1ZBUl9DT0xTKSkgKQorICAgIHsKKyAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9DT1ZBUl9VU0VfQVZHKSApCisgICAgICAgICAgICBjdlplcm8oIGF2ZyApOworCisgICAgICAgIENWX0NBTEwoIHZlY2RhdGEgPSAodmVjX2RhdGEqKWN2QWxsb2MoIGNvdW50KnNpemVvZih2ZWNkYXRhWzBdKSkpOworICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0IHZlY3N0dWIsICp2ZWMgPSAoQ3ZNYXQqKXZlY2FycltpXTsKKyAgICAgICAgICAgIEN2TWF0KiB0ZW1wOworCisgICAgICAgICAgICBpZiggIUNWX0lTX01BVCh2ZWMpICkKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCB2ZWMgPSBjdkdldE1hdCggdmVjLCAmdmVjc3R1YiApKTsKKworICAgICAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHZlYywgYXZnICkpCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgICAgICJBbGwgaW5wdXQgdmVjdG9ycyBhbmQgYXZlcmFnZSB2ZWN0b3IgbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUiICk7CisKKyAgICAgICAgICAgIHZlY2RhdGFbaV0ucHRyID0gdmVjLT5kYXRhLnB0cjsKKyAgICAgICAgICAgIHZlY2RhdGFbaV0uc3RlcCA9IHZlYy0+c3RlcDsKKyAgICAgICAgICAgIGNvbnRfZmxhZyAmPSB2ZWMtPnR5cGU7CisgICAgICAgICAgICB0ZW1wID0gdmVjOworICAgICAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3JjdHlwZSA9IENWX01BVF9UWVBFKCB2ZWMtPnR5cGUgKTsKKyAgICAgICAgICAgICAgICBpZiggQ1ZfTUFUX0NOKCBzcmN0eXBlICkgIT0gMSApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIkFsbCB2ZWN0b3JzIG11c3QgaGF2ZSBhIHNpbmdsZSBjaGFubmVsIiApOworICAgICAgICAgICAgICAgIGlmKCBzcmN0eXBlICE9IGRzdHR5cGUgJiYgIXRlbXB2ZWMgJiYgIShmbGFncyAmIENWX0NPVkFSX1VTRV9BVkcpKQorICAgICAgICAgICAgICAgICAgICBDVl9DQUxMKCB0ZW1wdmVjID0gY3ZDcmVhdGVNYXQoIHZlYy0+cm93cywgdmVjLT5jb2xzLCBkc3R0eXBlICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggQ1ZfTUFUX1RZUEUodmVjLT50eXBlKSAhPSBzcmN0eXBlICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywKKyAgICAgICAgICAgICAgICAiQWxsIGlucHV0IHZlY3RvcnMgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUiICk7CisKKyAgICAgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfQ09WQVJfVVNFX0FWRykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB0ZW1wdmVjICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wdmVjOworICAgICAgICAgICAgICAgICAgICBjdkNvbnZlcnQoIHZlYywgdGVtcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdkFkZCggdGVtcCwgYXZnLCBhdmcgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhKGZsYWdzICYgQ1ZfQ09WQVJfVVNFX0FWRykgKQorICAgICAgICAgICAgY3ZTY2FsZSggYXZnLCBhdmcsIDEuL2NvdW50ICk7CisgICAgfQorCisgICAgY29udF9mbGFnID0gQ1ZfSVNfTUFUX0NPTlQoIGNvbnRfZmxhZyApOworICAgIGlmKCBjb250X2ZsYWcgKQorICAgICAgICBzcmNzaXplID0gY29udHNpemU7CisKKyAgICBpZiggIWlzX2NvdmFyX25vcm1hbCApCisgICAgeworICAgICAgICBDdkZ1bmMyRF8zQTFQIGRvdF9mdW5jID0KKyAgICAgICAgICAgIChDdkZ1bmMyRF8zQTFQKWRvdF90YWJbZHN0dHlwZSA9PSBDVl82NEZDMV0uZm5fMmRbQ1ZfTUFUX0RFUFRIKHNyY3R5cGUpXTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhZG90X2Z1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAgICAgIlRoZSBmb3JtYXQgb2YgaW5wdXQgdmVjdG9ycyBpcyBub3Qgc3VwcG9ydGVkIiApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGEsIGIsIGRlbHRhOworICAgICAgICAgICAgaWYoICEoaSAmIDEpICkKKyAgICAgICAgICAgICAgICBhID0gMCwgYiA9IGkrMSwgZGVsdGEgPSAxOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGEgPSBpLCBiID0gLTEsIGRlbHRhID0gLTE7CisKKyAgICAgICAgICAgIGZvciggaiA9IGE7IGogIT0gYjsgaiArPSBkZWx0YSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHJlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgdm9pZCAqdl9pLCAqdl9qOworICAgICAgICAgICAgICAgIGludCBzdGVwX2ksIHN0ZXBfajsKKworICAgICAgICAgICAgICAgIGlmKCAhdmVjbWF0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZfaSA9IHZlY2RhdGFbaV0ucHRyOworICAgICAgICAgICAgICAgICAgICB2X2ogPSB2ZWNkYXRhW2pdLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgc3RlcF9pID0gdmVjZGF0YVtpXS5zdGVwOworICAgICAgICAgICAgICAgICAgICBzdGVwX2ogPSB2ZWNkYXRhW2pdLnN0ZXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHZfaSA9IHZlY21hdC0+ZGF0YS5wdHIgKyB2ZWNfZGVsdGEqaTsKKyAgICAgICAgICAgICAgICAgICAgdl9qID0gdmVjbWF0LT5kYXRhLnB0ciArIHZlY19kZWx0YSpqOworICAgICAgICAgICAgICAgICAgICBzdGVwX2kgPSBzdGVwX2ogPSB2ZWNfc3RlcDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkb3RfZnVuYyggdl9pLCBzdGVwX2ksIHZfaiwgc3RlcF9qLCBhdmctPmRhdGEucHRyLCBhdmctPnN0ZXAsIHNyY3NpemUsICZyZXN1bHQgKTsKKworICAgICAgICAgICAgICAgIGlmKCBkc3R0eXBlID09IENWXzY0RkMxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKikoY292LT5kYXRhLnB0ciArIGkqY292LT5zdGVwKSlbal0gPQorICAgICAgICAgICAgICAgICAgICAoKGRvdWJsZSopKGNvdi0+ZGF0YS5wdHIgKyBqKmNvdi0+c3RlcCkpW2ldID0gcmVzdWx0KnNjYWxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KikoY292LT5kYXRhLnB0ciArIGkqY292LT5zdGVwKSlbal0gPQorICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KikoY292LT5kYXRhLnB0ciArIGoqY292LT5zdGVwKSlbaV0gPSAoZmxvYXQpKHJlc3VsdCpzY2FsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVjaGFyKiBjb3ZfcHRyID0gY292LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IGNvdl9zdGVwID0gY292LT5zdGVwOworICAgICAgICBpbnQgY292X3NpemUgPSBjb3YtPnJvd3M7CisgICAgICAgIEN2RnVuYzJEXzNBMVAgZXh0X2Z1bmMgPQorICAgICAgICAgICAgKEN2RnVuYzJEXzNBMVApZXh0X3RhYltkc3R0eXBlID09IENWXzY0RkMxXS5mbl8yZFtDVl9NQVRfREVQVEgoc3JjdHlwZSldOworICAgICAgICBpZiggIWV4dF9mdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJUaGUgZm9ybWF0IG9mIGlucHV0IHZlY3RvcnMgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICAgICAgCisgICAgICAgIGN2WmVybyggY292ICk7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQqIHY7CisgICAgICAgICAgICBpbnQgdnN0ZXA7CisgICAgICAgICAgICBpZiggIXZlY21hdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdiA9IHZlY2RhdGFbaV0ucHRyOworICAgICAgICAgICAgICAgIHZzdGVwID0gdmVjZGF0YVtpXS5zdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHYgPSB2ZWNtYXQtPmRhdGEucHRyICsgdmVjX2RlbHRhKmk7CisgICAgICAgICAgICAgICAgdnN0ZXAgPSB2ZWNfc3RlcDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXh0X2Z1bmMoIHYsIHZzdGVwLCBhdmctPmRhdGEucHRyLCBhdmctPnN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgY292X3B0ciwgY292X3N0ZXAsIHNyY3NpemUsIHRlbXB2ZWMtPmRhdGEucHRyICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggZHN0dHlwZSA9PSBDVl82NEZDMSApCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY292X3NpemU7IGkrKyApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBpOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb3YxID0gKChkb3VibGUqKShjb3ZfcHRyICsgaSpjb3Zfc3RlcCkpICsgajsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBjb3YyID0gKChkb3VibGUqKShjb3ZfcHRyICsgaipjb3Zfc3RlcCkpICsgaTsKKworICAgICAgICAgICAgICAgICAgICBpZiggZmxhZ3MgJiBDVl9DT1ZBUl9TQ0FMRSApCisgICAgICAgICAgICAgICAgICAgICAgICAqY292MSA9ICpjb3YyID0gKmNvdjEqc2NhbGU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb3YyID0gKmNvdjE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY292X3NpemU7IGkrKyApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBpOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGNvdjEgPSAoKGZsb2F0KikoY292X3B0ciArIGkqY292X3N0ZXApKSArIGo7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBjb3YyID0gKChmbG9hdCopKGNvdl9wdHIgKyBqKmNvdl9zdGVwKSkgKyBpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX0NPVkFSX1NDQUxFICkKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb3YxID0gKmNvdjIgPSAoZmxvYXQpKCpjb3YxKnNjYWxlKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgKmNvdjIgPSAqY292MTsKKyAgICAgICAgICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnZlY2RhdGEgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wdmVjICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdk1haGFsYW5vYmlzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfTUFIQUxBTk9CSVMoIGZsYXZvciwgYXJydHlwZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZNYWhhbGFub2Jpc18jI2ZsYXZvciMjX0MxUiggY29uc3QgYXJydHlwZSogbWF0LCBpbnQgbWF0c3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHZlYywgaW50IGxlbiwgZG91YmxlKiBfcmVzdWx0ICkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSByZXN1bHQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWF0c3RlcCAvPSBzaXplb2YobWF0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKywgbWF0ICs9IG1hdHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSByb3dfc3VtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGxlbiAtIDQ7IGogKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJvd19zdW0gKz0gdmVjW2pdKm1hdFtqXSArIHZlY1tqKzFdKm1hdFtqKzFdICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIHZlY1tqKzJdKm1hdFtqKzJdICsgdmVjW2orM10qbWF0W2orM107ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaiA8IGxlbjsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJvd19zdW0gKz0gdmVjW2pdKm1hdFtqXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJlc3VsdCArPSByb3dfc3VtICogdmVjW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX3Jlc3VsdCA9IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworSUNWX01BSEFMQU5PQklTKCAzMmYsIGZsb2F0ICkKK0lDVl9NQUhBTEFOT0JJUyggNjRmLCBkb3VibGUgKQorCitzdGF0aWMgdm9pZCAgaWN2SW5pdE1haGFsYW5vYmlzVGFibGUoIEN2RnVuY1RhYmxlKiB0YWIgKQoreworICAgIHRhYi0+Zm5fMmRbQ1ZfMzJGXSA9ICh2b2lkKilpY3ZNYWhhbGFub2Jpc18zMmZfQzFSOworICAgIHRhYi0+Zm5fMmRbQ1ZfNjRGXSA9ICh2b2lkKilpY3ZNYWhhbGFub2Jpc182NGZfQzFSOworfQorCit0eXBlZGVmIEN2U3RhdHVzIChDVl9TVERDQUxMICogQ3ZNYWhhbGFub2Jpc0Z1bmMpKCBjb25zdCB2b2lkKiBtYXQsIGludCBtYXRzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogdmVjLCBpbnQgbGVuLCBkb3VibGUqIF9yZXN1bHQgKTsKKworQ1ZfSU1QTCBkb3VibGUKK2N2TWFoYWxhbm9iaXMoIGNvbnN0IEN2QXJyKiBzcmNBYXJyLCBjb25zdCBDdkFyciogc3JjQmFyciwgQ3ZBcnIqIG1hdGFyciApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG1haGFsX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisgICAgZG91YmxlIGRpc3QgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdk1haGFsYW5vYmlzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGJ1Zl9zaXplLCBlbGVtX3NpemUsIGxlbjsKKyAgICBDdk1hdCBzdHViQSwgKnNyY0EgPSAoQ3ZNYXQqKXNyY0FhcnI7CisgICAgQ3ZNYXQgc3R1YkIsICpzcmNCID0gKEN2TWF0KilzcmNCYXJyOworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKW1hdGFycjsKKyAgICBDdk1hdCB0ZW1wOworICAgIEN2TWFoYWxhbm9iaXNGdW5jIGZ1bmM7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdE1haGFsYW5vYmlzVGFibGUoICZtYWhhbF90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQoc3JjQSkgKQorICAgICAgICBDVl9DQUxMKCBzcmNBID0gY3ZHZXRNYXQoIHNyY0EsICZzdHViQSApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyY0IpICkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjQiA9IGN2R2V0TWF0KCBzcmNCLCAmc3R1YkIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChtYXQpICkKKyAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIgKSk7CisKKyAgICBpZiggc3JjQS0+cm93cyAhPSAxICYmIHNyY0EtPmNvbHMgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiSW5wdXQgbWF0cmljZXMgbXVzdCBiZSAxLWQgdmVjdG9ycyIgKTsKKworICAgIGxlbiA9IHNyY0EtPnJvd3MgKyBzcmNBLT5jb2xzIC0gMTsKKworICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKHNyY0Esc3JjQikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJJbnB1dCB2ZWN0b3JzIGhhdmUgZGlmZmVyZW50IHNpemVzIiApOworICAgIAorICAgIGlmKCBtYXQtPnJvd3MgIT0gbGVuIHx8IG1hdC0+Y29scyAhPSBsZW4gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJJbnB1dCB2ZWN0b3JzIGFuZCBjb3ZhcmlhdGlvbiBtYXRyaXggaGF2ZSBkaWZmZXJlbnQgc2l6ZXMiICk7CisKKyAgICBmdW5jID0gKEN2TWFoYWxhbm9iaXNGdW5jKW1haGFsX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgoc3JjQS0+dHlwZSldOworCisgICAgaWYoIENWX01BVF9DTihzcmNBLT50eXBlKSA+IDEgfHwgIWZ1bmMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJPbmx5IHNpbmdsZS1jaGFubmVsIGZsb2F0aW5nLXBvaW50IHZlY3RvcnMgYXJlIHN1cHBvcnRlZCIgKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKHNyY0Esc3JjQikgfHwgIUNWX0FSRV9UWVBFU19FUShzcmNBLG1hdCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJJbnB1dCB2ZWN0b3JzIGhhdmUgZGlmZmVyZW50IHNpemVzIiApOworCisgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKHNyY0EtPnR5cGUpOworICAgIGJ1Zl9zaXplID0gbGVuKmVsZW1fc2l6ZTsKKyAgICAKKyAgICBpZiggYnVmX3NpemUgPD0gQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKCBidWZfc2l6ZSApKTsKKyAgICB9CisKKyAgICB0ZW1wID0gY3ZNYXQoIHNyY0EtPnJvd3MsIHNyY0EtPmNvbHMsIHNyY0EtPnR5cGUsIGJ1ZmZlciApOworICAgIENWX0NBTEwoIGN2U3ViKCBzcmNBLCBzcmNCLCAmdGVtcCApKTsKKworICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0LT5zdGVwLCB0ZW1wLmRhdGEucHRyLCBsZW4sICZkaXN0ICkpOworICAgIGRpc3QgPSBzcXJ0KGRpc3QpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBidWZmZXIgJiYgIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisKKyAgICByZXR1cm4gIGRpc3Q7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2TXVsVHJhbnNwb3NlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9ERUZfTVVMVFJBTlNfUl9GVU5DKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIGxvYWRfbWFjcm8gKSAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TXVsVHJhbnNwb3NlZFJfIyNmbGF2b3IoIGNvbnN0IHNyY3R5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgIGRzdHR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHN0dHlwZSogZGVsdGEsIGludCBkZWx0YXN0ZXAsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGRlbHRhX2NvbHMsIGRvdWJsZSBzY2FsZSApICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgaiwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHR5cGUqIHRkc3QgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0dHlwZSogY29sX2J1ZiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3R0eXBlKiBkZWx0YV9idWYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBsb2NhbF9hbGxvYyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGJ1Zl9zaXplID0gc2l6ZS5oZWlnaHQqc2l6ZW9mKGRzdHR5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBkZWx0YSAmJiBkZWx0YV9jb2xzIDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXNzZXJ0KCBkZWx0YV9jb2xzID09IDEgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBidWZfc2l6ZSArPSA0KmJ1Zl9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBidWZfc2l6ZSA8PSBDVl9NQVhfTE9DQUxfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29sX2J1ZiA9IChkc3R0eXBlKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb2NhbF9hbGxvYyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbF9idWYgPSAoZHN0dHlwZSopY3ZBbGxvYyggYnVmX3NpemUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFjb2xfYnVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7IGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVsdGFzdGVwIC89IHNpemVvZihkZWx0YVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBkZWx0YSAmJiBkZWx0YV9jb2xzIDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZGVsdGFfYnVmID0gY29sX2J1ZiArIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkZWx0YV9idWZbaSo0XSA9IGRlbHRhX2J1ZltpKjQrMV0gPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkZWx0YV9idWZbaSo0KzJdID0gZGVsdGFfYnVmW2kqNCszXSA9IGRlbHRhW2kqZGVsdGFzdGVwXTsgICAgICAgXAorICAgICAgICBkZWx0YSA9IGRlbHRhX2J1ZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRlbHRhc3RlcCA9IGRlbHRhc3RlcCA/IDQgOiAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICFkZWx0YSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgdGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgc2l6ZS5oZWlnaHQ7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb2xfYnVmW2tdID0gc3JjW2sqc3Jjc3RlcCtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDw9IHNpemUud2lkdGggLSA0OyBqICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYyA9IHNyYyArIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBzaXplLmhlaWdodDsgaysrLCB0c3JjICs9IHNyY3N0ZXAgKSAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGEgPSBjb2xfYnVmW2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCArPSBhICogbG9hZF9tYWNybyh0c3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMxICs9IGEgKiBsb2FkX21hY3JvKHRzcmNbMV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczIgKz0gYSAqIGxvYWRfbWFjcm8odHNyY1syXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMyArPSBhICogbG9hZF9tYWNybyh0c3JjWzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRkc3Rbal0gPSAoZHN0dHlwZSkoczAqc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGRzdFtqKzFdID0gKGRzdHR5cGUpKHMxKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZHN0W2orMl0gPSAoZHN0dHlwZSkoczIqc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRkc3RbaiszXSA9IChkc3R0eXBlKShzMypzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCA7IGogPCBzaXplLndpZHRoOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb3VibGUgczAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGNvbnN0IHNyY3R5cGUgKnRzcmMgPSBzcmMgKyBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgc2l6ZS5oZWlnaHQ7IGsrKywgdHNyYyArPSBzcmNzdGVwICkgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMCArPSBjb2xfYnVmW2tdICogdHNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZHN0W2pdID0gKGRzdHR5cGUpKHMwKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCB0ZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCAhZGVsdGFfYnVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBzaXplLmhlaWdodDsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbF9idWZba10gPSBsb2FkX21hY3JvKHNyY1trKnNyY3N0ZXAraV0pIC0gZGVsdGFbaypkZWx0YXN0ZXAraV07IFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBzaXplLmhlaWdodDsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGNvbF9idWZba10gPSBsb2FkX21hY3JvKHNyY1trKnNyY3N0ZXAraV0pIC0gZGVsdGFfYnVmW2sqZGVsdGFzdGVwXTsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDw9IHNpemUud2lkdGggLSA0OyBqICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYyA9IHNyYyArIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBkc3R0eXBlICpkID0gZGVsdGFfYnVmID8gZGVsdGFfYnVmIDogZGVsdGEgKyBqOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHNpemUuaGVpZ2h0OyBrKyssIHRzcmMrPXNyY3N0ZXAsIGQrPWRlbHRhc3RlcCApIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSA9IGNvbF9idWZba107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMwICs9IGEgKiAobG9hZF9tYWNybyh0c3JjWzBdKSAtIGRbMF0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgczEgKz0gYSAqIChsb2FkX21hY3JvKHRzcmNbMV0pIC0gZFsxXSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzMiArPSBhICogKGxvYWRfbWFjcm8odHNyY1syXSkgLSBkWzJdKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHMzICs9IGEgKiAobG9hZF9tYWNybyh0c3JjWzNdKSAtIGRbM10pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGRzdFtqXSA9IChkc3R0eXBlKShzMCpzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZHN0W2orMV0gPSAoZHN0dHlwZSkoczEqc2NhbGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRkc3RbaisyXSA9IChkc3R0eXBlKShzMipzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGRzdFtqKzNdID0gKGRzdHR5cGUpKHMzKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IHNpemUud2lkdGg7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYyA9IHNyYyArIGo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBkc3R0eXBlICpkID0gZGVsdGFfYnVmID8gZGVsdGFfYnVmIDogZGVsdGEgKyBqOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHNpemUuaGVpZ2h0OyBrKyssIHRzcmMrPXNyY3N0ZXAsIGQrPWRlbHRhc3RlcCApIFwKKyAgICAgICAgICAgICAgICAgICAgczAgKz0gY29sX2J1ZltrXSAqIChsb2FkX21hY3JvKHRzcmNbMF0pIC0gZFswXSk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdGRzdFtqXSA9IChkc3R0eXBlKShzMCpzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaWxsIHRoZSBsb3dlciBwYXJ0IG9mIHRoZSBkZXN0aW5hdGlvbiBtYXRyaXggKi8gICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDE7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaiA9IDA7IGogPCBpOyBqKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFtkc3RzdGVwKmkgKyBqXSA9IGRzdFtkc3RzdGVwKmogKyBpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGNvbF9idWYgJiYgIWxvY2FsX2FsbG9jICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY3ZGcmVlKCAmY29sX2J1ZiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX05PX0VSUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTVVMVFJBTlNfTF9GVU5DKCBmbGF2b3IsIHNyY3R5cGUsIGRzdHR5cGUsIGxvYWRfbWFjcm8gKSAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TXVsVHJhbnNwb3NlZExfIyNmbGF2b3IoIGNvbnN0IHNyY3R5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0dHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3R0eXBlKiBkZWx0YSwgaW50IGRlbHRhc3RlcCwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgZGVsdGFfY29scywgZG91YmxlIHNjYWxlICkgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgaiwgazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHR5cGUqIHRkc3QgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlbHRhc3RlcCAvPSBzaXplb2YoZGVsdGFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIWRlbHRhICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS5oZWlnaHQ7IGkrKywgdGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDwgc2l6ZS5oZWlnaHQ7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYzEgPSBzcmMgKyBpKnNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBzcmN0eXBlICp0c3JjMiA9IHNyYyArIGoqc3Jjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8PSBzaXplLndpZHRoIC0gNDsgayArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0c3JjMVtrXSp0c3JjMltrXSArIHRzcmMxW2srMV0qdHNyYzJbaysxXSArICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRzcmMxW2srMl0qdHNyYzJbaysyXSArIHRzcmMxW2srM10qdHNyYzJbayszXTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCA7IGsgPCBzaXplLndpZHRoOyBrKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcyArPSB0c3JjMVtrXSAqIHRzcmMyW2tdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRkc3Rbal0gPSAoZHN0dHlwZSkocypzY2FsZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdHR5cGUqIHJvd19idWYgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGxvY2FsX2FsbG9jID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgYnVmX3NpemUgPSBzaXplLndpZHRoKnNpemVvZihkc3R0eXBlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdHR5cGUgZGVsdGFfYnVmWzRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGRlbHRhX3NoaWZ0ID0gZGVsdGFfY29scyA9PSBzaXplLndpZHRoID8gNCA6IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBidWZfc2l6ZSA8PSBDVl9NQVhfTE9DQUxfU0laRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcm93X2J1ZiA9IChkc3R0eXBlKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJvd19idWYgPSAoZHN0dHlwZSopY3ZBbGxvYyggYnVmX3NpemUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoICFyb3dfYnVmICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmV0dXJuIENWX09VVE9GTUVNX0VSUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrLCB0ZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYzEgPSBzcmMgKyBpKnNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjb25zdCBkc3R0eXBlICp0ZGVsdGExID0gZGVsdGEgKyBpKmRlbHRhc3RlcDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIGRlbHRhX2NvbHMgPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHNpemUud2lkdGg7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcm93X2J1ZltrXSA9IHRzcmMxW2tdIC0gdGRlbHRhMVswXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IHNpemUud2lkdGg7IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcm93X2J1ZltrXSA9IHRzcmMxW2tdIC0gdGRlbHRhMVtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSBpOyBqIDwgc2l6ZS5oZWlnaHQ7IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGRvdWJsZSBzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgY29uc3Qgc3JjdHlwZSAqdHNyYzIgPSBzcmMgKyBqKnNyY3N0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBjb25zdCBkc3R0eXBlICp0ZGVsdGEyID0gZGVsdGEgKyBqKmRlbHRhc3RlcDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCBkZWx0YV9jb2xzIDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgZGVsdGFfYnVmWzBdID0gZGVsdGFfYnVmWzFdID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGFfYnVmWzJdID0gZGVsdGFfYnVmWzNdID0gdGRlbHRhMlswXTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIHRkZWx0YTIgPSBkZWx0YV9idWY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPD0gc2l6ZS53aWR0aC00OyBrICs9IDQsIHRkZWx0YTIgKz0gZGVsdGFfc2hpZnQgKSBcCisgICAgICAgICAgICAgICAgICAgIHMgKz0gcm93X2J1ZltrXSoobG9hZF9tYWNybyh0c3JjMltrXSkgLSB0ZGVsdGEyWzBdKSArICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICByb3dfYnVmW2srMV0qKGxvYWRfbWFjcm8odHNyYzJbaysxXSkgLSB0ZGVsdGEyWzFdKSArICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJvd19idWZbaysyXSoobG9hZF9tYWNybyh0c3JjMltrKzJdKSAtIHRkZWx0YTJbMl0pICsgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcm93X2J1ZltrKzNdKihsb2FkX21hY3JvKHRzcmMyW2srM10pIC0gdGRlbHRhMlszXSk7ICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIDsgayA8IHNpemUud2lkdGg7IGsrKywgdGRlbHRhMisrICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBzICs9IHJvd19idWZba10qKGxvYWRfbWFjcm8odHNyYzJba10pIC0gdGRlbHRhMlswXSk7ICAgICAgICBcCisgICAgICAgICAgICAgICAgdGRzdFtqXSA9IChkc3R0eXBlKShzKnNjYWxlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHJvd19idWYgJiYgIWxvY2FsX2FsbG9jICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY3ZGcmVlKCAmcm93X2J1ZiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIGZpbGwgdGhlIGxvd2VyIHBhcnQgb2YgdGhlIGRlc3RpbmF0aW9uIG1hdHJpeCAqLyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBqID0gMDsgaiA8IHNpemUuaGVpZ2h0IC0gMTsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gajsgaSA8IHNpemUuaGVpZ2h0OyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0W2RzdHN0ZXAqaSArIGpdID0gZHN0W2RzdHN0ZXAqaiArIGldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfTk9fRVJSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfTVVMVFJBTlNfUl9GVU5DKCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl84VE8zMkYgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDh1NjRmLCB1Y2hhciwgZG91YmxlLCBDVl84VE8zMkYgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDMyZiwgZmxvYXQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDMyZjY0ZiwgZmxvYXQsIGRvdWJsZSwgQ1ZfTk9QICkKK0lDVl9ERUZfTVVMVFJBTlNfUl9GVU5DKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDE2dTMyZiwgdXNob3J0LCBmbG9hdCwgQ1ZfTk9QICkKK0lDVl9ERUZfTVVMVFJBTlNfUl9GVU5DKCAxNnU2NGYsIHVzaG9ydCwgZG91YmxlLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDE2czMyZiwgc2hvcnQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19SX0ZVTkMoIDE2czY0Ziwgc2hvcnQsIGRvdWJsZSwgQ1ZfTk9QICkKKworSUNWX0RFRl9NVUxUUkFOU19MX0ZVTkMoIDh1MzJmLCB1Y2hhciwgZmxvYXQsIENWXzhUTzMyRiApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggOHU2NGYsIHVjaGFyLCBkb3VibGUsIENWXzhUTzMyRiApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggMzJmLCBmbG9hdCwgZmxvYXQsIENWX05PUCApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggMzJmNjRmLCBmbG9hdCwgZG91YmxlLCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19MX0ZVTkMoIDY0ZiwgZG91YmxlLCBkb3VibGUsIENWX05PUCApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggMTZ1MzJmLCB1c2hvcnQsIGZsb2F0LCBDVl9OT1AgKQorSUNWX0RFRl9NVUxUUkFOU19MX0ZVTkMoIDE2dTY0ZiwgdXNob3J0LCBkb3VibGUsIENWX05PUCApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggMTZzMzJmLCBzaG9ydCwgZmxvYXQsIENWX05PUCApCitJQ1ZfREVGX01VTFRSQU5TX0xfRlVOQyggMTZzNjRmLCBzaG9ydCwgZG91YmxlLCBDVl9OT1AgKQorCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdk11bFRyYW5zcG9zZWRGdW5jKQorICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwKKyAgICAgIHZvaWQqIGRzdCwgaW50IGRzdHN0ZXAsIGNvbnN0IHZvaWQqIGRlbHRhLAorICAgICAgaW50IGRlbHRhc3RlcCwgQ3ZTaXplIHNpemUsIGludCBkZWx0YV9jb2xzLCBkb3VibGUgc2NhbGUgKTsKKworQ1ZfSU1QTCB2b2lkCitjdk11bFRyYW5zcG9zZWQoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsCisgICAgICAgICAgICAgICAgIGludCBvcmRlciwgY29uc3QgQ3ZBcnIqIGRlbHRhYXJyLCBkb3VibGUgc2NhbGUgKQoreworICAgIGNvbnN0IGludCBnZW1tX2xldmVsID0gMTAwOyAvLyBib3VuZGFyeSBhYm92ZSB3aGljaCBHRU1NIGlzIGZhc3Rlci4KKyAgICBDdk1hdCogc3JjMiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2TXVsVHJhbnNwb3NlZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHNzdHViLCAqc3JjID0gKEN2TWF0KilzcmNhcnI7CisgICAgQ3ZNYXQgZHN0dWIsICpkc3QgPSAoQ3ZNYXQqKWRzdGFycjsKKyAgICBDdk1hdCBkZWx0YXN0dWIsICpkZWx0YSA9IChDdk1hdCopZGVsdGFhcnI7CisgICAgaW50IHN0eXBlLCBkdHlwZTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMgKSkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjID0gY3ZHZXRNYXQoIHNyYywgJnNzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoIGRzdCApKQorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0dWIgKSk7CisKKyAgICBpZiggZGVsdGEgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoIGRlbHRhICkpCisgICAgICAgICAgICBDVl9DQUxMKCBkZWx0YSA9IGN2R2V0TWF0KCBkZWx0YSwgJmRlbHRhc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggZHN0LCBkZWx0YSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICAgICAgaWYoIChkZWx0YS0+cm93cyAhPSBzcmMtPnJvd3MgJiYgZGVsdGEtPnJvd3MgIT0gMSkgfHwKKyAgICAgICAgICAgIChkZWx0YS0+Y29scyAhPSBzcmMtPmNvbHMgJiYgZGVsdGEtPmNvbHMgIT0gMSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkZWx0YSA9ICZkZWx0YXN0dWI7CisgICAgICAgIGRlbHRhLT5kYXRhLnB0ciA9IDA7CisgICAgICAgIGRlbHRhLT5zdGVwID0gMDsKKyAgICAgICAgZGVsdGEtPnJvd3MgPSBkZWx0YS0+Y29scyA9IDA7CisgICAgfQorCisgICAgc3R5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisgICAgZHR5cGUgPSBDVl9NQVRfVFlQRSggZHN0LT50eXBlICk7CisKKyAgICBpZiggZHN0LT5yb3dzICE9IGRzdC0+Y29scyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiVGhlIGRlc3RpbmF0aW9uIG1hdHJpeCBtdXN0IGJlIHNxdWFyZSIgKTsKKworICAgIGlmKCAob3JkZXIgIT0gMCAmJiBzcmMtPmNvbHMgIT0gZHN0LT5jb2xzKSB8fAorICAgICAgICAob3JkZXIgPT0gMCAmJiBzcmMtPnJvd3MgIT0gZHN0LT5yb3dzKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoIHNyYy0+ZGF0YS5wdHIgPT0gZHN0LT5kYXRhLnB0ciB8fCAoc3R5cGUgPT0gZHR5cGUgJiYKKyAgICAgICAgKGRzdC0+Y29scyA+PSBnZW1tX2xldmVsICYmIGRzdC0+cm93cyA+PSBnZW1tX2xldmVsICYmCisgICAgICAgICBzcmMtPmNvbHMgPj0gZ2VtbV9sZXZlbCAmJiBzcmMtPnJvd3MgPj0gZ2VtbV9sZXZlbCkpKQorICAgIHsKKyAgICAgICAgaWYoIGRlbHRhYXJyICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggc3JjMiA9IGN2Q3JlYXRlTWF0KCBzcmMtPnJvd3MsIHNyYy0+Y29scywgc3JjLT50eXBlICkpOworICAgICAgICAgICAgY3ZSZXBlYXQoIGRlbHRhLCBzcmMyICk7CisgICAgICAgICAgICBjdlN1Yiggc3JjLCBzcmMyLCBzcmMyICk7CisgICAgICAgICAgICBzcmMgPSBzcmMyOworICAgICAgICB9CisgICAgICAgIGN2R0VNTSggc3JjLCBzcmMsIHNjYWxlLCAwLCAwLCBkc3QsIG9yZGVyID09IDAgPyBDVl9HRU1NX0JfVCA6IENWX0dFTU1fQV9UICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2TXVsVHJhbnNwb3NlZEZ1bmMgZnVuYyA9CisgICAgICAgICAgICBzdHlwZSA9PSBDVl84VSAmJiBkdHlwZSA9PSBDVl8zMkYgPworICAgICAgICAgICAgKG9yZGVyID8gKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZFJfOHUzMmYgOgorICAgICAgICAgICAgICAgICAgICAoQ3ZNdWxUcmFuc3Bvc2VkRnVuYylpY3ZNdWxUcmFuc3Bvc2VkTF84dTMyZikgOgorICAgICAgICAgICAgc3R5cGUgPT0gQ1ZfOFUgJiYgZHR5cGUgPT0gQ1ZfNjRGID8KKyAgICAgICAgICAgIChvcmRlciA/IChDdk11bFRyYW5zcG9zZWRGdW5jKWljdk11bFRyYW5zcG9zZWRSXzh1NjRmIDoKKyAgICAgICAgICAgICAgICAgICAgKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZExfOHU2NGYpIDoKKyAgICAgICAgICAgIHN0eXBlID09IENWXzE2VSAmJiBkdHlwZSA9PSBDVl8zMkYgPworICAgICAgICAgICAgKG9yZGVyID8gKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZFJfMTZ1MzJmIDoKKyAgICAgICAgICAgICAgICAgICAgKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZExfMTZ1MzJmKSA6CisgICAgICAgICAgICBzdHlwZSA9PSBDVl8xNlUgJiYgZHR5cGUgPT0gQ1ZfNjRGID8KKyAgICAgICAgICAgIChvcmRlciA/IChDdk11bFRyYW5zcG9zZWRGdW5jKWljdk11bFRyYW5zcG9zZWRSXzE2dTY0ZiA6CisgICAgICAgICAgICAgICAgICAgIChDdk11bFRyYW5zcG9zZWRGdW5jKWljdk11bFRyYW5zcG9zZWRMXzE2dTY0ZikgOgorICAgICAgICAgICAgc3R5cGUgPT0gQ1ZfMTZTICYmIGR0eXBlID09IENWXzMyRiA/CisgICAgICAgICAgICAob3JkZXIgPyAoQ3ZNdWxUcmFuc3Bvc2VkRnVuYylpY3ZNdWxUcmFuc3Bvc2VkUl8xNnMzMmYgOgorICAgICAgICAgICAgICAgICAgICAoQ3ZNdWxUcmFuc3Bvc2VkRnVuYylpY3ZNdWxUcmFuc3Bvc2VkTF8xNnMzMmYpIDoKKyAgICAgICAgICAgIHN0eXBlID09IENWXzE2UyAmJiBkdHlwZSA9PSBDVl82NEYgPworICAgICAgICAgICAgKG9yZGVyID8gKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZFJfMTZzNjRmIDoKKyAgICAgICAgICAgICAgICAgICAgKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZExfMTZzNjRmKSA6CisgICAgICAgICAgICBzdHlwZSA9PSBDVl8zMkYgJiYgZHR5cGUgPT0gQ1ZfMzJGID8KKyAgICAgICAgICAgIChvcmRlciA/IChDdk11bFRyYW5zcG9zZWRGdW5jKWljdk11bFRyYW5zcG9zZWRSXzMyZiA6CisgICAgICAgICAgICAgICAgICAgIChDdk11bFRyYW5zcG9zZWRGdW5jKWljdk11bFRyYW5zcG9zZWRMXzMyZikgOgorICAgICAgICAgICAgc3R5cGUgPT0gQ1ZfMzJGICYmIGR0eXBlID09IENWXzY0RiA/CisgICAgICAgICAgICAob3JkZXIgPyAoQ3ZNdWxUcmFuc3Bvc2VkRnVuYylpY3ZNdWxUcmFuc3Bvc2VkUl8zMmY2NGYgOgorICAgICAgICAgICAgICAgICAgICAoQ3ZNdWxUcmFuc3Bvc2VkRnVuYylpY3ZNdWxUcmFuc3Bvc2VkTF8zMmY2NGYpIDoKKyAgICAgICAgICAgIHN0eXBlID09IENWXzY0RiAmJiBkdHlwZSA9PSBDVl82NEYgPworICAgICAgICAgICAgKG9yZGVyID8gKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZFJfNjRmIDoKKyAgICAgICAgICAgICAgICAgICAgKEN2TXVsVHJhbnNwb3NlZEZ1bmMpaWN2TXVsVHJhbnNwb3NlZExfNjRmKSA6IDA7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhLT5kYXRhLnB0ciwgZGVsdGEtPnN0ZXAsIGN2R2V0TWF0U2l6ZSggc3JjICksCisgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEtPmNvbHMsIHNjYWxlICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggc3JjMiApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJnNyYzIgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZEb3RQcm9kdWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0RFRl9ET1RfUFJPRF9GVU5DXzJEKCBmbGF2b3IsIGFycnR5cGUsIHRlbXB0eXBlLCBzdW10eXBlICkgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkRvdFByb2R1Y3RfIyNmbGF2b3IjI19DMVIoIGNvbnN0IGFycnR5cGUqIHNyYzEsIGludCBzdGVwMSwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBzdW10eXBlKiBfc3VtICkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdW10eXBlIHN1bSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7IHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiApICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzaXplLndpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIHQwID0gKHRlbXB0eXBlKXNyYzFbaV0qc3JjMltpXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXB0eXBlIHQxID0gKHRlbXB0eXBlKXNyYzFbaSsxXSpzcmMyW2krMV07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwICs9ICh0ZW1wdHlwZSlzcmMxW2krMl0qc3JjMltpKzJdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxICs9ICh0ZW1wdHlwZSlzcmMxW2krM10qc3JjMltpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1bSArPSB0MCArIHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHN1bSArPSAodGVtcHR5cGUpc3JjMVtpXSpzcmMyW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX3N1bSA9IHN1bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX0RPVF9QUk9EX0ZVTkNfMkQoIDh1LCB1Y2hhciwgaW50LCBpbnQ2NCApCitJQ1ZfREVGX0RPVF9QUk9EX0ZVTkNfMkQoIDE2dSwgdXNob3J0LCBpbnQ2NCwgaW50NjQgKQorSUNWX0RFRl9ET1RfUFJPRF9GVU5DXzJEKCAxNnMsIHNob3J0LCBpbnQ2NCwgaW50NjQgKQorSUNWX0RFRl9ET1RfUFJPRF9GVU5DXzJEKCAzMnMsIGludCwgZG91YmxlLCBkb3VibGUgKQorSUNWX0RFRl9ET1RfUFJPRF9GVU5DXzJEKCAzMmYsIGZsb2F0LCBkb3VibGUsIGRvdWJsZSApCitJQ1ZfREVGX0RPVF9QUk9EX0ZVTkNfMkQoIDY0ZiwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSApCisKKyNkZWZpbmUgaWN2RG90UHJvZHVjdF84c19DMVIgMAorCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggRG90UHJvZHVjdCwgQzFSICkKKworQ1ZfSU1QTCBkb3VibGUKK2N2RG90UHJvZHVjdCggY29uc3QgQ3ZBcnIqIHNyY0FhcnIsIGNvbnN0IEN2QXJyKiBzcmNCYXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgdGFiXzJkOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDdjY0c3VmIHJlc3VsdDsKKyAgICByZXN1bHQuZiA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkRvdFByb2R1Y3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViQSwgKnNyY0EgPSAoQ3ZNYXQqKXNyY0FhcnI7CisgICAgQ3ZNYXQgc3R1YkIsICpzcmNCID0gKEN2TWF0KilzcmNCYXJyOworICAgIEN2U2l6ZSBzaXplOworICAgIGludCB0eXBlLCBkZXB0aDsKKyAgICBDdkZ1bmMyRF8yQTFQIGZ1bmM7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdERvdFByb2R1Y3RDMVJUYWJsZSggJnRhYl8yZCApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVCggc3JjQSApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIHNyY0EgPSBjdkdldE1hdCggc3JjQSwgJnN0dWJBLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgImNvaSBpcyBub3Qgc3VwcG9ydGVkIiApOworICAgIH0KKworICAgIGlmKCBzcmNCYXJyID09IHNyY0FhcnIgKQorICAgICAgICBzcmNCID0gc3JjQTsgCisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoIHNyY0IgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgICAgICBDVl9DQUxMKCBzcmNCID0gY3ZHZXRNYXQoIHNyY0IsICZzdHViQiwgJmNvaSApKTsKKworICAgICAgICAgICAgaWYoIGNvaSAhPSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjQSwgc3JjQiApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHNyY0EsIHNyY0IgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKyAgICB9CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyY0EtPnR5cGUgKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmNBICk7CisKKyAgICBzaXplLndpZHRoICo9IENWX01BVF9DTiggdHlwZSApOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKCB0eXBlICk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIHNyY0EtPnR5cGUgJiBzcmNCLT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworCisgICAgICAgIGlmKCBzaXplLndpZHRoIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfMzJGICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCogbUEgPSBzcmNBLT5kYXRhLmZsOworICAgICAgICAgICAgICAgIGZsb2F0KiBtQiA9IHNyY0ItPmRhdGEuZmw7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IChkb3VibGUpbUFbc2l6ZS53aWR0aCAtIDFdKm1CW3NpemUud2lkdGggLSAxXTsKKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmYgPSBzdW07CisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGRlcHRoID09IENWXzY0RiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtQSA9IHNyY0EtPmRhdGEuZGI7CisgICAgICAgICAgICAgICAgZG91YmxlKiBtQiA9IHNyY0ItPmRhdGEuZGI7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IG1BW3NpemUud2lkdGggLSAxXSptQltzaXplLndpZHRoIC0gMV07CisgICAgICAgICAgICAgICAgd2hpbGUoIC0tc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgIHJlc3VsdC5mID0gc3VtOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIGZ1bmMgPSAoQ3ZGdW5jMkRfMkExUCkodGFiXzJkLmZuXzJkW2RlcHRoXSk7CisgICAgaWYoICFmdW5jICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgSVBQSV9DQUxMKCBmdW5jKCBzcmNBLT5kYXRhLnB0ciwgc3JjQS0+c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgIHNyY0ItPmRhdGEucHRyLCBzcmNCLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJnJlc3VsdCApKTsKKworICAgIGlmKCBkZXB0aCA8IENWXzMyUyApCisgICAgICAgIHJlc3VsdC5mID0gKGRvdWJsZSlyZXN1bHQuaTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0LmY7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeG1hdHJpeC5jcHAgYi9jeGNvcmUvc3JjL2N4bWF0cml4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTU5NDI4Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeG1hdHJpeC5jcHAKQEAgLTAsMCArMSwyMDA2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NjYWxlZF0gSWRlbnRpdHkgbWF0cml4IGluaXRpYWxpemF0aW9uICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2U2V0SWRlbnRpdHkoIEN2QXJyKiBhcnJheSwgQ3ZTY2FsYXIgdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTZXRJZGVudGl0eSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycmF5OworICAgIEN2U2l6ZSBzaXplOworICAgIGludCBpLCBrLCBsZW4sIHN0ZXA7CisgICAgaW50IHR5cGUsIHBpeF9zaXplOworICAgIHVjaGFyKiBkYXRhID0gMDsKKyAgICBkb3VibGUgYnVmWzRdOworCisgICAgaWYoICFDVl9JU19NQVQoIG1hdCApKQorICAgIHsKKyAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgImNvaSBpcyBub3Qgc3VwcG9ydGVkIiApOworICAgIH0KKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworICAgIGxlbiA9IENWX0lNSU4oIHNpemUud2lkdGgsIHNpemUuaGVpZ2h0ICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKyAgICBzaXplLndpZHRoICo9IHBpeF9zaXplOworCisgICAgaWYoIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgKSkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBkYXRhID0gbWF0LT5kYXRhLnB0cjsKKyAgICBzdGVwID0gbWF0LT5zdGVwOworICAgIGlmKCBzdGVwID09IDAgKQorICAgICAgICBzdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgIElQUElfQ0FMTCggaWN2U2V0WmVyb184dV9DMVIoIGRhdGEsIHN0ZXAsIHNpemUgKSk7CisgICAgc3RlcCArPSBwaXhfc2l6ZTsKKworICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICB7CisgICAgICAgIGZsb2F0IHZhbCA9IChmbG9hdCl2YWx1ZS52YWxbMF07CisgICAgICAgIGZsb2F0KiBfZGF0YSA9IChmbG9hdCopZGF0YTsKKyAgICAgICAgc3RlcCAvPSBzaXplb2YoX2RhdGFbMF0pOworICAgICAgICBsZW4gKj0gc3RlcDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpICs9IHN0ZXAgKQorICAgICAgICAgICAgX2RhdGFbaV0gPSB2YWw7CisgICAgfQorICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfNjRGQzEgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHZhbCA9IHZhbHVlLnZhbFswXTsKKyAgICAgICAgZG91YmxlKiBfZGF0YSA9IChkb3VibGUqKWRhdGE7CisgICAgICAgIHN0ZXAgLz0gc2l6ZW9mKF9kYXRhWzBdKTsKKyAgICAgICAgbGVuICo9IHN0ZXA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSArPSBzdGVwICkKKyAgICAgICAgICAgIF9kYXRhW2ldID0gdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1Y2hhciogdmFsX3B0ciA9ICh1Y2hhciopYnVmOworICAgICAgICBjdlNjYWxhclRvUmF3RGF0YSggJnZhbHVlLCBidWYsIHR5cGUsIDAgKTsKKyAgICAgICAgbGVuICo9IHN0ZXA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSArPSBzdGVwICkKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBwaXhfc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICBkYXRhW2kra10gPSB2YWxfcHRyW2tdOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhY2Ugb2YgdGhlIG1hdHJpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIEN2U2NhbGFyCitjdlRyYWNlKCBjb25zdCBDdkFyciogYXJyYXkgKQoreworICAgIEN2U2NhbGFyIHN1bSA9IHt7MCwwLDAsMH19OworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZUcmFjZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAwOworCisgICAgaWYoIENWX0lTX01BVCggYXJyYXkgKSkKKyAgICB7CisgICAgICAgIG1hdCA9IChDdk1hdCopYXJyYXk7CisgICAgICAgIGludCB0eXBlID0gQ1ZfTUFUX1RZUEUobWF0LT50eXBlKTsKKyAgICAgICAgaW50IHNpemUgPSBNSU4obWF0LT5yb3dzLG1hdC0+Y29scyk7CisgICAgICAgIHVjaGFyKiBkYXRhID0gbWF0LT5kYXRhLnB0cjsKKworICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdGVwID0gbWF0LT5zdGVwICsgc2l6ZW9mKGZsb2F0KTsKKworICAgICAgICAgICAgZm9yKCA7IHNpemUtLTsgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICBzdW0udmFsWzBdICs9ICooZmxvYXQqKWRhdGE7CisgICAgICAgICAgICBFWElUOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiggdHlwZSA9PSBDVl82NEZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdGVwID0gbWF0LT5zdGVwICsgc2l6ZW9mKGRvdWJsZSk7CisKKyAgICAgICAgICAgIGZvciggOyBzaXplLS07IGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICAgICAgc3VtLnZhbFswXSArPSAqKGRvdWJsZSopZGF0YTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkdldERpYWcoIGFycmF5LCAmc3R1YiApKTsKKyAgICBDVl9DQUxMKCBzdW0gPSBjdlN1bSggbWF0ICkpOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzdW07Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdHJpeCB0cmFuc3Bvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vIG1hY3JvcyBmb3IgaW5wbGFjZSB0cmFuc3Bvc2l0aW9uIG9mIHNxdWFyZSBtYXRyaXggLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJQ1ZfREVGX1RSQU5TUF9JTlBfQ0FTRV9DMSggXAorICAgIGFycnR5cGUsIGxlbiApICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGUqIGFycjEgPSBhcnI7ICAgICAgICAgICAgXAorICAgIHN0ZXAgLz0gc2l6ZW9mKGFyclswXSk7ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlKCAtLWxlbiApICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnIgKz0gc3RlcCwgYXJyMSsrOyAgICAgICAgXAorICAgICAgICBhcnJ0eXBlKiBhcnIyID0gYXJyOyAgICAgICAgXAorICAgICAgICBhcnJ0eXBlKiBhcnIzID0gYXJyMTsgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkbyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJydHlwZSB0MCA9IGFycjJbMF07ICAgXAorICAgICAgICAgICAgYXJydHlwZSB0MSA9IGFycjNbMF07ICAgXAorICAgICAgICAgICAgYXJyMlswXSA9IHQxOyAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyM1swXSA9IHQwOyAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyMisrOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyMyArPSBzdGVwOyAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggYXJyMiAhPSBhcnIzICApOyAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9UUkFOU1BfSU5QX0NBU0VfQzMoIFwKKyAgICBhcnJ0eXBlLCBsZW4gKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlKiBhcnIxID0gYXJyOyAgICAgICAgICAgIFwKKyAgICBpbnQgeTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihhcnJbMF0pOyAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIHkgPSAxOyB5IDwgbGVuOyB5KysgKSAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJyICs9IHN0ZXAsIGFycjEgKz0gMzsgICAgIFwKKyAgICAgICAgYXJydHlwZSogYXJyMiA9IGFycjsgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSogYXJyMyA9IGFycjE7ICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGFycjIhPWFycjM7IGFycjIrPTMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycjMrPXN0ZXAgKVwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDAgPSBhcnIyWzBdOyAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDEgPSBhcnIzWzBdOyAgIFwKKyAgICAgICAgICAgIGFycjJbMF0gPSB0MTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycjNbMF0gPSB0MDsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gYXJyMlsxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gYXJyM1sxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycjJbMV0gPSB0MTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycjNbMV0gPSB0MDsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gYXJyMlsyXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gYXJyM1syXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycjJbMl0gPSB0MTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycjNbMl0gPSB0MDsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfVFJBTlNQX0lOUF9DQVNFX0M0KCBcCisgICAgYXJydHlwZSwgbGVuICkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSogYXJyMSA9IGFycjsgICAgICAgICAgICBcCisgICAgaW50IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2YoYXJyWzBdKTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCB5ID0gMTsgeSA8IGxlbjsgeSsrICkgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFyciArPSBzdGVwLCBhcnIxICs9IDQ7ICAgICBcCisgICAgICAgIGFycnR5cGUqIGFycjIgPSBhcnI7ICAgICAgICBcCisgICAgICAgIGFycnR5cGUqIGFycjMgPSBhcnIxOyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggOyBhcnIyIT1hcnIzOyBhcnIyKz00LCBcCisgICAgICAgICAgICAgICAgICAgICAgICBhcnIzKz1zdGVwIClcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQwID0gYXJyMlswXTsgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQxID0gYXJyM1swXTsgICBcCisgICAgICAgICAgICBhcnIyWzBdID0gdDE7ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIzWzBdID0gdDA7ICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IGFycjJbMV07ICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IGFycjNbMV07ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIyWzFdID0gdDE7ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIzWzFdID0gdDA7ICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IGFycjJbMl07ICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IGFycjNbMl07ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIyWzJdID0gdDE7ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIzWzJdID0gdDA7ICAgICAgICAgICBcCisgICAgICAgICAgICB0MCA9IGFycjJbM107ICAgICAgICAgICBcCisgICAgICAgICAgICB0MSA9IGFycjNbM107ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIyWzNdID0gdDE7ICAgICAgICAgICBcCisgICAgICAgICAgICBhcnIzWzNdID0gdDA7ICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLy8vLy8vLy8vLy8vLy8vLyBtYWNyb3MgZm9yIG5vbi1pbnBsYWNlIHRyYW5zcG9zaXRpb24gb2YgcmVjdGFuZ3VsYXIgbWF0cml4IC8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX0RFRl9UUkFOU1BfQ0FTRV9DMSggYXJydHlwZSApICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgeCwgeTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIHkgPSAwOyB5IDw9IHNpemUuaGVpZ2h0IC0gMjsgeSArPSAyLCAgIFwKKyAgICAgICAgICAgICAgICBzcmMgKz0gMipzcmNzdGVwLCBkc3QgKz0gMiApICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgYXJydHlwZSogc3JjMSA9IHNyYyArIHNyY3N0ZXA7ICAgIFwKKyAgICAgICAgYXJydHlwZSogZHN0MSA9IGRzdDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gMjsgICAgICAgIFwKKyAgICAgICAgICAgICAgICB4ICs9IDIsIGRzdDEgKz0gZHN0c3RlcCApICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDAgPSBzcmNbeF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDEgPSBzcmMxW3hdOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDEgKz0gZHN0c3RlcDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gc3JjW3ggKyAxXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gc3JjMVt4ICsgMV07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDAgPSBzcmNbeF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDEgPSBzcmMxW3hdOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggeSA8IHNpemUuaGVpZ2h0ICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSogZHN0MSA9IGRzdDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCB4ID0gMDsgeCA8PSBzaXplLndpZHRoIC0gMjsgICAgICAgIFwKKyAgICAgICAgICAgICAgICB4ICs9IDIsIGRzdDEgKz0gMipkc3RzdGVwICkgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDAgPSBzcmNbeF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDEgPSBzcmNbeCArIDFdOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbZHN0c3RlcF0gPSB0MTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycnR5cGUgdDAgPSBzcmNbeF07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdDFbMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfVFJBTlNQX0NBU0VfQzMoIGFycnR5cGUgKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc2l6ZS53aWR0aCAqPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYys9c3Jjc3RlcCwgZHN0Kz0zIClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFycnR5cGUqIGRzdDEgPSBkc3Q7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggeCA9IDA7IHggPCBzaXplLndpZHRoOyB4ICs9IDMsICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0MSArPSBkc3RzdGVwICkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQwID0gc3JjW3hdOyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQxID0gc3JjW3ggKyAxXTsgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlIHQyID0gc3JjW3ggKyAyXTsgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3QxWzBdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3QxWzFdID0gdDE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3QxWzJdID0gdDI7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX1RSQU5TUF9DQVNFX0M0KCBhcnJ0eXBlICkgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMrPXNyY3N0ZXAsIGRzdCs9NCApXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBhcnJ0eXBlKiBkc3QxID0gZHN0OyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDwgc2l6ZS53aWR0aDsgeCArPSA0LCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdDEgKz0gZHN0c3RlcCApICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJydHlwZSB0MCA9IHNyY1t4XTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJydHlwZSB0MSA9IHNyY1t4ICsgMV07ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0MVswXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0MVsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbeCArIDJdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEgPSBzcmNbeCArIDNdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0MVsyXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZHN0MVszXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgY24gKSAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlRyYW5zcG9zZV8jI2ZsYXZvciggYXJydHlwZSogYXJyLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhc3NlcnQoIHNpemUud2lkdGggPT0gc2l6ZS5oZWlnaHQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfREVGX1RSQU5TUF9JTlBfQ0FTRV9DIyNjbiggYXJydHlwZSwgc2l6ZS53aWR0aCApICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfVFJBTlNQX0ZVTkMoIGZsYXZvciwgYXJydHlwZSwgY24gKSAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZUcmFuc3Bvc2VfIyNmbGF2b3IoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplIClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX0RFRl9UUkFOU1BfQ0FTRV9DIyNjbiggYXJydHlwZSApICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIDh1X0MxSVIsIHVjaGFyLCAxICkKK0lDVl9ERUZfVFJBTlNQX0lOUF9GVU5DKCA4dV9DMklSLCB1c2hvcnQsIDEgKQorSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIDh1X0MzSVIsIHVjaGFyLCAzICkKK0lDVl9ERUZfVFJBTlNQX0lOUF9GVU5DKCAxNnVfQzJJUiwgaW50LCAxICkKK0lDVl9ERUZfVFJBTlNQX0lOUF9GVU5DKCAxNnVfQzNJUiwgdXNob3J0LCAzICkKK0lDVl9ERUZfVFJBTlNQX0lOUF9GVU5DKCAzMnNfQzJJUiwgaW50NjQsIDEgKQorSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIDMyc19DM0lSLCBpbnQsIDMgKQorSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIDY0c19DMklSLCBpbnQsIDQgKQorSUNWX0RFRl9UUkFOU1BfSU5QX0ZVTkMoIDY0c19DM0lSLCBpbnQ2NCwgMyApCitJQ1ZfREVGX1RSQU5TUF9JTlBfRlVOQyggNjRzX0M0SVIsIGludDY0LCA0ICkKKworCitJQ1ZfREVGX1RSQU5TUF9GVU5DKCA4dV9DMVIsIHVjaGFyLCAxICkKK0lDVl9ERUZfVFJBTlNQX0ZVTkMoIDh1X0MyUiwgdXNob3J0LCAxICkKK0lDVl9ERUZfVFJBTlNQX0ZVTkMoIDh1X0MzUiwgdWNoYXIsIDMgKQorSUNWX0RFRl9UUkFOU1BfRlVOQyggMTZ1X0MyUiwgaW50LCAxICkKK0lDVl9ERUZfVFJBTlNQX0ZVTkMoIDE2dV9DM1IsIHVzaG9ydCwgMyApCitJQ1ZfREVGX1RSQU5TUF9GVU5DKCAzMnNfQzJSLCBpbnQ2NCwgMSApCitJQ1ZfREVGX1RSQU5TUF9GVU5DKCAzMnNfQzNSLCBpbnQsIDMgKQorSUNWX0RFRl9UUkFOU1BfRlVOQyggNjRzX0MyUiwgaW50LCA0ICkKK0lDVl9ERUZfVFJBTlNQX0ZVTkMoIDY0c19DM1IsIGludDY0LCAzICkKK0lDVl9ERUZfVFJBTlNQX0ZVTkMoIDY0c19DNFIsIGludDY0LCA0ICkKKworQ1ZfREVGX0lOSVRfUElYU0laRV9UQUJfMkQoIFRyYW5zcG9zZSwgUiApCitDVl9ERUZfSU5JVF9QSVhTSVpFX1RBQl8yRCggVHJhbnNwb3NlLCBJUiApCisKK0NWX0lNUEwgdm9pZAorY3ZUcmFuc3Bvc2UoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIgKQoreworICAgIHN0YXRpYyBDdkJ0RnVuY1RhYmxlIHRhYiwgaW5wX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZUcmFuc3Bvc2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzc3R1YiwgKnNyYyA9IChDdk1hdCopc3JjYXJyOworICAgIEN2TWF0IGRzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgQ3ZTaXplIHNpemU7CisgICAgaW50IHR5cGUsIHBpeF9zaXplOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRUcmFuc3Bvc2VJUlRhYmxlKCAmaW5wX3RhYiApOworICAgICAgICBpY3ZJbml0VHJhbnNwb3NlUlRhYmxlKCAmdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMgKSkKKyAgICB7CisgICAgICAgIGludCBjb2kgPSAwOworICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3N0dWIsICZjb2kgKSk7CisgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgfQorCisgICAgdHlwZSA9IENWX01BVF9UWVBFKCBzcmMtPnR5cGUgKTsKKyAgICBwaXhfc2l6ZSA9IENWX0VMRU1fU0laRSh0eXBlKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKworICAgIGlmKCBkc3RhcnIgPT0gc3JjYXJyICkKKyAgICB7CisgICAgICAgIGRzdCA9IHNyYzsgCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKCBkc3QgKSkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvaSA9IDA7CisgICAgICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0dWIsICZjb2kgKSk7CisKKyAgICAgICAgICAgIGlmKCBjb2kgIT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkQ09JLCAiY29pIGlzIG5vdCBzdXBwb3J0ZWQiICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgICAgIGlmKCBzaXplLndpZHRoICE9IGRzdC0+aGVpZ2h0IHx8IHNpemUuaGVpZ2h0ICE9IGRzdC0+d2lkdGggKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgIH0KKworICAgIGlmKCBzcmMtPmRhdGEucHRyID09IGRzdC0+ZGF0YS5wdHIgKQorICAgIHsKKyAgICAgICAgaWYoIHNpemUud2lkdGggPT0gc2l6ZS5oZWlnaHQgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRF8xQSBmdW5jID0gKEN2RnVuYzJEXzFBKShpbnBfdGFiLmZuXzJkW3BpeF9zaXplXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIHNyYy0+ZGF0YS5wdHIsIHNyYy0+c3RlcCwgc2l6ZSApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzaXplLndpZHRoICE9IDEgJiYgc2l6ZS5oZWlnaHQgIT0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICJSZWN0YW5ndWxhciBtYXRyaXggY2FuIG5vdCBiZSB0cmFuc3Bvc2VkIGlucGxhY2UiICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCAhQ1ZfSVNfTUFUX0NPTlQoIHNyYy0+dHlwZSAmIGRzdC0+dHlwZSApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiSW4gY2FzZSBvZiBpbnBsYWNlIGNvbHVtbi9yb3cgdHJhbnNwb3NpdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG11c3QgYmUgY29udGludW91cyIgKTsKKworICAgICAgICAgICAgaWYoIGRzdCA9PSBzcmMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgICAgIENWX1NXQVAoIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0LCB0ICk7CisgICAgICAgICAgICAgICAgZHN0LT5zdGVwID0gZHN0LT5oZWlnaHQgPT0gMSA/IDAgOiBwaXhfc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkZ1bmMyRF8yQSBmdW5jID0gKEN2RnVuYzJEXzJBKSh0YWIuZm5fMmRbcGl4X3NpemVdKTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwgc2l6ZSApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVIGRlY29tcG9zaXRpb24vYmFjayBzdWJzdGl0dXRpb24gICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCB2b2lkCitjdkNvbXBsZXRlU3ltbSggQ3ZNYXQqIG1hdHJpeCwgaW50IEx0b1IgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDb21wbGV0ZVN5bW0iICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgaW50IGksIGosIG5yb3dzOworICAgIAorICAgIENWX0FTU0VSVCggQ1ZfSVNfTUFUKG1hdHJpeCkgJiYgbWF0cml4LT5yb3dzID09IG1hdHJpeC0+Y29scyApOworCisgICAgbnJvd3MgPSBtYXRyaXgtPnJvd3M7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUobWF0cml4LT50eXBlKSA9PSBDVl8zMkZDMSB8fCBDVl9NQVRfVFlQRShtYXRyaXgtPnR5cGUpID09IENWXzMyU0MxICkKKyAgICB7CisgICAgICAgIGludCogZGF0YSA9IG1hdHJpeC0+ZGF0YS5pOworICAgICAgICBpbnQgc3RlcCA9IG1hdHJpeC0+c3RlcC9zaXplb2YoZGF0YVswXSk7CisgICAgICAgIGludCBqMCA9IDAsIGoxID0gbnJvd3M7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBucm93czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFMdG9SICkgajEgPSBpOyBlbHNlIGowID0gaSsxOworICAgICAgICAgICAgZm9yKCBqID0gajA7IGogPCBqMTsgaisrICkKKyAgICAgICAgICAgICAgICBkYXRhW2kqc3RlcCArIGpdID0gZGF0YVtqKnN0ZXAgKyBpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBDVl9NQVRfVFlQRShtYXRyaXgtPnR5cGUpID09IENWXzY0RkMxICkKKyAgICB7CisgICAgICAgIGRvdWJsZSogZGF0YSA9IG1hdHJpeC0+ZGF0YS5kYjsKKyAgICAgICAgaW50IHN0ZXAgPSBtYXRyaXgtPnN0ZXAvc2l6ZW9mKGRhdGFbMF0pOworICAgICAgICBpbnQgajAgPSAwLCBqMSA9IG5yb3dzOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnJvd3M7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhTHRvUiApIGoxID0gaTsgZWxzZSBqMCA9IGkrMTsKKyAgICAgICAgICAgIGZvciggaiA9IGowOyBqIDwgajE7IGorKyApCisgICAgICAgICAgICAgICAgZGF0YVtpKnN0ZXAgKyBqXSA9IGRhdGFbaipzdGVwICsgaV07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisKKyAgICBfX0VORF9fOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExVIGRlY29tcG9zaXRpb24vYmFjayBzdWJzdGl0dXRpb24gICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBhcnJ0eXBlIGZsb2F0CisjZGVmaW5lIHRlbXB0eXBlIGRvdWJsZQorCit0eXBlZGVmICBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2TFVEZWNvbXBGdW5jKSggZG91YmxlKiBBLCBpbnQgc3RlcEEsIEN2U2l6ZSBzaXplQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBCLCBpbnQgc3RlcEIsIEN2U2l6ZSBzaXplQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGRldCApOworCit0eXBlZGVmICBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2TFVCYWNrRnVuYykoIGRvdWJsZSogQSwgaW50IHN0ZXBBLCBDdlNpemUgc2l6ZUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIEIsIGludCBzdGVwQiwgQ3ZTaXplIHNpemVCICk7CisKKworI2RlZmluZSBJQ1ZfREVGX0xVX0RFQ09NUF9GVU5DKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdkxVRGVjb21wXyMjZmxhdm9yKCBkb3VibGUqIEEsIGludCBzdGVwQSwgQ3ZTaXplIHNpemVBLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIEIsIGludCBzdGVwQiwgQ3ZTaXplIHNpemVCLCBkb3VibGUqIF9kZXQgKSAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbiA9IHNpemVBLndpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBtID0gMCwgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlIGRldCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggc2l6ZUEud2lkdGggPT0gc2l6ZUEuaGVpZ2h0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggQiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGFzc2VydCggc2l6ZUEuaGVpZ2h0ID09IHNpemVCLmhlaWdodCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbSA9IHNpemVCLndpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcEEgLz0gc2l6ZW9mKEFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwQiAvPSBzaXplb2YoQlswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKywgQSArPSBzdGVwQSwgQiArPSBzdGVwQiApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaiwgayA9IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSogdEEgPSBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSogdEIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUga3ZhbCA9IGZhYnMoQVtpXSksIHR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogZmluZCB0aGUgcGl2b3QgZWxlbWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGogPSBpICsgMTsgaiA8IG47IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRBICs9IHN0ZXBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdHZhbCA9IGZhYnModEFbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCB0dmFsID4ga3ZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAga3ZhbCA9IHR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBrID0gajsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZigga3ZhbCA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRldCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiBzd2FwIHJvd3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBrICE9IGkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdEEgPSBBICsgc3RlcEEqKGsgLSBpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkZXQgPSAtZGV0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yKCBqID0gaTsgaiA8IG47IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBkb3VibGUgdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIENWX1NXQVAoIEFbal0sIHRBW2pdLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIG0gPiAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0QiA9IEIgKyBzdGVwQiooayAtIGkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlIHQgPSBCW2pdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIEJbal0sIHRCW2pdLCB0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0dmFsID0gMS4vQVtpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRldCAqPSBBW2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdEEgPSBBOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0QiA9IEI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFbaV0gPSB0dmFsOyAvKiB0byByZXBsYWNlIGRpdmlzaW9uIHdpdGggbXVsdGlwbGljYXRpb24gaW4gTFVCYWNrICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKiB1cGRhdGUgbWF0cml4IGFuZCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc3lzdGVtICovICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgbjsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdEEgKz0gc3RlcEE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0QiArPSBzdGVwQjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IC10QVtpXSp0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSBpICsgMTsgayA8IG47IGsrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0QVtrXSA9IHRBW2tdICsgYWxwaGEqQVtrXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbSA+IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB0QltrXSA9IChhcnJ0eXBlKSh0QltrXSArIGFscGhhKkJba10pOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIF9kZXQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKl9kZXQgPSBkZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCitJQ1ZfREVGX0xVX0RFQ09NUF9GVU5DKCAzMmYsIGZsb2F0ICkKK0lDVl9ERUZfTFVfREVDT01QX0ZVTkMoIDY0ZiwgZG91YmxlICkKKworCisjZGVmaW5lIElDVl9ERUZfTFVfQkFDS19GVU5DKCBmbGF2b3IsIGFycnR5cGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TFVCYWNrXyMjZmxhdm9yKCBkb3VibGUqIEEsIGludCBzdGVwQSwgQ3ZTaXplIHNpemVBLCAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGFycnR5cGUqIEIsIGludCBzdGVwQiwgQ3ZTaXplIHNpemVCICkgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBuID0gc2l6ZUEud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG0gPSBzaXplQi53aWR0aCwgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydCggbSA+IDAgJiYgc2l6ZUEud2lkdGggPT0gc2l6ZUEuaGVpZ2h0ICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplQS5oZWlnaHQgPT0gc2l6ZUIuaGVpZ2h0ICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwQSAvPSBzaXplb2YoQVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXBCIC89IHNpemVvZihCWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBICs9IHN0ZXBBKihuIC0gMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEIgKz0gc3RlcEIqKG4gLSAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGkgPSBuIC0gMTsgaSA+PSAwOyBpLS0sIEEgLT0gc3RlcEEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBqLCBrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhcnJ0eXBlKiB0QiA9IEIgKyBqOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRvdWJsZSB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGsgPSBuIC0gMTsgayA+IGk7IGstLSwgdEIgLT0gc3RlcEIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB4ICs9IEFba10qdEJbMF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0QlswXSA9IChhcnJ0eXBlKSgodEJbMF0gLSB4KSpBW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9ERUZfTFVfQkFDS19GVU5DKCAzMmYsIGZsb2F0ICkKK0lDVl9ERUZfTFVfQkFDS19GVU5DKCA2NGYsIGRvdWJsZSApCisKK3N0YXRpYyBDdkZ1bmNUYWJsZSBsdV9kZWNvbXBfdGFiLCBsdV9iYWNrX3RhYjsKK3N0YXRpYyBpbnQgbHVfaW5pdHRhYiA9IDA7CisKK3N0YXRpYyB2b2lkIGljdkluaXRMVVRhYmxlKCBDdkZ1bmNUYWJsZSogZGVjb21wX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkZ1bmNUYWJsZSogYmFja190YWIgKQoreworICAgIGRlY29tcF90YWItPmZuXzJkWzBdID0gKHZvaWQqKWljdkxVRGVjb21wXzMyZjsKKyAgICBkZWNvbXBfdGFiLT5mbl8yZFsxXSA9ICh2b2lkKilpY3ZMVURlY29tcF82NGY7CisgICAgYmFja190YWItPmZuXzJkWzBdID0gKHZvaWQqKWljdkxVQmFja18zMmY7CisgICAgYmFja190YWItPmZuXzJkWzFdID0gKHZvaWQqKWljdkxVQmFja182NGY7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXRlcm1pbmFudCBvZiB0aGUgbWF0cml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgZGV0MihtKSAgIChtKDAsMCkqbSgxLDEpIC0gbSgwLDEpKm0oMSwwKSkKKyNkZWZpbmUgZGV0MyhtKSAgIChtKDAsMCkqKG0oMSwxKSptKDIsMikgLSBtKDEsMikqbSgyLDEpKSAtICBcCisgICAgICAgICAgICAgICAgICAgbSgwLDEpKihtKDEsMCkqbSgyLDIpIC0gbSgxLDIpKm0oMiwwKSkgKyAgXAorICAgICAgICAgICAgICAgICAgIG0oMCwyKSoobSgxLDApKm0oMiwxKSAtIG0oMSwxKSptKDIsMCkpKQorCitDVl9JTVBMIGRvdWJsZQorY3ZEZXQoIGNvbnN0IEN2QXJyKiBhcnIgKQoreworICAgIGRvdWJsZSByZXN1bHQgPSAwOworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkRldCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICBpbnQgdHlwZTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBtYXQgKSkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViICkpOworICAgIH0KKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0LT50eXBlICk7CisKKyAgICBpZiggbWF0LT53aWR0aCAhPSBtYXQtPmhlaWdodCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiVGhlIG1hdHJpeCBtdXN0IGJlIHNxdWFyZSIgKTsKKworICAgICNkZWZpbmUgTWYoIHksIHggKSAoKGZsb2F0KikobSArIHkqc3RlcCkpW3hdCisgICAgI2RlZmluZSBNZCggeSwgeCApICgoZG91YmxlKikobSArIHkqc3RlcCkpW3hdCisKKyAgICBpZiggbWF0LT53aWR0aCA9PSAyICkKKyAgICB7CisgICAgICAgIHVjaGFyKiBtID0gbWF0LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHN0ZXAgPSBtYXQtPnN0ZXA7CisKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBkZXQyKE1mKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0eXBlID09IENWXzY0RkMxICkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzdWx0ID0gZGV0MihNZCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggbWF0LT53aWR0aCA9PSAzICkKKyAgICB7CisgICAgICAgIHVjaGFyKiBtID0gbWF0LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHN0ZXAgPSBtYXQtPnN0ZXA7CisgICAgICAgIAorICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGRldDMoTWYpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfNjRGQzEgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBkZXQzKE1kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKCBtYXQtPndpZHRoID09IDEgKQorICAgIHsKKyAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSBtYXQtPmRhdGEuZmxbMF07CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggdHlwZSA9PSBDVl82NEZDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1hdC0+ZGF0YS5kYlswXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkxVRGVjb21wRnVuYyBkZWNvbXBfZnVuYzsKKyAgICAgICAgQ3ZTaXplIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworICAgICAgICBjb25zdCBpbnQgd29ya3R5cGUgPSBDVl82NEZDMTsKKyAgICAgICAgaW50IGJ1Zl9zaXplID0gc2l6ZS53aWR0aCpzaXplLmhlaWdodCpDVl9FTEVNX1NJWkUod29ya3R5cGUpOworICAgICAgICBDdk1hdCB0bWF0OworCisgICAgICAgIGlmKCAhbHVfaW5pdHRhYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkluaXRMVVRhYmxlKCAmbHVfZGVjb21wX3RhYiwgJmx1X2JhY2tfdGFiICk7CisgICAgICAgICAgICBsdV9pbml0dGFiID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBDVl9NQVRfQ04oIHR5cGUgKSAhPSAxIHx8IENWX01BVF9ERVBUSCggdHlwZSApIDwgQ1ZfMzJGICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgICAgICBpZiggc2l6ZS53aWR0aCA8PSBDVl9NQVhfTE9DQUxfTUFUX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggYnVmX3NpemUgKTsKKyAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBjdkluaXRNYXRIZWFkZXIoICZ0bWF0LCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgd29ya3R5cGUsIGJ1ZmZlciApKTsKKyAgICAgICAgaWYoIHR5cGUgPT0gd29ya3R5cGUgKQorICAgICAgICB7CisgICAgICAgIAlDVl9DQUxMKCBjdkNvcHkoIG1hdCwgJnRtYXQgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCBtYXQsICZ0bWF0ICkpOworCisgICAgICAgIGRlY29tcF9mdW5jID0gKEN2TFVEZWNvbXBGdW5jKShsdV9kZWNvbXBfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh3b3JrdHlwZSktQ1ZfMzJGXSk7CisgICAgICAgIGFzc2VydCggZGVjb21wX2Z1bmMgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGRlY29tcF9mdW5jKCB0bWF0LmRhdGEuZGIsIHRtYXQuc3RlcCwgc2l6ZSwgMCwgMCwgc2l6ZSwgJnJlc3VsdCApKTsKKyAgICB9CisKKyAgICAjdW5kZWYgTWYKKyAgICAjdW5kZWYgTWQKKworICAgIC8qaWN2Q2hlY2tWZWN0b3JfNjRmKCAmcmVzdWx0LCAxICk7Ki8KKworICAgIF9fRU5EX187CisKKyAgICBpZiggYnVmZmVyICYmICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSW52ZXJzZSAob3IgcHNldWRvLWludmVyc2UpIG9mIHRoZSBtYXRyaXggICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTZiggeSwgeCApICgoZmxvYXQqKShzcmNkYXRhICsgeSpzcmNzdGVwKSlbeF0KKyNkZWZpbmUgU2QoIHksIHggKSAoKGRvdWJsZSopKHNyY2RhdGEgKyB5KnNyY3N0ZXApKVt4XQorI2RlZmluZSBEZiggeSwgeCApICgoZmxvYXQqKShkc3RkYXRhICsgeSpkc3RzdGVwKSlbeF0KKyNkZWZpbmUgRGQoIHksIHggKSAoKGRvdWJsZSopKGRzdGRhdGEgKyB5KmRzdHN0ZXApKVt4XQorCitDVl9JTVBMIGRvdWJsZQorY3ZJbnZlcnQoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGludCBtZXRob2QgKQoreworICAgIEN2TWF0KiB1ID0gMDsKKyAgICBDdk1hdCogdiA9IDA7CisgICAgQ3ZNYXQqIHcgPSAwOworCisgICAgdWNoYXIqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKyAgICBkb3VibGUgcmVzdWx0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2SW52ZXJ0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyOworICAgIGludCB0eXBlOworCisgICAgaWYoICFDVl9JU19NQVQoIHNyYyApKQorICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3N0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVCggZHN0ICkpCisgICAgICAgIENWX0NBTEwoIGRzdCA9IGN2R2V0TWF0KCBkc3QsICZkc3R1YiApKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggc3JjLT50eXBlICk7CisKKyAgICBpZiggbWV0aG9kID09IENWX1NWRCB8fCBtZXRob2QgPT0gQ1ZfU1ZEX1NZTSApCisgICAgeworICAgICAgICBpbnQgbiA9IE1JTihzcmMtPnJvd3Msc3JjLT5jb2xzKTsKKyAgICAgICAgaWYoIG1ldGhvZCA9PSBDVl9TVkRfU1lNICYmIHNyYy0+cm93cyAhPSBzcmMtPmNvbHMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJDVl9TVkRfU1lNIG1ldGhvZCBpcyB1c2VkIGZvciBub24tc3F1YXJlIG1hdHJpeCIgKTsKKworICAgICAgICBDVl9DQUxMKCB1ID0gY3ZDcmVhdGVNYXQoIG4sIHNyYy0+cm93cywgc3JjLT50eXBlICkpOworICAgICAgICBpZiggbWV0aG9kICE9IENWX1NWRF9TWU0gKQorICAgICAgICAgICAgQ1ZfQ0FMTCggdiA9IGN2Q3JlYXRlTWF0KCBuLCBzcmMtPmNvbHMsIHNyYy0+dHlwZSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggdyA9IGN2Q3JlYXRlTWF0KCBuLCAxLCBzcmMtPnR5cGUgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U1ZEKCBzcmMsIHcsIHUsIHYsIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICkpOworCisgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIHJlc3VsdCA9IHctPmRhdGEuZmxbMF0gPj0gRkxUX0VQU0lMT04gPworICAgICAgICAgICAgICAgICAgICAgdy0+ZGF0YS5mbFt3LT5yb3dzLTFdL3ctPmRhdGEuZmxbMF0gOiAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICByZXN1bHQgPSB3LT5kYXRhLmRiWzBdID49IEZMVF9FUFNJTE9OID8KKyAgICAgICAgICAgICAgICAgICAgIHctPmRhdGEuZGJbdy0+cm93cy0xXS93LT5kYXRhLmRiWzBdIDogMDsKKworICAgICAgICBDVl9DQUxMKCBjdlNWQmtTYiggdywgdSwgdiA/IHYgOiB1LCAwLCBkc3QsIENWX1NWRF9VX1QgKyBDVl9TVkRfVl9UICkpOworICAgICAgICBFWElUOworICAgIH0KKyAgICBlbHNlIGlmKCBtZXRob2QgIT0gQ1ZfTFUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93biBpbnZlcnNpb24gbWV0aG9kIiApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoIHNyYy0+d2lkdGggIT0gc3JjLT5oZWlnaHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBtYXRyaXggbXVzdCBiZSBzcXVhcmUiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjLCBkc3QgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgaWYoIHR5cGUgIT0gQ1ZfMzJGQzEgJiYgdHlwZSAhPSBDVl82NEZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKworICAgIGlmKCBzcmMtPndpZHRoIDw9IDMgKQorICAgIHsKKyAgICAgICAgdWNoYXIqIHNyY2RhdGEgPSBzcmMtPmRhdGEucHRyOworICAgICAgICB1Y2hhciogZHN0ZGF0YSA9IGRzdC0+ZGF0YS5wdHI7CisgICAgICAgIGludCBzcmNzdGVwID0gc3JjLT5zdGVwOworICAgICAgICBpbnQgZHN0c3RlcCA9IGRzdC0+c3RlcDsKKworICAgICAgICBpZiggc3JjLT53aWR0aCA9PSAyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gZGV0MihTZik7CisgICAgICAgICAgICAgICAgaWYoIGQgIT0gMC4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwLCB0MTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZDsKKyAgICAgICAgICAgICAgICAgICAgZCA9IDEuL2Q7CisgICAgICAgICAgICAgICAgICAgIHQwID0gU2YoMCwwKSpkOworICAgICAgICAgICAgICAgICAgICB0MSA9IFNmKDEsMSkqZDsKKyAgICAgICAgICAgICAgICAgICAgRGYoMSwxKSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgICAgICAgICAgRGYoMCwwKSA9IChmbG9hdCl0MTsKKyAgICAgICAgICAgICAgICAgICAgdDAgPSAtU2YoMCwxKSpkOworICAgICAgICAgICAgICAgICAgICB0MSA9IC1TZigxLDApKmQ7CisgICAgICAgICAgICAgICAgICAgIERmKDAsMSkgPSAoZmxvYXQpdDA7CisgICAgICAgICAgICAgICAgICAgIERmKDEsMCkgPSAoZmxvYXQpdDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gZGV0MihTZCk7CisgICAgICAgICAgICAgICAgaWYoIGQgIT0gMC4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwLCB0MTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZDsKKyAgICAgICAgICAgICAgICAgICAgZCA9IDEuL2Q7CisgICAgICAgICAgICAgICAgICAgIHQwID0gU2QoMCwwKSpkOworICAgICAgICAgICAgICAgICAgICB0MSA9IFNkKDEsMSkqZDsKKyAgICAgICAgICAgICAgICAgICAgRGQoMSwxKSA9IHQwOworICAgICAgICAgICAgICAgICAgICBEZCgwLDApID0gdDE7CisgICAgICAgICAgICAgICAgICAgIHQwID0gLVNkKDAsMSkqZDsKKyAgICAgICAgICAgICAgICAgICAgdDEgPSAtU2QoMSwwKSpkOworICAgICAgICAgICAgICAgICAgICBEZCgwLDEpID0gdDA7CisgICAgICAgICAgICAgICAgICAgIERkKDEsMCkgPSB0MTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggc3JjLT53aWR0aCA9PSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gZGV0MyhTZik7CisgICAgICAgICAgICAgICAgaWYoIGQgIT0gMC4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgdFs5XTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZDsKKyAgICAgICAgICAgICAgICAgICAgZCA9IDEuL2Q7CisKKyAgICAgICAgICAgICAgICAgICAgdFswXSA9IChmbG9hdCkoKFNmKDEsMSkgKiBTZigyLDIpIC0gU2YoMSwyKSAqIFNmKDIsMSkpICogZCk7CisgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAoZmxvYXQpKChTZigwLDIpICogU2YoMiwxKSAtIFNmKDAsMSkgKiBTZigyLDIpKSAqIGQpOworICAgICAgICAgICAgICAgICAgICB0WzJdID0gKGZsb2F0KSgoU2YoMCwxKSAqIFNmKDEsMikgLSBTZigwLDIpICogU2YoMSwxKSkgKiBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdFszXSA9IChmbG9hdCkoKFNmKDEsMikgKiBTZigyLDApIC0gU2YoMSwwKSAqIFNmKDIsMikpICogZCk7CisgICAgICAgICAgICAgICAgICAgIHRbNF0gPSAoZmxvYXQpKChTZigwLDApICogU2YoMiwyKSAtIFNmKDAsMikgKiBTZigyLDApKSAqIGQpOworICAgICAgICAgICAgICAgICAgICB0WzVdID0gKGZsb2F0KSgoU2YoMCwyKSAqIFNmKDEsMCkgLSBTZigwLDApICogU2YoMSwyKSkgKiBkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdFs2XSA9IChmbG9hdCkoKFNmKDEsMCkgKiBTZigyLDEpIC0gU2YoMSwxKSAqIFNmKDIsMCkpICogZCk7CisgICAgICAgICAgICAgICAgICAgIHRbN10gPSAoZmxvYXQpKChTZigwLDEpICogU2YoMiwwKSAtIFNmKDAsMCkgKiBTZigyLDEpKSAqIGQpOworICAgICAgICAgICAgICAgICAgICB0WzhdID0gKGZsb2F0KSgoU2YoMCwwKSAqIFNmKDEsMSkgLSBTZigwLDEpICogU2YoMSwwKSkgKiBkKTsKKworICAgICAgICAgICAgICAgICAgICBEZigwLDApID0gdFswXTsgRGYoMCwxKSA9IHRbMV07IERmKDAsMikgPSB0WzJdOworICAgICAgICAgICAgICAgICAgICBEZigxLDApID0gdFszXTsgRGYoMSwxKSA9IHRbNF07IERmKDEsMikgPSB0WzVdOworICAgICAgICAgICAgICAgICAgICBEZigyLDApID0gdFs2XTsgRGYoMiwxKSA9IHRbN107IERmKDIsMikgPSB0WzhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IGRldDMoU2QpOworICAgICAgICAgICAgICAgIGlmKCBkICE9IDAuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0WzldOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkOworICAgICAgICAgICAgICAgICAgICBkID0gMS4vZDsKKworICAgICAgICAgICAgICAgICAgICB0WzBdID0gKFNkKDEsMSkgKiBTZCgyLDIpIC0gU2QoMSwyKSAqIFNkKDIsMSkpICogZDsKKyAgICAgICAgICAgICAgICAgICAgdFsxXSA9IChTZCgwLDIpICogU2QoMiwxKSAtIFNkKDAsMSkgKiBTZCgyLDIpKSAqIGQ7CisgICAgICAgICAgICAgICAgICAgIHRbMl0gPSAoU2QoMCwxKSAqIFNkKDEsMikgLSBTZCgwLDIpICogU2QoMSwxKSkgKiBkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHRbM10gPSAoU2QoMSwyKSAqIFNkKDIsMCkgLSBTZCgxLDApICogU2QoMiwyKSkgKiBkOworICAgICAgICAgICAgICAgICAgICB0WzRdID0gKFNkKDAsMCkgKiBTZCgyLDIpIC0gU2QoMCwyKSAqIFNkKDIsMCkpICogZDsKKyAgICAgICAgICAgICAgICAgICAgdFs1XSA9IChTZCgwLDIpICogU2QoMSwwKSAtIFNkKDAsMCkgKiBTZCgxLDIpKSAqIGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgdFs2XSA9IChTZCgxLDApICogU2QoMiwxKSAtIFNkKDEsMSkgKiBTZCgyLDApKSAqIGQ7CisgICAgICAgICAgICAgICAgICAgIHRbN10gPSAoU2QoMCwxKSAqIFNkKDIsMCkgLSBTZCgwLDApICogU2QoMiwxKSkgKiBkOworICAgICAgICAgICAgICAgICAgICB0WzhdID0gKFNkKDAsMCkgKiBTZCgxLDEpIC0gU2QoMCwxKSAqIFNkKDEsMCkpICogZDsKKworICAgICAgICAgICAgICAgICAgICBEZCgwLDApID0gdFswXTsgRGQoMCwxKSA9IHRbMV07IERkKDAsMikgPSB0WzJdOworICAgICAgICAgICAgICAgICAgICBEZCgxLDApID0gdFszXTsgRGQoMSwxKSA9IHRbNF07IERkKDEsMikgPSB0WzVdOworICAgICAgICAgICAgICAgICAgICBEZCgyLDApID0gdFs2XTsgRGQoMiwxKSA9IHRbN107IERkKDIsMikgPSB0WzhdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggc3JjLT53aWR0aCA9PSAxICk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IFNmKDAsMCk7CisgICAgICAgICAgICAgICAgaWYoIGQgIT0gMC4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZDsKKyAgICAgICAgICAgICAgICAgICAgRGYoMCwwKSA9IChmbG9hdCkoMS4vZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gU2QoMCwwKTsKKyAgICAgICAgICAgICAgICBpZiggZCAhPSAwLiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkOworICAgICAgICAgICAgICAgICAgICBEZCgwLDApID0gMS4vZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZMVURlY29tcEZ1bmMgZGVjb21wX2Z1bmM7CisgICAgICAgIEN2TFVCYWNrRnVuYyBiYWNrX2Z1bmM7CisgICAgICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICAgICAgY29uc3QgaW50IHdvcmt0eXBlID0gQ1ZfNjRGQzE7CisgICAgICAgIGludCBidWZfc2l6ZSA9IHNpemUud2lkdGgqc2l6ZS5oZWlnaHQqQ1ZfRUxFTV9TSVpFKHdvcmt0eXBlKTsKKyAgICAgICAgQ3ZNYXQgdG1hdDsKKworICAgICAgICBpZiggIWx1X2luaXR0YWIgKQorICAgICAgICB7CisgICAgICAgICAgICBpY3ZJbml0TFVUYWJsZSggJmx1X2RlY29tcF90YWIsICZsdV9iYWNrX3RhYiApOworICAgICAgICAgICAgbHVfaW5pdHRhYiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiggc2l6ZS53aWR0aCA8PSBDVl9NQVhfTE9DQUxfTUFUX1NJWkUgKQorICAgICAgICB7CisgICAgICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggYnVmX3NpemUgKTsKKyAgICAgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBjdkluaXRNYXRIZWFkZXIoICZ0bWF0LCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgd29ya3R5cGUsIGJ1ZmZlciApKTsKKyAgICAgICAgaWYoIHR5cGUgPT0gd29ya3R5cGUgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBjdkNvcHkoIHNyYywgJnRtYXQgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCBzcmMsICZ0bWF0ICkpOworICAgICAgICBDVl9DQUxMKCBjdlNldElkZW50aXR5KCBkc3QgKSk7CisKKyAgICAgICAgZGVjb21wX2Z1bmMgPSAoQ3ZMVURlY29tcEZ1bmMpKGx1X2RlY29tcF90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpLUNWXzMyRl0pOworICAgICAgICBiYWNrX2Z1bmMgPSAoQ3ZMVUJhY2tGdW5jKShsdV9iYWNrX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSktQ1ZfMzJGXSk7CisgICAgICAgIGFzc2VydCggZGVjb21wX2Z1bmMgJiYgYmFja19mdW5jICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBkZWNvbXBfZnVuYyggdG1hdC5kYXRhLmRiLCB0bWF0LnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwgc2l6ZSwgJnJlc3VsdCApKTsKKworICAgICAgICBpZiggcmVzdWx0ICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBJUFBJX0NBTEwoIGJhY2tfZnVuYyggdG1hdC5kYXRhLmRiLCB0bWF0LnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LT5kYXRhLnB0ciwgZHN0LT5zdGVwLCBzaXplICkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFyZXN1bHQgKQorICAgICAgICBDVl9DQUxMKCBjdlNldFplcm8oIGRzdCApKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggYnVmZmVyICYmICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworCisgICAgaWYoIHUgfHwgdiB8fCB3ICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnUgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmdiApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZ3ICk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZWFyIHN5c3RlbSBbbGVhc3Qtc3F1YXJlc10gc29sdXRpb24gICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpY3ZMU1EoIGNvbnN0IEN2TWF0KiBBLCBjb25zdCBDdk1hdCogQiwgQ3ZNYXQqIFggKQoreworICAgIEN2TWF0KiBBdEEgPSAwOworICAgIEN2TWF0KiBBdEIgPSAwOworICAgIEN2TWF0KiBXID0gMDsKKyAgICBDdk1hdCogViA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdkxTUSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKEEpIHx8ICFDVl9JU19NQVQoQikgfHwgIUNWX0lTX01BVChYKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJTb21lIG9mIHJlcXVpcmVkIGFyZ3VtZW50cyBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBBdEEgPSBjdkNyZWF0ZU1hdCggQS0+Y29scywgQS0+Y29scywgQS0+dHlwZSApOworICAgIEF0QiA9IGN2Q3JlYXRlTWF0KCBBLT5jb2xzLCAxLCBBLT50eXBlICk7CisgICAgVyA9IGN2Q3JlYXRlTWF0KCBBLT5jb2xzLCAxLCBBLT50eXBlICk7CisgICAgViA9IGN2Q3JlYXRlTWF0KCBBLT5jb2xzLCBBLT5jb2xzLCBBLT50eXBlICk7CisKKyAgICBjdk11bFRyYW5zcG9zZWQoIEEsIEF0QSwgMSApOworICAgIGN2R0VNTSggQSwgQiwgMSwgMCwgMCwgQXRCLCBDVl9HRU1NX0FfVCApOworICAgIGN2U1ZEKCBBdEEsIFcsIDAsIFYsIENWX1NWRF9NT0RJRllfQSArIENWX1NWRF9WX1QgKTsKKyAgICBjdlNWQmtTYiggVywgViwgViwgQXRCLCBYLCBDVl9TVkRfVV9UICsgQ1ZfU1ZEX1ZfVCApOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJkF0QSApOworICAgIGN2UmVsZWFzZU1hdCggJkF0QiApOworICAgIGN2UmVsZWFzZU1hdCggJlcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZWICk7Cit9CisKK0NWX0lNUEwgaW50CitjdlNvbHZlKCBjb25zdCBDdkFyciogQSwgY29uc3QgQ3ZBcnIqIGIsIEN2QXJyKiB4LCBpbnQgbWV0aG9kICkKK3sKKyAgICBDdk1hdCogdSA9IDA7CisgICAgQ3ZNYXQqIHYgPSAwOworICAgIEN2TWF0KiB3ID0gMDsKKworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBDVl9GVU5DTkFNRSggImN2U29sdmUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzc3R1YiwgKnNyYyA9IChDdk1hdCopQTsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdCA9IChDdk1hdCopeDsKKyAgICBDdk1hdCBic3R1YiwgKnNyYzIgPSAoQ3ZNYXQqKWI7CisgICAgaW50IHR5cGU7CisKKyAgICBpZiggIUNWX0lTX01BVCggc3JjICkpCisgICAgICAgIENWX0NBTEwoIHNyYyA9IGN2R2V0TWF0KCBzcmMsICZzc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzcmMyICkpCisgICAgICAgIENWX0NBTEwoIHNyYzIgPSBjdkdldE1hdCggc3JjMiwgJmJzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoIGRzdCApKQorICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0dWIgKSk7CisKKyAgICBpZiggbWV0aG9kICYgQ1ZfTFNRICkKKyAgICB7CisgICAgICAgIGljdkxTUSggc3JjLCBzcmMyLCBkc3QgKTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggbWV0aG9kID09IENWX1NWRCB8fCBtZXRob2QgPT0gQ1ZfU1ZEX1NZTSApCisgICAgeworICAgICAgICBpbnQgbiA9IE1JTihzcmMtPnJvd3Msc3JjLT5jb2xzKTsKKworICAgICAgICBpZiggbWV0aG9kID09IENWX1NWRF9TWU0gJiYgc3JjLT5yb3dzICE9IHNyYy0+Y29scyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkNWX1NWRF9TWU0gbWV0aG9kIGlzIHVzZWQgZm9yIG5vbi1zcXVhcmUgbWF0cml4IiApOworCisgICAgICAgIENWX0NBTEwoIHUgPSBjdkNyZWF0ZU1hdCggbiwgc3JjLT5yb3dzLCBzcmMtPnR5cGUgKSk7CisgICAgICAgIGlmKCBtZXRob2QgIT0gQ1ZfU1ZEX1NZTSApCisgICAgICAgICAgICBDVl9DQUxMKCB2ID0gY3ZDcmVhdGVNYXQoIG4sIHNyYy0+Y29scywgc3JjLT50eXBlICkpOworICAgICAgICBDVl9DQUxMKCB3ID0gY3ZDcmVhdGVNYXQoIG4sIDEsIHNyYy0+dHlwZSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTVkQoIHNyYywgdywgdSwgdiwgQ1ZfU1ZEX1VfVCArIENWX1NWRF9WX1QgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U1ZCa1NiKCB3LCB1LCB2ID8gdiA6IHUsIHNyYzIsIGRzdCwgQ1ZfU1ZEX1VfVCArIENWX1NWRF9WX1QgKSk7CisgICAgICAgIEVYSVQ7CisgICAgfQorICAgIGVsc2UgaWYoIG1ldGhvZCAhPSBDVl9MVSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duIGludmVyc2lvbiBtZXRob2QiICk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyYy0+dHlwZSApOworCisgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyYywgZHN0ICkgfHwgIUNWX0FSRV9UWVBFU19FUSggc3JjLCBzcmMyICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoIHNyYy0+d2lkdGggIT0gc3JjLT5oZWlnaHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBtYXRyaXggbXVzdCBiZSBzcXVhcmUiICk7CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjMiwgZHN0ICkgfHwgc3JjLT53aWR0aCAhPSBzcmMyLT5oZWlnaHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggdHlwZSAhPSBDVl8zMkZDMSAmJiB0eXBlICE9IENWXzY0RkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworCisgICAgLy8gY2hlY2sgY2FzZSBvZiBhIHNpbmdsZSBlcXVhdGlvbiBhbmQgc21hbGwgbWF0cml4CisgICAgaWYoIHNyYy0+d2lkdGggPD0gMyAmJiBzcmMyLT53aWR0aCA9PSAxICkKKyAgICB7CisgICAgICAgICNkZWZpbmUgYmYoeSkgKChmbG9hdCopKGJkYXRhICsgeSpzcmMyc3RlcCkpWzBdCisgICAgICAgICNkZWZpbmUgYmQoeSkgKChkb3VibGUqKShiZGF0YSArIHkqc3JjMnN0ZXApKVswXQorCisgICAgICAgIHVjaGFyKiBzcmNkYXRhID0gc3JjLT5kYXRhLnB0cjsKKyAgICAgICAgdWNoYXIqIGJkYXRhID0gc3JjMi0+ZGF0YS5wdHI7CisgICAgICAgIHVjaGFyKiBkc3RkYXRhID0gZHN0LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHNyY3N0ZXAgPSBzcmMtPnN0ZXA7CisgICAgICAgIGludCBzcmMyc3RlcCA9IHNyYzItPnN0ZXA7CisgICAgICAgIGludCBkc3RzdGVwID0gZHN0LT5zdGVwOworCisgICAgICAgIGlmKCBzcmMtPndpZHRoID09IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBkZXQyKFNmKTsKKyAgICAgICAgICAgICAgICBpZiggZCAhPSAwLiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB0OworICAgICAgICAgICAgICAgICAgICBkID0gMS4vZDsKKyAgICAgICAgICAgICAgICAgICAgdCA9IChmbG9hdCkoKGJmKDApKlNmKDEsMSkgLSBiZigxKSpTZigwLDEpKSpkKTsKKyAgICAgICAgICAgICAgICAgICAgRGYoMSwwKSA9IChmbG9hdCkoKGJmKDEpKlNmKDAsMCkgLSBiZigwKSpTZigxLDApKSpkKTsKKyAgICAgICAgICAgICAgICAgICAgRGYoMCwwKSA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IGRldDIoU2QpOworICAgICAgICAgICAgICAgIGlmKCBkICE9IDAuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0OworICAgICAgICAgICAgICAgICAgICBkID0gMS4vZDsKKyAgICAgICAgICAgICAgICAgICAgdCA9IChiZCgwKSpTZCgxLDEpIC0gYmQoMSkqU2QoMCwxKSkqZDsKKyAgICAgICAgICAgICAgICAgICAgRGQoMSwwKSA9IChiZCgxKSpTZCgwLDApIC0gYmQoMCkqU2QoMSwwKSkqZDsKKyAgICAgICAgICAgICAgICAgICAgRGQoMCwwKSA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzcmMtPndpZHRoID09IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBkZXQzKFNmKTsKKyAgICAgICAgICAgICAgICBpZiggZCAhPSAwLiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmbG9hdCB0WzNdOworICAgICAgICAgICAgICAgICAgICBkID0gMS4vZDsKKworICAgICAgICAgICAgICAgICAgICB0WzBdID0gKGZsb2F0KShkKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJmKDApKihTZigxLDEpKlNmKDIsMikgLSBTZigxLDIpKlNmKDIsMSkpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZigwLDEpKihiZigxKSpTZigyLDIpIC0gU2YoMSwyKSpiZigyKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNmKDAsMikqKGJmKDEpKlNmKDIsMSkgLSBTZigxLDEpKmJmKDIpKSkpOworCisgICAgICAgICAgICAgICAgICAgIHRbMV0gPSAoZmxvYXQpKGQqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2YoMCwwKSooYmYoMSkqU2YoMiwyKSAtIFNmKDEsMikqYmYoMikpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZigwKSooU2YoMSwwKSpTZigyLDIpIC0gU2YoMSwyKSpTZigyLDApKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2YoMCwyKSooU2YoMSwwKSpiZigyKSAtIGJmKDEpKlNmKDIsMCkpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgdFsyXSA9IChmbG9hdCkoZCoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZigwLDApKihTZigxLDEpKmJmKDIpIC0gYmYoMSkqU2YoMiwxKSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNmKDAsMSkqKFNmKDEsMCkqYmYoMikgLSBiZigxKSpTZigyLDApKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmYoMCkqKFNmKDEsMCkqU2YoMiwxKSAtIFNmKDEsMSkqU2YoMiwwKSkpKTsKKworICAgICAgICAgICAgICAgICAgICBEZigwLDApID0gdFswXTsKKyAgICAgICAgICAgICAgICAgICAgRGYoMSwwKSA9IHRbMV07CisgICAgICAgICAgICAgICAgICAgIERmKDIsMCkgPSB0WzJdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBkZXQzKFNkKTsKKyAgICAgICAgICAgICAgICBpZiggZCAhPSAwLiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdFs5XTsKKworICAgICAgICAgICAgICAgICAgICBkID0gMS4vZDsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHRbMF0gPSAoKFNkKDEsMSkgKiBTZCgyLDIpIC0gU2QoMSwyKSAqIFNkKDIsMSkpKmJkKDApICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2QoMCwyKSAqIFNkKDIsMSkgLSBTZCgwLDEpICogU2QoMiwyKSkqYmQoMSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZCgwLDEpICogU2QoMSwyKSAtIFNkKDAsMikgKiBTZCgxLDEpKSpiZCgyKSkqZDsKKworICAgICAgICAgICAgICAgICAgICB0WzFdID0gKChTZCgxLDIpICogU2QoMiwwKSAtIFNkKDEsMCkgKiBTZCgyLDIpKSpiZCgwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNkKDAsMCkgKiBTZCgyLDIpIC0gU2QoMCwyKSAqIFNkKDIsMCkpKmJkKDEpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2QoMCwyKSAqIFNkKDEsMCkgLSBTZCgwLDApICogU2QoMSwyKSkqYmQoMikpKmQ7CisKKyAgICAgICAgICAgICAgICAgICAgdFsyXSA9ICgoU2QoMSwwKSAqIFNkKDIsMSkgLSBTZCgxLDEpICogU2QoMiwwKSkqYmQoMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTZCgwLDEpICogU2QoMiwwKSAtIFNkKDAsMCkgKiBTZCgyLDEpKSpiZCgxKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFNkKDAsMCkgKiBTZCgxLDEpIC0gU2QoMCwxKSAqIFNkKDEsMCkpKmJkKDIpKSpkOworCisgICAgICAgICAgICAgICAgICAgIERkKDAsMCkgPSB0WzBdOworICAgICAgICAgICAgICAgICAgICBEZCgxLDApID0gdFsxXTsKKyAgICAgICAgICAgICAgICAgICAgRGQoMiwwKSA9IHRbMl07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggc3JjLT53aWR0aCA9PSAxICk7CisKKyAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZCA9IFNmKDAsMCk7CisgICAgICAgICAgICAgICAgaWYoIGQgIT0gMC4gKQorICAgICAgICAgICAgICAgICAgICBEZigwLDApID0gKGZsb2F0KShiZigwKS9kKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGQgPSBTZCgwLDApOworICAgICAgICAgICAgICAgIGlmKCBkICE9IDAuICkKKyAgICAgICAgICAgICAgICAgICAgRGQoMCwwKSA9IChiZCgwKS9kKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZMVURlY29tcEZ1bmMgZGVjb21wX2Z1bmM7CisgICAgICAgIEN2TFVCYWNrRnVuYyBiYWNrX2Z1bmM7CisgICAgICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRNYXRTaXplKCBzcmMgKTsKKyAgICAgICAgQ3ZTaXplIGRzdHNpemUgPSBjdkdldE1hdFNpemUoIGRzdCApOworICAgICAgICBpbnQgd29ya3R5cGUgPSBDVl82NEZDMTsKKyAgICAgICAgaW50IGJ1Zl9zaXplID0gc2l6ZS53aWR0aCpzaXplLmhlaWdodCpDVl9FTEVNX1NJWkUod29ya3R5cGUpOworICAgICAgICBkb3VibGUgZCA9IDA7CisgICAgICAgIEN2TWF0IHRtYXQ7CisKKyAgICAgICAgaWYoICFsdV9pbml0dGFiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2SW5pdExVVGFibGUoICZsdV9kZWNvbXBfdGFiLCAmbHVfYmFja190YWIgKTsKKyAgICAgICAgICAgIGx1X2luaXR0YWIgPSAxOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNpemUud2lkdGggPD0gQ1ZfTUFYX0xPQ0FMX01BVF9TSVpFICkKKyAgICAgICAgeworICAgICAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSAodWNoYXIqKWN2QWxsb2MoIGJ1Zl9zaXplICkpOworICAgICAgICB9CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TWF0SGVhZGVyKCAmdG1hdCwgc2l6ZS5oZWlnaHQsIHNpemUud2lkdGgsIHdvcmt0eXBlLCBidWZmZXIgKSk7CisgICAgICAgIGlmKCB0eXBlID09IHdvcmt0eXBlICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb3B5KCBzcmMsICZ0bWF0ICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q29udmVydCggc3JjLCAmdG1hdCApKTsKKworICAgICAgICBpZiggc3JjMi0+ZGF0YS5wdHIgIT0gZHN0LT5kYXRhLnB0ciApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q29weSggc3JjMiwgZHN0ICkpOworICAgICAgICB9CisKKyAgICAgICAgZGVjb21wX2Z1bmMgPSAoQ3ZMVURlY29tcEZ1bmMpKGx1X2RlY29tcF90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpLUNWXzMyRl0pOworICAgICAgICBiYWNrX2Z1bmMgPSAoQ3ZMVUJhY2tGdW5jKShsdV9iYWNrX3RhYi5mbl8yZFtDVl9NQVRfREVQVEgodHlwZSktQ1ZfMzJGXSk7CisgICAgICAgIGFzc2VydCggZGVjb21wX2Z1bmMgJiYgYmFja19mdW5jICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBkZWNvbXBfZnVuYyggdG1hdC5kYXRhLmRiLCB0bWF0LnN0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIGRzdC0+c3RlcCwgZHN0c2l6ZSwgJmQgKSk7CisKKyAgICAgICAgaWYoIGQgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIElQUElfQ0FMTCggYmFja19mdW5jKCB0bWF0LmRhdGEuZGIsIHRtYXQuc3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAsIGRzdHNpemUgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgICAgIENWX0NBTEwoIGN2U2V0WmVybyggZHN0ICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBidWZmZXIgJiYgIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisKKyAgICBpZiggdSB8fCB2IHx8IHcgKQorICAgIHsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmdSApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZ2ICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJncgKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDNEIHZlY3RvciBjcm9zcy1wcm9kdWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIHZvaWQKK2N2Q3Jvc3NQcm9kdWN0KCBjb25zdCBDdkFyciogc3JjQWFyciwgY29uc3QgQ3ZBcnIqIHNyY0JhcnIsIEN2QXJyKiBkc3RhcnIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcm9zc1Byb2R1Y3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViQSwgKnNyY0EgPSAoQ3ZNYXQqKXNyY0FhcnI7CisgICAgQ3ZNYXQgc3R1YkIsICpzcmNCID0gKEN2TWF0KilzcmNCYXJyOworICAgIEN2TWF0IGRzdHViLCAqZHN0ID0gKEN2TWF0Kilkc3RhcnI7CisgICAgaW50IHR5cGU7CisKKyAgICBpZiggIUNWX0lTX01BVChzcmNBKSkKKyAgICAgICAgQ1ZfQ0FMTCggc3JjQSA9IGN2R2V0TWF0KCBzcmNBLCAmc3R1YkEgKSk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIHNyY0EtPnR5cGUgKTsKKworICAgIGlmKCBzcmNBLT53aWR0aCpzcmNBLT5oZWlnaHQqQ1ZfTUFUX0NOKHR5cGUpICE9IDMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiQWxsIHRoZSBpbnB1dCBhcnJheXMgbXVzdCBiZSBjb250aW51b3VzIDMtdmVjdG9ycyIgKTsKKworICAgIGlmKCAhc3JjQiB8fCAhZHN0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICIiICk7CisKKyAgICBpZiggKHNyY0EtPnR5cGUgJiB+Q1ZfTUFUX0NPTlRfRkxBRykgPT0gKHNyY0ItPnR5cGUgJiB+Q1ZfTUFUX0NPTlRfRkxBRykgJiYKKyAgICAgICAgKHNyY0EtPnR5cGUgJiB+Q1ZfTUFUX0NPTlRfRkxBRykgPT0gKGRzdC0+dHlwZSAmIH5DVl9NQVRfQ09OVF9GTEFHKSApCisgICAgeworICAgICAgICBpZiggIXNyY0ItPmRhdGEucHRyIHx8ICFkc3QtPmRhdGEucHRyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChzcmNCKSkKKyAgICAgICAgICAgIENWX0NBTEwoIHNyY0IgPSBjdkdldE1hdCggc3JjQiwgJnN0dWJCICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGRzdCkpCisgICAgICAgICAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0LCAmZHN0dWIgKSk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHNyY0EsIHNyY0IgKSB8fAorICAgICAgICAgICAgIUNWX0FSRV9UWVBFU19FUSggc3JjQiwgZHN0ICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKyAgICB9CisKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggc3JjQSwgc3JjQiApIHx8ICFDVl9BUkVfU0laRVNfRVEoIHNyY0IsIGRzdCApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzMyRiApCisgICAgeworICAgICAgICBmbG9hdCogZHN0ZGF0YSA9IChmbG9hdCopKGRzdC0+ZGF0YS5wdHIpOworICAgICAgICBjb25zdCBmbG9hdCogc3JjMWRhdGEgPSAoZmxvYXQqKShzcmNBLT5kYXRhLnB0cik7CisgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMyZGF0YSA9IChmbG9hdCopKHNyY0ItPmRhdGEucHRyKTsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoc3JjQS0+dHlwZSAmIHNyY0ItPnR5cGUgJiBkc3QtPnR5cGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0ZGF0YVsyXSA9IHNyYzFkYXRhWzBdICogc3JjMmRhdGFbMV0gLSBzcmMxZGF0YVsxXSAqIHNyYzJkYXRhWzBdOworICAgICAgICAgICAgZHN0ZGF0YVswXSA9IHNyYzFkYXRhWzFdICogc3JjMmRhdGFbMl0gLSBzcmMxZGF0YVsyXSAqIHNyYzJkYXRhWzFdOworICAgICAgICAgICAgZHN0ZGF0YVsxXSA9IHNyYzFkYXRhWzJdICogc3JjMmRhdGFbMF0gLSBzcmMxZGF0YVswXSAqIHNyYzJkYXRhWzJdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN0ZXAxID0gc3JjQS0+c3RlcCA/IHNyY0EtPnN0ZXAvc2l6ZW9mKHNyYzFkYXRhWzBdKSA6IDE7CisgICAgICAgICAgICBpbnQgc3RlcDIgPSBzcmNCLT5zdGVwID8gc3JjQi0+c3RlcC9zaXplb2Yoc3JjMWRhdGFbMF0pIDogMTsKKyAgICAgICAgICAgIGludCBzdGVwID0gZHN0LT5zdGVwID8gZHN0LT5zdGVwL3NpemVvZihzcmMxZGF0YVswXSkgOiAxOworCisgICAgICAgICAgICBkc3RkYXRhWzIqc3RlcF0gPSBzcmMxZGF0YVswXSAqIHNyYzJkYXRhW3N0ZXAyXSAtIHNyYzFkYXRhW3N0ZXAxXSAqIHNyYzJkYXRhWzBdOworICAgICAgICAgICAgZHN0ZGF0YVswXSA9IHNyYzFkYXRhW3N0ZXAxXSAqIHNyYzJkYXRhW3N0ZXAyKjJdIC0gc3JjMWRhdGFbc3RlcDEqMl0gKiBzcmMyZGF0YVtzdGVwMl07CisgICAgICAgICAgICBkc3RkYXRhW3N0ZXBdID0gc3JjMWRhdGFbc3RlcDEqMl0gKiBzcmMyZGF0YVswXSAtIHNyYzFkYXRhWzBdICogc3JjMmRhdGFbc3RlcDIqMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX0RFUFRIKHR5cGUpID09IENWXzY0RiApCisgICAgeworICAgICAgICBkb3VibGUqIGRzdGRhdGEgPSAoZG91YmxlKikoZHN0LT5kYXRhLnB0cik7CisgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjMWRhdGEgPSAoZG91YmxlKikoc3JjQS0+ZGF0YS5wdHIpOworICAgICAgICBjb25zdCBkb3VibGUqIHNyYzJkYXRhID0gKGRvdWJsZSopKHNyY0ItPmRhdGEucHRyKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVChzcmNBLT50eXBlICYgc3JjQi0+dHlwZSAmIGRzdC0+dHlwZSkgKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RkYXRhWzJdID0gc3JjMWRhdGFbMF0gKiBzcmMyZGF0YVsxXSAtIHNyYzFkYXRhWzFdICogc3JjMmRhdGFbMF07CisgICAgICAgICAgICBkc3RkYXRhWzBdID0gc3JjMWRhdGFbMV0gKiBzcmMyZGF0YVsyXSAtIHNyYzFkYXRhWzJdICogc3JjMmRhdGFbMV07CisgICAgICAgICAgICBkc3RkYXRhWzFdID0gc3JjMWRhdGFbMl0gKiBzcmMyZGF0YVswXSAtIHNyYzFkYXRhWzBdICogc3JjMmRhdGFbMl07CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc3RlcDEgPSBzcmNBLT5zdGVwID8gc3JjQS0+c3RlcC9zaXplb2Yoc3JjMWRhdGFbMF0pIDogMTsKKyAgICAgICAgICAgIGludCBzdGVwMiA9IHNyY0ItPnN0ZXAgPyBzcmNCLT5zdGVwL3NpemVvZihzcmMxZGF0YVswXSkgOiAxOworICAgICAgICAgICAgaW50IHN0ZXAgPSBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAvc2l6ZW9mKHNyYzFkYXRhWzBdKSA6IDE7CisKKyAgICAgICAgICAgIGRzdGRhdGFbMipzdGVwXSA9IHNyYzFkYXRhWzBdICogc3JjMmRhdGFbc3RlcDJdIC0gc3JjMWRhdGFbc3RlcDFdICogc3JjMmRhdGFbMF07CisgICAgICAgICAgICBkc3RkYXRhWzBdID0gc3JjMWRhdGFbc3RlcDFdICogc3JjMmRhdGFbc3RlcDIqMl0gLSBzcmMxZGF0YVtzdGVwMSoyXSAqIHNyYzJkYXRhW3N0ZXAyXTsKKyAgICAgICAgICAgIGRzdGRhdGFbc3RlcF0gPSBzcmMxZGF0YVtzdGVwMSoyXSAqIHNyYzJkYXRhWzBdIC0gc3JjMWRhdGFbMF0gKiBzcmMyZGF0YVtzdGVwMioyXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2Q2FsY1BDQSggY29uc3QgQ3ZBcnIqIGRhdGFfYXJyLCBDdkFyciogYXZnX2FyciwgQ3ZBcnIqIGVpZ2VudmFscywgQ3ZBcnIqIGVpZ2VudmVjdHMsIGludCBmbGFncyApCit7CisgICAgQ3ZNYXQqIHRtcF9hdmcgPSAwOworICAgIEN2TWF0KiB0bXBfYXZnX3IgPSAwOworICAgIEN2TWF0KiB0bXBfY292ID0gMDsKKyAgICBDdk1hdCogdG1wX2V2YWxzID0gMDsKKyAgICBDdk1hdCogdG1wX2V2ZWN0cyA9IDA7CisgICAgQ3ZNYXQqIHRtcF9ldmVjdHMyID0gMDsKKyAgICBDdk1hdCogdG1wX2RhdGEgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZDYWxjUENBIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3R1YiwgKmRhdGEgPSAoQ3ZNYXQqKWRhdGFfYXJyOworICAgIEN2TWF0IGFzdHViLCAqYXZnID0gKEN2TWF0KilhdmdfYXJyOworICAgIEN2TWF0IGV2YWxzdHViLCAqZXZhbHMgPSAoQ3ZNYXQqKWVpZ2VudmFsczsKKyAgICBDdk1hdCBldmVjdHN0dWIsICpldmVjdHMgPSAoQ3ZNYXQqKWVpZ2VudmVjdHM7CisgICAgaW50IGNvdmFyX2ZsYWdzID0gQ1ZfQ09WQVJfU0NBTEU7CisgICAgaW50IGksIGxlbiwgaW5fY291bnQsIGNvdW50LCBvdXRfY291bnQ7CisKKyAgICBpZiggIUNWX0lTX01BVChkYXRhKSApCisgICAgICAgIENWX0NBTEwoIGRhdGEgPSBjdkdldE1hdCggZGF0YSwgJnN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChhdmcpICkKKyAgICAgICAgQ1ZfQ0FMTCggYXZnID0gY3ZHZXRNYXQoIGF2ZywgJmFzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoZXZhbHMpICkKKyAgICAgICAgQ1ZfQ0FMTCggZXZhbHMgPSBjdkdldE1hdCggZXZhbHMsICZldmFsc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGV2ZWN0cykgKQorICAgICAgICBDVl9DQUxMKCBldmVjdHMgPSBjdkdldE1hdCggZXZlY3RzLCAmZXZlY3RzdHViICkpOworCisgICAgaWYoIENWX01BVF9DTihkYXRhLT50eXBlKSAhPSAxIHx8IENWX01BVF9DTihhdmctPnR5cGUpICE9IDEgfHwKKyAgICAgICAgQ1ZfTUFUX0NOKGV2YWxzLT50eXBlKSAhPSAxIHx8IENWX01BVF9DTihldmVjdHMtPnR5cGUpICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJBbGwgdGhlIGlucHV0IGFuZCBvdXRwdXQgYXJyYXlzIG11c3QgYmUgMS1jaGFubmVsIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSChhdmctPnR5cGUpIDwgQ1ZfMzJGIHx8ICFDVl9BUkVfREVQVEhTX0VRKGF2ZywgZXZhbHMpIHx8CisgICAgICAgICFDVl9BUkVfREVQVEhTX0VRKGF2ZywgZXZlY3RzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIkFsbCB0aGUgb3V0cHV0IGFycmF5cyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSwgMzJmQzEgb3IgNjRmQzEiICk7CisKKyAgICBpZiggZmxhZ3MgJiBDVl9QQ0FfREFUQV9BU19DT0wgKQorICAgIHsKKyAgICAgICAgbGVuID0gZGF0YS0+cm93czsKKyAgICAgICAgaW5fY291bnQgPSBkYXRhLT5jb2xzOworICAgICAgICBjb3Zhcl9mbGFncyB8PSBDVl9DT1ZBUl9DT0xTOworCisgICAgICAgIGlmKCBhdmctPmNvbHMgIT0gMSB8fCBhdmctPnJvd3MgIT0gbGVuICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIlRoZSBtZWFuIChhdmVyYWdlKSB2ZWN0b3Igc2hvdWxkIGJlIGRhdGEtPnJvd3MgeCAxIHdoZW4gQ1ZfUENBX0RBVEFfQVNfQ09MIGlzIHVzZWQiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggdG1wX2F2ZyA9IGN2Q3JlYXRlTWF0KCBsZW4sIDEsIENWXzY0RiApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuID0gZGF0YS0+Y29sczsKKyAgICAgICAgaW5fY291bnQgPSBkYXRhLT5yb3dzOworICAgICAgICBjb3Zhcl9mbGFncyB8PSBDVl9DT1ZBUl9ST1dTOworCisgICAgICAgIGlmKCBhdmctPnJvd3MgIT0gMSB8fCBhdmctPmNvbHMgIT0gbGVuICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIlRoZSBtZWFuIChhdmVyYWdlKSB2ZWN0b3Igc2hvdWxkIGJlIDEgeCBkYXRhLT5jb2xzIHdoZW4gQ1ZfUENBX0RBVEFfQVNfUk9XIGlzIHVzZWQiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggdG1wX2F2ZyA9IGN2Q3JlYXRlTWF0KCAxLCBsZW4sIENWXzY0RiApKTsKKyAgICB9CisKKyAgICBjb3VudCA9IE1JTihsZW4sIGluX2NvdW50KTsKKyAgICBvdXRfY291bnQgPSBldmFscy0+Y29scyArIGV2YWxzLT5yb3dzIC0gMTsKKyAgICAKKyAgICBpZiggKGV2YWxzLT5jb2xzICE9IDEgJiYgZXZhbHMtPnJvd3MgIT0gMSkgfHwgb3V0X2NvdW50ID4gY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgIlRoZSBhcnJheSBvZiBlaWdlbnZhbHVlcyBtdXN0IGJlIDFkIHZlY3RvciBjb250YWluaW5nICIKKyAgICAgICAgIm5vIG1vcmUgdGhhbiBtaW4oZGF0YS0+cm93cyxkYXRhLT5jb2xzKSBlbGVtZW50cyIgKTsKKworICAgIGlmKCBldmVjdHMtPmNvbHMgIT0gbGVuIHx8IGV2ZWN0cy0+cm93cyAhPSBvdXRfY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgIlRoZSBtYXRyaXggb2YgZWlnZW52YWx1ZXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFzIHRoZSBpbnB1dCB2ZWN0b3IgbGVuZ3RoICIKKyAgICAgICAgImFuZCB0aGUgc2FtZSBudW1iZXIgb2Ygcm93cyBhcyB0aGUgbnVtYmVyIG9mIGVpZ2VudmFsdWVzIiApOworCisgICAgLy8gInNjcmFtYmxlZCIgd2F5IHRvIGNvbXB1dGUgUENBICh3aGVuIGNvbHMoQSk+cm93cyhBKSk6CisgICAgLy8gQiA9IEEnQTsgQip4PWIqeDsgQyA9IEFBJzsgQyp5PWMqeSAtPiBBQScqeT1jKnkgLT4gQSdBKihBJyp5KT1jKihBJyp5KSAtPiBjID0gYiwgeD1BJyp5CisgICAgaWYoIGxlbiA8PSBpbl9jb3VudCApCisgICAgICAgIGNvdmFyX2ZsYWdzIHw9IENWX0NPVkFSX05PUk1BTDsKKworICAgIGlmKCBmbGFncyAmIENWX1BDQV9VU0VfQVZHICl7CisgICAgICAgIGNvdmFyX2ZsYWdzIHw9IENWX0NPVkFSX1VTRV9BVkc7CisJCUNWX0NBTEwoIGN2Q29udmVydCggYXZnLCB0bXBfYXZnICkgKTsKKwl9CisKKyAgICBDVl9DQUxMKCB0bXBfY292ID0gY3ZDcmVhdGVNYXQoIGNvdW50LCBjb3VudCwgQ1ZfNjRGICkpOworICAgIENWX0NBTEwoIHRtcF9ldmFscyA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGICkpOworICAgIENWX0NBTEwoIHRtcF9ldmVjdHMgPSBjdkNyZWF0ZU1hdCggY291bnQsIGNvdW50LCBDVl82NEYgKSk7CisKKyAgICBDVl9DQUxMKCBjdkNhbGNDb3Zhck1hdHJpeCggJmRhdGFfYXJyLCAwLCB0bXBfY292LCB0bXBfYXZnLCBjb3Zhcl9mbGFncyApKTsKKyAgICBDVl9DQUxMKCBjdlNWRCggdG1wX2NvdiwgdG1wX2V2YWxzLCB0bXBfZXZlY3RzLCAwLCBDVl9TVkRfTU9ESUZZX0EgKyBDVl9TVkRfVV9UICkpOworICAgIHRtcF9ldmVjdHMtPnJvd3MgPSBvdXRfY291bnQ7CisgICAgdG1wX2V2YWxzLT5jb2xzID0gb3V0X2NvdW50OworICAgIGN2WmVybyggZXZlY3RzICk7CisgICAgY3ZaZXJvKCBldmFscyApOworCisgICAgaWYoIGNvdmFyX2ZsYWdzICYgQ1ZfQ09WQVJfTk9STUFMICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2Q29udmVydCggdG1wX2V2ZWN0cywgZXZlY3RzICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBDVl9QQ0FfREFUQV9BU19ST1c6IGNvbHMoQSk+cm93cyhBKS4geD1BJyp5IC0+IHgnPXknKkEKKyAgICAgICAgLy8gQ1ZfUENBX0RBVEFfQVNfQ09MOiByb3dzKEEpPmNvbHMoQSkuIHg9QScnKnkgLT4geCc9eScqQScKKyAgICAgICAgaW50IGJsb2NrX2NvdW50ID0gMDsKKworICAgICAgICBDVl9DQUxMKCB0bXBfZGF0YSA9IGN2Q3JlYXRlTWF0KCBjb3VudCwgY291bnQsIENWXzY0RiApKTsKKyAgICAgICAgQ1ZfQ0FMTCggdG1wX2F2Z19yID0gY3ZDcmVhdGVNYXQoIGNvdW50LCBjb3VudCwgQ1ZfNjRGICkpOworICAgICAgICBDVl9DQUxMKCB0bXBfZXZlY3RzMiA9IGN2Q3JlYXRlTWF0KCBvdXRfY291bnQsIGNvdW50LCBDVl82NEYgKSk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSArPSBibG9ja19jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0IGRhdGFfcGFydCwgdGRhdGFfcGFydCwgcGFydCwgZHN0X3BhcnQsIGF2Z19wYXJ0LCB0bXBfYXZnX3BhcnQ7CisgICAgICAgICAgICBpbnQgZ2VtbV9mbGFnczsKKworICAgICAgICAgICAgYmxvY2tfY291bnQgPSBNSU4oIGNvdW50LCBsZW4gLSBpICk7CisKKyAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX1BDQV9EQVRBX0FTX0NPTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3ZHZXRSb3dzKCBkYXRhLCAmZGF0YV9wYXJ0LCBpLCBpICsgYmxvY2tfY291bnQgKTsKKyAgICAgICAgICAgICAgICBjdkdldFJvd3MoIHRtcF9kYXRhLCAmdGRhdGFfcGFydCwgMCwgYmxvY2tfY291bnQgKTsKKyAgICAgICAgICAgICAgICBjdkdldFJvd3MoIHRtcF9hdmcsICZhdmdfcGFydCwgaSwgaSArIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICAgICAgY3ZHZXRSb3dzKCB0bXBfYXZnX3IsICZ0bXBfYXZnX3BhcnQsIDAsIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICAgICAgZ2VtbV9mbGFncyA9IENWX0dFTU1fQl9UOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2R2V0Q29scyggZGF0YSwgJmRhdGFfcGFydCwgaSwgaSArIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICAgICAgY3ZHZXRDb2xzKCB0bXBfZGF0YSwgJnRkYXRhX3BhcnQsIDAsIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICAgICAgY3ZHZXRDb2xzKCB0bXBfYXZnLCAmYXZnX3BhcnQsIGksIGkgKyBibG9ja19jb3VudCApOworICAgICAgICAgICAgICAgIGN2R2V0Q29scyggdG1wX2F2Z19yLCAmdG1wX2F2Z19wYXJ0LCAwLCBibG9ja19jb3VudCApOworICAgICAgICAgICAgICAgIGdlbW1fZmxhZ3MgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkdldENvbHMoIHRtcF9ldmVjdHMyLCAmcGFydCwgMCwgYmxvY2tfY291bnQgKTsKKyAgICAgICAgICAgIGN2R2V0Q29scyggZXZlY3RzLCAmZHN0X3BhcnQsIGksIGkgKyBibG9ja19jb3VudCApOworCisgICAgICAgICAgICBjdkNvbnZlcnQoICZkYXRhX3BhcnQsICZ0ZGF0YV9wYXJ0ICk7CisgICAgICAgICAgICBjdlJlcGVhdCggJmF2Z19wYXJ0LCAmdG1wX2F2Z19wYXJ0ICk7CisgICAgICAgICAgICBjdlN1YiggJnRkYXRhX3BhcnQsICZ0bXBfYXZnX3BhcnQsICZ0ZGF0YV9wYXJ0ICk7CisgICAgICAgICAgICBjdkdFTU0oIHRtcF9ldmVjdHMsICZ0ZGF0YV9wYXJ0LCAxLCAwLCAwLCAmcGFydCwgZ2VtbV9mbGFncyApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCAmcGFydCwgJmRzdF9wYXJ0ICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBub3JtYWxpemUgZWlnZW52ZWN0b3JzCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBvdXRfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2TWF0IGVpOworICAgICAgICAgICAgY3ZHZXRSb3coIGV2ZWN0cywgJmVpLCBpICk7CisJCQljdk5vcm1hbGl6ZSggJmVpLCAmZWkgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCB0bXBfZXZhbHMtPnJvd3MgIT0gZXZhbHMtPnJvd3MgKQorICAgICAgICBjdlJlc2hhcGUoIHRtcF9ldmFscywgdG1wX2V2YWxzLCAxLCBldmFscy0+cm93cyApOworICAgIGN2Q29udmVydCggdG1wX2V2YWxzLCBldmFscyApOworICAgIGN2Q29udmVydCggdG1wX2F2ZywgYXZnICk7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmdG1wX2F2ZyApOworICAgIGN2UmVsZWFzZU1hdCggJnRtcF9hdmdfciApOworICAgIGN2UmVsZWFzZU1hdCggJnRtcF9jb3YgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0bXBfZXZhbHMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0bXBfZXZlY3RzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdG1wX2V2ZWN0czIgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ0bXBfZGF0YSApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZQcm9qZWN0UENBKCBjb25zdCBDdkFyciogZGF0YV9hcnIsIGNvbnN0IEN2QXJyKiBhdmdfYXJyLAorICAgICAgICAgICAgICBjb25zdCBDdkFyciogZWlnZW52ZWN0cywgQ3ZBcnIqIHJlc3VsdF9hcnIgKQoreworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByb2plY3RQQ0EiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqZGF0YSA9IChDdk1hdCopZGF0YV9hcnI7CisgICAgQ3ZNYXQgYXN0dWIsICphdmcgPSAoQ3ZNYXQqKWF2Z19hcnI7CisgICAgQ3ZNYXQgZXZlY3RzdHViLCAqZXZlY3RzID0gKEN2TWF0KillaWdlbnZlY3RzOworICAgIEN2TWF0IHJzdHViLCAqcmVzdWx0ID0gKEN2TWF0KilyZXN1bHRfYXJyOworICAgIEN2TWF0IGF2Z19yZXBlYXRlZDsKKyAgICBpbnQgaSwgbGVuLCBpbl9jb3VudDsKKyAgICBpbnQgZ2VtbV9mbGFncywgYXNfY29scywgY29udmVydF9kYXRhOworICAgIGludCBibG9ja19jb3VudDAsIGJsb2NrX2NvdW50LCBidWZfc2l6ZSwgZWxlbV9zaXplOworICAgIHVjaGFyKiB0bXBfZGF0YV9wdHI7CisKKyAgICBpZiggIUNWX0lTX01BVChkYXRhKSApCisgICAgICAgIENWX0NBTEwoIGRhdGEgPSBjdkdldE1hdCggZGF0YSwgJnN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChhdmcpICkKKyAgICAgICAgQ1ZfQ0FMTCggYXZnID0gY3ZHZXRNYXQoIGF2ZywgJmFzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoZXZlY3RzKSApCisgICAgICAgIENWX0NBTEwoIGV2ZWN0cyA9IGN2R2V0TWF0KCBldmVjdHMsICZldmVjdHN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChyZXN1bHQpICkKKyAgICAgICAgQ1ZfQ0FMTCggcmVzdWx0ID0gY3ZHZXRNYXQoIHJlc3VsdCwgJnJzdHViICkpOworCisgICAgaWYoIENWX01BVF9DTihkYXRhLT50eXBlKSAhPSAxIHx8IENWX01BVF9DTihhdmctPnR5cGUpICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJBbGwgdGhlIGlucHV0IGFuZCBvdXRwdXQgYXJyYXlzIG11c3QgYmUgMS1jaGFubmVsIiApOworCisgICAgaWYoIChDVl9NQVRfVFlQRShhdmctPnR5cGUpICE9IENWXzMyRkMxICYmIENWX01BVF9UWVBFKGF2Zy0+dHlwZSkgIT0gQ1ZfNjRGQzEpIHx8CisgICAgICAgICFDVl9BUkVfVFlQRVNfRVEoYXZnLCBldmVjdHMpIHx8ICFDVl9BUkVfVFlQRVNfRVEoYXZnLCByZXN1bHQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiQWxsIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGFycmF5cyAoZXhjZXB0IGZvciBkYXRhKSBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSwgMzJmQzEgb3IgNjRmQzEiICk7CisKKyAgICBpZiggKGF2Zy0+Y29scyAhPSAxIHx8IGF2Zy0+cm93cyAhPSBkYXRhLT5yb3dzKSAmJgorICAgICAgICAoYXZnLT5yb3dzICE9IDEgfHwgYXZnLT5jb2xzICE9IGRhdGEtPmNvbHMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICJUaGUgbWVhbiAoYXZlcmFnZSkgdmVjdG9yIHNob3VsZCBiZSBlaXRoZXIgMSB4IGRhdGEtPmNvbHMgb3IgZGF0YS0+cm93cyB4IDEiICk7CisKKyAgICBpZiggYXZnLT5jb2xzID09IDEgKQorICAgIHsKKyAgICAgICAgbGVuID0gZGF0YS0+cm93czsKKyAgICAgICAgaW5fY291bnQgPSBkYXRhLT5jb2xzOworCisgICAgICAgIGdlbW1fZmxhZ3MgPSBDVl9HRU1NX0FfVCArIENWX0dFTU1fQl9UOworICAgICAgICBhc19jb2xzID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbGVuID0gZGF0YS0+Y29sczsKKyAgICAgICAgaW5fY291bnQgPSBkYXRhLT5yb3dzOworCisgICAgICAgIGdlbW1fZmxhZ3MgPSBDVl9HRU1NX0JfVDsKKyAgICAgICAgYXNfY29scyA9IDA7CisgICAgfQorCisgICAgaWYoIGV2ZWN0cy0+Y29scyAhPSBsZW4gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICJFaWdlbnZlY3RvcnMgbXVzdCBiZSBzdG9yZWQgYXMgcm93cyBhbmQgYmUgb2YgdGhlIHNhbWUgc2l6ZSBhcyBpbnB1dCB2ZWN0b3JzIiApOworCisgICAgaWYoIHJlc3VsdC0+Y29scyA+IGV2ZWN0cy0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAiVGhlIG91dHB1dCBtYXRyaXggb2YgY29lZmZpY2llbnRzIG11c3QgaGF2ZSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgIgorICAgICAgICAibGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZWlnZW52ZWN0b3JzIChudW1iZXIgb2Ygcm93cyBpbiBlaWdlbnZlY3RvcnMgbWF0cml4KSIgKTsKKworICAgIGV2ZWN0cyA9IGN2R2V0Um93cyggZXZlY3RzLCAmZXZlY3RzdHViLCAwLCByZXN1bHQtPmNvbHMgKTsKKworICAgIGJsb2NrX2NvdW50MCA9ICgxIDw8IDE2KS9sZW47CisgICAgYmxvY2tfY291bnQwID0gTUFYKCBibG9ja19jb3VudDAsIDQgKTsKKyAgICBibG9ja19jb3VudDAgPSBNSU4oIGJsb2NrX2NvdW50MCwgaW5fY291bnQgKTsKKyAgICBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUoYXZnLT50eXBlKTsKKyAgICBjb252ZXJ0X2RhdGEgPSBDVl9NQVRfREVQVEgoZGF0YS0+dHlwZSkgPCBDVl9NQVRfREVQVEgoYXZnLT50eXBlKTsKKworICAgIGJ1Zl9zaXplID0gYmxvY2tfY291bnQwKmxlbiooKGJsb2NrX2NvdW50MCA+IDEpICsgMSkqZWxlbV9zaXplOworCisgICAgaWYoIGJ1Zl9zaXplIDwgQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gKHVjaGFyKiljdlN0YWNrQWxsb2MoIGJ1Zl9zaXplICk7CisgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSAodWNoYXIqKWN2QWxsb2MoIGJ1Zl9zaXplICkpOworCisgICAgdG1wX2RhdGFfcHRyID0gYnVmZmVyOworICAgIGlmKCBibG9ja19jb3VudDAgPiAxICkKKyAgICB7CisgICAgICAgIGF2Z19yZXBlYXRlZCA9IGN2TWF0KCBhc19jb2xzID8gbGVuIDogYmxvY2tfY291bnQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfY29scyA/IGJsb2NrX2NvdW50MCA6IGxlbiwgYXZnLT50eXBlLCBidWZmZXIgKTsKKyAgICAgICAgY3ZSZXBlYXQoIGF2ZywgJmF2Z19yZXBlYXRlZCApOworICAgICAgICB0bXBfZGF0YV9wdHIgKz0gYmxvY2tfY291bnQwKmxlbiplbGVtX3NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYXZnX3JlcGVhdGVkID0gKmF2ZzsKKworICAgIGZvciggaSA9IDA7IGkgPCBpbl9jb3VudDsgaSArPSBibG9ja19jb3VudCApCisgICAgeworICAgICAgICBDdk1hdCBkYXRhX3BhcnQsIG5vcm1fZGF0YSwgYXZnX3BhcnQsICpzcmMgPSAmZGF0YV9wYXJ0LCBvdXRfcGFydDsKKyAgICAgICAgCisgICAgICAgIGJsb2NrX2NvdW50ID0gTUlOKCBibG9ja19jb3VudDAsIGluX2NvdW50IC0gaSApOworICAgICAgICBpZiggYXNfY29scyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2R2V0Q29scyggZGF0YSwgJmRhdGFfcGFydCwgaSwgaSArIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICBjdkdldENvbHMoICZhdmdfcmVwZWF0ZWQsICZhdmdfcGFydCwgMCwgYmxvY2tfY291bnQgKTsKKyAgICAgICAgICAgIG5vcm1fZGF0YSA9IGN2TWF0KCBsZW4sIGJsb2NrX2NvdW50LCBhdmctPnR5cGUsIHRtcF9kYXRhX3B0ciApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3ZHZXRSb3dzKCBkYXRhLCAmZGF0YV9wYXJ0LCBpLCBpICsgYmxvY2tfY291bnQgKTsKKyAgICAgICAgICAgIGN2R2V0Um93cyggJmF2Z19yZXBlYXRlZCwgJmF2Z19wYXJ0LCAwLCBibG9ja19jb3VudCApOworICAgICAgICAgICAgbm9ybV9kYXRhID0gY3ZNYXQoIGJsb2NrX2NvdW50LCBsZW4sIGF2Zy0+dHlwZSwgdG1wX2RhdGFfcHRyICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggY29udmVydF9kYXRhICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZDb252ZXJ0KCBzcmMsICZub3JtX2RhdGEgKTsKKyAgICAgICAgICAgIHNyYyA9ICZub3JtX2RhdGE7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGN2U3ViKCBzcmMsICZhdmdfcGFydCwgJm5vcm1fZGF0YSApOworCisgICAgICAgIGN2R2V0Um93cyggcmVzdWx0LCAmb3V0X3BhcnQsIGksIGkgKyBibG9ja19jb3VudCApOworICAgICAgICBjdkdFTU0oICZub3JtX2RhdGEsIGV2ZWN0cywgMSwgMCwgMCwgJm91dF9wYXJ0LCBnZW1tX2ZsYWdzICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2QmFja1Byb2plY3RQQ0EoIGNvbnN0IEN2QXJyKiBwcm9qX2FyciwgY29uc3QgQ3ZBcnIqIGF2Z19hcnIsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogZWlnZW52ZWN0cywgQ3ZBcnIqIHJlc3VsdF9hcnIgKQoreworICAgIHVjaGFyKiBidWZmZXIgPSAwOworICAgIGludCBsb2NhbF9hbGxvYyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByb2plY3RQQ0EiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBwc3R1YiwgKmRhdGEgPSAoQ3ZNYXQqKXByb2pfYXJyOworICAgIEN2TWF0IGFzdHViLCAqYXZnID0gKEN2TWF0KilhdmdfYXJyOworICAgIEN2TWF0IGV2ZWN0c3R1YiwgKmV2ZWN0cyA9IChDdk1hdCopZWlnZW52ZWN0czsKKyAgICBDdk1hdCByc3R1YiwgKnJlc3VsdCA9IChDdk1hdCopcmVzdWx0X2FycjsKKyAgICBDdk1hdCBhdmdfcmVwZWF0ZWQ7CisgICAgaW50IGksIGxlbiwgaW5fY291bnQsIGFzX2NvbHM7CisgICAgaW50IGJsb2NrX2NvdW50MCwgYmxvY2tfY291bnQsIGJ1Zl9zaXplLCBlbGVtX3NpemU7CisKKyAgICBpZiggIUNWX0lTX01BVChkYXRhKSApCisgICAgICAgIENWX0NBTEwoIGRhdGEgPSBjdkdldE1hdCggZGF0YSwgJnBzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoYXZnKSApCisgICAgICAgIENWX0NBTEwoIGF2ZyA9IGN2R2V0TWF0KCBhdmcsICZhc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKGV2ZWN0cykgKQorICAgICAgICBDVl9DQUxMKCBldmVjdHMgPSBjdkdldE1hdCggZXZlY3RzLCAmZXZlY3RzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQocmVzdWx0KSApCisgICAgICAgIENWX0NBTEwoIHJlc3VsdCA9IGN2R2V0TWF0KCByZXN1bHQsICZyc3R1YiApKTsKKworICAgIGlmKCAoQ1ZfTUFUX1RZUEUoYXZnLT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShhdmctPnR5cGUpICE9IENWXzY0RkMxKSB8fAorICAgICAgICAhQ1ZfQVJFX1RZUEVTX0VRKGF2ZywgZGF0YSkgfHwgIUNWX0FSRV9UWVBFU19FUShhdmcsIGV2ZWN0cykgfHwgIUNWX0FSRV9UWVBFU19FUShhdmcsIHJlc3VsdCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJBbGwgdGhlIGlucHV0IGFuZCBvdXRwdXQgYXJyYXlzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLCAzMmZDMSBvciA2NGZDMSIgKTsKKworICAgIGlmKCAoYXZnLT5jb2xzICE9IDEgfHwgYXZnLT5yb3dzICE9IHJlc3VsdC0+cm93cykgJiYKKyAgICAgICAgKGF2Zy0+cm93cyAhPSAxIHx8IGF2Zy0+Y29scyAhPSByZXN1bHQtPmNvbHMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICJUaGUgbWVhbiAoYXZlcmFnZSkgdmVjdG9yIHNob3VsZCBiZSBlaXRoZXIgMSB4IHJlc3VsdC0+Y29scyBvciByZXN1bHQtPnJvd3MgeCAxIiApOworCisgICAgaWYoIGF2Zy0+Y29scyA9PSAxICkKKyAgICB7CisgICAgICAgIGxlbiA9IHJlc3VsdC0+cm93czsKKyAgICAgICAgaW5fY291bnQgPSByZXN1bHQtPmNvbHM7CisgICAgICAgIGFzX2NvbHMgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBsZW4gPSByZXN1bHQtPmNvbHM7CisgICAgICAgIGluX2NvdW50ID0gcmVzdWx0LT5yb3dzOworICAgICAgICBhc19jb2xzID0gMDsKKyAgICB9CisKKyAgICBpZiggZXZlY3RzLT5jb2xzICE9IGxlbiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgIkVpZ2VudmVjdG9ycyBtdXN0IGJlIHN0b3JlZCBhcyByb3dzIGFuZCBiZSBvZiB0aGUgc2FtZSBzaXplIGFzIHRoZSBvdXRwdXQgdmVjdG9ycyIgKTsKKworICAgIGlmKCBkYXRhLT5jb2xzID4gZXZlY3RzLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICJUaGUgaW5wdXQgbWF0cml4IG9mIGNvZWZmaWNpZW50cyBtdXN0IGhhdmUgdGhlIG51bWJlciBvZiBjb2x1bW5zICIKKyAgICAgICAgImxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIGVpZ2VudmVjdG9ycyAobnVtYmVyIG9mIHJvd3MgaW4gZWlnZW52ZWN0b3JzIG1hdHJpeCkiICk7CisKKyAgICBldmVjdHMgPSBjdkdldFJvd3MoIGV2ZWN0cywgJmV2ZWN0c3R1YiwgMCwgZGF0YS0+Y29scyApOworCisgICAgYmxvY2tfY291bnQwID0gKDEgPDwgMTYpL2xlbjsKKyAgICBibG9ja19jb3VudDAgPSBNQVgoIGJsb2NrX2NvdW50MCwgNCApOworICAgIGJsb2NrX2NvdW50MCA9IE1JTiggYmxvY2tfY291bnQwLCBpbl9jb3VudCApOworICAgIGVsZW1fc2l6ZSA9IENWX0VMRU1fU0laRShhdmctPnR5cGUpOworCisgICAgYnVmX3NpemUgPSBibG9ja19jb3VudDAqbGVuKihibG9ja19jb3VudDAgPiAxKSplbGVtX3NpemU7CisKKyAgICBpZiggYnVmX3NpemUgPCBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgeworICAgICAgICBidWZmZXIgPSAodWNoYXIqKWN2U3RhY2tBbGxvYyggTUFYKGJ1Zl9zaXplLDE2KSApOworICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKCBidWZfc2l6ZSApKTsKKworICAgIGlmKCBibG9ja19jb3VudDAgPiAxICkKKyAgICB7CisgICAgICAgIGF2Z19yZXBlYXRlZCA9IGN2TWF0KCBhc19jb2xzID8gbGVuIDogYmxvY2tfY291bnQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNfY29scyA/IGJsb2NrX2NvdW50MCA6IGxlbiwgYXZnLT50eXBlLCBidWZmZXIgKTsKKyAgICAgICAgY3ZSZXBlYXQoIGF2ZywgJmF2Z19yZXBlYXRlZCApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIGF2Z19yZXBlYXRlZCA9ICphdmc7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgaW5fY291bnQ7IGkgKz0gYmxvY2tfY291bnQgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgZGF0YV9wYXJ0LCBhdmdfcGFydCwgb3V0X3BhcnQ7CisgICAgICAgIAorICAgICAgICBibG9ja19jb3VudCA9IE1JTiggYmxvY2tfY291bnQwLCBpbl9jb3VudCAtIGkgKTsKKyAgICAgICAgY3ZHZXRSb3dzKCBkYXRhLCAmZGF0YV9wYXJ0LCBpLCBpICsgYmxvY2tfY291bnQgKTsKKworICAgICAgICBpZiggYXNfY29scyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2R2V0Q29scyggcmVzdWx0LCAmb3V0X3BhcnQsIGksIGkgKyBibG9ja19jb3VudCApOworICAgICAgICAgICAgY3ZHZXRDb2xzKCAmYXZnX3JlcGVhdGVkLCAmYXZnX3BhcnQsIDAsIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICBjdkdFTU0oIGV2ZWN0cywgJmRhdGFfcGFydCwgMSwgJmF2Z19wYXJ0LCAxLCAmb3V0X3BhcnQsIENWX0dFTU1fQV9UICsgQ1ZfR0VNTV9CX1QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2R2V0Um93cyggcmVzdWx0LCAmb3V0X3BhcnQsIGksIGkgKyBibG9ja19jb3VudCApOworICAgICAgICAgICAgY3ZHZXRSb3dzKCAmYXZnX3JlcGVhdGVkLCAmYXZnX3BhcnQsIDAsIGJsb2NrX2NvdW50ICk7CisgICAgICAgICAgICBjdkdFTU0oICZkYXRhX3BhcnQsIGV2ZWN0cywgMSwgJmF2Z19wYXJ0LCAxLCAmb3V0X3BhcnQsIDAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7Cit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4bWVhbi5jcHAgYi9jeGNvcmUvc3JjL2N4bWVhbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5MWYwNAotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3htZWFuLmNwcApAQCAtMCwwICsxLDQ4MSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbiB2YWx1ZSBvdmVyIHRoZSByZWdpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9NRUFOX0NBU0VfQzEoIGxlbiApICAgICAgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gMjsgeCArPSAyICkgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW3hdICkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHMwICs9IHNyY1t4XSwgcGl4Kys7ICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbeCsxXSApICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMCArPSBzcmNbeCsxXSwgcGl4Kys7ICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCsrICkgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMwICs9IHNyY1t4XSwgcGl4KysKKworCisjZGVmaW5lIElDVl9NRUFOX0NBU0VfQzIoIGxlbiApICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gc3JjW3gqMl07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMxICs9IHNyY1t4KjIrMV07ICAgICAgICAgICBcCisgICAgICAgICAgICBwaXgrKzsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKworI2RlZmluZSBJQ1ZfTUVBTl9DQVNFX0MzKCBsZW4gKSAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4KysgKSAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW3hdICkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMwICs9IHNyY1t4KjNdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMSArPSBzcmNbeCozKzFdOyAgICAgICAgICAgXAorICAgICAgICAgICAgczIgKz0gc3JjW3gqMysyXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBpeCsrOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworCisjZGVmaW5lIElDVl9NRUFOX0NBU0VfQzQoIGxlbiApICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gc3JjW3gqNF07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMxICs9IHNyY1t4KjQrMV07ICAgICAgICAgICBcCisgICAgICAgICAgICBzMiArPSBzcmNbeCo0KzJdOyAgICAgICAgICAgXAorICAgICAgICAgICAgczMgKz0gc3JjW3gqNCszXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBpeCsrOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworCisjZGVmaW5lIElDVl9NRUFOX0NPSV9DQVNFKCBsZW4sIGNuICkgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gMjsgeCArPSAyICkgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW3hdICkgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIHMwICs9IHNyY1t4KihjbildLCBwaXgrKzsgIFwKKyAgICAgICAgaWYoIG1hc2tbeCsxXSApICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMCs9c3JjWyh4KzEpKihjbildLCBwaXgrKzsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCsrICkgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMwICs9IHNyY1t4KihjbildLCBwaXgrKzsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBlbnRyeSBtYWNyb3MgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJQ1ZfTUVBTl9FTlRSWV9DT01NT04oKSAgICAgICAgIFwKKyAgICBpbnQgcGl4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0MxKCBzdW10eXBlICkgICAgXAorICAgIHN1bXR5cGUgczAgPSAwOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0MyKCBzdW10eXBlICkgICAgXAorICAgIHN1bXR5cGUgczAgPSAwLCBzMSA9IDA7ICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0MzKCBzdW10eXBlICkgICAgXAorICAgIHN1bXR5cGUgczAgPSAwLCBzMSA9IDAsIHMyID0gMDsgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0M0KCBzdW10eXBlICkgICAgICAgIFwKKyAgICBzdW10eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsgXAorICAgIElDVl9NRUFOX0VOVFJZX0NPTU1PTigpCisKKworI2RlZmluZSBJQ1ZfTUVBTl9FTlRSWV9CTE9DS19DT01NT04oIGJsb2NrX3NpemUgKSBcCisgICAgaW50IHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0JMT0NLX0MxKCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApXAorICAgIHN1bXR5cGUgc3VtMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBzMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRU5UUllfQkxPQ0tfQ09NTU9OKCBibG9ja19zaXplICkKKworI2RlZmluZSBJQ1ZfTUVBTl9FTlRSWV9CTE9DS19DMiggc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKVwKKyAgICBzdW10eXBlIHN1bTAgPSAwLCBzdW0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgczAgPSAwLCBzMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKyNkZWZpbmUgSUNWX01FQU5fRU5UUllfQkxPQ0tfQzMoIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplIClcCisgICAgc3VtdHlwZSBzdW0wID0gMCwgc3VtMSA9IDAsIHN1bTIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9CTE9DS19DT01NT04oIGJsb2NrX3NpemUgKQorCisjZGVmaW5lIElDVl9NRUFOX0VOVFJZX0JMT0NLX0M0KCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApXAorICAgIHN1bXR5cGUgc3VtMCA9IDAsIHN1bTEgPSAwLCBzdW0yID0gMCwgc3VtMyA9IDA7ICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7ICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRU5UUllfQkxPQ0tfQ09NTU9OKCBibG9ja19zaXplICkKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZXhpdCBtYWNyb3MgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJQ1ZfTUVBTl9FWElUX0NPTU1PTigpICAgICAgICAgIFwKKyAgICBkb3VibGUgc2NhbGUgPSBwaXggPyAxLi9waXggOiAwCisKKyNkZWZpbmUgSUNWX01FQU5fRVhJVF9DMSggdG1wICkgICAgICAgICBcCisgICAgSUNWX01FQU5fRVhJVF9DT01NT04oKTsgICAgICAgICAgICAgXAorICAgIG1lYW5bMF0gPSBzY2FsZSooZG91YmxlKXRtcCMjMAorCisjZGVmaW5lIElDVl9NRUFOX0VYSVRfQzIoIHRtcCApICAgICAgICAgXAorICAgIElDVl9NRUFOX0VYSVRfQ09NTU9OKCk7ICAgICAgICAgICAgIFwKKyAgICBkb3VibGUgdDAgPSBzY2FsZSooZG91YmxlKXRtcCMjMDsgICBcCisgICAgZG91YmxlIHQxID0gc2NhbGUqKGRvdWJsZSl0bXAjIzE7ICAgXAorICAgIG1lYW5bMF0gPSB0MDsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZWFuWzFdID0gdDEKKworI2RlZmluZSBJQ1ZfTUVBTl9FWElUX0MzKCB0bXAgKSAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FWElUX0NPTU1PTigpOyAgICAgICAgICAgICBcCisgICAgZG91YmxlIHQwID0gc2NhbGUqKGRvdWJsZSl0bXAjIzA7ICAgXAorICAgIGRvdWJsZSB0MSA9IHNjYWxlKihkb3VibGUpdG1wIyMxOyAgIFwKKyAgICBkb3VibGUgdDIgPSBzY2FsZSooZG91YmxlKXRtcCMjMjsgICBcCisgICAgbWVhblswXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lYW5bMV0gPSB0MTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtZWFuWzJdID0gdDIKKworI2RlZmluZSBJQ1ZfTUVBTl9FWElUX0M0KCB0bXAgKSAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FWElUX0NPTU1PTigpOyAgICAgICAgICAgICBcCisgICAgZG91YmxlIHQwID0gc2NhbGUqKGRvdWJsZSl0bXAjIzA7ICAgXAorICAgIGRvdWJsZSB0MSA9IHNjYWxlKihkb3VibGUpdG1wIyMxOyAgIFwKKyAgICBtZWFuWzBdID0gdDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWVhblsxXSA9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHQwID0gc2NhbGUqKGRvdWJsZSl0bXAjIzI7ICAgICAgICAgIFwKKyAgICB0MSA9IHNjYWxlKihkb3VibGUpdG1wIyMzOyAgICAgICAgICBcCisgICAgbWVhblsyXSA9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1lYW5bM10gPSB0MQorCisjZGVmaW5lIElDVl9NRUFOX0VYSVRfQkxPQ0tfQzEoKSAgICBcCisgICAgc3VtMCArPSBzMDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRVhJVF9DMSggc3VtICkKKworI2RlZmluZSBJQ1ZfTUVBTl9FWElUX0JMT0NLX0MyKCkgICAgXAorICAgIHN1bTAgKz0gczA7IHN1bTEgKz0gczE7ICAgICAgICAgXAorICAgIElDVl9NRUFOX0VYSVRfQzIoIHN1bSApCisKKyNkZWZpbmUgSUNWX01FQU5fRVhJVF9CTE9DS19DMygpICAgIFwKKyAgICBzdW0wICs9IHMwOyBzdW0xICs9IHMxOyAgICAgICAgIFwKKyAgICBzdW0yICs9IHMyOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FWElUX0MzKCBzdW0gKQorCisjZGVmaW5lIElDVl9NRUFOX0VYSVRfQkxPQ0tfQzQoKSAgICBcCisgICAgc3VtMCArPSBzMDsgc3VtMSArPSBzMTsgICAgICAgICBcCisgICAgc3VtMiArPSBzMjsgc3VtMyArPSBzMzsgICAgICAgICBcCisgICAgSUNWX01FQU5fRVhJVF9DNCggc3VtICkKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdXBkYXRlIG1hY3JvcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX01FQU5fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApXAorICAgIHJlbWFpbmluZyA9IGJsb2NrX3NpemUKKworI2RlZmluZSBJQ1ZfTUVBTl9VUERBVEVfQzEoIGJsb2NrX3NpemUgKSAgICBcCisgICAgSUNWX01FQU5fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgIFwKKyAgICBzdW0wICs9IHMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gMAorCisjZGVmaW5lIElDVl9NRUFOX1VQREFURV9DMiggYmxvY2tfc2l6ZSApICAgIFwKKyAgICBJQ1ZfTUVBTl9VUERBVEVfQ09NTU9OKCBibG9ja19zaXplICk7ICAgXAorICAgIHN1bTAgKz0gczA7IHN1bTEgKz0gczE7ICAgICAgICAgICAgICAgICBcCisgICAgczAgPSBzMSA9IDAKKworI2RlZmluZSBJQ1ZfTUVBTl9VUERBVEVfQzMoIGJsb2NrX3NpemUgKSAgICBcCisgICAgSUNWX01FQU5fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgIFwKKyAgICBzdW0wICs9IHMwOyBzdW0xICs9IHMxOyBzdW0yICs9IHMyOyAgICAgXAorICAgIHMwID0gczEgPSBzMiA9IDAKKworI2RlZmluZSBJQ1ZfTUVBTl9VUERBVEVfQzQoIGJsb2NrX3NpemUgKSAgICBcCisgICAgSUNWX01FQU5fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgIFwKKyAgICBzdW0wICs9IHMwOyBzdW0xICs9IHMxOyAgICAgICAgICAgICAgICAgXAorICAgIHN1bTIgKz0gczI7IHN1bTMgKz0gczM7ICAgICAgICAgICAgICAgICBcCisgICAgczAgPSBzMSA9IHMyID0gczMgPSAwCisKKworI2RlZmluZSBJQ1ZfSU1QTF9NRUFOX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgY24sICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlLCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZNZWFuXyMjZmxhdm9yIyNfQyMjY24jI01SLCAgICAgICAgICAgXAorICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBtZWFuICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzcmMsIHN0ZXAsIG1hc2ssIG1hc2tzdGVwLCBzaXplLCBtZWFuKSkgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRU5UUllfQkxPQ0tfQyMjY24oIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX01FQU5fQ0FTRV9DIyNjbiggbGltaXQgKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElDVl9NRUFOX1VQREFURV9DIyNjbiggYmxvY2tfc2l6ZSApOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBJQ1ZfTUVBTl9FWElUX0JMT0NLX0MjI2NuKCk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9JTVBMX01FQU5fRlVOQ18yRCggZmxhdm9yLCBjbiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFycnR5cGUsIHN1bXR5cGUsIHdvcmt0eXBlICkgICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdk1lYW5fIyNmbGF2b3IjI19DIyNjbiMjTVIsICAgICAgICAgICBcCisgICAgKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG1lYW4pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNyYywgc3RlcCwgbWFzaywgbWFza3N0ZXAsIHNpemUsIG1lYW4pKSAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9FTlRSWV9DIyNjbiggc3VtdHlwZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3RlcCwgbWFzayArPSBtYXNrc3RlcCApICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfTUVBTl9DQVNFX0MjI2NuKCBzaXplLndpZHRoICk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgSUNWX01FQU5fRVhJVF9DIyNjbiggcyApOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfSU1QTF9NRUFOX0JMT0NLX0ZVTkNfMkRfQ09JKCBmbGF2b3IsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJydHlwZSwgc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TWVhbl8jI2ZsYXZvciMjX0NuQ01SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29pLCBkb3VibGUqIG1lYW4gKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRU5UUllfQkxPQ0tfQzEoIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICk7ICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlKCB4IDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBsaW1pdCA9IE1JTiggcmVtYWluaW5nLCBzaXplLndpZHRoIC0geCApOyAgICAgICBcCisgICAgICAgICAgICByZW1haW5pbmcgLT0gbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGltaXQgKz0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9NRUFOX0NPSV9DQVNFKCBsaW1pdCwgY24gKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBJQ1ZfTUVBTl9VUERBVEVfQzEoIGJsb2NrX3NpemUgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgSUNWX01FQU5fRVhJVF9CTE9DS19DMSgpOyB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfSU1QTF9NRUFOX0ZVTkNfMkRfQ09JKCBmbGF2b3IsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJ0eXBlLCBzdW10eXBlLCB3b3JrdHlwZSApICAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2TWVhbl8jI2ZsYXZvciMjX0NuQ01SKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29pLCBkb3VibGUqIG1lYW4gKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fRU5UUllfQzEoIHN1bXR5cGUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9NRUFOX0NPSV9DQVNFKCBzaXplLndpZHRoLCBjbiApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyBJQ1ZfTUVBTl9FWElUX0MxKCBzICk7IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9JTVBMX01FQU5fQkxPQ0tfQUxMKCBmbGF2b3IsIGFycnR5cGUsIHN1bXR5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgIFwKKyAgICBJQ1ZfSU1QTF9NRUFOX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgMSwgYXJydHlwZSwgc3VtdHlwZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgXAorICAgIElDVl9JTVBMX01FQU5fQkxPQ0tfRlVOQ18yRCggZmxhdm9yLCAyLCBhcnJ0eXBlLCBzdW10eXBlLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICBcCisgICAgSUNWX0lNUExfTUVBTl9CTE9DS19GVU5DXzJEKCBmbGF2b3IsIDMsIGFycnR5cGUsIHN1bXR5cGUsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgIFwKKyAgICBJQ1ZfSU1QTF9NRUFOX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgNCwgYXJydHlwZSwgc3VtdHlwZSwgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgXAorICAgIElDVl9JTVBMX01FQU5fQkxPQ0tfRlVOQ18yRF9DT0koIGZsYXZvciwgYXJydHlwZSwgc3VtdHlwZSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBibG9ja19zaXplICkKKworI2RlZmluZSBJQ1ZfSU1QTF9NRUFOX0FMTCggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCB3b3JrdHlwZSApICAgICBcCisgICAgSUNWX0lNUExfTUVBTl9GVU5DXzJEKCBmbGF2b3IsIDEsIGFycnR5cGUsIHN1bXR5cGUsIHdvcmt0eXBlICkgIFwKKyAgICBJQ1ZfSU1QTF9NRUFOX0ZVTkNfMkQoIGZsYXZvciwgMiwgYXJydHlwZSwgc3VtdHlwZSwgd29ya3R5cGUgKSAgXAorICAgIElDVl9JTVBMX01FQU5fRlVOQ18yRCggZmxhdm9yLCAzLCBhcnJ0eXBlLCBzdW10eXBlLCB3b3JrdHlwZSApICBcCisgICAgSUNWX0lNUExfTUVBTl9GVU5DXzJEKCBmbGF2b3IsIDQsIGFycnR5cGUsIHN1bXR5cGUsIHdvcmt0eXBlICkgIFwKKyAgICBJQ1ZfSU1QTF9NRUFOX0ZVTkNfMkRfQ09JKCBmbGF2b3IsIGFycnR5cGUsIHN1bXR5cGUsIHdvcmt0eXBlICkKKworSUNWX0lNUExfTUVBTl9CTE9DS19BTEwoIDh1LCB1Y2hhciwgaW50NjQsIHVuc2lnbmVkLCAxIDw8IDI0ICkKK0lDVl9JTVBMX01FQU5fQkxPQ0tfQUxMKCAxNnUsIHVzaG9ydCwgaW50NjQsIHVuc2lnbmVkLCAxIDw8IDE2ICkKK0lDVl9JTVBMX01FQU5fQkxPQ0tfQUxMKCAxNnMsIHNob3J0LCBpbnQ2NCwgaW50LCAxIDw8IDE2ICkKK0lDVl9JTVBMX01FQU5fQUxMKCAzMnMsIGludCwgZG91YmxlLCBkb3VibGUgKQorSUNWX0lNUExfTUVBTl9BTEwoIDMyZiwgZmxvYXQsIGRvdWJsZSwgZG91YmxlICkKK0lDVl9JTVBMX01FQU5fQUxMKCA2NGYsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUgKQorCisjZGVmaW5lIGljdk1lYW5fOHNfQzFNUiAwCisjZGVmaW5lIGljdk1lYW5fOHNfQzJNUiAwCisjZGVmaW5lIGljdk1lYW5fOHNfQzNNUiAwCisjZGVmaW5lIGljdk1lYW5fOHNfQzRNUiAwCisjZGVmaW5lIGljdk1lYW5fOHNfQ25DTVIgMAorCitDVl9ERUZfSU5JVF9CSUdfRlVOQ19UQUJfMkQoIE1lYW4sIE1SICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBNZWFuLCBDbkNNUiApCisKK0NWX0lNUEwgIEN2U2NhbGFyCitjdkF2ZyggY29uc3Qgdm9pZCogaW1nLCBjb25zdCB2b2lkKiBtYXNrYXJyICkKK3sKKyAgICBDdlNjYWxhciBtZWFuID0ge3swLDAsMCwwfX07CisKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgbWVhbl90YWI7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG1lYW5jb2lfdGFiOworICAgIHN0YXRpYyBpbnQgaW5pdHRhYiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZBdmciKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2l6ZSBzaXplOworICAgIGRvdWJsZSBzY2FsZTsKKworICAgIGlmKCAhbWFza2FyciApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtZWFuID0gY3ZTdW0oaW1nKSk7CisgICAgICAgIHNpemUgPSBjdkdldFNpemUoIGltZyApOworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzY2FsZSA9IHNpemUud2lkdGggPyAxLi9zaXplLndpZHRoIDogMDsKKworICAgICAgICBtZWFuLnZhbFswXSAqPSBzY2FsZTsKKyAgICAgICAgbWVhbi52YWxbMV0gKj0gc2NhbGU7CisgICAgICAgIG1lYW4udmFsWzJdICo9IHNjYWxlOworICAgICAgICBtZWFuLnZhbFszXSAqPSBzY2FsZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IHR5cGUsIGNvaSA9IDA7CisgICAgICAgIGludCBtYXRfc3RlcCwgbWFza19zdGVwOworCisgICAgICAgIEN2TWF0IHN0dWIsIG1hc2tzdHViLCAqbWF0ID0gKEN2TWF0KilpbWcsICptYXNrID0gKEN2TWF0KiltYXNrYXJyOworCisgICAgICAgIGlmKCAhaW5pdHRhYiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGljdkluaXRNZWFuTVJUYWJsZSggJm1lYW5fdGFiICk7CisgICAgICAgICAgICBpY3ZJbml0TWVhbkNuQ01SVGFibGUoICZtZWFuY29pX3RhYiApOworICAgICAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiggIUNWX0lTX01BVChtYXQpICkKKyAgICAgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG1hc2spICkKKyAgICAgICAgICAgIENWX0NBTEwoIG1hc2sgPSBjdkdldE1hdCggbWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFTS19BUlIobWFzaykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssICIiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdCwgbWFzayApICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworICAgICAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKworICAgICAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKyAgICAgICAgbWFza19zdGVwID0gbWFzay0+c3RlcDsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSAmIG1hc2stPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIG1hdF9zdGVwID0gbWFza19zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICB9CisKKyAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA9PSAxIHx8IGNvaSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGdW5jMkRfMkExUCBmdW5jOworCisgICAgICAgICAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID4gNCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgaW5wdXQgYXJyYXkgbXVzdCBoYXZlIGF0IG1vc3QgNCBjaGFubmVscyB1bmxlc3MgQ09JIGlzIHNldCIgKTsKKworICAgICAgICAgICAgZnVuYyA9IChDdkZ1bmMyRF8yQTFQKShtZWFuX3RhYi5mbl8yZFt0eXBlXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBtYXNrLT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zdGVwLCBzaXplLCBtZWFuLnZhbCApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RnVuYzJEbkNfMkExUCBmdW5jID0gKEN2RnVuYzJEbkNfMkExUCkoCisgICAgICAgICAgICAgICAgbWVhbmNvaV90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBtYXNrLT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zdGVwLCBzaXplLCBDVl9NQVRfQ04odHlwZSksIGNvaSwgbWVhbi52YWwgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuICBtZWFuOworfQorCisvKiAgRW5kIG9mIGZpbGUgICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4bWVhbnNkdi5jcHAgYi9jeGNvcmUvc3JjL2N4bWVhbnNkdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1NzYzOAotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3htZWFuc2R2LmNwcApAQCAtMCwwICsxLDc5OSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVhbiBhbmQgU3RkRGV2IGNhbGN1bGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfQ09JX0NBU0UoIHdvcmt0eXBlLCBzcXN1bXR5cGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXJfbWFjcm8sIGxlbiwgY24gKSBcCisgICAgZm9yKCA7IHggPD0gKGxlbikgLSA0Kihjbik7IHggKz0gNCooY24pKVwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IHNyY1t4XTsgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIHQxID0gc3JjW3ggKyAoY24pXTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzMCAgKz0gdDAgKyB0MTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxMCArPSAoc3FzdW10eXBlKShzcXJfbWFjcm8odDApKSArIFwKKyAgICAgICAgICAgICAgIChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MSkpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gc3JjW3ggKyAyKihjbildOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSBzcmNbeCArIDMqKGNuKV07ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICArPSB0MCArIHQxOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3EwICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MCkpICsgXAorICAgICAgICAgICAgICAgKHNxc3VtdHlwZSkoc3FyX21hY3JvKHQxKSk7ICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHggKz0gKGNuKSApICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDAgPSBzcmNbeF07ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3EwICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MCkpOyAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9NRUFOX1NEVl9DQVNFX0MxKCB3b3JrdHlwZSwgc3FzdW10eXBlLCBzcXJfbWFjcm8sIGxlbiApIFwKKyAgICBJQ1ZfTUVBTl9TRFZfQ09JX0NBU0UoIHdvcmt0eXBlLCBzcXN1bXR5cGUsIHNxcl9tYWNybywgbGVuLCAxICkKKworCisjZGVmaW5lIElDVl9NRUFOX1NEVl9DQVNFX0MyKCB3b3JrdHlwZSwgc3FzdW10eXBlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXJfbWFjcm8sIGxlbiApIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4ICs9IDIgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIHQwID0gKHNyYylbeF07ICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDEgPSAoc3JjKVt4ICsgMV07ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3EwICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MCkpOyAgXAorICAgICAgICBzMSArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxMSArPSAoc3FzdW10eXBlKShzcXJfbWFjcm8odDEpKTsgIFwKKyAgICB9CisKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfQ0FTRV9DMyggd29ya3R5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FyX21hY3JvLCBsZW4gKSBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCArPSAzICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IChzcmMpW3hdOyAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIHQxID0gKHNyYylbeCArIDFdOyAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDIgPSAoc3JjKVt4ICsgMl07ICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3EwICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MCkpOyAgXAorICAgICAgICBzMSArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxMSArPSAoc3FzdW10eXBlKShzcXJfbWFjcm8odDEpKTsgIFwKKyAgICAgICAgczIgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcTIgKz0gKHNxc3VtdHlwZSkoc3FyX21hY3JvKHQyKSk7ICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0NBU0VfQzQoIHdvcmt0eXBlLCBzcXN1bXR5cGUsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcl9tYWNybywgbGVuICkgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHggKz0gNCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjKVt4XTsgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MSA9IChzcmMpW3ggKyAxXTsgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcTAgKz0gKHNxc3VtdHlwZSkoc3FyX21hY3JvKHQwKSk7ICBcCisgICAgICAgIHMxICs9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ExICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MSkpOyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gKHNyYylbeCArIDJdOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSAoc3JjKVt4ICsgM107ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMyICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3EyICs9IChzcXN1bXR5cGUpKHNxcl9tYWNybyh0MCkpOyAgXAorICAgICAgICBzMyArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNxMyArPSAoc3FzdW10eXBlKShzcXJfbWFjcm8odDEpKTsgIFwKKyAgICB9CisKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfTUFTS19DT0lfQ0FTRSggd29ya3R5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FyX21hY3JvLCBsZW4sIGNuICkgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gNDsgeCArPSA0ICkgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbeCooY24pXTsgcGl4Kys7ICAgICAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4KzFdICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbKHgrMSkqKGNuKV07IHBpeCsrOyAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4KzJdICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbKHgrMikqKGNuKV07IHBpeCsrOyAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4KzNdICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBzcmNbKHgrMykqKGNuKV07IHBpeCsrOyAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSBzcmNbeCooY24pXTsgcGl4Kys7ICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9NRUFOX1NEVl9NQVNLX0NBU0VfQzEoIHdvcmt0eXBlLCBzcXN1bXR5cGUsIHNxcl9tYWNybywgbGVuICkgICAgXAorICAgIElDVl9NRUFOX1NEVl9NQVNLX0NPSV9DQVNFKCB3b3JrdHlwZSwgc3FzdW10eXBlLCBzcXJfbWFjcm8sIGxlbiwgMSApCisKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfTUFTS19DQVNFX0MyKCB3b3JrdHlwZSwgc3FzdW10eXBlLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FyX21hY3JvLCBsZW4gKSAgICBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCsrICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBtYXNrW3hdICkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MCA9IHNyY1t4KjJdOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSB0MSA9IHNyY1t4KjIrMV07ICAgICAgICAgICBcCisgICAgICAgICAgICBwaXgrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMCArPSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcTAgKz0gc3FzdW10eXBlKHNxcl9tYWNybyh0MCkpOyAgICBcCisgICAgICAgICAgICBzMSArPSB0MTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzcTEgKz0gc3FzdW10eXBlKHNxcl9tYWNybyh0MSkpOyAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX01BU0tfQ0FTRV9DMyggd29ya3R5cGUsIHNxc3VtdHlwZSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcl9tYWNybywgbGVuICkgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSBzcmNbeCozXTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDEgPSBzcmNbeCozKzFdOyAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDIgPSBzcmNbeCozKzJdOyAgICAgICAgICAgXAorICAgICAgICAgICAgcGl4Kys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczAgKz0gdDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EwICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDApKTsgICAgXAorICAgICAgICAgICAgczEgKz0gdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3ExICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDEpKTsgICAgXAorICAgICAgICAgICAgczIgKz0gdDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3EyICs9IHNxc3VtdHlwZShzcXJfbWFjcm8odDIpKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9NRUFOX1NEVl9NQVNLX0NBU0VfQzQoIHdvcmt0eXBlLCBzcXN1bXR5cGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcXJfbWFjcm8sIGxlbiApICAgIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4KysgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gc3JjW3gqNF07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQxID0gc3JjW3gqNCsxXTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHBpeCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMwICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNxMCArPSBzcXN1bXR5cGUoc3FyX21hY3JvKHQwKSk7ICAgIFwKKyAgICAgICAgICAgIHMxICs9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNxMSArPSBzcXN1bXR5cGUoc3FyX21hY3JvKHQxKSk7ICAgIFwKKyAgICAgICAgICAgIHQwID0gc3JjW3gqNCsyXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQxID0gc3JjW3gqNCszXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHMyICs9IHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNxMiArPSBzcXN1bXR5cGUoc3FyX21hY3JvKHQwKSk7ICAgIFwKKyAgICAgICAgICAgIHMzICs9IHQxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNxMyArPSBzcXN1bXR5cGUoc3FyX21hY3JvKHQxKSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZW50cnkgbWFjcm9zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VOVFJZX0NPTU1PTigpICAgICAgICAgICAgICAgICBcCisgICAgaW50IHBpeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvdWJsZSBzY2FsZSwgdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihzcmNbMF0pCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VOVFJZX0MxKCBzdW10eXBlLCBzcXN1bXR5cGUgKSBcCisgICAgc3VtdHlwZSBzMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNxc3VtdHlwZSBzcTAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQ09NTU9OKCkKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfRU5UUllfQzIoIHN1bXR5cGUsIHNxc3VtdHlwZSApIFwKKyAgICBzdW10eXBlIHMwID0gMCwgczEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3FzdW10eXBlIHNxMCA9IDAsIHNxMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX1NEVl9FTlRSWV9DMyggc3VtdHlwZSwgc3FzdW10eXBlICkgXAorICAgIHN1bXR5cGUgczAgPSAwLCBzMSA9IDAsIHMyID0gMDsgICAgICAgICAgICAgICAgIFwKKyAgICBzcXN1bXR5cGUgc3EwID0gMCwgc3ExID0gMCwgc3EyID0gMDsgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VOVFJZX0NPTU1PTigpCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VOVFJZX0M0KCBzdW10eXBlLCBzcXN1bXR5cGUgKSBcCisgICAgc3VtdHlwZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwLCBzMyA9IDA7ICAgICAgICAgXAorICAgIHNxc3VtdHlwZSBzcTAgPSAwLCBzcTEgPSAwLCBzcTIgPSAwLCBzcTMgPSAwOyAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQ09NTU9OKCkKKworCisjZGVmaW5lIElDVl9NRUFOX1NEVl9FTlRSWV9CTE9DS19DT01NT04oIGJsb2NrX3NpemUgKSAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9NRUFOX1NEVl9FTlRSWV9CTE9DS19DMSggc3VtdHlwZSwgc3FzdW10eXBlLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNxd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgIFwKKyAgICBzdW10eXBlIHN1bTAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3FzdW10eXBlIHNxc3VtMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXdvcmt0eXBlIHNxMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VOVFJZX0JMT0NLX0MyKCBzdW10eXBlLCBzcXN1bXR5cGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgXAorICAgIHN1bXR5cGUgc3VtMCA9IDAsIHN1bTEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXN1bXR5cGUgc3FzdW0wID0gMCwgc3FzdW0xID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgczAgPSAwLCBzMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNxd29ya3R5cGUgc3EwID0gMCwgc3ExID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQkxPQ0tfQ09NTU9OKCBibG9ja19zaXplICkKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfRU5UUllfQkxPQ0tfQzMoIHN1bXR5cGUsIHNxc3VtdHlwZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICBcCisgICAgc3VtdHlwZSBzdW0wID0gMCwgc3VtMSA9IDAsIHN1bTIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNxc3VtdHlwZSBzcXN1bTAgPSAwLCBzcXN1bTEgPSAwLCBzcXN1bTIgPSAwOyAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBzMCA9IDAsIHMxID0gMCwgczIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3F3b3JrdHlwZSBzcTAgPSAwLCBzcTEgPSAwLCBzcTIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9CTE9DS19DT01NT04oIGJsb2NrX3NpemUgKQorCisjZGVmaW5lIElDVl9NRUFOX1NEVl9FTlRSWV9CTE9DS19DNCggc3VtdHlwZSwgc3FzdW10eXBlLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNxd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgIFwKKyAgICBzdW10eXBlIHN1bTAgPSAwLCBzdW0xID0gMCwgc3VtMiA9IDAsIHN1bTMgPSAwOyAgICAgICAgICAgICBcCisgICAgc3FzdW10eXBlIHNxc3VtMCA9IDAsIHNxc3VtMSA9IDAsIHNxc3VtMiA9IDAsIHNxc3VtMyA9IDA7ICAgXAorICAgIHdvcmt0eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXdvcmt0eXBlIHNxMCA9IDAsIHNxMSA9IDAsIHNxMiA9IDAsIHNxMyA9IDA7ICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGV4aXQgbWFjcm9zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VYSVRfQ09NTU9OKCkgICAgICAgICAgICAgIFwKKyAgICBzY2FsZSA9IHBpeCA/IDEuL3BpeCA6IDAKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIGlkeCApIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DT01NT04oKTsgICAgICAgICAgICAgICAgIFwKKyAgICBtZWFuW2lkeF0gPSB0bXAgPSBzY2FsZSooZG91YmxlKXRvdGFsIyNpZHg7IFwKKyAgICB0bXAgPSBzY2FsZSooZG91YmxlKXNxdG90YWwjI2lkeCAtIHRtcCp0bXA7IFwKKyAgICBzZHZbaWR4XSA9IHNxcnQoTUFYKHRtcCwwLikpCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VYSVRfQzEoIHRvdGFsLCBzcXRvdGFsICkgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DT01NT04oKTsgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIDAgKQorCisjZGVmaW5lIElDVl9NRUFOX1NEVl9FWElUX0MyKCB0b3RhbCwgc3F0b3RhbCApICBcCisgICAgSUNWX01FQU5fU0RWX0VYSVRfQ09NTU9OKCk7ICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VYSVRfQ04oIHRvdGFsLCBzcXRvdGFsLCAwICk7ICBcCisgICAgSUNWX01FQU5fU0RWX0VYSVRfQ04oIHRvdGFsLCBzcXRvdGFsLCAxICkKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfRVhJVF9DMyggdG90YWwsIHNxdG90YWwgKSAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0NPTU1PTigpOyAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0NOKCB0b3RhbCwgc3F0b3RhbCwgMCApOyAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0NOKCB0b3RhbCwgc3F0b3RhbCwgMSApOyAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0NOKCB0b3RhbCwgc3F0b3RhbCwgMiApCisKKyNkZWZpbmUgSUNWX01FQU5fU0RWX0VYSVRfQzQoIHRvdGFsLCBzcXRvdGFsICkgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DT01NT04oKTsgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIDAgKTsgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIDEgKTsgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIDIgKTsgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DTiggdG90YWwsIHNxdG90YWwsIDMgKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyB1cGRhdGUgbWFjcm9zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApXAorICAgIHJlbWFpbmluZyA9IGJsb2NrX3NpemUKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0MxKCBibG9ja19zaXplICkgICAgXAorICAgIElDVl9NRUFOX1NEVl9VUERBVEVfQ09NTU9OKCBibG9ja19zaXplICk7ICAgXAorICAgIHN1bTAgKz0gczA7IHNxc3VtMCArPSBzcTA7ICAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gMDsgc3EwID0gMAorCisjZGVmaW5lIElDVl9NRUFOX1NEVl9VUERBVEVfQzIoIGJsb2NrX3NpemUgKSAgICBcCisgICAgSUNWX01FQU5fU0RWX1VQREFURV9DT01NT04oIGJsb2NrX3NpemUgKTsgICBcCisgICAgc3VtMCArPSBzMDsgc3FzdW0wICs9IHNxMDsgICAgICAgICAgICAgICAgICBcCisgICAgc3VtMSArPSBzMTsgc3FzdW0xICs9IHNxMTsgICAgICAgICAgICAgICAgICBcCisgICAgczAgPSBzMSA9IDA7IHNxMCA9IHNxMSA9IDAKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0MzKCBibG9ja19zaXplICkgICAgXAorICAgIElDVl9NRUFOX1NEVl9VUERBVEVfQ09NTU9OKCBibG9ja19zaXplICk7ICAgXAorICAgIHN1bTAgKz0gczA7IHNxc3VtMCArPSBzcTA7ICAgICAgICAgICAgICAgICAgXAorICAgIHN1bTEgKz0gczE7IHNxc3VtMSArPSBzcTE7ICAgICAgICAgICAgICAgICAgXAorICAgIHN1bTIgKz0gczI7IHNxc3VtMiArPSBzcTI7ICAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gczEgPSBzMiA9IDA7IHNxMCA9IHNxMSA9IHNxMiA9IDAKKworI2RlZmluZSBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0M0KCBibG9ja19zaXplICkgICAgXAorICAgIElDVl9NRUFOX1NEVl9VUERBVEVfQ09NTU9OKCBibG9ja19zaXplICk7ICAgXAorICAgIHN1bTAgKz0gczA7IHNxc3VtMCArPSBzcTA7ICAgICAgICAgICAgICAgICAgXAorICAgIHN1bTEgKz0gczE7IHNxc3VtMSArPSBzcTE7ICAgICAgICAgICAgICAgICAgXAorICAgIHN1bTIgKz0gczI7IHNxc3VtMiArPSBzcTI7ICAgICAgICAgICAgICAgICAgXAorICAgIHN1bTMgKz0gczM7IHNxc3VtMyArPSBzcTM7ICAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gczEgPSBzMiA9IHMzID0gMDsgc3EwID0gc3ExID0gc3EyID0gc3EzID0gMAorCisKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgY24sIGFycnR5cGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DIyNjbiMjUiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoc3JjLCBzdGVwLCBzaXplLCBtZWFuLCBzZHYpICkgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQkxPQ0tfQyMjY24oIHN1bXR5cGUsIHNxc3VtdHlwZSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCAoYmxvY2tfc2l6ZSkqKGNuKSApOyAgICAgICAgICBcCisgICAgcGl4ID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IChjbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlKCB4IDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgICAgICBcCisgICAgICAgICAgICByZW1haW5pbmcgLT0gbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxpbWl0ICs9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX01FQU5fU0RWX0NBU0VfQyMjY24oIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FyX21hY3JvLCBsaW1pdCApOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgSUNWX01FQU5fU0RWX1VQREFURV9DIyNjbiggKGJsb2NrX3NpemUpKihjbikgKTsgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9VUERBVEVfQyMjY24oMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VYSVRfQyMjY24oIHN1bSwgc3FzdW0gKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX0RFRl9NRUFOX1NEVl9GVU5DXzJEKCBmbGF2b3IsIGNuLCBhcnJ0eXBlLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUgKSAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZNZWFuX1N0ZERldl8jI2ZsYXZvciMjX0MjI2NuIyNSLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBtZWFuLCBkb3VibGUqIHNkdiApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzcmMsIHN0ZXAsIHNpemUsIG1lYW4sIHNkdikgKSAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9DIyNjbiggc3VtdHlwZSwgc3FzdW10eXBlICk7ICAgICAgICAgICAgICAgICBcCisgICAgcGl4ID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IChjbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9NRUFOX1NEVl9DQVNFX0MjI2NuKCB3b3JrdHlwZSwgc3FzdW10eXBlLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NRUiwgc2l6ZS53aWR0aCApOyAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DIyNjbiggcywgc3EgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX0JMT0NLX0ZVTkNfMkRfQ09JKCBmbGF2b3IsIGFycnR5cGUsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DbkNSICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIG1lYW4sIGRvdWJsZSogc2R2ICkgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQkxPQ0tfQzEoIHN1bXR5cGUsIHNxc3VtdHlwZSwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCAoYmxvY2tfc2l6ZSkqKGNuKSApOyAgICAgICAgICBcCisgICAgcGl4ID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IChjbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgbGltaXQgPSBNSU4oIHJlbWFpbmluZywgc2l6ZS53aWR0aCAtIHggKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGltaXQgKz0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfTUVBTl9TRFZfQ09JX0NBU0UoIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FyX21hY3JvLCBsaW1pdCwgY24pOyAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHJlbWFpbmluZyA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0MxKCAoYmxvY2tfc2l6ZSkqKGNuKSApOyAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX1VQREFURV9DMSgwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DMSggc3VtLCBzcXN1bSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX0ZVTkNfMkRfQ09JKCBmbGF2b3IsIGFycnR5cGUsICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUgKVwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIGljdk1lYW5fU3RkRGV2XyMjZmxhdm9yIyNfQ25DUiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCBDdlNpemUgc2l6ZSxcCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY24sIGludCBjb2ksIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9DMSggc3VtdHlwZSwgc3FzdW10eXBlICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgcGl4ID0gc2l6ZS53aWR0aCAqIHNpemUuaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IChjbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX01FQU5fU0RWX0NPSV9DQVNFKCB3b3JrdHlwZSwgc3FzdW10eXBlLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NRUiwgc2l6ZS53aWR0aCwgY24gKTsgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0MxKCBzLCBzcSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUVBTl9TRFZfTUFTS19CTE9DS19GVU5DXzJEKCBmbGF2b3IsIGNuLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUsICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBpY3ZNZWFuX1N0ZERldl8jI2ZsYXZvciMjX0MjI2NuIyNNUiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIG1lYW4sIGRvdWJsZSogc2R2ICksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgKHNyYywgc3RlcCwgbWFzaywgbWFza3N0ZXAsIHNpemUsIG1lYW4sIHNkdikpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VOVFJZX0JMT0NLX0MjI2NuKCBzdW10eXBlLCBzcXN1bXR5cGUsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNxd29ya3R5cGUsIGJsb2NrX3NpemUgKTsgICAgICAgICAgICAgXAorICAgIHBpeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgbGltaXQgPSBNSU4oIHJlbWFpbmluZywgc2l6ZS53aWR0aCAtIHggKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGltaXQgKz0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfTUVBTl9TRFZfTUFTS19DQVNFX0MjI2NuKCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcl9tYWNybywgbGltaXQgKTsgICAgICAgXAorICAgICAgICAgICAgaWYoIHJlbWFpbmluZyA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0MjI2NuKCBibG9ja19zaXplICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX1VQREFURV9DIyNjbigwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DIyNjbiggc3VtLCBzcXN1bSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX01BU0tfRlVOQ18yRCggZmxhdm9yLCBjbiwgYXJydHlwZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlKVwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIGljdk1lYW5fU3RkRGV2XyMjZmxhdm9yIyNfQyMjY24jI01SLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAoc3JjLCBzdGVwLCBtYXNrLCBtYXNrc3RlcCwgc2l6ZSwgbWVhbiwgc2R2KSlcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRU5UUllfQyMjY24oIHN1bXR5cGUsIHNxc3VtdHlwZSApOyAgICAgICAgICAgICAgICAgXAorICAgIHBpeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX01FQU5fU0RWX01BU0tfQ0FTRV9DIyNjbiggd29ya3R5cGUsIHNxc3VtdHlwZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9TUVIsIHNpemUud2lkdGggKTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0MjI2NuKCBzLCBzcSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUVBTl9TRFZfTUFTS19CTE9DS19GVU5DXzJEX0NPSSggZmxhdm9yLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxd29ya3R5cGUsIGJsb2NrX3NpemUsIHNxcl9tYWNybyApICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3ZNZWFuX1N0ZERldl8jI2ZsYXZvciMjX0NuQ01SICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgY24sIGludCBjb2ksICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBtZWFuLCBkb3VibGUqIHNkdiApICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX01FQU5fU0RWX0VOVFJZX0JMT0NLX0MxKCBzdW10eXBlLCBzcXN1bXR5cGUsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNxd29ya3R5cGUsIGJsb2NrX3NpemUgKTsgICAgICAgICAgICAgXAorICAgIHBpeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3RlcCwgbWFzayArPSBtYXNrc3RlcCApICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggeCA8IHNpemUud2lkdGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBsaW1pdCA9IE1JTiggcmVtYWluaW5nLCBzaXplLndpZHRoIC0geCApOyAgICAgICAgICAgXAorICAgICAgICAgICAgcmVtYWluaW5nIC09IGxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9NRUFOX1NEVl9NQVNLX0NPSV9DQVNFKCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxcl9tYWNybywgbGltaXQsIGNuICk7ICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElDVl9NRUFOX1NEVl9VUERBVEVfQzEoIGJsb2NrX3NpemUgKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfVVBEQVRFX0MxKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FWElUX0MxKCBzdW0sIHNxc3VtICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUVBTl9TRFZfTUFTS19GVU5DXzJEX0NPSSggZmxhdm9yLCBhcnJ0eXBlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUgKSAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgaWN2TWVhbl9TdGREZXZfIyNmbGF2b3IjI19DbkNNUiAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIG1hc2ssIGludCBtYXNrc3RlcCwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogbWVhbiwgZG91YmxlKiBzZHYgKSAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9NRUFOX1NEVl9FTlRSWV9DMSggc3VtdHlwZSwgc3FzdW10eXBlICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgcGl4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9NRUFOX1NEVl9NQVNLX0NPSV9DQVNFKCB3b3JrdHlwZSwgc3FzdW10eXBlLCAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NRUiwgc2l6ZS53aWR0aCwgY24gKTsgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfTUVBTl9TRFZfRVhJVF9DMSggcywgc3EgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX0JMT0NLX0FMTCggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorSUNWX0RFRl9NRUFOX1NEVl9CTE9DS19GVU5DXzJEKCBmbGF2b3IsIDEsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorSUNWX0RFRl9NRUFOX1NEVl9CTE9DS19GVU5DXzJEKCBmbGF2b3IsIDIsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorSUNWX0RFRl9NRUFOX1NEVl9CTE9DS19GVU5DXzJEKCBmbGF2b3IsIDMsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorSUNWX0RFRl9NRUFOX1NEVl9CTE9DS19GVU5DXzJEKCBmbGF2b3IsIDQsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorSUNWX0RFRl9NRUFOX1NEVl9CTE9DS19GVU5DXzJEX0NPSSggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzcXdvcmt0eXBlLCBibG9ja19zaXplLCBzcXJfbWFjcm8pXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgMSwgYXJydHlwZSwgc3VtdHlwZSwgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlLCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgMiwgYXJydHlwZSwgc3VtdHlwZSwgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlLCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgMywgYXJydHlwZSwgc3VtdHlwZSwgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlLCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0JMT0NLX0ZVTkNfMkQoIGZsYXZvciwgNCwgYXJydHlwZSwgc3VtdHlwZSwgICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlLCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0JMT0NLX0ZVTkNfMkRfQ09JKCBmbGF2b3IsIGFycnR5cGUsIHN1bXR5cGUsICAgICAgXAorICAgICAgICAgICAgc3FzdW10eXBlLCB3b3JrdHlwZSwgc3F3b3JrdHlwZSwgYmxvY2tfc2l6ZSwgc3FyX21hY3JvICkKKworI2RlZmluZSBJQ1ZfREVGX01FQU5fU0RWX0FMTCggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlICkgICBcCitJQ1ZfREVGX01FQU5fU0RWX0ZVTkNfMkQoIGZsYXZvciwgMSwgYXJydHlwZSwgc3VtdHlwZSwgc3FzdW10eXBlLCB3b3JrdHlwZSApICAgIFwKK0lDVl9ERUZfTUVBTl9TRFZfRlVOQ18yRCggZmxhdm9yLCAyLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlICkgICAgXAorSUNWX0RFRl9NRUFOX1NEVl9GVU5DXzJEKCBmbGF2b3IsIDMsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUgKSAgICBcCitJQ1ZfREVGX01FQU5fU0RWX0ZVTkNfMkQoIGZsYXZvciwgNCwgYXJydHlwZSwgc3VtdHlwZSwgc3FzdW10eXBlLCB3b3JrdHlwZSApICAgIFwKK0lDVl9ERUZfTUVBTl9TRFZfRlVOQ18yRF9DT0koIGZsYXZvciwgYXJydHlwZSwgc3VtdHlwZSwgc3FzdW10eXBlLCB3b3JrdHlwZSApICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJQ1ZfREVGX01FQU5fU0RWX01BU0tfRlVOQ18yRChmbGF2b3IsIDEsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUpIFwKK0lDVl9ERUZfTUVBTl9TRFZfTUFTS19GVU5DXzJEKGZsYXZvciwgMiwgYXJydHlwZSwgc3VtdHlwZSwgc3FzdW10eXBlLCB3b3JrdHlwZSkgXAorSUNWX0RFRl9NRUFOX1NEVl9NQVNLX0ZVTkNfMkQoZmxhdm9yLCAzLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlKSBcCitJQ1ZfREVGX01FQU5fU0RWX01BU0tfRlVOQ18yRChmbGF2b3IsIDQsIGFycnR5cGUsIHN1bXR5cGUsIHNxc3VtdHlwZSwgd29ya3R5cGUpIFwKK0lDVl9ERUZfTUVBTl9TRFZfTUFTS19GVU5DXzJEX0NPSSggZmxhdm9yLCBhcnJ0eXBlLCBzdW10eXBlLCBzcXN1bXR5cGUsIHdvcmt0eXBlICkKKworCitJQ1ZfREVGX01FQU5fU0RWX0JMT0NLX0FMTCggOHUsIHVjaGFyLCBpbnQ2NCwgaW50NjQsIHVuc2lnbmVkLCB1bnNpZ25lZCwgMSA8PCAxNiwgQ1ZfU1FSXzhVICkKK0lDVl9ERUZfTUVBTl9TRFZfQkxPQ0tfQUxMKCAxNnUsIHVzaG9ydCwgaW50NjQsIGludDY0LCB1bnNpZ25lZCwgaW50NjQsIDEgPDwgMTYsIENWX1NRUiApCitJQ1ZfREVGX01FQU5fU0RWX0JMT0NLX0FMTCggMTZzLCBzaG9ydCwgaW50NjQsIGludDY0LCBpbnQsIGludDY0LCAxIDw8IDE2LCBDVl9TUVIgKQorCitJQ1ZfREVGX01FQU5fU0RWX0FMTCggMzJzLCBpbnQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUgKQorSUNWX0RFRl9NRUFOX1NEVl9BTEwoIDMyZiwgZmxvYXQsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUgKQorSUNWX0RFRl9NRUFOX1NEVl9BTEwoIDY0ZiwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlICkKKworI2RlZmluZSBpY3ZNZWFuX1N0ZERldl84c19DMVIgIDAKKyNkZWZpbmUgaWN2TWVhbl9TdGREZXZfOHNfQzJSICAwCisjZGVmaW5lIGljdk1lYW5fU3RkRGV2XzhzX0MzUiAgMAorI2RlZmluZSBpY3ZNZWFuX1N0ZERldl84c19DNFIgIDAKKyNkZWZpbmUgaWN2TWVhbl9TdGREZXZfOHNfQ25DUiAwCisKKyNkZWZpbmUgaWN2TWVhbl9TdGREZXZfOHNfQzFNUiAgMAorI2RlZmluZSBpY3ZNZWFuX1N0ZERldl84c19DMk1SICAwCisjZGVmaW5lIGljdk1lYW5fU3RkRGV2XzhzX0MzTVIgIDAKKyNkZWZpbmUgaWN2TWVhbl9TdGREZXZfOHNfQzRNUiAgMAorI2RlZmluZSBpY3ZNZWFuX1N0ZERldl84c19DbkNNUiAwCisKK0NWX0RFRl9JTklUX0JJR19GVU5DX1RBQl8yRCggTWVhbl9TdGREZXYsIFIgKQorQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIE1lYW5fU3RkRGV2LCBDbkNSICkKK0NWX0RFRl9JTklUX0JJR19GVU5DX1RBQl8yRCggTWVhbl9TdGREZXYsIE1SICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBNZWFuX1N0ZERldiwgQ25DTVIgKQorCitDVl9JTVBMICB2b2lkCitjdkF2Z1NkdiggY29uc3QgQ3ZBcnIqIGltZywgQ3ZTY2FsYXIqIF9tZWFuLCBDdlNjYWxhciogX3NkdiwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgQ3ZTY2FsYXIgbWVhbiA9IHt7MCwwLDAsMH19OworICAgIEN2U2NhbGFyIHNkdiA9IHt7MCwwLDAsMH19OworCisgICAgc3RhdGljIEN2QmlnRnVuY1RhYmxlIG1lYW5zZHZfdGFiOworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtZWFuc2R2Y29pX3RhYjsKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgbWVhbnNkdm1hc2tfdGFiOworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtZWFuc2R2bWFza2NvaV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdk1lYW5fU3RkRGV2Iik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdHlwZSwgY29pID0gMDsKKyAgICBpbnQgbWF0X3N0ZXAsIG1hc2tfc3RlcCA9IDA7CisgICAgQ3ZTaXplIHNpemU7CisgICAgQ3ZNYXQgc3R1YiwgbWFza3N0dWIsICptYXQgPSAoQ3ZNYXQqKWltZywgKm1hdG1hc2sgPSAoQ3ZNYXQqKW1hc2s7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdE1lYW5fU3RkRGV2UlRhYmxlKCAmbWVhbnNkdl90YWIgKTsKKyAgICAgICAgaWN2SW5pdE1lYW5fU3RkRGV2Q25DUlRhYmxlKCAmbWVhbnNkdmNvaV90YWIgKTsKKyAgICAgICAgaWN2SW5pdE1lYW5fU3RkRGV2TVJUYWJsZSggJm1lYW5zZHZtYXNrX3RhYiApOworICAgICAgICBpY3ZJbml0TWVhbl9TdGREZXZDbkNNUlRhYmxlKCAmbWVhbnNkdm1hc2tjb2lfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKworICAgIGlmKCAhQ1ZfSVNfTUFUKG1hdCkgKQorICAgICAgICBDVl9DQUxMKCBtYXQgPSBjdkdldE1hdCggbWF0LCAmc3R1YiwgJmNvaSApKTsKKworICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0LT50eXBlICk7CisKKyAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID4gNCAmJiBjb2kgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIGlucHV0IGFycmF5IG11c3QgaGF2ZSBhdCBtb3N0IDQgY2hhbm5lbHMgdW5sZXNzIENPSSBpcyBzZXQiICk7CisKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKworICAgIGlmKCAhbWFzayApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdC0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICAgICAgbWF0X3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID09IDEgfHwgY29pID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRF8xQTJQIGZ1bmMgPSAoQ3ZGdW5jMkRfMUEyUCkobWVhbnNkdl90YWIuZm5fMmRbdHlwZV0pOworCisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSwgbWVhbi52YWwsIHNkdi52YWwgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRG5DXzFBMlAgZnVuYyA9IChDdkZ1bmMyRG5DXzFBMlApCisgICAgICAgICAgICAgICAgKG1lYW5zZHZjb2lfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworCisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTUFUX0NOKHR5cGUpLCBjb2ksIG1lYW4udmFsLCBzZHYudmFsICkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIG1hdG1hc2sgPSBjdkdldE1hdCggbWF0bWFzaywgJm1hc2tzdHViICkpOworCisgICAgICAgIG1hc2tfc3RlcCA9IG1hdG1hc2stPnN0ZXA7CisKKyAgICAgICAgaWYoICFDVl9JU19NQVNLX0FSUiggbWF0bWFzayApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZE1hc2ssICIiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdCwgbWF0bWFzayApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICYgbWF0bWFzay0+dHlwZSApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICAgICAgbWF0X3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID09IDEgfHwgY29pID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRF8yQTJQIGZ1bmMgPSAoQ3ZGdW5jMkRfMkEyUCkobWVhbnNkdm1hc2tfdGFiLmZuXzJkW3R5cGVdKTsKKworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIG1hdG1hc2stPmRhdGEucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3N0ZXAsIHNpemUsIG1lYW4udmFsLCBzZHYudmFsICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGdW5jMkRuQ18yQTJQIGZ1bmMgPSAoQ3ZGdW5jMkRuQ18yQTJQKQorICAgICAgICAgICAgICAgIChtZWFuc2R2bWFza2NvaV90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRtYXNrLT5kYXRhLnB0ciwgbWFza19zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBDVl9NQVRfQ04odHlwZSksIGNvaSwgbWVhbi52YWwsIHNkdi52YWwgKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIF9tZWFuICkKKyAgICAgICAgKl9tZWFuID0gbWVhbjsKKworICAgIGlmKCBfc2R2ICkKKyAgICAgICAgKl9zZHYgPSBzZHY7Cit9CisKKworLyogIEVuZCBvZiBmaWxlICAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeG1pbm1heGxvYy5jcHAgYi9jeGNvcmUvc3JjL2N4bWlubWF4bG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjk4YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeG1pbm1heGxvYy5jcHAKQEAgLTAsMCArMSw0NTIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4TG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorI2RlZmluZSBDVl9NSU5NQVhMT0NfRU5UUlkoIF90b2dnbGVfLCBzcmN0eXBlLCB0ZW1wdHlwZSwgY24gKSBcCisgICAgdGVtcHR5cGUgbWluX3ZhbCwgbWF4X3ZhbDsgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG1pbl9sb2MgPSAwLCBtYXhfbG9jID0gMDsgICAgICAgICAgICAgICBcCisgICAgaW50IHgsIGxvYyA9IDAsIHdpZHRoID0gc2l6ZS53aWR0aCooY24pOyAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWluX3ZhbCA9IHNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWluX3ZhbCA9IG1heF92YWwgPSBfdG9nZ2xlXyggbWluX3ZhbCApCisKKworI2RlZmluZSBDVl9NSU5NQVhMT0NfRVhJVCggX2Zpbl9jYXN0X21hY3JvXyApICAgXAorICAgIG1pbkxvYy0+eCA9IG1pbl9sb2M7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1heExvYy0+eCA9IG1heF9sb2M7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1pbkxvYy0+eSA9IG1heExvYy0+eSA9IDA7ICAgICAgICAgICAgICAgICAgXAorICAgICptaW5WYWwgPSBfZmluX2Nhc3RfbWFjcm9fKG1pbl92YWwpOyAgICAgICAgXAorICAgICptYXhWYWwgPSBfZmluX2Nhc3RfbWFjcm9fKG1heF92YWwpOyAgICAgICAgXAorICAgIHJldHVybiBDVl9PSworCisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhMT0NfMURfQ0FTRV9DT0koIF90b2dnbGVfLCB0ZW1wdHlwZSwgY24gKSBcCisgICAgZm9yKCB4ID0gMDsgeCA8IHdpZHRoOyB4ICs9IChjbiksIGxvYysrICkgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXB0eXBlIHZhbCA9IHNyY1t4XTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHZhbCA9IF90b2dnbGVfKHZhbCk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCB2YWwgPCBtaW5fdmFsICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtaW5fdmFsID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtaW5fbG9jID0gbG9jOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgaWYoIHZhbCA+IG1heF92YWwgKSAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtYXhfdmFsID0gdmFsOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtYXhfbG9jID0gbG9jOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhMT0NfRlVOQ18yRCggX3RvZ2dsZV8sIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvciwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3R5cGUsIHRlbXB0eXBlLCBleHRydHlwZSApICAgICAgICAgICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdk1pbk1heEluZHhfIyNmbGF2b3IjI19DMVIsKCBjb25zdCBzcmN0eXBlKiBzcmMsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgICBcCisgICAgZXh0cnR5cGUqIG1pblZhbCwgZXh0cnR5cGUqIG1heFZhbCwgQ3ZQb2ludCogbWluTG9jLCBDdlBvaW50KiBtYXhMb2MgKSwgXAorICAgIChzcmMsIHN0ZXAsIHNpemUsIG1pblZhbCwgbWF4VmFsLCBtaW5Mb2MsIG1heExvYykgKSAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfTUlOTUFYTE9DX0VOVFJZKCBfdG9nZ2xlXywgc3JjdHlwZSwgdGVtcHR5cGUsIDEgKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX01JTk1BWExPQ18xRF9DQVNFX0NPSSggX3RvZ2dsZV8sIHRlbXB0eXBlLCAxICk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX01JTk1BWExPQ19FWElUKCBfZmluX2Nhc3RfbWFjcm9fICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYTE9DX0ZVTkNfMkRfQ09JKCBfdG9nZ2xlXywgX2Zpbl9jYXN0X21hY3JvXywgZmxhdm9yLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgdGVtcHR5cGUsIGV4dHJ0eXBlICkgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZNaW5NYXhJbmR4XyMjZmxhdm9yIyNfQ25DUiggY29uc3Qgc3JjdHlwZSogc3JjLCBpbnQgc3RlcCwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cnR5cGUqIG1pblZhbCwgZXh0cnR5cGUqIG1heFZhbCwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIEN2UG9pbnQqIG1pbkxvYywgQ3ZQb2ludCogbWF4TG9jICkgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoc3JjKSArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ1ZfTUlOTUFYTE9DX0VOVFJZKCBfdG9nZ2xlXywgc3JjdHlwZSwgdGVtcHR5cGUsIGNuICk7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfREVGX01JTk1BWExPQ18xRF9DQVNFX0NPSSggX3RvZ2dsZV8sIHRlbXB0eXBlLCBjbiApOyAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX01JTk1BWExPQ19FWElUKCBfZmluX2Nhc3RfbWFjcm9fICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYTE9DX0FMTF9JTlQoIGZsYXZvciwgc3JjdHlwZSwgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZmluX2Nhc3RfbWFjcm9fLCBleHRydHlwZSApIFwKKyAgICBJQ1ZfREVGX01JTk1BWExPQ19GVU5DXzJEKCBDVl9OT1AsIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvcixcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgaW50LCBleHRydHlwZSApICAgICAgICAgXAorICAgIElDVl9ERUZfTUlOTUFYTE9DX0ZVTkNfMkRfQ09JKCBDVl9OT1AsIF9maW5fY2FzdF9tYWNyb18sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF2b3IsIHNyY3R5cGUsIGludCwgZXh0cnR5cGUgKQorCitDVl9JTkxJTkUgZmxvYXQgbWlubWF4X3RvX2Zsb2F0KCBpbnQgdmFsICkKK3sKKyAgICBDdjMyc3VmIHY7CisgICAgdi5pID0gQ1ZfVE9HR0xFX0ZMVCh2YWwpOworICAgIHJldHVybiB2LmY7Cit9CisKK0NWX0lOTElORSBkb3VibGUgbWlubWF4X3RvX2RvdWJsZSggaW50NjQgdmFsICkKK3sKKyAgICBDdjY0c3VmIHY7CisgICAgdi5pID0gQ1ZfVE9HR0xFX0RCTCh2YWwpOworICAgIHJldHVybiB2LmY7Cit9CisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhMT0NfQUxMX0ZMVCggZmxhdm9yLCBzcmN0eXBlLCBfdG9nZ2xlXywgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zpbl9jYXN0X21hY3JvXywgZXh0cnR5cGUgKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfREVGX01JTk1BWExPQ19GVU5DXzJEKCBfdG9nZ2xlXywgX2Zpbl9jYXN0X21hY3JvXywgZmxhdm9yLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgc3JjdHlwZSwgZXh0cnR5cGUgKSAgICAgICAgICAgIFwKKyAgICBJQ1ZfREVGX01JTk1BWExPQ19GVU5DXzJEX0NPSSggX3RvZ2dsZV8sIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvciwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgc3JjdHlwZSwgZXh0cnR5cGUgKQorCitJQ1ZfREVGX01JTk1BWExPQ19BTExfSU5UKCA4dSwgdWNoYXIsIENWX0NBU1RfMzJGLCBmbG9hdCApCitJQ1ZfREVGX01JTk1BWExPQ19BTExfSU5UKCAxNnUsIHVzaG9ydCwgQ1ZfQ0FTVF8zMkYsIGZsb2F0ICkKK0lDVl9ERUZfTUlOTUFYTE9DX0FMTF9JTlQoIDE2cywgc2hvcnQsIENWX0NBU1RfMzJGLCBmbG9hdCApCitJQ1ZfREVGX01JTk1BWExPQ19BTExfSU5UKCAzMnMsIGludCwgQ1ZfQ0FTVF82NEYsIGRvdWJsZSApCitJQ1ZfREVGX01JTk1BWExPQ19BTExfRkxUKCAzMmYsIGludCwgQ1ZfVE9HR0xFX0ZMVCwgbWlubWF4X3RvX2Zsb2F0LCBmbG9hdCApCitJQ1ZfREVGX01JTk1BWExPQ19BTExfRkxUKCA2NGYsIGludDY0LCBDVl9UT0dHTEVfREJMLCBtaW5tYXhfdG9fZG91YmxlLCBkb3VibGUgKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pbk1heExvYyB3aXRoIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDVl9NSU5NQVhMT0NfTUFTS19FTlRSWSggX3RvZ2dsZV8sIHNyY3R5cGUsIHRlbXB0eXBlLCBjbiApICBcCisgICAgdGVtcHR5cGUgbWluX3ZhbCA9IDAsIG1heF92YWwgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbWluX2xvYyA9IC0xLCBtYXhfbG9jID0gLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCB4ID0gMCwgeSwgbG9jID0gMCwgd2lkdGggPSBzaXplLndpZHRoOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCB3aWR0aCooY24pID09IHN0ZXAgJiYgd2lkdGggPT0gbWFza1N0ZXAgKSAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2lkdGggKj0gc2l6ZS5oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzaXplLmhlaWdodCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrLCBzcmMgKz0gc3RlcCwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gbWFza1N0ZXAgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2lkdGg7IHgrKywgbG9jKysgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggbWFza1t4XSAhPSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG1pbl9sb2MgPSBtYXhfbG9jID0gbG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbWluX3ZhbCA9IChzcmMpW3gqKGNuKV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtaW5fdmFsID0gbWF4X3ZhbCA9IF90b2dnbGVfKCBtaW5fdmFsICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGdvdG8gc3RvcF9zY2FuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RvcF9zY2FuOjsKKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYTE9DXzFEX01BU0tfQ0FTRV9DT0koIF90b2dnbGVfLCB0ZW1wdHlwZSwgY24gKSBcCisgICAgZm9yKCA7IHggPCB3aWR0aDsgeCsrLCBsb2MrKyApICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcHR5cGUgdmFsID0gc3JjW3gqKGNuKV07ICAgICBcCisgICAgICAgIGludCBtID0gbWFza1t4XSAhPSAwOyAgICAgICAgICAgXAorICAgICAgICB2YWwgPSBfdG9nZ2xlXyh2YWwpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCB2YWwgPCBtaW5fdmFsICYmIG0gKSAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1pbl92YWwgPSB2YWw7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBtaW5fbG9jID0gbG9jOyAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSBpZiggdmFsID4gbWF4X3ZhbCAmJiBtICkgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbWF4X3ZhbCA9IHZhbDsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1heF9sb2MgPSBsb2M7ICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYTE9DX01BU0tfRlVOQ18yRCggX3RvZ2dsZV8sIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3R5cGUsIHRlbXB0eXBlLCBleHRydHlwZSApICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZNaW5NYXhJbmR4XyMjZmxhdm9yIyNfQzFNUiwoIGNvbnN0IHNyY3R5cGUqIHNyYywgaW50IHN0ZXAsICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza1N0ZXAsIEN2U2l6ZSBzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBleHRydHlwZSogbWluVmFsLCBleHRydHlwZSogbWF4VmFsLCBDdlBvaW50KiBtaW5Mb2MsIEN2UG9pbnQqIG1heExvYyApLCBcCisgICAgKCBzcmMsIHN0ZXAsIG1hc2ssIG1hc2tTdGVwLCBzaXplLCBtaW5WYWwsIG1heFZhbCwgbWluTG9jLCBtYXhMb2MpICkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9NSU5NQVhMT0NfTUFTS19FTlRSWSggX3RvZ2dsZV8sIHNyY3R5cGUsIHRlbXB0eXBlLCAxICk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza1N0ZXAgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfTUlOTUFYTE9DXzFEX01BU0tfQ0FTRV9DT0koIF90b2dnbGVfLCB0ZW1wdHlwZSwgMSApICAgICAgICAgXAorICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX01JTk1BWExPQ19FWElUKCBfZmluX2Nhc3RfbWFjcm9fICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfTUlOTUFYTE9DX01BU0tfRlVOQ18yRF9DT0koIF90b2dnbGVfLCBfZmluX2Nhc3RfbWFjcm9fLCAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhdm9yLCBzcmN0eXBlLCB0ZW1wdHlwZSwgZXh0cnR5cGUgKSAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3ZNaW5NYXhJbmR4XyMjZmxhdm9yIyNfQ25DTVIoIGNvbnN0IHNyY3R5cGUqIHNyYywgaW50IHN0ZXAsICAgICAgICAgICAgICAgXAorICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza1N0ZXAsIEN2U2l6ZSBzaXplLCBpbnQgY24sIGludCBjb2ksICAgICAgICAgIFwKKyAgICBleHRydHlwZSogbWluVmFsLCBleHRydHlwZSogbWF4VmFsLCBDdlBvaW50KiBtaW5Mb2MsIEN2UG9pbnQqIG1heExvYyApICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChzcmMpICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9NSU5NQVhMT0NfTUFTS19FTlRSWSggX3RvZ2dsZV8sIHNyY3R5cGUsIHRlbXB0eXBlLCBjbiApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB5IDwgc2l6ZS5oZWlnaHQ7IHkrKywgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza1N0ZXAgKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9ERUZfTUlOTUFYTE9DXzFEX01BU0tfQ0FTRV9DT0koIF90b2dnbGVfLCB0ZW1wdHlwZSwgY24gKSAgICAgICAgXAorICAgICAgICB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENWX01JTk1BWExPQ19FWElUKCBfZmluX2Nhc3RfbWFjcm9fICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhMT0NfTUFTS19BTExfSU5UKCBmbGF2b3IsIHNyY3R5cGUsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zpbl9jYXN0X21hY3JvXywgZXh0cnR5cGUgKSAgICAgICAgXAorICAgIElDVl9ERUZfTUlOTUFYTE9DX01BU0tfRlVOQ18yRCggQ1ZfTk9QLCBfZmluX2Nhc3RfbWFjcm9fLCBmbGF2b3IsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3R5cGUsIGludCwgZXh0cnR5cGUgKSAgICAgICAgICAgICAgICBcCisgICAgSUNWX0RFRl9NSU5NQVhMT0NfTUFTS19GVU5DXzJEX0NPSSggQ1ZfTk9QLCBfZmluX2Nhc3RfbWFjcm9fLCBmbGF2b3IsICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgaW50LCBleHRydHlwZSApCisKKyNkZWZpbmUgSUNWX0RFRl9NSU5NQVhMT0NfTUFTS19BTExfRkxUKCBmbGF2b3IsIHNyY3R5cGUsIF90b2dnbGVfLCAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Zpbl9jYXN0X21hY3JvXywgZXh0cnR5cGUgKSAgICAgICAgXAorICAgIElDVl9ERUZfTUlOTUFYTE9DX01BU0tfRlVOQ18yRCggX3RvZ2dsZV8sIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvciwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY3R5cGUsIHNyY3R5cGUsIGV4dHJ0eXBlICkgICAgICAgICAgICBcCisgICAgSUNWX0RFRl9NSU5NQVhMT0NfTUFTS19GVU5DXzJEX0NPSSggX3RvZ2dsZV8sIF9maW5fY2FzdF9tYWNyb18sIGZsYXZvciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjdHlwZSwgc3JjdHlwZSwgZXh0cnR5cGUgKQorCitJQ1ZfREVGX01JTk1BWExPQ19NQVNLX0FMTF9JTlQoIDh1LCB1Y2hhciwgQ1ZfQ0FTVF8zMkYsIGZsb2F0ICkKK0lDVl9ERUZfTUlOTUFYTE9DX01BU0tfQUxMX0lOVCggMTZ1LCB1c2hvcnQsIENWX0NBU1RfMzJGLCBmbG9hdCApCitJQ1ZfREVGX01JTk1BWExPQ19NQVNLX0FMTF9JTlQoIDE2cywgc2hvcnQsIENWX0NBU1RfMzJGLCBmbG9hdCApCitJQ1ZfREVGX01JTk1BWExPQ19NQVNLX0FMTF9JTlQoIDMycywgaW50LCBDVl9DQVNUXzY0RiwgZG91YmxlICkKK0lDVl9ERUZfTUlOTUFYTE9DX01BU0tfQUxMX0ZMVCggMzJmLCBpbnQsIENWX1RPR0dMRV9GTFQsIG1pbm1heF90b19mbG9hdCwgZmxvYXQgKQorSUNWX0RFRl9NSU5NQVhMT0NfTUFTS19BTExfRkxUKCA2NGYsIGludDY0LCBDVl9UT0dHTEVfREJMLCBtaW5tYXhfdG9fZG91YmxlLCBkb3VibGUgKQorCisjZGVmaW5lIGljdk1pbk1heEluZHhfOHNfQzFSICAgIDAKKyNkZWZpbmUgaWN2TWluTWF4SW5keF84c19DbkNSICAgMAorI2RlZmluZSBpY3ZNaW5NYXhJbmR4XzhzX0MxTVIgICAwCisjZGVmaW5lIGljdk1pbk1heEluZHhfOHNfQ25DTVIgIDAKKworQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIE1pbk1heEluZHgsIEMxUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTWluTWF4SW5keCwgQ25DUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTWluTWF4SW5keCwgQzFNUiApCitDVl9ERUZfSU5JVF9GVU5DX1RBQl8yRCggTWluTWF4SW5keCwgQ25DTVIgKQorCisKK0NWX0lNUEwgIHZvaWQKK2N2TWluTWF4TG9jKCBjb25zdCB2b2lkKiBpbWcsIGRvdWJsZSogX21pblZhbCwgZG91YmxlKiBfbWF4VmFsLAorICAgICAgICAgICAgIEN2UG9pbnQqIF9taW5Mb2MsIEN2UG9pbnQqIF9tYXhMb2MsIGNvbnN0IHZvaWQqIG1hc2sgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtaW5tYXhfdGFiLCBtaW5tYXhjb2lfdGFiOworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBtaW5tYXhtYXNrX3RhYiwgbWlubWF4bWFza2NvaV90YWI7CisgICAgc3RhdGljIGludCBpbml0dGFiID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdk1pbk1heExvYyIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGRlcHRoLCBjbiwgY29pID0gMDsKKyAgICBpbnQgbWF0X3N0ZXAsIG1hc2tfc3RlcCA9IDAsIGNvbnRfZmxhZzsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBDdk1hdCBzdHViLCBtYXNrc3R1YiwgKm1hdCA9IChDdk1hdCopaW1nLCAqbWF0bWFzayA9IChDdk1hdCopbWFzazsKKyAgICBDdlBvaW50IG1pbmxvYywgbWF4bG9jOworICAgIGRvdWJsZSBtaW52ID0gMCwgbWF4diA9IDA7CisgICAgZmxvYXQgbWludmYgPSAwLmYsIG1heHZmID0gMC5mOworICAgIHZvaWQgKnBtaW4gPSAmbWludmYsICpwbWF4ID0gJm1heHZmOworCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXRNaW5NYXhJbmR4QzFSVGFibGUoICZtaW5tYXhfdGFiICk7CisgICAgICAgIGljdkluaXRNaW5NYXhJbmR4Q25DUlRhYmxlKCAmbWlubWF4Y29pX3RhYiApOworICAgICAgICBpY3ZJbml0TWluTWF4SW5keEMxTVJUYWJsZSggJm1pbm1heG1hc2tfdGFiICk7CisgICAgICAgIGljdkluaXRNaW5NYXhJbmR4Q25DTVJUYWJsZSggJm1pbm1heG1hc2tjb2lfdGFiICk7CisgICAgICAgIGluaXR0YWIgPSAxOworICAgIH0KKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChtYXQpICkKKyAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIsICZjb2kgKSk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApOworICAgIGRlcHRoID0gQ1ZfTUFUX0RFUFRIKCB0eXBlICk7CisgICAgY24gPSBDVl9NQVRfQ04oIHR5cGUgKTsKKyAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQgKTsKKworICAgIGlmKCBjbiA+IDEgJiYgY29pID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiIiApOworCisgICAgaWYoIGRlcHRoID09IENWXzMyUyB8fCBkZXB0aCA9PSBDVl82NEYgKQorICAgICAgICBwbWluID0gJm1pbnYsIHBtYXggPSAmbWF4djsKKyAgICAKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKyAgICBjb250X2ZsYWcgPSBtYXQtPnR5cGU7CisKKyAgICBpZiggbWFzayApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtYXRtYXNrID0gY3ZHZXRNYXQoIG1hdG1hc2ssICZtYXNrc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXRtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWF0LCBtYXRtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAgICAgbWFza19zdGVwID0gbWF0bWFzay0+c3RlcDsKKyAgICAgICAgY29udF9mbGFnICY9IG1hdG1hc2stPnR5cGU7CisgICAgfQorCisgICAgaWYoIENWX0lTX01BVF9DT05UKGNvbnRfZmxhZykgKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIGlmKCBzaXplLmhlaWdodCA9PSAxICkKKyAgICAgICAgbWF0X3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisKKyAgICBpZiggIW1hc2sgKQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA9PSAxIHx8IGNvaSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGdW5jMkRfMUE0UCBmdW5jID0gKEN2RnVuYzJEXzFBNFApKG1pbm1heF90YWIuZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtaW4sIHBtYXgsICZtaW5sb2MsICZtYXhsb2MgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRG5DXzFBNFAgZnVuYyA9IChDdkZ1bmMyRG5DXzFBNFApKG1pbm1heGNvaV90YWIuZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIHNpemUsIGNuLCBjb2ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBtaW4sIHBtYXgsICZtaW5sb2MsICZtYXhsb2MgKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA9PSAxIHx8IGNvaSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGdW5jMkRfMkE0UCBmdW5jID0gKEN2RnVuYzJEXzJBNFApKG1pbm1heG1hc2tfdGFiLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBtYXRtYXNrLT5kYXRhLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFza19zdGVwLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbWluLCBwbWF4LCAmbWlubG9jLCAmbWF4bG9jICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGdW5jMkRuQ18yQTRQIGZ1bmMgPSAoQ3ZGdW5jMkRuQ18yQTRQKShtaW5tYXhtYXNrY29pX3RhYi5mbl8yZFtkZXB0aF0pOworCisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0bWFzay0+ZGF0YS5wdHIsIG1hc2tfc3RlcCwgc2l6ZSwgY24sIGNvaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG1pbiwgcG1heCwgJm1pbmxvYywgJm1heGxvYyApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBtYXRtYXNrIHx8IF9taW5Mb2MgfHwgX21heExvYyApCisgICAgeworICAgICAgICBpZiggbWlubG9jLnggPj0gbWF0LT5jb2xzICkKKyAgICAgICAgeworICAgICAgICAgICAgbWlubG9jLnkgPSBtaW5sb2MueCAvIG1hdC0+Y29sczsKKyAgICAgICAgICAgIG1pbmxvYy54IC09IG1pbmxvYy55ICogbWF0LT5jb2xzOworICAgICAgICB9CisKKyAgICAgICAgaWYoIG1heGxvYy54ID49IG1hdC0+Y29scyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heGxvYy55ID0gbWF4bG9jLnggLyBtYXQtPmNvbHM7CisgICAgICAgICAgICBtYXhsb2MueCAtPSBtYXhsb2MueSAqIG1hdC0+Y29sczsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYXRtYXNrICYmICgodW5zaWduZWQpbWlubG9jLnggPj0gKHVuc2lnbmVkKW1hdC0+Y29scyB8fAorICAgICAgICAgICAgKHVuc2lnbmVkKW1pbmxvYy55ID49ICh1bnNpZ25lZCltYXQtPnJvd3MgfHwKKyAgICAgICAgICAgIG1hdG1hc2stPmRhdGEucHRyW21pbmxvYy55Km1hdG1hc2stPnN0ZXAgKyBtaW5sb2MueF0gPT0gMCB8fAorICAgICAgICAgICAgKHVuc2lnbmVkKW1heGxvYy54ID49ICh1bnNpZ25lZCltYXQtPmNvbHMgfHwKKyAgICAgICAgICAgICh1bnNpZ25lZCltYXhsb2MueSA+PSAodW5zaWduZWQpbWF0LT5yb3dzIHx8CisgICAgICAgICAgICBtYXRtYXNrLT5kYXRhLnB0clttYXhsb2MueSptYXRtYXNrLT5zdGVwICsgbWF4bG9jLnhdID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgbWlubG9jLnggPSBtaW5sb2MueSA9IG1heGxvYy54ID0gbWF4bG9jLnkgPSAtMTsKKyAgICAgICAgICAgIG1pbnYgPSBtYXh2ID0gbWludmYgPSBtYXh2ZiA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiggX21pbkxvYyApCisgICAgICAgICAgICAqX21pbkxvYyA9IG1pbmxvYzsKKworICAgICAgICBpZiggX21heExvYyApCisgICAgICAgICAgICAqX21heExvYyA9IG1heGxvYzsKKyAgICB9CisKKyAgICBpZiggZGVwdGggIT0gQ1ZfMzJTICYmIGRlcHRoICE9IENWXzY0RiApCisgICAgeworICAgICAgICBtaW52ID0gbWludmY7CisgICAgICAgIG1heHYgPSBtYXh2ZjsKKyAgICB9CisKKyAgICBpZiggX21pblZhbCApCisgICAgICAgICpfbWluVmFsID0gbWludjsKKworICAgIGlmKCBfbWF4VmFsICkKKyAgICAgICAgKl9tYXhWYWwgPSBtYXh2OworCisgICAgX19FTkRfXzsKK30KKworLyogIEVuZCBvZiBmaWxlICAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeG5vcm0uY3BwIGIvY3hjb3JlL3NyYy9jeG5vcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZTI5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4bm9ybS5jcHAKQEAgLTAsMCArMSwxNDE3IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOIG8gciBtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIElDVl9OT1JNX0NBU0UoIF9vcF8sICAgICAgICAgICAgICAgIFwKKyAgICBfdXBkYXRlX29wXywgd29ya3R5cGUsIGxlbiApICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPD0gKGxlbikgLSA0OyB4ICs9IDQgKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IChzcmMpW3hdOyAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIHQxID0gKHNyYylbeCsxXTsgICAgICAgICAgIFwKKyAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MSA9IF9vcF8odDEpOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDAgKTsgICAgIFwKKyAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MSApOyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQwID0gKHNyYylbeCsyXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdDEgPSAoc3JjKVt4KzNdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9vcF8odDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX29wXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICBub3JtID0gX3VwZGF0ZV9vcF8oIG5vcm0sIHQxICk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjKVt4XTsgICAgICAgICAgICAgXAorICAgICAgICB0MCA9ICh3b3JrdHlwZSlfb3BfKHQwKTsgICAgICAgICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDAgKTsgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBJQ1ZfTk9STV9DT0lfQ0FTRSggX29wXywgICAgICAgICAgICBcCisgICAgX3VwZGF0ZV9vcF8sIHdvcmt0eXBlLCBsZW4sIGNuICkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjKVt4KihjbildOyAgICAgICAgXAorICAgICAgICB0MCA9ICh3b3JrdHlwZSlfb3BfKHQwKTsgICAgICAgICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDAgKTsgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBJQ1ZfTk9STV9ESUZGX0NBU0UoIF9vcF8sICAgICAgICAgICBcCisgICAgX3VwZGF0ZV9vcF8sIHdvcmt0eXBlLCBsZW4gKSAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gNDsgeCArPSA0ICkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjMSlbeF0gLSAoc3JjMilbeF07XAorICAgICAgICB3b3JrdHlwZSB0MSA9IChzcmMxKVt4KzFdLShzcmMyKVt4KzFdO1wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9vcF8odDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX29wXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBub3JtID0gX3VwZGF0ZV9vcF8oIG5vcm0sIHQwICk7ICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDEgKTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IChzcmMxKVt4KzJdIC0gKHNyYzIpW3grMl07ICAgICBcCisgICAgICAgIHQxID0gKHNyYzEpW3grM10gLSAoc3JjMilbeCszXTsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0MCA9IF9vcF8odDApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHQxID0gX29wXyh0MSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBub3JtID0gX3VwZGF0ZV9vcF8oIG5vcm0sIHQwICk7ICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDEgKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCsrICkgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IChzcmMxKVt4XSAtIChzcmMyKVt4XTtcCisgICAgICAgIHQwID0gKHdvcmt0eXBlKV9vcF8odDApOyAgICAgICAgICAgIFwKKyAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgIH0KKworCisjZGVmaW5lIElDVl9OT1JNX0RJRkZfQ09JX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCB3b3JrdHlwZSwgbGVuLCBjbiApIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4KysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MCA9IChzcmMxKVt4KihjbildIC0gKHNyYzIpW3gqKGNuKV07ICAgICAgICAgIFwKKyAgICAgICAgdDAgPSAod29ya3R5cGUpX29wXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisvKgorIAlUaGUgYWxnb3JpdGhtIGFuZCBpdHMgbXVsdGlwbGUgdmFyaWF0aW9ucyBiZWxvdworICAgIGJlbG93IGFjY3VtdWxhdGVzIHRoZSBub3JtIGJ5IGJsb2NrcyBvZiBzaXplICJibG9ja19zaXplIi4KKyAgICBFYWNoIGJsb2NrIG1heSBzcGFuIGFjcm9zcyBtdWx0aXBsZSBsaW5lcyBhbmQgaXQgaXMKKyAgICBub3QgbmVjZXNzYXJ5IGFsaWduZWQgYnkgcm93IGJvdW5kYXJpZXMuIFdpdGhpbiBhIGJsb2NrCisgICAgdGhlIG5vcm0gaXMgYWNjdW11bGF0ZWQgdG8gaW50ZXJtZWRpYXRlIGxpZ2h0LXdlaWdodAorICAgIHR5cGUgKHdvcmt0eXBlKS4gSXQgcmVhbGx5IG1ha2VzIHNlbnNlIGZvciA4dSwgMTZzLCAxNnUgdHlwZXMKKyAgICBhbmQgTDEgJiBMMiBub3Jtcywgd2hlcmUgd29ya3R5cGU9PWludCBhbmQgbm9ybXR5cGU9PWludDY0LgorICAgIEluIG90aGVyIGNhc2VzIGEgc2ltcGxlciBhbGdvcml0aG0gaXMgdXNlZAorKi8KKyNkZWZpbmUgIElDVl9ERUZfTk9STV9OT0hJTlRfQkxPQ0tfRlVOQ18yRCggbmFtZSwgX29wXywgX3VwZGF0ZV9vcF8sIFwKKyAgICBwb3N0X2Z1bmMsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgXAorICAgIEN2U2l6ZSBzaXplLCBkb3VibGUqIF9ub3JtICksIChzcmMsIHN0ZXAsIHNpemUsIF9ub3JtKSApICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIHRvdGFsX25vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX05PUk1fQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sIHdvcmt0eXBlLCBsaW1pdCApO1wKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKl9ub3JtID0gcG9zdF9mdW5jKChkb3VibGUpdG90YWxfbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fTk9ISU5UX0ZVTkNfMkQoIG5hbWUsIF9vcF8sIF91cGRhdGVfb3BfLCAgXAorICAgIHBvc3RfZnVuYywgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIG5hbWUsICggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgICBcCisgICAgQ3ZTaXplIHNpemUsIGRvdWJsZSogX25vcm0gKSwgKHNyYywgc3RlcCwgc2l6ZSwgX25vcm0pICkgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX05PUk1fQ0FTRShfb3BfLCBfdXBkYXRlX29wXywgd29ya3R5cGUsIHNpemUud2lkdGgpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX25vcm0gPSBwb3N0X2Z1bmMoKGRvdWJsZSlub3JtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qCisgICBJbiBJUFAgb25seSAzMmYgZmxhdm9ycyBvZiBub3JtIGZ1bmN0aW9ucyBhcmUgd2l0aCBoaW50LgorICAgRm9yIGZsb2F0IHdvcmt0eXBlPT1ub3JtdHlwZT09ZG91YmxlLCB0aHVzIHRoZSBibG9jayBhbGdvcml0aG0sCisgICBkZXNjcmliZWQgYWJvdmUsIGlzIG5vdCBuZWNlc3NhcnkuCisgKi8KKyNkZWZpbmUgIElDVl9ERUZfTk9STV9ISU5UX0ZVTkNfMkQoIG5hbWUsIF9vcF8sIF91cGRhdGVfb3BfLCAgICBcCisgICAgcG9zdF9mdW5jLCBhcnJ0eXBlLCBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgXAorSVBDVkFQSV9JTVBMKCBDdlN0YXR1cywgbmFtZSwgKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCAgIFwKKyAgICBDdlNpemUgc2l6ZSwgZG91YmxlKiBfbm9ybSwgQ3ZIaW50QWxnb3JpdGhtIC8qaGludCovICksICAgICBcCisgICAgKHNyYywgc3RlcCwgc2l6ZSwgX25vcm0sIGN2QWxnSGludEFjY3VyYXRlKSApICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX05PUk1fQ0FTRShfb3BfLCBfdXBkYXRlX29wXywgd29ya3R5cGUsIHNpemUud2lkdGgpOyBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX25vcm0gPSBwb3N0X2Z1bmMoKGRvdWJsZSlub3JtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfTk9STV9OT0hJTlRfQkxPQ0tfRlVOQ18yRF9DT0koIG5hbWUsIF9vcF8sICAgICBcCisgICAgX3VwZGF0ZV9vcF8sIHBvc3RfZnVuYywgYXJydHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIG5hbWUoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICBcCisgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBjbiwgaW50IGNvaSwgZG91YmxlKiBfbm9ybSApICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgdG90YWxfbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX05PUk1fQ09JX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgbGltaXQsIGNuICk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKXRvdGFsX25vcm0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX05PSElOVF9GVU5DXzJEX0NPSSggbmFtZSwgX29wXywgICAgICAgICAgIFwKKyAgICBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgIFwKKyAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX05PUk1fQ09JX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgc2l6ZS53aWR0aCwgY24gKTsgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKl9ub3JtID0gcG9zdF9mdW5jKChkb3VibGUpbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fRElGRl9OT0hJTlRfQkxPQ0tfRlVOQ18yRCggbmFtZSwgX29wXywgICAgXAorICAgIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsIGFycnR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLCAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgQ3ZTaXplIHNpemUsIGRvdWJsZSogX25vcm0pLFwKKyAgIChzcmMxLCBzdGVwMSwgc3JjMiwgc3RlcDIsIHNpemUsIF9ub3JtKSkgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSB0b3RhbF9ub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgd29ya3R5cGUgbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAxIC89IHNpemVvZihzcmMxWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMiAvPSBzaXplb2Yoc3JjMlswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyICkgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggeCA8IHNpemUud2lkdGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgbGltaXQgPSBNSU4oIHJlbWFpbmluZywgc2l6ZS53aWR0aCAtIHggKTsgICAgICAgXAorICAgICAgICAgICAgcmVtYWluaW5nIC09IGxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxpbWl0ICs9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfTk9STV9ESUZGX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgbGltaXQgKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKl9ub3JtID0gcG9zdF9mdW5jKChkb3VibGUpdG90YWxfbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fRElGRl9OT0hJTlRfRlVOQ18yRCggbmFtZSwgX29wXywgICAgICAgICAgXAorICAgIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlLCBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLCAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgQ3ZTaXplIHNpemUsIGRvdWJsZSogX25vcm0pLFwKKyAgICAoIHNyYzEsIHN0ZXAxLCBzcmMyLCBzdGVwMiwgc2l6ZSwgX25vcm0gKSkgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiApICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX05PUk1fRElGRl9DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNpemUud2lkdGggKTsgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKl9ub3JtID0gcG9zdF9mdW5jKChkb3VibGUpbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fRElGRl9ISU5UX0ZVTkNfMkQoIG5hbWUsIF9vcF8sICAgICAgICAgICAgXAorICAgIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlLCBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLCAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgQ3ZTaXplIHNpemUsIGRvdWJsZSogX25vcm0sIFwKKyAgICBDdkhpbnRBbGdvcml0aG0gLypoaW50Ki8gKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKHNyYzEsIHN0ZXAxLCBzcmMyLCBzdGVwMiwgc2l6ZSwgX25vcm0sIGN2QWxnSGludEFjY3VyYXRlICkpXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYzEgKz0gc3RlcDEsIHNyYzIgKz0gc3RlcDIgKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9OT1JNX0RJRkZfQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzaXplLndpZHRoICk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKW5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX0RJRkZfTk9ISU5UX0JMT0NLX0ZVTkNfMkRfQ09JKCBuYW1lLCBfb3BfLFwKKyAgICBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCBhcnJ0eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLFwKKyAgICBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3RlcDIsIEN2U2l6ZSBzaXplLCAgICAgICAgICAgICAgICBcCisgICAgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgdG90YWxfbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYzEgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMyICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyICkgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSggeCA8IHNpemUud2lkdGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgbGltaXQgPSBNSU4oIHJlbWFpbmluZywgc2l6ZS53aWR0aCAtIHggKTsgICAgICAgXAorICAgICAgICAgICAgcmVtYWluaW5nIC09IGxpbWl0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxpbWl0ICs9IHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBJQ1ZfTk9STV9ESUZGX0NPSV9DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGxpbWl0LCBjbiApOyAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0b3RhbF9ub3JtICs9IChub3JtdHlwZSlub3JtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKl9ub3JtID0gcG9zdF9mdW5jKChkb3VibGUpdG90YWxfbm9ybSk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fRElGRl9OT0hJTlRfRlVOQ18yRF9DT0koIG5hbWUsIF9vcF8sICAgICAgXAorICAgIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnJ0eXBlLCBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBuYW1lKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgQ3ZTaXplIHNpemUsICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgY24sIGludCBjb2ksIGRvdWJsZSogX25vcm0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYzEgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMyICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyICkgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfTk9STV9ESUZGX0NPSV9DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNpemUud2lkdGgsIGNuICk7ICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX25vcm0gPSBwb3N0X2Z1bmMoKGRvdWJsZSlub3JtKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTiBvIHIgbSAgIHdpdGggICAgTSBBIFMgSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfTk9STV9NQVNLX0NBU0UoIF9vcF8sICAgICAgICAgICAgICAgXAorICAgICAgICBfdXBkYXRlX29wXywgd29ya3R5cGUsIGxlbiApICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gMjsgeCArPSAyICkgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAoc3JjKVt4XTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4KzFdICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAoc3JjKVt4KzFdOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjKVt4XTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX05PUk1fRElGRl9NQVNLX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCB3b3JrdHlwZSwgbGVuICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gMjsgeCArPSAyICkgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAoc3JjMSlbeF0gLSAoc3JjMilbeF07ICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4KzFdICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAgPSAoc3JjMSlbeCsxXSAtIChzcmMyKVt4KzFdOyAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjMSlbeF0gLSAoc3JjMilbeF07XAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX05PUk1fTUFTS19DT0lfQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sIHdvcmt0eXBlLCBsZW4sIGNuICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHgrKyApICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggbWFza1t4XSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgdDAgPSAoc3JjKVt4KihjbildOyAgICAgICAgXAorICAgICAgICAgICAgdDAgPSBfb3BfKHQwKTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbm9ybSA9IF91cGRhdGVfb3BfKCBub3JtLCB0MCApOyAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgSUNWX05PUk1fRElGRl9NQVNLX0NPSV9DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgd29ya3R5cGUsIGxlbiwgY24gKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4KysgKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG1hc2tbeF0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIHQwID0gKHNyYzEpW3gqKGNuKV0gLSAoc3JjMilbeCooY24pXTsgIFwKKyAgICAgICAgICAgIHQwID0gX29wXyh0MCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5vcm0gPSBfdXBkYXRlX29wXyggbm9ybSwgdDAgKTsgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fTUFTS19OT0hJTlRfQkxPQ0tfRlVOQ18yRCggbmFtZSwgX29wXywgICAgXAorICAgIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsIGFycnR5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgXAorICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsIEN2U2l6ZSBzaXplLCBkb3VibGUqIF9ub3JtICksXAorICAgIChzcmMsIHN0ZXAsIG1hc2ssIG1hc2tzdGVwLCBzaXplLCBfbm9ybSkgKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHJlbWFpbmluZyA9IGJsb2NrX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIHRvdGFsX25vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB3b3JrdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX05PUk1fTUFTS19DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGxpbWl0ICk7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKXRvdGFsX25vcm0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX01BU0tfTk9ISU5UX0ZVTkNfMkQoIG5hbWUsIF9vcF8sIF91cGRhdGVfb3BfLFwKKyAgICBwb3N0X2Z1bmMsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCAoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsICAgXAorICAgIGNvbnN0IHVjaGFyKiBtYXNrLCBpbnQgbWFza3N0ZXAsIEN2U2l6ZSBzaXplLCBkb3VibGUqIF9ub3JtICksXAorICAgIChzcmMsIHN0ZXAsIG1hc2ssIG1hc2tzdGVwLCBzaXplLCBfbm9ybSkgKSAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9OT1JNX01BU0tfQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzaXplLndpZHRoICk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKW5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX01BU0tfTk9ISU5UX0JMT0NLX0ZVTkNfMkRfQ09JKCBuYW1lLCBfb3BfLFwKKyAgICAgICAgICAgICAgICBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCBhcnJ0eXBlLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgIFwKKyAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICBcCisgICAgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgdG90YWxfbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAsIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX05PUk1fTUFTS19DT0lfQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBsaW1pdCwgY24gKTsgICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKXRvdGFsX25vcm0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX01BU0tfTk9ISU5UX0ZVTkNfMkRfQ09JKCBuYW1lLCBfb3BfLCAgICAgIFwKKyAgICBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgIFwKKyAgICBjb25zdCB1Y2hhciogbWFzaywgaW50IG1hc2tzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICBcCisgICAgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYyArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwLCBtYXNrICs9IG1hc2tzdGVwICkgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9OT1JNX01BU0tfQ09JX0NBU0UoIF9vcF8sIF91cGRhdGVfb3BfLCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrdHlwZSwgc2l6ZS53aWR0aCwgY24gKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKW5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworCisjZGVmaW5lICBJQ1ZfREVGX05PUk1fRElGRl9NQVNLX05PSElOVF9CTE9DS19GVU5DXzJEKCBuYW1lLCAgICAgXAorICAgIF9vcF8sIF91cGRhdGVfb3BfLCBwb3N0X2Z1bmMsIGFycnR5cGUsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitJUENWQVBJX0lNUEwoIEN2U3RhdHVzLCBuYW1lLCggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLCAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYzIsIGludCBzdGVwMiwgY29uc3QgdWNoYXIqIG1hc2ssICAgICAgICAgIFwKKyAgICBpbnQgbWFza3N0ZXAsIEN2U2l6ZSBzaXplLCBkb3VibGUqIF9ub3JtICksICAgICAgICAgICAgICAgICBcCisgICAgKHNyYzEsIHN0ZXAxLCBzcmMyLCBzdGVwMiwgbWFzaywgbWFza3N0ZXAsIHNpemUsIF9ub3JtICkpICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgdG90YWxfbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlKCB4IDwgc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBsaW1pdCA9IE1JTiggcmVtYWluaW5nLCBzaXplLndpZHRoIC0geCApOyAgICAgICBcCisgICAgICAgICAgICByZW1haW5pbmcgLT0gbGltaXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbGltaXQgKz0geDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9OT1JNX0RJRkZfTUFTS19DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGxpbWl0ICk7ICAgICAgICAgXAorICAgICAgICAgICAgaWYoIHJlbWFpbmluZyA9PSAwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHRvdGFsX25vcm0gKz0gKG5vcm10eXBlKW5vcm07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHRvdGFsX25vcm0gKz0gKG5vcm10eXBlKW5vcm07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqX25vcm0gPSBwb3N0X2Z1bmMoKGRvdWJsZSl0b3RhbF9ub3JtKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKyNkZWZpbmUgIElDVl9ERUZfTk9STV9ESUZGX01BU0tfTk9ISU5UX0ZVTkNfMkQoIG5hbWUsIF9vcF8sICAgICBcCisgICAgX3VwZGF0ZV9vcF8sIHBvc3RfZnVuYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgICAgIFwKK0lQQ1ZBUElfSU1QTCggQ3ZTdGF0dXMsIG5hbWUsKCBjb25zdCBhcnJ0eXBlKiBzcmMxLCBpbnQgc3RlcDEsICBcCisgICAgY29uc3QgYXJydHlwZSogc3JjMiwgaW50IHN0ZXAyLCBjb25zdCB1Y2hhciogbWFzaywgICAgICAgICAgXAorICAgIGludCBtYXNrc3RlcCwgQ3ZTaXplIHNpemUsIGRvdWJsZSogX25vcm0gKSwgICAgICAgICAgICAgICAgIFwKKyAgICAoc3JjMSwgc3RlcDEsIHNyYzIsIHN0ZXAyLCBtYXNrLCBtYXNrc3RlcCwgc2l6ZSwgX25vcm0gKSkgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5vcm10eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9OT1JNX0RJRkZfTUFTS19DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIHNpemUud2lkdGggKTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKW5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX0RJRkZfTUFTS19OT0hJTlRfQkxPQ0tfRlVOQ18yRF9DT0koIG5hbWUsIFwKKyAgICBfb3BfLCBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCBhcnJ0eXBlLCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLFwKKyAgICBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3RlcDIsIGNvbnN0IHVjaGFyKiBtYXNrLCAgICAgICAgICBcCisgICAgaW50IG1hc2tzdGVwLCBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgcmVtYWluaW5nID0gYmxvY2tfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbm9ybXR5cGUgdG90YWxfbm9ybSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGVwMSAvPSBzaXplb2Yoc3JjMVswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDIgLz0gc2l6ZW9mKHNyYzJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyYzEgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMyICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMxICs9IHN0ZXAxLCBzcmMyICs9IHN0ZXAyLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzayArPSBtYXNrc3RlcCApICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX05PUk1fRElGRl9NQVNLX0NPSV9DQVNFKCBfb3BfLCBfdXBkYXRlX29wXywgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBsaW1pdCwgY24gKTsgICAgICBcCisgICAgICAgICAgICBpZiggcmVtYWluaW5nID09IDAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIG5vcm0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdG90YWxfbm9ybSArPSAobm9ybXR5cGUpbm9ybTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKXRvdGFsX25vcm0pOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSAgSUNWX0RFRl9OT1JNX0RJRkZfTUFTS19OT0hJTlRfRlVOQ18yRF9DT0koIG5hbWUsIF9vcF8sIFwKKyAgICBfdXBkYXRlX29wXywgcG9zdF9mdW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgICAgICAgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgbmFtZSggY29uc3QgYXJydHlwZSogc3JjMSwgaW50IHN0ZXAxLFwKKyAgICBjb25zdCBhcnJ0eXBlKiBzcmMyLCBpbnQgc3RlcDIsIGNvbnN0IHVjaGFyKiBtYXNrLCAgICAgICAgICBcCisgICAgaW50IG1hc2tzdGVwLCBDdlNpemUgc2l6ZSwgaW50IGNuLCBpbnQgY29pLCBkb3VibGUqIF9ub3JtICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBub3JtdHlwZSBub3JtID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RlcDEgLz0gc2l6ZW9mKHNyYzFbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAyIC89IHNpemVvZihzcmMyWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMxICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjMiArPSBjb2kgLSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjMSArPSBzdGVwMSwgc3JjMiArPSBzdGVwMiwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2sgKz0gbWFza3N0ZXAgKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9OT1JNX0RJRkZfTUFTS19DT0lfQ0FTRSggX29wXywgX3VwZGF0ZV9vcF8sICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmt0eXBlLCBzaXplLndpZHRoLCBjbiApO1wKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpfbm9ybSA9IHBvc3RfZnVuYygoZG91YmxlKW5vcm0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFRoZSBtYWNyb3MgZXhwYW5kZWQgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKworI2RlZmluZSBJQ1ZfREVGX05PUk1fRlVOQ19BTExfQyhmbGF2b3IsIF9hYnNfLCBfYWJzX2RpZmZfLCBhcnJ0eXBlLCB3b3JrdHlwZSlcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX05PSElOVF9GVU5DXzJEKCBpY3ZOb3JtX0luZl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgTUFYLCBDVl9OT1AsIGFycnR5cGUsIHdvcmt0eXBlLCB3b3JrdHlwZSwgMCApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX05PSElOVF9GVU5DXzJEX0NPSSggaWN2Tm9ybV9JbmZfIyNmbGF2b3IjI19DbkNSLCAgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgTUFYLCBDVl9OT1AsIGFycnR5cGUsIHdvcmt0eXBlLCB3b3JrdHlwZSwgMCApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX0RJRkZfTk9ISU5UX0ZVTkNfMkQoIGljdk5vcm1EaWZmX0luZl8jI2ZsYXZvciMjX0MxUiwgICAgICAgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBNQVgsIENWX05PUCwgYXJydHlwZSwgd29ya3R5cGUsIHdvcmt0eXBlLCAwICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX0RJRkZfTk9ISU5UX0ZVTkNfMkRfQ09JKCBpY3ZOb3JtRGlmZl9JbmZfIyNmbGF2b3IjI19DbkNSLCAgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBNQVgsIENWX05PUCwgYXJydHlwZSwgd29ya3R5cGUsIHdvcmt0eXBlLCAwICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX01BU0tfTk9ISU5UX0ZVTkNfMkQoIGljdk5vcm1fSW5mXyMjZmxhdm9yIyNfQzFNUiwgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgTUFYLCBDVl9OT1AsIGFycnR5cGUsIHdvcmt0eXBlLCB3b3JrdHlwZSwgMCApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX01BU0tfTk9ISU5UX0ZVTkNfMkRfQ09JKCBpY3ZOb3JtX0luZl8jI2ZsYXZvciMjX0NuQ01SLCAgICAgICAgIFwKKyAgICBfYWJzXywgTUFYLCBDVl9OT1AsIGFycnR5cGUsIHdvcmt0eXBlLCB3b3JrdHlwZSwgMCApICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX0RJRkZfTUFTS19OT0hJTlRfRlVOQ18yRCggaWN2Tm9ybURpZmZfSW5mXyMjZmxhdm9yIyNfQzFNUiwgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBNQVgsIENWX05PUCwgYXJydHlwZSwgd29ya3R5cGUsIHdvcmt0eXBlLCAwICkgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUNWX0RFRl9OT1JNX0RJRkZfTUFTS19OT0hJTlRfRlVOQ18yRF9DT0koIGljdk5vcm1EaWZmX0luZl8jI2ZsYXZvciMjX0NuQ01SLFwKKyAgICBfYWJzX2RpZmZfLCBNQVgsIENWX05PUCwgYXJydHlwZSwgd29ya3R5cGUsIHdvcmt0eXBlLCAwICkKKworCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfQyggOHUsIENWX05PUCwgQ1ZfSUFCUywgdWNoYXIsIGludCApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfQyggMTZ1LCBDVl9OT1AsIENWX0lBQlMsIHVzaG9ydCwgaW50ICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9DKCAxNnMsIENWX0lBQlMsIENWX0lBQlMsIHNob3J0LCBpbnQgKQorLy8gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbiBmcm9tIG92ZXJmbG93CisvLyAob3RoZXJ3aXNlIHdlIGhhZCB0byBkbyBldmVyeXRoaW5nIGluIGludDY0J3Mgb3IgZG91YmxlJ3MpCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfQyggMzJzLCBDVl9JQUJTLCBDVl9JQUJTLCBpbnQsIGludCApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfQyggMzJmLCBmYWJzLCBmYWJzLCBmbG9hdCwgZG91YmxlICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9DKCA2NGYsIGZhYnMsIGZhYnMsIGRvdWJsZSwgZG91YmxlICkKKworI2RlZmluZSBJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDEoIGZsYXZvciwgX2Fic18sIF9hYnNfZGlmZl8sIGhpbnRwX2Z1bmMsIG5vaGludF9mdW5jLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlLCBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV8jI2hpbnRwX2Z1bmMjI19GVU5DXzJEKCBpY3ZOb3JtX0wxXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgQ1ZfQURELCBDVl9OT1AsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV8jI25vaGludF9mdW5jIyNfRlVOQ18yRF9DT0koIGljdk5vcm1fTDFfIyNmbGF2b3IjI19DbkNSLCAgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgQ1ZfQURELCBDVl9OT1AsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGXyMjaGludHBfZnVuYyMjX0ZVTkNfMkQoIGljdk5vcm1EaWZmX0wxXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBDVl9BREQsIENWX05PUCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEX0NPSSggaWN2Tm9ybURpZmZfTDFfIyNmbGF2b3IjI19DbkNSLCAgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBDVl9BREQsIENWX05PUCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9NQVNLXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEKCBpY3ZOb3JtX0wxXyMjZmxhdm9yIyNfQzFNUiwgICAgICAgICAgICAgIFwKKyAgICBfYWJzXywgQ1ZfQURELCBDVl9OT1AsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9NQVNLXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEX0NPSSggaWN2Tm9ybV9MMV8jI2ZsYXZvciMjX0NuQ01SLCAgICAgICAgIFwKKyAgICBfYWJzXywgQ1ZfQURELCBDVl9OT1AsIGFycnR5cGUsIG5vcm10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGX01BU0tfIyNub2hpbnRfZnVuYyMjX0ZVTkNfMkQoIGljdk5vcm1EaWZmX0wxXyMjZmxhdm9yIyNfQzFNUiwgICAgIFwKKyAgICBfYWJzX2RpZmZfLCBDVl9BREQsIENWX05PUCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGX01BU0tfIyNub2hpbnRfZnVuYyMjX0ZVTkNfMkRfQ09JKCBpY3ZOb3JtRGlmZl9MMV8jI2ZsYXZvciMjX0NuQ01SLFwKKyAgICBfYWJzX2RpZmZfLCBDVl9BREQsIENWX05PUCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkKKworCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDEoIDh1LCBDVl9OT1AsIENWX0lBQlMsIE5PSElOVF9CTE9DSywgTk9ISU5UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciwgaW50NjQsIGludCwgMSA8PCAyMyApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDEoIDE2dSwgQ1ZfTk9QLCBDVl9JQUJTLCBOT0hJTlRfQkxPQ0ssIE5PSElOVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0LCBpbnQ2NCwgaW50LCAxIDw8IDE1ICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9MMSggMTZzLCBDVl9JQUJTLCBDVl9JQUJTLCBOT0hJTlRfQkxPQ0ssIE5PSElOVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQsIGludDY0LCBpbnQsIDEgPDwgMTUgKQorLy8gdGhlcmUgaXMgbm8gcHJvdGVjdGlvbiBmcm9tIG92ZXJmbG93IG9uIGFicygpIHN0YWdlLgorLy8gKG90aGVyd2lzZSB3ZSBoYWQgdG8gZG8gZXZlcnl0aGluZyBpbiBpbnQ2NCdzIG9yIGRvdWJsZSdzKQorSUNWX0RFRl9OT1JNX0ZVTkNfQUxMX0wxKCAzMnMsIGZhYnMsIGZhYnMsIE5PSElOVCwgTk9ISU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQsIGRvdWJsZSwgZG91YmxlLCBJTlRfTUFYICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9MMSggMzJmLCBmYWJzLCBmYWJzLCBISU5ULCBOT0hJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0LCBkb3VibGUsIGRvdWJsZSwgSU5UX01BWCApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDEoIDY0ZiwgZmFicywgZmFicywgTk9ISU5ULCBOT0hJTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIElOVF9NQVggKQorCisKKyNkZWZpbmUgSUNWX0RFRl9OT1JNX0ZVTkNfQUxMX0wyKCBmbGF2b3IsIGhpbnRwX2Z1bmMsIG5vaGludF9mdW5jLCBhcnJ0eXBlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUsIHNxcl9tYWNybyApICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV8jI2hpbnRwX2Z1bmMjI19GVU5DXzJEKCBpY3ZOb3JtX0wyXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV8jI25vaGludF9mdW5jIyNfRlVOQ18yRF9DT0koIGljdk5vcm1fTDJfIyNmbGF2b3IjI19DbkNSLCAgICAgICAgICAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGXyMjaGludHBfZnVuYyMjX0ZVTkNfMkQoIGljdk5vcm1EaWZmX0wyXyMjZmxhdm9yIyNfQzFSLCAgICAgICAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEX0NPSSggaWN2Tm9ybURpZmZfTDJfIyNmbGF2b3IjI19DbkNSLCAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9NQVNLXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEKCBpY3ZOb3JtX0wyXyMjZmxhdm9yIyNfQzFNUiwgICAgICAgICAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9NQVNLXyMjbm9oaW50X2Z1bmMjI19GVU5DXzJEX0NPSSggaWN2Tm9ybV9MMl8jI2ZsYXZvciMjX0NuQ01SLCAgICAgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGX01BU0tfIyNub2hpbnRfZnVuYyMjX0ZVTkNfMkQoIGljdk5vcm1EaWZmX0wyXyMjZmxhdm9yIyNfQzFNUiwgICAgIFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0lDVl9ERUZfTk9STV9ESUZGX01BU0tfIyNub2hpbnRfZnVuYyMjX0ZVTkNfMkRfQ09JKCBpY3ZOb3JtRGlmZl9MMl8jI2ZsYXZvciMjX0NuQ01SLFwKKyAgICBzcXJfbWFjcm8sIENWX0FERCwgc3FydCwgYXJydHlwZSwgbm9ybXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkKKworCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDIoIDh1LCBOT0hJTlRfQkxPQ0ssIE5PSElOVF9CTE9DSywgdWNoYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0LCBpbnQsIDEgPDwgMTUsIENWX1NRUl84VSApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDIoIDE2dSwgTk9ISU5ULCBOT0hJTlQsIHVzaG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlLCBkb3VibGUsIElOVF9NQVgsIENWX1NRUiApCitJQ1ZfREVGX05PUk1fRlVOQ19BTExfTDIoIDE2cywgTk9ISU5ULCBOT0hJTlQsIHNob3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIGRvdWJsZSwgSU5UX01BWCwgQ1ZfU1FSICkKKy8vIHRoZXJlIGlzIG5vIHByb3RlY3Rpb24gZnJvbSBvdmVyZmxvdyBvbiBhYnMoKSBzdGFnZS4KKy8vIChvdGhlcndpc2Ugd2UgaGFkIHRvIGRvIGV2ZXJ5dGhpbmcgaW4gaW50NjQncyBvciBkb3VibGUncykKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9MMiggMzJzLCBOT0hJTlQsIE5PSElOVCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIGRvdWJsZSwgSU5UX01BWCwgQ1ZfU1FSICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9MMiggMzJmLCBISU5ULCBOT0hJTlQsIGZsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIGRvdWJsZSwgSU5UX01BWCwgQ1ZfU1FSICkKK0lDVl9ERUZfTk9STV9GVU5DX0FMTF9MMiggNjRmLCBOT0hJTlQsIE5PSElOVCwgZG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUsIGRvdWJsZSwgSU5UX01BWCwgQ1ZfU1FSICkKKworCisjZGVmaW5lIElDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggRlVOQ05BTUUsIEZMQUcgKSAgICAgICAgICAgICAgXAorc3RhdGljIHZvaWQgaWN2SW5pdCMjRlVOQ05BTUUjI0ZMQUcjI1RhYmxlKCBDdkZ1bmNUYWJsZSogdGFiICkgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl84VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzh1XyMjRkxBRzsgICAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfOFNdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzE2dV8jI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI18xNnNfIyNGTEFHOyAgICAgXAorICAgIHRhYi0+Zm5fMmRbQ1ZfMzJTXSA9ICh2b2lkKilpY3YjI0ZVTkNOQU1FIyNfMzJzXyMjRkxBRzsgICAgIFwKKyAgICB0YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2IyNGVU5DTkFNRSMjXzMyZl8jI0ZMQUc7ICAgICBcCisgICAgdGFiLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdiMjRlVOQ05BTUUjI182NGZfIyNGTEFHOyAgICAgXAorfQorCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1fSW5mLCBDMVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtX0wxLCBDMVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtX0wyLCBDMVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtRGlmZl9JbmYsIEMxUiApCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1EaWZmX0wxLCBDMVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtRGlmZl9MMiwgQzFSICkKKworSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtX0luZiwgQ25DUiApCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1fTDEsIENuQ1IgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtX0wyLCBDbkNSICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybURpZmZfSW5mLCBDbkNSICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybURpZmZfTDEsIENuQ1IgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtRGlmZl9MMiwgQ25DUiApCisKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybV9JbmYsIEMxTVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtX0wxLCBDMU1SICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybV9MMiwgQzFNUiApCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1EaWZmX0luZiwgQzFNUiApCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1EaWZmX0wxLCBDMU1SICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybURpZmZfTDIsIEMxTVIgKQorCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1fSW5mLCBDbkNNUiApCitJQ1ZfREVGX0lOSVRfTk9STV9UQUJfMkQoIE5vcm1fTDEsIENuQ01SICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybV9MMiwgQ25DTVIgKQorSUNWX0RFRl9JTklUX05PUk1fVEFCXzJEKCBOb3JtRGlmZl9JbmYsIENuQ01SICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybURpZmZfTDEsIENuQ01SICkKK0lDVl9ERUZfSU5JVF9OT1JNX1RBQl8yRCggTm9ybURpZmZfTDIsIENuQ01SICkKKworCitzdGF0aWMgdm9pZCBpY3ZJbml0Tm9ybVRhYnMoIEN2RnVuY1RhYmxlKiBub3JtX3RhYiwgQ3ZGdW5jVGFibGUqIG5vcm1tYXNrX3RhYiApCit7CisgICAgaWN2SW5pdE5vcm1fSW5mQzFSVGFibGUoICZub3JtX3RhYlswXSApOworICAgIGljdkluaXROb3JtX0wxQzFSVGFibGUoICZub3JtX3RhYlsxXSApOworICAgIGljdkluaXROb3JtX0wyQzFSVGFibGUoICZub3JtX3RhYlsyXSApOworICAgIGljdkluaXROb3JtRGlmZl9JbmZDMVJUYWJsZSggJm5vcm1fdGFiWzNdICk7CisgICAgaWN2SW5pdE5vcm1EaWZmX0wxQzFSVGFibGUoICZub3JtX3RhYls0XSApOworICAgIGljdkluaXROb3JtRGlmZl9MMkMxUlRhYmxlKCAmbm9ybV90YWJbNV0gKTsKKworICAgIGljdkluaXROb3JtX0luZkNuQ1JUYWJsZSggJm5vcm1fdGFiWzZdICk7CisgICAgaWN2SW5pdE5vcm1fTDFDbkNSVGFibGUoICZub3JtX3RhYls3XSApOworICAgIGljdkluaXROb3JtX0wyQ25DUlRhYmxlKCAmbm9ybV90YWJbOF0gKTsKKyAgICBpY3ZJbml0Tm9ybURpZmZfSW5mQ25DUlRhYmxlKCAmbm9ybV90YWJbOV0gKTsKKyAgICBpY3ZJbml0Tm9ybURpZmZfTDFDbkNSVGFibGUoICZub3JtX3RhYlsxMF0gKTsKKyAgICBpY3ZJbml0Tm9ybURpZmZfTDJDbkNSVGFibGUoICZub3JtX3RhYlsxMV0gKTsKKworICAgIGljdkluaXROb3JtX0luZkMxTVJUYWJsZSggJm5vcm1tYXNrX3RhYlswXSApOworICAgIGljdkluaXROb3JtX0wxQzFNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzFdICk7CisgICAgaWN2SW5pdE5vcm1fTDJDMU1SVGFibGUoICZub3JtbWFza190YWJbMl0gKTsKKyAgICBpY3ZJbml0Tm9ybURpZmZfSW5mQzFNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzNdICk7CisgICAgaWN2SW5pdE5vcm1EaWZmX0wxQzFNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzRdICk7CisgICAgaWN2SW5pdE5vcm1EaWZmX0wyQzFNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzVdICk7CisKKyAgICBpY3ZJbml0Tm9ybV9JbmZDbkNNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzZdICk7CisgICAgaWN2SW5pdE5vcm1fTDFDbkNNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzddICk7CisgICAgaWN2SW5pdE5vcm1fTDJDbkNNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzhdICk7CisgICAgaWN2SW5pdE5vcm1EaWZmX0luZkNuQ01SVGFibGUoICZub3JtbWFza190YWJbOV0gKTsKKyAgICBpY3ZJbml0Tm9ybURpZmZfTDFDbkNNUlRhYmxlKCAmbm9ybW1hc2tfdGFiWzEwXSApOworICAgIGljdkluaXROb3JtRGlmZl9MMkNuQ01SVGFibGUoICZub3JtbWFza190YWJbMTFdICk7Cit9CisKKworQ1ZfSU1QTCAgZG91YmxlCitjdk5vcm0oIGNvbnN0IHZvaWQqIGltZ0EsIGNvbnN0IHZvaWQqIGltZ0IsIGludCBub3JtVHlwZSwgY29uc3Qgdm9pZCogbWFzayApCit7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG5vcm1fdGFiWzEyXTsKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgbm9ybW1hc2tfdGFiWzEyXTsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgZG91YmxlICBub3JtID0gMCwgbm9ybV9kaWZmID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdk5vcm0iKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlLCBkZXB0aCwgY24sIGlzX3JlbGF0aXZlOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2TWF0IHN0dWIxLCAqbWF0MSA9IChDdk1hdCopaW1nQjsKKyAgICBDdk1hdCBzdHViMiwgKm1hdDIgPSAoQ3ZNYXQqKWltZ0E7CisgICAgaW50IG1hdDJfZmxhZyA9IENWX01BVF9DT05UX0ZMQUc7CisgICAgaW50IG1hdDFfc3RlcCwgbWF0Ml9zdGVwLCBtYXNrX3N0ZXAgPSAwOworICAgIGludCBjb2kgPSAwLCBjb2kyID0gMDsKKworICAgIGlmKCAhbWF0MSApCisgICAgeworICAgICAgICBtYXQxID0gbWF0MjsKKyAgICAgICAgbWF0MiA9IDA7CisgICAgfQorCisgICAgaXNfcmVsYXRpdmUgPSBtYXQyICYmIChub3JtVHlwZSAmIENWX1JFTEFUSVZFKTsKKyAgICBub3JtVHlwZSAmPSB+Q1ZfUkVMQVRJVkU7CisKKyAgICBzd2l0Y2goIG5vcm1UeXBlICkKKyAgICB7CisgICAgY2FzZSBDVl9DOgorICAgIGNhc2UgQ1ZfTDE6CisgICAgY2FzZSBDVl9MMjoKKyAgICBjYXNlIENWX0RJRkZfQzoKKyAgICBjYXNlIENWX0RJRkZfTDE6CisgICAgY2FzZSBDVl9ESUZGX0wyOgorICAgICAgICBub3JtVHlwZSA9IChub3JtVHlwZSAmIDcpID4+IDE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiIiApOworICAgIH0KKworICAgIC8qIGxpZ2h0IHZhcmlhbnQgKi8KKyAgICBpZiggQ1ZfSVNfTUFUKG1hdDEpICYmICghbWF0MiB8fCBDVl9JU19NQVQobWF0MikpICYmICFtYXNrICkKKyAgICB7CisgICAgICAgIGlmKCBtYXQyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIG1hdDEsIG1hdDIgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgICAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIG1hdDEsIG1hdDIgKSkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICIiICk7CisKKyAgICAgICAgICAgIG1hdDJfZmxhZyA9IG1hdDItPnR5cGU7CisgICAgICAgIH0KKworICAgICAgICBzaXplID0gY3ZHZXRNYXRTaXplKCBtYXQxICk7CisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQxLT50eXBlKTsKKyAgICAgICAgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgICAgIGNuID0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0MS0+dHlwZSAmIG1hdDJfZmxhZyApKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworCisgICAgICAgICAgICBpZiggc2l6ZS53aWR0aCA8PSBDVl9NQVhfSU5MSU5FX01BVF9PUF9TSVpFICYmIG5vcm1UeXBlID09IDIgLyogQ1ZfTDIgKi8gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA9PSBDVl8zMkYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNyYzFkYXRhID0gbWF0MS0+ZGF0YS5mbDsKKyAgICAgICAgICAgICAgICAgICAgaW50IHNpemUwID0gc2l6ZS53aWR0aCAqPSBjbjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoICFtYXQyIHx8IGlzX3JlbGF0aXZlICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHNyYzFkYXRhW3NpemUud2lkdGgtMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiggbWF0MiApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMyZGF0YSA9IG1hdDItPmRhdGEuZmw7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLndpZHRoID0gc2l6ZTA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSBzcmMxZGF0YVtzaXplLndpZHRoLTFdIC0gc3JjMmRhdGFbc2l6ZS53aWR0aC0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtX2RpZmYgKz0gdCp0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIC0tc2l6ZS53aWR0aCApOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggaXNfcmVsYXRpdmUgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSBub3JtX2RpZmYvKG5vcm0gKyBEQkxfRVBTSUxPTik7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm1fZGlmZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub3JtID0gc3FydChub3JtKTsKKyAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPT0gQ1ZfNjRGICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjMWRhdGEgPSBtYXQxLT5kYXRhLmRiOworICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZTAgPSBzaXplLndpZHRoICo9IGNuOworCisgICAgICAgICAgICAgICAgICAgIGlmKCAhbWF0MiB8fCBpc19yZWxhdGl2ZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSBzcmMxZGF0YVtzaXplLndpZHRoLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gKz0gdCp0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoIC0tc2l6ZS53aWR0aCApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1hdDIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYzJkYXRhID0gbWF0Mi0+ZGF0YS5kYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUud2lkdGggPSBzaXplMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHNyYzFkYXRhW3NpemUud2lkdGgtMV0gLSBzcmMyZGF0YVtzaXplLndpZHRoLTFdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1fZGlmZiArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpc19yZWxhdGl2ZSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm1fZGlmZi8obm9ybSArIERCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5vcm0gPSBzcXJ0KG5vcm0pOworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIG1hdDFfc3RlcCA9IG1hdDJfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIG1hdDFfc3RlcCA9IG1hdDEtPnN0ZXA7CisgICAgICAgICAgICBtYXQyX3N0ZXAgPSBtYXQyID8gbWF0Mi0+c3RlcCA6IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggIUNWX0lTX01BVE5EKG1hdDEpICYmICFDVl9JU19NQVRORChtYXQyKSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBtYXQxID0gY3ZHZXRNYXQoIG1hdDEsICZzdHViMSwgJmNvaSApKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBtYXQyICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggbWF0MiA9IGN2R2V0TWF0KCBtYXQyLCAmc3R1YjIsICZjb2kyICkpOworCisgICAgICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggbWF0MSwgbWF0MiApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWF0MSwgbWF0MiApKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIiIgKTsKKworICAgICAgICAgICAgaWYoIGNvaSAhPSBjb2kyICYmIENWX01BVF9DTiggbWF0MS0+dHlwZSApID4gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX0JhZENPSSwgIiIgKTsKKworICAgICAgICAgICAgbWF0Ml9mbGFnID0gbWF0Mi0+dHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdDEgKTsKKyAgICAgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdDEtPnR5cGUpOworICAgICAgICBkZXB0aCA9IENWX01BVF9ERVBUSCh0eXBlKTsKKyAgICAgICAgY24gPSBDVl9NQVRfQ04odHlwZSk7CisgICAgICAgIG1hdDFfc3RlcCA9IG1hdDEtPnN0ZXA7CisgICAgICAgIG1hdDJfc3RlcCA9IG1hdDIgPyBtYXQyLT5zdGVwIDogMDsKKworICAgICAgICBpZiggIW1hc2sgJiYgQ1ZfSVNfTUFUX0NPTlQoIG1hdDEtPnR5cGUgJiBtYXQyX2ZsYWcgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICAgICAgICAgIG1hdDFfc3RlcCA9IG1hdDJfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkFyciogYXJyc1tdID0geyBtYXQxLCBtYXQyIH07CisgICAgICAgIEN2TWF0TkQgc3R1YnNbMl07CisgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgIGludCBwYXNzX2hpbnQ7CisKKyAgICAgICAgaWYoICFpbml0dGFiICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2SW5pdE5vcm1UYWJzKCBub3JtX3RhYiwgbm9ybW1hc2tfdGFiICk7CisgICAgICAgICAgICBpbml0dGFiID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYXNrICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRNYXNrLAorICAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIG9uIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBkb2VzIG5vdCBzdXBwb3J0IG1hc2siICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TkFycmF5SXRlcmF0b3IoIDEgKyAobWF0MiAhPSAwKSwgYXJycywgMCwgc3R1YnMsICZpdGVyYXRvciApKTsKKworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKTsKKyAgICAgICAgZGVwdGggPSBDVl9NQVRfREVQVEgodHlwZSk7CisgICAgICAgIGl0ZXJhdG9yLnNpemUud2lkdGggKj0gQ1ZfTUFUX0NOKHR5cGUpOworCisgICAgICAgIHBhc3NfaGludCA9IG5vcm1UeXBlICE9IDAgJiYgKGRlcHRoID09IENWXzMyRik7IAorCisgICAgICAgIGlmKCAhbWF0MiB8fCBpc19yZWxhdGl2ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhcGFzc19oaW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRF8xQTFQIGZ1bmM7CisgICAgICAgIAorICAgICAgICAgICAgICAgIENWX0dFVF9GVU5DX1BUUiggZnVuYywgKEN2RnVuYzJEXzFBMVApbm9ybV90YWJbbm9ybVR5cGVdLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRlbXAgPSAwOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsICZ0ZW1wICkpOworICAgICAgICAgICAgICAgICAgICBub3JtICs9IHRlbXA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RnVuYzJEXzFBMVAxSSBmdW5jOworCisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMUExUDFJKW5vcm1fdGFiW25vcm1UeXBlXS5mbl8yZFtkZXB0aF0pOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0ZW1wID0gMDsKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5zaXplLCAmdGVtcCwgY3ZBbGdIaW50QWNjdXJhdGUgKSk7CisgICAgICAgICAgICAgICAgICAgIG5vcm0gKz0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggbWF0MiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhcGFzc19oaW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRF8yQTFQIGZ1bmM7CisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMkExUClub3JtX3RhYlszICsgbm9ybVR5cGVdLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHRlbXAgPSAwOworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIGl0ZXJhdG9yLnB0clswXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnB0clsxXSwgQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsICZ0ZW1wICkpOworICAgICAgICAgICAgICAgICAgICBub3JtX2RpZmYgKz0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZGdW5jMkRfMkExUDFJIGZ1bmM7CisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMkExUDFJKW5vcm1fdGFiWzMgKyBub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGVtcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucHRyWzFdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgJnRlbXAsIGN2QWxnSGludEFjY3VyYXRlICkpOworICAgICAgICAgICAgICAgICAgICBub3JtX2RpZmYgKz0gdGVtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBpc19yZWxhdGl2ZSApCisgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm1fZGlmZi8obm9ybSArIERCTF9FUFNJTE9OKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmOworICAgICAgICB9CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoICFpbml0dGFiICkKKyAgICB7CisgICAgICAgIGljdkluaXROb3JtVGFicyggbm9ybV90YWIsIG5vcm1tYXNrX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIW1hc2sgKQorICAgIHsKKyAgICAgICAgaWYoIGNuID09IDEgfHwgY29pID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgcGFzc19oaW50ID0gZGVwdGggPT0gQ1ZfMzJGICYmIG5vcm1UeXBlICE9IDA7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IGNuOworCisgICAgICAgICAgICBpZiggIW1hdDIgfHwgaXNfcmVsYXRpdmUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhcGFzc19oaW50ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEN2RnVuYzJEXzFBMVAgZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMUExUClub3JtX3RhYltub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdDEtPmRhdGEucHRyLCBtYXQxX3N0ZXAsIHNpemUsICZub3JtICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdkZ1bmMyRF8xQTFQMUkgZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMUExUDFJKW5vcm1fdGFiW25vcm1UeXBlXS5mbl8yZFtkZXB0aF0pOworCisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0MS0+ZGF0YS5wdHIsIG1hdDFfc3RlcCwgc2l6ZSwgJm5vcm0sIGN2QWxnSGludEFjY3VyYXRlICkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBpZiggbWF0MiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFwYXNzX2hpbnQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZGdW5jMkRfMkExUCBmdW5jOworICAgICAgICAgICAgICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsIChDdkZ1bmMyRF8yQTFQKW5vcm1fdGFiWzMgKyBub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdDEtPmRhdGEucHRyLCBtYXQxX3N0ZXAsIG1hdDItPmRhdGEucHRyLCBtYXQyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgJm5vcm1fZGlmZiApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ3ZGdW5jMkRfMkExUDFJIGZ1bmM7CisgICAgICAgICAgICAgICAgICAgIENWX0dFVF9GVU5DX1BUUiggZnVuYywgKEN2RnVuYzJEXzJBMVAxSSlub3JtX3RhYlszICsgbm9ybVR5cGVdLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQxLT5kYXRhLnB0ciwgbWF0MV9zdGVwLCBtYXQyLT5kYXRhLnB0ciwgbWF0Ml9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsICZub3JtX2RpZmYsIGN2QWxnSGludEFjY3VyYXRlICkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBpc19yZWxhdGl2ZSApCisgICAgICAgICAgICAgICAgICAgIG5vcm0gPSBub3JtX2RpZmYvKG5vcm0gKyBEQkxfRVBTSUxPTik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFtYXQyIHx8IGlzX3JlbGF0aXZlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRG5DXzFBMVAgZnVuYzsKKyAgICAgICAgICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsIChDdkZ1bmMyRG5DXzFBMVApbm9ybV90YWJbNiArIG5vcm1UeXBlXS5mbl8yZFtkZXB0aF0pOworCisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQxLT5kYXRhLnB0ciwgbWF0MV9zdGVwLCBzaXplLCBjbiwgY29pLCAmbm9ybSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBpZiggbWF0MiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZGdW5jMkRuQ18yQTFQIGZ1bmM7CisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRuQ18yQTFQKW5vcm1fdGFiWzkgKyBub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0MS0+ZGF0YS5wdHIsIG1hdDFfc3RlcCwgbWF0Mi0+ZGF0YS5wdHIsIG1hdDJfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGNuLCBjb2ksICZub3JtX2RpZmYgKSk7CisKKyAgICAgICAgICAgICAgICBpZiggaXNfcmVsYXRpdmUgKQorICAgICAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmLyhub3JtICsgREJMX0VQU0lMT04pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm1fZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdk1hdCBtYXNrc3R1YiwgKm1hdG1hc2sgPSAoQ3ZNYXQqKW1hc2s7CisKKyAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDEgJiYgY29pID09IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKworICAgICAgICBDVl9DQUxMKCBtYXRtYXNrID0gY3ZHZXRNYXQoIG1hdG1hc2ssICZtYXNrc3R1YiApKTsKKworICAgICAgICBpZiggIUNWX0lTX01BU0tfQVJSKCBtYXRtYXNrICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkTWFzaywgIiIgKTsKKworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggbWF0MSwgbWF0bWFzayApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiIiApOworICAgICAgICAKKyAgICAgICAgbWFza19zdGVwID0gbWF0bWFzay0+c3RlcDsKKworICAgICAgICBpZiggQ1ZfSVNfTUFUX0NPTlQoIG1hdDEtPnR5cGUgJiBtYXQyX2ZsYWcgJiBtYXRtYXNrLT50eXBlICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgICAgICBtYXQxX3N0ZXAgPSBtYXQyX3N0ZXAgPSBtYXNrX3N0ZXAgPSBDVl9TVFVCX1NURVA7CisgICAgICAgIH0KKworICAgICAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID09IDEgfHwgY29pID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIW1hdDIgfHwgaXNfcmVsYXRpdmUgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RnVuYzJEXzJBMVAgZnVuYzsKKyAgICAgICAgICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgIChDdkZ1bmMyRF8yQTFQKW5vcm1tYXNrX3RhYltub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0MS0+ZGF0YS5wdHIsIG1hdDFfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdG1hc2stPmRhdGEucHRyLCBtYXNrX3N0ZXAsIHNpemUsICZub3JtICkpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIGlmKCBtYXQyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRF8zQTFQIGZ1bmM7CisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLAorICAgICAgICAgICAgICAgICAgICAoQ3ZGdW5jMkRfM0ExUClub3JtbWFza190YWJbMyArIG5vcm1UeXBlXS5mbl8yZFtkZXB0aF0pOworCisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQxLT5kYXRhLnB0ciwgbWF0MV9zdGVwLCBtYXQyLT5kYXRhLnB0ciwgbWF0Ml9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0bWFzay0+ZGF0YS5wdHIsIG1hc2tfc3RlcCwgc2l6ZSwgJm5vcm1fZGlmZiApKTsKKworICAgICAgICAgICAgICAgIGlmKCBpc19yZWxhdGl2ZSApCisgICAgICAgICAgICAgICAgICAgIG5vcm0gPSBub3JtX2RpZmYvKG5vcm0gKyBEQkxfRVBTSUxPTik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFtYXQyIHx8IGlzX3JlbGF0aXZlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRG5DXzJBMVAgZnVuYzsKKyAgICAgICAgICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsCisgICAgICAgICAgICAgICAgICAgIChDdkZ1bmMyRG5DXzJBMVApbm9ybW1hc2tfdGFiWzYgKyBub3JtVHlwZV0uZm5fMmRbZGVwdGhdKTsKKworICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0MS0+ZGF0YS5wdHIsIG1hdDFfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdG1hc2stPmRhdGEucHRyLCBtYXNrX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBjbiwgY29pLCAmbm9ybSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgICAgICBpZiggbWF0MiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZGdW5jMkRuQ18zQTFQIGZ1bmM7CisgICAgICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLAorICAgICAgICAgICAgICAgICAgICAoQ3ZGdW5jMkRuQ18zQTFQKW5vcm1tYXNrX3RhYls5ICsgbm9ybVR5cGVdLmZuXzJkW2RlcHRoXSk7CisKKyAgICAgICAgICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdDEtPmRhdGEucHRyLCBtYXQxX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXQyLT5kYXRhLnB0ciwgbWF0Ml9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0bWFzay0+ZGF0YS5wdHIsIG1hc2tfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIGNuLCBjb2ksICZub3JtX2RpZmYgKSk7CisKKyAgICAgICAgICAgICAgICBpZiggaXNfcmVsYXRpdmUgKQorICAgICAgICAgICAgICAgICAgICBub3JtID0gbm9ybV9kaWZmLyhub3JtICsgREJMX0VQU0lMT04pOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm1fZGlmZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbm9ybTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4b3V0dGV4dC5jcHAgYi9jeGNvcmUvc3JjL2N4b3V0dGV4dC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJlNTQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hvdXR0ZXh0LmNwcApAQCAtMCwwICsxLDMzNDUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCitjb25zdCBjaGFyKiBpY3ZIZXJzaGV5R2x5cGhzW10gPSB7CisgIiIsCisgIk1XUk1OViBSTVZWIFBTVFMiLAorICJNV09NT1YgT01TTVVOVVBTUSBPUVNRVVJVVVNWT1YiLAorICJNWFZOVE1STVBOT1BPU1BVUlZUVlZVIiwKKyAiTVdPTU9WIE9NUk1UTlVQVVNUVVJWT1YiLAorICJNV09NT1YgT01VTSBPUVNRIE9WVVYiLAorICJNVk9NT1YgT01VTSBPUVNRIiwKKyAiTVhWTlRNUk1QTk9QT1NQVVJWVFZWVVZSIFNSVlIiLAorICJNV09NT1YgVU1VViBPUVVRIiwKKyAiUFRSTVJWIiwKKyAiTlVTTVNUUlZQVk9UT1MiLAorICJNV09NT1YgVU1PUyBRUVVWIiwKKyAiTVZPTU9WIE9WVVYiLAorICJMWE5NTlYgTk1SViBWTVJWIFZNVlYiLAorICJNV09NT1YgT01VViBVTVVWIiwKKyAiTVhSTVBOT1BPU1BVUlZTVlVVVlNWUFVOU01STSIsCisgIk1XT01PViBPTVNNVU5VUVNST1IiLAorICJNWFJNUE5PUE9TUFVSVlNWVVVWU1ZQVU5TTVJNIFNUVlciLAorICJNV09NT1YgT01TTVVOVVFTUk9SIFJSVVYiLAorICJNV1VOU01RTU9OT09QUFRSVVNVVVNWUVZPVSIsCisgIk1XUk1SViBOTVZNIiwKKyAiTVhPTU9TUFVSVlNWVVVWU1ZNIiwKKyAiTVdOTVJWIFZNUlYiLAorICJMWE5NUFYgUk1QViBSTVRWIFZNVFYiLAorICJNV09NVVYgVU1PViIsCisgIk1XTk1SUVJWIFZNUlEiLAorICJNV1VNT1YgT01VTSBPVlVWIiwKKyAiTVdSTU5WIFJNVlYgUFNUUyIsCisgIk1XT01PViBPTVNNVU5VUFNRIE9RU1FVUlVVU1ZPViIsCisgIk1WT01PViBPTVVNIiwKKyAiTVdSTU5WIFJNVlYgTlZWViIsCisgIk1XT01PViBPTVVNIE9RU1EgT1ZVViIsCisgIk1XVU1PViBPTVVNIE9WVVYiLAorICJNV09NT1YgVU1VViBPUVVRIiwKKyAiTVhSTVBOT1BPU1BVUlZTVlVVVlNWUFVOU01STSBRUVRSIFRRUVIiLAorICJQVFJNUlYiLAorICJNV09NT1YgVU1PUyBRUVVWIiwKKyAiTVdSTU5WIFJNVlYiLAorICJMWE5NTlYgTk1SViBWTVJWIFZNVlYiLAorICJNV09NT1YgT01VViBVTVVWIiwKKyAiTVdPTVVNIFBRVFIgVFFQUiBPVlVWIiwKKyAiTVhSTVBOT1BPU1BVUlZTVlVVVlNWUFVOU01STSIsCisgIk1XT01PViBVTVVWIE9NVU0iLAorICJNV09NT1YgT01TTVVOVVFTUk9SIiwKKyAiTVdPTVJRT1YgT01VTSBPVlVWIiwKKyAiTVdSTVJWIE5NVk0iLAorICJNV05PTk5PTVBNUU5SUFJWIFZPVk5VTVRNU05SUCIsCisgIkxYUk1SViBQT05QTlNQVFRUVlNWUFRPUE8iLAorICJNV09NVVYgVU1PViIsCisgIkxYUk1SViBOT09QT1NRVFNUVVNVUFZPIiwKKyAiTVhPVlFWT1JPUFBOUk1TTVVOVlBWUlRWVlYiLAorICJNV1NNTVYgU01VViBPU1RTIiwKKyAiTVdRTU5WIFFNVE1WTlZQU1FQUSBTUVVSVVRUVVJWTlYiLAorICJMWFZQVU5UTVJNUE5PT05RTlNPVVBWUlZUVVVUIiwKKyAiTVhRTU5WIFFNVU1WT1ZRVVRUVVJWTlYiLAorICJNVlFNTlYgUU1WTSBQUVNRIE5WU1YiLAorICJNVlFNTlYgUU1WTSBQUVNRIiwKKyAiTFhWUFVOVE1STVBOT09OUU5TT1VQVlJWVFVVU1JTIiwKKyAiTVhRTU5WIFdNVFYgUFFVUSIsCisgIlBVVE1RViIsCisgIk9WVU1TU1JVUVZQVk9VT1QiLAorICJNVlFNTlYgVk1PUyBSUVRWIiwKKyAiTlZSTU9WIE9WVFYiLAorICJMWVBNTVYgUE1RViBYTVFWIFhNVVYiLAorICJNWFFNTlYgUU1UViBXTVRWIiwKKyAiTFhSTVBOT09OUU5TT1VQVlJWVFVVVFZSVlBVTlRNUk0iLAorICJNV1FNTlYgUU1VTVZOVlBVUVNSUFIiLAorICJMWFJNUE5PT05RTlNPVVBWUlZUVVVUVlJWUFVOVE1STSBRVlBVUFRRU1JTU1RUVlVXVlciLAorICJNV1FNTlYgUU1VTVZOVlBVUVNSUFIgUVJSVVNWVFZVVSIsCisgIk1XVk5UTVJNUE5QUFFRVFJVU1VVU1ZQVk5VIiwKKyAiTVZTTVBWIFBNVk0iLAorICJMWFBNTlNOVU9WUlZUVVVTV00iLAorICJNV09NUVYgV01RViIsCisgIktYTk1OViBTTU5WIFNNU1YgWE1TViIsCisgIk5XUU1UViBXTU5WIiwKKyAiTldRTVNRUVYgV01TUSIsCisgIk1XUU1XTU5WVFYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJMWE5NUlYgVk1SViBOTVZNIiwKKyAiTVdOTFZYIiwKKyAiTFhST05VIFJPVlUiLAorICJNV05WVlYiLAorICJQVlJNVVEiLAorICJNV01NT0tRS1RNVk1XSyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIk5XUVBUUFVRVVYgVVJRU1BUUFVRVlNWVVUiLAorICJNV09NT1YgT1NQVVJWVFVVU1RRUlBQUU9TIiwKKyAiTVdVUVNQUlBQUU9TUFVSVlNWVVUiLAorICJNV1VNVVYgVVNUUVJQUFFPU1BVUlZUVVVTIiwKKyAiTVdPU1VTVFFSUFBRT1NQVVJWVFYiLAorICJOVlVOVE1TTVJOUlYgUFBUUCIsCisgIk1XVVBVVlRYUllQWSBVU1RRUlBQUU9TUFVSVlRVVVMiLAorICJNV09NT1YgT1NQUVJQVFFVU1VWIiwKKyAiUFRSTFFNUk5TTVJMIFJQUlYiLAorICJQVVNMUk1TTlRNU0wgU1BTWFJZUVlQWCIsCisgIk5XUE1QViBVUFBUIFJTVVYiLAorICJQVFJNUlYiLAorICJLWU1QTVYgTVNOUU9QUFBRUVJTUlYgUlNTUVRQVVBWUVdTV1YiLAorICJNV09QT1YgT1NQUVJQVFFVU1VWIiwKKyAiTVdSUFBRT1NQVVJWVFVVU1RRUlAiLAorICJNV09QT1kgT1NQVVJWVFVVU1RRUlBQUU9TIiwKKyAiTVdVUFVZIFVTVFFSUFBRT1NQVVJWVFVVUyIsCisgIk5WUFBQViBQU1FRU1BUUCIsCisgIk5XVVFUUFFQUFFQUlFTVFNVVFVVVFZRVlBVIiwKKyAiTlZSTVJVU1ZUVlVVIFBQVFAiLAorICJNV1VQVVYgT1BPU1BVUlZUVVVTIiwKKyAiTlZPUFJWIFVQUlYiLAorICJMWE5QUFYgUlBQViBSUFRWIFZQVFYiLAorICJNV09QVVYgVVBPViIsCisgIk1XT1BSViBVUFJWUVhQWU9ZIiwKKyAiTVdPUFVQT1ZVViIsCisgIk1YVlBVU1RVUlZQVU9TUFFSUFRRVVVWViIsCisgIk1XT1RRVlNWVFVUU1NSUFFSUVRQVU9VTlRNUk1RTlBQT1ROWSIsCisgIk1YTlFPUFFQUlFSU1FXIFZQVVJTVFFXUFkiLAorICJNV1ROU01STVFOUU9SUFRRVVNUVVJWUFVPU1BRUlAiLAorICJOV1VRU1BRUFBRUFJRUyBTU1FTUFRQVVFWU1ZVVSIsCisgIk5XVE1TTlNPVFAgVVBTUFFRUFNQVVFWU1dTWFJZUVkiLAorICJMWE5RT1BQUFFRUVNQViBRU1JRVFBVUFZRVlNVVlRZIiwKKyAiTFhOUU9QUFBRUVFVUlZTVlRVVVNWUFZOVU1UTVNOU1BUUlVTV1QiLAorICJPVlJQUVNRVVJWU1ZUVSIsCisgIk1XUVBPViBVUFRQUlFQUyBQU1FVU1ZUViIsCisgIk1XT01QTVFOUlBVViBSUE9WIiwKKyAiTFlQUE1ZIFVQVFNTVVFWUFZPVU9TIFRTVFVVVlZWV1UiLAorICJNV05QT1BPViBVUFRTUlVPViIsCisgIk5XVE1TTlNPVFAgVVBTUFFRUVJSU1RTIFNTUVRQVVBWUVdTWFNZUlpRWiIsCisgIk1XUlBQUU9TUFVSVlRVVVNUUVJQIiwKKyAiTVhPUVFQVlAgUVBRUlBWIFRQVFJVViIsCisgIk1XT1NQVVJWVFVVU1RRUlBQUU9TTlkiLAorICJNWFZQUlBQUU9TUFVSVlRVVVNUUVJQIiwKKyAiTVhPUVFQVlAgU1BSViIsCisgIktYTVFOUE9QUFFQVVFWU1ZUVVVTVlAiLAorICJNWFBQT1FPU1BVUlZTVlVVVlNWUVVQVFBTUVJTUVkiLAorICJNV09QUFBRUVNYVFlVWSBVUFRSUFdPWSIsCisgIktZVE1SWSBNUU5QT1BQUVBVUVZUVlVVVlNXUCIsCisgIkxYT1BOUk5UT1ZRVlJUUlIgVVBWUlZUVVZTVlJUIiwKKyAiTFdUU1NRUVBPUU5TT1VRVlNVVFMgVVBUU1RVVVZWViIsCisgIk1XUU1PU1BVUlZUVVVTVFFSUFBRT1MiLAorICJNV1VRU1BSUFBRT1NQVVJWVFYiLAorICJMV1RTU1FRUE9RTlNPVVFWU1VUUyBWTVRTVFVVVlZWIiwKKyAiTVdPU1RTVVJVUVNQUlBQUU9TUFVSVlRWIiwKKyAiT1ZWTVVNVE5TUFFWUFhPWU5ZIFFQVVAiLAorICJNWFVTVFFSUFBRT1NQVVJWVFVVUyBWUFRWU1hSWVBZT1giLAorICJNVlFNTlYgT1NQUVFQU1BUUVRSU1RTVVRWVVYiLAorICJQVVNNU05UTlRNU00gUVBSUFNRU1JSVFJVU1ZUViIsCisgIk9VU01TTlROVE1TTSBRUFJQU1FTUlJWUVhQWU9ZTlgiLAorICJOVlJNT1YgVVBUUFJRUFMgUFNRVVNWVFYiLAorICJPVFNNUVNRVVJWU1YiLAorICJKWUtQTFBNUU1TTFYgTVNOUU9QUVBSUVJTUVYgUlNTUVRQVlBXUVdSVlRWVVdWWFYiLAorICJNV05QT1BQUVBTT1YgUFNRUVJQVFBVUVVSVFRUVVVWVlYiLAorICJNV1JQUFFPU1BVUlZUVVVTVFFSUCIsCisgIk1YTlBPUFBRUFNOWSBQU1FVU1ZVVVZTVVFTUFFRUFMiLAorICJNWFVTVFFSUFBRT1NQVVJWVFVVUyBWUFNZIiwKKyAiTVZPUFBQUVFRU1BWIFVRVFBTUFJRUVMiLAorICJOVlRRU1BRUFBRUFJRU1JTU1RTVVJWUFZPVSIsCisgIk5VU01RU1FVUlZTViBQUFRQIiwKKyAiTVdOUE9QUFFQUk9UT1VQVlJWU1VUUyBVUFRTVFVVVlZWIiwKKyAiTVdOUE9QUFFQUk9UT1VQVlJWVFVVUlVQIiwKKyAiS1lMUE1QTlFOUk1UTVVOVlBWUVVSU1NQIFJTUlVTVlVWVlVXUldQIiwKKyAiTVdPUVBQUVBSUVJVU1ZUVlVVIFZRVVBUUFNRUVVQVk9WTlUiLAorICJNV05QT1BQUVBST1RPVVBWUlZTVVRTIFVQU1ZSWFFZT1lOWCIsCisgIk5WVVBPViBQUVFQU1BUUSBQVVFWU1ZUVSIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIk1XVVNUUVJQUFFPU1BVUlZUVVVTVVBUTlJNUU0iLAorICJNV1VRU1BSUFBRT1NQVVJWU1ZVVSBPU1NTIiwKKyAiTVdSTVFOUFBPU09WUFdSV1NWVFRVUVVOVE1STSBQUlRSIiwKKyAiTVdUTVFZIFJQUFFPU1BVUlZTVlVVVlNVUVNQUlAiLAorICJNV1VRU1BRUE9RT1NQVFJVU1ZTV1JYUVgiLAorICIiLAorICIiLAorICJLWVRQVFNVVFZUV1NXUVZPVU5TTVFNT05OT01RTVNOVU9WUVdTV1VWIFRRU1BRUFBRUFNRVFNUVFMiLAorICJNV1VOT1JVViIsCisgIk1XT05VUk9WIiwKKyAiT1VUS1FLUVlUWSIsCisgIk9VUEtTS1NZUFkiLAorICJPVVRLU0xSTlJPU1FRUlNTUlVSVlNYVFkiLAorICJPVVBLUUxSTlJPUVFTUlFTUlVSVlFYUFkiLAorICJMWVBNUU5RT1BQT1BOT05OT01QTVNOVU5XTU5WIFVTVFRUVVVWVlZXVVdUVlNVUyIsCisgIlBUIiwKKyAiTlYiLAorICJNV1JNUE5PUE9TUFVSVlRVVVNVUFROUk0iLAorICJNV1BPUk1SViIsCisgIk1XT05RTVNNVU5VUFRST1ZVViIsCisgIk1XT05RTVNNVU5VUFNRIFJRU1FVUlVVU1ZRVk9VIiwKKyAiTVdTTVNWIFNNTlNWUyIsCisgIk1XUE1PUVFQUlBUUVVTVFVSVlFWT1UgUE1UTSIsCisgIk1XVE1STVBOT1BPU1BVUlZUVVVTVFFSUFBRT1MiLAorICJNV1VNUVYgT01VTSIsCisgIk1XUU1PTk9QUVFTUVVQVU5TTVFNIFFRT1JPVVFWU1ZVVVVSU1EiLAorICJNV1VQVFJSU1BST1BQTlJNVE5VUFVTVFVSVlBWIiwKKyAiUFVSVVJWU1ZTVVJVIiwKKyAiUFVTVlJWUlVTVVNXUlkiLAorICJQVVJQUlFTUVNQUlAgUlVSVlNWU1VSVSIsCisgIlBVUlBSUVNRU1BSUCBTVlJWUlVTVVNXUlkiLAorICJQVVJNUlIgU01TUiBSVVJWU1ZTVVJVIiwKKyAiTldQTlJNU01VTlVQUlFSUlNSU1FVUCBSVVJWU1ZTVVJVIiwKKyAiUFRSTVJRIiwKKyAiTlZQTVBRIFRNVFEiLAorICJOVlFNUE5QUFFRU1FUUFROU01RTSIsCisgIk1XUktSWCBVTlNNUU1PTk9QUVFUUlVTVVVTVlFWT1UiLAorICJNV1ZMTlgiLAorICJPVVRLUk5RUVFTUlZUWSIsCisgIk9VUEtSTlNRU1NSVlBZIiwKKyAiUFRSS1JZIiwKKyAiTFhOUlZSIiwKKyAiTFhSTlJWIE5SVlIiLAorICJMWE5QVlAgTlRWVCIsCisgIk1XT09VVSBVT09VIiwKKyAiTVdST1JVIE9QVVQgVVBPVCIsCisgIlBVUlFSUlNSU1FSUSIsCisgIlBVU01ST1JRU1FTUFJQIiwKKyAiUFVTTlJOUk1TTVNPUlEiLAorICJMWFNPVlJTVSBOUlZSIiwKKyAiTVhRTFFZIFRMVFkgT1FWUSBPVFZUIiwKKyAiTFhWUlVSVFNTVVJWT1ZOVU5TT1JSUVNQU05STVBNT05PUFFTU1VVVlZWIiwKKyAiTFhOTk9RT1NOViBWTlVRVVNWViBOTlFPU09WTiBOVlFVU1VWViIsCisgIkxZUlFRUE9QTlFOU09UUVRSU1NRVFBWUFdRV1NWVFRUU1NSUSIsCisgIiIsCisgIkhcXE5STVFMUk1TTlIgVlJXUVhSV1NWUiIsCisgIkhcXE1QTFFMUk1TTlNPUk9RTlBNUCBNUU1STlJOUU1RIFdQVlFWUldTWFNZUllRWFBXUCBXUVdSWFJYUVdRIiwKKyAiSVtLUllSIiwKKyAiIiwKKyAiSFxcUlVKUFJUWlBSVSIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIkZeSVNKUUxQTlBQUVRUVlVYVVpUW1EgSVNKUExPTk9QUFRTVlRYVFpTW1EgSVlKV0xWTlZQV1RaVltYW1paW1cgSVlKVkxVTlVQVlRZVlpYWlpZW1ciLAorICIiLAorICJGXklTSlFMUE5QUFFUVFZVWFVaVFtRIElTSlBMT05PUFBUU1ZUWFRaU1tRIElXW1cgSVtbWyIsCisgIiIsCisgIkNhR09dT1hJIExbR1VdVSIsCisgIiIsCisgIkRgRl5eXl5GRkZGXiIsCisgIiIsCisgIktZUVZPVU5TTlFPT1FOU05VT1ZRVlNVVVNWUVYgU1ZWUyBRVlZRIE9VVU8gTlNTTiBOUVFOIiwKKyAiIiwKKyAiSFxcSVJbUiIsCisgIkhcXElSW1IgSVFbUSIsCisgIiIsCisgIkxZUEZTQ1NQIFJEUlAgT1BWUCBNUlhSIE9WT1dOV05WT1VRVFRUVlVXV1ZZVFpRW09cXE5eTmEgVFRVVVZXVVlUWiBOYE9fUF9TYFZgV18gUF9TYVZhV19XXiIsCisgIkxZUEZTQ1NQIFJEUlAgT1BWUCBNUlhSIE9WT1dOV05WT1VRVFRUVlVXV1ZZVFogVFRVVVZXVVlUWiBSWlRaVltXXVdeVmBUYVFhT2BOX05eT15PXyBUWlVbVl1WXlVgVGEiLAorICJMWVBGU0NTUCBSRFJQIE9QVlAgTVJYUiBWVlZXV1dXVlZVVFRSVFBVT1ZOWU5eT2BRYVRhVmBXXldcXFZaVFlRWU5bIFJUUFZPWU9eUGBRYSBUYVVgVl5WXFxVWlRZIiwKKyAiTFlQRlNDU1AgUkRSUCBPUFZQIE1SWFIgUVRPVU5XT1lRWlRaVllXV1ZVVFRRVCBRVFBVT1dQWVFaIFRaVVlWV1VVVFQgUVpPW05dTl5PYFFhVGFWYFdeV11WW1RaIFFaUFtPXU9eUGBRYSBUYVVgVl5WXVVbVFoiLAorICJMWU9FT0ZORk5FT0RRQ1RDVkRXRlZIVElRSk9LTk1OUCBUQ1VEVkZVSFRJIE5PT05QTlNPVk9XTiBQTlNQVlBXTldNIE1SWFIgT1ZPV05XTlZPVVFUVFRWVVdXVllUWiBUVFVVVldVWVRaIFJaVFpWW1ddV15WYFRhUWFPYE5fTl5PXk9fIFRaVVtWXVZeVWBUYSIsCisgIkxZT0VPRk5GTkVPRFFDVENWRFdGVkhUSSBUQ1VEVkZVSFRJIFJJVElWSldMV01WT1RQUVBPT05OTk1PTU9OIFRJVUpWTFZNVU9UUCBNUlhSIFFUT1VOV09ZUVpUWlZZV1dWVVRUUVQgUVRQVU9XUFlRWiBUWlVZVldVVVRUIFFaT1tOXU5eT2BRYVRhVmBXXlddVltUWiBRWlBbT11PXlBgUWEgVGFVYFZeVl1VW1RaIiwKKyAiTFlPQ05JIE9DVkMgT0RTRFZDIE5JT0hRR1RHVkhXSldNVk9UUFFQT09OTk5NT01PTiBUR1VIVkpWTVVPVFAgTVJYUiBRVE9VTldPWVFaVFpWWVdXVlVUVFFUIFFUUFVPV1BZUVogVFpVWVZXVVVUVCBRWk9bTl1OXk9gUWFUYVZgV15XXVZbVFogUVpQW09dT15QYFFhIFRhVWBWXlZdVVtUWiIsCisgIkxZTkNORyBWRVJMUFAgV0NUSVFQIE5FUENSQ1VFIE5FUERSRFVFVkUgTVJYUiBRVE9VTldPWVFaVFpWWVdXVlVUVFFUIFFUUFVPV1BZUVogVFpVWVZXVVVUVCBRWk9bTl1OXk9gUWFUYVZgV15XXVZbVFogUVpQW09dT15QYFFhIFRhVWBWXlZdVVtUWiIsCisgIkxZT0NOSSBPQ1ZDIE9EU0RWQyBOSU9IUUdUR1ZIV0pXTVZPVFBRUE9PTk5OTU9NT04gVEdVSFZKVk1VT1RQIE1SWFIgVlZWV1dXV1ZWVVRUUlRQVU9WTllOXk9gUWFUYVZgV15XXFxWWlRZUVlOWyBSVFBWT1lPXlBgUWEgVGFVYFZeVlxcVVpUWSIsCisgIkxZUEZTQ1NQIFJEUlAgT1BWUCBNUlhSIFNWU2EgVFRUYSBUVE1dWF0gUWFWYSIsCisgIkxZT0VPRk5GTkVPRFFDVENWRFdGVkhUSSBUQ1VEVkZVSFRJIFJJVElWSldMV01WT1RQUVBPT05OTk1PTU9OIFRJVUpWTFZNVU9UUCBNUlhSIFNWU2EgVFRUYSBUVE1dWF0gUWFWYSIsCisgIkZeWVhXWlVbUltQWk1YS1dJV0hYSFpJW0tbTVpPV1BVUlFUS1dHWUZaRltHXFxIW0laSFtHW0ZaRllGV0dWSFRMUlBQVk5aTVogT1BVUCIsCisgIkVeUFtNWkpYSFVHUkdPSExKSU1HUEZURldHWUlbTFxcT1xcUltVWVhWWlNbUFsgTkpOVyBPSk9XIExKU0pWS1dNV05WUFNRT1EgU0pVS1ZNVk5VUFNRIExXUVcgU1FUUlVWVldXV1hWIFNRVVJWVldXIiwKKyAiRV5QW01aSlhIVUdSR09ITEpJTUdQRlRGV0dZSVtMXFxPXFxSW1VZWFZaU1tQWyBVS1ZKVk5VS1NKUEpOS01MTE9MUk1VTlZQV1NXVVZWVCBQSk5MTU9NUk5VUFciLAorICJFX0lNW00gSVJbUiBJV1tXIEtbWUkiLAorICJDYUhRR1JIU0lSSFEgUlFRUlJTU1JSUSBcXFFbUlxcU11SXFxRIiwKKyAiIiwKKyAiRV9OV0xUSVJMUE5NIExQSlJMVCBKUlpSIFZXWFRbUlhQVk0gWFBaUlhUIiwKKyAiSlpXTlRMUklQTE1OIFBMUkpUTCBSSlJaIFdWVFhSW1BYTVYgUFhSWlRYIiwKKyAiRl5aSlNKT0tNTEtOSlFKU0tWTVhPWVNaWlogU0ZTXiIsCisgIkZeSkpRSlVLV0xZTlpRWlNZVldYVVlRWkpaIFFGUV4iLAorICJGXkpKUUpVS1dMWU5aUVpTWVZXWFVZUVpKWiBPUlpSIiwKKyAiIiwKKyAiSFxcTEJMWyBSQlJbIFhCWFsiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJJW1JGSlsgUkZaWyBNVFdUIiwKKyAiR1xcS0ZLWyBLRlRGV0dYSFlKWUxYTldPVFAgS1BUUFdRWFJZVFlXWFlXWlRbS1siLAorICJIXVpLWUlXR1VGUUZPR01JTEtLTktTTFZNWE9aUVtVW1daWVhaViIsCisgIkdcXEtGS1sgS0ZSRlVHV0lYS1lOWVNYVldYVVpSW0tbIiwKKyAiSFtMRkxbIExGWUYgTFBUUCBMW1lbIiwKKyAiSFpMRkxbIExGWUYgTFBUUCIsCisgIkhdWktZSVdHVUZRRk9HTUlMS0tOS1NMVk1YT1pRW1VbV1pZWFpWWlMgVVNaUyIsCisgIkddS0ZLWyBZRllbIEtQWVAiLAorICJOVlJGUlsiLAorICJKWlZGVlZVWVRaUltQW05aTVlMVkxUIiwKKyAiR1xcS0ZLWyBZRktUIFBPWVsiLAorICJIWUxGTFsgTFtYWyIsCisgIkZeSkZKWyBKRlJbIFpGUlsgWkZaWyIsCisgIkddS0ZLWyBLRllbIFlGWVsiLAorICJHXVBGTkdMSUtLSk5KU0tWTFhOWlBbVFtWWlhYWVZaU1pOWUtYSVZHVEZQRiIsCisgIkdcXEtGS1sgS0ZURldHWEhZSllNWE9XUFRRS1EiLAorICJHXVBGTkdMSUtLSk5KU0tWTFhOWlBbVFtWWlhYWVZaU1pOWUtYSVZHVEZQRiBTV1ldIiwKKyAiR1xcS0ZLWyBLRlRGV0dYSFlKWUxYTldPVFBLUCBSUFlbIiwKKyAiSFxcWUlXR1RGUEZNR0tJS0tMTU1OT09VUVdSWFNZVVlYV1pUW1BbTVpLWCIsCisgIkpaUkZSWyBLRllGIiwKKyAiR11LRktVTFhOWlFbU1tWWlhYWVVZRiIsCisgIklbSkZSWyBaRlJbIiwKKyAiRl5IRk1bIFJGTVsgUkZXWyBcXEZXWyIsCisgIkhcXEtGWVsgWUZLWyIsCisgIklbSkZSUFJbIFpGUlAiLAorICJIXFxZRktbIEtGWUYgS1tZWyIsCisgIklbUkZKWyBSRlpbIE1UV1QiLAorICJHXFxLRktbIEtGVEZXR1hIWUpZTFhOV09UUCBLUFRQV1FYUllUWVdYWVdaVFtLWyIsCisgIkhZTEZMWyBMRlhGIiwKKyAiSVtSRkpbIFJGWlsgSltaWyIsCisgIkhbTEZMWyBMRllGIExQVFAgTFtZWyIsCisgIkhcXFlGS1sgS0ZZRiBLW1lbIiwKKyAiR11LRktbIFlGWVsgS1BZUCIsCisgIkddUEZOR0xJS0tKTkpTS1ZMWE5aUFtUW1ZaWFhZVlpTWk5ZS1hJVkdURlBGIE9QVVAiLAorICJOVlJGUlsiLAorICJHXFxLRktbIFlGS1QgUE9ZWyIsCisgIklbUkZKWyBSRlpbIiwKKyAiRl5KRkpbIEpGUlsgWkZSWyBaRlpbIiwKKyAiR11LRktbIEtGWVsgWUZZWyIsCisgIklbS0ZZRiBPUFVQIEtbWVsiLAorICJHXVBGTkdMSUtLSk5KU0tWTFhOWlBbVFtWWlhYWVZaU1pOWUtYSVZHVEZQRiIsCisgIkddS0ZLWyBZRllbIEtGWUYiLAorICJHXFxLRktbIEtGVEZXR1hIWUpZTVhPV1BUUUtRIiwKKyAiSVtLRlJQS1sgS0ZZRiBLW1lbIiwKKyAiSlpSRlJbIEtGWUYiLAorICJJW0tLS0lMR01GT0ZQR1FJUk1SWyBZS1lJWEdXRlVGVEdTSVJNIiwKKyAiSFxcUkZSWyBQS01MTE1LT0tSTFRNVVBWVFZXVVhUWVJZT1hNV0xUS1BLIiwKKyAiSFxcS0ZZWyBLW1lGIiwKKyAiR11SRlJbIElMSkxLTUxRTVNOVFFVU1VWVFdTWFFZTVpMW0wiLAorICJIXFxLW09bTFRLUEtMTElOR1FGU0ZWR1hJWUxZUFhUVVtZWyIsCisgIkdbR1tJWkxXT1NTTFZGVltVWFNVUVNOUUxRS1JLVExWTlhRWlRbWVsiLAorICJGXVNIVElUTFNQUlNRVU9YTVpLW0pbSVpJV0pSS09MTU5KUEhSR1VGWEZaR1tJW0taTVlOV09UUCBTUFRQV1FYUllUWVdYWVdaVVtSW1BaT1giLAorICJIXFxUTFRNVU5XTllNWktaSVlHV0ZURlFHT0lNTExOS1JLVkxZTVpPW1FbVFpWWFdWIiwKKyAiR15URlJHUUlQTU9TTlZNWEtaSVtHW0ZaRlhHV0lXS1hNWlBbU1tWWlhYWlRbT1tLWkhZR1dGVEZSSFJKU01VUFdSWlRcXFUiLAorICJIXFxWSlZLV0xZTFpLWklZR1ZGUkZPR05JTkxPTlBPU1BQUE1RTFJLVEtXTFlNWlBbU1tWWlhYWVYiLAorICJIXFxSTFBMTktNSU5HUUZURlhHW0ddRiBYR1ZOVFRSWFBaTltMW0paSVhJVkpVTFVOViBRUFpQIiwKKyAiR15HW0laTVZQUVFOUkpSR1FGUEZPR05JTkxPTlFPVU9YTllNWktaUVlWWFhWWlNbT1tMWkpYSVZJVCIsCisgIkZeTU1LTEpKSklLR01GTkZQR1FJUUtQT05VTFlKW0hbR1pHWCBNUlZPWE5bTF1KXkheR11GXFxGWkhYTFZSVVdVWlZbV1tZWlpZXFxWIiwKKyAiSVpXVlVUU1FST1FMUUlSR1NGVUZWR1dJV0xWUVRWU1hRWk9bTVtLWkpYSlZLVU1VT1YiLAorICJKWVReUltQVk9QT0pQR1JGVEZVR1ZKVk1VUlJbUGFPZE5mTGdLZktkTGFOXlBcXFNaV1giLAorICJGXk1NS0xKSkpJS0dNRk5GUEdRSVFLUE9OVUxZSltIW0daR1ggXkleR11GXFxGWkdYSVZMVE5ST1BPIFJPU1FTWFRaVVtWW1haWVlbViIsCisgIklcXE1ST1JTUVZPWE1ZS1lIWEZWRlVHVElTTlJTUVZQWE5aTFtKW0laSVhKV0xXTlhRWlRbVltZWltYIiwKKyAiQGFFTUNMQkpCSUNHRUZGRkhHSUlJS0hQR1RFWyBHVEpMTEhNR09GUEZSR1NJU0tSUFFUT1sgUVRUTFZIV0dZRlpGXFxHXUldS1xcUFpXWlpbW1xcW15aX1lhViIsCisgIkVdSk1ITEdKR0lIR0pGS0ZNR05JTktNUExUSlsgTFRPTFFIUkdURlZGWEdZSVlLWFBWV1ZaV1tYW1paW1ldViIsCisgIkhdVEZRR09JTUxMTktSS1ZMWU1aT1tRW1RaVlhYVVlTWk9aS1lIWEdWRlRGUkhSS1NOVVFXU1pVXFxWIiwKKyAiRl9TSFRJVExTUFJTUVVPWE1aS1tKW0laSVdKUktPTE1OSlBIUkdVRlpGXFxHXUheSl5NXU9cXFBaUVdRVVBUTyIsCisgIkheVUxUTlNPUVBPUE5OTkxPSVFHVEZXRllHWklaTVlQV1NTV1BZTlpLW0lbSFpIWElXS1dNWFBaU1tWW1laW1giLAorICJGX1NIVElUTFNQUlNRVU9YTVpLW0pbSVpJV0pSS09MTU5KUEhSR1VGWUZbR1xcSF1KXU1cXE9bUFlRVlFTUFRRVVNVWFZaWFtaWltZXVYiLAorICJIXFxIW0paTFhPVFFRU01USlRHU0ZSRlFHUElQS1FNU09WUVhTWVVZV1hZV1pUW1BbTVpLWEpWSlQiLAorICJIW1JMUExOS01JTkdRRlRGWEdbR11GIFhHVk5UVFJYUFpOW0xbSlpJWElWSlVMVU5WIiwKKyAiRV1KTUhMR0pHSUhHSkZLRk1HTklOS01PTFJLVktYTFpOW1BbUlpTWVVVWE1aRiBYTVdRVldWWldbWFtaWltZXVYiLAorICJGXUtNSUxISkhJSUdLRkxGTkdPSU9LTk9NUkxWTFlNW09bUVpUV1ZUWFBZTVpJWkdZRlhGV0dWSVZLV05ZUFtRIiwKKyAiQ19ITUZMRUpFSUZHSEZJRktHTElMTEtbIFVGS1sgVUZTWyBhRl9HXFxKWU5WVFNbIiwKKyAiRl5OTExMS0tLSUxHTkZQRlJHU0lTTFFVUVhSWlRbVltYWllYWVZYVVZVIF1JXUdcXEZaRlhHVklUTFBVTlhMWkpbSFtHWkdYIiwKKyAiRl1LTUlMSEpISUlHS0ZMRk5HT0lPS05PTVJMVkxYTVpOW1BbUlpUWFZVV1NZTSBbRllNVldUXVJiUGZOZ01mTWROYVBeU1tWWVtWIiwKKyAiSF1VTFROU09RUE9QTk5OTE9JUUdURldGWUdaSVpNWVBXVFRXUFpOW0tbSlpKWEtXTldQWFFZUltSXlFhUGNOZkxnS2ZLZExhTl5RW1RZWlYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJJW0pGUlsgWkZSWyBKRlpGIiwKKyAiR11JTFtiIiwKKyAiRV9SSklaIFJKW1oiLAorICJJW0pbWlsiLAorICJJW0pbWltaWkpaSlsiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJJXFxYTVhbIFhQVk5UTVFNT05NUExTTFVNWE9aUVtUW1ZaWFgiLAorICJIW0xGTFsgTFBOTlBNU01VTldQWFNYVVdYVVpTW1BbTlpMWCIsCisgIklbWFBWTlRNUU1PTk1QTFNMVU1YT1pRW1RbVlpYWCIsCisgIklcXFhGWFsgWFBWTlRNUU1PTk1QTFNMVU1YT1pRW1RbVlpYWCIsCisgIklbTFNYU1hRV09WTlRNUU1PTk1QTFNMVU1YT1pRW1RbVlpYWCIsCisgIk1ZV0ZVRlNHUkpSWyBPTVZNIiwKKyAiSVxcWE1YXVdgVmFUYlFiT2EgWFBWTlRNUU1PTk1QTFNMVU1YT1pRW1RbVlpYWCIsCisgIklcXE1GTVsgTVFQTlJNVU1XTlhRWFsiLAorICJOVlFGUkdTRlJFUUYgUk1SWyIsCisgIk1XUkZTR1RGU0VSRiBTTVNeUmFQYk5iIiwKKyAiSVpNRk1bIFdNTVcgUVNYWyIsCisgIk5WUkZSWyIsCisgIkNhR01HWyBHUUpOTE1PTVFOUlFSWyBSUVVOV01aTVxcTl1RXVsiLAorICJJXFxNTU1bIE1RUE5STVVNV05YUVhbIiwKKyAiSVxcUU1PTk1QTFNMVU1YT1pRW1RbVlpYWFlVWVNYUFZOVE1RTSIsCisgIkhbTE1MYiBMUE5OUE1TTVVOV1BYU1hVV1hVWlNbUFtOWkxYIiwKKyAiSVxcWE1YYiBYUFZOVE1RTU9OTVBMU0xVTVhPWlFbVFtWWlhYIiwKKyAiS1hPTU9bIE9TUFBSTlRNV00iLAorICJKW1hQV05UTVFNTk5NUE5SUFNVVFdVWFdYWFdaVFtRW05aTVgiLAorICJNWVJGUldTWlVbV1sgT01WTSIsCisgIklcXE1NTVdOWlBbU1tVWlhXIFhNWFsiLAorICJKWkxNUlsgWE1SWyIsCisgIkddSk1OWyBSTU5bIFJNVlsgWk1WWyIsCisgIkpbTU1YWyBYTU1bIiwKKyAiSlpMTVJbIFhNUltQX05hTGJLYiIsCisgIkpbWE1NWyBNTVhNIE1bWFsiLAorICJIXVFNT05NUExSS1VLWExaTltQW1JaVVdXVFlQWk0gUU1TTVROVVBXWFhaWVtaWyIsCisgIklcXFVGU0dRSU9NTlBNVExaS2IgVUZXRllIWUtYTVdOVU9STyBST1RQVlJXVFdXVllVWlNbUVtPWk5ZTVYiLAorICJJXFxKUExOTk1PTVFOUk9TUlNWUlsgWk1ZUFhSUltQX09iIiwKKyAiSVtUTVFNT05NUExTTFZNWU5aUFtSW1RaVlhXVVdSVk9UTVJLUUlRR1JGVEZWR1hJIiwKKyAiSlpXT1ZOVE1RTU9OT1BQUlNTIFNTT1RNVk1YTlpQW1NbVVpXWCIsCisgIkpZVEZSR1FIUUlSSlVLWEsgWEtUTVFPTlJNVU1XTllQW1NdVF9UYVNiUWJQYCIsCisgIkhcXElRSk9MTU5NT05PUE5UTFsgTlRQUFJOVE1WTVhPWFJXV1RiIiwKKyAiR1xcSFFJT0tNTU1OTk5QTVVNWE5aT1tRW1NaVVdWVVdSWE1YSldHVUZTRlJIUkpTTVVQV1JaVCIsCisgIkxXUk1QVE9YT1pQW1JbVFlVVyIsCisgIklbT01LWyBZTlhNV01VTlFST1NOUyBOU1BUUVVTWlRbVVtWWiIsCisgIkpaS0ZNRk9HUEhYWyBSTUxbIiwKKyAiSF1PTUliIE5RTVZNWU9bUVtTWlVYV1QgWU1XVFZYVlpXW1lbW1lcXFciLAorICJJW0xNT01OU01YTFsgWU1YUFdSVVVSWE9aTFsiLAorICJKWlRGUkdRSFFJUkpVS1hLIFVLUkxQTU9PT1FRU1RUVlQgVFRQVU5WTVhNWk9cXFNeVF9UYVJiUGIiLAorICJKW1JNUE5OUE1TTVZOWU9aUVtTW1VaV1hYVVhSV09WTlRNUk0iLAorICJHXVBNTFsgVU1WU1dYWFsgSVBLTk5NW00iLAorICJJW01TTVZOWU9aUVtTW1VaV1hYVVhSV09WTlRNUk1QTk5QTVNJYiIsCisgIkldW01RTU9OTVBMU0xWTVlOWlBbUltUWlZYV1VXUlZPVU5TTSIsCisgIkhcXFNNUFsgSlBMTk9NWk0iLAorICJIXFxJUUpPTE1OTU9OT1BNVk1ZT1tRW1RaVlhYVFlQWU0iLAorICJHXU9OTU9LUUpUSldLWUxaTltRW1RaV1hZVVpSWk9YTVZNVE9SU1BYTWIiLAorICJJW0tNTU1PT1VgV2JZYiBaTVlPV1JNXUtgSmIiLAorICJGXVZGTmIgR1FIT0pNTE1NTk1QTFVMWE1aT1tRW1RaVlhYVVpQW00iLAorICJGXU5NTE5KUUlUSVdKWktbTVtPWlFXIFJTUVdSWlNbVVtXWllXWlRaUVlOWE0iLAorICJMXFxVVVRTUlJQUk5TTVRMVkxYTVpPW1FbU1pUWFZSVVdVWlZbV1tZWlpZXFxWIiwKKyAiTVtNVk9TUk5TTFRJVEdTRlFHUElPTU5UTlpPW1BbUlpUWFVVVVJWVldXWVdbViIsCisgIk1YVFRUU1NSUVJPU05UTVZNWE5aUFtTW1ZZWFYiLAorICJMXFxVVVRTUlJQUk5TTVRMVkxYTVpPW1FbU1pUWFpGIFZSVVdVWlZbV1tZWlpZXFxWIiwKKyAiTlhPWVFYUldTVVNTUlJRUk9TTlVOWE9aUVtTW1VaVllYViIsCisgIk9XT1ZTUVVOVkxXSVdHVkZUR1NJUVFOWkthSmRKZktnTWZOY09aUFtSW1RaVVlXViIsCisgIkxbVVVUU1JSUFJOU01UTFZMWE1aT1tRW1NaVFkgVlJUWVBkT2ZNZ0xmTGRNYVBeU1xcVVtYWVtWIiwKKyAiTVxcTVZPU1JOU0xUSVRHU0ZRR1BJT01OU01bIE1bTlhPVlFTU1JVUlZTVlVVWFVaVltXW1laWllcXFYiLAorICJQV1NNU05UTlRNU00gUFZSUlBYUFpRW1JbVFpVWVdWIiwKKyAiUFdTTVNOVE5UTVNNIFBWUlJMZEtmSWdIZkhkSWFMXk9cXFFbVFlXViIsCisgIk1bTVZPU1JOU0xUSVRHU0ZRR1BJT01OU01bIE1bTlhPVlFTU1JVUlZTVlVUVlFWIFFWU1dUWlVbVltYWllZW1YiLAorICJPV09WUVNUTlVMVklWR1VGU0dSSVFNUFRQWlFbUltUWlVZV1YiLAorICJFXkVWR1NJUkpTSlRJWEhbIElYSlZMU05SUFJRU1FUUFhPWyBQWFFWU1NVUldSWFNYVVdYV1pYW1lbW1pcXFleViIsCisgIkpcXEpWTFNOUk9TT1ROWE1bIE5YT1ZRU1NSVVJWU1ZVVVhVWlZbV1tZWlpZXFxWIiwKKyAiTFpSUlBSTlNNVExWTFhNWk9bUVtTWlRZVVdVVVRTUlJRU1FVUldUWFdYWVdaViIsCisgIktaS1ZNU05RTVVHZyBNVU5TUFJSUlRTVVVVV1RZU1pRWyBNWk9bUltVWldZWlYiLAorICJMW1VVVFNSUlBSTlNNVExWTFhNWk9bUVtTWiBWUlVVU1pQYU9kT2ZQZ1JmU2NTXFxVW1hZW1YiLAorICJNWk1WT1NQUVBTU1NUVFRWU1lTWlRbVVtXWlhZWlYiLAorICJOWU5WUFNRUVFTU1ZUWFRaUlsgTlpQW1RbVlpXWVlWIiwKKyAiT1hPVlFTU08gVkZQWFBaUVtTW1VaVllYViBQTldOIiwKKyAiTFtMVk5STFhMWk1bT1tRWlNYVVUgVlJUWFRaVVtWW1haWVlbViIsCisgIkxbTFZOUk1XTVpOW09bUlpUWFVVVVIgVVJWVldXWVdbViIsCisgIkleTFJKVElXSVlKW0xbTlpQWCBSUlBYUFpRW1NbVVpXWFhVWFIgWFJZVlpXXFxXXlYiLAorICJKWkpWTFNOUlBSUVNRWlJbVVtYWVpWIFdTVlJUUlNTT1pOW0xbS1oiLAorICJMW0xWTlJMWExaTVtPW1FaU1hVVSBWUlBkT2ZNZ0xmTGRNYVBeU1xcVVtYWVtWIiwKKyAiTFpMVk5TUFJSUlRUVFZTWFFaTltQXFxRXlFhUGRPZk1nTGZMZE1hUF5TXFxXWVpWIiwKKyAiSlxcS1tOWlFYU1ZVU1dPWEtYSVdHVUZTR1JIUUpQT1BUUVhSWlRbVltYWllZIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSVtXVVdSVk9VTlNNUU1PTk1QTFNMVk1ZTlpQW1JbVFpWWFdVWFBYS1dIVkdURlJGUEdOSSIsCisgIkpaV05VTVJNUE5OUE1TTVZOWU9aUVtUW1ZaIE1UVVQiLAorICJKW1RGUkdQSk9MTk9NVE1YTlpPW1FbU1pVV1ZVV1JYTVhJV0dWRlRGIE5QV1AiLAorICJIXFxWRk5iIFFNTk5MUEtTS1ZMWE5aUVtTW1ZaWFhZVVlSWFBWTlNNUU0iLAorICJJW1hPV05UTVFNTk5NT0xRTFNNVU9XU1pUXFxUXlNfUV8iLAorICIiLAorICIiLAorICJEYVdOVkxUS1FLT0xOTU1PTVJOVE9VUVZUVlZVV1MgV0tXU1hVWVZbVlxcVV1TXU9cXExbSllIV0dURlFGTkdMSEpKSUxIT0hSSVVKV0xZTlpRW1RbV1pZWSIsCisgIkZeWklKUlpbIiwKKyAiRl5KSVpSSlsiLAorICJLWU9CT2IgT0JWQiBPYlZiIiwKKyAiS1lVQlViIE5CVUIgTmJVYiIsCisgIktZVEJRRVBIUEpRTVNPU1BPUlNUU1VRV1BaUFxcUV9UYiIsCisgIktZUEJTRVRIVEpTTVFPUVBVUlFUUVVTV1RaVFxcU19QYiIsCisgIkZeW0ZZR1ZIU0hQR05GTEZKR0lJSUtLTU1NT0xQSlBITkYgW0ZJWyBZVFdUVVVUV1RZVltYW1paW1hbVllUIiwKKyAiTlYiLAorICJKWiIsCisgIkhcXFFGTkdMSktPS1JMV05aUVtTW1ZaWFdZUllPWEpWR1NGUUYiLAorICJIXFxOSlBJU0ZTWyIsCisgIkhcXExLTEpNSE5HUEZURlZHV0hYSlhMV05VUUtbWVsiLAorICJIXFxNRlhGUk5VTldPWFBZU1lVWFhWWlNbUFtNWkxZS1ciLAorICJIXFxVRktUWlQgVUZVWyIsCisgIkhcXFdGTUZMT01OUE1TTVZOWFBZU1lVWFhWWlNbUFtNWkxZS1ciLAorICJIXFxYSVdHVEZSRk9HTUpMT0xUTVhPWlJbU1tWWlhYWVVZVFhRVk9TTlJOT09NUUxUIiwKKyAiSFxcWUZPWyBLRllGIiwKKyAiSFxcUEZNR0xJTEtNTU9OU09WUFhSWVRZV1hZV1pUW1BbTVpMWUtXS1RMUk5QUU9VTldNWEtYSVdHVEZQRiIsCisgIkhcXFhNV1BVUlJTUVNOUkxQS01LTExJTkdRRlJGVUdXSVhNWFJXV1VaUltQW01aTFgiLAorICJNV1JZUVpSW1NaUlkiLAorICJNV1NaUltRWlJZU1pTXFxSXlFfIiwKKyAiTVdSTVFOUk9TTlJNIFJZUVpSW1NaUlkiLAorICJNV1JNUU5ST1NOUk0gU1pSW1FaUllTWlNcXFJeUV8iLAorICJNV1JGUlQgUllRWlJbU1pSWSIsCisgIklbTEtMSk1ITkdQRlRGVkdXSFhKWExXTlZPUlFSVCBSWVFaUltTWlJZIiwKKyAiTlZSRlJNIiwKKyAiSlpORk5NIFZGVk0iLAorICJLWVFGT0dOSU5LT01RTlNOVU1WS1ZJVUdTRlFGIiwKKyAiSFxcUEJQXyBUQlRfIFlJV0dURlBGTUdLSUtLTE1NTk9PVVFXUlhTWVVZWFdaVFtQW01aS1giLAorICJHXVtCSWIiLAorICJLWVZCVERSR1BLT1BPVFBZUl1UYFZiIiwKKyAiS1lOQlBEUkdUS1VQVVRUWVJdUGBOYiIsCisgIk5WUkJSYiIsCisgIkVfSVJbUiIsCisgIkVfUklSWyBJUltSIiwKKyAiRV9JT1tPIElVW1UiLAorICJHXUtLWVkgWUtLWSIsCisgIkpaUkxSWCBNT1dVIFdPTVUiLAorICJNV1JRUVJSU1NSUlEiLAorICJNV1NGUkdRSVFLUkxTS1JKIiwKKyAiTVdSSFFHUkZTR1NJUktRTCIsCisgIkVfVU1YUFtSWFRVVyBJUltSIiwKKyAiR11PRk9iIFVGVWIgSlFaUSBKV1pXIiwKKyAiRV9cXE9cXE5bTVpNWU5YUFZVVFhSWlBbTFtKWklZSFdIVUlTSlJRTlJNU0tTSVJHUEZOR01JTUtOTlBRVVhXWllbW1tcXFpcXFkiLAorICJHXUlJSktLT0tVSllJWyBbSVpLWU9ZVVpZW1sgSUlLSk9LVUtZSltJIElbS1pPWVVZWVpbWyIsCisgIkZfXFxRW09ZTldOVU9UUFFUUFVOVkxWSlVJU0lRSk9MTk5OUE9RUFRUVVVXVllWW1VcXFNcXFEiLAorICJLWU9CT1sgVUJVWyIsCisgIkZeUkJSWyBJW1tbIiwKKyAiRl5bQklbW1siLAorICJFX1JJUUpSS1NKUkkgSVlIWklbSlpJWSBbWVpaW1tcXFpbWSIsCisgIkZeUkhOTEtQSlNKVUtXTVhPWFFXUlUgUkhWTFlQWlNaVVlXV1hVWFNXUlUgUlVRWVBcXCBSVVNZVFxcIFBcXFRcXCIsCisgIkZeUk5RS1BJTkhNSEtJSktKT0tSTFROV1JcXCBSTlNLVElWSFdIWUlaS1pPWVJYVFZXUlxcIiwKKyAiRl5SR1BKTE9JUiBSR1RKWE9bUiBJUkxVUFpSXSBbUlhVVFpSXSIsCisgIkZeUlRUV1ZYWFhaV1tVW1NaUVhQVlBTUSBTUVVPVk1WS1VJU0hRSE9JTktOTU9PUVEgUVFOUExQSlFJU0lVSldMWE5YUFdSVCBSVFFZUFxcIFJUU1lUXFwgUFxcVFxcIiwKKyAiRl5SUlJbUVxcIFJWUVxcIFJJUUhPSE5JTktPTlJSIFJJU0hVSFZJVktVTlJSIFJSTk9MTkpOSU9JUUpSIFJSVk9YTlpOW09bUVpSIFJSTlVMVkpWSVVJU0pSIFJSVlVYVlpWW1VbU1pSIiwKKyAiRl5JU0pTTFRNVk1YTFogSVNJUkpRTFFNUk5UTldNWUxaIFJHUElPTE9PUVVRWFBaUlxcIFJHVElVTFVPU1VTWFRaUlxcIFtTW1JaUVhRV1JWVFZXV1lYWiBbU1pTWFRXVldYWFogS1ZZViIsCisgIiIsCisgIiIsCisgIiIsCisgIlBTU1JSU1FTUFJQUVFQUlBTUVNTUlVRViBRUVFSUlJSUVFRIiwKKyAiUFRRUFBRUFNRVFNUVFNUUVNQUVAgUlFRUlJTU1JSUSIsCisgIk5WUE9UVSBUT1BVIE5SVlIiLAorICJNV1JLUU1PUE1SIFJLU01VUFdSIFJNT1EgUk1VUSBST1BRIFJPVFEgUVFTUSBNUldSIiwKKyAiTVdNUk1RTk9PTlFNU01VTlZPV1FXUiBQTlROIE9PVU8gTlBWUCBOUVZRIE1SV1IiLAorICJMUkxGTFJSUkxGIExJUFEgTExPUiBMT01RIiwKKyAiTVdSS1FNT1BNUiBSS1NNVVBXUiIsCisgIk1XV1JXUVZPVU5TTVFNT05OT01RTVIiLAorICJHXV1SXVBcXE1aSldIVEdQR01ISkpITUdQR1IiLAorICJNV01STVNOVU9WUVdTV1VWVlVXU1dSIiwKKyAiTFhMUE5SUVNTU1ZSWFAiLAorICJSVVJVVFRVUlRQUk8iLAorICJSVlJSVVBWTlZMVUtUSyIsCisgIk5SUlJPUE5OTkxPS1BLIiwKKyAiTVdXSFZHVEZRRk9HTkhNSk1MTk5PT1VTVlRXVldYVlpVW1NcXFBcXE5bTVoiLAorICJHXUlXSFZHVEdRSE9JTktNTU1PTlBPVFVVVldXWVdbVlxcVV1TXVBcXE5bTSIsCisgIkddUlJUVVVWV1dZV1tWXFxVXVNdUVxcT1tOWU1XTVVOVE9QVU9WTVdLV0lWSFVHU0dRSE9JTktNTU1PTlBPUlIiLAorICJIXFxLRktbIEhGW0ZRUFtaIFpWW1lcXFsgWlZaWSBXWVpZIFdZWlpcXFsiLAorICJLWVVBUkJQQ05FTEhLTEtSTFVOV1FYU1hWV1hVWVIgS1BMTU5LUUpTSlZLWE1ZUFlWWFpWXVRfUmBPYSIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIj5mPlJmUiIsCisgIkRgRGBgRCIsCisgIlJSUj5SZiIsCisgIkRgRERgYCIsCisgIkRgRFJgUiIsCisgIkZeRlleSyIsCisgIktZS15ZRiIsCisgIiIsCisgIktZS0ZZXiIsCisgIkZeRkteWSIsCisgIktZS1JZUiIsCisgIk1XTVdXTSIsCisgIiIsCisgIk1XTU1XVyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIkRgRE9HUUtTUFRUVFlTXVFgTyIsCisgIlBVVURTR1FLUFBQVFFZU11VYCIsCisgIk9UT0RRR1NLVFBUVFNZUV1PYCIsCisgIkRgRFVHU0tRUFBUUFlRXVNgVSIsCisgIktZUkpZTktWUloiLAorICJKWkpSTktWWVpSIiwKKyAiS1lLVktOWVZZTiIsCisgIkpaTFhKUFpUWEwiLAorICJKWkpdTF1PXFxRW1RYVVZWU1ZPVUxUSlNJUUlQSk9MTk9OU09WUFhTW1VcXFhdWl0iLAorICJJXV1aXVhcXFVbU1hQVk9TTk9OTE9KUElRSVNKVExVT1ZTVlZVWFRbUVxcT11MXUoiLAorICJKWlpHWEdVSFNJUExPTk5RTlVPWFBaUVtTW1RaVVhWVVZRVU5UTFFJT0hMR0pHIiwKKyAiR1tHSkdMSE9JUUxUTlVRVlVWWFVaVFtTW1FaUFhPVU5RTk5PTFBJU0hVR1hHWiIsCisgIkVbRVBGUkhUSlVNVlFWVVVYU1pQW05aTFdMU01RTk5QTFNLVktZTFxcTV4iLAorICJFWUVUSFZLV1BXU1ZWVFhRWU5ZTFhLVktTTFBOTlFNVE1ZTlxcUF8iLAorICJPVVFPT1FPU1FVU1VVU1VRU09RTyBRUFBRUFNRVFNUVFNUUVNQUVAgUlFRUlJTU1JSUSIsCisgIiIsCisgIkRgRFJKUiBPUlVSIFpSYFIiLAorICJEYERVRE9gT2BVIiwKKyAiSlpSREpSIFJEWlIiLAorICJEYERSYFIgSllaWSBQYFRgIiwKKyAiRGBEUmBSIERSUmIgYFJSYiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIktZUUtOTExOS1FLU0xWTlhRWVNZVlhYVllTWVFYTlZMU0tRSyIsCisgIkxYTExMWFhYWExMTCIsCisgIktZUkpLVllWUkoiLAorICJMWFJITFJSXFxYUlJIIiwKKyAiSlpSSVBPSk9PU01ZUlVXWVVTWk9UT1JJIiwKKyAiS1lSS1JZIEtSWVIiLAorICJNV01NV1cgV01NVyIsCisgIk1XUkxSWCBNT1dVIFdPTVUiLAorICIiLAorICIiLAorICJOVlFOT09OUU5TT1VRVlNWVVVWU1ZRVU9TTlFOIE9RT1MgUFBQVCBRT1FVIFJPUlUgU09TVSBUUFRUIFVRVVMiLAorICJOVk5OTlZWVlZOTk4gT09PVSBQT1BVIFFPUVUgUk9SVSBTT1NVIFRPVFUgVU9VVSIsCisgIk1XUkxNVVdVUkwgUk9PVCBST1VUIFJSUVQgUlJTVCIsCisgIkxVTFJVV1VNTFIgT1JUVSBPUlRPIFJSVFMgUlJUUSIsCisgIk1XUlhXT01PUlggUlVVUCBSVU9QIFJSU1AgUlJRUCIsCisgIk9YWFJPTU9XWFIgVVJQTyBVUlBVIFJSUFEgUlJQUyIsCisgIkxYUkxOV1hQTFBWV1JMIFJSUkwgUlJMUCBSUk5XIFJSVlcgUlJYUCIsCisgIiIsCisgIiIsCisgIiIsCisgIk1XUkxSWCBPT1VPIE1VT1dRWFNYVVdXVSIsCisgIkxYUkxSWCBMUU1PV09YUSBQV1RXIiwKKyAiS1lNTldYIFdOTVggT0xMT0tRIFVMWE9ZUSIsCisgIklbTklJWyBWSVtbIE1NW1sgV01JWyBOSVZJIE1NV00iLAorICJJW1JHUlYgTUpXUCBXSk1QIElWTFxcIFtWWFxcIElWW1YgTFxcWFxcIiwKKyAiR1tNSlNWIEtQU0wgR1xcW1xcW1JHXFwiLAorICJMWFBMUFBMUExUUFRQWFRYVFRYVFhQVFBUTFBMIiwKKyAiS1lZUFhOVkxTS1FLTkxMTktRS1NMVk5YUVlTWVZYWFZZVCBZUFdOVU1TTVFOUE9PUU9TUFVRVlNXVVdXVllUIiwKKyAiS1lSSktWWVZSSiBSWllOS05SWiIsCisgIkddUElQR1FGU0ZUR1RJIEdaSFhKVktUTFBMS01KT0lVSVdKWEtYUFlUWlZcXFhdWiBHWl1aIFFaUFtRXFxTXFxUW1NaIiwKKyAiSlpSTVJTIFJTUVxcIFJTU1xcIFFcXFNcXCBSTVFKUEhORyBRSk5HIFJNU0pUSFZHIFNKVkcgUk1OS0xLSk0gUExMTEpNIFJNVktYS1pNIFRMWExaTSBSTVBOT09PUiBSTVBPT1IgUk1UTlVPVVIgUk1UT1VSIiwKKyAiSlpSSVJLIFJOUlAgUlNSVSBSWVFcXCBSWVNcXCBRXFxTXFwgUkdRSVBKIFJHU0lUSiBQSlJJVEogUktQTk5PTU4gUktUTlZPV04gTk9QT1JOVE9WTyBSUFBTTlRMVEtSS1NMVCBSUFRTVlRYVFlSWVNYVCBOVFBUUlNUVFZUIFJVUFhPWU1aTFpLWUpXSllMWiBSVVRYVVlXWlhaWVlaV1pZWFogTVpPWlJZVVpXWiIsCisgIkpaUllRXFwgUllTXFwgUVxcU1xcIFJZVVpYWlpYWlVZVFdUWVJaT1lNV0xVTVZKVUhTR1FHT0hOSk9NTUxLTUpPS1JNVEtUSlVKWExaT1pSWSIsCisgIkpaUllRXFwgUllTXFwgUVxcU1xcIFJZVlhWVlhVWFJaUVpMWUlYSFZIVEdQR05ITEhLSUpMSlFMUkxVTlZOWFJZIiwKKyAiSVtJUEtSIExLTlAgUkdSTyBYS1ZQIFtQWVIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJRU1JRUVJSU1NSUlEiLAorICJQVFFQUFFQU1FUU1RUU1RRU1BRUCIsCisgIk5WUU5PT05RTlNPVVFWU1ZVVVZTVlFVT1NOUU4iLAorICJNV1FNT05OT01RTVNOVU9WUVdTV1VWVlVXU1dRVk9VTlNNUU0iLAorICJLWVFLTkxMTktRS1NMVk5YUVlTWVZYWFZZU1lRWE5WTFNLUUsiLAorICJHXVBHTUhKSkhNR1BHVEhXSlpNXFxQXVRdV1xcWlpcXFddVF1QXFxNWkpXSFRHUEciLAorICJBY1BBTEJKQ0dFRUdDSkJMQVBBVEJYQ1pFXUdfSmFMYlBjVGNYYlphXV9fXWFaYlhjVGNQYkxhSl9HXUVaQ1hCVEFQQSIsCisgIjxoUDxLPUc/REFBRD9HPUs8UDxUPVk/XUFgRGNHZUtnUGhUaFlnXWVgY2NgZV1nWWhUaFBnS2VHY0RgQV0/WT1UPFA8IiwKKyAiKXtPKUkqRStALTswNzMzNzA7LUArRSpJKU8pVSpbK18tZDBpM203cTt0QHdFeUl6T3tVe1t6X3lkd2l0bXFxbXRpd2R5X3pbe1V7T3pJeUV3QHQ7cTdtM2kwZC1fK1sqVSlPKSIsCisgIj5mUkFQQ01ESkRHQ0VBPkhASkFNQVpCXURfR2BNYFBhUmMgUkFUQ1dEWkRdQ19BZkhkSmNNY1piXWBfXWBXYFRhUmMiLAorICJBY1JBUENNREpER0NFQUJHQUtBUEJURFhHXFxMYFJjIFJBVENXRFpEXUNfQWJHY0tjUGJUYFhdXFxYYFJjIEJIYkgiLAorICJIW1dQVlFXUlhRWFBWTlRNUU1OTkxQS1NLVUxYTlpRW1NbVlpYWCBRTU9OTVBMU0xVTVhPWlFbIExiWEYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJLWVJLTVggUk5WWCBSS1dYIE9UVFQgS1hQWCBUWFlYIiwKKyAiSlpOS05YIE9LT1ggTEtTS1ZMV05WUFNRIFNLVUxWTlVQU1EgT1FTUVZSV1RXVVZXU1hMWCBTUVVSVlRWVVVXU1giLAorICJLWVZMV0tXT1ZMVEtRS09MTk1NUE1TTlZPV1FYVFhWV1dVIFFLT01OUE5TT1ZRWCIsCisgIkpaTktOWCBPS09YIExLU0tWTFdNWFBYU1dWVldTWExYIFNLVUxWTVdQV1NWVlVXU1giLAorICJKWU5LTlggT0tPWCBTT1NTIExLVktWT1VLIE9RU1EgTFhWWFZUVVgiLAorICJKWE5LTlggT0tPWCBTT1NTIExLVktWT1VLIE9RU1EgTFhRWCIsCisgIktbVkxXS1dPVkxUS1FLT0xOTU1QTVNOVk9XUVhUWFZXIFFLT01OUE5TT1ZRWCBUWFVXVlUgVlNWWCBXU1dYIFRTWVMiLAorICJKW05LTlggT0tPWCBWS1ZYIFdLV1ggTEtRSyBUS1lLIE9RVlEgTFhRWCBUWFlYIiwKKyAiTldSS1JYIFNLU1ggUEtVSyBQWFVYIiwKKyAiTFhTS1NVUldRWCBUS1RVU1dRWFBYTldNVU5UT1VOViBRS1ZLIiwKKyAiSlpOS05YIE9LT1ggV0tPUyBRUVZYIFJRV1ggTEtRSyBUS1lLIExYUVggVFhZWCIsCisgIktYT0tPWCBQS1BYIE1LUksgTVhXWFdUVlgiLAorICJJXFxNS01YIE5OUlggTktSVSBXS1JYIFdLV1ggWEtYWCBLS05LIFdLWksgS1hPWCBVWFpYIiwKKyAiSlpOS05YIE9NVlggT0tWViBWS1ZYIExLT0sgVEtYSyBMWFBYIiwKKyAiS1pRS09MTk1NUE1TTlZPV1FYVFhWV1dWWFNYUFdNVkxUS1FLIFFLT01OUE5TT1ZRWCBUWFZWV1NXUFZNVEsiLAorICJKWU5LTlggT0tPWCBMS1NLVkxXTldPVlFTUk9SIFNLVUxWTlZPVVFTUiBMWFFYIiwKKyAiS1pRS09MTk1NUE1TTlZPV1FYVFhWV1dWWFNYUFdNVkxUS1FLIFFLT01OUE5TT1ZRWCBUWFZWV1NXUFZNVEsgUFdQVVFUU1RUVVVaVltXW1haIFRVVVhWWldbIiwKKyAiSlpOS05YIE9LT1ggTEtTS1ZMV05XT1ZRU1JPUiBTS1VMVk5WT1VRU1IgTFhRWCBTUlRTVVdWWFdYWFcgU1JVU1ZXV1giLAorICJLWlZNV0tXT1ZNVUxTS1FLT0xOTU5PT1BRUVRSVlNXVCBOTk9PUVBUUVZSV1NXVlZXVFhSWFBXT1ZOVE5YT1YiLAorICJLWlJLUlggU0tTWCBOS01PTUtYS1hPV0sgUFhVWCIsCisgIkpbTktOVU9XUVhUWFZXV1VXSyBPS09VUFdRWCBMS1FLIFVLWUsiLAorICJLWU1LUlggTktSVSBXS1JYIEtLUEsgVEtZSyIsCisgIklbTEtPWCBNS09UIFJLT1ggUktVWCBTS1VUIFhLVVggSktPSyBWS1pLIiwKKyAiS1pOS1ZYIE9LV1ggV0tOWCBMS1FLIFRLWUsgTFhRWCBUWFlYIiwKKyAiTFlOS1JSUlggT0tTUiBXS1NSU1ggTEtRSyBUS1lLIFBYVVgiLAorICJMWVZLTlggV0tPWCBPS05PTktXSyBOWFdYV1RWWCIsCisgIktZUktNWCBSTlZYIFJLV1ggT1RUVCBLWFBYIFRYWVgiLAorICJKWk5LTlggT0tPWCBMS1NLVkxXTlZQU1EgU0tVTFZOVVBTUSBPUVNRVlJXVFdVVldTWExYIFNRVVJWVFZVVVdTWCIsCisgIktYT0tPWCBQS1BYIE1LV0tXT1ZLIE1YUlgiLAorICJLWVJLTFggUk1XWCBSS1hYIE1XVlcgTFhYWCIsCisgIkpZTktOWCBPS09YIFNPU1MgTEtWS1ZPVUsgT1FTUSBMWFZYVlRVWCIsCisgIkxZVktOWCBXS09YIE9LTk9OS1dLIE5YV1hXVFZYIiwKKyAiSltOS05YIE9LT1ggVktWWCBXS1dYIExLUUsgVEtZSyBPUVZRIExYUVggVFhZWCIsCisgIktaUUtPTE5NTVBNU05WT1dRWFRYVldXVlhTWFBXTVZMVEtRSyBRS09NTlBOU09WUVggVFhWVldTV1BWTVRLIFFPUVQgVE9UVCBRUVRRIFFSVFIiLAorICJOV1JLUlggU0tTWCBQS1VLIFBYVVgiLAorICJKWk5LTlggT0tPWCBXS09TIFFRVlggUlFXWCBMS1FLIFRLWUsgTFhRWCBUWFlYIiwKKyAiS1lSS01YIFJOVlggUktXWCBLWFBYIFRYWVgiLAorICJJXFxNS01YIE5OUlggTktSVSBXS1JYIFdLV1ggWEtYWCBLS05LIFdLWksgS1hPWCBVWFpYIiwKKyAiSlpOS05YIE9NVlggT0tWViBWS1ZYIExLT0sgVEtYSyBMWFBYIiwKKyAiSlpNSkxNIFhKV00gUFBPUyBVUFRTIE1WTFkgWFZXWSBNS1dLIE1MV0wgUFFUUSBQUlRSIE1XV1cgTVhXWCIsCisgIktaUUtPTE5NTVBNU05WT1dRWFRYVldXVlhTWFBXTVZMVEtRSyBRS09NTlBOU09WUVggVFhWVldTV1BWTVRLIiwKKyAiSltOS05YIE9LT1ggVktWWCBXS1dYIExLWUsgTFhRWCBUWFlYIiwKKyAiSllOS05YIE9LT1ggTEtTS1ZMV05XT1ZRU1JPUiBTS1VMVk5WT1VRU1IgTFhRWCIsCisgIktbTUtSUSBOS1NRTVggTUtXS1hPVksgTldXVyBNWFdYWFRWWCIsCisgIktaUktSWCBTS1NYIE5LTU9NS1hLWE9XSyBQWFVYIiwKKyAiS1pNT05MT0tQS1FMUk9SWCBYT1dMVktVS1RMU09TWCBNT05NT0xQTFFNUk8gWE9XTVZMVUxUTVNPIFBYVVgiLAorICJLWlJLUlggU0tTWCBRTk5PTVFNUk5UUVVUVVdUWFJYUVdPVE5RTiBRTk9PTlFOUk9UUVUgVFVWVFdSV1FWT1ROIFBLVUsgUFhVWCIsCisgIktaTktWWCBPS1dYIFdLTlggTEtRSyBUS1lLIExYUVggVFhZWCIsCisgIkpbUktSWCBTS1NYIExQTU9OT09TUVUgVFVWU1dPWE9ZUCBNT05ST1RRVVRVVlRXUlhPIFBLVUsgUFhVWCIsCisgIktaTVZOWFFYTVJNT05NT0xRS1RLVkxXTVhPWFJUWFdYWFYgT1VOUk5PT01RSyBUS1ZNV09XUlZVIE5XUFcgVVdXVyIsCisgIktZVEtLWCBTTVRYIFRLVVggTlRUVCBJWE5YIFJYV1giLAorICJKWVBLTFggUUtNWCBOS1VLV0xXTlZQU1EgVUtWTFZOVVBTUSBPUVJRVFJVU1VVVFdRWEpYIFJRVFNUVVNXUVgiLAorICJLWFZMV0xYS1dOVkxUS1JLUExPTU5PTVJNVU5XUFhSWFRXVVUgUktQTU9PTlJOVlBYIiwKKyAiSllQS0xYIFFLTVggTktUS1ZMV05XUVZUVVZUV1FYSlggVEtVTFZOVlFVVFRWU1dRWCIsCisgIkpZUEtMWCBRS01YIFNPUlMgTktYS1dOV0sgT1FSUSBKWFRYVVVTWCIsCisgIkpYUEtMWCBRS01YIFNPUlMgTktYS1dOV0sgT1FSUSBKWE9YIiwKKyAiS1lWTFdMWEtXTlZMVEtSS1BMT01OT01STVVOV1BYUlhUV1VWVlMgUktQTU9PTlJOVlBYIFJYVFZVUyBTU1hTIiwKKyAiSltQS0xYIFFLTVggWEtUWCBZS1VYIE5LU0sgVktbSyBPUVZRIEpYT1ggUlhXWCIsCisgIk5XVEtQWCBVS1FYIFJLV0sgTlhTWCIsCisgIkxYVUtSVVFXUFggVktTVVJXUFhPWE1XTFVNVE5VTVYgU0tYSyIsCisgIkpaUEtMWCBRS01YIFlLT1IgUlBUWCBTUFVYIE5LU0sgVktbSyBKWE9YIFJYV1giLAorICJLWFFLTVggUktOWCBPS1RLIEtYVVhWVVRYIiwKKyAiSVxcT0tLWCBPTVBYIFBLUVYgWUtQWCBZS1VYIFpLVlggTUtQSyBZS1xcSyBJWE1YIFNYWFgiLAorICJKWlBLTFggUEtUWCBRS1RVIFhLVFggTktRSyBWS1pLIEpYTlgiLAorICJLWVJLUExPTU5PTVJNVU5XUFhSWFRXVVZWVFdRV05WTFRLUksgUktQTU9PTlJOVlBYIFJYVFZVVFZRVk1USyIsCisgIkpZUEtMWCBRS01YIE5LVUtXTFhNWE9XUVRST1IgVUtXTVdPVlFUUiBKWE9YIiwKKyAiS1lSS1BMT01OT01STVVOV1BYUlhUV1VWVlRXUVdOVkxUS1JLIFJLUE1PT05STlZQWCBSWFRWVVRWUVZNVEsgT1dPVlBVUVVSVlJaU1tUW1VaIFJWU1pUWyIsCisgIkpaUEtMWCBRS01YIE5LVUtXTFhNWE9XUVRST1IgVUtXTVdPVlFUUiBTUlRXVVhWWFdXIFNSVFNVV1ZYIEpYT1giLAorICJLWldMWExZS1hOV0xVS1JLUExPTU9PUFBVU1ZUIE9OUE9VUlZTVlZVV1NYUFhOV01VTFhNV05XIiwKKyAiS1pUS1BYIFVLUVggUEtOTk9LWktZTllLIE5YU1giLAorICJKW1BLTVVNV09YU1hVV1ZVWUsgUUtOVU5XT1ggTktTSyBXS1tLIiwKKyAiS1lPS1BYIFBLUVYgWUtQWCBNS1JLIFZLW0siLAorICJJW05LTVggT0tOViBUS01YIFRLU1ggVUtUViBaS1NYIExLUUsgWEtcXEsiLAorICJLWlBLVFggUUtVWCBZS0xYIE5LU0sgVktbSyBKWE9YIFJYV1giLAorICJMWVBLUlFQWCBRS1NRIFlLU1FRWCBOS1NLIFZLW0sgTlhTWCIsCisgIkxZWEtMWCBZS01YIFFLT05QS1lLIExYVVhWVVRYIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiS1pNSFhcXCIsCisgIkpaUk1MVyBSTVhXIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiTFpRT1BQUFFPUU9QUU9UT1ZRVldXWFhYIFRPVVFVV1dYIFVSUlNQVE9VT1dQWFNYVFdVVSBSU1BVUFdRWCIsCisgIkpZTktOWCBPS09YIE9SUFBST1RPVlBXUldVVldUWFJYUFdPVSBUT1VQVlJWVVVXVFggTEtPSyIsCisgIkxYVlFVUVVSVlJWUVVQU09RT09QTlJOVU9XUVhTWFVXVlYgUU9QUE9ST1VQV1FYIiwKKyAiTFtWS1ZYIFdLV1ggVlJVUFNPUU9PUE5STlVPV1FYU1hVV1ZVIFFPUFBPUk9VUFdRWCBUS1dLIFZYWVgiLAorICJMWE9TVlNWUlVQU09RT09QTlJOVU9XUVhTWFVXVlYgVVNVUVNPIFFPUFBPUk9VUFdRWCIsCisgIkxXVEtVTFVNVk1WTFRLUktQTVBYIFJLUU1RWCBOT1NPIE5YU1giLAorICJMWVFPT1FPU1FVU1VVU1VRU09RTyBRT1BRUFNRVSBTVVRTVFFTTyBUUFVPVk8gUFRPVU9YUFlUWVZaIE9XUFhUWFZZVltUXFxQXFxOW05ZUFgiLAorICJKW05LTlggT0tPWCBPUlBQUk9UT1ZQV1JXWCBUT1VQVlJWWCBMS09LIExYUVggVFhZWCIsCisgIk5XUktSTFNMU0tSSyBST1JYIFNPU1ggUE9TTyBQWFVYIiwKKyAiTldTS1NMVExUS1NLIFNPU1pSXFwgVE9UWlJcXFBcXE9bT1pQWlBbT1sgUU9UTyIsCisgIkpaTktOWCBPS09YIFdPT1UgUlNWWCBTU1dYIExLT0sgVE9ZTyBMWFFYIFRYWVgiLAorICJOV1JLUlggU0tTWCBQS1NLIFBYVVgiLAorICJGX0pPSlggS09LWCBLUkxQTk9QT1JQU1JTWCBQT1FQUlJSWCBTUlRQVk9YT1pQW1JbWCBYT1lQWlJaWCBIT0tPIEhYTVggUFhVWCBYWF1YIiwKKyAiSltOT05YIE9PT1ggT1JQUFJPVE9WUFdSV1ggVE9VUFZSVlggTE9PTyBMWFFYIFRYWVgiLAorICJMWVFPT1BOUk5VT1dRWFRYVldXVVdSVlBUT1FPIFFPUFBPUk9VUFdRWCBUWFVXVlVWUlVQVE8iLAorICJKWU5PTlxcIE9PT1xcIE9SUFBST1RPVlBXUldVVldUWFJYUFdPVSBUT1VQVlJWVVVXVFggTE9PTyBMXFxRXFwiLAorICJLWVVPVVxcIFZPVlxcIFVSVFBST1BPTlBNUk1VTldQWFJYVFdVVSBQT09QTlJOVU9XUFggU1xcWFxcIiwKKyAiS1hPT09YIFBPUFggUFJRUFNPVU9WUFZRVVFVUFZQIE1PUE8gTVhSWCIsCisgIkxZVE9VUFVRVlFWUFRPUU9PUE9SUVNUVFZVIE9RUVJUU1ZUVldUWFFYT1dPVlBWUFdRWCIsCisgIkxXUEtQVlJYVFhVV1VWIFFLUVZSWCBOT1RPIiwKKyAiSltOT05VT1dRWFNYVVdWVSBPT09VUFdRWCBWT1ZYIFdPV1ggTE9PTyBUT1dPIFZYWVgiLAorICJLWU5PUlggT09SViBWT1JYIExPUU8gVE9YTyIsCisgIklbTE9PWCBNT09VIFJPT1ggUk9VWCBTT1VVIFhPVVggSk9PTyBWT1pPIiwKKyAiS1lOT1VYIE9PVlggVk9OWCBMT1FPIFRPWE8gTFhQWCBTWFhYIiwKKyAiS1lOT1JYIE9PUlYgVk9SWFBbTlxcTVxcTFtMWk1aTVtMWyBMT1FPIFRPWE8iLAorICJMWFVPTlggVk9PWCBPT05RTk9WTyBOWFZYVlZVWCIsCisgIktbUU9PUE5RTVNNVU5XUFhRWFNXVVVXUlhPIFFPT1FOU05VT1dQWCBRT1NPVVBXV1hYIFNPVFBWV1hYWVgiLAorICJLWFJLUE1PT01VS1xcIFFMUE5OVExcXCBSS1RLVkxWTlVQUlEgVEtVTFVOVFBSUSBSUVRSVVRVVlRXUlhRWE9XTlQgUlFTUlRUVFZSWCIsCisgIktZTFFOT1BPUlBTU1NYUlxcIExRTlBQUFJRU1MgV09WUlNYUVxcIiwKKyAiS1lTT1FPT1BOUU1TTVVOV1BYUlhUV1VWVlRWUlVQUk5RTFFLUkpUSlVLVk0gUU9PUU5TTlZQWCBSWFRWVVRVUVNPIFFMUktUS1ZNIiwKKyAiTFhWUFRPUU9PUE9RUFJSUyBRT1BQUFFSUyBSU09UTlVOV1BYU1hVVyBSU1BUT1VPV1BYIiwKKyAiTFdSS1FMUU1TTlZOVk1TTlBPT1BOUk5UT1ZQV1JYU1lTW1JcXFBcXE9bIFNOUU9QUE9ST1RQVlJYIiwKKyAiSVlKUktQTE9OT09QT1FNWCBNT05QTlFMWCBPUVBQUk9UT1ZQVlJTXFwgVE9VUFVSUlxcIiwKKyAiSVlKU0tRTFBOUE9RT1ZQWCBNUE5RTlVPV1BYUVhTV1RWVVRWUVZOVUxUS1JLUUxRTlJQVVJXUyBRWFNWVFRVUVVOVEsiLAorICJOV1JPUFZQV1FYU1hVV1ZVIFNPUVZRV1JYIiwKKyAiS1lPT0xYIFBPTVggVU9WUFdQVk9UT1JRT1IgT1JQU1JXVFhWV1dVIE9SUVNTV1RYIiwKKyAiTFhMS05LUExXWCBOS09MVlggUlBNWCBSUE5YIiwKKyAiS1pPT0tcXCBQT0xcXCBOVU5XT1hRWFNXVFYgVk9UVlRXVVhXWFhXWVUgV09VVlVXVlgiLAorICJKWU5PTVggT09OVU1YIFZSVk9XT1ZSVFVRV05YTVggTE9PTyIsCisgIk1YUktRTFFNU05WTiBUTlFPUFBQUlJTVVMgVE5ST1FQUVJSUyBTU1BUT1VPV1FYU1lUWlRbU1xcUVxcIFNTUVRQVVBXUVgiLAorICJLWFFPT1BOUU1TTVVOV1BYUlhUV1VWVlRWUlVQU09RTyBRT09RTlNOVlBYIFJYVFZVVFVRU08iLAorICJJWlBQTVggUFBOWCBUUFNYIFRQVFggS1FNT1hPIEtRTVBYUCIsCisgIkpYU09RT09QTlFNU0pcXCBRT09RTlNLXFwgU09VUFZSVlRVVlRXUlhQWE5XTVUgU09VUVVUVFZSWCIsCisgIktbWU9RT09QTlFNU01VTldQWFJYVFdVVlZUVlJVUFlQIFFPT1FOU05WUFggUlhUVlVUVVFTTyIsCisgIktaU1BRWCBTUFJYIE1RT09YTyBNUU9QWFAiLAorICJKWEtSTFBNT09PUFBQUk9VT1dQWCBOT09QT1JOVU5XUFhRWFNXVVVWUlZPVU9WUCIsCisgIktaT1BOUU1TTVVOV1BYUlhVV1dVWFJYUFdPVU9UUFNSUlVPXFwgTVVOVlBXUldVVldUWFIgWFFXUFVQU1IgUlVRWFBcXCIsCisgIktYTU9OT1BQU1tUXFwgTk9PUFJbVFxcVVxcIFZPVFJOWUxcXCIsCisgIklbVEtRXFwgVUtQXFwgSlJLUExPTk9PUE9WUFdTV1VWV1QgTU9OUE5UT1dQWFNYVVdXVFhSWU8iLAorICJKWk5QUFBQT05QTVFMU0xVTVdOWFBYUVdSVVNSIExVTldQV1JVIFJSUldTWFVYV1ZYVFhSV1BWT1ZQV1AgUlVTV1VXV1YiLAorICJLWlZPVFZUV1VYV1hYV1lVIFdPVVZVV1ZYIFVTVVFTT1FPT1BOUU1TTVVOV1BYUlhUViBRT09RTlNOVlBYIiwKKyAiSlhPS01SIFBLTlJOVlBYIE5ST1BRT1NPVVBWUlZUVVZUV1JYUFhOV01VTVIgU09VUVVUVFZSWCBNS1BLIiwKKyAiS1hVUFVRVlFVUFNPUU9PUE5RTVNNVU5XUFhSWFRXVVYgUU9PUU5TTlZQWCIsCisgIktaV0tUVlRXVVhXWFhXWVUgWEtVVlVXVlggVVNVUVNPUU9PUE5RTVNNVU5XUFhSWFRWIFFPT1FOU05WUFggVUtYSyIsCisgIktXTlVSVFRTVVJVUFNPUU9PUE5RTVNNVU5XUFhSWFRXVVYgUU9PUU5TTlZQWCIsCisgIk1YV0tYTFhLVktUTFNOUFlPW05cXCBWS1VMVE5RWVBbTlxcTFxcTFtNXFwgUE9WTyIsCisgIktZVk9UVlNZUlsgV09VVlRZUltQXFxNXFxMW01bTlxcIFVTVVFTT1FPT1BOUU1TTVVOV1BYUlhUViBRT09RTlNOVlBYIiwKKyAiS1pQS0xYIFFLTVggT1FQUFJPVE9WUFZSVVVVV1ZYIFRPVVBVUlRVVFdVWFdYWFdZVSBOS1FLIiwKKyAiTVdTS1NMVExUS1NLIE5ST1BQT1JPU1BTUlJVUldTWCBRT1JQUlJRVVFXUlhUWFVXVlUiLAorICJNV1RLVExVTFVLVEsgT1JQUFFPU09UUFRSUllRW09cXE1cXE1bTlxcIFJPU1BTUlFZUFtPXFwiLAorICJLWFBLTFggUUtNWCBWUFVRVlFWUFVPVE9SUVBST1IgT1JQU1FXUlhUWFVXVlUgT1JRU1JXU1ggTktRSyIsCisgIk5WU0tQVlBXUVhTWFRXVVUgVEtRVlFXUlggUUtUSyIsCisgIkZeR1JIUElPS09MUExRSlggSk9LUEtRSVggTFFNUE9PUU9TUFNRUVggUU9SUFJRUFggU1FUUFZPWE9aUFpSWVVZV1pYIFhPWVBZUlhVWFdZWFtYXFxXXVUiLAorICJKW0tSTFBNT09PUFBQUU5YIE5PT1BPUU1YIFBRUVBTT1VPV1BXUlZVVldXWCBVT1ZQVlJVVVVXVlhYWFlXWlUiLAorICJLWFFPT1BOUU1TTVVOV1BYUlhUV1VWVlRWUlVQU09RTyBRT09RTlNOVlBYIFJYVFZVVFVRU08iLAorICJKWUtSTFBNT09PUFBQUU1cXCBOT09QT1FMXFwgUFFST1RPVlBXUldUVlZVV1NYUVhPVk9UIFRPVlFWVFVWU1ggSlxcT1xcIiwKKyAiS1lWT1JcXCBXT1NcXCBVU1VRU09RT09QTlFNU01VTldQWFJYVFYgUU9PUU5TTlZQWCBQXFxVXFwiLAorICJMWE1STlBPT1FPUlBSUVBYIFBPUVBRUU9YIFJRU1BVT1ZPV1BXUVZRV1AiLAorICJMWVZQVlFXUVZQVE9RT09QT1JRU1RUVlUgT1FRUlRTVlRWV1RYUVhPV05WT1ZPVyIsCisgIk5XU0tQVlBXUVhTWFRXVVUgVEtRVlFXUlggUE9VTyIsCisgIklaSlJLUExPTk9PUE9STlVOV09YIE1PTlBOUk1VTVdPWFFYU1dUViBWT1RWVFdVWFdYWFdZVSBXT1VWVVdWWCIsCisgIkpYS1JMUE1PT09QUFBST1VPV1BYIE5PT1BPUk5VTldQWFFYU1dVVVZSVk9VT1ZQIiwKKyAiSFxcSVJKUEtPTU9OUE5STVVNV05YIExPTVBNUkxVTFdOWE9YUVdSViBUT1JWUldUWCBVT1NWU1dUWFVYV1dZVVpSWk9ZT1pQIiwKKyAiSlpNUk5QUE9ST1NQU1IgUU9SUFJSUVVQV05YTVhMV0xWTVZMVyBYUFdRWFFYUFdPVk9UUFNSUlVSV1NYIFFVUVdSWFRYVldXVSIsCisgIklZSlJLUExPTk9PUE9STlVOV09YIE1PTlBOUk1VTVdPWFFYU1dUViBWT1RWU1lSWyBXT1VWVFlSW1BcXE1cXExbTVtOXFwiLAorICJLWVdPV1BWUU5WTVdNWCBOUU9PUk9VUSBPUFJQVVFWUSBOVk9WUldVVyBPVlJYVVhWViIsCisgIkhbUktTTFNNVE1UTFJLT0tNTExOTFggT0tOTE1OTVggWEtZTFlNWk1aTFhLVktUTVRYIFZLVU1VWCBKT1dPIEpYT1ggUlhXWCIsCisgIkpbVUtWTFdMV0tRS09MTk5OWCBRS1BMT05PWCBWT1ZYIFdPV1ggTE9XTyBMWFFYIFRYWVgiLAorICJKW1dLUUtPTE5OTlggUUtQTE9OT1ggVUtWTFZYIFdLV1ggTE9WTyBMWFFYIFRYWVgiLAorICJGX1BLUUxRTVJNUkxQS01LS0xKTkpYIE1LTExLTktYIFlLWkxbTFtLVUtTTFJOUlggVUtUTFNOU1ggWk9aWCBbT1tYIEhPW08gSFhNWCBQWFVYIFhYXVgiLAorICJGX1BLUUxRTVJNUkxQS01LS0xKTkpYIE1LTExLTktYIFtLVUtTTFJOUlggVUtUTFNOU1ggWUtaTFpYIFtLW1ggSE9aTyBIWE1YIFBYVVggWFhdWCIsCisgIk5XUk9SWCBTT1NYIFBPU08gUFhVWCIsCisgIiIsCisgIkxYVlBUT1JPUFBPUU5TTlVPV1FYU1hVVyBST1BRT1NPVlFYIE9TU1MiLAorICJMWVNLUUxQTU9PTlJOVU9XUFhSWFRXVVZWVFdRV05WTFVLU0sgU0tRTVBPT1NPVlBYIFJYVFZVVFZQVk1VSyBPUVZRIiwKKyAiS1pUS1FcXCBVS1BcXCBRT05QTVJNVU5XUVhUWFdXWFVYUldQVE9RTyBRT09QTlJOVU9XUVggVFhWV1dVV1JWUFRPIiwKKyAiTFhVUFZSVlFVUFNPUU9PUE5STlRPVlJYIFFPT1FPVFBWUlhTWVNbUlxcUFxcIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSVtWS1dMWExWS1NLUUxQTU9PTFlLW0pcXCBTS1FNUE9NWUxbSlxcSFxcSFtJXFwgWktbTFtLWUtXTFZOU1lSW1FcXCBZS1hMV05UWVNbUVxcT1xcT1tQXFwgTE9ZTyIsCisgIklaVktXTFhMWEtTS1FMUE1PT0xZS1tKXFwgU0tRTVBPTVlMW0pcXEhcXEhbSVxcIFZPVFZUV1VYV1hYV1lVIFdPVVZVV1ZYIExPV08iLAorICJJWlZLV0wgWEtTS1FMUE1PT0xZS1tKXFwgU0tRTVBPTVlMW0pcXEhcXEhbSVxcIFdLVFZUV1VYV1hYV1lVIFhLVVZVV1ZYIExPVk8iLAorICJGXlNLVExUTSBVTFNLUEtOTE1NTE9JWUhbR1xcIFBLTk1NT0pZSVtHXFxFXFxFW0ZcXCBaS1tMXFxMXFxLV0tVTCBUTVNPUFlPW05cXCBXS1VNVE9RWVBbTlxcTFxcTFtNXFwgWk9YVlhXWVhbWFxcV11VIFtPWVZZV1pYIElPW08iLAorICJGXlNLVExUTSBVTFNLUEtOTE1NTE9JWUhbR1xcIFBLTk1NT0pZSVtHXFxFXFxFW0ZcXCBaS1tMIFxcS1dLVUwgVE1TT1BZT1tOXFwgV0tVTVRPUVlQW05cXExcXExbTVxcIFtLWFZYV1lYW1hcXFddVSBcXEtZVllXWlggSU9aTyIsCisgIk1XTlJPUFBPUk9TUFNSUlVSV1NYIFFPUlBSUlFVUVdSWFRYVVdWVSIsCisgIiIsCisgIk9VIiwKKyAiTFgiLAorICJMWVFLT0xOT05UT1dRWFRYVldXVFdPVkxUS1FLIFFLUExPT09UUFdRWCBUWFVXVlRWT1VMVEsiLAorICJMWVBOU0tTWCBSTFJYIE9YVlgiLAorICJMWU9NT05OTk5NT0xRS1RLVkxXTlZQVFFRUk9TTlVOWCBUS1VMVk5VUFRRIE5XT1ZQVlNXVldXViBQVlNYVlhXVldVIiwKKyAiTFlPTU9OTk5OTU9MUUtUS1ZMV05WUFRRIFRLVUxWTlVQVFEgUlFUUVZSV1RXVVZXVFhRWE9XTlZOVU9VT1YgVFFVUlZUVlVVV1RYIiwKKyAiTFlTTVNYIFRLVFggVEtNVFhUIFFYVlgiLAorICJMWU9LTlEgT0tWSyBPTFNMVksgTlFPUFFPVE9WUFdSV1VWV1RYUVhPV05WTlVPVU9WIFRPVVBWUlZVVVdUWCIsCisgIkxZVk1WTldOV01WTFRLUktQTE9NTlBOVU9XUVhUWFZXV1VXU1ZRVFBRUE5SIFJLUE1PUE9VUFdRWCBUWFVXVlVWU1VRVFAiLAorICJMWU5LTk8gVk1SVFBYIFdLVFFRWCBOTVBLUktVTSBOTVBMUkxVTVZNIiwKKyAiTFlRS09MTk5PUFFRVFFWUFdOVkxUS1FLIFFLUExPTlBQUVEgVFFVUFZOVUxUSyBRUU9STlROVU9XUVhUWFZXV1VXVFZSVFEgUVFQUk9UT1VQV1FYIFRYVVdWVVZUVVJUUSIsCisgIkxZT1ZPVU5VTlZPV1FYU1hVV1ZWV1NXTlZMVEtRS09MTk5OUE9SUVNUU1dRIFNYVVZWU1ZOVUxUSyBRS1BMT05PUFBSUVMiLAorICJOVlJWUVdSWFNXUlYiLAorICJOVlNXUlhRV1JWU1dTWVFbIiwKKyAiTlZST1FQUlFTUFJPIFJWUVdSWFNXUlYiLAorICJOVlJPUVBSUVNQUk8gU1dSWFFXUlZTV1NZUVsiLAorICJOVlJLUUxSU1NMUksgUkxSTyBSVlFXUlhTV1JWIiwKKyAiTFlOTk9OT09OT05OT0xRS1RLVkxXTldPVlFTUlJTUlRTVCBUS1ZNVlBVUVNSIFJXUlhTWFNXUlciLAorICJPVlJLUlAgU0tSUCIsCisgIkxYT0tPUCBQS09QIFVLVVAgVktVUCIsCisgIk1XUUtQTFBOUU9TT1ROVExTS1FLIiwKKyAiTVdSSlJQIE9LVU8gVUtPTyIsCisgIktaWEhNXFwiLAorICJNV1VIU0pRTVBQUFRRV1NaVVxcIFNKUkxRUFFUUlhTWiIsCisgIk1XT0hRSlNNVFBUVFNXUVpPXFwgUUpSTFNQU1RSWFFaIiwKKyAiTVdQSFBcXCBRSFFcXCBQSFVIIFBcXFVcXCIsCisgIk1XU0hTXFwgVEhUXFwgT0hUSCBPXFxUXFwiLAorICJMV1NIUklRS1FNUk9SUFBSUlRSVVFXUVlSW1NcXCBSSVFNIFFLUk8gUlVRWSBRV1JbIiwKKyAiTVhRSFJJU0tTTVJPUlBUUlJUUlVTV1NZUltRXFwgUklTTSBTS1JPIFJVU1kgU1dSWyIsCisgIk1XVEhQUlRcXCIsCisgIk1XUEhUUlBcXCIsCisgIk9VUkhSXFwiLAorICJNV1BIUFxcIFRIVFxcIiwKKyAiSVtMUlhSIiwKKyAiSVtSTFJYIExSWFIiLAorICJKWlJNUlggTVJXUiBNWFdYIiwKKyAiSlpSTVJYIE1NV00gTVJXUiIsCisgIkpaTU1XVyBXTU1XIiwKKyAiTlZSUVFSUlNTUlJRIiwKKyAiSVtSTFFNUk5TTVJMIExSWFIgUlZRV1JYU1dSViIsCisgIklbTFBYUCBMVFhUIiwKKyAiSVtXTE1YIExQWFAgTFRYVCIsCisgIklbTE5YTiBMUlhSIExWWFYiLAorICJKWldMTVJXWCIsCisgIkpaTUxXUk1YIiwKKyAiSlpXS01PV1MgTVRXVCBNWFdYIiwKKyAiSlpNS1dPTVMgTVRXVCBNWFdYIiwKKyAiSFtZVVdVVVRUU1JQUU9PTk5OTE9LUUtSTFROVU9VUVRSU1RQVU9XTllOIiwKKyAiSlpMVExSTVBPUFVTV1NYUiBMUk1RT1FVVFdUWFJYUCIsCisgIkpaTVNSUFdTIE1TUlFXUyIsCisgIk5WU0tQTyBTS1RMUE8iLAorICJOVlFLVE8gUUtQTFRPIiwKKyAiTFhOS09NUU5TTlVNVksgTktPTlFPU09VTlZLIiwKKyAiTlZTTFJNUUxSS1NMU05RUCIsCisgIk5WU0tRTVFPUlBTT1JOUU8iLAorICJOVlFMUk1TTFJLUUxRTlNQIiwKKyAiTlZRS1NNU09SUFFPUk5TTyIsCisgIiIsCisgIkpaV01RTU9OTk9NUU1TTlVPVlFXV1ciLAorICJKWk1NTVNOVU9WUVdTV1VWVlVXU1dNIiwKKyAiSlpNTVNNVU5WT1dRV1NWVVVWU1dNVyIsCisgIkpaTVdNUU5PT05RTVNNVU5WT1dRV1ciLAorICJKWldNUU1PTk5PTVFNU05VT1ZRV1dXIE1SVVIiLAorICJJW1RPVVBYUlVUVFUgVVBXUlVUIExSV1IiLAorICJNV1JNUlggT1BQT1JMVE9VUCBQT1JNVE8iLAorICJJW1BPT1BMUk9UUFUgT1BNUk9UIE1SWFIiLAorICJNV1JMUlcgT1RQVVJYVFVVVCBQVVJXVFUiLAorICJLWVZTVVBTT1FPT1BOUU1TTVVOV1BYUlhUV1VWVlRXUVdOVkxUS1FLUExRTFJLIFFPT1FOU05WUFggUlhUVlVUVlFWTlVMVEsiLAorICJKWkxLUlggTUtSViBYS1JYIExLWEsgTkxXTCIsCisgIkdbSU9MT1JXIEtPUlggW0ZSWCIsCisgIklbWElYSllKWUlYSFZIVEpTTFJPUVVQWU9bIFVJVEtTT1JVUVhQWk5cXExcXEtbS1pMWkxbIiwKKyAiSVtYSVhKWUpZSVhIVkhUSlNMUk9RVVBZT1sgVUlUS1NPUlVRWFBaTlxcTFxcS1tLWkxaTFsgUU5PT05RTlNPVVFWU1ZVVVZTVlFVT1NOUU4iLAorICJIXFxaUllUV1VWVVRUU1NRUFBPTk5NTktPSlFKUktUTVVOVVBUUVNTUFRPVk5XTllPWlFaUiIsCisgIkpaWEtMWCBPS1BMUE5PT01PTE5MTE1LT0tTTFZMWEsgVVRUVVRXVVhXWFhXWFVXVFVUIiwKKyAiSltZUFhQWFFZUVlQWE9XT1ZQVVRUVlNXUVhPWE1XTFZMVE1TT1JSUFNOU0xSS1BLT0xPTlBRVVdXWFhYWVcgT1hNVk1UT1IgT05QUFZXV1giLAorICJKW1VQU09RT1BRUFJRVFNUVVMgVU9VU1ZUWFRZUllRWE5WTFNLUktPTE1OTFFMUk1VT1dSWFNYVlciLAorICJLWlFIUVxcIFRIVFxcIFdMVkxWTVdNV0xVS1BLTkxOTk9QVlNXVCBOTk9PVlJXVFdWVldUWFFYT1dOVk5VT1VPVk5WIiwKKyAiS1lQS1BbIFRLVFsgTVFXUSBNVVdVIiwKKyAiTFhUTFNMU01UTVRMU0tRS1BMUE5RUFRSVVMgUE5RT1RRVVNVVVNXIFFQT1JPVFBWU1hUWSBPVFBVU1dUWVRbU1xcUVxcUFtQWlFaUVtQWyIsCisgIkxYUktRTFJNU0xSSyBSTVJRIFJRUVNSVlNTUlEgUlZSXFwgUE9PTk5PT1BQT1RPVU5WT1VQVE8iLAorICJMWFJNU0xSS1FMUk1SUVFSU1VSViBSUVNSUVVSVlJaUVtSXFxTW1JaIFBPT05OT09QUE9UT1VOVk9VUFRPIFBYT1dOWE9ZUFhUWFVXVlhVWVRYIiwKKyAiTFlWS1ZYIE5LVksgUVFWUSBOWFZYIiwKKyAiIiwKKyAiSFxcUUtOTExOS1FLU0xWTlhRWVNZVlhYVllTWVFYTlZMU0tRSyBSUVFSUlNTUlJRIiwKKyAiTFlRS1BMUE1RTiBUS1VMVU1UTiBSTlBPT1FPUlBUUlVTVVVUVlJWUVVPU05STiBSVVJZIFNVU1kgT1dWVyIsCisgIkxZUktQTE9OT09QUVJSU1JVUVZPVk5VTFNLUksgUlJSWCBTUlNYIE9VVlUiLAorICJIXFxRS05MTE5LUUtTTFZOWFFZU1lWWFhWWVNZUVhOVkxTS1FLIFJLUlkgS1JZUiIsCisgIkpZUlJQUU9RTVJMVExVTVdPWFBYUldTVVNUUlIgV01SUiBSTVdNV1IgUk1WTldSIiwKKyAiSlpMTE1LT0tRTFJOUlBRUlBTTlQgT0tQTFFOUVFQUyBWS1VYIFdLVFggTlRYVCIsCisgIkpZTktOVSBPS05SIE5ST1BRT1NPVVBWUVZUVFZUWFVZVllXWCBTT1VRVVRUViBMS09LIiwKKyAiTFlPTlJLUlEgVk5TS1NRIFJRUFJPVE9VUFdSWFNYVVdWVVZUVVJTUSBSVFJVU1VTVFJUIiwKKyAiSlpSS1JZIE1LTVBOUlBTVFNWUldQV0sgTE1NS05NIFFNUktTTSBWTVdLWE0gT1ZVViIsCisgIkpZTktOWCBPS09YIExLU0tWTFdOV09WUVNST1IgU0tVTFZOVk9VUVNSIExYVlhWVVVYIiwKKyAiTFlXS1RLUUxPTk5RTlNPVlFYVFlXWSBXS1RMUk5RUVFTUlZUWFdZIiwKKyAiSlpSUlBRT1FNUkxUTFVNV09YUFhSV1NVU1RSUiBTTFFRIFdNUlIgWFFTUyIsCisgIktZUE1UVyBUTVBXIE1QV1QgV1BNVCIsCisgIkpbT1VNVUxWTFhNWU9ZUFhQVk5UTVJNT05NT0xRS1RLVkxXTVhPWFJXVFVWVVhWWVhZWVhZVlhVVlUgTk1QTFVMV00iLAorICJKW09PTU9MTkxMTUtPS1BMUE5OUE1STVVOV09YUVlUWVZYV1dYVVhSV1BVTlVMVktYS1lMWU5YT1ZPIE5XUFhVWFdXIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiRl5LSEtcXCBMSExcXCBYSFhcXCBZSFlcXCBISFxcSCBIXFxPXFwgVVxcXFxcXCIsCisgIkhdS0hSUUpcXCBKSFFRIEpIWUhaTVhIIEtbWFsgSlxcWVxcWldYXFwiLAorICJLWVZCVERSR1BLT1BPVFBZUl1UYFZiIFREUkhRS1BQUFRRWVJcXFRgIiwKKyAiS1lOQlBEUkdUS1VQVVRUWVJdUGBOYiBQRFJIU0tUUFRUU1lSXFxQYCIsCisgIktZT0JPYiBQQlBiIE9CVkIgT2JWYiIsCisgIktZVEJUYiBVQlViIE5CVUIgTmJVYiIsCisgIkpZVEJRRVBIUEpRTVNPU1BPUlNUU1VRV1BaUFxcUV9UYiBSRFFHUUtSTiBSVlFZUV1SYCIsCisgIktaUEJTRVRIVEpTTVFPUVBVUlFUUVVTV1RaVFxcU19QYiBSRFNHU0tSTiBSVlNZU11SYCIsCisgIktZVUBSQ1BGT0lPTFBPU1ZUWVRcXFNfUmEgUkNRRVBIUEtRTlRVVVhVW1ReUmFPZCIsCisgIktZT0BSQ1RGVUlVTFRPUVZQWVBcXFFfUmEgUkNTRVRIVEtTTlBVT1hPW1BeUmFVZCIsCisgIkFYQ1JHUlJgIEdTUmEgRlNSYiBYOlJiIiwKKyAiRl5bQ1pEW0VcXERcXENbQllCV0NVRVRHU0pSTlBaT15OYCBWRFVGVEpSVlFaUF1PX01hS2JJYkhhSGBJX0pgSWEiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJIXFxSRktbIFJGWVsgUklYWyBNVVZVIElbT1sgVVtbWyIsCisgIkddTEZMWyBNRk1bIElGVUZYR1lIWkpaTFlOWE9VUCBVRldHWEhZSllMWE5XT1VQIE1QVVBYUVlSWlRaV1lZWFpVW0lbIFVQV1FYUllUWVdYWVdaVVsiLAorICJHXFxYSVlMWUZYSVZHU0ZRRk5HTElLS0pOSlNLVkxYTlpRW1NbVlpYWFlWIFFGT0dNSUxLS05LU0xWTVhPWlFbIiwKKyAiR11MRkxbIE1GTVsgSUZTRlZHWElZS1pOWlNZVlhYVlpTW0lbIFNGVUdXSVhLWU5ZU1hWV1hVWlNbIiwKKyAiR1xcTEZMWyBNRk1bIFNMU1QgSUZZRllMWEYgTVBTUCBJW1lbWVVYWyIsCisgIkdbTEZMWyBNRk1bIFNMU1QgSUZZRllMWEYgTVBTUCBJW1BbIiwKKyAiR15YSVlMWUZYSVZHU0ZRRk5HTElLS0pOSlNLVkxYTlpRW1NbVlpYWCBRRk9HTUlMS0tOS1NMVk1YT1pRWyBYU1hbIFlTWVsgVVNcXFMiLAorICJGXktGS1sgTEZMWyBYRlhbIFlGWVsgSEZPRiBVRlxcRiBMUFhQIEhbT1sgVVtcXFsiLAorICJNWFJGUlsgU0ZTWyBPRlZGIE9bVlsiLAorICJLWlVGVVdUWlJbUFtOWk1YTVZOVU9WTlcgVEZUV1NaUlsgUUZYRiIsCisgIkZcXEtGS1sgTEZMWyBZRkxTIFFPWVsgUE9YWyBIRk9GIFVGW0YgSFtPWyBVW1tbIiwKKyAiSVtORk5bIE9GT1sgS0ZSRiBLW1pbWlVZWyIsCisgIkZfS0ZLWyBMRlJYIEtGUlsgWUZSWyBZRllbIFpGWlsgSEZMRiBZRl1GIEhbTlsgVltdWyIsCisgIkdeTEZMWyBNRllZIE1IWVsgWUZZWyBJRk1GIFZGXFxGIElbT1siLAorICJHXVFGTkdMSUtLSk9KUktWTFhOWlFbU1tWWlhYWVZaUlpPWUtYSVZHU0ZRRiBRRk9HTUlMS0tPS1JMVk1YT1pRWyBTW1VaV1hYVllSWU9YS1dJVUdTRiIsCisgIkddTEZMWyBNRk1bIElGVUZYR1lIWkpaTVlPWFBVUU1RIFVGV0dYSFlKWU1YT1dQVVEgSVtQWyIsCisgIkddUUZOR0xJS0tKT0pSS1ZMWE5aUVtTW1ZaWFhZVlpSWk9ZS1hJVkdTRlFGIFFGT0dNSUxLS09LUkxWTVhPWlFbIFNbVVpXWFhWWVJZT1hLV0lVR1NGIE5ZTlhPVlFVUlVUVlVYVl9XYFlgWl5aXSBVWFZcXFdeWF9ZX1peIiwKKyAiR11MRkxbIE1GTVsgSUZVRlhHWUhaSlpMWU5YT1VQTVAgVUZXR1hIWUpZTFhOV09VUCBJW1BbIFJQVFFVUlhZWVpaWltZIFRRVVNXWlhbWltbWVtYIiwKKyAiSFxcWElZRllMWElWR1NGUEZNR0tJS0tMTU1OT09VUVdSWVQgS0tNTU9OVVBXUVhSWVRZWFdaVFtRW05aTFhLVUtbTFgiLAorICJJXFxSRlJbIFNGU1sgTEZLTEtGWkZaTFlGIE9bVlsiLAorICJGXktGS1VMWE5aUVtTW1ZaWFhZVVlGIExGTFVNWE9aUVsgSEZPRiBWRlxcRiIsCisgIkhcXEtGUlsgTEZSWCBZRlJbIElGT0YgVUZbRiIsCisgIkZeSkZOWyBLRk5WIFJGTlsgUkZWWyBTRlZWIFpGVlsgR0ZORiBXRl1GIiwKKyAiSFxcS0ZYWyBMRllbIFlGS1sgSUZPRiBVRltGIElbT1sgVVtbWyIsCisgIkhdS0ZSUVJbIExGU1FTWyBaRlNRIElGT0YgVkZcXEYgT1tWWyIsCisgIkhcXFhGS1sgWUZMWyBMRktMS0ZZRiBLW1lbWVVYWyIsCisgIkhcXFJGS1sgUkZZWyBSSVhbIE1VVlUgSVtPWyBVW1tbIiwKKyAiR11MRkxbIE1GTVsgSUZVRlhHWUhaSlpMWU5YT1VQIFVGV0dYSFlKWUxYTldPVVAgTVBVUFhRWVJaVFpXWVlYWlVbSVsgVVBXUVhSWVRZV1hZV1pVWyIsCisgIklbTkZOWyBPRk9bIEtGWkZaTFlGIEtbUlsiLAorICJIXFxSRkpbIFJGWlsgUklZWyBLWllaIEpbWlsiLAorICJHXFxMRkxbIE1GTVsgU0xTVCBJRllGWUxYRiBNUFNQIElbWVtZVVhbIiwKKyAiSFxcWEZLWyBZRkxbIExGS0xLRllGIEtbWVtZVVhbIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGT0YgVUZcXEYgTFBYUCBIW09bIFVbXFxbIiwKKyAiR11RRk5HTElLS0pPSlJLVkxYTlpRW1NbVlpYWFlWWlJaT1lLWElWR1NGUUYgUUZPR01JTEtLT0tSTFZNWE9aUVsgU1tVWldYWFZZUllPWEtXSVVHU0YgT01PVCBVTVVUIE9QVVAgT1FVUSIsCisgIk1YUkZSWyBTRlNbIE9GVkYgT1tWWyIsCisgIkZcXEtGS1sgTEZMWyBZRkxTIFFPWVsgUE9YWyBIRk9GIFVGW0YgSFtPWyBVW1tbIiwKKyAiSFxcUkZLWyBSRllbIFJJWFsgSVtPWyBVW1tbIiwKKyAiRl9LRktbIExGUlggS0ZSWyBZRlJbIFlGWVsgWkZaWyBIRkxGIFlGXUYgSFtOWyBWW11bIiwKKyAiR15MRkxbIE1GWVkgTUhZWyBZRllbIElGTUYgVkZcXEYgSVtPWyIsCisgIkddS0VKSiBaRVlKIE9OTlMgVk5VUyBLV0pcXCBaV1lcXCBLR1lHIEtIWUggT1BVUCBPUVVRIEtZWVkgS1pZWiIsCisgIkddUUZOR0xJS0tKT0pSS1ZMWE5aUVtTW1ZaWFhZVlpSWk9ZS1hJVkdTRlFGIFFGT0dNSUxLS09LUkxWTVhPWlFbIFNbVVpXWFhWWVJZT1hLV0lVR1NGIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGXFxGIEhbT1sgVVtcXFsiLAorICJHXUxGTFsgTUZNWyBJRlVGWEdZSFpKWk1ZT1hQVVFNUSBVRldHWEhZSllNWE9XUFVRIElbUFsiLAorICJIXUtGUlBKWyBKRlFQIEpGWUZaTFhGIEtaWFogSltZW1pVWFsiLAorICJJXFxSRlJbIFNGU1sgTEZLTEtGWkZaTFlGIE9bVlsiLAorICJJXFxLS0tJTEdNRk9GUEdRSVJNUlsgS0lNR09HUUkgWktaSVlHWEZWRlVHVElTTVNbIFpJWEdWR1RJIE9bVlsiLAorICJIXVJGUlsgU0ZTWyBQS01MTE1LT0tSTFRNVVBWVVZYVVlUWlJaT1lNWExVS1BLIFBLTkxNTUxPTFJNVE5VUFYgVVZXVVhUWVJZT1hNV0xVSyBPRlZGIE9bVlsiLAorICJIXFxLRlhbIExGWVsgWUZLWyBJRk9GIFVGW0YgSVtPWyBVW1tbIiwKKyAiR15SRlJbIFNGU1sgSU1KTExNTVFOU09UUVUgSkxLTUxRTVNOVFFVVFVXVFhTWVFaTVtMIFRVVlRXU1hRWU1bTFxcTSBPRlZGIE9bVlsiLAorICJHXUpYS1tPW01XS1NKUEpMS0lNR1BGVEZXR1lJWkxaUFlTV1dVW1lbWlggTVdMVEtQS0xMSU5HUEYgVEZWR1hJWUxZUFhUV1cgS1pOWiBWWllaIiwKKyAiSFxcVUZIWyBVRlZbIFRIVVsgTFVVVSBGW0xbIFJbWFsiLAorICJGXk9GSVsgUEZKWyBMRldGWkdbSVtLWk5ZT1ZQIFdGWUdaSVpLWU5YT1ZQIE1QVlBYUVlTWVVYWFZaUltGWyBWUFdRWFNYVVdYVVpSWyIsCisgIkhdWkhbSFxcRltMW0paSFlHV0ZURlFHT0lNTExPS1NLVkxZTVpQW1NbVVpXWFhWIFRGUkdQSU5MTU9MU0xWTVlOWlBbIiwKKyAiRl1PRklbIFBGSlsgTEZVRlhHWUhaS1pPWVNXV1VZU1pPW0ZbIFVGV0dYSFlLWU9YU1ZXVFlSWk9bIiwKKyAiRl1PRklbIFBGSlsgVExSVCBMRltGWkxaRiBNUFNQIEZbVVtXVlRbIiwKKyAiRlxcT0ZJWyBQRkpbIFRMUlQgTEZbRlpMWkYgTVBTUCBGW01bIiwKKyAiSF5aSFtIXFxGW0xbSlpIWUdXRlRGUUdPSU1MTE9LU0tWTFlNWlBbUltVWldYWVQgVEZSR1BJTkxNT0xTTFZNWU5aUFsgUltUWlZYWFQgVVRcXFQiLAorICJFX05GSFsgT0ZJWyBbRlVbIFxcRlZbIEtGUkYgWEZfRiBMUFhQIEVbTFsgUltZWyIsCisgIkxZVUZPWyBWRlBbIFJGWUYgTFtTWyIsCisgIklbWEZTV1JZUVpPW01bS1pKWEpWS1VMVktXIFdGUldRWU9bIFRGW0YiLAorICJGXU9GSVsgUEZKWyBdRkxTIFNPV1sgUk9WWyBMRlNGIFlGX0YgRltNWyBTW1lbIiwKKyAiSFxcUUZLWyBSRkxbIE5GVUYgSFtXW1lVVlsiLAorICJFYE5GSFsgTkZPWyBPRlBZIFxcRk9bIFxcRlZbIF1GV1sgS0ZPRiBcXEZgRiBFW0tbIFNbWlsiLAorICJGX09GSVsgT0ZWWCBPSVZbIFxcRlZbIExGT0YgWUZfRiBGW0xbIiwKKyAiR11TRlBHTklMTEtPSlNKVktZTFpOW1FbVFpWWFhVWVJaTlpLWUhYR1ZGU0YgU0ZRR09JTUxMT0tTS1ZMWU5bIFFbU1pVWFdVWFJZTllLWEhWRiIsCisgIkZdT0ZJWyBQRkpbIExGWEZbR1xcSVxcS1tOWVBVUU1RIFhGWkdbSVtLWk5YUFVRIEZbTVsiLAorICJHXVNGUEdOSUxMS09KU0pWS1lMWk5bUVtUWlZYWFVZUlpOWktZSFhHVkZTRiBTRlFHT0lNTExPS1NLVkxZTlsgUVtTWlVYV1VYUllOWUtYSFZGIExZTFhNVk9VUFVSVlNYU19UYFZgV15XXSBTWFReVV9WX1deIiwKKyAiRl5PRklbIFBGSlsgTEZXRlpHW0lbS1pOWU9WUE1QIFdGWUdaSVpLWU5YT1ZQIFJQVFFVUlZaV1tZW1pZWlggVVJXWVhaWVpaWSBGW01bIiwKKyAiR15aSFtIXFxGW0xbSlpIWUdWRlJGT0dNSU1LTk1PTlZSWFQgTUtPTVZRV1JYVFhXV1lWWlNbT1tMWktZSldKVUlbSllLWSIsCisgIkhdVUZPWyBWRlBbIE9GTExORl1GXFxMXFxGIExbU1siLAorICJGX05GS1FKVUpYS1pOW1JbVVpXWFhVXFxGIE9GTFFLVUtYTFpOWyBLRlJGIFlGX0YiLAorICJIXFxORk9bIE9GUFkgXFxGT1sgTEZSRiBYRl5GIiwKKyAiRV9NRktbIE5GTFkgVUZLWyBVRlNbIFZGVFkgXUZTWyBKRlFGIFpGYEYiLAorICJHXU5GVVsgT0ZWWyBcXEZIWyBMRlJGIFhGXkYgRltMWyBSW1hbIiwKKyAiSF1ORlJQT1sgT0ZTUFBbIF1GU1AgTEZSRiBZRl9GIExbU1siLAorICJHXVtGSFsgXFxGSVsgT0ZMTE5GXFxGIEhbVltYVVVbIiwKKyAiSFxcS0lMS1hXWVlZWyBMTFhYIEtJS0tMTVhZWVsgUFBMVEtWS1hMWktbIEtWTVogTFRMVk1YTVpLWyBTU1hOIFZJVkxXTllOWUxXS1ZJIFZJV0xZTiIsCisgIkhcXFFJS1sgU0lZWyBSSVhbIE1VVlUgSVtPWyBVW1tbIFFCT0NORU5HT0lRSlNKVUlWR1ZFVUNTQlFCIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiR11JQltiIiwKKyAiRl5SSklaIFJKW1oiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJJXU5PTlBNUE1PTk5QTVRNVk5XT1hRWFhZWlpbIFdPV1hYWlpbW1sgV1FWUlBTTVRMVkxYTVpQW1NbVVpXWCBQU05UTVZNWE5aUFsiLAorICJHXFxMRkxbIE1GTVsgTVBPTlFNU01WTlhQWVNZVVhYVlpTW1FbT1pNWCBTTVVOV1BYU1hVV1hVWlNbIElGTUYiLAorICJIW1dQVlFXUlhRWFBWTlRNUU1OTkxQS1NLVUxYTlpRW1NbVlpYWCBRTU9OTVBMU0xVTVhPWlFbIiwKKyAiSF1XRldbIFhGWFsgV1BVTlNNUU1OTkxQS1NLVUxYTlpRW1NbVVpXWCBRTU9OTVBMU0xVTVhPWlFbIFRGWEYgV1tbWyIsCisgIkhbTFNYU1hRV09WTlRNUU1OTkxQS1NLVUxYTlpRW1NbVlpYWCBXU1dQVk4gUU1PTk1QTFNMVU1YT1pRWyIsCisgIktYVUdUSFVJVkhWR1VGU0ZRR1BJUFsgU0ZSR1FJUVsgTU1VTSBNW1RbIiwKKyAiSVxcUU1PTk5PTVFNU05VT1ZRV1NXVVZWVVdTV1FWT1VOU01RTSBPTk5QTlRPViBVVlZUVlBVTiBWT1dOWU1ZTldOIE5VTVZMWExZTVtQXFxVXFxYXVleIExZTVpQW1VbWFxcWV5ZX1hhVWJPYkxhS19LXkxcXE9bIiwKKyAiR11MRkxbIE1GTVsgTVBPTlJNVE1XTlhQWFsgVE1WTldQV1sgSUZNRiBJW1BbIFRbW1siLAorICJNWFJGUUdSSFNHUkYgUk1SWyBTTVNbIE9NU00gT1tWWyIsCisgIk1YU0ZSR1NIVEdTRiBUTVRfU2FRYk9iTmFOYE9fUGBPYSBTTVNfUmFRYiBQTVRNIiwKKyAiR1xcTEZMWyBNRk1bIFdNTVcgUlNYWyBRU1dbIElGTUYgVE1aTSBJW1BbIFRbWlsiLAorICJNWFJGUlsgU0ZTWyBPRlNGIE9bVlsiLAorICJCY0dNR1sgSE1IWyBIUEpOTU1PTVJOU1BTWyBPTVFOUlBSWyBTUFVOWE1aTV1OXlBeWyBaTVxcTl1QXVsgRE1ITSBEW0tbIE9bVlsgWlthWyIsCisgIkddTE1MWyBNTU1bIE1QT05STVRNV05YUFhbIFRNVk5XUFdbIElNTU0gSVtQWyBUW1tbIiwKKyAiSFxcUU1OTkxQS1NLVUxYTlpRW1NbVlpYWFlVWVNYUFZOU01RTSBRTU9OTVBMU0xVTVhPWlFbIFNbVVpXWFhVWFNXUFVOU00iLAorICJHXFxMTUxiIE1NTWIgTVBPTlFNU01WTlhQWVNZVVhYVlpTW1FbT1pNWCBTTVVOV1BYU1hVV1hVWlNbIElNTU0gSWJQYiIsCisgIkhcXFdNV2IgWE1YYiBXUFVOU01RTU5OTFBLU0tVTFhOWlFbU1tVWldYIFFNT05NUExTTFVNWE9aUVsgVGJbYiIsCisgIklaTk1OWyBPTU9bIE9TUFBSTlRNV01YTlhPV1BWT1dOIEtNT00gS1tSWyIsCisgIkpbV09YTVhRV09WTlRNUE1OTk1PTVFOUlBTVVVXVlhXIE1QTlFQUlVUV1VYVlhZV1pVW1FbT1pOWU1XTVtOWSIsCisgIktaUEZQV1FaU1tVW1daWFggUUZRV1JaU1sgTU1VTSIsCisgIkddTE1MWE1aUFtSW1VaV1ggTU1NWE5aUFsgV01XWyBYTVhbIElNTU0gVE1YTSBXW1tbIiwKKyAiSVtMTVJbIE1NUlkgWE1SWyBKTVBNIFRNWk0iLAorICJGXkpNTlsgS01OWCBSTU5bIFJNVlsgU01WWCBaTVZbIEdNTk0gV01dTSIsCisgIkhcXExNV1sgTU1YWyBYTUxbIEpNUE0gVE1aTSBKW1BbIFRbWlsiLAorICJIW0xNUlsgTU1SWSBYTVJbUF9OYUxiS2JKYUtgTGEgSk1QTSBUTVpNIiwKKyAiSVtXTUxbIFhNTVsgTU1MUUxNWE0gTFtYW1hXV1siLAorICJHXlFNTk5MUEtSSlVKWEtaTltQW1JaVVdXVFlQWk0gUU1PTk1QTFJLVUtYTFpOWyBRTVNNVU5WUFhYWVpaWyBTTVROVVBXWFhaWltbWyIsCisgIkdcXFRGUUdPSU1NTFBLVEpaSWIgVEZSR1BJTk1NUExUS1pKYiBURlZGWEdZSFlLWE1XTlRPUE8gVkZYSFhLV01WTlRPIFBPVFBWUldUV1dWWVVaUltQW05aTVlMViBQT1NQVVJWVFZXVVlUWlJbIiwKKyAiSFxcSVBLTk1NT01RTlJPU1JTVlJaT2IgSk9MTlBOUk8gWk1ZUFhSU1lQXk5iIFlNWFBXUlNZIiwKKyAiSVxcVk5UTVJNT05NUUxUTFdNWU5aUFtSW1VaV1dYVFhRV09TSlJIUkZTRVVFV0ZZSCBSTVBOTlFNVE1YTlogUltUWlZXV1RXUFZOVEtTSVNHVEZWRllIIiwKKyAiSVtYUFZOVE1QTU5OTlBQUlNTIFBNT05PUFFSU1MgU1NOVExWTFhNWlBbU1tVWldYIFNTT1RNVk1YTlpQWyIsCisgIklbVEZSR1FIUUlSSlVLWktaSldLU01QT01STFVMV01ZUFtTXVRfVGFTYlFiUGEgVUxRT05STVVNV05ZUFsiLAorICJHXUhRSU9LTU5NT05PUE5UTFsgTU1OTk5QTVRLWyBOVFBQUk5UTVZNWE5ZT1lSWFdVYiBWTVhPWFJXV1RiIiwKKyAiRl1HUUhPSk1NTU5OTlBNVU1YTlpPWyBMTU1OTVBMVUxYTVpPW1FbU1pVWFdVWFJZTVlJWEdWRlRGUkhSSlNNVVBXUlpUIFNaVVdWVVdSWE1YSVdHVkYiLAorICJMWFJNUFRPWE9aUFtTW1VZVlcgU01RVFBYUFpRWyIsCisgIkhcXE5NSlsgT01LWyBYTVlOWk5ZTVdNVU5RUk9TTVMgT1NRVFNaVFsgT1NQVFJaU1tVW1daWVciLAorICJIXFxLRk1GT0dQSFFKV1hYWllbIE1GT0hQSlZYV1pZW1pbIFJNSlsgUk1LWyIsCisgIkZdTU1HYiBOTUhiIE1QTFZMWU5bUFtSWlRYVlUgWE1VWFVaVltZW1tZXFxXIFlNVlhWWldbIiwKKyAiSFxcTk1MWyBPTU5TTVhMWyBZTVhRVlUgWk1ZUFhSVlVUV1FZT1pMWyBLTU9NIiwKKyAiSVpURlJHUUhRSVJKVUtYSyBVS1FMT01OT05RUFNTVFZUIFVLUkxQTU9PT1FRU1NUIFNUT1VNVkxYTFpOXFxTXlRfVGFSYlBiIFNUUFVOVk1YTVpPXFxTXiIsCisgIklbUk1PTk1RTFRMV01ZTlpQW1JbVVpXV1hUWFFXT1ZOVE1STSBSTVBOTlFNVE1YTlogUltUWlZXV1RXUFZOIiwKKyAiR11QTkxbIFBOTVsgVk5WWyBWTldbIElQS05OTVtNIElQS09OTltOIiwKKyAiSFtMVk1ZTlpQW1JbVVpXV1hUWFFXT1ZOVE1STU9OTVFMVEhiIFJbVFpWV1dUV1BWTiBSTVBOTlFNVEliIiwKKyAiSF1bTVFNTk5MUUtUS1dMWU1aT1tRW1RaVldXVFdRVk9VTlNNIFFNT05NUUxUTFhNWiBRW1NaVVdWVFZQVU4gVU5bTiIsCisgIkhcXFNOUFsgU05RWyBKUExOT01aTSBKUExPT05aTiIsCisgIkhcXElRSk9MTU9NUE5QUE5WTllQWyBOTU9OT1BNVk1ZTlpQW1FbVFpWWFhVWVJZT1hNV05YT1lSIFhVWU8iLAorICJHXU9OTU9LUUpUSldLWUxaTltRW1RaV1hZVVpSWk9YTVZNVE9SU1BYTWIgSldMWU5aUVpUWVdXWVUgWk9YTlZOVFBSU1BZTmIiLAorICJJW0tNTU1PTlBQVV9WYVdiIE1NTk5PUFRfVWFXYlliIFpNWU9XUk1dS2BKYiIsCisgIkZdVUZPYiBWRk5iIEdRSE9KTU1NTk5OUE1VTVhPWlJaVFlXVllTIExNTU5NUExVTFhNWk9bUltUWlZYWFVZU1tNIiwKKyAiRl1KUUxPT05OTUxOSlFJVElXSlpLW01bT1pRV1JUIElXSllLWk1aT1lRVyBRVFFXUlpTW1VbV1pZV1pUWlFZTlhNV05ZT1pRIFFXUllTWlVaV1lZVyIsCisgIkhdWE1WVFVYVVpWW1lbW1lcXFcgWU1XVFZYVlpXWyBWVFZRVU5TTVFNTk5MUUtUS1dMWU1aT1tRW1NaVVdWVCBRTU9OTVFMVExYTVoiLAorICJIW1BGTFNMVk1ZTlogUUZNUyBNU05QUE5STVRNVk5XT1hRWFRXV1VaUltQW05aTVdNUyBWTldQV1RWV1RaUlsgTUZRRiIsCisgIklbV1BXUVhRWFBXTlVNUk1PTk1RTFRMV01ZTlpQW1JbVVpXVyBSTVBOTlFNVE1YTloiLAorICJIXVpGVlRVWFVaVltZW1tZXFxXIFtGV1RWWFZaV1sgVlRWUVVOU01RTU5OTFFLVEtXTFlNWk9bUVtTWlVXVlQgUU1PTk1RTFRMWE1aIFdGW0YiLAorICJJW01WUVVUVFdSWFBXTlVNUk1PTk1RTFRMV01ZTlpQW1JbVVpXWCBSTVBOTlFNVE1YTloiLAorICJLWlpHWUhaSVtIW0daRlhGVkdVSFRKU01QW09fTmEgWEZWSFVKVE5SV1FbUF5PYE5hTGJKYklhSWBKX0tgSmEgT01ZTSIsCisgIkhcXFlNVVtUXlJhT2JMYkphSWBJX0peS19KYCBYTVRbU15RYU9iIFZUVlFVTlNNUU1OTkxRS1RLV0xZTVpPW1FbU1pVV1ZUIFFNT05NUUxUTFhNWiIsCisgIkhdUEZKWyBRRktbIE1UT1BRTlNNVU1XTlhPWFFWV1ZaV1sgVU1XT1dRVVdVWlZbWVtbWVxcVyBNRlFGIiwKKyAiTFlVRlRHVUhWR1VGIE1RTk9QTVNNVE5UUVJXUlpTWyBSTVNOU1FRV1FaUltVW1dZWFciLAorICJMWVZGVUdWSFdHVkYgTlFPT1FNVE1VTlVRUltRXlBgT2FNYktiSmFKYEtfTGBLYSBTTVROVFFRW1BeT2BNYiIsCisgIkhcXFBGSlsgUUZLWyBYTldPWFBZT1lOWE1XTVVOUVJPU01TIE9TUVRTWlRbIE9TUFRSWlNbVVtXWllXIE1GUUYiLAorICJNWVVGUVRQWFBaUVtUW1ZZV1cgVkZSVFFYUVpSWyBSRlZGIiwKKyAiQWJCUUNPRU1ITUlOSVBIVEZbIEdNSE5IUEdURVsgSFRKUExOTk1QTVJOU09TUVBbIFBNUk9SUU9bIFJUVFBWTlhNWk1cXE5dT11RW1dbWlxcWyBaTVxcT1xcUVpXWlpbW15bYFlhVyIsCisgIkZdR1FIT0pNTU1OTk5QTVRLWyBMTU1OTVBMVEpbIE1UT1BRTlNNVU1XTlhPWFFWV1ZaV1sgVU1XT1dRVVdVWlZbWVtbWVxcVyIsCisgIklbUk1PTk1RTFRMV01ZTlpQW1JbVVpXV1hUWFFXT1ZOVE1STSBSTVBOTlFNVE1YTlogUltUWlZXV1RXUFZOIiwKKyAiR1xcSFFJT0tNTk1PTk9QTlRKYiBNTU5OTlBNVEliIE5UT1FRTlNNVU1XTlhPWVFZVFhXVlpTW1FbT1pOV05UIFdOWFBYVFdXVVpTWyBGYk1iIiwKKyAiSFxcWE1SYiBZTVNiIFZUVlFVTlNNUU1OTkxRS1RLV0xZTVpPW1FbU1pVV1ZUIFFNT05NUUxUTFhNWiBPYlZiIiwKKyAiSVpKUUtPTU1QTVFOUVBQVE5bIE9NUE5QUE9UTVsgUFRSUFROVk1YTVlOWU9YUFdPWE4iLAorICJKW1hPWFBZUFlPWE5VTVJNT05OT05RT1JWVldXIE5QT1FWVVdWV1lWWlNbUFtNWkxZTFhNWE1ZIiwKKyAiS1lURlBUT1hPWlBbU1tVWVZXIFVGUVRQWFBaUVsgTk1XTSIsCisgIkZdR1FIT0pNTU1OTk5RTFdMWU5bIExNTU5NUUtXS1lMWk5bUFtSWlRYVlQgWE1WVFVYVVpWW1lbW1lcXFcgWU1XVFZYVlpXWyIsCisgIkhcXElRSk9MTU9NUE5QUU5XTllQWyBOTU9OT1FNV01ZTlpQW1FbVFpWWFhVWVFZTVhNWU8iLAorICJDYERRRU9HTUpNS05LUUlXSVlLWyBJTUpOSlFIV0hZSVpLW01bT1pRWFJWIFRNUlZSWVNaVVtXW1laW1hcXFZdUl1NXFxNXU8gVU1TVlNZVVsiLAorICJIXFxLUU1OT01STVNPU1IgUU1ST1JSUVZQWE5aTFtLW0paSllLWExZS1ogUVZRWVJbVVtXWllXIFlOWE9ZUFpPWk5ZTVhNVk5UUFNSUlZSWVNbIiwKKyAiR1xcSFFJT0tNTk1PTk9RTVdNWU9bIE1NTk5OUUxXTFlNWk9bUVtTWlVYV1QgWk1WW1VeU2FQYk1iS2FKYEpfS15MX0tgIFlNVVtUXlJhUGIiLAorICJIXFxZTVhPVlFOV0xZS1sgTFFNT09NUk1WTyBNT09OUk5WT1hPIExZTllSWlVaV1kgTllSW1VbV1lYVyIsCisgIkdeVkdVSFZJV0hXR1VGUkZPR01JTExMWyBSRlBHTklNTE1bIFxcR1tIXFxJXUhdR1xcRlpGWEdXSVdbIFpGWUdYSVhbIElNW00gSVtQWyBUW1tbIiwKKyAiR11XR1ZIV0lYSFdHVUZSRk9HTUlMTExbIFJGUEdOSU1MTVsgV01XWyBYTVhbIElNWE0gSVtQWyBUW1tbIiwKKyAiR11WR1VIVklXSFdHVUYgWEZSRk9HTUlMTExbIFJGUEdOSU1MTVsgV0hXWyBYRlhbIElNV00gSVtQWyBUW1tbIiwKKyAiQmNSR1FIUklTSFJHUEZNRkpHSElHTEdbIE1GS0dJSUhMSFsgXUdcXEhdSV5IXUdbRlhGVUdTSVJMUlsgWEZWR1RJU0xTWyBdTV1bIF5NXlsgRE1eTSBEW0tbIE9bVlsgWlthWyIsCisgIkJjUkdRSFJJU0hSR1BGTUZKR0hJR0xHWyBNRktHSUlITEhbIFxcR1tIXFxJXUhdR1tGIF5GWEZVR1NJUkxSWyBYRlZHVElTTFNbIF1IXVsgXkZeWyBETV1NIERbS1sgT1tWWyBaW2FbIiwKKyAiTVhSTVJbIFNNU1sgT01TTSBPW1ZbIiwKKyAiIiwKKyAiSVpXTlVNUk1PTk1QTFNMVk1ZTlpRW1RbVlogUk1QTk5QTVNNVk5ZT1pRWyBNVFVUIiwKKyAiSVxcVEZRR09KTkxNT0xUTFhNWk9bUVtUWlZXV1VYUllNWUlYR1ZGVEYgVEZSR1BKT0xOT01UTVhOWk9bIFFbU1pVV1ZVV1JYTVhJV0dWRiBOUFdQIiwKKyAiR11VRk9iIFZGTmIgUU1NTktQSlNKVktYTVpQW1NbV1pZWFpVWlJZUFdOVE1RTSBRTU5OTFBLU0tWTFhOWlBbIFNbVlpYWFlVWVJYUFZOVE0iLAorICJJW1RNVk5YUFhPV05UTVFNTk5NT0xRTFNNVU9XU1ogUU1PTk5PTVFNU05VU1pUXFxUXlNfUV8iLAorICIiLAorICIiLAorICJHXUxNS05KUEpSS1VPWVBbIEpSS1RPWFBbUF1PYE1iTGJLYUpfSlxcS1hNVE9RUk5UTVZNWU5aUFpUWVhXWlVbVFtTWlNYVFdVWFRZIFZNWE5ZUFlUWFhXWiIsCisgIkVfWUdYSFlJWkhZR1dGVEZRR09JTktNTkxSSltJX0hhIFRGUkdQSU9LTk5MV0tbSl5JYEhhRmJEYkNhQ2BEX0VgRGEgX0deSF9JYEhgR19GXUZbR1pIWUpYTVVbVF9TYSBdRltIWkpZTldXVltVXlRgU2FRYk9iTmFOYE9fUGBPYSBJTV5NIiwKKyAiRl5bR1pIW0lcXEhbR1hGVUZSR1BJT0tOTk1SS1tKX0lhIFVGU0dRSVBLT05NV0xbS15KYElhR2JFYkRhRGBFX0ZgRWEgWU1XVFZYVlpXW1pbXFxZXVcgWk1YVFdYV1pYWyBKTVpNIiwKKyAiRl5ZR1hIWUlaSFpHWEYgXFxGVUZSR1BJT0tOTk1SS1tKX0lhIFVGU0dRSVBLT05NV0xbS15KYElhR2JFYkRhRGBFX0ZgRWEgW0ZXVFZYVlpXW1pbXFxZXVcgXFxGWFRXWFdaWFsgSk1ZTSIsCisgIkBjVEdTSFRJVUhUR1JGT0ZMR0pJSUtITkdSRVtEX0NhIE9GTUdLSUpLSU5HV0ZbRV5EYENhQWI/Yj5hPmA/X0BgP2EgYEdfSGBJYUhgR11GWkZXR1VJVEtTTlJSUFtPX05hIFpGWEdWSVVLVE5SV1FbUF5PYE5hTGJKYklhSWBKX0tgSmEgXk1cXFRbWFtaXFxbX1thWWJXIF9NXVRcXFhcXFpdWyBETV9NIiwKKyAiQGNUR1NIVElVSFRHUkZPRkxHSklJS0hOR1JFW0RfQ2EgT0ZNR0tJSktJTkdXRltFXkRgQ2FBYj9iPmE+YD9fQGA/YSBeR11IXklfSF9HXUYgYUZaRldHVUlUS1NOUlJQW09fTmEgWkZYR1ZJVUtUTlJXUVtQXk9gTmFMYkpiSWFJYEpfS2BKYSBgRlxcVFtYW1pcXFtfW2FZYlcgYUZdVFxcWFxcWl1bIERNXk0iLAorICJMWU1RTk9QTVNNVE5UUVJXUlpTWyBSTVNOU1FRV1FaUltVW1dZWFciLAorICIiLAorICJOViIsCisgIkpaIiwKKyAiSFxcUUZOR0xKS09LUkxXTlpRW1NbVlpYV1lSWU9YSlZHU0ZRRiBRRk9HTkhNSkxPTFJNV05ZT1pRWyBTW1VaVllXV1hSWE9XSlZIVUdTRiIsCisgIkhcXE5KUElTRlNbIFJHUlsgTltXWyIsCisgIkhcXExKTUtMTEtLS0pMSE1HUEZURldHWEhZSllMWE5VUFBSTlNMVUtYS1sgVEZWR1dIWEpYTFdOVFBQUiBLWUxYTlhTWlZaWFlZWCBOWFNbV1tYWllYWVYiLAorICJIXFxMSk1LTExLS0tKTEhNR1BGVEZXR1hJWExXTlRPUU8gVEZWR1dJV0xWTlRPIFRPVlBYUllUWVdYWVdaVFtQW01aTFlLV0tWTFVNVkxXIFdRWFRYV1dZVlpUWyIsCisgIkhcXFRIVFsgVUZVWyBVRkpVWlUgUVtYWyIsCisgIkhcXE1GS1AgS1BNTlBNU01WTlhQWVNZVVhYVlpTW1BbTVpMWUtXS1ZMVU1WTFcgU01VTldQWFNYVVdYVVpTWyBNRldGIE1HUkdXRiIsCisgIkhcXFdJVkpXS1hKWElXR1VGUkZPR01JTEtLT0tVTFhOWlFbU1tWWlhYWVVZVFhRVk9TTlJOT09NUUxUIFJGUEdOSU1LTE9MVU1YT1pRWyBTW1VaV1hYVVhUV1FVT1NOIiwKKyAiSFxcS0ZLTCBLSkxITkZQRlVJV0lYSFlGIExITkdQR1VJIFlGWUlYTFRRU1NSVlJbIFhMU1FSU1FWUVsiLAorICJIXFxQRk1HTElMTE1OUE9UT1dOWExYSVdHVEZQRiBQRk5HTUlNTE5OUE8gVE9WTldMV0lWR1RGIFBPTVBMUUtTS1dMWU1aUFtUW1daWFlZV1lTWFFXUFRPIFBPTlBNUUxTTFdNWU5aUFsgVFtWWldZWFdYU1dRVlBUTyIsCisgIkhcXFhNV1BVUlJTUVNOUkxQS01LTExJTkdRRlNGVkdYSVlMWVJYVldYVVpSW09bTVpMWExXTVZOV01YIFFTT1JNUExNTExNSU9HUUYgU0ZVR1dJWExYUldWVlhUWlJbIiwKKyAiTVdSWVFaUltTWlJZIiwKKyAiTVdSW1FaUllTWlNcXFJeUV8iLAorICJNV1JNUU5ST1NOUk0gUllRWlJbU1pSWSIsCisgIk1XUk1RTlJPU05STSBSW1FaUllTWlNcXFJeUV8iLAorICJNV1JGUUhSVFNIUkYgUkhSTiBSWVFaUltTWlJZIiwKKyAiSVtNSk5LTUxMS0xKTUhOR1BGU0ZWR1dIWEpYTFdOVk9SUVJUIFNGVUdWSFdKV0xWTlRQIFJZUVpSW1NaUlkiLAorICJOVlJGUU0gU0ZRTSIsCisgIkpaTkZNTSBPRk1NIFZGVU0gV0ZVTSIsCisgIktZUUZPR05JTktPTVFOU05VTVZLVklVR1NGUUYiLAorICJKWlJGUlIgTUlXTyBXSU1PIiwKKyAiR11bQkliIiwKKyAiS1lWQlREUkdQS09QT1RQWVJdVGBWYiBURFJIUUtQUFBUUVlSXFxUYCIsCisgIktZTkJQRFJHVEtVUFVUVFlSXVBgTmIgUERSSFNLVFBUVFNZUlxcUGAiLAorICJLWU9CT2IgUEJQYiBPQlZCIE9iVmIiLAorICJLWVRCVGIgVUJVYiBOQlVCIE5iVWIiLAorICJKWVRCUUVQSFBKUU1TT1NQT1JTVFNVUVdQWlBcXFFfVGIgUkRRR1FLUk4gUlZRWVFdUmAiLAorICJLWlBCU0VUSFRKU01RT1FQVVJRVFFVU1dUWlRcXFNfUGIgUkRTR1NLUk4gUlZTWVNdUmAiLAorICJLWVVCTlJVYiIsCisgIktZT0JWUk9iIiwKKyAiTlZSQlJiIiwKKyAiS1lPQk9iIFVCVWIiLAorICJFX0lSW1IiLAorICJFX1JJUlsgSVJbUiIsCisgIkZeUkpSWyBKUlpSIEpbWlsiLAorICJGXlJKUlsgSkpaSiBKUlpSIiwKKyAiR11LS1lZIFlLS1kiLAorICJNV1FRUVNTU1NRUVEgUlFSUyBRUlNSIiwKKyAiRV9SSVFKUktTSlJJIElSW1IgUllRWlJbU1pSWSIsCisgIkVfSU9bTyBJVVtVIiwKKyAiRV9ZSUtbIElPW08gSVVbVSIsCisgIkVfSU1bTSBJUltSIElXW1ciLAorICJGXlpJSlJaWyIsCisgIkZeSklaUkpbIiwKKyAiRl5aRkpNWlQgSlZaViBKW1pbIiwKKyAiRl5KRlpNSlQgSlZaViBKW1pbIiwKKyAiRl9bV1lXV1ZVVFJQUU9PTk1OS09KUUpTS1VNVk9WUVVSVFVQV05ZTVtNIiwKKyAiRl5JVUlTSlBMT05PUFBUU1ZUWFRaU1tRIElTSlFMUE5QUFFUVFZVWFVaVFtRW08iLAorICJHXUpUUk9aVCBKVFJQWlQiLAorICJMWFRGT0wgVEZVR09MIiwKKyAiTFhQRlVMIFBGT0dVTCIsCisgIkhcXEtGTEhOSlFLU0tWSlhIWUYgS0ZMSU5LUUxTTFZLWElZRiIsCisgIk1XUkhRR1JGU0dTSVJLUUwiLAorICJNV1NGUkdRSVFLUkxTS1JKIiwKKyAiTVdSSFNHUkZRR1FJUktTTCIsCisgIk1XUUZSR1NJU0tSTFFLUkoiLAorICJFW0hNTE1SWSBLTVJbIFtCUlsiLAorICJGXlpKU0pPS01MS05KUUpTS1ZNWE9ZU1paWiIsCisgIkZeSkpKUUtVTFdOWVFaU1pWWVhXWVVaUVpKIiwKKyAiRl5KSlFKVUtXTFlOWlFaU1lWV1hVWVFaSloiLAorICJGXkpaSlNLT0xNTktRSlNKVktYTVlPWlNaWiIsCisgIkZeWkpTSk9LTUxLTkpRSlNLVk1YT1lTWlpaIEpSVlIiLAorICJFX1hQW1JYVCBVTVpSVVcgSVJaUiIsCisgIkpaUExSSVRMIE1PUkpXTyBSSlJbIiwKKyAiRV9MUElSTFQgT01KUk9XIEpSW1IiLAorICJKWlBYUltUWCBNVVJaV1UgUklSWiIsCisgIklcXFhSV09WTlRNUk1PTk1RTFRMV01ZTlpQW1JbVVpXWFhVWVBZS1hIV0dVRlJGUEdPSE9JUElQSCBSTVBOTlFNVE1YTlogUltUWlZYV1VYUFhLV0hVRiIsCisgIkhcXEpGUlsgS0ZSWSBaRlJbIEpGWkYgS0dZRyIsCisgIkFiRE1JTVJZIEhOUlsgYjpSWyIsCisgIkZeW0NaRFtFXFxEXFxDW0JZQldDVUVUR1NKUk5QWk9eTmAgVkRVRlRKUlZRWlBdT19NYUtiSWJIYUhgSV9KYElhIiwKKyAiRl5bQ1pEW0VcXERcXENbQllCV0NVRVRHU0pSTlBaT15OYCBWRFVGVEpSVlFaUF1PX01hS2JJYkhhSGBJX0pgSWEgUUtOTExOS1FLU0xWTlhRWVNZVlhYVllTWVFYTlZMU0tRSyIsCisgIkZfXFxTW1VZVldWVVVUVFFQUE9OTkxOSk9JUUlTSlVMVk5WUFVRVFRQVU9XTllOW09cXFFcXFMiLAorICJGXltGSVsgTkZQSFBKT0xNTUtNSUtJSUpHTEZORlBHU0hWSFlHW0YgV1RVVVRXVFlWW1hbWlpbWFtWWVRXVCIsCisgIkZfW05aT1tQXFxPXFxOW01aTVlOWFBWVVRYUlpQW01bSlpJWElVSlNQT1JNU0tTSVJHUEZOR01JTUtOTlBRVVhXWlpbW1tcXFpcXFkgTVtLWkpYSlVLU01RIE1LTk1WWFhaWlsiLAorICJFYFdOVkxUS1FLT0xOTU1QTVNOVVBWU1ZVVVZTIFFLT01OUE5TT1VQViBXS1ZTVlVYVlpWXFxUXVFdT1xcTFtKWUhXR1RGUUZOR0xISkpJTEhPSFJJVUpXTFlOWlFbVFtXWllZWlggWEtXU1dVWFYiLAorICJIXFxQQlBfIFRCVF8gWElXSlhLWUpZSVdHVEZQRk1HS0lLS0xNTU5PT1VRV1JZVCBLS01NT05VUFdRWFJZVFlYV1pUW1BbTVpLWEtXTFZNV0xYIiwKKyAiR11PRk9iIFVGVWIgSlFaUSBKV1pXIiwKKyAiSlpVSVRKVUtWSlZJVUdTRlFGT0dOSU5LT01RT1ZSIE9NVFBWUldUV1ZWWFRaIFBOTlBNUk1UTlZQWFVbIE5WU1lVW1ZdVl9VYVNiUWJPYU5fTl5PXVBeT18iLAorICJKWlJGUUhSSlNIUkYgUkZSYiBSUVFUUmJTVFJRIExNTk5QTU5MTE0gTE1YTSBUTVZOWE1WTFRNIiwKKyAiSlpSRlFIUkpTSFJGIFJGUlQgUlBRUlNWUlhRVlNSUlAgUlRSYiBSXlFgUmJTYFJeIExNTk5QTU5MTE0gTE1YTSBUTVZOWE1WTFRNIExbTlxcUFtOWkxbIExbWFsgVFtWXFxYW1ZaVFsiLAorICJJXFxYRlhbIEtGWEYgUFBYUCBLW1hbIiwKKyAiIiwKKyAiRWBRRk5HS0lJTEhPSFJJVUtYTlpRW1RbV1paWFxcVV1SXU9cXExaSVdHVEZRRiBST1FQUVFSUlNSVFFUUFNPUk8gUlBSUVNRU1BSUCIsCisgIkpbUEZOR09JUUogUEZPR09JIFVGV0dWSVRKIFVGVkdWSSBRSk9LTkxNTk1RTlNPVFFVVFVWVFdTWFFYTldMVktUSlFKIFJVUlsgU1VTWyBOWFdYIiwKKyAiSVxcUkZPR01JTExMTU1QT1JSU1NTVlJYUFlNWUxYSVZHU0ZSRiBSU1JbIFNTU1sgTldXVyIsCisgIkRgUEZNR0pJSExHT0dTSFZKWU1bUFxcVFxcV1taWVxcVl1TXU9cXExaSVdHVEZQRiBSRlJcXCBHUV1RIiwKKyAiR2BQTU1OS1BKU0pUS1dNWVBaUVpUWVZXV1RXU1ZQVE5RTVBNIF1HV0dbSFVOIF1HXU1cXElWTyBcXEhWTiIsCisgIkZcXElJSkdMRk9GUUdSSVJMUU9QUU5TS1UgT0ZQR1FJUU1QUE5TIFZGVFsgV0ZTWyBLVVlVIiwKKyAiSVxcTUZNVSBORk1RIE1RTk9PTlFNVE1XTlhQWFJXVFVWIFRNVk5XUFdSVFhUWlVbV1tZWSBLRk5GIiwKKyAiSVxcUk5PT01RTFRMVU1YT1pSW1NbVlpYWFlVWVRYUVZPU05STiBSSE5KUkZSTiBTSFdKU0ZTTiBSU1FUUVVSVlNWVFVUVFNTUlMgUlRSVVNVU1RSVCIsCisgIkdeUUhSRlJbIFRIU0ZTWyBKSEtGS01MUE5SUVNSUyBNSExGTE5NUSBbSFpGWk1ZUFdSVFNTUyBYSFlGWU5YUSBOV1dXIiwKKyAiR11MRkxbIE1GTVsgSUZVRlhHWUhaSlpNWU9YUFVRTVEgVUZXR1hIWUpZTVhPV1BVUSBJW1lbWVZYWyIsCisgIkhbWUdVR1FITkpMTUtQS1NMVk5ZUVtVXFxZXFwgWUdWSFNKUU1QUFBTUVZTWVZbWVxcIiwKKyAiRl9PUU1RS1JKU0lVSVdKWUtaTVtPW1FaUllTV1NVUlNRUk9RIFNIUFEgWkpSUiBcXFFTVCIsCisgIkhcXE9LVVkgVUtPWSBLT1lVIFlPS1UiLAorICJGXk5WTFVLVUlWSFhIWUlbS1xcTFxcTltPWU9YTlZLUkpPSk1LSk1IUEdUR1dIWUpaTVpPWVJWVlVYVVlWW1hcXFlcXFtbXFxZXFxYW1ZZVVhVVlYgSk1LS01JUEhUSFdJWUtaTSIsCisgIkZeTk1MTktOSU1IS0hKSUhLR0xHTkhPSk9LTk1LUUpUSlZLWU1bUFxcVFxcV1tZWVpWWlRZUVZNVUtVSlZIWEdZR1tIXFxKXFxLW01ZTlhOVk0gSlZLWE1aUFtUW1daWVhaViIsCisgIklbS1lZSyBRTFVMWUtYT1hTIFVMWExYTyIsCisgIklbWUtLWSBMUUxVS1lPWFNYIExVTFhPWCIsCisgIklbWVlLSyBTTE9MS0tMT0xTIE9MTExMTyIsCisgIklbS0tZWSBRWFVYWVlYVVhRIFVYWFhYVSIsCisgIiIsCisgIkZfSk1JTElKSkhMR05HUEhRSVJLU1AgSUpLSE1IT0lQSlFMUlBSWyBbTVxcTFxcSltIWUdXR1VIVElTS1JQIFxcSlpIWEhWSVVKVExTUFNbIiwKKyAiRl5JR0pLS01NT1BQVFBXT1lNWktbRyBJR0pKS0xNTlBPVE9XTllMWkpbRyBQT05QTVFMU0xWTVhPWlFbU1tVWldYWFZYU1dRVlBUTyBQUE5RTVNNVk5ZIFZZV1ZXU1ZRVFAiLAorICJGXk1KTVYgTktOVSBWS1ZVIFdKV1YgSUdLSU1KUEtUS1dKWUlbRyBJWUtXTVZQVVRVV1ZZV1tZIiwKKyAiRl5bSUxJSkpJTElOSlBMUU5RUFBRTlFMUEpbSiBJTUpPS1BNUSBRTVBLT0pNSSBJWFhYWldbVVtTWlFYUFZQVFFTU1NVVFdJVyBbVFpSWVFXUCBTVFRWVVdXWCIsCisgIkZdT1VNVExUSlVJV0lYSlpMW01bT1pQWFBXT1VKUElOSUtKSUxIT0dTR1dIWUpaTFpPWVJWVVVXVVlWW1hbWVpaWCBNU0tQSk5KS0tJTEggU0dWSFhKWUxZT1hSVlUiLAorICJHX0hLS0hNS01WIEpJTExMViBNS1BIUktSVSBPSVFMUVUgUktVSFdLV1sgVElWTFZbIFdLWkhbSlxcTVxcUFtTWlVYV1VZUFsgWUlaSltNW1BaU1lVV1dUWVBbIiwKKyAiRl5JU01TTFJLT0tNTEpOSFFHU0dWSFhKWU1ZT1hSV1NbUyBJVE9UTVJMT0xNTUpPSFFHIFNHVUhXSlhNWE9XUlVUW1QgS1hZWCBLWVlZIiwKKyAiRl9HTEpJTUxNWCBJSkxNTFggTUxQSVNMU1ggT0pSTVJYIFNMVklZTFlXW1kgVUpYTVhYWlpdVyIsCisgIkddWklKWSBaSVdKUUogWEtVS1FKIFpJWUxZUiBYS1hOWVIgUVJKUiBQU01TSlIgUVJRWSBQU1BWUVkiLAorICJGXkhPSktPVSBKTU9XUlBXUFpPW01bS1pJWEhXSFVJVEtUTVVQVlJXVVdYVVogV0hWSVVLVU1XUVhUWFdXWVVaIiwKKyAiRl5JT0xMUE4gS01PT1JMVU4gUU1UT1dMWU4gVk1YT1tMIElVTFJQVCBLU09VUlJVVCBRU1RVV1JZVCBWU1hVW1IiLAorICJGXkpITkpQTFFPUVJQVU5XSlkgSkhNSU9KUUxSTyBSUlFVT1dNWEpZIFpIV0lVSlNMUk8gUlJTVVVXV1haWSBaSFZKVExTT1NSVFVWV1pZIElQW1AgSVFbUSIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIk5WUVFRU1NTU1FRUSBRUVNTIFNRUVMiLAorICJKWk1QUVJUVFZWV1lXW1ZdVV4gTVFTVCBNUlBTVFVWV1dZIiwKKyAiSlpXS1ZNVE9QUU1SIFNQTVMgVUZWR1dJV0tWTlRQUVJNVCIsCisgIkhcXFNNT05MUEtSS1RMVk5XUVdVVlhUWVJZUFhOVk1TTSBYTlNNIFZNUU5MUCBPTktSIExWUVcgTldTVlhUIFVWWVIiLAorICJIXFxTTU9OTFBLUktUTFZOV1FXVVZYVFlSWVBYTlZNU00gWE5TTSBWTVFOTFAgT05LUiBMVlFXIE5XU1ZYVCBVVllSIiwKKyAiSltTTVBOTlBNUk1UTlZQV1JXVVZXVFhSWFBXTlVNU00gT1BVTSBOUlZOIE1UV08gTlVYUCBPVldSIFBXVlQiLAorICJKWk9HT14gVUZVXSBNTldMIE1PV00gTVdXVSBNWFdWIiwKKyAiSlpORk5YIFZMVl4gTk5WTCBOT1ZNIE5XVlUgTlhWViIsCisgIkpaTkJOVyBOTlFMVExWTVdPV1FWU1NVUVZOVyBOTlFNVE1WTiBVTVZPVlFVU1NVIiwKKyAiRV9ISUhMIFxcSVxcTCBISVxcSSBISlxcSiBIS1xcSyBITFxcTCIsCisgIkpaTU5NUSBXTldRIE1OV04gTU9XTyBNUFdQIE1RV1EiLAorICJKWk1MV1ggTUxPTlFPVE9WTldNV0tVS1VNVE8gT05UTyBRT1dNIFZLVk4gVUxXTCBXWFVWU1VQVU5WTVdNWU9ZT1dQVSBVVlBVIFNVTVcgTlZOWSBNWE9YIiwKKyAiSlpQT09NT0tNS01NTk5QT1NPVU5XTCBOS05OIE1MT0wgTU1TTyBQT1VOIFdMV1kiLAorICJBXkdmSGZJZUlkSGNHY0ZkRmZHaElpS2lOaFBmUWRSYFJVUTtRNFIvUy1VLFYsWC1ZL1kzWDZXOFU7UD9KQ0hFRkhFSkRORFJFVkdZSltOXFxSXFxWW1haWldbVFtQWk1ZS1dJVEhQSE1JS0tKTkpSS1VNVyBHZEdlSGVIZEdkIFU7UT9MQ0lGR0lGS0VORVJGVkdYSlsgUlxcVVtXWllXWlRaUFlNWEtWSVRIIiwKKyAiRWZOU09VUVZTVlVVVlNWUVVPU05RTk9PTlBNU01WTllQW1NcXFZcXFlbW1lcXFddVF1QXFxNWkpYSVVIUkhPSU1KS0xJT0hTSFhJXUthTWNQZVRmWWZdZWBjYmEgS0xKTklSSVhKXFxMYE5iUWRVZVllXWRfY2JhIFBPVE8gT1BVUCBOUVZRIE5SVlIgTlNWUyBPVFVUIFBVVFUgYUxhTmNOY0xhTCBiTGJOIGFNY00gYVZhWGNYY1ZhViBiVmJYIGFXY1ciLAorICJEYEhASGQgTUBNZCBXQFdkIFxcQFxcZCBNTVdLIE1OV0wgTU9XTSBNV1dVIE1YV1YgTVlXVyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIk5WUVFRU1NTU1FRUSBRUVNTIFNRUVMiLAorICJKWk1QUVJUVFZWV1lXW1ZdVV4gTVFTVCBNUlBTVFVWV1dZIiwKKyAiSlpXS1ZNVE9QUU1SIFNQTVMgVUZWR1dJV0tWTlRQUVJNVCIsCisgIkhcXFBNTU5MT0tRS1NMVU1WUFdUV1dWWFVZU1lRWE9XTlRNUE0gTU5MUExTTVVOVlBXIFdWWFRYUVdPVk5UTSIsCisgIkhcXFNNT05MUEtSS1RMVk5XUVdVVlhUWVJZUFhOVk1TTSBYTlNNIFZNUU5MUCBPTktSIExWUVcgTldTVlhUIFVWWVIiLAorICJKW1NNUE5OUE1STVROVlBXUldVVldUWFJYUFdOVU1TTSBPUFVNIE5SVk4gTVRXTyBOVVhQIE9WV1IgUFdWVCIsCisgIkpaT0dPXiBVRlVdIE1OV0wgTU9XTSBNV1dVIE1YV1YiLAorICJKWk5GTlggVkxWXiBOTlZMIE5PVk0gTldWVSBOWFZWIiwKKyAiSlpOQk5XIE5OUUxUTFZNV09XUVZTU1VRVk5XIE5OUU1UTVZOIFVNVk9WUVVTU1UiLAorICJFX0hJSEwgXFxJXFxMIEhJXFxJIEhKXFxKIEhLXFxLIEhMXFxMIiwKKyAiSlpNTk1RIFdOV1EgTU5XTiBNT1dPIE1QV1AgTVFXUSIsCisgIkpaUUNWTVJUUlUgVUxRUyBUSVRLUFJSVVVZIFdcXFVZU1hRWE9ZTltOXU9fUmEgV1xcVVpTWU9ZT11QX1JhIFNYUFpOXSIsCisgIkpaUE9PTU9LTUtNTU5OUE9TT1VOV0wgTktOTiBNTE9MIE1NU08gUE9VTiBXTFNZIiwKKyAiQV5HZkhmSWVJZEhjR2NGZEZmR2hJaUtpTmhQZlFkUmBSVVE7UTRSL1MtVSxWLFgtWS9ZM1g2VzhVO1A/SkNIRUZIRUpETkRSRVZHWUpbTlxcUlxcVltYWlpXW1RbUFpNWUtXSVRIUEhNSUtLSk5KUktVTVcgR2RHZUhlSGRHZCBVO1E/TENJRkdJRktFTkVSRlZHWEpbIFJcXFVbV1pZV1pUWlBZTVhLVklUSCIsCisgIklqTlFPT1FOU05VT1ZRVlNVVVNWUVZPVU5UTVFNTk5LUElTSFdIW0leS2BOYVJhV2BbX11dYFpjVmZRaU1rIFdIWkldS19OYFJgV19bXl1cXGBZY1RnUWkgUE9UTyBPUFVQIE5RVlEgTlJWUiBOU1ZTIE9UVVQgUFVUVSBlTGVOZ05nTGVMIGZMZk4gZU1nTSBlVmVYZ1hnVmVWIGZWZlggZVdnVyIsCisgIkRgSD5IZiBJPklmIE0+TWYgUUJTQlNEUURRQVI/VD5XPlk/W0FcXERcXElbTFlOV09VT1NOUkxRTk9RTlJPU1FWUlhTVlVVV1VZVltYXFxbXFxgW2NZZVdmVGZSZVFjUWBTYFNiUWIgUkJSRCBRQ1NDIFk/WkFbRFtJWkxZTiBSTFJOUFFOUlBTUlZSWCBZVlpYW1tbYFpjWWUgUmBSYiBRYVNhIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiQWNIQkhiIElCSWIgW0JbYiBcXEJcXGIgREJgQiBEYk1iIFdiYGIiLAorICJCYUdCUVBGYiBGQlBQIEVCUFEgRUJcXEJeSVtCIEdhXFxhIEZiXFxiXltbYiIsCisgIklbWCtVMVI4UD1PQU5GTU5NVk5eT2NQZ1JsVXNYeSBVMVM2UTxQQE9GTk5OVk9eUGRRaFNuVXMiLAorICJJW0wrTzFSOFQ9VUFWRldOV1ZWXlVjVGdSbE9zTHkgTzFRNlM8VEBVRlZOVlZVXlRkU2hRbk9zIiwKKyAiSVtNK01STXkgTitOUk55IE0rWCsgTXlYeSIsCisgIklbVitWUlZ5IFcrV1JXeSBMK1crIEx5V3kiLAorICJIW1YrUjFQNU86Tz5QQlRKVExTTlJPTVJSVVNWVFhUWlBiT2ZPalBvUnNWeSBULlIyUTVQOlA+UUNSRiBSXlFhUGZQalFvUnJUdiIsCisgIklcXE4rUjFUNVU6VT5UQlBKUExRTlJPV1JSVVFWUFhQWlRiVWZValRvUnNOeSBQLlIyUzVUOlQ+U0NSRiBSXlNhVGZUalNvUnJQdiIsCisgIklbVi5TMVE0TzhOPU5DT0lQTVNYVFxcVWJVZ1RsU29RcyBTMVE1UDhPPU9CUEhRTFRXVVtWYVZnVWxTcFFzTnYiLAorICJJW04uUTFTNFU4Vj1WQ1VJVE1RWFBcXE9iT2dQbFFvU3MgUTFTNVQ4VT1VQlRIU0xQV09bTmFOZ09sUXBTc1Z2IiwKKyAiN1o6UkFSUm8gQFJRbyA/UlJyIFpcIlZKUnIiLAorICJDYV0uXFwuWy9bMFxcMV0xXjBeLl0sWytZK1csVS5UMFMzUjpRSlFqUHNPdiBcXC9cXDBdMF0vXFwvIFI6UmogVS5UMVM6U1pSalFxUHRPdk14S3lJeUd4RnZGdEdzSHNJdEl1SHZHdiBHdEd1SHVIdEd0IiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSFxcUkZKWyBSSUtbSlsgUklZW1pbIFJGWlsgTVVXVSBMVlhWIiwKKyAiSFxcTEZMWyBNR01aIExGVEZXR1hIWUpZTVhPV1BUUSBNR1RHV0hYSlhNV09UUCBNUFRQV1FYUllUWVdYWVdaVFtMWyBNUVRRV1JYVFhXV1lUWk1aIiwKKyAiSF1aS1lJV0dVRlFGT0dNSUxLS05LU0xWTVhPWlFbVVtXWllYWlYgWktZS1hJV0hVR1FHT0hNS0xOTFNNVk9ZUVpVWldZWFhZVlpWIiwKKyAiSF1MRkxbIE1HTVogTEZTRlZHWElZS1pOWlNZVlhYVlpTW0xbIE1HU0dWSFdJWEtZTllTWFZXWFZZU1pNWiIsCisgIklcXE1GTVsgTkdOWiBNRllGIE5HWUdZRiBOUFRQVFEgTlFUUSBOWllaWVsgTVtZWyIsCisgIklbTUZNWyBOR05bTVsgTUZZRiBOR1lHWUYgTlBUUFRRIE5RVFEiLAorICJIXVpLWUlXR1VGUUZPR01JTEtLTktTTFZNWE9aUVtVW1daWVhaVlpSVVIgWktZS1hJV0hVR1FHT0hOSU1LTE5MU01WTlhPWVFaVVpXWVhYWVZZU1VTVVIiLAorICJHXUtGS1sgS0ZMRkxbS1sgWUZYRlhbWVsgWUZZWyBMUFhQIExRWFEiLAorICJOV1JGUltTWyBSRlNGU1siLAorICJKW1ZGVlZVWVNaUVpPWU5WTVYgVkZXRldWVllVWlNbUVtPWk5ZTVYiLAorICJIXUxGTFtNWyBMRk1GTVsgWkZZRk1SIFpGTVMgUE9ZW1pbIFFPWlsiLAorICJJWk1GTVsgTUZORk5aIE5aWVpZWyBNW1lbIiwKKyAiRl5KRkpbIEtLS1tKWyBLS1JbIEpGUlggWkZSWCBZS1JbIFlLWVtaWyBaRlpbIiwKKyAiR11LRktbIExJTFtLWyBMSVlbIEtGWFggWEZYWCBYRllGWVsiLAorICJHXVBGTkdMSUtLSk5KU0tWTFhOWlBbVFtWWlhYWVZaU1pOWUtYSVZHVEZQRiBRR05ITEtLTktTTFZOWVFaU1pWWVhWWVNZTlhLVkhTR1FHIiwKKyAiSFxcTEZMWyBNR01bTFsgTEZVRldHWEhZSllNWE9XUFVRTVEgTUdVR1dIWEpYTVdPVVBNUCIsCisgIkddUEZOR0xJS0tKTkpTS1ZMWE5aUFtUW1ZaWFhZVlpTWk5ZS1hJVkdURlBGIFFHTkhMS0tOS1NMVk5ZUVpTWlZZWFZZU1lOWEtWSFNHUUcgU1hYXVldIFNYVFhZXSIsCisgIkhcXExGTFsgTUdNW0xbIExGVEZXR1hIWUpZTVhPV1BUUU1RIE1HVEdXSFhKWE1XT1RQTVAgUlFYW1lbIFNRWVsiLAorICJIXFxZSVdHVEZQRk1HS0lLS0xNTU5PT1RRVlJXU1hVWFhXWVRaUFpOWU1YS1ggWUlXSVZIVEdQR01ITElMS01NT05UUFZRWFNZVVlYV1pUW1BbTVpLWCIsCisgIkpbUkdSWyBTR1NbUlsgTEZZRllHIExGTEdZRyIsCisgIkddS0ZLVUxYTlpRW1NbVlpYWFlVWUYgS0ZMRkxVTVhOWVFaU1pWWVdYWFVYRllGIiwKKyAiSFxcSkZSWyBKRktGUlggWkZZRlJYIFpGUlsiLAorICJFX0dGTVsgR0ZIRk1YIFJGTVggUklNWyBSSVdbIFJGV1ggXUZcXEZXWCBdRldbIiwKKyAiSFxcS0ZYW1lbIEtGTEZZWyBZRlhGS1sgWUZMW0tbIiwKKyAiSVxcS0ZSUFJbU1sgS0ZMRlNQIFpGWUZSUCBaRlNQU1siLAorICJIXFxYRktbIFlGTFsgS0ZZRiBLRktHWEcgTFpZWllbIEtbWVsiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJFXFxYRlZIVEtRUE9TTFdJWkdbRVtEWkRYRVdGWEVZIFhGV0pVVFRbIFhGVVsgVFtUWVNWUlRQUk5RTFFLUktUTFdPWlJbVltYWiIsCisgIkZeVUdUSFNKUU9PVU5XTFpKWyBUSFNLUVNQVk9YTVpKW0hbR1pHWEhXSVhIWSBPTE5OTU9LT0pOSkxLSk1IT0dSRlhGWkdbSVtLWk1YTlRPUk8gWEZZR1pJWktZTVhOIFRPV1BYUVlTWVZYWVdaVVtTW1JaUlhTVSBUT1ZQV1FYU1hWV1lVWyIsCisgIkhdS0hKSkpMS05OT1FPVU5XTVlLWklaR1lGV0ZUR1FKT01NUUxVTFhNWlBbUltVWldYWFZYVFdSVVJTU1JVIFdGVUdSSlBNTlFNVU1YTlpQWyIsCisgIkZdVUdUSFNKUU9PVU5XTFpKWyBUSFNLUVNQVk9YTVpKW0hbR1pHWEhXSldMWE5aUFtTW1VaV1hZVFpPWkxZSVdHVUZQRk1HS0lKS0pNS05NTk5NT0siLAorICJJXFxXSVZKVkxXTVlNWktaSVlHV0ZURlJHUUhQSlBMUU5TTyBURlJIUUpRTVNPIFNPUU9OUExSS1RLV0xZTVpPW1JbVVpXWFhWWFRXUlVSU1NSVSBRT09QTVJMVExYTVoiLAorICJHXFxXSFZKVE9SVVFXT1pNWyBRTFBOTk9MT0tNS0tMSU5HUUZbRlhHV0hWS1RTU1ZSWFBaTVtLW0laSFlIWElXSlhJWSBTRldHWEcgT1NQUlJRVlFYUFpNWFQiLAorICJHXUpJSUtJTUpPTFBPUFJPVE5XS1hIWEdXRlZGVEdSSVFLUE5QUVFTU1RVVFdTWVFaTyBXRlVHU0lSS1FOUVJTVCBaT1lTV1dVWVNaT1tMW0paSVhJV0pWS1dKWCBZU1dWVVhSWk9bIiwKKyAiRl5MTEtLS0lMR09GUkZPUU1XTFlLWklbR1tGWkZYR1dIWEdZIFJGT09OUkxXS1lJWyBKVEtTTVJWT1hOW0xdSl5IXkddRlxcRlpHWEpXTFVSVFZUWVZbV1tZWltYIFxcRlpIWExWUlVWVVlWWyIsCisgIklZV0hVS1NQUVVQV05aTFsgWUxXTlRPUU9PTk5MTkpPSFFHVUZZRldIVkpUUFJWUVhPWkxbSltJWklYSldLWEpZIiwKKyAiSVpZRldIVUtTUFBZTl0gWU1XT1RQUVBPT05NTktPSVFHVUZZRldJVktTVFFYUFpOXU1eS19KXkpcXEtaTVhPV1JWVlUiLAorICJGXkxMS0tLSU1HUEZSRk9RTVdMWUtaSVtHW0ZaRlhHV0hYR1kgUkZPT05STFdLWUlbIFpHV0tVTVNOUE8gXUdcXEhdSV5IXkddRlxcRlpHV0xWTVROUE8gUE9TUFRSVVlWWyBQT1JQU1JUWVZbV1tZWltYIiwKKyAiSVtNSUxLTE1NT09QUlBVT1dOWktbSFtHWkZZRldHVkhUS1BVT1dNWktbIFZIVExSU1FWUFhOWktbSVtIWkhYSVdLV01YUFpSW1VbV1pZWCIsCisgIkRgUkZOT0tVSVhHWkVbQ1tCWkJYQ1dEWENZIFJGUE1PUU5WTlpQWyBSRlFKUE9PVk9aUFsgW0ZXT1JYUFsgW0ZZTVhRV1ZXWllbWltcXFpeWCBbRlpKWU9YVlhaWVsiLAorICJHXlJGUUpPUE1VTFdKWkhbRltFWkVYRldHWEZZIFJGUktTVlRbIFJGU0tUVlRbIGBHX0hgSWFIYUdgRl5GXFxHWkpZTFdRVVdUWyIsCisgIkhdU0ZRR09JTUxMTktSS1ZMWU1aT1tRW1RaVlhYVVlTWk9aS1lIWEdXR1VIU0pRTlBTUFYgUUdPSk1OTFJMVk1ZT1siLAorICJGXVVHVEhTSlFPT1VOV0xaSlsgVEhTS1FTUFZPWE1aSltIW0daR1hIV0lYSFkgT0xOTk1PS09KTkpMS0pNSE9HUkZWRllHWkhbSltNWk9ZUFZRVFFSUCBWRlhHWUhaSlpNWU9YUFZRIiwKKyAiSF1VSlVMVE5TT1FQT1BOTk5MT0lRR1RGV0ZZR1pJWk1ZUFdTU1dQWU5aS1tJW0haSFhJV0tXTVhQWlNbVltYWlpYIFdGWEdZSVlNWFBWU1NWT1lLWyIsCisgIkZeVUdUSFNKUU9PVU5XTFpKWyBUSFNLUVNQVk9YTVpKW0hbR1pHWEhXSVhIWSBPTE5OTU9LT0pOSkxLSk1IT0dSRldGWkdbSVtLWk1ZTlZPUk8gV0ZZR1pJWktZTVhOVk8gUk9VUFZSV1lYWyBST1RQVVJWWVhbWVtbWl1YIiwKKyAiSFxcTklNS01NTk9QUFNQVk9YTltLXFxIXFxHW0ZaRlhHV0hWSlVNU1RSV1BaTlsgVkpVTlRVU1hRWk5bS1tJWkhYSFdJVkpXSVgiLAorICJJW1lIWEpWT1RVU1dRWk9bIFNMUk5QT05PTU1NS05JUEdTRlxcRlpHWUhYS1ZTVVZUWFJaT1tNW0taSllKWEtXTFhLWSBVRllHWkciLAorICJHXUhKSkdMRk1GT0hPS05OS1ZLWUxbIE1GTkhOS0tTSlZKWUxbTltQWlNXVVRWUiBaRlZSVVZVWVdbWFtaWlxcWCBbRldSVlZWWVdbIiwKKyAiR1xcSEpKR0xGTUZPSE9LTk9MVkxZTVsgTUZOSE5LTFJLVktZTVtOW1FaVFdWVFhQWU1aSVpHWUZYRldHVklWTFdOWVBbUV1RIiwKKyAiRl1JTEhMR0tHSUhHSkZORk1ITExLVUpbIExMTFVLWyBWRlRIUkxPVU1ZS1sgVkZVSFRMU1VSWyBUTFRVU1sgYEZeR1xcSVpMV1VVWVNbIiwKKyAiSFxcUEtPTE1MTEtMSU1HT0ZRRlNHVElUTFNQUVVPWE1aSltIW0daR1hIV0lYSFkgUUZSR1NJU0xSUFBVTlhMWkpbIF1HXFxIXUleSF5HXUZbRllHV0lVTFNQUlVSWFNaVFtVW1daWVgiLAorICJHXUpKTEdORk9GUUdRSU9PT1JQVCBPRlBHUElOT05SUFRSVFVTV1FZTlpMIFxcRlpMV1RVWCBdRltMWVFXVVVYU1pQW0xbSlpJWElXSlZLV0pYIiwKKyAiR1xcWkhZSldPVlJVVFNXUVlPWkxbIFNMUk5QT05PTU1NS05JUEdTRl1GW0daSFlLWE9WVVRYUVpMW0hbR1pHWEhXSldMWE9aUVtUW1daWVggVkZaR1tHIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSFxcV01XW1hbIFdNWE1YWyBXUFVOU01QTU5OTFBLU0tVTFhOWlBbU1tVWldYIFdQU05QTk5PTVBMU0xVTVhOWVBaU1pXWCIsCisgIkhcXExGTFtNWyBMRk1GTVsgTVBPTlFNVE1WTlhQWVNZVVhYVlpUW1FbT1pNWCBNUFFOVE5WT1dQWFNYVVdYVllUWlFaTVgiLAorICJJW1hQVk5UTVFNT05NUExTTFVNWE9aUVtUW1ZaWFggWFBXUVZPVE5RTk9PTlBNU01VTlhPWVFaVFpWWVdXWFgiLAorICJIXFxXRldbWFsgV0ZYRlhbIFdQVU5TTVBNTk5MUEtTS1VMWE5aUFtTW1VaV1ggV1BTTlBOTk9NUExTTFVNWE5ZUFpTWldYIiwKKyAiSVtNVFhUWFFXT1ZOVE1RTU9OTVBMU0xVTVhPWlFbVFtWWlhYIE1TV1NXUVZPVE5RTk9PTlBNU01VTlhPWVFaVFpWWVdXWFgiLAorICJMWldGVUZTR1JKUltTWyBXRldHVUdTSCBUR1NKU1sgT01WTVZOIE9NT05WTiIsCisgIkhcXFhNV01XXFxWX1VgU2FRYU9gTl9MXyBYTVhcXFdfVWFTYlBiTmFMXyBXUFVOU01QTU5OTFBLU0tVTFhOWlBbU1tVWldYIFdQU05QTk5PTVBMU0xVTVhOWVBaU1pXWCIsCisgIkhcXExGTFtNWyBMRk1GTVsgTVFQTlJNVU1XTlhRWFsgTVFQT1JOVE5WT1dRV1tYWyIsCisgIk5XUkZRR1FIUklTSVRIVEdTRlJGIFJHUkhTSFNHUkcgUk1SW1NbIFJNU01TWyIsCisgIk5XUkZRR1FIUklTSVRIVEdTRlJGIFJHUkhTSFNHUkcgUk1SYlNiIFJNU01TYiIsCisgIkhbTEZMW01bIExGTUZNWyBYTVdNTVcgWE1NWCBQVFZbWFsgUVNYWyIsCisgIk5XUkZSW1NbIFJGU0ZTWyIsCisgIkNiR01HW0hbIEdNSE1IWyBIUUtOTU1QTVJOU1FTWyBIUUtPTU5PTlFPUlFSW1NbIFNRVk5YTVtNXU5eUV5bIFNRVk9YTlpOXFxPXVFdW15bIiwKKyAiSFxcTE1MW01bIExNTU1NWyBNUVBOUk1VTVdOWFFYWyBNUVBPUk5UTlZPV1FXW1hbIiwKKyAiSVxcUU1PTk1QTFNMVU1YT1pRW1RbVlpYWFlVWVNYUFZOVE1RTSBRTk9PTlBNU01VTlhPWVFaVFpWWVdYWFVYU1dQVk9UTlFOIiwKKyAiSFxcTE1MYk1iIExNTU1NYiBNUE9OUU1UTVZOWFBZU1lVWFhWWlRbUVtPWk1YIE1QUU5UTlZPV1BYU1hVV1hWWVRaUVpNWCIsCisgIkhcXFdNV2JYYiBXTVhNWGIgV1BVTlNNUE1OTkxQS1NLVUxYTlpQW1NbVVpXWCBXUFNOUE5OT01QTFNMVU1YTllQWlNaV1giLAorICJLWU9NT1tQWyBPTVBNUFsgUFNRUFNOVU1YTSBQU1FRU09VTlhOWE0iLAorICJKW1hQV05UTVFNTk5NUE5SUFNVVVdWIFZVV1dXWFZaIFdZVFpRWk5ZIE9aTlhNWCBYUFdQVk4gV09UTlFOTk8gT05OUE9SIE5RUFJVVFdVWFdYWFdaVFtRW05aTVgiLAorICJNWFJGUltTWyBSRlNGU1sgT01WTVZOIE9NT05WTiIsCisgIkhcXExNTFdNWk9bUltUWldXIExNTU1NV05ZUFpSWlRZV1cgV01XW1hbIFdNWE1YWyIsCisgIkpaTE1SWyBMTU1NUlkgWE1XTVJZIFhNUlsiLAorICJGXklNTlsgSU1KTU5YIFJNTlggUlBOWyBSUFZbIFJNVlggW01aTVZYIFtNVlsiLAorICJJW0xNV1tYWyBMTU1NWFsgWE1XTUxbIFhNTVtMWyIsCisgIkpaTE1SWyBMTU1NUlkgWE1XTVJZTmIgWE1SW09iTmIiLAorICJJW1ZOTFsgWE1OWiBMTVhNIExNTE5WTiBOWlhaWFsgTFtYWyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIktbVVVUU1JSUFJOU01UTFZMWE1aT1tRW1NaVFggUFJOVE1WTVlPWyBWUlRYVFpWW1haWVlbViBXUlVYVVpWWyIsCisgIkxaTFZOU1BPIFNGTVhNWk9bUFtSWlRYVVVVUlZWV1dYV1pWIFRGTlhOWk9bIiwKKyAiTFhUU1NUVFRUU1NSUVJPU05UTVZNWE5aUFtTW1ZZWFYgUVJPVE5WTllQWyIsCisgIktbVVVUU1JSUFJOU01UTFZMWE1aT1tRW1NaVFggUFJOVE1WTVlPWyBaRlRYVFpWW1haWVlbViBbRlVYVVpWWyIsCisgIkxYT1lRWFJXU1VTU1JSUVJPU05UTVZNWE5aUFtTW1ZZWFYgUVJPVE5WTllQWyIsCisgIk9YUlJVT1dMWElYR1dGVUdUSUtkS2ZMZ05mT2NQWlFbU1tVWlZZWFYgVElTTlJST1tNYEtkIiwKKyAiS1tVVVRTUlJQUk5TTVRMVkxYTVpPW1FbU1pUWCBQUk5UTVZNWU9bIFZSUGQgV1JUW1JgUGRPZk1nTGZMZE1hT19SXVZbWVlbViIsCisgIkxbTFZOU1BPIFNGTFsgVEZNWyBPVVFTU1JUUlZTVlVVWFVaVlsgVFJVU1VVVFhUWlZbWFpZWVtWIiwKKyAiTlZTTFJNU05UTVNMIFFST1hPWlFbU1pUWVZWIFJSUFhQWlFbIiwKKyAiTlZTTFJNU05UTVNMIFFSS2QgUlJPW01gS2RKZkhnR2ZHZEhhSl9NXVFbVFlWViIsCisgIkxaTFZOU1BPIFNGTFsgVEZNWyBVUlVTVlNVUlRSUlRPVSBPVVJWU1pUWyBPVVFWUlpUW1VbWFlaViIsCisgIk5WTlZQU1JPIFVGT1hPWlFbU1pUWVZWIFZGUFhQWlFbIiwKKyAiRV5FVkdTSVJLU0tVSVsgSVJKU0pVSFsgS1VNU09SUFJSU1JVUFsgUFJRU1FVT1sgUlVUU1ZSV1JZU1lVWFhYWllbIFdSWFNYVVdYV1pZW1taXFxZXlYiLAorICJJW0lWS1NNUk9TT1VNWyBNUk5TTlVMWyBPVVFTU1JUUlZTVlVVWFVaVlsgVFJVU1VVVFhUWlZbWFpZWVtWIiwKKyAiS1lSUlBSTlNNVExWTFhNWk9bUVtTWlRZVVdVVVRTUlJRU1FVUldUWFZYWFdZViBQUk5UTVZNWU9bIiwKKyAiTFtMVk5TUE8gUUxIZyBSTElnIE9VUVNTUlRSVlNWVVVYVVpWWyBUUlVTVVVUWFRaVltYWllZW1YiLAorICJLW1VVVFNSUlBSTlNNVExWTFhNWk9bUVtTWiBQUk5UTVZNWU9bIFZSUGRQZlFnU2ZUY1RbVltZWVtWIFdSVFtSYFBkIiwKKyAiTFpMVk5TUFJSU1JVUFsgUFJRU1FVT1sgUlVUU1ZSV1JWVSBWUlZVV1dYV1pWIiwKKyAiTlpOVlBTUVFRU1RVVVdVWVRaUlsgUVNTVVRXVFlSWyBOWlBbVVtYWVpWIiwKKyAiTlZOVlBTUk8gVUZPWE9aUVtTWlRZVlYgVkZQWFBaUVsgUE5WTiIsCisgIktbTlJMWExaTltPW1FaU1hVVSBPUk1YTVpOWyBWUlRYVFpWW1haWVlbViBXUlVYVVpWWyIsCisgIktaTlJNVExXTFpOW09bUlpUWFVVVVIgT1JOVE1XTVpOWyBVUlZWV1dYV1pWIiwKKyAiSF1MUkpUSVdJWktbTFtOWlBYIE1SS1RKV0paS1sgUlJQWFBaUltTW1VaV1hYVVhSIFNSUVhRWlJbIFhSWVZaV1tXXVYiLAorICJKWkpWTFNOUlBSUVNRVVBYT1pNW0xbS1pLWUxZS1ogV1NWVFdUV1NWUlVSU1NSVVFYUVpSW1VbWFlaViBRU1JVIFNTUVUgUFhRWiBRWE9aIiwKKyAiS1tOUkxYTFpOW09bUVpTWFVVIE9STVhNWk5bIFZSUGQgV1JUW1JgUGRPZk1nTGZMZE1hT19SXVZbWVlbViIsCisgIkxZTFZOU1BSUlJUU1RWU1hQWk5bIFJSU1NTVlJYUFogTltQXFxRXlFhUGROZkxnS2ZLZExhT15SXFxWWVlWIE5bT1xcUF5QYU9kTmYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJOViIsCisgIkpaIiwKKyAiSFxcUUZOR0xKS09LUkxXTlpRW1NbVlpYV1lSWU9YSlZHU0ZRRiBPR01KTE9MUk1XT1ogTllRWlNaVlkgVVpXV1hSWE9XSlVHIFZIU0dRR05IIiwKKyAiSFxcTkpQSVNGU1sgTkpOS1BKUkhSW1NbIiwKKyAiSFxcTEtMSk1ITkdQRlRGVkdXSFhKWExXTlVRTFsgTEtNS01KTkhQR1RHVkhXSldMVk5UUUtbIExaWVpZWyBLW1lbIiwKKyAiSFxcTUZYRlFPIE1GTUdXRyBXRlBPIFFOU05WT1hRWVRZVVhYVlpTW1BbTVpMWUtXTFcgUE9TT1ZQWFMgVE9XUVhUWFVXWFRaIFhWVllTWlBaTVlMVyBPWkxYIiwKKyAiSFxcVUlVW1ZbIFZGVlsgVkZLVlpWIFVJTFYgTFVaVVpWIiwKKyAiSFxcTUZMTyBOR01OIE1GV0ZXRyBOR1dHIE1OUE1TTVZOWFBZU1lVWFhWWlNbUFtNWkxZS1dMVyBMT01PT05TTlZPWFIgVE5XUFhTWFVXWFRaIFhWVllTWlBaTVlMVyBPWkxYIiwKKyAiSFxcVkdXSVhJV0dURlJGT0dNSkxPTFRNWE9aUltTW1ZaWFhZVVlUWFFWT1NOUk5PT01RIFdIVEdSR09IIFBHTkpNT01UTlhRWiBNVk9ZUlpTWlZZWFYgVFpXWFhVWFRXUVRPIFhTVlBTT1JPT1BNUyBRT05RTVQiLAorICJIXFxLRllGT1sgS0ZLR1hHIFhGTltPWyIsCisgIkhcXFBGTUdMSUxLTU1OTlBPVFBWUVdSWFRYV1dZVFpQWk1ZTFdMVE1STlFQUFRPVk5XTVhLWElXR1RGUEYgTkdNSU1LTk1QTlRPVlBYUllUWVdYWVdaVFtQW01aTFlLV0tUTFJOUFBPVE5WTVdLV0lWRyBXSFRHUEdNSCBMWE9aIFVaWFgiLAorICJIXFxXUFVSUlNRU05STFBLTUtMTElOR1FGUkZVR1dJWE1YUldXVVpSW1BbTVpMWE1YTlogV01WUFNSIFdOVVFSUlFSTlFMTiBQUk1QTE1MTE1JUEcgTEtOSFFHUkdVSFdLIFNHVklXTVdSVldUWiBVWVJaUFpNWSIsCisgIk1YUlhRWVFaUltTW1RaVFlTWFJYIFJZUlpTWlNZUlkiLAorICJNWFRaU1tSW1FaUVlSWFNYVFlUXFxTXlFfIFJZUlpTWlNZUlkgU1tUXFwgVFpTXiIsCisgIk1YUk1RTlFPUlBTUFRPVE5TTVJNIFJOUk9TT1NOUk4gUlhRWVFaUltTW1RaVFlTWFJYIFJZUlpTWlNZUlkiLAorICJNWFJNUU5RT1JQU1BUT1ROU01STSBSTlJPU09TTlJOIFRaU1tSW1FaUVlSWFNYVFlUXFxTXlFfIFJZUlpTWlNZUlkgU1tUXFwgVFpTXiIsCisgIk1YUkZSVFNUIFJGU0ZTVCBSWFFZUVpSW1NbVFpUWVNYUlggUllSWlNaU1lSWSIsCisgIklcXExLTEpNSE5HUUZURldHWEhZSllMWE5XT1VQUlEgTEtNS01KTkhRR1RHV0hYSlhMV05VT1JQIE1JUEcgVUdYSSBYTVRQIFJQUlRTVFNQIFJYUVlRWlJbU1tUWlRZU1hSWCBSWVJaU1pTWVJZIiwKKyAiTVhURlJHUUlRTFJNU01UTFRLU0pSSlFLIFJLUkxTTFNLUksgUkdRSyBRSVJKIiwKKyAiTVhUSFNJUklRSFFHUkZTRlRHVEpTTFFNIFJHUkhTSFNHUkcgU0lUSiBUSFNMIiwKKyAiRl9cXE1aTVhOV1BVVlRYU1lRWk1aS1lKV0pVS1NMUlFPU01US1RJU0dRRlBGTkdNSU1LTk5QUVVXWFpaW1xcWyBcXE1cXE5aTldQIFpNWFBWVlVYU1pRW01bS1pKWUlXSVVKU0xRUU5STVNLU0lSRyBTSFFHUEdOSCBPR05JTktPTlFRVldYWVpaXFxaXFxbIiwKKyAiSVxcUkJSX1NfIFJCU0JTXyBXSVlJV0dURlFGTkdMSUxLTU1OTlZSV1NYVVhXV1lUWlFaT1lOWCBXSVZIVEdRR05ITUlNS05NVlFYU1lVWVdYWVdaVFtRW05aTFhOWCBYWFVaIiwKKyAiR15bQkliSmIgW0JcXEJKYiIsCisgIktZVUJTRFFHT0tOUE5UT1lRXVNgVWJWYiBVQlZCVERSR1BLT1BPVFBZUl1UYFZiIiwKKyAiS1lOQlBEUkdUS1VQVVRUWVJdUGBOYk9iIE5CT0JRRFNHVUtWUFZUVVlTXVFgT2IiLAorICJKWlJGUUdTUVJSIFJGUlIgUkZTR1FRUlIgTUlOSVZPV08gTUlXTyBNSU1KV05XTyBXSVZJTk9NTyBXSU1PIFdJV0pNTk1PIiwKKyAiRl9KUVtRW1IgSlFKUltSIiwKKyAiRl9SSVJaU1ogUklTSVNaIEpRW1FbUiBKUUpSW1IiLAorICJGX0pNW01bTiBKTUpOW04gSlVbVVtWIEpVSlZbViIsCisgIk5XU0ZSR1JNIFNHUk0gU0ZUR1JNIiwKKyAiSVtORk1HTU0gTkdNTSBORk9HTU0gV0ZWR1ZNIFdHVk0gV0ZYR1ZNIiwKKyAiS1lRRk9HTklOS09NUU5TTlVNVktWSVVHU0ZRRiBRRk5JT01TTlZLVUdRRiBTRk9HTktRTlVNVklTRiIsCisgIkZeWklKUlpbIFpJWkpMUlpaWlsiLAorICJGXkpJWlJKWyBKSUpKWFJKWkpbIiwKKyAiR15PRk9iUGIgT0ZQRlBiIFVGVWJWYiBVRlZGVmIgSlBbUFtRIEpQSlFbUSBKV1tXW1ggSldKWFtYIiwKKyAiRl5bRllHVkhTSFBHTkZMRkpHSUlJS0tNTU1PTFBKUEhORiBbRkhbSVsgW0ZcXEZJWyBZVFdUVVVUV1RZVltYW1paW1hbVllUIE5GSkdJS01NUEpORiBMRklJS01PTFBITEYgWVRVVVRZWFtbWFlUIFdUVFdWW1paW1ZXVCIsCisgIkVgV01US1FLT0xOTU1PTVJOVE9VUVZUVldUIFdNVExRTE9NTk9OUk9UUVVUVVdUIFZLVlNXVVlWWlZcXFVdU11PXFxMW0pZSFdHVEZRRk5HTEhKSklMSE9IUklVSldMWU5aUVtVW1laIFZLV0tXU1hVWlYgWVZbVVxcU1xcT1tMWkpZSVdIVEdRR05ITElLSkpMSU9JUkpVS1dMWE5ZUVpVWllZWVoiLAorICJFX0pQTE9OT1BQU1RUVVZWWFZaVVtTW1FaT1hOVk5UT1NQUFROVUxVSlQgWlBYT1ZPVFBRVFBVTlZMVkpVSVNJUUpPTE5OTlBPUVBUVFZVWFVaVCBLT0pRSlNLVSBZVVpTWlFZTyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIk5WIiwKKyAiSloiLAorICJIXVRGUUdPSU1MTE9LU0tWTFlNWk9bUVtUWlZYWFVZUlpOWktZSFhHVkZURiBURlJHUElOTE1PTFNMVk1ZT1sgUVtTWlVYV1VYUllOWUtYSFZGIiwKKyAiSF1USk9bIFZGUFsgVkZTSVBLTkwgVUlRS05MIiwKKyAiSF1PSlBLT0xOS05KT0hQR1NGVkZZR1pJWktZTVdPVFFQU01VS1dJWyBWRlhHWUlZS1hNVk9QUyBKWUtYTVhSWlVaV1lYVyBNWFJbVVtXWlhXIiwKKyAiSF1PSlBLT0xOS05KT0hQR1NGVkZZR1pJWktZTVZPU1AgVkZYR1lJWUtYTVZPIFFQU1BWUVdSWFRYV1dZVlpTW09bTFpLWUpXSlZLVUxWS1cgU1BVUVZSV1RXV1ZZVVpTWyIsCisgIkhdWEdSWyBZRlNbIFlGSlVaVSIsCisgIkhdUUZMUCBRRltGIFFHVkdbRiBMUE1PUE5TTlZPV1BYUlhVV1hVWlJbT1tMWktZSldKVktVTFZLVyBTTlVPVlBXUldVVlhUWlJbIiwKKyAiSF1ZSVhKWUtaSlpJWUdXRlRGUUdPSU1MTE9LU0tXTFlNWk9bUltVWldYWFZYU1dRVlBUT1FPT1BNUkxUIFRGUkdQSU5MTU9MU0xYTVogUltUWlZYV1ZXUlZQIiwKKyAiSF1ORkxMIFtGWklYTFNSUVVQV09bIFhMUlJQVU9XTlsgTUlQRlJGV0kgTkhQR1JHV0lZSVpIW0YiLAorICJIXVNGUEdPSE5KTk1PT1FQVFBYT1lOWkxaSVlHVkZTRiBTRlFHUEhPSk9NUE9RUCBUUFdPWE5ZTFlJWEdWRiBRUE1RS1NKVUpYS1pOW1JbVlpXWVhXWFRXUlZRVFAgUVBOUUxTS1VLWExaTlsgUltVWlZZV1dXU1ZRIiwKKyAiSF1ZTVhPVlFUUlFST1FOUE1OTUtOSVBHU0ZWRlhHWUhaSlpOWVJYVVZYVFpRW05bTFpLWEtXTFZNV0xYIE9RTk9OS09JUUdTRiBYR1lJWU5YUldVVVhTWlFbIiwKKyAiTVhQWU9aUFtRWlBZIiwKKyAiTVhQW09aUFlRWlFbUF1OXyIsCisgIk1YU01STlNPVE5TTSBQWU9aUFtRWiIsCisgIk1YU01STlNPVE5TTSBQW09aUFlRWlFbUF1OXyIsCisgIk1YVUZUR1JTIFVHUlMgVUZWR1JTIFBZT1pQW1FaUFkiLAorICJIXU9KUEtPTE5LTkpPSFBHU0ZXRlpHW0lbS1pNWU5TUFFRUVNSVFRUIFdGWUdaSVpLWU1YTlZPIFBZT1pQW1FaUFkiLAorICJNWFZGVEhTSlNLVExVS1RKIiwKKyAiTVhVSFRHVUZWR1ZIVUpTTCIsCisgIkVfXFxOW09cXFBdT11OXFxNW01ZTldQUlhQWk5bS1tIWkdYR1ZIVElTS1JQUFJPVE1VS1VJVEdSRlBHT0lPTFBSUVVTWFVaV1tZW1pZWlggS1tJWkhYSFZJVEpTUFAgT0xQUVFUU1dVWVdaWVpaWSIsCisgIkhdVEJMXyBZQlFfIFpKWUtaTFtLW0paSFlHVkZSRk9HTUlNS05NT05WUlhUIE1LT01WUVdSWFRYV1dZVlpTW09bTFpLWUpXSlZLVUxWS1ciLAorICJHXV9CRWIiLAorICJLWlpCVkVTSFFLT09OVE5YT11QYFFiIFZFU0lRTVBQT1VPWlBfUWIiLAorICJKWVNCVERVR1ZMVlBVVVNZUVxcTl9KYiBTQlRFVUpVT1RUU1dRW05fIiwKKyAiSltURlRSIE9JWU8gWUlPTyIsCisgIkVfSVJbUiIsCisgIkVfUklSWyBJUltSIiwKKyAiRV9JT1tPIElVW1UiLAorICJOV1VGU00gVkZTTSIsCisgIklbUEZOTSBRRk5NIFlGV00gWkZXTSIsCisgIktaU0ZRR1BJUEtRTVNOVU5XTVhLWElXR1VGU0YiLAorICJGXlpJSlJaWyIsCisgIkZeSklaUkpbIiwKKyAiSF1TRkxiIFlGUmIgTFFaUSBLV1lXIiwKKyAiRV9eRlxcR1hIVUhRR09GTUZLR0pJSktMTU5NUExRSlFIT0YgXkZGWyBYVFZUVFVTV1NZVVtXW1laWlhaVlhUIiwKKyAiRWBXTlZMVEtRS09MTk1NUE1TTlVQVlNWVVVWUyBRS09NTlBOU09VUFYgV0tWU1ZVWFZaVlxcVF1RXU9cXExbSllIV0dURlFGTkdMSEpKSUxIT0hSSVVKV0xZTlpRW1RbV1pZWVpYIFhLV1NXVVhWIiwKKyAiRl9cXFNbVVlWV1ZVVVRUUVBQT05OTE5KT0lRSVNKVUxWTlZQVVFUVFBVT1dOWU5bT1xcUVxcUyIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIkhcXFJGS1sgUkZZWyBSSVhbIE1VVlUgSVtPWyBVW1tbIiwKKyAiR11MRkxbIE1GTVsgSUZZRllMWEYgTVBVUFhRWVJaVFpXWVlYWlVbSVsgVVBXUVhSWVRZV1hZV1pVWyIsCisgIkddTEZMWyBNRk1bIElGVUZYR1lIWkpaTFlOWE9VUCBVRldHWEhZSllMWE5XT1VQIE1QVVBYUVlSWlRaV1lZWFpVW0lbIFVQV1FYUllUWVdYWVdaVVsiLAorICJJW05GTlsgT0ZPWyBLRlpGWkxZRiBLW1JbIiwKKyAiRl5ORk5MTVRMWEtaSlsgWEZYWyBZRllbIEtGXFxGIEdbXFxbIEdbR2IgSFtHYiBbW1xcYiBcXFtcXGIiLAorICJHXFxMRkxbIE1GTVsgU0xTVCBJRllGWUxYRiBNUFNQIElbWVtZVVhbIiwKKyAiQ2JSRlJbIFNGU1sgT0ZWRiBHR0hIR0lGSEZHR0ZIRklHSklLTUxPTlBXUFlPWk1bSVxcR11GXkZfR19IXkldSF5HIE5QTFFLU0pYSVpIWyBOUE1RTFNLWEpaSVtHW0ZaRVggV1BZUVpTW1hcXFpdWyBXUFhRWVNaWFtaXFxbXltfWmBYIE9bVlsiLAorICJIXFxMSUtGS0xMSU5HUEZURldHWElYTFdOVE9RTyBURlZHV0lXTFZOVE8gVE9WUFhSWVRZV1hZV1pUW09bTVpMWUtXS1ZMVU1WTFcgV1FYVFhXV1lWWlRbIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGT0YgVUZcXEYgWEhMWSBIW09bIFVbXFxbIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGT0YgVUZcXEYgWEhMWSBIW09bIFVbXFxbIE5ATj9NP01ATkJQQ1RDVkJXQCIsCisgIkZeS0ZLWyBMRkxbIEhGT0YgTFBTUFVPVk1XSVhHWUZaRltHW0haSVlIWkcgU1BVUVZTV1hYWllbIFNQVFFVU1ZYV1pYW1pbW1pcXFggSFtPWyIsCisgIkVeTUZNTExUS1hKWklbSFtHWkdZSFhJWUhaIFhGWFsgWUZZWyBKRlxcRiBVW1xcWyIsCisgIkZfS0ZLWyBMRlJYIEtGUlsgWUZSWyBZRllbIFpGWlsgSEZMRiBZRl1GIEhbTlsgVltdWyIsCisgIkZeS0ZLWyBMRkxbIFhGWFsgWUZZWyBIRk9GIFVGXFxGIExQWFAgSFtPWyBVW1xcWyIsCisgIkddUUZOR0xJS0tKT0pSS1ZMWE5aUVtTW1ZaWFhZVlpSWk9ZS1hJVkdTRlFGIFFGT0dNSUxLS09LUkxWTVhPWlFbIFNbVVpXWFhWWVJZT1hLV0lVR1NGIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGXFxGIEhbT1sgVVtcXFsiLAorICJHXUxGTFsgTUZNWyBJRlVGWEdZSFpKWk1ZT1hQVVFNUSBVRldHWEhZSllNWE9XUFVRIElbUFsiLAorICJHXFxYSVlMWUZYSVZHU0ZRRk5HTElLS0pOSlNLVkxYTlpRW1NbVlpYWFlWIFFGT0dNSUxLS05LU0xWTVhPWlFbIiwKKyAiSVxcUkZSWyBTRlNbIExGS0xLRlpGWkxZRiBPW1ZbIiwKKyAiSF1LRlJWIExGU1YgWkZTVlFZUFpOW01bTFpMWU1YTllNWiBJRk9GIFZGXFxGIiwKKyAiRl9SRlJbIFNGU1sgT0ZWRiBQSUxKSkxJT0lSSlVMV1BYVVhZV1tVXFxSXFxPW0xZSlVJUEkgUElNSktMSk9KUktVTVdQWCBVWFhXWlVbUltPWkxYSlVJIE9bVlsiLAorICJIXFxLRlhbIExGWVsgWUZLWyBJRk9GIFVGW0YgSVtPWyBVW1tbIiwKKyAiRl5LRktbIExGTFsgWEZYWyBZRllbIEhGT0YgVUZcXEYgSFtcXFsgW1tcXGIgXFxbXFxiIiwKKyAiRl1LRktRTFNPVFJUVVNXUSBMRkxRTVNPVCBXRldbIFhGWFsgSEZPRiBURltGIFRbW1siLAorICJCY0dGR1sgSEZIWyBSRlJbIFNGU1sgXUZdWyBeRl5bIERGS0YgT0ZWRiBaRmFGIERbYVsiLAorICJCY0dGR1sgSEZIWyBSRlJbIFNGU1sgXUZdWyBeRl5bIERGS0YgT0ZWRiBaRmFGIERbYVsgYFthYiBhW2FiIiwKKyAiRmBQRlBbIFFGUVsgSUZITEhGVEYgUVBYUFtRXFxSXVRdV1xcWVtaWFtNWyBYUFpRW1JcXFRcXFdbWVpaWFsiLAorICJDYUhGSFsgSUZJWyBFRkxGIElQUFBTUVRSVVRVV1RZU1pQW0VbIFBQUlFTUlRUVFdTWVJaUFsgW0ZbWyBcXEZcXFsgWEZfRiBYW19bIiwKKyAiSF1NRk1bIE5GTlsgSkZRRiBOUFVQWFFZUlpUWldZWVhaVVtKWyBVUFdRWFJZVFlXWFlXWlVbIiwKKyAiSF1MSUtGS0xMSU5HUUZTRlZHWElZS1pOWlNZVlhYVlpTW1BbTVpMWUtXS1ZMVU1WTFcgU0ZVR1dJWEtZTllTWFZXWFVaU1sgUFBZUCIsCisgIkNiSEZIWyBJRklbIEVGTEYgRVtMWyBWRlNHUUlQS09PT1JQVlFYU1pWW1hbW1pdWF5WX1JfT15LXUlbR1hGVkYgVkZUR1JJUUtQT1BSUVZSWFRaVlsgWFtaWlxcWF1WXlJeT11LXFxJWkdYRiBJUE9QIiwKKyAiR11XRldbIFhGWFsgW0ZPRkxHS0hKSkpMS05MT09QV1AgT0ZNR0xIS0pLTExOTU9PUCBSUFBRT1JMWUtaSlpJWSBQUU9TTVpMW0pbSVlJWCBUW1tbIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSV1OT05QTVBNT05OUE1UTVZOV09YUVhYWVpaWyBXT1dYWFpaW1tbIFdRVlJQU01UTFZMWE1aUFtTW1VaV1ggUFNOVE1WTVhOWlBbIiwKKyAiSFxcWEZXR1FJTktMTktRS1VMWE5aUVtTW1ZaWFhZVVlTWFBWTlNNUU1OTkxQS1MgWEZXSFVJUUpOTExOIFFNT05NUExTTFVNWE9aUVsgU1tVWldYWFVYU1dQVU5TTSIsCisgIkhcXE1NTVsgTk1OWyBKTVVNWE5ZUFlRWFNVVCBVTVdOWFBYUVdTVVQgTlRVVFhVWVdZWFhaVVtKWyBVVFdVWFdYWFdaVVsiLAorICJIWk1NTVsgTk1OWyBKTVhNWFJXTSBKW1FbIiwKKyAiRl1OTU5RTVdMWktbIFdNV1sgWE1YWyBLTVtNIElbSGBIW1tbW2BaWyIsCisgIkhbTFNYU1hRV09WTlRNUU1OTkxQS1NLVUxYTlpRW1NbVlpYWCBXU1dQVk4gUU1PTk1QTFNMVU1YT1pRWyIsCisgIkVgUk1SWyBTTVNbIE9NVk0gSk5JT0hOSU1KTUtOTVJOU1BUVVRXU1hSWk5bTVxcTV1OXFxPW04gUFROVU1WS1pKWyBQVE5WTFpLW0lbSFpHWCBVVFdVWFZaWltbIFVUV1ZZWlpbXFxbXVpeWCBPW1ZbIiwKKyAiSVtNT0xNTFFNT05OUE1UTVdOWFBYUVdTVFQgVE1WTldQV1FWU1RUIFFUVFRXVVhXWFhXWlRbUFtNWkxYTFdNVk5XTVggVFRWVVdXV1hWWlRbIiwKKyAiR11MTUxbIE1NTVsgV01XWyBYTVhbIElNUE0gVE1bTSBJW1BbIFRbW1sgV05NWiIsCisgIkddTE1MWyBNTU1bIFdNV1sgWE1YWyBJTVBNIFRNW00gSVtQWyBUW1tbIFdOTVogT0dPRk5GTkdPSVFKU0pVSVZHIiwKKyAiSFxcTU1NWyBOTU5bIEpNUU0gTlRQVFNTVFJWTldNWE1ZTlhPV04gUFRTVVRWVlpXWyBQVFJVU1ZVWlZbWFtZWlpYIEpbUVsiLAorICJHXU5NTlFNV0xaS1tKW0laSllLWiBXTVdbIFhNWFsgS01bTSBUW1tbIiwKKyAiR15MTUxbIExNUlsgTU1SWSBYTVJbIFhNWFsgWU1ZWyBJTU1NIFhNXFxNIElbT1sgVVtcXFsiLAorICJHXUxNTFsgTU1NWyBXTVdbIFhNWFsgSU1QTSBUTVtNIE1UV1QgSVtQWyBUW1tbIiwKKyAiSFxcUU1OTkxQS1NLVUxYTlpRW1NbVlpYWFlVWVNYUFZOU01RTSBRTU9OTVBMU0xVTVhPWlFbIFNbVVpXWFhVWFNXUFVOU00iLAorICJHXUxNTFsgTU1NWyBXTVdbIFhNWFsgSU1bTSBJW1BbIFRbW1siLAorICJHXFxMTUxiIE1NTWIgTVBPTlFNU01WTlhQWVNZVVhYVlpTW1FbT1pNWCBTTVVOV1BYU1hVV1hVWlNbIElNTU0gSWJQYiIsCisgIkhbV1BWUVdSWFFYUFZOVE1RTU5OTFBLU0tVTFhOWlFbU1tWWlhYIFFNT05NUExTTFVNWE9aUVsiLAorICJJXFxSTVJbIFNNU1sgTU1MUkxNWU1ZUlhNIE9bVlsiLAorICJJW0xNUlsgTU1SWSBYTVJbUF9OYUxiS2JKYUtgTGEgSk1QTSBUTVpNIiwKKyAiSF1SRlJiIFNGU2IgT0ZTRiBSUFFOUE1OTUxOS1FLV0xaTltQW1FaUlggTk1NTkxRTFdNWk5bIFdNWE5ZUVlXWFpXWyBTUFROVU1XTVlOWlFaV1laV1tVW1RaU1ggT2JWYiIsCisgIkhcXExNV1sgTU1YWyBYTUxbIEpNUE0gVE1aTSBKW1BbIFRbWlsiLAorICJHXUxNTFsgTU1NWyBXTVdbIFhNWFsgSU1QTSBUTVtNIElbW1tbYFpbIiwKKyAiR11MTUxUTVZQV1JXVVZXVCBNTU1UTlZQVyBXTVdbIFhNWFsgSU1QTSBUTVtNIFRbW1siLAorICJDYkhNSFsgSU1JWyBSTVJbIFNNU1sgXFxNXFxbIF1NXVsgRU1MTSBPTVZNIFlNYE0gRVtgWyIsCisgIkNiSE1IWyBJTUlbIFJNUlsgU01TWyBcXE1cXFsgXU1dWyBFTUxNIE9NVk0gWU1gTSBFW2BbYGBfWyIsCisgIkhdUU1RWyBSTVJbIExNS1JLTVVNIFJUVlRZVVpXWlhZWlZbTlsgVlRYVVlXWVhYWlZbIiwKKyAiRV9KTUpbIEtNS1sgR01OTSBLVE9UUlVTV1NYUlpPW0dbIE9UUVVSV1JYUVpPWyBZTVlbIFpNWlsgVk1dTSBWW11bIiwKKyAiSltPTU9bIFBNUFsgTE1TTSBQVFRUV1VYV1hYV1pUW0xbIFRUVlVXV1dYVlpUWyIsCisgIklcXE1PTE1MUU1PTk5QTVNNVk5YUFlTWVVYWFZaU1tQW05aTFhMV01WTldNWCBTTVVOV1BYU1hVV1hVWlNbIFJUWFQiLAorICJEYUlNSVsgSk1KWyBGTU1NIEZbTVsgVk1TTlFQUFNQVVFYU1pWW1hbW1pdWF5VXlNdUFtOWE1WTSBWTVROUlBRU1FVUlhUWlZbIFhbWlpcXFhdVV1TXFxQWk5YTSBKVFBUIiwKKyAiR1xcVk1WWyBXTVdbIFpNT01MTktQS1FMU09UVlQgT01NTkxQTFFNU09UIFRUUVVQVk5aTVsgVFRSVVFWT1pOW0xbS1pKWCBTW1pbIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSFxcUkZLWiBRSVdbIFJJWFsgUkZZWyBNVVZVIElbT1sgVFtbWyBLWkpbIEtaTVsgV1pVWyBXWVZbIFhZWlsiLAorICJHXUxGTFsgTUdNWiBORk5bIElGVUZYR1lIWkpaTFlOWE9VUCBYSFlKWUxYTiBVRldHWElYTVdPVVAgTlBVUFhRWVJaVFpXWVlYWlVbSVsgWFJZVFlXWFkgVVBXUVhTWFhXWlVbIEpGTEcgS0ZMSCBPRk5IIFBGTkcgTFpKWyBMWUtbIE5ZT1sgTlpQWyIsCisgIkdcXFhJWUZZTFhJVkdURlFGTkdMSUtLSk5KU0tWTFhOWlFbVFtWWlhYWVYgTUlMS0tOS1NMVk1YIFFGT0dNSkxOTFNNV09aUVsiLAorICJHXUxGTFsgTUdNWiBORk5bIElGU0ZWR1hJWUtaTlpTWVZYWFZaU1tJWyBXSVhLWU5ZU1hWV1ggU0ZVR1dKWE5YU1dXVVpTWyBKRkxHIEtGTEggT0ZOSCBQRk5HIExaSlsgTFlLWyBOWU9bIE5aUFsiLAorICJHXFxMRkxbIE1HTVogTkZOWyBJRllGWUwgTlBUUCBUTFRUIElbWVtZVSBKRkxHIEtGTEggT0ZOSCBQRk5HIFRGWUcgVkZZSCBXRllJIFhGWUwgVExTUFRUIFROUlBUUiBUT1BQVFEgTFpKWyBMWUtbIE5ZT1sgTlpQWyBUW1laIFZbWVkgV1tZWCBYW1lVIiwKKyAiR1tMRkxbIE1HTVogTkZOWyBJRllGWUwgTlBUUCBUTFRUIElbUVsgSkZMRyBLRkxIIE9GTkggUEZORyBURllHIFZGWUggV0ZZSSBYRllMIFRMU1BUVCBUTlJQVFIgVE9QUFRRIExaSlsgTFlLWyBOWU9bIE5aUFsiLAorICJHXlhJWUZZTFhJVkdURlFGTkdMSUtLSk5KU0tWTFhOWlFbVFtWWlhaWVtZUyBNSUxLS05LU0xWTVggUUZPR01KTE5MU01XT1pRWyBYVFhZIFdTV1lWWiBUU1xcUyBVU1dUIFZTV1UgWlNZVSBbU1lUIiwKKyAiRl5LRktbIExHTFogTUZNWyBXRldbIFhHWFogWUZZWyBIRlBGIFRGXFxGIE1QV1AgSFtQWyBUW1xcWyBJRktHIEpGS0ggTkZNSCBPRk1HIFVGV0cgVkZXSCBaRllIIFtGWUcgS1pJWyBLWUpbIE1ZTlsgTVpPWyBXWlVbIFdZVlsgWVlaWyBZWltbIiwKKyAiTFhRRlFbIFJHUlogU0ZTWyBORlZGIE5bVlsgT0ZRRyBQRlFIIFRGU0ggVUZTRyBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiSlpTRlNXUlpRWyBUR1RXU1ogVUZVV1RaUVtPW01aTFhMVk1VTlVPVk9XTlhNWCBNVk1XTldOVk1WIFBGWEYgUUZTRyBSRlNIIFZGVUggV0ZVRyIsCisgIkZcXEtGS1sgTEdMWiBNRk1bIFhHTVIgUFBXWyBRUFhbIFFOWVsgSEZQRiBVRltGIEhbUFsgVFtbWyBJRktHIEpGS0ggTkZNSCBPRk1HIFdGWEcgWkZYRyBLWklbIEtZSlsgTVlOWyBNWk9bIFdZVVsgV1laWyIsCisgIklbTkZOWyBPR09aIFBGUFsgS0ZTRiBLW1pbWlUgTEZORyBNRk5IIFFGUEggUkZQRyBOWkxbIE5ZTVsgUFlRWyBQWlJbIFVbWlogV1taWSBYW1pYIFlbWlUiLAorICJFX0pGSlogSkZRWyBLRlFYIExGUlggWEZRWyBYRlhbIFlHWVogWkZaWyBHRkxGIFhGXUYgR1tNWyBVW11bIEhGSkcgW0ZaSCBcXEZaRyBKWkhbIEpaTFsgWFpWWyBYWVdbIFpZW1sgWlpcXFsiLAorICJGXktGS1ogS0ZZWyBMRlhYIE1GWVggWUdZWyBIRk1GIFZGXFxGIEhbTlsgSUZLRyBXRllHIFtGWUcgS1pJWyBLWk1bIiwKKyAiR11RRk5HTElLS0pPSlJLVkxYTlpRW1NbVlpYWFlWWlJaT1lLWElWR1NGUUYgTUlMS0tOS1NMVk1YIFdYWFZZU1lOWEtXSSBRRk9HTUpMTkxTTVdPWlFbIFNbVVpXV1hTWE5XSlVHU0YiLAorICJHXUxGTFsgTUdNWiBORk5bIElGVUZYR1lIWkpaTVlPWFBVUU5RIFhIWUpZTVhPIFVGV0dYSVhOV1BVUSBJW1FbIEpGTEcgS0ZMSCBPRk5IIFBGTkcgTFpKWyBMWUtbIE5ZT1sgTlpQWyIsCisgIkddUUZOR0xJS0tKT0pSS1ZMWE5aUVtTW1ZaWFhZVlpSWk9ZS1hJVkdTRlFGIE1JTEtLTktTTFZNWCBXWFhWWVNZTlhLV0kgUUZPR01KTE5MU01XT1pRWyBTW1VaV1dYU1hOV0pVR1NGIE5YT1ZRVVJVVFZVWFZeV2BZYFpeWlxcIFZcXFdeWF9ZXyBVWFddWF5ZXlpdIiwKKyAiR11MRkxbIE1HTVogTkZOWyBJRlVGWEdZSFpKWkxZTlhPVVBOUCBYSFlKWUxYTiBVRldHWElYTVdPVVAgUlBUUVVTV1lYW1pbW1lbVyBXV1hZWVpaWiBUUVVSWFhZWVpZW1ggSVtRWyBKRkxHIEtGTEggT0ZOSCBQRk5HIExaSlsgTFlLWyBOWU9bIE5aUFsiLAorICJIXFxYSVlGWUxYSVZHU0ZQRk1HS0lLTExOT1BVUldTWFVYWFdaIExMTU5PT1VRV1JYVCBNR0xJTEtNTU9OVVBYUllUWVdYWVdaVFtRW05aTFhLVUtbTFgiLAorICJIXFxKRkpMIFFGUVsgUkdSWiBTRlNbIFpGWkwgSkZaRiBOW1ZbIEtGSkwgTEZKSSBNRkpIIE9GSkcgVUZaRyBXRlpIIFhGWkkgWUZaTCBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiRl5LRktVTFhOWlFbU1tWWlhYWVVZRyBMR0xWTVggTUZNVk5ZT1pRWyBIRlBGIFZGXFxGIElGS0cgSkZLSCBORk1IIE9GTUcgV0ZZRyBbRllHIiwKKyAiSFxcS0ZSWyBMRlJYUlsgTUZTWCBZR1JbIElGUEYgVUZbRiBKRkxIIE5GTUggT0ZNRyBXRllHIFpGWUciLAorICJGXkpGTlsgS0ZOVk5bIExGT1YgUkZPVk5bIFJGVlsgU0ZWVlZbIFRGV1YgWkdXVlZbIEdGT0YgUkZURiBXRl1GIEhGS0cgSUZLSCBNRkxIIE5GTEcgWEZaRyBcXEZaRyIsCisgIkhcXEtGV1sgTEZYWyBNRllbIFhHTFogSUZQRiBVRltGIElbT1sgVFtbWyBKRk1IIE5GTUggT0ZNRyBWRlhHIFpGWEcgTFpKWyBMWk5bIFdaVVsgV1lWWyBXWVpbIiwKKyAiR11KRlFRUVsgS0ZSUVJaIExGU1FTWyBZR1NRIEhGT0YgVkZcXEYgTltWWyBJRktHIE5GTEcgV0ZZRyBbRllHIFFaT1sgUVlQWyBTWVRbIFNaVVsiLAorICJIXFxZRktGS0wgV0ZLWyBYRkxbIFlGTVsgS1tZW1lVIExGS0wgTUZLSSBORktIIFBGS0cgVFtZWiBWW1lZIFdbWVggWFtZVSIsCisgIkhcXFJGS1ogUUlXWyBSSVhbIFJGWVsgTVVWVSBJW09bIFRbW1sgS1pKWyBLWk1bIFdaVVsgV1lWWyBYWVpbIiwKKyAiR11MRkxbIE1HTVogTkZOWyBJRlVGWEdZSFpKWkxZTlhPVVAgWEhZSllMWE4gVUZXR1hJWE1XT1VQIE5QVVBYUVlSWlRaV1lZWFpVW0lbIFhSWVRZV1hZIFVQV1FYU1hYV1pVWyBKRkxHIEtGTEggT0ZOSCBQRk5HIExaSlsgTFlLWyBOWU9bIE5aUFsiLAorICJJW05GTlsgT0dPWiBQRlBbIEtGWkZaTCBLW1NbIExGTkcgTUZOSCBRRlBIIFJGUEcgVUZaRyBXRlpIIFhGWkkgWUZaTCBOWU1bIE5aTFsgUFlRWyBQWlJbIiwKKyAiSFxcUkZKWyBRSVhbIFJJWVsgUkZaWyBLWVhZIEtaWFogSltaWyIsCisgIkdcXExGTFsgTUdNWiBORk5bIElGWUZZTCBOUFRQIFRMVFQgSVtZW1lVIEpGTEcgS0ZMSCBPRk5IIFBGTkcgVEZZRyBWRllIIFdGWUkgWEZZTCBUTFNQVFQgVE5SUFRSIFRPUFBUUSBMWkpbIExZS1sgTllPWyBOWlBbIFRbWVogVltZWSBXW1lYIFhbWVUiLAorICJIXFxZRktGS0wgV0ZLWyBYRkxbIFlGTVsgS1tZW1lVIExGS0wgTUZLSSBORktIIFBGS0cgVFtZWiBWW1lZIFdbWVggWFtZVSIsCisgIkZeS0ZLWyBMR0xaIE1GTVsgV0ZXWyBYR1haIFlGWVsgSEZQRiBURlxcRiBNUFdQIEhbUFsgVFtcXFsgSUZLRyBKRktIIE5GTUggT0ZNRyBVRldHIFZGV0ggWkZZSCBbRllHIEtaSVsgS1lKWyBNWU5bIE1aT1sgV1pVWyBXWVZbIFlZWlsgWVpbWyIsCisgIkddUUZOR0xJS0tKT0pSS1ZMWE5aUVtTW1ZaWFhZVlpSWk9ZS1hJVkdTRlFGIE1JTEtLTktTTFZNWCBXWFhWWVNZTlhLV0kgUUZPR01KTE5MU01XT1pRWyBTW1VaV1dYU1hOV0pVR1NGIE9NT1QgVU1VVCBPUFVQIE9RVVEgT05QUCBPT1FQIFVOVFAgVU9TUCBQUU9TIFFRT1IgU1FVUiBUUVVTIiwKKyAiTFhRRlFbIFJHUlogU0ZTWyBORlZGIE5bVlsgT0ZRRyBQRlFIIFRGU0ggVUZTRyBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiRlxcS0ZLWyBMR0xaIE1GTVsgWEdNUiBQUFdbIFFQWFsgUU5ZWyBIRlBGIFVGW0YgSFtQWyBUW1tbIElGS0cgSkZLSCBORk1IIE9GTUcgV0ZYRyBaRlhHIEtaSVsgS1lKWyBNWU5bIE1aT1sgV1lVWyBXWVpbIiwKKyAiSFxcUkZLWiBRSVdbIFJJWFsgUkZZWyBJW09bIFRbW1sgS1pKWyBLWk1bIFdaVVsgV1lWWyBYWVpbIiwKKyAiRV9KRkpaIEpGUVsgS0ZRWCBMRlJYIFhGUVsgWEZYWyBZR1laIFpGWlsgR0ZMRiBYRl1GIEdbTVsgVVtdWyBIRkpHIFtGWkggXFxGWkcgSlpIWyBKWkxbIFhaVlsgWFlXWyBaWVtbIFpaXFxbIiwKKyAiRl5LRktaIEtGWVsgTEZYWCBNRllYIFlHWVsgSEZNRiBWRlxcRiBIW05bIElGS0cgV0ZZRyBbRllHIEtaSVsgS1pNWyIsCisgIkddSkVKTCBaRVpMIE9NT1QgVU1VVCBKVUpcXCBaVVpcXCBKR1pHIEpIWkggSklaSSBPUFVQIE9RVVEgSlhaWCBKWVpZIEpaWlogSkZNSCBaRldIIEtJSksgTElKSiBYSVpKIFlJWksgT05QUCBPT1FQIFVOVFAgVU9TUCBQUU9TIFFRT1IgU1FVUiBUUVVTIEpWS1ggSldMWCBaV1hYIFpWWVggTVlKWyBXWVpbIiwKKyAiR11RRk5HTElLS0pPSlJLVkxYTlpRW1NbVlpYWFlWWlJaT1lLWElWR1NGUUYgTUlMS0tOS1NMVk1YIFdYWFZZU1lOWEtXSSBRRk9HTUpMTkxTTVdPWlFbIFNbVVpXV1hTWE5XSlVHU0YiLAorICJGXktGS1sgTEdMWiBNRk1bIFdGV1sgWEdYWiBZRllbIEhGXFxGIEhbUFsgVFtcXFsgSUZLRyBKRktIIE5GTUggT0ZNRyBVRldHIFZGV0ggWkZZSCBbRllHIEtaSVsgS1lKWyBNWU5bIE1aT1sgV1pVWyBXWVZbIFlZWlsgWVpbWyIsCisgIkddTEZMWyBNR01aIE5GTlsgSUZVRlhHWUhaSlpNWU9YUFVRTlEgWEhZSllNWE8gVUZXR1hJWE5XUFVRIElbUVsgSkZMRyBLRkxIIE9GTkggUEZORyBMWkpbIExZS1sgTllPWyBOWlBbIiwKKyAiR11JRlBQUVEgSkZRUCBLRlJQSVsgSUZZRlpMWUlXRiBWRllIIFRGWUcgS1lZWSBKWllaIElbWVtaVVlYV1kiLAorICJIXFxKRkpMIFFGUVsgUkdSWiBTRlNbIFpGWkwgSkZaRiBOW1ZbIEtGSkwgTEZKSSBNRkpIIE9GSkcgVUZaRyBXRlpIIFhGWkkgWUZaTCBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiSFxcSk1LSUxHTUZPRlBHUUlSTSBMSE1HT0dQSCBKTUtKTUhPSFBJUU1RWyBSTVJbIFpNWUpXSFVIVElTTVNbIFhIV0dVR1RIIFpNWUlYR1dGVUZUR1NJUk0gTltWWyBRWVBbIFFaT1sgU1pVWyBTWVRbIiwKKyAiR11RRlFbIFJHUlogU0ZTWyBORlZGIE5bVlsgT0ZRRyBQRlFIIFRGU0ggVUZTRyBRWk9bIFFZUFsgU1lUWyBTWlVbIE9LTExLTUpPSlJLVExVT1ZVVlhVWVRaUlpPWU1YTFVLT0sgTE1LT0tSTFQgWFRZUllPWE0gT0tNTExPTFJNVU9WIFVWV1VYUlhPV0xVSyIsCisgIkhcXEtGV1sgTEZYWyBNRllbIFhHTFogSUZQRiBVRltGIElbT1sgVFtbWyBKRk1IIE5GTUggT0ZNRyBWRlhHIFpGWEcgTFpKWyBMWk5bIFdaVVsgV1lWWyBXWVpbIiwKKyAiRl5RRlFbIFJHUlogU0ZTWyBORlZGIE5bVlsgT0ZRRyBQRlFIIFRGU0ggVUZTRyBRWk9bIFFZUFsgU1lUWyBTWlVbIEhNSU1KTktRTFNNVFBVVFVXVFhTWVFaTltNXFxNIExSS05KTElMS04gSE1JS0pLS0xMUE1TTlRQVSBZTltMWkxZTlhSIFRVVlRXU1hQWUxaS1tLXFxNIiwKKyAiR11OWUtZSldLW09bTVZLUkpPSkxLSU1HUEZURldHWUlaTFpPWVJXVlVbWVtaV1lZVlkgTFNLT0tMTEkgWElZTFlPWFMgT1tNVUxQTEtNSE5HUEYgVEZWR1dIWEtYUFdVVVsgS1pOWiBWWllaIiwKKyAiSFxcVUZJWiBTSlRbIFRIVVogVUZVSFZZVlsgTFVUVSBGW0xbIFFbWFsgSVpHWyBJWktbIFRaUlsgVFlTWyBWWVdbIiwKKyAiRl5PRklbIFBGSlsgUUZLWyBMRldGWkdbSVtLWk5ZT1ZQIFlHWklaS1lOWE8gV0ZYR1lJWUtYTlZQIE5QVlBYUVlTWVVYWFZaUltGWyBXUVhTWFVXWFVaIFZQV1JXVVZYVFpSWyBNRlBHIE5GT0ggUkZQSCBTRlBHIEpaR1sgSllIWyBLWUxbIEpaTVsiLAorICJIXVpIW0hcXEZbTFtKWkhZR1dGVEZRR09JTUxMT0tTS1ZMWU1aUFtTW1VaV1hYViBRSE9KTkxNT0xTTFdNWSBURlJHUEpPTE5PTVNNWE5aUFsiLAorICJGXU9GSVsgUEZKWyBRRktbIExGVUZYR1lIWktaT1lTV1dVWVNaT1tGWyBXR1hIWUtZT1hTVldUWSBVRldIWEtYT1dTVVdSWk9bIE1GUEcgTkZPSCBSRlBIIFNGUEcgSlpHWyBKWUhbIEtZTFsgSlpNWyIsCisgIkZdT0ZJWyBQRkpbIFFGS1sgVUxTVCBMRltGWkwgTlBUUCBGW1VbV1YgTUZQRyBORk9IIFJGUEggU0ZQRyBXRlpHIFhGWkggWUZaSSBaRlpMIFVMU1BTVCBUTlJQU1IgVE9RUFNRIEpaR1sgSllIWyBLWUxbIEpaTVsgUFtVWiBSW1VZIFVZV1YiLAorICJGXFxPRklbIFBGSlsgUUZLWyBVTFNUIExGW0ZaTCBOUFRQIEZbTlsgTUZQRyBORk9IIFJGUEggU0ZQRyBXRlpHIFhGWkggWUZaSSBaRlpMIFVMU1BTVCBUTlJQU1IgVE9RUFNRIEpaR1sgSllIWyBLWUxbIEpaTVsiLAorICJIXlpIW0hcXEZbTFtKWkhZR1dGVEZRR09JTUxMT0tTS1ZMWU1aUFtSW1VaV1hZVCBRSE9KTkxNT0xTTFdNWSBWWFdXWFQgVEZSR1BKT0xOT01TTVhOWlBbIFJbVFpWV1dUIFRUXFxUIFVUV1UgVlRXVyBaVFhWIFtUWFUiLAorICJFX05GSFsgT0ZJWyBQRkpbIFpGVFsgW0ZVWyBcXEZWWyBLRlNGIFdGX0YgTFBYUCBFW01bIFFbWVsgTEZPRyBNRk5IIFFGT0ggUkZPRyBYRltHIFlGWkggXUZbSCBeRltHIElaRlsgSVlHWyBKWUtbIElaTFsgVVpSWyBVWVNbIFZZV1sgVVpYWyIsCisgIktZVEZOWyBVRk9bIFZGUFsgUUZZRiBLW1NbIFJGVUcgU0ZUSCBXRlVIIFhGVUcgT1pMWyBPWU1bIFBZUVsgT1pSWyIsCisgIklcXFdGUldRWU9bIFhGVFNTVlJYIFlGVVNTWFFaT1tNW0taSlhKVktVTFVNVk1XTFhLWCBLVktXTFdMVktWIFRGXFxGIFVGWEcgVkZXSCBaRlhIIFtGWEciLAorICJGXU9GSVsgUEZKWyBRRktbIFxcR01SIFFPVVsgUk9WWyBTTldaIExGVEYgWUZfRiBGW05bIFJbWVsgTUZQRyBORk9IIFJGUEggU0ZQRyBaRlxcRyBeRlxcRyBKWkdbIEpZSFsgS1lMWyBKWk1bIFVaU1sgVVlUWyBWWVhbIiwKKyAiSFxcUUZLWyBSRkxbIFNGTVsgTkZWRiBIW1dbWVUgT0ZSRyBQRlFIIFRGUkggVUZSRyBMWklbIExZSlsgTVlOWyBMWk9bIFJbV1ogVFtYWCBWW1lVIiwKKyAiRGBNRkdaIE1HTllOWyBORk9ZIE9GUFggW0ZQWE5bIFtGVVsgXFxGVlsgXUZXWyBKRk9GIFtGYEYgRFtKWyBSW1pbIEtGTUcgTEZNSCBeRlxcSCBfRlxcRyBHWkVbIEdaSVsgVlpTWyBWWVRbIFdZWFsgVlpZWyIsCisgIkZfT0ZJWiBPRlZbIFBGVlggUUZXWCBcXEdXWFZbIExGUUYgWUZfRiBGW0xbIE1GUEcgTkZQSCBaRlxcRyBeRlxcRyBJWkdbIElaS1siLAorICJHXVNGUEdOSUxMS09KU0pWS1lMWk5bUVtUWlZYWFVZUlpOWktZSFhHVkZTRiBPSU1MTE9LU0tXTFkgVVhXVVhSWU5ZSlhIIFNGUUdPSk5MTU9MU0xYTVpOWyBRW1NaVVdWVVdSWE5YSVdHVkYiLAorICJGXU9GSVsgUEZKWyBRRktbIExGWEZbR1xcSVxcS1tOWVBVUU1RIFpHW0lbS1pOWFAgWEZZR1pJWktZTldQVVEgRltOWyBNRlBHIE5GT0ggUkZQSCBTRlBHIEpaR1sgSllIWyBLWUxbIEpaTVsiLAorICJHXVNGUEdOSUxMS09KU0pWS1lMWk5bUVtUWlZYWFVZUlpOWktZSFhHVkZTRiBPSU1MTE9LU0tXTFkgVVhXVVhSWU5ZSlhIIFNGUUdPSk5MTU9MU0xYTVpOWyBRW1NaVVdWVVdSWE5YSVdHVkYgTFhNVk9VUFVSVlNYVF1VXlZeV10gVF5VX1ZfIFNYU19UYFZgV11XXFwiLAorICJGXk9GSVsgUEZKWyBRRktbIExGV0ZaR1tJW0taTllPVlBOUCBZR1pJWktZTlhPIFdGWEdZSVlLWE5WUCBSUFRRVVJXWFhZWVlaWCBXWVhaWVogVVJWWldbWVtaWFpXIEZbTlsgTUZQRyBORk9IIFJGUEggU0ZQRyBKWkdbIEpZSFsgS1lMWyBKWk1bIiwKKyAiR15aSFtIXFxGW0xbSlpIWUdWRlJGT0dNSU1MTk5QUFZTV1VXWFZaIE5MT05WUldUIE9HTklOS09NVVBXUlhUWFdXWVZaU1tPW0xaS1lKV0pVSVtKWUtZIiwKKyAiR11URk5bIFVGT1sgVkZQWyBNRktMIF1GXFxMIE1GXUYgS1tTWyBORktMIFBGTEkgUkZNRyBZRlxcRyBaRlxcSCBbRlxcSSBcXEZcXEwgT1pMWyBPWU1bIFBZUVsgT1pSWyIsCisgIkZfTkZLUUpVSlhLWk5bUltVWldYWFVcXEcgT0ZMUUtVS1lMWiBQRk1RTFVMWU5bIEtGU0YgWUZfRiBMRk9HIE1GTkggUUZPSCBSRk9HIFpGXFxHIF5GXFxHIiwKKyAiSFxcTkZOSE9ZT1sgT0dQWCBQRlFXIFtHT1sgTEZTRiBYRl5GIE1GTkggUUZQSCBSRk9HIFlGW0cgXUZbRyIsCisgIkVfTUZNSEtZS1sgTkdMWCBPRk1XIFVGTVdLWyBVRlVIU1lTWyBWR1RYIFdGVVcgXUdVV1NbIEpGUkYgVUZXRiBaRmBGIEtGTkcgTEZNSCBQRk5JIFFGTkcgW0ZdRyBfRl1HIiwKKyAiR11ORlRbIE9GVVsgUEZWWyBbR0laIExGU0YgWEZeRiBGW0xbIFFbWFsgTUZPSCBRRlBIIFJGUEcgWUZbRyBdRltHIElaR1sgSVpLWyBUWlJbIFRZU1sgVVlXWyIsCisgIkddTUZRUE5bIE5GUlBPWyBPRlNQUFsgXFxHU1AgS0ZSRiBZRl9GIEtbU1sgTEZORyBQRk9IIFFGTkcgWkZcXEcgXkZcXEcgT1pMWyBPWU1bIFBZUVsgT1pSWyIsCisgIkddWkZIWyBbRklbIFxcRkpbIFxcRk5GTEwgSFtWW1hVIE9GTEwgUEZNSSBSRk5HIFJbVlogVFtXWCBVW1hVIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiSFxcSkZSWyBLRlJYIExGU1ggSkZaRlJbIExHWUcgTEhZSCIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIiIsCisgIkldTlBOT09PT1FNUU1PTk5QTVRNVk5XT1hRWFhZWlpbIFZPV1FXWFhaIFRNVU5WUFZYV1paW1tbIFZSVVNQVE1VTFdMWE1aUFtTW1VaVlggTlVNV01YTlogVVNRVE9VTldOWE9aUFsiLAorICJHXFxMRkxbTVpPWiBNR01ZIElGTkZOWiBOUE9OUU1TTVZOWFBZU1lVWFhWWlNbUVtPWk5YIFdQWFJYVldYIFNNVU5WT1dSV1ZWWVVaU1sgSkZMRyBLRkxIIiwKKyAiSFtXUVdQVlBWUlhSWFBWTlRNUU1OTkxQS1NLVUxYTlpRW1NbVlpYWCBNUExSTFZNWCBRTU9OTk9NUk1WTllPWlFbIiwKKyAiSF1WRlZbW1sgV0dXWiBTRlhGWFsgVlBVTlNNUU1OTkxQS1NLVUxYTlpRW1NbVVpWWCBNUExSTFZNWCBRTU9OTk9NUk1WTllPWlFbIFRGVkcgVUZWSCBYWVlbIFhaWlsiLAorICJIW01TWFNYUVdPVk5TTVFNTk5MUEtTS1VMWE5aUVtTW1ZaWFggV1JXUVZPIE1QTFJMVk1YIFZTVlBVTlNNIFFNT05OT01STVZOWU9aUVsiLAorICJLWVdIV0dWR1ZJWElYR1dGVEZSR1FIUEtQWyBSSFFLUVogVEZTR1JJUlsgTU1WTSBNW1VbIFBaTlsgUFlPWyBSWVNbIFJaVFsiLAorICJJXFxYTllPWk5ZTVhNVk5VTyBRTU9OTk9NUU1TTlVPVlFXU1dVVlZVV1NXUVZPVU5TTVFNIE9PTlFOU09VIFVVVlNWUVVPIFFNUE5PUE9UUFZRVyBTV1RWVVRVUFROU00gTlVNVkxYTFlNW05cXFFdVV1YXllfIE5bUVxcVVxcWF0gTFlNWlBbVVtYXFxZXllfWGFVYk9iTGFLX0teTFxcT1sgT2JNYUxfTF5NXFxPWyIsCisgIkdeTEZMWyBNR01aIElGTkZOWyBOUU9PUE5STVVNV05YT1lSWVsgV09YUlhaIFVNVk5XUVdbIElbUVsgVFtcXFsgSkZMRyBLRkxIIExaSlsgTFlLWyBOWU9bIE5aUFsgV1pVWyBXWVZbIFlZWlsgWVpbWyIsCisgIkxYUUZRSFNIU0ZRRiBSRlJIIFFHU0cgUU1RWyBSTlJaIE5NU01TWyBOW1ZbIE9NUU4gUE1RTyBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiS1hSRlJIVEhURlJGIFNGU0ggUkdURyBSTVJeUWFQYiBTTlNdUmAgT01UTVRdU2BSYVBiTWJMYUxfTl9OYU1hTWAgUE1STiBRTVJPIiwKKyAiR11MRkxbIE1HTVogSUZORk5bIFdOTlcgUlNZWyBSVFhbIFFUV1sgVE1bTSBJW1FbIFRbW1sgSkZMRyBLRkxIIFVNV04gWk1XTiBMWkpbIExZS1sgTllPWyBOWlBbIFdZVVsgVllaWyIsCisgIkxYUUZRWyBSR1JaIE5GU0ZTWyBOW1ZbIE9GUUcgUEZRSCBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiQWNGTUZbIEdOR1ogQ01ITUhbIEhRSU9KTkxNT01RTlJPU1JTWyBRT1JSUlogT01QTlFRUVsgU1FUT1VOV01aTVxcTl1PXlJeWyBcXE9dUl1aIFpNW05cXFFcXFsgQ1tLWyBOW1ZbIFlbYVsgRE1GTiBFTUZPIEZaRFsgRllFWyBIWUlbIEhaSlsgUVpPWyBRWVBbIFNZVFsgU1pVWyBcXFpaWyBcXFlbWyBeWV9bIF5aYFsiLAorICJHXkxNTFsgTU5NWiBJTU5NTlsgTlFPT1BOUk1VTVdOWE9ZUllbIFdPWFJYWiBVTVZOV1FXWyBJW1FbIFRbXFxbIEpNTE4gS01MTyBMWkpbIExZS1sgTllPWyBOWlBbIFdaVVsgV1lWWyBZWVpbIFlaW1siLAorICJIXFxRTU5OTFBLU0tVTFhOWlFbU1tWWlhYWVVZU1hQVk5TTVFNIE1QTFJMVk1YIFdYWFZYUldQIFFNT05OT01STVZOWU9aUVsgU1tVWlZZV1ZXUlZPVU5TTSIsCisgIkdcXExNTGIgTU5NYSBJTU5NTmIgTlBPTlFNU01WTlhQWVNZVVhYVlpTW1FbT1pOWCBXUFhSWFZXWCBTTVVOVk9XUldWVllVWlNbIEliUWIgSk1MTiBLTUxPIExhSmIgTGBLYiBOYE9iIE5hUGIiLAorICJIXFxWTlZiIFdPV2EgVU5XTlhNWGIgVlBVTlNNUU1OTkxQS1NLVUxYTlpRW1NbVVpWWCBNUExSTFZNWCBRTU9OTk9NUk1WTllPWlFbIFNiW2IgVmFUYiBWYFViIFhgWWIgWGFaYiIsCisgIklaTk1OWyBPTk9aIEtNUE1QWyBXT1dOVk5WUFhQWE5XTVVNU05RUFBTIEtbU1sgTE1OTiBNTU5PIE5aTFsgTllNWyBQWVFbIFBaUlsiLAorICJKW1dPWE1YUVdPVk5UTVBNTk5NT01RTlNQVFVVV1ZYWSBOTk1RIE5SUFNVVFdVIFhWV1ogTU9OUVBSVVNXVFhWWFlXWlVbUVtPWk5ZTVdNW05ZIiwKKyAiS1pQSFBWUVlSWlRbVltYWllYIFFIUVdSWSBQSFJGUldTWlRbIE1NVk0iLAorICJHXkxNTFZNWU5aUFtTW1VaVllXVyBNTk1XTlkgSU1OTU5XT1pQWyBXTVdbXFxbIFhOWFogVE1ZTVlbIEpNTE4gS01MTyBZWVpbIFlaW1siLAorICJJW0xNUlsgTU1SWSBOTVNZIFhOU1lSWyBKTVFNIFRNWk0gS01OTyBQTU5OIFZNWE4gWU1YTiIsCisgIkZeSk1OWyBLTU5YIExNT1ggUk1PWE5bIFJNVlsgU01WWCBSTVRNV1ggWk5XWFZbIEdNT00gV01dTSBITUtOIE5NTE4gWE1aTiBcXE1aTiIsCisgIkhcXExNVlsgTU1XWyBOTVhbIFdOTVogSk1RTSBUTVpNIEpbUFsgU1taWyBLTU1OIFBNTk4gVU1XTiBZTVdOIE1aS1sgTVpPWyBWWlRbIFdaWVsiLAorICJIW0xNUlsgTU1SWSBOTVNZIFhOU1lQX05hTGJKYklhSV9LX0thSmFKYCBKTVFNIFRNWk0gS01OTyBQTU5OIFZNWE4gWU1YTiIsCisgIklbVk1MWyBXTU1bIFhNTlsgWE1MTUxRIExbWFtYVyBNTUxRIE5NTFAgT01MTyBRTUxOIFNbWFogVVtYWSBWW1hYIFdbWFciLAorICJHXltNWlFZVFdYVVpSW1BbTVpLWEpVSlNLUE1OUE1STVVOVk9XUVlYWlpbW1xcWyBaTVlRWFRXVlVZVFpSWyBMWEtWS1JMUCBQW05aTVlMVkxSTU9OTlBNIFJNVE5VT1ZRWFhZWltbIiwKKyAiR1xcUUZOR01ITEpLTktiIE5ITUpMTkxhIFFGT0dOSU1OTWIgUUZTRlZHV0hYSlhMV05WT1NQIFBQVFBXUVhSWVRZV1hZV1pUW1FbT1pOWU1XIFZIV0pXTFZOIFdSWFRYV1dZIFNGVUdWSVZNVU9TUCBUUFZRV1NXWFZaVFsgS2JNYiIsCisgIkZcXEhSSU5LTU1NT05QT1FSUllTYiBJT0tOTU5PT1BQIEhSSVBLT01PT1BQUVFUUllSYSBYTVdQVlJUVVNXUltRYiBZTVdRIFpNWU9XUlRWU1hSWyBYTVpNIFFiU2IiLAorICJIXFxTTVFNTk5MUEtTS1VMWE5aUVtTW1ZaWFhZVVlTWFBWTlNNUExOS01KTUhOR1BGU0ZXSCBNUExTTFVNWCBXWFhVWFNXUCBRTU9OTk9NUk1WTllPWlFbIFNbVVpWWVdWV1JWT1VOT0tOSk5JT0hRR1RHV0giLAorICJJW1NNVU5WT1dPVk5TTVFNTU5MT0xRTVJRUyBTU1FTTVRLVktYTVpQW1NbVlpYWFdYVlogTk5NT01RTlIgTVVMVkxYTVkgUU1PTk5PTlFPUlFTIFFTTlRNVk1YTlpQWyIsCisgIklbUUhSR1JGUUZQR1BJUUpUS1hLWUtZSlhKVUtTTFBOTlBNUkxVTFdNWU5aUFtTXFxVXVZfVmFVYlNiUmFSYFNgU2EgUE9PUE5STVVNV05ZT1ogVUtSTVFOT1FOVE5XT1lRW1NcXCIsCisgIkddSk1LTkxQTFsgS01MTk1QTVogSFBJTkpNTE1NTk5QTlsgVU1WTldRV2IgV09YUlhhIE5RT09QTlJNVU1XTlhPWVJZYiBMW05bIFdiWWIiLAorICJGXUlNSk5LUEtUTFdNWU5aUVtTW1ZaV1lYV1lSWU9YSlZHVEZSRlBHT0lPS1BNU09WUFtRIEpNS05MUExUTVdOWSBWWVdXWFJYT1dKVkhURyBHUEhOSU1LTUxOTVBNVE5YT1pRWyBTW1VaVlhXU1dOVkpVSFNHUUdPSSIsCisgIktaTk1PTlBQUFhRWlNbVVtXWlhYIE9NUE5RUFFYUlogTFBNTk5NUE1RTlJQUlhTWlRbIiwKKyAiR11KTUtOTFBMWyBLTUxOTVBNWiBIUElOSk1MTU1OTlBOWyBTT1VOV05YT1hQWlBaTlhNVk1UTlFRT1ROVyBYTllPWVAgUFNRU1dZWVlaWCBUV1daWVogUlRVWlZbWFtZWlpYIExbTlsiLAorICJIXFxKR0tGTUZPR1FJWFhZWlpbIE9IUElXWFhZIE1GTkdPSVZYWFpaW1tbIFJNSlpKW0tbUk0iLAorICJHXUtNS2IgTE5MYSBNTU1iIFZNVlhXWlhbWltbWlxcWCBXTldYWFpZWyBYTVhYWVpaWyBNWE5aUFtSW1RaVVlWVyBLTU1NIFZNWE0gS2JNYiIsCisgIkddSk1LTkxQTVROWyBLTUxOTVBOVE9aIEhQSU5KTUxNTU5OUE9UUFogVlZXVFhRWE1ZTVpOWVFYU1ZWVFhRWk5bIFhSWU9ZTSIsCisgIkpaUEdTRlJGUEdPSE9JUEpTS1ZMV0tWSlNLUExOTU1PTVFOUlBTU1RWVVdUVlNTVE9VTVZMWExaTVtPXFxTXVVeVl9WYVRiUmJPYVBhUmIgT01OT05RT1IgTlZNWE1aTlsgVktTS1FMUE1PT09RUVNTVCBWVFNUUFVPVk5YTlpQXFxTXSIsCisgIkhcXFFNTk5MUEtTS1VMWE5aUVtTW1ZaWFhZVVlTWFBWTlNNUU0gTVBMUkxWTVggV1hYVlhSV1AgUU1PTk5PTVJNVk5ZT1pRWyBTW1VaVllXVldSVk9VTlNNIiwKKyAiR11JUUpPS05NTVtNIEtPTU5aTiBJUUpQTE9bTyBPT05aTVtMWk1XT08gVU9WWldbWFpXV1VPIFtNW08gT09NWiBVT1daIiwKKyAiR1xcUU1OTkxQS1RLYiBNUExUTGEgUU1PTk5PTVNNYiBNV05ZT1pRW1NbVlpYWFlVWVNYUFZOU01RTSBXWFhWWFJXUCBTW1VaVllXVldSVk9VTlNNIEtiTWIiLAorICJHXVBNTU5LUEpTSlVLWE1aUFtSW1VaV1hYVVhTV1BVTlJNIExQS1JLVkxYIFZYV1ZXUlZQIFBNTk5NT0xSTFZNWU5aUFsgUltUWlVZVlZWUlVPVE5STSBSTVpPW05bTVBNIFJNWk4iLAorICJIXFxKUUtPTE5OTVpNIExPTk5ZTiBKUUtQTU9aTyBST1FaUltTWlJPIFpNWk8gUk9SWiIsCisgIkdcXEpNS05MUExVTVhPWlFbU1tVWldYWFZZUllOWE1XTVhQWFNXV1VaIEtNTE5NUE1VTlggV01YTlhPIEhQSU5KTUxNTU5OUE5WT1lRWyIsCisgIkddUlFRTlBNTk1MTktPSlJKVUtYTVpQW1RbV1pZWFpVWlJZT1hOVk1UTVNOUlEgTE9LUktVTFggWFhZVVlSWE8gTk1NTkxRTFZNWU5aUFsgVFtWWldZWFZYUVdOVk0gUlFRYiBSUVJhIFJRU2IgUWJTYiIsCisgIkhcXExNTU5OUFRfVmFYYlpiW2EgTk9PUFVfVmAgSU5KTUxNTk5QUFZfV2FYYiBWU1hQWU1aTVlPVlNOXFxLYEpiS2JMX05cXCIsCisgIkZdSE5JTkpQSlVLWE1aUFtUW1ZaWFhZVlpSWk5ZTVhNWVBZU1hXVlogSk5LUEtVTFggWE1ZTllPIEdQSE5JTUpNS05MUExWTVlOWlBbIFFGU2IgUkdSYSBTRlFiIFFGU0YgUWJTYiIsCisgIkZeTk1MTkpQSVNJV0pZS1pNW09bUVpSWVNXU1RSU1FUUVdSWVNaVVtXW1laWllbV1tTWlBYTlZNIEtQSlNKV0tZIFJUUlggWVlaV1pTWVAgTk1MT0tSS1dMWk1bIFdbWFpZV1lSWE9WTSIsCisgIkddV01VVFVYVlpXW1lbW1lcXFcgWE1WVFZaIFdNWU1XVFZYIFVUVVFUTlJNUE1NTktRSlRKVktZTFpOW1BbUlpTWVRXVVQgTk5MUUtUS1dMWSBQTU5PTVFMVExXTVpOWyIsCisgIklcXFBGTk1NU01XTllPWlFbU1tWWlhXWVRZUlhPV05VTVNNUU5QT09RTlQgUUZPTU5RTldPWiBWWVdXWFRYUVdPIE1GUkZQTU5UIFNbVVlWV1dUV1FWTlVNIE5GUUcgT0ZQSCIsCisgIklbV1FXUFZQVlJYUlhQV05VTVJNT05NUUxUTFZNWU5aUFtSW1VaV1cgT09OUU1UTVdOWSBSTVBPT1FOVE5XT1pQWyIsCisgIkddWUZWUVVVVVhWWldbWVtbWVxcVyBaRldRVlVWWiBWRltGV1RWWCBVVFVRVE5STVBNTU5LUUpUSlZLWUxaTltQW1JaU1lUV1VUIE1PTFFLVEtXTFkgUE1OT01RTFRMV01aTlsgV0ZaRyBYRllIIiwKKyAiSVtNVlFVVFRXUlhQV05VTVJNT05NUUxUTFZNWU5aUFtSW1VaV1ggT09OUU1UTVdOWSBSTVBPT1FOVE5XT1pQWyIsCisgIkpaWkhaR1lHWUlbSVtHWkZYRlZHVElTS1JOUVJPW05eTWBLYiBUSlNNUlJQW09eIFhGVkhVSlRNU1JRWlBdT19NYUtiSWJIYUhfSl9KYUlhSWAgTk1ZTSIsCisgIkhdWE1UW1NeUWFPYiBZTVVbU18gWE1aTVZbVF9SYU9iTGJKYUlgSV5LXktgSmBKXyBWVFZRVU5TTVFNTk5MUUtUS1ZMWU1aT1tRW1NaVFlVV1ZUIE5PTVFMVExXTVkgUU1PT05RTVRNV05aT1siLAorICJHXU9GSVtLWyBQRkpbIExGUUZLWyBNVE9QUU5TTVVNV05YUFhTVlggV05XUlZWVlogV1BVVVVYVlpXW1lbW1lcXFcgTUZQRyBORk9IIiwKKyAiS1hURlRIVkhWRlRGIFVGVUggVEdWRyBMUU1PT01RTVJOU1BTU1FYIFJOUlJRVlFaIFJQUFVQWFFaUltUW1ZZV1ciLAorICJLWFVGVUhXSFdGVUYgVkZWSCBVR1dHIE1RTk9QTVJNU05UUFRTUlpRXVBfTmFMYkpiSWFJX0tfS2FKYUpgIFNOU1NRWlBdT18gU1BSVFBbT15OYExiIiwKKyAiR11PRklbS1sgUEZKWyBMRlFGS1sgWU9ZTlhOWFBaUFpOWU1XTVVOUVJPUyBNU09TUVRSVVRZVVpXWiBRVVNZVFogT1NQVFJaU1tVW1daWVcgTUZQRyBORk9IIiwKKyAiTFhURlFRUFVQWFFaUltUW1ZZV1cgVUZSUVFVUVogUUZWRlJUUVggUkZVRyBTRlRIIiwKKyAiQGNBUUJPRE1GTUdOSFBIU0ZbIEdOR1NFWyBHUEZURFtGWyBIU0pQTE5OTVBNUk5TUFNTUVsgUk5SU1BbIFJQUVRPW1FbIFNTVVBXTllNW01dTl5QXlNcXFggXU5dUlxcVlxcWiBdUFtVW1hcXFpdW19bYVliVyIsCisgIkZeR1FIT0pNTE1NTk5QTlNMWyBNTk1TS1sgTVBMVEpbTFsgTlNQUFJOVE1WTVhOWVBZU1dYIFhOWFJXVldaIFhQVlVWWFdaWFtaW1xcWV1XIiwKKyAiSFxcUU1OTkxRS1RLVkxZTVpQW1NbVlpYV1lUWVJYT1dOVE1RTSBOT01RTFRMV01ZIFZZV1dYVFhRV08gUU1PT05RTVRNV05aUFsgU1tVWVZXV1RXUVZOVE0iLAorICJHXUhRSU9LTU1NTk5PUE9TTldLYiBOTk5TTVdKYiBOUE1USWIgT1RQUVFPUk5UTVZNWE5ZT1pSWlRZV1daVFtSW1BaT1dPVCBYT1lRWVRYV1dZIFZNV05YUVhUV1dWWVRbIEZiTmIgSmFHYiBKYEhiIEtgTGIgSmFNYiIsCisgIkdcXFdNUWIgWE1SYiBXTVlNU2IgVVRVUVROUk1QTU1OS1FKVEpWS1lMWk5bUFtSWlNZVFdVVCBNT0xRS1RLV0xZIFBNTk9NUUxUTFdNWk5bIE5iVmIgUmFPYiBSYFBiIFNgVGIgUmFVYiIsCisgIklbSlFLT01NT01QTlFQUVRPWyBQTlBUTlsgUFBPVE1bT1sgWU9ZTlhOWFBaUFpOWU1XTVVOU1BRVCIsCisgIkpbWFBYT1dPV1FZUVlPWE5VTVJNT05OT05RT1NRVFRVVlZXWCBPTk5RIE9SUVNUVFZVIFdWVlogTk9PUVFSVFNWVFdWV1hWWlNbUFtNWkxZTFdOV05ZTVlNWCIsCisgIktZVEZRUVBVUFhRWlJbVFtWWVdXIFVGUlFRVVFaIFRGVkZSVFFYIE5NWE0iLAorICJGXkdRSE9KTUxNTU5OUE5TTFggTU5NUkxWTFogTVBLVUtYTFpOW1BbUlpUWFZVIFhNVlVWWFdaWFtaW1xcWV1XIFlNV1VXWiBYTVpNWFRXWCIsCisgIkhcXElRSk9MTU5NT05QUFBTTlggT05PUk5WTlogT1BNVU1YTlpQW1JbVFpWWFhVWVFZTVhNWE5ZUCIsCisgIkNhRFFFT0dNSU1KTktQS1NJWCBKTkpSSVZJWiBKUEhVSFhJWktbTVtPWlFYUlUgVE1SVVJYU1pVW1dbWVpbWF1VXlFeTV1NXU5eUCBVTVNVU1ogVE1WTVRUU1giLAorICJHXUpRTE5OTVBNUk5TUFNSIFBNUU5RUlBWT1hNWktbSVtIWkhYSlhKWklaSVkgUk9SUlFWUVkgWk9aTllOWVBbUFtOWk1YTVZOVFBTUlJWUlpTWyBQVlBYUVpTW1VbV1pZVyIsCisgIkddSFFJT0tNTU1OTk9QT1NNWCBOTk5STVZNWiBOUExVTFhNWk9bUVtTWlVYV1QgWU1VW1ReUmFQYiBaTVZbVF8gWU1bTVdbVV9TYVBiTWJLYUpgSl5MXkxgS2BLXyIsCisgIkhcXFlNWE9WUU5XTFlLWyBYT09PTVBMUiBWT1JOT05OTyBWT1JNT01NT0xSIExZVVlXWFhWIE5ZUlpVWlZZIE5ZUltVW1dZWFYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJIXFxXUVZPVU5TTVFNTk5MUEtTS1VMWE5aUVtTW1ZaV1lYV1lTWU5YSldIVkdTRlFGTkdNSE5IT0dRRiBNUExSTFZNWCBWWVdXWFNYTldKVkggUU1PTk5PTVJNVk5ZT1pRWyBTW1VaVlhXVFdNVklVR1NGIiwKKyAiSVtVTVdOWE9ZT1hOVU1STU9OTVBMU0xVTVhPWlJbVVtYWllZWFlXWlVbIE5QTVNNVU5YIFJNUE5PT05STlZPWVBaUlsgTlRUVVVUVFNOVCBOVFRUIiwKKyAiSFxcUUZOR0xKS09LUkxXTlpRW1NbVlpYV1lSWU9YSlZHU0ZRRiBOSE1KTE5MU01XTlkgVllXV1hTWE5XSlZIIFFGT0dOSU1OTVNOWE9aUVsgU1tVWlZYV1NXTlZJVUdTRiBMUFhRIExRWFAiLAorICJHXVBNTU5LUEpTSlVLWE1aUFtUW1daWVhaVVpTWVBXTlRNUE0gTFBLU0tVTFggWFhZVVlTWFAgUE1OTk1PTFJMVk1ZTlpQW1RbVlpXWVhWWFJXT1ZOVE0gUUZTYiBSR1JhIFNGUWIgUUZTRiBRYlNiIiwKKyAiSFxcVE1WTlhQWVBZT1dOVE1QTU1OTE9LUUtTTFVOV1BYUllTWlRcXFReU19RX09eUF5RXyBNT0xRTFNNVU9XIFBNTk5NUE1TTlVSWSBZUFhPIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiTlYiLAorICJKWiIsCisgIkhcXFFGTkdMSktPS1JMV05aUVtTW1ZaWFdZUllPWEpWR1NGUUYgTkhNSkxOTFNNV05ZIFZZV1dYU1hOV0pWSCBRRk9HTklNTk1TTlhPWlFbIFNbVVpWWFdTV05WSVVHU0YiLAorICJIXFxRSFFbIFJIUlogU0ZTWyBTRlBJTkogTVtXWyBRWk9bIFFZUFsgU1lUWyBTWlVbIiwKKyAiSFxcTEpMS01LTUpMSiBMSU1JTkpOS01MTExLS0tKTEhNR1BGVEZXR1hIWUpZTFhOVVBQUk5TTFVLWEtbIFdIWEpYTFdOIFRGVkdXSldMVk5UUFBSIEtZTFhOWFNZV1lZWCBOWFNaV1pYWSBOWFNbV1tYWllYWVYiLAorICJIXFxMSkxLTUtNSkxKIExJTUlOSk5LTUxMTEtLS0pMSE1HUEZURldHWElYTFdOVE8gVkdXSVdMVk4gU0ZVR1ZJVkxVTlNPIFFPVE9WUFhSWVRZV1hZV1pUW1BbTVpMWUtXS1ZMVU1VTlZOV01YTFggV1JYVFhXV1kgU09VUFZRV1RXV1ZaVFsgTFZMV01XTVZMViIsCisgIkhcXFNJU1sgVEhUWiBVRlVbIFVGSlVaVSBQW1hbIFNaUVsgU1lSWyBVWVZbIFVaV1siLAorICJIXFxNRktQTU5QTVNNVk5YUFlTWVVYWFZaU1tQW01aTFlLV0tWTFVNVU5WTldNWExYIFdQWFJYVldYIFNNVU5WT1dSV1ZWWVVaU1sgTFZMV01XTVZMViBNRldGIE1HVUcgTUhRSFVHV0YiLAorICJIXFxWSVZKV0pXSVZJIFdIVkhVSVVKVktXS1hKWElXR1VGUkZPR01JTEtLT0tVTFhOWlFbU1tWWlhYWVVZVFhRVk9TTlFOT09OUE1SIE5JTUtMT0xVTVhOWSBXWFhWWFNXUSBSRlBHT0hOSk1OTVVOWE9aUVsgU1tVWlZZV1ZXU1ZQVU9TTiIsCisgIkhcXEtGS0wgWUZZSVhMVFFTU1JXUlsgU1JSVFFXUVsgWExTUVFUUFdQW1JbIEtKTEhORlBGVUlXSVhIWUYgTUhOR1BHUkggS0pMSU5IUEhVSSIsCisgIkhcXFBGTUdMSUxMTU5QT1RPV05YTFhJV0dURlBGIE5HTUlNTE5OIFZOV0xXSVZHIFBGT0dOSU5MT05QTyBUT1VOVkxWSVVHVEYgUE9NUExRS1NLV0xZTVpQW1RbV1pYWVlXWVNYUVdQVE8gTVFMU0xXTVkgV1lYV1hTV1EgUE9OUE1TTVdOWlBbIFRbVlpXV1dTVlBUTyIsCisgIkhcXE1XTVhOWE5XTVcgV09WUVVSU1NRU05STFBLTUtMTElOR1FGU0ZWR1hJWUxZUlhWV1hVWlJbT1tNWkxYTFdNVk5WT1dPWE5ZTVkgTVBMTkxLTUkgVkhXSVhMWFJXVlZYIFFTT1JOUU1OTUtOSE9HUUYgU0ZVR1ZJV0xXU1ZXVVlUWlJbIiwKKyAiTVhSWFFZUVpSW1NbVFpUWVNYUlggUllSWlNaU1lSWSIsCisgIk1YVFpTW1JbUVpRWVJYU1hUWVRcXFNeUV8gUllSWlNaU1lSWSBTW1RcXCBUWlNeIiwKKyAiTVhSTVFOUU9SUFNQVE9UTlNNUk0gUk5ST1NPU05STiBSWFFZUVpSW1NbVFpUWVNYUlggUllSWlNaU1lSWSIsCisgIk1YUk1RTlFPUlBTUFRPVE5TTVJNIFJOUk9TT1NOUk4gVFpTW1JbUVpRWVJYU1hUWVRcXFNeUV8gUllSWlNaU1lSWSBTW1RcXCBUWlNeIiwKKyAiTVhSRlFHUUlSUSBSRlJUU1QgUkZTRlNUIFNGVEdUSVNRIFJYUVlRWlJbU1tUWlRZU1hSWCBSWVJaU1pTWVJZIiwKKyAiSVxcTUtNSk5KTkxMTExKTUhOR1BGVEZXR1hIWUpZTFhOV09TUSBXSFhJWE1XTiBURlZHV0lXTVZPVVAgUlFSVFNUU1FSUSBSWFFZUVpSW1NbVFpUWVNYUlggUllSWlNaU1lSWSIsCisgIk1YVEZSR1FJUUxSTVNNVExUS1NKUkpRSyBSS1JMU0xTS1JLIFJHUUsgUUlSSiIsCisgIk1YVEhTSVJJUUhRR1JGU0ZUR1RKU0xRTSBSR1JIU0hTR1JHIFNJVEogVEhTTCIsCisgIkVfW09bTlpOWlBcXFBcXE5bTVpNWU5YUFZVVFhSWlBbTFtKWklYSVVKU1BPUk1TS1NJUkdQRk5HTUlNTE5PUFJUV1daWVtbW1xcWVxcWCBLWkpYSlVLU0xSIFJNU0kgU0tSRyBOR01LIE5OUFFUVldZWVogTltMWktYS1VMU1BPIE1JTk1RUVVWWFlaWltaXFxZIiwKKyAiSFxcUEJQXyBUQlRfIFhLWEpXSldMWUxZSlhIV0dURlBGTUdLSUtMTE5PUFVSV1NYVVhYV1ogTExNTk9PVVFXUlhUIE1HTElMS01NT05VUFhSWVRZV1hZV1pUW1BbTVpMWUtXS1VNVU1XTFdMViIsCisgIkdeW0JJYkpiIFtCXFxCSmIiLAorICJLWVVCU0RRR09LTlBOVE9ZUV1TYFViIFFIUEtPT09VUFlRXFwgU0RSRlFJUE9QVVFbUl5TYCIsCisgIktZT0JRRFNHVUtWUFZUVVlTXVFgT2IgU0hUS1VPVVVUWVNcXCBRRFJGU0lUT1RVU1tSXlFgIiwKKyAiSlpSRlFHU1FSUiBSRlJSIFJGU0dRUVJSIE1JTklWT1dPIE1JV08gTUlNSldOV08gV0lWSU5PTU8gV0lNTyBXSVdKTU5NTyIsCisgIkZfSlFbUVtSIEpRSlJbUiIsCisgIkZfUklSWlNaIFJJU0lTWiBKUVtRW1IgSlFKUltSIiwKKyAiRl9KTVtNW04gSk1KTltOIEpVW1VbViBKVUpWW1YiLAorICJOV1NGUkdSTSBTR1JNIFNGVEdSTSIsCisgIklbTkZNR01NIE5HTU0gTkZPR01NIFdGVkdWTSBXR1ZNIFdGWEdWTSIsCisgIktZUUZPR05JTktPTVFOU05VTVZLVklVR1NGUUYgUUZOSU9NU05WS1VHUUYgU0ZPR05LUU5VTVZJU0YiLAorICJGXlpJSlJaWyBaSVpKTFJaWlpbIiwKKyAiRl5KSVpSSlsgSklKSlhSSlpKWyIsCisgIkdeT0ZPYlBiIE9GUEZQYiBVRlViVmIgVUZWRlZiIEpQW1BbUSBKUEpRW1EgSldbV1tYIEpXSlhbWCIsCisgIkZeW0ZZR1ZIU0hQR05GTEZKR0lJSUtLTU1NT0xQSlBITkYgW0ZIWyBbRklbIFtGSlsgWVRXVFVVVFdUWVZbWFtaWltYW1ZZVCBPR0xGSUlKTE1NUEpPRyBORkpHSUsgS01PTFBIIFpVV1RUV1VaWFtbWFpVIFlUVVVUWSBWW1paW1YgSFtKWyIsCisgIkVgVk5VTFNLUUtPTE5NTU9NUk5UT1VRVlNWVVVWUyBPTU5PTlJPVCBRS1BMT09PUlBVUVYgVktWU1dVWVZaVlxcVV1SXU9cXExbSllIV0dURlFGTkdMSEpKSUxIT0hSSVVKV0xZTlpRW1RbV1pZWVhZV1ogV0xXU1hVIFZLWEtYU1lVWlYiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICIiLAorICJOViIsCisgIkpaIiwKKyAiSF1URlFHT0lNTExPS1NLVkxZTVpPW1FbVFpWWFhVWVJaTlpLWUhYR1ZGVEYgUUhPSk5MTU9MU0xXTVkgVFlWV1dVWFJZTllKWEggVEZSR1BKT0xOT01TTVhOWk9bIFFbU1pVV1ZVV1JYTlhJV0dWRiIsCisgIkhdVEpPW1FbIFdGVUpQWyBXRlFbIFdGVElRS09MIFRKUktPTCIsCisgIkhdT0tPSlBKUExOTE5KT0hQR1NGVkZZR1pJWktZTVdPTVVLV0lbIFhHWUlZS1hNVk9TUSBWRldHWElYS1dNVU9NVSBKWUtYTVhSWVdZWFggTVhSWldaIE1YUltVW1daWFhYVyIsCisgIkhdT0tPSlBKUExOTE5KT0hQR1NGVkZZR1pJWktZTVhOVk9TUCBYR1lJWUtYTVdOIFZGV0dYSVhLV01VT1NQIFFQU1BWUVdSWFRYV1dZVVpSW09bTFpLWUpXSlVMVUxXS1dLViBWUldUV1dWWSBTUFVRVlNWV1VZVFpSWyIsCisgIkhdV0pSW1RbIFpGWEpTWyBaRlRbIFpGSlVaVSIsCisgIkhdUUZMUCBRRltGIFFHWUcgUEhVSFlHW0YgTFBNT1BOU05WT1dQWFJYVVdYVVpRW05bTFpLWUpXSlVMVUxXS1dLViBWUFdSV1VWWFRaIFNOVU9WUVZVVVhTWlFbIiwKKyAiSF1ZSllJWElYS1pLWklZR1dGVEZRR09JTUxMT0tTS1ZMWU1aT1tSW1VaV1hYVlhTV1FWUFRPUU9PUE5RTVMgUElOTE1PTFNMV01ZIFZYV1ZXU1ZRIFRGUkdQSk9MTk9NU01YTlpPWyBSW1RaVVlWVlZSVVBUTyIsCisgIkhdTkZMTCBbRlpJWExUUVJUUVdQWyBSU1BXT1sgWExSUlBVT1dOW1BbIE1JUEZSRldJIE9HUkdXSSBNSU9IUkhXSVlJWkhbRiIsCisgIkhdU0ZQR09ITkpOTU9PUVBUUFdPWU5aTFpJWUdXRlNGIFVGUEcgUEhPSk9OUE8gT09SUCBTUFdPIFhOWUxZSVhHIFlHVUYgU0ZRSFBKUE5RUCBUUFZPV05YTFhIV0YgUVBNUUtTSlVKWEtaTltSW1ZaV1lYV1hUV1JWUVRQIFJQTVEgTlFMU0tVS1hMWiBLWlBbVlogVllXV1dUVlIgVlFTUCBRUE9RTVNMVUxYTVpOWyBSW1RaVVlWV1ZTVVFUUCIsCisgIkhdWE5XUFZRVFJRUk9RTlBNTk1LTklQR1NGVkZYR1lIWktaTllSWFVWWFRaUVtOW0xaS1hLVk1WTVhMWExXIE9QTk5OS09JIFhIWUpZTlhSV1VVWCBRUlBRT09PS1BIUUdTRiBWRldHWElYTldSVlVVV1NaUVsiLAorICJNWFBYT1lPWlBbUVtSWlJZUVhQWCBQWVBaUVpRWVBZIiwKKyAiTVhRW1BbT1pPWVBYUVhSWVJbUV1QXk5fIFBZUFpRWlFZUFkgUVtRXFxQXiIsCisgIk1YU01STlJPU1BUUFVPVU5UTVNNIFNOU09UT1ROU04gUFhPWU9aUFtRW1JaUllRWFBYIFBZUFpRWlFZUFkiLAorICJNWFNNUk5ST1NQVFBVT1VOVE1TTSBTTlNPVE9UTlNOIFFbUFtPWk9ZUFhRWFJZUltRXVBeTl8gUFlQWlFaUVlQWSBRW1FcXFBeIiwKKyAiTVhWRlVGVEdSVCBWR1VHUlQgVkdWSFJUIFZGV0dXSFJUIFBYT1lPWlBbUVtSWlJZUVhQWCBQWVBaUVpRWVBZIiwKKyAiSF1PS09KUEpQTE5MTkpPSFBHU0ZXRlpHW0lbS1pNWU5XT1NQUVFRU1NUVFQgVUZaRyBZR1pJWktZTVhOVk8gV0ZYR1lJWUtYTVdOU1BSUVJTU1QgUFhPWU9aUFtRW1JaUllRWFBYIFBZUFpRWlFZUFkiLAorICJNWFdGVUdUSFNKU0xUTVVNVkxWS1VKVEogVUdUSVRKIFRLVExVTFVLVEsiLAorICJNWFZJVUlUSFRHVUZWRldHV0lWS1VMU00gVUdVSFZIVkdVRyBWSVZKVUwiLAorICJFX1xcT1xcTltOW1BdUF1OXFxNW01ZTldQUlhQWk5bS1tIWkdYR1ZIVElTS1JQUFJPVE1VS1VJVEdSRlBHT0lPTFBSUVVSV1RaVltYW1lZWVggTFtIWiBJWkhYSFZJVEpTTFIgUFBRU1RZVlogS1tKWklYSVZKVEtTTVJSTyBPTFBPUVJTVlVZV1pYWllZIiwKKyAiSF1UQkxfIFlCUV8gWktaSllKWUxbTFtKWkhZR1ZGUkZPR01JTUxOTlBQVlNXVVdYVlogTkxPTlZSV1QgT0dOSU5LT01VUFdSWFRYV1dZVlpTW09bTFpLWUpXSlVMVUxXS1dLViIsCisgIkdeX0JFYkZiIF9CYEJGYiIsCisgIkpaWkJYQ1VFUkhQS05PTVNNWE5cXE9fUWIgU0hRS09PTlROXFwgWkJXRFRHUkpRTFBPT1NOXFwgTlRPXVBgUWIiLAorICJKWlNCVUVWSFdMV1FWVVRZUlxcT19MYUpiIFZIVlBVVVNZUVxcIFNCVERVR1ZQIFZIVVFUVVNYUlpQXU1gSmIiLAorICJKW1RGU0dVUVRSIFRGVFIgVEZVR1NRVFIgT0lQSVhPWU8gT0lZTyBPSU9KWU5ZTyBZSVhJUE9PTyBZSU9PIFlJWUpPTk9PIiwKKyAiRl9KUVtRW1IgSlFKUltSIiwKKyAiRl9SSVJaU1ogUklTSVNaIEpRW1FbUiBKUUpSW1IiLAorICJGX0pNW01bTiBKTUpOW04gSlVbVVtWIEpVSlZbViIsCisgIk1XVUZUR1JNIFVHUk0gVUZWR1JNIiwKKyAiSFxcUEZPR01NIFBHTU0gUEZRR01NIFpGWUdXTSBaR1dNIFpGW0dXTSIsCisgIktaU0ZRR1BJUEtRTVNOVU5XTVhLWElXR1VGU0YgU0ZQSVFNVU5YS1dHU0YgVUZRR1BLU05XTVhJVUYiLAorICJGXlpJSlJaWyBaSVpKTFJaWlpbIiwKKyAiRl5KSVpSSlsgSklKSlhSSlpKWyIsCisgIkdeU0ZLYkxiIFNGVEZMYiBZRlFiUmIgWUZaRlJiIEtQXFxQXFxRIEtQS1FcXFEgSVdaV1pYIElXSVhaWCIsCisgIkVeXkZcXEdYSFVIUUdPRk1GS0dKSUpLTE1OTVBMUUpRSE9GIF5GRVsgXkZGWyBeRkdbIFhUVlRUVVNXU1lVW1dbWVpaWFpWWFQgUEdNRkpJS0xOTVFKUEcgT0ZLR0pLIExNUExRSCBZVVZUU1dUWldbWlhZVSBYVFRVU1kgVVtZWlpWIEVbR1siLAorICJFYFVRVU5UTFJLUEtOTE1NTFBMU01VT1ZRVlNVVFRVUSBPTE5NTVBNU05VIFJLUExPTU5QTlNPVVBWIFZLVVFVU1ZVWFZaVlxcVV1SXU9cXExbSllIV0dURlFGTkdMSEpKSUxIT0hSSVVKV0xZTlpRW1RbV1pZWVhZV1ogV0tWUVZTV1UgVktYS1dRV1NYVVpWIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAiIiwKKyAwIH07CmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4cGVyc2lzdGVuY2UuY3BwIGIvY3hjb3JlL3NyYy9jeHBlcnNpc3RlbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWVmYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeHBlcnNpc3RlbmNlLmNwcApAQCAtMCwwICsxLDUyNTAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb24gbWFjcm9zIGFuZCB0eXBlIGRlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBjdl9pc3ByaW50KGMpICAgICAoKHNpZ25lZCBjaGFyKShjKSA+PSAoc2lnbmVkIGNoYXIpJyAnKQorI2RlZmluZSBjdl9pc3ByaW50X29yX3RhYihjKSAgKChzaWduZWQgY2hhcikoYykgPj0gKHNpZ25lZCBjaGFyKScgJyB8fCAoYykgPT0gJ1x0JykKKworc3RhdGljIGNoYXIqIGljdl9pdG9hKCBpbnQgX3ZhbCwgY2hhciogYnVmZmVyLCBpbnQgLypyYWRpeCovICkKK3sKKyAgICBjb25zdCBpbnQgcmFkaXggPSAxMDsKKyAgICBjaGFyKiBwdHI9YnVmZmVyICsgMjMgLyogZW5vdWdoIGV2ZW4gZm9yIDY0LWJpdCBpbnRlZ2VycyAqLzsKKyAgICB1bnNpZ25lZCB2YWwgPSBhYnMoX3ZhbCk7CisKKyAgICAqcHRyID0gJ1wwJzsKKyAgICBkbworICAgIHsKKyAgICAgICAgdW5zaWduZWQgciA9IHZhbCAvIHJhZGl4OworICAgICAgICAqLS1wdHIgPSAoY2hhcikodmFsIC0gKHIqcmFkaXgpICsgJzAnKTsKKyAgICAgICAgdmFsID0gcjsKKyAgICB9CisgICAgd2hpbGUoIHZhbCAhPSAwICk7CisKKyAgICBpZiggX3ZhbCA8IDAgKQorICAgICAgICAqLS1wdHIgPSAnLSc7CisKKyAgICByZXR1cm4gcHRyOworfQorCisKK3R5cGVkZWYgc3RydWN0IEN2R2VuZXJpY0hhc2gKK3sKKyAgICBDVl9TRVRfRklFTERTKCkKKyAgICBpbnQgdGFiX3NpemU7CisgICAgdm9pZCoqIHRhYmxlOworfQorQ3ZHZW5lcmljSGFzaDsKKwordHlwZWRlZiBDdkdlbmVyaWNIYXNoIEN2U3RyaW5nSGFzaDsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZGaWxlTWFwTm9kZQoreworICAgIEN2RmlsZU5vZGUgdmFsdWU7CisgICAgY29uc3QgQ3ZTdHJpbmdIYXNoTm9kZSoga2V5OworICAgIHN0cnVjdCBDdkZpbGVNYXBOb2RlKiBuZXh0OworfQorQ3ZGaWxlTWFwTm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZYTUxTdGFja1JlY29yZAoreworICAgIEN2TWVtU3RvcmFnZVBvcyBwb3M7CisgICAgQ3ZTdHJpbmcgc3RydWN0X3RhZzsKKyAgICBpbnQgc3RydWN0X2luZGVudDsKKyAgICBpbnQgc3RydWN0X2ZsYWdzOworfQorQ3ZYTUxTdGFja1JlY29yZDsKKworI2RlZmluZSBDVl9YTUxfT1BFTklOR19UQUcgMQorI2RlZmluZSBDVl9YTUxfQ0xPU0lOR19UQUcgMgorI2RlZmluZSBDVl9YTUxfRU1QVFlfVEFHIDMKKyNkZWZpbmUgQ1ZfWE1MX0hFQURFUl9UQUcgNAorI2RlZmluZSBDVl9YTUxfRElSRUNUSVZFX1RBRyA1CisKKy8vdHlwZWRlZiB2b2lkICgqQ3ZQYXJzZSkoIHN0cnVjdCBDdkZpbGVTdG9yYWdlKiBmcyApOwordHlwZWRlZiB2b2lkICgqQ3ZTdGFydFdyaXRlU3RydWN0KSggc3RydWN0IEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RydWN0X2ZsYWdzLCBjb25zdCBjaGFyKiB0eXBlX25hbWUgKTsKK3R5cGVkZWYgdm9pZCAoKkN2RW5kV3JpdGVTdHJ1Y3QpKCBzdHJ1Y3QgQ3ZGaWxlU3RvcmFnZSogZnMgKTsKK3R5cGVkZWYgdm9pZCAoKkN2V3JpdGVJbnQpKCBzdHJ1Y3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlICk7Cit0eXBlZGVmIHZvaWQgKCpDdldyaXRlUmVhbCkoIHN0cnVjdCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBkb3VibGUgdmFsdWUgKTsKK3R5cGVkZWYgdm9pZCAoKkN2V3JpdGVTdHJpbmcpKCBzdHJ1Y3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YWx1ZSwgaW50IHF1b3RlICk7Cit0eXBlZGVmIHZvaWQgKCpDdldyaXRlQ29tbWVudCkoIHN0cnVjdCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogY29tbWVudCwgaW50IGVvbF9jb21tZW50ICk7Cit0eXBlZGVmIHZvaWQgKCpDdlN0YXJ0TmV4dFN0cmVhbSkoIHN0cnVjdCBDdkZpbGVTdG9yYWdlKiBmcyApOworCit0eXBlZGVmIHN0cnVjdCBDdkZpbGVTdG9yYWdlCit7CisgICAgaW50IGZsYWdzOworICAgIGludCBpc194bWw7CisgICAgaW50IHdyaXRlX21vZGU7CisgICAgaW50IGlzX2ZpcnN0OworICAgIEN2TWVtU3RvcmFnZSogbWVtc3RvcmFnZTsKKyAgICBDdk1lbVN0b3JhZ2UqIGRzdHN0b3JhZ2U7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdHJzdG9yYWdlOworICAgIEN2U3RyaW5nSGFzaCogc3RyX2hhc2g7CisgICAgQ3ZTZXEqIHJvb3RzOworICAgIEN2U2VxKiB3cml0ZV9zdGFjazsKKyAgICBpbnQgc3RydWN0X2luZGVudDsKKyAgICBpbnQgc3RydWN0X2ZsYWdzOworICAgIEN2U3RyaW5nIHN0cnVjdF90YWc7CisgICAgaW50IHNwYWNlOworICAgIGNoYXIqIGZpbGVuYW1lOworICAgIEZJTEUqIGZpbGU7CisgICAgY2hhciogYnVmZmVyOworICAgIGNoYXIqIGJ1ZmZlcl9zdGFydDsKKyAgICBjaGFyKiBidWZmZXJfZW5kOworICAgIGludCB3cmFwX21hcmdpbjsKKyAgICBpbnQgbGluZW5vOworICAgIGludCBkdW1teV9lb2Y7CisgICAgY29uc3QgY2hhciogZXJybXNnOworICAgIGNoYXIgZXJybXNnYnVmWzEyOF07CisKKyAgICBDdlN0YXJ0V3JpdGVTdHJ1Y3Qgc3RhcnRfd3JpdGVfc3RydWN0OworICAgIEN2RW5kV3JpdGVTdHJ1Y3QgZW5kX3dyaXRlX3N0cnVjdDsKKyAgICBDdldyaXRlSW50IHdyaXRlX2ludDsKKyAgICBDdldyaXRlUmVhbCB3cml0ZV9yZWFsOworICAgIEN2V3JpdGVTdHJpbmcgd3JpdGVfc3RyaW5nOworICAgIEN2V3JpdGVDb21tZW50IHdyaXRlX2NvbW1lbnQ7CisgICAgQ3ZTdGFydE5leHRTdHJlYW0gc3RhcnRfbmV4dF9zdHJlYW07CisgICAgLy9DdlBhcnNlIHBhcnNlOworfQorQ3ZGaWxlU3RvcmFnZTsKKworCisjZGVmaW5lIENWX1lNTF9JTkRFTlQgIDMKKyNkZWZpbmUgQ1ZfWE1MX0lOREVOVCAgMgorI2RlZmluZSBDVl9ZTUxfSU5ERU5UX0ZMT1cgIDEKKyNkZWZpbmUgQ1ZfRlNfTUFYX0xFTiA0MDk2CisKKyNkZWZpbmUgQ1ZfRklMRV9TVE9SQUdFICgnWScgKyAoJ0EnIDw8IDgpICsgKCdNJyA8PCAxNikgKyAoJ0wnIDw8IDI0KSkKKyNkZWZpbmUgQ1ZfSVNfRklMRV9TVE9SQUdFKGZzKSAoKGZzKSAhPSAwICYmIChmcyktPmZsYWdzID09IENWX0ZJTEVfU1RPUkFHRSkKKworI2RlZmluZSBDVl9DSEVDS19GSUxFX1NUT1JBR0UoZnMpICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIUNWX0lTX0ZJTEVfU1RPUkFHRShmcykgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9FUlJPUiggKGZzKSA/IENWX1N0c0JhZEFyZyA6IENWX1N0c051bGxQdHIsICBcCisgICAgICAgICAgICAgICAgICAiSW52YWxpZCBwb2ludGVyIHRvIGZpbGUgc3RvcmFnZSIgKTsgIFwKK30KKworI2RlZmluZSBDVl9DSEVDS19PVVRQVVRfRklMRV9TVE9SQUdFKGZzKSAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9DSEVDS19GSUxFX1NUT1JBR0UoZnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCAhZnMtPndyaXRlX21vZGUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBmaWxlIHN0b3JhZ2UgaXMgb3BlbmVkIGZvciByZWFkaW5nIiApOyBcCit9CisKK0NWX0lNUEwgY29uc3QgY2hhcioKK2N2QXR0clZhbHVlKCBjb25zdCBDdkF0dHJMaXN0KiBhdHRyLCBjb25zdCBjaGFyKiBhdHRyX25hbWUgKQoreworICAgIHdoaWxlKCBhdHRyICYmIGF0dHItPmF0dHIgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciggaSA9IDA7IGF0dHItPmF0dHJbaSoyXSAhPSAwOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3RyY21wKCBhdHRyX25hbWUsIGF0dHItPmF0dHJbaSoyXSApID09IDAgKQorICAgICAgICAgICAgICAgIHJldHVybiBhdHRyLT5hdHRyW2kqMisxXTsKKyAgICAgICAgfQorICAgICAgICBhdHRyID0gYXR0ci0+bmV4dDsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCitzdGF0aWMgQ3ZHZW5lcmljSGFzaCoKK2N2Q3JlYXRlTWFwKCBpbnQgZmxhZ3MsIGludCBoZWFkZXJfc2l6ZSwgaW50IGVsZW1fc2l6ZSwKKyAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIGludCBzdGFydF90YWJfc2l6ZSApCit7CisgICAgQ3ZHZW5lcmljSGFzaCogbWFwID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZDcmVhdGVNYXAiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggaGVhZGVyX3NpemUgPCAoaW50KXNpemVvZihDdkdlbmVyaWNIYXNoKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAiVG9vIHNtYWxsIG1hcCBoZWFkZXJfc2l6ZSIgKTsKKworICAgIGlmKCBzdGFydF90YWJfc2l6ZSA8PSAwICkKKyAgICAgICAgc3RhcnRfdGFiX3NpemUgPSAxNjsKKworICAgIENWX0NBTEwoIG1hcCA9IChDdkdlbmVyaWNIYXNoKiljdkNyZWF0ZVNldCggZmxhZ3MsIGhlYWRlcl9zaXplLCBlbGVtX3NpemUsIHN0b3JhZ2UgKSk7CisKKyAgICBtYXAtPnRhYl9zaXplID0gc3RhcnRfdGFiX3NpemU7CisgICAgc3RhcnRfdGFiX3NpemUgKj0gc2l6ZW9mKG1hcC0+dGFibGVbMF0pOworICAgIENWX0NBTEwoIG1hcC0+dGFibGUgPSAodm9pZCoqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBzdGFydF90YWJfc2l6ZSApKTsKKyAgICBtZW1zZXQoIG1hcC0+dGFibGUsIDAsIHN0YXJ0X3RhYl9zaXplICk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICAgICAgbWFwID0gMDsKKworICAgIHJldHVybiBtYXA7Cit9CisKKworI2RlZmluZSBDVl9QQVJTRV9FUlJPUiggZXJybXNnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpY3ZQYXJzZUVycm9yKCBmcywgY3ZGdW5jTmFtZSwgKGVycm1zZyksIF9fRklMRV9fLCBfX0xJTkVfXyApOyAgXAorICAgIEVYSVQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworc3RhdGljIHZvaWQKK2ljdlBhcnNlRXJyb3IoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBmdW5jX25hbWUsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJfbXNnLCBjb25zdCBjaGFyKiBzb3VyY2VfZmlsZSwgaW50IHNvdXJjZV9saW5lICkKK3sKKyAgICBjaGFyIGJ1ZlsxPDwxMF07CisgICAgc3ByaW50ZiggYnVmLCAiJXMoJWQpOiAlcyIsIGZzLT5maWxlbmFtZSwgZnMtPmxpbmVubywgZXJyX21zZyApOworICAgIGN2RXJyb3IoIENWX1N0c1BhcnNlRXJyb3IsIGZ1bmNfbmFtZSwgYnVmLCBzb3VyY2VfZmlsZSwgc291cmNlX2xpbmUgKTsKK30KKworCitzdGF0aWMgdm9pZAoraWN2RlNDcmVhdGVDb2xsZWN0aW9uKCBDdkZpbGVTdG9yYWdlKiBmcywgaW50IHRhZywgQ3ZGaWxlTm9kZSogY29sbGVjdGlvbiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZGU0NyZWF0ZUNvbGxlY3Rpb24iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggQ1ZfTk9ERV9JU19NQVAodGFnKSApCisgICAgeworICAgICAgICBpZiggY29sbGVjdGlvbi0+dGFnICE9IENWX05PREVfTk9ORSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGFzc2VydCggZnMtPmlzX3htbCAhPSAwICk7CisgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlNlcXVlbmNlIGVsZW1lbnQgc2hvdWxkIG5vdCBoYXZlIG5hbWUgKHVzZSA8Xz48L18+KSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIENWX0NBTEwoIGNvbGxlY3Rpb24tPmRhdGEubWFwID0gY3ZDcmVhdGVNYXAoIDAsIHNpemVvZihDdkZpbGVOb2RlSGFzaCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEN2RmlsZU1hcE5vZGUpLCBmcy0+bWVtc3RvcmFnZSwgMTYgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2U2VxKiBzZXE7CisgICAgICAgIENWX0NBTEwoIHNlcSA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZGaWxlTm9kZSksIGZzLT5tZW1zdG9yYWdlICkpOworCisgICAgICAgIC8vIGlmIDxjb2xsZWN0aW9uPiBjb250YWlucyBzb21lIHNjYWxhciBlbGVtZW50LCBhZGQgaXQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgY29sbGVjdGlvbgorICAgICAgICBpZiggQ1ZfTk9ERV9UWVBFKGNvbGxlY3Rpb24tPnRhZykgIT0gQ1ZfTk9ERV9OT05FICkKKyAgICAgICAgICAgIGN2U2VxUHVzaCggc2VxLCBjb2xsZWN0aW9uICk7CisKKyAgICAgICAgY29sbGVjdGlvbi0+ZGF0YS5zZXEgPSBzZXE7CisgICAgfQorCisgICAgY29sbGVjdGlvbi0+dGFnID0gdGFnOworICAgIGN2U2V0U2VxQmxvY2tTaXplKCBjb2xsZWN0aW9uLT5kYXRhLnNlcSwgOCApOworCisgICAgX19FTkRfXzsKK30KKworCisvKnN0YXRpYyB2b2lkCitpY3ZGU1JlbGVhc2VDb2xsZWN0aW9uKCBDdlNlcSogc2VxICkKK3sKKyAgICBpZiggc2VxICkKKyAgICB7CisgICAgICAgIGludCBpc19tYXAgPSBDVl9JU19TRVQoc2VxKTsKKyAgICAgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgICAgICBpbnQgaSwgdG90YWwgPSBzZXEtPnRvdGFsOworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyLCAwICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZpbGVOb2RlKiBub2RlID0gKEN2RmlsZU5vZGUqKXJlYWRlci5wdHI7CisKKyAgICAgICAgICAgIGlmKCAoIWlzX21hcCB8fCBDVl9JU19TRVRfRUxFTSggbm9kZSApKSAmJiBDVl9OT0RFX0lTX0NPTExFQ1RJT04obm9kZS0+dGFnKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIENWX05PREVfSVNfVVNFUihub2RlLT50YWcpICYmIG5vZGUtPmluZm8gJiYgbm9kZS0+ZGF0YS5vYmouZGVjb2RlZCApCisgICAgICAgICAgICAgICAgICAgIGN2UmVsZWFzZSggKHZvaWQqKikmbm9kZS0+ZGF0YS5vYmouZGVjb2RlZCApOworICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9TRVFfSVNfU0lNUExFKCBub2RlLT5kYXRhLnNlcSApKQorICAgICAgICAgICAgICAgICAgICBpY3ZGU1JlbGVhc2VDb2xsZWN0aW9uKCBub2RlLT5kYXRhLnNlcSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorfSovCisKKworc3RhdGljIGNoYXIqCitpY3ZGU0RvUmVzaXplKCBDdkZpbGVTdG9yYWdlKiBmcywgY2hhciogcHRyLCBpbnQgbGVuICkKK3sKKyAgICBjaGFyKiBuZXdfcHRyID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImljdkZTRG9SZXNpemUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgd3JpdHRlbl9sZW4gPSAoaW50KShwdHIgLSBmcy0+YnVmZmVyX3N0YXJ0KTsKKyAgICBpbnQgbmV3X3NpemUgPSAoaW50KSgoZnMtPmJ1ZmZlcl9lbmQgLSBmcy0+YnVmZmVyX3N0YXJ0KSozLzIpOworICAgIG5ld19zaXplID0gTUFYKCB3cml0dGVuX2xlbiArIGxlbiwgbmV3X3NpemUgKTsKKyAgICBDVl9DQUxMKCBuZXdfcHRyID0gKGNoYXIqKWN2QWxsb2MoIG5ld19zaXplICsgMjU2ICkpOworICAgIGZzLT5idWZmZXIgPSBuZXdfcHRyICsgKGZzLT5idWZmZXIgLSBmcy0+YnVmZmVyX3N0YXJ0KTsKKyAgICBpZiggd3JpdHRlbl9sZW4gPiAwICkKKyAgICAgICAgbWVtY3B5KCBuZXdfcHRyLCBmcy0+YnVmZmVyX3N0YXJ0LCB3cml0dGVuX2xlbiApOworICAgIGZzLT5idWZmZXJfc3RhcnQgPSBuZXdfcHRyOworICAgIGZzLT5idWZmZXJfZW5kID0gZnMtPmJ1ZmZlcl9zdGFydCArIG5ld19zaXplOworICAgIG5ld19wdHIgKz0gd3JpdHRlbl9sZW47CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG5ld19wdHI7Cit9CisKKworaW5saW5lIGNoYXIqIGljdkZTUmVzaXplV3JpdGVCdWZmZXIoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjaGFyKiBwdHIsIGludCBsZW4gKQoreworICAgIHJldHVybiBwdHIgKyBsZW4gPCBmcy0+YnVmZmVyX2VuZCA/IHB0ciA6IGljdkZTRG9SZXNpemUoIGZzLCBwdHIsIGxlbiApOworfQorCisKK3N0YXRpYyBjaGFyKgoraWN2RlNGbHVzaCggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIGNoYXIqIHB0ciA9IGZzLT5idWZmZXI7CisgICAgaW50IGluZGVudDsKKworICAgIGlmKCBwdHIgPiBmcy0+YnVmZmVyX3N0YXJ0ICsgZnMtPnNwYWNlICkKKyAgICB7CisgICAgICAgIHB0clswXSA9ICdcbic7CisgICAgICAgIHB0clsxXSA9ICdcMCc7CisgICAgICAgIGZwdXRzKCBmcy0+YnVmZmVyX3N0YXJ0LCBmcy0+ZmlsZSApOworICAgICAgICBmcy0+YnVmZmVyID0gZnMtPmJ1ZmZlcl9zdGFydDsKKyAgICB9CisKKyAgICBpbmRlbnQgPSBmcy0+c3RydWN0X2luZGVudDsKKworICAgIGlmKCBmcy0+c3BhY2UgIT0gaW5kZW50ICkKKyAgICB7CisgICAgICAgIGlmKCBmcy0+c3BhY2UgPCBpbmRlbnQgKQorICAgICAgICAgICAgbWVtc2V0KCBmcy0+YnVmZmVyX3N0YXJ0ICsgZnMtPnNwYWNlLCAnICcsIGluZGVudCAtIGZzLT5zcGFjZSApOworICAgICAgICBmcy0+c3BhY2UgPSBpbmRlbnQ7CisgICAgfQorCisgICAgcHRyID0gZnMtPmJ1ZmZlciA9IGZzLT5idWZmZXJfc3RhcnQgKyBmcy0+c3BhY2U7CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8qIGNsb3NlcyBmaWxlIHN0b3JhZ2UgYW5kIGRlYWxsb2NhdGVzIGJ1ZmZlcnMgKi8KK0NWX0lNUEwgIHZvaWQKK2N2UmVsZWFzZUZpbGVTdG9yYWdlKCBDdkZpbGVTdG9yYWdlKiogcF9mcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoImN2UmVsZWFzZUZpbGVTdG9yYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFwX2ZzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGRvdWJsZSBwb2ludGVyIHRvIGZpbGUgc3RvcmFnZSIgKTsKKworICAgIGlmKCAqcF9mcyApCisgICAgeworICAgICAgICBDdkZpbGVTdG9yYWdlKiBmcyA9ICpwX2ZzOworICAgICAgICAqcF9mcyA9IDA7CisKKyAgICAgICAgaWYoIGZzLT53cml0ZV9tb2RlICYmIGZzLT5maWxlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGZzLT53cml0ZV9zdGFjayApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd2hpbGUoIGZzLT53cml0ZV9zdGFjay0+dG90YWwgPiAwICkKKyAgICAgICAgICAgICAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdChmcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpY3ZGU0ZsdXNoKGZzKTsKKyAgICAgICAgICAgIGlmKCBmcy0+aXNfeG1sICkKKyAgICAgICAgICAgICAgICBmcHV0cygiPC9vcGVuY3Zfc3RvcmFnZT5cbiIsIGZzLT5maWxlICk7CisgICAgICAgIH0KKworICAgICAgICAvL2ljdkZTUmVsZWFzZUNvbGxlY3Rpb24oIGZzLT5yb290cyApOyAvLyBkZWxldGUgYWxsIHRoZSB1c2VyIHR5cGVzIHJlY3Vyc2l2ZWx5CisKKyAgICAgICAgaWYoIGZzLT5maWxlICkKKyAgICAgICAgeworICAgICAgICAgICAgZmNsb3NlKCBmcy0+ZmlsZSApOworICAgICAgICAgICAgZnMtPmZpbGUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJmZzLT5zdHJzdG9yYWdlICk7CisKKyAgICAgICAgY3ZGcmVlKCAmZnMtPmJ1ZmZlcl9zdGFydCApOworICAgICAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmZnMtPm1lbXN0b3JhZ2UgKTsKKworICAgICAgICBtZW1zZXQoIGZzLCAwLCBzaXplb2YoKmZzKSApOworICAgICAgICBjdkZyZWUoICZmcyApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworI2RlZmluZSBDVl9IQVNIVkFMX1NDQUxFIDMzCisKK0NWX0lNUEwgQ3ZTdHJpbmdIYXNoTm9kZSoKK2N2R2V0SGFzaGVkS2V5KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogc3RyLCBpbnQgbGVuLCBpbnQgY3JlYXRlX21pc3NpbmcgKQoreworICAgIEN2U3RyaW5nSGFzaE5vZGUqIG5vZGUgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRIYXNoZWRLZXkiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICB1bnNpZ25lZCBoYXNodmFsID0gMDsKKyAgICBpbnQgaSwgdGFiX3NpemU7CisgICAgQ3ZTdHJpbmdIYXNoKiBtYXAgPSBmcy0+c3RyX2hhc2g7CisKKyAgICBpZiggIWZzICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCBsZW4gPCAwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IHN0cltpXSAhPSAnXDAnOyBpKysgKQorICAgICAgICAgICAgaGFzaHZhbCA9IGhhc2h2YWwqQ1ZfSEFTSFZBTF9TQ0FMRSArICh1bnNpZ25lZCBjaGFyKXN0cltpXTsKKyAgICAgICAgbGVuID0gaTsKKyAgICB9CisgICAgZWxzZSBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICBoYXNodmFsID0gaGFzaHZhbCpDVl9IQVNIVkFMX1NDQUxFICsgKHVuc2lnbmVkIGNoYXIpc3RyW2ldOworCisgICAgaGFzaHZhbCAmPSBJTlRfTUFYOworICAgIHRhYl9zaXplID0gbWFwLT50YWJfc2l6ZTsKKyAgICBpZiggKHRhYl9zaXplICYgKHRhYl9zaXplIC0gMSkpID09IDAgKQorICAgICAgICBpID0gKGludCkoaGFzaHZhbCAmICh0YWJfc2l6ZSAtIDEpKTsKKyAgICBlbHNlCisgICAgICAgIGkgPSAoaW50KShoYXNodmFsICUgdGFiX3NpemUpOworCisgICAgZm9yKCBub2RlID0gKEN2U3RyaW5nSGFzaE5vZGUqKShtYXAtPnRhYmxlW2ldKTsgbm9kZSAhPSAwOyBub2RlID0gbm9kZS0+bmV4dCApCisgICAgeworICAgICAgICBpZiggbm9kZS0+aGFzaHZhbCA9PSBoYXNodmFsICYmCisgICAgICAgICAgICBub2RlLT5zdHIubGVuID09IGxlbiAmJgorICAgICAgICAgICAgbWVtY21wKCBub2RlLT5zdHIucHRyLCBzdHIsIGxlbiApID09IDAgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYoICFub2RlICYmIGNyZWF0ZV9taXNzaW5nICkKKyAgICB7CisgICAgICAgIG5vZGUgPSAoQ3ZTdHJpbmdIYXNoTm9kZSopY3ZTZXROZXcoIChDdlNldCopbWFwICk7CisgICAgICAgIG5vZGUtPmhhc2h2YWwgPSBoYXNodmFsOworICAgICAgICBDVl9DQUxMKCBub2RlLT5zdHIgPSBjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyggbWFwLT5zdG9yYWdlLCBzdHIsIGxlbiApKTsKKyAgICAgICAgbm9kZS0+bmV4dCA9IChDdlN0cmluZ0hhc2hOb2RlKikobWFwLT50YWJsZVtpXSk7CisgICAgICAgIG1hcC0+dGFibGVbaV0gPSBub2RlOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworCitDVl9JTVBMIEN2RmlsZU5vZGUqCitjdkdldEZpbGVOb2RlKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogX21hcF9ub2RlLAorICAgICAgICAgICAgICAgY29uc3QgQ3ZTdHJpbmdIYXNoTm9kZSoga2V5LAorICAgICAgICAgICAgICAgaW50IGNyZWF0ZV9taXNzaW5nICkKK3sKKyAgICBDdkZpbGVOb2RlKiB2YWx1ZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0RmlsZU5vZGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgayA9IDAsIGF0dGVtcHRzID0gMTsKKworICAgIGlmKCAhZnMgKQorICAgICAgICBFWElUOworCisgICAgQ1ZfQ0hFQ0tfRklMRV9TVE9SQUdFKGZzKTsKKworICAgIGlmKCAha2V5ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGtleSBlbGVtZW50IiApOworCisgICAgaWYoIF9tYXBfbm9kZSApCisgICAgeworICAgICAgICBpZiggIWZzLT5yb290cyApCisgICAgICAgICAgICBFWElUOworICAgICAgICBhdHRlbXB0cyA9IGZzLT5yb290cy0+dG90YWw7CisgICAgfQorCisgICAgZm9yKCBrID0gMDsgayA8IGF0dGVtcHRzOyBrKysgKQorICAgIHsKKyAgICAgICAgaW50IGksIHRhYl9zaXplOworICAgICAgICBDdkZpbGVOb2RlKiBtYXBfbm9kZSA9IF9tYXBfbm9kZTsKKyAgICAgICAgQ3ZGaWxlTWFwTm9kZSogYW5vdGhlcjsKKyAgICAgICAgQ3ZGaWxlTm9kZUhhc2gqIG1hcDsKKworICAgICAgICBpZiggIW1hcF9ub2RlICkKKyAgICAgICAgICAgIG1hcF9ub2RlID0gKEN2RmlsZU5vZGUqKWN2R2V0U2VxRWxlbSggZnMtPnJvb3RzLCBrICk7CisKKyAgICAgICAgaWYoICFDVl9OT0RFX0lTX01BUChtYXBfbm9kZS0+dGFnKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAoIUNWX05PREVfSVNfU0VRKG1hcF9ub2RlLT50YWcpIHx8IG1hcF9ub2RlLT5kYXRhLnNlcS0+dG90YWwgIT0gMCkgJiYKKyAgICAgICAgICAgICAgICBDVl9OT0RFX1RZUEUobWFwX25vZGUtPnRhZykgIT0gQ1ZfTk9ERV9OT05FICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJUaGUgbm9kZSBpcyBuZWl0aGVyIGEgbWFwIG5vciBhbiBlbXB0eSBjb2xsZWN0aW9uIiApOworICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIG1hcCA9IG1hcF9ub2RlLT5kYXRhLm1hcDsKKyAgICAgICAgdGFiX3NpemUgPSBtYXAtPnRhYl9zaXplOworCisgICAgICAgIGlmKCAodGFiX3NpemUgJiAodGFiX3NpemUgLSAxKSkgPT0gMCApCisgICAgICAgICAgICBpID0gKGludCkoa2V5LT5oYXNodmFsICYgKHRhYl9zaXplIC0gMSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpID0gKGludCkoa2V5LT5oYXNodmFsICUgdGFiX3NpemUpOworCisgICAgICAgIGZvciggYW5vdGhlciA9IChDdkZpbGVNYXBOb2RlKikobWFwLT50YWJsZVtpXSk7IGFub3RoZXIgIT0gMDsgYW5vdGhlciA9IGFub3RoZXItPm5leHQgKQorICAgICAgICAgICAgaWYoIGFub3RoZXItPmtleSA9PSBrZXkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhY3JlYXRlX21pc3NpbmcgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAmYW5vdGhlci0+dmFsdWU7CisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiRHVwbGljYXRlZCBrZXkiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYoIGsgPT0gYXR0ZW1wdHMgLSAxICYmIGNyZWF0ZV9taXNzaW5nICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGaWxlTWFwTm9kZSogbm9kZSA9IChDdkZpbGVNYXBOb2RlKiljdlNldE5ldyggKEN2U2V0KiltYXAgKTsKKyAgICAgICAgICAgIG5vZGUtPmtleSA9IGtleTsKKworICAgICAgICAgICAgbm9kZS0+bmV4dCA9IChDdkZpbGVNYXBOb2RlKikobWFwLT50YWJsZVtpXSk7CisgICAgICAgICAgICBtYXAtPnRhYmxlW2ldID0gbm9kZTsKKyAgICAgICAgICAgIHZhbHVlID0gKEN2RmlsZU5vZGUqKW5vZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisKK0NWX0lNUEwgQ3ZGaWxlTm9kZSoKK2N2R2V0RmlsZU5vZGVCeU5hbWUoIGNvbnN0IEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBDdkZpbGVOb2RlKiBfbWFwX25vZGUsIGNvbnN0IGNoYXIqIHN0ciApCit7CisgICAgQ3ZGaWxlTm9kZSogdmFsdWUgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZHZXRGaWxlTm9kZUJ5TmFtZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBsZW4sIHRhYl9zaXplOworICAgIHVuc2lnbmVkIGhhc2h2YWwgPSAwOworICAgIGludCBrID0gMCwgYXR0ZW1wdHMgPSAxOworCisgICAgaWYoICFmcyApCisgICAgICAgIEVYSVQ7CisKKyAgICBDVl9DSEVDS19GSUxFX1NUT1JBR0UoZnMpOworCisgICAgaWYoICFzdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgZWxlbWVudCBuYW1lIiApOworCisgICAgZm9yKCBpID0gMDsgc3RyW2ldICE9ICdcMCc7IGkrKyApCisgICAgICAgIGhhc2h2YWwgPSBoYXNodmFsKkNWX0hBU0hWQUxfU0NBTEUgKyAodW5zaWduZWQgY2hhcilzdHJbaV07CisgICAgaGFzaHZhbCAmPSBJTlRfTUFYOworICAgIGxlbiA9IGk7CisKKyAgICBpZiggIV9tYXBfbm9kZSApCisgICAgeworICAgICAgICBpZiggIWZzLT5yb290cyApCisgICAgICAgICAgICBFWElUOworICAgICAgICBhdHRlbXB0cyA9IGZzLT5yb290cy0+dG90YWw7CisgICAgfQorCisgICAgZm9yKCBrID0gMDsgayA8IGF0dGVtcHRzOyBrKysgKQorICAgIHsKKyAgICAgICAgQ3ZGaWxlTm9kZUhhc2gqIG1hcDsKKyAgICAgICAgY29uc3QgQ3ZGaWxlTm9kZSogbWFwX25vZGUgPSBfbWFwX25vZGU7CisgICAgICAgIEN2RmlsZU1hcE5vZGUqIGFub3RoZXI7CisKKyAgICAgICAgaWYoICFtYXBfbm9kZSApCisgICAgICAgICAgICBtYXBfbm9kZSA9IChDdkZpbGVOb2RlKiljdkdldFNlcUVsZW0oIGZzLT5yb290cywgayApOworCisgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19NQVAobWFwX25vZGUtPnRhZykgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKCFDVl9OT0RFX0lTX1NFUShtYXBfbm9kZS0+dGFnKSB8fCBtYXBfbm9kZS0+ZGF0YS5zZXEtPnRvdGFsICE9IDApICYmCisgICAgICAgICAgICAgICAgQ1ZfTk9ERV9UWVBFKG1hcF9ub2RlLT50YWcpICE9IENWX05PREVfTk9ORSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVGhlIG5vZGUgaXMgbmVpdGhlciBhIG1hcCBub3IgYW4gZW1wdHkgY29sbGVjdGlvbiIgKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBtYXAgPSBtYXBfbm9kZS0+ZGF0YS5tYXA7CisgICAgICAgIHRhYl9zaXplID0gbWFwLT50YWJfc2l6ZTsKKworICAgICAgICBpZiggKHRhYl9zaXplICYgKHRhYl9zaXplIC0gMSkpID09IDAgKQorICAgICAgICAgICAgaSA9IChpbnQpKGhhc2h2YWwgJiAodGFiX3NpemUgLSAxKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGkgPSAoaW50KShoYXNodmFsICUgdGFiX3NpemUpOworCisgICAgICAgIGZvciggYW5vdGhlciA9IChDdkZpbGVNYXBOb2RlKikobWFwLT50YWJsZVtpXSk7IGFub3RoZXIgIT0gMDsgYW5vdGhlciA9IGFub3RoZXItPm5leHQgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBDdlN0cmluZ0hhc2hOb2RlKiBrZXkgPSBhbm90aGVyLT5rZXk7CisKKyAgICAgICAgICAgIGlmKCBrZXktPmhhc2h2YWwgPT0gaGFzaHZhbCAmJgorICAgICAgICAgICAgICAgIGtleS0+c3RyLmxlbiA9PSBsZW4gJiYKKyAgICAgICAgICAgICAgICBtZW1jbXAoIGtleS0+c3RyLnB0ciwgc3RyLCBsZW4gKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICZhbm90aGVyLT52YWx1ZTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCitDVl9JTVBMIEN2RmlsZU5vZGUqCitjdkdldFJvb3RGaWxlTm9kZSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGludCBzdHJlYW1faW5kZXggKQoreworICAgIEN2RmlsZU5vZGUqIHZhbHVlID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0Um9vdEZpbGVOb2RlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0hFQ0tfRklMRV9TVE9SQUdFKGZzKTsKKworICAgIGlmKCAhZnMtPnJvb3RzIHx8ICh1bnNpZ25lZClzdHJlYW1faW5kZXggPj0gKHVuc2lnbmVkKWZzLT5yb290cy0+dG90YWwgKQorICAgICAgICBFWElUOworCisgICAgdmFsdWUgPSAoQ3ZGaWxlTm9kZSopY3ZHZXRTZXFFbGVtKCBmcy0+cm9vdHMsIHN0cmVhbV9pbmRleCApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiB2YWx1ZTsKK30KKworCisvKiByZXR1cm5zIHRoZSBzZXF1ZW5jZSBlbGVtZW50IGJ5IGl0cyBpbmRleCAqLworLypDVl9JTVBMIEN2RmlsZU5vZGUqCitjdkdldEZpbGVOb2RlRnJvbVNlcSggQ3ZGaWxlU3RvcmFnZSogZnMsCisgICAgICAgICAgICAgICAgICAgICAgQ3ZGaWxlTm9kZSogc2VxX25vZGUsIGludCBpbmRleCApCit7CisgICAgQ3ZGaWxlTm9kZSogdmFsdWUgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkdldEZpbGVOb2RlRnJvbVNlcSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxKiBzZXE7CisKKyAgICBpZiggIXNlcV9ub2RlICkKKyAgICAgICAgc2VxID0gZnMtPnJvb3RzOworICAgIGVsc2UgaWYoICFDVl9OT0RFX0lTX1NFUShzZXFfbm9kZS0+dGFnKSApCisgICAgeworICAgICAgICBpZiggQ1ZfTk9ERV9JU19NQVAoc2VxX25vZGUtPnRhZykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVGhlIG5vZGUgaXMgbWFwLiBVc2UgY3ZHZXRGaWxlTm9kZUZyb21NYXAoKS4iICk7CisgICAgICAgIGlmKCBDVl9OT0RFX1RZUEUoc2VxX25vZGUtPnRhZykgPT0gQ1ZfTk9ERV9OT05FICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBub2RlIGlzIGFuIGVtcHR5IG9iamVjdCAoTm9uZSkuIiApOworICAgICAgICBpZiggaW5kZXggIT0gMCAmJiBpbmRleCAhPSAtMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIiIgKTsKKyAgICAgICAgdmFsdWUgPSBzZXFfbm9kZTsKKyAgICAgICAgRVhJVDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzZXEgPSBzZXFfbm9kZS0+ZGF0YS5zZXE7CisKKyAgICBpZiggIXNlcSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiVGhlIGZpbGUgc3RvcmFnZSBpcyBlbXB0eSIgKTsKKworICAgIHZhbHVlID0gKEN2RmlsZU5vZGUqKWN2R2V0U2VxRWxlbSggc2VxLCBpbmRleCwgMCApOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiB2YWx1ZTsKK30qLworCisKK3N0YXRpYyBjaGFyKgoraWN2RG91YmxlVG9TdHJpbmcoIGNoYXIqIGJ1ZiwgZG91YmxlIHZhbHVlICkKK3sKKyAgICBDdjY0c3VmIHZhbDsKKyAgICB1bnNpZ25lZCBpZWVlNzU0X2hpOworCisgICAgdmFsLmYgPSB2YWx1ZTsKKyAgICBpZWVlNzU0X2hpID0gKHVuc2lnbmVkKSh2YWwudSA+PiAzMik7CisKKyAgICBpZiggKGllZWU3NTRfaGkgJiAweDdmZjAwMDAwKSAhPSAweDdmZjAwMDAwICkKKyAgICB7CisgICAgICAgIGludCBpdmFsdWUgPSBjdlJvdW5kKHZhbHVlKTsKKyAgICAgICAgaWYoIGl2YWx1ZSA9PSB2YWx1ZSApCisgICAgICAgICAgICBzcHJpbnRmKCBidWYsICIlZC4iLCBpdmFsdWUgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciogZm10W10gPSB7IiUuMTZlIiwgIiUuMTZmIn07CisgICAgICAgICAgICBkb3VibGUgYXZhbHVlID0gZmFicyh2YWx1ZSk7CisgICAgICAgICAgICBjaGFyKiBwdHIgPSBidWY7CisgICAgICAgICAgICBzcHJpbnRmKCBidWYsIGZtdFswLjAxIDw9IGF2YWx1ZSAmJiBhdmFsdWUgPCAxMDAwXSwgdmFsdWUgKTsKKyAgICAgICAgICAgIGlmKCAqcHRyID09ICcrJyB8fCAqcHRyID09ICctJyApCisgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICBmb3IoIDsgaXNkaWdpdCgqcHRyKTsgcHRyKysgKQorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIGlmKCAqcHRyID09ICcsJyApCisgICAgICAgICAgICAgICAgKnB0ciA9ICcuJzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB1bnNpZ25lZCBpZWVlNzU0X2xvID0gKHVuc2lnbmVkKXZhbC51OworICAgICAgICBpZiggKGllZWU3NTRfaGkgJiAweDdmZmZmZmZmKSArIChpZWVlNzU0X2xvICE9IDApID4gMHg3ZmYwMDAwMCApCisgICAgICAgICAgICBzdHJjcHkoIGJ1ZiwgIi5OYW4iICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNweSggYnVmLCAoaW50KWllZWU3NTRfaGkgPCAwID8gIi0uSW5mIiA6ICIuSW5mIiApOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIGNoYXIqCitpY3ZGbG9hdFRvU3RyaW5nKCBjaGFyKiBidWYsIGZsb2F0IHZhbHVlICkKK3sKKyAgICBDdjMyc3VmIHZhbDsKKyAgICB1bnNpZ25lZCBpZWVlNzU0OworICAgIHZhbC5mID0gdmFsdWU7CisgICAgaWVlZTc1NCA9IHZhbC51OworCisgICAgaWYoIChpZWVlNzU0ICYgMHg3ZjgwMDAwMCkgIT0gMHg3ZjgwMDAwMCApCisgICAgeworICAgICAgICBpbnQgaXZhbHVlID0gY3ZSb3VuZCh2YWx1ZSk7CisgICAgICAgIGlmKCBpdmFsdWUgPT0gdmFsdWUgKQorICAgICAgICAgICAgc3ByaW50ZiggYnVmLCAiJWQuIiwgaXZhbHVlICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGZtdFtdID0geyIlLjhlIiwgIiUuOGYifTsKKyAgICAgICAgICAgIGRvdWJsZSBhdmFsdWUgPSBmYWJzKChkb3VibGUpdmFsdWUpOworICAgICAgICAgICAgY2hhciogcHRyID0gYnVmOworICAgICAgICAgICAgc3ByaW50ZiggYnVmLCBmbXRbMC4wMSA8PSBhdmFsdWUgJiYgYXZhbHVlIDwgMTAwMF0sIHZhbHVlICk7CisgICAgICAgICAgICBpZiggKnB0ciA9PSAnKycgfHwgKnB0ciA9PSAnLScgKQorICAgICAgICAgICAgICAgIHB0cisrOworICAgICAgICAgICAgZm9yKCA7IGlzZGlnaXQoKnB0cik7IHB0cisrICkKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICBpZiggKnB0ciA9PSAnLCcgKQorICAgICAgICAgICAgICAgICpwdHIgPSAnLic7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIChpZWVlNzU0ICYgMHg3ZmZmZmZmZikgIT0gMHg3ZjgwMDAwMCApCisgICAgICAgICAgICBzdHJjcHkoIGJ1ZiwgIi5OYW4iICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHN0cmNweSggYnVmLCAoaW50KWllZWU3NTQgPCAwID8gIi0uSW5mIiA6ICIuSW5mIiApOworICAgIH0KKworICAgIHJldHVybiBidWY7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlByb2Nlc3NTcGVjaWFsRG91YmxlKCBDdkZpbGVTdG9yYWdlKiBmcywgY2hhciogYnVmLCBkb3VibGUqIHZhbHVlLCBjaGFyKiogZW5kcHRyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdlByb2Nlc3NTcGVjaWFsRG91YmxlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBjID0gYnVmWzBdOworICAgIGludCBpbmZfaGkgPSAweDdmZjAwMDAwOworCisgICAgaWYoIGMgPT0gJy0nIHx8IGMgPT0gJysnICkKKyAgICB7CisgICAgICAgIGluZl9oaSA9IGMgPT0gJy0nID8gMHhmZmYwMDAwMCA6IDB4N2ZmMDAwMDA7CisgICAgICAgIGMgPSAqKytidWY7CisgICAgfQorCisgICAgaWYoIGMgIT0gJy4nICkKKyAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJCYWQgZm9ybWF0IG9mIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IiApOworCisgICAgaWYoIHRvdXBwZXIoYnVmWzFdKSA9PSAnSScgJiYgdG91cHBlcihidWZbMl0pID09ICdOJyAmJiB0b3VwcGVyKGJ1ZlszXSkgPT0gJ0YnICkKKyAgICAgICAgKih1aW50NjQqKXZhbHVlID0gKCh1aW50NjQpaW5mX2hpIDw8IDMyKTsKKyAgICBlbHNlIGlmKCB0b3VwcGVyKGJ1ZlsxXSkgPT0gJ04nICYmIHRvdXBwZXIoYnVmWzJdKSA9PSAnQScgJiYgdG91cHBlcihidWZbM10pID09ICdOJyApCisgICAgICAgICoodWludDY0Kil2YWx1ZSA9ICh1aW50NjQpLTE7CisgICAgZWxzZQorICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkJhZCBmb3JtYXQgb2YgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQiICk7CisKKyAgICAqZW5kcHRyID0gYnVmICsgNDsKKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIGRvdWJsZSBpY3Zfc3RydG9kKCBDdkZpbGVTdG9yYWdlKiBmcywgY2hhciogcHRyLCBjaGFyKiogZW5kcHRyICkKK3sKKyAgICBkb3VibGUgZnZhbCA9IHN0cnRvZCggcHRyLCBlbmRwdHIgKTsKKyAgICBpZiggKiplbmRwdHIgPT0gJy4nICkKKyAgICB7CisgICAgICAgIGNoYXIqIGRvdF9wb3MgPSAqZW5kcHRyOworICAgICAgICAqZG90X3BvcyA9ICcsJzsKKyAgICAgICAgZG91YmxlIGZ2YWwyID0gc3RydG9kKCBwdHIsIGVuZHB0ciApOworICAgICAgICAqZG90X3BvcyA9ICcuJzsKKyAgICAgICAgaWYoICplbmRwdHIgPiBkb3RfcG9zICkKKyAgICAgICAgICAgIGZ2YWwgPSBmdmFsMjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgKmVuZHB0ciA9IGRvdF9wb3M7CisgICAgfQorCisgICAgaWYoICplbmRwdHIgPT0gcHRyIHx8IGlzYWxwaGEoKiplbmRwdHIpICkKKyAgICAgICAgaWN2UHJvY2Vzc1NwZWNpYWxEb3VibGUoIGZzLCBwdHIsICZmdmFsLCBlbmRwdHIgKTsKKworICAgIHJldHVybiBmdmFsOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlBTUwgUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGNoYXIqCitpY3ZZTUxTa2lwU3BhY2VzKCBDdkZpbGVTdG9yYWdlKiBmcywgY2hhciogcHRyLCBpbnQgbWluX2luZGVudCwgaW50IG1heF9jb21tZW50X2luZGVudCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZZTUxTa2lwU3BhY2VzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgd2hpbGUoICpwdHIgPT0gJyAnICkKKyAgICAgICAgICAgIHB0cisrOworICAgICAgICBpZiggKnB0ciA9PSAnIycgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcHRyIC0gZnMtPmJ1ZmZlcl9zdGFydCA+IG1heF9jb21tZW50X2luZGVudCApCisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICpwdHIgPSAnXDAnOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGN2X2lzcHJpbnQoKnB0cikgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcHRyIC0gZnMtPmJ1ZmZlcl9zdGFydCA8IG1pbl9pbmRlbnQgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiSW5jb3JyZWN0IGluZGVudGF0aW9uIiApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggKnB0ciA9PSAnXDAnIHx8ICpwdHIgPT0gJ1xuJyB8fCAqcHRyID09ICdccicgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4X3NpemUgPSAoaW50KShmcy0+YnVmZmVyX2VuZCAtIGZzLT5idWZmZXJfc3RhcnQpOworICAgICAgICAgICAgcHRyID0gZmdldHMoIGZzLT5idWZmZXJfc3RhcnQsIG1heF9zaXplLCBmcy0+ZmlsZSApOworICAgICAgICAgICAgaWYoICFwdHIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIGVtdWxhdGUgZW5kIG9mIHN0cmVhbQorICAgICAgICAgICAgICAgIHB0ciA9IGZzLT5idWZmZXJfc3RhcnQ7CisgICAgICAgICAgICAgICAgcHRyWzBdID0gcHRyWzFdID0gcHRyWzJdID0gJy4nOworICAgICAgICAgICAgICAgIHB0clszXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgZnMtPmR1bW15X2VvZiA9IDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGwgPSAoaW50KXN0cmxlbihwdHIpOworICAgICAgICAgICAgICAgIGlmKCBwdHJbbC0xXSAhPSAnXG4nICYmIHB0cltsLTFdICE9ICdccicgJiYgIWZlb2YoZnMtPmZpbGUpICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJUb28gbG9uZyBzdHJpbmcgb3IgYSBsYXN0IHN0cmluZyB3L28gbmV3bGluZSIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnMtPmxpbmVubysrOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAqcHRyID09ICdcdCcgPyAiVGFicyBhcmUgcHJvaGliaXRlZCBpbiBZQU1MISIgOiAiSW52YWxpZCBjaGFyYWN0ZXIiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworc3RhdGljIGNoYXIqCitpY3ZZTUxQYXJzZUtleSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNoYXIqIHB0ciwKKyAgICAgICAgICAgICAgICBDdkZpbGVOb2RlKiBtYXBfbm9kZSwgQ3ZGaWxlTm9kZSoqIHZhbHVlX3BsYWNlaG9sZGVyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdllNTFBhcnNlS2V5IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBjOworICAgIGNoYXIgKmVuZHB0ciA9IHB0ciAtIDEsICpzYXZlcHRyOworICAgIEN2U3RyaW5nSGFzaE5vZGUqIHN0cl9oYXNoX25vZGU7CisKKyAgICBpZiggKnB0ciA9PSAnLScgKQorICAgICAgICBDVl9QQVJTRV9FUlJPUiggIktleSBtYXkgbm90IHN0YXJ0IHdpdGggXCctXCciICk7CisKKyAgICBkbyBjID0gKisrZW5kcHRyOworICAgIHdoaWxlKCBjdl9pc3ByaW50KGMpICYmIGMgIT0gJzonICk7CisKKyAgICBpZiggYyAhPSAnOicgKQorICAgICAgICBDVl9QQVJTRV9FUlJPUiggIk1pc3NpbmcgXCc6XCciICk7CisKKyAgICBzYXZlcHRyID0gZW5kcHRyICsgMTsKKyAgICBkbyBjID0gKi0tZW5kcHRyOworICAgIHdoaWxlKCBjID09ICcgJyApOworCisgICAgKytlbmRwdHI7CisgICAgaWYoIGVuZHB0ciA9PSBwdHIgKQorICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkFuIGVtcHR5IGtleSIgKTsKKworICAgIENWX0NBTEwoIHN0cl9oYXNoX25vZGUgPSBjdkdldEhhc2hlZEtleSggZnMsIHB0ciwgKGludCkoZW5kcHRyIC0gcHRyKSwgMSApKTsKKyAgICBDVl9DQUxMKCAqdmFsdWVfcGxhY2Vob2xkZXIgPSBjdkdldEZpbGVOb2RlKCBmcywgbWFwX25vZGUsIHN0cl9oYXNoX25vZGUsIDEgKSk7CisgICAgcHRyID0gc2F2ZXB0cjsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKK3N0YXRpYyBjaGFyKgoraWN2WU1MUGFyc2VWYWx1ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNoYXIqIHB0ciwgQ3ZGaWxlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgIGludCBwYXJlbnRfZmxhZ3MsIGludCBtaW5faW5kZW50ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdllNTFBhcnNlVmFsdWUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyIGJ1ZltDVl9GU19NQVhfTEVOICsgMTAyNF07CisgICAgY2hhciogZW5kcHRyID0gMDsKKyAgICBjaGFyIGMgPSBwdHJbMF0sIGQgPSBwdHJbMV07CisgICAgaW50IGlzX3BhcmVudF9mbG93ID0gQ1ZfTk9ERV9JU19GTE9XKHBhcmVudF9mbGFncyk7CisgICAgaW50IHZhbHVlX3R5cGUgPSBDVl9OT0RFX05PTkU7CisgICAgaW50IGxlbjsKKworICAgIG1lbXNldCggbm9kZSwgMCwgc2l6ZW9mKCpub2RlKSApOworCisgICAgaWYoIGMgPT0gJyEnICkgLy8gaGFuZGxlIGV4cGxpY2l0IHR5cGUgc3BlY2lmaWNhdGlvbgorICAgIHsKKyAgICAgICAgaWYoIGQgPT0gJyEnIHx8IGQgPT0gJ14nICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICB2YWx1ZV90eXBlIHw9IENWX05PREVfVVNFUjsKKyAgICAgICAgfQorCisgICAgICAgIGVuZHB0ciA9IHB0cisrOworICAgICAgICBkbyBkID0gKisrZW5kcHRyOworICAgICAgICB3aGlsZSggY3ZfaXNwcmludChkKSAmJiBkICE9ICcgJyApOworICAgICAgICBsZW4gPSAoaW50KShlbmRwdHIgLSBwdHIpOworICAgICAgICBpZiggbGVuID09IDAgKQorICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJFbXB0eSB0eXBlIG5hbWUiICk7CisgICAgICAgIGQgPSAqZW5kcHRyOworICAgICAgICAqZW5kcHRyID0gJ1wwJzsKKworICAgICAgICBpZiggbGVuID09IDMgJiYgIUNWX05PREVfSVNfVVNFUih2YWx1ZV90eXBlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtZW1jbXAoIHB0ciwgInN0ciIsIDMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlID0gQ1ZfTk9ERV9TVFJJTkc7CisgICAgICAgICAgICBlbHNlIGlmKCBtZW1jbXAoIHB0ciwgImludCIsIDMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlID0gQ1ZfTk9ERV9JTlQ7CisgICAgICAgICAgICBlbHNlIGlmKCBtZW1jbXAoIHB0ciwgInNlcSIsIDMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlID0gQ1ZfTk9ERV9TRVE7CisgICAgICAgICAgICBlbHNlIGlmKCBtZW1jbXAoIHB0ciwgIm1hcCIsIDMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICB2YWx1ZV90eXBlID0gQ1ZfTk9ERV9NQVA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggbGVuID09IDUgJiYgIUNWX05PREVfSVNfVVNFUih2YWx1ZV90eXBlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtZW1jbXAoIHB0ciwgImZsb2F0IiwgNSApID09IDAgKQorICAgICAgICAgICAgICAgIHZhbHVlX3R5cGUgPSBDVl9OT0RFX1JFQUw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggQ1ZfTk9ERV9JU19VU0VSKHZhbHVlX3R5cGUpICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggbm9kZS0+aW5mbyA9IGN2RmluZFR5cGUoIHB0ciApKTsKKyAgICAgICAgICAgIGlmKCAhbm9kZS0+aW5mbyApCisgICAgICAgICAgICAgICAgbm9kZS0+dGFnICY9IH5DVl9OT0RFX1VTRVI7CisgICAgICAgIH0KKworICAgICAgICAqZW5kcHRyID0gZDsKKyAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MU2tpcFNwYWNlcyggZnMsIGVuZHB0ciwgbWluX2luZGVudCwgSU5UX01BWCApKTsKKworICAgICAgICBjID0gKnB0cjsKKworICAgICAgICBpZiggIUNWX05PREVfSVNfVVNFUih2YWx1ZV90eXBlKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB2YWx1ZV90eXBlID09IENWX05PREVfU1RSSU5HICYmIGMgIT0gJ1wnJyAmJiBjICE9ICdcIicgKQorICAgICAgICAgICAgICAgIGdvdG8gZm9yY2Vfc3RyaW5nOworICAgICAgICAgICAgaWYoIHZhbHVlX3R5cGUgPT0gQ1ZfTk9ERV9JTlQgKQorICAgICAgICAgICAgICAgIGdvdG8gZm9yY2VfaW50OworICAgICAgICAgICAgaWYoIHZhbHVlX3R5cGUgPT0gQ1ZfTk9ERV9SRUFMICkKKyAgICAgICAgICAgICAgICBnb3RvIGZvcmNlX3JlYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggaXNkaWdpdChjKSB8fAorICAgICAgICAoKGMgPT0gJy0nIHx8IGMgPT0gJysnKSAmJiAoaXNkaWdpdChkKSB8fCBkID09ICcuJykpIHx8CisgICAgICAgIChjID09ICcuJyAmJiBpc2FsbnVtKGQpKSkgLy8gYSBudW1iZXIKKyAgICB7CisgICAgICAgIGRvdWJsZSBmdmFsOworICAgICAgICBpbnQgaXZhbDsKKyAgICAgICAgZW5kcHRyID0gcHRyICsgKGMgPT0gJy0nIHx8IGMgPT0gJysnKTsKKyAgICAgICAgd2hpbGUoIGlzZGlnaXQoKmVuZHB0cikgKQorICAgICAgICAgICAgZW5kcHRyKys7CisgICAgICAgIGlmKCAqZW5kcHRyID09ICcuJyB8fCAqZW5kcHRyID09ICdlJyApCisgICAgICAgIHsKK2ZvcmNlX3JlYWw6CisgICAgICAgICAgICBmdmFsID0gaWN2X3N0cnRvZCggZnMsIHB0ciwgJmVuZHB0ciApOworICAgICAgICAgICAgLyppZiggZW5kcHRyID09IHB0ciB8fCBpc2FscGhhKCplbmRwdHIpICkKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBpY3ZQcm9jZXNzU3BlY2lhbERvdWJsZSggZnMsIGVuZHB0ciwgJmZ2YWwsICZlbmRwdHIgKSk7Ki8KKworICAgICAgICAgICAgbm9kZS0+dGFnID0gQ1ZfTk9ERV9SRUFMOworICAgICAgICAgICAgbm9kZS0+ZGF0YS5mID0gZnZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKK2ZvcmNlX2ludDoKKyAgICAgICAgICAgIGl2YWwgPSAoaW50KXN0cnRvbCggcHRyLCAmZW5kcHRyLCAwICk7CisgICAgICAgICAgICBub2RlLT50YWcgPSBDVl9OT0RFX0lOVDsKKyAgICAgICAgICAgIG5vZGUtPmRhdGEuaSA9IGl2YWw7CisgICAgICAgIH0KKworICAgICAgICBpZiggIWVuZHB0ciB8fCBlbmRwdHIgPT0gcHRyICkKKyAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiSW52YWxpZCBudW1lcmljIHZhbHVlIChpbmNvbnNpc3RlbnQgZXhwbGljaXQgdHlwZSBzcGVjaWZpY2F0aW9uPykiICk7CisKKyAgICAgICAgcHRyID0gZW5kcHRyOworICAgIH0KKyAgICBlbHNlIGlmKCBjID09ICdcJycgfHwgYyA9PSAnXCInICkgLy8gYW4gZXhwbGljaXQgc3RyaW5nCisgICAgeworICAgICAgICBub2RlLT50YWcgPSBDVl9OT0RFX1NUUklORzsKKyAgICAgICAgaWYoIGMgPT0gJ1wnJyApCisgICAgICAgICAgICBmb3IoIGxlbiA9IDA7IGxlbiA8IENWX0ZTX01BWF9MRU47ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gKisrcHRyOworICAgICAgICAgICAgICAgIGlmKCBpc2FsbnVtKGMpIHx8IChjICE9ICdcJycgJiYgY3ZfaXNwcmludChjKSkpCisgICAgICAgICAgICAgICAgICAgIGJ1ZltsZW4rK10gPSBjOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1wnJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjID0gKisrcHRyOworICAgICAgICAgICAgICAgICAgICBpZiggYyAhPSAnXCcnICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBidWZbbGVuKytdID0gYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkludmFsaWQgY2hhcmFjdGVyIiApOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIGxlbiA9IDA7IGxlbiA8IENWX0ZTX01BWF9MRU47ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gKisrcHRyOworICAgICAgICAgICAgICAgIGlmKCBpc2FsbnVtKGMpIHx8IChjICE9ICdcXCcgJiYgYyAhPSAnXCInICYmIGN2X2lzcHJpbnQoYykpKQorICAgICAgICAgICAgICAgICAgICBidWZbbGVuKytdID0gYzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcIicgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgKytwdHI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcXCcgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZCA9ICorK3B0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGQgPT0gJ1wnJyApCisgICAgICAgICAgICAgICAgICAgICAgICBidWZbbGVuKytdID0gZDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZCA9PSAnXCInIHx8IGQgPT0gJ1xcJyB8fCBkID09ICdcJycgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2xlbisrXSA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGQgPT0gJ24nICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltsZW4rK10gPSAnXG4nOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBkID09ICdyJyApCisgICAgICAgICAgICAgICAgICAgICAgICBidWZbbGVuKytdID0gJ1xyJzsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZCA9PSAndCcgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2xlbisrXSA9ICdcdCc7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGQgPT0gJ3gnIHx8IChpc2RpZ2l0KGQpICYmIGQgPCAnOCcpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCwgaXNfaGV4ID0gZCA9PSAneCc7CisgICAgICAgICAgICAgICAgICAgICAgICBjID0gcHRyWzNdOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyWzNdID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHN0cnRvbCggcHRyICsgaXNfaGV4LCAmZW5kcHRyLCBpc19oZXggPyA4IDogMTYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0clszXSA9IGM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZW5kcHRyID09IHB0ciArIGlzX2hleCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2xlbisrXSA9ICd4JzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZbbGVuKytdID0gKGNoYXIpdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IGVuZHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiSW52YWxpZCBjaGFyYWN0ZXIiICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgaWYoIGxlbiA+PSBDVl9GU19NQVhfTEVOICkKKyAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiVG9vIGxvbmcgc3RyaW5nIGxpdGVyYWwiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggbm9kZS0+ZGF0YS5zdHIgPSBjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyggZnMtPm1lbXN0b3JhZ2UsIGJ1ZiwgbGVuICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBjID09ICdbJyB8fCBjID09ICd7JyApIC8vIGNvbGxlY3Rpb24gYXMgYSBmbG93CisgICAgeworICAgICAgICBpbnQgbmV3X21pbl9pbmRlbnQgPSBtaW5faW5kZW50ICsgIWlzX3BhcmVudF9mbG93OworICAgICAgICBpbnQgc3RydWN0X2ZsYWdzID0gQ1ZfTk9ERV9GTE9XICsgKGMgPT0gJ3snID8gQ1ZfTk9ERV9NQVAgOiBDVl9OT0RFX1NFUSk7CisgICAgICAgIGludCBpc19zaW1wbGUgPSAxOworCisgICAgICAgIENWX0NBTEwoIGljdkZTQ3JlYXRlQ29sbGVjdGlvbiggZnMsIENWX05PREVfVFlQRShzdHJ1Y3RfZmxhZ3MpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9kZS0+aW5mbyA/IENWX05PREVfVVNFUiA6IDApLCBub2RlICkpOworCisgICAgICAgIGQgPSBjID09ICdbJyA/ICddJyA6ICd9JzsKKworICAgICAgICBmb3IoICsrcHRyIDs7KQorICAgICAgICB7CisgICAgICAgICAgICBDdkZpbGVOb2RlKiBlbGVtID0gMDsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MU2tpcFNwYWNlcyggZnMsIHB0ciwgbmV3X21pbl9pbmRlbnQsIElOVF9NQVggKSk7CisgICAgICAgICAgICBpZiggKnB0ciA9PSAnfScgfHwgKnB0ciA9PSAnXScgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAqcHRyICE9IGQgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlRoZSB3cm9uZyBjbG9zaW5nIGJyYWNrZXQiICk7CisgICAgICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBub2RlLT5kYXRhLnNlcS0+dG90YWwgIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICpwdHIgIT0gJywnICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJNaXNzaW5nICwgYmV0d2VlbiB0aGUgZWxlbWVudHMiICk7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MU2tpcFNwYWNlcyggZnMsIHB0ciArIDEsIG5ld19taW5faW5kZW50LCBJTlRfTUFYICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggQ1ZfTk9ERV9JU19NQVAoc3RydWN0X2ZsYWdzKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MUGFyc2VLZXkoIGZzLCBwdHIsIG5vZGUsICZlbGVtICkpOworICAgICAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdllNTFNraXBTcGFjZXMoIGZzLCBwdHIsIG5ld19taW5faW5kZW50LCBJTlRfTUFYICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAqcHRyID09ICddJyApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGVsZW0gPSAoQ3ZGaWxlTm9kZSopY3ZTZXFQdXNoKCBub2RlLT5kYXRhLnNlcSwgMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MUGFyc2VWYWx1ZSggZnMsIHB0ciwgZWxlbSwgc3RydWN0X2ZsYWdzLCBuZXdfbWluX2luZGVudCApKTsKKyAgICAgICAgICAgIGlmKCBDVl9OT0RFX0lTX01BUChzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgICAgICAgICBlbGVtLT50YWcgfD0gQ1ZfTk9ERV9OQU1FRDsKKyAgICAgICAgICAgIGlzX3NpbXBsZSAmPSAhQ1ZfTk9ERV9JU19DT0xMRUNUSU9OKGVsZW0tPnRhZyk7CisgICAgICAgIH0KKyAgICAgICAgbm9kZS0+ZGF0YS5zZXEtPmZsYWdzIHw9IGlzX3NpbXBsZSA/IENWX05PREVfU0VRX1NJTVBMRSA6IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpbmRlbnQsIHN0cnVjdF9mbGFncywgaXNfc2ltcGxlOworCisgICAgICAgIGlmKCBpc19wYXJlbnRfZmxvdyB8fCBjICE9ICctJyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGltcGxpY2l0IChvbmUtbGluZSkgc3RyaW5nIG9yIG5lc3RlZCBibG9jay1zdHlsZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBpZiggIWlzX3BhcmVudF9mbG93ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnPycgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkNvbXBsZXgga2V5cyBhcmUgbm90IHN1cHBvcnRlZCIgKTsKKyAgICAgICAgICAgICAgICBpZiggYyA9PSAnfCcgfHwgYyA9PSAnPicgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIk11bHRpLWxpbmUgdGV4dCBsaXRlcmFscyBhcmUgbm90IHN1cHBvcnRlZCIgKTsKKyAgICAgICAgICAgIH0KKworZm9yY2Vfc3RyaW5nOgorICAgICAgICAgICAgZW5kcHRyID0gcHRyIC0gMTsKKworICAgICAgICAgICAgZG8gYyA9ICorK2VuZHB0cjsKKyAgICAgICAgICAgIHdoaWxlKCBjdl9pc3ByaW50KGMpICYmCisgICAgICAgICAgICAgICAgICAgKCFpc19wYXJlbnRfZmxvdyB8fCAoYyAhPSAnLCcgJiYgYyAhPSAnfScgJiYgYyAhPSAnXScpKSAmJgorICAgICAgICAgICAgICAgICAgIChpc19wYXJlbnRfZmxvdyB8fCBjICE9ICc6JyB8fCB2YWx1ZV90eXBlID09IENWX05PREVfU1RSSU5HKSk7CisKKyAgICAgICAgICAgIGlmKCBlbmRwdHIgPT0gcHRyICkKKyAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkludmFsaWQgY2hhcmFjdGVyIiApOworCisgICAgICAgICAgICBpZiggaXNfcGFyZW50X2Zsb3cgfHwgYyAhPSAnOicgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIqIHN0cl9lbmQgPSBlbmRwdHI7CisgICAgICAgICAgICAgICAgbm9kZS0+dGFnID0gQ1ZfTk9ERV9TVFJJTkc7CisgICAgICAgICAgICAgICAgLy8gc3RyaXAgc3BhY2VzIGluIHRoZSBlbmQgb2Ygc3RyaW5nCisgICAgICAgICAgICAgICAgZG8gYyA9ICotLXN0cl9lbmQ7CisgICAgICAgICAgICAgICAgd2hpbGUoIHN0cl9lbmQgPiBwdHIgJiYgYyA9PSAnICcgKTsKKyAgICAgICAgICAgICAgICBzdHJfZW5kKys7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggbm9kZS0+ZGF0YS5zdHIgPSBjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyggZnMtPm1lbXN0b3JhZ2UsIHB0ciwgKGludCkoc3RyX2VuZCAtIHB0cikgKSk7CisgICAgICAgICAgICAgICAgcHRyID0gZW5kcHRyOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJ1Y3RfZmxhZ3MgPSBDVl9OT0RFX01BUDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzdHJ1Y3RfZmxhZ3MgPSBDVl9OT0RFX1NFUTsKKworICAgICAgICBDVl9DQUxMKCBpY3ZGU0NyZWF0ZUNvbGxlY3Rpb24oIGZzLCBzdHJ1Y3RfZmxhZ3MgKworICAgICAgICAgICAgICAgICAgICAobm9kZS0+aW5mbyA/IENWX05PREVfVVNFUiA6IDApLCBub2RlICkpOworCisgICAgICAgIGluZGVudCA9IChpbnQpKHB0ciAtIGZzLT5idWZmZXJfc3RhcnQpOworICAgICAgICBpc19zaW1wbGUgPSAxOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZGaWxlTm9kZSogZWxlbSA9IDA7CisKKyAgICAgICAgICAgIGlmKCBDVl9OT0RFX0lTX01BUChzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZZTUxQYXJzZUtleSggZnMsIHB0ciwgbm9kZSwgJmVsZW0gKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9ICpwdHIrKzsKKyAgICAgICAgICAgICAgICBpZiggYyAhPSAnLScgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkJsb2NrIHNlcXVlbmNlIGVsZW1lbnRzIG11c3QgYmUgcHJlY2VkZWQgd2l0aCBcJy1cJyIgKTsKKworICAgICAgICAgICAgICAgIENWX0NBTEwoIGVsZW0gPSAoQ3ZGaWxlTm9kZSopY3ZTZXFQdXNoKCBub2RlLT5kYXRhLnNlcSwgMCApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MU2tpcFNwYWNlcyggZnMsIHB0ciwgaW5kZW50ICsgMSwgSU5UX01BWCApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdllNTFBhcnNlVmFsdWUoIGZzLCBwdHIsIGVsZW0sIHN0cnVjdF9mbGFncywgaW5kZW50ICsgMSApKTsKKyAgICAgICAgICAgIGlmKCBDVl9OT0RFX0lTX01BUChzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgICAgICAgICBlbGVtLT50YWcgfD0gQ1ZfTk9ERV9OQU1FRDsKKyAgICAgICAgICAgIGlzX3NpbXBsZSAmPSAhQ1ZfTk9ERV9JU19DT0xMRUNUSU9OKGVsZW0tPnRhZyk7CisKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdllNTFNraXBTcGFjZXMoIGZzLCBwdHIsIDAsIElOVF9NQVggKSk7CisgICAgICAgICAgICBpZiggcHRyIC0gZnMtPmJ1ZmZlcl9zdGFydCAhPSBpbmRlbnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBwdHIgLSBmcy0+YnVmZmVyX3N0YXJ0IDwgaW5kZW50ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkluY29ycmVjdCBpbmRlbnRhdGlvbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtZW1jbXAoIHB0ciwgIi4uLiIsIDMgKSA9PSAwICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIG5vZGUtPmRhdGEuc2VxLT5mbGFncyB8PSBpc19zaW1wbGUgPyBDVl9OT0RFX1NFUV9TSU1QTEUgOiAwOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZZTUxQYXJzZSggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WU1MUGFyc2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyKiBwdHIgPSBmcy0+YnVmZmVyX3N0YXJ0OworICAgIGludCBpc19maXJzdCA9IDE7CisKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICAvLyAwLiBza2lwIGxlYWRpbmcgY29tbWVudHMgYW5kIGRpcmVjdGl2ZXMgIGFuZCAuLi4KKyAgICAgICAgLy8gMS4gcmVhY2ggdGhlIGZpcnN0IGl0ZW0KKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZZTUxTa2lwU3BhY2VzKCBmcywgcHRyLCAwLCBJTlRfTUFYICkpOworICAgICAgICAgICAgaWYoICFwdHIgKQorICAgICAgICAgICAgICAgIEVYSVQ7CisKKyAgICAgICAgICAgIGlmKCAqcHRyID09ICclJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIG1lbWNtcCggcHRyLCAiJVlBTUw6IiwgNiApID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgbWVtY21wKCBwdHIsICIlWUFNTDoxLiIsIDggKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJVbnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gKGl0IG11c3QgYmUgMS54KSIgKTsKKyAgICAgICAgICAgICAgICAqcHRyID0gJ1wwJzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoICpwdHIgPT0gJy0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggbWVtY21wKHB0ciwgIi0tLSIsIDMpID09IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBpc19maXJzdCApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggaXNhbG51bSgqcHRyKSB8fCAqcHRyPT0nXycpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICFpc19maXJzdCApCisgICAgICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiVGhlIFlBTUwgc3RyZWFtcyBtdXN0IHN0YXJ0IHdpdGggJy0tLScsIGV4Y2VwdCB0aGUgZmlyc3Qgb25lIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiSW52YWxpZCBvciB1bnN1cHBvcnRlZCBzeW50YXgiICk7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZZTUxTa2lwU3BhY2VzKCBmcywgcHRyLCAwLCBJTlRfTUFYICkpOworICAgICAgICBpZiggbWVtY21wKCBwdHIsICIuLi4iLCAzICkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIDIuIHBhcnNlIHRoZSBjb2xsZWN0aW9uCisgICAgICAgICAgICBDdkZpbGVOb2RlKiByb290X25vZGUgPSAoQ3ZGaWxlTm9kZSopY3ZTZXFQdXNoKCBmcy0+cm9vdHMsIDAgKTsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MUGFyc2VWYWx1ZSggZnMsIHB0ciwgcm9vdF9ub2RlLCBDVl9OT0RFX05PTkUsIDAgKSk7CisgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfQ09MTEVDVElPTihyb290X25vZGUtPnRhZykgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiT25seSBjb2xsZWN0aW9ucyBhcyBZQU1MIHN0cmVhbXMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIHBhcnNlciIgKTsKKworICAgICAgICAgICAgLy8gMy4gcGFyc2UgdW50aWwgdGhlIGVuZCBvZiBmaWxlIG9yIG5leHQgY29sbGVjdGlvbgorICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WU1MU2tpcFNwYWNlcyggZnMsIHB0ciwgMCwgSU5UX01BWCApKTsKKyAgICAgICAgICAgIGlmKCAhcHRyICkKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGZzLT5kdW1teV9lb2YgKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHB0ciArPSAzOworICAgICAgICBpc19maXJzdCA9IDA7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZQU1MIEVtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitpY3ZZTUxXcml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZGF0YSwgY29uc3QgY2hhciogY3ZGdW5jTmFtZSApCit7CisgICAgLy9DVl9GVU5DTkFNRSggImljdllNTFdyaXRlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGtleWxlbiA9IDA7CisgICAgaW50IGRhdGFsZW4gPSAwOworICAgIGludCBzdHJ1Y3RfZmxhZ3M7CisgICAgY2hhciogcHRyOworCisgICAgc3RydWN0X2ZsYWdzID0gZnMtPnN0cnVjdF9mbGFnczsKKworICAgIGlmKCBrZXkgJiYga2V5WzBdID09ICdcMCcgKQorICAgICAgICBrZXkgPSAwOworCisgICAgaWYoIENWX05PREVfSVNfQ09MTEVDVElPTihzdHJ1Y3RfZmxhZ3MpICkKKyAgICB7CisgICAgICAgIGlmKCAoQ1ZfTk9ERV9JU19NQVAoc3RydWN0X2ZsYWdzKSBeIChrZXkgIT0gMCkpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJBbiBhdHRlbXB0IHRvIGFkZCBlbGVtZW50IHdpdGhvdXQgYSBrZXkgdG8gYSBtYXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvciBhZGQgZWxlbWVudCB3aXRoIGtleSB0byBzZXF1ZW5jZSIgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZnMtPmlzX2ZpcnN0ID0gMDsKKyAgICAgICAgc3RydWN0X2ZsYWdzID0gQ1ZfTk9ERV9FTVBUWSB8IChrZXkgPyBDVl9OT0RFX01BUCA6IENWX05PREVfU0VRKTsKKyAgICB9CisKKyAgICBpZigga2V5ICkKKyAgICB7CisgICAgICAgIGtleWxlbiA9IChpbnQpc3RybGVuKGtleSk7CisgICAgICAgIGlmKCBrZXlsZW4gPT0gMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIGtleSBpcyBhbiBlbXB0eSIgKTsKKworICAgICAgICBpZigga2V5bGVuID4gQ1ZfRlNfTUFYX0xFTiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIGtleSBpcyB0b28gbG9uZyIgKTsKKyAgICB9CisKKyAgICBpZiggZGF0YSApCisgICAgICAgIGRhdGFsZW4gPSAoaW50KXN0cmxlbihkYXRhKTsKKworICAgIGlmKCBDVl9OT0RFX0lTX0ZMT1coc3RydWN0X2ZsYWdzKSApCisgICAgeworICAgICAgICBpbnQgbmV3X29mZnNldDsKKyAgICAgICAgcHRyID0gZnMtPmJ1ZmZlcjsKKyAgICAgICAgaWYoICFDVl9OT0RFX0lTX0VNUFRZKHN0cnVjdF9mbGFncykgKQorICAgICAgICAgICAgKnB0cisrID0gJywnOworICAgICAgICBuZXdfb2Zmc2V0ID0gKGludCkocHRyIC0gZnMtPmJ1ZmZlcl9zdGFydCkgKyBrZXlsZW4gKyBkYXRhbGVuOworICAgICAgICBpZiggbmV3X29mZnNldCA+IGZzLT53cmFwX21hcmdpbiAmJiBuZXdfb2Zmc2V0IC0gZnMtPnN0cnVjdF9pbmRlbnQgPiAxMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZzLT5idWZmZXIgPSBwdHI7CisgICAgICAgICAgICBwdHIgPSBpY3ZGU0ZsdXNoKGZzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcHRyKysgPSAnICc7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHB0ciA9IGljdkZTRmx1c2goZnMpOworICAgICAgICBpZiggIUNWX05PREVfSVNfTUFQKHN0cnVjdF9mbGFncykgKQorICAgICAgICB7CisgICAgICAgICAgICAqcHRyKysgPSAnLSc7CisgICAgICAgICAgICBpZiggZGF0YSApCisgICAgICAgICAgICAgICAgKnB0cisrID0gJyAnOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGtleSApCisgICAgeworICAgICAgICBpZiggIWlzYWxwaGEoa2V5WzBdKSAmJiBrZXlbMF0gIT0gJ18nICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJLZXkgbXVzdCBzdGFydCB3aXRoIGEgbGV0dGVyIG9yIF8iICk7CisKKyAgICAgICAgcHRyID0gaWN2RlNSZXNpemVXcml0ZUJ1ZmZlciggZnMsIHB0ciwga2V5bGVuICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGtleWxlbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSBrZXlbaV07CisKKyAgICAgICAgICAgIHB0cltpXSA9IChjaGFyKWM7CisgICAgICAgICAgICBpZiggIWlzYWxudW0oYykgJiYgYyAhPSAnLScgJiYgYyAhPSAnXycgJiYgYyAhPSAnICcgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGNoYXJhY3RlciBvY2N1cnMgaW4gdGhlIGtleSIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHB0ciArPSBrZXlsZW47CisgICAgICAgICpwdHIrKyA9ICc6JzsKKyAgICAgICAgaWYoICFDVl9OT0RFX0lTX0ZMT1coc3RydWN0X2ZsYWdzKSAmJiBkYXRhICkKKyAgICAgICAgICAgICpwdHIrKyA9ICcgJzsKKyAgICB9CisKKyAgICBpZiggZGF0YSApCisgICAgeworICAgICAgICBwdHIgPSBpY3ZGU1Jlc2l6ZVdyaXRlQnVmZmVyKCBmcywgcHRyLCBkYXRhbGVuICk7CisgICAgICAgIG1lbWNweSggcHRyLCBkYXRhLCBkYXRhbGVuICk7CisgICAgICAgIHB0ciArPSBkYXRhbGVuOworICAgIH0KKworICAgIGZzLT5idWZmZXIgPSBwdHI7CisgICAgZnMtPnN0cnVjdF9mbGFncyA9IHN0cnVjdF9mbGFncyAmIH5DVl9OT0RFX0VNUFRZOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WU1MU3RhcnRXcml0ZVN0cnVjdCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgaW50IHN0cnVjdF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSBDVl9ERUZBVUxUKDApKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WU1MU3RhcnRXcml0ZVN0cnVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBwYXJlbnRfZmxhZ3M7CisgICAgY2hhciBidWZbQ1ZfRlNfTUFYX0xFTiArIDEwMjRdOworICAgIGNvbnN0IGNoYXIqIGRhdGEgPSAwOworCisgICAgc3RydWN0X2ZsYWdzID0gKHN0cnVjdF9mbGFncyAmIChDVl9OT0RFX1RZUEVfTUFTS3xDVl9OT0RFX0ZMT1cpKSB8IENWX05PREVfRU1QVFk7CisgICAgaWYoICFDVl9OT0RFX0lTX0NPTExFQ1RJT04oc3RydWN0X2ZsYWdzKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgIlNvbWUgY29sbGVjdGlvbiB0eXBlIC0gQ1ZfTk9ERV9TRVEgb3IgQ1ZfTk9ERV9NQVAsIG11c3QgYmUgc3BlY2lmaWVkIiApOworCisgICAgaWYoIENWX05PREVfSVNfRkxPVyhzdHJ1Y3RfZmxhZ3MpICkKKyAgICB7CisgICAgICAgIGNoYXIgYyA9IENWX05PREVfSVNfTUFQKHN0cnVjdF9mbGFncykgPyAneycgOiAnWyc7CisgICAgICAgIHN0cnVjdF9mbGFncyB8PSBDVl9OT0RFX0ZMT1c7CisKKyAgICAgICAgaWYoIHR5cGVfbmFtZSApCisgICAgICAgICAgICBzcHJpbnRmKCBidWYsICIhISVzICVjIiwgdHlwZV9uYW1lLCBjICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgYnVmWzBdID0gYzsKKyAgICAgICAgICAgIGJ1ZlsxXSA9ICdcMCc7CisgICAgICAgIH0KKyAgICAgICAgZGF0YSA9IGJ1ZjsKKyAgICB9CisgICAgZWxzZSBpZiggdHlwZV9uYW1lICkKKyAgICB7CisgICAgICAgIHNwcmludGYoIGJ1ZiwgIiEhJXMiLCB0eXBlX25hbWUgKTsKKyAgICAgICAgZGF0YSA9IGJ1ZjsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBpY3ZZTUxXcml0ZSggZnMsIGtleSwgZGF0YSwgY3ZGdW5jTmFtZSApKTsKKworICAgIHBhcmVudF9mbGFncyA9IGZzLT5zdHJ1Y3RfZmxhZ3M7CisgICAgY3ZTZXFQdXNoKCBmcy0+d3JpdGVfc3RhY2ssICZwYXJlbnRfZmxhZ3MgKTsKKyAgICBmcy0+c3RydWN0X2ZsYWdzID0gc3RydWN0X2ZsYWdzOworCisgICAgaWYoICFDVl9OT0RFX0lTX0ZMT1cocGFyZW50X2ZsYWdzKSApCisgICAgICAgIGZzLT5zdHJ1Y3RfaW5kZW50ICs9IENWX1lNTF9JTkRFTlQgKyBDVl9OT0RFX0lTX0ZMT1coc3RydWN0X2ZsYWdzKTsKKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQKK2ljdllNTEVuZFdyaXRlU3RydWN0KCBDdkZpbGVTdG9yYWdlKiBmcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZZTUxFbmRXcml0ZVN0cnVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBwYXJlbnRfZmxhZ3MgPSAwLCBzdHJ1Y3RfZmxhZ3M7CisgICAgY2hhciogcHRyOworCisgICAgc3RydWN0X2ZsYWdzID0gZnMtPnN0cnVjdF9mbGFnczsKKyAgICBpZiggZnMtPndyaXRlX3N0YWNrLT50b3RhbCA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiRW5kV3JpdGVTdHJ1Y3Qgdy9vIG1hdGNoaW5nIFN0YXJ0V3JpdGVTdHJ1Y3QiICk7CisKKyAgICBjdlNlcVBvcCggZnMtPndyaXRlX3N0YWNrLCAmcGFyZW50X2ZsYWdzICk7CisKKyAgICBpZiggQ1ZfTk9ERV9JU19GTE9XKHN0cnVjdF9mbGFncykgKQorICAgIHsKKyAgICAgICAgcHRyID0gZnMtPmJ1ZmZlcjsKKyAgICAgICAgaWYoIHB0ciA+IGZzLT5idWZmZXJfc3RhcnQgKyBmcy0+c3RydWN0X2luZGVudCAmJiAhQ1ZfTk9ERV9JU19FTVBUWShzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgICAgICpwdHIrKyA9ICcgJzsKKyAgICAgICAgKnB0cisrID0gQ1ZfTk9ERV9JU19NQVAoc3RydWN0X2ZsYWdzKSA/ICd9JyA6ICddJzsKKyAgICAgICAgZnMtPmJ1ZmZlciA9IHB0cjsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTk9ERV9JU19FTVBUWShzdHJ1Y3RfZmxhZ3MpICkKKyAgICB7CisgICAgICAgIHB0ciA9IGljdkZTRmx1c2goZnMpOworICAgICAgICBtZW1jcHkoIHB0ciwgQ1ZfTk9ERV9JU19NQVAoc3RydWN0X2ZsYWdzKSA/ICJ7fSIgOiAiW10iLCAyICk7CisgICAgICAgIGZzLT5idWZmZXIgPSBwdHIgKyAyOworICAgIH0KKworICAgIGlmKCAhQ1ZfTk9ERV9JU19GTE9XKHBhcmVudF9mbGFncykgKQorICAgICAgICBmcy0+c3RydWN0X2luZGVudCAtPSBDVl9ZTUxfSU5ERU5UICsgQ1ZfTk9ERV9JU19GTE9XKHN0cnVjdF9mbGFncyk7CisgICAgYXNzZXJ0KCBmcy0+c3RydWN0X2luZGVudCA+PSAwICk7CisKKyAgICBmcy0+c3RydWN0X2ZsYWdzID0gcGFyZW50X2ZsYWdzOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WU1MU3RhcnROZXh0U3RyZWFtKCBDdkZpbGVTdG9yYWdlKiBmcyApCit7CisgICAgLy9DVl9GVU5DTkFNRSggImljdllNTFN0YXJ0TmV4dFN0cmVhbSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZnMtPmlzX2ZpcnN0ICkKKyAgICB7CisgICAgICAgIHdoaWxlKCBmcy0+d3JpdGVfc3RhY2stPnRvdGFsID4gMCApCisgICAgICAgICAgICBpY3ZZTUxFbmRXcml0ZVN0cnVjdChmcyk7CisKKyAgICAgICAgZnMtPnN0cnVjdF9pbmRlbnQgPSAwOworICAgICAgICBpY3ZGU0ZsdXNoKGZzKTsKKyAgICAgICAgZnB1dHMoICIuLi5cbiIsIGZzLT5maWxlICk7CisgICAgICAgIGZwdXRzKCAiLS0tXG4iLCBmcy0+ZmlsZSApOworICAgICAgICBmcy0+YnVmZmVyID0gZnMtPmJ1ZmZlcl9zdGFydDsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZZTUxXcml0ZUludCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgaW50IHZhbHVlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdllNTFdyaXRlSW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBidWZbMTI4XTsKKyAgICBDVl9DQUxMKCBpY3ZZTUxXcml0ZSggZnMsIGtleSwgaWN2X2l0b2EoIHZhbHVlLCBidWYsIDEwICksIGN2RnVuY05hbWUgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZZTUxXcml0ZVJlYWwoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBrZXksIGRvdWJsZSB2YWx1ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZZTUxXcml0ZVJlYWwiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyIGJ1ZlsxMjhdOworICAgIENWX0NBTEwoIGljdllNTFdyaXRlKCBmcywga2V5LCBpY3ZEb3VibGVUb1N0cmluZyggYnVmLCB2YWx1ZSApLCBjdkZ1bmNOYW1lICkpOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WU1MV3JpdGVTdHJpbmcoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc3RyLCBpbnQgcXVvdGUgQ1ZfREVGQVVMVCgwKSkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdllNTFdyaXRlU3RyaW5nIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBidWZbQ1ZfRlNfTUFYX0xFTio0KzE2XTsKKyAgICBjaGFyKiBkYXRhID0gKGNoYXIqKXN0cjsKKyAgICBpbnQgaSwgbGVuOworCisgICAgaWYoICFzdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgc3RyaW5nIHBvaW50ZXIiICk7CisKKyAgICBsZW4gPSAoaW50KXN0cmxlbihzdHIpOworICAgIGlmKCBsZW4gPiBDVl9GU19NQVhfTEVOICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSB3cml0dGVuIHN0cmluZyBpcyB0b28gbG9uZyIgKTsKKworICAgIGlmKCBxdW90ZSB8fCBsZW4gPT0gMCB8fCBzdHJbMF0gIT0gc3RyW2xlbi0xXSB8fCAoc3RyWzBdICE9ICdcIicgJiYgc3RyWzBdICE9ICdcJycpICkKKyAgICB7CisgICAgICAgIGludCBuZWVkX3F1b3RlID0gcXVvdGUgfHwgbGVuID09IDA7CisgICAgICAgIGRhdGEgPSBidWY7CisgICAgICAgICpkYXRhKysgPSAnXCInOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGMgPSBzdHJbaV07CisKKyAgICAgICAgICAgIGlmKCAhbmVlZF9xdW90ZSAmJiAhaXNhbG51bShjKSAmJiBjICE9ICdfJyAmJiBjICE9ICcgJyAmJiBjICE9ICctJyAmJgorICAgICAgICAgICAgICAgIGMgIT0gJygnICYmIGMgIT0gJyknICYmIGMgIT0gJy8nICYmIGMgIT0gJysnICYmIGMgIT0gJzsnICkKKyAgICAgICAgICAgICAgICBuZWVkX3F1b3RlID0gMTsKKworICAgICAgICAgICAgaWYoICFpc2FsbnVtKGMpICYmICghY3ZfaXNwcmludChjKSB8fCBjID09ICdcXCcgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpkYXRhKysgPSAnXFwnOworICAgICAgICAgICAgICAgIGlmKCBjdl9pc3ByaW50KGMpICkKKyAgICAgICAgICAgICAgICAgICAgKmRhdGErKyA9IGM7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnXG4nICkKKyAgICAgICAgICAgICAgICAgICAgKmRhdGErKyA9ICduJzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdccicgKQorICAgICAgICAgICAgICAgICAgICAqZGF0YSsrID0gJ3InOworICAgICAgICAgICAgICAgIGVsc2UgaWYoIGMgPT0gJ1x0JyApCisgICAgICAgICAgICAgICAgICAgICpkYXRhKysgPSAndCc7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggZGF0YSwgInglMDJ4IiwgYyApOworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpkYXRhKysgPSBjOworICAgICAgICB9CisgICAgICAgIGlmKCAhbmVlZF9xdW90ZSAmJiAoaXNkaWdpdChzdHJbMF0pIHx8CisgICAgICAgICAgICBzdHJbMF0gPT0gJysnIHx8IHN0clswXSA9PSAnLScgfHwgc3RyWzBdID09ICcuJyApKQorICAgICAgICAgICAgbmVlZF9xdW90ZSA9IDE7CisKKyAgICAgICAgaWYoIG5lZWRfcXVvdGUgKQorICAgICAgICAgICAgKmRhdGErKyA9ICdcIic7CisgICAgICAgICpkYXRhKysgPSAnXDAnOworICAgICAgICBkYXRhID0gYnVmICsgIW5lZWRfcXVvdGU7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggaWN2WU1MV3JpdGUoIGZzLCBrZXksIGRhdGEsIGN2RnVuY05hbWUgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZZTUxXcml0ZUNvbW1lbnQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgZW9sX2NvbW1lbnQgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WU1MV3JpdGVDb21tZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGxlbjsgLy8sIGluZGVudDsKKyAgICBpbnQgbXVsdGlsaW5lOworICAgIGNvbnN0IGNoYXIqIGVvbDsKKyAgICBjaGFyKiBwdHI7CisKKyAgICBpZiggIWNvbW1lbnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgY29tbWVudCIgKTsKKworICAgIGxlbiA9IChpbnQpc3RybGVuKGNvbW1lbnQpOworICAgIGVvbCA9IHN0cmNocihjb21tZW50LCAnXG4nKTsKKyAgICBtdWx0aWxpbmUgPSBlb2wgIT0gMDsKKyAgICBwdHIgPSBmcy0+YnVmZmVyOworCisgICAgaWYoICFlb2xfY29tbWVudCB8fCBtdWx0aWxpbmUgfHwKKyAgICAgICAgZnMtPmJ1ZmZlcl9lbmQgLSBwdHIgPCBsZW4gfHwgcHRyID09IGZzLT5idWZmZXJfc3RhcnQgKQorICAgICAgICBwdHIgPSBpY3ZGU0ZsdXNoKCBmcyApOworICAgIGVsc2UKKyAgICAgICAgKnB0cisrID0gJyAnOworCisgICAgd2hpbGUoIGNvbW1lbnQgKQorICAgIHsKKyAgICAgICAgKnB0cisrID0gJyMnOworICAgICAgICAqcHRyKysgPSAnICc7CisgICAgICAgIGlmKCBlb2wgKQorICAgICAgICB7CisgICAgICAgICAgICBwdHIgPSBpY3ZGU1Jlc2l6ZVdyaXRlQnVmZmVyKCBmcywgcHRyLCAoaW50KShlb2wgLSBjb21tZW50KSArIDEgKTsKKyAgICAgICAgICAgIG1lbWNweSggcHRyLCBjb21tZW50LCBlb2wgLSBjb21tZW50ICsgMSApOworICAgICAgICAgICAgZnMtPmJ1ZmZlciA9IHB0ciArIChlb2wgLSBjb21tZW50KTsKKyAgICAgICAgICAgIGNvbW1lbnQgPSBlb2wgKyAxOworICAgICAgICAgICAgZW9sID0gc3RyY2hyKCBjb21tZW50LCAnXG4nICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBsZW4gPSAoaW50KXN0cmxlbihjb21tZW50KTsKKyAgICAgICAgICAgIHB0ciA9IGljdkZTUmVzaXplV3JpdGVCdWZmZXIoIGZzLCBwdHIsIGxlbiApOworICAgICAgICAgICAgbWVtY3B5KCBwdHIsIGNvbW1lbnQsIGxlbiApOworICAgICAgICAgICAgZnMtPmJ1ZmZlciA9IHB0ciArIGxlbjsKKyAgICAgICAgICAgIGNvbW1lbnQgPSAwOworICAgICAgICB9CisgICAgICAgIHB0ciA9IGljdkZTRmx1c2goIGZzICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUwgUGFyc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfWE1MX0lOU0lERV9DT01NRU5UIDEKKyNkZWZpbmUgQ1ZfWE1MX0lOU0lERV9UQUcgMgorI2RlZmluZSBDVl9YTUxfSU5TSURFX0RJUkVDVElWRSAzCisKK3N0YXRpYyBjaGFyKgoraWN2WE1MU2tpcFNwYWNlcyggQ3ZGaWxlU3RvcmFnZSogZnMsIGNoYXIqIHB0ciwgaW50IG1vZGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WE1MU2tpcFNwYWNlcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBsZXZlbCA9IDA7CisKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBjaGFyIGM7CisgICAgICAgIHB0ci0tOworCisgICAgICAgIGlmKCBtb2RlID09IENWX1hNTF9JTlNJREVfQ09NTUVOVCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvIGMgPSAqKytwdHI7CisgICAgICAgICAgICB3aGlsZSggY3ZfaXNwcmludF9vcl90YWIoYykgJiYgKGMgIT0gJy0nIHx8IHB0clsxXSAhPSAnLScgfHwgcHRyWzJdICE9ICc+JykgKTsKKworICAgICAgICAgICAgaWYoIGMgPT0gJy0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHB0clsxXSA9PSAnLScgJiYgcHRyWzJdID09ICc+JyApOworICAgICAgICAgICAgICAgIG1vZGUgPSAwOworICAgICAgICAgICAgICAgIHB0ciArPSAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIG1vZGUgPT0gQ1ZfWE1MX0lOU0lERV9ESVJFQ1RJVkUgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyAhISFOT1RFISEhIFRoaXMgaXMgbm90IHF1aXRlIGNvcnJlY3QsIGJ1dCBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzCisgICAgICAgICAgICBkbworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAqKytwdHI7CisgICAgICAgICAgICAgICAgbGV2ZWwgKz0gYyA9PSAnPCc7CisgICAgICAgICAgICAgICAgbGV2ZWwgLT0gYyA9PSAnPic7CisgICAgICAgICAgICAgICAgaWYoIGxldmVsIDwgMCApCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9IHdoaWxlKCBjdl9pc3ByaW50X29yX3RhYihjKSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG8gYyA9ICorK3B0cjsKKyAgICAgICAgICAgIHdoaWxlKCBjID09ICcgJyB8fCBjID09ICdcdCcgKTsKKworICAgICAgICAgICAgaWYoIGMgPT0gJzwnICYmIHB0clsxXSA9PSAnIScgJiYgcHRyWzJdID09ICctJyAmJiBwdHJbM10gPT0gJy0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggbW9kZSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJDb21tZW50cyBhcmUgbm90IGFsbG93ZWQgaGVyZSIgKTsKKyAgICAgICAgICAgICAgICBtb2RlID0gQ1ZfWE1MX0lOU0lERV9DT01NRU5UOworICAgICAgICAgICAgICAgIHB0ciArPSA0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggY3ZfaXNwcmludChjKSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggIWN2X2lzcHJpbnQoKnB0cikgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWF4X3NpemUgPSAoaW50KShmcy0+YnVmZmVyX2VuZCAtIGZzLT5idWZmZXJfc3RhcnQpOworICAgICAgICAgICAgaWYoICpwdHIgIT0gJ1wwJyAmJiAqcHRyICE9ICdcbicgJiYgKnB0ciAhPSAnXHInICkKKyAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkludmFsaWQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0iICk7CisgICAgICAgICAgICBwdHIgPSBmZ2V0cyggZnMtPmJ1ZmZlcl9zdGFydCwgbWF4X3NpemUsIGZzLT5maWxlICk7CisgICAgICAgICAgICBpZiggIXB0ciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcHRyID0gZnMtPmJ1ZmZlcl9zdGFydDsKKyAgICAgICAgICAgICAgICAqcHRyID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBmcy0+ZHVtbXlfZW9mID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgbCA9IChpbnQpc3RybGVuKHB0cik7CisgICAgICAgICAgICAgICAgaWYoIHB0cltsLTFdICE9ICdcbicgJiYgcHRyW2wtMV0gIT0gJ1xyJyAmJiAhZmVvZihmcy0+ZmlsZSkgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlRvbyBsb25nIHN0cmluZyBvciBhIGxhc3Qgc3RyaW5nIHcvbyBuZXdsaW5lIiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMtPmxpbmVubysrOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworc3RhdGljIGNoYXIqCitpY3ZYTUxQYXJzZVRhZyggQ3ZGaWxlU3RvcmFnZSogZnMsIGNoYXIqIHB0ciwgQ3ZTdHJpbmdIYXNoTm9kZSoqIF90YWcsCisgICAgICAgICAgICAgICAgQ3ZBdHRyTGlzdCoqIF9saXN0LCBpbnQqIF90YWdfdHlwZSApOworCitzdGF0aWMgY2hhcioKK2ljdlhNTFBhcnNlVmFsdWUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjaGFyKiBwdHIsIEN2RmlsZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICBpbnQgdmFsdWVfdHlwZSBDVl9ERUZBVUxUKENWX05PREVfTk9ORSkpCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZYTUxQYXJzZVZhbHVlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZGaWxlTm9kZSAqZWxlbSA9IG5vZGU7CisgICAgaW50IGhhdmVfc3BhY2UgPSAxLCBpc19zaW1wbGUgPSAxOworICAgIGludCBpc191c2VyX3R5cGUgPSBDVl9OT0RFX0lTX1VTRVIodmFsdWVfdHlwZSk7CisgICAgbWVtc2V0KCBub2RlLCAwLCBzaXplb2YoKm5vZGUpICk7CisKKyAgICB2YWx1ZV90eXBlID0gQ1ZfTk9ERV9UWVBFKHZhbHVlX3R5cGUpOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgY2hhciBjID0gKnB0ciwgZDsKKyAgICAgICAgY2hhciogZW5kcHRyOworCisgICAgICAgIGlmKCBpc3NwYWNlKGMpIHx8IGMgPT0gJ1wwJyB8fCAoYyA9PSAnPCcgJiYgcHRyWzFdID09ICchJyAmJiBwdHJbMl0gPT0gJy0nKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdlhNTFNraXBTcGFjZXMoIGZzLCBwdHIsIDAgKSk7CisgICAgICAgICAgICBoYXZlX3NwYWNlID0gMTsKKyAgICAgICAgICAgIGMgPSAqcHRyOworICAgICAgICB9CisKKyAgICAgICAgZCA9IHB0clsxXTsKKworICAgICAgICBpZiggYyA9PSc8JyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U3RyaW5nSGFzaE5vZGUgKmtleSA9IDAsICprZXkyID0gMDsKKyAgICAgICAgICAgIEN2QXR0ckxpc3QqIGxpc3QgPSAwOworICAgICAgICAgICAgQ3ZUeXBlSW5mbyogaW5mbyA9IDA7CisgICAgICAgICAgICBpbnQgdGFnX3R5cGUgPSAwOworICAgICAgICAgICAgaW50IGlzX25vbmFtZSA9IDA7CisgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX25hbWUgPSAwOworICAgICAgICAgICAgaW50IGVsZW1fdHlwZSA9IENWX05PREVfTk9ORTsKKworICAgICAgICAgICAgaWYoIGQgPT0gJy8nICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WE1MUGFyc2VUYWcoIGZzLCBwdHIsICZrZXksICZsaXN0LCAmdGFnX3R5cGUgKSk7CisKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSA9PSBDVl9YTUxfRElSRUNUSVZFX1RBRyApCisgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJEaXJlY3RpdmUgdGFncyBhcmUgbm90IGFsbG93ZWQgaGVyZSIgKTsKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSA9PSBDVl9YTUxfRU1QVFlfVEFHICkKKyAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkVtcHR5IHRhZ3MgYXJlIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICAgICAgICAgIGFzc2VydCggdGFnX3R5cGUgPT0gQ1ZfWE1MX09QRU5JTkdfVEFHICk7CisKKyAgICAgICAgICAgIHR5cGVfbmFtZSA9IGxpc3QgPyBjdkF0dHJWYWx1ZSggbGlzdCwgInR5cGVfaWQiICkgOiAwOworICAgICAgICAgICAgaWYoIHR5cGVfbmFtZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHN0cmNtcCggdHlwZV9uYW1lLCAic3RyIiApID09IDAgKQorICAgICAgICAgICAgICAgICAgICBlbGVtX3R5cGUgPSBDVl9OT0RFX1NUUklORzsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBzdHJjbXAoIHR5cGVfbmFtZSwgIm1hcCIgKSA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgZWxlbV90eXBlID0gQ1ZfTk9ERV9NQVA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggc3RyY21wKCB0eXBlX25hbWUsICJzZXEiICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIGVsZW1fdHlwZSA9IENWX05PREVfTUFQOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIENWX0NBTEwoIGluZm8gPSBjdkZpbmRUeXBlKCB0eXBlX25hbWUgKSk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpbmZvICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1fdHlwZSA9IENWX05PREVfVVNFUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlzX25vbmFtZSA9IGtleS0+c3RyLmxlbiA9PSAxICYmIGtleS0+c3RyLnB0clswXSA9PSAnXyc7CisgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfQ09MTEVDVElPTihub2RlLT50YWcpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBpY3ZGU0NyZWF0ZUNvbGxlY3Rpb24oIGZzLCBpc19ub25hbWUgPyBDVl9OT0RFX1NFUSA6IENWX05PREVfTUFQLCBub2RlICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggaXNfbm9uYW1lIF4gQ1ZfTk9ERV9JU19TRVEobm9kZS0+dGFnKSApCisgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoIGlzX25vbmFtZSA/ICJNYXAgZWxlbWVudCBzaG91bGQgaGF2ZSBhIG5hbWUiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXF1ZW5jZSBlbGVtZW50IHNob3VsZCBub3QgaGF2ZSBuYW1lICh1c2UgPF8+PC9fPikiICk7CisKKyAgICAgICAgICAgIGlmKCBpc19ub25hbWUgKQorICAgICAgICAgICAgICAgIGVsZW0gPSAoQ3ZGaWxlTm9kZSopY3ZTZXFQdXNoKCBub2RlLT5kYXRhLnNlcSwgMCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIENWX0NBTEwoIGVsZW0gPSBjdkdldEZpbGVOb2RlKCBmcywgbm9kZSwga2V5LCAxICkpOworCisgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxQYXJzZVZhbHVlKCBmcywgcHRyLCBlbGVtLCBlbGVtX3R5cGUpKTsKKyAgICAgICAgICAgIGlmKCAhaXNfbm9uYW1lICkKKyAgICAgICAgICAgICAgICBlbGVtLT50YWcgfD0gQ1ZfTk9ERV9OQU1FRDsKKyAgICAgICAgICAgIGlzX3NpbXBsZSAmPSAhQ1ZfTk9ERV9JU19DT0xMRUNUSU9OKGVsZW0tPnRhZyk7CisgICAgICAgICAgICBlbGVtLT5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdlhNTFBhcnNlVGFnKCBmcywgcHRyLCAma2V5MiwgJmxpc3QsICZ0YWdfdHlwZSApKTsKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSAhPSBDVl9YTUxfQ0xPU0lOR19UQUcgfHwga2V5MiAhPSBrZXkgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiTWlzbWF0Y2hlZCBjbG9zaW5nIHRhZyIgKTsKKyAgICAgICAgICAgIGhhdmVfc3BhY2UgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFoYXZlX3NwYWNlICkKKyAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlRoZXJlIHNob3VsZCBiZSBzcGFjZSBiZXR3ZWVuIGxpdGVyYWxzIiApOworCisgICAgICAgICAgICBlbGVtID0gbm9kZTsKKyAgICAgICAgICAgIGlmKCBub2RlLT50YWcgIT0gQ1ZfTk9ERV9OT05FICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfQ09MTEVDVElPTihub2RlLT50YWcpICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2RlNDcmVhdGVDb2xsZWN0aW9uKCBmcywgQ1ZfTk9ERV9TRVEsIG5vZGUgKSk7CisKKyAgICAgICAgICAgICAgICBlbGVtID0gKEN2RmlsZU5vZGUqKWN2U2VxUHVzaCggbm9kZS0+ZGF0YS5zZXEsIDAgKTsKKyAgICAgICAgICAgICAgICBlbGVtLT5pbmZvID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIHZhbHVlX3R5cGUgIT0gQ1ZfTk9ERV9TVFJJTkcgJiYKKyAgICAgICAgICAgICAgICAoaXNkaWdpdChjKSB8fCAoKGMgPT0gJy0nIHx8IGMgPT0gJysnKSAmJgorICAgICAgICAgICAgICAgIChpc2RpZ2l0KGQpIHx8IGQgPT0gJy4nKSkgfHwgKGMgPT0gJy4nICYmIGlzYWxudW0oZCkpKSApIC8vIGEgbnVtYmVyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGZ2YWw7CisgICAgICAgICAgICAgICAgaW50IGl2YWw7CisgICAgICAgICAgICAgICAgZW5kcHRyID0gcHRyICsgKGMgPT0gJy0nIHx8IGMgPT0gJysnKTsKKyAgICAgICAgICAgICAgICB3aGlsZSggaXNkaWdpdCgqZW5kcHRyKSApCisgICAgICAgICAgICAgICAgICAgIGVuZHB0cisrOworICAgICAgICAgICAgICAgIGlmKCAqZW5kcHRyID09ICcuJyB8fCAqZW5kcHRyID09ICdlJyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmdmFsID0gaWN2X3N0cnRvZCggZnMsIHB0ciwgJmVuZHB0ciApOworICAgICAgICAgICAgICAgICAgICAvKmlmKCBlbmRwdHIgPT0gcHRyIHx8IGlzYWxwaGEoKmVuZHB0cikgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2UHJvY2Vzc1NwZWNpYWxEb3VibGUoIGZzLCBwdHIsICZmdmFsLCAmZW5kcHRyICkpOyovCisgICAgICAgICAgICAgICAgICAgIGVsZW0tPnRhZyA9IENWX05PREVfUkVBTDsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS0+ZGF0YS5mID0gZnZhbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaXZhbCA9IChpbnQpc3RydG9sKCBwdHIsICZlbmRwdHIsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxlbS0+dGFnID0gQ1ZfTk9ERV9JTlQ7CisgICAgICAgICAgICAgICAgICAgIGVsZW0tPmRhdGEuaSA9IGl2YWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIGVuZHB0ciA9PSBwdHIgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkludmFsaWQgbnVtZXJpYyB2YWx1ZSAoaW5jb25zaXN0ZW50IGV4cGxpY2l0IHR5cGUgc3BlY2lmaWNhdGlvbj8pIiApOworCisgICAgICAgICAgICAgICAgcHRyID0gZW5kcHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vIHN0cmluZworICAgICAgICAgICAgICAgIGNoYXIgYnVmW0NWX0ZTX01BWF9MRU4rMTZdOworICAgICAgICAgICAgICAgIGludCBpID0gMCwgbGVuLCBpc19xdW90ZWQgPSAwOworICAgICAgICAgICAgICAgIGVsZW0tPnRhZyA9IENWX05PREVfU1RSSU5HOworICAgICAgICAgICAgICAgIGlmKCBjID09ICdcIicgKQorICAgICAgICAgICAgICAgICAgICBpc19xdW90ZWQgPSAxOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgLS1wdHI7CisKKyAgICAgICAgICAgICAgICBmb3IoIDs7ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGMgPSAqKytwdHI7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNhbG51bShjKSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjID09ICdcIicgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNfcXVvdGVkICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJMaXRlcmFsIFwiIGlzIG5vdCBhbGxvd2VkIHdpdGhpbiBhIHN0cmluZy4gVXNlICZxdW90OyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3B0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoICFjdl9pc3ByaW50KGMpIHx8IGMgPT0gJzwnIHx8ICghaXNfcXVvdGVkICYmIGlzc3BhY2UoYykpKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBpc19xdW90ZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkNsb3NpbmcgXCIgaXMgZXhwZWN0ZWQiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcJycgfHwgYyA9PSAnPicgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiTGl0ZXJhbCBcJyBvciA+IGFyZSBub3QgYWxsb3dlZC4gVXNlICZhcG9zOyBvciAmZ3Q7IiApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnJicgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHRyID09ICcjJyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gKGludClzdHJ0b2woIHB0ciwgJmVuZHB0ciwgMCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXZhbCA+ICh1bnNpZ25lZCkyNTUgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFlbmRwdHIgfHwgKmVuZHB0ciAhPSAnOycgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJJbnZhbGlkIG51bWVyaWMgdmFsdWUgaW4gdGhlIHN0cmluZyIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChjaGFyKXZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcHRyID0gcHRyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIGMgPSAqKytlbmRwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBpc2FsbnVtKGMpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjICE9ICc7JyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkludmFsaWQgY2hhcmFjdGVyIGluIHRoZSBzeW1ib2wgZW50aXR5IG5hbWUiICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpKGVuZHB0ciAtIHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBsZW4gPT0gMiAmJiBtZW1jbXAoIHB0ciwgImx0IiwgbGVuICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJzwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBsZW4gPT0gMiAmJiBtZW1jbXAoIHB0ciwgImd0IiwgbGVuICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJz4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBsZW4gPT0gMyAmJiBtZW1jbXAoIHB0ciwgImFtcCIsIGxlbiApID09IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9ICcmJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbGVuID09IDQgJiYgbWVtY21wKCBwdHIsICJhcG9zIiwgbGVuICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1wnJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbGVuID09IDQgJiYgbWVtY21wKCBwdHIsICJxdW90IiwgbGVuICkgPT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gJ1wiJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGJ1ZiArIGksIHB0ci0xLCBsZW4gKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpICs9IGxlbiArIDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gZW5kcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ1ZltpKytdID0gYzsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPj0gQ1ZfRlNfTUFYX0xFTiApCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlRvbyBsb25nIHN0cmluZyBsaXRlcmFsIiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBlbGVtLT5kYXRhLnN0ciA9IGN2TWVtU3RvcmFnZUFsbG9jU3RyaW5nKCBmcy0+bWVtc3RvcmFnZSwgYnVmLCBpICkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggIUNWX05PREVfSVNfQ09MTEVDVElPTih2YWx1ZV90eXBlKSAmJiB2YWx1ZV90eXBlICE9IENWX05PREVfTk9ORSApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBoYXZlX3NwYWNlID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAoQ1ZfTk9ERV9UWVBFKG5vZGUtPnRhZykgPT0gQ1ZfTk9ERV9OT05FIHx8CisgICAgICAgIChDVl9OT0RFX1RZUEUobm9kZS0+dGFnKSAhPSB2YWx1ZV90eXBlICYmCisgICAgICAgICFDVl9OT0RFX0lTX0NPTExFQ1RJT04obm9kZS0+dGFnKSkpICYmCisgICAgICAgIENWX05PREVfSVNfQ09MTEVDVElPTih2YWx1ZV90eXBlKSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZGU0NyZWF0ZUNvbGxlY3Rpb24oIGZzLCBDVl9OT0RFX0lTX01BUCh2YWx1ZV90eXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfTk9ERV9NQVAgOiBDVl9OT0RFX1NFUSwgbm9kZSApKTsKKyAgICB9CisKKyAgICBpZiggdmFsdWVfdHlwZSAhPSBDVl9OT0RFX05PTkUgJiYKKyAgICAgICAgdmFsdWVfdHlwZSAhPSBDVl9OT0RFX1RZUEUobm9kZS0+dGFnKSApCisgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiVGhlIGFjdHVhbCB0eXBlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgdHlwZSIgKTsKKworICAgIGlmKCBDVl9OT0RFX0lTX0NPTExFQ1RJT04obm9kZS0+dGFnKSAmJiBpc19zaW1wbGUgKQorICAgICAgICAgICAgbm9kZS0+ZGF0YS5zZXEtPmZsYWdzIHw9IENWX05PREVfU0VRX1NJTVBMRTsKKworICAgIG5vZGUtPnRhZyB8PSBpc191c2VyX3R5cGUgPyBDVl9OT0RFX1VTRVIgOiAwOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKworc3RhdGljIGNoYXIqCitpY3ZYTUxQYXJzZVRhZyggQ3ZGaWxlU3RvcmFnZSogZnMsIGNoYXIqIHB0ciwgQ3ZTdHJpbmdIYXNoTm9kZSoqIF90YWcsCisgICAgICAgICAgICAgICAgQ3ZBdHRyTGlzdCoqIF9saXN0LCBpbnQqIF90YWdfdHlwZSApCit7CisgICAgaW50IHRhZ190eXBlID0gMDsKKyAgICBDdlN0cmluZ0hhc2hOb2RlKiB0YWduYW1lID0gMDsKKyAgICBDdkF0dHJMaXN0ICpmaXJzdCA9IDAsICpsYXN0ID0gMDsKKyAgICBpbnQgY291bnQgPSAwLCBtYXhfY291bnQgPSA0OworICAgIGludCBhdHRyX2J1Zl9zaXplID0gKG1heF9jb3VudCoyICsgMSkqc2l6ZW9mKGNoYXIqKSArIHNpemVvZihDdkF0dHJMaXN0KTsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2WE1MUGFyc2VUYWciICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyKiBlbmRwdHI7CisgICAgY2hhciBjOworICAgIGludCBoYXZlX3NwYWNlOworCisgICAgaWYoICpwdHIgIT0gJzwnICkKKyAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJUYWcgc2hvdWxkIHN0YXJ0IHdpdGggXCc8XCciICk7CisKKyAgICBwdHIrKzsKKyAgICBpZiggaXNhbG51bSgqcHRyKSB8fCAqcHRyID09ICdfJyApCisgICAgICAgIHRhZ190eXBlID0gQ1ZfWE1MX09QRU5JTkdfVEFHOworICAgIGVsc2UgaWYoICpwdHIgPT0gJy8nICkKKyAgICB7CisgICAgICAgIHRhZ190eXBlID0gQ1ZfWE1MX0NMT1NJTkdfVEFHOworICAgICAgICBwdHIrKzsKKyAgICB9CisgICAgZWxzZSBpZiggKnB0ciA9PSAnPycgKQorICAgIHsKKyAgICAgICAgdGFnX3R5cGUgPSBDVl9YTUxfSEVBREVSX1RBRzsKKyAgICAgICAgcHRyKys7CisgICAgfQorICAgIGVsc2UgaWYoICpwdHIgPT0gJyEnICkKKyAgICB7CisgICAgICAgIHRhZ190eXBlID0gQ1ZfWE1MX0RJUkVDVElWRV9UQUc7CisgICAgICAgIGFzc2VydCggcHRyWzFdICE9ICctJyB8fCBwdHJbMl0gIT0gJy0nICk7CisgICAgICAgIHB0cisrOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiVW5rbm93biB0YWcgdHlwZSIgKTsKKworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIEN2U3RyaW5nSGFzaE5vZGUqIGF0dHJuYW1lOworCisgICAgICAgIGlmKCAhaXNhbHBoYSgqcHRyKSAmJiAqcHRyICE9ICdfJyApCisgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIk5hbWUgc2hvdWxkIHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgdW5kZXJzY29yZSIgKTsKKworICAgICAgICBlbmRwdHIgPSBwdHIgLSAxOworICAgICAgICBkbyBjID0gKisrZW5kcHRyOworICAgICAgICB3aGlsZSggaXNhbG51bShjKSB8fCBjID09ICdfJyB8fCBjID09ICctJyApOworCisgICAgICAgIENWX0NBTEwoIGF0dHJuYW1lID0gY3ZHZXRIYXNoZWRLZXkoIGZzLCBwdHIsIChpbnQpKGVuZHB0ciAtIHB0ciksIDEgKSk7CisgICAgICAgIHB0ciA9IGVuZHB0cjsKKworICAgICAgICBpZiggIXRhZ25hbWUgKQorICAgICAgICAgICAgdGFnbmFtZSA9IGF0dHJuYW1lOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSA9PSBDVl9YTUxfQ0xPU0lOR19UQUcgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiQ2xvc2luZyB0YWcgc2hvdWxkIG5vdCBjb250YWluIGFueSBhdHRyaWJ1dGVzIiApOworCisgICAgICAgICAgICBpZiggIWxhc3QgfHwgY291bnQgPj0gbWF4X2NvdW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkF0dHJMaXN0KiBjaHVuazsKKworICAgICAgICAgICAgICAgIENWX0NBTEwoIGNodW5rID0gKEN2QXR0ckxpc3QqKWN2TWVtU3RvcmFnZUFsbG9jKCBmcy0+bWVtc3RvcmFnZSwgYXR0cl9idWZfc2l6ZSApKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQoIGNodW5rLCAwLCBhdHRyX2J1Zl9zaXplICk7CisgICAgICAgICAgICAgICAgY2h1bmstPmF0dHIgPSAoY29uc3QgY2hhcioqKShjaHVuayArIDEpOworICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBpZiggIWxhc3QgKQorICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGxhc3QgPSBjaHVuazsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBsYXN0LT5uZXh0ID0gY2h1bms7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsYXN0LT5hdHRyW2NvdW50KjJdID0gYXR0cm5hbWUtPnN0ci5wdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiggbGFzdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RmlsZU5vZGUgc3R1YjsKKworICAgICAgICAgICAgaWYoICpwdHIgIT0gJz0nICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxTa2lwU3BhY2VzKCBmcywgcHRyLCBDVl9YTUxfSU5TSURFX1RBRyApKTsKKyAgICAgICAgICAgICAgICBpZiggKnB0ciAhPSAnPScgKQorICAgICAgICAgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIkF0dHJpYnV0ZSBuYW1lIHNob3VsZCBiZSBmb2xsb3dlZCBieSBcJz1cJyIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYyA9ICorK3B0cjsKKyAgICAgICAgICAgIGlmKCBjICE9ICdcIicgJiYgYyAhPSAnXCcnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxTa2lwU3BhY2VzKCBmcywgcHRyLCBDVl9YTUxfSU5TSURFX1RBRyApKTsKKyAgICAgICAgICAgICAgICBpZiggKnB0ciAhPSAnXCInICYmICpwdHIgIT0gJ1wnJyApCisgICAgICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiQXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBwdXQgaW50byBzaW5nbGUgb3IgZG91YmxlIHF1b3RlcyIgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHRyID0gaWN2WE1MUGFyc2VWYWx1ZSggZnMsIHB0ciwgJnN0dWIsIENWX05PREVfU1RSSU5HICk7CisgICAgICAgICAgICBhc3NlcnQoIHN0dWIudGFnID09IENWX05PREVfU1RSSU5HICk7CisgICAgICAgICAgICBsYXN0LT5hdHRyW2NvdW50KjIrMV0gPSBzdHViLmRhdGEuc3RyLnB0cjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKworICAgICAgICBjID0gKnB0cjsKKyAgICAgICAgaGF2ZV9zcGFjZSA9IGlzc3BhY2UoYykgfHwgYyA9PSAnXDAnOworCisgICAgICAgIGlmKCBjICE9ICc+JyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdlhNTFNraXBTcGFjZXMoIGZzLCBwdHIsIENWX1hNTF9JTlNJREVfVEFHICkpOworICAgICAgICAgICAgYyA9ICpwdHI7CisgICAgICAgIH0KKworICAgICAgICBpZiggYyA9PSAnPicgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdGFnX3R5cGUgPT0gQ1ZfWE1MX0hFQURFUl9UQUcgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiSW52YWxpZCBjbG9zaW5nIHRhZyBmb3IgPD94bWwgLi4uIiApOworICAgICAgICAgICAgcHRyKys7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjID09ICc/JyAmJiB0YWdfdHlwZSA9PSBDVl9YTUxfSEVBREVSX1RBRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwdHJbMV0gIT0gJz4nICApCisgICAgICAgICAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJJbnZhbGlkIGNsb3NpbmcgdGFnIGZvciA8P3htbCAuLi4iICk7CisgICAgICAgICAgICBwdHIgKz0gMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGMgPT0gJy8nICYmIHB0clsxXSA9PSAnPicgJiYgdGFnX3R5cGUgPT0gQ1ZfWE1MX09QRU5JTkdfVEFHICkKKyAgICAgICAgeworICAgICAgICAgICAgdGFnX3R5cGUgPSBDVl9YTUxfRU1QVFlfVEFHOworICAgICAgICAgICAgcHRyICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhaGF2ZV9zcGFjZSApCisgICAgICAgICAgICBDVl9QQVJTRV9FUlJPUiggIlRoZXJlIHNob3VsZCBiZSBzcGFjZSBiZXR3ZWVuIGF0dHJpYnV0ZXMiICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgICpfdGFnID0gdGFnbmFtZTsKKyAgICAqX3RhZ190eXBlID0gdGFnX3R5cGU7CisgICAgKl9saXN0ID0gZmlyc3Q7CisKKyAgICByZXR1cm4gcHRyOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZYTUxQYXJzZSggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WE1MUGFyc2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyKiBwdHIgPSBmcy0+YnVmZmVyX3N0YXJ0OworICAgIEN2U3RyaW5nSGFzaE5vZGUgKmtleSA9IDAsICprZXkyID0gMDsKKyAgICBDdkF0dHJMaXN0KiBsaXN0ID0gMDsKKyAgICBpbnQgdGFnX3R5cGUgPSAwOworCisgICAgLy8gQ1ZfWE1MX0lOU0lERV9UQUcgaXMgdXNlZCB0byBwcm9oaWJpdCBsZWFkaW5nIGNvbW1lbnRzCisgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WE1MU2tpcFNwYWNlcyggZnMsIHB0ciwgQ1ZfWE1MX0lOU0lERV9UQUcgKSk7CisKKyAgICBpZiggbWVtY21wKCBwdHIsICI8P3htbCIsIDUgKSAhPSAwICkKKyAgICAgICAgQ1ZfUEFSU0VfRVJST1IoICJWYWxpZCBYTUwgc2hvdWxkIHN0YXJ0IHdpdGggXCc8P3htbCAuLi4/PlwnIiApOworCisgICAgQ1ZfQ0FMTCggcHRyID0gaWN2WE1MUGFyc2VUYWcoIGZzLCBwdHIsICZrZXksICZsaXN0LCAmdGFnX3R5cGUgKSk7CisKKyAgICAvKnsKKyAgICAgICAgY29uc3QgY2hhciogdmVyc2lvbiA9IGN2QXR0clZhbHVlKCBsaXN0LCAidmVyc2lvbiIgKTsKKyAgICAgICAgaWYoIHZlcnNpb24gJiYgc3RybmNtcCggdmVyc2lvbiwgIjEuIiwgMiApICE9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJVbnN1cHBvcnRlZCB2ZXJzaW9uIG9mIFhNTCIgKTsKKyAgICB9Ki8KKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIGVuY29kaW5nID0gY3ZBdHRyVmFsdWUoIGxpc3QsICJlbmNvZGluZyIgKTsKKyAgICAgICAgaWYoIGVuY29kaW5nICYmIHN0cmNtcCggZW5jb2RpbmcsICJBU0NJSSIgKSAhPSAwICkKKyAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiVW5zdXBwb3J0ZWQgZW5jb2RpbmciICk7CisgICAgfQorCisgICAgd2hpbGUoICpwdHIgIT0gJ1wwJyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxTa2lwU3BhY2VzKCBmcywgcHRyLCAwICkpOworCisgICAgICAgIGlmKCAqcHRyICE9ICdcMCcgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZpbGVOb2RlKiByb290X25vZGU7CisgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxQYXJzZVRhZyggZnMsIHB0ciwgJmtleSwgJmxpc3QsICZ0YWdfdHlwZSApKTsKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSAhPSBDVl9YTUxfT1BFTklOR19UQUcgfHwKKyAgICAgICAgICAgICAgICBzdHJjbXAoa2V5LT5zdHIucHRyLCJvcGVuY3Zfc3RvcmFnZSIpICE9IDAgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiPG9wZW5jdl9zdG9yYWdlPiB0YWcgaXMgbWlzc2luZyIgKTsKKworICAgICAgICAgICAgcm9vdF9ub2RlID0gKEN2RmlsZU5vZGUqKWN2U2VxUHVzaCggZnMtPnJvb3RzLCAwICk7CisgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxQYXJzZVZhbHVlKCBmcywgcHRyLCByb290X25vZGUsIENWX05PREVfTk9ORSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIHB0ciA9IGljdlhNTFBhcnNlVGFnKCBmcywgcHRyLCAma2V5MiwgJmxpc3QsICZ0YWdfdHlwZSApKTsKKyAgICAgICAgICAgIGlmKCB0YWdfdHlwZSAhPSBDVl9YTUxfQ0xPU0lOR19UQUcgfHwga2V5ICE9IGtleTIgKQorICAgICAgICAgICAgICAgIENWX1BBUlNFX0VSUk9SKCAiPC9vcGVuY3Zfc3RvcmFnZT4gdGFnIGlzIG1pc3NpbmciICk7CisgICAgICAgICAgICBDVl9DQUxMKCBwdHIgPSBpY3ZYTUxTa2lwU3BhY2VzKCBmcywgcHRyLCAwICkpOworICAgICAgICB9CisgICAgfQorCisgICAgYXNzZXJ0KCBmcy0+ZHVtbXlfZW9mICE9IDAgKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MIEVtaXR0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIGljdlhNTEZsdXNoIGljdkZTRmx1c2gKKworc3RhdGljIHZvaWQKK2ljdlhNTFdyaXRlVGFnKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBpbnQgdGFnX3R5cGUsIEN2QXR0ckxpc3QgbGlzdCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZYTUxXcml0ZVRhZyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNoYXIqIHB0ciA9IGZzLT5idWZmZXI7CisgICAgaW50IGksIGxlbiA9IDA7CisgICAgaW50IHN0cnVjdF9mbGFncyA9IGZzLT5zdHJ1Y3RfZmxhZ3M7CisKKyAgICBpZigga2V5ICYmIGtleVswXSA9PSAnXDAnICkKKyAgICAgICAga2V5ID0gMDsKKworICAgIGlmKCB0YWdfdHlwZSA9PSBDVl9YTUxfT1BFTklOR19UQUcgfHwgdGFnX3R5cGUgPT0gQ1ZfWE1MX0VNUFRZX1RBRyApCisgICAgeworICAgICAgICBpZiggQ1ZfTk9ERV9JU19DT0xMRUNUSU9OKHN0cnVjdF9mbGFncykgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQ1ZfTk9ERV9JU19NQVAoc3RydWN0X2ZsYWdzKSBeIChrZXkgIT0gMCkgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJBbiBhdHRlbXB0IHRvIGFkZCBlbGVtZW50IHdpdGhvdXQgYSBrZXkgdG8gYSBtYXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3IgYWRkIGVsZW1lbnQgd2l0aCBrZXkgdG8gc2VxdWVuY2UiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBzdHJ1Y3RfZmxhZ3MgPSBDVl9OT0RFX0VNUFRZICsgKGtleSA/IENWX05PREVfTUFQIDogQ1ZfTk9ERV9TRVEpOworICAgICAgICAgICAgZnMtPmlzX2ZpcnN0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19FTVBUWShzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgICAgIHB0ciA9IGljdlhNTEZsdXNoKGZzKTsKKyAgICB9CisKKyAgICBpZiggIWtleSApCisgICAgICAgIGtleSA9ICJfIjsKKyAgICBlbHNlIGlmKCBrZXlbMF0gPT0gJ18nICYmIGtleVsxXSA9PSAnXDAnICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkEgc2luZ2xlIF8gaXMgYSByZXNlcnZlZCB0YWcgbmFtZSIgKTsKKworICAgIGxlbiA9IChpbnQpc3RybGVuKCBrZXkgKTsKKyAgICAqcHRyKysgPSAnPCc7CisgICAgaWYoIHRhZ190eXBlID09IENWX1hNTF9DTE9TSU5HX1RBRyApCisgICAgeworICAgICAgICBpZiggbGlzdC5hdHRyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJDbG9zaW5nIHRhZyBzaG91bGQgbm90IGluY2x1ZGUgYW55IGF0dHJpYnV0ZXMiICk7CisgICAgICAgICpwdHIrKyA9ICcvJzsKKyAgICB9CisKKyAgICBpZiggIWlzYWxwaGEoa2V5WzBdKSAmJiBrZXlbMF0gIT0gJ18nICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIktleSBzaG91bGQgc3RhcnQgd2l0aCBhIGxldHRlciBvciBfIiApOworCisgICAgcHRyID0gaWN2RlNSZXNpemVXcml0ZUJ1ZmZlciggZnMsIHB0ciwgbGVuICk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGNoYXIgYyA9IGtleVtpXTsKKyAgICAgICAgaWYoICFpc2FsbnVtKGMpICYmIGMgIT0gJ18nICYmIGMgIT0gJy0nICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGNoYXJhY3RlciBpbiB0aGUga2V5IiApOworICAgICAgICBwdHJbaV0gPSBjOworICAgIH0KKyAgICBwdHIgKz0gbGVuOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhcioqIGF0dHIgPSBsaXN0LmF0dHI7CisKKyAgICAgICAgZm9yKCA7IGF0dHIgJiYgYXR0clswXSAhPSAwOyBhdHRyICs9IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGVuMCA9IChpbnQpc3RybGVuKGF0dHJbMF0pOworICAgICAgICAgICAgaW50IGxlbjEgPSAoaW50KXN0cmxlbihhdHRyWzFdKTsKKworICAgICAgICAgICAgcHRyID0gaWN2RlNSZXNpemVXcml0ZUJ1ZmZlciggZnMsIHB0ciwgbGVuMCArIGxlbjEgKyA0ICk7CisgICAgICAgICAgICAqcHRyKysgPSAnICc7CisgICAgICAgICAgICBtZW1jcHkoIHB0ciwgYXR0clswXSwgbGVuMCApOworICAgICAgICAgICAgcHRyICs9IGxlbjA7CisgICAgICAgICAgICAqcHRyKysgPSAnPSc7CisgICAgICAgICAgICAqcHRyKysgPSAnXCInOworICAgICAgICAgICAgbWVtY3B5KCBwdHIsIGF0dHJbMV0sIGxlbjEgKTsKKyAgICAgICAgICAgIHB0ciArPSBsZW4xOworICAgICAgICAgICAgKnB0cisrID0gJ1wiJzsKKyAgICAgICAgfQorICAgICAgICBpZiggIWxpc3QubmV4dCApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgbGlzdCA9ICpsaXN0Lm5leHQ7CisgICAgfQorCisgICAgaWYoIHRhZ190eXBlID09IENWX1hNTF9FTVBUWV9UQUcgKQorICAgICAgICAqcHRyKysgPSAnLyc7CisgICAgKnB0cisrID0gJz4nOworICAgIGZzLT5idWZmZXIgPSBwdHI7CisgICAgZnMtPnN0cnVjdF9mbGFncyA9IHN0cnVjdF9mbGFncyAmIH5DVl9OT0RFX0VNUFRZOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WE1MU3RhcnRXcml0ZVN0cnVjdCggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgaW50IHN0cnVjdF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSBDVl9ERUZBVUxUKDApKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2WE1MU3RhcnRXcml0ZVN0cnVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2WE1MU3RhY2tSZWNvcmQgcGFyZW50OworICAgIGNvbnN0IGNoYXIqIGF0dHJbMTBdOworICAgIGludCBpZHggPSAwOworCisgICAgc3RydWN0X2ZsYWdzID0gKHN0cnVjdF9mbGFncyAmIChDVl9OT0RFX1RZUEVfTUFTS3xDVl9OT0RFX0ZMT1cpKSB8IENWX05PREVfRU1QVFk7CisgICAgaWYoICFDVl9OT0RFX0lTX0NPTExFQ1RJT04oc3RydWN0X2ZsYWdzKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgIlNvbWUgY29sbGVjdGlvbiB0eXBlOiBDVl9OT0RFX1NFUSBvciBDVl9OT0RFX01BUCBtdXN0IGJlIHNwZWNpZmllZCIgKTsKKworICAgIGlmKCB0eXBlX25hbWUgKQorICAgIHsKKyAgICAgICAgYXR0cltpZHgrK10gPSAidHlwZV9pZCI7CisgICAgICAgIGF0dHJbaWR4KytdID0gdHlwZV9uYW1lOworICAgIH0KKyAgICBhdHRyW2lkeCsrXSA9IDA7CisKKyAgICBDVl9DQUxMKCBpY3ZYTUxXcml0ZVRhZyggZnMsIGtleSwgQ1ZfWE1MX09QRU5JTkdfVEFHLCBjdkF0dHJMaXN0KGF0dHIsMCkgKSk7CisKKyAgICBwYXJlbnQuc3RydWN0X2ZsYWdzID0gZnMtPnN0cnVjdF9mbGFncyAmIH5DVl9OT0RFX0VNUFRZOworICAgIHBhcmVudC5zdHJ1Y3RfaW5kZW50ID0gZnMtPnN0cnVjdF9pbmRlbnQ7CisgICAgcGFyZW50LnN0cnVjdF90YWcgPSBmcy0+c3RydWN0X3RhZzsKKyAgICBjdlNhdmVNZW1TdG9yYWdlUG9zKCBmcy0+c3Ryc3RvcmFnZSwgJnBhcmVudC5wb3MgKTsKKyAgICBjdlNlcVB1c2goIGZzLT53cml0ZV9zdGFjaywgJnBhcmVudCApOworCisgICAgZnMtPnN0cnVjdF9pbmRlbnQgKz0gQ1ZfWE1MX0lOREVOVDsKKyAgICBpZiggIUNWX05PREVfSVNfRkxPVyhzdHJ1Y3RfZmxhZ3MpICkKKyAgICAgICAgaWN2WE1MRmx1c2goIGZzICk7CisKKyAgICBmcy0+c3RydWN0X2ZsYWdzID0gc3RydWN0X2ZsYWdzOworICAgIGlmKCBrZXkgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZnMtPnN0cnVjdF90YWcgPSBjdk1lbVN0b3JhZ2VBbGxvY1N0cmluZyggZnMtPnN0cnN0b3JhZ2UsIChjaGFyKilrZXksIC0xICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmcy0+c3RydWN0X3RhZy5wdHIgPSAwOworICAgICAgICBmcy0+c3RydWN0X3RhZy5sZW4gPSAwOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlhNTEVuZFdyaXRlU3RydWN0KCBDdkZpbGVTdG9yYWdlKiBmcyApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZYTUxTdGFydFdyaXRlU3RydWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZYTUxTdGFja1JlY29yZCBwYXJlbnQ7CisKKyAgICBpZiggZnMtPndyaXRlX3N0YWNrLT50b3RhbCA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiQW4gZXh0cmEgY2xvc2luZyB0YWciICk7CisKKyAgICBDVl9DQUxMKCBpY3ZYTUxXcml0ZVRhZyggZnMsIGZzLT5zdHJ1Y3RfdGFnLnB0ciwgQ1ZfWE1MX0NMT1NJTkdfVEFHLCBjdkF0dHJMaXN0KDAsMCkgKSk7CisgICAgY3ZTZXFQb3AoIGZzLT53cml0ZV9zdGFjaywgJnBhcmVudCApOworCisgICAgZnMtPnN0cnVjdF9pbmRlbnQgPSBwYXJlbnQuc3RydWN0X2luZGVudDsKKyAgICBmcy0+c3RydWN0X2ZsYWdzID0gcGFyZW50LnN0cnVjdF9mbGFnczsKKyAgICBmcy0+c3RydWN0X3RhZyA9IHBhcmVudC5zdHJ1Y3RfdGFnOworICAgIGN2UmVzdG9yZU1lbVN0b3JhZ2VQb3MoIGZzLT5zdHJzdG9yYWdlLCAmcGFyZW50LnBvcyApOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WE1MU3RhcnROZXh0U3RyZWFtKCBDdkZpbGVTdG9yYWdlKiBmcyApCit7CisgICAgLy9DVl9GVU5DTkFNRSggImljdlhNTFN0YXJ0TmV4dFN0cmVhbSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZnMtPmlzX2ZpcnN0ICkKKyAgICB7CisgICAgICAgIHdoaWxlKCBmcy0+d3JpdGVfc3RhY2stPnRvdGFsID4gMCApCisgICAgICAgICAgICBpY3ZYTUxFbmRXcml0ZVN0cnVjdChmcyk7CisKKyAgICAgICAgZnMtPnN0cnVjdF9pbmRlbnQgPSAwOworICAgICAgICBpY3ZYTUxGbHVzaChmcyk7CisgICAgICAgIC8qIFhNTCBkb2VzIG5vdCBhbGxvdyBtdWx0aXBsZSB0b3AtbGV2ZWwgZWxlbWVudHMsCisgICAgICAgICAgIHNvIHdlIGp1c3QgcHV0IGEgY29tbWVudCBhbmQgY29udGludWUKKyAgICAgICAgICAgdGhlIGN1cnJlbnQgKGFuZCB0aGUgb25seSkgInN0cmVhbSIgKi8KKyAgICAgICAgZnB1dHMoICJcbjwhLS0gbmV4dCBzdHJlYW0gLS0+XG4iLCBmcy0+ZmlsZSApOworICAgICAgICAvKmZwdXRzKCAiPC9vcGVuY3Zfc3RvcmFnZT5cbiIsIGZzLT5maWxlICk7CisgICAgICAgIGZwdXRzKCAiPG9wZW5jdl9zdG9yYWdlPlxuIiwgZnMtPmZpbGUgKTsqLworICAgICAgICBmcy0+YnVmZmVyID0gZnMtPmJ1ZmZlcl9zdGFydDsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZYTUxXcml0ZVNjYWxhciggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbiApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZYTUxXcml0ZVNjYWxhciIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBDVl9OT0RFX0lTX01BUChmcy0+c3RydWN0X2ZsYWdzKSB8fAorICAgICAgICAoIUNWX05PREVfSVNfQ09MTEVDVElPTihmcy0+c3RydWN0X2ZsYWdzKSAmJiBrZXkpICkKKyAgICB7CisgICAgICAgIGljdlhNTFdyaXRlVGFnKCBmcywga2V5LCBDVl9YTUxfT1BFTklOR19UQUcsIGN2QXR0ckxpc3QoMCwwKSApOworICAgICAgICBjaGFyKiBwdHIgPSBpY3ZGU1Jlc2l6ZVdyaXRlQnVmZmVyKCBmcywgZnMtPmJ1ZmZlciwgbGVuICk7CisgICAgICAgIG1lbWNweSggcHRyLCBkYXRhLCBsZW4gKTsKKyAgICAgICAgZnMtPmJ1ZmZlciA9IHB0ciArIGxlbjsKKyAgICAgICAgaWN2WE1MV3JpdGVUYWcoIGZzLCBrZXksIENWX1hNTF9DTE9TSU5HX1RBRywgY3ZBdHRyTGlzdCgwLDApICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNoYXIqIHB0ciA9IGZzLT5idWZmZXI7CisgICAgICAgIGludCBuZXdfb2Zmc2V0ID0gKGludCkocHRyIC0gZnMtPmJ1ZmZlcl9zdGFydCkgKyBsZW47CisKKyAgICAgICAgaWYoIGtleSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZWxlbWVudHMgd2l0aCBrZXlzIGNhbiBub3QgYmUgd3JpdHRlbiB0byBzZXF1ZW5jZSIgKTsKKworICAgICAgICBmcy0+c3RydWN0X2ZsYWdzID0gQ1ZfTk9ERV9TRVE7CisKKyAgICAgICAgaWYoIChuZXdfb2Zmc2V0ID4gZnMtPndyYXBfbWFyZ2luICYmIG5ld19vZmZzZXQgLSBmcy0+c3RydWN0X2luZGVudCA+IDEwKSB8fAorICAgICAgICAgICAgKHB0ciA+IGZzLT5idWZmZXJfc3RhcnQgJiYgcHRyWy0xXSA9PSAnPicgJiYgIUNWX05PREVfSVNfRU1QVFkoZnMtPnN0cnVjdF9mbGFncykpICkKKyAgICAgICAgeworICAgICAgICAgICAgcHRyID0gaWN2WE1MRmx1c2goZnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHB0ciA+IGZzLT5idWZmZXJfc3RhcnQgKyBmcy0+c3RydWN0X2luZGVudCAmJiBwdHJbLTFdICE9ICc+JyApCisgICAgICAgICAgICAqcHRyKysgPSAnICc7CisKKyAgICAgICAgbWVtY3B5KCBwdHIsIGRhdGEsIGxlbiApOworICAgICAgICBmcy0+YnVmZmVyID0gcHRyICsgbGVuOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlhNTFdyaXRlSW50KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBpbnQgdmFsdWUgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJjdlhNTFdyaXRlSW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBidWZbMTI4XSwgKnB0ciA9IGljdl9pdG9hKCB2YWx1ZSwgYnVmLCAxMCApOworICAgIGludCBsZW4gPSAoaW50KXN0cmxlbihwdHIpOworICAgIGljdlhNTFdyaXRlU2NhbGFyKCBmcywga2V5LCBwdHIsIGxlbiApOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZAoraWN2WE1MV3JpdGVSZWFsKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBkb3VibGUgdmFsdWUgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJjdlhNTFdyaXRlUmVhbCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW50IGxlbiA9IChpbnQpc3RybGVuKCBpY3ZEb3VibGVUb1N0cmluZyggYnVmLCB2YWx1ZSApKTsKKyAgICBpY3ZYTUxXcml0ZVNjYWxhciggZnMsIGtleSwgYnVmLCBsZW4gKTsKKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlhNTFdyaXRlU3RyaW5nKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiBzdHIsIGludCBxdW90ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlhNTFdyaXRlU3RyaW5nIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBidWZbQ1ZfRlNfTUFYX0xFTio2KzE2XTsKKyAgICBjaGFyKiBkYXRhID0gKGNoYXIqKXN0cjsKKyAgICBpbnQgaSwgbGVuOworCisgICAgaWYoICFzdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgc3RyaW5nIHBvaW50ZXIiICk7CisKKyAgICBsZW4gPSAoaW50KXN0cmxlbihzdHIpOworICAgIGlmKCBsZW4gPiBDVl9GU19NQVhfTEVOICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSB3cml0dGVuIHN0cmluZyBpcyB0b28gbG9uZyIgKTsKKworICAgIGlmKCBxdW90ZSB8fCBsZW4gPT0gMCB8fCBzdHJbMF0gIT0gJ1wiJyB8fCBzdHJbMF0gIT0gc3RyW2xlbi0xXSApCisgICAgeworICAgICAgICBpbnQgbmVlZF9xdW90ZSA9IHF1b3RlIHx8IGxlbiA9PSAwOworICAgICAgICBkYXRhID0gYnVmOworICAgICAgICAqZGF0YSsrID0gJ1wiJzsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjID0gc3RyW2ldOworCisgICAgICAgICAgICBpZiggIWlzYWxudW0oYykgJiYgKCFjdl9pc3ByaW50KGMpIHx8IGMgPT0gJzwnIHx8IGMgPT0gJz4nIHx8CisgICAgICAgICAgICAgICAgYyA9PSAnJicgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJykgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICpkYXRhKysgPSAnJic7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJzwnICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShkYXRhLCAibHQiLCAyKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICc+JyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgImd0IiwgMik7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnJicgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEsICJhbXAiLCAzKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSAzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjID09ICdcJycgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEsICJhcG9zIiwgNCk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggYyA9PSAnXCInICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggZGF0YSwgInF1b3QiLCA0KTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBkYXRhLCAiI3glMDJ4IiwgYyApOworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpkYXRhKysgPSAnOyc7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGMgPT0gJyAnICkKKyAgICAgICAgICAgICAgICAgICAgbmVlZF9xdW90ZSA9IDE7CisgICAgICAgICAgICAgICAgKmRhdGErKyA9IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYoICFuZWVkX3F1b3RlICYmIChpc2RpZ2l0KHN0clswXSkgfHwKKyAgICAgICAgICAgIHN0clswXSA9PSAnKycgfHwgc3RyWzBdID09ICctJyB8fCBzdHJbMF0gPT0gJy4nICkpCisgICAgICAgICAgICBuZWVkX3F1b3RlID0gMTsKKworICAgICAgICBpZiggbmVlZF9xdW90ZSApCisgICAgICAgICAgICAqZGF0YSsrID0gJ1wiJzsKKyAgICAgICAgbGVuID0gKGludCkoZGF0YSAtIGJ1ZikgLSAhbmVlZF9xdW90ZTsKKyAgICAgICAgKmRhdGErKyA9ICdcMCc7CisgICAgICAgIGRhdGEgPSBidWYgKyAhbmVlZF9xdW90ZTsKKyAgICB9CisKKyAgICBpY3ZYTUxXcml0ZVNjYWxhciggZnMsIGtleSwgZGF0YSwgbGVuICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZYTUxXcml0ZUNvbW1lbnQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBjb21tZW50LCBpbnQgZW9sX2NvbW1lbnQgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZYTUxXcml0ZUNvbW1lbnQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgbGVuOworICAgIGludCBtdWx0aWxpbmU7CisgICAgY29uc3QgY2hhciogZW9sOworICAgIGNoYXIqIHB0cjsKKworICAgIGlmKCAhY29tbWVudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBjb21tZW50IiApOworCisgICAgaWYoIHN0cnN0cihjb21tZW50LCAiLS0iKSAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkRvdWJsZSBoeXBoZW4gXCctLVwnIGlzIG5vdCBhbGxvd2VkIGluIHRoZSBjb21tZW50cyIgKTsKKworICAgIGxlbiA9IChpbnQpc3RybGVuKGNvbW1lbnQpOworICAgIGVvbCA9IHN0cmNocihjb21tZW50LCAnXG4nKTsKKyAgICBtdWx0aWxpbmUgPSBlb2wgIT0gMDsKKyAgICBwdHIgPSBmcy0+YnVmZmVyOworCisgICAgaWYoIG11bHRpbGluZSB8fCAhZW9sX2NvbW1lbnQgfHwgZnMtPmJ1ZmZlcl9lbmQgLSBwdHIgPCBsZW4gKyA1ICkKKyAgICAgICAgcHRyID0gaWN2WE1MRmx1c2goIGZzICk7CisgICAgZWxzZSBpZiggcHRyID4gZnMtPmJ1ZmZlcl9zdGFydCArIGZzLT5zdHJ1Y3RfaW5kZW50ICkKKyAgICAgICAgKnB0cisrID0gJyAnOworCisgICAgaWYoICFtdWx0aWxpbmUgKQorICAgIHsKKyAgICAgICAgcHRyID0gaWN2RlNSZXNpemVXcml0ZUJ1ZmZlciggZnMsIHB0ciwgbGVuICsgOSApOworICAgICAgICBzcHJpbnRmKCBwdHIsICI8IS0tICVzIC0tPiIsIGNvbW1lbnQgKTsKKyAgICAgICAgbGVuID0gKGludClzdHJsZW4ocHRyKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc3RyY3B5KCBwdHIsICI8IS0tIiApOworICAgICAgICBsZW4gPSA0OworICAgIH0KKworICAgIGZzLT5idWZmZXIgPSBwdHIgKyBsZW47CisgICAgcHRyID0gaWN2WE1MRmx1c2goZnMpOworCisgICAgaWYoIG11bHRpbGluZSApCisgICAgeworICAgICAgICB3aGlsZSggY29tbWVudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBlb2wgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHB0ciA9IGljdkZTUmVzaXplV3JpdGVCdWZmZXIoIGZzLCBwdHIsIChpbnQpKGVvbCAtIGNvbW1lbnQpICsgMSApOworICAgICAgICAgICAgICAgIG1lbWNweSggcHRyLCBjb21tZW50LCBlb2wgLSBjb21tZW50ICsgMSApOworICAgICAgICAgICAgICAgIHB0ciArPSBlb2wgLSBjb21tZW50OworICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBlb2wgKyAxOworICAgICAgICAgICAgICAgIGVvbCA9IHN0cmNociggY29tbWVudCwgJ1xuJyApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGxlbiA9IChpbnQpc3RybGVuKGNvbW1lbnQpOworICAgICAgICAgICAgICAgIHB0ciA9IGljdkZTUmVzaXplV3JpdGVCdWZmZXIoIGZzLCBwdHIsIGxlbiApOworICAgICAgICAgICAgICAgIG1lbWNweSggcHRyLCBjb21tZW50LCBsZW4gKTsKKyAgICAgICAgICAgICAgICBwdHIgKz0gbGVuOworICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMtPmJ1ZmZlciA9IHB0cjsKKyAgICAgICAgICAgIHB0ciA9IGljdlhNTEZsdXNoKCBmcyApOworICAgICAgICB9CisgICAgICAgIHNwcmludGYoIHB0ciwgIi0tPiIgKTsKKyAgICAgICAgZnMtPmJ1ZmZlciA9IHB0ciArIDM7CisgICAgICAgIGljdlhNTEZsdXNoKCBmcyApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uIEhpZ2gtTGV2ZWwgRnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDVl9JTVBMIEN2RmlsZVN0b3JhZ2UqCitjdk9wZW5GaWxlU3RvcmFnZSggY29uc3QgY2hhciogZmlsZW5hbWUsIEN2TWVtU3RvcmFnZSogZHN0c3RvcmFnZSwgaW50IGZsYWdzICkKK3sKKyAgICBDdkZpbGVTdG9yYWdlKiBmcyA9IDA7CisgICAgY2hhciogeG1sX2J1ZiA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZPcGVuRmlsZVN0b3JhZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgZGVmYXVsdF9ibG9ja19zaXplID0gMSA8PCAxODsKKyAgICBib29sIGFwcGVuZCA9IChmbGFncyAmIDMpID09IENWX1NUT1JBR0VfQVBQRU5EOworCisgICAgaWYoICFmaWxlbmFtZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBmaWxlbmFtZSIgKTsKKworICAgIENWX0NBTEwoIGZzID0gKEN2RmlsZVN0b3JhZ2UqKWN2QWxsb2MoIHNpemVvZigqZnMpICkpOworICAgIG1lbXNldCggZnMsIDAsIHNpemVvZigqZnMpKTsKKworICAgIENWX0NBTEwoIGZzLT5tZW1zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCBkZWZhdWx0X2Jsb2NrX3NpemUgKSk7CisgICAgZnMtPmRzdHN0b3JhZ2UgPSBkc3RzdG9yYWdlID8gZHN0c3RvcmFnZSA6IGZzLT5tZW1zdG9yYWdlOworCisgICAgQ1ZfQ0FMTCggZnMtPmZpbGVuYW1lID0gKGNoYXIqKWN2TWVtU3RvcmFnZUFsbG9jKCBmcy0+bWVtc3RvcmFnZSwgc3RybGVuKGZpbGVuYW1lKSsxICkpOworICAgIHN0cmNweSggZnMtPmZpbGVuYW1lLCBmaWxlbmFtZSApOworCisgICAgZnMtPmZsYWdzID0gQ1ZfRklMRV9TVE9SQUdFOworICAgIGZzLT53cml0ZV9tb2RlID0gKGZsYWdzICYgMykgIT0gMDsKKyAgICBmcy0+ZmlsZSA9IGZvcGVuKCBmcy0+ZmlsZW5hbWUsICFmcy0+d3JpdGVfbW9kZSA/ICJydCIgOiAhYXBwZW5kID8gInd0IiA6ICJhK3QiICk7CisgICAgaWYoICFmcy0+ZmlsZSApCisgICAgICAgIEVYSVQ7CisKKyAgICBmcy0+cm9vdHMgPSAwOworICAgIGZzLT5zdHJ1Y3RfaW5kZW50ID0gMDsKKyAgICBmcy0+c3RydWN0X2ZsYWdzID0gMDsKKyAgICBmcy0+d3JhcF9tYXJnaW4gPSA3MTsKKworICAgIGlmKCBmcy0+d3JpdGVfbW9kZSApCisgICAgeworICAgICAgICAvLyB3ZSB1c2UgZmFjdG9yPTYgZm9yIFhNTCAodGhlIGxvbmdlc3QgY2hhcmFjdGVycyAoJyBhbmQgIikgYXJlIGVuY29kZWQgd2l0aCA2IGJ5dGVzICgmYXBvczsgYW5kICZxdW90OykKKyAgICAgICAgLy8gYW5kIGZhY3Rvcj00IGZvciBZQU1MICggYXMgd2UgdXNlIDQgYnl0ZXMgZm9yIG5vbiBBU0NJSSBjaGFyYWN0ZXJzIChlLmcuIFx4QUIpKQorICAgICAgICBpbnQgYnVmX3NpemUgPSBDVl9GU19NQVhfTEVOKihmcy0+aXNfeG1sID8gNiA6IDQpICsgMTAyNDsKKworICAgICAgICBjaGFyKiBkb3RfcG9zID0gc3RycmNociggZnMtPmZpbGVuYW1lLCAnLicgKTsKKyAgICAgICAgZnMtPmlzX3htbCA9IGRvdF9wb3MgJiYgKHN0cmNtcCggZG90X3BvcywgIi54bWwiICkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCggZG90X3BvcywgIi5YTUwiICkgPT0gMCB8fCBzdHJjbXAoIGRvdF9wb3MsICIuWG1sIiApID09IDApOworCisgICAgICAgIGlmKCBhcHBlbmQgKQorICAgICAgICAgICAgZnNlZWsoIGZzLT5maWxlLCAwLCBTRUVLX0VORCApOworCisgICAgICAgIGZzLT53cml0ZV9zdGFjayA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBmcy0+aXNfeG1sID8KKyAgICAgICAgICAgICAgICBzaXplb2YoQ3ZYTUxTdGFja1JlY29yZCkgOiBzaXplb2YoaW50KSwgZnMtPm1lbXN0b3JhZ2UgKTsKKyAgICAgICAgZnMtPmlzX2ZpcnN0ID0gMTsKKyAgICAgICAgZnMtPnN0cnVjdF9pbmRlbnQgPSAwOworICAgICAgICBmcy0+c3RydWN0X2ZsYWdzID0gQ1ZfTk9ERV9FTVBUWTsKKyAgICAgICAgQ1ZfQ0FMTCggZnMtPmJ1ZmZlcl9zdGFydCA9IGZzLT5idWZmZXIgPSAoY2hhciopY3ZBbGxvYyggYnVmX3NpemUgKyAxMDI0ICkpOworICAgICAgICBmcy0+YnVmZmVyX2VuZCA9IGZzLT5idWZmZXJfc3RhcnQgKyBidWZfc2l6ZTsKKyAgICAgICAgaWYoIGZzLT5pc194bWwgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZmlsZV9zaXplID0gKGludClmdGVsbCggZnMtPmZpbGUgKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGZzLT5zdHJzdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2UoIGZzLT5tZW1zdG9yYWdlICkpOworICAgICAgICAgICAgaWYoICFhcHBlbmQgfHwgZmlsZV9zaXplID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwdXRzKCAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbiIsIGZzLT5maWxlICk7CisgICAgICAgICAgICAgICAgZnB1dHMoICI8b3BlbmN2X3N0b3JhZ2U+XG4iLCBmcy0+ZmlsZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB4bWxfYnVmX3NpemUgPSAxIDw8IDEwOworICAgICAgICAgICAgICAgIGNoYXIgc3Vic3RyW10gPSAiPC9vcGVuY3Zfc3RvcmFnZT4iOworICAgICAgICAgICAgICAgIGludCBsYXN0X29jY3VyZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIHhtbF9idWZfc2l6ZSA9IE1JTih4bWxfYnVmX3NpemUsIGZpbGVfc2l6ZSk7CisgICAgICAgICAgICAgICAgZnNlZWsoIGZzLT5maWxlLCAteG1sX2J1Zl9zaXplLCBTRUVLX0VORCApOworICAgICAgICAgICAgICAgIENWX0NBTEwoeG1sX2J1ZiA9IChjaGFyKiljdkFsbG9jKCB4bWxfYnVmX3NpemUrMiApKTsKKyAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiA8L29wZW5jdl9zdG9yYWdlPgorICAgICAgICAgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBsaW5lX29mZnNldCA9IGZ0ZWxsKCBmcy0+ZmlsZSApOworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwdHIwID0gZmdldHMoIHhtbF9idWYsIHhtbF9idWZfc2l6ZSwgZnMtPmZpbGUgKSwgKnB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFwdHIwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBwdHIgPSBwdHIwOworICAgICAgICAgICAgICAgICAgICBmb3IoOzspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0cnN0ciggcHRyLCBzdWJzdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcHRyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3Rfb2NjdXJlbmNlID0gbGluZV9vZmZzZXQgKyAoaW50KShwdHIgLSBwdHIwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSBzdHJsZW4oc3Vic3RyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbGFzdF9vY2N1cmVuY2UgPCAwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiQ291bGQgbm90IGZpbmQgPC9vcGVuY3Zfc3RvcmFnZT4gaW4gdGhlIGVuZCBvZiBmaWxlLlxuIiApOworICAgICAgICAgICAgICAgIGZjbG9zZSggZnMtPmZpbGUgKTsKKyAgICAgICAgICAgICAgICBmcy0+ZmlsZSA9IGZvcGVuKCBmcy0+ZmlsZW5hbWUsICJyK3QiICk7CisgICAgICAgICAgICAgICAgZnNlZWsoIGZzLT5maWxlLCBsYXN0X29jY3VyZW5jZSwgU0VFS19TRVQgKTsKKyAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBsYXN0ICI8L29wZW5jdl9zdG9yYWdlPiIgd2l0aCAiIDwhLS0gcmVzdW1lZCAtLT4iLCB3aGljaCBoYXMgdGhlIHNhbWUgbGVuZ3RoCisgICAgICAgICAgICAgICAgZnB1dHMoICIgPCEtLSByZXN1bWVkIC0tPiIsIGZzLT5maWxlICk7CisgICAgICAgICAgICAgICAgZnNlZWsoIGZzLT5maWxlLCAwLCBTRUVLX0VORCApOworICAgICAgICAgICAgICAgIGZwdXRzKCAiXG4iLCBmcy0+ZmlsZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnMtPnN0YXJ0X3dyaXRlX3N0cnVjdCA9IGljdlhNTFN0YXJ0V3JpdGVTdHJ1Y3Q7CisgICAgICAgICAgICBmcy0+ZW5kX3dyaXRlX3N0cnVjdCA9IGljdlhNTEVuZFdyaXRlU3RydWN0OworICAgICAgICAgICAgZnMtPndyaXRlX2ludCA9IGljdlhNTFdyaXRlSW50OworICAgICAgICAgICAgZnMtPndyaXRlX3JlYWwgPSBpY3ZYTUxXcml0ZVJlYWw7CisgICAgICAgICAgICBmcy0+d3JpdGVfc3RyaW5nID0gaWN2WE1MV3JpdGVTdHJpbmc7CisgICAgICAgICAgICBmcy0+d3JpdGVfY29tbWVudCA9IGljdlhNTFdyaXRlQ29tbWVudDsKKyAgICAgICAgICAgIGZzLT5zdGFydF9uZXh0X3N0cmVhbSA9IGljdlhNTFN0YXJ0TmV4dFN0cmVhbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhYXBwZW5kICkKKyAgICAgICAgICAgICAgICBmcHV0cyggIiVZQU1MOjEuMFxuIiwgZnMtPmZpbGUgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmcHV0cyggIi4uLlxuLS0tXG4iLCBmcy0+ZmlsZSApOworICAgICAgICAgICAgZnMtPnN0YXJ0X3dyaXRlX3N0cnVjdCA9IGljdllNTFN0YXJ0V3JpdGVTdHJ1Y3Q7CisgICAgICAgICAgICBmcy0+ZW5kX3dyaXRlX3N0cnVjdCA9IGljdllNTEVuZFdyaXRlU3RydWN0OworICAgICAgICAgICAgZnMtPndyaXRlX2ludCA9IGljdllNTFdyaXRlSW50OworICAgICAgICAgICAgZnMtPndyaXRlX3JlYWwgPSBpY3ZZTUxXcml0ZVJlYWw7CisgICAgICAgICAgICBmcy0+d3JpdGVfc3RyaW5nID0gaWN2WU1MV3JpdGVTdHJpbmc7CisgICAgICAgICAgICBmcy0+d3JpdGVfY29tbWVudCA9IGljdllNTFdyaXRlQ29tbWVudDsKKyAgICAgICAgICAgIGZzLT5zdGFydF9uZXh0X3N0cmVhbSA9IGljdllNTFN0YXJ0TmV4dFN0cmVhbTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgYnVmX3NpemU7CisgICAgICAgIGNvbnN0IGNoYXIqIHlhbWxfc2lnbmF0dXJlID0gIiVZQU1MOiI7CisgICAgICAgIGNoYXIgYnVmWzE2XTsKKyAgICAgICAgZmdldHMoIGJ1Ziwgc2l6ZW9mKGJ1ZiktMiwgZnMtPmZpbGUgKTsKKyAgICAgICAgZnMtPmlzX3htbCA9IHN0cm5jbXAoIGJ1ZiwgeWFtbF9zaWduYXR1cmUsIHN0cmxlbih5YW1sX3NpZ25hdHVyZSkgKSAhPSAwOworCisgICAgICAgIGZzZWVrKCBmcy0+ZmlsZSwgMCwgU0VFS19FTkQgKTsKKyAgICAgICAgYnVmX3NpemUgPSBmdGVsbCggZnMtPmZpbGUgKTsKKyAgICAgICAgZnNlZWsoIGZzLT5maWxlLCAwLCBTRUVLX1NFVCApOworCisgICAgICAgIGJ1Zl9zaXplID0gTUlOKCBidWZfc2l6ZSwgKDEgPDwgMjApICk7CisgICAgICAgIGJ1Zl9zaXplID0gTUFYKCBidWZfc2l6ZSwgQ1ZfRlNfTUFYX0xFTioyICsgMTAyNCApOworCisgICAgICAgIENWX0NBTEwoIGZzLT5zdHJfaGFzaCA9IGN2Q3JlYXRlTWFwKCAwLCBzaXplb2YoQ3ZTdHJpbmdIYXNoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdlN0cmluZ0hhc2hOb2RlKSwgZnMtPm1lbXN0b3JhZ2UsIDI1NiApKTsKKworICAgICAgICBDVl9DQUxMKCBmcy0+cm9vdHMgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkZpbGVOb2RlKSwgZnMtPm1lbXN0b3JhZ2UgKSk7CisKKyAgICAgICAgQ1ZfQ0FMTCggZnMtPmJ1ZmZlciA9IGZzLT5idWZmZXJfc3RhcnQgPSAoY2hhciopY3ZBbGxvYyggYnVmX3NpemUgKyAyNTYgKSk7CisgICAgICAgIGZzLT5idWZmZXJfZW5kID0gZnMtPmJ1ZmZlcl9zdGFydCArIGJ1Zl9zaXplOworICAgICAgICBmcy0+YnVmZmVyWzBdID0gJ1xuJzsKKyAgICAgICAgZnMtPmJ1ZmZlclsxXSA9ICdcMCc7CisKKyAgICAgICAgLy9tb2RlID0gY3ZHZXRFcnJNb2RlKCk7CisgICAgICAgIC8vY3ZTZXRFcnJNb2RlKCBDVl9FcnJNb2RlU2lsZW50ICk7CisgICAgICAgIGlmKCBmcy0+aXNfeG1sICkKKyAgICAgICAgICAgIGljdlhNTFBhcnNlKCBmcyApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpY3ZZTUxQYXJzZSggZnMgKTsKKyAgICAgICAgLy9jdlNldEVyck1vZGUoIG1vZGUgKTsKKworICAgICAgICAvLyByZWxlYXNlIHJlc291cmNlcyB0aGF0IHdlIGRvIG5vdCBuZWVkIGFueW1vcmUKKyAgICAgICAgY3ZGcmVlKCAmZnMtPmJ1ZmZlcl9zdGFydCApOworICAgICAgICBmcy0+YnVmZmVyID0gZnMtPmJ1ZmZlcl9lbmQgPSAwOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggZnMgKQorICAgIHsKKyAgICAgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwIHx8ICFmcy0+ZmlsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2UmVsZWFzZUZpbGVTdG9yYWdlKCAmZnMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCAhZnMtPndyaXRlX21vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICBmY2xvc2UoIGZzLT5maWxlICk7CisgICAgICAgICAgICBmcy0+ZmlsZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdkZyZWUoICZ4bWxfYnVmICk7CisKKyAgICByZXR1cm4gIGZzOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZTdGFydFdyaXRlU3RydWN0KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBpbnQgc3RydWN0X2ZsYWdzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0eXBlX25hbWUsIEN2QXR0ckxpc3QgLyphdHRyaWJ1dGVzKi8gKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdGFydFdyaXRlU3RydWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0hFQ0tfT1VUUFVUX0ZJTEVfU1RPUkFHRShmcyk7CisgICAgQ1ZfQ0FMTCggZnMtPnN0YXJ0X3dyaXRlX3N0cnVjdCggZnMsIGtleSwgc3RydWN0X2ZsYWdzLCB0eXBlX25hbWUgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZFbmRXcml0ZVN0cnVjdCggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZFbmRXcml0ZVN0cnVjdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NIRUNLX09VVFBVVF9GSUxFX1NUT1JBR0UoZnMpOworICAgIENWX0NBTEwoIGZzLT5lbmRfd3JpdGVfc3RydWN0KCBmcyApKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdldyaXRlSW50KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBpbnQgdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZXcml0ZUludCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NIRUNLX09VVFBVVF9GSUxFX1NUT1JBR0UoZnMpOworICAgIENWX0NBTEwoIGZzLT53cml0ZV9pbnQoIGZzLCBrZXksIHZhbHVlICkpOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2V3JpdGVSZWFsKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhcioga2V5LCBkb3VibGUgdmFsdWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZXcml0ZVJlYWwiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9DSEVDS19PVVRQVVRfRklMRV9TVE9SQUdFKGZzKTsKKyAgICBDVl9DQUxMKCBmcy0+d3JpdGVfcmVhbCggZnMsIGtleSwgdmFsdWUgKSk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZXcml0ZVN0cmluZyggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogdmFsdWUsIGludCBxdW90ZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJjdldyaXRlU3RyaW5nIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0hFQ0tfT1VUUFVUX0ZJTEVfU1RPUkFHRShmcyk7CisgICAgQ1ZfQ0FMTCggZnMtPndyaXRlX3N0cmluZyggZnMsIGtleSwgdmFsdWUsIHF1b3RlICkpOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2V3JpdGVDb21tZW50KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogY29tbWVudCwgaW50IGVvbF9jb21tZW50ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2V3JpdGVDb21tZW50IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ1ZfQ0hFQ0tfT1VUUFVUX0ZJTEVfU1RPUkFHRShmcyk7CisgICAgQ1ZfQ0FMTCggZnMtPndyaXRlX2NvbW1lbnQoIGZzLCBjb21tZW50LCBlb2xfY29tbWVudCApKTsKKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlN0YXJ0TmV4dFN0cmVhbSggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZTdGFydE5leHRTdHJlYW0iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9DSEVDS19PVVRQVVRfRklMRV9TVE9SQUdFKGZzKTsKKyAgICBDVl9DQUxMKCBmcy0+c3RhcnRfbmV4dF9zdHJlYW0oIGZzICkpOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgY29uc3QgY2hhciBpY3ZUeXBlU3ltYm9sW10gPSAidWN3c2lmZHIiOworI2RlZmluZSBDVl9GU19NQVhfRk1UX1BBSVJTICAxMjgKKworc3RhdGljIGNoYXIqCitpY3ZFbmNvZGVGb3JtYXQoIGludCBlbGVtX3R5cGUsIGNoYXIqIGR0ICkKK3sKKyAgICBzcHJpbnRmKCBkdCwgIiVkJWMiLCBDVl9NQVRfQ04oZWxlbV90eXBlKSwgaWN2VHlwZVN5bWJvbFtDVl9NQVRfREVQVEgoZWxlbV90eXBlKV0gKTsKKyAgICByZXR1cm4gZHQgKyAoIGR0WzJdID09ICdcMCcgJiYgZHRbMF0gPT0gJzEnICk7Cit9CisKK3N0YXRpYyBpbnQKK2ljdkRlY29kZUZvcm1hdCggY29uc3QgY2hhciogZHQsIGludCogZm10X3BhaXJzLCBpbnQgbWF4X2xlbiApCit7CisgICAgaW50IGZtdF9wYWlyX2NvdW50ID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImljdkRlY29kZUZvcm1hdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpID0gMCwgayA9IDAsIGxlbiA9IGR0ID8gKGludClzdHJsZW4oZHQpIDogMDsKKworICAgIGlmKCAhZHQgfHwgIWxlbiApCisgICAgICAgIEVYSVQ7CisKKyAgICBhc3NlcnQoIGZtdF9wYWlycyAhPSAwICYmIG1heF9sZW4gPiAwICk7CisgICAgZm10X3BhaXJzWzBdID0gMDsKKyAgICBtYXhfbGVuICo9IDI7CisKKyAgICBmb3IoIDsgayA8IGxlbjsgaysrICkKKyAgICB7CisgICAgICAgIGNoYXIgYyA9IGR0W2tdOworCisgICAgICAgIGlmKCBpc2RpZ2l0KGMpICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNvdW50ID0gYyAtICcwJzsKKyAgICAgICAgICAgIGlmKCBpc2RpZ2l0KGR0W2srMV0pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBlbmRwdHIgPSAwOworICAgICAgICAgICAgICAgIGNvdW50ID0gKGludClzdHJ0b2woIGR0K2ssICZlbmRwdHIsIDEwICk7CisgICAgICAgICAgICAgICAgayA9IChpbnQpKGVuZHB0ciAtIGR0KSAtIDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBjb3VudCA8PSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBkYXRhIHR5cGUgc3BlY2lmaWNhdGlvbiIgKTsKKworICAgICAgICAgICAgZm10X3BhaXJzW2ldID0gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBwb3MgPSBzdHJjaHIoIGljdlR5cGVTeW1ib2wsIGMgKTsKKyAgICAgICAgICAgIGlmKCAhcG9zICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBkYXRhIHR5cGUgc3BlY2lmaWNhdGlvbiIgKTsKKyAgICAgICAgICAgIGlmKCBmbXRfcGFpcnNbaV0gPT0gMCApCisgICAgICAgICAgICAgICAgZm10X3BhaXJzW2ldID0gMTsKKyAgICAgICAgICAgIGZtdF9wYWlyc1tpKzFdID0gKGludCkocG9zIC0gaWN2VHlwZVN5bWJvbCk7CisgICAgICAgICAgICBpZiggaSA+IDAgJiYgZm10X3BhaXJzW2krMV0gPT0gZm10X3BhaXJzW2ktMV0gKQorICAgICAgICAgICAgICAgIGZtdF9wYWlyc1tpLTJdICs9IGZtdF9wYWlyc1tpXTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpICs9IDI7CisgICAgICAgICAgICAgICAgaWYoIGkgPj0gbWF4X2xlbiApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUb28gbG9uZyBkYXRhIHR5cGUgc3BlY2lmaWNhdGlvbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZtdF9wYWlyc1tpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbXRfcGFpcl9jb3VudCA9IGkvMjsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gZm10X3BhaXJfY291bnQ7Cit9CisKKworc3RhdGljIGludAoraWN2Q2FsY0VsZW1TaXplKCBjb25zdCBjaGFyKiBkdCwgaW50IGluaXRpYWxfc2l6ZSApCit7CisgICAgaW50IHNpemUgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiaWN2Q2FsY0VsZW1TaXplIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGZtdF9wYWlyc1tDVl9GU19NQVhfRk1UX1BBSVJTXSwgaSwgZm10X3BhaXJfY291bnQ7CisgICAgaW50IGNvbXBfc2l6ZTsKKworICAgIENWX0NBTEwoIGZtdF9wYWlyX2NvdW50ID0gaWN2RGVjb2RlRm9ybWF0KCBkdCwgZm10X3BhaXJzLCBDVl9GU19NQVhfRk1UX1BBSVJTICkpOworICAgIGZtdF9wYWlyX2NvdW50ICo9IDI7CisgICAgZm9yKCBpID0gMCwgc2l6ZSA9IGluaXRpYWxfc2l6ZTsgaSA8IGZtdF9wYWlyX2NvdW50OyBpICs9IDIgKQorICAgIHsKKyAgICAgICAgY29tcF9zaXplID0gQ1ZfRUxFTV9TSVpFKGZtdF9wYWlyc1tpKzFdKTsKKyAgICAgICAgc2l6ZSA9IGN2QWxpZ24oIHNpemUsIGNvbXBfc2l6ZSApOworICAgICAgICBzaXplICs9IGNvbXBfc2l6ZSAqIGZtdF9wYWlyc1tpXTsKKyAgICB9CisgICAgaWYoIGluaXRpYWxfc2l6ZSA9PSAwICkKKyAgICB7CisgICAgICAgIGNvbXBfc2l6ZSA9IENWX0VMRU1fU0laRShmbXRfcGFpcnNbMV0pOworICAgICAgICBzaXplID0gY3ZBbGlnbiggc2l6ZSwgY29tcF9zaXplICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBzaXplOworfQorCisKK3N0YXRpYyBpbnQKK2ljdkRlY29kZVNpbXBsZUZvcm1hdCggY29uc3QgY2hhciogZHQgKQoreworICAgIGludCBlbGVtX3R5cGUgPSAtMTsKKworICAgIENWX0ZVTkNOQU1FKCAiaWN2RGVjb2RlU2ltcGxlRm9ybWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGZtdF9wYWlyc1tDVl9GU19NQVhfRk1UX1BBSVJTXSwgZm10X3BhaXJfY291bnQ7CisKKyAgICBDVl9DQUxMKCBmbXRfcGFpcl9jb3VudCA9IGljdkRlY29kZUZvcm1hdCggZHQsIGZtdF9wYWlycywgQ1ZfRlNfTUFYX0ZNVF9QQUlSUyApKTsKKyAgICBpZiggZm10X3BhaXJfY291bnQgIT0gMSB8fCBmbXRfcGFpcnNbMF0gPiA0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVG9vIGNvbXBsZXggZm9ybWF0IGZvciB0aGUgbWF0cml4IiApOworCisgICAgZWxlbV90eXBlID0gQ1ZfTUFLRVRZUEUoIGZtdF9wYWlyc1sxXSwgZm10X3BhaXJzWzBdICk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIGVsZW1fdHlwZTsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2V3JpdGVSYXdEYXRhKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3Qgdm9pZCogX2RhdGEsIGludCBsZW4sIGNvbnN0IGNoYXIqIGR0ICkKK3sKKyAgICBjb25zdCBjaGFyKiBkYXRhMCA9IChjb25zdCBjaGFyKilfZGF0YTsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZXcml0ZVJhd0RhdGEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgb2Zmc2V0ID0gMDsKKyAgICBpbnQgZm10X3BhaXJzW0NWX0ZTX01BWF9GTVRfUEFJUlMqMl0sIGssIGZtdF9wYWlyX2NvdW50OworICAgIGNoYXIgYnVmWzI1Nl0gPSAiIjsKKworICAgIENWX0NIRUNLX09VVFBVVF9GSUxFX1NUT1JBR0UoIGZzICk7CisKKyAgICBpZiggIWRhdGEwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGRhdGEgcG9pbnRlciIgKTsKKworICAgIGlmKCBsZW4gPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOZWdhdGl2ZSBudW1iZXIgb2YgZWxlbWVudHMiICk7CisKKyAgICBDVl9DQUxMKCBmbXRfcGFpcl9jb3VudCA9IGljdkRlY29kZUZvcm1hdCggZHQsIGZtdF9wYWlycywgQ1ZfRlNfTUFYX0ZNVF9QQUlSUyApKTsKKworICAgIGlmKCAhbGVuICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCBmbXRfcGFpcl9jb3VudCA9PSAxICkKKyAgICB7CisgICAgICAgIGZtdF9wYWlyc1swXSAqPSBsZW47CisgICAgICAgIGxlbiA9IDE7CisgICAgfQorCisgICAgZm9yKDtsZW4tLTspCisgICAgeworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZm10X3BhaXJfY291bnQ7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBjb3VudCA9IGZtdF9wYWlyc1trKjJdOworICAgICAgICAgICAgaW50IGVsZW1fdHlwZSA9IGZtdF9wYWlyc1trKjIrMV07CisgICAgICAgICAgICBpbnQgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKGVsZW1fdHlwZSk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLCAqcHRyOworCisgICAgICAgICAgICBvZmZzZXQgPSBjdkFsaWduKCBvZmZzZXQsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgZGF0YSA9IGRhdGEwICsgb2Zmc2V0OworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3dpdGNoKCBlbGVtX3R5cGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIENWXzhVOgorICAgICAgICAgICAgICAgICAgICBwdHIgPSBpY3ZfaXRvYSggKih1Y2hhciopZGF0YSwgYnVmLCAxMCApOworICAgICAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1ZfOFM6CisgICAgICAgICAgICAgICAgICAgIHB0ciA9IGljdl9pdG9hKCAqKGNoYXIqKWRhdGEsIGJ1ZiwgMTAgKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENWXzE2VToKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gaWN2X2l0b2EoICoodXNob3J0KilkYXRhLCBidWYsIDEwICk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICAgICAgICAgICAgICBwdHIgPSBpY3ZfaXRvYSggKihzaG9ydCopZGF0YSwgYnVmLCAxMCApOworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1ZfMzJTOgorICAgICAgICAgICAgICAgICAgICBwdHIgPSBpY3ZfaXRvYSggKihpbnQqKWRhdGEsIGJ1ZiwgMTAgKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBzaXplb2YoaW50KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDVl8zMkY6CisgICAgICAgICAgICAgICAgICAgIHB0ciA9IGljdkZsb2F0VG9TdHJpbmcoIGJ1ZiwgKihmbG9hdCopZGF0YSApOworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ1ZfNjRGOgorICAgICAgICAgICAgICAgICAgICBwdHIgPSBpY3ZEb3VibGVUb1N0cmluZyggYnVmLCAqKGRvdWJsZSopZGF0YSApOworICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENWX1VTUlRZUEUxOiAvKiByZWZlcmVuY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgcHRyID0gaWN2X2l0b2EoIChpbnQpKihzaXplX3QqKWRhdGEsIGJ1ZiwgMTAgKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBzaXplb2Yoc2l6ZV90KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBmcy0+aXNfeG1sICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBidWZfbGVuID0gKGludClzdHJsZW4ocHRyKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2WE1MV3JpdGVTY2FsYXIoIGZzLCAwLCBwdHIsIGJ1Zl9sZW4gKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2WU1MV3JpdGUoIGZzLCAwLCBwdHIsIGN2RnVuY05hbWUgKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCA9IChpbnQpKGRhdGEgLSBkYXRhMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZTdGFydFJlYWRSYXdEYXRhKCBjb25zdCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgQ3ZGaWxlTm9kZSogc3JjLCBDdlNlcVJlYWRlciogcmVhZGVyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2U3RhcnRSZWFkUmF3RGF0YSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBub2RlX3R5cGU7CisgICAgQ1ZfQ0hFQ0tfRklMRV9TVE9SQUdFKCBmcyApOworCisgICAgaWYoICFzcmMgfHwgIXJlYWRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBwb2ludGVyIHRvIHNvdXJjZSBmaWxlIG5vZGUgb3IgcmVhZGVyIiApOworCisgICAgbm9kZV90eXBlID0gQ1ZfTk9ERV9UWVBFKHNyYy0+dGFnKTsKKyAgICBpZiggbm9kZV90eXBlID09IENWX05PREVfSU5UIHx8IG5vZGVfdHlwZSA9PSBDVl9OT0RFX1JFQUwgKQorICAgIHsKKyAgICAgICAgLy8gZW11bGF0ZSByZWFkaW5nIGZyb20gMS1lbGVtZW50IHNlcXVlbmNlCisgICAgICAgIHJlYWRlci0+cHRyID0gKHNjaGFyKilzcmM7CisgICAgICAgIHJlYWRlci0+YmxvY2tfbWF4ID0gcmVhZGVyLT5wdHIgKyBzaXplb2YoKnNyYykqMjsKKyAgICAgICAgcmVhZGVyLT5ibG9ja19taW4gPSByZWFkZXItPnB0cjsKKyAgICAgICAgcmVhZGVyLT5zZXEgPSAwOworICAgIH0KKyAgICBlbHNlIGlmKCBub2RlX3R5cGUgPT0gQ1ZfTk9ERV9TRVEgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNyYy0+ZGF0YS5zZXEsIHJlYWRlciwgMCApKTsKKyAgICB9CisgICAgZWxzZSBpZiggbm9kZV90eXBlID09IENWX05PREVfTk9ORSApCisgICAgeworICAgICAgICBtZW1zZXQoIHJlYWRlciwgMCwgc2l6ZW9mKCpyZWFkZXIpICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBmaWxlIG5vZGUgc2hvdWxkIGJlIGEgbnVtZXJpY2FsIHNjYWxhciBvciBhIHNlcXVlbmNlIiApOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2UmVhZFJhd0RhdGFTbGljZSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsIEN2U2VxUmVhZGVyKiByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgIGludCBsZW4sIHZvaWQqIF9kYXRhLCBjb25zdCBjaGFyKiBkdCApCit7CisgICAgY2hhciogZGF0YTAgPSAoY2hhciopX2RhdGE7CisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlYWRSYXdEYXRhU2xpY2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgZm10X3BhaXJzW0NWX0ZTX01BWF9GTVRfUEFJUlMqMl0sIGsgPSAwLCBmbXRfcGFpcl9jb3VudDsKKyAgICBpbnQgaSA9IDAsIG9mZnNldCA9IDAsIGNvdW50ID0gMDsKKworICAgIENWX0NIRUNLX0ZJTEVfU1RPUkFHRSggZnMgKTsKKworICAgIGlmKCAhcmVhZGVyIHx8ICFkYXRhMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBwb2ludGVyIHRvIHJlYWRlciBvciBkZXN0aW5hdGlvbiBhcnJheSIgKTsKKworICAgIGlmKCAhcmVhZGVyLT5zZXEgJiYgbGVuICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSByZWFkZWQgc2VxdWVuY2UgaXMgYSBzY2FsYXIsIHRodXMgbGVuIG11c3QgYmUgMSIgKTsKKworICAgIENWX0NBTEwoIGZtdF9wYWlyX2NvdW50ID0gaWN2RGVjb2RlRm9ybWF0KCBkdCwgZm10X3BhaXJzLCBDVl9GU19NQVhfRk1UX1BBSVJTICkpOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IGZtdF9wYWlyX2NvdW50OyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZWxlbV90eXBlID0gZm10X3BhaXJzW2sqMisxXTsKKyAgICAgICAgICAgIGludCBlbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUoZWxlbV90eXBlKTsKKyAgICAgICAgICAgIGNoYXIqIGRhdGE7CisKKyAgICAgICAgICAgIGNvdW50ID0gZm10X3BhaXJzW2sqMl07CisgICAgICAgICAgICBvZmZzZXQgPSBjdkFsaWduKCBvZmZzZXQsIGVsZW1fc2l6ZSApOworICAgICAgICAgICAgZGF0YSA9IGRhdGEwICsgb2Zmc2V0OworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZGaWxlTm9kZSogbm9kZSA9IChDdkZpbGVOb2RlKilyZWFkZXItPnB0cjsKKyAgICAgICAgICAgICAgICBpZiggQ1ZfTk9ERV9JU19JTlQobm9kZS0+dGFnKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaXZhbCA9IG5vZGUtPmRhdGEuaTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIGVsZW1fdHlwZSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl84VToKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIqKWRhdGEgPSBDVl9DQVNUXzhVKGl2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfOFM6CisgICAgICAgICAgICAgICAgICAgICAgICAqKGNoYXIqKWRhdGEgPSBDVl9DQVNUXzhTKGl2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfMTZVOgorICAgICAgICAgICAgICAgICAgICAgICAgKih1c2hvcnQqKWRhdGEgPSBDVl9DQVNUXzE2VShpdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gc2l6ZW9mKHVzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl8xNlM6CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNob3J0KilkYXRhID0gQ1ZfQ0FTVF8xNlMoaXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl8zMlM6CisgICAgICAgICAgICAgICAgICAgICAgICAqKGludCopZGF0YSA9IGl2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihpbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfMzJGOgorICAgICAgICAgICAgICAgICAgICAgICAgKihmbG9hdCopZGF0YSA9IChmbG9hdClpdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBzaXplb2YoZmxvYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfNjRGOgorICAgICAgICAgICAgICAgICAgICAgICAgKihkb3VibGUqKWRhdGEgPSAoZG91YmxlKWl2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfVVNSVFlQRTE6IC8qIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKihzaXplX3QqKWRhdGEgPSBpdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBzaXplb2Yoc2l6ZV90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBDVl9OT0RFX0lTX1JFQUwobm9kZS0+dGFnKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZnZhbCA9IG5vZGUtPmRhdGEuZjsKKyAgICAgICAgICAgICAgICAgICAgaW50IGl2YWw7CisKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoKCBlbGVtX3R5cGUgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfOFU6CisgICAgICAgICAgICAgICAgICAgICAgICBpdmFsID0gY3ZSb3VuZChmdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodWNoYXIqKWRhdGEgPSBDVl9DQVNUXzhVKGl2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSsrOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfOFM6CisgICAgICAgICAgICAgICAgICAgICAgICBpdmFsID0gY3ZSb3VuZChmdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooY2hhciopZGF0YSA9IENWX0NBU1RfOFMoaXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl8xNlU6CisgICAgICAgICAgICAgICAgICAgICAgICBpdmFsID0gY3ZSb3VuZChmdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICoodXNob3J0KilkYXRhID0gQ1ZfQ0FTVF8xNlUoaXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZih1c2hvcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfMTZTOgorICAgICAgICAgICAgICAgICAgICAgICAgaXZhbCA9IGN2Um91bmQoZnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNob3J0KilkYXRhID0gQ1ZfQ0FTVF8xNlMoaXZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihzaG9ydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl8zMlM6CisgICAgICAgICAgICAgICAgICAgICAgICBpdmFsID0gY3ZSb3VuZChmdmFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICooaW50KilkYXRhID0gaXZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgKz0gc2l6ZW9mKGludCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl8zMkY6CisgICAgICAgICAgICAgICAgICAgICAgICAqKGZsb2F0KilkYXRhID0gKGZsb2F0KWZ2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDVl82NEY6CisgICAgICAgICAgICAgICAgICAgICAgICAqKGRvdWJsZSopZGF0YSA9IGZ2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ1ZfVVNSVFlQRTE6IC8qIHJlZmVyZW5jZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgaXZhbCA9IGN2Um91bmQoZnZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqKHNpemVfdCopZGF0YSA9IGl2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHNpemVvZihzaXplX3QpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLAorICAgICAgICAgICAgICAgICAgICAiVGhlIHNlcXVlbmNlIGVsZW1lbnQgaXMgbm90IGEgbnVtZXJpY2FsIHNjYWxhciIgKTsKKworICAgICAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNpemVvZihDdkZpbGVOb2RlKSwgKnJlYWRlciApOworICAgICAgICAgICAgICAgIGlmKCAhLS1sZW4gKQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZF9sb29wOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQgPSAoaW50KShkYXRhIC0gZGF0YTApOworICAgICAgICB9CisgICAgfQorCitlbmRfbG9vcDoKKyAgICBpZiggaSAhPSBjb3VudCAtIDEgfHwgayAhPSBmbXRfcGFpcl9jb3VudCAtIDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwKKyAgICAgICAgIlRoZSBzZXF1ZW5jZSBzbGljZSBkb2VzIG5vdCBmaXQgYW4gaW50ZWdlciBudW1iZXIgb2YgcmVjb3JkcyIgKTsKKworICAgIGlmKCAhcmVhZGVyLT5zZXEgKQorICAgICAgICByZWFkZXItPnB0ciAtPSBzaXplb2YoQ3ZGaWxlTm9kZSk7CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZSZWFkUmF3RGF0YSggY29uc3QgQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IEN2RmlsZU5vZGUqIHNyYywKKyAgICAgICAgICAgICAgIHZvaWQqIGRhdGEsIGNvbnN0IGNoYXIqIGR0ICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2UmVhZFJhd0RhdGEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisKKyAgICBpZiggIXNyYyB8fCAhZGF0YSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBwb2ludGVycyB0byBzb3VyY2UgZmlsZSBub2RlIG9yIGRlc3RpbmF0aW9uIGFycmF5IiApOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRSYXdEYXRhKCBmcywgc3JjLCAmcmVhZGVyICkpOworICAgIGN2UmVhZFJhd0RhdGFTbGljZSggZnMsICZyZWFkZXIsIENWX05PREVfSVNfU0VRKHNyYy0+dGFnKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzcmMtPmRhdGEuc2VxLT50b3RhbCA6IDEsIGRhdGEsIGR0ICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZXcml0ZUZpbGVOb2RlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwgY29uc3QgQ3ZGaWxlTm9kZSogbm9kZSApOworCitzdGF0aWMgdm9pZAoraWN2V3JpdGVDb2xsZWN0aW9uKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgQ3ZGaWxlTm9kZSogbm9kZSApCit7CisgICAgaW50IGksIHRvdGFsID0gbm9kZS0+ZGF0YS5zZXEtPnRvdGFsOworICAgIGludCBlbGVtX3NpemUgPSBub2RlLT5kYXRhLnNlcS0+ZWxlbV9zaXplOworICAgIGludCBpc19tYXAgPSBDVl9OT0RFX0lTX01BUChub2RlLT50YWcpOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBub2RlLT5kYXRhLnNlcSwgJnJlYWRlciwgMCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZGaWxlTWFwTm9kZSogZWxlbSA9IChDdkZpbGVNYXBOb2RlKilyZWFkZXIucHRyOworICAgICAgICBpZiggIWlzX21hcCB8fCBDVl9JU19TRVRfRUxFTShlbGVtKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBpc19tYXAgPyBlbGVtLT5rZXktPnN0ci5wdHIgOiAwOworICAgICAgICAgICAgaWN2V3JpdGVGaWxlTm9kZSggZnMsIG5hbWUsICZlbGVtLT52YWx1ZSApOworICAgICAgICB9CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIGVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraWN2V3JpdGVGaWxlTm9kZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVGaWxlTm9kZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHN3aXRjaCggQ1ZfTk9ERV9UWVBFKG5vZGUtPnRhZykgKQorICAgIHsKKyAgICBjYXNlIENWX05PREVfSU5UOgorICAgICAgICBmcy0+d3JpdGVfaW50KCBmcywgbmFtZSwgbm9kZS0+ZGF0YS5pICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfTk9ERV9SRUFMOgorICAgICAgICBmcy0+d3JpdGVfcmVhbCggZnMsIG5hbWUsIG5vZGUtPmRhdGEuZiApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENWX05PREVfU1RSOgorICAgICAgICBmcy0+d3JpdGVfc3RyaW5nKCBmcywgbmFtZSwgbm9kZS0+ZGF0YS5zdHIucHRyLCAwICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfTk9ERV9TRVE6CisgICAgY2FzZSBDVl9OT0RFX01BUDoKKyAgICAgICAgZnMtPnN0YXJ0X3dyaXRlX3N0cnVjdCggZnMsIG5hbWUsIENWX05PREVfVFlQRShub2RlLT50YWcpICsKKyAgICAgICAgICAgICAgICAoQ1ZfTk9ERV9TRVFfSVNfU0lNUExFKG5vZGUtPmRhdGEuc2VxKSA/IENWX05PREVfRkxPVyA6IDApLAorICAgICAgICAgICAgICAgIG5vZGUtPmluZm8gPyBub2RlLT5pbmZvLT50eXBlX25hbWUgOiAwICk7CisgICAgICAgIGljdldyaXRlQ29sbGVjdGlvbiggZnMsIG5vZGUgKTsKKyAgICAgICAgZnMtPmVuZF93cml0ZV9zdHJ1Y3QoIGZzICk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfTk9ERV9OT05FOgorICAgICAgICBmcy0+c3RhcnRfd3JpdGVfc3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9TRVEsIDAgKTsKKyAgICAgICAgZnMtPmVuZF93cml0ZV9zdHJ1Y3QoIGZzICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRGbGFnLCAiVW5rbm93biB0eXBlIG9mIGZpbGUgbm9kZSIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZXcml0ZUZpbGVOb2RlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmV3X25vZGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ3ZGaWxlTm9kZSogbm9kZSwgaW50IGVtYmVkICkKK3sKKyAgICBDdkZpbGVTdG9yYWdlKiBkc3QgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdldyaXRlRmlsZU5vZGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9DSEVDS19PVVRQVVRfRklMRV9TVE9SQUdFKGZzKTsKKworICAgIGlmKCAhbm9kZSApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggQ1ZfTk9ERV9JU19DT0xMRUNUSU9OKG5vZGUtPnRhZykgJiYgZW1iZWQgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaWN2V3JpdGVDb2xsZWN0aW9uKCBmcywgbm9kZSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaWN2V3JpdGVGaWxlTm9kZSggZnMsIG5ld19ub2RlX25hbWUsIG5vZGUgKSk7CisgICAgfQorICAgIC8qCisgICAgaW50IGksIHN0cmVhbV9jb3VudDsKKyAgICBzdHJlYW1fY291bnQgPSBmcy0+cm9vdHMtPnRvdGFsOworICAgIGZvciggaSA9IDA7IGkgPCBzdHJlYW1fY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBub2RlID0gKEN2RmlsZU5vZGUqKWN2R2V0U2VxRWxlbSggZnMtPnJvb3RzLCBpLCAwICk7CisgICAgICAgIGljdkR1bXBDb2xsZWN0aW9uKCBkc3QsIG5vZGUgKTsKKyAgICAgICAgaWYoIGkgPCBzdHJlYW1fY291bnQgLSAxICkKKyAgICAgICAgICAgIGRzdC0+c3RhcnRfbmV4dF9zdHJlYW0oIGRzdCApOworICAgIH0qLworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZUZpbGVTdG9yYWdlKCAmZHN0ICk7Cit9CisKKworQ1ZfSU1QTCBjb25zdCBjaGFyKgorY3ZHZXRGaWxlTm9kZU5hbWUoIGNvbnN0IEN2RmlsZU5vZGUqIGZpbGVfbm9kZSApCit7CisgICAgcmV0dXJuIGZpbGVfbm9kZSAmJiBDVl9OT0RFX0hBU19OQU1FKGZpbGVfbm9kZS0+dGFnKSA/CisgICAgICAgICgoQ3ZGaWxlTWFwTm9kZSopZmlsZV9ub2RlKS0+a2V5LT5zdHIucHRyIDogMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkaW5nL1dyaXRpbmcgZXRjLiBmb3Igc3RhbmRhcmQgdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiNkZWZpbmUgQ1ZfVFlQRV9OQU1FX01BVCAib3BlbmN2LW1hdHJpeCIKKyNkZWZpbmUgQ1ZfVFlQRV9OQU1FX01BVE5EICJvcGVuY3YtbmQtbWF0cml4IgorI2RlZmluZSBDVl9UWVBFX05BTUVfU1BBUlNFX01BVCAib3BlbmN2LXNwYXJzZS1tYXRyaXgiCisjZGVmaW5lIENWX1RZUEVfTkFNRV9JTUFHRSAib3BlbmN2LWltYWdlIgorI2RlZmluZSBDVl9UWVBFX05BTUVfU0VRICJvcGVuY3Ytc2VxdWVuY2UiCisjZGVmaW5lIENWX1RZUEVfTkFNRV9TRVFfVFJFRSAib3BlbmN2LXNlcXVlbmNlLXRyZWUiCisjZGVmaW5lIENWX1RZUEVfTkFNRV9HUkFQSCAib3BlbmN2LWdyYXBoIiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN2TWF0ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraWN2SXNNYXQoIGNvbnN0IHZvaWQqIHB0ciApCit7CisgICAgcmV0dXJuIENWX0lTX01BVF9IRFIocHRyKTsKK30KKworc3RhdGljIHZvaWQKK2ljdldyaXRlTWF0KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICBjb25zdCB2b2lkKiBzdHJ1Y3RfcHRyLCBDdkF0dHJMaXN0IC8qYXR0ciovICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdldyaXRlTWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY29uc3QgQ3ZNYXQqIG1hdCA9IChjb25zdCBDdk1hdCopc3RydWN0X3B0cjsKKyAgICBjaGFyIGR0WzE2XTsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgeTsKKworICAgIGFzc2VydCggQ1ZfSVNfTUFUKG1hdCkgKTsKKworICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIG5hbWUsIENWX05PREVfTUFQLCBDVl9UWVBFX05BTUVfTUFUICkpOworICAgIGN2V3JpdGVJbnQoIGZzLCAicm93cyIsIG1hdC0+cm93cyApOworICAgIGN2V3JpdGVJbnQoIGZzLCAiY29scyIsIG1hdC0+Y29scyApOworICAgIGN2V3JpdGVTdHJpbmcoIGZzLCAiZHQiLCBpY3ZFbmNvZGVGb3JtYXQoIENWX01BVF9UWVBFKG1hdC0+dHlwZSksIGR0ICksIDAgKTsKKyAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAiZGF0YSIsIENWX05PREVfU0VRICsgQ1ZfTk9ERV9GTE9XICk7CisKKyAgICBzaXplID0gY3ZHZXRTaXplKG1hdCk7CisgICAgaWYoIENWX0lTX01BVF9DT05UKG1hdC0+dHlwZSkgKQorICAgIHsKKyAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgIH0KKworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCBtYXQtPmRhdGEucHRyICsgeSptYXQtPnN0ZXAsIHNpemUud2lkdGgsIGR0ICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgaW50CitpY3ZGaWxlTm9kZVNlcUxlbiggQ3ZGaWxlTm9kZSogbm9kZSApCit7CisgICAgcmV0dXJuIENWX05PREVfSVNfQ09MTEVDVElPTihub2RlLT50YWcpID8gbm9kZS0+ZGF0YS5zZXEtPnRvdGFsIDoKKyAgICAgICAgICAgQ1ZfTk9ERV9UWVBFKG5vZGUtPnRhZykgIT0gQ1ZfTk9ERV9OT05FOworfQorCisKK3N0YXRpYyB2b2lkKgoraWN2UmVhZE1hdCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIHZvaWQqIHB0ciA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWFkTWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQqIG1hdDsKKyAgICBjb25zdCBjaGFyKiBkdDsKKyAgICBDdkZpbGVOb2RlKiBkYXRhOworICAgIGludCByb3dzLCBjb2xzLCBlbGVtX3R5cGU7CisKKyAgICBDVl9DQUxMKCByb3dzID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgInJvd3MiLCAwICkpOworICAgIGNvbHMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiY29scyIsIDAgKTsKKyAgICBkdCA9IGN2UmVhZFN0cmluZ0J5TmFtZSggZnMsIG5vZGUsICJkdCIsIDAgKTsKKworICAgIGlmKCByb3dzID09IDAgfHwgY29scyA9PSAwIHx8IGR0ID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJTb21lIG9mIGVzc2VudGlhbCBtYXRyaXggYXR0cmlidXRlcyBhcmUgYWJzZW50IiApOworCisgICAgQ1ZfQ0FMTCggZWxlbV90eXBlID0gaWN2RGVjb2RlU2ltcGxlRm9ybWF0KCBkdCApKTsKKworICAgIGRhdGEgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgImRhdGEiICk7CisgICAgaWYoICFkYXRhICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVGhlIG1hdHJpeCBkYXRhIGlzIG5vdCBmb3VuZCBpbiBmaWxlIHN0b3JhZ2UiICk7CisKKyAgICBpZiggaWN2RmlsZU5vZGVTZXFMZW4oIGRhdGEgKSAhPSByb3dzKmNvbHMqQ1ZfTUFUX0NOKGVsZW1fdHlwZSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICJUaGUgbWF0cml4IHNpemUgZG9lcyBub3QgbWF0Y2ggdG8gdGhlIG51bWJlciBvZiBzdG9yZWQgZWxlbWVudHMiICk7CisKKyAgICBDVl9DQUxMKCBtYXQgPSBjdkNyZWF0ZU1hdCggcm93cywgY29scywgZWxlbV90eXBlICkpOworICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGEoIGZzLCBkYXRhLCBtYXQtPmRhdGEucHRyLCBkdCApKTsKKworICAgIHB0ciA9IG1hdDsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN2TWF0TkQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitpY3ZJc01hdE5EKCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBDVl9JU19NQVRORChwdHIpOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZXcml0ZU1hdE5EKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIsIEN2QXR0ckxpc3QgLyphdHRyKi8gKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVNYXRORCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHZvaWQqIG1hdCA9ICh2b2lkKilzdHJ1Y3RfcHRyOworICAgIEN2TWF0TkQgc3R1YjsKKyAgICBDdk5BcnJheUl0ZXJhdG9yIGl0ZXJhdG9yOworICAgIGludCBkaW1zLCBzaXplc1tDVl9NQVhfRElNXTsKKyAgICBjaGFyIGR0WzE2XTsKKworICAgIGFzc2VydCggQ1ZfSVNfTUFUTkQobWF0KSApOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9NQVRORCApKTsKKyAgICBkaW1zID0gY3ZHZXREaW1zKCBtYXQsIHNpemVzICk7CisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInNpemVzIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICBjdldyaXRlUmF3RGF0YSggZnMsIHNpemVzLCBkaW1zLCAiaSIgKTsKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgIGN2V3JpdGVTdHJpbmcoIGZzLCAiZHQiLCBpY3ZFbmNvZGVGb3JtYXQoIGN2R2V0RWxlbVR5cGUobWF0KSwgZHQgKSwgMCApOworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJkYXRhIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKworICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAxLCAmbWF0LCAwLCAmc3R1YiwgJml0ZXJhdG9yICkpOworCisgICAgZG8KKyAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCBpdGVyYXRvci5wdHJbMF0sIGl0ZXJhdG9yLnNpemUud2lkdGgsIGR0ICk7CisgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCAmaXRlcmF0b3IgKSk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZCoKK2ljdlJlYWRNYXRORCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIHZvaWQqIHB0ciA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWFkTWF0TkQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdE5EKiBtYXQ7CisgICAgY29uc3QgY2hhciogZHQ7CisgICAgQ3ZGaWxlTm9kZSogZGF0YTsKKyAgICBDdkZpbGVOb2RlKiBzaXplc19ub2RlOworICAgIGludCBzaXplc1tDVl9NQVhfRElNXSwgZGltcywgZWxlbV90eXBlOworICAgIGludCBpLCB0b3RhbF9zaXplOworCisgICAgQ1ZfQ0FMTCggc2l6ZXNfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAic2l6ZXMiICkpOworICAgIGR0ID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgbm9kZSwgImR0IiwgMCApOworCisgICAgaWYoICFzaXplc19ub2RlIHx8ICFkdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlNvbWUgb2YgZXNzZW50aWFsIG1hdHJpeCBhdHRyaWJ1dGVzIGFyZSBhYnNlbnQiICk7CisKKyAgICBkaW1zID0gQ1ZfTk9ERV9JU19TRVEoc2l6ZXNfbm9kZS0+dGFnKSA/IHNpemVzX25vZGUtPmRhdGEuc2VxLT50b3RhbCA6CisgICAgICAgICAgIENWX05PREVfSVNfSU5UKHNpemVzX25vZGUtPnRhZykgPyAxIDogLTE7CisKKyAgICBpZiggZGltcyA8PSAwIHx8IGRpbXMgPiBDVl9NQVhfRElNICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBtYXRyaXggZGltZW5zaW9uYWxpdHkiICk7CisKKyAgICBDVl9DQUxMKCBjdlJlYWRSYXdEYXRhKCBmcywgc2l6ZXNfbm9kZSwgc2l6ZXMsICJpIiApKTsKKyAgICBDVl9DQUxMKCBlbGVtX3R5cGUgPSBpY3ZEZWNvZGVTaW1wbGVGb3JtYXQoIGR0ICkpOworCisgICAgZGF0YSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAiZGF0YSIgKTsKKyAgICBpZiggIWRhdGEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJUaGUgbWF0cml4IGRhdGEgaXMgbm90IGZvdW5kIGluIGZpbGUgc3RvcmFnZSIgKTsKKworICAgIGZvciggdG90YWxfc2l6ZSA9IENWX01BVF9DTihlbGVtX3R5cGUpLCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgIHRvdGFsX3NpemUgKj0gc2l6ZXNbaV07CisKKyAgICBpZiggaWN2RmlsZU5vZGVTZXFMZW4oIGRhdGEgKSAhPSB0b3RhbF9zaXplICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiVGhlIG1hdHJpeCBzaXplIGRvZXMgbm90IG1hdGNoIHRvIHRoZSBudW1iZXIgb2Ygc3RvcmVkIGVsZW1lbnRzIiApOworCisgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZDcmVhdGVNYXRORCggZGltcywgc2l6ZXMsIGVsZW1fdHlwZSApKTsKKyAgICBDVl9DQUxMKCBjdlJlYWRSYXdEYXRhKCBmcywgZGF0YSwgbWF0LT5kYXRhLnB0ciwgZHQgKSk7CisKKyAgICBwdHIgPSBtYXQ7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdlNwYXJzZU1hdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2ljdklzU3BhcnNlTWF0KCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBDVl9JU19TUEFSU0VfTUFUKHB0cik7Cit9CisKKworc3RhdGljIGludAoraWN2U29ydElkeENtcEZ1bmMoIGNvbnN0IHZvaWQqIF9hLCBjb25zdCB2b2lkKiBfYiwgdm9pZCogdXNlcmRhdGEgKQoreworICAgIGludCBpLCBkaW1zID0gKihpbnQqKXVzZXJkYXRhOworICAgIGNvbnN0IGludCogYSA9ICooY29uc3QgaW50KiopX2E7CisgICAgY29uc3QgaW50KiBiID0gKihjb25zdCBpbnQqKilfYjsKKworICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGRlbHRhID0gYVtpXSAtIGJbaV07CisgICAgICAgIGlmKCBkZWx0YSApCisgICAgICAgICAgICByZXR1cm4gZGVsdGE7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdldyaXRlU3BhcnNlTWF0KCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzdHJ1Y3RfcHRyLCBDdkF0dHJMaXN0IC8qYXR0ciovICkKK3sKKyAgICBDdk1lbVN0b3JhZ2UqIG1lbXN0b3JhZ2UgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZXcml0ZVNwYXJzZU1hdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IEN2U3BhcnNlTWF0KiBtYXQgPSAoY29uc3QgQ3ZTcGFyc2VNYXQqKXN0cnVjdF9wdHI7CisgICAgQ3ZTcGFyc2VNYXRJdGVyYXRvciBpdGVyYXRvcjsKKyAgICBDdlNwYXJzZU5vZGUqIG5vZGU7CisgICAgQ3ZTZXEqIGVsZW1lbnRzOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgZGltczsKKyAgICBpbnQgKnByZXZfaWR4ID0gMDsKKyAgICBjaGFyIGR0WzE2XTsKKworICAgIGFzc2VydCggQ1ZfSVNfU1BBUlNFX01BVChtYXQpICk7CisKKyAgICBDVl9DQUxMKCBtZW1zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCkpOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9TUEFSU0VfTUFUICkpOworICAgIGRpbXMgPSBjdkdldERpbXMoIG1hdCwgMCApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInNpemVzIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICBjdldyaXRlUmF3RGF0YSggZnMsIG1hdC0+c2l6ZSwgZGltcywgImkiICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgImR0IiwgaWN2RW5jb2RlRm9ybWF0KCBDVl9NQVRfVFlQRShtYXQtPnR5cGUpLCBkdCApLCAwICk7CisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImRhdGEiLCBDVl9OT0RFX1NFUSArIENWX05PREVfRkxPVyApOworCisgICAgZWxlbWVudHMgPSBjdkNyZWF0ZVNlcSggQ1ZfU0VRX0VMVFlQRV9QVFIsIHNpemVvZihDdlNlcSksIHNpemVvZihpbnQqKSwgbWVtc3RvcmFnZSApOworCisgICAgbm9kZSA9IGN2SW5pdFNwYXJzZU1hdEl0ZXJhdG9yKCBtYXQsICZpdGVyYXRvciApOworICAgIHdoaWxlKCBub2RlICkKKyAgICB7CisgICAgICAgIGludCogaWR4ID0gQ1ZfTk9ERV9JRFgoIG1hdCwgbm9kZSApOworICAgICAgICBjdlNlcVB1c2goIGVsZW1lbnRzLCAmaWR4ICk7CisgICAgICAgIG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmaXRlcmF0b3IgKTsKKyAgICB9CisKKyAgICBjdlNlcVNvcnQoIGVsZW1lbnRzLCBpY3ZTb3J0SWR4Q21wRnVuYywgJmRpbXMgKTsKKyAgICBjdlN0YXJ0UmVhZFNlcSggZWxlbWVudHMsICZyZWFkZXIsIDAgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBlbGVtZW50cy0+dG90YWw7IGkrKyApCisgICAgeworICAgICAgICBpbnQqIGlkeDsKKyAgICAgICAgdm9pZCogdmFsOworICAgICAgICBpbnQgayA9IDA7CisKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggaWR4LCByZWFkZXIgKTsKKyAgICAgICAgaWYoIGkgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCA7IGlkeFtrXSA9PSBwcmV2X2lkeFtrXTsgaysrICkKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGsgPCBkaW1zICk7CisgICAgICAgICAgICBpZiggayA8IGRpbXMgLSAxICkKKyAgICAgICAgICAgICAgICBmcy0+d3JpdGVfaW50KCBmcywgMCwgayAtIGRpbXMgKyAxICk7CisgICAgICAgIH0KKyAgICAgICAgZm9yKCA7IGsgPCBkaW1zOyBrKysgKQorICAgICAgICAgICAgZnMtPndyaXRlX2ludCggZnMsIDAsIGlkeFtrXSApOworICAgICAgICBwcmV2X2lkeCA9IGlkeDsKKworICAgICAgICBub2RlID0gKEN2U3BhcnNlTm9kZSopKCh1Y2hhciopaWR4IC0gbWF0LT5pZHhvZmZzZXQgKTsKKyAgICAgICAgdmFsID0gQ1ZfTk9ERV9WQUwoIG1hdCwgbm9kZSApOworCisgICAgICAgIGN2V3JpdGVSYXdEYXRhKCBmcywgdmFsLCAxLCBkdCApOworICAgIH0KKworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmbWVtc3RvcmFnZSApOworfQorCisKK3N0YXRpYyB2b2lkKgoraWN2UmVhZFNwYXJzZU1hdCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIHZvaWQqIHB0ciA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWFkU3BhcnNlTWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTcGFyc2VNYXQqIG1hdDsKKyAgICBjb25zdCBjaGFyKiBkdDsKKyAgICBDdkZpbGVOb2RlKiBkYXRhOworICAgIEN2RmlsZU5vZGUqIHNpemVzX25vZGU7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2U2VxKiBlbGVtZW50czsKKyAgICBpbnQqIGlkeDsKKyAgICBpbnQqIHNpemVzID0gMCwgZGltcywgZWxlbV90eXBlLCBjbjsKKyAgICBpbnQgaTsKKworICAgIENWX0NBTEwoIHNpemVzX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInNpemVzIiApKTsKKyAgICBkdCA9IGN2UmVhZFN0cmluZ0J5TmFtZSggZnMsIG5vZGUsICJkdCIsIDAgKTsKKworICAgIGlmKCAhc2l6ZXNfbm9kZSB8fCAhZHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJTb21lIG9mIGVzc2VudGlhbCBtYXRyaXggYXR0cmlidXRlcyBhcmUgYWJzZW50IiApOworCisgICAgZGltcyA9IENWX05PREVfSVNfU0VRKHNpemVzX25vZGUtPnRhZykgPyBzaXplc19ub2RlLT5kYXRhLnNlcS0+dG90YWwgOgorICAgICAgICAgICBDVl9OT0RFX0lTX0lOVChzaXplc19ub2RlLT50YWcpID8gMSA6IC0xOworCisgICAgaWYoIGRpbXMgPD0gMCB8fCBkaW1zID4gQ1ZfTUFYX0RJTV9IRUFQICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJDb3VsZCBub3QgZGV0ZXJtaW5lIHNwYXJzZSBtYXRyaXggZGltZW5zaW9uYWxpdHkiICk7CisKKyAgICBzaXplcyA9IChpbnQqKWFsbG9jYSggZGltcypzaXplb2Yoc2l6ZXNbMF0pKTsKKyAgICBDVl9DQUxMKCBjdlJlYWRSYXdEYXRhKCBmcywgc2l6ZXNfbm9kZSwgc2l6ZXMsICJpIiApKTsKKyAgICBDVl9DQUxMKCBlbGVtX3R5cGUgPSBpY3ZEZWNvZGVTaW1wbGVGb3JtYXQoIGR0ICkpOworCisgICAgZGF0YSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAiZGF0YSIgKTsKKyAgICBpZiggIWRhdGEgfHwgIUNWX05PREVfSVNfU0VRKGRhdGEtPnRhZykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJUaGUgbWF0cml4IGRhdGEgaXMgbm90IGZvdW5kIGluIGZpbGUgc3RvcmFnZSIgKTsKKworICAgIENWX0NBTEwoIG1hdCA9IGN2Q3JlYXRlU3BhcnNlTWF0KCBkaW1zLCBzaXplcywgZWxlbV90eXBlICkpOworCisgICAgY24gPSBDVl9NQVRfQ04oZWxlbV90eXBlKTsKKyAgICBpZHggPSAoaW50KilhbGxvY2EoIGRpbXMqc2l6ZW9mKGlkeFswXSkgKTsKKyAgICBlbGVtZW50cyA9IGRhdGEtPmRhdGEuc2VxOworICAgIGN2U3RhcnRSZWFkUmF3RGF0YSggZnMsIGRhdGEsICZyZWFkZXIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBlbGVtZW50cy0+dG90YWw7ICkKKyAgICB7CisgICAgICAgIEN2RmlsZU5vZGUqIGVsZW0gPSAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0cjsKKyAgICAgICAgdWNoYXIqIHZhbDsKKyAgICAgICAgaW50IGs7CisgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19JTlQoZWxlbS0+dGFnICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIlNwYXJzZSBtYXRyaXggZGF0YSBpcyBjb3JydXB0ZWQiICk7CisgICAgICAgIGsgPSBlbGVtLT5kYXRhLmk7CisgICAgICAgIGlmKCBpID4gMCAmJiBrID49IDAgKQorICAgICAgICAgICAgaWR4W2RpbXMtMV0gPSBrOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpID4gMCApCisgICAgICAgICAgICAgICAgayA9IGRpbXMgKyBrIC0gMTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpZHhbMF0gPSBrLCBrID0gMTsKKyAgICAgICAgICAgIGZvciggOyBrIDwgZGltczsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBlbGVtZW50cy0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgZWxlbSA9IChDdkZpbGVOb2RlKilyZWFkZXIucHRyOworICAgICAgICAgICAgICAgIGlmKCAhQ1ZfTk9ERV9JU19JTlQoZWxlbS0+dGFnICkgfHwgZWxlbS0+ZGF0YS5pIDwgMCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiU3BhcnNlIG1hdHJpeCBkYXRhIGlzIGNvcnJ1cHRlZCIgKTsKKyAgICAgICAgICAgICAgICBpZHhba10gPSBlbGVtLT5kYXRhLmk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZWxlbWVudHMtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgICAgIGkrKzsKKyAgICAgICAgQ1ZfQ0FMTCggdmFsID0gY3ZQdHJORCggbWF0LCBpZHgsIDAsIDEsIDAgKSk7CisgICAgICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGFTbGljZSggZnMsICZyZWFkZXIsIGNuLCB2YWwsIGR0ICkpOworICAgICAgICBpICs9IGNuOworICAgIH0KKworICAgIHB0ciA9IG1hdDsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcHRyOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIElwbEltYWdlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAoraWN2SXNJbWFnZSggY29uc3Qgdm9pZCogcHRyICkKK3sKKyAgICByZXR1cm4gQ1ZfSVNfSU1BR0VfSERSKHB0cik7Cit9CisKK3N0YXRpYyB2b2lkCitpY3ZXcml0ZUltYWdlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIsIEN2QXR0ckxpc3QgLyphdHRyKi8gKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVJbWFnZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IElwbEltYWdlKiBpbWFnZSA9IChjb25zdCBJcGxJbWFnZSopc3RydWN0X3B0cjsKKyAgICBjaGFyIGR0X2J1ZlsxNl0sICpkdDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgeSwgZGVwdGg7CisKKyAgICBhc3NlcnQoIENWX0lTX0lNQUdFKGltYWdlKSApOworCisgICAgaWYoIGltYWdlLT5kYXRhT3JkZXIgPT0gSVBMX0RBVEFfT1JERVJfUExBTkUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsCisgICAgICAgICJJbWFnZXMgd2l0aCBwbGFuYXIgZGF0YSBsYXlvdXQgYXJlIG5vdCBzdXBwb3J0ZWQiICk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBuYW1lLCBDVl9OT0RFX01BUCwgQ1ZfVFlQRV9OQU1FX0lNQUdFICkpOworICAgIGN2V3JpdGVJbnQoIGZzLCAid2lkdGgiLCBpbWFnZS0+d2lkdGggKTsKKyAgICBjdldyaXRlSW50KCBmcywgImhlaWdodCIsIGltYWdlLT5oZWlnaHQgKTsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgIm9yaWdpbiIsIGltYWdlLT5vcmlnaW4gPT0gSVBMX09SSUdJTl9UTAorICAgICAgICAgICAgICAgICAgID8gInRvcC1sZWZ0IiA6ICJib3R0b20tbGVmdCIsIDAgKTsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgImxheW91dCIsIGltYWdlLT5kYXRhT3JkZXIgPT0gSVBMX0RBVEFfT1JERVJfUExBTkUKKyAgICAgICAgICAgICAgICAgICA/ICJwbGFuYXIiIDogImludGVybGVhdmVkIiwgMCApOworICAgIGlmKCBpbWFnZS0+cm9pICkKKyAgICB7CisgICAgICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJyb2kiLCBDVl9OT0RFX01BUCArIENWX05PREVfRkxPVyApOworICAgICAgICBjdldyaXRlSW50KCBmcywgIngiLCBpbWFnZS0+cm9pLT54T2Zmc2V0ICk7CisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAieSIsIGltYWdlLT5yb2ktPnlPZmZzZXQgKTsKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJ3aWR0aCIsIGltYWdlLT5yb2ktPndpZHRoICk7CisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiaGVpZ2h0IiwgaW1hZ2UtPnJvaS0+aGVpZ2h0ICk7CisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiY29pIiwgaW1hZ2UtPnJvaS0+Y29pICk7CisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgfQorCisgICAgZGVwdGggPSBpY3ZJcGxUb0N2RGVwdGgoaW1hZ2UtPmRlcHRoKTsKKyAgICBzcHJpbnRmKCBkdF9idWYsICIlZCVjIiwgaW1hZ2UtPm5DaGFubmVscywgaWN2VHlwZVN5bWJvbFtkZXB0aF0gKTsKKyAgICBkdCA9IGR0X2J1ZiArIChkdF9idWZbMl0gPT0gJ1wwJyAmJiBkdF9idWZbMF0gPT0gJzEnKTsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgImR0IiwgZHQsIDAgKTsKKworICAgIHNpemUgPSBjdlNpemUoaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKKyAgICBpZiggc2l6ZS53aWR0aCppbWFnZS0+bkNoYW5uZWxzKkNWX0VMRU1fU0laRShkZXB0aCkgPT0gaW1hZ2UtPndpZHRoU3RlcCApCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgfQorCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImRhdGEiLCBDVl9OT0RFX1NFUSArIENWX05PREVfRkxPVyApOworICAgIGZvciggeSA9IDA7IHkgPCBzaXplLmhlaWdodDsgeSsrICkKKyAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCBpbWFnZS0+aW1hZ2VEYXRhICsgeSppbWFnZS0+d2lkdGhTdGVwLCBzaXplLndpZHRoLCBkdCApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIHZvaWQqCitpY3ZSZWFkSW1hZ2UoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlICkKK3sKKyAgICB2b2lkKiBwdHIgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiaWN2UmVhZEltYWdlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgSXBsSW1hZ2UqIGltYWdlOworICAgIGNvbnN0IGNoYXIqIGR0OworICAgIEN2RmlsZU5vZGUqIGRhdGE7CisgICAgQ3ZGaWxlTm9kZSogcm9pX25vZGU7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2UmVjdCByb2k7CisgICAgaW50IHksIHdpZHRoLCBoZWlnaHQsIGVsZW1fdHlwZSwgY29pLCBkZXB0aDsKKyAgICBjb25zdCBjaGFyKiBvcmlnaW4sICpkYXRhX29yZGVyOworCisgICAgQ1ZfQ0FMTCggd2lkdGggPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAid2lkdGgiLCAwICkpOworICAgIGhlaWdodCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIG5vZGUsICJoZWlnaHQiLCAwICk7CisgICAgZHQgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAiZHQiLCAwICk7CisgICAgb3JpZ2luID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgbm9kZSwgIm9yaWdpbiIsIDAgKTsKKworICAgIGlmKCB3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGR0ID09IDAgfHwgb3JpZ2luID09IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJTb21lIG9mIGVzc2VudGlhbCBpbWFnZSBhdHRyaWJ1dGVzIGFyZSBhYnNlbnQiICk7CisKKyAgICBDVl9DQUxMKCBlbGVtX3R5cGUgPSBpY3ZEZWNvZGVTaW1wbGVGb3JtYXQoIGR0ICkpOworICAgIGRhdGFfb3JkZXIgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAibGF5b3V0IiwgImludGVybGVhdmVkIiApOworICAgIGlmKCBzdHJjbXAoIGRhdGFfb3JkZXIsICJpbnRlcmxlYXZlZCIgKSAhPSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiT25seSBpbnRlcmxlYXZlZCBpbWFnZXMgY2FuIGJlIHJlYWQiICk7CisKKyAgICBkYXRhID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGUsICJkYXRhIiApOworICAgIGlmKCAhZGF0YSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBpbWFnZSBkYXRhIGlzIG5vdCBmb3VuZCBpbiBmaWxlIHN0b3JhZ2UiICk7CisKKyAgICBpZiggaWN2RmlsZU5vZGVTZXFMZW4oIGRhdGEgKSAhPSB3aWR0aCpoZWlnaHQqQ1ZfTUFUX0NOKGVsZW1fdHlwZSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICJUaGUgbWF0cml4IHNpemUgZG9lcyBub3QgbWF0Y2ggdG8gdGhlIG51bWJlciBvZiBzdG9yZWQgZWxlbWVudHMiICk7CisKKyAgICBkZXB0aCA9IGN2Q3ZUb0lwbERlcHRoKGVsZW1fdHlwZSk7CisgICAgQ1ZfQ0FMTCggaW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdlNpemUod2lkdGgsaGVpZ2h0KSwgZGVwdGgsIENWX01BVF9DTihlbGVtX3R5cGUpICkpOworCisgICAgcm9pX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInJvaSIgKTsKKyAgICBpZiggcm9pX25vZGUgKQorICAgIHsKKyAgICAgICAgcm9pLnggPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCByb2lfbm9kZSwgIngiLCAwICk7CisgICAgICAgIHJvaS55ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgcm9pX25vZGUsICJ5IiwgMCApOworICAgICAgICByb2kud2lkdGggPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCByb2lfbm9kZSwgIndpZHRoIiwgMCApOworICAgICAgICByb2kuaGVpZ2h0ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgcm9pX25vZGUsICJoZWlnaHQiLCAwICk7CisgICAgICAgIGNvaSA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHJvaV9ub2RlLCAiY29pIiwgMCApOworCisgICAgICAgIGN2U2V0SW1hZ2VST0koIGltYWdlLCByb2kgKTsKKyAgICAgICAgY3ZTZXRJbWFnZUNPSSggaW1hZ2UsIGNvaSApOworICAgIH0KKworICAgIGlmKCB3aWR0aCpDVl9FTEVNX1NJWkUoZWxlbV90eXBlKSA9PSBpbWFnZS0+d2lkdGhTdGVwICkKKyAgICB7CisgICAgICAgIHdpZHRoICo9IGhlaWdodDsKKyAgICAgICAgaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICB3aWR0aCAqPSBDVl9NQVRfQ04oZWxlbV90eXBlKTsKKyAgICBjdlN0YXJ0UmVhZFJhd0RhdGEoIGZzLCBkYXRhLCAmcmVhZGVyICk7CisgICAgZm9yKCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGFTbGljZSggZnMsICZyZWFkZXIsIHdpZHRoLAorICAgICAgICAgICAgaW1hZ2UtPmltYWdlRGF0YSArIHkqaW1hZ2UtPndpZHRoU3RlcCwgZHQgKSk7CisgICAgfQorCisgICAgcHRyID0gaW1hZ2U7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHB0cjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdlNlcSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQKK2ljdklzU2VxKCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBDVl9JU19TRVEocHRyKTsKK30KKworCitzdGF0aWMgdm9pZAoraWN2UmVsZWFzZVNlcSggdm9pZCoqIHB0ciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWxlYXNlU2VxIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFwdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgZG91YmxlIHBvaW50ZXIiICk7CisKKyAgICAqcHRyID0gMDsgLy8gaXQncyBpbXBvc3NpYmxlIG5vdyB0byByZWxlYXNlIHNlcSwgc28ganVzdCBjbGVhciB0aGUgcG9pbnRlcgorCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZCoKK2ljdkNsb25lU2VxKCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBjdlNlcVNsaWNlKCAoQ3ZTZXEqKXB0ciwgQ1ZfV0hPTEVfU0VRLAorICAgICAgICAgICAgICAgICAgICAgICAwIC8qIHVzZSB0aGUgc2FtZSBzdG9yYWdlIGFzIGZvciB0aGUgb3JpZ2luYWwgc2VxdWVuY2UgKi8sIDEgKTsKK30KKworCitzdGF0aWMgdm9pZAoraWN2V3JpdGVIZWFkZXJEYXRhKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgQ3ZTZXEqIHNlcSwKKyAgICAgICAgICAgICAgICAgICAgQ3ZBdHRyTGlzdCogYXR0ciwgaW50IGluaXRpYWxfaGVhZGVyX3NpemUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVIZWFkZXJEYXRhIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2hhciBoZWFkZXJfZHRfYnVmWzEyOF07CisgICAgY29uc3QgY2hhciogaGVhZGVyX2R0ID0gY3ZBdHRyVmFsdWUoIGF0dHIsICJoZWFkZXJfZHQiICk7CisKKyAgICBpZiggaGVhZGVyX2R0ICkKKyAgICB7CisgICAgICAgIGludCBkdF9oZWFkZXJfc2l6ZTsKKyAgICAgICAgQ1ZfQ0FMTCggZHRfaGVhZGVyX3NpemUgPSBpY3ZDYWxjRWxlbVNpemUoIGhlYWRlcl9kdCwgaW5pdGlhbF9oZWFkZXJfc2l6ZSApKTsKKyAgICAgICAgaWYoIGR0X2hlYWRlcl9zaXplID4gc2VxLT5oZWFkZXJfc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAiVGhlIHNpemUgb2YgaGVhZGVyIGNhbGN1bGF0ZWQgZnJvbSBcImhlYWRlcl9kdFwiIGlzIGdyZWF0ZXIgdGhhbiBoZWFkZXJfc2l6ZSIgKTsKKyAgICB9CisgICAgZWxzZSBpZiggc2VxLT5oZWFkZXJfc2l6ZSA+IGluaXRpYWxfaGVhZGVyX3NpemUgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX1NFUShzZXEpICYmIENWX0lTX1NFUV9QT0lOVF9TRVQoc2VxKSAmJgorICAgICAgICAgICAgc2VxLT5oZWFkZXJfc2l6ZSA9PSBzaXplb2YoQ3ZQb2ludDJEU2VxKSAmJgorICAgICAgICAgICAgc2VxLT5lbGVtX3NpemUgPT0gc2l6ZW9mKGludCkqMiApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2UG9pbnQyRFNlcSogcG9pbnRfc2VxID0gKEN2UG9pbnQyRFNlcSopc2VxOworCisgICAgICAgICAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAicmVjdCIsIENWX05PREVfTUFQICsgQ1ZfTk9ERV9GTE9XICk7CisgICAgICAgICAgICBjdldyaXRlSW50KCBmcywgIngiLCBwb2ludF9zZXEtPnJlY3QueCApOworICAgICAgICAgICAgY3ZXcml0ZUludCggZnMsICJ5IiwgcG9pbnRfc2VxLT5yZWN0LnkgKTsKKyAgICAgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAid2lkdGgiLCBwb2ludF9zZXEtPnJlY3Qud2lkdGggKTsKKyAgICAgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiaGVpZ2h0IiwgcG9pbnRfc2VxLT5yZWN0LmhlaWdodCApOworICAgICAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICAgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiY29sb3IiLCBwb2ludF9zZXEtPmNvbG9yICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggQ1ZfSVNfU0VRKHNlcSkgJiYgQ1ZfSVNfU0VRX0NIQUlOKHNlcSkgJiYKKyAgICAgICAgICAgICAgICAgQ1ZfTUFUX1RZUEUoc2VxLT5mbGFncykgPT0gQ1ZfOFVDMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Q2hhaW4qIGNoYWluID0gKEN2Q2hhaW4qKXNlcTsKKworICAgICAgICAgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgIm9yaWdpbiIsIENWX05PREVfTUFQICsgQ1ZfTk9ERV9GTE9XICk7CisgICAgICAgICAgICBjdldyaXRlSW50KCBmcywgIngiLCBjaGFpbi0+b3JpZ2luLnggKTsKKyAgICAgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAieSIsIGNoYWluLT5vcmlnaW4ueSApOworICAgICAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGV4dHJhX3NpemUgPSBzZXEtPmhlYWRlcl9zaXplIC0gaW5pdGlhbF9oZWFkZXJfc2l6ZTsKKyAgICAgICAgICAgIC8vIGEgaGV1cmlzdGljIHRvIHByb3ZpZGUgbmljZSBkZWZhdWx0cyBmb3Igc2VxdWVuY2VzIG9mIGludCdzICYgZmxvYXQncworICAgICAgICAgICAgaWYoIGV4dHJhX3NpemUgJSBzaXplb2YoaW50KSA9PSAwICkKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCBoZWFkZXJfZHRfYnVmLCAiJXVpIiwgKHVuc2lnbmVkKShleHRyYV9zaXplL3NpemVvZihpbnQpKSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwcmludGYoIGhlYWRlcl9kdF9idWYsICIldXUiLCBleHRyYV9zaXplICk7CisgICAgICAgICAgICBoZWFkZXJfZHQgPSBoZWFkZXJfZHRfYnVmOworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGhlYWRlcl9kdCApCisgICAgeworICAgICAgICBjdldyaXRlU3RyaW5nKCBmcywgImhlYWRlcl9kdCIsIGhlYWRlcl9kdCwgMCApOworICAgICAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAiaGVhZGVyX3VzZXJfZGF0YSIsIENWX05PREVfU0VRICsgQ1ZfTk9ERV9GTE9XICk7CisgICAgICAgIGN2V3JpdGVSYXdEYXRhKCBmcywgKHVjaGFyKilzZXEgKyBzaXplb2YoQ3ZTZXEpLCAxLCBoZWFkZXJfZHQgKTsKKyAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyBjaGFyKgoraWN2R2V0Rm9ybWF0KCBjb25zdCBDdlNlcSogc2VxLCBjb25zdCBjaGFyKiBkdF9rZXksIEN2QXR0ckxpc3QqIGF0dHIsCisgICAgICAgICAgICAgIGludCBpbml0aWFsX2VsZW1fc2l6ZSwgY2hhciogZHRfYnVmICkKK3sKKyAgICBjaGFyKiBkdCA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImljdldyaXRlRm9ybWF0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZHQgPSAoY2hhciopY3ZBdHRyVmFsdWUoIGF0dHIsIGR0X2tleSApOworCisgICAgaWYoIGR0ICkKKyAgICB7CisgICAgICAgIGludCBkdF9lbGVtX3NpemU7CisgICAgICAgIENWX0NBTEwoIGR0X2VsZW1fc2l6ZSA9IGljdkNhbGNFbGVtU2l6ZSggZHQsIGluaXRpYWxfZWxlbV9zaXplICkpOworICAgICAgICBpZiggZHRfZWxlbV9zaXplICE9IHNlcS0+ZWxlbV9zaXplICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgICAgICJUaGUgc2l6ZSBvZiBlbGVtZW50IGNhbGN1bGF0ZWQgZnJvbSBcImR0XCIgYW5kICIKKyAgICAgICAgICAgICJ0aGUgZWxlbV9zaXplIGRvIG5vdCBtYXRjaCIgKTsKKyAgICB9CisgICAgZWxzZSBpZiggQ1ZfTUFUX1RZUEUoc2VxLT5mbGFncykgIT0gMCB8fCBzZXEtPmVsZW1fc2l6ZSA9PSAxICkKKyAgICB7CisgICAgICAgIGludCBhbGlnbiA9IENWX01BVF9ERVBUSChzZXEtPmZsYWdzKSA9PSBDVl82NEYgPyBzaXplb2YoZG91YmxlKSA6IHNpemVvZihzaXplX3QpOworICAgICAgICBpbnQgZnVsbF9lbGVtX3NpemUgPSBjdkFsaWduKENWX0VMRU1fU0laRShzZXEtPmZsYWdzKSArIGluaXRpYWxfZWxlbV9zaXplLCBhbGlnbik7CisgICAgICAgIGlmKCBzZXEtPmVsZW1fc2l6ZSAhPSBmdWxsX2VsZW1fc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAiU2l6ZSBvZiBzZXF1ZW5jZSBlbGVtZW50IChlbGVtX3NpemUpIGlzIGluY29uc2lzdGVudCB3aXRoIHNlcS0+ZmxhZ3MiICk7CisgICAgICAgIGR0ID0gaWN2RW5jb2RlRm9ybWF0KCBDVl9NQVRfVFlQRShzZXEtPmZsYWdzKSwgZHRfYnVmICk7CisgICAgfQorICAgIGVsc2UgaWYoIHNlcS0+ZWxlbV9zaXplID4gaW5pdGlhbF9lbGVtX3NpemUgKQorICAgIHsKKyAgICAgICAgdW5zaWduZWQgZXh0cmFfZWxlbV9zaXplID0gc2VxLT5lbGVtX3NpemUgLSBpbml0aWFsX2VsZW1fc2l6ZTsKKyAgICAgICAgLy8gYSBoZXVyaXN0aWMgdG8gcHJvdmlkZSBuaWNlIGRlZmF1bHRzIGZvciBzZXF1ZW5jZXMgb2YgaW50J3MgJiBmbG9hdCdzCisgICAgICAgIGlmKCBleHRyYV9lbGVtX3NpemUgJSBzaXplb2YoaW50KSA9PSAwICkKKyAgICAgICAgICAgIHNwcmludGYoIGR0X2J1ZiwgIiV1aSIsICh1bnNpZ25lZCkoZXh0cmFfZWxlbV9zaXplL3NpemVvZihpbnQpKSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzcHJpbnRmKCBkdF9idWYsICIldXUiLCBleHRyYV9lbGVtX3NpemUgKTsKKyAgICAgICAgZHQgPSBkdF9idWY7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBkdDsKK30KKworCitzdGF0aWMgdm9pZAoraWN2V3JpdGVTZXEoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIsCisgICAgICAgICAgICAgQ3ZBdHRyTGlzdCBhdHRyLCBpbnQgbGV2ZWwgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVTZXEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBDdlNlcSogc2VxID0gKEN2U2VxKilzdHJ1Y3RfcHRyOworICAgIEN2U2VxQmxvY2sqIGJsb2NrOworICAgIGNoYXIgYnVmWzEyOF07CisgICAgY2hhciBkdF9idWZbMTI4XSwgKmR0OworCisgICAgYXNzZXJ0KCBDVl9JU19TRVEoIHNlcSApKTsKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBuYW1lLCBDVl9OT0RFX01BUCwgQ1ZfVFlQRV9OQU1FX1NFUSApKTsKKworICAgIGlmKCBsZXZlbCA+PSAwICkKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJsZXZlbCIsIGxldmVsICk7CisKKyAgICBzcHJpbnRmKCBidWYsICIlMDh4Iiwgc2VxLT5mbGFncyApOworICAgIGN2V3JpdGVTdHJpbmcoIGZzLCAiZmxhZ3MiLCBidWYsIDEgKTsKKyAgICBjdldyaXRlSW50KCBmcywgImNvdW50Iiwgc2VxLT50b3RhbCApOworICAgIENWX0NBTEwoIGR0ID0gaWN2R2V0Rm9ybWF0KCBzZXEsICJkdCIsICZhdHRyLCAwLCBkdF9idWYgKSk7CisgICAgY3ZXcml0ZVN0cmluZyggZnMsICJkdCIsIGR0LCAwICk7CisKKyAgICBDVl9DQUxMKCBpY3ZXcml0ZUhlYWRlckRhdGEoIGZzLCBzZXEsICZhdHRyLCBzaXplb2YoQ3ZTZXEpICkpOworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJkYXRhIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKworICAgIGZvciggYmxvY2sgPSBzZXEtPmZpcnN0OyBibG9jazsgYmxvY2sgPSBibG9jay0+bmV4dCApCisgICAgeworICAgICAgICBjdldyaXRlUmF3RGF0YSggZnMsIGJsb2NrLT5kYXRhLCBibG9jay0+Y291bnQsIGR0ICk7CisgICAgICAgIGlmKCBibG9jayA9PSBzZXEtPmZpcnN0LT5wcmV2ICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZXcml0ZVNlcVRyZWUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzdHJ1Y3RfcHRyLCBDdkF0dHJMaXN0IGF0dHIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVTZXFUcmVlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY29uc3QgQ3ZTZXEqIHNlcSA9IChDdlNlcSopc3RydWN0X3B0cjsKKyAgICBjb25zdCBjaGFyKiByZWN1cnNpdmVfdmFsdWUgPSBjdkF0dHJWYWx1ZSggJmF0dHIsICJyZWN1cnNpdmUiICk7CisgICAgaW50IGlzX3JlY3Vyc2l2ZSA9IHJlY3Vyc2l2ZV92YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAocmVjdXJzaXZlX3ZhbHVlLCIwIikgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAocmVjdXJzaXZlX3ZhbHVlLCJmYWxzZSIpICE9IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKHJlY3Vyc2l2ZV92YWx1ZSwiRmFsc2UiKSAhPSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcChyZWN1cnNpdmVfdmFsdWUsIkZBTFNFIikgIT0gMDsKKworICAgIGFzc2VydCggQ1ZfSVNfU0VRKCBzZXEgKSk7CisKKyAgICBpZiggIWlzX3JlY3Vyc2l2ZSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpY3ZXcml0ZVNlcSggZnMsIG5hbWUsIHNlcSwgYXR0ciwgLTEgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2VHJlZU5vZGVJdGVyYXRvciB0cmVlX2l0ZXJhdG9yOworCisgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIG5hbWUsIENWX05PREVfTUFQLCBDVl9UWVBFX05BTUVfU0VRX1RSRUUgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJzZXF1ZW5jZXMiLCBDVl9OT0RFX1NFUSApKTsKKyAgICAgICAgY3ZJbml0VHJlZU5vZGVJdGVyYXRvciggJnRyZWVfaXRlcmF0b3IsIHNlcSwgSU5UX01BWCApOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICF0cmVlX2l0ZXJhdG9yLm5vZGUgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgQ1ZfQ0FMTCggaWN2V3JpdGVTZXEoIGZzLCAwLCB0cmVlX2l0ZXJhdG9yLm5vZGUsIGF0dHIsIHRyZWVfaXRlcmF0b3IubGV2ZWwgKSk7CisgICAgICAgICAgICBjdk5leHRUcmVlTm9kZSggJnRyZWVfaXRlcmF0b3IgKTsKKyAgICAgICAgfQorCisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgdm9pZCoKK2ljdlJlYWRTZXEoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlICkKK3sKKyAgICB2b2lkKiBwdHIgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiaWN2UmVhZFNlcSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U2VxKiBzZXE7CisgICAgQ3ZTZXFCbG9jayogYmxvY2s7CisgICAgQ3ZGaWxlTm9kZSAqZGF0YSwgKmhlYWRlcl9ub2RlLCAqcmVjdF9ub2RlLCAqb3JpZ2luX25vZGU7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIGludCB0b3RhbCwgZmxhZ3M7CisgICAgaW50IGVsZW1fc2l6ZSwgaGVhZGVyX3NpemUgPSBzaXplb2YoQ3ZTZXEpOworICAgIGludCBmbXRfcGFpcnNbQ1ZfRlNfTUFYX0ZNVF9QQUlSU10sIGksIGZtdF9wYWlyX2NvdW50OworICAgIGludCBpdGVtc19wZXJfZWxlbSA9IDA7CisgICAgY29uc3QgY2hhciogZmxhZ3Nfc3RyOworICAgIGNvbnN0IGNoYXIqIGhlYWRlcl9kdDsKKyAgICBjb25zdCBjaGFyKiBkdDsKKyAgICBjaGFyKiBlbmRwdHIgPSAwOworCisgICAgQ1ZfQ0FMTCggZmxhZ3Nfc3RyID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgbm9kZSwgImZsYWdzIiwgMCApKTsKKyAgICB0b3RhbCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIG5vZGUsICJjb3VudCIsIC0xICk7CisgICAgZHQgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAiZHQiLCAwICk7CisKKyAgICBpZiggIWZsYWdzX3N0ciB8fCB0b3RhbCA9PSAtMSB8fCAhZHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJTb21lIG9mIGVzc2VudGlhbCBzZXF1ZW5jZSBhdHRyaWJ1dGVzIGFyZSBhYnNlbnQiICk7CisKKyAgICBmbGFncyA9IChpbnQpc3RydG9sKCBmbGFnc19zdHIsICZlbmRwdHIsIDE2ICk7CisgICAgaWYoIGVuZHB0ciA9PSBmbGFnc19zdHIgfHwgKGZsYWdzICYgQ1ZfTUFHSUNfTUFTSykgIT0gQ1ZfU0VRX01BR0lDX1ZBTCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBzZXF1ZW5jZSBmbGFncyBhcmUgaW52YWxpZCIgKTsKKworICAgIGhlYWRlcl9kdCA9IGN2UmVhZFN0cmluZ0J5TmFtZSggZnMsIG5vZGUsICJoZWFkZXJfZHQiLCAwICk7CisgICAgaGVhZGVyX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgImhlYWRlcl91c2VyX2RhdGEiICk7CisKKyAgICBpZiggKGhlYWRlcl9kdCAhPSAwKSBeIChoZWFkZXJfbm9kZSAhPSAwKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwKKyAgICAgICAgIk9uZSBvZiBcImhlYWRlcl9kdFwiIGFuZCBcImhlYWRlcl91c2VyX2RhdGFcIiBpcyB0aGVyZSwgd2hpbGUgdGhlIG90aGVyIGlzIG5vdCIgKTsKKworICAgIHJlY3Rfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAicmVjdCIgKTsKKyAgICBvcmlnaW5fbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAib3JpZ2luIiApOworCisgICAgaWYoIChoZWFkZXJfbm9kZSAhPSAwKSArIChyZWN0X25vZGUgIT0gMCkgKyAob3JpZ2luX25vZGUgIT0gMCkgPiAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiT25seSBvbmUgb2YgXCJoZWFkZXJfdXNlcl9kYXRhXCIsIFwicmVjdFwiIGFuZCBcIm9yaWdpblwiIHRhZ3MgbWF5IG9jY3VyIiApOworCisgICAgaWYoIGhlYWRlcl9kdCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBoZWFkZXJfc2l6ZSA9IGljdkNhbGNFbGVtU2l6ZSggaGVhZGVyX2R0LCBoZWFkZXJfc2l6ZSApKTsKKyAgICB9CisgICAgZWxzZSBpZiggcmVjdF9ub2RlICkKKyAgICAgICAgaGVhZGVyX3NpemUgPSBzaXplb2YoQ3ZQb2ludDJEU2VxKTsKKyAgICBlbHNlIGlmKCBvcmlnaW5fbm9kZSApCisgICAgICAgIGhlYWRlcl9zaXplID0gc2l6ZW9mKEN2Q2hhaW4pOworCisgICAgQ1ZfQ0FMTCggZWxlbV9zaXplID0gaWN2Q2FsY0VsZW1TaXplKCBkdCwgMCApKTsKKyAgICBDVl9DQUxMKCBzZXEgPSBjdkNyZWF0ZVNlcSggZmxhZ3MsIGhlYWRlcl9zaXplLCBlbGVtX3NpemUsIGZzLT5kc3RzdG9yYWdlICkpOworCisgICAgaWYoIGhlYWRlcl9ub2RlICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGEoIGZzLCBoZWFkZXJfbm9kZSwgKGNoYXIqKXNlcSArIHNpemVvZihDdlNlcSksIGhlYWRlcl9kdCApKTsKKyAgICB9CisgICAgZWxzZSBpZiggcmVjdF9ub2RlICkKKyAgICB7CisgICAgICAgIEN2UG9pbnQyRFNlcSogcG9pbnRfc2VxID0gKEN2UG9pbnQyRFNlcSopc2VxOworICAgICAgICBwb2ludF9zZXEtPnJlY3QueCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHJlY3Rfbm9kZSwgIngiLCAwICk7CisgICAgICAgIHBvaW50X3NlcS0+cmVjdC55ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgcmVjdF9ub2RlLCAieSIsIDAgKTsKKyAgICAgICAgcG9pbnRfc2VxLT5yZWN0LndpZHRoID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgcmVjdF9ub2RlLCAid2lkdGgiLCAwICk7CisgICAgICAgIHBvaW50X3NlcS0+cmVjdC5oZWlnaHQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCByZWN0X25vZGUsICJoZWlnaHQiLCAwICk7CisgICAgICAgIHBvaW50X3NlcS0+Y29sb3IgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiY29sb3IiLCAwICk7CisgICAgfQorICAgIGVsc2UgaWYoIG9yaWdpbl9ub2RlICkKKyAgICB7CisgICAgICAgIEN2Q2hhaW4qIGNoYWluID0gKEN2Q2hhaW4qKXNlcTsKKyAgICAgICAgY2hhaW4tPm9yaWdpbi54ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgb3JpZ2luX25vZGUsICJ4IiwgMCApOworICAgICAgICBjaGFpbi0+b3JpZ2luLnkgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBvcmlnaW5fbm9kZSwgInkiLCAwICk7CisgICAgfQorCisgICAgY3ZTZXFQdXNoTXVsdGkoIHNlcSwgMCwgdG90YWwsIDAgKTsKKyAgICBDVl9DQUxMKCBmbXRfcGFpcl9jb3VudCA9IGljdkRlY29kZUZvcm1hdCggZHQsIGZtdF9wYWlycywgQ1ZfRlNfTUFYX0ZNVF9QQUlSUyApKTsKKyAgICBmbXRfcGFpcl9jb3VudCAqPSAyOworICAgIGZvciggaSA9IDA7IGkgPCBmbXRfcGFpcl9jb3VudDsgaSArPSAyICkKKyAgICAgICAgaXRlbXNfcGVyX2VsZW0gKz0gZm10X3BhaXJzW2ldOworCisgICAgZGF0YSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAiZGF0YSIgKTsKKyAgICBpZiggIWRhdGEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJUaGUgaW1hZ2UgZGF0YSBpcyBub3QgZm91bmQgaW4gZmlsZSBzdG9yYWdlIiApOworCisgICAgaWYoIGljdkZpbGVOb2RlU2VxTGVuKCBkYXRhICkgIT0gdG90YWwqaXRlbXNfcGVyX2VsZW0gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJUaGUgbnVtYmVyIG9mIHN0b3JlZCBlbGVtZW50cyBkb2VzIG5vdCBtYXRjaCB0byBcImNvdW50XCIiICk7CisKKyAgICBjdlN0YXJ0UmVhZFJhd0RhdGEoIGZzLCBkYXRhLCAmcmVhZGVyICk7CisgICAgZm9yKCBibG9jayA9IHNlcS0+Zmlyc3Q7IGJsb2NrOyBibG9jayA9IGJsb2NrLT5uZXh0ICkKKyAgICB7CisgICAgICAgIGludCBkZWx0YSA9IGJsb2NrLT5jb3VudCppdGVtc19wZXJfZWxlbTsKKyAgICAgICAgY3ZSZWFkUmF3RGF0YVNsaWNlKCBmcywgJnJlYWRlciwgZGVsdGEsIGJsb2NrLT5kYXRhLCBkdCApOworICAgICAgICBpZiggYmxvY2sgPT0gc2VxLT5maXJzdC0+cHJldiApCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBwdHIgPSBzZXE7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHB0cjsKK30KKworCitzdGF0aWMgdm9pZCoKK2ljdlJlYWRTZXFUcmVlKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApCit7CisgICAgdm9pZCogcHRyID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImljdlJlYWRTZXFUcmVlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZGaWxlTm9kZSAqc2VxdWVuY2VzX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInNlcXVlbmNlcyIgKTsKKyAgICBDdlNlcSogc2VxdWVuY2VzOworICAgIEN2U2VxKiByb290ID0gMDsKKyAgICBDdlNlcSogcGFyZW50ID0gMDsKKyAgICBDdlNlcSogcHJldl9zZXEgPSAwOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgdG90YWw7CisgICAgaW50IHByZXZfbGV2ZWwgPSAwOworCisgICAgaWYoICFzZXF1ZW5jZXNfbm9kZSB8fCAhQ1ZfTk9ERV9JU19TRVEoc2VxdWVuY2VzX25vZGUtPnRhZykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwKKyAgICAgICAgIm9wZW5jdi1zZXF1ZW5jZS10cmVlIGluc3RhbmNlIHNob3VsZCBjb250YWluIGEgZmllbGQgXCJzZXF1ZW5jZXNcIiB0aGF0IHNob3VsZCBiZSBhIHNlcXVlbmNlIiApOworCisgICAgc2VxdWVuY2VzID0gc2VxdWVuY2VzX25vZGUtPmRhdGEuc2VxOworICAgIHRvdGFsID0gc2VxdWVuY2VzLT50b3RhbDsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBzZXF1ZW5jZXMsICZyZWFkZXIsIDAgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgdG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBlbGVtID0gKEN2RmlsZU5vZGUqKXJlYWRlci5wdHI7CisgICAgICAgIEN2U2VxKiBzZXE7CisgICAgICAgIGludCBsZXZlbDsKKyAgICAgICAgQ1ZfQ0FMTCggc2VxID0gKEN2U2VxKiljdlJlYWQoIGZzLCBlbGVtICkpOworICAgICAgICBDVl9DQUxMKCBsZXZlbCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGVsZW0sICJsZXZlbCIsIC0xICkpOworICAgICAgICBpZiggbGV2ZWwgPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiQWxsIHRoZSBzZXF1ZW5jZSB0cmVlIG5vZGVzIHNob3VsZCBjb250YWluIFwibGV2ZWxcIiBmaWVsZCIgKTsKKyAgICAgICAgaWYoICFyb290ICkKKyAgICAgICAgICAgIHJvb3QgPSBzZXE7CisgICAgICAgIGlmKCBsZXZlbCA+IHByZXZfbGV2ZWwgKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnQoIGxldmVsID09IHByZXZfbGV2ZWwgKyAxICk7CisgICAgICAgICAgICBwYXJlbnQgPSBwcmV2X3NlcTsKKyAgICAgICAgICAgIHByZXZfc2VxID0gMDsKKyAgICAgICAgICAgIGlmKCBwYXJlbnQgKQorICAgICAgICAgICAgICAgIHBhcmVudC0+dl9uZXh0ID0gc2VxOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGxldmVsIDwgcHJldl9sZXZlbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggOyBwcmV2X2xldmVsID4gbGV2ZWw7IHByZXZfbGV2ZWwtLSApCisgICAgICAgICAgICAgICAgcHJldl9zZXEgPSBwcmV2X3NlcS0+dl9wcmV2OworICAgICAgICAgICAgcGFyZW50ID0gcHJldl9zZXEtPnZfcHJldjsKKyAgICAgICAgfQorICAgICAgICBzZXEtPmhfcHJldiA9IHByZXZfc2VxOworICAgICAgICBpZiggcHJldl9zZXEgKQorICAgICAgICAgICAgcHJldl9zZXEtPmhfbmV4dCA9IHNlcTsKKyAgICAgICAgc2VxLT52X3ByZXYgPSBwYXJlbnQ7CisgICAgICAgIHByZXZfc2VxID0gc2VxOworICAgICAgICBwcmV2X2xldmVsID0gbGV2ZWw7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNlcXVlbmNlcy0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBwdHIgPSByb290OworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBwdHI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEN2R3JhcGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50CitpY3ZJc0dyYXBoKCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBDVl9JU19HUkFQSChwdHIpOworfQorCisKK3N0YXRpYyB2b2lkCitpY3ZSZWxlYXNlR3JhcGgoIHZvaWQqKiBwdHIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiaWN2UmVsZWFzZUdyYXBoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFwdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgZG91YmxlIHBvaW50ZXIiICk7CisKKyAgICAqcHRyID0gMDsgLy8gaXQncyBpbXBvc3NpYmxlIG5vdyB0byByZWxlYXNlIGdyYXBoLCBzbyBqdXN0IGNsZWFyIHRoZSBwb2ludGVyCisKKyAgICBfX0VORF9fOworfQorCisKK3N0YXRpYyB2b2lkKgoraWN2Q2xvbmVHcmFwaCggY29uc3Qgdm9pZCogcHRyICkKK3sKKyAgICByZXR1cm4gY3ZDbG9uZUdyYXBoKCAoY29uc3QgQ3ZHcmFwaCopcHRyLCAwICk7Cit9CisKKworc3RhdGljIHZvaWQKK2ljdldyaXRlR3JhcGgoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3RydWN0X3B0ciwgQ3ZBdHRyTGlzdCBhdHRyICkKK3sKKyAgICBpbnQqIGZsYWdfYnVmID0gMDsKKyAgICBjaGFyKiB3cml0ZV9idWYgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiaWN2V3JpdGVHcmFwaCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IEN2R3JhcGgqIGdyYXBoID0gKGNvbnN0IEN2R3JhcGgqKXN0cnVjdF9wdHI7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIGNoYXIgYnVmWzEyOF07CisgICAgaW50IGksIGssIHZ0eF9jb3VudCwgZWRnZV9jb3VudDsKKyAgICBjaGFyIHZ0eF9kdF9idWZbMTI4XSwgKnZ0eF9kdDsKKyAgICBjaGFyIGVkZ2VfZHRfYnVmWzEyOF0sICplZGdlX2R0OworICAgIGludCB3cml0ZV9idWZfc2l6ZTsKKworICAgIGFzc2VydCggQ1ZfSVNfR1JBUEgoZ3JhcGgpICk7CisgICAgdnR4X2NvdW50ID0gY3ZHcmFwaEdldFZ0eENvdW50KCBncmFwaCApOworICAgIGVkZ2VfY291bnQgPSBjdkdyYXBoR2V0RWRnZUNvdW50KCBncmFwaCApOworICAgIENWX0NBTEwoIGZsYWdfYnVmID0gKGludCopY3ZBbGxvYyggdnR4X2NvdW50KnNpemVvZihmbGFnX2J1ZlswXSkpKTsKKworICAgIC8vIGNvdW50IHZlcnRpY2VzCisgICAgY3ZTdGFydFJlYWRTZXEoIChDdlNlcSopZ3JhcGgsICZyZWFkZXIgKTsKKyAgICBmb3IoIGkgPSAwLCBrID0gMDsgaSA8IGdyYXBoLT50b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19TRVRfRUxFTSggcmVhZGVyLnB0ciApKQorICAgICAgICB7CisgICAgICAgICAgICBDdkdyYXBoVnR4KiB2dHggPSAoQ3ZHcmFwaFZ0eCopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgIGZsYWdfYnVmW2tdID0gdnR4LT5mbGFnczsKKyAgICAgICAgICAgIHZ0eC0+ZmxhZ3MgPSBrKys7CisgICAgICAgIH0KKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZ3JhcGgtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgLy8gd3JpdGUgaGVhZGVyCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9HUkFQSCApKTsKKworICAgIHNwcmludGYoIGJ1ZiwgIiUwOHgiLCBncmFwaC0+ZmxhZ3MgKTsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgImZsYWdzIiwgYnVmLCAxICk7CisKKyAgICBjdldyaXRlSW50KCBmcywgInZlcnRleF9jb3VudCIsIHZ0eF9jb3VudCApOworICAgIENWX0NBTEwoIHZ0eF9kdCA9IGljdkdldEZvcm1hdCggKEN2U2VxKilncmFwaCwgInZlcnRleF9kdCIsCisgICAgICAgICAgICAgICAgICAgICZhdHRyLCBzaXplb2YoQ3ZHcmFwaFZ0eCksIHZ0eF9kdF9idWYgKSk7CisgICAgaWYoIHZ0eF9kdCApCisgICAgICAgIGN2V3JpdGVTdHJpbmcoIGZzLCAidmVydGV4X2R0IiwgdnR4X2R0LCAwICk7CisKKyAgICBjdldyaXRlSW50KCBmcywgImVkZ2VfY291bnQiLCBlZGdlX2NvdW50ICk7CisgICAgQ1ZfQ0FMTCggZWRnZV9kdCA9IGljdkdldEZvcm1hdCggKEN2U2VxKilncmFwaC0+ZWRnZXMsICJlZGdlX2R0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF0dHIsIHNpemVvZihDdkdyYXBoRWRnZSksIGJ1ZiApKTsKKyAgICBzcHJpbnRmKCBlZGdlX2R0X2J1ZiwgIjJpZiVzIiwgZWRnZV9kdCA/IGVkZ2VfZHQgOiAiIiApOworICAgIGVkZ2VfZHQgPSBlZGdlX2R0X2J1ZjsKKyAgICBjdldyaXRlU3RyaW5nKCBmcywgImVkZ2VfZHQiLCBlZGdlX2R0LCAwICk7CisKKyAgICBDVl9DQUxMKCBpY3ZXcml0ZUhlYWRlckRhdGEoIGZzLCAoQ3ZTZXEqKWdyYXBoLCAmYXR0ciwgc2l6ZW9mKEN2R3JhcGgpICkpOworCisgICAgd3JpdGVfYnVmX3NpemUgPSBNQVgoIDMqZ3JhcGgtPmVsZW1fc2l6ZSwgMSA8PCAxNiApOworICAgIHdyaXRlX2J1Zl9zaXplID0gTUFYKCAzKmdyYXBoLT5lZGdlcy0+ZWxlbV9zaXplLCB3cml0ZV9idWZfc2l6ZSApOworICAgIENWX0NBTEwoIHdyaXRlX2J1ZiA9IChjaGFyKiljdkFsbG9jKCB3cml0ZV9idWZfc2l6ZSApKTsKKworICAgIC8vIGFzIHZlcnRpY2VzIGFuZCBlZGdlcyBhcmUgd3JpdHRlbiBpbiBzaW1pbGFyIHdheSwKKyAgICAvLyBkbyBpdCBhcyBhIHBhcmFtZXRyaXplZCAyLWl0ZXJhdGlvbiBsb29wCisgICAgZm9yKCBrID0gMDsgayA8IDI7IGsrKyApCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBkdCA9IGsgPT0gMCA/IHZ0eF9kdCA6IGVkZ2VfZHQ7CisgICAgICAgIGlmKCBkdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2U2V0KiBkYXRhID0gayA9PSAwID8gKEN2U2V0KilncmFwaCA6IGdyYXBoLT5lZGdlczsKKyAgICAgICAgICAgIGludCBlbGVtX3NpemUgPSBkYXRhLT5lbGVtX3NpemU7CisgICAgICAgICAgICBpbnQgd3JpdGVfZWxlbV9zaXplID0gaWN2Q2FsY0VsZW1TaXplKCBkdCwgMCApOworICAgICAgICAgICAgY2hhciogc3JjX3B0ciA9IHdyaXRlX2J1ZjsKKyAgICAgICAgICAgIGludCB3cml0ZV9tYXggPSB3cml0ZV9idWZfc2l6ZSAvIHdyaXRlX2VsZW1fc2l6ZSwgd3JpdGVfY291bnQgPSAwOworCisgICAgICAgICAgICAvLyBhbGlnbm1lbnQgb2YgdXNlciBwYXJ0IG9mIHRoZSBlZGdlIGRhdGEgZm9sbG93aW5nIDJpZgorICAgICAgICAgICAgaW50IGVkZ2VfdXNlcl9hbGlnbiA9IHNpemVvZihmbG9hdCk7CisKKyAgICAgICAgICAgIGlmKCBrID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBmbXRfcGFpcnNbQ1ZfRlNfTUFYX0ZNVF9QQUlSU10sIGZtdF9wYWlyX2NvdW50OworICAgICAgICAgICAgICAgIGZtdF9wYWlyX2NvdW50ID0gaWN2RGVjb2RlRm9ybWF0KCBkdCwgZm10X3BhaXJzLCBDVl9GU19NQVhfRk1UX1BBSVJTICk7CisgICAgICAgICAgICAgICAgaWYoIGZtdF9wYWlyX2NvdW50ID4gMiB8fCBDVl9FTEVNX1NJWkUoZm10X3BhaXJzWzIqMisxXSkgPj0gKGludClzaXplb2YoZG91YmxlKSkKKyAgICAgICAgICAgICAgICAgICAgZWRnZV91c2VyX2FsaWduID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIGsgPT0gMCA/ICJ2ZXJ0aWNlcyIgOiAiZWRnZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9OT0RFX1NFUSArIENWX05PREVfRkxPVyApOworICAgICAgICAgICAgY3ZTdGFydFJlYWRTZXEoIChDdlNlcSopZGF0YSwgJnJlYWRlciApOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRhdGEtPnRvdGFsOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBDVl9JU19TRVRfRUxFTSggcmVhZGVyLnB0ciApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGsgPT0gMCApIC8vIHZlcnRpY2VzCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHNyY19wdHIsIHJlYWRlci5wdHIgKyBzaXplb2YoQ3ZHcmFwaFZ0eCksIHdyaXRlX2VsZW1fc2l6ZSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2R3JhcGhFZGdlKiBlZGdlID0gKEN2R3JhcGhFZGdlKilyZWFkZXIucHRyOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ciA9IChjaGFyKiljdkFsaWduUHRyKCBzcmNfcHRyLCBzaXplb2YoaW50KSApOworICAgICAgICAgICAgICAgICAgICAgICAgKChpbnQqKXNyY19wdHIpWzBdID0gZWRnZS0+dnR4WzBdLT5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoaW50KilzcmNfcHRyKVsxXSA9IGVkZ2UtPnZ0eFsxXS0+ZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgICAgICAqKGZsb2F0Kikoc3JjX3B0ciArIHNpemVvZihpbnQpKjIpID0gZWRnZS0+d2VpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVsZW1fc2l6ZSA+IChpbnQpc2l6ZW9mKEN2R3JhcGhFZGdlKSApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogc3JjX3B0cjIgPSAoY2hhciopY3ZBbGlnblB0ciggc3JjX3B0ciArIDIqc2l6ZW9mKGludCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgc2l6ZW9mKGZsb2F0KSwgZWRnZV91c2VyX2FsaWduICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBzcmNfcHRyMiwgZWRnZSArIDEsIGVsZW1fc2l6ZSAtIHNpemVvZihDdkdyYXBoRWRnZSkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcmNfcHRyICs9IHdyaXRlX2VsZW1fc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICsrd3JpdGVfY291bnQgPj0gd3JpdGVfbWF4ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCB3cml0ZV9idWYsIHdyaXRlX2NvdW50LCBkdCApOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVfY291bnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc3JjX3B0ciA9IHdyaXRlX2J1ZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBkYXRhLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggd3JpdGVfY291bnQgPiAwICkKKyAgICAgICAgICAgICAgICBjdldyaXRlUmF3RGF0YSggZnMsIHdyaXRlX2J1Ziwgd3JpdGVfY291bnQsIGR0ICk7CisgICAgICAgICAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgICAgICB9CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIC8vIGZpbmFsIHN0YWdlLiByZXN0b3JlIHRoZSBncmFwaCBmbGFncworICAgIGN2U3RhcnRSZWFkU2VxKCAoQ3ZTZXEqKWdyYXBoLCAmcmVhZGVyICk7CisgICAgdnR4X2NvdW50ID0gMDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgZ3JhcGgtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX1NFVF9FTEVNKCByZWFkZXIucHRyICkpCisgICAgICAgICAgICAoKEN2R3JhcGhWdHgqKXJlYWRlci5wdHIpLT5mbGFncyA9IGZsYWdfYnVmW3Z0eF9jb3VudCsrXTsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggZ3JhcGgtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJndyaXRlX2J1ZiApOworICAgIGN2RnJlZSggJmZsYWdfYnVmICk7Cit9CisKKworc3RhdGljIHZvaWQqCitpY3ZSZWFkR3JhcGgoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlICkKK3sKKyAgICB2b2lkKiBwdHIgPSAwOworICAgIGNoYXIqIHJlYWRfYnVmID0gMDsKKyAgICBDdkdyYXBoVnR4KiogdnR4X2J1ZiA9IDA7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZSZWFkR3JhcGgiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkdyYXBoKiBncmFwaDsKKyAgICBDdkZpbGVOb2RlICpoZWFkZXJfbm9kZSwgKnZ0eF9ub2RlLCAqZWRnZV9ub2RlOworICAgIGludCBmbGFncywgdnR4X2NvdW50LCBlZGdlX2NvdW50OworICAgIGludCB2dHhfc2l6ZSA9IHNpemVvZihDdkdyYXBoVnR4KSwgZWRnZV9zaXplLCBoZWFkZXJfc2l6ZSA9IHNpemVvZihDdkdyYXBoKTsKKyAgICBpbnQgc3JjX3Z0eF9zaXplID0gMCwgc3JjX2VkZ2Vfc2l6ZTsKKyAgICBpbnQgZm10X3BhaXJzW0NWX0ZTX01BWF9GTVRfUEFJUlNdLCBmbXRfcGFpcl9jb3VudDsKKyAgICBpbnQgdnR4X2l0ZW1zX3Blcl9lbGVtID0gMCwgZWRnZV9pdGVtc19wZXJfZWxlbSA9IDA7CisgICAgaW50IGVkZ2VfdXNlcl9hbGlnbiA9IHNpemVvZihmbG9hdCk7CisgICAgaW50IHJlYWRfYnVmX3NpemU7CisgICAgaW50IGksIGs7CisgICAgY29uc3QgY2hhciogZmxhZ3Nfc3RyOworICAgIGNvbnN0IGNoYXIqIGhlYWRlcl9kdDsKKyAgICBjb25zdCBjaGFyKiB2dHhfZHQ7CisgICAgY29uc3QgY2hhciogZWRnZV9kdDsKKyAgICBjaGFyKiBlbmRwdHIgPSAwOworCisgICAgQ1ZfQ0FMTCggZmxhZ3Nfc3RyID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgbm9kZSwgImZsYWdzIiwgMCApKTsKKyAgICB2dHhfZHQgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAidmVydGV4X2R0IiwgMCApOworICAgIGVkZ2VfZHQgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAiZWRnZV9kdCIsIDAgKTsKKyAgICB2dHhfY291bnQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAidmVydGV4X2NvdW50IiwgLTEgKTsKKyAgICBlZGdlX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgImVkZ2VfY291bnQiLCAtMSApOworCisgICAgaWYoICFmbGFnc19zdHIgfHwgdnR4X2NvdW50ID09IC0xIHx8IGVkZ2VfY291bnQgPT0gLTEgfHwgIWVkZ2VfZHQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJTb21lIG9mIGVzc2VudGlhbCBzZXF1ZW5jZSBhdHRyaWJ1dGVzIGFyZSBhYnNlbnQiICk7CisKKyAgICBmbGFncyA9IChpbnQpc3RydG9sKCBmbGFnc19zdHIsICZlbmRwdHIsIDE2ICk7CisgICAgaWYoIGVuZHB0ciA9PSBmbGFnc19zdHIgfHwKKyAgICAgICAgKGZsYWdzICYgKENWX1NFUV9LSU5EX01BU0t8Q1ZfTUFHSUNfTUFTSykpICE9IChDVl9HUkFQSHxDVl9TRVRfTUFHSUNfVkFMKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiSW52YWxpZCBncmFwaCBzaWduYXR1cmUiICk7CisKKyAgICBoZWFkZXJfZHQgPSBjdlJlYWRTdHJpbmdCeU5hbWUoIGZzLCBub2RlLCAiaGVhZGVyX2R0IiwgMCApOworICAgIGhlYWRlcl9ub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGUsICJoZWFkZXJfdXNlcl9kYXRhIiApOworCisgICAgaWYoIChoZWFkZXJfZHQgIT0gMCkgXiAoaGVhZGVyX25vZGUgIT0gMCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsCisgICAgICAgICJPbmUgb2YgXCJoZWFkZXJfZHRcIiBhbmQgXCJoZWFkZXJfdXNlcl9kYXRhXCIgaXMgdGhlcmUsIHdoaWxlIHRoZSBvdGhlciBpcyBub3QiICk7CisKKyAgICBpZiggaGVhZGVyX2R0ICkKKyAgICAgICAgQ1ZfQ0FMTCggaGVhZGVyX3NpemUgPSBpY3ZDYWxjRWxlbVNpemUoIGhlYWRlcl9kdCwgaGVhZGVyX3NpemUgKSk7CisKKyAgICBpZiggdnR4X2R0ID4gMCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBzcmNfdnR4X3NpemUgPSBpY3ZDYWxjRWxlbVNpemUoIHZ0eF9kdCwgMCApKTsKKyAgICAgICAgQ1ZfQ0FMTCggdnR4X3NpemUgPSBpY3ZDYWxjRWxlbVNpemUoIHZ0eF9kdCwgdnR4X3NpemUgKSk7CisgICAgICAgIENWX0NBTEwoIGZtdF9wYWlyX2NvdW50ID0gaWN2RGVjb2RlRm9ybWF0KCBlZGdlX2R0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtdF9wYWlycywgQ1ZfRlNfTUFYX0ZNVF9QQUlSUyApKTsKKyAgICAgICAgZm10X3BhaXJfY291bnQgKj0gMjsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGZtdF9wYWlyX2NvdW50OyBpICs9IDIgKQorICAgICAgICAgICAgdnR4X2l0ZW1zX3Blcl9lbGVtICs9IGZtdF9wYWlyc1tpXTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIGNoYXIgZHN0X2VkZ2VfZHRfYnVmWzEyOF07CisgICAgICAgIGNvbnN0IGNoYXIqIGRzdF9lZGdlX2R0ID0gMDsKKworICAgICAgICBDVl9DQUxMKCBmbXRfcGFpcl9jb3VudCA9IGljdkRlY29kZUZvcm1hdCggZWRnZV9kdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbXRfcGFpcnMsIENWX0ZTX01BWF9GTVRfUEFJUlMgKSk7CisgICAgICAgIGlmKCBmbXRfcGFpcl9jb3VudCA8IDIgfHwKKyAgICAgICAgICAgIGZtdF9wYWlyc1swXSAhPSAyIHx8IGZtdF9wYWlyc1sxXSAhPSBDVl8zMlMgfHwKKyAgICAgICAgICAgIGZtdF9wYWlyc1syXSA8IDEgfHwgZm10X3BhaXJzWzNdICE9IENWXzMyRiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgIkdyYXBoIGVkZ2VzIHNob3VsZCBzdGFydCB3aXRoIDIgaW50ZWdlcnMgYW5kIGEgZmxvYXQiICk7CisKKyAgICAgICAgLy8gYWxpZ25tZW50IG9mIHVzZXIgcGFydCBvZiB0aGUgZWRnZSBkYXRhIGZvbGxvd2luZyAyaWYKKyAgICAgICAgaWYoIGZtdF9wYWlyX2NvdW50ID4gMiAmJiBDVl9FTEVNX1NJWkUoZm10X3BhaXJzWzVdKSA+PSAoaW50KXNpemVvZihkb3VibGUpKQorICAgICAgICAgICAgZWRnZV91c2VyX2FsaWduID0gc2l6ZW9mKGRvdWJsZSk7CisKKyAgICAgICAgZm10X3BhaXJfY291bnQgKj0gMjsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGZtdF9wYWlyX2NvdW50OyBpICs9IDIgKQorICAgICAgICAgICAgZWRnZV9pdGVtc19wZXJfZWxlbSArPSBmbXRfcGFpcnNbaV07CisKKyAgICAgICAgaWYoIGVkZ2VfZHRbMl0gPT0gJ2YnIHx8IChlZGdlX2R0WzJdID09ICcxJyAmJiBlZGdlX2R0WzNdID09ICdmJykgKQorICAgICAgICAgICAgZHN0X2VkZ2VfZHQgPSBlZGdlX2R0ICsgMyArIGlzZGlnaXQoZWRnZV9kdFsyXSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHZhbCA9IChpbnQpc3RydG9sKCBlZGdlX2R0ICsgMiwgJmVuZHB0ciwgMTAgKTsKKyAgICAgICAgICAgIHNwcmludGYoIGRzdF9lZGdlX2R0X2J1ZiwgIiVkZiVzIiwgdmFsLTEsIGVuZHB0ciApOworICAgICAgICAgICAgZHN0X2VkZ2VfZHQgPSBkc3RfZWRnZV9kdF9idWY7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBlZGdlX3NpemUgPSBpY3ZDYWxjRWxlbVNpemUoIGRzdF9lZGdlX2R0LCBzaXplb2YoQ3ZHcmFwaEVkZ2UpICkpOworICAgICAgICBDVl9DQUxMKCBzcmNfZWRnZV9zaXplID0gaWN2Q2FsY0VsZW1TaXplKCBlZGdlX2R0LCAwICkpOworICAgIH0KKworICAgIENWX0NBTEwoIGdyYXBoID0gY3ZDcmVhdGVHcmFwaCggZmxhZ3MsIGhlYWRlcl9zaXplLCB2dHhfc2l6ZSwgZWRnZV9zaXplLCBmcy0+ZHN0c3RvcmFnZSApKTsKKworICAgIGlmKCBoZWFkZXJfbm9kZSApCisgICAgICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGEoIGZzLCBoZWFkZXJfbm9kZSwgKGNoYXIqKWdyYXBoICsgc2l6ZW9mKEN2R3JhcGgpLCBoZWFkZXJfZHQgKSk7CisKKyAgICByZWFkX2J1Zl9zaXplID0gTUFYKCBzcmNfdnR4X3NpemUqMywgMSA8PCAxNiApOworICAgIHJlYWRfYnVmX3NpemUgPSBNQVgoIHNyY19lZGdlX3NpemUqMywgcmVhZF9idWZfc2l6ZSApOworICAgIENWX0NBTEwoIHJlYWRfYnVmID0gKGNoYXIqKWN2QWxsb2MoIHJlYWRfYnVmX3NpemUgKSk7CisgICAgQ1ZfQ0FMTCggdnR4X2J1ZiA9IChDdkdyYXBoVnR4KiopY3ZBbGxvYyggdnR4X2NvdW50ICogc2l6ZW9mKHZ0eF9idWZbMF0pICkpOworCisgICAgdnR4X25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInZlcnRpY2VzIiApOworICAgIGVkZ2Vfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAiZWRnZXMiICk7CisgICAgaWYoICFlZGdlX25vZGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiTm8gZWRnZXMgZGF0YSIgKTsKKyAgICBpZiggdnR4X2R0ICYmICF2dHhfbm9kZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJObyB2ZXJ0aWNlcyBkYXRhIiApOworCisgICAgLy8gYXMgdmVydGljZXMgYW5kIGVkZ2VzIGFyZSByZWFkIGluIHNpbWlsYXIgd2F5LAorICAgIC8vIGRvIGl0IGFzIGEgcGFyYW1ldHJpemVkIDItaXRlcmF0aW9uIGxvb3AKKyAgICBmb3IoIGsgPSAwOyBrIDwgMjsgaysrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIGR0ID0gayA9PSAwID8gdnR4X2R0IDogZWRnZV9kdDsKKyAgICAgICAgaW50IGVsZW1fc2l6ZSA9IGsgPT0gMCA/IHZ0eF9zaXplIDogZWRnZV9zaXplOworICAgICAgICBpbnQgc3JjX2VsZW1fc2l6ZSA9IGsgPT0gMCA/IHNyY192dHhfc2l6ZSA6IHNyY19lZGdlX3NpemU7CisgICAgICAgIGludCBpdGVtc19wZXJfZWxlbSA9IGsgPT0gMCA/IHZ0eF9pdGVtc19wZXJfZWxlbSA6IGVkZ2VfaXRlbXNfcGVyX2VsZW07CisgICAgICAgIGludCBlbGVtX2NvdW50ID0gayA9PSAwID8gdnR4X2NvdW50IDogZWRnZV9jb3VudDsKKyAgICAgICAgY2hhciogZHN0X3B0ciA9IHJlYWRfYnVmOworICAgICAgICBpbnQgcmVhZF9tYXggPSByZWFkX2J1Zl9zaXplIC9NQVgoc3JjX2VsZW1fc2l6ZSwgMSksIHJlYWRfY291bnQgPSAwOworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgICAgIGN2U3RhcnRSZWFkUmF3RGF0YSggZnMsIGsgPT0gMCA/IHZ0eF9ub2RlIDogZWRnZV9ub2RlLCAmcmVhZGVyICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGVsZW1fY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCByZWFkX2NvdW50ID09IDAgJiYgZHQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IE1JTiggZWxlbV9jb3VudCAtIGksIHJlYWRfbWF4ICkqaXRlbXNfcGVyX2VsZW07CisgICAgICAgICAgICAgICAgY3ZSZWFkUmF3RGF0YVNsaWNlKCBmcywgJnJlYWRlciwgY291bnQsIHJlYWRfYnVmLCBkdCApOworICAgICAgICAgICAgICAgIHJlYWRfY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgICAgICBkc3RfcHRyID0gcmVhZF9idWY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBrID09IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2R3JhcGhWdHgqIHZ0eDsKKyAgICAgICAgICAgICAgICBjdkdyYXBoQWRkVnR4KCBncmFwaCwgMCwgJnZ0eCApOworICAgICAgICAgICAgICAgIHZ0eF9idWZbaV0gPSB2dHg7CisgICAgICAgICAgICAgICAgaWYoIGR0ICkKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCB2dHggKyAxLCBkc3RfcHRyLCBzcmNfZWxlbV9zaXplICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZHcmFwaEVkZ2UqIGVkZ2UgPSAwOworICAgICAgICAgICAgICAgIGludCB2dHgxID0gKChpbnQqKWRzdF9wdHIpWzBdOworICAgICAgICAgICAgICAgIGludCB2dHgyID0gKChpbnQqKWRzdF9wdHIpWzFdOworICAgICAgICAgICAgICAgIGludCByZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBpZiggKHVuc2lnbmVkKXZ0eDEgPj0gKHVuc2lnbmVkKXZ0eF9jb3VudCB8fAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpdnR4MiA+PSAodW5zaWduZWQpdnR4X2NvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICJTb21lIG9mIHN0b3JlZCB2ZXJ0ZXggaW5kaWNlcyBhcmUgb3V0IG9mIHJhbmdlIiApOworCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggcmVzdWx0ID0gY3ZHcmFwaEFkZEVkZ2VCeVB0ciggZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgIHZ0eF9idWZbdnR4MV0sIHZ0eF9idWZbdnR4Ml0sIDAsICZlZGdlICkpOworCisgICAgICAgICAgICAgICAgaWYoIHJlc3VsdCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkR1cGxpY2F0ZWQgZWRnZSBoYXMgb2NjdXJlZCIgKTsKKworICAgICAgICAgICAgICAgIGVkZ2UtPndlaWdodCA9ICooZmxvYXQqKShkc3RfcHRyICsgc2l6ZW9mKGludCkqMik7CisgICAgICAgICAgICAgICAgaWYoIGVsZW1fc2l6ZSA+IChpbnQpc2l6ZW9mKEN2R3JhcGhFZGdlKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaGFyKiBkc3RfcHRyMiA9IChjaGFyKiljdkFsaWduUHRyKCBkc3RfcHRyICsgc2l6ZW9mKGludCkqMiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpLCBlZGdlX3VzZXJfYWxpZ24gKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBlZGdlICsgMSwgZHN0X3B0cjIsIGVsZW1fc2l6ZSAtIHNpemVvZihDdkdyYXBoRWRnZSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRzdF9wdHIgKz0gc3JjX2VsZW1fc2l6ZTsKKyAgICAgICAgICAgIHJlYWRfY291bnQtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB0ciA9IGdyYXBoOworCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnJlYWRfYnVmICk7CisgICAgY3ZGcmVlKCAmdnR4X2J1ZiApOworCisgICAgcmV0dXJuIHB0cjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUlRUSSBGdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitDdlR5cGVJbmZvICpDdlR5cGU6OmZpcnN0ID0gMCwgKkN2VHlwZTo6bGFzdCA9IDA7CisKK0N2VHlwZTo6Q3ZUeXBlKCBjb25zdCBjaGFyKiB0eXBlX25hbWUsCisgICAgICAgICAgICAgICAgQ3ZJc0luc3RhbmNlRnVuYyBpc19pbnN0YW5jZSwgQ3ZSZWxlYXNlRnVuYyByZWxlYXNlLAorICAgICAgICAgICAgICAgIEN2UmVhZEZ1bmMgcmVhZCwgQ3ZXcml0ZUZ1bmMgd3JpdGUsIEN2Q2xvbmVGdW5jIGNsb25lICkKK3sKKyAgICBDdlR5cGVJbmZvIF9pbmZvOworICAgIF9pbmZvLmZsYWdzID0gMDsKKyAgICBfaW5mby5oZWFkZXJfc2l6ZSA9IHNpemVvZihfaW5mbyk7CisgICAgX2luZm8udHlwZV9uYW1lID0gdHlwZV9uYW1lOworICAgIF9pbmZvLnByZXYgPSBfaW5mby5uZXh0ID0gMDsKKyAgICBfaW5mby5pc19pbnN0YW5jZSA9IGlzX2luc3RhbmNlOworICAgIF9pbmZvLnJlbGVhc2UgPSByZWxlYXNlOworICAgIF9pbmZvLmNsb25lID0gY2xvbmU7CisgICAgX2luZm8ucmVhZCA9IHJlYWQ7CisgICAgX2luZm8ud3JpdGUgPSB3cml0ZTsKKworICAgIGN2UmVnaXN0ZXJUeXBlKCAmX2luZm8gKTsKKyAgICBpbmZvID0gZmlyc3Q7Cit9CisKKworQ3ZUeXBlOjp+Q3ZUeXBlKCkKK3sKKyAgICBjdlVucmVnaXN0ZXJUeXBlKCBpbmZvLT50eXBlX25hbWUgKTsKK30KKworCitDdlR5cGUgc2VxX3R5cGUoIENWX1RZUEVfTkFNRV9TRVEsIGljdklzU2VxLCBpY3ZSZWxlYXNlU2VxLCBpY3ZSZWFkU2VxLAorICAgICAgICAgICAgICAgICBpY3ZXcml0ZVNlcVRyZWUgLyogdGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yCisgICAgICAgICAgICAgICAgIHdyaXRpbmcgYSBzaW5nbGUgc2VxdWVuY2UgdG9vICovLCBpY3ZDbG9uZVNlcSApOworCitDdlR5cGUgc2VxX3RyZWVfdHlwZSggQ1ZfVFlQRV9OQU1FX1NFUV9UUkVFLCBpY3ZJc1NlcSwgaWN2UmVsZWFzZVNlcSwKKyAgICAgICAgICAgICAgICAgICAgICBpY3ZSZWFkU2VxVHJlZSwgaWN2V3JpdGVTZXFUcmVlLCBpY3ZDbG9uZVNlcSApOworCitDdlR5cGUgc2VxX2dyYXBoX3R5cGUoIENWX1RZUEVfTkFNRV9HUkFQSCwgaWN2SXNHcmFwaCwgaWN2UmVsZWFzZUdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICBpY3ZSZWFkR3JhcGgsIGljdldyaXRlR3JhcGgsIGljdkNsb25lR3JhcGggKTsKKworQ3ZUeXBlIHNwYXJzZV9tYXRfdHlwZSggQ1ZfVFlQRV9OQU1FX1NQQVJTRV9NQVQsIGljdklzU3BhcnNlTWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgKEN2UmVsZWFzZUZ1bmMpY3ZSZWxlYXNlU3BhcnNlTWF0LCBpY3ZSZWFkU3BhcnNlTWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgaWN2V3JpdGVTcGFyc2VNYXQsIChDdkNsb25lRnVuYyljdkNsb25lU3BhcnNlTWF0ICk7CisKK0N2VHlwZSBpbWFnZV90eXBlKCBDVl9UWVBFX05BTUVfSU1BR0UsIGljdklzSW1hZ2UsIChDdlJlbGVhc2VGdW5jKWN2UmVsZWFzZUltYWdlLAorICAgICAgICAgICAgICAgICAgIGljdlJlYWRJbWFnZSwgaWN2V3JpdGVJbWFnZSwgKEN2Q2xvbmVGdW5jKWN2Q2xvbmVJbWFnZSApOworCitDdlR5cGUgbWF0X3R5cGUoIENWX1RZUEVfTkFNRV9NQVQsIGljdklzTWF0LCAoQ3ZSZWxlYXNlRnVuYyljdlJlbGVhc2VNYXQsCisgICAgICAgICAgICAgICAgIGljdlJlYWRNYXQsIGljdldyaXRlTWF0LCAoQ3ZDbG9uZUZ1bmMpY3ZDbG9uZU1hdCApOworCitDdlR5cGUgbWF0bmRfdHlwZSggQ1ZfVFlQRV9OQU1FX01BVE5ELCBpY3ZJc01hdE5ELCAoQ3ZSZWxlYXNlRnVuYyljdlJlbGVhc2VNYXRORCwKKyAgICAgICAgICAgICAgICAgICBpY3ZSZWFkTWF0TkQsIGljdldyaXRlTWF0TkQsIChDdkNsb25lRnVuYyljdkNsb25lTWF0TkQgKTsKKworQ1ZfSU1QTCAgdm9pZAorY3ZSZWdpc3RlclR5cGUoIGNvbnN0IEN2VHlwZUluZm8qIF9pbmZvICkKK3sKKyAgICBDVl9GVU5DTkFNRSgiY3ZSZWdpc3RlclR5cGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlR5cGVJbmZvKiBpbmZvID0gMDsKKyAgICBpbnQgaSwgbGVuOworICAgIGNoYXIgYzsKKworICAgIC8vaWYoICFDdlR5cGU6OmZpcnN0ICkKKyAgICAvLyAgICBpY3ZDcmVhdGVTdGFuZGFyZFR5cGVzKCk7CisKKyAgICBpZiggIV9pbmZvIHx8IF9pbmZvLT5oZWFkZXJfc2l6ZSAhPSBzaXplb2YoQ3ZUeXBlSW5mbykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkludmFsaWQgdHlwZSBpbmZvIiApOworCisgICAgaWYoICFfaW5mby0+aXNfaW5zdGFuY2UgfHwgIV9pbmZvLT5yZWxlYXNlIHx8CisgICAgICAgICFfaW5mby0+cmVhZCB8fCAhX2luZm8tPndyaXRlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsCisgICAgICAgICJTb21lIG9mIHJlcXVpcmVkIGZ1bmN0aW9uIHBvaW50ZXJzICIKKyAgICAgICAgIihpc19pbnN0YW5jZSwgcmVsZWFzZSwgcmVhZCBvciB3cml0ZSkgYXJlIE5VTEwiKTsKKworICAgIGMgPSBfaW5mby0+dHlwZV9uYW1lWzBdOworICAgIGlmKCAhaXNhbHBoYShjKSAmJiBjICE9ICdfJyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUeXBlIG5hbWUgc2hvdWxkIHN0YXJ0IHdpdGggYSBsZXR0ZXIgb3IgXyIgKTsKKworICAgIGxlbiA9IChpbnQpc3RybGVuKF9pbmZvLT50eXBlX25hbWUpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGMgPSBfaW5mby0+dHlwZV9uYW1lW2ldOworICAgICAgICBpZiggIWlzYWxudW0oYykgJiYgYyAhPSAnLScgJiYgYyAhPSAnXycgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUeXBlIG5hbWUgc2hvdWxkIGNvbnRhaW4gb25seSBsZXR0ZXJzLCBkaWdpdHMsIC0gYW5kIF8iICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggaW5mbyA9IChDdlR5cGVJbmZvKiljdkFsbG9jKCBzaXplb2YoKmluZm8pICsgbGVuICsgMSApKTsKKworICAgICppbmZvID0gKl9pbmZvOworICAgIGluZm8tPnR5cGVfbmFtZSA9IChjaGFyKikoaW5mbyArIDEpOworICAgIG1lbWNweSggKGNoYXIqKWluZm8tPnR5cGVfbmFtZSwgX2luZm8tPnR5cGVfbmFtZSwgbGVuICsgMSApOworCisgICAgaW5mby0+ZmxhZ3MgPSAwOworICAgIGluZm8tPm5leHQgPSBDdlR5cGU6OmZpcnN0OworICAgIGluZm8tPnByZXYgPSAwOworICAgIGlmKCBDdlR5cGU6OmZpcnN0ICkKKyAgICAgICAgQ3ZUeXBlOjpmaXJzdC0+cHJldiA9IGluZm87CisgICAgZWxzZQorICAgICAgICBDdlR5cGU6Omxhc3QgPSBpbmZvOworICAgIEN2VHlwZTo6Zmlyc3QgPSBpbmZvOworCisgICAgX19FTkRfXzsKK30KKworCitDVl9JTVBMIHZvaWQKK2N2VW5yZWdpc3RlclR5cGUoIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoImN2VW5yZWdpc3RlclR5cGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlR5cGVJbmZvKiBpbmZvOworCisgICAgQ1ZfQ0FMTCggaW5mbyA9IGN2RmluZFR5cGUoIHR5cGVfbmFtZSApKTsKKyAgICBpZiggaW5mbyApCisgICAgeworICAgICAgICBpZiggaW5mby0+cHJldiApCisgICAgICAgICAgICBpbmZvLT5wcmV2LT5uZXh0ID0gaW5mby0+bmV4dDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ3ZUeXBlOjpmaXJzdCA9IGluZm8tPm5leHQ7CisKKyAgICAgICAgaWYoIGluZm8tPm5leHQgKQorICAgICAgICAgICAgaW5mby0+bmV4dC0+cHJldiA9IGluZm8tPnByZXY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEN2VHlwZTo6bGFzdCA9IGluZm8tPnByZXY7CisKKyAgICAgICAgaWYoICFDdlR5cGU6OmZpcnN0IHx8ICFDdlR5cGU6Omxhc3QgKQorICAgICAgICAgICAgQ3ZUeXBlOjpmaXJzdCA9IEN2VHlwZTo6bGFzdCA9IDA7CisKKyAgICAgICAgY3ZGcmVlKCAmaW5mbyApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCBDdlR5cGVJbmZvKgorY3ZGaXJzdFR5cGUoIHZvaWQgKQoreworICAgIHJldHVybiBDdlR5cGU6OmZpcnN0OworfQorCisKK0NWX0lNUEwgQ3ZUeXBlSW5mbyoKK2N2RmluZFR5cGUoIGNvbnN0IGNoYXIqIHR5cGVfbmFtZSApCit7CisgICAgQ3ZUeXBlSW5mbyogaW5mbyA9IDA7CisKKyAgICBmb3IoIGluZm8gPSBDdlR5cGU6OmZpcnN0OyBpbmZvICE9IDA7IGluZm8gPSBpbmZvLT5uZXh0ICkKKyAgICAgICAgaWYoIHN0cmNtcCggaW5mby0+dHlwZV9uYW1lLCB0eXBlX25hbWUgKSA9PSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgcmV0dXJuIGluZm87Cit9CisKKworQ1ZfSU1QTCBDdlR5cGVJbmZvKgorY3ZUeXBlT2YoIGNvbnN0IHZvaWQqIHN0cnVjdF9wdHIgKQoreworICAgIEN2VHlwZUluZm8qIGluZm8gPSAwOworCisgICAgZm9yKCBpbmZvID0gQ3ZUeXBlOjpmaXJzdDsgaW5mbyAhPSAwOyBpbmZvID0gaW5mby0+bmV4dCApCisgICAgICAgIGlmKCBpbmZvLT5pc19pbnN0YW5jZSggc3RydWN0X3B0ciApKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICByZXR1cm4gaW5mbzsKK30KKworCisvKiB1bml2ZXJzYWwgZnVuY3Rpb25zICovCitDVl9JTVBMIHZvaWQKK2N2UmVsZWFzZSggdm9pZCoqIHN0cnVjdF9wdHIgKQoreworICAgIENWX0ZVTkNOQU1FKCJjdlJlbGVhc2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlR5cGVJbmZvKiBpbmZvOworCisgICAgaWYoICFzdHJ1Y3RfcHRyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGRvdWJsZSBwb2ludGVyIiApOworCisgICAgaWYoICpzdHJ1Y3RfcHRyICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGluZm8gPSBjdlR5cGVPZiggKnN0cnVjdF9wdHIgKSk7CisgICAgICAgIGlmKCAhaW5mbyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJVbmtub3duIG9iamVjdCB0eXBlIiApOworICAgICAgICBpZiggIWluZm8tPnJlbGVhc2UgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAicmVsZWFzZSBmdW5jdGlvbiBwb2ludGVyIGlzIE5VTEwiICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggaW5mby0+cmVsZWFzZSggc3RydWN0X3B0ciApKTsKKyAgICAgICAgKnN0cnVjdF9wdHIgPSAwOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCogY3ZDbG9uZSggY29uc3Qgdm9pZCogc3RydWN0X3B0ciApCit7CisgICAgdm9pZCogc3RydWN0X2NvcHkgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2Q2xvbmUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlR5cGVJbmZvKiBpbmZvOworCisgICAgaWYoICFzdHJ1Y3RfcHRyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHN0cnVjdHVyZSBwb2ludGVyIiApOworCisgICAgQ1ZfQ0FMTCggaW5mbyA9IGN2VHlwZU9mKCBzdHJ1Y3RfcHRyICkpOworICAgIGlmKCAhaW5mbyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlVua25vd24gb2JqZWN0IHR5cGUiICk7CisgICAgaWYoICFpbmZvLT5jbG9uZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgImNsb25lIGZ1bmN0aW9uIHBvaW50ZXIgaXMgTlVMTCIgKTsKKworICAgIENWX0NBTEwoIHN0cnVjdF9jb3B5ID0gaW5mby0+Y2xvbmUoIHN0cnVjdF9wdHIgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHN0cnVjdF9jb3B5OworfQorCisKKy8qIHJlYWRzIG1hdHJpeCwgaW1hZ2UsIHNlcXVlbmNlLCBncmFwaCBldGMuICovCitDVl9JTVBMIHZvaWQqCitjdlJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlLCBDdkF0dHJMaXN0KiBsaXN0ICkKK3sKKyAgICB2b2lkKiBvYmogPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlJlYWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9DSEVDS19GSUxFX1NUT1JBR0UoIGZzICk7CisKKyAgICBpZiggIW5vZGUgKQorICAgICAgICBFWElUOworCisgICAgaWYoICFDVl9OT0RFX0lTX1VTRVIobm9kZS0+dGFnKSB8fCAhbm9kZS0+aW5mbyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBub2RlIGRvZXMgbm90IHJlcHJlc2VudCBhIHVzZXIgb2JqZWN0ICh1bmtub3duIHR5cGU/KSIgKTsKKworICAgIENWX0NBTEwoIG9iaiA9IG5vZGUtPmluZm8tPnJlYWQoIGZzLCBub2RlICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBsaXN0ICkKKyAgICAgICAgKmxpc3QgPSBjdkF0dHJMaXN0KDAsMCk7CisKKyAgICByZXR1cm4gb2JqOworfQorCisKKy8qIHdyaXRlcyBtYXRyaXgsIGltYWdlLCBzZXF1ZW5jZSwgZ3JhcGggZXRjLiAqLworQ1ZfSU1QTCB2b2lkCitjdldyaXRlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSwKKyAgICAgICAgIGNvbnN0IHZvaWQqIHB0ciwgQ3ZBdHRyTGlzdCBhdHRyaWJ1dGVzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2V3JpdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlR5cGVJbmZvKiBpbmZvOworCisgICAgQ1ZfQ0hFQ0tfT1VUUFVUX0ZJTEVfU1RPUkFHRSggZnMgKTsKKworICAgIGlmKCAhcHRyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHBvaW50ZXIgdG8gdGhlIHdyaXR0ZW4gb2JqZWN0IiApOworCisgICAgQ1ZfQ0FMTCggaW5mbyA9IGN2VHlwZU9mKCBwdHIgKSk7CisgICAgaWYoICFpbmZvICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24gb2JqZWN0IiApOworCisgICAgaWYoICFpbmZvLT53cml0ZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgb2JqZWN0IGRvZXMgbm90IGhhdmUgd3JpdGUgZnVuY3Rpb24iICk7CisKKyAgICBDVl9DQUxMKCBpbmZvLT53cml0ZSggZnMsIG5hbWUsIHB0ciwgYXR0cmlidXRlcyApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLyogc2ltcGxlIEFQSSBmb3IgcmVhZGluZy93cml0aW5nIGRhdGEgKi8KK0NWX0lNUEwgdm9pZAorY3ZTYXZlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3Qgdm9pZCogc3RydWN0X3B0ciwKKyAgICAgICAgY29uc3QgY2hhciogX25hbWUsIGNvbnN0IGNoYXIqIGNvbW1lbnQsIEN2QXR0ckxpc3QgYXR0cmlidXRlcyApCit7CisgICAgQ3ZGaWxlU3RvcmFnZSogZnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlNhdmUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjaGFyIG5hbWVfYnVmW0NWX0ZTX01BWF9MRU4gKyAyNTZdOworICAgIGNoYXIqIG5hbWUgPSAoY2hhciopX25hbWU7CisKKyAgICBpZiggIXN0cnVjdF9wdHIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk5VTEwgb2JqZWN0IHBvaW50ZXIiICk7CisKKyAgICBDVl9DQUxMKCBmcyA9IGN2T3BlbkZpbGVTdG9yYWdlKCBmaWxlbmFtZSwgMCwgQ1ZfU1RPUkFHRV9XUklURSApKTsKKyAgICBpZiggIWZzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiQ291bGQgbm90IG9wZW4gdGhlIGZpbGUgc3RvcmFnZS4gQ2hlY2sgdGhlIHBhdGggYW5kIHBlcm1pc3Npb25zIiApOworCisgICAgaWYoICFuYW1lICkKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBzdHVibmFtZSA9ICJ1bm5hbWVkIjsKKyAgICAgICAgY29uc3QgY2hhciogcHRyMiA9IGZpbGVuYW1lICsgc3RybGVuKCBmaWxlbmFtZSApOworICAgICAgICBjb25zdCBjaGFyKiBwdHIgPSBwdHIyIC0gMTsKKworICAgICAgICB3aGlsZSggcHRyID49IGZpbGVuYW1lICYmICpwdHIgIT0gJ1xcJyAmJiAqcHRyICE9ICcvJyAmJiAqcHRyICE9ICc6JyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqcHRyID09ICcuJyAmJiAhKnB0cjIgKQorICAgICAgICAgICAgICAgIHB0cjIgPSBwdHI7CisgICAgICAgICAgICBwdHItLTsKKyAgICAgICAgfQorICAgICAgICBwdHIrKzsKKyAgICAgICAgaWYoIHB0ciA9PSBwdHIyICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGZpbGVuYW1lIiApOworCisgICAgICAgIG5hbWU9bmFtZV9idWY7CisKKyAgICAgICAgLy8gbmFtZSBtdXN0IHN0YXJ0IHdpdGggbGV0dGVyIG9yICdfJworICAgICAgICBpZiggIWlzYWxwaGEoKnB0cikgJiYgKnB0ciE9ICdfJyApeworICAgICAgICAgICAgKm5hbWUrKyA9ICdfJzsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlKCBwdHIgPCBwdHIyICkKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBjID0gKnB0cisrOworICAgICAgICAgICAgaWYoICFpc2FsbnVtKGMpICYmIGMgIT0gJy0nICYmIGMgIT0gJ18nICkKKyAgICAgICAgICAgICAgICBjID0gJ18nOworICAgICAgICAgICAgKm5hbWUrKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgKm5hbWUgPSAnXDAnOworICAgICAgICBuYW1lID0gbmFtZV9idWY7CisgICAgICAgIGlmKCBzdHJjbXAoIG5hbWUsICJfIiApID09IDAgKQorICAgICAgICAgICAgc3RyY3B5KCBuYW1lLCBzdHVibmFtZSApOworICAgIH0KKworICAgIGlmKCBjb21tZW50ICkKKyAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZUNvbW1lbnQoIGZzLCBjb21tZW50LCAwICkpOworICAgIENWX0NBTEwoIGN2V3JpdGUoIGZzLCBuYW1lLCBzdHJ1Y3RfcHRyLCBhdHRyaWJ1dGVzICkpOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZUZpbGVTdG9yYWdlKCAmZnMgKTsKK30KKworCitDVl9JTVBMIHZvaWQqCitjdkxvYWQoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBDdk1lbVN0b3JhZ2UqIG1lbXN0b3JhZ2UsCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqKiBfcmVhbF9uYW1lICkKK3sKKyAgICB2b2lkKiBwdHIgPSAwOworICAgIGNvbnN0IGNoYXIqIHJlYWxfbmFtZSA9IDA7CisgICAgQ3ZGaWxlU3RvcmFnZSogZnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdkxvYWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkZpbGVOb2RlKiBub2RlID0gMDsKKyAgICBDVl9DQUxMKCBmcyA9IGN2T3BlbkZpbGVTdG9yYWdlKCBmaWxlbmFtZSwgbWVtc3RvcmFnZSwgQ1ZfU1RPUkFHRV9SRUFEICkpOworCisgICAgaWYoICFmcyApCisgICAgICAgIEVYSVQ7CisKKyAgICBpZiggbmFtZSApCisgICAgeworICAgICAgICBDVl9DQUxMKCBub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIDAsIG5hbWUgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBpLCBrOworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZnMtPnJvb3RzLT50b3RhbDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZTZXEqIHNlcTsKKyAgICAgICAgICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgICAgICAgICAgbm9kZSA9IChDdkZpbGVOb2RlKiljdkdldFNlcUVsZW0oIGZzLT5yb290cywgayApOworICAgICAgICAgICAgaWYoICFDVl9OT0RFX0lTX01BUCggbm9kZS0+dGFnICkpCisgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgIHNlcSA9IG5vZGUtPmRhdGEuc2VxOworICAgICAgICAgICAgbm9kZSA9IDA7CisKKyAgICAgICAgICAgIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyZWFkZXIsIDAgKTsKKworICAgICAgICAgICAgLy8gZmluZCB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbWFwCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2VxLT50b3RhbDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggQ1ZfSVNfU0VUX0VMRU0oIHJlYWRlci5wdHIgKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUgPSAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgICAgICAgICAgZ290byBzdG9wX3NlYXJjaDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKK3N0b3Bfc2VhcmNoOgorICAgICAgICA7CisgICAgfQorCisgICAgaWYoICFub2RlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c09iamVjdE5vdEZvdW5kLCAiQ291bGQgbm90IGZpbmQgdGhlL2FuIG9iamVjdCBpbiBmaWxlIHN0b3JhZ2UiICk7CisKKyAgICByZWFsX25hbWUgPSBjdkdldEZpbGVOb2RlTmFtZSggbm9kZSApOworICAgIENWX0NBTEwoIHB0ciA9IGN2UmVhZCggZnMsIG5vZGUsIDAgKSk7CisKKyAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICBpZiggIW1lbXN0b3JhZ2UgJiYgKENWX0lTX1NFUSggcHRyICkgfHwgQ1ZfSVNfU0VUKCBwdHIgKSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwKKyAgICAgICAgIk5VTEwgbWVtb3J5IHN0b3JhZ2UgaXMgcGFzc2VkIC0gdGhlIGxvYWRlZCBkeW5hbWljIHN0cnVjdHVyZSBjYW4gbm90IGJlIHN0b3JlZCIgKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VGaWxlU3RvcmFnZSggJmZzICk7CisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZSggKHZvaWQqKikmcHRyICk7CisgICAgICAgIHJlYWxfbmFtZSA9IDA7CisgICAgfQorCisgICAgaWYoIF9yZWFsX25hbWUgKQorICAgICAgICAqX3JlYWxfbmFtZSA9IHJlYWxfbmFtZTsKKworICAgIHJldHVybiBwdHI7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeHByZWNvbXAuY3BwIGIvY3hjb3JlL3NyYy9jeHByZWNvbXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhN2IyZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4cHJlY29tcC5jcHAKQEAgLTAsMCArMSw0NCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeHJhbmQuY3BwIGIvY3hjb3JlL3NyYy9jeHJhbmQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MmJkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4cmFuZC5jcHAKQEAgLTAsMCArMSw2MDAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBGaWxsaW5nIEN2TWF0L0lwbEltYWdlIGluc3RhbmNlcyB3aXRoIHJhbmRvbSBudW1iZXJzCisvLworLy8gKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBGdW5jdGlvbnMgRGVjbGFyYXRpb24gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworLyoKKyAgIE11bHRpcGx5LXdpdGgtY2FycnkgZ2VuZXJhdG9yIGlzIHVzZWQgaGVyZToKKyAgIHRlbXAgPSAoIEEqWChuKSArIGNhcnJ5ICkKKyAgIFgobisxKSA9IHRlbXAgbW9kICgyXjMyKQorICAgY2FycnkgPSB0ZW1wIC8gKDJeMzIpCisqLworI2RlZmluZSAgSUNWX1JOR19ORVhUKHgpICAgICgodWludDY0KSh1bnNpZ25lZCkoeCkqMTU1NDExNTU1NCArICgoeCkgPj4gMzIpKQorI2RlZmluZSAgSUNWX0NWVF9GTFQoeCkgICAgICgoKHVuc2lnbmVkKSh4KSA+PiA5KXxDVl8xRikKKyNkZWZpbmUgIElDVl8xRCAgICAgICAgICAgICBDVl9CSUdfSU5UKDB4M0ZGMDAwMDAwMDAwMDAwMCkKKyNkZWZpbmUgIElDVl9DVlRfREJMKHgpICAgICAoKCh1aW50NjQpKHVuc2lnbmVkKSh4KSA8PCAyMCl8KCh4KSA+PiA0NCl8SUNWXzFEKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBzZXVkby1SYW5kb20gTnVtYmVyIEdlbmVyYXRvcnMgKFBSTkdzKSAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0lNUExfUkFORF9CSVRTKCBmbGF2b3IsIGFycnR5cGUsIGNhc3RfbWFjcm8gKSAgICAgICAgICAgICAgIFwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlJhbmRCaXRzXyMjZmxhdm9yIyNfQzFSKCBhcnJ0eXBlKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQqIHN0YXRlLCBjb25zdCBpbnQqIHBhcmFtICkgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50NjQgdGVtcCA9ICpzdGF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgc21hbGxfZmxhZyA9IChwYXJhbVsxMl18cGFyYW1bMTNdfHBhcmFtWzE0XXxwYXJhbVsxNV0pIDw9IDI1NTsgIFwKKyAgICBzdGVwIC89IHNpemVvZihhcnJbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgYXJyICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGksIGsgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY29uc3QgaW50KiBwID0gcGFyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFzbWFsbF9mbGFnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9ICgodW5zaWduZWQpdGVtcCAmIHBbaSArIDEyXSkgKyBwW2ldOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9ICgodW5zaWduZWQpdGVtcCAmIHBbaSArIDEzXSkgKyBwW2krMV07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaV0gPSBjYXN0X21hY3JvKChpbnQpdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSsxXSA9IGNhc3RfbWFjcm8oKGludCl0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9ICgodW5zaWduZWQpdGVtcCAmIHBbaSArIDE0XSkgKyBwW2krMl07ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9ICgodW5zaWduZWQpdGVtcCAmIHBbaSArIDE1XSkgKyBwW2krM107ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSsyXSA9IGNhc3RfbWFjcm8oKGludCl0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSszXSA9IGNhc3RfbWFjcm8oKGludCl0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggIS0tayApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgayA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcCAtPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc2l6ZS53aWR0aCAtIDQ7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB0MCwgdDEsIHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ID0gKHVuc2lnbmVkKXRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9ICh0ICYgcFtpICsgMTJdKSArIHBbaV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9ICgodCA+PiA4KSAmIHBbaSArIDEzXSkgKyBwW2krMV07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaV0gPSBjYXN0X21hY3JvKChpbnQpdDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSsxXSA9IGNhc3RfbWFjcm8oKGludCl0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MCA9ICgodCA+PiAxNikgJiBwW2kgKyAxNF0pICsgcFtpICsgMl07ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0MSA9ICgodCA+PiAyNCkgJiBwW2kgKyAxNV0pICsgcFtpICsgM107ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSsyXSA9IGNhc3RfbWFjcm8oKGludCl0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaSszXSA9IGNhc3RfbWFjcm8oKGludCl0MSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBpZiggIS0tayApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgayA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgcCAtPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCBzaXplLndpZHRoOyBpKysgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVuc2lnbmVkIHQwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHQwID0gKCh1bnNpZ25lZCl0ZW1wICYgcFtpICsgMTJdKSArIHBbaV07ICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFycltpXSA9IGNhc3RfbWFjcm8oKGludCl0MCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAqc3RhdGUgPSB0ZW1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9JTVBMX1JBTkQoIGZsYXZvciwgYXJydHlwZSwgd29ya3R5cGUsIGNhc3RfbWFjcm8xLCBjYXN0X21hY3JvMiApXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2UmFuZF8jI2ZsYXZvciMjX0MxUiggYXJydHlwZSogYXJyLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiBzdGF0ZSwgY29uc3QgZG91YmxlKiBwYXJhbSApICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVpbnQ2NCB0ZW1wID0gKnN0YXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAgLz0gc2l6ZW9mKGFyclswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBhcnIgKz0gc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgaSwgayA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjb25zdCBkb3VibGUqIHAgPSBwYXJhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgZjAsIGYxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQ3YzMnN1ZiB0MCwgdDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAudSA9IElDVl9DVlRfRkxUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEudSA9IElDVl9DVlRfRkxUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZjAgPSBjYXN0X21hY3JvMSggdDAuZiAqIHBbaSArIDEyXSArIHBbaV0gKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZjEgPSBjYXN0X21hY3JvMSggdDEuZiAqIHBbaSArIDEzXSArIHBbaSArIDFdICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyW2ldID0gY2FzdF9tYWNybzIoZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyW2krMV0gPSBjYXN0X21hY3JvMihmMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAudSA9IElDVl9DVlRfRkxUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDEudSA9IElDVl9DVlRfRkxUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZjAgPSBjYXN0X21hY3JvMSggdDAuZiAqIHBbaSArIDE0XSArIHBbaSArIDJdICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgZjEgPSBjYXN0X21hY3JvMSggdDEuZiAqIHBbaSArIDE1XSArIHBbaSArIDNdICk7ICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyW2krMl0gPSBjYXN0X21hY3JvMihmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyW2krM10gPSBjYXN0X21hY3JvMihmMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYoICEtLWsgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGsgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHAgLT0gMTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgZjA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQ3YzMnN1ZiB0MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdDAudSA9IElDVl9DVlRfRkxUKHRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZjAgPSBjYXN0X21hY3JvMSggdDAuZiAqIHBbaSArIDEyXSArIHBbaV0gKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYXJyW2ldID0gY2FzdF9tYWNybzIoZjApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICpzdGF0ZSA9IHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZSYW5kXzY0Zl9DMVIoIGRvdWJsZSogYXJyLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsCisgICAgICAgICAgICAgICAgIHVpbnQ2NCogc3RhdGUsIGNvbnN0IGRvdWJsZSogcGFyYW0gKQoreworICAgIHVpbnQ2NCB0ZW1wID0gKnN0YXRlOworICAgIHN0ZXAgLz0gc2l6ZW9mKGFyclswXSk7CisKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgYXJyICs9IHN0ZXAgKQorICAgIHsKKyAgICAgICAgaW50IGksIGsgPSAzOworICAgICAgICBjb25zdCBkb3VibGUqIHAgPSBwYXJhbTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNpemUud2lkdGggLSA0OyBpICs9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZjAsIGYxOworICAgICAgICAgICAgQ3Y2NHN1ZiB0MCwgdDE7CisKKyAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7CisgICAgICAgICAgICB0MC51ID0gSUNWX0NWVF9EQkwodGVtcCk7CisgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOworICAgICAgICAgICAgdDEudSA9IElDVl9DVlRfREJMKHRlbXApOworICAgICAgICAgICAgZjAgPSB0MC5mICogcFtpICsgMTJdICsgcFtpXTsKKyAgICAgICAgICAgIGYxID0gdDEuZiAqIHBbaSArIDEzXSArIHBbaSArIDFdOworICAgICAgICAgICAgYXJyW2ldID0gZjA7CisgICAgICAgICAgICBhcnJbaSsxXSA9IGYxOworCisgICAgICAgICAgICB0ZW1wID0gSUNWX1JOR19ORVhUKHRlbXApOworICAgICAgICAgICAgdDAudSA9IElDVl9DVlRfREJMKHRlbXApOworICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsKKyAgICAgICAgICAgIHQxLnUgPSBJQ1ZfQ1ZUX0RCTCh0ZW1wKTsKKyAgICAgICAgICAgIGYwID0gdDAuZiAqIHBbaSArIDE0XSArIHBbaSArIDJdOworICAgICAgICAgICAgZjEgPSB0MS5mICogcFtpICsgMTVdICsgcFtpICsgM107CisgICAgICAgICAgICBhcnJbaSsyXSA9IGYwOworICAgICAgICAgICAgYXJyW2krM10gPSBmMTsKKworICAgICAgICAgICAgaWYoICEtLWsgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGsgPSAzOworICAgICAgICAgICAgICAgIHAgLT0gMTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IHNpemUud2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBmMDsKKyAgICAgICAgICAgIEN2NjRzdWYgdDA7CisKKyAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7CisgICAgICAgICAgICB0MC51ID0gSUNWX0NWVF9EQkwodGVtcCk7CisgICAgICAgICAgICBmMCA9IHQwLmYgKiBwW2kgKyAxMl0gKyBwW2ldOworICAgICAgICAgICAgYXJyW2ldID0gZjA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdGUgPSB0ZW1wOworICAgIHJldHVybiBDVl9PSzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgIFRoZSBjb2RlIGJlbG93IGltcGxlbWVudHMgYWxnb3JpdGhtIGZyb20gdGhlIHBhcGVyOgorCisgICAgRy4gTWFyc2FnbGlhIGFuZCBXLlcuIFRzYW5nLAorICAgIFRoZSBNb250eSBQeXRob24gbWV0aG9kIGZvciBnZW5lcmF0aW5nIHJhbmRvbSB2YXJpYWJsZXMsCisgICAgQUNNIFRyYW5zYWN0aW9ucyBvbiBNYXRoZW1hdGljYWwgU29mdHdhcmUsIFZvbC4gMjQsIE5vLiAzLAorICAgIFBhZ2VzIDM0MS0zNTAsIFNlcHRlbWJlciwgMTk5OC4KK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMCitpY3ZSYW5kbl8wXzFfMzJmX0MxUiggZmxvYXQqIGFyciwgaW50IGxlbiwgdWludDY0KiBzdGF0ZSApCit7CisgICAgdWludDY0IHRlbXAgPSAqc3RhdGU7CisgICAgaW50IGk7CisgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgeCwgeSwgdiwgYXgsIGJ4OworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgeCA9ICgoaW50KXRlbXApKjEuMTY3MjM5ZS05OworICAgICAgICAgICAgdGVtcCA9IElDVl9STkdfTkVYVCh0ZW1wKTsKKyAgICAgICAgICAgIGF4ID0gZmFicyh4KTsKKyAgICAgICAgICAgIHYgPSAyLjg2NTggLSBheCooMi4wMjEzIC0gMC4zNjA1KmF4KTsKKyAgICAgICAgICAgIHkgPSAoKHVuc2lnbmVkKXRlbXApKjIuMzI4MzA2ZS0xMDsKKyAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7CisKKyAgICAgICAgICAgIGlmKCB5IDwgdiB8fCBheCA8IDEuMTc3NDEgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBieCA9IHg7CisgICAgICAgICAgICB4ID0gYnggPiAwID8gMC44ODU3OTEzKigyLjUwNjYyOCAtIGF4KSA6IC0wLjg4NTc5MTMqKDIuNTA2NjI4IC0gYXgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggeSA+IHYgKyAwLjA1MDYgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBpZiggbG9nKHkpIDwgLjY5MzE0NzIgLSAuNSpieCpieCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeCA9IGJ4OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggbG9nKDEuODg1NzkxMyAtIHkpIDwgLjU3MTg3MzMtLjUqeCp4ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2ID0gKChpbnQpdGVtcCkqNC42NTY2MTNlLTEwOworICAgICAgICAgICAgICAgIHggPSAtbG9nKGZhYnModikpKi4zOTg5NDIzOworICAgICAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7CisgICAgICAgICAgICAgICAgeSA9IC1sb2coKCh1bnNpZ25lZCl0ZW1wKSoyLjMyODMwNmUtMTApOworICAgICAgICAgICAgICAgIHRlbXAgPSBJQ1ZfUk5HX05FWFQodGVtcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggeSt5IDwgeCp4ICk7CisKKyAgICAgICAgICAgIHggPSB2ID4gMCA/IDIuNTA2NjI4ICsgeCA6IC0yLjUwNjYyOCAtIHg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGFycltpXSA9IChmbG9hdCl4OworICAgIH0KKyAgICAqc3RhdGUgPSB0ZW1wOworICAgIHJldHVybiBDVl9PSzsKK30KKworCisjZGVmaW5lIFJBTkRfQlVGX1NJWkUgIDk2CisKKworI2RlZmluZSBJQ1ZfSU1QTF9SQU5ETiggZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgY2FzdF9tYWNybzEsIGNhc3RfbWFjcm8yICkgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdlJhbmRuXyMjZmxhdm9yIyNfQzFSKCBhcnJ0eXBlKiBhcnIsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCogc3RhdGUsIGNvbnN0IGRvdWJsZSogcGFyYW0gKSAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmbG9hdCBidWZmZXJbUkFORF9CVUZfU0laRV07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0ZXAgLz0gc2l6ZW9mKGFyclswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgYXJyICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpLCBqLCBsZW4gPSBSQU5EX0JVRl9TSVpFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSArPSBSQU5EX0JVRl9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBrID0gMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY29uc3QgZG91YmxlKiBwID0gcGFyYW07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBpICsgbGVuID4gc2l6ZS53aWR0aCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGxlbiA9IHNpemUud2lkdGggLSBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGljdlJhbmRuXzBfMV8zMmZfQzFSKCBidWZmZXIsIGxlbiwgc3RhdGUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGxlbiAtIDQ7IGogKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIGYwLCBmMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmMCA9IGNhc3RfbWFjcm8xKCBidWZmZXJbal0qcFtqKzEyXSArIHBbal0gKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGYxID0gY2FzdF9tYWNybzEoIGJ1ZmZlcltqKzFdKnBbaisxM10gKyBwW2orMV0gKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJyW2kral0gPSBjYXN0X21hY3JvMihmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhcnJbaStqKzFdID0gY2FzdF9tYWNybzIoZjEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZjAgPSBjYXN0X21hY3JvMSggYnVmZmVyW2orMl0qcFtqKzE0XSArIHBbaisyXSApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBmMSA9IGNhc3RfbWFjcm8xKCBidWZmZXJbaiszXSpwW2orMTVdICsgcFtqKzNdICk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGFycltpK2orMl0gPSBjYXN0X21hY3JvMihmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJyW2kraiszXSA9IGNhc3RfbWFjcm8yKGYxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmKCAtLWsgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgayA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBwIC09IDEyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IoIDsgaiA8IGxlbjsgaisrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHdvcmt0eXBlIGYwID0gY2FzdF9tYWNybzEoIGJ1ZmZlcltqXSpwW2orMTJdICsgcFtqXSApOyAgICAgICAgICBcCisgICAgICAgICAgICAgICAgYXJyW2kral0gPSBjYXN0X21hY3JvMihmMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworSUNWX0lNUExfUkFORF9CSVRTKCA4dSwgdWNoYXIsIENWX0NBU1RfOFUgKQorSUNWX0lNUExfUkFORF9CSVRTKCAxNnUsIHVzaG9ydCwgQ1ZfQ0FTVF8xNlUgKQorSUNWX0lNUExfUkFORF9CSVRTKCAxNnMsIHNob3J0LCBDVl9DQVNUXzE2UyApCitJQ1ZfSU1QTF9SQU5EX0JJVFMoIDMycywgaW50LCBDVl9DQVNUXzMyUyApCisKK0lDVl9JTVBMX1JBTkQoIDh1LCB1Y2hhciwgaW50LCBjdkZsb29yLCBDVl9DQVNUXzhVICkKK0lDVl9JTVBMX1JBTkQoIDE2dSwgdXNob3J0LCBpbnQsIGN2Rmxvb3IsIENWX0NBU1RfMTZVICkKK0lDVl9JTVBMX1JBTkQoIDE2cywgc2hvcnQsIGludCwgY3ZGbG9vciwgQ1ZfQ0FTVF8xNlMgKQorSUNWX0lNUExfUkFORCggMzJzLCBpbnQsIGludCwgY3ZGbG9vciwgQ1ZfQ0FTVF8zMlMgKQorSUNWX0lNUExfUkFORCggMzJmLCBmbG9hdCwgZmxvYXQsIENWX0NBU1RfMzJGLCBDVl9OT1AgKQorCitJQ1ZfSU1QTF9SQU5ETiggOHUsIHVjaGFyLCBpbnQsIGN2Um91bmQsIENWX0NBU1RfOFUgKQorSUNWX0lNUExfUkFORE4oIDE2dSwgdXNob3J0LCBpbnQsIGN2Um91bmQsIENWX0NBU1RfMTZVICkKK0lDVl9JTVBMX1JBTkROKCAxNnMsIHNob3J0LCBpbnQsIGN2Um91bmQsIENWX0NBU1RfMTZTICkKK0lDVl9JTVBMX1JBTkROKCAzMnMsIGludCwgaW50LCBjdlJvdW5kLCBDVl9DQVNUXzMyUyApCitJQ1ZfSU1QTF9SQU5ETiggMzJmLCBmbG9hdCwgZmxvYXQsIENWX0NBU1RfMzJGLCBDVl9OT1AgKQorSUNWX0lNUExfUkFORE4oIDY0ZiwgZG91YmxlLCBkb3VibGUsIENWX0NBU1RfNjRGLCBDVl9OT1AgKQorCitzdGF0aWMgdm9pZCBpY3ZJbml0UmFuZFRhYmxlKCBDdkZ1bmNUYWJsZSogZmFzdHJuZ190YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdkZ1bmNUYWJsZSogcm5nX3RhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2RnVuY1RhYmxlKiBub3JtYWxfdGFiICkKK3sKKyAgICBmYXN0cm5nX3RhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdlJhbmRCaXRzXzh1X0MxUjsKKyAgICBmYXN0cm5nX3RhYi0+Zm5fMmRbQ1ZfOFNdID0gMDsKKyAgICBmYXN0cm5nX3RhYi0+Zm5fMmRbQ1ZfMTZVXSA9ICh2b2lkKilpY3ZSYW5kQml0c18xNnVfQzFSOworICAgIGZhc3RybmdfdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdlJhbmRCaXRzXzE2c19DMVI7CisgICAgZmFzdHJuZ190YWItPmZuXzJkW0NWXzMyU10gPSAodm9pZCopaWN2UmFuZEJpdHNfMzJzX0MxUjsKKworICAgIHJuZ190YWItPmZuXzJkW0NWXzhVXSA9ICh2b2lkKilpY3ZSYW5kXzh1X0MxUjsKKyAgICBybmdfdGFiLT5mbl8yZFtDVl84U10gPSAwOworICAgIHJuZ190YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmFuZF8xNnVfQzFSOworICAgIHJuZ190YWItPmZuXzJkW0NWXzE2U10gPSAodm9pZCopaWN2UmFuZF8xNnNfQzFSOworICAgIHJuZ190YWItPmZuXzJkW0NWXzMyU10gPSAodm9pZCopaWN2UmFuZF8zMnNfQzFSOworICAgIHJuZ190YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2UmFuZF8zMmZfQzFSOworICAgIHJuZ190YWItPmZuXzJkW0NWXzY0Rl0gPSAodm9pZCopaWN2UmFuZF82NGZfQzFSOworCisgICAgbm9ybWFsX3RhYi0+Zm5fMmRbQ1ZfOFVdID0gKHZvaWQqKWljdlJhbmRuXzh1X0MxUjsKKyAgICBub3JtYWxfdGFiLT5mbl8yZFtDVl84U10gPSAwOworICAgIG5vcm1hbF90YWItPmZuXzJkW0NWXzE2VV0gPSAodm9pZCopaWN2UmFuZG5fMTZ1X0MxUjsKKyAgICBub3JtYWxfdGFiLT5mbl8yZFtDVl8xNlNdID0gKHZvaWQqKWljdlJhbmRuXzE2c19DMVI7CisgICAgbm9ybWFsX3RhYi0+Zm5fMmRbQ1ZfMzJTXSA9ICh2b2lkKilpY3ZSYW5kbl8zMnNfQzFSOworICAgIG5vcm1hbF90YWItPmZuXzJkW0NWXzMyRl0gPSAodm9pZCopaWN2UmFuZG5fMzJmX0MxUjsKKyAgICBub3JtYWxfdGFiLT5mbl8yZFtDVl82NEZdID0gKHZvaWQqKWljdlJhbmRuXzY0Zl9DMVI7Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlJhbmRBcnIoIEN2Uk5HKiBybmcsIEN2QXJyKiBhcnIsIGludCBkaXN0dHlwZSwgQ3ZTY2FsYXIgcGFyYW0xLCBDdlNjYWxhciBwYXJhbTIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBybmdfdGFiWzJdLCBmYXN0cm5nX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlJhbmRBcnIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaXNfbmQgPSAwOworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKyAgICBpbnQgdHlwZSwgZGVwdGgsIGNoYW5uZWxzOworICAgIGRvdWJsZSBkcGFyYW1bMl1bMTJdOworICAgIGludCBpcGFyYW1bMl1bMTJdOworICAgIHZvaWQqIHBhcmFtID0gZHBhcmFtOworICAgIGludCBpLCBmYXN0X2ludF9tb2RlID0gMDsKKyAgICBpbnQgbWF0X3N0ZXAgPSAwOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2RnVuYzJEXzFBMlAgZnVuYyA9IDA7CisgICAgQ3ZNYXRORCBzdHViX25kOworICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3Jfc3RhdGUsICppdGVyYXRvciA9IDA7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFJhbmRUYWJsZSggJmZhc3RybmdfdGFiLCAmcm5nX3RhYltDVl9SQU5EX1VOSV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICZybmdfdGFiW0NWX1JBTkRfTk9STUFMXSApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIXJuZyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBwb2ludGVyIHRvIFJORyBzdGF0ZSIgKTsKKworICAgIGlmKCBDVl9JU19NQVRORChtYXQpICkKKyAgICB7CisgICAgICAgIGl0ZXJhdG9yID0gJml0ZXJhdG9yX3N0YXRlOworICAgICAgICBDVl9DQUxMKCBjdkluaXROQXJyYXlJdGVyYXRvciggMSwgJmFyciwgMCwgJnN0dWJfbmQsIGl0ZXJhdG9yICkpOworICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaXRlcmF0b3ItPmhkclswXS0+dHlwZSk7CisgICAgICAgIHNpemUgPSBpdGVyYXRvci0+c2l6ZTsKKyAgICAgICAgaXNfbmQgPSAxOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChtYXQpKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY29pID0gMDsKKyAgICAgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViLCAmY29pICkpOworCisgICAgICAgICAgICBpZiggY29pICE9IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9CYWRDT0ksICJDT0kgaXMgbm90IHN1cHBvcnRlZCIgKTsKKyAgICAgICAgfQorCisgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRSggbWF0LT50eXBlICk7CisgICAgICAgIHNpemUgPSBjdkdldE1hdFNpemUoIG1hdCApOworICAgICAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKworICAgICAgICBpZiggbWF0LT5oZWlnaHQgPiAxICYmIENWX0lTX01BVF9DT05UKCBtYXQtPnR5cGUgKSkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZS53aWR0aCAqPSBzaXplLmhlaWdodDsKKyAgICAgICAgICAgIG1hdF9zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgZGVwdGggPSBDVl9NQVRfREVQVEgoIHR5cGUgKTsKKyAgICBjaGFubmVscyA9IENWX01BVF9DTiggdHlwZSApOworICAgIHNpemUud2lkdGggKj0gY2hhbm5lbHM7CisKKyAgICBpZiggZGlzdHR5cGUgPT0gQ1ZfUkFORF9VTkkgKQorICAgIHsKKyAgICAgICAgaWYoIGRlcHRoIDw9IENWXzMyUyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDAsIGZhc3RfaW50X21vZGUgPSAxOyBpIDwgY2hhbm5lbHM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gaXBhcmFtWzBdW2ldID0gY3ZDZWlsKCBwYXJhbTEudmFsW2ldICk7CisgICAgICAgICAgICAgICAgaW50IHQxID0gaXBhcmFtWzFdW2ldID0gY3ZGbG9vciggcGFyYW0yLnZhbFtpXSApIC0gdDA7CisgICAgICAgICAgICAgICAgZG91YmxlIGRpZmYgPSBwYXJhbTEudmFsW2ldIC0gcGFyYW0yLnZhbFtpXTsKKworICAgICAgICAgICAgICAgIGZhc3RfaW50X21vZGUgJj0gSU5UX01JTiA8PSBkaWZmICYmIGRpZmYgPD0gSU5UX01BWCAmJiAodDEgJiAodDEgLSAxKSkgPT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBmYXN0X2ludF9tb2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKysgKQorICAgICAgICAgICAgICAgIGlwYXJhbVsxXVtpXS0tOworICAgICAgICAKKyAgICAgICAgICAgIGZvciggOyBpIDwgMTI7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHQwID0gaXBhcmFtWzBdW2kgLSBjaGFubmVsc107CisgICAgICAgICAgICAgICAgaW50IHQxID0gaXBhcmFtWzFdW2kgLSBjaGFubmVsc107CisKKyAgICAgICAgICAgICAgICBpcGFyYW1bMF1baV0gPSB0MDsKKyAgICAgICAgICAgICAgICBpcGFyYW1bMV1baV0gPSB0MTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ1ZfR0VUX0ZVTkNfUFRSKCBmdW5jLCAoQ3ZGdW5jMkRfMUEyUCkoZmFzdHJuZ190YWIuZm5fMmRbZGVwdGhdKSk7CisgICAgICAgICAgICBwYXJhbSA9IGlwYXJhbTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdDAgPSBwYXJhbTEudmFsW2ldOworICAgICAgICAgICAgICAgIGRvdWJsZSB0MSA9IHBhcmFtMi52YWxbaV07CisKKyAgICAgICAgICAgICAgICBkcGFyYW1bMF1baV0gPSB0MCAtICh0MSAtIHQwKTsKKyAgICAgICAgICAgICAgICBkcGFyYW1bMV1baV0gPSB0MSAtIHQwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsIChDdkZ1bmMyRF8xQTJQKShybmdfdGFiWzBdLmZuXzJkW2RlcHRoXSkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYoIGRpc3R0eXBlID09IENWX1JBTkRfTk9STUFMICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gcGFyYW0xLnZhbFtpXTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IHBhcmFtMi52YWxbaV07CisKKyAgICAgICAgICAgIGRwYXJhbVswXVtpXSA9IHQwOworICAgICAgICAgICAgZHBhcmFtWzFdW2ldID0gdDE7CisgICAgICAgIH0KKworICAgICAgICBDVl9HRVRfRlVOQ19QVFIoIGZ1bmMsIChDdkZ1bmMyRF8xQTJQKShybmdfdGFiWzFdLmZuXzJkW2RlcHRoXSkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93biBkaXN0cmlidXRpb24gdHlwZSIgKTsKKyAgICB9CisKKyAgICBpZiggIWZhc3RfaW50X21vZGUgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gY2hhbm5lbHM7IGkgPCAxMjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gZHBhcmFtWzBdW2kgLSBjaGFubmVsc107CisgICAgICAgICAgICBkb3VibGUgdDEgPSBkcGFyYW1bMV1baSAtIGNoYW5uZWxzXTsKKworICAgICAgICAgICAgZHBhcmFtWzBdW2ldID0gdDA7CisgICAgICAgICAgICBkcGFyYW1bMV1baV0gPSB0MTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCAhaXNfbmQgKQorICAgIHsKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSwgcm5nLCBwYXJhbSApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci0+cHRyWzBdLCBDVl9TVFVCX1NURVAsIHNpemUsIHJuZywgcGFyYW0gKSk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoIGN2TmV4dE5BcnJheVNsaWNlKCBpdGVyYXRvciApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL2N4Y29yZS9zcmMvY3hzdW1waXhlbHMuY3BwIGIvY3hjb3JlL3NyYy9jeHN1bXBpeGVscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0NTE3YQotLS0gL2Rldi9udWxsCisrKyBiL2N4Y29yZS9zcmMvY3hzdW1waXhlbHMuY3BwCkBAIC0wLDAgKzEsMTAxNSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfY3hjb3JlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZCBzdW0gb2YgcGl4ZWxzIGluIHRoZSBST0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfU1VNX0NPSV9DQVNFKCBfX29wX18sIGxlbiwgY24gKSAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDw9IChsZW4pIC0gNCooY24pOyB4ICs9IDQqKGNuKSApICAgICAgICAgICAgICAgXAorICAgICAgICBzMCArPSBfX29wX18oc3JjW3hdKSArIF9fb3BfXyhzcmNbeCsoY24pXSkgKyAgICAgICAgXAorICAgICAgICAgICAgICBfX29wX18oc3JjW3grKGNuKSoyXSkgKyBfX29wX18oc3JjW3grKGNuKSozXSk7XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyB4IDwgKGxlbik7IHggKz0gKGNuKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzMCArPSBfX29wX18oc3JjW3hdKTsKKworCisjZGVmaW5lIElDVl9TVU1fQ0FTRV9DMSggX19vcF9fLCBsZW4gKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9DT0lfQ0FTRSggX19vcF9fLCBsZW4sIDEgKQorCisKKyNkZWZpbmUgSUNWX1NVTV9DQVNFX0MyKCBfX29wX18sIGxlbiApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8PSAobGVuKSAtIDg7IHggKz0gOCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczAgKz0gX19vcF9fKHNyY1t4XSkgKyBfX29wX18oc3JjW3grMl0pICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzRdKSArIF9fb3BfXyhzcmNbeCs2XSk7ICAgICAgICAgIFwKKyAgICAgICAgczEgKz0gX19vcF9fKHNyY1t4KzFdKSArIF9fb3BfXyhzcmNbeCszXSkgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzVdKSArIF9fb3BfXyhzcmNbeCs3XSk7ICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4ICs9IDIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczAgKz0gX19vcF9fKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczEgKz0gX19vcF9fKHNyY1t4KzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworCisjZGVmaW5lIElDVl9TVU1fQ0FTRV9DMyggX19vcF9fLCBsZW4gKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPD0gKGxlbikgLSAxMjsgeCArPSAxMiApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICs9IF9fb3BfXyhzcmNbeF0pICsgX19vcF9fKHNyY1t4KzNdKSArICAgICAgICAgICBcCisgICAgICAgICAgICAgIF9fb3BfXyhzcmNbeCs2XSkgKyBfX29wX18oc3JjW3grOV0pOyAgICAgICAgICBcCisgICAgICAgIHMxICs9IF9fb3BfXyhzcmNbeCsxXSkgKyBfX29wX18oc3JjW3grNF0pICsgICAgICAgICBcCisgICAgICAgICAgICAgIF9fb3BfXyhzcmNbeCs3XSkgKyBfX29wX18oc3JjW3grMTBdKTsgICAgICAgICBcCisgICAgICAgIHMyICs9IF9fb3BfXyhzcmNbeCsyXSkgKyBfX29wX18oc3JjW3grNV0pICsgICAgICAgICBcCisgICAgICAgICAgICAgIF9fb3BfXyhzcmNbeCs4XSkgKyBfX29wX18oc3JjW3grMTFdKTsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHggPCAobGVuKTsgeCArPSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMwICs9IF9fb3BfXyhzcmNbeF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMxICs9IF9fb3BfXyhzcmNbeCsxXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHMyICs9IF9fb3BfXyhzcmNbeCsyXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgSUNWX1NVTV9DQVNFX0M0KCBfX29wX18sIGxlbiApICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8PSAobGVuKSAtIDE2OyB4ICs9IDE2ICkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczAgKz0gX19vcF9fKHNyY1t4XSkgKyBfX29wX18oc3JjW3grNF0pICsgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzhdKSArIF9fb3BfXyhzcmNbeCsxMl0pOyAgICAgICAgIFwKKyAgICAgICAgczEgKz0gX19vcF9fKHNyY1t4KzFdKSArIF9fb3BfXyhzcmNbeCs1XSkgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzldKSArIF9fb3BfXyhzcmNbeCsxM10pOyAgICAgICAgIFwKKyAgICAgICAgczIgKz0gX19vcF9fKHNyY1t4KzJdKSArIF9fb3BfXyhzcmNbeCs2XSkgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzEwXSkgKyBfX29wX18oc3JjW3grMTRdKTsgICAgICAgIFwKKyAgICAgICAgczMgKz0gX19vcF9fKHNyY1t4KzNdKSArIF9fb3BfXyhzcmNbeCs3XSkgKyAgICAgICAgIFwKKyAgICAgICAgICAgICAgX19vcF9fKHNyY1t4KzExXSkgKyBfX29wX18oc3JjW3grMTVdKTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgeCA8IChsZW4pOyB4ICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczAgKz0gX19vcF9fKHNyY1t4XSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczEgKz0gX19vcF9fKHNyY1t4KzFdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczIgKz0gX19vcF9fKHNyY1t4KzJdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgczMgKz0gX19vcF9fKHNyY1t4KzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZW50cnkgbWFjcm9zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9DT01NT04oKSAgICAgICAgICBcCisgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKQorCisjZGVmaW5lIElDVl9TVU1fRU5UUllfQzEoIHN1bXR5cGUgKSAgICAgXAorICAgIHN1bXR5cGUgczAgPSAwOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0NPTU1PTigpCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9DMiggc3VtdHlwZSApICAgICBcCisgICAgc3VtdHlwZSBzMCA9IDAsIHMxID0gMDsgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRU5UUllfQ09NTU9OKCkKKworI2RlZmluZSBJQ1ZfU1VNX0VOVFJZX0MzKCBzdW10eXBlICkgICAgIFwKKyAgICBzdW10eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDA7ICAgICBcCisgICAgSUNWX1NVTV9FTlRSWV9DT01NT04oKQorCisjZGVmaW5lIElDVl9TVU1fRU5UUllfQzQoIHN1bXR5cGUgKSAgICAgICAgIFwKKyAgICBzdW10eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsgXAorICAgIElDVl9TVU1fRU5UUllfQ09NTU9OKCkKKworCisjZGVmaW5lIElDVl9TVU1fRU5UUllfQkxPQ0tfQ09NTU9OKCBibG9ja19zaXplICkgICAgXAorICAgIGludCByZW1haW5pbmcgPSBibG9ja19zaXplOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0NPTU1PTigpCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9CTE9DS19DMSggc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSBcCisgICAgc3VtdHlwZSBzdW0wID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9CTE9DS19DMiggc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSBcCisgICAgc3VtdHlwZSBzdW0wID0gMCwgc3VtMSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMCwgczEgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9CTE9DS19DMyggc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSBcCisgICAgc3VtdHlwZSBzdW0wID0gMCwgc3VtMSA9IDAsIHN1bTIgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKyNkZWZpbmUgSUNWX1NVTV9FTlRSWV9CTE9DS19DNCggc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSBcCisgICAgc3VtdHlwZSBzdW0wID0gMCwgc3VtMSA9IDAsIHN1bTIgPSAwLCBzdW0zID0gMDsgICAgICAgICAgICAgXAorICAgIHdvcmt0eXBlIHMwID0gMCwgczEgPSAwLCBzMiA9IDAsIHMzID0gMDsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0JMT0NLX0NPTU1PTiggYmxvY2tfc2l6ZSApCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGV4aXQgbWFjcm9zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyNkZWZpbmUgSUNWX1NVTV9FWElUX0MxKCB0bXAsIHN1bXR5cGUgKSAgICAgXAorICAgIHN1bVswXSA9IChzdW10eXBlKXRtcCMjMAorCisjZGVmaW5lIElDVl9TVU1fRVhJVF9DMiggdG1wLCBzdW10eXBlICkgICAgIFwKKyAgICBzdW1bMF0gPSAoc3VtdHlwZSl0bXAjIzA7ICAgICAgICAgICAgICAgXAorICAgIHN1bVsxXSA9IChzdW10eXBlKXRtcCMjMTsKKworI2RlZmluZSBJQ1ZfU1VNX0VYSVRfQzMoIHRtcCwgc3VtdHlwZSApICAgICBcCisgICAgc3VtWzBdID0gKHN1bXR5cGUpdG1wIyMwOyAgICAgICAgICAgICAgIFwKKyAgICBzdW1bMV0gPSAoc3VtdHlwZSl0bXAjIzE7ICAgICAgICAgICAgICAgXAorICAgIHN1bVsyXSA9IChzdW10eXBlKXRtcCMjMjsKKworI2RlZmluZSBJQ1ZfU1VNX0VYSVRfQzQoIHRtcCwgc3VtdHlwZSApICAgICBcCisgICAgc3VtWzBdID0gKHN1bXR5cGUpdG1wIyMwOyAgICAgICAgICAgICAgIFwKKyAgICBzdW1bMV0gPSAoc3VtdHlwZSl0bXAjIzE7ICAgICAgICAgICAgICAgXAorICAgIHN1bVsyXSA9IChzdW10eXBlKXRtcCMjMjsgICAgICAgICAgICAgICBcCisgICAgc3VtWzNdID0gKHN1bXR5cGUpdG1wIyMzOworCisjZGVmaW5lIElDVl9TVU1fRVhJVF9CTE9DS19DMSggc3VtdHlwZSApICAgIFwKKyAgICBzdW0wICs9IHMwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRVhJVF9DMSggc3VtLCBzdW10eXBlICkKKworI2RlZmluZSBJQ1ZfU1VNX0VYSVRfQkxPQ0tfQzIoIHN1bXR5cGUgKSAgICBcCisgICAgc3VtMCArPSBzMDsgc3VtMSArPSBzMTsgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VYSVRfQzIoIHN1bSwgc3VtdHlwZSApCisKKyNkZWZpbmUgSUNWX1NVTV9FWElUX0JMT0NLX0MzKCBzdW10eXBlICkgICAgXAorICAgIHN1bTAgKz0gczA7IHN1bTEgKz0gczE7ICAgICAgICAgICAgICAgICBcCisgICAgc3VtMiArPSBzMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VYSVRfQzMoIHN1bSwgc3VtdHlwZSApCisKKyNkZWZpbmUgSUNWX1NVTV9FWElUX0JMT0NLX0M0KCBzdW10eXBlICkgICAgXAorICAgIHN1bTAgKz0gczA7IHN1bTEgKz0gczE7ICAgICAgICAgICAgICAgICBcCisgICAgc3VtMiArPSBzMjsgc3VtMyArPSBzMzsgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VYSVRfQzQoIHN1bSwgc3VtdHlwZSApCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHVwZGF0ZSBtYWNyb3MgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIElDVl9TVU1fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApIFwKKyAgICByZW1haW5pbmcgPSBibG9ja19zaXplCisKKyNkZWZpbmUgSUNWX1NVTV9VUERBVEVfQzEoIGJsb2NrX3NpemUgKSAgICAgXAorICAgIElDVl9TVU1fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgICBcCisgICAgc3VtMCArPSBzMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzMCA9IDAKKworI2RlZmluZSBJQ1ZfU1VNX1VQREFURV9DMiggYmxvY2tfc2l6ZSApICAgICBcCisgICAgSUNWX1NVTV9VUERBVEVfQ09NTU9OKCBibG9ja19zaXplICk7ICAgIFwKKyAgICBzdW0wICs9IHMwOyBzdW0xICs9IHMxOyAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gczEgPSAwCisKKyNkZWZpbmUgSUNWX1NVTV9VUERBVEVfQzMoIGJsb2NrX3NpemUgKSAgICAgXAorICAgIElDVl9TVU1fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgICBcCisgICAgc3VtMCArPSBzMDsgc3VtMSArPSBzMTsgc3VtMiArPSBzMjsgICAgIFwKKyAgICBzMCA9IHMxID0gczIgPSAwCisKKyNkZWZpbmUgSUNWX1NVTV9VUERBVEVfQzQoIGJsb2NrX3NpemUgKSAgICAgXAorICAgIElDVl9TVU1fVVBEQVRFX0NPTU1PTiggYmxvY2tfc2l6ZSApOyAgICBcCisgICAgc3VtMCArPSBzMDsgc3VtMSArPSBzMTsgICAgICAgICAgICAgICAgIFwKKyAgICBzdW0yICs9IHMyOyBzdW0zICs9IHMzOyAgICAgICAgICAgICAgICAgXAorICAgIHMwID0gczEgPSBzMiA9IHMzID0gMAorCisKKyNkZWZpbmUgSUNWX0RFRl9TVU1fTk9ISU5UX0JMT0NLX0ZVTkNfMkQoIG5hbWUsIGZsYXZvciwgY24sICAgICBcCisgICAgX19vcF9fLCBhcnJ0eXBlLCBzdW10eXBlX2ZpbmFsLCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApXAorSVBDVkFQSV9JTVBMKEN2U3RhdHVzLCBpY3YjI25hbWUjI18jI2ZsYXZvciMjX0MjI2NuIyNSLCggICAgICAgIFwKKyAgICBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzdGVwLCBDdlNpemUgc2l6ZSwgICAgICAgICAgICAgICAgICBcCisgICAgc3VtdHlwZV9maW5hbCogc3VtICksIChzcmMsIHN0ZXAsIHNpemUsIHN1bSkgKSAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBJQ1ZfU1VNX0VOVFJZX0JMT0NLX0MjI2NuKHN1bXR5cGUsd29ya3R5cGUsKGJsb2NrX3NpemUpKihjbikpOyBcCisgICAgc2l6ZS53aWR0aCAqPSBjbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX1NVTV9DQVNFX0MjI2NuKCBfX29wX18sIGxpbWl0ICk7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElDVl9TVU1fVVBEQVRFX0MjI2NuKCAoYmxvY2tfc2l6ZSkqKGNuKSApOyAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9FWElUX0JMT0NLX0MjI2NuKCBzdW10eXBlX2ZpbmFsICk7ICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfU1VNX05PSElOVF9GVU5DXzJEKCBuYW1lLCBmbGF2b3IsIGNuLCAgICAgICAgICAgXAorICAgIF9fb3BfXywgYXJydHlwZSwgc3VtdHlwZV9maW5hbCwgc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKVwKK0lQQ1ZBUElfSU1QTChDdlN0YXR1cywgaWN2IyNuYW1lIyNfIyNmbGF2b3IjI19DIyNjbiMjUiwoICAgICAgICBcCisgICAgY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICAgICAgICAgICAgXAorICAgIHN1bXR5cGVfZmluYWwqIHN1bSApLCAoc3JjLCBzdGVwLCBzaXplLCBzdW0pICkgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9FTlRSWV9DIyNjbiggc3VtdHlwZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzdGVwICkgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHggPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIElDVl9TVU1fQ0FTRV9DIyNjbiggX19vcF9fLCBzaXplLndpZHRoICk7ICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9FWElUX0MjI2NuKCBzLCBzdW10eXBlX2ZpbmFsICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfU1VNX0hJTlRfRlVOQ18yRCggbmFtZSwgZmxhdm9yLCBjbiwgICAgICAgICAgICAgXAorICAgIF9fb3BfXywgYXJydHlwZSwgc3VtdHlwZV9maW5hbCwgc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKVwKK0lQQ1ZBUElfSU1QTChDdlN0YXR1cywgaWN2IyNuYW1lIyNfIyNmbGF2b3IjI19DIyNjbiMjUiwoICAgICAgICBcCisgICAgY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsICAgICAgICAgICAgICAgICAgXAorICAgIHN1bXR5cGVfZmluYWwqIHN1bSwgQ3ZIaW50QWxnb3JpdGhtIC8qaGludCovICksICAgICAgICAgICAgIFwKKyAgICAoc3JjLCBzdGVwLCBzaXplLCBzdW0sIGN2QWxnSGludEFjY3VyYXRlKSApICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRU5UUllfQyMjY24oIHN1bXR5cGUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzaXplLndpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfU1VNX0NBU0VfQyMjY24oIF9fb3BfXywgc2l6ZS53aWR0aCApOyAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRVhJVF9DIyNjbiggcywgc3VtdHlwZV9maW5hbCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX1NVTV9OT0hJTlRfQkxPQ0tfRlVOQ18yRF9DT0koIG5hbWUsIGZsYXZvciwgICAgIFwKKyAgICBfX29wX18sIGFycnR5cGUsIHN1bXR5cGVfZmluYWwsIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplIClcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCBpY3YjI25hbWUjI18jI2ZsYXZvciMjX0NuQ1IoICAgICAgICAgXAorICAgIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHN0ZXAsIEN2U2l6ZSBzaXplLCBpbnQgY24sICAgICAgICAgIFwKKyAgICBpbnQgY29pLCBzdW10eXBlX2ZpbmFsKiBzdW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRU5UUllfQkxPQ0tfQzEoc3VtdHlwZSx3b3JrdHlwZSwoYmxvY2tfc2l6ZSkqKGNuKSk7IFwKKyAgICBzaXplLndpZHRoICo9IGNuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3JjICs9IGNvaSAtIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHN0ZXAgKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgeCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUoIHggPCBzaXplLndpZHRoICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGxpbWl0ID0gTUlOKCByZW1haW5pbmcsIHNpemUud2lkdGggLSB4ICk7ICAgICAgIFwKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSBsaW1pdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsaW1pdCArPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgSUNWX1NVTV9DT0lfQ0FTRSggX19vcF9fLCBsaW1pdCwgY24gKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPT0gMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIElDVl9TVU1fVVBEQVRFX0MxKCAoYmxvY2tfc2l6ZSkqKGNuKSApOyAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9FWElUX0JMT0NLX0MxKCBzdW10eXBlX2ZpbmFsICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9ERUZfU1VNX05PSElOVF9GVU5DXzJEX0NPSSggbmFtZSwgZmxhdm9yLCAgICAgICAgICAgXAorICAgIF9fb3BfXywgYXJydHlwZSwgc3VtdHlwZV9maW5hbCwgc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKVwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMIGljdiMjbmFtZSMjXyMjZmxhdm9yIyNfQ25DUiggICAgICAgICBcCisgICAgY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3RlcCwgQ3ZTaXplIHNpemUsIGludCBjbiwgICAgICAgICAgXAorICAgIGludCBjb2ksIHN1bXR5cGVfZmluYWwqIHN1bSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSUNWX1NVTV9FTlRSWV9DMSggc3VtdHlwZSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNpemUud2lkdGggKj0gY247ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmMgKz0gY29pIC0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3RlcCApICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCB4ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBJQ1ZfU1VNX0NPSV9DQVNFKCBfX29wX18sIHNpemUud2lkdGgsIGNuICk7ICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIElDVl9TVU1fRVhJVF9DMSggcywgc3VtdHlwZV9maW5hbCApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfREVGX1NVTV9BTEwoIG5hbWUsIGZsYXZvciwgX19vcF9fLCBhcnJ0eXBlLCBzdW10eXBlX2ZpbmFsLCBzdW10eXBlLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgd29ya3R5cGUsIGhpbnRwX3R5cGUsIG5vaGludF90eXBlLCBibG9ja19zaXplICkgICAgICAgIFwKKyAgICBJQ1ZfREVGX1NVTV8jI2hpbnRwX3R5cGUjI19GVU5DXzJEKCBuYW1lLCBmbGF2b3IsIDEsIF9fb3BfXywgYXJydHlwZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGVfZmluYWwsIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICBcCisgICAgSUNWX0RFRl9TVU1fIyNoaW50cF90eXBlIyNfRlVOQ18yRCggbmFtZSwgZmxhdm9yLCAyLCBfX29wX18sIGFycnR5cGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdW10eXBlX2ZpbmFsLCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApICAgICAgICAgXAorICAgIElDVl9ERUZfU1VNXyMjaGludHBfdHlwZSMjX0ZVTkNfMkQoIG5hbWUsIGZsYXZvciwgMywgX19vcF9fLCBhcnJ0eXBlLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtdHlwZV9maW5hbCwgc3VtdHlwZSwgd29ya3R5cGUsIGJsb2NrX3NpemUgKSAgICAgICAgIFwKKyAgICBJQ1ZfREVGX1NVTV8jI2hpbnRwX3R5cGUjI19GVU5DXzJEKCBuYW1lLCBmbGF2b3IsIDQsIF9fb3BfXywgYXJydHlwZSwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHN1bXR5cGVfZmluYWwsIHN1bXR5cGUsIHdvcmt0eXBlLCBibG9ja19zaXplICkgICAgICAgICBcCisgICAgSUNWX0RFRl9TVU1fIyNub2hpbnRfdHlwZSMjX0ZVTkNfMkRfQ09JKCBuYW1lLCBmbGF2b3IsIF9fb3BfXywgYXJydHlwZSwgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdW10eXBlX2ZpbmFsLCBzdW10eXBlLCB3b3JrdHlwZSwgYmxvY2tfc2l6ZSApCisKK0lDVl9ERUZfU1VNX0FMTCggU3VtLCA4dSwgQ1ZfTk9QLCB1Y2hhciwgZG91YmxlLCBpbnQ2NCwgdW5zaWduZWQsCisgICAgICAgICAgICAgICAgIE5PSElOVF9CTE9DSywgTk9ISU5UX0JMT0NLLCAxIDw8IDI0ICkKK0lDVl9ERUZfU1VNX0FMTCggU3VtLCAxNnUsIENWX05PUCwgdXNob3J0LCBkb3VibGUsIGludDY0LCB1bnNpZ25lZCwKKyAgICAgICAgICAgICAgICAgTk9ISU5UX0JMT0NLLCBOT0hJTlRfQkxPQ0ssIDEgPDwgMTYgKQorSUNWX0RFRl9TVU1fQUxMKCBTdW0sIDE2cywgQ1ZfTk9QLCBzaG9ydCwgZG91YmxlLCBpbnQ2NCwgaW50LAorICAgICAgICAgICAgICAgICBOT0hJTlRfQkxPQ0ssIE5PSElOVF9CTE9DSywgMSA8PCAxNiApCitJQ1ZfREVGX1NVTV9BTEwoIFN1bSwgMzJzLCBDVl9OT1AsIGludCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgTk9ISU5ULCBOT0hJTlQsIDAgKQorSUNWX0RFRl9TVU1fQUxMKCBTdW0sIDMyZiwgQ1ZfTk9QLCBmbG9hdCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgSElOVCwgTk9ISU5ULCAwICkKK0lDVl9ERUZfU1VNX0FMTCggU3VtLCA2NGYsIENWX05PUCwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBOT0hJTlQsIE5PSElOVCwgMCApCisKKyNkZWZpbmUgaWN2U3VtXzhzX0MxUiAgIDAKKyNkZWZpbmUgaWN2U3VtXzhzX0MyUiAgIDAKKyNkZWZpbmUgaWN2U3VtXzhzX0MzUiAgIDAKKyNkZWZpbmUgaWN2U3VtXzhzX0M0UiAgIDAKKyNkZWZpbmUgaWN2U3VtXzhzX0NuQ1IgIDAKKworQ1ZfREVGX0lOSVRfQklHX0ZVTkNfVEFCXzJEKCBTdW0sIFIgKQorQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIFN1bSwgQ25DUiApCisKK0NWX0lNUEwgQ3ZTY2FsYXIKK2N2U3VtKCBjb25zdCBDdkFyciogYXJyICkKK3sKKyAgICBzdGF0aWMgQ3ZCaWdGdW5jVGFibGUgc3VtX3RhYjsKKyAgICBzdGF0aWMgQ3ZGdW5jVGFibGUgc3VtY29pX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgQ3ZTY2FsYXIgc3VtID0ge3swLDAsMCwwfX07CisKKyAgICBDVl9GVU5DTkFNRSgiY3ZTdW0iKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCB0eXBlLCBjb2kgPSAwOworICAgIGludCBtYXRfc3RlcDsKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisKKyAgICBpZiggIWluaXR0YWIgKQorICAgIHsKKyAgICAgICAgaWN2SW5pdFN1bVJUYWJsZSggJnN1bV90YWIgKTsKKyAgICAgICAgaWN2SW5pdFN1bUNuQ1JUYWJsZSggJnN1bWNvaV90YWIgKTsKKyAgICAgICAgaW5pdHRhYiA9IDE7CisgICAgfQorCisgICAgaWYoICFDVl9JU19NQVQobWF0KSApCisgICAgeworICAgICAgICBpZiggQ1ZfSVNfTUFUTkQobWF0KSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvaWQqIG1hdG5kID0gKHZvaWQqKW1hdDsKKyAgICAgICAgICAgIEN2TWF0TkQgbnN0dWI7CisgICAgICAgICAgICBDdk5BcnJheUl0ZXJhdG9yIGl0ZXJhdG9yOworICAgICAgICAgICAgaW50IHBhc3NfaGludDsKKworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZJbml0TkFycmF5SXRlcmF0b3IoIDEsICZtYXRuZCwgMCwgJm5zdHViLCAmaXRlcmF0b3IgKSk7CisKKyAgICAgICAgICAgIHR5cGUgPSBDVl9NQVRfVFlQRShpdGVyYXRvci5oZHJbMF0tPnR5cGUpOworICAgICAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDQgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIGlucHV0IGFycmF5IG11c3QgaGF2ZSBhdCBtb3N0IDQgY2hhbm5lbHMiICk7CisKKyAgICAgICAgICAgIHBhc3NfaGludCA9IENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl8zMkY7CisKKyAgICAgICAgICAgIGlmKCAhcGFzc19oaW50ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdkZ1bmMyRF8xQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRfMUExUCkoc3VtX3RhYi5mbl8yZFt0eXBlXSk7CisgICAgICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgICAgIAorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciB0ZW1wID0ge3swLDAsMCwwfX07CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgdGVtcC52YWwgKSk7CisgICAgICAgICAgICAgICAgICAgIHN1bS52YWxbMF0gKz0gdGVtcC52YWxbMF07CisgICAgICAgICAgICAgICAgICAgIHN1bS52YWxbMV0gKz0gdGVtcC52YWxbMV07CisgICAgICAgICAgICAgICAgICAgIHN1bS52YWxbMl0gKz0gdGVtcC52YWxbMl07CisgICAgICAgICAgICAgICAgICAgIHN1bS52YWxbM10gKz0gdGVtcC52YWxbM107CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCBjdk5leHROQXJyYXlTbGljZSggJml0ZXJhdG9yICkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RnVuYzJEXzFBMVAxSSBmdW5jID0gKEN2RnVuYzJEXzFBMVAxSSkoc3VtX3RhYi5mbl8yZFt0eXBlXSk7CisgICAgICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiIiApOworICAgICAgIAorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDdlNjYWxhciB0ZW1wID0ge3swLDAsMCwwfX07CisgICAgICAgICAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggaXRlcmF0b3IucHRyWzBdLCBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3Iuc2l6ZSwgdGVtcC52YWwsIGN2QWxnSGludEFjY3VyYXRlICkpOworICAgICAgICAgICAgICAgICAgICBzdW0udmFsWzBdICs9IHRlbXAudmFsWzBdOworICAgICAgICAgICAgICAgICAgICBzdW0udmFsWzFdICs9IHRlbXAudmFsWzFdOworICAgICAgICAgICAgICAgICAgICBzdW0udmFsWzJdICs9IHRlbXAudmFsWzJdOworICAgICAgICAgICAgICAgICAgICBzdW0udmFsWzNdICs9IHRlbXAudmFsWzNdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIsICZjb2kgKSk7CisgICAgfQorCisgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggbWF0ICk7CisKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAKKyAgICAgICAgaWYoIHNpemUud2lkdGggPD0gQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCogZGF0YSA9IG1hdC0+ZGF0YS5mbDsKKworICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdW0udmFsWzBdICs9IGRhdGFbc2l6ZS53aWR0aCAtIDFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSggLS1zaXplLndpZHRoICk7CisKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggdHlwZSA9PSBDVl82NEZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiBkYXRhID0gbWF0LT5kYXRhLmRiOworCisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN1bS52YWxbMF0gKz0gZGF0YVtzaXplLndpZHRoIC0gMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdoaWxlKCAtLXNpemUud2lkdGggKTsKKworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICBtYXRfc3RlcCA9IENWX1NUVUJfU1RFUDsKKyAgICB9CisKKyAgICBpZiggQ1ZfTUFUX0NOKHR5cGUpID09IDEgfHwgY29pID09IDAgKQorICAgIHsKKyAgICAgICAgaW50IHBhc3NfaGludCA9IENWX01BVF9ERVBUSCh0eXBlKSA9PSBDVl8zMkY7CisKKyAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSA+IDQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgaW5wdXQgYXJyYXkgbXVzdCBoYXZlIGF0IG1vc3QgNCBjaGFubmVscyIgKTsKKworICAgICAgICBpZiggIXBhc3NfaGludCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RnVuYzJEXzFBMVAgZnVuYyA9IChDdkZ1bmMyRF8xQTFQKShzdW1fdGFiLmZuXzJkW3R5cGVdKTsKKworICAgICAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICAgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIHNpemUsIHN1bS52YWwgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdkZ1bmMyRF8xQTFQMUkgZnVuYyA9IChDdkZ1bmMyRF8xQTFQMUkpKHN1bV90YWIuZm5fMmRbdHlwZV0pOworCisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSwgc3VtLnZhbCwgY3ZBbGdIaW50QWNjdXJhdGUgKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZGdW5jMkRuQ18xQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRuQ18xQTFQKShzdW1jb2lfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworCisgICAgICAgIGlmKCAhZnVuYyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBjdlVuc3VwcG9ydGVkRm9ybWF0ICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBtYXQtPmRhdGEucHRyLCBtYXRfc3RlcCwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQVRfQ04odHlwZSksIGNvaSwgc3VtLnZhbCApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuICBzdW07Cit9CisKKworI2RlZmluZSBJQ1ZfREVGX05PTlpFUk9fQUxMKCBmbGF2b3IsIF9fb3BfXywgYXJydHlwZSApICAgICAgICAgICAgICBcCisgICAgSUNWX0RFRl9TVU1fTk9ISU5UX0ZVTkNfMkQoIENvdW50Tm9uWmVybywgZmxhdm9yLCAxLCBfX29wX18sICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJydHlwZSwgaW50LCBpbnQsIGludCwgMCApICAgICAgICAgXAorICAgIElDVl9ERUZfU1VNX05PSElOVF9GVU5DXzJEX0NPSSggQ291bnROb25aZXJvLCBmbGF2b3IsIF9fb3BfXywgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJ0eXBlLCBpbnQsIGludCwgaW50LCAwICkKKworI3VuZGVmICBDVl9OT05aRVJPX0RCTAorI2RlZmluZSBDVl9OT05aRVJPX0RCTCh4KSAoKCh4KSAmIENWX0JJR19JTlQoMHg3ZmZmZmZmZmZmZmZmZmZmKSkgIT0gMCkKKworSUNWX0RFRl9OT05aRVJPX0FMTCggOHUsIENWX05PTlpFUk8sIHVjaGFyICkKK0lDVl9ERUZfTk9OWkVST19BTEwoIDE2cywgQ1ZfTk9OWkVSTywgdXNob3J0ICkKK0lDVl9ERUZfTk9OWkVST19BTEwoIDMycywgQ1ZfTk9OWkVSTywgaW50ICkKK0lDVl9ERUZfTk9OWkVST19BTEwoIDMyZiwgQ1ZfTk9OWkVST19GTFQsIGludCApCitJQ1ZfREVGX05PTlpFUk9fQUxMKCA2NGYsIENWX05PTlpFUk9fREJMLCBpbnQ2NCApCisKKyNkZWZpbmUgaWN2Q291bnROb25aZXJvXzhzX0MxUiBpY3ZDb3VudE5vblplcm9fOHVfQzFSCisjZGVmaW5lIGljdkNvdW50Tm9uWmVyb184c19DbkNSIGljdkNvdW50Tm9uWmVyb184dV9DbkNSCisjZGVmaW5lIGljdkNvdW50Tm9uWmVyb18xNnVfQzFSIGljdkNvdW50Tm9uWmVyb18xNnNfQzFSCisjZGVmaW5lIGljdkNvdW50Tm9uWmVyb18xNnVfQ25DUiBpY3ZDb3VudE5vblplcm9fMTZzX0NuQ1IKKworQ1ZfREVGX0lOSVRfRlVOQ19UQUJfMkQoIENvdW50Tm9uWmVybywgQzFSICkKK0NWX0RFRl9JTklUX0ZVTkNfVEFCXzJEKCBDb3VudE5vblplcm8sIENuQ1IgKQorCitDVl9JTVBMIGludAorY3ZDb3VudE5vblplcm8oIGNvbnN0IEN2QXJyKiBhcnIgKQoreworICAgIHN0YXRpYyBDdkZ1bmNUYWJsZSBuel90YWI7CisgICAgc3RhdGljIEN2RnVuY1RhYmxlIG56Y29pX3RhYjsKKyAgICBzdGF0aWMgaW50IGluaXR0YWIgPSAwOworCisgICAgaW50IGNvdW50ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdkNvdW50Tm9uWmVybyIpOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHR5cGUsIGNvaSA9IDA7CisgICAgaW50IG1hdF9zdGVwOworICAgIEN2U2l6ZSBzaXplOworICAgIEN2TWF0IHN0dWIsICptYXQgPSAoQ3ZNYXQqKWFycjsKKworICAgIGlmKCAhaW5pdHRhYiApCisgICAgeworICAgICAgICBpY3ZJbml0Q291bnROb25aZXJvQzFSVGFibGUoICZuel90YWIgKTsKKyAgICAgICAgaWN2SW5pdENvdW50Tm9uWmVyb0NuQ1JUYWJsZSggJm56Y29pX3RhYiApOworICAgICAgICBpbml0dGFiID0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChtYXQpICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9JU19NQVRORChtYXQpICkKKyAgICAgICAgeworICAgICAgICAgICAgdm9pZCogbWF0bmQgPSAodm9pZCopYXJyOworICAgICAgICAgICAgQ3ZNYXRORCBuc3R1YjsKKyAgICAgICAgICAgIEN2TkFycmF5SXRlcmF0b3IgaXRlcmF0b3I7CisgICAgICAgICAgICBDdkZ1bmMyRF8xQTFQIGZ1bmM7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGN2SW5pdE5BcnJheUl0ZXJhdG9yKCAxLCAmbWF0bmQsIDAsICZuc3R1YiwgJml0ZXJhdG9yICkpOworCisgICAgICAgICAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaXRlcmF0b3IuaGRyWzBdLT50eXBlKTsKKworICAgICAgICAgICAgaWYoIENWX01BVF9DTih0eXBlKSAhPSAxICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICJPbmx5IHNpbmdsZS1jaGFubmVsIGFycmF5IGFyZSBzdXBwb3J0ZWQgaGVyZSIgKTsKKworICAgICAgICAgICAgZnVuYyA9IChDdkZ1bmMyRF8xQTFQKShuel90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisgICAgICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICAgICAKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHRlbXA7CisgICAgICAgICAgICAgICAgSVBQSV9DQUxMKCBmdW5jKCBpdGVyYXRvci5wdHJbMF0sIENWX1NUVUJfU1RFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnNpemUsICZ0ZW1wICkpOworICAgICAgICAgICAgICAgIGNvdW50ICs9IHRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSggY3ZOZXh0TkFycmF5U2xpY2UoICZpdGVyYXRvciApKTsKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIsICZjb2kgKSk7CisgICAgfQorCisgICAgdHlwZSA9IENWX01BVF9UWVBFKG1hdC0+dHlwZSk7CisgICAgc2l6ZSA9IGN2R2V0TWF0U2l6ZSggbWF0ICk7CisKKyAgICBtYXRfc3RlcCA9IG1hdC0+c3RlcDsKKworICAgIGlmKCBDVl9JU19NQVRfQ09OVCggbWF0LT50eXBlICkpCisgICAgeworICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICBzaXplLmhlaWdodCA9IDE7CisgICAgICAgIG1hdF9zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgIH0KKworICAgIGlmKCBDVl9NQVRfQ04odHlwZSkgPT0gMSB8fCBjb2kgPT0gMCApCisgICAgeworICAgICAgICBDdkZ1bmMyRF8xQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRfMUExUCkobnpfdGFiLmZuXzJkW0NWX01BVF9ERVBUSCh0eXBlKV0pOworCisgICAgICAgIGlmKCBDVl9NQVRfQ04odHlwZSkgIT0gMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsCisgICAgICAgICAgICAiVGhlIGZ1bmN0aW9uIGNhbiBoYW5kbGUgb25seSBhIHNpbmdsZSBjaGFubmVsIGF0IGEgdGltZSAodXNlIENPSSkiKTsKKworICAgICAgICBpZiggIWZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgY3ZVbnN1cHBvcnRlZEZvcm1hdCApOworCisgICAgICAgIElQUElfQ0FMTCggZnVuYyggbWF0LT5kYXRhLnB0ciwgbWF0X3N0ZXAsIHNpemUsICZjb3VudCApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZGdW5jMkRuQ18xQTFQIGZ1bmMgPSAoQ3ZGdW5jMkRuQ18xQTFQKShuemNvaV90YWIuZm5fMmRbQ1ZfTUFUX0RFUFRIKHR5cGUpXSk7CisKKyAgICAgICAgaWYoICFmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsIGN2VW5zdXBwb3J0ZWRGb3JtYXQgKTsKKworICAgICAgICBJUFBJX0NBTEwoIGZ1bmMoIG1hdC0+ZGF0YS5wdHIsIG1hdF9zdGVwLCBzaXplLCBDVl9NQVRfQ04odHlwZSksIGNvaSwgJmNvdW50ICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gIGNvdW50OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdWNlIE1hdHJpeCB0byBWZWN0b3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJQ1ZfQUNDX1JPV1NfRlVOQyggbmFtZSwgZmxhdm9yLCBhcnJ0eXBlLCBhY2N0eXBlLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fb3BfXywgbG9hZF9tYWNybyApICAgICAgICAgICAgICAgICBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2IyNuYW1lIyNSb3dzXyMjZmxhdm9yIyNfQzFSKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3R5cGUqIGRzdCwgQ3ZTaXplIHNpemUgKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCB3aWR0aCA9IHNpemUud2lkdGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggaSA9IDA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZHN0W2ldID0gbG9hZF9tYWNybyhzcmNbaV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyAtLXNpemUuaGVpZ2h0OyAgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNyYyArPSBzcmNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHdpZHRoIC0gNDsgaSArPSA0ICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhY2N0eXBlIHMwID0gbG9hZF9tYWNybyhzcmNbaV0pOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYWNjdHlwZSBzMSA9IGxvYWRfbWFjcm8oc3JjW2krMV0pOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGFjY3R5cGUgYTAgPSBkc3RbaV0sIGExID0gZHN0W2krMV07ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IChhY2N0eXBlKV9fb3BfXyhhMCxzMCk7IGExID0gKGFjY3R5cGUpX19vcF9fKGExLHMxKTsgXAorICAgICAgICAgICAgZHN0W2ldID0gYTA7IGRzdFtpKzFdID0gYTE7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzMCA9IGxvYWRfbWFjcm8oc3JjW2krMl0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczEgPSBsb2FkX21hY3JvKHNyY1tpKzNdKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gZHN0W2krMl07IGExID0gZHN0W2krM107ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IChhY2N0eXBlKV9fb3BfXyhhMCxzMCk7IGExID0gKGFjY3R5cGUpX19vcF9fKGExLHMxKTsgIFwKKyAgICAgICAgICAgIGRzdFtpKzJdID0gYTA7IGRzdFtpKzNdID0gYTE7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZm9yKCA7IGkgPCB3aWR0aDsgaSsrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYWNjdHlwZSBzMCA9IGxvYWRfbWFjcm8oc3JjW2ldKSwgYTAgPSBkc3RbaV07ICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gKGFjY3R5cGUpX19vcF9fKGEwLHMwKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBkc3RbaV0gPSBhMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9BQ0NfQ09MU19GVU5DX0MxKCBuYW1lLCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBhY2N0eXBlLCBfX29wX18gKVwKK3N0YXRpYyBDdlN0YXR1cyBDVl9TVERDQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2ljdiMjbmFtZSMjQ29sc18jI2ZsYXZvciMjX0MxUiggY29uc3QgYXJydHlwZSogc3JjLCBpbnQgc3Jjc3RlcCwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNjdHlwZSogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKVwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgaSwgd2lkdGggPSBzaXplLndpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzcmNzdGVwIC89IHNpemVvZihzcmNbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkc3RzdGVwIC89IHNpemVvZihkc3RbMF0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgc3JjICs9IHNyY3N0ZXAsIGRzdCArPSBkc3RzdGVwICkgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIHdpZHRoID09IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFswXSA9IChhY2N0eXBlKXNyY1swXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHdvcmt0eXBlIGEwID0gc3JjWzBdLCBhMSA9IHNyY1sxXTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggaSA9IDI7IGkgPD0gd2lkdGggLSA0OyBpICs9IDQgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IHNyY1tpXSwgczEgPSBzcmNbaSsxXTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhMCA9IF9fb3BfXyhhMCwgczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhMSA9IF9fb3BfXyhhMSwgczEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBzMCA9IHNyY1tpKzJdOyBzMSA9IHNyY1tpKzNdOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhMCA9IF9fb3BfXyhhMCwgczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhMSA9IF9fb3BfXyhhMSwgczEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciggOyBpIDwgd2lkdGg7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IHNyY1tpXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBhMCA9IF9fb3BfXyhhMCwgczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGEwID0gX19vcF9fKGEwLCBhMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGRzdFswXSA9IChhY2N0eXBlKWEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ1ZfT0s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworCisjZGVmaW5lIElDVl9BQ0NfQ09MU19GVU5DX0MzKCBuYW1lLCBmbGF2b3IsIGFycnR5cGUsIHdvcmt0eXBlLCBhY2N0eXBlLCBfX29wX18gKSBcCitzdGF0aWMgQ3ZTdGF0dXMgQ1ZfU1REQ0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitpY3YjI25hbWUjI0NvbHNfIyNmbGF2b3IjI19DM1IoIGNvbnN0IGFycnR5cGUqIHNyYywgaW50IHNyY3N0ZXAsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY3R5cGUqIGRzdCwgaW50IGRzdHN0ZXAsIEN2U2l6ZSBzaXplIClcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGksIHdpZHRoID0gc2l6ZS53aWR0aCozOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3Jjc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZHN0c3RlcCAvPSBzaXplb2YoZHN0WzBdKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IHNyYyArPSBzcmNzdGVwLCBkc3QgKz0gZHN0c3RlcCApICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdvcmt0eXBlIGEwID0gc3JjWzBdLCBhMSA9IHNyY1sxXSwgYTIgPSBzcmNbMl07ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZvciggaSA9IDM7IGkgPCB3aWR0aDsgaSArPSAzICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3b3JrdHlwZSBzMCA9IHNyY1tpXSwgczEgPSBzcmNbaSsxXSwgczIgPSBzcmNbaSsyXTsgICAgICAgICBcCisgICAgICAgICAgICBhMCA9IF9fb3BfXyhhMCwgczApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMSA9IF9fb3BfXyhhMSwgczEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBhMiA9IF9fb3BfXyhhMiwgczIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFswXSA9IChhY2N0eXBlKWEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsxXSA9IChhY2N0eXBlKWExOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRzdFsyXSA9IChhY2N0eXBlKWEyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIENWX09LOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworI2RlZmluZSBJQ1ZfQUNDX0NPTFNfRlVOQ19DNCggbmFtZSwgZmxhdm9yLCBhcnJ0eXBlLCB3b3JrdHlwZSwgYWNjdHlwZSwgX19vcF9fICkgXAorc3RhdGljIEN2U3RhdHVzIENWX1NURENBTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraWN2IyNuYW1lIyNDb2xzXyMjZmxhdm9yIyNfQzRSKCBjb25zdCBhcnJ0eXBlKiBzcmMsIGludCBzcmNzdGVwLCAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2N0eXBlKiBkc3QsIGludCBkc3RzdGVwLCBDdlNpemUgc2l6ZSApXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCB3aWR0aCA9IHNpemUud2lkdGgqNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNyY3N0ZXAgLz0gc2l6ZW9mKHNyY1swXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRzdHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggOyBzaXplLmhlaWdodC0tOyBzcmMgKz0gc3Jjc3RlcCwgZHN0ICs9IGRzdHN0ZXAgKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3b3JrdHlwZSBhMCA9IHNyY1swXSwgYTEgPSBzcmNbMV0sIGEyID0gc3JjWzJdLCBhMyA9IHNyY1szXTsgICAgXAorICAgICAgICBmb3IoIGkgPSA0OyBpIDwgd2lkdGg7IGkgKz0gNCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgd29ya3R5cGUgczAgPSBzcmNbaV0sIHMxID0gc3JjW2krMV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTAgPSBfX29wX18oYTAsIHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTEgPSBfX29wX18oYTEsIHMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgczAgPSBzcmNbaSsyXTsgczEgPSBzcmNbaSszXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTIgPSBfX29wX18oYTIsIHMwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYTMgPSBfX29wX18oYTMsIHMxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMF0gPSAoYWNjdHlwZSlhMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMV0gPSAoYWNjdHlwZSlhMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbMl0gPSAoYWNjdHlwZSlhMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkc3RbM10gPSAoYWNjdHlwZSlhMzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDVl9PSzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0lDVl9BQ0NfUk9XU19GVU5DKCBTdW0sIDh1MzJzLCB1Y2hhciwgaW50LCBDVl9BREQsIENWX05PUCApCitJQ1ZfQUNDX1JPV1NfRlVOQyggU3VtLCA4dTMyZiwgdWNoYXIsIGZsb2F0LCBDVl9BREQsIENWXzhUTzMyRiApCitJQ1ZfQUNDX1JPV1NfRlVOQyggU3VtLCAxNnUzMmYsIHVzaG9ydCwgZmxvYXQsIENWX0FERCwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBTdW0sIDE2dTY0ZiwgdXNob3J0LCBkb3VibGUsIENWX0FERCwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBTdW0sIDE2czMyZiwgc2hvcnQsIGZsb2F0LCBDVl9BREQsIENWX05PUCApCitJQ1ZfQUNDX1JPV1NfRlVOQyggU3VtLCAxNnM2NGYsIHNob3J0LCBkb3VibGUsIENWX0FERCwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBTdW0sIDMyZiwgZmxvYXQsIGZsb2F0LCBDVl9BREQsIENWX05PUCApCitJQ1ZfQUNDX1JPV1NfRlVOQyggU3VtLCAzMmY2NGYsIGZsb2F0LCBkb3VibGUsIENWX0FERCwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBTdW0sIDY0ZiwgZG91YmxlLCBkb3VibGUsIENWX0FERCwgQ1ZfTk9QICkKKworSUNWX0FDQ19ST1dTX0ZVTkMoIE1heCwgOHUsIHVjaGFyLCB1Y2hhciwgQ1ZfTUFYXzhVLCBDVl9OT1AgKQorSUNWX0FDQ19ST1dTX0ZVTkMoIE1heCwgMzJmLCBmbG9hdCwgZmxvYXQsIE1BWCwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBNYXgsIDY0ZiwgZG91YmxlLCBkb3VibGUsIE1BWCwgQ1ZfTk9QICkKKworSUNWX0FDQ19ST1dTX0ZVTkMoIE1pbiwgOHUsIHVjaGFyLCB1Y2hhciwgQ1ZfTUlOXzhVLCBDVl9OT1AgKQorSUNWX0FDQ19ST1dTX0ZVTkMoIE1pbiwgMzJmLCBmbG9hdCwgZmxvYXQsIE1JTiwgQ1ZfTk9QICkKK0lDVl9BQ0NfUk9XU19GVU5DKCBNaW4sIDY0ZiwgZG91YmxlLCBkb3VibGUsIE1JTiwgQ1ZfTk9QICkKKworSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIFN1bSwgOHUzMnMsIHVjaGFyLCBpbnQsIGludCwgQ1ZfQUREICkKK0lDVl9BQ0NfQ09MU19GVU5DX0MxKCBTdW0sIDh1MzJmLCB1Y2hhciwgaW50LCBmbG9hdCwgQ1ZfQUREICkKK0lDVl9BQ0NfQ09MU19GVU5DX0MxKCBTdW0sIDE2dTMyZiwgdXNob3J0LCBmbG9hdCwgZmxvYXQsIENWX0FERCApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggU3VtLCAxNnU2NGYsIHVzaG9ydCwgZG91YmxlLCBkb3VibGUsIENWX0FERCApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggU3VtLCAxNnMzMmYsIHNob3J0LCBmbG9hdCwgZmxvYXQsIENWX0FERCApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggU3VtLCAxNnM2NGYsIHNob3J0LCBkb3VibGUsIGRvdWJsZSwgQ1ZfQUREICkKKworSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIFN1bSwgMzJmLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBDVl9BREQgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIFN1bSwgMzJmNjRmLCBmbG9hdCwgZG91YmxlLCBkb3VibGUsIENWX0FERCApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggU3VtLCA2NGYsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIENWX0FERCApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMyggU3VtLCA4dTMycywgdWNoYXIsIGludCwgaW50LCBDVl9BREQgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzMoIFN1bSwgOHUzMmYsIHVjaGFyLCBpbnQsIGZsb2F0LCBDVl9BREQgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzMoIFN1bSwgMzJmLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBDVl9BREQgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzMoIFN1bSwgNjRmLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBDVl9BREQgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzQoIFN1bSwgOHUzMnMsIHVjaGFyLCBpbnQsIGludCwgQ1ZfQUREICkKK0lDVl9BQ0NfQ09MU19GVU5DX0M0KCBTdW0sIDh1MzJmLCB1Y2hhciwgaW50LCBmbG9hdCwgQ1ZfQUREICkKK0lDVl9BQ0NfQ09MU19GVU5DX0M0KCBTdW0sIDMyZiwgZmxvYXQsIGZsb2F0LCBmbG9hdCwgQ1ZfQUREICkKK0lDVl9BQ0NfQ09MU19GVU5DX0M0KCBTdW0sIDY0ZiwgZG91YmxlLCBkb3VibGUsIGRvdWJsZSwgQ1ZfQUREICkKKworSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIE1heCwgOHUsIHVjaGFyLCBpbnQsIHVjaGFyLCBDVl9NQVhfOFUgKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIE1heCwgMzJmLCBmbG9hdCwgZmxvYXQsIGZsb2F0LCBNQVggKQorSUNWX0FDQ19DT0xTX0ZVTkNfQzEoIE1heCwgNjRmLCBkb3VibGUsIGRvdWJsZSwgZG91YmxlLCBNQVggKQorCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggTWluLCA4dSwgdWNoYXIsIGludCwgdWNoYXIsIENWX01JTl84VSApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggTWluLCAzMmYsIGZsb2F0LCBmbG9hdCwgZmxvYXQsIE1JTiApCitJQ1ZfQUNDX0NPTFNfRlVOQ19DMSggTWluLCA2NGYsIGRvdWJsZSwgZG91YmxlLCBkb3VibGUsIE1JTiApCisKK3R5cGVkZWYgQ3ZTdGF0dXMgKENWX1NURENBTEwgKiBDdlJlZHVjZVRvUm93RnVuYykKKyAgICAoIGNvbnN0IHZvaWQqIHNyYywgaW50IHNyY3N0ZXAsIHZvaWQqIGRzdCwgQ3ZTaXplIHNpemUgKTsKKwordHlwZWRlZiBDdlN0YXR1cyAoQ1ZfU1REQ0FMTCAqIEN2UmVkdWNlVG9Db2xGdW5jKQorICAgICggY29uc3Qgdm9pZCogc3JjLCBpbnQgc3Jjc3RlcCwgdm9pZCogZHN0LCBpbnQgZHN0c3RlcCwgQ3ZTaXplIHNpemUgKTsKKworCitDVl9JTVBMIHZvaWQKK2N2UmVkdWNlKCBjb25zdCBDdkFyciogc3JjYXJyLCBDdkFyciogZHN0YXJyLCBpbnQgZGltLCBpbnQgb3AgKQoreworICAgIEN2TWF0KiB0ZW1wID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UmVkdWNlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSAoQ3ZNYXQqKXNyY2FycjsKKyAgICBDdk1hdCBkc3R1YiwgKmRzdCA9IChDdk1hdCopZHN0YXJyLCAqZHN0MDsKKyAgICBpbnQgc2RlcHRoLCBkZGVwdGgsIGNuLCBvcDAgPSBvcDsKKyAgICBDdlNpemUgc2l6ZTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHNyYykgKQorICAgICAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjLCAmc3N0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVChkc3QpICkKKyAgICAgICAgQ1ZfQ0FMTCggZHN0ID0gY3ZHZXRNYXQoIGRzdCwgJmRzdHViICkpOworCisgICAgaWYoICFDVl9BUkVfQ05TX0VRKHNyYywgZHN0KSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiSW5wdXQgYW5kIG91dHB1dCBhcnJheXMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscyIgKTsKKworICAgIHNkZXB0aCA9IENWX01BVF9ERVBUSChzcmMtPnR5cGUpOworICAgIGRkZXB0aCA9IENWX01BVF9ERVBUSChkc3QtPnR5cGUpOworICAgIGNuID0gQ1ZfTUFUX0NOKHNyYy0+dHlwZSk7CisgICAgZHN0MCA9IGRzdDsKKworICAgIHNpemUgPSBjdkdldE1hdFNpemUoc3JjKTsKKworICAgIGlmKCBkaW0gPCAwICkKKyAgICAgICAgZGltID0gc3JjLT5yb3dzID4gZHN0LT5yb3dzID8gMCA6IHNyYy0+Y29scyA+IGRzdC0+Y29scyA/IDEgOiBkc3QtPmNvbHMgPT0gMTsKKworICAgIGlmKCBkaW0gPiAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgcmVkdWNlZCBkaW1lbnNpb25hbGl0eSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UiICk7CisKKyAgICBpZiggKGRpbSA9PSAwICYmIChkc3QtPmNvbHMgIT0gc3JjLT5jb2xzIHx8IGRzdC0+cm93cyAhPSAxKSkgfHwKKyAgICAgICAgKGRpbSA9PSAxICYmIChkc3QtPnJvd3MgIT0gc3JjLT5yb3dzIHx8IGRzdC0+Y29scyAhPSAxKSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlRoZSBvdXRwdXQgYXJyYXkgc2l6ZSBpcyBpbmNvcnJlY3QiICk7CisKKyAgICBpZiggb3AgPT0gQ1ZfUkVEVUNFX0FWRyApCisgICAgeworICAgICAgICBpbnQgdHR5cGUgPSBzZGVwdGggPT0gQ1ZfOFUgPyBDVl9NQUtFVFlQRShDVl8zMlMsY24pIDogZHN0LT50eXBlOworICAgICAgICBpZiggdHR5cGUgIT0gZHN0LT50eXBlICkKKyAgICAgICAgICAgIENWX0NBTEwoIGRzdCA9IHRlbXAgPSBjdkNyZWF0ZU1hdCggZHN0LT5yb3dzLCBkc3QtPmNvbHMsIHR0eXBlICkpOworICAgICAgICBvcCA9IENWX1JFRFVDRV9TVU07CisgICAgICAgIGRkZXB0aCA9IENWX01BVF9ERVBUSCh0dHlwZSk7CisgICAgfQorCisgICAgaWYoIG9wICE9IENWX1JFRFVDRV9TVU0gJiYgb3AgIT0gQ1ZfUkVEVUNFX01BWCAmJiBvcCAhPSBDVl9SRURVQ0VfTUlOICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24gcmVkdWNlIG9wZXJhdGlvbiBpbmRleCwgbXVzdCBiZSBvbmUgb2YgQ1ZfUkVEVUNFXyoiICk7CisKKyAgICBpZiggZGltID09IDAgKQorICAgIHsKKyAgICAgICAgQ3ZSZWR1Y2VUb1Jvd0Z1bmMgcmZ1bmMgPQorICAgICAgICAgICAgb3AgPT0gQ1ZfUkVEVUNFX1NVTSA/CisgICAgICAgICAgICAoc2RlcHRoID09IENWXzhVICYmIGRkZXB0aCA9PSBDVl8zMlMgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c184dTMyc19DMVIgOgorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl84VSAmJiBkZGVwdGggPT0gQ1ZfMzJGID8gKEN2UmVkdWNlVG9Sb3dGdW5jKWljdlN1bVJvd3NfOHUzMmZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMTZVICYmIGRkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18xNnUzMmZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMTZVICYmIGRkZXB0aCA9PSBDVl82NEYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18xNnU2NGZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMTZTICYmIGRkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18xNnMzMmZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMTZTICYmIGRkZXB0aCA9PSBDVl82NEYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18xNnM2NGZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMzJGICYmIGRkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18zMmZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMzJGICYmIGRkZXB0aCA9PSBDVl82NEYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2U3VtUm93c18zMmY2NGZfQzFSIDogICAgICAgIAorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl82NEYgJiYgZGRlcHRoID09IENWXzY0RiA/IChDdlJlZHVjZVRvUm93RnVuYylpY3ZTdW1Sb3dzXzY0Zl9DMVIgOiAwKSA6CisgICAgICAgICAgICBvcCA9PSBDVl9SRURVQ0VfTUFYID8KKyAgICAgICAgICAgIChzZGVwdGggPT0gQ1ZfOFUgJiYgZGRlcHRoID09IENWXzhVID8gKEN2UmVkdWNlVG9Sb3dGdW5jKWljdk1heFJvd3NfOHVfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMzJGICYmIGRkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2TWF4Um93c18zMmZfQzFSIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfNjRGICYmIGRkZXB0aCA9PSBDVl82NEYgPyAoQ3ZSZWR1Y2VUb1Jvd0Z1bmMpaWN2TWF4Um93c182NGZfQzFSIDogMCkgOgorCisgICAgICAgICAgICAoc2RlcHRoID09IENWXzhVICYmIGRkZXB0aCA9PSBDVl84VSA/IChDdlJlZHVjZVRvUm93RnVuYylpY3ZNaW5Sb3dzXzh1X0MxUiA6CisgICAgICAgICAgICAgc2RlcHRoID09IENWXzMyRiAmJiBkZGVwdGggPT0gQ1ZfMzJGID8gKEN2UmVkdWNlVG9Sb3dGdW5jKWljdk1pblJvd3NfMzJmX0MxUiA6CisgICAgICAgICAgICAgc2RlcHRoID09IENWXzY0RiAmJiBkZGVwdGggPT0gQ1ZfNjRGID8gKEN2UmVkdWNlVG9Sb3dGdW5jKWljdk1pblJvd3NfNjRmX0MxUiA6IDApOworCisgICAgICAgIGlmKCAhcmZ1bmMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAgICAgIlVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uIG9mIGlucHV0IGFuZCBvdXRwdXQgYXJyYXkgZm9ybWF0cyIgKTsKKworICAgICAgICBzaXplLndpZHRoICo9IGNuOworICAgICAgICBJUFBJX0NBTEwoIHJmdW5jKCBzcmMtPmRhdGEucHRyLCBzcmMtPnN0ZXAgPyBzcmMtPnN0ZXAgOiBDVl9TVFVCX1NURVAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdC0+ZGF0YS5wdHIsIHNpemUgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2UmVkdWNlVG9Db2xGdW5jIGNmdW5jID0KKyAgICAgICAgICAgIG9wID09IENWX1JFRFVDRV9TVU0gPworICAgICAgICAgICAgKHNkZXB0aCA9PSBDVl84VSAmJiBkZGVwdGggPT0gQ1ZfMzJTID8KKyAgICAgICAgICAgIChDdlJlZHVjZVRvQ29sRnVuYykoY24gPT0gMSA/IGljdlN1bUNvbHNfOHUzMnNfQzFSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24gPT0gMyA/IGljdlN1bUNvbHNfOHUzMnNfQzNSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24gPT0gNCA/IGljdlN1bUNvbHNfOHUzMnNfQzRSIDogMCkgOgorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl84VSAmJiBkZGVwdGggPT0gQ1ZfMzJGID8KKyAgICAgICAgICAgIChDdlJlZHVjZVRvQ29sRnVuYykoY24gPT0gMSA/IGljdlN1bUNvbHNfOHUzMmZfQzFSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24gPT0gMyA/IGljdlN1bUNvbHNfOHUzMmZfQzNSIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY24gPT0gNCA/IGljdlN1bUNvbHNfOHUzMmZfQzRSIDogMCkgOgorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl8xNlUgJiYgZGRlcHRoID09IENWXzMyRiA/CisgICAgICAgICAgICAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpKGNuID09IDEgPyBpY3ZTdW1Db2xzXzE2dTMyZl9DMVIgOiAwKSA6CisgICAgICAgICAgICAgc2RlcHRoID09IENWXzE2VSAmJiBkZGVwdGggPT0gQ1ZfNjRGID8KKyAgICAgICAgICAgIChDdlJlZHVjZVRvQ29sRnVuYykoY24gPT0gMSA/IGljdlN1bUNvbHNfMTZ1NjRmX0MxUiA6IDApIDoKKyAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMTZTICYmIGRkZXB0aCA9PSBDVl8zMkYgPworICAgICAgICAgICAgKEN2UmVkdWNlVG9Db2xGdW5jKShjbiA9PSAxID8gaWN2U3VtQ29sc18xNnMzMmZfQzFSIDogMCkgOgorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl8xNlMgJiYgZGRlcHRoID09IENWXzY0RiA/CisgICAgICAgICAgICAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpKGNuID09IDEgPyBpY3ZTdW1Db2xzXzE2czY0Zl9DMVIgOiAwKSA6CisgICAgICAgICAgICAgc2RlcHRoID09IENWXzMyRiAmJiBkZGVwdGggPT0gQ1ZfMzJGID8KKyAgICAgICAgICAgIChDdlJlZHVjZVRvQ29sRnVuYykoY24gPT0gMSA/IGljdlN1bUNvbHNfMzJmX0MxUiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuID09IDMgPyBpY3ZTdW1Db2xzXzMyZl9DM1IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbiA9PSA0ID8gaWN2U3VtQ29sc18zMmZfQzRSIDogMCkgOgorICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl8zMkYgJiYgZGRlcHRoID09IENWXzY0RiA/CisgICAgICAgICAgICAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpKGNuID09IDEgPyBpY3ZTdW1Db2xzXzMyZjY0Zl9DMVIgOiAwKSA6CisgICAgICAgICAgICAgc2RlcHRoID09IENWXzY0RiAmJiBkZGVwdGggPT0gQ1ZfNjRGID8KKyAgICAgICAgICAgIChDdlJlZHVjZVRvQ29sRnVuYykoY24gPT0gMSA/IGljdlN1bUNvbHNfNjRmX0MxUiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuID09IDMgPyBpY3ZTdW1Db2xzXzY0Zl9DM1IgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbiA9PSA0ID8gaWN2U3VtQ29sc182NGZfQzRSIDogMCkgOiAwKSA6CisgICAgICAgICAgICAgb3AgPT0gQ1ZfUkVEVUNFX01BWCAmJiBjbiA9PSAxID8KKyAgICAgICAgICAgICAoc2RlcHRoID09IENWXzhVICYmIGRkZXB0aCA9PSBDVl84VSA/IChDdlJlZHVjZVRvQ29sRnVuYylpY3ZNYXhDb2xzXzh1X0MxUiA6CisgICAgICAgICAgICAgIHNkZXB0aCA9PSBDVl8zMkYgJiYgZGRlcHRoID09IENWXzMyRiA/IChDdlJlZHVjZVRvQ29sRnVuYylpY3ZNYXhDb2xzXzMyZl9DMVIgOgorICAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfNjRGICYmIGRkZXB0aCA9PSBDVl82NEYgPyAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpaWN2TWF4Q29sc182NGZfQzFSIDogMCkgOgorICAgICAgICAgICAgIG9wID09IENWX1JFRFVDRV9NSU4gJiYgY24gPT0gMSA/CisgICAgICAgICAgICAgKHNkZXB0aCA9PSBDVl84VSAmJiBkZGVwdGggPT0gQ1ZfOFUgPyAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpaWN2TWluQ29sc184dV9DMVIgOgorICAgICAgICAgICAgICBzZGVwdGggPT0gQ1ZfMzJGICYmIGRkZXB0aCA9PSBDVl8zMkYgPyAoQ3ZSZWR1Y2VUb0NvbEZ1bmMpaWN2TWluQ29sc18zMmZfQzFSIDoKKyAgICAgICAgICAgICAgc2RlcHRoID09IENWXzY0RiAmJiBkZGVwdGggPT0gQ1ZfNjRGID8gKEN2UmVkdWNlVG9Db2xGdW5jKWljdk1pbkNvbHNfNjRmX0MxUiA6IDApIDogMDsKKworICAgICAgICBpZiggIWNmdW5jICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgICAgICJVbnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBpbnB1dCBhbmQgb3V0cHV0IGFycmF5IGZvcm1hdHMiICk7CisKKyAgICAgICAgSVBQSV9DQUxMKCBjZnVuYyggc3JjLT5kYXRhLnB0ciwgc3JjLT5zdGVwID8gc3JjLT5zdGVwIDogQ1ZfU1RVQl9TVEVQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QtPmRhdGEucHRyLCBkc3QtPnN0ZXAgPyBkc3QtPnN0ZXAgOiBDVl9TVFVCX1NURVAsIHNpemUgKSk7CisgICAgfQorCisgICAgaWYoIG9wMCA9PSBDVl9SRURVQ0VfQVZHICkKKyAgICAgICAgY3ZTY2FsZSggZHN0LCBkc3QwLCAxLi8oZGltID09IDAgPyBzcmMtPnJvd3MgOiBzcmMtPmNvbHMpICk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIHRlbXAgKQorICAgICAgICBjdlJlbGVhc2VNYXQoICZ0ZW1wICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvY3hjb3JlL3NyYy9jeHN2ZC5jcHAgYi9jeGNvcmUvc3JjL2N4c3ZkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjgxNzUyCi0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeHN2ZC5jcHAKQEAgLTAsMCArMSwxNjIyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9jeGNvcmUuaCIKKyNpbmNsdWRlIDxmbG9hdC5oPgorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjZGVmaW5lIGljdkdpdmVuc182NGYoIG4sIHgsIHksIGMsIHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IF9pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlKiBfeCA9ICh4KTsgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlKiBfeSA9ICh5KTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBfaSA9IDA7IF9pIDwgbjsgX2krKyApICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB0MCA9IF94W19pXTsgICAgICAgICAgICBcCisgICAgICAgIGRvdWJsZSB0MSA9IF95W19pXTsgICAgICAgICAgICBcCisgICAgICAgIF94W19pXSA9IHQwKmMgKyB0MSpzOyAgICAgICAgICBcCisgICAgICAgIF95W19pXSA9IC10MCpzICsgdDEqYzsgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKworLyogeVswOm0sMDpuXSArPSBkaWFnKGFbMDoxLDA6bV0pICogeFswOm0sMDpuXSAqLworc3RhdGljICB2b2lkCitpY3ZNYXRyQVhQWV82NGYoIGludCBtLCBpbnQgbiwgY29uc3QgZG91YmxlKiB4LCBpbnQgZHgsCisgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYSwgZG91YmxlKiB5LCBpbnQgZHkgKQoreworICAgIGludCBpLCBqOworCisgICAgZm9yKCBpID0gMDsgaSA8IG07IGkrKywgeCArPSBkeCwgeSArPSBkeSApCisgICAgeworICAgICAgICBkb3VibGUgcyA9IGFbaV07CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBuIC0gNDsgaiArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0geVtqXSAgICsgcyp4W2pdOworICAgICAgICAgICAgZG91YmxlIHQxID0geVtqKzFdICsgcyp4W2orMV07CisgICAgICAgICAgICB5W2pdICAgPSB0MDsKKyAgICAgICAgICAgIHlbaisxXSA9IHQxOworICAgICAgICAgICAgdDAgPSB5W2orMl0gKyBzKnhbaisyXTsKKyAgICAgICAgICAgIHQxID0geVtqKzNdICsgcyp4W2orM107CisgICAgICAgICAgICB5W2orMl0gPSB0MDsKKyAgICAgICAgICAgIHlbaiszXSA9IHQxOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGogPCBuOyBqKysgKSB5W2pdICs9IHMqeFtqXTsKKyAgICB9Cit9CisKKworLyogeVsxOm0sLTFdID0gaCp5WzE6bSwwOm5dKnhbMDoxLDA6bl0nKnhbLTFdICAodGhpcyBpcyB1c2VkIGZvciBVJlYgcmVjb25zdHJ1Y3Rpb24pCisgICB5WzE6bSwwOm5dICs9IGgqeVsxOm0sMDpuXSp4WzA6MSwwOm5dJyp4WzA6MSwwOm5dICovCitzdGF0aWMgdm9pZAoraWN2TWF0ckFYUFkzXzY0ZiggaW50IG0sIGludCBuLCBjb25zdCBkb3VibGUqIHgsIGludCBsLCBkb3VibGUqIHksIGRvdWJsZSBoICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciggaSA9IDE7IGkgPCBtOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHMgPSAwOworCisgICAgICAgIHkgKz0gbDsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDw9IG4gLSA0OyBqICs9IDQgKQorICAgICAgICAgICAgcyArPSB4W2pdKnlbal0gKyB4W2orMV0qeVtqKzFdICsgeFtqKzJdKnlbaisyXSArIHhbaiszXSp5W2orM107CisKKyAgICAgICAgZm9yKCA7IGogPCBuOyBqKysgKSAgcyArPSB4W2pdKnlbal07CisKKyAgICAgICAgcyAqPSBoOworICAgICAgICB5Wy0xXSA9IHMqeFstMV07CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBuIC0gNDsgaiArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0geVtqXSAgICsgcyp4W2pdOworICAgICAgICAgICAgZG91YmxlIHQxID0geVtqKzFdICsgcyp4W2orMV07CisgICAgICAgICAgICB5W2pdICAgPSB0MDsKKyAgICAgICAgICAgIHlbaisxXSA9IHQxOworICAgICAgICAgICAgdDAgPSB5W2orMl0gKyBzKnhbaisyXTsKKyAgICAgICAgICAgIHQxID0geVtqKzNdICsgcyp4W2orM107CisgICAgICAgICAgICB5W2orMl0gPSB0MDsKKyAgICAgICAgICAgIHlbaiszXSA9IHQxOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGogPCBuOyBqKysgKSB5W2pdICs9IHMqeFtqXTsKKyAgICB9Cit9CisKKworI2RlZmluZSBpY3ZHaXZlbnNfMzJmKCBuLCB4LCB5LCBjLCBzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBfaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0KiBfeCA9ICh4KTsgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0KiBfeSA9ICh5KTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvciggX2kgPSAwOyBfaSA8IG47IF9pKysgKSAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgdDAgPSBfeFtfaV07ICAgICAgICAgICAgXAorICAgICAgICBkb3VibGUgdDEgPSBfeVtfaV07ICAgICAgICAgICAgXAorICAgICAgICBfeFtfaV0gPSAoZmxvYXQpKHQwKmMgKyB0MSpzKTsgXAorICAgICAgICBfeVtfaV0gPSAoZmxvYXQpKC10MCpzICsgdDEqYyk7XAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitzdGF0aWMgIHZvaWQKK2ljdk1hdHJBWFBZXzMyZiggaW50IG0sIGludCBuLCBjb25zdCBmbG9hdCogeCwgaW50IGR4LAorICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYSwgZmxvYXQqIHksIGludCBkeSApCit7CisgICAgaW50IGksIGo7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbTsgaSsrLCB4ICs9IGR4LCB5ICs9IGR5ICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzID0gYVtpXTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDw9IG4gLSA0OyBqICs9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdDAgPSB5W2pdICAgKyBzKnhbal07CisgICAgICAgICAgICBkb3VibGUgdDEgPSB5W2orMV0gKyBzKnhbaisxXTsKKyAgICAgICAgICAgIHlbal0gICA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgIHlbaisxXSA9IChmbG9hdCl0MTsKKyAgICAgICAgICAgIHQwID0geVtqKzJdICsgcyp4W2orMl07CisgICAgICAgICAgICB0MSA9IHlbaiszXSArIHMqeFtqKzNdOworICAgICAgICAgICAgeVtqKzJdID0gKGZsb2F0KXQwOworICAgICAgICAgICAgeVtqKzNdID0gKGZsb2F0KXQxOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCA7IGogPCBuOyBqKysgKQorICAgICAgICAgICAgeVtqXSA9IChmbG9hdCkoeVtqXSArIHMqeFtqXSk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitpY3ZNYXRyQVhQWTNfMzJmKCBpbnQgbSwgaW50IG4sIGNvbnN0IGZsb2F0KiB4LCBpbnQgbCwgZmxvYXQqIHksIGRvdWJsZSBoICkKK3sKKyAgICBpbnQgaSwgajsKKworICAgIGZvciggaSA9IDE7IGkgPCBtOyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICB5ICs9IGw7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBuIC0gNDsgaiArPSA0ICkKKyAgICAgICAgICAgIHMgKz0geFtqXSp5W2pdICsgeFtqKzFdKnlbaisxXSArIHhbaisyXSp5W2orMl0gKyB4W2orM10qeVtqKzNdOworCisgICAgICAgIGZvciggOyBqIDwgbjsgaisrICkgIHMgKz0geFtqXSp5W2pdOworCisgICAgICAgIHMgKj0gaDsKKyAgICAgICAgeVstMV0gPSAoZmxvYXQpKHMqeFstMV0pOworCisgICAgICAgIGZvciggaiA9IDA7IGogPD0gbiAtIDQ7IGogKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0MCA9IHlbal0gICArIHMqeFtqXTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IHlbaisxXSArIHMqeFtqKzFdOworICAgICAgICAgICAgeVtqXSAgID0gKGZsb2F0KXQwOworICAgICAgICAgICAgeVtqKzFdID0gKGZsb2F0KXQxOworICAgICAgICAgICAgdDAgPSB5W2orMl0gKyBzKnhbaisyXTsKKyAgICAgICAgICAgIHQxID0geVtqKzNdICsgcyp4W2orM107CisgICAgICAgICAgICB5W2orMl0gPSAoZmxvYXQpdDA7CisgICAgICAgICAgICB5W2orM10gPSAoZmxvYXQpdDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaiA8IG47IGorKyApIHlbal0gPSAoZmxvYXQpKHlbal0gKyBzKnhbal0pOworICAgIH0KK30KKworLyogYWNjdXJhdGUgaHlwb3RlbnVzZSBjYWxjdWxhdGlvbiAqLworc3RhdGljIGRvdWJsZQorcHl0aGFnKCBkb3VibGUgYSwgZG91YmxlIGIgKQoreworICAgIGEgPSBmYWJzKCBhICk7CisgICAgYiA9IGZhYnMoIGIgKTsKKyAgICBpZiggYSA+IGIgKQorICAgIHsKKyAgICAgICAgYiAvPSBhOworICAgICAgICBhICo9IHNxcnQoIDEuICsgYiAqIGIgKTsKKyAgICB9CisgICAgZWxzZSBpZiggYiAhPSAwICkKKyAgICB7CisgICAgICAgIGEgLz0gYjsKKyAgICAgICAgYSA9IGIgKiBzcXJ0KCAxLiArIGEgKiBhICk7CisgICAgfQorCisgICAgcmV0dXJuIGE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFYX0lURVJTICAzMAorCitzdGF0aWMgdm9pZAoraWN2U1ZEXzY0ZiggZG91YmxlKiBhLCBpbnQgbGRhLCBpbnQgbSwgaW50IG4sCisgICAgICAgICAgICBkb3VibGUqIHcsCisgICAgICAgICAgICBkb3VibGUqIHVULCBpbnQgbGR1VCwgaW50IG51LAorICAgICAgICAgICAgZG91YmxlKiB2VCwgaW50IGxkdlQsCisgICAgICAgICAgICBkb3VibGUqIGJ1ZmZlciApCit7CisgICAgZG91YmxlKiBlOworICAgIGRvdWJsZSogdGVtcDsKKyAgICBkb3VibGUgKncxLCAqZTE7CisgICAgZG91YmxlICpodjsKKyAgICBkb3VibGUga3UwID0gMCwga3YwID0gMDsKKyAgICBkb3VibGUgYW5vcm0gPSAwOworICAgIGRvdWJsZSAqYTEsICp1MCA9IHVULCAqdjAgPSB2VDsKKyAgICBkb3VibGUgc2NhbGUsIGg7CisgICAgaW50IGksIGosIGssIGw7CisgICAgaW50IG5tLCBtMSwgbjE7CisgICAgaW50IG52ID0gbjsKKyAgICBpbnQgaXRlcnMgPSAwOworICAgIGRvdWJsZSogaHYwID0gKGRvdWJsZSopY3ZTdGFja0FsbG9jKCAobSsyKSpzaXplb2YoaHYwWzBdKSkgKyAxOyAKKworICAgIGUgPSBidWZmZXI7CisgICAgdzEgPSB3OworICAgIGUxID0gZSArIDE7CisgICAgbm0gPSBuOworICAgIAorICAgIHRlbXAgPSBidWZmZXIgKyBubTsKKworICAgIG1lbXNldCggdywgMCwgbm0gKiBzaXplb2YoIHdbMF0gKSk7CisgICAgbWVtc2V0KCBlLCAwLCBubSAqIHNpemVvZiggZVswXSApKTsKKworICAgIG0xID0gbTsKKyAgICBuMSA9IG47CisKKyAgICAvKiB0cmFuc2Zvcm0gYSB0byBiaS1kaWFnb25hbCBmb3JtICovCisgICAgZm9yKCA7OyApCisgICAgeworICAgICAgICBpbnQgdXBkYXRlX3U7CisgICAgICAgIGludCB1cGRhdGVfdjsKKyAgICAgICAgCisgICAgICAgIGlmKCBtMSA9PSAwICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIHNjYWxlID0gaCA9IDA7CisgICAgICAgIHVwZGF0ZV91ID0gdVQgJiYgbTEgPiBtIC0gbnU7CisgICAgICAgIGh2ID0gdXBkYXRlX3UgPyB1VCA6IGh2MDsKKworICAgICAgICBmb3IoIGogPSAwLCBhMSA9IGE7IGogPCBtMTsgaisrLCBhMSArPSBsZGEgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdCA9IGExWzBdOworICAgICAgICAgICAgc2NhbGUgKz0gZmFicyggaHZbal0gPSB0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc2NhbGUgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBmID0gMS4vc2NhbGUsIGcsIHMgPSAwOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTE7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSAoaHZbal0gKj0gZik7CisgICAgICAgICAgICAgICAgcyArPSB0ICogdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZyA9IHNxcnQoIHMgKTsKKyAgICAgICAgICAgIGYgPSBodlswXTsKKyAgICAgICAgICAgIGlmKCBmID49IDAgKQorICAgICAgICAgICAgICAgIGcgPSAtZzsKKyAgICAgICAgICAgIGh2WzBdID0gZiAtIGc7CisgICAgICAgICAgICBoID0gMS4gLyAoZiAqIGcgLSBzKTsKKworICAgICAgICAgICAgbWVtc2V0KCB0ZW1wLCAwLCBuMSAqIHNpemVvZiggdGVtcFswXSApKTsKKworICAgICAgICAgICAgLyogY2FsYyB0ZW1wWzA6bi1pXSA9IGFbaTptLGk6bl0nKmh2WzA6bS1pXSAqLworICAgICAgICAgICAgaWN2TWF0ckFYUFlfNjRmKCBtMSwgbjEgLSAxLCBhICsgMSwgbGRhLCBodiwgdGVtcCArIDEsIDAgKTsKKyAgICAgICAgICAgIGZvciggayA9IDE7IGsgPCBuMTsgaysrICkgdGVtcFtrXSAqPSBoOworCisgICAgICAgICAgICAvKiBtb2RpZnkgYTogYVtpOm0saTpuXSA9IGFbaTptLGk6bl0gKyBodlswOm0taV0qdGVtcFswOm4taV0nICovCisgICAgICAgICAgICBpY3ZNYXRyQVhQWV82NGYoIG0xLCBuMSAtIDEsIHRlbXAgKyAxLCAwLCBodiwgYSArIDEsIGxkYSApOworICAgICAgICAgICAgKncxID0gZypzY2FsZTsKKyAgICAgICAgfQorICAgICAgICB3MSsrOworCisgICAgICAgIC8qIHN0b3JlIC0yLyhodicqaHYpICovCisgICAgICAgIGlmKCB1cGRhdGVfdSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtMSA9PSBtICkKKyAgICAgICAgICAgICAgICBrdTAgPSBoOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGh2Wy0xXSA9IGg7CisgICAgICAgIH0KKworICAgICAgICBhKys7CisgICAgICAgIG4xLS07CisgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICB2VCArPSBsZHZUICsgMTsKKworICAgICAgICBpZiggbjEgPT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzY2FsZSA9IGggPSAwOworICAgICAgICB1cGRhdGVfdiA9IHZUICYmIG4xID4gbiAtIG52OworCisgICAgICAgIGh2ID0gdXBkYXRlX3YgPyB2VCA6IGh2MDsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjE7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0ID0gYVtqXTsKKyAgICAgICAgICAgIHNjYWxlICs9IGZhYnMoIGh2W2pdID0gdCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNjYWxlICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZiA9IDEuL3NjYWxlLCBnLCBzID0gMDsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG4xOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gKGh2W2pdICo9IGYpOworICAgICAgICAgICAgICAgIHMgKz0gdCAqIHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGcgPSBzcXJ0KCBzICk7CisgICAgICAgICAgICBmID0gaHZbMF07CisgICAgICAgICAgICBpZiggZiA+PSAwICkKKyAgICAgICAgICAgICAgICBnID0gLWc7CisgICAgICAgICAgICBodlswXSA9IGYgLSBnOworICAgICAgICAgICAgaCA9IDEuIC8gKGYgKiBnIC0gcyk7CisgICAgICAgICAgICBodlstMV0gPSAwLjsKKworICAgICAgICAgICAgLyogdXBkYXRlIGFbaTptOmkrMTpuXSA9IGFbaTptLGkrMTpuXSArIChhW2k6bSxpKzE6bl0qaHZbMDptLWldKSouLi4gKi8KKyAgICAgICAgICAgIGljdk1hdHJBWFBZM182NGYoIG0xLCBuMSwgaHYsIGxkYSwgYSwgaCApOworCisgICAgICAgICAgICAqZTEgPSBnKnNjYWxlOworICAgICAgICB9CisgICAgICAgIGUxKys7CisKKyAgICAgICAgLyogc3RvcmUgLTIvKGh2JypodikgKi8KKyAgICAgICAgaWYoIHVwZGF0ZV92ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG4xID09IG4gKQorICAgICAgICAgICAgICAgIGt2MCA9IGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaHZbLTFdID0gaDsKKyAgICAgICAgfQorCisgICAgICAgIGEgKz0gbGRhOworICAgICAgICBtMS0tOworICAgICAgICBpZiggdVQgKQorICAgICAgICAgICAgdVQgKz0gbGR1VCArIDE7CisgICAgfQorCisgICAgbTEgLT0gbTEgIT0gMDsKKyAgICBuMSAtPSBuMSAhPSAwOworCisgICAgLyogYWNjdW11bGF0ZSBsZWZ0IHRyYW5zZm9ybWF0aW9ucyAqLworICAgIGlmKCB1VCApCisgICAgeworICAgICAgICBtMSA9IG0gLSBtMTsKKyAgICAgICAgdVQgPSB1MCArIG0xICogbGR1VDsKKyAgICAgICAgZm9yKCBpID0gbTE7IGkgPCBudTsgaSsrLCB1VCArPSBsZHVUICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCB1VCArIG0xLCAwLCAobSAtIG0xKSAqIHNpemVvZiggdVRbMF0gKSk7CisgICAgICAgICAgICB1VFtpXSA9IDEuOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gbTEgLSAxOyBpID49IDA7IGktLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzOworICAgICAgICAgICAgaW50IGxoID0gbnUgLSBpOworCisgICAgICAgICAgICBsID0gbSAtIGk7CisKKyAgICAgICAgICAgIGh2ID0gdTAgKyAobGR1VCArIDEpICogaTsKKyAgICAgICAgICAgIGggPSBpID09IDAgPyBrdTAgOiBodlstMV07CisKKyAgICAgICAgICAgIGFzc2VydCggaCA8PSAwICk7CisKKyAgICAgICAgICAgIGlmKCBoICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVUID0gaHY7CisgICAgICAgICAgICAgICAgaWN2TWF0ckFYUFkzXzY0ZiggbGgsIGwtMSwgaHYrMSwgbGR1VCwgdVQrMSwgaCApOworCisgICAgICAgICAgICAgICAgcyA9IGh2WzBdICogaDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbDsgaysrICkgaHZba10gKj0gczsKKyAgICAgICAgICAgICAgICBodlswXSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDE7IGogPCBsOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBodltqXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGxoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBodltqICogbGR1VF0gPSAwOworICAgICAgICAgICAgICAgIGh2WzBdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1VCA9IHUwOworICAgIH0KKworICAgIC8qIGFjY3VtdWxhdGUgcmlnaHQgdHJhbnNmb3JtYXRpb25zICovCisgICAgaWYoIHZUICkKKyAgICB7CisgICAgICAgIG4xID0gbiAtIG4xOworICAgICAgICB2VCA9IHYwICsgbjEgKiBsZHZUOworICAgICAgICBmb3IoIGkgPSBuMTsgaSA8IG52OyBpKyssIHZUICs9IGxkdlQgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIHZUICsgbjEsIDAsIChuIC0gbjEpICogc2l6ZW9mKCB2VFswXSApKTsKKyAgICAgICAgICAgIHZUW2ldID0gMS47CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGkgPSBuMSAtIDE7IGkgPj0gMDsgaS0tICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHM7CisgICAgICAgICAgICBpbnQgbGggPSBudiAtIGk7CisKKyAgICAgICAgICAgIGwgPSBuIC0gaTsKKyAgICAgICAgICAgIGh2ID0gdjAgKyAobGR2VCArIDEpICogaTsKKyAgICAgICAgICAgIGggPSBpID09IDAgPyBrdjAgOiBodlstMV07CisKKyAgICAgICAgICAgIGFzc2VydCggaCA8PSAwICk7CisKKyAgICAgICAgICAgIGlmKCBoICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZUID0gaHY7CisgICAgICAgICAgICAgICAgaWN2TWF0ckFYUFkzXzY0ZiggbGgsIGwtMSwgaHYrMSwgbGR2VCwgdlQrMSwgaCApOworCisgICAgICAgICAgICAgICAgcyA9IGh2WzBdICogaDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbDsgaysrICkgaHZba10gKj0gczsKKyAgICAgICAgICAgICAgICBodlswXSArPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaiA9IDE7IGogPCBsOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBodltqXSA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGxoOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBodltqICogbGR2VF0gPSAwOworICAgICAgICAgICAgICAgIGh2WzBdID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB2VCA9IHYwOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBubTsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB0bm9ybSA9IGZhYnMoIHdbaV0gKTsKKyAgICAgICAgdG5vcm0gKz0gZmFicyggZVtpXSApOworCisgICAgICAgIGlmKCBhbm9ybSA8IHRub3JtICkKKyAgICAgICAgICAgIGFub3JtID0gdG5vcm07CisgICAgfQorCisgICAgYW5vcm0gKj0gREJMX0VQU0lMT047CisKKyAgICAvKiBkaWFnb25hbGl6YXRpb24gb2YgdGhlIGJpZGlhZ29uYWwgZm9ybSAqLworICAgIGZvciggayA9IG5tIC0gMTsgayA+PSAwOyBrLS0gKQorICAgIHsKKyAgICAgICAgZG91YmxlIHogPSAwOworICAgICAgICBpdGVycyA9IDA7CisKKyAgICAgICAgZm9yKCA7OyApICAgICAgICAgICAgICAgLyogZG8gaXRlcmF0aW9ucyAqLworICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgYywgcywgZiwgZywgeCwgeTsKKyAgICAgICAgICAgIGludCBmbGFnID0gMDsKKworICAgICAgICAgICAgLyogdGVzdCBmb3Igc3BsaXR0aW5nICovCisgICAgICAgICAgICBmb3IoIGwgPSBrOyBsID49IDA7IGwtLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGZhYnMoZVtsXSkgPD0gYW5vcm0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGwgPiAwICk7CisgICAgICAgICAgICAgICAgaWYoIGZhYnMod1tsIC0gMV0pIDw9IGFub3JtICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCAhZmxhZyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYyA9IDA7CisgICAgICAgICAgICAgICAgcyA9IDE7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSBsOyBpIDw9IGs7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmID0gcyAqIGVbaV07CisKKyAgICAgICAgICAgICAgICAgICAgZVtpXSAqPSBjOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBhbm9ybSArIGZhYnMoIGYgKSA9PSBhbm9ybSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBnID0gd1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaCA9IHB5dGhhZyggZiwgZyApOworICAgICAgICAgICAgICAgICAgICB3W2ldID0gaDsKKyAgICAgICAgICAgICAgICAgICAgYyA9IGcgLyBoOworICAgICAgICAgICAgICAgICAgICBzID0gLWYgLyBoOworCisgICAgICAgICAgICAgICAgICAgIGlmKCB1VCApCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZHaXZlbnNfNjRmKCBtLCB1VCArIGxkdVQgKiAobCAtIDEpLCB1VCArIGxkdVQgKiBpLCBjLCBzICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB6ID0gd1trXTsKKyAgICAgICAgICAgIGlmKCBsID09IGsgfHwgaXRlcnMrKyA9PSBNQVhfSVRFUlMgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvKiBzaGlmdCBmcm9tIGJvdHRvbSAyeDIgbWlub3IgKi8KKyAgICAgICAgICAgIHggPSB3W2xdOworICAgICAgICAgICAgeSA9IHdbayAtIDFdOworICAgICAgICAgICAgZyA9IGVbayAtIDFdOworICAgICAgICAgICAgaCA9IGVba107CisgICAgICAgICAgICBmID0gMC41ICogKCgoZyArIHopIC8gaCkgKiAoKGcgLSB6KSAvIHkpICsgeSAvIGggLSBoIC8geSk7CisgICAgICAgICAgICBnID0gcHl0aGFnKCBmLCAxICk7CisgICAgICAgICAgICBpZiggZiA8IDAgKQorICAgICAgICAgICAgICAgIGcgPSAtZzsKKyAgICAgICAgICAgIGYgPSB4IC0gKHogLyB4KSAqIHogKyAoaCAvIHgpICogKHkgLyAoZiArIGcpIC0gaCk7CisgICAgICAgICAgICAvKiBuZXh0IFFSIHRyYW5zZm9ybWF0aW9uICovCisgICAgICAgICAgICBjID0gcyA9IDE7CisKKyAgICAgICAgICAgIGZvciggaSA9IGwgKyAxOyBpIDw9IGs7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZyA9IGVbaV07CisgICAgICAgICAgICAgICAgeSA9IHdbaV07CisgICAgICAgICAgICAgICAgaCA9IHMgKiBnOworICAgICAgICAgICAgICAgIGcgKj0gYzsKKyAgICAgICAgICAgICAgICB6ID0gcHl0aGFnKCBmLCBoICk7CisgICAgICAgICAgICAgICAgZVtpIC0gMV0gPSB6OworICAgICAgICAgICAgICAgIGMgPSBmIC8gejsKKyAgICAgICAgICAgICAgICBzID0gaCAvIHo7CisgICAgICAgICAgICAgICAgZiA9IHggKiBjICsgZyAqIHM7CisgICAgICAgICAgICAgICAgZyA9IC14ICogcyArIGcgKiBjOworICAgICAgICAgICAgICAgIGggPSB5ICogczsKKyAgICAgICAgICAgICAgICB5ICo9IGM7CisKKyAgICAgICAgICAgICAgICBpZiggdlQgKQorICAgICAgICAgICAgICAgICAgICBpY3ZHaXZlbnNfNjRmKCBuLCB2VCArIGxkdlQgKiAoaSAtIDEpLCB2VCArIGxkdlQgKiBpLCBjLCBzICk7CisKKyAgICAgICAgICAgICAgICB6ID0gcHl0aGFnKCBmLCBoICk7CisgICAgICAgICAgICAgICAgd1tpIC0gMV0gPSB6OworCisgICAgICAgICAgICAgICAgLyogcm90YXRpb24gY2FuIGJlIGFyYml0cmFyeSBpZiB6ID09IDAgKi8KKyAgICAgICAgICAgICAgICBpZiggeiAhPSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBmIC8gejsKKyAgICAgICAgICAgICAgICAgICAgcyA9IGggLyB6OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmID0gYyAqIGcgKyBzICogeTsKKyAgICAgICAgICAgICAgICB4ID0gLXMgKiBnICsgYyAqIHk7CisKKyAgICAgICAgICAgICAgICBpZiggdVQgKQorICAgICAgICAgICAgICAgICAgICBpY3ZHaXZlbnNfNjRmKCBtLCB1VCArIGxkdVQgKiAoaSAtIDEpLCB1VCArIGxkdVQgKiBpLCBjLCBzICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVbbF0gPSAwOworICAgICAgICAgICAgZVtrXSA9IGY7CisgICAgICAgICAgICB3W2tdID0geDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGl0ZXJhdGlvbiBsb29wICovCisKKyAgICAgICAgaWYoIGl0ZXJzID4gTUFYX0lURVJTICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmKCB6IDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdba10gPSAtejsKKyAgICAgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgIHZUW2ogKyBrICogbGR2VF0gPSAtdlRbaiArIGsgKiBsZHZUXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZGlhZ29uYWxpemF0aW9uIGxvb3AgKi8KKworICAgIC8qIHNvcnQgc2luZ3VsYXIgdmFsdWVzIGFuZCBjb3JyZXNwb25kaW5nIHZhbHVlcyAqLworICAgIGZvciggaSA9IDA7IGkgPCBubTsgaSsrICkKKyAgICB7CisgICAgICAgIGsgPSBpOworICAgICAgICBmb3IoIGogPSBpICsgMTsgaiA8IG5tOyBqKysgKQorICAgICAgICAgICAgaWYoIHdba10gPCB3W2pdICkKKyAgICAgICAgICAgICAgICBrID0gajsKKworICAgICAgICBpZiggayAhPSBpICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQ7CisgICAgICAgICAgICBDVl9TV0FQKCB3W2ldLCB3W2tdLCB0ICk7CisKKyAgICAgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHZUW2ogKyBsZHZUKmtdLCB2VFtqICsgbGR2VCppXSwgdCApOworCisgICAgICAgICAgICBpZiggdVQgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBtOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCB1VFtqICsgbGR1VCprXSwgdVRbaiArIGxkdVQqaV0sIHQgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2U1ZEXzMyZiggZmxvYXQqIGEsIGludCBsZGEsIGludCBtLCBpbnQgbiwKKyAgICAgICAgICAgIGZsb2F0KiB3LAorICAgICAgICAgICAgZmxvYXQqIHVULCBpbnQgbGR1VCwgaW50IG51LAorICAgICAgICAgICAgZmxvYXQqIHZULCBpbnQgbGR2VCwKKyAgICAgICAgICAgIGZsb2F0KiBidWZmZXIgKQoreworICAgIGZsb2F0KiBlOworICAgIGZsb2F0KiB0ZW1wOworICAgIGZsb2F0ICp3MSwgKmUxOworICAgIGZsb2F0ICpodjsKKyAgICBkb3VibGUga3UwID0gMCwga3YwID0gMDsKKyAgICBkb3VibGUgYW5vcm0gPSAwOworICAgIGZsb2F0ICphMSwgKnUwID0gdVQsICp2MCA9IHZUOworICAgIGRvdWJsZSBzY2FsZSwgaDsKKyAgICBpbnQgaSwgaiwgaywgbDsKKyAgICBpbnQgbm0sIG0xLCBuMTsKKyAgICBpbnQgbnYgPSBuOworICAgIGludCBpdGVycyA9IDA7CisgICAgZmxvYXQqIGh2MCA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCAobSsyKSpzaXplb2YoaHYwWzBdKSkgKyAxOworCisgICAgZSA9IGJ1ZmZlcjsKKworICAgIHcxID0gdzsKKyAgICBlMSA9IGUgKyAxOworICAgIG5tID0gbjsKKyAgICAKKyAgICB0ZW1wID0gYnVmZmVyICsgbm07CisKKyAgICBtZW1zZXQoIHcsIDAsIG5tICogc2l6ZW9mKCB3WzBdICkpOworICAgIG1lbXNldCggZSwgMCwgbm0gKiBzaXplb2YoIGVbMF0gKSk7CisKKyAgICBtMSA9IG07CisgICAgbjEgPSBuOworCisgICAgLyogdHJhbnNmb3JtIGEgdG8gYmktZGlhZ29uYWwgZm9ybSAqLworICAgIGZvciggOzsgKQorICAgIHsKKyAgICAgICAgaW50IHVwZGF0ZV91OworICAgICAgICBpbnQgdXBkYXRlX3Y7CisgICAgICAgIAorICAgICAgICBpZiggbTEgPT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzY2FsZSA9IGggPSAwOworCisgICAgICAgIHVwZGF0ZV91ID0gdVQgJiYgbTEgPiBtIC0gbnU7CisgICAgICAgIGh2ID0gdXBkYXRlX3UgPyB1VCA6IGh2MDsKKworICAgICAgICBmb3IoIGogPSAwLCBhMSA9IGE7IGogPCBtMTsgaisrLCBhMSArPSBsZGEgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdCA9IGExWzBdOworICAgICAgICAgICAgc2NhbGUgKz0gZmFicyggaHZbal0gPSAoZmxvYXQpdCApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNjYWxlICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZiA9IDEuL3NjYWxlLCBnLCBzID0gMDsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG0xOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gKGh2W2pdID0gKGZsb2F0KShodltqXSpmKSk7CisgICAgICAgICAgICAgICAgcyArPSB0ICogdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZyA9IHNxcnQoIHMgKTsKKyAgICAgICAgICAgIGYgPSBodlswXTsKKyAgICAgICAgICAgIGlmKCBmID49IDAgKQorICAgICAgICAgICAgICAgIGcgPSAtZzsKKyAgICAgICAgICAgIGh2WzBdID0gKGZsb2F0KShmIC0gZyk7CisgICAgICAgICAgICBoID0gMS4gLyAoZiAqIGcgLSBzKTsKKworICAgICAgICAgICAgbWVtc2V0KCB0ZW1wLCAwLCBuMSAqIHNpemVvZiggdGVtcFswXSApKTsKKworICAgICAgICAgICAgLyogY2FsYyB0ZW1wWzA6bi1pXSA9IGFbaTptLGk6bl0nKmh2WzA6bS1pXSAqLworICAgICAgICAgICAgaWN2TWF0ckFYUFlfMzJmKCBtMSwgbjEgLSAxLCBhICsgMSwgbGRhLCBodiwgdGVtcCArIDEsIDAgKTsKKworICAgICAgICAgICAgZm9yKCBrID0gMTsgayA8IG4xOyBrKysgKSB0ZW1wW2tdID0gKGZsb2F0KSh0ZW1wW2tdKmgpOworCisgICAgICAgICAgICAvKiBtb2RpZnkgYTogYVtpOm0saTpuXSA9IGFbaTptLGk6bl0gKyBodlswOm0taV0qdGVtcFswOm4taV0nICovCisgICAgICAgICAgICBpY3ZNYXRyQVhQWV8zMmYoIG0xLCBuMSAtIDEsIHRlbXAgKyAxLCAwLCBodiwgYSArIDEsIGxkYSApOworICAgICAgICAgICAgKncxID0gKGZsb2F0KShnKnNjYWxlKTsKKyAgICAgICAgfQorICAgICAgICB3MSsrOworICAgICAgICAKKyAgICAgICAgLyogc3RvcmUgLTIvKGh2JypodikgKi8KKyAgICAgICAgaWYoIHVwZGF0ZV91ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG0xID09IG0gKQorICAgICAgICAgICAgICAgIGt1MCA9IGg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaHZbLTFdID0gKGZsb2F0KWg7CisgICAgICAgIH0KKworICAgICAgICBhKys7CisgICAgICAgIG4xLS07CisgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICB2VCArPSBsZHZUICsgMTsKKworICAgICAgICBpZiggbjEgPT0gMCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBzY2FsZSA9IGggPSAwOworICAgICAgICB1cGRhdGVfdiA9IHZUICYmIG4xID4gbiAtIG52OworICAgICAgICBodiA9IHVwZGF0ZV92ID8gdlQgOiBodjA7CisKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IG4xOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdCA9IGFbal07CisgICAgICAgICAgICBzY2FsZSArPSBmYWJzKCBodltqXSA9IChmbG9hdCl0ICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc2NhbGUgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBmID0gMS4vc2NhbGUsIGcsIHMgPSAwOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjE7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSAoaHZbal0gPSAoZmxvYXQpKGh2W2pdKmYpKTsKKyAgICAgICAgICAgICAgICBzICs9IHQgKiB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBnID0gc3FydCggcyApOworICAgICAgICAgICAgZiA9IGh2WzBdOworICAgICAgICAgICAgaWYoIGYgPj0gMCApCisgICAgICAgICAgICAgICAgZyA9IC1nOworICAgICAgICAgICAgaHZbMF0gPSAoZmxvYXQpKGYgLSBnKTsKKyAgICAgICAgICAgIGggPSAxLiAvIChmICogZyAtIHMpOworICAgICAgICAgICAgaHZbLTFdID0gMC5mOworCisgICAgICAgICAgICAvKiB1cGRhdGUgYVtpOm06aSsxOm5dID0gYVtpOm0saSsxOm5dICsgKGFbaTptLGkrMTpuXSpodlswOm0taV0pKi4uLiAqLworICAgICAgICAgICAgaWN2TWF0ckFYUFkzXzMyZiggbTEsIG4xLCBodiwgbGRhLCBhLCBoICk7CisKKyAgICAgICAgICAgICplMSA9IChmbG9hdCkoZypzY2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgZTErKzsKKworICAgICAgICAvKiBzdG9yZSAtMi8oaHYnKmh2KSAqLworICAgICAgICBpZiggdXBkYXRlX3YgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbjEgPT0gbiApCisgICAgICAgICAgICAgICAga3YwID0gaDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBodlstMV0gPSAoZmxvYXQpaDsKKyAgICAgICAgfQorCisgICAgICAgIGEgKz0gbGRhOworICAgICAgICBtMS0tOworICAgICAgICBpZiggdVQgKQorICAgICAgICAgICAgdVQgKz0gbGR1VCArIDE7CisgICAgfQorCisgICAgbTEgLT0gbTEgIT0gMDsKKyAgICBuMSAtPSBuMSAhPSAwOworCisgICAgLyogYWNjdW11bGF0ZSBsZWZ0IHRyYW5zZm9ybWF0aW9ucyAqLworICAgIGlmKCB1VCApCisgICAgeworICAgICAgICBtMSA9IG0gLSBtMTsKKyAgICAgICAgdVQgPSB1MCArIG0xICogbGR1VDsKKyAgICAgICAgZm9yKCBpID0gbTE7IGkgPCBudTsgaSsrLCB1VCArPSBsZHVUICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCB1VCArIG0xLCAwLCAobSAtIG0xKSAqIHNpemVvZiggdVRbMF0gKSk7CisgICAgICAgICAgICB1VFtpXSA9IDEuOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gbTEgLSAxOyBpID49IDA7IGktLSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzOworICAgICAgICAgICAgaW50IGxoID0gbnUgLSBpOworCisgICAgICAgICAgICBsID0gbSAtIGk7CisKKyAgICAgICAgICAgIGh2ID0gdTAgKyAobGR1VCArIDEpICogaTsKKyAgICAgICAgICAgIGggPSBpID09IDAgPyBrdTAgOiBodlstMV07CisKKyAgICAgICAgICAgIGFzc2VydCggaCA8PSAwICk7CisKKyAgICAgICAgICAgIGlmKCBoICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVUID0gaHY7CisgICAgICAgICAgICAgICAgaWN2TWF0ckFYUFkzXzMyZiggbGgsIGwtMSwgaHYrMSwgbGR1VCwgdVQrMSwgaCApOworCisgICAgICAgICAgICAgICAgcyA9IGh2WzBdICogaDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbDsgaysrICkgaHZba10gPSAoZmxvYXQpKGh2W2tdKnMpOworICAgICAgICAgICAgICAgIGh2WzBdICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGw7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGh2W2pdID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDwgbGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGh2W2ogKiBsZHVUXSA9IDA7CisgICAgICAgICAgICAgICAgaHZbMF0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHVUID0gdTA7CisgICAgfQorCisgICAgLyogYWNjdW11bGF0ZSByaWdodCB0cmFuc2Zvcm1hdGlvbnMgKi8KKyAgICBpZiggdlQgKQorICAgIHsKKyAgICAgICAgbjEgPSBuIC0gbjE7CisgICAgICAgIHZUID0gdjAgKyBuMSAqIGxkdlQ7CisgICAgICAgIGZvciggaSA9IG4xOyBpIDwgbnY7IGkrKywgdlQgKz0gbGR2VCApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1lbXNldCggdlQgKyBuMSwgMCwgKG4gLSBuMSkgKiBzaXplb2YoIHZUWzBdICkpOworICAgICAgICAgICAgdlRbaV0gPSAxLjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IG4xIC0gMTsgaSA+PSAwOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgczsKKyAgICAgICAgICAgIGludCBsaCA9IG52IC0gaTsKKworICAgICAgICAgICAgbCA9IG4gLSBpOworICAgICAgICAgICAgaHYgPSB2MCArIChsZHZUICsgMSkgKiBpOworICAgICAgICAgICAgaCA9IGkgPT0gMCA/IGt2MCA6IGh2Wy0xXTsKKworICAgICAgICAgICAgYXNzZXJ0KCBoIDw9IDAgKTsKKworICAgICAgICAgICAgaWYoIGggIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdlQgPSBodjsKKyAgICAgICAgICAgICAgICBpY3ZNYXRyQVhQWTNfMzJmKCBsaCwgbC0xLCBodisxLCBsZHZULCB2VCsxLCBoICk7CisKKyAgICAgICAgICAgICAgICBzID0gaHZbMF0gKiBoOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBsOyBrKysgKSBodltrXSA9IChmbG9hdCkoaHZba10qcyk7CisgICAgICAgICAgICAgICAgaHZbMF0gKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDwgbDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgaHZbal0gPSAwOworICAgICAgICAgICAgICAgIGZvciggaiA9IDE7IGogPCBsaDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgaHZbaiAqIGxkdlRdID0gMDsKKyAgICAgICAgICAgICAgICBodlswXSA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdlQgPSB2MDsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbm07IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgdG5vcm0gPSBmYWJzKCB3W2ldICk7CisgICAgICAgIHRub3JtICs9IGZhYnMoIGVbaV0gKTsKKworICAgICAgICBpZiggYW5vcm0gPCB0bm9ybSApCisgICAgICAgICAgICBhbm9ybSA9IHRub3JtOworICAgIH0KKworICAgIGFub3JtICo9IEZMVF9FUFNJTE9OOworCisgICAgLyogZGlhZ29uYWxpemF0aW9uIG9mIHRoZSBiaWRpYWdvbmFsIGZvcm0gKi8KKyAgICBmb3IoIGsgPSBubSAtIDE7IGsgPj0gMDsgay0tICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB6ID0gMDsKKyAgICAgICAgaXRlcnMgPSAwOworCisgICAgICAgIGZvciggOzsgKSAgICAgICAgICAgICAgIC8qIGRvIGl0ZXJhdGlvbnMgKi8KKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGMsIHMsIGYsIGcsIHgsIHk7CisgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisKKyAgICAgICAgICAgIC8qIHRlc3QgZm9yIHNwbGl0dGluZyAqLworICAgICAgICAgICAgZm9yKCBsID0gazsgbCA+PSAwOyBsLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBmYWJzKCBlW2xdICkgPD0gYW5vcm0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhc3NlcnQoIGwgPiAwICk7CisgICAgICAgICAgICAgICAgaWYoIGZhYnMoIHdbbCAtIDFdICkgPD0gYW5vcm0gKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoICFmbGFnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMDsKKyAgICAgICAgICAgICAgICBzID0gMTsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IGw7IGkgPD0gazsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGYgPSBzICogZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgZVtpXSA9IChmbG9hdCkoZVtpXSpjKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggYW5vcm0gKyBmYWJzKCBmICkgPT0gYW5vcm0gKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICAgICAgZyA9IHdbaV07CisgICAgICAgICAgICAgICAgICAgIGggPSBweXRoYWcoIGYsIGcgKTsKKyAgICAgICAgICAgICAgICAgICAgd1tpXSA9IChmbG9hdCloOworICAgICAgICAgICAgICAgICAgICBjID0gZyAvIGg7CisgICAgICAgICAgICAgICAgICAgIHMgPSAtZiAvIGg7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHVUICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkdpdmVuc18zMmYoIG0sIHVUICsgbGR1VCAqIChsIC0gMSksIHVUICsgbGR1VCAqIGksIGMsIHMgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHogPSB3W2tdOworICAgICAgICAgICAgaWYoIGwgPT0gayB8fCBpdGVycysrID09IE1BWF9JVEVSUyApCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIC8qIHNoaWZ0IGZyb20gYm90dG9tIDJ4MiBtaW5vciAqLworICAgICAgICAgICAgeCA9IHdbbF07CisgICAgICAgICAgICB5ID0gd1trIC0gMV07CisgICAgICAgICAgICBnID0gZVtrIC0gMV07CisgICAgICAgICAgICBoID0gZVtrXTsKKyAgICAgICAgICAgIGYgPSAwLjUgKiAoKChnICsgeikgLyBoKSAqICgoZyAtIHopIC8geSkgKyB5IC8gaCAtIGggLyB5KTsKKyAgICAgICAgICAgIGcgPSBweXRoYWcoIGYsIDEgKTsKKyAgICAgICAgICAgIGlmKCBmIDwgMCApCisgICAgICAgICAgICAgICAgZyA9IC1nOworICAgICAgICAgICAgZiA9IHggLSAoeiAvIHgpICogeiArIChoIC8geCkgKiAoeSAvIChmICsgZykgLSBoKTsKKyAgICAgICAgICAgIC8qIG5leHQgUVIgdHJhbnNmb3JtYXRpb24gKi8KKyAgICAgICAgICAgIGMgPSBzID0gMTsKKworICAgICAgICAgICAgZm9yKCBpID0gbCArIDE7IGkgPD0gazsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBnID0gZVtpXTsKKyAgICAgICAgICAgICAgICB5ID0gd1tpXTsKKyAgICAgICAgICAgICAgICBoID0gcyAqIGc7CisgICAgICAgICAgICAgICAgZyAqPSBjOworICAgICAgICAgICAgICAgIHogPSBweXRoYWcoIGYsIGggKTsKKyAgICAgICAgICAgICAgICBlW2kgLSAxXSA9IChmbG9hdCl6OworICAgICAgICAgICAgICAgIGMgPSBmIC8gejsKKyAgICAgICAgICAgICAgICBzID0gaCAvIHo7CisgICAgICAgICAgICAgICAgZiA9IHggKiBjICsgZyAqIHM7CisgICAgICAgICAgICAgICAgZyA9IC14ICogcyArIGcgKiBjOworICAgICAgICAgICAgICAgIGggPSB5ICogczsKKyAgICAgICAgICAgICAgICB5ICo9IGM7CisKKyAgICAgICAgICAgICAgICBpZiggdlQgKQorICAgICAgICAgICAgICAgICAgICBpY3ZHaXZlbnNfMzJmKCBuLCB2VCArIGxkdlQgKiAoaSAtIDEpLCB2VCArIGxkdlQgKiBpLCBjLCBzICk7CisKKyAgICAgICAgICAgICAgICB6ID0gcHl0aGFnKCBmLCBoICk7CisgICAgICAgICAgICAgICAgd1tpIC0gMV0gPSAoZmxvYXQpejsKKworICAgICAgICAgICAgICAgIC8qIHJvdGF0aW9uIGNhbiBiZSBhcmJpdHJhcnkgaWYgeiA9PSAwICovCisgICAgICAgICAgICAgICAgaWYoIHogIT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjID0gZiAvIHo7CisgICAgICAgICAgICAgICAgICAgIHMgPSBoIC8gejsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZiA9IGMgKiBnICsgcyAqIHk7CisgICAgICAgICAgICAgICAgeCA9IC1zICogZyArIGMgKiB5OworCisgICAgICAgICAgICAgICAgaWYoIHVUICkKKyAgICAgICAgICAgICAgICAgICAgaWN2R2l2ZW5zXzMyZiggbSwgdVQgKyBsZHVUICogKGkgLSAxKSwgdVQgKyBsZHVUICogaSwgYywgcyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBlW2xdID0gMDsKKyAgICAgICAgICAgIGVba10gPSAoZmxvYXQpZjsKKyAgICAgICAgICAgIHdba10gPSAoZmxvYXQpeDsKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGl0ZXJhdGlvbiBsb29wICovCisKKyAgICAgICAgaWYoIGl0ZXJzID4gTUFYX0lURVJTICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGlmKCB6IDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdba10gPSAoZmxvYXQpKC16KTsKKyAgICAgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgIHZUW2ogKyBrICogbGR2VF0gPSAtdlRbaiArIGsgKiBsZHZUXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgZGlhZ29uYWxpemF0aW9uIGxvb3AgKi8KKworICAgIC8qIHNvcnQgc2luZ3VsYXIgdmFsdWVzIGFuZCBjb3JyZXNwb25kaW5nIHZlY3RvcnMgKi8KKyAgICBmb3IoIGkgPSAwOyBpIDwgbm07IGkrKyApCisgICAgeworICAgICAgICBrID0gaTsKKyAgICAgICAgZm9yKCBqID0gaSArIDE7IGogPCBubTsgaisrICkKKyAgICAgICAgICAgIGlmKCB3W2tdIDwgd1tqXSApCisgICAgICAgICAgICAgICAgayA9IGo7CisKKyAgICAgICAgaWYoIGsgIT0gaSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0IHQ7CisgICAgICAgICAgICBDVl9TV0FQKCB3W2ldLCB3W2tdLCB0ICk7CisKKyAgICAgICAgICAgIGlmKCB2VCApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHZUW2ogKyBsZHZUKmtdLCB2VFtqICsgbGR2VCppXSwgdCApOworCisgICAgICAgICAgICBpZiggdVQgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBtOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCB1VFtqICsgbGR1VCprXSwgdVRbaiArIGxkdVQqaV0sIHQgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2U1ZCa1NiXzY0ZiggaW50IG0sIGludCBuLCBjb25zdCBkb3VibGUqIHcsCisgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHVULCBpbnQgbGR1VCwKKyAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogdlQsIGludCBsZHZULAorICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBiLCBpbnQgbGRiLCBpbnQgbmIsCisgICAgICAgICAgICAgICBkb3VibGUqIHgsIGludCBsZHgsIGRvdWJsZSogYnVmZmVyICkKK3sKKyAgICBkb3VibGUgdGhyZXNob2xkID0gMDsKKyAgICBpbnQgaSwgaiwgbm0gPSBNSU4oIG0sIG4gKTsKKworICAgIGlmKCAhYiApCisgICAgICAgIG5iID0gbTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICBtZW1zZXQoIHggKyBpKmxkeCwgMCwgbmIqc2l6ZW9mKHhbMF0pKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBubTsgaSsrICkKKyAgICAgICAgdGhyZXNob2xkICs9IHdbaV07CisgICAgdGhyZXNob2xkICo9IDIqREJMX0VQU0lMT047CisKKyAgICAvKiB2VCAqIGludih3KSAqIHVUICogYiAqLworICAgIGZvciggaSA9IDA7IGkgPCBubTsgaSsrLCB1VCArPSBsZHVULCB2VCArPSBsZHZUICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB3aSA9IHdbaV07CisKKyAgICAgICAgaWYoIHdpID4gdGhyZXNob2xkICkKKyAgICAgICAgeworICAgICAgICAgICAgd2kgPSAxLi93aTsKKworICAgICAgICAgICAgaWYoIG5iID09IDEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzID0gMDsKKyAgICAgICAgICAgICAgICBpZiggYiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbGRiID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IG0gLSA0OyBqICs9IDQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgKz0gdVRbal0qYltqXSArIHVUW2orMV0qYltqKzFdICsgdVRbaisyXSpiW2orMl0gKyB1VFtqKzNdKmJbaiszXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggOyBqIDwgbTsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHVUW2pdKmJbal07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHVUW2pdKmJbaipsZGJdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcyA9IHVUWzBdOworICAgICAgICAgICAgICAgIHMgKj0gd2k7CisgICAgICAgICAgICAgICAgaWYoIGxkeCA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gbiAtIDQ7IGogKz0gNCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IHhbal0gKyBzKnZUW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQxID0geFtqKzFdICsgcyp2VFtqKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgeFtqXSA9IHQwOworICAgICAgICAgICAgICAgICAgICAgICAgeFtqKzFdID0gdDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0MCA9IHhbaisyXSArIHMqdlRbaisyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQxID0geFtqKzNdICsgcyp2VFtqKzNdOworICAgICAgICAgICAgICAgICAgICAgICAgeFtqKzJdID0gdDA7CisgICAgICAgICAgICAgICAgICAgICAgICB4W2orM10gPSB0MTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGZvciggOyBqIDwgbjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHhbal0gKz0gcyp2VFtqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICB4W2oqbGR4XSArPSBzKnZUW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggYiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIGJ1ZmZlciwgMCwgbmIqc2l6ZW9mKGJ1ZmZlclswXSkpOworICAgICAgICAgICAgICAgICAgICBpY3ZNYXRyQVhQWV82NGYoIG0sIG5iLCBiLCBsZGIsIHVULCBidWZmZXIsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG5iOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW2pdICo9IHdpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmI7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbal0gPSB1VFtqXSp3aTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWN2TWF0ckFYUFlfNjRmKCBuLCBuYiwgYnVmZmVyLCAwLCB2VCwgeCwgbGR4ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK2ljdlNWQmtTYl8zMmYoIGludCBtLCBpbnQgbiwgY29uc3QgZmxvYXQqIHcsCisgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdVQsIGludCBsZHVULAorICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHZULCBpbnQgbGR2VCwKKyAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBiLCBpbnQgbGRiLCBpbnQgbmIsCisgICAgICAgICAgICAgICBmbG9hdCogeCwgaW50IGxkeCwgZmxvYXQqIGJ1ZmZlciApCit7CisgICAgZmxvYXQgdGhyZXNob2xkID0gMC5mOworICAgIGludCBpLCBqLCBubSA9IE1JTiggbSwgbiApOworCisgICAgaWYoICFiICkKKyAgICAgICAgbmIgPSBtOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIG1lbXNldCggeCArIGkqbGR4LCAwLCBuYipzaXplb2YoeFswXSkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IG5tOyBpKysgKQorICAgICAgICB0aHJlc2hvbGQgKz0gd1tpXTsKKyAgICB0aHJlc2hvbGQgKj0gMipGTFRfRVBTSUxPTjsKKworICAgIC8qIHZUICogaW52KHcpICogdVQgKiBiICovCisgICAgZm9yKCBpID0gMDsgaSA8IG5tOyBpKyssIHVUICs9IGxkdVQsIHZUICs9IGxkdlQgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHdpID0gd1tpXTsKKyAgICAgICAgCisgICAgICAgIGlmKCB3aSA+IHRocmVzaG9sZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHdpID0gMS4vd2k7CisKKyAgICAgICAgICAgIGlmKCBuYiA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcyA9IDA7CisgICAgICAgICAgICAgICAgaWYoIGIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGxkYiA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBtIC0gNDsgaiArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICs9IHVUW2pdKmJbal0gKyB1VFtqKzFdKmJbaisxXSArIHVUW2orMl0qYltqKzJdICsgdVRbaiszXSpiW2orM107CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaiA8IG07IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB1VFtqXSpiW2pdOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyArPSB1VFtqXSpiW2oqbGRiXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHMgPSB1VFswXTsKKyAgICAgICAgICAgICAgICBzICo9IHdpOworCisgICAgICAgICAgICAgICAgaWYoIGxkeCA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gbiAtIDQ7IGogKz0gNCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IHhbal0gKyBzKnZUW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQxID0geFtqKzFdICsgcyp2VFtqKzFdOworICAgICAgICAgICAgICAgICAgICAgICAgeFtqXSA9IChmbG9hdCl0MDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhbaisxXSA9IChmbG9hdCl0MTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQwID0geFtqKzJdICsgcyp2VFtqKzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdDEgPSB4W2orM10gKyBzKnZUW2orM107CisgICAgICAgICAgICAgICAgICAgICAgICB4W2orMl0gPSAoZmxvYXQpdDA7CisgICAgICAgICAgICAgICAgICAgICAgICB4W2orM10gPSAoZmxvYXQpdDE7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IoIDsgaiA8IG47IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICB4W2pdID0gKGZsb2F0KSh4W2pdICsgcyp2VFtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBuOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeFtqKmxkeF0gPSAoZmxvYXQpKHhbaipsZHhdICsgcyp2VFtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBiICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1lbXNldCggYnVmZmVyLCAwLCBuYipzaXplb2YoYnVmZmVyWzBdKSk7CisgICAgICAgICAgICAgICAgICAgIGljdk1hdHJBWFBZXzMyZiggbSwgbmIsIGIsIGxkYiwgdVQsIGJ1ZmZlciwgMCApOworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmI7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJbal0gPSAoZmxvYXQpKGJ1ZmZlcltqXSp3aSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBuYjsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltqXSA9IChmbG9hdCkodVRbal0qd2kpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpY3ZNYXRyQVhQWV8zMmYoIG4sIG5iLCBidWZmZXIsIDAsIHZULCB4LCBsZHggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworCitDVl9JTVBMICB2b2lkCitjdlNWRCggQ3ZBcnIqIGFhcnIsIEN2QXJyKiB3YXJyLCBDdkFyciogdWFyciwgQ3ZBcnIqIHZhcnIsIGludCBmbGFncyApCit7CisgICAgdWNoYXIqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTVkQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBhc3R1YiwgKmEgPSAoQ3ZNYXQqKWFhcnI7CisgICAgQ3ZNYXQgd3N0dWIsICp3ID0gKEN2TWF0Kil3YXJyOworICAgIEN2TWF0IHVzdHViLCAqdTsKKyAgICBDdk1hdCB2c3R1YiwgKnY7CisgICAgQ3ZNYXQgdG1hdDsKKyAgICB1Y2hhciogdHcgPSAwOworICAgIGludCB0eXBlOworICAgIGludCBhX2J1Zl9vZmZzZXQgPSAwLCB1X2J1Zl9vZmZzZXQgPSAwLCBidWZfc2l6ZSwgcGl4X3NpemU7CisgICAgaW50IHRlbXBfdSA9IDAsIC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBVIGlzIG5lZWRlZCAqLworICAgICAgICB0X3N2ZDsgLyogc3BlY2lhbCBjYXNlOiBhLT5yb3dzIDwgYS0+Y29scyAqLworICAgIGludCBtLCBuOworICAgIGludCB3X3Jvd3MsIHdfY29sczsKKyAgICBpbnQgdV9yb3dzID0gMCwgdV9jb2xzID0gMDsKKyAgICBpbnQgd19pc19tYXQgPSAwOworCisgICAgaWYoICFDVl9JU19NQVQoIGEgKSkKKyAgICAgICAgQ1ZfQ0FMTCggYSA9IGN2R2V0TWF0KCBhLCAmYXN0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVCggdyApKQorICAgICAgICBDVl9DQUxMKCB3ID0gY3ZHZXRNYXQoIHcsICZ3c3R1YiApKTsKKworICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBhLCB3ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiIiApOworCisgICAgaWYoIGEtPnJvd3MgPj0gYS0+Y29scyApCisgICAgeworICAgICAgICBtID0gYS0+cm93czsKKyAgICAgICAgbiA9IGEtPmNvbHM7CisgICAgICAgIHdfcm93cyA9IHctPnJvd3M7CisgICAgICAgIHdfY29scyA9IHctPmNvbHM7CisgICAgICAgIHRfc3ZkID0gMDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZBcnIqIHQ7CisgICAgICAgIENWX1NXQVAoIHVhcnIsIHZhcnIsIHQgKTsKKworICAgICAgICBmbGFncyA9IChmbGFncyAmIENWX1NWRF9VX1QgPyBDVl9TVkRfVl9UIDogMCl8CisgICAgICAgICAgICAgICAgKGZsYWdzICYgQ1ZfU1ZEX1ZfVCA/IENWX1NWRF9VX1QgOiAwKTsKKyAgICAgICAgbSA9IGEtPmNvbHM7CisgICAgICAgIG4gPSBhLT5yb3dzOworICAgICAgICB3X3Jvd3MgPSB3LT5jb2xzOworICAgICAgICB3X2NvbHMgPSB3LT5yb3dzOworICAgICAgICB0X3N2ZCA9IDE7CisgICAgfQorCisgICAgdSA9IChDdk1hdCopdWFycjsKKyAgICB2ID0gKEN2TWF0Kil2YXJyOworCisgICAgd19pc19tYXQgPSB3X2NvbHMgPiAxICYmIHdfcm93cyA+IDE7CisKKyAgICBpZiggIXdfaXNfbWF0ICYmIENWX0lTX01BVF9DT05UKHctPnR5cGUpICYmIHdfY29scyArIHdfcm93cyAtIDEgPT0gbiApCisgICAgICAgIHR3ID0gdy0+ZGF0YS5wdHI7CisKKyAgICBpZiggdSApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVCggdSApKQorICAgICAgICAgICAgQ1ZfQ0FMTCggdSA9IGN2R2V0TWF0KCB1LCAmdXN0dWIgKSk7CisKKyAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9TVkRfVV9UKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVfcm93cyA9IHUtPnJvd3M7CisgICAgICAgICAgICB1X2NvbHMgPSB1LT5jb2xzOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdV9yb3dzID0gdS0+Y29sczsKKyAgICAgICAgICAgIHVfY29scyA9IHUtPnJvd3M7CisgICAgICAgIH0KKworICAgICAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggYSwgdSApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZEZvcm1hdHMsICIiICk7CisKKyAgICAgICAgaWYoIHVfcm93cyAhPSBtIHx8ICh1X2NvbHMgIT0gbSAmJiB1X2NvbHMgIT0gbikpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICF0X3N2ZCA/ICJVIG1hdHJpeCBoYXMgdW5hcHByb3ByaWF0ZSBzaXplIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWIG1hdHJpeCBoYXMgdW5hcHByb3ByaWF0ZSBzaXplIiApOworICAgICAgICAgICAgCisgICAgICAgIHRlbXBfdSA9ICh1X3Jvd3MgIT0gdV9jb2xzICYmICEoZmxhZ3MgJiBDVl9TVkRfVV9UKSkgfHwgdS0+ZGF0YS5wdHI9PWEtPmRhdGEucHRyOworCisgICAgICAgIGlmKCB3X2lzX21hdCAmJiB1X2NvbHMgIT0gd19yb3dzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIXRfc3ZkID8gIlUgYW5kIFcgaGF2ZSBpbmNvbXBhdGlibGUgc2l6ZXMiIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYgYW5kIFcgaGF2ZSBpbmNvbXBhdGlibGUgc2l6ZXMiICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHUgPSAmdXN0dWI7CisgICAgICAgIHUtPmRhdGEucHRyID0gMDsKKyAgICAgICAgdS0+c3RlcCA9IDA7CisgICAgfQorCisgICAgaWYoIHYgKQorICAgIHsKKyAgICAgICAgaW50IHZfcm93cywgdl9jb2xzOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKCB2ICkpCisgICAgICAgICAgICBDVl9DQUxMKCB2ID0gY3ZHZXRNYXQoIHYsICZ2c3R1YiApKTsKKworICAgICAgICBpZiggIShmbGFncyAmIENWX1NWRF9WX1QpICkKKyAgICAgICAgeworICAgICAgICAgICAgdl9yb3dzID0gdi0+cm93czsKKyAgICAgICAgICAgIHZfY29scyA9IHYtPmNvbHM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB2X3Jvd3MgPSB2LT5jb2xzOworICAgICAgICAgICAgdl9jb2xzID0gdi0+cm93czsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKCBhLCB2ICkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIiIgKTsKKworICAgICAgICBpZiggdl9yb3dzICE9IG4gfHwgdl9jb2xzICE9IG4gKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCB0X3N2ZCA/ICJVIG1hdHJpeCBoYXMgdW5hcHByb3ByaWF0ZSBzaXplIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYgbWF0cml4IGhhcyB1bmFwcHJvcHJpYXRlIHNpemUiICk7CisKKyAgICAgICAgaWYoIHdfaXNfbWF0ICYmIHdfY29scyAhPSB2X2NvbHMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCB0X3N2ZCA/ICJVIGFuZCBXIGhhdmUgaW5jb21wYXRpYmxlIHNpemVzIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlYgYW5kIFcgaGF2ZSBpbmNvbXBhdGlibGUgc2l6ZXMiICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHYgPSAmdnN0dWI7CisgICAgICAgIHYtPmRhdGEucHRyID0gMDsKKyAgICAgICAgdi0+c3RlcCA9IDA7CisgICAgfQorCisgICAgdHlwZSA9IENWX01BVF9UWVBFKCBhLT50eXBlICk7CisgICAgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgYnVmX3NpemUgPSBuKjIgKyBtOworCisgICAgaWYoICEoZmxhZ3MgJiBDVl9TVkRfTU9ESUZZX0EpICkKKyAgICB7CisgICAgICAgIGFfYnVmX29mZnNldCA9IGJ1Zl9zaXplOworICAgICAgICBidWZfc2l6ZSArPSBhLT5yb3dzKmEtPmNvbHM7CisgICAgfQorCisgICAgaWYoIHRlbXBfdSApCisgICAgeworICAgICAgICB1X2J1Zl9vZmZzZXQgPSBidWZfc2l6ZTsKKyAgICAgICAgYnVmX3NpemUgKz0gdS0+cm93cyp1LT5jb2xzOworICAgIH0KKworICAgIGJ1Zl9zaXplICo9IHBpeF9zaXplOworCisgICAgaWYoIGJ1Zl9zaXplIDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBidWZfc2l6ZSApOworICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9ICh1Y2hhciopY3ZBbGxvYyggYnVmX3NpemUgKSk7CisgICAgfQorICAgIAorICAgIGlmKCAhKGZsYWdzICYgQ1ZfU1ZEX01PRElGWV9BKSApCisgICAgeworICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZ0bWF0LCBtLCBuLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciArIGFfYnVmX29mZnNldCpwaXhfc2l6ZSApOworICAgICAgICBpZiggIXRfc3ZkICkKKyAgICAgICAgICAgIGN2Q29weSggYSwgJnRtYXQgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZUKCBhLCAmdG1hdCApOworICAgICAgICBhID0gJnRtYXQ7CisgICAgfQorCisgICAgaWYoIHRlbXBfdSApCisgICAgeworICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZ1c3R1YiwgdV9jb2xzLCB1X3Jvd3MsIHR5cGUsIGJ1ZmZlciArIHVfYnVmX29mZnNldCpwaXhfc2l6ZSApOworICAgICAgICB1ID0gJnVzdHViOworICAgIH0KKworICAgIGlmKCAhdHcgKQorICAgICAgICB0dyA9IGJ1ZmZlciArIChuICsgbSkqcGl4X3NpemU7CisKKyAgICBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgeworICAgICAgICBpY3ZTVkRfMzJmKCBhLT5kYXRhLmZsLCBhLT5zdGVwL3NpemVvZihmbG9hdCksIGEtPnJvd3MsIGEtPmNvbHMsCisgICAgICAgICAgICAgICAgICAgKGZsb2F0Kil0dywgdS0+ZGF0YS5mbCwgdS0+c3RlcC9zaXplb2YoZmxvYXQpLCB1X2NvbHMsCisgICAgICAgICAgICAgICAgICAgdi0+ZGF0YS5mbCwgdi0+c3RlcC9zaXplb2YoZmxvYXQpLCAoZmxvYXQqKWJ1ZmZlciApOworICAgIH0KKyAgICBlbHNlIGlmKCB0eXBlID09IENWXzY0RkMxICkKKyAgICB7CisgICAgICAgIGljdlNWRF82NGYoIGEtPmRhdGEuZGIsIGEtPnN0ZXAvc2l6ZW9mKGRvdWJsZSksIGEtPnJvd3MsIGEtPmNvbHMsCisgICAgICAgICAgICAgICAgICAgIChkb3VibGUqKXR3LCB1LT5kYXRhLmRiLCB1LT5zdGVwL3NpemVvZihkb3VibGUpLCB1X2NvbHMsCisgICAgICAgICAgICAgICAgICAgIHYtPmRhdGEuZGIsIHYtPnN0ZXAvc2l6ZW9mKGRvdWJsZSksIChkb3VibGUqKWJ1ZmZlciApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICIiICk7CisgICAgfQorCisgICAgaWYoIHR3ICE9IHctPmRhdGEucHRyICkKKyAgICB7CisgICAgICAgIGludCBzaGlmdCA9IHctPmNvbHMgIT0gMTsKKyAgICAgICAgY3ZTZXRaZXJvKCB3ICk7CisgICAgICAgIGlmKCB0eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICAoKGZsb2F0Kikody0+ZGF0YS5wdHIgKyBpKnctPnN0ZXApKVtpKnNoaWZ0XSA9ICgoZmxvYXQqKXR3KVtpXTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgICAgICgoZG91YmxlKikody0+ZGF0YS5wdHIgKyBpKnctPnN0ZXApKVtpKnNoaWZ0XSA9ICgoZG91YmxlKil0dylbaV07CisgICAgfQorCisgICAgaWYoIHVhcnIgKQorICAgIHsKKyAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9TVkRfVV9UKSkKKyAgICAgICAgICAgIGN2VCggdSwgdWFyciApOworICAgICAgICBlbHNlIGlmKCB0ZW1wX3UgKQorICAgICAgICAgICAgY3ZDb3B5KCB1LCB1YXJyICk7CisgICAgICAgIC8qQ1ZfQ0hFQ0tfTkFOUyggdWFyciApOyovCisgICAgfQorCisgICAgaWYoIHZhcnIgKQorICAgIHsKKyAgICAgICAgaWYoICEoZmxhZ3MgJiBDVl9TVkRfVl9UKSkKKyAgICAgICAgICAgIGN2VCggdiwgdmFyciApOworICAgICAgICAvKkNWX0NIRUNLX05BTlMoIHZhcnIgKTsqLworICAgIH0KKworICAgIENWX0NIRUNLX05BTlMoIHcgKTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggYnVmZmVyICYmICFsb2NhbF9hbGxvYyApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZTVkJrU2IoIGNvbnN0IEN2QXJyKiB3YXJyLCBjb25zdCBDdkFyciogdWFyciwKKyAgICAgICAgICBjb25zdCBDdkFyciogdmFyciwgY29uc3QgQ3ZBcnIqIGJhcnIsCisgICAgICAgICAgQ3ZBcnIqIHhhcnIsIGludCBmbGFncyApCit7CisgICAgdWNoYXIqIGJ1ZmZlciA9IDA7CisgICAgaW50IGxvY2FsX2FsbG9jID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTVkJrU2IiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCB3c3R1YiwgKncgPSAoQ3ZNYXQqKXdhcnI7CisgICAgQ3ZNYXQgYnN0dWIsICpiID0gKEN2TWF0KiliYXJyOworICAgIEN2TWF0IHhzdHViLCAqeCA9IChDdk1hdCopeGFycjsKKyAgICBDdk1hdCB1c3R1YiwgdXN0dWIyLCAqdSA9IChDdk1hdCopdWFycjsKKyAgICBDdk1hdCB2c3R1YiwgdnN0dWIyLCAqdiA9IChDdk1hdCopdmFycjsKKyAgICB1Y2hhciogdHcgPSAwOworICAgIGludCB0eXBlOworICAgIGludCB0ZW1wX3UgPSAwLCB0ZW1wX3YgPSAwOworICAgIGludCB1X2J1Zl9vZmZzZXQgPSAwLCB2X2J1Zl9vZmZzZXQgPSAwLCB3X2J1Zl9vZmZzZXQgPSAwLCB0X2J1Zl9vZmZzZXQgPSAwOworICAgIGludCBidWZfc2l6ZSA9IDAsIHBpeF9zaXplOworICAgIGludCBtLCBuLCBubTsKKyAgICBpbnQgdV9yb3dzLCB1X2NvbHM7CisgICAgaW50IHZfcm93cywgdl9jb2xzOworCisgICAgaWYoICFDVl9JU19NQVQoIHcgKSkKKyAgICAgICAgQ1ZfQ0FMTCggdyA9IGN2R2V0TWF0KCB3LCAmd3N0dWIgKSk7CisKKyAgICBpZiggIUNWX0lTX01BVCggdSApKQorICAgICAgICBDVl9DQUxMKCB1ID0gY3ZHZXRNYXQoIHUsICZ1c3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCB2ICkpCisgICAgICAgIENWX0NBTEwoIHYgPSBjdkdldE1hdCggdiwgJnZzdHViICkpOworCisgICAgaWYoICFDVl9JU19NQVQoIHggKSkKKyAgICAgICAgQ1ZfQ0FMTCggeCA9IGN2R2V0TWF0KCB4LCAmeHN0dWIgKSk7CisKKyAgICBpZiggIUNWX0FSRV9UWVBFU19FUSggdywgdSApIHx8ICFDVl9BUkVfVFlQRVNfRVEoIHcsIHYgKSB8fCAhQ1ZfQVJFX1RZUEVTX0VRKCB3LCB4ICkpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiQWxsIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIiApOworCisgICAgdHlwZSA9IENWX01BVF9UWVBFKCB3LT50eXBlICk7CisgICAgcGl4X3NpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisKKyAgICBpZiggIShmbGFncyAmIENWX1NWRF9VX1QpICkKKyAgICB7CisgICAgICAgIHRlbXBfdSA9IDE7CisgICAgICAgIHVfYnVmX29mZnNldCA9IGJ1Zl9zaXplOworICAgICAgICBidWZfc2l6ZSArPSB1LT5jb2xzKnUtPnJvd3MqcGl4X3NpemU7CisgICAgICAgIHVfcm93cyA9IHUtPnJvd3M7CisgICAgICAgIHVfY29scyA9IHUtPmNvbHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVfcm93cyA9IHUtPmNvbHM7CisgICAgICAgIHVfY29scyA9IHUtPnJvd3M7CisgICAgfQorCisgICAgaWYoICEoZmxhZ3MgJiBDVl9TVkRfVl9UKSApCisgICAgeworICAgICAgICB0ZW1wX3YgPSAxOworICAgICAgICB2X2J1Zl9vZmZzZXQgPSBidWZfc2l6ZTsKKyAgICAgICAgYnVmX3NpemUgKz0gdi0+Y29scyp2LT5yb3dzKnBpeF9zaXplOworICAgICAgICB2X3Jvd3MgPSB2LT5yb3dzOworICAgICAgICB2X2NvbHMgPSB2LT5jb2xzOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2X3Jvd3MgPSB2LT5jb2xzOworICAgICAgICB2X2NvbHMgPSB2LT5yb3dzOworICAgIH0KKworICAgIG0gPSB1X3Jvd3M7CisgICAgbiA9IHZfcm93czsKKyAgICBubSA9IE1JTihuLG0pOworCisgICAgaWYoICh1X3Jvd3MgIT0gdV9jb2xzICYmIHZfcm93cyAhPSB2X2NvbHMpIHx8IHgtPnJvd3MgIT0gdl9yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJWIG9yIFUgbWF0cml4IG11c3QgYmUgc3F1YXJlIiApOworCisgICAgaWYoICh3LT5yb3dzID09IDEgfHwgdy0+Y29scyA9PSAxKSAmJiB3LT5yb3dzICsgdy0+Y29scyAtIDEgPT0gbm0gKQorICAgIHsKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKHctPnR5cGUpICkKKyAgICAgICAgICAgIHR3ID0gdy0+ZGF0YS5wdHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgd19idWZfb2Zmc2V0ID0gYnVmX3NpemU7CisgICAgICAgICAgICBidWZfc2l6ZSArPSBubSpwaXhfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggdy0+Y29scyAhPSB2X2NvbHMgfHwgdy0+cm93cyAhPSB1X2NvbHMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJXIG11c3QgYmUgMWQgYXJyYXkgb2YgTUlOKG0sbikgZWxlbWVudHMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdHJpeCB3aGljaCBzaXplIG1hdGNoZXMgdG8gVSBhbmQgViIgKTsKKyAgICAgICAgd19idWZfb2Zmc2V0ID0gYnVmX3NpemU7CisgICAgICAgIGJ1Zl9zaXplICs9IG5tKnBpeF9zaXplOworICAgIH0KKworICAgIGlmKCBiICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKCBiICkpCisgICAgICAgICAgICBDVl9DQUxMKCBiID0gY3ZHZXRNYXQoIGIsICZic3R1YiApKTsKKyAgICAgICAgaWYoICFDVl9BUkVfVFlQRVNfRVEoIHcsIGIgKSkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAiQWxsIG1hdHJpY2VzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIiApOworICAgICAgICBpZiggYi0+Y29scyAhPSB4LT5jb2xzIHx8IGItPnJvd3MgIT0gbSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJiIG1hdHJpeCBtdXN0IGhhdmUgKG0geCB4LT5jb2xzKSBzaXplIiApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBiID0gJmJzdHViOworICAgICAgICBtZW1zZXQoIGIsIDAsIHNpemVvZigqYikpOworICAgIH0KKworICAgIHRfYnVmX29mZnNldCA9IGJ1Zl9zaXplOworICAgIGJ1Zl9zaXplICs9IChNQVgobSxuKSArIGItPmNvbHMpKnBpeF9zaXplOworCisgICAgaWYoIGJ1Zl9zaXplIDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9ICh1Y2hhciopY3ZTdGFja0FsbG9jKCBidWZfc2l6ZSApOworICAgICAgICBsb2NhbF9hbGxvYyA9IDE7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKHVjaGFyKiljdkFsbG9jKCBidWZfc2l6ZSApKTsKKworICAgIGlmKCB0ZW1wX3UgKQorICAgIHsKKyAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmdXN0dWIyLCB1X2NvbHMsIHVfcm93cywgdHlwZSwgYnVmZmVyICsgdV9idWZfb2Zmc2V0ICk7CisgICAgICAgIGN2VCggdSwgJnVzdHViMiApOworICAgICAgICB1ID0gJnVzdHViMjsKKyAgICB9CisKKyAgICBpZiggdGVtcF92ICkKKyAgICB7CisgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJnZzdHViMiwgdl9jb2xzLCB2X3Jvd3MsIHR5cGUsIGJ1ZmZlciArIHZfYnVmX29mZnNldCApOworICAgICAgICBjdlQoIHYsICZ2c3R1YjIgKTsKKyAgICAgICAgdiA9ICZ2c3R1YjI7CisgICAgfQorCisgICAgaWYoICF0dyApCisgICAgeworICAgICAgICBpbnQgaSwgc2hpZnQgPSB3LT5jb2xzID4gMSA/IHBpeF9zaXplIDogMDsKKyAgICAgICAgdHcgPSBidWZmZXIgKyB3X2J1Zl9vZmZzZXQ7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBubTsgaSsrICkKKyAgICAgICAgICAgIG1lbWNweSggdHcgKyBpKnBpeF9zaXplLCB3LT5kYXRhLnB0ciArIGkqKHctPnN0ZXAgKyBzaGlmdCksIHBpeF9zaXplICk7CisgICAgfQorCisgICAgaWYoIHR5cGUgPT0gQ1ZfMzJGQzEgKQorICAgIHsKKyAgICAgICAgaWN2U1ZCa1NiXzMyZiggbSwgbiwgKGZsb2F0Kil0dywgdS0+ZGF0YS5mbCwgdS0+c3RlcC9zaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICB2LT5kYXRhLmZsLCB2LT5zdGVwL3NpemVvZihmbG9hdCksCisgICAgICAgICAgICAgICAgICAgICAgIGItPmRhdGEuZmwsIGItPnN0ZXAvc2l6ZW9mKGZsb2F0KSwgYi0+Y29scywKKyAgICAgICAgICAgICAgICAgICAgICAgeC0+ZGF0YS5mbCwgeC0+c3RlcC9zaXplb2YoZmxvYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQqKShidWZmZXIgKyB0X2J1Zl9vZmZzZXQpICk7CisgICAgfQorICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfNjRGQzEgKQorICAgIHsKKyAgICAgICAgaWN2U1ZCa1NiXzY0ZiggbSwgbiwgKGRvdWJsZSopdHcsIHUtPmRhdGEuZGIsIHUtPnN0ZXAvc2l6ZW9mKGRvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgIHYtPmRhdGEuZGIsIHYtPnN0ZXAvc2l6ZW9mKGRvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgIGItPmRhdGEuZGIsIGItPnN0ZXAvc2l6ZW9mKGRvdWJsZSksIGItPmNvbHMsCisgICAgICAgICAgICAgICAgICAgICAgIHgtPmRhdGEuZGIsIHgtPnN0ZXAvc2l6ZW9mKGRvdWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUqKShidWZmZXIgKyB0X2J1Zl9vZmZzZXQpICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIiIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGJ1ZmZlciAmJiAhbG9jYWxfYWxsb2MgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4c3dpdGNoZXIuY3BwIGIvY3hjb3JlL3NyYy9jeHN3aXRjaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDk4ZjI5Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeHN3aXRjaGVyLmNwcApAQCAtMCwwICsxLDgxNiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljIGRldGVjdGlvbiBhbmQgbG9hZGluZyBvZiBJUFAgbW9kdWxlcyAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQxMTUgKSAgICAgICAgLyogdHlwZSBkZWZpbml0aW9uIGluICgpICovCisjZW5kaWYKKworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgZGVmaW5lZCBXSU42NCAmJiAhZGVmaW5lZCBFTTY0VAorI3ByYWdtYSBvcHRpbWl6ZSggIiIsIG9mZiApCisjZW5kaWYKKworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNkZWZpbmUgQ1ZfUFJPQ19HRU5FUklDICAgICAgICAgICAgIDAKKyNkZWZpbmUgQ1ZfUFJPQ19TSElGVCAgICAgICAgICAgICAgIDEwCisjZGVmaW5lIENWX1BST0NfQVJDSF9NQVNLICAgICAgICAgICAoKDEgPDwgQ1ZfUFJPQ19TSElGVCkgLSAxKQorI2RlZmluZSBDVl9QUk9DX0lBMzJfR0VORVJJQyAgICAgICAgMQorI2RlZmluZSBDVl9QUk9DX0lBMzJfV0lUSF9NTVggICAgICAgKENWX1BST0NfSUEzMl9HRU5FUklDfCgyIDw8IENWX1BST0NfU0hJRlQpKQorI2RlZmluZSBDVl9QUk9DX0lBMzJfV0lUSF9TU0UgICAgICAgKENWX1BST0NfSUEzMl9HRU5FUklDfCgzIDw8IENWX1BST0NfU0hJRlQpKQorI2RlZmluZSBDVl9QUk9DX0lBMzJfV0lUSF9TU0UyICAgICAgKENWX1BST0NfSUEzMl9HRU5FUklDfCg0IDw8IENWX1BST0NfU0hJRlQpKQorI2RlZmluZSBDVl9QUk9DX0lBNjQgICAgICAgICAgICAgICAgMgorI2RlZmluZSBDVl9QUk9DX0VNNjRUICAgICAgICAgICAgICAgMworI2RlZmluZSBDVl9HRVRfUFJPQ19BUkNIKG1vZGVsKSAgICAgKChtb2RlbCkgJiBDVl9QUk9DX0FSQ0hfTUFTSykKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZQcm9jZXNzb3JJbmZvCit7CisgICAgaW50IG1vZGVsOworICAgIGludCBjb3VudDsKKyAgICBkb3VibGUgZnJlcXVlbmN5OyAvLyBjbG9ja3MgcGVyIG1pY3Jvc2Vjb25kCit9CitDdlByb2Nlc3NvckluZm87CisKKyN1bmRlZiBNQVNNX0lOTElORV9BU1NFTUJMWQorCisjaWYgZGVmaW5lZCBXSU4zMiAmJiAhZGVmaW5lZCAgV0lONjQKKworI2lmIGRlZmluZWQgX01TQ19WRVIKKyNkZWZpbmUgTUFTTV9JTkxJTkVfQVNTRU1CTFkgMQorI2VsaWYgZGVmaW5lZCBfX0JPUkxBTkRDX18KKworI2lmIF9fQk9STEFORENfXyA+PSAweDU2MAorI2RlZmluZSBNQVNNX0lOTElORV9BU1NFTUJMWSAxCisjZW5kaWYKKworI2VuZGlmCisKKyNlbmRpZgorCisvKgorICAgZGV0ZXJtaW5lIHByb2Nlc3NvciB0eXBlCisqLworc3RhdGljIHZvaWQKK2ljdkluaXRQcm9jZXNzb3JJbmZvKCBDdlByb2Nlc3NvckluZm8qIGNwdV9pbmZvICkKK3sKKyAgICBtZW1zZXQoIGNwdV9pbmZvLCAwLCBzaXplb2YoKmNwdV9pbmZvKSApOworICAgIGNwdV9pbmZvLT5tb2RlbCA9IENWX1BST0NfR0VORVJJQzsKKworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorCisjaWZuZGVmIFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfQU1ENjQKKyNkZWZpbmUgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9BTUQ2NCA5CisjZW5kaWYKKworI2lmbmRlZiBQUk9DRVNTT1JfQVJDSElURUNUVVJFX0lBMzJfT05fV0lONjQKKyNkZWZpbmUgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9JQTMyX09OX1dJTjY0IDEwCisjZW5kaWYKKworICAgIFNZU1RFTV9JTkZPIHN5czsKKyAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisKKyAgICBHZXRTeXN0ZW1JbmZvKCAmc3lzICk7CisKKyAgICBpZiggc3lzLndQcm9jZXNzb3JBcmNoaXRlY3R1cmUgPT0gUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRV9JTlRFTCAmJgorICAgICAgICBzeXMuZHdQcm9jZXNzb3JUeXBlID09IFBST0NFU1NPUl9JTlRFTF9QRU5USVVNICYmIHN5cy53UHJvY2Vzc29yTGV2ZWwgPj0gNiApCisgICAgeworICAgICAgICBpbnQgdmVyc2lvbiA9IDAsIGZlYXR1cmVzID0gMCwgZmFtaWx5ID0gMDsKKyAgICAgICAgaW50IGlkID0gMDsKKyAgICAgICAgSEtFWSBrZXkgPSAwOworCisgICAgICAgIGNwdV9pbmZvLT5jb3VudCA9IChpbnQpc3lzLmR3TnVtYmVyT2ZQcm9jZXNzb3JzOworICAgICAgICB1bnNpZ25lZCBsb25nIHZhbCA9IDAsIHN6ID0gc2l6ZW9mKHZhbCk7CisKKyAgICAgICAgaWYoIFJlZ09wZW5LZXlFeCggSEtFWV9MT0NBTF9NQUNISU5FLCAiSEFSRFdBUkVcXERFU0NSSVBUSU9OXFxTWVNURU1cXENlbnRyYWxQcm9jZXNzb3JcXDBcXCIsCisgICAgICAgICAgICAwLCBLRVlfUVVFUllfVkFMVUUsICZrZXkgKSA+PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIFJlZ1F1ZXJ5VmFsdWVFeCgga2V5LCAifk1IeiIsIDAsIDAsICh1Y2hhciopJnZhbCwgJnN6ICkgPj0gMCApCisgICAgICAgICAgICAgICAgY3B1X2luZm8tPmZyZXF1ZW5jeSA9IChkb3VibGUpdmFsOworICAgICAgICAgICAgUmVnQ2xvc2VLZXkoIGtleSApOworICAgICAgICB9CisKKyNpZmRlZiBNQVNNX0lOTElORV9BU1NFTUJMWQorICAgICAgICBfX2FzbQorICAgICAgICB7CisgICAgICAgICAgICAvKiB1c2UgQ1BVSUQgdG8gZGV0ZXJtaW5lIHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgKi8KKyAgICAgICAgICAgIHB1c2hmZAorICAgICAgICAgICAgbW92ICAgZWF4LCAxCisgICAgICAgICAgICBwdXNoICBlYngKKyAgICAgICAgICAgIHB1c2ggIGVzaQorICAgICAgICAgICAgcHVzaCAgZWRpCisjaWZkZWYgX19CT1JMQU5EQ19fCisgICAgICAgICAgICBkYiAwZmgKKyAgICAgICAgICAgIGRiIDBhMmgKKyNlbHNlCisgICAgICAgICAgICBfZW1pdCAweDBmCisgICAgICAgICAgICBfZW1pdCAweGEyCisjZW5kaWYKKyAgICAgICAgICAgIHBvcCAgIGVkaQorICAgICAgICAgICAgcG9wICAgZXNpCisgICAgICAgICAgICBwb3AgICBlYngKKyAgICAgICAgICAgIG1vdiAgIHZlcnNpb24sIGVheAorICAgICAgICAgICAgbW92ICAgZmVhdHVyZXMsIGVkeAorICAgICAgICAgICAgcG9wZmQKKyAgICAgICAgfQorI2VsaWYgZGVmaW5lZCBXSU4zMiAmJiBfX0dOVUNfXyA+IDIKKyAgICAgICAgYXNtIHZvbGF0aWxlCisgICAgICAgICgKKyAgICAgICAgICAgICJtb3ZsICQxLCUlZWF4XG5cdCIKKyAgICAgICAgICAgICIuYnl0ZSAweDBmOyAuYnl0ZSAweGEyXG5cdCIKKyAgICAgICAgICAgICJtb3ZsICUlZWF4LCAlMFxuXHQiCisgICAgICAgICAgICAibW92bCAlJWVkeCwgJTFcblx0IgorICAgICAgICAgICAgOiAiPXIiKHZlcnNpb24pLCAiPXIiIChmZWF0dXJlcykKKyAgICAgICAgICAgIDoKKyAgICAgICAgICAgIDogIiVlYngiLCAiJWVzaSIsICIlZWRpIgorICAgICAgICApOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY3B1aWRfY29kZVtdID0KKyAgICAgICAgICAgICAgICAiXHg1M1x4NTZceDU3XHhiOFx4MDFceDAwXHgwMFx4MDBceDBmXHhhMlx4NWZceDVlXHg1Ylx4YzMiOworICAgICAgICAgICAgdHlwZWRlZiBpbnQ2NCAoQ1ZfQ0RFQ0wgKiBmdW5jX3B0cikodm9pZCk7CisgICAgICAgICAgICBmdW5jX3B0ciBjcHVpZCA9IChmdW5jX3B0cikodm9pZCopY3B1aWRfY29kZTsKKyAgICAgICAgICAgIGludDY0IGNwdWlkX3ZhbCA9IGNwdWlkKCk7CisgICAgICAgICAgICB2ZXJzaW9uID0gKGludCljcHVpZF92YWw7CisgICAgICAgICAgICBmZWF0dXJlcyA9IChpbnQpKGNwdWlkX3ZhbCA+PiAzMik7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICNkZWZpbmUgSUNWX0NQVUlEX002ICAgICAoKDE8PDE1KXwoMTw8MjMpKSAgLyogY21vdiArIE1NWCAqLworICAgICAgICAjZGVmaW5lIElDVl9DUFVJRF9BNiAgICAgKCgxPDwyNSl8SUNWX0NQVUlEX002KSAvKiA8YWxsIGFib3ZlPiArIFNTRSAqLworICAgICAgICAjZGVmaW5lIElDVl9DUFVJRF9XNyAgICAgKCgxPDwyNil8SUNWX0NQVUlEX0E2KSAvKiA8YWxsIGFib3ZlPiArIFNTRTIgKi8KKworICAgICAgICBmYW1pbHkgPSAodmVyc2lvbiA+PiA4KSAmIDE1OworICAgICAgICBpZiggZmFtaWx5ID49IDYgJiYgKGZlYXR1cmVzICYgSUNWX0NQVUlEX002KSAhPSAwICkgLyogUGVudGl1bSBJSSBvciBoaWdoZXIgKi8KKyAgICAgICAgICAgIGlkID0gZmVhdHVyZXMgJiBJQ1ZfQ1BVSURfVzc7CisKKyAgICAgICAgY3B1X2luZm8tPm1vZGVsID0gaWQgPT0gSUNWX0NQVUlEX1c3ID8gQ1ZfUFJPQ19JQTMyX1dJVEhfU1NFMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID09IElDVl9DUFVJRF9BNiA/IENWX1BST0NfSUEzMl9XSVRIX1NTRSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID09IElDVl9DUFVJRF9NNiA/IENWX1BST0NfSUEzMl9XSVRIX01NWCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1BST0NfSUEzMl9HRU5FUklDOworICAgIH0KKyAgICBlbHNlCisgICAgeworI2lmIGRlZmluZWQgRU02NFQKKyAgICAgICAgaWYoIHN5cy53UHJvY2Vzc29yQXJjaGl0ZWN0dXJlID09IFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfQU1ENjQgKQorICAgICAgICAgICAgY3B1X2luZm8tPm1vZGVsID0gQ1ZfUFJPQ19FTTY0VDsKKyNlbGlmIGRlZmluZWQgV0lONjQKKyAgICAgICAgaWYoIHN5cy53UHJvY2Vzc29yQXJjaGl0ZWN0dXJlID09IFBST0NFU1NPUl9BUkNISVRFQ1RVUkVfSUE2NCApCisgICAgICAgICAgICBjcHVfaW5mby0+bW9kZWwgPSBDVl9QUk9DX0lBNjQ7CisjZW5kaWYKKyAgICAgICAgaWYoIFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICZmcmVxICkgKQorICAgICAgICAgICAgY3B1X2luZm8tPmZyZXF1ZW5jeSA9IChkb3VibGUpZnJlcS5RdWFkUGFydDsKKyAgICB9CisjZWxzZQorICAgIGNwdV9pbmZvLT5mcmVxdWVuY3kgPSAxOworCisjaWZkZWYgX194ODZfNjRfXworICAgIGNwdV9pbmZvLT5tb2RlbCA9IENWX1BST0NfRU02NFQ7CisjZWxpZiBkZWZpbmVkIF9faWE2NF9fCisgICAgY3B1X2luZm8tPm1vZGVsID0gQ1ZfUFJPQ19JQTY0OworI2VsaWYgIWRlZmluZWQgX19pMzg2X18KKyAgICBjcHVfaW5mby0+bW9kZWwgPSBDVl9QUk9DX0dFTkVSSUM7CisjZWxzZQorICAgIGNwdV9pbmZvLT5tb2RlbCA9IENWX1BST0NfSUEzMl9HRU5FUklDOworICAgIAorICAgIC8vIHJlYWRpbmcgL3Byb2MvY3B1aW5mbyBmaWxlIChwcm9jIGZpbGUgc3lzdGVtIG11c3QgYmUgc3VwcG9ydGVkKQorICAgIEZJTEUgKmZpbGUgPSBmb3BlbiggIi9wcm9jL2NwdWluZm8iLCAiciIgKTsKKworICAgIGlmKCBmaWxlICkKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEwMjRdOworICAgICAgICBpbnQgbWF4X3NpemUgPSBzaXplb2YoYnVmZmVyKS0xOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciogcHRyID0gZmdldHMoIGJ1ZmZlciwgbWF4X3NpemUsIGZpbGUgKTsKKyAgICAgICAgICAgIGlmKCAhcHRyICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKCBzdHJuY21wKCBidWZmZXIsICJmbGFncyIsIDUgKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggc3Ryc3RyKCBidWZmZXIsICJtbXgiICkgJiYgc3Ryc3RyKCBidWZmZXIsICJjbW92IiApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY3B1X2luZm8tPm1vZGVsID0gQ1ZfUFJPQ19JQTMyX1dJVEhfTU1YOworICAgICAgICAgICAgICAgICAgICBpZiggc3Ryc3RyKCBidWZmZXIsICJ4bW0iICkgfHwgc3Ryc3RyKCBidWZmZXIsICJzc2UiICkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNwdV9pbmZvLT5tb2RlbCA9IENWX1BST0NfSUEzMl9XSVRIX1NTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJzdHIoIGJ1ZmZlciwgImVtbSIgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHVfaW5mby0+bW9kZWwgPSBDVl9QUk9DX0lBMzJfV0lUSF9TU0UyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggc3RybmNtcCggYnVmZmVyLCAiY3B1IE1IeiIsIDcgKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBwb3MgPSBzdHJjaHIoIGJ1ZmZlciwgJzonICk7CisgICAgICAgICAgICAgICAgaWYoIHBvcyApCisgICAgICAgICAgICAgICAgICAgIGNwdV9pbmZvLT5mcmVxdWVuY3kgPSBzdHJ0b2QoIHBvcyArIDEsICZwb3MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZjbG9zZSggZmlsZSApOworICAgICAgICBpZiggQ1ZfR0VUX1BST0NfQVJDSChjcHVfaW5mby0+bW9kZWwpICE9IENWX1BST0NfSUEzMl9HRU5FUklDICkKKyAgICAgICAgICAgIGNwdV9pbmZvLT5mcmVxdWVuY3kgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoIGNwdV9pbmZvLT5mcmVxdWVuY3kgPiAxICk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKK30KKworCitDVl9JTkxJTkUgY29uc3QgQ3ZQcm9jZXNzb3JJbmZvKgoraWN2R2V0UHJvY2Vzc29ySW5mbygpCit7CisgICAgc3RhdGljIEN2UHJvY2Vzc29ySW5mbyBjcHVfaW5mbzsKKyAgICBzdGF0aWMgaW50IGluaXRfY3B1X2luZm8gPSAwOworICAgIGlmKCAhaW5pdF9jcHVfaW5mbyApCisgICAgeworICAgICAgICBpY3ZJbml0UHJvY2Vzc29ySW5mbyggJmNwdV9pbmZvICk7CisgICAgICAgIGluaXRfY3B1X2luZm8gPSAxOworICAgIH0KKyAgICByZXR1cm4gJmNwdV9pbmZvOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSBmdW5jdGlvbnMgZGVzY3JpcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI3VuZGVmIElQQ1ZBUElfRVgKKyNkZWZpbmUgSVBDVkFQSV9FWCh0eXBlLGZ1bmNfbmFtZSxuYW1lcyxtb2R1bGVzLGFyZykgXAorICAgIHsgKHZvaWQqKikmZnVuY19uYW1lIyNfcCwgKHZvaWQqKShzaXplX3QpLTEsIG5hbWVzLCBtb2R1bGVzLCAwIH0sCisKKyN1bmRlZiBJUENWQVBJX0NfRVgKKyNkZWZpbmUgSVBDVkFQSV9DX0VYKHR5cGUsZnVuY19uYW1lLG5hbWVzLG1vZHVsZXMsYXJnKSBcCisgICAgeyAodm9pZCoqKSZmdW5jX25hbWUjI19wLCAodm9pZCopKHNpemVfdCktMSwgbmFtZXMsIG1vZHVsZXMsIDAgfSwKKworc3RhdGljIEN2UGx1Z2luRnVuY0luZm8gY3hjb3JlX2lwcF90YWJbXSA9Cit7CisjdW5kZWYgX0NYQ09SRV9JUFBfSF8KKyNpbmNsdWRlICJfY3hpcHAuaCIKKyN1bmRlZiBfQ1hDT1JFX0lQUF9IXworICAgIHswLCAwLCAwLCAwLCAwfQorfTsKKworCisvKgorICAgZGV0ZXJtaW5lIHByb2Nlc3NvciB0eXBlLCBsb2FkIGFwcHJvcHJpYXRlIGRsbCBhbmQKKyAgIGluaXRpYWxpemUgYWxsIGZ1bmN0aW9uIHBvaW50ZXJzCisqLworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorI2RlZmluZSBETExfUFJFRklYICIiCisjZGVmaW5lIERMTF9TVUZGSVggIi5kbGwiCisjZWxzZQorI2RlZmluZSBETExfUFJFRklYICJsaWIiCisjZGVmaW5lIERMTF9TVUZGSVggIi5zbyIKKyNkZWZpbmUgTG9hZExpYnJhcnkobmFtZSkgZGxvcGVuKG5hbWUsIFJUTERfTEFaWSkKKyNkZWZpbmUgRnJlZUxpYnJhcnkobmFtZSkgZGxjbG9zZShuYW1lKQorI2RlZmluZSBHZXRQcm9jQWRkcmVzcyBkbHN5bQordHlwZWRlZiB2b2lkKiBITU9EVUxFOworI2VuZGlmCisKKyNpZiAwIC8qZGVmIF9ERUJVRyovCisjZGVmaW5lIERMTF9ERUJVR19GTEFHICJkIgorI2Vsc2UKKyNkZWZpbmUgRExMX0RFQlVHX0ZMQUcgIiIKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0VfTE9BRElORyAwCisKKyNpZiBWRVJCT1NFX0xPQURJTkcKKyNkZWZpbmUgSUNWX1BSSU5URihhcmdzKSAgcHJpbnRmIGFyZ3M7IGZmbHVzaChzdGRvdXQpCisjZWxzZQorI2RlZmluZSBJQ1ZfUFJJTlRGKGFyZ3MpCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZQbHVnaW5JbmZvCit7CisgICAgY29uc3QgY2hhciogYmFzZW5hbWU7CisgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgY2hhciBuYW1lWzEwMF07Cit9CitDdlBsdWdpbkluZm87CisKK3N0YXRpYyBDdlBsdWdpbkluZm8gcGx1Z2luc1tDVl9QTFVHSU5fTUFYXTsKK3N0YXRpYyBDdk1vZHVsZUluZm8gY3hjb3JlX2luZm8gPSB7IDAsICJjeGNvcmUiLCBDVl9WRVJTSU9OLCBjeGNvcmVfaXBwX3RhYiB9OworCitDdk1vZHVsZUluZm8gKkN2TW9kdWxlOjpmaXJzdCA9IDAsICpDdk1vZHVsZTo6bGFzdCA9IDA7CisKK0N2TW9kdWxlOjpDdk1vZHVsZSggQ3ZNb2R1bGVJbmZvKiBfaW5mbyApCit7CisgICAgY3ZSZWdpc3Rlck1vZHVsZSggX2luZm8gKTsKKyAgICBpbmZvID0gbGFzdDsKK30KKworQ3ZNb2R1bGU6On5Ddk1vZHVsZSgpCit7CisgICAgaWYoIGluZm8gKQorICAgIHsKKyAgICAgICAgQ3ZNb2R1bGVJbmZvKiBwID0gZmlyc3Q7CisgICAgICAgIGZvciggOyBwICE9IDAgJiYgcC0+bmV4dCAhPSBpbmZvOyBwID0gcC0+bmV4dCApCisgICAgICAgICAgICA7CisgICAgICAgIGlmKCBwICkKKyAgICAgICAgICAgIHAtPm5leHQgPSBpbmZvLT5uZXh0OworICAgICAgICBpZiggZmlyc3QgPT0gaW5mbyApCisgICAgICAgICAgICBmaXJzdCA9IGluZm8tPm5leHQ7CisgICAgICAgIGlmKCBsYXN0ID09IGluZm8gKQorICAgICAgICAgICAgbGFzdCA9IHA7CisgICAgICAgIGN2RnJlZSggJmluZm8gKTsKKyAgICAgICAgaW5mbyA9IDA7CisgICAgfQorfQorCitzdGF0aWMgaW50CitpY3ZVcGRhdGVQbHVnaW5GdW5jVGFiKCBDdlBsdWdpbkZ1bmNJbmZvKiBmdW5jX3RhYiApCit7CisgICAgaW50IGksIGxvYWRlZF9mdW5jdGlvbnMgPSAwOworCisgICAgLy8gMS4gcmVzZXQgcG9pbnRlcnMKKyAgICBmb3IoIGkgPSAwOyBmdW5jX3RhYltpXS5mdW5jX2FkZHIgIT0gMDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCBmdW5jX3RhYltpXS5kZWZhdWx0X2Z1bmNfYWRkciA9PSAodm9pZCopKHNpemVfdCktMSApCisgICAgICAgICAgICBmdW5jX3RhYltpXS5kZWZhdWx0X2Z1bmNfYWRkciA9ICpmdW5jX3RhYltpXS5mdW5jX2FkZHI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpmdW5jX3RhYltpXS5mdW5jX2FkZHIgPSBmdW5jX3RhYltpXS5kZWZhdWx0X2Z1bmNfYWRkcjsKKyAgICAgICAgZnVuY190YWJbaV0ubG9hZGVkX2Zyb20gPSAwOworICAgIH0KKworICAgIC8vIGlwcG9wZW5jdiBzdWJzdGl0dXRlcyBhbGwgdGhlIG90aGVyIElQUCBtb2R1bGVzCisgICAgaWYoIHBsdWdpbnNbQ1ZfUExVR0lOX09QVENWXS5oYW5kbGUgIT0gMCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAyOyBpIDwgQ1ZfUExVR0lOX01LTDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0KCBwbHVnaW5zW2ldLmhhbmRsZSA9PSAwICk7CisgICAgICAgICAgICBwbHVnaW5zW2ldLmhhbmRsZSA9IHBsdWdpbnNbQ1ZfUExVR0lOX09QVENWXS5oYW5kbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiB0cnkgdG8gZmluZCBjb3JyZXNwb25kaW5nIGZ1bmN0aW9ucyBpbiBpcHAqIGFuZCByZWFzc2lnbiBwb2ludGVycyB0byB0aGVtCisgICAgZm9yKCBpID0gMDsgZnVuY190YWJbaV0uZnVuY19hZGRyICE9IDA7IGkrKyApCisgICAgeworICAgICNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0MDU0IDQwNTUgKSAvKiBjb252ZXJ0aW5nIHBvaW50ZXJzIHRvIGNvZGU8LT5kYXRhICovCisgICAgI2VuZGlmCisgICAgICAgIGNoYXIgbmFtZVsxMDBdOworICAgICAgICBpbnQgaiA9IDAsIGlkeCA9IDA7CisKKyAgICAgICAgYXNzZXJ0KCBmdW5jX3RhYltpXS5sb2FkZWRfZnJvbSA9PSAwICk7CisKKyAgICAgICAgaWYoIGZ1bmNfdGFiW2ldLnNlYXJjaF9tb2R1bGVzICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIGFkZHIgPSAwOworICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZV9wdHIgPSBmdW5jX3RhYltpXS5mdW5jX25hbWVzOworCisgICAgICAgICAgICBmb3IoIDsgaiA8IDEwICYmIG5hbWVfcHRyOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG5hbWVfc3RhcnQgPSBuYW1lX3B0cjsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBuYW1lX2VuZDsKKyAgICAgICAgICAgICAgICB3aGlsZSggIWlzYWxwaGEobmFtZV9zdGFydFswXSkgJiYgbmFtZV9zdGFydFswXSAhPSAnXDAnICkKKyAgICAgICAgICAgICAgICAgICAgbmFtZV9zdGFydCsrOworICAgICAgICAgICAgICAgIGlmKCAhbmFtZV9zdGFydFswXSApCisgICAgICAgICAgICAgICAgICAgIG5hbWVfc3RhcnQgPSAwOworICAgICAgICAgICAgICAgIG5hbWVfZW5kID0gbmFtZV9zdGFydCA/IHN0cmNociggbmFtZV9zdGFydCwgJywnICkgOiAwOworICAgICAgICAgICAgICAgIGlkeCA9IChmdW5jX3RhYltpXS5zZWFyY2hfbW9kdWxlcyAvICgxPDxqKjQpKSAlIENWX1BMVUdJTl9NQVg7CisKKyAgICAgICAgICAgICAgICBpZiggcGx1Z2luc1tpZHhdLmhhbmRsZSAhPSAwICYmIG5hbWVfc3RhcnQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5hbWVfZW5kICE9IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJuY3B5KCBuYW1lLCBuYW1lX3N0YXJ0LCBuYW1lX2VuZCAtIG5hbWVfc3RhcnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVbbmFtZV9lbmQgLSBuYW1lX3N0YXJ0XSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgc3RyY3B5KCBuYW1lLCBuYW1lX3N0YXJ0ICk7CisKKyAgICAgICAgICAgICAgICAgICAgYWRkciA9ICh1Y2hhciopR2V0UHJvY0FkZHJlc3MoIHBsdWdpbnNbaWR4XS5oYW5kbGUsIG5hbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGFkZHIgKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5hbWVfcHRyID0gbmFtZV9lbmQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBhZGRyICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIC8qI2lmZGVmIFdJTjMyCisgICAgICAgICAgICAgICAgd2hpbGUoICphZGRyID09IDB4RTkgKQorICAgICAgICAgICAgICAgICAgICBhZGRyICs9IDUgKyAqKChpbnQqKShhZGRyICsgMSkpOworICAgICAgICAgICAgI2VuZGlmKi8KKyAgICAgICAgICAgICAgICAqZnVuY190YWJbaV0uZnVuY19hZGRyID0gYWRkcjsKKyAgICAgICAgICAgICAgICBmdW5jX3RhYltpXS5sb2FkZWRfZnJvbSA9IGlkeDsgLy8gc3RvcmUgaW5kZXggb2YgdGhlIG1vZHVsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBjb250YWluIHRoZSBsb2FkZWQgZnVuY3Rpb24KKyAgICAgICAgICAgICAgICBsb2FkZWRfZnVuY3Rpb25zKys7CisgICAgICAgICAgICAgICAgSUNWX1BSSU5URigoIiVzOiBcdCVzXG4iLCBuYW1lLCBwbHVnaW5zW2lkeF0ubmFtZSApKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTIwMAorICAgICAgICAgICAgICAgICNwcmFnbWEgd2FybmluZyggZGVmYXVsdDogNDA1NCA0MDU1ICkKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgfQorCisjaWYgVkVSQk9TRV9MT0FESU5HCisgICAgeworICAgIGludCBub3RfbG9hZGVkID0gMDsKKyAgICBJQ1ZfUFJJTlRGKCgiXG5Ub3RhbCBsb2FkZWQ6ICVkXG5cbiIsIGxvYWRlZF9mdW5jdGlvbnMgKSk7CisgICAgcHJpbnRmKCAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5Ob3QgbG9hZGVkIC4uLlxuXG4iICk7CisgICAgZm9yKCBpID0gMDsgZnVuY190YWJbaV0uZnVuY19hZGRyICE9IDA7IGkrKyApCisgICAgICAgIGlmKCAhZnVuY190YWJbaV0ubG9hZGVkX2Zyb20gKQorICAgICAgICB7CisgICAgICAgICAgICBJQ1ZfUFJJTlRGKCggIiVzXG4iLCBmdW5jX3RhYltpXS5mdW5jX25hbWVzICkpOworICAgICAgICAgICAgbm90X2xvYWRlZCsrOworICAgICAgICB9CisKKyAgICBJQ1ZfUFJJTlRGKCgiXG5Ub3RhbDogJWRcbiIsIG5vdF9sb2FkZWQgKSk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggcGx1Z2luc1tDVl9QTFVHSU5fT1BUQ1ZdLmhhbmRsZSAhPSAwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDI7IGkgPCBDVl9QTFVHSU5fTUtMOyBpKysgKQorICAgICAgICAgICAgcGx1Z2luc1tpXS5oYW5kbGUgPSAwOworICAgIH0KKworICAgIHJldHVybiBsb2FkZWRfZnVuY3Rpb25zOworfQorCisKK0NWX0lNUEwgaW50CitjdlJlZ2lzdGVyTW9kdWxlKCBjb25zdCBDdk1vZHVsZUluZm8qIG1vZHVsZSApCit7CisgICAgQ3ZNb2R1bGVJbmZvKiBtb2R1bGVfY29weSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UmVnaXN0ZXJNb2R1bGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBzaXplX3QgbmFtZV9sZW4sIHZlcnNpb25fbGVuOworCisgICAgQ1ZfQVNTRVJUKCBtb2R1bGUgIT0gMCAmJiBtb2R1bGUtPm5hbWUgIT0gMCAmJiBtb2R1bGUtPnZlcnNpb24gIT0gMCApOworCisgICAgbmFtZV9sZW4gPSBzdHJsZW4obW9kdWxlLT5uYW1lKTsKKyAgICB2ZXJzaW9uX2xlbiA9IHN0cmxlbihtb2R1bGUtPnZlcnNpb24pOworCisgICAgQ1ZfQ0FMTCggbW9kdWxlX2NvcHkgPSAoQ3ZNb2R1bGVJbmZvKiljdkFsbG9jKCBzaXplb2YoKm1vZHVsZV9jb3B5KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9sZW4gKyAxICsgdmVyc2lvbl9sZW4gKyAxICkpOworCisgICAgKm1vZHVsZV9jb3B5ID0gKm1vZHVsZTsKKyAgICBtb2R1bGVfY29weS0+bmFtZSA9IChjaGFyKikobW9kdWxlX2NvcHkgKyAxKTsKKyAgICBtb2R1bGVfY29weS0+dmVyc2lvbiA9IChjaGFyKikobW9kdWxlX2NvcHkgKyAxKSArIG5hbWVfbGVuICsgMTsKKworICAgIG1lbWNweSggKHZvaWQqKW1vZHVsZV9jb3B5LT5uYW1lLCBtb2R1bGUtPm5hbWUsIG5hbWVfbGVuICsgMSApOworICAgIG1lbWNweSggKHZvaWQqKW1vZHVsZV9jb3B5LT52ZXJzaW9uLCBtb2R1bGUtPnZlcnNpb24sIHZlcnNpb25fbGVuICsgMSApOworICAgIG1vZHVsZV9jb3B5LT5uZXh0ID0gMDsKKworICAgIGlmKCBDdk1vZHVsZTo6Zmlyc3QgPT0gMCApCisgICAgICAgIEN2TW9kdWxlOjpmaXJzdCA9IG1vZHVsZV9jb3B5OworICAgIGVsc2UKKyAgICAgICAgQ3ZNb2R1bGU6Omxhc3QtPm5leHQgPSBtb2R1bGVfY29weTsKKyAgICBDdk1vZHVsZTo6bGFzdCA9IG1vZHVsZV9jb3B5OworCisgICAgaWYoIEN2TW9kdWxlOjpmaXJzdCA9PSBDdk1vZHVsZTo6bGFzdCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjdlVzZU9wdGltaXplZCgxKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGljdlVwZGF0ZVBsdWdpbkZ1bmNUYWIoIG1vZHVsZV9jb3B5LT5mdW5jX3RhYiApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICYmIG1vZHVsZV9jb3B5ICkKKyAgICAgICAgY3ZGcmVlKCAmbW9kdWxlX2NvcHkgKTsKKworICAgIHJldHVybiBtb2R1bGVfY29weSA/IDAgOiAtMTsKK30KKworCitDVl9JTVBMIGludAorY3ZVc2VPcHRpbWl6ZWQoIGludCBsb2FkX2ZsYWcgKQoreworICAgIGludCBpLCBsb2FkZWRfbW9kdWxlcyA9IDAsIGxvYWRlZF9mdW5jdGlvbnMgPSAwOworICAgIEN2TW9kdWxlSW5mbyogbW9kdWxlOworICAgIGNvbnN0IEN2UHJvY2Vzc29ySW5mbyogY3B1X2luZm8gPSBpY3ZHZXRQcm9jZXNzb3JJbmZvKCk7CisgICAgaW50IGFyY2ggPSBDVl9HRVRfUFJPQ19BUkNIKGNwdV9pbmZvLT5tb2RlbCk7CisgICAgCisgICAgLy8gVE9ETzogaW1wbGVtZW50IHNvbWUgbW9yZSBlbGVnYW50IHdheQorICAgIC8vIHRvIGZpbmQgdGhlIGxhdGVzdCBhbmQgdGhlIGdyZWF0ZXN0IElQUC9NS0wgbGlicmFyaWVzCisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG9wZW5jdl9zZnhbXSA9IHsgIjEwMCIsICIwOTkiLCAiMDk3IiwgMCB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBpcHBfc2Z4X2lhMzJbXSA9IHsgIi02LjEiLCAiLTYuMCIsICItNS4zIiwgIi01LjIiLCAiLTUuMSIsICIiLCAwIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGlwcF9zZnhfaWE2NFtdID0geyAiNjQtNi4xIiwgIjY0LTYuMCIsICI2NC01LjMiLCAiNjQtNS4yIiwgIjY0LTUuMSIsICI2NCIsIDAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogaXBwX3NmeF9lbTY0dFtdID0geyAiZW02NHQtNi4xIiwgImVtNjR0LTYuMCIsICJlbTY0dC01LjMiLCAiZW02NHQtNS4yIiwgImVtNjR0LTUuMSIsICJlbTY0dCIsIDAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbWtsX3NmeF9pYTMyW10gPSB7ICJwNCIsICJwMyIsICJkZWYiLCAwIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG1rbF9zZnhfaWE2NFtdID0geyAiaTJwIiwgIml0cCIsIDAgfTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbWtsX3NmeF9lbTY0dFtdID0geyAiZGVmIiwgMCB9OworICAgIGNvbnN0IGNoYXIqKiBpcHBfc3VmZml4ID0gYXJjaCA9PSBDVl9QUk9DX0lBNjQgPyBpcHBfc2Z4X2lhNjQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJjaCA9PSBDVl9QUk9DX0VNNjRUID8gaXBwX3NmeF9lbTY0dCA6IGlwcF9zZnhfaWEzMjsKKyAgICBjb25zdCBjaGFyKiogbWtsX3N1ZmZpeCA9IGFyY2ggPT0gQ1ZfUFJPQ19JQTY0ID8gbWtsX3NmeF9pYTY0IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyY2ggPT0gQ1ZfUFJPQ19FTTY0VCA/IG1rbF9zZnhfZW02NHQgOiBta2xfc2Z4X2lhMzI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgQ1ZfUExVR0lOX01BWDsgaSsrICkKKyAgICAgICAgcGx1Z2luc1tpXS5iYXNlbmFtZSA9IDA7CisgICAgcGx1Z2luc1tDVl9QTFVHSU5fTk9ORV0uYmFzZW5hbWUgPSAwOworICAgIHBsdWdpbnNbQ1ZfUExVR0lOX05PTkVdLm5hbWVbMF0gPSAnXDAnOworICAgIHBsdWdpbnNbQ1ZfUExVR0lOX09QVENWXS5iYXNlbmFtZSA9ICJpcHBvcGVuY3YiOworICAgIHBsdWdpbnNbQ1ZfUExVR0lOX0lQUENWXS5iYXNlbmFtZSA9ICJpcHBjdiI7CisgICAgcGx1Z2luc1tDVl9QTFVHSU5fSVBQSV0uYmFzZW5hbWUgPSAiaXBwaSI7CisgICAgcGx1Z2luc1tDVl9QTFVHSU5fSVBQU10uYmFzZW5hbWUgPSAiaXBwcyI7CisgICAgcGx1Z2luc1tDVl9QTFVHSU5fSVBQVk1dLmJhc2VuYW1lID0gImlwcHZtIjsKKyAgICBwbHVnaW5zW0NWX1BMVUdJTl9JUFBDQ10uYmFzZW5hbWUgPSAiaXBwY2MiOworICAgIHBsdWdpbnNbQ1ZfUExVR0lOX01LTF0uYmFzZW5hbWUgPSAibWtsXyI7CisKKyAgICAvLyB0cnkgdG8gbG9hZCBvcHRpbWl6ZWQgZGxscworICAgIGZvciggaSA9IDE7IGkgPCBDVl9QTFVHSU5fTUFYOyBpKysgKQorICAgIHsKKyAgICAgICAgLy8gdW5sb2FkIHByZXZpb3VzbHkgbG9hZGVkIG9wdGltaXplZCBtb2R1bGVzCisgICAgICAgIGlmKCBwbHVnaW5zW2ldLmhhbmRsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEZyZWVMaWJyYXJ5KCBwbHVnaW5zW2ldLmhhbmRsZSApOworICAgICAgICAgICAgcGx1Z2luc1tpXS5oYW5kbGUgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gbm90IGxvYWQgcmVndWxhciBJUFAgbW9kdWxlcyBpZiB0aGUgY3VzdG9tIG1lcmdlZCBJUFAgbW9kdWxlIGlzIGFscmVhZHkgZm91bmQuCisgICAgICAgIGlmKCBpIDwgQ1ZfUExVR0lOX01LTCAmJiBsb2FkX2ZsYWcgJiYgcGx1Z2luc1tDVl9QTFVHSU5fT1BUQ1ZdLmhhbmRsZSAhPSAwICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmKCBsb2FkX2ZsYWcgJiYgcGx1Z2luc1tpXS5iYXNlbmFtZSAmJgorICAgICAgICAgICAgKGFyY2ggPT0gQ1ZfUFJPQ19JQTMyX0dFTkVSSUMgfHwgYXJjaCA9PSBDVl9QUk9DX0lBNjQgfHwgYXJjaCA9PSBDVl9QUk9DX0VNNjRUKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBzdWZmaXggPSBpID09IENWX1BMVUdJTl9PUFRDViA/IG9wZW5jdl9zZnggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPCBDVl9QTFVHSU5fTUtMID8gaXBwX3N1ZmZpeCA6IG1rbF9zdWZmaXg7CisgICAgICAgICAgICBpZiggc3VmZml4ID09IG1rbF9zZnhfaWEzMiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoICEoY3B1X2luZm8tPm1vZGVsICYgQ1ZfUFJPQ19JQTMyX1dJVEhfU1NFMikgKQorICAgICAgICAgICAgICAgICAgICBzdWZmaXgrKzsKKyAgICAgICAgICAgICAgICBpZiggIShjcHVfaW5mby0+bW9kZWwgJiBDVl9QUk9DX0lBMzJfV0lUSF9TU0UpICkKKyAgICAgICAgICAgICAgICAgICAgc3VmZml4Kys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyAqc3VmZml4ICE9IDA7IHN1ZmZpeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCBwbHVnaW5zW2ldLm5hbWUsIERMTF9QUkVGSVggIiVzJXMiIERMTF9ERUJVR19GTEFHIERMTF9TVUZGSVgsCisgICAgICAgICAgICAgICAgICAgIHBsdWdpbnNbaV0uYmFzZW5hbWUsICpzdWZmaXggKTsKKworICAgICAgICAgICAgICAgIElDVl9QUklOVEYoKCJsb2FkaW5nICVzLi4uXG4iLCBwbHVnaW5zW2ldLm5hbWUgKSk7CisgICAgICAgICAgICAgICAgcGx1Z2luc1tpXS5oYW5kbGUgPSBMb2FkTGlicmFyeSggcGx1Z2luc1tpXS5uYW1lICk7CisgICAgICAgICAgICAgICAgaWYoIHBsdWdpbnNbaV0uaGFuZGxlICE9IDAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSUNWX1BSSU5URigoIiVzIGxvYWRlZFxuIiwgcGx1Z2luc1tpXS5uYW1lICkpOworICAgICAgICAgICAgICAgICAgICBsb2FkZWRfbW9kdWxlcysrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgI2lmbmRlZiBXSU4zMgorICAgICAgICAgICAgICAgIC8vIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBNYWNPU1ggCisgICAgICAgICAgICAgICAgc3ByaW50ZiggcGx1Z2luc1tpXS5uYW1lLCBETExfUFJFRklYICIlcyVzIiBETExfREVCVUdfRkxBRyAiLmR5bGliIiwKKyAgICAgICAgICAgICAgICAgICAgcGx1Z2luc1tpXS5iYXNlbmFtZSwgKnN1ZmZpeCApOworCisgICAgICAgICAgICAgICAgSUNWX1BSSU5URigoImxvYWRpbmcgJXMuLi5cbiIsIHBsdWdpbnNbaV0ubmFtZSApKTsKKyAgICAgICAgICAgICAgICBwbHVnaW5zW2ldLmhhbmRsZSA9IExvYWRMaWJyYXJ5KCBwbHVnaW5zW2ldLm5hbWUgKTsKKyAgICAgICAgICAgICAgICBpZiggcGx1Z2luc1tpXS5oYW5kbGUgIT0gMCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJQ1ZfUFJJTlRGKCgiJXMgbG9hZGVkXG4iLCBwbHVnaW5zW2ldLm5hbWUgKSk7CisgICAgICAgICAgICAgICAgICAgIGxvYWRlZF9tb2R1bGVzKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciggbW9kdWxlID0gQ3ZNb2R1bGU6OmZpcnN0OyBtb2R1bGUgIT0gMDsgbW9kdWxlID0gbW9kdWxlLT5uZXh0ICkKKyAgICAgICAgbG9hZGVkX2Z1bmN0aW9ucyArPSBpY3ZVcGRhdGVQbHVnaW5GdW5jVGFiKCBtb2R1bGUtPmZ1bmNfdGFiICk7CisKKyAgICByZXR1cm4gbG9hZGVkX2Z1bmN0aW9uczsKK30KKworQ3ZNb2R1bGUgY3hjb3JlX21vZHVsZSggJmN4Y29yZV9pbmZvICk7CisKK0NWX0lNUEwgdm9pZAorY3ZHZXRNb2R1bGVJbmZvKCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyICoqdmVyc2lvbiwgY29uc3QgY2hhciAqKnBsdWdpbl9saXN0ICkKK3sKKyAgICBzdGF0aWMgY2hhciBqb2ludF92ZXJpbmZvWzEwMjRdID0gIiI7CisgICAgc3RhdGljIGNoYXIgcGx1Z2luX2xpc3RfYnVmWzEwMjRdID0gIiI7CisKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0TGlicmFyeUluZm8iICk7CisKKyAgICBpZiggdmVyc2lvbiApCisgICAgICAgICp2ZXJzaW9uID0gMDsKKworICAgIGlmKCBwbHVnaW5fbGlzdCApCisgICAgICAgICpwbHVnaW5fbGlzdCA9IDA7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1vZHVsZUluZm8qIG1vZHVsZTsKKworICAgIGlmKCB2ZXJzaW9uICkKKyAgICB7CisgICAgICAgIGlmKCBuYW1lICkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGksIG5hbWVfbGVuID0gc3RybGVuKG5hbWUpOworCisgICAgICAgICAgICBmb3IoIG1vZHVsZSA9IEN2TW9kdWxlOjpmaXJzdDsgbW9kdWxlICE9IDA7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHN0cmxlbihtb2R1bGUtPm5hbWUpID09IG5hbWVfbGVuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGMwID0gdG91cHBlcihtb2R1bGUtPm5hbWVbaV0pLCBjMSA9IHRvdXBwZXIobmFtZVtpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYzAgIT0gYzEgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCBpID09IG5hbWVfbGVuICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhbW9kdWxlICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT2JqZWN0Tm90Rm91bmQsICJUaGUgbW9kdWxlIGlzIG5vdCBmb3VuZCIgKTsKKworICAgICAgICAgICAgKnZlcnNpb24gPSBtb2R1bGUtPnZlcnNpb247CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjaGFyKiBwdHIgPSBqb2ludF92ZXJpbmZvOworCisgICAgICAgICAgICBmb3IoIG1vZHVsZSA9IEN2TW9kdWxlOjpmaXJzdDsgbW9kdWxlICE9IDA7IG1vZHVsZSA9IG1vZHVsZS0+bmV4dCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3ByaW50ZiggcHRyLCAiJXM6ICVzJXMiLCBtb2R1bGUtPm5hbWUsIG1vZHVsZS0+dmVyc2lvbiwgbW9kdWxlLT5uZXh0ID8gIiwgIiA6ICIiICk7CisgICAgICAgICAgICAgICAgcHRyICs9IHN0cmxlbihwdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqdmVyc2lvbiA9IGpvaW50X3ZlcmluZm87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggcGx1Z2luX2xpc3QgKQorICAgIHsKKyAgICAgICAgY2hhciogcHRyID0gcGx1Z2luX2xpc3RfYnVmOworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgQ1ZfUExVR0lOX01BWDsgaSsrICkKKyAgICAgICAgICAgIGlmKCBwbHVnaW5zW2ldLmhhbmRsZSAhPSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKCBwdHIsICIlcywgIiwgcGx1Z2luc1tpXS5uYW1lICk7CisgICAgICAgICAgICAgICAgcHRyICs9IHN0cmxlbihwdHIpOworICAgICAgICAgICAgfQorCisgICAgICAgIGlmKCBwdHIgPiBwbHVnaW5fbGlzdF9idWYgKQorICAgICAgICB7CisgICAgICAgICAgICBwdHJbLTJdID0gJ1wwJzsKKyAgICAgICAgICAgICpwbHVnaW5fbGlzdCA9IHBsdWdpbl9saXN0X2J1ZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICAqcGx1Z2luX2xpc3QgPSAiIjsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3R5cGVkZWYgaW50NjQgKENWX0NERUNMICogcmR0c2NfZnVuYykodm9pZCk7CisKKy8qIGhlbHBlciBmdW5jdGlvbnMgZm9yIFJORyBpbml0aWFsaXphdGlvbiBhbmQgYWNjdXJhdGUgdGltZSBtZWFzdXJlbWVudCAqLworQ1ZfSU1QTCAgaW50NjQgIGN2R2V0VGlja0NvdW50KCB2b2lkICkKK3sKKyAgICBjb25zdCBDdlByb2Nlc3NvckluZm8qIGNwdV9pbmZvID0gaWN2R2V0UHJvY2Vzc29ySW5mbygpOworCisgICAgaWYoIGNwdV9pbmZvLT5mcmVxdWVuY3kgPiAxICYmCisgICAgICAgIENWX0dFVF9QUk9DX0FSQ0goY3B1X2luZm8tPm1vZGVsKSA9PSBDVl9QUk9DX0lBMzJfR0VORVJJQyApCisgICAgeworI2lmZGVmIE1BU01fSU5MSU5FX0FTU0VNQkxZCisgICAgI2lmZGVmIF9fQk9STEFORENfXworICAgICAgICBfX2FzbSBkYiAwZmgKKyAgICAgICAgX19hc20gZGIgMzFoCisgICAgI2Vsc2UKKyAgICAgICAgX19hc20gX2VtaXQgMHgwZjsKKyAgICAgICAgX19hc20gX2VtaXQgMHgzMTsKKyAgICAjZW5kaWYKKyNlbGlmIChkZWZpbmVkIF9fR05VQ19fIHx8IGRlZmluZWQgQ1ZfSUNDKSAmJiBkZWZpbmVkIF9faTM4Nl9fCisgICAgICAgIGludDY0IHQ7CisgICAgICAgIGFzbSB2b2xhdGlsZSAoIi5ieXRlIDB4ZjsgLmJ5dGUgMHgzMSIgLyogInJkdHNjIiAqLyA6ICI9QSIgKHQpKTsKKyAgICAgICAgcmV0dXJuIHQ7CisjZWxzZQorICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBjb2RlW10gPSAiXHgwZlx4MzFceGMzIjsKKyAgICAgICAgcmR0c2NfZnVuYyBmdW5jID0gKHJkdHNjX2Z1bmMpKHZvaWQqKWNvZGU7CisgICAgICAgIHJldHVybiBmdW5jKCk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyNpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQKKyAgICAgICAgTEFSR0VfSU5URUdFUiBjb3VudGVyOworICAgICAgICBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJmNvdW50ZXIgKTsKKyAgICAgICAgcmV0dXJuIChpbnQ2NCljb3VudGVyLlF1YWRQYXJ0OworI2Vsc2UKKyAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgICAgIHN0cnVjdCB0aW1lem9uZSB0ejsKKyAgICAgICAgZ2V0dGltZW9mZGF5KCAmdHYsICZ0eiApOworICAgICAgICByZXR1cm4gKGludDY0KXR2LnR2X3NlYyoxMDAwMDAwICsgdHYudHZfdXNlYzsKKyNlbmRpZgorICAgIH0KK30KKworQ1ZfSU1QTCAgZG91YmxlICBjdkdldFRpY2tGcmVxdWVuY3koKQoreworICAgIHJldHVybiBpY3ZHZXRQcm9jZXNzb3JJbmZvKCktPmZyZXF1ZW5jeTsKK30KKworCitzdGF0aWMgaW50IGljdk51bVRocmVhZHMgPSAwOworc3RhdGljIGludCBpY3ZOdW1Qcm9jcyA9IDA7CisKK0NWX0lNUEwgaW50IGN2R2V0TnVtVGhyZWFkcyh2b2lkKQoreworICAgIGlmKCAhaWN2TnVtUHJvY3MgKQorICAgICAgICBjdlNldE51bVRocmVhZHMoMCk7CisgICAgcmV0dXJuIGljdk51bVRocmVhZHM7Cit9CisKK0NWX0lNUEwgdm9pZCBjdlNldE51bVRocmVhZHMoIGludCB0aHJlYWRzICkKK3sKKyAgICBpZiggIWljdk51bVByb2NzICkKKyAgICB7CisjaWZkZWYgX09QRU5NUAorICAgICAgICBpY3ZOdW1Qcm9jcyA9IG9tcF9nZXRfbnVtX3Byb2NzKCk7CisgICAgICAgIGljdk51bVByb2NzID0gTUlOKCBpY3ZOdW1Qcm9jcywgQ1ZfTUFYX1RIUkVBRFMgKTsKKyNlbHNlCisgICAgICAgIGljdk51bVByb2NzID0gMTsKKyNlbmRpZgorICAgIH0KKworI2lmZGVmIF9PUEVOTVAKKyAgICBpZiggdGhyZWFkcyA8PSAwICkKKyAgICAgICAgdGhyZWFkcyA9IGljdk51bVByb2NzOworICAgIC8vZWxzZQorICAgIC8vICAgIHRocmVhZHMgPSBNSU4oIHRocmVhZHMsIGljdk51bVByb2NzICk7CisKKyAgICBpY3ZOdW1UaHJlYWRzID0gdGhyZWFkczsKKyNlbHNlCisgICAgaWN2TnVtVGhyZWFkcyA9IDE7CisjZW5kaWYKK30KKworCitDVl9JTVBMIGludCBjdkdldFRocmVhZE51bSh2b2lkKQoreworI2lmZGVmIF9PUEVOTVAKKyAgICByZXR1cm4gb21wX2dldF90aHJlYWRfbnVtKCk7CisjZWxzZQorICAgIHJldHVybiAwOworI2VuZGlmCit9CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4dGFibGVzLmNwcCBiL2N4Y29yZS9zcmMvY3h0YWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTQ0NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jeGNvcmUvc3JjL2N4dGFibGVzLmNwcApAQCAtMCwwICsxLDIxMCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIEN2TWF0IGhlbHBlciB0YWJsZXMKKy8vCisvLyAqLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCitjb25zdCBzaWduZWQgY2hhciBpY3ZEZXB0aFRvVHlwZVtdID0KK3sKKyAgICAtMSwgLTEsIENWXzhVLCBDVl84UywgQ1ZfMTZVLCBDVl8xNlMsIC0xLCAtMSwKKyAgICBDVl8zMkYsIENWXzMyUywgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgQ1ZfNjRGLCAtMQorfTsKKworY29uc3QgZmxvYXQgaWN2OHgzMmZUYWJbXSA9Cit7CisgICAgLTEyOC5mLCAtMTI3LmYsIC0xMjYuZiwgLTEyNS5mLCAtMTI0LmYsIC0xMjMuZiwgLTEyMi5mLCAtMTIxLmYsCisgICAgLTEyMC5mLCAtMTE5LmYsIC0xMTguZiwgLTExNy5mLCAtMTE2LmYsIC0xMTUuZiwgLTExNC5mLCAtMTEzLmYsCisgICAgLTExMi5mLCAtMTExLmYsIC0xMTAuZiwgLTEwOS5mLCAtMTA4LmYsIC0xMDcuZiwgLTEwNi5mLCAtMTA1LmYsCisgICAgLTEwNC5mLCAtMTAzLmYsIC0xMDIuZiwgLTEwMS5mLCAtMTAwLmYsICAtOTkuZiwgIC05OC5mLCAgLTk3LmYsCisgICAgIC05Ni5mLCAgLTk1LmYsICAtOTQuZiwgIC05My5mLCAgLTkyLmYsICAtOTEuZiwgIC05MC5mLCAgLTg5LmYsCisgICAgIC04OC5mLCAgLTg3LmYsICAtODYuZiwgIC04NS5mLCAgLTg0LmYsICAtODMuZiwgIC04Mi5mLCAgLTgxLmYsCisgICAgIC04MC5mLCAgLTc5LmYsICAtNzguZiwgIC03Ny5mLCAgLTc2LmYsICAtNzUuZiwgIC03NC5mLCAgLTczLmYsCisgICAgIC03Mi5mLCAgLTcxLmYsICAtNzAuZiwgIC02OS5mLCAgLTY4LmYsICAtNjcuZiwgIC02Ni5mLCAgLTY1LmYsCisgICAgIC02NC5mLCAgLTYzLmYsICAtNjIuZiwgIC02MS5mLCAgLTYwLmYsICAtNTkuZiwgIC01OC5mLCAgLTU3LmYsCisgICAgIC01Ni5mLCAgLTU1LmYsICAtNTQuZiwgIC01My5mLCAgLTUyLmYsICAtNTEuZiwgIC01MC5mLCAgLTQ5LmYsCisgICAgIC00OC5mLCAgLTQ3LmYsICAtNDYuZiwgIC00NS5mLCAgLTQ0LmYsICAtNDMuZiwgIC00Mi5mLCAgLTQxLmYsCisgICAgIC00MC5mLCAgLTM5LmYsICAtMzguZiwgIC0zNy5mLCAgLTM2LmYsICAtMzUuZiwgIC0zNC5mLCAgLTMzLmYsCisgICAgIC0zMi5mLCAgLTMxLmYsICAtMzAuZiwgIC0yOS5mLCAgLTI4LmYsICAtMjcuZiwgIC0yNi5mLCAgLTI1LmYsCisgICAgIC0yNC5mLCAgLTIzLmYsICAtMjIuZiwgIC0yMS5mLCAgLTIwLmYsICAtMTkuZiwgIC0xOC5mLCAgLTE3LmYsCisgICAgIC0xNi5mLCAgLTE1LmYsICAtMTQuZiwgIC0xMy5mLCAgLTEyLmYsICAtMTEuZiwgIC0xMC5mLCAgIC05LmYsCisgICAgICAtOC5mLCAgIC03LmYsICAgLTYuZiwgICAtNS5mLCAgIC00LmYsICAgLTMuZiwgICAtMi5mLCAgIC0xLmYsCisgICAgICAgMC5mLCAgICAxLmYsICAgIDIuZiwgICAgMy5mLCAgICA0LmYsICAgIDUuZiwgICAgNi5mLCAgICA3LmYsCisgICAgICAgOC5mLCAgICA5LmYsICAgMTAuZiwgICAxMS5mLCAgIDEyLmYsICAgMTMuZiwgICAxNC5mLCAgIDE1LmYsCisgICAgICAxNi5mLCAgIDE3LmYsICAgMTguZiwgICAxOS5mLCAgIDIwLmYsICAgMjEuZiwgICAyMi5mLCAgIDIzLmYsCisgICAgICAyNC5mLCAgIDI1LmYsICAgMjYuZiwgICAyNy5mLCAgIDI4LmYsICAgMjkuZiwgICAzMC5mLCAgIDMxLmYsCisgICAgICAzMi5mLCAgIDMzLmYsICAgMzQuZiwgICAzNS5mLCAgIDM2LmYsICAgMzcuZiwgICAzOC5mLCAgIDM5LmYsCisgICAgICA0MC5mLCAgIDQxLmYsICAgNDIuZiwgICA0My5mLCAgIDQ0LmYsICAgNDUuZiwgICA0Ni5mLCAgIDQ3LmYsCisgICAgICA0OC5mLCAgIDQ5LmYsICAgNTAuZiwgICA1MS5mLCAgIDUyLmYsICAgNTMuZiwgICA1NC5mLCAgIDU1LmYsCisgICAgICA1Ni5mLCAgIDU3LmYsICAgNTguZiwgICA1OS5mLCAgIDYwLmYsICAgNjEuZiwgICA2Mi5mLCAgIDYzLmYsCisgICAgICA2NC5mLCAgIDY1LmYsICAgNjYuZiwgICA2Ny5mLCAgIDY4LmYsICAgNjkuZiwgICA3MC5mLCAgIDcxLmYsCisgICAgICA3Mi5mLCAgIDczLmYsICAgNzQuZiwgICA3NS5mLCAgIDc2LmYsICAgNzcuZiwgICA3OC5mLCAgIDc5LmYsCisgICAgICA4MC5mLCAgIDgxLmYsICAgODIuZiwgICA4My5mLCAgIDg0LmYsICAgODUuZiwgICA4Ni5mLCAgIDg3LmYsCisgICAgICA4OC5mLCAgIDg5LmYsICAgOTAuZiwgICA5MS5mLCAgIDkyLmYsICAgOTMuZiwgICA5NC5mLCAgIDk1LmYsCisgICAgICA5Ni5mLCAgIDk3LmYsICAgOTguZiwgICA5OS5mLCAgMTAwLmYsICAxMDEuZiwgIDEwMi5mLCAgMTAzLmYsCisgICAgIDEwNC5mLCAgMTA1LmYsICAxMDYuZiwgIDEwNy5mLCAgMTA4LmYsICAxMDkuZiwgIDExMC5mLCAgMTExLmYsCisgICAgIDExMi5mLCAgMTEzLmYsICAxMTQuZiwgIDExNS5mLCAgMTE2LmYsICAxMTcuZiwgIDExOC5mLCAgMTE5LmYsCisgICAgIDEyMC5mLCAgMTIxLmYsICAxMjIuZiwgIDEyMy5mLCAgMTI0LmYsICAxMjUuZiwgIDEyNi5mLCAgMTI3LmYsCisgICAgIDEyOC5mLCAgMTI5LmYsICAxMzAuZiwgIDEzMS5mLCAgMTMyLmYsICAxMzMuZiwgIDEzNC5mLCAgMTM1LmYsCisgICAgIDEzNi5mLCAgMTM3LmYsICAxMzguZiwgIDEzOS5mLCAgMTQwLmYsICAxNDEuZiwgIDE0Mi5mLCAgMTQzLmYsCisgICAgIDE0NC5mLCAgMTQ1LmYsICAxNDYuZiwgIDE0Ny5mLCAgMTQ4LmYsICAxNDkuZiwgIDE1MC5mLCAgMTUxLmYsCisgICAgIDE1Mi5mLCAgMTUzLmYsICAxNTQuZiwgIDE1NS5mLCAgMTU2LmYsICAxNTcuZiwgIDE1OC5mLCAgMTU5LmYsCisgICAgIDE2MC5mLCAgMTYxLmYsICAxNjIuZiwgIDE2My5mLCAgMTY0LmYsICAxNjUuZiwgIDE2Ni5mLCAgMTY3LmYsCisgICAgIDE2OC5mLCAgMTY5LmYsICAxNzAuZiwgIDE3MS5mLCAgMTcyLmYsICAxNzMuZiwgIDE3NC5mLCAgMTc1LmYsCisgICAgIDE3Ni5mLCAgMTc3LmYsICAxNzguZiwgIDE3OS5mLCAgMTgwLmYsICAxODEuZiwgIDE4Mi5mLCAgMTgzLmYsCisgICAgIDE4NC5mLCAgMTg1LmYsICAxODYuZiwgIDE4Ny5mLCAgMTg4LmYsICAxODkuZiwgIDE5MC5mLCAgMTkxLmYsCisgICAgIDE5Mi5mLCAgMTkzLmYsICAxOTQuZiwgIDE5NS5mLCAgMTk2LmYsICAxOTcuZiwgIDE5OC5mLCAgMTk5LmYsCisgICAgIDIwMC5mLCAgMjAxLmYsICAyMDIuZiwgIDIwMy5mLCAgMjA0LmYsICAyMDUuZiwgIDIwNi5mLCAgMjA3LmYsCisgICAgIDIwOC5mLCAgMjA5LmYsICAyMTAuZiwgIDIxMS5mLCAgMjEyLmYsICAyMTMuZiwgIDIxNC5mLCAgMjE1LmYsCisgICAgIDIxNi5mLCAgMjE3LmYsICAyMTguZiwgIDIxOS5mLCAgMjIwLmYsICAyMjEuZiwgIDIyMi5mLCAgMjIzLmYsCisgICAgIDIyNC5mLCAgMjI1LmYsICAyMjYuZiwgIDIyNy5mLCAgMjI4LmYsICAyMjkuZiwgIDIzMC5mLCAgMjMxLmYsCisgICAgIDIzMi5mLCAgMjMzLmYsICAyMzQuZiwgIDIzNS5mLCAgMjM2LmYsICAyMzcuZiwgIDIzOC5mLCAgMjM5LmYsCisgICAgIDI0MC5mLCAgMjQxLmYsICAyNDIuZiwgIDI0My5mLCAgMjQ0LmYsICAyNDUuZiwgIDI0Ni5mLCAgMjQ3LmYsCisgICAgIDI0OC5mLCAgMjQ5LmYsICAyNTAuZiwgIDI1MS5mLCAgMjUyLmYsICAyNTMuZiwgIDI1NC5mLCAgMjU1LmYKK307CisKKy8qIFstMjU1Li4yNTVdLl4yICovCitjb25zdCB1c2hvcnQgaWN2OHgxNnVTcXJUYWJbXSA9IAoreworICAgIDY1MDI1LCA2NDUxNiwgNjQwMDksIDYzNTA0LCA2MzAwMSwgNjI1MDAsIDYyMDAxLCA2MTUwNCwgNjEwMDksIDYwNTE2LCA2MDAyNSwgNTk1MzYsCisgICAgNTkwNDksIDU4NTY0LCA1ODA4MSwgNTc2MDAsIDU3MTIxLCA1NjY0NCwgNTYxNjksIDU1Njk2LCA1NTIyNSwgNTQ3NTYsIDU0Mjg5LCA1MzgyNCwKKyAgICA1MzM2MSwgNTI5MDAsIDUyNDQxLCA1MTk4NCwgNTE1MjksIDUxMDc2LCA1MDYyNSwgNTAxNzYsIDQ5NzI5LCA0OTI4NCwgNDg4NDEsIDQ4NDAwLAorICAgIDQ3OTYxLCA0NzUyNCwgNDcwODksIDQ2NjU2LCA0NjIyNSwgNDU3OTYsIDQ1MzY5LCA0NDk0NCwgNDQ1MjEsIDQ0MTAwLCA0MzY4MSwgNDMyNjQsCisgICAgNDI4NDksIDQyNDM2LCA0MjAyNSwgNDE2MTYsIDQxMjA5LCA0MDgwNCwgNDA0MDEsIDQwMDAwLCAzOTYwMSwgMzkyMDQsIDM4ODA5LCAzODQxNiwKKyAgICAzODAyNSwgMzc2MzYsIDM3MjQ5LCAzNjg2NCwgMzY0ODEsIDM2MTAwLCAzNTcyMSwgMzUzNDQsIDM0OTY5LCAzNDU5NiwgMzQyMjUsIDMzODU2LAorICAgIDMzNDg5LCAzMzEyNCwgMzI3NjEsIDMyNDAwLCAzMjA0MSwgMzE2ODQsIDMxMzI5LCAzMDk3NiwgMzA2MjUsIDMwMjc2LCAyOTkyOSwgMjk1ODQsCisgICAgMjkyNDEsIDI4OTAwLCAyODU2MSwgMjgyMjQsIDI3ODg5LCAyNzU1NiwgMjcyMjUsIDI2ODk2LCAyNjU2OSwgMjYyNDQsIDI1OTIxLCAyNTYwMCwKKyAgICAyNTI4MSwgMjQ5NjQsIDI0NjQ5LCAyNDMzNiwgMjQwMjUsIDIzNzE2LCAyMzQwOSwgMjMxMDQsIDIyODAxLCAyMjUwMCwgMjIyMDEsIDIxOTA0LAorICAgIDIxNjA5LCAyMTMxNiwgMjEwMjUsIDIwNzM2LCAyMDQ0OSwgMjAxNjQsIDE5ODgxLCAxOTYwMCwgMTkzMjEsIDE5MDQ0LCAxODc2OSwgMTg0OTYsCisgICAgMTgyMjUsIDE3OTU2LCAxNzY4OSwgMTc0MjQsIDE3MTYxLCAxNjkwMCwgMTY2NDEsIDE2Mzg0LCAxNjEyOSwgMTU4NzYsIDE1NjI1LCAxNTM3NiwKKyAgICAxNTEyOSwgMTQ4ODQsIDE0NjQxLCAxNDQwMCwgMTQxNjEsIDEzOTI0LCAxMzY4OSwgMTM0NTYsIDEzMjI1LCAxMjk5NiwgMTI3NjksIDEyNTQ0LAorICAgIDEyMzIxLCAxMjEwMCwgMTE4ODEsIDExNjY0LCAxMTQ0OSwgMTEyMzYsIDExMDI1LCAxMDgxNiwgMTA2MDksIDEwNDA0LCAxMDIwMSwgMTAwMDAsCisgICAgIDk4MDEsICA5NjA0LCAgOTQwOSwgIDkyMTYsICA5MDI1LCAgODgzNiwgIDg2NDksICA4NDY0LCAgODI4MSwgIDgxMDAsICA3OTIxLCAgNzc0NCwKKyAgICAgNzU2OSwgIDczOTYsICA3MjI1LCAgNzA1NiwgIDY4ODksICA2NzI0LCAgNjU2MSwgIDY0MDAsICA2MjQxLCAgNjA4NCwgIDU5MjksICA1Nzc2LAorICAgICA1NjI1LCAgNTQ3NiwgIDUzMjksICA1MTg0LCAgNTA0MSwgIDQ5MDAsICA0NzYxLCAgNDYyNCwgIDQ0ODksICA0MzU2LCAgNDIyNSwgIDQwOTYsCisgICAgIDM5NjksICAzODQ0LCAgMzcyMSwgIDM2MDAsICAzNDgxLCAgMzM2NCwgIDMyNDksICAzMTM2LCAgMzAyNSwgIDI5MTYsICAyODA5LCAgMjcwNCwKKyAgICAgMjYwMSwgIDI1MDAsICAyNDAxLCAgMjMwNCwgIDIyMDksICAyMTE2LCAgMjAyNSwgIDE5MzYsICAxODQ5LCAgMTc2NCwgIDE2ODEsICAxNjAwLAorICAgICAxNTIxLCAgMTQ0NCwgIDEzNjksICAxMjk2LCAgMTIyNSwgIDExNTYsICAxMDg5LCAgMTAyNCwgICA5NjEsICAgOTAwLCAgIDg0MSwgICA3ODQsCisgICAgICA3MjksICAgNjc2LCAgIDYyNSwgICA1NzYsICAgNTI5LCAgIDQ4NCwgICA0NDEsICAgNDAwLCAgIDM2MSwgICAzMjQsICAgMjg5LCAgIDI1NiwKKyAgICAgIDIyNSwgICAxOTYsICAgMTY5LCAgIDE0NCwgICAxMjEsICAgMTAwLCAgICA4MSwgICAgNjQsICAgIDQ5LCAgICAzNiwgICAgMjUsICAgIDE2LAorICAgICAgICA5LCAgICAgNCwgICAgIDEsICAgICAwLCAgICAgMSwgICAgIDQsICAgICA5LCAgICAxNiwgICAgMjUsICAgIDM2LCAgICA0OSwgICAgNjQsCisgICAgICAgODEsICAgMTAwLCAgIDEyMSwgICAxNDQsICAgMTY5LCAgIDE5NiwgICAyMjUsICAgMjU2LCAgIDI4OSwgICAzMjQsICAgMzYxLCAgIDQwMCwKKyAgICAgIDQ0MSwgICA0ODQsICAgNTI5LCAgIDU3NiwgICA2MjUsICAgNjc2LCAgIDcyOSwgICA3ODQsICAgODQxLCAgIDkwMCwgICA5NjEsICAxMDI0LAorICAgICAxMDg5LCAgMTE1NiwgIDEyMjUsICAxMjk2LCAgMTM2OSwgIDE0NDQsICAxNTIxLCAgMTYwMCwgIDE2ODEsICAxNzY0LCAgMTg0OSwgIDE5MzYsCisgICAgIDIwMjUsICAyMTE2LCAgMjIwOSwgIDIzMDQsICAyNDAxLCAgMjUwMCwgIDI2MDEsICAyNzA0LCAgMjgwOSwgIDI5MTYsICAzMDI1LCAgMzEzNiwKKyAgICAgMzI0OSwgIDMzNjQsICAzNDgxLCAgMzYwMCwgIDM3MjEsICAzODQ0LCAgMzk2OSwgIDQwOTYsICA0MjI1LCAgNDM1NiwgIDQ0ODksICA0NjI0LAorICAgICA0NzYxLCAgNDkwMCwgIDUwNDEsICA1MTg0LCAgNTMyOSwgIDU0NzYsICA1NjI1LCAgNTc3NiwgIDU5MjksICA2MDg0LCAgNjI0MSwgIDY0MDAsCisgICAgIDY1NjEsICA2NzI0LCAgNjg4OSwgIDcwNTYsICA3MjI1LCAgNzM5NiwgIDc1NjksICA3NzQ0LCAgNzkyMSwgIDgxMDAsICA4MjgxLCAgODQ2NCwKKyAgICAgODY0OSwgIDg4MzYsICA5MDI1LCAgOTIxNiwgIDk0MDksICA5NjA0LCAgOTgwMSwgMTAwMDAsIDEwMjAxLCAxMDQwNCwgMTA2MDksIDEwODE2LAorICAgIDExMDI1LCAxMTIzNiwgMTE0NDksIDExNjY0LCAxMTg4MSwgMTIxMDAsIDEyMzIxLCAxMjU0NCwgMTI3NjksIDEyOTk2LCAxMzIyNSwgMTM0NTYsCisgICAgMTM2ODksIDEzOTI0LCAxNDE2MSwgMTQ0MDAsIDE0NjQxLCAxNDg4NCwgMTUxMjksIDE1Mzc2LCAxNTYyNSwgMTU4NzYsIDE2MTI5LCAxNjM4NCwKKyAgICAxNjY0MSwgMTY5MDAsIDE3MTYxLCAxNzQyNCwgMTc2ODksIDE3OTU2LCAxODIyNSwgMTg0OTYsIDE4NzY5LCAxOTA0NCwgMTkzMjEsIDE5NjAwLAorICAgIDE5ODgxLCAyMDE2NCwgMjA0NDksIDIwNzM2LCAyMTAyNSwgMjEzMTYsIDIxNjA5LCAyMTkwNCwgMjIyMDEsIDIyNTAwLCAyMjgwMSwgMjMxMDQsCisgICAgMjM0MDksIDIzNzE2LCAyNDAyNSwgMjQzMzYsIDI0NjQ5LCAyNDk2NCwgMjUyODEsIDI1NjAwLCAyNTkyMSwgMjYyNDQsIDI2NTY5LCAyNjg5NiwKKyAgICAyNzIyNSwgMjc1NTYsIDI3ODg5LCAyODIyNCwgMjg1NjEsIDI4OTAwLCAyOTI0MSwgMjk1ODQsIDI5OTI5LCAzMDI3NiwgMzA2MjUsIDMwOTc2LAorICAgIDMxMzI5LCAzMTY4NCwgMzIwNDEsIDMyNDAwLCAzMjc2MSwgMzMxMjQsIDMzNDg5LCAzMzg1NiwgMzQyMjUsIDM0NTk2LCAzNDk2OSwgMzUzNDQsCisgICAgMzU3MjEsIDM2MTAwLCAzNjQ4MSwgMzY4NjQsIDM3MjQ5LCAzNzYzNiwgMzgwMjUsIDM4NDE2LCAzODgwOSwgMzkyMDQsIDM5NjAxLCA0MDAwMCwKKyAgICA0MDQwMSwgNDA4MDQsIDQxMjA5LCA0MTYxNiwgNDIwMjUsIDQyNDM2LCA0Mjg0OSwgNDMyNjQsIDQzNjgxLCA0NDEwMCwgNDQ1MjEsIDQ0OTQ0LAorICAgIDQ1MzY5LCA0NTc5NiwgNDYyMjUsIDQ2NjU2LCA0NzA4OSwgNDc1MjQsIDQ3OTYxLCA0ODQwMCwgNDg4NDEsIDQ5Mjg0LCA0OTcyOSwgNTAxNzYsCisgICAgNTA2MjUsIDUxMDc2LCA1MTUyOSwgNTE5ODQsIDUyNDQxLCA1MjkwMCwgNTMzNjEsIDUzODI0LCA1NDI4OSwgNTQ3NTYsIDU1MjI1LCA1NTY5NiwKKyAgICA1NjE2OSwgNTY2NDQsIDU3MTIxLCA1NzYwMCwgNTgwODEsIDU4NTY0LCA1OTA0OSwgNTk1MzYsIDYwMDI1LCA2MDUxNiwgNjEwMDksIDYxNTA0LAorICAgIDYyMDAxLCA2MjUwMCwgNjMwMDEsIDYzNTA0LCA2NDAwOSwgNjQ1MTYsIDY1MDI1Cit9OworCitjb25zdCB1Y2hhciBpY3ZTYXR1cmF0ZTh1W10gPSAKK3sKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAorICAgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKKyAgICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCisgICAgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LCAgIDcsICAgOCwgICA5LCAgMTAsICAxMSwgIDEyLCAgMTMsICAxNCwgIDE1LAorICAgICAxNiwgIDE3LCAgMTgsICAxOSwgIDIwLCAgMjEsICAyMiwgIDIzLCAgMjQsICAyNSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwKKyAgICAgMzIsICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLCAgNDEsICA0MiwgIDQzLCAgNDQsICA0NSwgIDQ2LCAgNDcsCisgICAgIDQ4LCAgNDksICA1MCwgIDUxLCAgNTIsICA1MywgIDU0LCAgNTUsICA1NiwgIDU3LCAgNTgsICA1OSwgIDYwLCAgNjEsICA2MiwgIDYzLAorICAgICA2NCwgIDY1LCAgNjYsICA2NywgIDY4LCAgNjksICA3MCwgIDcxLCAgNzIsICA3MywgIDc0LCAgNzUsICA3NiwgIDc3LCAgNzgsICA3OSwKKyAgICAgODAsICA4MSwgIDgyLCAgODMsICA4NCwgIDg1LCAgODYsICA4NywgIDg4LCAgODksICA5MCwgIDkxLCAgOTIsICA5MywgIDk0LCAgOTUsCisgICAgIDk2LCAgOTcsICA5OCwgIDk5LCAxMDAsIDEwMSwgMTAyLCAxMDMsIDEwNCwgMTA1LCAxMDYsIDEwNywgMTA4LCAxMDksIDExMCwgMTExLAorICAgIDExMiwgMTEzLCAxMTQsIDExNSwgMTE2LCAxMTcsIDExOCwgMTE5LCAxMjAsIDEyMSwgMTIyLCAxMjMsIDEyNCwgMTI1LCAxMjYsIDEyNywKKyAgICAxMjgsIDEyOSwgMTMwLCAxMzEsIDEzMiwgMTMzLCAxMzQsIDEzNSwgMTM2LCAxMzcsIDEzOCwgMTM5LCAxNDAsIDE0MSwgMTQyLCAxNDMsCisgICAgMTQ0LCAxNDUsIDE0NiwgMTQ3LCAxNDgsIDE0OSwgMTUwLCAxNTEsIDE1MiwgMTUzLCAxNTQsIDE1NSwgMTU2LCAxNTcsIDE1OCwgMTU5LAorICAgIDE2MCwgMTYxLCAxNjIsIDE2MywgMTY0LCAxNjUsIDE2NiwgMTY3LCAxNjgsIDE2OSwgMTcwLCAxNzEsIDE3MiwgMTczLCAxNzQsIDE3NSwKKyAgICAxNzYsIDE3NywgMTc4LCAxNzksIDE4MCwgMTgxLCAxODIsIDE4MywgMTg0LCAxODUsIDE4NiwgMTg3LCAxODgsIDE4OSwgMTkwLCAxOTEsCisgICAgMTkyLCAxOTMsIDE5NCwgMTk1LCAxOTYsIDE5NywgMTk4LCAxOTksIDIwMCwgMjAxLCAyMDIsIDIwMywgMjA0LCAyMDUsIDIwNiwgMjA3LAorICAgIDIwOCwgMjA5LCAyMTAsIDIxMSwgMjEyLCAyMTMsIDIxNCwgMjE1LCAyMTYsIDIxNywgMjE4LCAyMTksIDIyMCwgMjIxLCAyMjIsIDIyMywKKyAgICAyMjQsIDIyNSwgMjI2LCAyMjcsIDIyOCwgMjI5LCAyMzAsIDIzMSwgMjMyLCAyMzMsIDIzNCwgMjM1LCAyMzYsIDIzNywgMjM4LCAyMzksCisgICAgMjQwLCAyNDEsIDI0MiwgMjQzLCAyNDQsIDI0NSwgMjQ2LCAyNDcsIDI0OCwgMjQ5LCAyNTAsIDI1MSwgMjUyLCAyNTMsIDI1NCwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCisgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAorICAgIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwKKyAgICAyNTUKK307CisKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9jeGNvcmUvc3JjL2N4dXRpbHMuY3BwIGIvY3hjb3JlL3NyYy9jeHV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTRkMTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY3hjb3JlL3NyYy9jeHV0aWxzLmNwcApAQCAtMCwwICsxLDEyMDYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2N4Y29yZS5oIgorCitDVl9JTVBMIHZvaWQKK2N2S01lYW5zMiggY29uc3QgQ3ZBcnIqIHNhbXBsZXNfYXJyLCBpbnQgY2x1c3Rlcl9jb3VudCwKKyAgICAgICAgICAgQ3ZBcnIqIGxhYmVsc19hcnIsIEN2VGVybUNyaXRlcmlhIHRlcm1jcml0ICkKK3sKKyAgICBDdk1hdCogY2VudGVycyA9IDA7CisgICAgQ3ZNYXQqIG9sZF9jZW50ZXJzID0gMDsKKyAgICBDdk1hdCogY291bnRlcnMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdktNZWFuczIiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzYW1wbGVzX3N0dWIsIGxhYmVsc19zdHViOworICAgIEN2TWF0KiBzYW1wbGVzID0gKEN2TWF0KilzYW1wbGVzX2FycjsKKyAgICBDdk1hdCogbGFiZWxzID0gKEN2TWF0KilsYWJlbHNfYXJyOworICAgIEN2TWF0KiB0ZW1wID0gMDsKKyAgICBDdlJORyBybmcgPSBDdlJORygtMSk7CisgICAgaW50IGksIGosIGssIHNhbXBsZV9jb3VudCwgZGltczsKKyAgICBpbnQgaWRzX2RlbHRhLCBpdGVyOworICAgIGRvdWJsZSBtYXhfZGlzdDsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBzYW1wbGVzICkpCisgICAgICAgIENWX0NBTEwoIHNhbXBsZXMgPSBjdkdldE1hdCggc2FtcGxlcywgJnNhbXBsZXNfc3R1YiApKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKCBsYWJlbHMgKSkKKyAgICAgICAgQ1ZfQ0FMTCggbGFiZWxzID0gY3ZHZXRNYXQoIGxhYmVscywgJmxhYmVsc19zdHViICkpOworCisgICAgaWYoIGNsdXN0ZXJfY291bnQgPCAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJOdW1iZXIgb2YgY2x1c3RlcnMgc2hvdWxkIGJlIHBvc2l0aXZlIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSChzYW1wbGVzLT50eXBlKSAhPSBDVl8zMkYgfHwgQ1ZfTUFUX1RZUEUobGFiZWxzLT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwKKyAgICAgICAgInNhbXBsZXMgc2hvdWxkIGJlIGZsb2F0aW5nLXBvaW50IG1hdHJpeCwgY2x1c3Rlcl9pZHggLSBpbnRlZ2VyIHZlY3RvciIgKTsKKworICAgIGlmKCAobGFiZWxzLT5yb3dzICE9IDEgJiYgKGxhYmVscy0+Y29scyAhPSAxIHx8ICFDVl9JU19NQVRfQ09OVChsYWJlbHMtPnR5cGUpKSkgfHwKKyAgICAgICAgbGFiZWxzLT5yb3dzICsgbGFiZWxzLT5jb2xzIC0gMSAhPSBzYW1wbGVzLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiY2x1c3Rlcl9pZHggc2hvdWxkIGJlIDFEIHZlY3RvciBvZiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgc2FtcGxlcycgbnVtYmVyIG9mIHJvd3MiICk7CisKKyAgICBDVl9DQUxMKCB0ZXJtY3JpdCA9IGN2Q2hlY2tUZXJtQ3JpdGVyaWEoIHRlcm1jcml0LCAxZS02LCAxMDAgKSk7CisKKyAgICB0ZXJtY3JpdC5lcHNpbG9uICo9IHRlcm1jcml0LmVwc2lsb247CisgICAgc2FtcGxlX2NvdW50ID0gc2FtcGxlcy0+cm93czsKKworICAgIGlmKCBjbHVzdGVyX2NvdW50ID4gc2FtcGxlX2NvdW50ICkKKyAgICAgICAgY2x1c3Rlcl9jb3VudCA9IHNhbXBsZV9jb3VudDsKKworICAgIGRpbXMgPSBzYW1wbGVzLT5jb2xzKkNWX01BVF9DTihzYW1wbGVzLT50eXBlKTsKKyAgICBpZHNfZGVsdGEgPSBsYWJlbHMtPnN0ZXAgPyBsYWJlbHMtPnN0ZXAvKGludClzaXplb2YoaW50KSA6IDE7CisKKyAgICBDVl9DQUxMKCBjZW50ZXJzID0gY3ZDcmVhdGVNYXQoIGNsdXN0ZXJfY291bnQsIGRpbXMsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIG9sZF9jZW50ZXJzID0gY3ZDcmVhdGVNYXQoIGNsdXN0ZXJfY291bnQsIGRpbXMsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIGNvdW50ZXJzID0gY3ZDcmVhdGVNYXQoIDEsIGNsdXN0ZXJfY291bnQsIENWXzMyU0MxICkpOworCisgICAgLy8gaW5pdCBjZW50ZXJzCisgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgbGFiZWxzLT5kYXRhLmlbaV0gPSBjdlJhbmRJbnQoJnJuZykgJSBjbHVzdGVyX2NvdW50OworCisgICAgY291bnRlcnMtPmNvbHMgPSBjbHVzdGVyX2NvdW50OyAvLyBjdXQgZG93biBjb3VudGVycworICAgIG1heF9kaXN0ID0gdGVybWNyaXQuZXBzaWxvbioyOworCisgICAgZm9yKCBpdGVyID0gMDsgaXRlciA8IHRlcm1jcml0Lm1heF9pdGVyOyBpdGVyKysgKQorICAgIHsKKyAgICAgICAgLy8gY29tcHV0ZXIgY2VudGVycworICAgICAgICBjdlplcm8oIGNlbnRlcnMgKTsKKyAgICAgICAgY3ZaZXJvKCBjb3VudGVycyApOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiBzID0gKGZsb2F0Kikoc2FtcGxlcy0+ZGF0YS5wdHIgKyBpKnNhbXBsZXMtPnN0ZXApOworICAgICAgICAgICAgayA9IGxhYmVscy0+ZGF0YS5pW2kqaWRzX2RlbHRhXTsKKyAgICAgICAgICAgIGRvdWJsZSogYyA9IChkb3VibGUqKShjZW50ZXJzLT5kYXRhLnB0ciArIGsqY2VudGVycy0+c3RlcCk7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGRpbXMgLSA0OyBqICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IGNbal0gKyBzW2pdOworICAgICAgICAgICAgICAgIGRvdWJsZSB0MSA9IGNbaisxXSArIHNbaisxXTsKKworICAgICAgICAgICAgICAgIGNbal0gPSB0MDsKKyAgICAgICAgICAgICAgICBjW2orMV0gPSB0MTsKKworICAgICAgICAgICAgICAgIHQwID0gY1tqKzJdICsgc1tqKzJdOworICAgICAgICAgICAgICAgIHQxID0gY1tqKzNdICsgc1tqKzNdOworCisgICAgICAgICAgICAgICAgY1tqKzJdID0gdDA7CisgICAgICAgICAgICAgICAgY1tqKzNdID0gdDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIDsgaiA8IGRpbXM7IGorKyApCisgICAgICAgICAgICAgICAgY1tqXSArPSBzW2pdOworICAgICAgICAgICAgY291bnRlcnMtPmRhdGEuaVtrXSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGl0ZXIgPiAwICkKKyAgICAgICAgICAgIG1heF9kaXN0ID0gMDsKKworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY2x1c3Rlcl9jb3VudDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlKiBjID0gKGRvdWJsZSopKGNlbnRlcnMtPmRhdGEucHRyICsgaypjZW50ZXJzLT5zdGVwKTsKKyAgICAgICAgICAgIGlmKCBjb3VudGVycy0+ZGF0YS5pW2tdICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBzY2FsZSA9IDEuL2NvdW50ZXJzLT5kYXRhLmlba107CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRpbXM7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGNbal0gKj0gc2NhbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IGN2UmFuZEludCggJnJuZyApICUgc2FtcGxlX2NvdW50OworICAgICAgICAgICAgICAgIGZsb2F0KiBzID0gKGZsb2F0Kikoc2FtcGxlcy0+ZGF0YS5wdHIgKyBpKnNhbXBsZXMtPnN0ZXApOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBjW2pdID0gc1tqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGl0ZXIgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgZGlzdCA9IDA7CisgICAgICAgICAgICAgICAgZG91YmxlKiBjX28gPSAoZG91YmxlKikob2xkX2NlbnRlcnMtPmRhdGEucHRyICsgaypvbGRfY2VudGVycy0+c3RlcCk7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRpbXM7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IGNbal0gLSBjX29bal07CisgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gdCp0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggbWF4X2Rpc3QgPCBkaXN0ICkKKyAgICAgICAgICAgICAgICAgICAgbWF4X2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYXNzaWduIGxhYmVscworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogcyA9IChmbG9hdCopKHNhbXBsZXMtPmRhdGEucHRyICsgaSpzYW1wbGVzLT5zdGVwKTsKKyAgICAgICAgICAgIGludCBrX2Jlc3QgPSAwOworICAgICAgICAgICAgZG91YmxlIG1pbl9kaXN0ID0gREJMX01BWDsKKworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGNsdXN0ZXJfY291bnQ7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiBjID0gKGRvdWJsZSopKGNlbnRlcnMtPmRhdGEucHRyICsgaypjZW50ZXJzLT5zdGVwKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZGlzdCA9IDA7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaiA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCA7IGogPD0gZGltcyAtIDQ7IGogKz0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDAgPSBjW2pdIC0gc1tqXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQxID0gY1tqKzFdIC0gc1tqKzFdOworICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHQwKnQwICsgdDEqdDE7CisgICAgICAgICAgICAgICAgICAgIHQwID0gY1tqKzJdIC0gc1tqKzJdOworICAgICAgICAgICAgICAgICAgICB0MSA9IGNbaiszXSAtIHNbaiszXTsKKyAgICAgICAgICAgICAgICAgICAgZGlzdCArPSB0MCp0MCArIHQxKnQxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gY1tqXSAtIHNbal07CisgICAgICAgICAgICAgICAgICAgIGRpc3QgKz0gdCp0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBtaW5fZGlzdCA+IGRpc3QgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWluX2Rpc3QgPSBkaXN0OworICAgICAgICAgICAgICAgICAgICBrX2Jlc3QgPSBrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGFiZWxzLT5kYXRhLmlbaSppZHNfZGVsdGFdID0ga19iZXN0OworICAgICAgICB9CisKKyAgICAgICAgaWYoIG1heF9kaXN0IDwgdGVybWNyaXQuZXBzaWxvbiApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDVl9TV0FQKCBjZW50ZXJzLCBvbGRfY2VudGVycywgdGVtcCApOworICAgIH0KKworICAgIGN2WmVybyggY291bnRlcnMgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICBjb3VudGVycy0+ZGF0YS5pW2xhYmVscy0+ZGF0YS5pW2ldXSsrOworCisgICAgLy8gZW5zdXJlIHRoYXQgd2UgZG8gbm90IGhhdmUgZW1wdHkgY2x1c3RlcnMKKyAgICBmb3IoIGsgPSAwOyBrIDwgY2x1c3Rlcl9jb3VudDsgaysrICkKKyAgICAgICAgaWYoIGNvdW50ZXJzLT5kYXRhLmlba10gPT0gMCApCisgICAgICAgICAgICBmb3IoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IGN2UmFuZEludCgmcm5nKSAlIHNhbXBsZV9jb3VudDsKKyAgICAgICAgICAgICAgICBqID0gbGFiZWxzLT5kYXRhLmlbaV07CisgICAgICAgICAgICAgICAgaWYoIGNvdW50ZXJzLT5kYXRhLmlbal0gPiAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxhYmVscy0+ZGF0YS5pW2ldID0gazsKKyAgICAgICAgICAgICAgICAgICAgY291bnRlcnMtPmRhdGEuaVtqXS0tOworICAgICAgICAgICAgICAgICAgICBjb3VudGVycy0+ZGF0YS5pW2tdKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZjZW50ZXJzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmb2xkX2NlbnRlcnMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZjb3VudGVycyApOworfQorCisKKy8qCisgIEZpbmRzIHJlYWwgcm9vdHMgb2YgY3ViaWMsIHF1YWRyYXRpYyBvciBsaW5lYXIgZXF1YXRpb24uCisgIFRoZSBvcmlnaW5hbCBjb2RlIGhhcyBiZWVuIHRha2VuIGZyb20gS2VuIFR1cmtvd3NraSB3ZWIgcGFnZQorICAoaHR0cDovL3d3dy53b3JsZHNlcnZlci5jb20vdHVyay9vcGVuc291cmNlLykgYW5kIGFkb3B0ZWQgZm9yIE9wZW5DVi4KKyAgSGVyZSBpcyB0aGUgY29weXJpZ2h0IG5vdGljZS4KKworICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICBDb3B5cmlnaHQgKEMpIDE5NzgtMTk5OSBLZW4gVHVya293c2tpLiA8dHVya0Bjb21wdXRlci5vcmc+CisgCisgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAKKyAgICBXYXJyYW50eSBJbmZvcm1hdGlvbgorICAgICAgRXZlbiB0aG91Z2ggSSBoYXZlIHJldmlld2VkIHRoaXMgc29mdHdhcmUsIEkgbWFrZSBubyB3YXJyYW50eQorICAgICAgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIHdpdGggcmVzcGVjdCB0byB0aGlzCisgICAgICBzb2Z0d2FyZSwgaXRzIHF1YWxpdHksIGFjY3VyYWN5LCBtZXJjaGFudGFiaWxpdHksIG9yIGZpdG5lc3MgZm9yIGEKKyAgICAgIHBhcnRpY3VsYXIgcHVycG9zZS4gIEFzIGEgcmVzdWx0LCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiCisgICAgICBhbmQgeW91LCBpdHMgdXNlciwgYXJlIGFzc3VtaW5nIHRoZSBlbnRpcmUgcmlzayBhcyB0byBpdHMgcXVhbGl0eQorICAgICAgYW5kIGFjY3VyYWN5LgorIAorICAgIFRoaXMgY29kZSBtYXkgYmUgdXNlZCBhbmQgZnJlZWx5IGRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgaXQgaW5jbHVkZXMKKyAgICB0aGlzIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBhYm92ZSB3YXJyYW50eSBpbmZvcm1hdGlvbi4KKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCitDVl9JTVBMIGludAorY3ZTb2x2ZUN1YmljKCBjb25zdCBDdk1hdCogY29lZmZzLCBDdk1hdCogcm9vdHMgKQoreworICAgIGludCBuID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2U29sdmVDdWJpYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGRvdWJsZSBhMCA9IDEuLCBhMSwgYTIsIGEzOworICAgIGRvdWJsZSB4MCA9IDAuLCB4MSA9IDAuLCB4MiA9IDAuOworICAgIGludCBzdGVwID0gMSwgY29lZmZfY291bnQ7CisKKyAgICBpZiggIUNWX0lTX01BVChjb2VmZnMpICkKKyAgICAgICAgQ1ZfRVJST1IoICFjb2VmZnMgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW5wdXQgcGFyYW1ldGVyIGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKHJvb3RzKSApCisgICAgICAgIENWX0VSUk9SKCAhcm9vdHMgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiT3V0cHV0IHBhcmFtZXRlciBpcyBub3QgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICBpZiggKENWX01BVF9UWVBFKGNvZWZmcy0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYgQ1ZfTUFUX1RZUEUoY29lZmZzLT50eXBlKSAhPSBDVl82NEZDMSkgfHwKKyAgICAgICAgKENWX01BVF9UWVBFKHJvb3RzLT50eXBlKSAhPSBDVl8zMkZDMSAmJiBDVl9NQVRfVFlQRShyb290cy0+dHlwZSkgIT0gQ1ZfNjRGQzEpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiQm90aCBtYXRyaWNlcyBzaG91bGQgYmUgZmxvYXRpbmctcG9pbnQgKHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uKSIgKTsKKworICAgIGNvZWZmX2NvdW50ID0gY29lZmZzLT5yb3dzICsgY29lZmZzLT5jb2xzIC0gMTsKKworICAgIGlmKCAoY29lZmZzLT5yb3dzICE9IDEgJiYgY29lZmZzLT5jb2xzICE9IDEpIHx8IChjb2VmZl9jb3VudCAhPSAzICYmIGNvZWZmX2NvdW50ICE9IDQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICJUaGUgbWF0cml4IG9mIGNvZWZmaWNpZW50cyBtdXN0IGJlIDEtZGltZW5zaW9uYWwgdmVjdG9yIG9mIDMgb3IgNCBlbGVtZW50cyIgKTsKKworICAgIGlmKCAocm9vdHMtPnJvd3MgIT0gMSAmJiByb290cy0+Y29scyAhPSAxKSB8fAorICAgICAgICByb290cy0+cm93cyArIHJvb3RzLT5jb2xzIC0gMSAhPSAzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICJUaGUgbWF0cml4IG9mIHJvb3RzIG11c3QgYmUgMS1kaW1lbnNpb25hbCB2ZWN0b3Igb2YgMyBlbGVtZW50cyIgKTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShjb2VmZnMtPnR5cGUpID09IENWXzMyRkMxICkKKyAgICB7CisgICAgICAgIGNvbnN0IGZsb2F0KiBjID0gY29lZmZzLT5kYXRhLmZsOworICAgICAgICBpZiggY29lZmZzLT5yb3dzID4gMSApCisgICAgICAgICAgICBzdGVwID0gY29lZmZzLT5zdGVwL3NpemVvZihjWzBdKTsKKyAgICAgICAgaWYoIGNvZWZmX2NvdW50ID09IDQgKQorICAgICAgICAgICAgYTAgPSBjWzBdLCBjICs9IHN0ZXA7CisgICAgICAgIGExID0gY1swXTsKKyAgICAgICAgYTIgPSBjW3N0ZXBdOworICAgICAgICBhMyA9IGNbc3RlcCoyXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlKiBjID0gY29lZmZzLT5kYXRhLmRiOworICAgICAgICBpZiggY29lZmZzLT5yb3dzID4gMSApCisgICAgICAgICAgICBzdGVwID0gY29lZmZzLT5zdGVwL3NpemVvZihjWzBdKTsKKyAgICAgICAgaWYoIGNvZWZmX2NvdW50ID09IDQgKQorICAgICAgICAgICAgYTAgPSBjWzBdLCBjICs9IHN0ZXA7CisgICAgICAgIGExID0gY1swXTsKKyAgICAgICAgYTIgPSBjW3N0ZXBdOworICAgICAgICBhMyA9IGNbc3RlcCoyXTsKKyAgICB9CisKKyAgICBpZiggYTAgPT0gMCApCisgICAgeworICAgICAgICBpZiggYTEgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBhMiA9PSAwICkKKyAgICAgICAgICAgICAgICBuID0gYTMgPT0gMCA/IC0xIDogMDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBsaW5lYXIgZXF1YXRpb24KKyAgICAgICAgICAgICAgICB4MCA9IGEzL2EyOworICAgICAgICAgICAgICAgIG4gPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gcXVhZHJhdGljIGVxdWF0aW9uCisgICAgICAgICAgICBkb3VibGUgZCA9IGEyKmEyIC0gNCphMSphMzsKKyAgICAgICAgICAgIGlmKCBkID49IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGQgPSBzcXJ0KGQpOworICAgICAgICAgICAgICAgIGRvdWJsZSBxID0gKC1hMiArIChhMiA8IDAgPyAtZCA6IGQpKSAqIDAuNTsKKyAgICAgICAgICAgICAgICB4MCA9IHEgLyBhMTsKKyAgICAgICAgICAgICAgICB4MSA9IGEzIC8gcTsKKyAgICAgICAgICAgICAgICBuID0gZCA+IDAgPyAyIDogMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBhMCA9IDEuL2EwOworICAgICAgICBhMSAqPSBhMDsKKyAgICAgICAgYTIgKj0gYTA7CisgICAgICAgIGEzICo9IGEwOworCisgICAgICAgIGRvdWJsZSBRID0gKGExICogYTEgLSAzICogYTIpICogKDEuLzkpOworICAgICAgICBkb3VibGUgUiA9ICgyICogYTEgKiBhMSAqIGExIC0gOSAqIGExICogYTIgKyAyNyAqIGEzKSAqICgxLi81NCk7CisgICAgICAgIGRvdWJsZSBRY3ViZWQgPSBRICogUSAqIFE7CisgICAgICAgIGRvdWJsZSBkID0gUWN1YmVkIC0gUiAqIFI7CisgICAgCisgICAgICAgIGlmKCBkID49IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdGhldGEgPSBhY29zKFIgLyBzcXJ0KFFjdWJlZCkpOworICAgICAgICAgICAgZG91YmxlIHNxcnRRID0gc3FydChRKTsKKyAgICAgICAgICAgIGRvdWJsZSB0MCA9IC0yICogc3FydFE7CisgICAgICAgICAgICBkb3VibGUgdDEgPSB0aGV0YSAqICgxLi8zKTsKKyAgICAgICAgICAgIGRvdWJsZSB0MiA9IGExICogKDEuLzMpOworICAgICAgICAgICAgeDAgPSB0MCAqIGNvcyh0MSkgLSB0MjsKKyAgICAgICAgICAgIHgxID0gdDAgKiBjb3ModDEgKyAoMi4qQ1ZfUEkvMykpIC0gdDI7CisgICAgICAgICAgICB4MiA9IHQwICogY29zKHQxICsgKDQuKkNWX1BJLzMpKSAtIHQyOworICAgICAgICAgICAgbiA9IDM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgZTsKKyAgICAgICAgICAgIGQgPSBzcXJ0KC1kKTsKKyAgICAgICAgICAgIGUgPSBwb3coZCArIGZhYnMoUiksIDAuMzMzMzMzMzMzMzMzKTsKKyAgICAgICAgICAgIGlmKCBSID4gMCApCisgICAgICAgICAgICAgICAgZSA9IC1lOworICAgICAgICAgICAgeDAgPSAoZSArIFEgLyBlKSAtIGExICogKDEuLzMpOworICAgICAgICAgICAgbiA9IDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGVwID0gMTsKKworICAgIGlmKCBDVl9NQVRfVFlQRShyb290cy0+dHlwZSkgPT0gQ1ZfMzJGQzEgKQorICAgIHsKKyAgICAgICAgZmxvYXQqIHIgPSByb290cy0+ZGF0YS5mbDsKKyAgICAgICAgaWYoIHJvb3RzLT5yb3dzID4gMSApCisgICAgICAgICAgICBzdGVwID0gcm9vdHMtPnN0ZXAvc2l6ZW9mKHJbMF0pOworICAgICAgICByWzBdID0gKGZsb2F0KXgwOworICAgICAgICByW3N0ZXBdID0gKGZsb2F0KXgxOworICAgICAgICByW3N0ZXAqMl0gPSAoZmxvYXQpeDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRvdWJsZSogciA9IHJvb3RzLT5kYXRhLmRiOworICAgICAgICBpZiggcm9vdHMtPnJvd3MgPiAxICkKKyAgICAgICAgICAgIHN0ZXAgPSByb290cy0+c3RlcC9zaXplb2YoclswXSk7CisgICAgICAgIHJbMF0gPSB4MDsKKyAgICAgICAgcltzdGVwXSA9IHgxOworICAgICAgICByW3N0ZXAqMl0gPSB4MjsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG47Cit9CisKKworLyoKKyAgRmluZHMgcmVhbCBhbmQgY29tcGxleCByb290cyBvZiBwb2x5bm9taWFscyBvZiBhbnkgZGVncmVlIHdpdGggcmVhbCAKKyAgY29lZmZpY2llbnRzLiBUaGUgb3JpZ2luYWwgY29kZSBoYXMgYmVlbiB0YWtlbiBmcm9tIEtlbiBUdXJrb3dza2kncyB3ZWIgCisgIHBhZ2UgKGh0dHA6Ly93d3cud29ybGRzZXJ2ZXIuY29tL3R1cmsvb3BlbnNvdXJjZS8pIGFuZCBhZG9wdGVkIGZvciBPcGVuQ1YuCisgIEhlcmUgaXMgdGhlIGNvcHlyaWdodCBub3RpY2UuCisKKyAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgQ29weXJpZ2h0IChDKSAxOTgxLTE5OTkgS2VuIFR1cmtvd3NraS4gPHR1cmtAY29tcHV0ZXIub3JnPgorCisgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgV2FycmFudHkgSW5mb3JtYXRpb24KKyAgRXZlbiB0aG91Z2ggSSBoYXZlIHJldmlld2VkIHRoaXMgc29mdHdhcmUsIEkgbWFrZSBubyB3YXJyYW50eQorICBvciByZXByZXNlbnRhdGlvbiwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgd2l0aCByZXNwZWN0IHRvIHRoaXMKKyAgc29mdHdhcmUsIGl0cyBxdWFsaXR5LCBhY2N1cmFjeSwgbWVyY2hhbnRhYmlsaXR5LCBvciBmaXRuZXNzIGZvciBhCisgIHBhcnRpY3VsYXIgcHVycG9zZS4gIEFzIGEgcmVzdWx0LCB0aGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJhcyBpcywiCisgIGFuZCB5b3UsIGl0cyB1c2VyLCBhcmUgYXNzdW1pbmcgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5CisgIGFuZCBhY2N1cmFjeS4KKworICBUaGlzIGNvZGUgbWF5IGJlIHVzZWQgYW5kIGZyZWVseSBkaXN0cmlidXRlZCBhcyBsb25nIGFzIGl0IGluY2x1ZGVzCisgIHRoaXMgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGFib3ZlIHdhcnJhbnR5IGluZm9ybWF0aW9uLgorKi8KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRmluZFBvbHlub21pYWxSb290cworICoKKyAqIFRoZSBCYWlyc3RvdyBhbmQgTmV3dG9uIGNvcnJlY3Rpb24gZm9ybXVsYWUgYXJlIHVzZWQgZm9yIGEgc2ltdWx0YW5lb3VzCisgKiBsaW5lYXIgYW5kIHF1YWRyYXRpYyBpdGVyYXRlZCBzeW50aGV0aWMgZGl2aXNpb24uICBUaGUgY29lZmZpY2llbnRzIG9mCisgKiBhIHBvbHlub21pYWwgb2YgZGVncmVlIG4gYXJlIGdpdmVuIGFzIGFbaV0gKGk9MCxpLC4uLiwgbikgd2hlcmUgYVswXSBpcworICogdGhlIGNvbnN0YW50IHRlcm0uICBUaGUgY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgYnkgZGl2aWRpbmcgdGhlbSBieQorICogdGhlaXIgZ2VvbWV0cmljIG1lYW4uICBUaGUgQmFpcnN0b3cgb3IgTmV3dG9uIGl0ZXJhdGlvbiBtZXRob2Qgd2lsbAorICogbmVhcmx5IGFsd2F5cyBjb252ZXJnZSB0byB0aGUgbnVtYmVyIG9mIGZpZ3VyZXMgY2FycmllZCwgZmlnLCBlaXRoZXIgdG8KKyAqIHJvb3QgdmFsdWVzIG9yIHRvIHRoZWlyIHJlY2lwcm9jYWxzLiAgSWYgdGhlIHNpbXVsdGFuZW91cyBOZXd0b24gYW5kCisgKiBCYWlyc3RvdyBpdGVyYXRpb24gZmFpbHMgdG8gY29udmVyZ2Ugb24gcm9vdCB2YWx1ZXMgb3IgdGhlaXIKKyAqIHJlY2lwcm9jYWxzIGluIG1heGl0ZXIgaXRlcmF0aW9ucywgdGhlIGNvbnZlcmdlbmNlIHJlcXVpcmVtZW50IHdpbGwgYmUKKyAqIHN1Y2Nlc3NpdmVseSByZWR1Y2VkIGJ5IG9uZSBkZWNpbWFsIGZpZ3VyZS4gIFRoaXMgcHJvZ3JhbSBhbnRpY2lwYXRlcworICogYW5kIHByb3RlY3RzIGFnYWluc3QgbG9zcyBvZiBzaWduaWZpY2FuY2UgaW4gdGhlIHF1YWRyYXRpYyBzeW50aGV0aWMKKyAqIGRpdmlzaW9uLiAgKFJlZmVyIHRvICJPbiBQcm9ncmFtbWluZyB0aGUgTnVtZXJpY2FsIFNvbHV0aW9uIG9mCisgKiBQb2x5bm9taWFsIEVxdWF0aW9ucywiIGJ5IEsuIFcuIEVsbGVuYmVyZ2VyLCBDb21tdW4uIEFDTSAzIChEZWMuIDE5NjApLAorICogNjQ0LTY0Ny4pICBUaGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnQgb2YgZWFjaCByb290IGlzIHN0YXRlZCBhcyB1W2ldCisgKiBhbmQgdltpXSwgcmVzcGVjdGl2ZWx5LgorICoKKyAqIEFDTSBhbGdvcml0aG0gIzMwIC0gTnVtZXJpY2FsIFNvbHV0aW9uIG9mIHRoZSBQb2x5bm9taWFsIEVxdWF0aW9uCisgKiBLLiBXLiBFbGxlbmJlcmdlcgorICogTWlzc2xlIERpdmlzaW9uLCBOb3J0aCBBbWVyaWNhbiBBdmlhdGlvbiwgRG93bmV5LCBDYWxpZm9ybmlhCisgKiBDb252ZXJ0ZWQgdG8gQywgbW9kaWZpZWQsIG9wdGltaXplZCwgYW5kIHN0cnVjdHVyZWQgYnkKKyAqIEtlbiBUdXJrb3dza2kKKyAqIENBRExJTkMsIEluYy4sIFBhbG8gQWx0bywgQ2FsaWZvcm5pYQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFYTiAxNgorCitzdGF0aWMgdm9pZCBpY3ZGaW5kUG9seW5vbWlhbFJvb3RzKGNvbnN0IGRvdWJsZSAqYSwgZG91YmxlICp1LCBpbnQgbiwgaW50IG1heGl0ZXIsIGludCBmaWcpCit7CisgIGludCBpOworICBpbnQgajsKKyAgZG91YmxlIGhbTUFYTiArIDNdLCBiW01BWE4gKyAzXSwgY1tNQVhOICsgM10sIGRbTUFYTiArIDNdLCBlW01BWE4gKyAzXTsKKyAgLy8gWy0yIDogbl0KKyAgZG91YmxlIEssIHBzLCBxcywgcHQsIHF0LCBzLCByZXYsIHIgPSAwOworICBpbnQgdDsKKyAgZG91YmxlIHAgPSAwLCBxID0gMCwgcXE7CisKKyAgLy8gWmVybyBlbGVtZW50cyB3aXRoIG5lZ2F0aXZlIGluZGljZXMKKyAgYlsyICsgLTFdID0gYlsyICsgLTJdID0KKyAgICBjWzIgKyAtMV0gPSBjWzIgKyAtMl0gPQorICAgIGRbMiArIC0xXSA9IGRbMiArIC0yXSA9CisgICAgZVsyICsgLTFdID0gZVsyICsgLTJdID0KKyAgICBoWzIgKyAtMV0gPSBoWzIgKyAtMl0gPSAwLjA7CisKKyAgLy8gQ29weSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyB0byB3b3JraW5nIHN0b3JhZ2UKKyAgZm9yIChqID0gbjsgaiA+PSAwOyBqLS0pCisgICAgaFsyICsgal0gPSAqYSsrOyAvLyBOb3RlIHJldmVyc2FsIG9mIGNvZWZmaWNpZW50cworCisgIHQgPSAxOworICBLID0gcG93KDEwLjAsIChkb3VibGUpKGZpZykpOyAvLyBSZWxhdGl2ZSBhY2N1cmFjeQorCisgIGZvciAoOyBoWzIgKyBuXSA9PSAwLjA7IG4tLSkgeyAvLyBMb29rIGZvciB6ZXJvIGhpZ2gtb3JkZXIgY29lZmYuCisgICAgKnUrKyA9IDAuMDsKKyAgICAqdSsrID0gMC4wOworICB9CisKKyBJTklUOgorICBpZiAobiA9PSAwKQorICAgIHJldHVybjsKKworICBwcyA9IHFzID0gcHQgPSBxdCA9IHMgPSAwLjA7CisgIHJldiA9IDEuMDsKKyAgSyA9IHBvdygxMC4wLCAoZG91YmxlKShmaWcpKTsKKworICBpZiAobiA9PSAxKSB7CisgICAgciA9IC1oWzIgKyAxXSAvIGhbMiArIDBdOworICAgIGdvdG8gTElORUFSOworICB9CisKKyAgZm9yIChqID0gbjsgaiA+PSAwOyBqLS0pIC8vIEZpbmQgZ2VvbWV0cmljIG1lYW4gb2YgY29lZmYncworICAgIGlmIChoWzIgKyBqXSAhPSAwLjApCisgICAgICBzICs9IGxvZyhmYWJzKGhbMiArIGpdKSk7CisgIHMgPSBleHAocyAvIChuICsgMSkpOworCisgIGZvciAoaiA9IG47IGogPj0gMDsgai0tKSAvLyBOb3JtYWxpemUgY29lZmYncyBieSBtZWFuCisgICAgaFsyICsgal0gLz0gczsKKworICBpZiAoZmFicyhoWzIgKyAxXSAvIGhbMiArIDBdKSA8IGZhYnMoaFsyICsgbiAtIDFdIC8gaFsyICsgbl0pKSB7CisgIFJFVkVSU0U6CisgICAgdCA9IC10OworICAgIGZvciAoaiA9IChuIC0gMSkgLyAyOyBqID49IDA7IGotLSkgeworICAgICAgcyA9IGhbMiArIGpdOworICAgICAgaFsyICsgal0gPSBoWzIgKyBuIC0gal07CisgICAgICBoWzIgKyBuIC0gal0gPSBzOworICAgIH0KKyAgfQorICBpZiAocXMgIT0gMC4wKSB7CisgICAgcCA9IHBzOworICAgIHEgPSBxczsKKyAgfSBlbHNlIHsKKyAgICBpZiAoaFsyICsgbiAtIDJdID09IDAuMCkgeworICAgICAgcSA9IDEuMDsKKyAgICAgIHAgPSAtMi4wOworICAgIH0gZWxzZSB7CisgICAgICBxID0gaFsyICsgbl0gLyBoWzIgKyBuIC0gMl07CisgICAgICBwID0gKGhbMiArIG4gLSAxXSAtIHEgKiBoWzIgKyBuIC0gM10pIC8gaFsyICsgbiAtIDJdOworICAgIH0KKyAgICBpZiAobiA9PSAyKQorICAgICAgZ290byBRQURSVElDOworICAgIHIgPSAwLjA7CisgIH0KKyBJVEVSQVRFOgorICBmb3IgKGkgPSBtYXhpdGVyOyBpID4gMDsgaS0tKSB7CisKKyAgICBmb3IgKGogPSAwOyBqIDw9IG47IGorKykgeyAvLyBCQUlSU1RPVworICAgICAgYlsyICsgal0gPSBoWzIgKyBqXSAtIHAgKiBiWzIgKyBqIC0gMV0gLSBxICogYlsyICsgaiAtIDJdOworICAgICAgY1syICsgal0gPSBiWzIgKyBqXSAtIHAgKiBjWzIgKyBqIC0gMV0gLSBxICogY1syICsgaiAtIDJdOworICAgIH0KKyAgICBpZiAoKGhbMiArIG4gLSAxXSAhPSAwLjApICYmIChiWzIgKyBuIC0gMV0gIT0gMC4wKSkgeworICAgICAgaWYgKGZhYnMoaFsyICsgbiAtIDFdIC8gYlsyICsgbiAtIDFdKSA+PSBLKSB7CisJYlsyICsgbl0gPSBoWzIgKyBuXSAtIHEgKiBiWzIgKyBuIC0gMl07CisgICAgICB9CisgICAgICBpZiAoYlsyICsgbl0gPT0gMC4wKQorCWdvdG8gUUFEUlRJQzsKKyAgICAgIGlmIChLIDwgZmFicyhoWzIgKyBuXSAvIGJbMiArIG5dKSkKKwlnb3RvIFFBRFJUSUM7CisgICAgfQorCisgICAgZm9yIChqID0gMDsgaiA8PSBuOyBqKyspIHsgLy8gTkVXVE9OCisgICAgICBkWzIgKyBqXSA9IGhbMiArIGpdICsgciAqIGRbMiArIGogLSAxXTsgLy8gQ2FsY3VsYXRlIHBvbHlub21pYWwgYXQgcgorICAgICAgZVsyICsgal0gPSBkWzIgKyBqXSArIHIgKiBlWzIgKyBqIC0gMV07IC8vIENhbGN1bGF0ZSBkZXJpdmF0aXZlIGF0IHIKKyAgICB9CisgICAgaWYgKGRbMiArIG5dID09IDAuMCkKKyAgICAgIGdvdG8gTElORUFSOworICAgIGlmIChLIDwgZmFicyhoWzIgKyBuXSAvIGRbMiArIG5dKSkKKyAgICAgIGdvdG8gTElORUFSOworCisgICAgY1syICsgbiAtIDFdID0gLXAgKiBjWzIgKyBuIC0gMl0gLSBxICogY1syICsgbiAtIDNdOworICAgIHMgPSBjWzIgKyBuIC0gMl0gKiBjWzIgKyBuIC0gMl0gLSBjWzIgKyBuIC0gMV0gKiBjWzIgKyBuIC0gM107CisgICAgaWYgKHMgPT0gMC4wKSB7CisgICAgICBwIC09IDIuMDsKKyAgICAgIHEgKj0gKHEgKyAxLjApOworICAgIH0gZWxzZSB7CisgICAgICBwICs9IChiWzIgKyBuIC0gMV0gKiBjWzIgKyBuIC0gMl0gLSBiWzIgKyBuXSAqIGNbMiArIG4gLSAzXSkgLyBzOworICAgICAgcSArPSAoLWJbMiArIG4gLSAxXSAqIGNbMiArIG4gLSAxXSArIGJbMiArIG5dICogY1syICsgbiAtIDJdKSAvIHM7CisgICAgfQorICAgIGlmIChlWzIgKyBuIC0gMV0gPT0gMC4wKQorICAgICAgciAtPSAxLjA7IC8vIE1pbmltdW0gc3RlcAorICAgIGVsc2UKKyAgICAgIHIgLT0gZFsyICsgbl0gLyBlWzIgKyBuIC0gMV07IC8vIE5ld3RvbidzIGl0ZXJhdGlvbgorICB9CisgIHBzID0gcHQ7CisgIHFzID0gcXQ7CisgIHB0ID0gcDsKKyAgcXQgPSBxOworICBpZiAocmV2IDwgMC4wKQorICAgIEsgLz0gMTAuMDsKKyAgcmV2ID0gLXJldjsKKyAgZ290byBSRVZFUlNFOworCisgTElORUFSOgorICBpZiAodCA8IDApCisgICAgciA9IDEuMCAvIHI7CisgIG4tLTsKKyAgKnUrKyA9IHI7CisgICp1KysgPSAwLjA7CisKKyAgZm9yIChqID0gbjsgaiA+PSAwOyBqLS0pIHsgLy8gUG9seW5vbWlhbCBkZWZsYXRpb24gYnkgbGluLW5vbWlhbAorICAgIGlmICgoZFsyICsgal0gIT0gMC4wKSAmJiAoZmFicyhoWzIgKyBqXSAvIGRbMiArIGpdKSA8IEspKQorICAgICAgaFsyICsgal0gPSBkWzIgKyBqXTsKKyAgICBlbHNlCisgICAgICBoWzIgKyBqXSA9IDAuMDsKKyAgfQorCisgIGlmIChuID09IDApCisgICAgcmV0dXJuOworICBnb3RvIElURVJBVEU7CisKKyBRQURSVElDOgorICBpZiAodCA8IDApIHsKKyAgICBwIC89IHE7CisgICAgcSA9IDEuMCAvIHE7CisgIH0KKyAgbiAtPSAyOworCisgIGlmICgwLjAgPCAocSAtIChwICogcCAvIDQuMCkpKSB7IC8vIFR3byBjb21wbGV4IHJvb3RzCisgICAgcyA9IHNxcnQocSAtIChwICogcCAvIDQuMCkpOworICAgICp1KysgPSAtcCAvIDIuMDsKKyAgICAqdSsrID0gczsKKyAgICAqdSsrID0gLXAgLyAyLjA7CisgICAgKnUrKyA9IC1zOworICB9IGVsc2UgeyAvLyBUd28gcmVhbCByb290cworICAgIHMgPSBzcXJ0KCgocCAqIHAgLyA0LjApKSAtIHEpOworICAgIGlmIChwIDwgMC4wKQorICAgICAgKnUrKyA9IHFxID0gLXAgLyAyLjAgKyBzOworICAgIGVsc2UKKyAgICAgICp1KysgPSBxcSA9IC1wIC8gMi4wIC0gczsKKyAgICAqdSsrID0gMC4wOworICAgICp1KysgPSBxIC8gcXE7CisgICAgKnUrKyA9IDAuMDsKKyAgfQorCisgIGZvciAoaiA9IG47IGogPj0gMDsgai0tKSB7IC8vIFBvbHlub21pYWwgZGVmbGF0aW9uIGJ5IHF1YWRyYXRpYworICAgIGlmICgoYlsyICsgal0gIT0gMC4wKSAmJiAoZmFicyhoWzIgKyBqXSAvIGJbMiArIGpdKSA8IEspKQorICAgICAgaFsyICsgal0gPSBiWzIgKyBqXTsKKyAgICBlbHNlCisgICAgICBoWzIgKyBqXSA9IDAuMDsKKyAgfQorICBnb3RvIElOSVQ7Cit9CisKKyN1bmRlZiBNQVhOCisKK3ZvaWQgY3ZTb2x2ZVBvbHkoY29uc3QgQ3ZNYXQqIGEsIEN2TWF0ICpyLCBpbnQgbWF4aXRlciwgaW50IGZpZykKK3sKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgbSwgbjsKKyAgICBkb3VibGUgKmFkID0gMCwgKnJkID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdlNvbHZlUG9seSIpOworCisgICAgaWYgKENWX01BVF9UWVBFKGEtPnR5cGUpICE9IENWXzMyRkMxICYmIAorICAgICAgICBDVl9NQVRfVFlQRShhLT50eXBlKSAhPSBDVl82NEZDMSkKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJjb2VmZnMgbXVzdCBiZSBlaXRoZXIgQ1ZfMzJGQzEgb3IgQ1ZfNjRGQzEiKTsKKyAgICBpZiAoQ1ZfTUFUX1RZUEUoci0+dHlwZSkgIT0gQ1ZfMzJGQzIgJiYgCisgICAgICAgIENWX01BVF9UWVBFKHItPnR5cGUpICE9IENWXzY0RkMyKQorICAgICAgICBDVl9FUlJPUihDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgInJvb3RzIG11c3QgYmUgZWl0aGVyIENWXzMyRkMyIG9yIENWXzY0RkMyIik7CisgICAgbSA9IGEtPnJvd3MgKiBhLT5jb2xzOworICAgIG4gPSByLT5yb3dzICogci0+Y29sczsKKworICAgIGlmIChtIC0gMSAhPSBuKQorICAgICAgICBDVl9FUlJPUihDVl9TdHNVbm1hdGNoZWRGb3JtYXRzLCAibXVzdCBoYXZlIG4gKyAxIGNvZWZmaWNpZW50cyIpOworCisgICAgaWYoIENWX01BVF9UWVBFKGEtPnR5cGUpID09IENWXzMyRiB8fCAhQ1ZfSVNfTUFUX0NPTlQoYS0+dHlwZSkpCisgICAgeworICAgICAgICBhZCA9IChkb3VibGUqKWN2U3RhY2tBbGxvYyhtKnNpemVvZihhZFswXSkpOworICAgICAgICBDdk1hdCBfYSA9IGN2TWF0KCBhLT5yb3dzLCBhLT5jb2xzLCBDVl82NEYsIGFkICk7CisgICAgICAgIGN2Q29udmVydCggYSwgJl9hICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgYWQgPSBhLT5kYXRhLmRiOworCisgICAgaWYoIENWX01BVF9UWVBFKHItPnR5cGUpID09IENWXzMyRiB8fCAhQ1ZfSVNfTUFUX0NPTlQoci0+dHlwZSkpCisgICAgICAgIHJkID0gKGRvdWJsZSopY3ZTdGFja0FsbG9jKG4qc2l6ZW9mKGFkWzBdKSk7CisgICAgZWxzZQorICAgICAgICByZCA9IHItPmRhdGEuZGI7CisKKyAgICBpY3ZGaW5kUG9seW5vbWlhbFJvb3RzKCBhZCwgcmQsIG4sIG1heGl0ZXIsIGZpZyk7CisgICAgaWYoIHJkICE9IHItPmRhdGEuZGIgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgX3IgPSBjdk1hdCggci0+cm93cywgci0+Y29scywgQ1ZfNjRGLCByZCApOworICAgICAgICBjdkNvbnZlcnQoICZfciwgciApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCB2b2lkIGN2Tm9ybWFsaXplKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYSwgZG91YmxlIGIsIGludCBub3JtX3R5cGUsIGNvbnN0IEN2QXJyKiBtYXNrICkKK3sKKyAgICBDdk1hdCogdG1wID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZOb3JtYWxpemUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgc2NhbGUsIHNoaWZ0OworICAgIAorICAgIGlmKCBub3JtX3R5cGUgPT0gQ1ZfTUlOTUFYICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzbWluID0gMCwgc21heCA9IDA7CisgICAgICAgIGRvdWJsZSBkbWluID0gTUlOKCBhLCBiICksIGRtYXggPSBNQVgoIGEsIGIgKTsKKyAgICAgICAgY3ZNaW5NYXhMb2MoIHNyYywgJnNtaW4sICZzbWF4LCAwLCAwLCBtYXNrICk7CisgICAgICAgIHNjYWxlID0gKGRtYXggLSBkbWluKSooc21heCAtIHNtaW4gPiBEQkxfRVBTSUxPTiA/IDEuLyhzbWF4IC0gc21pbikgOiAwKTsKKyAgICAgICAgc2hpZnQgPSBkbWluIC0gc21pbipzY2FsZTsKKyAgICB9CisgICAgZWxzZSBpZiggbm9ybV90eXBlID09IENWX0wyIHx8IG5vcm1fdHlwZSA9PSBDVl9MMSB8fCBub3JtX3R5cGUgPT0gQ1ZfQyApCisgICAgeworICAgICAgICBDdk1hdCAqcyA9IChDdk1hdCopc3JjLCAqZCA9IChDdk1hdCopZHN0OworICAgICAgICAKKyAgICAgICAgaWYoIENWX0lTX01BVChzKSAmJiBDVl9JU19NQVQoZCkgJiYgQ1ZfSVNfTUFUX0NPTlQocy0+dHlwZSAmIGQtPnR5cGUpICYmCisgICAgICAgICAgICBDVl9BUkVfVFlQRVNfRVEocyxkKSAmJiBDVl9BUkVfU0laRVNfRVEocyxkKSAmJiAhbWFzayAmJgorICAgICAgICAgICAgcy0+Y29scypzLT5yb3dzIDw9IENWX01BWF9JTkxJTkVfTUFUX09QX1NJWkUqQ1ZfTUFYX0lOTElORV9NQVRfT1BfU0laRSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpLCBsZW4gPSBzLT5jb2xzKnMtPnJvd3M7CisgICAgICAgICAgICBkb3VibGUgbm9ybSA9IDAsIHY7CisKKyAgICAgICAgICAgIGlmKCBDVl9NQVRfVFlQRShzLT50eXBlKSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNwdHIgPSBzLT5kYXRhLmZsOworICAgICAgICAgICAgICAgIGZsb2F0KiBkcHRyID0gZC0+ZGF0YS5mbDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggbm9ybV90eXBlID09IENWX0wyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzcHRyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSArPSB2KnY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9ybSA9IHNxcnQobm9ybSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIG5vcm1fdHlwZSA9PSBDVl9MMSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWJzKChkb3VibGUpc3B0cltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtICs9IHY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWJzKChkb3VibGUpc3B0cltpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3JtID0gTUFYKG5vcm0sdik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG5vcm0gPSBub3JtID4gREJMX0VQU0lMT04gPyAxLi9ub3JtIDogMC47CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgZHB0cltpXSA9IChmbG9hdCkoc3B0cltpXSpub3JtKTsKKyAgICAgICAgICAgICAgICBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggQ1ZfTUFUX1RZUEUocy0+dHlwZSkgPT0gQ1ZfNjRGQzEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3B0ciA9IHMtPmRhdGEuZGI7CisgICAgICAgICAgICAgICAgZG91YmxlKiBkcHRyID0gZC0+ZGF0YS5kYjsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggbm9ybV90eXBlID09IENWX0wyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBzcHRyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSArPSB2KnY7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbm9ybSA9IHNxcnQobm9ybSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIG5vcm1fdHlwZSA9PSBDVl9MMSApCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBsZW47IGkrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHYgPSBmYWJzKHNwdHJbaV0pOworICAgICAgICAgICAgICAgICAgICAgICAgbm9ybSArPSB2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB2ID0gZmFicyhzcHRyW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vcm0gPSBNQVgobm9ybSx2KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbm9ybSA9IG5vcm0gPiBEQkxfRVBTSUxPTiA/IDEuL25vcm0gOiAwLjsKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQorICAgICAgICAgICAgICAgICAgICBkcHRyW2ldID0gc3B0cltpXSpub3JtOworICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHNjYWxlID0gY3ZOb3JtKCBzcmMsIDAsIG5vcm1fdHlwZSwgbWFzayApOworICAgICAgICBzY2FsZSA9IHNjYWxlID4gREJMX0VQU0lMT04gPyAxLi9zY2FsZSA6IDAuOworICAgICAgICBzaGlmdCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24vdW5zdXBwb3J0ZWQgbm9ybSB0eXBlIiApOworICAgIAorICAgIGlmKCAhbWFzayApCisgICAgICAgIGN2Q29udmVydFNjYWxlKCBzcmMsIGRzdCwgc2NhbGUsIHNoaWZ0ICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZNYXQgc3R1YiwgKmRtYXQ7CisgICAgICAgIENWX0NBTEwoIGRtYXQgPSBjdkdldE1hdChkc3QsICZzdHViKSk7CisgICAgICAgIENWX0NBTEwoIHRtcCA9IGN2Q3JlYXRlTWF0KGRtYXQtPnJvd3MsIGRtYXQtPmNvbHMsIGRtYXQtPnR5cGUpICk7CisgICAgICAgIGN2Q29udmVydFNjYWxlKCBzcmMsIHRtcCwgc2NhbGUsIHNoaWZ0ICk7CisgICAgICAgIGN2Q29weSggdG1wLCBkc3QsIG1hc2sgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIHRtcCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJnRtcCApOworfQorCisKK0NWX0lNUEwgdm9pZCBjdlJhbmRTaHVmZmxlKCBDdkFyciogYXJyLCBDdlJORyogcm5nLCBkb3VibGUgaXRlcl9mYWN0b3IgKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZSYW5kU2h1ZmZsZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGludCBzaXplb2ZfaW50ID0gKGludClzaXplb2YoaW50KTsKKyAgICBDdk1hdCBzdHViLCAqbWF0ID0gKEN2TWF0KilhcnI7CisgICAgaW50IGksIGosIGssIGl0ZXJzLCBkZWx0YSA9IDA7CisgICAgaW50IGNvbnRfZmxhZywgYXJyX3NpemUsIGVsZW1fc2l6ZSwgY29scywgc3RlcDsKKyAgICBjb25zdCBpbnQgcGFpcl9idWZfc3ogPSAxMDA7CisgICAgaW50KiBwYWlyX2J1ZiA9IChpbnQqKWN2U3RhY2tBbGxvYyggcGFpcl9idWZfc3oqc2l6ZW9mKHBhaXJfYnVmWzBdKSoyICk7CisgICAgQ3ZNYXQgX3BhaXJfYnVmID0gY3ZNYXQoIDEsIHBhaXJfYnVmX3N6KjIsIENWXzMyUywgcGFpcl9idWYgKTsKKyAgICBDdlJORyBfcm5nID0gY3ZSTkcoLTEpOworICAgIHVjaGFyKiBkYXRhID0gMDsKKyAgICBpbnQqIGlkYXRhID0gMDsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChtYXQpICkKKyAgICAgICAgQ1ZfQ0FMTCggbWF0ID0gY3ZHZXRNYXQoIG1hdCwgJnN0dWIgKSk7CisKKyAgICBpZiggIXJuZyApCisgICAgICAgIHJuZyA9ICZfcm5nOworCisgICAgY29scyA9IG1hdC0+Y29sczsKKyAgICBzdGVwID0gbWF0LT5zdGVwOworICAgIGFycl9zaXplID0gY29scyptYXQtPnJvd3M7CisgICAgaXRlcnMgPSBjdlJvdW5kKGl0ZXJfZmFjdG9yKmFycl9zaXplKSoyOworICAgIGNvbnRfZmxhZyA9IENWX0lTX01BVF9DT05UKG1hdC0+dHlwZSk7CisgICAgZWxlbV9zaXplID0gQ1ZfRUxFTV9TSVpFKG1hdC0+dHlwZSk7CisgICAgaWYoIGVsZW1fc2l6ZSAlIHNpemVvZl9pbnQgPT0gMCAmJiAoY29udF9mbGFnIHx8IHN0ZXAgJSBzaXplb2ZfaW50ID09IDApICkKKyAgICB7CisgICAgICAgIGlkYXRhID0gbWF0LT5kYXRhLmk7CisgICAgICAgIHN0ZXAgLz0gc2l6ZW9mX2ludDsKKyAgICAgICAgZWxlbV9zaXplIC89IHNpemVvZl9pbnQ7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZGF0YSA9IG1hdC0+ZGF0YS5wdHI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgaXRlcnM7IGkgKz0gZGVsdGEgKQorICAgIHsKKyAgICAgICAgZGVsdGEgPSBNSU4oIGl0ZXJzIC0gaSwgcGFpcl9idWZfc3oqMiApOworICAgICAgICBfcGFpcl9idWYuY29scyA9IGRlbHRhOworICAgICAgICBjdlJhbmRBcnIoIHJuZywgJl9wYWlyX2J1ZiwgQ1ZfUkFORF9VTkksIGN2UmVhbFNjYWxhcigwKSwgY3ZSZWFsU2NhbGFyKGFycl9zaXplKSApOworICAgICAgICAKKyAgICAgICAgaWYoIGNvbnRfZmxhZyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpZGF0YSApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRlbHRhOyBqICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50KiBwID0gaWRhdGEgKyBwYWlyX2J1ZltqXSplbGVtX3NpemUsICpxID0gaWRhdGEgKyBwYWlyX2J1ZltqKzFdKmVsZW1fc2l6ZSwgdDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGVsZW1fc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHBba10sIHFba10sIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRlbHRhOyBqICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWNoYXIqIHAgPSBkYXRhICsgcGFpcl9idWZbal0qZWxlbV9zaXplLCAqcSA9IGRhdGEgKyBwYWlyX2J1ZltqKzFdKmVsZW1fc2l6ZSwgdDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGVsZW1fc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHBba10sIHFba10sIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggaWRhdGEgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkZWx0YTsgaiArPSAyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpZHgxID0gcGFpcl9idWZbal0sIGlkeDIgPSBwYWlyX2J1ZltqKzFdLCByb3cxLCByb3cyOworICAgICAgICAgICAgICAgICAgICBpbnQqIHAsICpxLCB0OworICAgICAgICAgICAgICAgICAgICByb3cxID0gaWR4MS9zdGVwOyByb3cyID0gaWR4Mi9zdGVwOworICAgICAgICAgICAgICAgICAgICBwID0gaWRhdGEgKyByb3cxKnN0ZXAgKyAoaWR4MSAtIHJvdzEqY29scykqZWxlbV9zaXplOworICAgICAgICAgICAgICAgICAgICBxID0gaWRhdGEgKyByb3cyKnN0ZXAgKyAoaWR4MiAtIHJvdzIqY29scykqZWxlbV9zaXplOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGVsZW1fc2l6ZTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHBba10sIHFba10sIHQgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGRlbHRhOyBqICs9IDIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeDEgPSBwYWlyX2J1ZltqXSwgaWR4MiA9IHBhaXJfYnVmW2orMV0sIHJvdzEsIHJvdzI7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBwLCAqcSwgdDsKKyAgICAgICAgICAgICAgICAgICAgcm93MSA9IGlkeDEvc3RlcDsgcm93MiA9IGlkeDIvc3RlcDsKKyAgICAgICAgICAgICAgICAgICAgcCA9IGRhdGEgKyByb3cxKnN0ZXAgKyAoaWR4MSAtIHJvdzEqY29scykqZWxlbV9zaXplOworICAgICAgICAgICAgICAgICAgICBxID0gZGF0YSArIHJvdzIqc3RlcCArIChpZHgyIC0gcm93Mipjb2xzKSplbGVtX3NpemU7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgZWxlbV9zaXplOyBrKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUCggcFtrXSwgcVtrXSwgdCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworQ1ZfSU1QTCBDdkFycioKK2N2UmFuZ2UoIEN2QXJyKiBhcnIsIGRvdWJsZSBzdGFydCwgZG91YmxlIGVuZCApCit7CisgICAgaW50IG9rID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2UmFuZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZNYXQgc3R1YiwgKm1hdCA9IChDdk1hdCopYXJyOworICAgIGRvdWJsZSBkZWx0YTsKKyAgICBpbnQgdHlwZSwgc3RlcDsKKyAgICBkb3VibGUgdmFsID0gc3RhcnQ7CisgICAgaW50IGksIGo7CisgICAgaW50IHJvd3MsIGNvbHM7CisgICAgCisgICAgaWYoICFDVl9JU19NQVQobWF0KSApCisgICAgICAgIENWX0NBTEwoIG1hdCA9IGN2R2V0TWF0KCBtYXQsICZzdHViKSApOworCisgICAgcm93cyA9IG1hdC0+cm93czsKKyAgICBjb2xzID0gbWF0LT5jb2xzOworICAgIHR5cGUgPSBDVl9NQVRfVFlQRShtYXQtPnR5cGUpOworICAgIGRlbHRhID0gKGVuZC1zdGFydCkvKHJvd3MqY29scyk7CisKKyAgICBpZiggQ1ZfSVNfTUFUX0NPTlQobWF0LT50eXBlKSApCisgICAgeworICAgICAgICBjb2xzICo9IHJvd3M7CisgICAgICAgIHJvd3MgPSAxOworICAgICAgICBzdGVwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBzdGVwID0gbWF0LT5zdGVwIC8gQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgaWYoIHR5cGUgPT0gQ1ZfMzJTQzEgKQorICAgIHsKKyAgICAgICAgaW50KiBpZGF0YSA9IG1hdC0+ZGF0YS5pOworICAgICAgICBpbnQgaXZhbCA9IGN2Um91bmQodmFsKSwgaWRlbHRhID0gY3ZSb3VuZChkZWx0YSk7CisKKyAgICAgICAgaWYoIGZhYnModmFsIC0gaXZhbCkgPCBEQkxfRVBTSUxPTiAmJgorICAgICAgICAgICAgZmFicyhkZWx0YSAtIGlkZWx0YSkgPCBEQkxfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCByb3dzOyBpKyssIGlkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjb2xzOyBqKyssIGl2YWwgKz0gaWRlbHRhICkKKyAgICAgICAgICAgICAgICAgICAgaWRhdGFbal0gPSBpdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJvd3M7IGkrKywgaWRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKywgdmFsICs9IGRlbHRhICkKKyAgICAgICAgICAgICAgICAgICAgaWRhdGFbal0gPSBjdlJvdW5kKHZhbCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8zMkZDMSApCisgICAgeworICAgICAgICBmbG9hdCogZmRhdGEgPSBtYXQtPmRhdGEuZmw7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCByb3dzOyBpKyssIGZkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKywgdmFsICs9IGRlbHRhICkKKyAgICAgICAgICAgICAgICBmZGF0YVtqXSA9IChmbG9hdCl2YWw7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiVGhlIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgMzJzQzEgYW5kIDMyZkMxIGRhdGF0eXBlcyIgKTsKKworICAgIG9rID0gMTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gb2sgPyBhcnIgOiAwOworfQorCisKKyNkZWZpbmUgSUNWX0xUX0JZX0lEWChhLCBiKSAoYXV4W2FdIDwgYXV4W2JdKQorCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0SWR4NjRmLCBpbnQsIElDVl9MVF9CWV9JRFgsIGNvbnN0IGRvdWJsZSogKQorc3RhdGljIENWX0lNUExFTUVOVF9RU09SVF9FWCggaWN2U29ydElkeDMyZiwgaW50LCBJQ1ZfTFRfQllfSURYLCBjb25zdCBmbG9hdCogKQorc3RhdGljIENWX0lNUExFTUVOVF9RU09SVF9FWCggaWN2U29ydElkeDMycywgaW50LCBJQ1ZfTFRfQllfSURYLCBjb25zdCBpbnQqICkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnRJZHgxNnUsIGludCwgSUNWX0xUX0JZX0lEWCwgY29uc3QgdXNob3J0KiApCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0SWR4MTZzLCBpbnQsIElDVl9MVF9CWV9JRFgsIGNvbnN0IHNob3J0KiApCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0SWR4OHUsIGludCwgSUNWX0xUX0JZX0lEWCwgY29uc3QgdWNoYXIqICkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnRJZHg4cywgaW50LCBJQ1ZfTFRfQllfSURYLCBjb25zdCBzY2hhciogKQorCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0NjRmLCBkb3VibGUsIENWX0xULCBpbnQgKQorc3RhdGljIENWX0lNUExFTUVOVF9RU09SVF9FWCggaWN2U29ydDMyZiwgZmxvYXQsIENWX0xULCBpbnQgKQorc3RhdGljIENWX0lNUExFTUVOVF9RU09SVF9FWCggaWN2U29ydDMycywgaW50LCBDVl9MVCwgaW50ICkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnQxNnUsIHVzaG9ydCwgQ1ZfTFQsIGludCApCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0MTZzLCBzaG9ydCwgQ1ZfTFQsIGludCApCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0OHUsIHVjaGFyLCBDVl9MVCwgaW50ICkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnQ4cywgc2NoYXIsIENWX0xULCBpbnQgKQorCit0eXBlZGVmIHZvaWQgKCpDdlNvcnRGdW5jKSggdm9pZCogYXJyLCBzaXplX3QgbiwgaW50ICk7Cit0eXBlZGVmIHZvaWQgKCpDdlNvcnRJZHhGdW5jKSggaW50KiBhcnIsIHNpemVfdCBuLCBjb25zdCB2b2lkKiApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK2ljdkNvcHkxRCggY29uc3Qgdm9pZCogc3JjLCBpbnQgcywgdm9pZCogZHN0LCBpbnQgZCwgaW50IG4sIGludCBlbGVtU2l6ZSApCit7CisgICAgaW50IGk7CisgICAgc3dpdGNoKCBlbGVtU2l6ZSApCisgICAgeworICAgIGNhc2UgMToKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAoKHVjaGFyKilkc3QpW2kqZF0gPSAoKHVjaGFyKilzcmMpW2kqc107CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAoKHVzaG9ydCopZHN0KVtpKmRdID0gKCh1c2hvcnQqKXNyYylbaSpzXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICgoaW50Kilkc3QpW2kqZF0gPSAoKGludCopc3JjKVtpKnNdOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDg6CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgKChpbnQ2NCopZHN0KVtpKmRdID0gKChpbnQ2NCopc3JjKVtpKnNdOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBhc3NlcnQoMCk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZAoraWN2U2h1ZmZsZTFEKCBjb25zdCB1Y2hhciogc3JjLCBjb25zdCBpbnQqIGlkeCwgdWNoYXIqIGRzdCwgaW50IGQsIGludCBuLCBpbnQgZWxlbVNpemUgKQoreworICAgIGludCBpOworICAgIHN3aXRjaCggZWxlbVNpemUgKQorICAgIHsKKyAgICBjYXNlIDE6CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgZHN0W2kqZF0gPSBzcmNbaWR4W2ldXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICgodXNob3J0Kilkc3QpW2kqZF0gPSAoKHVzaG9ydCopc3JjKVtpZHhbaV1dOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgKChpbnQqKWRzdClbaSpkXSA9ICgoaW50KilzcmMpW2lkeFtpXV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAoKGludDY0Kilkc3QpW2kqZF0gPSAoKGludDY0KilzcmMpW2lkeFtpXV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGFzc2VydCgwKTsKKyAgICB9Cit9CisKKworQ1ZfSU1QTCB2b2lkCitjdlNvcnQoIGNvbnN0IEN2QXJyKiBfc3JjLCBDdkFyciogX2RzdCwgQ3ZBcnIqIF9pZHgsIGludCBmbGFncyApCit7CisgICAgdWNoYXIgKnRzcmMgPSAwOworICAgIGludCogdGlkeCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoImN2U29ydCIpOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3N0dWIsICpzcmMgPSBjdkdldE1hdChfc3JjLCAmc3N0dWIpOworICAgIEN2TWF0IGRzdHViLCAqZHN0ID0gX2RzdCA/IGN2R2V0TWF0KF9kc3QsICZkc3R1YikgOiAwOworICAgIEN2TWF0IGlzdHViLCAqaWR4ID0gX2lkeCA/IGN2R2V0TWF0KF9pZHgsICZpc3R1YikgOiAwOworICAgIGludCB0eXBlID0gQ1ZfTUFUX1RZUEUoc3JjLT50eXBlKSwgZWxlbVNpemUgPSBDVl9FTEVNX1NJWkUodHlwZSk7CisgICAgaW50IHNzdGVwID0gc3JjLT5zdGVwLCBkc3RlcCA9IGRzdCA/IGRzdC0+c3RlcCA6IDA7CisgICAgaW50IGlzdGVwID0gaWR4ID8gaWR4LT5zdGVwL3NpemVvZihpbnQpIDogMDsKKyAgICBpbnQgaSwgbGVuID0gc3JjLT5jb2xzOworICAgIEN2U29ydEZ1bmMgc29ydEZ1bmMgPSAwOworICAgIEN2U29ydElkeEZ1bmMgc29ydElkeEZ1bmMgPSAwOworCisgICAgaWYoIENWX01BVF9DTiggc3JjLT50eXBlICkgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlRoZSBpbnB1dCBtYXRyaXggc2hvdWxkIGJlIGEgb25lLWNoYW5uZWwgbWF0cml4LiIgKTsKKyAgICBpZiggaWR4ICkKKyAgICB7CisgICAgICAgIGlmKCBDVl9NQVRfVFlQRSggaWR4LT50eXBlICkgIT0gQ1ZfMzJTQzEpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgaW5kZXggbWF0cml4IG11c3QgYmUgQ1ZfMzJTQzEuIiApOworCisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBpZHgsIHNyYyApKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiVGhlIGlucHV0IG1hdHJpeCBhbmQgaW5kZXggbWF0cml4IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZSIgKTsKKyAgICB9CisKKyAgICBpZiggZHN0ICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfQVJFX1RZUEVTX0VRKHNyYywgZHN0KSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkRm9ybWF0cywgIlRoZSBpbnB1dCBhbmQgb3V0cHV0IG1hdHJpeCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUiICk7CisKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoc3JjLCBkc3QpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlRoZSBpbnB1dCBhbmQgb3V0cHV0IG1hdHJpeCBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUiICk7CisgICAgfQorCisgICAgaWYoICFpZHggJiYgIWRzdCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiQXQgbGVhc3Qgb25lIG9mIGluZGV4IGFycmF5IG9yIGRlc3RpbmF0aW9uIGFycmF5IG11c3QgYmUgbm9uLU5VTEwiICk7CisKKyAgICBpZiggdHlwZSA9PSBDVl84VSApCisgICAgICAgIHNvcnRJZHhGdW5jID0gKEN2U29ydElkeEZ1bmMpaWN2U29ydElkeDh1LCBzb3J0RnVuYyA9IChDdlNvcnRGdW5jKWljdlNvcnQ4dTsKKyAgICBlbHNlIGlmKCB0eXBlID09IENWXzhTICkKKyAgICAgICAgc29ydElkeEZ1bmMgPSAoQ3ZTb3J0SWR4RnVuYylpY3ZTb3J0SWR4OHMsIHNvcnRGdW5jID0gKEN2U29ydEZ1bmMpaWN2U29ydDhzOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMTZVICkKKyAgICAgICAgc29ydElkeEZ1bmMgPSAoQ3ZTb3J0SWR4RnVuYylpY3ZTb3J0SWR4MTZ1LCBzb3J0RnVuYyA9IChDdlNvcnRGdW5jKWljdlNvcnQxNnU7CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl8xNlMgKQorICAgICAgICBzb3J0SWR4RnVuYyA9IChDdlNvcnRJZHhGdW5jKWljdlNvcnRJZHgxNnMsIHNvcnRGdW5jID0gKEN2U29ydEZ1bmMpaWN2U29ydDE2czsKKyAgICBlbHNlIGlmKCB0eXBlID09IENWXzMyUyApCisgICAgICAgIHNvcnRJZHhGdW5jID0gKEN2U29ydElkeEZ1bmMpaWN2U29ydElkeDMycywgc29ydEZ1bmMgPSAoQ3ZTb3J0RnVuYylpY3ZTb3J0MzJzOworICAgIGVsc2UgaWYoIHR5cGUgPT0gQ1ZfMzJGICkKKyAgICAgICAgc29ydElkeEZ1bmMgPSAoQ3ZTb3J0SWR4RnVuYylpY3ZTb3J0SWR4MzJmLCBzb3J0RnVuYyA9IChDdlNvcnRGdW5jKWljdlNvcnQzMmY7CisgICAgZWxzZSBpZiggdHlwZSA9PSBDVl82NEYgKQorICAgICAgICBzb3J0SWR4RnVuYyA9IChDdlNvcnRJZHhGdW5jKWljdlNvcnRJZHg2NGYsIHNvcnRGdW5jID0gKEN2U29ydEZ1bmMpaWN2U29ydDY0ZjsKKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIlVuc3VwcG9ydGVkIGZvcm1hdCBvZiB0aGUgaW5wdXQgYXJyYXkiICk7CisKKyAgICAvLyBzaW5nbGUtY29sdW1uIGNhc2UsIHdoZXJlIGFsbCBvZiBzcmMsIGlkeCAmIGRzdCBhcnJheXMgYXJlIGNvbnRpbnVvdXMsIGlzCisgICAgLy8gZXF1aXZhbGVudCB0byAic29ydCBldmVyeSByb3ciIG1vZGUuCisgICAgaWYoIChmbGFncyAmIENWX1NPUlRfRVZFUllfQ09MVU1OKSAmJgorICAgICAgICAoc3JjLT5jb2xzID4gMSB8fCAhQ1ZfSVNfTUFUX0NPTlQoc3JjLT50eXBlICYKKyAgICAgICAgKGRzdCA/IGRzdC0+dHlwZSA6IC0xKSAmIChpZHggPyBpZHgtPnR5cGUgOiAtMSkpKSApCisgICAgeworICAgICAgICB1Y2hhciogZHB0ciA9IGRzdCA/IGRzdC0+ZGF0YS5wdHIgOiAwOworICAgICAgICBpbnQqIGlkeHB0ciA9IGlkeCA/IGlkeC0+ZGF0YS5pIDogMDsKKworICAgICAgICBsZW4gPSBzcmMtPnJvd3M7CisgICAgICAgIHRzcmMgPSAodWNoYXIqKWN2QWxsb2MobGVuKmVsZW1TaXplKTsKKyAgICAgICAgaWYoIGlkeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHRpZHggPSAoaW50KiljdkFsbG9jKGxlbipzaXplb2YodGlkeFswXSkpOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgICAgICAgICB0aWR4W2ldID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBmbGFncyAmIENWX1NPUlRfREVTQ0VORElORyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRwdHIgKz0gZHN0ZXAqKHNyYy0+cm93cyAtIDEpOworICAgICAgICAgICAgZHN0ZXAgPSAtZHN0ZXA7CisgICAgICAgICAgICBpZHhwdHIgKz0gaXN0ZXAqKHNyYy0+cm93cyAtIDEpOworICAgICAgICAgICAgaXN0ZXAgPSAtaXN0ZXA7CisgICAgICAgIH0KKworICAgICAgICBzc3RlcCAvPSBlbGVtU2l6ZTsKKyAgICAgICAgZHN0ZXAgLz0gZWxlbVNpemU7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNyYy0+Y29sczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWN2Q29weTFEKCBzcmMtPmRhdGEucHRyICsgaSplbGVtU2l6ZSwgc3N0ZXAsIHRzcmMsIDEsIGxlbiwgZWxlbVNpemUgKTsKKyAgICAgICAgICAgIGlmKCB0aWR4ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzb3J0SWR4RnVuYyggdGlkeCwgbGVuLCB0c3JjICk7CisgICAgICAgICAgICAgICAgaWYoIGRzdCApCisgICAgICAgICAgICAgICAgICAgIGljdlNodWZmbGUxRCggdHNyYywgdGlkeCwgZHB0ciArIGkqZWxlbVNpemUsIGRzdGVwLCBsZW4sIGVsZW1TaXplICk7CisgICAgICAgICAgICAgICAgaWN2Q29weTFEKCB0aWR4LCAxLCBpZHhwdHIgKyBpLCBpc3RlcCwgbGVuLCBzaXplb2YoaW50KSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNvcnRGdW5jKCB0c3JjLCBsZW4sIDAgKTsKKyAgICAgICAgICAgICAgICBpY3ZDb3B5MUQoIHRzcmMsIDEsIGRwdHIgKyBpKmVsZW1TaXplLCBkc3RlcCwgbGVuLCBlbGVtU2l6ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGludCBqLCB0LCBjb3VudCA9IHNyYy0+cm93czsKKyAgICAgICAgaWYoIGZsYWdzICYgQ1ZfU09SVF9FVkVSWV9DT0xVTU4gKQorICAgICAgICAgICAgQ1ZfU1dBUCggbGVuLCBjb3VudCwgdCApOworCisgICAgICAgIGlmKCAoZmxhZ3MgJiBDVl9TT1JUX0RFU0NFTkRJTkcpIHx8IChpZHggJiYgZHN0ICYmIGRzdC0+ZGF0YS5wdHIgPT0gc3JjLT5kYXRhLnB0cikgKQorICAgICAgICAgICAgdHNyYyA9ICh1Y2hhciopY3ZBbGxvYyhsZW4qZWxlbVNpemUpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFpZHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IHVjaGFyKiBzcHRyID0gc3JjLT5kYXRhLnB0ciArIGkqc3N0ZXA7CisgICAgICAgICAgICAgICAgdWNoYXIqIGRwdHIgPSBkc3QtPmRhdGEucHRyICsgaSpkc3RlcDsKKyAgICAgICAgICAgICAgICB1Y2hhciogcHRyID0gZmxhZ3MgJiBDVl9TT1JUX0RFU0NFTkRJTkcgPyB0c3JjIDogZHB0cjsKKyAgICAgICAgICAgICAgICBpZiggcHRyICE9IHNwdHIgKQorICAgICAgICAgICAgICAgICAgICBpY3ZDb3B5MUQoIHNwdHIsIDEsIHB0ciwgMSwgbGVuLCBlbGVtU2l6ZSApOworICAgICAgICAgICAgICAgIHNvcnRGdW5jKCBwdHIsIGxlbiwgMCApOworICAgICAgICAgICAgICAgIGlmKCBmbGFncyAmIENWX1NPUlRfREVTQ0VORElORyApCisgICAgICAgICAgICAgICAgICAgIGljdkNvcHkxRCggcHRyICsgKGxlbi0xKSplbGVtU2l6ZSwgLTEsIGRwdHIsIDEsIGxlbiwgZWxlbVNpemUgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQqIGlkeF8gPSBpZHgtPmRhdGEuaSArIGlzdGVwKmk7CisgICAgICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNwdHIgPSBzcmMtPmRhdGEucHRyICsgc3N0ZXAqaTsKKyAgICAgICAgICAgICAgICB1Y2hhciogZHB0ciA9IGRzdCA/IGRzdC0+ZGF0YS5wdHIgKyBkc3RlcCppIDogMDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbGVuOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBpZHhfW2pdID0gajsKKyAgICAgICAgICAgICAgICBpZiggZHB0ciAmJiBkcHRyID09IHNwdHIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2Q29weTFEKCBzcHRyLCAxLCB0c3JjLCAxLCBsZW4sIGVsZW1TaXplICk7CisgICAgICAgICAgICAgICAgICAgIHNwdHIgPSB0c3JjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzb3J0SWR4RnVuYyggaWR4XywgbGVuLCBzcHRyICk7CisgICAgICAgICAgICAgICAgaWYoIGZsYWdzICYgQ1ZfU09SVF9ERVNDRU5ESU5HICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGxlbi8yOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1dBUChpZHhfW2pdLCBpZHhfW2xlbi1qLTFdLCB0KTsKKyAgICAgICAgICAgICAgICBpZiggZHB0ciApCisgICAgICAgICAgICAgICAgICAgIGljdlNodWZmbGUxRCggc3B0ciwgaWR4XywgZHB0ciwgMSwgbGVuLCBlbGVtU2l6ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnRzcmMgKTsKKyAgICBjdkZyZWUoICZ0aWR4ICk7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvbGlib3BlbmN2Lm1rIGIvbGlib3BlbmN2Lm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmM2MzMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJvcGVuY3YubWsKQEAgLTAsMCArMSwxMSBAQAorIyBBZGQgYSBjb3VwbGUgaW5jbHVkZSBwYXRocyB0byB1c2Ugc3RscG9ydC4KK09QRU5DViA6PSAkKGNhbGwgbXktZGlyKQorCisjIE1ha2Ugc3VyZSBiaW9uaWMgaXMgZmlyc3Qgc28gd2UgY2FuIGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMuCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKE9QRU5DVikvY3YvaW5jbHVkZSAgXAorCSQoT1BFTkNWKS9jeGNvcmUvaW5jbHVkZSAgXAorCSQoT1BFTkNWKS9jdmF1eC9pbmNsdWRlICBcCisJJChPUEVOQ1YpL21sL2luY2x1ZGUgIFwKKwkkKE9QRU5DVikvb3RoZXJsaWJzL2hpZ2hndWkgIFwKKwkkKExPQ0FMX0NfSU5DTFVERVMpCmRpZmYgLS1naXQgYS9tbC9pbmNsdWRlL21sLmggYi9tbC9pbmNsdWRlL21sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZjIyZgotLS0gL2Rldi9udWxsCisrKyBiL21sL2luY2x1ZGUvbWwuaApAQCAtMCwwICsxLDE1NjQgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfX01MX0hfXworI2RlZmluZSBfX01MX0hfXworCisvLyBkaXNhYmxlIGRlcHJlY2F0aW9uIHdhcm5pbmcgd2hpY2ggYXBwZWFycyBpbiBWaXN1YWxTdHVkaW8gOC4wCisjaWYgX01TQ19WRVIgPj0gMTQwMAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlIDogNDk5NiApCisjZW5kaWYKKworI2lmbmRlZiBTS0lQX0lOQ0xVREVTCisKKyAgI2luY2x1ZGUgImN4Y29yZS5oIgorICAjaW5jbHVkZSA8bGltaXRzLmg+CisKKyAgI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorICAgICNpbmNsdWRlIDx3aW5kb3dzLmg+CisgICNlbmRpZgorCisjZWxzZSAvLyBTS0lQX0lOQ0xVREVTCisKKyAgI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NAorICAgICNkZWZpbmUgQ1ZfQ0RFQ0wgX19jZGVjbAorICAgICNkZWZpbmUgQ1ZfU1REQ0FMTCBfX3N0ZGNhbGwKKyAgI2Vsc2UKKyAgICAjZGVmaW5lIENWX0NERUNMCisgICAgI2RlZmluZSBDVl9TVERDQUxMCisgICNlbmRpZgorCisgICNpZm5kZWYgQ1ZfRVhURVJOX0MKKyAgICAjaWZkZWYgX19jcGx1c3BsdXMKKyAgICAgICNkZWZpbmUgQ1ZfRVhURVJOX0MgZXh0ZXJuICJDIgorICAgICAgI2RlZmluZSBDVl9ERUZBVUxUKHZhbCkgPSB2YWwKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBDVl9FWFRFUk5fQworICAgICAgI2RlZmluZSBDVl9ERUZBVUxUKHZhbCkKKyAgICAjZW5kaWYKKyAgI2VuZGlmCisKKyAgI2lmbmRlZiBDVl9FWFRFUk5fQ19GVU5DUFRSCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgICAjZGVmaW5lIENWX0VYVEVSTl9DX0ZVTkNQVFIoeCkgZXh0ZXJuICJDIiB7IHR5cGVkZWYgeDsgfQorICAgICNlbHNlCisgICAgICAjZGVmaW5lIENWX0VYVEVSTl9DX0ZVTkNQVFIoeCkgdHlwZWRlZiB4CisgICAgI2VuZGlmCisgICNlbmRpZgorCisgICNpZm5kZWYgQ1ZfSU5MSU5FCisgICAgI2lmIGRlZmluZWQgX19jcGx1c3BsdXMKKyAgICAgICNkZWZpbmUgQ1ZfSU5MSU5FIGlubGluZQorICAgICNlbGlmIChkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQpICYmICFkZWZpbmVkIF9fR05VQ19fCisgICAgICAjZGVmaW5lIENWX0lOTElORSBfX2lubGluZQorICAgICNlbHNlCisgICAgICAjZGVmaW5lIENWX0lOTElORSBzdGF0aWMKKyAgICAjZW5kaWYKKyAgI2VuZGlmIC8qIENWX0lOTElORSAqLworCisgICNpZiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0KSAmJiBkZWZpbmVkIENWQVBJX0VYUE9SVFMKKyAgICAjZGVmaW5lIENWX0VYUE9SVFMgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICNlbHNlCisgICAgI2RlZmluZSBDVl9FWFBPUlRTCisgICNlbmRpZgorCisgICNpZm5kZWYgQ1ZBUEkKKyAgICAjZGVmaW5lIENWQVBJKHJldHR5cGUpIENWX0VYVEVSTl9DIENWX0VYUE9SVFMgcmV0dHlwZSBDVl9DREVDTAorICAjZW5kaWYKKworI2VuZGlmIC8vIFNLSVBfSU5DTFVERVMKKworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLy8gQXBwbGUgZGVmaW5lcyBhIGNoZWNrKCkgbWFjcm8gc29tZXdoZXJlIGluIHRoZSBkZWJ1ZyBoZWFkZXJzCisvLyB0aGF0IGludGVyZmVyZXMgd2l0aCBhIG1ldGhvZCBkZWZpbml0b24gaW4gdGhpcyBoZWFkZXIKKyN1bmRlZiBjaGVjaworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFpbiBzdHJ1Y3QgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGxvZygyKlBJKSAqLworI2RlZmluZSBDVl9MT0cyUEkgKDEuODM3ODc3MDY2NDA5MzQ1NDgzNTYwNjU5NDcyODExMikKKworLyogY29sdW1ucyBvZiA8dHJhaW5EYXRhPiBtYXRyaXggYXJlIHRyYWluaW5nIHNhbXBsZXMgKi8KKyNkZWZpbmUgQ1ZfQ09MX1NBTVBMRSAwCisKKy8qIHJvd3Mgb2YgPHRyYWluRGF0YT4gbWF0cml4IGFyZSB0cmFpbmluZyBzYW1wbGVzICovCisjZGVmaW5lIENWX1JPV19TQU1QTEUgMQorCisjZGVmaW5lIENWX0lTX1JPV19TQU1QTEUoZmxhZ3MpICgoZmxhZ3MpICYgQ1ZfUk9XX1NBTVBMRSkKKworc3RydWN0IEN2VmVjdG9ycworeworICAgIGludCB0eXBlOworICAgIGludCBkaW1zLCBjb3VudDsKKyAgICBDdlZlY3RvcnMqIG5leHQ7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIHVjaGFyKiogcHRyOworICAgICAgICBmbG9hdCoqIGZsOworICAgICAgICBkb3VibGUqKiBkYjsKKyAgICB9IGRhdGE7Cit9OworCisjaWYgMAorLyogQSBzdHJ1Y3R1cmUsIHJlcHJlc2VudGluZyB0aGUgbGF0dGljZSByYW5nZSBvZiBzdGF0bW9kZWwgcGFyYW1ldGVycy4KKyAgIEl0IGlzIHVzZWQgZm9yIG9wdGltaXppbmcgc3RhdG1vZGVsIHBhcmFtZXRlcnMgYnkgY3Jvc3MtdmFsaWRhdGlvbiBtZXRob2QuCisgICBUaGUgbGF0dGljZSBpcyBsb2dhcml0aG1pYywgc28gPHN0ZXA+IG11c3QgYmUgZ3JlYXRlciB0aGVuIDEuICovCit0eXBlZGVmIHN0cnVjdCBDdlBhcmFtTGF0dGljZQoreworICAgIGRvdWJsZSBtaW5fdmFsOworICAgIGRvdWJsZSBtYXhfdmFsOworICAgIGRvdWJsZSBzdGVwOworfQorQ3ZQYXJhbUxhdHRpY2U7CisKK0NWX0lOTElORSBDdlBhcmFtTGF0dGljZSBjdlBhcmFtTGF0dGljZSggZG91YmxlIG1pbl92YWwsIGRvdWJsZSBtYXhfdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbG9nX3N0ZXAgKQoreworICAgIEN2UGFyYW1MYXR0aWNlIHBsOworICAgIHBsLm1pbl92YWwgPSBNSU4oIG1pbl92YWwsIG1heF92YWwgKTsKKyAgICBwbC5tYXhfdmFsID0gTUFYKCBtaW5fdmFsLCBtYXhfdmFsICk7CisgICAgcGwuc3RlcCA9IE1BWCggbG9nX3N0ZXAsIDEuICk7CisgICAgcmV0dXJuIHBsOworfQorCitDVl9JTkxJTkUgQ3ZQYXJhbUxhdHRpY2UgY3ZEZWZhdWx0UGFyYW1MYXR0aWNlKCB2b2lkICkKK3sKKyAgICBDdlBhcmFtTGF0dGljZSBwbCA9IHswLDAsMH07CisgICAgcmV0dXJuIHBsOworfQorI2VuZGlmCisKKy8qIFZhcmlhYmxlIHR5cGUgKi8KKyNkZWZpbmUgQ1ZfVkFSX05VTUVSSUNBTCAgICAwCisjZGVmaW5lIENWX1ZBUl9PUkRFUkVEICAgICAgMAorI2RlZmluZSBDVl9WQVJfQ0FURUdPUklDQUwgIDEKKworI2RlZmluZSBDVl9UWVBFX05BTUVfTUxfU1ZNICAgICAgICAgIm9wZW5jdi1tbC1zdm0iCisjZGVmaW5lIENWX1RZUEVfTkFNRV9NTF9LTk4gICAgICAgICAib3BlbmN2LW1sLWtubiIKKyNkZWZpbmUgQ1ZfVFlQRV9OQU1FX01MX05CQVlFUyAgICAgICJvcGVuY3YtbWwtYmF5ZXNpYW4iCisjZGVmaW5lIENWX1RZUEVfTkFNRV9NTF9FTSAgICAgICAgICAib3BlbmN2LW1sLWVtIgorI2RlZmluZSBDVl9UWVBFX05BTUVfTUxfQk9PU1RJTkcgICAgIm9wZW5jdi1tbC1ib29zdC10cmVlIgorI2RlZmluZSBDVl9UWVBFX05BTUVfTUxfVFJFRSAgICAgICAgIm9wZW5jdi1tbC10cmVlIgorI2RlZmluZSBDVl9UWVBFX05BTUVfTUxfQU5OX01MUCAgICAgIm9wZW5jdi1tbC1hbm4tbWxwIgorI2RlZmluZSBDVl9UWVBFX05BTUVfTUxfQ05OICAgICAgICAgIm9wZW5jdi1tbC1jbm4iCisjZGVmaW5lIENWX1RZUEVfTkFNRV9NTF9SVFJFRVMgICAgICAib3BlbmN2LW1sLXJhbmRvbS10cmVlcyIKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdlN0YXRNb2RlbAoreworcHVibGljOgorICAgIEN2U3RhdE1vZGVsKCk7CisgICAgdmlydHVhbCB+Q3ZTdGF0TW9kZWwoKTsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpOworCisgICAgdmlydHVhbCB2b2lkIHNhdmUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBuYW1lPTAgKTsKKyAgICB2aXJ0dWFsIHZvaWQgbG9hZCggY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IGNoYXIqIG5hbWU9MCApOworCisgICAgdmlydHVhbCB2b2lkIHdyaXRlKCBDdkZpbGVTdG9yYWdlKiBzdG9yYWdlLCBjb25zdCBjaGFyKiBuYW1lICk7CisgICAgdmlydHVhbCB2b2lkIHJlYWQoIEN2RmlsZVN0b3JhZ2UqIHN0b3JhZ2UsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGNoYXIqIGRlZmF1bHRfbW9kZWxfbmFtZTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9ybWFsIEJheWVzIENsYXNzaWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBUaGUgc3RydWN0dXJlLCByZXByZXNlbnRpbmcgdGhlIGdyaWQgcmFuZ2Ugb2Ygc3RhdG1vZGVsIHBhcmFtZXRlcnMuCisgICBJdCBpcyB1c2VkIGZvciBvcHRpbWl6aW5nIHN0YXRtb2RlbCBhY2N1cmFjeSBieSB2YXJ5aW5nIG1vZGVsIHBhcmFtZXRlcnMsCisgICB0aGUgYWNjdXJhY3kgZXN0aW1hdGUgYmVpbmcgY29tcHV0ZWQgYnkgY3Jvc3MtdmFsaWRhdGlvbi4KKyAgIFRoZSBncmlkIGlzIGxvZ2FyaXRobWljLCBzbyA8c3RlcD4gbXVzdCBiZSBncmVhdGVyIHRoZW4gMS4gKi8KK3N0cnVjdCBDVl9FWFBPUlRTIEN2UGFyYW1HcmlkCit7CisgICAgLy8gU1ZNIHBhcmFtcyB0eXBlCisgICAgZW51bSB7IFNWTV9DPTAsIFNWTV9HQU1NQT0xLCBTVk1fUD0yLCBTVk1fTlU9MywgU1ZNX0NPRUY9NCwgU1ZNX0RFR1JFRT01IH07CisKKyAgICBDdlBhcmFtR3JpZCgpCisgICAgeworICAgICAgICBtaW5fdmFsID0gbWF4X3ZhbCA9IHN0ZXAgPSAwOworICAgIH0KKworICAgIEN2UGFyYW1HcmlkKCBkb3VibGUgX21pbl92YWwsIGRvdWJsZSBfbWF4X3ZhbCwgZG91YmxlIGxvZ19zdGVwICkKKyAgICB7CisgICAgICAgIG1pbl92YWwgPSBfbWluX3ZhbDsKKyAgICAgICAgbWF4X3ZhbCA9IF9tYXhfdmFsOworICAgICAgICBzdGVwID0gbG9nX3N0ZXA7CisgICAgfQorICAgIC8vQ3ZQYXJhbUdyaWQoIGludCBwYXJhbV9pZCApOworICAgIGJvb2wgY2hlY2soKSBjb25zdDsKKworICAgIGRvdWJsZSBtaW5fdmFsOworICAgIGRvdWJsZSBtYXhfdmFsOworICAgIGRvdWJsZSBzdGVwOworfTsKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdk5vcm1hbEJheWVzQ2xhc3NpZmllciA6IHB1YmxpYyBDdlN0YXRNb2RlbAoreworcHVibGljOgorICAgIEN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyKCk7CisgICAgdmlydHVhbCB+Q3ZOb3JtYWxCYXllc0NsYXNzaWZpZXIoKTsKKworICAgIEN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgICAgICBjb25zdCBDdk1hdCogX3Zhcl9pZHg9MCwgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAgKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICAgICAgY29uc3QgQ3ZNYXQqIF92YXJfaWR4ID0gMCwgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGJvb2wgdXBkYXRlPWZhbHNlICk7CisKKyAgICB2aXJ0dWFsIGZsb2F0IHByZWRpY3QoIGNvbnN0IEN2TWF0KiBfc2FtcGxlcywgQ3ZNYXQqIHJlc3VsdHM9MCApIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpOworCisgICAgdmlydHVhbCB2b2lkIHdyaXRlKCBDdkZpbGVTdG9yYWdlKiBzdG9yYWdlLCBjb25zdCBjaGFyKiBuYW1lICk7CisgICAgdmlydHVhbCB2b2lkIHJlYWQoIEN2RmlsZVN0b3JhZ2UqIHN0b3JhZ2UsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKworcHJvdGVjdGVkOgorICAgIGludCAgICAgdmFyX2NvdW50LCB2YXJfYWxsOworICAgIEN2TWF0KiAgdmFyX2lkeDsKKyAgICBDdk1hdCogIGNsc19sYWJlbHM7CisgICAgQ3ZNYXQqKiBjb3VudDsKKyAgICBDdk1hdCoqIHN1bTsKKyAgICBDdk1hdCoqIHByb2R1Y3RzdW07CisgICAgQ3ZNYXQqKiBhdmc7CisgICAgQ3ZNYXQqKiBpbnZfZWlnZW5fdmFsdWVzOworICAgIEN2TWF0KiogY292X3JvdGF0ZV9tYXRzOworICAgIEN2TWF0KiAgYzsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICBLLU5lYXJlc3QgTmVpZ2hib3VyIENsYXNzaWZpZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBrIE5lYXJlc3QgTmVpZ2hib3JzCitjbGFzcyBDVl9FWFBPUlRTIEN2S05lYXJlc3QgOiBwdWJsaWMgQ3ZTdGF0TW9kZWwKK3sKK3B1YmxpYzoKKworICAgIEN2S05lYXJlc3QoKTsKKyAgICB2aXJ0dWFsIH5DdktOZWFyZXN0KCk7CisKKyAgICBDdktOZWFyZXN0KCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLCBib29sIF9pc19yZWdyZXNzaW9uPWZhbHNlLCBpbnQgbWF4X2s9MzIgKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLCBib29sIGlzX3JlZ3Jlc3Npb249ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX21heF9rPTMyLCBib29sIF91cGRhdGVfYmFzZT1mYWxzZSApOworCisgICAgdmlydHVhbCBmbG9hdCBmaW5kX25lYXJlc3QoIGNvbnN0IEN2TWF0KiBfc2FtcGxlcywgaW50IGssIEN2TWF0KiByZXN1bHRzPTAsCisgICAgICAgIGNvbnN0IGZsb2F0KiogbmVpZ2hib3JzPTAsIEN2TWF0KiBuZWlnaGJvcl9yZXNwb25zZXM9MCwgQ3ZNYXQqIGRpc3Q9MCApIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CisgICAgaW50IGdldF9tYXhfaygpIGNvbnN0OworICAgIGludCBnZXRfdmFyX2NvdW50KCkgY29uc3Q7CisgICAgaW50IGdldF9zYW1wbGVfY291bnQoKSBjb25zdDsKKyAgICBib29sIGlzX3JlZ3Jlc3Npb24oKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCBmbG9hdCB3cml0ZV9yZXN1bHRzKCBpbnQgaywgaW50IGsxLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgIGNvbnN0IGZsb2F0KiBuZWlnaGJvcl9yZXNwb25zZXMsIGNvbnN0IGZsb2F0KiBkaXN0LCBDdk1hdCogX3Jlc3VsdHMsCisgICAgICAgIEN2TWF0KiBfbmVpZ2hib3JfcmVzcG9uc2VzLCBDdk1hdCogX2Rpc3QsIEN2MzJzdWYqIHNvcnRfYnVmICkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgZmluZF9uZWlnaGJvcnNfZGlyZWN0KCBjb25zdCBDdk1hdCogX3NhbXBsZXMsIGludCBrLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgICAgIGZsb2F0KiBuZWlnaGJvcl9yZXNwb25zZXMsIGNvbnN0IGZsb2F0KiogbmVpZ2hib3JzLCBmbG9hdCogZGlzdCApIGNvbnN0OworCisKKyAgICBpbnQgbWF4X2ssIHZhcl9jb3VudDsKKyAgICBpbnQgdG90YWw7CisgICAgYm9vbCByZWdyZXNzaW9uOworICAgIEN2VmVjdG9ycyogc2FtcGxlczsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydCBWZWN0b3IgTWFjaGluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gU1ZNIHRyYWluaW5nIHBhcmFtZXRlcnMKK3N0cnVjdCBDVl9FWFBPUlRTIEN2U1ZNUGFyYW1zCit7CisgICAgQ3ZTVk1QYXJhbXMoKTsKKyAgICBDdlNWTVBhcmFtcyggaW50IF9zdm1fdHlwZSwgaW50IF9rZXJuZWxfdHlwZSwKKyAgICAgICAgICAgICAgICAgZG91YmxlIF9kZWdyZWUsIGRvdWJsZSBfZ2FtbWEsIGRvdWJsZSBfY29lZjAsCisgICAgICAgICAgICAgICAgIGRvdWJsZSBfQywgZG91YmxlIF9udSwgZG91YmxlIF9wLAorICAgICAgICAgICAgICAgICBDdk1hdCogX2NsYXNzX3dlaWdodHMsIEN2VGVybUNyaXRlcmlhIF90ZXJtX2NyaXQgKTsKKworICAgIGludCAgICAgICAgIHN2bV90eXBlOworICAgIGludCAgICAgICAgIGtlcm5lbF90eXBlOworICAgIGRvdWJsZSAgICAgIGRlZ3JlZTsgLy8gZm9yIHBvbHkKKyAgICBkb3VibGUgICAgICBnYW1tYTsgIC8vIGZvciBwb2x5L3JiZi9zaWdtb2lkCisgICAgZG91YmxlICAgICAgY29lZjA7ICAvLyBmb3IgcG9seS9zaWdtb2lkCisKKyAgICBkb3VibGUgICAgICBDOyAgLy8gZm9yIENWX1NWTV9DX1NWQywgQ1ZfU1ZNX0VQU19TVlIgYW5kIENWX1NWTV9OVV9TVlIKKyAgICBkb3VibGUgICAgICBudTsgLy8gZm9yIENWX1NWTV9OVV9TVkMsIENWX1NWTV9PTkVfQ0xBU1MsIGFuZCBDVl9TVk1fTlVfU1ZSCisgICAgZG91YmxlICAgICAgcDsgLy8gZm9yIENWX1NWTV9FUFNfU1ZSCisgICAgQ3ZNYXQqICAgICAgY2xhc3Nfd2VpZ2h0czsgLy8gZm9yIENWX1NWTV9DX1NWQworICAgIEN2VGVybUNyaXRlcmlhIHRlcm1fY3JpdDsgLy8gdGVybWluYXRpb24gY3JpdGVyaWEKK307CisKKworc3RydWN0IENWX0VYUE9SVFMgQ3ZTVk1LZXJuZWwKK3sKKyAgICB0eXBlZGVmIHZvaWQgKEN2U1ZNS2VybmVsOjoqQ2FsYykoIGludCB2ZWNfY291bnQsIGludCB2ZWNfc2l6ZSwgY29uc3QgZmxvYXQqKiB2ZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFub3RoZXIsIGZsb2F0KiByZXN1bHRzICk7CisgICAgQ3ZTVk1LZXJuZWwoKTsKKyAgICBDdlNWTUtlcm5lbCggY29uc3QgQ3ZTVk1QYXJhbXMqIF9wYXJhbXMsIENhbGMgX2NhbGNfZnVuYyApOworICAgIHZpcnR1YWwgYm9vbCBjcmVhdGUoIGNvbnN0IEN2U1ZNUGFyYW1zKiBfcGFyYW1zLCBDYWxjIF9jYWxjX2Z1bmMgKTsKKyAgICB2aXJ0dWFsIH5DdlNWTUtlcm5lbCgpOworCisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CisgICAgdmlydHVhbCB2b2lkIGNhbGMoIGludCB2Y291bnQsIGludCBuLCBjb25zdCBmbG9hdCoqIHZlY3MsIGNvbnN0IGZsb2F0KiBhbm90aGVyLCBmbG9hdCogcmVzdWx0cyApOworCisgICAgY29uc3QgQ3ZTVk1QYXJhbXMqIHBhcmFtczsKKyAgICBDYWxjIGNhbGNfZnVuYzsKKworICAgIHZpcnR1YWwgdm9pZCBjYWxjX25vbl9yYmZfYmFzZSggaW50IHZlY19jb3VudCwgaW50IHZlY19zaXplLCBjb25zdCBmbG9hdCoqIHZlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYW5vdGhlciwgZmxvYXQqIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgYWxwaGEsIGRvdWJsZSBiZXRhICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2FsY19saW5lYXIoIGludCB2ZWNfY291bnQsIGludCB2ZWNfc2l6ZSwgY29uc3QgZmxvYXQqKiB2ZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFub3RoZXIsIGZsb2F0KiByZXN1bHRzICk7CisgICAgdmlydHVhbCB2b2lkIGNhbGNfcmJmKCBpbnQgdmVjX2NvdW50LCBpbnQgdmVjX3NpemUsIGNvbnN0IGZsb2F0KiogdmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhbm90aGVyLCBmbG9hdCogcmVzdWx0cyApOworICAgIHZpcnR1YWwgdm9pZCBjYWxjX3BvbHkoIGludCB2ZWNfY291bnQsIGludCB2ZWNfc2l6ZSwgY29uc3QgZmxvYXQqKiB2ZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhbm90aGVyLCBmbG9hdCogcmVzdWx0cyApOworICAgIHZpcnR1YWwgdm9pZCBjYWxjX3NpZ21vaWQoIGludCB2ZWNfY291bnQsIGludCB2ZWNfc2l6ZSwgY29uc3QgZmxvYXQqKiB2ZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhbm90aGVyLCBmbG9hdCogcmVzdWx0cyApOworfTsKKworCitzdHJ1Y3QgQ3ZTVk1LZXJuZWxSb3cKK3sKKyAgICBDdlNWTUtlcm5lbFJvdyogcHJldjsKKyAgICBDdlNWTUtlcm5lbFJvdyogbmV4dDsKKyAgICBmbG9hdCogZGF0YTsKK307CisKKworc3RydWN0IEN2U1ZNU29sdXRpb25JbmZvCit7CisgICAgZG91YmxlIG9iajsKKyAgICBkb3VibGUgcmhvOworICAgIGRvdWJsZSB1cHBlcl9ib3VuZF9wOworICAgIGRvdWJsZSB1cHBlcl9ib3VuZF9uOworICAgIGRvdWJsZSByOyAgIC8vIGZvciBTb2x2ZXJfTlUKK307CisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZTVk1Tb2x2ZXIKK3sKK3B1YmxpYzoKKyAgICB0eXBlZGVmIGJvb2wgKEN2U1ZNU29sdmVyOjoqU2VsZWN0V29ya2luZ1NldCkoIGludCYgaSwgaW50JiBqICk7CisgICAgdHlwZWRlZiBmbG9hdCogKEN2U1ZNU29sdmVyOjoqR2V0Um93KSggaW50IGksIGZsb2F0KiByb3csIGZsb2F0KiBkc3QsIGJvb2wgZXhpc3RlZCApOworICAgIHR5cGVkZWYgdm9pZCAoQ3ZTVk1Tb2x2ZXI6OipDYWxjUmhvKSggZG91YmxlJiByaG8sIGRvdWJsZSYgciApOworCisgICAgQ3ZTVk1Tb2x2ZXIoKTsKKworICAgIEN2U1ZNU29sdmVyKCBpbnQgY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywgc2NoYXIqIHksCisgICAgICAgICAgICAgICAgIGludCBhbHBoYV9jb3VudCwgZG91YmxlKiBhbHBoYSwgZG91YmxlIENwLCBkb3VibGUgQ24sCisgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTVk1LZXJuZWwqIGtlcm5lbCwgR2V0Um93IGdldF9yb3csCisgICAgICAgICAgICAgICAgIFNlbGVjdFdvcmtpbmdTZXQgc2VsZWN0X3dvcmtpbmdfc2V0LCBDYWxjUmhvIGNhbGNfcmhvICk7CisgICAgdmlydHVhbCBib29sIGNyZWF0ZSggaW50IGNvdW50LCBpbnQgdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIHNhbXBsZXMsIHNjaGFyKiB5LAorICAgICAgICAgICAgICAgICBpbnQgYWxwaGFfY291bnQsIGRvdWJsZSogYWxwaGEsIGRvdWJsZSBDcCwgZG91YmxlIENuLAorICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsIEN2U1ZNS2VybmVsKiBrZXJuZWwsIEdldFJvdyBnZXRfcm93LAorICAgICAgICAgICAgICAgICBTZWxlY3RXb3JraW5nU2V0IHNlbGVjdF93b3JraW5nX3NldCwgQ2FsY1JobyBjYWxjX3JobyApOworICAgIHZpcnR1YWwgfkN2U1ZNU29sdmVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKyAgICB2aXJ0dWFsIGJvb2wgc29sdmVfZ2VuZXJpYyggQ3ZTVk1Tb2x1dGlvbkluZm8mIHNpICk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc29sdmVfY19zdmMoIGludCBjb3VudCwgaW50IHZhcl9jb3VudCwgY29uc3QgZmxvYXQqKiBzYW1wbGVzLCBzY2hhciogeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBDcCwgZG91YmxlIENuLCBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNWTUtlcm5lbCoga2VybmVsLCBkb3VibGUqIGFscGhhLCBDdlNWTVNvbHV0aW9uSW5mbyYgc2kgKTsKKyAgICB2aXJ0dWFsIGJvb2wgc29sdmVfbnVfc3ZjKCBpbnQgY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywgc2NoYXIqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBDdlNWTUtlcm5lbCoga2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGEsIEN2U1ZNU29sdXRpb25JbmZvJiBzaSApOworICAgIHZpcnR1YWwgYm9vbCBzb2x2ZV9vbmVfY2xhc3MoIGludCBjb3VudCwgaW50IHZhcl9jb3VudCwgY29uc3QgZmxvYXQqKiBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTVk1LZXJuZWwqIGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIGFscGhhLCBDdlNWTVNvbHV0aW9uSW5mbyYgc2kgKTsKKworICAgIHZpcnR1YWwgYm9vbCBzb2x2ZV9lcHNfc3ZyKCBpbnQgY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywgY29uc3QgZmxvYXQqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSwgQ3ZTVk1LZXJuZWwqIGtlcm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBhbHBoYSwgQ3ZTVk1Tb2x1dGlvbkluZm8mIHNpICk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc29sdmVfbnVfc3ZyKCBpbnQgY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywgY29uc3QgZmxvYXQqIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlLCBDdlNWTUtlcm5lbCoga2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogYWxwaGEsIEN2U1ZNU29sdXRpb25JbmZvJiBzaSApOworCisgICAgdmlydHVhbCBmbG9hdCogZ2V0X3Jvd19iYXNlKCBpbnQgaSwgYm9vbCogX2V4aXN0ZWQgKTsKKyAgICB2aXJ0dWFsIGZsb2F0KiBnZXRfcm93KCBpbnQgaSwgZmxvYXQqIGRzdCApOworCisgICAgaW50IHNhbXBsZV9jb3VudDsKKyAgICBpbnQgdmFyX2NvdW50OworICAgIGludCBjYWNoZV9zaXplOworICAgIGludCBjYWNoZV9saW5lX3NpemU7CisgICAgY29uc3QgZmxvYXQqKiBzYW1wbGVzOworICAgIGNvbnN0IEN2U1ZNUGFyYW1zKiBwYXJhbXM7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlOworICAgIEN2U1ZNS2VybmVsUm93IGxydV9saXN0OworICAgIEN2U1ZNS2VybmVsUm93KiByb3dzOworCisgICAgaW50IGFscGhhX2NvdW50OworCisgICAgZG91YmxlKiBHOworICAgIGRvdWJsZSogYWxwaGE7CisKKyAgICAvLyAtMSAtIGxvd2VyIGJvdW5kLCAwIC0gZnJlZSwgMSAtIHVwcGVyIGJvdW5kCisgICAgc2NoYXIqIGFscGhhX3N0YXR1czsKKworICAgIHNjaGFyKiB5OworICAgIGRvdWJsZSogYjsKKyAgICBmbG9hdCogYnVmWzJdOworICAgIGRvdWJsZSBlcHM7CisgICAgaW50IG1heF9pdGVyOworICAgIGRvdWJsZSBDWzJdOyAgLy8gQ1swXSA9PSBDbiwgQ1sxXSA9PSBDcAorICAgIEN2U1ZNS2VybmVsKiBrZXJuZWw7CisKKyAgICBTZWxlY3RXb3JraW5nU2V0IHNlbGVjdF93b3JraW5nX3NldF9mdW5jOworICAgIENhbGNSaG8gY2FsY19yaG9fZnVuYzsKKyAgICBHZXRSb3cgZ2V0X3Jvd19mdW5jOworCisgICAgdmlydHVhbCBib29sIHNlbGVjdF93b3JraW5nX3NldCggaW50JiBpLCBpbnQmIGogKTsKKyAgICB2aXJ0dWFsIGJvb2wgc2VsZWN0X3dvcmtpbmdfc2V0X251X3N2bSggaW50JiBpLCBpbnQmIGogKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FsY19yaG8oIGRvdWJsZSYgcmhvLCBkb3VibGUmIHIgKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2FsY19yaG9fbnVfc3ZtKCBkb3VibGUmIHJobywgZG91YmxlJiByICk7CisKKyAgICB2aXJ0dWFsIGZsb2F0KiBnZXRfcm93X3N2YyggaW50IGksIGZsb2F0KiByb3csIGZsb2F0KiBkc3QsIGJvb2wgZXhpc3RlZCApOworICAgIHZpcnR1YWwgZmxvYXQqIGdldF9yb3dfb25lX2NsYXNzKCBpbnQgaSwgZmxvYXQqIHJvdywgZmxvYXQqIGRzdCwgYm9vbCBleGlzdGVkICk7CisgICAgdmlydHVhbCBmbG9hdCogZ2V0X3Jvd19zdnIoIGludCBpLCBmbG9hdCogcm93LCBmbG9hdCogZHN0LCBib29sIGV4aXN0ZWQgKTsKK307CisKKworc3RydWN0IEN2U1ZNRGVjaXNpb25GdW5jCit7CisgICAgZG91YmxlIHJobzsKKyAgICBpbnQgc3ZfY291bnQ7CisgICAgZG91YmxlKiBhbHBoYTsKKyAgICBpbnQqIHN2X2luZGV4OworfTsKKworCisvLyBTVk0gbW9kZWwKK2NsYXNzIENWX0VYUE9SVFMgQ3ZTVk0gOiBwdWJsaWMgQ3ZTdGF0TW9kZWwKK3sKK3B1YmxpYzoKKyAgICAvLyBTVk0gdHlwZQorICAgIGVudW0geyBDX1NWQz0xMDAsIE5VX1NWQz0xMDEsIE9ORV9DTEFTUz0xMDIsIEVQU19TVlI9MTAzLCBOVV9TVlI9MTA0IH07CisKKyAgICAvLyBTVk0ga2VybmVsIHR5cGUKKyAgICBlbnVtIHsgTElORUFSPTAsIFBPTFk9MSwgUkJGPTIsIFNJR01PSUQ9MyB9OworCisgICAgLy8gU1ZNIHBhcmFtcyB0eXBlCisgICAgZW51bSB7IEM9MCwgR0FNTUE9MSwgUD0yLCBOVT0zLCBDT0VGPTQsIERFR1JFRT01IH07CisKKyAgICBDdlNWTSgpOworICAgIHZpcnR1YWwgfkN2U1ZNKCk7CisKKyAgICBDdlNWTSggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF92YXJfaWR4PTAsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLAorICAgICAgICAgICBDdlNWTVBhcmFtcyBfcGFyYW1zPUN2U1ZNUGFyYW1zKCkgKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfdmFyX2lkeD0wLCBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHg9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U1ZNUGFyYW1zIF9wYXJhbXM9Q3ZTVk1QYXJhbXMoKSApOworICAgIHZpcnR1YWwgYm9vbCB0cmFpbl9hdXRvKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgICAgICBjb25zdCBDdk1hdCogX3Zhcl9pZHgsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwgQ3ZTVk1QYXJhbXMgX3BhcmFtcywKKyAgICAgICAgaW50IGtfZm9sZCA9IDEwLAorICAgICAgICBDdlBhcmFtR3JpZCBDX2dyaWQgICAgICA9IGdldF9kZWZhdWx0X2dyaWQoQ3ZTVk06OkMpLAorICAgICAgICBDdlBhcmFtR3JpZCBnYW1tYV9ncmlkICA9IGdldF9kZWZhdWx0X2dyaWQoQ3ZTVk06OkdBTU1BKSwKKyAgICAgICAgQ3ZQYXJhbUdyaWQgcF9ncmlkICAgICAgPSBnZXRfZGVmYXVsdF9ncmlkKEN2U1ZNOjpQKSwKKyAgICAgICAgQ3ZQYXJhbUdyaWQgbnVfZ3JpZCAgICAgPSBnZXRfZGVmYXVsdF9ncmlkKEN2U1ZNOjpOVSksCisgICAgICAgIEN2UGFyYW1HcmlkIGNvZWZfZ3JpZCAgID0gZ2V0X2RlZmF1bHRfZ3JpZChDdlNWTTo6Q09FRiksCisgICAgICAgIEN2UGFyYW1HcmlkIGRlZ3JlZV9ncmlkID0gZ2V0X2RlZmF1bHRfZ3JpZChDdlNWTTo6REVHUkVFKSApOworCisgICAgdmlydHVhbCBmbG9hdCBwcmVkaWN0KCBjb25zdCBDdk1hdCogX3NhbXBsZSApIGNvbnN0OworCisgICAgdmlydHVhbCBpbnQgZ2V0X3N1cHBvcnRfdmVjdG9yX2NvdW50KCkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBmbG9hdCogZ2V0X3N1cHBvcnRfdmVjdG9yKGludCBpKSBjb25zdDsKKyAgICB2aXJ0dWFsIEN2U1ZNUGFyYW1zIGdldF9wYXJhbXMoKSBjb25zdCB7IHJldHVybiBwYXJhbXM7IH07CisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CisKKyAgICBzdGF0aWMgQ3ZQYXJhbUdyaWQgZ2V0X2RlZmF1bHRfZ3JpZCggaW50IHBhcmFtX2lkICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUoIEN2RmlsZVN0b3JhZ2UqIHN0b3JhZ2UsIGNvbnN0IGNoYXIqIG5hbWUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZCggQ3ZGaWxlU3RvcmFnZSogc3RvcmFnZSwgQ3ZGaWxlTm9kZSogbm9kZSApOworICAgIGludCBnZXRfdmFyX2NvdW50KCkgY29uc3QgeyByZXR1cm4gdmFyX2lkeCA/IHZhcl9pZHgtPmNvbHMgOiB2YXJfYWxsOyB9CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgYm9vbCBzZXRfcGFyYW1zKCBjb25zdCBDdlNWTVBhcmFtcyYgX3BhcmFtcyApOworICAgIHZpcnR1YWwgYm9vbCB0cmFpbjEoIGludCBzYW1wbGVfY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogX3Jlc3BvbnNlcywgZG91YmxlIENwLCBkb3VibGUgQ24sCisgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsIGRvdWJsZSogYWxwaGEsIGRvdWJsZSYgcmhvICk7CisgICAgdmlydHVhbCBib29sIGRvX3RyYWluKCBpbnQgc3ZtX3R5cGUsIGludCBzYW1wbGVfY291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0Kiogc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsIGRvdWJsZSogYWxwaGEgKTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlX2tlcm5lbCgpOworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVfc29sdmVyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVfcGFyYW1zKCBDdkZpbGVTdG9yYWdlKiBmcyApOworICAgIHZpcnR1YWwgdm9pZCByZWFkX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKworICAgIEN2U1ZNUGFyYW1zIHBhcmFtczsKKyAgICBDdk1hdCogY2xhc3NfbGFiZWxzOworICAgIGludCB2YXJfYWxsOworICAgIGZsb2F0Kiogc3Y7CisgICAgaW50IHN2X3RvdGFsOworICAgIEN2TWF0KiB2YXJfaWR4OworICAgIEN2TWF0KiBjbGFzc193ZWlnaHRzOworICAgIEN2U1ZNRGVjaXNpb25GdW5jKiBkZWNpc2lvbl9mdW5jOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZTsKKworICAgIEN2U1ZNU29sdmVyKiBzb2x2ZXI7CisgICAgQ3ZTVk1LZXJuZWwqIGtlcm5lbDsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGF0aW9uIC0gTWF4aW1pemF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IENWX0VYUE9SVFMgQ3ZFTVBhcmFtcworeworICAgIEN2RU1QYXJhbXMoKSA6IG5jbHVzdGVycygxMCksIGNvdl9tYXRfdHlwZSgxLypDdkVNOjpDT1ZfTUFUX0RJQUdPTkFMKi8pLAorICAgICAgICBzdGFydF9zdGVwKDAvKkN2RU06OlNUQVJUX0FVVE9fU1RFUCovKSwgcHJvYnMoMCksIHdlaWdodHMoMCksIG1lYW5zKDApLCBjb3ZzKDApCisgICAgeworICAgICAgICB0ZXJtX2NyaXQ9Y3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0lURVIrQ1ZfVEVSTUNSSVRfRVBTLCAxMDAsIEZMVF9FUFNJTE9OICk7CisgICAgfQorCisgICAgQ3ZFTVBhcmFtcyggaW50IF9uY2x1c3RlcnMsIGludCBfY292X21hdF90eXBlPTEvKkN2RU06OkNPVl9NQVRfRElBR09OQUwqLywKKyAgICAgICAgICAgICAgICBpbnQgX3N0YXJ0X3N0ZXA9MC8qQ3ZFTTo6U1RBUlRfQVVUT19TVEVQKi8sCisgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgX3Rlcm1fY3JpdD1jdlRlcm1Dcml0ZXJpYShDVl9URVJNQ1JJVF9JVEVSK0NWX1RFUk1DUklUX0VQUywgMTAwLCBGTFRfRVBTSUxPTiksCisgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9wcm9icz0wLCBjb25zdCBDdk1hdCogX3dlaWdodHM9MCwgY29uc3QgQ3ZNYXQqIF9tZWFucz0wLCBjb25zdCBDdk1hdCoqIF9jb3ZzPTAgKSA6CisgICAgICAgICAgICAgICAgbmNsdXN0ZXJzKF9uY2x1c3RlcnMpLCBjb3ZfbWF0X3R5cGUoX2Nvdl9tYXRfdHlwZSksIHN0YXJ0X3N0ZXAoX3N0YXJ0X3N0ZXApLAorICAgICAgICAgICAgICAgIHByb2JzKF9wcm9icyksIHdlaWdodHMoX3dlaWdodHMpLCBtZWFucyhfbWVhbnMpLCBjb3ZzKF9jb3ZzKSwgdGVybV9jcml0KF90ZXJtX2NyaXQpCisgICAge30KKworICAgIGludCBuY2x1c3RlcnM7CisgICAgaW50IGNvdl9tYXRfdHlwZTsKKyAgICBpbnQgc3RhcnRfc3RlcDsKKyAgICBjb25zdCBDdk1hdCogcHJvYnM7CisgICAgY29uc3QgQ3ZNYXQqIHdlaWdodHM7CisgICAgY29uc3QgQ3ZNYXQqIG1lYW5zOworICAgIGNvbnN0IEN2TWF0KiogY292czsKKyAgICBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQ7Cit9OworCisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZFTSA6IHB1YmxpYyBDdlN0YXRNb2RlbAoreworcHVibGljOgorICAgIC8vIFR5cGUgb2YgY292YXJpYXRpb24gbWF0cmljZXMKKyAgICBlbnVtIHsgQ09WX01BVF9TUEhFUklDQUw9MCwgQ09WX01BVF9ESUFHT05BTD0xLCBDT1ZfTUFUX0dFTkVSSUM9MiB9OworCisgICAgLy8gVGhlIGluaXRpYWwgc3RlcAorICAgIGVudW0geyBTVEFSVF9FX1NURVA9MSwgU1RBUlRfTV9TVEVQPTIsIFNUQVJUX0FVVE9fU1RFUD0wIH07CisKKyAgICBDdkVNKCk7CisgICAgQ3ZFTSggY29uc3QgQ3ZNYXQqIHNhbXBsZXMsIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4PTAsCisgICAgICAgICAgQ3ZFTVBhcmFtcyBwYXJhbXM9Q3ZFTVBhcmFtcygpLCBDdk1hdCogbGFiZWxzPTAgKTsKKworICAgIHZpcnR1YWwgfkN2RU0oKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIHNhbXBsZXMsIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4PTAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkVNUGFyYW1zIHBhcmFtcz1DdkVNUGFyYW1zKCksIEN2TWF0KiBsYWJlbHM9MCApOworCisgICAgdmlydHVhbCBmbG9hdCBwcmVkaWN0KCBjb25zdCBDdk1hdCogc2FtcGxlLCBDdk1hdCogcHJvYnMgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKworICAgIGludCBnZXRfbmNsdXN0ZXJzKCkgY29uc3Q7CisgICAgY29uc3QgQ3ZNYXQqIGdldF9tZWFucygpIGNvbnN0OworICAgIGNvbnN0IEN2TWF0KiogZ2V0X2NvdnMoKSBjb25zdDsKKyAgICBjb25zdCBDdk1hdCogZ2V0X3dlaWdodHMoKSBjb25zdDsKKyAgICBjb25zdCBDdk1hdCogZ2V0X3Byb2JzKCkgY29uc3Q7CisKKyAgICBpbmxpbmUgZG91YmxlIGdldF9sb2dfbGlrZWxpaG9vZCAoKSBjb25zdCB7IHJldHVybiBsb2dfbGlrZWxpaG9vZDsgfTsKKworcHJvdGVjdGVkOgorCisgICAgdmlydHVhbCB2b2lkIHNldF9wYXJhbXMoIGNvbnN0IEN2RU1QYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZWZWN0b3JzJiB0cmFpbl9kYXRhICk7CisgICAgdmlydHVhbCB2b2lkIGluaXRfZW0oIGNvbnN0IEN2VmVjdG9ycyYgdHJhaW5fZGF0YSApOworICAgIHZpcnR1YWwgZG91YmxlIHJ1bl9lbSggY29uc3QgQ3ZWZWN0b3JzJiB0cmFpbl9kYXRhICk7CisgICAgdmlydHVhbCB2b2lkIGluaXRfYXV0byggY29uc3QgQ3ZWZWN0b3JzJiBzYW1wbGVzICk7CisgICAgdmlydHVhbCB2b2lkIGttZWFucyggY29uc3QgQ3ZWZWN0b3JzJiB0cmFpbl9kYXRhLCBpbnQgbmNsdXN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBsYWJlbHMsIEN2VGVybUNyaXRlcmlhIGNyaXRlcmlhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtZWFucyApOworICAgIEN2RU1QYXJhbXMgcGFyYW1zOworICAgIGRvdWJsZSBsb2dfbGlrZWxpaG9vZDsKKworICAgIEN2TWF0KiBtZWFuczsKKyAgICBDdk1hdCoqIGNvdnM7CisgICAgQ3ZNYXQqIHdlaWdodHM7CisgICAgQ3ZNYXQqIHByb2JzOworCisgICAgQ3ZNYXQqIGxvZ193ZWlnaHRfZGl2X2RldDsKKyAgICBDdk1hdCogaW52X2VpZ2VuX3ZhbHVlczsKKyAgICBDdk1hdCoqIGNvdl9yb3RhdGVfbWF0czsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjaXNpb24gVHJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IEN2UGFpcjMyczMyZgoreworICAgIGludCBpOworICAgIGZsb2F0IHZhbDsKK307CisKKworI2RlZmluZSBDVl9EVFJFRV9DQVRfRElSKGlkeCxzdWJzZXQpIFwKKyAgICAoMiooKHN1YnNldFsoaWR4KT4+NV0mKDEgPDwgKChpZHgpICYgMzEpKSk9PTApLTEpCisKK3N0cnVjdCBDdkRUcmVlU3BsaXQKK3sKKyAgICBpbnQgdmFyX2lkeDsKKyAgICBpbnQgaW52ZXJzZWQ7CisgICAgZmxvYXQgcXVhbGl0eTsKKyAgICBDdkRUcmVlU3BsaXQqIG5leHQ7CisgICAgdW5pb24KKyAgICB7CisgICAgICAgIGludCBzdWJzZXRbMl07CisgICAgICAgIHN0cnVjdAorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCBjOworICAgICAgICAgICAgaW50IHNwbGl0X3BvaW50OworICAgICAgICB9CisgICAgICAgIG9yZDsKKyAgICB9OworfTsKKworCitzdHJ1Y3QgQ3ZEVHJlZU5vZGUKK3sKKyAgICBpbnQgY2xhc3NfaWR4OworICAgIGludCBUbjsKKyAgICBkb3VibGUgdmFsdWU7CisKKyAgICBDdkRUcmVlTm9kZSogcGFyZW50OworICAgIEN2RFRyZWVOb2RlKiBsZWZ0OworICAgIEN2RFRyZWVOb2RlKiByaWdodDsKKworICAgIEN2RFRyZWVTcGxpdCogc3BsaXQ7CisKKyAgICBpbnQgc2FtcGxlX2NvdW50OworICAgIGludCBkZXB0aDsKKyAgICBpbnQqIG51bV92YWxpZDsKKyAgICBpbnQgb2Zmc2V0OworICAgIGludCBidWZfaWR4OworICAgIGRvdWJsZSBtYXhscjsKKworICAgIC8vIGdsb2JhbCBwcnVuaW5nIGRhdGEKKyAgICBpbnQgY29tcGxleGl0eTsKKyAgICBkb3VibGUgYWxwaGE7CisgICAgZG91YmxlIG5vZGVfcmlzaywgdHJlZV9yaXNrLCB0cmVlX2Vycm9yOworCisgICAgLy8gY3Jvc3MtdmFsaWRhdGlvbiBwcnVuaW5nIGRhdGEKKyAgICBpbnQqIGN2X1RuOworICAgIGRvdWJsZSogY3Zfbm9kZV9yaXNrOworICAgIGRvdWJsZSogY3Zfbm9kZV9lcnJvcjsKKworICAgIGludCBnZXRfbnVtX3ZhbGlkKGludCB2aSkgeyByZXR1cm4gbnVtX3ZhbGlkID8gbnVtX3ZhbGlkW3ZpXSA6IHNhbXBsZV9jb3VudDsgfQorICAgIHZvaWQgc2V0X251bV92YWxpZChpbnQgdmksIGludCBuKSB7IGlmKCBudW1fdmFsaWQgKSBudW1fdmFsaWRbdmldID0gbjsgfQorfTsKKworCitzdHJ1Y3QgQ1ZfRVhQT1JUUyBDdkRUcmVlUGFyYW1zCit7CisgICAgaW50ICAgbWF4X2NhdGVnb3JpZXM7CisgICAgaW50ICAgbWF4X2RlcHRoOworICAgIGludCAgIG1pbl9zYW1wbGVfY291bnQ7CisgICAgaW50ICAgY3ZfZm9sZHM7CisgICAgYm9vbCAgdXNlX3N1cnJvZ2F0ZXM7CisgICAgYm9vbCAgdXNlXzFzZV9ydWxlOworICAgIGJvb2wgIHRydW5jYXRlX3BydW5lZF90cmVlOworICAgIGZsb2F0IHJlZ3Jlc3Npb25fYWNjdXJhY3k7CisgICAgY29uc3QgZmxvYXQqIHByaW9yczsKKworICAgIEN2RFRyZWVQYXJhbXMoKSA6IG1heF9jYXRlZ29yaWVzKDEwKSwgbWF4X2RlcHRoKElOVF9NQVgpLCBtaW5fc2FtcGxlX2NvdW50KDEwKSwKKyAgICAgICAgY3ZfZm9sZHMoMTApLCB1c2Vfc3Vycm9nYXRlcyh0cnVlKSwgdXNlXzFzZV9ydWxlKHRydWUpLAorICAgICAgICB0cnVuY2F0ZV9wcnVuZWRfdHJlZSh0cnVlKSwgcmVncmVzc2lvbl9hY2N1cmFjeSgwLjAxZiksIHByaW9ycygwKQorICAgIHt9CisKKyAgICBDdkRUcmVlUGFyYW1zKCBpbnQgX21heF9kZXB0aCwgaW50IF9taW5fc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgIGZsb2F0IF9yZWdyZXNzaW9uX2FjY3VyYWN5LCBib29sIF91c2Vfc3Vycm9nYXRlcywKKyAgICAgICAgICAgICAgICAgICBpbnQgX21heF9jYXRlZ29yaWVzLCBpbnQgX2N2X2ZvbGRzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgX3VzZV8xc2VfcnVsZSwgYm9vbCBfdHJ1bmNhdGVfcHJ1bmVkX3RyZWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIF9wcmlvcnMgKSA6CisgICAgICAgIG1heF9jYXRlZ29yaWVzKF9tYXhfY2F0ZWdvcmllcyksIG1heF9kZXB0aChfbWF4X2RlcHRoKSwKKyAgICAgICAgbWluX3NhbXBsZV9jb3VudChfbWluX3NhbXBsZV9jb3VudCksIGN2X2ZvbGRzIChfY3ZfZm9sZHMpLAorICAgICAgICB1c2Vfc3Vycm9nYXRlcyhfdXNlX3N1cnJvZ2F0ZXMpLCB1c2VfMXNlX3J1bGUoX3VzZV8xc2VfcnVsZSksCisgICAgICAgIHRydW5jYXRlX3BydW5lZF90cmVlKF90cnVuY2F0ZV9wcnVuZWRfdHJlZSksCisgICAgICAgIHJlZ3Jlc3Npb25fYWNjdXJhY3koX3JlZ3Jlc3Npb25fYWNjdXJhY3kpLAorICAgICAgICBwcmlvcnMoX3ByaW9ycykKKyAgICB7fQorfTsKKworCitzdHJ1Y3QgQ1ZfRVhQT1JUUyBDdkRUcmVlVHJhaW5EYXRhCit7CisgICAgQ3ZEVHJlZVRyYWluRGF0YSgpOworICAgIEN2RFRyZWVUcmFpbkRhdGEoIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgaW50IF90ZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4PTAsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX21pc3NpbmdfbWFzaz0wLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2RFRyZWVQYXJhbXMmIF9wYXJhbXM9Q3ZEVHJlZVBhcmFtcygpLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX3NoYXJlZD1mYWxzZSwgYm9vbCBfYWRkX2xhYmVscz1mYWxzZSApOworICAgIHZpcnR1YWwgfkN2RFRyZWVUcmFpbkRhdGEoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRfZGF0YSggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4PTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLCBjb25zdCBDdk1hdCogX3Zhcl90eXBlPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrPTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2RFRyZWVQYXJhbXMmIF9wYXJhbXM9Q3ZEVHJlZVBhcmFtcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF9zaGFyZWQ9ZmFsc2UsIGJvb2wgX2FkZF9sYWJlbHM9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX3VwZGF0ZV9kYXRhPWZhbHNlICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0X3ZlY3RvcnMoIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCwKKyAgICAgICAgIGZsb2F0KiB2YWx1ZXMsIHVjaGFyKiBtaXNzaW5nLCBmbG9hdCogcmVzcG9uc2VzLCBib29sIGdldF9jbGFzc19pZHg9ZmFsc2UgKTsKKworICAgIHZpcnR1YWwgQ3ZEVHJlZU5vZGUqIHN1YnNhbXBsZV9kYXRhKCBjb25zdCBDdk1hdCogX3N1YnNhbXBsZV9pZHggKTsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9wYXJhbXMoIEN2RmlsZVN0b3JhZ2UqIGZzICk7CisgICAgdmlydHVhbCB2b2lkIHJlYWRfcGFyYW1zKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworCisgICAgLy8gcmVsZWFzZSBhbGwgdGhlIGRhdGEKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKworICAgIGludCBnZXRfbnVtX2NsYXNzZXMoKSBjb25zdDsKKyAgICBpbnQgZ2V0X3Zhcl90eXBlKGludCB2aSkgY29uc3Q7CisgICAgaW50IGdldF93b3JrX3Zhcl9jb3VudCgpIGNvbnN0OworCisgICAgdmlydHVhbCBpbnQqIGdldF9jbGFzc19sYWJlbHMoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCBmbG9hdCogZ2V0X29yZF9yZXNwb25zZXMoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCBpbnQqIGdldF9sYWJlbHMoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCBpbnQqIGdldF9jYXRfdmFyX2RhdGEoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIEN2UGFpcjMyczMyZiogZ2V0X29yZF92YXJfZGF0YSggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgaW50IGdldF9jaGlsZF9idWZfaWR4KCBDdkRUcmVlTm9kZSogbiApOworCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0X3BhcmFtcyggY29uc3QgQ3ZEVHJlZVBhcmFtcyYgcGFyYW1zICk7CisgICAgdmlydHVhbCBDdkRUcmVlTm9kZSogbmV3X25vZGUoIEN2RFRyZWVOb2RlKiBwYXJlbnQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VfaWR4LCBpbnQgb2Zmc2V0ICk7CisKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogbmV3X3NwbGl0X29yZCggaW50IHZpLCBmbG9hdCBjbXBfdmFsLAorICAgICAgICAgICAgICAgIGludCBzcGxpdF9wb2ludCwgaW50IGludmVyc2VkLCBmbG9hdCBxdWFsaXR5ICk7CisgICAgdmlydHVhbCBDdkRUcmVlU3BsaXQqIG5ld19zcGxpdF9jYXQoIGludCB2aSwgZmxvYXQgcXVhbGl0eSApOworICAgIHZpcnR1YWwgdm9pZCBmcmVlX25vZGVfZGF0YSggQ3ZEVHJlZU5vZGUqIG5vZGUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgZnJlZV90cmFpbl9kYXRhKCk7CisgICAgdmlydHVhbCB2b2lkIGZyZWVfbm9kZSggQ3ZEVHJlZU5vZGUqIG5vZGUgKTsKKworICAgIGludCBzYW1wbGVfY291bnQsIHZhcl9hbGwsIHZhcl9jb3VudCwgbWF4X2NfY291bnQ7CisgICAgaW50IG9yZF92YXJfY291bnQsIGNhdF92YXJfY291bnQ7CisgICAgYm9vbCBoYXZlX2xhYmVscywgaGF2ZV9wcmlvcnM7CisgICAgYm9vbCBpc19jbGFzc2lmaWVyOworCisgICAgaW50IGJ1Zl9jb3VudCwgYnVmX3NpemU7CisgICAgYm9vbCBzaGFyZWQ7CisKKyAgICBDdk1hdCogY2F0X2NvdW50OworICAgIEN2TWF0KiBjYXRfb2ZzOworICAgIEN2TWF0KiBjYXRfbWFwOworCisgICAgQ3ZNYXQqIGNvdW50czsKKyAgICBDdk1hdCogYnVmOworICAgIEN2TWF0KiBkaXJlY3Rpb247CisgICAgQ3ZNYXQqIHNwbGl0X2J1ZjsKKworICAgIEN2TWF0KiB2YXJfaWR4OworICAgIEN2TWF0KiB2YXJfdHlwZTsgLy8gaS10aCBlbGVtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgIC8vICAgazwwICAtIG9yZGVyZWQKKyAgICAgICAgICAgICAgICAgICAgIC8vICAgaz49MCAtIGNhdGVnb3JpY2FsLCBzZWUgay10aCBlbGVtZW50IG9mIGNhdF8qIGFycmF5cworICAgIEN2TWF0KiBwcmlvcnM7CisgICAgQ3ZNYXQqIHByaW9yc19tdWx0OworCisgICAgQ3ZEVHJlZVBhcmFtcyBwYXJhbXM7CisKKyAgICBDdk1lbVN0b3JhZ2UqIHRyZWVfc3RvcmFnZTsKKyAgICBDdk1lbVN0b3JhZ2UqIHRlbXBfc3RvcmFnZTsKKworICAgIEN2RFRyZWVOb2RlKiBkYXRhX3Jvb3Q7CisKKyAgICBDdlNldCogbm9kZV9oZWFwOworICAgIEN2U2V0KiBzcGxpdF9oZWFwOworICAgIEN2U2V0KiBjdl9oZWFwOworICAgIEN2U2V0KiBudl9oZWFwOworCisgICAgQ3ZSTkcgcm5nOworfTsKKworCitjbGFzcyBDVl9FWFBPUlRTIEN2RFRyZWUgOiBwdWJsaWMgQ3ZTdGF0TW9kZWwKK3sKK3B1YmxpYzoKKyAgICBDdkRUcmVlKCk7CisgICAgdmlydHVhbCB+Q3ZEVHJlZSgpOworCisgICAgdmlydHVhbCBib29sIHRyYWluKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGludCBfdGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4PTAsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHg9MCwgY29uc3QgQ3ZNYXQqIF92YXJfdHlwZT0wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9taXNzaW5nX21hc2s9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2RFRyZWVQYXJhbXMgcGFyYW1zPUN2RFRyZWVQYXJhbXMoKSApOworCisgICAgdmlydHVhbCBib29sIHRyYWluKCBDdkRUcmVlVHJhaW5EYXRhKiBfdHJhaW5fZGF0YSwgY29uc3QgQ3ZNYXQqIF9zdWJzYW1wbGVfaWR4ICk7CisKKyAgICB2aXJ0dWFsIEN2RFRyZWVOb2RlKiBwcmVkaWN0KCBjb25zdCBDdk1hdCogX3NhbXBsZSwgY29uc3QgQ3ZNYXQqIF9taXNzaW5nX2RhdGFfbWFzaz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlcHJvY2Vzc2VkX2lucHV0PWZhbHNlICkgY29uc3Q7CisgICAgdmlydHVhbCBjb25zdCBDdk1hdCogZ2V0X3Zhcl9pbXBvcnRhbmNlKCk7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lICk7CisKKyAgICAvLyBzcGVjaWFsIHJlYWQgJiB3cml0ZSBtZXRob2RzIGZvciB0cmVlcyBpbiB0aGUgdHJlZSBlbnNlbWJsZXMKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIEN2RFRyZWVUcmFpbkRhdGEqIGRhdGEgKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUoIEN2RmlsZVN0b3JhZ2UqIGZzICk7CisKKyAgICBjb25zdCBDdkRUcmVlTm9kZSogZ2V0X3Jvb3QoKSBjb25zdDsKKyAgICBpbnQgZ2V0X3BydW5lZF90cmVlX2lkeCgpIGNvbnN0OworICAgIEN2RFRyZWVUcmFpbkRhdGEqIGdldF9kYXRhKCk7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgYm9vbCBkb190cmFpbiggY29uc3QgQ3ZNYXQqIF9zdWJzYW1wbGVfaWR4ICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdHJ5X3NwbGl0X25vZGUoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCB2b2lkIHNwbGl0X25vZGVfZGF0YSggQ3ZEVHJlZU5vZGUqIG4gKTsKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogZmluZF9iZXN0X3NwbGl0KCBDdkRUcmVlTm9kZSogbiApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiBmaW5kX3NwbGl0X29yZF9jbGFzcyggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiBmaW5kX3NwbGl0X2NhdF9jbGFzcyggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiBmaW5kX3NwbGl0X29yZF9yZWcoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogZmluZF9zcGxpdF9jYXRfcmVnKCBDdkRUcmVlTm9kZSogbiwgaW50IHZpICk7CisgICAgdmlydHVhbCBDdkRUcmVlU3BsaXQqIGZpbmRfc3Vycm9nYXRlX3NwbGl0X29yZCggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiBmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9jYXQoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBjYWxjX25vZGVfZGlyKCBDdkRUcmVlTm9kZSogbm9kZSApOworICAgIHZpcnR1YWwgdm9pZCBjb21wbGV0ZV9ub2RlX2RpciggQ3ZEVHJlZU5vZGUqIG5vZGUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgY2x1c3Rlcl9jYXRlZ29yaWVzKCBjb25zdCBpbnQqIHZlY3RvcnMsIGludCB2ZWN0b3JfY291bnQsCisgICAgICAgIGludCB2YXJfY291bnQsIGludCogc3VtcywgaW50IGssIGludCogY2x1c3Rlcl9sYWJlbHMgKTsKKworICAgIHZpcnR1YWwgdm9pZCBjYWxjX25vZGVfdmFsdWUoIEN2RFRyZWVOb2RlKiBub2RlICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcHJ1bmVfY3YoKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSB1cGRhdGVfdHJlZV9ybmMoIGludCBULCBpbnQgZm9sZCApOworICAgIHZpcnR1YWwgaW50IGN1dF90cmVlKCBpbnQgVCwgaW50IGZvbGQsIGRvdWJsZSBtaW5fYWxwaGEgKTsKKyAgICB2aXJ0dWFsIHZvaWQgZnJlZV9wcnVuZV9kYXRhKGJvb2wgY3V0X3RyZWUpOworICAgIHZpcnR1YWwgdm9pZCBmcmVlX3RyZWUoKTsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9ub2RlKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZEVHJlZU5vZGUqIG5vZGUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVfc3BsaXQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkRUcmVlU3BsaXQqIHNwbGl0ICk7CisgICAgdmlydHVhbCBDdkRUcmVlTm9kZSogcmVhZF9ub2RlKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSwgQ3ZEVHJlZU5vZGUqIHBhcmVudCApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiByZWFkX3NwbGl0KCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV90cmVlX25vZGVzKCBDdkZpbGVTdG9yYWdlKiBmcyApOworICAgIHZpcnR1YWwgdm9pZCByZWFkX3RyZWVfbm9kZXMoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlICk7CisKKyAgICBDdkRUcmVlTm9kZSogcm9vdDsKKworICAgIGludCBwcnVuZWRfdHJlZV9pZHg7CisgICAgQ3ZNYXQqIHZhcl9pbXBvcnRhbmNlOworCisgICAgQ3ZEVHJlZVRyYWluRGF0YSogZGF0YTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYW5kb20gVHJlZXMgQ2xhc3NpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjbGFzcyBDdlJUcmVlczsKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdkZvcmVzdFRyZWU6IHB1YmxpYyBDdkRUcmVlCit7CitwdWJsaWM6CisgICAgQ3ZGb3Jlc3RUcmVlKCk7CisgICAgdmlydHVhbCB+Q3ZGb3Jlc3RUcmVlKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgdHJhaW4oIEN2RFRyZWVUcmFpbkRhdGEqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3N1YnNhbXBsZV9pZHgsIEN2UlRyZWVzKiBmb3Jlc3QgKTsKKworICAgIHZpcnR1YWwgaW50IGdldF92YXJfY291bnQoKSBjb25zdCB7cmV0dXJuIGRhdGEgPyBkYXRhLT52YXJfY291bnQgOiAwO30KKyAgICB2aXJ0dWFsIHZvaWQgcmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUsIEN2UlRyZWVzKiBmb3Jlc3QsIEN2RFRyZWVUcmFpbkRhdGEqIF9kYXRhICk7CisKKyAgICAvKiBkdW1teSBtZXRob2RzIHRvIGF2b2lkIHdhcm5pbmdzOiBCRUdJTiAqLworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2TWF0KiBfdmFyX2lkeD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrPTAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkRUcmVlUGFyYW1zIHBhcmFtcz1DdkRUcmVlUGFyYW1zKCkgKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggQ3ZEVHJlZVRyYWluRGF0YSogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZEVHJlZVRyYWluRGF0YSogZGF0YSApOworICAgIC8qIGR1bW15IG1ldGhvZHMgdG8gYXZvaWQgd2FybmluZ3M6IEVORCAqLworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBDdkRUcmVlU3BsaXQqIGZpbmRfYmVzdF9zcGxpdCggQ3ZEVHJlZU5vZGUqIG4gKTsKKyAgICBDdlJUcmVlcyogZm9yZXN0OworfTsKKworCitzdHJ1Y3QgQ1ZfRVhQT1JUUyBDdlJUUGFyYW1zIDogcHVibGljIEN2RFRyZWVQYXJhbXMKK3sKKyAgICAvL1BhcmFtZXRlcnMgZm9yIHRoZSBmb3Jlc3QKKyAgICBib29sIGNhbGNfdmFyX2ltcG9ydGFuY2U7IC8vIHRydWUgPD0+IFJGIHByb2Nlc3NlcyB2YXJpYWJsZSBpbXBvcnRhbmNlCisgICAgaW50IG5hY3RpdmVfdmFyczsKKyAgICBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQ7CisKKyAgICBDdlJUUGFyYW1zKCkgOiBDdkRUcmVlUGFyYW1zKCA1LCAxMCwgMCwgZmFsc2UsIDEwLCAwLCBmYWxzZSwgZmFsc2UsIDAgKSwKKyAgICAgICAgY2FsY192YXJfaW1wb3J0YW5jZShmYWxzZSksIG5hY3RpdmVfdmFycygwKQorICAgIHsKKyAgICAgICAgdGVybV9jcml0ID0gY3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0lURVIrQ1ZfVEVSTUNSSVRfRVBTLCA1MCwgMC4xICk7CisgICAgfQorCisgICAgQ3ZSVFBhcmFtcyggaW50IF9tYXhfZGVwdGgsIGludCBfbWluX3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICBmbG9hdCBfcmVncmVzc2lvbl9hY2N1cmFjeSwgYm9vbCBfdXNlX3N1cnJvZ2F0ZXMsCisgICAgICAgICAgICAgICAgaW50IF9tYXhfY2F0ZWdvcmllcywgY29uc3QgZmxvYXQqIF9wcmlvcnMsIGJvb2wgX2NhbGNfdmFyX2ltcG9ydGFuY2UsCisgICAgICAgICAgICAgICAgaW50IF9uYWN0aXZlX3ZhcnMsIGludCBtYXhfbnVtX29mX3RyZWVzX2luX3RoZV9mb3Jlc3QsCisgICAgICAgICAgICAgICAgZmxvYXQgZm9yZXN0X2FjY3VyYWN5LCBpbnQgdGVybWNyaXRfdHlwZSApIDoKKyAgICAgICAgQ3ZEVHJlZVBhcmFtcyggX21heF9kZXB0aCwgX21pbl9zYW1wbGVfY291bnQsIF9yZWdyZXNzaW9uX2FjY3VyYWN5LAorICAgICAgICAgICAgICAgICAgICAgICBfdXNlX3N1cnJvZ2F0ZXMsIF9tYXhfY2F0ZWdvcmllcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBfcHJpb3JzICksCisgICAgICAgIGNhbGNfdmFyX2ltcG9ydGFuY2UoX2NhbGNfdmFyX2ltcG9ydGFuY2UpLAorICAgICAgICBuYWN0aXZlX3ZhcnMoX25hY3RpdmVfdmFycykKKyAgICB7CisgICAgICAgIHRlcm1fY3JpdCA9IGN2VGVybUNyaXRlcmlhKHRlcm1jcml0X3R5cGUsCisgICAgICAgICAgICBtYXhfbnVtX29mX3RyZWVzX2luX3RoZV9mb3Jlc3QsIGZvcmVzdF9hY2N1cmFjeSk7CisgICAgfQorfTsKKworCitjbGFzcyBDVl9FWFBPUlRTIEN2UlRyZWVzIDogcHVibGljIEN2U3RhdE1vZGVsCit7CitwdWJsaWM6CisgICAgQ3ZSVHJlZXMoKTsKKyAgICB2aXJ0dWFsIH5DdlJUcmVlcygpOworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2TWF0KiBfdmFyX2lkeD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrPTAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdlJUUGFyYW1zIHBhcmFtcz1DdlJUUGFyYW1zKCkgKTsKKyAgICB2aXJ0dWFsIGZsb2F0IHByZWRpY3QoIGNvbnN0IEN2TWF0KiBzYW1wbGUsIGNvbnN0IEN2TWF0KiBtaXNzaW5nID0gMCApIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpOworCisgICAgdmlydHVhbCBjb25zdCBDdk1hdCogZ2V0X3Zhcl9pbXBvcnRhbmNlKCk7CisgICAgdmlydHVhbCBmbG9hdCBnZXRfcHJveGltaXR5KCBjb25zdCBDdk1hdCogc2FtcGxlMSwgY29uc3QgQ3ZNYXQqIHNhbXBsZTIsCisgICAgICAgIGNvbnN0IEN2TWF0KiBtaXNzaW5nMSA9IDAsIGNvbnN0IEN2TWF0KiBtaXNzaW5nMiA9IDAgKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworICAgIHZpcnR1YWwgdm9pZCB3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUgKTsKKworICAgIEN2TWF0KiBnZXRfYWN0aXZlX3Zhcl9tYXNrKCk7CisgICAgQ3ZSTkcqIGdldF9ybmcoKTsKKworICAgIGludCBnZXRfdHJlZV9jb3VudCgpIGNvbnN0OworICAgIEN2Rm9yZXN0VHJlZSogZ2V0X3RyZWUoaW50IGkpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sIGdyb3dfZm9yZXN0KCBjb25zdCBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQgKTsKKworICAgIC8vIGFycmF5IG9mIHRoZSB0cmVlcyBvZiB0aGUgZm9yZXN0CisgICAgQ3ZGb3Jlc3RUcmVlKiogdHJlZXM7CisgICAgQ3ZEVHJlZVRyYWluRGF0YSogZGF0YTsKKyAgICBpbnQgbnRyZWVzOworICAgIGludCBuY2xhc3NlczsKKyAgICBkb3VibGUgb29iX2Vycm9yOworICAgIEN2TWF0KiB2YXJfaW1wb3J0YW5jZTsKKyAgICBpbnQgbnNhbXBsZXM7CisKKyAgICBDdlJORyBybmc7CisgICAgQ3ZNYXQqIGFjdGl2ZV92YXJfbWFzazsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29zdGVkIHRyZWUgY2xhc3NpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgQ1ZfRVhQT1JUUyBDdkJvb3N0UGFyYW1zIDogcHVibGljIEN2RFRyZWVQYXJhbXMKK3sKKyAgICBpbnQgYm9vc3RfdHlwZTsKKyAgICBpbnQgd2Vha19jb3VudDsKKyAgICBpbnQgc3BsaXRfY3JpdGVyaWE7CisgICAgZG91YmxlIHdlaWdodF90cmltX3JhdGU7CisKKyAgICBDdkJvb3N0UGFyYW1zKCk7CisgICAgQ3ZCb29zdFBhcmFtcyggaW50IGJvb3N0X3R5cGUsIGludCB3ZWFrX2NvdW50LCBkb3VibGUgd2VpZ2h0X3RyaW1fcmF0ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2RlcHRoLCBib29sIHVzZV9zdXJyb2dhdGVzLCBjb25zdCBmbG9hdCogcHJpb3JzICk7Cit9OworCisKK2NsYXNzIEN2Qm9vc3Q7CisKK2NsYXNzIENWX0VYUE9SVFMgQ3ZCb29zdFRyZWU6IHB1YmxpYyBDdkRUcmVlCit7CitwdWJsaWM6CisgICAgQ3ZCb29zdFRyZWUoKTsKKyAgICB2aXJ0dWFsIH5DdkJvb3N0VHJlZSgpOworCisgICAgdmlydHVhbCBib29sIHRyYWluKCBDdkRUcmVlVHJhaW5EYXRhKiBfdHJhaW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBzdWJzYW1wbGVfaWR4LCBDdkJvb3N0KiBlbnNlbWJsZSApOworCisgICAgdmlydHVhbCB2b2lkIHNjYWxlKCBkb3VibGUgcyApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZCb29zdCogZW5zZW1ibGUsIEN2RFRyZWVUcmFpbkRhdGEqIF9kYXRhICk7CisgICAgdmlydHVhbCB2b2lkIGNsZWFyKCk7CisKKyAgICAvKiBkdW1teSBtZXRob2RzIHRvIGF2b2lkIHdhcm5pbmdzOiBCRUdJTiAqLworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2TWF0KiBfdmFyX2lkeD0wLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrPTAsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkRUcmVlUGFyYW1zIHBhcmFtcz1DdkRUcmVlUGFyYW1zKCkgKTsKKworICAgIHZpcnR1YWwgYm9vbCB0cmFpbiggQ3ZEVHJlZVRyYWluRGF0YSogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZEVHJlZVRyYWluRGF0YSogZGF0YSApOworICAgIC8qIGR1bW15IG1ldGhvZHMgdG8gYXZvaWQgd2FybmluZ3M6IEVORCAqLworCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIHZvaWQgdHJ5X3NwbGl0X25vZGUoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCBDdkRUcmVlU3BsaXQqIGZpbmRfc3Vycm9nYXRlX3NwbGl0X29yZCggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgQ3ZEVHJlZVNwbGl0KiBmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9jYXQoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogZmluZF9zcGxpdF9vcmRfY2xhc3MoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogZmluZF9zcGxpdF9jYXRfY2xhc3MoIEN2RFRyZWVOb2RlKiBuLCBpbnQgdmkgKTsKKyAgICB2aXJ0dWFsIEN2RFRyZWVTcGxpdCogZmluZF9zcGxpdF9vcmRfcmVnKCBDdkRUcmVlTm9kZSogbiwgaW50IHZpICk7CisgICAgdmlydHVhbCBDdkRUcmVlU3BsaXQqIGZpbmRfc3BsaXRfY2F0X3JlZyggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApOworICAgIHZpcnR1YWwgdm9pZCBjYWxjX25vZGVfdmFsdWUoIEN2RFRyZWVOb2RlKiBuICk7CisgICAgdmlydHVhbCBkb3VibGUgY2FsY19ub2RlX2RpciggQ3ZEVHJlZU5vZGUqIG4gKTsKKworICAgIEN2Qm9vc3QqIGVuc2VtYmxlOworfTsKKworCitjbGFzcyBDVl9FWFBPUlRTIEN2Qm9vc3QgOiBwdWJsaWMgQ3ZTdGF0TW9kZWwKK3sKK3B1YmxpYzoKKyAgICAvLyBCb29zdGluZyB0eXBlCisgICAgZW51bSB7IERJU0NSRVRFPTAsIFJFQUw9MSwgTE9HSVQ9MiwgR0VOVExFPTMgfTsKKworICAgIC8vIFNwbGl0dGluZyBjcml0ZXJpYQorICAgIGVudW0geyBERUZBVUxUPTAsIEdJTkk9MSwgTUlTQ0xBU1M9MywgU1FFUlI9NCB9OworCisgICAgQ3ZCb29zdCgpOworICAgIHZpcnR1YWwgfkN2Qm9vc3QoKTsKKworICAgIEN2Qm9vc3QoIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgaW50IF90ZmxhZywKKyAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4PTAsCisgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4PTAsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGU9MCwKKyAgICAgICAgICAgICBjb25zdCBDdk1hdCogX21pc3NpbmdfbWFzaz0wLAorICAgICAgICAgICAgIEN2Qm9vc3RQYXJhbXMgcGFyYW1zPUN2Qm9vc3RQYXJhbXMoKSApOworCisgICAgdmlydHVhbCBib29sIHRyYWluKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGludCBfdGZsYWcsCisgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2TWF0KiBfdmFyX2lkeD0wLAorICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLCBjb25zdCBDdk1hdCogX3Zhcl90eXBlPTAsCisgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9taXNzaW5nX21hc2s9MCwKKyAgICAgICAgICAgICBDdkJvb3N0UGFyYW1zIHBhcmFtcz1DdkJvb3N0UGFyYW1zKCksCisgICAgICAgICAgICAgYm9vbCB1cGRhdGU9ZmFsc2UgKTsKKworICAgIHZpcnR1YWwgZmxvYXQgcHJlZGljdCggY29uc3QgQ3ZNYXQqIF9zYW1wbGUsIGNvbnN0IEN2TWF0KiBfbWlzc2luZz0wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHdlYWtfcmVzcG9uc2VzPTAsIEN2U2xpY2Ugc2xpY2U9Q1ZfV0hPTEVfU0VRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByYXdfbW9kZT1mYWxzZSApIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHBydW5lKCBDdlNsaWNlIHNsaWNlICk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKTsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZSggQ3ZGaWxlU3RvcmFnZSogc3RvcmFnZSwgY29uc3QgY2hhciogbmFtZSApOworICAgIHZpcnR1YWwgdm9pZCByZWFkKCBDdkZpbGVTdG9yYWdlKiBzdG9yYWdlLCBDdkZpbGVOb2RlKiBub2RlICk7CisKKyAgICBDdlNlcSogZ2V0X3dlYWtfcHJlZGljdG9ycygpOworCisgICAgQ3ZNYXQqIGdldF93ZWlnaHRzKCk7CisgICAgQ3ZNYXQqIGdldF9zdWJ0cmVlX3dlaWdodHMoKTsKKyAgICBDdk1hdCogZ2V0X3dlYWtfcmVzcG9uc2UoKTsKKyAgICBjb25zdCBDdkJvb3N0UGFyYW1zJiBnZXRfcGFyYW1zKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgYm9vbCBzZXRfcGFyYW1zKCBjb25zdCBDdkJvb3N0UGFyYW1zJiBfcGFyYW1zICk7CisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZV93ZWlnaHRzKCBDdkJvb3N0VHJlZSogdHJlZSApOworICAgIHZpcnR1YWwgdm9pZCB0cmltX3dlaWdodHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGVfcGFyYW1zKCBDdkZpbGVTdG9yYWdlKiBmcyApOworICAgIHZpcnR1YWwgdm9pZCByZWFkX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKworICAgIEN2RFRyZWVUcmFpbkRhdGEqIGRhdGE7CisgICAgQ3ZCb29zdFBhcmFtcyBwYXJhbXM7CisgICAgQ3ZTZXEqIHdlYWs7CisKKyAgICBDdk1hdCogb3JpZ19yZXNwb25zZTsKKyAgICBDdk1hdCogc3VtX3Jlc3BvbnNlOworICAgIEN2TWF0KiB3ZWFrX2V2YWw7CisgICAgQ3ZNYXQqIHN1YnNhbXBsZV9tYXNrOworICAgIEN2TWF0KiB3ZWlnaHRzOworICAgIEN2TWF0KiBzdWJ0cmVlX3dlaWdodHM7CisgICAgYm9vbCBoYXZlX3N1YnNhbXBsZTsKK307CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZpY2lhbCBOZXVyYWwgTmV0d29ya3MgKEFOTikgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNdWx0aS1MYXllciBQZXJjZXB0cm9ucyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RydWN0IENWX0VYUE9SVFMgQ3ZBTk5fTUxQX1RyYWluUGFyYW1zCit7CisgICAgQ3ZBTk5fTUxQX1RyYWluUGFyYW1zKCk7CisgICAgQ3ZBTk5fTUxQX1RyYWluUGFyYW1zKCBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQsIGludCB0cmFpbl9tZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcGFyYW0xLCBkb3VibGUgcGFyYW0yPTAgKTsKKyAgICB+Q3ZBTk5fTUxQX1RyYWluUGFyYW1zKCk7CisKKyAgICBlbnVtIHsgQkFDS1BST1A9MCwgUlBST1A9MSB9OworCisgICAgQ3ZUZXJtQ3JpdGVyaWEgdGVybV9jcml0OworICAgIGludCB0cmFpbl9tZXRob2Q7CisKKyAgICAvLyBiYWNrcHJvcGFnYXRpb24gcGFyYW1ldGVycworICAgIGRvdWJsZSBicF9kd19zY2FsZSwgYnBfbW9tZW50X3NjYWxlOworCisgICAgLy8gcnByb3AgcGFyYW1ldGVycworICAgIGRvdWJsZSBycF9kdzAsIHJwX2R3X3BsdXMsIHJwX2R3X21pbnVzLCBycF9kd19taW4sIHJwX2R3X21heDsKK307CisKKworY2xhc3MgQ1ZfRVhQT1JUUyBDdkFOTl9NTFAgOiBwdWJsaWMgQ3ZTdGF0TW9kZWwKK3sKK3B1YmxpYzoKKyAgICBDdkFOTl9NTFAoKTsKKyAgICBDdkFOTl9NTFAoIGNvbnN0IEN2TWF0KiBfbGF5ZXJfc2l6ZXMsCisgICAgICAgICAgICAgICBpbnQgX2FjdGl2X2Z1bmM9U0lHTU9JRF9TWU0sCisgICAgICAgICAgICAgICBkb3VibGUgX2ZfcGFyYW0xPTAsIGRvdWJsZSBfZl9wYXJhbTI9MCApOworCisgICAgdmlydHVhbCB+Q3ZBTk5fTUxQKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlKCBjb25zdCBDdk1hdCogX2xheWVyX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfYWN0aXZfZnVuYz1TSUdNT0lEX1NZTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX2ZfcGFyYW0xPTAsIGRvdWJsZSBfZl9wYXJhbTI9MCApOworCisgICAgdmlydHVhbCBpbnQgdHJhaW4oIGNvbnN0IEN2TWF0KiBfaW5wdXRzLCBjb25zdCBDdk1hdCogX291dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX3dlaWdodHMsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeD0wLAorICAgICAgICAgICAgICAgICAgICAgICBDdkFOTl9NTFBfVHJhaW5QYXJhbXMgX3BhcmFtcyA9IEN2QU5OX01MUF9UcmFpblBhcmFtcygpLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3M9MCApOworICAgIHZpcnR1YWwgZmxvYXQgcHJlZGljdCggY29uc3QgQ3ZNYXQqIF9pbnB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogX291dHB1dHMgKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpOworCisgICAgLy8gcG9zc2libGUgYWN0aXZhdGlvbiBmdW5jdGlvbnMKKyAgICBlbnVtIHsgSURFTlRJVFkgPSAwLCBTSUdNT0lEX1NZTSA9IDEsIEdBVVNTSUFOID0gMiB9OworCisgICAgLy8gYXZhaWxhYmxlIHRyYWluaW5nIGZsYWdzCisgICAgZW51bSB7IFVQREFURV9XRUlHSFRTID0gMSwgTk9fSU5QVVRfU0NBTEUgPSAyLCBOT19PVVRQVVRfU0NBTEUgPSA0IH07CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKTsKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUoIEN2RmlsZVN0b3JhZ2UqIHN0b3JhZ2UsIGNvbnN0IGNoYXIqIG5hbWUgKTsKKworICAgIGludCBnZXRfbGF5ZXJfY291bnQoKSB7IHJldHVybiBsYXllcl9zaXplcyA/IGxheWVyX3NpemVzLT5jb2xzIDogMDsgfQorICAgIGNvbnN0IEN2TWF0KiBnZXRfbGF5ZXJfc2l6ZXMoKSB7IHJldHVybiBsYXllcl9zaXplczsgfQorICAgIGRvdWJsZSogZ2V0X3dlaWdodHMoaW50IGxheWVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGxheWVyX3NpemVzICYmIHdlaWdodHMgJiYKKyAgICAgICAgICAgICh1bnNpZ25lZClsYXllciA8PSAodW5zaWduZWQpbGF5ZXJfc2l6ZXMtPmNvbHMgPyB3ZWlnaHRzW2xheWVyXSA6IDA7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICB2aXJ0dWFsIGJvb2wgcHJlcGFyZV90b190cmFpbiggY29uc3QgQ3ZNYXQqIF9pbnB1dHMsIGNvbnN0IEN2TWF0KiBfb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX3dlaWdodHMsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwKKyAgICAgICAgICAgIEN2VmVjdG9ycyogX2l2ZWNzLCBDdlZlY3RvcnMqIF9vdmVjcywgZG91YmxlKiogX3N3LCBpbnQgX2ZsYWdzICk7CisKKyAgICAvLyBzZXF1ZW50aWFsIHJhbmRvbSBiYWNrcHJvcGFnYXRpb24KKyAgICB2aXJ0dWFsIGludCB0cmFpbl9iYWNrcHJvcCggQ3ZWZWN0b3JzIF9pdmVjcywgQ3ZWZWN0b3JzIF9vdmVjcywgY29uc3QgZG91YmxlKiBfc3cgKTsKKworICAgIC8vIFJQUk9QIGFsZ29yaXRobQorICAgIHZpcnR1YWwgaW50IHRyYWluX3Jwcm9wKCBDdlZlY3RvcnMgX2l2ZWNzLCBDdlZlY3RvcnMgX292ZWNzLCBjb25zdCBkb3VibGUqIF9zdyApOworCisgICAgdmlydHVhbCB2b2lkIGNhbGNfYWN0aXZfZnVuYyggQ3ZNYXQqIHhmLCBjb25zdCBkb3VibGUqIGJpYXMgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgY2FsY19hY3Rpdl9mdW5jX2Rlcml2KCBDdk1hdCogeGYsIEN2TWF0KiBkZXJpdiwgY29uc3QgZG91YmxlKiBiaWFzICkgY29uc3Q7CisgICAgdmlydHVhbCB2b2lkIHNldF9hY3Rpdl9mdW5jKCBpbnQgX2FjdGl2X2Z1bmM9U0lHTU9JRF9TWU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgX2ZfcGFyYW0xPTAsIGRvdWJsZSBfZl9wYXJhbTI9MCApOworICAgIHZpcnR1YWwgdm9pZCBpbml0X3dlaWdodHMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2NhbGVfaW5wdXQoIGNvbnN0IEN2TWF0KiBfc3JjLCBDdk1hdCogX2RzdCApIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBzY2FsZV9vdXRwdXQoIGNvbnN0IEN2TWF0KiBfc3JjLCBDdk1hdCogX2RzdCApIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBjYWxjX2lucHV0X3NjYWxlKCBjb25zdCBDdlZlY3RvcnMqIHZlY3MsIGludCBmbGFncyApOworICAgIHZpcnR1YWwgdm9pZCBjYWxjX291dHB1dF9zY2FsZSggY29uc3QgQ3ZWZWN0b3JzKiB2ZWNzLCBpbnQgZmxhZ3MgKTsKKworICAgIHZpcnR1YWwgdm9pZCB3cml0ZV9wYXJhbXMoIEN2RmlsZVN0b3JhZ2UqIGZzICk7CisgICAgdmlydHVhbCB2b2lkIHJlYWRfcGFyYW1zKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApOworCisgICAgQ3ZNYXQqIGxheWVyX3NpemVzOworICAgIEN2TWF0KiB3YnVmOworICAgIEN2TWF0KiBzYW1wbGVfd2VpZ2h0czsKKyAgICBkb3VibGUqKiB3ZWlnaHRzOworICAgIGRvdWJsZSBmX3BhcmFtMSwgZl9wYXJhbTI7CisgICAgZG91YmxlIG1pbl92YWwsIG1heF92YWwsIG1pbl92YWwxLCBtYXhfdmFsMTsKKyAgICBpbnQgYWN0aXZfZnVuYzsKKyAgICBpbnQgbWF4X2NvdW50LCBtYXhfYnVmX3N6OworICAgIEN2QU5OX01MUF9UcmFpblBhcmFtcyBwYXJhbXM7CisgICAgQ3ZSTkcgcm5nOworfTsKKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252b2x1dGlvbmFsIE5ldXJhbCBOZXR3b3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgc3RydWN0IEN2Q05OTGF5ZXIgQ3ZDTk5MYXllcjsKK3R5cGVkZWYgc3RydWN0IEN2Q05OZXR3b3JrIEN2Q05OZXR3b3JrOworCisjZGVmaW5lIENWX0NOTl9MRUFSTl9SQVRFX0RFQ1JFQVNFX0hZUEVSQk9MSUNBTExZICAxCisjZGVmaW5lIENWX0NOTl9MRUFSTl9SQVRFX0RFQ1JFQVNFX1NRUlRfSU5WICAgICAgICAyCisjZGVmaW5lIENWX0NOTl9MRUFSTl9SQVRFX0RFQ1JFQVNFX0xPR19JTlYgICAgICAgICAzCisKKyNkZWZpbmUgQ1ZfQ05OX0dSQURfRVNUSU1fUkFORE9NICAgICAgICAwCisjZGVmaW5lIENWX0NOTl9HUkFEX0VTVElNX0JZX1dPUlNUX0lNRyAgMQorCisjZGVmaW5lIElDVl9DTk5fTEFZRVIgICAgICAgICAgICAgICAgMHg1NTU1MDAwMAorI2RlZmluZSBJQ1ZfQ05OX0NPTlZPTFVUSU9OX0xBWUVSICAgIDB4MDAwMDExMTEKKyNkZWZpbmUgSUNWX0NOTl9TVUJTQU1QTElOR19MQVlFUiAgICAweDAwMDAyMjIyCisjZGVmaW5lIElDVl9DTk5fRlVMTENPTk5FQ1RfTEFZRVIgICAgMHgwMDAwMzMzMworCisjZGVmaW5lIElDVl9JU19DTk5fTEFZRVIoIGxheWVyICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAoKGxheWVyKSAhPSBOVUxMKSAmJiAoKCgoQ3ZDTk5MYXllciopKGxheWVyKSktPmZsYWdzICYgQ1ZfTUFHSUNfTUFTSylcCisgICAgICAgID09IElDVl9DTk5fTEFZRVIgKSkKKworI2RlZmluZSBJQ1ZfSVNfQ05OX0NPTlZPTFVUSU9OX0xBWUVSKCBsYXllciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKElDVl9JU19DTk5fTEFZRVIoIGxheWVyICkpICYmICgoKEN2Q05OTGF5ZXIqKSAobGF5ZXIpKS0+ZmxhZ3MgICAgICAgXAorICAgICAgICAmIH5DVl9NQUdJQ19NQVNLKSA9PSBJQ1ZfQ05OX0NPTlZPTFVUSU9OX0xBWUVSICkKKworI2RlZmluZSBJQ1ZfSVNfQ05OX1NVQlNBTVBMSU5HX0xBWUVSKCBsYXllciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKElDVl9JU19DTk5fTEFZRVIoIGxheWVyICkpICYmICgoKEN2Q05OTGF5ZXIqKSAobGF5ZXIpKS0+ZmxhZ3MgICAgICAgXAorICAgICAgICAmIH5DVl9NQUdJQ19NQVNLKSA9PSBJQ1ZfQ05OX1NVQlNBTVBMSU5HX0xBWUVSICkKKworI2RlZmluZSBJQ1ZfSVNfQ05OX0ZVTExDT05ORUNUX0xBWUVSKCBsYXllciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggKElDVl9JU19DTk5fTEFZRVIoIGxheWVyICkpICYmICgoKEN2Q05OTGF5ZXIqKSAobGF5ZXIpKS0+ZmxhZ3MgICAgICAgXAorICAgICAgICAmIH5DVl9NQUdJQ19NQVNLKSA9PSBJQ1ZfQ05OX0ZVTExDT05ORUNUX0xBWUVSICkKKwordHlwZWRlZiB2b2lkIChDVl9DREVDTCAqQ3ZDTk5MYXllckZvcndhcmQpCisgICAgKCBDdkNOTkxheWVyKiBsYXllciwgY29uc3QgQ3ZNYXQqIGlucHV0LCBDdk1hdCogb3V0cHV0ICk7CisKK3R5cGVkZWYgdm9pZCAoQ1ZfQ0RFQ0wgKkN2Q05OTGF5ZXJCYWNrd2FyZCkKKyAgICAoIEN2Q05OTGF5ZXIqIGxheWVyLCBpbnQgdCwgY29uc3QgQ3ZNYXQqIFgsIGNvbnN0IEN2TWF0KiBkRV9kWSwgQ3ZNYXQqIGRFX2RYICk7CisKK3R5cGVkZWYgdm9pZCAoQ1ZfQ0RFQ0wgKkN2Q05OTGF5ZXJSZWxlYXNlKQorICAgIChDdkNOTkxheWVyKiogbGF5ZXIpOworCit0eXBlZGVmIHZvaWQgKENWX0NERUNMICpDdkNOTmV0d29ya0FkZExheWVyKQorICAgIChDdkNOTmV0d29yayogbmV0d29yaywgQ3ZDTk5MYXllciogbGF5ZXIpOworCit0eXBlZGVmIHZvaWQgKENWX0NERUNMICpDdkNOTmV0d29ya1JlbGVhc2UpCisgICAgKEN2Q05OZXR3b3JrKiogbmV0d29yayk7CisKKyNkZWZpbmUgQ1ZfQ05OX0xBWUVSX0ZJRUxEUygpICAgICAgICAgICBcCisgICAgLyogSW5kaWNhdG9yIG9mIHRoZSBsYXllcidzIHR5cGUgKi8gXAorICAgIGludCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogTnVtYmVyIG9mIGlucHV0IGltYWdlcyAqLyAgICAgICAgXAorICAgIGludCBuX2lucHV0X3BsYW5lczsgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBIZWlnaHQgb2YgZWFjaCBpbnB1dCBpbWFnZSAqLyAgICBcCisgICAgaW50IGlucHV0X2hlaWdodDsgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIFdpZHRoIG9mIGVhY2ggaW5wdXQgaW1hZ2UgKi8gICAgIFwKKyAgICBpbnQgaW5wdXRfd2lkdGg7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIE51bWJlciBvZiBvdXRwdXQgaW1hZ2VzICovICAgICAgIFwKKyAgICBpbnQgbl9vdXRwdXRfcGxhbmVzOyAgICAgICAgICAgICAgICBcCisgICAgLyogSGVpZ2h0IG9mIGVhY2ggb3V0cHV0IGltYWdlICovICAgXAorICAgIGludCBvdXRwdXRfaGVpZ2h0OyAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBXaWR0aCBvZiBlYWNoIG91dHB1dCBpbWFnZSAqLyAgICBcCisgICAgaW50IG91dHB1dF93aWR0aDsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBMZWFybmluZyByYXRlIGF0IHRoZSBmaXJzdCBpdGVyYXRpb24gKi8gICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZsb2F0IGluaXRfbGVhcm5fcmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogRHluYW1pY3Mgb2YgbGVhcm5pbmcgcmF0ZSBkZWNyZWFzaW5nICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qIFRyYWluYWJsZSB3ZWlnaHRzIG9mIHRoZSBsYXllciAoaW5jbHVkaW5nIGJpYXMpICovICAgICAgICAgICBcCisgICAgLyogaS10aCByb3cgaXMgYSBzZXQgb2Ygd2VpZ2h0cyBvZiB0aGUgaS10aCBvdXRwdXQgcGxhbmUgKi8gICAgIFwKKyAgICBDdk1hdCogd2VpZ2h0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZDTk5MYXllckZvcndhcmQgIGZvcndhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdkNOTkxheWVyQmFja3dhcmQgYmFja3dhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2Q05OTGF5ZXJSZWxlYXNlICByZWxlYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogUG9pbnRlcnMgdG8gdGhlIHByZXZpb3VzIGFuZCBuZXh0IGxheWVycyBpbiB0aGUgbmV0d29yayAqLyAgIFwKKyAgICBDdkNOTkxheWVyKiBwcmV2X2xheWVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2Q05OTGF5ZXIqIG5leHRfbGF5ZXIKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDTk5MYXllcgoreworICAgIENWX0NOTl9MQVlFUl9GSUVMRFMoKTsKK31DdkNOTkxheWVyOworCit0eXBlZGVmIHN0cnVjdCBDdkNOTkNvbnZvbHV0aW9uTGF5ZXIKK3sKKyAgICBDVl9DTk5fTEFZRVJfRklFTERTKCk7CisgICAgLy8gS2VybmVsIHNpemUgKGhlaWdodCBhbmQgd2lkdGgpIGZvciBjb252b2x1dGlvbi4KKyAgICBpbnQgSzsKKyAgICAvLyBjb25uZWN0aW9ucyBtYXRyaXgsIChpLGopLXRoIGVsZW1lbnQgaXMgMSBpZmYgdGhlcmUgaXMgYSBjb25uZWN0aW9uIGJldHdlZW4KKyAgICAvLyBpLXRoIHBsYW5lIG9mIHRoZSBjdXJyZW50IGxheWVyIGFuZCBqLXRoIHBsYW5lIG9mIHRoZSBwcmV2aW91cyBsYXllcjsKKyAgICAvLyAoaSxqKS10aCBlbGVtZW50IGlzIGVxdWFsIHRvIDAgb3RoZXJ3aXNlCisgICAgQ3ZNYXQgKmNvbm5lY3RfbWFzazsKKyAgICAvLyB2YWx1ZSBvZiB0aGUgbGVhcm5pbmcgcmF0ZSBmb3IgdXBkYXRpbmcgd2VpZ2h0cyBhdCB0aGUgZmlyc3QgaXRlcmF0aW9uCit9Q3ZDTk5Db252b2x1dGlvbkxheWVyOworCit0eXBlZGVmIHN0cnVjdCBDdkNOTlN1YlNhbXBsaW5nTGF5ZXIKK3sKKyAgICBDVl9DTk5fTEFZRVJfRklFTERTKCk7CisgICAgLy8gcmF0aW8gYmV0d2VlbiB0aGUgaGVpZ2h0cyAob3Igd2lkdGhzIC0gcmF0aW9zIGFyZSBzdXBwb3NlZCB0byBiZSBlcXVhbCkKKyAgICAvLyBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBwbGFuZXMKKyAgICBpbnQgc3ViX3NhbXBfc2NhbGU7CisgICAgLy8gYW1wbGl0dWRlIG9mIHNpZ21vaWQgYWN0aXZhdGlvbiBmdW5jdGlvbgorICAgIGZsb2F0IGE7CisgICAgLy8gc2NhbGUgcGFyYW1ldGVyIG9mIHNpZ21vaWQgYWN0aXZhdGlvbiBmdW5jdGlvbgorICAgIGZsb2F0IHM7CisgICAgLy8gZXhwMnNzdW1XWCA9IGV4cCgyPHM+KihiaWFzK3cqKHgxKy4uLit4NCkpKSwgd2hlcmUgeDEsLi4ueDQgYXJlIHNvbWUgZWxlbWVudHMgb2YgWAorICAgIC8vIC0gaXMgdGhlIHZlY3RvciB1c2VkIGluIGNvbXB1dGluZyBvZiB0aGUgYWN0aXZhdGlvbiBmdW5jdGlvbiBpbiBiYWNrd2FyZAorICAgIEN2TWF0KiBleHAyc3N1bVdYOworICAgIC8vICh4MSt4Mit4Myt4NCksIHdoZXJlIHgxLC4uLng0IGFyZSBzb21lIGVsZW1lbnRzIG9mIFgKKyAgICAvLyAtIGlzIHRoZSB2ZWN0b3IgdXNlZCBpbiBjb21wdXRpbmcgb2YgdGhlIGFjdGl2YXRpb24gZnVuY3Rpb24gaW4gYmFja3dhcmQKKyAgICBDdk1hdCogc3VtWDsKK31DdkNOTlN1YlNhbXBsaW5nTGF5ZXI7CisKKy8vIFN0cnVjdHVyZSBvZiB0aGUgbGFzdCBsYXllci4KK3R5cGVkZWYgc3RydWN0IEN2Q05ORnVsbENvbm5lY3RMYXllcgoreworICAgIENWX0NOTl9MQVlFUl9GSUVMRFMoKTsKKyAgICAvLyBhbXBsaXR1ZGUgb2Ygc2lnbW9pZCBhY3RpdmF0aW9uIGZ1bmN0aW9uCisgICAgZmxvYXQgYTsKKyAgICAvLyBzY2FsZSBwYXJhbWV0ZXIgb2Ygc2lnbW9pZCBhY3RpdmF0aW9uIGZ1bmN0aW9uCisgICAgZmxvYXQgczsKKyAgICAvLyBleHAyc3N1bVdYID0gZXhwKDIqPHM+KihXKlgpKSAtIGlzIHRoZSB2ZWN0b3IgdXNlZCBpbiBjb21wdXRpbmcgb2YgdGhlCisgICAgLy8gYWN0aXZhdGlvbiBmdW5jdGlvbiBhbmQgaXQncyBkZXJpdmF0aXZlIGJ5IHRoZSBmb3JtdWxhZQorICAgIC8vIGFjdGl2LmZ1bmMuID0gPGE+KGV4cCgyPHM+V1gpLTEpLyhleHAoMjxzPldYKSsxKSA9PSA8YT4gLSAyPGE+Lyg8ZXhwMnNzdW1XWD4gKyAxKQorICAgIC8vIChhY3Rpdi5mdW5jLiknID0gNDxhPjxzPmV4cCgyPHM+V1gpLyhleHAoMjxzPldYKSsxKV4yCisgICAgQ3ZNYXQqIGV4cDJzc3VtV1g7Cit9Q3ZDTk5GdWxsQ29ubmVjdExheWVyOworCit0eXBlZGVmIHN0cnVjdCBDdkNOTmV0d29yaworeworICAgIGludCBuX2xheWVyczsKKyAgICBDdkNOTkxheWVyKiBsYXllcnM7CisgICAgQ3ZDTk5ldHdvcmtBZGRMYXllciBhZGRfbGF5ZXI7CisgICAgQ3ZDTk5ldHdvcmtSZWxlYXNlIHJlbGVhc2U7Cit9Q3ZDTk5ldHdvcms7CisKK3R5cGVkZWYgc3RydWN0IEN2Q05OU3RhdE1vZGVsCit7CisgICAgQ1ZfU1RBVF9NT0RFTF9GSUVMRFMoKTsKKyAgICBDdkNOTmV0d29yayogbmV0d29yazsKKyAgICAvLyBldGFsb25zIGFyZSBhbGxvY2F0ZWQgYXMgcm93cywgdGhlIGktdGggZXRhbG9uIGhhcyBsYWJlbCBjbHNfbGFiZWxlc1tpXQorICAgIEN2TWF0KiBldGFsb25zOworICAgIC8vIGNsYXNzZXMgbGFiZWxzCisgICAgQ3ZNYXQqIGNsc19sYWJlbHM7Cit9Q3ZDTk5TdGF0TW9kZWw7CisKK3R5cGVkZWYgc3RydWN0IEN2Q05OU3RhdE1vZGVsUGFyYW1zCit7CisgICAgQ1ZfU1RBVF9NT0RFTF9QQVJBTV9GSUVMRFMoKTsKKyAgICAvLyBuZXR3b3JrIG11c3QgYmUgY3JlYXRlZCBieSB0aGUgZnVuY3Rpb25zIGN2Q3JlYXRlQ05OZXR3b3JrIGFuZCA8YWRkX2xheWVyPgorICAgIEN2Q05OZXR3b3JrKiBuZXR3b3JrOworICAgIEN2TWF0KiBldGFsb25zOworICAgIC8vIHRlcm1pbmF0aW9uIGNyaXRlcmlhCisgICAgaW50IG1heF9pdGVyOworICAgIGludCBzdGFydF9pdGVyOworICAgIGludCBncmFkX2VzdGltX3R5cGU7Cit9Q3ZDTk5TdGF0TW9kZWxQYXJhbXM7CisKK0NWQVBJKEN2Q05OTGF5ZXIqKSBjdkNyZWF0ZUNOTkNvbnZvbHV0aW9uTGF5ZXIoCisgICAgaW50IG5faW5wdXRfcGxhbmVzLCBpbnQgaW5wdXRfaGVpZ2h0LCBpbnQgaW5wdXRfd2lkdGgsCisgICAgaW50IG5fb3V0cHV0X3BsYW5lcywgaW50IEssCisgICAgZmxvYXQgaW5pdF9sZWFybl9yYXRlLCBpbnQgbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlLAorICAgIEN2TWF0KiBjb25uZWN0X21hc2sgQ1ZfREVGQVVMVCgwKSwgQ3ZNYXQqIHdlaWdodHMgQ1ZfREVGQVVMVCgwKSApOworCitDVkFQSShDdkNOTkxheWVyKikgY3ZDcmVhdGVDTk5TdWJTYW1wbGluZ0xheWVyKAorICAgIGludCBuX2lucHV0X3BsYW5lcywgaW50IGlucHV0X2hlaWdodCwgaW50IGlucHV0X3dpZHRoLAorICAgIGludCBzdWJfc2FtcF9zY2FsZSwgZmxvYXQgYSwgZmxvYXQgcywKKyAgICBmbG9hdCBpbml0X2xlYXJuX3JhdGUsIGludCBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUsIEN2TWF0KiB3ZWlnaHRzIENWX0RFRkFVTFQoMCkgKTsKKworQ1ZBUEkoQ3ZDTk5MYXllciopIGN2Q3JlYXRlQ05ORnVsbENvbm5lY3RMYXllcigKKyAgICBpbnQgbl9pbnB1dHMsIGludCBuX291dHB1dHMsIGZsb2F0IGEsIGZsb2F0IHMsCisgICAgZmxvYXQgaW5pdF9sZWFybl9yYXRlLCBpbnQgbGVhcm5pbmdfdHlwZSwgQ3ZNYXQqIHdlaWdodHMgQ1ZfREVGQVVMVCgwKSApOworCitDVkFQSShDdkNOTmV0d29yayopIGN2Q3JlYXRlQ05OZXR3b3JrKCBDdkNOTkxheWVyKiBmaXJzdF9sYXllciApOworCitDVkFQSShDdlN0YXRNb2RlbCopIGN2VHJhaW5DTk5DbGFzc2lmaWVyKAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHRyYWluX2RhdGEsIGludCB0ZmxhZywKKyAgICAgICAgICAgIGNvbnN0IEN2TWF0KiByZXNwb25zZXMsCisgICAgICAgICAgICBjb25zdCBDdlN0YXRNb2RlbFBhcmFtcyogcGFyYW1zLAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCBDVl9ERUZBVUxUKDApLAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIENWX0RFRkFVTFQoMCksIGNvbnN0IEN2TWF0KiBDVl9ERUZBVUxUKDApICk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFc3RpbWF0ZSBjbGFzc2lmaWVycyBhbGdvcml0aG1zICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3R5cGVkZWYgY29uc3QgQ3ZNYXQqIChDVl9DREVDTCAqQ3ZTdGF0TW9kZWxFc3RpbWF0ZUdldE1hdCkKKyAgICAgICAgICAgICAgICAgICAgKCBjb25zdCBDdlN0YXRNb2RlbCogZXN0aW1hdGVNb2RlbCApOworCit0eXBlZGVmIGludCAoQ1ZfQ0RFQ0wgKkN2U3RhdE1vZGVsRXN0aW1hdGVOZXh0U3RlcCkKKyAgICAgICAgICAgICAgICAgICAgKCBDdlN0YXRNb2RlbCogZXN0aW1hdGVNb2RlbCApOworCit0eXBlZGVmIHZvaWQgKENWX0NERUNMICpDdlN0YXRNb2RlbEVzdGltYXRlQ2hlY2tDbGFzc2lmaWVyKQorICAgICAgICAgICAgICAgICAgICAoIEN2U3RhdE1vZGVsKiBlc3RpbWF0ZU1vZGVsLAorICAgICAgICAgICAgICAgIGNvbnN0IEN2U3RhdE1vZGVsKiBtb2RlbCwKKyAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHNhbXBsZV90X2ZsYWcsCisgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgIHJlc3BvbnNlcyApOworCit0eXBlZGVmIHZvaWQgKENWX0NERUNMICpDdlN0YXRNb2RlbEVzdGltYXRlQ2hlY2tDbGFzc2lmaWVyRWFzeSkKKyAgICAgICAgICAgICAgICAgICAgKCBDdlN0YXRNb2RlbCogZXN0aW1hdGVNb2RlbCwKKyAgICAgICAgICAgICAgICBjb25zdCBDdlN0YXRNb2RlbCogbW9kZWwgKTsKKwordHlwZWRlZiBmbG9hdCAoQ1ZfQ0RFQ0wgKkN2U3RhdE1vZGVsRXN0aW1hdGVHZXRDdXJyZW50UmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAoIGNvbnN0IEN2U3RhdE1vZGVsKiBlc3RpbWF0ZU1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiAgICAgICBjb3JyZWxhdGlvbiApOworCit0eXBlZGVmIHZvaWQgKENWX0NERUNMICpDdlN0YXRNb2RlbEVzdGltYXRlUmVzZXQpCisgICAgICAgICAgICAgICAgICAgICggQ3ZTdGF0TW9kZWwqIGVzdGltYXRlTW9kZWwgKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDcm9zcy12YWxpZGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIENWX0NST1NTX1ZBTElEQVRJT05fRVNUSU1BVEVfQ0xBU1NJRklFUl9QQVJBTV9GSUVMRFMoKSAgICBcCisgICAgQ1ZfU1RBVF9NT0RFTF9QQVJBTV9GSUVMRFMoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBrX2ZvbGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBpc19yZWdyZXNzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZSTkcqICBybmcKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDcm9zc1ZhbGlkYXRpb25QYXJhbXMKK3sKKyAgICBDVl9DUk9TU19WQUxJREFUSU9OX0VTVElNQVRFX0NMQVNTSUZJRVJfUEFSQU1fRklFTERTKCk7Cit9IEN2Q3Jvc3NWYWxpZGF0aW9uUGFyYW1zOworCisjZGVmaW5lIENWX0NST1NTX1ZBTElEQVRJT05fRVNUSU1BVEVfQ0xBU1NJRklFUl9GSUVMRFMoKSAgICBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZUdldE1hdCAgICAgICAgICAgICAgIGdldFRyYWluSWR4TWF0OyBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZUdldE1hdCAgICAgICAgICAgICAgIGdldENoZWNrSWR4TWF0OyBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZU5leHRTdGVwICAgICAgICAgICAgIG5leHRTdGVwOyAgICAgICBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZUNoZWNrQ2xhc3NpZmllciAgICAgIGNoZWNrOyAgICAgICAgICBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZUdldEN1cnJlbnRSZXN1bHQgICAgIGdldFJlc3VsdDsgICAgICBcCisgICAgQ3ZTdGF0TW9kZWxFc3RpbWF0ZVJlc2V0ICAgICAgICAgICAgICAgIHJlc2V0OyAgICAgICAgICBcCisgICAgaW50ICAgICBpc19yZWdyZXNzaW9uOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBmb2xkc19hbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBzYW1wbGVzX2FsbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50KiAgICBzYW1wbGVJZHhBbGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50KiAgICBmb2xkczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBtYXhfZm9sZF9zaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgY3VycmVudF9mb2xkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICAgICAgaXNfY2hlY2tlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZNYXQqICAgICAgc2FtcGxlSWR4VHJhaW47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZNYXQqICAgICAgc2FtcGxlSWR4RXZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQ3ZNYXQqICAgICAgcHJlZGljdF9yZXN1bHRzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBjb3JyZWN0X3Jlc3VsdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50ICAgICBhbGxfcmVzdWx0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzcV9lcnJvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzdW1fY29ycmVjdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzdW1fcHJlZGljdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzdW1fY2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzdW1fcHA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG91YmxlICBzdW1fY3AKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbAoreworICAgIENWX1NUQVRfTU9ERUxfRklFTERTKCk7CisgICAgQ1ZfQ1JPU1NfVkFMSURBVElPTl9FU1RJTUFURV9DTEFTU0lGSUVSX0ZJRUxEUygpOworfSBDdkNyb3NzVmFsaWRhdGlvbk1vZGVsOworCitDVkFQSShDdlN0YXRNb2RlbCopCitjdkNyZWF0ZUNyb3NzVmFsaWRhdGlvbkVzdGltYXRlTW9kZWwKKyAgICAgICAgICAgKCBpbnQgICAgICAgICAgICAgICAgc2FtcGxlc19hbGwsCisgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqIGVzdGltYXRlUGFyYW1zIENWX0RFRkFVTFQoMCksCisgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgIHNhbXBsZUlkeCBDVl9ERUZBVUxUKDApICk7CisKK0NWQVBJKGZsb2F0KQorY3ZDcm9zc1ZhbGlkYXRpb24oIGNvbnN0IEN2TWF0KiAgICAgICAgICAgICB0cnVlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgdGZsYWcsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgIHRydWVDbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEN2U3RhdE1vZGVsKiAgICAgKCpjcmVhdGVDbGFzc2lmaWVyKSggY29uc3QgQ3ZNYXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqIGVzdGltYXRlUGFyYW1zIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqIHRyYWluUGFyYW1zIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgIGNvbXBJZHggQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgICAgICAgc2FtcGxlSWR4IENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGF0TW9kZWwqKiAgICAgIHBDclZhbE1vZGVsIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgIHR5cGVNYXNrIENWX0RFRkFVTFQoMCksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgIG1pc3NlZE1lYXN1cmVtZW50TWFzayBDVl9ERUZBVUxUKDApICk7CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV4aWxhcnkgZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBHZW5lcmF0ZXMgPHNhbXBsZT4gZnJvbSBtdWx0aXZhcmlhdGUgbm9ybWFsIGRpc3RyaWJ1dGlvbiwgd2hlcmUgPG1lYW4+IC0gaXMgYW4KKyAgIGF2ZXJhZ2Ugcm93IHZlY3RvciwgPGNvdj4gLSBzeW1tZXRyaWMgY292YXJpYXRpb24gbWF0cml4ICovCitDVkFQSSh2b2lkKSBjdlJhbmRNVk5vcm1hbCggQ3ZNYXQqIG1lYW4sIEN2TWF0KiBjb3YsIEN2TWF0KiBzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlJORyogcm5nIENWX0RFRkFVTFQoMCkgKTsKKworLyogR2VuZXJhdGVzIHNhbXBsZSBmcm9tIGdhdXNzaWFuIG1peHR1cmUgZGlzdHJpYnV0aW9uICovCitDVkFQSSh2b2lkKSBjdlJhbmRHYXVzc01peHR1cmUoIEN2TWF0KiBtZWFuc1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBjb3ZzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjbHNudW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogc2FtcENsYXNzZXMgQ1ZfREVGQVVMVCgwKSApOworCisjZGVmaW5lIENWX1RTX0NPTkNFTlRSSUNfU1BIRVJFUyAwCisKKy8qIGNyZWF0ZXMgdGVzdCBzZXQgKi8KK0NWQVBJKHZvaWQpIGN2Q3JlYXRlVGVzdFNldCggaW50IHR5cGUsIEN2TWF0Kiogc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgaW50IG51bV9zYW1wbGVzLAorICAgICAgICAgICAgICAgICBpbnQgbnVtX2ZlYXR1cmVzLAorICAgICAgICAgICAgICAgICBDdk1hdCoqIHJlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgaW50IG51bV9jbGFzc2VzLCAuLi4gKTsKKworLyogQWlqIDwtIEFqaSBmb3IgaSA+IGogaWYgbG93ZXJfdG9fdXBwZXIgIT0gMAorICAgICAgICAgICAgICBmb3IgaSA8IGogaWYgbG93ZXJfdG9fdXBwZXIgPSAwICovCitDVkFQSSh2b2lkKSBjdkNvbXBsZXRlU3ltbSggQ3ZNYXQqIG1hdHJpeCwgaW50IGxvd2VyX3RvX3VwcGVyICk7CisKKyNlbmRpZgorCisjZW5kaWYgLypfX01MX0hfXyovCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL21sL3NyYy9fbWwuaCBiL21sL3NyYy9fbWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmUyNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWwvc3JjL19tbC5oCkBAIC0wLDAgKzEsMzU0IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX19NTF9JTlRFUk5BTF9IX18KKyNkZWZpbmUgX19NTF9JTlRFUk5BTF9IX18KKworI2lmIF9NU0NfVkVSID49IDEyMDAKKyNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogNDUxNCA0NzEwIDQ3MTEgNDcxMCApCisjZW5kaWYKKworI2luY2x1ZGUgIm1sLmgiCisjaW5jbHVkZSAiY3htaXNjLmgiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxmbG9hdC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmbmRlZiBGQUxTRQorI2RlZmluZSBGQUxTRSAwCisjZW5kaWYKKyNpZm5kZWYgVFJVRQorI2RlZmluZSBUUlVFIDEKKyNlbmRpZgorCisjZGVmaW5lIE1MX0lNUEwgQ1ZfSU1QTAorCisjZGVmaW5lIENWX01BVF9FTEVNX0ZMQUcoIG1hdCwgdHlwZSwgY29tcCwgdmVjdCwgdGZsYWcgKSAgICBcCisgICAgKCggdGZsYWcgPT0gQ1ZfUk9XX1NBTVBMRSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgPyAoQ1ZfTUFUX0VMRU0oIG1hdCwgdHlwZSwgY29tcCwgdmVjdCApKSAgICAgICAgICAgICAgICBcCisgICAgOiAoQ1ZfTUFUX0VMRU0oIG1hdCwgdHlwZSwgdmVjdCwgY29tcCApKSkKKworLyogQ29udmVydCBtYXRyaXggdG8gdmVjdG9yICovCisjZGVmaW5lIElDVl9NQVQyVkVDKCBtYXQsIHZkYXRhLCB2c3RlcCwgbnVtICkgICAgICBcCisgICAgaWYoIE1JTiggKG1hdCkucm93cywgKG1hdCkuY29scyApICE9IDEgKSAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7ICAgICAgICAgICAgICBcCisgICAgKHZkYXRhKSA9ICgobWF0KS5kYXRhLnB0cik7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIChtYXQpLnJvd3MgPT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2c3RlcCkgPSBDVl9FTEVNX1NJWkUoIChtYXQpLnR5cGUgKTsgICAgICBcCisgICAgICAgIChudW0pID0gKG1hdCkuY29sczsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICh2c3RlcCkgPSAobWF0KS5zdGVwOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIChudW0pID0gKG1hdCkucm93czsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvKiBnZXQgcmF3IGRhdGEgKi8KKyNkZWZpbmUgSUNWX1JBV0RBVEEoIG1hdCwgZmxhZ3MsIHJkYXRhLCBzc3RlcCwgY3N0ZXAsIG0sIG4gKSAgICAgICAgIFwKKyAgICAocmRhdGEpID0gKG1hdCkuZGF0YS5wdHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggQ1ZfSVNfUk9XX1NBTVBMRSggZmxhZ3MgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHNzdGVwKSA9IChtYXQpLnN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGNzdGVwKSA9IENWX0VMRU1fU0laRSggKG1hdCkudHlwZSApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG0pID0gKG1hdCkucm93czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG4pID0gKG1hdCkuY29sczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGNzdGVwKSA9IChtYXQpLnN0ZXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKHNzdGVwKSA9IENWX0VMRU1fU0laRSggKG1hdCkudHlwZSApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG4pID0gKG1hdCkucm93czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKG0pID0gKG1hdCkuY29sczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX0lTX01BVF9PRl9UWVBFKCBtYXQsIG1hdF90eXBlKSBcCisgICAgKENWX0lTX01BVCggbWF0ICkgJiYgQ1ZfTUFUX1RZUEUoIG1hdC0+dHlwZSApID09IChtYXRfdHlwZSkgJiYgICBcCisgICAgKG1hdCktPmNvbHMgPiAwICYmIChtYXQpLT5yb3dzID4gMCkKKworLyoKKyAgICB1Y2hhciogZGF0YTsgaW50IHNzdGVwLCBjc3RlcDsgICAgICAtIHRyYWluRGF0YS0+ZGF0YQorICAgIHVjaGFyKiBjbGFzc2VzOyBpbnQgY2xzdGVwOyBpbnQgbmNsOy0gdHJhaW5DbGFzc2VzCisgICAgdWNoYXIqIHRtYXNrOyBpbnQgdG1zdGVwOyBpbnQgbnRtOyAgLSB0eXBlTWFzaworICAgIHVjaGFyKiBtaXNzZWQ7aW50IG1zc3RlcCwgbWNzdGVwOyAgIC1taXNzZWRNZWFzdXJlbWVudHMuLi4KKyAgICBpbnQgbW0sIG1uOyAgICAgICAgICAgICAgICAgICAgICAgICA9PSBtLG4gPT0gc2l6ZSxkaW0KKyAgICB1Y2hhciogc2lkeDtpbnQgc2lzdGVwOyAgICAgICAgICAgICAtIHNhbXBsZUlkeAorICAgIHVjaGFyKiBjaWR4O2ludCBjaXN0ZXA7ICAgICAgICAgICAgIC0gY29tcElkeAorICAgIGludCBrLCBsOyAgICAgICAgICAgICAgICAgICAgICAgICAgID09IG4sbSA9PSBkaW0sc2l6ZSAobGVuZ3RoIG9mIGNpZHgsIHNpZHgpCisgICAgaW50IG0sIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gc2l6ZSxkaW0KKyovCisjZGVmaW5lIElDVl9ERUNMQVJFX1RSQUlOX0FSR1MoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIGRhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNzdGVwLCBjc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIGNsYXNzZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNsc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG5jbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIHRtYXNrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHRtc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG50bTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIG1pc3NlZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG1zc3RlcCwgbWNzdGVwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG1tLCBtbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIHNpZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IHNpc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdWNoYXIqIGNpZHg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGNpc3RlcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGssIGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG0sIG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGF0YSA9IGNsYXNzZXMgPSB0bWFzayA9IG1pc3NlZCA9IHNpZHggPSBjaWR4ID0gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3N0ZXAgPSBjc3RlcCA9IGNsc3RlcCA9IG5jbCA9IHRtc3RlcCA9IG50bSA9IG1zc3RlcCA9IG1jc3RlcCA9IG1tID0gbW4gPSAwOyAgICBcCisgICAgc2lzdGVwID0gY2lzdGVwID0gayA9IGwgPSBtID0gbiA9IDA7CisKKyNkZWZpbmUgSUNWX1RSQUlOX0RBVEFfUkVRVUlSRUQoIHBhcmFtLCBmbGFncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIUlDVl9JU19NQVRfT0ZfVFlQRSggKHBhcmFtKSwgQ1ZfMzJGQzEgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgIiAjcGFyYW0gIiBwYXJhbWV0ZXIiICk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX1JBV0RBVEEoICoocGFyYW0pLCAoZmxhZ3MpLCBkYXRhLCBzc3RlcCwgY3N0ZXAsIG0sIG4gKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgayA9IG47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbCA9IG07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX1RSQUlOX0NMQVNTRVNfUkVRVUlSRUQoIHBhcmFtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIUlDVl9JU19NQVRfT0ZfVFlQRSggKHBhcmFtKSwgQ1ZfMzJGQzEgKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgIiAjcGFyYW0gIiBwYXJhbWV0ZXIiICk7ICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgSUNWX01BVDJWRUMoICoocGFyYW0pLCBjbGFzc2VzLCBjbHN0ZXAsIG5jbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIG0gIT0gbmNsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbm1hdGNoZWQgc2l6ZXMiICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX0FSR19OVUxMKCBwYXJhbSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggKHBhcmFtKSAhPSBOVUxMICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgI3BhcmFtICIgcGFyYW1ldGVyIG11c3QgYmUgTlVMTCIgKTsgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX01JU1NFRF9NRUFTVVJFTUVOVFNfT1BUSU9OQUwoIHBhcmFtLCBmbGFncyApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggcGFyYW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFJQ1ZfSVNfTUFUX09GX1RZUEUoIHBhcmFtLCBDVl84VUMxICkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkICIgI3BhcmFtICIgcGFyYW1ldGVyIiApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9SQVdEQVRBKCAqKHBhcmFtKSwgKGZsYWdzKSwgbWlzc2VkLCBtc3N0ZXAsIG1jc3RlcCwgbW0sIG1uICk7ICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBtbSAhPSBtIHx8IG1uICE9IG4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5tYXRjaGVkIHNpemVzIiApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX0NPTVBfSURYX09QVElPTkFMKCBwYXJhbSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggcGFyYW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFJQ1ZfSVNfTUFUX09GX1RZUEUoIHBhcmFtLCBDVl8zMlNDMSApICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkICIgI3BhcmFtICIgcGFyYW1ldGVyIiApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9NQVQyVkVDKCAqKHBhcmFtKSwgY2lkeCwgY2lzdGVwLCBrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBrID4gbiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCAiICNwYXJhbSAiIHBhcmFtZXRlciIgKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgSUNWX1NBTVBMRV9JRFhfT1BUSU9OQUwoIHBhcmFtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggcGFyYW0gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoICFJQ1ZfSVNfTUFUX09GX1RZUEUoIHBhcmFtLCBDVl8zMlNDMSApICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkICIgI3BhcmFtICIgcGFyYW1ldGVyIiApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIElDVl9NQVQyVkVDKCAqc2FtcGxlSWR4LCBzaWR4LCBzaXN0ZXAsIGwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmKCBsID4gbSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCAiICNwYXJhbSAiIHBhcmFtZXRlciIgKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBJQ1ZfQ09OVkVSVF9GTE9BVF9BUlJBWV9UT19NQVRSSUNFKCBhcnJheSwgbWF0cmljZSApICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDdk1hdCBhLCBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBkaW1zID0gKG1hdHJpY2UpLT5jb2xzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IG5zYW1wbGVzID0gKG1hdHJpY2UpLT5yb3dzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgdHlwZSA9IENWX01BVF9UWVBFKChtYXRyaWNlKS0+dHlwZSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGludCBpLCBvZmZzZXQgPSBkaW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDVl9BU1NFUlQoIHR5cGUgPT0gQ1ZfMzJGQzEgfHwgdHlwZSA9PSBDVl82NEZDMSApOyAgICAgICAgICAgICAgXAorICAgIG9mZnNldCAqPSAoKHR5cGUgPT0gQ1ZfMzJGQzEpID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihkb3VibGUpKTtcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBiID0gY3ZNYXQoIDEsIGRpbXMsIENWXzMyRkMxICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGN2R2V0Um93KCBtYXRyaWNlLCAmYSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyssIGEuZGF0YS5wdHIgKz0gb2Zmc2V0ICkgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiLmRhdGEuZmwgPSAoZmxvYXQqKWFycmF5W2ldOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0NBTEwoIGN2Q29udmVydCggJmIsICZhICkgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgIEF1eGlsaWFyeSBmdW5jdGlvbnMgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEdlbmVyYXRlcyBhIHNldCBvZiBjbGFzc2VzIGNlbnRlcnMgaW4gcXVhbnRpdHkgPG51bV9vZl9jbHVzdGVycz4gdGhhdCBhcmUgZ2VuZXJhdGVkIGFzCisgICB1bmlmb3JtIHJhbmRvbSB2ZWN0b3JzIGluIHBhcmFsbGVsZXBpcGVkLCB3aGVyZSA8ZGF0YT4gaXMgY29uY2VudHJhdGVkLiBWZWN0b3JzIGluCisgICA8ZGF0YT4gc2hvdWxkIGhhdmUgaG9yaXpvbnRhbCBvcmllbnRhdGlvbi4gSWYgPGNlbnRlcnM+ICE9IE5VTEwsIHRoZSBmdW5jdGlvbiBkb2Vzbid0CisgICBhbGxvY2F0ZSBhbnkgbWVtb3J5IGFuZCBzdG9yZXMgZ2VuZXJhdGVkIGNlbnRlcnMgaW4gPGNlbnRlcnM+LCByZXR1cm5zIDxjZW50ZXJzPi4KKyAgIElmIDxjZW50ZXJzPiA9PSBOVUxMLCB0aGUgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSBhbmQgY3JlYXRlcyB0aGUgbWF0cmljZS4gQ2VudGVycworICAgYXJlIHN1cHBvc2VkIHRvIGJlIG9yaWVudGVkIGhvcml6b250YWxseS4gKi8KK0N2TWF0KiBpY3ZHZW5lcmF0ZVJhbmRvbUNsdXN0ZXJDZW50ZXJzKCBpbnQgc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX29mX2NsdXN0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBjZW50ZXJzIENWX0RFRkFVTFQoMCkpOworCisvKiBGaWxscyB0aGUgPGxhYmVscz4gdXNpbmcgPHByb2JzPiBieSBjaG9vc2luZyB0aGUgbWF4aW1hbCBwcm9iYWJpbGl0eS4gT3V0bGllcnMgYXJlCisgICBmaXhlZCBieSA8b3VsaWVyX3RyZXNoPiBhbmQgaGF2ZSBjbHVzdGVyIGxhYmVsICgtMSkuIEZ1bmN0aW9uIGFsc28gY29udHJvbHMgdGhhdCB0aGVyZQorICAgd2VyZW4ndCAiZW1wdHkiIGNsdXN0ZXJzIGJ5IGZpbGxpbmcgZW1wdHkgY2x1c3RlcnMgd2l0aCB0aGUgbWF4aW1hbCBwcm9iYWJpbGl0eSB2ZWN0b3IuCisgICBJZiBwcm9ic19zdW1zICE9IE5VTEwsIGZpbGxlcyBpdCB3aXRoIHRoZSBzdW1zIG9mIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggc2FtcGxlIChpdCBpcworICAgdXNlZnVsIGZvciBub3JtYWxpemluZyBwcm9iYWJpbGl0aWVzJyBtYXRyaWNlIG9mIEZDTSkgKi8KK3ZvaWQgaWN2RmluZENsdXN0ZXJMYWJlbHMoIGNvbnN0IEN2TWF0KiBwcm9icywgZmxvYXQgb3V0bGllcl90aHJlc2gsIGZsb2F0IHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbGFiZWxzICk7CisKK3R5cGVkZWYgc3RydWN0IEN2U3BhcnNlVmVjRWxlbTMyZgoreworICAgIGludCBpZHg7CisgICAgZmxvYXQgdmFsOworfQorQ3ZTcGFyc2VWZWNFbGVtMzJmOworCisvKiBQcmVwYXJlIHRyYWluaW5nIGRhdGEgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBDVl9UUkFJTl9TVEFUTU9ERUxfREVGUkFHTUVOVF9UUkFJTl9EQVRBICAgIDEKKyNkZWZpbmUgQ1ZfVFJBSU5fU1RBVE1PREVMX1NBTVBMRVNfQVNfUk9XUyAgICAgICAgICAyCisjZGVmaW5lIENWX1RSQUlOX1NUQVRNT0RFTF9TQU1QTEVTX0FTX0NPTFVNTlMgICAgICAgNAorI2RlZmluZSBDVl9UUkFJTl9TVEFUTU9ERUxfQ0FURUdPUklDQUxfUkVTUE9OU0UgICAgIDgKKyNkZWZpbmUgQ1ZfVFJBSU5fU1RBVE1PREVMX09SREVSRURfUkVTUE9OU0UgICAgICAgICAxNgorI2RlZmluZSBDVl9UUkFJTl9TVEFUTU9ERUxfUkVTUE9OU0VTX09OX09VVFBVVCAgICAgIDMyCisjZGVmaW5lIENWX1RSQUlOX1NUQVRNT0RFTF9BTFdBWVNfQ09QWV9UUkFJTl9EQVRBICAgNjQKKyNkZWZpbmUgQ1ZfVFJBSU5fU1RBVE1PREVMX1NQQVJTRV9BU19TUEFSU0UgICAgICAgICAxMjgKKworaW50CitjdlByZXBhcmVUcmFpbkRhdGEoIGNvbnN0IGNoYXIqIC8qZnVuY25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHRyYWluX2RhdGEsIGludCB0ZmxhZywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHJlc3BvbnNlcywgaW50IHJlc3BvbnNlX3R5cGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiB2YXJfaWR4LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBhbHdheXNfY29weV9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCoqKiBvdXRfdHJhaW5fc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgaW50KiBfc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQqIF92YXJfY291bnQsCisgICAgICAgICAgICAgICAgICAgIGludCogX3Zhcl9hbGwsCisgICAgICAgICAgICAgICAgICAgIEN2TWF0Kiogb3V0X3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqKiBvdXRfcmVzcG9uc2VfbWFwLAorICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIG91dF92YXJfaWR4LAorICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIG91dF9zYW1wbGVfaWR4PTAgKTsKKwordm9pZAorY3ZTb3J0U2FtcGxlc0J5Q2xhc3NlcyggY29uc3QgZmxvYXQqKiBzYW1wbGVzLCBjb25zdCBDdk1hdCogY2xhc3NlcywgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNsYXNzX3JhbmdlcywgY29uc3QgdWNoYXIqKiBtYXNrIENWX0RFRkFVTFQoMCkgKTsKKwordm9pZCAKK2N2Q29tYmluZVJlc3BvbnNlTWFwcyAoQ3ZNYXQqICBfcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogIG9sZF9yZXNwb25zZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiAgbmV3X3Jlc3BvbnNlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqKiBvdXRfcmVzcG9uc2VfbWFwKTsKKwordm9pZAorY3ZQcmVwYXJlUHJlZGljdERhdGEoIGNvbnN0IEN2QXJyKiBzYW1wbGUsIGludCBkaW1zX2FsbCwgY29uc3QgQ3ZNYXQqIGNvbXBfaWR4LAorICAgICAgICAgICAgICAgICAgICAgIGludCBjbGFzc19jb3VudCwgY29uc3QgQ3ZNYXQqIHByb2IsIGZsb2F0Kiogcm93X3NhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYXNfc3BhcnNlIENWX0RFRkFVTFQoMCkgKTsKKworLyogY29waWVzIGNsdXN0ZXJpbmcgW29yIGJhdGNoICJwcmVkaWN0Il0gcmVzdWx0cworICAgKGxhYmVscyBhbmQvb3IgY2VudGVycyBhbmQvb3IgcHJvYnMpIGJhY2sgdG8gdGhlIG91dHB1dCBhcnJheXMgKi8KK3ZvaWQKK2N2V3JpdGViYWNrTGFiZWxzKCBjb25zdCBDdk1hdCogbGFiZWxzLCBDdk1hdCogZHN0X2xhYmVscywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogY2VudGVycywgQ3ZNYXQqIGRzdF9jZW50ZXJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBwcm9icywgQ3ZNYXQqIGRzdF9wcm9icywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCwgaW50IHNhbXBsZXNfYWxsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBjb21wX2lkeCwgaW50IGRpbXNfYWxsICk7CisjZGVmaW5lIGN2V3JpdGViYWNrUmVzcG9uc2VzIGN2V3JpdGViYWNrTGFiZWxzCisKKyNkZWZpbmUgWE1MX0ZJRUxEX05BTUUgIl9uYW1lIgorQ3ZGaWxlTm9kZSogaWN2RmlsZU5vZGVHZXRDaGlsZChDdkZpbGVOb2RlKiBmYXRoZXIsIGNvbnN0IGNoYXIqIG5hbWUpOworQ3ZGaWxlTm9kZSogaWN2RmlsZU5vZGVHZXRDaGlsZEFycmF5RWxlbShDdkZpbGVOb2RlKiBmYXRoZXIsIGNvbnN0IGNoYXIqIG5hbWUsaW50IGluZGV4KTsKK0N2RmlsZU5vZGUqIGljdkZpbGVOb2RlR2V0TmV4dChDdkZpbGVOb2RlKiBuLCBjb25zdCBjaGFyKiBuYW1lKTsKKworCit2b2lkIGN2Q2hlY2tUcmFpbkRhdGEoIGNvbnN0IEN2TWF0KiB0cmFpbl9kYXRhLCBpbnQgdGZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtaXNzaW5nX21hc2ssIAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHZhcl9hbGwsIGludCogc2FtcGxlX2FsbCApOworCitDdk1hdCogY3ZQcmVwcm9jZXNzSW5kZXhBcnJheSggY29uc3QgQ3ZNYXQqIGlkeF9hcnIsIGludCBkYXRhX2Fycl9zaXplLCBib29sIGNoZWNrX2Zvcl9kdXBsaWNhdGVzPWZhbHNlICk7CisKK0N2TWF0KiBjdlByZXByb2Nlc3NWYXJUeXBlKCBjb25zdCBDdk1hdCogdHlwZV9tYXNrLCBjb25zdCBDdk1hdCogdmFyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFyX2FsbCwgaW50KiByZXNwb25zZV90eXBlICk7CisKK0N2TWF0KiBjdlByZXByb2Nlc3NPcmRlcmVkUmVzcG9uc2VzKCBjb25zdCBDdk1hdCogcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4LCBpbnQgc2FtcGxlX2FsbCApOworCitDdk1hdCogY3ZQcmVwcm9jZXNzQ2F0ZWdvcmljYWxSZXNwb25zZXMoIGNvbnN0IEN2TWF0KiByZXNwb25zZXMsCisgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHNhbXBsZV9pZHgsIGludCBzYW1wbGVfYWxsLAorICAgICAgICAgICAgICAgIEN2TWF0Kiogb3V0X3Jlc3BvbnNlX21hcCwgQ3ZNYXQqKiBjbGFzc19jb3VudHM9MCApOworCitjb25zdCBmbG9hdCoqIGN2R2V0VHJhaW5TYW1wbGVzKCBjb25zdCBDdk1hdCogdHJhaW5fZGF0YSwgaW50IHRmbGFnLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiB2YXJfaWR4LCBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICBpbnQqIF92YXJfY291bnQsIGludCogX3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICBib29sIGFsd2F5c19jb3B5X2RhdGE9ZmFsc2UgKTsKKworI2VuZGlmIC8qIF9fTUxfSF9fICovCmRpZmYgLS1naXQgYS9tbC9zcmMvbWwuY3BwIGIvbWwvc3JjL21sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2FjYzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWwvc3JjL21sLmNwcApAQCAtMCwwICsxLDQxIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisgCisjaW5jbHVkZSAiX21sLmgiCmRpZmYgLS1naXQgYS9tbC9zcmMvbWxfaW5uZXJfZnVuY3Rpb25zLmNwcCBiL21sL3NyYy9tbF9pbm5lcl9mdW5jdGlvbnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNTM0ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tbC9zcmMvbWxfaW5uZXJfZnVuY3Rpb25zLmNwcApAQCAtMCwwICsxLDE5NTMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9tbC5oIgorCisKK0N2U3RhdE1vZGVsOjpDdlN0YXRNb2RlbCgpCit7CisgICAgZGVmYXVsdF9tb2RlbF9uYW1lID0gIm15X3N0YXRfbW9kZWwiOworfQorCisKK0N2U3RhdE1vZGVsOjp+Q3ZTdGF0TW9kZWwoKQoreworICAgIGNsZWFyKCk7Cit9CisKKwordm9pZCBDdlN0YXRNb2RlbDo6Y2xlYXIoKQoreworfQorCisKK3ZvaWQgQ3ZTdGF0TW9kZWw6OnNhdmUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKyAgICBDdkZpbGVTdG9yYWdlKiBmcyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdlN0YXRNb2RlbDo6c2F2ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIENWX0NBTEwoIGZzID0gY3ZPcGVuRmlsZVN0b3JhZ2UoIGZpbGVuYW1lLCAwLCBDVl9TVE9SQUdFX1dSSVRFICkpOworICAgIGlmKCAhZnMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsICJDb3VsZCBub3Qgb3BlbiB0aGUgZmlsZSBzdG9yYWdlLiBDaGVjayB0aGUgcGF0aCBhbmQgcGVybWlzc2lvbnMiICk7CisKKyAgICB3cml0ZSggZnMsIG5hbWUgPyBuYW1lIDogZGVmYXVsdF9tb2RlbF9uYW1lICk7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlRmlsZVN0b3JhZ2UoICZmcyApOworfQorCisKK3ZvaWQgQ3ZTdGF0TW9kZWw6OmxvYWQoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKyAgICBDdkZpbGVTdG9yYWdlKiBmcyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdlN0YXRNb2RlbDo6bG9hZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2RmlsZU5vZGUqIG1vZGVsX25vZGUgPSAwOworCisgICAgQ1ZfQ0FMTCggZnMgPSBjdk9wZW5GaWxlU3RvcmFnZSggZmlsZW5hbWUsIDAsIENWX1NUT1JBR0VfUkVBRCApKTsKKyAgICBpZiggIWZzICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCBuYW1lICkKKyAgICAgICAgbW9kZWxfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCAwLCBuYW1lICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZGaWxlTm9kZSogcm9vdCA9IGN2R2V0Um9vdEZpbGVOb2RlKCBmcyApOworICAgICAgICBpZiggcm9vdC0+ZGF0YS5zZXEtPnRvdGFsID4gMCApCisgICAgICAgICAgICBtb2RlbF9ub2RlID0gKEN2RmlsZU5vZGUqKWN2R2V0U2VxRWxlbSggcm9vdC0+ZGF0YS5zZXEsIDAgKTsKKyAgICB9CisKKyAgICByZWFkKCBmcywgbW9kZWxfbm9kZSApOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZUZpbGVTdG9yYWdlKCAmZnMgKTsKK30KKworCit2b2lkIEN2U3RhdE1vZGVsOjp3cml0ZSggQ3ZGaWxlU3RvcmFnZSosIGNvbnN0IGNoYXIqICkKK3sKKyAgICBPUEVOQ1ZfRVJST1IoIENWX1N0c05vdEltcGxlbWVudGVkLCAiQ3ZTdGF0TW9kZWw6OndyaXRlIiwgIiIgKTsKK30KKworCit2b2lkIEN2U3RhdE1vZGVsOjpyZWFkKCBDdkZpbGVTdG9yYWdlKiwgQ3ZGaWxlTm9kZSogKQoreworICAgIE9QRU5DVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsICJDdlN0YXRNb2RlbDo6cmVhZCIsICIiICk7Cit9CisKKworLyogQ2FsY3VsYXRlcyB1cHBlciB0cmlhbmd1bGFyIG1hdHJpeCBTLCB3aGVyZSBBIGlzIGEgc3ltbWV0cmljYWwgbWF0cml4IEE9UycqUyAqLworQ1ZfSU1QTCB2b2lkIGN2Q2hvbCggQ3ZNYXQqIEEsIEN2TWF0KiBTICkKK3sKKyAgICBpbnQgZGltID0gQS0+cm93czsKKworICAgIGludCBpLCBqLCBrOworICAgIGZsb2F0IHN1bTsKKyAgICAgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IGRpbTsgaSsrICkKKyAgICB7ICAgCisgICAgICAgIGZvciggaiA9IDA7IGogPCBpOyBqKysgKQorICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBpLCBqKSA9IDA7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBzdW0gPSAwOworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgaTsgaysrICkgCisgICAgICAgICAgICBzdW0gKz0gQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBrLCBpKSAqIENWX01BVF9FTEVNKCpTLCBmbG9hdCwgaywgaSk7CisKKyAgICAgICAgQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBpLCBpKSA9IChmbG9hdClzcXJ0KENWX01BVF9FTEVNKCpBLCBmbG9hdCwgaSwgaSkgLSBzdW0pOworCisgICAgICAgIGZvciggaiA9IGkgKyAxOyBqIDwgZGltOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGk7IGsrKyApIAorICAgICAgICAgICAgICAgIHN1bSArPSBDVl9NQVRfRUxFTSgqUywgZmxvYXQsIGssIGkpICogQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBrLCBqKTsKKworICAgICAgICAgICAgQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBpLCBqKSA9CisgICAgICAgICAgICAgICAgKENWX01BVF9FTEVNKCpBLCBmbG9hdCwgaSwgaikgLSBzdW0pIC8gQ1ZfTUFUX0VMRU0oKlMsIGZsb2F0LCBpLCBpKTsKKyAgICAgICAgCisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIEdlbmVyYXRlcyA8c2FtcGxlPiBmcm9tIG11bHRpdmFyaWF0ZSBub3JtYWwgZGlzdHJpYnV0aW9uLCB3aGVyZSA8bWVhbj4gLSBpcyBhbgorICAgYXZlcmFnZSByb3cgdmVjdG9yLCA8Y292PiAtIHN5bW1ldHJpYyBjb3ZhcmlhdGlvbiBtYXRyaXggKi8KK0NWX0lNUEwgdm9pZCBjdlJhbmRNVk5vcm1hbCggQ3ZNYXQqIG1lYW4sIEN2TWF0KiBjb3YsIEN2TWF0KiBzYW1wbGUsIEN2Uk5HKiBybmcgKQoreworICAgIGludCBkaW0gPSBzYW1wbGUtPmNvbHM7CisgICAgaW50IGFtb3VudCA9IHNhbXBsZS0+cm93czsKKworICAgIEN2Uk5HIHN0YXRlID0gcm5nID8gKnJuZyA6IGN2Uk5HKHRpbWUoMCkpOworICAgIGN2UmFuZEFycigmc3RhdGUsIHNhbXBsZSwgQ1ZfUkFORF9OT1JNQUwsIGN2U2NhbGFyQWxsKDApLCBjdlNjYWxhckFsbCgxKSApOworICAgIAorICAgIEN2TWF0KiB1dG1hdCA9IGN2Q3JlYXRlTWF0KGRpbSwgZGltLCBzYW1wbGUtPnR5cGUpOworICAgIEN2TWF0KiB2ZWN0ID0gY3ZDcmVhdGVNYXRIZWFkZXIoMSwgZGltLCBzYW1wbGUtPnR5cGUpOworCisgICAgY3ZDaG9sKGNvdiwgdXRtYXQpOworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGFtb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGN2R2V0Um93KHNhbXBsZSwgdmVjdCwgaSk7CisgICAgICAgIGN2TWF0TXVsQWRkKHZlY3QsIHV0bWF0LCBtZWFuLCB2ZWN0KTsKKyAgICB9CisKKyAgICBjdlJlbGVhc2VNYXQoJnZlY3QpOyAKKyAgICBjdlJlbGVhc2VNYXQoJnV0bWF0KTsKK30KKworCisvKiBHZW5lcmF0ZXMgPHNhbXBsZT4gb2YgPGFtb3VudD4gcG9pbnRzIGZyb20gYSBkaXNjcmV0ZSB2YXJpYXRlIHhpLAorICAgd2hlcmUgUHJ7eGkgPSBrfSA9PSBwcm9ic1trXSwgMCA8IGsgPCBsZW4gLSAxLiAqLworQ1ZfSU1QTCB2b2lkIGN2UmFuZFNlcmllcyggZmxvYXQgcHJvYnNbXSwgaW50IGxlbiwgaW50IHNhbXBsZVtdLCBpbnQgYW1vdW50ICkKK3sKKyAgICBDdk1hdCogdW5pdmFscyA9IGN2Q3JlYXRlTWF0KDEsIGFtb3VudCwgQ1ZfMzJGQzEpOworICAgIGZsb2F0KiBrbm90cyA9IChmbG9hdCopY3ZBbGxvYyggbGVuICogc2l6ZW9mKGZsb2F0KSApOworCisgICAgaW50IGksIGo7CisKKyAgICBDdlJORyBzdGF0ZSA9IGN2Uk5HKC0xKTsKKyAgICBjdlJhbmRBcnIoJnN0YXRlLCB1bml2YWxzLCBDVl9SQU5EX1VOSSwgY3ZTY2FsYXJBbGwoMCksIGN2U2NhbGFyQWxsKDEpICk7CisgICAgCisgICAga25vdHNbMF0gPSBwcm9ic1swXTsKKyAgICBmb3IoIGkgPSAxOyBpIDwgbGVuOyBpKysgKQorICAgICAgICBrbm90c1tpXSA9IGtub3RzW2kgLSAxXSArIHByb2JzW2ldOworCisgICAgZm9yKCBpID0gMDsgaSA8IGFtb3VudDsgaSsrICkKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IGxlbjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCBDVl9NQVRfRUxFTSgqdW5pdmFscywgZmxvYXQsIDAsIGkpIDw9IGtub3RzW2pdICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVbaV0gPSBqOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgY3ZGcmVlKCZrbm90cyk7Cit9CisKKy8qIEdlbmVyYXRlcyA8c2FtcGxlPiBmcm9tIGdhdXNzaWFuIG1peHR1cmUgZGlzdHJpYnV0aW9uICovCitDVl9JTVBMIHZvaWQgY3ZSYW5kR2F1c3NNaXh0dXJlKCBDdk1hdCogbWVhbnNbXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogY292c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgd2VpZ2h0c1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsc251bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0KiBzYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogc2FtcENsYXNzZXMgKQoreworICAgIGludCBkaW0gPSBzYW1wbGUtPmNvbHM7CisgICAgaW50IGFtb3VudCA9IHNhbXBsZS0+cm93czsKKworICAgIGludCBpLCBjbHNzOworCisgICAgaW50KiBzYW1wbGVfY2xzbnVtID0gKGludCopY3ZBbGxvYyggYW1vdW50ICogc2l6ZW9mKGludCkgKTsKKyAgICBDdk1hdCoqIHV0bWF0cyA9IChDdk1hdCoqKWN2QWxsb2MoIGNsc251bSAqIHNpemVvZihDdk1hdCopICk7CisgICAgQ3ZNYXQqIHZlY3QgPSBjdkNyZWF0ZU1hdEhlYWRlcigxLCBkaW0sIENWXzMyRkMxKTsKKworICAgIEN2TWF0KiBjbGFzc2VzOworICAgIGlmKCBzYW1wQ2xhc3NlcyApCisgICAgICAgIGNsYXNzZXMgPSBzYW1wQ2xhc3NlczsKKyAgICBlbHNlCisgICAgICAgIGNsYXNzZXMgPSBjdkNyZWF0ZU1hdCgxLCBhbW91bnQsIENWXzMyRkMxKTsKKyAgICAKKyAgICBDdlJORyBzdGF0ZSA9IGN2Uk5HKC0xKTsKKyAgICBjdlJhbmRBcnIoJnN0YXRlLCBzYW1wbGUsIENWX1JBTkRfTk9STUFMLCBjdlNjYWxhckFsbCgwKSwgY3ZTY2FsYXJBbGwoMSkpOworICAgIAorICAgIGN2UmFuZFNlcmllcyh3ZWlnaHRzLCBjbHNudW0sIHNhbXBsZV9jbHNudW0sIGFtb3VudCk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY2xzbnVtOyBpKysgKQorICAgIHsKKyAgICAgICAgdXRtYXRzW2ldID0gY3ZDcmVhdGVNYXQoZGltLCBkaW0sIENWXzMyRkMxKTsKKyAgICAgICAgY3ZDaG9sKGNvdnNbaV0sIHV0bWF0c1tpXSk7CisgICAgfQorICAgIAorICAgIGZvciggaSA9IDA7IGkgPCBhbW91bnQ7IGkrKyApCisgICAgeworICAgICAgICBDVl9NQVRfRUxFTSgqY2xhc3NlcywgZmxvYXQsIDAsIGkpID0gKGZsb2F0KXNhbXBsZV9jbHNudW1baV07CisgICAgICAgIGN2R2V0Um93KHNhbXBsZSwgdmVjdCwgaSk7CisgICAgICAgIGNsc3MgPSBzYW1wbGVfY2xzbnVtW2ldOworICAgICAgICBjdk1hdE11bEFkZCh2ZWN0LCB1dG1hdHNbY2xzc10sIG1lYW5zW2Nsc3NdLCB2ZWN0KTsKKyAgICB9CisKKyAgICBpZiggIXNhbXBDbGFzc2VzICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCZjbGFzc2VzKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgY2xzbnVtOyBpKysgKQorICAgICAgICBjdlJlbGVhc2VNYXQoJnV0bWF0c1tpXSk7CisgICAgY3ZGcmVlKCZ1dG1hdHMpOworICAgIGN2RnJlZSgmc2FtcGxlX2Nsc251bSk7CisgICAgY3ZSZWxlYXNlTWF0KCZ2ZWN0KTsgICAgCit9CisKKworQ3ZNYXQqIGljdkdlbmVyYXRlUmFuZG9tQ2x1c3RlckNlbnRlcnMgKCBpbnQgc2VlZCwgY29uc3QgQ3ZNYXQqIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fb2ZfY2x1c3RlcnMsIEN2TWF0KiBfY2VudGVycyApCit7CisgICAgQ3ZNYXQqIGNlbnRlcnMgPSBfY2VudGVyczsKKworICAgIENWX0ZVTkNOQU1FKCJpY3ZHZW5lcmF0ZVJhbmRvbUNsdXN0ZXJDZW50ZXJzIik7CisgICAgX19CRUdJTl9fOworCisgICAgQ3ZSTkcgcm5nOworICAgIEN2TWF0IGRhdGFfY29tcCwgY2VudGVyc19jb21wOworICAgIEN2UG9pbnQgbWluTG9jLCBtYXhMb2M7IC8vIE5vdCB1c2VkLCBqdXN0IGZvciBmdW5jdGlvbiAiY3ZNaW5NYXhMb2MiCisgICAgZG91YmxlIG1pblZhbCwgbWF4VmFsOworICAgIGludCBpOworICAgIGludCBkaW0gPSBkYXRhID8gZGF0YS0+Y29scyA6IDA7CisKKyAgICBpZiggSUNWX0lTX01BVF9PRl9UWVBFKGRhdGEsIENWXzMyRkMxKSApCisgICAgeworICAgICAgICBpZiggX2NlbnRlcnMgJiYgIUlDVl9JU19NQVRfT0ZfVFlQRSAoX2NlbnRlcnMsIENWXzMyRkMxKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKENWX1N0c0JhZEFyZywiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggIV9jZW50ZXJzICkKKyAgICAgICAgICAgIENWX0NBTEwoY2VudGVycyA9IGN2Q3JlYXRlTWF0IChudW1fb2ZfY2x1c3RlcnMsIGRpbSwgQ1ZfMzJGQzEpKTsKKyAgICB9CisgICAgZWxzZSBpZiggSUNWX0lTX01BVF9PRl9UWVBFKGRhdGEsIENWXzY0RkMxKSApCisgICAgeworICAgICAgICBpZiggX2NlbnRlcnMgJiYgIUlDVl9JU19NQVRfT0ZfVFlQRSAoX2NlbnRlcnMsIENWXzY0RkMxKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0VSUk9SKENWX1N0c0JhZEFyZywiIik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggIV9jZW50ZXJzICkKKyAgICAgICAgICAgIENWX0NBTEwoY2VudGVycyA9IGN2Q3JlYXRlTWF0IChudW1fb2ZfY2x1c3RlcnMsIGRpbSwgQ1ZfNjRGQzEpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCIiKTsKKworICAgIGlmKCBudW1fb2ZfY2x1c3RlcnMgPCAxICkKKyAgICAgICAgQ1ZfRVJST1IgKENWX1N0c0JhZEFyZywiIik7CisKKyAgICBybmcgPSBjdlJORyhzZWVkKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgZGltOyBpKyspCisgICAgeworICAgICAgICBDVl9DQUxMKGN2R2V0Q29sIChkYXRhLCAmZGF0YV9jb21wLCBpKSk7CisgICAgICAgIENWX0NBTEwoY3ZNaW5NYXhMb2MgKCZkYXRhX2NvbXAsICZtaW5WYWwsICZtYXhWYWwsICZtaW5Mb2MsICZtYXhMb2MpKTsKKyAgICAgICAgQ1ZfQ0FMTChjdkdldENvbCAoY2VudGVycywgJmNlbnRlcnNfY29tcCwgaSkpOworICAgICAgICBDVl9DQUxMKGN2UmFuZEFyciAoJnJuZywgJmNlbnRlcnNfY29tcCwgQ1ZfUkFORF9VTkksIGN2U2NhbGFyQWxsKG1pblZhbCksIGN2U2NhbGFyQWxsKG1heFZhbCkpKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIChjdkdldEVyclN0YXR1cyAoKSA8IDApIHx8IChjZW50ZXJzICE9IF9jZW50ZXJzKSApCisgICAgICAgIGN2UmVsZWFzZU1hdCAoJmNlbnRlcnMpOworCisgICAgcmV0dXJuIF9jZW50ZXJzID8gX2NlbnRlcnMgOiBjZW50ZXJzOworfSAvLyBlbmQgb2YgaWN2R2VuZXJhdGVSYW5kb21DbHVzdGVyQ2VudGVycworCisvLyBCeSBTLiBEaWxtYW4gLSBiZWdpbiAtCisKKyNkZWZpbmUgSUNWX1JBTkRfTUFYICAgIDQyOTQ5NjcyOTYgLy8gPT0gMl4zMgorCitDVl9JTVBMIHZvaWQgY3ZSYW5kUm91bmRVbmkgKEN2TWF0KiBjZW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHJhZGl1c19zbWFsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgcmFkaXVzX2xhcmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogZGVzaXJlZF9tYXRyaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2Uk5HKiBybmdfc3RhdGVfcHRyKQoreworICAgIGZsb2F0IHJhZCwgbm9ybSwgY29lZmZpY2llbnQ7CisgICAgaW50IGRpbSwgc2l6ZSwgaSwgajsKKyAgICBDdk1hdCAqY292LCBzYW1wbGU7CisgICAgQ3ZSTkcgcm5nX2xvY2FsOworICAgIAorICAgIENWX0ZVTkNOQU1FKCJjdlJhbmRSb3VuZFVuaSIpOworICAgIF9fQkVHSU5fXworCisgICAgcm5nX2xvY2FsID0gKnJuZ19zdGF0ZV9wdHI7CisKKyAgICBDVl9BU1NFUlQgKChyYWRpdXNfc21hbGwgPj0gMCkgJiYgCisgICAgICAgICAgICAgICAocmFkaXVzX2xhcmdlID4gMCkgJiYgCisgICAgICAgICAgICAgICAocmFkaXVzX3NtYWxsIDw9IHJhZGl1c19sYXJnZSkpOworICAgIENWX0FTU0VSVCAoY2VudGVyICYmIGRlc2lyZWRfbWF0cml4ICYmIHJuZ19zdGF0ZV9wdHIpOworICAgIENWX0FTU0VSVCAoY2VudGVyLT5yb3dzID09IDEpOworICAgIENWX0FTU0VSVCAoY2VudGVyLT5jb2xzID09IGRlc2lyZWRfbWF0cml4LT5jb2xzKTsKKworICAgIGRpbSA9IGRlc2lyZWRfbWF0cml4LT5jb2xzOworICAgIHNpemUgPSBkZXNpcmVkX21hdHJpeC0+cm93czsKKyAgICBjb3YgPSBjdkNyZWF0ZU1hdCAoZGltLCBkaW0sIENWXzMyRkMxKTsKKyAgICBjdlNldElkZW50aXR5IChjb3YpOworICAgIGN2UmFuZE1WTm9ybWFsIChjZW50ZXIsIGNvdiwgZGVzaXJlZF9tYXRyaXgsICZybmdfbG9jYWwpOworCisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAgICB7CisgICAgICAgIHJhZCA9IChmbG9hdCkoY3ZSYW5kUmVhbCgmcm5nX2xvY2FsKSoocmFkaXVzX2xhcmdlIC0gcmFkaXVzX3NtYWxsKSArIHJhZGl1c19zbWFsbCk7CisgICAgICAgIGN2R2V0Um93IChkZXNpcmVkX21hdHJpeCwgJnNhbXBsZSwgaSk7CisgICAgICAgIG5vcm0gPSAoZmxvYXQpIGN2Tm9ybSAoJnNhbXBsZSwgMCwgQ1ZfTDIpOworICAgICAgICBjb2VmZmljaWVudCA9IHJhZCAvIG5vcm07CisgICAgICAgIGZvciAoaiA9IDA7IGogPCBkaW07IGorKykKKyAgICAgICAgICAgICBDVl9NQVRfRUxFTSAoc2FtcGxlLCBmbG9hdCwgMCwgaikgKj0gY29lZmZpY2llbnQ7CisgICAgfQorCisgICAgX19FTkRfXworCit9CisKKy8vIEJ5IFMuIERpbG1hbiAtIGVuZCAtCisKKy8qIEFpaiA8LSBBamkgZm9yIGkgPiBqIGlmIGxvd2VyX3RvX3VwcGVyICE9IDAKKyAgICAgICAgICAgICAgZm9yIGkgPCBqIGlmIGxvd2VyX3RvX3VwcGVyID0gMCAqLwordm9pZCBjdkNvbXBsZXRlU3ltbSggQ3ZNYXQqIG1hdHJpeCwgaW50IGxvd2VyX3RvX3VwcGVyICkKK3sKKyAgICBDVl9GVU5DTkFNRSgiY3ZDb21wbGV0ZVN5bW0iKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCByb3dzLCBjb2xzOworICAgIGludCBpLCBqOworICAgIGludCBzdGVwOworCisgICAgaWYoICFDVl9JU19NQVQobWF0cml4KSkKKyAgICAgICAgQ1ZfRVJST1IoQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBtYXRyaXggYXJndW1lbnQiKTsKKworICAgIHJvd3MgPSBtYXRyaXgtPnJvd3M7CisgICAgY29scyA9IG1hdHJpeC0+Y29sczsKKyAgICBzdGVwID0gbWF0cml4LT5zdGVwIC8gQ1ZfRUxFTV9TSVpFKG1hdHJpeC0+dHlwZSk7CisKKyAgICBzd2l0Y2goQ1ZfTUFUX1RZUEUobWF0cml4LT50eXBlKSkKKyAgICB7CisgICAgY2FzZSBDVl8zMkZDMToKKyAgICAgICAgeworICAgICAgICBmbG9hdCogZHN0ID0gbWF0cml4LT5kYXRhLmZsOworICAgICAgICBpZiggIWxvd2VyX3RvX3VwcGVyICkKKyAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCByb3dzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMgPSAoY29uc3QgZmxvYXQqKShtYXRyaXgtPmRhdGEuZmwgKyBpKTsKKyAgICAgICAgICAgICAgICBkc3QgKz0gc3RlcDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgaTsgaisrLCBzcmMgKz0gc3RlcCApCisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IHNyY1swXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJvd3MtMTsgaSsrLCBkc3QgKz0gc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHNyYyA9IChjb25zdCBmbG9hdCopKG1hdHJpeC0+ZGF0YS5mbCArIChpKzEpKnN0ZXAgKyBpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBpKzE7IGogPCBjb2xzOyBqKyssIHNyYyArPSBzdGVwICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfNjRGQzE6CisgICAgICAgIHsKKyAgICAgICAgZG91YmxlKiBkc3QgPSBtYXRyaXgtPmRhdGEuZGI7CisgICAgICAgIGlmKCAhbG93ZXJfdG9fdXBwZXIgKQorICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IHJvd3M7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBzcmMgPSAoY29uc3QgZG91YmxlKikobWF0cml4LT5kYXRhLmRiICsgaSk7CisgICAgICAgICAgICAgICAgZHN0ICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGk7IGorKywgc3JjICs9IHN0ZXAgKQorICAgICAgICAgICAgICAgICAgICBkc3Rbal0gPSBzcmNbMF07CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCByb3dzLTE7IGkrKywgZHN0ICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjID0gKGNvbnN0IGRvdWJsZSopKG1hdHJpeC0+ZGF0YS5kYiArIChpKzEpKnN0ZXAgKyBpKTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBpKzE7IGogPCBjb2xzOyBqKyssIHNyYyArPSBzdGVwICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjWzBdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKworc3RhdGljIGludCBDVl9DREVDTAoraWN2Q21wSW50ZWdlcnMoIGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIgKQoreworICAgIHJldHVybiAqKGNvbnN0IGludCopYSAtICooY29uc3QgaW50KiliOworfQorCisKK3N0YXRpYyBpbnQgQ1ZfQ0RFQ0wKK2ljdkNtcEludGVnZXJzUHRyKCBjb25zdCB2b2lkKiBfYSwgY29uc3Qgdm9pZCogX2IgKQoreworICAgIGludCBhID0gKiooY29uc3QgaW50KiopX2E7CisgICAgaW50IGIgPSAqKihjb25zdCBpbnQqKilfYjsKKyAgICByZXR1cm4gKGEgPCBiID8gLTEgOiAwKXwoYSA+IGIpOworfQorCisKK3N0YXRpYyBpbnQgaWN2Q21wU3BhcnNlVmVjRWxlbXMoIGNvbnN0IHZvaWQqIGEsIGNvbnN0IHZvaWQqIGIgKQoreworICAgIHJldHVybiAoKEN2U3BhcnNlVmVjRWxlbTMyZiopYSktPmlkeCAtICgoQ3ZTcGFyc2VWZWNFbGVtMzJmKiliKS0+aWR4OworfQorCisKK0N2TWF0KgorY3ZQcmVwcm9jZXNzSW5kZXhBcnJheSggY29uc3QgQ3ZNYXQqIGlkeF9hcnIsIGludCBkYXRhX2Fycl9zaXplLCBib29sIGNoZWNrX2Zvcl9kdXBsaWNhdGVzICkKK3sKKyAgICBDdk1hdCogaWR4ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZQcmVwcm9jZXNzSW5kZXhBcnJheSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBpZHhfdG90YWwsIGlkeF9zZWxlY3RlZCA9IDAsIHN0ZXAsIHR5cGUsIHByZXYgPSBJTlRfTUlOLCBpc19zb3J0ZWQgPSAxOworICAgIHVjaGFyKiBzcmNiID0gMDsKKyAgICBpbnQqIHNyY2kgPSAwOworICAgIGludCogZHN0aTsKKyAgICAKKyAgICBpZiggIUNWX0lTX01BVChpZHhfYXJyKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGluZGV4IGFycmF5IiApOworCisgICAgaWYoIGlkeF9hcnItPnJvd3MgIT0gMSAmJiBpZHhfYXJyLT5jb2xzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgInRoZSBpbmRleCBhcnJheSBtdXN0IGJlIDEtZGltZW5zaW9uYWwiICk7CisKKyAgICBpZHhfdG90YWwgPSBpZHhfYXJyLT5yb3dzICsgaWR4X2Fyci0+Y29scyAtIDE7CisgICAgc3JjYiA9IGlkeF9hcnItPmRhdGEucHRyOworICAgIHNyY2kgPSBpZHhfYXJyLT5kYXRhLmk7CisKKyAgICB0eXBlID0gQ1ZfTUFUX1RZUEUoaWR4X2Fyci0+dHlwZSk7CisgICAgc3RlcCA9IENWX0lTX01BVF9DT05UKGlkeF9hcnItPnR5cGUpID8gMSA6IGlkeF9hcnItPnN0ZXAvQ1ZfRUxFTV9TSVpFKHR5cGUpOworCisgICAgc3dpdGNoKCB0eXBlICkKKyAgICB7CisgICAgY2FzZSBDVl84VUMxOgorICAgIGNhc2UgQ1ZfOFNDMToKKyAgICAgICAgLy8gaWR4X2FyciBpcyBhcnJheSBvZiAxJ3MgYW5kIDAncyAtCisgICAgICAgIC8vIGkuZS4gaXQgaXMgYSBtYXNrIG9mIHRoZSBzZWxlY3RlZCBjb21wb25lbnRzCisgICAgICAgIGlmKCBpZHhfdG90YWwgIT0gZGF0YV9hcnJfc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAiQ29tcG9uZW50IG1hc2sgc2hvdWxkIGNvbnRhaW4gYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IHZhcmlhYmxlcyIgKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpZHhfdG90YWw7IGkrKyApCisgICAgICAgICAgICBpZHhfc2VsZWN0ZWQgKz0gc3JjYltpKnN0ZXBdICE9IDA7CisKKyAgICAgICAgaWYoIGlkeF9zZWxlY3RlZCA9PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiTm8gY29tcG9uZW50cy9pbnB1dF92YXJpYWJsZXMgaXMgc2VsZWN0ZWQhIiApOworCisgICAgICAgIGlmKCBpZHhfc2VsZWN0ZWQgPT0gaWR4X3RvdGFsICkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1ZfMzJTQzE6CisgICAgICAgIC8vIGlkeF9hcnIgaXMgYXJyYXkgb2YgaW50ZWdlciBpbmRpY2VzIG9mIHNlbGVjdGVkIGNvbXBvbmVudHMKKyAgICAgICAgaWYoIGlkeF90b3RhbCA+IGRhdGFfYXJyX3NpemUgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICAgICAiaW5kZXggYXJyYXkgbWF5IG5vdCBjb250YWluIG1vcmUgZWxlbWVudHMgdGhhbiB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IHZhcmlhYmxlcyIgKTsKKyAgICAgICAgaWR4X3NlbGVjdGVkID0gaWR4X3RvdGFsOworICAgICAgICAvLyBjaGVjayBpZiBzb3J0ZWQgYWxyZWFkeQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgaWR4X3RvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsID0gc3JjaVtpKnN0ZXBdOworICAgICAgICAgICAgaWYoIHZhbCA+PSBwcmV2ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpc19zb3J0ZWQgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9IHZhbDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbnN1cHBvcnRlZCBpbmRleCBhcnJheSBkYXRhIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoaXQgc2hvdWxkIGJlIDh1QzEsIDhzQzEgb3IgMzJzQzEpIiApOworICAgIH0KKworICAgIENWX0NBTEwoIGlkeCA9IGN2Q3JlYXRlTWF0KCAxLCBpZHhfc2VsZWN0ZWQsIENWXzMyU0MxICkpOworICAgIGRzdGkgPSBpZHgtPmRhdGEuaTsKKyAgICAKKyAgICBpZiggdHlwZSA8IENWXzMyU0MxICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBpZHhfdG90YWw7IGkrKyApCisgICAgICAgICAgICBpZiggc3JjYltpKnN0ZXBdICkKKyAgICAgICAgICAgICAgICAqZHN0aSsrID0gaTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGlkeF90b3RhbDsgaSsrICkKKyAgICAgICAgICAgIGRzdGlbaV0gPSBzcmNpW2kqc3RlcF07CisgICAgICAgIAorICAgICAgICBpZiggIWlzX3NvcnRlZCApCisgICAgICAgICAgICBxc29ydCggZHN0aSwgaWR4X3RvdGFsLCBzaXplb2YoZHN0aVswXSksIGljdkNtcEludGVnZXJzICk7CisgICAgICAgIAorICAgICAgICBpZiggZHN0aVswXSA8IDAgfHwgZHN0aVtpZHhfdG90YWwtMV0gPj0gZGF0YV9hcnJfc2l6ZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInRoZSBpbmRleCBhcnJheSBlbGVtZW50cyBhcmUgb3V0IG9mIHJhbmdlIiApOworCisgICAgICAgIGlmKCBjaGVja19mb3JfZHVwbGljYXRlcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBpZHhfdG90YWw7IGkrKyApCisgICAgICAgICAgICAgICAgaWYoIGRzdGlbaV0gPD0gZHN0aVtpLTFdICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZXJlIGFyZSBkdXBsaWNhdGVkIGluZGV4IGFycmF5IGVsZW1lbnRzIiApOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJmlkeCApOworCisgICAgcmV0dXJuIGlkeDsKK30KKworCitDdk1hdCoKK2N2UHJlcHJvY2Vzc1ZhclR5cGUoIGNvbnN0IEN2TWF0KiB2YXJfdHlwZSwgY29uc3QgQ3ZNYXQqIHZhcl9pZHgsCisgICAgICAgICAgICAgICAgICAgICBpbnQgdmFyX2FsbCwgaW50KiByZXNwb25zZV90eXBlICkKK3sKKyAgICBDdk1hdCogb3V0X3Zhcl90eXBlID0gMDsKKyAgICBDVl9GVU5DTkFNRSggImN2UHJlcHJvY2Vzc1ZhclR5cGUiICk7CisKKyAgICBpZiggcmVzcG9uc2VfdHlwZSApCisgICAgICAgICpyZXNwb25zZV90eXBlID0gLTE7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgdG1fc2l6ZSwgdG1fc3RlcDsKKyAgICBpbnQqIG1hcCA9IDA7CisgICAgY29uc3QgdWNoYXIqIHNyYzsKKyAgICB1Y2hhciogZHN0OworICAgIGludCB2YXJfY291bnQgPSB2YXJfYWxsOworICAgICAgICAKKyAgICBpZiggIUNWX0lTX01BVCh2YXJfdHlwZSkgKQorICAgICAgICBDVl9FUlJPUiggdmFyX3R5cGUgPyBDVl9TdHNCYWRBcmcgOiBDVl9TdHNOdWxsUHRyLCAiSW52YWxpZCBvciBhYnNlbnQgdmFyX3R5cGUgYXJyYXkiICk7CisKKyAgICBpZiggdmFyX3R5cGUtPnJvd3MgIT0gMSAmJiB2YXJfdHlwZS0+Y29scyAhPSAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJ2YXJfdHlwZSBhcnJheSBtdXN0IGJlIDEtZGltZW5zaW9uYWwiICk7CisKKyAgICBpZiggIUNWX0lTX01BU0tfQVJSKHZhcl90eXBlKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAidHlwZSBtYXNrIG11c3QgYmUgOHVDMSBvciA4c0MxIGFycmF5IiApOworCisgICAgdG1fc2l6ZSA9IHZhcl90eXBlLT5yb3dzICsgdmFyX3R5cGUtPmNvbHMgLSAxOworICAgIHRtX3N0ZXAgPSB2YXJfdHlwZS0+c3RlcCA/IHZhcl90eXBlLT5zdGVwL0NWX0VMRU1fU0laRSh2YXJfdHlwZS0+dHlwZSkgOiAxOworCisgICAgaWYoIC8qdG1fc2l6ZSAhPSB2YXJfY291bnQgJiYqLyB0bV9zaXplICE9IHZhcl9jb3VudCArIDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAidHlwZSBtYXNrIG11c3QgYmUgb2YgPGlucHV0IHZhciBjb3VudD4gKyAxIHNpemUiICk7CisKKyAgICBpZiggcmVzcG9uc2VfdHlwZSAmJiB0bV9zaXplID4gdmFyX2NvdW50ICkKKyAgICAgICAgKnJlc3BvbnNlX3R5cGUgPSB2YXJfdHlwZS0+ZGF0YS5wdHJbdmFyX2NvdW50KnRtX3N0ZXBdICE9IDA7CisKKyAgICBpZiggdmFyX2lkeCApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVCh2YXJfaWR4KSB8fCBDVl9NQVRfVFlQRSh2YXJfaWR4LT50eXBlKSAhPSBDVl8zMlNDMSB8fAorICAgICAgICAgICAgdmFyX2lkeC0+cm93cyAhPSAxICYmIHZhcl9pZHgtPmNvbHMgIT0gMSB8fCAhQ1ZfSVNfTUFUX0NPTlQodmFyX2lkeC0+dHlwZSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInZhciBpbmRleCBhcnJheSBzaG91bGQgYmUgY29udGludW91cyAxLWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yIiApOworICAgICAgICBpZiggdmFyX2lkeC0+cm93cyArIHZhcl9pZHgtPmNvbHMgLSAxID4gdmFyX2NvdW50ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAidmFyIGluZGV4IGFycmF5IGlzIHRvbyBsYXJnZSIgKTsKKyAgICAgICAgbWFwID0gdmFyX2lkeC0+ZGF0YS5pOworICAgICAgICB2YXJfY291bnQgPSB2YXJfaWR4LT5yb3dzICsgdmFyX2lkeC0+Y29scyAtIDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggb3V0X3Zhcl90eXBlID0gY3ZDcmVhdGVNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfOFVDMSApKTsKKyAgICBzcmMgPSB2YXJfdHlwZS0+ZGF0YS5wdHI7CisgICAgZHN0ID0gb3V0X3Zhcl90eXBlLT5kYXRhLnB0cjsKKworICAgIGZvciggaSA9IDA7IGkgPCB2YXJfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gbWFwID8gbWFwW2ldIDogaTsKKyAgICAgICAgYXNzZXJ0KCAodW5zaWduZWQpaWR4IDwgKHVuc2lnbmVkKXRtX3NpemUgKTsKKyAgICAgICAgZHN0W2ldID0gKHVjaGFyKShzcmNbaWR4KnRtX3N0ZXBdICE9IDApOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gb3V0X3Zhcl90eXBlOworfQorCisKK0N2TWF0KgorY3ZQcmVwcm9jZXNzT3JkZXJlZFJlc3BvbnNlcyggY29uc3QgQ3ZNYXQqIHJlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIHNhbXBsZV9pZHgsIGludCBzYW1wbGVfYWxsICkKK3sKKyAgICBDdk1hdCogb3V0X3Jlc3BvbnNlcyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UHJlcHJvY2Vzc09yZGVyZWRSZXNwb25zZXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgcl90eXBlLCByX3N0ZXA7CisgICAgY29uc3QgaW50KiBtYXAgPSAwOworICAgIGZsb2F0KiBkc3Q7CisgICAgaW50IHNhbXBsZV9jb3VudCA9IHNhbXBsZV9hbGw7CisKKyAgICBpZiggIUNWX0lTX01BVChyZXNwb25zZXMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgcmVzcG9uc2UgYXJyYXkiICk7CisKKyAgICBpZiggcmVzcG9uc2VzLT5yb3dzICE9IDEgJiYgcmVzcG9uc2VzLT5jb2xzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlJlc3BvbnNlIGFycmF5IG11c3QgYmUgMS1kaW1lbnNpb25hbCIgKTsKKworICAgIGlmKCByZXNwb25zZXMtPnJvd3MgKyByZXNwb25zZXMtPmNvbHMgLSAxICE9IHNhbXBsZV9jb3VudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgIlJlc3BvbnNlIGFycmF5IG11c3QgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyIgKTsKKworICAgIHJfdHlwZSA9IENWX01BVF9UWVBFKHJlc3BvbnNlcy0+dHlwZSk7CisgICAgaWYoIHJfdHlwZSAhPSBDVl8zMkZDMSAmJiByX3R5cGUgIT0gQ1ZfMzJTQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbnN1cHBvcnRlZCByZXNwb25zZSB0eXBlIiApOworCisgICAgcl9zdGVwID0gcmVzcG9uc2VzLT5zdGVwID8gcmVzcG9uc2VzLT5zdGVwIC8gQ1ZfRUxFTV9TSVpFKHJlc3BvbnNlcy0+dHlwZSkgOiAxOworCisgICAgaWYoIHJfdHlwZSA9PSBDVl8zMkZDMSAmJiBDVl9JU19NQVRfQ09OVChyZXNwb25zZXMtPnR5cGUpICYmICFzYW1wbGVfaWR4ICkKKyAgICB7CisgICAgICAgIG91dF9yZXNwb25zZXMgPSAoQ3ZNYXQqKXJlc3BvbnNlczsKKyAgICAgICAgRVhJVDsKKyAgICB9CisKKyAgICBpZiggc2FtcGxlX2lkeCApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChzYW1wbGVfaWR4KSB8fCBDVl9NQVRfVFlQRShzYW1wbGVfaWR4LT50eXBlKSAhPSBDVl8zMlNDMSB8fAorICAgICAgICAgICAgc2FtcGxlX2lkeC0+cm93cyAhPSAxICYmIHNhbXBsZV9pZHgtPmNvbHMgIT0gMSB8fCAhQ1ZfSVNfTUFUX0NPTlQoc2FtcGxlX2lkeC0+dHlwZSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInNhbXBsZSBpbmRleCBhcnJheSBzaG91bGQgYmUgY29udGludW91cyAxLWRpbWVuc2lvbmFsIGludGVnZXIgdmVjdG9yIiApOworICAgICAgICBpZiggc2FtcGxlX2lkeC0+cm93cyArIHNhbXBsZV9pZHgtPmNvbHMgLSAxID4gc2FtcGxlX2NvdW50ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAic2FtcGxlIGluZGV4IGFycmF5IGlzIHRvbyBsYXJnZSIgKTsKKyAgICAgICAgbWFwID0gc2FtcGxlX2lkeC0+ZGF0YS5pOworICAgICAgICBzYW1wbGVfY291bnQgPSBzYW1wbGVfaWR4LT5yb3dzICsgc2FtcGxlX2lkeC0+Y29scyAtIDE7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggb3V0X3Jlc3BvbnNlcyA9IGN2Q3JlYXRlTWF0KCAxLCBzYW1wbGVfY291bnQsIENWXzMyRkMxICkpOworICAgIAorICAgIGRzdCA9IG91dF9yZXNwb25zZXMtPmRhdGEuZmw7CisgICAgaWYoIHJfdHlwZSA9PSBDVl8zMkZDMSApCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gcmVzcG9uc2VzLT5kYXRhLmZsOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbWFwID8gbWFwW2ldIDogaTsKKyAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWlkeCA8ICh1bnNpZ25lZClzYW1wbGVfYWxsICk7CisgICAgICAgICAgICBkc3RbaV0gPSBzcmNbaWR4KnJfc3RlcF07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBzcmMgPSByZXNwb25zZXMtPmRhdGEuaTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IG1hcCA/IG1hcFtpXSA6IGk7CisgICAgICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClpZHggPCAodW5zaWduZWQpc2FtcGxlX2FsbCApOworICAgICAgICAgICAgZHN0W2ldID0gKGZsb2F0KXNyY1tpZHgqcl9zdGVwXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gb3V0X3Jlc3BvbnNlczsKK30KKworQ3ZNYXQqCitjdlByZXByb2Nlc3NDYXRlZ29yaWNhbFJlc3BvbnNlcyggY29uc3QgQ3ZNYXQqIHJlc3BvbnNlcywKKyAgICBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCwgaW50IHNhbXBsZV9hbGwsCisgICAgQ3ZNYXQqKiBvdXRfcmVzcG9uc2VfbWFwLCBDdk1hdCoqIGNsYXNzX2NvdW50cyApCit7CisgICAgQ3ZNYXQqIG91dF9yZXNwb25zZXMgPSAwOworICAgIGludCoqIHJlc3BvbnNlX3B0ciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggImN2UHJlcHJvY2Vzc0NhdGVnb3JpY2FsUmVzcG9uc2VzIiApOworCisgICAgaWYoIG91dF9yZXNwb25zZV9tYXAgKQorICAgICAgICAqb3V0X3Jlc3BvbnNlX21hcCA9IDA7CisKKyAgICBpZiggY2xhc3NfY291bnRzICkKKyAgICAgICAgKmNsYXNzX2NvdW50cyA9IDA7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgcl90eXBlLCByX3N0ZXA7CisgICAgaW50IGNsc19jb3VudCA9IDEsIHByZXZfY2xzLCBwcmV2X2k7CisgICAgY29uc3QgaW50KiBtYXAgPSAwOworICAgIGNvbnN0IGludCogc3JjaTsKKyAgICBjb25zdCBmbG9hdCogc3JjZmw7CisgICAgaW50KiBkc3Q7CisgICAgaW50KiBjbHNfbWFwOworICAgIGludCogY2xzX2NvdW50cyA9IDA7CisgICAgaW50IHNhbXBsZV9jb3VudCA9IHNhbXBsZV9hbGw7CisKKyAgICBpZiggIUNWX0lTX01BVChyZXNwb25zZXMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgcmVzcG9uc2UgYXJyYXkiICk7CisKKyAgICBpZiggcmVzcG9uc2VzLT5yb3dzICE9IDEgJiYgcmVzcG9uc2VzLT5jb2xzICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlJlc3BvbnNlIGFycmF5IG11c3QgYmUgMS1kaW1lbnNpb25hbCIgKTsKKworICAgIGlmKCByZXNwb25zZXMtPnJvd3MgKyByZXNwb25zZXMtPmNvbHMgLSAxICE9IHNhbXBsZV9jb3VudCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgIlJlc3BvbnNlIGFycmF5IG11c3QgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyIgKTsKKworICAgIHJfdHlwZSA9IENWX01BVF9UWVBFKHJlc3BvbnNlcy0+dHlwZSk7CisgICAgaWYoIHJfdHlwZSAhPSBDVl8zMkZDMSAmJiByX3R5cGUgIT0gQ1ZfMzJTQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbnN1cHBvcnRlZCByZXNwb25zZSB0eXBlIiApOworCisgICAgcl9zdGVwID0gcmVzcG9uc2VzLT5zdGVwID8gcmVzcG9uc2VzLT5zdGVwIC8gQ1ZfRUxFTV9TSVpFKHJlc3BvbnNlcy0+dHlwZSkgOiAxOworCisgICAgaWYoIHNhbXBsZV9pZHggKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoc2FtcGxlX2lkeCkgfHwgQ1ZfTUFUX1RZUEUoc2FtcGxlX2lkeC0+dHlwZSkgIT0gQ1ZfMzJTQzEgfHwKKyAgICAgICAgICAgIHNhbXBsZV9pZHgtPnJvd3MgIT0gMSAmJiBzYW1wbGVfaWR4LT5jb2xzICE9IDEgfHwgIUNWX0lTX01BVF9DT05UKHNhbXBsZV9pZHgtPnR5cGUpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJzYW1wbGUgaW5kZXggYXJyYXkgc2hvdWxkIGJlIGNvbnRpbnVvdXMgMS1kaW1lbnNpb25hbCBpbnRlZ2VyIHZlY3RvciIgKTsKKyAgICAgICAgaWYoIHNhbXBsZV9pZHgtPnJvd3MgKyBzYW1wbGVfaWR4LT5jb2xzIC0gMSA+IHNhbXBsZV9jb3VudCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgInNhbXBsZSBpbmRleCBhcnJheSBpcyB0b28gbGFyZ2UiICk7CisgICAgICAgIG1hcCA9IHNhbXBsZV9pZHgtPmRhdGEuaTsKKyAgICAgICAgc2FtcGxlX2NvdW50ID0gc2FtcGxlX2lkeC0+cm93cyArIHNhbXBsZV9pZHgtPmNvbHMgLSAxOworICAgIH0KKworICAgIENWX0NBTEwoIG91dF9yZXNwb25zZXMgPSBjdkNyZWF0ZU1hdCggMSwgc2FtcGxlX2NvdW50LCBDVl8zMlNDMSApKTsKKworICAgIGlmKCAhb3V0X3Jlc3BvbnNlX21hcCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAib3V0X3Jlc3BvbnNlX21hcCBwb2ludGVyIGlzIE5VTEwiICk7CisKKyAgICBDVl9DQUxMKCByZXNwb25zZV9wdHIgPSAoaW50KiopY3ZBbGxvYyggc2FtcGxlX2NvdW50KnNpemVvZihyZXNwb25zZV9wdHJbMF0pKSk7CisKKyAgICBzcmNpID0gcmVzcG9uc2VzLT5kYXRhLmk7CisgICAgc3JjZmwgPSByZXNwb25zZXMtPmRhdGEuZmw7CisgICAgZHN0ID0gb3V0X3Jlc3BvbnNlcy0+ZGF0YS5pOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBtYXAgPyBtYXBbaV0gOiBpOworICAgICAgICBhc3NlcnQoICh1bnNpZ25lZClpZHggPCAodW5zaWduZWQpc2FtcGxlX2FsbCApOworICAgICAgICBpZiggcl90eXBlID09IENWXzMyU0MxICkKKyAgICAgICAgICAgIGRzdFtpXSA9IHNyY2lbaWR4KnJfc3RlcF07CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQgcmYgPSBzcmNmbFtpZHgqcl9zdGVwXTsKKyAgICAgICAgICAgIGludCByaSA9IGN2Um91bmQocmYpOworICAgICAgICAgICAgaWYoIHJpICE9IHJmICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZlsxMDBdOworICAgICAgICAgICAgICAgIHNwcmludGYoIGJ1ZiwgInJlc3BvbnNlICMlZCBpcyBub3QgaW50ZWdyYWwiLCBpZHggKTsKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBidWYgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRzdFtpXSA9IHJpOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlX3B0cltpXSA9IGRzdCArIGk7CisgICAgfQorCisgICAgcXNvcnQoIHJlc3BvbnNlX3B0ciwgc2FtcGxlX2NvdW50LCBzaXplb2YoaW50KiksIGljdkNtcEludGVnZXJzUHRyICk7CisKKyAgICAvLyBjb3VudCB0aGUgY2xhc3NlcworICAgIGZvciggaSA9IDE7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgIGNsc19jb3VudCArPSAqcmVzcG9uc2VfcHRyW2ldICE9ICpyZXNwb25zZV9wdHJbaS0xXTsKKworICAgIGlmKCBjbHNfY291bnQgPCAyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgY2xhc3MiICk7CisKKyAgICBDVl9DQUxMKCAqb3V0X3Jlc3BvbnNlX21hcCA9IGN2Q3JlYXRlTWF0KCAxLCBjbHNfY291bnQsIENWXzMyU0MxICkpOworCisgICAgaWYoIGNsYXNzX2NvdW50cyApCisgICAgeworICAgICAgICBDVl9DQUxMKCAqY2xhc3NfY291bnRzID0gY3ZDcmVhdGVNYXQoIDEsIGNsc19jb3VudCwgQ1ZfMzJTQzEgKSk7CisgICAgICAgIGNsc19jb3VudHMgPSAoKmNsYXNzX2NvdW50cyktPmRhdGEuaTsKKyAgICB9CisKKyAgICAvLyBjb21wYWN0IHRoZSBjbGFzcyBpbmRpY2VzIGFuZCBidWlsZCB0aGUgbWFwCisgICAgcHJldl9jbHMgPSB+KnJlc3BvbnNlX3B0clswXTsKKyAgICBjbHNfY291bnQgPSAtMTsKKyAgICBjbHNfbWFwID0gKCpvdXRfcmVzcG9uc2VfbWFwKS0+ZGF0YS5pOworCisgICAgZm9yKCBpID0gMCwgcHJldl9pID0gLTE7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpbnQgY3VyX2NscyA9ICpyZXNwb25zZV9wdHJbaV07CisgICAgICAgIGlmKCBjdXJfY2xzICE9IHByZXZfY2xzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNsc19jb3VudHMgJiYgY2xzX2NvdW50ID49IDAgKQorICAgICAgICAgICAgICAgIGNsc19jb3VudHNbY2xzX2NvdW50XSA9IGkgLSBwcmV2X2k7CisgICAgICAgICAgICBjbHNfbWFwWysrY2xzX2NvdW50XSA9IHByZXZfY2xzID0gY3VyX2NsczsKKyAgICAgICAgICAgIHByZXZfaSA9IGk7CisgICAgICAgIH0KKyAgICAgICAgKnJlc3BvbnNlX3B0cltpXSA9IGNsc19jb3VudDsKKyAgICB9CisgICAgCisgICAgaWYoIGNsc19jb3VudHMgKQorICAgICAgICBjbHNfY291bnRzW2Nsc19jb3VudF0gPSBpIC0gcHJldl9pOworCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnJlc3BvbnNlX3B0ciApOworCisgICAgcmV0dXJuIG91dF9yZXNwb25zZXM7Cit9CisKKworY29uc3QgZmxvYXQqKgorY3ZHZXRUcmFpblNhbXBsZXMoIGNvbnN0IEN2TWF0KiB0cmFpbl9kYXRhLCBpbnQgdGZsYWcsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHZhcl9pZHgsIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4LAorICAgICAgICAgICAgICAgICAgIGludCogX3Zhcl9jb3VudCwgaW50KiBfc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgIGJvb2wgYWx3YXlzX2NvcHlfZGF0YSApCit7CisgICAgZmxvYXQqKiBzYW1wbGVzID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2R2V0VHJhaW5TYW1wbGVzIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGludCBpLCBqLCB2YXJfY291bnQsIHNhbXBsZV9jb3VudCwgc19zdGVwLCB2X3N0ZXA7CisgICAgYm9vbCBjb3B5X2RhdGE7CisgICAgY29uc3QgZmxvYXQqIGRhdGE7CisgICAgY29uc3QgaW50ICpzX2lkeCwgKnZfaWR4OworCisgICAgaWYoICFDVl9JU19NQVQodHJhaW5fZGF0YSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBvciBOVUxMIHRyYWluaW5nIGRhdGEgbWF0cml4IiApOworCisgICAgdmFyX2NvdW50ID0gdmFyX2lkeCA/IHZhcl9pZHgtPmNvbHMgKyB2YXJfaWR4LT5yb3dzIC0gMSA6CisgICAgICAgICAgICAgICAgdGZsYWcgPT0gQ1ZfUk9XX1NBTVBMRSA/IHRyYWluX2RhdGEtPmNvbHMgOiB0cmFpbl9kYXRhLT5yb3dzOworICAgIHNhbXBsZV9jb3VudCA9IHNhbXBsZV9pZHggPyBzYW1wbGVfaWR4LT5jb2xzICsgc2FtcGxlX2lkeC0+cm93cyAtIDEgOgorICAgICAgICAgICAgICAgICAgIHRmbGFnID09IENWX1JPV19TQU1QTEUgPyB0cmFpbl9kYXRhLT5yb3dzIDogdHJhaW5fZGF0YS0+Y29sczsKKworICAgIGlmKCBfdmFyX2NvdW50ICkKKyAgICAgICAgKl92YXJfY291bnQgPSB2YXJfY291bnQ7CisKKyAgICBpZiggX3NhbXBsZV9jb3VudCApCisgICAgICAgICpfc2FtcGxlX2NvdW50ID0gc2FtcGxlX2NvdW50OworCisgICAgY29weV9kYXRhID0gdGZsYWcgIT0gQ1ZfUk9XX1NBTVBMRSB8fCB2YXJfaWR4IHx8IGFsd2F5c19jb3B5X2RhdGE7CisgICAgCisgICAgQ1ZfQ0FMTCggc2FtcGxlcyA9IChmbG9hdCoqKWN2QWxsb2Moc2FtcGxlX2NvdW50KnNpemVvZihzYW1wbGVzWzBdKSArCisgICAgICAgICAgICAgICAgKGNvcHlfZGF0YSA/IDEgOiAwKSp2YXJfY291bnQqc2FtcGxlX2NvdW50KnNpemVvZihzYW1wbGVzWzBdWzBdKSkgKTsKKyAgICBkYXRhID0gdHJhaW5fZGF0YS0+ZGF0YS5mbDsKKyAgICBzX3N0ZXAgPSB0cmFpbl9kYXRhLT5zdGVwIC8gc2l6ZW9mKHNhbXBsZXNbMF1bMF0pOworICAgIHZfc3RlcCA9IDE7CisgICAgc19pZHggPSBzYW1wbGVfaWR4ID8gc2FtcGxlX2lkeC0+ZGF0YS5pIDogMDsKKyAgICB2X2lkeCA9IHZhcl9pZHggPyB2YXJfaWR4LT5kYXRhLmkgOiAwOworCisgICAgaWYoICFjb3B5X2RhdGEgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHNhbXBsZXNbaV0gPSAoZmxvYXQqKShkYXRhICsgKHNfaWR4ID8gc19pZHhbaV0gOiBpKSpzX3N0ZXApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzYW1wbGVzWzBdID0gKGZsb2F0Kikoc2FtcGxlcyArIHNhbXBsZV9jb3VudCk7CisgICAgICAgIGlmKCB0ZmxhZyAhPSBDVl9ST1dfU0FNUExFICkKKyAgICAgICAgICAgIENWX1NXQVAoIHNfc3RlcCwgdl9zdGVwLCBpICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIGRzdCA9IHNhbXBsZXNbaV0gPSBzYW1wbGVzWzBdICsgaSp2YXJfY291bnQ7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gZGF0YSArIChzX2lkeCA/IHNfaWR4W2ldIDogaSkqc19zdGVwOworCisgICAgICAgICAgICBpZiggIXZfaWR4ICkKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgdmFyX2NvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICBkc3Rbal0gPSBzcmNbaip2X3N0ZXBdOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB2YXJfY291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRzdFtqXSA9IHNyY1t2X2lkeFtqXSp2X3N0ZXBdOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiAoY29uc3QgZmxvYXQqKilzYW1wbGVzOworfQorCisKK3ZvaWQKK2N2Q2hlY2tUcmFpbkRhdGEoIGNvbnN0IEN2TWF0KiB0cmFpbl9kYXRhLCBpbnQgdGZsYWcsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbWlzc2luZ19tYXNrLCAKKyAgICAgICAgICAgICAgICAgIGludCogdmFyX2FsbCwgaW50KiBzYW1wbGVfYWxsICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2Q2hlY2tUcmFpbkRhdGEiICk7CisKKyAgICBpZiggdmFyX2FsbCApCisgICAgICAgICp2YXJfYWxsID0gMDsKKworICAgIGlmKCBzYW1wbGVfYWxsICkKKyAgICAgICAgKnNhbXBsZV9hbGwgPSAwOworCisgICAgX19CRUdJTl9fOworCisgICAgLy8gY2hlY2sgcGFyYW1ldGVyIHR5cGVzIGFuZCBzaXplcworICAgIGlmKCAhQ1ZfSVNfTUFUKHRyYWluX2RhdGEpIHx8IENWX01BVF9UWVBFKHRyYWluX2RhdGEtPnR5cGUpICE9IENWXzMyRkMxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInRyYWluIGRhdGEgbXVzdCBiZSBmbG9hdGluZy1wb2ludCBtYXRyaXgiICk7CisKKyAgICBpZiggbWlzc2luZ19tYXNrICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG1pc3NpbmdfbWFzaykgfHwgIUNWX0lTX01BU0tfQVJSKG1pc3NpbmdfbWFzaykgfHwKKyAgICAgICAgICAgICFDVl9BUkVfU0laRVNfRVEodHJhaW5fZGF0YSwgbWlzc2luZ19tYXNrKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgIm1pc3NpbmcgdmFsdWUgbWFzayBtdXN0IGJlIDgtYml0IG1hdHJpeCBvZiB0aGUgc2FtZSBzaXplIGFzIHRyYWluaW5nIGRhdGEiICk7CisgICAgfQorCisgICAgaWYoIHRmbGFnICE9IENWX1JPV19TQU1QTEUgJiYgdGZsYWcgIT0gQ1ZfQ09MX1NBTVBMRSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICJVbmtub3duIHRyYWluaW5nIGRhdGEgbGF5b3V0IChtdXN0IGJlIENWX1JPV19TQU1QTEUgb3IgQ1ZfQ09MX1NBTVBMRSkiICk7CisKKyAgICBpZiggdmFyX2FsbCApCisgICAgICAgICp2YXJfYWxsID0gdGZsYWcgPT0gQ1ZfUk9XX1NBTVBMRSA/IHRyYWluX2RhdGEtPmNvbHMgOiB0cmFpbl9kYXRhLT5yb3dzOworICAgIAorICAgIGlmKCBzYW1wbGVfYWxsICkKKyAgICAgICAgKnNhbXBsZV9hbGwgPSB0ZmxhZyA9PSBDVl9ST1dfU0FNUExFID8gdHJhaW5fZGF0YS0+cm93cyA6IHRyYWluX2RhdGEtPmNvbHM7CisKKyAgICBfX0VORF9fOworfQorCisKK2ludAorY3ZQcmVwYXJlVHJhaW5EYXRhKCBjb25zdCBjaGFyKiAvKmZ1bmNuYW1lKi8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiB0cmFpbl9kYXRhLCBpbnQgdGZsYWcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiByZXNwb25zZXMsIGludCByZXNwb25zZV90eXBlLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogdmFyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHNhbXBsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgYWx3YXlzX2NvcHlfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqKiogb3V0X3RyYWluX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgIGludCogX3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgaW50KiBfdmFyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBpbnQqIF92YXJfYWxsLAorICAgICAgICAgICAgICAgICAgICBDdk1hdCoqIG91dF9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgIEN2TWF0Kiogb3V0X3Jlc3BvbnNlX21hcCwKKyAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqKiBvdXRfdmFyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqKiBvdXRfc2FtcGxlX2lkeCApCit7CisgICAgaW50IG9rID0gMDsgCisgICAgQ3ZNYXQqIF92YXJfaWR4ID0gMDsKKyAgICBDdk1hdCogX3NhbXBsZV9pZHggPSAwOworICAgIEN2TWF0KiBfcmVzcG9uc2VzID0gMDsKKyAgICBpbnQgc2FtcGxlX2FsbCA9IDAsIHNhbXBsZV9jb3VudCA9IDAsIHZhcl9hbGwgPSAwLCB2YXJfY291bnQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByZXBhcmVUcmFpbkRhdGEiICk7CisKKyAgICAvLyBzdGVwIDAuIGNsZWFyIGFsbCB0aGUgb3V0cHV0IHBvaW50ZXJzIHRvIGVuc3VyZSB3ZSBkbyBub3QgdHJ5CisgICAgLy8gdG8gY2FsbCBmcmVlKCkgd2l0aCB1bmluaXRpYWxpemVkIHBvaW50ZXJzCisgICAgaWYoIG91dF9yZXNwb25zZXMgKQorICAgICAgICAqb3V0X3Jlc3BvbnNlcyA9IDA7CisKKyAgICBpZiggb3V0X3Jlc3BvbnNlX21hcCApCisgICAgICAgICpvdXRfcmVzcG9uc2VfbWFwID0gMDsKKworICAgIGlmKCBvdXRfdmFyX2lkeCApCisgICAgICAgICpvdXRfdmFyX2lkeCA9IDA7CisKKyAgICBpZiggb3V0X3NhbXBsZV9pZHggKQorICAgICAgICAqb3V0X3NhbXBsZV9pZHggPSAwOworCisgICAgaWYoIG91dF90cmFpbl9zYW1wbGVzICkKKyAgICAgICAgKm91dF90cmFpbl9zYW1wbGVzID0gMDsKKworICAgIGlmKCBfc2FtcGxlX2NvdW50ICkKKyAgICAgICAgKl9zYW1wbGVfY291bnQgPSAwOworCisgICAgaWYoIF92YXJfY291bnQgKQorICAgICAgICAqX3Zhcl9jb3VudCA9IDA7CisKKyAgICBpZiggX3Zhcl9hbGwgKQorICAgICAgICAqX3Zhcl9hbGwgPSAwOworICAgIAorICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhb3V0X3RyYWluX3NhbXBsZXMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAib3V0cHV0IHBvaW50ZXIgdG8gdHJhaW4gc2FtcGxlcyBpcyBOVUxMIiApOworCisgICAgQ1ZfQ0FMTCggY3ZDaGVja1RyYWluRGF0YSggdHJhaW5fZGF0YSwgdGZsYWcsIDAsICZ2YXJfYWxsLCAmc2FtcGxlX2FsbCApKTsKKworICAgIGlmKCBzYW1wbGVfaWR4ICkKKyAgICAgICAgQ1ZfQ0FMTCggX3NhbXBsZV9pZHggPSBjdlByZXByb2Nlc3NJbmRleEFycmF5KCBzYW1wbGVfaWR4LCBzYW1wbGVfYWxsICkpOworICAgIGlmKCB2YXJfaWR4ICkKKyAgICAgICAgQ1ZfQ0FMTCggX3Zhcl9pZHggPSBjdlByZXByb2Nlc3NJbmRleEFycmF5KCB2YXJfaWR4LCB2YXJfYWxsICkpOworCisgICAgaWYoIHJlc3BvbnNlcyApCisgICAgeworICAgICAgICBpZiggIW91dF9yZXNwb25zZXMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJvdXRwdXQgcmVzcG9uc2UgcG9pbnRlciBpcyBOVUxMIiApOworICAgICAgICAKKyAgICAgICAgaWYoIHJlc3BvbnNlX3R5cGUgPT0gQ1ZfVkFSX05VTUVSSUNBTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIF9yZXNwb25zZXMgPSBjdlByZXByb2Nlc3NPcmRlcmVkUmVzcG9uc2VzKCByZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX2lkeCwgc2FtcGxlX2FsbCApKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIF9yZXNwb25zZXMgPSBjdlByZXByb2Nlc3NDYXRlZ29yaWNhbFJlc3BvbnNlcyggcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX2lkeCwgc2FtcGxlX2FsbCwgb3V0X3Jlc3BvbnNlX21hcCwgMCApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENWX0NBTEwoICpvdXRfdHJhaW5fc2FtcGxlcyA9CisgICAgICAgICAgICAgICAgY3ZHZXRUcmFpblNhbXBsZXMoIHRyYWluX2RhdGEsIHRmbGFnLCBfdmFyX2lkeCwgX3NhbXBsZV9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJfY291bnQsICZzYW1wbGVfY291bnQsIGFsd2F5c19jb3B5X2RhdGEgKSk7IAorCisgICAgb2sgPSAxOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBvayApCisgICAgeworICAgICAgICBpZiggb3V0X3Jlc3BvbnNlcyApCisgICAgICAgICAgICAqb3V0X3Jlc3BvbnNlcyA9IF9yZXNwb25zZXMsIF9yZXNwb25zZXMgPSAwOworCisgICAgICAgIGlmKCBvdXRfdmFyX2lkeCApCisgICAgICAgICAgICAqb3V0X3Zhcl9pZHggPSBfdmFyX2lkeCwgX3Zhcl9pZHggPSAwOworCisgICAgICAgIGlmKCBvdXRfc2FtcGxlX2lkeCApCisgICAgICAgICAgICAqb3V0X3NhbXBsZV9pZHggPSBfc2FtcGxlX2lkeCwgX3NhbXBsZV9pZHggPSAwOworCisgICAgICAgIGlmKCBfc2FtcGxlX2NvdW50ICkKKyAgICAgICAgICAgICpfc2FtcGxlX2NvdW50ID0gc2FtcGxlX2NvdW50OworCisgICAgICAgIGlmKCBfdmFyX2NvdW50ICkKKyAgICAgICAgICAgICpfdmFyX2NvdW50ID0gdmFyX2NvdW50OworCisgICAgICAgIGlmKCBfdmFyX2FsbCApCisgICAgICAgICAgICAqX3Zhcl9hbGwgPSB2YXJfYWxsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggb3V0X3Jlc3BvbnNlX21hcCApCisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoIG91dF9yZXNwb25zZV9tYXAgKTsKKyAgICAgICAgY3ZGcmVlKCBvdXRfdHJhaW5fc2FtcGxlcyApOworICAgIH0KKworICAgIGlmKCBfcmVzcG9uc2VzICE9IHJlc3BvbnNlcyApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJl9yZXNwb25zZXMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfdmFyX2lkeCApOworICAgIGN2UmVsZWFzZU1hdCggJl9zYW1wbGVfaWR4ICk7CisKKyAgICByZXR1cm4gb2s7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZTYW1wbGVSZXNwb25zZVBhaXIKK3sKKyAgICBjb25zdCBmbG9hdCogc2FtcGxlOworICAgIGNvbnN0IHVjaGFyKiBtYXNrOworICAgIGludCByZXNwb25zZTsKKyAgICBpbnQgaW5kZXg7Cit9CitDdlNhbXBsZVJlc3BvbnNlUGFpcjsKKworCitzdGF0aWMgaW50CitDVl9DREVDTCBpY3ZDbXBTYW1wbGVSZXNwb25zZVBhaXJzKCBjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiICkKK3sKKyAgICBpbnQgcmEgPSAoKGNvbnN0IEN2U2FtcGxlUmVzcG9uc2VQYWlyKilhKS0+cmVzcG9uc2U7CisgICAgaW50IHJiID0gKChjb25zdCBDdlNhbXBsZVJlc3BvbnNlUGFpciopYiktPnJlc3BvbnNlOworICAgIGludCBpYSA9ICgoY29uc3QgQ3ZTYW1wbGVSZXNwb25zZVBhaXIqKWEpLT5pbmRleDsKKyAgICBpbnQgaWIgPSAoKGNvbnN0IEN2U2FtcGxlUmVzcG9uc2VQYWlyKiliKS0+aW5kZXg7CisKKyAgICByZXR1cm4gcmEgPCByYiA/IC0xIDogcmEgPiByYiA/IDEgOiBpYSAtIGliOworICAgIC8vcmV0dXJuIChyYSA+IHJiID8gLTEgOiAwKXwocmEgPCByYik7Cit9CisKKwordm9pZAorY3ZTb3J0U2FtcGxlc0J5Q2xhc3NlcyggY29uc3QgZmxvYXQqKiBzYW1wbGVzLCBjb25zdCBDdk1hdCogY2xhc3NlcywgCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGNsYXNzX3JhbmdlcywgY29uc3QgdWNoYXIqKiBtYXNrICkKK3sKKyAgICBDdlNhbXBsZVJlc3BvbnNlUGFpciogcGFpcnMgPSAwOworICAgIENWX0ZVTkNOQU1FKCAiY3ZTb3J0U2FtcGxlc0J5Q2xhc3NlcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBrID0gMCwgc2FtcGxlX2NvdW50OworCisgICAgaWYoICFzYW1wbGVzIHx8ICFjbGFzc2VzIHx8ICFjbGFzc19yYW5nZXMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIklOVEVSTkFMIEVSUk9SOiBzb21lIG9mIHRoZSBhcmdzIGFyZSBOVUxMIHBvaW50ZXJzIiApOworCisgICAgaWYoIGNsYXNzZXMtPnJvd3MgIT0gMSB8fCBDVl9NQVRfVFlQRShjbGFzc2VzLT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJjbGFzc2VzIGFycmF5IG11c3QgYmUgYSBzaW5nbGUgcm93IG9mIGludGVnZXJzIiApOworCisgICAgc2FtcGxlX2NvdW50ID0gY2xhc3Nlcy0+Y29sczsKKyAgICBDVl9DQUxMKCBwYWlycyA9IChDdlNhbXBsZVJlc3BvbnNlUGFpciopY3ZBbGxvYyggKHNhbXBsZV9jb3VudCsxKSpzaXplb2YocGFpcnNbMF0pKSk7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIHBhaXJzW2ldLnNhbXBsZSA9IHNhbXBsZXNbaV07CisgICAgICAgIHBhaXJzW2ldLm1hc2sgPSAobWFzaykgPyAobWFza1tpXSkgOiAwOworICAgICAgICBwYWlyc1tpXS5yZXNwb25zZSA9IGNsYXNzZXMtPmRhdGEuaVtpXTsKKyAgICAgICAgcGFpcnNbaV0uaW5kZXggPSBpOworICAgICAgICBhc3NlcnQoIGNsYXNzZXMtPmRhdGEuaVtpXSA+PSAwICk7CisgICAgfQorICAgIAorICAgIHFzb3J0KCBwYWlycywgc2FtcGxlX2NvdW50LCBzaXplb2YocGFpcnNbMF0pLCBpY3ZDbXBTYW1wbGVSZXNwb25zZVBhaXJzICk7CisgICAgcGFpcnNbc2FtcGxlX2NvdW50XS5yZXNwb25zZSA9IC0xOworICAgIGNsYXNzX3Jhbmdlc1swXSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgc2FtcGxlc1tpXSA9IHBhaXJzW2ldLnNhbXBsZTsKKyAgICAgICAgaWYgKG1hc2spCisgICAgICAgICAgICBtYXNrW2ldID0gcGFpcnNbaV0ubWFzazsKKyAgICAgICAgY2xhc3Nlcy0+ZGF0YS5pW2ldID0gcGFpcnNbaV0ucmVzcG9uc2U7CisKKyAgICAgICAgaWYoIHBhaXJzW2ldLnJlc3BvbnNlICE9IHBhaXJzW2krMV0ucmVzcG9uc2UgKQorICAgICAgICAgICAgY2xhc3NfcmFuZ2VzWysra10gPSBpKzE7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJnBhaXJzICk7Cit9CisKKwordm9pZAorY3ZQcmVwYXJlUHJlZGljdERhdGEoIGNvbnN0IEN2QXJyKiBfc2FtcGxlLCBpbnQgZGltc19hbGwsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGNvbXBfaWR4LCBpbnQgY2xhc3NfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHByb2IsIGZsb2F0KiogX3Jvd19zYW1wbGUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGFzX3NwYXJzZSApCit7CisgICAgZmxvYXQqIHJvd19zYW1wbGUgPSAwOworICAgIGludCogaW52ZXJzZV9jb21wX2lkeCA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdlByZXBhcmVQcmVkaWN0RGF0YSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IEN2TWF0KiBzYW1wbGUgPSAoY29uc3QgQ3ZNYXQqKV9zYW1wbGU7CisgICAgZmxvYXQqIHNhbXBsZV9kYXRhOworICAgIGludCBzYW1wbGVfc3RlcDsKKyAgICBpbnQgaXNfc3BhcnNlID0gQ1ZfSVNfU1BBUlNFX01BVChzYW1wbGUpOworICAgIGludCBkLCBzaXplc1tDVl9NQVhfRElNXTsKKyAgICBpbnQgaSwgZGltc19zZWxlY3RlZDsKKyAgICBpbnQgdmVjX3NpemU7CisKKyAgICBpZiggIWlzX3NwYXJzZSAmJiAhQ1ZfSVNfTUFUKHNhbXBsZSkgKQorICAgICAgICBDVl9FUlJPUiggIXNhbXBsZSA/IENWX1N0c051bGxQdHIgOiBDVl9TdHNCYWRBcmcsICJUaGUgc2FtcGxlIGlzIG5vdCBhIHZhbGlkIHZlY3RvciIgKTsKKworICAgIGlmKCBjdkdldEVsZW1UeXBlKCBzYW1wbGUgKSAhPSBDVl8zMkZDMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbnN1cHBvcnRlZEZvcm1hdCwgIklucHV0IHNhbXBsZSBtdXN0IGhhdmUgMzJmQzEgdHlwZSIgKTsKKworICAgIENWX0NBTEwoIGQgPSBjdkdldERpbXMoIHNhbXBsZSwgc2l6ZXMgKSk7CisKKyAgICBpZiggIShpc19zcGFyc2UgJiYgZCA9PSAxIHx8ICFpc19zcGFyc2UgJiYgZCA9PSAyICYmIChzYW1wbGUtPnJvd3MgPT0gMSB8fCBzYW1wbGUtPmNvbHMgPT0gMSkpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJJbnB1dCBzYW1wbGUgbXVzdCBiZSAxLWRpbWVuc2lvbmFsIHZlY3RvciIgKTsKKyAgICAKKyAgICBpZiggZCA9PSAxICkKKyAgICAgICAgc2l6ZXNbMV0gPSAxOworCisgICAgaWYoIHNpemVzWzBdICsgc2l6ZXNbMV0gLSAxICE9IGRpbXNfYWxsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiVGhlIHNhbXBsZSBzaXplIGlzIGRpZmZlcmVudCBmcm9tIHdoYXQgaGFzIGJlZW4gdXNlZCBmb3IgdHJhaW5pbmciICk7CisKKyAgICBpZiggIV9yb3dfc2FtcGxlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJJTlRFUk5BTCBFUlJPUjogVGhlIHJvd19zYW1wbGUgcG9pbnRlciBpcyBOVUxMIiApOworCisgICAgaWYoIGNvbXBfaWR4ICYmICghQ1ZfSVNfTUFUKGNvbXBfaWR4KSB8fCBjb21wX2lkeC0+cm93cyAhPSAxIHx8CisgICAgICAgIENWX01BVF9UWVBFKGNvbXBfaWR4LT50eXBlKSAhPSBDVl8zMlNDMSkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSU5URVJOQUwgRVJST1I6IGludmFsaWQgY29tcF9pZHgiICk7CisKKyAgICBkaW1zX3NlbGVjdGVkID0gY29tcF9pZHggPyBjb21wX2lkeC0+Y29scyA6IGRpbXNfYWxsOworICAgIAorICAgIGlmKCBwcm9iICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHByb2IpICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgb3V0cHV0IG1hdHJpeCBvZiBwcm9iYWJpbGl0aWVzIGlzIGludmFsaWQiICk7CisKKyAgICAgICAgaWYoIChwcm9iLT5yb3dzICE9IDEgJiYgcHJvYi0+Y29scyAhPSAxKSB8fAorICAgICAgICAgICAgQ1ZfTUFUX1RZUEUocHJvYi0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYKKyAgICAgICAgICAgIENWX01BVF9UWVBFKHByb2ItPnR5cGUpICE9IENWXzY0RkMxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLAorICAgICAgICAgICAgIlRoZSBtYXRyaXggb2YgcHJvYmFiaWxpdGllcyBtdXN0IGJlIDEtZGltZW5zaW9uYWwgdmVjdG9yIG9mIDMyZkMxIHR5cGUiICk7CisKKyAgICAgICAgaWYoIHByb2ItPnJvd3MgKyBwcm9iLT5jb2xzIC0gMSAhPSBjbGFzc19jb3VudCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsCisgICAgICAgICAgICAiVGhlIHZlY3RvciBvZiBwcm9iYWJpbGl0aWVzIG11c3QgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzICIKKyAgICAgICAgICAgICJ0aGUgbnVtYmVyIG9mIGNsYXNzZXMgaW4gdGhlIHRyYWluaW5nIHNldCIgKTsKKyAgICB9CisKKyAgICB2ZWNfc2l6ZSA9ICFhc19zcGFyc2UgPyBkaW1zX3NlbGVjdGVkKnNpemVvZihyb3dfc2FtcGxlWzBdKSA6CisgICAgICAgICAgICAgICAgKGRpbXNfc2VsZWN0ZWQgKyAxKSpzaXplb2YoQ3ZTcGFyc2VWZWNFbGVtMzJmKTsKKworICAgIGlmKCBDVl9JU19NQVQoc2FtcGxlKSApCisgICAgeworICAgICAgICBzYW1wbGVfZGF0YSA9IHNhbXBsZS0+ZGF0YS5mbDsKKyAgICAgICAgc2FtcGxlX3N0ZXAgPSBzYW1wbGUtPnN0ZXAgLyBzaXplb2Yocm93X3NhbXBsZVswXSk7CisKKyAgICAgICAgaWYoICFjb21wX2lkeCAmJiBzYW1wbGVfc3RlcCA8PSAxICYmICFhc19zcGFyc2UgKQorICAgICAgICAgICAgKl9yb3dfc2FtcGxlID0gc2FtcGxlX2RhdGE7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggcm93X3NhbXBsZSA9IChmbG9hdCopY3ZBbGxvYyggdmVjX3NpemUgKSk7CisKKyAgICAgICAgICAgIGlmKCAhY29tcF9pZHggKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zX3NlbGVjdGVkOyBpKysgKQorICAgICAgICAgICAgICAgICAgICByb3dfc2FtcGxlW2ldID0gc2FtcGxlX2RhdGFbc2FtcGxlX3N0ZXAqaV07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50KiBjb21wID0gY29tcF9pZHgtPmRhdGEuaTsKKyAgICAgICAgICAgICAgICBpZiggIXNhbXBsZV9zdGVwICkKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXNfc2VsZWN0ZWQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgICAgICByb3dfc2FtcGxlW2ldID0gc2FtcGxlX2RhdGFbY29tcFtpXV07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltc19zZWxlY3RlZDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvd19zYW1wbGVbaV0gPSBzYW1wbGVfZGF0YVtzYW1wbGVfc3RlcCpjb21wW2ldXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgKl9yb3dfc2FtcGxlID0gcm93X3NhbXBsZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBhc19zcGFyc2UgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gKGNvbnN0IGZsb2F0Kilyb3dfc2FtcGxlOworICAgICAgICAgICAgQ3ZTcGFyc2VWZWNFbGVtMzJmKiBkc3QgPSAoQ3ZTcGFyc2VWZWNFbGVtMzJmKilyb3dfc2FtcGxlOworCisgICAgICAgICAgICBkc3RbZGltc19zZWxlY3RlZF0uaWR4ID0gLTE7CisgICAgICAgICAgICBmb3IoIGkgPSBkaW1zX3NlbGVjdGVkIC0gMTsgaSA+PSAwOyBpLS0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRzdFtpXS5pZHggPSBpOworICAgICAgICAgICAgICAgIGRzdFtpXS52YWwgPSBzcmNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ3ZTcGFyc2VOb2RlKiBub2RlOworICAgICAgICBDdlNwYXJzZU1hdEl0ZXJhdG9yIG1hdF9pdGVyYXRvcjsKKyAgICAgICAgY29uc3QgQ3ZTcGFyc2VNYXQqIHNwYXJzZSA9IChjb25zdCBDdlNwYXJzZU1hdCopc2FtcGxlOworICAgICAgICBhc3NlcnQoIGlzX3NwYXJzZSApOworCisgICAgICAgIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggc3BhcnNlLCAmbWF0X2l0ZXJhdG9yICk7CisgICAgICAgIENWX0NBTEwoIHJvd19zYW1wbGUgPSAoZmxvYXQqKWN2QWxsb2MoIHZlY19zaXplICkpOworCisgICAgICAgIGlmKCBjb21wX2lkeCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGludmVyc2VfY29tcF9pZHggPSAoaW50KiljdkFsbG9jKCBkaW1zX2FsbCpzaXplb2YoaW50KSApKTsKKyAgICAgICAgICAgIG1lbXNldCggaW52ZXJzZV9jb21wX2lkeCwgLTEsIGRpbXNfYWxsKnNpemVvZihpbnQpICk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGltc19zZWxlY3RlZDsgaSsrICkKKyAgICAgICAgICAgICAgICBpbnZlcnNlX2NvbXBfaWR4W2NvbXBfaWR4LT5kYXRhLmlbaV1dID0gaTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoICFhc19zcGFyc2UgKQorICAgICAgICB7CisgICAgICAgICAgICBtZW1zZXQoIHJvd19zYW1wbGUsIDAsIHZlY19zaXplICk7CisKKyAgICAgICAgICAgIGZvciggOyBub2RlICE9IDA7IG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCZtYXRfaXRlcmF0b3IpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKkNWX05PREVfSURYKCBzcGFyc2UsIG5vZGUgKTsKKyAgICAgICAgICAgICAgICBpZiggaW52ZXJzZV9jb21wX2lkeCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBpbnZlcnNlX2NvbXBfaWR4W2lkeF07CisgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb3dfc2FtcGxlW2lkeF0gPSAqKGZsb2F0KilDVl9OT0RFX1ZBTCggc3BhcnNlLCBub2RlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdlNwYXJzZVZlY0VsZW0zMmYqIHB0ciA9IChDdlNwYXJzZVZlY0VsZW0zMmYqKXJvd19zYW1wbGU7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggOyBub2RlICE9IDA7IG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCZtYXRfaXRlcmF0b3IpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gKkNWX05PREVfSURYKCBzcGFyc2UsIG5vZGUgKTsKKyAgICAgICAgICAgICAgICBpZiggaW52ZXJzZV9jb21wX2lkeCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBpbnZlcnNlX2NvbXBfaWR4W2lkeF07CisgICAgICAgICAgICAgICAgICAgIGlmKCBpZHggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdHItPmlkeCA9IGlkeDsKKyAgICAgICAgICAgICAgICBwdHItPnZhbCA9ICooZmxvYXQqKUNWX05PREVfVkFMKCBzcGFyc2UsIG5vZGUgKTsKKyAgICAgICAgICAgICAgICBwdHIrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcXNvcnQoIHJvd19zYW1wbGUsIHB0ciAtIChDdlNwYXJzZVZlY0VsZW0zMmYqKXJvd19zYW1wbGUsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0clswXSksIGljdkNtcFNwYXJzZVZlY0VsZW1zICk7CisgICAgICAgICAgICBwdHItPmlkeCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgKl9yb3dfc2FtcGxlID0gcm93X3NhbXBsZTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGludmVyc2VfY29tcF9pZHggKQorICAgICAgICBjdkZyZWUoICZpbnZlcnNlX2NvbXBfaWR4ICk7CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgJiYgX3Jvd19zYW1wbGUgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmcm93X3NhbXBsZSApOworICAgICAgICAqX3Jvd19zYW1wbGUgPSAwOworICAgIH0KK30KKworCitzdGF0aWMgdm9pZAoraWN2Q29udmVydERhdGFUb1NwYXJzZSggY29uc3QgdWNoYXIqIHNyYywgaW50IHNyY19zdGVwLCBpbnQgc3JjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZHN0LCBpbnQgZHN0X3N0ZXAsIGludCBkc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQqIGlkeCApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDb252ZXJ0RGF0YVRvU3BhcnNlIiApOworCisgICAgX19CRUdJTl9fOworICAgIAorICAgIGludCBpLCBqOworICAgIHNyY190eXBlID0gQ1ZfTUFUX1RZUEUoc3JjX3R5cGUpOworICAgIGRzdF90eXBlID0gQ1ZfTUFUX1RZUEUoZHN0X3R5cGUpOworCisgICAgaWYoIENWX01BVF9DTihzcmNfdHlwZSkgIT0gMSB8fCBDVl9NQVRfQ04oZHN0X3R5cGUpICE9IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgZnVuY3Rpb24gc3VwcG9ydHMgb25seSBzaW5nbGUtY2hhbm5lbCBhcnJheXMiICk7CisKKyAgICBpZiggc3JjX3N0ZXAgPT0gMCApCisgICAgICAgIHNyY19zdGVwID0gQ1ZfRUxFTV9TSVpFKHNyY190eXBlKTsKKworICAgIGlmKCBkc3Rfc3RlcCA9PSAwICkKKyAgICAgICAgZHN0X3N0ZXAgPSBDVl9FTEVNX1NJWkUoZHN0X3R5cGUpOworCisgICAgLy8gaWYgdGhlcmUgaXMgbm8gImlkeCIgYW5kIGlmIGJvdGggYXJyYXlzIGFyZSBjb250aW51b3VzLAorICAgIC8vIGRvIHRoZSB3aG9sZSBwcm9jZXNzaW5nIChjb3B5aW5nIG9yIGNvbnZlcnNpb24pIGluIGEgc2luZ2xlIGxvb3AKKyAgICBpZiggIWlkeCAmJiBDVl9FTEVNX1NJWkUoc3JjX3R5cGUpKnNpemUud2lkdGggPT0gc3JjX3N0ZXAgJiYKKyAgICAgICAgQ1ZfRUxFTV9TSVpFKGRzdF90eXBlKSpzaXplLndpZHRoID09IGRzdF9zdGVwICkKKyAgICB7CisgICAgICAgIHNpemUud2lkdGggKj0gc2l6ZS5oZWlnaHQ7CisgICAgICAgIHNpemUuaGVpZ2h0ID0gMTsKKyAgICB9CisKKyAgICBpZiggc3JjX3R5cGUgPT0gZHN0X3R5cGUgKQorICAgIHsKKyAgICAgICAgaW50IGZ1bGxfd2lkdGggPSBDVl9FTEVNX1NJWkUoZHN0X3R5cGUpKnNpemUud2lkdGg7CisgICAgICAgIAorICAgICAgICBpZiggZnVsbF93aWR0aCA9PSBzaXplb2YoaW50KSApIC8vIGFub3RoZXIgY29tbW9uIGNhc2U6IGNvcHkgaW50J3Mgb3IgZmxvYXQncworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIHNyYyArPSBzcmNfc3RlcCApCisgICAgICAgICAgICAgICAgKihpbnQqKShkc3QgKyBkc3Rfc3RlcCooaWR4ID8gaWR4W2ldIDogaSkpID0gKihpbnQqKXNyYzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIHNyYyArPSBzcmNfc3RlcCApCisgICAgICAgICAgICAgICAgbWVtY3B5KCBkc3QgKyBkc3Rfc3RlcCooaWR4ID8gaWR4W2ldIDogaSksIHNyYywgZnVsbF93aWR0aCApOworICAgIH0KKyAgICBlbHNlIGlmKCBzcmNfdHlwZSA9PSBDVl8zMlNDMSAmJiAoZHN0X3R5cGUgPT0gQ1ZfMzJGQzEgfHwgZHN0X3R5cGUgPT0gQ1ZfNjRGQzEpICkKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUuaGVpZ2h0OyBpKyssIHNyYyArPSBzcmNfc3RlcCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyKiBfZHN0ID0gZHN0ICsgZHN0X3N0ZXAqKGlkeCA/IGlkeFtpXSA6IGkpOworICAgICAgICAgICAgaWYoIGRzdF90eXBlID09IENWXzMyRkMxICkKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2l6ZS53aWR0aDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCopX2RzdClbal0gPSAoZmxvYXQpKChpbnQqKXNyYylbal07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKilfZHN0KVtqXSA9ICgoaW50KilzcmMpW2pdOworICAgICAgICB9CisgICAgZWxzZSBpZiggKHNyY190eXBlID09IENWXzMyRkMxIHx8IHNyY190eXBlID09IENWXzY0RkMxKSAmJiBkc3RfdHlwZSA9PSBDVl8zMlNDMSApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrLCBzcmMgKz0gc3JjX3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICB1Y2hhciogX2RzdCA9IGRzdCArIGRzdF9zdGVwKihpZHggPyBpZHhbaV0gOiBpKTsKKyAgICAgICAgICAgIGlmKCBzcmNfdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICgoaW50KilfZHN0KVtqXSA9IGN2Um91bmQoKChmbG9hdCopc3JjKVtqXSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICgoaW50KilfZHN0KVtqXSA9IGN2Um91bmQoKChkb3VibGUqKXNyYylbal0pOworICAgICAgICB9CisgICAgZWxzZSBpZiggc3JjX3R5cGUgPT0gQ1ZfMzJGQzEgJiYgZHN0X3R5cGUgPT0gQ1ZfNjRGQzEgfHwKKyAgICAgICAgICAgICBzcmNfdHlwZSA9PSBDVl82NEZDMSAmJiBkc3RfdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLmhlaWdodDsgaSsrLCBzcmMgKz0gc3JjX3N0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICB1Y2hhciogX2RzdCA9IGRzdCArIGRzdF9zdGVwKihpZHggPyBpZHhbaV0gOiBpKTsKKyAgICAgICAgICAgIGlmKCBzcmNfdHlwZSA9PSBDVl8zMkZDMSApCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKilfZHN0KVtqXSA9ICgoZmxvYXQqKXNyYylbal07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IHNpemUud2lkdGg7IGorKyApCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQqKV9kc3QpW2pdID0gKGZsb2F0KSgoZG91YmxlKilzcmMpW2pdOworICAgICAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbnN1cHBvcnRlZCBjb21iaW5hdGlvbiBvZiBpbnB1dCBhbmQgb3V0cHV0IHZlY3RvcnMiICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQKK2N2V3JpdGViYWNrTGFiZWxzKCBjb25zdCBDdk1hdCogbGFiZWxzLCBDdk1hdCogZHN0X2xhYmVscywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogY2VudGVycywgQ3ZNYXQqIGRzdF9jZW50ZXJzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBwcm9icywgQ3ZNYXQqIGRzdF9wcm9icywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogc2FtcGxlX2lkeCwgaW50IHNhbXBsZXNfYWxsLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBjb21wX2lkeCwgaW50IGRpbXNfYWxsICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImN2V3JpdGViYWNrTGFiZWxzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHNhbXBsZXNfc2VsZWN0ZWQgPSBzYW1wbGVzX2FsbCwgZGltc19zZWxlY3RlZCA9IGRpbXNfYWxsOworCisgICAgaWYoIGRzdF9sYWJlbHMgJiYgIUNWX0lTX01BVChkc3RfbGFiZWxzKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJBcnJheSBvZiBvdXRwdXQgbGFiZWxzIGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCBkc3RfY2VudGVycyApCisgICAgICAgIGlmKCAhSUNWX0lTX01BVF9PRl9UWVBFKGRzdF9jZW50ZXJzLCBDVl8zMkZDMSkgJiYKKyAgICAgICAgICAgICFJQ1ZfSVNfTUFUX09GX1RZUEUoZHN0X2NlbnRlcnMsIENWXzY0RkMxKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiQXJyYXkgb2YgY2x1c3RlciBjZW50ZXJzIGlzIG5vdCBhIHZhbGlkIG1hdHJpeCIgKTsKKworICAgIGlmKCBkc3RfcHJvYnMgJiYgIUNWX0lTX01BVChkc3RfcHJvYnMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlByb2JhYmlsaXR5IG1hdHJpeCBpcyBub3QgdmFsaWQiICk7CisKKyAgICBpZiggc2FtcGxlX2lkeCApCisgICAgeworICAgICAgICBDVl9BU1NFUlQoIHNhbXBsZV9pZHgtPnJvd3MgPT0gMSAmJiBDVl9NQVRfVFlQRShzYW1wbGVfaWR4LT50eXBlKSA9PSBDVl8zMlNDMSApOworICAgICAgICBzYW1wbGVzX3NlbGVjdGVkID0gc2FtcGxlX2lkeC0+Y29sczsKKyAgICB9CisKKyAgICBpZiggY29tcF9pZHggKQorICAgIHsKKyAgICAgICAgQ1ZfQVNTRVJUKCBjb21wX2lkeC0+cm93cyA9PSAxICYmIENWX01BVF9UWVBFKGNvbXBfaWR4LT50eXBlKSA9PSBDVl8zMlNDMSApOworICAgICAgICBkaW1zX3NlbGVjdGVkID0gY29tcF9pZHgtPmNvbHM7CisgICAgfQorCisgICAgaWYoIGRzdF9sYWJlbHMgJiYgKCFsYWJlbHMgfHwgbGFiZWxzLT5kYXRhLnB0ciAhPSBkc3RfbGFiZWxzLT5kYXRhLnB0cikgKQorICAgIHsKKyAgICAgICAgaWYoICFsYWJlbHMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGxhYmVscyIgKTsKKworICAgICAgICBDVl9BU1NFUlQoIGxhYmVscy0+cm93cyA9PSAxICk7CisKKyAgICAgICAgaWYoIGRzdF9sYWJlbHMtPnJvd3MgIT0gMSAmJiBkc3RfbGFiZWxzLT5jb2xzICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJBcnJheSBvZiBvdXRwdXQgbGFiZWxzIHNob3VsZCBiZSAxZCB2ZWN0b3IiICk7CisKKyAgICAgICAgaWYoIGRzdF9sYWJlbHMtPnJvd3MgKyBkc3RfbGFiZWxzLT5jb2xzIC0gMSAhPSBzYW1wbGVzX2FsbCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsIAorICAgICAgICAgICAgIlNpemUgb2YgdmVjdG9yIG9mIG91dHB1dCBsYWJlbHMgaXMgbm90IGVxdWFsIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgc2FtcGxlcyIgKTsKKworICAgICAgICBDVl9BU1NFUlQoIGxhYmVscy0+Y29scyA9PSBzYW1wbGVzX3NlbGVjdGVkICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2Q29udmVydERhdGFUb1NwYXJzZSggbGFiZWxzLT5kYXRhLnB0ciwgbGFiZWxzLT5zdGVwLCBsYWJlbHMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfbGFiZWxzLT5kYXRhLnB0ciwgZHN0X2xhYmVscy0+c3RlcCwgZHN0X2xhYmVscy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSggMSwgc2FtcGxlc19zZWxlY3RlZCApLCBzYW1wbGVfaWR4ID8gc2FtcGxlX2lkeC0+ZGF0YS5pIDogMCApKTsKKyAgICB9CisKKyAgICBpZiggZHN0X2NlbnRlcnMgJiYgKCFjZW50ZXJzIHx8IGNlbnRlcnMtPmRhdGEucHRyICE9IGRzdF9jZW50ZXJzLT5kYXRhLnB0cikgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIAorICAgICAgICBpZiggIWNlbnRlcnMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGNlbnRlcnMiICk7CisKKyAgICAgICAgaWYoIGNlbnRlcnMtPnJvd3MgIT0gZHN0X2NlbnRlcnMtPnJvd3MgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiSW52YWxpZCBudW1iZXIgb2Ygcm93cyBpbiBtYXRyaXggb2Ygb3V0cHV0IGNlbnRlcnMiICk7CisKKyAgICAgICAgaWYoIGRzdF9jZW50ZXJzLT5jb2xzICE9IGRpbXNfYWxsICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywKKyAgICAgICAgICAgICJOdW1iZXIgb2YgY29sdW1ucyBpbiBtYXRyaXggb2Ygb3V0cHV0IGNlbnRlcnMgaXMgIgorICAgICAgICAgICAgIm5vdCBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGNvbXBvbmVudHMgaW4gdGhlIGlucHV0IHNhbXBsZXMiICk7CisKKyAgICAgICAgQ1ZfQVNTRVJUKCBjZW50ZXJzLT5jb2xzID09IGRpbXNfc2VsZWN0ZWQgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2VudGVycy0+cm93czsgaSsrICkKKyAgICAgICAgICAgIENWX0NBTEwoIGljdkNvbnZlcnREYXRhVG9TcGFyc2UoIGNlbnRlcnMtPmRhdGEucHRyICsgaSpjZW50ZXJzLT5zdGVwLCAwLCBjZW50ZXJzLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2NlbnRlcnMtPmRhdGEucHRyICsgaSpkc3RfY2VudGVycy0+c3RlcCwgMCwgZHN0X2NlbnRlcnMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjdlNpemUoIDEsIGRpbXNfc2VsZWN0ZWQgKSwgY29tcF9pZHggPyBjb21wX2lkeC0+ZGF0YS5pIDogMCApKTsKKyAgICB9CisKKyAgICBpZiggZHN0X3Byb2JzICYmICghcHJvYnMgfHwgcHJvYnMtPmRhdGEucHRyICE9IGRzdF9wcm9icy0+ZGF0YS5wdHIpICkKKyAgICB7CisgICAgICAgIGlmKCAhcHJvYnMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIHByb2JzIiApOworCisgICAgICAgIGlmKCBwcm9icy0+Y29scyAhPSBkc3RfcHJvYnMtPmNvbHMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLCAiSW52YWxpZCBudW1iZXIgb2YgY29sdW1ucyBpbiBvdXRwdXQgcHJvYmFiaWxpdHkgbWF0cml4IiApOworCisgICAgICAgIGlmKCBkc3RfcHJvYnMtPnJvd3MgIT0gc2FtcGxlc19hbGwgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgIk51bWJlciBvZiByb3dzIGluIG91dHB1dCBwcm9iYWJpbGl0eSBtYXRyaXggaXMgIgorICAgICAgICAgICAgIm5vdCBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMiICk7CisKKyAgICAgICAgQ1ZfQVNTRVJUKCBwcm9icy0+cm93cyA9PSBzYW1wbGVzX3NlbGVjdGVkICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggaWN2Q29udmVydERhdGFUb1NwYXJzZSggcHJvYnMtPmRhdGEucHRyLCBwcm9icy0+c3RlcCwgcHJvYnMtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBkc3RfcHJvYnMtPmRhdGEucHRyLCBkc3RfcHJvYnMtPnN0ZXAsIGRzdF9wcm9icy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSggcHJvYnMtPmNvbHMsIHNhbXBsZXNfc2VsZWN0ZWQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZHggPyBzYW1wbGVfaWR4LT5kYXRhLmkgOiAwICkpOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKyNpZiAwCitDVl9JTVBMIHZvaWQKK2N2U3RhdE1vZGVsTXVsdGlQcmVkaWN0KCBjb25zdCBDdlN0YXRNb2RlbCogc3RhdF9tb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdkFyciogcHJlZGljdF9pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsIEN2TWF0KiBwcmVkaWN0X291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcHJvYnMsIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4ICkKK3sKKyAgICBDdk1lbVN0b3JhZ2UqIHN0b3JhZ2UgPSAwOworICAgIEN2TWF0KiBzYW1wbGVfaWR4X2J1ZmZlciA9IDA7CisgICAgQ3ZTcGFyc2VNYXQqKiBzcGFyc2Vfcm93cyA9IDA7CisgICAgaW50IHNhbXBsZXNfc2VsZWN0ZWQgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZTdGF0TW9kZWxNdWx0aVByZWRpY3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaTsKKyAgICBpbnQgcHJlZGljdF9vdXRwdXRfc3RlcCA9IDEsIHNhbXBsZV9pZHhfc3RlcCA9IDE7CisgICAgaW50IHR5cGU7CisgICAgaW50IGQsIHNpemVzW0NWX01BWF9ESU1dOworICAgIGludCB0ZmxhZyA9IGZsYWdzID09IENWX0NPTF9TQU1QTEU7CisgICAgaW50IHNhbXBsZXNfYWxsLCBkaW1zX2FsbDsKKyAgICBpbnQgaXNfc3BhcnNlID0gQ1ZfSVNfU1BBUlNFX01BVChwcmVkaWN0X2lucHV0KTsKKyAgICBDdk1hdCBwcmVkaWN0X2lucHV0X3BhcnQ7CisgICAgQ3ZBcnIqIHNhbXBsZSA9ICZwcmVkaWN0X2lucHV0X3BhcnQ7CisgICAgQ3ZNYXQgcHJvYnNfcGFydDsKKyAgICBDdk1hdCogcHJvYnMxID0gcHJvYnMgPyAmcHJvYnNfcGFydCA6IDA7CisgICAgCisgICAgaWYoICFDVl9JU19TVEFUX01PREVMKHN0YXRfbW9kZWwpICkKKyAgICAgICAgQ1ZfRVJST1IoICFzdGF0X21vZGVsID8gQ1ZfU3RzTnVsbFB0ciA6IENWX1N0c0JhZEFyZywgIkludmFsaWQgc3RhdGlzdGljYWwgbW9kZWwiICk7CisKKyAgICBpZiggIXN0YXRfbW9kZWwtPnByZWRpY3QgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsICJUaGVyZSBpcyBubyBcInByZWRpY3RcIiBtZXRob2QiICk7CisKKyAgICBpZiggIXByZWRpY3RfaW5wdXQgfHwgIXByZWRpY3Rfb3V0cHV0ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOVUxMIGlucHV0IG9yIG91dHB1dCBtYXRyaWNlcyIgKTsKKworICAgIGlmKCAhaXNfc3BhcnNlICYmICFDVl9JU19NQVQocHJlZGljdF9pbnB1dCkgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAicHJlZGljdF9pbnB1dCBzaG91bGQgYmUgYSBtYXRyaXggb3IgYSBzcGFyc2UgbWF0cml4IiApOworCisgICAgaWYoICFDVl9JU19NQVQocHJlZGljdF9vdXRwdXQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInByZWRpY3Rfb3V0cHV0IHNob3VsZCBiZSBhIG1hdHJpeCIgKTsKKworICAgIHR5cGUgPSBjdkdldEVsZW1UeXBlKCBwcmVkaWN0X2lucHV0ICk7CisgICAgaWYoIHR5cGUgIT0gQ1ZfMzJGQzEgfHwKKyAgICAgICAgKENWX01BVF9UWVBFKHByZWRpY3Rfb3V0cHV0LT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICAgQ1ZfTUFUX1RZUEUocHJlZGljdF9vdXRwdXQtPnR5cGUpICE9IENWXzMyU0MxICkpCisgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJUaGUgaW5wdXQgb3Igb3V0cHV0IG1hdHJpeCBoYXMgdW5zdXBwb3J0ZWQgZm9ybWF0IiApOworCisgICAgQ1ZfQ0FMTCggZCA9IGN2R2V0RGltcyggcHJlZGljdF9pbnB1dCwgc2l6ZXMgKSk7CisgICAgaWYoIGQgPiAyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUaGUgaW5wdXQgbWF0cml4IHNob3VsZCBiZSAxLSBvciAyLWRpbWVuc2lvbmFsIiApOworCisgICAgaWYoICF0ZmxhZyApCisgICAgeworICAgICAgICBzYW1wbGVzX2FsbCA9IHNhbXBsZXNfc2VsZWN0ZWQgPSBzaXplc1swXTsKKyAgICAgICAgZGltc19hbGwgPSBzaXplc1sxXTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2FtcGxlc19hbGwgPSBzYW1wbGVzX3NlbGVjdGVkID0gc2l6ZXNbMV07CisgICAgICAgIGRpbXNfYWxsID0gc2l6ZXNbMF07CisgICAgfQorCisgICAgaWYoIHNhbXBsZV9pZHggKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoc2FtcGxlX2lkeCkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgc2FtcGxlX2lkeCBtYXRyaXgiICk7CisKKyAgICAgICAgaWYoIHNhbXBsZV9pZHgtPmNvbHMgIT0gMSAmJiBzYW1wbGVfaWR4LT5yb3dzICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJzYW1wbGVfaWR4IG11c3QgYmUgMS1kaW1lbnNpb25hbCBtYXRyaXgiICk7CisKKyAgICAgICAgc2FtcGxlc19zZWxlY3RlZCA9IHNhbXBsZV9pZHgtPnJvd3MgKyBzYW1wbGVfaWR4LT5jb2xzIC0gMTsKKworICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoc2FtcGxlX2lkeC0+dHlwZSkgPT0gQ1ZfMzJTQzEgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc2FtcGxlc19zZWxlY3RlZCA+IHNhbXBsZXNfYWxsICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgInNhbXBsZV9pZHggaXMgdG9vIGxhcmdlIHZlY3RvciIgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzYW1wbGVzX3NlbGVjdGVkICE9IHNhbXBsZXNfYWxsICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgInNhbXBsZV9pZHggaGFzIGluY29ycmVjdCBzaXplIiApOworCisgICAgICAgIHNhbXBsZV9pZHhfc3RlcCA9IHNhbXBsZV9pZHgtPnN0ZXAgPworICAgICAgICAgICAgc2FtcGxlX2lkeC0+c3RlcCAvIENWX0VMRU1fU0laRShzYW1wbGVfaWR4LT50eXBlKSA6IDE7CisgICAgfQorCisgICAgaWYoIHByZWRpY3Rfb3V0cHV0LT5yb3dzICE9IDEgJiYgcHJlZGljdF9vdXRwdXQtPmNvbHMgIT0gMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAicHJlZGljdF9vdXRwdXQgc2hvdWxkIGJlIGEgMS1kaW1lbnNpb25hbCBtYXRyaXgiICk7CisKKyAgICBpZiggcHJlZGljdF9vdXRwdXQtPnJvd3MgKyBwcmVkaWN0X291dHB1dC0+Y29scyAtIDEgIT0gc2FtcGxlc19hbGwgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzVW5tYXRjaGVkU2l6ZXMsICJwcmVkaWN0X291dHB1dCBhbmQgcHJlZGljdF9pbnB1dCBoYXZlIHVuY29vcmRpbmF0ZWQgc2l6ZXMiICk7CisKKyAgICBwcmVkaWN0X291dHB1dF9zdGVwID0gcHJlZGljdF9vdXRwdXQtPnN0ZXAgPworICAgICAgICBwcmVkaWN0X291dHB1dC0+c3RlcCAvIENWX0VMRU1fU0laRShwcmVkaWN0X291dHB1dC0+dHlwZSkgOiAxOworCisgICAgaWYoIHByb2JzICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHByb2JzKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBtYXRyaXggb2YgcHJvYmFiaWxpdGllcyIgKTsKKworICAgICAgICBpZiggcHJvYnMtPnJvd3MgIT0gc2FtcGxlc19hbGwgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAgICAgIm1hdHJpeCBvZiBwcm9iYWJpbGl0aWVzIG11c3QgaGF2ZSBhcyBtYW55IHJvd3MgYXMgdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIiApOworCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShwcm9icy0+dHlwZSkgIT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAibWF0cml4IG9mIHByb2JhYmlsaXRpZXMgbXVzdCBoYXZlIDMyZkMxIHR5cGUiICk7CisgICAgfQorCisgICAgaWYoIGlzX3NwYXJzZSApCisgICAgeworICAgICAgICBDdlNwYXJzZU5vZGUqIG5vZGU7CisgICAgICAgIEN2U3BhcnNlTWF0SXRlcmF0b3IgbWF0X2l0ZXJhdG9yOworICAgICAgICBDdlNwYXJzZU1hdCogc3BhcnNlID0gKEN2U3BhcnNlTWF0KilwcmVkaWN0X2lucHV0OworICAgICAgICAKKyAgICAgICAgaWYoIHNhbXBsZV9pZHggJiYgQ1ZfTUFUX1RZUEUoc2FtcGxlX2lkeC0+dHlwZSkgPT0gQ1ZfMzJTQzEgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBzYW1wbGVfaWR4X2J1ZmZlciA9IGN2Q3JlYXRlTWF0KCAxLCBzYW1wbGVzX2FsbCwgQ1ZfOFVDMSApKTsKKyAgICAgICAgICAgIGN2WmVybyggc2FtcGxlX2lkeF9idWZmZXIgKTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVzX3NlbGVjdGVkOyBpKysgKQorICAgICAgICAgICAgICAgIHNhbXBsZV9pZHhfYnVmZmVyLT5kYXRhLnB0cltzYW1wbGVfaWR4LT5kYXRhLmlbaSpzYW1wbGVfaWR4X3N0ZXBdXSA9IDE7CisgICAgICAgICAgICBzYW1wbGVzX3NlbGVjdGVkID0gc2FtcGxlc19hbGw7CisgICAgICAgICAgICBzYW1wbGVfaWR4ID0gc2FtcGxlX2lkeF9idWZmZXI7CisgICAgICAgICAgICBzYW1wbGVfaWR4X3N0ZXAgPSAxOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBzcGFyc2Vfcm93cyA9IChDdlNwYXJzZU1hdCoqKWN2QWxsb2MoIHNhbXBsZXNfc2VsZWN0ZWQqc2l6ZW9mKHNwYXJzZV9yb3dzWzBdKSkpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlc19zZWxlY3RlZDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHNhbXBsZV9pZHggJiYgc2FtcGxlX2lkeC0+ZGF0YS5wdHJbaSpzYW1wbGVfaWR4X3N0ZXBdID09IDAgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgQ1ZfQ0FMTCggc3BhcnNlX3Jvd3NbaV0gPSBjdkNyZWF0ZVNwYXJzZU1hdCggMSwgJmRpbXNfYWxsLCB0eXBlICkpOworICAgICAgICAgICAgaWYoICFzdG9yYWdlICkKKyAgICAgICAgICAgICAgICBzdG9yYWdlID0gc3BhcnNlX3Jvd3NbaV0tPmhlYXAtPnN0b3JhZ2U7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaGFjazogdG8gZGVjcmVhc2UgbWVtb3J5IGZvb3RwcmludCwgbWFrZSBhbGwgdGhlIHNwYXJzZSBtYXRyaWNlcworICAgICAgICAgICAgICAgIC8vIHJlc2lkZSBpbiB0aGUgc2FtZSBzdG9yYWdlCisgICAgICAgICAgICAgICAgaW50IGVsZW1fc2l6ZSA9IHNwYXJzZV9yb3dzW2ldLT5oZWFwLT5lbGVtX3NpemU7CisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnNwYXJzZV9yb3dzW2ldLT5oZWFwLT5zdG9yYWdlICk7CisgICAgICAgICAgICAgICAgc3BhcnNlX3Jvd3NbaV0tPmhlYXAgPSBjdkNyZWF0ZVNldCggMCwgc2l6ZW9mKEN2U2V0KSwgZWxlbV9zaXplLCBzdG9yYWdlICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXQgZWFjaCByb3cgKG9yIGNvbHVtbikgb2YgcHJlZGljdF9pbnB1dCBpbnRvIHNlcGFyYXRlIHNwYXJzZSBtYXRyaXguCisgICAgICAgIG5vZGUgPSBjdkluaXRTcGFyc2VNYXRJdGVyYXRvciggc3BhcnNlLCAmbWF0X2l0ZXJhdG9yICk7CisgICAgICAgIGZvciggOyBub2RlICE9IDA7IG5vZGUgPSBjdkdldE5leHRTcGFyc2VOb2RlKCAmbWF0X2l0ZXJhdG9yICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCogaWR4ID0gQ1ZfTk9ERV9JRFgoIHNwYXJzZSwgbm9kZSApOworICAgICAgICAgICAgaW50IGlkeDAgPSBpZHhbdGZsYWcgXiAxXTsKKyAgICAgICAgICAgIGludCBpZHgxID0gaWR4W3RmbGFnXTsKKworICAgICAgICAgICAgaWYoIHNhbXBsZV9pZHggJiYgc2FtcGxlX2lkeC0+ZGF0YS5wdHJbaWR4MCpzYW1wbGVfaWR4X3N0ZXBdID09IDAgKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBhc3NlcnQoIHNwYXJzZV9yb3dzW2lkeDBdICE9IDAgKTsKKyAgICAgICAgICAgICooZmxvYXQqKWN2UHRyTkQoIHNwYXJzZSwgJmlkeDEsIDAsIDEsIDAgKSA9ICooZmxvYXQqKUNWX05PREVfVkFMKCBzcGFyc2UsIG5vZGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVzX3NlbGVjdGVkOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGk7CisgICAgICAgIGZsb2F0IHJlc3BvbnNlOworICAgICAgICAKKyAgICAgICAgaWYoIHNhbXBsZV9pZHggKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoc2FtcGxlX2lkeC0+dHlwZSkgPT0gQ1ZfMzJTQzEgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlkeCA9IHNhbXBsZV9pZHgtPmRhdGEuaVtpKnNhbXBsZV9pZHhfc3RlcF07CisgICAgICAgICAgICAgICAgaWYoICh1bnNpZ25lZClpZHggPj0gKHVuc2lnbmVkKXNhbXBsZXNfYWxsICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJTb21lIG9mIHNhbXBsZV9pZHggZWxlbWVudHMgYXJlIG91dCBvZiByYW5nZSIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIENWX01BVF9UWVBFKHNhbXBsZV9pZHgtPnR5cGUpID09IENWXzhVQzEgJiYKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9pZHgtPmRhdGEucHRyW2kqc2FtcGxlX2lkeF9zdGVwXSA9PSAwICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCAhaXNfc3BhcnNlICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICF0ZmxhZyApCisgICAgICAgICAgICAgICAgY3ZHZXRSb3coIHByZWRpY3RfaW5wdXQsICZwcmVkaWN0X2lucHV0X3BhcnQsIGlkeCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2R2V0Q29sKCBwcmVkaWN0X2lucHV0LCAmcHJlZGljdF9pbnB1dF9wYXJ0LCBpZHggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBzYW1wbGUgPSBzcGFyc2Vfcm93c1tpZHhdOworCisgICAgICAgIGlmKCBwcm9icyApCisgICAgICAgICAgICBjdkdldFJvdyggcHJvYnMsIHByb2JzMSwgaWR4ICk7CisKKyAgICAgICAgQ1ZfQ0FMTCggcmVzcG9uc2UgPSBzdGF0X21vZGVsLT5wcmVkaWN0KCBzdGF0X21vZGVsLCAoQ3ZNYXQqKXNhbXBsZSwgcHJvYnMxICkpOworCisgICAgICAgIGlmKCBDVl9NQVRfVFlQRShwcmVkaWN0X291dHB1dC0+dHlwZSkgPT0gQ1ZfMzJGQzEgKQorICAgICAgICAgICAgcHJlZGljdF9vdXRwdXQtPmRhdGEuZmxbaWR4KnByZWRpY3Rfb3V0cHV0X3N0ZXBdID0gcmVzcG9uc2U7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQVNTRVJUKCBjdlJvdW5kKHJlc3BvbnNlKSA9PSByZXNwb25zZSApOworICAgICAgICAgICAgcHJlZGljdF9vdXRwdXQtPmRhdGEuaVtpZHgqcHJlZGljdF9vdXRwdXRfc3RlcF0gPSBjdlJvdW5kKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggc3BhcnNlX3Jvd3MgKQorICAgIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVzX3NlbGVjdGVkOyBpKysgKQorICAgICAgICAgICAgaWYoIHNwYXJzZV9yb3dzW2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcGFyc2Vfcm93c1tpXS0+aGVhcC0+c3RvcmFnZSA9IDA7CisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlU3BhcnNlTWF0KCAmc3BhcnNlX3Jvd3NbaV0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY3ZGcmVlKCAmc3BhcnNlX3Jvd3MgKTsKKyAgICB9CisKKyAgICBjdlJlbGVhc2VNYXQoICZzYW1wbGVfaWR4X2J1ZmZlciApOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7Cit9CisjZW5kaWYKKworLy8gQnkgUC4gWWFyeWtpbiAtIGJlZ2luIC0KKwordm9pZCBjdkNvbWJpbmVSZXNwb25zZU1hcHMgKEN2TWF0KiAgX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogIG9sZF9yZXNwb25zZV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqICBuZXdfcmVzcG9uc2VfbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWF0Kiogb3V0X3Jlc3BvbnNlX21hcCkKK3sKKyAgICBpbnQqKiBvbGRfZGF0YSA9IE5VTEw7CisgICAgaW50KiogbmV3X2RhdGEgPSBOVUxMOworCisgICAgICAgIENWX0ZVTkNOQU1FICgiY3ZDb21iaW5lUmVzcG9uc2VNYXBzIik7CisgICAgICAgIF9fQkVHSU5fXworCisgICAgaW50IGksajsKKyAgICBpbnQgb2xkX24sIG5ld19uLCBvdXRfbjsKKyAgICBpbnQgc2FtcGxlcywgZnJlZV9yZXNwb25zZTsKKyAgICBpbnQqIGZpcnN0OworICAgIGludCogcmVzcG9uc2VzOworICAgIGludCogb3V0X2RhdGE7CisKKyAgICBpZiggb3V0X3Jlc3BvbnNlX21hcCApCisgICAgICAgICpvdXRfcmVzcG9uc2VfbWFwID0gMDsKKworLy8gQ2hlY2sgaW5wdXQgZGF0YS4KKyAgICBpZiAoKCFJQ1ZfSVNfTUFUX09GX1RZUEUgKF9yZXNwb25zZXMsIENWXzMyU0MxKSkgfHwKKyAgICAgICAgKCFJQ1ZfSVNfTUFUX09GX1RZUEUgKG9sZF9yZXNwb25zZV9tYXAsIENWXzMyU0MxKSkgfHwKKyAgICAgICAgKCFJQ1ZfSVNfTUFUX09GX1RZUEUgKG5ld19yZXNwb25zZV9tYXAsIENWXzMyU0MxKSkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiU29tZSBvZiBpbnB1dCBhcmd1bWVudHMgaXMgbm90IHRoZSBDdk1hdCIpCisgICAgfQorCisvLyBQcmVwYXJlIHNvcnRlZCByZXNwb25zZXMuCisgICAgZmlyc3QgPSBuZXdfcmVzcG9uc2VfbWFwLT5kYXRhLmk7CisgICAgbmV3X24gPSBuZXdfcmVzcG9uc2VfbWFwLT5jb2xzOworICAgIENWX0NBTEwgKG5ld19kYXRhID0gKGludCoqKWN2QWxsb2MgKG5ld19uICogc2l6ZW9mIChuZXdfZGF0YVswXSkpKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbmV3X247IGkrKykKKyAgICAgICAgbmV3X2RhdGFbaV0gPSBmaXJzdCArIGk7CisgICAgcXNvcnQgKG5ld19kYXRhLCBuZXdfbiwgc2l6ZW9mKGludCopLCBpY3ZDbXBJbnRlZ2Vyc1B0cik7CisKKyAgICBmaXJzdCA9IG9sZF9yZXNwb25zZV9tYXAtPmRhdGEuaTsKKyAgICBvbGRfbiA9IG9sZF9yZXNwb25zZV9tYXAtPmNvbHM7CisgICAgQ1ZfQ0FMTCAob2xkX2RhdGEgPSAoaW50KiopY3ZBbGxvYyAob2xkX24gKiBzaXplb2YgKG9sZF9kYXRhWzBdKSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBvbGRfbjsgaSsrKQorICAgICAgICBvbGRfZGF0YVtpXSA9IGZpcnN0ICsgaTsKKyAgICBxc29ydCAob2xkX2RhdGEsIG9sZF9uLCBzaXplb2YoaW50KiksIGljdkNtcEludGVnZXJzUHRyKTsKKworLy8gQ291bnQgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgcmVzcG9uc2VzLgorICAgIGZvciAoaSA9IDAsIGogPSAwLCBvdXRfbiA9IDA7IGkgPCBvbGRfbiAmJiBqIDwgbmV3X247IG91dF9uKyspCisgICAgeworICAgICAgICBpZiAoKm9sZF9kYXRhW2ldID09ICpuZXdfZGF0YVtqXSkKKyAgICAgICAgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpvbGRfZGF0YVtpXSA8ICpuZXdfZGF0YVtqXSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaisrOworICAgIH0KKyAgICBvdXRfbiArPSBvbGRfbiAtIGkgKyBuZXdfbiAtIGo7CisKKy8vIENyZWF0ZSBhbmQgZmlsbCB0aGUgcmVzdWx0IHJlc3BvbnNlIG1hcHMuCisgICAgQ1ZfQ0FMTCAoKm91dF9yZXNwb25zZV9tYXAgPSBjdkNyZWF0ZU1hdCAoMSwgb3V0X24sIENWXzMyU0MxKSk7CisgICAgb3V0X2RhdGEgPSAoKm91dF9yZXNwb25zZV9tYXApLT5kYXRhLmk7CisgICAgbWVtY3B5IChvdXRfZGF0YSwgZmlyc3QsIG9sZF9uICogc2l6ZW9mIChpbnQpKTsKKworICAgIGZyZWVfcmVzcG9uc2UgPSBvbGRfbjsKKyAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IG9sZF9uICYmIGogPCBuZXdfbjsgKQorICAgIHsKKyAgICAgICAgaWYgKCpvbGRfZGF0YVtpXSA9PSAqbmV3X2RhdGFbal0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpuZXdfZGF0YVtqXSA9IChpbnQpKG9sZF9kYXRhW2ldIC0gZmlyc3QpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgaisrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpvbGRfZGF0YVtpXSA8ICpuZXdfZGF0YVtqXSkKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBvdXRfZGF0YVtmcmVlX3Jlc3BvbnNlXSA9ICpuZXdfZGF0YVtqXTsKKyAgICAgICAgICAgICpuZXdfZGF0YVtqXSA9IGZyZWVfcmVzcG9uc2UrKzsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKDsgaiA8IG5ld19uOyBqKyspCisgICAgeworICAgICAgICBvdXRfZGF0YVtmcmVlX3Jlc3BvbnNlXSA9ICpuZXdfZGF0YVtqXTsKKyAgICAgICAgKm5ld19kYXRhW2pdID0gZnJlZV9yZXNwb25zZSsrOworICAgIH0KKyAgICBDVl9BU1NFUlQgKGZyZWVfcmVzcG9uc2UgPT0gb3V0X24pOworCisvLyBDaGFuZ2UgPHJlc3BvbnNlcz4gYWNjb3JkaW5nIHRvIG91dCByZXNwb25zZSBtYXAuCisgICAgc2FtcGxlcyA9IF9yZXNwb25zZXMtPmNvbHMgKyBfcmVzcG9uc2VzLT5yb3dzIC0gMTsKKyAgICByZXNwb25zZXMgPSBfcmVzcG9uc2VzLT5kYXRhLmk7CisgICAgZmlyc3QgPSBuZXdfcmVzcG9uc2VfbWFwLT5kYXRhLmk7CisgICAgZm9yIChpID0gMDsgaSA8IHNhbXBsZXM7IGkrKykKKyAgICB7CisgICAgICAgIHJlc3BvbnNlc1tpXSA9IGZpcnN0W3Jlc3BvbnNlc1tpXV07CisgICAgfQorCisgICAgICAgIF9fRU5EX18KKworICAgIGN2RnJlZSgmb2xkX2RhdGEpOworICAgIGN2RnJlZSgmbmV3X2RhdGEpOworCit9CisKKworaW50IGljdkdldE51bWJlck9mQ2x1c3RlciggZG91YmxlKiBwcm9iX3ZlY3RvciwgaW50IG51bV9vZl9jbHVzdGVycywgZmxvYXQgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG91dGxpZXJfdGhyZXNoLCBpbnQgbm9ybWFsaXplX3Byb2JzICkKK3sKKyAgICBpbnQgbWF4X3Byb2JfbG9jID0gMDsKKyAgIAorICAgIENWX0ZVTkNOQU1FKCJpY3ZHZXROdW1iZXJPZkNsdXN0ZXIiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgcHJvYiwgbWF4cHJvYiwgc3VtOworICAgIGludCBpOworCisgICAgQ1ZfQVNTRVJUKHByb2JfdmVjdG9yKTsKKyAgICBDVl9BU1NFUlQobnVtX29mX2NsdXN0ZXJzID49IDApOworCisgICAgbWF4cHJvYiA9IHByb2JfdmVjdG9yWzBdOworICAgIG1heF9wcm9iX2xvYyA9IDA7CisgICAgc3VtID0gbWF4cHJvYjsKKyAgICBmb3IoIGkgPSAxOyBpIDwgbnVtX29mX2NsdXN0ZXJzOyBpKysgKQorICAgIHsKKyAgICAgICAgcHJvYiA9IHByb2JfdmVjdG9yW2ldOworICAgICAgICBzdW0gKz0gcHJvYjsKKyAgICAgICAgaWYoIHByb2IgPiBtYXhwcm9iICkgCisgICAgICAgIHsKKyAgICAgICAgICAgIG1heF9wcm9iX2xvYyA9IGk7CisgICAgICAgICAgICBtYXhwcm9iID0gcHJvYjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiggbm9ybWFsaXplX3Byb2JzICYmIGZhYnMoc3VtIC0gMS4pID4gRkxUX0VQU0lMT04gKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bV9vZl9jbHVzdGVyczsgaSsrICkKKyAgICAgICAgICAgIHByb2JfdmVjdG9yW2ldIC89IHN1bTsKKyAgICB9CisgICAgaWYoIGZhYnMociAtIDEuKSA+IEZMVF9FUFNJTE9OICYmIGZhYnMoc3VtIC0gMS4pIDwgb3V0bGllcl90aHJlc2ggKQorICAgICAgICBtYXhfcHJvYl9sb2MgPSAtMTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gbWF4X3Byb2JfbG9jOworCit9IC8vIEVuZCBvZiBpY3ZHZXROdW1iZXJPZkNsdXN0ZXIKKworCit2b2lkIGljdkZpbmRDbHVzdGVyTGFiZWxzKCBjb25zdCBDdk1hdCogcHJvYnMsIGZsb2F0IG91dGxpZXJfdGhyZXNoLCBmbG9hdCByLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogbGFiZWxzICkKK3sKKyAgICBDdk1hdCogY291bnRzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJpY3ZGaW5kQ2x1c3RlckxhYmVscyIpOworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBuY2x1c3RlcnMsIG5zYW1wbGVzOworICAgIGludCBpLCBqOworICAgIGRvdWJsZSogcHJvYnNfZGF0YTsKKworICAgIENWX0FTU0VSVCggSUNWX0lTX01BVF9PRl9UWVBFKHByb2JzLCBDVl82NEZDMSkgKTsKKyAgICBDVl9BU1NFUlQoIElDVl9JU19NQVRfT0ZfVFlQRShsYWJlbHMsIENWXzMyU0MxKSApOworCisgICAgbmNsdXN0ZXJzID0gcHJvYnMtPmNvbHM7CisgICAgbnNhbXBsZXMgID0gcHJvYnMtPnJvd3M7CisgICAgQ1ZfQVNTRVJUKCBuc2FtcGxlcyA9PSBsYWJlbHMtPmNvbHMgKTsKKworICAgIENWX0NBTEwoIGNvdW50cyA9IGN2Q3JlYXRlTWF0KCAxLCBuY2x1c3RlcnMgKyAxLCBDVl8zMlNDMSApICk7CisgICAgQ1ZfQ0FMTCggY3ZTZXRaZXJvKCBjb3VudHMgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKysgKQorICAgIHsKKyAgICAgICAgbGFiZWxzLT5kYXRhLmlbaV0gPSBpY3ZHZXROdW1iZXJPZkNsdXN0ZXIoIHByb2JzLT5kYXRhLmRiICsgaSpwcm9icy0+Y29scywKKyAgICAgICAgICAgIG5jbHVzdGVycywgciwgb3V0bGllcl90aHJlc2gsIDEgKTsKKyAgICAgICAgY291bnRzLT5kYXRhLmlbbGFiZWxzLT5kYXRhLmlbaV0gKyAxXSsrOworICAgIH0KKyAgICBDVl9BU1NFUlQoKGludCljdlN1bShjb3VudHMpLnZhbFswXSA9PSBuc2FtcGxlcyk7CisgICAgLy8gRmlsbGluZyBlbXB0eSBjbHVzdGVycyB3aXRoIHRoZSB2ZWN0b3IsIHRoYXQgaGFzIHRoZSBtYXhpbWFsIHByb2JhYmlsaXR5CisgICAgZm9yKCBqID0gMDsgaiA8IG5jbHVzdGVyczsgaisrICkgLy8gb3V0bGllcnMgYXJlIGlnbm9yZWQKKyAgICB7CisgICAgICAgIGludCBtYXhwcm9iX2xvYyA9IC0xOworICAgICAgICBkb3VibGUgbWF4cHJvYiA9IDA7CisKKyAgICAgICAgaWYoIGNvdW50cy0+ZGF0YS5pW2orMV0gKSAvLyBqLXRoIGNsYXNzIGlzIG5vdCBlbXB0eQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIGxvb2sgZm9yIHRoZSBwcmVzZW50YXRpdmUsIHdoaWNoIGlzIG5vdCBsb25lbHkgaW4gaXQncyBjbHVzdGVyCisgICAgICAgIC8vIGFuZCB0aGF0IGhhcyBhIG1heGltYWwgcHJvYmFiaWxpdHkgYW1vbmcgYWxsIHRoZXNlIHZlY3RvcnMKKyAgICAgICAgcHJvYnNfZGF0YSA9IHByb2JzLT5kYXRhLmRiOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKywgcHJvYnNfZGF0YSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxhYmVsID0gbGFiZWxzLT5kYXRhLmlbaV07CisgICAgICAgICAgICBkb3VibGUgcHJvYjsKKyAgICAgICAgICAgIGlmKCBjb3VudHMtPmRhdGEuaVtsYWJlbCsxXSA9PSAwIHx8CisgICAgICAgICAgICAgICAgKGNvdW50cy0+ZGF0YS5pW2xhYmVsKzFdIDw9IDEgJiYgbGFiZWwgIT0gLTEpICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHByb2IgPSAqcHJvYnNfZGF0YTsKKyAgICAgICAgICAgIGlmKCBwcm9iID49IG1heHByb2IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heHByb2IgPSBwcm9iOworICAgICAgICAgICAgICAgIG1heHByb2JfbG9jID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtYXhwcm9iX2xvYyA9PSAwIDw9PiBudW1iZXIgb2YgdmVjdG9ycyBsZXNzIHRoZW4gbnVtYmVyIG9mIGNsdXN0ZXJzCisgICAgICAgIENWX0FTU0VSVCggbWF4cHJvYl9sb2MgPj0gMCApOworICAgICAgICBjb3VudHMtPmRhdGEuaVtsYWJlbHMtPmRhdGEuaVttYXhwcm9iX2xvY10gKyAxXS0tOworICAgICAgICBsYWJlbHMtPmRhdGEuaVttYXhwcm9iX2xvY10gPSBqOworICAgICAgICBjb3VudHMtPmRhdGEuaVtqICsgMV0rKzsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmY291bnRzICk7Cit9IC8vIEVuZCBvZiBpY3ZGaW5kQ2x1c3RlckxhYmVscworCisvKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWwvc3JjL21sYW5uX21scC5jcHAgYi9tbC9zcmMvbWxhbm5fbWxwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ2Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWwvc3JjL21sYW5uX21scC5jcHAKQEAgLTAsMCArMSwxNTIwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfbWwuaCIKKworQ3ZBTk5fTUxQX1RyYWluUGFyYW1zOjpDdkFOTl9NTFBfVHJhaW5QYXJhbXMoKQoreworICAgIHRlcm1fY3JpdCA9IGN2VGVybUNyaXRlcmlhKCBDVl9URVJNQ1JJVF9JVEVSICsgQ1ZfVEVSTUNSSVRfRVBTLCAxMDAwLCAwLjAxICk7CisgICAgdHJhaW5fbWV0aG9kID0gUlBST1A7CisgICAgYnBfZHdfc2NhbGUgPSBicF9tb21lbnRfc2NhbGUgPSAwLjE7CisgICAgcnBfZHcwID0gMC4xOyBycF9kd19wbHVzID0gMS4yOyBycF9kd19taW51cyA9IDAuNTsKKyAgICBycF9kd19taW4gPSBGTFRfRVBTSUxPTjsgcnBfZHdfbWF4ID0gNTAuOworfQorCisKK0N2QU5OX01MUF9UcmFpblBhcmFtczo6Q3ZBTk5fTUxQX1RyYWluUGFyYW1zKCBDdlRlcm1Dcml0ZXJpYSBfdGVybV9jcml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBfdHJhaW5fbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfcGFyYW0xLCBkb3VibGUgX3BhcmFtMiApCit7CisgICAgdGVybV9jcml0ID0gX3Rlcm1fY3JpdDsKKyAgICB0cmFpbl9tZXRob2QgPSBfdHJhaW5fbWV0aG9kOworICAgIGJwX2R3X3NjYWxlID0gYnBfbW9tZW50X3NjYWxlID0gMC4xOworICAgIHJwX2R3MCA9IDEuOyBycF9kd19wbHVzID0gMS4yOyBycF9kd19taW51cyA9IDAuNTsKKyAgICBycF9kd19taW4gPSBGTFRfRVBTSUxPTjsgcnBfZHdfbWF4ID0gNTAuOworCisgICAgaWYoIHRyYWluX21ldGhvZCA9PSBSUFJPUCApCisgICAgeworICAgICAgICBycF9kdzAgPSBfcGFyYW0xOworICAgICAgICBpZiggcnBfZHcwIDwgRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgcnBfZHcwID0gMS47CisgICAgICAgIHJwX2R3X21pbiA9IF9wYXJhbTI7CisgICAgICAgIHJwX2R3X21pbiA9IE1BWCggcnBfZHdfbWluLCAwICk7CisgICAgfQorICAgIGVsc2UgaWYoIHRyYWluX21ldGhvZCA9PSBCQUNLUFJPUCApCisgICAgeworICAgICAgICBicF9kd19zY2FsZSA9IF9wYXJhbTE7CisgICAgICAgIGlmKCBicF9kd19zY2FsZSA8PSAwICkKKyAgICAgICAgICAgIGJwX2R3X3NjYWxlID0gMC4xOworICAgICAgICBicF9kd19zY2FsZSA9IE1BWCggYnBfZHdfc2NhbGUsIDFlLTMgKTsKKyAgICAgICAgYnBfZHdfc2NhbGUgPSBNSU4oIGJwX2R3X3NjYWxlLCAxICk7CisgICAgICAgIGJwX21vbWVudF9zY2FsZSA9IF9wYXJhbTI7CisgICAgICAgIGlmKCBicF9tb21lbnRfc2NhbGUgPCAwICkKKyAgICAgICAgICAgIGJwX21vbWVudF9zY2FsZSA9IDAuMTsKKyAgICAgICAgYnBfbW9tZW50X3NjYWxlID0gTUlOKCBicF9tb21lbnRfc2NhbGUsIDEgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0cmFpbl9tZXRob2QgPSBSUFJPUDsKK30KKworCitDdkFOTl9NTFBfVHJhaW5QYXJhbXM6On5DdkFOTl9NTFBfVHJhaW5QYXJhbXMoKQoreworfQorCisKK0N2QU5OX01MUDo6Q3ZBTk5fTUxQKCkKK3sKKyAgICBsYXllcl9zaXplcyA9IHdidWYgPSAwOworICAgIG1pbl92YWwgPSBtYXhfdmFsID0gbWluX3ZhbDEgPSBtYXhfdmFsMSA9IDAuOworICAgIHdlaWdodHMgPSAwOworICAgIHJuZyA9IGN2Uk5HKC0xKTsKKyAgICBkZWZhdWx0X21vZGVsX25hbWUgPSAibXlfbm4iOworICAgIGNsZWFyKCk7Cit9CisKKworQ3ZBTk5fTUxQOjpDdkFOTl9NTFAoIGNvbnN0IEN2TWF0KiBfbGF5ZXJfc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgaW50IF9hY3Rpdl9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZl9wYXJhbTEsIGRvdWJsZSBfZl9wYXJhbTIgKQoreworICAgIGxheWVyX3NpemVzID0gd2J1ZiA9IDA7CisgICAgbWluX3ZhbCA9IG1heF92YWwgPSBtaW5fdmFsMSA9IG1heF92YWwxID0gMC47CisgICAgd2VpZ2h0cyA9IDA7CisgICAgcm5nID0gY3ZSTkcoLTEpOworICAgIGRlZmF1bHRfbW9kZWxfbmFtZSA9ICJteV9ubiI7CisgICAgY3JlYXRlKCBfbGF5ZXJfc2l6ZXMsIF9hY3Rpdl9mdW5jLCBfZl9wYXJhbTEsIF9mX3BhcmFtMiApOworfQorCisKK0N2QU5OX01MUDo6fkN2QU5OX01MUCgpCit7CisgICAgY2xlYXIoKTsKK30KKworCit2b2lkIEN2QU5OX01MUDo6Y2xlYXIoKQoreworICAgIGN2UmVsZWFzZU1hdCggJmxheWVyX3NpemVzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmd2J1ZiApOworICAgIGN2RnJlZSggJndlaWdodHMgKTsKKyAgICBhY3Rpdl9mdW5jID0gU0lHTU9JRF9TWU07CisgICAgZl9wYXJhbTEgPSBmX3BhcmFtMiA9IDE7CisgICAgbWF4X2J1Zl9zeiA9IDEgPDwgMTI7Cit9CisKKwordm9pZCBDdkFOTl9NTFA6OnNldF9hY3Rpdl9mdW5jKCBpbnQgX2FjdGl2X2Z1bmMsIGRvdWJsZSBfZl9wYXJhbTEsIGRvdWJsZSBfZl9wYXJhbTIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjpzZXRfYWN0aXZfZnVuYyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBfYWN0aXZfZnVuYyA8IDAgfHwgX2FjdGl2X2Z1bmMgPiBHQVVTU0lBTiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVW5rbm93biBhY3RpdmF0aW9uIGZ1bmN0aW9uIiApOworCisgICAgYWN0aXZfZnVuYyA9IF9hY3Rpdl9mdW5jOworCisgICAgc3dpdGNoKCBhY3Rpdl9mdW5jICkKKyAgICB7CisgICAgY2FzZSBTSUdNT0lEX1NZTToKKyAgICAgICAgbWF4X3ZhbCA9IDAuOTU7IG1pbl92YWwgPSAtbWF4X3ZhbDsKKyAgICAgICAgbWF4X3ZhbDEgPSAwLjk4OyBtaW5fdmFsMSA9IC1tYXhfdmFsMTsKKyAgICAgICAgaWYoIGZhYnMoX2ZfcGFyYW0xKSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIF9mX3BhcmFtMSA9IDIuLzM7CisgICAgICAgIGlmKCBmYWJzKF9mX3BhcmFtMikgPCBGTFRfRVBTSUxPTiApCisgICAgICAgICAgICBfZl9wYXJhbTIgPSAxLjcxNTk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgR0FVU1NJQU46CisgICAgICAgIG1heF92YWwgPSAxLjsgbWluX3ZhbCA9IDAuMDU7CisgICAgICAgIG1heF92YWwxID0gMS47IG1pbl92YWwxID0gMC4wMjsKKyAgICAgICAgaWYoIGZhYnMoX2ZfcGFyYW0xKSA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIF9mX3BhcmFtMSA9IDEuOworICAgICAgICBpZiggZmFicyhfZl9wYXJhbTIpIDwgRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgX2ZfcGFyYW0yID0gMS47CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1pbl92YWwgPSBtYXhfdmFsID0gbWluX3ZhbDEgPSBtYXhfdmFsMSA9IDAuOworICAgICAgICBfZl9wYXJhbTEgPSAxLjsKKyAgICAgICAgX2ZfcGFyYW0yID0gMC47CisgICAgfQorCisgICAgZl9wYXJhbTEgPSBfZl9wYXJhbTE7CisgICAgZl9wYXJhbTIgPSBfZl9wYXJhbTI7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjppbml0X3dlaWdodHMoKQoreworICAgIGludCBpLCBqLCBrOworCisgICAgZm9yKCBpID0gMTsgaSA8IGxheWVyX3NpemVzLT5jb2xzOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IG4xID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtpLTFdOworICAgICAgICBpbnQgbjIgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2ldOworICAgICAgICBkb3VibGUgdmFsID0gMCwgRyA9IG4yID4gMiA/IDAuNypwb3coKGRvdWJsZSluMSwxLi8objItMSkpIDogMS47CisgICAgICAgIGRvdWJsZSogdyA9IHdlaWdodHNbaV07CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSB3ZWlnaHRzIHVzaW5nIE5ndXllbi1XaWRyb3cgYWxnb3JpdGhtCisgICAgICAgIGZvciggaiA9IDA7IGogPCBuMjsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8PSBuMTsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YWwgPSBjdlJhbmRSZWFsKCZybmcpKjItMS47CisgICAgICAgICAgICAgICAgd1trKm4yICsgal0gPSB2YWw7CisgICAgICAgICAgICAgICAgcyArPSB2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBpIDwgbGF5ZXJfc2l6ZXMtPmNvbHMgLSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzID0gMS4vKHMgLSB2YWwpOworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPD0gbjE7IGsrKyApCisgICAgICAgICAgICAgICAgICAgIHdbaypuMiArIGpdICo9IHM7CisgICAgICAgICAgICAgICAgd1tuMSpuMiArIGpdICo9IEcqKC0xK2oqMi4vbjIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpjcmVhdGUoIGNvbnN0IEN2TWF0KiBfbGF5ZXJfc2l6ZXMsIGludCBfYWN0aXZfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfZl9wYXJhbTEsIGRvdWJsZSBfZl9wYXJhbTIgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjpjcmVhdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgbF9zdGVwLCBsX2NvdW50LCBidWZfc3ogPSAwOworICAgIGludCAqbF9zcmMsICpsX2RzdDsKKworICAgIGNsZWFyKCk7CisKKyAgICBpZiggIUNWX0lTX01BVChfbGF5ZXJfc2l6ZXMpIHx8CisgICAgICAgIF9sYXllcl9zaXplcy0+Y29scyAhPSAxICYmIF9sYXllcl9zaXplcy0+cm93cyAhPSAxIHx8CisgICAgICAgIENWX01BVF9UWVBFKF9sYXllcl9zaXplcy0+dHlwZSkgIT0gQ1ZfMzJTQzEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAiVGhlIGFycmF5IG9mIGxheWVyIG5ldXJvbiBjb3VudGVycyBtdXN0IGJlIGFuIGludGVnZXIgdmVjdG9yIiApOworCisgICAgQ1ZfQ0FMTCggc2V0X2FjdGl2X2Z1bmMoIF9hY3Rpdl9mdW5jLCBfZl9wYXJhbTEsIF9mX3BhcmFtMiApKTsKKworICAgIGxfY291bnQgPSBfbGF5ZXJfc2l6ZXMtPnJvd3MgKyBfbGF5ZXJfc2l6ZXMtPmNvbHMgLSAxOworICAgIGxfc3JjID0gX2xheWVyX3NpemVzLT5kYXRhLmk7CisgICAgbF9zdGVwID0gQ1ZfSVNfTUFUX0NPTlQoX2xheWVyX3NpemVzLT50eXBlKSA/IDEgOgorICAgICAgICAgICAgICAgIF9sYXllcl9zaXplcy0+c3RlcCAvIHNpemVvZihsX3NyY1swXSk7CisgICAgQ1ZfQ0FMTCggbGF5ZXJfc2l6ZXMgPSBjdkNyZWF0ZU1hdCggMSwgbF9jb3VudCwgQ1ZfMzJTQzEgKSk7CisgICAgbF9kc3QgPSBsYXllcl9zaXplcy0+ZGF0YS5pOworCisgICAgbWF4X2NvdW50ID0gMDsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbF9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBuID0gbF9zcmNbaSpsX3N0ZXBdOworICAgICAgICBpZiggbiA8IDEgKyAoMCA8IGkgJiYgaSA8IGxfY291bnQtMSkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICJ0aGVyZSBzaG91bGQgYmUgYXQgbGVhc3Qgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0ICIKKyAgICAgICAgICAgICJhbmQgZXZlcnkgaGlkZGVuIGxheWVyIG11c3QgaGF2ZSBtb3JlIHRoYW4gMSBuZXVyb24iICk7CisgICAgICAgIGxfZHN0W2ldID0gbjsKKyAgICAgICAgbWF4X2NvdW50ID0gTUFYKCBtYXhfY291bnQsIG4gKTsKKyAgICAgICAgaWYoIGkgPiAwICkKKyAgICAgICAgICAgIGJ1Zl9zeiArPSAobF9kc3RbaS0xXSsxKSpuOworICAgIH0KKworICAgIGJ1Zl9zeiArPSAobF9kc3RbMF0gKyBsX2RzdFtsX2NvdW50LTFdKjIpKjI7CisKKyAgICBDVl9DQUxMKCB3YnVmID0gY3ZDcmVhdGVNYXQoIDEsIGJ1Zl9zeiwgQ1ZfNjRGICkpOworICAgIENWX0NBTEwoIHdlaWdodHMgPSAoZG91YmxlKiopY3ZBbGxvYyggKGxfY291bnQrMSkqc2l6ZW9mKHdlaWdodHNbMF0pICkpOworCisgICAgd2VpZ2h0c1swXSA9IHdidWYtPmRhdGEuZGI7CisgICAgd2VpZ2h0c1sxXSA9IHdlaWdodHNbMF0gKyBsX2RzdFswXSoyOworICAgIGZvciggaSA9IDE7IGkgPCBsX2NvdW50OyBpKysgKQorICAgICAgICB3ZWlnaHRzW2krMV0gPSB3ZWlnaHRzW2ldICsgKGxfZHN0W2ktMV0gKyAxKSpsX2RzdFtpXTsKKyAgICB3ZWlnaHRzW2xfY291bnQrMV0gPSB3ZWlnaHRzW2xfY291bnRdICsgbF9kc3RbbF9jb3VudC0xXSoyOworCisgICAgX19FTkRfXzsKK30KKworCitmbG9hdCBDdkFOTl9NTFA6OnByZWRpY3QoIGNvbnN0IEN2TWF0KiBfaW5wdXRzLCBDdk1hdCogX291dHB1dHMgKSBjb25zdAoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjpwcmVkaWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlKiBidWY7CisgICAgaW50IGksIGosIG4sIGRuID0gMCwgbF9jb3VudCwgZG4wLCBidWZfc3osIG1pbl9idWZfc3o7CisKKyAgICBpZiggIWxheWVyX3NpemVzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVGhlIG5ldHdvcmsgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIiApOworCisgICAgaWYoICFDVl9JU19NQVQoX2lucHV0cykgfHwgIUNWX0lTX01BVChfb3V0cHV0cykgfHwKKyAgICAgICAgIUNWX0FSRV9UWVBFU19FUShfaW5wdXRzLF9vdXRwdXRzKSB8fAorICAgICAgICBDVl9NQVRfVFlQRShfaW5wdXRzLT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICBDVl9NQVRfVFlQRShfaW5wdXRzLT50eXBlKSAhPSBDVl82NEZDMSB8fAorICAgICAgICBfaW5wdXRzLT5yb3dzICE9IF9vdXRwdXRzLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkJvdGggaW5wdXQgYW5kIG91dHB1dCBtdXN0IGJlIGZsb2F0aW5nLXBvaW50IG1hdHJpY2VzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIHRoZSBzYW1lIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJvd3MiICk7CisKKyAgICBpZiggX2lucHV0cy0+Y29scyAhPSBsYXllcl9zaXplcy0+ZGF0YS5pWzBdICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJpbnB1dCBtYXRyaXggbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjb2x1bW5zIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgbnVtYmVyIG9mIG5ldXJvbnMgaW4gdGhlIGlucHV0IGxheWVyIiApOworCisgICAgaWYoIF9vdXRwdXRzLT5jb2xzICE9IGxheWVyX3NpemVzLT5kYXRhLmlbbGF5ZXJfc2l6ZXMtPmNvbHMgLSAxXSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRTaXplLCAib3V0cHV0IG1hdHJpeCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNvbHVtbnMgYXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBudW1iZXIgb2YgbmV1cm9ucyBpbiB0aGUgb3V0cHV0IGxheWVyIiApOworICAgIG4gPSBkbjAgPSBfaW5wdXRzLT5yb3dzOworICAgIG1pbl9idWZfc3ogPSAyKm1heF9jb3VudDsKKyAgICBidWZfc3ogPSBuKm1pbl9idWZfc3o7CisKKyAgICBpZiggYnVmX3N6ID4gbWF4X2J1Zl9zeiApCisgICAgeworICAgICAgICBkbjAgPSBtYXhfYnVmX3N6L21pbl9idWZfc3o7CisgICAgICAgIGRuMCA9IE1BWCggZG4wLCAxICk7CisgICAgICAgIGJ1Zl9zeiA9IGRuMCptaW5fYnVmX3N6OworICAgIH0KKworICAgIGJ1ZiA9IChkb3VibGUqKWN2U3RhY2tBbGxvYyggYnVmX3N6KnNpemVvZihidWZbMF0pICk7CisgICAgbF9jb3VudCA9IGxheWVyX3NpemVzLT5jb2xzOworCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkgKz0gZG4gKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgaGRyWzJdLCBfdywgKmxheWVyX2luID0gJmhkclswXSwgKmxheWVyX291dCA9ICZoZHJbMV0sICp0ZW1wOworICAgICAgICBkbiA9IE1JTiggZG4wLCBuIC0gaSApOworCisgICAgICAgIGN2R2V0Um93cyggX2lucHV0cywgbGF5ZXJfaW4sIGksIGkgKyBkbiApOworICAgICAgICBjdkluaXRNYXRIZWFkZXIoIGxheWVyX291dCwgZG4sIGxheWVyX2luLT5jb2xzLCBDVl82NEYsIGJ1ZiApOworCisgICAgICAgIHNjYWxlX2lucHV0KCBsYXllcl9pbiwgbGF5ZXJfb3V0ICk7CisgICAgICAgIENWX1NXQVAoIGxheWVyX2luLCBsYXllcl9vdXQsIHRlbXAgKTsKKworICAgICAgICBmb3IoIGogPSAxOyBqIDwgbF9jb3VudDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlKiBkYXRhID0gYnVmICsgKGomMSA/IG1heF9jb3VudCpkbjAgOiAwKTsKKyAgICAgICAgICAgIGludCBjb2xzID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtqXTsKKworICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCBsYXllcl9vdXQsIGRuLCBjb2xzLCBDVl82NEYsIGRhdGEgKTsKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl93LCBsYXllcl9pbi0+Y29scywgbGF5ZXJfb3V0LT5jb2xzLCBDVl82NEYsIHdlaWdodHNbal0gKTsKKyAgICAgICAgICAgIGN2R0VNTSggbGF5ZXJfaW4sICZfdywgMSwgMCwgMCwgbGF5ZXJfb3V0ICk7CisgICAgICAgICAgICBjYWxjX2FjdGl2X2Z1bmMoIGxheWVyX291dCwgX3cuZGF0YS5kYiArIF93LnJvd3MqX3cuY29scyApOworCisgICAgICAgICAgICBDVl9TV0FQKCBsYXllcl9pbiwgbGF5ZXJfb3V0LCB0ZW1wICk7CisgICAgICAgIH0KKworICAgICAgICBjdkdldFJvd3MoIF9vdXRwdXRzLCBsYXllcl9vdXQsIGksIGkgKyBkbiApOworICAgICAgICBzY2FsZV9vdXRwdXQoIGxheWVyX2luLCBsYXllcl9vdXQgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIDAuZjsKK30KKworCit2b2lkIEN2QU5OX01MUDo6c2NhbGVfaW5wdXQoIGNvbnN0IEN2TWF0KiBfc3JjLCBDdk1hdCogX2RzdCApIGNvbnN0Cit7CisgICAgaW50IGksIGosIGNvbHMgPSBfc3JjLT5jb2xzOworICAgIGRvdWJsZSogZHN0ID0gX2RzdC0+ZGF0YS5kYjsKKyAgICBjb25zdCBkb3VibGUqIHcgPSB3ZWlnaHRzWzBdOworICAgIGludCBzdGVwID0gX3NyYy0+c3RlcDsKKworICAgIGlmKCBDVl9NQVRfVFlQRSggX3NyYy0+dHlwZSApID09IENWXzMyRiApCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gX3NyYy0+ZGF0YS5mbDsKKyAgICAgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfc3JjLT5yb3dzOyBpKyssIHNyYyArPSBzdGVwLCBkc3QgKz0gY29scyApCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY29sczsgaisrICkKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSBzcmNbal0qd1tqKjJdICsgd1tqKjIrMV07CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGNvbnN0IGRvdWJsZSogc3JjID0gX3NyYy0+ZGF0YS5kYjsKKyAgICAgICAgc3RlcCAvPSBzaXplb2Yoc3JjWzBdKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfc3JjLT5yb3dzOyBpKyssIHNyYyArPSBzdGVwLCBkc3QgKz0gY29scyApCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY29sczsgaisrICkKKyAgICAgICAgICAgICAgICBkc3Rbal0gPSBzcmNbal0qd1tqKjJdICsgd1tqKjIrMV07CisgICAgfQorfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpzY2FsZV9vdXRwdXQoIGNvbnN0IEN2TWF0KiBfc3JjLCBDdk1hdCogX2RzdCApIGNvbnN0Cit7CisgICAgaW50IGksIGosIGNvbHMgPSBfc3JjLT5jb2xzOworICAgIGNvbnN0IGRvdWJsZSogc3JjID0gX3NyYy0+ZGF0YS5kYjsKKyAgICBjb25zdCBkb3VibGUqIHcgPSB3ZWlnaHRzW2xheWVyX3NpemVzLT5jb2xzXTsKKyAgICBpbnQgc3RlcCA9IF9kc3QtPnN0ZXA7CisKKyAgICBpZiggQ1ZfTUFUX1RZUEUoIF9kc3QtPnR5cGUgKSA9PSBDVl8zMkYgKQorICAgIHsKKyAgICAgICAgZmxvYXQqIGRzdCA9IF9kc3QtPmRhdGEuZmw7CisgICAgICAgIHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgX3NyYy0+cm93czsgaSsrLCBzcmMgKz0gY29scywgZHN0ICs9IHN0ZXAgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKyApCisgICAgICAgICAgICAgICAgZHN0W2pdID0gKGZsb2F0KShzcmNbal0qd1tqKjJdICsgd1tqKjIrMV0pOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkb3VibGUqIGRzdCA9IF9kc3QtPmRhdGEuZGI7CisgICAgICAgIHN0ZXAgLz0gc2l6ZW9mKGRzdFswXSk7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgX3NyYy0+cm93czsgaSsrLCBzcmMgKz0gY29scywgZHN0ICs9IHN0ZXAgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKyApCisgICAgICAgICAgICAgICAgZHN0W2pdID0gc3JjW2pdKndbaioyXSArIHdbaioyKzFdOworICAgIH0KK30KKworCit2b2lkIEN2QU5OX01MUDo6Y2FsY19hY3Rpdl9mdW5jKCBDdk1hdCogc3VtcywgY29uc3QgZG91YmxlKiBiaWFzICkgY29uc3QKK3sKKyAgICBpbnQgaSwgaiwgbiA9IHN1bXMtPnJvd3MsIGNvbHMgPSBzdW1zLT5jb2xzOworICAgIGRvdWJsZSogZGF0YSA9IHN1bXMtPmRhdGEuZGI7CisgICAgZG91YmxlIHNjYWxlID0gMCwgc2NhbGUyID0gZl9wYXJhbTI7CisKKyAgICBzd2l0Y2goIGFjdGl2X2Z1bmMgKQorICAgIHsKKyAgICBjYXNlIElERU5USVRZOgorICAgICAgICBzY2FsZSA9IDEuOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNJR01PSURfU1lNOgorICAgICAgICBzY2FsZSA9IC1mX3BhcmFtMTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBHQVVTU0lBTjoKKyAgICAgICAgc2NhbGUgPSAtZl9wYXJhbTEqZl9wYXJhbTE7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIDsKKyAgICB9CisKKyAgICBhc3NlcnQoIENWX0lTX01BVF9DT05UKHN1bXMtPnR5cGUpICk7CisKKyAgICBpZiggYWN0aXZfZnVuYyAhPSBHQVVTU0lBTiApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCBkYXRhICs9IGNvbHMgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKyApCisgICAgICAgICAgICAgICAgZGF0YVtqXSA9IChkYXRhW2pdICsgYmlhc1tqXSkqc2NhbGU7CisKKyAgICAgICAgaWYoIGFjdGl2X2Z1bmMgPT0gSURFTlRJVFkgKQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCBkYXRhICs9IGNvbHMgKQorICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNvbHM7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSBkYXRhW2pdICsgYmlhc1tqXTsKKyAgICAgICAgICAgICAgICBkYXRhW2pdID0gdCp0KnNjYWxlOworICAgICAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBjdkV4cCggc3Vtcywgc3VtcyApOworCisgICAgbiAqPSBjb2xzOworICAgIGRhdGEgLT0gbjsKKworICAgIHN3aXRjaCggYWN0aXZfZnVuYyApCisgICAgeworICAgIGNhc2UgU0lHTU9JRF9TWU06CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gbiAtIDQ7IGkgKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB4MCA9IDEuK2RhdGFbaV0sIHgxID0gMS4rZGF0YVtpKzFdLCB4MiA9IDEuK2RhdGFbaSsyXSwgeDMgPSAxLitkYXRhW2krM107CisgICAgICAgICAgICBkb3VibGUgYSA9IHgwKngxLCBiID0geDIqeDMsIGQgPSBzY2FsZTIvKGEqYiksIHQwLCB0MTsKKyAgICAgICAgICAgIGEgKj0gZDsgYiAqPSBkOworICAgICAgICAgICAgdDAgPSAoMiAtIHgwKSpiKngxOyB0MSA9ICgyIC0geDEpKmIqeDA7CisgICAgICAgICAgICBkYXRhW2ldID0gdDA7IGRhdGFbaSsxXSA9IHQxOworICAgICAgICAgICAgdDAgPSAoMiAtIHgyKSphKngzOyB0MSA9ICgyIC0geDMpKmEqeDI7CisgICAgICAgICAgICBkYXRhW2krMl0gPSB0MDsgZGF0YVtpKzNdID0gdDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB0ID0gc2NhbGUyKigxLiAtIGRhdGFbaV0pLygxLiArIGRhdGFbaV0pOworICAgICAgICAgICAgZGF0YVtpXSA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdBVVNTSUFOOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIGRhdGFbaV0gPSBzY2FsZTIqZGF0YVtpXTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICA7CisgICAgfQorfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpjYWxjX2FjdGl2X2Z1bmNfZGVyaXYoIEN2TWF0KiBfeGYsIEN2TWF0KiBfZGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIGJpYXMgKSBjb25zdAoreworICAgIGludCBpLCBqLCBuID0gX3hmLT5yb3dzLCBjb2xzID0gX3hmLT5jb2xzOworICAgIGRvdWJsZSogeGYgPSBfeGYtPmRhdGEuZGI7CisgICAgZG91YmxlKiBkZiA9IF9kZi0+ZGF0YS5kYjsKKyAgICBkb3VibGUgc2NhbGUsIHNjYWxlMiA9IGZfcGFyYW0yOworICAgIGFzc2VydCggQ1ZfSVNfTUFUX0NPTlQoIF94Zi0+dHlwZSAmIF9kZi0+dHlwZSApICk7CisKKyAgICBpZiggYWN0aXZfZnVuYyA9PSBJREVOVElUWSApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCB4ZiArPSBjb2xzLCBkZiArPSBjb2xzICkKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjb2xzOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHhmW2pdICs9IGJpYXNbal07CisgICAgICAgICAgICAgICAgZGZbal0gPSAxOworICAgICAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYoIGFjdGl2X2Z1bmMgPT0gR0FVU1NJQU4gKQorICAgIHsKKyAgICAgICAgc2NhbGUgPSAtZl9wYXJhbTEqZl9wYXJhbTE7CisgICAgICAgIHNjYWxlMiAqPSBzY2FsZTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKywgeGYgKz0gY29scywgZGYgKz0gY29scyApCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY29sczsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHhmW2pdICsgYmlhc1tqXTsKKyAgICAgICAgICAgICAgICBkZltqXSA9IHQqMipzY2FsZTI7CisgICAgICAgICAgICAgICAgeGZbal0gPSB0KnQqc2NhbGU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNjYWxlID0gLWZfcGFyYW0xOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrLCB4ZiArPSBjb2xzLCBkZiArPSBjb2xzICkKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjb2xzOyBqKysgKQorICAgICAgICAgICAgICAgIHhmW2pdID0gKHhmW2pdICsgYmlhc1tqXSkqc2NhbGU7CisgICAgfQorCisgICAgY3ZFeHAoIF94ZiwgX3hmICk7CisKKyAgICBuICo9IGNvbHM7CisgICAgeGYgLT0gbjsgZGYgLT0gbjsKKworICAgIC8vICgoMStleHAoLWF4KSleLTEpJz1hKigoMStleHAoLWF4KSleLTIpKmV4cCgtYXgpOworICAgIC8vICgoMS1leHAoLWF4KSkvKDErZXhwKC1heCkpKSc9KGEqZXhwKC1heCkqKDErZXhwKC1heCkpICsgYSpleHAoLWF4KSooMS1leHAoLWF4KSkpLygxK2V4cCgtYXgpKV4yPQorICAgIC8vIDIqYSpleHAoLWF4KS8oMStleHAoLWF4KSleMgorICAgIHN3aXRjaCggYWN0aXZfZnVuYyApCisgICAgeworICAgIGNhc2UgU0lHTU9JRF9TWU06CisgICAgICAgIHNjYWxlICo9IC0yKmZfcGFyYW0yOworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG4gLSA0OyBpICs9IDQgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgeDAgPSAxLit4ZltpXSwgeDEgPSAxLit4ZltpKzFdLCB4MiA9IDEuK3hmW2krMl0sIHgzID0gMS4reGZbaSszXTsKKyAgICAgICAgICAgIGRvdWJsZSBhID0geDAqeDEsIGIgPSB4Mip4MywgZCA9IDEuLyhhKmIpLCB0MCwgdDE7CisgICAgICAgICAgICBhICo9IGQ7IGIgKj0gZDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdDAgPSBiKngxOyB0MSA9IGIqeDA7CisgICAgICAgICAgICBkZltpXSA9IHNjYWxlKnhmW2ldKnQwKnQwOworICAgICAgICAgICAgZGZbaSsxXSA9IHNjYWxlKnhmW2krMV0qdDEqdDE7CisgICAgICAgICAgICB0MCAqPSBzY2FsZTIqKDIgLSB4MCk7IHQxICo9IHNjYWxlMiooMiAtIHgxKTsKKyAgICAgICAgICAgIHhmW2ldID0gdDA7IHhmW2krMV0gPSB0MTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgdDAgPSBhKngzOyB0MSA9IGEqeDI7CisgICAgICAgICAgICBkZltpKzJdID0gc2NhbGUqeGZbaSsyXSp0MCp0MDsKKyAgICAgICAgICAgIGRmW2krM10gPSBzY2FsZSp4ZltpKzNdKnQxKnQxOworICAgICAgICAgICAgdDAgKj0gc2NhbGUyKigyIC0geDIpOyB0MSAqPSBzY2FsZTIqKDIgLSB4Myk7CisgICAgICAgICAgICB4ZltpKzJdID0gdDA7IHhmW2krM10gPSB0MTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gMS4vKDEuICsgeGZbaV0pOworICAgICAgICAgICAgZG91YmxlIHQxID0gc2NhbGUqeGZbaV0qdDAqdDA7CisgICAgICAgICAgICB0MCAqPSBzY2FsZTIqKDEuIC0geGZbaV0pOworICAgICAgICAgICAgZGZbaV0gPSB0MTsKKyAgICAgICAgICAgIHhmW2ldID0gdDA7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdBVVNTSUFOOgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIGRmW2ldICo9IHhmW2ldOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICA7CisgICAgfQorfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpjYWxjX2lucHV0X3NjYWxlKCBjb25zdCBDdlZlY3RvcnMqIHZlY3MsIGludCBmbGFncyApCit7CisgICAgYm9vbCByZXNldF93ZWlnaHRzID0gKGZsYWdzICYgVVBEQVRFX1dFSUdIVFMpID09IDA7CisgICAgYm9vbCBub19zY2FsZSA9IChmbGFncyAmIE5PX0lOUFVUX1NDQUxFKSAhPSAwOworICAgIGRvdWJsZSogc2NhbGUgPSB3ZWlnaHRzWzBdOworICAgIGludCBjb3VudCA9IHZlY3MtPmNvdW50OworICAgIAorICAgIGlmKCByZXNldF93ZWlnaHRzICkKKyAgICB7CisgICAgICAgIGludCBpLCBqLCB2Y291bnQgPSBsYXllcl9zaXplcy0+ZGF0YS5pWzBdOworICAgICAgICBpbnQgdHlwZSA9IHZlY3MtPnR5cGU7CisgICAgICAgIGRvdWJsZSBhID0gbm9fc2NhbGUgPyAxLiA6IDAuOworICAgICAgICAKKyAgICAgICAgZm9yKCBqID0gMDsgaiA8IHZjb3VudDsgaisrICkKKyAgICAgICAgICAgIHNjYWxlWzIqal0gPSBhLCBzY2FsZVtqKjIrMV0gPSAwLjsKKworICAgICAgICBpZiggbm9fc2NhbGUgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZmxvYXQqIGYgPSB2ZWNzLT5kYXRhLmZsW2ldOworICAgICAgICAgICAgY29uc3QgZG91YmxlKiBkID0gdmVjcy0+ZGF0YS5kYltpXTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB2Y291bnQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB0eXBlID09IENWXzMyRiA/IChkb3VibGUpZltqXSA6IGRbal07CisgICAgICAgICAgICAgICAgc2NhbGVbaioyXSArPSB0OworICAgICAgICAgICAgICAgIHNjYWxlW2oqMisxXSArPSB0KnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgdmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgcyA9IHNjYWxlW2oqMl0sIHMyID0gc2NhbGVbaioyKzFdOworICAgICAgICAgICAgZG91YmxlIG0gPSBzL2NvdW50LCBzaWdtYTIgPSBzMi9jb3VudCAtIG0qbTsKKyAgICAgICAgICAgIHNjYWxlW2oqMl0gPSBzaWdtYTIgPCBEQkxfRVBTSUxPTiA/IDEgOiAxLi9zcXJ0KHNpZ21hMik7CisgICAgICAgICAgICBzY2FsZVtqKjIrMV0gPSAtbSpzY2FsZVtqKjJdOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpjYWxjX291dHB1dF9zY2FsZSggY29uc3QgQ3ZWZWN0b3JzKiB2ZWNzLCBpbnQgZmxhZ3MgKQoreworICAgIGludCBpLCBqLCB2Y291bnQgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2xheWVyX3NpemVzLT5jb2xzLTFdOworICAgIGludCB0eXBlID0gdmVjcy0+dHlwZTsKKyAgICBkb3VibGUgbSA9IG1pbl92YWwsIE0gPSBtYXhfdmFsLCBtMSA9IG1pbl92YWwxLCBNMSA9IG1heF92YWwxOworICAgIGJvb2wgcmVzZXRfd2VpZ2h0cyA9IChmbGFncyAmIFVQREFURV9XRUlHSFRTKSA9PSAwOworICAgIGJvb2wgbm9fc2NhbGUgPSAoZmxhZ3MgJiBOT19PVVRQVVRfU0NBTEUpICE9IDA7CisgICAgaW50IGxfY291bnQgPSBsYXllcl9zaXplcy0+Y29sczsKKyAgICBkb3VibGUqIHNjYWxlID0gd2VpZ2h0c1tsX2NvdW50XTsKKyAgICBkb3VibGUqIGludl9zY2FsZSA9IHdlaWdodHNbbF9jb3VudCsxXTsKKyAgICBpbnQgY291bnQgPSB2ZWNzLT5jb3VudDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjpjYWxjX291dHB1dF9zY2FsZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCByZXNldF93ZWlnaHRzICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBhMCA9IG5vX3NjYWxlID8gMSA6IERCTF9NQVgsIGIwID0gbm9fc2NhbGUgPyAwIDogLURCTF9NQVg7CisgICAgICAgIAorICAgICAgICBmb3IoIGogPSAwOyBqIDwgdmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBzY2FsZVsyKmpdID0gaW52X3NjYWxlWzIqal0gPSBhMDsKKyAgICAgICAgICAgIHNjYWxlW2oqMisxXSA9IGludl9zY2FsZVsyKmorMV0gPSBiMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBub19zY2FsZSApCisgICAgICAgICAgICBFWElUOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGZsb2F0KiBmID0gdmVjcy0+ZGF0YS5mbFtpXTsKKyAgICAgICAgY29uc3QgZG91YmxlKiBkID0gdmVjcy0+ZGF0YS5kYltpXTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgdmNvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdCA9IHR5cGUgPT0gQ1ZfMzJGID8gKGRvdWJsZSlmW2pdIDogZFtqXTsKKworICAgICAgICAgICAgaWYoIHJlc2V0X3dlaWdodHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBtaiA9IHNjYWxlW2oqMl0sIE1qID0gc2NhbGVbaioyKzFdOworICAgICAgICAgICAgICAgIGlmKCBtaiA+IHQgKSBtaiA9IHQ7CisgICAgICAgICAgICAgICAgaWYoIE1qIDwgdCApIE1qID0gdDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNjYWxlW2oqMl0gPSBtajsKKyAgICAgICAgICAgICAgICBzY2FsZVtqKjIrMV0gPSBNajsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ID0gdCpzY2FsZVtqKjJdICsgc2NhbGVbMipqKzFdOworICAgICAgICAgICAgICAgIGlmKCB0IDwgbTEgfHwgdCA+IE0xICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICJTb21lIG9mIG5ldyBvdXRwdXQgdHJhaW5pbmcgdmVjdG9yIGNvbXBvbmVudHMgcnVuIGV4Y2VlZCB0aGUgb3JpZ2luYWwgcmFuZ2UgdG9vIG11Y2giICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggcmVzZXRfd2VpZ2h0cyApCisgICAgICAgIGZvciggaiA9IDA7IGogPCB2Y291bnQ7IGorKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIG1hcCBtai4uTWogdG8gbS4uTQorICAgICAgICAgICAgZG91YmxlIG1qID0gc2NhbGVbaioyXSwgTWogPSBzY2FsZVtqKjIrMV07CisgICAgICAgICAgICBkb3VibGUgYSwgYjsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YSA9IE1qIC0gbWo7CisgICAgICAgICAgICBpZiggZGVsdGEgPCBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICAgICAgYSA9IDEsIGIgPSAoTSArIG0gLSBNaiAtIG1qKSowLjU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYSA9IChNIC0gbSkvZGVsdGEsIGIgPSBtIC0gbWoqYTsKKyAgICAgICAgICAgIGludl9zY2FsZVtqKjJdID0gYTsgaW52X3NjYWxlW2oqMisxXSA9IGI7CisgICAgICAgICAgICBhID0gMS4vYTsgYiA9IC1iKmE7CisgICAgICAgICAgICBzY2FsZVtqKjJdID0gYTsgc2NhbGVbaioyKzFdID0gYjsKKyAgICAgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitib29sIEN2QU5OX01MUDo6cHJlcGFyZV90b190cmFpbiggY29uc3QgQ3ZNYXQqIF9pbnB1dHMsIGNvbnN0IEN2TWF0KiBfb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX3dlaWdodHMsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwKKyAgICAgICAgICAgIEN2VmVjdG9ycyogX2l2ZWNzLCBDdlZlY3RvcnMqIF9vdmVjcywgZG91YmxlKiogX3N3LCBpbnQgX2ZsYWdzICkKK3sKKyAgICBib29sIG9rID0gZmFsc2U7CisgICAgQ3ZNYXQqIHNhbXBsZV9pZHggPSAwOworICAgIEN2VmVjdG9ycyBpdmVjcywgb3ZlY3M7CisgICAgZG91YmxlKiBzdyA9IDA7CisgICAgaW50IGNvdW50ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjpwcmVwYXJlX3RvX3RyYWluIiApOworCisgICAgaXZlY3MuZGF0YS5wdHIgPSBvdmVjcy5kYXRhLnB0ciA9IDA7CisgICAgYXNzZXJ0KCBfaXZlY3MgJiYgX292ZWNzICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBpbnQqIHNpZHggPSAwOworICAgIGludCBpLCBzd190eXBlID0gMCwgc3dfY291bnQgPSAwOworICAgIGludCBzd19zdGVwID0gMDsKKyAgICBkb3VibGUgc3dfc3VtID0gMDsKKworICAgIGlmKCAhbGF5ZXJfc2l6ZXMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzRXJyb3IsCisgICAgICAgICJUaGUgbmV0d29yayBoYXMgbm90IGJlZW4gY3JlYXRlZC4gVXNlIG1ldGhvZCBjcmVhdGUgb3IgdGhlIGFwcHJvcHJpYXRlIGNvbnN0cnVjdG9yIiApOworCisgICAgaWYoICFDVl9JU19NQVQoX2lucHV0cykgfHwgQ1ZfTUFUX1RZUEUoX2lucHV0cy0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYKKyAgICAgICAgQ1ZfTUFUX1RZUEUoX2lucHV0cy0+dHlwZSkgIT0gQ1ZfNjRGQzEgfHwgX2lucHV0cy0+Y29scyAhPSBsYXllcl9zaXplcy0+ZGF0YS5pWzBdICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgImlucHV0IHRyYWluaW5nIGRhdGEgc2hvdWxkIGJlIGEgZmxvYXRpbmctcG9pbnQgbWF0cml4IHdpdGgiCisgICAgICAgICJ0aGUgbnVtYmVyIG9mIHJvd3MgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmFpbmluZyBzYW1wbGVzIGFuZCAiCisgICAgICAgICJ0aGUgbnVtYmVyIG9mIGNvbHVtbnMgZXF1YWwgdG8gdGhlIHNpemUgb2YgMC10aCAoaW5wdXQpIGxheWVyIiApOworCisgICAgaWYoICFDVl9JU19NQVQoX291dHB1dHMpIHx8IENWX01BVF9UWVBFKF9vdXRwdXRzLT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICBDVl9NQVRfVFlQRShfb3V0cHV0cy0+dHlwZSkgIT0gQ1ZfNjRGQzEgfHwKKyAgICAgICAgX291dHB1dHMtPmNvbHMgIT0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtsYXllcl9zaXplcy0+Y29scyAtIDFdICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgIm91dHB1dCB0cmFpbmluZyBkYXRhIHNob3VsZCBiZSBhIGZsb2F0aW5nLXBvaW50IG1hdHJpeCB3aXRoIgorICAgICAgICAidGhlIG51bWJlciBvZiByb3dzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdHJhaW5pbmcgc2FtcGxlcyBhbmQgIgorICAgICAgICAidGhlIG51bWJlciBvZiBjb2x1bW5zIGVxdWFsIHRvIHRoZSBzaXplIG9mIGxhc3QgKG91dHB1dCkgbGF5ZXIiICk7CisKKyAgICBpZiggX2lucHV0cy0+cm93cyAhPSBfb3V0cHV0cy0+cm93cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNVbm1hdGNoZWRTaXplcywgIlRoZSBudW1iZXJzIG9mIGlucHV0IGFuZCBvdXRwdXQgc2FtcGxlcyBkbyBub3QgbWF0Y2giICk7CisKKyAgICBpZiggX3NhbXBsZV9pZHggKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggc2FtcGxlX2lkeCA9IGN2UHJlcHJvY2Vzc0luZGV4QXJyYXkoIF9zYW1wbGVfaWR4LCBfaW5wdXRzLT5yb3dzICkpOworICAgICAgICBzaWR4ID0gc2FtcGxlX2lkeC0+ZGF0YS5pOworICAgICAgICBjb3VudCA9IHNhbXBsZV9pZHgtPmNvbHMgKyBzYW1wbGVfaWR4LT5yb3dzIC0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBjb3VudCA9IF9pbnB1dHMtPnJvd3M7CisKKyAgICBpZiggX3NhbXBsZV93ZWlnaHRzICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKF9zYW1wbGVfd2VpZ2h0cykgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInNhbXBsZV93ZWlnaHRzIChpZiBwYXNzZWQpIG11c3QgYmUgYSB2YWxpZCBtYXRyaXgiICk7CisKKyAgICAgICAgc3dfdHlwZSA9IENWX01BVF9UWVBFKF9zYW1wbGVfd2VpZ2h0cy0+dHlwZSk7CisgICAgICAgIHN3X2NvdW50ID0gX3NhbXBsZV93ZWlnaHRzLT5jb2xzICsgX3NhbXBsZV93ZWlnaHRzLT5yb3dzIC0gMTsKKworICAgICAgICBpZiggc3dfdHlwZSAhPSBDVl8zMkZDMSAmJiBzd190eXBlICE9IENWXzY0RkMxIHx8CisgICAgICAgICAgICBfc2FtcGxlX3dlaWdodHMtPmNvbHMgIT0gMSAmJiBfc2FtcGxlX3dlaWdodHMtPnJvd3MgIT0gMSB8fAorICAgICAgICAgICAgc3dfY291bnQgIT0gY291bnQgJiYgc3dfY291bnQgIT0gX2lucHV0cy0+cm93cyApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgInNhbXBsZV93ZWlnaHRzIG11c3QgYmUgMWQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIGNvbnRhaW5pbmcgd2VpZ2h0cyAiCisgICAgICAgICAgICAib2YgYWxsIG9yIHNlbGVjdGVkIHRyYWluaW5nIHNhbXBsZXMiICk7CisKKyAgICAgICAgc3dfc3RlcCA9IENWX0lTX01BVF9DT05UKF9zYW1wbGVfd2VpZ2h0cy0+dHlwZSkgPyAxIDoKKyAgICAgICAgICAgIF9zYW1wbGVfd2VpZ2h0cy0+c3RlcC9DVl9FTEVNX1NJWkUoc3dfdHlwZSk7CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBzdyA9IChkb3VibGUqKWN2QWxsb2MoIGNvdW50KnNpemVvZihzd1swXSkgKSk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggaXZlY3MuZGF0YS5wdHIgPSAodWNoYXIqKiljdkFsbG9jKCBjb3VudCpzaXplb2YoaXZlY3MuZGF0YS5wdHJbMF0pICkpOworICAgIENWX0NBTEwoIG92ZWNzLmRhdGEucHRyID0gKHVjaGFyKiopY3ZBbGxvYyggY291bnQqc2l6ZW9mKG92ZWNzLmRhdGEucHRyWzBdKSApKTsKKyAgICAKKyAgICBpdmVjcy50eXBlID0gQ1ZfTUFUX1RZUEUoX2lucHV0cy0+dHlwZSk7CisgICAgb3ZlY3MudHlwZSA9IENWX01BVF9UWVBFKF9vdXRwdXRzLT50eXBlKTsKKyAgICBpdmVjcy5jb3VudCA9IG92ZWNzLmNvdW50ID0gY291bnQ7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gc2lkeCA/IHNpZHhbaV0gOiBpOworICAgICAgICBpdmVjcy5kYXRhLnB0cltpXSA9IF9pbnB1dHMtPmRhdGEucHRyICsgaWR4Kl9pbnB1dHMtPnN0ZXA7CisgICAgICAgIG92ZWNzLmRhdGEucHRyW2ldID0gX291dHB1dHMtPmRhdGEucHRyICsgaWR4Kl9vdXRwdXRzLT5zdGVwOworICAgICAgICBpZiggc3cgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgc2kgPSBzd19jb3VudCA9PSBjb3VudCA/IGkgOiBpZHg7CisgICAgICAgICAgICBkb3VibGUgdyA9IHN3X3R5cGUgPT0gQ1ZfMzJGQzEgPworICAgICAgICAgICAgICAgIChkb3VibGUpX3NhbXBsZV93ZWlnaHRzLT5kYXRhLmZsW3NpKnN3X3N0ZXBdIDoKKyAgICAgICAgICAgICAgICBfc2FtcGxlX3dlaWdodHMtPmRhdGEuZGJbc2kqc3dfc3RlcF07CisgICAgICAgICAgICBzd1tpXSA9IHc7CisgICAgICAgICAgICBpZiggdyA8IDAgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAic29tZSBvZiBzYW1wbGUgd2VpZ2h0cyBhcmUgbmVnYXRpdmUiICk7CisgICAgICAgICAgICBzd19zdW0gKz0gdzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vcm1hbGl6ZSB3ZWlnaHRzCisgICAgaWYoIHN3ICkKKyAgICB7CisgICAgICAgIHN3X3N1bSA9IHN3X3N1bSA+IERCTF9FUFNJTE9OID8gMS4vc3dfc3VtIDogMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgc3dbaV0gKj0gc3dfc3VtOworICAgIH0KKworICAgIGNhbGNfaW5wdXRfc2NhbGUoICZpdmVjcywgX2ZsYWdzICk7CisgICAgQ1ZfQ0FMTCggY2FsY19vdXRwdXRfc2NhbGUoICZvdmVjcywgX2ZsYWdzICkpOworCisgICAgb2sgPSB0cnVlOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCAhb2sgKQorICAgIHsKKyAgICAgICAgY3ZGcmVlKCAmaXZlY3MuZGF0YS5wdHIgKTsKKyAgICAgICAgY3ZGcmVlKCAmb3ZlY3MuZGF0YS5wdHIgKTsKKyAgICAgICAgY3ZGcmVlKCAmc3cgKTsKKyAgICB9CisKKyAgICBjdlJlbGVhc2VNYXQoICZzYW1wbGVfaWR4ICk7CisgICAgKl9pdmVjcyA9IGl2ZWNzOworICAgICpfb3ZlY3MgPSBvdmVjczsKKyAgICAqX3N3ID0gc3c7CisKKyAgICByZXR1cm4gb2s7Cit9CisKKworaW50IEN2QU5OX01MUDo6dHJhaW4oIGNvbnN0IEN2TWF0KiBfaW5wdXRzLCBjb25zdCBDdk1hdCogX291dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfd2VpZ2h0cywgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgIEN2QU5OX01MUF9UcmFpblBhcmFtcyBfcGFyYW1zLCBpbnQgZmxhZ3MgKQoreworICAgIGNvbnN0IGludCBNQVhfSVRFUiA9IDEwMDA7CisgICAgY29uc3QgZG91YmxlIERFRkFVTFRfRVBTSUxPTiA9IEZMVF9FUFNJTE9OOworICAgIAorICAgIGRvdWJsZSogc3cgPSAwOworICAgIEN2VmVjdG9ycyB4MCwgdTsKKyAgICBpbnQgaXRlciA9IC0xOworICAgCisgICAgeDAuZGF0YS5wdHIgPSB1LmRhdGEucHRyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjp0cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBtYXhfaXRlcjsKKyAgICBkb3VibGUgZXBzaWxvbjsKKworICAgIHBhcmFtcyA9IF9wYXJhbXM7CisKKyAgICAvLyBpbml0aWFsaXplIHRyYWluaW5nIGRhdGEKKyAgICBDVl9DQUxMKCBwcmVwYXJlX3RvX3RyYWluKCBfaW5wdXRzLCBfb3V0cHV0cywgX3NhbXBsZV93ZWlnaHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zYW1wbGVfaWR4LCAmeDAsICZ1LCAmc3csIGZsYWdzICkpOworCisgICAgLy8gLi4uIGFuZCBsaW5rIHdlaWdodHMKKyAgICBpZiggIShmbGFncyAmIFVQREFURV9XRUlHSFRTKSApCisgICAgICAgIGluaXRfd2VpZ2h0cygpOworCisgICAgbWF4X2l0ZXIgPSBwYXJhbXMudGVybV9jcml0LnR5cGUgJiBDVl9URVJNQ1JJVF9JVEVSID8gcGFyYW1zLnRlcm1fY3JpdC5tYXhfaXRlciA6IE1BWF9JVEVSOworICAgIG1heF9pdGVyID0gTUlOKCBtYXhfaXRlciwgTUFYX0lURVIgKTsKKyAgICBtYXhfaXRlciA9IE1BWCggbWF4X2l0ZXIsIDEgKTsKKworICAgIGVwc2lsb24gPSBwYXJhbXMudGVybV9jcml0LnR5cGUgJiBDVl9URVJNQ1JJVF9FUFMgPyBwYXJhbXMudGVybV9jcml0LmVwc2lsb24gOiBERUZBVUxUX0VQU0lMT047CisgICAgZXBzaWxvbiA9IE1BWChlcHNpbG9uLCBEQkxfRVBTSUxPTik7CisKKyAgICBwYXJhbXMudGVybV9jcml0LnR5cGUgPSBDVl9URVJNQ1JJVF9JVEVSICsgQ1ZfVEVSTUNSSVRfRVBTOworICAgIHBhcmFtcy50ZXJtX2NyaXQubWF4X2l0ZXIgPSBtYXhfaXRlcjsKKyAgICBwYXJhbXMudGVybV9jcml0LmVwc2lsb24gPSBlcHNpbG9uOworCisgICAgaWYoIHBhcmFtcy50cmFpbl9tZXRob2QgPT0gQ3ZBTk5fTUxQX1RyYWluUGFyYW1zOjpCQUNLUFJPUCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpdGVyID0gdHJhaW5fYmFja3Byb3AoIHgwLCB1LCBzdyApKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggaXRlciA9IHRyYWluX3Jwcm9wKCB4MCwgdSwgc3cgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2RnJlZSggJngwLmRhdGEucHRyICk7CisgICAgY3ZGcmVlKCAmdS5kYXRhLnB0ciApOworICAgIGN2RnJlZSggJnN3ICk7CisKKyAgICByZXR1cm4gaXRlcjsKK30KKworCitpbnQgQ3ZBTk5fTUxQOjp0cmFpbl9iYWNrcHJvcCggQ3ZWZWN0b3JzIHgwLCBDdlZlY3RvcnMgdSwgY29uc3QgZG91YmxlKiBzdyApCit7CisgICAgQ3ZNYXQqIGR3ID0gMDsKKyAgICBDdk1hdCogYnVmID0gMDsKKyAgICBkb3VibGUgKip4ID0gMCwgKipkZiA9IDA7CisgICAgQ3ZNYXQqIF9pZHggPSAwOworICAgIGludCBpdGVyID0gLTEsIGNvdW50ID0geDAuY291bnQ7CisgICAKKyAgICBDVl9GVU5DTkFNRSggIkN2QU5OX01MUDo6dHJhaW5fYmFja3Byb3AiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgaiwgaywgaXZjb3VudCwgb3Zjb3VudCwgbF9jb3VudCwgdG90YWwgPSAwLCBtYXhfaXRlcjsKKyAgICBkb3VibGUgKmJ1Zl9wdHI7CisgICAgZG91YmxlIHByZXZfRSA9IERCTF9NQVgqMC41LCBFID0gMCwgZXBzaWxvbjsKKworICAgIG1heF9pdGVyID0gcGFyYW1zLnRlcm1fY3JpdC5tYXhfaXRlcipjb3VudDsKKyAgICBlcHNpbG9uID0gcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uKmNvdW50OworCisgICAgbF9jb3VudCA9IGxheWVyX3NpemVzLT5jb2xzOworICAgIGl2Y291bnQgPSBsYXllcl9zaXplcy0+ZGF0YS5pWzBdOworICAgIG92Y291bnQgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2xfY291bnQtMV07CisKKyAgICAvLyBhbGxvY2F0ZSBidWZmZXJzCisgICAgZm9yKCBpID0gMDsgaSA8IGxfY291bnQ7IGkrKyApCisgICAgICAgIHRvdGFsICs9IGxheWVyX3NpemVzLT5kYXRhLmlbaV0gKyAxOworCisgICAgQ1ZfQ0FMTCggZHcgPSBjdkNyZWF0ZU1hdCggd2J1Zi0+cm93cywgd2J1Zi0+Y29scywgd2J1Zi0+dHlwZSApKTsKKyAgICBjdlplcm8oIGR3ICk7CisgICAgQ1ZfQ0FMTCggYnVmID0gY3ZDcmVhdGVNYXQoIDEsICh0b3RhbCArIG1heF9jb3VudCkqMiwgQ1ZfNjRGICkpOworICAgIENWX0NBTEwoIF9pZHggPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzMyU0MxICkpOworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgX2lkeC0+ZGF0YS5pW2ldID0gaTsKKworICAgIENWX0NBTEwoIHggPSAoZG91YmxlKiopY3ZBbGxvYyggdG90YWwqMipzaXplb2YoeFswXSkgKSk7CisgICAgZGYgPSB4ICsgdG90YWw7CisgICAgYnVmX3B0ciA9IGJ1Zi0+ZGF0YS5kYjsKKworICAgIGZvciggaiA9IDA7IGogPCBsX2NvdW50OyBqKysgKQorICAgIHsKKyAgICAgICAgeFtqXSA9IGJ1Zl9wdHI7CisgICAgICAgIGRmW2pdID0geFtqXSArIGxheWVyX3NpemVzLT5kYXRhLmlbal07CisgICAgICAgIGJ1Zl9wdHIgKz0gKGRmW2pdIC0geFtqXSkqMjsKKyAgICB9CisKKyAgICAvLyBydW4gYmFjay1wcm9wYWdhdGlvbiBsb29wCisgICAgLyoKKyAgICAgICAgeV9pID0gd19pKnhfe2ktMX0KKyAgICAgICAgeF9pID0gZih5X2kpCisgICAgICAgIEUgPSAxLzIqfHx1IC0geF9OfHxeMgorICAgICAgICBncmFkX04gPSAoeF9OIC0gdSkqZicoeV9pKQorICAgICAgICBkd19pKHQpID0gbW9tZW50dW0qZHdfaSh0LTEpICsgZHdfc2NhbGUqeF97aS0xfSpncmFkX2kKKyAgICAgICAgd19pKHQrMSkgPSB3X2kodCkgKyBkd19pKHQpCisgICAgICAgIGdyYWRfe2ktMX0gPSB3X2ledCpncmFkX2kKKyAgICAqLworICAgIGZvciggaXRlciA9IDA7IGl0ZXIgPCBtYXhfaXRlcjsgaXRlcisrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBpdGVyICUgY291bnQ7CisgICAgICAgIGRvdWJsZSogdyA9IHdlaWdodHNbMF07CisgICAgICAgIGRvdWJsZSBzd2VpZ2h0ID0gc3cgPyBjb3VudCpzd1tpZHhdIDogMS47CisgICAgICAgIEN2TWF0IF93LCBfZHcsIGhkcjEsIGhkcjIsIGdoZHIxLCBnaGRyMiwgX2RmOworICAgICAgICBDdk1hdCAqeDEgPSAmaGRyMSwgKngyID0gJmhkcjIsICpncmFkMSA9ICZnaGRyMSwgKmdyYWQyID0gJmdoZHIyLCAqdGVtcDsKKworICAgICAgICBpZiggaWR4ID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggZmFicyhwcmV2X0UgLSBFKSA8IGVwc2lsb24gKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcHJldl9FID0gRTsKKyAgICAgICAgICAgIEUgPSAwOworCisgICAgICAgICAgICAvLyBzaHVmZmxlIGluZGljZXMKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdHQ7CisgICAgICAgICAgICAgICAgaiA9ICh1bnNpZ25lZCljdlJhbmRJbnQoJnJuZykgJSBjb3VudDsKKyAgICAgICAgICAgICAgICBrID0gKHVuc2lnbmVkKWN2UmFuZEludCgmcm5nKSAlIGNvdW50OworICAgICAgICAgICAgICAgIENWX1NXQVAoIF9pZHgtPmRhdGEuaVtqXSwgX2lkeC0+ZGF0YS5pW2tdLCB0dCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWR4ID0gX2lkeC0+ZGF0YS5pW2lkeF07CisKKyAgICAgICAgaWYoIHgwLnR5cGUgPT0gQ1ZfMzJGICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZmxvYXQqIHgwZGF0YSA9IHgwLmRhdGEuZmxbaWR4XTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBpdmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIHhbMF1bal0gPSB4MGRhdGFbal0qd1tqKjJdICsgd1tqKjIgKyAxXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogeDBkYXRhID0geDAuZGF0YS5kYltpZHhdOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGl2Y291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgeFswXVtqXSA9IHgwZGF0YVtqXSp3W2oqMl0gKyB3W2oqMiArIDFdOworICAgICAgICB9CisKKyAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCB4MSwgMSwgaXZjb3VudCwgQ1ZfNjRGLCB4WzBdICk7CisKKyAgICAgICAgLy8gZm9yd2FyZCBwYXNzLCBjb21wdXRlIHlbaV09dyp4W2ktMV0sIHhbaV09Zih5W2ldKSwgZGZbaV09ZicoeVtpXSkKKyAgICAgICAgZm9yKCBpID0gMTsgaSA8IGxfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggeDIsIDEsIGxheWVyX3NpemVzLT5kYXRhLmlbaV0sIENWXzY0RiwgeFtpXSApOworICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmX3csIHgxLT5jb2xzLCB4Mi0+Y29scywgQ1ZfNjRGLCB3ZWlnaHRzW2ldICk7CisgICAgICAgICAgICBjdkdFTU0oIHgxLCAmX3csIDEsIDAsIDAsIHgyICk7CisgICAgICAgICAgICBfZGYgPSAqeDI7CisgICAgICAgICAgICBfZGYuZGF0YS5kYiA9IGRmW2ldOworICAgICAgICAgICAgY2FsY19hY3Rpdl9mdW5jX2Rlcml2KCB4MiwgJl9kZiwgX3cuZGF0YS5kYiArIF93LnJvd3MqX3cuY29scyApOworICAgICAgICAgICAgQ1ZfU1dBUCggeDEsIHgyLCB0ZW1wICk7CisgICAgICAgIH0KKworICAgICAgICBjdkluaXRNYXRIZWFkZXIoIGdyYWQxLCAxLCBvdmNvdW50LCBDVl82NEYsIGJ1Zl9wdHIgKTsKKyAgICAgICAgKmdyYWQyID0gKmdyYWQxOworICAgICAgICBncmFkMi0+ZGF0YS5kYiA9IGJ1Zl9wdHIgKyBtYXhfY291bnQ7CisKKyAgICAgICAgdyA9IHdlaWdodHNbbF9jb3VudCsxXTsKKworICAgICAgICAvLyBjYWxjdWxhdGUgZXJyb3IKKyAgICAgICAgaWYoIHUudHlwZSA9PSBDVl8zMkYgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogdWRhdGEgPSB1LmRhdGEuZmxbaWR4XTsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBvdmNvdW50OyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0ID0gdWRhdGFba10qd1trKjJdICsgd1trKjIrMV0gLSB4W2xfY291bnQtMV1ba107CisgICAgICAgICAgICAgICAgZ3JhZDEtPmRhdGEuZGJba10gPSB0KnN3ZWlnaHQ7CisgICAgICAgICAgICAgICAgRSArPSB0KnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBkb3VibGUqIHVkYXRhID0gdS5kYXRhLmRiW2lkeF07CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgb3Zjb3VudDsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdCA9IHVkYXRhW2tdKndbayoyXSArIHdbayoyKzFdIC0geFtsX2NvdW50LTFdW2tdOworICAgICAgICAgICAgICAgIGdyYWQxLT5kYXRhLmRiW2tdID0gdCpzd2VpZ2h0OworICAgICAgICAgICAgICAgIEUgKz0gdCp0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEUgKj0gc3dlaWdodDsKKworICAgICAgICAvLyBiYWNrd2FyZCBwYXNzLCB1cGRhdGUgd2VpZ2h0cworICAgICAgICBmb3IoIGkgPSBsX2NvdW50LTE7IGkgPiAwOyBpLS0gKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbjEgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2ktMV0sIG4yID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtpXTsKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl9kZiwgMSwgbjIsIENWXzY0RiwgZGZbaV0gKTsKKyAgICAgICAgICAgIGN2TXVsKCBncmFkMSwgJl9kZiwgZ3JhZDEgKTsKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl93LCBuMSsxLCBuMiwgQ1ZfNjRGLCB3ZWlnaHRzW2ldICk7CisgICAgICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZfZHcsIG4xKzEsIG4yLCBDVl82NEYsIGR3LT5kYXRhLmRiICsgKHdlaWdodHNbaV0gLSB3ZWlnaHRzWzBdKSApOworICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCB4MSwgbjErMSwgMSwgQ1ZfNjRGLCB4W2ktMV0gKTsKKyAgICAgICAgICAgIHhbaS0xXVtuMV0gPSAxLjsKKyAgICAgICAgICAgIGN2R0VNTSggeDEsIGdyYWQxLCBwYXJhbXMuYnBfZHdfc2NhbGUsICZfZHcsIHBhcmFtcy5icF9tb21lbnRfc2NhbGUsICZfZHcgKTsKKyAgICAgICAgICAgIGN2QWRkKCAmX3csICZfZHcsICZfdyApOworICAgICAgICAgICAgaWYoIGkgPiAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBncmFkMi0+Y29scyA9IG4xOworICAgICAgICAgICAgICAgIF93LnJvd3MgPSBuMTsKKyAgICAgICAgICAgICAgICBjdkdFTU0oIGdyYWQxLCAmX3csIDEsIDAsIDAsIGdyYWQyLCBDVl9HRU1NX0JfVCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ1ZfU1dBUCggZ3JhZDEsIGdyYWQyLCB0ZW1wICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpdGVyIC89IGNvdW50OworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmR3ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmYnVmICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmX2lkeCApOworICAgIGN2RnJlZSggJnggKTsKKworICAgIHJldHVybiBpdGVyOworfQorCisKK2ludCBDdkFOTl9NTFA6OnRyYWluX3Jwcm9wKCBDdlZlY3RvcnMgeDAsIEN2VmVjdG9ycyB1LCBjb25zdCBkb3VibGUqIHN3ICkKK3sKKyAgICBjb25zdCBpbnQgbWF4X2J1Zl9zeiA9IDEgPDwgMTY7CisgICAgQ3ZNYXQqIGR3ID0gMDsKKyAgICBDdk1hdCogZEVkdyA9IDA7CisgICAgQ3ZNYXQqIHByZXZfZEVkd19zaWduID0gMDsKKyAgICBDdk1hdCogYnVmID0gMDsKKyAgICBkb3VibGUgKip4ID0gMCwgKipkZiA9IDA7CisgICAgaW50IGl0ZXIgPSAtMSwgY291bnQgPSB4MC5jb3VudDsKKyAgIAorICAgIENWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjp0cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBpdmNvdW50LCBvdmNvdW50LCBsX2NvdW50LCB0b3RhbCA9IDAsIG1heF9pdGVyLCBidWZfc3osIGRjb3VudDAsIGRjb3VudD0wOworICAgIGRvdWJsZSAqYnVmX3B0cjsKKyAgICBkb3VibGUgcHJldl9FID0gREJMX01BWCowLjUsIGVwc2lsb247CisgICAgZG91YmxlIGR3X3BsdXMsIGR3X21pbnVzLCBkd19taW4sIGR3X21heDsKKyAgICBkb3VibGUgaW52X2NvdW50OworCisgICAgbWF4X2l0ZXIgPSBwYXJhbXMudGVybV9jcml0Lm1heF9pdGVyOworICAgIGVwc2lsb24gPSBwYXJhbXMudGVybV9jcml0LmVwc2lsb247CisgICAgZHdfcGx1cyA9IHBhcmFtcy5ycF9kd19wbHVzOworICAgIGR3X21pbnVzID0gcGFyYW1zLnJwX2R3X21pbnVzOworICAgIGR3X21pbiA9IHBhcmFtcy5ycF9kd19taW47CisgICAgZHdfbWF4ID0gcGFyYW1zLnJwX2R3X21heDsKKworICAgIGxfY291bnQgPSBsYXllcl9zaXplcy0+Y29sczsKKyAgICBpdmNvdW50ID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVswXTsKKyAgICBvdmNvdW50ID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtsX2NvdW50LTFdOworCisgICAgLy8gYWxsb2NhdGUgYnVmZmVycworICAgIGZvciggaSA9IDA7IGkgPCBsX2NvdW50OyBpKysgKQorICAgICAgICB0b3RhbCArPSBsYXllcl9zaXplcy0+ZGF0YS5pW2ldOworCisgICAgQ1ZfQ0FMTCggZHcgPSBjdkNyZWF0ZU1hdCggd2J1Zi0+cm93cywgd2J1Zi0+Y29scywgd2J1Zi0+dHlwZSApKTsKKyAgICBjdlNldCggZHcsIGN2U2NhbGFyQWxsKHBhcmFtcy5ycF9kdzApICk7CisgICAgQ1ZfQ0FMTCggZEVkdyA9IGN2Q3JlYXRlTWF0KCB3YnVmLT5yb3dzLCB3YnVmLT5jb2xzLCB3YnVmLT50eXBlICkpOworICAgIGN2WmVybyggZEVkdyApOworICAgIENWX0NBTEwoIHByZXZfZEVkd19zaWduID0gY3ZDcmVhdGVNYXQoIHdidWYtPnJvd3MsIHdidWYtPmNvbHMsIENWXzhTQzEgKSk7CisgICAgY3ZaZXJvKCBwcmV2X2RFZHdfc2lnbiApOworCisgICAgaW52X2NvdW50ID0gMS4vY291bnQ7CisgICAgZGNvdW50MCA9IG1heF9idWZfc3ovKDIqdG90YWwpOworICAgIGRjb3VudDAgPSBNQVgoIGRjb3VudDAsIDEgKTsKKyAgICBkY291bnQwID0gTUlOKCBkY291bnQwLCBjb3VudCApOworICAgIGJ1Zl9zeiA9IGRjb3VudDAqKHRvdGFsICsgbWF4X2NvdW50KSoyOworCisgICAgQ1ZfQ0FMTCggYnVmID0gY3ZDcmVhdGVNYXQoIDEsIGJ1Zl9zeiwgQ1ZfNjRGICkpOworCisgICAgQ1ZfQ0FMTCggeCA9IChkb3VibGUqKiljdkFsbG9jKCB0b3RhbCoyKnNpemVvZih4WzBdKSApKTsKKyAgICBkZiA9IHggKyB0b3RhbDsKKyAgICBidWZfcHRyID0gYnVmLT5kYXRhLmRiOworCisgICAgZm9yKCBpID0gMDsgaSA8IGxfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICB4W2ldID0gYnVmX3B0cjsKKyAgICAgICAgZGZbaV0gPSB4W2ldICsgbGF5ZXJfc2l6ZXMtPmRhdGEuaVtpXSpkY291bnQwOworICAgICAgICBidWZfcHRyICs9IChkZltpXSAtIHhbaV0pKjI7CisgICAgfQorCisgICAgLy8gcnVuIHJwcm9wIGxvb3AKKyAgICAvKgorICAgICAgICB5X2kodCkgPSB3X2kodCkqeF97aS0xfSh0KQorICAgICAgICB4X2kodCkgPSBmKHlfaSh0KSkKKyAgICAgICAgRSA9IHN1bV9vdmVyX2FsbF9zYW1wbGVzKDEvMip8fHUgLSB4X058fF4yKQorICAgICAgICBncmFkX04gPSAoeF9OIC0gdSkqZicoeV9pKQorCisgICAgICAgICAgICAgICAgICAgICAgTUlOKGR3X2l7amt9KHQpKmR3X3BsdXMsIGR3X21heCksIGlmIGRFL2R3X2l7amt9KHQpKmRFL2R3X2l7amt9KHQtMSkgPiAwCisgICAgICAgIGR3X2l7amt9KHQpID0gTUFYKGR3X2l7amt9KHQpKmR3X21pbnVzLCBkd19taW4pLCBpZiBkRS9kd19pe2prfSh0KSpkRS9kd19pe2prfSh0LTEpIDwgMAorICAgICAgICAgICAgICAgICAgICAgIGR3X2l7amt9KHQtMSkgZWxzZQorCisgICAgICAgIGlmIChkRS9kd19pe2prfSh0KSpkRS9kd19pe2prfSh0LTEpIDwgMCkKKyAgICAgICAgICAgZEUvZHdfaXtqa30odCk8LTAKKyAgICAgICAgZWxzZQorICAgICAgICAgICB3X2l7amt9KHQrMSkgPSB3X2l7amt9KHQpICsgZHdfaXtqa30odCkKKyAgICAgICAgZ3JhZF97aS0xfSh0KSA9IHdfaV50KHQpKmdyYWRfaSh0KQorICAgICovCisgICAgZm9yKCBpdGVyID0gMDsgaXRlciA8IG1heF9pdGVyOyBpdGVyKysgKQorICAgIHsKKyAgICAgICAgaW50IG4xLCBuMiwgc2ksIGosIGs7CisgICAgICAgIGRvdWJsZSogdzsKKyAgICAgICAgQ3ZNYXQgX3csIF9kRWR3LCBoZHIxLCBoZHIyLCBnaGRyMSwgZ2hkcjIsIF9kZjsKKyAgICAgICAgQ3ZNYXQgKngxLCAqeDIsICpncmFkMSwgKmdyYWQyLCAqdGVtcDsKKyAgICAgICAgZG91YmxlIEUgPSAwOworCisgICAgICAgIC8vIGZpcnN0LCBpdGVyYXRlIHRocm91Z2ggYWxsIHRoZSBzYW1wbGVzIGFuZCBjb21wdXRlIGRFZHcKKyAgICAgICAgZm9yKCBzaSA9IDA7IHNpIDwgY291bnQ7IHNpICs9IGRjb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRjb3VudCA9IE1JTiggY291bnQgLSBzaSwgZGNvdW50MCApOworICAgICAgICAgICAgdyA9IHdlaWdodHNbMF07CisgICAgICAgICAgICBncmFkMSA9ICZnaGRyMTsgZ3JhZDIgPSAmZ2hkcjI7CisgICAgICAgICAgICB4MSA9ICZoZHIxOyB4MiA9ICZoZHIyOworCisgICAgICAgICAgICAvLyBncmFiIGFuZCBwcmVwcm9jZXNzIGlucHV0IGRhdGEKKyAgICAgICAgICAgIGlmKCB4MC50eXBlID09IENWXzMyRiApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRjb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB4MGRhdGEgPSB4MC5kYXRhLmZsW3NpK2ldOworICAgICAgICAgICAgICAgICAgICBkb3VibGUqIHhkYXRhID0geFswXStpKml2Y291bnQ7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBpdmNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgeGRhdGFbal0gPSB4MGRhdGFbal0qd1tqKjJdICsgd1tqKjIrMV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHgwZGF0YSA9IHgwLmRhdGEuZGJbc2kraV07CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogeGRhdGEgPSB4WzBdK2kqaXZjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGl2Y291bnQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgICAgICB4ZGF0YVtqXSA9IHgwZGF0YVtqXSp3W2oqMl0gKyB3W2oqMisxXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggeDEsIGRjb3VudCwgaXZjb3VudCwgQ1ZfNjRGLCB4WzBdICk7CisKKyAgICAgICAgICAgIC8vIGZvcndhcmQgcGFzcywgY29tcHV0ZSB5W2ldPXcqeFtpLTFdLCB4W2ldPWYoeVtpXSksIGRmW2ldPWYnKHlbaV0pCisgICAgICAgICAgICBmb3IoIGkgPSAxOyBpIDwgbF9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjdkluaXRNYXRIZWFkZXIoIHgyLCBkY291bnQsIGxheWVyX3NpemVzLT5kYXRhLmlbaV0sIENWXzY0RiwgeFtpXSApOworICAgICAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggJl93LCB4MS0+Y29scywgeDItPmNvbHMsIENWXzY0Riwgd2VpZ2h0c1tpXSApOworICAgICAgICAgICAgICAgIGN2R0VNTSggeDEsICZfdywgMSwgMCwgMCwgeDIgKTsKKyAgICAgICAgICAgICAgICBfZGYgPSAqeDI7CisgICAgICAgICAgICAgICAgX2RmLmRhdGEuZGIgPSBkZltpXTsKKyAgICAgICAgICAgICAgICBjYWxjX2FjdGl2X2Z1bmNfZGVyaXYoIHgyLCAmX2RmLCBfdy5kYXRhLmRiICsgX3cucm93cypfdy5jb2xzICk7CisgICAgICAgICAgICAgICAgQ1ZfU1dBUCggeDEsIHgyLCB0ZW1wICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN2SW5pdE1hdEhlYWRlciggZ3JhZDEsIGRjb3VudCwgb3Zjb3VudCwgQ1ZfNjRGLCBidWZfcHRyICk7CisgICAgICAgICAgICB3ID0gd2VpZ2h0c1tsX2NvdW50KzFdOworICAgICAgICAgICAgZ3JhZDItPmRhdGEuZGIgPSBidWZfcHRyICsgbWF4X2NvdW50KmRjb3VudDsKKworICAgICAgICAgICAgLy8gY2FsY3VsYXRlIGVycm9yCisgICAgICAgICAgICBpZiggdS50eXBlID09IENWXzMyRiApCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRjb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiB1ZGF0YSA9IHUuZGF0YS5mbFtzaStpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB4ZGF0YSA9IHhbbF9jb3VudC0xXSArIGkqb3Zjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBnZGF0YSA9IGdyYWQxLT5kYXRhLmRiICsgaSpvdmNvdW50OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3dlaWdodCA9IHN3ID8gc3dbc2kraV0gOiBpbnZfY291bnQsIEUxID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgb3Zjb3VudDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB1ZGF0YVtqXSp3W2oqMl0gKyB3W2oqMisxXSAtIHhkYXRhW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgZ2RhdGFbal0gPSB0KnN3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBFMSArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRSArPSBzd2VpZ2h0KkUxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgZGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB1ZGF0YSA9IHUuZGF0YS5kYltzaStpXTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiB4ZGF0YSA9IHhbbF9jb3VudC0xXSArIGkqb3Zjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlKiBnZGF0YSA9IGdyYWQxLT5kYXRhLmRiICsgaSpvdmNvdW50OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgc3dlaWdodCA9IHN3ID8gc3dbc2kraV0gOiBpbnZfY291bnQsIEUxID0gMDsKKworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgb3Zjb3VudDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB1ZGF0YVtqXSp3W2oqMl0gKyB3W2oqMisxXSAtIHhkYXRhW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgZ2RhdGFbal0gPSB0KnN3ZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBFMSArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRSArPSBzd2VpZ2h0KkUxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmFja3dhcmQgcGFzcywgdXBkYXRlIGRFZHcgICAgICAgICAgICAKKyAgICAgICAgICAgIGZvciggaSA9IGxfY291bnQtMTsgaSA+IDA7IGktLSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbjEgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2ktMV07IG4yID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtpXTsKKyAgICAgICAgICAgICAgICBjdkluaXRNYXRIZWFkZXIoICZfZGYsIGRjb3VudCwgbjIsIENWXzY0RiwgZGZbaV0gKTsKKyAgICAgICAgICAgICAgICBjdk11bCggZ3JhZDEsICZfZGYsIGdyYWQxICk7CisgICAgICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmX2RFZHcsIG4xLCBuMiwgQ1ZfNjRGLCBkRWR3LT5kYXRhLmRiKyh3ZWlnaHRzW2ldLXdlaWdodHNbMF0pICk7CisgICAgICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCB4MSwgZGNvdW50LCBuMSwgQ1ZfNjRGLCB4W2ktMV0gKTsKKyAgICAgICAgICAgICAgICBjdkdFTU0oIHgxLCBncmFkMSwgMSwgJl9kRWR3LCAxLCAmX2RFZHcsIENWX0dFTU1fQV9UICk7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGJpYXMgcGFydCBvZiBkRWR3CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRjb3VudDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogZHN0ID0gX2RFZHcuZGF0YS5kYiArIG4xKm4yOworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNyYyA9IGdyYWQxLT5kYXRhLmRiICsgaypuMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG4yOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2pdICs9IHNyY1tqXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCAmX3csIG4xLCBuMiwgQ1ZfNjRGLCB3ZWlnaHRzW2ldICk7CisgICAgICAgICAgICAgICAgY3ZJbml0TWF0SGVhZGVyKCBncmFkMiwgZGNvdW50LCBuMSwgQ1ZfNjRGLCBncmFkMi0+ZGF0YS5kYiApOworCisgICAgICAgICAgICAgICAgaWYoIGkgPiAxICkKKyAgICAgICAgICAgICAgICAgICAgY3ZHRU1NKCBncmFkMSwgJl93LCAxLCAwLCAwLCBncmFkMiwgQ1ZfR0VNTV9CX1QgKTsKKyAgICAgICAgICAgICAgICBDVl9TV0FQKCBncmFkMSwgZ3JhZDIsIHRlbXAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB1cGRhdGUgd2VpZ2h0cworICAgICAgICBmb3IoIGkgPSAxOyBpIDwgbF9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbjEgPSBsYXllcl9zaXplcy0+ZGF0YS5pW2ktMV07IG4yID0gbGF5ZXJfc2l6ZXMtPmRhdGEuaVtpXTsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPD0gbjE7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlKiB3ayA9IHdlaWdodHNbaV0raypuMjsKKyAgICAgICAgICAgICAgICBzaXplX3QgZGVsdGEgPSB3ayAtIHdlaWdodHNbMF07CisgICAgICAgICAgICAgICAgZG91YmxlKiBkd2sgPSBkdy0+ZGF0YS5kYiArIGRlbHRhOworICAgICAgICAgICAgICAgIGRvdWJsZSogZEVkd2sgPSBkRWR3LT5kYXRhLmRiICsgZGVsdGE7CisgICAgICAgICAgICAgICAgY2hhciogcHJldkVrID0gKGNoYXIqKShwcmV2X2RFZHdfc2lnbi0+ZGF0YS5wdHIgKyBkZWx0YSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbjI7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgRXZhbCA9IGRFZHdrW2pdOworICAgICAgICAgICAgICAgICAgICBkb3VibGUgZHZhbCA9IGR3a1tqXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHd2YWwgPSB3a1tqXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHMgPSBDVl9TSUdOKEV2YWwpOworICAgICAgICAgICAgICAgICAgICBpbnQgc3MgPSBwcmV2RWtbal0qczsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNzID4gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2YWwgKj0gZHdfcGx1czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2YWwgPSBNSU4oIGR2YWwsIGR3X21heCApOworICAgICAgICAgICAgICAgICAgICAgICAgZHdrW2pdID0gZHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdrW2pdID0gd3ZhbCArIGR2YWwqczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBzcyA8IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkdmFsICo9IGR3X21pbnVzOworICAgICAgICAgICAgICAgICAgICAgICAgZHZhbCA9IE1BWCggZHZhbCwgZHdfbWluICk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmV2RWtbal0gPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgZHdrW2pdID0gZHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdrW2pdID0gd3ZhbCArIGR2YWwqczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZFa1tqXSA9IChjaGFyKXM7CisgICAgICAgICAgICAgICAgICAgICAgICB3a1tqXSA9IHd2YWwgKyBkdmFsKnM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZEVkd2tbal0gPSAwLjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggZmFicyhwcmV2X0UgLSBFKSA8IGVwc2lsb24gKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIHByZXZfRSA9IEU7CisgICAgICAgIEUgPSAwOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZkdyApOworICAgIGN2UmVsZWFzZU1hdCggJmRFZHcgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZwcmV2X2RFZHdfc2lnbiApOworICAgIGN2UmVsZWFzZU1hdCggJmJ1ZiApOworICAgIGN2RnJlZSggJnggKTsKKworICAgIHJldHVybiBpdGVyOworfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjp3cml0ZV9wYXJhbXMoIEN2RmlsZVN0b3JhZ2UqIGZzICkKK3sKKyAgICAvL0NWX0ZVTkNOQU1FKCAiQ3ZBTk5fTUxQOjp3cml0ZV9wYXJhbXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBjaGFyKiBhY3Rpdl9mdW5jX25hbWUgPSBhY3Rpdl9mdW5jID09IElERU5USVRZID8gIklERU5USVRZIiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZfZnVuYyA9PSBTSUdNT0lEX1NZTSA/ICJTSUdNT0lEX1NZTSIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2X2Z1bmMgPT0gR0FVU1NJQU4gPyAiR0FVU1NJQU4iIDogMDsKKworICAgIGlmKCBhY3Rpdl9mdW5jX25hbWUgKQorICAgICAgICBjdldyaXRlU3RyaW5nKCBmcywgImFjdGl2YXRpb25fZnVuY3Rpb24iLCBhY3Rpdl9mdW5jX25hbWUgKTsKKyAgICBlbHNlCisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiYWN0aXZhdGlvbl9mdW5jdGlvbiIsIGFjdGl2X2Z1bmMgKTsKKworICAgIGlmKCBhY3Rpdl9mdW5jICE9IElERU5USVRZICkKKyAgICB7CisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImZfcGFyYW0xIiwgZl9wYXJhbTEgKTsKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZl9wYXJhbTIiLCBmX3BhcmFtMiApOworICAgIH0KKworICAgIGN2V3JpdGVSZWFsKCBmcywgIm1pbl92YWwiLCBtaW5fdmFsICk7CisgICAgY3ZXcml0ZVJlYWwoIGZzLCAibWF4X3ZhbCIsIG1heF92YWwgKTsKKyAgICBjdldyaXRlUmVhbCggZnMsICJtaW5fdmFsMSIsIG1pbl92YWwxICk7CisgICAgY3ZXcml0ZVJlYWwoIGZzLCAibWF4X3ZhbDEiLCBtYXhfdmFsMSApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInRyYWluaW5nX3BhcmFtcyIsIENWX05PREVfTUFQICk7CisgICAgaWYoIHBhcmFtcy50cmFpbl9tZXRob2QgPT0gQ3ZBTk5fTUxQX1RyYWluUGFyYW1zOjpCQUNLUFJPUCApCisgICAgeworICAgICAgICBjdldyaXRlU3RyaW5nKCBmcywgInRyYWluX21ldGhvZCIsICJCQUNLUFJPUCIgKTsKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZHdfc2NhbGUiLCBwYXJhbXMuYnBfZHdfc2NhbGUgKTsKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAibW9tZW50X3NjYWxlIiwgcGFyYW1zLmJwX21vbWVudF9zY2FsZSApOworICAgIH0KKyAgICBlbHNlIGlmKCBwYXJhbXMudHJhaW5fbWV0aG9kID09IEN2QU5OX01MUF9UcmFpblBhcmFtczo6UlBST1AgKQorICAgIHsKKyAgICAgICAgY3ZXcml0ZVN0cmluZyggZnMsICJ0cmFpbl9tZXRob2QiLCAiUlBST1AiICk7CisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImR3MCIsIHBhcmFtcy5ycF9kdzAgKTsKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZHdfcGx1cyIsIHBhcmFtcy5ycF9kd19wbHVzICk7CisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImR3X21pbnVzIiwgcGFyYW1zLnJwX2R3X21pbnVzICk7CisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImR3X21pbiIsIHBhcmFtcy5ycF9kd19taW4gKTsKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZHdfbWF4IiwgcGFyYW1zLnJwX2R3X21heCApOworICAgIH0KKworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJ0ZXJtX2NyaXRlcmlhIiwgQ1ZfTk9ERV9NQVAgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICBpZiggcGFyYW1zLnRlcm1fY3JpdC50eXBlICYgQ1ZfVEVSTUNSSVRfRVBTICkKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZXBzaWxvbiIsIHBhcmFtcy50ZXJtX2NyaXQuZXBzaWxvbiApOworICAgIGlmKCBwYXJhbXMudGVybV9jcml0LnR5cGUgJiBDVl9URVJNQ1JJVF9JVEVSICkKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJpdGVyYXRpb25zIiwgcGFyYW1zLnRlcm1fY3JpdC5tYXhfaXRlciApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2QU5OX01MUDo6d3JpdGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2QU5OX01MUDo6d3JpdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgbF9jb3VudCA9IGxheWVyX3NpemVzLT5jb2xzOworCisgICAgaWYoICFsYXllcl9zaXplcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBuZXR3b3JrIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIgKTsKKworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIG5hbWUsIENWX05PREVfTUFQLCBDVl9UWVBFX05BTUVfTUxfQU5OX01MUCApOworCisgICAgY3ZXcml0ZSggZnMsICJsYXllcl9zaXplcyIsIGxheWVyX3NpemVzICk7CisKKyAgICB3cml0ZV9wYXJhbXMoIGZzICk7CisgICAgCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImlucHV0X3NjYWxlIiwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICBjdldyaXRlUmF3RGF0YSggZnMsIHdlaWdodHNbMF0sIGxheWVyX3NpemVzLT5kYXRhLmlbMF0qMiwgImQiICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJvdXRwdXRfc2NhbGUiLCBDVl9OT0RFX1NFUSArIENWX05PREVfRkxPVyApOworICAgIGN2V3JpdGVSYXdEYXRhKCBmcywgd2VpZ2h0c1tsX2NvdW50XSwgbGF5ZXJfc2l6ZXMtPmRhdGEuaVtsX2NvdW50LTFdKjIsICJkIiApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAiaW52X291dHB1dF9zY2FsZSIsIENWX05PREVfU0VRICsgQ1ZfTk9ERV9GTE9XICk7CisgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCB3ZWlnaHRzW2xfY291bnQrMV0sIGxheWVyX3NpemVzLT5kYXRhLmlbbF9jb3VudC0xXSoyLCAiZCIgKTsKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgIndlaWdodHMiLCBDVl9OT0RFX1NFUSApOworICAgIGZvciggaSA9IDE7IGkgPCBsX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgMCwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCB3ZWlnaHRzW2ldLCAobGF5ZXJfc2l6ZXMtPmRhdGEuaVtpLTFdKzEpKmxheWVyX3NpemVzLT5kYXRhLmlbaV0sICJkIiApOworICAgICAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgIH0KKworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpyZWFkX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJDdkFOTl9NTFA6OnJlYWRfcGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY29uc3QgY2hhciogYWN0aXZfZnVuY19uYW1lID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgbm9kZSwgImFjdGl2YXRpb25fZnVuY3Rpb24iLCAwICk7CisgICAgQ3ZGaWxlTm9kZSogdHBhcmFtc19ub2RlOworCisgICAgaWYoIGFjdGl2X2Z1bmNfbmFtZSApCisgICAgICAgIGFjdGl2X2Z1bmMgPSBzdHJjbXAoIGFjdGl2X2Z1bmNfbmFtZSwgIlNJR01PSURfU1lNIiApID09IDAgPyBTSUdNT0lEX1NZTSA6CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoIGFjdGl2X2Z1bmNfbmFtZSwgIklERU5USVRZIiApID09IDAgPyBJREVOVElUWSA6CisgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoIGFjdGl2X2Z1bmNfbmFtZSwgIkdBVVNTSUFOIiApID09IDAgPyBHQVVTU0lBTiA6IDA7CisgICAgZWxzZQorICAgICAgICBhY3Rpdl9mdW5jID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgImFjdGl2YXRpb25fZnVuY3Rpb24iICk7CisKKyAgICBmX3BhcmFtMSA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBub2RlLCAiZl9wYXJhbTEiLCAwICk7CisgICAgZl9wYXJhbTIgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgbm9kZSwgImZfcGFyYW0yIiwgMCApOworICAgIAorICAgIHNldF9hY3Rpdl9mdW5jKCBhY3Rpdl9mdW5jLCBmX3BhcmFtMSwgZl9wYXJhbTIgKTsKKyAgICAKKyAgICBtaW5fdmFsID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIG5vZGUsICJtaW5fdmFsIiwgMC4gKTsKKyAgICBtYXhfdmFsID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIG5vZGUsICJtYXhfdmFsIiwgMS4gKTsKKyAgICBtaW5fdmFsMSA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBub2RlLCAibWluX3ZhbDEiLCAwLiApOworICAgIG1heF92YWwxID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIG5vZGUsICJtYXhfdmFsMSIsIDEuICk7CisKKyAgICB0cGFyYW1zX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInRyYWluaW5nX3BhcmFtcyIgKTsKKyAgICBwYXJhbXMgPSBDdkFOTl9NTFBfVHJhaW5QYXJhbXMoKTsKKworICAgIGlmKCB0cGFyYW1zX25vZGUgKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogdG1ldGhvZF9uYW1lID0gY3ZSZWFkU3RyaW5nQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAidHJhaW5fbWV0aG9kIiwgIiIgKTsKKyAgICAgICAgQ3ZGaWxlTm9kZSogdGNyaXRfbm9kZTsKKworICAgICAgICBpZiggc3RyY21wKCB0bWV0aG9kX25hbWUsICJCQUNLUFJPUCIgKSA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyYW1zLnRyYWluX21ldGhvZCA9IEN2QU5OX01MUF9UcmFpblBhcmFtczo6QkFDS1BST1A7CisgICAgICAgICAgICBwYXJhbXMuYnBfZHdfc2NhbGUgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAiZHdfc2NhbGUiLCAwICk7CisgICAgICAgICAgICBwYXJhbXMuYnBfbW9tZW50X3NjYWxlID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHRwYXJhbXNfbm9kZSwgIm1vbWVudF9zY2FsZSIsIDAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzdHJjbXAoIHRtZXRob2RfbmFtZSwgIlJQUk9QIiApID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJhbXMudHJhaW5fbWV0aG9kID0gQ3ZBTk5fTUxQX1RyYWluUGFyYW1zOjpSUFJPUDsKKyAgICAgICAgICAgIHBhcmFtcy5ycF9kdzAgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAiZHcwIiwgMCApOworICAgICAgICAgICAgcGFyYW1zLnJwX2R3X3BsdXMgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAiZHdfcGx1cyIsIDAgKTsKKyAgICAgICAgICAgIHBhcmFtcy5ycF9kd19taW51cyA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJkd19taW51cyIsIDAgKTsKKyAgICAgICAgICAgIHBhcmFtcy5ycF9kd19taW4gPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAiZHdfbWluIiwgMCApOworICAgICAgICAgICAgcGFyYW1zLnJwX2R3X21heCA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJkd19tYXgiLCAwICk7CisgICAgICAgIH0KKworICAgICAgICB0Y3JpdF9ub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHRwYXJhbXNfbm9kZSwgInRlcm1fY3JpdGVyaWEiICk7CisgICAgICAgIGlmKCB0Y3JpdF9ub2RlICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHRjcml0X25vZGUsICJlcHNpbG9uIiwgLTEgKTsKKyAgICAgICAgICAgIHBhcmFtcy50ZXJtX2NyaXQubWF4X2l0ZXIgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCB0Y3JpdF9ub2RlLCAiaXRlcmF0aW9ucyIsIC0xICk7CisgICAgICAgICAgICBwYXJhbXMudGVybV9jcml0LnR5cGUgPSAocGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uID49IDAgPyBDVl9URVJNQ1JJVF9FUFMgOiAwKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbXMudGVybV9jcml0Lm1heF9pdGVyID49IDAgPyBDVl9URVJNQ1JJVF9JVEVSIDogMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZBTk5fTUxQOjpyZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogbm9kZSApCit7CisgICAgQ3ZNYXQqIF9sYXllcl9zaXplcyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdkFOTl9NTFA6OnJlYWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkZpbGVOb2RlKiB3OworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgaSwgbF9jb3VudDsKKworICAgIF9sYXllcl9zaXplcyA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgbm9kZSwgImxheWVyX3NpemVzIiApOworICAgIENWX0NBTEwoIGNyZWF0ZSggX2xheWVyX3NpemVzLCBTSUdNT0lEX1NZTSwgMCwgMCApKTsKKyAgICBsX2NvdW50ID0gbGF5ZXJfc2l6ZXMtPmNvbHM7CisKKyAgICBDVl9DQUxMKCByZWFkX3BhcmFtcyggZnMsIG5vZGUgKSk7CisKKyAgICB3ID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGUsICJpbnB1dF9zY2FsZSIgKTsKKyAgICBpZiggIXcgfHwgQ1ZfTk9ERV9UWVBFKHctPnRhZykgIT0gQ1ZfTk9ERV9TRVEgfHwKKyAgICAgICAgdy0+ZGF0YS5zZXEtPnRvdGFsICE9IGxheWVyX3NpemVzLT5kYXRhLmlbMF0qMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiaW5wdXRfc2NhbGUgdGFnIGlzIG5vdCBmb3VuZCBvciBpcyBpbnZhbGlkIiApOworCisgICAgQ1ZfQ0FMTCggY3ZSZWFkUmF3RGF0YSggZnMsIHcsIHdlaWdodHNbMF0sICJkIiApKTsKKworICAgIHcgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgIm91dHB1dF9zY2FsZSIgKTsKKyAgICBpZiggIXcgfHwgQ1ZfTk9ERV9UWVBFKHctPnRhZykgIT0gQ1ZfTk9ERV9TRVEgfHwKKyAgICAgICAgdy0+ZGF0YS5zZXEtPnRvdGFsICE9IGxheWVyX3NpemVzLT5kYXRhLmlbbF9jb3VudC0xXSoyICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJvdXRwdXRfc2NhbGUgdGFnIGlzIG5vdCBmb3VuZCBvciBpcyBpbnZhbGlkIiApOworCisgICAgQ1ZfQ0FMTCggY3ZSZWFkUmF3RGF0YSggZnMsIHcsIHdlaWdodHNbbF9jb3VudF0sICJkIiApKTsKKworICAgIHcgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgImludl9vdXRwdXRfc2NhbGUiICk7CisgICAgaWYoICF3IHx8IENWX05PREVfVFlQRSh3LT50YWcpICE9IENWX05PREVfU0VRIHx8CisgICAgICAgIHctPmRhdGEuc2VxLT50b3RhbCAhPSBsYXllcl9zaXplcy0+ZGF0YS5pW2xfY291bnQtMV0qMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiaW52X291dHB1dF9zY2FsZSB0YWcgaXMgbm90IGZvdW5kIG9yIGlzIGludmFsaWQiICk7CisKKyAgICBDVl9DQUxMKCBjdlJlYWRSYXdEYXRhKCBmcywgdywgd2VpZ2h0c1tsX2NvdW50KzFdLCAiZCIgKSk7CisKKyAgICB3ID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGUsICJ3ZWlnaHRzIiApOworICAgIGlmKCAhdyB8fCBDVl9OT0RFX1RZUEUody0+dGFnKSAhPSBDVl9OT0RFX1NFUSB8fAorICAgICAgICB3LT5kYXRhLnNlcS0+dG90YWwgIT0gbF9jb3VudCAtIDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIndlaWdodHMgdGFnIGlzIG5vdCBmb3VuZCBvciBpcyBpbnZhbGlkIiApOworCisgICAgY3ZTdGFydFJlYWRTZXEoIHctPmRhdGEuc2VxLCAmcmVhZGVyICk7CisKKyAgICBmb3IoIGkgPSAxOyBpIDwgbF9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIHcgPSAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0cjsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZSZWFkUmF3RGF0YSggZnMsIHcsIHdlaWdodHNbaV0sICJkIiApKTsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggcmVhZGVyLnNlcS0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL21sL3NyYy9tbGJvb3N0LmNwcCBiL21sL3NyYy9tbGJvb3N0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc2MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWwvc3JjL21sYm9vc3QuY3BwCkBAIC0wLDAgKzEsMTY1NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKK3N0YXRpYyBpbmxpbmUgZG91YmxlCitsb2dfcmF0aW8oIGRvdWJsZSB2YWwgKQoreworICAgIGNvbnN0IGRvdWJsZSBlcHMgPSAxZS01OworICAgIAorICAgIHZhbCA9IE1BWCggdmFsLCBlcHMgKTsKKyAgICB2YWwgPSBNSU4oIHZhbCwgMS4gLSBlcHMgKTsKKyAgICByZXR1cm4gbG9nKCB2YWwvKDEuIC0gdmFsKSApOworfQorCisKK0N2Qm9vc3RQYXJhbXM6OkN2Qm9vc3RQYXJhbXMoKQoreworICAgIGJvb3N0X3R5cGUgPSBDdkJvb3N0OjpSRUFMOworICAgIHdlYWtfY291bnQgPSAxMDA7CisgICAgd2VpZ2h0X3RyaW1fcmF0ZSA9IDAuOTU7CisgICAgY3ZfZm9sZHMgPSAwOworICAgIG1heF9kZXB0aCA9IDE7Cit9CisKKworQ3ZCb29zdFBhcmFtczo6Q3ZCb29zdFBhcmFtcyggaW50IF9ib29zdF90eXBlLCBpbnQgX3dlYWtfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIF93ZWlnaHRfdHJpbV9yYXRlLCBpbnQgX21heF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIF91c2Vfc3Vycm9nYXRlcywgY29uc3QgZmxvYXQqIF9wcmlvcnMgKQoreworICAgIGJvb3N0X3R5cGUgPSBfYm9vc3RfdHlwZTsKKyAgICB3ZWFrX2NvdW50ID0gX3dlYWtfY291bnQ7CisgICAgd2VpZ2h0X3RyaW1fcmF0ZSA9IF93ZWlnaHRfdHJpbV9yYXRlOworICAgIHNwbGl0X2NyaXRlcmlhID0gQ3ZCb29zdDo6REVGQVVMVDsKKyAgICBjdl9mb2xkcyA9IDA7CisgICAgbWF4X2RlcHRoID0gX21heF9kZXB0aDsKKyAgICB1c2Vfc3Vycm9nYXRlcyA9IF91c2Vfc3Vycm9nYXRlczsKKyAgICBwcmlvcnMgPSBfcHJpb3JzOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEN2Qm9vc3RUcmVlIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0N2Qm9vc3RUcmVlOjpDdkJvb3N0VHJlZSgpCit7CisgICAgZW5zZW1ibGUgPSAwOworfQorCisKK0N2Qm9vc3RUcmVlOjp+Q3ZCb29zdFRyZWUoKQoreworICAgIGNsZWFyKCk7Cit9CisKKwordm9pZAorQ3ZCb29zdFRyZWU6OmNsZWFyKCkKK3sKKyAgICBDdkRUcmVlOjpjbGVhcigpOworICAgIGVuc2VtYmxlID0gMDsKK30KKworCitib29sCitDdkJvb3N0VHJlZTo6dHJhaW4oIEN2RFRyZWVUcmFpbkRhdGEqIF90cmFpbl9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3N1YnNhbXBsZV9pZHgsIEN2Qm9vc3QqIF9lbnNlbWJsZSApCit7CisgICAgY2xlYXIoKTsKKyAgICBlbnNlbWJsZSA9IF9lbnNlbWJsZTsKKyAgICBkYXRhID0gX3RyYWluX2RhdGE7CisgICAgZGF0YS0+c2hhcmVkID0gdHJ1ZTsKKyAgICAKKyAgICByZXR1cm4gZG9fdHJhaW4oIF9zdWJzYW1wbGVfaWR4ICk7Cit9CisKKworYm9vbAorQ3ZCb29zdFRyZWU6OnRyYWluKCBjb25zdCBDdk1hdCosIGludCwgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCosCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiwgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCosIEN2RFRyZWVQYXJhbXMgKQoreworICAgIGFzc2VydCgwKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKworYm9vbAorQ3ZCb29zdFRyZWU6OnRyYWluKCBDdkRUcmVlVHJhaW5EYXRhKiwgY29uc3QgQ3ZNYXQqICkKK3sKKyAgICBhc3NlcnQoMCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK3ZvaWQKK0N2Qm9vc3RUcmVlOjpzY2FsZSggZG91YmxlIHNjYWxlICkKK3sKKyAgICBDdkRUcmVlTm9kZSogbm9kZSA9IHJvb3Q7CisKKyAgICAvLyB0cmF2ZXJzZSB0aGUgdHJlZSBhbmQgc2NhbGUgYWxsIHRoZSBub2RlIHZhbHVlcworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIEN2RFRyZWVOb2RlKiBwYXJlbnQ7CisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgbm9kZS0+dmFsdWUgKj0gc2NhbGU7CisgICAgICAgICAgICBpZiggIW5vZGUtPmxlZnQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmxlZnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciggcGFyZW50ID0gbm9kZS0+cGFyZW50OyBwYXJlbnQgJiYgcGFyZW50LT5yaWdodCA9PSBub2RlOworICAgICAgICAgICAgbm9kZSA9IHBhcmVudCwgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQgKQorICAgICAgICAgICAgOworCisgICAgICAgIGlmKCAhcGFyZW50ICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG5vZGUgPSBwYXJlbnQtPnJpZ2h0OworICAgIH0KK30KKworCit2b2lkCitDdkJvb3N0VHJlZTo6dHJ5X3NwbGl0X25vZGUoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBDdkRUcmVlOjp0cnlfc3BsaXRfbm9kZSggbm9kZSApOworCisgICAgaWYoICFub2RlLT5sZWZ0ICkKKyAgICB7CisgICAgICAgIC8vIGlmIHRoZSBub2RlIGhhcyBub3QgYmVlbiBzcGxpdCwKKyAgICAgICAgLy8gc3RvcmUgdGhlIHJlc3BvbnNlcyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgdHJhaW5pbmcgc2FtcGxlcworICAgICAgICBkb3VibGUqIHdlYWtfZXZhbCA9IGVuc2VtYmxlLT5nZXRfd2Vha19yZXNwb25zZSgpLT5kYXRhLmRiOworICAgICAgICBpbnQqIGxhYmVscyA9IGRhdGEtPmdldF9sYWJlbHMoIG5vZGUgKTsKKyAgICAgICAgaW50IGksIGNvdW50ID0gbm9kZS0+c2FtcGxlX2NvdW50OworICAgICAgICBkb3VibGUgdmFsdWUgPSBub2RlLT52YWx1ZTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB3ZWFrX2V2YWxbbGFiZWxzW2ldXSA9IHZhbHVlOworICAgIH0KK30KKworCitkb3VibGUKK0N2Qm9vc3RUcmVlOjpjYWxjX25vZGVfZGlyKCBDdkRUcmVlTm9kZSogbm9kZSApCit7CisgICAgY2hhciogZGlyID0gKGNoYXIqKWRhdGEtPmRpcmVjdGlvbi0+ZGF0YS5wdHI7CisgICAgY29uc3QgZG91YmxlKiB3ZWlnaHRzID0gZW5zZW1ibGUtPmdldF9zdWJ0cmVlX3dlaWdodHMoKS0+ZGF0YS5kYjsKKyAgICBpbnQgaSwgbiA9IG5vZGUtPnNhbXBsZV9jb3VudCwgdmkgPSBub2RlLT5zcGxpdC0+dmFyX2lkeDsKKyAgICBkb3VibGUgTCwgUjsKKworICAgIGFzc2VydCggIW5vZGUtPnNwbGl0LT5pbnZlcnNlZCApOworCisgICAgaWYoIGRhdGEtPmdldF92YXJfdHlwZSh2aSkgPj0gMCApIC8vIHNwbGl0IG9uIGNhdGVnb3JpY2FsIHZhcgorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBjYXRfbGFiZWxzID0gZGF0YS0+Z2V0X2NhdF92YXJfZGF0YSggbm9kZSwgdmkgKTsKKyAgICAgICAgY29uc3QgaW50KiBzdWJzZXQgPSBub2RlLT5zcGxpdC0+c3Vic2V0OworICAgICAgICBkb3VibGUgc3VtID0gMCwgc3VtX2FicyA9IDA7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSBjYXRfbGFiZWxzW2ldOworICAgICAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzW2ldOworICAgICAgICAgICAgaW50IGQgPSBpZHggPj0gMCA/IENWX0RUUkVFX0NBVF9ESVIoaWR4LHN1YnNldCkgOiAwOworICAgICAgICAgICAgc3VtICs9IGQqdzsgc3VtX2FicyArPSAoZCAmIDEpKnc7CisgICAgICAgICAgICBkaXJbaV0gPSAoY2hhcilkOworICAgICAgICB9CisKKyAgICAgICAgUiA9IChzdW1fYWJzICsgc3VtKSAqIDAuNTsKKyAgICAgICAgTCA9IChzdW1fYWJzIC0gc3VtKSAqIDAuNTsKKyAgICB9CisgICAgZWxzZSAvLyBzcGxpdCBvbiBvcmRlcmVkIHZhcgorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZQYWlyMzJzMzJmKiBzb3J0ZWQgPSBkYXRhLT5nZXRfb3JkX3Zhcl9kYXRhKG5vZGUsdmkpOworICAgICAgICBpbnQgc3BsaXRfcG9pbnQgPSBub2RlLT5zcGxpdC0+b3JkLnNwbGl0X3BvaW50OworICAgICAgICBpbnQgbjEgPSBub2RlLT5nZXRfbnVtX3ZhbGlkKHZpKTsKKworICAgICAgICBhc3NlcnQoIDAgPD0gc3BsaXRfcG9pbnQgJiYgc3BsaXRfcG9pbnQgPCBuMS0xICk7CisgICAgICAgIEwgPSBSID0gMDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IHNwbGl0X3BvaW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgICAgICBkb3VibGUgdyA9IHdlaWdodHNbaWR4XTsKKyAgICAgICAgICAgIGRpcltpZHhdID0gKGNoYXIpLTE7CisgICAgICAgICAgICBMICs9IHc7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgaSA8IG4xOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgICAgICBkb3VibGUgdyA9IHdlaWdodHNbaWR4XTsKKyAgICAgICAgICAgIGRpcltpZHhdID0gKGNoYXIpMTsKKyAgICAgICAgICAgIFIgKz0gdzsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIGRpcltzb3J0ZWRbaV0uaV0gPSAoY2hhcikwOworICAgIH0KKworICAgIG5vZGUtPm1heGxyID0gTUFYKCBMLCBSICk7CisgICAgcmV0dXJuIG5vZGUtPnNwbGl0LT5xdWFsaXR5LyhMICsgUik7Cit9CisKKworQ3ZEVHJlZVNwbGl0KgorQ3ZCb29zdFRyZWU6OmZpbmRfc3BsaXRfb3JkX2NsYXNzKCBDdkRUcmVlTm9kZSogbm9kZSwgaW50IHZpICkKK3sKKyAgICBjb25zdCBmbG9hdCBlcHNpbG9uID0gRkxUX0VQU0lMT04qMjsKKyAgICBjb25zdCBDdlBhaXIzMnMzMmYqIHNvcnRlZCA9IGRhdGEtPmdldF9vcmRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgIGNvbnN0IGludCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X2NsYXNzX2xhYmVscyhub2RlKTsKKyAgICBjb25zdCBkb3VibGUqIHdlaWdodHMgPSBlbnNlbWJsZS0+Z2V0X3N1YnRyZWVfd2VpZ2h0cygpLT5kYXRhLmRiOworICAgIGludCBuID0gbm9kZS0+c2FtcGxlX2NvdW50OworICAgIGludCBuMSA9IG5vZGUtPmdldF9udW1fdmFsaWQodmkpOworICAgIGNvbnN0IGRvdWJsZSogcmN3MCA9IHdlaWdodHMgKyBuOworICAgIGRvdWJsZSBsY3dbMl0gPSB7MCwwfSwgcmN3WzJdOworICAgIGludCBpLCBiZXN0X2kgPSAtMTsKKyAgICBkb3VibGUgYmVzdF92YWwgPSAwOworICAgIGludCBib29zdF90eXBlID0gZW5zZW1ibGUtPmdldF9wYXJhbXMoKS5ib29zdF90eXBlOworICAgIGludCBzcGxpdF9jcml0ZXJpYSA9IGVuc2VtYmxlLT5nZXRfcGFyYW1zKCkuc3BsaXRfY3JpdGVyaWE7CisKKyAgICByY3dbMF0gPSByY3cwWzBdOyByY3dbMV0gPSByY3cwWzFdOworICAgIGZvciggaSA9IG4xOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBzb3J0ZWRbaV0uaTsKKyAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzW2lkeF07CisgICAgICAgIHJjd1tyZXNwb25zZXNbaWR4XV0gLT0gdzsKKyAgICB9CisKKyAgICBpZiggc3BsaXRfY3JpdGVyaWEgIT0gQ3ZCb29zdDo6R0lOSSAmJiBzcGxpdF9jcml0ZXJpYSAhPSBDdkJvb3N0OjpNSVNDTEFTUyApCisgICAgICAgIHNwbGl0X2NyaXRlcmlhID0gYm9vc3RfdHlwZSA9PSBDdkJvb3N0OjpESVNDUkVURSA/IEN2Qm9vc3Q6Ok1JU0NMQVNTIDogQ3ZCb29zdDo6R0lOSTsKKworICAgIGlmKCBzcGxpdF9jcml0ZXJpYSA9PSBDdkJvb3N0OjpHSU5JICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBMID0gMCwgUiA9IHJjd1swXSArIHJjd1sxXTsKKyAgICAgICAgZG91YmxlIGxzdW0yID0gMCwgcnN1bTIgPSByY3dbMF0qcmN3WzBdICsgcmN3WzFdKnJjd1sxXTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjEgLSAxOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgICAgICBkb3VibGUgdyA9IHdlaWdodHNbaWR4XSwgdzIgPSB3Knc7CisgICAgICAgICAgICBkb3VibGUgbHYsIHJ2OworICAgICAgICAgICAgaWR4ID0gcmVzcG9uc2VzW2lkeF07CisgICAgICAgICAgICBMICs9IHc7IFIgLT0gdzsKKyAgICAgICAgICAgIGx2ID0gbGN3W2lkeF07IHJ2ID0gcmN3W2lkeF07CisgICAgICAgICAgICBsc3VtMiArPSAyKmx2KncgKyB3MjsKKyAgICAgICAgICAgIHJzdW0yIC09IDIqcnYqdyAtIHcyOworICAgICAgICAgICAgbGN3W2lkeF0gPSBsdiArIHc7IHJjd1tpZHhdID0gcnYgLSB3OworCisgICAgICAgICAgICBpZiggc29ydGVkW2ldLnZhbCArIGVwc2lsb24gPCBzb3J0ZWRbaSsxXS52YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSAobHN1bTIqUiArIHJzdW0yKkwpLyhMKlIpOworICAgICAgICAgICAgICAgIGlmKCBiZXN0X3ZhbCA8IHZhbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9pID0gaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IHNvcnRlZFtpXS5pOworICAgICAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzW2lkeF07CisgICAgICAgICAgICBpZHggPSByZXNwb25zZXNbaWR4XTsKKyAgICAgICAgICAgIGxjd1tpZHhdICs9IHc7CisgICAgICAgICAgICByY3dbaWR4XSAtPSB3OworCisgICAgICAgICAgICBpZiggc29ydGVkW2ldLnZhbCArIGVwc2lsb24gPCBzb3J0ZWRbaSsxXS52YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBsY3dbMF0gKyByY3dbMV0sIHZhbDIgPSBsY3dbMV0gKyByY3dbMF07CisgICAgICAgICAgICAgICAgdmFsID0gTUFYKHZhbCwgdmFsMik7CisgICAgICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICBiZXN0X2kgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0X2kgPj0gMCA/IGRhdGEtPm5ld19zcGxpdF9vcmQoIHZpLAorICAgICAgICAoc29ydGVkW2Jlc3RfaV0udmFsICsgc29ydGVkW2Jlc3RfaSsxXS52YWwpKjAuNWYsIGJlc3RfaSwKKyAgICAgICAgMCwgKGZsb2F0KWJlc3RfdmFsICkgOiAwOworfQorCisKKyNkZWZpbmUgQ1ZfQ01QX05VTV9QVFIoYSxiKSAoKihhKSA8ICooYikpCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0RGJsUHRyLCBkb3VibGUqLCBDVl9DTVBfTlVNX1BUUiwgaW50ICkKKworQ3ZEVHJlZVNwbGl0KgorQ3ZCb29zdFRyZWU6OmZpbmRfc3BsaXRfY2F0X2NsYXNzKCBDdkRUcmVlTm9kZSogbm9kZSwgaW50IHZpICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIHNwbGl0OworICAgIGNvbnN0IGludCogY2F0X2xhYmVscyA9IGRhdGEtPmdldF9jYXRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgIGNvbnN0IGludCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X2NsYXNzX2xhYmVscyhub2RlKTsKKyAgICBpbnQgY2kgPSBkYXRhLT5nZXRfdmFyX3R5cGUodmkpOworICAgIGludCBuID0gbm9kZS0+c2FtcGxlX2NvdW50OworICAgIGludCBtaSA9IGRhdGEtPmNhdF9jb3VudC0+ZGF0YS5pW2NpXTsKKyAgICBkb3VibGUgbGN3WzJdPXswLDB9LCByY3dbMl09ezAsMH07CisgICAgZG91YmxlKiBjamsgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoMioobWkrMSkqc2l6ZW9mKGNqa1swXSkpKzI7CisgICAgY29uc3QgZG91YmxlKiB3ZWlnaHRzID0gZW5zZW1ibGUtPmdldF9zdWJ0cmVlX3dlaWdodHMoKS0+ZGF0YS5kYjsKKyAgICBkb3VibGUqKiBkYmxfcHRyID0gKGRvdWJsZSoqKWN2U3RhY2tBbGxvYyggbWkqc2l6ZW9mKGRibF9wdHJbMF0pICk7CisgICAgaW50IGksIGosIGssIGlkeDsKKyAgICBkb3VibGUgTCA9IDAsIFI7CisgICAgZG91YmxlIGJlc3RfdmFsID0gMDsKKyAgICBpbnQgYmVzdF9zdWJzZXQgPSAtMSwgc3Vic2V0X2k7CisgICAgaW50IGJvb3N0X3R5cGUgPSBlbnNlbWJsZS0+Z2V0X3BhcmFtcygpLmJvb3N0X3R5cGU7CisgICAgaW50IHNwbGl0X2NyaXRlcmlhID0gZW5zZW1ibGUtPmdldF9wYXJhbXMoKS5zcGxpdF9jcml0ZXJpYTsKKworICAgIC8vIGluaXQgYXJyYXkgb2YgY291bnRlcnM6CisgICAgLy8gY197amt9IC0gbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBoYXZlIHZpLXRoIGlucHV0IHZhcmlhYmxlID0gaiBhbmQgcmVzcG9uc2UgPSBrLgorICAgIGZvciggaiA9IC0xOyBqIDwgbWk7IGorKyApCisgICAgICAgIGNqa1tqKjJdID0gY2prW2oqMisxXSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0c1tpXTsKKyAgICAgICAgaiA9IGNhdF9sYWJlbHNbaV07CisgICAgICAgIGsgPSByZXNwb25zZXNbaV07CisgICAgICAgIGNqa1tqKjIgKyBrXSArPSB3OworICAgIH0KKworICAgIGZvciggaiA9IDA7IGogPCBtaTsgaisrICkKKyAgICB7CisgICAgICAgIHJjd1swXSArPSBjamtbaioyXTsKKyAgICAgICAgcmN3WzFdICs9IGNqa1tqKjIrMV07CisgICAgICAgIGRibF9wdHJbal0gPSBjamsgKyBqKjIgKyAxOworICAgIH0KKworICAgIFIgPSByY3dbMF0gKyByY3dbMV07CisKKyAgICBpZiggc3BsaXRfY3JpdGVyaWEgIT0gQ3ZCb29zdDo6R0lOSSAmJiBzcGxpdF9jcml0ZXJpYSAhPSBDdkJvb3N0OjpNSVNDTEFTUyApCisgICAgICAgIHNwbGl0X2NyaXRlcmlhID0gYm9vc3RfdHlwZSA9PSBDdkJvb3N0OjpESVNDUkVURSA/IEN2Qm9vc3Q6Ok1JU0NMQVNTIDogQ3ZCb29zdDo6R0lOSTsKKworICAgIC8vIHNvcnQgcm93cyBvZiBjX2prIGJ5IGluY3JlYXNpbmcgY19qLDEKKyAgICAvLyAoaS5lLiBieSB0aGUgd2VpZ2h0IG9mIHNhbXBsZXMgaW4gai10aCBjYXRlZ29yeSB0aGF0IGJlbG9uZyB0byBjbGFzcyAxKQorICAgIGljdlNvcnREYmxQdHIoIGRibF9wdHIsIG1pLCAwICk7CisKKyAgICBmb3IoIHN1YnNldF9pID0gMDsgc3Vic2V0X2kgPCBtaS0xOyBzdWJzZXRfaSsrICkKKyAgICB7CisgICAgICAgIGlkeCA9IChpbnQpKGRibF9wdHJbc3Vic2V0X2ldIC0gY2prKS8yOworICAgICAgICBjb25zdCBkb3VibGUqIGNyb3cgPSBjamsgKyBpZHgqMjsKKyAgICAgICAgZG91YmxlIHcwID0gY3Jvd1swXSwgdzEgPSBjcm93WzFdOworICAgICAgICBkb3VibGUgd2VpZ2h0ID0gdzAgKyB3MTsKKworICAgICAgICBpZiggd2VpZ2h0IDwgRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgbGN3WzBdICs9IHcwOyByY3dbMF0gLT0gdzA7CisgICAgICAgIGxjd1sxXSArPSB3MTsgcmN3WzFdIC09IHcxOworCisgICAgICAgIGlmKCBzcGxpdF9jcml0ZXJpYSA9PSBDdkJvb3N0OjpHSU5JICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGxzdW0yID0gbGN3WzBdKmxjd1swXSArIGxjd1sxXSpsY3dbMV07CisgICAgICAgICAgICBkb3VibGUgcnN1bTIgPSByY3dbMF0qcmN3WzBdICsgcmN3WzFdKnJjd1sxXTsKKyAgICAgICAgCisgICAgICAgICAgICBMICs9IHdlaWdodDsKKyAgICAgICAgICAgIFIgLT0gd2VpZ2h0OworCisgICAgICAgICAgICBpZiggTCA+IEZMVF9FUFNJTE9OICYmIFIgPiBGTFRfRVBTSUxPTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IChsc3VtMipSICsgcnN1bTIqTCkvKEwqUik7CisgICAgICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICBiZXN0X3N1YnNldCA9IHN1YnNldF9pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBsY3dbMF0gKyByY3dbMV07CisgICAgICAgICAgICBkb3VibGUgdmFsMiA9IGxjd1sxXSArIHJjd1swXTsKKworICAgICAgICAgICAgdmFsID0gTUFYKHZhbCwgdmFsMik7CisgICAgICAgICAgICBpZiggYmVzdF92YWwgPCB2YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgIGJlc3Rfc3Vic2V0ID0gc3Vic2V0X2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggYmVzdF9zdWJzZXQgPCAwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGxpdCA9IGRhdGEtPm5ld19zcGxpdF9jYXQoIHZpLCAoZmxvYXQpYmVzdF92YWwgKTsKKworICAgIGZvciggaSA9IDA7IGkgPD0gYmVzdF9zdWJzZXQ7IGkrKyApCisgICAgeworICAgICAgICBpZHggPSAoaW50KShkYmxfcHRyW2ldIC0gY2prKSA+PiAxOworICAgICAgICBzcGxpdC0+c3Vic2V0W2lkeCA+PiA1XSB8PSAxIDw8IChpZHggJiAzMSk7CisgICAgfQorCisgICAgcmV0dXJuIHNwbGl0OworfQorCisKK0N2RFRyZWVTcGxpdCoKK0N2Qm9vc3RUcmVlOjpmaW5kX3NwbGl0X29yZF9yZWcoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGZsb2F0IGVwc2lsb24gPSBGTFRfRVBTSUxPTioyOworICAgIGNvbnN0IEN2UGFpcjMyczMyZiogc29ydGVkID0gZGF0YS0+Z2V0X29yZF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgZmxvYXQqIHJlc3BvbnNlcyA9IGRhdGEtPmdldF9vcmRfcmVzcG9uc2VzKG5vZGUpOworICAgIGNvbnN0IGRvdWJsZSogd2VpZ2h0cyA9IGVuc2VtYmxlLT5nZXRfc3VidHJlZV93ZWlnaHRzKCktPmRhdGEuZGI7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgaW50IG4xID0gbm9kZS0+Z2V0X251bV92YWxpZCh2aSk7CisgICAgaW50IGksIGJlc3RfaSA9IC0xOworICAgIGRvdWJsZSBiZXN0X3ZhbCA9IDAsIGxzdW0gPSAwLCByc3VtID0gbm9kZS0+dmFsdWUqbjsKKyAgICBkb3VibGUgTCA9IDAsIFIgPSB3ZWlnaHRzW25dOworCisgICAgLy8gY29tcGVuc2F0ZSBmb3IgbWlzc2luZyB2YWx1ZXMKKyAgICBmb3IoIGkgPSBuMTsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0c1tpZHhdOworICAgICAgICByc3VtIC09IHJlc3BvbnNlc1tpZHhdKnc7CisgICAgICAgIFIgLT0gdzsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBvcHRpbWFsIHNwbGl0CisgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBzb3J0ZWRbaV0uaTsKKyAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzW2lkeF07CisgICAgICAgIGRvdWJsZSB0ID0gcmVzcG9uc2VzW2lkeF0qdzsKKyAgICAgICAgTCArPSB3OyBSIC09IHc7CisgICAgICAgIGxzdW0gKz0gdDsgcnN1bSAtPSB0OworCisgICAgICAgIGlmKCBzb3J0ZWRbaV0udmFsICsgZXBzaWxvbiA8IHNvcnRlZFtpKzFdLnZhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSB2YWwgPSAobHN1bSpsc3VtKlIgKyByc3VtKnJzdW0qTCkvKEwqUik7CisgICAgICAgICAgICBpZiggYmVzdF92YWwgPCB2YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgIGJlc3RfaSA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9pID49IDAgPyBkYXRhLT5uZXdfc3BsaXRfb3JkKCB2aSwKKyAgICAgICAgKHNvcnRlZFtiZXN0X2ldLnZhbCArIHNvcnRlZFtiZXN0X2krMV0udmFsKSowLjVmLCBiZXN0X2ksCisgICAgICAgIDAsIChmbG9hdCliZXN0X3ZhbCApIDogMDsKK30KKworCitDdkRUcmVlU3BsaXQqCitDdkJvb3N0VHJlZTo6ZmluZF9zcGxpdF9jYXRfcmVnKCBDdkRUcmVlTm9kZSogbm9kZSwgaW50IHZpICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIHNwbGl0OworICAgIGNvbnN0IGludCogY2F0X2xhYmVscyA9IGRhdGEtPmdldF9jYXRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgIGNvbnN0IGZsb2F0KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfb3JkX3Jlc3BvbnNlcyhub2RlKTsKKyAgICBjb25zdCBkb3VibGUqIHdlaWdodHMgPSBlbnNlbWJsZS0+Z2V0X3N1YnRyZWVfd2VpZ2h0cygpLT5kYXRhLmRiOworICAgIGludCBjaSA9IGRhdGEtPmdldF92YXJfdHlwZSh2aSk7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgaW50IG1pID0gZGF0YS0+Y2F0X2NvdW50LT5kYXRhLmlbY2ldOworICAgIGRvdWJsZSogc3VtID0gKGRvdWJsZSopY3ZTdGFja0FsbG9jKCAobWkrMSkqc2l6ZW9mKHN1bVswXSkgKSArIDE7CisgICAgZG91YmxlKiBjb3VudHMgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIChtaSsxKSpzaXplb2YoY291bnRzWzBdKSApICsgMTsKKyAgICBkb3VibGUqKiBzdW1fcHRyID0gKGRvdWJsZSoqKWN2U3RhY2tBbGxvYyggbWkqc2l6ZW9mKHN1bV9wdHJbMF0pICk7CisgICAgZG91YmxlIEwgPSAwLCBSID0gMCwgYmVzdF92YWwgPSAwLCBsc3VtID0gMCwgcnN1bSA9IDA7CisgICAgaW50IGksIGJlc3Rfc3Vic2V0ID0gLTEsIHN1YnNldF9pOworCisgICAgZm9yKCBpID0gLTE7IGkgPCBtaTsgaSsrICkKKyAgICAgICAgc3VtW2ldID0gY291bnRzW2ldID0gMDsKKworICAgIC8vIGNhbGN1bGF0ZSBzdW0gcmVzcG9uc2UgYW5kIHdlaWdodCBvZiBlYWNoIGNhdGVnb3J5IG9mIHRoZSBpbnB1dCB2YXIKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBjYXRfbGFiZWxzW2ldOworICAgICAgICBkb3VibGUgdyA9IHdlaWdodHNbaV07CisgICAgICAgIGRvdWJsZSBzID0gc3VtW2lkeF0gKyByZXNwb25zZXNbaV0qdzsKKyAgICAgICAgZG91YmxlIG5jID0gY291bnRzW2lkeF0gKyB3OworICAgICAgICBzdW1baWR4XSA9IHM7CisgICAgICAgIGNvdW50c1tpZHhdID0gbmM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIGF2ZXJhZ2UgcmVzcG9uc2UgaW4gZWFjaCBjYXRlZ29yeQorICAgIGZvciggaSA9IDA7IGkgPCBtaTsgaSsrICkKKyAgICB7CisgICAgICAgIFIgKz0gY291bnRzW2ldOworICAgICAgICByc3VtICs9IHN1bVtpXTsKKyAgICAgICAgc3VtW2ldIC89IGNvdW50c1tpXTsKKyAgICAgICAgc3VtX3B0cltpXSA9IHN1bSArIGk7CisgICAgfQorCisgICAgaWN2U29ydERibFB0ciggc3VtX3B0ciwgbWksIDAgKTsKKworICAgIC8vIHJldmVydCBiYWNrIHRvIHVubm9ybWFsaXplZCBzdW1zCisgICAgLy8gKHRoZXJlIHNob3VsZCBiZSBhIHZlcnkgbGl0dGxlIGxvc3MgaW4gYWNjdXJhY3kpCisgICAgZm9yKCBpID0gMDsgaSA8IG1pOyBpKysgKQorICAgICAgICBzdW1baV0gKj0gY291bnRzW2ldOworCisgICAgZm9yKCBzdWJzZXRfaSA9IDA7IHN1YnNldF9pIDwgbWktMTsgc3Vic2V0X2krKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gKGludCkoc3VtX3B0cltzdWJzZXRfaV0gLSBzdW0pOworICAgICAgICBkb3VibGUgbmkgPSBjb3VudHNbaWR4XTsKKworICAgICAgICBpZiggbmkgPiBGTFRfRVBTSUxPTiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzID0gc3VtW2lkeF07CisgICAgICAgICAgICBsc3VtICs9IHM7IEwgKz0gbmk7CisgICAgICAgICAgICByc3VtIC09IHM7IFIgLT0gbmk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBMID4gRkxUX0VQU0lMT04gJiYgUiA+IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gKGxzdW0qbHN1bSpSICsgcnN1bSpyc3VtKkwpLyhMKlIpOworICAgICAgICAgICAgICAgIGlmKCBiZXN0X3ZhbCA8IHZhbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9zdWJzZXQgPSBzdWJzZXRfaTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggYmVzdF9zdWJzZXQgPCAwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBzcGxpdCA9IGRhdGEtPm5ld19zcGxpdF9jYXQoIHZpLCAoZmxvYXQpYmVzdF92YWwgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDw9IGJlc3Rfc3Vic2V0OyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IChpbnQpKHN1bV9wdHJbaV0gLSBzdW0pOworICAgICAgICBzcGxpdC0+c3Vic2V0W2lkeCA+PiA1XSB8PSAxIDw8IChpZHggJiAzMSk7CisgICAgfQorCisgICAgcmV0dXJuIHNwbGl0OworfQorCisKK0N2RFRyZWVTcGxpdCoKK0N2Qm9vc3RUcmVlOjpmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9vcmQoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGZsb2F0IGVwc2lsb24gPSBGTFRfRVBTSUxPTioyOworICAgIGNvbnN0IEN2UGFpcjMyczMyZiogc29ydGVkID0gZGF0YS0+Z2V0X29yZF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgZG91YmxlKiB3ZWlnaHRzID0gZW5zZW1ibGUtPmdldF9zdWJ0cmVlX3dlaWdodHMoKS0+ZGF0YS5kYjsKKyAgICBjb25zdCBjaGFyKiBkaXIgPSAoY2hhciopZGF0YS0+ZGlyZWN0aW9uLT5kYXRhLnB0cjsKKyAgICBpbnQgbjEgPSBub2RlLT5nZXRfbnVtX3ZhbGlkKHZpKTsKKyAgICAvLyBMTCAtIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgYm90aCB0aGUgcHJpbWFyeSBhbmQgdGhlIHN1cnJvZ2F0ZSBzcGxpdHMgc2VuZCB0byB0aGUgbGVmdAorICAgIC8vIExSIC0gLi4uIHByaW1hcnkgc3BsaXQgc2VuZHMgdG8gdGhlIGxlZnQgYW5kIHRoZSBzdXJyb2dhdGUgc3BsaXQgc2VuZHMgdG8gdGhlIHJpZ2h0CisgICAgLy8gUkwgLSAuLi4gcHJpbWFyeSBzcGxpdCBzZW5kcyB0byB0aGUgcmlnaHQgYW5kIHRoZSBzdXJyb2dhdGUgc3BsaXQgc2VuZHMgdG8gdGhlIGxlZnQKKyAgICAvLyBSUiAtIC4uLiBib3RoIHNlbmQgdG8gdGhlIHJpZ2h0CisgICAgaW50IGksIGJlc3RfaSA9IC0xLCBiZXN0X2ludmVyc2VkID0gMDsKKyAgICBkb3VibGUgYmVzdF92YWw7IAorICAgIGRvdWJsZSBMTCA9IDAsIFJMID0gMCwgTFIsIFJSOworICAgIGRvdWJsZSB3b3JzdF92YWwgPSBub2RlLT5tYXhscjsKKyAgICBkb3VibGUgc3VtID0gMCwgc3VtX2FicyA9IDA7CisgICAgYmVzdF92YWwgPSB3b3JzdF92YWw7CisgICAgCisgICAgZm9yKCBpID0gMDsgaSA8IG4xOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IHNvcnRlZFtpXS5pOworICAgICAgICBkb3VibGUgdyA9IHdlaWdodHNbaWR4XTsKKyAgICAgICAgaW50IGQgPSBkaXJbaWR4XTsKKyAgICAgICAgc3VtICs9IGQqdzsgc3VtX2FicyArPSAoZCAmIDEpKnc7CisgICAgfQorCisgICAgLy8gc3VtX2FicyA9IFIgKyBMOyBzdW0gPSBSIC0gTAorICAgIFJSID0gKHN1bV9hYnMgKyBzdW0pKjAuNTsKKyAgICBMUiA9IChzdW1fYWJzIC0gc3VtKSowLjU7CisKKyAgICAvLyBpbml0aWFsbHkgYWxsIHRoZSBzYW1wbGVzIGFyZSBzZW50IHRvIHRoZSByaWdodCBieSB0aGUgc3Vycm9nYXRlIHNwbGl0LAorICAgIC8vIExSIG9mIHRoZW0gYXJlIHNlbnQgdG8gdGhlIGxlZnQgYnkgcHJpbWFyeSBzcGxpdCwgYW5kIFJSIC0gdG8gdGhlIHJpZ2h0LgorICAgIC8vIG5vdyBpdGVyYXRpdmVseSBjb21wdXRlIExMLCBMUiwgUkwgYW5kIFJSIGZvciBldmVyeSBwb3NzaWJsZSBzdXJyb2dhdGUgc3BsaXQgdmFsdWUuCisgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpZHggPSBzb3J0ZWRbaV0uaTsKKyAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzW2lkeF07CisgICAgICAgIGludCBkID0gZGlyW2lkeF07CisKKyAgICAgICAgaWYoIGQgPCAwICkKKyAgICAgICAgeworICAgICAgICAgICAgTEwgKz0gdzsgTFIgLT0gdzsKKyAgICAgICAgICAgIGlmKCBMTCArIFJSID4gYmVzdF92YWwgJiYgc29ydGVkW2ldLnZhbCArIGVwc2lsb24gPCBzb3J0ZWRbaSsxXS52YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gTEwgKyBSUjsKKyAgICAgICAgICAgICAgICBiZXN0X2kgPSBpOyBiZXN0X2ludmVyc2VkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBkID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIFJMICs9IHc7IFJSIC09IHc7CisgICAgICAgICAgICBpZiggUkwgKyBMUiA+IGJlc3RfdmFsICYmIHNvcnRlZFtpXS52YWwgKyBlcHNpbG9uIDwgc29ydGVkW2krMV0udmFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IFJMICsgTFI7CisgICAgICAgICAgICAgICAgYmVzdF9pID0gaTsgYmVzdF9pbnZlcnNlZCA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmVzdF9pID49IDAgJiYgYmVzdF92YWwgPiBub2RlLT5tYXhsciA/IGRhdGEtPm5ld19zcGxpdF9vcmQoIHZpLAorICAgICAgICAoc29ydGVkW2Jlc3RfaV0udmFsICsgc29ydGVkW2Jlc3RfaSsxXS52YWwpKjAuNWYsIGJlc3RfaSwKKyAgICAgICAgYmVzdF9pbnZlcnNlZCwgKGZsb2F0KWJlc3RfdmFsICkgOiAwOworfQorCisKK0N2RFRyZWVTcGxpdCoKK0N2Qm9vc3RUcmVlOjpmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9jYXQoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGludCogY2F0X2xhYmVscyA9IGRhdGEtPmdldF9jYXRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgIGNvbnN0IGNoYXIqIGRpciA9IChjaGFyKilkYXRhLT5kaXJlY3Rpb24tPmRhdGEucHRyOworICAgIGNvbnN0IGRvdWJsZSogd2VpZ2h0cyA9IGVuc2VtYmxlLT5nZXRfc3VidHJlZV93ZWlnaHRzKCktPmRhdGEuZGI7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgLy8gTEwgLSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGJvdGggdGhlIHByaW1hcnkgYW5kIHRoZSBzdXJyb2dhdGUgc3BsaXRzIHNlbmQgdG8gdGhlIGxlZnQKKyAgICAvLyBMUiAtIC4uLiBwcmltYXJ5IHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSByaWdodAorICAgIC8vIFJMIC0gLi4uIHByaW1hcnkgc3BsaXQgc2VuZHMgdG8gdGhlIHJpZ2h0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0CisgICAgLy8gUlIgLSAuLi4gYm90aCBzZW5kIHRvIHRoZSByaWdodAorICAgIEN2RFRyZWVTcGxpdCogc3BsaXQgPSBkYXRhLT5uZXdfc3BsaXRfY2F0KCB2aSwgMCApOworICAgIGludCBpLCBtaSA9IGRhdGEtPmNhdF9jb3VudC0+ZGF0YS5pW2RhdGEtPmdldF92YXJfdHlwZSh2aSldOworICAgIGRvdWJsZSBiZXN0X3ZhbCA9IDA7CisgICAgZG91YmxlKiBsYyA9IChkb3VibGUqKWN2U3RhY2tBbGxvYyggKG1pKzEpKjIqc2l6ZW9mKGxjWzBdKSApICsgMTsKKyAgICBkb3VibGUqIHJjID0gbGMgKyBtaSArIDE7CisgICAgCisgICAgZm9yKCBpID0gLTE7IGkgPCBtaTsgaSsrICkKKyAgICAgICAgbGNbaV0gPSByY1tpXSA9IDA7CisKKyAgICAvLyAxLiBmb3IgZWFjaCBjYXRlZ29yeSBjYWxjdWxhdGUgdGhlIHdlaWdodCBvZiBzYW1wbGVzCisgICAgLy8gc2VudCB0byB0aGUgbGVmdCAobGMpIGFuZCB0byB0aGUgcmlnaHQgKHJjKSBieSB0aGUgcHJpbWFyeSBzcGxpdAorICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9IGNhdF9sYWJlbHNbaV07CisgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0c1tpXTsKKyAgICAgICAgaW50IGQgPSBkaXJbaV07CisgICAgICAgIGRvdWJsZSBzdW0gPSBsY1tpZHhdICsgZCp3OworICAgICAgICBkb3VibGUgc3VtX2FicyA9IHJjW2lkeF0gKyAoZCAmIDEpKnc7CisgICAgICAgIGxjW2lkeF0gPSBzdW07IHJjW2lkeF0gPSBzdW1fYWJzOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBtaTsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBzdW0gPSBsY1tpXTsKKyAgICAgICAgZG91YmxlIHN1bV9hYnMgPSByY1tpXTsKKyAgICAgICAgbGNbaV0gPSAoc3VtX2FicyAtIHN1bSkgKiAwLjU7CisgICAgICAgIHJjW2ldID0gKHN1bV9hYnMgKyBzdW0pICogMC41OworICAgIH0KKworICAgIC8vIDIuIG5vdyBmb3JtIHRoZSBzcGxpdC4KKyAgICAvLyBpbiBlYWNoIGNhdGVnb3J5IHNlbmQgYWxsIHRoZSBzYW1wbGVzIHRvIHRoZSBzYW1lIGRpcmVjdGlvbiBhcyBtYWpvcml0eQorICAgIGZvciggaSA9IDA7IGkgPCBtaTsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBsdmFsID0gbGNbaV0sIHJ2YWwgPSByY1tpXTsKKyAgICAgICAgaWYoIGx2YWwgPiBydmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgc3BsaXQtPnN1YnNldFtpID4+IDVdIHw9IDEgPDwgKGkgJiAzMSk7CisgICAgICAgICAgICBiZXN0X3ZhbCArPSBsdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJlc3RfdmFsICs9IHJ2YWw7CisgICAgfQorCisgICAgc3BsaXQtPnF1YWxpdHkgPSAoZmxvYXQpYmVzdF92YWw7CisgICAgaWYoIHNwbGl0LT5xdWFsaXR5IDw9IG5vZGUtPm1heGxyICkKKyAgICAgICAgY3ZTZXRSZW1vdmVCeVB0ciggZGF0YS0+c3BsaXRfaGVhcCwgc3BsaXQgKSwgc3BsaXQgPSAwOworCisgICAgcmV0dXJuIHNwbGl0OworfQorCisKK3ZvaWQKK0N2Qm9vc3RUcmVlOjpjYWxjX25vZGVfdmFsdWUoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBpbnQgaSwgY291bnQgPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgY29uc3QgZG91YmxlKiB3ZWlnaHRzID0gZW5zZW1ibGUtPmdldF93ZWlnaHRzKCktPmRhdGEuZGI7CisgICAgY29uc3QgaW50KiBsYWJlbHMgPSBkYXRhLT5nZXRfbGFiZWxzKG5vZGUpOworICAgIGRvdWJsZSogc3VidHJlZV93ZWlnaHRzID0gZW5zZW1ibGUtPmdldF9zdWJ0cmVlX3dlaWdodHMoKS0+ZGF0YS5kYjsKKyAgICBkb3VibGUgcmN3WzJdID0gezAsMH07CisgICAgaW50IGJvb3N0X3R5cGUgPSBlbnNlbWJsZS0+Z2V0X3BhcmFtcygpLmJvb3N0X3R5cGU7CisgICAgLy9jb25zdCBkb3VibGUqIHByaW9ycyA9IGRhdGEtPnByaW9ycy0+ZGF0YS5kYjsKKworICAgIGlmKCBkYXRhLT5pc19jbGFzc2lmaWVyICkKKyAgICB7CisgICAgICAgIGNvbnN0IGludCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X2NsYXNzX2xhYmVscyhub2RlKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0c1tpZHhdLypwcmlvcnNbcmVzcG9uc2VzW2ldXSovOworICAgICAgICAgICAgcmN3W3Jlc3BvbnNlc1tpXV0gKz0gdzsKKyAgICAgICAgICAgIHN1YnRyZWVfd2VpZ2h0c1tpXSA9IHc7CisgICAgICAgIH0KKworICAgICAgICBub2RlLT5jbGFzc19pZHggPSByY3dbMV0gPiByY3dbMF07CisKKyAgICAgICAgaWYoIGJvb3N0X3R5cGUgPT0gQ3ZCb29zdDo6RElTQ1JFVEUgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBpZ25vcmUgY2F0X21hcCBmb3IgcmVzcG9uc2VzLCBhbmQgdXNlIHstMSwxfSwKKyAgICAgICAgICAgIC8vIGFzIHRoZSB3aG9sZSBlbnNlbWJsZSByZXNwb25zZSBpcyBjb21wdXRlcyBhcyBzaWduKHN1bV9pKHdlYWtfcmVzcG9uc2VfaSkKKyAgICAgICAgICAgIG5vZGUtPnZhbHVlID0gbm9kZS0+Y2xhc3NfaWR4KjIgLSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHAgPSByY3dbMV0vKHJjd1swXSArIHJjd1sxXSk7CisgICAgICAgICAgICBhc3NlcnQoIGJvb3N0X3R5cGUgPT0gQ3ZCb29zdDo6UkVBTCApOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzdG9yZSBsb2ctcmF0aW8gb2YgdGhlIHByb2JhYmlsaXR5CisgICAgICAgICAgICBub2RlLT52YWx1ZSA9IDAuNSpsb2dfcmF0aW8ocCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gaW4gY2FzZSBvZiByZWdyZXNzaW9uIHRyZWU6CisgICAgICAgIC8vICAqIG5vZGUgdmFsdWUgaXMgMS9uKnN1bV9pKFlfaSksIHdoZXJlIFlfaSBpcyBpLXRoIHJlc3BvbnNlLAorICAgICAgICAvLyAgICBuIGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgbm9kZS4KKyAgICAgICAgLy8gICogbm9kZSByaXNrIGlzIHRoZSBzdW0gb2Ygc3F1YXJlZCBlcnJvcnM6IHN1bV9pKChZX2kgLSA8bm9kZV92YWx1ZT4pXjIpCisgICAgICAgIGRvdWJsZSBzdW0gPSAwLCBzdW0yID0gMCwgaXc7CisgICAgICAgIGNvbnN0IGZsb2F0KiB2YWx1ZXMgPSBkYXRhLT5nZXRfb3JkX3Jlc3BvbnNlcyhub2RlKTsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0c1tpZHhdLypwcmlvcnNbdmFsdWVzW2ldID4gMF0qLzsKKyAgICAgICAgICAgIGRvdWJsZSB0ID0gdmFsdWVzW2ldOworICAgICAgICAgICAgcmN3WzBdICs9IHc7CisgICAgICAgICAgICBzdWJ0cmVlX3dlaWdodHNbaV0gPSB3OworICAgICAgICAgICAgc3VtICs9IHQqdzsKKyAgICAgICAgICAgIHN1bTIgKz0gdCp0Knc7CisgICAgICAgIH0KKworICAgICAgICBpdyA9IDEuL3Jjd1swXTsKKyAgICAgICAgbm9kZS0+dmFsdWUgPSBzdW0qaXc7CisgICAgICAgIG5vZGUtPm5vZGVfcmlzayA9IHN1bTIgLSAoc3VtKml3KSpzdW07CisgICAgICAgIAorICAgICAgICAvLyByZW5vcm1hbGl6ZSB0aGUgcmlzaywgYXMgaW4gdHJ5X3NwbGl0X25vZGUgdGhlIHVud2VpZ2h0ZWQgZm9ybXVsYQorICAgICAgICAvLyBzcXJ0KHJpc2spL24gaXMgdXNlZCwgcmF0aGVyIHRoYW4gc3FydChyaXNrKS9zdW0od2VpZ2h0c19pKQorICAgICAgICBub2RlLT5ub2RlX3Jpc2sgKj0gY291bnQqaXcqY291bnQqaXc7CisgICAgfQorCisgICAgLy8gc3RvcmUgc3VtbWFyeSB3ZWlnaHRzCisgICAgc3VidHJlZV93ZWlnaHRzW2NvdW50XSA9IHJjd1swXTsKKyAgICBzdWJ0cmVlX3dlaWdodHNbY291bnQrMV0gPSByY3dbMV07Cit9CisKKwordm9pZCBDdkJvb3N0VHJlZTo6cmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIGZub2RlLCBDdkJvb3N0KiBfZW5zZW1ibGUsIEN2RFRyZWVUcmFpbkRhdGEqIF9kYXRhICkKK3sKKyAgICBDdkRUcmVlOjpyZWFkKCBmcywgZm5vZGUsIF9kYXRhICk7CisgICAgZW5zZW1ibGUgPSBfZW5zZW1ibGU7Cit9CisKKwordm9pZCBDdkJvb3N0VHJlZTo6cmVhZCggQ3ZGaWxlU3RvcmFnZSosIEN2RmlsZU5vZGUqICkKK3sKKyAgICBhc3NlcnQoMCk7Cit9CisKK3ZvaWQgQ3ZCb29zdFRyZWU6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIF9mcywgQ3ZGaWxlTm9kZSogX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDdkRUcmVlVHJhaW5EYXRhKiBfZGF0YSApCit7CisgICAgQ3ZEVHJlZTo6cmVhZCggX2ZzLCBfbm9kZSwgX2RhdGEgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDdkJvb3N0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ3ZCb29zdDo6Q3ZCb29zdCgpCit7CisgICAgZGF0YSA9IDA7CisgICAgd2VhayA9IDA7CisgICAgZGVmYXVsdF9tb2RlbF9uYW1lID0gIm15X2Jvb3N0X3RyZWUiOworICAgIG9yaWdfcmVzcG9uc2UgPSBzdW1fcmVzcG9uc2UgPSB3ZWFrX2V2YWwgPSBzdWJzYW1wbGVfbWFzayA9CisgICAgICAgIHdlaWdodHMgPSBzdWJ0cmVlX3dlaWdodHMgPSAwOworCisgICAgY2xlYXIoKTsKK30KKworCit2b2lkIEN2Qm9vc3Q6OnBydW5lKCBDdlNsaWNlIHNsaWNlICkKK3sKKyAgICBpZiggd2VhayApCisgICAgeworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgICAgIGludCBpLCBjb3VudCA9IGN2U2xpY2VMZW5ndGgoIHNsaWNlLCB3ZWFrICk7CisgICAgICAgIAorICAgICAgICBjdlN0YXJ0UmVhZFNlcSggd2VhaywgJnJlYWRlciApOworICAgICAgICBjdlNldFNlcVJlYWRlclBvcyggJnJlYWRlciwgc2xpY2Uuc3RhcnRfaW5kZXggKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2Qm9vc3RUcmVlKiB3OworICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggdywgcmVhZGVyICk7CisgICAgICAgICAgICBkZWxldGUgdzsKKyAgICAgICAgfQorCisgICAgICAgIGN2U2VxUmVtb3ZlU2xpY2UoIHdlYWssIHNsaWNlICk7CisgICAgfQorfQorCisKK3ZvaWQgQ3ZCb29zdDo6Y2xlYXIoKQoreworICAgIGlmKCB3ZWFrICkKKyAgICB7CisgICAgICAgIHBydW5lKCBDVl9XSE9MRV9TRVEgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJndlYWstPnN0b3JhZ2UgKTsKKyAgICB9CisgICAgaWYoIGRhdGEgKQorICAgICAgICBkZWxldGUgZGF0YTsKKyAgICB3ZWFrID0gMDsKKyAgICBkYXRhID0gMDsKKyAgICBjdlJlbGVhc2VNYXQoICZvcmlnX3Jlc3BvbnNlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc3VtX3Jlc3BvbnNlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmd2Vha19ldmFsICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc3Vic2FtcGxlX21hc2sgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ3ZWlnaHRzICk7CisgICAgaGF2ZV9zdWJzYW1wbGUgPSBmYWxzZTsKK30KKworCitDdkJvb3N0Ojp+Q3ZCb29zdCgpCit7CisgICAgY2xlYXIoKTsKK30KKworCitDdkJvb3N0OjpDdkJvb3N0KCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGludCBfdGZsYWcsCisgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4LAorICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LCBjb25zdCBDdk1hdCogX3Zhcl90eXBlLAorICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9taXNzaW5nX21hc2ssIEN2Qm9vc3RQYXJhbXMgX3BhcmFtcyApCit7CisgICAgd2VhayA9IDA7CisgICAgZGF0YSA9IDA7CisgICAgZGVmYXVsdF9tb2RlbF9uYW1lID0gIm15X2Jvb3N0X3RyZWUiOworICAgIG9yaWdfcmVzcG9uc2UgPSBzdW1fcmVzcG9uc2UgPSB3ZWFrX2V2YWwgPSBzdWJzYW1wbGVfbWFzayA9IHdlaWdodHMgPSAwOworCisgICAgdHJhaW4oIF90cmFpbl9kYXRhLCBfdGZsYWcsIF9yZXNwb25zZXMsIF92YXJfaWR4LCBfc2FtcGxlX2lkeCwKKyAgICAgICAgICAgX3Zhcl90eXBlLCBfbWlzc2luZ19tYXNrLCBfcGFyYW1zICk7Cit9CisKKworYm9vbAorQ3ZCb29zdDo6c2V0X3BhcmFtcyggY29uc3QgQ3ZCb29zdFBhcmFtcyYgX3BhcmFtcyApCit7CisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb29zdDo6c2V0X3BhcmFtcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIHBhcmFtcyA9IF9wYXJhbXM7CisgICAgaWYoIHBhcmFtcy5ib29zdF90eXBlICE9IERJU0NSRVRFICYmIHBhcmFtcy5ib29zdF90eXBlICE9IFJFQUwgJiYKKyAgICAgICAgcGFyYW1zLmJvb3N0X3R5cGUgIT0gTE9HSVQgJiYgcGFyYW1zLmJvb3N0X3R5cGUgIT0gR0VOVExFICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24vdW5zdXBwb3J0ZWQgYm9vc3RpbmcgdHlwZSIgKTsKKworICAgIHBhcmFtcy53ZWFrX2NvdW50ID0gTUFYKCBwYXJhbXMud2Vha19jb3VudCwgMSApOworICAgIHBhcmFtcy53ZWlnaHRfdHJpbV9yYXRlID0gTUFYKCBwYXJhbXMud2VpZ2h0X3RyaW1fcmF0ZSwgMC4gKTsKKyAgICBwYXJhbXMud2VpZ2h0X3RyaW1fcmF0ZSA9IE1JTiggcGFyYW1zLndlaWdodF90cmltX3JhdGUsIDEuICk7CisgICAgaWYoIHBhcmFtcy53ZWlnaHRfdHJpbV9yYXRlIDwgRkxUX0VQU0lMT04gKQorICAgICAgICBwYXJhbXMud2VpZ2h0X3RyaW1fcmF0ZSA9IDEuZjsKKworICAgIGlmKCBwYXJhbXMuYm9vc3RfdHlwZSA9PSBESVNDUkVURSAmJgorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgIT0gR0lOSSAmJiBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgIT0gTUlTQ0xBU1MgKQorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgPSBNSVNDTEFTUzsKKyAgICBpZiggcGFyYW1zLmJvb3N0X3R5cGUgPT0gUkVBTCAmJgorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgIT0gR0lOSSAmJiBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgIT0gTUlTQ0xBU1MgKQorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgPSBHSU5JOworICAgIGlmKCAocGFyYW1zLmJvb3N0X3R5cGUgPT0gTE9HSVQgfHwgcGFyYW1zLmJvb3N0X3R5cGUgPT0gR0VOVExFKSAmJgorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgIT0gU1FFUlIgKQorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgPSBTUUVSUjsKKyAgICAKKyAgICBvayA9IHRydWU7CisgICAgCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBvazsKK30KKworCitib29sCitDdkJvb3N0Ojp0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4LAorICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHgsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGUsCisgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrLAorICAgICAgICAgICAgICBDdkJvb3N0UGFyYW1zIF9wYXJhbXMsIGJvb2wgX3VwZGF0ZSApCit7CisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2Qm9vc3Q6OnRyYWluIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGk7CisKKyAgICBzZXRfcGFyYW1zKCBfcGFyYW1zICk7CisKKyAgICBpZiggIV91cGRhdGUgfHwgIWRhdGEgKQorICAgIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgZGF0YSA9IG5ldyBDdkRUcmVlVHJhaW5EYXRhKCBfdHJhaW5fZGF0YSwgX3RmbGFnLCBfcmVzcG9uc2VzLCBfdmFyX2lkeCwKKyAgICAgICAgICAgIF9zYW1wbGVfaWR4LCBfdmFyX3R5cGUsIF9taXNzaW5nX21hc2ssIF9wYXJhbXMsIHRydWUsIHRydWUgKTsKKworICAgICAgICBpZiggZGF0YS0+Z2V0X251bV9jbGFzc2VzKCkgIT0gMiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsCisgICAgICAgICAgICAiQm9vc3RlZCB0cmVlcyBjYW4gb25seSBiZSB1c2VkIGZvciAyLWNsYXNzIGNsYXNzaWZpY2F0aW9uLiIgKTsKKyAgICAgICAgQ1ZfQ0FMTCggc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpICk7CisgICAgICAgIHdlYWsgPSBjdkNyZWF0ZVNlcSggMCwgc2l6ZW9mKEN2U2VxKSwgc2l6ZW9mKEN2Qm9vc3RUcmVlKiksIHN0b3JhZ2UgKTsKKyAgICAgICAgc3RvcmFnZSA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRhdGEtPnNldF9kYXRhKCBfdHJhaW5fZGF0YSwgX3RmbGFnLCBfcmVzcG9uc2VzLCBfdmFyX2lkeCwKKyAgICAgICAgICAgIF9zYW1wbGVfaWR4LCBfdmFyX3R5cGUsIF9taXNzaW5nX21hc2ssIF9wYXJhbXMsIHRydWUsIHRydWUsIHRydWUgKTsKKyAgICB9CisKKyAgICB1cGRhdGVfd2VpZ2h0cyggMCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHBhcmFtcy53ZWFrX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZCb29zdFRyZWUqIHRyZWUgPSBuZXcgQ3ZCb29zdFRyZWU7CisgICAgICAgIGlmKCAhdHJlZS0+dHJhaW4oIGRhdGEsIHN1YnNhbXBsZV9tYXNrLCB0aGlzICkgKQorICAgICAgICB7CisgICAgICAgICAgICBkZWxldGUgdHJlZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vY3ZDaGVja0FyciggZ2V0X3dlYWtfcmVzcG9uc2UoKSk7CisgICAgICAgIGN2U2VxUHVzaCggd2VhaywgJnRyZWUgKTsKKyAgICAgICAgdXBkYXRlX3dlaWdodHMoIHRyZWUgKTsKKyAgICAgICAgdHJpbV93ZWlnaHRzKCk7CisgICAgfQorCisgICAgZGF0YS0+aXNfY2xhc3NpZmllciA9IHRydWU7CisgICAgb2sgPSB0cnVlOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBvazsKK30KKworCit2b2lkCitDdkJvb3N0Ojp1cGRhdGVfd2VpZ2h0cyggQ3ZCb29zdFRyZWUqIHRyZWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb29zdDo6dXBkYXRlX3dlaWdodHMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgY291bnQgPSBkYXRhLT5zYW1wbGVfY291bnQ7CisgICAgZG91YmxlIHN1bXcgPSAwLjsKKworICAgIGlmKCAhdHJlZSApIC8vIGJlZm9yZSB0cmFpbmluZyB0aGUgZmlyc3QgdHJlZSwgaW5pdGlhbGl6ZSB3ZWlnaHRzIGFuZCBvdGhlciBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBjb25zdCBpbnQqIGNsYXNzX2xhYmVscyA9IGRhdGEtPmdldF9jbGFzc19sYWJlbHMoZGF0YS0+ZGF0YV9yb290KTsKKyAgICAgICAgLy8gaW4gY2FzZSBvZiBsb2dpdGJvb3N0IGFuZCBnZW50bGUgYWRhYm9vc3QgZWFjaCB3ZWFrIHRyZWUgaXMgYSByZWdyZXNzaW9uIHRyZWUsCisgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY29udmVydCBjbGFzcyBsYWJlbHMgdG8gZmxvYXRpbmctcG9pbnQgdmFsdWVzCisgICAgICAgIGZsb2F0KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfb3JkX3Jlc3BvbnNlcyhkYXRhLT5kYXRhX3Jvb3QpOworICAgICAgICBpbnQqIGxhYmVscyA9IGRhdGEtPmdldF9sYWJlbHMoZGF0YS0+ZGF0YV9yb290KTsKKyAgICAgICAgZG91YmxlIHcwID0gMS4vY291bnQ7CisgICAgICAgIGRvdWJsZSBwWzJdID0geyAxLCAxIH07CisgICAgICAgIAorICAgICAgICBjdlJlbGVhc2VNYXQoICZvcmlnX3Jlc3BvbnNlICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJnN1bV9yZXNwb25zZSApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZ3ZWFrX2V2YWwgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmc3Vic2FtcGxlX21hc2sgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmd2VpZ2h0cyApOworCisgICAgICAgIENWX0NBTEwoIG9yaWdfcmVzcG9uc2UgPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzMyUyApKTsKKyAgICAgICAgQ1ZfQ0FMTCggd2Vha19ldmFsID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl82NEYgKSk7CisgICAgICAgIENWX0NBTEwoIHN1YnNhbXBsZV9tYXNrID0gY3ZDcmVhdGVNYXQoIDEsIGNvdW50LCBDVl84VSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggd2VpZ2h0cyA9IGN2Q3JlYXRlTWF0KCAxLCBjb3VudCwgQ1ZfNjRGICkpOworICAgICAgICBDVl9DQUxMKCBzdWJ0cmVlX3dlaWdodHMgPSBjdkNyZWF0ZU1hdCggMSwgY291bnQgKyAyLCBDVl82NEYgKSk7CisKKyAgICAgICAgaWYoIGRhdGEtPmhhdmVfcHJpb3JzICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gY29tcHV0ZSB3ZWlnaHQgc2NhbGUgZm9yIGVhY2ggY2xhc3MgZnJvbSB0aGVpciBwcmlvciBwcm9iYWJpbGl0aWVzCisgICAgICAgICAgICBpbnQgYzEgPSAwOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIGMxICs9IGNsYXNzX2xhYmVsc1tpXTsKKyAgICAgICAgICAgIHBbMF0gPSBkYXRhLT5wcmlvcnMtPmRhdGEuZGJbMF0qKGMxIDwgY291bnQgPyAxLi8oY291bnQgLSBjMSkgOiAwLik7CisgICAgICAgICAgICBwWzFdID0gZGF0YS0+cHJpb3JzLT5kYXRhLmRiWzFdKihjMSA+IDAgPyAxLi9jMSA6IDAuKTsKKyAgICAgICAgICAgIHBbMF0gLz0gcFswXSArIHBbMV07CisgICAgICAgICAgICBwWzFdID0gMS4gLSBwWzBdOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBzYXZlIG9yaWdpbmFsIGNhdGVnb3JpY2FsIHJlc3BvbnNlcyB7MCwxfSwgY29udmVydCB0aGVtIHRvIHstMSwxfQorICAgICAgICAgICAgb3JpZ19yZXNwb25zZS0+ZGF0YS5pW2ldID0gY2xhc3NfbGFiZWxzW2ldKjIgLSAxOworICAgICAgICAgICAgLy8gbWFrZSBhbGwgdGhlIHNhbXBsZXMgYWN0aXZlIGF0IHN0YXJ0LgorICAgICAgICAgICAgLy8gbGF0ZXIsIGluIHRyaW1fd2VpZ2h0cygpIGRlYWN0aXZhdGUvcmVhY3RpdmUgYWdhaW4gc29tZSwgaWYgbmVlZAorICAgICAgICAgICAgc3Vic2FtcGxlX21hc2stPmRhdGEucHRyW2ldID0gKHVjaGFyKTE7CisgICAgICAgICAgICAvLyBtYWtlIGFsbCB0aGUgaW5pdGlhbCB3ZWlnaHRzIHRoZSBzYW1lLgorICAgICAgICAgICAgd2VpZ2h0cy0+ZGF0YS5kYltpXSA9IHcwKnBbY2xhc3NfbGFiZWxzW2ldXTsKKyAgICAgICAgICAgIC8vIHNldCB0aGUgbGFiZWxzIHRvIGZpbmQgKGZyb20gd2l0aGluIHdlYWsgdHJlZSBsZWFybmluZyBwcm9jKQorICAgICAgICAgICAgLy8gdGhlIHBhcnRpY3VsYXIgc2FtcGxlIHdlaWdodCwgYW5kIHdoZXJlIHRvIHN0b3JlIHRoZSByZXNwb25zZS4KKyAgICAgICAgICAgIGxhYmVsc1tpXSA9IGk7CisgICAgICAgIH0KKworICAgICAgICBpZiggcGFyYW1zLmJvb3N0X3R5cGUgPT0gTE9HSVQgKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9DQUxMKCBzdW1fcmVzcG9uc2UgPSBjdkNyZWF0ZU1hdCggMSwgY291bnQsIENWXzY0RiApKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bV9yZXNwb25zZS0+ZGF0YS5kYltpXSA9IDA7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VzW2ldID0gb3JpZ19yZXNwb25zZS0+ZGF0YS5pW2ldID4gMCA/IDIuZiA6IC0yLmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgbG9naXRib29zdCBlYWNoIHdlYWsgdHJlZSBpcyBhIHJlZ3Jlc3Npb24gdHJlZS4KKyAgICAgICAgICAgIC8vIHRoZSB0YXJnZXQgZnVuY3Rpb24gdmFsdWVzIGFyZSByZWNhbGN1bGF0ZWQgZm9yIGVhY2ggb2YgdGhlIHRyZWVzCisgICAgICAgICAgICBkYXRhLT5pc19jbGFzc2lmaWVyID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggcGFyYW1zLmJvb3N0X3R5cGUgPT0gR0VOVExFICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHJlc3BvbnNlc1tpXSA9IChmbG9hdClvcmlnX3Jlc3BvbnNlLT5kYXRhLmlbaV07CisKKyAgICAgICAgICAgIGRhdGEtPmlzX2NsYXNzaWZpZXIgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvLyBhdCB0aGlzIG1vbWVudCwgZm9yIGFsbCB0aGUgc2FtcGxlcyB0aGF0IHBhcnRpY2lwYXRlZCBpbiB0aGUgdHJhaW5pbmcgb2YgdGhlIG1vc3QKKyAgICAgICAgLy8gcmVjZW50IHdlYWsgY2xhc3NpZmllciB3ZSBrbm93IHRoZSByZXNwb25zZXMuIEZvciBvdGhlciBzYW1wbGVzIHdlIG5lZWQgdG8gY29tcHV0ZSB0aGVtCisgICAgICAgIGlmKCBoYXZlX3N1YnNhbXBsZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZsb2F0KiB2YWx1ZXMgPSAoZmxvYXQqKShkYXRhLT5idWYtPmRhdGEucHRyICsgZGF0YS0+YnVmLT5zdGVwKTsKKyAgICAgICAgICAgIHVjaGFyKiBtaXNzaW5nID0gZGF0YS0+YnVmLT5kYXRhLnB0ciArIGRhdGEtPmJ1Zi0+c3RlcCoyOworICAgICAgICAgICAgQ3ZNYXQgX3NhbXBsZSwgX21hc2s7CisKKyAgICAgICAgICAgIC8vIGludmVydCB0aGUgc3Vic2FtcGxlIG1hc2sKKyAgICAgICAgICAgIGN2WG9yUyggc3Vic2FtcGxlX21hc2ssIGN2U2NhbGFyKDEuKSwgc3Vic2FtcGxlX21hc2sgKTsKKyAgICAgICAgICAgIGRhdGEtPmdldF92ZWN0b3JzKCBzdWJzYW1wbGVfbWFzaywgdmFsdWVzLCBtaXNzaW5nLCAwICk7CisgICAgICAgICAgICAvL2RhdGEtPmdldF92ZWN0b3JzKCAwLCB2YWx1ZXMsIG1pc3NpbmcsIDAgKTsKKworICAgICAgICAgICAgX3NhbXBsZSA9IGN2TWF0KCAxLCBkYXRhLT52YXJfY291bnQsIENWXzMyRiApOworICAgICAgICAgICAgX21hc2sgPSBjdk1hdCggMSwgZGF0YS0+dmFyX2NvdW50LCBDVl84VSApOworCisgICAgICAgICAgICAvLyBydW4gdHJlZSB0aHJvdWdoIGFsbCB0aGUgbm9uLXByb2Nlc3NlZCBzYW1wbGVzCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgaWYoIHN1YnNhbXBsZV9tYXNrLT5kYXRhLnB0cltpXSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfc2FtcGxlLmRhdGEuZmwgPSB2YWx1ZXM7CisgICAgICAgICAgICAgICAgICAgIF9tYXNrLmRhdGEucHRyID0gbWlzc2luZzsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzICs9IF9zYW1wbGUuY29sczsKKyAgICAgICAgICAgICAgICAgICAgbWlzc2luZyArPSBfbWFzay5jb2xzOworICAgICAgICAgICAgICAgICAgICB3ZWFrX2V2YWwtPmRhdGEuZGJbaV0gPSB0cmVlLT5wcmVkaWN0KCAmX3NhbXBsZSwgJl9tYXNrLCB0cnVlICktPnZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vdyB1cGRhdGUgd2VpZ2h0cyBhbmQgb3RoZXIgcGFyYW1ldGVycyBmb3IgZWFjaCB0eXBlIG9mIGJvb3N0aW5nCisgICAgICAgIGlmKCBwYXJhbXMuYm9vc3RfdHlwZSA9PSBESVNDUkVURSApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIERpc2NyZXRlIEFkYUJvb3N0OgorICAgICAgICAgICAgLy8gICB3ZWFrX2V2YWxbaV0gKD1mKHhfaSkpIGlzIGluIHstMSwxfQorICAgICAgICAgICAgLy8gICBlcnIgPSBzdW0od19pKihmKHhfaSkgIT0geV9pKSkvc3VtKHdfaSkKKyAgICAgICAgICAgIC8vICAgQyA9IGxvZygoMS1lcnIpL2VycikKKyAgICAgICAgICAgIC8vICAgd19pICo9IGV4cChDKihmKHhfaSkgIT0geV9pKSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZG91YmxlIEMsIGVyciA9IDAuOworICAgICAgICAgICAgZG91YmxlIHNjYWxlW10gPSB7IDEuLCAwLiB9OworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzLT5kYXRhLmRiW2ldOworICAgICAgICAgICAgICAgIHN1bXcgKz0gdzsKKyAgICAgICAgICAgICAgICBlcnIgKz0gdyood2Vha19ldmFsLT5kYXRhLmRiW2ldICE9IG9yaWdfcmVzcG9uc2UtPmRhdGEuaVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBzdW13ICE9IDAgKQorICAgICAgICAgICAgICAgIGVyciAvPSBzdW13OworICAgICAgICAgICAgQyA9IGVyciA9IC1sb2dfcmF0aW8oIGVyciApOworICAgICAgICAgICAgc2NhbGVbMV0gPSBleHAoZXJyKTsKKyAgICAKKyAgICAgICAgICAgIHN1bXcgPSAwOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0cy0+ZGF0YS5kYltpXSoKKyAgICAgICAgICAgICAgICAgICAgc2NhbGVbd2Vha19ldmFsLT5kYXRhLmRiW2ldICE9IG9yaWdfcmVzcG9uc2UtPmRhdGEuaVtpXV07CisgICAgICAgICAgICAgICAgc3VtdyArPSB3OworICAgICAgICAgICAgICAgIHdlaWdodHMtPmRhdGEuZGJbaV0gPSB3OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cmVlLT5zY2FsZSggQyApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHBhcmFtcy5ib29zdF90eXBlID09IFJFQUwgKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBSZWFsIEFkYUJvb3N0OgorICAgICAgICAgICAgLy8gICB3ZWFrX2V2YWxbaV0gPSBmKHhfaSkgPSAwLjUqbG9nKHAoeF9pKS8oMS1wKHhfaSkpKSwgcCh4X2kpPVAoeT0xfHhfaSkKKyAgICAgICAgICAgIC8vICAgd19pICo9IGV4cCgteV9pKmYoeF9pKSkKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHdlYWtfZXZhbC0+ZGF0YS5kYltpXSAqPSAtb3JpZ19yZXNwb25zZS0+ZGF0YS5pW2ldOworCisgICAgICAgICAgICBjdkV4cCggd2Vha19ldmFsLCB3ZWFrX2V2YWwgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0cy0+ZGF0YS5kYltpXSp3ZWFrX2V2YWwtPmRhdGEuZGJbaV07CisgICAgICAgICAgICAgICAgc3VtdyArPSB3OworICAgICAgICAgICAgICAgIHdlaWdodHMtPmRhdGEuZGJbaV0gPSB3OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHBhcmFtcy5ib29zdF90eXBlID09IExPR0lUICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gTG9naXRCb29zdDoKKyAgICAgICAgICAgIC8vICAgd2Vha19ldmFsW2ldID0gZih4X2kpIGluIFstel9tYXgsel9tYXhdCisgICAgICAgICAgICAvLyAgIHN1bV9yZXNwb25zZSA9IEYoeF9pKS4KKyAgICAgICAgICAgIC8vICAgRih4X2kpICs9IDAuNSpmKHhfaSkKKyAgICAgICAgICAgIC8vICAgcCh4X2kpID0gZXhwKEYoeF9pKSkvKGV4cChGKHhfaSkpICsgZXhwKC1GKHhfaSkpPTEvKDErZXhwKC0yKkYoeF9pKSkpCisgICAgICAgICAgICAvLyAgIHJldXNlIHdlYWtfZXZhbDogd2Vha19ldmFsW2ldIDwtIHAoeF9pKQorICAgICAgICAgICAgLy8gICB3X2kgPSBwKHhfaSkqMSgxIC0gcCh4X2kpKQorICAgICAgICAgICAgLy8gICB6X2kgPSAoKHlfaSsxKS8yIC0gcCh4X2kpKS8ocCh4X2kpKigxIC0gcCh4X2kpKSkKKyAgICAgICAgICAgIC8vICAgc3RvcmUgel9pIHRvIHRoZSBkYXRhLT5kYXRhX3Jvb3QgYXMgdGhlIG5ldyB0YXJnZXQgcmVzcG9uc2VzCisKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYl93ZWlnaHRfdGhyZXNoID0gRkxUX0VQU0lMT047CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbGJfel9tYXggPSAxMC47CisgICAgICAgICAgICBmbG9hdCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X29yZF9yZXNwb25zZXMoZGF0YS0+ZGF0YV9yb290KTsKKworICAgICAgICAgICAgLyppZiggd2Vhay0+dG90YWwgPT0gNyApCisgICAgICAgICAgICAgICAgcHV0Y2hhcignKicpOyovCisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcyA9IHN1bV9yZXNwb25zZS0+ZGF0YS5kYltpXSArIDAuNSp3ZWFrX2V2YWwtPmRhdGEuZGJbaV07CisgICAgICAgICAgICAgICAgc3VtX3Jlc3BvbnNlLT5kYXRhLmRiW2ldID0gczsKKyAgICAgICAgICAgICAgICB3ZWFrX2V2YWwtPmRhdGEuZGJbaV0gPSAtMipzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjdkV4cCggd2Vha19ldmFsLCB3ZWFrX2V2YWwgKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBwID0gMS4vKDEuICsgd2Vha19ldmFsLT5kYXRhLmRiW2ldKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHAqKDEgLSBwKSwgejsKKyAgICAgICAgICAgICAgICB3ID0gTUFYKCB3LCBsYl93ZWlnaHRfdGhyZXNoICk7CisgICAgICAgICAgICAgICAgd2VpZ2h0cy0+ZGF0YS5kYltpXSA9IHc7CisgICAgICAgICAgICAgICAgc3VtdyArPSB3OworICAgICAgICAgICAgICAgIGlmKCBvcmlnX3Jlc3BvbnNlLT5kYXRhLmlbaV0gPiAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHogPSAxLi9wOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZXNbaV0gPSAoZmxvYXQpTUlOKHosIGxiX3pfbWF4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeiA9IDEuLygxLXApOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZXNbaV0gPSAoZmxvYXQpLU1JTih6LCBsYl96X21heCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLy8gR2VudGxlIEFkYUJvb3N0OgorICAgICAgICAgICAgLy8gICB3ZWFrX2V2YWxbaV0gPSBmKHhfaSkgaW4gWy0xLDFdCisgICAgICAgICAgICAvLyAgIHdfaSAqPSBleHAoLXlfaSpmKHhfaSkpCisgICAgICAgICAgICBhc3NlcnQoIHBhcmFtcy5ib29zdF90eXBlID09IEdFTlRMRSApOworICAgICAgICAgICAgCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgd2Vha19ldmFsLT5kYXRhLmRiW2ldICo9IC1vcmlnX3Jlc3BvbnNlLT5kYXRhLmlbaV07CisKKyAgICAgICAgICAgIGN2RXhwKCB3ZWFrX2V2YWwsIHdlYWtfZXZhbCApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHcgPSB3ZWlnaHRzLT5kYXRhLmRiW2ldICogd2Vha19ldmFsLT5kYXRhLmRiW2ldOworICAgICAgICAgICAgICAgIHdlaWdodHMtPmRhdGEuZGJbaV0gPSB3OworICAgICAgICAgICAgICAgIHN1bXcgKz0gdzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHJlbm9ybWFsaXplIHdlaWdodHMKKyAgICBpZiggc3VtdyA+IEZMVF9FUFNJTE9OICkKKyAgICB7CisgICAgICAgIHN1bXcgPSAxLi9zdW13OworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7ICsraSApCisgICAgICAgICAgICB3ZWlnaHRzLT5kYXRhLmRiW2ldICo9IHN1bXc7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0XzY0ZiwgZG91YmxlLCBDVl9MVCwgaW50ICkKKworCit2b2lkCitDdkJvb3N0Ojp0cmltX3dlaWdodHMoKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb29zdDo6dHJpbV93ZWlnaHRzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGNvdW50ID0gZGF0YS0+c2FtcGxlX2NvdW50LCBuel9jb3VudCA9IDA7CisgICAgZG91YmxlIHN1bSwgdGhyZXNob2xkOworCisgICAgaWYoIHBhcmFtcy53ZWlnaHRfdHJpbV9yYXRlIDw9IDAuIHx8IHBhcmFtcy53ZWlnaHRfdHJpbV9yYXRlID49IDEuICkKKyAgICAgICAgRVhJVDsKKworICAgIC8vIHVzZSB3ZWFrX2V2YWwgYXMgdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igc29ydGVkIHdlaWdodHMKKyAgICBjdkNvcHkoIHdlaWdodHMsIHdlYWtfZXZhbCApOworCisgICAgaWN2U29ydF82NGYoIHdlYWtfZXZhbC0+ZGF0YS5kYiwgY291bnQsIDAgKTsKKworICAgIC8vIGFzIHdlaWdodCB0cmltbWluZyBvY2N1cnMgaW1tZWRpYXRlbHkgYWZ0ZXIgdXBkYXRpbmcgdGhlIHdlaWdodHMsCisgICAgLy8gd2hlcmUgdGhleSBhcmUgcmVub3JtYWxpemVkLCB3ZSBhc3N1bWUgdGhhdCB0aGUgd2VpZ2h0IHN1bSA9IDEuCisgICAgc3VtID0gMS4gLSBwYXJhbXMud2VpZ2h0X3RyaW1fcmF0ZTsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB3ID0gd2Vha19ldmFsLT5kYXRhLmRiW2ldOworICAgICAgICBpZiggc3VtID4gdyApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgc3VtIC09IHc7CisgICAgfQorCisgICAgdGhyZXNob2xkID0gaSA8IGNvdW50ID8gd2Vha19ldmFsLT5kYXRhLmRiW2ldIDogREJMX01BWDsKKworICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGRvdWJsZSB3ID0gd2VpZ2h0cy0+ZGF0YS5kYltpXTsKKyAgICAgICAgaW50IGYgPSB3ID4gdGhyZXNob2xkOworICAgICAgICBzdWJzYW1wbGVfbWFzay0+ZGF0YS5wdHJbaV0gPSAodWNoYXIpZjsKKyAgICAgICAgbnpfY291bnQgKz0gZjsKKyAgICB9CisKKyAgICBoYXZlX3N1YnNhbXBsZSA9IG56X2NvdW50IDwgY291bnQ7CisKKyAgICBfX0VORF9fOworfQorCisKK2Zsb2F0CitDdkJvb3N0OjpwcmVkaWN0KCBjb25zdCBDdk1hdCogX3NhbXBsZSwgY29uc3QgQ3ZNYXQqIF9taXNzaW5nLAorICAgICAgICAgICAgICAgICAgQ3ZNYXQqIHdlYWtfcmVzcG9uc2VzLCBDdlNsaWNlIHNsaWNlLAorICAgICAgICAgICAgICAgICAgYm9vbCByYXdfbW9kZSApIGNvbnN0Cit7CisgICAgZmxvYXQqIGJ1ZiA9IDA7CisgICAgYm9vbCBhbGxvY2F0ZWQgPSBmYWxzZTsKKyAgICBmbG9hdCB2YWx1ZSA9IC1GTFRfTUFYOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb29zdDo6cHJlZGljdCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCB3ZWFrX2NvdW50LCB2YXJfY291bnQ7CisgICAgQ3ZNYXQgc2FtcGxlLCBtaXNzaW5nOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBkb3VibGUgc3VtID0gMDsKKyAgICBpbnQgY2xzX2lkeDsKKyAgICBpbnQgd3N0ZXAgPSAwOworICAgIGNvbnN0IGludCogdnR5cGU7CisgICAgY29uc3QgaW50KiBjbWFwOworICAgIGNvbnN0IGludCogY29mczsKKworICAgIGlmKCAhd2VhayApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSBib29zdGVkIHRyZWUgZW5zZW1ibGUgaGFzIG5vdCBiZWVuIHRyYWluZWQgeWV0IiApOworCisgICAgaWYoICFDVl9JU19NQVQoX3NhbXBsZSkgfHwgQ1ZfTUFUX1RZUEUoX3NhbXBsZS0+dHlwZSkgIT0gQ1ZfMzJGQzEgfHwKKyAgICAgICAgX3NhbXBsZS0+Y29scyAhPSAxICYmIF9zYW1wbGUtPnJvd3MgIT0gMSB8fAorICAgICAgICBfc2FtcGxlLT5jb2xzICsgX3NhbXBsZS0+cm93cyAtIDEgIT0gZGF0YS0+dmFyX2FsbCAmJiAhcmF3X21vZGUgfHwKKyAgICAgICAgX3NhbXBsZS0+Y29scyArIF9zYW1wbGUtPnJvd3MgLSAxICE9IGRhdGEtPnZhcl9jb3VudCAmJiByYXdfbW9kZSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAidGhlIGlucHV0IHNhbXBsZSBtdXN0IGJlIDFkIGZsb2F0aW5nLXBvaW50IHZlY3RvciB3aXRoIHRoZSBzYW1lICIKKyAgICAgICAgIm51bWJlciBvZiBlbGVtZW50cyBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhYmxlcyB1c2VkIGZvciB0cmFpbmluZyIgKTsKKworICAgIGlmKCBfbWlzc2luZyApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChfbWlzc2luZykgfHwgIUNWX0lTX01BU0tfQVJSKF9taXNzaW5nKSB8fAorICAgICAgICAgICAgIUNWX0FSRV9TSVpFU19FUShfbWlzc2luZywgX3NhbXBsZSkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJ0aGUgbWlzc2luZyBkYXRhIG1hc2sgbXVzdCBiZSA4LWJpdCB2ZWN0b3Igb2YgdGhlIHNhbWUgc2l6ZSBhcyBpbnB1dCBzYW1wbGUiICk7CisgICAgfQorCisgICAgd2Vha19jb3VudCA9IGN2U2xpY2VMZW5ndGgoIHNsaWNlLCB3ZWFrICk7CisgICAgaWYoIHdlYWtfY291bnQgPj0gd2Vhay0+dG90YWwgKQorICAgIHsKKyAgICAgICAgd2Vha19jb3VudCA9IHdlYWstPnRvdGFsOworICAgICAgICBzbGljZS5zdGFydF9pbmRleCA9IDA7CisgICAgfQorCisgICAgaWYoIHdlYWtfcmVzcG9uc2VzICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHdlYWtfcmVzcG9uc2VzKSB8fAorICAgICAgICAgICAgQ1ZfTUFUX1RZUEUod2Vha19yZXNwb25zZXMtPnR5cGUpICE9IENWXzMyRkMxIHx8CisgICAgICAgICAgICB3ZWFrX3Jlc3BvbnNlcy0+Y29scyAhPSAxICYmIHdlYWtfcmVzcG9uc2VzLT5yb3dzICE9IDEgfHwKKyAgICAgICAgICAgIHdlYWtfcmVzcG9uc2VzLT5jb2xzICsgd2Vha19yZXNwb25zZXMtPnJvd3MgLSAxICE9IHdlYWtfY291bnQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICJUaGUgb3V0cHV0IG1hdHJpeCBvZiB3ZWFrIGNsYXNzaWZpZXIgcmVzcG9uc2VzIG11c3QgYmUgdmFsaWQgIgorICAgICAgICAgICAgImZsb2F0aW5nLXBvaW50IHZlY3RvciBvZiB0aGUgc2FtZSBudW1iZXIgb2YgY29tcG9uZW50cyBhcyB0aGUgbGVuZ3RoIG9mIGlucHV0IHNsaWNlIiApOworICAgICAgICB3c3RlcCA9IENWX0lTX01BVF9DT05UKHdlYWtfcmVzcG9uc2VzLT50eXBlKSA/IDEgOiB3ZWFrX3Jlc3BvbnNlcy0+c3RlcC9zaXplb2YoZmxvYXQpOworICAgIH0KKworICAgIHZhcl9jb3VudCA9IGRhdGEtPnZhcl9jb3VudDsKKyAgICB2dHlwZSA9IGRhdGEtPnZhcl90eXBlLT5kYXRhLmk7CisgICAgY21hcCA9IGRhdGEtPmNhdF9tYXAtPmRhdGEuaTsKKyAgICBjb2ZzID0gZGF0YS0+Y2F0X29mcy0+ZGF0YS5pOworCisgICAgLy8gaWYgbmVlZCwgcHJlcHJvY2VzcyB0aGUgaW5wdXQgdmVjdG9yCisgICAgaWYoICFyYXdfbW9kZSAmJiAoZGF0YS0+Y2F0X3Zhcl9jb3VudCA+IDAgfHwgZGF0YS0+dmFyX2lkeCkgKQorICAgIHsKKyAgICAgICAgaW50IGJ1ZnNpemU7CisgICAgICAgIGludCBzdGVwLCBtc3RlcCA9IDA7CisgICAgICAgIGNvbnN0IGZsb2F0KiBzcmNfc2FtcGxlOworICAgICAgICBjb25zdCB1Y2hhciogc3JjX21hc2sgPSAwOworICAgICAgICBmbG9hdCogZHN0X3NhbXBsZTsKKyAgICAgICAgdWNoYXIqIGRzdF9tYXNrOworICAgICAgICBjb25zdCBpbnQqIHZpZHggPSBkYXRhLT52YXJfaWR4ICYmICFyYXdfbW9kZSA/IGRhdGEtPnZhcl9pZHgtPmRhdGEuaSA6IDA7CisgICAgICAgIGJvb2wgaGF2ZV9tYXNrID0gX21pc3NpbmcgIT0gMDsKKworICAgICAgICBidWZzaXplID0gdmFyX2NvdW50KihzaXplb2YoZmxvYXQpICsgc2l6ZW9mKHVjaGFyKSk7CisgICAgICAgIGlmKCBidWZzaXplIDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICAgICAgICAgIGJ1ZiA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBidWZzaXplICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggYnVmID0gKGZsb2F0KiljdkFsbG9jKCBidWZzaXplICkpOworICAgICAgICAgICAgYWxsb2NhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBkc3Rfc2FtcGxlID0gYnVmOworICAgICAgICBkc3RfbWFzayA9ICh1Y2hhciopKGJ1ZiArIHZhcl9jb3VudCk7CisKKyAgICAgICAgc3JjX3NhbXBsZSA9IF9zYW1wbGUtPmRhdGEuZmw7CisgICAgICAgIHN0ZXAgPSBDVl9JU19NQVRfQ09OVChfc2FtcGxlLT50eXBlKSA/IDEgOiBfc2FtcGxlLT5zdGVwL3NpemVvZihzcmNfc2FtcGxlWzBdKTsKKworICAgICAgICBpZiggX21pc3NpbmcgKQorICAgICAgICB7CisgICAgICAgICAgICBzcmNfbWFzayA9IF9taXNzaW5nLT5kYXRhLnB0cjsKKyAgICAgICAgICAgIG1zdGVwID0gQ1ZfSVNfTUFUX0NPTlQoX21pc3NpbmctPnR5cGUpID8gMSA6IF9taXNzaW5nLT5zdGVwOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHZhcl9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IHZpZHggPyB2aWR4W2ldIDogaTsKKyAgICAgICAgICAgIGZsb2F0IHZhbCA9IHNyY19zYW1wbGVbaWR4KnN0ZXBdOworICAgICAgICAgICAgaW50IGNpID0gdnR5cGVbaV07CisgICAgICAgICAgICB1Y2hhciBtID0gc3JjX21hc2sgPyBzcmNfbWFza1tpXSA6ICh1Y2hhcikwOworCisgICAgICAgICAgICBpZiggY2kgPj0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGEgPSBjb2ZzW2NpXSwgYiA9IGNvZnNbY2krMV0sIGMgPSBhOworICAgICAgICAgICAgICAgIGludCBpdmFsID0gY3ZSb3VuZCh2YWwpOworICAgICAgICAgICAgICAgIGlmKCBpdmFsICE9IHZhbCApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgICAgICJvbmUgb2YgaW5wdXQgY2F0ZWdvcmljYWwgdmFyaWFibGUgaXMgbm90IGFuIGludGVnZXIiICk7CisKKyAgICAgICAgICAgICAgICB3aGlsZSggYSA8IGIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IChhICsgYikgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGl2YWwgPCBjbWFwW2NdICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBpdmFsID4gY21hcFtjXSApCisgICAgICAgICAgICAgICAgICAgICAgICBhID0gYysxOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggYyA8IDAgfHwgaXZhbCAhPSBjbWFwW2NdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG0gPSAxOworICAgICAgICAgICAgICAgICAgICBoYXZlX21hc2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB2YWwgPSAoZmxvYXQpKGMgLSBjb2ZzW2NpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3Rfc2FtcGxlW2ldID0gdmFsOworICAgICAgICAgICAgZHN0X21hc2tbaV0gPSBtOworICAgICAgICB9CisKKyAgICAgICAgc2FtcGxlID0gY3ZNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfMzJGLCBkc3Rfc2FtcGxlICk7CisgICAgICAgIF9zYW1wbGUgPSAmc2FtcGxlOworCisgICAgICAgIGlmKCBoYXZlX21hc2sgKQorICAgICAgICB7CisgICAgICAgICAgICBtaXNzaW5nID0gY3ZNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfOFVDMSwgZHN0X21hc2sgKTsKKyAgICAgICAgICAgIF9taXNzaW5nID0gJm1pc3Npbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggd2VhaywgJnJlYWRlciApOworICAgIGN2U2V0U2VxUmVhZGVyUG9zKCAmcmVhZGVyLCBzbGljZS5zdGFydF9pbmRleCApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHdlYWtfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDdkJvb3N0VHJlZSogd3RyZWU7CisgICAgICAgIGRvdWJsZSB2YWw7CisKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggd3RyZWUsIHJlYWRlciApOworCisgICAgICAgIHZhbCA9IHd0cmVlLT5wcmVkaWN0KCBfc2FtcGxlLCBfbWlzc2luZywgdHJ1ZSApLT52YWx1ZTsKKyAgICAgICAgaWYoIHdlYWtfcmVzcG9uc2VzICkKKyAgICAgICAgICAgIHdlYWtfcmVzcG9uc2VzLT5kYXRhLmZsW2kqd3N0ZXBdID0gKGZsb2F0KXZhbDsKKworICAgICAgICBzdW0gKz0gdmFsOworICAgIH0KKworICAgIGNsc19pZHggPSBzdW0gPj0gMDsKKyAgICBpZiggcmF3X21vZGUgKQorICAgICAgICB2YWx1ZSA9IChmbG9hdCljbHNfaWR4OworICAgIGVsc2UKKyAgICAgICAgdmFsdWUgPSAoZmxvYXQpY21hcFtjb2ZzW3Z0eXBlW3Zhcl9jb3VudF1dICsgY2xzX2lkeF07CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGFsbG9jYXRlZCApCisgICAgICAgIGN2RnJlZSggJmJ1ZiApOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisKKwordm9pZCBDdkJvb3N0Ojp3cml0ZV9wYXJhbXMoIEN2RmlsZVN0b3JhZ2UqIGZzICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2Qm9vc3Q6OndyaXRlX3BhcmFtcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGNoYXIqIGJvb3N0X3R5cGVfc3RyID0KKyAgICAgICAgcGFyYW1zLmJvb3N0X3R5cGUgPT0gRElTQ1JFVEUgPyAiRGlzY3JldGVBZGFib29zdCIgOgorICAgICAgICBwYXJhbXMuYm9vc3RfdHlwZSA9PSBSRUFMID8gIlJlYWxBZGFib29zdCIgOgorICAgICAgICBwYXJhbXMuYm9vc3RfdHlwZSA9PSBMT0dJVCA/ICJMb2dpdEJvb3N0IiA6CisgICAgICAgIHBhcmFtcy5ib29zdF90eXBlID09IEdFTlRMRSA/ICJHZW50bGVBZGFib29zdCIgOiAwOworCisgICAgY29uc3QgY2hhciogc3BsaXRfY3JpdF9zdHIgPQorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgPT0gREVGQVVMVCA/ICJEZWZhdWx0IiA6CisgICAgICAgIHBhcmFtcy5zcGxpdF9jcml0ZXJpYSA9PSBHSU5JID8gIkdpbmkiIDoKKyAgICAgICAgcGFyYW1zLmJvb3N0X3R5cGUgPT0gTUlTQ0xBU1MgPyAiTWlzY2xhc3NpZmljYXRpb24iIDoKKyAgICAgICAgcGFyYW1zLmJvb3N0X3R5cGUgPT0gU1FFUlIgPyAiU3F1YXJlZEVyciIgOiAwOworCisgICAgaWYoIGJvb3N0X3R5cGVfc3RyICkKKyAgICAgICAgY3ZXcml0ZVN0cmluZyggZnMsICJib29zdGluZ190eXBlIiwgYm9vc3RfdHlwZV9zdHIgKTsKKyAgICBlbHNlCisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAiYm9vc3RpbmdfdHlwZSIsIHBhcmFtcy5ib29zdF90eXBlICk7CisKKyAgICBpZiggc3BsaXRfY3JpdF9zdHIgKQorICAgICAgICBjdldyaXRlU3RyaW5nKCBmcywgInNwbGl0dGluZ19jcml0ZXJpYSIsIHNwbGl0X2NyaXRfc3RyICk7CisgICAgZWxzZQorICAgICAgICBjdldyaXRlSW50KCBmcywgInNwbGl0dGluZ19jcml0ZXJpYSIsIHBhcmFtcy5zcGxpdF9jcml0ZXJpYSApOworCisgICAgY3ZXcml0ZUludCggZnMsICJudHJlZXMiLCBwYXJhbXMud2Vha19jb3VudCApOworICAgIGN2V3JpdGVSZWFsKCBmcywgIndlaWdodF90cmltbWluZ19yYXRlIiwgcGFyYW1zLndlaWdodF90cmltX3JhdGUgKTsKKworICAgIGRhdGEtPndyaXRlX3BhcmFtcyggZnMgKTsKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdkJvb3N0OjpyZWFkX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIGZub2RlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2Qm9vc3Q6OnJlYWRfcGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZGaWxlTm9kZSogdGVtcDsKKworICAgIGlmKCAhZm5vZGUgfHwgIUNWX05PREVfSVNfTUFQKGZub2RlLT50YWcpICkKKyAgICAgICAgcmV0dXJuOworCisgICAgZGF0YSA9IG5ldyBDdkRUcmVlVHJhaW5EYXRhKCk7CisgICAgQ1ZfQ0FMTCggZGF0YS0+cmVhZF9wYXJhbXMoZnMsIGZub2RlKSk7CisgICAgZGF0YS0+c2hhcmVkID0gdHJ1ZTsKKworICAgIHBhcmFtcy5tYXhfZGVwdGggPSBkYXRhLT5wYXJhbXMubWF4X2RlcHRoOworICAgIHBhcmFtcy5taW5fc2FtcGxlX2NvdW50ID0gZGF0YS0+cGFyYW1zLm1pbl9zYW1wbGVfY291bnQ7CisgICAgcGFyYW1zLm1heF9jYXRlZ29yaWVzID0gZGF0YS0+cGFyYW1zLm1heF9jYXRlZ29yaWVzOworICAgIHBhcmFtcy5wcmlvcnMgPSBkYXRhLT5wYXJhbXMucHJpb3JzOworICAgIHBhcmFtcy5yZWdyZXNzaW9uX2FjY3VyYWN5ID0gZGF0YS0+cGFyYW1zLnJlZ3Jlc3Npb25fYWNjdXJhY3k7CisgICAgcGFyYW1zLnVzZV9zdXJyb2dhdGVzID0gZGF0YS0+cGFyYW1zLnVzZV9zdXJyb2dhdGVzOworCisgICAgdGVtcCA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBmbm9kZSwgImJvb3N0aW5nX3R5cGUiICk7CisgICAgaWYoICF0ZW1wICkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYoIHRlbXAgJiYgQ1ZfTk9ERV9JU19TVFJJTkcodGVtcC0+dGFnKSApCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBib29zdF90eXBlX3N0ciA9IGN2UmVhZFN0cmluZyggdGVtcCwgIiIgKTsKKyAgICAgICAgcGFyYW1zLmJvb3N0X3R5cGUgPSBzdHJjbXAoIGJvb3N0X3R5cGVfc3RyLCAiRGlzY3JldGVBZGFib29zdCIgKSA9PSAwID8gRElTQ1JFVEUgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCggYm9vc3RfdHlwZV9zdHIsICJSZWFsQWRhYm9vc3QiICkgPT0gMCA/IFJFQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCggYm9vc3RfdHlwZV9zdHIsICJMb2dpdEJvb3N0IiApID09IDAgPyBMT0dJVCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCBib29zdF90eXBlX3N0ciwgIkdlbnRsZUFkYWJvb3N0IiApID09IDAgPyBHRU5UTEUgOiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwYXJhbXMuYm9vc3RfdHlwZSA9IGN2UmVhZEludCggdGVtcCwgLTEgKTsKKworICAgIGlmKCBwYXJhbXMuYm9vc3RfdHlwZSA8IERJU0NSRVRFIHx8IHBhcmFtcy5ib29zdF90eXBlID4gR0VOVExFICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24gYm9vc3RpbmcgdHlwZSIgKTsKKworICAgIHRlbXAgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgZm5vZGUsICJzcGxpdHRpbmdfY3JpdGVyaWEiICk7CisgICAgaWYoIHRlbXAgJiYgQ1ZfTk9ERV9JU19TVFJJTkcodGVtcC0+dGFnKSApCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBzcGxpdF9jcml0X3N0ciA9IGN2UmVhZFN0cmluZyggdGVtcCwgIiIgKTsKKyAgICAgICAgcGFyYW1zLnNwbGl0X2NyaXRlcmlhID0gc3RyY21wKCBzcGxpdF9jcml0X3N0ciwgIkRlZmF1bHQiICkgPT0gMCA/IERFRkFVTFQgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoIHNwbGl0X2NyaXRfc3RyLCAiR2luaSIgKSA9PSAwID8gR0lOSSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNtcCggc3BsaXRfY3JpdF9zdHIsICJNaXNjbGFzc2lmaWNhdGlvbiIgKSA9PSAwID8gTUlTQ0xBU1MgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoIHNwbGl0X2NyaXRfc3RyLCAiU3F1YXJlZEVyciIgKSA9PSAwID8gU1FFUlIgOiAtMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBwYXJhbXMuc3BsaXRfY3JpdGVyaWEgPSBjdlJlYWRJbnQoIHRlbXAsIC0xICk7CisKKyAgICBpZiggcGFyYW1zLnNwbGl0X2NyaXRlcmlhIDwgREVGQVVMVCB8fCBwYXJhbXMuYm9vc3RfdHlwZSA+IFNRRVJSICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24gYm9vc3RpbmcgdHlwZSIgKTsKKworICAgIHBhcmFtcy53ZWFrX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgZm5vZGUsICJudHJlZXMiICk7CisgICAgcGFyYW1zLndlaWdodF90cmltX3JhdGUgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgZm5vZGUsICJ3ZWlnaHRfdHJpbW1pbmdfcmF0ZSIsIDAuICk7CisKKyAgICBfX0VORF9fOworfQorCisKKwordm9pZAorQ3ZCb29zdDo6cmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZSVHJlZXM6OnJlYWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgQ3ZGaWxlTm9kZSogdHJlZXNfZm5vZGU7CisgICAgQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlOworICAgIGludCBpLCBudHJlZXM7CisKKyAgICBjbGVhcigpOworICAgIHJlYWRfcGFyYW1zKCBmcywgbm9kZSApOworCisgICAgaWYoICFkYXRhICkKKyAgICAgICAgRVhJVDsKKyAgICAgICAgCisgICAgdHJlZXNfZm5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInRyZWVzIiApOworICAgIGlmKCAhdHJlZXNfZm5vZGUgfHwgIUNWX05PREVfSVNfU0VRKHRyZWVzX2Zub2RlLT50YWcpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICI8dHJlZXM+IHRhZyBpcyBtaXNzaW5nIiApOworCisgICAgY3ZTdGFydFJlYWRTZXEoIHRyZWVzX2Zub2RlLT5kYXRhLnNlcSwgJnJlYWRlciApOworICAgIG50cmVlcyA9IHRyZWVzX2Zub2RlLT5kYXRhLnNlcS0+dG90YWw7CisKKyAgICBpZiggbnRyZWVzICE9IHBhcmFtcy53ZWFrX2NvdW50ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICAiVGhlIG51bWJlciBvZiB0cmVlcyBzdG9yZWQgZG9lcyBub3QgbWF0Y2ggPG50cmVlcz4gdGFnIHZhbHVlIiApOworCisgICAgQ1ZfQ0FMTCggc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpICk7CisgICAgd2VhayA9IGN2Q3JlYXRlU2VxKCAwLCBzaXplb2YoQ3ZTZXEpLCBzaXplb2YoQ3ZCb29zdFRyZWUqKSwgc3RvcmFnZSApOworCisgICAgZm9yKCBpID0gMDsgaSA8IG50cmVlczsgaSsrICkKKyAgICB7CisgICAgICAgIEN2Qm9vc3RUcmVlKiB0cmVlID0gbmV3IEN2Qm9vc3RUcmVlKCk7CisgICAgICAgIENWX0NBTEwodHJlZS0+cmVhZCggZnMsIChDdkZpbGVOb2RlKilyZWFkZXIucHRyLCB0aGlzLCBkYXRhICkpOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCByZWFkZXIuc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICBjdlNlcVB1c2goIHdlYWssICZ0cmVlICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCit2b2lkCitDdkJvb3N0Ojp3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZCb29zdDo6d3JpdGUiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIGludCBpOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9NTF9CT09TVElORyApOworCisgICAgaWYoICF3ZWFrICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBjbGFzc2lmaWVyIGhhcyBub3QgYmVlbiB0cmFpbmVkIHlldCIgKTsKKyAgICAgICAgCisgICAgd3JpdGVfcGFyYW1zKCBmcyApOworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJ0cmVlcyIsIENWX05PREVfU0VRICk7CisKKyAgICBjdlN0YXJ0UmVhZFNlcSggd2VhaywgJnJlYWRlciApOworCisgICAgZm9yKCBpID0gMDsgaSA8IHdlYWstPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ3ZCb29zdFRyZWUqIHRyZWU7CisgICAgICAgIENWX1JFQURfU0VRX0VMRU0oIHRyZWUsIHJlYWRlciApOworICAgICAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAwLCBDVl9OT0RFX01BUCApOworICAgICAgICB0cmVlLT53cml0ZSggZnMgKTsKKyAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICB9CisKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0N2TWF0KgorQ3ZCb29zdDo6Z2V0X3dlaWdodHMoKQoreworICAgIHJldHVybiB3ZWlnaHRzOworfQorCisKK0N2TWF0KgorQ3ZCb29zdDo6Z2V0X3N1YnRyZWVfd2VpZ2h0cygpCit7CisgICAgcmV0dXJuIHN1YnRyZWVfd2VpZ2h0czsKK30KKworCitDdk1hdCoKK0N2Qm9vc3Q6OmdldF93ZWFrX3Jlc3BvbnNlKCkKK3sKKyAgICByZXR1cm4gd2Vha19ldmFsOworfQorCisKK2NvbnN0IEN2Qm9vc3RQYXJhbXMmCitDdkJvb3N0OjpnZXRfcGFyYW1zKCkgY29uc3QKK3sKKyAgICByZXR1cm4gcGFyYW1zOworfQorCitDdlNlcSogQ3ZCb29zdDo6Z2V0X3dlYWtfcHJlZGljdG9ycygpCit7CisgICAgcmV0dXJuIHdlYWs7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvbWwvc3JjL21sY25uLmNwcCBiL21sL3NyYy9tbGNubi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1YmI5ZgotLS0gL2Rldi9udWxsCisrKyBiL21sL3NyYy9tbGNubi5jcHAKQEAgLTAsMCArMSwxNjc1IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfbWwuaCIKKworI2lmIDAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICBBdXhpbGFyeSBmdW5jdGlvbnMgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbnMgZm9yIHRoZSBDTk4gY2xhc3NpZmllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIGZsb2F0IGljdkNOTk1vZGVsUHJlZGljdCgKKyAgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWwqIGNubl9tb2RlbCwKKyAgICAgICAgY29uc3QgQ3ZNYXQqIGltYWdlLAorICAgICAgICBDdk1hdCogcHJvYnMgQ1ZfREVGQVVMVCgwKSApOworCitzdGF0aWMgdm9pZCBpY3ZDTk5Nb2RlbFVwZGF0ZSgKKyAgICAgICAgQ3ZTdGF0TW9kZWwqIGNubl9tb2RlbCwgY29uc3QgQ3ZNYXQqIGltYWdlcywgaW50IHRmbGFnLAorICAgICAgICBjb25zdCBDdk1hdCogcmVzcG9uc2VzLCBjb25zdCBDdlN0YXRNb2RlbFBhcmFtcyogcGFyYW1zLAorICAgICAgICBjb25zdCBDdk1hdCogQ1ZfREVGQVVMVCgwKSwgY29uc3QgQ3ZNYXQqIHNhbXBsZV9pZHggQ1ZfREVGQVVMVCgwKSwKKyAgICAgICAgY29uc3QgQ3ZNYXQqIENWX0RFRkFVTFQoMCksIGNvbnN0IEN2TWF0KiBDVl9ERUZBVUxUKDApKTsKKworc3RhdGljIHZvaWQgaWN2Q05OTW9kZWxSZWxlYXNlKCBDdlN0YXRNb2RlbCoqIGNubl9tb2RlbCApOworCitzdGF0aWMgdm9pZCBpY3ZUcmFpbkNOTmV0d29yayggQ3ZDTk5ldHdvcmsqIG5ldHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqKiBpbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHJlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogZXRhbG9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3JhZF9lc3RpbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRfaXRlciApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb25zIGZvciB0aGUgQ05OIG5ldHdvcmsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGljdkNOTmV0d29ya0FkZExheWVyKCBDdkNOTmV0d29yayogbmV0d29yaywgQ3ZDTk5MYXllciogbGF5ZXIgKTsKK3N0YXRpYyB2b2lkIGljdkNOTmV0d29ya1JlbGVhc2UoIEN2Q05OZXR3b3JrKiogbmV0d29yayApOworCisvKiBJbiBhbGwgbGF5ZXIgZnVuY3Rpb25zIHdlIGRlbm90ZSBpbnB1dCBieSBYIGFuZCBvdXRwdXQgYnkgWSwgd2hlcmUKKyAgIFggYW5kIFkgYXJlIGNvbHVtbi12ZWN0b3JzLCBzbyB0aGF0CisgICBsZW5ndGgoWCk9PTxuX2lucHV0X3BsYW5lcz4qPGlucHV0X2hlaWdodD4qPGlucHV0X3dpZHRoPiwKKyAgIGxlbmd0aChZKT09PG5fb3V0cHV0X3BsYW5lcz4qPG91dHB1dF9oZWlnaHQ+KjxvdXRwdXRfd2lkdGg+LgorKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGZ1bmN0aW9ucyBmb3IgY29udm9sdXRpb25hbCBsYXllciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljIHZvaWQgaWN2Q05OQ29udm9sdXRpb25SZWxlYXNlKCBDdkNOTkxheWVyKiogcF9sYXllciApOworCitzdGF0aWMgdm9pZCBpY3ZDTk5Db252b2x1dGlvbkZvcndhcmQoIEN2Q05OTGF5ZXIqIGxheWVyLCBjb25zdCBDdk1hdCogWCwgQ3ZNYXQqIFkgKTsKKworc3RhdGljIHZvaWQgaWN2Q05OQ29udm9sdXRpb25CYWNrd2FyZCggQ3ZDTk5MYXllciogIGxheWVyLCBpbnQgdCwKKyAgICBjb25zdCBDdk1hdCogWCwgY29uc3QgQ3ZNYXQqIGRFX2RZLCBDdk1hdCogZEVfZFggKTsKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZnVuY3Rpb25zIGZvciBzdWItc2FtcGxpbmcgbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgdm9pZCBpY3ZDTk5TdWJTYW1wbGluZ1JlbGVhc2UoIEN2Q05OTGF5ZXIqKiBwX2xheWVyICk7CisKK3N0YXRpYyB2b2lkIGljdkNOTlN1YlNhbXBsaW5nRm9yd2FyZCggQ3ZDTk5MYXllciogbGF5ZXIsIGNvbnN0IEN2TWF0KiBYLCBDdk1hdCogWSApOworCitzdGF0aWMgdm9pZCBpY3ZDTk5TdWJTYW1wbGluZ0JhY2t3YXJkKCBDdkNOTkxheWVyKiAgbGF5ZXIsIGludCB0LAorICAgIGNvbnN0IEN2TWF0KiBYLCBjb25zdCBDdk1hdCogZEVfZFksIEN2TWF0KiBkRV9kWCApOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBmdW5jdGlvbnMgZm9yIGZ1bGwgY29ubmVjdGVkIGxheWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYyB2b2lkIGljdkNOTkZ1bGxDb25uZWN0UmVsZWFzZSggQ3ZDTk5MYXllcioqIHBfbGF5ZXIgKTsKKworc3RhdGljIHZvaWQgaWN2Q05ORnVsbENvbm5lY3RGb3J3YXJkKCBDdkNOTkxheWVyKiBsYXllciwgY29uc3QgQ3ZNYXQqIFgsIEN2TWF0KiBZICk7CisKK3N0YXRpYyB2b2lkIGljdkNOTkZ1bGxDb25uZWN0QmFja3dhcmQoIEN2Q05OTGF5ZXIqIGxheWVyLCBpbnQsCisgICAgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCogZEVfZFksIEN2TWF0KiBkRV9kWCApOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgSUNWX0NIRUNLX0NOTl9ORVRXT1JLKG5ldHdvcmspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEN2Q05OTGF5ZXIqIGZpcnN0X2xheWVyLCAqbGF5ZXIsICpsYXN0X2xheWVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpbnQgbl9sYXllcnMsIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoICFuZXR3b3JrICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgIk51bGwgPG5ldHdvcms+IHBvaW50ZXIuIE5ldHdvcmsgbXVzdCBiZSBjcmVhdGVkIGJ5IHVzZXIuIiApOyAgICAgICAgICAgICAgICAgICBcCisgICAgbl9sYXllcnMgPSBuZXR3b3JrLT5uX2xheWVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZpcnN0X2xheWVyID0gbGFzdF9sYXllciA9IG5ldHdvcmstPmxheWVyczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoIGkgPSAwLCBsYXllciA9IGZpcnN0X2xheWVyOyBpIDwgbl9sYXllcnMgJiYgbGF5ZXI7IGkrKyApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiggIUlDVl9JU19DTk5fTEFZRVIobGF5ZXIpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiSW52YWxpZCBuZXR3b3JrIiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxhc3RfbGF5ZXIgPSBsYXllcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsYXllciA9IGxheWVyLT5uZXh0X2xheWVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBpID09IDAgfHwgaSAhPSBuX2xheWVycyB8fCBmaXJzdF9sYXllci0+cHJldl9sYXllciB8fCBsYXllciApICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJJbnZhbGlkIG5ldHdvcmsiICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmaXJzdF9sYXllci0+bl9pbnB1dF9wbGFuZXMgIT0gMSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkZpcnN0IGxheWVyIG11c3QgY29udGFpbiBvbmx5IG9uZSBpbnB1dCBwbGFuZSIgKTsgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBpbWdfc2l6ZSAhPSBmaXJzdF9sYXllci0+aW5wdXRfaGVpZ2h0KmZpcnN0X2xheWVyLT5pbnB1dF93aWR0aCApICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgaW5wdXQgc2l6ZXMgb2YgdGhlIGZpcnN0IGxheWVyIiApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBwYXJhbXMtPmV0YWxvbnMtPmNvbHMgIT0gbGFzdF9sYXllci0+bl9vdXRwdXRfcGxhbmVzKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbGFzdF9sYXllci0+b3V0cHV0X2hlaWdodCpsYXN0X2xheWVyLT5vdXRwdXRfd2lkdGggKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIG91dHB1dCBzaXplcyBvZiB0aGUgbGFzdCBsYXllciIgKTsgICAgICAgICAgICAgXAorfQorCisjZGVmaW5lIElDVl9DSEVDS19DTk5fTU9ERUxfUEFSQU1TKHBhcmFtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIXBhcmFtcyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCA8cGFyYW1zPiBwb2ludGVyIiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggIUlDVl9JU19NQVRfT0ZfVFlQRShwYXJhbXMtPmV0YWxvbnMsIENWXzMyRkMxKSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICI8ZXRhbG9ucz4gbXVzdCBiZSBDVl8zMkZDMSB0eXBlIiApOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBwYXJhbXMtPmV0YWxvbnMtPnJvd3MgIT0gY25uX21vZGVsLT5jbHNfbGFiZWxzLT5jb2xzICkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgPGV0YWxvbnM+IHNpemUiICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBwYXJhbXMtPmdyYWRfZXN0aW1fdHlwZSAhPSBDVl9DTk5fR1JBRF9FU1RJTV9SQU5ET00gJiYgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGFyYW1zLT5ncmFkX2VzdGltX3R5cGUgIT0gQ1ZfQ05OX0dSQURfRVNUSU1fQllfV09SU1RfSU1HICkgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIDxncmFkX2VzdGltX3R5cGU+IiApOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggcGFyYW1zLT5zdGFydF9pdGVyIDwgMCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJQYXJhbWV0ZXIgPHN0YXJ0X2l0ZXI+IG11c3QgYmUgcG9zaXRpdmUgb3IgemVybyIgKTsgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggcGFyYW1zLT5tYXhfaXRlciA8IDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcGFyYW1zLT5tYXhfaXRlciA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NpZmllciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTUxfSU1QTCBDdlN0YXRNb2RlbCoKK2N2VHJhaW5DTk5DbGFzc2lmaWVyKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGludCB0ZmxhZywKKyAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgICAgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqIF9wYXJhbXMsCisgICAgICAgICAgICBjb25zdCBDdk1hdCosIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCogKQoreworICAgIEN2Q05OU3RhdE1vZGVsKiBjbm5fbW9kZWwgICAgPSAwOworICAgIGNvbnN0IGZsb2F0Kiogb3V0X3RyYWluX2RhdGEgPSAwOworICAgIEN2TWF0KiByZXNwb25zZXMgICAgICAgICAgICAgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2VHJhaW5DTk5DbGFzc2lmaWVyIik7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5faW1hZ2VzOworICAgIGludCBpbWdfc2l6ZTsKKyAgICBDdkNOTlN0YXRNb2RlbFBhcmFtcyogcGFyYW1zID0gKEN2Q05OU3RhdE1vZGVsUGFyYW1zKilfcGFyYW1zOworCisgICAgQ1ZfQ0FMTChjbm5fbW9kZWwgPSAoQ3ZDTk5TdGF0TW9kZWwqKWN2Q3JlYXRlU3RhdE1vZGVsKAorICAgICAgICBDVl9TVEFUX01PREVMX01BR0lDX1ZBTHxDVl9DTk5fTUFHSUNfVkFMLCBzaXplb2YoQ3ZDTk5TdGF0TW9kZWwpLAorICAgICAgICBpY3ZDTk5Nb2RlbFJlbGVhc2UsIGljdkNOTk1vZGVsUHJlZGljdCwgaWN2Q05OTW9kZWxVcGRhdGUgKSk7CisKKyAgICBDVl9DQUxMKGN2UHJlcGFyZVRyYWluRGF0YSggImN2VHJhaW5DTk5DbGFzc2lmaWVyIiwKKyAgICAgICAgX3RyYWluX2RhdGEsIHRmbGFnLCBfcmVzcG9uc2VzLCBDVl9WQVJfQ0FURUdPUklDQUwsCisgICAgICAgIDAsIF9zYW1wbGVfaWR4LCBmYWxzZSwgJm91dF90cmFpbl9kYXRhLAorICAgICAgICAmbl9pbWFnZXMsICZpbWdfc2l6ZSwgJmltZ19zaXplLCAmcmVzcG9uc2VzLAorICAgICAgICAmY25uX21vZGVsLT5jbHNfbGFiZWxzLCAwICkpOworCisgICAgSUNWX0NIRUNLX0NOTl9NT0RFTF9QQVJBTVMocGFyYW1zKTsKKyAgICBJQ1ZfQ0hFQ0tfQ05OX05FVFdPUksocGFyYW1zLT5uZXR3b3JrKTsKKworICAgIGNubl9tb2RlbC0+bmV0d29yayA9IHBhcmFtcy0+bmV0d29yazsKKyAgICBDVl9DQUxMKGNubl9tb2RlbC0+ZXRhbG9ucyA9IChDdk1hdCopY3ZDbG9uZSggcGFyYW1zLT5ldGFsb25zICkpOworCisgICAgQ1ZfQ0FMTCggaWN2VHJhaW5DTk5ldHdvcmsoIGNubl9tb2RlbC0+bmV0d29yaywgb3V0X3RyYWluX2RhdGEsIHJlc3BvbnNlcywKKyAgICAgICAgY25uX21vZGVsLT5ldGFsb25zLCBwYXJhbXMtPmdyYWRfZXN0aW1fdHlwZSwgcGFyYW1zLT5tYXhfaXRlciwKKyAgICAgICAgcGFyYW1zLT5zdGFydF9pdGVyICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCAmJiBjbm5fbW9kZWwgKQorICAgIHsKKyAgICAgICAgY25uX21vZGVsLT5yZWxlYXNlKCAoQ3ZTdGF0TW9kZWwqKikmY25uX21vZGVsICk7CisgICAgfQorICAgIGN2RnJlZSggJm91dF90cmFpbl9kYXRhICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmcmVzcG9uc2VzICk7CisKKyAgICByZXR1cm4gKEN2U3RhdE1vZGVsKiljbm5fbW9kZWw7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2VHJhaW5DTk5ldHdvcmsoIEN2Q05OZXR3b3JrKiBuZXR3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiogaW1hZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiByZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGV0YWxvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGdyYWRfZXN0aW1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2l0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0X2l0ZXIgKQoreworICAgIEN2TWF0KiogWCAgICAgPSAwOworICAgIEN2TWF0KiogZEVfZFggPSAwOworICAgIGNvbnN0IGludCBuX2xheWVycyA9IG5ldHdvcmstPm5fbGF5ZXJzOworICAgIGludCBrOworCisgICAgQ1ZfRlVOQ05BTUUoImljdlRyYWluQ05OZXR3b3JrIik7CisgICAgX19CRUdJTl9fOworCisgICAgQ3ZDTk5MYXllciogZmlyc3RfbGF5ZXIgPSBuZXR3b3JrLT5sYXllcnM7CisgICAgY29uc3QgaW50IGltZ19oZWlnaHQgPSBmaXJzdF9sYXllci0+aW5wdXRfaGVpZ2h0OworICAgIGNvbnN0IGludCBpbWdfd2lkdGggID0gZmlyc3RfbGF5ZXItPmlucHV0X3dpZHRoOworICAgIGNvbnN0IGludCBpbWdfc2l6ZSAgID0gaW1nX3dpZHRoKmltZ19oZWlnaHQ7CisgICAgY29uc3QgaW50IG5faW1hZ2VzICAgPSByZXNwb25zZXMtPmNvbHM7CisgICAgQ3ZNYXQgaW1hZ2UgPSBjdk1hdCggMSwgaW1nX3NpemUsIENWXzMyRkMxICk7CisgICAgQ3ZDTk5MYXllciogbGF5ZXI7CisgICAgaW50IG47CisgICAgQ3ZSTkcgcm5nID0gY3ZSTkcoLTEpOworCisgICAgQ1ZfQ0FMTChYID0gKEN2TWF0KiopY3ZBbGxvYyggKG5fbGF5ZXJzKzEpKnNpemVvZihDdk1hdCopICkpOworICAgIENWX0NBTEwoZEVfZFggPSAoQ3ZNYXQqKiljdkFsbG9jKCAobl9sYXllcnMrMSkqc2l6ZW9mKEN2TWF0KikgKSk7CisgICAgbWVtc2V0KCBYLCAwLCAobl9sYXllcnMrMSkqc2l6ZW9mKEN2TWF0KikgKTsKKyAgICBtZW1zZXQoIGRFX2RYLCAwLCAobl9sYXllcnMrMSkqc2l6ZW9mKEN2TWF0KikgKTsKKworICAgIENWX0NBTEwoWFswXSA9IGN2Q3JlYXRlTWF0KCBpbWdfaGVpZ2h0KmltZ193aWR0aCwxLENWXzMyRkMxICkpOworICAgIENWX0NBTEwoZEVfZFhbMF0gPSBjdkNyZWF0ZU1hdCggMSwgWFswXS0+cm93cywgQ1ZfMzJGQzEgKSk7CisgICAgZm9yKCBrID0gMCwgbGF5ZXIgPSBmaXJzdF9sYXllcjsgayA8IG5fbGF5ZXJzOyBrKyssIGxheWVyID0gbGF5ZXItPm5leHRfbGF5ZXIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTChYW2srMV0gPSBjdkNyZWF0ZU1hdCggbGF5ZXItPm5fb3V0cHV0X3BsYW5lcypsYXllci0+b3V0cHV0X2hlaWdodCoKKyAgICAgICAgICAgIGxheWVyLT5vdXRwdXRfd2lkdGgsIDEsIENWXzMyRkMxICkpOworICAgICAgICBDVl9DQUxMKGRFX2RYW2srMV0gPSBjdkNyZWF0ZU1hdCggMSwgWFtrKzFdLT5yb3dzLCBDVl8zMkZDMSApKTsKKyAgICB9CisKKyAgICBmb3IoIG4gPSAxOyBuIDw9IG1heF9pdGVyOyBuKysgKQorICAgIHsKKyAgICAgICAgZmxvYXQgbG9zcywgbWF4X2xvc3MgPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHdvcnN0X2ltZ19pZHggPSAtMTsKKyAgICAgICAgaW50KiByaWdodF9ldGFsX2lkeCA9IHJlc3BvbnNlcy0+ZGF0YS5pOworICAgICAgICBDdk1hdCBldGFsb247CisKKyAgICAgICAgLy8gRmluZCB0aGUgd29yc3QgaW1hZ2UgKHdoaWNoIHByb2R1Y2VzIHRoZSBncmVhdGVzdCBsb3NzKSBvciB1c2UgdGhlIHJhbmRvbSBpbWFnZQorICAgICAgICBpZiggZ3JhZF9lc3RpbV90eXBlID09IENWX0NOTl9HUkFEX0VTVElNX0JZX1dPUlNUX0lNRyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuX2ltYWdlczsgaSsrLCByaWdodF9ldGFsX2lkeCsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbWFnZS5kYXRhLmZsID0gKGZsb2F0KilpbWFnZXNbaV07CisgICAgICAgICAgICAgICAgY3ZUcmFuc3Bvc2UoICZpbWFnZSwgWFswXSApOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciggayA9IDAsIGxheWVyID0gZmlyc3RfbGF5ZXI7IGsgPCBuX2xheWVyczsgaysrLCBsYXllciA9IGxheWVyLT5uZXh0X2xheWVyICkKKyAgICAgICAgICAgICAgICAgICAgQ1ZfQ0FMTChsYXllci0+Zm9yd2FyZCggbGF5ZXIsIFhba10sIFhbaysxXSApKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBjdlRyYW5zcG9zZSggWFtuX2xheWVyc10sIGRFX2RYW25fbGF5ZXJzXSApOworICAgICAgICAgICAgICAgIGN2R2V0Um93KCBldGFsb25zLCAmZXRhbG9uLCAqcmlnaHRfZXRhbF9pZHggKTsKKyAgICAgICAgICAgICAgICBsb3NzID0gKGZsb2F0KWN2Tm9ybSggZEVfZFhbbl9sYXllcnNdLCAmZXRhbG9uICk7CisgICAgICAgICAgICAgICAgaWYoIGxvc3MgPiBtYXhfbG9zcyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtYXhfbG9zcyA9IGxvc3M7CisgICAgICAgICAgICAgICAgICAgIHdvcnN0X2ltZ19pZHggPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB3b3JzdF9pbWdfaWR4ID0gY3ZSYW5kSW50KCZybmcpICUgbl9pbWFnZXM7CisKKyAgICAgICAgLy8gVHJhaW4gbmV0d29yayBvbiB0aGUgd29yc3QgaW1hZ2UKKyAgICAgICAgLy8gMSkgQ29tcHV0ZSB0aGUgbmV0d29yayBvdXRwdXQgb24gdGhlIDxpbWFnZT4KKyAgICAgICAgaW1hZ2UuZGF0YS5mbCA9IChmbG9hdCopaW1hZ2VzW3dvcnN0X2ltZ19pZHhdOworICAgICAgICBDVl9DQUxMKGN2VHJhbnNwb3NlKCAmaW1hZ2UsIFhbMF0gKSk7CisKKyAgICAgICAgZm9yKCBrID0gMCwgbGF5ZXIgPSBmaXJzdF9sYXllcjsgayA8IG5fbGF5ZXJzIC0gMTsgaysrLCBsYXllciA9IGxheWVyLT5uZXh0X2xheWVyICkKKyAgICAgICAgICAgIENWX0NBTEwobGF5ZXItPmZvcndhcmQoIGxheWVyLCBYW2tdLCBYW2srMV0gKSk7CisgICAgICAgIENWX0NBTEwobGF5ZXItPmZvcndhcmQoIGxheWVyLCBYW2tdLCBYW2srMV0gKSk7CisKKyAgICAgICAgLy8gMikgQ29tcHV0ZSB0aGUgZ3JhZGllbnQKKyAgICAgICAgY3ZUcmFuc3Bvc2UoIFhbbl9sYXllcnNdLCBkRV9kWFtuX2xheWVyc10gKTsKKyAgICAgICAgY3ZHZXRSb3coIGV0YWxvbnMsICZldGFsb24sIHJlc3BvbnNlcy0+ZGF0YS5pW3dvcnN0X2ltZ19pZHhdICk7CisgICAgICAgIGN2U3ViKCBkRV9kWFtuX2xheWVyc10sICZldGFsb24sIGRFX2RYW25fbGF5ZXJzXSApOworCisgICAgICAgIC8vIDMpIFVwZGF0ZSB3ZWlnaHRzIGJ5IHRoZSBncmFkaWVudCBkZXNjZW50CisgICAgICAgIGZvciggayA9IG5fbGF5ZXJzOyBrID4gMDsgay0tLCBsYXllciA9IGxheWVyLT5wcmV2X2xheWVyICkKKyAgICAgICAgICAgIENWX0NBTEwobGF5ZXItPmJhY2t3YXJkKCBsYXllciwgbiArIHN0YXJ0X2l0ZXIsIFhbay0xXSwgZEVfZFhba10sIGRFX2RYW2stMV0gKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGZvciggayA9IDA7IGsgPD0gbl9sYXllcnM7IGsrKyApCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZYW2tdICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJmRFX2RYW2tdICk7CisgICAgfQorICAgIGN2RnJlZSggJlggKTsKKyAgICBjdkZyZWUoICZkRV9kWCApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBmbG9hdCBpY3ZDTk5Nb2RlbFByZWRpY3QoIGNvbnN0IEN2U3RhdE1vZGVsKiBtb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfaW1hZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogcHJvYnMgKQoreworICAgIEN2TWF0KiogWCAgICAgICA9IDA7CisgICAgZmxvYXQqIGltZ19kYXRhID0gMDsKKyAgICBpbnQgbl9sYXllcnMgPSAwOworICAgIGludCBiZXN0X2V0YWxfaWR4ID0gLTE7CisgICAgaW50IGs7CisKKyAgICBDVl9GVU5DTkFNRSgiaWN2Q05OTW9kZWxQcmVkaWN0Iik7CisgICAgX19CRUdJTl9fOworCisgICAgQ3ZDTk5TdGF0TW9kZWwqIGNubl9tb2RlbCA9IChDdkNOTlN0YXRNb2RlbCopbW9kZWw7CisgICAgQ3ZDTk5MYXllciogZmlyc3RfbGF5ZXIsICpsYXllciA9IDA7CisgICAgaW50IGltZ19oZWlnaHQsIGltZ193aWR0aCwgaW1nX3NpemU7CisgICAgaW50IG5jbGFzc2VzLCBpOworICAgIGZsb2F0IGxvc3MsIG1pbl9sb3NzID0gRkxUX01BWDsKKyAgICBmbG9hdCogcHJvYnNfZGF0YTsKKyAgICBDdk1hdCBldGFsb24sIGltYWdlOworCisgICAgaWYoICFDVl9JU19DTk4obW9kZWwpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbW9kZWwiICk7CisKKyAgICBuY2xhc3NlcyA9IGNubl9tb2RlbC0+Y2xzX2xhYmVscy0+Y29sczsKKyAgICBuX2xheWVycyA9IGNubl9tb2RlbC0+bmV0d29yay0+bl9sYXllcnM7CisgICAgZmlyc3RfbGF5ZXIgICA9IGNubl9tb2RlbC0+bmV0d29yay0+bGF5ZXJzOworICAgIGltZ19oZWlnaHQgPSBmaXJzdF9sYXllci0+aW5wdXRfaGVpZ2h0OworICAgIGltZ193aWR0aCAgPSBmaXJzdF9sYXllci0+aW5wdXRfd2lkdGg7CisgICAgaW1nX3NpemUgICA9IGltZ19oZWlnaHQqaW1nX3dpZHRoOworCisgICAgY3ZQcmVwYXJlUHJlZGljdERhdGEoIF9pbWFnZSwgaW1nX3NpemUsIDAsIG5jbGFzc2VzLCBwcm9icywgJmltZ19kYXRhICk7CisKKyAgICBDVl9DQUxMKFggPSAoQ3ZNYXQqKiljdkFsbG9jKCAobl9sYXllcnMrMSkqc2l6ZW9mKEN2TWF0KikgKSk7CisgICAgbWVtc2V0KCBYLCAwLCAobl9sYXllcnMrMSkqc2l6ZW9mKEN2TWF0KikgKTsKKworICAgIENWX0NBTEwoWFswXSA9IGN2Q3JlYXRlTWF0KCBpbWdfc2l6ZSwxLENWXzMyRkMxICkpOworICAgIGZvciggayA9IDAsIGxheWVyID0gZmlyc3RfbGF5ZXI7IGsgPCBuX2xheWVyczsgaysrLCBsYXllciA9IGxheWVyLT5uZXh0X2xheWVyICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoWFtrKzFdID0gY3ZDcmVhdGVNYXQoIGxheWVyLT5uX291dHB1dF9wbGFuZXMqbGF5ZXItPm91dHB1dF9oZWlnaHQqCisgICAgICAgICAgICBsYXllci0+b3V0cHV0X3dpZHRoLCAxLCBDVl8zMkZDMSApKTsKKyAgICB9CisKKyAgICBpbWFnZSA9IGN2TWF0KCAxLCBpbWdfc2l6ZSwgQ1ZfMzJGQzEsIGltZ19kYXRhICk7CisgICAgY3ZUcmFuc3Bvc2UoICZpbWFnZSwgWFswXSApOworICAgIGZvciggayA9IDAsIGxheWVyID0gZmlyc3RfbGF5ZXI7IGsgPCBuX2xheWVyczsgaysrLCBsYXllciA9IGxheWVyLT5uZXh0X2xheWVyICkKKyAgICAgICAgQ1ZfQ0FMTChsYXllci0+Zm9yd2FyZCggbGF5ZXIsIFhba10sIFhbaysxXSApKTsKKworICAgIHByb2JzX2RhdGEgPSBwcm9icyA/IHByb2JzLT5kYXRhLmZsIDogMDsKKyAgICBldGFsb24gPSBjdk1hdCggY25uX21vZGVsLT5ldGFsb25zLT5jb2xzLCAxLCBDVl8zMkZDMSwgY25uX21vZGVsLT5ldGFsb25zLT5kYXRhLmZsICk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKyssIGV0YWxvbi5kYXRhLmZsICs9IGNubl9tb2RlbC0+ZXRhbG9ucy0+Y29scyApCisgICAgeworICAgICAgICBsb3NzID0gKGZsb2F0KWN2Tm9ybSggWFtuX2xheWVyc10sICZldGFsb24gKTsKKyAgICAgICAgaWYoIGxvc3MgPCBtaW5fbG9zcyApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1pbl9sb3NzID0gbG9zczsKKyAgICAgICAgICAgIGJlc3RfZXRhbF9pZHggPSBpOworICAgICAgICB9CisgICAgICAgIGlmKCBwcm9icyApCisgICAgICAgICAgICAqcHJvYnNfZGF0YSsrID0gLWxvc3M7CisgICAgfQorCisgICAgaWYoIHByb2JzICkKKyAgICB7CisgICAgICAgIGN2RXhwKCBwcm9icywgcHJvYnMgKTsKKyAgICAgICAgQ3ZTY2FsYXIgc3VtID0gY3ZTdW0oIHByb2JzICk7CisgICAgICAgIGN2Q29udmVydFNjYWxlKCBwcm9icywgcHJvYnMsIDEuL3N1bS52YWxbMF0gKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgZm9yKCBrID0gMDsgayA8PSBuX2xheWVyczsgaysrICkKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmWFtrXSApOworICAgIGN2RnJlZSggJlggKTsKKyAgICBpZiggaW1nX2RhdGEgIT0gX2ltYWdlLT5kYXRhLmZsICkKKyAgICAgICAgY3ZGcmVlKCAmaW1nX2RhdGEgKTsKKworICAgIHJldHVybiAoKGZsb2F0KSAoKEN2Q05OU3RhdE1vZGVsKiltb2RlbCktPmNsc19sYWJlbHMtPmRhdGEuaVtiZXN0X2V0YWxfaWR4XSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OTW9kZWxVcGRhdGUoCisgICAgICAgIEN2U3RhdE1vZGVsKiBfY25uX21vZGVsLCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGludCB0ZmxhZywKKyAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2U3RhdE1vZGVsUGFyYW1zKiBfcGFyYW1zLAorICAgICAgICBjb25zdCBDdk1hdCosIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwKKyAgICAgICAgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCogKQoreworICAgIGNvbnN0IGZsb2F0Kiogb3V0X3RyYWluX2RhdGEgPSAwOworICAgIEN2TWF0KiByZXNwb25zZXMgICAgICAgICAgICAgPSAwOworICAgIEN2TWF0KiBjbHNfbGFiZWxzICAgICAgICAgICAgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImljdkNOTk1vZGVsVXBkYXRlIik7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5faW1hZ2VzLCBpbWdfc2l6ZSwgaTsKKyAgICBDdkNOTlN0YXRNb2RlbFBhcmFtcyogcGFyYW1zID0gKEN2Q05OU3RhdE1vZGVsUGFyYW1zKilfcGFyYW1zOworICAgIEN2Q05OU3RhdE1vZGVsKiBjbm5fbW9kZWwgPSAoQ3ZDTk5TdGF0TW9kZWwqKV9jbm5fbW9kZWw7CisKKyAgICBpZiggIUNWX0lTX0NOTihjbm5fbW9kZWwpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbW9kZWwiICk7CisKKyAgICBDVl9DQUxMKGN2UHJlcGFyZVRyYWluRGF0YSggImN2VHJhaW5DTk5DbGFzc2lmaWVyIiwKKyAgICAgICAgX3RyYWluX2RhdGEsIHRmbGFnLCBfcmVzcG9uc2VzLCBDVl9WQVJfQ0FURUdPUklDQUwsCisgICAgICAgIDAsIF9zYW1wbGVfaWR4LCBmYWxzZSwgJm91dF90cmFpbl9kYXRhLAorICAgICAgICAmbl9pbWFnZXMsICZpbWdfc2l6ZSwgJmltZ19zaXplLCAmcmVzcG9uc2VzLAorICAgICAgICAmY2xzX2xhYmVscywgMCwgMCApKTsKKworICAgIElDVl9DSEVDS19DTk5fTU9ERUxfUEFSQU1TKHBhcmFtcyk7CisKKyAgICAvLyBOdW1iZXIgb2YgY2xhc3NlcyBtdXN0IGJlIHRoZSBzYW1lIGFzIHdoZW4gY2xhc3NpZmllcnMgd2FzIGNyZWF0ZWQKKyAgICBpZiggIUNWX0FSRV9TSVpFU19FUShjbHNfbGFiZWxzLCBjbm5fbW9kZWwtPmNsc19sYWJlbHMpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk51bWJlciBvZiBjbGFzc2VzIG11c3QgYmUgbGVmdCB1bmNoYW5nZWQiICk7CisgICAgZm9yKCBpID0gMDsgaSA8IGNsc19sYWJlbHMtPmNvbHM7IGkrKyApCisgICAgeworICAgICAgICBpZiggY2xzX2xhYmVscy0+ZGF0YS5pW2ldICE9IGNubl9tb2RlbC0+Y2xzX2xhYmVscy0+ZGF0YS5pW2ldICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJOdW1iZXIgb2YgY2xhc3NlcyBtdXN0IGJlIGxlZnQgdW5jaGFuZ2VkIiApOworICAgIH0KKworICAgIENWX0NBTEwoIGljdlRyYWluQ05OZXR3b3JrKCBjbm5fbW9kZWwtPm5ldHdvcmssIG91dF90cmFpbl9kYXRhLCByZXNwb25zZXMsCisgICAgICAgIGNubl9tb2RlbC0+ZXRhbG9ucywgcGFyYW1zLT5ncmFkX2VzdGltX3R5cGUsIHBhcmFtcy0+bWF4X2l0ZXIsCisgICAgICAgIHBhcmFtcy0+c3RhcnRfaXRlciApKTsKKworICAgIF9fRU5EX187CisKKyAgICBjdkZyZWUoICZvdXRfdHJhaW5fZGF0YSApOworICAgIGN2UmVsZWFzZU1hdCggJnJlc3BvbnNlcyApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGljdkNOTk1vZGVsUmVsZWFzZSggQ3ZTdGF0TW9kZWwqKiBjbm5fbW9kZWwgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZDTk5Nb2RlbFJlbGVhc2UiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkNOTlN0YXRNb2RlbCogY25uOworICAgIGlmKCAhY25uX21vZGVsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIGRvdWJsZSBwb2ludGVyIiApOworCisgICAgY25uID0gKihDdkNOTlN0YXRNb2RlbCoqKWNubl9tb2RlbDsKKworICAgIGN2UmVsZWFzZU1hdCggJmNubi0+Y2xzX2xhYmVscyApOworICAgIGN2UmVsZWFzZU1hdCggJmNubi0+ZXRhbG9ucyApOworICAgIGNubi0+bmV0d29yay0+cmVsZWFzZSggJmNubi0+bmV0d29yayApOworCisgICAgY3ZGcmVlKCAmY25uICk7CisKKyAgICBfX0VORF9fOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmsgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK01MX0lNUEwgQ3ZDTk5ldHdvcmsqIGN2Q3JlYXRlQ05OZXR3b3JrKCBDdkNOTkxheWVyKiBmaXJzdF9sYXllciApCit7CisgICAgQ3ZDTk5ldHdvcmsqIG5ldHdvcmsgPSAwOyAgICAKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggImN2Q3JlYXRlQ05OZXR3b3JrIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhSUNWX0lTX0NOTl9MQVlFUihmaXJzdF9sYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIENWX0NBTEwobmV0d29yayA9IChDdkNOTmV0d29yayopY3ZBbGxvYyggc2l6ZW9mKEN2Q05OZXR3b3JrKSApKTsKKyAgICBtZW1zZXQoIG5ldHdvcmssIDAsIHNpemVvZihDdkNOTmV0d29yaykgKTsKKworICAgIG5ldHdvcmstPmxheWVycyAgICA9IGZpcnN0X2xheWVyOworICAgIG5ldHdvcmstPm5fbGF5ZXJzICA9IDE7CisgICAgbmV0d29yay0+cmVsZWFzZSAgID0gaWN2Q05OZXR3b3JrUmVsZWFzZTsKKyAgICBuZXR3b3JrLT5hZGRfbGF5ZXIgPSBpY3ZDTk5ldHdvcmtBZGRMYXllcjsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgJiYgbmV0d29yayApCisgICAgICAgIGN2RnJlZSggJm5ldHdvcmsgKTsKKworICAgIHJldHVybiBuZXR3b3JrOworCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OZXR3b3JrQWRkTGF5ZXIoIEN2Q05OZXR3b3JrKiBuZXR3b3JrLCBDdkNOTkxheWVyKiBsYXllciApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDTk5ldHdvcmtBZGRMYXllciIgKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkNOTkxheWVyKiBwcmV2X2xheWVyOworCisgICAgaWYoIG5ldHdvcmsgPT0gTlVMTCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCA8bmV0d29yaz4gcG9pbnRlciIgKTsKKworICAgIHByZXZfbGF5ZXIgPSBuZXR3b3JrLT5sYXllcnM7CisgICAgd2hpbGUoIHByZXZfbGF5ZXItPm5leHRfbGF5ZXIgKQorICAgICAgICBwcmV2X2xheWVyID0gcHJldl9sYXllci0+bmV4dF9sYXllcjsKKworICAgIGlmKCBJQ1ZfSVNfQ05OX0ZVTExDT05ORUNUX0xBWUVSKGxheWVyKSApCisgICAgeworICAgICAgICBpZiggbGF5ZXItPm5faW5wdXRfcGxhbmVzICE9IHByZXZfbGF5ZXItPm91dHB1dF93aWR0aCpwcmV2X2xheWVyLT5vdXRwdXRfaGVpZ2h0KgorICAgICAgICAgICAgcHJldl9sYXllci0+bl9vdXRwdXRfcGxhbmVzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbm1hdGNoZWQgc2l6ZSBvZiB0aGUgbmV3IGxheWVyIiApOworICAgICAgICBpZiggbGF5ZXItPmlucHV0X2hlaWdodCAhPSAxIHx8IGxheWVyLT5vdXRwdXRfaGVpZ2h0ICE9IDEgfHwKKyAgICAgICAgICAgIGxheWVyLT5pbnB1dF93aWR0aCAhPSAxICB8fCBsYXllci0+b3V0cHV0X3dpZHRoICE9IDEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgc2l6ZSBvZiB0aGUgbmV3IGxheWVyIiApOworICAgIH0KKyAgICBlbHNlIGlmKCBJQ1ZfSVNfQ05OX0NPTlZPTFVUSU9OX0xBWUVSKGxheWVyKSB8fCBJQ1ZfSVNfQ05OX1NVQlNBTVBMSU5HX0xBWUVSKGxheWVyKSApCisgICAgeworICAgICAgICBpZiggcHJldl9sYXllci0+bl9vdXRwdXRfcGxhbmVzICE9IGxheWVyLT5uX2lucHV0X3BsYW5lcyB8fAorICAgICAgICBwcmV2X2xheWVyLT5vdXRwdXRfaGVpZ2h0ICAgIT0gbGF5ZXItPmlucHV0X2hlaWdodCB8fAorICAgICAgICBwcmV2X2xheWVyLT5vdXRwdXRfd2lkdGggICAgIT0gbGF5ZXItPmlucHV0X3dpZHRoICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVubWF0Y2hlZCBzaXplIG9mIHRoZSBuZXcgbGF5ZXIiICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbGF5ZXIiICk7CisKKyAgICBsYXllci0+cHJldl9sYXllciA9IHByZXZfbGF5ZXI7CisgICAgcHJldl9sYXllci0+bmV4dF9sYXllciA9IGxheWVyOworICAgIG5ldHdvcmstPm5fbGF5ZXJzKys7CisKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGljdkNOTmV0d29ya1JlbGVhc2UoIEN2Q05OZXR3b3JrKiogbmV0d29ya19wcHRyICkKK3sKKyAgICBDVl9GVU5DTkFNRSggImljdlJlbGVhc2VDTk5ldHdvcmsiICk7CisgICAgX19CRUdJTl9fOworCisgICAgQ3ZDTk5ldHdvcmsqIG5ldHdvcmsgPSAwOworICAgIEN2Q05OTGF5ZXIqIGxheWVyID0gMCwgKm5leHRfbGF5ZXIgPSAwOworICAgIGludCBrOworCisgICAgaWYoIG5ldHdvcmtfcHB0ciA9PSBOVUxMICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIk51bGwgZG91YmxlIHBvaW50ZXIiICk7CisgICAgaWYoICpuZXR3b3JrX3BwdHIgPT0gTlVMTCApCisgICAgICAgIHJldHVybjsKKworICAgIG5ldHdvcmsgPSAqbmV0d29ya19wcHRyOworICAgIGxheWVyID0gbmV0d29yay0+bGF5ZXJzOworICAgIGlmKCBsYXllciA9PSBOVUxMICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkNOTiBpcyBlbXB0eSAoZG9lcyBub3QgY29udGFpbiBhbnkgbGF5ZXIpIiApOworCisgICAgLy8gayBpcyB0aGUgbnVtYmVyIG9mIHRoZSBsYXllciB0byBiZSBkZWxldGVkCisgICAgZm9yKCBrID0gMDsgayA8IG5ldHdvcmstPm5fbGF5ZXJzICYmIGxheWVyOyBrKysgKQorICAgIHsKKyAgICAgICAgbmV4dF9sYXllciA9IGxheWVyLT5uZXh0X2xheWVyOworICAgICAgICBsYXllci0+cmVsZWFzZSggJmxheWVyICk7CisgICAgICAgIGxheWVyID0gbmV4dF9sYXllcjsKKyAgICB9CisKKyAgICBpZiggayAhPSBuZXR3b3JrLT5uX2xheWVycyB8fCBsYXllcikKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbmV0d29yayIgKTsKKworICAgIGN2RnJlZSggJm5ldHdvcmsgKTsKKworICAgIF9fRU5EX187Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXllciBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDdkNOTkxheWVyKiBpY3ZDcmVhdGVDTk5MYXllciggaW50IGxheWVyX3R5cGUsIGludCBoZWFkZXJfc2l6ZSwKKyAgICBpbnQgbl9pbnB1dF9wbGFuZXMsIGludCBpbnB1dF9oZWlnaHQsIGludCBpbnB1dF93aWR0aCwKKyAgICBpbnQgbl9vdXRwdXRfcGxhbmVzLCBpbnQgb3V0cHV0X2hlaWdodCwgaW50IG91dHB1dF93aWR0aCwKKyAgICBmbG9hdCBpbml0X2xlYXJuX3JhdGUsIGludCBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUsCisgICAgQ3ZDTk5MYXllclJlbGVhc2UgcmVsZWFzZSwgQ3ZDTk5MYXllckZvcndhcmQgZm9yd2FyZCwgQ3ZDTk5MYXllckJhY2t3YXJkIGJhY2t3YXJkICkKK3sKKyAgICBDdkNOTkxheWVyKiBsYXllciA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiaWN2Q3JlYXRlQ05OTGF5ZXIiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDVl9BU1NFUlQoIHJlbGVhc2UgJiYgZm9yd2FyZCAmJiBiYWNrd2FyZCApCisgICAgQ1ZfQVNTRVJUKCBoZWFkZXJfc2l6ZSA+PSBzaXplb2YoQ3ZDTk5MYXllcikgKQorCisgICAgaWYoIG5faW5wdXRfcGxhbmVzIDwgMSB8fCBuX291dHB1dF9wbGFuZXMgPCAxIHx8CisgICAgICAgIGlucHV0X2hlaWdodCAgIDwgMSB8fCBpbnB1dF93aWR0aCA8IDEgfHwKKyAgICAgICAgb3V0cHV0X2hlaWdodCAgPCAxIHx8IG91dHB1dF93aWR0aCA8IDEgfHwKKyAgICAgICAgaW5wdXRfaGVpZ2h0IDwgb3V0cHV0X2hlaWdodCB8fAorICAgICAgICBpbnB1dF93aWR0aCAgPCBvdXRwdXRfd2lkdGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5jb3JyZWN0IGlucHV0IG9yIG91dHB1dCBwYXJhbWV0ZXJzIiApOworICAgIGlmKCBpbml0X2xlYXJuX3JhdGUgPCBGTFRfRVBTSUxPTiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbml0aWFsIGxlYXJuaW5nIHJhdGUgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKyAgICBpZiggbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlICE9IENWX0NOTl9MRUFSTl9SQVRFX0RFQ1JFQVNFX0hZUEVSQk9MSUNBTExZICYmCisgICAgICAgIGxlYXJuX3JhdGVfZGVjcmVhc2VfdHlwZSAhPSBDVl9DTk5fTEVBUk5fUkFURV9ERUNSRUFTRV9TUVJUX0lOViAmJgorICAgICAgICBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUgIT0gQ1ZfQ05OX0xFQVJOX1JBVEVfREVDUkVBU0VfTE9HX0lOViApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIHR5cGUgb2YgbGVhcm5pbmcgcmF0ZSBkeW5hbWljcyIgKTsKKworICAgIENWX0NBTEwobGF5ZXIgPSAoQ3ZDTk5MYXllciopY3ZBbGxvYyggaGVhZGVyX3NpemUgKSk7CisgICAgbWVtc2V0KCBsYXllciwgMCwgaGVhZGVyX3NpemUgKTsKKworICAgIGxheWVyLT5mbGFncyA9IElDVl9DTk5fTEFZRVJ8bGF5ZXJfdHlwZTsKKyAgICBDVl9BU1NFUlQoIElDVl9JU19DTk5fTEFZRVIobGF5ZXIpICkKKworICAgIGxheWVyLT5uX2lucHV0X3BsYW5lcyA9IG5faW5wdXRfcGxhbmVzOworICAgIGxheWVyLT5pbnB1dF9oZWlnaHQgICA9IGlucHV0X2hlaWdodDsKKyAgICBsYXllci0+aW5wdXRfd2lkdGggICAgPSBpbnB1dF93aWR0aDsKKworICAgIGxheWVyLT5uX291dHB1dF9wbGFuZXMgPSBuX291dHB1dF9wbGFuZXM7CisgICAgbGF5ZXItPm91dHB1dF9oZWlnaHQgICA9IG91dHB1dF9oZWlnaHQ7CisgICAgbGF5ZXItPm91dHB1dF93aWR0aCAgICA9IG91dHB1dF93aWR0aDsKKworICAgIGxheWVyLT5pbml0X2xlYXJuX3JhdGUgPSBpbml0X2xlYXJuX3JhdGU7CisgICAgbGF5ZXItPmxlYXJuX3JhdGVfZGVjcmVhc2VfdHlwZSA9IGxlYXJuX3JhdGVfZGVjcmVhc2VfdHlwZTsKKworICAgIGxheWVyLT5yZWxlYXNlICA9IHJlbGVhc2U7CisgICAgbGF5ZXItPmZvcndhcmQgID0gZm9yd2FyZDsKKyAgICBsYXllci0+YmFja3dhcmQgPSBiYWNrd2FyZDsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgJiYgbGF5ZXIpCisgICAgICAgIGN2RnJlZSggJmxheWVyICk7CisKKyAgICByZXR1cm4gbGF5ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTUxfSU1QTCBDdkNOTkxheWVyKiBjdkNyZWF0ZUNOTkNvbnZvbHV0aW9uTGF5ZXIoCisgICAgaW50IG5faW5wdXRfcGxhbmVzLCBpbnQgaW5wdXRfaGVpZ2h0LCBpbnQgaW5wdXRfd2lkdGgsCisgICAgaW50IG5fb3V0cHV0X3BsYW5lcywgaW50IEssCisgICAgZmxvYXQgaW5pdF9sZWFybl9yYXRlLCBpbnQgbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlLAorICAgIEN2TWF0KiBjb25uZWN0X21hc2ssIEN2TWF0KiB3ZWlnaHRzICkKKworeworICAgIEN2Q05OQ29udm9sdXRpb25MYXllciogbGF5ZXIgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImN2Q3JlYXRlQ05OQ29udm9sdXRpb25MYXllciIpOworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IGludCBvdXRwdXRfaGVpZ2h0ID0gaW5wdXRfaGVpZ2h0IC0gSyArIDE7CisgICAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IGlucHV0X3dpZHRoIC0gSyArIDE7CisKKyAgICBpZiggSyA8IDEgfHwgaW5pdF9sZWFybl9yYXRlIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5jb3JyZWN0IHBhcmFtZXRlcnMiICk7CisKKyAgICBDVl9DQUxMKGxheWVyID0gKEN2Q05OQ29udm9sdXRpb25MYXllciopaWN2Q3JlYXRlQ05OTGF5ZXIoIElDVl9DTk5fQ09OVk9MVVRJT05fTEFZRVIsCisgICAgICAgIHNpemVvZihDdkNOTkNvbnZvbHV0aW9uTGF5ZXIpLCBuX2lucHV0X3BsYW5lcywgaW5wdXRfaGVpZ2h0LCBpbnB1dF93aWR0aCwKKyAgICAgICAgbl9vdXRwdXRfcGxhbmVzLCBvdXRwdXRfaGVpZ2h0LCBvdXRwdXRfd2lkdGgsCisgICAgICAgIGluaXRfbGVhcm5fcmF0ZSwgbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlLAorICAgICAgICBpY3ZDTk5Db252b2x1dGlvblJlbGVhc2UsIGljdkNOTkNvbnZvbHV0aW9uRm9yd2FyZCwgaWN2Q05OQ29udm9sdXRpb25CYWNrd2FyZCApKTsKKworICAgIGxheWVyLT5LID0gSzsKKyAgICBDVl9DQUxMKGxheWVyLT53ZWlnaHRzID0gY3ZDcmVhdGVNYXQoIG5fb3V0cHV0X3BsYW5lcywgSypLKzEsIENWXzMyRkMxICkpOworICAgIENWX0NBTEwobGF5ZXItPmNvbm5lY3RfbWFzayA9IGN2Q3JlYXRlTWF0KCBuX291dHB1dF9wbGFuZXMsIG5faW5wdXRfcGxhbmVzLCBDVl84VUMxKSk7CisKKyAgICBpZiggd2VpZ2h0cyApCisgICAgeworICAgICAgICBpZiggIUlDVl9JU19NQVRfT0ZfVFlQRSggd2VpZ2h0cywgQ1ZfMzJGQzEgKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIlR5cGUgb2YgaW5pdGlhbCB3ZWlnaHRzIG1hdHJpeCBtdXN0IGJlIENWXzMyRkMxIiApOworICAgICAgICBpZiggIUNWX0FSRV9TSVpFU19FUSggd2VpZ2h0cywgbGF5ZXItPndlaWdodHMgKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkludmFsaWQgc2l6ZSBvZiBpbml0aWFsIHdlaWdodHMgbWF0cml4IiApOworICAgICAgICBDVl9DQUxMKGN2Q29weSggd2VpZ2h0cywgbGF5ZXItPndlaWdodHMgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIEN2Uk5HIHJuZyA9IGN2Uk5HKCAweEZGRkZGRkZGICk7CisgICAgICAgIGN2UmFuZEFyciggJnJuZywgbGF5ZXItPndlaWdodHMsIENWX1JBTkRfVU5JLCBjdlJlYWxTY2FsYXIoLTEpLCBjdlJlYWxTY2FsYXIoMSkgKTsKKyAgICB9CisgCisgICAgaWYoIGNvbm5lY3RfbWFzayApCisgICAgeworICAgICAgICBpZiggIUlDVl9JU19NQVRfT0ZfVFlQRSggY29ubmVjdF9tYXNrLCBDVl84VUMxICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUeXBlIG9mIGNvbm5lY3Rpb24gbWF0cml4IG11c3QgYmUgQ1ZfMzJGQzEiICk7CisgICAgICAgIGlmKCAhQ1ZfQVJFX1NJWkVTX0VRKCBjb25uZWN0X21hc2ssIGxheWVyLT5jb25uZWN0X21hc2sgKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkU2l6ZSwgIkludmFsaWQgc2l6ZSBvZiBjb25uZWN0aW9uIG1hdHJpeCIgKTsKKyAgICAgICAgQ1ZfQ0FMTChjdkNvcHkoIGNvbm5lY3RfbWFzaywgbGF5ZXItPmNvbm5lY3RfbWFzayApKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKGN2U2V0KCBsYXllci0+Y29ubmVjdF9tYXNrLCBjdlJlYWxTY2FsYXIoMSkgKSk7CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICYmIGxheWVyICkKKyAgICB7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJmxheWVyLT53ZWlnaHRzICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJmxheWVyLT5jb25uZWN0X21hc2sgKTsKKyAgICAgICAgY3ZGcmVlKCAmbGF5ZXIgKTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIChDdkNOTkxheWVyKilsYXllcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNTF9JTVBMIEN2Q05OTGF5ZXIqIGN2Q3JlYXRlQ05OU3ViU2FtcGxpbmdMYXllcigKKyAgICBpbnQgbl9pbnB1dF9wbGFuZXMsIGludCBpbnB1dF9oZWlnaHQsIGludCBpbnB1dF93aWR0aCwKKyAgICBpbnQgc3ViX3NhbXBfc2NhbGUsIGZsb2F0IGEsIGZsb2F0IHMsCisgICAgZmxvYXQgaW5pdF9sZWFybl9yYXRlLCBpbnQgbGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlLCBDdk1hdCogd2VpZ2h0cyApCisKK3sKKyAgICBDdkNOTlN1YlNhbXBsaW5nTGF5ZXIqIGxheWVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdkNyZWF0ZUNOTlN1YlNhbXBsaW5nTGF5ZXIiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBpbnQgb3V0cHV0X2hlaWdodCAgID0gaW5wdXRfaGVpZ2h0L3N1Yl9zYW1wX3NjYWxlOworICAgIGNvbnN0IGludCBvdXRwdXRfd2lkdGggICAgPSBpbnB1dF93aWR0aC9zdWJfc2FtcF9zY2FsZTsKKyAgICBjb25zdCBpbnQgbl9vdXRwdXRfcGxhbmVzID0gbl9pbnB1dF9wbGFuZXM7CisKKyAgICBpZiggc3ViX3NhbXBfc2NhbGUgPCAxIHx8IGEgPD0gMCB8fCBzIDw9IDApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbmNvcnJlY3QgcGFyYW1ldGVycyIgKTsKKworICAgIENWX0NBTEwobGF5ZXIgPSAoQ3ZDTk5TdWJTYW1wbGluZ0xheWVyKilpY3ZDcmVhdGVDTk5MYXllciggSUNWX0NOTl9TVUJTQU1QTElOR19MQVlFUiwKKyAgICAgICAgc2l6ZW9mKEN2Q05OU3ViU2FtcGxpbmdMYXllciksIG5faW5wdXRfcGxhbmVzLCBpbnB1dF9oZWlnaHQsIGlucHV0X3dpZHRoLAorICAgICAgICBuX291dHB1dF9wbGFuZXMsIG91dHB1dF9oZWlnaHQsIG91dHB1dF93aWR0aCwKKyAgICAgICAgaW5pdF9sZWFybl9yYXRlLCBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUsCisgICAgICAgIGljdkNOTlN1YlNhbXBsaW5nUmVsZWFzZSwgaWN2Q05OU3ViU2FtcGxpbmdGb3J3YXJkLCBpY3ZDTk5TdWJTYW1wbGluZ0JhY2t3YXJkICkpOworCisgICAgbGF5ZXItPnN1Yl9zYW1wX3NjYWxlICA9IHN1Yl9zYW1wX3NjYWxlOworICAgIGxheWVyLT5hICAgICAgICAgICAgICAgPSBhOworICAgIGxheWVyLT5zICAgICAgICAgICAgICAgPSBzOworCisgICAgQ1ZfQ0FMTChsYXllci0+c3VtWCA9CisgICAgICAgIGN2Q3JlYXRlTWF0KCBuX291dHB1dF9wbGFuZXMqb3V0cHV0X3dpZHRoKm91dHB1dF9oZWlnaHQsIDEsIENWXzMyRkMxICkpOworICAgIENWX0NBTEwobGF5ZXItPmV4cDJzc3VtV1ggPQorICAgICAgICBjdkNyZWF0ZU1hdCggbl9vdXRwdXRfcGxhbmVzKm91dHB1dF93aWR0aCpvdXRwdXRfaGVpZ2h0LCAxLCBDVl8zMkZDMSApKTsKKworICAgIGN2WmVybyggbGF5ZXItPnN1bVggKTsKKyAgICBjdlplcm8oIGxheWVyLT5leHAyc3N1bVdYICk7CisKKyAgICBDVl9DQUxMKGxheWVyLT53ZWlnaHRzID0gY3ZDcmVhdGVNYXQoIG5fb3V0cHV0X3BsYW5lcywgMiwgQ1ZfMzJGQzEgKSk7CisgICAgaWYoIHdlaWdodHMgKQorICAgIHsKKyAgICAgICAgaWYoICFJQ1ZfSVNfTUFUX09GX1RZUEUoIHdlaWdodHMsIENWXzMyRkMxICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUeXBlIG9mIGluaXRpYWwgd2VpZ2h0cyBtYXRyaXggbXVzdCBiZSBDVl8zMkZDMSIgKTsKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHdlaWdodHMsIGxheWVyLT53ZWlnaHRzICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJJbnZhbGlkIHNpemUgb2YgaW5pdGlhbCB3ZWlnaHRzIG1hdHJpeCIgKTsKKyAgICAgICAgQ1ZfQ0FMTChjdkNvcHkoIHdlaWdodHMsIGxheWVyLT53ZWlnaHRzICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlJORyBybmcgPSBjdlJORyggMHhGRkZGRkZGRiApOworICAgICAgICBjdlJhbmRBcnIoICZybmcsIGxheWVyLT53ZWlnaHRzLCBDVl9SQU5EX1VOSSwgY3ZSZWFsU2NhbGFyKC0xKSwgY3ZSZWFsU2NhbGFyKDEpICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCAmJiBsYXllciApCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+ZXhwMnNzdW1XWCApOworICAgICAgICBjdkZyZWUoICZsYXllciApOworICAgIH0KKworICAgIHJldHVybiAoQ3ZDTk5MYXllciopbGF5ZXI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTUxfSU1QTCBDdkNOTkxheWVyKiBjdkNyZWF0ZUNOTkZ1bGxDb25uZWN0TGF5ZXIoIAorICAgIGludCBuX2lucHV0cywgaW50IG5fb3V0cHV0cywgZmxvYXQgYSwgZmxvYXQgcywKKyAgICBmbG9hdCBpbml0X2xlYXJuX3JhdGUsIGludCBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUsIEN2TWF0KiB3ZWlnaHRzICkKK3sKKyAgICBDdkNOTkZ1bGxDb25uZWN0TGF5ZXIqIGxheWVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdkNyZWF0ZUNOTkZ1bGxDb25uZWN0TGF5ZXIiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggYSA8PSAwIHx8IHMgPD0gMCB8fCBpbml0X2xlYXJuX3JhdGUgPD0gMCkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkluY29ycmVjdCBwYXJhbWV0ZXJzIiApOworCisgICAgQ1ZfQ0FMTChsYXllciA9IChDdkNOTkZ1bGxDb25uZWN0TGF5ZXIqKWljdkNyZWF0ZUNOTkxheWVyKCBJQ1ZfQ05OX0ZVTExDT05ORUNUX0xBWUVSLAorICAgICAgICBzaXplb2YoQ3ZDTk5GdWxsQ29ubmVjdExheWVyKSwgbl9pbnB1dHMsIDEsIDEsIG5fb3V0cHV0cywgMSwgMSwKKyAgICAgICAgaW5pdF9sZWFybl9yYXRlLCBsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUsCisgICAgICAgIGljdkNOTkZ1bGxDb25uZWN0UmVsZWFzZSwgaWN2Q05ORnVsbENvbm5lY3RGb3J3YXJkLCBpY3ZDTk5GdWxsQ29ubmVjdEJhY2t3YXJkICkpOworCisgICAgbGF5ZXItPmEgPSBhOworICAgIGxheWVyLT5zID0gczsKKworICAgIENWX0NBTEwobGF5ZXItPmV4cDJzc3VtV1ggPSBjdkNyZWF0ZU1hdCggbl9vdXRwdXRzLCAxLCBDVl8zMkZDMSApKTsKKyAgICBjdlplcm8oIGxheWVyLT5leHAyc3N1bVdYICk7CisKKyAgICBDVl9DQUxMKGxheWVyLT53ZWlnaHRzID0gY3ZDcmVhdGVNYXQoIG5fb3V0cHV0cywgbl9pbnB1dHMrMSwgQ1ZfMzJGQzEgKSk7CisgICAgaWYoIHdlaWdodHMgKQorICAgIHsKKyAgICAgICAgaWYoICFJQ1ZfSVNfTUFUX09GX1RZUEUoIHdlaWdodHMsIENWXzMyRkMxICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJUeXBlIG9mIGluaXRpYWwgd2VpZ2h0cyBtYXRyaXggbXVzdCBiZSBDVl8zMkZDMSIgKTsKKyAgICAgICAgaWYoICFDVl9BUkVfU0laRVNfRVEoIHdlaWdodHMsIGxheWVyLT53ZWlnaHRzICkgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsICJJbnZhbGlkIHNpemUgb2YgaW5pdGlhbCB3ZWlnaHRzIG1hdHJpeCIgKTsKKyAgICAgICAgQ1ZfQ0FMTChjdkNvcHkoIHdlaWdodHMsIGxheWVyLT53ZWlnaHRzICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdlJORyBybmcgPSBjdlJORyggMHhGRkZGRkZGRiApOworICAgICAgICBjdlJhbmRBcnIoICZybmcsIGxheWVyLT53ZWlnaHRzLCBDVl9SQU5EX1VOSSwgY3ZSZWFsU2NhbGFyKC0xKSwgY3ZSZWFsU2NhbGFyKDEpICk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCAmJiBsYXllciApCisgICAgeworICAgICAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+ZXhwMnNzdW1XWCApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+d2VpZ2h0cyApOworICAgICAgICBjdkZyZWUoICZsYXllciApOworICAgIH0KKworICAgIHJldHVybiAoQ3ZDTk5MYXllciopbGF5ZXI7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXIgRk9SV0FSRCBmdW5jdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OQ29udm9sdXRpb25Gb3J3YXJkKCBDdkNOTkxheWVyKiBfbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogWSApCit7CisgICAgQ1ZfRlVOQ05BTUUoImljdkNOTkNvbnZvbHV0aW9uRm9yd2FyZCIpOworCisgICAgaWYoICFJQ1ZfSVNfQ05OX0NPTlZPTFVUSU9OX0xBWUVSKF9sYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIHtfX0JFR0lOX187CisKKyAgICBjb25zdCBDdkNOTkNvbnZvbHV0aW9uTGF5ZXIqIGxheWVyID0gKEN2Q05OQ29udm9sdXRpb25MYXllciopIF9sYXllcjsKKworICAgIGNvbnN0IGludCBLID0gbGF5ZXItPks7CisgICAgY29uc3QgaW50IG5fd2VpZ2h0c19mb3JfWXBsYW5lID0gSypLICsgMTsKKworICAgIGNvbnN0IGludCBuWHBsYW5lcyA9IGxheWVyLT5uX2lucHV0X3BsYW5lczsKKyAgICBjb25zdCBpbnQgWGhlaWdodCAgPSBsYXllci0+aW5wdXRfaGVpZ2h0OworICAgIGNvbnN0IGludCBYd2lkdGggICA9IGxheWVyLT5pbnB1dF93aWR0aCA7CisgICAgY29uc3QgaW50IFhzaXplICAgID0gWHdpZHRoKlhoZWlnaHQ7CisKKyAgICBjb25zdCBpbnQgbllwbGFuZXMgPSBsYXllci0+bl9vdXRwdXRfcGxhbmVzOworICAgIGNvbnN0IGludCBZaGVpZ2h0ICA9IGxheWVyLT5vdXRwdXRfaGVpZ2h0OworICAgIGNvbnN0IGludCBZd2lkdGggICA9IGxheWVyLT5vdXRwdXRfd2lkdGg7CisgICAgY29uc3QgaW50IFlzaXplICAgID0gWXdpZHRoKlloZWlnaHQ7CisKKyAgICBpbnQgeHgsIHl5LCBuaSwgbm8sIGt4LCBreTsKKyAgICBmbG9hdCAqWXBsYW5lID0gMCwgKlhwbGFuZSA9IDAsICp3ID0gMDsKKyAgICB1Y2hhciogY29ubmVjdF9tYXNrX2RhdGEgPSAwOworCisgICAgQ1ZfQVNTRVJUKCBYLT5yb3dzID09IG5YcGxhbmVzKlhzaXplICYmIFgtPmNvbHMgPT0gMSApOworICAgIENWX0FTU0VSVCggWS0+cm93cyA9PSBuWXBsYW5lcypZc2l6ZSAmJiBZLT5jb2xzID09IDEgKTsKKworICAgIGN2U2V0WmVybyggWSApOworCisgICAgWXBsYW5lID0gWS0+ZGF0YS5mbDsKKyAgICBjb25uZWN0X21hc2tfZGF0YSA9IGxheWVyLT5jb25uZWN0X21hc2stPmRhdGEucHRyOworICAgIHcgPSBsYXllci0+d2VpZ2h0cy0+ZGF0YS5mbDsKKyAgICBmb3IoIG5vID0gMDsgbm8gPCBuWXBsYW5lczsgbm8rKywgWXBsYW5lICs9IFlzaXplLCB3ICs9IG5fd2VpZ2h0c19mb3JfWXBsYW5lICkKKyAgICB7CisgICAgICAgIFhwbGFuZSA9IFgtPmRhdGEuZmw7CisgICAgICAgIGZvciggbmkgPSAwOyBuaSA8IG5YcGxhbmVzOyBuaSsrLCBYcGxhbmUgKz0gWHNpemUsIGNvbm5lY3RfbWFza19kYXRhKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggKmNvbm5lY3RfbWFza19kYXRhICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCogWWVsZW0gPSBZcGxhbmU7CisKKyAgICAgICAgICAgICAgICAvLyBYaGVpZ2h0LUsrMSA9PSBZaGVpZ2h0ICYmIFh3aWR0aC1LKzEgPT0gWXdpZHRoCisgICAgICAgICAgICAgICAgZm9yKCB5eSA9IDA7IHl5IDwgWGhlaWdodC1LKzE7IHl5KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4eCA9IDA7IHh4IDwgWHdpZHRoLUsrMTsgeHgrKywgWWVsZW0rKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiB0ZW1wbCA9IFhwbGFuZSt5eSpYd2lkdGgreHg7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBXWCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGt5ID0gMDsga3kgPCBLOyBreSsrLCB0ZW1wbCArPSBYd2lkdGgtSyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBreCA9IDA7IGt4IDwgSzsga3grKywgdGVtcGwrKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXWCArPSAqdGVtcGwqd1treSpLK2t4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAqWWVsZW0gKz0gV1ggKyB3W0sqS107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgfV9fRU5EX187Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OU3ViU2FtcGxpbmdGb3J3YXJkKCBDdkNOTkxheWVyKiBfbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdk1hdCogWSApCit7CisgICAgQ1ZfRlVOQ05BTUUoImljdkNOTlN1YlNhbXBsaW5nRm9yd2FyZCIpOworCisgICAgaWYoICFJQ1ZfSVNfQ05OX1NVQlNBTVBMSU5HX0xBWUVSKF9sYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIHtfX0JFR0lOX187CisKKyAgICBjb25zdCBDdkNOTlN1YlNhbXBsaW5nTGF5ZXIqIGxheWVyID0gKEN2Q05OU3ViU2FtcGxpbmdMYXllciopIF9sYXllcjsKKworICAgIGNvbnN0IGludCBzdWJfc2FtcGxfc2NhbGUgPSBsYXllci0+c3ViX3NhbXBfc2NhbGU7CisgICAgY29uc3QgaW50IG5wbGFuZXMgPSBsYXllci0+bl9pbnB1dF9wbGFuZXM7CisKKyAgICBjb25zdCBpbnQgWGhlaWdodCA9IGxheWVyLT5pbnB1dF9oZWlnaHQ7CisgICAgY29uc3QgaW50IFh3aWR0aCAgPSBsYXllci0+aW5wdXRfd2lkdGggOworICAgIGNvbnN0IGludCBYc2l6ZSAgID0gWHdpZHRoKlhoZWlnaHQ7CisKKyAgICBjb25zdCBpbnQgWWhlaWdodCA9IGxheWVyLT5vdXRwdXRfaGVpZ2h0OworICAgIGNvbnN0IGludCBZd2lkdGggID0gbGF5ZXItPm91dHB1dF93aWR0aDsKKyAgICBjb25zdCBpbnQgWXNpemUgICA9IFl3aWR0aCpZaGVpZ2h0OworCisgICAgaW50IHh4LCB5eSwgbmksIGt4LCBreTsKKyAgICBmbG9hdCogc3VtWF9kYXRhID0gMCwgKncgPSAwOworICAgIEN2TWF0IHN1bVhfc3ViX2NvbCwgZXhwMnNzdW1XWF9zdWJfY29sOworCisgICAgQ1ZfQVNTRVJUKFgtPnJvd3MgPT0gbnBsYW5lcypYc2l6ZSAmJiBYLT5jb2xzID09IDEpOworICAgIENWX0FTU0VSVChsYXllci0+ZXhwMnNzdW1XWC0+Y29scyA9PSAxICYmIGxheWVyLT5leHAyc3N1bVdYLT5yb3dzID09IG5wbGFuZXMqWXNpemUpOworCisgICAgLy8gdXBkYXRlIGlubmVyIHZhcmlhYmxlIGxheWVyLT5leHAyc3N1bVdYLCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gYmFjay1wcm9nYXRpb24KKyAgICBjdlplcm8oIGxheWVyLT5zdW1YICk7CisgICAgY3ZaZXJvKCBsYXllci0+ZXhwMnNzdW1XWCApOworCisgICAgZm9yKCBreSA9IDA7IGt5IDwgc3ViX3NhbXBsX3NjYWxlOyBreSsrICkKKyAgICAgICAgZm9yKCBreCA9IDA7IGt4IDwgc3ViX3NhbXBsX3NjYWxlOyBreCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIFhwbGFuZSA9IFgtPmRhdGEuZmw7CisgICAgICAgICAgICBzdW1YX2RhdGEgPSBsYXllci0+c3VtWC0+ZGF0YS5mbDsKKyAgICAgICAgICAgIGZvciggbmkgPSAwOyBuaSA8IG5wbGFuZXM7IG5pKyssIFhwbGFuZSArPSBYc2l6ZSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCB5eSA9IDA7IHl5IDwgWWhlaWdodDsgeXkrKyApCisgICAgICAgICAgICAgICAgICAgIGZvciggeHggPSAwOyB4eCA8IFl3aWR0aDsgeHgrKywgc3VtWF9kYXRhKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnN1bVhfZGF0YSArPSBYcGxhbmVbKCh5eStreSkqWHdpZHRoKyh4eCtreCkpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSAgICAgICAgICAgICAgICAKKworICAgIHcgPSBsYXllci0+d2VpZ2h0cy0+ZGF0YS5mbDsKKyAgICBjdkdldFJvd3MoIGxheWVyLT5zdW1YLCAmc3VtWF9zdWJfY29sLCAwLCBZc2l6ZSApOworICAgIGN2R2V0Um93cyggbGF5ZXItPmV4cDJzc3VtV1gsICZleHAyc3N1bVdYX3N1Yl9jb2wsIDAsIFlzaXplICk7CisgICAgZm9yKCBuaSA9IDA7IG5pIDwgbnBsYW5lczsgbmkrKywgdyArPSAyICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoY3ZDb252ZXJ0U2NhbGUoICZzdW1YX3N1Yl9jb2wsICZleHAyc3N1bVdYX3N1Yl9jb2wsIHdbMF0sIHdbMV0gKSk7CisgICAgICAgIHN1bVhfc3ViX2NvbC5kYXRhLmZsICs9IFlzaXplOworICAgICAgICBleHAyc3N1bVdYX3N1Yl9jb2wuZGF0YS5mbCArPSBZc2l6ZTsKKyAgICB9CisKKyAgICBDVl9DQUxMKGN2U2NhbGUoIGxheWVyLT5leHAyc3N1bVdYLCBsYXllci0+ZXhwMnNzdW1XWCwgMi4wKmxheWVyLT5zICkpOworICAgIENWX0NBTEwoY3ZFeHAoIGxheWVyLT5leHAyc3N1bVdYLCBsYXllci0+ZXhwMnNzdW1XWCApKTsKKyAgICBDVl9DQUxMKGN2TWluUyggbGF5ZXItPmV4cDJzc3VtV1gsIEZMVF9NQVgsIGxheWVyLT5leHAyc3N1bVdYICkpOworLy8jaWZkZWYgX0RFQlVHCisgICAgeworICAgICAgICBmbG9hdCogZXhwMnNzdW1XWF9kYXRhID0gbGF5ZXItPmV4cDJzc3VtV1gtPmRhdGEuZmw7CisgICAgICAgIGZvciggbmkgPSAwOyBuaSA8IGxheWVyLT5leHAyc3N1bVdYLT5yb3dzOyBuaSsrLCBleHAyc3N1bVdYX2RhdGErKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqZXhwMnNzdW1XWF9kYXRhID09IEZMVF9NQVggKQorICAgICAgICAgICAgICAgIGN2U2V0RXJyU3RhdHVzKCAxICk7CisgICAgICAgIH0KKyAgICB9CisvLyNlbmRpZgorICAgIC8vIGNvbXB1dGUgdGhlIG91dHB1dCB2YXJpYWJsZSBZID09ICggYSAtIDJhLyhsYXllci0+ZXhwMnNzdW1XWCArIDEpKQorICAgIENWX0NBTEwoY3ZBZGRTKCBsYXllci0+ZXhwMnNzdW1XWCwgY3ZSZWFsU2NhbGFyKDEpLCBZICkpOworICAgIENWX0NBTEwoY3ZEaXYoIDAsIFksIFksIC0yLjAqbGF5ZXItPmEgKSk7CisgICAgQ1ZfQ0FMTChjdkFkZFMoIFksIGN2UmVhbFNjYWxhcihsYXllci0+YSksIFkgKSk7CisKKyAgICB9X19FTkRfXzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpY3ZDTk5GdWxsQ29ubmVjdEZvcndhcmQoIEN2Q05OTGF5ZXIqIF9sYXllciwgY29uc3QgQ3ZNYXQqIFgsIEN2TWF0KiBZICkKK3sKKyAgICBDVl9GVU5DTkFNRSgiaWN2Q05ORnVsbENvbm5lY3RGb3J3YXJkIik7CisKKyAgICBpZiggIUlDVl9JU19DTk5fRlVMTENPTk5FQ1RfTEFZRVIoX2xheWVyKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGxheWVyIiApOworCisgICAge19fQkVHSU5fXzsKKworICAgIGNvbnN0IEN2Q05ORnVsbENvbm5lY3RMYXllciogbGF5ZXIgPSAoQ3ZDTk5GdWxsQ29ubmVjdExheWVyKilfbGF5ZXI7CisgICAgQ3ZNYXQqIHdlaWdodHMgPSBsYXllci0+d2VpZ2h0czsKKyAgICBDdk1hdCBzdWJfd2VpZ2h0cywgYmlhczsKKworICAgIENWX0FTU0VSVChYLT5jb2xzID09IDEgJiYgWC0+cm93cyA9PSBsYXllci0+bl9pbnB1dF9wbGFuZXMpOworICAgIENWX0FTU0VSVChZLT5jb2xzID09IDEgJiYgWS0+cm93cyA9PSBsYXllci0+bl9vdXRwdXRfcGxhbmVzKTsKKworICAgIENWX0NBTEwoY3ZHZXRTdWJSZWN0KCB3ZWlnaHRzLCAmc3ViX3dlaWdodHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN2UmVjdCgwLCAwLCB3ZWlnaHRzLT5jb2xzLTEsIHdlaWdodHMtPnJvd3MgKSkpOworICAgIENWX0NBTEwoY3ZHZXRDb2woIHdlaWdodHMsICZiaWFzLCB3ZWlnaHRzLT5jb2xzLTEpKTsKKworICAgIC8vIHVwZGF0ZSBpbm5lciB2YXJpYWJsZSBsYXllci0+ZXhwMnNzdW1XWCwgd2hpY2ggd2lsbCBiZSB1c2VkIGluIEJhY2stUHJvcGFnYXRpb24KKyAgICBDVl9DQUxMKGN2R0VNTSggJnN1Yl93ZWlnaHRzLCBYLCAyKmxheWVyLT5zLCAmYmlhcywgMipsYXllci0+cywgbGF5ZXItPmV4cDJzc3VtV1ggKSk7CisgICAgQ1ZfQ0FMTChjdkV4cCggbGF5ZXItPmV4cDJzc3VtV1gsIGxheWVyLT5leHAyc3N1bVdYICkpOworICAgIENWX0NBTEwoY3ZNaW5TKCBsYXllci0+ZXhwMnNzdW1XWCwgRkxUX01BWCwgbGF5ZXItPmV4cDJzc3VtV1ggKSk7CisvLyNpZmRlZiBfREVCVUcKKyAgICB7CisgICAgICAgIGZsb2F0KiBleHAyc3N1bVdYX2RhdGEgPSBsYXllci0+ZXhwMnNzdW1XWC0+ZGF0YS5mbDsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBsYXllci0+ZXhwMnNzdW1XWC0+cm93czsgaSsrLCBleHAyc3N1bVdYX2RhdGErKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAqZXhwMnNzdW1XWF9kYXRhID09IEZMVF9NQVggKQorICAgICAgICAgICAgICAgIGN2U2V0RXJyU3RhdHVzKCAxICk7CisgICAgICAgIH0KKyAgICB9CisvLyNlbmRpZgorICAgIC8vIGNvbXB1dGUgdGhlIG91dHB1dCB2YXJpYWJsZSBZID09ICggYSAtIDJhLyhsYXllci0+ZXhwMnNzdW1XWCArIDEpKQorICAgIENWX0NBTEwoY3ZBZGRTKCBsYXllci0+ZXhwMnNzdW1XWCwgY3ZSZWFsU2NhbGFyKDEpLCBZICkpOworICAgIENWX0NBTEwoY3ZEaXYoIDAsIFksIFksIC0yLjAqbGF5ZXItPmEgKSk7CisgICAgQ1ZfQ0FMTChjdkFkZFMoIFksIGN2UmVhbFNjYWxhcihsYXllci0+YSksIFkgKSk7CisKKyAgICB9X19FTkRfXzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF5ZXIgQkFDS1dBUkQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiA8ZEVfZFk+LCA8ZEVfZFg+IHNob3VsZCBiZSByb3ctdmVjdG9ycy4KKyAgIEZ1bmN0aW9uIGNvbXB1dGVzIHBhcnRpYWwgZGVyaXZhdGl2ZXMgPGRFX2RYPgorICAgb2YgdGhlIGxvc3MgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBwbGFuZXMgY29tcG9uZW50cworICAgb2YgdGhlIHByZXZpb3VzIGxheWVyIChYKS4KKyAgIEl0IGlzIGEgYmFzaWMgZnVuY3Rpb24gZm9yIGJhY2sgcHJvcGFnYXRpb24gbWV0aG9kLgorICAgSW5wdXQgcGFyYW1ldGVyIDxkRV9kWT4gaXMgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZSBvZiB0aGUKKyAgIGxvc3MgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBwbGFuZXMgY29tcG9uZW50cworICAgb2YgdGhlIGN1cnJlbnQgbGF5ZXIuICovCitzdGF0aWMgdm9pZCBpY3ZDTk5Db252b2x1dGlvbkJhY2t3YXJkKAorICAgIEN2Q05OTGF5ZXIqIF9sYXllciwgaW50IHQsIGNvbnN0IEN2TWF0KiBYLCBjb25zdCBDdk1hdCogZEVfZFksIEN2TWF0KiBkRV9kWCApCit7CisgICAgQ3ZNYXQqIGRZX2RYID0gMDsKKyAgICBDdk1hdCogZFlfZFcgPSAwOworICAgIEN2TWF0KiBkRV9kVyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSgiaWN2Q05OQ29udm9sdXRpb25CYWNrd2FyZCIpOworCisgICAgaWYoICFJQ1ZfSVNfQ05OX0NPTlZPTFVUSU9OX0xBWUVSKF9sYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIHtfX0JFR0lOX187CisKKyAgICBjb25zdCBDdkNOTkNvbnZvbHV0aW9uTGF5ZXIqIGxheWVyID0gKEN2Q05OQ29udm9sdXRpb25MYXllciopIF9sYXllcjsKKworICAgIGNvbnN0IGludCBLID0gbGF5ZXItPks7CisKKyAgICBjb25zdCBpbnQgbl9YX3BsYW5lcyAgICAgPSBsYXllci0+bl9pbnB1dF9wbGFuZXM7CisgICAgY29uc3QgaW50IFhfcGxhbmVfaGVpZ2h0ID0gbGF5ZXItPmlucHV0X2hlaWdodDsKKyAgICBjb25zdCBpbnQgWF9wbGFuZV93aWR0aCAgPSBsYXllci0+aW5wdXRfd2lkdGg7CisgICAgY29uc3QgaW50IFhfcGxhbmVfc2l6ZSAgID0gWF9wbGFuZV9oZWlnaHQqWF9wbGFuZV93aWR0aDsKKworICAgIGNvbnN0IGludCBuX1lfcGxhbmVzICAgICA9IGxheWVyLT5uX291dHB1dF9wbGFuZXM7CisgICAgY29uc3QgaW50IFlfcGxhbmVfaGVpZ2h0ID0gbGF5ZXItPm91dHB1dF9oZWlnaHQ7CisgICAgY29uc3QgaW50IFlfcGxhbmVfd2lkdGggID0gbGF5ZXItPm91dHB1dF93aWR0aDsKKyAgICBjb25zdCBpbnQgWV9wbGFuZV9zaXplICAgPSBZX3BsYW5lX2hlaWdodCpZX3BsYW5lX3dpZHRoOworCisgICAgaW50IG5vLCBuaSwgeXksIHh4LCBreSwga3g7CisgICAgaW50IFhfaWR4ID0gMCwgWV9pZHggPSAwOworCisgICAgZmxvYXQgKlhfcGxhbmUgPSAwLCAqdyA9IDA7CisKKyAgICBDdk1hdCogd2VpZ2h0cyA9IGxheWVyLT53ZWlnaHRzOworCisgICAgQ1ZfQVNTRVJUKCB0ID49IDEgKTsKKyAgICBDVl9BU1NFUlQoIG5fWV9wbGFuZXMgPT0gd2VpZ2h0cy0+cm93cyApOworCisgICAgZFlfZFggPSBjdkNyZWF0ZU1hdCggbl9ZX3BsYW5lcypZX3BsYW5lX3NpemUsIFgtPnJvd3MsIENWXzMyRkMxICk7CisgICAgZFlfZFcgPSBjdkNyZWF0ZU1hdCggZFlfZFgtPnJvd3MsIHdlaWdodHMtPmNvbHMqd2VpZ2h0cy0+cm93cywgQ1ZfMzJGQzEgKTsKKyAgICBkRV9kVyA9IGN2Q3JlYXRlTWF0KCAxLCBkWV9kVy0+Y29scywgQ1ZfMzJGQzEgKTsKKworICAgIGN2WmVybyggZFlfZFggKTsKKyAgICBjdlplcm8oIGRZX2RXICk7CisKKyAgICAvLyBjb21wdXRlIGdyYWRpZW50IG9mIHRoZSBsb3NzIGZ1bmN0aW9uIHdpdGggcmVzcGVjdCB0byBYIGFuZCBXCisgICAgZm9yKCBubyA9IDA7IG5vIDwgbl9ZX3BsYW5lczsgbm8rKywgWV9pZHggKz0gWV9wbGFuZV9zaXplICkKKyAgICB7CisgICAgICAgIHcgPSB3ZWlnaHRzLT5kYXRhLmZsICsgbm8qKEsqSysxKTsKKyAgICAgICAgWF9pZHggPSAwOworICAgICAgICBYX3BsYW5lID0gWC0+ZGF0YS5mbDsKKyAgICAgICAgZm9yKCBuaSA9IDA7IG5pIDwgbl9YX3BsYW5lczsgbmkrKywgWF9wbGFuZSArPSBYX3BsYW5lX3NpemUgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbGF5ZXItPmNvbm5lY3RfbWFzay0+ZGF0YS5wdHJbbmkqbl9ZX3BsYW5lcytub10gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeXkgPSAwOyB5eSA8IFhfcGxhbmVfaGVpZ2h0IC0gSyArIDE7IHl5KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4eCA9IDA7IHh4IDwgWF9wbGFuZV93aWR0aCAtIEsgKyAxOyB4eCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBreSA9IDA7IGt5IDwgSzsga3krKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBreCA9IDA7IGt4IDwgSzsga3grKyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSgqZFlfZFgsIGZsb2F0LCBZX2lkeCt5eSpZX3BsYW5lX3dpZHRoK3h4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWF9pZHgrKHl5K2t5KSpYX3BsYW5lX3dpZHRoKyh4eCtreCkpID0gd1treSpLK2t4XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkWV9kV2ksIGk9MSwuLi4sSypLCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX01BVF9FTEVNKCpkWV9kVywgZmxvYXQsIFlfaWR4K3l5KllfcGxhbmVfd2lkdGgreHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyooSypLKzEpK2t5Kksra3gpICs9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYX3BsYW5lWyh5eStreSkqWF9wbGFuZV93aWR0aCsoeHgra3gpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkWV9kVyhLKksrMSk9PTEgYmVjYXVzZSBXKEsqSysxKSBpcyBiaWFzCisgICAgICAgICAgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSgqZFlfZFcsIGZsb2F0LCBZX2lkeCt5eSpZX3BsYW5lX3dpZHRoK3h4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vKihLKksrMSkrSypLKSArPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgWF9pZHggKz0gWF9wbGFuZV9zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgQ1ZfQ0FMTChjdk1hdE11bCggZEVfZFksIGRZX2RXLCBkRV9kVyApKTsKKyAgICBDVl9DQUxMKGN2TWF0TXVsKCBkRV9kWSwgZFlfZFgsIGRFX2RYICkpOworCisgICAgLy8gdXBkYXRlIHdlaWdodHMKKyAgICB7CisgICAgICAgIEN2TWF0IGRFX2RXX21hdDsKKyAgICAgICAgZmxvYXQgZXRhOworICAgICAgICBpZiggbGF5ZXItPmxlYXJuX3JhdGVfZGVjcmVhc2VfdHlwZSA9PSBDVl9DTk5fTEVBUk5fUkFURV9ERUNSRUFTRV9MT0dfSU5WICkKKyAgICAgICAgICAgIGV0YSA9IC1sYXllci0+aW5pdF9sZWFybl9yYXRlL2xvZ2YoMSsoZmxvYXQpdCk7CisgICAgICAgIGVsc2UgaWYoIGxheWVyLT5sZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUgPT0gQ1ZfQ05OX0xFQVJOX1JBVEVfREVDUkVBU0VfU1FSVF9JTlYgKQorICAgICAgICAgICAgZXRhID0gLWxheWVyLT5pbml0X2xlYXJuX3JhdGUvc3FydGYoKGZsb2F0KXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldGEgPSAtbGF5ZXItPmluaXRfbGVhcm5fcmF0ZS8oZmxvYXQpdDsKKyAgICAgICAgY3ZSZXNoYXBlKCBkRV9kVywgJmRFX2RXX21hdCwgMCwgd2VpZ2h0cy0+cm93cyApOworICAgICAgICBjdlNjYWxlQWRkKCAmZEVfZFdfbWF0LCBjdlJlYWxTY2FsYXIoZXRhKSwgd2VpZ2h0cywgd2VpZ2h0cyApOworICAgIH0KKworICAgIH1fX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmZFlfZFggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZkWV9kVyApOworICAgIGN2UmVsZWFzZU1hdCggJmRFX2RXICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OU3ViU2FtcGxpbmdCYWNrd2FyZCgKKyAgICBDdkNOTkxheWVyKiBfbGF5ZXIsIGludCB0LCBjb25zdCBDdk1hdCosIGNvbnN0IEN2TWF0KiBkRV9kWSwgQ3ZNYXQqIGRFX2RYICkKK3sKKyAgICAvLyBkZXJpdmF0aXZlIG9mIGFjdGl2YXRpb24gZnVuY3Rpb24KKyAgICBDdk1hdCogZFlfZFhfZWxlbXMgPSAwOyAvLyBlbGVtZW50cyBvZiBtYXRyaXggZFlfZFgKKyAgICBDdk1hdCogZFlfZFdfZWxlbXMgPSAwOyAvLyBlbGVtZW50cyBvZiBtYXRyaXggZFlfZFcKKyAgICBDdk1hdCogZEVfZFcgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImljdkNOTlN1YlNhbXBsaW5nQmFja3dhcmQiKTsKKworICAgIGlmKCAhSUNWX0lTX0NOTl9TVUJTQU1QTElOR19MQVlFUihfbGF5ZXIpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbGF5ZXIiICk7CisKKyAgICB7X19CRUdJTl9fOworCisgICAgY29uc3QgQ3ZDTk5TdWJTYW1wbGluZ0xheWVyKiBsYXllciA9IChDdkNOTlN1YlNhbXBsaW5nTGF5ZXIqKSBfbGF5ZXI7CisKKyAgICBjb25zdCBpbnQgWHdpZHRoICA9IGxheWVyLT5pbnB1dF93aWR0aDsKKyAgICBjb25zdCBpbnQgWXdpZHRoICA9IGxheWVyLT5vdXRwdXRfd2lkdGg7CisgICAgY29uc3QgaW50IFloZWlnaHQgPSBsYXllci0+b3V0cHV0X2hlaWdodDsKKyAgICBjb25zdCBpbnQgWXNpemUgICA9IFl3aWR0aCAqIFloZWlnaHQ7CisgICAgY29uc3QgaW50IHNjYWxlICAgPSBsYXllci0+c3ViX3NhbXBfc2NhbGU7CisgICAgY29uc3QgaW50IGtfbWF4ICAgPSBsYXllci0+bl9vdXRwdXRfcGxhbmVzICogWWhlaWdodDsKKworICAgIGludCBrLCBpLCBqLCBtOworICAgIGZsb2F0KiBkWV9kWF9jdXJyZW50X2VsZW0gPSAwLCAqZEVfZFhfc3RhcnQgPSAwLCAqZEVfZFdfZGF0YSA9IDAsICp3ID0gMDsKKyAgICBDdk1hdCBkeV9kdzAsIGR5X2R3MTsKKyAgICBDdk1hdCBhY3Rpdl9mdW5jX2Rlciwgc3VtWF9yb3c7CisgICAgQ3ZNYXQgZEVfZFlfc3ViX3JvdywgZFlfZFhfc3ViX2NvbCwgZHlfZHcwX3N1Yl9yb3csIGR5X2R3MV9zdWJfcm93OworCisgICAgQ1ZfQ0FMTChkWV9kWF9lbGVtcyA9IGN2Q3JlYXRlTWF0KCBsYXllci0+c3VtWC0+cm93cywgMSwgQ1ZfMzJGQzEgKSk7CisgICAgQ1ZfQ0FMTChkWV9kV19lbGVtcyA9IGN2Q3JlYXRlTWF0KCAyLCBsYXllci0+c3VtWC0+cm93cywgQ1ZfMzJGQzEgKSk7CisgICAgQ1ZfQ0FMTChkRV9kVyA9IGN2Q3JlYXRlTWF0KCAxLCAyKmxheWVyLT5uX291dHB1dF9wbGFuZXMsIENWXzMyRkMxICkpOworCisgICAgLy8gY29tcHV0ZSBkZXJpdmF0aXZlIG9mIGFjdGl2LmZ1bmMuCisgICAgLy8gPT08ZFlfZFhfZWxlbXM+ID0gNGFzKihsYXllci0+ZXhwMnNzdW1XWCkvKGxheWVyLT5leHAyc3N1bVdYICsgMSleMgorICAgIENWX0NBTEwoY3ZBZGRTKCBsYXllci0+ZXhwMnNzdW1XWCwgY3ZSZWFsU2NhbGFyKDEpLCBkWV9kWF9lbGVtcyApKTsKKyAgICBDVl9DQUxMKGN2UG93KCBkWV9kWF9lbGVtcywgZFlfZFhfZWxlbXMsIC0yLjAgKSk7CisgICAgQ1ZfQ0FMTChjdk11bCggZFlfZFhfZWxlbXMsIGxheWVyLT5leHAyc3N1bVdYLCBkWV9kWF9lbGVtcywgNC4wKmxheWVyLT5hKmxheWVyLT5zICkpOworCisgICAgLy8gY29tcHV0ZSA8ZEVfZFc+CisgICAgLy8gYSkgY29tcHV0ZSA8ZFlfZFdfZWxlbXM+CisgICAgY3ZSZXNoYXBlKCBkWV9kWF9lbGVtcywgJmFjdGl2X2Z1bmNfZGVyLCAwLCAxICk7CisgICAgY3ZHZXRSb3coIGRZX2RXX2VsZW1zLCAmZHlfZHcwLCAwICk7CisgICAgY3ZHZXRSb3coIGRZX2RXX2VsZW1zLCAmZHlfZHcxLCAxICk7CisgICAgQ1ZfQ0FMTChjdkNvcHkoICZhY3Rpdl9mdW5jX2RlciwgJmR5X2R3MCApKTsKKyAgICBDVl9DQUxMKGN2Q29weSggJmFjdGl2X2Z1bmNfZGVyLCAmZHlfZHcxICkpOworCisgICAgY3ZSZXNoYXBlKCBsYXllci0+c3VtWCwgJnN1bVhfcm93LCAwLCAxICk7CisgICAgY3ZNdWwoICZkeV9kdzAsICZzdW1YX3JvdywgJmR5X2R3MCApOworCisgICAgLy8gYikgY29tcHV0ZSA8ZEVfZFc+ID0gPGRFX2RZPio8ZFlfZFdfZWxlbXM+CisgICAgY3ZHZXRDb2xzKCBkRV9kWSwgJmRFX2RZX3N1Yl9yb3csIDAsIFlzaXplICk7CisgICAgY3ZHZXRDb2xzKCAmZHlfZHcwLCAmZHlfZHcwX3N1Yl9yb3csIDAsIFlzaXplICk7CisgICAgY3ZHZXRDb2xzKCAmZHlfZHcxLCAmZHlfZHcxX3N1Yl9yb3csIDAsIFlzaXplICk7CisgICAgZEVfZFdfZGF0YSA9IGRFX2RXLT5kYXRhLmZsOworICAgIGZvciggaSA9IDA7IGkgPCBsYXllci0+bl9vdXRwdXRfcGxhbmVzOyBpKysgKQorICAgIHsKKyAgICAgICAgKmRFX2RXX2RhdGErKyA9IChmbG9hdCljdkRvdFByb2R1Y3QoICZkRV9kWV9zdWJfcm93LCAmZHlfZHcwX3N1Yl9yb3cgKTsKKyAgICAgICAgKmRFX2RXX2RhdGErKyA9IChmbG9hdCljdkRvdFByb2R1Y3QoICZkRV9kWV9zdWJfcm93LCAmZHlfZHcxX3N1Yl9yb3cgKTsKKworICAgICAgICBkRV9kWV9zdWJfcm93LmRhdGEuZmwgKz0gWXNpemU7CisgICAgICAgIGR5X2R3MF9zdWJfcm93LmRhdGEuZmwgKz0gWXNpemU7CisgICAgICAgIGR5X2R3MV9zdWJfcm93LmRhdGEuZmwgKz0gWXNpemU7CisgICAgfQorCisgICAgLy8gY29tcHV0ZSA8ZFlfZFg+ID0gbGF5ZXItPndlaWdodHMqPGRZX2RYPgorICAgIHcgPSBsYXllci0+d2VpZ2h0cy0+ZGF0YS5mbDsKKyAgICBjdkdldFJvd3MoIGRZX2RYX2VsZW1zLCAmZFlfZFhfc3ViX2NvbCwgMCwgWXNpemUgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbGF5ZXItPm5faW5wdXRfcGxhbmVzOyBpKyssIHcrKywgZFlfZFhfc3ViX2NvbC5kYXRhLmZsICs9IFlzaXplICkKKyAgICAgICAgQ1ZfQ0FMTChjdkNvbnZlcnRTY2FsZSggJmRZX2RYX3N1Yl9jb2wsICZkWV9kWF9zdWJfY29sLCAoZmxvYXQpKncgKSk7CisKKyAgICAvLyBjb21wdXRlIDxkRV9kWD4KKyAgICBDVl9DQUxMKGN2UmVzaGFwZSggZFlfZFhfZWxlbXMsIGRZX2RYX2VsZW1zLCAwLCAxICkpOworICAgIENWX0NBTEwoY3ZNdWwoIGRZX2RYX2VsZW1zLCBkRV9kWSwgZFlfZFhfZWxlbXMgKSk7CisKKyAgICBkWV9kWF9jdXJyZW50X2VsZW0gPSBkWV9kWF9lbGVtcy0+ZGF0YS5mbDsKKyAgICBkRV9kWF9zdGFydCA9IGRFX2RYLT5kYXRhLmZsOworICAgIGZvciggayA9IDA7IGsgPCBrX21heDsgaysrICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBZd2lkdGg7IGkrKywgZFlfZFhfY3VycmVudF9lbGVtKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogZEVfZFhfY3VycmVudF9lbGVtID0gZEVfZFhfc3RhcnQ7CisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgc2NhbGU7IGorKywgZEVfZFhfY3VycmVudF9lbGVtICs9IFh3aWR0aCAtIHNjYWxlICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIG0gPSAwOyBtIDwgc2NhbGU7IG0rKywgZEVfZFhfY3VycmVudF9lbGVtKysgKQorICAgICAgICAgICAgICAgICAgICAqZEVfZFhfY3VycmVudF9lbGVtID0gKmRZX2RYX2N1cnJlbnRfZWxlbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRFX2RYX3N0YXJ0ICs9IHNjYWxlOworICAgICAgICB9CisgICAgICAgIGRFX2RYX3N0YXJ0ICs9IFh3aWR0aCAqIChzY2FsZSAtIDEpOworICAgIH0KKworICAgIC8vIHVwZGF0ZSB3ZWlnaHRzCisgICAgeworICAgICAgICBDdk1hdCBkRV9kV19tYXQsICp3ZWlnaHRzID0gbGF5ZXItPndlaWdodHM7CisgICAgICAgIGZsb2F0IGV0YTsKKyAgICAgICAgaWYoIGxheWVyLT5sZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUgPT0gQ1ZfQ05OX0xFQVJOX1JBVEVfREVDUkVBU0VfTE9HX0lOViApCisgICAgICAgICAgICBldGEgPSAtbGF5ZXItPmluaXRfbGVhcm5fcmF0ZS9sb2dmKDErKGZsb2F0KXQpOworICAgICAgICBlbHNlIGlmKCBsYXllci0+bGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlID09IENWX0NOTl9MRUFSTl9SQVRFX0RFQ1JFQVNFX1NRUlRfSU5WICkKKyAgICAgICAgICAgIGV0YSA9IC1sYXllci0+aW5pdF9sZWFybl9yYXRlL3NxcnRmKChmbG9hdCl0KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZXRhID0gLWxheWVyLT5pbml0X2xlYXJuX3JhdGUvKGZsb2F0KXQ7CisgICAgICAgIGN2UmVzaGFwZSggZEVfZFcsICZkRV9kV19tYXQsIDAsIHdlaWdodHMtPnJvd3MgKTsKKyAgICAgICAgY3ZTY2FsZUFkZCggJmRFX2RXX21hdCwgY3ZSZWFsU2NhbGFyKGV0YSksIHdlaWdodHMsIHdlaWdodHMgKTsKKyAgICB9CisKKyAgICB9X19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmRZX2RYX2VsZW1zICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmZFlfZFdfZWxlbXMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZkRV9kVyApOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIDxkRV9kWT4sIDxkRV9kWD4gc2hvdWxkIGJlIHJvdy12ZWN0b3JzLgorICAgRnVuY3Rpb24gY29tcHV0ZXMgcGFydGlhbCBkZXJpdmF0aXZlcyA8ZEVfZFg+LCA8ZEVfZFc+CisgICBvZiB0aGUgbG9zcyBmdW5jdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIHBsYW5lcyBjb21wb25lbnRzCisgICBvZiB0aGUgcHJldmlvdXMgbGF5ZXIgKFgpIGFuZCB0aGUgd2VpZ2h0cyBvZiB0aGUgY3VycmVudCBsYXllciAoVykKKyAgIGFuZCB1cGRhdGVzIHdlaWdodHMgb2QgdGhlIGN1cnJlbnQgbGF5ZXIgYnkgdXNpbmcgPGRFX2RXPi4KKyAgIEl0IGlzIGEgYmFzaWMgZnVuY3Rpb24gZm9yIGJhY2sgcHJvcGFnYXRpb24gbWV0aG9kLgorICAgSW5wdXQgcGFyYW1ldGVyIDxkRV9kWT4gaXMgdGhlIHBhcnRpYWwgZGVyaXZhdGl2ZSBvZiB0aGUKKyAgIGxvc3MgZnVuY3Rpb24gd2l0aCByZXNwZWN0IHRvIHRoZSBwbGFuZXMgY29tcG9uZW50cworICAgb2YgdGhlIGN1cnJlbnQgbGF5ZXIuICovCitzdGF0aWMgdm9pZCBpY3ZDTk5GdWxsQ29ubmVjdEJhY2t3YXJkKCBDdkNOTkxheWVyKiBfbGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGRFX2RZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZNYXQqIGRFX2RYICkKK3sKKyAgICBDdk1hdCogZEVfZFlfYWN0aXZfZnVuY19kZXIgPSAwOworICAgIEN2TWF0KiBkRV9kVyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDTk5GdWxsQ29ubmVjdEJhY2t3YXJkIiApOworCisgICAgaWYoICFJQ1ZfSVNfQ05OX0ZVTExDT05ORUNUX0xBWUVSKF9sYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIHtfX0JFR0lOX187CisKKyAgICBjb25zdCBDdkNOTkZ1bGxDb25uZWN0TGF5ZXIqIGxheWVyID0gKEN2Q05ORnVsbENvbm5lY3RMYXllciopX2xheWVyOworICAgIGNvbnN0IGludCBuX291dHB1dHMgPSBsYXllci0+bl9vdXRwdXRfcGxhbmVzOworICAgIGNvbnN0IGludCBuX2lucHV0cyAgPSBsYXllci0+bl9pbnB1dF9wbGFuZXM7CisKKyAgICBpbnQgaTsKKyAgICBmbG9hdCogZEVfZFlfYWN0aXZfZnVuY19kZXJfZGF0YTsKKyAgICBDdk1hdCogd2VpZ2h0cyA9IGxheWVyLT53ZWlnaHRzOworICAgIEN2TWF0IHN1Yl93ZWlnaHRzLCBYdGVtcGxhdGUsIFhyb3csIGV4cDJzc3VtV1hyb3c7CisKKyAgICBDVl9BU1NFUlQoWC0+Y29scyA9PSAxICYmIFgtPnJvd3MgPT0gbl9pbnB1dHMpOworICAgIENWX0FTU0VSVChkRV9kWS0+cm93cyA9PSAxICYmIGRFX2RZLT5jb2xzID09IG5fb3V0cHV0cyApOworICAgIENWX0FTU0VSVChkRV9kWC0+cm93cyA9PSAxICYmIGRFX2RYLT5jb2xzID09IG5faW5wdXRzICk7CisgICAgCisgICAgLy8gd2UgdmlvbGF0ZSB0aGUgY29udmV0aW9uIGFib3V0IHZlY3RvcidzIG9yaWVudGF0aW9uIGJlY2F1c2UKKyAgICAvLyBoZXJlIGlzIG1vcmUgY29udmVuaWVudCB0byBtYWtlIHRoaXMgcGFyYW1ldGVyIGEgcm93LXZlY3RvciAKKyAgICBDVl9DQUxMKGRFX2RZX2FjdGl2X2Z1bmNfZGVyID0gY3ZDcmVhdGVNYXQoIDEsIG5fb3V0cHV0cywgQ1ZfMzJGQzEgKSk7CisgICAgQ1ZfQ0FMTChkRV9kVyA9IGN2Q3JlYXRlTWF0KCAxLCB3ZWlnaHRzLT5yb3dzKndlaWdodHMtPmNvbHMsIENWXzMyRkMxICkpOworICAgIAorICAgIC8vIDEpIGNvbXB1dGUgZ3JhZGllbnRzIGRFX2RYIGFuZCBkRV9kVworICAgIC8vIGFjdGl2X2Z1bmNfZGVyID09IDRhcyoobGF5ZXItPmV4cDJzc3VtV1gpLyhsYXllci0+ZXhwMnNzdW1XWCArIDEpXjIKKyAgICBDVl9DQUxMKGN2UmVzaGFwZSggbGF5ZXItPmV4cDJzc3VtV1gsICZleHAyc3N1bVdYcm93LCAwLCBsYXllci0+ZXhwMnNzdW1XWC0+Y29scyApKTsKKyAgICBDVl9DQUxMKGN2QWRkUyggJmV4cDJzc3VtV1hyb3csIGN2UmVhbFNjYWxhcigxKSwgZEVfZFlfYWN0aXZfZnVuY19kZXIgKSk7CisgICAgQ1ZfQ0FMTChjdlBvdyggZEVfZFlfYWN0aXZfZnVuY19kZXIsIGRFX2RZX2FjdGl2X2Z1bmNfZGVyLCAtMi4wICkpOworICAgIENWX0NBTEwoY3ZNdWwoIGRFX2RZX2FjdGl2X2Z1bmNfZGVyLCAmZXhwMnNzdW1XWHJvdywgZEVfZFlfYWN0aXZfZnVuY19kZXIsCisgICAgICAgICAgICAgICAgICAgNC4wKmxheWVyLT5hKmxheWVyLT5zICkpOworICAgIENWX0NBTEwoY3ZNdWwoIGRFX2RZLCBkRV9kWV9hY3Rpdl9mdW5jX2RlciwgZEVfZFlfYWN0aXZfZnVuY19kZXIgKSk7CisKKyAgICAvLyBzdWJfd2VpZ2h0cyA9IGQoVyooWHwxKSkvZFgKKyAgICBDVl9DQUxMKGN2R2V0U3ViUmVjdCggd2VpZ2h0cywgJnN1Yl93ZWlnaHRzLAorICAgICAgICBjdlJlY3QoMCwgMCwgd2VpZ2h0cy0+Y29scy0xLCB3ZWlnaHRzLT5yb3dzKSApKTsKKyAgICBDVl9DQUxMKGN2TWF0TXVsKCBkRV9kWV9hY3Rpdl9mdW5jX2RlciwgJnN1Yl93ZWlnaHRzLCBkRV9kWCApKTsKKworICAgIGN2UmVzaGFwZSggWCwgJlhyb3csIDAsIDEgKTsKKyAgICBkRV9kWV9hY3Rpdl9mdW5jX2Rlcl9kYXRhID0gZEVfZFlfYWN0aXZfZnVuY19kZXItPmRhdGEuZmw7CisgICAgWHRlbXBsYXRlID0gY3ZNYXQoIDEsIG5faW5wdXRzLCBDVl8zMkZDMSwgZEVfZFctPmRhdGEuZmwgKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbl9vdXRwdXRzOyBpKyssIFh0ZW1wbGF0ZS5kYXRhLmZsICs9IG5faW5wdXRzICsgMSApCisgICAgeworICAgICAgICBDVl9DQUxMKGN2Q29udmVydFNjYWxlKCAmWHJvdywgJlh0ZW1wbGF0ZSwgKmRFX2RZX2FjdGl2X2Z1bmNfZGVyX2RhdGEgKSk7CisgICAgICAgIFh0ZW1wbGF0ZS5kYXRhLmZsW25faW5wdXRzXSA9ICpkRV9kWV9hY3Rpdl9mdW5jX2Rlcl9kYXRhKys7CisgICAgfQorCisgICAgLy8gMikgdXBkYXRlIHdlaWdodHMKKyAgICB7CisgICAgICAgIEN2TWF0IGRFX2RXX21hdDsKKyAgICAgICAgZmxvYXQgZXRhOworICAgICAgICBpZiggbGF5ZXItPmxlYXJuX3JhdGVfZGVjcmVhc2VfdHlwZSA9PSBDVl9DTk5fTEVBUk5fUkFURV9ERUNSRUFTRV9MT0dfSU5WICkKKyAgICAgICAgICAgIGV0YSA9IC1sYXllci0+aW5pdF9sZWFybl9yYXRlL2xvZ2YoMSsoZmxvYXQpdCk7CisgICAgICAgIGVsc2UgaWYoIGxheWVyLT5sZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUgPT0gQ1ZfQ05OX0xFQVJOX1JBVEVfREVDUkVBU0VfU1FSVF9JTlYgKQorICAgICAgICAgICAgZXRhID0gLWxheWVyLT5pbml0X2xlYXJuX3JhdGUvc3FydGYoKGZsb2F0KXQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBldGEgPSAtbGF5ZXItPmluaXRfbGVhcm5fcmF0ZS8oZmxvYXQpdDsKKyAgICAgICAgY3ZSZXNoYXBlKCBkRV9kVywgJmRFX2RXX21hdCwgMCwgbl9vdXRwdXRzICk7CisgICAgICAgIGN2U2NhbGVBZGQoICZkRV9kV19tYXQsIGN2UmVhbFNjYWxhcihldGEpLCB3ZWlnaHRzLCB3ZWlnaHRzICk7CisgICAgfQorCisgICAgfV9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZkRV9kWV9hY3Rpdl9mdW5jX2RlciApOworICAgIGN2UmVsZWFzZU1hdCggJmRFX2RXICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExheWVyIFJFTEVBU0UgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGljdkNOTkNvbnZvbHV0aW9uUmVsZWFzZSggQ3ZDTk5MYXllcioqIHBfbGF5ZXIgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZDTk5Db252b2x1dGlvblJlbGVhc2UiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkNOTkNvbnZvbHV0aW9uTGF5ZXIqIGxheWVyID0gMDsKKworICAgIGlmKCAhcF9sYXllciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBkb3VibGUgcG9pbnRlciIgKTsKKworICAgIGxheWVyID0gKihDdkNOTkNvbnZvbHV0aW9uTGF5ZXIqKilwX2xheWVyOworCisgICAgaWYoICFsYXllciApCisgICAgICAgIHJldHVybjsKKyAgICBpZiggIUlDVl9JU19DTk5fQ09OVk9MVVRJT05fTEFZRVIobGF5ZXIpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbGF5ZXIiICk7CisKKyAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+d2VpZ2h0cyApOworICAgIGN2UmVsZWFzZU1hdCggJmxheWVyLT5jb25uZWN0X21hc2sgKTsKKyAgICBjdkZyZWUoIHBfbGF5ZXIgKTsKKworICAgIF9fRU5EX187Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgaWN2Q05OU3ViU2FtcGxpbmdSZWxlYXNlKCBDdkNOTkxheWVyKiogcF9sYXllciApCit7CisgICAgQ1ZfRlVOQ05BTUUoImljdkNOTlN1YlNhbXBsaW5nUmVsZWFzZSIpOworICAgIF9fQkVHSU5fXzsKKworICAgIEN2Q05OU3ViU2FtcGxpbmdMYXllciogbGF5ZXIgPSAwOworICAgIAorICAgIGlmKCAhcF9sYXllciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTnVsbCBkb3VibGUgcG9pbnRlciIgKTsKKworICAgIGxheWVyID0gKihDdkNOTlN1YlNhbXBsaW5nTGF5ZXIqKilwX2xheWVyOworCisgICAgaWYoICFsYXllciApCisgICAgICAgIHJldHVybjsKKyAgICBpZiggIUlDVl9JU19DTk5fU1VCU0FNUExJTkdfTEFZRVIobGF5ZXIpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgbGF5ZXIiICk7CisKKyAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+ZXhwMnNzdW1XWCApOworICAgIGN2UmVsZWFzZU1hdCggJmxheWVyLT53ZWlnaHRzICk7CisgICAgY3ZGcmVlKCBwX2xheWVyICk7CisKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGljdkNOTkZ1bGxDb25uZWN0UmVsZWFzZSggQ3ZDTk5MYXllcioqIHBfbGF5ZXIgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZDTk5GdWxsQ29ubmVjdFJlbGVhc2UiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkNOTkZ1bGxDb25uZWN0TGF5ZXIqIGxheWVyID0gMDsKKyAgICAKKyAgICBpZiggIXBfbGF5ZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTnVsbFB0ciwgIk51bGwgZG91YmxlIHBvaW50ZXIiICk7CisKKyAgICBsYXllciA9ICooQ3ZDTk5GdWxsQ29ubmVjdExheWVyKiopcF9sYXllcjsKKworICAgIGlmKCAhbGF5ZXIgKQorICAgICAgICByZXR1cm47CisgICAgaWYoICFJQ1ZfSVNfQ05OX0ZVTExDT05ORUNUX0xBWUVSKGxheWVyKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGxheWVyIiApOworCisgICAgY3ZSZWxlYXNlTWF0KCAmbGF5ZXItPmV4cDJzc3VtV1ggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZsYXllci0+d2VpZ2h0cyApOworICAgIGN2RnJlZSggcF9sYXllciApOworCisgICAgX19FTkRfXzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZC9Xcml0ZSBDTk4gY2xhc3NpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpY3ZJc0NOTk1vZGVsKCBjb25zdCB2b2lkKiBwdHIgKQoreworICAgIHJldHVybiBDVl9JU19DTk4ocHRyKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpY3ZSZWxlYXNlQ05OTW9kZWwoIHZvaWQqKiBwdHIgKQoreworICAgIENWX0ZVTkNOQU1FKCJpY3ZSZWxlYXNlQ05OTW9kZWwiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggIXB0ciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTlVMTCBkb3VibGUgcG9pbnRlciIgKTsKKyAgICBDVl9BU1NFUlQoQ1ZfSVNfQ05OKCpwdHIpKTsKKworICAgIGljdkNOTk1vZGVsUmVsZWFzZSggKEN2U3RhdE1vZGVsKiopcHRyICk7CisKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBDdkNOTkxheWVyKiBpY3ZSZWFkQ05OTGF5ZXIoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBub2RlICkKK3sKKyAgICBDdkNOTkxheWVyKiBsYXllciA9IDA7CisgICAgQ3ZNYXQqIHdlaWdodHMgICAgPSAwOworICAgIEN2TWF0KiBjb25uZWN0X21hc2sgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoImljdlJlYWRDTk5MYXllciIpOworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBuX2lucHV0X3BsYW5lcywgaW5wdXRfaGVpZ2h0LCBpbnB1dF93aWR0aDsKKyAgICBpbnQgbl9vdXRwdXRfcGxhbmVzLCBvdXRwdXRfaGVpZ2h0LCBvdXRwdXRfd2lkdGg7CisgICAgaW50IGxlYXJuX3R5cGUsIGxheWVyX3R5cGU7CisgICAgZmxvYXQgaW5pdF9sZWFybl9yYXRlOworCisgICAgQ1ZfQ0FMTChuX2lucHV0X3BsYW5lcyAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAibl9pbnB1dF9wbGFuZXMiLCAgLTEgKSk7CisgICAgQ1ZfQ0FMTChpbnB1dF9oZWlnaHQgICAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiaW5wdXRfaGVpZ2h0IiwgICAgLTEgKSk7CisgICAgQ1ZfQ0FMTChpbnB1dF93aWR0aCAgICAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiaW5wdXRfd2lkdGgiLCAgICAgLTEgKSk7CisgICAgQ1ZfQ0FMTChuX291dHB1dF9wbGFuZXMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAibl9vdXRwdXRfcGxhbmVzIiwgLTEgKSk7CisgICAgQ1ZfQ0FMTChvdXRwdXRfaGVpZ2h0ICAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAib3V0cHV0X2hlaWdodCIsICAgLTEgKSk7CisgICAgQ1ZfQ0FMTChvdXRwdXRfd2lkdGggICAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAib3V0cHV0X3dpZHRoIiwgICAgLTEgKSk7CisgICAgQ1ZfQ0FMTChsYXllcl90eXBlICAgICAgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAibGF5ZXJfdHlwZSIsICAgICAgLTEgKSk7CisKKyAgICBDVl9DQUxMKGluaXRfbGVhcm5fcmF0ZSA9IChmbG9hdCljdlJlYWRSZWFsQnlOYW1lKCBmcywgbm9kZSwgImluaXRfbGVhcm5fcmF0ZSIsIC0xICkpOworICAgIENWX0NBTEwobGVhcm5fdHlwZSA9IGN2UmVhZEludEJ5TmFtZSggZnMsIG5vZGUsICJsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUiLCAtMSApKTsKKyAgICBDVl9DQUxMKHdlaWdodHMgICAgPSAoQ3ZNYXQqKWN2UmVhZEJ5TmFtZSggZnMsIG5vZGUsICJ3ZWlnaHRzIiApKTsKKworICAgIGlmKCBuX2lucHV0X3BsYW5lcyA8IDAgIHx8IGlucHV0X2hlaWdodCA8IDAgIHx8IGlucHV0X3dpZHRoIDwgMCB8fAorICAgICAgICBuX291dHB1dF9wbGFuZXMgPCAwIHx8IG91dHB1dF9oZWlnaHQgPCAwIHx8IG91dHB1dF93aWR0aCA8IDAgfHwKKyAgICAgICAgaW5pdF9sZWFybl9yYXRlIDwgMCB8fCBsZWFybl90eXBlIDwgMCB8fCBsYXllcl90eXBlIDwgMCB8fCAhd2VpZ2h0cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiIiApOworCisgICAgaWYoIGxheWVyX3R5cGUgPT0gSUNWX0NOTl9DT05WT0xVVElPTl9MQVlFUiApCisgICAgeworICAgICAgICBjb25zdCBpbnQgSyA9IGlucHV0X2hlaWdodCAtIG91dHB1dF9oZWlnaHQgKyAxOworICAgICAgICBpZiggSyA8PSAwIHx8IEsgIT0gaW5wdXRfd2lkdGggLSBvdXRwdXRfd2lkdGggKyAxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIDxLPiIgKTsKKworICAgICAgICBDVl9DQUxMKGNvbm5lY3RfbWFzayA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgbm9kZSwgImNvbm5lY3RfbWFzayIgKSk7CisgICAgICAgIGlmKCAhY29ubmVjdF9tYXNrICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiTWlzc2luZyA8Y29ubmVjdCBtYXNrPiIgKTsKKworICAgICAgICBDVl9DQUxMKGxheWVyID0gY3ZDcmVhdGVDTk5Db252b2x1dGlvbkxheWVyKCAKKyAgICAgICAgICAgIG5faW5wdXRfcGxhbmVzLCBpbnB1dF9oZWlnaHQsIGlucHV0X3dpZHRoLCBuX291dHB1dF9wbGFuZXMsIEssCisgICAgICAgICAgICBpbml0X2xlYXJuX3JhdGUsIGxlYXJuX3R5cGUsIGNvbm5lY3RfbWFzaywgd2VpZ2h0cyApKTsKKyAgICB9CisgICAgZWxzZSBpZiggbGF5ZXJfdHlwZSA9PSBJQ1ZfQ05OX1NVQlNBTVBMSU5HX0xBWUVSICkKKyAgICB7CisgICAgICAgIGZsb2F0IGEsIHM7CisgICAgICAgIGNvbnN0IGludCBzdWJfc2FtcF9zY2FsZSA9IGlucHV0X2hlaWdodC9vdXRwdXRfaGVpZ2h0OworCisgICAgICAgIGlmKCBzdWJfc2FtcF9zY2FsZSA8PSAwIHx8IHN1Yl9zYW1wX3NjYWxlICE9IGlucHV0X3dpZHRoL291dHB1dF93aWR0aCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCA8c3ViX3NhbXBfc2NhbGU+IiApOworCisgICAgICAgIENWX0NBTEwoYSA9IChmbG9hdCljdlJlYWRSZWFsQnlOYW1lKCBmcywgbm9kZSwgImEiLCAtMSApKTsKKyAgICAgICAgQ1ZfQ0FMTChzID0gKGZsb2F0KWN2UmVhZFJlYWxCeU5hbWUoIGZzLCBub2RlLCAicyIsIC0xICkpOworICAgICAgICBpZiggYSAgPCAwIHx8IHMgIDwgMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIk1pc3NpbmcgPGE+IG9yIDxzPiIgKTsKKworICAgICAgICBDVl9DQUxMKGxheWVyID0gY3ZDcmVhdGVDTk5TdWJTYW1wbGluZ0xheWVyKAorICAgICAgICAgICAgbl9pbnB1dF9wbGFuZXMsIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsIHN1Yl9zYW1wX3NjYWxlLAorICAgICAgICAgICAgYSwgcywgaW5pdF9sZWFybl9yYXRlLCBsZWFybl90eXBlLCB3ZWlnaHRzICkpOworICAgIH0KKyAgICBlbHNlIGlmKCBsYXllcl90eXBlID09IElDVl9DTk5fRlVMTENPTk5FQ1RfTEFZRVIgKQorICAgIHsKKyAgICAgICAgZmxvYXQgYSwgczsKKyAgICAgICAgQ1ZfQ0FMTChhID0gKGZsb2F0KWN2UmVhZFJlYWxCeU5hbWUoIGZzLCBub2RlLCAiYSIsIC0xICkpOworICAgICAgICBDVl9DQUxMKHMgPSAoZmxvYXQpY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIG5vZGUsICJzIiwgLTEgKSk7CisgICAgICAgIGlmKCBhICA8IDAgfHwgcyAgPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiIiApOworICAgICAgICBpZiggaW5wdXRfaGVpZ2h0ICE9IDEgIHx8IGlucHV0X3dpZHRoICE9IDEgfHwKKyAgICAgICAgICAgIG91dHB1dF9oZWlnaHQgIT0gMSB8fCBvdXRwdXRfd2lkdGggIT0gMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiIiApOworCisgICAgICAgIENWX0NBTEwobGF5ZXIgPSBjdkNyZWF0ZUNOTkZ1bGxDb25uZWN0TGF5ZXIoIG5faW5wdXRfcGxhbmVzLCBuX291dHB1dF9wbGFuZXMsCisgICAgICAgICAgICBhLCBzLCBpbml0X2xlYXJuX3JhdGUsIGxlYXJuX3R5cGUsIHdlaWdodHMgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgPGxheWVyX3R5cGU+IiApOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCAmJiBsYXllciApCisgICAgICAgIGxheWVyLT5yZWxlYXNlKCAmbGF5ZXIgKTsKKworICAgIGN2UmVsZWFzZU1hdCggJndlaWdodHMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZjb25uZWN0X21hc2sgKTsKKworICAgIHJldHVybiBsYXllcjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpY3ZXcml0ZUNOTkxheWVyKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZDTk5MYXllciogbGF5ZXIgKQoreworICAgIENWX0ZVTkNOQU1FICgiaWN2V3JpdGVDTk5MYXllciIpOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhSUNWX0lTX0NOTl9MQVlFUihsYXllcikgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBsYXllciIgKTsKKworICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIE5VTEwsIENWX05PREVfTUFQLCAib3BlbmN2LW1sLWNubi1sYXllciIgKSk7CisKKyAgICBDVl9DQUxMKGN2V3JpdGVJbnQoIGZzLCAibl9pbnB1dF9wbGFuZXMiLCAgbGF5ZXItPm5faW5wdXRfcGxhbmVzICkpOworICAgIENWX0NBTEwoY3ZXcml0ZUludCggZnMsICJpbnB1dF9oZWlnaHQiLCAgICBsYXllci0+aW5wdXRfaGVpZ2h0ICkpOworICAgIENWX0NBTEwoY3ZXcml0ZUludCggZnMsICJpbnB1dF93aWR0aCIsICAgICBsYXllci0+aW5wdXRfd2lkdGggKSk7CisgICAgQ1ZfQ0FMTChjdldyaXRlSW50KCBmcywgIm5fb3V0cHV0X3BsYW5lcyIsIGxheWVyLT5uX291dHB1dF9wbGFuZXMgKSk7CisgICAgQ1ZfQ0FMTChjdldyaXRlSW50KCBmcywgIm91dHB1dF9oZWlnaHQiLCAgIGxheWVyLT5vdXRwdXRfaGVpZ2h0ICkpOworICAgIENWX0NBTEwoY3ZXcml0ZUludCggZnMsICJvdXRwdXRfd2lkdGgiLCAgICBsYXllci0+b3V0cHV0X3dpZHRoICkpOworICAgIENWX0NBTEwoY3ZXcml0ZUludCggZnMsICJsZWFybl9yYXRlX2RlY3JlYXNlX3R5cGUiLCBsYXllci0+bGVhcm5fcmF0ZV9kZWNyZWFzZV90eXBlKSk7CisgICAgQ1ZfQ0FMTChjdldyaXRlUmVhbCggZnMsICJpbml0X2xlYXJuX3JhdGUiLCBsYXllci0+aW5pdF9sZWFybl9yYXRlICkpOworICAgIENWX0NBTEwoY3ZXcml0ZSggZnMsICJ3ZWlnaHRzIiwgbGF5ZXItPndlaWdodHMgKSk7CisKKyAgICBpZiggSUNWX0lTX0NOTl9DT05WT0xVVElPTl9MQVlFUiggbGF5ZXIgKSkKKyAgICB7CisgICAgICAgIEN2Q05OQ29udm9sdXRpb25MYXllciogbCA9IChDdkNOTkNvbnZvbHV0aW9uTGF5ZXIqKWxheWVyOworICAgICAgICBDVl9DQUxMKGN2V3JpdGVJbnQoIGZzLCAibGF5ZXJfdHlwZSIsIElDVl9DTk5fQ09OVk9MVVRJT05fTEFZRVIgKSk7CisgICAgICAgIENWX0NBTEwoY3ZXcml0ZSggZnMsICJjb25uZWN0X21hc2siLCBsLT5jb25uZWN0X21hc2sgKSk7CisgICAgfQorICAgIGVsc2UgaWYoIElDVl9JU19DTk5fU1VCU0FNUExJTkdfTEFZRVIoIGxheWVyICkgKQorICAgIHsKKyAgICAgICAgQ3ZDTk5TdWJTYW1wbGluZ0xheWVyKiBsID0gKEN2Q05OU3ViU2FtcGxpbmdMYXllciopbGF5ZXI7CisgICAgICAgIENWX0NBTEwoY3ZXcml0ZUludCggZnMsICJsYXllcl90eXBlIiwgSUNWX0NOTl9TVUJTQU1QTElOR19MQVlFUiApKTsKKyAgICAgICAgQ1ZfQ0FMTChjdldyaXRlUmVhbCggZnMsICJhIiwgbC0+YSApKTsKKyAgICAgICAgQ1ZfQ0FMTChjdldyaXRlUmVhbCggZnMsICJzIiwgbC0+cyApKTsKKyAgICB9CisgICAgZWxzZSBpZiggSUNWX0lTX0NOTl9GVUxMQ09OTkVDVF9MQVlFUiggbGF5ZXIgKSApCisgICAgeworICAgICAgICBDdkNOTkZ1bGxDb25uZWN0TGF5ZXIqIGwgPSAoQ3ZDTk5GdWxsQ29ubmVjdExheWVyKilsYXllcjsKKyAgICAgICAgQ1ZfQ0FMTChjdldyaXRlSW50KCBmcywgImxheWVyX3R5cGUiLCBJQ1ZfQ05OX0ZVTExDT05ORUNUX0xBWUVSICkpOworICAgICAgICBDVl9DQUxMKGN2V3JpdGVSZWFsKCBmcywgImEiLCBsLT5hICkpOworICAgICAgICBDVl9DQUxMKGN2V3JpdGVSZWFsKCBmcywgInMiLCBsLT5zICkpOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIGxheWVyIiApOworCisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7IC8vIm9wZW5jdi1tbC1jbm4tbGF5ZXIiCisKKyAgICBfX0VORF9fOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkKiBpY3ZSZWFkQ05OTW9kZWwoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiByb290X25vZGUgKQoreworICAgIEN2Q05OU3RhdE1vZGVsKiBjbm4gPSAwOworICAgIEN2Q05OTGF5ZXIqIGxheWVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJpY3ZSZWFkQ05OTW9kZWwiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkZpbGVOb2RlKiBub2RlOworICAgIEN2U2VxKiBzZXE7CisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIGludCBpOworCisgICAgQ1ZfQ0FMTChjbm4gPSAoQ3ZDTk5TdGF0TW9kZWwqKWN2Q3JlYXRlU3RhdE1vZGVsKAorICAgICAgICBDVl9TVEFUX01PREVMX01BR0lDX1ZBTHxDVl9DTk5fTUFHSUNfVkFMLCBzaXplb2YoQ3ZDTk5TdGF0TW9kZWwpLAorICAgICAgICBpY3ZDTk5Nb2RlbFJlbGVhc2UsIGljdkNOTk1vZGVsUHJlZGljdCwgaWN2Q05OTW9kZWxVcGRhdGUgKSk7CisKKyAgICBDVl9DQUxMKGNubi0+ZXRhbG9ucyA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgcm9vdF9ub2RlLCAiZXRhbG9ucyIgKSk7CisgICAgQ1ZfQ0FMTChjbm4tPmNsc19sYWJlbHMgPSAoQ3ZNYXQqKWN2UmVhZEJ5TmFtZSggZnMsIHJvb3Rfbm9kZSwgImNsc19sYWJlbHMiICkpOworCisgICAgaWYoICFjbm4tPmV0YWxvbnMgfHwgIWNubi0+Y2xzX2xhYmVscyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiTm8gPGV0YWxvbnM+IG9yIDxjbHNfbGFiZWxzPiBpbiBDTk4gbW9kZWwiICk7CisKKyAgICBDVl9DQUxMKCBub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHJvb3Rfbm9kZSwgIm5ldHdvcmsiICkpOworICAgIHNlcSA9IG5vZGUtPmRhdGEuc2VxOworICAgIGlmKCAhQ1ZfTk9ERV9JU19TRVEobm9kZS0+dGFnKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyLCAwICkpOworICAgIENWX0NBTEwobGF5ZXIgPSBpY3ZSZWFkQ05OTGF5ZXIoIGZzLCAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0ciApKTsKKyAgICBDVl9DQUxMKGNubi0+bmV0d29yayA9IGN2Q3JlYXRlQ05OZXR3b3JrKCBsYXllciApKTsKKworICAgIGZvciggaSA9IDE7IGkgPCBzZXEtPnRvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICBDVl9DQUxMKGxheWVyID0gaWN2UmVhZENOTkxheWVyKCBmcywgKEN2RmlsZU5vZGUqKXJlYWRlci5wdHIgKSk7CisgICAgICAgIENWX0NBTEwoY25uLT5uZXR3b3JrLT5hZGRfbGF5ZXIoIGNubi0+bmV0d29yaywgbGF5ZXIgKSk7CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBpZiggY25uICkgY25uLT5yZWxlYXNlKCAoQ3ZTdGF0TW9kZWwqKikmY25uICk7CisgICAgICAgIGlmKCBsYXllciApIGxheWVyLT5yZWxlYXNlKCAmbGF5ZXIgKTsKKyAgICB9CisgICAgcmV0dXJuICh2b2lkKiljbm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQKK2ljdldyaXRlQ05OTW9kZWwoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3RydWN0X3B0ciwgQ3ZBdHRyTGlzdCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreworICAgIENWX0ZVTkNOQU1FICgiaWN2V3JpdGVDTk5Nb2RlbCIpOworICAgIF9fQkVHSU5fXzsKKworICAgIEN2Q05OU3RhdE1vZGVsKiBjbm4gPSAoQ3ZDTk5TdGF0TW9kZWwqKXN0cnVjdF9wdHI7CisgICAgaW50IG5fbGF5ZXJzLCBpOworICAgIEN2Q05OTGF5ZXIqIGxheWVyOworCisgICAgaWYoICFDVl9JU19DTk4oY25uKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJbnZhbGlkIHBvaW50ZXIiICk7CisKKyAgICBuX2xheWVycyA9IGNubi0+bmV0d29yay0+bl9sYXllcnM7CisgICAgCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9NTF9DTk4gKSk7CisKKyAgICBDVl9DQUxMKGN2V3JpdGUoIGZzLCAiZXRhbG9ucyIsIGNubi0+ZXRhbG9ucyApKTsKKyAgICBDVl9DQUxMKGN2V3JpdGUoIGZzLCAiY2xzX2xhYmVscyIsIGNubi0+Y2xzX2xhYmVscyApKTsKKyAgICAKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAibmV0d29yayIsIENWX05PREVfU0VRICkpOworCisgICAgbGF5ZXIgPSBjbm4tPm5ldHdvcmstPmxheWVyczsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbl9sYXllcnMgJiYgbGF5ZXI7IGkrKywgbGF5ZXIgPSBsYXllci0+bmV4dF9sYXllciApCisgICAgICAgIENWX0NBTEwoaWN2V3JpdGVDTk5MYXllciggZnMsIGxheWVyICkpOworICAgIGlmKCBpIDwgbl9sYXllcnMgfHwgbGF5ZXIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBuZXR3b3JrIiApOworCisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7IC8vIm5ldHdvcmsiCisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7IC8vIm9wZW5jdi1tbC1jbm4iCisKKyAgICBfX0VORF9fOworfQorCitzdGF0aWMgaW50IGljdlJlZ2lzdGVyQ05OU3RhdE1vZGVsVHlwZSgpCit7CisgICAgQ3ZUeXBlSW5mbyBpbmZvOworCisgICAgaW5mby5oZWFkZXJfc2l6ZSA9IHNpemVvZiggaW5mbyApOworICAgIGluZm8uaXNfaW5zdGFuY2UgPSBpY3ZJc0NOTk1vZGVsOworICAgIGluZm8ucmVsZWFzZSA9IGljdlJlbGVhc2VDTk5Nb2RlbDsKKyAgICBpbmZvLnJlYWQgPSBpY3ZSZWFkQ05OTW9kZWw7CisgICAgaW5mby53cml0ZSA9IGljdldyaXRlQ05OTW9kZWw7CisgICAgaW5mby5jbG9uZSA9IE5VTEw7CisgICAgaW5mby50eXBlX25hbWUgPSBDVl9UWVBFX05BTUVfTUxfQ05OOworICAgIGN2UmVnaXN0ZXJUeXBlKCAmaW5mbyApOworCisgICAgcmV0dXJuIDE7Cit9IC8vIEVuZCBvZiBpY3ZSZWdpc3RlckNOTlN0YXRNb2RlbFR5cGUKKworc3RhdGljIGludCBjbm4gPSBpY3ZSZWdpc3RlckNOTlN0YXRNb2RlbFR5cGUoKTsKKworI2VuZGlmCisKKy8vIEVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tbC9zcmMvbWxlbS5jcHAgYi9tbC9zcmMvbWxlbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEzZjNmYQotLS0gL2Rldi9udWxsCisrKyBiL21sL3NyYy9tbGVtLmNwcApAQCAtMCwwICsxLDExMTAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0KCBDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWZhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKKworLyoKKyAgIEN2RU06CisgKiBwYXJhbXMubmNsdXN0ZXJzICAgIC0gbnVtYmVyIG9mIGNsdXN0ZXJzIHRvIGNsdXN0ZXIgc2FtcGxlcyB0by4KKyAqIG1lYW5zICAgICAgICAgICAgICAgLSBjYWxjdWxhdGVkIGJ5IHRoZSBFTSBhbGdvcml0aG0gc2V0IG9mIGdhdXNzaWFucycgbWVhbnMuCisgKiBsb2dfd2VpZ2h0X2Rpdl9kZXQgLSBhdXhpbGFyeSB2ZWN0b3IgdGhhdCBrLXRoIGNvbXBvbmVudCBpcyBlcXVhbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgKC0yKSpsbih3ZWlnaHRzX2svZGV0KFNpZ21hX2spXjAuNSksCisgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSA8d2VpZ2h0c19rPiBpcyB0aGUgd2VpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgPFNpZ21hX2s+IGlzIHRoZSBjb3ZhcmlhdGlvbiBtYXRyaWNlIG9mIGstdGggY2x1c3Rlci4KKyAqIGludl9laWdlbl92YWx1ZXMgICAtIHNldCBvZiAxKmRpbXMgbWF0cmljZXMsIDxpbnZfZWlnZW5fdmFsdWVzPltrXSBjb250YWlucworICAgICAgICAgICAgICAgICAgICAgICAgaW52ZXJzZWQgZWlnZW4gdmFsdWVzIG9mIGNvdmFyaWF0aW9uIG1hdHJpY2Ugb2YgdGhlIGstdGggY2x1c3Rlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIDxjb3ZfbWF0X3R5cGU+ID09IENPVl9NQVRfRElBR09OQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZfZWlnZW5fdmFsdWVzW2tdID0gU2lnbWFfa14oLTEpLgorICogY292c19yb3RhdGVfbWF0cyAgIC0gdXNlZCBvbmx5IGlmIGNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX0dFTkVSSUMsIGluIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzIGl0IGlzIE5VTEwuIDxjb3ZzX3JvdGF0ZV9tYXRzPltrXSBpcyB0aGUgb3J0aG9nb25hbAorICAgICAgICAgICAgICAgICAgICAgICAgbWF0cmljZSwgb2J0YWluZWQgYnkgdGhlIFNWRC1kZWNvbXBvc2l0aW9uIG9mIFNpZ21hX2suCisgICBCb3RoIDxpbnZfZWlnZW5fdmFsdWVzPiBhbmQgPGNvdnNfcm90YXRlX21hdHM+IGZpZWxkcyBhcmUgdXNlZCBmb3IgcmVwcmVzZW50YXRpb24gb2YKKyAgIGNvdmFyaWF0aW9uIG1hdHJpY2VzIGFuZCBzaW1wbGlmeWluZyBFTSBjYWxjdWxhdGlvbnMuCisgICBGb3IgZml4ZWQgayBkZW5vdGUKKyAgIHUgPSBjb3ZzX3JvdGF0ZV9tYXRzW2tdLAorICAgdiA9IGludl9laWdlbl92YWx1ZXNba10sCisgICB3ID0gdl4oLTEpOworICAgaWYgPGNvdl9tYXRfdHlwZT4gPT0gQ09WX01BVF9HRU5FUklDLCB0aGVuIFNpZ21hX2sgPSB1IHcgdScsCisgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbWFfayA9IHcuCisgICBTeW1ib2wgJyBtZWFucyB0cmFuc3Bvc2l0aW9uLgorICovCisKKworQ3ZFTTo6Q3ZFTSgpCit7CisgICAgbWVhbnMgPSB3ZWlnaHRzID0gcHJvYnMgPSBpbnZfZWlnZW5fdmFsdWVzID0gbG9nX3dlaWdodF9kaXZfZGV0ID0gMDsKKyAgICBjb3ZzID0gY292X3JvdGF0ZV9tYXRzID0gMDsKK30KKworQ3ZFTTo6Q3ZFTSggY29uc3QgQ3ZNYXQqIHNhbXBsZXMsIGNvbnN0IEN2TWF0KiBzYW1wbGVfaWR4LAorICAgICAgICAgICAgQ3ZFTVBhcmFtcyBwYXJhbXMsIEN2TWF0KiBsYWJlbHMgKQoreworICAgIG1lYW5zID0gd2VpZ2h0cyA9IHByb2JzID0gaW52X2VpZ2VuX3ZhbHVlcyA9IGxvZ193ZWlnaHRfZGl2X2RldCA9IDA7CisgICAgY292cyA9IGNvdl9yb3RhdGVfbWF0cyA9IDA7CisKKyAgICAvLyBqdXN0IGludm9rZSB0aGUgdHJhaW4oKSBtZXRob2QKKyAgICB0cmFpbihzYW1wbGVzLCBzYW1wbGVfaWR4LCBwYXJhbXMsIGxhYmVscyk7Cit9CisKK0N2RU06On5DdkVNKCkKK3sKKyAgICBjbGVhcigpOworfQorCisKK3ZvaWQgQ3ZFTTo6Y2xlYXIoKQoreworICAgIGludCBpOworICAgIAorICAgIGN2UmVsZWFzZU1hdCggJm1lYW5zICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmd2VpZ2h0cyApOworICAgIGN2UmVsZWFzZU1hdCggJnByb2JzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmaW52X2VpZ2VuX3ZhbHVlcyApOworICAgIGN2UmVsZWFzZU1hdCggJmxvZ193ZWlnaHRfZGl2X2RldCApOworCisgICAgaWYoIGNvdnMgfHwgY292X3JvdGF0ZV9tYXRzICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBwYXJhbXMubmNsdXN0ZXJzOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY292cyApCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmY292c1tpXSApOworICAgICAgICAgICAgaWYoIGNvdl9yb3RhdGVfbWF0cyApCisgICAgICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmY292X3JvdGF0ZV9tYXRzW2ldICk7CisgICAgICAgIH0KKyAgICAgICAgY3ZGcmVlKCAmY292cyApOworICAgICAgICBjdkZyZWUoICZjb3Zfcm90YXRlX21hdHMgKTsKKyAgICB9Cit9CisKKwordm9pZCBDdkVNOjpzZXRfcGFyYW1zKCBjb25zdCBDdkVNUGFyYW1zJiBfcGFyYW1zLCBjb25zdCBDdlZlY3RvcnMmIHRyYWluX2RhdGEgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZFTTo6c2V0X3BhcmFtcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKyAgICAKKyAgICBpbnQgazsKKworICAgIHBhcmFtcyA9IF9wYXJhbXM7CisgICAgcGFyYW1zLnRlcm1fY3JpdCA9IGN2Q2hlY2tUZXJtQ3JpdGVyaWEoIHBhcmFtcy50ZXJtX2NyaXQsIDFlLTYsIDEwMDAwICk7CisKKyAgICBpZiggcGFyYW1zLmNvdl9tYXRfdHlwZSAhPSBDT1ZfTUFUX1NQSEVSSUNBTCAmJgorICAgICAgICBwYXJhbXMuY292X21hdF90eXBlICE9IENPVl9NQVRfRElBR09OQUwgJiYKKyAgICAgICAgcGFyYW1zLmNvdl9tYXRfdHlwZSAhPSBDT1ZfTUFUX0dFTkVSSUMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVW5rbm93biBjb3ZhcmlhdGlvbiBtYXRyaXggdHlwZSIgKTsKKworICAgIHN3aXRjaCggcGFyYW1zLnN0YXJ0X3N0ZXAgKQorICAgIHsKKyAgICBjYXNlIFNUQVJUX01fU1RFUDoKKyAgICAgICAgaWYoICFwYXJhbXMucHJvYnMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJQcm9iYWJpbGl0aWVzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gRU0gYWxnb3JpdGhtIHN0YXJ0cyB3aXRoIE0tc3RlcCIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFSVF9FX1NURVA6CisgICAgICAgIGlmKCAhcGFyYW1zLm1lYW5zICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAiTWVhbidzIG11c3QgYmUgc3BlY2lmaWVkIHdoZW4gRU0gYWxnb3JpdGhtIHN0YXJ0cyB3aXRoIEUtc3RlcCIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVEFSVF9BVVRPX1NURVA6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duIHN0YXJ0X3N0ZXAiICk7CisgICAgfQorCisgICAgaWYoIHBhcmFtcy5uY2x1c3RlcnMgPCAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgbnVtYmVyIG9mIGNsdXN0ZXJzIChtaXh0dXJlcykgc2hvdWxkIGJlID4gMCIgKTsKKworICAgIGlmKCBwYXJhbXMucHJvYnMgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZNYXQqIHAgPSBwYXJhbXMud2VpZ2h0czsKKyAgICAgICAgaWYoICFDVl9JU19NQVQocCkgfHwKKyAgICAgICAgICAgIENWX01BVF9UWVBFKHAtPnR5cGUpICE9IENWXzMyRkMxICAmJgorICAgICAgICAgICAgQ1ZfTUFUX1RZUEUocC0+dHlwZSkgIT0gQ1ZfNjRGQzEgfHwKKyAgICAgICAgICAgIHAtPnJvd3MgIT0gdHJhaW5fZGF0YS5jb3VudCB8fAorICAgICAgICAgICAgcC0+Y29scyAhPSBwYXJhbXMubmNsdXN0ZXJzICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgYXJyYXkgb2YgcHJvYmFiaWxpdGllcyBtdXN0IGJlIGEgdmFsaWQgIgorICAgICAgICAgICAgImZsb2F0aW5nLXBvaW50IG1hdHJpeCAoQ3ZNYXQpIG9mICduc2FtcGxlcycgeCAnbmNsdXN0ZXJzJyBzaXplIiApOworICAgIH0KKworICAgIGlmKCBwYXJhbXMubWVhbnMgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZNYXQqIG0gPSBwYXJhbXMubWVhbnM7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKG0pIHx8CisgICAgICAgICAgICBDVl9NQVRfVFlQRShtLT50eXBlKSAhPSBDVl8zMkZDMSAgJiYKKyAgICAgICAgICAgIENWX01BVF9UWVBFKG0tPnR5cGUpICE9IENWXzY0RkMxIHx8CisgICAgICAgICAgICBtLT5yb3dzICE9IHBhcmFtcy5uY2x1c3RlcnMgfHwKKyAgICAgICAgICAgIG0tPmNvbHMgIT0gdHJhaW5fZGF0YS5kaW1zICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJUaGUgYXJyYXkgb2YgbWVhbidzIG11c3QgYmUgYSB2YWxpZCAiCisgICAgICAgICAgICAiZmxvYXRpbmctcG9pbnQgbWF0cml4IChDdk1hdCkgb2YgJ25zYW1wbGVzJyB4ICdkaW1zJyBzaXplIiApOworICAgIH0KKworICAgIGlmKCBwYXJhbXMud2VpZ2h0cyApCisgICAgeworICAgICAgICBjb25zdCBDdk1hdCogdyA9IHBhcmFtcy53ZWlnaHRzOworICAgICAgICBpZiggIUNWX0lTX01BVCh3KSB8fAorICAgICAgICAgICAgQ1ZfTUFUX1RZUEUody0+dHlwZSkgIT0gQ1ZfMzJGQzEgICYmCisgICAgICAgICAgICBDVl9NQVRfVFlQRSh3LT50eXBlKSAhPSBDVl82NEZDMSB8fAorICAgICAgICAgICAgdy0+cm93cyAhPSAxICYmIHctPmNvbHMgIT0gMSB8fAorICAgICAgICAgICAgdy0+cm93cyArIHctPmNvbHMgLSAxICE9IHBhcmFtcy5uY2x1c3RlcnMgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBhcnJheSBvZiB3ZWlnaHRzIG11c3QgYmUgYSB2YWxpZCAiCisgICAgICAgICAgICAiMWQgZmxvYXRpbmctcG9pbnQgdmVjdG9yIChDdk1hdCkgb2YgJ25jbHVzdGVycycgZWxlbWVudHMiICk7CisgICAgfQorCisgICAgaWYoIHBhcmFtcy5jb3ZzICkKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IHBhcmFtcy5uY2x1c3RlcnM7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBjb3YgPSBwYXJhbXMuY292c1trXTsKKyAgICAgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGNvdikgfHwKKyAgICAgICAgICAgICAgICBDVl9NQVRfVFlQRShjb3YtPnR5cGUpICE9IENWXzMyRkMxICAmJgorICAgICAgICAgICAgICAgIENWX01BVF9UWVBFKGNvdi0+dHlwZSkgIT0gQ1ZfNjRGQzEgfHwKKyAgICAgICAgICAgICAgICBjb3YtPnJvd3MgIT0gY292LT5jb2xzIHx8IGNvdi0+Y29scyAhPSB0cmFpbl9kYXRhLmRpbXMgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgIkVhY2ggb2YgY292YXJpYXRpb24gbWF0cmljZXMgbXVzdCBiZSBhIHZhbGlkIHNxdWFyZSAiCisgICAgICAgICAgICAgICAgImZsb2F0aW5nLXBvaW50IG1hdHJpeCAoQ3ZNYXQpIG9mICdkaW1zJyB4ICdkaW1zJyIgKTsKKyAgICAgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2Zsb2F0CitDdkVNOjpwcmVkaWN0KCBjb25zdCBDdk1hdCogX3NhbXBsZSwgQ3ZNYXQqIF9wcm9icyApIGNvbnN0Cit7CisgICAgZmxvYXQqIHNhbXBsZV9kYXRhICAgPSAwOworICAgIHZvaWQqIGJ1ZmZlciA9IDA7CisgICAgaW50IGFsbG9jYXRlZF9idWZmZXIgPSAwOworICAgIGludCBjbHMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdkVNOjpwcmVkaWN0IiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCBrLCBkaW1zOworICAgIGludCBuY2x1c3RlcnM7CisgICAgaW50IGNvdl9tYXRfdHlwZSA9IHBhcmFtcy5jb3ZfbWF0X3R5cGU7CisgICAgZG91YmxlIG9wdCA9IEZMVF9NQVg7CisgICAgc2l6ZV90IHNpemU7CisgICAgQ3ZNYXQgZGlmZiwgZXhwbzsKKworICAgIGRpbXMgPSBtZWFucy0+Y29sczsKKyAgICBuY2x1c3RlcnMgPSBwYXJhbXMubmNsdXN0ZXJzOworCisgICAgQ1ZfQ0FMTCggY3ZQcmVwYXJlUHJlZGljdERhdGEoIF9zYW1wbGUsIGRpbXMsIDAsIHBhcmFtcy5uY2x1c3RlcnMsIF9wcm9icywgJnNhbXBsZV9kYXRhICkpOworCisvLyBhbGxvY2F0ZSBtZW1vcnkgYW5kIGluaXRpYWxpemluZyBoZWFkZXJzIGZvciBjYWxjdWxhdGluZworICAgIHNpemUgPSBzaXplb2YoZG91YmxlKSAqIChuY2x1c3RlcnMgKyBkaW1zKTsKKyAgICBpZiggc2l6ZSA8PSBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyggc2l6ZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9IGN2QWxsb2MoIHNpemUgKSk7CisgICAgICAgIGFsbG9jYXRlZF9idWZmZXIgPSAxOworICAgIH0KKyAgICBleHBvID0gY3ZNYXQoIDEsIG5jbHVzdGVycywgQ1ZfNjRGQzEsIGJ1ZmZlciApOworICAgIGRpZmYgPSBjdk1hdCggMSwgZGltcywgQ1ZfNjRGQzEsIChkb3VibGUqKWJ1ZmZlciArIG5jbHVzdGVycyApOworCisvLyBjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXRpZXMKKyAgICBmb3IoIGsgPSAwOyBrIDwgbmNsdXN0ZXJzOyBrKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlKiBtZWFuX2sgPSAoY29uc3QgZG91YmxlKikobWVhbnMtPmRhdGEucHRyICsgbWVhbnMtPnN0ZXAqayk7CisgICAgICAgIGNvbnN0IGRvdWJsZSogdyA9IChjb25zdCBkb3VibGUqKShpbnZfZWlnZW5fdmFsdWVzLT5kYXRhLnB0ciArIGludl9laWdlbl92YWx1ZXMtPnN0ZXAqayk7CisgICAgICAgIGRvdWJsZSBjdXIgPSBsb2dfd2VpZ2h0X2Rpdl9kZXQtPmRhdGEuZGJba107CisgICAgICAgIEN2TWF0KiB1ID0gY292X3JvdGF0ZV9tYXRzW2tdOworICAgICAgICAvLyBjb3YgPSB1IHcgdScgIC0tPiAgY292XigtMSkgPSB1IHdeKC0xKSB1JworICAgICAgICBpZiggY292X21hdF90eXBlID09IENPVl9NQVRfU1BIRVJJQ0FMICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHcwID0gd1swXTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSBzYW1wbGVfZGF0YVtpXSAtIG1lYW5fa1tpXTsKKyAgICAgICAgICAgICAgICBjdXIgKz0gdmFsKnZhbCp3MDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBkaW1zOyBpKysgKQorICAgICAgICAgICAgICAgIGRpZmYuZGF0YS5kYltpXSA9IHNhbXBsZV9kYXRhW2ldIC0gbWVhbl9rW2ldOworICAgICAgICAgICAgaWYoIGNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX0dFTkVSSUMgKQorICAgICAgICAgICAgICAgIGN2R0VNTSggJmRpZmYsIHUsIDEsIDAsIDAsICZkaWZmLCBDVl9HRU1NX0JfVCApOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGRpbXM7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IGRpZmYuZGF0YS5kYltpXTsKKyAgICAgICAgICAgICAgICBjdXIgKz0gdmFsKnZhbCp3W2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZXhwby5kYXRhLmRiW2tdID0gY3VyOworICAgICAgICBpZiggY3VyIDwgb3B0ICkKKyAgICAgICAgeworICAgICAgICAgICAgY2xzID0gazsKKyAgICAgICAgICAgIG9wdCA9IGN1cjsKKyAgICAgICAgfQorICAgICAgICAvKiBwcm9iYWJpbGl0eSA9ICgyKnBpKV4oLWRpbXMvMikqZXhwKCAtMC41ICogY3VyICkgKi8KKyAgICB9CisKKyAgICBpZiggX3Byb2JzICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2Q29udmVydFNjYWxlKCAmZXhwbywgJmV4cG8sIC0wLjUgKSk7CisgICAgICAgIENWX0NBTEwoIGN2RXhwKCAmZXhwbywgJmV4cG8gKSk7CisgICAgICAgIGlmKCBfcHJvYnMtPmNvbHMgPT0gMSApCisgICAgICAgICAgICBDVl9DQUxMKCBjdlJlc2hhcGUoICZleHBvLCAmZXhwbywgMCwgbmNsdXN0ZXJzICkpOworICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnRTY2FsZSggJmV4cG8sIF9wcm9icywgMS4vY3ZTdW0oICZleHBvICkudmFsWzBdICkpOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggc2FtcGxlX2RhdGEgIT0gX3NhbXBsZS0+ZGF0YS5mbCApCisgICAgICAgIGN2RnJlZSggJnNhbXBsZV9kYXRhICk7CisgICAgaWYoIGFsbG9jYXRlZF9idWZmZXIgKQorICAgICAgICBjdkZyZWUoICZidWZmZXIgKTsKKworICAgIHJldHVybiAoZmxvYXQpY2xzOworfQorCisKKworYm9vbCBDdkVNOjp0cmFpbiggY29uc3QgQ3ZNYXQqIF9zYW1wbGVzLCBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHgsCisgICAgICAgICAgICAgICAgICBDdkVNUGFyYW1zIF9wYXJhbXMsIEN2TWF0KiBsYWJlbHMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgQ3ZWZWN0b3JzIHRyYWluX2RhdGE7CisgICAgQ3ZNYXQqIHNhbXBsZV9pZHggPSAwOworCisgICAgdHJhaW5fZGF0YS5kYXRhLmZsID0gMDsKKyAgICB0cmFpbl9kYXRhLmNvdW50ID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdkVNIik7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgbnNhbXBsZXMsIG5jbHVzdGVycywgZGltczsKKworICAgIGNsZWFyKCk7CisKKyAgICBDVl9DQUxMKCBjdlByZXBhcmVUcmFpbkRhdGEoICJjdkVNIiwKKyAgICAgICAgX3NhbXBsZXMsIENWX1JPV19TQU1QTEUsIDAsIENWX1ZBUl9DQVRFR09SSUNBTCwKKyAgICAgICAgMCwgX3NhbXBsZV9pZHgsIGZhbHNlLCAoY29uc3QgZmxvYXQqKiopJnRyYWluX2RhdGEuZGF0YS5mbCwKKyAgICAgICAgJnRyYWluX2RhdGEuY291bnQsICZ0cmFpbl9kYXRhLmRpbXMsICZ0cmFpbl9kYXRhLmRpbXMsCisgICAgICAgIDAsIDAsIDAsICZzYW1wbGVfaWR4ICkpOworCisgICAgQ1ZfQ0FMTCggc2V0X3BhcmFtcyggX3BhcmFtcywgdHJhaW5fZGF0YSApKTsKKyAgICBuc2FtcGxlcyA9IHRyYWluX2RhdGEuY291bnQ7CisgICAgbmNsdXN0ZXJzID0gcGFyYW1zLm5jbHVzdGVyczsKKyAgICBkaW1zID0gdHJhaW5fZGF0YS5kaW1zOworCisgICAgaWYoIGxhYmVscyAmJiAoIUNWX0lTX01BVChsYWJlbHMpIHx8IENWX01BVF9UWVBFKGxhYmVscy0+dHlwZSkgIT0gQ1ZfMzJTQzEgfHwKKyAgICAgICAgbGFiZWxzLT5jb2xzICE9IDEgJiYgbGFiZWxzLT5yb3dzICE9IDEgfHwgbGFiZWxzLT5jb2xzICsgbGFiZWxzLT5yb3dzIC0gMSAhPSBuc2FtcGxlcyApKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAibGFiZWxzIGFycmF5ICh3aGVuIHBhc3NlZCkgbXVzdCBiZSBhIHZhbGlkIDFkIGludGVnZXIgdmVjdG9yIG9mIDxzYW1wbGVfY291bnQ+IGVsZW1lbnRzIiApOworCisgICAgaWYoIG5zYW1wbGVzIDw9IG5jbHVzdGVycyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAiVGhlIG51bWJlciBvZiBzYW1wbGVzIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhlIG51bWJlciBvZiBjbHVzdGVycyIgKTsKKworICAgIENWX0NBTEwoIGxvZ193ZWlnaHRfZGl2X2RldCA9IGN2Q3JlYXRlTWF0KCAxLCBuY2x1c3RlcnMsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIHByb2JzICA9IGN2Q3JlYXRlTWF0KCBuc2FtcGxlcywgbmNsdXN0ZXJzLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBtZWFucyA9IGN2Q3JlYXRlTWF0KCBuY2x1c3RlcnMsIGRpbXMsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIHdlaWdodHMgPSBjdkNyZWF0ZU1hdCggMSwgbmNsdXN0ZXJzLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBpbnZfZWlnZW5fdmFsdWVzID0gY3ZDcmVhdGVNYXQoIG5jbHVzdGVycywKKyAgICAgICAgcGFyYW1zLmNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX1NQSEVSSUNBTCA/IDEgOiBkaW1zLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBjb3ZzID0gKEN2TWF0KiopY3ZBbGxvYyggbmNsdXN0ZXJzICogc2l6ZW9mKCpjb3ZzKSApKTsKKyAgICBDVl9DQUxMKCBjb3Zfcm90YXRlX21hdHMgPSAoQ3ZNYXQqKiljdkFsbG9jKCBuY2x1c3RlcnMgKiBzaXplb2YoY292X3JvdGF0ZV9tYXRzWzBdKSApKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBuY2x1c3RlcnM7IGkrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjb3ZzW2ldID0gY3ZDcmVhdGVNYXQoIGRpbXMsIGRpbXMsIENWXzY0RkMxICkpOworICAgICAgICBDVl9DQUxMKCBjb3Zfcm90YXRlX21hdHNbaV0gID0gY3ZDcmVhdGVNYXQoIGRpbXMsIGRpbXMsIENWXzY0RkMxICkpOworICAgICAgICBjdlplcm8oIGNvdl9yb3RhdGVfbWF0c1tpXSApOworICAgIH0KKworICAgIGluaXRfZW0oIHRyYWluX2RhdGEgKTsKKyAgICBsb2dfbGlrZWxpaG9vZCA9IHJ1bl9lbSggdHJhaW5fZGF0YSApOworICAgIGlmKCBsb2dfbGlrZWxpaG9vZCA8PSAtREJMX01BWC8xMDAwMC4gKQorICAgICAgICBFWElUOworCisgICAgaWYoIGxhYmVscyApCisgICAgeworICAgICAgICBpZiggbmNsdXN0ZXJzID09IDEgKQorICAgICAgICAgICAgY3ZaZXJvKCBsYWJlbHMgKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdk1hdCBzYW1wbGUgPSBjdk1hdCggMSwgZGltcywgQ1ZfMzJGICk7CisgICAgICAgICAgICBDdk1hdCBwcm9iID0gY3ZNYXQoIDEsIG5jbHVzdGVycywgQ1ZfNjRGICk7CisgICAgICAgICAgICBpbnQgbHN0ZXAgPSBDVl9JU19NQVRfQ09OVChsYWJlbHMtPnR5cGUpID8gMSA6IGxhYmVscy0+c3RlcC9zaXplb2YoaW50KTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBzYW1wbGVfaWR4ID8gc2FtcGxlX2lkeC0+ZGF0YS5pW2ldIDogaTsKKyAgICAgICAgICAgICAgICBzYW1wbGUuZGF0YS5wdHIgPSBfc2FtcGxlcy0+ZGF0YS5wdHIgKyBfc2FtcGxlcy0+c3RlcCppZHg7CisgICAgICAgICAgICAgICAgcHJvYi5kYXRhLnB0ciA9IHByb2JzLT5kYXRhLnB0ciArIHByb2JzLT5zdGVwKmk7CisKKyAgICAgICAgICAgICAgICBsYWJlbHMtPmRhdGEuaVtpKmxzdGVwXSA9IGN2Um91bmQocHJlZGljdCgmc2FtcGxlLCAmcHJvYikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0ID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggc2FtcGxlX2lkeCAhPSBfc2FtcGxlX2lkeCApCisgICAgICAgIGN2UmVsZWFzZU1hdCggJnNhbXBsZV9pZHggKTsKKworICAgIGN2RnJlZSggJnRyYWluX2RhdGEuZGF0YS5wdHIgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKwordm9pZCBDdkVNOjppbml0X2VtKCBjb25zdCBDdlZlY3RvcnMmIHRyYWluX2RhdGEgKQoreworICAgIEN2TWF0ICp3ID0gMCwgKnUgPSAwLCAqdGNvdiA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdkVNOjppbml0X2VtIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgZG91YmxlIG1heHZhbCA9IDA7CisgICAgaW50IGksIGZvcmNlX3N5bW1fcGx1cyA9IDA7CisgICAgaW50IG5jbHVzdGVycyA9IHBhcmFtcy5uY2x1c3RlcnMsIG5zYW1wbGVzID0gdHJhaW5fZGF0YS5jb3VudCwgZGltcyA9IHRyYWluX2RhdGEuZGltczsKKworICAgIGlmKCBwYXJhbXMuc3RhcnRfc3RlcCA9PSBTVEFSVF9BVVRPX1NURVAgfHwgbmNsdXN0ZXJzID09IDEgfHwgbmNsdXN0ZXJzID09IG5zYW1wbGVzICkKKyAgICAgICAgaW5pdF9hdXRvKCB0cmFpbl9kYXRhICk7CisgICAgZWxzZSBpZiggcGFyYW1zLnN0YXJ0X3N0ZXAgPT0gU1RBUlRfTV9TVEVQICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZNYXQgcHJvYjsKKyAgICAgICAgICAgIGN2R2V0Um93KCBwYXJhbXMucHJvYnMsICZwcm9iLCBpICk7CisgICAgICAgICAgICBjdk1heFMoICZwcm9iLCAwLiwgJnByb2IgKTsKKyAgICAgICAgICAgIGN2TWluTWF4TG9jKCAmcHJvYiwgMCwgJm1heHZhbCApOworICAgICAgICAgICAgaWYoIG1heHZhbCA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICBjdlNldCggJnByb2IsIGN2U2NhbGFyKDEuL25jbHVzdGVycykgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBjdk5vcm1hbGl6ZSggJnByb2IsICZwcm9iLCAxLiwgMCwgQ1ZfTDEgKTsKKyAgICAgICAgfQorICAgICAgICBFWElUOyAvLyBkbyBub3QgcHJlcHJvY2VzcyBjb3ZhcmlhdGlvbiBtYXRyaWNlcywKKyAgICAgICAgICAgICAgLy8gYXMgaW4gdGhpcyBjYXNlIHRoZXkgYXJlIGluaXRpYWxpemVkIGF0IHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgRU0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgQ1ZfQVNTRVJUKCBwYXJhbXMuc3RhcnRfc3RlcCA9PSBTVEFSVF9FX1NURVAgJiYgcGFyYW1zLm1lYW5zICk7CisgICAgICAgIGlmKCBwYXJhbXMud2VpZ2h0cyAmJiBwYXJhbXMuY292cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Q29udmVydCggcGFyYW1zLm1lYW5zLCBtZWFucyApOworICAgICAgICAgICAgY3ZSZXNoYXBlKCB3ZWlnaHRzLCB3ZWlnaHRzLCAxLCBwYXJhbXMud2VpZ2h0cy0+cm93cyApOworICAgICAgICAgICAgY3ZDb252ZXJ0KCBwYXJhbXMud2VpZ2h0cywgd2VpZ2h0cyApOworICAgICAgICAgICAgY3ZSZXNoYXBlKCB3ZWlnaHRzLCB3ZWlnaHRzLCAxLCAxICk7CisgICAgICAgICAgICBjdk1heFMoIHdlaWdodHMsIDAuLCB3ZWlnaHRzICk7CisgICAgICAgICAgICBjdk1pbk1heExvYyggd2VpZ2h0cywgMCwgJm1heHZhbCApOworICAgICAgICAgICAgaWYoIG1heHZhbCA8IEZMVF9FUFNJTE9OICkKKyAgICAgICAgICAgICAgICBjdlNldCggJndlaWdodHMsIGN2U2NhbGFyKDEuL25jbHVzdGVycykgKTsKKyAgICAgICAgICAgIGN2Tm9ybWFsaXplKCB3ZWlnaHRzLCB3ZWlnaHRzLCAxLiwgMCwgQ1ZfTDEgKTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY2x1c3RlcnM7IGkrKyApCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0KCBwYXJhbXMuY292c1tpXSwgY292c1tpXSApKTsKKyAgICAgICAgICAgIGZvcmNlX3N5bW1fcGx1cyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgaW5pdF9hdXRvKCB0cmFpbl9kYXRhICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggdGNvdiA9IGN2Q3JlYXRlTWF0KCBkaW1zLCBkaW1zLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCB3ID0gY3ZDcmVhdGVNYXQoIGRpbXMsIGRpbXMsIENWXzY0RkMxICkpOworICAgIGlmKCBwYXJhbXMuY292X21hdF90eXBlID09IENPVl9NQVRfR0VORVJJQyApCisgICAgICAgIENWX0NBTEwoIHUgPSBjdkNyZWF0ZU1hdCggZGltcywgZGltcywgQ1ZfNjRGQzEgKSk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmNsdXN0ZXJzOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIGZvcmNlX3N5bW1fcGx1cyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2VHJhbnNwb3NlKCBjb3ZzW2ldLCB0Y292ICk7CisgICAgICAgICAgICBjdkFkZFdlaWdodGVkKCBjb3ZzW2ldLCAwLjUsIHRjb3YsIDAuNSwgMCwgdGNvdiApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGN2Q29weSggY292c1tpXSwgdGNvdiApOworICAgICAgICBjdlNWRCggdGNvdiwgdywgdSwgMCwgQ1ZfU1ZEX01PRElGWV9BICsgQ1ZfU1ZEX1VfVCArIENWX1NWRF9WX1QgKTsKKyAgICAgICAgaWYoIHBhcmFtcy5jb3ZfbWF0X3R5cGUgPT0gQ09WX01BVF9TUEhFUklDQUwgKQorICAgICAgICAgICAgY3ZTZXRJZGVudGl0eSggY292c1tpXSwgY3ZTY2FsYXIoY3ZUcmFjZSh3KS52YWxbMF0vZGltcykgKTsKKyAgICAgICAgZWxzZSBpZiggcGFyYW1zLmNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX0RJQUdPTkFMICkKKyAgICAgICAgICAgIGN2Q29weSggdywgY292c1tpXSApOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGdlbmVyaWMgY2FzZTogY292c1tpXSA9ICh1JyknKm1heCh3LDApKnUnCisgICAgICAgICAgICBjdkdFTU0oIHUsIHcsIDEsIDAsIDAsIHRjb3YsIENWX0dFTU1fQV9UICk7CisgICAgICAgICAgICBjdkdFTU0oIHRjb3YsIHUsIDEsIDAsIDAsIGNvdnNbaV0sIDAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZ3ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdSApOworICAgIGN2UmVsZWFzZU1hdCggJnRjb3YgKTsKK30KKworCit2b2lkIEN2RU06OmluaXRfYXV0byggY29uc3QgQ3ZWZWN0b3JzJiB0cmFpbl9kYXRhICkKK3sKKyAgICBDdk1hdCogaGRyID0gMDsKKyAgICBjb25zdCB2b2lkKiogdmVjID0gMDsKKyAgICBDdk1hdCogY2xhc3NfcmFuZ2VzID0gMDsKKyAgICBDdk1hdCogbGFiZWxzID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZFTTo6aW5pdF9hdXRvIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5jbHVzdGVycyA9IHBhcmFtcy5uY2x1c3RlcnMsIG5zYW1wbGVzID0gdHJhaW5fZGF0YS5jb3VudCwgZGltcyA9IHRyYWluX2RhdGEuZGltczsKKyAgICBpbnQgaSwgajsKKworICAgIGlmKCBuY2x1c3RlcnMgPT0gbnNhbXBsZXMgKQorICAgIHsKKyAgICAgICAgQ3ZNYXQgc3JjID0gY3ZNYXQoIDEsIGRpbXMsIENWXzMyRiApOworICAgICAgICBDdk1hdCBkc3QgPSBjdk1hdCggMSwgZGltcywgQ1ZfNjRGICk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgc3JjLmRhdGEucHRyID0gdHJhaW5fZGF0YS5kYXRhLnB0cltpXTsKKyAgICAgICAgICAgIGRzdC5kYXRhLnB0ciA9IG1lYW5zLT5kYXRhLnB0ciArIG1lYW5zLT5zdGVwKmk7CisgICAgICAgICAgICBjdkNvbnZlcnQoICZzcmMsICZkc3QgKTsKKyAgICAgICAgICAgIGN2WmVybyggY292c1tpXSApOworICAgICAgICAgICAgY3ZTZXRJZGVudGl0eSggY292X3JvdGF0ZV9tYXRzW2ldICk7CisgICAgICAgIH0KKyAgICAgICAgY3ZTZXRJZGVudGl0eSggcHJvYnMgKTsKKyAgICAgICAgY3ZTZXQoIHdlaWdodHMsIGN2U2NhbGFyKDEuL25jbHVzdGVycykgKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IG1heF9jb3VudCA9IDA7CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBjbGFzc19yYW5nZXMgPSBjdkNyZWF0ZU1hdCggMSwgbmNsdXN0ZXJzKzEsIENWXzMyU0MxICkpOworICAgICAgICBpZiggbmNsdXN0ZXJzID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGxhYmVscyA9IGN2Q3JlYXRlTWF0KCAxLCBuc2FtcGxlcywgQ1ZfMzJTQzEgKSk7CisgICAgICAgICAgICBrbWVhbnMoIHRyYWluX2RhdGEsIG5jbHVzdGVycywgbGFiZWxzLCBjdlRlcm1Dcml0ZXJpYSggQ1ZfVEVSTUNSSVRfSVRFUiwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm1lYW5zID8gMSA6IDEwLCAwLjUgKSwgcGFyYW1zLm1lYW5zICk7CisgICAgICAgICAgICBDVl9DQUxMKCBjdlNvcnRTYW1wbGVzQnlDbGFzc2VzKCAoY29uc3QgZmxvYXQqKil0cmFpbl9kYXRhLmRhdGEuZmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscywgY2xhc3NfcmFuZ2VzLT5kYXRhLmkgKSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjbGFzc19yYW5nZXMtPmRhdGEuaVswXSA9IDA7CisgICAgICAgICAgICBjbGFzc19yYW5nZXMtPmRhdGEuaVsxXSA9IG5zYW1wbGVzOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5jbHVzdGVyczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGxlZnQgPSBjbGFzc19yYW5nZXMtPmRhdGEuaVtpXSwgcmlnaHQgPSBjbGFzc19yYW5nZXMtPmRhdGEuaVtpKzFdOworICAgICAgICAgICAgbWF4X2NvdW50ID0gTUFYKCBtYXhfY291bnQsIHJpZ2h0IC0gbGVmdCApOworICAgICAgICB9CisgICAgICAgIENWX0NBTEwoIGhkciA9IChDdk1hdCopY3ZBbGxvYyggbWF4X2NvdW50KnNpemVvZihoZHJbMF0pICkpOworICAgICAgICBDVl9DQUxMKCB2ZWMgPSAoY29uc3Qgdm9pZCoqKWN2QWxsb2MoIG1heF9jb3VudCpzaXplb2YodmVjWzBdKSApKTsKKyAgICAgICAgaGRyWzBdID0gY3ZNYXQoIDEsIGRpbXMsIENWXzMyRiApOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbWF4X2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICB2ZWNbaV0gPSBoZHIgKyBpOworICAgICAgICAgICAgaGRyW2ldID0gaGRyWzBdOworICAgICAgICB9CisgICAgICAgICAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY2x1c3RlcnM7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBsZWZ0ID0gY2xhc3NfcmFuZ2VzLT5kYXRhLmlbaV0sIHJpZ2h0ID0gY2xhc3NfcmFuZ2VzLT5kYXRhLmlbaSsxXTsKKyAgICAgICAgICAgIGludCBjbHVzdGVyX3NpemUgPSByaWdodCAtIGxlZnQ7CisgICAgICAgICAgICBDdk1hdCBhdmc7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBjbHVzdGVyX3NpemUgPD0gMCApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIGZvciggaiA9IGxlZnQ7IGogPCByaWdodDsgaisrICkKKyAgICAgICAgICAgICAgICBoZHJbaiAtIGxlZnRdLmRhdGEuZmwgPSB0cmFpbl9kYXRhLmRhdGEuZmxbal07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIENWX0NBTEwoIGN2R2V0Um93KCBtZWFucywgJmF2ZywgaSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q2FsY0NvdmFyTWF0cml4KCB2ZWMsIGNsdXN0ZXJfc2l6ZSwgY292c1tpXSwKKyAgICAgICAgICAgICAgICAmYXZnLCBDVl9DT1ZBUl9OT1JNQUwgfCBDVl9DT1ZBUl9TQ0FMRSApKTsKKyAgICAgICAgICAgIHdlaWdodHMtPmRhdGEuZGJbaV0gPSAoZG91YmxlKWNsdXN0ZXJfc2l6ZS8oZG91YmxlKW5zYW1wbGVzOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmNsYXNzX3JhbmdlcyApOworICAgIGN2UmVsZWFzZU1hdCggJmxhYmVscyApOworICAgIGN2RnJlZSggJmhkciApOworICAgIGN2RnJlZSggJnZlYyApOworfQorCisKK3ZvaWQgQ3ZFTTo6a21lYW5zKCBjb25zdCBDdlZlY3RvcnMmIHRyYWluX2RhdGEsIGludCBuY2x1c3RlcnMsIEN2TWF0KiBsYWJlbHMsCisgICAgICAgICAgICAgICAgICAgQ3ZUZXJtQ3JpdGVyaWEgdGVybWNyaXQsIGNvbnN0IEN2TWF0KiBjZW50ZXJzMCApCit7CisgICAgQ3ZNYXQqIGNlbnRlcnMgPSAwOworICAgIEN2TWF0KiBvbGRfY2VudGVycyA9IDA7CisgICAgQ3ZNYXQqIGNvdW50ZXJzID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggIkN2RU06OmttZWFucyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2Uk5HIHJuZyA9IGN2Uk5HKC0xKTsKKyAgICBpbnQgaSwgaiwgaywgbnNhbXBsZXMsIGRpbXM7CisgICAgaW50IGl0ZXIgPSAwOworICAgIGRvdWJsZSBtYXhfZGlzdCA9IERCTF9NQVg7CisKKyAgICB0ZXJtY3JpdCA9IGN2Q2hlY2tUZXJtQ3JpdGVyaWEoIHRlcm1jcml0LCAxZS02LCAxMDAgKTsKKyAgICB0ZXJtY3JpdC5lcHNpbG9uICo9IHRlcm1jcml0LmVwc2lsb247CisgICAgbnNhbXBsZXMgPSB0cmFpbl9kYXRhLmNvdW50OworICAgIGRpbXMgPSB0cmFpbl9kYXRhLmRpbXM7CisgICAgbmNsdXN0ZXJzID0gTUlOKCBuY2x1c3RlcnMsIG5zYW1wbGVzICk7CisKKyAgICBDVl9DQUxMKCBjZW50ZXJzID0gY3ZDcmVhdGVNYXQoIG5jbHVzdGVycywgZGltcywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggb2xkX2NlbnRlcnMgPSBjdkNyZWF0ZU1hdCggbmNsdXN0ZXJzLCBkaW1zLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBjb3VudGVycyA9IGN2Q3JlYXRlTWF0KCAxLCBuY2x1c3RlcnMsIENWXzMyU0MxICkpOworICAgIGN2WmVybyggb2xkX2NlbnRlcnMgKTsKKworICAgIGlmKCBjZW50ZXJzMCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnQoIGNlbnRlcnMwLCBjZW50ZXJzICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKyApCisgICAgICAgICAgICBsYWJlbHMtPmRhdGEuaVtpXSA9IGkqbmNsdXN0ZXJzL25zYW1wbGVzOworICAgICAgICBjdlJhbmRTaHVmZmxlKCBsYWJlbHMsICZybmcgKTsKKyAgICB9CisKKyAgICBmb3IoIDs7ICkKKyAgICB7CisgICAgICAgIEN2TWF0KiB0ZW1wOworCisgICAgICAgIGlmKCBpdGVyID4gMCB8fCBjZW50ZXJzMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogcyA9IHRyYWluX2RhdGEuZGF0YS5mbFtpXTsKKyAgICAgICAgICAgICAgICBpbnQga19iZXN0ID0gMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWluX2Rpc3QgPSBEQkxfTUFYOworCisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IG5jbHVzdGVyczsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYyA9IChkb3VibGUqKShjZW50ZXJzLT5kYXRhLnB0ciArIGsqY2VudGVycy0+c3RlcCk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBkaXN0ID0gMDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8PSBkaW1zIC0gNDsgaiArPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQwID0gY1tqXSAtIHNbal07CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdDEgPSBjW2orMV0gLSBzW2orMV07CisgICAgICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHQwKnQwICsgdDEqdDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0MCA9IGNbaisyXSAtIHNbaisyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQxID0gY1tqKzNdIC0gc1tqKzNdOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCArPSB0MCp0MCArIHQxKnQxOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdCA9IGNbal0gLSBzW2pdOworICAgICAgICAgICAgICAgICAgICAgICAgZGlzdCArPSB0KnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1pbl9kaXN0ID4gZGlzdCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbl9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtfYmVzdCA9IGs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsYWJlbHMtPmRhdGEuaVtpXSA9IGtfYmVzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCArK2l0ZXIgPiB0ZXJtY3JpdC5tYXhfaXRlciApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBDVl9TV0FQKCBjZW50ZXJzLCBvbGRfY2VudGVycywgdGVtcCApOworICAgICAgICBjdlplcm8oIGNlbnRlcnMgKTsKKyAgICAgICAgY3ZaZXJvKCBjb3VudGVycyApOworCisgICAgICAgIC8vIHVwZGF0ZSBjZW50ZXJzCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgZmxvYXQqIHMgPSB0cmFpbl9kYXRhLmRhdGEuZmxbaV07CisgICAgICAgICAgICBrID0gbGFiZWxzLT5kYXRhLmlbaV07CisgICAgICAgICAgICBkb3VibGUqIGMgPSAoZG91YmxlKikoY2VudGVycy0+ZGF0YS5wdHIgKyBrKmNlbnRlcnMtPnN0ZXApOworCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDw9IGRpbXMgLSA0OyBqICs9IDQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IGNbal0gKyBzW2pdOworICAgICAgICAgICAgICAgIGRvdWJsZSB0MSA9IGNbaisxXSArIHNbaisxXTsKKworICAgICAgICAgICAgICAgIGNbal0gPSB0MDsKKyAgICAgICAgICAgICAgICBjW2orMV0gPSB0MTsKKworICAgICAgICAgICAgICAgIHQwID0gY1tqKzJdICsgc1tqKzJdOworICAgICAgICAgICAgICAgIHQxID0gY1tqKzNdICsgc1tqKzNdOworCisgICAgICAgICAgICAgICAgY1tqKzJdID0gdDA7CisgICAgICAgICAgICAgICAgY1tqKzNdID0gdDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IoIDsgaiA8IGRpbXM7IGorKyApCisgICAgICAgICAgICAgICAgY1tqXSArPSBzW2pdOworICAgICAgICAgICAgY291bnRlcnMtPmRhdGEuaVtrXSsrOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGl0ZXIgPiAxICkKKyAgICAgICAgICAgIG1heF9kaXN0ID0gMDsKKworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbmNsdXN0ZXJzOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIGMgPSAoZG91YmxlKikoY2VudGVycy0+ZGF0YS5wdHIgKyBrKmNlbnRlcnMtPnN0ZXApOworICAgICAgICAgICAgaWYoIGNvdW50ZXJzLT5kYXRhLmlba10gIT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHNjYWxlID0gMS4vY291bnRlcnMtPmRhdGEuaVtrXTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgY1tqXSAqPSBzY2FsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogczsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgMTA7IGorKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpID0gY3ZSYW5kSW50KCAmcm5nICkgJSBuc2FtcGxlczsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvdW50ZXJzLT5kYXRhLmlbbGFiZWxzLT5kYXRhLmlbaV1dID4gMSApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcyA9IHRyYWluX2RhdGEuZGF0YS5mbFtpXTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgY1tqXSA9IHNbal07CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBpdGVyID4gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGRpc3QgPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogY19vID0gKGRvdWJsZSopKG9sZF9jZW50ZXJzLT5kYXRhLnB0ciArIGsqb2xkX2NlbnRlcnMtPnN0ZXApOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSBjW2pdIC0gY19vW2pdOworICAgICAgICAgICAgICAgICAgICBkaXN0ICs9IHQqdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG1heF9kaXN0IDwgZGlzdCApCisgICAgICAgICAgICAgICAgICAgIG1heF9kaXN0ID0gZGlzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKCBtYXhfZGlzdCA8IHRlcm1jcml0LmVwc2lsb24gKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY3ZaZXJvKCBjb3VudGVycyApOworICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgY291bnRlcnMtPmRhdGEuaVtsYWJlbHMtPmRhdGEuaVtpXV0rKzsKKworICAgIC8vIGVuc3VyZSB0aGF0IHdlIGRvIG5vdCBoYXZlIGVtcHR5IGNsdXN0ZXJzCisgICAgZm9yKCBrID0gMDsgayA8IG5jbHVzdGVyczsgaysrICkKKyAgICAgICAgaWYoIGNvdW50ZXJzLT5kYXRhLmlba10gPT0gMCApCisgICAgICAgICAgICBmb3IoOzspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaSA9IGN2UmFuZEludCgmcm5nKSAlIG5zYW1wbGVzOworICAgICAgICAgICAgICAgIGogPSBsYWJlbHMtPmRhdGEuaVtpXTsKKyAgICAgICAgICAgICAgICBpZiggY291bnRlcnMtPmRhdGEuaVtqXSA+IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWxzLT5kYXRhLmlbaV0gPSBrOworICAgICAgICAgICAgICAgICAgICBjb3VudGVycy0+ZGF0YS5pW2pdLS07CisgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJzLT5kYXRhLmlba10rKzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmNlbnRlcnMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZvbGRfY2VudGVycyApOworICAgIGN2UmVsZWFzZU1hdCggJmNvdW50ZXJzICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBsb2dfd2VpZ2h0X2Rpdl9kZXRba10gPSAtMipsb2cod2VpZ2h0c19rKSArIGxvZyhkZXQoU2lnbWFfaykpKQorCisgICBjb3ZzW2tdID0gY292X3JvdGF0ZV9tYXRzW2tdICogY292X2VpZ2VuX3ZhbHVlc1trXSAqIChjb3Zfcm90YXRlX21hdHNba10pJworICAgY292X3JvdGF0ZV9tYXRzW2tdIGFyZSBvcnRob2dvbmFsIG1hdHJpY2VzIG9mIGVpZ2VudmVjdG9ycyBhbmQKKyAgIGNvdl9laWdlbl92YWx1ZXNba10gYXJlIGRpYWdvbmFsIG1hdHJpY2VzIChyZXByZXNlbnRlZCBieSAxRCB2ZWN0b3JzKSBvZiBlaWdlbiB2YWx1ZXMuCisKKyAgIFRoZSA8YWxwaGFfaWs+IGlzIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgdmVjdG9yIHhfaSB0byBiZWxvbmcgdG8gdGhlIGstdGggY2x1c3RlcjoKKyAgIDxhbHBoYV9paz4gfiB3ZWlnaHRzX2sgKiBleHB7IC0wLjVbbG4oZGV0KFNpZ21hX2spKSArICh4X2kgLSBtdV9rKScgU2lnbWFfa14oLTEpICh4X2kgLSBtdV9rKV0gfQorICAgV2UgY2FsY3VsYXRlIHRoZXNlIHByb2JhYmlsaXRpZXMgaGVyZSBieSB0aGUgZXF1aXZhbGVudCBmb3JtdWxhZToKKyAgIERlbm90ZQorICAgU19payA9IC0wLjUobG9nKGRldChTaWdtYV9rKSkgKyAoeF9pIC0gbXVfayknIFNpZ21hX2teKC0xKSAoeF9pIC0gbXVfaykpICsgbG9nKHdlaWdodHNfayksCisgICBNX2kgPSBtYXhfayBTX2lrID0gU19xaSwgc28gdGhhdCB0aGUgcS10aCBjbGFzcyBpcyB0aGUgb25lIHdoZXJlIG1heGltdW0gcmVhY2hlcy4gVGhlbgorICAgYWxwaGFfaWsgPSBleHB7IFNfaWsgLSBNX2kgfSAvICggMSArIHN1bV9qIT1xIGV4cHsgU19qaSAtIE1faSB9KQorKi8KK2RvdWJsZSBDdkVNOjpydW5fZW0oIGNvbnN0IEN2VmVjdG9ycyYgdHJhaW5fZGF0YSApCit7CisgICAgQ3ZNYXQqIGNlbnRlcmVkX3NhbXBsZSA9IDA7CisgICAgQ3ZNYXQqIGNvdnNfaXRlbSA9IDA7CisgICAgQ3ZNYXQqIGxvZ19kZXQgPSAwOworICAgIEN2TWF0KiBsb2dfd2VpZ2h0cyA9IDA7CisgICAgQ3ZNYXQqIGNvdl9laWdlbl92YWx1ZXMgPSAwOworICAgIEN2TWF0KiBzYW1wbGVzID0gMDsKKyAgICBDdk1hdCogc3VtX3Byb2JzID0gMDsKKyAgICBsb2dfbGlrZWxpaG9vZCA9IC1EQkxfTUFYOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdkVNOjpydW5fZW0iICk7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5zYW1wbGVzID0gdHJhaW5fZGF0YS5jb3VudCwgZGltcyA9IHRyYWluX2RhdGEuZGltcywgbmNsdXN0ZXJzID0gcGFyYW1zLm5jbHVzdGVyczsKKyAgICBkb3VibGUgbWluX3ZhcmlhdGlvbiA9IEZMVF9FUFNJTE9OOworICAgIGRvdWJsZSBtaW5fZGV0X3ZhbHVlID0gTUFYKCBEQkxfTUlOLCBwb3coIG1pbl92YXJpYXRpb24sIGRpbXMgKSk7CisgICAgZG91YmxlIGxpa2VsaWhvb2RfYmlhcyA9IC1DVl9MT0cyUEkgKiAoZG91YmxlKW5zYW1wbGVzICogKGRvdWJsZSlkaW1zIC8gMi4sIF9sb2dfbGlrZWxpaG9vZCA9IC1EQkxfTUFYOworICAgIGludCBzdGFydF9zdGVwID0gcGFyYW1zLnN0YXJ0X3N0ZXA7CisgICAgCisgICAgaW50IGksIGosIGssIG47CisgICAgaW50IGlzX2dlbmVyYWwgPSAwLCBpc19kaWFnb25hbCA9IDAsIGlzX3NwaGVyaWNhbCA9IDA7CisgICAgZG91YmxlIHByZXZfbG9nX2xpa2VsaWhvb2QgPSAtREJMX01BWCAvIDEwMDAuLCBkZXQsIGQ7CisgICAgQ3ZNYXQgd2hkciwgaXdoZHIsIGRpYWcsICp3LCAqaXc7CisgICAgZG91YmxlKiB3X2RhdGE7CisgICAgZG91YmxlKiBzcF9kYXRhOworCisgICAgaWYoIG5jbHVzdGVycyA9PSAxICkKKyAgICB7CisgICAgICAgIGRvdWJsZSBsb2dfd2VpZ2h0OworICAgICAgICBDVl9DQUxMKCBjdlNldCggcHJvYnMsIGN2U2NhbGFyKDEuKSkgKTsKKworICAgICAgICBpZiggcGFyYW1zLmNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX1NQSEVSSUNBTCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGQgPSBjdlRyYWNlKCpjb3ZzKS52YWxbMF0vZGltczsKKyAgICAgICAgICAgIGQgPSBNQVgoIGQsIEZMVF9FUFNJTE9OICk7CisgICAgICAgICAgICBpbnZfZWlnZW5fdmFsdWVzLT5kYXRhLmRiWzBdID0gMS4vZDsKKyAgICAgICAgICAgIGxvZ193ZWlnaHQgPSBwb3coIGQsIGRpbXMqMC41ICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICB3X2RhdGEgPSBpbnZfZWlnZW5fdmFsdWVzLT5kYXRhLmRiOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggcGFyYW1zLmNvdl9tYXRfdHlwZSA9PSBDT1ZfTUFUX0dFTkVSSUMgKQorICAgICAgICAgICAgICAgIGN2U1ZEKCAqY292cywgaW52X2VpZ2VuX3ZhbHVlcywgKmNvdl9yb3RhdGVfbWF0cywgMCwgQ1ZfU1ZEX1VfVCApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGN2VHJhbnNwb3NlKCBjdkdldERpYWcoKmNvdnMsICZkaWFnKSwgaW52X2VpZ2VuX3ZhbHVlcyApOworICAgICAgIAorICAgICAgICAgICAgY3ZNYXhTKCBpbnZfZWlnZW5fdmFsdWVzLCBGTFRfRVBTSUxPTiwgaW52X2VpZ2VuX3ZhbHVlcyApOworICAgICAgICAgICAgZm9yKCBqID0gMCwgZGV0ID0gMS47IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgIGRldCAqPSB3X2RhdGFbal07CisgICAgICAgICAgICBsb2dfd2VpZ2h0ID0gc3FydChkZXQpOworICAgICAgICAgICAgY3ZEaXYoIDAsIGludl9laWdlbl92YWx1ZXMsIGludl9laWdlbl92YWx1ZXMgKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZ193ZWlnaHRfZGl2X2RldC0+ZGF0YS5kYlswXSA9IC0yKmxvZyh3ZWlnaHRzLT5kYXRhLmRiWzBdL2xvZ193ZWlnaHQpOworICAgICAgICBsb2dfbGlrZWxpaG9vZCA9IERCTF9NQVgvMTAwMC47CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgaWYoIHBhcmFtcy5jb3ZfbWF0X3R5cGUgPT0gQ09WX01BVF9HRU5FUklDICkKKyAgICAgICAgaXNfZ2VuZXJhbCAgPSAxOworICAgIGVsc2UgaWYoIHBhcmFtcy5jb3ZfbWF0X3R5cGUgPT0gQ09WX01BVF9ESUFHT05BTCApCisgICAgICAgIGlzX2RpYWdvbmFsID0gMTsKKyAgICBlbHNlIGlmKCBwYXJhbXMuY292X21hdF90eXBlID09IENPVl9NQVRfU1BIRVJJQ0FMICkKKyAgICAgICAgaXNfc3BoZXJpY2FsICA9IDE7CisgICAgLyogSW4gdGhlIGNhc2Ugb2YgPGNvdl9tYXRfdHlwZT4gPT0gQ09WX01BVF9ESUFHT05BTCwgdGhlIGstdGggcm93IG9mIGNvdl9laWdlbl92YWx1ZXMKKyAgICBjb250YWlucyB0aGUgZGlhZ29uYWwgZWxlbWVudHMgKHZhcmlhdGlvbnMpLiBJbiB0aGUgY2FzZSBvZgorICAgIDxjb3ZfbWF0X3R5cGU+ID09IENPVl9NQVRfU1BIRVJJQ0FMIC0gdGhlIDAtdGhzIGVsZW1lbnRzIG9mIHRoZSB2ZWN0b3JzIGNvdl9laWdlbl92YWx1ZXNba10KKyAgICBhcmUgdG8gYmUgZXF1YWwgdG8gdGhlIG1lYW4gb2YgdGhlIHZhcmlhdGlvbnMgb3ZlciBhbGwgdGhlIGRpbWVuc2lvbnMuICovCisKKyAgICBDVl9DQUxMKCBsb2dfZGV0ID0gY3ZDcmVhdGVNYXQoIDEsIG5jbHVzdGVycywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggbG9nX3dlaWdodHMgPSBjdkNyZWF0ZU1hdCggMSwgbmNsdXN0ZXJzLCBDVl82NEZDMSApKTsKKyAgICBDVl9DQUxMKCBjb3ZzX2l0ZW0gPSBjdkNyZWF0ZU1hdCggZGltcywgZGltcywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggY2VudGVyZWRfc2FtcGxlID0gY3ZDcmVhdGVNYXQoIDEsIGRpbXMsIENWXzY0RkMxICkpOworICAgIENWX0NBTEwoIGNvdl9laWdlbl92YWx1ZXMgPSBjdkNyZWF0ZU1hdCggaW52X2VpZ2VuX3ZhbHVlcy0+cm93cywgaW52X2VpZ2VuX3ZhbHVlcy0+Y29scywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggc2FtcGxlcyA9IGN2Q3JlYXRlTWF0KCBuc2FtcGxlcywgZGltcywgQ1ZfNjRGQzEgKSk7CisgICAgQ1ZfQ0FMTCggc3VtX3Byb2JzID0gY3ZDcmVhdGVNYXQoIDEsIG5jbHVzdGVycywgQ1ZfNjRGQzEgKSk7CisgICAgc3BfZGF0YSA9IHN1bV9wcm9icy0+ZGF0YS5kYjsKKworICAgIC8vIGNvcHkgdGhlIHRyYWluaW5nIGRhdGEgaW50byBkb3VibGUtcHJlY2lzaW9uIG1hdHJpeAorICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGZsb2F0KiBzcmMgPSB0cmFpbl9kYXRhLmRhdGEuZmxbaV07CisgICAgICAgIGRvdWJsZSogZHN0ID0gKGRvdWJsZSopKHNhbXBsZXMtPmRhdGEucHRyICsgc2FtcGxlcy0+c3RlcCppKTsKKworICAgICAgICBmb3IoIGogPSAwOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgIGRzdFtqXSA9IHNyY1tqXTsKKyAgICB9CisKKyAgICBpZiggc3RhcnRfc3RlcCAhPSBTVEFSVF9NX1NURVAgKQorICAgIHsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IG5jbHVzdGVyczsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlzX2dlbmVyYWwgfHwgaXNfZGlhZ29uYWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHcgPSBjdkdldFJvdyggY292X2VpZ2VuX3ZhbHVlcywgJndoZHIsIGsgKTsKKyAgICAgICAgICAgICAgICBpZiggaXNfZ2VuZXJhbCApCisgICAgICAgICAgICAgICAgICAgIGN2U1ZEKCBjb3ZzW2tdLCB3LCBjb3Zfcm90YXRlX21hdHNba10sIDAsIENWX1NWRF9VX1QgKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGN2VHJhbnNwb3NlKCBjdkdldERpYWcoIGNvdnNba10sICZkaWFnICksIHcgKTsKKyAgICAgICAgICAgICAgICB3X2RhdGEgPSB3LT5kYXRhLmRiOworICAgICAgICAgICAgICAgIGZvciggaiA9IDAsIGRldCA9IDEuOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgZGV0ICo9IHdfZGF0YVtqXTsKKyAgICAgICAgICAgICAgICBpZiggZGV0IDwgbWluX2RldF92YWx1ZSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnRfc3RlcCA9PSBTVEFSVF9BVVRPX1NURVAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZGV0ID0gbWluX2RldF92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nX2RldC0+ZGF0YS5kYltrXSA9IGRldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gY3ZUcmFjZShjb3ZzW2tdKS52YWxbMF0vKGRvdWJsZSlkaW1zOworICAgICAgICAgICAgICAgIGlmKCBkIDwgbWluX3ZhcmlhdGlvbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggc3RhcnRfc3RlcCA9PSBTVEFSVF9BVVRPX1NURVAgKQorICAgICAgICAgICAgICAgICAgICAgICAgZCA9IG1pbl92YXJpYXRpb247CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvdl9laWdlbl92YWx1ZXMtPmRhdGEuZGJba10gPSBkOworICAgICAgICAgICAgICAgIGxvZ19kZXQtPmRhdGEuZGJba10gPSBkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgCisgICAgICAgIGN2TG9nKCBsb2dfZGV0LCBsb2dfZGV0ICk7CisgICAgICAgIGlmKCBpc19zcGhlcmljYWwgKQorICAgICAgICAgICAgY3ZTY2FsZSggbG9nX2RldCwgbG9nX2RldCwgZGltcyApOworICAgIH0KKworICAgIGZvciggbiA9IDA7IG4gPCBwYXJhbXMudGVybV9jcml0Lm1heF9pdGVyOyBuKysgKQorICAgIHsKKyAgICAgICAgaWYoIG4gPiAwIHx8IHN0YXJ0X3N0ZXAgIT0gU1RBUlRfTV9TVEVQICkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gZS1zdGVwOiBjb21wdXRlIHByb2JzX2lrIGZyb20gbWVhbnNfaywgY292c19rIGFuZCB3ZWlnaHRzX2suCisgICAgICAgICAgICBDVl9DQUxMKGN2TG9nKCB3ZWlnaHRzLCBsb2dfd2VpZ2h0cyApKTsKKworICAgICAgICAgICAgLy8gU19payA9IC0wLjVbbG9nKGRldChTaWdtYV9rKSkgKyAoeF9pIC0gbXVfayknIFNpZ21hX2teKC0xKSAoeF9pIC0gbXVfayldICsgbG9nKHdlaWdodHNfaykKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBuY2x1c3RlcnM7IGsrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZNYXQqIHUgPSBjb3Zfcm90YXRlX21hdHNba107CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlKiBtZWFuID0gKGRvdWJsZSopKG1lYW5zLT5kYXRhLnB0ciArIG1lYW5zLT5zdGVwKmspOworICAgICAgICAgICAgICAgIHcgPSBjdkdldFJvdyggY292X2VpZ2VuX3ZhbHVlcywgJndoZHIsIGsgKTsKKyAgICAgICAgICAgICAgICBpdyA9IGN2R2V0Um93KCBpbnZfZWlnZW5fdmFsdWVzLCAmaXdoZHIsIGsgKTsKKyAgICAgICAgICAgICAgICBjdkRpdiggMCwgdywgaXcgKTsKKworICAgICAgICAgICAgICAgIHdfZGF0YSA9IChkb3VibGUqKShpbnZfZWlnZW5fdmFsdWVzLT5kYXRhLnB0ciArIGludl9laWdlbl92YWx1ZXMtPnN0ZXAqayk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnNhbXBsZXM7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkb3VibGUgKmNzYW1wbGUgPSBjZW50ZXJlZF9zYW1wbGUtPmRhdGEuZGIsIHAgPSBsb2dfZGV0LT5kYXRhLmRiW2tdOworICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUqIHNhbXBsZSA9IChkb3VibGUqKShzYW1wbGVzLT5kYXRhLnB0ciArIHNhbXBsZXMtPnN0ZXAqaSk7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSogcHAgPSAoZG91YmxlKikocHJvYnMtPmRhdGEucHRyICsgcHJvYnMtPnN0ZXAqaSk7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgY3NhbXBsZVtqXSA9IHNhbXBsZVtqXSAtIG1lYW5bal07CisgICAgICAgICAgICAgICAgICAgIGlmKCBpc19nZW5lcmFsICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGN2R0VNTSggY2VudGVyZWRfc2FtcGxlLCB1LCAxLCAwLCAwLCBjZW50ZXJlZF9zYW1wbGUsIENWX0dFTU1fQl9UICk7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBkaW1zOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgcCArPSBjc2FtcGxlW2pdKmNzYW1wbGVbal0qd19kYXRhW2lzX3NwaGVyaWNhbCA/IDAgOiBqXTsKKyAgICAgICAgICAgICAgICAgICAgcHBba10gPSAtMC41KnAgKyBsb2dfd2VpZ2h0cy0+ZGF0YS5kYltrXTsKKworICAgICAgICAgICAgICAgICAgICAvLyBTX2lrIDwtIFNfaWsgLSBtYXhfaiBTX2lqCisgICAgICAgICAgICAgICAgICAgIGlmKCBrID09IG5jbHVzdGVycyAtIDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbWF4X3ZhbCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmNsdXN0ZXJzOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSBNQVgoIG1heF92YWwsIHBwW2pdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmNsdXN0ZXJzOyBqKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwW2pdIC09IG1heF92YWw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENWX0NBTEwoY3ZFeHAoIHByb2JzLCBwcm9icyApKTsgLy8gZXhwKCBTX2lrICkKKyAgICAgICAgICAgIGN2WmVybyggc3VtX3Byb2JzICk7CisKKyAgICAgICAgICAgIC8vIGFscGhhX2lrID0gZXhwKCBTX2lrICkgLyBzdW1faiBleHAoIFNfaWogKSwKKyAgICAgICAgICAgIC8vIGxvZ19saWtlbGlob29kID0gc3VtX2kgbG9nIChzdW1faiBleHAoU19paikpCisgICAgICAgICAgICBmb3IoIGkgPSAwLCBfbG9nX2xpa2VsaWhvb2QgPSBsaWtlbGlob29kX2JpYXM7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUqIHBwID0gKGRvdWJsZSopKHByb2JzLT5kYXRhLnB0ciArIHByb2JzLT5zdGVwKmkpLCBzdW0gPSAwOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBuY2x1c3RlcnM7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHN1bSArPSBwcFtqXTsKKyAgICAgICAgICAgICAgICBzdW0gPSAxLi9NQVgoIHN1bSwgREJMX0VQU0lMT04gKTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgbmNsdXN0ZXJzOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHAgPSBwcFtqXSAqPSBzdW07CisgICAgICAgICAgICAgICAgICAgIHNwX2RhdGFbal0gKz0gcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2xvZ19saWtlbGlob29kIC09IGxvZyggc3VtICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRlcm1pbmF0aW9uIGNyaXRlcmlhCisgICAgICAgICAgICBpZiggZmFicyggKF9sb2dfbGlrZWxpaG9vZCAtIHByZXZfbG9nX2xpa2VsaWhvb2QpIC8gcHJldl9sb2dfbGlrZWxpaG9vZCApIDwgcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHByZXZfbG9nX2xpa2VsaWhvb2QgPSBfbG9nX2xpa2VsaWhvb2Q7CisgICAgICAgIH0KKworICAgICAgICAvLyBtLXN0ZXA6IHVwZGF0ZSBtZWFuc19rLCBjb3ZzX2sgYW5kIHdlaWdodHNfayBmcm9tIHByb2JzX2lrCisgICAgICAgIGN2R0VNTSggcHJvYnMsIHNhbXBsZXMsIDEsIDAsIDAsIG1lYW5zLCBDVl9HRU1NX0FfVCApOworCisgICAgICAgIGZvciggayA9IDA7IGsgPCBuY2x1c3RlcnM7IGsrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSBzcF9kYXRhW2tdLCBpbnZfc3VtID0gMS4vc3VtOworICAgICAgICAgICAgQ3ZNYXQqIGNvdiA9IGNvdnNba10sIF9tZWFuLCBfc2FtcGxlOworICAgICAgICAgICAgCisgICAgICAgICAgICB3ID0gY3ZHZXRSb3coIGNvdl9laWdlbl92YWx1ZXMsICZ3aGRyLCBrICk7CisgICAgICAgICAgICB3X2RhdGEgPSB3LT5kYXRhLmRiOworICAgICAgICAgICAgY3ZHZXRSb3coIG1lYW5zLCAmX21lYW4sIGsgKTsKKyAgICAgICAgICAgIGN2R2V0Um93KCBzYW1wbGVzLCAmX3NhbXBsZSwgayApOworCisgICAgICAgICAgICAvLyB1cGRhdGUgd2VpZ2h0c19rCisgICAgICAgICAgICB3ZWlnaHRzLT5kYXRhLmRiW2tdID0gc3VtOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB1cGRhdGUgbWVhbnNfaworICAgICAgICAgICAgY3ZTY2FsZSggJl9tZWFuLCAmX21lYW4sIGludl9zdW0gKTsKKworICAgICAgICAgICAgLy8gY29tcHV0ZSBjb3ZzX2sKKyAgICAgICAgICAgIGN2WmVybyggY292ICk7CisgICAgICAgICAgICBjdlplcm8oIHcgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBwID0gcHJvYnMtPmRhdGEuZGJbaSpuY2x1c3RlcnMgKyBrXSppbnZfc3VtOworICAgICAgICAgICAgICAgIF9zYW1wbGUuZGF0YS5kYiA9IChkb3VibGUqKShzYW1wbGVzLT5kYXRhLnB0ciArIHNhbXBsZXMtPnN0ZXAqaSk7CisKKyAgICAgICAgICAgICAgICBpZiggaXNfZ2VuZXJhbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjdk11bFRyYW5zcG9zZWQoICZfc2FtcGxlLCBjb3ZzX2l0ZW0sIDEsICZfbWVhbiApOworICAgICAgICAgICAgICAgICAgICBjdlNjYWxlQWRkKCBjb3ZzX2l0ZW0sIGN2UmVhbFNjYWxhcihwKSwgY292LCBjb3YgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgZGltczsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbCA9IF9zYW1wbGUuZGF0YS5kYltqXSAtIF9tZWFuLmRhdGEuZGJbal07CisgICAgICAgICAgICAgICAgICAgICAgICB3X2RhdGFbaXNfc3BoZXJpY2FsID8gMCA6IGpdICs9IHAqdmFsKnZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggaXNfc3BoZXJpY2FsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkID0gd19kYXRhWzBdLyhkb3VibGUpZGltczsKKyAgICAgICAgICAgICAgICBkID0gTUFYKCBkLCBtaW5fdmFyaWF0aW9uICk7CisgICAgICAgICAgICAgICAgdy0+ZGF0YS5kYlswXSA9IGQ7CisgICAgICAgICAgICAgICAgbG9nX2RldC0+ZGF0YS5kYltrXSA9IGQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGlzX2dlbmVyYWwgKQorICAgICAgICAgICAgICAgICAgICBjdlNWRCggY292LCB3LCBjb3Zfcm90YXRlX21hdHNba10sIDAsIENWX1NWRF9VX1QgKTsKKyAgICAgICAgICAgICAgICBjdk1heFMoIHcsIG1pbl92YXJpYXRpb24sIHcgKTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAwLCBkZXQgPSAxLjsgaiA8IGRpbXM7IGorKyApCisgICAgICAgICAgICAgICAgICAgIGRldCAqPSB3X2RhdGFbal07CisgICAgICAgICAgICAgICAgbG9nX2RldC0+ZGF0YS5kYltrXSA9IGRldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGN2Q29udmVydFNjYWxlKCB3ZWlnaHRzLCB3ZWlnaHRzLCAxLi8oZG91YmxlKW5zYW1wbGVzLCAwICk7CisgICAgICAgIGN2TWF4Uyggd2VpZ2h0cywgREJMX01JTiwgd2VpZ2h0cyApOworCisgICAgICAgIGN2TG9nKCBsb2dfZGV0LCBsb2dfZGV0ICk7CisgICAgICAgIGlmKCBpc19zcGhlcmljYWwgKQorICAgICAgICAgICAgY3ZTY2FsZSggbG9nX2RldCwgbG9nX2RldCwgZGltcyApOworICAgIH0gLy8gZW5kIG9mIGl0ZXJhdGlvbiBwcm9jZXNzCisKKyAgICAvL2xvZ193ZWlnaHRfZGl2X2RldFtrXSA9IC0yKmxvZyh3ZWlnaHRzX2svZGV0KFNpZ21hX2spKV4wLjUpID0gLTIqbG9nKHdlaWdodHNfaykgKyBsb2coZGV0KFNpZ21hX2spKSkKKyAgICBpZiggbG9nX3dlaWdodF9kaXZfZGV0ICkKKyAgICB7CisgICAgICAgIGN2U2NhbGUoIGxvZ193ZWlnaHRzLCBsb2dfd2VpZ2h0X2Rpdl9kZXQsIC0yICk7CisgICAgICAgIGN2QWRkKCBsb2dfd2VpZ2h0X2Rpdl9kZXQsIGxvZ19kZXQsIGxvZ193ZWlnaHRfZGl2X2RldCApOworICAgIH0KKyAgICAKKyAgICAvKiBOb3cgZmluYWxpemUgYWxsIHRoZSBjb3ZhcmlhdGlvbiBtYXRyaWNlczoKKyAgICAxKSBpZiA8Y292X21hdF90eXBlPiA9PSBDT1ZfTUFUX0RJQUdPTkFMIHdlIHVzZWQgYXJyYXkgb2YgPHc+IGFzIGRpYWdvbmFscy4KKyAgICAgICBOb3cgd1trXSBzaG91bGQgYmUgY29waWVkIGJhY2sgdG8gdGhlIGRpYWdvbmFscyBvZiBjb3ZzW2tdOworICAgIDIpIGlmIDxjb3ZfbWF0X3R5cGU+ID09IENPVl9NQVRfU1BIRVJJQ0FMIHdlIHVzZWQgdGhlIDAtdGggZWxlbWVudCBvZiB3W2tdCisgICAgICAgYXMgYW4gYXZlcmFnZSB2YXJpYXRpb24gaW4gZWFjaCBjbHVzdGVyLiBUaGUgdmFsdWUgb2YgdGhlIDAtdGggZWxlbWVudCBvZiB3W2tdCisgICAgICAgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgYWxsIG9mIHRoZSBkaWFnb25hbCBlbGVtZW50cyBvZiBjb3ZzW2tdLiAqLworICAgIGlmKCBpc19zcGhlcmljYWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IG5jbHVzdGVyczsgaysrICkKKyAgICAgICAgICAgIGN2U2V0SWRlbnRpdHkoIGNvdnNba10sIGN2U2NhbGFyKGNvdl9laWdlbl92YWx1ZXMtPmRhdGEuZGJba10pKTsKKyAgICB9CisgICAgZWxzZSBpZiggaXNfZGlhZ29uYWwgKQorICAgIHsKKyAgICAgICAgZm9yKCBrID0gMDsgayA8IG5jbHVzdGVyczsgaysrICkKKyAgICAgICAgICAgIGN2VHJhbnNwb3NlKCBjdkdldFJvdyggY292X2VpZ2VuX3ZhbHVlcywgJndoZHIsIGsgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdkdldERpYWcoIGNvdnNba10sICZkaWFnICkpOworICAgIH0KKyAgICBjdkRpdiggMCwgY292X2VpZ2VuX3ZhbHVlcywgaW52X2VpZ2VuX3ZhbHVlcyApOworCisgICAgbG9nX2xpa2VsaWhvb2QgPSBfbG9nX2xpa2VsaWhvb2Q7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmbG9nX2RldCApOworICAgIGN2UmVsZWFzZU1hdCggJmxvZ193ZWlnaHRzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY292c19pdGVtICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY2VudGVyZWRfc2FtcGxlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY292X2VpZ2VuX3ZhbHVlcyApOworICAgIGN2UmVsZWFzZU1hdCggJnNhbXBsZXMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzdW1fcHJvYnMgKTsKKworICAgIHJldHVybiBsb2dfbGlrZWxpaG9vZDsKK30KKworCitpbnQgQ3ZFTTo6Z2V0X25jbHVzdGVycygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhcmFtcy5uY2x1c3RlcnM7Cit9CisKK2NvbnN0IEN2TWF0KiBDdkVNOjpnZXRfbWVhbnMoKSBjb25zdAoreworICAgIHJldHVybiBtZWFuczsKK30KKworY29uc3QgQ3ZNYXQqKiBDdkVNOjpnZXRfY292cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChjb25zdCBDdk1hdCoqKWNvdnM7Cit9CisKK2NvbnN0IEN2TWF0KiBDdkVNOjpnZXRfd2VpZ2h0cygpIGNvbnN0Cit7CisgICAgcmV0dXJuIHdlaWdodHM7Cit9CisKK2NvbnN0IEN2TWF0KiBDdkVNOjpnZXRfcHJvYnMoKSBjb25zdAoreworICAgIHJldHVybiBwcm9iczsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9tbC9zcmMvbWxlc3RpbWF0ZS5jcHAgYi9tbC9zcmMvbWxlc3RpbWF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQwM2E0NAotLS0gL2Rldi9udWxsCisrKyBiL21sL3NyYy9tbGVzdGltYXRlLmNwcApAQCAtMCwwICsxLDcyOCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKKyNpZiAwCisKK01MX0lNUEwgaW50CitpY3ZDbXBJbnRlZ2VycyAoY29uc3Qgdm9pZCogYSwgY29uc3Qgdm9pZCogYikge3JldHVybiAqKGNvbnN0IGludCopYSAtICooY29uc3QgaW50KiliO30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICBDcm9zcy12YWxpZGF0aW9uIGFsZ29yaXRobXMgcmVhbGl6YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBSZXR1cm4gcG9pbnRlciB0byB0cmFpbklkeC4gRnVuY3Rpb24gRE9FUyBOT1QgRklMTCB0aGlzIG1hdHJpeCEKK01MX0lNUEwKK2NvbnN0IEN2TWF0KiBjdkNyb3NzVmFsR2V0VHJhaW5JZHhNYXRyaXggKGNvbnN0IEN2U3RhdE1vZGVsKiBlc3RpbWF0ZU1vZGVsKQoreworICAgIEN2TWF0KiByZXN1bHQgPSBOVUxMOworCisgICAgICAgIENWX0ZVTkNOQU1FICgiY3ZDcm9zc1ZhbEdldFRyYWluSWR4TWF0cml4Iik7CisgICAgICAgIF9fQkVHSU5fXworCisgICAgaWYgKCFDVl9JU19DUk9TU1ZBTChlc3RpbWF0ZU1vZGVsKSkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNCYWRBcmcsICJQb2ludGVyIHBvaW50IHRvIG5vdCBDdkNyb3NzVmFsaWRhdGlvbk1vZGVsIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gKChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKillc3RpbWF0ZU1vZGVsKS0+c2FtcGxlSWR4VHJhaW47CisKKyAgICAgICAgX19FTkRfXworCisgICAgcmV0dXJuIHJlc3VsdDsKK30gLy8gRW5kIG9mIGN2Q3Jvc3NWYWxHZXRUcmFpbklkeE1hdHJpeAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIFJldHVybiBwb2ludGVyIHRvIGNoZWNrSWR4LiBGdW5jdGlvbiBET0VTIE5PVCBGSUxMIHRoaXMgbWF0cml4IQorTUxfSU1QTAorY29uc3QgQ3ZNYXQqIGN2Q3Jvc3NWYWxHZXRDaGVja0lkeE1hdHJpeCAoY29uc3QgQ3ZTdGF0TW9kZWwqIGVzdGltYXRlTW9kZWwpCit7CisgICAgQ3ZNYXQqIHJlc3VsdCA9IE5VTEw7CisKKyAgICAgICAgQ1ZfRlVOQ05BTUUgKCJjdkNyb3NzVmFsR2V0Q2hlY2tJZHhNYXRyaXgiKTsKKyAgICAgICAgX19CRUdJTl9fCisKKyAgICBpZiAoIUNWX0lTX0NST1NTVkFMIChlc3RpbWF0ZU1vZGVsKSkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNCYWRBcmcsICJQb2ludGVyIHBvaW50IHRvIG5vdCBDdkNyb3NzVmFsaWRhdGlvbk1vZGVsIik7CisgICAgfQorCisgICAgcmVzdWx0ID0gKChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKillc3RpbWF0ZU1vZGVsKS0+c2FtcGxlSWR4RXZhbDsKKworICAgICAgICBfX0VORF9fCisKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBFbmQgb2YgY3ZDcm9zc1ZhbEdldENoZWNrSWR4TWF0cml4CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gQ3JlYXRlIG5ldyBJZHgtbWF0cml4IGZvciBuZXh0IGNsYXNzaWZpZXJzIHRyYWluaW5nIGFuZCByZXR1cm4gY29kZSBvZiByZXN1bHQuCisvLyAgIFJlc3VsdCBpcyAwIGlmIGZ1bmN0aW9uIGNhbid0IG1ha2UgbmV4dCBzdGVwIChlcnJvciBpbnB1dCBvciBmb2xkcyBhcmUgZmluaXNoZWQpLAorLy8gICBpdCBpcyAxIGlmIGFsbCB3YXMgY29ycmVjdCwgYW5kIGl0IGlzIDIgaWYgY3VycmVudCBmb2xkIHdhc24ndCcgY2hlY2tlZC4KK01MX0lNUEwKK2ludCBjdkNyb3NzVmFsTmV4dFN0ZXAgKEN2U3RhdE1vZGVsKiBlc3RpbWF0ZU1vZGVsKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgICAgIENWX0ZVTkNOQU1FICgiY3ZDcm9zc1ZhbEdldE5leHRUcmFpbklkeCIpOworICAgICAgICBfX0JFR0lOX18KKworICAgIEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwqIGNyVmFsID0gKEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwqKSBlc3RpbWF0ZU1vZGVsOworICAgIGludCBrLCBmb2xkOworCisgICAgaWYgKCFDVl9JU19DUk9TU1ZBTCAoZXN0aW1hdGVNb2RlbCkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiUG9pbnRlciBwb2ludCB0byBub3QgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCIpOworICAgIH0KKworICAgIGZvbGQgPSArK2NyVmFsLT5jdXJyZW50X2ZvbGQ7CisKKyAgICBpZiAoZm9sZCA+PSBjclZhbC0+Zm9sZHNfYWxsKQorICAgIHsKKyAgICAgICAgaWYgKGZvbGQgPT0gY3JWYWwtPmZvbGRzX2FsbCkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfRVJST1IgKENWX1N0c0ludGVybmFsLCAiQWxsIGl0ZXJhdGlvbnMgaGFzIGVuZCBsb25nIGFnbyIpOworICAgICAgICB9CisgICAgfQorCisgICAgayA9IGNyVmFsLT5mb2xkc1tmb2xkICsgMV0gLSBjclZhbC0+Zm9sZHNbZm9sZF07CisgICAgY3JWYWwtPnNhbXBsZUlkeFRyYWluLT5kYXRhLmkgPSBjclZhbC0+c2FtcGxlSWR4QWxsICsgY3JWYWwtPmZvbGRzW2ZvbGQgKyAxXTsKKyAgICBjclZhbC0+c2FtcGxlSWR4VHJhaW4tPmNvbHMgPSBjclZhbC0+c2FtcGxlc19hbGwgLSBrOworICAgIGNyVmFsLT5zYW1wbGVJZHhFdmFsLT5kYXRhLmkgPSBjclZhbC0+c2FtcGxlSWR4QWxsICsgY3JWYWwtPmZvbGRzW2ZvbGRdOworICAgIGNyVmFsLT5zYW1wbGVJZHhFdmFsLT5jb2xzID0gazsKKworICAgIGlmIChjclZhbC0+aXNfY2hlY2tlZCkKKyAgICB7CisgICAgICAgIGNyVmFsLT5pc19jaGVja2VkID0gMDsKKyAgICAgICAgcmVzdWx0ID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gMjsKKyAgICB9CisKKyAgICAgICAgX19FTkRfXworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBEbyBjaGVja2luZyBwYXJ0IG9mIGxvb3AgIG9mIGNyb3NzLXZhbGlkYXRpb25zIG1ldG9kLgorTUxfSU1QTAordm9pZCBjdkNyb3NzVmFsQ2hlY2tDbGFzc2lmaWVyIChDdlN0YXRNb2RlbCogIGVzdGltYXRlTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2U3RhdE1vZGVsKiAgbW9kZWwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgIHRyYWluRGF0YSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgc2FtcGxlX3RfZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICB0cmFpbkNsYXNzZXMpCit7CisgICAgICAgIENWX0ZVTkNOQU1FICgiY3ZDcm9zc1ZhbENoZWNrQ2xhc3NpZmllciAiKTsKKyAgICAgICAgX19CRUdJTl9fCisKKyAgICBDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKiBjclZhbCA9IChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKikgZXN0aW1hdGVNb2RlbDsKKyAgICBpbnQgIGksIGosIGs7CisgICAgaW50KiBkYXRhOworICAgIGZsb2F0KiByZXNwb25zZXNfZmw7CisgICAgaW50ICAgIHN0ZXA7CisgICAgZmxvYXQqIHJlc3BvbnNlc19yZXN1bHQ7CisgICAgaW50KiByZXNwb25zZXNfaTsKKyAgICBkb3VibGUgdGUsIHRlMTsKKyAgICBkb3VibGUgc3VtX2MsIHN1bV9wLCBzdW1fcHAsIHN1bV9jcCwgc3VtX2NjLCBzcV9lcnI7CisKKy8vIENoZWNrIGlucHV0IGRhdGEgdG8gY29ycmVjdCB2YWx1ZXMuCisgICAgaWYgKCFDVl9JU19DUk9TU1ZBTCAoZXN0aW1hdGVNb2RlbCkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCJGaXJzdCBwYXJhbWV0ZXIgcG9pbnQgdG8gbm90IEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwiKTsKKyAgICB9CisgICAgaWYgKCFDVl9JU19TVEFUX01PREVMIChtb2RlbCkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiU2Vjb25kIHBhcmFtZXRlciBwb2ludCB0byBub3QgQ3ZTdGF0TW9kZWwiKTsKKyAgICB9CisgICAgaWYgKCFDVl9JU19NQVQgKHRyYWluRGF0YSkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiVGhpcmQgcGFyYW1ldGVyIHBvaW50IHRvIG5vdCBDdk1hdCIpOworICAgIH0KKyAgICBpZiAoIUNWX0lTX01BVCAodHJhaW5DbGFzc2VzKSkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNCYWRBcmcsICJGaWZ0aCBwYXJhbWV0ZXIgcG9pbnQgdG8gbm90IEN2TWF0Iik7CisgICAgfQorICAgIGlmIChjclZhbC0+aXNfY2hlY2tlZCkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNJbnRlcm5hbCwgIlRoaXMgaXRlcmF0aW9ucyBhbHJlYWR5IHdhcyBjaGVja2VkIik7CisgICAgfQorCisvLyBJbml0aWFsaXplLgorICAgIGsgPSBjclZhbC0+c2FtcGxlSWR4RXZhbC0+Y29sczsKKyAgICBkYXRhID0gY3JWYWwtPnNhbXBsZUlkeEV2YWwtPmRhdGEuaTsKKworLy8gRXZhbCB0ZXN0ZWQgZmVhdHVyZSB2ZWN0b3JzLgorICAgIENWX0NBTEwgKGN2U3RhdE1vZGVsTXVsdGlQcmVkaWN0IChtb2RlbCwgdHJhaW5EYXRhLCBzYW1wbGVfdF9mbGFnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JWYWwtPnByZWRpY3RfcmVzdWx0cywgTlVMTCwgY3JWYWwtPnNhbXBsZUlkeEV2YWwpKTsKKy8vIENvdW50IG51bWJlciBpZiBjb3JyZWN0IHJlc3VsdHMuCisgICAgcmVzcG9uc2VzX3Jlc3VsdCA9IGNyVmFsLT5wcmVkaWN0X3Jlc3VsdHMtPmRhdGEuZmw7CisgICAgaWYgKGNyVmFsLT5pc19yZWdyZXNzaW9uKQorICAgIHsKKyAgICAgICAgc3VtX2MgPSBzdW1fcCA9IHN1bV9wcCA9IHN1bV9jcCA9IHN1bV9jYyA9IHNxX2VyciA9IDA7CisgICAgICAgIGlmIChDVl9NQVRfVFlQRSAodHJhaW5DbGFzc2VzLT50eXBlKSA9PSBDVl8zMkZDMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzcG9uc2VzX2ZsID0gdHJhaW5DbGFzc2VzLT5kYXRhLmZsOworICAgICAgICAgICAgc3RlcCA9IHRyYWluQ2xhc3Nlcy0+cm93cyA9PSAxID8gMSA6IHRyYWluQ2xhc3Nlcy0+c3RlcCAvIHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlID0gcmVzcG9uc2VzX3Jlc3VsdFsqZGF0YV07CisgICAgICAgICAgICAgICAgdGUxID0gcmVzcG9uc2VzX2ZsWypkYXRhICogc3RlcF07CisgICAgICAgICAgICAgICAgc3VtX2MgKz0gdGUxOworICAgICAgICAgICAgICAgIHN1bV9wICs9IHRlOworICAgICAgICAgICAgICAgIHN1bV9jYyArPSB0ZTEgKiB0ZTE7CisgICAgICAgICAgICAgICAgc3VtX3BwICs9IHRlICogdGU7CisgICAgICAgICAgICAgICAgc3VtX2NwICs9IHRlMSAqIHRlOworICAgICAgICAgICAgICAgIHRlIC09IHRlMTsKKyAgICAgICAgICAgICAgICBzcV9lcnIgKz0gdGUgICogdGU7CisKKyAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXNwb25zZXNfaSA9IHRyYWluQ2xhc3Nlcy0+ZGF0YS5pOworICAgICAgICAgICAgc3RlcCA9IHRyYWluQ2xhc3Nlcy0+cm93cyA9PSAxID8gMSA6IHRyYWluQ2xhc3Nlcy0+c3RlcCAvIHNpemVvZihpbnQpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGs7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0ZSA9IHJlc3BvbnNlc19yZXN1bHRbKmRhdGFdOworICAgICAgICAgICAgICAgIHRlMSA9IHJlc3BvbnNlc19pWypkYXRhICogc3RlcF07CisgICAgICAgICAgICAgICAgc3VtX2MgKz0gdGUxOworICAgICAgICAgICAgICAgIHN1bV9wICs9IHRlOworICAgICAgICAgICAgICAgIHN1bV9jYyArPSB0ZTEgKiB0ZTE7CisgICAgICAgICAgICAgICAgc3VtX3BwICs9IHRlICogdGU7CisgICAgICAgICAgICAgICAgc3VtX2NwICs9IHRlMSAqIHRlOworICAgICAgICAgICAgICAgIHRlIC09IHRlMTsKKyAgICAgICAgICAgICAgICBzcV9lcnIgKz0gdGUgICogdGU7CisKKyAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAvLyBGaXhpbmcgbmV3IGludGVybmFsIHZhbHVlcyBvZiBhY2N1cmFjeS4KKyAgICAgICAgY3JWYWwtPnN1bV9jb3JyZWN0ICs9IHN1bV9jOworICAgICAgICBjclZhbC0+c3VtX3ByZWRpY3QgKz0gc3VtX3A7CisgICAgICAgIGNyVmFsLT5zdW1fY2MgKz0gc3VtX2NjOworICAgICAgICBjclZhbC0+c3VtX3BwICs9IHN1bV9wcDsKKyAgICAgICAgY3JWYWwtPnN1bV9jcCArPSBzdW1fY3A7CisgICAgICAgIGNyVmFsLT5zcV9lcnJvciArPSBzcV9lcnI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmIChDVl9NQVRfVFlQRSAodHJhaW5DbGFzc2VzLT50eXBlKSA9PSBDVl8zMkZDMSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVzcG9uc2VzX2ZsID0gdHJhaW5DbGFzc2VzLT5kYXRhLmZsOworICAgICAgICAgICAgc3RlcCA9IHRyYWluQ2xhc3Nlcy0+cm93cyA9PSAxID8gMSA6IHRyYWluQ2xhc3Nlcy0+c3RlcCAvIHNpemVvZihmbG9hdCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGs7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3ZSb3VuZCAocmVzcG9uc2VzX3Jlc3VsdFsqZGF0YV0pID09IGN2Um91bmQgKHJlc3BvbnNlc19mbFsqZGF0YSAqIHN0ZXBdKSkKKyAgICAgICAgICAgICAgICAgICAgaisrOworICAgICAgICAgICAgICAgIGRhdGErKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3BvbnNlc19pID0gdHJhaW5DbGFzc2VzLT5kYXRhLmk7CisgICAgICAgICAgICBzdGVwID0gdHJhaW5DbGFzc2VzLT5yb3dzID09IDEgPyAxIDogdHJhaW5DbGFzc2VzLT5zdGVwIC8gc2l6ZW9mKGludCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGs7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoY3ZSb3VuZCAocmVzcG9uc2VzX3Jlc3VsdFsqZGF0YV0pID09IHJlc3BvbnNlc19pWypkYXRhICogc3RlcF0pCisgICAgICAgICAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgICAgICBkYXRhKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAvLyBGaXhpbmcgbmV3IGludGVybmFsIHZhbHVlcyBvZiBhY2N1cmFjeS4KKyAgICAgICAgY3JWYWwtPmNvcnJlY3RfcmVzdWx0cyArPSBqOworICAgIH0KKy8vIEZpeGluZyB0aGF0IHRoaXMgZm9sZCBhbHJlYWR5IGNoZWNrZWQuCisgICAgY3JWYWwtPmFsbF9yZXN1bHRzICs9IGs7CisgICAgY3JWYWwtPmlzX2NoZWNrZWQgPSAxOworCisgICAgICAgIF9fRU5EX18KK30gLy8gRW5kIG9mIGN2Q3Jvc3NWYWxDaGVja0NsYXNzaWZpZXIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBSZXR1cm4gY3VycmVudCBhY2N1cmFjeS4KK01MX0lNUEwKK2Zsb2F0IGN2Q3Jvc3NWYWxHZXRSZXN1bHQgKGNvbnN0IEN2U3RhdE1vZGVsKiBlc3RpbWF0ZU1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqICAgICAgIGNvcnJlbGF0aW9uKQoreworICAgIGZsb2F0IHJlc3VsdCA9IDA7CisKKyAgICAgICAgQ1ZfRlVOQ05BTUUgKCJjdkNyb3NzVmFsR2V0UmVzdWx0Iik7CisgICAgICAgIF9fQkVHSU5fXworCisgICAgZG91YmxlIHRlLCB0ZTE7CisgICAgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCogY3JWYWwgPSAoQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCopZXN0aW1hdGVNb2RlbDsKKworICAgIGlmICghQ1ZfSVNfQ1JPU1NWQUwgKGVzdGltYXRlTW9kZWwpKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IgKENWX1N0c0JhZEFyZywgIlBvaW50ZXIgcG9pbnQgdG8gbm90IEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwiKTsKKyAgICB9CisKKyAgICBpZiAoY3JWYWwtPmFsbF9yZXN1bHRzKQorICAgIHsKKyAgICAgICAgaWYgKGNyVmFsLT5pc19yZWdyZXNzaW9uKQorICAgICAgICB7CisgICAgICAgICAgICByZXN1bHQgPSAoKGZsb2F0KWNyVmFsLT5zcV9lcnJvcikgLyBjclZhbC0+YWxsX3Jlc3VsdHM7CisgICAgICAgICAgICBpZiAoY29ycmVsYXRpb24pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdGUgPSBjclZhbC0+YWxsX3Jlc3VsdHMgKiBjclZhbC0+c3VtX2NwIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjclZhbC0+c3VtX2NvcnJlY3QgKiBjclZhbC0+c3VtX3ByZWRpY3Q7CisgICAgICAgICAgICAgICAgdGUgKj0gdGU7CisgICAgICAgICAgICAgICAgdGUxID0gKGNyVmFsLT5hbGxfcmVzdWx0cyAqIGNyVmFsLT5zdW1fY2MgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyVmFsLT5zdW1fY29ycmVjdCAqIGNyVmFsLT5zdW1fY29ycmVjdCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNyVmFsLT5hbGxfcmVzdWx0cyAqIGNyVmFsLT5zdW1fcHAgLSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyVmFsLT5zdW1fcHJlZGljdCAqIGNyVmFsLT5zdW1fcHJlZGljdCk7CisgICAgICAgICAgICAgICAgKmNvcnJlbGF0aW9uID0gKGZsb2F0KSh0ZSAvIHRlMSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICgoZmxvYXQpY3JWYWwtPmNvcnJlY3RfcmVzdWx0cykgLyBjclZhbC0+YWxsX3Jlc3VsdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAgICAgX19FTkRfXworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBSZXNldCBjcm9zcy12YWxpZGF0aW9uIEVzdGltYXRlTW9kZWwgdG8gc3RhdGUgdGhlIHNhbWUgYXMgaXQgd2FzIGltbWlkaWF0bHkgYWZ0ZXIgCisvLyAgIGl0cyBjcmVhdGluZy4KK01MX0lNUEwKK3ZvaWQgY3ZDcm9zc1ZhbFJlc2V0IChDdlN0YXRNb2RlbCogZXN0aW1hdGVNb2RlbCkKK3sKKyAgICAgICAgQ1ZfRlVOQ05BTUUgKCJjdkNyb3NzVmFsUmVzZXQiKTsKKyAgICAgICAgX19CRUdJTl9fCisKKyAgICBDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKiBjclZhbCA9IChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKillc3RpbWF0ZU1vZGVsOworCisgICAgaWYgKCFDVl9JU19DUk9TU1ZBTCAoZXN0aW1hdGVNb2RlbCkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiUG9pbnRlciBwb2ludCB0byBub3QgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCIpOworICAgIH0KKworICAgIGNyVmFsLT5jdXJyZW50X2ZvbGQgPSAtMTsKKyAgICBjclZhbC0+aXNfY2hlY2tlZCA9IDE7CisgICAgY3JWYWwtPmFsbF9yZXN1bHRzID0gMDsKKyAgICBjclZhbC0+Y29ycmVjdF9yZXN1bHRzID0gMDsKKyAgICBjclZhbC0+c3FfZXJyb3IgPSAwOworICAgIGNyVmFsLT5zdW1fY29ycmVjdCA9IDA7CisgICAgY3JWYWwtPnN1bV9wcmVkaWN0ID0gMDsKKyAgICBjclZhbC0+c3VtX2NjID0gMDsKKyAgICBjclZhbC0+c3VtX3BwID0gMDsKKyAgICBjclZhbC0+c3VtX2NwID0gMDsKKworICAgICAgICBfX0VORF9fCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gVGhpcyBmdW5jdGlvbiBpcyBzdGFuZGFydCBDdlN0YXRNb2RlbCBmaWVsZCB0byByZWxlYXNlIGNyb3NzLXZhbGlkYXRpb24gRXN0aW1hdGVNb2RlbC4KK01MX0lNUEwKK3ZvaWQgY3ZSZWxlYXNlQ3Jvc3NWYWxpZGF0aW9uTW9kZWwgKEN2U3RhdE1vZGVsKiogbW9kZWwpCit7CisgICAgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCogcE1vZGVsOworCisgICAgICAgIENWX0ZVTkNOQU1FICgiY3ZSZWxlYXNlQ3Jvc3NWYWxpZGF0aW9uTW9kZWwiKTsKKyAgICAgICAgX19CRUdJTl9fCisgICAgCisgICAgaWYgKCFtb2RlbCkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNOdWxsUHRyLCAiIik7CisgICAgfQorCisgICAgcE1vZGVsID0gKEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwqKSptb2RlbDsKKyAgICBpZiAoIXBNb2RlbCkKKyAgICB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFDVl9JU19DUk9TU1ZBTCAocE1vZGVsKSkKKyAgICB7CisgICAgICAgIENWX0VSUk9SIChDVl9TdHNCYWRBcmcsICIiKTsKKyAgICB9CisKKyAgICBjdkZyZWUgKCZwTW9kZWwtPnNhbXBsZUlkeEFsbCk7CisgICAgY3ZGcmVlICgmcE1vZGVsLT5mb2xkcyk7CisgICAgY3ZSZWxlYXNlTWF0ICgmcE1vZGVsLT5zYW1wbGVJZHhFdmFsKTsKKyAgICBjdlJlbGVhc2VNYXQgKCZwTW9kZWwtPnNhbXBsZUlkeFRyYWluKTsKKyAgICBjdlJlbGVhc2VNYXQgKCZwTW9kZWwtPnByZWRpY3RfcmVzdWx0cyk7CisKKyAgICBjdkZyZWUgKG1vZGVsKTsKKworICAgICAgICBfX0VORF9fCit9IC8vIEVuZCBvZiBjdlJlbGVhc2VDcm9zc1ZhbGlkYXRpb25Nb2RlbC4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZSBjcm9zcy12YWxpZGF0aW9uIEVzdGltYXRlTW9kZWwuCitNTF9JTVBMIEN2U3RhdE1vZGVsKiAKK2N2Q3JlYXRlQ3Jvc3NWYWxpZGF0aW9uRXN0aW1hdGVNb2RlbCgKKyAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgICAgc2FtcGxlc19hbGwsCisgICAgICAgY29uc3QgQ3ZTdGF0TW9kZWxQYXJhbXMqIGVzdGltYXRlUGFyYW1zLAorICAgICAgIGNvbnN0IEN2TWF0KiAgICAgICAgICAgICBzYW1wbGVJZHgpCit7CisgICAgQ3ZTdGF0TW9kZWwqICAgICAgICAgICAgbW9kZWwgICA9IE5VTEw7CisgICAgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCogY3JWYWwgICA9IE5VTEw7CisKKyAgICAgICAgQ1ZfRlVOQ05BTUUgKCJjdkNyZWF0ZUNyb3NzVmFsaWRhdGlvbkVzdGltYXRlTW9kZWwiKTsKKyAgICAgICAgX19CRUdJTl9fCisKKyAgICBpbnQgIGtfZm9sZCA9IDEwOworCisgICAgaW50ICBpLCBqLCBrLCBzX2xlbjsKKyAgICBpbnQgIHNhbXBsZXNfc2VsZWN0ZWQ7CisgICAgQ3ZSTkcgcm5nOyAKKyAgICBDdlJORyogcHJuZzsKKyAgICBpbnQqIHJlc19zX2RhdGE7CisgICAgaW50KiB0ZV9zX2RhdGE7CisgICAgaW50KiBmb2xkczsKKworICAgIHJuZyA9IGN2Uk5HKGN2R2V0VGlja0NvdW50KCkpOworICAgIGN2UmFuZEludCAoJnJuZyk7IGN2UmFuZEludCAoJnJuZyk7IGN2UmFuZEludCAoJnJuZyk7IGN2UmFuZEludCAoJnJuZyk7CisvLyBDaGVjayBpbnB1dCBwYXJhbWV0ZXJzLgorICAgIGlmIChlc3RpbWF0ZVBhcmFtcykKKyAgICAgICAga19mb2xkID0gKChDdkNyb3NzVmFsaWRhdGlvblBhcmFtcyopZXN0aW1hdGVQYXJhbXMpLT5rX2ZvbGQ7CisgICAgaWYgKCFrX2ZvbGQpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiRXJyb3IgaW4gcGFyYW1ldGVycyBvZiBjcm9zcy12YWxpZGF0aW9uIChrX2ZvbGQgPT0gMCkhIik7CisgICAgfQorICAgIGlmIChzYW1wbGVzX2FsbCA8PSAwKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IgKENWX1N0c0JhZEFyZywgIjxzYW1wbGVzX2FsbD4gc2hvdWxkIGJlIHBvc2l0aXZlISIpOworICAgIH0KKworLy8gQWxsb2MgbWVtb3J5IGFuZCBmaWxsIHN0YW5kYXJ0IFN0YXRNb2RlbCdzIGZpZWxkcy4KKyAgICBDVl9DQUxMIChjclZhbCA9IChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKiljdkNyZWF0ZVN0YXRNb2RlbCAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfU1RBVF9NT0RFTF9NQUdJQ19WQUwgfCBDVl9DUk9TU1ZBTF9NQUdJQ19WQUwsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdlJlbGVhc2VDcm9zc1ZhbGlkYXRpb25Nb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMKSk7CisgICAgY3JWYWwtPmN1cnJlbnRfZm9sZCAgICA9IC0xOworICAgIGNyVmFsLT5mb2xkc19hbGwgICAgICAgPSBrX2ZvbGQ7CisgICAgaWYgKGVzdGltYXRlUGFyYW1zICYmICgoQ3ZDcm9zc1ZhbGlkYXRpb25QYXJhbXMqKWVzdGltYXRlUGFyYW1zKS0+aXNfcmVncmVzc2lvbikKKyAgICAgICAgY3JWYWwtPmlzX3JlZ3Jlc3Npb24gPSAxOworICAgIGVsc2UgCisgICAgICAgIGNyVmFsLT5pc19yZWdyZXNzaW9uID0gMDsKKyAgICBpZiAoZXN0aW1hdGVQYXJhbXMgJiYgKChDdkNyb3NzVmFsaWRhdGlvblBhcmFtcyopZXN0aW1hdGVQYXJhbXMpLT5ybmcpCisgICAgICAgIHBybmcgPSAoKEN2Q3Jvc3NWYWxpZGF0aW9uUGFyYW1zKillc3RpbWF0ZVBhcmFtcyktPnJuZzsKKyAgICBlbHNlCisgICAgICAgIHBybmcgPSAmcm5nOworCisgICAgLy8gQ2hlY2sgYW5kIHByZXByb2Nlc3Mgc2FtcGxlIGluZGljZXMuCisgICAgaWYgKHNhbXBsZUlkeCkKKyAgICB7CisgICAgICAgIGludCBzX3N0ZXA7CisgICAgICAgIGludCBzX3R5cGUgPSAwOworICAgICAgICAKKyAgICAgICAgaWYgKCFDVl9JU19NQVQgKHNhbXBsZUlkeCkpCisgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCBzYW1wbGVJZHggYXJyYXkiKTsKKworICAgICAgICBpZiAoc2FtcGxlSWR4LT5yb3dzICE9IDEgJiYgc2FtcGxlSWR4LT5jb2xzICE9IDEpCisgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkU2l6ZSwgInNhbXBsZUlkeCBhcnJheSBtdXN0IGJlIDEtZGltZW5zaW9uYWwiKTsKKworICAgICAgICBzX2xlbiA9IHNhbXBsZUlkeC0+cm93cyArIHNhbXBsZUlkeC0+Y29scyAtIDE7CisgICAgICAgIHNfc3RlcCA9IHNhbXBsZUlkeC0+cm93cyA9PSAxID8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSA6IHNhbXBsZUlkeC0+c3RlcCAvIENWX0VMRU1fU0laRShzYW1wbGVJZHgtPnR5cGUpOworCisgICAgICAgIHNfdHlwZSA9IENWX01BVF9UWVBFIChzYW1wbGVJZHgtPnR5cGUpOworCisgICAgICAgIHN3aXRjaCAoc190eXBlKQorICAgICAgICB7CisgICAgICAgIGNhc2UgQ1ZfOFVDMToKKyAgICAgICAgY2FzZSBDVl84U0MxOgorICAgICAgICAgICAgeworICAgICAgICAgICAgdWNoYXIqIHNfZGF0YSA9IHNhbXBsZUlkeC0+ZGF0YS5wdHI7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBzYW1wbGVJZHggaXMgYXJyYXkgb2YgMSdzIGFuZCAwJ3MgLQorICAgICAgICAgICAgLy8gaS5lLiBpdCBpcyBhIG1hc2sgb2YgdGhlIHNlbGVjdGVkIHNhbXBsZXMKKyAgICAgICAgICAgIGlmKCBzX2xlbiAhPSBzYW1wbGVzX2FsbCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IgKENWX1N0c1VubWF0Y2hlZFNpemVzLAorICAgICAgICJTYW1wbGUgbWFzayBzaG91bGQgY29udGFpbiBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBzYW1wbGVzX3NlbGVjdGVkID0gMDsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzX2xlbjsgaSsrKQorICAgICAgICAgICAgICAgIHNhbXBsZXNfc2VsZWN0ZWQgKz0gc19kYXRhW2kgKiBzX3N0ZXBdICE9IDA7CisKKyAgICAgICAgICAgIGlmIChzYW1wbGVzX3NlbGVjdGVkID09IDApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IgKENWX1N0c091dE9mUmFuZ2UsICJObyBzYW1wbGVzIGlzIHNlbGVjdGVkISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc19sZW4gPSBzYW1wbGVzX3NlbGVjdGVkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQ1ZfMzJTQzE6CisgICAgICAgICAgICBpZiAoc19sZW4gPiBzYW1wbGVzX2FsbCkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgInNhbXBsZUlkeCBhcnJheSBtYXkgbm90IGNvbnRhaW4gbW9yZSBlbGVtZW50cyB0aGFuIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyIpOworICAgICAgICAgICAgc2FtcGxlc19zZWxlY3RlZCA9IHNfbGVuOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzVW5zdXBwb3J0ZWRGb3JtYXQsICJVbnN1cHBvcnRlZCBzYW1wbGVJZHggYXJyYXkgZGF0YSB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihpdCBzaG91bGQgYmUgOHVDMSwgOHNDMSBvciAzMnNDMSkiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFsbG9jIGFkZGl0aW9uYWwgbWVtb3J5IGZvciBpbnRlcm5hbCBJZHggYW5kIGZpbGwgaXQuCisvKiEhKi8gIENWX0NBTEwgKHJlc19zX2RhdGEgPSBjclZhbC0+c2FtcGxlSWR4QWxsID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCopY3ZBbGxvYyAoMiAqIHNfbGVuICogc2l6ZW9mKGludCkpKTsKKworICAgICAgICBpZiAoc190eXBlIDwgQ1ZfMzJTQzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyKiBzX2RhdGEgPSBzYW1wbGVJZHgtPmRhdGEucHRyOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNfbGVuOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHNfZGF0YVtpICogc19zdGVwXSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICpyZXNfc19kYXRhKysgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc19zX2RhdGEgPSBjclZhbC0+c2FtcGxlSWR4QWxsOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50KiBzX2RhdGEgPSBzYW1wbGVJZHgtPmRhdGEuaTsKKyAgICAgICAgICAgIGludCBvdXRfb2Zfb3JkZXIgPSAwOworCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc19sZW47IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXNfc19kYXRhW2ldID0gc19kYXRhW2kgKiBzX3N0ZXBdOworICAgICAgICAgICAgICAgIGlmIChpID4gMCAmJiByZXNfc19kYXRhW2ldIDwgcmVzX3NfZGF0YVtpIC0gMV0pCisgICAgICAgICAgICAgICAgICAgIG91dF9vZl9vcmRlciA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChvdXRfb2Zfb3JkZXIpCisgICAgICAgICAgICAgICAgcXNvcnQgKHJlc19zX2RhdGEsIHNfbGVuLCBzaXplb2YocmVzX3NfZGF0YVswXSksIGljdkNtcEludGVnZXJzKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHJlc19zX2RhdGFbMF0gPCAwIHx8CisgICAgICAgICAgICAgICAgcmVzX3NfZGF0YVtzX2xlbiAtIDFdID49IHNhbXBsZXNfYWxsKQorICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAiVGhlcmUgYXJlIG91dC1vZi1yYW5nZSBzYW1wbGUgaW5kaWNlcyIpOworICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IHNfbGVuOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKHJlc19zX2RhdGFbaV0gPD0gcmVzX3NfZGF0YVtpIC0gMV0pCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SIChDVl9TdHNCYWRBcmcsICJUaGVyZSBhcmUgZHVwbGljYXRlZCIpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgLy8gaWYgKHNhbXBsZUlkeCkKKyAgICB7CisgICAgICAgIC8vIEFsbG9jIGFkZGl0aW9uYWwgbWVtb3J5IGZvciBpbnRlcm5hbCBJZHggYW5kIGZpbGwgaXQuCisgICAgICAgIHNfbGVuID0gc2FtcGxlc19hbGw7CisgICAgICAgIENWX0NBTEwgKHJlc19zX2RhdGEgPSBjclZhbC0+c2FtcGxlSWR4QWxsID0gKGludCopY3ZBbGxvYyAoMiAqIHNfbGVuICogc2l6ZW9mKGludCkpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHNfbGVuOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgICpyZXNfc19kYXRhKysgPSBpOworICAgICAgICB9CisgICAgICAgIHJlc19zX2RhdGEgPSBjclZhbC0+c2FtcGxlSWR4QWxsOworICAgIH0gLy8gaWYgKHNhbXBsZUlkeCkgLi4uIGVsc2UgCisKKy8vIFJlc29ydCBpbnRlcm5hbCBJZHguCisgICAgdGVfc19kYXRhID0gcmVzX3NfZGF0YSArIHNfbGVuOworICAgIGZvciAoaSA9IHNfbGVuOyBpID4gMTsgaS0tKQorICAgIHsKKyAgICAgICAgaiA9IGN2UmFuZEludCAocHJuZykgJSBpOworICAgICAgICBrID0gKigtLXRlX3NfZGF0YSk7CisgICAgICAgICp0ZV9zX2RhdGEgPSByZXNfc19kYXRhW2pdOworICAgICAgICByZXNfc19kYXRhW2pdID0gazsKKyAgICB9CisKKy8vIER1cGxpY2F0ZSByZXNvcnRlZCBpbnRlcm5hbCBJZHguIAorLy8gSXQgd2lsbCBiZSB1c2VkIHRvIHNpbXBsaWZ5IG9wZXJhdGlvbiBvZiBnZXR0aW5nIHRyYWluSWR4LgorICAgIHRlX3NfZGF0YSA9IHJlc19zX2RhdGEgKyBzX2xlbjsKKyAgICBmb3IgKGkgPSAwOyBpIDwgc19sZW47IGkrKykKKyAgICB7CisgICAgICAgICp0ZV9zX2RhdGErKyA9ICpyZXNfc19kYXRhKys7CisgICAgfQorCisvLyBDdXQgc2FtcGxlSWR4QWxsIHRvIHBhcnRzLgorICAgIGlmIChrX2ZvbGQgPiAwKQorICAgIHsKKyAgICAgICAgaWYgKGtfZm9sZCA+IHNfbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwYXJhbWV0ZXJzIG9mIGNyb3NzLXZhbGlkYXRpb24gKCdrX2ZvbGQnID4gI3NhbXBsZXMpISIpOworICAgICAgICB9CisgICAgICAgIGZvbGRzID0gY3JWYWwtPmZvbGRzID0gKGludCopIGN2QWxsb2MgKChrX2ZvbGQgKyAxKSAqIHNpemVvZiAoaW50KSk7CisgICAgICAgICpmb2xkcysrID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IGtfZm9sZDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqZm9sZHMrKyA9IGN2Um91bmQgKGkgKiBzX2xlbiAqIDEuIC8ga19mb2xkKTsKKyAgICAgICAgfQorICAgICAgICAqZm9sZHMgPSBzX2xlbjsKKyAgICAgICAgZm9sZHMgPSBjclZhbC0+Zm9sZHM7CisKKyAgICAgICAgY3JWYWwtPm1heF9mb2xkX3NpemUgPSAoc19sZW4gLSAxKSAvIGtfZm9sZCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGsgPSAta19mb2xkOworICAgICAgICBjclZhbC0+bWF4X2ZvbGRfc2l6ZSA9IGs7CisgICAgICAgIGlmIChrID49IHNfbGVuKQorICAgICAgICB7CisgICAgICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAKKyAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcGFyYW1ldGVycyBvZiBjcm9zcy12YWxpZGF0aW9uICgtJ2tfZm9sZCcgPiAjc2FtcGxlcykhIik7CisgICAgICAgIH0KKyAgICAgICAgY3JWYWwtPmZvbGRzX2FsbCA9IGsgPSAoc19sZW4gLSAxKSAvIGsgKyAxOworCisgICAgICAgIGZvbGRzID0gY3JWYWwtPmZvbGRzID0gKGludCopIGN2QWxsb2MgKChrICsgMSkgKiBzaXplb2YgKGludCkpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgazsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICAqZm9sZHMrKyA9IC1pICoga19mb2xkOworICAgICAgICB9CisgICAgICAgICpmb2xkcyA9IHNfbGVuOworICAgICAgICBmb2xkcyA9IGNyVmFsLT5mb2xkczsKKyAgICB9CisKKy8vIFByZXBhcmUgb3RoZXIgaW50ZXJuYWwgZmllbGRzIHRvIHdvcmtpbmcuCisgICAgQ1ZfQ0FMTCAoY3JWYWwtPnByZWRpY3RfcmVzdWx0cyA9IGN2Q3JlYXRlTWF0ICgxLCBzYW1wbGVzX2FsbCwgQ1ZfMzJGQzEpKTsKKyAgICBDVl9DQUxMIChjclZhbC0+c2FtcGxlSWR4RXZhbCA9IGN2Q3JlYXRlTWF0SGVhZGVyICgxLCAxLCBDVl8zMlNDMSkpOworICAgIENWX0NBTEwgKGNyVmFsLT5zYW1wbGVJZHhUcmFpbiA9IGN2Q3JlYXRlTWF0SGVhZGVyICgxLCAxLCBDVl8zMlNDMSkpOworICAgIGNyVmFsLT5zYW1wbGVJZHhFdmFsLT5jb2xzID0gMDsKKyAgICBjclZhbC0+c2FtcGxlSWR4VHJhaW4tPmNvbHMgPSAwOworICAgIGNyVmFsLT5zYW1wbGVzX2FsbCA9IHNfbGVuOworICAgIGNyVmFsLT5pc19jaGVja2VkID0gMTsKKworICAgIGNyVmFsLT5nZXRUcmFpbklkeE1hdCA9IGN2Q3Jvc3NWYWxHZXRUcmFpbklkeE1hdHJpeDsKKyAgICBjclZhbC0+Z2V0Q2hlY2tJZHhNYXQgPSBjdkNyb3NzVmFsR2V0Q2hlY2tJZHhNYXRyaXg7CisgICAgY3JWYWwtPm5leHRTdGVwID0gY3ZDcm9zc1ZhbE5leHRTdGVwOworICAgIGNyVmFsLT5jaGVjayA9IGN2Q3Jvc3NWYWxDaGVja0NsYXNzaWZpZXI7CisgICAgY3JWYWwtPmdldFJlc3VsdCA9IGN2Q3Jvc3NWYWxHZXRSZXN1bHQ7CisgICAgY3JWYWwtPnJlc2V0ID0gY3ZDcm9zc1ZhbFJlc2V0OworCisgICAgbW9kZWwgPSAoQ3ZTdGF0TW9kZWwqKWNyVmFsOworCisgICAgICAgIF9fRU5EX18KKworICAgIGlmICghbW9kZWwpCisgICAgeworICAgICAgICBjdlJlbGVhc2VDcm9zc1ZhbGlkYXRpb25Nb2RlbCAoKEN2U3RhdE1vZGVsKiopJmNyVmFsKTsKKyAgICB9CisKKyAgICByZXR1cm4gbW9kZWw7Cit9IC8vIEVuZCBvZiBjdkNyZWF0ZUNyb3NzVmFsaWRhdGlvbkVzdGltYXRlTW9kZWwKKyAgICAgICAgICAgIAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgRXh0ZW5kZWQgaW50ZXJmYWNlIHdpdGggYmFja2NhbGxzIGZvciBtb2RlbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitNTF9JTVBMIGZsb2F0CitjdkNyb3NzVmFsaWRhdGlvbiAoY29uc3QgQ3ZNYXQqICAgICAgICAgICAgdHJ1ZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICAgdGZsYWcsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqICAgICAgICAgICAgdHJ1ZUNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTdGF0TW9kZWwqICAgICAoKmNyZWF0ZUNsYXNzaWZpZXIpIChjb25zdCBDdk1hdCosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q2xhc3NpZmllclRyYWluUGFyYW1zKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCosIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiksCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZDbGFzc2lmaWVyVHJhaW5QYXJhbXMqICAgIGVzdGltYXRlUGFyYW1zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2Q2xhc3NpZmllclRyYWluUGFyYW1zKiAgICB0cmFpblBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgICAgICBjb21wSWR4LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiAgICAgICAgICAgIHNhbXBsZUlkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdlN0YXRNb2RlbCoqICAgICBwQ3JWYWxNb2RlbCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgICAgICB0eXBlTWFzaywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogICAgICAgICAgICBtaXNzZWRNZWFzdXJlbWVudE1hc2spCit7CisgICAgQ3ZDcm9zc1ZhbGlkYXRpb25Nb2RlbCogY3JWYWwgPSBOVUxMOworICAgIGZsb2F0ICByZXN1bHQgPSAwOworICAgIEN2U3RhdE1vZGVsKiBwQ2xhc3NpZmllciA9IE5VTEw7CisKKyAgICAgICAgQ1ZfRlVOQ05BTUUgKCJjdkNyb3NzVmFsaWRhdGlvbiIpOworICAgICAgICBfX0JFR0lOX18KKworICAgIGNvbnN0IEN2TWF0KiB0cmFpbkRhdGFJZHg7CisgICAgaW50ICAgIHNhbXBsZXNfYWxsOworCisvLyBjaGVja2luZyBpbnB1dCBkYXRhCisgICAgaWYgKChjcmVhdGVDbGFzc2lmaWVyKSA9PSBOVUxMKQorICAgIHsKKyAgICAgICAgQ1ZfRVJST1IgKENWX1N0c051bGxQdHIsICJOdWxsIHBvaW50ZXIgdG8gZnVuY3RpaW9uIHdoaWNoIGNyZWF0ZSBjbGFzc2lmaWVyIik7CisgICAgfQorICAgIGlmIChwQ3JWYWxNb2RlbCAmJiAqcENyVmFsTW9kZWwgJiYgIUNWX0lTX0NST1NTVkFMKCpwQ3JWYWxNb2RlbCkpCisgICAgeworICAgICAgICBDVl9FUlJPUiAoQ1ZfU3RzQmFkQXJnLCAKKyAgICAgICAgICAgIjxwQ3JWYWxNb2RlbD4gcG9pbnQgdG8gbm90IGNyb3NzLXZhbGlkYXRpb24gbW9kZWwiKTsKKyAgICB9CisKKy8vIGluaXRpYWxpemF0aW9uCisgICAgaWYgKHBDclZhbE1vZGVsICYmICpwQ3JWYWxNb2RlbCkKKyAgICB7CisgICAgICAgIGNyVmFsID0gKEN2Q3Jvc3NWYWxpZGF0aW9uTW9kZWwqKSpwQ3JWYWxNb2RlbDsKKyAgICAgICAgY3JWYWwtPnJlc2V0ICgoQ3ZTdGF0TW9kZWwqKWNyVmFsKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgc2FtcGxlc19hbGwgPSAoKHRmbGFnKSA/IHRydWVEYXRhLT5yb3dzIDogdHJ1ZURhdGEtPmNvbHMpOworICAgICAgICBDVl9DQUxMIChjclZhbCA9IChDdkNyb3NzVmFsaWRhdGlvbk1vZGVsKikKKyAgICAgICAgICAgY3ZDcmVhdGVDcm9zc1ZhbGlkYXRpb25Fc3RpbWF0ZU1vZGVsIChzYW1wbGVzX2FsbCwgZXN0aW1hdGVQYXJhbXMsIHNhbXBsZUlkeCkpOworICAgIH0KKworICAgIENWX0NBTEwgKHRyYWluRGF0YUlkeCA9IGNyVmFsLT5nZXRUcmFpbklkeE1hdCAoKEN2U3RhdE1vZGVsKiljclZhbCkpOworCisvLyBvcGVyYXRpb24gbG9vcAorICAgIGZvciAoOyBjclZhbC0+bmV4dFN0ZXAoKEN2U3RhdE1vZGVsKiljclZhbCkgIT0gMDsgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCAocENsYXNzaWZpZXIgPSBjcmVhdGVDbGFzc2lmaWVyICh0cnVlRGF0YSwgdGZsYWcsIHRydWVDbGFzc2VzLCAKKyAgICAgICAgICAgICAgICAgICAgdHJhaW5QYXJhbXMsIGNvbXBJZHgsIHRyYWluRGF0YUlkeCwgdHlwZU1hc2ssIG1pc3NlZE1lYXN1cmVtZW50TWFzaykpOworICAgICAgICBDVl9DQUxMIChjclZhbC0+Y2hlY2sgKChDdlN0YXRNb2RlbCopY3JWYWwsIHBDbGFzc2lmaWVyLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZURhdGEsIHRmbGFnLCB0cnVlQ2xhc3NlcykpOworCisgICAgICAgIHBDbGFzc2lmaWVyLT5yZWxlYXNlICgmcENsYXNzaWZpZXIpOworICAgIH0KKworLy8gR2V0IHJlc3VsdCBhbmQgZmlsbCBvdXRwdXQgZmllbGQuCisgICAgQ1ZfQ0FMTCAocmVzdWx0ID0gY3JWYWwtPmdldFJlc3VsdCAoKEN2U3RhdE1vZGVsKiljclZhbCwgMCkpOworCisgICAgaWYgKHBDclZhbE1vZGVsICYmICEqcENyVmFsTW9kZWwpCisgICAgICAgICpwQ3JWYWxNb2RlbCA9IChDdlN0YXRNb2RlbCopY3JWYWw7CisKKyAgICAgICAgX19FTkRfXworCisvLyBGcmVlIGFsbCBtZW1vcnkgdGhhdCBzaG91bGQgYmUgZnJlZWQuCisgICAgaWYgKHBDbGFzc2lmaWVyKQorICAgICAgICBwQ2xhc3NpZmllci0+cmVsZWFzZSAoJnBDbGFzc2lmaWVyKTsKKyAgICBpZiAoY3JWYWwgJiYgKCFwQ3JWYWxNb2RlbCB8fCAhKnBDclZhbE1vZGVsKSkKKyAgICAgICAgY3JWYWwtPnJlbGVhc2UgKChDdlN0YXRNb2RlbCoqKSZjclZhbCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBFbmQgb2YgY3ZDcm9zc1ZhbGlkYXRpb24KKworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tbC9zcmMvbWxrbmVhcmVzdC5jcHAgYi9tbC9zcmMvbWxrbmVhcmVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4ZDViMwotLS0gL2Rldi9udWxsCisrKyBiL21sL3NyYy9tbGtuZWFyZXN0LmNwcApAQCAtMCwwICsxLDQwMSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICAgSy1OZWFyZXN0IE5laWdoYm9ycyBDbGFzc2lmaWVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8gayBOZWFyZXN0IE5laWdoYm9ycworQ3ZLTmVhcmVzdDo6Q3ZLTmVhcmVzdCgpCit7CisgICAgc2FtcGxlcyA9IDA7CisgICAgY2xlYXIoKTsKK30KKworCitDdktOZWFyZXN0Ojp+Q3ZLTmVhcmVzdCgpCit7CisgICAgY2xlYXIoKTsKK30KKworCitDdktOZWFyZXN0OjpDdktOZWFyZXN0KCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LCBib29sIF9pc19yZWdyZXNzaW9uLCBpbnQgX21heF9rICkKK3sKKyAgICBzYW1wbGVzID0gMDsKKyAgICB0cmFpbiggX3RyYWluX2RhdGEsIF9yZXNwb25zZXMsIF9zYW1wbGVfaWR4LCBfaXNfcmVncmVzc2lvbiwgX21heF9rLCBmYWxzZSApOworfQorCisKK3ZvaWQgQ3ZLTmVhcmVzdDo6Y2xlYXIoKQoreworICAgIHdoaWxlKCBzYW1wbGVzICkKKyAgICB7CisgICAgICAgIEN2VmVjdG9ycyogbmV4dF9zYW1wbGVzID0gc2FtcGxlcy0+bmV4dDsKKyAgICAgICAgY3ZGcmVlKCAmc2FtcGxlcy0+ZGF0YS5mbCApOworICAgICAgICBjdkZyZWUoICZzYW1wbGVzICk7CisgICAgICAgIHNhbXBsZXMgPSBuZXh0X3NhbXBsZXM7CisgICAgfQorICAgIHZhcl9jb3VudCA9IDA7CisgICAgdG90YWwgPSAwOworICAgIG1heF9rID0gMDsKK30KKworCitpbnQgQ3ZLTmVhcmVzdDo6Z2V0X21heF9rKCkgY29uc3QgeyByZXR1cm4gbWF4X2s7IH0KKworaW50IEN2S05lYXJlc3Q6OmdldF92YXJfY291bnQoKSBjb25zdCB7IHJldHVybiB2YXJfY291bnQ7IH0KKworYm9vbCBDdktOZWFyZXN0Ojppc19yZWdyZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gcmVncmVzc2lvbjsgfQorCitpbnQgQ3ZLTmVhcmVzdDo6Z2V0X3NhbXBsZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHRvdGFsOyB9CisKK2Jvb2wgQ3ZLTmVhcmVzdDo6dHJhaW4oIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHgsIGJvb2wgX2lzX3JlZ3Jlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgX21heF9rLCBib29sIF91cGRhdGVfYmFzZSApCit7CisgICAgYm9vbCBvayA9IGZhbHNlOworICAgIEN2TWF0KiByZXNwb25zZXMgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdktOZWFyZXN0Ojp0cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2VmVjdG9ycyogX3NhbXBsZXM7CisgICAgZmxvYXQqKiBfZGF0YTsKKyAgICBpbnQgX2NvdW50LCBfZGltcywgX2RpbXNfYWxsLCBfcnNpemU7CisgICAgCisgICAgaWYoICFfdXBkYXRlX2Jhc2UgKQorICAgICAgICBjbGVhcigpOworCisgICAgLy8gUHJlcGFyZSB0cmFpbmluZyBkYXRhIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMuCisgICAgLy8gVHJlYXQgY2F0ZWdvcmljYWwgcmVzcG9uc2VzIGFzIG9yZGVyZWQgLSB0byBwcmV2ZW50IGNsYXNzIGxhYmVsIGNvbXByZXNzaW9uIGFuZAorICAgIC8vIHRvIGVuYWJsZSBlbnRlcmluZyBuZXcgY2xhc3NlcyBpbiB0aGUgdXBkYXRlcworICAgIENWX0NBTEwoIGN2UHJlcGFyZVRyYWluRGF0YSggIkN2S05lYXJlc3Q6OnRyYWluIiwgX3RyYWluX2RhdGEsIENWX1JPV19TQU1QTEUsCisgICAgICAgIF9yZXNwb25zZXMsIENWX1ZBUl9PUkRFUkVELCAwLCBfc2FtcGxlX2lkeCwgdHJ1ZSwgKGNvbnN0IGZsb2F0KioqKSZfZGF0YSwKKyAgICAgICAgJl9jb3VudCwgJl9kaW1zLCAmX2RpbXNfYWxsLCAmcmVzcG9uc2VzLCAwLCAwICkpOworCisgICAgaWYoIF91cGRhdGVfYmFzZSAmJiBfZGltcyAhPSB2YXJfY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIG5ld2x5IGFkZGVkIGRhdGEgaGF2ZSBkaWZmZXJlbnQgZGltZW5zaW9uYWxpdHkiICk7CisKKyAgICBpZiggIV91cGRhdGVfYmFzZSApCisgICAgeworICAgICAgICBpZiggX21heF9rIDwgMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIm1heF9rIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXIiICk7CisgICAgICAgIAorICAgICAgICByZWdyZXNzaW9uID0gX2lzX3JlZ3Jlc3Npb247CisgICAgICAgIHZhcl9jb3VudCA9IF9kaW1zOworICAgICAgICBtYXhfayA9IF9tYXhfazsKKyAgICB9CisKKyAgICBfcnNpemUgPSBfY291bnQqc2l6ZW9mKGZsb2F0KTsKKyAgICBDVl9DQUxMKCBfc2FtcGxlcyA9IChDdlZlY3RvcnMqKWN2QWxsb2MoIHNpemVvZigqX3NhbXBsZXMpICsgX3JzaXplICkpOworICAgIF9zYW1wbGVzLT5uZXh0ID0gc2FtcGxlczsKKyAgICBfc2FtcGxlcy0+dHlwZSA9IENWXzMyRjsKKyAgICBfc2FtcGxlcy0+ZGF0YS5mbCA9IF9kYXRhOworICAgIF9zYW1wbGVzLT5jb3VudCA9IF9jb3VudDsKKyAgICB0b3RhbCArPSBfY291bnQ7CisKKyAgICBzYW1wbGVzID0gX3NhbXBsZXM7CisgICAgbWVtY3B5KCBfc2FtcGxlcyArIDEsIHJlc3BvbnNlcy0+ZGF0YS5mbCwgX3JzaXplICk7CisKKyAgICBvayA9IHRydWU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG9rOworfQorCisKKwordm9pZCBDdktOZWFyZXN0OjpmaW5kX25laWdoYm9yc19kaXJlY3QoIGNvbnN0IEN2TWF0KiBfc2FtcGxlcywgaW50IGssIGludCBzdGFydCwgaW50IGVuZCwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIG5laWdoYm9yX3Jlc3BvbnNlcywgY29uc3QgZmxvYXQqKiBuZWlnaGJvcnMsIGZsb2F0KiBkaXN0ICkgY29uc3QKK3sKKyAgICBpbnQgaSwgaiwgY291bnQgPSBlbmQgLSBzdGFydCwgazEgPSAwLCBrMiA9IDAsIGQgPSB2YXJfY291bnQ7CisgICAgQ3ZWZWN0b3JzKiBzID0gc2FtcGxlczsKKworICAgIGZvciggOyBzICE9IDA7IHMgPSBzLT5uZXh0ICkKKyAgICB7CisgICAgICAgIGludCBuID0gcy0+Y291bnQ7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBuOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgICAgICAgICAgQ3YzMnN1ZiBzaTsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogdiA9IHMtPmRhdGEuZmxbal07CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIHUgPSAoZmxvYXQqKShfc2FtcGxlcy0+ZGF0YS5wdHIgKyBfc2FtcGxlcy0+c3RlcCooc3RhcnQgKyBpKSk7CisgICAgICAgICAgICAgICAgQ3YzMnN1ZiogZGQgPSAoQ3YzMnN1ZiopKGRpc3QgKyBpKmspOworICAgICAgICAgICAgICAgIGZsb2F0KiBucjsKKyAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCoqIG5uOworICAgICAgICAgICAgICAgIGludCB0LCBpaSwgaWkxOworCisgICAgICAgICAgICAgICAgZm9yKCB0ID0gMDsgdCA8PSBkIC0gNDsgdCArPSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IHVbdF0gLSB2W3RdLCB0MSA9IHVbdCsxXSAtIHZbdCsxXTsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQyID0gdVt0KzJdIC0gdlt0KzJdLCB0MyA9IHVbdCszXSAtIHZbdCszXTsKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IHQwKnQwICsgdDEqdDEgKyB0Mip0MiArIHQzKnQzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciggOyB0IDwgZDsgdCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB0MCA9IHVbdF0gLSB2W3RdOworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gdDAqdDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2kuZiA9IChmbG9hdClzdW07CisgICAgICAgICAgICAgICAgZm9yKCBpaSA9IGsxLTE7IGlpID49IDA7IGlpLS0gKQorICAgICAgICAgICAgICAgICAgICBpZiggc2kuaSA+IGRkW2lpXS5pICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGlmKCBpaSA+PSBrLTEgKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgICAgIG5yID0gbmVpZ2hib3JfcmVzcG9uc2VzICsgaSprOworICAgICAgICAgICAgICAgIG5uID0gbmVpZ2hib3JzID8gbmVpZ2hib3JzICsgKHN0YXJ0ICsgaSkqayA6IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpaTEgPSBrMiAtIDE7IGlpMSA+IGlpOyBpaTEtLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBkZFtpaTErMV0uaSA9IGRkW2lpMV0uaTsKKyAgICAgICAgICAgICAgICAgICAgbnJbaWkxKzFdID0gbnJbaWkxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG5uICkgbm5baWkxKzFdID0gbm5baWkxXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGRbaWkrMV0uaSA9IHNpLmk7CisgICAgICAgICAgICAgICAgbnJbaWkrMV0gPSAoKGZsb2F0KikocyArIDEpKVtqXTsKKyAgICAgICAgICAgICAgICBpZiggbm4gKQorICAgICAgICAgICAgICAgICAgICBubltpaSsxXSA9IHY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBrMSA9IE1JTiggazErMSwgayApOworICAgICAgICAgICAgazIgPSBNSU4oIGsxLCBrLTEgKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitmbG9hdCBDdktOZWFyZXN0Ojp3cml0ZV9yZXN1bHRzKCBpbnQgaywgaW50IGsxLCBpbnQgc3RhcnQsIGludCBlbmQsCisgICAgY29uc3QgZmxvYXQqIG5laWdoYm9yX3Jlc3BvbnNlcywgY29uc3QgZmxvYXQqIGRpc3QsCisgICAgQ3ZNYXQqIF9yZXN1bHRzLCBDdk1hdCogX25laWdoYm9yX3Jlc3BvbnNlcywKKyAgICBDdk1hdCogX2Rpc3QsIEN2MzJzdWYqIHNvcnRfYnVmICkgY29uc3QKK3sKKyAgICBmbG9hdCByZXN1bHQgPSAwLmY7CisgICAgaW50IGksIGosIGoxLCBjb3VudCA9IGVuZCAtIHN0YXJ0OworICAgIGRvdWJsZSBpbnZfc2NhbGUgPSAxLi9rMTsKKyAgICBpbnQgcnN0ZXAgPSBfcmVzdWx0cyAmJiAhQ1ZfSVNfTUFUX0NPTlQoX3Jlc3VsdHMtPnR5cGUpID8gX3Jlc3VsdHMtPnN0ZXAvc2l6ZW9mKHJlc3VsdCkgOiAxOworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3YzMnN1ZiogbnIgPSAoY29uc3QgQ3YzMnN1ZiopKG5laWdoYm9yX3Jlc3BvbnNlcyArIGkqayk7CisgICAgICAgIGZsb2F0KiBkc3Q7CisgICAgICAgIGZsb2F0IHI7CisgICAgICAgIGlmKCBfcmVzdWx0cyB8fCBzdGFydCtpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggcmVncmVzc2lvbiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHMgPSAwOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBrMTsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgcyArPSBucltqXS5mOworICAgICAgICAgICAgICAgIHIgPSAoZmxvYXQpKHMqaW52X3NjYWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcHJldl9zdGFydCA9IDAsIGJlc3RfY291bnQgPSAwLCBjdXJfY291bnQ7CisgICAgICAgICAgICAgICAgQ3YzMnN1ZiBiZXN0X3ZhbDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBrMTsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgc29ydF9idWZbal0uaSA9IG5yW2pdLmk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBrMS0xOyBqID4gMDsgai0tICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc3dhcF9mbCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBmb3IoIGoxID0gMDsgajEgPCBqOyBqMSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBzb3J0X2J1ZltqMV0uaSA+IHNvcnRfYnVmW2oxKzFdLmkgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENWX1NXQVAoIHNvcnRfYnVmW2oxXS5pLCBzb3J0X2J1ZltqMSsxXS5pLCB0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcF9mbCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmKCAhc3dhcF9mbCApCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBiZXN0X3ZhbC5pID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSAxOyBqIDw9IGsxOyBqKysgKQorICAgICAgICAgICAgICAgICAgICBpZiggaiA9PSBrMSB8fCBzb3J0X2J1ZltqXS5pICE9IHNvcnRfYnVmW2otMV0uaSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9jb3VudCA9IGogLSBwcmV2X3N0YXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGJlc3RfY291bnQgPCBjdXJfY291bnQgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RfY291bnQgPSBjdXJfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVzdF92YWwuaSA9IHNvcnRfYnVmW2otMV0uaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc3RhcnQgPSBqOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgciA9IGJlc3RfdmFsLmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCBzdGFydCtpID09IDAgKQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHI7CisKKyAgICAgICAgICAgIGlmKCBfcmVzdWx0cyApCisgICAgICAgICAgICAgICAgX3Jlc3VsdHMtPmRhdGEuZmxbKHN0YXJ0ICsgaSkqcnN0ZXBdID0gcjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBfbmVpZ2hib3JfcmVzcG9uc2VzICkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0ID0gKGZsb2F0KikoX25laWdoYm9yX3Jlc3BvbnNlcy0+ZGF0YS5wdHIgKworICAgICAgICAgICAgICAgIChzdGFydCArIGkpKl9uZWlnaGJvcl9yZXNwb25zZXMtPnN0ZXApOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGsxOyBqKysgKQorICAgICAgICAgICAgICAgIGRzdFtqXSA9IG5yW2pdLmY7CisgICAgICAgICAgICBmb3IoIDsgaiA8IGs7IGorKyApCisgICAgICAgICAgICAgICAgZHN0W2pdID0gMC5mOworICAgICAgICB9CisKKyAgICAgICAgaWYoIF9kaXN0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0ID0gKGZsb2F0KikoX2Rpc3QtPmRhdGEucHRyICsgKHN0YXJ0ICsgaSkqX2Rpc3QtPnN0ZXApOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGsxOyBqKysgKQorICAgICAgICAgICAgICAgIGRzdFtqXSA9IGRpc3RbaiArIGkqa107CisgICAgICAgICAgICBmb3IoIDsgaiA8IGs7IGorKyApCisgICAgICAgICAgICAgICAgZHN0W2pdID0gMC5mOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyAgICAKKworCitmbG9hdCBDdktOZWFyZXN0OjpmaW5kX25lYXJlc3QoIGNvbnN0IEN2TWF0KiBfc2FtcGxlcywgaW50IGssIEN2TWF0KiBfcmVzdWx0cywKKyAgICBjb25zdCBmbG9hdCoqIF9uZWlnaGJvcnMsIEN2TWF0KiBfbmVpZ2hib3JfcmVzcG9uc2VzLCBDdk1hdCogX2Rpc3QgKSBjb25zdAoreworICAgIGZsb2F0IHJlc3VsdCA9IDAuZjsKKyAgICBib29sIGxvY2FsX2FsbG9jID0gZmFsc2U7CisgICAgZmxvYXQqIGJ1ZiA9IDA7CisgICAgY29uc3QgaW50IG1heF9ibGtfY291bnQgPSAxMjgsIG1heF9idWZfc3ogPSAxIDw8IDEyOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdktOZWFyZXN0OjpmaW5kX25lYXJlc3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgaSwgY291bnQsIGNvdW50X3NjYWxlLCBibGtfY291bnQwLCBibGtfY291bnQgPSAwLCBidWZfc3osIGsxOworCisgICAgaWYoICFzYW1wbGVzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiVGhlIHNlYXJjaCB0cmVlIG11c3QgYmUgY29uc3RydWN0ZWQgZmlyc3QgdXNpbmcgdHJhaW4gbWV0aG9kIiApOworCisgICAgaWYoICFDVl9JU19NQVQoX3NhbXBsZXMpIHx8CisgICAgICAgIENWX01BVF9UWVBFKF9zYW1wbGVzLT50eXBlKSAhPSBDVl8zMkZDMSB8fAorICAgICAgICBfc2FtcGxlcy0+Y29scyAhPSB2YXJfY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW5wdXQgc2FtcGxlcyBtdXN0IGJlIGZsb2F0aW5nLXBvaW50IG1hdHJpeCAoPG51bV9zYW1wbGVzPng8dmFyX2NvdW50PikiICk7CisKKyAgICBpZiggX3Jlc3VsdHMgJiYgKCFDVl9JU19NQVQoX3Jlc3VsdHMpIHx8CisgICAgICAgIF9yZXN1bHRzLT5jb2xzICE9IDEgJiYgX3Jlc3VsdHMtPnJvd3MgIT0gMSB8fAorICAgICAgICBfcmVzdWx0cy0+Y29scyArIF9yZXN1bHRzLT5yb3dzIC0gMSAhPSBfc2FtcGxlcy0+cm93cykgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAiVGhlIHJlc3VsdHMgbXVzdCBiZSAxZCB2ZWN0b3IgY29udGFpbmluZyBhcyBtdWNoIGVsZW1lbnRzIGFzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyIgKTsKKworICAgIGlmKCBfcmVzdWx0cyAmJiBDVl9NQVRfVFlQRShfcmVzdWx0cy0+dHlwZSkgIT0gQ1ZfMzJGQzEgJiYKKyAgICAgICAgKENWX01BVF9UWVBFKF9yZXN1bHRzLT50eXBlKSAhPSBDVl8zMlNDMSB8fCByZWdyZXNzaW9uKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LAorICAgICAgICAiVGhlIHJlc3VsdHMgbXVzdCBiZSBmbG9hdGluZy1wb2ludCBvciBpbnRlZ2VyIChpbiBjYXNlIG9mIGNsYXNzaWZpY2F0aW9uKSB2ZWN0b3IiICk7CisKKyAgICBpZiggayA8IDEgfHwgayA+IG1heF9rICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJrIG11c3QgYmUgd2l0aGluIDEuLm1heF9rIHJhbmdlIiApOworCisgICAgaWYoIF9uZWlnaGJvcl9yZXNwb25zZXMgKQorICAgIHsKKyAgICAgICAgaWYoICFDVl9JU19NQVQoX25laWdoYm9yX3Jlc3BvbnNlcykgfHwgQ1ZfTUFUX1RZUEUoX25laWdoYm9yX3Jlc3BvbnNlcy0+dHlwZSkgIT0gQ1ZfMzJGQzEgfHwKKyAgICAgICAgICAgIF9uZWlnaGJvcl9yZXNwb25zZXMtPnJvd3MgIT0gX3NhbXBsZXMtPnJvd3MgfHwgX25laWdoYm9yX3Jlc3BvbnNlcy0+Y29scyAhPSBrICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiVGhlIG5laWdoYm9yIHJlc3BvbnNlcyAoaWYgcHJlc2VudCkgbXVzdCBiZSBmbG9hdGluZy1wb2ludCBtYXRyaXggb2YgPG51bV9zYW1wbGVzPiB4IDxrPiBzaXplIiApOworICAgIH0KKworICAgIGlmKCBfZGlzdCApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChfZGlzdCkgfHwgQ1ZfTUFUX1RZUEUoX2Rpc3QtPnR5cGUpICE9IENWXzMyRkMxIHx8CisgICAgICAgICAgICBfZGlzdC0+cm93cyAhPSBfc2FtcGxlcy0+cm93cyB8fCBfZGlzdC0+Y29scyAhPSBrICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiVGhlIGRpc3RhbmNlcyBmcm9tIHRoZSBuZWlnaGJvcnMgKGlmIHByZXNlbnQpIG11c3QgYmUgZmxvYXRpbmctcG9pbnQgbWF0cml4IG9mIDxudW1fc2FtcGxlcz4geCA8az4gc2l6ZSIgKTsKKyAgICB9CisKKyAgICBjb3VudCA9IF9zYW1wbGVzLT5yb3dzOworICAgIGNvdW50X3NjYWxlID0gayoyKnNpemVvZihmbG9hdCk7CisgICAgYmxrX2NvdW50MCA9IE1JTiggY291bnQsIG1heF9ibGtfY291bnQgKTsKKyAgICBidWZfc3ogPSBNSU4oIGJsa19jb3VudDAgKiBjb3VudF9zY2FsZSwgbWF4X2J1Zl9zeiApOworICAgIGJsa19jb3VudDAgPSBNQVgoIGJ1Zl9zei9jb3VudF9zY2FsZSwgMSApOworICAgIGJsa19jb3VudDAgKz0gYmxrX2NvdW50MCAlIDI7CisgICAgYmxrX2NvdW50MCA9IE1JTiggYmxrX2NvdW50MCwgY291bnQgKTsKKyAgICBidWZfc3ogPSBibGtfY291bnQwICogY291bnRfc2NhbGUgKyBrKnNpemVvZihmbG9hdCk7CisgICAgazEgPSBnZXRfc2FtcGxlX2NvdW50KCk7CisgICAgazEgPSBNSU4oIGsxLCBrICk7CisKKyAgICBpZiggYnVmX3N6IDw9IENWX01BWF9MT0NBTF9TSVpFICkKKyAgICB7CisgICAgICAgIGJ1ZiA9IChmbG9hdCopY3ZTdGFja0FsbG9jKCBidWZfc3ogKTsKKyAgICAgICAgbG9jYWxfYWxsb2MgPSB0cnVlOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0NBTEwoIGJ1ZiA9IChmbG9hdCopY3ZBbGxvYyggYnVmX3N6ICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpICs9IGJsa19jb3VudCApCisgICAgeworICAgICAgICBibGtfY291bnQgPSBNSU4oIGNvdW50IC0gaSwgYmxrX2NvdW50MCApOworICAgICAgICBmbG9hdCogbmVpZ2hib3JfcmVzcG9uc2VzID0gYnVmOworICAgICAgICBmbG9hdCogZGlzdCA9IGJ1ZiArIGJsa19jb3VudCprOworICAgICAgICBDdjMyc3VmKiBzb3J0X2J1ZiA9IChDdjMyc3VmKikoZGlzdCArIGJsa19jb3VudCprKTsKKworICAgICAgICBmaW5kX25laWdoYm9yc19kaXJlY3QoIF9zYW1wbGVzLCBrLCBpLCBpICsgYmxrX2NvdW50LAorICAgICAgICAgICAgICAgICAgICBuZWlnaGJvcl9yZXNwb25zZXMsIF9uZWlnaGJvcnMsIGRpc3QgKTsKKworICAgICAgICBmbG9hdCByID0gd3JpdGVfcmVzdWx0cyggaywgazEsIGksIGkgKyBibGtfY291bnQsIG5laWdoYm9yX3Jlc3BvbnNlcywgZGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHRzLCBfbmVpZ2hib3JfcmVzcG9uc2VzLCBfZGlzdCwgc29ydF9idWYgKTsKKyAgICAgICAgaWYoIGkgPT0gMCApCisgICAgICAgICAgICByZXN1bHQgPSByOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tbC9zcmMvbWxuYmF5ZXMuY3BwIGIvbWwvc3JjL21sbmJheWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBjNWVlCi0tLSAvZGV2L251bGwKKysrIGIvbWwvc3JjL21sbmJheWVzLmNwcApAQCAtMCwwICsxLDU2OSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKK0N2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjpDdk5vcm1hbEJheWVzQ2xhc3NpZmllcigpCit7CisgICAgdmFyX2NvdW50ID0gdmFyX2FsbCA9IDA7CisgICAgdmFyX2lkeCA9IDA7CisgICAgY2xzX2xhYmVscyA9IDA7CisgICAgY291bnQgPSAwOworICAgIHN1bSA9IDA7CisgICAgcHJvZHVjdHN1bSA9IDA7CisgICAgYXZnID0gMDsKKyAgICBpbnZfZWlnZW5fdmFsdWVzID0gMDsKKyAgICBjb3Zfcm90YXRlX21hdHMgPSAwOworICAgIGMgPSAwOworICAgIGRlZmF1bHRfbW9kZWxfbmFtZSA9ICJteV9uYiI7Cit9CisKKwordm9pZCBDdk5vcm1hbEJheWVzQ2xhc3NpZmllcjo6Y2xlYXIoKQoreworICAgIGlmKCBjbHNfbGFiZWxzICkKKyAgICB7CisgICAgICAgIGZvciggaW50IGNscyA9IDA7IGNscyA8IGNsc19sYWJlbHMtPmNvbHM7IGNscysrICkKKyAgICAgICAgeworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmY291bnRbY2xzXSApOworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmc3VtW2Nsc10gKTsKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJnByb2R1Y3RzdW1bY2xzXSApOworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmYXZnW2Nsc10gKTsKKyAgICAgICAgICAgIGN2UmVsZWFzZU1hdCggJmludl9laWdlbl92YWx1ZXNbY2xzXSApOworICAgICAgICAgICAgY3ZSZWxlYXNlTWF0KCAmY292X3JvdGF0ZV9tYXRzW2Nsc10gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBjdlJlbGVhc2VNYXQoICZjbHNfbGFiZWxzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdmFyX2lkeCApOworICAgIGN2UmVsZWFzZU1hdCggJmMgKTsKKyAgICBjdkZyZWUoICZjb3VudCApOworfQorCisKK0N2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjp+Q3ZOb3JtYWxCYXllc0NsYXNzaWZpZXIoKQoreworICAgIGNsZWFyKCk7Cit9CisKKworQ3ZOb3JtYWxCYXllc0NsYXNzaWZpZXI6OkN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyKAorICAgIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsCisgICAgY29uc3QgQ3ZNYXQqIF92YXJfaWR4LCBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHggKQoreworICAgIHZhcl9jb3VudCA9IHZhcl9hbGwgPSAwOworICAgIHZhcl9pZHggPSAwOworICAgIGNsc19sYWJlbHMgPSAwOworICAgIGNvdW50ID0gMDsKKyAgICBzdW0gPSAwOworICAgIHByb2R1Y3RzdW0gPSAwOworICAgIGF2ZyA9IDA7CisgICAgaW52X2VpZ2VuX3ZhbHVlcyA9IDA7CisgICAgY292X3JvdGF0ZV9tYXRzID0gMDsKKyAgICBjID0gMDsKKyAgICBkZWZhdWx0X21vZGVsX25hbWUgPSAibXlfbmIiOworCisgICAgdHJhaW4oIF90cmFpbl9kYXRhLCBfcmVzcG9uc2VzLCBfdmFyX2lkeCwgX3NhbXBsZV9pZHggKTsKK30KKworCitib29sIEN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjp0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3Zhcl9pZHgsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwgYm9vbCB1cGRhdGUgKQoreworICAgIGNvbnN0IGZsb2F0IG1pbl92YXJpYXRpb24gPSBGTFRfRVBTSUxPTjsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIEN2TWF0KiByZXNwb25zZXMgICA9IDA7CisgICAgY29uc3QgZmxvYXQqKiB0cmFpbl9kYXRhID0gMDsKKyAgICBDdk1hdCogX19jbHNfbGFiZWxzID0gMDsKKyAgICBDdk1hdCogX192YXJfaWR4ID0gMDsKKyAgICBDdk1hdCogY292ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggIkN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjp0cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBjbHMsIG5zYW1wbGVzID0gMCwgX3Zhcl9jb3VudCA9IDAsIF92YXJfYWxsID0gMCwgbmNsYXNzZXMgPSAwOworICAgIGludCBzLCBjMSwgYzI7CisgICAgY29uc3QgaW50KiByZXNwb25zZXNfZGF0YTsKKyAgICAKKyAgICBDVl9DQUxMKCBjdlByZXBhcmVUcmFpbkRhdGEoIDAsCisgICAgICAgIF90cmFpbl9kYXRhLCBDVl9ST1dfU0FNUExFLCBfcmVzcG9uc2VzLCBDVl9WQVJfQ0FURUdPUklDQUwsCisgICAgICAgIF92YXJfaWR4LCBfc2FtcGxlX2lkeCwgZmFsc2UsICZ0cmFpbl9kYXRhLAorICAgICAgICAmbnNhbXBsZXMsICZfdmFyX2NvdW50LCAmX3Zhcl9hbGwsICZyZXNwb25zZXMsCisgICAgICAgICZfX2Nsc19sYWJlbHMsICZfX3Zhcl9pZHggKSk7CisKKyAgICBpZiggIXVwZGF0ZSApCisgICAgeworICAgICAgICBjb25zdCBzaXplX3QgbWF0X3NpemUgPSBzaXplb2YoQ3ZNYXQqKTsKKyAgICAgICAgc2l6ZV90IGRhdGFfc2l6ZTsKKworICAgICAgICBjbGVhcigpOworCisgICAgICAgIHZhcl9pZHggPSBfX3Zhcl9pZHg7CisgICAgICAgIGNsc19sYWJlbHMgPSBfX2Nsc19sYWJlbHM7CisgICAgICAgIF9fdmFyX2lkeCA9IF9fY2xzX2xhYmVscyA9IDA7CisgICAgICAgIHZhcl9jb3VudCA9IF92YXJfY291bnQ7CisgICAgICAgIHZhcl9hbGwgPSBfdmFyX2FsbDsKKworICAgICAgICBuY2xhc3NlcyA9IGNsc19sYWJlbHMtPmNvbHM7CisgICAgICAgIGRhdGFfc2l6ZSA9IG5jbGFzc2VzKjYqbWF0X3NpemU7CisKKyAgICAgICAgQ1ZfQ0FMTCggY291bnQgPSAoQ3ZNYXQqKiljdkFsbG9jKCBkYXRhX3NpemUgKSk7CisgICAgICAgIG1lbXNldCggY291bnQsIDAsIGRhdGFfc2l6ZSApOworCisgICAgICAgIHN1bSAgICAgICAgICAgICA9IGNvdW50ICAgICAgKyBuY2xhc3NlczsKKyAgICAgICAgcHJvZHVjdHN1bSAgICAgID0gc3VtICAgICAgICArIG5jbGFzc2VzOworICAgICAgICBhdmcgICAgICAgICAgICAgPSBwcm9kdWN0c3VtICsgbmNsYXNzZXM7CisgICAgICAgIGludl9laWdlbl92YWx1ZXM9IGF2ZyAgICAgICAgKyBuY2xhc3NlczsKKyAgICAgICAgY292X3JvdGF0ZV9tYXRzID0gaW52X2VpZ2VuX3ZhbHVlcyAgICAgICAgICsgbmNsYXNzZXM7CisgICAgICAgIAorICAgICAgICBDVl9DQUxMKCBjID0gY3ZDcmVhdGVNYXQoIDEsIG5jbGFzc2VzLCBDVl82NEZDMSApKTsKKworICAgICAgICBmb3IoIGNscyA9IDA7IGNscyA8IG5jbGFzc2VzOyBjbHMrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoY291bnRbY2xzXSAgICAgICAgICAgID0gY3ZDcmVhdGVNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfMzJTQzEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKHN1bVtjbHNdICAgICAgICAgICAgICA9IGN2Q3JlYXRlTWF0KCAxLCB2YXJfY291bnQsIENWXzY0RkMxICkpOworICAgICAgICAgICAgQ1ZfQ0FMTChwcm9kdWN0c3VtW2Nsc10gICAgICAgPSBjdkNyZWF0ZU1hdCggdmFyX2NvdW50LCB2YXJfY291bnQsIENWXzY0RkMxICkpOworICAgICAgICAgICAgQ1ZfQ0FMTChhdmdbY2xzXSAgICAgICAgICAgICAgPSBjdkNyZWF0ZU1hdCggMSwgdmFyX2NvdW50LCBDVl82NEZDMSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoaW52X2VpZ2VuX3ZhbHVlc1tjbHNdID0gY3ZDcmVhdGVNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfNjRGQzEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKGNvdl9yb3RhdGVfbWF0c1tjbHNdICA9IGN2Q3JlYXRlTWF0KCB2YXJfY291bnQsIHZhcl9jb3VudCwgQ1ZfNjRGQzEgKSk7CisgICAgICAgICAgICBDVl9DQUxMKGN2WmVybyggY291bnRbY2xzXSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoY3ZaZXJvKCBzdW1bY2xzXSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoY3ZaZXJvKCBwcm9kdWN0c3VtW2Nsc10gKSk7CisgICAgICAgICAgICBDVl9DQUxMKGN2WmVybyggYXZnW2Nsc10gKSk7CisgICAgICAgICAgICBDVl9DQUxMKGN2WmVybyggaW52X2VpZ2VuX3ZhbHVlc1tjbHNdICkpOworICAgICAgICAgICAgQ1ZfQ0FMTChjdlplcm8oIGNvdl9yb3RhdGVfbWF0c1tjbHNdICkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIG5ldyB0cmFpbmluZyBkYXRhIGhhcyB0aGUgc2FtZSBkaW1lbnNpb25hbGl0eSBldGMuCisgICAgICAgIGlmKCBfdmFyX2NvdW50ICE9IHZhcl9jb3VudCB8fCBfdmFyX2FsbCAhPSB2YXJfYWxsIHx8ICEoIV92YXJfaWR4ICYmICF2YXJfaWR4IHx8CisgICAgICAgICAgICBfdmFyX2lkeCAmJiB2YXJfaWR4ICYmIGN2Tm9ybShfdmFyX2lkeCx2YXJfaWR4LENWX0MpIDwgREJMX0VQU0lMT04pICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAiVGhlIG5ldyB0cmFpbmluZyBkYXRhIGlzIGluY29uc2lzdGVudCB3aXRoIHRoZSBvcmlnaW5hbCB0cmFpbmluZyBkYXRhIiApOworCisgICAgICAgIGlmKCBjbHNfbGFiZWxzLT5jb2xzICE9IF9fY2xzX2xhYmVscy0+Y29scyB8fAorICAgICAgICAgICAgY3ZOb3JtKGNsc19sYWJlbHMsIF9fY2xzX2xhYmVscywgQ1ZfQykgPiBEQkxfRVBTSUxPTiApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzTm90SW1wbGVtZW50ZWQsCisgICAgICAgICAgICAiSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gdGhlIG5ldyB0cmFpbmluZyBkYXRhIG11c3QgaGF2ZSBhYnNvbHV0ZWx5ICIKKyAgICAgICAgICAgICJ0aGUgc2FtZSBzZXQgb2YgY2xhc3MgbGFiZWxzIGFzIHVzZWQgaW4gdGhlIG9yaWdpbmFsIHRyYWluaW5nIGRhdGEiICk7CisKKyAgICAgICAgbmNsYXNzZXMgPSBjbHNfbGFiZWxzLT5jb2xzOworICAgIH0KKworICAgIHJlc3BvbnNlc19kYXRhID0gcmVzcG9uc2VzLT5kYXRhLmk7CisgICAgQ1ZfQ0FMTCggY292ID0gY3ZDcmVhdGVNYXQoIF92YXJfY291bnQsIF92YXJfY291bnQsIENWXzY0RkMxICkpOworCisgICAgLyogcHJvY2VzcyB0cmFpbiBkYXRhIChjb3VudCwgc3VtICwgcHJvZHVjdHN1bSkgKi8KKyAgICBmb3IoIHMgPSAwOyBzIDwgbnNhbXBsZXM7IHMrKyApCisgICAgeworICAgICAgICBjbHMgPSByZXNwb25zZXNfZGF0YVtzXTsKKyAgICAgICAgaW50KiBjb3VudF9kYXRhID0gY291bnRbY2xzXS0+ZGF0YS5pOworICAgICAgICBkb3VibGUqIHN1bV9kYXRhID0gc3VtW2Nsc10tPmRhdGEuZGI7CisgICAgICAgIGRvdWJsZSogcHJvZF9kYXRhID0gcHJvZHVjdHN1bVtjbHNdLT5kYXRhLmRiOworICAgICAgICBjb25zdCBmbG9hdCogdHJhaW5fdmVjID0gdHJhaW5fZGF0YVtzXTsKKyAgICAgICAgCisgICAgICAgIGZvciggYzEgPSAwOyBjMSA8IF92YXJfY291bnQ7IGMxKyssIHByb2RfZGF0YSArPSBfdmFyX2NvdW50ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbDEgPSB0cmFpbl92ZWNbYzFdOworICAgICAgICAgICAgc3VtX2RhdGFbYzFdICs9IHZhbDE7CisgICAgICAgICAgICBjb3VudF9kYXRhW2MxXSsrOworICAgICAgICAgICAgZm9yKCBjMiA9IGMxOyBjMiA8IF92YXJfY291bnQ7IGMyKysgKQorICAgICAgICAgICAgICAgIHByb2RfZGF0YVtjMl0gKz0gdHJhaW5fdmVjW2MyXSp2YWwxOworICAgICAgICB9CisgICAgfQorCisgICAgLyogY2FsY3VsYXRlIGF2ZywgY292YXJpYW5jZSBtYXRyaXgsIGMgKi8KKyAgICBmb3IoIGNscyA9IDA7IGNscyA8IG5jbGFzc2VzOyBjbHMrKyApCisgICAgeworICAgICAgICBkb3VibGUgZGV0ID0gMTsKKyAgICAgICAgaW50IGksIGo7CisgICAgICAgIEN2TWF0KiB3ID0gaW52X2VpZ2VuX3ZhbHVlc1tjbHNdOworICAgICAgICBpbnQqIGNvdW50X2RhdGEgPSBjb3VudFtjbHNdLT5kYXRhLmk7CisgICAgICAgIGRvdWJsZSogYXZnX2RhdGEgPSBhdmdbY2xzXS0+ZGF0YS5kYjsKKyAgICAgICAgZG91YmxlKiBzdW0xID0gc3VtW2Nsc10tPmRhdGEuZGI7CisKKyAgICAgICAgY3ZDb21wbGV0ZVN5bW0oIHByb2R1Y3RzdW1bY2xzXSwgMCApOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBfdmFyX2NvdW50OyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbiA9IGNvdW50X2RhdGFbal07CisgICAgICAgICAgICBhdmdfZGF0YVtqXSA9IG4gPyBzdW0xW2pdIC8gbiA6IDAuOworICAgICAgICB9CisKKyAgICAgICAgY291bnRfZGF0YSA9IGNvdW50W2Nsc10tPmRhdGEuaTsKKyAgICAgICAgYXZnX2RhdGEgPSBhdmdbY2xzXS0+ZGF0YS5kYjsKKyAgICAgICAgc3VtMSA9IHN1bVtjbHNdLT5kYXRhLmRiOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBfdmFyX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUqIGF2ZzJfZGF0YSA9IGF2Z1tjbHNdLT5kYXRhLmRiOworICAgICAgICAgICAgZG91YmxlKiBzdW0yID0gc3VtW2Nsc10tPmRhdGEuZGI7CisgICAgICAgICAgICBkb3VibGUqIHByb2RfZGF0YSA9IHByb2R1Y3RzdW1bY2xzXS0+ZGF0YS5kYiArIGkqX3Zhcl9jb3VudDsKKyAgICAgICAgICAgIGRvdWJsZSogY292X2RhdGEgPSBjb3YtPmRhdGEuZGIgKyBpKl92YXJfY291bnQ7CisgICAgICAgICAgICBkb3VibGUgczF2YWwgPSBzdW0xW2pdOworICAgICAgICAgICAgZG91YmxlIGF2ZzEgPSBhdmdfZGF0YVtpXTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IGNvdW50X2RhdGFbaV07CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPD0gaTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgYXZnMiA9IGF2ZzJfZGF0YVtqXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgY292X3ZhbCA9IHByb2RfZGF0YVtqXSAtIGF2ZzEgKiBzdW0yW2pdIC0gYXZnMiAqIHMxdmFsICsgYXZnMSAqIGF2ZzIgKiBjb3VudDsKKyAgICAgICAgICAgICAgICBjb3ZfdmFsID0gKGNvdW50ID4gMSkgPyBjb3ZfdmFsIC8gKGNvdW50IC0gMSkgOiBjb3ZfdmFsOworICAgICAgICAgICAgICAgIGNvdl9kYXRhW2pdID0gY292X3ZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIENWX0NBTEwoIGN2Q29tcGxldGVTeW1tKCBjb3YsIDEgKSk7CisgICAgICAgIENWX0NBTEwoIGN2U1ZEKCBjb3YsIHcsIGNvdl9yb3RhdGVfbWF0c1tjbHNdLCAwLCBDVl9TVkRfVV9UICkpOworICAgICAgICBDVl9DQUxMKCBjdk1heFMoIHcsIG1pbl92YXJpYXRpb24sIHcgKSk7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBfdmFyX2NvdW50OyBqKysgKQorICAgICAgICAgICAgZGV0ICo9IHctPmRhdGEuZGJbal07CisKKyAgICAgICAgQ1ZfQ0FMTCggY3ZEaXYoIE5VTEwsIHcsIHcgKSk7CisgICAgICAgIGMtPmRhdGEuZGJbY2xzXSA9IGxvZyggZGV0ICk7CisgICAgfQorCisgICAgcmVzdWx0ID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggIXJlc3VsdCB8fCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgICAgIGNsZWFyKCk7CisKKyAgICBjdlJlbGVhc2VNYXQoICZjb3YgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfX2Nsc19sYWJlbHMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZfX3Zhcl9pZHggKTsKKyAgICBjdkZyZWUoICZ0cmFpbl9kYXRhICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Zsb2F0IEN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjpwcmVkaWN0KCBjb25zdCBDdk1hdCogc2FtcGxlcywgQ3ZNYXQqIHJlc3VsdHMgKSBjb25zdAoreworICAgIGZsb2F0IHZhbHVlID0gMDsKKyAgICB2b2lkKiBidWZmZXIgPSAwOworICAgIGludCBhbGxvY2F0ZWRfYnVmZmVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZOb3JtYWxCYXllc0NsYXNzaWZpZXI6OnByZWRpY3QiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIGosIGssIGNscyA9IC0xLCBfdmFyX2NvdW50LCBuY2xhc3NlczsKKyAgICBkb3VibGUgb3B0ID0gRkxUX01BWDsKKyAgICBDdk1hdCBkaWZmOworICAgIGludCBydHlwZSA9IDAsIHJzdGVwID0gMCwgc2l6ZTsKKyAgICBjb25zdCBpbnQqIHZpZHggPSAwOworCisgICAgbmNsYXNzZXMgPSBjbHNfbGFiZWxzLT5jb2xzOworICAgIF92YXJfY291bnQgPSBhdmdbMF0tPmNvbHM7CisKKyAgICBpZiggIUNWX0lTX01BVChzYW1wbGVzKSB8fCBDVl9NQVRfVFlQRShzYW1wbGVzLT50eXBlKSAhPSBDVl8zMkZDMSB8fCBzYW1wbGVzLT5jb2xzICE9IHZhcl9hbGwgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAiVGhlIGlucHV0IHNhbXBsZXMgbXVzdCBiZSAzMmYgbWF0cml4IHdpdGggdGhlIG51bWJlciBvZiBjb2x1bW5zID0gdmFyX2FsbCIgKTsKKworICAgIGlmKCBzYW1wbGVzLT5yb3dzID4gMSAmJiAhcmVzdWx0cyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLAorICAgICAgICAiV2hlbiB0aGUgbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgaXMgPjEsIHRoZSBvdXRwdXQgdmVjdG9yIG9mIHJlc3VsdHMgbXVzdCBiZSBwYXNzZWQiICk7CisKKyAgICBpZiggcmVzdWx0cyApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChyZXN1bHRzKSB8fCBDVl9NQVRfVFlQRShyZXN1bHRzLT50eXBlKSAhPSBDVl8zMkZDMSAmJgorICAgICAgICBDVl9NQVRfVFlQRShyZXN1bHRzLT50eXBlKSAhPSBDVl8zMlNDMSB8fAorICAgICAgICByZXN1bHRzLT5jb2xzICE9IDEgJiYgcmVzdWx0cy0+cm93cyAhPSAxIHx8CisgICAgICAgIHJlc3VsdHMtPmNvbHMgKyByZXN1bHRzLT5yb3dzIC0gMSAhPSBzYW1wbGVzLT5yb3dzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBvdXRwdXQgYXJyYXkgbXVzdCBiZSBpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50IHZlY3RvciAiCisgICAgICAgICJ3aXRoIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgPSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgaW5wdXQgbWF0cml4IiApOworCisgICAgICAgIHJ0eXBlID0gQ1ZfTUFUX1RZUEUocmVzdWx0cy0+dHlwZSk7CisgICAgICAgIHJzdGVwID0gQ1ZfSVNfTUFUX0NPTlQocmVzdWx0cy0+dHlwZSkgPyAxIDogcmVzdWx0cy0+c3RlcC9DVl9FTEVNX1NJWkUocnR5cGUpOworICAgIH0KKyAgICAKKyAgICBpZiggdmFyX2lkeCApCisgICAgICAgIHZpZHggPSB2YXJfaWR4LT5kYXRhLmk7CisKKy8vIGFsbG9jYXRlIG1lbW9yeSBhbmQgaW5pdGlhbGl6aW5nIGhlYWRlcnMgZm9yIGNhbGN1bGF0aW5nCisgICAgc2l6ZSA9IHNpemVvZihkb3VibGUpICogKG5jbGFzc2VzICsgdmFyX2NvdW50KTsKKyAgICBpZiggc2l6ZSA8PSBDVl9NQVhfTE9DQUxfU0laRSApCisgICAgICAgIGJ1ZmZlciA9IGN2U3RhY2tBbGxvYyggc2l6ZSApOworICAgIGVsc2UKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGJ1ZmZlciA9IGN2QWxsb2MoIHNpemUgKSk7CisgICAgICAgIGFsbG9jYXRlZF9idWZmZXIgPSAxOworICAgIH0KKyAgICAKKyAgICBkaWZmID0gY3ZNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfNjRGQzEsIGJ1ZmZlciApOworCisgICAgZm9yKCBrID0gMDsgayA8IHNhbXBsZXMtPnJvd3M7IGsrKyApCisgICAgeworICAgICAgICBpbnQgaXZhbDsKKyAgICAgICAgCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGN1ciA9IGMtPmRhdGEuZGJbaV07CisgICAgICAgICAgICBDdk1hdCogdSA9IGNvdl9yb3RhdGVfbWF0c1tpXTsKKyAgICAgICAgICAgIEN2TWF0KiB3ID0gaW52X2VpZ2VuX3ZhbHVlc1tpXTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogYXZnX2RhdGEgPSBhdmdbaV0tPmRhdGEuZGI7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogeCA9IChjb25zdCBmbG9hdCopKHNhbXBsZXMtPmRhdGEucHRyICsgc2FtcGxlcy0+c3RlcCprKTsKKworICAgICAgICAgICAgLy8gY292ID0gdSB3IHUnICAtLT4gIGNvdl4oLTEpID0gdSB3XigtMSkgdScKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBfdmFyX2NvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIGRpZmYuZGF0YS5kYltqXSA9IGF2Z19kYXRhW2pdIC0geFt2aWR4ID8gdmlkeFtqXSA6IGpdOworCisgICAgICAgICAgICBDVl9DQUxMKGN2R0VNTSggJmRpZmYsIHUsIDEsIDAsIDAsICZkaWZmLCBDVl9HRU1NX0JfVCApKTsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBfdmFyX2NvdW50OyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBkID0gZGlmZi5kYXRhLmRiW2pdOworICAgICAgICAgICAgICAgIGN1ciArPSBkKmQqdy0+ZGF0YS5kYltqXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGN1ciA8IG9wdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2xzID0gaTsKKyAgICAgICAgICAgICAgICBvcHQgPSBjdXI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBwcm9iYWJpbGl0eSA9IGV4cCggLTAuNSAqIGN1ciApICovCisgICAgICAgIH0KKworICAgICAgICBpdmFsID0gY2xzX2xhYmVscy0+ZGF0YS5pW2Nsc107CisgICAgICAgIGlmKCByZXN1bHRzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHJ0eXBlID09IENWXzMyU0MxICkKKyAgICAgICAgICAgICAgICByZXN1bHRzLT5kYXRhLmlbaypyc3RlcF0gPSBpdmFsOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdHMtPmRhdGEuZmxbaypyc3RlcF0gPSAoZmxvYXQpaXZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiggayA9PSAwICkKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWl2YWw7CisKKyAgICAgICAgLyppZiggX3Byb2JzICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0U2NhbGUoICZleHBvLCAmZXhwbywgLTAuNSApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2RXhwKCAmZXhwbywgJmV4cG8gKSk7CisgICAgICAgICAgICBpZiggX3Byb2JzLT5jb2xzID09IDEgKQorICAgICAgICAgICAgICAgIENWX0NBTEwoIGN2UmVzaGFwZSggJmV4cG8sICZleHBvLCAxLCBuY2xhc3NlcyApKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2Q29udmVydFNjYWxlKCAmZXhwbywgX3Byb2JzLCAxLi9jdlN1bSggJmV4cG8gKS52YWxbMF0gKSk7CisgICAgICAgIH0qLworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBpZiggYWxsb2NhdGVkX2J1ZmZlciApCisgICAgICAgIGN2RnJlZSggJmJ1ZmZlciApOworCisgICAgcmV0dXJuIHZhbHVlOworfQorCisKK3ZvaWQgQ3ZOb3JtYWxCYXllc0NsYXNzaWZpZXI6OndyaXRlKCBDdkZpbGVTdG9yYWdlKiBmcywgY29uc3QgY2hhciogbmFtZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJDdk5vcm1hbEJheWVzQ2xhc3NpZmllcjo6d3JpdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgbmNsYXNzZXMsIGk7CisKKyAgICBuY2xhc3NlcyA9IGNsc19sYWJlbHMtPmNvbHM7CisKKyAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCBuYW1lLCBDVl9OT0RFX01BUCwgQ1ZfVFlQRV9OQU1FX01MX05CQVlFUyApOworCisgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggZnMsICJ2YXJfY291bnQiLCB2YXJfY291bnQgKSk7CisgICAgQ1ZfQ0FMTCggY3ZXcml0ZUludCggZnMsICJ2YXJfYWxsIiwgdmFyX2FsbCApKTsKKworICAgIGlmKCB2YXJfaWR4ICkKKyAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZSggZnMsICJ2YXJfaWR4IiwgdmFyX2lkeCApKTsKKyAgICBDVl9DQUxMKCBjdldyaXRlKCBmcywgImNsc19sYWJlbHMiLCBjbHNfbGFiZWxzICkpOworCisgICAgQ1ZfQ0FMTCggY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImNvdW50IiwgQ1ZfTk9ERV9TRVEgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKysgKQorICAgICAgICBDVl9DQUxMKCBjdldyaXRlKCBmcywgTlVMTCwgY291bnRbaV0gKSk7CisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAic3VtIiwgQ1ZfTk9ERV9TRVEgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKysgKQorICAgICAgICBDVl9DQUxMKCBjdldyaXRlKCBmcywgTlVMTCwgc3VtW2ldICkpOworICAgIENWX0NBTEwoIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICkpOworIAorICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJwcm9kdWN0c3VtIiwgQ1ZfTk9ERV9TRVEgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKysgKQorICAgICAgICBDVl9DQUxMKCBjdldyaXRlKCBmcywgTlVMTCwgcHJvZHVjdHN1bVtpXSApKTsKKyAgICBDVl9DQUxMKCBjdkVuZFdyaXRlU3RydWN0KCBmcyApKTsKKworICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJhdmciLCBDVl9OT0RFX1NFUSApKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKyApCisgICAgICAgIENWX0NBTEwoIGN2V3JpdGUoIGZzLCBOVUxMLCBhdmdbaV0gKSk7CisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAiaW52X2VpZ2VuX3ZhbHVlcyIsIENWX05PREVfU0VRICkpOworICAgIGZvciggaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrICkKKyAgICAgICAgQ1ZfQ0FMTCggY3ZXcml0ZSggZnMsIE5VTEwsIGludl9laWdlbl92YWx1ZXNbaV0gKSk7CisgICAgQ1ZfQ0FMTCggY3ZFbmRXcml0ZVN0cnVjdCggZnMgKSk7CisKKyAgICBDVl9DQUxMKCBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAiY292X3JvdGF0ZV9tYXRzIiwgQ1ZfTk9ERV9TRVEgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKysgKQorICAgICAgICBDVl9DQUxMKCBjdldyaXRlKCBmcywgTlVMTCwgY292X3JvdGF0ZV9tYXRzW2ldICkpOworICAgIENWX0NBTEwoIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICkpOworCisgICAgQ1ZfQ0FMTCggY3ZXcml0ZSggZnMsICJjIiwgYyApKTsKKworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZOb3JtYWxCYXllc0NsYXNzaWZpZXI6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiByb290X25vZGUgKQoreworICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICBDVl9GVU5DTkFNRSggIkN2Tm9ybWFsQmF5ZXNDbGFzc2lmaWVyOjpyZWFkIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5jbGFzc2VzLCBpOworICAgIHNpemVfdCBkYXRhX3NpemU7CisgICAgQ3ZGaWxlTm9kZSogbm9kZTsKKyAgICBDdlNlcSogc2VxOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICAKKyAgICBjbGVhcigpOworCisgICAgQ1ZfQ0FMTCggdmFyX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgcm9vdF9ub2RlLCAidmFyX2NvdW50IiwgLTEgKSk7CisgICAgQ1ZfQ0FMTCggdmFyX2FsbCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHJvb3Rfbm9kZSwgInZhcl9hbGwiLCAtMSApKTsKKyAgICBDVl9DQUxMKCB2YXJfaWR4ID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCByb290X25vZGUsICJ2YXJfaWR4IiApKTsKKyAgICBDVl9DQUxMKCBjbHNfbGFiZWxzID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCByb290X25vZGUsICJjbHNfbGFiZWxzIiApKTsKKyAgICBpZiggIWNsc19sYWJlbHMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIk5vIFwiY2xzX2xhYmVsc1wiIGluIE5CYXllcyBjbGFzc2lmaWVyIiApOworICAgIGlmKCBjbHNfbGFiZWxzLT5jb2xzIDwgMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJOdW1iZXIgb2YgY2xhc3NlcyBpcyBsZXNzIDEiICk7CisgICAgaWYoIHZhcl9jb3VudCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsCisgICAgICAgICJUaGUgZmllbGQgXCJ2YXJfY291bnRcIiBvZiBOQmF5ZXMgY2xhc3NpZmllciBpcyBtaXNzaW5nIiApOworICAgIG5jbGFzc2VzID0gY2xzX2xhYmVscy0+Y29sczsKKworICAgIGRhdGFfc2l6ZSA9IG5jbGFzc2VzKjYqc2l6ZW9mKEN2TWF0Kik7CisgICAgQ1ZfQ0FMTCggY291bnQgPSAoQ3ZNYXQqKiljdkFsbG9jKCBkYXRhX3NpemUgKSk7CisgICAgbWVtc2V0KCBjb3VudCwgMCwgZGF0YV9zaXplICk7CisKKyAgICBzdW0gPSBjb3VudCArIG5jbGFzc2VzOworICAgIHByb2R1Y3RzdW0gID0gc3VtICArIG5jbGFzc2VzOworICAgIGF2ZyA9IHByb2R1Y3RzdW0gKyBuY2xhc3NlczsKKyAgICBpbnZfZWlnZW5fdmFsdWVzID0gYXZnICsgbmNsYXNzZXM7CisgICAgY292X3JvdGF0ZV9tYXRzID0gaW52X2VpZ2VuX3ZhbHVlcyArIG5jbGFzc2VzOworCisgICAgQ1ZfQ0FMTCggbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCByb290X25vZGUsICJjb3VudCIgKSk7CisgICAgc2VxID0gbm9kZS0+ZGF0YS5zZXE7CisgICAgaWYoICFDVl9OT0RFX0lTX1NFUShub2RlLT50YWcpIHx8IHNlcS0+dG90YWwgIT0gbmNsYXNzZXMpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlciwgMCApKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBjb3VudFtpXSA9IChDdk1hdCopY3ZSZWFkKCBmcywgKEN2RmlsZU5vZGUqKXJlYWRlci5wdHIgKSk7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNlcS0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHJvb3Rfbm9kZSwgInN1bSIgKSk7CisgICAgc2VxID0gbm9kZS0+ZGF0YS5zZXE7CisgICAgaWYoICFDVl9OT0RFX0lTX1NFUShub2RlLT50YWcpIHx8IHNlcS0+dG90YWwgIT0gbmNsYXNzZXMpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlciwgMCApKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBzdW1baV0gPSAoQ3ZNYXQqKWN2UmVhZCggZnMsIChDdkZpbGVOb2RlKilyZWFkZXIucHRyICkpOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzZXEtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCByb290X25vZGUsICJwcm9kdWN0c3VtIiApKTsKKyAgICBzZXEgPSBub2RlLT5kYXRhLnNlcTsKKyAgICBpZiggIUNWX05PREVfSVNfU0VRKG5vZGUtPnRhZykgfHwgc2VxLT50b3RhbCAhPSBuY2xhc3NlcykKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKyAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyLCAwICkpOworICAgIGZvciggaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHByb2R1Y3RzdW1baV0gPSAoQ3ZNYXQqKWN2UmVhZCggZnMsIChDdkZpbGVOb2RlKilyZWFkZXIucHRyICkpOworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBzZXEtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgQ1ZfQ0FMTCggbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCByb290X25vZGUsICJhdmciICkpOworICAgIHNlcSA9IG5vZGUtPmRhdGEuc2VxOworICAgIGlmKCAhQ1ZfTk9ERV9JU19TRVEobm9kZS0+dGFnKSB8fCBzZXEtPnRvdGFsICE9IG5jbGFzc2VzKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiIiApOworICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCBzZXEsICZyZWFkZXIsIDAgKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IG5jbGFzc2VzOyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYXZnW2ldID0gKEN2TWF0KiljdlJlYWQoIGZzLCAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0ciApKTsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIENWX0NBTEwoIG5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgcm9vdF9ub2RlLCAiaW52X2VpZ2VuX3ZhbHVlcyIgKSk7CisgICAgc2VxID0gbm9kZS0+ZGF0YS5zZXE7CisgICAgaWYoICFDVl9OT0RFX0lTX1NFUShub2RlLT50YWcpIHx8IHNlcS0+dG90YWwgIT0gbmNsYXNzZXMpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisgICAgQ1ZfQ0FMTCggY3ZTdGFydFJlYWRTZXEoIHNlcSwgJnJlYWRlciwgMCApKTsKKyAgICBmb3IoIGkgPSAwOyBpIDwgbmNsYXNzZXM7IGkrKyApCisgICAgeworICAgICAgICBDVl9DQUxMKCBpbnZfZWlnZW5fdmFsdWVzW2ldID0gKEN2TWF0KiljdlJlYWQoIGZzLCAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0ciApKTsKKyAgICAgICAgQ1ZfTkVYVF9TRVFfRUxFTSggc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIENWX0NBTEwoIG5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgcm9vdF9ub2RlLCAiY292X3JvdGF0ZV9tYXRzIiApKTsKKyAgICBzZXEgPSBub2RlLT5kYXRhLnNlcTsKKyAgICBpZiggIUNWX05PREVfSVNfU0VRKG5vZGUtPnRhZykgfHwgc2VxLT50b3RhbCAhPSBuY2xhc3NlcykKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKyAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyLCAwICkpOworICAgIGZvciggaSA9IDA7IGkgPCBuY2xhc3NlczsgaSsrICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGNvdl9yb3RhdGVfbWF0c1tpXSA9IChDdk1hdCopY3ZSZWFkKCBmcywgKEN2RmlsZU5vZGUqKXJlYWRlci5wdHIgKSk7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHNlcS0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBjID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCByb290X25vZGUsICJjIiApKTsKKworICAgIG9rID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICBpZiggIW9rICkKKyAgICAgICAgY2xlYXIoKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCisKZGlmZiAtLWdpdCBhL21sL3NyYy9tbHJ0cmVlcy5jcHAgYi9tbC9zcmMvbWxydHJlZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjExN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tbC9zcmMvbWxydHJlZXMuY3BwCkBAIC0wLDAgKzEsNjkzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfbWwuaCIKKworQ3ZGb3Jlc3RUcmVlOjpDdkZvcmVzdFRyZWUoKQoreworICAgIGZvcmVzdCA9IE5VTEw7Cit9CisKKworQ3ZGb3Jlc3RUcmVlOjp+Q3ZGb3Jlc3RUcmVlKCkKK3sKKyAgICBjbGVhcigpOworfQorCisKK2Jvb2wgQ3ZGb3Jlc3RUcmVlOjp0cmFpbiggQ3ZEVHJlZVRyYWluRGF0YSogX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZSVHJlZXMqIF9mb3Jlc3QgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2Rm9yZXN0VHJlZTo6dHJhaW4iICk7CisKKyAgICBfX0JFR0lOX187CisKKworICAgIGNsZWFyKCk7CisgICAgZm9yZXN0ID0gX2ZvcmVzdDsKKworICAgIGRhdGEgPSBfZGF0YTsKKyAgICBkYXRhLT5zaGFyZWQgPSB0cnVlOworICAgIENWX0NBTEwocmVzdWx0ID0gZG9fdHJhaW4oX3N1YnNhbXBsZV9pZHgpKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wKK0N2Rm9yZXN0VHJlZTo6dHJhaW4oIGNvbnN0IEN2TWF0KiwgaW50LCBjb25zdCBDdk1hdCosIGNvbnN0IEN2TWF0KiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqLCBjb25zdCBDdk1hdCosIGNvbnN0IEN2TWF0KiwgQ3ZEVHJlZVBhcmFtcyApCit7CisgICAgYXNzZXJ0KDApOworICAgIHJldHVybiBmYWxzZTsKK30KKworCitib29sCitDdkZvcmVzdFRyZWU6OnRyYWluKCBDdkRUcmVlVHJhaW5EYXRhKiwgY29uc3QgQ3ZNYXQqICkKK3sKKyAgICBhc3NlcnQoMCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK0N2RFRyZWVTcGxpdCogQ3ZGb3Jlc3RUcmVlOjpmaW5kX2Jlc3Rfc3BsaXQoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBpbnQgdmk7CisgICAgQ3ZEVHJlZVNwbGl0ICpiZXN0X3NwbGl0ID0gMCwgKnNwbGl0ID0gMCwgKnQ7CisKKyAgICBDVl9GVU5DTkFNRSgiQ3ZGb3Jlc3RUcmVlOjpmaW5kX2Jlc3Rfc3BsaXQiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCogYWN0aXZlX3Zhcl9tYXNrID0gMDsKKyAgICBpZiggZm9yZXN0ICkKKyAgICB7CisgICAgICAgIGludCB2YXJfY291bnQ7CisgICAgICAgIEN2Uk5HKiBybmcgPSBmb3Jlc3QtPmdldF9ybmcoKTsKKworICAgICAgICBhY3RpdmVfdmFyX21hc2sgPSBmb3Jlc3QtPmdldF9hY3RpdmVfdmFyX21hc2soKTsKKyAgICAgICAgdmFyX2NvdW50ID0gYWN0aXZlX3Zhcl9tYXNrLT5jb2xzOworCisgICAgICAgIENWX0FTU0VSVCggdmFyX2NvdW50ID09IGRhdGEtPnZhcl9jb3VudCApOworCisgICAgICAgIGZvciggdmkgPSAwOyB2aSA8IHZhcl9jb3VudDsgdmkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyIHRlbXA7CisgICAgICAgICAgICBpbnQgaTEgPSBjdlJhbmRJbnQocm5nKSAlIHZhcl9jb3VudDsKKyAgICAgICAgICAgIGludCBpMiA9IGN2UmFuZEludChybmcpICUgdmFyX2NvdW50OworICAgICAgICAgICAgQ1ZfU1dBUCggYWN0aXZlX3Zhcl9tYXNrLT5kYXRhLnB0cltpMV0sCisgICAgICAgICAgICAgICAgYWN0aXZlX3Zhcl9tYXNrLT5kYXRhLnB0cltpMl0sIHRlbXAgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IoIHZpID0gMDsgdmkgPCBkYXRhLT52YXJfY291bnQ7IHZpKysgKQorICAgIHsKKyAgICAgICAgaW50IGNpID0gZGF0YS0+dmFyX3R5cGUtPmRhdGEuaVt2aV07CisgICAgICAgIGlmKCBub2RlLT5udW1fdmFsaWRbdmldIDw9IDEKKyAgICAgICAgICAgIHx8IChhY3RpdmVfdmFyX21hc2sgJiYgIWFjdGl2ZV92YXJfbWFzay0+ZGF0YS5wdHJbdmldKSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggZGF0YS0+aXNfY2xhc3NpZmllciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjaSA+PSAwICkKKyAgICAgICAgICAgICAgICBzcGxpdCA9IGZpbmRfc3BsaXRfY2F0X2NsYXNzKCBub2RlLCB2aSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwbGl0ID0gZmluZF9zcGxpdF9vcmRfY2xhc3MoIG5vZGUsIHZpICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY2kgPj0gMCApCisgICAgICAgICAgICAgICAgc3BsaXQgPSBmaW5kX3NwbGl0X2NhdF9yZWcoIG5vZGUsIHZpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3BsaXQgPSBmaW5kX3NwbGl0X29yZF9yZWcoIG5vZGUsIHZpICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggc3BsaXQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIWJlc3Rfc3BsaXQgfHwgYmVzdF9zcGxpdC0+cXVhbGl0eSA8IHNwbGl0LT5xdWFsaXR5ICkKKyAgICAgICAgICAgICAgICBDVl9TV0FQKCBiZXN0X3NwbGl0LCBzcGxpdCwgdCApOworICAgICAgICAgICAgaWYoIHNwbGl0ICkKKyAgICAgICAgICAgICAgICBjdlNldFJlbW92ZUJ5UHRyKCBkYXRhLT5zcGxpdF9oZWFwLCBzcGxpdCApOworICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBiZXN0X3NwbGl0OworfQorCisKK3ZvaWQgQ3ZGb3Jlc3RUcmVlOjpyZWFkKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogZm5vZGUsIEN2UlRyZWVzKiBfZm9yZXN0LCBDdkRUcmVlVHJhaW5EYXRhKiBfZGF0YSApCit7CisgICAgQ3ZEVHJlZTo6cmVhZCggZnMsIGZub2RlLCBfZGF0YSApOworICAgIGZvcmVzdCA9IF9mb3Jlc3Q7Cit9CisKKwordm9pZCBDdkZvcmVzdFRyZWU6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqLCBDdkZpbGVOb2RlKiApCit7CisgICAgYXNzZXJ0KDApOworfQorCit2b2lkIEN2Rm9yZXN0VHJlZTo6cmVhZCggQ3ZGaWxlU3RvcmFnZSogX2ZzLCBDdkZpbGVOb2RlKiBfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDdkRUcmVlVHJhaW5EYXRhKiBfZGF0YSApCit7CisgICAgQ3ZEVHJlZTo6cmVhZCggX2ZzLCBfbm9kZSwgX2RhdGEgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbSB0cmVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0N2UlRyZWVzOjpDdlJUcmVlcygpCit7CisgICAgbmNsYXNzZXMgICAgICAgICA9IDA7CisgICAgb29iX2Vycm9yICAgICAgICA9IDA7CisgICAgbnRyZWVzICAgICAgICAgICA9IDA7CisgICAgdHJlZXMgICAgICAgICAgICA9IE5VTEw7CisgICAgZGF0YSAgICAgICAgICAgICA9IE5VTEw7CisgICAgYWN0aXZlX3Zhcl9tYXNrICA9IE5VTEw7CisgICAgdmFyX2ltcG9ydGFuY2UgICA9IE5VTEw7CisgICAgcm5nID0gY3ZSTkcoMHhmZmZmZmZmZik7CisgICAgZGVmYXVsdF9tb2RlbF9uYW1lID0gIm15X3JhbmRvbV90cmVlcyI7Cit9CisKKwordm9pZCBDdlJUcmVlczo6Y2xlYXIoKQoreworICAgIGludCBrOworICAgIGZvciggayA9IDA7IGsgPCBudHJlZXM7IGsrKyApCisgICAgICAgIGRlbGV0ZSB0cmVlc1trXTsKKyAgICBjdkZyZWUoICZ0cmVlcyApOworCisgICAgZGVsZXRlIGRhdGE7CisgICAgZGF0YSA9IDA7CisKKyAgICBjdlJlbGVhc2VNYXQoICZhY3RpdmVfdmFyX21hc2sgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZ2YXJfaW1wb3J0YW5jZSApOworICAgIG50cmVlcyA9IDA7Cit9CisKKworQ3ZSVHJlZXM6On5DdlJUcmVlcygpCit7CisgICAgY2xlYXIoKTsKK30KKworCitDdk1hdCogQ3ZSVHJlZXM6OmdldF9hY3RpdmVfdmFyX21hc2soKQoreworICAgIHJldHVybiBhY3RpdmVfdmFyX21hc2s7Cit9CisKKworQ3ZSTkcqIEN2UlRyZWVzOjpnZXRfcm5nKCkKK3sKKyAgICByZXR1cm4gJnJuZzsKK30KKworYm9vbCBDdlJUcmVlczo6dHJhaW4oIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgaW50IF90ZmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLCBjb25zdCBDdk1hdCogX3Zhcl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHgsIGNvbnN0IEN2TWF0KiBfdmFyX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDdk1hdCogX21pc3NpbmdfbWFzaywgQ3ZSVFBhcmFtcyBwYXJhbXMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDVl9GVU5DTkFNRSgiQ3ZSVHJlZXM6OnRyYWluIik7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IHZhcl9jb3VudCA9IDA7CisKKyAgICBjbGVhcigpOworCisgICAgQ3ZEVHJlZVBhcmFtcyB0cmVlX3BhcmFtcyggcGFyYW1zLm1heF9kZXB0aCwgcGFyYW1zLm1pbl9zYW1wbGVfY291bnQsCisgICAgICAgIHBhcmFtcy5yZWdyZXNzaW9uX2FjY3VyYWN5LCBwYXJhbXMudXNlX3N1cnJvZ2F0ZXMsIHBhcmFtcy5tYXhfY2F0ZWdvcmllcywKKyAgICAgICAgcGFyYW1zLmN2X2ZvbGRzLCBwYXJhbXMudXNlXzFzZV9ydWxlLCBmYWxzZSwgcGFyYW1zLnByaW9ycyApOworICAgIAorICAgIGRhdGEgPSBuZXcgQ3ZEVHJlZVRyYWluRGF0YSgpOworICAgIENWX0NBTEwoZGF0YS0+c2V0X2RhdGEoIF90cmFpbl9kYXRhLCBfdGZsYWcsIF9yZXNwb25zZXMsIF92YXJfaWR4LAorICAgICAgICBfc2FtcGxlX2lkeCwgX3Zhcl90eXBlLCBfbWlzc2luZ19tYXNrLCB0cmVlX3BhcmFtcywgdHJ1ZSkpOworCisgICAgdmFyX2NvdW50ID0gZGF0YS0+dmFyX2NvdW50OworICAgIGlmKCBwYXJhbXMubmFjdGl2ZV92YXJzID4gdmFyX2NvdW50ICkKKyAgICAgICAgcGFyYW1zLm5hY3RpdmVfdmFycyA9IHZhcl9jb3VudDsKKyAgICBlbHNlIGlmKCBwYXJhbXMubmFjdGl2ZV92YXJzID09IDAgKQorICAgICAgICBwYXJhbXMubmFjdGl2ZV92YXJzID0gKGludClzcXJ0KChkb3VibGUpdmFyX2NvdW50KTsKKyAgICBlbHNlIGlmKCBwYXJhbXMubmFjdGl2ZV92YXJzIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICI8bmFjdGl2ZV92YXJzPiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIgKTsKKyAgICBwYXJhbXMudGVybV9jcml0ID0gY3ZDaGVja1Rlcm1Dcml0ZXJpYSggcGFyYW1zLnRlcm1fY3JpdCwgMC4xLCAxMDAwICk7CisKKyAgICAvLyBDcmVhdGUgbWFzayBvZiBhY3RpdmUgdmFyaWFibGVzIGF0IHRoZSB0cmVlIG5vZGVzCisgICAgQ1ZfQ0FMTChhY3RpdmVfdmFyX21hc2sgPSBjdkNyZWF0ZU1hdCggMSwgdmFyX2NvdW50LCBDVl84VUMxICkpOworICAgIGlmKCBwYXJhbXMuY2FsY192YXJfaW1wb3J0YW5jZSApCisgICAgeworICAgICAgICBDVl9DQUxMKHZhcl9pbXBvcnRhbmNlICA9IGN2Q3JlYXRlTWF0KCAxLCB2YXJfY291bnQsIENWXzMyRkMxICkpOworICAgICAgICBjdlplcm8odmFyX2ltcG9ydGFuY2UpOworICAgIH0KKyAgICB7IC8vIGluaXRpYWxpemUgYWN0aXZlIHZhcmlhYmxlcyBtYXNrCisgICAgICAgIEN2TWF0IHN1Ym1hc2sxLCBzdWJtYXNrMjsKKyAgICAgICAgY3ZHZXRDb2xzKCBhY3RpdmVfdmFyX21hc2ssICZzdWJtYXNrMSwgMCwgcGFyYW1zLm5hY3RpdmVfdmFycyApOworICAgICAgICBjdkdldENvbHMoIGFjdGl2ZV92YXJfbWFzaywgJnN1Ym1hc2syLCBwYXJhbXMubmFjdGl2ZV92YXJzLCB2YXJfY291bnQgKTsKKyAgICAgICAgY3ZTZXQoICZzdWJtYXNrMSwgY3ZTY2FsYXIoMSkgKTsKKyAgICAgICAgY3ZaZXJvKCAmc3VibWFzazIgKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKHJlc3VsdCA9IGdyb3dfZm9yZXN0KCBwYXJhbXMudGVybV9jcml0ICkpOworCisgICAgcmVzdWx0ID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgQ3ZSVHJlZXM6Omdyb3dfZm9yZXN0KCBjb25zdCBDdlRlcm1Dcml0ZXJpYSB0ZXJtX2NyaXQgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDdk1hdCogc2FtcGxlX2lkeF9tYXNrX2Zvcl90cmVlID0gMDsKKyAgICBDdk1hdCogc2FtcGxlX2lkeF9mb3JfdHJlZSAgICAgID0gMDsKKworICAgIEN2TWF0KiBvb2Jfc2FtcGxlX3ZvdGVzCSAgID0gMDsKKyAgICBDdk1hdCogb29iX3Jlc3BvbnNlcyAgICAgICA9IDA7CisKKyAgICBmbG9hdCogb29iX3NhbXBsZXNfcGVybV9wdHI9IDA7CisKKyAgICBmbG9hdCogc2FtcGxlc19wdHIgICAgID0gMDsKKyAgICB1Y2hhciogbWlzc2luZ19wdHIgICAgID0gMDsKKyAgICBmbG9hdCogdHJ1ZV9yZXNwX3B0ciAgID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJDdlJUcmVlczo6Z3Jvd19mb3Jlc3QiKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBjb25zdCBpbnQgbWF4X250cmVlcyA9IHRlcm1fY3JpdC5tYXhfaXRlcjsKKyAgICBjb25zdCBkb3VibGUgbWF4X29vYl9lcnIgPSB0ZXJtX2NyaXQuZXBzaWxvbjsKKyAgICAKKyAgICBjb25zdCBpbnQgZGltcyA9IGRhdGEtPnZhcl9jb3VudDsKKyAgICBmbG9hdCBtYXhpbWFsX3Jlc3BvbnNlID0gMDsKKworICAgIC8vIG9vYl9wcmVkaWN0aW9uc19zdW1baV0gPSBzdW0gb2YgcHJlZGljdGVkIHZhbHVlcyBmb3IgdGhlIGktdGggc2FtcGxlCisgICAgLy8gb29iX251bV9vZl9wcmVkaWN0aW9uc1tpXSA9IG51bWJlciBvZiBzdW1tYW5kcworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudW1iZXIgb2YgcHJlZGljdGlvbnMgZm9yIHRoZSBpLXRoIHNhbXBsZSkKKyAgICAvLyBpbml0aWFsaXplIHRoZXNlIHZhcmlhYmxlIHRvIGF2b2lkIHdhcm5pbmcgQzQ3MDEKKyAgICBDdk1hdCBvb2JfcHJlZGljdGlvbnNfc3VtID0gY3ZNYXQoIDEsIDEsIENWXzMyRkMxICk7CisgICAgQ3ZNYXQgb29iX251bV9vZl9wcmVkaWN0aW9ucyA9IGN2TWF0KCAxLCAxLCBDVl8zMkZDMSApOworCisgICAgbnNhbXBsZXMgPSBkYXRhLT5zYW1wbGVfY291bnQ7CisgICAgbmNsYXNzZXMgPSBkYXRhLT5nZXRfbnVtX2NsYXNzZXMoKTsKKworICAgIHRyZWVzID0gKEN2Rm9yZXN0VHJlZSoqKWN2QWxsb2MoIHNpemVvZih0cmVlc1swXSkqbWF4X250cmVlcyApOworICAgIG1lbXNldCggdHJlZXMsIDAsIHNpemVvZih0cmVlc1swXSkqbWF4X250cmVlcyApOworCisgICAgaWYoIGRhdGEtPmlzX2NsYXNzaWZpZXIgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTChvb2Jfc2FtcGxlX3ZvdGVzID0gY3ZDcmVhdGVNYXQoIG5zYW1wbGVzLCBuY2xhc3NlcywgQ1ZfMzJTQzEgKSk7CisgICAgICAgIGN2WmVybyhvb2Jfc2FtcGxlX3ZvdGVzKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gb29iX3Jlc3BvbnNlc1swLGldID0gb29iX3ByZWRpY3Rpb25zX3N1bVtpXQorICAgICAgICAvLyAgICA9IHN1bSBvZiBwcmVkaWN0ZWQgdmFsdWVzIGZvciB0aGUgaS10aCBzYW1wbGUKKyAgICAgICAgLy8gb29iX3Jlc3BvbnNlc1sxLGldID0gb29iX251bV9vZl9wcmVkaWN0aW9uc1tpXQorICAgICAgICAvLyAgICA9IG51bWJlciBvZiBzdW1tYW5kcyAobnVtYmVyIG9mIHByZWRpY3Rpb25zIGZvciB0aGUgaS10aCBzYW1wbGUpCisgICAgICAgIENWX0NBTEwob29iX3Jlc3BvbnNlcyA9IGN2Q3JlYXRlTWF0KCAyLCBuc2FtcGxlcywgQ1ZfMzJGQzEgKSk7CisgICAgICAgIGN2WmVybyhvb2JfcmVzcG9uc2VzKTsKKyAgICAgICAgY3ZHZXRSb3coIG9vYl9yZXNwb25zZXMsICZvb2JfcHJlZGljdGlvbnNfc3VtLCAwICk7CisgICAgICAgIGN2R2V0Um93KCBvb2JfcmVzcG9uc2VzLCAmb29iX251bV9vZl9wcmVkaWN0aW9ucywgMSApOworICAgIH0KKyAgICBDVl9DQUxMKHNhbXBsZV9pZHhfbWFza19mb3JfdHJlZSA9IGN2Q3JlYXRlTWF0KCAxLCBuc2FtcGxlcywgQ1ZfOFVDMSApKTsKKyAgICBDVl9DQUxMKHNhbXBsZV9pZHhfZm9yX3RyZWUgICAgICA9IGN2Q3JlYXRlTWF0KCAxLCBuc2FtcGxlcywgQ1ZfMzJTQzEgKSk7CisgICAgQ1ZfQ0FMTChvb2Jfc2FtcGxlc19wZXJtX3B0ciAgICAgPSAoZmxvYXQqKWN2QWxsb2MoIHNpemVvZihmbG9hdCkqbnNhbXBsZXMqZGltcyApKTsKKyAgICBDVl9DQUxMKHNhbXBsZXNfcHRyICAgICAgICAgICAgICA9IChmbG9hdCopY3ZBbGxvYyggc2l6ZW9mKGZsb2F0KSpuc2FtcGxlcypkaW1zICkpOworICAgIENWX0NBTEwobWlzc2luZ19wdHIgICAgICAgICAgICAgID0gKHVjaGFyKiljdkFsbG9jKCBzaXplb2YodWNoYXIpKm5zYW1wbGVzKmRpbXMgKSk7CisgICAgQ1ZfQ0FMTCh0cnVlX3Jlc3BfcHRyICAgICAgICAgICAgPSAoZmxvYXQqKWN2QWxsb2MoIHNpemVvZihmbG9hdCkqbnNhbXBsZXMgKSk7CisKKyAgICBDVl9DQUxMKGRhdGEtPmdldF92ZWN0b3JzKCAwLCBzYW1wbGVzX3B0ciwgbWlzc2luZ19wdHIsIHRydWVfcmVzcF9wdHIgKSk7CisgICAgeworICAgICAgICBkb3VibGUgbWludmFsLCBtYXh2YWw7CisgICAgICAgIEN2TWF0IHJlc3BvbnNlcyA9IGN2TWF0KDEsIG5zYW1wbGVzLCBDVl8zMkZDMSwgdHJ1ZV9yZXNwX3B0cik7CisgICAgICAgIGN2TWluTWF4TG9jKCAmcmVzcG9uc2VzLCAmbWludmFsLCAmbWF4dmFsICk7CisgICAgICAgIG1heGltYWxfcmVzcG9uc2UgPSAoZmxvYXQpTUFYKCBNQVgoIGZhYnMobWludmFsKSwgZmFicyhtYXh2YWwpICksIDAgKTsKKyAgICB9CisKKyAgICBudHJlZXMgPSAwOworICAgIHdoaWxlKCBudHJlZXMgPCBtYXhfbnRyZWVzICkKKyAgICB7CisgICAgICAgIGludCBpLCBvb2Jfc2FtcGxlc19jb3VudCA9IDA7CisgICAgICAgIGRvdWJsZSBuY29ycmVjdF9yZXNwb25zZXMgPSAwOyAvLyB1c2VkIGZvciBlc3RpbWF0aW9uIG9mIHZhcmlhYmxlIGltcG9ydGFuY2UKKyAgICAgICAgQ3ZNYXQgc2FtcGxlLCBtaXNzaW5nOworICAgICAgICBDdkZvcmVzdFRyZWUqIHRyZWUgPSAwOworCisgICAgICAgIGN2WmVybyggc2FtcGxlX2lkeF9tYXNrX2Zvcl90cmVlICk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkgLy9mb3JtIHNhbXBsZSBmb3IgY3JlYXRpb24gb25lIHRyZWUKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IGN2UmFuZEludCggJnJuZyApICUgbnNhbXBsZXM7CisgICAgICAgICAgICBzYW1wbGVfaWR4X2Zvcl90cmVlLT5kYXRhLmlbaV0gPSBpZHg7CisgICAgICAgICAgICBzYW1wbGVfaWR4X21hc2tfZm9yX3RyZWUtPmRhdGEucHRyW2lkeF0gPSAweEZGOworICAgICAgICB9CisKKyAgICAgICAgdHJlZXNbbnRyZWVzXSA9IG5ldyBDdkZvcmVzdFRyZWUoKTsKKyAgICAgICAgdHJlZSA9IHRyZWVzW250cmVlc107CisgICAgICAgIENWX0NBTEwodHJlZS0+dHJhaW4oIGRhdGEsIHNhbXBsZV9pZHhfZm9yX3RyZWUsIHRoaXMgKSk7CisKKyAgICAgICAgLy8gZm9ybSBhcnJheSBvZiBPT0Igc2FtcGxlcyBpbmRpY2VzIGFuZCBnZXQgdGhlc2Ugc2FtcGxlcworICAgICAgICBzYW1wbGUgICA9IGN2TWF0KCAxLCBkaW1zLCBDVl8zMkZDMSwgc2FtcGxlc19wdHIgKTsKKyAgICAgICAgbWlzc2luZyAgPSBjdk1hdCggMSwgZGltcywgQ1ZfOFVDMSwgIG1pc3NpbmdfcHRyICk7CisKKyAgICAgICAgb29iX2Vycm9yID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5zYW1wbGVzOyBpKyssCisgICAgICAgICAgICBzYW1wbGUuZGF0YS5mbCArPSBkaW1zLCBtaXNzaW5nLmRhdGEucHRyICs9IGRpbXMgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkRUcmVlTm9kZSogcHJlZGljdGVkX25vZGUgPSAwOworICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHNhbXBsZSBpcyBPT0IKKyAgICAgICAgICAgIGlmKCBzYW1wbGVfaWR4X21hc2tfZm9yX3RyZWUtPmRhdGEucHRyW2ldICkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgLy8gcHJlZGljdCBvb2Igc2FtcGxlcworICAgICAgICAgICAgaWYoICFwcmVkaWN0ZWRfbm9kZSApCisgICAgICAgICAgICAgICAgQ1ZfQ0FMTChwcmVkaWN0ZWRfbm9kZSA9IHRyZWUtPnByZWRpY3QoJnNhbXBsZSwgJm1pc3NpbmcsIHRydWUpKTsKKworICAgICAgICAgICAgaWYoICFkYXRhLT5pc19jbGFzc2lmaWVyICkgLy9yZWdyZXNzaW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIGF2Z19yZXNwLCByZXNwID0gcHJlZGljdGVkX25vZGUtPnZhbHVlOworICAgICAgICAgICAgICAgIG9vYl9wcmVkaWN0aW9uc19zdW0uZGF0YS5mbFtpXSArPSAoZmxvYXQpcmVzcDsKKyAgICAgICAgICAgICAgICBvb2JfbnVtX29mX3ByZWRpY3Rpb25zLmRhdGEuZmxbaV0gKz0gMTsKKworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgb29iIGVycm9yCisgICAgICAgICAgICAgICAgYXZnX3Jlc3AgPSBvb2JfcHJlZGljdGlvbnNfc3VtLmRhdGEuZmxbaV0vb29iX251bV9vZl9wcmVkaWN0aW9ucy5kYXRhLmZsW2ldOworICAgICAgICAgICAgICAgIGF2Z19yZXNwIC09IHRydWVfcmVzcF9wdHJbaV07CisgICAgICAgICAgICAgICAgb29iX2Vycm9yICs9IGF2Z19yZXNwKmF2Z19yZXNwOworICAgICAgICAgICAgICAgIHJlc3AgPSAocmVzcCAtIHRydWVfcmVzcF9wdHJbaV0pL21heGltYWxfcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgbmNvcnJlY3RfcmVzcG9uc2VzICs9IGV4cCggLXJlc3AqcmVzcCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSAvL2NsYXNzaWZpY2F0aW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHByZGN0X3Jlc3A7CisgICAgICAgICAgICAgICAgQ3ZQb2ludCBtYXhfbG9jOworICAgICAgICAgICAgICAgIEN2TWF0IHZvdGVzOworCisgICAgICAgICAgICAgICAgY3ZHZXRSb3cob29iX3NhbXBsZV92b3RlcywgJnZvdGVzLCBpKTsKKyAgICAgICAgICAgICAgICB2b3Rlcy5kYXRhLmlbcHJlZGljdGVkX25vZGUtPmNsYXNzX2lkeF0rKzsKKworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGUgb29iIGVycm9yCisgICAgICAgICAgICAgICAgY3ZNaW5NYXhMb2MoICZ2b3RlcywgMCwgMCwgMCwgJm1heF9sb2MgKTsKKworICAgICAgICAgICAgICAgIHByZGN0X3Jlc3AgPSBkYXRhLT5jYXRfbWFwLT5kYXRhLmlbbWF4X2xvYy54XTsKKyAgICAgICAgICAgICAgICBvb2JfZXJyb3IgKz0gKGZhYnMocHJkY3RfcmVzcCAtIHRydWVfcmVzcF9wdHJbaV0pIDwgRkxUX0VQU0lMT04pID8gMCA6IDE7CisKKyAgICAgICAgICAgICAgICBuY29ycmVjdF9yZXNwb25zZXMgKz0gY3ZSb3VuZChwcmVkaWN0ZWRfbm9kZS0+dmFsdWUgLSB0cnVlX3Jlc3BfcHRyW2ldKSA9PSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb29iX3NhbXBsZXNfY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiggb29iX3NhbXBsZXNfY291bnQgPiAwICkKKyAgICAgICAgICAgIG9vYl9lcnJvciAvPSAoZG91YmxlKW9vYl9zYW1wbGVzX2NvdW50OworCisgICAgICAgIC8vIGVzdGltYXRlIHZhcmlhYmxlIGltcG9ydGFuY2UKKyAgICAgICAgaWYoIHZhcl9pbXBvcnRhbmNlICYmIG9vYl9zYW1wbGVzX2NvdW50ID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBtOworCisgICAgICAgICAgICBtZW1jcHkoIG9vYl9zYW1wbGVzX3Blcm1fcHRyLCBzYW1wbGVzX3B0ciwgZGltcypuc2FtcGxlcypzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgICAgIGZvciggbSA9IDA7IG0gPCBkaW1zOyBtKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSBuY29ycmVjdF9yZXNwb25zZXNfcGVybXV0ZWQgPSAwOworICAgICAgICAgICAgICAgIC8vIHJhbmRvbWx5IHBlcm11dGUgdmFsdWVzIG9mIHRoZSBtLXRoIHZhcmlhYmxlIGluIHRoZSBvb2Igc2FtcGxlcworICAgICAgICAgICAgICAgIGZsb2F0KiBtdGhfdmFyX3B0ciA9IG9vYl9zYW1wbGVzX3Blcm1fcHRyICsgbTsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBpMSwgaTI7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHRlbXA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNhbXBsZV9pZHhfbWFza19mb3JfdHJlZS0+ZGF0YS5wdHJbaV0gKSAvL3RoZSBzYW1wbGUgaXMgbm90IE9PQgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIGkxID0gY3ZSYW5kSW50KCAmcm5nICkgJSBuc2FtcGxlczsKKyAgICAgICAgICAgICAgICAgICAgaTIgPSBjdlJhbmRJbnQoICZybmcgKSAlIG5zYW1wbGVzOworICAgICAgICAgICAgICAgICAgICBDVl9TV0FQKCBtdGhfdmFyX3B0cltpMSpkaW1zXSwgbXRoX3Zhcl9wdHJbaTIqZGltc10sIHRlbXAgKTsKKworICAgICAgICAgICAgICAgICAgICAvLyB0dXJuIHZhbHVlcyBvZiAobS0xKS10aCB2YXJpYWJsZSwgdGhhdCB3ZXJlIHBlcm11dGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBwcmV2aW91cyBpdGVyYXRpb24sIHVudG91Y2hlZAorICAgICAgICAgICAgICAgICAgICBpZiggbSA+IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgb29iX3NhbXBsZXNfcGVybV9wdHJbaSpkaW1zK20tMV0gPSBzYW1wbGVzX3B0cltpKmRpbXMrbS0xXTsKKyAgICAgICAgICAgICAgICB9CisgICAgCisgICAgICAgICAgICAgICAgLy8gcHJlZGljdCAicGVybXV0ZWQiIGNhc2VzIGFuZCBjYWxjdWxhdGUgdGhlIG51bWJlciBvZiB2b3RlcyBmb3IgdGhlCisgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBjbGFzcyBpbiB0aGUgdmFyaWFibGUtbS1wZXJtdXRlZCBvb2IgZGF0YQorICAgICAgICAgICAgICAgIHNhbXBsZSAgPSBjdk1hdCggMSwgZGltcywgQ1ZfMzJGQzEsIG9vYl9zYW1wbGVzX3Blcm1fcHRyICk7CisgICAgICAgICAgICAgICAgbWlzc2luZyA9IGN2TWF0KCAxLCBkaW1zLCBDVl84VUMxLCBtaXNzaW5nX3B0ciApOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuc2FtcGxlczsgaSsrLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGUuZGF0YS5mbCArPSBkaW1zLCBtaXNzaW5nLmRhdGEucHRyICs9IGRpbXMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHByZWRjdF9yZXNwLCB0cnVlX3Jlc3A7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHNhbXBsZV9pZHhfbWFza19mb3JfdHJlZS0+ZGF0YS5wdHJbaV0gKSAvL3RoZSBzYW1wbGUgaXMgbm90IE9PQgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgcHJlZGN0X3Jlc3AgPSB0cmVlLT5wcmVkaWN0KCZzYW1wbGUsICZtaXNzaW5nLCB0cnVlKS0+dmFsdWU7CisgICAgICAgICAgICAgICAgICAgIHRydWVfcmVzcCAgID0gdHJ1ZV9yZXNwX3B0cltpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRhdGEtPmlzX2NsYXNzaWZpZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgbmNvcnJlY3RfcmVzcG9uc2VzX3Blcm11dGVkICs9IGN2Um91bmQodHJ1ZV9yZXNwIC0gcHJlZGN0X3Jlc3ApID09IDA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZV9yZXNwID0gKHRydWVfcmVzcCAtIHByZWRjdF9yZXNwKS9tYXhpbWFsX3Jlc3BvbnNlOworICAgICAgICAgICAgICAgICAgICAgICAgbmNvcnJlY3RfcmVzcG9uc2VzX3Blcm11dGVkICs9IGV4cCggLXRydWVfcmVzcCp0cnVlX3Jlc3AgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YXJfaW1wb3J0YW5jZS0+ZGF0YS5mbFttXSArPSAoZmxvYXQpKG5jb3JyZWN0X3Jlc3BvbnNlcworICAgICAgICAgICAgICAgICAgICAtIG5jb3JyZWN0X3Jlc3BvbnNlc19wZXJtdXRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbnRyZWVzKys7CisgICAgICAgIGlmKCB0ZXJtX2NyaXQudHlwZSAhPSBDVl9URVJNQ1JJVF9JVEVSICYmIG9vYl9lcnJvciA8IG1heF9vb2JfZXJyICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiggdmFyX2ltcG9ydGFuY2UgKQorICAgICAgICBDVl9DQUxMKGN2Q29udmVydFNjYWxlKCB2YXJfaW1wb3J0YW5jZSwgdmFyX2ltcG9ydGFuY2UsIDEuL250cmVlcy9uc2FtcGxlcyApKTsKKworICAgIHJlc3VsdCA9IHRydWU7CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmc2FtcGxlX2lkeF9tYXNrX2Zvcl90cmVlICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc2FtcGxlX2lkeF9mb3JfdHJlZSApOworICAgIGN2UmVsZWFzZU1hdCggJm9vYl9zYW1wbGVfdm90ZXMgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZvb2JfcmVzcG9uc2VzICk7CisKKyAgICBjdkZyZWUoICZvb2Jfc2FtcGxlc19wZXJtX3B0ciApOworICAgIGN2RnJlZSggJnNhbXBsZXNfcHRyICk7CisgICAgY3ZGcmVlKCAmbWlzc2luZ19wdHIgKTsKKyAgICBjdkZyZWUoICZ0cnVlX3Jlc3BfcHRyICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2NvbnN0IEN2TWF0KiBDdlJUcmVlczo6Z2V0X3Zhcl9pbXBvcnRhbmNlKCkKK3sKKyAgICByZXR1cm4gdmFyX2ltcG9ydGFuY2U7Cit9CisKKworZmxvYXQgQ3ZSVHJlZXM6OmdldF9wcm94aW1pdHkoIGNvbnN0IEN2TWF0KiBzYW1wbGUxLCBjb25zdCBDdk1hdCogc2FtcGxlMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBtaXNzaW5nMSwgY29uc3QgQ3ZNYXQqIG1pc3NpbmcyICkgY29uc3QKK3sKKyAgICBmbG9hdCByZXN1bHQgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdlJUcmVlczo6Z2V0X3Byb3hpbWl0eSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpOworICAgIGZvciggaSA9IDA7IGkgPCBudHJlZXM7IGkrKyApCisgICAgICAgIHJlc3VsdCArPSB0cmVlc1tpXS0+cHJlZGljdCggc2FtcGxlMSwgbWlzc2luZzEgKSA9PQorICAgICAgICB0cmVlc1tpXS0+cHJlZGljdCggc2FtcGxlMiwgbWlzc2luZzIgKSA/ICAxIDogMDsKKyAgICByZXN1bHQgPSByZXN1bHQvKGZsb2F0KW50cmVlczsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Zsb2F0IEN2UlRyZWVzOjpwcmVkaWN0KCBjb25zdCBDdk1hdCogc2FtcGxlLCBjb25zdCBDdk1hdCogbWlzc2luZyApIGNvbnN0Cit7CisgICAgZG91YmxlIHJlc3VsdCA9IC0xOworCisgICAgQ1ZfRlVOQ05BTUUoIkN2UlRyZWVzOjpwcmVkaWN0Iik7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IGs7CisKKyAgICBpZiggbmNsYXNzZXMgPiAwICkgLy9jbGFzc2lmaWNhdGlvbgorICAgIHsKKyAgICAgICAgaW50IG1heF9udm90ZXMgPSAwOworICAgICAgICBpbnQqIHZvdGVzID0gKGludCopYWxsb2NhKCBzaXplb2YoaW50KSpuY2xhc3NlcyApOworICAgICAgICBtZW1zZXQoIHZvdGVzLCAwLCBzaXplb2YoKnZvdGVzKSpuY2xhc3NlcyApOworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbnRyZWVzOyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkRUcmVlTm9kZSogcHJlZGljdGVkX25vZGUgPSB0cmVlc1trXS0+cHJlZGljdCggc2FtcGxlLCBtaXNzaW5nICk7CisgICAgICAgICAgICBpbnQgbnZvdGVzOworICAgICAgICAgICAgaW50IGNsYXNzX2lkeCA9IHByZWRpY3RlZF9ub2RlLT5jbGFzc19pZHg7CisgICAgICAgICAgICBDVl9BU1NFUlQoIDAgPD0gY2xhc3NfaWR4ICYmIGNsYXNzX2lkeCA8IG5jbGFzc2VzICk7CisKKyAgICAgICAgICAgIG52b3RlcyA9ICsrdm90ZXNbY2xhc3NfaWR4XTsKKyAgICAgICAgICAgIGlmKCBudm90ZXMgPiBtYXhfbnZvdGVzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtYXhfbnZvdGVzID0gbnZvdGVzOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByZWRpY3RlZF9ub2RlLT52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIHJlZ3Jlc3Npb24KKyAgICB7CisgICAgICAgIHJlc3VsdCA9IDA7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBudHJlZXM7IGsrKyApCisgICAgICAgICAgICByZXN1bHQgKz0gdHJlZXNba10tPnByZWRpY3QoIHNhbXBsZSwgbWlzc2luZyApLT52YWx1ZTsKKyAgICAgICAgcmVzdWx0IC89IChkb3VibGUpbnRyZWVzOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gKGZsb2F0KXJlc3VsdDsKK30KKworCit2b2lkIEN2UlRyZWVzOjp3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZSVHJlZXM6OndyaXRlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGs7CisKKyAgICBpZiggbnRyZWVzIDwgMSB8fCAhdHJlZXMgfHwgbnNhbXBsZXMgPCAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIkludmFsaWQgQ3ZSVHJlZXMgb2JqZWN0IiApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9NTF9SVFJFRVMgKTsKKworICAgIGN2V3JpdGVJbnQoIGZzLCAibmNsYXNzZXMiLCBuY2xhc3NlcyApOworICAgIGN2V3JpdGVJbnQoIGZzLCAibnNhbXBsZXMiLCBuc2FtcGxlcyApOworICAgIGN2V3JpdGVJbnQoIGZzLCAibmFjdGl2ZV92YXJzIiwgKGludCljdlN1bShhY3RpdmVfdmFyX21hc2spLnZhbFswXSApOworICAgIGN2V3JpdGVSZWFsKCBmcywgIm9vYl9lcnJvciIsIG9vYl9lcnJvciApOworCisgICAgaWYoIHZhcl9pbXBvcnRhbmNlICkKKyAgICAgICAgY3ZXcml0ZSggZnMsICJ2YXJfaW1wb3J0YW5jZSIsIHZhcl9pbXBvcnRhbmNlICk7CisKKyAgICBjdldyaXRlSW50KCBmcywgIm50cmVlcyIsIG50cmVlcyApOworCisgICAgQ1ZfQ0FMTChkYXRhLT53cml0ZV9wYXJhbXMoIGZzICkpOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInRyZWVzIiwgQ1ZfTk9ERV9TRVEgKTsKKworICAgIGZvciggayA9IDA7IGsgPCBudHJlZXM7IGsrKyApCisgICAgeworICAgICAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAwLCBDVl9OT0RFX01BUCApOworICAgICAgICBDVl9DQUxMKCB0cmVlc1trXS0+d3JpdGUoIGZzICkpOworICAgICAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworICAgIH0KKworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7IC8vdHJlZXMKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOyAvL0NWX1RZUEVfTkFNRV9NTF9SVFJFRVMKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdlJUcmVlczo6cmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIGZub2RlICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2UlRyZWVzOjpyZWFkIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IG5hY3RpdmVfdmFycywgdmFyX2NvdW50LCBrOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBDdkZpbGVOb2RlKiB0cmVlc19mbm9kZSA9IDA7CisKKyAgICBjbGVhcigpOworCisgICAgbmNsYXNzZXMgICAgID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgZm5vZGUsICJuY2xhc3NlcyIsIC0xICk7CisgICAgbnNhbXBsZXMgICAgID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgZm5vZGUsICJuc2FtcGxlcyIgKTsKKyAgICBuYWN0aXZlX3ZhcnMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBmbm9kZSwgIm5hY3RpdmVfdmFycyIsIC0xICk7CisgICAgb29iX2Vycm9yICAgID0gY3ZSZWFkUmVhbEJ5TmFtZShmcywgZm5vZGUsICJvb2JfZXJyb3IiLCAtMSApOworICAgIG50cmVlcyAgICAgICA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGZub2RlLCAibnRyZWVzIiwgLTEgKTsKKworICAgIHZhcl9pbXBvcnRhbmNlID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCBmbm9kZSwgInZhcl9pbXBvcnRhbmNlIiApOworCisgICAgaWYoIG5jbGFzc2VzIDwgMCB8fCBuc2FtcGxlcyA8PSAwIHx8IG5hY3RpdmVfdmFycyA8IDAgfHwgb29iX2Vycm9yIDwgMCB8fCBudHJlZXMgPD0gMCkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJTb21lIDxuY2xhc3Nlcz4sIDxuc2FtcGxlcz4sIDx2YXJfY291bnQ+LCAiCisgICAgICAgICI8bmFjdGl2ZV92YXJzPiwgPG9vYl9lcnJvcj4sIDxudHJlZXM+IG9mIHRhZ3MgYXJlIG1pc3NpbmciICk7CisKKyAgICBybmcgPSBDdlJORyggLTEgKTsKKworICAgIHRyZWVzID0gKEN2Rm9yZXN0VHJlZSoqKWN2QWxsb2MoIHNpemVvZih0cmVlc1swXSkqbnRyZWVzICk7CisgICAgbWVtc2V0KCB0cmVlcywgMCwgc2l6ZW9mKHRyZWVzWzBdKSpudHJlZXMgKTsKKworICAgIGRhdGEgPSBuZXcgQ3ZEVHJlZVRyYWluRGF0YSgpOworICAgIGRhdGEtPnJlYWRfcGFyYW1zKCBmcywgZm5vZGUgKTsKKyAgICBkYXRhLT5zaGFyZWQgPSB0cnVlOworCisgICAgdHJlZXNfZm5vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgZm5vZGUsICJ0cmVlcyIgKTsKKyAgICBpZiggIXRyZWVzX2Zub2RlIHx8ICFDVl9OT0RFX0lTX1NFUSh0cmVlc19mbm9kZS0+dGFnKSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiPHRyZWVzPiB0YWcgaXMgbWlzc2luZyIgKTsKKworICAgIGN2U3RhcnRSZWFkU2VxKCB0cmVlc19mbm9kZS0+ZGF0YS5zZXEsICZyZWFkZXIgKTsKKyAgICBpZiggcmVhZGVyLnNlcS0+dG90YWwgIT0gbnRyZWVzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsCisgICAgICAgICI8bnRyZWVzPiBpcyBub3QgZXF1YWwgdG8gdGhlIG51bWJlciBvZiB0cmVlcyBzYXZlZCBpbiBmaWxlIiApOworCisgICAgZm9yKCBrID0gMDsgayA8IG50cmVlczsgaysrICkKKyAgICB7CisgICAgICAgIHRyZWVzW2tdID0gbmV3IEN2Rm9yZXN0VHJlZSgpOworICAgICAgICBDVl9DQUxMKHRyZWVzW2tdLT5yZWFkKCBmcywgKEN2RmlsZU5vZGUqKXJlYWRlci5wdHIsIHRoaXMsIGRhdGEgKSk7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHJlYWRlci5zZXEtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgfQorCisgICAgdmFyX2NvdW50ID0gZGF0YS0+dmFyX2NvdW50OworICAgIENWX0NBTEwoYWN0aXZlX3Zhcl9tYXNrID0gY3ZDcmVhdGVNYXQoIDEsIHZhcl9jb3VudCwgQ1ZfOFVDMSApKTsKKyAgICB7CisgICAgICAgIC8vIGluaXRpYWxpemUgYWN0aXZlIHZhcmlhYmxlcyBtYXNrCisgICAgICAgIEN2TWF0IHN1Ym1hc2sxLCBzdWJtYXNrMjsKKyAgICAgICAgY3ZHZXRDb2xzKCBhY3RpdmVfdmFyX21hc2ssICZzdWJtYXNrMSwgMCwgbmFjdGl2ZV92YXJzICk7CisgICAgICAgIGN2R2V0Q29scyggYWN0aXZlX3Zhcl9tYXNrLCAmc3VibWFzazIsIG5hY3RpdmVfdmFycywgdmFyX2NvdW50ICk7CisgICAgICAgIGN2U2V0KCAmc3VibWFzazEsIGN2U2NhbGFyKDEpICk7CisgICAgICAgIGN2WmVybyggJnN1Ym1hc2syICk7CisgICAgfQorCisgICAgX19FTkRfXzsKK30KKworCitpbnQgQ3ZSVHJlZXM6OmdldF90cmVlX2NvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbnRyZWVzOworfQorCitDdkZvcmVzdFRyZWUqIEN2UlRyZWVzOjpnZXRfdHJlZShpbnQgaSkgY29uc3QKK3sKKyAgICByZXR1cm4gKHVuc2lnbmVkKWkgPCAodW5zaWduZWQpbnRyZWVzID8gdHJlZXNbaV0gOiAwOworfQorCisvLyBFbmQgb2YgZmlsZS4KZGlmZiAtLWdpdCBhL21sL3NyYy9tbHN2bS5jcHAgYi9tbC9zcmMvbWxzdm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTc5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tbC9zcmMvbWxzdm0uY3BwCkBAIC0wLDAgKzEsMjY4OSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX21sLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT1BZUklHSFQgTk9USUNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0KKworICBUaGUgY29kZSBoYXMgYmVlbiBkZXJpdmVkIGZyb20gbGlic3ZtIGxpYnJhcnkgKHZlcnNpb24gMi42KQorICAoaHR0cDovL3d3dy5jc2llLm50dS5lZHUudHcvfmNqbGluL2xpYnN2bSkuCisKKyAgSGVyZSBpcyB0aGUgb3JpZ25hbCBjb3B5cmlnaHQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMyBDaGloLUNodW5nIENoYW5nIGFuZCBDaGloLUplbiBMaW4KKyAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgICAgYXJlIG1ldDoKKworICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorCisgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKworICAgIDMuIE5laXRoZXIgbmFtZSBvZiBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworCisgICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgICBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAgICBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SCisgICAgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICAgIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YKKyAgICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICAgIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1ZfU1ZNX01JTl9DQUNIRV9TSVpFICAoNDAgPDwgMjApICAvKiA0ME1iICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjaWYgX01TQ19WRVIgPj0gMTIwMAorI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0NTE0ICkgLyogdW5yZWZlcmVuY2VkIGlubGluZSBmdW5jdGlvbnMgKi8KKyNlbmRpZgorCisjaWYgMQordHlwZWRlZiBmbG9hdCBRZmxvYXQ7CisjZGVmaW5lIFFGTE9BVF9UWVBFIENWXzMyRgorI2Vsc2UKK3R5cGVkZWYgZG91YmxlIFFmbG9hdDsKKyNkZWZpbmUgUUZMT0FUX1RZUEUgQ1ZfNjRGCisjZW5kaWYKKworLy8gUGFyYW0gR3JpZAorYm9vbCBDdlBhcmFtR3JpZDo6Y2hlY2soKSBjb25zdAoreworICAgIGJvb2wgb2sgPSBmYWxzZTsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZQYXJhbUdyaWQ6OmNoZWNrIiApOworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCBtaW5fdmFsID4gbWF4X3ZhbCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJMb3dlciBib3VuZCBvZiB0aGUgZ3JpZCBtdXN0IGJlIGxlc3MgdGhlbiB0aGUgdXBwZXIgb25lIiApOworICAgIGlmKCBtaW5fdmFsIDwgREJMX0VQU0lMT04gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiTG93ZXIgYm91bmQgb2YgdGhlIGdyaWQgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKyAgICBpZiggc3RlcCA8IDEuICsgRkxUX0VQU0lMT04gKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiR3JpZCBzdGVwIG11c3QgZ3JlYXRlciB0aGVuIDEiICk7CisKKyAgICBvayA9IHRydWU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG9rOworfQorCitDdlBhcmFtR3JpZCBDdlNWTTo6Z2V0X2RlZmF1bHRfZ3JpZCggaW50IHBhcmFtX2lkICkKK3sKKyAgICBDdlBhcmFtR3JpZCBncmlkOworICAgIGlmKCBwYXJhbV9pZCA9PSBDdlNWTTo6QyApCisgICAgeworICAgICAgICBncmlkLm1pbl92YWwgPSAwLjE7CisgICAgICAgIGdyaWQubWF4X3ZhbCA9IDUwMDsKKyAgICAgICAgZ3JpZC5zdGVwID0gNTsgLy8gdG90YWwgaXRlcmF0aW9ucyA9IDUKKyAgICB9CisgICAgZWxzZSBpZiggcGFyYW1faWQgPT0gQ3ZTVk06OkdBTU1BICkKKyAgICB7CisgICAgICAgIGdyaWQubWluX3ZhbCA9IDFlLTU7CisgICAgICAgIGdyaWQubWF4X3ZhbCA9IDAuNjsKKyAgICAgICAgZ3JpZC5zdGVwID0gMTU7IC8vIHRvdGFsIGl0ZXJhdGlvbnMgPSA0CisgICAgfQorICAgIGVsc2UgaWYoIHBhcmFtX2lkID09IEN2U1ZNOjpQICkKKyAgICB7CisgICAgICAgIGdyaWQubWluX3ZhbCA9IDAuMDE7CisgICAgICAgIGdyaWQubWF4X3ZhbCA9IDEwMDsKKyAgICAgICAgZ3JpZC5zdGVwID0gNzsgLy8gdG90YWwgaXRlcmF0aW9ucyA9IDQKKyAgICB9CisgICAgZWxzZSBpZiggcGFyYW1faWQgPT0gQ3ZTVk06Ok5VICkKKyAgICB7CisgICAgICAgIGdyaWQubWluX3ZhbCA9IDAuMDE7CisgICAgICAgIGdyaWQubWF4X3ZhbCA9IDAuMjsKKyAgICAgICAgZ3JpZC5zdGVwID0gMzsgLy8gdG90YWwgaXRlcmF0aW9ucyA9IDMKKyAgICB9CisgICAgZWxzZSBpZiggcGFyYW1faWQgPT0gQ3ZTVk06OkNPRUYgKQorICAgIHsKKyAgICAgICAgZ3JpZC5taW5fdmFsID0gMC4xOworICAgICAgICBncmlkLm1heF92YWwgPSAzMDA7CisgICAgICAgIGdyaWQuc3RlcCA9IDE0OyAvLyB0b3RhbCBpdGVyYXRpb25zID0gMworICAgIH0KKyAgICBlbHNlIGlmKCBwYXJhbV9pZCA9PSBDdlNWTTo6REVHUkVFICkKKyAgICB7CisgICAgICAgIGdyaWQubWluX3ZhbCA9IDAuMDE7CisgICAgICAgIGdyaWQubWF4X3ZhbCA9IDQ7CisgICAgICAgIGdyaWQuc3RlcCA9IDc7IC8vIHRvdGFsIGl0ZXJhdGlvbnMgPSAzCisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3ZFcnJvciggQ1ZfU3RzQmFkQXJnLCAiQ3ZTVk06OmdldF9kZWZhdWx0X2dyaWQiLCAiSW52YWxpZCB0eXBlIG9mIHBhcmFtZXRlciAiCisgICAgICAgICAgICAiKHVzZSBvbmUgb2YgQ3ZTVk06OkMsIEN2U1ZNOjpHQU1NQSBldCBhbC4pIiwgX19GSUxFX18sIF9fTElORV9fICk7CisgICAgcmV0dXJuIGdyaWQ7Cit9CisKKy8vIFNWTSB0cmFpbmluZyBwYXJhbWV0ZXJzCitDdlNWTVBhcmFtczo6Q3ZTVk1QYXJhbXMoKSA6CisgICAgc3ZtX3R5cGUoQ3ZTVk06OkNfU1ZDKSwga2VybmVsX3R5cGUoQ3ZTVk06OlJCRiksIGRlZ3JlZSgwKSwKKyAgICBnYW1tYSgxKSwgY29lZjAoMCksIEMoMSksIG51KDApLCBwKDApLCBjbGFzc193ZWlnaHRzKDApCit7CisgICAgdGVybV9jcml0ID0gY3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0lURVIrQ1ZfVEVSTUNSSVRfRVBTLCAxMDAwLCBGTFRfRVBTSUxPTiApOworfQorCisKK0N2U1ZNUGFyYW1zOjpDdlNWTVBhcmFtcyggaW50IF9zdm1fdHlwZSwgaW50IF9rZXJuZWxfdHlwZSwKKyAgICBkb3VibGUgX2RlZ3JlZSwgZG91YmxlIF9nYW1tYSwgZG91YmxlIF9jb2VmMCwKKyAgICBkb3VibGUgX0NvbiwgZG91YmxlIF9udSwgZG91YmxlIF9wLAorICAgIEN2TWF0KiBfY2xhc3Nfd2VpZ2h0cywgQ3ZUZXJtQ3JpdGVyaWEgX3Rlcm1fY3JpdCApIDoKKyAgICBzdm1fdHlwZShfc3ZtX3R5cGUpLCBrZXJuZWxfdHlwZShfa2VybmVsX3R5cGUpLAorICAgIGRlZ3JlZShfZGVncmVlKSwgZ2FtbWEoX2dhbW1hKSwgY29lZjAoX2NvZWYwKSwKKyAgICBDKF9Db24pLCBudShfbnUpLCBwKF9wKSwgY2xhc3Nfd2VpZ2h0cyhfY2xhc3Nfd2VpZ2h0cyksIHRlcm1fY3JpdChfdGVybV9jcml0KQoreworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBTVk0ga2VybmVsIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitDdlNWTUtlcm5lbDo6Q3ZTVk1LZXJuZWwoKQoreworICAgIGNsZWFyKCk7Cit9CisKKwordm9pZCBDdlNWTUtlcm5lbDo6Y2xlYXIoKQoreworICAgIHBhcmFtcyA9IDA7CisgICAgY2FsY19mdW5jID0gMDsKK30KKworCitDdlNWTUtlcm5lbDo6fkN2U1ZNS2VybmVsKCkKK3sKK30KKworCitDdlNWTUtlcm5lbDo6Q3ZTVk1LZXJuZWwoIGNvbnN0IEN2U1ZNUGFyYW1zKiBfcGFyYW1zLCBDYWxjIF9jYWxjX2Z1bmMgKQoreworICAgIGNsZWFyKCk7CisgICAgY3JlYXRlKCBfcGFyYW1zLCBfY2FsY19mdW5jICk7Cit9CisKKworYm9vbCBDdlNWTUtlcm5lbDo6Y3JlYXRlKCBjb25zdCBDdlNWTVBhcmFtcyogX3BhcmFtcywgQ2FsYyBfY2FsY19mdW5jICkKK3sKKyAgICBjbGVhcigpOworICAgIHBhcmFtcyA9IF9wYXJhbXM7CisgICAgY2FsY19mdW5jID0gX2NhbGNfZnVuYzsKKworICAgIGlmKCAhY2FsY19mdW5jICkKKyAgICAgICAgY2FsY19mdW5jID0gcGFyYW1zLT5rZXJuZWxfdHlwZSA9PSBDdlNWTTo6UkJGID8gJkN2U1ZNS2VybmVsOjpjYWxjX3JiZiA6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+a2VybmVsX3R5cGUgPT0gQ3ZTVk06OlBPTFkgPyAmQ3ZTVk1LZXJuZWw6OmNhbGNfcG9seSA6CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy0+a2VybmVsX3R5cGUgPT0gQ3ZTVk06OlNJR01PSUQgPyAmQ3ZTVk1LZXJuZWw6OmNhbGNfc2lnbW9pZCA6CisgICAgICAgICAgICAgICAgICAgICZDdlNWTUtlcm5lbDo6Y2FsY19saW5lYXI7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCit2b2lkIEN2U1ZNS2VybmVsOjpjYWxjX25vbl9yYmZfYmFzZSggaW50IHZjb3VudCwgaW50IHZhcl9jb3VudCwgY29uc3QgZmxvYXQqKiB2ZWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBhbm90aGVyLCBRZmxvYXQqIHJlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFscGhhLCBkb3VibGUgYmV0YSApCit7CisgICAgaW50IGosIGs7CisgICAgZm9yKCBqID0gMDsgaiA8IHZjb3VudDsgaisrICkKKyAgICB7CisgICAgICAgIGNvbnN0IGZsb2F0KiBzYW1wbGUgPSB2ZWNzW2pdOworICAgICAgICBkb3VibGUgcyA9IDA7CisgICAgICAgIGZvciggayA9IDA7IGsgPD0gdmFyX2NvdW50IC0gNDsgayArPSA0ICkKKyAgICAgICAgICAgIHMgKz0gc2FtcGxlW2tdKmFub3RoZXJba10gKyBzYW1wbGVbaysxXSphbm90aGVyW2srMV0gKworICAgICAgICAgICAgICAgICBzYW1wbGVbaysyXSphbm90aGVyW2srMl0gKyBzYW1wbGVbayszXSphbm90aGVyW2srM107CisgICAgICAgIGZvciggOyBrIDwgdmFyX2NvdW50OyBrKysgKQorICAgICAgICAgICAgcyArPSBzYW1wbGVba10qYW5vdGhlcltrXTsKKyAgICAgICAgcmVzdWx0c1tqXSA9IChRZmxvYXQpKHMqYWxwaGEgKyBiZXRhKTsKKyAgICB9Cit9CisKKwordm9pZCBDdlNWTUtlcm5lbDo6Y2FsY19saW5lYXIoIGludCB2Y291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0KiogdmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYW5vdGhlciwgUWZsb2F0KiByZXN1bHRzICkKK3sKKyAgICBjYWxjX25vbl9yYmZfYmFzZSggdmNvdW50LCB2YXJfY291bnQsIHZlY3MsIGFub3RoZXIsIHJlc3VsdHMsIDEsIDAgKTsKK30KKworCit2b2lkIEN2U1ZNS2VybmVsOjpjYWxjX3BvbHkoIGludCB2Y291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0KiogdmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFub3RoZXIsIFFmbG9hdCogcmVzdWx0cyApCit7CisgICAgQ3ZNYXQgUiA9IGN2TWF0KCAxLCB2Y291bnQsIFFGTE9BVF9UWVBFLCByZXN1bHRzICk7CisgICAgY2FsY19ub25fcmJmX2Jhc2UoIHZjb3VudCwgdmFyX2NvdW50LCB2ZWNzLCBhbm90aGVyLCByZXN1bHRzLCBwYXJhbXMtPmdhbW1hLCBwYXJhbXMtPmNvZWYwICk7CisgICAgY3ZQb3coICZSLCAmUiwgcGFyYW1zLT5kZWdyZWUgKTsKK30KKworCit2b2lkIEN2U1ZNS2VybmVsOjpjYWxjX3NpZ21vaWQoIGludCB2Y291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0KiogdmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGFub3RoZXIsIFFmbG9hdCogcmVzdWx0cyApCit7CisgICAgaW50IGo7CisgICAgY2FsY19ub25fcmJmX2Jhc2UoIHZjb3VudCwgdmFyX2NvdW50LCB2ZWNzLCBhbm90aGVyLCByZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAtMipwYXJhbXMtPmdhbW1hLCAtMipwYXJhbXMtPmNvZWYwICk7CisgICAgLy8gVE9ETzogc3BlZWR1cCB0aGlzCisgICAgZm9yKCBqID0gMDsgaiA8IHZjb3VudDsgaisrICkKKyAgICB7CisgICAgICAgIFFmbG9hdCB0ID0gcmVzdWx0c1tqXTsKKyAgICAgICAgZG91YmxlIGUgPSBleHAoLWZhYnModCkpOworICAgICAgICBpZiggdCA+IDAgKQorICAgICAgICAgICAgcmVzdWx0c1tqXSA9IChRZmxvYXQpKCgxLiAtIGUpLygxLiArIGUpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmVzdWx0c1tqXSA9IChRZmxvYXQpKChlIC0gMS4pLyhlICsgMS4pKTsKKyAgICB9Cit9CisKKwordm9pZCBDdlNWTUtlcm5lbDo6Y2FsY19yYmYoIGludCB2Y291bnQsIGludCB2YXJfY291bnQsIGNvbnN0IGZsb2F0KiogdmVjcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYW5vdGhlciwgUWZsb2F0KiByZXN1bHRzICkKK3sKKyAgICBDdk1hdCBSID0gY3ZNYXQoIDEsIHZjb3VudCwgUUZMT0FUX1RZUEUsIHJlc3VsdHMgKTsKKyAgICBkb3VibGUgZ2FtbWEgPSAtcGFyYW1zLT5nYW1tYTsKKyAgICBpbnQgaiwgazsKKworICAgIGZvciggaiA9IDA7IGogPCB2Y291bnQ7IGorKyApCisgICAgeworICAgICAgICBjb25zdCBmbG9hdCogc2FtcGxlID0gdmVjc1tqXTsKKyAgICAgICAgZG91YmxlIHMgPSAwOworCisgICAgICAgIGZvciggayA9IDA7IGsgPD0gdmFyX2NvdW50IC0gNDsgayArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gc2FtcGxlW2tdIC0gYW5vdGhlcltrXTsKKyAgICAgICAgICAgIGRvdWJsZSB0MSA9IHNhbXBsZVtrKzFdIC0gYW5vdGhlcltrKzFdOworCisgICAgICAgICAgICBzICs9IHQwKnQwICsgdDEqdDE7CisKKyAgICAgICAgICAgIHQwID0gc2FtcGxlW2srMl0gLSBhbm90aGVyW2srMl07CisgICAgICAgICAgICB0MSA9IHNhbXBsZVtrKzNdIC0gYW5vdGhlcltrKzNdOworCisgICAgICAgICAgICBzICs9IHQwKnQwICsgdDEqdDE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIDsgayA8IHZhcl9jb3VudDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHQwID0gc2FtcGxlW2tdIC0gYW5vdGhlcltrXTsKKyAgICAgICAgICAgIHMgKz0gdDAqdDA7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0c1tqXSA9IChRZmxvYXQpKHMqZ2FtbWEpOworICAgIH0KKworICAgIGN2RXhwKCAmUiwgJlIgKTsKK30KKworCit2b2lkIEN2U1ZNS2VybmVsOjpjYWxjKCBpbnQgdmNvdW50LCBpbnQgdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIHZlY3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogYW5vdGhlciwgUWZsb2F0KiByZXN1bHRzICkKK3sKKyAgICBjb25zdCBRZmxvYXQgbWF4X3ZhbCA9IChRZmxvYXQpKEZMVF9NQVgqMWUtMyk7CisgICAgaW50IGo7CisgICAgKHRoaXMtPipjYWxjX2Z1bmMpKCB2Y291bnQsIHZhcl9jb3VudCwgdmVjcywgYW5vdGhlciwgcmVzdWx0cyApOworICAgIGZvciggaiA9IDA7IGogPCB2Y291bnQ7IGorKyApCisgICAgeworICAgICAgICBpZiggcmVzdWx0c1tqXSA+IG1heF92YWwgKQorICAgICAgICAgICAgcmVzdWx0c1tqXSA9IG1heF92YWw7CisgICAgfQorfQorCisKKy8vIEdlbmVyYWxpemVkIFNNTytTVk1saWdodCBhbGdvcml0aG0KKy8vIFNvbHZlczoKKy8vCisvLyAgbWluIFswLjUoXGFscGhhXlQgUSBcYWxwaGEpICsgYl5UIFxhbHBoYV0KKy8vCisvLyAgICAgIHleVCBcYWxwaGEgPSBcZGVsdGEKKy8vICAgICAgeV9pID0gKzEgb3IgLTEKKy8vICAgICAgMCA8PSBhbHBoYV9pIDw9IENwIGZvciB5X2kgPSAxCisvLyAgICAgIDAgPD0gYWxwaGFfaSA8PSBDbiBmb3IgeV9pID0gLTEKKy8vCisvLyBHaXZlbjoKKy8vCisvLyAgUSwgYiwgeSwgQ3AsIENuLCBhbmQgYW4gaW5pdGlhbCBmZWFzaWJsZSBwb2ludCBcYWxwaGEKKy8vICBsIGlzIHRoZSBzaXplIG9mIHZlY3RvcnMgYW5kIG1hdHJpY2VzCisvLyAgZXBzIGlzIHRoZSBzdG9wcGluZyBjcml0ZXJpb24KKy8vCisvLyBzb2x1dGlvbiB3aWxsIGJlIHB1dCBpbiBcYWxwaGEsIG9iamVjdGl2ZSB2YWx1ZSB3aWxsIGJlIHB1dCBpbiBvYmoKKy8vCisKK3ZvaWQgQ3ZTVk1Tb2x2ZXI6OmNsZWFyKCkKK3sKKyAgICBHID0gMDsKKyAgICBhbHBoYSA9IDA7CisgICAgeSA9IDA7CisgICAgYiA9IDA7CisgICAgYnVmWzBdID0gYnVmWzFdID0gMDsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmc3RvcmFnZSApOworICAgIGtlcm5lbCA9IDA7CisgICAgc2VsZWN0X3dvcmtpbmdfc2V0X2Z1bmMgPSAwOworICAgIGNhbGNfcmhvX2Z1bmMgPSAwOworCisgICAgcm93cyA9IDA7CisgICAgc2FtcGxlcyA9IDA7CisgICAgZ2V0X3Jvd19mdW5jID0gMDsKK30KKworCitDdlNWTVNvbHZlcjo6Q3ZTVk1Tb2x2ZXIoKQoreworICAgIHN0b3JhZ2UgPSAwOworICAgIGNsZWFyKCk7Cit9CisKKworQ3ZTVk1Tb2x2ZXI6On5DdlNWTVNvbHZlcigpCit7CisgICAgY2xlYXIoKTsKK30KKworCitDdlNWTVNvbHZlcjo6Q3ZTVk1Tb2x2ZXIoIGludCBfc2FtcGxlX2NvdW50LCBpbnQgX3Zhcl9jb3VudCwgY29uc3QgZmxvYXQqKiBfc2FtcGxlcywgc2NoYXIqIF95LAorICAgICAgICAgICAgICAgIGludCBfYWxwaGFfY291bnQsIGRvdWJsZSogX2FscGhhLCBkb3VibGUgX0NwLCBkb3VibGUgX0NuLAorICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsIEN2U1ZNS2VybmVsKiBfa2VybmVsLCBHZXRSb3cgX2dldF9yb3csCisgICAgICAgICAgICAgICAgU2VsZWN0V29ya2luZ1NldCBfc2VsZWN0X3dvcmtpbmdfc2V0LCBDYWxjUmhvIF9jYWxjX3JobyApCit7CisgICAgc3RvcmFnZSA9IDA7CisgICAgY3JlYXRlKCBfc2FtcGxlX2NvdW50LCBfdmFyX2NvdW50LCBfc2FtcGxlcywgX3ksIF9hbHBoYV9jb3VudCwgX2FscGhhLCBfQ3AsIF9DbiwKKyAgICAgICAgICAgIF9zdG9yYWdlLCBfa2VybmVsLCBfZ2V0X3JvdywgX3NlbGVjdF93b3JraW5nX3NldCwgX2NhbGNfcmhvICk7Cit9CisKKworYm9vbCBDdlNWTVNvbHZlcjo6Y3JlYXRlKCBpbnQgX3NhbXBsZV9jb3VudCwgaW50IF92YXJfY291bnQsIGNvbnN0IGZsb2F0KiogX3NhbXBsZXMsIHNjaGFyKiBfeSwKKyAgICAgICAgICAgICAgICBpbnQgX2FscGhhX2NvdW50LCBkb3VibGUqIF9hbHBoYSwgZG91YmxlIF9DcCwgZG91YmxlIF9DbiwKKyAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIF9zdG9yYWdlLCBDdlNWTUtlcm5lbCogX2tlcm5lbCwgR2V0Um93IF9nZXRfcm93LAorICAgICAgICAgICAgICAgIFNlbGVjdFdvcmtpbmdTZXQgX3NlbGVjdF93b3JraW5nX3NldCwgQ2FsY1JobyBfY2FsY19yaG8gKQoreworICAgIGJvb2wgb2sgPSBmYWxzZTsKKyAgICBpbnQgaSwgc3ZtX3R5cGU7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2U1ZNU29sdmVyOjpjcmVhdGUiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgcm93c19oZHJfc2l6ZTsKKworICAgIGNsZWFyKCk7CisKKyAgICBzYW1wbGVfY291bnQgPSBfc2FtcGxlX2NvdW50OworICAgIHZhcl9jb3VudCA9IF92YXJfY291bnQ7CisgICAgc2FtcGxlcyA9IF9zYW1wbGVzOworICAgIHkgPSBfeTsKKyAgICBhbHBoYV9jb3VudCA9IF9hbHBoYV9jb3VudDsKKyAgICBhbHBoYSA9IF9hbHBoYTsKKyAgICBrZXJuZWwgPSBfa2VybmVsOworCisgICAgQ1swXSA9IF9DbjsKKyAgICBDWzFdID0gX0NwOworICAgIGVwcyA9IGtlcm5lbC0+cGFyYW1zLT50ZXJtX2NyaXQuZXBzaWxvbjsKKyAgICBtYXhfaXRlciA9IGtlcm5lbC0+cGFyYW1zLT50ZXJtX2NyaXQubWF4X2l0ZXI7CisgICAgc3RvcmFnZSA9IGN2Q3JlYXRlQ2hpbGRNZW1TdG9yYWdlKCBfc3RvcmFnZSApOworCisgICAgYiA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBhbHBoYV9jb3VudCpzaXplb2YoYlswXSkpOworICAgIGFscGhhX3N0YXR1cyA9IChzY2hhciopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIGFscGhhX2NvdW50KnNpemVvZihhbHBoYV9zdGF0dXNbMF0pKTsKKyAgICBHID0gKGRvdWJsZSopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIGFscGhhX2NvdW50KnNpemVvZihHWzBdKSk7CisgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKyApCisgICAgICAgIGJ1ZltpXSA9IChRZmxvYXQqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBzYW1wbGVfY291bnQqMipzaXplb2YoYnVmW2ldWzBdKSApOworICAgIHN2bV90eXBlID0ga2VybmVsLT5wYXJhbXMtPnN2bV90eXBlOworCisgICAgc2VsZWN0X3dvcmtpbmdfc2V0X2Z1bmMgPSBfc2VsZWN0X3dvcmtpbmdfc2V0OworICAgIGlmKCAhc2VsZWN0X3dvcmtpbmdfc2V0X2Z1bmMgKQorICAgICAgICBzZWxlY3Rfd29ya2luZ19zZXRfZnVuYyA9IHN2bV90eXBlID09IEN2U1ZNOjpOVV9TVkMgfHwgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWUiA/CisgICAgICAgICZDdlNWTVNvbHZlcjo6c2VsZWN0X3dvcmtpbmdfc2V0X251X3N2bSA6ICZDdlNWTVNvbHZlcjo6c2VsZWN0X3dvcmtpbmdfc2V0OworCisgICAgY2FsY19yaG9fZnVuYyA9IF9jYWxjX3JobzsKKyAgICBpZiggIWNhbGNfcmhvX2Z1bmMgKQorICAgICAgICBjYWxjX3Job19mdW5jID0gc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWQyB8fCBzdm1fdHlwZSA9PSBDdlNWTTo6TlVfU1ZSID8KKyAgICAgICAgICAgICZDdlNWTVNvbHZlcjo6Y2FsY19yaG9fbnVfc3ZtIDogJkN2U1ZNU29sdmVyOjpjYWxjX3JobzsKKworICAgIGdldF9yb3dfZnVuYyA9IF9nZXRfcm93OworICAgIGlmKCAhZ2V0X3Jvd19mdW5jICkKKyAgICAgICAgZ2V0X3Jvd19mdW5jID0gcGFyYW1zLT5zdm1fdHlwZSA9PSBDdlNWTTo6RVBTX1NWUiB8fAorICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnN2bV90eXBlID09IEN2U1ZNOjpOVV9TVlIgPyAmQ3ZTVk1Tb2x2ZXI6OmdldF9yb3dfc3ZyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zdm1fdHlwZSA9PSBDdlNWTTo6Q19TVkMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zdm1fdHlwZSA9PSBDdlNWTTo6TlVfU1ZDID8gJkN2U1ZNU29sdmVyOjpnZXRfcm93X3N2YyA6CisgICAgICAgICAgICAgICAgICAgICAgICZDdlNWTVNvbHZlcjo6Z2V0X3Jvd19vbmVfY2xhc3M7CisKKyAgICBjYWNoZV9saW5lX3NpemUgPSBzYW1wbGVfY291bnQqc2l6ZW9mKFFmbG9hdCk7CisgICAgLy8gY2FjaGUgc2l6ZSA9IG1heChudW1fb2Zfc2FtcGxlc14yKnNpemVvZihRZmxvYXQpKjAuMjUsIDY0S2IpCisgICAgLy8gKGFzc3VtaW5nIHRoYXQgZm9yIGxhcmdlIHRyYWluaW5nIHNldHMgfjI1JSBvZiBRIG1hdHJpeCBpcyB1c2VkKQorICAgIGNhY2hlX3NpemUgPSBNQVgoIGNhY2hlX2xpbmVfc2l6ZSpzYW1wbGVfY291bnQvNCwgQ1ZfU1ZNX01JTl9DQUNIRV9TSVpFICk7CisKKyAgICAvLyB0aGUgc2l6ZSBvZiBRIG1hdHJpeCByb3cgaGVhZGVycworICAgIHJvd3NfaGRyX3NpemUgPSBzYW1wbGVfY291bnQqc2l6ZW9mKHJvd3NbMF0pOworICAgIGlmKCByb3dzX2hkcl9zaXplID4gc3RvcmFnZS0+YmxvY2tfc2l6ZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVG9vIHNtYWxsIHN0b3JhZ2UgYmxvY2sgc2l6ZSIgKTsKKworICAgIGxydV9saXN0LnByZXYgPSBscnVfbGlzdC5uZXh0ID0gJmxydV9saXN0OworICAgIHJvd3MgPSAoQ3ZTVk1LZXJuZWxSb3cqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCByb3dzX2hkcl9zaXplICk7CisgICAgbWVtc2V0KCByb3dzLCAwLCByb3dzX2hkcl9zaXplICk7CisKKyAgICBvayA9IHRydWU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG9rOworfQorCisKK2Zsb2F0KiBDdlNWTVNvbHZlcjo6Z2V0X3Jvd19iYXNlKCBpbnQgaSwgYm9vbCogX2V4aXN0ZWQgKQoreworICAgIGludCBpMSA9IGkgPCBzYW1wbGVfY291bnQgPyBpIDogaSAtIHNhbXBsZV9jb3VudDsKKyAgICBDdlNWTUtlcm5lbFJvdyogcm93ID0gcm93cyArIGkxOworICAgIGJvb2wgZXhpc3RlZCA9IHJvdy0+ZGF0YSAhPSAwOworICAgIFFmbG9hdCogZGF0YTsKKworICAgIGlmKCBleGlzdGVkIHx8IGNhY2hlX3NpemUgPD0gMCApCisgICAgeworICAgICAgICBDdlNWTUtlcm5lbFJvdyogZGVsX3JvdyA9IGV4aXN0ZWQgPyByb3cgOiBscnVfbGlzdC5wcmV2OworICAgICAgICBkYXRhID0gZGVsX3Jvdy0+ZGF0YTsKKyAgICAgICAgYXNzZXJ0KCBkYXRhICE9IDAgKTsKKworICAgICAgICAvLyBkZWxldGUgcm93IGZyb20gdGhlIExSVSBsaXN0CisgICAgICAgIGRlbF9yb3ctPmRhdGEgPSAwOworICAgICAgICBkZWxfcm93LT5wcmV2LT5uZXh0ID0gZGVsX3Jvdy0+bmV4dDsKKyAgICAgICAgZGVsX3Jvdy0+bmV4dC0+cHJldiA9IGRlbF9yb3ctPnByZXY7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGRhdGEgPSAoUWZsb2F0Kiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgY2FjaGVfbGluZV9zaXplICk7CisgICAgICAgIGNhY2hlX3NpemUgLT0gY2FjaGVfbGluZV9zaXplOworICAgIH0KKworICAgIC8vIGluc2VydCByb3cgaW50byB0aGUgTFJVIGxpc3QKKyAgICByb3ctPmRhdGEgPSBkYXRhOworICAgIHJvdy0+cHJldiA9ICZscnVfbGlzdDsKKyAgICByb3ctPm5leHQgPSBscnVfbGlzdC5uZXh0OworICAgIHJvdy0+cHJldi0+bmV4dCA9IHJvdy0+bmV4dC0+cHJldiA9IHJvdzsKKworICAgIGlmKCAhZXhpc3RlZCApCisgICAgeworICAgICAgICBrZXJuZWwtPmNhbGMoIHNhbXBsZV9jb3VudCwgdmFyX2NvdW50LCBzYW1wbGVzLCBzYW1wbGVzW2kxXSwgcm93LT5kYXRhICk7CisgICAgfQorCisgICAgaWYoIF9leGlzdGVkICkKKyAgICAgICAgKl9leGlzdGVkID0gZXhpc3RlZDsKKworICAgIHJldHVybiByb3ctPmRhdGE7Cit9CisKKworZmxvYXQqIEN2U1ZNU29sdmVyOjpnZXRfcm93X3N2YyggaW50IGksIGZsb2F0KiByb3csIGZsb2F0KiwgYm9vbCBleGlzdGVkICkKK3sKKyAgICBpZiggIWV4aXN0ZWQgKQorICAgIHsKKyAgICAgICAgY29uc3Qgc2NoYXIqIF95ID0geTsKKyAgICAgICAgaW50IGosIGxlbiA9IHNhbXBsZV9jb3VudDsKKyAgICAgICAgYXNzZXJ0KCBfeSAmJiBpIDwgc2FtcGxlX2NvdW50ICk7CisKKyAgICAgICAgaWYoIF95W2ldID4gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBsZW47IGorKyApCisgICAgICAgICAgICAgICAgcm93W2pdID0gX3lbal0qcm93W2pdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGxlbjsgaisrICkKKyAgICAgICAgICAgICAgICByb3dbal0gPSAtX3lbal0qcm93W2pdOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByb3c7Cit9CisKKworZmxvYXQqIEN2U1ZNU29sdmVyOjpnZXRfcm93X29uZV9jbGFzcyggaW50LCBmbG9hdCogcm93LCBmbG9hdCosIGJvb2wgKQoreworICAgIHJldHVybiByb3c7Cit9CisKKworZmxvYXQqIEN2U1ZNU29sdmVyOjpnZXRfcm93X3N2ciggaW50IGksIGZsb2F0KiByb3csIGZsb2F0KiBkc3QsIGJvb2wgKQoreworICAgIGludCBqLCBsZW4gPSBzYW1wbGVfY291bnQ7CisgICAgUWZsb2F0KiBkc3RfcG9zID0gZHN0OworICAgIFFmbG9hdCogZHN0X25lZyA9IGRzdCArIGxlbjsKKyAgICBpZiggaSA+PSBsZW4gKQorICAgIHsKKyAgICAgICAgUWZsb2F0KiB0ZW1wOworICAgICAgICBDVl9TV0FQKCBkc3RfcG9zLCBkc3RfbmVnLCB0ZW1wICk7CisgICAgfQorCisgICAgZm9yKCBqID0gMDsgaiA8IGxlbjsgaisrICkKKyAgICB7CisgICAgICAgIFFmbG9hdCB0ID0gcm93W2pdOworICAgICAgICBkc3RfcG9zW2pdID0gdDsKKyAgICAgICAgZHN0X25lZ1tqXSA9IC10OworICAgIH0KKyAgICByZXR1cm4gZHN0OworfQorCisKKworZmxvYXQqIEN2U1ZNU29sdmVyOjpnZXRfcm93KCBpbnQgaSwgZmxvYXQqIGRzdCApCit7CisgICAgYm9vbCBleGlzdGVkID0gZmFsc2U7CisgICAgZmxvYXQqIHJvdyA9IGdldF9yb3dfYmFzZSggaSwgJmV4aXN0ZWQgKTsKKyAgICByZXR1cm4gKHRoaXMtPipnZXRfcm93X2Z1bmMpKCBpLCByb3csIGRzdCwgZXhpc3RlZCApOworfQorCisKKyN1bmRlZiBpc191cHBlcl9ib3VuZAorI2RlZmluZSBpc191cHBlcl9ib3VuZChpKSAoYWxwaGFfc3RhdHVzW2ldID4gMCkKKworI3VuZGVmIGlzX2xvd2VyX2JvdW5kCisjZGVmaW5lIGlzX2xvd2VyX2JvdW5kKGkpIChhbHBoYV9zdGF0dXNbaV0gPCAwKQorCisjdW5kZWYgaXNfZnJlZQorI2RlZmluZSBpc19mcmVlKGkpIChhbHBoYV9zdGF0dXNbaV0gPT0gMCkKKworI3VuZGVmIGdldF9DCisjZGVmaW5lIGdldF9DKGkpIChDW3lbaV0+MF0pCisKKyN1bmRlZiB1cGRhdGVfYWxwaGFfc3RhdHVzCisjZGVmaW5lIHVwZGF0ZV9hbHBoYV9zdGF0dXMoaSkgXAorICAgIGFscGhhX3N0YXR1c1tpXSA9IChzY2hhcikoYWxwaGFbaV0gPj0gZ2V0X0MoaSkgPyAxIDogYWxwaGFbaV0gPD0gMCA/IC0xIDogMCkKKworI3VuZGVmIHJlY29uc3RydWN0X2dyYWRpZW50CisjZGVmaW5lIHJlY29uc3RydWN0X2dyYWRpZW50KCkgLyogZW1wdHkgZm9yIG5vdyAqLworCisKK2Jvb2wgQ3ZTVk1Tb2x2ZXI6OnNvbHZlX2dlbmVyaWMoIEN2U1ZNU29sdXRpb25JbmZvJiBzaSApCit7CisgICAgaW50IGl0ZXIgPSAwOworICAgIGludCBpLCBqLCBrOworCisgICAgLy8gMS4gaW5pdGlhbGl6ZSBncmFkaWVudCBhbmQgYWxwaGEgc3RhdHVzCisgICAgZm9yKCBpID0gMDsgaSA8IGFscGhhX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgdXBkYXRlX2FscGhhX3N0YXR1cyhpKTsKKyAgICAgICAgR1tpXSA9IGJbaV07CisgICAgICAgIGlmKCBmYWJzKEdbaV0pID4gMWUyMDAgKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGZvciggaSA9IDA7IGkgPCBhbHBoYV9jb3VudDsgaSsrICkKKyAgICB7CisgICAgICAgIGlmKCAhaXNfbG93ZXJfYm91bmQoaSkgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBRZmxvYXQgKlFfaSA9IGdldF9yb3coIGksIGJ1ZlswXSApOworICAgICAgICAgICAgZG91YmxlIGFscGhhX2kgPSBhbHBoYVtpXTsKKworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGFscGhhX2NvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIEdbal0gKz0gYWxwaGFfaSpRX2lbal07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBvcHRpbWl6YXRpb24gbG9vcAorICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGNvbnN0IFFmbG9hdCAqUV9pLCAqUV9qOworICAgICAgICBkb3VibGUgQ19pLCBDX2o7CisgICAgICAgIGRvdWJsZSBvbGRfYWxwaGFfaSwgb2xkX2FscGhhX2osIGFscGhhX2ksIGFscGhhX2o7CisgICAgICAgIGRvdWJsZSBkZWx0YV9hbHBoYV9pLCBkZWx0YV9hbHBoYV9qOworCisjaWZkZWYgX0RFQlVHCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBhbHBoYV9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGZhYnMoR1tpXSkgPiAxZSszMDAgKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAgICAgaWYoIGZhYnMoYWxwaGFbaV0pID4gMWUxNiApCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBpZiggKHRoaXMtPipzZWxlY3Rfd29ya2luZ19zZXRfZnVuYykoIGksIGogKSAhPSAwIHx8IGl0ZXIrKyA+PSBtYXhfaXRlciApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBRX2kgPSBnZXRfcm93KCBpLCBidWZbMF0gKTsKKyAgICAgICAgUV9qID0gZ2V0X3JvdyggaiwgYnVmWzFdICk7CisKKyAgICAgICAgQ19pID0gZ2V0X0MoaSk7CisgICAgICAgIENfaiA9IGdldF9DKGopOworCisgICAgICAgIGFscGhhX2kgPSBvbGRfYWxwaGFfaSA9IGFscGhhW2ldOworICAgICAgICBhbHBoYV9qID0gb2xkX2FscGhhX2ogPSBhbHBoYVtqXTsKKworICAgICAgICBpZiggeVtpXSAhPSB5W2pdICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGRlbm9tID0gUV9pW2ldK1FfaltqXSsyKlFfaVtqXTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YSA9ICgtR1tpXS1HW2pdKS9NQVgoZmFicyhkZW5vbSksRkxUX0VQU0lMT04pOworICAgICAgICAgICAgZG91YmxlIGRpZmYgPSBhbHBoYV9pIC0gYWxwaGFfajsKKyAgICAgICAgICAgIGFscGhhX2kgKz0gZGVsdGE7CisgICAgICAgICAgICBhbHBoYV9qICs9IGRlbHRhOworCisgICAgICAgICAgICBpZiggZGlmZiA+IDAgJiYgYWxwaGFfaiA8IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFscGhhX2ogPSAwOworICAgICAgICAgICAgICAgIGFscGhhX2kgPSBkaWZmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZGlmZiA8PSAwICYmIGFscGhhX2kgPCAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHBoYV9pID0gMDsKKyAgICAgICAgICAgICAgICBhbHBoYV9qID0gLWRpZmY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBkaWZmID4gQ19pIC0gQ19qICYmIGFscGhhX2kgPiBDX2kgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFscGhhX2kgPSBDX2k7CisgICAgICAgICAgICAgICAgYWxwaGFfaiA9IENfaSAtIGRpZmY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBkaWZmIDw9IENfaSAtIENfaiAmJiBhbHBoYV9qID4gQ19qICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHBoYV9qID0gQ19qOworICAgICAgICAgICAgICAgIGFscGhhX2kgPSBDX2ogKyBkaWZmOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGRlbm9tID0gUV9pW2ldK1FfaltqXS0yKlFfaVtqXTsKKyAgICAgICAgICAgIGRvdWJsZSBkZWx0YSA9IChHW2ldLUdbal0pL01BWChmYWJzKGRlbm9tKSxGTFRfRVBTSUxPTik7CisgICAgICAgICAgICBkb3VibGUgc3VtID0gYWxwaGFfaSArIGFscGhhX2o7CisgICAgICAgICAgICBhbHBoYV9pIC09IGRlbHRhOworICAgICAgICAgICAgYWxwaGFfaiArPSBkZWx0YTsKKworICAgICAgICAgICAgaWYoIHN1bSA+IENfaSAmJiBhbHBoYV9pID4gQ19pICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhbHBoYV9pID0gQ19pOworICAgICAgICAgICAgICAgIGFscGhhX2ogPSBzdW0gLSBDX2k7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmKCBzdW0gPD0gQ19pICYmIGFscGhhX2ogPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFscGhhX2ogPSAwOworICAgICAgICAgICAgICAgIGFscGhhX2kgPSBzdW07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzdW0gPiBDX2ogJiYgYWxwaGFfaiA+IENfaiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWxwaGFfaiA9IENfajsKKyAgICAgICAgICAgICAgICBhbHBoYV9pID0gc3VtIC0gQ19qOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggc3VtIDw9IENfaiAmJiBhbHBoYV9pIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWxwaGFfaSA9IDA7CisgICAgICAgICAgICAgICAgYWxwaGFfaiA9IHN1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSBhbHBoYQorICAgICAgICBhbHBoYVtpXSA9IGFscGhhX2k7CisgICAgICAgIGFscGhhW2pdID0gYWxwaGFfajsKKyAgICAgICAgdXBkYXRlX2FscGhhX3N0YXR1cyhpKTsKKyAgICAgICAgdXBkYXRlX2FscGhhX3N0YXR1cyhqKTsKKworICAgICAgICAvLyB1cGRhdGUgRworICAgICAgICBkZWx0YV9hbHBoYV9pID0gYWxwaGFfaSAtIG9sZF9hbHBoYV9pOworICAgICAgICBkZWx0YV9hbHBoYV9qID0gYWxwaGFfaiAtIG9sZF9hbHBoYV9qOworCisgICAgICAgIGZvciggayA9IDA7IGsgPCBhbHBoYV9jb3VudDsgaysrICkKKyAgICAgICAgICAgIEdba10gKz0gUV9pW2tdKmRlbHRhX2FscGhhX2kgKyBRX2pba10qZGVsdGFfYWxwaGFfajsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgcmhvCisgICAgKHRoaXMtPipjYWxjX3Job19mdW5jKSggc2kucmhvLCBzaS5yICk7CisKKyAgICAvLyBjYWxjdWxhdGUgb2JqZWN0aXZlIHZhbHVlCisgICAgZm9yKCBpID0gMCwgc2kub2JqID0gMDsgaSA8IGFscGhhX2NvdW50OyBpKysgKQorICAgICAgICBzaS5vYmogKz0gYWxwaGFbaV0gKiAoR1tpXSArIGJbaV0pOworCisgICAgc2kub2JqICo9IDAuNTsKKworICAgIHNpLnVwcGVyX2JvdW5kX3AgPSBDWzFdOworICAgIHNpLnVwcGVyX2JvdW5kX24gPSBDWzBdOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8gcmV0dXJuIDEgaWYgYWxyZWFkeSBvcHRpbWFsLCByZXR1cm4gMCBvdGhlcndpc2UKK2Jvb2wKK0N2U1ZNU29sdmVyOjpzZWxlY3Rfd29ya2luZ19zZXQoIGludCYgb3V0X2ksIGludCYgb3V0X2ogKQoreworICAgIC8vIHJldHVybiBpLGogd2hpY2ggbWF4aW1pemUgLWdyYWQoZileVCBkICwgdW5kZXIgY29uc3RyYWludAorICAgIC8vIGlmIGFscGhhX2kgPT0gQywgZCAhPSArMQorICAgIC8vIGlmIGFscGhhX2kgPT0gMCwgZCAhPSAtMQorICAgIGRvdWJsZSBHbWF4MSA9IC1EQkxfTUFYOyAgICAgICAgLy8gbWF4IHsgLWdyYWQoZilfaSAqIGQgfCB5X2kqZCA9ICsxIH0KKyAgICBpbnQgR21heDFfaWR4ID0gLTE7CisKKyAgICBkb3VibGUgR21heDIgPSAtREJMX01BWDsgICAgICAgIC8vIG1heCB7IC1ncmFkKGYpX2kgKiBkIHwgeV9pKmQgPSAtMSB9CisgICAgaW50IEdtYXgyX2lkeCA9IC0xOworCisgICAgaW50IGk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgYWxwaGFfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgdDsKKworICAgICAgICBpZiggeVtpXSA+IDAgKSAgICAvLyB5ID0gKzEKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFpc191cHBlcl9ib3VuZChpKSAmJiAodCA9IC1HW2ldKSA+IEdtYXgxICkgIC8vIGQgPSArMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdtYXgxID0gdDsKKyAgICAgICAgICAgICAgICBHbWF4MV9pZHggPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoICFpc19sb3dlcl9ib3VuZChpKSAmJiAodCA9IEdbaV0pID4gR21heDIgKSAgLy8gZCA9IC0xCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR21heDIgPSB0OworICAgICAgICAgICAgICAgIEdtYXgyX2lkeCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAgICAgICAgLy8geSA9IC0xCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhaXNfdXBwZXJfYm91bmQoaSkgJiYgKHQgPSAtR1tpXSkgPiBHbWF4MiApICAvLyBkID0gKzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHbWF4MiA9IHQ7CisgICAgICAgICAgICAgICAgR21heDJfaWR4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhaXNfbG93ZXJfYm91bmQoaSkgJiYgKHQgPSBHW2ldKSA+IEdtYXgxICkgIC8vIGQgPSAtMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdtYXgxID0gdDsKKyAgICAgICAgICAgICAgICBHbWF4MV9pZHggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgb3V0X2kgPSBHbWF4MV9pZHg7CisgICAgb3V0X2ogPSBHbWF4Ml9pZHg7CisKKyAgICByZXR1cm4gR21heDEgKyBHbWF4MiA8IGVwczsKK30KKworCit2b2lkCitDdlNWTVNvbHZlcjo6Y2FsY19yaG8oIGRvdWJsZSYgcmhvLCBkb3VibGUmIHIgKQoreworICAgIGludCBpLCBucl9mcmVlID0gMDsKKyAgICBkb3VibGUgdWIgPSBEQkxfTUFYLCBsYiA9IC1EQkxfTUFYLCBzdW1fZnJlZSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgYWxwaGFfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgeUcgPSB5W2ldKkdbaV07CisKKyAgICAgICAgaWYoIGlzX2xvd2VyX2JvdW5kKGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHlbaV0gPiAwICkKKyAgICAgICAgICAgICAgICB1YiA9IE1JTih1Yix5Ryk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGIgPSBNQVgobGIseUcpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIGlzX3VwcGVyX2JvdW5kKGkpICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHlbaV0gPCAwKQorICAgICAgICAgICAgICAgIHViID0gTUlOKHViLHlHKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBsYiA9IE1BWChsYix5Ryk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICArK25yX2ZyZWU7CisgICAgICAgICAgICBzdW1fZnJlZSArPSB5RzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJobyA9IG5yX2ZyZWUgPiAwID8gc3VtX2ZyZWUvbnJfZnJlZSA6ICh1YiArIGxiKSowLjU7CisgICAgciA9IDA7Cit9CisKKworYm9vbAorQ3ZTVk1Tb2x2ZXI6OnNlbGVjdF93b3JraW5nX3NldF9udV9zdm0oIGludCYgb3V0X2ksIGludCYgb3V0X2ogKQoreworICAgIC8vIHJldHVybiBpLGogd2hpY2ggbWF4aW1pemUgLWdyYWQoZileVCBkICwgdW5kZXIgY29uc3RyYWludAorICAgIC8vIGlmIGFscGhhX2kgPT0gQywgZCAhPSArMQorICAgIC8vIGlmIGFscGhhX2kgPT0gMCwgZCAhPSAtMQorICAgIGRvdWJsZSBHbWF4MSA9IC1EQkxfTUFYOyAgICAvLyBtYXggeyAtZ3JhZChmKV9pICogZCB8IHlfaSA9ICsxLCBkID0gKzEgfQorICAgIGludCBHbWF4MV9pZHggPSAtMTsKKworICAgIGRvdWJsZSBHbWF4MiA9IC1EQkxfTUFYOyAgICAvLyBtYXggeyAtZ3JhZChmKV9pICogZCB8IHlfaSA9ICsxLCBkID0gLTEgfQorICAgIGludCBHbWF4Ml9pZHggPSAtMTsKKworICAgIGRvdWJsZSBHbWF4MyA9IC1EQkxfTUFYOyAgICAvLyBtYXggeyAtZ3JhZChmKV9pICogZCB8IHlfaSA9IC0xLCBkID0gKzEgfQorICAgIGludCBHbWF4M19pZHggPSAtMTsKKworICAgIGRvdWJsZSBHbWF4NCA9IC1EQkxfTUFYOyAgICAvLyBtYXggeyAtZ3JhZChmKV9pICogZCB8IHlfaSA9IC0xLCBkID0gLTEgfQorICAgIGludCBHbWF4NF9pZHggPSAtMTsKKworICAgIGludCBpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGFscGhhX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHQ7CisKKyAgICAgICAgaWYoIHlbaV0gPiAwICkgICAgLy8geSA9PSArMQorICAgICAgICB7CisgICAgICAgICAgICBpZiggIWlzX3VwcGVyX2JvdW5kKGkpICYmICh0ID0gLUdbaV0pID4gR21heDEgKSAgLy8gZCA9ICsxCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgR21heDEgPSB0OworICAgICAgICAgICAgICAgIEdtYXgxX2lkeCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggIWlzX2xvd2VyX2JvdW5kKGkpICYmICh0ID0gR1tpXSkgPiBHbWF4MiApICAvLyBkID0gLTEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHbWF4MiA9IHQ7CisgICAgICAgICAgICAgICAgR21heDJfaWR4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlICAgICAgICAvLyB5ID09IC0xCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCAhaXNfdXBwZXJfYm91bmQoaSkgJiYgKHQgPSAtR1tpXSkgPiBHbWF4MyApICAvLyBkID0gKzEKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHbWF4MyA9IHQ7CisgICAgICAgICAgICAgICAgR21heDNfaWR4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCAhaXNfbG93ZXJfYm91bmQoaSkgJiYgKHQgPSBHW2ldKSA+IEdtYXg0ICkgIC8vIGQgPSAtMQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEdtYXg0ID0gdDsKKyAgICAgICAgICAgICAgICBHbWF4NF9pZHggPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIE1BWChHbWF4MSArIEdtYXgyLCBHbWF4MyArIEdtYXg0KSA8IGVwcyApCisgICAgICAgIHJldHVybiAxOworCisgICAgaWYoIEdtYXgxICsgR21heDIgPiBHbWF4MyArIEdtYXg0ICkKKyAgICB7CisgICAgICAgIG91dF9pID0gR21heDFfaWR4OworICAgICAgICBvdXRfaiA9IEdtYXgyX2lkeDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgb3V0X2kgPSBHbWF4M19pZHg7CisgICAgICAgIG91dF9qID0gR21heDRfaWR4OworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworCit2b2lkCitDdlNWTVNvbHZlcjo6Y2FsY19yaG9fbnVfc3ZtKCBkb3VibGUmIHJobywgZG91YmxlJiByICkKK3sKKyAgICBpbnQgbnJfZnJlZTEgPSAwLCBucl9mcmVlMiA9IDA7CisgICAgZG91YmxlIHViMSA9IERCTF9NQVgsIHViMiA9IERCTF9NQVg7CisgICAgZG91YmxlIGxiMSA9IC1EQkxfTUFYLCBsYjIgPSAtREJMX01BWDsKKyAgICBkb3VibGUgc3VtX2ZyZWUxID0gMCwgc3VtX2ZyZWUyID0gMDsKKyAgICBkb3VibGUgcjEsIHIyOworCisgICAgaW50IGk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgYWxwaGFfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgR19pID0gR1tpXTsKKyAgICAgICAgaWYoIHlbaV0gPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlzX2xvd2VyX2JvdW5kKGkpICkKKyAgICAgICAgICAgICAgICB1YjEgPSBNSU4oIHViMSwgR19pICk7CisgICAgICAgICAgICBlbHNlIGlmKCBpc191cHBlcl9ib3VuZChpKSApCisgICAgICAgICAgICAgICAgbGIxID0gTUFYKCBsYjEsIEdfaSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICsrbnJfZnJlZTE7CisgICAgICAgICAgICAgICAgc3VtX2ZyZWUxICs9IEdfaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBpc19sb3dlcl9ib3VuZChpKSApCisgICAgICAgICAgICAgICAgdWIyID0gTUlOKCB1YjIsIEdfaSApOworICAgICAgICAgICAgZWxzZSBpZiggaXNfdXBwZXJfYm91bmQoaSkgKQorICAgICAgICAgICAgICAgIGxiMiA9IE1BWCggbGIyLCBHX2kgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICArK25yX2ZyZWUyOworICAgICAgICAgICAgICAgIHN1bV9mcmVlMiArPSBHX2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByMSA9IG5yX2ZyZWUxID4gMCA/IHN1bV9mcmVlMS9ucl9mcmVlMSA6ICh1YjEgKyBsYjEpKjAuNTsKKyAgICByMiA9IG5yX2ZyZWUyID4gMCA/IHN1bV9mcmVlMi9ucl9mcmVlMiA6ICh1YjIgKyBsYjIpKjAuNTsKKworICAgIHJobyA9IChyMSAtIHIyKSowLjU7CisgICAgciA9IChyMSArIHIyKSowLjU7Cit9CisKKworLyoKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gY29uc3RydWN0IGFuZCBzb2x2ZSB2YXJpb3VzIGZvcm11bGF0aW9ucyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworKi8KKworYm9vbCBDdlNWTVNvbHZlcjo6c29sdmVfY19zdmMoIGludCBfc2FtcGxlX2NvdW50LCBpbnQgX3Zhcl9jb3VudCwgY29uc3QgZmxvYXQqKiBfc2FtcGxlcywgc2NoYXIqIF95LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfQ3AsIGRvdWJsZSBfQ24sIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTVk1LZXJuZWwqIF9rZXJuZWwsIGRvdWJsZSogX2FscGhhLCBDdlNWTVNvbHV0aW9uSW5mbyYgX3NpICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCAhY3JlYXRlKCBfc2FtcGxlX2NvdW50LCBfdmFyX2NvdW50LCBfc2FtcGxlcywgX3ksIF9zYW1wbGVfY291bnQsCisgICAgICAgICAgICAgICAgIF9hbHBoYSwgX0NwLCBfQ24sIF9zdG9yYWdlLCBfa2VybmVsLCAmQ3ZTVk1Tb2x2ZXI6OmdldF9yb3dfc3ZjLAorICAgICAgICAgICAgICAgICAmQ3ZTVk1Tb2x2ZXI6OnNlbGVjdF93b3JraW5nX3NldCwgJkN2U1ZNU29sdmVyOjpjYWxjX3JobyApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgYWxwaGFbaV0gPSAwOworICAgICAgICBiW2ldID0gLTE7CisgICAgfQorCisgICAgaWYoICFzb2x2ZV9nZW5lcmljKCBfc2kgKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgYWxwaGFbaV0gKj0geVtpXTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ3ZTVk1Tb2x2ZXI6OnNvbHZlX251X3N2YyggaW50IF9zYW1wbGVfY291bnQsIGludCBfdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIF9zYW1wbGVzLCBzY2hhciogX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsIEN2U1ZNS2VybmVsKiBfa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIF9hbHBoYSwgQ3ZTVk1Tb2x1dGlvbkluZm8mIF9zaSApCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bV9wb3MsIHN1bV9uZWcsIGludl9yOworCisgICAgaWYoICFjcmVhdGUoIF9zYW1wbGVfY291bnQsIF92YXJfY291bnQsIF9zYW1wbGVzLCBfeSwgX3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgX2FscGhhLCAxLiwgMS4sIF9zdG9yYWdlLCBfa2VybmVsLCAmQ3ZTVk1Tb2x2ZXI6OmdldF9yb3dfc3ZjLAorICAgICAgICAgICAgICAgICAmQ3ZTVk1Tb2x2ZXI6OnNlbGVjdF93b3JraW5nX3NldF9udV9zdm0sICZDdlNWTVNvbHZlcjo6Y2FsY19yaG9fbnVfc3ZtICkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHN1bV9wb3MgPSBrZXJuZWwtPnBhcmFtcy0+bnUgKiBzYW1wbGVfY291bnQgKiAwLjU7CisgICAgc3VtX25lZyA9IGtlcm5lbC0+cGFyYW1zLT5udSAqIHNhbXBsZV9jb3VudCAqIDAuNTsKKworICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBpZiggeVtpXSA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBhbHBoYVtpXSA9IE1JTigxLjAsIHN1bV9wb3MpOworICAgICAgICAgICAgc3VtX3BvcyAtPSBhbHBoYVtpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGFscGhhW2ldID0gTUlOKDEuMCwgc3VtX25lZyk7CisgICAgICAgICAgICBzdW1fbmVnIC09IGFscGhhW2ldOworICAgICAgICB9CisgICAgICAgIGJbaV0gPSAwOworICAgIH0KKworICAgIGlmKCAhc29sdmVfZ2VuZXJpYyggX3NpICkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludl9yID0gMS4vX3NpLnI7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICBhbHBoYVtpXSAqPSB5W2ldKmludl9yOworCisgICAgX3NpLnJobyAqPSBpbnZfcjsKKyAgICBfc2kub2JqICo9IChpbnZfcippbnZfcik7CisgICAgX3NpLnVwcGVyX2JvdW5kX3AgPSBpbnZfcjsKKyAgICBfc2kudXBwZXJfYm91bmRfbiA9IGludl9yOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDdlNWTVNvbHZlcjo6c29sdmVfb25lX2NsYXNzKCBpbnQgX3NhbXBsZV9jb3VudCwgaW50IF92YXJfY291bnQsIGNvbnN0IGZsb2F0KiogX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsIEN2U1ZNS2VybmVsKiBfa2VybmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUqIF9hbHBoYSwgQ3ZTVk1Tb2x1dGlvbkluZm8mIF9zaSApCit7CisgICAgaW50IGksIG47CisgICAgZG91YmxlIG51ID0gX2tlcm5lbC0+cGFyYW1zLT5udTsKKworICAgIGlmKCAhY3JlYXRlKCBfc2FtcGxlX2NvdW50LCBfdmFyX2NvdW50LCBfc2FtcGxlcywgMCwgX3NhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgX2FscGhhLCAxLiwgMS4sIF9zdG9yYWdlLCBfa2VybmVsLCAmQ3ZTVk1Tb2x2ZXI6OmdldF9yb3dfb25lX2NsYXNzLAorICAgICAgICAgICAgICAgICAmQ3ZTVk1Tb2x2ZXI6OnNlbGVjdF93b3JraW5nX3NldCwgJkN2U1ZNU29sdmVyOjpjYWxjX3JobyApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB5ID0gKHNjaGFyKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc2FtcGxlX2NvdW50KnNpemVvZih5WzBdKSApOworICAgIG4gPSBjdlJvdW5kKCBudSpzYW1wbGVfY291bnQgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICB5W2ldID0gMTsKKyAgICAgICAgYltpXSA9IDA7CisgICAgICAgIGFscGhhW2ldID0gaSA8IG4gPyAxIDogMDsKKyAgICB9CisKKyAgICBpZiggbiA8IHNhbXBsZV9jb3VudCApCisgICAgICAgIGFscGhhW25dID0gbnUgKiBzYW1wbGVfY291bnQgLSBuOworICAgIGVsc2UKKyAgICAgICAgYWxwaGFbbi0xXSA9IG51ICogc2FtcGxlX2NvdW50IC0gKG4tMSk7CisKKyAgICByZXR1cm4gc29sdmVfZ2VuZXJpYyhfc2kpOworfQorCisKK2Jvb2wgQ3ZTVk1Tb2x2ZXI6OnNvbHZlX2Vwc19zdnIoIGludCBfc2FtcGxlX2NvdW50LCBpbnQgX3Zhcl9jb3VudCwgY29uc3QgZmxvYXQqKiBfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBfeSwgQ3ZNZW1TdG9yYWdlKiBfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U1ZNS2VybmVsKiBfa2VybmVsLCBkb3VibGUqIF9hbHBoYSwgQ3ZTVk1Tb2x1dGlvbkluZm8mIF9zaSApCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIHAgPSBfa2VybmVsLT5wYXJhbXMtPnAsIEMgPSBfa2VybmVsLT5wYXJhbXMtPkM7CisKKyAgICBpZiggIWNyZWF0ZSggX3NhbXBsZV9jb3VudCwgX3Zhcl9jb3VudCwgX3NhbXBsZXMsIDAsCisgICAgICAgICAgICAgICAgIF9zYW1wbGVfY291bnQqMiwgMCwgQywgQywgX3N0b3JhZ2UsIF9rZXJuZWwsICZDdlNWTVNvbHZlcjo6Z2V0X3Jvd19zdnIsCisgICAgICAgICAgICAgICAgICZDdlNWTVNvbHZlcjo6c2VsZWN0X3dvcmtpbmdfc2V0LCAmQ3ZTVk1Tb2x2ZXI6OmNhbGNfcmhvICkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHkgPSAoc2NoYXIqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBzYW1wbGVfY291bnQqMipzaXplb2YoeVswXSkgKTsKKyAgICBhbHBoYSA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBhbHBoYV9jb3VudCpzaXplb2YoYWxwaGFbMF0pICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgYWxwaGFbaV0gPSAwOworICAgICAgICBiW2ldID0gcCAtIF95W2ldOworICAgICAgICB5W2ldID0gMTsKKworICAgICAgICBhbHBoYVtpK3NhbXBsZV9jb3VudF0gPSAwOworICAgICAgICBiW2krc2FtcGxlX2NvdW50XSA9IHAgKyBfeVtpXTsKKyAgICAgICAgeVtpK3NhbXBsZV9jb3VudF0gPSAtMTsKKyAgICB9CisKKyAgICBpZiggIXNvbHZlX2dlbmVyaWMoIF9zaSApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICBfYWxwaGFbaV0gPSBhbHBoYVtpXSAtIGFscGhhW2krc2FtcGxlX2NvdW50XTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgQ3ZTVk1Tb2x2ZXI6OnNvbHZlX251X3N2ciggaW50IF9zYW1wbGVfY291bnQsIGludCBfdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIF9zYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogX3ksIEN2TWVtU3RvcmFnZSogX3N0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U1ZNS2VybmVsKiBfa2VybmVsLCBkb3VibGUqIF9hbHBoYSwgQ3ZTVk1Tb2x1dGlvbkluZm8mIF9zaSApCit7CisgICAgaW50IGk7CisgICAgZG91YmxlIEMgPSBfa2VybmVsLT5wYXJhbXMtPkMsIHN1bTsKKworICAgIGlmKCAhY3JlYXRlKCBfc2FtcGxlX2NvdW50LCBfdmFyX2NvdW50LCBfc2FtcGxlcywgMCwKKyAgICAgICAgICAgICAgICAgX3NhbXBsZV9jb3VudCoyLCAwLCAxLiwgMS4sIF9zdG9yYWdlLCBfa2VybmVsLCAmQ3ZTVk1Tb2x2ZXI6OmdldF9yb3dfc3ZyLAorICAgICAgICAgICAgICAgICAmQ3ZTVk1Tb2x2ZXI6OnNlbGVjdF93b3JraW5nX3NldF9udV9zdm0sICZDdlNWTVNvbHZlcjo6Y2FsY19yaG9fbnVfc3ZtICkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHkgPSAoc2NoYXIqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBzYW1wbGVfY291bnQqMipzaXplb2YoeVswXSkgKTsKKyAgICBhbHBoYSA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBhbHBoYV9jb3VudCpzaXplb2YoYWxwaGFbMF0pICk7CisgICAgc3VtID0gQyAqIF9rZXJuZWwtPnBhcmFtcy0+bnUgKiBzYW1wbGVfY291bnQgKiAwLjU7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgYWxwaGFbaV0gPSBhbHBoYVtpICsgc2FtcGxlX2NvdW50XSA9IE1JTihzdW0sIEMpOworICAgICAgICBzdW0gLT0gYWxwaGFbaV07CisKKyAgICAgICAgYltpXSA9IC1feVtpXTsKKyAgICAgICAgeVtpXSA9IDE7CisKKyAgICAgICAgYltpICsgc2FtcGxlX2NvdW50XSA9IF95W2ldOworICAgICAgICB5W2kgKyBzYW1wbGVfY291bnRdID0gLTE7CisgICAgfQorCisgICAgaWYoICFzb2x2ZV9nZW5lcmljKCBfc2kgKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgX2FscGhhW2ldID0gYWxwaGFbaV0gLSBhbHBoYVtpK3NhbXBsZV9jb3VudF07CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ3ZTVk06OkN2U1ZNKCkKK3sKKyAgICBkZWNpc2lvbl9mdW5jID0gMDsKKyAgICBjbGFzc19sYWJlbHMgPSAwOworICAgIGNsYXNzX3dlaWdodHMgPSAwOworICAgIHN0b3JhZ2UgPSAwOworICAgIHZhcl9pZHggPSAwOworICAgIGtlcm5lbCA9IDA7CisgICAgc29sdmVyID0gMDsKKyAgICBkZWZhdWx0X21vZGVsX25hbWUgPSAibXlfc3ZtIjsKKworICAgIGNsZWFyKCk7Cit9CisKKworQ3ZTVk06On5DdlNWTSgpCit7CisgICAgY2xlYXIoKTsKK30KKworCit2b2lkIEN2U1ZNOjpjbGVhcigpCit7CisgICAgY3ZGcmVlKCAmZGVjaXNpb25fZnVuYyApOworICAgIGN2UmVsZWFzZU1hdCggJmNsYXNzX2xhYmVscyApOworICAgIGN2UmVsZWFzZU1hdCggJmNsYXNzX3dlaWdodHMgKTsKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmc3RvcmFnZSApOworICAgIGN2UmVsZWFzZU1hdCggJnZhcl9pZHggKTsKKyAgICBkZWxldGUga2VybmVsOworICAgIGRlbGV0ZSBzb2x2ZXI7CisgICAga2VybmVsID0gMDsKKyAgICBzb2x2ZXIgPSAwOworICAgIHZhcl9hbGwgPSAwOworICAgIHN2ID0gMDsKKyAgICBzdl90b3RhbCA9IDA7Cit9CisKKworQ3ZTVk06OkN2U1ZNKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgIGNvbnN0IEN2TWF0KiBfdmFyX2lkeCwgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LCBDdlNWTVBhcmFtcyBfcGFyYW1zICkKK3sKKyAgICBkZWNpc2lvbl9mdW5jID0gMDsKKyAgICBjbGFzc19sYWJlbHMgPSAwOworICAgIGNsYXNzX3dlaWdodHMgPSAwOworICAgIHN0b3JhZ2UgPSAwOworICAgIHZhcl9pZHggPSAwOworICAgIGtlcm5lbCA9IDA7CisgICAgc29sdmVyID0gMDsKKyAgICBkZWZhdWx0X21vZGVsX25hbWUgPSAibXlfc3ZtIjsKKworICAgIHRyYWluKCBfdHJhaW5fZGF0YSwgX3Jlc3BvbnNlcywgX3Zhcl9pZHgsIF9zYW1wbGVfaWR4LCBfcGFyYW1zICk7Cit9CisKKworaW50IEN2U1ZNOjpnZXRfc3VwcG9ydF92ZWN0b3JfY291bnQoKSBjb25zdAoreworICAgIHJldHVybiBzdl90b3RhbDsKK30KKworCitjb25zdCBmbG9hdCogQ3ZTVk06OmdldF9zdXBwb3J0X3ZlY3RvcihpbnQgaSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3YgJiYgKHVuc2lnbmVkKWkgPCAodW5zaWduZWQpc3ZfdG90YWwgPyBzdltpXSA6IDA7Cit9CisKKworYm9vbCBDdlNWTTo6c2V0X3BhcmFtcyggY29uc3QgQ3ZTVk1QYXJhbXMmIF9wYXJhbXMgKQoreworICAgIGJvb2wgb2sgPSBmYWxzZTsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTVk06OnNldF9wYXJhbXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQga2VybmVsX3R5cGUsIHN2bV90eXBlOworCisgICAgcGFyYW1zID0gX3BhcmFtczsKKworICAgIGtlcm5lbF90eXBlID0gcGFyYW1zLmtlcm5lbF90eXBlOworICAgIHN2bV90eXBlID0gcGFyYW1zLnN2bV90eXBlOworCisgICAgaWYoIGtlcm5lbF90eXBlICE9IExJTkVBUiAmJiBrZXJuZWxfdHlwZSAhPSBQT0xZICYmCisgICAgICAgIGtlcm5lbF90eXBlICE9IFNJR01PSUQgJiYga2VybmVsX3R5cGUgIT0gUkJGICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlVua25vd24vdW5zdXBwb3J0ZWQga2VybmVsIHR5cGUiICk7CisKKyAgICBpZigga2VybmVsX3R5cGUgPT0gTElORUFSICkKKyAgICAgICAgcGFyYW1zLmdhbW1hID0gMTsKKyAgICBlbHNlIGlmKCBwYXJhbXMuZ2FtbWEgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiZ2FtbWEgcGFyYW1ldGVyIG9mIHRoZSBrZXJuZWwgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCBrZXJuZWxfdHlwZSAhPSBTSUdNT0lEICYmIGtlcm5lbF90eXBlICE9IFBPTFkgKQorICAgICAgICBwYXJhbXMuY29lZjAgPSAwOworICAgIGVsc2UgaWYoIHBhcmFtcy5jb2VmMCA8IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBrZXJuZWwgcGFyYW1ldGVyIDxjb2VmMD4gbXVzdCBiZSBwb3NpdGl2ZSBvciB6ZXJvIiApOworCisgICAgaWYoIGtlcm5lbF90eXBlICE9IFBPTFkgKQorICAgICAgICBwYXJhbXMuZGVncmVlID0gMDsKKyAgICBlbHNlIGlmKCBwYXJhbXMuZGVncmVlIDw9IDAgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBrZXJuZWwgcGFyYW1ldGVyIDxkZWdyZWU+IG11c3QgYmUgcG9zaXRpdmUiICk7CisKKyAgICBpZiggc3ZtX3R5cGUgIT0gQ19TVkMgJiYgc3ZtX3R5cGUgIT0gTlVfU1ZDICYmCisgICAgICAgIHN2bV90eXBlICE9IE9ORV9DTEFTUyAmJiBzdm1fdHlwZSAhPSBFUFNfU1ZSICYmCisgICAgICAgIHN2bV90eXBlICE9IE5VX1NWUiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJVbmtub3duL3Vuc3VwcG9ydGVkIFNWTSB0eXBlIiApOworCisgICAgaWYoIHN2bV90eXBlID09IE9ORV9DTEFTUyB8fCBzdm1fdHlwZSA9PSBOVV9TVkMgKQorICAgICAgICBwYXJhbXMuQyA9IDA7CisgICAgZWxzZSBpZiggcGFyYW1zLkMgPD0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAiVGhlIHBhcmFtZXRlciBDIG11c3QgYmUgcG9zaXRpdmUiICk7CisKKyAgICBpZiggc3ZtX3R5cGUgPT0gQ19TVkMgfHwgc3ZtX3R5cGUgPT0gRVBTX1NWUiApCisgICAgICAgIHBhcmFtcy5udSA9IDA7CisgICAgZWxzZSBpZiggcGFyYW1zLm51IDw9IDAgfHwgcGFyYW1zLm51ID49IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlRoZSBwYXJhbWV0ZXIgbnUgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEiICk7CisKKyAgICBpZiggc3ZtX3R5cGUgIT0gRVBTX1NWUiApCisgICAgICAgIHBhcmFtcy5wID0gMDsKKyAgICBlbHNlIGlmKCBwYXJhbXMucCA8PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c091dE9mUmFuZ2UsICJUaGUgcGFyYW1ldGVyIHAgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCBzdm1fdHlwZSAhPSBDX1NWQyApCisgICAgICAgIHBhcmFtcy5jbGFzc193ZWlnaHRzID0gMDsKKworICAgIHBhcmFtcy50ZXJtX2NyaXQgPSBjdkNoZWNrVGVybUNyaXRlcmlhKCBwYXJhbXMudGVybV9jcml0LCBEQkxfRVBTSUxPTiwgSU5UX01BWCApOworICAgIHBhcmFtcy50ZXJtX2NyaXQuZXBzaWxvbiA9IE1BWCggcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uLCBEQkxfRVBTSUxPTiApOworICAgIG9rID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gb2s7Cit9CisKKworCit2b2lkIEN2U1ZNOjpjcmVhdGVfa2VybmVsKCkKK3sKKyAgICBrZXJuZWwgPSBuZXcgQ3ZTVk1LZXJuZWwoJnBhcmFtcywwKTsKK30KKworCit2b2lkIEN2U1ZNOjpjcmVhdGVfc29sdmVyKCApCit7CisgICAgc29sdmVyID0gbmV3IEN2U1ZNU29sdmVyOworfQorCisKKy8vIHN3aXRjaGluZyBmdW5jdGlvbgorYm9vbCBDdlNWTTo6dHJhaW4xKCBpbnQgc2FtcGxlX2NvdW50LCBpbnQgdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIF9yZXNwb25zZXMsIGRvdWJsZSBDcCwgZG91YmxlIENuLAorICAgICAgICAgICAgICAgICAgICBDdk1lbVN0b3JhZ2UqIF9zdG9yYWdlLCBkb3VibGUqIGFscGhhLCBkb3VibGUmIHJobyApCit7CisgICAgYm9vbCBvayA9IGZhbHNlOworCisgICAgLy9DVl9GVU5DTkFNRSggIkN2U1ZNOjp0cmFpbjEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNWTVNvbHV0aW9uSW5mbyBzaTsKKyAgICBpbnQgc3ZtX3R5cGUgPSBwYXJhbXMuc3ZtX3R5cGU7CisKKyAgICBzaS5yaG8gPSAwOworCisgICAgb2sgPSBzdm1fdHlwZSA9PSBDX1NWQyA/IHNvbHZlci0+c29sdmVfY19zdmMoIHNhbXBsZV9jb3VudCwgdmFyX2NvdW50LCBzYW1wbGVzLCAoc2NoYXIqKV9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENwLCBDbiwgX3N0b3JhZ2UsIGtlcm5lbCwgYWxwaGEsIHNpICkgOgorICAgICAgICAgc3ZtX3R5cGUgPT0gTlVfU1ZDID8gc29sdmVyLT5zb2x2ZV9udV9zdmMoIHNhbXBsZV9jb3VudCwgdmFyX2NvdW50LCBzYW1wbGVzLCAoc2NoYXIqKV9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3N0b3JhZ2UsIGtlcm5lbCwgYWxwaGEsIHNpICkgOgorICAgICAgICAgc3ZtX3R5cGUgPT0gT05FX0NMQVNTID8gc29sdmVyLT5zb2x2ZV9vbmVfY2xhc3MoIHNhbXBsZV9jb3VudCwgdmFyX2NvdW50LCBzYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zdG9yYWdlLCBrZXJuZWwsIGFscGhhLCBzaSApIDoKKyAgICAgICAgIHN2bV90eXBlID09IEVQU19TVlIgPyBzb2x2ZXItPnNvbHZlX2Vwc19zdnIoIHNhbXBsZV9jb3VudCwgdmFyX2NvdW50LCBzYW1wbGVzLCAoZmxvYXQqKV9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RvcmFnZSwga2VybmVsLCBhbHBoYSwgc2kgKSA6CisgICAgICAgICBzdm1fdHlwZSA9PSBOVV9TVlIgPyBzb2x2ZXItPnNvbHZlX251X3N2ciggc2FtcGxlX2NvdW50LCB2YXJfY291bnQsIHNhbXBsZXMsIChmbG9hdCopX3Jlc3BvbnNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc3RvcmFnZSwga2VybmVsLCBhbHBoYSwgc2kgKSA6IGZhbHNlOworCisgICAgcmhvID0gc2kucmhvOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiBvazsKK30KKworCitib29sIEN2U1ZNOjpkb190cmFpbiggaW50IHN2bV90eXBlLCBpbnQgc2FtcGxlX2NvdW50LCBpbnQgdmFyX2NvdW50LCBjb25zdCBmbG9hdCoqIHNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiByZXNwb25zZXMsIEN2TWVtU3RvcmFnZSogdGVtcF9zdG9yYWdlLCBkb3VibGUqIGFscGhhICkKK3sKKyAgICBib29sIG9rID0gZmFsc2U7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2U1ZNOjpkb190cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2U1ZNRGVjaXNpb25GdW5jKiBkZiA9IDA7CisgICAgY29uc3QgaW50IHNhbXBsZV9zaXplID0gdmFyX2NvdW50KnNpemVvZihzYW1wbGVzWzBdWzBdKTsKKyAgICBpbnQgaSwgaiwgazsKKworICAgIGlmKCBzdm1fdHlwZSA9PSBPTkVfQ0xBU1MgfHwgc3ZtX3R5cGUgPT0gRVBTX1NWUiB8fCBzdm1fdHlwZSA9PSBOVV9TVlIgKQorICAgIHsKKyAgICAgICAgaW50IHN2X2NvdW50ID0gMDsKKworICAgICAgICBDVl9DQUxMKCBkZWNpc2lvbl9mdW5jID0gZGYgPQorICAgICAgICAgICAgKEN2U1ZNRGVjaXNpb25GdW5jKiljdkFsbG9jKCBzaXplb2YoZGZbMF0pICkpOworCisgICAgICAgIGRmLT5yaG8gPSAwOworICAgICAgICBpZiggIXRyYWluMSggc2FtcGxlX2NvdW50LCB2YXJfY291bnQsIHNhbXBsZXMsIHN2bV90eXBlID09IE9ORV9DTEFTUyA/IDAgOgorICAgICAgICAgICAgcmVzcG9uc2VzLT5kYXRhLmksIDAsIDAsIHRlbXBfc3RvcmFnZSwgYWxwaGEsIGRmLT5yaG8gKSkKKyAgICAgICAgICAgIEVYSVQ7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHN2X2NvdW50ICs9IGZhYnMoYWxwaGFbaV0pID4gMDsKKworICAgICAgICBzdl90b3RhbCA9IGRmLT5zdl9jb3VudCA9IHN2X2NvdW50OworICAgICAgICBDVl9DQUxMKCBkZi0+YWxwaGEgPSAoZG91YmxlKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc3ZfY291bnQqc2l6ZW9mKGRmLT5hbHBoYVswXSkpICk7CisgICAgICAgIENWX0NBTEwoIHN2ID0gKGZsb2F0KiopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIHN2X2NvdW50KnNpemVvZihzdlswXSkpKTsKKworICAgICAgICBmb3IoIGkgPSBrID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGZhYnMoYWxwaGFbaV0pID4gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggc3Zba10gPSAoZmxvYXQqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLCBzYW1wbGVfc2l6ZSApKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoIHN2W2tdLCBzYW1wbGVzW2ldLCBzYW1wbGVfc2l6ZSApOworICAgICAgICAgICAgICAgIGRmLT5hbHBoYVtrKytdID0gYWxwaGFbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaW50IGNsYXNzX2NvdW50ID0gY2xhc3NfbGFiZWxzLT5jb2xzOworICAgICAgICBpbnQqIHN2X3RhYiA9IDA7CisgICAgICAgIGNvbnN0IGZsb2F0KiogdGVtcF9zYW1wbGVzID0gMDsKKyAgICAgICAgaW50KiBjbGFzc19yYW5nZXMgPSAwOworICAgICAgICBzY2hhciogdGVtcF95ID0gMDsKKyAgICAgICAgYXNzZXJ0KCBzdm1fdHlwZSA9PSBDdlNWTTo6Q19TVkMgfHwgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWQyApOworCisgICAgICAgIGlmKCBzdm1fdHlwZSA9PSBDdlNWTTo6Q19TVkMgJiYgcGFyYW1zLmNsYXNzX3dlaWdodHMgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBDdk1hdCogY3cgPSBwYXJhbXMuY2xhc3Nfd2VpZ2h0czsKKworICAgICAgICAgICAgaWYoICFDVl9JU19NQVQoY3cpIHx8IGN3LT5jb2xzICE9IDEgJiYgY3ctPnJvd3MgIT0gMSB8fAorICAgICAgICAgICAgICAgIGN3LT5yb3dzICsgY3ctPmNvbHMgLSAxICE9IGNsYXNzX2NvdW50IHx8CisgICAgICAgICAgICAgICAgQ1ZfTUFUX1RZUEUoY3ctPnR5cGUpICE9IENWXzMyRkMxICYmIENWX01BVF9UWVBFKGN3LT50eXBlKSAhPSBDVl82NEZDMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgInBhcmFtcy5jbGFzc193ZWlnaHRzIG11c3QgYmUgMWQgZmxvYXRpbmctcG9pbnQgdmVjdG9yICIKKyAgICAgICAgICAgICAgICAgICAgImNvbnRhaW5pbmcgYXMgbWFueSBlbGVtZW50cyBhcyB0aGUgbnVtYmVyIG9mIGNsYXNzZXMiICk7CisKKyAgICAgICAgICAgIENWX0NBTEwoIGNsYXNzX3dlaWdodHMgPSBjdkNyZWF0ZU1hdCggY3ctPnJvd3MsIGN3LT5jb2xzLCBDVl82NEYgKSk7CisgICAgICAgICAgICBDVl9DQUxMKCBjdkNvbnZlcnQoIGN3LCBjbGFzc193ZWlnaHRzICkpOworICAgICAgICAgICAgQ1ZfQ0FMTCggY3ZTY2FsZSggY2xhc3Nfd2VpZ2h0cywgY2xhc3Nfd2VpZ2h0cywgcGFyYW1zLkMgKSk7CisgICAgICAgIH0KKworICAgICAgICBDVl9DQUxMKCBkZWNpc2lvbl9mdW5jID0gZGYgPSAoQ3ZTVk1EZWNpc2lvbkZ1bmMqKWN2QWxsb2MoCisgICAgICAgICAgICAoY2xhc3NfY291bnQqKGNsYXNzX2NvdW50LTEpLzIpKnNpemVvZihkZlswXSkpKTsKKworICAgICAgICBDVl9DQUxMKCBzdl90YWIgPSAoaW50Kiljdk1lbVN0b3JhZ2VBbGxvYyggdGVtcF9zdG9yYWdlLCBzYW1wbGVfY291bnQqc2l6ZW9mKHN2X3RhYlswXSkgKSk7CisgICAgICAgIG1lbXNldCggc3ZfdGFiLCAwLCBzYW1wbGVfY291bnQqc2l6ZW9mKHN2X3RhYlswXSkgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY2xhc3NfcmFuZ2VzID0gKGludCopY3ZNZW1TdG9yYWdlQWxsb2MoIHRlbXBfc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xhc3NfY291bnQgKyAxKSpzaXplb2YoY2xhc3NfcmFuZ2VzWzBdKSkpOworICAgICAgICBDVl9DQUxMKCB0ZW1wX3NhbXBsZXMgPSAoY29uc3QgZmxvYXQqKiljdk1lbVN0b3JhZ2VBbGxvYyggdGVtcF9zdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZV9jb3VudCpzaXplb2YodGVtcF9zYW1wbGVzWzBdKSkpOworICAgICAgICBDVl9DQUxMKCB0ZW1wX3kgPSAoc2NoYXIqKWN2TWVtU3RvcmFnZUFsbG9jKCB0ZW1wX3N0b3JhZ2UsIHNhbXBsZV9jb3VudCkpOworCisgICAgICAgIGNsYXNzX3Jhbmdlc1tjbGFzc19jb3VudF0gPSAwOworICAgICAgICBjdlNvcnRTYW1wbGVzQnlDbGFzc2VzKCBzYW1wbGVzLCByZXNwb25zZXMsIGNsYXNzX3JhbmdlcywgMCApOworICAgICAgICAvL2NoZWNrIHRoYXQgd2hpbGUgY3Jvc3MtdmFsaWRhdGlvbiB0aGVyZSB3ZXJlIHRoZSBzYW1wbGVzIGZyb20gYWxsIHRoZSBjbGFzc2VzCisgICAgICAgIGlmKCBjbGFzc19yYW5nZXNbY2xhc3NfY291bnRdIDw9IDAgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIldoaWxlIGNyb3NzLXZhbGlkYXRpb24gb25lIG9yIG1vcmUgb2YgdGhlIGNsYXNzZXMgaGF2ZSAiCisgICAgICAgICAgICAiYmVlbiBmZWxsIG91dCBvZiB0aGUgc2FtcGxlLiBUcnkgdG8gZW5sYXJnZSA8Q3ZTVk1QYXJhbXM6OmtfZm9sZD4iICk7CisKKyAgICAgICAgaWYoIHN2bV90eXBlID09IE5VX1NWQyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIG51IGlzIGZlYXNpYmxlCisgICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBjbGFzc19jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY2kgPSBjbGFzc19yYW5nZXNbaSsxXSAtIGNsYXNzX3Jhbmdlc1tpXTsKKyAgICAgICAgICAgICAgICBmb3IoIGogPSBpKzE7IGo8IGNsYXNzX2NvdW50OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNqID0gY2xhc3NfcmFuZ2VzW2orMV0gLSBjbGFzc19yYW5nZXNbal07CisgICAgICAgICAgICAgICAgICAgIGlmKCBwYXJhbXMubnUqKGNpICsgY2opKjAuNSA+IE1JTiggY2ksIGNqICkgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAhISFUT0RPISEhIGFkZCBzb21lIGRpYWdub3N0aWMKKyAgICAgICAgICAgICAgICAgICAgICAgIEVYSVQ7IC8vIGV4aXQgaW1tZWRpYXRlbHk7IHdpbGwgcmVsZWFzZSB0aGUgbW9kZWwgYW5kIHJldHVybiBOVUxMIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHRyYWluIG4qKG4tMSkvMiBjbGFzc2lmaWVycworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY2xhc3NfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IGkrMTsgaiA8IGNsYXNzX2NvdW50OyBqKyssIGRmKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBzaSA9IGNsYXNzX3Jhbmdlc1tpXSwgY2kgPSBjbGFzc19yYW5nZXNbaSsxXSAtIHNpOworICAgICAgICAgICAgICAgIGludCBzaiA9IGNsYXNzX3Jhbmdlc1tqXSwgY2ogPSBjbGFzc19yYW5nZXNbaisxXSAtIHNqOworICAgICAgICAgICAgICAgIGRvdWJsZSBDcCA9IHBhcmFtcy5DLCBDbiA9IENwOworICAgICAgICAgICAgICAgIGludCBrMSA9IDAsIHN2X2NvdW50ID0gMDsKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjaTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBfc2FtcGxlc1trXSA9IHNhbXBsZXNbc2kgKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF95W2tdID0gMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY2o7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0ZW1wX3NhbXBsZXNbY2kgKyBrXSA9IHNhbXBsZXNbc2ogKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcF95W2NpICsga10gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggY2xhc3Nfd2VpZ2h0cyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBDcCA9IGNsYXNzX3dlaWdodHMtPmRhdGEuZGJbaV07CisgICAgICAgICAgICAgICAgICAgIENuID0gY2xhc3Nfd2VpZ2h0cy0+ZGF0YS5kYltqXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggIXRyYWluMSggY2kgKyBjaiwgdmFyX2NvdW50LCB0ZW1wX3NhbXBsZXMsIHRlbXBfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3AsIENuLCB0ZW1wX3N0b3JhZ2UsIGFscGhhLCBkZi0+cmhvICkpCisgICAgICAgICAgICAgICAgICAgIEVYSVQ7CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY2kgKyBjajsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgc3ZfY291bnQgKz0gZmFicyhhbHBoYVtrXSkgPiAwOworCisgICAgICAgICAgICAgICAgZGYtPnN2X2NvdW50ID0gc3ZfY291bnQ7CisKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBkZi0+YWxwaGEgPSAoZG91YmxlKiljdk1lbVN0b3JhZ2VBbGxvYyggdGVtcF9zdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfY291bnQqc2l6ZW9mKGRmLT5hbHBoYVswXSkpKTsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBkZi0+c3ZfaW5kZXggPSAoaW50Kiljdk1lbVN0b3JhZ2VBbGxvYyggdGVtcF9zdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfY291bnQqc2l6ZW9mKGRmLT5zdl9pbmRleFswXSkpKTsKKworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBjaTsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBmYWJzKGFscGhhW2tdKSA+IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdl90YWJbc2kgKyBrXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi0+c3ZfaW5kZXhbazFdID0gc2kgKyBrOworICAgICAgICAgICAgICAgICAgICAgICAgZGYtPmFscGhhW2sxKytdID0gYWxwaGFba107CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgY2o7IGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZmFicyhhbHBoYVtjaSArIGtdKSA+IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdl90YWJbc2ogKyBrXSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkZi0+c3ZfaW5kZXhbazFdID0gc2ogKyBrOworICAgICAgICAgICAgICAgICAgICAgICAgZGYtPmFscGhhW2sxKytdID0gYWxwaGFbY2kgKyBrXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFsbG9jYXRlIHN1cHBvcnQgdmVjdG9ycyBhbmQgaW5pdGlhbGl6ZSBzdl90YWIKKyAgICAgICAgZm9yKCBpID0gMCwgayA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBzdl90YWJbaV0gKQorICAgICAgICAgICAgICAgIHN2X3RhYltpXSA9ICsrazsKKyAgICAgICAgfQorCisgICAgICAgIHN2X3RvdGFsID0gazsKKyAgICAgICAgQ1ZfQ0FMTCggc3YgPSAoZmxvYXQqKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc3ZfdG90YWwqc2l6ZW9mKHN2WzBdKSkpOworCisgICAgICAgIGZvciggaSA9IDAsIGsgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc3ZfdGFiW2ldICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9DQUxMKCBzdltrXSA9IChmbG9hdCopY3ZNZW1TdG9yYWdlQWxsb2MoIHN0b3JhZ2UsIHNhbXBsZV9zaXplICkpOworICAgICAgICAgICAgICAgIG1lbWNweSggc3Zba10sIHNhbXBsZXNbaV0sIHNhbXBsZV9zaXplICk7CisgICAgICAgICAgICAgICAgaysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGYgPSAoQ3ZTVk1EZWNpc2lvbkZ1bmMqKWRlY2lzaW9uX2Z1bmM7CisKKyAgICAgICAgLy8gc2V0IHN2IHBvaW50ZXJzCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjbGFzc19jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gaSsxOyBqIDwgY2xhc3NfY291bnQ7IGorKywgZGYrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBrID0gMDsgayA8IGRmLT5zdl9jb3VudDsgaysrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRmLT5zdl9pbmRleFtrXSA9IHN2X3RhYltkZi0+c3ZfaW5kZXhba11dLTE7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydCggKHVuc2lnbmVkKWRmLT5zdl9pbmRleFtrXSA8ICh1bnNpZ25lZClzdl90b3RhbCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG9rID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgQ3ZTVk06OnRyYWluKCBjb25zdCBDdk1hdCogX3RyYWluX2RhdGEsIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLAorICAgIGNvbnN0IEN2TWF0KiBfdmFyX2lkeCwgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LCBDdlNWTVBhcmFtcyBfcGFyYW1zICkKK3sKKyAgICBib29sIG9rID0gZmFsc2U7CisgICAgQ3ZNYXQqIHJlc3BvbnNlcyA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2UgPSAwOworICAgIGNvbnN0IGZsb2F0Kiogc2FtcGxlcyA9IDA7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2U1ZNOjp0cmFpbiIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBzdm1fdHlwZSwgc2FtcGxlX2NvdW50LCB2YXJfY291bnQsIHNhbXBsZV9zaXplOworICAgIGludCBibG9ja19zaXplID0gMSA8PCAxNjsKKyAgICBkb3VibGUqIGFscGhhOworCisgICAgY2xlYXIoKTsKKyAgICBDVl9DQUxMKCBzZXRfcGFyYW1zKCBfcGFyYW1zICkpOworCisgICAgc3ZtX3R5cGUgPSBfcGFyYW1zLnN2bV90eXBlOworCisgICAgLyogUHJlcGFyZSB0cmFpbmluZyBkYXRhIGFuZCByZWxhdGVkIHBhcmFtZXRlcnMgKi8KKyAgICBDVl9DQUxMKCBjdlByZXBhcmVUcmFpbkRhdGEoICJDdlNWTTo6dHJhaW4iLCBfdHJhaW5fZGF0YSwgQ1ZfUk9XX1NBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bV90eXBlICE9IEN2U1ZNOjpPTkVfQ0xBU1MgPyBfcmVzcG9uc2VzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bV90eXBlID09IEN2U1ZNOjpDX1NWQyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWQyA/IENWX1ZBUl9DQVRFR09SSUNBTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9WQVJfT1JERVJFRCwgX3Zhcl9pZHgsIF9zYW1wbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzYW1wbGVzLCAmc2FtcGxlX2NvdW50LCAmdmFyX2NvdW50LCAmdmFyX2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwb25zZXMsICZjbGFzc19sYWJlbHMsICZ2YXJfaWR4ICkpOworCisKKyAgICBzYW1wbGVfc2l6ZSA9IHZhcl9jb3VudCpzaXplb2Yoc2FtcGxlc1swXVswXSk7CisKKyAgICAvLyBtYWtlIHRoZSBzdG9yYWdlIGJsb2NrIHNpemUgbGFyZ2UgZW5vdWdoIHRvIGZpdCBhbGwKKyAgICAvLyB0aGUgdGVtcG9yYXJ5IHZlY3RvcnMgYW5kIG91dHB1dCBzdXBwb3J0IHZlY3RvcnMuCisgICAgYmxvY2tfc2l6ZSA9IE1BWCggYmxvY2tfc2l6ZSwgc2FtcGxlX2NvdW50KihpbnQpc2l6ZW9mKEN2U1ZNS2VybmVsUm93KSk7CisgICAgYmxvY2tfc2l6ZSA9IE1BWCggYmxvY2tfc2l6ZSwgc2FtcGxlX2NvdW50KjIqKGludClzaXplb2YoZG91YmxlKSArIDEwMjQgKTsKKyAgICBibG9ja19zaXplID0gTUFYKCBibG9ja19zaXplLCBzYW1wbGVfc2l6ZSoyICsgMTAyNCApOworCisgICAgQ1ZfQ0FMTCggc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZShibG9ja19zaXplKSk7CisgICAgQ1ZfQ0FMTCggdGVtcF9zdG9yYWdlID0gY3ZDcmVhdGVDaGlsZE1lbVN0b3JhZ2Uoc3RvcmFnZSkpOworICAgIENWX0NBTEwoIGFscGhhID0gKGRvdWJsZSopY3ZNZW1TdG9yYWdlQWxsb2ModGVtcF9zdG9yYWdlLCBzYW1wbGVfY291bnQqc2l6ZW9mKGRvdWJsZSkpKTsKKworICAgIGNyZWF0ZV9rZXJuZWwoKTsKKyAgICBjcmVhdGVfc29sdmVyKCk7CisKKyAgICBpZiggIWRvX3RyYWluKCBzdm1fdHlwZSwgc2FtcGxlX2NvdW50LCB2YXJfY291bnQsIHNhbXBsZXMsIHJlc3BvbnNlcywgdGVtcF9zdG9yYWdlLCBhbHBoYSApKQorICAgICAgICBFWElUOworCisgICAgb2sgPSB0cnVlOyAvLyBtb2RlbCBoYXMgYmVlbiB0cmFpbmVkIHN1Y2Nlc2Z1bGx5CisKKyAgICBfX0VORF9fOworCisgICAgZGVsZXRlIHNvbHZlcjsKKyAgICBzb2x2ZXIgPSAwOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZ0ZW1wX3N0b3JhZ2UgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZyZXNwb25zZXMgKTsKKyAgICBjdkZyZWUoICZzYW1wbGVzICk7CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgfHwgIW9rICkKKyAgICAgICAgY2xlYXIoKTsKKworICAgIHJldHVybiBvazsKK30KKworYm9vbCBDdlNWTTo6dHJhaW5fYXV0byggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywKKyAgICBjb25zdCBDdk1hdCogX3Zhcl9pZHgsIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwgQ3ZTVk1QYXJhbXMgX3BhcmFtcywgaW50IGtfZm9sZCwKKyAgICBDdlBhcmFtR3JpZCBDX2dyaWQsIEN2UGFyYW1HcmlkIGdhbW1hX2dyaWQsIEN2UGFyYW1HcmlkIHBfZ3JpZCwKKyAgICBDdlBhcmFtR3JpZCBudV9ncmlkLCBDdlBhcmFtR3JpZCBjb2VmX2dyaWQsIEN2UGFyYW1HcmlkIGRlZ3JlZV9ncmlkICkKK3sKKyAgICBib29sIG9rID0gZmFsc2U7CisgICAgQ3ZNYXQqIHJlc3BvbnNlcyA9IDA7CisgICAgQ3ZNYXQqIHJlc3BvbnNlc19sb2NhbCA9IDA7CisgICAgQ3ZNZW1TdG9yYWdlKiB0ZW1wX3N0b3JhZ2UgPSAwOworICAgIGNvbnN0IGZsb2F0Kiogc2FtcGxlcyA9IDA7CisgICAgY29uc3QgZmxvYXQqKiBzYW1wbGVzX2xvY2FsID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTVk06OnRyYWluX2F1dG8iICk7CisgICAgX19CRUdJTl9fOworCisgICAgaW50IHN2bV90eXBlLCBzYW1wbGVfY291bnQsIHZhcl9jb3VudCwgc2FtcGxlX3NpemU7CisgICAgaW50IGJsb2NrX3NpemUgPSAxIDw8IDE2OworICAgIGRvdWJsZSogYWxwaGE7CisgICAgaW50IGksIGs7CisgICAgQ3ZSTkcgcm5nID0gY3ZSTkcoLTEpOworCisgICAgLy8gYWxsIHN0ZXBzIGFyZSBsb2dhcml0aG1pYyBhbmQgbXVzdCBiZSA+IDEKKyAgICBkb3VibGUgZGVncmVlX3N0ZXAgPSAxMCwgZ19zdGVwID0gMTAsIGNvZWZfc3RlcCA9IDEwLCBDX3N0ZXAgPSAxMCwgbnVfc3RlcCA9IDEwLCBwX3N0ZXAgPSAxMDsKKyAgICBkb3VibGUgZ2FtbWEgPSAwLCBDID0gMCwgZGVncmVlID0gMCwgY29lZiA9IDAsIHAgPSAwLCBudSA9IDA7CisgICAgZG91YmxlIGJlc3RfZGVncmVlID0gMCwgYmVzdF9nYW1tYSA9IDAsIGJlc3RfY29lZiA9IDAsIGJlc3RfQyA9IDAsIGJlc3RfbnUgPSAwLCBiZXN0X3AgPSAwOworICAgIGZsb2F0IG1pbl9lcnJvciA9IEZMVF9NQVgsIGVycm9yOworCisgICAgaWYoIF9wYXJhbXMuc3ZtX3R5cGUgPT0gQ3ZTVk06Ok9ORV9DTEFTUyApCisgICAgeworICAgICAgICBpZighdHJhaW4oIF90cmFpbl9kYXRhLCBfcmVzcG9uc2VzLCBfdmFyX2lkeCwgX3NhbXBsZV9pZHgsIF9wYXJhbXMgKSkKKyAgICAgICAgICAgIEVYSVQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNsZWFyKCk7CisKKyAgICBpZigga19mb2xkIDwgMiApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJQYXJhbWV0ZXIgPGtfZm9sZD4gbXVzdCBiZSA+IDEiICk7CisKKyAgICBDVl9DQUxMKHNldF9wYXJhbXMoIF9wYXJhbXMgKSk7CisgICAgc3ZtX3R5cGUgPSBfcGFyYW1zLnN2bV90eXBlOworCisgICAgLy8gQWxsIHRoZSBwYXJhbWV0ZXJzIGV4Y2VwdCwgcG9zc2libHksIDxjb2VmMD4gYXJlIHBvc2l0aXZlLgorICAgIC8vIDxjb2VmMD4gaXMgbm9ubmVnYXRpdmUKKyAgICBpZiggQ19ncmlkLnN0ZXAgPD0gMSApCisgICAgeworICAgICAgICBDX2dyaWQubWluX3ZhbCA9IENfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLkM7CisgICAgICAgIENfZ3JpZC5zdGVwID0gMTA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTChDX2dyaWQuY2hlY2soKSk7CisKKyAgICBpZiggZ2FtbWFfZ3JpZC5zdGVwIDw9IDEgKQorICAgIHsKKyAgICAgICAgZ2FtbWFfZ3JpZC5taW5fdmFsID0gZ2FtbWFfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLmdhbW1hOworICAgICAgICBnYW1tYV9ncmlkLnN0ZXAgPSAxMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKGdhbW1hX2dyaWQuY2hlY2soKSk7CisKKyAgICBpZiggcF9ncmlkLnN0ZXAgPD0gMSApCisgICAgeworICAgICAgICBwX2dyaWQubWluX3ZhbCA9IHBfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLnA7CisgICAgICAgIHBfZ3JpZC5zdGVwID0gMTA7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ1ZfQ0FMTChwX2dyaWQuY2hlY2soKSk7CisKKyAgICBpZiggbnVfZ3JpZC5zdGVwIDw9IDEgKQorICAgIHsKKyAgICAgICAgbnVfZ3JpZC5taW5fdmFsID0gbnVfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLm51OworICAgICAgICBudV9ncmlkLnN0ZXAgPSAxMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKG51X2dyaWQuY2hlY2soKSk7CisKKyAgICBpZiggY29lZl9ncmlkLnN0ZXAgPD0gMSApCisgICAgeworICAgICAgICBjb2VmX2dyaWQubWluX3ZhbCA9IGNvZWZfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLmNvZWYwOworICAgICAgICBjb2VmX2dyaWQuc3RlcCA9IDEwOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0NBTEwoY29lZl9ncmlkLmNoZWNrKCkpOworCisgICAgaWYoIGRlZ3JlZV9ncmlkLnN0ZXAgPD0gMSApCisgICAgeworICAgICAgICBkZWdyZWVfZ3JpZC5taW5fdmFsID0gZGVncmVlX2dyaWQubWF4X3ZhbCA9IHBhcmFtcy5kZWdyZWU7CisgICAgICAgIGRlZ3JlZV9ncmlkLnN0ZXAgPSAxMDsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKGRlZ3JlZV9ncmlkLmNoZWNrKCkpOworCisgICAgLy8gdGhlc2UgcGFyYW1ldGVycyBhcmUgbm90IHVzZWQ6CisgICAgaWYoIHBhcmFtcy5rZXJuZWxfdHlwZSAhPSBDdlNWTTo6UE9MWSApCisgICAgICAgIGRlZ3JlZV9ncmlkLm1pbl92YWwgPSBkZWdyZWVfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLmRlZ3JlZTsKKyAgICBpZiggcGFyYW1zLmtlcm5lbF90eXBlID09IEN2U1ZNOjpMSU5FQVIgKQorICAgICAgICBnYW1tYV9ncmlkLm1pbl92YWwgPSBnYW1tYV9ncmlkLm1heF92YWwgPSBwYXJhbXMuZ2FtbWE7CisgICAgaWYoIHBhcmFtcy5rZXJuZWxfdHlwZSAhPSBDdlNWTTo6UE9MWSAmJiBwYXJhbXMua2VybmVsX3R5cGUgIT0gQ3ZTVk06OlNJR01PSUQgKQorICAgICAgICBjb2VmX2dyaWQubWluX3ZhbCA9IGNvZWZfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLmNvZWYwOworICAgIGlmKCBzdm1fdHlwZSA9PSBDdlNWTTo6TlVfU1ZDIHx8IHN2bV90eXBlID09IEN2U1ZNOjpPTkVfQ0xBU1MgKQorICAgICAgICBDX2dyaWQubWluX3ZhbCA9IENfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLkM7CisgICAgaWYoIHN2bV90eXBlID09IEN2U1ZNOjpDX1NWQyB8fCBzdm1fdHlwZSA9PSBDdlNWTTo6RVBTX1NWUiApCisgICAgICAgIG51X2dyaWQubWluX3ZhbCA9IG51X2dyaWQubWF4X3ZhbCA9IHBhcmFtcy5udTsKKyAgICBpZiggc3ZtX3R5cGUgIT0gQ3ZTVk06OkVQU19TVlIgKQorICAgICAgICBwX2dyaWQubWluX3ZhbCA9IHBfZ3JpZC5tYXhfdmFsID0gcGFyYW1zLnA7CisKKyAgICBDVl9BU1NFUlQoIGdfc3RlcCA+IDEgJiYgZGVncmVlX3N0ZXAgPiAxICYmIGNvZWZfc3RlcCA+IDEpOworICAgIENWX0FTU0VSVCggcF9zdGVwID4gMSAmJiBDX3N0ZXAgPiAxICYmIG51X3N0ZXAgPiAxICk7CisKKyAgICAvKiBQcmVwYXJlIHRyYWluaW5nIGRhdGEgYW5kIHJlbGF0ZWQgcGFyYW1ldGVycyAqLworICAgIENWX0NBTEwoY3ZQcmVwYXJlVHJhaW5EYXRhKCAiQ3ZTVk06OnRyYWluX2F1dG8iLCBfdHJhaW5fZGF0YSwgQ1ZfUk9XX1NBTVBMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bV90eXBlICE9IEN2U1ZNOjpPTkVfQ0xBU1MgPyBfcmVzcG9uc2VzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2bV90eXBlID09IEN2U1ZNOjpDX1NWQyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWQyA/IENWX1ZBUl9DQVRFR09SSUNBTCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9WQVJfT1JERVJFRCwgX3Zhcl9pZHgsIF9zYW1wbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsICZzYW1wbGVzLCAmc2FtcGxlX2NvdW50LCAmdmFyX2NvdW50LCAmdmFyX2FsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXNwb25zZXMsICZjbGFzc19sYWJlbHMsICZ2YXJfaWR4ICkpOworCisgICAgc2FtcGxlX3NpemUgPSB2YXJfY291bnQqc2l6ZW9mKHNhbXBsZXNbMF1bMF0pOworCisgICAgLy8gbWFrZSB0aGUgc3RvcmFnZSBibG9jayBzaXplIGxhcmdlIGVub3VnaCB0byBmaXQgYWxsCisgICAgLy8gdGhlIHRlbXBvcmFyeSB2ZWN0b3JzIGFuZCBvdXRwdXQgc3VwcG9ydCB2ZWN0b3JzLgorICAgIGJsb2NrX3NpemUgPSBNQVgoIGJsb2NrX3NpemUsIHNhbXBsZV9jb3VudCooaW50KXNpemVvZihDdlNWTUtlcm5lbFJvdykpOworICAgIGJsb2NrX3NpemUgPSBNQVgoIGJsb2NrX3NpemUsIHNhbXBsZV9jb3VudCoyKihpbnQpc2l6ZW9mKGRvdWJsZSkgKyAxMDI0ICk7CisgICAgYmxvY2tfc2l6ZSA9IE1BWCggYmxvY2tfc2l6ZSwgc2FtcGxlX3NpemUqMiArIDEwMjQgKTsKKworICAgIENWX0NBTEwoc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZShibG9ja19zaXplKSk7CisgICAgQ1ZfQ0FMTCh0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZUNoaWxkTWVtU3RvcmFnZShzdG9yYWdlKSk7CisgICAgQ1ZfQ0FMTChhbHBoYSA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKHRlbXBfc3RvcmFnZSwgc2FtcGxlX2NvdW50KnNpemVvZihkb3VibGUpKSk7CisKKyAgICBjcmVhdGVfa2VybmVsKCk7CisgICAgY3JlYXRlX3NvbHZlcigpOworCisgICAgeworICAgIGNvbnN0IGludCB0ZXN0c2V0X3NpemUgPSBzYW1wbGVfY291bnQva19mb2xkOworICAgIGNvbnN0IGludCB0cmFpbnNldF9zaXplID0gc2FtcGxlX2NvdW50IC0gdGVzdHNldF9zaXplOworICAgIGNvbnN0IGludCBsYXN0X3Rlc3RzZXRfc2l6ZSA9IHNhbXBsZV9jb3VudCAtIHRlc3RzZXRfc2l6ZSooa19mb2xkLTEpOworICAgIGNvbnN0IGludCBsYXN0X3RyYWluc2V0X3NpemUgPSBzYW1wbGVfY291bnQgLSBsYXN0X3Rlc3RzZXRfc2l6ZTsKKyAgICBjb25zdCBib29sIGlzX3JlZ3Jlc3Npb24gPSAoc3ZtX3R5cGUgPT0gRVBTX1NWUikgfHwgKHN2bV90eXBlID09IE5VX1NWUik7CisKKyAgICBzaXplX3QgcmVzcF9lbGVtX3NpemUgPSBDVl9FTEVNX1NJWkUocmVzcG9uc2VzLT50eXBlKTsKKyAgICBzaXplX3Qgc2l6ZSA9IDIqbGFzdF90cmFpbnNldF9zaXplKnNpemVvZihzYW1wbGVzWzBdKTsKKworICAgIHNhbXBsZXNfbG9jYWwgPSAoY29uc3QgZmxvYXQqKikgY3ZBbGxvYyggc2l6ZSApOworICAgIG1lbXNldCggc2FtcGxlc19sb2NhbCwgMCwgc2l6ZSApOworCisgICAgcmVzcG9uc2VzX2xvY2FsID0gY3ZDcmVhdGVNYXQoIDEsIHRyYWluc2V0X3NpemUsIENWX01BVF9UWVBFKHJlc3BvbnNlcy0+dHlwZSkgKTsKKyAgICBjdlplcm8oIHJlc3BvbnNlc19sb2NhbCApOworCisgICAgLy8gcmFuZG9tbHkgcGVybXV0ZSBzYW1wbGVzIGFuZCByZXNwb25zZXMKKyAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGkxID0gY3ZSYW5kSW50KCAmcm5nICkgJSBzYW1wbGVfY291bnQ7CisgICAgICAgIGludCBpMiA9IGN2UmFuZEludCggJnJuZyApICUgc2FtcGxlX2NvdW50OworICAgICAgICBjb25zdCBmbG9hdCogdGVtcDsKKyAgICAgICAgZmxvYXQgdDsKKyAgICAgICAgaW50IHk7CisKKyAgICAgICAgQ1ZfU1dBUCggc2FtcGxlc1tpMV0sIHNhbXBsZXNbaTJdLCB0ZW1wICk7CisgICAgICAgIGlmKCBpc19yZWdyZXNzaW9uICkKKyAgICAgICAgICAgIENWX1NXQVAoIHJlc3BvbnNlcy0+ZGF0YS5mbFtpMV0sIHJlc3BvbnNlcy0+ZGF0YS5mbFtpMl0sIHQgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgQ1ZfU1dBUCggcmVzcG9uc2VzLT5kYXRhLmlbaTFdLCByZXNwb25zZXMtPmRhdGEuaVtpMl0sIHkgKTsKKyAgICB9CisKKyAgICBDID0gQ19ncmlkLm1pbl92YWw7CisgICAgZG8KKyAgICB7CisgICAgICBwYXJhbXMuQyA9IEM7CisgICAgICBnYW1tYSA9IGdhbW1hX2dyaWQubWluX3ZhbDsKKyAgICAgIGRvCisgICAgICB7CisgICAgICAgIHBhcmFtcy5nYW1tYSA9IGdhbW1hOworICAgICAgICBwID0gcF9ncmlkLm1pbl92YWw7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICBwYXJhbXMucCA9IHA7CisgICAgICAgICAgbnUgPSBudV9ncmlkLm1pbl92YWw7CisgICAgICAgICAgZG8KKyAgICAgICAgICB7CisgICAgICAgICAgICBwYXJhbXMubnUgPSBudTsKKyAgICAgICAgICAgIGNvZWYgPSBjb2VmX2dyaWQubWluX3ZhbDsKKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHBhcmFtcy5jb2VmMCA9IGNvZWY7CisgICAgICAgICAgICAgIGRlZ3JlZSA9IGRlZ3JlZV9ncmlkLm1pbl92YWw7CisgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuZGVncmVlID0gZGVncmVlOworCisgICAgICAgICAgICAgICAgZmxvYXQqKiB0ZXN0X3NhbXBsZXNfcHRyID0gKGZsb2F0Kiopc2FtcGxlczsKKyAgICAgICAgICAgICAgICB1Y2hhciogdHJ1ZV9yZXNwID0gcmVzcG9uc2VzLT5kYXRhLnB0cjsKKyAgICAgICAgICAgICAgICBpbnQgdGVzdF9zaXplID0gdGVzdHNldF9zaXplOworICAgICAgICAgICAgICAgIGludCB0cmFpbl9zaXplID0gdHJhaW5zZXRfc2l6ZTsKKworICAgICAgICAgICAgICAgIGVycm9yID0gMDsKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwga19mb2xkOyBrKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBzYW1wbGVzX2xvY2FsLCBzYW1wbGVzLCBzaXplb2Yoc2FtcGxlc1swXSkqdGVzdF9zaXplKmsgKTsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBzYW1wbGVzX2xvY2FsICsgdGVzdF9zaXplKmssIHRlc3Rfc2FtcGxlc19wdHIgKyB0ZXN0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2FtcGxlc1swXSkqKHNhbXBsZV9jb3VudCAtIHRlc3RzZXRfc2l6ZSooaysxKSkgKTsKKworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIHJlc3BvbnNlc19sb2NhbC0+ZGF0YS5wdHIsIHJlc3BvbnNlcy0+ZGF0YS5wdHIsIHJlc3BfZWxlbV9zaXplKnRlc3Rfc2l6ZSprICk7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweSggcmVzcG9uc2VzX2xvY2FsLT5kYXRhLnB0ciArIHJlc3BfZWxlbV9zaXplKnRlc3Rfc2l6ZSprLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZV9yZXNwICsgcmVzcF9lbGVtX3NpemUqdGVzdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNhbXBsZXNbMF0pKihzYW1wbGVfY291bnQgLSB0ZXN0c2V0X3NpemUqKGsrMSkpICk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGsgPT0ga19mb2xkIC0gMSApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rfc2l6ZSA9IGxhc3RfdGVzdHNldF9zaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5fc2l6ZSA9IGxhc3RfdHJhaW5zZXRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlc19sb2NhbC0+Y29scyA9IGxhc3RfdHJhaW5zZXRfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFRyYWluIFNWTSBvbiA8dHJhaW5fc2l6ZT4gc2FtcGxlcworICAgICAgICAgICAgICAgICAgICBpZiggIWRvX3RyYWluKCBzdm1fdHlwZSwgdHJhaW5fc2l6ZSwgdmFyX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0Kiopc2FtcGxlc19sb2NhbCwgcmVzcG9uc2VzX2xvY2FsLCB0ZW1wX3N0b3JhZ2UsIGFscGhhICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgRVhJVDsKKworICAgICAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRlc3Qgc2V0IGVycm9yIG9uIDx0ZXN0X3NpemU+IHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgQ3ZNYXQgcyA9IGN2TWF0KCAxLCB2YXJfY291bnQsIENWXzMyRkMxICk7CisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCB0ZXN0X3NpemU7IGkrKywgdHJ1ZV9yZXNwICs9IHJlc3BfZWxlbV9zaXplLCB0ZXN0X3NhbXBsZXNfcHRyKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCByZXNwOworICAgICAgICAgICAgICAgICAgICAgICAgcy5kYXRhLmZsID0gKnRlc3Rfc2FtcGxlc19wdHI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwID0gcHJlZGljdCggJnMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yICs9IGlzX3JlZ3Jlc3Npb24gPyBwb3dmKCByZXNwIC0gKihmbG9hdCopdHJ1ZV9yZXNwLCAyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICgoaW50KXJlc3AgIT0gKihpbnQqKXRydWVfcmVzcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG1pbl9lcnJvciA+IGVycm9yICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1pbl9lcnJvciAgID0gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfZGVncmVlID0gZGVncmVlOworICAgICAgICAgICAgICAgICAgICBiZXN0X2dhbW1hICA9IGdhbW1hOworICAgICAgICAgICAgICAgICAgICBiZXN0X2NvZWYgICA9IGNvZWY7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfQyAgICAgID0gQzsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9udSAgICAgPSBudTsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9wICAgICAgPSBwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWdyZWUgKj0gZGVncmVlX2dyaWQuc3RlcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB3aGlsZSggZGVncmVlIDwgZGVncmVlX2dyaWQubWF4X3ZhbCApOworICAgICAgICAgICAgICBjb2VmICo9IGNvZWZfZ3JpZC5zdGVwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2hpbGUoIGNvZWYgPCBjb2VmX2dyaWQubWF4X3ZhbCApOworICAgICAgICAgICAgbnUgKj0gbnVfZ3JpZC5zdGVwOworICAgICAgICAgIH0KKyAgICAgICAgICB3aGlsZSggbnUgPCBudV9ncmlkLm1heF92YWwgKTsKKyAgICAgICAgICBwICo9IHBfZ3JpZC5zdGVwOworICAgICAgICB9CisgICAgICAgIHdoaWxlKCBwIDwgcF9ncmlkLm1heF92YWwgKTsKKyAgICAgICAgZ2FtbWEgKj0gZ2FtbWFfZ3JpZC5zdGVwOworICAgICAgfQorICAgICAgd2hpbGUoIGdhbW1hIDwgZ2FtbWFfZ3JpZC5tYXhfdmFsICk7CisgICAgICBDICo9IENfZ3JpZC5zdGVwOworICAgIH0KKyAgICB3aGlsZSggQyA8IENfZ3JpZC5tYXhfdmFsICk7CisgICAgfQorCisgICAgbWluX2Vycm9yIC89IChmbG9hdCkgc2FtcGxlX2NvdW50OworCisgICAgcGFyYW1zLkMgICAgICA9IGJlc3RfQzsKKyAgICBwYXJhbXMubnUgICAgID0gYmVzdF9udTsKKyAgICBwYXJhbXMucCAgICAgID0gYmVzdF9wOworICAgIHBhcmFtcy5nYW1tYSAgPSBiZXN0X2dhbW1hOworICAgIHBhcmFtcy5kZWdyZWUgPSBiZXN0X2RlZ3JlZTsKKyAgICBwYXJhbXMuY29lZjAgID0gYmVzdF9jb2VmOworCisgICAgQ1ZfQ0FMTChvayA9IGRvX3RyYWluKCBzdm1fdHlwZSwgc2FtcGxlX2NvdW50LCB2YXJfY291bnQsIHNhbXBsZXMsIHJlc3BvbnNlcywgdGVtcF9zdG9yYWdlLCBhbHBoYSApKTsKKworICAgIF9fRU5EX187CisKKyAgICBkZWxldGUgc29sdmVyOworICAgIHNvbHZlciA9IDA7CisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworICAgIGN2UmVsZWFzZU1hdCggJnJlc3BvbnNlcyApOworICAgIGN2UmVsZWFzZU1hdCggJnJlc3BvbnNlc19sb2NhbCApOworICAgIGN2RnJlZSggJnNhbXBsZXMgKTsKKyAgICBjdkZyZWUoICZzYW1wbGVzX2xvY2FsICk7CisKKyAgICBpZiggY3ZHZXRFcnJTdGF0dXMoKSA8IDAgfHwgIW9rICkKKyAgICAgICAgY2xlYXIoKTsKKworICAgIHJldHVybiBvazsKK30KKworZmxvYXQgQ3ZTVk06OnByZWRpY3QoIGNvbnN0IEN2TWF0KiBzYW1wbGUgKSBjb25zdAoreworICAgIGJvb2wgbG9jYWxfYWxsb2MgPSAwOworICAgIGZsb2F0IHJlc3VsdCA9IDA7CisgICAgZmxvYXQqIHJvd19zYW1wbGUgPSAwOworICAgIFFmbG9hdCogYnVmZmVyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZTVk06OnByZWRpY3QiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgY2xhc3NfY291bnQ7CisgICAgaW50IHZhcl9jb3VudCwgYnVmX3N6OworCisgICAgaWYoICFrZXJuZWwgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiVGhlIFNWTSBzaG91bGQgYmUgdHJhaW5lZCBmaXJzdCIgKTsKKworICAgIGNsYXNzX2NvdW50ID0gY2xhc3NfbGFiZWxzID8gY2xhc3NfbGFiZWxzLT5jb2xzIDoKKyAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdm1fdHlwZSA9PSBPTkVfQ0xBU1MgPyAxIDogMDsKKworICAgIENWX0NBTEwoIGN2UHJlcGFyZVByZWRpY3REYXRhKCBzYW1wbGUsIHZhcl9hbGwsIHZhcl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzX2NvdW50LCAwLCAmcm93X3NhbXBsZSApKTsKKworICAgIHZhcl9jb3VudCA9IGdldF92YXJfY291bnQoKTsKKworICAgIGJ1Zl9zeiA9IHN2X3RvdGFsKnNpemVvZihidWZmZXJbMF0pICsgKGNsYXNzX2NvdW50KzEpKnNpemVvZihpbnQpOworICAgIGlmKCBidWZfc3ogPD0gQ1ZfTUFYX0xPQ0FMX1NJWkUgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggYnVmZmVyID0gKFFmbG9hdCopY3ZTdGFja0FsbG9jKCBidWZfc3ogKSk7CisgICAgICAgIGxvY2FsX2FsbG9jID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBDVl9DQUxMKCBidWZmZXIgPSAoUWZsb2F0KiljdkFsbG9jKCBidWZfc3ogKSk7CisKKyAgICBpZiggcGFyYW1zLnN2bV90eXBlID09IEVQU19TVlIgfHwKKyAgICAgICAgcGFyYW1zLnN2bV90eXBlID09IE5VX1NWUiB8fAorICAgICAgICBwYXJhbXMuc3ZtX3R5cGUgPT0gT05FX0NMQVNTICkKKyAgICB7CisgICAgICAgIEN2U1ZNRGVjaXNpb25GdW5jKiBkZiA9IChDdlNWTURlY2lzaW9uRnVuYyopZGVjaXNpb25fZnVuYzsKKyAgICAgICAgaW50IGksIHN2X2NvdW50ID0gZGYtPnN2X2NvdW50OworICAgICAgICBkb3VibGUgc3VtID0gLWRmLT5yaG87CisKKyAgICAgICAga2VybmVsLT5jYWxjKCBzdl9jb3VudCwgdmFyX2NvdW50LCAoY29uc3QgZmxvYXQqKilzdiwgcm93X3NhbXBsZSwgYnVmZmVyICk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdl9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHN1bSArPSBidWZmZXJbaV0qZGYtPmFscGhhW2ldOworCisgICAgICAgIHJlc3VsdCA9IHBhcmFtcy5zdm1fdHlwZSA9PSBPTkVfQ0xBU1MgPyAoZmxvYXQpKHN1bSA+IDApIDogKGZsb2F0KXN1bTsKKyAgICB9CisgICAgZWxzZSBpZiggcGFyYW1zLnN2bV90eXBlID09IENfU1ZDIHx8CisgICAgICAgICAgICAgcGFyYW1zLnN2bV90eXBlID09IE5VX1NWQyApCisgICAgeworICAgICAgICBDdlNWTURlY2lzaW9uRnVuYyogZGYgPSAoQ3ZTVk1EZWNpc2lvbkZ1bmMqKWRlY2lzaW9uX2Z1bmM7CisgICAgICAgIGludCogdm90ZSA9IChpbnQqKShidWZmZXIgKyBzdl90b3RhbCk7CisgICAgICAgIGludCBpLCBqLCBrOworCisgICAgICAgIG1lbXNldCggdm90ZSwgMCwgY2xhc3NfY291bnQqc2l6ZW9mKHZvdGVbMF0pKTsKKyAgICAgICAga2VybmVsLT5jYWxjKCBzdl90b3RhbCwgdmFyX2NvdW50LCAoY29uc3QgZmxvYXQqKilzdiwgcm93X3NhbXBsZSwgYnVmZmVyICk7CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNsYXNzX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGogPSBpKzE7IGogPCBjbGFzc19jb3VudDsgaisrLCBkZisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgc3VtID0gLWRmLT5yaG87CisgICAgICAgICAgICAgICAgaW50IHN2X2NvdW50ID0gZGYtPnN2X2NvdW50OworICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBzdl9jb3VudDsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgc3VtICs9IGRmLT5hbHBoYVtrXSpidWZmZXJbZGYtPnN2X2luZGV4W2tdXTsKKworICAgICAgICAgICAgICAgIHZvdGVbc3VtID4gMCA/IGkgOiBqXSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMSwgayA9IDA7IGkgPCBjbGFzc19jb3VudDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHZvdGVbaV0gPiB2b3RlW2tdICkKKyAgICAgICAgICAgICAgICBrID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IChmbG9hdCkoY2xhc3NfbGFiZWxzLT5kYXRhLmlba10pOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJJTlRFUk5BTCBFUlJPUjogVW5rbm93biBTVk0gdHlwZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIFNWTSBzdHJ1Y3R1cmUgaXMgcHJvYmFibHkgY29ycnVwdGVkIiApOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBzYW1wbGUgJiYgKCFDVl9JU19NQVQoc2FtcGxlKSB8fCBzYW1wbGUtPmRhdGEuZmwgIT0gcm93X3NhbXBsZSkgKQorICAgICAgICBjdkZyZWUoICZyb3dfc2FtcGxlICk7CisKKyAgICBpZiggIWxvY2FsX2FsbG9jICkKKyAgICAgICAgY3ZGcmVlKCAmYnVmZmVyICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQgQ3ZTVk06OndyaXRlX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJDdlNWTTo6d3JpdGVfcGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHN2bV90eXBlID0gcGFyYW1zLnN2bV90eXBlOworICAgIGludCBrZXJuZWxfdHlwZSA9IHBhcmFtcy5rZXJuZWxfdHlwZTsKKworICAgIGNvbnN0IGNoYXIqIHN2bV90eXBlX3N0ciA9CisgICAgICAgIHN2bV90eXBlID09IEN2U1ZNOjpDX1NWQyA/ICJDX1NWQyIgOgorICAgICAgICBzdm1fdHlwZSA9PSBDdlNWTTo6TlVfU1ZDID8gIk5VX1NWQyIgOgorICAgICAgICBzdm1fdHlwZSA9PSBDdlNWTTo6T05FX0NMQVNTID8gIk9ORV9DTEFTUyIgOgorICAgICAgICBzdm1fdHlwZSA9PSBDdlNWTTo6RVBTX1NWUiA/ICJFUFNfU1ZSIiA6CisgICAgICAgIHN2bV90eXBlID09IEN2U1ZNOjpOVV9TVlIgPyAiTlVfU1ZSIiA6IDA7CisgICAgY29uc3QgY2hhcioga2VybmVsX3R5cGVfc3RyID0KKyAgICAgICAga2VybmVsX3R5cGUgPT0gQ3ZTVk06OkxJTkVBUiA/ICJMSU5FQVIiIDoKKyAgICAgICAga2VybmVsX3R5cGUgPT0gQ3ZTVk06OlBPTFkgPyAiUE9MWSIgOgorICAgICAgICBrZXJuZWxfdHlwZSA9PSBDdlNWTTo6UkJGID8gIlJCRiIgOgorICAgICAgICBrZXJuZWxfdHlwZSA9PSBDdlNWTTo6U0lHTU9JRCA/ICJTSUdNT0lEIiA6IDA7CisKKyAgICBpZiggc3ZtX3R5cGVfc3RyICkKKyAgICAgICAgY3ZXcml0ZVN0cmluZyggZnMsICJzdm1fdHlwZSIsIHN2bV90eXBlX3N0ciApOworICAgIGVsc2UKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJzdm1fdHlwZSIsIHN2bV90eXBlICk7CisKKyAgICAvLyBzYXZlIGtlcm5lbAorICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJrZXJuZWwiLCBDVl9OT0RFX01BUCArIENWX05PREVfRkxPVyApOworCisgICAgaWYoIGtlcm5lbF90eXBlX3N0ciApCisgICAgICAgIGN2V3JpdGVTdHJpbmcoIGZzLCAidHlwZSIsIGtlcm5lbF90eXBlX3N0ciApOworICAgIGVsc2UKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJ0eXBlIiwga2VybmVsX3R5cGUgKTsKKworICAgIGlmKCBrZXJuZWxfdHlwZSA9PSBDdlNWTTo6UE9MWSB8fCAha2VybmVsX3R5cGVfc3RyICkKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiZGVncmVlIiwgcGFyYW1zLmRlZ3JlZSApOworCisgICAgaWYoIGtlcm5lbF90eXBlICE9IEN2U1ZNOjpMSU5FQVIgfHwgIWtlcm5lbF90eXBlX3N0ciApCisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImdhbW1hIiwgcGFyYW1zLmdhbW1hICk7CisKKyAgICBpZigga2VybmVsX3R5cGUgPT0gQ3ZTVk06OlBPTFkgfHwga2VybmVsX3R5cGUgPT0gQ3ZTVk06OlNJR01PSUQgfHwgIWtlcm5lbF90eXBlX3N0ciApCisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgImNvZWYwIiwgcGFyYW1zLmNvZWYwICk7CisKKyAgICBjdkVuZFdyaXRlU3RydWN0KGZzKTsKKworICAgIGlmKCBzdm1fdHlwZSA9PSBDdlNWTTo6Q19TVkMgfHwgc3ZtX3R5cGUgPT0gQ3ZTVk06OkVQU19TVlIgfHwKKyAgICAgICAgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWUiB8fCAhc3ZtX3R5cGVfc3RyICkKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAiQyIsIHBhcmFtcy5DICk7CisKKyAgICBpZiggc3ZtX3R5cGUgPT0gQ3ZTVk06Ok5VX1NWQyB8fCBzdm1fdHlwZSA9PSBDdlNWTTo6T05FX0NMQVNTIHx8CisgICAgICAgIHN2bV90eXBlID09IEN2U1ZNOjpOVV9TVlIgfHwgIXN2bV90eXBlX3N0ciApCisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgIm51IiwgcGFyYW1zLm51ICk7CisKKyAgICBpZiggc3ZtX3R5cGUgPT0gQ3ZTVk06OkVQU19TVlIgfHwgIXN2bV90eXBlX3N0ciApCisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgInAiLCBwYXJhbXMucCApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInRlcm1fY3JpdGVyaWEiLCBDVl9OT0RFX01BUCArIENWX05PREVfRkxPVyApOworICAgIGlmKCBwYXJhbXMudGVybV9jcml0LnR5cGUgJiBDVl9URVJNQ1JJVF9FUFMgKQorICAgICAgICBjdldyaXRlUmVhbCggZnMsICJlcHNpbG9uIiwgcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uICk7CisgICAgaWYoIHBhcmFtcy50ZXJtX2NyaXQudHlwZSAmIENWX1RFUk1DUklUX0lURVIgKQorICAgICAgICBjdldyaXRlSW50KCBmcywgIml0ZXJhdGlvbnMiLCBwYXJhbXMudGVybV9jcml0Lm1heF9pdGVyICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdlNWTTo6d3JpdGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBjb25zdCBjaGFyKiBuYW1lICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2U1ZNOjp3cml0ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCB2YXJfY291bnQgPSBnZXRfdmFyX2NvdW50KCksIGRmX2NvdW50LCBjbGFzc19jb3VudDsKKyAgICBjb25zdCBDdlNWTURlY2lzaW9uRnVuYyogZGYgPSBkZWNpc2lvbl9mdW5jOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgbmFtZSwgQ1ZfTk9ERV9NQVAsIENWX1RZUEVfTkFNRV9NTF9TVk0gKTsKKworICAgIHdyaXRlX3BhcmFtcyggZnMgKTsKKworICAgIGN2V3JpdGVJbnQoIGZzLCAidmFyX2FsbCIsIHZhcl9hbGwgKTsKKyAgICBjdldyaXRlSW50KCBmcywgInZhcl9jb3VudCIsIHZhcl9jb3VudCApOworCisgICAgY2xhc3NfY291bnQgPSBjbGFzc19sYWJlbHMgPyBjbGFzc19sYWJlbHMtPmNvbHMgOgorICAgICAgICAgICAgICAgICAgcGFyYW1zLnN2bV90eXBlID09IEN2U1ZNOjpPTkVfQ0xBU1MgPyAxIDogMDsKKworICAgIGlmKCBjbGFzc19jb3VudCApCisgICAgeworICAgICAgICBjdldyaXRlSW50KCBmcywgImNsYXNzX2NvdW50IiwgY2xhc3NfY291bnQgKTsKKworICAgICAgICBpZiggY2xhc3NfbGFiZWxzICkKKyAgICAgICAgICAgIGN2V3JpdGUoIGZzLCAiY2xhc3NfbGFiZWxzIiwgY2xhc3NfbGFiZWxzICk7CisKKyAgICAgICAgaWYoIGNsYXNzX3dlaWdodHMgKQorICAgICAgICAgICAgY3ZXcml0ZSggZnMsICJjbGFzc193ZWlnaHRzIiwgY2xhc3Nfd2VpZ2h0cyApOworICAgIH0KKworICAgIGlmKCB2YXJfaWR4ICkKKyAgICAgICAgY3ZXcml0ZSggZnMsICJ2YXJfaWR4IiwgdmFyX2lkeCApOworCisgICAgLy8gd3JpdGUgdGhlIGpvaW50IGNvbGxlY3Rpb24gb2Ygc3VwcG9ydCB2ZWN0b3JzCisgICAgY3ZXcml0ZUludCggZnMsICJzdl90b3RhbCIsIHN2X3RvdGFsICk7CisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInN1cHBvcnRfdmVjdG9ycyIsIENWX05PREVfU0VRICk7CisgICAgZm9yKCBpID0gMDsgaSA8IHN2X3RvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgMCwgQ1ZfTk9ERV9TRVEgKyBDVl9OT0RFX0ZMT1cgKTsKKyAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCBzdltpXSwgdmFyX2NvdW50LCAiZiIgKTsKKyAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICB9CisKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgLy8gd3JpdGUgZGVjaXNpb24gZnVuY3Rpb25zCisgICAgZGZfY291bnQgPSBjbGFzc19jb3VudCA+IDEgPyBjbGFzc19jb3VudCooY2xhc3NfY291bnQtMSkvMiA6IDE7CisgICAgZGYgPSBkZWNpc2lvbl9mdW5jOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImRlY2lzaW9uX2Z1bmN0aW9ucyIsIENWX05PREVfU0VRICk7CisgICAgZm9yKCBpID0gMDsgaSA8IGRmX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IHN2X2NvdW50ID0gZGZbaV0uc3ZfY291bnQ7CisgICAgICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIDAsIENWX05PREVfTUFQICk7CisgICAgICAgIGN2V3JpdGVJbnQoIGZzLCAic3ZfY291bnQiLCBzdl9jb3VudCApOworICAgICAgICBjdldyaXRlUmVhbCggZnMsICJyaG8iLCBkZltpXS5yaG8gKTsKKyAgICAgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgImFscGhhIiwgQ1ZfTk9ERV9TRVErQ1ZfTk9ERV9GTE9XICk7CisgICAgICAgIGN2V3JpdGVSYXdEYXRhKCBmcywgZGZbaV0uYWxwaGEsIGRmW2ldLnN2X2NvdW50LCAiZCIgKTsKKyAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICAgICAgaWYoIGNsYXNzX2NvdW50ID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsICJpbmRleCIsIENWX05PREVfU0VRK0NWX05PREVfRkxPVyApOworICAgICAgICAgICAgY3ZXcml0ZVJhd0RhdGEoIGZzLCBkZltpXS5zdl9pbmRleCwgZGZbaV0uc3ZfY291bnQsICJpIiApOworICAgICAgICAgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBDVl9BU1NFUlQoIHN2X2NvdW50ID09IHN2X3RvdGFsICk7CisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgfQorICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdlNWTTo6cmVhZF9wYXJhbXMoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBzdm1fbm9kZSApCit7CisgICAgQ1ZfRlVOQ05BTUUoICJDdlNWTTo6cmVhZF9wYXJhbXMiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc3ZtX3R5cGUsIGtlcm5lbF90eXBlOworICAgIEN2U1ZNUGFyYW1zIF9wYXJhbXM7CisKKyAgICBDdkZpbGVOb2RlKiB0bXBfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBzdm1fbm9kZSwgInN2bV90eXBlIiApOworICAgIEN2RmlsZU5vZGUqIGtlcm5lbF9ub2RlOworICAgIGlmKCAhdG1wX25vZGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAic3ZtX3R5cGUgdGFnIGlzIG5vdCBmb3VuZCIgKTsKKworICAgIGlmKCBDVl9OT0RFX1RZUEUodG1wX25vZGUtPnRhZykgPT0gQ1ZfTk9ERV9JTlQgKQorICAgICAgICBzdm1fdHlwZSA9IGN2UmVhZEludCggdG1wX25vZGUsIC0xICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogc3ZtX3R5cGVfc3RyID0gY3ZSZWFkU3RyaW5nKCB0bXBfbm9kZSwgIiIgKTsKKyAgICAgICAgc3ZtX3R5cGUgPQorICAgICAgICAgICAgc3RyY21wKCBzdm1fdHlwZV9zdHIsICJDX1NWQyIgKSA9PSAwID8gQ3ZTVk06OkNfU1ZDIDoKKyAgICAgICAgICAgIHN0cmNtcCggc3ZtX3R5cGVfc3RyLCAiTlVfU1ZDIiApID09IDAgPyBDdlNWTTo6TlVfU1ZDIDoKKyAgICAgICAgICAgIHN0cmNtcCggc3ZtX3R5cGVfc3RyLCAiT05FX0NMQVNTIiApID09IDAgPyBDdlNWTTo6T05FX0NMQVNTIDoKKyAgICAgICAgICAgIHN0cmNtcCggc3ZtX3R5cGVfc3RyLCAiRVBTX1NWUiIgKSA9PSAwID8gQ3ZTVk06OkVQU19TVlIgOgorICAgICAgICAgICAgc3RyY21wKCBzdm1fdHlwZV9zdHIsICJOVV9TVlIiICkgPT0gMCA/IEN2U1ZNOjpOVV9TVlIgOiAtMTsKKworICAgICAgICBpZiggc3ZtX3R5cGUgPCAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiTWlzc2luZyBvZiBpbnZhbGlkIFNWTSB0eXBlIiApOworICAgIH0KKworICAgIGtlcm5lbF9ub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIHN2bV9ub2RlLCAia2VybmVsIiApOworICAgIGlmKCAha2VybmVsX25vZGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIlNWTSBrZXJuZWwgdGFnIGlzIG5vdCBmb3VuZCIgKTsKKworICAgIHRtcF9ub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIGtlcm5lbF9ub2RlLCAidHlwZSIgKTsKKyAgICBpZiggIXRtcF9ub2RlICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJTVk0ga2VybmVsIHR5cGUgdGFnIGlzIG5vdCBmb3VuZCIgKTsKKworICAgIGlmKCBDVl9OT0RFX1RZUEUodG1wX25vZGUtPnRhZykgPT0gQ1ZfTk9ERV9JTlQgKQorICAgICAgICBrZXJuZWxfdHlwZSA9IGN2UmVhZEludCggdG1wX25vZGUsIC0xICk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhcioga2VybmVsX3R5cGVfc3RyID0gY3ZSZWFkU3RyaW5nKCB0bXBfbm9kZSwgIiIgKTsKKyAgICAgICAga2VybmVsX3R5cGUgPQorICAgICAgICAgICAgc3RyY21wKCBrZXJuZWxfdHlwZV9zdHIsICJMSU5FQVIiICkgPT0gMCA/IEN2U1ZNOjpMSU5FQVIgOgorICAgICAgICAgICAgc3RyY21wKCBrZXJuZWxfdHlwZV9zdHIsICJQT0xZIiApID09IDAgPyBDdlNWTTo6UE9MWSA6CisgICAgICAgICAgICBzdHJjbXAoIGtlcm5lbF90eXBlX3N0ciwgIlJCRiIgKSA9PSAwID8gQ3ZTVk06OlJCRiA6CisgICAgICAgICAgICBzdHJjbXAoIGtlcm5lbF90eXBlX3N0ciwgIlNJR01PSUQiICkgPT0gMCA/IEN2U1ZNOjpTSUdNT0lEIDogLTE7CisKKyAgICAgICAgaWYoIGtlcm5lbF90eXBlIDwgMCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIk1pc3Npbmcgb2YgaW52YWxpZCBTVk0ga2VybmVsIHR5cGUiICk7CisgICAgfQorCisgICAgX3BhcmFtcy5zdm1fdHlwZSA9IHN2bV90eXBlOworICAgIF9wYXJhbXMua2VybmVsX3R5cGUgPSBrZXJuZWxfdHlwZTsKKyAgICBfcGFyYW1zLmRlZ3JlZSA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBrZXJuZWxfbm9kZSwgImRlZ3JlZSIsIDAgKTsKKyAgICBfcGFyYW1zLmdhbW1hID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIGtlcm5lbF9ub2RlLCAiZ2FtbWEiLCAwICk7CisgICAgX3BhcmFtcy5jb2VmMCA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBrZXJuZWxfbm9kZSwgImNvZWYwIiwgMCApOworCisgICAgX3BhcmFtcy5DID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAiQyIsIDAgKTsKKyAgICBfcGFyYW1zLm51ID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAibnUiLCAwICk7CisgICAgX3BhcmFtcy5wID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAicCIsIDAgKTsKKyAgICBfcGFyYW1zLmNsYXNzX3dlaWdodHMgPSAwOworCisgICAgdG1wX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgc3ZtX25vZGUsICJ0ZXJtX2NyaXRlcmlhIiApOworICAgIGlmKCB0bXBfbm9kZSApCisgICAgeworICAgICAgICBfcGFyYW1zLnRlcm1fY3JpdC5lcHNpbG9uID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIHRtcF9ub2RlLCAiZXBzaWxvbiIsIC0xLiApOworICAgICAgICBfcGFyYW1zLnRlcm1fY3JpdC5tYXhfaXRlciA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHRtcF9ub2RlLCAiaXRlcmF0aW9ucyIsIC0xICk7CisgICAgICAgIF9wYXJhbXMudGVybV9jcml0LnR5cGUgPSAoX3BhcmFtcy50ZXJtX2NyaXQuZXBzaWxvbiA+PSAwID8gQ1ZfVEVSTUNSSVRfRVBTIDogMCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfcGFyYW1zLnRlcm1fY3JpdC5tYXhfaXRlciA+PSAwID8gQ1ZfVEVSTUNSSVRfSVRFUiA6IDApOworICAgIH0KKyAgICBlbHNlCisgICAgICAgIF9wYXJhbXMudGVybV9jcml0ID0gY3ZUZXJtQ3JpdGVyaWEoIENWX1RFUk1DUklUX0VQUyArIENWX1RFUk1DUklUX0lURVIsIDEwMDAsIEZMVF9FUFNJTE9OICk7CisKKyAgICBzZXRfcGFyYW1zKCBfcGFyYW1zICk7CisKKyAgICBfX0VORF9fOworfQorCisKK3ZvaWQgQ3ZTVk06OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBzdm1fbm9kZSApCit7CisgICAgY29uc3QgZG91YmxlIG5vdF9mb3VuZF9kYmwgPSBEQkxfTUFYOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdlNWTTo6cmVhZCIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGludCBpLCB2YXJfY291bnQsIGRmX2NvdW50LCBjbGFzc19jb3VudDsKKyAgICBpbnQgYmxvY2tfc2l6ZSA9IDEgPDwgMTYsIHN2X3NpemU7CisgICAgQ3ZGaWxlTm9kZSAqc3Zfbm9kZSwgKmRmX25vZGU7CisgICAgQ3ZTVk1EZWNpc2lvbkZ1bmMqIGRmOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKworICAgIGlmKCAhc3ZtX25vZGUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIlRoZSByZXF1ZXN0ZWQgZWxlbWVudCBpcyBub3QgZm91bmQiICk7CisKKyAgICBjbGVhcigpOworCisgICAgLy8gcmVhZCBTVk0gcGFyYW1ldGVycworICAgIHJlYWRfcGFyYW1zKCBmcywgc3ZtX25vZGUgKTsKKworICAgIC8vIGFuZCB0b3AtbGV2ZWwgZGF0YQorICAgIHN2X3RvdGFsID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgc3ZtX25vZGUsICJzdl90b3RhbCIsIC0xICk7CisgICAgdmFyX2FsbCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAidmFyX2FsbCIsIC0xICk7CisgICAgdmFyX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgc3ZtX25vZGUsICJ2YXJfY291bnQiLCB2YXJfYWxsICk7CisgICAgY2xhc3NfY291bnQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBzdm1fbm9kZSwgImNsYXNzX2NvdW50IiwgMCApOworCisgICAgaWYoIHN2X3RvdGFsIDw9IDAgfHwgdmFyX2FsbCA8PSAwIHx8IHZhcl9jb3VudCA8PSAwIHx8IHZhcl9jb3VudCA+IHZhcl9hbGwgfHwgY2xhc3NfY291bnQgPCAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJTVk0gbW9kZWwgZGF0YSBpcyBpbnZhbGlkLCBjaGVjayBzdl9jb3VudCwgdmFyXyogYW5kIGNsYXNzX2NvdW50IHRhZ3MiICk7CisKKyAgICBDVl9DQUxMKCBjbGFzc19sYWJlbHMgPSAoQ3ZNYXQqKWN2UmVhZEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAiY2xhc3NfbGFiZWxzIiApKTsKKyAgICBDVl9DQUxMKCBjbGFzc193ZWlnaHRzID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCBzdm1fbm9kZSwgImNsYXNzX3dlaWdodHMiICkpOworICAgIENWX0NBTEwoIHZhcl9pZHggPSAoQ3ZNYXQqKWN2UmVhZEJ5TmFtZSggZnMsIHN2bV9ub2RlLCAiY29tcF9pZHgiICkpOworCisgICAgaWYoIGNsYXNzX2NvdW50ID4gMSAmJiAoIWNsYXNzX2xhYmVscyB8fAorICAgICAgICAhQ1ZfSVNfTUFUKGNsYXNzX2xhYmVscykgfHwgY2xhc3NfbGFiZWxzLT5jb2xzICE9IGNsYXNzX2NvdW50KSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJBcnJheSBvZiBjbGFzcyBsYWJlbHMgaXMgbWlzc2luZyBvciBpbnZhbGlkIiApOworCisgICAgaWYoIHZhcl9jb3VudCA8IHZhcl9hbGwgJiYgKCF2YXJfaWR4IHx8ICFDVl9JU19NQVQodmFyX2lkeCkgfHwgdmFyX2lkeC0+Y29scyAhPSB2YXJfY291bnQpICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJ2YXJfaWR4IGFycmF5IGlzIG1pc3Npbmcgb3IgaW52YWxpZCIgKTsKKworICAgIC8vIHJlYWQgc3VwcG9ydCB2ZWN0b3JzCisgICAgc3Zfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBzdm1fbm9kZSwgInN1cHBvcnRfdmVjdG9ycyIgKTsKKyAgICBpZiggIXN2X25vZGUgfHwgIUNWX05PREVfSVNfU0VRKHN2X25vZGUtPnRhZykpCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAiTWlzc2luZyBvciBpbnZhbGlkIHNlcXVlbmNlIG9mIHN1cHBvcnQgdmVjdG9ycyIgKTsKKworICAgIGJsb2NrX3NpemUgPSBNQVgoIGJsb2NrX3NpemUsIHN2X3RvdGFsKihpbnQpc2l6ZW9mKEN2U1ZNS2VybmVsUm93KSk7CisgICAgYmxvY2tfc2l6ZSA9IE1BWCggYmxvY2tfc2l6ZSwgc3ZfdG90YWwqMiooaW50KXNpemVvZihkb3VibGUpKTsKKyAgICBibG9ja19zaXplID0gTUFYKCBibG9ja19zaXplLCB2YXJfYWxsKihpbnQpc2l6ZW9mKGRvdWJsZSkpOworICAgIENWX0NBTEwoIHN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIGJsb2NrX3NpemUgKSk7CisgICAgQ1ZfQ0FMTCggc3YgPSAoZmxvYXQqKiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfdG90YWwqc2l6ZW9mKHN2WzBdKSApKTsKKworICAgIENWX0NBTEwoIGN2U3RhcnRSZWFkU2VxKCBzdl9ub2RlLT5kYXRhLnNlcSwgJnJlYWRlciwgMCApKTsKKyAgICBzdl9zaXplID0gdmFyX2NvdW50KnNpemVvZihzdlswXVswXSk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgc3ZfdG90YWw7IGkrKyApCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBzdl9lbGVtID0gKEN2RmlsZU5vZGUqKXJlYWRlci5wdHI7CisgICAgICAgIENWX0FTU0VSVCggdmFyX2NvdW50ID09IDEgfHwgKENWX05PREVfSVNfU0VRKHN2X2VsZW0tPnRhZykgJiYKKyAgICAgICAgICAgICAgICAgICBzdl9lbGVtLT5kYXRhLnNlcS0+dG90YWwgPT0gdmFyX2NvdW50KSApOworCisgICAgICAgIENWX0NBTEwoIHN2W2ldID0gKGZsb2F0Kiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwgc3Zfc2l6ZSApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZSZWFkUmF3RGF0YSggZnMsIHN2X2VsZW0sIHN2W2ldLCAiZiIgKSk7CisgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHN2X25vZGUtPmRhdGEuc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIC8vIHJlYWQgZGVjaXNpb24gZnVuY3Rpb25zCisgICAgZGZfY291bnQgPSBjbGFzc19jb3VudCA+IDEgPyBjbGFzc19jb3VudCooY2xhc3NfY291bnQtMSkvMiA6IDE7CisgICAgZGZfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBzdm1fbm9kZSwgImRlY2lzaW9uX2Z1bmN0aW9ucyIgKTsKKyAgICBpZiggIWRmX25vZGUgfHwgIUNWX05PREVfSVNfU0VRKGRmX25vZGUtPnRhZykgfHwKKyAgICAgICAgZGZfbm9kZS0+ZGF0YS5zZXEtPnRvdGFsICE9IGRmX2NvdW50ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJkZWNpc2lvbl9mdW5jdGlvbnMgaXMgbWlzc2luZyBvciBpcyBub3QgYSBjb2xsZWN0aW9uICIKKyAgICAgICAgICAgICAgICAgICJvciBoYXMgYSB3cm9uZyBudW1iZXIgb2YgZWxlbWVudHMiICk7CisKKyAgICBDVl9DQUxMKCBkZiA9IGRlY2lzaW9uX2Z1bmMgPSAoQ3ZTVk1EZWNpc2lvbkZ1bmMqKWN2QWxsb2MoIGRmX2NvdW50KnNpemVvZihkZlswXSkgKSk7CisgICAgY3ZTdGFydFJlYWRTZXEoIGRmX25vZGUtPmRhdGEuc2VxLCAmcmVhZGVyLCAwICk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgZGZfY291bnQ7IGkrKyApCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBkZl9lbGVtID0gKEN2RmlsZU5vZGUqKXJlYWRlci5wdHI7CisgICAgICAgIEN2RmlsZU5vZGUqIGFscGhhX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgZGZfZWxlbSwgImFscGhhIiApOworCisgICAgICAgIGludCBzdl9jb3VudCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGRmX2VsZW0sICJzdl9jb3VudCIsIC0xICk7CisgICAgICAgIGlmKCBzdl9jb3VudCA8PSAwICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAic3ZfY291bnQgaXMgbWlzc2luZyBvciBub24tcG9zaXRpdmUiICk7CisgICAgICAgIGRmW2ldLnN2X2NvdW50ID0gc3ZfY291bnQ7CisKKyAgICAgICAgZGZbaV0ucmhvID0gY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIGRmX2VsZW0sICJyaG8iLCBub3RfZm91bmRfZGJsICk7CisgICAgICAgIGlmKCBmYWJzKGRmW2ldLnJobyAtIG5vdF9mb3VuZF9kYmwpIDwgREJMX0VQU0lMT04gKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJyaG8gaXMgbWlzc2luZyIgKTsKKworICAgICAgICBpZiggIWFscGhhX25vZGUgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJhbHBoYSBpcyBtaXNzaW5nIGluIHRoZSBkZWNpc2lvbiBmdW5jdGlvbiIgKTsKKworICAgICAgICBDVl9DQUxMKCBkZltpXS5hbHBoYSA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKCBzdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2X2NvdW50KnNpemVvZihkZltpXS5hbHBoYVswXSkpKTsKKyAgICAgICAgQ1ZfQVNTRVJUKCBzdl9jb3VudCA9PSAxIHx8IENWX05PREVfSVNfU0VRKGFscGhhX25vZGUtPnRhZykgJiYKKyAgICAgICAgICAgICAgICAgICBhbHBoYV9ub2RlLT5kYXRhLnNlcS0+dG90YWwgPT0gc3ZfY291bnQgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZSZWFkUmF3RGF0YSggZnMsIGFscGhhX25vZGUsIGRmW2ldLmFscGhhLCAiZCIgKSk7CisKKyAgICAgICAgaWYoIGNsYXNzX2NvdW50ID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2RmlsZU5vZGUqIGluZGV4X25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgZGZfZWxlbSwgImluZGV4IiApOworICAgICAgICAgICAgaWYoICFpbmRleF9ub2RlICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgImluZGV4IGlzIG1pc3NpbmcgaW4gdGhlIGRlY2lzaW9uIGZ1bmN0aW9uIiApOworICAgICAgICAgICAgQ1ZfQ0FMTCggZGZbaV0uc3ZfaW5kZXggPSAoaW50Kiljdk1lbVN0b3JhZ2VBbGxvYyggc3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfY291bnQqc2l6ZW9mKGRmW2ldLnN2X2luZGV4WzBdKSkpOworICAgICAgICAgICAgQ1ZfQVNTRVJUKCBzdl9jb3VudCA9PSAxIHx8IENWX05PREVfSVNfU0VRKGluZGV4X25vZGUtPnRhZykgJiYKKyAgICAgICAgICAgICAgICAgICBpbmRleF9ub2RlLT5kYXRhLnNlcS0+dG90YWwgPT0gc3ZfY291bnQgKTsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2UmVhZFJhd0RhdGEoIGZzLCBpbmRleF9ub2RlLCBkZltpXS5zdl9pbmRleCwgImkiICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRmW2ldLnN2X2luZGV4ID0gMDsKKworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCBkZl9ub2RlLT5kYXRhLnNlcS0+ZWxlbV9zaXplLCByZWFkZXIgKTsKKyAgICB9CisKKyAgICBjcmVhdGVfa2VybmVsKCk7CisKKyAgICBfX0VORF9fOworfQorCisjaWYgMAorCitzdGF0aWMgdm9pZCoKK2ljdkNsb25lU1ZNKCBjb25zdCB2b2lkKiBfc3JjICkKK3sKKyAgICBDdlNWTU1vZGVsKiBkc3QgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJpY3ZDbG9uZVNWTSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGNvbnN0IEN2U1ZNTW9kZWwqIHNyYyA9IChjb25zdCBDdlNWTU1vZGVsKilfc3JjOworICAgIGludCB2YXJfY291bnQsIGNsYXNzX2NvdW50OworICAgIGludCBpLCBzdl90b3RhbCwgZGZfY291bnQ7CisgICAgaW50IHN2X3NpemU7CisKKyAgICBpZiggIUNWX0lTX1NWTShzcmMpICkKKyAgICAgICAgQ1ZfRVJST1IoICFzcmMgPyBDVl9TdHNOdWxsUHRyIDogQ1ZfU3RzQmFkQXJnLCAiSW5wdXQgcG9pbnRlciBpcyBOVUxMIG9yIGludmFsaWQiICk7CisKKyAgICAvLyAwLiBjcmVhdGUgaW5pdGlhbCBDdlNWTU1vZGVsIHN0cnVjdHVyZQorICAgIENWX0NBTEwoIGRzdCA9IGljdkNyZWF0ZVNWTSgpICk7CisgICAgZHN0LT5wYXJhbXMgPSBzcmMtPnBhcmFtczsKKyAgICBkc3QtPnBhcmFtcy53ZWlnaHRfbGFiZWxzID0gMDsKKyAgICBkc3QtPnBhcmFtcy53ZWlnaHRzID0gMDsKKworICAgIGRzdC0+dmFyX2FsbCA9IHNyYy0+dmFyX2FsbDsKKyAgICBpZiggc3JjLT5jbGFzc19sYWJlbHMgKQorICAgICAgICBkc3QtPmNsYXNzX2xhYmVscyA9IGN2Q2xvbmVNYXQoIHNyYy0+Y2xhc3NfbGFiZWxzICk7CisgICAgaWYoIHNyYy0+Y2xhc3Nfd2VpZ2h0cyApCisgICAgICAgIGRzdC0+Y2xhc3Nfd2VpZ2h0cyA9IGN2Q2xvbmVNYXQoIHNyYy0+Y2xhc3Nfd2VpZ2h0cyApOworICAgIGlmKCBzcmMtPmNvbXBfaWR4ICkKKyAgICAgICAgZHN0LT5jb21wX2lkeCA9IGN2Q2xvbmVNYXQoIHNyYy0+Y29tcF9pZHggKTsKKworICAgIHZhcl9jb3VudCA9IHNyYy0+Y29tcF9pZHggPyBzcmMtPmNvbXBfaWR4LT5jb2xzIDogc3JjLT52YXJfYWxsOworICAgIGNsYXNzX2NvdW50ID0gc3JjLT5jbGFzc19sYWJlbHMgPyBzcmMtPmNsYXNzX2xhYmVscy0+Y29scyA6CisgICAgICAgICAgICAgICAgICBzcmMtPnBhcmFtcy5zdm1fdHlwZSA9PSBDdlNWTTo6T05FX0NMQVNTID8gMSA6IDA7CisgICAgc3ZfdG90YWwgPSBkc3QtPnN2X3RvdGFsID0gc3JjLT5zdl90b3RhbDsKKyAgICBDVl9DQUxMKCBkc3QtPnN0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIHNyYy0+c3RvcmFnZS0+YmxvY2tfc2l6ZSApKTsKKyAgICBDVl9DQUxMKCBkc3QtPnN2ID0gKGZsb2F0KiopY3ZNZW1TdG9yYWdlQWxsb2MoIGRzdC0+c3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2X3RvdGFsKnNpemVvZihkc3QtPnN2WzBdKSApKTsKKworICAgIHN2X3NpemUgPSB2YXJfY291bnQqc2l6ZW9mKGRzdC0+c3ZbMF1bMF0pOworCisgICAgZm9yKCBpID0gMDsgaSA8IHN2X3RvdGFsOyBpKysgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggZHN0LT5zdltpXSA9IChmbG9hdCopY3ZNZW1TdG9yYWdlQWxsb2MoIGRzdC0+c3RvcmFnZSwgc3Zfc2l6ZSApKTsKKyAgICAgICAgbWVtY3B5KCBkc3QtPnN2W2ldLCBzcmMtPnN2W2ldLCBzdl9zaXplICk7CisgICAgfQorCisgICAgZGZfY291bnQgPSBjbGFzc19jb3VudCA+IDEgPyBjbGFzc19jb3VudCooY2xhc3NfY291bnQtMSkvMiA6IDE7CisKKyAgICBDVl9DQUxMKCBkc3QtPmRlY2lzaW9uX2Z1bmMgPSBjdkFsbG9jKCBkZl9jb3VudCpzaXplb2YoQ3ZTVk1EZWNpc2lvbkZ1bmMpICkpOworCisgICAgZm9yKCBpID0gMDsgaSA8IGRmX2NvdW50OyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgQ3ZTVk1EZWNpc2lvbkZ1bmMgKnNkZiA9CisgICAgICAgICAgICAoY29uc3QgQ3ZTVk1EZWNpc2lvbkZ1bmMqKXNyYy0+ZGVjaXNpb25fZnVuYytpOworICAgICAgICBDdlNWTURlY2lzaW9uRnVuYyAqZGRmID0KKyAgICAgICAgICAgIChDdlNWTURlY2lzaW9uRnVuYyopZHN0LT5kZWNpc2lvbl9mdW5jK2k7CisgICAgICAgIGludCBzdl9jb3VudCA9IHNkZi0+c3ZfY291bnQ7CisgICAgICAgIGRkZi0+c3ZfY291bnQgPSBzdl9jb3VudDsKKyAgICAgICAgZGRmLT5yaG8gPSBzZGYtPnJobzsKKyAgICAgICAgQ1ZfQ0FMTCggZGRmLT5hbHBoYSA9IChkb3VibGUqKWN2TWVtU3RvcmFnZUFsbG9jKCBkc3QtPnN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZfY291bnQqc2l6ZW9mKGRkZi0+YWxwaGFbMF0pKSk7CisgICAgICAgIG1lbWNweSggZGRmLT5hbHBoYSwgc2RmLT5hbHBoYSwgc3ZfY291bnQqc2l6ZW9mKGRkZi0+YWxwaGFbMF0pKTsKKworICAgICAgICBpZiggY2xhc3NfY291bnQgPiAxICkKKyAgICAgICAgeworICAgICAgICAgICAgQ1ZfQ0FMTCggZGRmLT5zdl9pbmRleCA9IChpbnQqKWN2TWVtU3RvcmFnZUFsbG9jKCBkc3QtPnN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdl9jb3VudCpzaXplb2YoZGRmLT5zdl9pbmRleFswXSkpKTsKKyAgICAgICAgICAgIG1lbWNweSggZGRmLT5zdl9pbmRleCwgc2RmLT5zdl9pbmRleCwgc3ZfY291bnQqc2l6ZW9mKGRkZi0+c3ZfaW5kZXhbMF0pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBkZGYtPnN2X2luZGV4ID0gMDsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICYmIGRzdCApCisgICAgICAgIGljdlJlbGVhc2VTVk0oICZkc3QgKTsKKworICAgIHJldHVybiBkc3Q7Cit9CisKK3N0YXRpYyBpbnQgaWN2UmVnaXN0ZXJTVk1UeXBlKCkKK3sKKyAgICBDdlR5cGVJbmZvIGluZm87CisgICAgbWVtc2V0KCAmaW5mbywgMCwgc2l6ZW9mKGluZm8pICk7CisKKyAgICBpbmZvLmZsYWdzID0gMDsKKyAgICBpbmZvLmhlYWRlcl9zaXplID0gc2l6ZW9mKCBpbmZvICk7CisgICAgaW5mby5pc19pbnN0YW5jZSA9IGljdklzU1ZNOworICAgIGluZm8ucmVsZWFzZSA9IChDdlJlbGVhc2VGdW5jKWljdlJlbGVhc2VTVk07CisgICAgaW5mby5yZWFkID0gaWN2UmVhZFNWTTsKKyAgICBpbmZvLndyaXRlID0gaWN2V3JpdGVTVk07CisgICAgaW5mby5jbG9uZSA9IGljdkNsb25lU1ZNOworICAgIGluZm8udHlwZV9uYW1lID0gQ1ZfVFlQRV9OQU1FX01MX1NWTTsKKyAgICBjdlJlZ2lzdGVyVHlwZSggJmluZm8gKTsKKworICAgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBpbnQgc3ZtID0gaWN2UmVnaXN0ZXJTVk1UeXBlKCk7CisKKy8qIFRoZSBmdW5jdGlvbiB0cmFpbnMgU1ZNIG1vZGVsIHdpdGggb3B0aW1hbCBwYXJhbWV0ZXJzLCBvYnRhaW5lZCBieSB1c2luZyBjcm9zcy12YWxpZGF0aW9uLgorVGhlIHBhcmFtZXRlcnMgdG8gYmUgZXN0aW1hdGVkIHNob3VsZCBiZSBpbmRpY2F0ZWQgYnkgc2V0dGluZyB0aGVpcnMgdmFsdWVzIHRvIEZMVF9NQVguCitUaGUgb3B0aW1hbCBwYXJhbWV0ZXJzIGFyZSBzYXZlZCBpbiA8bW9kZWxfcGFyYW1zPiAqLworQ1ZfSU1QTCBDdlN0YXRNb2RlbCoKK2N2VHJhaW5TVk1fQ3Jvc3NWYWxpZGF0aW9uKCBjb25zdCBDdk1hdCogdHJhaW5fZGF0YSwgaW50IHRmbGFnLAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHJlc3BvbnNlcywKKyAgICAgICAgICAgIEN2U3RhdE1vZGVsUGFyYW1zKiBtb2RlbF9wYXJhbXMsCisgICAgICAgICAgICBjb25zdCBDdlN0YXRNb2RlbFBhcmFtcyogY3Jvc3NfdmFsaWRfcGFyYW1zLAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIGNvbXBfaWR4LAorICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIHNhbXBsZV9pZHgsCisgICAgICAgICAgICBjb25zdCBDdlBhcmFtR3JpZCogZGVncmVlX2dyaWQsCisgICAgICAgICAgICBjb25zdCBDdlBhcmFtR3JpZCogZ2FtbWFfZ3JpZCwKKyAgICAgICAgICAgIGNvbnN0IEN2UGFyYW1HcmlkKiBjb2VmX2dyaWQsCisgICAgICAgICAgICBjb25zdCBDdlBhcmFtR3JpZCogQ19ncmlkLAorICAgICAgICAgICAgY29uc3QgQ3ZQYXJhbUdyaWQqIG51X2dyaWQsCisgICAgICAgICAgICBjb25zdCBDdlBhcmFtR3JpZCogcF9ncmlkICkKK3sKKyAgICBDdlN0YXRNb2RlbCogc3ZtID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCJjdlRhaW5TVk1Dcm9zc1ZhbGlkYXRpb24iKTsKKyAgICBfX0JFR0lOX187CisKKyAgICBkb3VibGUgZGVncmVlX3N0ZXAgPSA3LAorCSAgICAgICBnX3N0ZXAgICAgICA9IDE1LAorCQkgICBjb2VmX3N0ZXAgICA9IDE0LAorCQkgICBDX3N0ZXAgICAgICA9IDIwLAorCQkgICBudV9zdGVwICAgICA9IDUsCisJCSAgIHBfc3RlcCAgICAgID0gNzsgLy8gYWxsIHN0ZXBzIG11c3QgYmUgPiAxCisgICAgZG91YmxlIGRlZ3JlZV9iZWdpbiA9IDAuMDEsIGRlZ3JlZV9lbmQgPSAyOworICAgIGRvdWJsZSBnX2JlZ2luICAgICAgPSAxZS01LCBnX2VuZCAgICAgID0gMC41OworICAgIGRvdWJsZSBjb2VmX2JlZ2luICAgPSAwLjEsICBjb2VmX2VuZCAgID0gMzAwOworICAgIGRvdWJsZSBDX2JlZ2luICAgICAgPSAwLjEsICBDX2VuZCAgICAgID0gNjAwMDsKKyAgICBkb3VibGUgbnVfYmVnaW4gICAgID0gMC4wMSwgIG51X2VuZCAgICA9IDAuNDsKKyAgICBkb3VibGUgcF9iZWdpbiAgICAgID0gMC4wMSwgcF9lbmQgICAgICA9IDEwMDsKKworICAgIGRvdWJsZSByYXRlID0gMCwgZ2FtbWEgPSAwLCBDID0gMCwgZGVncmVlID0gMCwgY29lZiA9IDAsIHAgPSAwLCBudSA9IDA7CisKKwlkb3VibGUgYmVzdF9yYXRlICAgID0gMDsKKyAgICBkb3VibGUgYmVzdF9kZWdyZWUgID0gZGVncmVlX2JlZ2luOworICAgIGRvdWJsZSBiZXN0X2dhbW1hICAgPSBnX2JlZ2luOworICAgIGRvdWJsZSBiZXN0X2NvZWYgICAgPSBjb2VmX2JlZ2luOworCWRvdWJsZSBiZXN0X0MgICAgICAgPSBDX2JlZ2luOworCWRvdWJsZSBiZXN0X251ICAgICAgPSBudV9iZWdpbjsKKyAgICBkb3VibGUgYmVzdF9wICAgICAgID0gcF9iZWdpbjsKKworICAgIEN2U1ZNTW9kZWxQYXJhbXMgc3ZtX3BhcmFtcywgKnBzdm1fcGFyYW1zOworICAgIEN2Q3Jvc3NWYWxpZGF0aW9uUGFyYW1zKiBjdl9wYXJhbXMgPSAoQ3ZDcm9zc1ZhbGlkYXRpb25QYXJhbXMqKWNyb3NzX3ZhbGlkX3BhcmFtczsKKyAgICBpbnQgc3ZtX3R5cGUsIGtlcm5lbDsKKyAgICBpbnQgaXNfcmVncmVzc2lvbjsKKworICAgIGlmKCAhbW9kZWxfcGFyYW1zICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIiIgKTsKKyAgICBpZiggIWN2X3BhcmFtcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICIiICk7CisKKyAgICBzdm1fcGFyYW1zID0gKihDdlNWTU1vZGVsUGFyYW1zKiltb2RlbF9wYXJhbXM7CisgICAgcHN2bV9wYXJhbXMgPSAoQ3ZTVk1Nb2RlbFBhcmFtcyopbW9kZWxfcGFyYW1zOworICAgIHN2bV90eXBlID0gc3ZtX3BhcmFtcy5zdm1fdHlwZTsKKyAgICBrZXJuZWwgPSBzdm1fcGFyYW1zLmtlcm5lbF90eXBlOworCisgICAgc3ZtX3BhcmFtcy5kZWdyZWUgPSBzdm1fcGFyYW1zLmRlZ3JlZSA+IDAgPyBzdm1fcGFyYW1zLmRlZ3JlZSA6IDE7CisgICAgc3ZtX3BhcmFtcy5nYW1tYSA9IHN2bV9wYXJhbXMuZ2FtbWEgPiAwID8gc3ZtX3BhcmFtcy5nYW1tYSA6IDE7CisgICAgc3ZtX3BhcmFtcy5jb2VmMCA9IHN2bV9wYXJhbXMuY29lZjAgPiAwID8gc3ZtX3BhcmFtcy5jb2VmMCA6IDFlLTY7CisgICAgc3ZtX3BhcmFtcy5DID0gc3ZtX3BhcmFtcy5DID4gMCA/IHN2bV9wYXJhbXMuQyA6IDE7CisgICAgc3ZtX3BhcmFtcy5udSA9IHN2bV9wYXJhbXMubnUgPiAwID8gc3ZtX3BhcmFtcy5udSA6IDE7CisgICAgc3ZtX3BhcmFtcy5wID0gc3ZtX3BhcmFtcy5wID4gMCA/IHN2bV9wYXJhbXMucCA6IDE7CisKKyAgICBpZiggZGVncmVlX2dyaWQgKQorICAgIHsKKyAgICAgICAgaWYoICEoZGVncmVlX2dyaWQtPm1heF92YWwgPT0gMCAmJiBkZWdyZWVfZ3JpZC0+bWluX3ZhbCA9PSAwICYmCisgICAgICAgICAgICAgIGRlZ3JlZV9ncmlkLT5zdGVwID09IDApICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGRlZ3JlZV9ncmlkLT5taW5fdmFsID4gZGVncmVlX2dyaWQtPm1heF92YWwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgImxvdyBib3VuZCBvZiBncmlkIHNob3VsZCBiZSBsZXNzIHRoZW4gdGhlIHVwcGVyIG9uZSIpOworICAgICAgICAgICAgaWYoIGRlZ3JlZV9ncmlkLT5zdGVwIDw9IDEgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJncmlkIHN0ZXAgc2hvdWxkIGJlIGdyZWF0ZXIgMSIgKTsKKyAgICAgICAgICAgIGRlZ3JlZV9iZWdpbiA9IGRlZ3JlZV9ncmlkLT5taW5fdmFsOworICAgICAgICAgICAgZGVncmVlX2VuZCAgID0gZGVncmVlX2dyaWQtPm1heF92YWw7CisgICAgICAgICAgICBkZWdyZWVfc3RlcCAgPSBkZWdyZWVfZ3JpZC0+c3RlcDsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIGRlZ3JlZV9iZWdpbiA9IGRlZ3JlZV9lbmQgPSBzdm1fcGFyYW1zLmRlZ3JlZTsKKworICAgIGlmKCBnYW1tYV9ncmlkICkKKyAgICB7CisgICAgICAgIGlmKCAhKGdhbW1hX2dyaWQtPm1heF92YWwgPT0gMCAmJiBnYW1tYV9ncmlkLT5taW5fdmFsID09IDAgJiYKKyAgICAgICAgICAgICAgZ2FtbWFfZ3JpZC0+c3RlcCA9PSAwKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBnYW1tYV9ncmlkLT5taW5fdmFsID4gZ2FtbWFfZ3JpZC0+bWF4X3ZhbCApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywKKyAgICAgICAgICAgICAgICAibG93IGJvdW5kIG9mIGdyaWQgc2hvdWxkIGJlIGxlc3MgdGhlbiB0aGUgdXBwZXIgb25lIik7CisgICAgICAgICAgICBpZiggZ2FtbWFfZ3JpZC0+c3RlcCA8PSAxICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZ3JpZCBzdGVwIHNob3VsZCBiZSBncmVhdGVyIDEiICk7CisgICAgICAgICAgICBnX2JlZ2luID0gZ2FtbWFfZ3JpZC0+bWluX3ZhbDsKKyAgICAgICAgICAgIGdfZW5kICAgPSBnYW1tYV9ncmlkLT5tYXhfdmFsOworICAgICAgICAgICAgZ19zdGVwICA9IGdhbW1hX2dyaWQtPnN0ZXA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBnX2JlZ2luID0gZ19lbmQgPSBzdm1fcGFyYW1zLmdhbW1hOworCisgICAgaWYoIGNvZWZfZ3JpZCApCisgICAgeworICAgICAgICBpZiggIShjb2VmX2dyaWQtPm1heF92YWwgPT0gMCAmJiBjb2VmX2dyaWQtPm1pbl92YWwgPT0gMCAmJgorICAgICAgICAgICAgICBjb2VmX2dyaWQtPnN0ZXAgPT0gMCkgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29lZl9ncmlkLT5taW5fdmFsID4gY29lZl9ncmlkLT5tYXhfdmFsICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICJsb3cgYm91bmQgb2YgZ3JpZCBzaG91bGQgYmUgbGVzcyB0aGVuIHRoZSB1cHBlciBvbmUiKTsKKyAgICAgICAgICAgIGlmKCBjb2VmX2dyaWQtPnN0ZXAgPD0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImdyaWQgc3RlcCBzaG91bGQgYmUgZ3JlYXRlciAxIiApOworICAgICAgICAgICAgY29lZl9iZWdpbiA9IGNvZWZfZ3JpZC0+bWluX3ZhbDsKKyAgICAgICAgICAgIGNvZWZfZW5kICAgPSBjb2VmX2dyaWQtPm1heF92YWw7CisgICAgICAgICAgICBjb2VmX3N0ZXAgID0gY29lZl9ncmlkLT5zdGVwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY29lZl9iZWdpbiA9IGNvZWZfZW5kID0gc3ZtX3BhcmFtcy5jb2VmMDsKKworICAgIGlmKCBDX2dyaWQgKQorICAgIHsKKyAgICAgICAgaWYoICEoQ19ncmlkLT5tYXhfdmFsID09IDAgJiYgQ19ncmlkLT5taW5fdmFsID09IDAgJiYgQ19ncmlkLT5zdGVwID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggQ19ncmlkLT5taW5fdmFsID4gQ19ncmlkLT5tYXhfdmFsICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICJsb3cgYm91bmQgb2YgZ3JpZCBzaG91bGQgYmUgbGVzcyB0aGVuIHRoZSB1cHBlciBvbmUiKTsKKyAgICAgICAgICAgIGlmKCBDX2dyaWQtPnN0ZXAgPD0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImdyaWQgc3RlcCBzaG91bGQgYmUgZ3JlYXRlciAxIiApOworICAgICAgICAgICAgQ19iZWdpbiA9IENfZ3JpZC0+bWluX3ZhbDsKKyAgICAgICAgICAgIENfZW5kICAgPSBDX2dyaWQtPm1heF92YWw7CisgICAgICAgICAgICBDX3N0ZXAgID0gQ19ncmlkLT5zdGVwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgQ19iZWdpbiA9IENfZW5kID0gc3ZtX3BhcmFtcy5DOworCisgICAgaWYoIG51X2dyaWQgKQorICAgIHsKKyAgICAgICAgaWYoIShudV9ncmlkLT5tYXhfdmFsID09IDAgJiYgbnVfZ3JpZC0+bWluX3ZhbCA9PSAwICYmIG51X2dyaWQtPnN0ZXA9PTApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbnVfZ3JpZC0+bWluX3ZhbCA+IG51X2dyaWQtPm1heF92YWwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgImxvdyBib3VuZCBvZiBncmlkIHNob3VsZCBiZSBsZXNzIHRoZW4gdGhlIHVwcGVyIG9uZSIpOworICAgICAgICAgICAgaWYoIG51X2dyaWQtPnN0ZXAgPD0gMSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgImdyaWQgc3RlcCBzaG91bGQgYmUgZ3JlYXRlciAxIiApOworICAgICAgICAgICAgbnVfYmVnaW4gPSBudV9ncmlkLT5taW5fdmFsOworICAgICAgICAgICAgbnVfZW5kICAgPSBudV9ncmlkLT5tYXhfdmFsOworICAgICAgICAgICAgbnVfc3RlcCAgPSBudV9ncmlkLT5zdGVwOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgbnVfYmVnaW4gPSBudV9lbmQgPSBzdm1fcGFyYW1zLm51OworCisgICAgaWYoIHBfZ3JpZCApCisgICAgeworICAgICAgICBpZiggIShwX2dyaWQtPm1heF92YWwgPT0gMCAmJiBwX2dyaWQtPm1pbl92YWwgPT0gMCAmJiBwX2dyaWQtPnN0ZXAgPT0gMCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBwX2dyaWQtPm1pbl92YWwgPiBwX2dyaWQtPm1heF92YWwgKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsCisgICAgICAgICAgICAgICAgImxvdyBib3VuZCBvZiBncmlkIHNob3VsZCBiZSBsZXNzIHRoZW4gdGhlIHVwcGVyIG9uZSIpOworICAgICAgICAgICAgaWYoIHBfZ3JpZC0+c3RlcCA8PSAxICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiZ3JpZCBzdGVwIHNob3VsZCBiZSBncmVhdGVyIDEiICk7CisgICAgICAgICAgICBwX2JlZ2luID0gcF9ncmlkLT5taW5fdmFsOworICAgICAgICAgICAgcF9lbmQgICA9IHBfZ3JpZC0+bWF4X3ZhbDsKKyAgICAgICAgICAgIHBfc3RlcCAgPSBwX2dyaWQtPnN0ZXA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgICAgICBwX2JlZ2luID0gcF9lbmQgPSBzdm1fcGFyYW1zLnA7CisKKyAgICAvLyB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBub3QgdXNlZDoKKyAgICBpZigga2VybmVsICE9IEN2U1ZNOjpQT0xZICkKKyAgICAgICAgZGVncmVlX2JlZ2luID0gZGVncmVlX2VuZCA9IHN2bV9wYXJhbXMuZGVncmVlOworCisgICBpZigga2VybmVsID09IEN2U1ZNOjpMSU5FQVIgKQorICAgICAgICBnX2JlZ2luID0gZ19lbmQgPSBzdm1fcGFyYW1zLmdhbW1hOworCisgICAgaWYoIGtlcm5lbCAhPSBDdlNWTTo6UE9MWSAmJiBrZXJuZWwgIT0gQ3ZTVk06OlNJR01PSUQgKQorICAgICAgICBjb2VmX2JlZ2luID0gY29lZl9lbmQgPSBzdm1fcGFyYW1zLmNvZWYwOworCisgICAgaWYoIHN2bV90eXBlID09IEN2U1ZNOjpOVV9TVkMgfHwgc3ZtX3R5cGUgPT0gQ3ZTVk06Ok9ORV9DTEFTUyApCisgICAgICAgIENfYmVnaW4gPSBDX2VuZCA9IHN2bV9wYXJhbXMuQzsKKworICAgIGlmKCBzdm1fdHlwZSA9PSBDdlNWTTo6Q19TVkMgfHwgc3ZtX3R5cGUgPT0gQ3ZTVk06OkVQU19TVlIgKQorICAgICAgICBudV9iZWdpbiA9IG51X2VuZCA9IHN2bV9wYXJhbXMubnU7CisKKyAgICBpZiggc3ZtX3R5cGUgIT0gQ3ZTVk06OkVQU19TVlIgKQorICAgICAgICBwX2JlZ2luID0gcF9lbmQgPSBzdm1fcGFyYW1zLnA7CisKKyAgICBpc19yZWdyZXNzaW9uID0gY3ZfcGFyYW1zLT5pc19yZWdyZXNzaW9uOworICAgIGJlc3RfcmF0ZSA9IGlzX3JlZ3Jlc3Npb24gPyBGTFRfTUFYIDogMDsKKworICAgIGFzc2VydCggZ19zdGVwID4gMSAmJiBkZWdyZWVfc3RlcCA+IDEgJiYgY29lZl9zdGVwID4gMSk7CisgICAgYXNzZXJ0KCBwX3N0ZXAgPiAxICYmIENfc3RlcCA+IDEgJiYgbnVfc3RlcCA+IDEgKTsKKworICAgIGZvciggZGVncmVlID0gZGVncmVlX2JlZ2luOyBkZWdyZWUgPD0gZGVncmVlX2VuZDsgZGVncmVlICo9IGRlZ3JlZV9zdGVwICkKKyAgICB7CisgICAgICBzdm1fcGFyYW1zLmRlZ3JlZSA9IGRlZ3JlZTsKKyAgICAgIC8vcHJpbnRmKCJkZWdyZWUgPSAlLjNmXG4iLCBkZWdyZWUgKTsKKyAgICAgIGZvciggZ2FtbWE9IGdfYmVnaW47IGdhbW1hIDw9IGdfZW5kOyBnYW1tYSAqPSBnX3N0ZXAgKQorICAgICAgeworICAgICAgICBzdm1fcGFyYW1zLmdhbW1hID0gZ2FtbWE7CisgICAgICAgIC8vcHJpbnRmKCIgICBnYW1tYSA9ICUuM2ZcbiIsIGdhbW1hICk7CisgICAgICAgIGZvciggY29lZiA9IGNvZWZfYmVnaW47IGNvZWYgPD0gY29lZl9lbmQ7IGNvZWYgKj0gY29lZl9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgIHN2bV9wYXJhbXMuY29lZjAgPSBjb2VmOworICAgICAgICAgIC8vcHJpbnRmKCIgICAgICBjb2VmID0gJS4zZlxuIiwgY29lZiApOworICAgICAgICAgIGZvciggQyA9IENfYmVnaW47IEMgPD0gQ19lbmQ7IEMgKj0gQ19zdGVwICkKKyAgICAgICAgICB7CisgICAgICAgICAgICBzdm1fcGFyYW1zLkMgPSBDOworICAgICAgICAgICAgLy9wcmludGYoIiAgICAgICAgIEMgPSAlLjNmXG4iLCBDICk7CisgICAgICAgICAgICBmb3IoIG51ID0gbnVfYmVnaW47IG51IDw9IG51X2VuZDsgbnUgKj0gbnVfc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIHN2bV9wYXJhbXMubnUgPSBudTsKKyAgICAgICAgICAgICAgLy9wcmludGYoIiAgICAgICAgICAgIG51ID0gJS4zZlxuIiwgbnUgKTsKKyAgICAgICAgICAgICAgZm9yKCBwID0gcF9iZWdpbjsgcCA8PSBwX2VuZDsgcCAqPSBwX3N0ZXAgKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHdlbGw7CisgICAgICAgICAgICAgICAgc3ZtX3BhcmFtcy5wID0gcDsKKyAgICAgICAgICAgICAgICAvL3ByaW50ZigiICAgICAgICAgICAgICAgcCA9ICUuM2ZcbiIsIHAgKTsKKworICAgICAgICAgICAgICAgIENWX0NBTEwocmF0ZSA9IGN2Q3Jvc3NWYWxpZGF0aW9uKCB0cmFpbl9kYXRhLCB0ZmxhZywgcmVzcG9uc2VzLCAmY3ZUcmFpblNWTSwKKyAgICAgICAgICAgICAgICAgICAgY3Jvc3NfdmFsaWRfcGFyYW1zLCAoQ3ZTdGF0TW9kZWxQYXJhbXMqKSZzdm1fcGFyYW1zLCBjb21wX2lkeCwgc2FtcGxlX2lkeCApKTsKKworICAgICAgICAgICAgICAgIHdlbGwgPSAgcmF0ZSA+IGJlc3RfcmF0ZSAmJiAhaXNfcmVncmVzc2lvbiB8fCByYXRlIDwgYmVzdF9yYXRlICYmIGlzX3JlZ3Jlc3Npb247CisgICAgICAgICAgICAgICAgaWYoIHdlbGwgfHwgKHJhdGUgPT0gYmVzdF9yYXRlICYmIEMgPCBiZXN0X0MpICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfcmF0ZSAgID0gcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9kZWdyZWUgPSBkZWdyZWU7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfZ2FtbWEgID0gZ2FtbWE7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfY29lZiAgID0gY29lZjsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9DICAgICAgPSBDOworICAgICAgICAgICAgICAgICAgICBiZXN0X251ICAgICA9IG51OworICAgICAgICAgICAgICAgICAgICBiZXN0X3AgICAgICA9IHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIgICAgICAgICAgICAgICAgICByYXRlID0gJS4yZlxuIiwgcmF0ZSApOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vcHJpbnRmKCJUaGUgYmVzdDpcbnJhdGUgPSAlLjJmJSUgZGVncmVlID0gJWYgZ2FtbWEgPSAlZiBjb2VmID0gJWYgYyA9ICVmIG51ID0gJWYgcCA9ICVmXG4iLAorICAgICAgLy8gIGJlc3RfcmF0ZSwgYmVzdF9kZWdyZWUsIGJlc3RfZ2FtbWEsIGJlc3RfY29lZiwgYmVzdF9DLCBiZXN0X251LCBiZXN0X3AgKTsKKworICAgIHBzdm1fcGFyYW1zLT5DICAgICAgPSBiZXN0X0M7CisgICAgcHN2bV9wYXJhbXMtPm51ICAgICA9IGJlc3RfbnU7CisgICAgcHN2bV9wYXJhbXMtPnAgICAgICA9IGJlc3RfcDsKKyAgICBwc3ZtX3BhcmFtcy0+Z2FtbWEgID0gYmVzdF9nYW1tYTsKKyAgICBwc3ZtX3BhcmFtcy0+ZGVncmVlID0gYmVzdF9kZWdyZWU7CisgICAgcHN2bV9wYXJhbXMtPmNvZWYwICA9IGJlc3RfY29lZjsKKworICAgIENWX0NBTEwoc3ZtID0gY3ZUcmFpblNWTSggdHJhaW5fZGF0YSwgdGZsYWcsIHJlc3BvbnNlcywgbW9kZWxfcGFyYW1zLCBjb21wX2lkeCwgc2FtcGxlX2lkeCApKTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gc3ZtOworfQorCisjZW5kaWYKKworLyogRW5kIG9mIGZpbGUuICovCisKZGlmZiAtLWdpdCBhL21sL3NyYy9tbHRlc3RzZXQuY3BwIGIvbWwvc3JjL21sdGVzdHNldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk4MTBkNAotLS0gL2Rldi9udWxsCisrKyBiL21sL3NyYy9tbHRlc3RzZXQuY3BwCkBAIC0wLDAgKzEsMTcwIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfbWwuaCIKKwordHlwZWRlZiBzdHJ1Y3QgQ3ZESQoreworICAgIGRvdWJsZSBkOworICAgIGludCAgICBpOworfSBDdkRJOworCitpbnQgQ1ZfQ0RFQ0wKK2ljdkNtcERJKCBjb25zdCB2b2lkKiBhLCBjb25zdCB2b2lkKiBiLCB2b2lkKiApCit7CisgICAgY29uc3QgQ3ZESSogZTEgPSAoY29uc3QgQ3ZESSopIGE7CisgICAgY29uc3QgQ3ZESSogZTIgPSAoY29uc3QgQ3ZESSopIGI7CisKKyAgICByZXR1cm4gKGUxLT5kIDwgZTItPmQpID8gLTEgOiAoZTEtPmQgPiBlMi0+ZCk7Cit9CisKK0NWX0lNUEwgdm9pZAorY3ZDcmVhdGVUZXN0U2V0KCBpbnQgdHlwZSwgQ3ZNYXQqKiBzYW1wbGVzLAorICAgICAgICAgICAgICAgICBpbnQgbnVtX3NhbXBsZXMsCisgICAgICAgICAgICAgICAgIGludCBudW1fZmVhdHVyZXMsCisgICAgICAgICAgICAgICAgIEN2TWF0KiogcmVzcG9uc2VzLAorICAgICAgICAgICAgICAgICBpbnQgbnVtX2NsYXNzZXMsIC4uLiApCit7CisgICAgQ3ZNYXQqIG1lYW4gPSBOVUxMOworICAgIEN2TWF0KiBjb3YgPSBOVUxMOworICAgIEN2TWVtU3RvcmFnZSogc3RvcmFnZSA9IE5VTEw7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJjdkNyZWF0ZVRlc3RTZXQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpZiggc2FtcGxlcyApCisgICAgICAgICpzYW1wbGVzID0gTlVMTDsKKyAgICBpZiggcmVzcG9uc2VzICkKKyAgICAgICAgKnJlc3BvbnNlcyA9IE5VTEw7CisKKyAgICBpZiggdHlwZSAhPSBDVl9UU19DT05DRU5UUklDX1NQSEVSRVMgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAiSW52YWxpZCB0eXBlIHBhcmFtZXRlciIgKTsKKworICAgIGlmKCAhc2FtcGxlcyApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAic2FtcGxlcyBwYXJhbWV0ZXIgbXVzdCBiZSBub3QgTlVMTCIgKTsKKworICAgIGlmKCAhcmVzcG9uc2VzICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJyZXNwb25zZXMgcGFyYW1ldGVyIG11c3QgYmUgbm90IE5VTEwiICk7CisKKyAgICBpZiggbnVtX3NhbXBsZXMgPCAxICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIm51bV9zYW1wbGVzIHBhcmFtZXRlciBtdXN0IGJlIHBvc2l0aXZlIiApOworCisgICAgaWYoIG51bV9mZWF0dXJlcyA8IDEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCAibnVtX2ZlYXR1cmVzIHBhcmFtZXRlciBtdXN0IGJlIHBvc2l0aXZlIiApOworCisgICAgaWYoIG51bV9jbGFzc2VzIDwgMSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNCYWRBcmcsICJudW1fY2xhc3NlcyBwYXJhbWV0ZXIgbXVzdCBiZSBwb3NpdGl2ZSIgKTsKKworICAgIGlmKCB0eXBlID09IENWX1RTX0NPTkNFTlRSSUNfU1BIRVJFUyApCisgICAgeworICAgICAgICBDdlNlcVdyaXRlciB3cml0ZXI7CisgICAgICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICAgICAgQ3ZNYXQgc2FtcGxlOworICAgICAgICBDdkRJIGVsZW07CisgICAgICAgIEN2U2VxKiBzZXEgPSBOVUxMOworICAgICAgICBpbnQgaSwgY3VyX2NsYXNzOworCisgICAgICAgIENWX0NBTEwoICpzYW1wbGVzID0gY3ZDcmVhdGVNYXQoIG51bV9zYW1wbGVzLCBudW1fZmVhdHVyZXMsIENWXzMyRkMxICkgKTsKKyAgICAgICAgQ1ZfQ0FMTCggKnJlc3BvbnNlcyA9IGN2Q3JlYXRlTWF0KCAxLCBudW1fc2FtcGxlcywgQ1ZfMzJTQzEgKSApOworICAgICAgICBDVl9DQUxMKCBtZWFuID0gY3ZDcmVhdGVNYXQoIDEsIG51bV9mZWF0dXJlcywgQ1ZfMzJGQzEgKSApOworICAgICAgICBDVl9DQUxMKCBjdlNldFplcm8oIG1lYW4gKSApOworICAgICAgICBDVl9DQUxMKCBjb3YgPSBjdkNyZWF0ZU1hdCggbnVtX2ZlYXR1cmVzLCBudW1fZmVhdHVyZXMsIENWXzMyRkMxICkgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZTZXRJZGVudGl0eSggY292ICkgKTsKKworICAgICAgICAvKiBmaWxsIHRoZSBmZWF0dXJlIHZhbHVlcyBtYXRyaXggd2l0aCByYW5kb20gbnVtYmVycyBkcmF3biBmcm9tIHN0YW5kYXJkCisgICAgICAgICAgIG5vcm1hbCBkaXN0cmlidXRpb24gKi8KKyAgICAgICAgQ1ZfQ0FMTCggY3ZSYW5kTVZOb3JtYWwoIG1lYW4sIGNvdiwgKnNhbXBsZXMgKSApOworCisgICAgICAgIC8qIGNhbGN1bGF0ZSBkaXN0YW5jZXMgZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSBzYW1wbGVzIGFuZCBwdXQgdGhlbQorICAgICAgICAgICBpbnRvIHRoZSBzZXF1ZW5jZSBhbG9uZyB3aXRoIGluZGljZXMgKi8KKyAgICAgICAgQ1ZfQ0FMTCggc3RvcmFnZSA9IGN2Q3JlYXRlTWVtU3RvcmFnZSgpICk7CisgICAgICAgIENWX0NBTEwoIGN2U3RhcnRXcml0ZVNlcSggMCwgc2l6ZW9mKCBDdlNlcSApLCBzaXplb2YoIEN2REkgKSwgc3RvcmFnZSwgJndyaXRlciApKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8ICgqc2FtcGxlcyktPnJvd3M7ICsraSApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIGN2R2V0Um93KCAqc2FtcGxlcywgJnNhbXBsZSwgaSApKTsKKyAgICAgICAgICAgIGVsZW0uaSA9IGk7CisgICAgICAgICAgICBDVl9DQUxMKCBlbGVtLmQgPSBjdk5vcm0oICZzYW1wbGUsIE5VTEwsIENWX0wyICkpOworICAgICAgICAgICAgQ1ZfV1JJVEVfU0VRX0VMRU0oIGVsZW0sIHdyaXRlciApOworICAgICAgICB9CisgICAgICAgIENWX0NBTEwoIHNlcSA9IGN2RW5kV3JpdGVTZXEoICZ3cml0ZXIgKSApOworICAgIAorICAgICAgICAvKiBzb3J0IHRoZSBzZXF1ZW5jZSBpbiBhIGRpc3RhbmNlIGFzY2VuZGluZyBvcmRlciAqLworICAgICAgICBDVl9DQUxMKCBjdlNlcVNvcnQoIHNlcSwgaWN2Q21wREksIE5VTEwgKSApOworCisgICAgICAgIC8qIGFzc2lnbiBjbGFzcyBsYWJlbHMgKi8KKyAgICAgICAgbnVtX2NsYXNzZXMgPSBNSU4oIG51bV9zYW1wbGVzLCBudW1fY2xhc3NlcyApOworICAgICAgICBDVl9DQUxMKCBjdlN0YXJ0UmVhZFNlcSggc2VxLCAmcmVhZGVyICkgKTsKKyAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggZWxlbSwgcmVhZGVyICk7CisgICAgICAgIGZvciggaSA9IDAsIGN1cl9jbGFzcyA9IDA7IGkgPCBudW1fc2FtcGxlczsgKytjdXJfY2xhc3MgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGFzdF9pZHg7CisgICAgICAgICAgICBkb3VibGUgbWF4X2RzdDsKKyAgICAgICAgCisgICAgICAgICAgICBsYXN0X2lkeCA9IG51bV9zYW1wbGVzICogKGN1cl9jbGFzcyArIDEpIC8gbnVtX2NsYXNzZXMgLSAxOworICAgICAgICAgICAgQ1ZfQ0FMTCggbWF4X2RzdCA9ICgqKChDdkRJKikgY3ZHZXRTZXFFbGVtKCBzZXEsIGxhc3RfaWR4ICkpKS5kICk7CisgICAgICAgICAgICBtYXhfZHN0ID0gTUFYKCBtYXhfZHN0LCBlbGVtLmQgKTsKKworICAgICAgICAgICAgZm9yKCA7IGVsZW0uZCA8PSBtYXhfZHN0ICYmIGkgPCBudW1fc2FtcGxlczsgKytpICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDVl9NQVRfRUxFTSggKipyZXNwb25zZXMsIGludCwgMCwgZWxlbS5pICkgPSBjdXJfY2xhc3M7CisgICAgICAgICAgICAgICAgaWYoIGkgPCBudW1fc2FtcGxlcyAtIDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfUkVBRF9TRVFfRUxFTSggZWxlbSwgcmVhZGVyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGlmKCBjdkdldEVyclN0YXR1cygpIDwgMCApCisgICAgeworICAgICAgICBpZiggc2FtcGxlcyApCisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoIHNhbXBsZXMgKTsKKyAgICAgICAgaWYoIHJlc3BvbnNlcyApCisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoIHJlc3BvbnNlcyApOworICAgIH0KKyAgICBjdlJlbGVhc2VNYXQoICZtZWFuICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY292ICk7CisgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnN0b3JhZ2UgKTsKK30KKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9tbC9zcmMvbWx0cmVlLmNwcCBiL21sL3NyYy9tbHRyZWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1Njc4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tbC9zcmMvbWx0cmVlLmNwcApAQCAtMCwwICsxLDM0MTIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9tbC5oIgorCitzdGF0aWMgY29uc3QgZmxvYXQgb3JkX25hbiA9IEZMVF9NQVgqMC41ZjsKK3N0YXRpYyBjb25zdCBpbnQgbWluX2Jsb2NrX3NpemUgPSAxIDw8IDE2Oworc3RhdGljIGNvbnN0IGludCBibG9ja19zaXplX2RlbHRhID0gMSA8PCAxMDsKKworQ3ZEVHJlZVRyYWluRGF0YTo6Q3ZEVHJlZVRyYWluRGF0YSgpCit7CisgICAgdmFyX2lkeCA9IHZhcl90eXBlID0gY2F0X2NvdW50ID0gY2F0X29mcyA9IGNhdF9tYXAgPQorICAgICAgICBwcmlvcnMgPSBwcmlvcnNfbXVsdCA9IGNvdW50cyA9IGJ1ZiA9IGRpcmVjdGlvbiA9IHNwbGl0X2J1ZiA9IDA7CisgICAgdHJlZV9zdG9yYWdlID0gdGVtcF9zdG9yYWdlID0gMDsKKworICAgIGNsZWFyKCk7Cit9CisKKworQ3ZEVHJlZVRyYWluRGF0YTo6Q3ZEVHJlZVRyYWluRGF0YSggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfcmVzcG9uc2VzLCBjb25zdCBDdk1hdCogX3Zhcl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9zYW1wbGVfaWR4LCBjb25zdCBDdk1hdCogX3Zhcl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrLCBjb25zdCBDdkRUcmVlUGFyYW1zJiBfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgX3NoYXJlZCwgYm9vbCBfYWRkX2xhYmVscyApCit7CisgICAgdmFyX2lkeCA9IHZhcl90eXBlID0gY2F0X2NvdW50ID0gY2F0X29mcyA9IGNhdF9tYXAgPQorICAgICAgICBwcmlvcnMgPSBwcmlvcnNfbXVsdCA9IGNvdW50cyA9IGJ1ZiA9IGRpcmVjdGlvbiA9IHNwbGl0X2J1ZiA9IDA7CisgICAgdHJlZV9zdG9yYWdlID0gdGVtcF9zdG9yYWdlID0gMDsKKyAgICAKKyAgICBzZXRfZGF0YSggX3RyYWluX2RhdGEsIF90ZmxhZywgX3Jlc3BvbnNlcywgX3Zhcl9pZHgsIF9zYW1wbGVfaWR4LAorICAgICAgICAgICAgICBfdmFyX3R5cGUsIF9taXNzaW5nX21hc2ssIF9wYXJhbXMsIF9zaGFyZWQsIF9hZGRfbGFiZWxzICk7Cit9CisKKworQ3ZEVHJlZVRyYWluRGF0YTo6fkN2RFRyZWVUcmFpbkRhdGEoKQoreworICAgIGNsZWFyKCk7Cit9CisKKworYm9vbCBDdkRUcmVlVHJhaW5EYXRhOjpzZXRfcGFyYW1zKCBjb25zdCBDdkRUcmVlUGFyYW1zJiBfcGFyYW1zICkKK3sKKyAgICBib29sIG9rID0gZmFsc2U7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdkRUcmVlVHJhaW5EYXRhOjpzZXRfcGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgLy8gc2V0IHBhcmFtZXRlcnMKKyAgICBwYXJhbXMgPSBfcGFyYW1zOworCisgICAgaWYoIHBhcmFtcy5tYXhfY2F0ZWdvcmllcyA8IDIgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInBhcmFtcy5tYXhfY2F0ZWdvcmllcyBzaG91bGQgYmUgPj0gMiIgKTsKKyAgICBwYXJhbXMubWF4X2NhdGVnb3JpZXMgPSBNSU4oIHBhcmFtcy5tYXhfY2F0ZWdvcmllcywgMTUgKTsKKworICAgIGlmKCBwYXJhbXMubWF4X2RlcHRoIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAicGFyYW1zLm1heF9kZXB0aCBzaG91bGQgYmUgPj0gMCIgKTsKKyAgICBwYXJhbXMubWF4X2RlcHRoID0gTUlOKCBwYXJhbXMubWF4X2RlcHRoLCAyNSApOworCisgICAgcGFyYW1zLm1pbl9zYW1wbGVfY291bnQgPSBNQVgocGFyYW1zLm1pbl9zYW1wbGVfY291bnQsMSk7CisKKyAgICBpZiggcGFyYW1zLmN2X2ZvbGRzIDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLAorICAgICAgICAicGFyYW1zLmN2X2ZvbGRzIHNob3VsZCBiZSA9MCAodGhlIHRyZWUgaXMgbm90IHBydW5lZCkgIgorICAgICAgICAib3Igbj4wICh0cmVlIGlzIHBydW5lZCB1c2luZyBuLWZvbGQgY3Jvc3MtdmFsaWRhdGlvbikiICk7CisKKyAgICBpZiggcGFyYW1zLmN2X2ZvbGRzID09IDEgKQorICAgICAgICBwYXJhbXMuY3ZfZm9sZHMgPSAwOworCisgICAgaWYoIHBhcmFtcy5yZWdyZXNzaW9uX2FjY3VyYWN5IDwgMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAicGFyYW1zLnJlZ3Jlc3Npb25fYWNjdXJhY3kgc2hvdWxkIGJlID49IDAiICk7CisKKyAgICBvayA9IHRydWU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIG9rOworfQorCisKKyNkZWZpbmUgQ1ZfQ01QX05VTV9QVFIoYSxiKSAoKihhKSA8ICooYikpCitzdGF0aWMgQ1ZfSU1QTEVNRU5UX1FTT1JUX0VYKCBpY3ZTb3J0SW50UHRyLCBpbnQqLCBDVl9DTVBfTlVNX1BUUiwgaW50ICkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnREYmxQdHIsIGRvdWJsZSosIENWX0NNUF9OVU1fUFRSLCBpbnQgKQorCisjZGVmaW5lIENWX0NNUF9QQUlSUyhhLGIpICgoYSkudmFsIDwgKGIpLnZhbCkKK3N0YXRpYyBDVl9JTVBMRU1FTlRfUVNPUlRfRVgoIGljdlNvcnRQYWlycywgQ3ZQYWlyMzJzMzJmLCBDVl9DTVBfUEFJUlMsIGludCApCisKK3ZvaWQgQ3ZEVHJlZVRyYWluRGF0YTo6c2V0X2RhdGEoIGNvbnN0IEN2TWF0KiBfdHJhaW5fZGF0YSwgaW50IF90ZmxhZywKKyAgICBjb25zdCBDdk1hdCogX3Jlc3BvbnNlcywgY29uc3QgQ3ZNYXQqIF92YXJfaWR4LCBjb25zdCBDdk1hdCogX3NhbXBsZV9pZHgsCisgICAgY29uc3QgQ3ZNYXQqIF92YXJfdHlwZSwgY29uc3QgQ3ZNYXQqIF9taXNzaW5nX21hc2ssIGNvbnN0IEN2RFRyZWVQYXJhbXMmIF9wYXJhbXMsCisgICAgYm9vbCBfc2hhcmVkLCBib29sIF9hZGRfbGFiZWxzLCBib29sIF91cGRhdGVfZGF0YSApCit7CisgICAgQ3ZNYXQqIHNhbXBsZV9pZHggPSAwOworICAgIEN2TWF0KiB2YXJfdHlwZTAgPSAwOworICAgIEN2TWF0KiB0bXBfbWFwID0gMDsKKyAgICBpbnQqKiBpbnRfcHRyID0gMDsKKyAgICBDdkRUcmVlVHJhaW5EYXRhKiBkYXRhID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZVRyYWluRGF0YTo6c2V0X2RhdGEiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgc2FtcGxlX2FsbCA9IDAsIHJfdHlwZSA9IDAsIGN2X247CisgICAgaW50IHRvdGFsX2NfY291bnQgPSAwOworICAgIGludCB0cmVlX2Jsb2NrX3NpemUsIHRlbXBfYmxvY2tfc2l6ZSwgbWF4X3NwbGl0X3NpemUsIG52X3NpemUsIGN2X3NpemUgPSAwOworICAgIGludCBkc19zdGVwLCBkdl9zdGVwLCBtc19zdGVwID0gMCwgbXZfc3RlcCA9IDA7IC8vIHtkYXRhfG1hc2t9e3NhbXBsZXx2YXJ9X3N0ZXAKKyAgICBpbnQgdmksIGk7CisgICAgY2hhciBlcnJbMTAwXTsKKyAgICBjb25zdCBpbnQgKnNpZHggPSAwLCAqdmlkeCA9IDA7CisKKyAgICBpZiggX3VwZGF0ZV9kYXRhICYmIGRhdGFfcm9vdCApCisgICAgeworICAgICAgICBkYXRhID0gbmV3IEN2RFRyZWVUcmFpbkRhdGEoIF90cmFpbl9kYXRhLCBfdGZsYWcsIF9yZXNwb25zZXMsIF92YXJfaWR4LAorICAgICAgICAgICAgX3NhbXBsZV9pZHgsIF92YXJfdHlwZSwgX21pc3NpbmdfbWFzaywgX3BhcmFtcywgX3NoYXJlZCwgX2FkZF9sYWJlbHMgKTsKKyAgICAgICAgCisgICAgICAgIC8vIGNvbXBhcmUgbmV3IGFuZCBvbGQgdHJhaW4gZGF0YQorICAgICAgICBpZiggIShkYXRhLT52YXJfY291bnQgPT0gdmFyX2NvdW50ICYmCisgICAgICAgICAgICBjdk5vcm0oIGRhdGEtPnZhcl90eXBlLCB2YXJfdHlwZSwgQ1ZfQyApIDwgRkxUX0VQU0lMT04gJiYKKyAgICAgICAgICAgIGN2Tm9ybSggZGF0YS0+Y2F0X2NvdW50LCBjYXRfY291bnQsIENWX0MgKSA8IEZMVF9FUFNJTE9OICYmCisgICAgICAgICAgICBjdk5vcm0oIGRhdGEtPmNhdF9tYXAsIGNhdF9tYXAsIENWX0MgKSA8IEZMVF9FUFNJTE9OKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgIlRoZSBuZXcgdHJhaW5pbmcgZGF0YSBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZXMgYW5kIHRoZSBpbnB1dCBhbmQgb3V0cHV0IHZhcmlhYmxlcyAiCisgICAgICAgICAgICAiYW5kIHRoZSBzYW1lIGNhdGVnb3JpZXMgZm9yIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyIgKTsKKworICAgICAgICBjdlJlbGVhc2VNYXQoICZwcmlvcnMgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmcHJpb3JzX211bHQgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWF0KCAmYnVmICk7CisgICAgICAgIGN2UmVsZWFzZU1hdCggJmRpcmVjdGlvbiApOworICAgICAgICBjdlJlbGVhc2VNYXQoICZzcGxpdF9idWYgKTsKKyAgICAgICAgY3ZSZWxlYXNlTWVtU3RvcmFnZSggJnRlbXBfc3RvcmFnZSApOworCisgICAgICAgIHByaW9ycyA9IGRhdGEtPnByaW9yczsgZGF0YS0+cHJpb3JzID0gMDsKKyAgICAgICAgcHJpb3JzX211bHQgPSBkYXRhLT5wcmlvcnNfbXVsdDsgZGF0YS0+cHJpb3JzX211bHQgPSAwOworICAgICAgICBidWYgPSBkYXRhLT5idWY7IGRhdGEtPmJ1ZiA9IDA7CisgICAgICAgIGJ1Zl9jb3VudCA9IGRhdGEtPmJ1Zl9jb3VudDsgYnVmX3NpemUgPSBkYXRhLT5idWZfc2l6ZTsKKyAgICAgICAgc2FtcGxlX2NvdW50ID0gZGF0YS0+c2FtcGxlX2NvdW50OworCisgICAgICAgIGRpcmVjdGlvbiA9IGRhdGEtPmRpcmVjdGlvbjsgZGF0YS0+ZGlyZWN0aW9uID0gMDsKKyAgICAgICAgc3BsaXRfYnVmID0gZGF0YS0+c3BsaXRfYnVmOyBkYXRhLT5zcGxpdF9idWYgPSAwOworICAgICAgICB0ZW1wX3N0b3JhZ2UgPSBkYXRhLT50ZW1wX3N0b3JhZ2U7IGRhdGEtPnRlbXBfc3RvcmFnZSA9IDA7CisgICAgICAgIG52X2hlYXAgPSBkYXRhLT5udl9oZWFwOyBjdl9oZWFwID0gZGF0YS0+Y3ZfaGVhcDsKKworICAgICAgICBkYXRhX3Jvb3QgPSBuZXdfbm9kZSggMCwgc2FtcGxlX2NvdW50LCAwLCAwICk7CisgICAgICAgIEVYSVQ7CisgICAgfQorCisgICAgY2xlYXIoKTsKKworICAgIHZhcl9hbGwgPSAwOworICAgIHJuZyA9IGN2Uk5HKC0xKTsKKworICAgIENWX0NBTEwoIHNldF9wYXJhbXMoIF9wYXJhbXMgKSk7CisKKyAgICAvLyBjaGVjayBwYXJhbWV0ZXIgdHlwZXMgYW5kIHNpemVzCisgICAgQ1ZfQ0FMTCggY3ZDaGVja1RyYWluRGF0YSggX3RyYWluX2RhdGEsIF90ZmxhZywgX21pc3NpbmdfbWFzaywgJnZhcl9hbGwsICZzYW1wbGVfYWxsICkpOworICAgIGlmKCBfdGZsYWcgPT0gQ1ZfUk9XX1NBTVBMRSApCisgICAgeworICAgICAgICBkc19zdGVwID0gX3RyYWluX2RhdGEtPnN0ZXAvQ1ZfRUxFTV9TSVpFKF90cmFpbl9kYXRhLT50eXBlKTsKKyAgICAgICAgZHZfc3RlcCA9IDE7CisgICAgICAgIGlmKCBfbWlzc2luZ19tYXNrICkKKyAgICAgICAgICAgIG1zX3N0ZXAgPSBfbWlzc2luZ19tYXNrLT5zdGVwLCBtdl9zdGVwID0gMTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZHZfc3RlcCA9IF90cmFpbl9kYXRhLT5zdGVwL0NWX0VMRU1fU0laRShfdHJhaW5fZGF0YS0+dHlwZSk7CisgICAgICAgIGRzX3N0ZXAgPSAxOworICAgICAgICBpZiggX21pc3NpbmdfbWFzayApCisgICAgICAgICAgICBtdl9zdGVwID0gX21pc3NpbmdfbWFzay0+c3RlcCwgbXNfc3RlcCA9IDE7CisgICAgfQorCisgICAgc2FtcGxlX2NvdW50ID0gc2FtcGxlX2FsbDsKKyAgICB2YXJfY291bnQgPSB2YXJfYWxsOworCisgICAgaWYoIF9zYW1wbGVfaWR4ICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIHNhbXBsZV9pZHggPSBjdlByZXByb2Nlc3NJbmRleEFycmF5KCBfc2FtcGxlX2lkeCwgc2FtcGxlX2FsbCApKTsKKyAgICAgICAgc2lkeCA9IHNhbXBsZV9pZHgtPmRhdGEuaTsKKyAgICAgICAgc2FtcGxlX2NvdW50ID0gc2FtcGxlX2lkeC0+cm93cyArIHNhbXBsZV9pZHgtPmNvbHMgLSAxOworICAgIH0KKworICAgIGlmKCBfdmFyX2lkeCApCisgICAgeworICAgICAgICBDVl9DQUxMKCB2YXJfaWR4ID0gY3ZQcmVwcm9jZXNzSW5kZXhBcnJheSggX3Zhcl9pZHgsIHZhcl9hbGwgKSk7CisgICAgICAgIHZpZHggPSB2YXJfaWR4LT5kYXRhLmk7CisgICAgICAgIHZhcl9jb3VudCA9IHZhcl9pZHgtPnJvd3MgKyB2YXJfaWR4LT5jb2xzIC0gMTsKKyAgICB9CisKKyAgICBpZiggIUNWX0lTX01BVChfcmVzcG9uc2VzKSB8fAorICAgICAgICAoQ1ZfTUFUX1RZUEUoX3Jlc3BvbnNlcy0+dHlwZSkgIT0gQ1ZfMzJTQzEgJiYKKyAgICAgICAgIENWX01BVF9UWVBFKF9yZXNwb25zZXMtPnR5cGUpICE9IENWXzMyRkMxKSB8fAorICAgICAgICBfcmVzcG9uc2VzLT5yb3dzICE9IDEgJiYgX3Jlc3BvbnNlcy0+Y29scyAhPSAxIHx8CisgICAgICAgIF9yZXNwb25zZXMtPnJvd3MgKyBfcmVzcG9uc2VzLT5jb2xzIC0gMSAhPSBzYW1wbGVfYWxsICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgIlRoZSBhcnJheSBvZiBfcmVzcG9uc2VzIG11c3QgYmUgYW4gaW50ZWdlciBvciAiCisgICAgICAgICAgICAgICAgICAiZmxvYXRpbmctcG9pbnQgdmVjdG9yIGNvbnRhaW5pbmcgYXMgbWFueSBlbGVtZW50cyBhcyAiCisgICAgICAgICAgICAgICAgICAidGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGluIHRoZSB0cmFpbmluZyBkYXRhIG1hdHJpeCIgKTsKKworICAgIENWX0NBTEwoIHZhcl90eXBlMCA9IGN2UHJlcHJvY2Vzc1ZhclR5cGUoIF92YXJfdHlwZSwgdmFyX2lkeCwgdmFyX2FsbCwgJnJfdHlwZSApKTsKKyAgICBDVl9DQUxMKCB2YXJfdHlwZSA9IGN2Q3JlYXRlTWF0KCAxLCB2YXJfY291bnQrMiwgQ1ZfMzJTQzEgKSk7CisKKyAgICBjYXRfdmFyX2NvdW50ID0gMDsKKyAgICBvcmRfdmFyX2NvdW50ID0gLTE7CisKKyAgICBpc19jbGFzc2lmaWVyID0gcl90eXBlID09IENWX1ZBUl9DQVRFR09SSUNBTDsKKworICAgIC8vIHN0ZXAgMC4gY2FsYyB0aGUgbnVtYmVyIG9mIGNhdGVnb3JpY2FsIHZhcnMKKyAgICBmb3IoIHZpID0gMDsgdmkgPCB2YXJfY291bnQ7IHZpKysgKQorICAgIHsKKyAgICAgICAgdmFyX3R5cGUtPmRhdGEuaVt2aV0gPSB2YXJfdHlwZTAtPmRhdGEucHRyW3ZpXSA9PSBDVl9WQVJfQ0FURUdPUklDQUwgPworICAgICAgICAgICAgY2F0X3Zhcl9jb3VudCsrIDogb3JkX3Zhcl9jb3VudC0tOworICAgIH0KKworICAgIG9yZF92YXJfY291bnQgPSB+b3JkX3Zhcl9jb3VudDsKKyAgICBjdl9uID0gcGFyYW1zLmN2X2ZvbGRzOworICAgIC8vIHNldCB0aGUgdHdvIGxhc3QgZWxlbWVudHMgb2YgdmFyX3R5cGUgYXJyYXkgdG8gYmUgYWJsZQorICAgIC8vIHRvIGxvY2F0ZSByZXNwb25zZXMgYW5kIGNyb3NzLXZhbGlkYXRpb24gbGFiZWxzIHVzaW5nCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZ2V0XyogZnVuY3Rpb25zLgorICAgIHZhcl90eXBlLT5kYXRhLmlbdmFyX2NvdW50XSA9IGNhdF92YXJfY291bnQ7CisgICAgdmFyX3R5cGUtPmRhdGEuaVt2YXJfY291bnQrMV0gPSBjYXRfdmFyX2NvdW50KzE7CisKKyAgICAvLyBpbiBjYXNlIG9mIHNpbmdsZSBvcmRlcmVkIHByZWRpY3RvciB3ZSBuZWVkIGR1bW15IGN2X2xhYmVscworICAgIC8vIGZvciBzYWZlIHNwbGl0X25vZGVfZGF0YSgpIG9wZXJhdGlvbgorICAgIGhhdmVfbGFiZWxzID0gY3ZfbiA+IDAgfHwgb3JkX3Zhcl9jb3VudCA9PSAxICYmIGNhdF92YXJfY291bnQgPT0gMCB8fCBfYWRkX2xhYmVsczsKKworICAgIGJ1Zl9zaXplID0gKG9yZF92YXJfY291bnQgKyBnZXRfd29ya192YXJfY291bnQoKSkqc2FtcGxlX2NvdW50ICsgMjsKKyAgICBzaGFyZWQgPSBfc2hhcmVkOworICAgIGJ1Zl9jb3VudCA9IHNoYXJlZCA/IDMgOiAyOworICAgIENWX0NBTEwoIGJ1ZiA9IGN2Q3JlYXRlTWF0KCBidWZfY291bnQsIGJ1Zl9zaXplLCBDVl8zMlNDMSApKTsKKyAgICBDVl9DQUxMKCBjYXRfY291bnQgPSBjdkNyZWF0ZU1hdCggMSwgY2F0X3Zhcl9jb3VudCsxLCBDVl8zMlNDMSApKTsKKyAgICBDVl9DQUxMKCBjYXRfb2ZzID0gY3ZDcmVhdGVNYXQoIDEsIGNhdF9jb3VudC0+Y29scysxLCBDVl8zMlNDMSApKTsKKyAgICBDVl9DQUxMKCBjYXRfbWFwID0gY3ZDcmVhdGVNYXQoIDEsIGNhdF9jb3VudC0+Y29scyoxMCArIDEyOCwgQ1ZfMzJTQzEgKSk7CisKKyAgICAvLyBub3cgY2FsY3VsYXRlIHRoZSBtYXhpbXVtIHNpemUgb2Ygc3BsaXQsCisgICAgLy8gY3JlYXRlIG1lbW9yeSBzdG9yYWdlIHRoYXQgd2lsbCBrZWVwIG5vZGVzIGFuZCBzcGxpdHMgb2YgdGhlIGRlY2lzaW9uIHRyZWUKKyAgICAvLyBhbGxvY2F0ZSByb290IG5vZGUgYW5kIHRoZSBidWZmZXIgZm9yIHRoZSB3aG9sZSB0cmFpbmluZyBkYXRhCisgICAgbWF4X3NwbGl0X3NpemUgPSBjdkFsaWduKHNpemVvZihDdkRUcmVlU3BsaXQpICsKKyAgICAgICAgKE1BWCgwLHNhbXBsZV9jb3VudCAtIDMzKS8zMikqc2l6ZW9mKGludCksc2l6ZW9mKHZvaWQqKSk7CisgICAgdHJlZV9ibG9ja19zaXplID0gTUFYKChpbnQpc2l6ZW9mKEN2RFRyZWVOb2RlKSo4LCBtYXhfc3BsaXRfc2l6ZSk7CisgICAgdHJlZV9ibG9ja19zaXplID0gTUFYKHRyZWVfYmxvY2tfc2l6ZSArIGJsb2NrX3NpemVfZGVsdGEsIG1pbl9ibG9ja19zaXplKTsKKyAgICBDVl9DQUxMKCB0cmVlX3N0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIHRyZWVfYmxvY2tfc2l6ZSApKTsKKyAgICBDVl9DQUxMKCBub2RlX2hlYXAgPSBjdkNyZWF0ZVNldCggMCwgc2l6ZW9mKCpub2RlX2hlYXApLCBzaXplb2YoQ3ZEVHJlZU5vZGUpLCB0cmVlX3N0b3JhZ2UgKSk7CisKKyAgICBudl9zaXplID0gdmFyX2NvdW50KnNpemVvZihpbnQpOworICAgIG52X3NpemUgPSBNQVgoIG52X3NpemUsIChpbnQpc2l6ZW9mKEN2U2V0RWxlbSkgKTsKKworICAgIHRlbXBfYmxvY2tfc2l6ZSA9IG52X3NpemU7CisgICAgCisgICAgaWYoIGN2X24gKQorICAgIHsKKyAgICAgICAgaWYoIHNhbXBsZV9jb3VudCA8IGN2X24qTUFYKHBhcmFtcy5taW5fc2FtcGxlX2NvdW50LDEwKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwKKyAgICAgICAgICAgICAgICAiVGhlIG1hbnkgZm9sZHMgaW4gY3Jvc3MtdmFsaWRhdGlvbiBmb3Igc3VjaCBhIHNtYWxsIGRhdGFzZXQiICk7CisKKyAgICAgICAgY3Zfc2l6ZSA9IGN2QWxpZ24oIGN2X24qKHNpemVvZihpbnQpICsgc2l6ZW9mKGRvdWJsZSkqMiksIHNpemVvZihkb3VibGUpICk7CisgICAgICAgIHRlbXBfYmxvY2tfc2l6ZSA9IE1BWCh0ZW1wX2Jsb2NrX3NpemUsIGN2X3NpemUpOworICAgIH0KKworICAgIHRlbXBfYmxvY2tfc2l6ZSA9IE1BWCggdGVtcF9ibG9ja19zaXplICsgYmxvY2tfc2l6ZV9kZWx0YSwgbWluX2Jsb2NrX3NpemUgKTsKKyAgICBDVl9DQUxMKCB0ZW1wX3N0b3JhZ2UgPSBjdkNyZWF0ZU1lbVN0b3JhZ2UoIHRlbXBfYmxvY2tfc2l6ZSApKTsKKyAgICBDVl9DQUxMKCBudl9oZWFwID0gY3ZDcmVhdGVTZXQoIDAsIHNpemVvZigqbnZfaGVhcCksIG52X3NpemUsIHRlbXBfc3RvcmFnZSApKTsKKyAgICBpZiggY3Zfc2l6ZSApCisgICAgICAgIENWX0NBTEwoIGN2X2hlYXAgPSBjdkNyZWF0ZVNldCggMCwgc2l6ZW9mKCpjdl9oZWFwKSwgY3Zfc2l6ZSwgdGVtcF9zdG9yYWdlICkpOworCisgICAgQ1ZfQ0FMTCggZGF0YV9yb290ID0gbmV3X25vZGUoIDAsIHNhbXBsZV9jb3VudCwgMCwgMCApKTsKKyAgICBDVl9DQUxMKCBpbnRfcHRyID0gKGludCoqKWN2QWxsb2MoIHNhbXBsZV9jb3VudCpzaXplb2YoaW50X3B0clswXSkgKSk7CisKKyAgICBtYXhfY19jb3VudCA9IDE7CisKKyAgICAvLyB0cmFuc2Zvcm0gdGhlIHRyYWluaW5nIGRhdGEgdG8gY29udmVuaWVudCByZXByZXNlbnRhdGlvbgorICAgIGZvciggdmkgPSAwOyB2aSA8PSB2YXJfY291bnQ7IHZpKysgKQorICAgIHsKKyAgICAgICAgaW50IGNpOworICAgICAgICBjb25zdCB1Y2hhciogbWFzayA9IDA7CisgICAgICAgIGludCBtX3N0ZXAgPSAwLCBzdGVwOworICAgICAgICBjb25zdCBpbnQqIGlkYXRhID0gMDsKKyAgICAgICAgY29uc3QgZmxvYXQqIGZkYXRhID0gMDsKKyAgICAgICAgaW50IG51bV92YWxpZCA9IDA7CisKKyAgICAgICAgaWYoIHZpIDwgdmFyX2NvdW50ICkgLy8gYW5hbHl6ZSBpLXRoIGlucHV0IHZhcmlhYmxlCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2aTAgPSB2aWR4ID8gdmlkeFt2aV0gOiB2aTsKKyAgICAgICAgICAgIGNpID0gZ2V0X3Zhcl90eXBlKHZpKTsKKyAgICAgICAgICAgIHN0ZXAgPSBkc19zdGVwOyBtX3N0ZXAgPSBtc19zdGVwOworICAgICAgICAgICAgaWYoIENWX01BVF9UWVBFKF90cmFpbl9kYXRhLT50eXBlKSA9PSBDVl8zMlNDMSApCisgICAgICAgICAgICAgICAgaWRhdGEgPSBfdHJhaW5fZGF0YS0+ZGF0YS5pICsgdmkwKmR2X3N0ZXA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZmRhdGEgPSBfdHJhaW5fZGF0YS0+ZGF0YS5mbCArIHZpMCpkdl9zdGVwOworICAgICAgICAgICAgaWYoIF9taXNzaW5nX21hc2sgKQorICAgICAgICAgICAgICAgIG1hc2sgPSBfbWlzc2luZ19tYXNrLT5kYXRhLnB0ciArIHZpMCptdl9zdGVwOworICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gYW5hbHl6ZSBfcmVzcG9uc2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGNpID0gY2F0X3Zhcl9jb3VudDsKKyAgICAgICAgICAgIHN0ZXAgPSBDVl9JU19NQVRfQ09OVChfcmVzcG9uc2VzLT50eXBlKSA/CisgICAgICAgICAgICAgICAgMSA6IF9yZXNwb25zZXMtPnN0ZXAgLyBDVl9FTEVNX1NJWkUoX3Jlc3BvbnNlcy0+dHlwZSk7CisgICAgICAgICAgICBpZiggQ1ZfTUFUX1RZUEUoX3Jlc3BvbnNlcy0+dHlwZSkgPT0gQ1ZfMzJTQzEgKQorICAgICAgICAgICAgICAgIGlkYXRhID0gX3Jlc3BvbnNlcy0+ZGF0YS5pOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZkYXRhID0gX3Jlc3BvbnNlcy0+ZGF0YS5mbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2aSA8IHZhcl9jb3VudCAmJiBjaSA+PSAwIHx8CisgICAgICAgICAgICB2aSA9PSB2YXJfY291bnQgJiYgaXNfY2xhc3NpZmllciApIC8vIHByb2Nlc3MgY2F0ZWdvcmljYWwgdmFyaWFibGUgb3IgcmVzcG9uc2UKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGNfY291bnQsIHByZXZfbGFiZWw7CisgICAgICAgICAgICBpbnQqIGNfbWFwLCAqZHN0ID0gZ2V0X2NhdF92YXJfZGF0YSggZGF0YV9yb290LCB2aSApOworCisgICAgICAgICAgICAvLyBjb3B5IGRhdGEKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IElOVF9NQVgsIHNpID0gc2lkeCA/IHNpZHhbaV0gOiBpOworICAgICAgICAgICAgICAgIGlmKCAhbWFzayB8fCAhbWFza1tzaSptX3N0ZXBdICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBpZGF0YSApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpZGF0YVtzaSpzdGVwXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB0ID0gZmRhdGFbc2kqc3RlcF07CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBjdlJvdW5kKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZhbCAhPSB0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBlcnIsICIlZC10aCB2YWx1ZSBvZiAlZC10aCAoY2F0ZWdvcmljYWwpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlIGlzIG5vdCBhbiBpbnRlZ2VyIiwgaSwgdmkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLCBlcnIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB2YWwgPT0gSU5UX01BWCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIGVyciwgIiVkLXRoIHZhbHVlIG9mICVkLXRoIChjYXRlZ29yaWNhbCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSBpcyB0b28gbGFyZ2UiLCBpLCB2aSApOworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgZXJyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbGlkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdFtpXSA9IHZhbDsKKyAgICAgICAgICAgICAgICBpbnRfcHRyW2ldID0gZHN0ICsgaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc29ydCBhbGwgdGhlIHZhbHVlcywgaW5jbHVkaW5nIHRoZSBtaXNzaW5nIG1lYXN1cmVtZW50cworICAgICAgICAgICAgLy8gdGhhdCBzaG91bGQgYWxsIG1vdmUgdG8gdGhlIGVuZAorICAgICAgICAgICAgaWN2U29ydEludFB0ciggaW50X3B0ciwgc2FtcGxlX2NvdW50LCAwICk7CisgICAgICAgICAgICAvL3Fzb3J0KCBpbnRfcHRyLCBzYW1wbGVfY291bnQsIHNpemVvZihpbnRfcHRyWzBdKSwgaWN2Q21wSW50UHRyICk7CisKKyAgICAgICAgICAgIGNfY291bnQgPSBudW1fdmFsaWQgPiAwOworCisgICAgICAgICAgICAvLyBjb3VudCB0aGUgY2F0ZWdvcmllcworICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IG51bV92YWxpZDsgaSsrICkKKyAgICAgICAgICAgICAgICBjX2NvdW50ICs9ICppbnRfcHRyW2ldICE9ICppbnRfcHRyW2ktMV07CisKKyAgICAgICAgICAgIGlmKCB2aSA+IDAgKQorICAgICAgICAgICAgICAgIG1heF9jX2NvdW50ID0gTUFYKCBtYXhfY19jb3VudCwgY19jb3VudCApOworICAgICAgICAgICAgY2F0X2NvdW50LT5kYXRhLmlbY2ldID0gY19jb3VudDsKKyAgICAgICAgICAgIGNhdF9vZnMtPmRhdGEuaVtjaV0gPSB0b3RhbF9jX2NvdW50OworCisgICAgICAgICAgICAvLyByZXNpemUgY2F0X21hcCwgaWYgbmVlZAorICAgICAgICAgICAgaWYoIGNhdF9tYXAtPmNvbHMgPCB0b3RhbF9jX2NvdW50ICsgY19jb3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdG1wX21hcCA9IGNhdF9tYXA7CisgICAgICAgICAgICAgICAgQ1ZfQ0FMTCggY2F0X21hcCA9IGN2Q3JlYXRlTWF0KCAxLAorICAgICAgICAgICAgICAgICAgICBNQVgoY2F0X21hcC0+Y29scyozLzIsdG90YWxfY19jb3VudCtjX2NvdW50KSwgQ1ZfMzJTQzEgKSk7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsX2NfY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGNhdF9tYXAtPmRhdGEuaVtpXSA9IHRtcF9tYXAtPmRhdGEuaVtpXTsKKyAgICAgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZ0bXBfbWFwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNfbWFwID0gY2F0X21hcC0+ZGF0YS5pICsgdG90YWxfY19jb3VudDsKKyAgICAgICAgICAgIHRvdGFsX2NfY291bnQgKz0gY19jb3VudDsKKworICAgICAgICAgICAgLy8gY29tcGFjdCB0aGUgY2xhc3MgaW5kaWNlcyBhbmQgYnVpbGQgdGhlIG1hcAorICAgICAgICAgICAgcHJldl9sYWJlbCA9IH4qaW50X3B0clswXTsKKyAgICAgICAgICAgIGNfY291bnQgPSAtMTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG51bV92YWxpZDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgY3VyX2xhYmVsID0gKmludF9wdHJbaV07CisgICAgICAgICAgICAgICAgaWYoIGN1cl9sYWJlbCAhPSBwcmV2X2xhYmVsICkKKyAgICAgICAgICAgICAgICAgICAgY19tYXBbKytjX2NvdW50XSA9IHByZXZfbGFiZWwgPSBjdXJfbGFiZWw7CisgICAgICAgICAgICAgICAgKmludF9wdHJbaV0gPSBjX2NvdW50OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZXBsYWNlIGxhYmVscyBmb3IgbWlzc2luZyB2YWx1ZXMgd2l0aCAtMQorICAgICAgICAgICAgZm9yKCA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgKmludF9wdHJbaV0gPSAtMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBjaSA8IDAgKSAvLyBwcm9jZXNzIG9yZGVyZWQgdmFyaWFibGUKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZQYWlyMzJzMzJmKiBkc3QgPSBnZXRfb3JkX3Zhcl9kYXRhKCBkYXRhX3Jvb3QsIHZpICk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gb3JkX25hbjsKKyAgICAgICAgICAgICAgICBpbnQgc2kgPSBzaWR4ID8gc2lkeFtpXSA6IGk7CisgICAgICAgICAgICAgICAgaWYoICFtYXNrIHx8ICFtYXNrW3NpKm1fc3RlcF0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGlkYXRhICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IChmbG9hdClpZGF0YVtzaSpzdGVwXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gZmRhdGFbc2kqc3RlcF07CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIGZhYnModmFsKSA+PSBvcmRfbmFuICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggZXJyLCAiJWQtdGggdmFsdWUgb2YgJWQtdGggKG9yZGVyZWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFibGUgKD0lZykgaXMgdG9vIGxhcmdlIiwgaSwgdmksIHZhbCApOworICAgICAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgZXJyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbnVtX3ZhbGlkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdFtpXS5pID0gaTsKKyAgICAgICAgICAgICAgICBkc3RbaV0udmFsID0gdmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpY3ZTb3J0UGFpcnMoIGRzdCwgc2FtcGxlX2NvdW50LCAwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSAvLyBzcGVjaWFsIGNhc2U6IHByb2Nlc3Mgb3JkZXJlZCByZXNwb25zZSwKKyAgICAgICAgICAgICAvLyBpdCB3aWxsIGJlIHN0b3JlZCBzaW1pbGFybHkgdG8gY2F0ZWdvcmljYWwgdmFycyAoaS5lLiBubyBwYWlycykKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIGRzdCA9IGdldF9vcmRfcmVzcG9uc2VzKCBkYXRhX3Jvb3QgKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNhbXBsZV9jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSBvcmRfbmFuOworICAgICAgICAgICAgICAgIGludCBzaSA9IHNpZHggPyBzaWR4W2ldIDogaTsKKyAgICAgICAgICAgICAgICBpZiggaWRhdGEgKQorICAgICAgICAgICAgICAgICAgICB2YWwgPSAoZmxvYXQpaWRhdGFbc2kqc3RlcF07CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB2YWwgPSBmZGF0YVtzaSpzdGVwXTsKKworICAgICAgICAgICAgICAgIGlmKCBmYWJzKHZhbCkgPj0gb3JkX25hbiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBlcnIsICIlZC10aCB2YWx1ZSBvZiAlZC10aCAob3JkZXJlZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhYmxlICg9JWcpIGlzIG91dCBvZiByYW5nZSIsIGksIHZpLCB2YWwgKTsKKyAgICAgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZEFyZywgZXJyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdFtpXSA9IHZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2F0X2NvdW50LT5kYXRhLmlbY2F0X3Zhcl9jb3VudF0gPSAwOworICAgICAgICAgICAgY2F0X29mcy0+ZGF0YS5pW2NhdF92YXJfY291bnRdID0gdG90YWxfY19jb3VudDsKKyAgICAgICAgICAgIG51bV92YWxpZCA9IHNhbXBsZV9jb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCB2aSA8IHZhcl9jb3VudCApCisgICAgICAgICAgICBkYXRhX3Jvb3QtPnNldF9udW1fdmFsaWQodmksIG51bV92YWxpZCk7CisgICAgfQorCisgICAgaWYoIGN2X24gKQorICAgIHsKKyAgICAgICAgaW50KiBkc3QgPSBnZXRfbGFiZWxzKGRhdGFfcm9vdCk7CisgICAgICAgIEN2Uk5HKiByID0gJnJuZzsKKworICAgICAgICBmb3IoIGkgPSB2aSA9IDA7IGkgPCBzYW1wbGVfY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtpXSA9IHZpKys7CisgICAgICAgICAgICB2aSAmPSB2aSA8IGN2X24gPyAtMSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2FtcGxlX2NvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgYSA9IGN2UmFuZEludChyKSAlIHNhbXBsZV9jb3VudDsKKyAgICAgICAgICAgIGludCBiID0gY3ZSYW5kSW50KHIpICUgc2FtcGxlX2NvdW50OworICAgICAgICAgICAgQ1ZfU1dBUCggZHN0W2FdLCBkc3RbYl0sIHZpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjYXRfbWFwLT5jb2xzID0gTUFYKCB0b3RhbF9jX2NvdW50LCAxICk7CisKKyAgICBtYXhfc3BsaXRfc2l6ZSA9IGN2QWxpZ24oc2l6ZW9mKEN2RFRyZWVTcGxpdCkgKworICAgICAgICAoTUFYKDAsbWF4X2NfY291bnQgLSAzMykvMzIpKnNpemVvZihpbnQpLHNpemVvZih2b2lkKikpOworICAgIENWX0NBTEwoIHNwbGl0X2hlYXAgPSBjdkNyZWF0ZVNldCggMCwgc2l6ZW9mKCpzcGxpdF9oZWFwKSwgbWF4X3NwbGl0X3NpemUsIHRyZWVfc3RvcmFnZSApKTsKKworICAgIGhhdmVfcHJpb3JzID0gaXNfY2xhc3NpZmllciAmJiBwYXJhbXMucHJpb3JzOworICAgIGlmKCBpc19jbGFzc2lmaWVyICkKKyAgICB7CisgICAgICAgIGludCBtID0gZ2V0X251bV9jbGFzc2VzKCk7CisgICAgICAgIGRvdWJsZSBzdW0gPSAwOworICAgICAgICBDVl9DQUxMKCBwcmlvcnMgPSBjdkNyZWF0ZU1hdCggMSwgbSwgQ1ZfNjRGICkpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbCA9IGhhdmVfcHJpb3JzID8gcGFyYW1zLnByaW9yc1tpXSA6IDEuOworICAgICAgICAgICAgaWYoIHZhbCA8PSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIkV2ZXJ5IGNsYXNzIHdlaWdodCBzaG91bGQgYmUgcG9zaXRpdmUiICk7CisgICAgICAgICAgICBwcmlvcnMtPmRhdGEuZGJbaV0gPSB2YWw7CisgICAgICAgICAgICBzdW0gKz0gdmFsOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBub3JtYWxpemUgd2VpZ2h0cworICAgICAgICBpZiggaGF2ZV9wcmlvcnMgKQorICAgICAgICAgICAgY3ZTY2FsZSggcHJpb3JzLCBwcmlvcnMsIDEuL3N1bSApOworICAgICAgICAKKyAgICAgICAgQ1ZfQ0FMTCggcHJpb3JzX211bHQgPSBjdkNsb25lTWF0KCBwcmlvcnMgKSk7CisgICAgICAgIENWX0NBTEwoIGNvdW50cyA9IGN2Q3JlYXRlTWF0KCAxLCBtLCBDVl8zMlNDMSApKTsKKyAgICB9CisKKyAgICBDVl9DQUxMKCBkaXJlY3Rpb24gPSBjdkNyZWF0ZU1hdCggMSwgc2FtcGxlX2NvdW50LCBDVl84VUMxICkpOworICAgIENWX0NBTEwoIHNwbGl0X2J1ZiA9IGN2Q3JlYXRlTWF0KCAxLCBzYW1wbGVfY291bnQsIENWXzMyU0MxICkpOworCisgICAgX19FTkRfXzsKKworICAgIGlmKCBkYXRhICkKKyAgICAgICAgZGVsZXRlIGRhdGE7CisKKyAgICBjdkZyZWUoICZpbnRfcHRyICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmc2FtcGxlX2lkeCApOworICAgIGN2UmVsZWFzZU1hdCggJnZhcl90eXBlMCApOworICAgIGN2UmVsZWFzZU1hdCggJnRtcF9tYXAgKTsKK30KKworCitDdkRUcmVlTm9kZSogQ3ZEVHJlZVRyYWluRGF0YTo6c3Vic2FtcGxlX2RhdGEoIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCApCit7CisgICAgQ3ZEVHJlZU5vZGUqIHJvb3QgPSAwOworICAgIEN2TWF0KiBpc3Vic2FtcGxlX2lkeCA9IDA7CisgICAgQ3ZNYXQqIHN1YnNhbXBsZV9jbyA9IDA7CisgICAgCisgICAgQ1ZfRlVOQ05BTUUoICJDdkRUcmVlVHJhaW5EYXRhOjpzdWJzYW1wbGVfZGF0YSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGlmKCAhZGF0YV9yb290ICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiTm8gdHJhaW5pbmcgZGF0YSBoYXMgYmVlbiBzZXQiICk7CisgICAgCisgICAgaWYoIF9zdWJzYW1wbGVfaWR4ICkKKyAgICAgICAgQ1ZfQ0FMTCggaXN1YnNhbXBsZV9pZHggPSBjdlByZXByb2Nlc3NJbmRleEFycmF5KCBfc3Vic2FtcGxlX2lkeCwgc2FtcGxlX2NvdW50ICkpOworCisgICAgaWYoICFpc3Vic2FtcGxlX2lkeCApCisgICAgeworICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgcm9vdCBub2RlCisgICAgICAgIEN2RFRyZWVOb2RlIHRlbXA7CisgICAgICAgIGludCBpOworICAgICAgICByb290ID0gbmV3X25vZGUoIDAsIDEsIDAsIDAgKTsKKyAgICAgICAgdGVtcCA9ICpyb290OworICAgICAgICAqcm9vdCA9ICpkYXRhX3Jvb3Q7CisgICAgICAgIHJvb3QtPm51bV92YWxpZCA9IHRlbXAubnVtX3ZhbGlkOworICAgICAgICBpZiggcm9vdC0+bnVtX3ZhbGlkICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHZhcl9jb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICByb290LT5udW1fdmFsaWRbaV0gPSBkYXRhX3Jvb3QtPm51bV92YWxpZFtpXTsKKyAgICAgICAgfQorICAgICAgICByb290LT5jdl9UbiA9IHRlbXAuY3ZfVG47CisgICAgICAgIHJvb3QtPmN2X25vZGVfcmlzayA9IHRlbXAuY3Zfbm9kZV9yaXNrOworICAgICAgICByb290LT5jdl9ub2RlX2Vycm9yID0gdGVtcC5jdl9ub2RlX2Vycm9yOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQqIHNpZHggPSBpc3Vic2FtcGxlX2lkeC0+ZGF0YS5pOworICAgICAgICAvLyBjbyAtIGFycmF5IG9mIGNvdW50L29mZnNldCBwYWlycyAodG8gaGFuZGxlIGR1cGxpY2F0ZWQgdmFsdWVzIGluIF9zdWJzYW1wbGVfaWR4KQorICAgICAgICBpbnQqIGNvLCBjdXJfb2ZzID0gMDsKKyAgICAgICAgaW50IHZpLCBpLCB0b3RhbCA9IGRhdGFfcm9vdC0+c2FtcGxlX2NvdW50OworICAgICAgICBpbnQgY291bnQgPSBpc3Vic2FtcGxlX2lkeC0+cm93cyArIGlzdWJzYW1wbGVfaWR4LT5jb2xzIC0gMTsKKyAgICAgICAgaW50IHdvcmtfdmFyX2NvdW50ID0gZ2V0X3dvcmtfdmFyX2NvdW50KCk7CisgICAgICAgIHJvb3QgPSBuZXdfbm9kZSggMCwgY291bnQsIDEsIDAgKTsKKworICAgICAgICBDVl9DQUxMKCBzdWJzYW1wbGVfY28gPSBjdkNyZWF0ZU1hdCggMSwgdG90YWwqMiwgQ1ZfMzJTQzEgKSk7CisgICAgICAgIGN2WmVybyggc3Vic2FtcGxlX2NvICk7CisgICAgICAgIGNvID0gc3Vic2FtcGxlX2NvLT5kYXRhLmk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIGNvW3NpZHhbaV0qMl0rKzsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY29baSoyXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29baSoyKzFdID0gY3VyX29mczsKKyAgICAgICAgICAgICAgICBjdXJfb2ZzICs9IGNvW2kqMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgY29baSoyKzFdID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHZpID0gMDsgdmkgPCB3b3JrX3Zhcl9jb3VudDsgdmkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjaSA9IGdldF92YXJfdHlwZSh2aSk7CisKKyAgICAgICAgICAgIGlmKCBjaSA+PSAwIHx8IHZpID49IHZhcl9jb3VudCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzcmMgPSBnZXRfY2F0X3Zhcl9kYXRhKCBkYXRhX3Jvb3QsIHZpICk7CisgICAgICAgICAgICAgICAgaW50KiBkc3QgPSBnZXRfY2F0X3Zhcl9kYXRhKCByb290LCB2aSApOworICAgICAgICAgICAgICAgIGludCBudW1fdmFsaWQgPSAwOworCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IHNyY1tzaWR4W2ldXTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W2ldID0gdmFsOworICAgICAgICAgICAgICAgICAgICBudW1fdmFsaWQgKz0gdmFsID49IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoIHZpIDwgdmFyX2NvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgcm9vdC0+c2V0X251bV92YWxpZCh2aSwgbnVtX3ZhbGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBDdlBhaXIzMnMzMmYqIHNyYyA9IGdldF9vcmRfdmFyX2RhdGEoIGRhdGFfcm9vdCwgdmkgKTsKKyAgICAgICAgICAgICAgICBDdlBhaXIzMnMzMmYqIGRzdCA9IGdldF9vcmRfdmFyX2RhdGEoIHJvb3QsIHZpICk7CisgICAgICAgICAgICAgICAgaW50IGogPSAwLCBpZHgsIGNvdW50X2k7CisgICAgICAgICAgICAgICAgaW50IG51bV92YWxpZCA9IGRhdGFfcm9vdC0+Z2V0X251bV92YWxpZCh2aSk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbnVtX3ZhbGlkOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWR4ID0gc3JjW2ldLmk7CisgICAgICAgICAgICAgICAgICAgIGNvdW50X2kgPSBjb1tpZHgqMl07CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb3VudF9pICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsID0gc3JjW2ldLnZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggY3VyX29mcyA9IGNvW2lkeCoyKzFdOyBjb3VudF9pID4gMDsgY291bnRfaS0tLCBqKyssIGN1cl9vZnMrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0W2pdLnZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rbal0uaSA9IGN1cl9vZnM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByb290LT5zZXRfbnVtX3ZhbGlkKHZpLCBqKTsKKworICAgICAgICAgICAgICAgIGZvciggOyBpIDwgdG90YWw7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZHggPSBzcmNbaV0uaTsKKyAgICAgICAgICAgICAgICAgICAgY291bnRfaSA9IGNvW2lkeCoyXTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvdW50X2kgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSBzcmNbaV0udmFsOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBjdXJfb2ZzID0gY29baWR4KjIrMV07IGNvdW50X2kgPiAwOyBjb3VudF9pLS0sIGorKywgY3VyX29mcysrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rbal0udmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtqXS5pID0gY3VyX29mczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBjdlJlbGVhc2VNYXQoICZpc3Vic2FtcGxlX2lkeCApOworICAgIGN2UmVsZWFzZU1hdCggJnN1YnNhbXBsZV9jbyApOworCisgICAgcmV0dXJuIHJvb3Q7Cit9CisKKwordm9pZCBDdkRUcmVlVHJhaW5EYXRhOjpnZXRfdmVjdG9ycyggY29uc3QgQ3ZNYXQqIF9zdWJzYW1wbGVfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZhbHVlcywgdWNoYXIqIG1pc3NpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcmVzcG9uc2VzLCBib29sIGdldF9jbGFzc19pZHggKQoreworICAgIEN2TWF0KiBzdWJzYW1wbGVfaWR4ID0gMDsKKyAgICBDdk1hdCogc3Vic2FtcGxlX2NvID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggIkN2RFRyZWVUcmFpbkRhdGE6OmdldF92ZWN0b3JzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIHZpLCB0b3RhbCA9IHNhbXBsZV9jb3VudCwgY291bnQgPSB0b3RhbCwgY3VyX29mcyA9IDA7CisgICAgaW50KiBzaWR4ID0gMDsKKyAgICBpbnQqIGNvID0gMDsKKworICAgIGlmKCBfc3Vic2FtcGxlX2lkeCApCisgICAgeworICAgICAgICBDVl9DQUxMKCBzdWJzYW1wbGVfaWR4ID0gY3ZQcmVwcm9jZXNzSW5kZXhBcnJheSggX3N1YnNhbXBsZV9pZHgsIHNhbXBsZV9jb3VudCApKTsKKyAgICAgICAgc2lkeCA9IHN1YnNhbXBsZV9pZHgtPmRhdGEuaTsKKyAgICAgICAgQ1ZfQ0FMTCggc3Vic2FtcGxlX2NvID0gY3ZDcmVhdGVNYXQoIDEsIHNhbXBsZV9jb3VudCoyLCBDVl8zMlNDMSApKTsKKyAgICAgICAgY28gPSBzdWJzYW1wbGVfY28tPmRhdGEuaTsKKyAgICAgICAgY3ZaZXJvKCBzdWJzYW1wbGVfY28gKTsKKyAgICAgICAgY291bnQgPSBzdWJzYW1wbGVfaWR4LT5jb2xzICsgc3Vic2FtcGxlX2lkeC0+cm93cyAtIDE7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIGNvW3NpZHhbaV0qMl0rKzsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgY291bnRfaSA9IGNvW2kqMl07CisgICAgICAgICAgICBpZiggY291bnRfaSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29baSoyKzFdID0gY3VyX29mcyp2YXJfY291bnQ7CisgICAgICAgICAgICAgICAgY3VyX29mcyArPSBjb3VudF9pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIG1pc3NpbmcgKQorICAgICAgICBtZW1zZXQoIG1pc3NpbmcsIDEsIGNvdW50KnZhcl9jb3VudCApOworCisgICAgZm9yKCB2aSA9IDA7IHZpIDwgdmFyX2NvdW50OyB2aSsrICkKKyAgICB7CisgICAgICAgIGludCBjaSA9IGdldF92YXJfdHlwZSh2aSk7CisgICAgICAgIGlmKCBjaSA+PSAwICkgLy8gY2F0ZWdvcmljYWwKKyAgICAgICAgeworICAgICAgICAgICAgZmxvYXQqIGRzdCA9IHZhbHVlcyArIHZpOworICAgICAgICAgICAgdWNoYXIqIG0gPSBtaXNzaW5nID8gbWlzc2luZyArIHZpIDogMDsKKyAgICAgICAgICAgIGNvbnN0IGludCogc3JjID0gZ2V0X2NhdF92YXJfZGF0YShkYXRhX3Jvb3QsIHZpKTsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKyssIGRzdCArPSB2YXJfY291bnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBzaWR4ID8gc2lkeFtpXSA6IGk7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IHNyY1tpZHhdOworICAgICAgICAgICAgICAgICpkc3QgPSAoZmxvYXQpdmFsOworICAgICAgICAgICAgICAgIGlmKCBtICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICptID0gdmFsIDwgMDsKKyAgICAgICAgICAgICAgICAgICAgbSArPSB2YXJfY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgLy8gb3JkZXJlZAorICAgICAgICB7CisgICAgICAgICAgICBmbG9hdCogZHN0ID0gdmFsdWVzICsgdmk7CisgICAgICAgICAgICB1Y2hhciogbSA9IG1pc3NpbmcgPyBtaXNzaW5nICsgdmkgOiAwOworICAgICAgICAgICAgY29uc3QgQ3ZQYWlyMzJzMzJmKiBzcmMgPSBnZXRfb3JkX3Zhcl9kYXRhKGRhdGFfcm9vdCwgdmkpOworICAgICAgICAgICAgaW50IGNvdW50MSA9IGRhdGFfcm9vdC0+Z2V0X251bV92YWxpZCh2aSk7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDE7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHNyY1tpXS5pOworICAgICAgICAgICAgICAgIGludCBjb3VudF9pID0gMTsKKyAgICAgICAgICAgICAgICBpZiggY28gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY291bnRfaSA9IGNvW2lkeCoyXTsKKyAgICAgICAgICAgICAgICAgICAgY3VyX29mcyA9IGNvW2lkeCoyKzFdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGN1cl9vZnMgPSBpZHgqdmFyX2NvdW50OworICAgICAgICAgICAgICAgIGlmKCBjb3VudF9pICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbCA9IHNyY1tpXS52YWw7CisgICAgICAgICAgICAgICAgICAgIGZvciggOyBjb3VudF9pID4gMDsgY291bnRfaS0tLCBjdXJfb2ZzICs9IHZhcl9jb3VudCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtjdXJfb2ZzXSA9IHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtW2N1cl9vZnNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNvcHkgcmVzcG9uc2VzCisgICAgaWYoIHJlc3BvbnNlcyApCisgICAgeworICAgICAgICBpZiggaXNfY2xhc3NpZmllciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCogc3JjID0gZ2V0X2NsYXNzX2xhYmVscyhkYXRhX3Jvb3QpOworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBzaWR4ID8gc2lkeFtpXSA6IGk7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IGdldF9jbGFzc19pZHggPyBzcmNbaWR4XSA6CisgICAgICAgICAgICAgICAgICAgIGNhdF9tYXAtPmRhdGEuaVtjYXRfb2ZzLT5kYXRhLmlbY2F0X3Zhcl9jb3VudF0rc3JjW2lkeF1dOworICAgICAgICAgICAgICAgIHJlc3BvbnNlc1tpXSA9IChmbG9hdCl2YWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBmbG9hdCogc3JjID0gZ2V0X29yZF9yZXNwb25zZXMoZGF0YV9yb290KTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc2lkeCA/IHNpZHhbaV0gOiBpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlc1tpXSA9IHNyY1tpZHhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJnN1YnNhbXBsZV9pZHggKTsKKyAgICBjdlJlbGVhc2VNYXQoICZzdWJzYW1wbGVfY28gKTsKK30KKworCitDdkRUcmVlTm9kZSogQ3ZEVHJlZVRyYWluRGF0YTo6bmV3X25vZGUoIEN2RFRyZWVOb2RlKiBwYXJlbnQsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VfaWR4LCBpbnQgb2Zmc2V0ICkKK3sKKyAgICBDdkRUcmVlTm9kZSogbm9kZSA9IChDdkRUcmVlTm9kZSopY3ZTZXROZXcoIG5vZGVfaGVhcCApOworCisgICAgbm9kZS0+c2FtcGxlX2NvdW50ID0gY291bnQ7CisgICAgbm9kZS0+ZGVwdGggPSBwYXJlbnQgPyBwYXJlbnQtPmRlcHRoICsgMSA6IDA7CisgICAgbm9kZS0+cGFyZW50ID0gcGFyZW50OworICAgIG5vZGUtPmxlZnQgPSBub2RlLT5yaWdodCA9IDA7CisgICAgbm9kZS0+c3BsaXQgPSAwOworICAgIG5vZGUtPnZhbHVlID0gMDsKKyAgICBub2RlLT5jbGFzc19pZHggPSAwOworICAgIG5vZGUtPm1heGxyID0gMC47CisKKyAgICBub2RlLT5idWZfaWR4ID0gc3RvcmFnZV9pZHg7CisgICAgbm9kZS0+b2Zmc2V0ID0gb2Zmc2V0OworICAgIGlmKCBudl9oZWFwICkKKyAgICAgICAgbm9kZS0+bnVtX3ZhbGlkID0gKGludCopY3ZTZXROZXcoIG52X2hlYXAgKTsKKyAgICBlbHNlCisgICAgICAgIG5vZGUtPm51bV92YWxpZCA9IDA7CisgICAgbm9kZS0+YWxwaGEgPSBub2RlLT5ub2RlX3Jpc2sgPSBub2RlLT50cmVlX3Jpc2sgPSBub2RlLT50cmVlX2Vycm9yID0gMC47CisgICAgbm9kZS0+Y29tcGxleGl0eSA9IDA7CisKKyAgICBpZiggcGFyYW1zLmN2X2ZvbGRzID4gMCAmJiBjdl9oZWFwICkKKyAgICB7CisgICAgICAgIGludCBjdl9uID0gcGFyYW1zLmN2X2ZvbGRzOworICAgICAgICBub2RlLT5UbiA9IElOVF9NQVg7CisgICAgICAgIG5vZGUtPmN2X1RuID0gKGludCopY3ZTZXROZXcoIGN2X2hlYXAgKTsKKyAgICAgICAgbm9kZS0+Y3Zfbm9kZV9yaXNrID0gKGRvdWJsZSopY3ZBbGlnblB0cihub2RlLT5jdl9UbiArIGN2X24sIHNpemVvZihkb3VibGUpKTsKKyAgICAgICAgbm9kZS0+Y3Zfbm9kZV9lcnJvciA9IG5vZGUtPmN2X25vZGVfcmlzayArIGN2X247CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG5vZGUtPlRuID0gMDsKKyAgICAgICAgbm9kZS0+Y3ZfVG4gPSAwOworICAgICAgICBub2RlLT5jdl9ub2RlX3Jpc2sgPSAwOworICAgICAgICBub2RlLT5jdl9ub2RlX2Vycm9yID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbm9kZTsKK30KKworCitDdkRUcmVlU3BsaXQqIEN2RFRyZWVUcmFpbkRhdGE6Om5ld19zcGxpdF9vcmQoIGludCB2aSwgZmxvYXQgY21wX3ZhbCwKKyAgICAgICAgICAgICAgICBpbnQgc3BsaXRfcG9pbnQsIGludCBpbnZlcnNlZCwgZmxvYXQgcXVhbGl0eSApCit7CisgICAgQ3ZEVHJlZVNwbGl0KiBzcGxpdCA9IChDdkRUcmVlU3BsaXQqKWN2U2V0TmV3KCBzcGxpdF9oZWFwICk7CisgICAgc3BsaXQtPnZhcl9pZHggPSB2aTsKKyAgICBzcGxpdC0+b3JkLmMgPSBjbXBfdmFsOworICAgIHNwbGl0LT5vcmQuc3BsaXRfcG9pbnQgPSBzcGxpdF9wb2ludDsKKyAgICBzcGxpdC0+aW52ZXJzZWQgPSBpbnZlcnNlZDsKKyAgICBzcGxpdC0+cXVhbGl0eSA9IHF1YWxpdHk7CisgICAgc3BsaXQtPm5leHQgPSAwOworCisgICAgcmV0dXJuIHNwbGl0OworfQorCisKK0N2RFRyZWVTcGxpdCogQ3ZEVHJlZVRyYWluRGF0YTo6bmV3X3NwbGl0X2NhdCggaW50IHZpLCBmbG9hdCBxdWFsaXR5ICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIHNwbGl0ID0gKEN2RFRyZWVTcGxpdCopY3ZTZXROZXcoIHNwbGl0X2hlYXAgKTsKKyAgICBpbnQgaSwgbiA9IChtYXhfY19jb3VudCArIDMxKS8zMjsKKworICAgIHNwbGl0LT52YXJfaWR4ID0gdmk7CisgICAgc3BsaXQtPmludmVyc2VkID0gMDsKKyAgICBzcGxpdC0+cXVhbGl0eSA9IHF1YWxpdHk7CisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHNwbGl0LT5zdWJzZXRbaV0gPSAwOworICAgIHNwbGl0LT5uZXh0ID0gMDsKKworICAgIHJldHVybiBzcGxpdDsKK30KKworCit2b2lkIEN2RFRyZWVUcmFpbkRhdGE6OmZyZWVfbm9kZSggQ3ZEVHJlZU5vZGUqIG5vZGUgKQoreworICAgIEN2RFRyZWVTcGxpdCogc3BsaXQgPSBub2RlLT5zcGxpdDsKKyAgICBmcmVlX25vZGVfZGF0YSggbm9kZSApOworICAgIHdoaWxlKCBzcGxpdCApCisgICAgeworICAgICAgICBDdkRUcmVlU3BsaXQqIG5leHQgPSBzcGxpdC0+bmV4dDsKKyAgICAgICAgY3ZTZXRSZW1vdmVCeVB0ciggc3BsaXRfaGVhcCwgc3BsaXQgKTsKKyAgICAgICAgc3BsaXQgPSBuZXh0OworICAgIH0KKyAgICBub2RlLT5zcGxpdCA9IDA7CisgICAgY3ZTZXRSZW1vdmVCeVB0ciggbm9kZV9oZWFwLCBub2RlICk7Cit9CisKKwordm9pZCBDdkRUcmVlVHJhaW5EYXRhOjpmcmVlX25vZGVfZGF0YSggQ3ZEVHJlZU5vZGUqIG5vZGUgKQoreworICAgIGlmKCBub2RlLT5udW1fdmFsaWQgKQorICAgIHsKKyAgICAgICAgY3ZTZXRSZW1vdmVCeVB0ciggbnZfaGVhcCwgbm9kZS0+bnVtX3ZhbGlkICk7CisgICAgICAgIG5vZGUtPm51bV92YWxpZCA9IDA7CisgICAgfQorICAgIC8vIGRvIG5vdCBmcmVlIGN2XyogZmllbGRzLCBhcyBhbGwgdGhlIGNyb3NzLXZhbGlkYXRpb24gcmVsYXRlZCBkYXRhIGlzIHJlbGVhc2VkIGF0IG9uY2UuCit9CisKKwordm9pZCBDdkRUcmVlVHJhaW5EYXRhOjpmcmVlX3RyYWluX2RhdGEoKQoreworICAgIGN2UmVsZWFzZU1hdCggJmNvdW50cyApOworICAgIGN2UmVsZWFzZU1hdCggJmJ1ZiApOworICAgIGN2UmVsZWFzZU1hdCggJmRpcmVjdGlvbiApOworICAgIGN2UmVsZWFzZU1hdCggJnNwbGl0X2J1ZiApOworICAgIGN2UmVsZWFzZU1lbVN0b3JhZ2UoICZ0ZW1wX3N0b3JhZ2UgKTsKKyAgICBjdl9oZWFwID0gbnZfaGVhcCA9IDA7Cit9CisKKwordm9pZCBDdkRUcmVlVHJhaW5EYXRhOjpjbGVhcigpCit7CisgICAgZnJlZV90cmFpbl9kYXRhKCk7CisKKyAgICBjdlJlbGVhc2VNZW1TdG9yYWdlKCAmdHJlZV9zdG9yYWdlICk7CisKKyAgICBjdlJlbGVhc2VNYXQoICZ2YXJfaWR4ICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdmFyX3R5cGUgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZjYXRfY291bnQgKTsKKyAgICBjdlJlbGVhc2VNYXQoICZjYXRfb2ZzICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmY2F0X21hcCApOworICAgIGN2UmVsZWFzZU1hdCggJnByaW9ycyApOworICAgIGN2UmVsZWFzZU1hdCggJnByaW9yc19tdWx0ICk7CisKKyAgICBub2RlX2hlYXAgPSBzcGxpdF9oZWFwID0gMDsKKworICAgIHNhbXBsZV9jb3VudCA9IHZhcl9hbGwgPSB2YXJfY291bnQgPSBtYXhfY19jb3VudCA9IG9yZF92YXJfY291bnQgPSBjYXRfdmFyX2NvdW50ID0gMDsKKyAgICBoYXZlX2xhYmVscyA9IGhhdmVfcHJpb3JzID0gaXNfY2xhc3NpZmllciA9IGZhbHNlOworCisgICAgYnVmX2NvdW50ID0gYnVmX3NpemUgPSAwOworICAgIHNoYXJlZCA9IGZhbHNlOworCisgICAgZGF0YV9yb290ID0gMDsKKworICAgIHJuZyA9IGN2Uk5HKC0xKTsKK30KKworCitpbnQgQ3ZEVHJlZVRyYWluRGF0YTo6Z2V0X251bV9jbGFzc2VzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gaXNfY2xhc3NpZmllciA/IGNhdF9jb3VudC0+ZGF0YS5pW2NhdF92YXJfY291bnRdIDogMDsKK30KKworCitpbnQgQ3ZEVHJlZVRyYWluRGF0YTo6Z2V0X3Zhcl90eXBlKGludCB2aSkgY29uc3QKK3sKKyAgICByZXR1cm4gdmFyX3R5cGUtPmRhdGEuaVt2aV07Cit9CisKKworaW50IEN2RFRyZWVUcmFpbkRhdGE6OmdldF93b3JrX3Zhcl9jb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHZhcl9jb3VudCArIDEgKyAoaGF2ZV9sYWJlbHMgPyAxIDogMCk7Cit9CisKK0N2UGFpcjMyczMyZiogQ3ZEVHJlZVRyYWluRGF0YTo6Z2V0X29yZF92YXJfZGF0YSggQ3ZEVHJlZU5vZGUqIG4sIGludCB2aSApCit7CisgICAgaW50IG9pID0gfmdldF92YXJfdHlwZSh2aSk7CisgICAgYXNzZXJ0KCAwIDw9IG9pICYmIG9pIDwgb3JkX3Zhcl9jb3VudCApOworICAgIHJldHVybiAoQ3ZQYWlyMzJzMzJmKikoYnVmLT5kYXRhLmkgKyBuLT5idWZfaWR4KmJ1Zi0+Y29scyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT5vZmZzZXQgKyBvaSpuLT5zYW1wbGVfY291bnQqMik7Cit9CisKKworaW50KiBDdkRUcmVlVHJhaW5EYXRhOjpnZXRfY2xhc3NfbGFiZWxzKCBDdkRUcmVlTm9kZSogbiApCit7CisgICAgcmV0dXJuIGdldF9jYXRfdmFyX2RhdGEoIG4sIHZhcl9jb3VudCApOworfQorCisKK2Zsb2F0KiBDdkRUcmVlVHJhaW5EYXRhOjpnZXRfb3JkX3Jlc3BvbnNlcyggQ3ZEVHJlZU5vZGUqIG4gKQoreworICAgIHJldHVybiAoZmxvYXQqKWdldF9jYXRfdmFyX2RhdGEoIG4sIHZhcl9jb3VudCApOworfQorCisKK2ludCogQ3ZEVHJlZVRyYWluRGF0YTo6Z2V0X2xhYmVscyggQ3ZEVHJlZU5vZGUqIG4gKQoreworICAgIHJldHVybiBoYXZlX2xhYmVscyA/IGdldF9jYXRfdmFyX2RhdGEoIG4sIHZhcl9jb3VudCArIDEgKSA6IDA7Cit9CisKKworaW50KiBDdkRUcmVlVHJhaW5EYXRhOjpnZXRfY2F0X3Zhcl9kYXRhKCBDdkRUcmVlTm9kZSogbiwgaW50IHZpICkKK3sKKyAgICBpbnQgY2kgPSBnZXRfdmFyX3R5cGUodmkpOworICAgIGFzc2VydCggMCA8PSBjaSAmJiBjaSA8PSBjYXRfdmFyX2NvdW50ICsgMSApOworICAgIHJldHVybiBidWYtPmRhdGEuaSArIG4tPmJ1Zl9pZHgqYnVmLT5jb2xzICsgbi0+b2Zmc2V0ICsKKyAgICAgICAgICAgKG9yZF92YXJfY291bnQqMiArIGNpKSpuLT5zYW1wbGVfY291bnQ7Cit9CisKKworaW50IEN2RFRyZWVUcmFpbkRhdGE6OmdldF9jaGlsZF9idWZfaWR4KCBDdkRUcmVlTm9kZSogbiApCit7CisgICAgaW50IGlkeCA9IG4tPmJ1Zl9pZHggKyAxOworICAgIGlmKCBpZHggPj0gYnVmX2NvdW50ICkKKyAgICAgICAgaWR4ID0gc2hhcmVkID8gMSA6IDA7CisgICAgcmV0dXJuIGlkeDsKK30KKworCit2b2lkIEN2RFRyZWVUcmFpbkRhdGE6OndyaXRlX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZVRyYWluRGF0YTo6d3JpdGVfcGFyYW1zIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IHZpLCB2Y291bnQgPSB2YXJfY291bnQ7CisKKyAgICBjdldyaXRlSW50KCBmcywgImlzX2NsYXNzaWZpZXIiLCBpc19jbGFzc2lmaWVyID8gMSA6IDAgKTsKKyAgICBjdldyaXRlSW50KCBmcywgInZhcl9hbGwiLCB2YXJfYWxsICk7CisgICAgY3ZXcml0ZUludCggZnMsICJ2YXJfY291bnQiLCB2YXJfY291bnQgKTsKKyAgICBjdldyaXRlSW50KCBmcywgIm9yZF92YXJfY291bnQiLCBvcmRfdmFyX2NvdW50ICk7CisgICAgY3ZXcml0ZUludCggZnMsICJjYXRfdmFyX2NvdW50IiwgY2F0X3Zhcl9jb3VudCApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInRyYWluaW5nX3BhcmFtcyIsIENWX05PREVfTUFQICk7CisgICAgY3ZXcml0ZUludCggZnMsICJ1c2Vfc3Vycm9nYXRlcyIsIHBhcmFtcy51c2Vfc3Vycm9nYXRlcyA/IDEgOiAwICk7CisKKyAgICBpZiggaXNfY2xhc3NpZmllciApCisgICAgeworICAgICAgICBjdldyaXRlSW50KCBmcywgIm1heF9jYXRlZ29yaWVzIiwgcGFyYW1zLm1heF9jYXRlZ29yaWVzICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGN2V3JpdGVSZWFsKCBmcywgInJlZ3Jlc3Npb25fYWNjdXJhY3kiLCBwYXJhbXMucmVncmVzc2lvbl9hY2N1cmFjeSApOworICAgIH0KKworICAgIGN2V3JpdGVJbnQoIGZzLCAibWF4X2RlcHRoIiwgcGFyYW1zLm1heF9kZXB0aCApOworICAgIGN2V3JpdGVJbnQoIGZzLCAibWluX3NhbXBsZV9jb3VudCIsIHBhcmFtcy5taW5fc2FtcGxlX2NvdW50ICk7CisgICAgY3ZXcml0ZUludCggZnMsICJjcm9zc192YWxpZGF0aW9uX2ZvbGRzIiwgcGFyYW1zLmN2X2ZvbGRzICk7CisgICAgCisgICAgaWYoIHBhcmFtcy5jdl9mb2xkcyA+IDEgKQorICAgIHsKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJ1c2VfMXNlX3J1bGUiLCBwYXJhbXMudXNlXzFzZV9ydWxlID8gMSA6IDAgKTsKKyAgICAgICAgY3ZXcml0ZUludCggZnMsICJ0cnVuY2F0ZV9wcnVuZWRfdHJlZSIsIHBhcmFtcy50cnVuY2F0ZV9wcnVuZWRfdHJlZSA/IDEgOiAwICk7CisgICAgfQorCisgICAgaWYoIHByaW9ycyApCisgICAgICAgIGN2V3JpdGUoIGZzLCAicHJpb3JzIiwgcHJpb3JzICk7CisKKyAgICBjdkVuZFdyaXRlU3RydWN0KCBmcyApOworCisgICAgaWYoIHZhcl9pZHggKQorICAgICAgICBjdldyaXRlKCBmcywgInZhcl9pZHgiLCB2YXJfaWR4ICk7CisgICAgCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgInZhcl90eXBlIiwgQ1ZfTk9ERV9TRVErQ1ZfTk9ERV9GTE9XICk7CisKKyAgICBmb3IoIHZpID0gMDsgdmkgPCB2Y291bnQ7IHZpKysgKQorICAgICAgICBjdldyaXRlSW50KCBmcywgMCwgdmFyX3R5cGUtPmRhdGEuaVt2aV0gPj0gMCApOworCisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIGlmKCBjYXRfY291bnQgJiYgKGNhdF92YXJfY291bnQgPiAwIHx8IGlzX2NsYXNzaWZpZXIpICkKKyAgICB7CisgICAgICAgIENWX0FTU0VSVCggY2F0X2NvdW50ICE9IDAgKTsKKyAgICAgICAgY3ZXcml0ZSggZnMsICJjYXRfY291bnQiLCBjYXRfY291bnQgKTsKKyAgICAgICAgY3ZXcml0ZSggZnMsICJjYXRfbWFwIiwgY2F0X21hcCApOworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdkRUcmVlVHJhaW5EYXRhOjpyZWFkX3BhcmFtcyggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZVRyYWluRGF0YTo6cmVhZF9wYXJhbXMiICk7CisKKyAgICBfX0JFR0lOX187CisgICAgCisgICAgQ3ZGaWxlTm9kZSAqdHBhcmFtc19ub2RlLCAqdmFydHlwZV9ub2RlOworICAgIEN2U2VxUmVhZGVyIHJlYWRlcjsKKyAgICBpbnQgdmksIG1heF9zcGxpdF9zaXplLCB0cmVlX2Jsb2NrX3NpemU7CisKKyAgICBpc19jbGFzc2lmaWVyID0gKGN2UmVhZEludEJ5TmFtZSggZnMsIG5vZGUsICJpc19jbGFzc2lmaWVyIiApICE9IDApOworICAgIHZhcl9hbGwgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAidmFyX2FsbCIgKTsKKyAgICB2YXJfY291bnQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAidmFyX2NvdW50IiwgdmFyX2FsbCApOworICAgIGNhdF92YXJfY291bnQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBub2RlLCAiY2F0X3Zhcl9jb3VudCIgKTsKKyAgICBvcmRfdmFyX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgIm9yZF92YXJfY291bnQiICk7CisKKyAgICB0cGFyYW1zX25vZGUgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgbm9kZSwgInRyYWluaW5nX3BhcmFtcyIgKTsKKworICAgIGlmKCB0cGFyYW1zX25vZGUgKSAvLyB0cmFpbmluZyBwYXJhbWV0ZXJzIGFyZSBub3QgbmVjZXNzYXJ5CisgICAgeworICAgICAgICBwYXJhbXMudXNlX3N1cnJvZ2F0ZXMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJ1c2Vfc3Vycm9nYXRlcyIsIDEgKSAhPSAwOworCisgICAgICAgIGlmKCBpc19jbGFzc2lmaWVyICkKKyAgICAgICAgeworICAgICAgICAgICAgcGFyYW1zLm1heF9jYXRlZ29yaWVzID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAibWF4X2NhdGVnb3JpZXMiICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwYXJhbXMucmVncmVzc2lvbl9hY2N1cmFjeSA9CisgICAgICAgICAgICAgICAgKGZsb2F0KWN2UmVhZFJlYWxCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJyZWdyZXNzaW9uX2FjY3VyYWN5IiApOworICAgICAgICB9CisKKyAgICAgICAgcGFyYW1zLm1heF9kZXB0aCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIHRwYXJhbXNfbm9kZSwgIm1heF9kZXB0aCIgKTsKKyAgICAgICAgcGFyYW1zLm1pbl9zYW1wbGVfY291bnQgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJtaW5fc2FtcGxlX2NvdW50IiApOworICAgICAgICBwYXJhbXMuY3ZfZm9sZHMgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJjcm9zc192YWxpZGF0aW9uX2ZvbGRzIiApOworICAgIAorICAgICAgICBpZiggcGFyYW1zLmN2X2ZvbGRzID4gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHBhcmFtcy51c2VfMXNlX3J1bGUgPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCB0cGFyYW1zX25vZGUsICJ1c2VfMXNlX3J1bGUiICkgIT0gMDsKKyAgICAgICAgICAgIHBhcmFtcy50cnVuY2F0ZV9wcnVuZWRfdHJlZSA9CisgICAgICAgICAgICAgICAgY3ZSZWFkSW50QnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAidHJ1bmNhdGVfcHJ1bmVkX3RyZWUiICkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaW9ycyA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgdHBhcmFtc19ub2RlLCAicHJpb3JzIiApOworICAgICAgICBpZiggcHJpb3JzICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFDVl9JU19NQVQocHJpb3JzKSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJwcmlvcnMgbXVzdCBzdG9yZWQgYXMgYSBtYXRyaXgiICk7CisgICAgICAgICAgICBwcmlvcnNfbXVsdCA9IGN2Q2xvbmVNYXQoIHByaW9ycyApOworICAgICAgICB9CisgICAgfQorCisgICAgQ1ZfQ0FMTCggdmFyX2lkeCA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgbm9kZSwgInZhcl9pZHgiICkpOworICAgIGlmKCB2YXJfaWR4ICkKKyAgICB7CisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKHZhcl9pZHgpIHx8CisgICAgICAgICAgICB2YXJfaWR4LT5jb2xzICE9IDEgJiYgdmFyX2lkeC0+cm93cyAhPSAxIHx8CisgICAgICAgICAgICB2YXJfaWR4LT5jb2xzICsgdmFyX2lkeC0+cm93cyAtIDEgIT0gdmFyX2NvdW50IHx8CisgICAgICAgICAgICBDVl9NQVRfVFlQRSh2YXJfaWR4LT50eXBlKSAhPSBDVl8zMlNDMSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwKKyAgICAgICAgICAgICAgICAidmFyX2lkeCAoaWYgZXhpc3QpIG11c3QgYmUgdmFsaWQgMWQgaW50ZWdlciB2ZWN0b3IgY29udGFpbmluZyA8dmFyX2NvdW50PiBlbGVtZW50cyIgKTsKKworICAgICAgICBmb3IoIHZpID0gMDsgdmkgPCB2YXJfY291bnQ7IHZpKysgKQorICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2YXJfaWR4LT5kYXRhLmlbdmldID49ICh1bnNpZ25lZCl2YXJfYWxsICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInNvbWUgb2YgdmFyX2lkeCBlbGVtZW50cyBhcmUgb3V0IG9mIHJhbmdlIiApOworICAgIH0KKyAgICAKKyAgICAvLy8vLy8gcmVhZCB2YXIgdHlwZQorICAgIENWX0NBTEwoIHZhcl90eXBlID0gY3ZDcmVhdGVNYXQoIDEsIHZhcl9jb3VudCArIDIsIENWXzMyU0MxICkpOworCisgICAgY2F0X3Zhcl9jb3VudCA9IDA7CisgICAgb3JkX3Zhcl9jb3VudCA9IC0xOworICAgIHZhcnR5cGVfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBub2RlLCAidmFyX3R5cGUiICk7CisKKyAgICBpZiggdmFydHlwZV9ub2RlICYmIENWX05PREVfVFlQRSh2YXJ0eXBlX25vZGUtPnRhZykgPT0gQ1ZfTk9ERV9JTlQgJiYgdmFyX2NvdW50ID09IDEgKQorICAgICAgICB2YXJfdHlwZS0+ZGF0YS5pWzBdID0gdmFydHlwZV9ub2RlLT5kYXRhLmkgPyBjYXRfdmFyX2NvdW50KysgOiBvcmRfdmFyX2NvdW50LS07CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoICF2YXJ0eXBlX25vZGUgfHwgQ1ZfTk9ERV9UWVBFKHZhcnR5cGVfbm9kZS0+dGFnKSAhPSBDVl9OT0RFX1NFUSB8fAorICAgICAgICAgICAgdmFydHlwZV9ub2RlLT5kYXRhLnNlcS0+dG90YWwgIT0gdmFyX2NvdW50ICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLCAidmFyX3R5cGUgbXVzdCBleGlzdCBhbmQgYmUgYSBzZXF1ZW5jZSBvZiAwJ3MgYW5kIDEncyIgKTsKKworICAgICAgICBjdlN0YXJ0UmVhZFNlcSggdmFydHlwZV9ub2RlLT5kYXRhLnNlcSwgJnJlYWRlciApOworICAgIAorICAgICAgICBmb3IoIHZpID0gMDsgdmkgPCB2YXJfY291bnQ7IHZpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkZpbGVOb2RlKiBuID0gKEN2RmlsZU5vZGUqKXJlYWRlci5wdHI7CisgICAgICAgICAgICBpZiggQ1ZfTk9ERV9UWVBFKG4tPnRhZykgIT0gQ1ZfTk9ERV9JTlQgfHwgKG4tPmRhdGEuaSAmIH4xKSApCisgICAgICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJ2YXJfdHlwZSBtdXN0IGV4aXN0IGFuZCBiZSBhIHNlcXVlbmNlIG9mIDAncyBhbmQgMSdzIiApOworICAgICAgICAgICAgdmFyX3R5cGUtPmRhdGEuaVt2aV0gPSBuLT5kYXRhLmkgPyBjYXRfdmFyX2NvdW50KysgOiBvcmRfdmFyX2NvdW50LS07CisgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCByZWFkZXIuc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICB9CisgICAgfQorICAgIHZhcl90eXBlLT5kYXRhLmlbdmFyX2NvdW50XSA9IGNhdF92YXJfY291bnQ7CisKKyAgICBvcmRfdmFyX2NvdW50ID0gfm9yZF92YXJfY291bnQ7CisgICAgaWYoIGNhdF92YXJfY291bnQgIT0gY2F0X3Zhcl9jb3VudCB8fCBvcmRfdmFyX2NvdW50ICE9IG9yZF92YXJfY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgInZhcl90eXBlIGlzIGluY29uc2lzdGVudCB3aXRoIGNhdF92YXJfY291bnQgYW5kIG9yZF92YXJfY291bnQiICk7CisgICAgLy8vLy8vCisKKyAgICBpZiggY2F0X3Zhcl9jb3VudCA+IDAgfHwgaXNfY2xhc3NpZmllciApCisgICAgeworICAgICAgICBpbnQgY2NvdW50LCB0b3RhbF9jX2NvdW50ID0gMDsKKyAgICAgICAgQ1ZfQ0FMTCggY2F0X2NvdW50ID0gKEN2TWF0KiljdlJlYWRCeU5hbWUoIGZzLCBub2RlLCAiY2F0X2NvdW50IiApKTsKKyAgICAgICAgQ1ZfQ0FMTCggY2F0X21hcCA9IChDdk1hdCopY3ZSZWFkQnlOYW1lKCBmcywgbm9kZSwgImNhdF9tYXAiICkpOworCisgICAgICAgIGlmKCAhQ1ZfSVNfTUFUKGNhdF9jb3VudCkgfHwgIUNWX0lTX01BVChjYXRfbWFwKSB8fAorICAgICAgICAgICAgY2F0X2NvdW50LT5jb2xzICE9IDEgJiYgY2F0X2NvdW50LT5yb3dzICE9IDEgfHwKKyAgICAgICAgICAgIENWX01BVF9UWVBFKGNhdF9jb3VudC0+dHlwZSkgIT0gQ1ZfMzJTQzEgfHwKKyAgICAgICAgICAgIGNhdF9jb3VudC0+Y29scyArIGNhdF9jb3VudC0+cm93cyAtIDEgIT0gY2F0X3Zhcl9jb3VudCArIGlzX2NsYXNzaWZpZXIgfHwKKyAgICAgICAgICAgIGNhdF9tYXAtPmNvbHMgIT0gMSAmJiBjYXRfbWFwLT5yb3dzICE9IDEgfHwKKyAgICAgICAgICAgIENWX01BVF9UWVBFKGNhdF9tYXAtPnR5cGUpICE9IENWXzMyU0MxICkKKyAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNQYXJzZUVycm9yLAorICAgICAgICAgICAgIkJvdGggY2F0X2NvdW50IGFuZCBjYXRfbWFwIG11c3QgZXhpc3QgYW5kIGJlIHZhbGlkIDFkIGludGVnZXIgdmVjdG9ycyBvZiBhbiBhcHByb3ByaWF0ZSBzaXplIiApOworCisgICAgICAgIGNjb3VudCA9IGNhdF92YXJfY291bnQgKyBpc19jbGFzc2lmaWVyOworCisgICAgICAgIENWX0NBTEwoIGNhdF9vZnMgPSBjdkNyZWF0ZU1hdCggMSwgY2NvdW50ICsgMSwgQ1ZfMzJTQzEgKSk7CisgICAgICAgIGNhdF9vZnMtPmRhdGEuaVswXSA9IDA7CisgICAgICAgIG1heF9jX2NvdW50ID0gMTsKKworICAgICAgICBmb3IoIHZpID0gMDsgdmkgPCBjY291bnQ7IHZpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdmFsID0gY2F0X2NvdW50LT5kYXRhLmlbdmldOworICAgICAgICAgICAgaWYoIHZhbCA8PSAwICkKKyAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgInNvbWUgb2YgY2F0X2NvdW50IGVsZW1lbnRzIGFyZSBvdXQgb2YgcmFuZ2UiICk7CisgICAgICAgICAgICBtYXhfY19jb3VudCA9IE1BWCggbWF4X2NfY291bnQsIHZhbCApOworICAgICAgICAgICAgY2F0X29mcy0+ZGF0YS5pW3ZpKzFdID0gdG90YWxfY19jb3VudCArPSB2YWw7CisgICAgICAgIH0KKworICAgICAgICBpZiggY2F0X21hcC0+Y29scyArIGNhdF9tYXAtPnJvd3MgLSAxICE9IHRvdGFsX2NfY291bnQgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0JhZFNpemUsCisgICAgICAgICAgICAiY2F0X21hcCB2ZWN0b3IgbGVuZ3RoIGlzIG5vdCBlcXVhbCB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGNhdGVnb3JpZXMgaW4gYWxsIGNhdGVnb3JpY2FsIHZhcnMiICk7CisgICAgfQorCisgICAgbWF4X3NwbGl0X3NpemUgPSBjdkFsaWduKHNpemVvZihDdkRUcmVlU3BsaXQpICsKKyAgICAgICAgKE1BWCgwLG1heF9jX2NvdW50IC0gMzMpLzMyKSpzaXplb2YoaW50KSxzaXplb2Yodm9pZCopKTsKKworICAgIHRyZWVfYmxvY2tfc2l6ZSA9IE1BWCgoaW50KXNpemVvZihDdkRUcmVlTm9kZSkqOCwgbWF4X3NwbGl0X3NpemUpOworICAgIHRyZWVfYmxvY2tfc2l6ZSA9IE1BWCh0cmVlX2Jsb2NrX3NpemUgKyBibG9ja19zaXplX2RlbHRhLCBtaW5fYmxvY2tfc2l6ZSk7CisgICAgQ1ZfQ0FMTCggdHJlZV9zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCB0cmVlX2Jsb2NrX3NpemUgKSk7CisgICAgQ1ZfQ0FMTCggbm9kZV9oZWFwID0gY3ZDcmVhdGVTZXQoIDAsIHNpemVvZihub2RlX2hlYXBbMF0pLAorICAgICAgICAgICAgc2l6ZW9mKEN2RFRyZWVOb2RlKSwgdHJlZV9zdG9yYWdlICkpOworICAgIENWX0NBTEwoIHNwbGl0X2hlYXAgPSBjdkNyZWF0ZVNldCggMCwgc2l6ZW9mKHNwbGl0X2hlYXBbMF0pLAorICAgICAgICAgICAgbWF4X3NwbGl0X3NpemUsIHRyZWVfc3RvcmFnZSApKTsKKworICAgIF9fRU5EX187Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gRGVjaXNpb24gVHJlZSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0N2RFRyZWU6OkN2RFRyZWUoKQoreworICAgIGRhdGEgPSAwOworICAgIHZhcl9pbXBvcnRhbmNlID0gMDsKKyAgICBkZWZhdWx0X21vZGVsX25hbWUgPSAibXlfdHJlZSI7CisKKyAgICBjbGVhcigpOworfQorCisKK3ZvaWQgQ3ZEVHJlZTo6Y2xlYXIoKQoreworICAgIGN2UmVsZWFzZU1hdCggJnZhcl9pbXBvcnRhbmNlICk7CisgICAgaWYoIGRhdGEgKQorICAgIHsKKyAgICAgICAgaWYoICFkYXRhLT5zaGFyZWQgKQorICAgICAgICAgICAgZGVsZXRlIGRhdGE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZyZWVfdHJlZSgpOworICAgICAgICBkYXRhID0gMDsKKyAgICB9CisgICAgcm9vdCA9IDA7CisgICAgcHJ1bmVkX3RyZWVfaWR4ID0gLTE7Cit9CisKKworQ3ZEVHJlZTo6fkN2RFRyZWUoKQoreworICAgIGNsZWFyKCk7Cit9CisKKworY29uc3QgQ3ZEVHJlZU5vZGUqIEN2RFRyZWU6OmdldF9yb290KCkgY29uc3QKK3sKKyAgICByZXR1cm4gcm9vdDsKK30KKworCitpbnQgQ3ZEVHJlZTo6Z2V0X3BydW5lZF90cmVlX2lkeCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBydW5lZF90cmVlX2lkeDsKK30KKworCitDdkRUcmVlVHJhaW5EYXRhKiBDdkRUcmVlOjpnZXRfZGF0YSgpCit7CisgICAgcmV0dXJuIGRhdGE7Cit9CisKKworYm9vbCBDdkRUcmVlOjp0cmFpbiggY29uc3QgQ3ZNYXQqIF90cmFpbl9kYXRhLCBpbnQgX3RmbGFnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3ZNYXQqIF9yZXNwb25zZXMsIGNvbnN0IEN2TWF0KiBfdmFyX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfc2FtcGxlX2lkeCwgY29uc3QgQ3ZNYXQqIF92YXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEN2TWF0KiBfbWlzc2luZ19tYXNrLCBDdkRUcmVlUGFyYW1zIF9wYXJhbXMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2RFRyZWU6OnRyYWluIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgY2xlYXIoKTsKKyAgICBkYXRhID0gbmV3IEN2RFRyZWVUcmFpbkRhdGEoIF90cmFpbl9kYXRhLCBfdGZsYWcsIF9yZXNwb25zZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdmFyX2lkeCwgX3NhbXBsZV9pZHgsIF92YXJfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9taXNzaW5nX21hc2ssIF9wYXJhbXMsIGZhbHNlICk7CisgICAgQ1ZfQ0FMTCggcmVzdWx0ID0gZG9fdHJhaW4oMCkpOworCisgICAgX19FTkRfXzsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCBDdkRUcmVlOjp0cmFpbiggQ3ZEVHJlZVRyYWluRGF0YSogX2RhdGEsIGNvbnN0IEN2TWF0KiBfc3Vic2FtcGxlX2lkeCApCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZTo6dHJhaW4iICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBjbGVhcigpOworICAgIGRhdGEgPSBfZGF0YTsKKyAgICBkYXRhLT5zaGFyZWQgPSB0cnVlOworICAgIENWX0NBTEwoIHJlc3VsdCA9IGRvX3RyYWluKF9zdWJzYW1wbGVfaWR4KSk7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sIEN2RFRyZWU6OmRvX3RyYWluKCBjb25zdCBDdk1hdCogX3N1YnNhbXBsZV9pZHggKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDVl9GVU5DTkFNRSggIkN2RFRyZWU6OmRvX3RyYWluIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgcm9vdCA9IGRhdGEtPnN1YnNhbXBsZV9kYXRhKCBfc3Vic2FtcGxlX2lkeCApOworCisgICAgQ1ZfQ0FMTCggdHJ5X3NwbGl0X25vZGUocm9vdCkpOworICAgIAorICAgIGlmKCBkYXRhLT5wYXJhbXMuY3ZfZm9sZHMgPiAwICkKKyAgICAgICAgQ1ZfQ0FMTCggcHJ1bmVfY3YoKSk7CisKKyAgICBpZiggIWRhdGEtPnNoYXJlZCApCisgICAgICAgIGRhdGEtPmZyZWVfdHJhaW5fZGF0YSgpOworCisgICAgcmVzdWx0ID0gdHJ1ZTsKKworICAgIF9fRU5EX187CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK3ZvaWQgQ3ZEVHJlZTo6dHJ5X3NwbGl0X25vZGUoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIGJlc3Rfc3BsaXQgPSAwOworICAgIGludCBpLCBuID0gbm9kZS0+c2FtcGxlX2NvdW50LCB2aTsKKyAgICBib29sIGNhbl9zcGxpdCA9IHRydWU7CisgICAgZG91YmxlIHF1YWxpdHlfc2NhbGU7CisKKyAgICBjYWxjX25vZGVfdmFsdWUoIG5vZGUgKTsKKworICAgIGlmKCBub2RlLT5zYW1wbGVfY291bnQgPD0gZGF0YS0+cGFyYW1zLm1pbl9zYW1wbGVfY291bnQgfHwKKyAgICAgICAgbm9kZS0+ZGVwdGggPj0gZGF0YS0+cGFyYW1zLm1heF9kZXB0aCApCisgICAgICAgIGNhbl9zcGxpdCA9IGZhbHNlOworCisgICAgaWYoIGNhbl9zcGxpdCAmJiBkYXRhLT5pc19jbGFzc2lmaWVyICkKKyAgICB7CisgICAgICAgIC8vIGNoZWNrIGlmIHdlIGhhdmUgYSAicHVyZSIgbm9kZSwKKyAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgY2xzX2NvdW50IGlzIGZpbGxlZCBieSBjYWxjX25vZGVfdmFsdWUoKQorICAgICAgICBpbnQqIGNsc19jb3VudCA9IGRhdGEtPmNvdW50cy0+ZGF0YS5pOworICAgICAgICBpbnQgbnogPSAwLCBtID0gZGF0YS0+Z2V0X251bV9jbGFzc2VzKCk7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtOyBpKysgKQorICAgICAgICAgICAgbnogKz0gY2xzX2NvdW50W2ldICE9IDA7CisgICAgICAgIGlmKCBueiA9PSAxICkgLy8gdGhlcmUgaXMgb25seSBvbmUgY2xhc3MKKyAgICAgICAgICAgIGNhbl9zcGxpdCA9IGZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmKCBjYW5fc3BsaXQgKQorICAgIHsKKyAgICAgICAgaWYoIHNxcnQobm9kZS0+bm9kZV9yaXNrKS9uIDwgZGF0YS0+cGFyYW1zLnJlZ3Jlc3Npb25fYWNjdXJhY3kgKQorICAgICAgICAgICAgY2FuX3NwbGl0ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYoIGNhbl9zcGxpdCApCisgICAgeworICAgICAgICBiZXN0X3NwbGl0ID0gZmluZF9iZXN0X3NwbGl0KG5vZGUpOworICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgc3BsaXQgcXVhbGl0eSAuLi4KKyAgICAgICAgbm9kZS0+c3BsaXQgPSBiZXN0X3NwbGl0OworICAgIH0KKworICAgIGlmKCAhY2FuX3NwbGl0IHx8ICFiZXN0X3NwbGl0ICkKKyAgICB7CisgICAgICAgIGRhdGEtPmZyZWVfbm9kZV9kYXRhKG5vZGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcXVhbGl0eV9zY2FsZSA9IGNhbGNfbm9kZV9kaXIoIG5vZGUgKTsKKworICAgIGlmKCBkYXRhLT5wYXJhbXMudXNlX3N1cnJvZ2F0ZXMgKQorICAgIHsKKyAgICAgICAgLy8gZmluZCBhbGwgdGhlIHN1cnJvZ2F0ZSBzcGxpdHMKKyAgICAgICAgLy8gYW5kIHNvcnQgdGhlbSBieSB0aGVpciBzaW1pbGFyaXR5IHRvIHRoZSBwcmltYXJ5IG9uZQorICAgICAgICBmb3IoIHZpID0gMDsgdmkgPCBkYXRhLT52YXJfY291bnQ7IHZpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkRUcmVlU3BsaXQqIHNwbGl0OworICAgICAgICAgICAgaW50IGNpID0gZGF0YS0+Z2V0X3Zhcl90eXBlKHZpKTsKKworICAgICAgICAgICAgaWYoIHZpID09IGJlc3Rfc3BsaXQtPnZhcl9pZHggKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiggY2kgPj0gMCApCisgICAgICAgICAgICAgICAgc3BsaXQgPSBmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9jYXQoIG5vZGUsIHZpICk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc3BsaXQgPSBmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9vcmQoIG5vZGUsIHZpICk7CisKKyAgICAgICAgICAgIGlmKCBzcGxpdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IHRoZSBzcGxpdAorICAgICAgICAgICAgICAgIEN2RFRyZWVTcGxpdCogcHJldl9zcGxpdCA9IG5vZGUtPnNwbGl0OworICAgICAgICAgICAgICAgIHNwbGl0LT5xdWFsaXR5ID0gKGZsb2F0KShzcGxpdC0+cXVhbGl0eSpxdWFsaXR5X3NjYWxlKTsKKworICAgICAgICAgICAgICAgIHdoaWxlKCBwcmV2X3NwbGl0LT5uZXh0ICYmCisgICAgICAgICAgICAgICAgICAgICAgIHByZXZfc3BsaXQtPm5leHQtPnF1YWxpdHkgPiBzcGxpdC0+cXVhbGl0eSApCisgICAgICAgICAgICAgICAgICAgIHByZXZfc3BsaXQgPSBwcmV2X3NwbGl0LT5uZXh0OworICAgICAgICAgICAgICAgIHNwbGl0LT5uZXh0ID0gcHJldl9zcGxpdC0+bmV4dDsKKyAgICAgICAgICAgICAgICBwcmV2X3NwbGl0LT5uZXh0ID0gc3BsaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcGxpdF9ub2RlX2RhdGEoIG5vZGUgKTsKKyAgICB0cnlfc3BsaXRfbm9kZSggbm9kZS0+bGVmdCApOworICAgIHRyeV9zcGxpdF9ub2RlKCBub2RlLT5yaWdodCApOworfQorCisKKy8vIGNhbGN1bGF0ZSBkaXJlY3Rpb24gKGxlZnQoLTEpLHJpZ2h0KDEpLG1pc3NpbmcoMCkpCisvLyBmb3IgZWFjaCBzYW1wbGUgdXNpbmcgdGhlIGJlc3Qgc3BsaXQKKy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHNjYWxlIGNvZWZmaWNpZW50cyBmb3Igc3Vycm9nYXRlIHNwbGl0IHF1YWxpdHkgZmFjdG9ycy4KKy8vIHRoZSBzY2FsZSBpcyBhcHBsaWVkIHRvIG5vcm1hbGl6ZSBzdXJyb2dhdGUgc3BsaXQgcXVhbGl0eSByZWxhdGl2ZWx5IHRvIHRoZQorLy8gYmVzdCAocHJpbWFyeSkgc3BsaXQgcXVhbGl0eS4gVGhhdCBpcywgaWYgYSBzdXJyb2dhdGUgc3BsaXQgaXMgYWJzb2x1dGVseQorLy8gaWRlbnRpY2FsIHRvIHRoZSBwcmltYXJ5IHNwbGl0LCBpdHMgcXVhbGl0eSB3aWxsIGJlIHNldCB0byB0aGUgbWF4aW11bSB2YWx1ZSA9IAorLy8gcXVhbGl0eSBvZiB0aGUgcHJpbWFyeSBzcGxpdDsgb3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGxvd2VyLgorLy8gYmVzaWRlcywgdGhlIGZ1bmN0aW9uIGNvbXB1dGUgbm9kZS0+bWF4bHIsCisvLyBtaW5pbXVtIHBvc3NpYmxlIHF1YWxpdHkgKHcvbyBjb25zaWRlcmluZyB0aGUgYWJvdmUgbWVudGlvbmVkIHNjYWxlKQorLy8gZm9yIGEgc3Vycm9nYXRlIHNwbGl0LiBTdXJyb2dhdGUgc3BsaXRzIHdpdGggcXVhbGl0eSBsZXNzIHRoYW4gbm9kZS0+bWF4bHIKKy8vIGFyZSBub3QgZGlzY2FyZGVkLgorZG91YmxlIEN2RFRyZWU6OmNhbGNfbm9kZV9kaXIoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBjaGFyKiBkaXIgPSAoY2hhciopZGF0YS0+ZGlyZWN0aW9uLT5kYXRhLnB0cjsKKyAgICBpbnQgaSwgbiA9IG5vZGUtPnNhbXBsZV9jb3VudCwgdmkgPSBub2RlLT5zcGxpdC0+dmFyX2lkeDsKKyAgICBkb3VibGUgTCwgUjsKKworICAgIGFzc2VydCggIW5vZGUtPnNwbGl0LT5pbnZlcnNlZCApOworCisgICAgaWYoIGRhdGEtPmdldF92YXJfdHlwZSh2aSkgPj0gMCApIC8vIHNwbGl0IG9uIGNhdGVnb3JpY2FsIHZhcgorICAgIHsKKyAgICAgICAgY29uc3QgaW50KiBsYWJlbHMgPSBkYXRhLT5nZXRfY2F0X3Zhcl9kYXRhKG5vZGUsdmkpOworICAgICAgICBjb25zdCBpbnQqIHN1YnNldCA9IG5vZGUtPnNwbGl0LT5zdWJzZXQ7CisKKyAgICAgICAgaWYoICFkYXRhLT5oYXZlX3ByaW9ycyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBzdW0gPSAwLCBzdW1fYWJzID0gMDsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgICAgICBpbnQgZCA9IGlkeCA+PSAwID8gQ1ZfRFRSRUVfQ0FUX0RJUihpZHgsc3Vic2V0KSA6IDA7CisgICAgICAgICAgICAgICAgc3VtICs9IGQ7IHN1bV9hYnMgKz0gZCAmIDE7CisgICAgICAgICAgICAgICAgZGlyW2ldID0gKGNoYXIpZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUiA9IChzdW1fYWJzICsgc3VtKSA+PiAxOworICAgICAgICAgICAgTCA9IChzdW1fYWJzIC0gc3VtKSA+PiAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfY2xhc3NfbGFiZWxzKG5vZGUpOworICAgICAgICAgICAgY29uc3QgZG91YmxlKiBwcmlvcnMgPSBkYXRhLT5wcmlvcnNfbXVsdC0+ZGF0YS5kYjsKKyAgICAgICAgICAgIGRvdWJsZSBzdW0gPSAwLCBzdW1fYWJzID0gMDsKKworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHByaW9yc1tyZXNwb25zZXNbaV1dOworICAgICAgICAgICAgICAgIGludCBkID0gaWR4ID49IDAgPyBDVl9EVFJFRV9DQVRfRElSKGlkeCxzdWJzZXQpIDogMDsKKyAgICAgICAgICAgICAgICBzdW0gKz0gZCp3OyBzdW1fYWJzICs9IChkICYgMSkqdzsKKyAgICAgICAgICAgICAgICBkaXJbaV0gPSAoY2hhcilkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBSID0gKHN1bV9hYnMgKyBzdW0pICogMC41OworICAgICAgICAgICAgTCA9IChzdW1fYWJzIC0gc3VtKSAqIDAuNTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIHNwbGl0IG9uIG9yZGVyZWQgdmFyCisgICAgeworICAgICAgICBjb25zdCBDdlBhaXIzMnMzMmYqIHNvcnRlZCA9IGRhdGEtPmdldF9vcmRfdmFyX2RhdGEobm9kZSx2aSk7CisgICAgICAgIGludCBzcGxpdF9wb2ludCA9IG5vZGUtPnNwbGl0LT5vcmQuc3BsaXRfcG9pbnQ7CisgICAgICAgIGludCBuMSA9IG5vZGUtPmdldF9udW1fdmFsaWQodmkpOworCisgICAgICAgIGFzc2VydCggMCA8PSBzcGxpdF9wb2ludCAmJiBzcGxpdF9wb2ludCA8IG4xLTEgKTsKKworICAgICAgICBpZiggIWRhdGEtPmhhdmVfcHJpb3JzICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8PSBzcGxpdF9wb2ludDsgaSsrICkKKyAgICAgICAgICAgICAgICBkaXJbc29ydGVkW2ldLmldID0gKGNoYXIpLTE7CisgICAgICAgICAgICBmb3IoIDsgaSA8IG4xOyBpKysgKQorICAgICAgICAgICAgICAgIGRpcltzb3J0ZWRbaV0uaV0gPSAoY2hhcikxOworICAgICAgICAgICAgZm9yKCA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgICAgIGRpcltzb3J0ZWRbaV0uaV0gPSAoY2hhcikwOworCisgICAgICAgICAgICBMID0gc3BsaXRfcG9pbnQtMTsKKyAgICAgICAgICAgIFIgPSBuMSAtIHNwbGl0X3BvaW50ICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X2NsYXNzX2xhYmVscyhub2RlKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSogcHJpb3JzID0gZGF0YS0+cHJpb3JzX211bHQtPmRhdGEuZGI7CisgICAgICAgICAgICBMID0gUiA9IDA7CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPD0gc3BsaXRfcG9pbnQ7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHNvcnRlZFtpXS5pOworICAgICAgICAgICAgICAgIGRvdWJsZSB3ID0gcHJpb3JzW3Jlc3BvbnNlc1tpZHhdXTsKKyAgICAgICAgICAgICAgICBkaXJbaWR4XSA9IChjaGFyKS0xOworICAgICAgICAgICAgICAgIEwgKz0gdzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCA7IGkgPCBuMTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgICAgICAgICAgZG91YmxlIHcgPSBwcmlvcnNbcmVzcG9uc2VzW2lkeF1dOworICAgICAgICAgICAgICAgIGRpcltpZHhdID0gKGNoYXIpMTsKKyAgICAgICAgICAgICAgICBSICs9IHc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgICAgICBkaXJbc29ydGVkW2ldLmldID0gKGNoYXIpMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIG5vZGUtPm1heGxyID0gTUFYKCBMLCBSICk7CisgICAgcmV0dXJuIG5vZGUtPnNwbGl0LT5xdWFsaXR5LyhMICsgUik7Cit9CisKKworQ3ZEVHJlZVNwbGl0KiBDdkRUcmVlOjpmaW5kX2Jlc3Rfc3BsaXQoIEN2RFRyZWVOb2RlKiBub2RlICkKK3sKKyAgICBpbnQgdmk7CisgICAgQ3ZEVHJlZVNwbGl0ICpiZXN0X3NwbGl0ID0gMCwgKnNwbGl0ID0gMCwgKnQ7CisKKyAgICBmb3IoIHZpID0gMDsgdmkgPCBkYXRhLT52YXJfY291bnQ7IHZpKysgKQorICAgIHsKKyAgICAgICAgaW50IGNpID0gZGF0YS0+Z2V0X3Zhcl90eXBlKHZpKTsKKyAgICAgICAgaWYoIG5vZGUtPmdldF9udW1fdmFsaWQodmkpIDw9IDEgKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoIGRhdGEtPmlzX2NsYXNzaWZpZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY2kgPj0gMCApCisgICAgICAgICAgICAgICAgc3BsaXQgPSBmaW5kX3NwbGl0X2NhdF9jbGFzcyggbm9kZSwgdmkgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcGxpdCA9IGZpbmRfc3BsaXRfb3JkX2NsYXNzKCBub2RlLCB2aSApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGNpID49IDAgKQorICAgICAgICAgICAgICAgIHNwbGl0ID0gZmluZF9zcGxpdF9jYXRfcmVnKCBub2RlLCB2aSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwbGl0ID0gZmluZF9zcGxpdF9vcmRfcmVnKCBub2RlLCB2aSApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIHNwbGl0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoICFiZXN0X3NwbGl0IHx8IGJlc3Rfc3BsaXQtPnF1YWxpdHkgPCBzcGxpdC0+cXVhbGl0eSApCisgICAgICAgICAgICAgICAgQ1ZfU1dBUCggYmVzdF9zcGxpdCwgc3BsaXQsIHQgKTsKKyAgICAgICAgICAgIGlmKCBzcGxpdCApCisgICAgICAgICAgICAgICAgY3ZTZXRSZW1vdmVCeVB0ciggZGF0YS0+c3BsaXRfaGVhcCwgc3BsaXQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0X3NwbGl0OworfQorCisKK0N2RFRyZWVTcGxpdCogQ3ZEVHJlZTo6ZmluZF9zcGxpdF9vcmRfY2xhc3MoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGZsb2F0IGVwc2lsb24gPSBGTFRfRVBTSUxPTioyOworICAgIGNvbnN0IEN2UGFpcjMyczMyZiogc29ydGVkID0gZGF0YS0+Z2V0X29yZF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgaW50KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfY2xhc3NfbGFiZWxzKG5vZGUpOworICAgIGludCBuID0gbm9kZS0+c2FtcGxlX2NvdW50OworICAgIGludCBuMSA9IG5vZGUtPmdldF9udW1fdmFsaWQodmkpOworICAgIGludCBtID0gZGF0YS0+Z2V0X251bV9jbGFzc2VzKCk7CisgICAgY29uc3QgaW50KiByYzAgPSBkYXRhLT5jb3VudHMtPmRhdGEuaTsKKyAgICBpbnQqIGxjID0gKGludCopY3ZTdGFja0FsbG9jKG0qc2l6ZW9mKGxjWzBdKSk7CisgICAgaW50KiByYyA9IChpbnQqKWN2U3RhY2tBbGxvYyhtKnNpemVvZihyY1swXSkpOworICAgIGludCBpLCBiZXN0X2kgPSAtMTsKKyAgICBkb3VibGUgbHN1bTIgPSAwLCByc3VtMiA9IDAsIGJlc3RfdmFsID0gMDsKKyAgICBjb25zdCBkb3VibGUqIHByaW9ycyA9IGRhdGEtPmhhdmVfcHJpb3JzID8gZGF0YS0+cHJpb3JzX211bHQtPmRhdGEuZGIgOiAwOworCisgICAgLy8gaW5pdCBhcnJheXMgb2YgY2xhc3MgaW5zdGFuY2UgY291bnRlcnMgb24gYm90aCBzaWRlcyBvZiB0aGUgc3BsaXQKKyAgICBmb3IoIGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICB7CisgICAgICAgIGxjW2ldID0gMDsKKyAgICAgICAgcmNbaV0gPSByYzBbaV07CisgICAgfQorCisgICAgLy8gY29tcGVuc2F0ZSBmb3IgbWlzc2luZyB2YWx1ZXMKKyAgICBmb3IoIGkgPSBuMTsgaSA8IG47IGkrKyApCisgICAgICAgIHJjW3Jlc3BvbnNlc1tzb3J0ZWRbaV0uaV1dLS07CisKKyAgICBpZiggIXByaW9ycyApCisgICAgeworICAgICAgICBpbnQgTCA9IDAsIFIgPSBuMTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICAgICAgICAgIHJzdW0yICs9IChkb3VibGUpcmNbaV0qcmNbaV07CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IHJlc3BvbnNlc1tzb3J0ZWRbaV0uaV07CisgICAgICAgICAgICBpbnQgbHYsIHJ2OworICAgICAgICAgICAgTCsrOyBSLS07CisgICAgICAgICAgICBsdiA9IGxjW2lkeF07IHJ2ID0gcmNbaWR4XTsKKyAgICAgICAgICAgIGxzdW0yICs9IGx2KjIgKyAxOworICAgICAgICAgICAgcnN1bTIgLT0gcnYqMiAtIDE7CisgICAgICAgICAgICBsY1tpZHhdID0gbHYgKyAxOyByY1tpZHhdID0gcnYgLSAxOworCisgICAgICAgICAgICBpZiggc29ydGVkW2ldLnZhbCArIGVwc2lsb24gPCBzb3J0ZWRbaSsxXS52YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSAobHN1bTIqUiArIHJzdW0yKkwpLygoZG91YmxlKUwqUik7CisgICAgICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICBiZXN0X2kgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkb3VibGUgTCA9IDAsIFIgPSAwOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHd2ID0gcmNbaV0qcHJpb3JzW2ldOworICAgICAgICAgICAgUiArPSB3djsKKyAgICAgICAgICAgIHJzdW0yICs9IHd2Knd2OworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IHJlc3BvbnNlc1tzb3J0ZWRbaV0uaV07CisgICAgICAgICAgICBpbnQgbHYsIHJ2OworICAgICAgICAgICAgZG91YmxlIHAgPSBwcmlvcnNbaWR4XSwgcDIgPSBwKnA7CisgICAgICAgICAgICBMICs9IHA7IFIgLT0gcDsKKyAgICAgICAgICAgIGx2ID0gbGNbaWR4XTsgcnYgPSByY1tpZHhdOworICAgICAgICAgICAgbHN1bTIgKz0gcDIqKGx2KjIgKyAxKTsKKyAgICAgICAgICAgIHJzdW0yIC09IHAyKihydioyIC0gMSk7CisgICAgICAgICAgICBsY1tpZHhdID0gbHYgKyAxOyByY1tpZHhdID0gcnYgLSAxOworCisgICAgICAgICAgICBpZiggc29ydGVkW2ldLnZhbCArIGVwc2lsb24gPCBzb3J0ZWRbaSsxXS52YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWwgPSAobHN1bTIqUiArIHJzdW0yKkwpLygoZG91YmxlKUwqUik7CisgICAgICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICBiZXN0X2kgPSBpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0X2kgPj0gMCA/IGRhdGEtPm5ld19zcGxpdF9vcmQoIHZpLAorICAgICAgICAoc29ydGVkW2Jlc3RfaV0udmFsICsgc29ydGVkW2Jlc3RfaSsxXS52YWwpKjAuNWYsIGJlc3RfaSwKKyAgICAgICAgMCwgKGZsb2F0KWJlc3RfdmFsICkgOiAwOworfQorCisKK3ZvaWQgQ3ZEVHJlZTo6Y2x1c3Rlcl9jYXRlZ29yaWVzKCBjb25zdCBpbnQqIHZlY3RvcnMsIGludCBuLCBpbnQgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBjc3VtcywgaW50IGssIGludCogbGFiZWxzICkKK3sKKyAgICAvLyBUT0RPOiBjb25zaWRlciBhZGRpbmcgcHJpb3JzIChjbGFzcyB3ZWlnaHRzKSBhbmQgc2FtcGxlIHdlaWdodHMgdG8gdGhlIGNsdXN0ZXJpbmcgYWxnb3JpdGhtCisgICAgaW50IGl0ZXJzID0gMCwgbWF4X2l0ZXJzID0gMTAwOworICAgIGludCBpLCBqLCBpZHg7CisgICAgZG91YmxlKiBidWYgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIChuICsgaykqc2l6ZW9mKGJ1ZlswXSkgKTsKKyAgICBkb3VibGUgKnZfd2VpZ2h0cyA9IGJ1ZiwgKmNfd2VpZ2h0cyA9IGJ1ZiArIGs7CisgICAgYm9vbCBtb2RpZmllZCA9IHRydWU7CisgICAgQ3ZSTkcqIHIgPSAmZGF0YS0+cm5nOworCisgICAgLy8gYXNzaWduIGxhYmVscyByYW5kb21seQorICAgIGZvciggaSA9IGlkeCA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGNvbnN0IGludCogdiA9IHZlY3RvcnMgKyBpKm07CisgICAgICAgIGxhYmVsc1tpXSA9IGlkeCsrOworICAgICAgICBpZHggJj0gaWR4IDwgayA/IC0xIDogMDsKKworICAgICAgICAvLyBjb21wdXRlIHdlaWdodCBvZiBlYWNoIHZlY3RvcgorICAgICAgICBmb3IoIGogPSAwOyBqIDwgbTsgaisrICkKKyAgICAgICAgICAgIHN1bSArPSB2W2pdOworICAgICAgICB2X3dlaWdodHNbaV0gPSBzdW0gPyAxLi9zdW0gOiAwLjsKKyAgICB9CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBpMSA9IGN2UmFuZEludChyKSAlIG47CisgICAgICAgIGludCBpMiA9IGN2UmFuZEludChyKSAlIG47CisgICAgICAgIENWX1NXQVAoIGxhYmVsc1tpMV0sIGxhYmVsc1tpMl0sIGogKTsKKyAgICB9CisKKyAgICBmb3IoIGl0ZXJzID0gMDsgaXRlcnMgPD0gbWF4X2l0ZXJzOyBpdGVycysrICkKKyAgICB7CisgICAgICAgIC8vIGNhbGN1bGF0ZSBjc3VtcworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgazsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApCisgICAgICAgICAgICAgICAgY3N1bXNbaSptICsgal0gPSAwOworICAgICAgICB9CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGludCogdiA9IHZlY3RvcnMgKyBpKm07CisgICAgICAgICAgICBpbnQqIHMgPSBjc3VtcyArIGxhYmVsc1tpXSptOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApCisgICAgICAgICAgICAgICAgc1tqXSArPSB2W2pdOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXhpdCB0aGUgbG9vcCBoZXJlLCB3aGVuIHdlIGhhdmUgdXAtdG8tZGF0ZSBjc3VtcworICAgICAgICBpZiggaXRlcnMgPT0gbWF4X2l0ZXJzIHx8ICFtb2RpZmllZCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBtb2RpZmllZCA9IGZhbHNlOworCisgICAgICAgIC8vIGNhbGN1bGF0ZSB3ZWlnaHQgb2YgZWFjaCBjbHVzdGVyCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBrOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQqIHMgPSBjc3VtcyArIGkqbTsKKyAgICAgICAgICAgIGludCBzdW0gPSAwOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IG07IGorKyApCisgICAgICAgICAgICAgICAgc3VtICs9IHNbal07CisgICAgICAgICAgICBjX3dlaWdodHNbaV0gPSBzdW0gPyAxLi9zdW0gOiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93IGZvciBlYWNoIHZlY3RvciBkZXRlcm1pbmUgdGhlIGNsb3Nlc3QgY2x1c3RlcgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgaW50KiB2ID0gdmVjdG9ycyArIGkqbTsKKyAgICAgICAgICAgIGRvdWJsZSBhbHBoYSA9IHZfd2VpZ2h0c1tpXTsKKyAgICAgICAgICAgIGRvdWJsZSBtaW5fZGlzdDIgPSBEQkxfTUFYOworICAgICAgICAgICAgaW50IG1pbl9pZHggPSAtMTsKKworICAgICAgICAgICAgZm9yKCBpZHggPSAwOyBpZHggPCBrOyBpZHgrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50KiBzID0gY3N1bXMgKyBpZHgqbTsKKyAgICAgICAgICAgICAgICBkb3VibGUgZGlzdDIgPSAwLiwgYmV0YSA9IGNfd2VpZ2h0c1tpZHhdOworICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBtOyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB2W2pdKmFscGhhIC0gc1tqXSpiZXRhOworICAgICAgICAgICAgICAgICAgICBkaXN0MiArPSB0KnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBtaW5fZGlzdDIgPiBkaXN0MiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtaW5fZGlzdDIgPSBkaXN0MjsKKyAgICAgICAgICAgICAgICAgICAgbWluX2lkeCA9IGlkeDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBtaW5faWR4ICE9IGxhYmVsc1tpXSApCisgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgbGFiZWxzW2ldID0gbWluX2lkeDsKKyAgICAgICAgfQorICAgIH0KK30KKworCitDdkRUcmVlU3BsaXQqIEN2RFRyZWU6OmZpbmRfc3BsaXRfY2F0X2NsYXNzKCBDdkRUcmVlTm9kZSogbm9kZSwgaW50IHZpICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIHNwbGl0OworICAgIGNvbnN0IGludCogbGFiZWxzID0gZGF0YS0+Z2V0X2NhdF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgaW50KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfY2xhc3NfbGFiZWxzKG5vZGUpOworICAgIGludCBjaSA9IGRhdGEtPmdldF92YXJfdHlwZSh2aSk7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgaW50IG0gPSBkYXRhLT5nZXRfbnVtX2NsYXNzZXMoKTsKKyAgICBpbnQgX21pID0gZGF0YS0+Y2F0X2NvdW50LT5kYXRhLmlbY2ldLCBtaSA9IF9taTsKKyAgICBpbnQqIGxjID0gKGludCopY3ZTdGFja0FsbG9jKG0qc2l6ZW9mKGxjWzBdKSk7CisgICAgaW50KiByYyA9IChpbnQqKWN2U3RhY2tBbGxvYyhtKnNpemVvZihyY1swXSkpOworICAgIGludCogX2NqayA9IChpbnQqKWN2U3RhY2tBbGxvYyhtKihtaSsxKSpzaXplb2YoX2Nqa1swXSkpK20sICpjamsgPSBfY2prOworICAgIGRvdWJsZSogY193ZWlnaHRzID0gKGRvdWJsZSopY3ZTdGFja0FsbG9jKCBtaSpzaXplb2YoY193ZWlnaHRzWzBdKSApOworICAgIGludCogY2x1c3Rlcl9sYWJlbHMgPSAwOworICAgIGludCoqIGludF9wdHIgPSAwOworICAgIGludCBpLCBqLCBrLCBpZHg7CisgICAgZG91YmxlIEwgPSAwLCBSID0gMDsKKyAgICBkb3VibGUgYmVzdF92YWwgPSAwOworICAgIGludCBwcmV2Y29kZSA9IDAsIGJlc3Rfc3Vic2V0ID0gLTEsIHN1YnNldF9pLCBzdWJzZXRfbiwgc3VidHJhY3QgPSAwOworICAgIGNvbnN0IGRvdWJsZSogcHJpb3JzID0gZGF0YS0+cHJpb3JzX211bHQtPmRhdGEuZGI7CisKKyAgICAvLyBpbml0IGFycmF5IG9mIGNvdW50ZXJzOgorICAgIC8vIGNfe2prfSAtIG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaGF2ZSB2aS10aCBpbnB1dCB2YXJpYWJsZSA9IGogYW5kIHJlc3BvbnNlID0gay4KKyAgICBmb3IoIGogPSAtMTsgaiA8IG1pOyBqKysgKQorICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkKKyAgICAgICAgICAgIGNqa1tqKm0gKyBrXSA9IDA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICB7CisgICAgICAgIGogPSBsYWJlbHNbaV07CisgICAgICAgIGsgPSByZXNwb25zZXNbaV07CisgICAgICAgIGNqa1tqKm0gKyBrXSsrOworICAgIH0KKworICAgIGlmKCBtID4gMiApCisgICAgeworICAgICAgICBpZiggbWkgPiBkYXRhLT5wYXJhbXMubWF4X2NhdGVnb3JpZXMgKQorICAgICAgICB7CisgICAgICAgICAgICBtaSA9IE1JTihkYXRhLT5wYXJhbXMubWF4X2NhdGVnb3JpZXMsIG4pOworICAgICAgICAgICAgY2prICs9IF9taSptOworICAgICAgICAgICAgY2x1c3Rlcl9sYWJlbHMgPSAoaW50KiljdlN0YWNrQWxsb2MobWkqc2l6ZW9mKGNsdXN0ZXJfbGFiZWxzWzBdKSk7CisgICAgICAgICAgICBjbHVzdGVyX2NhdGVnb3JpZXMoIF9jamssIF9taSwgbSwgY2prLCBtaSwgY2x1c3Rlcl9sYWJlbHMgKTsKKyAgICAgICAgfQorICAgICAgICBzdWJzZXRfaSA9IDE7CisgICAgICAgIHN1YnNldF9uID0gMSA8PCBtaTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYXNzZXJ0KCBtID09IDIgKTsKKyAgICAgICAgaW50X3B0ciA9IChpbnQqKiljdlN0YWNrQWxsb2MoIG1pKnNpemVvZihpbnRfcHRyWzBdKSApOworICAgICAgICBmb3IoIGogPSAwOyBqIDwgbWk7IGorKyApCisgICAgICAgICAgICBpbnRfcHRyW2pdID0gY2prICsgaioyICsgMTsKKyAgICAgICAgaWN2U29ydEludFB0ciggaW50X3B0ciwgbWksIDAgKTsKKyAgICAgICAgc3Vic2V0X2kgPSAwOworICAgICAgICBzdWJzZXRfbiA9IG1pOworICAgIH0KKworICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgIHsKKyAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgIGZvciggaiA9IDA7IGogPCBtaTsgaisrICkKKyAgICAgICAgICAgIHN1bSArPSBjamtbaiptICsga107CisgICAgICAgIHJjW2tdID0gc3VtOworICAgICAgICBsY1trXSA9IDA7CisgICAgfQorCisgICAgZm9yKCBqID0gMDsgaiA8IG1pOyBqKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHN1bSA9IDA7CisgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgc3VtICs9IGNqa1tqKm0gKyBrXSpwcmlvcnNba107CisgICAgICAgIGNfd2VpZ2h0c1tqXSA9IHN1bTsKKyAgICAgICAgUiArPSBjX3dlaWdodHNbal07CisgICAgfQorCisgICAgZm9yKCA7IHN1YnNldF9pIDwgc3Vic2V0X247IHN1YnNldF9pKysgKQorICAgIHsKKyAgICAgICAgZG91YmxlIHdlaWdodDsKKyAgICAgICAgaW50KiBjcm93OworICAgICAgICBkb3VibGUgbHN1bTIgPSAwLCByc3VtMiA9IDA7CisKKyAgICAgICAgaWYoIG0gPT0gMiApCisgICAgICAgICAgICBpZHggPSAoaW50KShpbnRfcHRyW3N1YnNldF9pXSAtIGNqaykvMjsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZ3JheWNvZGUgPSAoc3Vic2V0X2k+PjEpXnN1YnNldF9pOworICAgICAgICAgICAgaW50IGRpZmYgPSBncmF5Y29kZSBeIHByZXZjb2RlOworCisgICAgICAgICAgICAvLyBkZXRlcm1pbmUgaW5kZXggb2YgdGhlIGNoYW5nZWQgYml0LgorICAgICAgICAgICAgQ3YzMnN1ZiB1OworICAgICAgICAgICAgaWR4ID0gZGlmZiA+PSAoMSA8PCAxNikgPyAxNiA6IDA7CisgICAgICAgICAgICB1LmYgPSAoZmxvYXQpKCgoZGlmZiA+PiAxNikgfCBkaWZmKSAmIDY1NTM1KTsKKyAgICAgICAgICAgIGlkeCArPSAodS5pID4+IDIzKSAtIDEyNzsKKyAgICAgICAgICAgIHN1YnRyYWN0ID0gZ3JheWNvZGUgPCBwcmV2Y29kZTsKKyAgICAgICAgICAgIHByZXZjb2RlID0gZ3JheWNvZGU7CisgICAgICAgIH0KKworICAgICAgICBjcm93ID0gY2prICsgaWR4Km07CisgICAgICAgIHdlaWdodCA9IGNfd2VpZ2h0c1tpZHhdOworICAgICAgICBpZiggd2VpZ2h0IDwgRkxUX0VQU0lMT04gKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgaWYoICFzdWJ0cmFjdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gY3Jvd1trXTsKKyAgICAgICAgICAgICAgICBpbnQgbHZhbCA9IGxjW2tdICsgdDsKKyAgICAgICAgICAgICAgICBpbnQgcnZhbCA9IHJjW2tdIC0gdDsKKyAgICAgICAgICAgICAgICBkb3VibGUgcCA9IHByaW9yc1trXSwgcDIgPSBwKnA7CisgICAgICAgICAgICAgICAgbHN1bTIgKz0gcDIqbHZhbCpsdmFsOworICAgICAgICAgICAgICAgIHJzdW0yICs9IHAyKnJ2YWwqcnZhbDsKKyAgICAgICAgICAgICAgICBsY1trXSA9IGx2YWw7IHJjW2tdID0gcnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEwgKz0gd2VpZ2h0OworICAgICAgICAgICAgUiAtPSB3ZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdCA9IGNyb3dba107CisgICAgICAgICAgICAgICAgaW50IGx2YWwgPSBsY1trXSAtIHQ7CisgICAgICAgICAgICAgICAgaW50IHJ2YWwgPSByY1trXSArIHQ7CisgICAgICAgICAgICAgICAgZG91YmxlIHAgPSBwcmlvcnNba10sIHAyID0gcCpwOworICAgICAgICAgICAgICAgIGxzdW0yICs9IHAyKmx2YWwqbHZhbDsKKyAgICAgICAgICAgICAgICByc3VtMiArPSBwMipydmFsKnJ2YWw7CisgICAgICAgICAgICAgICAgbGNba10gPSBsdmFsOyByY1trXSA9IHJ2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMIC09IHdlaWdodDsKKyAgICAgICAgICAgIFIgKz0gd2VpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYoIEwgPiBGTFRfRVBTSUxPTiAmJiBSID4gRkxUX0VQU0lMT04gKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgdmFsID0gKGxzdW0yKlIgKyByc3VtMipMKS8oKGRvdWJsZSlMKlIpOworICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBiZXN0X3N1YnNldCA9IHN1YnNldF9pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoIGJlc3Rfc3Vic2V0IDwgMCApCisgICAgICAgIHJldHVybiAwOworCisgICAgc3BsaXQgPSBkYXRhLT5uZXdfc3BsaXRfY2F0KCB2aSwgKGZsb2F0KWJlc3RfdmFsICk7CisKKyAgICBpZiggbSA9PSAyICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPD0gYmVzdF9zdWJzZXQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlkeCA9IChpbnQpKGludF9wdHJbaV0gLSBjamspID4+IDE7CisgICAgICAgICAgICBzcGxpdC0+c3Vic2V0W2lkeCA+PiA1XSB8PSAxIDw8IChpZHggJiAzMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IF9taTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaWR4ID0gY2x1c3Rlcl9sYWJlbHMgPyBjbHVzdGVyX2xhYmVsc1tpXSA6IGk7CisgICAgICAgICAgICBpZiggYmVzdF9zdWJzZXQgJiAoMSA8PCBpZHgpICkKKyAgICAgICAgICAgICAgICBzcGxpdC0+c3Vic2V0W2kgPj4gNV0gfD0gMSA8PCAoaSAmIDMxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBzcGxpdDsKK30KKworCitDdkRUcmVlU3BsaXQqIEN2RFRyZWU6OmZpbmRfc3BsaXRfb3JkX3JlZyggQ3ZEVHJlZU5vZGUqIG5vZGUsIGludCB2aSApCit7CisgICAgY29uc3QgZmxvYXQgZXBzaWxvbiA9IEZMVF9FUFNJTE9OKjI7CisgICAgY29uc3QgQ3ZQYWlyMzJzMzJmKiBzb3J0ZWQgPSBkYXRhLT5nZXRfb3JkX3Zhcl9kYXRhKG5vZGUsIHZpKTsKKyAgICBjb25zdCBmbG9hdCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X29yZF9yZXNwb25zZXMobm9kZSk7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgaW50IG4xID0gbm9kZS0+Z2V0X251bV92YWxpZCh2aSk7CisgICAgaW50IGksIGJlc3RfaSA9IC0xOworICAgIGRvdWJsZSBiZXN0X3ZhbCA9IDAsIGxzdW0gPSAwLCByc3VtID0gbm9kZS0+dmFsdWUqbjsKKyAgICBpbnQgTCA9IDAsIFIgPSBuMTsKKworICAgIC8vIGNvbXBlbnNhdGUgZm9yIG1pc3NpbmcgdmFsdWVzCisgICAgZm9yKCBpID0gbjE7IGkgPCBuOyBpKysgKQorICAgICAgICByc3VtIC09IHJlc3BvbnNlc1tzb3J0ZWRbaV0uaV07CisKKyAgICAvLyBmaW5kIHRoZSBvcHRpbWFsIHNwbGl0CisgICAgZm9yKCBpID0gMDsgaSA8IG4xIC0gMTsgaSsrICkKKyAgICB7CisgICAgICAgIGZsb2F0IHQgPSByZXNwb25zZXNbc29ydGVkW2ldLmldOworICAgICAgICBMKys7IFItLTsKKyAgICAgICAgbHN1bSArPSB0OworICAgICAgICByc3VtIC09IHQ7CisKKyAgICAgICAgaWYoIHNvcnRlZFtpXS52YWwgKyBlcHNpbG9uIDwgc29ydGVkW2krMV0udmFsICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbCA9IChsc3VtKmxzdW0qUiArIHJzdW0qcnN1bSpMKS8oKGRvdWJsZSlMKlIpOworICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IHZhbDsKKyAgICAgICAgICAgICAgICBiZXN0X2kgPSBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGJlc3RfaSA+PSAwID8gZGF0YS0+bmV3X3NwbGl0X29yZCggdmksCisgICAgICAgIChzb3J0ZWRbYmVzdF9pXS52YWwgKyBzb3J0ZWRbYmVzdF9pKzFdLnZhbCkqMC41ZiwgYmVzdF9pLAorICAgICAgICAwLCAoZmxvYXQpYmVzdF92YWwgKSA6IDA7Cit9CisKKworQ3ZEVHJlZVNwbGl0KiBDdkRUcmVlOjpmaW5kX3NwbGl0X2NhdF9yZWcoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIEN2RFRyZWVTcGxpdCogc3BsaXQ7CisgICAgY29uc3QgaW50KiBsYWJlbHMgPSBkYXRhLT5nZXRfY2F0X3Zhcl9kYXRhKG5vZGUsIHZpKTsKKyAgICBjb25zdCBmbG9hdCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X29yZF9yZXNwb25zZXMobm9kZSk7CisgICAgaW50IGNpID0gZGF0YS0+Z2V0X3Zhcl90eXBlKHZpKTsKKyAgICBpbnQgbiA9IG5vZGUtPnNhbXBsZV9jb3VudDsKKyAgICBpbnQgbWkgPSBkYXRhLT5jYXRfY291bnQtPmRhdGEuaVtjaV07CisgICAgZG91YmxlKiBzdW0gPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIChtaSsxKSpzaXplb2Yoc3VtWzBdKSApICsgMTsKKyAgICBpbnQqIGNvdW50cyA9IChpbnQqKWN2U3RhY2tBbGxvYyggKG1pKzEpKnNpemVvZihjb3VudHNbMF0pICkgKyAxOworICAgIGRvdWJsZSoqIHN1bV9wdHIgPSAwOworICAgIGludCBpLCBMID0gMCwgUiA9IDA7CisgICAgZG91YmxlIGJlc3RfdmFsID0gMCwgbHN1bSA9IDAsIHJzdW0gPSAwOworICAgIGludCBiZXN0X3N1YnNldCA9IC0xLCBzdWJzZXRfaTsKKworICAgIGZvciggaSA9IC0xOyBpIDwgbWk7IGkrKyApCisgICAgICAgIHN1bVtpXSA9IGNvdW50c1tpXSA9IDA7CisKKyAgICAvLyBjYWxjdWxhdGUgc3VtIHJlc3BvbnNlIGFuZCB3ZWlnaHQgb2YgZWFjaCBjYXRlZ29yeSBvZiB0aGUgaW5wdXQgdmFyCisgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gbGFiZWxzW2ldOworICAgICAgICBkb3VibGUgcyA9IHN1bVtpZHhdICsgcmVzcG9uc2VzW2ldOworICAgICAgICBpbnQgbmMgPSBjb3VudHNbaWR4XSArIDE7CisgICAgICAgIHN1bVtpZHhdID0gczsKKyAgICAgICAgY291bnRzW2lkeF0gPSBuYzsKKyAgICB9CisKKyAgICAvLyBjYWxjdWxhdGUgYXZlcmFnZSByZXNwb25zZSBpbiBlYWNoIGNhdGVnb3J5CisgICAgZm9yKCBpID0gMDsgaSA8IG1pOyBpKysgKQorICAgIHsKKyAgICAgICAgUiArPSBjb3VudHNbaV07CisgICAgICAgIHJzdW0gKz0gc3VtW2ldOworICAgICAgICBzdW1baV0gLz0gTUFYKGNvdW50c1tpXSwxKTsKKyAgICAgICAgc3VtX3B0cltpXSA9IHN1bSArIGk7CisgICAgfQorCisgICAgaWN2U29ydERibFB0ciggc3VtX3B0ciwgbWksIDAgKTsKKworICAgIC8vIHJldmVydCBiYWNrIHRvIHVubm9ybWFsaXplZCBzdW1zCisgICAgLy8gKHRoZXJlIHNob3VsZCBiZSBhIHZlcnkgbGl0dGxlIGxvc3Mgb2YgYWNjdXJhY3kpCisgICAgZm9yKCBpID0gMDsgaSA8IG1pOyBpKysgKQorICAgICAgICBzdW1baV0gKj0gY291bnRzW2ldOworCisgICAgZm9yKCBzdWJzZXRfaSA9IDA7IHN1YnNldF9pIDwgbWktMTsgc3Vic2V0X2krKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gKGludCkoc3VtX3B0cltzdWJzZXRfaV0gLSBzdW0pOworICAgICAgICBpbnQgbmkgPSBjb3VudHNbaWR4XTsKKworICAgICAgICBpZiggbmkgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgcyA9IHN1bVtpZHhdOworICAgICAgICAgICAgbHN1bSArPSBzOyBMICs9IG5pOworICAgICAgICAgICAgcnN1bSAtPSBzOyBSIC09IG5pOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiggTCAmJiBSICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gKGxzdW0qbHN1bSpSICsgcnN1bSpyc3VtKkwpLygoZG91YmxlKUwqUik7CisgICAgICAgICAgICAgICAgaWYoIGJlc3RfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gdmFsOworICAgICAgICAgICAgICAgICAgICBiZXN0X3N1YnNldCA9IHN1YnNldF9pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBiZXN0X3N1YnNldCA8IDAgKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHNwbGl0ID0gZGF0YS0+bmV3X3NwbGl0X2NhdCggdmksIChmbG9hdCliZXN0X3ZhbCApOworICAgIGZvciggaSA9IDA7IGkgPD0gYmVzdF9zdWJzZXQ7IGkrKyApCisgICAgeworICAgICAgICBpbnQgaWR4ID0gKGludCkoc3VtX3B0cltpXSAtIHN1bSk7CisgICAgICAgIHNwbGl0LT5zdWJzZXRbaWR4ID4+IDVdIHw9IDEgPDwgKGlkeCAmIDMxKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3BsaXQ7Cit9CisKKworQ3ZEVHJlZVNwbGl0KiBDdkRUcmVlOjpmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9vcmQoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGZsb2F0IGVwc2lsb24gPSBGTFRfRVBTSUxPTioyOworICAgIGNvbnN0IEN2UGFpcjMyczMyZiogc29ydGVkID0gZGF0YS0+Z2V0X29yZF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgY2hhciogZGlyID0gKGNoYXIqKWRhdGEtPmRpcmVjdGlvbi0+ZGF0YS5wdHI7CisgICAgaW50IG4xID0gbm9kZS0+Z2V0X251bV92YWxpZCh2aSk7CisgICAgLy8gTEwgLSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGJvdGggdGhlIHByaW1hcnkgYW5kIHRoZSBzdXJyb2dhdGUgc3BsaXRzIHNlbmQgdG8gdGhlIGxlZnQKKyAgICAvLyBMUiAtIC4uLiBwcmltYXJ5IHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSByaWdodAorICAgIC8vIFJMIC0gLi4uIHByaW1hcnkgc3BsaXQgc2VuZHMgdG8gdGhlIHJpZ2h0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0CisgICAgLy8gUlIgLSAuLi4gYm90aCBzZW5kIHRvIHRoZSByaWdodAorICAgIGludCBpLCBiZXN0X2kgPSAtMSwgYmVzdF9pbnZlcnNlZCA9IDA7CisgICAgZG91YmxlIGJlc3RfdmFsOyAKKworICAgIGlmKCAhZGF0YS0+aGF2ZV9wcmlvcnMgKQorICAgIHsKKyAgICAgICAgaW50IExMID0gMCwgUkwgPSAwLCBMUiwgUlI7CisgICAgICAgIGludCB3b3JzdF92YWwgPSBjdkZsb29yKG5vZGUtPm1heGxyKSwgX2Jlc3RfdmFsID0gd29yc3RfdmFsOworICAgICAgICBpbnQgc3VtID0gMCwgc3VtX2FicyA9IDA7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjE7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkID0gZGlyW3NvcnRlZFtpXS5pXTsKKyAgICAgICAgICAgIHN1bSArPSBkOyBzdW1fYWJzICs9IGQgJiAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gc3VtX2FicyA9IFIgKyBMOyBzdW0gPSBSIC0gTAorICAgICAgICBSUiA9IChzdW1fYWJzICsgc3VtKSA+PiAxOworICAgICAgICBMUiA9IChzdW1fYWJzIC0gc3VtKSA+PiAxOworCisgICAgICAgIC8vIGluaXRpYWxseSBhbGwgdGhlIHNhbXBsZXMgYXJlIHNlbnQgdG8gdGhlIHJpZ2h0IGJ5IHRoZSBzdXJyb2dhdGUgc3BsaXQsCisgICAgICAgIC8vIExSIG9mIHRoZW0gYXJlIHNlbnQgdG8gdGhlIGxlZnQgYnkgcHJpbWFyeSBzcGxpdCwgYW5kIFJSIC0gdG8gdGhlIHJpZ2h0LgorICAgICAgICAvLyBub3cgaXRlcmF0aXZlbHkgY29tcHV0ZSBMTCwgTFIsIFJMIGFuZCBSUiBmb3IgZXZlcnkgcG9zc2libGUgc3Vycm9nYXRlIHNwbGl0IHZhbHVlLgorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjEgLSAxOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZCA9IGRpcltzb3J0ZWRbaV0uaV07CisKKyAgICAgICAgICAgIGlmKCBkIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTEwrKzsgTFItLTsKKyAgICAgICAgICAgICAgICBpZiggTEwgKyBSUiA+IF9iZXN0X3ZhbCAmJiBzb3J0ZWRbaV0udmFsICsgZXBzaWxvbiA8IHNvcnRlZFtpKzFdLnZhbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IExMICsgUlI7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfaSA9IGk7IGJlc3RfaW52ZXJzZWQgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIGQgPiAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBSTCsrOyBSUi0tOworICAgICAgICAgICAgICAgIGlmKCBSTCArIExSID4gX2Jlc3RfdmFsICYmIHNvcnRlZFtpXS52YWwgKyBlcHNpbG9uIDwgc29ydGVkW2krMV0udmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gUkwgKyBMUjsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9pID0gaTsgYmVzdF9pbnZlcnNlZCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJlc3RfdmFsID0gX2Jlc3RfdmFsOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBkb3VibGUgTEwgPSAwLCBSTCA9IDAsIExSLCBSUjsKKyAgICAgICAgZG91YmxlIHdvcnN0X3ZhbCA9IG5vZGUtPm1heGxyOworICAgICAgICBkb3VibGUgc3VtID0gMCwgc3VtX2FicyA9IDA7CisgICAgICAgIGNvbnN0IGRvdWJsZSogcHJpb3JzID0gZGF0YS0+cHJpb3JzX211bHQtPmRhdGEuZGI7CisgICAgICAgIGNvbnN0IGludCogcmVzcG9uc2VzID0gZGF0YS0+Z2V0X2NsYXNzX2xhYmVscyhub2RlKTsKKyAgICAgICAgYmVzdF92YWwgPSB3b3JzdF92YWw7CisgICAgICAgIAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjE7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSBzb3J0ZWRbaV0uaTsKKyAgICAgICAgICAgIGRvdWJsZSB3ID0gcHJpb3JzW3Jlc3BvbnNlc1tpZHhdXTsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2lkeF07CisgICAgICAgICAgICBzdW0gKz0gZCp3OyBzdW1fYWJzICs9IChkICYgMSkqdzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1bV9hYnMgPSBSICsgTDsgc3VtID0gUiAtIEwKKyAgICAgICAgUlIgPSAoc3VtX2FicyArIHN1bSkqMC41OworICAgICAgICBMUiA9IChzdW1fYWJzIC0gc3VtKSowLjU7CisKKyAgICAgICAgLy8gaW5pdGlhbGx5IGFsbCB0aGUgc2FtcGxlcyBhcmUgc2VudCB0byB0aGUgcmlnaHQgYnkgdGhlIHN1cnJvZ2F0ZSBzcGxpdCwKKyAgICAgICAgLy8gTFIgb2YgdGhlbSBhcmUgc2VudCB0byB0aGUgbGVmdCBieSBwcmltYXJ5IHNwbGl0LCBhbmQgUlIgLSB0byB0aGUgcmlnaHQuCisgICAgICAgIC8vIG5vdyBpdGVyYXRpdmVseSBjb21wdXRlIExMLCBMUiwgUkwgYW5kIFJSIGZvciBldmVyeSBwb3NzaWJsZSBzdXJyb2dhdGUgc3BsaXQgdmFsdWUuCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuMSAtIDE7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSBzb3J0ZWRbaV0uaTsKKyAgICAgICAgICAgIGRvdWJsZSB3ID0gcHJpb3JzW3Jlc3BvbnNlc1tpZHhdXTsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2lkeF07CisKKyAgICAgICAgICAgIGlmKCBkIDwgMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTEwgKz0gdzsgTFIgLT0gdzsKKyAgICAgICAgICAgICAgICBpZiggTEwgKyBSUiA+IGJlc3RfdmFsICYmIHNvcnRlZFtpXS52YWwgKyBlcHNpbG9uIDwgc29ydGVkW2krMV0udmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfdmFsID0gTEwgKyBSUjsKKyAgICAgICAgICAgICAgICAgICAgYmVzdF9pID0gaTsgYmVzdF9pbnZlcnNlZCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggZCA+IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFJMICs9IHc7IFJSIC09IHc7CisgICAgICAgICAgICAgICAgaWYoIFJMICsgTFIgPiBiZXN0X3ZhbCAmJiBzb3J0ZWRbaV0udmFsICsgZXBzaWxvbiA8IHNvcnRlZFtpKzFdLnZhbCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBiZXN0X3ZhbCA9IFJMICsgTFI7CisgICAgICAgICAgICAgICAgICAgIGJlc3RfaSA9IGk7IGJlc3RfaW52ZXJzZWQgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBiZXN0X2kgPj0gMCAmJiBiZXN0X3ZhbCA+IG5vZGUtPm1heGxyID8gZGF0YS0+bmV3X3NwbGl0X29yZCggdmksCisgICAgICAgIChzb3J0ZWRbYmVzdF9pXS52YWwgKyBzb3J0ZWRbYmVzdF9pKzFdLnZhbCkqMC41ZiwgYmVzdF9pLAorICAgICAgICBiZXN0X2ludmVyc2VkLCAoZmxvYXQpYmVzdF92YWwgKSA6IDA7Cit9CisKKworQ3ZEVHJlZVNwbGl0KiBDdkRUcmVlOjpmaW5kX3N1cnJvZ2F0ZV9zcGxpdF9jYXQoIEN2RFRyZWVOb2RlKiBub2RlLCBpbnQgdmkgKQoreworICAgIGNvbnN0IGludCogbGFiZWxzID0gZGF0YS0+Z2V0X2NhdF92YXJfZGF0YShub2RlLCB2aSk7CisgICAgY29uc3QgY2hhciogZGlyID0gKGNoYXIqKWRhdGEtPmRpcmVjdGlvbi0+ZGF0YS5wdHI7CisgICAgaW50IG4gPSBub2RlLT5zYW1wbGVfY291bnQ7CisgICAgLy8gTEwgLSBudW1iZXIgb2Ygc2FtcGxlcyB0aGF0IGJvdGggdGhlIHByaW1hcnkgYW5kIHRoZSBzdXJyb2dhdGUgc3BsaXRzIHNlbmQgdG8gdGhlIGxlZnQKKyAgICAvLyBMUiAtIC4uLiBwcmltYXJ5IHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSByaWdodAorICAgIC8vIFJMIC0gLi4uIHByaW1hcnkgc3BsaXQgc2VuZHMgdG8gdGhlIHJpZ2h0IGFuZCB0aGUgc3Vycm9nYXRlIHNwbGl0IHNlbmRzIHRvIHRoZSBsZWZ0CisgICAgLy8gUlIgLSAuLi4gYm90aCBzZW5kIHRvIHRoZSByaWdodAorICAgIEN2RFRyZWVTcGxpdCogc3BsaXQgPSBkYXRhLT5uZXdfc3BsaXRfY2F0KCB2aSwgMCApOworICAgIGludCBpLCBtaSA9IGRhdGEtPmNhdF9jb3VudC0+ZGF0YS5pW2RhdGEtPmdldF92YXJfdHlwZSh2aSldLCBsX3dpbiA9IDA7CisgICAgZG91YmxlIGJlc3RfdmFsID0gMDsKKyAgICBkb3VibGUqIGxjID0gKGRvdWJsZSopY3ZTdGFja0FsbG9jKCAobWkrMSkqMipzaXplb2YobGNbMF0pICkgKyAxOworICAgIGRvdWJsZSogcmMgPSBsYyArIG1pICsgMTsKKyAgICAKKyAgICBmb3IoIGkgPSAtMTsgaSA8IG1pOyBpKysgKQorICAgICAgICBsY1tpXSA9IHJjW2ldID0gMDsKKworICAgIC8vIGZvciBlYWNoIGNhdGVnb3J5IGNhbGN1bGF0ZSB0aGUgd2VpZ2h0IG9mIHNhbXBsZXMKKyAgICAvLyBzZW50IHRvIHRoZSBsZWZ0IChsYykgYW5kIHRvIHRoZSByaWdodCAocmMpIGJ5IHRoZSBwcmltYXJ5IHNwbGl0CisgICAgaWYoICFkYXRhLT5oYXZlX3ByaW9ycyApCisgICAgeworICAgICAgICBpbnQqIF9sYyA9IChpbnQqKWN2U3RhY2tBbGxvYygobWkrMikqMipzaXplb2YoX2xjWzBdKSkgKyAxOworICAgICAgICBpbnQqIF9yYyA9IF9sYyArIG1pICsgMTsKKworICAgICAgICBmb3IoIGkgPSAtMTsgaSA8IG1pOyBpKysgKQorICAgICAgICAgICAgX2xjW2ldID0gX3JjW2ldID0gMDsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IGxhYmVsc1tpXTsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2ldOworICAgICAgICAgICAgaW50IHN1bSA9IF9sY1tpZHhdICsgZDsKKyAgICAgICAgICAgIGludCBzdW1fYWJzID0gX3JjW2lkeF0gKyAoZCAmIDEpOworICAgICAgICAgICAgX2xjW2lkeF0gPSBzdW07IF9yY1tpZHhdID0gc3VtX2FiczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtaTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHN1bSA9IF9sY1tpXTsKKyAgICAgICAgICAgIGludCBzdW1fYWJzID0gX3JjW2ldOworICAgICAgICAgICAgbGNbaV0gPSAoc3VtX2FicyAtIHN1bSkgPj4gMTsKKyAgICAgICAgICAgIHJjW2ldID0gKHN1bV9hYnMgKyBzdW0pID4+IDE7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgY29uc3QgZG91YmxlKiBwcmlvcnMgPSBkYXRhLT5wcmlvcnNfbXVsdC0+ZGF0YS5kYjsKKyAgICAgICAgY29uc3QgaW50KiByZXNwb25zZXMgPSBkYXRhLT5nZXRfY2xhc3NfbGFiZWxzKG5vZGUpOworCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaWR4ID0gbGFiZWxzW2ldOworICAgICAgICAgICAgZG91YmxlIHcgPSBwcmlvcnNbcmVzcG9uc2VzW2ldXTsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2ldOworICAgICAgICAgICAgZG91YmxlIHN1bSA9IGxjW2lkeF0gKyBkKnc7CisgICAgICAgICAgICBkb3VibGUgc3VtX2FicyA9IHJjW2lkeF0gKyAoZCAmIDEpKnc7CisgICAgICAgICAgICBsY1tpZHhdID0gc3VtOyByY1tpZHhdID0gc3VtX2FiczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBtaTsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHN1bSA9IGxjW2ldOworICAgICAgICAgICAgZG91YmxlIHN1bV9hYnMgPSByY1tpXTsKKyAgICAgICAgICAgIGxjW2ldID0gKHN1bV9hYnMgLSBzdW0pICogMC41OworICAgICAgICAgICAgcmNbaV0gPSAoc3VtX2FicyArIHN1bSkgKiAwLjU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAyLiBub3cgZm9ybSB0aGUgc3BsaXQuCisgICAgLy8gaW4gZWFjaCBjYXRlZ29yeSBzZW5kIGFsbCB0aGUgc2FtcGxlcyB0byB0aGUgc2FtZSBkaXJlY3Rpb24gYXMgbWFqb3JpdHkKKyAgICBmb3IoIGkgPSAwOyBpIDwgbWk7IGkrKyApCisgICAgeworICAgICAgICBkb3VibGUgbHZhbCA9IGxjW2ldLCBydmFsID0gcmNbaV07CisgICAgICAgIGlmKCBsdmFsID4gcnZhbCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwbGl0LT5zdWJzZXRbaSA+PiA1XSB8PSAxIDw8IChpICYgMzEpOworICAgICAgICAgICAgYmVzdF92YWwgKz0gbHZhbDsKKyAgICAgICAgICAgIGxfd2luKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgYmVzdF92YWwgKz0gcnZhbDsKKyAgICB9CisKKyAgICBzcGxpdC0+cXVhbGl0eSA9IChmbG9hdCliZXN0X3ZhbDsKKyAgICBpZiggc3BsaXQtPnF1YWxpdHkgPD0gbm9kZS0+bWF4bHIgfHwgbF93aW4gPT0gMCB8fCBsX3dpbiA9PSBtaSApCisgICAgICAgIGN2U2V0UmVtb3ZlQnlQdHIoIGRhdGEtPnNwbGl0X2hlYXAsIHNwbGl0ICksIHNwbGl0ID0gMDsKKworICAgIHJldHVybiBzcGxpdDsKK30KKworCit2b2lkIEN2RFRyZWU6OmNhbGNfbm9kZV92YWx1ZSggQ3ZEVHJlZU5vZGUqIG5vZGUgKQoreworICAgIGludCBpLCBqLCBrLCBuID0gbm9kZS0+c2FtcGxlX2NvdW50LCBjdl9uID0gZGF0YS0+cGFyYW1zLmN2X2ZvbGRzOworICAgIGNvbnN0IGludCogY3ZfbGFiZWxzID0gZGF0YS0+Z2V0X2xhYmVscyhub2RlKTsKKworICAgIGlmKCBkYXRhLT5pc19jbGFzc2lmaWVyICkKKyAgICB7CisgICAgICAgIC8vIGluIGNhc2Ugb2YgY2xhc3NpZmljYXRpb24gdHJlZToKKyAgICAgICAgLy8gICogbm9kZSB2YWx1ZSBpcyB0aGUgbGFiZWwgb2YgdGhlIGNsYXNzIHRoYXQgaGFzIHRoZSBsYXJnZXN0IHdlaWdodCBpbiB0aGUgbm9kZS4KKyAgICAgICAgLy8gICogbm9kZSByaXNrIGlzIHRoZSB3ZWlnaHRlZCBudW1iZXIgb2YgbWlzY2xhc3NpZmllZCBzYW1wbGVzLAorICAgICAgICAvLyAgKiBqLXRoIGNyb3NzLXZhbGlkYXRpb24gZm9sZCB2YWx1ZSBhbmQgcmlzayBhcmUgY2FsY3VsYXRlZCBhcyBhYm92ZSwKKyAgICAgICAgLy8gICAgYnV0IHVzaW5nIHRoZSBzYW1wbGVzIHdpdGggY3ZfbGFiZWxzKCopIT1qLgorICAgICAgICAvLyAgKiBqLXRoIGNyb3NzLXZhbGlkYXRpb24gZm9sZCBlcnJvciBpcyBjYWxjdWxhdGVkIGFzIHRoZSB3ZWlnaHRlZCBudW1iZXIgb2YKKyAgICAgICAgLy8gICAgbWlzY2xhc3NpZmllZCBzYW1wbGVzIHdpdGggY3ZfbGFiZWxzKCopPT1qLgorCisgICAgICAgIC8vIGNvbXB1dGUgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgb2YgZWFjaCBjbGFzcworICAgICAgICBpbnQqIGNsc19jb3VudCA9IGRhdGEtPmNvdW50cy0+ZGF0YS5pOworICAgICAgICBjb25zdCBpbnQqIHJlc3BvbnNlcyA9IGRhdGEtPmdldF9jbGFzc19sYWJlbHMobm9kZSk7CisgICAgICAgIGludCBtID0gZGF0YS0+Z2V0X251bV9jbGFzc2VzKCk7CisgICAgICAgIGludCogY3ZfY2xzX2NvdW50ID0gKGludCopY3ZTdGFja0FsbG9jKG0qY3ZfbipzaXplb2YoY3ZfY2xzX2NvdW50WzBdKSk7CisgICAgICAgIGRvdWJsZSBtYXhfdmFsID0gLTEsIHRvdGFsX3dlaWdodCA9IDA7CisgICAgICAgIGludCBtYXhfayA9IC0xOworICAgICAgICBkb3VibGUqIHByaW9ycyA9IGRhdGEtPnByaW9yc19tdWx0LT5kYXRhLmRiOworCisgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgY2xzX2NvdW50W2tdID0gMDsKKworICAgICAgICBpZiggY3ZfbiA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICAgICAgY2xzX2NvdW50W3Jlc3BvbnNlc1tpXV0rKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgICAgICAgICBjdl9jbHNfY291bnRbaiptICsga10gPSAwOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqID0gY3ZfbGFiZWxzW2ldOyBrID0gcmVzcG9uc2VzW2ldOworICAgICAgICAgICAgICAgIGN2X2Nsc19jb3VudFtqKm0gKyBrXSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgY3ZfbjsgaisrICkKKyAgICAgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkKKyAgICAgICAgICAgICAgICAgICAgY2xzX2NvdW50W2tdICs9IGN2X2Nsc19jb3VudFtqKm0gKyBrXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkYXRhLT5oYXZlX3ByaW9ycyAmJiBub2RlLT5wYXJlbnQgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGNvbXB1dGUgcHJpb3JzX211bHQgZnJvbSBwcmlvcnMsIHRha2UgdGhlIHNhbXBsZSByYXRpbyBpbnRvIGFjY291bnQuCisgICAgICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBuX2sgPSBjbHNfY291bnRba107CisgICAgICAgICAgICAgICAgcHJpb3JzW2tdID0gZGF0YS0+cHJpb3JzLT5kYXRhLmRiW2tdKihuX2sgPyAxLi9uX2sgOiAwLik7CisgICAgICAgICAgICAgICAgc3VtICs9IHByaW9yc1trXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1bSA9IDEuL3N1bTsKKyAgICAgICAgICAgIGZvciggayA9IDA7IGsgPCBtOyBrKysgKQorICAgICAgICAgICAgICAgIHByaW9yc1trXSAqPSBzdW07CisgICAgICAgIH0KKworICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHZhbCA9IGNsc19jb3VudFtrXSpwcmlvcnNba107CisgICAgICAgICAgICB0b3RhbF93ZWlnaHQgKz0gdmFsOworICAgICAgICAgICAgaWYoIG1heF92YWwgPCB2YWwgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1heF92YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgbWF4X2sgPSBrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbm9kZS0+Y2xhc3NfaWR4ID0gbWF4X2s7CisgICAgICAgIG5vZGUtPnZhbHVlID0gZGF0YS0+Y2F0X21hcC0+ZGF0YS5pWworICAgICAgICAgICAgZGF0YS0+Y2F0X29mcy0+ZGF0YS5pW2RhdGEtPmNhdF92YXJfY291bnRdICsgbWF4X2tdOworICAgICAgICBub2RlLT5ub2RlX3Jpc2sgPSB0b3RhbF93ZWlnaHQgLSBtYXhfdmFsOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgc3VtX2sgPSAwLCBzdW0gPSAwLCBtYXhfdmFsX2sgPSAwOworICAgICAgICAgICAgbWF4X3ZhbCA9IC0xOyBtYXhfayA9IC0xOworCisgICAgICAgICAgICBmb3IoIGsgPSAwOyBrIDwgbTsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgdyA9IHByaW9yc1trXTsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsX2sgPSBjdl9jbHNfY291bnRbaiptICsga10qdzsKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsID0gY2xzX2NvdW50W2tdKncgLSB2YWxfazsKKyAgICAgICAgICAgICAgICBzdW1fayArPSB2YWxfazsKKyAgICAgICAgICAgICAgICBzdW0gKz0gdmFsOworICAgICAgICAgICAgICAgIGlmKCBtYXhfdmFsIDwgdmFsICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1heF92YWwgPSB2YWw7CisgICAgICAgICAgICAgICAgICAgIG1heF92YWxfayA9IHZhbF9rOworICAgICAgICAgICAgICAgICAgICBtYXhfayA9IGs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBub2RlLT5jdl9UbltqXSA9IElOVF9NQVg7CisgICAgICAgICAgICBub2RlLT5jdl9ub2RlX3Jpc2tbal0gPSBzdW0gLSBtYXhfdmFsOworICAgICAgICAgICAgbm9kZS0+Y3Zfbm9kZV9lcnJvcltqXSA9IHN1bV9rIC0gbWF4X3ZhbF9rOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIGluIGNhc2Ugb2YgcmVncmVzc2lvbiB0cmVlOgorICAgICAgICAvLyAgKiBub2RlIHZhbHVlIGlzIDEvbipzdW1faShZX2kpLCB3aGVyZSBZX2kgaXMgaS10aCByZXNwb25zZSwKKyAgICAgICAgLy8gICAgbiBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG5vZGUuCisgICAgICAgIC8vICAqIG5vZGUgcmlzayBpcyB0aGUgc3VtIG9mIHNxdWFyZWQgZXJyb3JzOiBzdW1faSgoWV9pIC0gPG5vZGVfdmFsdWU+KV4yKQorICAgICAgICAvLyAgKiBqLXRoIGNyb3NzLXZhbGlkYXRpb24gZm9sZCB2YWx1ZSBhbmQgcmlzayBhcmUgY2FsY3VsYXRlZCBhcyBhYm92ZSwKKyAgICAgICAgLy8gICAgYnV0IHVzaW5nIHRoZSBzYW1wbGVzIHdpdGggY3ZfbGFiZWxzKCopIT1qLgorICAgICAgICAvLyAgKiBqLXRoIGNyb3NzLXZhbGlkYXRpb24gZm9sZCBlcnJvciBpcyBjYWxjdWxhdGVkCisgICAgICAgIC8vICAgIHVzaW5nIHNhbXBsZXMgd2l0aCBjdl9sYWJlbHMoKik9PWogYXMgdGhlIHRlc3Qgc3Vic2V0OgorICAgICAgICAvLyAgICBlcnJvcl9qID0gc3VtXyhpLGN2X2xhYmVscyhpKT09aikoKFlfaSAtIDxub2RlX3ZhbHVlX2o+KV4yKSwKKyAgICAgICAgLy8gICAgd2hlcmUgbm9kZV92YWx1ZV9qIGlzIHRoZSBub2RlIHZhbHVlIGNhbGN1bGF0ZWQKKyAgICAgICAgLy8gICAgYXMgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBidWxsZXQsIGFuZCBzdW1tYXRpb24gaXMgZG9uZQorICAgICAgICAvLyAgICBvdmVyIHRoZSBzYW1wbGVzIHdpdGggY3ZfbGFiZWxzKCopPT1qLgorCisgICAgICAgIGRvdWJsZSBzdW0gPSAwLCBzdW0yID0gMDsKKyAgICAgICAgY29uc3QgZmxvYXQqIHZhbHVlcyA9IGRhdGEtPmdldF9vcmRfcmVzcG9uc2VzKG5vZGUpOworICAgICAgICBkb3VibGUgKmN2X3N1bSA9IDAsICpjdl9zdW0yID0gMDsKKyAgICAgICAgaW50KiBjdl9jb3VudCA9IDA7CisgICAgICAgIAorICAgICAgICBpZiggY3ZfbiA9PSAwICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB2YWx1ZXNbaV07CisgICAgICAgICAgICAgICAgc3VtICs9IHQ7CisgICAgICAgICAgICAgICAgc3VtMiArPSB0KnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdl9zdW0gPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIGN2X24qc2l6ZW9mKGN2X3N1bVswXSkgKTsKKyAgICAgICAgICAgIGN2X3N1bTIgPSAoZG91YmxlKiljdlN0YWNrQWxsb2MoIGN2X24qc2l6ZW9mKGN2X3N1bTJbMF0pICk7CisgICAgICAgICAgICBjdl9jb3VudCA9IChpbnQqKWN2U3RhY2tBbGxvYyggY3ZfbipzaXplb2YoY3ZfY291bnRbMF0pICk7CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGN2X3N1bVtqXSA9IGN2X3N1bTJbal0gPSAwLjsKKyAgICAgICAgICAgICAgICBjdl9jb3VudFtqXSA9IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGogPSBjdl9sYWJlbHNbaV07CisgICAgICAgICAgICAgICAgZG91YmxlIHQgPSB2YWx1ZXNbaV07CisgICAgICAgICAgICAgICAgZG91YmxlIHMgPSBjdl9zdW1bal0gKyB0OworICAgICAgICAgICAgICAgIGRvdWJsZSBzMiA9IGN2X3N1bTJbal0gKyB0KnQ7CisgICAgICAgICAgICAgICAgaW50IG5jID0gY3ZfY291bnRbal0gKyAxOworICAgICAgICAgICAgICAgIGN2X3N1bVtqXSA9IHM7CisgICAgICAgICAgICAgICAgY3Zfc3VtMltqXSA9IHMyOworICAgICAgICAgICAgICAgIGN2X2NvdW50W2pdID0gbmM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN1bSArPSBjdl9zdW1bal07CisgICAgICAgICAgICAgICAgc3VtMiArPSBjdl9zdW0yW2pdOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbm9kZS0+bm9kZV9yaXNrID0gc3VtMiAtIChzdW0vbikqc3VtOworICAgICAgICBub2RlLT52YWx1ZSA9IHN1bS9uOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkb3VibGUgcyA9IGN2X3N1bVtqXSwgc2kgPSBzdW0gLSBzOworICAgICAgICAgICAgZG91YmxlIHMyID0gY3Zfc3VtMltqXSwgczJpID0gc3VtMiAtIHMyOworICAgICAgICAgICAgaW50IGMgPSBjdl9jb3VudFtqXSwgY2kgPSBuIC0gYzsKKyAgICAgICAgICAgIGRvdWJsZSByID0gc2kvTUFYKGNpLDEpOworICAgICAgICAgICAgbm9kZS0+Y3Zfbm9kZV9yaXNrW2pdID0gczJpIC0gcipyKmNpOworICAgICAgICAgICAgbm9kZS0+Y3Zfbm9kZV9lcnJvcltqXSA9IHMyIC0gMipyKnMgKyBjKnIqcjsKKyAgICAgICAgICAgIG5vZGUtPmN2X1RuW2pdID0gSU5UX01BWDsKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkIEN2RFRyZWU6OmNvbXBsZXRlX25vZGVfZGlyKCBDdkRUcmVlTm9kZSogbm9kZSApCit7CisgICAgaW50IHZpLCBpLCBuID0gbm9kZS0+c2FtcGxlX2NvdW50LCBubCwgbnIsIGQwID0gMCwgZDEgPSAtMTsKKyAgICBpbnQgbnogPSBuIC0gbm9kZS0+Z2V0X251bV92YWxpZChub2RlLT5zcGxpdC0+dmFyX2lkeCk7CisgICAgY2hhciogZGlyID0gKGNoYXIqKWRhdGEtPmRpcmVjdGlvbi0+ZGF0YS5wdHI7CisKKyAgICAvLyB0cnkgdG8gY29tcGxldGUgZGlyZWN0aW9uIHVzaW5nIHN1cnJvZ2F0ZSBzcGxpdHMKKyAgICBpZiggbnogJiYgZGF0YS0+cGFyYW1zLnVzZV9zdXJyb2dhdGVzICkKKyAgICB7CisgICAgICAgIEN2RFRyZWVTcGxpdCogc3BsaXQgPSBub2RlLT5zcGxpdC0+bmV4dDsKKyAgICAgICAgZm9yKCA7IHNwbGl0ICE9IDAgJiYgbno7IHNwbGl0ID0gc3BsaXQtPm5leHQgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgaW52ZXJzZWRfbWFzayA9IHNwbGl0LT5pbnZlcnNlZCA/IC0xIDogMDsKKyAgICAgICAgICAgIHZpID0gc3BsaXQtPnZhcl9pZHg7CisKKyAgICAgICAgICAgIGlmKCBkYXRhLT5nZXRfdmFyX3R5cGUodmkpID49IDAgKSAvLyBzcGxpdCBvbiBjYXRlZ29yaWNhbCB2YXIKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGxhYmVscyA9IGRhdGEtPmdldF9jYXRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgICAgICAgICAgICAgIGNvbnN0IGludCogc3Vic2V0ID0gc3BsaXQtPnN1YnNldDsKKworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkeDsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFkaXJbaV0gJiYgKGlkeCA9IGxhYmVsc1tpXSkgPj0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkID0gQ1ZfRFRSRUVfQ0FUX0RJUihpZHgsc3Vic2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpcltpXSA9IChjaGFyKSgoZCBeIGludmVyc2VkX21hc2spIC0gaW52ZXJzZWRfbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggLS1ueiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vIHNwbGl0IG9uIG9yZGVyZWQgdmFyCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgQ3ZQYWlyMzJzMzJmKiBzb3J0ZWQgPSBkYXRhLT5nZXRfb3JkX3Zhcl9kYXRhKG5vZGUsIHZpKTsKKyAgICAgICAgICAgICAgICBpbnQgc3BsaXRfcG9pbnQgPSBzcGxpdC0+b3JkLnNwbGl0X3BvaW50OworICAgICAgICAgICAgICAgIGludCBuMSA9IG5vZGUtPmdldF9udW1fdmFsaWQodmkpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0KCAwIDw9IHNwbGl0X3BvaW50ICYmIHNwbGl0X3BvaW50IDwgbi0xICk7CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjE7IGkrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgaWR4ID0gc29ydGVkW2ldLmk7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhZGlyW2lkeF0gKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZCA9IGkgPD0gc3BsaXRfcG9pbnQgPyAtMSA6IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBkaXJbaWR4XSA9IChjaGFyKSgoZCBeIGludmVyc2VkX21hc2spIC0gaW52ZXJzZWRfbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggLS1ueiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBkZWZhdWx0IGRpcmVjdGlvbiBmb3IgdGhlIHJlc3QKKyAgICBpZiggbnogKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gbnIgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIG5yICs9IGRpcltpXSA+IDA7CisgICAgICAgIG5sID0gbiAtIG5yIC0gbno7CisgICAgICAgIGQwID0gbmwgPiBuciA/IC0xIDogbnIgPiBubDsKKyAgICB9CisKKyAgICAvLyBtYWtlIHN1cmUgdGhhdCBldmVyeSBzYW1wbGUgaXMgZGlyZWN0ZWQgZWl0aGVyIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZSByaWdodAorICAgIGZvciggaSA9IDA7IGkgPCBuOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGQgPSBkaXJbaV07CisgICAgICAgIGlmKCAhZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGQgPSBkMDsKKyAgICAgICAgICAgIGlmKCAhZCApCisgICAgICAgICAgICAgICAgZCA9IGQxLCBkMSA9IC1kMTsKKyAgICAgICAgfQorICAgICAgICBkID0gZCA+IDA7CisgICAgICAgIGRpcltpXSA9IChjaGFyKWQ7IC8vIHJlbWFwICgtMSwxKSB0byAoMCwxKQorICAgIH0KK30KKworCit2b2lkIEN2RFRyZWU6OnNwbGl0X25vZGVfZGF0YSggQ3ZEVHJlZU5vZGUqIG5vZGUgKQoreworICAgIGludCB2aSwgaSwgbiA9IG5vZGUtPnNhbXBsZV9jb3VudCwgbmwsIG5yOworICAgIGNoYXIqIGRpciA9IChjaGFyKilkYXRhLT5kaXJlY3Rpb24tPmRhdGEucHRyOworICAgIEN2RFRyZWVOb2RlICpsZWZ0ID0gMCwgKnJpZ2h0ID0gMDsKKyAgICBpbnQqIG5ld19pZHggPSBkYXRhLT5zcGxpdF9idWYtPmRhdGEuaTsKKyAgICBpbnQgbmV3X2J1Zl9pZHggPSBkYXRhLT5nZXRfY2hpbGRfYnVmX2lkeCggbm9kZSApOworICAgIGludCB3b3JrX3Zhcl9jb3VudCA9IGRhdGEtPmdldF93b3JrX3Zhcl9jb3VudCgpOworCisgICAgLy8gc3BlZWR1cCB0aGluZ3MgYSBsaXR0bGUsIGVzcGVjaWFsbHkgZm9yIHRyZWUgZW5zZW1ibGVzIHdpdGggYSBsb3RzIG9mIHNtYWxsIHRyZWVzOgorICAgIC8vICAgZG8gbm90IHBoeXNpY2FsbHkgc3BsaXQgdGhlIGlucHV0IGRhdGEgYmV0d2VlbiB0aGUgbGVmdCBhbmQgcmlnaHQgY2hpbGQgbm9kZXMKKyAgICAvLyAgIHdoZW4gd2UgYXJlIG5vdCBnb2luZyB0byBzcGxpdCB0aGVtIGZ1cnRoZXIsCisgICAgLy8gICBhcyBjYWxjX25vZGVfdmFsdWUoKSBkb2VzIG5vdCByZXF1aXJlcyBpbnB1dCBmZWF0dXJlcyBhbnl3YXkuCisgICAgYm9vbCBzcGxpdF9pbnB1dF9kYXRhOworCisgICAgY29tcGxldGVfbm9kZV9kaXIobm9kZSk7CisKKyAgICBmb3IoIGkgPSBubCA9IG5yID0gMDsgaSA8IG47IGkrKyApCisgICAgeworICAgICAgICBpbnQgZCA9IGRpcltpXTsKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBuZXcgaW5kaWNlcyBmb3Igc3BsaXR0aW5nIG9yZGVyZWQgdmFyaWFibGVzCisgICAgICAgIG5ld19pZHhbaV0gPSAobmwgJiAoZC0xKSkgfCAobnIgJiAtZCk7IC8vIGQgPyByaSA6IGxpCisgICAgICAgIG5yICs9IGQ7CisgICAgICAgIG5sICs9IGReMTsKKyAgICB9CisKKyAgICBub2RlLT5sZWZ0ID0gbGVmdCA9IGRhdGEtPm5ld19ub2RlKCBub2RlLCBubCwgbmV3X2J1Zl9pZHgsIG5vZGUtPm9mZnNldCApOworICAgIG5vZGUtPnJpZ2h0ID0gcmlnaHQgPSBkYXRhLT5uZXdfbm9kZSggbm9kZSwgbnIsIG5ld19idWZfaWR4LCBub2RlLT5vZmZzZXQgKworICAgICAgICAoZGF0YS0+b3JkX3Zhcl9jb3VudCArIHdvcmtfdmFyX2NvdW50KSpubCApOworCisgICAgc3BsaXRfaW5wdXRfZGF0YSA9IG5vZGUtPmRlcHRoICsgMSA8IGRhdGEtPnBhcmFtcy5tYXhfZGVwdGggJiYKKyAgICAgICAgKG5vZGUtPmxlZnQtPnNhbXBsZV9jb3VudCA+IGRhdGEtPnBhcmFtcy5taW5fc2FtcGxlX2NvdW50IHx8CisgICAgICAgIG5vZGUtPnJpZ2h0LT5zYW1wbGVfY291bnQgPiBkYXRhLT5wYXJhbXMubWluX3NhbXBsZV9jb3VudCk7CisKKyAgICAvLyBzcGxpdCBvcmRlcmVkIHZhcmlhYmxlcywga2VlcCBib3RoIGhhbHZlcyBzb3J0ZWQuCisgICAgZm9yKCB2aSA9IDA7IHZpIDwgZGF0YS0+dmFyX2NvdW50OyB2aSsrICkKKyAgICB7CisgICAgICAgIGludCBjaSA9IGRhdGEtPmdldF92YXJfdHlwZSh2aSk7CisgICAgICAgIGludCBuMSA9IG5vZGUtPmdldF9udW1fdmFsaWQodmkpOworICAgICAgICBDdlBhaXIzMnMzMmYgKnNyYywgKmxkc3QwLCAqcmRzdDAsICpsZHN0LCAqcmRzdDsKKyAgICAgICAgQ3ZQYWlyMzJzMzJmIHRsLCB0cjsKKworICAgICAgICBpZiggY2kgPj0gMCB8fCAhc3BsaXRfaW5wdXRfZGF0YSApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzcmMgPSBkYXRhLT5nZXRfb3JkX3Zhcl9kYXRhKG5vZGUsIHZpKTsKKyAgICAgICAgbGRzdDAgPSBsZHN0ID0gZGF0YS0+Z2V0X29yZF92YXJfZGF0YShsZWZ0LCB2aSk7CisgICAgICAgIHJkc3QwID0gcmRzdCA9IGRhdGEtPmdldF9vcmRfdmFyX2RhdGEocmlnaHQsIHZpKTsKKyAgICAgICAgdGwgPSBsZHN0MFtubF07IHRyID0gcmRzdDBbbnJdOworCisgICAgICAgIC8vIHNwbGl0IHNvcnRlZAorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjE7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSBzcmNbaV0uaTsKKyAgICAgICAgICAgIGZsb2F0IHZhbCA9IHNyY1tpXS52YWw7CisgICAgICAgICAgICBpbnQgZCA9IGRpcltpZHhdOworICAgICAgICAgICAgaWR4ID0gbmV3X2lkeFtpZHhdOworICAgICAgICAgICAgbGRzdC0+aSA9IHJkc3QtPmkgPSBpZHg7CisgICAgICAgICAgICBsZHN0LT52YWwgPSByZHN0LT52YWwgPSB2YWw7CisgICAgICAgICAgICBsZHN0ICs9IGReMTsKKyAgICAgICAgICAgIHJkc3QgKz0gZDsKKyAgICAgICAgfQorCisgICAgICAgIGxlZnQtPnNldF9udW1fdmFsaWQodmksIChpbnQpKGxkc3QgLSBsZHN0MCkpOworICAgICAgICByaWdodC0+c2V0X251bV92YWxpZCh2aSwgKGludCkocmRzdCAtIHJkc3QwKSk7CisKKyAgICAgICAgLy8gc3BsaXQgbWlzc2luZworICAgICAgICBmb3IoIDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBpZHggPSBzcmNbaV0uaTsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2lkeF07CisgICAgICAgICAgICBpZHggPSBuZXdfaWR4W2lkeF07CisgICAgICAgICAgICBsZHN0LT5pID0gcmRzdC0+aSA9IGlkeDsKKyAgICAgICAgICAgIGxkc3QtPnZhbCA9IHJkc3QtPnZhbCA9IG9yZF9uYW47CisgICAgICAgICAgICBsZHN0ICs9IGReMTsKKyAgICAgICAgICAgIHJkc3QgKz0gZDsKKyAgICAgICAgfQorCisgICAgICAgIGxkc3QwW25sXSA9IHRsOyByZHN0MFtucl0gPSB0cjsKKyAgICB9CisKKyAgICAvLyBzcGxpdCBjYXRlZ29yaWNhbCB2YXJzLCByZXNwb25zZXMgYW5kIGN2X2xhYmVscyB1c2luZyBuZXdfaWR4IHJlbG9jYXRpb24gdGFibGUKKyAgICBmb3IoIHZpID0gMDsgdmkgPCB3b3JrX3Zhcl9jb3VudDsgdmkrKyApCisgICAgeworICAgICAgICBpbnQgY2kgPSBkYXRhLT5nZXRfdmFyX3R5cGUodmkpOworICAgICAgICBpbnQgbjEgPSBub2RlLT5nZXRfbnVtX3ZhbGlkKHZpKSwgbnIxID0gMDsKKyAgICAgICAgaW50ICpzcmMsICpsZHN0MCwgKnJkc3QwLCAqbGRzdCwgKnJkc3Q7CisgICAgICAgIGludCB0bCwgdHI7CisKKyAgICAgICAgaWYoIGNpIDwgMCB8fCAodmkgPCBkYXRhLT52YXJfY291bnQgJiYgIXNwbGl0X2lucHV0X2RhdGEpICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIHNyYyA9IGRhdGEtPmdldF9jYXRfdmFyX2RhdGEobm9kZSwgdmkpOworICAgICAgICBsZHN0MCA9IGxkc3QgPSBkYXRhLT5nZXRfY2F0X3Zhcl9kYXRhKGxlZnQsIHZpKTsKKyAgICAgICAgcmRzdDAgPSByZHN0ID0gZGF0YS0+Z2V0X2NhdF92YXJfZGF0YShyaWdodCwgdmkpOworICAgICAgICB0bCA9IGxkc3QwW25sXTsgdHIgPSByZHN0MFtucl07CisKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG47IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBkID0gZGlyW2ldOworICAgICAgICAgICAgaW50IHZhbCA9IHNyY1tpXTsKKyAgICAgICAgICAgICpsZHN0ID0gKnJkc3QgPSB2YWw7CisgICAgICAgICAgICBsZHN0ICs9IGReMTsKKyAgICAgICAgICAgIHJkc3QgKz0gZDsKKyAgICAgICAgICAgIG5yMSArPSAodmFsID49IDApJmQ7CisgICAgICAgIH0KKworICAgICAgICBpZiggdmkgPCBkYXRhLT52YXJfY291bnQgKQorICAgICAgICB7CisgICAgICAgICAgICBsZWZ0LT5zZXRfbnVtX3ZhbGlkKHZpLCBuMSAtIG5yMSk7CisgICAgICAgICAgICByaWdodC0+c2V0X251bV92YWxpZCh2aSwgbnIxKTsKKyAgICAgICAgfQorCisgICAgICAgIGxkc3QwW25sXSA9IHRsOyByZHN0MFtucl0gPSB0cjsKKyAgICB9CisKKyAgICAvLyBkZWFsbG9jYXRlIHRoZSBwYXJlbnQgbm9kZSBkYXRhIHRoYXQgaXMgbm90IG5lZWRlZCBhbnltb3JlCisgICAgZGF0YS0+ZnJlZV9ub2RlX2RhdGEobm9kZSk7Cit9CisKKwordm9pZCBDdkRUcmVlOjpwcnVuZV9jdigpCit7CisgICAgQ3ZNYXQqIGFiID0gMDsKKyAgICBDdk1hdCogdGVtcCA9IDA7CisgICAgQ3ZNYXQqIGVycl9qayA9IDA7CisgICAgCisgICAgLy8gMS4gYnVpbGQgdHJlZSBzZXF1ZW5jZSBmb3IgZWFjaCBjdiBmb2xkLCBjYWxjdWxhdGUgZXJyb3Jfe1RqLGJldGFfa30uCisgICAgLy8gMi4gY2hvb3NlIHRoZSBiZXN0IHRyZWUgaW5kZXggKGlmIG5lZWQsIGFwcGx5IDFTRSBydWxlKS4KKyAgICAvLyAzLiBzdG9yZSB0aGUgYmVzdCBpbmRleCBhbmQgY3V0IHRoZSBicmFuY2hlcy4KKworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZTo6cHJ1bmVfY3YiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdGksIGosIHRyZWVfY291bnQgPSAwLCBjdl9uID0gZGF0YS0+cGFyYW1zLmN2X2ZvbGRzLCBuID0gcm9vdC0+c2FtcGxlX2NvdW50OworICAgIC8vIGN1cnJlbnRseSwgMVNFIGZvciByZWdyZXNzaW9uIGlzIG5vdCBpbXBsZW1lbnRlZAorICAgIGJvb2wgdXNlXzFzZSA9IGRhdGEtPnBhcmFtcy51c2VfMXNlX3J1bGUgIT0gMCAmJiBkYXRhLT5pc19jbGFzc2lmaWVyOworICAgIGRvdWJsZSogZXJyOworICAgIGRvdWJsZSBtaW5fZXJyID0gMCwgbWluX2Vycl9zZSA9IDA7CisgICAgaW50IG1pbl9pZHggPSAtMTsKKyAgICAKKyAgICBDVl9DQUxMKCBhYiA9IGN2Q3JlYXRlTWF0KCAxLCAyNTYsIENWXzY0RiApKTsKKworICAgIC8vIGJ1aWxkIHRoZSBtYWluIHRyZWUgc2VxdWVuY2UsIGNhbGN1bGF0ZSBhbHBoYSdzCisgICAgZm9yKDs7dHJlZV9jb3VudCsrKQorICAgIHsKKyAgICAgICAgZG91YmxlIG1pbl9hbHBoYSA9IHVwZGF0ZV90cmVlX3JuYyh0cmVlX2NvdW50LCAtMSk7CisgICAgICAgIGlmKCBjdXRfdHJlZSh0cmVlX2NvdW50LCAtMSwgbWluX2FscGhhKSApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBpZiggYWItPmNvbHMgPD0gdHJlZV9jb3VudCApCisgICAgICAgIHsKKyAgICAgICAgICAgIENWX0NBTEwoIHRlbXAgPSBjdkNyZWF0ZU1hdCggMSwgYWItPmNvbHMqMy8yLCBDVl82NEYgKSk7CisgICAgICAgICAgICBmb3IoIHRpID0gMDsgdGkgPCBhYi0+Y29sczsgdGkrKyApCisgICAgICAgICAgICAgICAgdGVtcC0+ZGF0YS5kYlt0aV0gPSBhYi0+ZGF0YS5kYlt0aV07CisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZhYiApOworICAgICAgICAgICAgYWIgPSB0ZW1wOworICAgICAgICAgICAgdGVtcCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBhYi0+ZGF0YS5kYlt0cmVlX2NvdW50XSA9IG1pbl9hbHBoYTsKKyAgICB9CisKKyAgICBhYi0+ZGF0YS5kYlswXSA9IDAuOworICAgIAorICAgIGlmKCB0cmVlX2NvdW50ID4gMCApCisgICAgeworICAgICAgICBmb3IoIHRpID0gMTsgdGkgPCB0cmVlX2NvdW50LTE7IHRpKysgKQorICAgICAgICAgICAgYWItPmRhdGEuZGJbdGldID0gc3FydChhYi0+ZGF0YS5kYlt0aV0qYWItPmRhdGEuZGJbdGkrMV0pOworICAgICAgICBhYi0+ZGF0YS5kYlt0cmVlX2NvdW50LTFdID0gREJMX01BWCowLjU7CisKKyAgICAgICAgQ1ZfQ0FMTCggZXJyX2prID0gY3ZDcmVhdGVNYXQoIGN2X24sIHRyZWVfY291bnQsIENWXzY0RiApKTsKKyAgICAgICAgZXJyID0gZXJyX2prLT5kYXRhLmRiOworCisgICAgICAgIGZvciggaiA9IDA7IGogPCBjdl9uOyBqKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdGogPSAwLCB0ayA9IDA7CisgICAgICAgICAgICBmb3IoIDsgdGsgPCB0cmVlX2NvdW50OyB0aisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgbWluX2FscGhhID0gdXBkYXRlX3RyZWVfcm5jKHRqLCBqKTsKKyAgICAgICAgICAgICAgICBpZiggY3V0X3RyZWUodGosIGosIG1pbl9hbHBoYSkgKQorICAgICAgICAgICAgICAgICAgICBtaW5fYWxwaGEgPSBEQkxfTUFYOworCisgICAgICAgICAgICAgICAgZm9yKCA7IHRrIDwgdHJlZV9jb3VudDsgdGsrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggYWItPmRhdGEuZGJbdGtdID4gbWluX2FscGhhICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBlcnJbaip0cmVlX2NvdW50ICsgdGtdID0gcm9vdC0+dHJlZV9lcnJvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IoIHRpID0gMDsgdGkgPCB0cmVlX2NvdW50OyB0aSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIHN1bV9lcnIgPSAwOworICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGN2X247IGorKyApCisgICAgICAgICAgICAgICAgc3VtX2VyciArPSBlcnJbaip0cmVlX2NvdW50ICsgdGldOworICAgICAgICAgICAgaWYoIHRpID09IDAgfHwgc3VtX2VyciA8IG1pbl9lcnIgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1pbl9lcnIgPSBzdW1fZXJyOworICAgICAgICAgICAgICAgIG1pbl9pZHggPSB0aTsKKyAgICAgICAgICAgICAgICBpZiggdXNlXzFzZSApCisgICAgICAgICAgICAgICAgICAgIG1pbl9lcnJfc2UgPSBzcXJ0KCBzdW1fZXJyKihuIC0gc3VtX2VycikgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIHN1bV9lcnIgPCBtaW5fZXJyICsgbWluX2Vycl9zZSApCisgICAgICAgICAgICAgICAgbWluX2lkeCA9IHRpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJ1bmVkX3RyZWVfaWR4ID0gbWluX2lkeDsKKyAgICBmcmVlX3BydW5lX2RhdGEoZGF0YS0+cGFyYW1zLnRydW5jYXRlX3BydW5lZF90cmVlICE9IDApOworCisgICAgX19FTkRfXzsKKworICAgIGN2UmVsZWFzZU1hdCggJmVycl9qayApOworICAgIGN2UmVsZWFzZU1hdCggJmFiICk7CisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworfQorCisKK2RvdWJsZSBDdkRUcmVlOjp1cGRhdGVfdHJlZV9ybmMoIGludCBULCBpbnQgZm9sZCApCit7CisgICAgQ3ZEVHJlZU5vZGUqIG5vZGUgPSByb290OworICAgIGRvdWJsZSBtaW5fYWxwaGEgPSBEQkxfTUFYOworICAgIAorICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIEN2RFRyZWVOb2RlKiBwYXJlbnQ7CisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBmb2xkID49IDAgPyBub2RlLT5jdl9Ubltmb2xkXSA6IG5vZGUtPlRuOworICAgICAgICAgICAgaWYoIHQgPD0gVCB8fCAhbm9kZS0+bGVmdCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZS0+Y29tcGxleGl0eSA9IDE7CisgICAgICAgICAgICAgICAgbm9kZS0+dHJlZV9yaXNrID0gbm9kZS0+bm9kZV9yaXNrOworICAgICAgICAgICAgICAgIG5vZGUtPnRyZWVfZXJyb3IgPSAwLjsKKyAgICAgICAgICAgICAgICBpZiggZm9sZCA+PSAwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG5vZGUtPnRyZWVfcmlzayA9IG5vZGUtPmN2X25vZGVfcmlza1tmb2xkXTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS0+dHJlZV9lcnJvciA9IG5vZGUtPmN2X25vZGVfZXJyb3JbZm9sZF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmxlZnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciggcGFyZW50ID0gbm9kZS0+cGFyZW50OyBwYXJlbnQgJiYgcGFyZW50LT5yaWdodCA9PSBub2RlOworICAgICAgICAgICAgbm9kZSA9IHBhcmVudCwgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBwYXJlbnQtPmNvbXBsZXhpdHkgKz0gbm9kZS0+Y29tcGxleGl0eTsKKyAgICAgICAgICAgIHBhcmVudC0+dHJlZV9yaXNrICs9IG5vZGUtPnRyZWVfcmlzazsKKyAgICAgICAgICAgIHBhcmVudC0+dHJlZV9lcnJvciArPSBub2RlLT50cmVlX2Vycm9yOworCisgICAgICAgICAgICBwYXJlbnQtPmFscGhhID0gKChmb2xkID49IDAgPyBwYXJlbnQtPmN2X25vZGVfcmlza1tmb2xkXSA6IHBhcmVudC0+bm9kZV9yaXNrKQorICAgICAgICAgICAgICAgIC0gcGFyZW50LT50cmVlX3Jpc2spLyhwYXJlbnQtPmNvbXBsZXhpdHkgLSAxKTsKKyAgICAgICAgICAgIG1pbl9hbHBoYSA9IE1JTiggbWluX2FscGhhLCBwYXJlbnQtPmFscGhhICk7CisgICAgICAgIH0KKworICAgICAgICBpZiggIXBhcmVudCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBwYXJlbnQtPmNvbXBsZXhpdHkgPSBub2RlLT5jb21wbGV4aXR5OworICAgICAgICBwYXJlbnQtPnRyZWVfcmlzayA9IG5vZGUtPnRyZWVfcmlzazsKKyAgICAgICAgcGFyZW50LT50cmVlX2Vycm9yID0gbm9kZS0+dHJlZV9lcnJvcjsKKyAgICAgICAgbm9kZSA9IHBhcmVudC0+cmlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIG1pbl9hbHBoYTsKK30KKworCitpbnQgQ3ZEVHJlZTo6Y3V0X3RyZWUoIGludCBULCBpbnQgZm9sZCwgZG91YmxlIG1pbl9hbHBoYSApCit7CisgICAgQ3ZEVHJlZU5vZGUqIG5vZGUgPSByb290OworICAgIGlmKCAhbm9kZS0+bGVmdCApCisgICAgICAgIHJldHVybiAxOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgQ3ZEVHJlZU5vZGUqIHBhcmVudDsKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IGZvbGQgPj0gMCA/IG5vZGUtPmN2X1RuW2ZvbGRdIDogbm9kZS0+VG47CisgICAgICAgICAgICBpZiggdCA8PSBUIHx8ICFub2RlLT5sZWZ0ICkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGlmKCBub2RlLT5hbHBoYSA8PSBtaW5fYWxwaGEgKyBGTFRfRVBTSUxPTiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGZvbGQgPj0gMCApCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPmN2X1RuW2ZvbGRdID0gVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIG5vZGUtPlRuID0gVDsKKyAgICAgICAgICAgICAgICBpZiggbm9kZSA9PSByb290ICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub2RlID0gbm9kZS0+bGVmdDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgZm9yKCBwYXJlbnQgPSBub2RlLT5wYXJlbnQ7IHBhcmVudCAmJiBwYXJlbnQtPnJpZ2h0ID09IG5vZGU7CisgICAgICAgICAgICBub2RlID0gcGFyZW50LCBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudCApCisgICAgICAgICAgICA7CisKKyAgICAgICAgaWYoICFwYXJlbnQgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgbm9kZSA9IHBhcmVudC0+cmlnaHQ7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKwordm9pZCBDdkRUcmVlOjpmcmVlX3BydW5lX2RhdGEoYm9vbCBjdXRfdHJlZSkKK3sKKyAgICBDdkRUcmVlTm9kZSogbm9kZSA9IHJvb3Q7CisgICAgCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgQ3ZEVHJlZU5vZGUqIHBhcmVudDsKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICAvLyBkbyBub3QgY2FsbCBjdlNldFJlbW92ZUJ5UHRyKCBjdl9oZWFwLCBub2RlLT5jdl9UbiApCisgICAgICAgICAgICAvLyBhcyB3ZSB3aWxsIGNsZWFyIHRoZSB3aG9sZSBjcm9zcy12YWxpZGF0aW9uIGhlYXAgYXQgdGhlIGVuZAorICAgICAgICAgICAgbm9kZS0+Y3ZfVG4gPSAwOworICAgICAgICAgICAgbm9kZS0+Y3Zfbm9kZV9lcnJvciA9IG5vZGUtPmN2X25vZGVfcmlzayA9IDA7CisgICAgICAgICAgICBpZiggIW5vZGUtPmxlZnQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmxlZnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciggcGFyZW50ID0gbm9kZS0+cGFyZW50OyBwYXJlbnQgJiYgcGFyZW50LT5yaWdodCA9PSBub2RlOworICAgICAgICAgICAgbm9kZSA9IHBhcmVudCwgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggY3V0X3RyZWUgJiYgcGFyZW50LT5UbiA8PSBwcnVuZWRfdHJlZV9pZHggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRhdGEtPmZyZWVfbm9kZSggcGFyZW50LT5sZWZ0ICk7CisgICAgICAgICAgICAgICAgZGF0YS0+ZnJlZV9ub2RlKCBwYXJlbnQtPnJpZ2h0ICk7CisgICAgICAgICAgICAgICAgcGFyZW50LT5sZWZ0ID0gcGFyZW50LT5yaWdodCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiggIXBhcmVudCApCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBub2RlID0gcGFyZW50LT5yaWdodDsKKyAgICB9CisKKyAgICBpZiggZGF0YS0+Y3ZfaGVhcCApCisgICAgICAgIGN2Q2xlYXJTZXQoIGRhdGEtPmN2X2hlYXAgKTsKK30KKworCit2b2lkIEN2RFRyZWU6OmZyZWVfdHJlZSgpCit7CisgICAgaWYoIHJvb3QgJiYgZGF0YSAmJiBkYXRhLT5zaGFyZWQgKQorICAgIHsKKyAgICAgICAgcHJ1bmVkX3RyZWVfaWR4ID0gSU5UX01JTjsKKyAgICAgICAgZnJlZV9wcnVuZV9kYXRhKHRydWUpOworICAgICAgICBkYXRhLT5mcmVlX25vZGUocm9vdCk7CisgICAgICAgIHJvb3QgPSAwOworICAgIH0KK30KKworCitDdkRUcmVlTm9kZSogQ3ZEVHJlZTo6cHJlZGljdCggY29uc3QgQ3ZNYXQqIF9zYW1wbGUsCisgICAgY29uc3QgQ3ZNYXQqIF9taXNzaW5nLCBib29sIHByZXByb2Nlc3NlZF9pbnB1dCApIGNvbnN0Cit7CisgICAgQ3ZEVHJlZU5vZGUqIHJlc3VsdCA9IDA7CisgICAgaW50KiBjYXRidWYgPSAwOworCisgICAgQ1ZfRlVOQ05BTUUoICJDdkRUcmVlOjpwcmVkaWN0IiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaW50IGksIHN0ZXAsIG1zdGVwID0gMDsKKyAgICBjb25zdCBmbG9hdCogc2FtcGxlOworICAgIGNvbnN0IHVjaGFyKiBtID0gMDsKKyAgICBDdkRUcmVlTm9kZSogbm9kZSA9IHJvb3Q7CisgICAgY29uc3QgaW50KiB2dHlwZTsKKyAgICBjb25zdCBpbnQqIHZpZHg7CisgICAgY29uc3QgaW50KiBjbWFwOworICAgIGNvbnN0IGludCogY29mczsKKworICAgIGlmKCAhbm9kZSApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgIlRoZSB0cmVlIGhhcyBub3QgYmVlbiB0cmFpbmVkIHlldCIgKTsKKworICAgIGlmKCAhQ1ZfSVNfTUFUKF9zYW1wbGUpIHx8IENWX01BVF9UWVBFKF9zYW1wbGUtPnR5cGUpICE9IENWXzMyRkMxIHx8CisgICAgICAgIF9zYW1wbGUtPmNvbHMgIT0gMSAmJiBfc2FtcGxlLT5yb3dzICE9IDEgfHwKKyAgICAgICAgX3NhbXBsZS0+Y29scyArIF9zYW1wbGUtPnJvd3MgLSAxICE9IGRhdGEtPnZhcl9hbGwgJiYgIXByZXByb2Nlc3NlZF9pbnB1dCB8fAorICAgICAgICBfc2FtcGxlLT5jb2xzICsgX3NhbXBsZS0+cm93cyAtIDEgIT0gZGF0YS0+dmFyX2NvdW50ICYmIHByZXByb2Nlc3NlZF9pbnB1dCApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAidGhlIGlucHV0IHNhbXBsZSBtdXN0IGJlIDFkIGZsb2F0aW5nLXBvaW50IHZlY3RvciB3aXRoIHRoZSBzYW1lICIKKyAgICAgICAgIm51bWJlciBvZiBlbGVtZW50cyBhcyB0aGUgdG90YWwgbnVtYmVyIG9mIHZhcmlhYmxlcyB1c2VkIGZvciB0cmFpbmluZyIgKTsKKworICAgIHNhbXBsZSA9IF9zYW1wbGUtPmRhdGEuZmw7CisgICAgc3RlcCA9IENWX0lTX01BVF9DT05UKF9zYW1wbGUtPnR5cGUpID8gMSA6IF9zYW1wbGUtPnN0ZXAvc2l6ZW9mKHNhbXBsZVswXSk7CisKKyAgICBpZiggZGF0YS0+Y2F0X2NvdW50ICYmICFwcmVwcm9jZXNzZWRfaW5wdXQgKSAvLyBjYWNoZSBmb3IgY2F0ZWdvcmljYWwgdmFyaWFibGVzCisgICAgeworICAgICAgICBpbnQgbiA9IGRhdGEtPmNhdF9jb3VudC0+Y29sczsKKyAgICAgICAgY2F0YnVmID0gKGludCopY3ZTdGFja0FsbG9jKG4qc2l6ZW9mKGNhdGJ1ZlswXSkpOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIGNhdGJ1ZltpXSA9IC0xOworICAgIH0KKworICAgIGlmKCBfbWlzc2luZyApCisgICAgeworICAgICAgICBpZiggIUNWX0lTX01BVChfbWlzc2luZykgfHwgIUNWX0lTX01BU0tfQVJSKF9taXNzaW5nKSB8fAorICAgICAgICAhQ1ZfQVJFX1NJWkVTX0VRKF9taXNzaW5nLCBfc2FtcGxlKSApCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAidGhlIG1pc3NpbmcgZGF0YSBtYXNrIG11c3QgYmUgOC1iaXQgdmVjdG9yIG9mIHRoZSBzYW1lIHNpemUgYXMgaW5wdXQgc2FtcGxlIiApOworICAgICAgICBtID0gX21pc3NpbmctPmRhdGEucHRyOworICAgICAgICBtc3RlcCA9IENWX0lTX01BVF9DT05UKF9taXNzaW5nLT50eXBlKSA/IDEgOiBfbWlzc2luZy0+c3RlcC9zaXplb2YobVswXSk7CisgICAgfQorCisgICAgdnR5cGUgPSBkYXRhLT52YXJfdHlwZS0+ZGF0YS5pOworICAgIHZpZHggPSBkYXRhLT52YXJfaWR4ICYmICFwcmVwcm9jZXNzZWRfaW5wdXQgPyBkYXRhLT52YXJfaWR4LT5kYXRhLmkgOiAwOworICAgIGNtYXAgPSBkYXRhLT5jYXRfbWFwID8gZGF0YS0+Y2F0X21hcC0+ZGF0YS5pIDogMDsKKyAgICBjb2ZzID0gZGF0YS0+Y2F0X29mcyA/IGRhdGEtPmNhdF9vZnMtPmRhdGEuaSA6IDA7CisKKyAgICB3aGlsZSggbm9kZS0+VG4gPiBwcnVuZWRfdHJlZV9pZHggJiYgbm9kZS0+bGVmdCApCisgICAgeworICAgICAgICBDdkRUcmVlU3BsaXQqIHNwbGl0ID0gbm9kZS0+c3BsaXQ7CisgICAgICAgIGludCBkaXIgPSAwOworICAgICAgICBmb3IoIDsgIWRpciAmJiBzcGxpdCAhPSAwOyBzcGxpdCA9IHNwbGl0LT5uZXh0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHZpID0gc3BsaXQtPnZhcl9pZHg7CisgICAgICAgICAgICBpbnQgY2kgPSB2dHlwZVt2aV07CisgICAgICAgICAgICBpID0gdmlkeCA/IHZpZHhbdmldIDogdmk7CisgICAgICAgICAgICBmbG9hdCB2YWwgPSBzYW1wbGVbaSpzdGVwXTsKKyAgICAgICAgICAgIGlmKCBtICYmIG1baSptc3RlcF0gKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYoIGNpIDwgMCApIC8vIG9yZGVyZWQKKyAgICAgICAgICAgICAgICBkaXIgPSB2YWwgPD0gc3BsaXQtPm9yZC5jID8gLTEgOiAxOworICAgICAgICAgICAgZWxzZSAvLyBjYXRlZ29yaWNhbAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgICAgIGlmKCBwcmVwcm9jZXNzZWRfaW5wdXQgKQorICAgICAgICAgICAgICAgICAgICBjID0gY3ZSb3VuZCh2YWwpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGMgPSBjYXRidWZbY2ldOworICAgICAgICAgICAgICAgICAgICBpZiggYyA8IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYSA9IGMgPSBjb2ZzW2NpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiID0gY29mc1tjaSsxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpdmFsID0gY3ZSb3VuZCh2YWwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGl2YWwgIT0gdmFsICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzQmFkQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmUgb2YgaW5wdXQgY2F0ZWdvcmljYWwgdmFyaWFibGUgaXMgbm90IGFuIGludGVnZXIiICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCBhIDwgYiApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChhICsgYikgPj4gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaXZhbCA8IGNtYXBbY10gKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBpdmFsID4gY21hcFtjXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgPSBjKzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGMgPCAwIHx8IGl2YWwgIT0gY21hcFtjXSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGJ1ZltjaV0gPSBjIC09IGNvZnNbY2ldOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRpciA9IENWX0RUUkVFX0NBVF9ESVIoYywgc3BsaXQtPnN1YnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKCBzcGxpdC0+aW52ZXJzZWQgKQorICAgICAgICAgICAgICAgIGRpciA9IC1kaXI7CisgICAgICAgIH0KKworICAgICAgICBpZiggIWRpciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGRvdWJsZSBkaWZmID0gbm9kZS0+cmlnaHQtPnNhbXBsZV9jb3VudCAtIG5vZGUtPmxlZnQtPnNhbXBsZV9jb3VudDsKKyAgICAgICAgICAgIGRpciA9IGRpZmYgPCAwID8gLTEgOiAxOworICAgICAgICB9CisgICAgICAgIG5vZGUgPSBkaXIgPCAwID8gbm9kZS0+bGVmdCA6IG5vZGUtPnJpZ2h0OworICAgIH0KKworICAgIHJlc3VsdCA9IG5vZGU7CisKKyAgICBfX0VORF9fOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitjb25zdCBDdk1hdCogQ3ZEVHJlZTo6Z2V0X3Zhcl9pbXBvcnRhbmNlKCkKK3sKKyAgICBpZiggIXZhcl9pbXBvcnRhbmNlICkKKyAgICB7CisgICAgICAgIEN2RFRyZWVOb2RlKiBub2RlID0gcm9vdDsKKyAgICAgICAgZG91YmxlKiBpbXBvcnRhbmNlOworICAgICAgICBpZiggIW5vZGUgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHZhcl9pbXBvcnRhbmNlID0gY3ZDcmVhdGVNYXQoIDEsIGRhdGEtPnZhcl9jb3VudCwgQ1ZfNjRGICk7CisgICAgICAgIGN2WmVybyggdmFyX2ltcG9ydGFuY2UgKTsKKyAgICAgICAgaW1wb3J0YW5jZSA9IHZhcl9pbXBvcnRhbmNlLT5kYXRhLmRiOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgQ3ZEVHJlZU5vZGUqIHBhcmVudDsKKyAgICAgICAgICAgIGZvciggOzsgbm9kZSA9IG5vZGUtPmxlZnQgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEN2RFRyZWVTcGxpdCogc3BsaXQgPSBub2RlLT5zcGxpdDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggIW5vZGUtPmxlZnQgfHwgbm9kZS0+VG4gPD0gcHJ1bmVkX3RyZWVfaWR4ICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgZm9yKCA7IHNwbGl0ICE9IDA7IHNwbGl0ID0gc3BsaXQtPm5leHQgKQorICAgICAgICAgICAgICAgICAgICBpbXBvcnRhbmNlW3NwbGl0LT52YXJfaWR4XSArPSBzcGxpdC0+cXVhbGl0eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yKCBwYXJlbnQgPSBub2RlLT5wYXJlbnQ7IHBhcmVudCAmJiBwYXJlbnQtPnJpZ2h0ID09IG5vZGU7CisgICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudCwgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQgKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgaWYoICFwYXJlbnQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBub2RlID0gcGFyZW50LT5yaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGN2Tm9ybWFsaXplKCB2YXJfaW1wb3J0YW5jZSwgdmFyX2ltcG9ydGFuY2UsIDEuLCAwLCBDVl9MMSApOworICAgIH0KKworICAgIHJldHVybiB2YXJfaW1wb3J0YW5jZTsKK30KKworCit2b2lkIEN2RFRyZWU6OndyaXRlX3NwbGl0KCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZEVHJlZVNwbGl0KiBzcGxpdCApCit7CisgICAgaW50IGNpOworICAgIAorICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIDAsIENWX05PREVfTUFQICsgQ1ZfTk9ERV9GTE9XICk7CisgICAgY3ZXcml0ZUludCggZnMsICJ2YXIiLCBzcGxpdC0+dmFyX2lkeCApOworICAgIGN2V3JpdGVSZWFsKCBmcywgInF1YWxpdHkiLCBzcGxpdC0+cXVhbGl0eSApOworCisgICAgY2kgPSBkYXRhLT5nZXRfdmFyX3R5cGUoc3BsaXQtPnZhcl9pZHgpOworICAgIGlmKCBjaSA+PSAwICkgLy8gc3BsaXQgb24gYSBjYXRlZ29yaWNhbCB2YXIKKyAgICB7CisgICAgICAgIGludCBpLCBuID0gZGF0YS0+Y2F0X2NvdW50LT5kYXRhLmlbY2ldLCB0b19yaWdodCA9IDAsIGRlZmF1bHRfZGlyOworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgICAgIHRvX3JpZ2h0ICs9IENWX0RUUkVFX0NBVF9ESVIoaSxzcGxpdC0+c3Vic2V0KSA+IDA7CisKKyAgICAgICAgLy8gYWQtaG9jIHJ1bGUgd2hlbiB0byB1c2UgaW52ZXJzZSBjYXRlZ29yaWNhbCBzcGxpdCBub3RhdGlvbgorICAgICAgICAvLyB0byBhY2hpZXZlIG1vcmUgY29tcGFjdCBhbmQgY2xlYXIgcmVwcmVzZW50YXRpb24KKyAgICAgICAgZGVmYXVsdF9kaXIgPSB0b19yaWdodCA8PSAxIHx8IHRvX3JpZ2h0IDw9IE1JTigzLCBuLzIpIHx8IHRvX3JpZ2h0IDw9IG4vMyA/IC0xIDogMTsKKyAgICAgICAgCisgICAgICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIGRlZmF1bHRfZGlyKihzcGxpdC0+aW52ZXJzZWQgPyAtMSA6IDEpID4gMCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIiA6ICJub3RfaW4iLCBDVl9OT0RFX1NFUStDVl9OT0RFX0ZMT1cgKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgbjsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGRpciA9IENWX0RUUkVFX0NBVF9ESVIoaSxzcGxpdC0+c3Vic2V0KTsKKyAgICAgICAgICAgIGlmKCBkaXIqZGVmYXVsdF9kaXIgPCAwICkKKyAgICAgICAgICAgICAgICBjdldyaXRlSW50KCBmcywgMCwgaSApOworICAgICAgICB9CisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgY3ZXcml0ZVJlYWwoIGZzLCAhc3BsaXQtPmludmVyc2VkID8gImxlIiA6ICJndCIsIHNwbGl0LT5vcmQuYyApOworCisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKK30KKworCit2b2lkIEN2RFRyZWU6OndyaXRlX25vZGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkRUcmVlTm9kZSogbm9kZSApCit7CisgICAgQ3ZEVHJlZVNwbGl0KiBzcGxpdDsKKyAgICAKKyAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAwLCBDVl9OT0RFX01BUCApOworCisgICAgY3ZXcml0ZUludCggZnMsICJkZXB0aCIsIG5vZGUtPmRlcHRoICk7CisgICAgY3ZXcml0ZUludCggZnMsICJzYW1wbGVfY291bnQiLCBub2RlLT5zYW1wbGVfY291bnQgKTsKKyAgICBjdldyaXRlUmVhbCggZnMsICJ2YWx1ZSIsIG5vZGUtPnZhbHVlICk7CisgICAgCisgICAgaWYoIGRhdGEtPmlzX2NsYXNzaWZpZXIgKQorICAgICAgICBjdldyaXRlSW50KCBmcywgIm5vcm1fY2xhc3NfaWR4Iiwgbm9kZS0+Y2xhc3NfaWR4ICk7CisKKyAgICBjdldyaXRlSW50KCBmcywgIlRuIiwgbm9kZS0+VG4gKTsKKyAgICBjdldyaXRlSW50KCBmcywgImNvbXBsZXhpdHkiLCBub2RlLT5jb21wbGV4aXR5ICk7CisgICAgY3ZXcml0ZVJlYWwoIGZzLCAiYWxwaGEiLCBub2RlLT5hbHBoYSApOworICAgIGN2V3JpdGVSZWFsKCBmcywgIm5vZGVfcmlzayIsIG5vZGUtPm5vZGVfcmlzayApOworICAgIGN2V3JpdGVSZWFsKCBmcywgInRyZWVfcmlzayIsIG5vZGUtPnRyZWVfcmlzayApOworICAgIGN2V3JpdGVSZWFsKCBmcywgInRyZWVfZXJyb3IiLCBub2RlLT50cmVlX2Vycm9yICk7CisKKyAgICBpZiggbm9kZS0+bGVmdCApCisgICAgeworICAgICAgICBjdlN0YXJ0V3JpdGVTdHJ1Y3QoIGZzLCAic3BsaXRzIiwgQ1ZfTk9ERV9TRVEgKTsKKworICAgICAgICBmb3IoIHNwbGl0ID0gbm9kZS0+c3BsaXQ7IHNwbGl0ICE9IDA7IHNwbGl0ID0gc3BsaXQtPm5leHQgKQorICAgICAgICAgICAgd3JpdGVfc3BsaXQoIGZzLCBzcGxpdCApOworCisgICAgICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisgICAgfQorCisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKK30KKworCit2b2lkIEN2RFRyZWU6OndyaXRlX3RyZWVfbm9kZXMoIEN2RmlsZVN0b3JhZ2UqIGZzICkKK3sKKyAgICAvL0NWX0ZVTkNOQU1FKCAiQ3ZEVHJlZTo6d3JpdGVfdHJlZV9ub2RlcyIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIEN2RFRyZWVOb2RlKiBub2RlID0gcm9vdDsKKworICAgIC8vIHRyYXZlcnNlIHRoZSB0cmVlIGFuZCBzYXZlIGFsbCB0aGUgbm9kZXMgaW4gZGVwdGgtZmlyc3Qgb3JkZXIKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBDdkRUcmVlTm9kZSogcGFyZW50OworICAgICAgICBmb3IoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlX25vZGUoIGZzLCBub2RlICk7CisgICAgICAgICAgICBpZiggIW5vZGUtPmxlZnQgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPmxlZnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGZvciggcGFyZW50ID0gbm9kZS0+cGFyZW50OyBwYXJlbnQgJiYgcGFyZW50LT5yaWdodCA9PSBub2RlOworICAgICAgICAgICAgbm9kZSA9IHBhcmVudCwgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQgKQorICAgICAgICAgICAgOworCisgICAgICAgIGlmKCAhcGFyZW50ICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIG5vZGUgPSBwYXJlbnQtPnJpZ2h0OworICAgIH0KKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdkRUcmVlOjp3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMsIGNvbnN0IGNoYXIqIG5hbWUgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJDdkRUcmVlOjp3cml0ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGN2U3RhcnRXcml0ZVN0cnVjdCggZnMsIG5hbWUsIENWX05PREVfTUFQLCBDVl9UWVBFX05BTUVfTUxfVFJFRSApOworCisgICAgZ2V0X3Zhcl9pbXBvcnRhbmNlKCk7CisgICAgZGF0YS0+d3JpdGVfcGFyYW1zKCBmcyApOworICAgIGlmKCB2YXJfaW1wb3J0YW5jZSApCisgICAgICAgIGN2V3JpdGUoIGZzLCAidmFyX2ltcG9ydGFuY2UiLCB2YXJfaW1wb3J0YW5jZSApOworICAgIHdyaXRlKCBmcyApOworCisgICAgY3ZFbmRXcml0ZVN0cnVjdCggZnMgKTsKKworICAgIF9fRU5EX187Cit9CisKKwordm9pZCBDdkRUcmVlOjp3cml0ZSggQ3ZGaWxlU3RvcmFnZSogZnMgKQoreworICAgIC8vQ1ZfRlVOQ05BTUUoICJDdkRUcmVlOjp3cml0ZSIgKTsKKworICAgIF9fQkVHSU5fXzsKKworICAgIGN2V3JpdGVJbnQoIGZzLCAiYmVzdF90cmVlX2lkeCIsIHBydW5lZF90cmVlX2lkeCApOworCisgICAgY3ZTdGFydFdyaXRlU3RydWN0KCBmcywgIm5vZGVzIiwgQ1ZfTk9ERV9TRVEgKTsKKyAgICB3cml0ZV90cmVlX25vZGVzKCBmcyApOworICAgIGN2RW5kV3JpdGVTdHJ1Y3QoIGZzICk7CisKKyAgICBfX0VORF9fOworfQorCisKK0N2RFRyZWVTcGxpdCogQ3ZEVHJlZTo6cmVhZF9zcGxpdCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIGZub2RlICkKK3sKKyAgICBDdkRUcmVlU3BsaXQqIHNwbGl0ID0gMDsKKyAgICAKKyAgICBDVl9GVU5DTkFNRSggIkN2RFRyZWU6OnJlYWRfc3BsaXQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBpbnQgdmksIGNpOworICAgIAorICAgIGlmKCAhZm5vZGUgfHwgQ1ZfTk9ERV9UWVBFKGZub2RlLT50YWcpICE9IENWX05PREVfTUFQICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJzb21lIG9mIHRoZSBzcGxpdHMgYXJlIG5vdCBzdG9yZWQgcHJvcGVybHkiICk7CisKKyAgICB2aSA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGZub2RlLCAidmFyIiwgLTEgKTsKKyAgICBpZiggKHVuc2lnbmVkKXZpID49ICh1bnNpZ25lZClkYXRhLT52YXJfY291bnQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzT3V0T2ZSYW5nZSwgIlNwbGl0IHZhcmlhYmxlIGluZGV4IGlzIG91dCBvZiByYW5nZSIgKTsKKworICAgIGNpID0gZGF0YS0+Z2V0X3Zhcl90eXBlKHZpKTsKKyAgICBpZiggY2kgPj0gMCApIC8vIHNwbGl0IG9uIGNhdGVnb3JpY2FsIHZhcgorICAgIHsKKyAgICAgICAgaW50IGksIG4gPSBkYXRhLT5jYXRfY291bnQtPmRhdGEuaVtjaV0sIGludmVyc2VkID0gMCwgdmFsOworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgICAgIEN2RmlsZU5vZGUqIGluc2VxOworICAgICAgICBzcGxpdCA9IGRhdGEtPm5ld19zcGxpdF9jYXQoIHZpLCAwICk7CisgICAgICAgIGluc2VxID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIGZub2RlLCAiaW4iICk7CisgICAgICAgIGlmKCAhaW5zZXEgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnNlcSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBmbm9kZSwgIm5vdF9pbiIgKTsKKyAgICAgICAgICAgIGludmVyc2VkID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiggIWluc2VxIHx8CisgICAgICAgICAgICAoQ1ZfTk9ERV9UWVBFKGluc2VxLT50YWcpICE9IENWX05PREVfU0VRICYmIENWX05PREVfVFlQRShpbnNlcS0+dGFnKSAhPSBDVl9OT0RFX0lOVCkpCisgICAgICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwKKyAgICAgICAgICAgICJFaXRoZXIgJ2luJyBvciAnbm90X2luJyB0YWdzIHNob3VsZCBiZSBpbnNpZGUgYSBjYXRlZ29yaWNhbCBzcGxpdCBkYXRhIiApOworCisgICAgICAgIGlmKCBDVl9OT0RFX1RZUEUoaW5zZXEtPnRhZykgPT0gQ1ZfTk9ERV9JTlQgKQorICAgICAgICB7CisgICAgICAgICAgICB2YWwgPSBpbnNlcS0+ZGF0YS5pOworICAgICAgICAgICAgaWYoICh1bnNpZ25lZCl2YWwgPj0gKHVuc2lnbmVkKW4gKQorICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAic29tZSBvZiBpbi9ub3RfaW4gZWxlbWVudHMgYXJlIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICAgICAgc3BsaXQtPnN1YnNldFt2YWwgPj4gNV0gfD0gMSA8PCAodmFsICYgMzEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgY3ZTdGFydFJlYWRTZXEoIGluc2VxLT5kYXRhLnNlcSwgJnJlYWRlciApOworCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgcmVhZGVyLnNlcS0+dG90YWw7IGkrKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3ZGaWxlTm9kZSogaW5vZGUgPSAoQ3ZGaWxlTm9kZSopcmVhZGVyLnB0cjsKKyAgICAgICAgICAgICAgICB2YWwgPSBpbm9kZS0+ZGF0YS5pOworICAgICAgICAgICAgICAgIGlmKCBDVl9OT0RFX1RZUEUoaW5vZGUtPnRhZykgIT0gQ1ZfTk9ERV9JTlQgfHwgKHVuc2lnbmVkKXZhbCA+PSAodW5zaWduZWQpbiApCisgICAgICAgICAgICAgICAgICAgIENWX0VSUk9SKCBDVl9TdHNPdXRPZlJhbmdlLCAic29tZSBvZiBpbi9ub3RfaW4gZWxlbWVudHMgYXJlIG91dCBvZiByYW5nZSIgKTsKKworICAgICAgICAgICAgICAgIHNwbGl0LT5zdWJzZXRbdmFsID4+IDVdIHw9IDEgPDwgKHZhbCAmIDMxKTsKKyAgICAgICAgICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCByZWFkZXIuc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZm9yIGNhdGVnb3JpY2FsIHNwbGl0cyB3ZSBkbyBub3QgdXNlIGludmVyc2VkIHNwbGl0cywKKyAgICAgICAgLy8gaW5zdGVhZCB3ZSBpbnZlcnNlIHRoZSB2YXJpYWJsZSBzZXQgaW4gdGhlIHNwbGl0CisgICAgICAgIGlmKCBpbnZlcnNlZCApCisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgKG4gKyAzMSkgPj4gNTsgaSsrICkKKyAgICAgICAgICAgICAgICBzcGxpdC0+c3Vic2V0W2ldIF49IC0xOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBDdkZpbGVOb2RlKiBjbXBfbm9kZTsKKyAgICAgICAgc3BsaXQgPSBkYXRhLT5uZXdfc3BsaXRfb3JkKCB2aSwgMCwgMCwgMCwgMCApOworCisgICAgICAgIGNtcF9ub2RlID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIGZub2RlLCAibGUiICk7CisgICAgICAgIGlmKCAhY21wX25vZGUgKQorICAgICAgICB7CisgICAgICAgICAgICBjbXBfbm9kZSA9IGN2R2V0RmlsZU5vZGVCeU5hbWUoIGZzLCBmbm9kZSwgImd0IiApOworICAgICAgICAgICAgc3BsaXQtPmludmVyc2VkID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHNwbGl0LT5vcmQuYyA9IChmbG9hdCljdlJlYWRSZWFsKCBjbXBfbm9kZSApOworICAgIH0KKyAgICAgICAgCisgICAgc3BsaXQtPnF1YWxpdHkgPSAoZmxvYXQpY3ZSZWFkUmVhbEJ5TmFtZSggZnMsIGZub2RlLCAicXVhbGl0eSIgKTsKKworICAgIF9fRU5EX187CisgICAgCisgICAgcmV0dXJuIHNwbGl0OworfQorCisKK0N2RFRyZWVOb2RlKiBDdkRUcmVlOjpyZWFkX25vZGUoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBmbm9kZSwgQ3ZEVHJlZU5vZGUqIHBhcmVudCApCit7CisgICAgQ3ZEVHJlZU5vZGUqIG5vZGUgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZTo6cmVhZF9ub2RlIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZGaWxlTm9kZSogc3BsaXRzOworICAgIGludCBpLCBkZXB0aDsKKworICAgIGlmKCAhZm5vZGUgfHwgQ1ZfTk9ERV9UWVBFKGZub2RlLT50YWcpICE9IENWX05PREVfTUFQICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJzb21lIG9mIHRoZSB0cmVlIGVsZW1lbnRzIGFyZSBub3Qgc3RvcmVkIHByb3Blcmx5IiApOworCisgICAgQ1ZfQ0FMTCggbm9kZSA9IGRhdGEtPm5ld19ub2RlKCBwYXJlbnQsIDAsIDAsIDAgKSk7CisgICAgZGVwdGggPSBjdlJlYWRJbnRCeU5hbWUoIGZzLCBmbm9kZSwgImRlcHRoIiwgLTEgKTsKKyAgICBpZiggZGVwdGggIT0gbm9kZS0+ZGVwdGggKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgImluY29ycmVjdCBub2RlIGRlcHRoIiApOworCisgICAgbm9kZS0+c2FtcGxlX2NvdW50ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgZm5vZGUsICJzYW1wbGVfY291bnQiICk7CisgICAgbm9kZS0+dmFsdWUgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgZm5vZGUsICJ2YWx1ZSIgKTsKKyAgICBpZiggZGF0YS0+aXNfY2xhc3NpZmllciApCisgICAgICAgIG5vZGUtPmNsYXNzX2lkeCA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGZub2RlLCAibm9ybV9jbGFzc19pZHgiICk7CisKKyAgICBub2RlLT5UbiA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGZub2RlLCAiVG4iICk7CisgICAgbm9kZS0+Y29tcGxleGl0eSA9IGN2UmVhZEludEJ5TmFtZSggZnMsIGZub2RlLCAiY29tcGxleGl0eSIgKTsKKyAgICBub2RlLT5hbHBoYSA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBmbm9kZSwgImFscGhhIiApOworICAgIG5vZGUtPm5vZGVfcmlzayA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBmbm9kZSwgIm5vZGVfcmlzayIgKTsKKyAgICBub2RlLT50cmVlX3Jpc2sgPSBjdlJlYWRSZWFsQnlOYW1lKCBmcywgZm5vZGUsICJ0cmVlX3Jpc2siICk7CisgICAgbm9kZS0+dHJlZV9lcnJvciA9IGN2UmVhZFJlYWxCeU5hbWUoIGZzLCBmbm9kZSwgInRyZWVfZXJyb3IiICk7CisKKyAgICBzcGxpdHMgPSBjdkdldEZpbGVOb2RlQnlOYW1lKCBmcywgZm5vZGUsICJzcGxpdHMiICk7CisgICAgaWYoIHNwbGl0cyApCisgICAgeworICAgICAgICBDdlNlcVJlYWRlciByZWFkZXI7CisgICAgICAgIEN2RFRyZWVTcGxpdCogbGFzdF9zcGxpdCA9IDA7CisKKyAgICAgICAgaWYoIENWX05PREVfVFlQRShzcGxpdHMtPnRhZykgIT0gQ1ZfTk9ERV9TRVEgKQorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1BhcnNlRXJyb3IsICJzcGxpdHMgdGFnIG11c3Qgc3RvcmVkIGFzIGEgc2VxdWVuY2UiICk7CisKKyAgICAgICAgY3ZTdGFydFJlYWRTZXEoIHNwbGl0cy0+ZGF0YS5zZXEsICZyZWFkZXIgKTsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHJlYWRlci5zZXEtPnRvdGFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBDdkRUcmVlU3BsaXQqIHNwbGl0OworICAgICAgICAgICAgQ1ZfQ0FMTCggc3BsaXQgPSByZWFkX3NwbGl0KCBmcywgKEN2RmlsZU5vZGUqKXJlYWRlci5wdHIgKSk7CisgICAgICAgICAgICBpZiggIWxhc3Rfc3BsaXQgKQorICAgICAgICAgICAgICAgIG5vZGUtPnNwbGl0ID0gbGFzdF9zcGxpdCA9IHNwbGl0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGxhc3Rfc3BsaXQgPSBsYXN0X3NwbGl0LT5uZXh0ID0gc3BsaXQ7CisKKyAgICAgICAgICAgIENWX05FWFRfU0VRX0VMRU0oIHJlYWRlci5zZXEtPmVsZW1fc2l6ZSwgcmVhZGVyICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX0VORF9fOworICAgIAorICAgIHJldHVybiBub2RlOworfQorCisKK3ZvaWQgQ3ZEVHJlZTo6cmVhZF90cmVlX25vZGVzKCBDdkZpbGVTdG9yYWdlKiBmcywgQ3ZGaWxlTm9kZSogZm5vZGUgKQoreworICAgIENWX0ZVTkNOQU1FKCAiQ3ZEVHJlZTo6cmVhZF90cmVlX25vZGVzIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZTZXFSZWFkZXIgcmVhZGVyOworICAgIEN2RFRyZWVOb2RlIF9yb290OworICAgIEN2RFRyZWVOb2RlKiBwYXJlbnQgPSAmX3Jvb3Q7CisgICAgaW50IGk7CisgICAgcGFyZW50LT5sZWZ0ID0gcGFyZW50LT5yaWdodCA9IHBhcmVudC0+cGFyZW50ID0gMDsKKworICAgIGN2U3RhcnRSZWFkU2VxKCBmbm9kZS0+ZGF0YS5zZXEsICZyZWFkZXIgKTsKKworICAgIGZvciggaSA9IDA7IGkgPCByZWFkZXIuc2VxLT50b3RhbDsgaSsrICkKKyAgICB7CisgICAgICAgIEN2RFRyZWVOb2RlKiBub2RlOworICAgICAgICAKKyAgICAgICAgQ1ZfQ0FMTCggbm9kZSA9IHJlYWRfbm9kZSggZnMsIChDdkZpbGVOb2RlKilyZWFkZXIucHRyLCBwYXJlbnQgIT0gJl9yb290ID8gcGFyZW50IDogMCApKTsKKyAgICAgICAgaWYoICFwYXJlbnQtPmxlZnQgKQorICAgICAgICAgICAgcGFyZW50LT5sZWZ0ID0gbm9kZTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyZW50LT5yaWdodCA9IG5vZGU7CisgICAgICAgIGlmKCBub2RlLT5zcGxpdCApCisgICAgICAgICAgICBwYXJlbnQgPSBub2RlOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlKCBwYXJlbnQgJiYgcGFyZW50LT5yaWdodCApCisgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBDVl9ORVhUX1NFUV9FTEVNKCByZWFkZXIuc2VxLT5lbGVtX3NpemUsIHJlYWRlciApOworICAgIH0KKworICAgIHJvb3QgPSBfcm9vdC5sZWZ0OworCisgICAgX19FTkRfXzsKK30KKworCit2b2lkIEN2RFRyZWU6OnJlYWQoIEN2RmlsZVN0b3JhZ2UqIGZzLCBDdkZpbGVOb2RlKiBmbm9kZSApCit7CisgICAgQ3ZEVHJlZVRyYWluRGF0YSogX2RhdGEgPSBuZXcgQ3ZEVHJlZVRyYWluRGF0YSgpOworICAgIF9kYXRhLT5yZWFkX3BhcmFtcyggZnMsIGZub2RlICk7CisKKyAgICByZWFkKCBmcywgZm5vZGUsIF9kYXRhICk7CisgICAgZ2V0X3Zhcl9pbXBvcnRhbmNlKCk7Cit9CisKKworLy8gYSBzcGVjaWFsIGVudHJ5IHBvaW50IGZvciByZWFkaW5nIHdlYWsgZGVjaXNpb24gdHJlZXMgZnJvbSB0aGUgdHJlZSBlbnNlbWJsZXMKK3ZvaWQgQ3ZEVHJlZTo6cmVhZCggQ3ZGaWxlU3RvcmFnZSogZnMsIEN2RmlsZU5vZGUqIG5vZGUsIEN2RFRyZWVUcmFpbkRhdGEqIF9kYXRhICkKK3sKKyAgICBDVl9GVU5DTkFNRSggIkN2RFRyZWU6OnJlYWQiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdkZpbGVOb2RlKiB0cmVlX25vZGVzOworCisgICAgY2xlYXIoKTsKKyAgICBkYXRhID0gX2RhdGE7CisKKyAgICB0cmVlX25vZGVzID0gY3ZHZXRGaWxlTm9kZUJ5TmFtZSggZnMsIG5vZGUsICJub2RlcyIgKTsKKyAgICBpZiggIXRyZWVfbm9kZXMgfHwgQ1ZfTk9ERV9UWVBFKHRyZWVfbm9kZXMtPnRhZykgIT0gQ1ZfTk9ERV9TRVEgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfU3RzUGFyc2VFcnJvciwgIm5vZGVzIHRhZyBpcyBtaXNzaW5nIiApOworCisgICAgcHJ1bmVkX3RyZWVfaWR4ID0gY3ZSZWFkSW50QnlOYW1lKCBmcywgbm9kZSwgImJlc3RfdHJlZV9pZHgiLCAtMSApOworICAgIHJlYWRfdHJlZV9ub2RlcyggZnMsIHRyZWVfbm9kZXMgKTsKKworICAgIF9fRU5EX187Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvX2hpZ2hndWkuaCBiL290aGVybGlicy9oaWdoZ3VpL19oaWdoZ3VpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmYmViMgotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL19oaWdoZ3VpLmgKQEAgLTAsMCArMSw4NSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX19ISUdIR1VJX0hfCisjZGVmaW5lIF9fSElHSEdVSV9IXworCisjaW5jbHVkZSAiaGlnaGd1aS5oIgorI2luY2x1ZGUgImN4bWlzYy5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisvKiBFcnJvcnMgKi8KKyNkZWZpbmUgSEdfT0sgICAgICAgICAgMCAvKiBEb24ndCBiZXQgb24gaXQhICovCisjZGVmaW5lIEhHX0JBRE5BTUUgICAgLTEgLyogQmFkIHdpbmRvdyBvciBmaWxlIG5hbWUgKi8KKyNkZWZpbmUgSEdfSU5JVEZBSUxFRCAtMiAvKiBDYW4ndCBpbml0aWFsaXplIEhpZ0hHVUkuIFBvc3NpYmx5LCBjYW4ndCBmaW5kIHZsZ3JmbXRzLmRsbCAqLworI2RlZmluZSBIR19XQ0ZBSUxFRCAgIC0zIC8qIENhbid0IGNyZWF0ZSBhIHdpbmRvdyAqLworI2RlZmluZSBIR19OVUxMUFRSICAgIC00IC8qIFRoZSBudWxsIHBvaW50ZXIgd2hlcmUgaXQgc2hvdWxkIG5vdCBhcHBlYXIgKi8KKyNkZWZpbmUgSEdfQkFEUEFSQU0gICAtNQorCisjZGVmaW5lIENWX1dJTkRPV19NQUdJQ19WQUwgICAgIDB4MDA0MjAwNDIKKyNkZWZpbmUgQ1ZfVFJBQ0tCQVJfTUFHSUNfVkFMICAgMHgwMDQyMDA0MworI2RlZmluZSBjdlNob3dJbWFnZSBOVUxMCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBDdkNhcHR1cmUgc3RydWN0dXJlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IEN2Q2FwdHVyZQoreworICAgIHZpcnR1YWwgfkN2Q2FwdHVyZSgpIHt9CisgICAgdmlydHVhbCBkb3VibGUgZ2V0UHJvcGVydHkoaW50KSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIHNldFByb3BlcnR5KGludCwgZG91YmxlKSB7IHJldHVybiAwOyB9CisgICAgdmlydHVhbCBib29sIGdyYWJGcmFtZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIElwbEltYWdlKiByZXRyaWV2ZUZyYW1lKCkgeyByZXR1cm4gMDsgfQorICAgIHZpcnR1YWwgSXBsSW1hZ2UqIHF1ZXJ5RnJhbWUoKSB7IHJldHVybiBncmFiRnJhbWUoKSA/IHJldHJpZXZlRnJhbWUoKSA6IDA7IH0KK307CisKK0N2Q2FwdHVyZSogY3ZDcmVhdGVDYW1lcmFDYXB0dXJlX1NvY2tldCggY29uc3QgY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciogcG9ydCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICk7CisKK0NWQVBJKGludCkgY3ZIYXZlSW1hZ2VSZWFkZXIoY29uc3QgY2hhciogZmlsZW5hbWUpOworQ1ZBUEkoaW50KSBjdkhhdmVJbWFnZVdyaXRlcihjb25zdCBjaGFyKiBmaWxlbmFtZSk7CisKKworI2VuZGlmIC8qIF9fSElHSEdVSV9IXyAqLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvYml0c3RybS5jcHAgYi9vdGhlcmxpYnMvaGlnaGd1aS9iaXRzdHJtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNiYjFhCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvYml0c3RybS5jcHAKQEAgLTAsMCArMSwxMTA2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9oaWdoZ3VpLmgiCisjaW5jbHVkZSAiYml0c3RybS5oIgorCisjZGVmaW5lICBCU19ERUZfQkxPQ0tfU0laRSAgICgxPDwxNSkKKworY29uc3QgdWxvbmcgYnNfYml0X21hc2tbXSA9IHsKKyAgICAwLAorICAgIDB4MDAwMDAwMDEsIDB4MDAwMDAwMDMsIDB4MDAwMDAwMDcsIDB4MDAwMDAwMEYsCisgICAgMHgwMDAwMDAxRiwgMHgwMDAwMDAzRiwgMHgwMDAwMDA3RiwgMHgwMDAwMDBGRiwKKyAgICAweDAwMDAwMUZGLCAweDAwMDAwM0ZGLCAweDAwMDAwN0ZGLCAweDAwMDAwRkZGLAorICAgIDB4MDAwMDFGRkYsIDB4MDAwMDNGRkYsIDB4MDAwMDdGRkYsIDB4MDAwMEZGRkYsCisgICAgMHgwMDAxRkZGRiwgMHgwMDAzRkZGRiwgMHgwMDA3RkZGRiwgMHgwMDBGRkZGRiwKKyAgICAweDAwMUZGRkZGLCAweDAwM0ZGRkZGLCAweDAwN0ZGRkZGLCAweDAwRkZGRkZGLAorICAgIDB4MDFGRkZGRkYsIDB4MDNGRkZGRkYsIDB4MDdGRkZGRkYsIDB4MEZGRkZGRkYsCisgICAgMHgxRkZGRkZGRiwgMHgzRkZGRkZGRiwgMHg3RkZGRkZGRiwgMHhGRkZGRkZGRgorfTsKKwordm9pZCBic0JTd2FwQmxvY2soIHVjaGFyICpzdGFydCwgdWNoYXIgKmVuZCApCit7CisgICAgdWxvbmcqIGRhdGEgPSAodWxvbmcqKXN0YXJ0OworICAgIGludCBpLCBzaXplID0gKGludCkoZW5kIC0gc3RhcnQrMykvNDsKKworICAgIGZvciggaSA9IDA7IGkgPCBzaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgdWxvbmcgdGVtcCA9IGRhdGFbaV07CisgICAgICAgIHRlbXAgPSBCU1dBUCggdGVtcCApOworICAgICAgICBkYXRhW2ldID0gdGVtcDsKKyAgICB9Cit9CisKK2Jvb2wgIGJzSXNCaWdFbmRpYW4oIHZvaWQgKQoreworICAgIHJldHVybiAoKChjb25zdCBpbnQqKSJcMFx4MVx4Mlx4M1x4NFx4NVx4Nlx4NyIpWzBdICYgMjU1KSAhPSAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICBSQmFzZVN0cmVhbSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK2Jvb2wgIFJCYXNlU3RyZWFtOjpJc09wZW5lZCgpCit7IAorICAgIHJldHVybiBtX2lzX29wZW5lZDsKK30KKwordm9pZCAgUkJhc2VTdHJlYW06OkFsbG9jYXRlKCkKK3sKKyAgICBpZiggIW1fc3RhcnQgKQorICAgIHsKKyAgICAgICAgbV9zdGFydCA9IG5ldyB1Y2hhclttX2Jsb2NrX3NpemUgKyBtX3VuR2V0c2l6ZV07CisgICAgICAgIG1fc3RhcnQrPSBtX3VuR2V0c2l6ZTsKKyAgICB9CisgICAgbV9lbmQgPSBtX3N0YXJ0ICsgbV9ibG9ja19zaXplOworICAgIG1fY3VycmVudCA9IG1fZW5kOworfQorCisKK1JCYXNlU3RyZWFtOjpSQmFzZVN0cmVhbSgpCit7CisgICAgbV9zdGFydCA9IG1fZW5kID0gbV9jdXJyZW50ID0gMDsKKyAgICBtX2ZpbGUgPSAwOworICAgIG1fYmxvY2tfc2l6ZSA9IEJTX0RFRl9CTE9DS19TSVpFOworICAgIG1fdW5HZXRzaXplID0gNDsgLy8gMzIgYml0cworICAgIG1faXNfb3BlbmVkID0gZmFsc2U7CisgICAgbV9qbXBfc2V0ID0gZmFsc2U7Cit9CisKKworUkJhc2VTdHJlYW06On5SQmFzZVN0cmVhbSgpCit7CisgICAgQ2xvc2UoKTsgICAgLy8gQ2xvc2UgZmlsZXMKKyAgICBSZWxlYXNlKCk7ICAvLyBmcmVlICBidWZmZXJzCit9CisKKwordm9pZCAgUkJhc2VTdHJlYW06OlJlYWRCbG9jaygpCit7CisgICAgc2l6ZV90IHJlYWRlZDsKKyAgICBhc3NlcnQoIG1fZmlsZSAhPSAwICk7CisKKyAgICAvLyBjb3B5IHVuZ2V0IGJ1ZmZlcgorICAgIGlmKCBtX3N0YXJ0ICkKKyAgICB7CisgICAgICAgIG1lbWNweSggbV9zdGFydCAtIG1fdW5HZXRzaXplLCBtX2VuZCAtIG1fdW5HZXRzaXplLCBtX3VuR2V0c2l6ZSApOworICAgIH0KKworICAgIFNldFBvcyggR2V0UG9zKCkgKTsgLy8gbm9ybWFsaXplIHBvc2l0aW9uCisKKyAgICBmc2VlayggbV9maWxlLCBtX2Jsb2NrX3BvcywgU0VFS19TRVQgKTsKKyAgICByZWFkZWQgPSBmcmVhZCggbV9zdGFydCwgMSwgbV9ibG9ja19zaXplLCBtX2ZpbGUgKTsKKyAgICBtX2VuZCA9IG1fc3RhcnQgKyByZWFkZWQ7CisgICAgbV9jdXJyZW50ICAgLT0gbV9ibG9ja19zaXplOworICAgIG1fYmxvY2tfcG9zICs9IG1fYmxvY2tfc2l6ZTsKKworICAgIGlmKCByZWFkZWQgPT0gMCB8fCBtX2N1cnJlbnQgPj0gbV9lbmQgKQorICAgIHsKKyAgICAgICAgaWYoIG1fam1wX3NldCApCisgICAgICAgICAgICBsb25nam1wKCBtX2ptcF9idWYsIFJCU19USFJPV19FT1MgKTsKKyAgICB9Cit9CisKKworYm9vbCAgUkJhc2VTdHJlYW06Ok9wZW4oIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBDbG9zZSgpOworICAgIEFsbG9jYXRlKCk7CisgICAgCisgICAgbV9maWxlID0gZm9wZW4oIGZpbGVuYW1lLCAicmIiICk7CisgICAgCisgICAgaWYoIG1fZmlsZSApCisgICAgeworICAgICAgICBtX2lzX29wZW5lZCA9IHRydWU7CisgICAgICAgIFNldFBvcygwKTsKKyAgICB9CisgICAgcmV0dXJuIG1fZmlsZSAhPSAwOworfQorCit2b2lkICBSQmFzZVN0cmVhbTo6Q2xvc2UoKQoreworICAgIGlmKCBtX2ZpbGUgKQorICAgIHsKKyAgICAgICAgZmNsb3NlKCBtX2ZpbGUgKTsKKyAgICAgICAgbV9maWxlID0gMDsKKyAgICB9CisgICAgbV9pc19vcGVuZWQgPSBmYWxzZTsKK30KKworCit2b2lkICBSQmFzZVN0cmVhbTo6UmVsZWFzZSgpCit7CisgICAgaWYoIG1fc3RhcnQgKQorICAgIHsKKyAgICAgICAgZGVsZXRlW10gKG1fc3RhcnQgLSBtX3VuR2V0c2l6ZSk7CisgICAgfQorICAgIG1fc3RhcnQgPSBtX2VuZCA9IG1fY3VycmVudCA9IDA7Cit9CisKKwordm9pZCAgUkJhc2VTdHJlYW06OlNldEJsb2NrU2l6ZSggaW50IGJsb2NrX3NpemUsIGludCB1bkdldHNpemUgKQoreworICAgIGFzc2VydCggdW5HZXRzaXplID49IDAgJiYgYmxvY2tfc2l6ZSA+IDAgJiYKKyAgICAgICAgICAgKGJsb2NrX3NpemUgJiAoYmxvY2tfc2l6ZS0xKSkgPT0gMCApOworCisgICAgaWYoIG1fc3RhcnQgJiYgYmxvY2tfc2l6ZSA9PSBtX2Jsb2NrX3NpemUgJiYgdW5HZXRzaXplID09IG1fdW5HZXRzaXplICkgcmV0dXJuOworICAgIFJlbGVhc2UoKTsKKyAgICBtX2Jsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgIG1fdW5HZXRzaXplID0gdW5HZXRzaXplOworICAgIEFsbG9jYXRlKCk7Cit9CisKKwordm9pZCAgUkJhc2VTdHJlYW06OlNldFBvcyggaW50IHBvcyApCit7CisgICAgaW50IG9mZnNldCA9IHBvcyAmIChtX2Jsb2NrX3NpemUgLSAxKTsKKyAgICBpbnQgYmxvY2tfcG9zID0gcG9zIC0gb2Zmc2V0OworICAgIAorICAgIGFzc2VydCggSXNPcGVuZWQoKSAmJiBwb3MgPj0gMCApOworICAgIAorICAgIGlmKCBtX2N1cnJlbnQgPCBtX2VuZCAmJiBibG9ja19wb3MgPT0gbV9ibG9ja19wb3MgLSBtX2Jsb2NrX3NpemUgKQorICAgIHsKKyAgICAgICAgbV9jdXJyZW50ID0gbV9zdGFydCArIG9mZnNldDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgbV9ibG9ja19wb3MgPSBibG9ja19wb3M7CisgICAgICAgIG1fY3VycmVudCA9IG1fc3RhcnQgKyBtX2Jsb2NrX3NpemUgKyBvZmZzZXQ7CisgICAgfQorfQorCisKK2ludCAgUkJhc2VTdHJlYW06OkdldFBvcygpCit7CisgICAgYXNzZXJ0KCBJc09wZW5lZCgpICk7CisgICAgcmV0dXJuIG1fYmxvY2tfcG9zIC0gbV9ibG9ja19zaXplICsgKGludCkobV9jdXJyZW50IC0gbV9zdGFydCk7Cit9CisKK3ZvaWQgIFJCYXNlU3RyZWFtOjpTa2lwKCBpbnQgYnl0ZXMgKQoreworICAgIGFzc2VydCggYnl0ZXMgPj0gMCApOworICAgIG1fY3VycmVudCArPSBieXRlczsKK30KKworam1wX2J1ZiYgUkJhc2VTdHJlYW06OkptcEJ1ZigpCit7IAorICAgIG1fam1wX3NldCA9IHRydWU7CisgICAgcmV0dXJuIG1fam1wX2J1ZjsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgUkxCeXRlU3RyZWFtIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUkxCeXRlU3RyZWFtOjp+UkxCeXRlU3RyZWFtKCkKK3sKK30KKworaW50ICBSTEJ5dGVTdHJlYW06OkdldEJ5dGUoKQoreworICAgIHVjaGFyICpjdXJyZW50ID0gbV9jdXJyZW50OworICAgIGludCAgIHZhbDsKKworICAgIGlmKCBjdXJyZW50ID49IG1fZW5kICkKKyAgICB7CisgICAgICAgIFJlYWRCbG9jaygpOworICAgICAgICBjdXJyZW50ID0gbV9jdXJyZW50OworICAgIH0KKworICAgIHZhbCA9ICooKHVjaGFyKiljdXJyZW50KTsKKyAgICBtX2N1cnJlbnQgPSBjdXJyZW50ICsgMTsKKyAgICByZXR1cm4gdmFsOworfQorCisKK3ZvaWQgIFJMQnl0ZVN0cmVhbTo6R2V0Qnl0ZXMoIHZvaWQqIGJ1ZmZlciwgaW50IGNvdW50LCBpbnQqIHJlYWRlZCApCit7CisgICAgdWNoYXIqICBkYXRhID0gKHVjaGFyKilidWZmZXI7CisgICAgYXNzZXJ0KCBjb3VudCA+PSAwICk7CisgICAgCisgICAgaWYoIHJlYWRlZCkgKnJlYWRlZCA9IDA7CisKKyAgICB3aGlsZSggY291bnQgPiAwICkKKyAgICB7CisgICAgICAgIGludCBsOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgbCA9IChpbnQpKG1fZW5kIC0gbV9jdXJyZW50KTsKKyAgICAgICAgICAgIGlmKCBsID4gY291bnQgKSBsID0gY291bnQ7CisgICAgICAgICAgICBpZiggbCA+IDAgKSBicmVhazsKKyAgICAgICAgICAgIFJlYWRCbG9jaygpOworICAgICAgICB9CisgICAgICAgIG1lbWNweSggZGF0YSwgbV9jdXJyZW50LCBsICk7CisgICAgICAgIG1fY3VycmVudCArPSBsOworICAgICAgICBkYXRhICs9IGw7CisgICAgICAgIGNvdW50IC09IGw7CisgICAgICAgIGlmKCByZWFkZWQgKSAqcmVhZGVkICs9IGw7CisgICAgfQorfQorCisKKy8vLy8vLy8vLy8vLyAgUkxCeXRlU3RyZWFtICYgUk1CeXRlU3RyZWFtIDxHZXRbZF13b3JkPnMgLy8vLy8vLy8vLy8vLy8vLworCitSTUJ5dGVTdHJlYW06On5STUJ5dGVTdHJlYW0oKQoreworfQorCisKK2ludCAgUkxCeXRlU3RyZWFtOjpHZXRXb3JkKCkKK3sKKyAgICB1Y2hhciAqY3VycmVudCA9IG1fY3VycmVudDsKKyAgICBpbnQgICB2YWw7CisKKyAgICBpZiggY3VycmVudCsxIDwgbV9lbmQgKQorICAgIHsKKyAgICAgICAgdmFsID0gY3VycmVudFswXSArIChjdXJyZW50WzFdIDw8IDgpOworICAgICAgICBtX2N1cnJlbnQgPSBjdXJyZW50ICsgMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFsID0gR2V0Qnl0ZSgpOworICAgICAgICB2YWx8PSBHZXRCeXRlKCkgPDwgODsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworCitpbnQgIFJMQnl0ZVN0cmVhbTo6R2V0RFdvcmQoKQoreworICAgIHVjaGFyICpjdXJyZW50ID0gbV9jdXJyZW50OworICAgIGludCAgIHZhbDsKKworICAgIGlmKCBjdXJyZW50KzMgPCBtX2VuZCApCisgICAgeworICAgICAgICB2YWwgPSBjdXJyZW50WzBdICsgKGN1cnJlbnRbMV0gPDwgOCkgKworICAgICAgICAgICAgICAoY3VycmVudFsyXSA8PCAxNikgKyAoY3VycmVudFszXSA8PCAyNCk7CisgICAgICAgIG1fY3VycmVudCA9IGN1cnJlbnQgKyA0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB2YWwgPSBHZXRCeXRlKCk7CisgICAgICAgIHZhbCB8PSBHZXRCeXRlKCkgPDwgODsKKyAgICAgICAgdmFsIHw9IEdldEJ5dGUoKSA8PCAxNjsKKyAgICAgICAgdmFsIHw9IEdldEJ5dGUoKSA8PCAyNDsKKyAgICB9CisgICAgcmV0dXJuIHZhbDsKK30KKworCitpbnQgIFJNQnl0ZVN0cmVhbTo6R2V0V29yZCgpCit7CisgICAgdWNoYXIgKmN1cnJlbnQgPSBtX2N1cnJlbnQ7CisgICAgaW50ICAgdmFsOworCisgICAgaWYoIGN1cnJlbnQrMSA8IG1fZW5kICkKKyAgICB7CisgICAgICAgIHZhbCA9IChjdXJyZW50WzBdIDw8IDgpICsgY3VycmVudFsxXTsKKyAgICAgICAgbV9jdXJyZW50ID0gY3VycmVudCArIDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHZhbCA9IEdldEJ5dGUoKSA8PCA4OworICAgICAgICB2YWx8PSBHZXRCeXRlKCk7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKKworaW50ICBSTUJ5dGVTdHJlYW06OkdldERXb3JkKCkKK3sKKyAgICB1Y2hhciAqY3VycmVudCA9IG1fY3VycmVudDsKKyAgICBpbnQgICB2YWw7CisKKyAgICBpZiggY3VycmVudCszIDwgbV9lbmQgKQorICAgIHsKKyAgICAgICAgdmFsID0gKGN1cnJlbnRbMF0gPDwgMjQpICsgKGN1cnJlbnRbMV0gPDwgMTYpICsKKyAgICAgICAgICAgICAgKGN1cnJlbnRbMl0gPDwgOCkgKyBjdXJyZW50WzNdOworICAgICAgICBtX2N1cnJlbnQgPSBjdXJyZW50ICsgNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgdmFsID0gR2V0Qnl0ZSgpIDw8IDI0OworICAgICAgICB2YWwgfD0gR2V0Qnl0ZSgpIDw8IDE2OworICAgICAgICB2YWwgfD0gR2V0Qnl0ZSgpIDw8IDg7CisgICAgICAgIHZhbCB8PSBHZXRCeXRlKCk7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgUkxCaXRTdHJlYW0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitSTEJpdFN0cmVhbTo6flJMQml0U3RyZWFtKCkKK3sKK30KKworCit2b2lkICBSTEJpdFN0cmVhbTo6UmVhZEJsb2NrKCkKK3sKKyAgICBSQmFzZVN0cmVhbTo6UmVhZEJsb2NrKCk7CisgICAgaWYoIGJzSXNCaWdFbmRpYW4oKSApCisgICAgICAgIGJzQlN3YXBCbG9jayggbV9zdGFydCwgbV9lbmQgKTsKK30KKworCit2b2lkICBSTEJpdFN0cmVhbTo6U2V0UG9zKCBpbnQgcG9zICkKK3sKKyAgICBSQmFzZVN0cmVhbTo6U2V0UG9zKHBvcyk7CisgICAgaW50IG9mZnNldCA9IChpbnQpKG1fY3VycmVudCAtIG1fZW5kKTsKKyAgICBtX2N1cnJlbnQgPSBtX2VuZCArIChvZmZzZXQgJiAtNCk7CisgICAgbV9iaXRfaWR4ID0gKG9mZnNldCYzKSo4OworfQorCisKK2ludCAgUkxCaXRTdHJlYW06OkdldFBvcygpCit7CisgICAgcmV0dXJuIFJCYXNlU3RyZWFtOjpHZXRQb3MoKSArIChtX2JpdF9pZHggPj4gMyk7Cit9CisKKworaW50ICBSTEJpdFN0cmVhbTo6R2V0KCBpbnQgYml0cyApCit7CisgICAgaW50ICAgIGJpdF9pZHggICAgID0gbV9iaXRfaWR4OworICAgIGludCAgICBuZXdfYml0X2lkeCA9IGJpdF9pZHggKyBiaXRzOworICAgIGludCAgICBtYXNrICAgID0gbmV3X2JpdF9pZHggPj0gMzIgPyAtMSA6IDA7CisgICAgdWxvbmcqIGN1cnJlbnQgPSAodWxvbmcqKW1fY3VycmVudDsKKworICAgIGFzc2VydCggKHVuc2lnbmVkKWJpdHMgPCAzMiApOworCisgICAgaWYoIChtX2N1cnJlbnQgPSAodWNoYXIqKShjdXJyZW50IC0gbWFzaykpID49IG1fZW5kICkKKyAgICB7CisgICAgICAgIFJlYWRCbG9jaygpOworICAgICAgICBjdXJyZW50ID0gKCh1bG9uZyopbV9jdXJyZW50KSArIG1hc2s7CisgICAgfQorICAgIG1fYml0X2lkeCA9IG5ld19iaXRfaWR4ICYgMzE7CisgICAgcmV0dXJuICgoY3VycmVudFswXSA+PiBiaXRfaWR4KSB8CisgICAgICAgICAgICgoY3VycmVudFsxXSA8PC1iaXRfaWR4KSAmIG1hc2spKSAmIGJzX2JpdF9tYXNrW2JpdHNdOworfQorCitpbnQgIFJMQml0U3RyZWFtOjpTaG93KCBpbnQgYml0cyApCit7CisgICAgaW50ICAgIGJpdF9pZHggPSBtX2JpdF9pZHg7CisgICAgaW50ICAgIG5ld19iaXRfaWR4ID0gYml0X2lkeCArIGJpdHM7CisgICAgaW50ICAgIG1hc2sgICAgPSBuZXdfYml0X2lkeCA+PSAzMiA/IC0xIDogMDsKKyAgICB1bG9uZyogY3VycmVudCA9ICh1bG9uZyopbV9jdXJyZW50OworCisgICAgYXNzZXJ0KCAodW5zaWduZWQpYml0cyA8IDMyICk7CisKKyAgICBpZiggKHVjaGFyKikoY3VycmVudCAtIG1hc2spID49IG1fZW5kICkKKyAgICB7CisgICAgICAgIFJlYWRCbG9jaygpOworICAgICAgICBjdXJyZW50ID0gKCh1bG9uZyopbV9jdXJyZW50KSArIG1hc2s7CisgICAgICAgIG1fY3VycmVudCA9ICh1Y2hhciopY3VycmVudDsKKyAgICB9CisgICAgcmV0dXJuICgoY3VycmVudFswXSA+PiBiaXRfaWR4KSB8CisgICAgICAgICAgICgoY3VycmVudFsxXSA8PC1iaXRfaWR4KSAmIG1hc2spKSAmIGJzX2JpdF9tYXNrW2JpdHNdOworfQorCisKK3ZvaWQgIFJMQml0U3RyZWFtOjpNb3ZlKCBpbnQgc2hpZnQgKQoreworICAgIGludCBuZXdfYml0X2lkeCA9IG1fYml0X2lkeCArIHNoaWZ0OworICAgIG1fY3VycmVudCArPSAobmV3X2JpdF9pZHggPj4gNSkgPDwgMjsKKyAgICBtX2JpdF9pZHggID0gbmV3X2JpdF9pZHggJiAzMTsKK30KKworCitpbnQgIFJMQml0U3RyZWFtOjpHZXRIdWZmKCBjb25zdCBzaG9ydCogdGFibGUgKQoreworICAgIGludCAgdmFsOworICAgIGludCAgY29kZV9iaXRzOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgaW50IHRhYmxlX2JpdHMgPSB0YWJsZVswXTsKKyAgICAgICAgdmFsID0gdGFibGVbU2hvdyh0YWJsZV9iaXRzKSArIDJdOworICAgICAgICBjb2RlX2JpdHMgPSB2YWwgJiAxNTsKKyAgICAgICAgdmFsID4+PSA0OworCisgICAgICAgIGlmKCBjb2RlX2JpdHMgIT0gMCApIGJyZWFrOworICAgICAgICB0YWJsZSArPSB2YWwqMjsKKyAgICAgICAgTW92ZSggdGFibGVfYml0cyApOworICAgIH0KKworICAgIE1vdmUoIGNvZGVfYml0cyApOworICAgIGlmKCB2YWwgPT0gUkJTX0hVRkZfRk9SQiApCisgICAgeworICAgICAgICBpZiggbV9qbXBfc2V0ICkKKyAgICAgICAgICAgIGxvbmdqbXAoIG1fam1wX2J1ZiwgUkJTX1RIUk9XX0ZPUkIgKTsKKyAgICB9CisKKyAgICByZXR1cm4gdmFsOworfQorCit2b2lkICBSTEJpdFN0cmVhbTo6U2tpcCggaW50IGJ5dGVzICkKK3sKKyAgICBNb3ZlKCBieXRlcyo4ICk7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIFJNQml0U3RyZWFtIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworCitSTUJpdFN0cmVhbTo6flJNQml0U3RyZWFtKCkKK3sKK30KKworCit2b2lkICBSTUJpdFN0cmVhbTo6UmVhZEJsb2NrKCkKK3sKKyAgICBSQmFzZVN0cmVhbTo6UmVhZEJsb2NrKCk7CisgICAgaWYoICFic0lzQmlnRW5kaWFuKCkgKQorICAgICAgICBic0JTd2FwQmxvY2soIG1fc3RhcnQsIG1fZW5kICk7Cit9CisKKwordm9pZCAgUk1CaXRTdHJlYW06OlNldFBvcyggaW50IHBvcyApCit7CisgICAgUkJhc2VTdHJlYW06OlNldFBvcyhwb3MpOworICAgIGludCBvZmZzZXQgPSAoaW50KShtX2N1cnJlbnQgLSBtX2VuZCk7CisgICAgbV9jdXJyZW50ID0gbV9lbmQgKyAoKG9mZnNldCAtIDEpICYgLTQpOworICAgIG1fYml0X2lkeCA9ICgzMiAtIChvZmZzZXQmMykqOCkgJiAzMTsKK30KKworCitpbnQgIFJNQml0U3RyZWFtOjpHZXRQb3MoKQoreworICAgIHJldHVybiBSQmFzZVN0cmVhbTo6R2V0UG9zKCkgKyAoKDMyIC0gbV9iaXRfaWR4KSA+PiAzKTsKK30KKworCitpbnQgIFJNQml0U3RyZWFtOjpHZXQoIGludCBiaXRzICkKK3sKKyAgICBpbnQgICAgYml0X2lkeCA9IG1fYml0X2lkeCAtIGJpdHM7CisgICAgaW50ICAgIG1hc2sgICAgPSBiaXRfaWR4ID4+IDMxOworICAgIHVsb25nKiBjdXJyZW50ID0gKCh1bG9uZyopbV9jdXJyZW50KSAtIG1hc2s7CisKKyAgICBhc3NlcnQoICh1bnNpZ25lZCliaXRzIDwgMzIgKTsKKworICAgIGlmKCAobV9jdXJyZW50ID0gKHVjaGFyKiljdXJyZW50KSA+PSBtX2VuZCApCisgICAgeworICAgICAgICBSZWFkQmxvY2soKTsKKyAgICAgICAgY3VycmVudCA9ICh1bG9uZyopbV9jdXJyZW50OworICAgIH0KKyAgICBtX2JpdF9pZHggPSBiaXRfaWR4ICY9IDMxOworICAgIHJldHVybiAoKChjdXJyZW50Wy0xXSA8PCAtYml0X2lkeCkgJiBtYXNrKXwKKyAgICAgICAgICAgICAoY3VycmVudFswXSA+PiBiaXRfaWR4KSkgJiBic19iaXRfbWFza1tiaXRzXTsKK30KKworCitpbnQgIFJNQml0U3RyZWFtOjpTaG93KCBpbnQgYml0cyApCit7CisgICAgaW50ICAgIGJpdF9pZHggPSBtX2JpdF9pZHggLSBiaXRzOworICAgIGludCAgICBtYXNrICAgID0gYml0X2lkeCA+PiAzMTsKKyAgICB1bG9uZyogY3VycmVudCA9ICgodWxvbmcqKW1fY3VycmVudCkgLSBtYXNrOworCisgICAgYXNzZXJ0KCAodW5zaWduZWQpYml0cyA8IDMyICk7CisKKyAgICBpZiggKCh1Y2hhciopY3VycmVudCkgPj0gbV9lbmQgKQorICAgIHsKKyAgICAgICAgbV9jdXJyZW50ID0gKHVjaGFyKiljdXJyZW50OworICAgICAgICBSZWFkQmxvY2soKTsKKyAgICAgICAgY3VycmVudCA9ICh1bG9uZyopbV9jdXJyZW50OworICAgICAgICBtX2N1cnJlbnQgLT0gNDsKKyAgICB9CisgICAgcmV0dXJuICgoKGN1cnJlbnRbLTFdPDwtYml0X2lkeCkgJiBtYXNrKXwKKyAgICAgICAgICAgICAoY3VycmVudFswXSA+PiBiaXRfaWR4KSkgJiBic19iaXRfbWFza1tiaXRzXTsKK30KKworCitpbnQgIFJNQml0U3RyZWFtOjpHZXRIdWZmKCBjb25zdCBzaG9ydCogdGFibGUgKQoreworICAgIGludCAgdmFsOworICAgIGludCAgY29kZV9iaXRzOworCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgaW50IHRhYmxlX2JpdHMgPSB0YWJsZVswXTsKKyAgICAgICAgdmFsID0gdGFibGVbU2hvdyh0YWJsZV9iaXRzKSArIDFdOworICAgICAgICBjb2RlX2JpdHMgPSB2YWwgJiAxNTsKKyAgICAgICAgdmFsID4+PSA0OworCisgICAgICAgIGlmKCBjb2RlX2JpdHMgIT0gMCApIGJyZWFrOworICAgICAgICB0YWJsZSArPSB2YWw7CisgICAgICAgIE1vdmUoIHRhYmxlX2JpdHMgKTsKKyAgICB9CisKKyAgICBNb3ZlKCBjb2RlX2JpdHMgKTsKKyAgICBpZiggdmFsID09IFJCU19IVUZGX0ZPUkIgKQorICAgIHsKKyAgICAgICAgaWYoIG1fam1wX3NldCApCisgICAgICAgICAgICBsb25nam1wKCBtX2ptcF9idWYsIFJCU19USFJPV19GT1JCICk7CisgICAgfQorCisgICAgcmV0dXJuIHZhbDsKK30KKworCit2b2lkICBSTUJpdFN0cmVhbTo6TW92ZSggaW50IHNoaWZ0ICkKK3sKKyAgICBpbnQgbmV3X2JpdF9pZHggPSBtX2JpdF9pZHggLSBzaGlmdDsKKyAgICBtX2N1cnJlbnQgLT0gKG5ld19iaXRfaWR4ID4+IDUpPDwyOworICAgIG1fYml0X2lkeCAgPSBuZXdfYml0X2lkeCAmIDMxOworfQorCisKK3ZvaWQgIFJNQml0U3RyZWFtOjpTa2lwKCBpbnQgYnl0ZXMgKQoreworICAgIE1vdmUoIGJ5dGVzKjggKTsKK30KKworCitzdGF0aWMgY29uc3QgaW50IGh1ZmZfdmFsX3NoaWZ0ID0gMjAsIGh1ZmZfY29kZV9tYXNrID0gKDEgPDwgaHVmZl92YWxfc2hpZnQpIC0gMTsKKworYm9vbCBic0NyZWF0ZURlY29kZUh1ZmZtYW5UYWJsZSggY29uc3QgaW50KiBzcmMsIHNob3J0KiB0YWJsZSwgaW50IG1heF9zaXplICkKK3sgICAKKyAgICBjb25zdCBpbnQgZm9yYmlkZGVuX2VudHJ5ID0gKFJCU19IVUZGX0ZPUkIgPDwgNCl8MTsKKyAgICBpbnQgICAgICAgZmlyc3RfYml0cyA9IHNyY1swXTsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIGludCBiaXRzOworICAgICAgICBpbnQgb2Zmc2V0OworICAgIH0KKyAgICBzdWJfdGFibGVzWzEgPDwgMTFdOworICAgIGludCAgc2l6ZSA9ICgxIDw8IGZpcnN0X2JpdHMpICsgMTsKKyAgICBpbnQgIGksIGs7CisgICAgCisgICAgLyogY2FsYyBiaXQgZGVwdGhzIG9mIHN1YiB0YWJsZXMgKi8KKyAgICBtZW1zZXQoIHN1Yl90YWJsZXMsIDAsICgoc2l6ZV90KTEgPDwgZmlyc3RfYml0cykqc2l6ZW9mKHN1Yl90YWJsZXNbMF0pICk7CisgICAgZm9yKCBpID0gMSwgayA9IDE7IHNyY1trXSA+PSAwOyBpKysgKQorICAgIHsKKyAgICAgICAgaW50IGNvZGVfY291bnQgPSBzcmNbaysrXTsKKyAgICAgICAgaW50IHNiID0gaSAtIGZpcnN0X2JpdHM7CisgICAgICAgIAorICAgICAgICBpZiggc2IgPD0gMCApCisgICAgICAgICAgICBrICs9IGNvZGVfY291bnQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggY29kZV9jb3VudCArPSBrOyBrIDwgY29kZV9jb3VudDsgaysrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgIGNvZGUgPSBzcmNba10gJiBodWZmX2NvZGVfbWFzazsKKyAgICAgICAgICAgICAgICBzdWJfdGFibGVzW2NvZGUgPj4gc2JdLmJpdHMgPSBzYjsKKyAgICAgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBjYWxjIG9mZnNldHMgb2Ygc3ViIHRhYmxlcyBhbmQgd2hvbGUgc2l6ZSBvZiB0YWJsZSAqLworICAgIGZvciggaSA9IDA7IGkgPCAoMSA8PCBmaXJzdF9iaXRzKTsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBiID0gc3ViX3RhYmxlc1tpXS5iaXRzOworICAgICAgICBpZiggYiA+IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBiID0gMSA8PCBiOworICAgICAgICAgICAgc3ViX3RhYmxlc1tpXS5vZmZzZXQgPSBzaXplOworICAgICAgICAgICAgc2l6ZSArPSBiICsgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzaXplID4gbWF4X3NpemUgKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogZmlsbCBmaXJzdCB0YWJsZSBhbmQgc3VidGFibGVzIHdpdGggZm9yYmlkZGVuIHZhbHVlcyAqLworICAgIGZvciggaSA9IDA7IGkgPCBzaXplOyBpKysgKQorICAgIHsKKyAgICAgICAgdGFibGVbaV0gPSAoc2hvcnQpZm9yYmlkZGVuX2VudHJ5OworICAgIH0KKworICAgIC8qIHdyaXRlIGhlYWRlciBvZiBmaXJzdCB0YWJsZSAqLworICAgIHRhYmxlWzBdID0gKHNob3J0KWZpcnN0X2JpdHM7CisKKyAgICAvKiBmaWxsIGZpcnN0IHRhYmxlIGFuZCBzdWIgdGFibGVzICovIAorICAgIGZvciggaSA9IDEsIGsgPSAxOyBzcmNba10gPj0gMDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBjb2RlX2NvdW50ID0gc3JjW2srK107CisgICAgICAgIGZvciggY29kZV9jb3VudCArPSBrOyBrIDwgY29kZV9jb3VudDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICB0YWJsZV9iaXRzPSBmaXJzdF9iaXRzOworICAgICAgICAgICAgaW50ICBjb2RlX2JpdHMgPSBpOworICAgICAgICAgICAgaW50ICBjb2RlID0gc3JjW2tdICYgaHVmZl9jb2RlX21hc2s7CisgICAgICAgICAgICBpbnQgIHZhbCAgPSBzcmNba10gPj5odWZmX3ZhbF9zaGlmdDsKKyAgICAgICAgICAgIGludCAgaiwgb2Zmc2V0ID0gMDsKKworICAgICAgICAgICAgaWYoIGNvZGVfYml0cyA+IHRhYmxlX2JpdHMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBpZHggPSBjb2RlID4+IChjb2RlX2JpdHMgLT0gdGFibGVfYml0cyk7CisgICAgICAgICAgICAgICAgY29kZSAmPSAoMSA8PCBjb2RlX2JpdHMpIC0gMTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgICA9IHN1Yl90YWJsZXNbaWR4XS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgdGFibGVfYml0cz0gc3ViX3RhYmxlc1tpZHhdLmJpdHM7CisgICAgICAgICAgICAgICAgLyogd3JpdGUgaGVhZGVyIG9mIHN1YnRhYmxlICovCisgICAgICAgICAgICAgICAgdGFibGVbb2Zmc2V0XSAgPSAoc2hvcnQpdGFibGVfYml0czsKKyAgICAgICAgICAgICAgICAvKiB3cml0ZSBqdW1wIHRvIHN1YnRhYmxlICovCisgICAgICAgICAgICAgICAgdGFibGVbaWR4ICsgMV09IChzaG9ydCkob2Zmc2V0IDw8IDQpOworICAgICAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgICAgIHRhYmxlX2JpdHMgLT0gY29kZV9iaXRzOworICAgICAgICAgICAgYXNzZXJ0KCB0YWJsZV9iaXRzID49IDAgKTsKKyAgICAgICAgICAgIHZhbCA9ICh2YWwgPDwgNCkgfCBjb2RlX2JpdHM7CisgICAgICAgICAgICBvZmZzZXQgKz0gKGNvZGUgPDwgdGFibGVfYml0cykgKyAxOworICAgICAgICAKKyAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCAoMSA8PCB0YWJsZV9iaXRzKTsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQoIHRhYmxlW29mZnNldCArIGpdID09IGZvcmJpZGRlbl9lbnRyeSApOworICAgICAgICAgICAgICAgIHRhYmxlWyBvZmZzZXQgKyBqIF0gPSAoc2hvcnQpdmFsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisKK2ludCogIGJzQ3JlYXRlU291cmNlSHVmZm1hblRhYmxlKCBjb25zdCB1Y2hhciogc3JjLCBpbnQqIGRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2JpdHMsIGludCBmaXJzdF9iaXRzICkKK3sKKyAgICBpbnQgICBpLCB2YWxfaWR4LCBjb2RlID0gMDsKKyAgICBpbnQqICB0YWJsZSA9IGRzdDsKKyAgICAqZHN0KysgPSBmaXJzdF9iaXRzOworICAgIGZvciggaSA9IDEsIHZhbF9pZHggPSBtYXhfYml0czsgaSA8PSBtYXhfYml0czsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBjb2RlX2NvdW50ID0gc3JjW2kgLSAxXTsKKyAgICAgICAgZHN0WzBdID0gY29kZV9jb3VudDsKKyAgICAgICAgY29kZSA8PD0gMTsKKyAgICAgICAgZm9yKCBpbnQgayA9IDA7IGsgPCBjb2RlX2NvdW50OyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbayArIDFdID0gKHNyY1t2YWxfaWR4ICsga10gPDwgaHVmZl92YWxfc2hpZnQpfChjb2RlICsgayk7CisgICAgICAgIH0KKyAgICAgICAgY29kZSArPSBjb2RlX2NvdW50OworICAgICAgICBkc3QgKz0gY29kZV9jb3VudCArIDE7CisgICAgICAgIHZhbF9pZHggKz0gY29kZV9jb3VudDsKKyAgICB9CisgICAgZHN0WzBdID0gLTE7CisgICAgcmV0dXJuICB0YWJsZTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gV0Jhc2VTdHJlYW0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKy8vIFdCYXNlU3RyZWFtIC0gYmFzZSBjbGFzcyBmb3Igb3V0cHV0IHN0cmVhbXMKK1dCYXNlU3RyZWFtOjpXQmFzZVN0cmVhbSgpCit7CisgICAgbV9zdGFydCA9IG1fZW5kID0gbV9jdXJyZW50ID0gMDsKKyAgICBtX2ZpbGUgPSAwOworICAgIG1fYmxvY2tfc2l6ZSA9IEJTX0RFRl9CTE9DS19TSVpFOworICAgIG1faXNfb3BlbmVkID0gZmFsc2U7Cit9CisKKworV0Jhc2VTdHJlYW06On5XQmFzZVN0cmVhbSgpCit7CisgICAgQ2xvc2UoKTsgICAgLy8gQ2xvc2UgZmlsZXMKKyAgICBSZWxlYXNlKCk7ICAvLyBmcmVlICBidWZmZXJzCit9CisKKworYm9vbCAgV0Jhc2VTdHJlYW06OklzT3BlbmVkKCkKK3sgCisgICAgcmV0dXJuIG1faXNfb3BlbmVkOworfQorCisKK3ZvaWQgIFdCYXNlU3RyZWFtOjpBbGxvY2F0ZSgpCit7CisgICAgaWYoICFtX3N0YXJ0ICkKKyAgICAgICAgbV9zdGFydCA9IG5ldyB1Y2hhclttX2Jsb2NrX3NpemVdOworCisgICAgbV9lbmQgPSBtX3N0YXJ0ICsgbV9ibG9ja19zaXplOworICAgIG1fY3VycmVudCA9IG1fc3RhcnQ7Cit9CisKKwordm9pZCAgV0Jhc2VTdHJlYW06OldyaXRlQmxvY2soKQoreworICAgIGludCBzaXplID0gKGludCkobV9jdXJyZW50IC0gbV9zdGFydCk7CisgICAgYXNzZXJ0KCBtX2ZpbGUgIT0gMCApOworCisgICAgLy9mc2VlayggbV9maWxlLCBtX2Jsb2NrX3BvcywgU0VFS19TRVQgKTsKKyAgICBmd3JpdGUoIG1fc3RhcnQsIDEsIHNpemUsIG1fZmlsZSApOworICAgIG1fY3VycmVudCA9IG1fc3RhcnQ7CisKKyAgICAvKmlmKCB3cml0dGVuIDwgc2l6ZSApIHRocm93IFJCU19USFJPV19FT1M7Ki8KKyAgICAKKyAgICBtX2Jsb2NrX3BvcyArPSBzaXplOworfQorCisKK2Jvb2wgIFdCYXNlU3RyZWFtOjpPcGVuKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgQ2xvc2UoKTsKKyAgICBBbGxvY2F0ZSgpOworICAgIAorICAgIG1fZmlsZSA9IGZvcGVuKCBmaWxlbmFtZSwgIndiIiApOworICAgIAorICAgIGlmKCBtX2ZpbGUgKQorICAgIHsKKyAgICAgICAgbV9pc19vcGVuZWQgPSB0cnVlOworICAgICAgICBtX2Jsb2NrX3BvcyA9IDA7CisgICAgICAgIG1fY3VycmVudCA9IG1fc3RhcnQ7CisgICAgfQorICAgIHJldHVybiBtX2ZpbGUgIT0gMDsKK30KKworCit2b2lkICBXQmFzZVN0cmVhbTo6Q2xvc2UoKQoreworICAgIGlmKCBtX2ZpbGUgKQorICAgIHsKKyAgICAgICAgV3JpdGVCbG9jaygpOworICAgICAgICBmY2xvc2UoIG1fZmlsZSApOworICAgICAgICBtX2ZpbGUgPSAwOworICAgIH0KKyAgICBtX2lzX29wZW5lZCA9IGZhbHNlOworfQorCisKK3ZvaWQgIFdCYXNlU3RyZWFtOjpSZWxlYXNlKCkKK3sKKyAgICBpZiggbV9zdGFydCApCisgICAgeworICAgICAgICBkZWxldGVbXSBtX3N0YXJ0OworICAgIH0KKyAgICBtX3N0YXJ0ID0gbV9lbmQgPSBtX2N1cnJlbnQgPSAwOworfQorCisKK3ZvaWQgIFdCYXNlU3RyZWFtOjpTZXRCbG9ja1NpemUoIGludCBibG9ja19zaXplICkKK3sKKyAgICBhc3NlcnQoIGJsb2NrX3NpemUgPiAwICYmIChibG9ja19zaXplICYgKGJsb2NrX3NpemUtMSkpID09IDAgKTsKKworICAgIGlmKCBtX3N0YXJ0ICYmIGJsb2NrX3NpemUgPT0gbV9ibG9ja19zaXplICkgcmV0dXJuOworICAgIFJlbGVhc2UoKTsKKyAgICBtX2Jsb2NrX3NpemUgPSBibG9ja19zaXplOworICAgIEFsbG9jYXRlKCk7Cit9CisKKworaW50ICBXQmFzZVN0cmVhbTo6R2V0UG9zKCkKK3sKKyAgICBhc3NlcnQoIElzT3BlbmVkKCkgKTsKKyAgICByZXR1cm4gbV9ibG9ja19wb3MgKyAoaW50KShtX2N1cnJlbnQgLSBtX3N0YXJ0KTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBXTEJ5dGVTdHJlYW0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gCisKK1dMQnl0ZVN0cmVhbTo6fldMQnl0ZVN0cmVhbSgpCit7Cit9CisKK3ZvaWQgV0xCeXRlU3RyZWFtOjpQdXRCeXRlKCBpbnQgdmFsICkKK3sKKyAgICAqbV9jdXJyZW50KysgPSAodWNoYXIpdmFsOworICAgIGlmKCBtX2N1cnJlbnQgPj0gbV9lbmQgKQorICAgICAgICBXcml0ZUJsb2NrKCk7Cit9CisKKwordm9pZCBXTEJ5dGVTdHJlYW06OlB1dEJ5dGVzKCBjb25zdCB2b2lkKiBidWZmZXIsIGludCBjb3VudCApCit7CisgICAgdWNoYXIqIGRhdGEgPSAodWNoYXIqKWJ1ZmZlcjsKKyAgICAKKyAgICBhc3NlcnQoIGRhdGEgJiYgbV9jdXJyZW50ICYmIGNvdW50ID49IDAgKTsKKworICAgIHdoaWxlKCBjb3VudCApCisgICAgeworICAgICAgICBpbnQgbCA9IChpbnQpKG1fZW5kIC0gbV9jdXJyZW50KTsKKyAgICAgICAgCisgICAgICAgIGlmKCBsID4gY291bnQgKQorICAgICAgICAgICAgbCA9IGNvdW50OworICAgICAgICAKKyAgICAgICAgaWYoIGwgPiAwICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCBtX2N1cnJlbnQsIGRhdGEsIGwgKTsKKyAgICAgICAgICAgIG1fY3VycmVudCArPSBsOworICAgICAgICAgICAgZGF0YSArPSBsOworICAgICAgICAgICAgY291bnQgLT0gbDsKKyAgICAgICAgfQorICAgICAgICBpZiggbV9jdXJyZW50ID09IG1fZW5kICkKKyAgICAgICAgICAgIFdyaXRlQmxvY2soKTsKKyAgICB9Cit9CisKKwordm9pZCBXTEJ5dGVTdHJlYW06OlB1dFdvcmQoIGludCB2YWwgKQoreworICAgIHVjaGFyICpjdXJyZW50ID0gbV9jdXJyZW50OworCisgICAgaWYoIGN1cnJlbnQrMSA8IG1fZW5kICkKKyAgICB7CisgICAgICAgIGN1cnJlbnRbMF0gPSAodWNoYXIpdmFsOworICAgICAgICBjdXJyZW50WzFdID0gKHVjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgIG1fY3VycmVudCA9IGN1cnJlbnQgKyAyOworICAgICAgICBpZiggbV9jdXJyZW50ID09IG1fZW5kICkKKyAgICAgICAgICAgIFdyaXRlQmxvY2soKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHV0Qnl0ZSh2YWwpOworICAgICAgICBQdXRCeXRlKHZhbCA+PiA4KTsKKyAgICB9Cit9CisKKwordm9pZCBXTEJ5dGVTdHJlYW06OlB1dERXb3JkKCBpbnQgdmFsICkKK3sKKyAgICB1Y2hhciAqY3VycmVudCA9IG1fY3VycmVudDsKKworICAgIGlmKCBjdXJyZW50KzMgPCBtX2VuZCApCisgICAgeworICAgICAgICBjdXJyZW50WzBdID0gKHVjaGFyKXZhbDsKKyAgICAgICAgY3VycmVudFsxXSA9ICh1Y2hhcikodmFsID4+IDgpOworICAgICAgICBjdXJyZW50WzJdID0gKHVjaGFyKSh2YWwgPj4gMTYpOworICAgICAgICBjdXJyZW50WzNdID0gKHVjaGFyKSh2YWwgPj4gMjQpOworICAgICAgICBtX2N1cnJlbnQgPSBjdXJyZW50ICsgNDsKKyAgICAgICAgaWYoIG1fY3VycmVudCA9PSBtX2VuZCApCisgICAgICAgICAgICBXcml0ZUJsb2NrKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB1dEJ5dGUodmFsKTsKKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gOCk7CisgICAgICAgIFB1dEJ5dGUodmFsID4+IDE2KTsKKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gMjQpOworICAgIH0KK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBXTUJ5dGVTdHJlYW0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gCisKK1dNQnl0ZVN0cmVhbTo6fldNQnl0ZVN0cmVhbSgpCit7Cit9CisKKwordm9pZCBXTUJ5dGVTdHJlYW06OlB1dFdvcmQoIGludCB2YWwgKQoreworICAgIHVjaGFyICpjdXJyZW50ID0gbV9jdXJyZW50OworCisgICAgaWYoIGN1cnJlbnQrMSA8IG1fZW5kICkKKyAgICB7CisgICAgICAgIGN1cnJlbnRbMF0gPSAodWNoYXIpKHZhbCA+PiA4KTsKKyAgICAgICAgY3VycmVudFsxXSA9ICh1Y2hhcil2YWw7CisgICAgICAgIG1fY3VycmVudCA9IGN1cnJlbnQgKyAyOworICAgICAgICBpZiggbV9jdXJyZW50ID09IG1fZW5kICkKKyAgICAgICAgICAgIFdyaXRlQmxvY2soKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gOCk7CisgICAgICAgIFB1dEJ5dGUodmFsKTsKKyAgICB9Cit9CisKKwordm9pZCBXTUJ5dGVTdHJlYW06OlB1dERXb3JkKCBpbnQgdmFsICkKK3sKKyAgICB1Y2hhciAqY3VycmVudCA9IG1fY3VycmVudDsKKworICAgIGlmKCBjdXJyZW50KzMgPCBtX2VuZCApCisgICAgeworICAgICAgICBjdXJyZW50WzBdID0gKHVjaGFyKSh2YWwgPj4gMjQpOworICAgICAgICBjdXJyZW50WzFdID0gKHVjaGFyKSh2YWwgPj4gMTYpOworICAgICAgICBjdXJyZW50WzJdID0gKHVjaGFyKSh2YWwgPj4gOCk7CisgICAgICAgIGN1cnJlbnRbM10gPSAodWNoYXIpdmFsOworICAgICAgICBtX2N1cnJlbnQgPSBjdXJyZW50ICsgNDsKKyAgICAgICAgaWYoIG1fY3VycmVudCA9PSBtX2VuZCApCisgICAgICAgICAgICBXcml0ZUJsb2NrKCk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFB1dEJ5dGUodmFsID4+IDI0KTsKKyAgICAgICAgUHV0Qnl0ZSh2YWwgPj4gMTYpOworICAgICAgICBQdXRCeXRlKHZhbCA+PiA4KTsKKyAgICAgICAgUHV0Qnl0ZSh2YWwpOworICAgIH0KK30KKworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFdNQml0U3RyZWFtIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIAorCitXTUJpdFN0cmVhbTo6V01CaXRTdHJlYW0oKQoreworICAgIG1fcGFkX3ZhbCA9IDA7CisgICAgUmVzZXRCdWZmZXIoKTsKK30KKworCitXTUJpdFN0cmVhbTo6fldNQml0U3RyZWFtKCkKK3sKK30KKworCitib29sICBXTUJpdFN0cmVhbTo6T3BlbiggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIFJlc2V0QnVmZmVyKCk7CisgICAgcmV0dXJuIFdCYXNlU3RyZWFtOjpPcGVuKCBmaWxlbmFtZSApOworfQorCisKK3ZvaWQgIFdNQml0U3RyZWFtOjpSZXNldEJ1ZmZlcigpCit7CisgICAgbV92YWwgPSAwOworICAgIG1fYml0X2lkeCA9IDMyOworICAgIG1fY3VycmVudCA9IG1fc3RhcnQ7Cit9CisKK3ZvaWQgIFdNQml0U3RyZWFtOjpGbHVzaCgpCit7CisgICAgaWYoIG1fYml0X2lkeCA8IDMyICkKKyAgICB7CisgICAgICAgIFB1dCggbV9wYWRfdmFsLCBtX2JpdF9pZHggJiA3ICk7CisgICAgICAgICooKHVsb25nKiYpbV9jdXJyZW50KSsrID0gbV92YWw7CisgICAgfQorfQorCisKK3ZvaWQgIFdNQml0U3RyZWFtOjpDbG9zZSgpCit7CisgICAgaWYoIG1faXNfb3BlbmVkICkKKyAgICB7CisgICAgICAgIEZsdXNoKCk7CisgICAgICAgIFdCYXNlU3RyZWFtOjpDbG9zZSgpOworICAgIH0KK30KKworCit2b2lkICBXTUJpdFN0cmVhbTo6V3JpdGVCbG9jaygpCit7CisgICAgaWYoICFic0lzQmlnRW5kaWFuKCkgKQorICAgICAgICBic0JTd2FwQmxvY2soIG1fc3RhcnQsIG1fY3VycmVudCApOworICAgIFdCYXNlU3RyZWFtOjpXcml0ZUJsb2NrKCk7Cit9CisKKworaW50ICBXTUJpdFN0cmVhbTo6R2V0UG9zKCkKK3sKKyAgICByZXR1cm4gV0Jhc2VTdHJlYW06OkdldFBvcygpICsgKCgzMiAtIG1fYml0X2lkeCkgPj4gMyk7Cit9CisKKwordm9pZCAgV01CaXRTdHJlYW06OlB1dCggaW50IHZhbCwgaW50IGJpdHMgKQoreworICAgIGludCAgYml0X2lkeCA9IG1fYml0X2lkeCAtIGJpdHM7CisgICAgdWxvbmcgIGN1cnZhbCA9IG1fdmFsOworCisgICAgYXNzZXJ0KCAwIDw9IGJpdHMgJiYgYml0cyA8IDMyICk7CisKKyAgICB2YWwgJj0gYnNfYml0X21hc2tbYml0c107CisKKyAgICBpZiggYml0X2lkeCA+PSAwICkKKyAgICB7CisgICAgICAgIGN1cnZhbCB8PSB2YWwgPDwgYml0X2lkeDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKigodWxvbmcqJiltX2N1cnJlbnQpKysgPSBjdXJ2YWwgfCAoKHVuc2lnbmVkKXZhbCA+PiAtYml0X2lkeCk7CisgICAgICAgIGlmKCBtX2N1cnJlbnQgPj0gbV9lbmQgKQorICAgICAgICB7CisgICAgICAgICAgICBXcml0ZUJsb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgYml0X2lkeCArPSAzMjsKKyAgICAgICAgY3VydmFsID0gdmFsIDw8IGJpdF9pZHg7CisgICAgfQorCisgICAgbV92YWwgPSBjdXJ2YWw7CisgICAgbV9iaXRfaWR4ID0gYml0X2lkeDsKK30KKworCit2b2lkICBXTUJpdFN0cmVhbTo6UHV0SHVmZiggaW50IHZhbCwgY29uc3QgdWxvbmcqIHRhYmxlICkKK3sKKyAgICBpbnQgbWluX3ZhbCA9IChpbnQpdGFibGVbMF07CisgICAgdmFsIC09IG1pbl92YWw7CisgICAgCisgICAgYXNzZXJ0KCAodW5zaWduZWQpdmFsIDwgdGFibGVbMV0gKTsKKworICAgIHVsb25nIGNvZGUgPSB0YWJsZVt2YWwgKyAyXTsKKyAgICBhc3NlcnQoIGNvZGUgIT0gMCApOworICAgIAorICAgIFB1dCggY29kZSA+PiA4LCBjb2RlICYgMjU1ICk7Cit9CisKKworYm9vbCBic0NyZWF0ZUVuY29kZUh1ZmZtYW5UYWJsZSggY29uc3QgaW50KiBzcmMsIHVsb25nKiB0YWJsZSwgaW50IG1heF9zaXplICkKK3sgICAKKyAgICBpbnQgIGksIGs7CisgICAgaW50ICBtaW5fdmFsID0gSU5UX01BWCwgbWF4X3ZhbCA9IElOVF9NSU47CisgICAgaW50ICBzaXplOworICAgIAorICAgIC8qIGNhbGMgbWluIGFuZCBtYXggdmFsdWVzIGluIHRoZSB0YWJsZSAqLworICAgIGZvciggaSA9IDEsIGsgPSAxOyBzcmNba10gPj0gMDsgaSsrICkKKyAgICB7CisgICAgICAgIGludCBjb2RlX2NvdW50ID0gc3JjW2srK107CisKKyAgICAgICAgZm9yKCBjb2RlX2NvdW50ICs9IGs7IGsgPCBjb2RlX2NvdW50OyBrKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgIHZhbCA9IHNyY1trXSA+PiBodWZmX3ZhbF9zaGlmdDsKKyAgICAgICAgICAgIGlmKCB2YWwgPCBtaW5fdmFsICkKKyAgICAgICAgICAgICAgICBtaW5fdmFsID0gdmFsOworICAgICAgICAgICAgaWYoIHZhbCA+IG1heF92YWwgKQorICAgICAgICAgICAgICAgIG1heF92YWwgPSB2YWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplID0gbWF4X3ZhbCAtIG1pbl92YWwgKyAzOworCisgICAgaWYoIHNpemUgPiBtYXhfc2l6ZSApCisgICAgeworICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZW1zZXQoIHRhYmxlLCAwLCBzaXplKnNpemVvZih0YWJsZVswXSkpOworCisgICAgdGFibGVbMF0gPSBtaW5fdmFsOworICAgIHRhYmxlWzFdID0gc2l6ZSAtIDI7CisKKyAgICBmb3IoIGkgPSAxLCBrID0gMTsgc3JjW2tdID49IDA7IGkrKyApCisgICAgeworICAgICAgICBpbnQgY29kZV9jb3VudCA9IHNyY1trKytdOworCisgICAgICAgIGZvciggY29kZV9jb3VudCArPSBrOyBrIDwgY29kZV9jb3VudDsgaysrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50ICB2YWwgPSBzcmNba10gPj4gaHVmZl92YWxfc2hpZnQ7CisgICAgICAgICAgICBpbnQgIGNvZGUgPSBzcmNba10gJiBodWZmX2NvZGVfbWFzazsKKworICAgICAgICAgICAgdGFibGVbdmFsIC0gbWluX3ZhbCArIDJdID0gKGNvZGUgPDwgOCkgfCBpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9iaXRzdHJtLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9iaXRzdHJtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkZDc1OQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2JpdHN0cm0uaApAQCAtMCwwICsxLDI3MiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0JJVFNUUk1fSF8KKyNkZWZpbmUgX0JJVFNUUk1fSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c2V0am1wLmg+CisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0NzExIDQzMjQgKQorI2VuZGlmCisKKyNkZWZpbmUgIFJCU19USFJPV19FT1MgICAgLTEyMyAgLyogPGVuZCBvZiBzdHJlYW0+IGV4Y2VwdGlvbiBjb2RlICovCisjZGVmaW5lICBSQlNfVEhST1dfRk9SQiAgIC0xMjQgIC8qIDxmb3JyYmlkZGVuIGh1ZmZtYW4gY29kZT4gZXhjZXB0aW9uIGNvZGUgKi8KKyNkZWZpbmUgIFJCU19IVUZGX0ZPUkIgICAgMjA0NyAgLyogZm9ycmJpZGRlbiBodWZmbWFuIGNvZGUgInZhbHVlIiAqLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgdWxvbmc7CisKKy8vIGNsYXNzIFJCYXNlU3RyZWFtIC0gYmFzZSBjbGFzcyBmb3Igb3RoZXIgcmVhZGluZyBzdHJlYW1zLgorY2xhc3MgUkJhc2VTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICAvL21ldGhvZHMKKyAgICBSQmFzZVN0cmVhbSgpOworICAgIHZpcnR1YWwgflJCYXNlU3RyZWFtKCk7CisgICAgCisgICAgdmlydHVhbCBib29sICBPcGVuKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIHZpcnR1YWwgdm9pZCAgQ2xvc2UoKTsKKyAgICB2b2lkICAgICAgICAgIFNldEJsb2NrU2l6ZSggaW50IGJsb2NrX3NpemUsIGludCB1bkdldHNpemUgPSA0ICk7CisgICAgYm9vbCAgICAgICAgICBJc09wZW5lZCgpOworICAgIHZvaWQgICAgICAgICAgU2V0UG9zKCBpbnQgcG9zICk7CisgICAgaW50ICAgICAgICAgICBHZXRQb3MoKTsKKyAgICB2b2lkICAgICAgICAgIFNraXAoIGludCBieXRlcyApOworICAgIGptcF9idWYmICAgICAgSm1wQnVmKCk7CisgICAgCitwcm90ZWN0ZWQ6CisgICAgCisgICAgam1wX2J1ZiBtX2ptcF9idWY7CisgICAgdWNoYXIqICBtX3N0YXJ0OworICAgIHVjaGFyKiAgbV9lbmQ7CisgICAgdWNoYXIqICBtX2N1cnJlbnQ7CisgICAgRklMRSogICBtX2ZpbGU7CisgICAgaW50ICAgICBtX3VuR2V0c2l6ZTsKKyAgICBpbnQgICAgIG1fYmxvY2tfc2l6ZTsKKyAgICBpbnQgICAgIG1fYmxvY2tfcG9zOworICAgIGJvb2wgICAgbV9qbXBfc2V0OworICAgIGJvb2wgICAgbV9pc19vcGVuZWQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgIFJlYWRCbG9jaygpOworICAgIHZpcnR1YWwgdm9pZCAgUmVsZWFzZSgpOworICAgIHZpcnR1YWwgdm9pZCAgQWxsb2NhdGUoKTsKK307CisKKworLy8gY2xhc3MgUkxCeXRlU3RyZWFtIC0gdWNoYXItb3JpZW50ZWQgc3RyZWFtLgorLy8gbCBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdWNoYXIgb2YgYSBtdWx0aS11Y2hhciB2YWx1ZSBnb2VzIGZpcnN0CitjbGFzcyBSTEJ5dGVTdHJlYW0gOiBwdWJsaWMgUkJhc2VTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5STEJ5dGVTdHJlYW0oKTsKKyAgICAKKyAgICBpbnQgICAgIEdldEJ5dGUoKTsKKyAgICB2b2lkICAgIEdldEJ5dGVzKCB2b2lkKiBidWZmZXIsIGludCBjb3VudCwgaW50KiByZWFkZWQgPSAwICk7CisgICAgaW50ICAgICBHZXRXb3JkKCk7CisgICAgaW50ICAgICBHZXREV29yZCgpOyAKK307CisKKy8vIGNsYXNzIFJNQml0U3RyZWFtIC0gdWNoYXItb3JpZW50ZWQgc3RyZWFtLgorLy8gbSBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbW9zdCBzaWduaWZpY2FudCB1Y2hhciBvZiBhIG11bHRpLXVjaGFyIHZhbHVlIGdvIGZpcnN0CitjbGFzcyBSTUJ5dGVTdHJlYW0gOiBwdWJsaWMgUkxCeXRlU3RyZWFtCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Uk1CeXRlU3RyZWFtKCk7CisKKyAgICBpbnQgICAgIEdldFdvcmQoKTsKKyAgICBpbnQgICAgIEdldERXb3JkKCk7IAorfTsKKworLy8gY2xhc3MgUkxCaXRTdHJlYW0gLSBiaXQtb3JpZW50ZWQgc3RyZWFtLgorLy8gbCBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGEgbXVsdGktYml0IHZhbHVlIGdvZXMgZmlyc3QKK2NsYXNzIFJMQml0U3RyZWFtIDogcHVibGljIFJCYXNlU3RyZWFtCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+UkxCaXRTdHJlYW0oKTsKKyAgICAKKyAgICB2b2lkICAgIFNldFBvcyggaW50IHBvcyApOworICAgIGludCAgICAgR2V0UG9zKCk7CisgICAgaW50ICAgICBHZXQoIGludCBiaXRzICk7CisgICAgaW50ICAgICBTaG93KCBpbnQgYml0cyApOworICAgIGludCAgICAgR2V0SHVmZiggY29uc3Qgc2hvcnQqIHRhYmxlICk7CisgICAgdm9pZCAgICBNb3ZlKCBpbnQgc2hpZnQgKTsKKyAgICB2b2lkICAgIFNraXAoIGludCBieXRlcyApOworICAgICAgICAKK3Byb3RlY3RlZDoKKyAgICBpbnQgICAgIG1fYml0X2lkeDsKKyAgICB2aXJ0dWFsIHZvaWQgIFJlYWRCbG9jaygpOworfTsKKworLy8gY2xhc3MgUk1CaXRTdHJlYW0gLSBiaXQtb3JpZW50ZWQgc3RyZWFtLgorLy8gbSBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgb2YgYSBtdWx0aS1iaXQgdmFsdWUgZ29lcyBmaXJzdAorY2xhc3MgUk1CaXRTdHJlYW0gOiBwdWJsaWMgUkxCaXRTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5STUJpdFN0cmVhbSgpOworICAgIAorICAgIHZvaWQgICAgU2V0UG9zKCBpbnQgcG9zICk7CisgICAgaW50ICAgICBHZXRQb3MoKTsKKyAgICBpbnQgICAgIEdldCggaW50IGJpdHMgKTsKKyAgICBpbnQgICAgIFNob3coIGludCBiaXRzICk7CisgICAgaW50ICAgICBHZXRIdWZmKCBjb25zdCBzaG9ydCogdGFibGUgKTsKKyAgICB2b2lkICAgIE1vdmUoIGludCBzaGlmdCApOworICAgIHZvaWQgICAgU2tpcCggaW50IGJ5dGVzICk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgIFJlYWRCbG9jaygpOworfTsKKworCisvLyBXQmFzZVN0cmVhbSAtIGJhc2UgY2xhc3MgZm9yIG91dHB1dCBzdHJlYW1zCitjbGFzcyBXQmFzZVN0cmVhbQoreworcHVibGljOgorICAgIC8vbWV0aG9kcworICAgIFdCYXNlU3RyZWFtKCk7CisgICAgdmlydHVhbCB+V0Jhc2VTdHJlYW0oKTsKKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgIE9wZW4oIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgdmlydHVhbCB2b2lkICBDbG9zZSgpOworICAgIHZvaWQgICAgICAgICAgU2V0QmxvY2tTaXplKCBpbnQgYmxvY2tfc2l6ZSApOworICAgIGJvb2wgICAgICAgICAgSXNPcGVuZWQoKTsKKyAgICBpbnQgICAgICAgICAgIEdldFBvcygpOworICAgIAorcHJvdGVjdGVkOgorICAgIAorICAgIHVjaGFyKiAgbV9zdGFydDsKKyAgICB1Y2hhciogIG1fZW5kOworICAgIHVjaGFyKiAgbV9jdXJyZW50OworICAgIGludCAgICAgbV9ibG9ja19zaXplOworICAgIGludCAgICAgbV9ibG9ja19wb3M7CisgICAgRklMRSogICBtX2ZpbGU7CisgICAgYm9vbCAgICBtX2lzX29wZW5lZDsKKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgIFdyaXRlQmxvY2soKTsKKyAgICB2aXJ0dWFsIHZvaWQgIFJlbGVhc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgIEFsbG9jYXRlKCk7Cit9OworCisKKy8vIGNsYXNzIFdMQnl0ZVN0cmVhbSAtIHVjaGFyLW9yaWVudGVkIHN0cmVhbS4KKy8vIGwgaW4gcHJlZml4IG1lYW5zIHRoYXQgdGhlIGxlYXN0IHNpZ25pZmljYW50IHVjaGFyIG9mIGEgbXVsdGktYnl0ZSB2YWx1ZSBnb2VzIGZpcnN0CitjbGFzcyBXTEJ5dGVTdHJlYW0gOiBwdWJsaWMgV0Jhc2VTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5XTEJ5dGVTdHJlYW0oKTsKKworICAgIHZvaWQgICAgUHV0Qnl0ZSggaW50IHZhbCApOworICAgIHZvaWQgICAgUHV0Qnl0ZXMoIGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IGNvdW50ICk7CisgICAgdm9pZCAgICBQdXRXb3JkKCBpbnQgdmFsICk7CisgICAgdm9pZCAgICBQdXREV29yZCggaW50IHZhbCApOyAKK307CisKKworLy8gY2xhc3MgV0xCeXRlU3RyZWFtIC0gdWNoYXItb3JpZW50ZWQgc3RyZWFtLgorLy8gbSBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgdWNoYXIgb2YgYSBtdWx0aS1ieXRlIHZhbHVlIGdvZXMgbGFzdAorY2xhc3MgV01CeXRlU3RyZWFtIDogcHVibGljIFdMQnl0ZVN0cmVhbQoreworcHVibGljOgorICAgIHZpcnR1YWwgfldNQnl0ZVN0cmVhbSgpOworCisgICAgdm9pZCAgICBQdXRXb3JkKCBpbnQgdmFsICk7CisgICAgdm9pZCAgICBQdXREV29yZCggaW50IHZhbCApOyAKK307CisKKworLy8gY2xhc3MgV0xCaXRTdHJlYW0gLSBiaXQtb3JpZW50ZWQgc3RyZWFtLgorLy8gbCBpbiBwcmVmaXggbWVhbnMgdGhhdCB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IG9mIGEgbXVsdGktYml0IHZhbHVlIGdvZXMgZmlyc3QKK2NsYXNzIFdMQml0U3RyZWFtIDogcHVibGljIFdCYXNlU3RyZWFtCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+V0xCaXRTdHJlYW0oKTsKKyAgICAKKyAgICBpbnQgICAgIEdldFBvcygpOworICAgIHZvaWQgICAgUHV0KCBpbnQgdmFsLCBpbnQgYml0cyApOworICAgIHZvaWQgICAgUHV0SHVmZiggaW50IHZhbCwgY29uc3QgaW50KiB0YWJsZSApOworICAgICAgICAKK3Byb3RlY3RlZDoKKyAgICBpbnQgICAgIG1fYml0X2lkeDsKKyAgICBpbnQgICAgIG1fdmFsOworICAgIHZpcnR1YWwgdm9pZCAgV3JpdGVCbG9jaygpOworfTsKKworCisvLyBjbGFzcyBXTUJpdFN0cmVhbSAtIGJpdC1vcmllbnRlZCBzdHJlYW0uCisvLyBsIGluIHByZWZpeCBtZWFucyB0aGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgb2YgYSBtdWx0aS1iaXQgdmFsdWUgZ29lcyBmaXJzdAorY2xhc3MgV01CaXRTdHJlYW0gOiBwdWJsaWMgV0Jhc2VTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBXTUJpdFN0cmVhbSgpOworICAgIHZpcnR1YWwgfldNQml0U3RyZWFtKCk7CisgICAgCisgICAgYm9vbCAgICBPcGVuKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIHZvaWQgICAgQ2xvc2UoKTsKKyAgICB2aXJ0dWFsIHZvaWQgIEZsdXNoKCk7CisKKyAgICBpbnQgICAgIEdldFBvcygpOworICAgIHZvaWQgICAgUHV0KCBpbnQgdmFsLCBpbnQgYml0cyApOworICAgIHZvaWQgICAgUHV0SHVmZiggaW50IHZhbCwgY29uc3QgdWxvbmcqIHRhYmxlICk7CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIGludCAgICAgbV9iaXRfaWR4OworICAgIHVsb25nICAgbV9wYWRfdmFsOworICAgIHVsb25nICAgbV92YWw7CisgICAgdmlydHVhbCB2b2lkICBXcml0ZUJsb2NrKCk7CisgICAgdm9pZCAgICBSZXNldEJ1ZmZlcigpOworfTsKKworCisKKyNkZWZpbmUgQlNXQVAodikgICAgKCgodik8PDI0KXwoKCh2KSYweGZmMDApPDw4KXwgXAorICAgICAgICAgICAgICAgICAgICAoKCh2KT4+OCkmMHhmZjAwKXwoKHVuc2lnbmVkKSh2KT4+MjQpKQorCitpbnQqIGJzQ3JlYXRlU291cmNlSHVmZm1hblRhYmxlKCBjb25zdCB1Y2hhciogc3JjLCBpbnQqIGRzdCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2JpdHMsIGludCBmaXJzdF9iaXRzICk7Citib29sIGJzQ3JlYXRlRGVjb2RlSHVmZm1hblRhYmxlKCBjb25zdCBpbnQqIHNyYywgc2hvcnQqIGRzdCwgaW50IG1heF9zaXplICk7Citib29sIGJzQ3JlYXRlRW5jb2RlSHVmZm1hblRhYmxlKCBjb25zdCBpbnQqIHNyYywgdWxvbmcqIGRzdCwgaW50IG1heF9zaXplICk7CisKK3ZvaWQgYnNCU3dhcEJsb2NrKCB1Y2hhciAqc3RhcnQsIHVjaGFyICplbmQgKTsKK2Jvb2wgYnNJc0JpZ0VuZGlhbiggdm9pZCApOworCitleHRlcm4gY29uc3QgdWxvbmcgYnNfYml0X21hc2tbXTsKKworI2VuZGlmLypfQklUU1RSTV9IXyovCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9jdmNhcC5jcHAgYi9vdGhlcmxpYnMvaGlnaGd1aS9jdmNhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdiMDU4OAotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2N2Y2FwLmNwcApAQCAtMCwwICsxLDkzIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9oaWdoZ3VpLmgiCisKKyNpZiBfTVNDX1ZFUiA+PSAxMjAwCisjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQ3MTEgKQorI2VuZGlmCisKKyNpZiBkZWZpbmVkIFdJTjY0ICYmIGRlZmluZWQgRU02NFQgJiYgZGVmaW5lZCBfTVNDX1ZFUiAmJiAhZGVmaW5lZCBfX0lDTAorI3ByYWdtYSBvcHRpbWl6ZSgiIixvZmYpCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKiBSZWFkaW5nIEFWSXMgJiBDYW1lcmEgZGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworQ1ZfSU1QTCB2b2lkIGN2UmVsZWFzZUNhcHR1cmUoIEN2Q2FwdHVyZSoqIHBjYXB0dXJlICkKK3sKKyAgICBpZiggcGNhcHR1cmUgJiYgKnBjYXB0dXJlICkKKyAgICB7CisgICAgICAgIGRlbGV0ZSAqcGNhcHR1cmU7CisgICAgICAgICpwY2FwdHVyZSA9IDA7CisgICAgfQorfQorCitDVl9JTVBMIElwbEltYWdlKiBjdlF1ZXJ5RnJhbWUoIEN2Q2FwdHVyZSogY2FwdHVyZSApCit7CisgICAgcmV0dXJuIGNhcHR1cmUgPyBjYXB0dXJlLT5xdWVyeUZyYW1lKCkgOiAwOworfQorCisKK0NWX0lNUEwgaW50IGN2R3JhYkZyYW1lKCBDdkNhcHR1cmUqIGNhcHR1cmUgKQoreworICAgIHJldHVybiBjYXB0dXJlID8gY2FwdHVyZS0+Z3JhYkZyYW1lKCkgOiAwOworfQorCitDVl9JTVBMIElwbEltYWdlKiBjdlJldHJpZXZlRnJhbWUoIEN2Q2FwdHVyZSogY2FwdHVyZSApCit7CisgICAgcmV0dXJuIGNhcHR1cmUgPyBjYXB0dXJlLT5yZXRyaWV2ZUZyYW1lKCkgOiAwOworfQorCitDVl9JTVBMIGRvdWJsZSBjdkdldENhcHR1cmVQcm9wZXJ0eSggQ3ZDYXB0dXJlKiBjYXB0dXJlLCBpbnQgaWQgKQoreworICAgIHJldHVybiBjYXB0dXJlID8gY2FwdHVyZS0+Z2V0UHJvcGVydHkoaWQpIDogMDsKK30KKworQ1ZfSU1QTCBpbnQgY3ZTZXRDYXB0dXJlUHJvcGVydHkoIEN2Q2FwdHVyZSogY2FwdHVyZSwgaW50IGlkLCBkb3VibGUgdmFsdWUgKQoreworICAgIHJldHVybiBjYXB0dXJlID8gY2FwdHVyZS0+c2V0UHJvcGVydHkoaWQsIHZhbHVlKSA6IDA7Cit9CisKK0NWX0lNUEwgQ3ZDYXB0dXJlKiBjdkNyZWF0ZVNvY2tldENhcHR1cmUoIGNvbnN0IGNoYXIgKmFkZHJlc3MsIGNvbnN0IGNoYXIqIHBvcnQsIGludCB3aWR0aCwgaW50IGhlaWdodCApCit7CisJcmV0dXJuIGN2Q3JlYXRlQ2FtZXJhQ2FwdHVyZV9Tb2NrZXQoYWRkcmVzcywgcG9ydCwgd2lkdGgsIGhlaWdodCk7Cit9CmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9jdmNhcF9zb2NrZXQuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvY3ZjYXBfc29ja2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJmMDFlCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvY3ZjYXBfc29ja2V0LmNwcApAQCAtMCwwICsxLDMwMiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDgsIE5pbHMgSGFzbGVyLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKy8vIEF1dGhvcjogQmlsbCBNY0NvcmQKKy8vCisvLyAgICAgICAgIEludHVpdGl2ZSBBdXRvbWF0YQorCisvLworLy8gY2FwdHVyZSB2aWRlbyBmcm9tIGEgc29ja2V0IGNvbm5lY3Rpb24KKy8vCisKKyNpbmNsdWRlICJfaGlnaGd1aS5oIgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExPR1YoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX1NJTEVOVCwgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIExPR19UQUcgIkNWSk5JIgorCisjaWZkZWYgTkRFQlVHCisjZGVmaW5lIENWX1dBUk4obWVzc2FnZSkKKyNlbHNlCisjZGVmaW5lIENWX1dBUk4obWVzc2FnZSkgZnByaW50ZihzdGRlcnIsICJ3YXJuaW5nOiAlcyAoJXM6JWQpXG4iLCBtZXNzYWdlLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZW5kaWYKKworI2RlZmluZSBJTUFHRSggaSwgeCwgeSwgbiApICAgKigoIHVuc2lnbmVkIGNoYXIgKiApKCggaSApLT5pbWFnZURhdGEgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICggeCApICogc2l6ZW9mKCB1bnNpZ25lZCBjaGFyICkgKiAzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCB5ICkgKiAoIGkgKS0+d2lkdGhTdGVwICkgKyAoIG4gKSkKKworY2xhc3MgQ1ZDYXB0dXJlX1NvY2tldCA6IHB1YmxpYyBDdkNhcHR1cmUKK3sKK3B1YmxpYzoKKyAgICBDVkNhcHR1cmVfU29ja2V0KCkKKyAgICB7CisJCXBBZGRySW5mbyA9IDA7CisJCXdpZHRoID0gMDsKKwkJaGVpZ2h0ID0gMDsKKwkJcmVhZEJ1ZlNpemUgPSAwOworCQlyZWFkQnVmID0gMDsKKyAgICAgICAgZnJhbWUgPSAwOworICAgIH0KKworICAgIHZpcnR1YWwgfkNWQ2FwdHVyZV9Tb2NrZXQoKQorICAgIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgb3Blbihjb25zdCBjaGFyKiBfYWRkcmVzcywgY29uc3QgY2hhciogX3BvcnQsIGludCBfd2lkdGgsIGludCBfaGVpZ2h0KTsKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIGRvdWJsZSBnZXRQcm9wZXJ0eShpbnQpOworICAgIHZpcnR1YWwgYm9vbCBzZXRQcm9wZXJ0eShpbnQsIGRvdWJsZSk7CisgICAgdmlydHVhbCBib29sIGdyYWJGcmFtZSgpOworICAgIHZpcnR1YWwgSXBsSW1hZ2UqIHJldHJpZXZlRnJhbWUoKTsKKworcHJvdGVjdGVkOgorCXN0cnVjdCBhZGRyaW5mbyAqcEFkZHJJbmZvOworCWludCB3aWR0aDsgLy8gdGhlIHdpZHRoIG9mIHRoZSBpbWFnZXMgcmVjZWl2ZWQgb3ZlciB0aGUgc29ja2V0CisJaW50IGhlaWdodDsgLy8gdGhlIGhlaWdodCBvZiB0aGUgaW1hZ2VzIHJlY2VpdmVkIG92ZXIgdGhlIHNvY2tldAorCWxvbmcgcmVhZEJ1ZlNpemU7IC8vIHRoZSBsZW5ndGggb2YgdGhlIHJlYWQgYnVmZmVyCisJY2hhciAqcmVhZEJ1ZjsgLy8gdGhlIHJlYWQgYnVmZmVyCisKKyAgICBJcGxJbWFnZSogZnJhbWU7Cit9OworCisvLyBUaGUgb3BlbiBtZXRob2Qgc2ltcGx5IGluaXRpYWxpemVzIHNvbWUgdmFyaWFibGVzIHdlIHdpbGwgbmVlZCBsYXRlci4KK2Jvb2wgQ1ZDYXB0dXJlX1NvY2tldDo6b3Blbihjb25zdCBjaGFyKiBfYWRkcmVzcywgY29uc3QgY2hhciogX3BvcnQsIGludCBfd2lkdGgsIGludCBfaGVpZ2h0KQorewkKKwkvLyBGcmVlIHRoZSBhZGRyaW5mbyBpZiBpdCB3YXMgYWxsb2NhdGVkLgorCWlmIChwQWRkckluZm8pCisJeworCQlmcmVlYWRkcmluZm8ocEFkZHJJbmZvKTsKKwkJcEFkZHJJbmZvID0gMDsKKwl9CisJCisJLy8gQ2hlY2sgdGhlIGVhc3kgc3R1ZmYgZmlyc3QuCisJd2lkdGggPSBfd2lkdGg7CisJaGVpZ2h0ID0gX2hlaWdodDsKKwlpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkKKwl7CisJCUxPR1YoIkludmFsaWQgd2lkdGggb3IgaGVpZ2h0ISIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8vIFNldHVwIGEgbmV3IGFkZHJpbmZvIHRvIHN1cHBvcnQgYSBzdHJlYW1pbmcgc29ja2V0IGF0IHRoZSBnaXZlbiBhZGRyZXNzIGFuZCBwb3J0LgorCXN0cnVjdCBhZGRyaW5mbyBoaW50czsKKwltZW1zZXQoJmhpbnRzLCAwLCBzaXplb2YgaGludHMpOworCWhpbnRzLmFpX2ZhbWlseSA9IEFGX1VOU1BFQzsgIC8vIHVzZSBJUHY0IG9yIElQdjYsIHdoaWNoZXZlcgorCWhpbnRzLmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJaGludHMuYWlfZmxhZ3MgPSBBSV9OVU1FUklDSE9TVDsKKworCWludCBlcnJvciA9IGdldGFkZHJpbmZvKF9hZGRyZXNzLCBfcG9ydCwgJmhpbnRzLCAmcEFkZHJJbmZvKTsKKwlpZiAoZXJyb3IpCisJeworCQljaGFyIGJ1ZmZlclsxMDBdOworCQlzcHJpbnRmKGJ1ZmZlciwgImdldGFkZHJpbmZvIGVycm9yOiAlcyIsIGdhaV9zdHJlcnJvcihlcnJvcikpOworCQlMT0dWKCIlcyIsIGJ1ZmZlcik7CisJCWZyZWVhZGRyaW5mbyhwQWRkckluZm8pOworCQlwQWRkckluZm8gPSAwOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCXJlYWRCdWZTaXplID0gd2lkdGggKiBoZWlnaHQgKiBzaXplb2YoaW50KTsKKwlyZWFkQnVmID0gKGNoYXIqKW1hbGxvYyhyZWFkQnVmU2l6ZSk7CisJaWYgKCFyZWFkQnVmKQorCXsKKwkJTE9HVigib3V0IG9mIG1lbW9yeSBlcnJvciIpOworCQlmcmVlYWRkcmluZm8ocEFkZHJJbmZvKTsKKwkJcEFkZHJJbmZvID0gMDsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwkJCisJcmV0dXJuIHRydWU7Cit9CisKKy8vIENsb3NlIGNsZWFucyB1cCBhbGwgb2Ygb3VyIHN0YXRlIGFuZCBjYWNoZWQgZGF0YS4KK3ZvaWQgQ1ZDYXB0dXJlX1NvY2tldDo6Y2xvc2UoKQoreworCUxPR1YoIlNldHRpbmcgc2ltcGxlIHZhcnMgdG8gMCIpOworCXdpZHRoID0gMDsKKwloZWlnaHQgPSAwOworCXJlYWRCdWZTaXplID0gMDsKKwkKKwlMT0dWKCJGcmVlaW5nIEFkZHIgSW5mbyIpOworCWlmIChwQWRkckluZm8pCisJeworCQlmcmVlYWRkcmluZm8ocEFkZHJJbmZvKTsKKwkJcEFkZHJJbmZvID0gMDsKKwl9CisJCisJTE9HVigiRnJlZWluZyBCdWZmZXIiKTsKKwlpZiAocmVhZEJ1ZikKKwl7CisJCWZyZWUocmVhZEJ1Zik7CisJCXJlYWRCdWYgPSAwOworCX0KKwkKKwlMT0dWKCJSZWxlYXNpbmcgSW1hZ2UiKTsKKwlpZiAoZnJhbWUpCisJeworCQljdlJlbGVhc2VJbWFnZSggJmZyYW1lICk7CisJCWZyYW1lID0gMDsKKwl9CisKKwlMT0dWKCJEb25lIGNsb3NpbmcgQ2FwdHVyZSBTb2NrZXQiKTsKK30KKworLy8gSGVscGVyIHRvIGxvYWQgcGl4ZWxzIGZyb20gYSBieXRlIHN0cmVhbSByZWNlaXZlZCBvdmVyIGEgc29ja2V0Lgorc3RhdGljIElwbEltYWdlKiBsb2FkUGl4ZWxzKGNoYXIqIHBpeGVscywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisKKwlpbnQgeCwgeSwgcG9zLCBpbnRfc2l6ZSA9IHNpemVvZihpbnQpOworCUlwbEltYWdlICppbWcgPSBjdkNyZWF0ZUltYWdlKGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAzKTsKKworCWZvciAoIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KysgKSB7CisJCXBvcyA9IHkgKiB3aWR0aCAqIGludF9zaXplOworICAgICAgICBmb3IgKCB4ID0gMDsgeCA8IHdpZHRoOyB4KyssIHBvcyArPSBpbnRfc2l6ZSApIHsKKyAgICAgICAgICAgIC8vIGJsdWUKKyAgICAgICAgICAgIElNQUdFKCBpbWcsIHgsIHksIDAgKSA9IHBpeGVsc1twb3MgKyAzXSAmIDB4RkY7CisgICAgICAgICAgICAvLyBncmVlbgorICAgICAgICAgICAgSU1BR0UoIGltZywgeCwgeSwgMSApID0gcGl4ZWxzW3BvcyArIDJdICYgMHhGRjsKKyAgICAgICAgICAgIC8vIHJlZAorICAgICAgICAgICAgSU1BR0UoIGltZywgeCwgeSwgMiApID0gcGl4ZWxzW3BvcyArIDFdICYgMHhGRjsKKyAgICAgICAgfQorICAgIH0KKworCXJldHVybiBpbWc7Cit9CisKKy8vIEdyYWJzIGEgZnJhbWUgKGltYWdlKSBmcm9tIGEgc29ja2V0LgorYm9vbCBDVkNhcHR1cmVfU29ja2V0OjpncmFiRnJhbWUoKQoreworCS8vIEZpcnN0IGVuc3VyZSB0aGF0IG91ciBhZGRyaW5mbyBhbmQgcmVhZCBidWZmZXIgYXJlIGFsbG9jYXRlZC4KKwlpZiAocEFkZHJJbmZvID09IDAgfHwgcmVhZEJ1ZiA9PSAwKQorCXsKKwkJTE9HVigiWW91IGhhdmVuJ3Qgb3BlbmVkIHRoZSBzb2NrZXQgY2FwdHVyZSB5ZXQhIik7CisJCXJldHVybiBmYWxzZTsKKwl9CisJCisJLy8gRXN0YWJsaXNoIHRoZSBzb2NrZXQuCisJaW50IHNvY2tkID0gc29ja2V0KHBBZGRySW5mby0+YWlfZmFtaWx5LCBwQWRkckluZm8tPmFpX3NvY2t0eXBlLCBwQWRkckluZm8tPmFpX3Byb3RvY29sKTsKKwlpZiAoc29ja2QgPCAwIHx8IGVycm5vICE9IDApCisJeworCQljaGFyIGJ1ZmZlclsxMDBdOworCQlzcHJpbnRmKGJ1ZmZlciwgIkZhaWxlZCB0byBjcmVhdGUgc29ja2V0LCBlcnJubyA9ICVkIiwgZXJybm8pOworCQlMT0dWKCIlcyIsIGJ1ZmZlcik7CisJCTo6Y2xvc2Uoc29ja2QpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCQorCS8vIE5vdyBjb25uZWN0IHRvIHRoZSBzb2NrZXQuCisJaWYgKGNvbm5lY3Qoc29ja2QsIHBBZGRySW5mby0+YWlfYWRkciwgcEFkZHJJbmZvLT5haV9hZGRybGVuKSA8IDAgfHwgZXJybm8gIT0gMCkKKwl7CisJCWNoYXIgYnVmZmVyWzEwMF07CisJCXNwcmludGYoYnVmZmVyLCAic29ja2V0IGNvbm5lY3Rpb24gZXJyb3JubyA9ICVkIiwgZXJybm8pOworCQlMT0dWKCIlcyIsIGJ1ZmZlcik7CisJCTo6Y2xvc2Uoc29ja2QpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLy8gUmVsZWFzZSB0aGUgaW1hZ2UgaWYgaXQgaGFzbid0IGJlZW4gYWxyZWFkeSBiZWNhdXNlIHdlIGFyZSBnb2luZyB0byBvdmVyd3JpdGUgaXQuCisJaWYgKGZyYW1lKQorCXsKKwkJY3ZSZWxlYXNlSW1hZ2UoICZmcmFtZSApOworCQlmcmFtZSA9IDA7CisJfQorCQorCS8vIFJlYWQgdGhlIHNvY2tldCB1bnRpbCB3ZSBoYXZlIGZpbGxlZCB0aGUgZGF0YSB3aXRoIHRoZSBzcGFjZSBhbGxvY2F0ZWQgT1IgcnVuCisJLy8gb3V0IG9mIGRhdGEgd2hpY2ggd2UgdHJlYXQgYXMgYW4gZXJyb3IuCisJbG9uZyByZWFkX2NvdW50LCB0b3RhbF9yZWFkID0gMDsKKwl3aGlsZSAodG90YWxfcmVhZCA8IHJlYWRCdWZTaXplKQorCXsKKwkJcmVhZF9jb3VudCA9IHJlYWQoc29ja2QsICZyZWFkQnVmW3RvdGFsX3JlYWRdLCByZWFkQnVmU2l6ZSk7CisJCWlmIChyZWFkX2NvdW50IDw9IDAgfHwgZXJybm8gIT0gMCkKKwkJeworCQkJY2hhciBidWZmZXJbMTAwXTsKKwkJCXNwcmludGYoYnVmZmVyLCAic29ja2V0IHJlYWQgZXJyb3JubyA9ICVkIiwgZXJybm8pOworCQkJTE9HVigiJXMiLCBidWZmZXIpOworCQkJYnJlYWs7CisJCX0KKwkJdG90YWxfcmVhZCArPSByZWFkX2NvdW50OworCX0KKwkKKwkvLyBJZiB3ZSByZWFkIGFsbCBvZiB0aGUgZGF0YSB3ZSBleHBlY3RlZCwgd2Ugd2lsbCBsb2FkIHRoZSBmcmFtZSBmcm9tIHRoZSBwaXhlbHMuCisJaWYgKHRvdGFsX3JlYWQgPT0gcmVhZEJ1ZlNpemUpCisJeworCQlmcmFtZSA9IGxvYWRQaXhlbHMocmVhZEJ1Ziwgd2lkdGgsIGhlaWdodCk7CisJfQorCWVsc2UKKwl7CisJCUxPR1YoImZ1bGwgcmVhZCBvZiBwaXhlbHMgZmFpbGVkIik7CisJfQorCQorCS8vIENsb3NlIHRoZSBzb2NrZXQgYW5kIHJldHVybiB0aGUgZnJhbWUhCisJOjpjbG9zZShzb2NrZCk7CisJCisgICAgcmV0dXJuIGZyYW1lICE9IDA7Cit9CisKK0lwbEltYWdlKiBDVkNhcHR1cmVfU29ja2V0OjpyZXRyaWV2ZUZyYW1lKCkKK3sKKyAgICByZXR1cm4gZnJhbWU7Cit9CisKK2RvdWJsZSBDVkNhcHR1cmVfU29ja2V0OjpnZXRQcm9wZXJ0eShpbnQgaWQpCit7CisJTE9HVigidW5rbm93bi91bmhhbmRsZWQgcHJvcGVydHkiKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBDVkNhcHR1cmVfU29ja2V0OjpzZXRQcm9wZXJ0eShpbnQgaWQsIGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBMT0dWKCJ1bmtub3duL3VuaGFuZGxlZCBwcm9wZXJ0eSIpOworICAgIHJldHVybiBmYWxzZTsKK30KKworQ3ZDYXB0dXJlKiBjdkNyZWF0ZUNhbWVyYUNhcHR1cmVfU29ja2V0KCBjb25zdCBjaGFyICphZGRyZXNzLCBjb25zdCBjaGFyICpwb3J0LCBpbnQgd2lkdGgsIGludCBoZWlnaHQgKQoreworCUNWQ2FwdHVyZV9Tb2NrZXQqIGNhcHR1cmUgPSBuZXcgQ1ZDYXB0dXJlX1NvY2tldDsKKwlpZiAoIGNhcHR1cmUtPiBvcGVuKGFkZHJlc3MsIHBvcnQsIHdpZHRoLCBoZWlnaHQpICkKKwkJcmV0dXJuIGNhcHR1cmU7CisJCQorCWRlbGV0ZSBjYXB0dXJlOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZHVtbXkuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvZHVtbXkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOGI4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9kdW1teS5jcHAKQEAgLTAsMCArMSBAQAorLy8gdGhpcyBmaWxlIGlzIGVtcHR5IGJ1dCBuZWVkZWQgZm9yIGxpYnRvb2wKZGlmZiAtLWdpdCBhL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2Jhc2UuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfYmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZlMzNkZQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2Jhc2UuY3BwCkBAIC0wLDAgKzEsMzA1IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9oaWdoZ3VpLmgiCisKKyNpbmNsdWRlICJncmZtdF9iYXNlLmgiCisjaW5jbHVkZSAiYml0c3RybS5oIgorCisKK0dyRm10UmVhZGVyOjpHckZtdFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIHN0cm5jcHkoIG1fZmlsZW5hbWUsIGZpbGVuYW1lLCBzaXplb2YobV9maWxlbmFtZSkgLSAxICk7CisgICAgbV9maWxlbmFtZVtzaXplb2YobV9maWxlbmFtZSktMV0gPSAnXDAnOworICAgIG1fd2lkdGggPSBtX2hlaWdodCA9IDA7CisgICAgbV9pc2NvbG9yID0gZmFsc2U7CisgICAgbV9iaXRfZGVwdGggPSA4OworICAgIG1fbmF0aXZlX2RlcHRoID0gZmFsc2U7CisgICAgbV9pc2Zsb2F0ID0gZmFsc2U7Cit9CisKKworR3JGbXRSZWFkZXI6On5HckZtdFJlYWRlcigpCit7CisgICAgQ2xvc2UoKTsKK30KKworCit2b2lkIEdyRm10UmVhZGVyOjpDbG9zZSgpCit7CisgICAgbV93aWR0aCA9IG1faGVpZ2h0ID0gMDsKKyAgICBtX2lzY29sb3IgPSBmYWxzZTsKK30KKworCitHckZtdFdyaXRlcjo6R3JGbXRXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBzdHJuY3B5KCBtX2ZpbGVuYW1lLCBmaWxlbmFtZSwgc2l6ZW9mKG1fZmlsZW5hbWUpIC0gMSApOworICAgIG1fZmlsZW5hbWVbc2l6ZW9mKG1fZmlsZW5hbWUpLTFdID0gJ1wwJzsKK30KKworCitib29sICBHckZtdFdyaXRlcjo6SXNGb3JtYXRTdXBwb3J0ZWQoIGludCBkZXB0aCApCit7CisgICAgcmV0dXJuIGRlcHRoID09IElQTF9ERVBUSF84VTsKK30KKworCitHckZtdEZpbHRlckZhY3Rvcnk6OkdyRm10RmlsdGVyRmFjdG9yeSgpCit7CisgICAgbV9kZXNjcmlwdGlvbiA9IG1fc2lnbmF0dXJlID0gMDsKKyAgICBtX3NpZ25fbGVuID0gMDsKK30KKworCitib29sICBHckZtdEZpbHRlckZhY3Rvcnk6OkNoZWNrRmlsZSggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworCUZJTEUqIGYgPSAwOworCWNoYXIgc2lnbmF0dXJlWzQwOTZdOworCWludCBzaWduX2xlbiA9IDA7CisJaW50IGN1cl9zaWduX2xlbiA9IEdldFNpZ25hdHVyZUxlbmd0aCgpOworCQorCWlmKCAhZmlsZW5hbWUgKSByZXR1cm4gZmFsc2U7CisJCisJYXNzZXJ0KCBjdXJfc2lnbl9sZW4gPD0gKGludClzaXplb2YoIHNpZ25hdHVyZSApICk7CisJZiA9IGZvcGVuKCBmaWxlbmFtZSwgInJiIiApOworCQorCWlmKCBmICkKKwl7CisJCXNpZ25fbGVuID0gKGludClmcmVhZCggc2lnbmF0dXJlLCAxLCBjdXJfc2lnbl9sZW4sIGYgKTsKKwkJZmNsb3NlKCBmICk7CisJCQorCQlpZiggY3VyX3NpZ25fbGVuIDw9IHNpZ25fbGVuICYmIENoZWNrU2lnbmF0dXJlKCBzaWduYXR1cmUgKSApCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwl9CisJCisJcmV0dXJuIGZhbHNlOworfQorCisKK2Jvb2wgR3JGbXRGaWx0ZXJGYWN0b3J5OjpDaGVja1NpZ25hdHVyZSggY29uc3QgY2hhciogc2lnbmF0dXJlICkKK3sKKyAgICByZXR1cm4gbV9zaWduX2xlbiA+IDAgJiYgc2lnbmF0dXJlICE9IDAgJiYKKyAgICAgICAgICAgbWVtY21wKCBzaWduYXR1cmUsIG1fc2lnbmF0dXJlLCBtX3NpZ25fbGVuICkgPT0gMDsKK30KKworCitzdGF0aWMgaW50IEdldEV4dGVuc2lvbkxlbmd0aCggY29uc3QgY2hhciogYnVmZmVyICkKK3sKKyAgICBpbnQgbGVuID0gMDsKKworICAgIGlmKCBidWZmZXIgKQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogZXh0ID0gc3RyY2hyKCBidWZmZXIsICcuJyk7CisgICAgICAgIGlmKCBleHQrKyApCisgICAgICAgICAgICB3aGlsZSggaXNhbG51bShleHRbbGVuXSkgJiYgbGVuIDwgX01BWF9QQVRIICkKKyAgICAgICAgICAgICAgICBsZW4rKzsKKyAgICB9CisKKyAgICByZXR1cm4gbGVuOworfQorCisKK2Jvb2wgR3JGbXRGaWx0ZXJGYWN0b3J5OjpDaGVja0V4dGVuc2lvbiggY29uc3QgY2hhciogZm9ybWF0ICkKK3sKKyAgICBjb25zdCBjaGFyKiBkZXNjciA9IDA7CisgICAgaW50IGxlbiA9IDA7CisgICAgICAgIAorICAgIGlmKCAhZm9ybWF0IHx8ICFtX2Rlc2NyaXB0aW9uICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gZmluZCB0aGUgcmlnaHQtbW9zdCBleHRlbnNpb24gb2YgdGhlIHBhc3NlZCBmb3JtYXQgc3RyaW5nCisgICAgZm9yKDs7KQorICAgIHsKKyAgICAgICAgY29uc3QgY2hhciogZXh0ID0gc3RyY2hyKCBmb3JtYXQgKyAxLCAnLicgKTsKKyAgICAgICAgaWYoICFleHQgKSBicmVhazsKKyAgICAgICAgZm9ybWF0ID0gZXh0OworICAgIH0KKworICAgIGxlbiA9IEdldEV4dGVuc2lvbkxlbmd0aCggZm9ybWF0ICk7CisKKyAgICBpZiggZm9ybWF0WzBdICE9ICcuJyB8fCBsZW4gPT0gMCApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGRlc2NyID0gc3RyY2hyKCBtX2Rlc2NyaXB0aW9uLCAnKCcgKTsKKworICAgIHdoaWxlKCBkZXNjciApCisgICAgeworICAgICAgICBkZXNjciA9IHN0cmNociggZGVzY3IgKyAxLCAnLicgKTsKKyAgICAgICAgaW50IGksIGxlbjIgPSBHZXRFeHRlbnNpb25MZW5ndGgoIGRlc2NyICk7IAorCisgICAgICAgIGlmKCBsZW4yID09IDAgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYoIGxlbjIgPT0gbGVuICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgYzEgPSB0b2xvd2VyKGZvcm1hdFtpKzFdKTsKKyAgICAgICAgICAgICAgICBpbnQgYzIgPSB0b2xvd2VyKGRlc2NyW2krMV0pOworCisgICAgICAgICAgICAgICAgaWYoIGMxICE9IGMyICkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggaSA9PSBsZW4gKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEdyRm10RmlsdGVyTGlzdCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdEZhY3Rvcmllc0xpc3Q6OkdyRm10RmFjdG9yaWVzTGlzdCgpCit7CisgICAgbV9mYWN0b3JpZXMgPSAwOworICAgIFJlbW92ZUFsbCgpOworfQorCisKK0dyRm10RmFjdG9yaWVzTGlzdDo6fkdyRm10RmFjdG9yaWVzTGlzdCgpCit7CisgICAgUmVtb3ZlQWxsKCk7Cit9CisKKwordm9pZCAgR3JGbXRGYWN0b3JpZXNMaXN0OjpSZW1vdmVBbGwoKQoreworICAgIGlmKCBtX2ZhY3RvcmllcyApCisgICAgeworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG1fY3VyRmFjdG9yaWVzOyBpKysgKSBkZWxldGUgbV9mYWN0b3JpZXNbaV07CisgICAgICAgIGRlbGV0ZVtdIG1fZmFjdG9yaWVzOworICAgIH0KKyAgICBtX2ZhY3RvcmllcyA9IDA7CisgICAgbV9tYXhGYWN0b3JpZXMgPSBtX2N1ckZhY3RvcmllcyA9IDA7Cit9CisKKworYm9vbCAgR3JGbXRGYWN0b3JpZXNMaXN0OjpBZGRGYWN0b3J5KCBHckZtdEZpbHRlckZhY3RvcnkqIGZhY3RvcnkgKQoreworICAgIGFzc2VydCggZmFjdG9yeSAhPSAwICk7CisgICAgaWYoIG1fY3VyRmFjdG9yaWVzID09IG1fbWF4RmFjdG9yaWVzICkKKyAgICB7CisgICAgICAgIC8vIHJlYWxsb2NhdGUgdGhlIGZhY3RvcnlzIHBvaW50ZXJzIHN0b3JhZ2UKKyAgICAgICAgaW50IG5ld01heEZhY3RvcmllcyA9IDIqbV9tYXhGYWN0b3JpZXM7CisgICAgICAgIGlmKCBuZXdNYXhGYWN0b3JpZXMgPCAxNiApIG5ld01heEZhY3RvcmllcyA9IDE2OworCisgICAgICAgIEdyRm10RmlsdGVyRmFjdG9yeSoqIG5ld0ZhY3RvcmllcyA9IG5ldyBHckZtdEZpbHRlckZhY3RvcnkqW25ld01heEZhY3Rvcmllc107CisKKyAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBtX2N1ckZhY3RvcmllczsgaSsrICkgbmV3RmFjdG9yaWVzW2ldID0gbV9mYWN0b3JpZXNbaV07CisKKyAgICAgICAgZGVsZXRlW10gbV9mYWN0b3JpZXM7CisgICAgICAgIG1fZmFjdG9yaWVzID0gbmV3RmFjdG9yaWVzOworICAgICAgICBtX21heEZhY3RvcmllcyA9IG5ld01heEZhY3RvcmllczsKKyAgICB9CisKKyAgICBtX2ZhY3Rvcmllc1ttX2N1ckZhY3RvcmllcysrXSA9IGZhY3Rvcnk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworTGlzdFBvc2l0aW9uICBHckZtdEZhY3Rvcmllc0xpc3Q6OkdldEZpcnN0RmFjdG9yeVBvcygpCit7CisgICAgcmV0dXJuIChMaXN0UG9zaXRpb24pbV9mYWN0b3JpZXM7Cit9CisKKworR3JGbXRGaWx0ZXJGYWN0b3J5KiBHckZtdEZhY3Rvcmllc0xpc3Q6OkdldE5leHRGYWN0b3J5KCBMaXN0UG9zaXRpb24mIHBvcyApCit7CisgICAgR3JGbXRGaWx0ZXJGYWN0b3J5KiBmYWN0b3J5ID0gMDsKKyAgICBHckZtdEZpbHRlckZhY3RvcnkqKiB0ZW1wID0gKEdyRm10RmlsdGVyRmFjdG9yeSoqKXBvczsKKworICAgIGFzc2VydCggdGVtcCA9PSAwIHx8IChtX2ZhY3RvcmllcyA8PSB0ZW1wICYmIHRlbXAgPCBtX2ZhY3RvcmllcyArIG1fY3VyRmFjdG9yaWVzKSk7CisgICAgaWYoIHRlbXAgKQorICAgIHsKKyAgICAgICAgZmFjdG9yeSA9ICp0ZW1wKys7CisgICAgICAgIHBvcyA9IChMaXN0UG9zaXRpb24pKHRlbXAgPCBtX2ZhY3RvcmllcyArIG1fY3VyRmFjdG9yaWVzID8gdGVtcCA6IDApOworICAgIH0KKyAgICByZXR1cm4gZmFjdG9yeTsKK30KKworCitHckZtdFJlYWRlciogR3JGbXRGYWN0b3JpZXNMaXN0OjpGaW5kUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisJaWYoICFmaWxlbmFtZSApIHJldHVybiAwOworCQorCUdyRm10UmVhZGVyKiByZWFkZXIgPSAwOworCUxpc3RQb3NpdGlvbiBwb3MgPSBHZXRGaXJzdEZhY3RvcnlQb3MoKTsKKwkKKwl3aGlsZSggcG9zICkKKwl7CisJCUdyRm10RmlsdGVyRmFjdG9yeSogdGVtcEZhY3RvcnkgPSBHZXROZXh0RmFjdG9yeSggcG9zICk7CisJCWlmKCB0ZW1wRmFjdG9yeS0+Q2hlY2tGaWxlKCBmaWxlbmFtZSApICkKKwkJeworCQkJcmVhZGVyID0gdGVtcEZhY3RvcnktPk5ld1JlYWRlciggZmlsZW5hbWUgKTsKKwkJCWJyZWFrOworCQl9CisJfQorCQorICAgIHJldHVybiByZWFkZXI7Cit9CisKKworR3JGbXRXcml0ZXIqIEdyRm10RmFjdG9yaWVzTGlzdDo6RmluZFdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIEdyRm10V3JpdGVyKiB3cml0ZXIgPSAwOworICAgIExpc3RQb3NpdGlvbiBwb3MgPSBHZXRGaXJzdEZhY3RvcnlQb3MoKTsKKworICAgIGlmKCAhZmlsZW5hbWUgKSByZXR1cm4gMDsKKworICAgIHdoaWxlKCBwb3MgKQorICAgIHsKKyAgICAgICAgR3JGbXRGaWx0ZXJGYWN0b3J5KiB0ZW1wRmFjdG9yeSA9IEdldE5leHRGYWN0b3J5KHBvcyk7CisgICAgICAgIGlmKCB0ZW1wRmFjdG9yeS0+Q2hlY2tFeHRlbnNpb24oIGZpbGVuYW1lICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlciA9IHRlbXBGYWN0b3J5LT5OZXdXcml0ZXIoIGZpbGVuYW1lICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB3cml0ZXI7Cit9CisKKy8qIEVuZCBvZiBmaWxlLiAqLworCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9iYXNlLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlMWNjOQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2Jhc2UuaApAQCAtMCwwICsxLDE2MyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0dSRk1UX0JBU0VfSF8KKyNkZWZpbmUgX0dSRk1UX0JBU0VfSF8KKworI2lmIF9NU0NfVkVSID49IDEyMDAKKyAgICAjcHJhZ21hIHdhcm5pbmcoIGRpc2FibGU6IDQ1MTQgKQorICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogNDcxMSApCisgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiA0NjExICkKKyNlbmRpZgorCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlICJiaXRzdHJtLmgiCisKKyNkZWZpbmUgIFJCU19CQURfSEVBREVSICAgICAtMTI1ICAvKiBpbnZhbGlkIGltYWdlIGhlYWRlciAqLworI2RlZmluZSAgQkFEX0hFQURFUl9FUlIoKSAgIGdvdG8gYmFkX2hlYWRlcl9leGl0CisKKyNpZm5kZWYgX01BWF9QQVRICisgICAgI2RlZmluZSBfTUFYX1BBVEggICAgMTAyNAorI2VuZGlmCisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGJhc2UgY2xhc3MgZm9yIHJlYWRlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitjbGFzcyAgIEdyRm10UmVhZGVyCit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgdmlydHVhbCB+R3JGbXRSZWFkZXIoKTsKKworICAgIGludCAgIEdldFdpZHRoKCkgIHsgcmV0dXJuIG1fd2lkdGg7IH07CisgICAgaW50ICAgR2V0SGVpZ2h0KCkgeyByZXR1cm4gbV9oZWlnaHQ7IH07CisgICAgYm9vbCAgSXNDb2xvcigpICAgeyByZXR1cm4gbV9pc2NvbG9yOyB9OworICAgIGludCAgIEdldERlcHRoKCkgIHsgcmV0dXJuIG1fYml0X2RlcHRoOyB9OworICAgIHZvaWQgIFVzZU5hdGl2ZURlcHRoKCBib29sIHllcyApIHsgbV9uYXRpdmVfZGVwdGggPSB5ZXM7IH07CisgICAgYm9vbCAgSXNGbG9hdCgpICAgeyByZXR1cm4gbV9pc2Zsb2F0OyB9OworCisgICAgdmlydHVhbCBib29sICBSZWFkSGVhZGVyKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCAgUmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICkgPSAwOworICAgIHZpcnR1YWwgdm9pZCAgQ2xvc2UoKTsKKworcHJvdGVjdGVkOgorCisgICAgYm9vbCAgICBtX2lzY29sb3I7CisgICAgaW50ICAgICBtX3dpZHRoOyAgICAvLyB3aWR0aCAgb2YgdGhlIGltYWdlICggZmlsbGVkIGJ5IFJlYWRIZWFkZXIgKQorICAgIGludCAgICAgbV9oZWlnaHQ7ICAgLy8gaGVpZ2h0IG9mIHRoZSBpbWFnZSAoIGZpbGxlZCBieSBSZWFkSGVhZGVyICkKKyAgICBpbnQgICAgIG1fYml0X2RlcHRoOy8vIGJpdCBkZXB0aCBwZXIgY2hhbm5lbCAobm9ybWFsbHkgOCkKKyAgICBjaGFyICAgIG1fZmlsZW5hbWVbX01BWF9QQVRIXTsgLy8gZmlsZW5hbWUKKyAgICBib29sICAgIG1fbmF0aXZlX2RlcHRoOy8vIHVzZSB0aGUgbmF0aXZlIGJpdCBkZXB0aCBvZiB0aGUgaW1hZ2UKKyAgICBib29sICAgIG1faXNmbG9hdDsgIC8vIGlzIGltYWdlIHNhdmVkIGFzIGZsb2F0IG9yIGRvdWJsZT8KK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gYmFzZSBjbGFzcyBmb3Igd3JpdGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCitjbGFzcyAgIEdyRm10V3JpdGVyCit7CitwdWJsaWM6CisKKyAgICBHckZtdFdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB2aXJ0dWFsIH5HckZtdFdyaXRlcigpIHt9OworICAgIHZpcnR1YWwgYm9vbCAgSXNGb3JtYXRTdXBwb3J0ZWQoIGludCBkZXB0aCApOworICAgIHZpcnR1YWwgYm9vbCAgV3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApID0gMDsKK3Byb3RlY3RlZDoKKyAgICBjaGFyICAgIG1fZmlsZW5hbWVbX01BWF9QQVRIXTsgLy8gZmlsZW5hbWUKK307CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGJhc2UgY2xhc3MgZm9yIGZpbHRlciBmYWN0b3JpZXMgLy8vLy8vLy8vLy8vLy8vLy8vCitjbGFzcyAgIEdyRm10RmlsdGVyRmFjdG9yeQoreworcHVibGljOgorCisgICAgR3JGbXRGaWx0ZXJGYWN0b3J5KCk7CisgICAgdmlydHVhbCB+R3JGbXRGaWx0ZXJGYWN0b3J5KCkge307CisKKyAgICBjb25zdCBjaGFyKiAgR2V0RGVzY3JpcHRpb24oKSB7IHJldHVybiBtX2Rlc2NyaXB0aW9uOyB9OworICAgIGludCAgICAgR2V0U2lnbmF0dXJlTGVuZ3RoKCkgIHsgcmV0dXJuIG1fc2lnbl9sZW47IH07CisJdmlydHVhbCBib29sIENoZWNrRmlsZSggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB2aXJ0dWFsIGJvb2wgQ2hlY2tTaWduYXR1cmUoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApOworICAgIHZpcnR1YWwgYm9vbCBDaGVja0V4dGVuc2lvbiggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB2aXJ0dWFsIEdyRm10UmVhZGVyKiBOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgPSAwOworICAgIHZpcnR1YWwgR3JGbXRXcml0ZXIqIE5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBjaGFyKiBtX2Rlc2NyaXB0aW9uOworICAgICAgICAgICAvLyBncmFwaGljIGZvcm1hdCBkZXNjcmlwdGlvbiBpbiBmb3JtOgorICAgICAgICAgICAvLyA8U29tZSB0ZXh0dWFsIGRlc2NyaXB0aW9uPiggKi48ZXh0ZW5zaW9uMT4gWzsgKi48ZXh0ZW5zaW9uMj4gLi4uXSkuCisgICAgICAgICAgIC8vIHRoZSB0ZXh0dWFsIGRlc2NyaXB0aW9uIGNhbiBub3QgY29udGFpbiBzeW1ib2xzICcoJywgJyknCisgICAgICAgICAgIC8vIGFuZCBtYXkgYmUsIHNvbWUgb3RoZXJzLiBJdCBpcyBzYWZlIHRvIHVzZSBsZXR0ZXJzLCBkaWdpdHMgYW5kIHNwYWNlcyBvbmx5LgorICAgICAgICAgICAvLyBlLmcuICJUYXJnYSAoKi50Z2EpIiwKKyAgICAgICAgICAgLy8gb3IgIlBvcnRhYmxlIEdyYXBoaWMgRm9ybWF0ICgqLnBibTsqLnBnbTsqLnBwbSkiCisKKyAgICBpbnQgICAgICAgICAgbV9zaWduX2xlbjsgICAgLy8gbGVuZ3RoIG9mIHRoZSBzaWduYXR1cmUgb2YgdGhlIGZvcm1hdAorICAgIGNvbnN0IGNoYXIqICBtX3NpZ25hdHVyZTsgICAvLyBzaWduYXR1cmUgb2YgdGhlIGZvcm1hdAorfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gbGlzdCBvZiBncmFwaGljIGZvcm1hdCBmaWx0ZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKwordHlwZWRlZiB2b2lkKiBMaXN0UG9zaXRpb247CisKK2NsYXNzICAgR3JGbXRGYWN0b3JpZXNMaXN0Cit7CitwdWJsaWM6CisKKyAgICBHckZtdEZhY3Rvcmllc0xpc3QoKTsKKyAgICB2aXJ0dWFsIH5HckZtdEZhY3Rvcmllc0xpc3QoKTsKKyAgICB2b2lkICBSZW1vdmVBbGwoKTsKKyAgICBib29sICBBZGRGYWN0b3J5KCBHckZtdEZpbHRlckZhY3RvcnkqIGZhY3RvcnkgKTsKKyAgICBpbnQgICBGYWN0b3JpZXNDb3VudCgpIHsgcmV0dXJuIG1fY3VyRmFjdG9yaWVzOyB9OworICAgIExpc3RQb3NpdGlvbiAgR2V0Rmlyc3RGYWN0b3J5UG9zKCk7CisgICAgR3JGbXRGaWx0ZXJGYWN0b3J5KiAgR2V0TmV4dEZhY3RvcnkoIExpc3RQb3NpdGlvbiYgcG9zICk7CisgICAgdmlydHVhbCBHckZtdFJlYWRlciogIEZpbmRSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgdmlydHVhbCBHckZtdFdyaXRlciogIEZpbmRXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisKK3Byb3RlY3RlZDoKKworICAgIEdyRm10RmlsdGVyRmFjdG9yeSoqIG1fZmFjdG9yaWVzOworICAgIGludCAgbV9tYXhGYWN0b3JpZXM7CisgICAgaW50ICBtX2N1ckZhY3RvcmllczsKK307CisKKyNlbmRpZi8qX0dSRk1UX0JBU0VfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfYm1wLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2JtcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzY3ZWQ0MQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2JtcC5jcHAKQEAgLTAsMCArMSw1NTEgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKyNpbmNsdWRlICJncmZtdF9ibXAuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqIGZtdFNpZ25CbXAgPSAiQk0iOworCitHckZtdEJtcDo6R3JGbXRCbXAoKQoreworICAgIG1fc2lnbl9sZW4gPSAyOworICAgIG1fc2lnbmF0dXJlID0gZm10U2lnbkJtcDsKKyAgICBtX2Rlc2NyaXB0aW9uID0gIldpbmRvd3MgYml0bWFwICgqLmJtcDsqLmRpYikiOworfQorCisKK0dyRm10Qm1wOjp+R3JGbXRCbXAoKQoreworfQorCisKK0dyRm10UmVhZGVyKiBHckZtdEJtcDo6TmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdEJtcFJlYWRlciggZmlsZW5hbWUgKTsKK30KKworCitHckZtdFdyaXRlciogR3JGbXRCbXA6Ok5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIHJldHVybiBuZXcgR3JGbXRCbXBXcml0ZXIoIGZpbGVuYW1lICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiBCTVAgcmVhZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHckZtdEJtcFJlYWRlcjo6R3JGbXRCbXBSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFJlYWRlciggZmlsZW5hbWUgKQoreworICAgIG1fb2Zmc2V0ID0gLTE7Cit9CisKKworR3JGbXRCbXBSZWFkZXI6On5HckZtdEJtcFJlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRCbXBSZWFkZXI6OkNsb3NlKCkKK3sKKyAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICBHckZtdFJlYWRlcjo6Q2xvc2UoKTsKK30KKworCitib29sICBHckZtdEJtcFJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAKKyAgICBhc3NlcnQoIHN0cmxlbihtX2ZpbGVuYW1lKSAhPSAwICk7CisgICAgaWYoICFtX3N0cm0uT3BlbiggbV9maWxlbmFtZSApKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiggc2V0am1wKCBtX3N0cm0uSm1wQnVmKCkpID09IDAgKQorICAgIHsKKyAgICAgICAgbV9zdHJtLlNraXAoIDEwICk7CisgICAgICAgIG1fb2Zmc2V0ID0gbV9zdHJtLkdldERXb3JkKCk7CisKKyAgICAgICAgaW50ICBzaXplID0gbV9zdHJtLkdldERXb3JkKCk7CisKKyAgICAgICAgaWYoIHNpemUgPj0gMzYgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3dpZHRoICA9IG1fc3RybS5HZXREV29yZCgpOworICAgICAgICAgICAgbV9oZWlnaHQgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgICAgIG1fYnBwICAgID0gbV9zdHJtLkdldERXb3JkKCkgPj4gMTY7CisgICAgICAgICAgICBtX3JsZV9jb2RlID0gKEJtcENvbXByZXNzaW9uKW1fc3RybS5HZXREV29yZCgpOworICAgICAgICAgICAgbV9zdHJtLlNraXAoMTIpOworICAgICAgICAgICAgaW50IGNscnVzZWQgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgICAgIG1fc3RybS5Ta2lwKCBzaXplIC0gMzYgKTsKKworICAgICAgICAgICAgaWYoIG1fd2lkdGggPiAwICYmIG1faGVpZ2h0ID4gMCAmJgorICAgICAgICAgICAgICgoKG1fYnBwID09IDEgfHwgbV9icHAgPT0gNCB8fCBtX2JwcCA9PSA4IHx8CisgICAgICAgICAgICAgICAgbV9icHAgPT0gMjQgfHwgbV9icHAgPT0gMzIgKSAmJiBtX3JsZV9jb2RlID09IEJNUF9SR0IpIHx8CisgICAgICAgICAgICAgICAobV9icHAgPT0gMTYgJiYgKG1fcmxlX2NvZGUgPT0gQk1QX1JHQiB8fCBtX3JsZV9jb2RlID09IEJNUF9CSVRGSUVMRFMpKSB8fAorICAgICAgICAgICAgICAgKG1fYnBwID09IDQgJiYgbV9ybGVfY29kZSA9PSBCTVBfUkxFNCkgfHwKKyAgICAgICAgICAgICAgIChtX2JwcCA9PSA4ICYmIG1fcmxlX2NvZGUgPT0gQk1QX1JMRTgpKSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9pc2NvbG9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYoIG1fYnBwIDw9IDggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCBtX3BhbGV0dGUsIDAsIHNpemVvZihtX3BhbGV0dGUpKTsKKyAgICAgICAgICAgICAgICAgICAgbV9zdHJtLkdldEJ5dGVzKCBtX3BhbGV0dGUsIChjbHJ1c2VkID09IDA/IDE8PG1fYnBwIDogY2xydXNlZCkqNCApOworICAgICAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSBJc0NvbG9yUGFsZXR0ZSggbV9wYWxldHRlLCBtX2JwcCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBtX2JwcCA9PSAxNiAmJiBtX3JsZV9jb2RlID09IEJNUF9CSVRGSUVMRFMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHJlZG1hc2sgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGdyZWVubWFzayA9IG1fc3RybS5HZXREV29yZCgpOworICAgICAgICAgICAgICAgICAgICBpbnQgYmx1ZW1hc2sgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggYmx1ZW1hc2sgPT0gMHgxZiAmJiBncmVlbm1hc2sgPT0gMHgzZTAgJiYgcmVkbWFzayA9PSAweDdjMDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgbV9icHAgPSAxNTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggYmx1ZW1hc2sgPT0gMHgxZiAmJiBncmVlbm1hc2sgPT0gMHg3ZTAgJiYgcmVkbWFzayA9PSAweGY4MDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9icHAgPT0gMTYgJiYgbV9ybGVfY29kZSA9PSBCTVBfUkdCICkKKyAgICAgICAgICAgICAgICAgICAgbV9icHAgPSAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBzaXplID09IDEyICkKKyAgICAgICAgeworICAgICAgICAgICAgbV93aWR0aCAgPSBtX3N0cm0uR2V0V29yZCgpOworICAgICAgICAgICAgbV9oZWlnaHQgPSBtX3N0cm0uR2V0V29yZCgpOworICAgICAgICAgICAgbV9icHAgICAgPSBtX3N0cm0uR2V0RFdvcmQoKSA+PiAxNjsKKyAgICAgICAgICAgIG1fcmxlX2NvZGUgPSBCTVBfUkdCOworCisgICAgICAgICAgICBpZiggbV93aWR0aCA+IDAgJiYgbV9oZWlnaHQgPiAwICYmCisgICAgICAgICAgICAgICAobV9icHAgPT0gMSB8fCBtX2JwcCA9PSA0IHx8IG1fYnBwID09IDggfHwKKyAgICAgICAgICAgICAgICBtX2JwcCA9PSAyNCB8fCBtX2JwcCA9PSAzMiApKSAKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggbV9icHAgPD0gOCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1Y2hhciBidWZmZXJbMjU2KjNdOworICAgICAgICAgICAgICAgICAgICBpbnQgaiwgY2xydXNlZCA9IDEgPDwgbV9icHA7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggYnVmZmVyLCBjbHJ1c2VkKjMgKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMDsgaiA8IGNscnVzZWQ7IGorKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtqXS5iID0gYnVmZmVyWzMqaiswXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtqXS5nID0gYnVmZmVyWzMqaisxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtqXS5yID0gYnVmZmVyWzMqaisyXTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFyZXN1bHQgKQorICAgIHsKKyAgICAgICAgbV9vZmZzZXQgPSAtMTsKKyAgICAgICAgbV93aWR0aCA9IG1faGVpZ2h0ID0gLTE7CisgICAgICAgIG1fc3RybS5DbG9zZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgIEdyRm10Qm1wUmVhZGVyOjpSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKQoreworICAgIGNvbnN0ICBpbnQgYnVmZmVyX3NpemUgPSAxIDw8IDEyOworICAgIHVjaGFyICBidWZmZXJbYnVmZmVyX3NpemVdOworICAgIHVjaGFyICBiZ3JfYnVmZmVyW2J1ZmZlcl9zaXplXTsKKyAgICB1Y2hhciAgZ3JheV9wYWxldHRlWzI1Nl07CisgICAgYm9vbCAgIHJlc3VsdCA9IGZhbHNlOworICAgIHVjaGFyKiBzcmMgPSBidWZmZXI7CisgICAgdWNoYXIqIGJnciA9IGJncl9idWZmZXI7CisgICAgaW50ICBzcmNfcGl0Y2ggPSAoKG1fd2lkdGgqKG1fYnBwICE9IDE1ID8gbV9icHAgOiAxNikgKyA3KS84ICsgMykgJiAtNDsKKyAgICBpbnQgIG5jaCA9IGNvbG9yID8gMyA6IDE7CisgICAgaW50ICB3aWR0aDMgPSBtX3dpZHRoKm5jaDsKKyAgICBpbnQgIHk7CisKKyAgICBpZiggbV9vZmZzZXQgPCAwIHx8ICFtX3N0cm0uSXNPcGVuZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGRhdGEgKz0gKG1faGVpZ2h0IC0gMSkqc3RlcDsKKyAgICBzdGVwID0gLXN0ZXA7CisKKyAgICBpZiggKG1fYnBwICE9IDI0IHx8ICFjb2xvcikgJiYgc3JjX3BpdGNoKzMyID4gYnVmZmVyX3NpemUgKQorICAgICAgICBzcmMgPSBuZXcgdWNoYXJbc3JjX3BpdGNoKzMyXTsKKworICAgIGlmKCAhY29sb3IgKQorICAgIHsKKyAgICAgICAgaWYoIG1fYnBwIDw9IDggKQorICAgICAgICB7CisgICAgICAgICAgICBDdnRQYWxldHRlVG9HcmF5KCBtX3BhbGV0dGUsIGdyYXlfcGFsZXR0ZSwgMSA8PCBtX2JwcCApOworICAgICAgICB9CisgICAgICAgIGlmKCBtX3dpZHRoKjMgKyAzMiA+IGJ1ZmZlcl9zaXplICkgYmdyID0gbmV3IHVjaGFyW21fd2lkdGgqMyArIDMyXTsKKyAgICB9CisgICAgCisgICAgaWYoIHNldGptcCggbV9zdHJtLkptcEJ1ZigpKSA9PSAwICkKKyAgICB7CisgICAgICAgIG1fc3RybS5TZXRQb3MoIG1fb2Zmc2V0ICk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2goIG1fYnBwICkKKyAgICAgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiAxIEJQUCAqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICBGaWxsQ29sb3JSb3cxKCBjb2xvciA/IGRhdGEgOiBiZ3IsIHNyYywgbV93aWR0aCwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgaWYoICFjb2xvciApCisgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1IyR3JheV84dV9DM0MxUiggYmdyLCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogNCBCUFAgKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBpZiggbV9ybGVfY29kZSA9PSBCTVBfUkdCICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxDb2xvclJvdzQoIGRhdGEsIHNyYywgbV93aWR0aCwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5Um93NCggZGF0YSwgc3JjLCBtX3dpZHRoLCBncmF5X3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIG1fcmxlX2NvZGUgPT0gQk1QX1JMRTQgKSAvLyBybGU0IGNvbXByZXNzaW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIGxpbmVfZW5kID0gZGF0YSArIHdpZHRoMzsKKyAgICAgICAgICAgICAgICB5ID0gMDsKKworICAgICAgICAgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBjb2RlID0gbV9zdHJtLkdldFdvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IGNvZGUgJiAyNTU7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPj49IDg7CisgICAgICAgICAgICAgICAgICAgIGlmKCBsZW4gIT0gMCApIC8vIGVuY29kZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYWxldHRlRW50cnkgY2xyWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgZ3JheV9jbHJbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsclswXSA9IG1fcGFsZXR0ZVtjb2RlID4+IDRdOworICAgICAgICAgICAgICAgICAgICAgICAgY2xyWzFdID0gbV9wYWxldHRlW2NvZGUgJiAxNV07CisgICAgICAgICAgICAgICAgICAgICAgICBncmF5X2NsclswXSA9IGdyYXlfcGFsZXR0ZVtjb2RlID4+IDRdOworICAgICAgICAgICAgICAgICAgICAgICAgZ3JheV9jbHJbMV0gPSBncmF5X3BhbGV0dGVbY29kZSAmIDE1XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGVuZCA9IGRhdGEgKyBsZW4qbmNoOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGVuZCA+IGxpbmVfZW5kICkgZ290byBkZWNvZGVfcmxlNF9iYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRFX1BJWCggZGF0YSwgY2xyW3RdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSA9IGdyYXlfY2xyW3RdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgXj0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKCAoZGF0YSArPSBuY2gpIDwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggY29kZSA+IDIgKSAvLyBhYnNvbHV0ZSBtb2RlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBkYXRhICsgY29kZSpuY2ggPiBsaW5lX2VuZCApIGdvdG8gZGVjb2RlX3JsZTRfYmFkOworICAgICAgICAgICAgICAgICAgICAgICAgbV9zdHJtLkdldEJ5dGVzKCBzcmMsICgoKGNvZGUgKyAxKT4+MSkgKyAxKSAmIC0yICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29sb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGaWxsQ29sb3JSb3c0KCBkYXRhLCBzcmMsIGNvZGUsIG1fcGFsZXR0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGaWxsR3JheVJvdzQoIGRhdGEsIHNyYywgY29kZSwgZ3JheV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeF9zaGlmdDMgPSAoaW50KShsaW5lX2VuZCAtIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlfc2hpZnQgPSBtX2hlaWdodCAtIHk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2RlID09IDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhfc2hpZnQzID0gbV9zdHJtLkdldEJ5dGUoKSpuY2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zaGlmdCA9IG1fc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IHhfc2hpZnQzICsgKHlfc2hpZnQgKiB3aWR0aDMpICYgKChjb2RlID09IDApIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEZpbGxVbmlDb2xvciggZGF0YSwgbGluZV9lbmQsIHN0ZXAsIHdpZHRoMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSwgbV9oZWlnaHQsIHhfc2hpZnQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVswXSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGaWxsVW5pR3JheSggZGF0YSwgbGluZV9lbmQsIHN0ZXAsIHdpZHRoMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtX2hlaWdodCwgeF9zaGlmdDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5X3BhbGV0dGVbMF0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHkgPj0gbV9oZWlnaHQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKK2RlY29kZV9ybGU0X2JhZDogOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogOCBCUFAgKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICBpZiggbV9ybGVfY29kZSA9PSBCTVBfUkdCICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxDb2xvclJvdzgoIGRhdGEsIHNyYywgbV93aWR0aCwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5Um93OCggZGF0YSwgc3JjLCBtX3dpZHRoLCBncmF5X3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYoIG1fcmxlX2NvZGUgPT0gQk1QX1JMRTggKSAvLyBybGU4IGNvbXByZXNzaW9uCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIGxpbmVfZW5kID0gZGF0YSArIHdpZHRoMzsKKyAgICAgICAgICAgICAgICBpbnQgbGluZV9lbmRfZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgeSA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IG1fc3RybS5HZXRXb3JkKCk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSBjb2RlICYgMjU1OworICAgICAgICAgICAgICAgICAgICBjb2RlID4+PSA4OworICAgICAgICAgICAgICAgICAgICBpZiggbGVuICE9IDAgKSAvLyBlbmNvZGVkIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByZXZfeSA9IHk7CisgICAgICAgICAgICAgICAgICAgICAgICBsZW4gKj0gbmNoOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZGF0YSArIGxlbiA+IGxpbmVfZW5kICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRlY29kZV9ybGU4X2JhZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmlsbFVuaUNvbG9yKCBkYXRhLCBsaW5lX2VuZCwgc3RlcCwgd2lkdGgzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtX2hlaWdodCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtjb2RlXSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGaWxsVW5pR3JheSggZGF0YSwgbGluZV9lbmQsIHN0ZXAsIHdpZHRoMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtX2hlaWdodCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JheV9wYWxldHRlW2NvZGVdICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfZW5kX2ZsYWcgPSB5IC0gcHJldl95OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoIGNvZGUgPiAyICkgLy8gYWJzb2x1dGUgbW9kZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcHJldl95ID0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlMyA9IGNvZGUqbmNoOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggZGF0YSArIGNvZGUzID4gbGluZV9lbmQgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZGVjb2RlX3JsZThfYmFkOworICAgICAgICAgICAgICAgICAgICAgICAgbV9zdHJtLkdldEJ5dGVzKCBzcmMsIChjb2RlICsgMSkgJiAtMiApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmlsbENvbG9yUm93OCggZGF0YSwgc3JjLCBjb2RlLCBtX3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmlsbEdyYXlSb3c4KCBkYXRhLCBzcmMsIGNvZGUsIGdyYXlfcGFsZXR0ZSApOworCisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX2VuZF9mbGFnID0geSAtIHByZXZfeTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB4X3NoaWZ0MyA9IChpbnQpKGxpbmVfZW5kIC0gZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeV9zaGlmdCA9IG1faGVpZ2h0IC0geTsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvZGUgfHwgIWxpbmVfZW5kX2ZsYWcgfHwgeF9zaGlmdDMgPCB3aWR0aDMgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2RlID09IDIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9zaGlmdDMgPSBtX3N0cm0uR2V0Qnl0ZSgpKm5jaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9zaGlmdCA9IG1fc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9zaGlmdDMgKz0gKHlfc2hpZnQgKiB3aWR0aDMpICYgKChjb2RlID09IDApIC0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggeSA+PSBtX2hlaWdodCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEZpbGxVbmlDb2xvciggZGF0YSwgbGluZV9lbmQsIHN0ZXAsIHdpZHRoMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIG1faGVpZ2h0LCB4X3NoaWZ0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWxldHRlWzBdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmlsbFVuaUdyYXkoIGRhdGEsIGxpbmVfZW5kLCBzdGVwLCB3aWR0aDMsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHksIG1faGVpZ2h0LCB4X3NoaWZ0MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmF5X3BhbGV0dGVbMF0gKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB5ID49IG1faGVpZ2h0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfZW5kX2ZsYWcgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKK2RlY29kZV9ybGU4X2JhZDogOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIDE1IEJQUCAqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGNhc2UgMTU6CisgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX3N0cm0uR2V0Qnl0ZXMoIHNyYywgc3JjX3BpdGNoICk7CisgICAgICAgICAgICAgICAgaWYoICFjb2xvciApCisgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1I1NTUyR3JheV84dV9DMkMxUiggc3JjLCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSApOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjU1NTJCR1JfOHVfQzJDM1IoIHNyYywgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogMTYgQlBQICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICBpZiggIWNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjU2NTJHcmF5Xzh1X0MyQzFSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSNTY1MkJHUl84dV9DMkMzUiggc3JjLCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiAyNCBCUFAgKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjYXNlIDI0OgorICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbV9zdHJtLkdldEJ5dGVzKCBjb2xvciA/IGRhdGEgOiBzcmMsIHNyY19waXRjaCApOworICAgICAgICAgICAgICAgIGlmKCAhY29sb3IgKQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSMkdyYXlfOHVfQzNDMVIoIHNyYywgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogMzIgQlBQICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSAzMjoKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKworICAgICAgICAgICAgICAgIGlmKCAhY29sb3IgKQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJHcmF5Xzh1X0M0QzFSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJCR1JfOHVfQzRDM1IoIHNyYywgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzcmMgIT0gYnVmZmVyICkgZGVsZXRlW10gc3JjOworICAgIGlmKCBiZ3IgIT0gYmdyX2J1ZmZlciApIGRlbGV0ZVtdIGJncjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdEJtcFdyaXRlcjo6R3JGbXRCbXBXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFdyaXRlciggZmlsZW5hbWUgKQoreworfQorCisKK0dyRm10Qm1wV3JpdGVyOjp+R3JGbXRCbXBXcml0ZXIoKQoreworfQorCisKK2Jvb2wgIEdyRm10Qm1wV3JpdGVyOjpXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgLypkZXB0aCovLCBpbnQgY2hhbm5lbHMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgaW50IGZpbGVTdGVwID0gKHdpZHRoKmNoYW5uZWxzICsgMykgJiAtNDsKKyAgICB1Y2hhciB6ZXJvcGFkW10gPSAiXDBcMFwwXDAiOworCisgICAgYXNzZXJ0KCBkYXRhICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICYmIHN0ZXAgPj0gZmlsZVN0ZXAgKTsKKworICAgIGlmKCBtX3N0cm0uT3BlbiggbV9maWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIGludCAgYml0bWFwSGVhZGVyU2l6ZSA9IDQwOworICAgICAgICBpbnQgIHBhbGV0dGVTaXplID0gY2hhbm5lbHMgPiAxID8gMCA6IDEwMjQ7CisgICAgICAgIGludCAgaGVhZGVyU2l6ZSA9IDE0IC8qIGZpbGVoZWFkZXIgKi8gKyBiaXRtYXBIZWFkZXJTaXplICsgcGFsZXR0ZVNpemU7CisgICAgICAgIFBhbGV0dGVFbnRyeSBwYWxldHRlWzI1Nl07CisgICAgICAgIAorICAgICAgICAvLyB3cml0ZSBzaWduYXR1cmUgJ0JNJworICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGZtdFNpZ25CbXAsIChpbnQpc3RybGVuKGZtdFNpZ25CbXApICk7CisKKyAgICAgICAgLy8gd3JpdGUgZmlsZSBoZWFkZXIKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBmaWxlU3RlcCpoZWlnaHQgKyBoZWFkZXJTaXplICk7IC8vIGZpbGUgc2l6ZQorICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIDAgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBoZWFkZXJTaXplICk7CisKKyAgICAgICAgLy8gd3JpdGUgYml0bWFwIGhlYWRlcgorICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIGJpdG1hcEhlYWRlclNpemUgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCB3aWR0aCApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIGhlaWdodCApOworICAgICAgICBtX3N0cm0uUHV0V29yZCggMSApOworICAgICAgICBtX3N0cm0uUHV0V29yZCggY2hhbm5lbHMgPDwgMyApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIEJNUF9SR0IgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCAwICk7CisgICAgICAgIG1fc3RybS5QdXREV29yZCggMCApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIDAgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCAwICk7CisgICAgICAgIG1fc3RybS5QdXREV29yZCggMCApOworCisgICAgICAgIGlmKCBjaGFubmVscyA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgRmlsbEdyYXlQYWxldHRlKCBwYWxldHRlLCA4ICk7CisgICAgICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIHBhbGV0dGUsIHNpemVvZihwYWxldHRlKSk7CisgICAgICAgIH0KKworICAgICAgICB3aWR0aCAqPSBjaGFubmVsczsKKyAgICAgICAgZGF0YSArPSBzdGVwKihoZWlnaHQgLSAxKTsKKyAgICAgICAgZm9yKCA7IGhlaWdodC0tOyBkYXRhIC09IHN0ZXAgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGRhdGEsIHdpZHRoICk7CisgICAgICAgICAgICBpZiggZmlsZVN0ZXAgPiB3aWR0aCApCisgICAgICAgICAgICAgICAgbV9zdHJtLlB1dEJ5dGVzKCB6ZXJvcGFkLCBmaWxlU3RlcCAtIHdpZHRoICk7CisgICAgICAgIH0KKworICAgICAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9ibXAuaCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2JtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYjE1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9ibXAuaApAQCAtMCwwICsxLDEwNyBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0dSRk1UX0JNUF9IXworI2RlZmluZSBfR1JGTVRfQk1QX0hfCisKKyNpbmNsdWRlICJncmZtdF9iYXNlLmgiCisKK2VudW0gQm1wQ29tcHJlc3Npb24KK3sKKyAgICBCTVBfUkdCID0gMCwKKyAgICBCTVBfUkxFOCA9IDEsCisgICAgQk1QX1JMRTQgPSAyLAorICAgIEJNUF9CSVRGSUVMRFMgPSAzCit9OworCisKKy8vIFdpbmRvd3MgQml0bWFwIHJlYWRlcgorY2xhc3MgR3JGbXRCbXBSZWFkZXIgOiBwdWJsaWMgR3JGbXRSZWFkZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdEJtcFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRCbXBSZWFkZXIoKTsKKyAgICAKKyAgICBib29sICBSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKTsKKyAgICBib29sICBSZWFkSGVhZGVyKCk7CisgICAgdm9pZCAgQ2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIAorICAgIFJMQnl0ZVN0cmVhbSAgICBtX3N0cm07CisgICAgUGFsZXR0ZUVudHJ5ICAgIG1fcGFsZXR0ZVsyNTZdOworICAgIGludCAgICAgICAgICAgICBtX2JwcDsKKyAgICBpbnQgICAgICAgICAgICAgbV9vZmZzZXQ7CisgICAgQm1wQ29tcHJlc3Npb24gIG1fcmxlX2NvZGU7Cit9OworCisKKy8vIC4uLiB3cml0ZXIKK2NsYXNzIEdyRm10Qm1wV3JpdGVyIDogcHVibGljIEdyRm10V3JpdGVyCit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRCbXBXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10Qm1wV3JpdGVyKCk7CisgICAgCisgICAgYm9vbCAgV3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKTsKK3Byb3RlY3RlZDoKKworICAgIFdMQnl0ZVN0cmVhbSAgbV9zdHJtOworfTsKKworCisvLyAuLi4gYW5kIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdEJtcCA6IHB1YmxpYyBHckZtdEZpbHRlckZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdEJtcCgpOworICAgIH5HckZtdEJtcCgpOworCisgICAgR3JGbXRSZWFkZXIqIE5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBHckZtdFdyaXRlciogTmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworCit9OworCisjZW5kaWYvKl9HUkZNVF9CTVBfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfZXhyLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2V4ci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQwMTNkNgotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2V4ci5jcHAKQEAgLTAsMCArMSw3MzcgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKworI2lmZGVmIEhBVkVfSUxNSU1GCisKKyNpbmNsdWRlIDxPcGVuRVhSL0ltZkhlYWRlci5oPgorI2luY2x1ZGUgPE9wZW5FWFIvSW1mSW5wdXRGaWxlLmg+CisjaW5jbHVkZSA8T3BlbkVYUi9JbWZPdXRwdXRGaWxlLmg+CisjaW5jbHVkZSA8T3BlbkVYUi9JbWZDaGFubmVsTGlzdC5oPgorI2luY2x1ZGUgPE9wZW5FWFIvSW1mU3RhbmRhcmRBdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8T3BlbkVYUi9oYWxmLmg+CisjaW5jbHVkZSAiZ3JmbXRfZXhyLmgiCisKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKyNwcmFnbWEgY29tbWVudChsaWIsICJIYWxmLmxpYiIpCisjcHJhZ21hIGNvbW1lbnQobGliLCAiSWV4LmxpYiIpCisjcHJhZ21hIGNvbW1lbnQobGliLCAiSWxtSW1mLmxpYiIpCisjcHJhZ21hIGNvbW1lbnQobGliLCAiSWxtVGhyZWFkLmxpYiIpCisjcHJhZ21hIGNvbW1lbnQobGliLCAiSW1hdGgubGliIikKKworI3VuZGVmIFVJTlQKKyNkZWZpbmUgVUlOVCAoKEltZjo6UGl4ZWxUeXBlKTApCisjdW5kZWYgSEFMRgorI2RlZmluZSBIQUxGICgoSW1mOjpQaXhlbFR5cGUpMSkKKyN1bmRlZiBGTE9BVAorI2RlZmluZSBGTE9BVCAoKEltZjo6UGl4ZWxUeXBlKTIpCisjdW5kZWYgdWludAorI2RlZmluZSB1aW50IHVuc2lnbmVkCisKKyNlbmRpZgorCisvLyBFeHIgRmlsdGVyIEZhY3RvcnkKK0dyRm10RXhyOjpHckZtdEV4cigpCit7CisgICAgbV9zaWduX2xlbiA9IDQ7CisgICAgbV9zaWduYXR1cmUgPSAiXHg3Nlx4MmZceDMxXHgwMSI7CisgICAgbV9kZXNjcmlwdGlvbiA9ICJPcGVuRVhSIEltYWdlIGZpbGVzICgqLmV4cikiOworfQorCisKK0dyRm10RXhyOjp+R3JGbXRFeHIoKQoreworfQorCisKK0dyRm10UmVhZGVyKiBHckZtdEV4cjo6TmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdEV4clJlYWRlciggZmlsZW5hbWUgKTsKK30KKworCitHckZtdFdyaXRlciogR3JGbXRFeHI6Ok5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIHJldHVybiBuZXcgR3JGbXRFeHJXcml0ZXIoIGZpbGVuYW1lICk7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3JGbXRFeHJSZWFkZXIgLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdEV4clJlYWRlcjo6R3JGbXRFeHJSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFJlYWRlciggZmlsZW5hbWUgKQoreworICAgIG1fZmlsZSA9IG5ldyBJbnB1dEZpbGUoIGZpbGVuYW1lICk7CisgICAgbV9yZWQgPSBtX2dyZWVuID0gbV9ibHVlID0gMDsKK30KKworCitHckZtdEV4clJlYWRlcjo6fkdyRm10RXhyUmVhZGVyKCkKK3sKKyAgICBDbG9zZSgpOworfQorCisKK3ZvaWQgIEdyRm10RXhyUmVhZGVyOjpDbG9zZSgpCit7CisgICAgaWYoIG1fZmlsZSApCisgICAgeworICAgICAgICBkZWxldGUgbV9maWxlOworICAgICAgICBtX2ZpbGUgPSAwOworICAgIH0KKworICAgIEdyRm10UmVhZGVyOjpDbG9zZSgpOworfQorCitib29sICBHckZtdEV4clJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIGlmKCAhbV9maWxlICkgLy8gcHJvYmFibHkgcGFyYW5vaWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbV9kYXRhd2luZG93ID0gbV9maWxlLT5oZWFkZXIoKS5kYXRhV2luZG93KCk7CisgICAgbV93aWR0aCA9IG1fZGF0YXdpbmRvdy5tYXgueCAtIG1fZGF0YXdpbmRvdy5taW4ueCArIDE7CisgICAgbV9oZWlnaHQgPSBtX2RhdGF3aW5kb3cubWF4LnkgLSBtX2RhdGF3aW5kb3cubWluLnkgKyAxOworCisgICAgLy8gdGhlIHR5cGUgSEFMRiBpcyBjb252ZXJ0ZWQgdG8gMzIgYml0IGZsb2F0CisgICAgLy8gYW5kIHRoZSBvdGhlciB0eXBlcyBzdXBwb3J0ZWQgYnkgT3BlbkVYUiBhcmUgMzIgYml0IGFueXdheQorICAgIG1fYml0X2RlcHRoID0gMzI7CisKKyAgICBpZiggaGFzQ2hyb21hdGljaXRpZXMoIG1fZmlsZS0+aGVhZGVyKCkgKSkKKyAgICAgICAgbV9jaHJvbWEgPSBjaHJvbWF0aWNpdGllcyggbV9maWxlLT5oZWFkZXIoKSApOworCisgICAgY29uc3QgQ2hhbm5lbExpc3QgJmNoYW5uZWxzID0gbV9maWxlLT5oZWFkZXIoKS5jaGFubmVscygpOworICAgIG1fcmVkID0gY2hhbm5lbHMuZmluZENoYW5uZWwoICJSIiApOworICAgIG1fZ3JlZW4gPSBjaGFubmVscy5maW5kQ2hhbm5lbCggIkciICk7CisgICAgbV9ibHVlID0gY2hhbm5lbHMuZmluZENoYW5uZWwoICJCIiApOworICAgIGlmKCBtX3JlZCB8fCBtX2dyZWVuIHx8IG1fYmx1ZSApCisgICAgeworICAgICAgICBtX2lzY29sb3IgPSB0cnVlOworICAgICAgICBtX2lzY2hyb21hID0gZmFsc2U7CisgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIG1fZ3JlZW4gPSBjaGFubmVscy5maW5kQ2hhbm5lbCggIlkiICk7CisgICAgICAgIGlmKCBtX2dyZWVuICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9pc2Nocm9tYSA9IHRydWU7CisgICAgICAgICAgICBtX3JlZCA9IGNoYW5uZWxzLmZpbmRDaGFubmVsKCAiUlkiICk7CisgICAgICAgICAgICBtX2JsdWUgPSBjaGFubmVscy5maW5kQ2hhbm5lbCggIkJZIiApOworICAgICAgICAgICAgbV9pc2NvbG9yID0gKG1fYmx1ZSB8fCBtX3JlZCk7CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgIH0KKworICAgIGlmKCByZXN1bHQgKQorICAgIHsKKyAgICAgICAgaW50IHVpbnRjbnQgPSAwOworICAgICAgICBpbnQgY2hjbnQgPSAwOworICAgICAgICBpZiggbV9yZWQgKQorICAgICAgICB7CisgICAgICAgICAgICBjaGNudCsrOworICAgICAgICAgICAgdWludGNudCArPSAoIG1fcmVkLT50eXBlID09IFVJTlQgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggbV9ncmVlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoY250Kys7CisgICAgICAgICAgICB1aW50Y250ICs9ICggbV9ncmVlbi0+dHlwZSA9PSBVSU5UICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIG1fYmx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoY250Kys7CisgICAgICAgICAgICB1aW50Y250ICs9ICggbV9ibHVlLT50eXBlID09IFVJTlQgKTsKKyAgICAgICAgfQorICAgICAgICBtX3R5cGUgPSAoY2hjbnQgPT0gdWludGNudCkgPyBVSU5UIDogRkxPQVQ7CisgICAgCisgICAgICAgIG1faXNmbG9hdCA9IChtX3R5cGUgPT0gRkxPQVQpOworICAgIH0KKworICAgIGlmKCAhcmVzdWx0ICkKKyAgICAgICAgQ2xvc2UoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCAgR3JGbXRFeHJSZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgYm9vbCBqdXN0Y29weSA9IG1fbmF0aXZlX2RlcHRoOworICAgIGJvb2wgY2hyb21hdG9yZ2IgPSBmYWxzZTsKKyAgICBib29sIHJnYnRvZ3JheSA9IGZhbHNlOworICAgIGJvb2wgcmVzdWx0ID0gdHJ1ZTsKKyAgICBGcmFtZUJ1ZmZlciBmcmFtZTsKKyAgICBpbnQgeHNhbXBsZVszXSA9IHsxLCAxLCAxfTsKKyAgICBjaGFyICpidWZmZXI7CisgICAgaW50IHhzdGVwOworICAgIGludCB5c3RlcDsKKworICAgIHhzdGVwID0gbV9uYXRpdmVfZGVwdGggPyA0IDogMTsKKworICAgIGlmKCAhbV9uYXRpdmVfZGVwdGggfHwgKCFjb2xvciAmJiBtX2lzY29sb3IgKSkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopbmV3IGZsb2F0WyBtX3dpZHRoICogMyBdOworICAgICAgICB5c3RlcCA9IDA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopZGF0YTsKKyAgICAgICAgeXN0ZXAgPSBzdGVwOworICAgIH0KKworICAgIGlmKCBtX2lzY2hyb21hICkKKyAgICB7CisgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtX2lzY29sb3IgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBtX2JsdWUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUuaW5zZXJ0KCAiQlkiLCBTbGljZSggbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIC0gbV9kYXRhd2luZG93Lm1pbi54ICogMTIgLSBtX2RhdGF3aW5kb3cubWluLnkgKiB5c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCB5c3RlcCwgbV9ibHVlLT54U2FtcGxpbmcsIG1fYmx1ZS0+eVNhbXBsaW5nLCAwLjAgKSk7CisgICAgICAgICAgICAgICAgICAgIHhzYW1wbGVbMF0gPSBtX2JsdWUtPnlTYW1wbGluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG1fZ3JlZW4gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUuaW5zZXJ0KCAiWSIsIFNsaWNlKCBtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBtX2RhdGF3aW5kb3cubWluLnggKiAxMiAtIG1fZGF0YXdpbmRvdy5taW4ueSAqIHlzdGVwICsgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCB5c3RlcCwgbV9ncmVlbi0+eFNhbXBsaW5nLCBtX2dyZWVuLT55U2FtcGxpbmcsIDAuMCApKTsKKyAgICAgICAgICAgICAgICAgICAgeHNhbXBsZVsxXSA9IG1fZ3JlZW4tPnlTYW1wbGluZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIG1fcmVkICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lLmluc2VydCggIlJZIiwgU2xpY2UoIG1fdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIG1fZGF0YXdpbmRvdy5taW4ueCAqIDEyIC0gbV9kYXRhd2luZG93Lm1pbi55ICogeXN0ZXAgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIHlzdGVwLCBtX3JlZC0+eFNhbXBsaW5nLCBtX3JlZC0+eVNhbXBsaW5nLCAwLjAgKSk7CisgICAgICAgICAgICAgICAgICAgIHhzYW1wbGVbMl0gPSBtX3JlZC0+eVNhbXBsaW5nOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjaHJvbWF0b3JnYiA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZnJhbWUuaW5zZXJ0KCAiWSIsIFNsaWNlKCBtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBtX2RhdGF3aW5kb3cubWluLnggKiAxMiAtIG1fZGF0YXdpbmRvdy5taW4ueSAqIHlzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIHlzdGVwLCBtX2dyZWVuLT54U2FtcGxpbmcsIG1fZ3JlZW4tPnlTYW1wbGluZywgMC4wICkpOworICAgICAgICAgICAgICAgIGZyYW1lLmluc2VydCggIlkiLCBTbGljZSggbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIC0gbV9kYXRhd2luZG93Lm1pbi54ICogMTIgLSBtX2RhdGF3aW5kb3cubWluLnkgKiB5c3RlcCArIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiwgeXN0ZXAsIG1fZ3JlZW4tPnhTYW1wbGluZywgbV9ncmVlbi0+eVNhbXBsaW5nLCAwLjAgKSk7CisgICAgICAgICAgICAgICAgZnJhbWUuaW5zZXJ0KCAiWSIsIFNsaWNlKCBtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgLSBtX2RhdGF3aW5kb3cubWluLnggKiAxMiAtIG1fZGF0YXdpbmRvdy5taW4ueSAqIHlzdGVwICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCB5c3RlcCwgbV9ncmVlbi0+eFNhbXBsaW5nLCBtX2dyZWVuLT55U2FtcGxpbmcsIDAuMCApKTsKKyAgICAgICAgICAgICAgICB4c2FtcGxlWzBdID0gbV9ncmVlbi0+eVNhbXBsaW5nOworICAgICAgICAgICAgICAgIHhzYW1wbGVbMV0gPSBtX2dyZWVuLT55U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgeHNhbXBsZVsyXSA9IG1fZ3JlZW4tPnlTYW1wbGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lLmluc2VydCggIlkiLCBTbGljZSggbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIG1fZGF0YXdpbmRvdy5taW4ueCAqIDQgLSBtX2RhdGF3aW5kb3cubWluLnkgKiB5c3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA0LCB5c3RlcCwgbV9ncmVlbi0+eFNhbXBsaW5nLCBtX2dyZWVuLT55U2FtcGxpbmcsIDAuMCApKTsKKyAgICAgICAgICAgIHhzYW1wbGVbMF0gPSBtX2dyZWVuLT55U2FtcGxpbmc7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIG1fYmx1ZSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lLmluc2VydCggIkIiLCBTbGljZSggbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIG1fZGF0YXdpbmRvdy5taW4ueCAqIDEyIC0gbV9kYXRhd2luZG93Lm1pbi55ICogeXN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIHlzdGVwLCBtX2JsdWUtPnhTYW1wbGluZywgbV9ibHVlLT55U2FtcGxpbmcsIDAuMCApKTsKKyAgICAgICAgICAgIHhzYW1wbGVbMF0gPSBtX2JsdWUtPnlTYW1wbGluZzsKKyAgICAgICAgfQorICAgICAgICBpZiggbV9ncmVlbiApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZyYW1lLmluc2VydCggIkciLCBTbGljZSggbV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciAtIG1fZGF0YXdpbmRvdy5taW4ueCAqIDEyIC0gbV9kYXRhd2luZG93Lm1pbi55ICogeXN0ZXAgKyA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyLCB5c3RlcCwgbV9ncmVlbi0+eFNhbXBsaW5nLCBtX2dyZWVuLT55U2FtcGxpbmcsIDAuMCApKTsKKyAgICAgICAgICAgIHhzYW1wbGVbMV0gPSBtX2dyZWVuLT55U2FtcGxpbmc7CisgICAgICAgIH0KKyAgICAgICAgaWYoIG1fcmVkICkKKyAgICAgICAgeworICAgICAgICAgICAgZnJhbWUuaW5zZXJ0KCAiUiIsIFNsaWNlKCBtX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIC0gbV9kYXRhd2luZG93Lm1pbi54ICogMTIgLSBtX2RhdGF3aW5kb3cubWluLnkgKiB5c3RlcCArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIsIHlzdGVwLCBtX3JlZC0+eFNhbXBsaW5nLCBtX3JlZC0+eVNhbXBsaW5nLCAwLjAgKSk7CisgICAgICAgICAgICB4c2FtcGxlWzJdID0gbV9yZWQtPnlTYW1wbGluZzsKKyAgICAgICAgfQorICAgICAgICBpZihjb2xvciA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZ2J0b2dyYXkgPSB0cnVlOworICAgICAgICAgICAganVzdGNvcHkgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZmlsZS0+c2V0RnJhbWVCdWZmZXIoIGZyYW1lICk7CisgICAgaWYoIGp1c3Rjb3B5ICkKKyAgICB7CisgICAgICAgIG1fZmlsZS0+cmVhZFBpeGVscyggbV9kYXRhd2luZG93Lm1pbi55LCBtX2RhdGF3aW5kb3cubWF4LnkgKTsKKworICAgICAgICBpZiggY29sb3IgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV9ibHVlICYmIChtX2JsdWUtPnhTYW1wbGluZyAhPSAxIHx8IG1fYmx1ZS0+eVNhbXBsaW5nICE9IDEpICkKKyAgICAgICAgICAgICAgICBVcFNhbXBsZSggZGF0YSwgMywgc3RlcCAvIHhzdGVwLCB4c2FtcGxlWzBdLCBtX2JsdWUtPnlTYW1wbGluZyApOworICAgICAgICAgICAgaWYoIG1fZ3JlZW4gJiYgKG1fZ3JlZW4tPnhTYW1wbGluZyAhPSAxIHx8IG1fZ3JlZW4tPnlTYW1wbGluZyAhPSAxKSApCisgICAgICAgICAgICAgICAgVXBTYW1wbGUoIGRhdGEgKyB4c3RlcCwgMywgc3RlcCAvIHhzdGVwLCB4c2FtcGxlWzFdLCBtX2dyZWVuLT55U2FtcGxpbmcgKTsKKyAgICAgICAgICAgIGlmKCBtX3JlZCAmJiAobV9yZWQtPnhTYW1wbGluZyAhPSAxIHx8IG1fcmVkLT55U2FtcGxpbmcgIT0gMSkgKQorICAgICAgICAgICAgICAgIFVwU2FtcGxlKCBkYXRhICsgMiAqIHhzdGVwLCAzLCBzdGVwIC8geHN0ZXAsIHhzYW1wbGVbMl0sIG1fcmVkLT55U2FtcGxpbmcgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBtX2dyZWVuICYmIChtX2dyZWVuLT54U2FtcGxpbmcgIT0gMSB8fCBtX2dyZWVuLT55U2FtcGxpbmcgIT0gMSkgKQorICAgICAgICAgICAgVXBTYW1wbGUoIGRhdGEsIDEsIHN0ZXAgLyB4c3RlcCwgeHNhbXBsZVswXSwgbV9ncmVlbi0+eVNhbXBsaW5nICk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHVjaGFyICpvdXQgPSBkYXRhOworICAgICAgICBpbnQgeCwgeTsKKyAgICAgICAgZm9yKCB5ID0gbV9kYXRhd2luZG93Lm1pbi55OyB5IDw9IG1fZGF0YXdpbmRvdy5tYXgueTsgeSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgbV9maWxlLT5yZWFkUGl4ZWxzKCB5LCB5ICk7CisKKyAgICAgICAgICAgIGlmKCByZ2J0b2dyYXkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCB4c2FtcGxlWzBdICE9IDEgKQorICAgICAgICAgICAgICAgICAgICBVcFNhbXBsZVgoIChmbG9hdCAqKWJ1ZmZlciwgMywgeHNhbXBsZVswXSApOworICAgICAgICAgICAgICAgIGlmKCB4c2FtcGxlWzFdICE9IDEgKQorICAgICAgICAgICAgICAgICAgICBVcFNhbXBsZVgoIChmbG9hdCAqKWJ1ZmZlciArIDQsIDMsIHhzYW1wbGVbMV0gKTsKKyAgICAgICAgICAgICAgICBpZiggeHNhbXBsZVsyXSAhPSAxICkKKyAgICAgICAgICAgICAgICAgICAgVXBTYW1wbGVYKCAoZmxvYXQgKilidWZmZXIgKyA4LCAzLCB4c2FtcGxlWzJdICk7CisKKyAgICAgICAgICAgICAgICBSR0JUb0dyYXkoIChmbG9hdCAqKWJ1ZmZlciwgKGZsb2F0ICopb3V0ICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIHhzYW1wbGVbMF0gIT0gMSApCisgICAgICAgICAgICAgICAgICAgIFVwU2FtcGxlWCggKGZsb2F0ICopYnVmZmVyLCAzLCB4c2FtcGxlWzBdICk7CisgICAgICAgICAgICAgICAgaWYoIHhzYW1wbGVbMV0gIT0gMSApCisgICAgICAgICAgICAgICAgICAgIFVwU2FtcGxlWCggKGZsb2F0ICopKGJ1ZmZlciArIDQpLCAzLCB4c2FtcGxlWzFdICk7CisgICAgICAgICAgICAgICAgaWYoIHhzYW1wbGVbMl0gIT0gMSApCisgICAgICAgICAgICAgICAgICAgIFVwU2FtcGxlWCggKGZsb2F0ICopKGJ1ZmZlciArIDgpLCAzLCB4c2FtcGxlWzJdICk7CisKKyAgICAgICAgICAgICAgICBpZiggY2hyb21hdG9yZ2IgKQorICAgICAgICAgICAgICAgICAgICBDaHJvbWFUb0JHUiggKGZsb2F0ICopYnVmZmVyLCAxLCBzdGVwICk7CisKKyAgICAgICAgICAgICAgICBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpmaSA9IChmbG9hdCAqKWJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IG1fd2lkdGggKiAzOyB4KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ID0gY3ZSb3VuZChmaVt4XSo1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dFt4XSA9IENWX0NBU1RfOFUodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdWludCAqdWkgPSAodWludCAqKWJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IG1fd2lkdGggKiAzOyB4KyspCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQgdCA9IHVpW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0W3hdID0gQ1ZfQ0FTVF84VSh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3V0ICs9IHN0ZXA7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1fYmx1ZSAmJiAobV9ibHVlLT54U2FtcGxpbmcgIT0gMSB8fCBtX2JsdWUtPnlTYW1wbGluZyAhPSAxKSApCisgICAgICAgICAgICAgICAgVXBTYW1wbGVZKCBkYXRhLCAzLCBzdGVwIC8geHN0ZXAsIG1fYmx1ZS0+eVNhbXBsaW5nICk7CisgICAgICAgICAgICBpZiggbV9ncmVlbiAmJiAobV9ncmVlbi0+eFNhbXBsaW5nICE9IDEgfHwgbV9ncmVlbi0+eVNhbXBsaW5nICE9IDEpICkKKyAgICAgICAgICAgICAgICBVcFNhbXBsZVkoIGRhdGEgKyB4c3RlcCwgMywgc3RlcCAvIHhzdGVwLCBtX2dyZWVuLT55U2FtcGxpbmcgKTsKKyAgICAgICAgICAgIGlmKCBtX3JlZCAmJiAobV9yZWQtPnhTYW1wbGluZyAhPSAxIHx8IG1fcmVkLT55U2FtcGxpbmcgIT0gMSkgKQorICAgICAgICAgICAgICAgIFVwU2FtcGxlWSggZGF0YSArIDIgKiB4c3RlcCwgMywgc3RlcCAvIHhzdGVwLCBtX3JlZC0+eVNhbXBsaW5nICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiggbV9ncmVlbiAmJiAobV9ncmVlbi0+eFNhbXBsaW5nICE9IDEgfHwgbV9ncmVlbi0+eVNhbXBsaW5nICE9IDEpICkKKyAgICAgICAgICAgIFVwU2FtcGxlWSggZGF0YSwgMSwgc3RlcCAvIHhzdGVwLCBtX2dyZWVuLT55U2FtcGxpbmcgKTsKKyAgICB9CisKKyAgICBpZiggY2hyb21hdG9yZ2IgKQorICAgICAgICBDaHJvbWFUb0JHUiggKGZsb2F0ICopZGF0YSwgbV9oZWlnaHQsIHN0ZXAgLyB4c3RlcCApOworCisgICAgQ2xvc2UoKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorLy8gb24gZW50cnkgcGl4ZWwgdmFsdWVzIGFyZSBzdG9yZWQgcGFja2VkIGluIHRoZSB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgaW1hZ2UKKy8vIHRoaXMgZnVuY3Rpb25zIGV4cGFuZHMgdGhlbSBieSBkdXBsaWNhdGlvbiB0byBjb3ZlciB0aGUgd2hvbGUgaW1hZ2UKKyAqLwordm9pZCAgR3JGbXRFeHJSZWFkZXI6OlVwU2FtcGxlKCB1Y2hhciAqZGF0YSwgaW50IHhzdGVwLCBpbnQgeXN0ZXAsIGludCB4c2FtcGxlLCBpbnQgeXNhbXBsZSApCit7CisgICAgZm9yKCBpbnQgeSA9IChtX2hlaWdodCAtIDEpIC8geXNhbXBsZSwgeXJlID0gbV9oZWlnaHQgLSB5c2FtcGxlOyB5ID49IDA7IHktLSwgeXJlIC09IHlzYW1wbGUgKQorICAgIHsKKyAgICAgICAgZm9yKCBpbnQgeCA9IChtX3dpZHRoIC0gMSkgLyB4c2FtcGxlLCB4cmUgPSBtX3dpZHRoIC0geHNhbXBsZTsgeCA+PSAwOyB4LS0sIHhyZSAtPSB4c2FtcGxlICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCB5c2FtcGxlOyBpKysgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggaW50IG4gPSAwOyBuIDwgeHNhbXBsZTsgbisrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAhbV9uYXRpdmVfZGVwdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsoeXJlICsgaSkgKiB5c3RlcCArICh4cmUgKyBuKSAqIHhzdGVwXSA9IGRhdGFbeSAqIHlzdGVwICsgeCAqIHhzdGVwXTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZmxvYXQgKilkYXRhKVsoeXJlICsgaSkgKiB5c3RlcCArICh4cmUgKyBuKSAqIHhzdGVwXSA9ICgoZmxvYXQgKilkYXRhKVt5ICogeXN0ZXAgKyB4ICogeHN0ZXBdOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAoKHVpbnQgKilkYXRhKVsoeXJlICsgaSkgKiB5c3RlcCArICh4cmUgKyBuKSAqIHhzdGVwXSA9ICgodWludCAqKWRhdGEpW3kgKiB5c3RlcCArIHggKiB4c3RlcF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKioKKy8vIG9uIGVudHJ5IHBpeGVsIHZhbHVlcyBhcmUgc3RvcmVkIHBhY2tlZCBpbiB0aGUgdXBwZXIgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlCisvLyB0aGlzIGZ1bmN0aW9ucyBleHBhbmRzIHRoZW0gYnkgZHVwbGljYXRpb24gdG8gY292ZXIgdGhlIHdob2xlIGltYWdlCisgKi8KK3ZvaWQgIEdyRm10RXhyUmVhZGVyOjpVcFNhbXBsZVgoIGZsb2F0ICpkYXRhLCBpbnQgeHN0ZXAsIGludCB4c2FtcGxlICkKK3sKKyAgICBmb3IoIGludCB4ID0gKG1fd2lkdGggLSAxKSAvIHhzYW1wbGUsIHhyZSA9IG1fd2lkdGggLSB4c2FtcGxlOyB4ID49IDA7IHgtLSwgeHJlIC09IHhzYW1wbGUgKQorICAgIHsKKyAgICAgICAgZm9yKCBpbnQgbiA9IDA7IG4gPCB4c2FtcGxlOyBuKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgICAgICAoKGZsb2F0ICopZGF0YSlbKHhyZSArIG4pICogeHN0ZXBdID0gKChmbG9hdCAqKWRhdGEpW3ggKiB4c3RlcF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKCh1aW50ICopZGF0YSlbKHhyZSArIG4pICogeHN0ZXBdID0gKCh1aW50ICopZGF0YSlbeCAqIHhzdGVwXTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisvLyBvbiBlbnRyeSBwaXhlbCB2YWx1ZXMgYXJlIHN0b3JlZCBwYWNrZWQgaW4gdGhlIHVwcGVyIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQorLy8gdGhpcyBmdW5jdGlvbnMgZXhwYW5kcyB0aGVtIGJ5IGR1cGxpY2F0aW9uIHRvIGNvdmVyIHRoZSB3aG9sZSBpbWFnZQorICovCit2b2lkICBHckZtdEV4clJlYWRlcjo6VXBTYW1wbGVZKCB1Y2hhciAqZGF0YSwgaW50IHhzdGVwLCBpbnQgeXN0ZXAsIGludCB5c2FtcGxlICkKK3sKKyAgICBmb3IoIGludCB5ID0gbV9oZWlnaHQgLSB5c2FtcGxlLCB5cmUgPSBtX2hlaWdodCAtIHlzYW1wbGU7IHkgPj0gMDsgeSAtPSB5c2FtcGxlLCB5cmUgLT0geXNhbXBsZSApCisgICAgeworICAgICAgICBmb3IoIGludCB4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAxOyBpIDwgeXNhbXBsZTsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggIW1fbmF0aXZlX2RlcHRoICkKKyAgICAgICAgICAgICAgICAgICAgZGF0YVsoeXJlICsgaSkgKiB5c3RlcCArIHggKiB4c3RlcF0gPSBkYXRhW3kgKiB5c3RlcCArIHggKiB4c3RlcF07CisgICAgICAgICAgICAgICAgZWxzZSBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCAqKWRhdGEpWyh5cmUgKyBpKSAqIHlzdGVwICsgeCAqIHhzdGVwXSA9ICgoZmxvYXQgKilkYXRhKVt5ICogeXN0ZXAgKyB4ICogeHN0ZXBdOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKCh1aW50ICopZGF0YSlbKHlyZSArIGkpICogeXN0ZXAgKyB4ICogeHN0ZXBdID0gKCh1aW50ICopZGF0YSlbeSAqIHlzdGVwICsgeCAqIHhzdGVwXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisvLyBhbGdvcml0aG0gZnJvbSBJbWZSZ2JhWWNhLmNwcAorICovCit2b2lkICBHckZtdEV4clJlYWRlcjo6Q2hyb21hVG9CR1IoIGZsb2F0ICpkYXRhLCBpbnQgbnVtbGluZXMsIGludCBzdGVwICkKK3sKKyAgICBpbnQgeCwgeSwgdDsKKyAgICAKKyAgICBmb3IoIHkgPSAwOyB5IDwgbnVtbGluZXM7IHkrKyApCisgICAgeworICAgICAgICBmb3IoIHggPSAwOyB4IDwgbV93aWR0aDsgeCsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZG91YmxlIGIsIFksIHI7CisgICAgICAgICAgICBpZiggIW1fbmF0aXZlX2RlcHRoICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gKCh1Y2hhciAqKWRhdGEpW3kgKiBzdGVwICsgeCAqIDNdOworICAgICAgICAgICAgICAgIFkgPSAoKHVjaGFyICopZGF0YSlbeSAqIHN0ZXAgKyB4ICogMyArIDFdOworICAgICAgICAgICAgICAgIHIgPSAoKHVjaGFyICopZGF0YSlbeSAqIHN0ZXAgKyB4ICogMyArIDJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBiID0gZGF0YVt5ICogc3RlcCArIHggKiAzXTsKKyAgICAgICAgICAgICAgICBZID0gZGF0YVt5ICogc3RlcCArIHggKiAzICsgMV07CisgICAgICAgICAgICAgICAgciA9IGRhdGFbeSAqIHN0ZXAgKyB4ICogMyArIDJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAoKHVpbnQgKilkYXRhKVt5ICogc3RlcCArIHggKiAzXTsKKyAgICAgICAgICAgICAgICBZID0gKCh1aW50ICopZGF0YSlbeSAqIHN0ZXAgKyB4ICogMyArIDFdOworICAgICAgICAgICAgICAgIHIgPSAoKHVpbnQgKilkYXRhKVt5ICogc3RlcCArIHggKiAzICsgMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICByID0gKHIgKyAxKSAqIFk7CisgICAgICAgICAgICBiID0gKGIgKyAxKSAqIFk7CisgICAgICAgICAgICBZID0gKFkgLSBiICogbV9jaHJvbWEuYmx1ZVsxXSAtIHIgKiBtX2Nocm9tYS5yZWRbMV0pIC8gbV9jaHJvbWEuZ3JlZW5bMV07CisKKyAgICAgICAgICAgIGlmKCAhbV9uYXRpdmVfZGVwdGggKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gY3ZSb3VuZChiKTsKKyAgICAgICAgICAgICAgICAoKHVjaGFyICopZGF0YSlbeSAqIHN0ZXAgKyB4ICogM10gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICAgICAgICAgIHQgPSBjdlJvdW5kKFkpOworICAgICAgICAgICAgICAgICgodWNoYXIgKilkYXRhKVt5ICogc3RlcCArIHggKiAzICsgMV0gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICAgICAgICAgIHQgPSBjdlJvdW5kKHIpOworICAgICAgICAgICAgICAgICgodWNoYXIgKilkYXRhKVt5ICogc3RlcCArIHggKiAzICsgMl0gPSBDVl9DQVNUXzhVKHQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiggbV90eXBlID09IEZMT0FUICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBkYXRhW3kgKiBzdGVwICsgeCAqIDNdID0gKGZsb2F0KWI7CisgICAgICAgICAgICAgICAgZGF0YVt5ICogc3RlcCArIHggKiAzICsgMV0gPSAoZmxvYXQpWTsKKyAgICAgICAgICAgICAgICBkYXRhW3kgKiBzdGVwICsgeCAqIDMgKyAyXSA9IChmbG9hdClyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCB0ID0gY3ZSb3VuZChiKTsKKyAgICAgICAgICAgICAgICAoKHVpbnQgKilkYXRhKVt5ICogc3RlcCArIHggKiAzXSA9ICh1aW50KU1BWCh0LDApOworICAgICAgICAgICAgICAgIHQgPSBjdlJvdW5kKFkpOworICAgICAgICAgICAgICAgICgodWludCAqKWRhdGEpW3kgKiBzdGVwICsgeCAqIDMgKyAxXSA9ICh1aW50KU1BWCh0LDApOworICAgICAgICAgICAgICAgIHQgPSBjdlJvdW5kKHIpOworICAgICAgICAgICAgICAgICgodWludCAqKWRhdGEpW3kgKiBzdGVwICsgeCAqIDMgKyAyXSA9ICh1aW50KU1BWCh0LDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisKKy8qKgorLy8gY29udmVydCBvbmUgcm93IHRvIGdyYXkKKyovCit2b2lkICBHckZtdEV4clJlYWRlcjo6UkdCVG9HcmF5KCBmbG9hdCAqaW4sIGZsb2F0ICpvdXQgKQoreworICAgIGlmKCBtX3R5cGUgPT0gRkxPQVQgKQorICAgIHsKKyAgICAgICAgaWYoIG1fbmF0aXZlX2RlcHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDAsIG4gPSAwOyBpIDwgbV93aWR0aDsgaSsrLCBuICs9IDMgKQorICAgICAgICAgICAgICAgIG91dFtpXSA9IGluW25dICogbV9jaHJvbWEuYmx1ZVswXSArIGluW24gKyAxXSAqIG1fY2hyb21hLmdyZWVuWzBdICsgaW5bbiArIDJdICogbV9jaHJvbWEucmVkWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIgKm8gPSAodWNoYXIgKilvdXQ7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IDA7IGkgPCBtX3dpZHRoOyBpKyssIG4gKz0gMyApCisgICAgICAgICAgICAgICAgb1tpXSA9ICh1Y2hhcikgKGluW25dICogbV9jaHJvbWEuYmx1ZVswXSArIGluW24gKyAxXSAqIG1fY2hyb21hLmdyZWVuWzBdICsgaW5bbiArIDJdICogbV9jaHJvbWEucmVkWzBdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIC8vIFVJTlQKKyAgICB7CisgICAgICAgIGlmKCBtX25hdGl2ZV9kZXB0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgKnVpID0gKHVpbnQgKilpbjsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbV93aWR0aCAqIDM7IGkrKyApCisgICAgICAgICAgICAgICAgdWlbaV0gLT0gMHg4MDAwMDAwMDsKKyAgICAgICAgICAgIGludCAqc2kgPSAoaW50ICopaW47CisgICAgICAgICAgICBmb3IoIGludCBpID0gMCwgbiA9IDA7IGkgPCBtX3dpZHRoOyBpKyssIG4gKz0gMyApCisgICAgICAgICAgICAgICAgKChpbnQgKilvdXQpW2ldID0gaW50KHNpW25dICogbV9jaHJvbWEuYmx1ZVswXSArIHNpW24gKyAxXSAqIG1fY2hyb21hLmdyZWVuWzBdICsgc2lbbiArIDJdICogbV9jaHJvbWEucmVkWzBdKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGhvdyB0byBiZXN0IGNvbnZlcnQgZmxvYXQgdG8gdWNoYXI/CisgICAgICAgIHsKKyAgICAgICAgICAgIHVpbnQgKnVpID0gKHVpbnQgKilpbjsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwLCBuID0gMDsgaSA8IG1fd2lkdGg7IGkrKywgbiArPSAzICkKKyAgICAgICAgICAgICAgICAoKHVjaGFyICopb3V0KVtpXSA9IHVjaGFyKCh1aVtuXSAqIG1fY2hyb21hLmJsdWVbMF0gKyB1aVtuICsgMV0gKiBtX2Nocm9tYS5ncmVlblswXSArIHVpW24gKyAyXSAqIG1fY2hyb21hLnJlZFswXSkgKiAoMjU2LjAgLyA0Mjk0OTY3Mjk2LjApKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3JGbXRFeHJXcml0ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK0dyRm10RXhyV3JpdGVyOjpHckZtdEV4cldyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10V3JpdGVyKCBmaWxlbmFtZSApCit7Cit9CisKKworR3JGbXRFeHJXcml0ZXI6On5HckZtdEV4cldyaXRlcigpCit7Cit9CisKKworYm9vbCAgR3JGbXRFeHJXcml0ZXI6OklzRm9ybWF0U3VwcG9ydGVkKCBpbnQgZGVwdGggKQoreworICAgIHJldHVybiBkZXB0aCA9PSBJUExfREVQVEhfOFUgfHwgZGVwdGggPT0gSVBMX0RFUFRIXzhTIHx8CisgICAgICAgICAgIGRlcHRoID09IElQTF9ERVBUSF8xNlUgfHwgZGVwdGggPT0gSVBMX0RFUFRIXzE2UyB8fAorICAgICAgICAgICBkZXB0aCA9PSBJUExfREVQVEhfMzJTIHx8IGRlcHRoID09IElQTF9ERVBUSF8zMkY7CisgICAgICAgICAgIC8vIFRPRE86IGRvIChvciBzaG91bGQpIHdlIHN1cHBvcnQgNjRmPworfQorCisKKy8vIFRPRE8gc2NhbGUgYXBwcm9wcmlhdGVseQorYm9vbCAgR3JGbXRFeHJXcml0ZXI6OldyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICkKK3sKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgSGVhZGVyIGhlYWRlciggd2lkdGgsIGhlaWdodCApOworICAgIFBpeGVsVHlwZSB0eXBlOworICAgIGJvb2wgaXNzaWduZWQgPSBkZXB0aCA8IDA7CisgICAgYm9vbCBpc2Zsb2F0ID0gZGVwdGggPT0gSVBMX0RFUFRIXzMyRiB8fCBkZXB0aCA9PSBJUExfREVQVEhfNjRGOworCisgICAgaWYoZGVwdGggPT0gSVBMX0RFUFRIXzhVIHx8IGRlcHRoID09IElQTF9ERVBUSF84UykKKyAgICAgICAgdHlwZSA9IEhBTEY7CisgICAgZWxzZSBpZihpc2Zsb2F0KQorICAgICAgICB0eXBlID0gRkxPQVQ7CisgICAgZWxzZQorICAgICAgICB0eXBlID0gVUlOVDsKKworICAgIGRlcHRoICY9IDI1NTsKKworICAgIGlmKCBjaGFubmVscyA9PSAzICkKKyAgICB7CisgICAgICAgIGhlYWRlci5jaGFubmVscygpLmluc2VydCggIlIiLCBDaGFubmVsKCB0eXBlICkpOworICAgICAgICBoZWFkZXIuY2hhbm5lbHMoKS5pbnNlcnQoICJHIiwgQ2hhbm5lbCggdHlwZSApKTsKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxzKCkuaW5zZXJ0KCAiQiIsIENoYW5uZWwoIHR5cGUgKSk7CisgICAgICAgIC8vcHJpbnRmKCJidW50XG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxzKCkuaW5zZXJ0KCAiWSIsIENoYW5uZWwoIHR5cGUgKSk7CisgICAgICAgIC8vcHJpbnRmKCJncmF5XG4iKTsKKyAgICB9CisKKyAgICBPdXRwdXRGaWxlIGZpbGUoIG1fZmlsZW5hbWUsIGhlYWRlciApOworCisgICAgRnJhbWVCdWZmZXIgZnJhbWU7CisKKyAgICBjaGFyICpidWZmZXI7CisgICAgaW50IGJ1ZmZlcnN0ZXA7CisgICAgaW50IHNpemU7CisgICAgaWYoIHR5cGUgPT0gRkxPQVQgJiYgZGVwdGggPT0gMzIgKQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKiljb25zdF9jYXN0PHVjaGFyICo+KGRhdGEpOworICAgICAgICBidWZmZXJzdGVwID0gc3RlcDsKKyAgICAgICAgc2l6ZSA9IDQ7CisgICAgfQorICAgIGVsc2UgaWYoIGRlcHRoID4gMTYgfHwgdHlwZSA9PSBVSU5UICkKKyAgICB7CisgICAgICAgIGJ1ZmZlciA9IChjaGFyICopbmV3IHVpbnRbd2lkdGggKiBjaGFubmVsc107CisgICAgICAgIGJ1ZmZlcnN0ZXAgPSAwOworICAgICAgICBzaXplID0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKiluZXcgaGFsZlt3aWR0aCAqIGNoYW5uZWxzXTsKKyAgICAgICAgYnVmZmVyc3RlcCA9IDA7CisgICAgICAgIHNpemUgPSAyOworICAgIH0KKworICAgIC8vcHJpbnRmKCJkZXB0aCAlZCAlc1xuIiwgZGVwdGgsIHR5cGVzW3R5cGVdKTsKKworICAgIGlmKCBjaGFubmVscyA9PSAzICkKKyAgICB7CisgICAgICAgIGZyYW1lLmluc2VydCggIkIiLCBTbGljZSggdHlwZSwgYnVmZmVyLCBzaXplICogMywgYnVmZmVyc3RlcCApKTsKKyAgICAgICAgZnJhbWUuaW5zZXJ0KCAiRyIsIFNsaWNlKCB0eXBlLCBidWZmZXIgKyBzaXplLCBzaXplICogMywgYnVmZmVyc3RlcCApKTsKKyAgICAgICAgZnJhbWUuaW5zZXJ0KCAiUiIsIFNsaWNlKCB0eXBlLCBidWZmZXIgKyBzaXplICogMiwgc2l6ZSAqIDMsIGJ1ZmZlcnN0ZXAgKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgZnJhbWUuaW5zZXJ0KCAiWSIsIFNsaWNlKCB0eXBlLCBidWZmZXIsIHNpemUsIGJ1ZmZlcnN0ZXAgKSk7CisKKyAgICBmaWxlLnNldEZyYW1lQnVmZmVyKCBmcmFtZSApOworCisgICAgaW50IG9mZnNldCA9IGlzc2lnbmVkID8gMSA8PCAoZGVwdGggLSAxKSA6IDA7CisKKyAgICByZXN1bHQgPSB0cnVlOworICAgIGlmKCB0eXBlID09IEZMT0FUICYmIGRlcHRoID09IDMyICkKKyAgICB7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBmaWxlLndyaXRlUGl4ZWxzKCBoZWlnaHQgKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCguLi4pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgLy8gICAgaW50IHNjYWxlID0gMSA8PCAoMzIgLSBkZXB0aCk7CisgICAgLy8gICAgcHJpbnRmKCJzY2FsZSAlZFxuIiwgc2NhbGUpOworICAgICAgICBmb3IoaW50IGxpbmUgPSAwOyBsaW5lIDwgaGVpZ2h0OyBsaW5lKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHR5cGUgPT0gVUlOVCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50ICpidWYgPSAodWludCAqKWJ1ZmZlcjsgLy8gRklYTUUgNjQtYml0IHByb2JsZW1zCisKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPD0gOCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgd2lkdGggKiBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gZGF0YVtpXSArIG9mZnNldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggZGVwdGggPD0gMTYgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKnNkID0gKHVuc2lnbmVkIHNob3J0ICopZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHdpZHRoICogY2hhbm5lbHM7IGkrKykKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZltpXSA9IHNkW2ldICsgb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgKnNkID0gKGludCAqKWRhdGE7IC8vIEZJWE1FIDY0LWJpdCBwcm9ibGVtcworICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgd2lkdGggKiBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gKHVpbnQpIHNkW2ldICsgb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBoYWxmICpidWYgPSAoaGFsZiAqKWJ1ZmZlcjsKKworICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA8PSA4ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCB3aWR0aCAqIGNoYW5uZWxzOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICBidWZbaV0gPSBkYXRhW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBkZXB0aCA8PSAxNiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqc2QgPSAodW5zaWduZWQgc2hvcnQgKilkYXRhOworICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgd2lkdGggKiBjaGFubmVsczsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW2ldID0gc2RbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZmlsZS53cml0ZVBpeGVscyggMSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2F0Y2goLi4uKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSArPSBzdGVwOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfZXhyLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9leHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VjNzczCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfZXhyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9HUkZNVF9FWFJfSF8KKyNkZWZpbmUgX0dSRk1UX0VYUl9IXworCisjaWZkZWYgSEFWRV9JTE1JTUYKKworI2luY2x1ZGUgPEltZkNocm9tYXRpY2l0aWVzLmg+CisjaW5jbHVkZSA8SW1mSW5wdXRGaWxlLmg+CisjaW5jbHVkZSA8SW1mQ2hhbm5lbExpc3QuaD4KKyNpbmNsdWRlIDxJbWF0aEJveC5oPgorI2luY2x1ZGUgImdyZm10X2Jhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIEltZjsKK3VzaW5nIG5hbWVzcGFjZSBJbWF0aDsKKworLyogbGlicG5nIHZlcnNpb24gb25seSAqLworCitjbGFzcyBHckZtdEV4clJlYWRlciA6IHB1YmxpYyBHckZtdFJlYWRlcgoreworcHVibGljOgorCisgICAgR3JGbXRFeHJSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10RXhyUmVhZGVyKCk7CisKKyAgICBib29sICBSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKTsKKyAgICBib29sICBSZWFkSGVhZGVyKCk7CisgICAgdm9pZCAgQ2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgIFVwU2FtcGxlKCB1Y2hhciAqZGF0YSwgaW50IHhzdGVwLCBpbnQgeXN0ZXAsIGludCB4c2FtcGxlLCBpbnQgeXNhbXBsZSApOworICAgIHZvaWQgIFVwU2FtcGxlWCggZmxvYXQgKmRhdGEsIGludCB4c3RlcCwgaW50IHhzYW1wbGUgKTsKKyAgICB2b2lkICBVcFNhbXBsZVkoIHVjaGFyICpkYXRhLCBpbnQgeHN0ZXAsIGludCB5c3RlcCwgaW50IHlzYW1wbGUgKTsKKyAgICB2b2lkICBDaHJvbWFUb0JHUiggZmxvYXQgKmRhdGEsIGludCBudW1saW5lcywgaW50IHN0ZXAgKTsKKyAgICB2b2lkICBSR0JUb0dyYXkoIGZsb2F0ICppbiwgZmxvYXQgKm91dCApOworCisgICAgSW5wdXRGaWxlICAgICAgKm1fZmlsZTsKKyAgICBQaXhlbFR5cGUgICAgICAgbV90eXBlOworICAgIEJveDJpICAgICAgICAgICBtX2RhdGF3aW5kb3c7CisgICAgYm9vbCAgICAgICAgICAgIG1faXNjaHJvbWE7CisgICAgY29uc3QgQ2hhbm5lbCAgKm1fcmVkOworICAgIGNvbnN0IENoYW5uZWwgICptX2dyZWVuOworICAgIGNvbnN0IENoYW5uZWwgICptX2JsdWU7CisgICAgQ2hyb21hdGljaXRpZXMgIG1fY2hyb21hOworfTsKKworCitjbGFzcyBHckZtdEV4cldyaXRlciA6IHB1YmxpYyBHckZtdFdyaXRlcgoreworcHVibGljOgorCisgICAgR3JGbXRFeHJXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10RXhyV3JpdGVyKCk7CisKKyAgICBib29sICBJc0Zvcm1hdFN1cHBvcnRlZCggaW50IGRlcHRoICk7CisgICAgYm9vbCAgV3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKTsKK3Byb3RlY3RlZDoKK307CisKKworLy8gRXhyIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdEV4ciA6IHB1YmxpYyBHckZtdEZpbHRlckZhY3RvcnkKK3sKK3B1YmxpYzoKKworICAgIEdyRm10RXhyKCk7CisgICAgfkdyRm10RXhyKCk7CisKKyAgICBHckZtdFJlYWRlciogTmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIEdyRm10V3JpdGVyKiBOZXdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisvLyAgICBib29sIENoZWNrU2lnbmF0dXJlKCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKTsKK307CisKKyNlbmRpZgorCisjZW5kaWYvKl9HUkZNVF9FWFJfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfaW1hZ2Vpby5jcHAgYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9pbWFnZWlvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNkOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfaW1hZ2Vpby5jcHAKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiAgZ3JmbXRfaW1hZ2Vpby5jcHAKKyAqICAKKyAqCisgKiAgQ3JlYXRlZCBieSBNb3JnYW4gQ29uYmVyZSBvbiA1LzE3LzA3LgorICoKKyAqLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKworI2lmZGVmIEhBVkVfSU1BR0VJTworCisjaW5jbHVkZSAiZ3JmbXRfaW1hZ2Vpby5oIgorI2luY2x1ZGUgPGlvc3RyZWFtPgordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworLy8gSW1hZ2VJTyBmaWx0ZXIgZmFjdG9yeQorCitHckZtdEltYWdlSU86OkdyRm10SW1hZ2VJTygpCit7CisgICAgbV9zaWduX2xlbiA9IDA7CisgICAgbV9zaWduYXR1cmUgPSBOVUxMOworICAgIG1fZGVzY3JpcHRpb24gPSAiQXBwbGUgSW1hZ2VJTyAoKi5ibXA7Ki5kaWI7Ki5leHI7Ki5qcGVnOyouanBnOyouanBlOyouanAyOyoucGRmOyoucG5nOyoudGlmZjsqLnRpZikiOworfQorCisKK0dyRm10SW1hZ2VJTzo6fkdyRm10SW1hZ2VJTygpCit7Cit9CisKKworYm9vbCAgR3JGbXRJbWFnZUlPOjpDaGVja0ZpbGUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBpZiggIWZpbGVuYW1lICkgcmV0dXJuIGZhbHNlOworICAgIAorICAgIC8vIElmIGEgQ0ZJbWFnZVJlZiBjYW4gYmUgcmV0cmlldmVkIGZyb20gYW4gaW1hZ2UgZmlsZSwgaXQgaXMgCisgICAgLy8gcmVhZGFibGUgYnkgSW1hZ2VJTy4gIEVmZmVjdGl2ZWx5IHRoaXMgaXMgdXNpbmcgSW1hZ2VJTworICAgIC8vIHRvIGNoZWNrIHRoZSBzaWduYXR1cmVzIGFuZCBkZXRlcm1pbmUgdGhlIGZpbGUgZm9ybWF0IGZvciB1cy4KKyAgICBDRlVSTFJlZiBpbWFnZVVSTFJlZiA9IENGVVJMQ3JlYXRlRnJvbUZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbiggTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IFVJbnQ4KilmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKCBmaWxlbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgIGlmKCAhaW1hZ2VVUkxSZWYgKSByZXR1cm4gZmFsc2U7CisgICAgCisgICAgQ0dJbWFnZVNvdXJjZVJlZiBzb3VyY2VSZWYgPSBDR0ltYWdlU291cmNlQ3JlYXRlV2l0aFVSTCggaW1hZ2VVUkxSZWYsIE5VTEwgKTsKKyAgICBDRlJlbGVhc2UoIGltYWdlVVJMUmVmICk7CisgICAgaWYoICFzb3VyY2VSZWYgKSByZXR1cm4gZmFsc2U7CisgICAgCisgICAgQ0dJbWFnZVJlZiBpbWFnZVJlZiA9IENHSW1hZ2VTb3VyY2VDcmVhdGVJbWFnZUF0SW5kZXgoIHNvdXJjZVJlZiwgMCwgTlVMTCApOworICAgIENGUmVsZWFzZSggc291cmNlUmVmICk7CisgICAgaWYoICFpbWFnZVJlZiApIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitHckZtdFJlYWRlciogR3JGbXRJbWFnZUlPOjpOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10SW1hZ2VJT1JlYWRlciggZmlsZW5hbWUgKTsKK30KKworCitHckZtdFdyaXRlciogR3JGbXRJbWFnZUlPOjpOZXdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10SW1hZ2VJT1dyaXRlciggZmlsZW5hbWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdEltYWdlSU9SZWFkZXIgLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdEltYWdlSU9SZWFkZXI6OkdyRm10SW1hZ2VJT1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10UmVhZGVyKCBmaWxlbmFtZSApCit7CisgICAgLy8gTm90aGluZyB0byBkbyBoZXJlCit9CisKKworR3JGbXRJbWFnZUlPUmVhZGVyOjp+R3JGbXRJbWFnZUlPUmVhZGVyKCkKK3sKKyAgICBDbG9zZSgpOworfQorCisKK3ZvaWQgIEdyRm10SW1hZ2VJT1JlYWRlcjo6Q2xvc2UoKQoreworICAgIENHSW1hZ2VSZWxlYXNlKCBpbWFnZVJlZiApOworICAgIAorICAgIEdyRm10UmVhZGVyOjpDbG9zZSgpOworfQorCisKK2Jvb2wgIEdyRm10SW1hZ2VJT1JlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgQ0ZVUkxSZWYgICAgICAgICBpbWFnZVVSTFJlZjsKKyAgICBDR0ltYWdlU291cmNlUmVmIHNvdXJjZVJlZjsKKyAgICBpbWFnZVJlZiA9IE5VTEw7CisgICAgCisgICAgaW1hZ2VVUkxSZWYgPSBDRlVSTENyZWF0ZUZyb21GaWxlU3lzdGVtUmVwcmVzZW50YXRpb24oIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBVSW50OCopbV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKG1fZmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOworICAgIAorICAgIHNvdXJjZVJlZiA9IENHSW1hZ2VTb3VyY2VDcmVhdGVXaXRoVVJMKCBpbWFnZVVSTFJlZiwgTlVMTCApOworICAgIENGUmVsZWFzZSggaW1hZ2VVUkxSZWYgKTsKKyAgICBpZiAoICFzb3VyY2VSZWYgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgaW1hZ2VSZWYgPSBDR0ltYWdlU291cmNlQ3JlYXRlSW1hZ2VBdEluZGV4KCBzb3VyY2VSZWYsIDAsIE5VTEwgKTsKKyAgICBDRlJlbGVhc2UoIHNvdXJjZVJlZiApOworICAgIGlmKCAhaW1hZ2VSZWYgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgbV93aWR0aCA9IENHSW1hZ2VHZXRXaWR0aCggaW1hZ2VSZWYgKTsKKyAgICBtX2hlaWdodCA9IENHSW1hZ2VHZXRIZWlnaHQoIGltYWdlUmVmICk7CisgICAgCisgICAgQ0dDb2xvclNwYWNlUmVmIGNvbG9yU3BhY2UgPSBDR0ltYWdlR2V0Q29sb3JTcGFjZSggaW1hZ2VSZWYgKTsKKyAgICBpZiggIWNvbG9yU3BhY2UgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgbV9pc2NvbG9yID0gKCBDR0NvbG9yU3BhY2VHZXROdW1iZXJPZkNvbXBvbmVudHMoIGNvbG9yU3BhY2UgKSA+IDEgKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sICBHckZtdEltYWdlSU9SZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgaW50IGJwcDsgLy8gQnl0ZXMgcGVyIHBpeGVsCisgICAgCisgICAgLy8gU2V0IGNvbG9yIHRvIGVpdGhlciBDVl9JTUFHRV9MT0FEX0NPTE9SIG9yIENWX0lNQUdFX0xPQURfR1JBWVNDQUxFIGlmIHVuY2hhbmdlZAorICAgIGNvbG9yID0gY29sb3IgPiAwIHx8ICggbV9pc2NvbG9yICYmIGNvbG9yIDwgMCApOworICAgIAorICAgIC8vIEdldCBIZWlnaHQsIFdpZHRoLCBhbmQgY29sb3IgaW5mb3JtYXRpb24KKyAgICBpZiggIVJlYWRIZWFkZXIoKSApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBDR0NvbnRleHRSZWYgICAgIGNvbnRleHQgPSBOVUxMOyAvLyBUaGUgYml0bWFwIGNvbnRleHQKKyAgICBDR0NvbG9yU3BhY2VSZWYgIGNvbG9yU3BhY2UgPSBOVUxMOworICAgIHVjaGFyKiAgICAgICAgICAgYml0bWFwID0gTlVMTDsKKyAgICBDR0ltYWdlQWxwaGFJbmZvIGFscGhhSW5mbzsKKyAgICAKKyAgICAvLyBDb3JlR3JhcGhpY3Mgd2lsbCB0YWtlIGNhcmUgb2YgY29udmVydGluZyB0byBncmF5c2NhbGUgYW5kIGJhY2sgYXMgbG9uZyBhcyB0aGUgCisgICAgLy8gYXBwcm9wcmlhdGUgY29sb3JzcGFjZSBpcyBzZXQKKyAgICBpZiggY29sb3IgPT0gQ1ZfTE9BRF9JTUFHRV9HUkFZU0NBTEUgKQorICAgIHsKKyAgICAgICAgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZUdyYXkoKTsKKyAgICAgICAgYnBwID0gMTsKKyAgICAgICAgYWxwaGFJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmU7CisgICAgfQorICAgIGVsc2UgaWYoIGNvbG9yID09IENWX0xPQURfSU1BR0VfQ09MT1IgKQorICAgIHsKKyAgICAgICAgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZURldmljZVJHQigpOworICAgICAgICBicHAgPSA0OyAvKiBDRyBvbmx5IGhhcyA4IGFuZCAzMiBiaXQgY29sb3Igc3BhY2VzLCBzbyB3ZSB3YXN0ZSBhIGJ5dGUgKi8KKyAgICAgICAgYWxwaGFJbmZvID0ga0NHSW1hZ2VBbHBoYU5vbmVTa2lwTGFzdDsKKyAgICB9CisgICAgaWYoICFjb2xvclNwYWNlICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGJpdG1hcCA9ICh1Y2hhciopbWFsbG9jKCBicHAgKiBtX2hlaWdodCAqIG1fd2lkdGggKTsKKyAgICBpZiggIWJpdG1hcCApCisgICAgeworICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKCBjb2xvclNwYWNlICk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSggKHZvaWQgKiliaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV93aWR0aCwgICAgICAgIC8qIHdpZHRoICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9oZWlnaHQsICAgICAgIC8qIGhlaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYml0X2RlcHRoLCAgICAvKiBiaXQgZGVwdGggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAgKiBtX3dpZHRoLCAgLyogYnl0ZXMgcGVyIHJvdyAqLyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlLCAgICAgLyogY29sb3Igc3BhY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHBoYUluZm8pOworICAgIAorICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoIGNvbG9yU3BhY2UgKTsKKyAgICBpZiggIWNvbnRleHQgKQorICAgIHsKKyAgICAgICAgZnJlZSggYml0bWFwICk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgLy8gQ29weSB0aGUgaW1hZ2UgZGF0YSBpbnRvIHRoZSBiaXRtYXAgcmVnaW9uCisgICAgQ0dSZWN0IHJlY3QgPSB7ezAsMH0se21fd2lkdGgsbV9oZWlnaHR9fTsKKyAgICBDR0NvbnRleHREcmF3SW1hZ2UoIGNvbnRleHQsIHJlY3QsIGltYWdlUmVmICk7CisgICAgCisgICAgdWNoYXIqIGJpdGRhdGEgPSAodWNoYXIqKUNHQml0bWFwQ29udGV4dEdldERhdGEoIGNvbnRleHQgKTsKKyAgICBpZiggIWJpdGRhdGEgKQorICAgIHsKKyAgICAgICAgZnJlZSggYml0bWFwKTsKKyAgICAgICAgQ0dDb250ZXh0UmVsZWFzZSggY29udGV4dCApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIE1vdmUgdGhlIGJpdG1hcCAoaW4gUkdCKSBpbnRvIGRhdGEgKGluIEJHUikKKyAgICBpbnQgYml0bWFwSW5kZXggPSAwOworICAgIAorICAgIGlmKCBjb2xvciA9PSBDVl9MT0FEX0lNQUdFX0NPTE9SICkgCisJeworCQl1Y2hhciAqIGJhc2UgPSBkYXRhOworCQkKKwkJZm9yIChpbnQgeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrKQorCQl7CisJCQl1Y2hhciAqIGxpbmUgPSBiYXNlICsgeSAqIHN0ZXA7CisJCQkKKwkJICAgIGZvciAoaW50IHggPSAwOyB4IDwgbV93aWR0aDsgeCsrKSAKKwkJICAgIHsKKwkJCQkvLyBCbHVlIGNoYW5uZWwKKwkJCQlsaW5lWzBdID0gYml0ZGF0YVtiaXRtYXBJbmRleCArIDJdOworCQkJCS8vIEdyZWVuIGNoYW5uZWwKKwkJCQlsaW5lWzFdID0gYml0ZGF0YVtiaXRtYXBJbmRleCArIDFdOworCQkJCS8vIFJlZCBjaGFubmVsCisJCQkJbGluZVsyXSA9IGJpdGRhdGFbYml0bWFwSW5kZXggKyAwXTsKKwkJCQkKKwkJCQlsaW5lICAgICAgICArPSAzOworCQkJCWJpdG1hcEluZGV4ICs9IGJwcDsKKwkJCX0KKwkJfQorICAgIH0KKyAgICBlbHNlIGlmKCBjb2xvciA9PSBDVl9MT0FEX0lNQUdFX0dSQVlTQ0FMRSApCisgICAgeworCQlmb3IgKGludCB5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyspCisJCQltZW1jcHkgKGRhdGEgKyB5ICogc3RlcCwgYml0bWFwICsgeSAqIG1fd2lkdGgsIG1fd2lkdGgpOworICAgIH0KKyAgICAKKyAgICBmcmVlKCBiaXRtYXAgKTsKKyAgICBDR0NvbnRleHRSZWxlYXNlKCBjb250ZXh0ICk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3JGbXRJbWFnZUlPV3JpdGVyIC8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3JGbXRJbWFnZUlPV3JpdGVyOjpHckZtdEltYWdlSU9Xcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFdyaXRlciggZmlsZW5hbWUgKQoreworICAgIC8vIE5vdGhpbmcgdG8gZG8gaGVyZQorfQorCisKK0dyRm10SW1hZ2VJT1dyaXRlcjo6fkdyRm10SW1hZ2VJT1dyaXRlcigpCit7CisgICAgLy8gTm90aGluZyB0byBkbyBoZXJlCit9CisKKworc3RhdGljCitDRlN0cmluZ1JlZiAgRmlsZW5hbWVUb1VUSSggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIGNvbnN0IGNoYXIqIGV4dCA9IGZpbGVuYW1lOworICAgIGZvcig7OykKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIqIHRlbXAgPSBzdHJjaHIoIGV4dCArIDEsICcuJyApOworICAgICAgICBpZiggIXRlbXAgKSBicmVhazsKKyAgICAgICAgZXh0ID0gdGVtcDsKKyAgICB9CisgICAgCisgICAgQ0ZTdHJpbmdSZWYgaW1hZ2VVVEkgPSBOVUxMOworICAgIAorICAgIGlmKCAhc3RyY21wKGV4dCwgIi5ibXAiKSB8fCAhc3RyY21wKGV4dCwgIi5kaWIiKSApCisgICAgICAgIGltYWdlVVRJID0gQ0ZTVFIoICJjb20ubWljcm9zb2Z0LmJtcCIgKTsKKyAgICBlbHNlIGlmKCAhc3RyY21wKGV4dCwgIi5leHIiKSApCisgICAgICAgIGltYWdlVVRJID0gQ0ZTVFIoICJjb20uaWxtLm9wZW5leHItaW1hZ2UiICk7CisgICAgZWxzZSBpZiggIXN0cmNtcChleHQsICIuanBlZyIpIHx8ICFzdHJjbXAoZXh0LCAiLmpwZyIpIHx8ICFzdHJjbXAoZXh0LCAiLmpwZSIpICkKKyAgICAgICAgaW1hZ2VVVEkgPSBDRlNUUiggInB1YmxpYy5qcGVnIiApOworICAgIGVsc2UgaWYoICFzdHJjbXAoZXh0LCAiLmpwMiIpICkKKyAgICAgICAgaW1hZ2VVVEkgPSBDRlNUUiggInB1YmxpYy5qcGVnLTIwMDAiICk7CisgICAgZWxzZSBpZiggIXN0cmNtcChleHQsICIucGRmIikgKQorICAgICAgICBpbWFnZVVUSSA9IENGU1RSKCAiY29tLmFkb2JlLnBkZiIgKTsKKyAgICBlbHNlIGlmKCAhc3RyY21wKGV4dCwgIi5wbmciKSApCisgICAgICAgIGltYWdlVVRJID0gQ0ZTVFIoICJwdWJsaWMucG5nIiApOworICAgIGVsc2UgaWYoICFzdHJjbXAoZXh0LCAiLnRpZmYiKSB8fCAhc3RyY21wKGV4dCwgIi50aWYiKSApCisgICAgICAgIGltYWdlVVRJID0gQ0ZTVFIoICJwdWJsaWMudGlmZiIgKTsKKyAgICAKKyAgICByZXR1cm4gaW1hZ2VVVEk7Cit9CisKKworYm9vbCAgR3JGbXRJbWFnZUlPV3JpdGVyOjpXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IC8qZGVwdGgqLywgaW50IF9jaGFubmVscyApCit7CisgICAgLy8gRGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBVVEkgYmFzZWQgb24gdGhlIGZpbGVuYW1lIGV4dGVuc2lvbgorICAgIENGU3RyaW5nUmVmIGltYWdlVVRJID0gRmlsZW5hbWVUb1VUSSggbV9maWxlbmFtZSApOworICAgIAorICAgIC8vIERldGVybWluZSB0aGUgQnl0ZXMgUGVyIFBpeGVsCisgICAgaW50IGJwcCA9IChfY2hhbm5lbHMgPT0gMSkgPyAxIDogNDsKKyAgICAKKyAgICAvLyBXcml0ZSB0aGUgZGF0YSBpbnRvIGEgYml0bWFwIGNvbnRleHQKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dDsKKyAgICBDR0NvbG9yU3BhY2VSZWYgY29sb3JTcGFjZTsKKyAgICB1Y2hhciogYml0bWFwRGF0YSA9IE5VTEw7CisgICAgCisgICAgaWYoIGJwcCA9PSAxICkKKyAgICAgICAgY29sb3JTcGFjZSA9IENHQ29sb3JTcGFjZUNyZWF0ZVdpdGhOYW1lKCBrQ0dDb2xvclNwYWNlR2VuZXJpY0dyYXkgKTsKKyAgICBlbHNlIGlmKCBicHAgPT0gNCApCisgICAgICAgIGNvbG9yU3BhY2UgPSBDR0NvbG9yU3BhY2VDcmVhdGVXaXRoTmFtZSgga0NHQ29sb3JTcGFjZUdlbmVyaWNSR0IgKTsKKyAgICBpZiggIWNvbG9yU3BhY2UgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgCisgICAgYml0bWFwRGF0YSA9ICh1Y2hhciopbWFsbG9jKCBicHAgKiBoZWlnaHQgKiB3aWR0aCApOworICAgIGlmKCAhYml0bWFwRGF0YSApCisgICAgeworICAgICAgICBDR0NvbG9yU3BhY2VSZWxlYXNlKCBjb2xvclNwYWNlICk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgY29udGV4dCA9IENHQml0bWFwQ29udGV4dENyZWF0ZSggYml0bWFwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicHAgKiB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChicHAgPT0gMSkgPyBrQ0dJbWFnZUFscGhhTm9uZSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NHSW1hZ2VBbHBoYU5vbmVTa2lwTGFzdCApOworICAgIENHQ29sb3JTcGFjZVJlbGVhc2UoIGNvbG9yU3BhY2UgKTsKKyAgICBpZiggIWNvbnRleHQgKQorICAgIHsKKyAgICAgICAgZnJlZSggYml0bWFwRGF0YSApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIENvcHkgcGl4ZWwgaW5mb3JtYXRpb24gZnJvbSBkYXRhIGludG8gYml0bWFwRGF0YQorICAgIGlmIChicHAgPT0gNCkKKyAgICB7CisgICAgICAgIGludCAgICAgICAgICAgYml0bWFwSW5kZXggPSAwOworCQljb25zdCB1Y2hhciAqIGJhc2UgICAgICAgID0gZGF0YTsKKwkJCisJCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCXsKKwkJCWNvbnN0IHVjaGFyICogbGluZSA9IGJhc2UgKyB5ICogc3RlcDsKKwkJCQorCQkgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSAKKwkJICAgIHsKKwkJCQkvLyBCbHVlIGNoYW5uZWwKKyAgICAgICAgICAgICAgICBiaXRtYXBEYXRhW2JpdG1hcEluZGV4ICsgMl0gPSBsaW5lWzBdOworCQkJCS8vIEdyZWVuIGNoYW5uZWwKKwkJCQliaXRtYXBEYXRhW2JpdG1hcEluZGV4ICsgMV0gPSBsaW5lWzFdOworCQkJCS8vIFJlZCBjaGFubmVsCisJCQkJYml0bWFwRGF0YVtiaXRtYXBJbmRleCArIDBdID0gbGluZVsyXTsKKwkJCQkKKwkJCQlsaW5lICAgICAgICArPSAzOworCQkJCWJpdG1hcEluZGV4ICs9IGJwcDsKKwkJCX0KKwkJfQorICAgIH0KKyAgICBlbHNlIGlmIChicHAgPT0gMSkKKyAgICB7CisJCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCisJCQltZW1jcHkgKGJpdG1hcERhdGEgKyB5ICogd2lkdGgsIGRhdGEgKyB5ICogc3RlcCwgd2lkdGgpOworICAgIH0KKyAgICAKKyAgICAvLyBUdXJuIHRoZSBiaXRtYXAgY29udGV4dCBpbnRvIGFuIGltYWdlUmVmCisgICAgQ0dJbWFnZVJlZiBpbWFnZVJlZiA9IENHQml0bWFwQ29udGV4dENyZWF0ZUltYWdlKCBjb250ZXh0ICk7CisgICAgQ0dDb250ZXh0UmVsZWFzZSggY29udGV4dCApOworICAgIGlmKCAhaW1hZ2VSZWYgKQorICAgIHsKKyAgICAgICAgZnJlZSggYml0bWFwRGF0YSApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIC8vIFdyaXRlIHRoZSBpbWFnZVJlZiB0byBhIGZpbGUgYmFzZWQgb24gdGhlIFVUSQorICAgIENGVVJMUmVmIGltYWdlVVJMUmVmID0gQ0ZVUkxDcmVhdGVGcm9tRmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgVUludDgqKW1fZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbihtX2ZpbGVuYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKKyAgICBpZiggIWltYWdlVVJMUmVmICkKKyAgICB7CisgICAgICAgIENHSW1hZ2VSZWxlYXNlKCBpbWFnZVJlZiApOworICAgICAgICBmcmVlKCBiaXRtYXBEYXRhICk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQ0dJbWFnZURlc3RpbmF0aW9uUmVmIGRlc3RSZWYgPSBDR0ltYWdlRGVzdGluYXRpb25DcmVhdGVXaXRoVVJMKCBpbWFnZVVSTFJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlVVRJLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsgICAgICAgIAorICAgIENGUmVsZWFzZSggaW1hZ2VVUkxSZWYgKTsKKyAgICBpZiggIWRlc3RSZWYgKQorICAgIHsKKyAgICAgICAgQ0dJbWFnZVJlbGVhc2UoIGltYWdlUmVmICk7CisgICAgICAgIGZyZWUoIGJpdG1hcERhdGEgKTsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICIhZGVzdFJlZiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6Zmx1c2g7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgQ0dJbWFnZURlc3RpbmF0aW9uQWRkSW1hZ2UoZGVzdFJlZiwgaW1hZ2VSZWYsIE5VTEwpOworICAgIGlmKCAhQ0dJbWFnZURlc3RpbmF0aW9uRmluYWxpemUoZGVzdFJlZikgKQorICAgIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJGaW5hbGl6ZSBmYWlsZWQiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmZsdXNoOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIENGUmVsZWFzZSggZGVzdFJlZiApOworICAgIENHSW1hZ2VSZWxlYXNlKCBpbWFnZVJlZiApOyAgICAKKyAgICBmcmVlKCBiaXRtYXBEYXRhICk7CisgICAgCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAvKiBIQVZFX0lNQUdFSU8gKi8KZGlmZiAtLWdpdCBhL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2ltYWdlaW8uaCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2ltYWdlaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM1YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfaW1hZ2Vpby5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiAgZ3JmbXRfaW1hZ2Vpby5oCisgKiAgCisgKgorICogIENyZWF0ZWQgYnkgTW9yZ2FuIENvbmJlcmUgb24gNS8xNy8wNy4KKyAqCisgKi8KKworI2lmbmRlZiBfR1JGTVRfSU1BR0VJT19IXworI2RlZmluZSBfR1JGTVRfSU1BR0VJT19IXworCisjaWZkZWYgSEFWRV9JTUFHRUlPCisKKyNpbmNsdWRlICJncmZtdF9iYXNlLmgiCisjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CisKK2NsYXNzIEdyRm10SW1hZ2VJT1JlYWRlciA6IHB1YmxpYyBHckZtdFJlYWRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10SW1hZ2VJT1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRJbWFnZUlPUmVhZGVyKCk7CisgICAgCisgICAgYm9vbCAgUmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICk7CisgICAgYm9vbCAgUmVhZEhlYWRlcigpOworICAgIHZvaWQgIENsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAKKyAgICBDR0ltYWdlUmVmIGltYWdlUmVmOworfTsKKworY2xhc3MgR3JGbXRJbWFnZUlPV3JpdGVyIDogcHVibGljIEdyRm10V3JpdGVyCit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRJbWFnZUlPV3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIH5HckZtdEltYWdlSU9Xcml0ZXIoKTsKKworICAgIGJvb2wgIFdyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICk7Cit9OworCisvLyBJbWFnZUlPIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdEltYWdlSU8gOnB1YmxpYyBHckZtdEZpbHRlckZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdEltYWdlSU8oKTsKKyAgICB+R3JGbXRJbWFnZUlPKCk7CisgICAgCisgICAgYm9vbCBDaGVja0ZpbGUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgCisgICAgR3JGbXRSZWFkZXIqIE5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBHckZtdFdyaXRlciogTmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworfTsKKworI2VuZGlmLypIQVZFX0lNQUdFSU8qLworCisjZW5kaWYvKl9HUkZNVF9JTUFHRUlPX0hfKi8KZGlmZiAtLWdpdCBhL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfanBlZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIzNWZlNAotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcuY3BwCkBAIC0wLDAgKzEsMTg2NiBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpbmNsdWRlICJfaGlnaGd1aS5oIgorI2luY2x1ZGUgImdyZm10X2pwZWcuaCIKKworLy8gSlBFRyBmaWx0ZXIgZmFjdG9yeQorCitHckZtdEpwZWc6OkdyRm10SnBlZygpCit7CisgICAgbV9zaWduX2xlbiA9IDM7CisgICAgbV9zaWduYXR1cmUgPSAiXHhGRlx4RDhceEZGIjsKKyAgICBtX2Rlc2NyaXB0aW9uID0gIkpQRUcgZmlsZXMgKCouanBlZzsqLmpwZzsqLmpwZSkiOworfQorCisKK0dyRm10SnBlZzo6fkdyRm10SnBlZygpCit7Cit9CisKKworR3JGbXRSZWFkZXIqIEdyRm10SnBlZzo6TmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdEpwZWdSZWFkZXIoIGZpbGVuYW1lICk7Cit9CisKKworR3JGbXRXcml0ZXIqIEdyRm10SnBlZzo6TmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdEpwZWdXcml0ZXIoIGZpbGVuYW1lICk7Cit9CisKKworI2lmZGVmIEhBVkVfSlBFRworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICBUaGlzIHBhcnQgb2YgdGhlIGZpbGUgaW1wbGVtZW50cyBKUEVHIGNvZGVjIG9uIGJhc2Ugb2YgSUpHIGxpYmpwZWcgbGlicmFyeSwKKyAgICBpbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIHRoZSBtb2RpZmllZCBleGFtcGxlLmRvYyBmcm9tIGxpYmpwZWcgcGFja2FnZS4KKyAgICBTZWUgb3RoZXJsaWJzL19ncmFwaGljcy9yZWFkbWUudHh0IGZvciBjb3B5cmlnaHQgbm90aWNlLgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorCisjaWZkZWYgV0lOMzIKKworI2RlZmluZSBYTURfSCAvLyBwcmV2ZW50IHJlZGVmaW5pdGlvbiBvZiBJTlQzMgorI3VuZGVmIEZBUiAgLy8gcHJldmVudCBGQVIgcmVkZWZpbml0aW9uCisKKyNlbmRpZgorCisjaWYgZGVmaW5lZCBXSU4zMiAmJiBkZWZpbmVkIF9fR05VQ19fCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYm9vbGVhbjsKKyNlbmRpZgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlICJqcGVnbGliLmgiCit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEVycm9yIHByb2Nlc3NpbmcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3R5cGVkZWYgc3RydWN0IEdyRm10SnBlZ0Vycm9yTWdyCit7CisgICAgc3RydWN0IGpwZWdfZXJyb3JfbWdyIHB1YjsgICAgLyogInBhcmVudCIgc3RydWN0dXJlICovCisgICAgam1wX2J1ZiBzZXRqbXBfYnVmZmVyOyAgICAgICAgLyoganVtcCBsYWJlbCAqLworfQorR3JGbXRKcGVnRXJyb3JNZ3I7CisKKworTUVUSE9EREVGKHZvaWQpCitlcnJvcl9leGl0KCBqX2NvbW1vbl9wdHIgY2luZm8gKQoreworICAgIEdyRm10SnBlZ0Vycm9yTWdyKiBlcnJfbWdyID0gKEdyRm10SnBlZ0Vycm9yTWdyKikoY2luZm8tPmVycik7CisgICAgCisgICAgLyogUmV0dXJuIGNvbnRyb2wgdG8gdGhlIHNldGptcCBwb2ludCAqLworICAgIGxvbmdqbXAoIGVycl9tZ3ItPnNldGptcF9idWZmZXIsIDEgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdEpwZWdSZWFkZXIgLy8vLy8vLy8vLy8vLy8vLy8vLworCisKK0dyRm10SnBlZ1JlYWRlcjo6R3JGbXRKcGVnUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApIDogR3JGbXRSZWFkZXIoIGZpbGVuYW1lICkKK3sKKyAgICBtX2NpbmZvID0gMDsKKyAgICBtX2YgPSAwOworfQorCisKK0dyRm10SnBlZ1JlYWRlcjo6fkdyRm10SnBlZ1JlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRKcGVnUmVhZGVyOjpDbG9zZSgpCit7CisgICAgaWYoIG1fZiApCisgICAgeworICAgICAgICBmY2xvc2UoIG1fZiApOworICAgICAgICBtX2YgPSAwOworICAgIH0KKworICAgIGlmKCBtX2NpbmZvICkKKyAgICB7CisgICAgICAgIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvID0gKGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqKW1fY2luZm87CisgICAgICAgIEdyRm10SnBlZ0Vycm9yTWdyKiBqZXJyID0gKEdyRm10SnBlZ0Vycm9yTWdyKiltX2plcnI7CisKKyAgICAgICAganBlZ19kZXN0cm95X2RlY29tcHJlc3MoIGNpbmZvICk7CisgICAgICAgIGRlbGV0ZSBjaW5mbzsKKyAgICAgICAgZGVsZXRlIGplcnI7CisgICAgICAgIG1fY2luZm8gPSAwOworICAgICAgICBtX2plcnIgPSAwOworICAgIH0KKyAgICBHckZtdFJlYWRlcjo6Q2xvc2UoKTsKK30KKworCitib29sICBHckZtdEpwZWdSZWFkZXI6OlJlYWRIZWFkZXIoKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgQ2xvc2UoKTsKKworICAgIGpwZWdfZGVjb21wcmVzc19zdHJ1Y3QqIGNpbmZvID0gbmV3IGpwZWdfZGVjb21wcmVzc19zdHJ1Y3Q7CisgICAgR3JGbXRKcGVnRXJyb3JNZ3IqIGplcnIgPSBuZXcgR3JGbXRKcGVnRXJyb3JNZ3I7CisKKyAgICBjaW5mby0+ZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnItPnB1Yik7CisgICAgamVyci0+cHViLmVycm9yX2V4aXQgPSBlcnJvcl9leGl0OworCisgICAgbV9jaW5mbyA9IGNpbmZvOworICAgIG1famVyciA9IGplcnI7CisKKyAgICBpZiggc2V0am1wKCBqZXJyLT5zZXRqbXBfYnVmZmVyICkgPT0gMCApCisgICAgeworICAgICAgICBqcGVnX2NyZWF0ZV9kZWNvbXByZXNzKCBjaW5mbyApOworCisgICAgICAgIG1fZiA9IGZvcGVuKCBtX2ZpbGVuYW1lLCAicmIiICk7CisgICAgICAgIGlmKCBtX2YgKQorICAgICAgICB7CisgICAgICAgICAgICBqcGVnX3N0ZGlvX3NyYyggY2luZm8sIG1fZiApOworICAgICAgICAgICAganBlZ19yZWFkX2hlYWRlciggY2luZm8sIFRSVUUgKTsKKworICAgICAgICAgICAgbV93aWR0aCA9IGNpbmZvLT5pbWFnZV93aWR0aDsKKyAgICAgICAgICAgIG1faGVpZ2h0ID0gY2luZm8tPmltYWdlX2hlaWdodDsKKyAgICAgICAgICAgIG1faXNjb2xvciA9IGNpbmZvLT5udW1fY29tcG9uZW50cyA+IDE7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgICAgIENsb3NlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBmb2xsb3dpbmcgY29kZSBpcyBmb3Igc3VwcG9ydGluZyBNSlBFRyBpbWFnZSBmaWxlcworICogYmFzZWQgb24gYSBtZXNzYWdlIG9mIExhdXJlbnQgUGluY2hhcnQgb24gdGhlIHZpZGVvNGxpbnV4IG1haWxpbmcgbGlzdAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogSlBFRyBESFQgU2VnbWVudCBmb3IgWUNyQ2Igb21pdHRlZCBmcm9tIE1KUEVHIGRhdGEgKi8KK3N0YXRpYwordW5zaWduZWQgY2hhciBteV9qcGVnX29kbWxfZGh0WzB4MWE0XSA9IHsKKyAgICAweGZmLCAweGM0LCAweDAxLCAweGEyLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMSwgMHgwNSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorICAgIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDQsIDB4MDUsIDB4MDYsIDB4MDcsIDB4MDgsIDB4MDksIDB4MGEsIDB4MGIsCisKKyAgICAweDAxLCAweDAwLCAweDAzLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLCAweDAxLAorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgwNCwgMHgwNSwgMHgwNiwgMHgwNywgMHgwOCwgMHgwOSwgMHgwYSwgMHgwYiwKKworICAgIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDQsIDB4MDMsIDB4MDUsIDB4MDUsIDB4MDQsCisgICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg3ZCwKKyAgICAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLCAweDIxLCAweDMxLCAweDQxLCAweDA2LAorICAgIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCisgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwgMHgyMywgMHg0MiwgMHhiMSwgMHhjMSwKKyAgICAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsCisgICAgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LAorICAgIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwKKyAgICAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4ODMsIDB4ODQsIDB4ODUsCisgICAgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLAorICAgIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgICAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwKKyAgICAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsCisgICAgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYxLCAweGYyLCAweGYzLCAweGY0LAorICAgIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgMHhmOSwgMHhmYSwKKworICAgIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDEsIDB4MDIsIDB4MDQsIDB4MDQsIDB4MDMsIDB4MDQsIDB4MDcsIDB4MDUsIDB4MDQsCisgICAgMHgwNCwgMHgwMCwgMHgwMSwgMHgwMiwgMHg3NywKKyAgICAweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDExLCAweDA0LCAweDA1LCAweDIxLCAweDMxLCAweDA2LCAweDEyLCAweDQxLAorICAgIDB4NTEsIDB4MDcsIDB4NjEsIDB4NzEsCisgICAgMHgxMywgMHgyMiwgMHgzMiwgMHg4MSwgMHgwOCwgMHgxNCwgMHg0MiwgMHg5MSwgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwKKyAgICAweDIzLCAweDMzLCAweDUyLCAweGYwLAorICAgIDB4MTUsIDB4NjIsIDB4NzIsIDB4ZDEsIDB4MGEsIDB4MTYsIDB4MjQsIDB4MzQsIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsCisgICAgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNiwKKyAgICAweDI3LCAweDI4LCAweDI5LCAweDJhLCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LCAweDNhLCAweDQzLCAweDQ0LAorICAgIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsCisgICAgMHg0OSwgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwKKyAgICAweDY1LCAweDY2LCAweDY3LCAweDY4LAorICAgIDB4NjksIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsCisgICAgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywKKyAgICAweDg4LCAweDg5LCAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LCAweDk5LCAweDlhLAorICAgIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsCisgICAgMHhhNiwgMHhhNywgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwKKyAgICAweGI5LCAweGJhLCAweGMyLCAweGMzLAorICAgIDB4YzQsIDB4YzUsIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsCisgICAgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwKKyAgICAweGUyLCAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLCAweGYyLCAweGYzLCAweGY0LAorICAgIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgMHhmOSwgMHhmYQorfTsKKworLyoKKyAqIFBhcnNlIHRoZSBESFQgdGFibGUuCisgKiBUaGlzIGNvZGUgY29tZXMgZnJvbSBqcGVnNmIgKGpkbWFya2VyLmMpLgorICovCitzdGF0aWMKK2ludCBteV9qcGVnX2xvYWRfZGh0IChzdHJ1Y3QganBlZ19kZWNvbXByZXNzX3N0cnVjdCAqaW5mbywgdW5zaWduZWQgY2hhciAqZGh0LAorICAgICAgICAgICAgICBKSFVGRl9UQkwgKmFjX3RhYmxlc1tdLCBKSFVGRl9UQkwgKmRjX3RhYmxlc1tdKQoreworICAgIHVuc2lnbmVkIGludCBsZW5ndGggPSAoZGh0WzJdIDw8IDgpICsgZGh0WzNdIC0gMjsKKyAgICB1bnNpZ25lZCBpbnQgcG9zID0gNDsKKyAgICB1bnNpZ25lZCBpbnQgY291bnQsIGk7CisgICAgaW50IGluZGV4OworCisgICAgSkhVRkZfVEJMICoqaHVmZnRibDsKKyAgICB1bnNpZ25lZCBjaGFyIGJpdHNbMTddOworICAgIHVuc2lnbmVkIGNoYXIgaHVmZnZhbFsyNTZdOworCisgICAgd2hpbGUgKGxlbmd0aCA+IDE2KQorICAgIHsKKyAgICAgICBiaXRzWzBdID0gMDsKKyAgICAgICBpbmRleCA9IGRodFtwb3MrK107CisgICAgICAgY291bnQgPSAwOworICAgICAgIGZvciAoaSA9IDE7IGkgPD0gMTY7ICsraSkKKyAgICAgICB7CisgICAgICAgICAgIGJpdHNbaV0gPSBkaHRbcG9zKytdOworICAgICAgICAgICBjb3VudCArPSBiaXRzW2ldOworICAgICAgIH0KKyAgICAgICBsZW5ndGggLT0gMTc7CisKKyAgICAgICBpZiAoY291bnQgPiAyNTYgfHwgY291bnQgPiBsZW5ndGgpCisgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKKyAgICAgICAgICAgaHVmZnZhbFtpXSA9IGRodFtwb3MrK107CisgICAgICAgbGVuZ3RoIC09IGNvdW50OworCisgICAgICAgaWYgKGluZGV4ICYgMHgxMCkKKyAgICAgICB7CisgICAgICAgICAgIGluZGV4IC09IDB4MTA7CisgICAgICAgICAgIGh1ZmZ0YmwgPSAmYWNfdGFibGVzW2luZGV4XTsKKyAgICAgICB9CisgICAgICAgZWxzZQorICAgICAgICAgICBodWZmdGJsID0gJmRjX3RhYmxlc1tpbmRleF07CisgICAgCisgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBOVU1fSFVGRl9UQkxTKQorICAgICAgICAgICByZXR1cm4gLTE7CisgICAgCisgICAgICAgaWYgKCpodWZmdGJsID09IE5VTEwpCisgICAgICAgICAgICpodWZmdGJsID0ganBlZ19hbGxvY19odWZmX3RhYmxlICgoal9jb21tb25fcHRyKWluZm8pOworICAgICAgIGlmICgqaHVmZnRibCA9PSBOVUxMKQorICAgICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgICBtZW1jcHkgKCgqaHVmZnRibCktPmJpdHMsIGJpdHMsIHNpemVvZiAoKmh1ZmZ0YmwpLT5iaXRzKTsKKyAgICAgICBtZW1jcHkgKCgqaHVmZnRibCktPmh1ZmZ2YWwsIGh1ZmZ2YWwsIHNpemVvZiAoKmh1ZmZ0YmwpLT5odWZmdmFsKTsKKyAgICB9CisgICAgCisgICAgaWYgKGxlbmd0aCAhPSAwKQorICAgICAgIHJldHVybiAtMTsKKyAgICAKKyAgICByZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW5kIG9mIGNvZGUgZm9yIHN1cHBvcnR0aW5nIE1KUEVHIGltYWdlIGZpbGVzCisgKiBiYXNlZCBvbiBhIG1lc3NhZ2Ugb2YgTGF1cmVudCBQaW5jaGFydCBvbiB0aGUgdmlkZW80bGludXggbWFpbGluZyBsaXN0CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitib29sICBHckZtdEpwZWdSZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIGNvbG9yID0gY29sb3IgPiAwIHx8IChtX2lzY29sb3IgJiYgY29sb3IgPCAwKTsKKyAgICAKKyAgICBpZiggbV9jaW5mbyAmJiBtX2plcnIgJiYgbV93aWR0aCAmJiBtX2hlaWdodCApCisgICAgeworICAgICAgICBqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiBjaW5mbyA9IChqcGVnX2RlY29tcHJlc3Nfc3RydWN0KiltX2NpbmZvOworICAgICAgICBHckZtdEpwZWdFcnJvck1nciogamVyciA9IChHckZtdEpwZWdFcnJvck1nciopbV9qZXJyOworICAgICAgICBKU0FNUEFSUkFZIGJ1ZmZlciA9IDA7CisgICAgICAgIAorICAgICAgICBpZiggc2V0am1wKCBqZXJyLT5zZXRqbXBfYnVmZmVyICkgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIGNoZWNrIGlmIHRoaXMgaXMgYSBtanBlZyBpbWFnZSBmb3JtYXQgKi8KKyAgICAgICAgICAgIGlmICggY2luZm8tPmFjX2h1ZmZfdGJsX3B0cnNbMF0gPT0gTlVMTCAmJgorICAgICAgICAgICAgICAgIGNpbmZvLT5hY19odWZmX3RibF9wdHJzWzFdID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBjaW5mby0+ZGNfaHVmZl90YmxfcHRyc1swXSA9PSBOVUxMICYmCisgICAgICAgICAgICAgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnNbMV0gPT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogeWVzLCB0aGlzIGlzIGEgbWpwZWcgaW1hZ2UgZm9ybWF0LCBzbyBsb2FkIHRoZSBjb3JyZWN0CisgICAgICAgICAgICAgICAgaHVmZm1hbiB0YWJsZSAqLworICAgICAgICAgICAgICAgIG15X2pwZWdfbG9hZF9kaHQoIGNpbmZvLAorICAgICAgICAgICAgICAgICAgICBteV9qcGVnX29kbWxfZGh0LAorICAgICAgICAgICAgICAgICAgICBjaW5mby0+YWNfaHVmZl90YmxfcHRycywKKyAgICAgICAgICAgICAgICAgICAgY2luZm8tPmRjX2h1ZmZfdGJsX3B0cnMgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGNvbG9yID4gMCB8fCAobV9pc2NvbG9yICYmIGNvbG9yIDwgMCkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbG9yID0gMTsKKyAgICAgICAgICAgICAgICBpZiggY2luZm8tPm51bV9jb21wb25lbnRzICE9IDQgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9IEpDU19SR0I7CisgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNpbmZvLT5vdXRfY29sb3Jfc3BhY2UgPSBKQ1NfQ01ZSzsKKyAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29sb3IgPSAwOworICAgICAgICAgICAgICAgIGlmKCBjaW5mby0+bnVtX2NvbXBvbmVudHMgIT0gNCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0X2NvbG9yX3NwYWNlID0gSkNTX0dSQVlTQ0FMRTsKKyAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9jb21wb25lbnRzID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY2luZm8tPm91dF9jb2xvcl9zcGFjZSA9IEpDU19DTVlLOworICAgICAgICAgICAgICAgICAgICBjaW5mby0+b3V0X2NvbG9yX2NvbXBvbmVudHMgPSA0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAganBlZ19zdGFydF9kZWNvbXByZXNzKCBjaW5mbyApOworCisgICAgICAgICAgICBidWZmZXIgPSAoKmNpbmZvLT5tZW0tPmFsbG9jX3NhcnJheSkoKGpfY29tbW9uX3B0ciljaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUE9PTF9JTUFHRSwgbV93aWR0aCo0LCAxICk7CisKKyAgICAgICAgICAgIGZvciggOyBtX2hlaWdodC0tOyBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGpwZWdfcmVhZF9zY2FubGluZXMoIGNpbmZvLCBidWZmZXIsIDEgKTsKKyAgICAgICAgICAgICAgICBpZiggY29sb3IgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9SR0IyQkdSXzh1X0MzUiggYnVmZmVyWzBdLCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQ01ZSzJCR1JfOHVfQzRDM1IoIGJ1ZmZlclswXSwgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNpbmZvLT5vdXRfY29sb3JfY29tcG9uZW50cyA9PSAxICkKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggZGF0YSwgYnVmZmVyWzBdLCBtX3dpZHRoICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9DTVlLMkdyYXlfOHVfQzRDMVIoIGJ1ZmZlclswXSwgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAganBlZ19maW5pc2hfZGVjb21wcmVzcyggY2luZm8gKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENsb3NlKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdEpwZWdXcml0ZXIgLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdEpwZWdXcml0ZXI6OkdyRm10SnBlZ1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10V3JpdGVyKCBmaWxlbmFtZSApCit7Cit9CisKKworR3JGbXRKcGVnV3JpdGVyOjp+R3JGbXRKcGVnV3JpdGVyKCkKK3sKK30KKworCitib29sICBHckZtdEpwZWdXcml0ZXI6OldyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgLypkZXB0aCovLCBpbnQgX2NoYW5uZWxzICkKK3sKKyAgICBjb25zdCBpbnQgZGVmYXVsdF9xdWFsaXR5ID0gOTU7CisgICAgc3RydWN0IGpwZWdfY29tcHJlc3Nfc3RydWN0IGNpbmZvOworICAgIEdyRm10SnBlZ0Vycm9yTWdyIGplcnI7CisKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIEZJTEUqIGYgPSAwOworICAgIGludCBjaGFubmVscyA9IF9jaGFubmVscyA+IDEgPyAzIDogMTsKKyAgICB1Y2hhciogYnVmZmVyID0gMDsgLy8gdGVtcG9yYXJ5IGJ1ZmZlciBmb3Igcm93IGZsaXBwaW5nCisgICAgCisgICAgY2luZm8uZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIucHViKTsKKyAgICBqZXJyLnB1Yi5lcnJvcl9leGl0ID0gZXJyb3JfZXhpdDsKKworICAgIGlmKCBzZXRqbXAoIGplcnIuc2V0am1wX2J1ZmZlciApID09IDAgKQorICAgIHsKKyAgICAgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgICAgICAgZiA9IGZvcGVuKCBtX2ZpbGVuYW1lLCAid2IiICk7CisKKyAgICAgICAgaWYoIGYgKQorICAgICAgICB7CisgICAgICAgICAgICBqcGVnX3N0ZGlvX2Rlc3QoICZjaW5mbywgZiApOworCisgICAgICAgICAgICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgY2luZm8uaW1hZ2VfaGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgY2luZm8uaW5wdXRfY29tcG9uZW50cyA9IGNoYW5uZWxzOworICAgICAgICAgICAgY2luZm8uaW5fY29sb3Jfc3BhY2UgPSBjaGFubmVscyA+IDEgPyBKQ1NfUkdCIDogSkNTX0dSQVlTQ0FMRTsKKworICAgICAgICAgICAganBlZ19zZXRfZGVmYXVsdHMoICZjaW5mbyApOworICAgICAgICAgICAganBlZ19zZXRfcXVhbGl0eSggJmNpbmZvLCBkZWZhdWx0X3F1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIC8qIGxpbWl0IHRvIGJhc2VsaW5lLUpQRUcgdmFsdWVzICovICk7CisgICAgICAgICAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCAmY2luZm8sIFRSVUUgKTsKKworICAgICAgICAgICAgaWYoIGNoYW5uZWxzID4gMSApCisgICAgICAgICAgICAgICAgYnVmZmVyID0gbmV3IHVjaGFyW3dpZHRoKmNoYW5uZWxzXTsKKworICAgICAgICAgICAgZm9yKCA7IGhlaWdodC0tOyBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHVjaGFyKiBwdHIgPSAodWNoYXIqKWRhdGE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggX2NoYW5uZWxzID09IDMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjJSR0JfOHVfQzNSKCBkYXRhLCAwLCBidWZmZXIsIDAsIGN2U2l6ZSh3aWR0aCwxKSApOworICAgICAgICAgICAgICAgICAgICBwdHIgPSBidWZmZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoIF9jaGFubmVscyA9PSA0ICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1JBMkJHUl84dV9DNEMzUiggZGF0YSwgMCwgYnVmZmVyLCAwLCBjdlNpemUod2lkdGgsMSksIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgcHRyID0gYnVmZmVyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKCAmY2luZm8sICZwdHIsIDEgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAganBlZ19maW5pc2hfY29tcHJlc3MoICZjaW5mbyApOworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKGYpIGZjbG9zZShmKTsKKyAgICBqcGVnX2Rlc3Ryb3lfY29tcHJlc3MoICZjaW5mbyApOworCisgICAgZGVsZXRlW10gYnVmZmVyOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbHNlCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIEpQRUctb3JpZW50ZWQgdHdvLWxldmVsIGJpdHN0cmVhbSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworUkpwZWdCaXRTdHJlYW06OlJKcGVnQml0U3RyZWFtKCkKK3sKK30KKworUkpwZWdCaXRTdHJlYW06On5SSnBlZ0JpdFN0cmVhbSgpCit7CisgICAgQ2xvc2UoKTsKK30KKworCitib29sICBSSnBlZ0JpdFN0cmVhbTo6T3BlbiggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIENsb3NlKCk7CisgICAgQWxsb2NhdGUoKTsKKyAgICAKKyAgICBtX2lzX29wZW5lZCA9IG1fbG93X3N0cm0uT3BlbiggZmlsZW5hbWUgKTsKKyAgICBpZiggbV9pc19vcGVuZWQgKSBTZXRQb3MoMCk7CisgICAgcmV0dXJuIG1faXNfb3BlbmVkOworfQorCisKK3ZvaWQgIFJKcGVnQml0U3RyZWFtOjpDbG9zZSgpCit7CisgICAgbV9sb3dfc3RybS5DbG9zZSgpOworICAgIG1faXNfb3BlbmVkID0gZmFsc2U7Cit9CisKKwordm9pZCAgUkpwZWdCaXRTdHJlYW06OlJlYWRCbG9jaygpCit7CisgICAgdWNoYXIqIGVuZCA9IG1fc3RhcnQgKyBtX2Jsb2NrX3NpemU7CisgICAgdWNoYXIqIGN1cnJlbnQgPSBtX3N0YXJ0OworCisgICAgaWYoIHNldGptcCggbV9sb3dfc3RybS5KbXBCdWYoKSkgPT0gMCApCisgICAgeworICAgICAgICBpbnQgc3ogPSBtX3VuR2V0c2l6ZTsKKyAgICAgICAgbWVtbW92ZSggY3VycmVudCAtIHN6LCBtX2VuZCAtIHN6LCBzeiApOworICAgICAgICB3aGlsZSggY3VycmVudCA8IGVuZCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB2YWwgPSBtX2xvd19zdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgIGlmKCB2YWwgIT0gMHhmZiApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKmN1cnJlbnQrKyA9ICh1Y2hhcil2YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFsID0gbV9sb3dfc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgaWYoIHZhbCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgKmN1cnJlbnQrKyA9IDB4RkY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiggISgweEQwIDw9IHZhbCAmJiB2YWwgPD0gMHhENykgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9sb3dfc3RybS5TZXRQb3MoIG1fbG93X3N0cm0uR2V0UG9zKCkgLSAyICk7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmV0Y2hfZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorZmV0Y2hfZW5kOiA7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGlmKCBjdXJyZW50ID09IG1fc3RhcnQgJiYgbV9qbXBfc2V0ICkKKyAgICAgICAgICAgIGxvbmdqbXAoIG1fam1wX2J1ZiwgUkJTX1RIUk9XX0VPUyApOworICAgIH0KKyAgICBtX2N1cnJlbnQgPSBtX3N0YXJ0OworICAgIG1fZW5kID0gbV9zdGFydCArICgoKGN1cnJlbnQgLSBtX3N0YXJ0KSArIDMpICYgLTQpOworICAgIGlmKCAhYnNJc0JpZ0VuZGlhbigpICkKKyAgICAgICAgYnNCU3dhcEJsb2NrKCBtX3N0YXJ0LCBtX2VuZCApOworfQorCisKK3ZvaWQgIFJKcGVnQml0U3RyZWFtOjpGbHVzaCgpCit7CisgICAgbV9lbmQgPSBtX3N0YXJ0ICsgbV9ibG9ja19zaXplOworICAgIG1fY3VycmVudCA9IG1fZW5kIC0gNDsKKyAgICBtX2JpdF9pZHggPSAwOworfQorCit2b2lkICBSSnBlZ0JpdFN0cmVhbTo6QWxpZ25PbkJ5dGUoKQoreworICAgIG1fYml0X2lkeCAmPSAtODsKK30KKworaW50ICBSSnBlZ0JpdFN0cmVhbTo6RmluZE1hcmtlcigpCit7CisgICAgaW50IGNvZGUgPSBtX2xvd19zdHJtLkdldFdvcmQoKTsKKyAgICB3aGlsZSggKGNvZGUgJiAweEZGMDApICE9IDB4RkYwMCB8fCAoY29kZSA9PSAweEZGRkYgfHwgY29kZSA9PSAweEZGMDAgKSkKKyAgICB7CisgICAgICAgIGNvZGUgPSAoKGNvZGUmMjU1KSA8PCA4KSB8IG1fbG93X3N0cm0uR2V0Qnl0ZSgpOworICAgIH0KKyAgICByZXR1cm4gY29kZTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIEpQRUcgKEpGSUYpIHJlYWRlciAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8vIHppZ3phZyAmIElEQ1QgcHJlc2NhbGluZyAoQUFOIGFsZ29yaXRobSkgdGFibGVzCitzdGF0aWMgY29uc3QgdWNoYXIgemlnemFnW10gPQoreworICAwLCAgOCwgIDEsICAyLCAgOSwgMTYsIDI0LCAxNywgMTAsICAzLCAgNCwgMTEsIDE4LCAyNSwgMzIsIDQwLAorIDMzLCAyNiwgMTksIDEyLCAgNSwgIDYsIDEzLCAyMCwgMjcsIDM0LCA0MSwgNDgsIDU2LCA0OSwgNDIsIDM1LAorIDI4LCAyMSwgMTQsICA3LCAxNSwgMjIsIDI5LCAzNiwgNDMsIDUwLCA1NywgNTgsIDUxLCA0NCwgMzcsIDMwLAorIDIzLCAzMSwgMzgsIDQ1LCA1MiwgNTksIDYwLCA1MywgNDYsIDM5LCA0NywgNTQsIDYxLCA2MiwgNTUsIDYzLAorIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzLCA2MywgNjMsIDYzCit9OworCisKK3N0YXRpYyBjb25zdCBpbnQgaWRjdF9wcmVzY2FsZVtdID0KK3sKKyAgICAxNjM4NCwgMjI3MjUsIDIxNDA3LCAxOTI2NiwgMTYzODQsIDEyODczLCAgODg2NywgIDQ1MjAsCisgICAgMjI3MjUsIDMxNTIxLCAyOTY5MiwgMjY3MjIsIDIyNzI1LCAxNzg1NSwgMTIyOTksICA2MjcwLAorICAgIDIxNDA3LCAyOTY5MiwgMjc5NjksIDI1MTcyLCAyMTQwNywgMTY4MTksIDExNTg1LCAgNTkwNiwKKyAgICAxOTI2NiwgMjY3MjIsIDI1MTcyLCAyMjY1NCwgMTkyNjYsIDE1MTM3LCAxMDQyNiwgIDUzMTUsCisgICAgMTYzODQsIDIyNzI1LCAyMTQwNywgMTkyNjYsIDE2Mzg0LCAxMjg3MywgIDg4NjcsICA0NTIwLAorICAgIDEyODczLCAxNzg1NSwgMTY4MTksIDE1MTM3LCAxMjg3MywgMTAxMTQsICA2OTY3LCAgMzU1MiwKKyAgICAgODg2NywgMTIyOTksIDExNTg1LCAxMDQyNiwgIDg4NjcsICA2OTY3LCAgNDc5OSwgIDI0NDYsCisgICAgIDQ1MjAsICA2MjcwLCAgNTkwNiwgIDUzMTUsICA0NTIwLCAgMzU1MiwgIDI0NDYsICAxMjQ3Cit9OworCisKKyNkZWZpbmUgZml4YiAgICAgICAgIDE0CisjZGVmaW5lIGZpeCh4LCBuKSAgICAoaW50KSgoeCkqKDEgPDwgKG4pKSArIC41KQorI2RlZmluZSBmaXgxKHgsIG4pICAgKHgpCisjZGVmaW5lIGZpeG11bCh4KSAgICAoeCkKKworI2RlZmluZSBDMF83MDcgICAgIGZpeCggMC43MDcxMDY3ODFmLCBmaXhiICkKKyNkZWZpbmUgQzBfOTI0ICAgICBmaXgoIDAuOTIzODc5NTMzZiwgZml4YiApCisjZGVmaW5lIEMwXzU0MSAgICAgZml4KCAwLjU0MTE5NjEwMGYsIGZpeGIgKQorI2RlZmluZSBDMF8zODIgICAgIGZpeCggMC4zODI2ODM0MzJmLCBmaXhiICkKKyNkZWZpbmUgQzFfMzA2ICAgICBmaXgoIDEuMzA2NTYyOTY1ZiwgZml4YiApCisKKyNkZWZpbmUgQzFfMDgyICAgICBmaXgoIDEuMDgyMzkyMjAwZiwgZml4YiApCisjZGVmaW5lIEMxXzQxNCAgICAgZml4KCAxLjQxNDIxMzU2MmYsIGZpeGIgKQorI2RlZmluZSBDMV84NDcgICAgIGZpeCggMS44NDc3NTkwNjVmLCBmaXhiICkKKyNkZWZpbmUgQzJfNjEzICAgICBmaXgoIDIuNjEzMTI1OTMwZiwgZml4YiApCisKKyNkZWZpbmUgZml4YyAgICAgICAxMgorI2RlZmluZSBiX2NiICAgICAgIGZpeCggMS43NzIsIGZpeGMgKQorI2RlZmluZSBnX2NiICAgICAgLWZpeCggMC4zNDQxNCwgZml4YyApCisjZGVmaW5lIGdfY3IgICAgICAtZml4KCAwLjcxNDE0LCBmaXhjICkKKyNkZWZpbmUgcl9jciAgICAgICBmaXgoIDEuNDAyLCBmaXhjICkKKworI2RlZmluZSB5X3IgICAgICAgIGZpeCggMC4yOTksIGZpeGMgKQorI2RlZmluZSB5X2cgICAgICAgIGZpeCggMC41ODcsIGZpeGMgKQorI2RlZmluZSB5X2IgICAgICAgIGZpeCggMC4xMTQsIGZpeGMgKQorCisjZGVmaW5lIGNiX3IgICAgICAtZml4KCAwLjE2ODcsIGZpeGMgKQorI2RlZmluZSBjYl9nICAgICAgLWZpeCggMC4zMzEzLCBmaXhjICkKKyNkZWZpbmUgY2JfYiAgICAgICBmaXgoIDAuNSwgICAgZml4YyApCisKKyNkZWZpbmUgY3JfciAgICAgICBmaXgoIDAuNSwgICAgZml4YyApCisjZGVmaW5lIGNyX2cgICAgICAtZml4KCAwLjQxODcsIGZpeGMgKQorI2RlZmluZSBjcl9iICAgICAgLWZpeCggMC4wODEzLCBmaXhjICkKKworCisvLyBJRENUIHdpdGhvdXQgcHJlc2NhbGluZworc3RhdGljIHZvaWQgYWFuX2lkY3Q4eDgoIGludCAqc3JjLCBpbnQgKmRzdCwgaW50IHN0ZXAgKQoreworICAgIGludCAgIHdvcmtzcGFjZVs2NF0sICp3b3JrID0gd29ya3NwYWNlOworICAgIGludCAgIGk7CisKKyAgICAvKiBQYXNzIDE6IHByb2Nlc3Mgcm93cyAqLworICAgIGZvciggaSA9IDg7IGkgPiAwOyBpLS0sIHNyYyArPSA4LCB3b3JrICs9IDggKQorICAgIHsKKyAgICAgICAgLyogT2RkIHBhcnQgKi8KKyAgICAgICAgaW50ICB4MCA9IHNyY1s1XSwgeDEgPSBzcmNbM107CisgICAgICAgIGludCAgeDIgPSBzcmNbMV0sIHgzID0gc3JjWzddOworCisgICAgICAgIGludCAgeDQgPSB4MCArIHgxOyB4MCAtPSB4MTsKKworICAgICAgICB4MSA9IHgyICsgeDM7IHgyIC09IHgzOworICAgICAgICB4MyA9IHgxICsgeDQ7IHgxIC09IHg0OworCisgICAgICAgIHg0ID0gKHgwICsgeDIpKkMxXzg0NzsKKyAgICAgICAgeDAgPSBkZXNjYWxlKCB4NCAtIHgwKkMyXzYxMywgZml4Yik7CisgICAgICAgIHgyID0gZGVzY2FsZSggeDIqQzFfMDgyIC0geDQsIGZpeGIpOworICAgICAgICB4MSA9IGRlc2NhbGUoIHgxKkMxXzQxNCwgZml4Yik7CisKKyAgICAgICAgeDAgLT0geDM7CisgICAgICAgIHgxIC09IHgwOworICAgICAgICB4MiArPSB4MTsKKworICAgICAgICB3b3JrWzddID0geDM7IHdvcmtbNl0gPSB4MDsKKyAgICAgICAgd29ya1s1XSA9IHgxOyB3b3JrWzRdID0geDI7CisKKyAgICAgICAgLyogRXZlbiBwYXJ0ICovCisgICAgICAgIHgyID0gc3JjWzJdOyB4MyA9IHNyY1s2XTsKKyAgICAgICAgeDAgPSBzcmNbMF07IHgxID0gc3JjWzRdOworCisgICAgICAgIHg0ID0geDIgKyB4MzsKKyAgICAgICAgeDIgPSBkZXNjYWxlKCh4Mi14MykqQzFfNDE0LCBmaXhiKSAtIHg0OworCisgICAgICAgIHgzID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDMgKyB4NDsgeDMgLT0geDQ7CisgICAgICAgIHg0ID0geDAgKyB4MjsgeDAgLT0geDI7CisKKyAgICAgICAgeDIgPSB3b3JrWzddOworICAgICAgICB4MSAtPSB4MjsgeDIgPSAyKngyICsgeDE7CisgICAgICAgIHdvcmtbN10gPSB4MTsgd29ya1swXSA9IHgyOworCisgICAgICAgIHgyID0gd29ya1s2XTsKKyAgICAgICAgeDEgPSB4NCArIHgyOyB4NCAtPSB4MjsKKyAgICAgICAgd29ya1sxXSA9IHgxOyB3b3JrWzZdID0geDQ7CisKKyAgICAgICAgeDEgPSB3b3JrWzVdOyB4MiA9IHdvcmtbNF07CisgICAgICAgIHg0ID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDMgKyB4MjsgeDMgLT0geDI7CisKKyAgICAgICAgd29ya1syXSA9IHg0OyB3b3JrWzVdID0geDA7CisgICAgICAgIHdvcmtbM10gPSB4Mzsgd29ya1s0XSA9IHgxOworICAgIH0KKworICAgIC8qIFBhc3MgMjogcHJvY2VzcyBjb2x1bW5zICovCisgICAgd29yayA9IHdvcmtzcGFjZTsKKyAgICBmb3IoIGkgPSA4OyBpID4gMDsgaS0tLCBkc3QgKz0gc3RlcCwgd29yaysrICkKKyAgICB7CisgICAgICAgIC8qIE9kZCBwYXJ0ICovCisgICAgICAgIGludCAgeDAgPSB3b3JrWzgqNV0sIHgxID0gd29ya1s4KjNdOworICAgICAgICBpbnQgIHgyID0gd29ya1s4KjFdLCB4MyA9IHdvcmtbOCo3XTsKKworICAgICAgICBpbnQgIHg0ID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDIgKyB4MzsgeDIgLT0geDM7CisgICAgICAgIHgzID0geDEgKyB4NDsgeDEgLT0geDQ7CisKKyAgICAgICAgeDQgPSAoeDAgKyB4MikqQzFfODQ3OworICAgICAgICB4MCA9IGRlc2NhbGUoIHg0IC0geDAqQzJfNjEzLCBmaXhiKTsKKyAgICAgICAgeDIgPSBkZXNjYWxlKCB4MipDMV8wODIgLSB4NCwgZml4Yik7CisgICAgICAgIHgxID0gZGVzY2FsZSggeDEqQzFfNDE0LCBmaXhiKTsKKworICAgICAgICB4MCAtPSB4MzsKKyAgICAgICAgeDEgLT0geDA7CisgICAgICAgIHgyICs9IHgxOworCisgICAgICAgIGRzdFs3XSA9IHgzOyBkc3RbNl0gPSB4MDsKKyAgICAgICAgZHN0WzVdID0geDE7IGRzdFs0XSA9IHgyOworCisgICAgICAgIC8qIEV2ZW4gcGFydCAqLworICAgICAgICB4MiA9IHdvcmtbOCoyXTsgeDMgPSB3b3JrWzgqNl07CisgICAgICAgIHgwID0gd29ya1s4KjBdOyB4MSA9IHdvcmtbOCo0XTsKKworICAgICAgICB4NCA9IHgyICsgeDM7CisgICAgICAgIHgyID0gZGVzY2FsZSgoeDIteDMpKkMxXzQxNCwgZml4YikgLSB4NDsKKworICAgICAgICB4MyA9IHgwICsgeDE7IHgwIC09IHgxOworICAgICAgICB4MSA9IHgzICsgeDQ7IHgzIC09IHg0OworICAgICAgICB4NCA9IHgwICsgeDI7IHgwIC09IHgyOworCisgICAgICAgIHgyID0gZHN0WzddOworICAgICAgICB4MSAtPSB4MjsgeDIgPSAyKngyICsgeDE7CisgICAgICAgIHgxID0gZGVzY2FsZSh4MSwzKTsKKyAgICAgICAgeDIgPSBkZXNjYWxlKHgyLDMpOworCisgICAgICAgIGRzdFs3XSA9IHgxOyBkc3RbMF0gPSB4MjsKKworICAgICAgICB4MiA9IGRzdFs2XTsKKyAgICAgICAgeDEgPSBkZXNjYWxlKHg0ICsgeDIsMyk7CisgICAgICAgIHg0ID0gZGVzY2FsZSh4NCAtIHgyLDMpOworICAgICAgICBkc3RbMV0gPSB4MTsgZHN0WzZdID0geDQ7CisKKyAgICAgICAgeDEgPSBkc3RbNV07IHgyID0gZHN0WzRdOworCisgICAgICAgIHg0ID0gZGVzY2FsZSh4MCArIHgxLDMpOworICAgICAgICB4MCA9IGRlc2NhbGUoeDAgLSB4MSwzKTsKKyAgICAgICAgeDEgPSBkZXNjYWxlKHgzICsgeDIsMyk7CisgICAgICAgIHgzID0gZGVzY2FsZSh4MyAtIHgyLDMpOworICAgICAgIAorICAgICAgICBkc3RbMl0gPSB4NDsgZHN0WzVdID0geDA7CisgICAgICAgIGRzdFszXSA9IHgzOyBkc3RbNF0gPSB4MTsKKyAgICB9Cit9CisKKworc3RhdGljIGNvbnN0IGludCBtYXhfZGVjX2h0YWJsZV9zaXplID0gMSA8PCAxMjsKK3N0YXRpYyBjb25zdCBpbnQgZmlyc3RfdGFibGVfYml0cyA9IDk7CisKK0dyRm10SnBlZ1JlYWRlcjo6R3JGbXRKcGVnUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApIDogR3JGbXRSZWFkZXIoIGZpbGVuYW1lICkKK3sKKyAgICBtX3BsYW5lcz0gLTE7CisgICAgbV9vZmZzZXQ9IC0xOworCisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKyApCisgICAgeworICAgICAgICBtX3RkW2ldID0gbmV3IHNob3J0W21heF9kZWNfaHRhYmxlX3NpemVdOworICAgICAgICBtX3RhW2ldID0gbmV3IHNob3J0W21heF9kZWNfaHRhYmxlX3NpemVdOworICAgIH0KK30KKworCitHckZtdEpwZWdSZWFkZXI6On5HckZtdEpwZWdSZWFkZXIoKQoreworICAgIGZvciggaW50IGkgPSAwOyBpIDwgNDsgaSsrICkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIG1fdGRbaV07CisgICAgICAgIG1fdGRbaV0gPSAwOworICAgICAgICBkZWxldGVbXSBtX3RhW2ldOworICAgICAgICBtX3RhW2ldID0gMDsKKyAgICB9Cit9CisKKwordm9pZCAgR3JGbXRKcGVnUmVhZGVyOjpDbG9zZSgpCit7CisgICAgbV9zdHJtLkNsb3NlKCk7CisgICAgR3JGbXRSZWFkZXI6OkNsb3NlKCk7Cit9CisKKworYm9vbCBHckZtdEpwZWdSZWFkZXI6OlJlYWRIZWFkZXIoKQoreworICAgIGNoYXIgYnVmZmVyWzE2XTsKKyAgICBpbnQgIGk7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZSwgaXNfc29mID0gZmFsc2UsIAorICAgICAgICAgaXNfcXQgPSBmYWxzZSwgaXNfaHQgPSBmYWxzZSwgaXNfc29zID0gZmFsc2U7CisgICAgCisgICAgYXNzZXJ0KCBzdHJsZW4obV9maWxlbmFtZSkgIT0gMCApOworICAgIGlmKCAhbV9zdHJtLk9wZW4oIG1fZmlsZW5hbWUgKSkgcmV0dXJuIGZhbHNlOworCisgICAgbWVtc2V0KCBtX2lzX3RxLCAwLCBzaXplb2YobV9pc190cSkpOworICAgIG1lbXNldCggbV9pc190ZCwgMCwgc2l6ZW9mKG1faXNfdGQpKTsKKyAgICBtZW1zZXQoIG1faXNfdGEsIDAsIHNpemVvZihtX2lzX3RhKSk7CisgICAgbV9NQ1VzID0gMDsKKworICAgIGlmKCBzZXRqbXAoIG1fc3RybS5KbXBCdWYoKSkgPT0gMCApCisgICAgeworICAgICAgICBSTUJ5dGVTdHJlYW0mIGxzdHJtID0gbV9zdHJtLm1fbG93X3N0cm07CisgICAgICAgIAorICAgICAgICBsc3RybS5Ta2lwKCAyICk7IC8vIHNraXAgU09JIG1hcmtlcgorICAgICAgICAKKyAgICAgICAgZm9yKDs7KQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbWFya2VyID0gbV9zdHJtLkZpbmRNYXJrZXIoKSAmIDI1NTsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHN0YW5kYWxvbmUgbWFya2VycworICAgICAgICAgICAgaWYoIG1hcmtlciAhPSAweEQ4IC8qIFNPSSAqLyAmJiBtYXJrZXIgIT0gMHhEOSAvKiBFT0kgKi8gJiYKKyAgICAgICAgICAgICAgICBtYXJrZXIgIT0gMHgwMSAvKiBURU0gKi8gJiYgISggMHhEMCA8PSBtYXJrZXIgJiYgbWFya2VyIDw9IDB4RDcgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcG9zICAgID0gbHN0cm0uR2V0UG9zKCk7CisgICAgICAgICAgICAgICAgaW50IGxlbmd0aCA9IGxzdHJtLkdldFdvcmQoKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHN3aXRjaCggbWFya2VyICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSAweEUwOiAvLyBBUFAwCisgICAgICAgICAgICAgICAgICAgIGxzdHJtLkdldEJ5dGVzKCBidWZmZXIsIDUgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cmNtcChidWZmZXIsICJKRklGIikgPT0gMCApIC8vIEpGSUYgaWRlbnRpZmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92ZXJzaW9uID0gbHN0cm0uR2V0V29yZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9pc19qZmlmID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHhDMDogLy8gU09GMAorICAgICAgICAgICAgICAgICAgICBtX3ByZWNpc2lvbiA9IGxzdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbV9oZWlnaHQgPSBsc3RybS5HZXRXb3JkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fd2lkdGggPSBsc3RybS5HZXRXb3JkKCk7CisgICAgICAgICAgICAgICAgICAgIG1fcGxhbmVzID0gbHN0cm0uR2V0Qnl0ZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBtX3dpZHRoID09IDAgfHwgbV9oZWlnaHQgPT0gMCB8fCAvLyBETkwgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgICAgICAgICAgICAobV9wbGFuZXMgIT0gMSAmJiBtX3BsYW5lcyAhPSAzKSkgZ290byBwYXJzaW5nX2VuZDsKKworICAgICAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSBtX3BsYW5lcyA9PSAzOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBtZW1zZXQoIG1fY2ksIC0xLCBzaXplb2YobV9jaSkpOworCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBtX3BsYW5lczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkeCA9IGxzdHJtLkdldEJ5dGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGlkeCA8IDEgfHwgaWR4ID4gbV9wbGFuZXMgKSAvLyB3cm9uZyBpbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IGkrMTsgLy8gaGFjaworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY21wX2luZm8mIGNpID0gbV9jaVtpZHgtMV07CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjaS50cSA+IDAgLyogZHVwbGljYXRlZCBkZXNjcmlwdGlvbiAqLykgZ290byBwYXJzaW5nX2VuZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2kuaCA9IChjaGFyKWxzdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNpLnYgPSAoY2hhcikoY2kuaCAmIDE1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNpLmggPj49IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjaS50cSA9IChjaGFyKWxzdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhKChjaS5oID09IDEgfHwgY2kuaCA9PSAyIHx8IGNpLmggPT0gNCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaS52ID09IDEgfHwgY2kudiA9PSAyIHx8IGNpLnYgPT0gNCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLnRxIDwgMykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaHJvbWEgbWN1LXBhcnRzIHNob3VsZCBoYXZlIGVxdWFsIHNpemVzIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlIG5vbiBncmVhdGVyIHRoZW4gbHVtYSBzaXplcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoIGkgIT0gMiB8fCAoY2kuaCA9PSBtX2NpWzFdLmggJiYgY2kudiA9PSBtX2NpWzFdLnYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpLmggPD0gbV9jaVswXS5oICYmIGNpLnYgPD0gbV9jaVswXS52KSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBwYXJzaW5nX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpc19zb2YgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX3R5cGUgPSBtYXJrZXIgLSAweEMwOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHhEQjogLy8gRFFUCisgICAgICAgICAgICAgICAgICAgIGlmKCAhTG9hZFF1YW50VGFibGVzKCBsZW5ndGggKSkgZ290byBwYXJzaW5nX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgaXNfcXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHhDNDogLy8gREhUCisgICAgICAgICAgICAgICAgICAgIGlmKCAhTG9hZEh1ZmZtYW5UYWJsZXMoIGxlbmd0aCApKSBnb3RvIHBhcnNpbmdfZW5kOworICAgICAgICAgICAgICAgICAgICBpc19odCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAweERBOiAvLyBTT1MKKyAgICAgICAgICAgICAgICAgICAgaXNfc29zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgbV9vZmZzZXQgPSBwb3MgLSAyOworICAgICAgICAgICAgICAgICAgICBnb3RvIHBhcnNpbmdfZW5kOworCisgICAgICAgICAgICAgICAgY2FzZSAweEREOiAvLyBEUkkKKyAgICAgICAgICAgICAgICAgICAgbV9NQ1VzID0gbHN0cm0uR2V0V29yZCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbHN0cm0uU2V0UG9zKCBwb3MgKyBsZW5ndGggKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorcGFyc2luZ19lbmQ6IDsKKyAgICB9CisKKyAgICByZXN1bHQgPSAvKmlzX2pmaWYgJiYqLyBpc19zb2YgJiYgaXNfcXQgJiYgaXNfaHQgJiYgaXNfc29zOworICAgIGlmKCAhcmVzdWx0ICkKKyAgICB7CisgICAgICAgIG1fd2lkdGggPSBtX2hlaWdodCA9IC0xOworICAgICAgICBtX29mZnNldCA9IC0xOworICAgICAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sIEdyRm10SnBlZ1JlYWRlcjo6TG9hZFF1YW50VGFibGVzKCBpbnQgbGVuZ3RoICkKK3sKKyAgICB1Y2hhciBidWZmZXJbMTI4XTsKKyAgICBpbnQgIGksIHRxX3NpemU7CisgICAgCisgICAgUk1CeXRlU3RyZWFtJiBsc3RybSA9IG1fc3RybS5tX2xvd19zdHJtOworICAgIGxlbmd0aCAtPSAyOworCisgICAgd2hpbGUoIGxlbmd0aCA+IDAgKQorICAgIHsKKyAgICAgICAgaW50IHRxID0gbHN0cm0uR2V0Qnl0ZSgpOworICAgICAgICBpbnQgc2l6ZSA9IHRxID4+IDQ7CisgICAgICAgIHRxICY9IDE1OworCisgICAgICAgIHRxX3NpemUgPSAoNjQ8PHNpemUpICsgMTsgCisgICAgICAgIGlmKCB0cSA+IDMgfHwgc2l6ZSA+IDEgfHwgbGVuZ3RoIDwgdHFfc2l6ZSApIHJldHVybiBmYWxzZTsKKyAgICAgICAgbGVuZ3RoIC09IHRxX3NpemU7CisKKyAgICAgICAgbHN0cm0uR2V0Qnl0ZXMoIGJ1ZmZlciwgdHFfc2l6ZSAtIDEgKTsKKyAgICAgICAgCisgICAgICAgIGlmKCBzaXplID09IDAgKSAvLyA4IGJpdCBxdWFudCBmYWN0b3JzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA2NDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gemlnemFnW2ldOworICAgICAgICAgICAgICAgIG1fdHFbdHFdW2lkeF0gPSBidWZmZXJbaV0gKiAxNiAqIGlkY3RfcHJlc2NhbGVbaWR4XTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIDE2IGJpdCBxdWFudCBmYWN0b3JzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCA2NDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaWR4ID0gemlnemFnW2ldOworICAgICAgICAgICAgICAgIG1fdHFbdHFdW2lkeF0gPSAoKHVuc2lnbmVkIHNob3J0KilidWZmZXIpW2ldICogaWRjdF9wcmVzY2FsZVtpZHhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1faXNfdHFbdHFdID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEdyRm10SnBlZ1JlYWRlcjo6TG9hZEh1ZmZtYW5UYWJsZXMoIGludCBsZW5ndGggKQoreworICAgIGNvbnN0IGludCBtYXhfYml0cyA9IDE2OworICAgIHVjaGFyIGJ1ZmZlclsxMDI0XTsKKyAgICBpbnQgIGJ1ZmZlcjJbMTAyNF07CisKKyAgICBpbnQgIGksIGh0X3NpemU7CisgICAgUk1CeXRlU3RyZWFtJiBsc3RybSA9IG1fc3RybS5tX2xvd19zdHJtOworICAgIGxlbmd0aCAtPSAyOworCisgICAgd2hpbGUoIGxlbmd0aCA+IDAgKQorICAgIHsKKyAgICAgICAgaW50IHQgPSBsc3RybS5HZXRCeXRlKCk7CisgICAgICAgIGludCBoY2xhc3MgPSB0ID4+IDQ7CisgICAgICAgIHQgJj0gMTU7CisKKyAgICAgICAgaWYoIHQgPiAzIHx8IGhjbGFzcyA+IDEgfHwgbGVuZ3RoIDwgMTcgKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGxlbmd0aCAtPSAxNzsKKworICAgICAgICBsc3RybS5HZXRCeXRlcyggYnVmZmVyLCBtYXhfYml0cyApOworICAgICAgICBmb3IoIGkgPSAwLCBodF9zaXplID0gMDsgaSA8IG1heF9iaXRzOyBpKysgKSBodF9zaXplICs9IGJ1ZmZlcltpXTsKKworICAgICAgICBpZiggbGVuZ3RoIDwgaHRfc2l6ZSApIHJldHVybiBmYWxzZTsKKyAgICAgICAgbGVuZ3RoIC09IGh0X3NpemU7CisKKyAgICAgICAgbHN0cm0uR2V0Qnl0ZXMoIGJ1ZmZlciArIG1heF9iaXRzLCBodF9zaXplICk7CisgICAgICAgIAorICAgICAgICBpZiggITo6YnNDcmVhdGVEZWNvZGVIdWZmbWFuVGFibGUoIAorICAgICAgICAgICAgICAgICAgOjpic0NyZWF0ZVNvdXJjZUh1ZmZtYW5UYWJsZSggCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlcjIsIG1heF9iaXRzLCBmaXJzdF90YWJsZV9iaXRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBoY2xhc3MgPT0gMCA/IG1fdGRbdF0gOiBtX3RhW3RdLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kZWNfaHRhYmxlX3NpemUgKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiggaGNsYXNzID09IDAgKQorICAgICAgICAgICAgbV9pc190ZFt0XSA9IHRydWU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1faXNfdGFbdF0gPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEdyRm10SnBlZ1JlYWRlcjo6UmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICkKK3sKKyAgICBpZiggbV9vZmZzZXQgPCAwIHx8ICFtX3N0cm0uSXNPcGVuZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYoIHNldGptcCggbV9zdHJtLkptcEJ1ZigpKSA9PSAwICkKKyAgICB7CisgICAgICAgIFJNQnl0ZVN0cmVhbSYgbHN0cm0gPSBtX3N0cm0ubV9sb3dfc3RybTsKKyAgICAgICAgbHN0cm0uU2V0UG9zKCBtX29mZnNldCApOworCisgICAgICAgIGZvcig7OykKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG1hcmtlciA9IG1fc3RybS5GaW5kTWFya2VyKCkgJiAyNTU7CisKKyAgICAgICAgICAgIGlmKCBtYXJrZXIgPT0gMHhEOCAvKiBTT0kgKi8gfHwgbWFya2VyID09IDB4RDkgLyogRU9JICovICkKKyAgICAgICAgICAgICAgICBnb3RvIGRlY29kaW5nX2VuZDsKKworICAgICAgICAgICAgLy8gY2hlY2sgZm9yIHN0YW5kYWxvbmUgbWFya2VycworICAgICAgICAgICAgaWYoIG1hcmtlciAhPSAweDAxIC8qIFRFTSAqLyAmJiAhKCAweEQwIDw9IG1hcmtlciAmJiBtYXJrZXIgPD0gMHhENyApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCBwb3MgICAgPSBsc3RybS5HZXRQb3MoKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gbHN0cm0uR2V0V29yZCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgc3dpdGNoKCBtYXJrZXIgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjYXNlIDB4QzQ6IC8vIERIVAorICAgICAgICAgICAgICAgICAgICBpZiggIUxvYWRIdWZmbWFuVGFibGVzKCBsZW5ndGggKSkgZ290byBkZWNvZGluZ19lbmQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAweERBOiAvLyBTT1MKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBzY2FuIGhlYWRlcgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWR4WzNdID0geyAtMSwgLTEsIC0xIH07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaSwgbnMgPSBsc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3VtID0gMCwgYTsgLy8gc3BlY3RyYWwgc2VsZWN0aW9uICYgYXBwcm94aW1hdGlvbgorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbnMgIT0gbV9wbGFuZXMgKSBnb3RvIGRlY29kaW5nX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBuczsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGQsIHRhLCBjID0gbHN0cm0uR2V0Qnl0ZSgpIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggYyA8IDAgfHwgbV9wbGFuZXMgPD0gYyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gaTsgLy8gaGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggaWR4W2NdICE9IC0xICkgZ290byBkZWNvZGluZ19lbmQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4W2ldID0gYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZCA9IGxzdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YSA9IHRkICYgMTU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGQgPj49IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoICEodGEgPD0gMyAmJiBtX2lzX3RhW3RhXSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZCA8PSAzICYmIG1faXNfdGRbdGRdICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pc190cVttX2NpW2NdLnRxXSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGRlY29kaW5nX2VuZDsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY2lbY10udGQgPSAoY2hhcil0ZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2NpW2NdLnRhID0gKGNoYXIpdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gbV9jaVtjXS5oKm1fY2lbY10udjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHN1bSA+IDEwICkgZ290byBkZWNvZGluZ19lbmQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fc3MgPSBsc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3NlID0gbHN0cm0uR2V0Qnl0ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhID0gbHN0cm0uR2V0Qnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9hbCA9IGEgJiAxNTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fYWggPSBhID4+IDQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb2Nlc3NTY2FuKCBpZHgsIG5zLCBkYXRhLCBzdGVwLCBjb2xvciApOworICAgICAgICAgICAgICAgICAgICAgICAgZ290byBkZWNvZGluZ19lbmQ7IC8vIG9ubHkgc2luZ2xlIHNjYW4gY2FzZSBpcyBzdXBwb3J0ZWQgbm93CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvL21fb2Zmc2V0ID0gcG9zIC0gMjsKKyAgICAgICAgICAgICAgICAgICAgLy9icmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgMHhERDogLy8gRFJJCisgICAgICAgICAgICAgICAgICAgIG1fTUNVcyA9IGxzdHJtLkdldFdvcmQoKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmKCBtYXJrZXIgIT0gMHhEQSApIGxzdHJtLlNldFBvcyggcG9zICsgbGVuZ3RoICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK2RlY29kaW5nX2VuZDogOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQgIEdyRm10SnBlZ1JlYWRlcjo6UmVzZXREZWNvZGVyKCkKK3sKKyAgICBtX2NpWzBdLmRjX3ByZWQgPSBtX2NpWzFdLmRjX3ByZWQgPSBtX2NpWzJdLmRjX3ByZWQgPSAwOyAKK30KKwordm9pZCAgR3JGbXRKcGVnUmVhZGVyOjpQcm9jZXNzU2NhbiggaW50KiBpZHgsIGludCBucywgdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKQoreworICAgIGludCAgIGksIHMgPSAwLCBtY3UsIHgxID0gMCwgeTEgPSAwOworICAgIGludCAgIHRlbXBbNjRdOworICAgIGludCAgIGJsb2Nrc1sxMF1bNjRdOworICAgIGludCAgIHBvc1szXSwgaFszXSwgdlszXTsKKyAgICBpbnQgICB4X3NoaWZ0ID0gMCwgeV9zaGlmdCA9IDA7CisgICAgaW50ICAgbmNoID0gY29sb3IgPyAzIDogMTsKKworICAgIGFzc2VydCggbnMgPT0gbV9wbGFuZXMgJiYgbV9zcyA9PSAwICYmIG1fc2UgPT0gNjMgJiYKKyAgICAgICAgICAgIG1fYWwgPT0gMCAmJiBtX2FoID09IDAgKTsgLy8gc2VxdWVudGFsICYgc2luZ2xlIHNjYW4KKworICAgIGFzc2VydCggaWR4WzBdID09IDAgJiYgKG5zID09MSB8fCAoaWR4WzFdID09IDEgJiYgaWR4WzJdID09IDIpKSk7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnM7IGkrKyApCisgICAgeworICAgICAgICBpbnQgYyA9IGlkeFtpXTsKKyAgICAgICAgaFtjXSA9IG1fY2lbY10uaCo4OworICAgICAgICB2W2NdID0gbV9jaVtjXS52Kjg7CisgICAgICAgIHBvc1tjXSA9IHMgPj4gNjsKKyAgICAgICAgcyArPSBoW2NdKnZbY107CisgICAgfQorCisgICAgaWYoIG5zID09IDMgKQorICAgIHsKKyAgICAgICAgeF9zaGlmdCA9IGhbMF0vKGhbMV0qMik7CisgICAgICAgIHlfc2hpZnQgPSB2WzBdLyh2WzFdKjIpOworICAgIH0KKworICAgIG1fc3RybS5GbHVzaCgpOworICAgIFJlc2V0RGVjb2RlcigpOworCisgICAgZm9yKCBtY3UgPSAwOzsgbWN1KysgKQorICAgIHsKKyAgICAgICAgaW50ICB4MiwgeTIsIHgsIHksIHhjOworICAgICAgICBpbnQqIGNtcDsKKyAgICAgICAgdWNoYXIqIGRhdGExOworICAgICAgICAKKyAgICAgICAgaWYoIG1jdSA9PSBtX01DVXMgJiYgbV9NQ1VzICE9IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBSZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIG1fc3RybS5BbGlnbk9uQnl0ZSgpOworICAgICAgICAgICAgbWN1ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBtY3UKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IG5zOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgIGMgPSBpZHhbaV07CisgICAgICAgICAgICBjbXAgPSBibG9ja3NbcG9zW2NdXTsKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCB2W2NdOyB5ICs9IDgsIGNtcCArPSBoW2NdKjggKQorICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBoW2NdOyB4ICs9IDggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgR2V0QmxvY2soIHRlbXAsIGMgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGkgPCAoY29sb3IgPyAzIDogMSkpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFhbl9pZGN0OHg4KCB0ZW1wLCBjbXAgKyB4LCBoW2NdICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB5MiA9IHZbMF07CisgICAgICAgIHgyID0gaFswXTsKKworICAgICAgICBpZiggeTEgKyB5MiA+IG1faGVpZ2h0ICkgeTIgPSBtX2hlaWdodCAtIHkxOworICAgICAgICBpZiggeDEgKyB4MiA+IG1fd2lkdGggKSB4MiA9IG1fd2lkdGggLSB4MTsKKworICAgICAgICBjbXAgPSBibG9ja3NbMF07CisgICAgICAgIGRhdGExID0gZGF0YSArIHgxKm5jaDsKKworICAgICAgICBpZiggbnMgPT0gMSApCisgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgeTI7IHkrKywgZGF0YTEgKz0gc3RlcCwgY21wICs9IGhbMF0gKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgeDI7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWwgPSBkZXNjYWxlKCBjbXBbeF0gKyAxMjgqNCwgMiApOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTFbeCozXSA9IGRhdGExW3gqMyArIDFdID0gZGF0YTFbeCozICsgMl0gPSBzYXR1cmF0ZSggdmFsICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHgyOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsID0gZGVzY2FsZSggY21wW3hdICsgMTI4KjQsIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3hdID0gc2F0dXJhdGUoIHZhbCApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCB5MjsgeSsrLCBkYXRhMSArPSBzdGVwLCBjbXAgKz0gaFswXSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCAgc2hpZnQgPSBoWzFdKih5ID4+IHlfc2hpZnQpOworICAgICAgICAgICAgICAgICAgICBpbnQqIGNtcENiID0gYmxvY2tzW3Bvc1sxXV0gKyBzaGlmdDsgCisgICAgICAgICAgICAgICAgICAgIGludCogY21wQ3IgPSBibG9ja3NbcG9zWzJdXSArIHNoaWZ0OworICAgICAgICAgICAgICAgICAgICB4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHhfc2hpZnQgPT0gMCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggOyB4IDwgeDI7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFkgID0gKGNtcFt4XSArIDEyOCo0KSA8PCBmaXhjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDYiA9IGNtcENiW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDciA9IGNtcENyW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ID0gKFkgKyBDYipiX2NiKSA+PiAoZml4YyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3gqM10gPSBzYXR1cmF0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFkgKyBDYipnX2NiICsgQ3IqZ19jcikgPj4gKGZpeGMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMVt4KjMgKyAxXSA9IHNhdHVyYXRlKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoWSArIENyKnJfY3IpID4+IChmaXhjICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTFbeCozICsgMl0gPSBzYXR1cmF0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCB4X3NoaWZ0ID09IDEgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHhjID0gMDsgeCA8PSB4MiAtIDI7IHggKz0gMiwgeGMrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IFkgID0gKGNtcFt4XSArIDEyOCo0KSA8PCBmaXhjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBDYiA9IGNtcENiW3hjXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQ3IgPSBjbXBDclt4Y107CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHQgPSAoWSArIENiKmJfY2IpID4+IChmaXhjICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTFbeCozXSA9IHNhdHVyYXRlKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoWSArIENiKmdfY2IgKyBDcipnX2NyKSA+PiAoZml4YyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3gqMyArIDFdID0gc2F0dXJhdGUodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChZICsgQ3Iqcl9jcikgPj4gKGZpeGMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMVt4KjMgKyAyXSA9IHNhdHVyYXRlKHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFkgPSAoY21wW3grMV0gKyAxMjgqNCkgPDwgZml4YzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFkgKyBDYipiX2NiKSA+PiAoZml4YyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3gqMyArIDNdID0gc2F0dXJhdGUodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IChZICsgQ2IqZ19jYiArIENyKmdfY3IpID4+IChmaXhjICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTFbeCozICsgNF0gPSBzYXR1cmF0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gKFkgKyBDcipyX2NyKSA+PiAoZml4YyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3gqMyArIDVdID0gc2F0dXJhdGUodCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZm9yKCA7IHggPCB4MjsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IFkgID0gKGNtcFt4XSArIDEyOCo0KSA8PCBmaXhjOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IENiID0gY21wQ2JbeCA+PiB4X3NoaWZ0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBDciA9IGNtcENyW3ggPj4geF9zaGlmdF07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IChZICsgQ2IqYl9jYikgPj4gKGZpeGMgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGExW3gqM10gPSBzYXR1cmF0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoWSArIENiKmdfY2IgKyBDcipnX2NyKSA+PiAoZml4YyArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTFbeCozICsgMV0gPSBzYXR1cmF0ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSAoWSArIENyKnJfY3IpID4+IChmaXhjICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMVt4KjMgKyAyXSA9IHNhdHVyYXRlKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCB4MjsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCA9IGRlc2NhbGUoIGNtcFt4XSArIDEyOCo0LCAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhMVt4XSA9IHNhdHVyYXRlKHZhbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB4MSArPSBoWzBdOworICAgICAgICBpZiggeDEgPj0gbV93aWR0aCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHgxID0gMDsKKyAgICAgICAgICAgIHkxICs9IHZbMF07CisgICAgICAgICAgICBkYXRhICs9IHZbMF0qc3RlcDsKKyAgICAgICAgICAgIGlmKCB5MSA+PSBtX2hlaWdodCApIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgIEdyRm10SnBlZ1JlYWRlcjo6R2V0QmxvY2soIGludCogYmxvY2ssIGludCBjICkKK3sKKyAgICBtZW1zZXQoIGJsb2NrLCAwLCA2NCpzaXplb2YoYmxvY2tbMF0pICk7CisKKyAgICBhc3NlcnQoIDAgPD0gYyAmJiBjIDwgMyApOworICAgIGNvbnN0IHNob3J0KiB0ZCA9IG1fdGRbbV9jaVtjXS50ZF07CisgICAgY29uc3Qgc2hvcnQqIHRhID0gbV90YVttX2NpW2NdLnRhXTsKKyAgICBjb25zdCBpbnQqIHRxID0gbV90cVttX2NpW2NdLnRxXTsKKworICAgIC8vIEdldCBEQyBjb2VmZmljaWVudAorICAgIGludCBpID0gMCwgY2F0ICA9IG1fc3RybS5HZXRIdWZmKCB0ZCApOworICAgIGludCBtYXNrID0gYnNfYml0X21hc2tbY2F0XTsKKyAgICBpbnQgdmFsICA9IG1fc3RybS5HZXQoIGNhdCApOworCisgICAgdmFsIC09ICh2YWwqMiA8PSBtYXNrID8gbWFzayA6IDApOworICAgIG1fY2lbY10uZGNfcHJlZCA9IHZhbCArPSBtX2NpW2NdLmRjX3ByZWQ7CisgICAgCisgICAgYmxvY2tbMF0gPSBkZXNjYWxlKHZhbCAqIHRxWzBdLDE2KTsKKworICAgIC8vIEdldCBBQyBjb2VmZnMKKyAgICBmb3IoOzspCisgICAgeworICAgICAgICBjYXQgPSBtX3N0cm0uR2V0SHVmZiggdGEgKTsKKyAgICAgICAgaWYoIGNhdCA9PSAwICkgYnJlYWs7IC8vIGVuZCBvZiBibG9jaworCisgICAgICAgIGkgKz0gKGNhdCA+PiA0KSArIDE7CisgICAgICAgIGNhdCAmPSAxNTsKKyAgICAgICAgbWFzayA9IGJzX2JpdF9tYXNrW2NhdF07CisgICAgICAgIHZhbCAgPSBtX3N0cm0uR2V0KCBjYXQgKTsKKyAgICAgICAgY2F0ICA9IHppZ3phZ1tpXTsKKyAgICAgICAgdmFsIC09ICh2YWwqMiA8PSBtYXNrID8gbWFzayA6IDApOworICAgICAgICBibG9ja1tjYXRdID0gZGVzY2FsZSh2YWwgKiB0cVtjYXRdLCAxNik7CisgICAgICAgIGFzc2VydCggaSA8PSA2MyApOworICAgICAgICBpZiggaSA+PSA2MyApIGJyZWFrOworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBXSnBlZ1N0cmVhbSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitXSnBlZ0JpdFN0cmVhbTo6V0pwZWdCaXRTdHJlYW0oKQoreworfQorCisKK1dKcGVnQml0U3RyZWFtOjp+V0pwZWdCaXRTdHJlYW0oKQoreworICAgIENsb3NlKCk7CisgICAgbV9pc19vcGVuZWQgPSBmYWxzZTsKK30KKworCisKK2Jvb2wgIFdKcGVnQml0U3RyZWFtOjpPcGVuKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgQ2xvc2UoKTsKKyAgICBBbGxvY2F0ZSgpOworICAgIAorICAgIG1faXNfb3BlbmVkID0gbV9sb3dfc3RybS5PcGVuKCBmaWxlbmFtZSApOworICAgIGlmKCBtX2lzX29wZW5lZCApCisgICAgeworICAgICAgICBtX2Jsb2NrX3BvcyA9IDA7CisgICAgICAgIFJlc2V0QnVmZmVyKCk7CisgICAgfQorICAgIHJldHVybiBtX2lzX29wZW5lZDsKK30KKworCit2b2lkICBXSnBlZ0JpdFN0cmVhbTo6Q2xvc2UoKQoreworICAgIGlmKCBtX2lzX29wZW5lZCApCisgICAgeworICAgICAgICBGbHVzaCgpOworICAgICAgICBtX2xvd19zdHJtLkNsb3NlKCk7CisgICAgICAgIG1faXNfb3BlbmVkID0gZmFsc2U7CisgICAgfQorfQorCisKK3ZvaWQgIFdKcGVnQml0U3RyZWFtOjpGbHVzaCgpCit7CisgICAgUHV0KCAtMSwgbV9iaXRfaWR4ICYgMzEgKTsKKyAgICAqKCh1bG9uZyomKW1fY3VycmVudCkrKyA9IG1fdmFsOworICAgIFdyaXRlQmxvY2soKTsKKyAgICBSZXNldEJ1ZmZlcigpOworfQorCisKK3ZvaWQgIFdKcGVnQml0U3RyZWFtOjpXcml0ZUJsb2NrKCkKK3sKKyAgICB1Y2hhciogcHRyID0gbV9zdGFydDsKKyAgICBpZiggIWJzSXNCaWdFbmRpYW4oKSApCisgICAgICAgIGJzQlN3YXBCbG9jayggbV9zdGFydCwgbV9jdXJyZW50ICk7CisKKyAgICB3aGlsZSggcHRyIDwgbV9jdXJyZW50ICkKKyAgICB7CisgICAgICAgIGludCB2YWwgPSAqcHRyKys7CisgICAgICAgIG1fbG93X3N0cm0uUHV0Qnl0ZSggdmFsICk7CisgICAgICAgIGlmKCB2YWwgPT0gMHhmZiApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fbG93X3N0cm0uUHV0Qnl0ZSggMCApOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIG1fY3VycmVudCA9IG1fc3RhcnQ7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3JGbXRKcGVnV3JpdGVyIC8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3JGbXRKcGVnV3JpdGVyOjpHckZtdEpwZWdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFdyaXRlciggZmlsZW5hbWUgKQoreworfQorCitHckZtdEpwZWdXcml0ZXI6On5HckZtdEpwZWdXcml0ZXIoKQoreworfQorCisvLyAgU3RhbmRhcmQgSlBFRyBxdWFudGl6YXRpb24gdGFibGVzCitzdGF0aWMgY29uc3QgdWNoYXIganBlZ1RhYmxlSzFfVFtdID0KK3sKKyAgICAxNiwgMTIsIDE0LCAxNCwgIDE4LCAgMjQsICA0OSwgIDcyLAorICAgIDExLCAxMiwgMTMsIDE3LCAgMjIsICAzNSwgIDY0LCAgOTIsCisgICAgMTAsIDE0LCAxNiwgMjIsICAzNywgIDU1LCAgNzgsICA5NSwKKyAgICAxNiwgMTksIDI0LCAyOSwgIDU2LCAgNjQsICA4NywgIDk4LAorICAgIDI0LCAyNiwgNDAsIDUxLCAgNjgsICA4MSwgMTAzLCAxMTIsCisgICAgNDAsIDU4LCA1NywgODcsIDEwOSwgMTA0LCAxMjEsIDEwMCwKKyAgICA1MSwgNjAsIDY5LCA4MCwgMTAzLCAxMTMsIDEyMCwgMTAzLAorICAgIDYxLCA1NSwgNTYsIDYyLCAgNzcsICA5MiwgMTAxLCAgOTkKK307CisKKworc3RhdGljIGNvbnN0IHVjaGFyIGpwZWdUYWJsZUsyX1RbXSA9Cit7CisgICAgMTcsIDE4LCAyNCwgNDcsIDk5LCA5OSwgOTksIDk5LAorICAgIDE4LCAyMSwgMjYsIDY2LCA5OSwgOTksIDk5LCA5OSwKKyAgICAyNCwgMjYsIDU2LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgNDcsIDY2LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwKKyAgICA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksCisgICAgOTksIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LAorICAgIDk5LCA5OSwgOTksIDk5LCA5OSwgOTksIDk5LCA5OQorfTsKKworCisvLyBTdGFuZGFyZCBIdWZmbWFuIHRhYmxlcworCisvLyAuLi4gZm9yIGx1bWEgRENzLgorc3RhdGljIGNvbnN0IHVjaGFyIGpwZWdUYWJsZUszW10gPQoreworICAgIDAsIDEsIDUsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExCit9OworCisKKy8vIC4uLiBmb3IgY2hyb21hIERDcy4KK3N0YXRpYyBjb25zdCB1Y2hhciBqcGVnVGFibGVLNFtdID0KK3sKKyAgICAwLCAzLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMQorfTsKKworCisvLyAuLi4gZm9yIGx1bWEgQUNzLgorc3RhdGljIGNvbnN0IHVjaGFyIGpwZWdUYWJsZUs1W10gPQoreworICAgIDAsIDIsIDEsIDMsIDMsIDIsIDQsIDMsIDUsIDUsIDQsIDQsIDAsIDAsIDEsIDEyNSwKKyAgICAweDAxLCAweDAyLCAweDAzLCAweDAwLCAweDA0LCAweDExLCAweDA1LCAweDEyLAorICAgIDB4MjEsIDB4MzEsIDB4NDEsIDB4MDYsIDB4MTMsIDB4NTEsIDB4NjEsIDB4MDcsCisgICAgMHgyMiwgMHg3MSwgMHgxNCwgMHgzMiwgMHg4MSwgMHg5MSwgMHhhMSwgMHgwOCwKKyAgICAweDIzLCAweDQyLCAweGIxLCAweGMxLCAweDE1LCAweDUyLCAweGQxLCAweGYwLAorICAgIDB4MjQsIDB4MzMsIDB4NjIsIDB4NzIsIDB4ODIsIDB4MDksIDB4MGEsIDB4MTYsCisgICAgMHgxNywgMHgxOCwgMHgxOSwgMHgxYSwgMHgyNSwgMHgyNiwgMHgyNywgMHgyOCwKKyAgICAweDI5LCAweDJhLCAweDM0LCAweDM1LCAweDM2LCAweDM3LCAweDM4LCAweDM5LAorICAgIDB4M2EsIDB4NDMsIDB4NDQsIDB4NDUsIDB4NDYsIDB4NDcsIDB4NDgsIDB4NDksCisgICAgMHg0YSwgMHg1MywgMHg1NCwgMHg1NSwgMHg1NiwgMHg1NywgMHg1OCwgMHg1OSwKKyAgICAweDVhLCAweDYzLCAweDY0LCAweDY1LCAweDY2LCAweDY3LCAweDY4LCAweDY5LAorICAgIDB4NmEsIDB4NzMsIDB4NzQsIDB4NzUsIDB4NzYsIDB4NzcsIDB4NzgsIDB4NzksCisgICAgMHg3YSwgMHg4MywgMHg4NCwgMHg4NSwgMHg4NiwgMHg4NywgMHg4OCwgMHg4OSwKKyAgICAweDhhLCAweDkyLCAweDkzLCAweDk0LCAweDk1LCAweDk2LCAweDk3LCAweDk4LAorICAgIDB4OTksIDB4OWEsIDB4YTIsIDB4YTMsIDB4YTQsIDB4YTUsIDB4YTYsIDB4YTcsCisgICAgMHhhOCwgMHhhOSwgMHhhYSwgMHhiMiwgMHhiMywgMHhiNCwgMHhiNSwgMHhiNiwKKyAgICAweGI3LCAweGI4LCAweGI5LCAweGJhLCAweGMyLCAweGMzLCAweGM0LCAweGM1LAorICAgIDB4YzYsIDB4YzcsIDB4YzgsIDB4YzksIDB4Y2EsIDB4ZDIsIDB4ZDMsIDB4ZDQsCisgICAgMHhkNSwgMHhkNiwgMHhkNywgMHhkOCwgMHhkOSwgMHhkYSwgMHhlMSwgMHhlMiwKKyAgICAweGUzLCAweGU0LCAweGU1LCAweGU2LCAweGU3LCAweGU4LCAweGU5LCAweGVhLAorICAgIDB4ZjEsIDB4ZjIsIDB4ZjMsIDB4ZjQsIDB4ZjUsIDB4ZjYsIDB4ZjcsIDB4ZjgsCisgICAgMHhmOSwgMHhmYQorfTsKKworLy8gLi4uIGZvciBjaHJvbWEgQUNzICAKK3N0YXRpYyBjb25zdCB1Y2hhciBqcGVnVGFibGVLNltdID0KK3sKKyAgICAwLCAyLCAxLCAyLCA0LCA0LCAzLCA0LCA3LCA1LCA0LCA0LCAwLCAxLCAyLCAxMTksCisgICAgMHgwMCwgMHgwMSwgMHgwMiwgMHgwMywgMHgxMSwgMHgwNCwgMHgwNSwgMHgyMSwKKyAgICAweDMxLCAweDA2LCAweDEyLCAweDQxLCAweDUxLCAweDA3LCAweDYxLCAweDcxLAorICAgIDB4MTMsIDB4MjIsIDB4MzIsIDB4ODEsIDB4MDgsIDB4MTQsIDB4NDIsIDB4OTEsCisgICAgMHhhMSwgMHhiMSwgMHhjMSwgMHgwOSwgMHgyMywgMHgzMywgMHg1MiwgMHhmMCwKKyAgICAweDE1LCAweDYyLCAweDcyLCAweGQxLCAweDBhLCAweDE2LCAweDI0LCAweDM0LAorICAgIDB4ZTEsIDB4MjUsIDB4ZjEsIDB4MTcsIDB4MTgsIDB4MTksIDB4MWEsIDB4MjYsCisgICAgMHgyNywgMHgyOCwgMHgyOSwgMHgyYSwgMHgzNSwgMHgzNiwgMHgzNywgMHgzOCwKKyAgICAweDM5LCAweDNhLCAweDQzLCAweDQ0LCAweDQ1LCAweDQ2LCAweDQ3LCAweDQ4LAorICAgIDB4NDksIDB4NGEsIDB4NTMsIDB4NTQsIDB4NTUsIDB4NTYsIDB4NTcsIDB4NTgsCisgICAgMHg1OSwgMHg1YSwgMHg2MywgMHg2NCwgMHg2NSwgMHg2NiwgMHg2NywgMHg2OCwKKyAgICAweDY5LCAweDZhLCAweDczLCAweDc0LCAweDc1LCAweDc2LCAweDc3LCAweDc4LAorICAgIDB4NzksIDB4N2EsIDB4ODIsIDB4ODMsIDB4ODQsIDB4ODUsIDB4ODYsIDB4ODcsCisgICAgMHg4OCwgMHg4OSwgMHg4YSwgMHg5MiwgMHg5MywgMHg5NCwgMHg5NSwgMHg5NiwKKyAgICAweDk3LCAweDk4LCAweDk5LCAweDlhLCAweGEyLCAweGEzLCAweGE0LCAweGE1LAorICAgIDB4YTYsIDB4YTcsIDB4YTgsIDB4YTksIDB4YWEsIDB4YjIsIDB4YjMsIDB4YjQsCisgICAgMHhiNSwgMHhiNiwgMHhiNywgMHhiOCwgMHhiOSwgMHhiYSwgMHhjMiwgMHhjMywKKyAgICAweGM0LCAweGM1LCAweGM2LCAweGM3LCAweGM4LCAweGM5LCAweGNhLCAweGQyLAorICAgIDB4ZDMsIDB4ZDQsIDB4ZDUsIDB4ZDYsIDB4ZDcsIDB4ZDgsIDB4ZDksIDB4ZGEsCisgICAgMHhlMiwgMHhlMywgMHhlNCwgMHhlNSwgMHhlNiwgMHhlNywgMHhlOCwgMHhlOSwKKyAgICAweGVhLCAweGYyLCAweGYzLCAweGY0LCAweGY1LCAweGY2LCAweGY3LCAweGY4LAorICAgIDB4ZjksIDB4ZmEKK307CisKKworc3RhdGljIGNvbnN0IGNoYXIganBlZ0hlYWRlcltdID0gCisgICAgIlx4RkZceEQ4IiAgLy8gU09JICAtIHN0YXJ0IG9mIGltYWdlCisgICAgIlx4RkZceEUwIiAgLy8gQVBQMCAtIGpmaWYgZXh0ZW50aW9uCisgICAgIlx4MDBceDEwIiAgLy8gMiBieXRlczogbGVuZ3RoIG9mIEFQUDAgc2VnbWVudAorICAgICJKRklGXHgwMCIgIC8vIEpGSUYgc2lnbmF0dXJlCisgICAgIlx4MDFceDAyIiAgLy8gdmVyc2lvbiBvZiBKRklGCisgICAgIlx4MDAiICAgICAgLy8gdW5pdHMgPSBwaXhlbHMgKCAxIC0gaW5jaCwgMiAtIGNtICkKKyAgICAiXHgwMFx4MDFceDAwXHgwMSIgLy8gMiAyLWJ5dGVzIHZhbHVlczogeCBkZW5zaXR5ICYgeSBkZW5zaXR5CisgICAgIlx4MDBceDAwIjsgLy8gd2lkdGggJiBoZWlnaHQgb2YgdGh1bWJuYWlsOiAoIDB4MCBtZWFucyBubyB0aHVtYm5haWwpCisKKyNkZWZpbmUgcG9zdHNoaWZ0IDE0CisKKy8vIEZEQ1Qgd2l0aCBwb3N0c2NhbGluZworc3RhdGljIHZvaWQgYWFuX2ZkY3Q4eDgoIGludCAqc3JjLCBpbnQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgY29uc3QgaW50ICpwb3N0c2NhbGUgKQoreworICAgIGludCAgd29ya3NwYWNlWzY0XSwgKndvcmsgPSB3b3Jrc3BhY2U7CisgICAgaW50ICBpOworCisgICAgLy8gUGFzcyAxOiBwcm9jZXNzIHJvd3MKKyAgICBmb3IoIGkgPSA4OyBpID4gMDsgaS0tLCBzcmMgKz0gc3RlcCwgd29yayArPSA4ICkKKyAgICB7CisgICAgICAgIGludCB4MCA9IHNyY1swXSwgeDEgPSBzcmNbN107CisgICAgICAgIGludCB4MiA9IHNyY1szXSwgeDMgPSBzcmNbNF07CisKKyAgICAgICAgaW50IHg0ID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDIgKyB4MzsgeDIgLT0geDM7CisgICAgCisgICAgICAgIHdvcmtbN10gPSB4MDsgd29ya1sxXSA9IHgyOworICAgICAgICB4MiA9IHg0ICsgeDE7IHg0IC09IHgxOworCisgICAgICAgIHgwID0gc3JjWzFdOyB4MyA9IHNyY1s2XTsKKyAgICAgICAgeDEgPSB4MCArIHgzOyB4MCAtPSB4MzsKKyAgICAgICAgd29ya1s1XSA9IHgwOworCisgICAgICAgIHgwID0gc3JjWzJdOyB4MyA9IHNyY1s1XTsKKyAgICAgICAgd29ya1szXSA9IHgwIC0geDM7IHgwICs9IHgzOworCisgICAgICAgIHgzID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDIgKyB4MzsgeDIgLT0geDM7CisKKyAgICAgICAgd29ya1swXSA9IHgxOyB3b3JrWzRdID0geDI7CisKKyAgICAgICAgeDAgPSBkZXNjYWxlKCh4MCAtIHg0KSpDMF83MDcsIGZpeGIpOworICAgICAgICB4MSA9IHg0ICsgeDA7IHg0IC09IHgwOworICAgICAgICB3b3JrWzJdID0geDQ7IHdvcmtbNl0gPSB4MTsKKworICAgICAgICB4MCA9IHdvcmtbMV07IHgxID0gd29ya1szXTsKKyAgICAgICAgeDIgPSB3b3JrWzVdOyB4MyA9IHdvcmtbN107CisKKyAgICAgICAgeDAgKz0geDE7IHgxICs9IHgyOyB4MiArPSB4MzsKKyAgICAgICAgeDEgPSBkZXNjYWxlKHgxKkMwXzcwNywgZml4Yik7CisKKyAgICAgICAgeDQgPSB4MSArIHgzOyB4MyAtPSB4MTsKKyAgICAgICAgeDEgPSAoeDAgLSB4MikqQzBfMzgyOworICAgICAgICB4MCA9IGRlc2NhbGUoeDAqQzBfNTQxICsgeDEsIGZpeGIpOworICAgICAgICB4MiA9IGRlc2NhbGUoeDIqQzFfMzA2ICsgeDEsIGZpeGIpOworCisgICAgICAgIHgxID0geDAgKyB4MzsgeDMgLT0geDA7CisgICAgICAgIHgwID0geDQgKyB4MjsgeDQgLT0geDI7CisKKyAgICAgICAgd29ya1s1XSA9IHgxOyB3b3JrWzFdID0geDA7CisgICAgICAgIHdvcmtbN10gPSB4NDsgd29ya1szXSA9IHgzOworICAgIH0KKworICAgIHdvcmsgPSB3b3Jrc3BhY2U7CisgICAgLy8gcGFzcyAyOiBwcm9jZXNzIGNvbHVtbnMKKyAgICBmb3IoIGkgPSA4OyBpID4gMDsgaS0tLCB3b3JrKyssIHBvc3RzY2FsZSArPSA4LCBkc3QgKz0gOCApCisgICAgeworICAgICAgICBpbnQgIHgwID0gd29ya1s4KjBdLCB4MSA9IHdvcmtbOCo3XTsKKyAgICAgICAgaW50ICB4MiA9IHdvcmtbOCozXSwgeDMgPSB3b3JrWzgqNF07CisKKyAgICAgICAgaW50ICB4NCA9IHgwICsgeDE7IHgwIC09IHgxOworICAgICAgICB4MSA9IHgyICsgeDM7IHgyIC09IHgzOworICAgIAorICAgICAgICB3b3JrWzgqN10gPSB4MDsgd29ya1s4KjBdID0geDI7CisgICAgICAgIHgyID0geDQgKyB4MTsgeDQgLT0geDE7CisKKyAgICAgICAgeDAgPSB3b3JrWzgqMV07IHgzID0gd29ya1s4KjZdOworICAgICAgICB4MSA9IHgwICsgeDM7IHgwIC09IHgzOworICAgICAgICB3b3JrWzgqNF0gPSB4MDsKKworICAgICAgICB4MCA9IHdvcmtbOCoyXTsgeDMgPSB3b3JrWzgqNV07CisgICAgICAgIHdvcmtbOCozXSA9IHgwIC0geDM7IHgwICs9IHgzOworCisgICAgICAgIHgzID0geDAgKyB4MTsgeDAgLT0geDE7CisgICAgICAgIHgxID0geDIgKyB4MzsgeDIgLT0geDM7CisKKyAgICAgICAgZHN0WzBdID0gZGVzY2FsZSh4MSpwb3N0c2NhbGVbMF0sIHBvc3RzaGlmdCk7CisgICAgICAgIGRzdFs0XSA9IGRlc2NhbGUoeDIqcG9zdHNjYWxlWzRdLCBwb3N0c2hpZnQpOworCisgICAgICAgIHgwID0gZGVzY2FsZSgoeDAgLSB4NCkqQzBfNzA3LCBmaXhiKTsKKyAgICAgICAgeDEgPSB4NCArIHgwOyB4NCAtPSB4MDsKKworICAgICAgICBkc3RbMl0gPSBkZXNjYWxlKHg0KnBvc3RzY2FsZVsyXSwgcG9zdHNoaWZ0KTsKKyAgICAgICAgZHN0WzZdID0gZGVzY2FsZSh4MSpwb3N0c2NhbGVbNl0sIHBvc3RzaGlmdCk7CisKKyAgICAgICAgeDAgPSB3b3JrWzgqMF07IHgxID0gd29ya1s4KjNdOworICAgICAgICB4MiA9IHdvcmtbOCo0XTsgeDMgPSB3b3JrWzgqN107CisKKyAgICAgICAgeDAgKz0geDE7IHgxICs9IHgyOyB4MiArPSB4MzsKKyAgICAgICAgeDEgPSBkZXNjYWxlKHgxKkMwXzcwNywgZml4Yik7CisKKyAgICAgICAgeDQgPSB4MSArIHgzOyB4MyAtPSB4MTsKKyAgICAgICAgeDEgPSAoeDAgLSB4MikqQzBfMzgyOworICAgICAgICB4MCA9IGRlc2NhbGUoeDAqQzBfNTQxICsgeDEsIGZpeGIpOworICAgICAgICB4MiA9IGRlc2NhbGUoeDIqQzFfMzA2ICsgeDEsIGZpeGIpOworCisgICAgICAgIHgxID0geDAgKyB4MzsgeDMgLT0geDA7CisgICAgICAgIHgwID0geDQgKyB4MjsgeDQgLT0geDI7CisKKyAgICAgICAgZHN0WzVdID0gZGVzY2FsZSh4MSpwb3N0c2NhbGVbNV0sIHBvc3RzaGlmdCk7CisgICAgICAgIGRzdFsxXSA9IGRlc2NhbGUoeDAqcG9zdHNjYWxlWzFdLCBwb3N0c2hpZnQpOworICAgICAgICBkc3RbN10gPSBkZXNjYWxlKHg0KnBvc3RzY2FsZVs3XSwgcG9zdHNoaWZ0KTsKKyAgICAgICAgZHN0WzNdID0gZGVzY2FsZSh4Mypwb3N0c2NhbGVbM10sIHBvc3RzaGlmdCk7CisgICAgfQorfQorCisKK2Jvb2wgIEdyRm10SnBlZ1dyaXRlcjo6V3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCAvKmRlcHRoKi8sIGludCBfY2hhbm5lbHMgKQoreworICAgIGFzc2VydCggZGF0YSAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCApOworICAgIAorICAgIGlmKCAhbV9zdHJtLk9wZW4oIG1fZmlsZW5hbWUgKSApIHJldHVybiBmYWxzZTsKKworICAgIC8vIGVuY29kZSB0aGUgaGVhZGVyIGFuZCB0YWJsZXMKKyAgICAvLyBmb3IgZWFjaCBtY3U6CisgICAgLy8gICBjb252ZXJ0IHJnYiB0byB5dXYgd2l0aCBkb3duc2FtcGxpbmcgKGlmIGNvbG9yKS4KKyAgICAvLyAgIGZvciBldmVyeSBibG9jazoKKyAgICAvLyAgICAgY2FsYyBkY3QgYW5kIHF1YW50aXplCisgICAgLy8gICAgIGVuY29kZSBibG9jay4KKyAgICBpbnQgeCwgeTsKKyAgICBpbnQgaSwgajsKKyAgICBjb25zdCBpbnQgbWF4X3F1YWxpdHkgPSAxMjsKKyAgICBpbnQgICBxdWFsaXR5ID0gbWF4X3F1YWxpdHk7CisgICAgV01CeXRlU3RyZWFtJiBsb3dzdHJtID0gbV9zdHJtLm1fbG93X3N0cm07CisgICAgaW50ICAgZmRjdF9xdGFiWzJdWzY0XTsKKyAgICB1bG9uZyBodWZmX2RjX3RhYlsyXVsxNl07CisgICAgdWxvbmcgaHVmZl9hY190YWJbMl1bMjU2XTsKKyAgICBpbnQgIGNoYW5uZWxzID0gX2NoYW5uZWxzID4gMSA/IDMgOiAxOworICAgIGludCAgeF9zY2FsZSA9IGNoYW5uZWxzID4gMSA/IDIgOiAxLCB5X3NjYWxlID0geF9zY2FsZTsKKyAgICBpbnQgIGRjX3ByZWRbXSA9IHsgMCwgMCwgMCB9OworICAgIGludCAgeF9zdGVwID0geF9zY2FsZSAqIDg7CisgICAgaW50ICB5X3N0ZXAgPSB5X3NjYWxlICogODsKKyAgICBpbnQgIGJsb2NrWzZdWzY0XTsKKyAgICBpbnQgIGJ1ZmZlclsxMDI0XTsKKyAgICBpbnQgIGx1bWFfY291bnQgPSB4X3NjYWxlKnlfc2NhbGU7CisgICAgaW50ICBibG9ja19jb3VudCA9IGx1bWFfY291bnQgKyBjaGFubmVscyAtIDE7CisgICAgaW50ICBZX3N0ZXAgPSB4X3NjYWxlKjg7CisgICAgY29uc3QgaW50IFVWX3N0ZXAgPSAxNjsKKyAgICBkb3VibGUgaW52X3F1YWxpdHk7CisKKyAgICBpZiggcXVhbGl0eSA8IDMgKSBxdWFsaXR5ID0gMzsKKyAgICBpZiggcXVhbGl0eSA+IG1heF9xdWFsaXR5ICkgcXVhbGl0eSA9IG1heF9xdWFsaXR5OworCisgICAgaW52X3F1YWxpdHkgPSAxLi9xdWFsaXR5OworCisgICAgLy8gRW5jb2RlIGhlYWRlcgorICAgIGxvd3N0cm0uUHV0Qnl0ZXMoIGpwZWdIZWFkZXIsIHNpemVvZihqcGVnSGVhZGVyKSAtIDEgKTsKKyAgICAKKyAgICAvLyBFbmNvZGUgcXVhbnRpemF0aW9uIHRhYmxlcworICAgIGZvciggaSA9IDA7IGkgPCAoY2hhbm5lbHMgPiAxID8gMiA6IDEpOyBpKysgKQorICAgIHsKKyAgICAgICAgY29uc3QgdWNoYXIqIHF0YWJsZSA9IGkgPT0gMCA/IGpwZWdUYWJsZUsxX1QgOiBqcGVnVGFibGVLMl9UOworICAgICAgICBpbnQgY2hyb21hX3NjYWxlID0gaSA+IDAgPyBsdW1hX2NvdW50IDogMTsKKyAgICAgICAgCisgICAgICAgIGxvd3N0cm0uUHV0V29yZCggMHhmZmRiICk7ICAgLy8gRFFUIG1hcmtlcgorICAgICAgICBsb3dzdHJtLlB1dFdvcmQoIDIgKyA2NSoxICk7IC8vIHB1dCBzaW5nbGUgcXRhYmxlCisgICAgICAgIGxvd3N0cm0uUHV0Qnl0ZSggMCoxNiArIGkgKTsgLy8gOC1iaXQgdGFibGUKKworICAgICAgICAvLyBwdXQgY29lZmZpY2llbnRzCisgICAgICAgIGZvciggaiA9IDA7IGogPCA2NDsgaisrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGlkeCA9IHppZ3phZ1tqXTsKKyAgICAgICAgICAgIGludCBxdmFsID0gY3ZSb3VuZChxdGFibGVbaWR4XSppbnZfcXVhbGl0eSk7CisgICAgICAgICAgICBpZiggcXZhbCA8IDEgKQorICAgICAgICAgICAgICAgIHF2YWwgPSAxOworICAgICAgICAgICAgaWYoIHF2YWwgPiAyNTUgKQorICAgICAgICAgICAgICAgIHF2YWwgPSAyNTU7CisgICAgICAgICAgICBmZGN0X3F0YWJbaV1baWR4XSA9IGN2Um91bmQoKDEgPDwgKHBvc3RzaGlmdCArIDkpKS8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHF2YWwqY2hyb21hX3NjYWxlKmlkY3RfcHJlc2NhbGVbaWR4XSkpOworICAgICAgICAgICAgbG93c3RybS5QdXRCeXRlKCBxdmFsICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmNvZGUgaHVmZm1hbiB0YWJsZXMKKyAgICBmb3IoIGkgPSAwOyBpIDwgKGNoYW5uZWxzID4gMSA/IDQgOiAyKTsgaSsrICkKKyAgICB7CisgICAgICAgIGNvbnN0IHVjaGFyKiBodGFibGUgPSBpID09IDAgPyBqcGVnVGFibGVLMyA6IGkgPT0gMSA/IGpwZWdUYWJsZUs1IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPT0gMiA/IGpwZWdUYWJsZUs0IDoganBlZ1RhYmxlSzY7CisgICAgICAgIGludCBpc19hY190YWIgPSBpICYgMTsKKyAgICAgICAgaW50IGlkeCA9IGkgPj0gMjsKKyAgICAgICAgaW50IHRhYmxlU2l6ZSA9IDE2ICsgKGlzX2FjX3RhYiA/IDE2MiA6IDEyKTsKKworICAgICAgICBsb3dzdHJtLlB1dFdvcmQoIDB4RkZDNCAgICk7ICAgICAgLy8gREhUIG1hcmtlcgorICAgICAgICBsb3dzdHJtLlB1dFdvcmQoIDMgKyB0YWJsZVNpemUgKTsgLy8gZGVmaW5lIG9uZSBodWZmbWFuIHRhYmxlCisgICAgICAgIGxvd3N0cm0uUHV0Qnl0ZSggaXNfYWNfdGFiKjE2ICsgaWR4ICk7IC8vIHB1dCBEQy9BQyBmbGFnIGFuZCB0YWJsZSBpbmRleAorICAgICAgICBsb3dzdHJtLlB1dEJ5dGVzKCBodGFibGUsIHRhYmxlU2l6ZSApOyAvLyBwdXQgdGFibGUKKworICAgICAgICBic0NyZWF0ZUVuY29kZUh1ZmZtYW5UYWJsZSggYnNDcmVhdGVTb3VyY2VIdWZmbWFuVGFibGUoCisgICAgICAgICAgICBodGFibGUsIGJ1ZmZlciwgMTYsIDkgKSwgaXNfYWNfdGFiID8gaHVmZl9hY190YWJbaWR4XSA6CisgICAgICAgICAgICBodWZmX2RjX3RhYltpZHhdLCBpc19hY190YWIgPyAyNTYgOiAxNiApOworICAgIH0KKworICAgIC8vIHB1dCBmcmFtZSBoZWFkZXIKKyAgICBsb3dzdHJtLlB1dFdvcmQoIDB4RkZDMCApOyAgICAgICAgICAvLyBTT0YwIG1hcmtlcgorICAgIGxvd3N0cm0uUHV0V29yZCggOCArIDMqY2hhbm5lbHMgKTsgIC8vIGxlbmd0aCBvZiBmcmFtZSBoZWFkZXIKKyAgICBsb3dzdHJtLlB1dEJ5dGUoIDggKTsgICAgICAgICAgICAgICAvLyBzYW1wbGUgcHJlY2lzaW9uCisgICAgbG93c3RybS5QdXRXb3JkKCBoZWlnaHQgKTsKKyAgICBsb3dzdHJtLlB1dFdvcmQoIHdpZHRoICk7CisgICAgbG93c3RybS5QdXRCeXRlKCBjaGFubmVscyApOyAgICAgICAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudHMKKworICAgIGZvciggaSA9IDA7IGkgPCBjaGFubmVsczsgaSsrICkKKyAgICB7CisgICAgICAgIGxvd3N0cm0uUHV0Qnl0ZSggaSArIDEgKTsgIC8vIChpKzEpLXRoIGNvbXBvbmVudCBpZCAoWSxVIG9yIFYpCisgICAgICAgIGlmKCBpID09IDAgKQorICAgICAgICAgICAgbG93c3RybS5QdXRCeXRlKHhfc2NhbGUqMTYgKyB5X3NjYWxlKTsgLy8gY2hyb21hIHNjYWxlIGZhY3RvcnMKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbG93c3RybS5QdXRCeXRlKDEqMTYgKyAxKTsKKyAgICAgICAgbG93c3RybS5QdXRCeXRlKCBpID4gMCApOyAvLyBxdWFudGl6YXRpb24gdGFibGUgaWR4CisgICAgfQorCisgICAgLy8gcHV0IHNjYW4gaGVhZGVyCisgICAgbG93c3RybS5QdXRXb3JkKCAweEZGREEgKTsgICAgICAgICAgLy8gU09TIG1hcmtlcgorICAgIGxvd3N0cm0uUHV0V29yZCggNiArIDIqY2hhbm5lbHMgKTsgIC8vIGxlbmd0aCBvZiBzY2FuIGhlYWRlcgorICAgIGxvd3N0cm0uUHV0Qnl0ZSggY2hhbm5lbHMgKTsgICAgICAgIC8vIG51bWJlciBvZiBjb21wb25lbnRzIGluIHRoZSBzY2FuCisKKyAgICBmb3IoIGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKyApCisgICAgeworICAgICAgICBsb3dzdHJtLlB1dEJ5dGUoIGkrMSApOyAgICAgICAgICAgICAvLyBjb21wb25lbnQgaWQKKyAgICAgICAgbG93c3RybS5QdXRCeXRlKCAoaT4wKSoxNiArIChpPjApICk7Ly8gc2VsZWN0aW9uIG9mIERDICYgQUMgdGFibGVzCisgICAgfQorCisgICAgbG93c3RybS5QdXRXb3JkKDAqMjU2ICsgNjMpOy8vIHN0YXJ0IGFuZCBlbmQgb2Ygc3BlY3RyYWwgc2VsZWN0aW9uIC0gZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbnRhbCBEQ1Qgc3RhcnQgaXMgMCBhbmQgZW5kIGlzIDYzCisKKyAgICBsb3dzdHJtLlB1dEJ5dGUoIDAgKTsgIC8vIHN1Y2Nlc3NpdmUgYXBwcm94aW1hdGlvbiBiaXQgcG9zaXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWdoICYgbG93IC0gKDAsMCkgZm9yIHNlcXVlbnRhbCBEQ1QgIAorCisgICAgLy8gZW5jb2RlIGRhdGEKKyAgICBmb3IoIHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IHlfc3RlcCwgZGF0YSArPSB5X3N0ZXAqc3RlcCApCisgICAgeworICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2lkdGg7IHggKz0geF9zdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHhfbGltaXQgPSB4X3N0ZXA7CisgICAgICAgICAgICBpbnQgeV9saW1pdCA9IHlfc3RlcDsKKyAgICAgICAgICAgIGNvbnN0IHVjaGFyKiByZ2JfZGF0YSA9IGRhdGEgKyB4Kl9jaGFubmVsczsKKyAgICAgICAgICAgIGludCogWV9kYXRhID0gYmxvY2tbMF07CisKKyAgICAgICAgICAgIGlmKCB4ICsgeF9saW1pdCA+IHdpZHRoICkgeF9saW1pdCA9IHdpZHRoIC0geDsKKyAgICAgICAgICAgIGlmKCB5ICsgeV9saW1pdCA+IGhlaWdodCApIHlfbGltaXQgPSBoZWlnaHQgLSB5OworCisgICAgICAgICAgICBtZW1zZXQoIGJsb2NrLCAwLCBibG9ja19jb3VudCo2NCpzaXplb2YoYmxvY2tbMF1bMF0pKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIGNoYW5uZWxzID4gMSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50KiBVVl9kYXRhID0gYmxvY2tbbHVtYV9jb3VudF07CisKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgeV9saW1pdDsgaSsrLCByZ2JfZGF0YSArPSBzdGVwLCBZX2RhdGEgKz0gWV9zdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaiA9IDA7IGogPCB4X2xpbWl0OyBqKyssIHJnYl9kYXRhICs9IF9jaGFubmVscyApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByID0gcmdiX2RhdGFbMl07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZyA9IHJnYl9kYXRhWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGIgPSByZ2JfZGF0YVswXTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaW50IFkgPSBkZXNjYWxlKCByKnlfciArIGcqeV9nICsgYip5X2IsIGZpeGMgLSAyKSAtIDEyOCo0OworICAgICAgICAgICAgICAgICAgICAgICAgaW50IFUgPSBkZXNjYWxlKCByKmNiX3IgKyBnKmNiX2cgKyBiKmNiX2IsIGZpeGMgLSAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgViA9IGRlc2NhbGUoIHIqY3JfciArIGcqY3JfZyArIGIqY3JfYiwgZml4YyAtIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBqMiA9IGogPj4gKHhfc2NhbGUgLSAxKTsgCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFlfZGF0YVtqXSA9IFk7CisgICAgICAgICAgICAgICAgICAgICAgICBVVl9kYXRhW2oyXSArPSBVOworICAgICAgICAgICAgICAgICAgICAgICAgVVZfZGF0YVtqMiArIDhdICs9IFY7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZ2JfZGF0YSAtPSB4X2xpbWl0Kl9jaGFubmVsczsKKyAgICAgICAgICAgICAgICAgICAgaWYoICgoaSsxKSAmICh5X3NjYWxlIC0gMSkpID09IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVVl9kYXRhICs9IFVWX3N0ZXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHlfbGltaXQ7IGkrKywgcmdiX2RhdGEgKz0gc3RlcCwgWV9kYXRhICs9IFlfc3RlcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGogPSAwOyBqIDwgeF9saW1pdDsgaisrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIFlfZGF0YVtqXSA9IHJnYl9kYXRhW2pdKjQgLSAxMjgqNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBibG9ja19jb3VudDsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgaXNfY2hyb21hID0gaSA+PSBsdW1hX2NvdW50OworICAgICAgICAgICAgICAgIGludCBzcmNfc3RlcCA9IHhfc2NhbGUgKiA4OworICAgICAgICAgICAgICAgIGludCBydW4gPSAwLCB2YWw7CisgICAgICAgICAgICAgICAgaW50KiBzcmNfcHRyID0gYmxvY2tbaSAmIC0yXSArIChpICYgMSkqODsKKyAgICAgICAgICAgICAgICBjb25zdCB1bG9uZyogaHRhYmxlID0gaHVmZl9hY190YWJbaXNfY2hyb21hXTsKKworICAgICAgICAgICAgICAgIGFhbl9mZGN0OHg4KCBzcmNfcHRyLCBidWZmZXIsIHNyY19zdGVwLCBmZGN0X3F0YWJbaXNfY2hyb21hXSApOworCisgICAgICAgICAgICAgICAgaiA9IGlzX2Nocm9tYSArIChpID4gbHVtYV9jb3VudCk7CisgICAgICAgICAgICAgICAgdmFsID0gYnVmZmVyWzBdIC0gZGNfcHJlZFtqXTsKKyAgICAgICAgICAgICAgICBkY19wcmVkW2pdID0gYnVmZmVyWzBdOworCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZsb2F0IGEgPSAoZmxvYXQpdmFsOworICAgICAgICAgICAgICAgIGludCBjYXQgPSAoKChpbnQmKWEgPj4gMjMpICYgMjU1KSAtICgxMjYgJiAodmFsID8gLTEgOiAwKSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIGNhdCA8PSAxMSApOworICAgICAgICAgICAgICAgIG1fc3RybS5QdXRIdWZmKCBjYXQsIGh1ZmZfZGNfdGFiW2lzX2Nocm9tYV0gKTsKKyAgICAgICAgICAgICAgICBtX3N0cm0uUHV0KCB2YWwgLSAodmFsIDwgMCA/IDEgOiAwKSwgY2F0ICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IDY0OyBqKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsID0gYnVmZmVyW3ppZ3phZ1tqXV07CisKKyAgICAgICAgICAgICAgICAgICAgaWYoIHZhbCA9PSAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgcnVuKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggcnVuID49IDE2ICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0cm0uUHV0SHVmZiggMHhGMCwgaHRhYmxlICk7IC8vIGVuY29kZSAxNiB6ZXJvcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1biAtPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYSA9IChmbG9hdCl2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2F0ID0gKCgoaW50JilhID4+IDIzKSAmIDI1NSkgLSAoMTI2ICYgKHZhbCA/IC0xIDogMCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoIGNhdCA8PSAxMCApOworICAgICAgICAgICAgICAgICAgICAgICAgbV9zdHJtLlB1dEh1ZmYoIGNhdCArIHJ1bioxNiwgaHRhYmxlICk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0cm0uUHV0KCB2YWwgLSAodmFsIDwgMCA/IDEgOiAwKSwgY2F0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiggcnVuICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5QdXRIdWZmKCAweDAwLCBodGFibGUgKTsgLy8gZW5jb2RlIEVPQgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZsdXNoIAorICAgIG1fc3RybS5GbHVzaCgpOworCisgICAgbG93c3RybS5QdXRXb3JkKCAweEZGRDkgKTsgLy8gRU9JIG1hcmtlcgorICAgIG1fc3RybS5DbG9zZSgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZgorCisvKiBFbmQgb2YgZmlsZS4gKi8KKworCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9qcGVnLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9qcGVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3NTcxNwotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcuaApAQCAtMCwwICsxLDIxNCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0dSRk1UX0pQRUdfSF8KKyNkZWZpbmUgX0dSRk1UX0pQRUdfSF8KKworI2luY2x1ZGUgImdyZm10X2Jhc2UuaCIKKyNpbmNsdWRlICJiaXRzdHJtLmgiCisKKyNpZmRlZiBIQVZFX0pQRUcKKworLyogSUpHLWJhc2VkIHZlcnNpb24gKi8KKworY2xhc3MgR3JGbXRKcGVnUmVhZGVyIDogcHVibGljIEdyRm10UmVhZGVyCit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRKcGVnUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIH5HckZtdEpwZWdSZWFkZXIoKTsKKworICAgIGJvb2wgIFJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApOworICAgIGJvb2wgIFJlYWRIZWFkZXIoKTsKKyAgICB2b2lkICBDbG9zZSgpOworCitwcm90ZWN0ZWQ6CisKKyAgICB2b2lkKiBtX2NpbmZvOyAvLyBwb2ludGVyIHRvIElKRyBKUEVHIGNvZGVjIHN0cnVjdHVyZQorICAgIHZvaWQqIG1famVycjsgLy8gcG9pbnRlciB0byBlcnJvciBwcm9jZXNzaW5nIG1hbmFnZXIgc3RhdGUKKyAgICBGSUxFKiBtX2Y7Cit9OworCisKK2NsYXNzIEdyRm10SnBlZ1dyaXRlciA6IHB1YmxpYyBHckZtdFdyaXRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10SnBlZ1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRKcGVnV3JpdGVyKCk7CisKKyAgICBib29sICBXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApOworfTsKKworI2Vsc2UKKworLyogaGFuZC1jcmFmdGVkIGltcGxlbWVudGF0aW9uICovCisKK2NsYXNzIFJKcGVnQml0U3RyZWFtIDogcHVibGljIFJNQml0U3RyZWFtCit7CitwdWJsaWM6CisgICAgUk1CeXRlU3RyZWFtICBtX2xvd19zdHJtOworICAgIAorICAgIFJKcGVnQml0U3RyZWFtKCk7CisgICAgflJKcGVnQml0U3RyZWFtKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgIE9wZW4oIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgdmlydHVhbCB2b2lkICBDbG9zZSgpOworCisgICAgdm9pZCAgRmx1c2goKTsgLy8gZmx1c2hlcyBoaWdoLWxldmVsIGJpdCBzdHJlYW0KKyAgICB2b2lkICBBbGlnbk9uQnl0ZSgpOworICAgIGludCAgIEZpbmRNYXJrZXIoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCAgUmVhZEJsb2NrKCk7Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vIEpQRUcgcmVhZGVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBHckZtdEpwZWdSZWFkZXIgOiBwdWJsaWMgR3JGbXRSZWFkZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdEpwZWdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10SnBlZ1JlYWRlcigpOworCisgICAgYm9vbCAgUmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICk7CisgICAgYm9vbCAgUmVhZEhlYWRlcigpOworICAgIHZvaWQgIENsb3NlKCk7CisKK3Byb3RlY3RlZDoKKworICAgIGludCAgIG1fb2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmlyc3Qgc2NhbgorICAgIGludCAgIG1fdmVyc2lvbjsgLy8gSkZJRiB2ZXJzaW9uCisgICAgaW50ICAgbV9wbGFuZXM7IC8vIDMgKFlDckNiKSBvciAxIChHcmF5KQorICAgIGludCAgIG1fcHJlY2lzaW9uOyAvLyA4IG9yIDEyLWJpdCBwZXIgc2FtcGxlCisgICAgaW50ICAgbV90eXBlOyAvLyBTT0YgdHlwZQorICAgIGludCAgIG1fTUNVczsgLy8gTUNVcyBpbiByZXN0YXJ0IGludGVydmFsCisgICAgaW50ICAgbV9zcywgbV9zZSwgbV9haCwgbV9hbDsgLy8gcHJvZ3Jlc3NpdmUgSlBFRyBwYXJhbWV0ZXJzCisgICAgCisgICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBjb21wb25lbnQKKyAgICBzdHJ1Y3QgY21wX2luZm8KKyAgICB7CisgICAgICAgIGNoYXIgaDsgIC8vIGhvcml6b250YWwgc2FtcGxpbmcgZmFjdG9yCisgICAgICAgIGNoYXIgdjsgIC8vIHZlcnRpY2FsICAgc2FtcGxpbmcgZmFjdG9yCisgICAgICAgIGNoYXIgdHE7IC8vIHF1YW50aXphdGlvbiB0YWJsZSBpbmRleAorICAgICAgICBjaGFyIHRkLCB0YTsgLy8gREMgJiBBQyBodWZmbWFuIHRhYmxlcworICAgICAgICBpbnQgIGRjX3ByZWQ7IC8vIERDIHByZWRpY3RvcgorICAgIH07CisgICAgCisgICAgY21wX2luZm8gbV9jaVszXTsKKworICAgIGludCAgICAgbV90cVs0XVs2NF07CisgICAgYm9vbCAgICBtX2lzX3RxWzRdOworICAgIAorICAgIHNob3J0KiAgbV90ZFs0XTsKKyAgICBib29sICAgIG1faXNfdGRbNF07CisgICAgCisgICAgc2hvcnQqICBtX3RhWzRdOworICAgIGJvb2wgICAgbV9pc190YVs0XTsKKyAgICAKKyAgICBSSnBlZ0JpdFN0cmVhbSAgbV9zdHJtOworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sICBMb2FkUXVhbnRUYWJsZXMoIGludCBsZW5ndGggKTsKKyAgICBib29sICBMb2FkSHVmZm1hblRhYmxlcyggaW50IGxlbmd0aCApOworICAgIHZvaWQgIFByb2Nlc3NTY2FuKCBpbnQqIGlkeCwgaW50IG5zLCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApOworICAgIHZvaWQgIFJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgIEdldEJsb2NrKCBpbnQqIGJsb2NrLCBpbnQgYyApOworfTsKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLyBKUEVHLXNwZWNpZmljIG91dHB1dCBiaXRzdHJlYW0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworY2xhc3MgV0pwZWdCaXRTdHJlYW0gOiBwdWJsaWMgV01CaXRTdHJlYW0KK3sKK3B1YmxpYzoKKyAgICBXTUJ5dGVTdHJlYW0gIG1fbG93X3N0cm07CisgICAgCisgICAgV0pwZWdCaXRTdHJlYW0oKTsKKyAgICB+V0pwZWdCaXRTdHJlYW0oKTsKKworICAgIHZpcnR1YWwgdm9pZCAgRmx1c2goKTsKKyAgICB2aXJ0dWFsIGJvb2wgIE9wZW4oIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgdmlydHVhbCB2b2lkICBDbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkICBXcml0ZUJsb2NrKCk7Cit9OworCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vIEpQRUcgcmVhZGVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitjbGFzcyBHckZtdEpwZWdXcml0ZXIgOiBwdWJsaWMgR3JGbXRXcml0ZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdEpwZWdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10SnBlZ1dyaXRlcigpOworCisgICAgYm9vbCAgV3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKTsKKworcHJvdGVjdGVkOgorCisgICAgV0pwZWdCaXRTdHJlYW0gIG1fc3RybTsKK307CisKKyNlbmRpZiAvKiBIQVZFX0pQRUcgKi8KKworCisvLyBKUEVHIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdEpwZWcgOiBwdWJsaWMgR3JGbXRGaWx0ZXJGYWN0b3J5Cit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRKcGVnKCk7CisgICAgfkdyRm10SnBlZygpOworCisgICAgR3JGbXRSZWFkZXIqIE5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBHckZtdFdyaXRlciogTmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworfTsKKworCisjZW5kaWYvKl9HUkZNVF9KUEVHX0hfKi8KZGlmZiAtLWdpdCBhL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcyMDAwLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X2pwZWcyMDAwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA2N2YyCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfanBlZzIwMDAuY3BwCkBAIC0wLDAgKzEsNTAyIEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2luY2x1ZGUgIl9oaWdoZ3VpLmgiCisKKyNpZmRlZiBIQVZFX0pBU1BFUgorCisjaW5jbHVkZSAiZ3JmbXRfanBlZzIwMDAuaCIKKworLy8gSlBFRy0yMDAwIEZpbHRlciBGYWN0b3J5CitHckZtdEpwZWcyMDAwOjpHckZtdEpwZWcyMDAwKCkKK3sKKyAgICBtX3NpZ25fbGVuID0gMTI7CisgICAgbV9zaWduYXR1cmUgPSAiXHgwMFx4MDBceDAwXHgwY2pQICBcclxuXHg4N1xuIjsKKyAgICBtX2Rlc2NyaXB0aW9uID0gIkpQRUctMjAwMCBmaWxlcyAoKi5qcDIpIjsKKyAgICBqYXNfaW5pdCgpOworfQorCisKK0dyRm10SnBlZzIwMDA6On5HckZtdEpwZWcyMDAwKCkKK3sKKyAgICBqYXNfY2xlYW51cCgpOworfQorCisKK0dyRm10UmVhZGVyKiBHckZtdEpwZWcyMDAwOjpOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10SnBlZzIwMDBSZWFkZXIoIGZpbGVuYW1lICk7Cit9CisKKworR3JGbXRXcml0ZXIqIEdyRm10SnBlZzIwMDA6Ok5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIHJldHVybiBuZXcgR3JGbXRKcGVnMjAwMFdyaXRlciggZmlsZW5hbWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdEpwZWcyMDAwUmVhZGVyIC8vLy8vLy8vLy8vLy8vLy8vLy8KKworR3JGbXRKcGVnMjAwMFJlYWRlcjo6R3JGbXRKcGVnMjAwMFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10UmVhZGVyKCBmaWxlbmFtZSApCit7CisJbV9zdHJlYW0gPSAwOworICAgICAgICBtX2ltYWdlID0gMDsKK30KKworCitHckZtdEpwZWcyMDAwUmVhZGVyOjp+R3JGbXRKcGVnMjAwMFJlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRKcGVnMjAwMFJlYWRlcjo6Q2xvc2UoKQoreworICAgIGlmKCBtX3N0cmVhbSApCisgICAgeworICAgICAgICBqYXNfc3RyZWFtX2Nsb3NlKCBtX3N0cmVhbSApOworICAgICAgICBtX3N0cmVhbSA9IDA7CisgICAgfQorCisgICAgaWYoIG1faW1hZ2UgKQorICAgIHsKKyAgICAgICAgamFzX2ltYWdlX2Rlc3Ryb3koIG1faW1hZ2UgKTsKKyAgICAgICAgbV9pbWFnZSA9IDA7CisgICAgfQorICAgIEdyRm10UmVhZGVyOjpDbG9zZSgpOworfQorCisKK2Jvb2wgIEdyRm10SnBlZzIwMDBSZWFkZXI6OlJlYWRIZWFkZXIoKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisKKyAgICBDbG9zZSgpOworCisgICAgbV9zdHJlYW0gPSBqYXNfc3RyZWFtX2ZvcGVuKCBtX2ZpbGVuYW1lLCAicmIiICk7CisgICAgaWYoIG1fc3RyZWFtICkKKyAgICB7CisgICAgICAgIG1faW1hZ2UgPSBqYXNfaW1hZ2VfZGVjb2RlKCBtX3N0cmVhbSwgLTEsIDAgKTsKKyAgICAgICAgaWYoIG1faW1hZ2UgKSB7CisgICAgICAgICAgICBtX3dpZHRoID0gamFzX2ltYWdlX3dpZHRoKCBtX2ltYWdlICk7CisgICAgICAgICAgICBtX2hlaWdodCA9IGphc19pbWFnZV9oZWlnaHQoIG1faW1hZ2UgKTsKKworICAgICAgICAgICAgaW50IGNudGNtcHRzID0gMDsgLy8gY291bnQgdGhlIGtub3duIGNvbXBvbmVudHMKKyAgICAgICAgICAgIGludCBudW1jbXB0cyA9IGphc19pbWFnZV9udW1jbXB0cyggbV9pbWFnZSApOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBudW1jbXB0czsgaSsrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgZGVwdGggPSBqYXNfaW1hZ2VfY21wdHByZWMoIG1faW1hZ2UsIGkgKTsKKyAgICAgICAgICAgICAgICBpZiggZGVwdGggPiBtX2JpdF9kZXB0aCApCisgICAgICAgICAgICAgICAgICAgIG1fYml0X2RlcHRoID0gZGVwdGg7CisgICAgICAgICAgICAgICAgaWYoIG1fYml0X2RlcHRoID4gOCApCisgICAgICAgICAgICAgICAgICAgIG1fYml0X2RlcHRoID0gMTY7CisKKyAgICAgICAgICAgICAgICBpZiggamFzX2ltYWdlX2NtcHR0eXBlKCBtX2ltYWdlLCBpICkgPiAyICkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgY250Y21wdHMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoIGNudGNtcHRzICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSAoY250Y21wdHMgPiAxKTsKKworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgICAgIENsb3NlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgIEdyRm10SnBlZzIwMDBSZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIGNvbG9yID0gY29sb3IgPiAwIHx8ICggbV9pc2NvbG9yICYmIGNvbG9yIDwgMCApOworCisgICAgaWYoIG1fc3RyZWFtICYmIG1faW1hZ2UgKQorICAgIHsKKyAgICAgICAgYm9vbCBjb252ZXJ0OworICAgICAgICBpbnQgY29sb3JzcGFjZTsKKyAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgeworICAgICAgICAgICAgY29udmVydCA9IChqYXNfaW1hZ2VfY2xyc3BjKCBtX2ltYWdlICkgIT0gSkFTX0NMUlNQQ19TUkdCKTsKKyAgICAgICAgICAgIGNvbG9yc3BhY2UgPSBKQVNfQ0xSU1BDX1NSR0I7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjb252ZXJ0ID0gKGphc19jbHJzcGNfZmFtKCBqYXNfaW1hZ2VfY2xyc3BjKCBtX2ltYWdlICkgKSAhPSBKQVNfQ0xSU1BDX0ZBTV9HUkFZKTsKKyAgICAgICAgICAgIGNvbG9yc3BhY2UgPSBKQVNfQ0xSU1BDX1NHUkFZOyAvLyBUT0RPIEdFTkdSQVkgb3IgU0dSQVk/CisgICAgICAgIH0KKworICAgICAgICAvLyBjb252ZXJ0IHRvIHRoZSBkZXNpcmVkIGNvbG9yc3BhY2UKKyAgICAgICAgaWYoIGNvbnZlcnQgKQorICAgICAgICB7CisgICAgICAgICAgICBqYXNfY21wcm9mX3QgKmNscnByb2YgPSBqYXNfY21wcm9mX2NyZWF0ZWZyb21jbHJzcGMoIGNvbG9yc3BhY2UgKTsKKyAgICAgICAgICAgIGlmKCBjbHJwcm9mICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBqYXNfaW1hZ2VfdCAqaW1nID0gamFzX2ltYWdlX2NoY2xyc3BjKCBtX2ltYWdlLCBjbHJwcm9mLCBKQVNfQ01YRk9STV9JTlRFTlRfUkVMQ0xSICk7CisgICAgICAgICAgICAgICAgaWYoIGltZyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBqYXNfaW1hZ2VfZGVzdHJveSggbV9pbWFnZSApOworICAgICAgICAgICAgICAgICAgICBtX2ltYWdlID0gaW1nOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSlBFRyAyMDAwIExPQURFUiBFUlJPUjogY2Fubm90IGNvbnZlcnQgY29sb3JzcGFjZVxuIik7CisgICAgICAgICAgICAgICAgamFzX2NtcHJvZl9kZXN0cm95KCBjbHJwcm9mICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJKUEVHIDIwMDAgTE9BREVSIEVSUk9SOiB1bmFibGUgdG8gY3JlYXRlIGNvbG9yc3BhY2VcbiIpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisKKyAgICAgICAgaWYoIHJlc3VsdCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBuY21wdHM7CisgICAgICAgICAgICBpbnQgY21wdGx1dFszXTsKKyAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY21wdGx1dFswXSA9IGphc19pbWFnZV9nZXRjbXB0Ynl0eXBlKCBtX2ltYWdlLCBKQVNfSU1BR0VfQ1RfUkdCX0IgKTsKKyAgICAgICAgICAgICAgICBjbXB0bHV0WzFdID0gamFzX2ltYWdlX2dldGNtcHRieXR5cGUoIG1faW1hZ2UsIEpBU19JTUFHRV9DVF9SR0JfRyApOworICAgICAgICAgICAgICAgIGNtcHRsdXRbMl0gPSBqYXNfaW1hZ2VfZ2V0Y21wdGJ5dHlwZSggbV9pbWFnZSwgSkFTX0lNQUdFX0NUX1JHQl9SICk7CisgICAgICAgICAgICAgICAgaWYoIGNtcHRsdXRbMF0gPCAwIHx8IGNtcHRsdXRbMV0gPCAwIHx8IGNtcHRsdXRbMF0gPCAwICkKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbmNtcHRzID0gMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjbXB0bHV0WzBdID0gamFzX2ltYWdlX2dldGNtcHRieXR5cGUoIG1faW1hZ2UsIEpBU19JTUFHRV9DVF9HUkFZX1kgKTsKKyAgICAgICAgICAgICAgICBpZiggY21wdGx1dFswXSA8IDAgKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBuY21wdHMgPSAxOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiggcmVzdWx0ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jbXB0czsgaSsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXh2YWwgPSAxIDw8IGphc19pbWFnZV9jbXB0cHJlYyggbV9pbWFnZSwgY21wdGx1dFtpXSApOworICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gIGphc19pbWFnZV9jbXB0c2duZCggbV9pbWFnZSwgY21wdGx1dFtpXSApID8gbWF4dmFsIC8gMiA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaW50IHllbmQgPSBqYXNfaW1hZ2VfY21wdGJyeSggbV9pbWFnZSwgY21wdGx1dFtpXSApOworICAgICAgICAgICAgICAgICAgICBpbnQgeXN0ZXAgPSBqYXNfaW1hZ2VfY21wdHZzdGVwKCBtX2ltYWdlLCBjbXB0bHV0W2ldICk7CisgICAgICAgICAgICAgICAgICAgIGludCB4ZW5kID0gamFzX2ltYWdlX2NtcHRicngoIG1faW1hZ2UsIGNtcHRsdXRbaV0gKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IHhzdGVwID0gamFzX2ltYWdlX2NtcHRoc3RlcCggbV9pbWFnZSwgY21wdGx1dFtpXSApOworCisgICAgICAgICAgICAgICAgICAgIGphc19tYXRyaXhfdCAqYnVmZmVyID0gamFzX21hdHJpeF9jcmVhdGUoIHllbmQgLyB5c3RlcCwgeGVuZCAvIHhzdGVwICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBidWZmZXIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIWphc19pbWFnZV9yZWFkY21wdCggbV9pbWFnZSwgY21wdGx1dFtpXSwgMCwgMCwgeGVuZCAvIHhzdGVwLCB5ZW5kIC8geXN0ZXAsIGJ1ZmZlciApKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2JpdF9kZXB0aCA9PSA4IHx8ICFtX25hdGl2ZV9kZXB0aCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlYWRDb21wb25lbnQ4dSggZGF0YSArIGksIGJ1ZmZlciwgc3RlcCwgY21wdGx1dFtpXSwgbWF4dmFsLCBvZmZzZXQsIG5jbXB0cyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVhZENvbXBvbmVudDE2dSggKCh1bnNpZ25lZCBzaG9ydCAqKWRhdGEpICsgaSwgYnVmZmVyLCBzdGVwIC8gMiwgY21wdGx1dFtpXSwgbWF4dmFsLCBvZmZzZXQsIG5jbXB0cyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhcmVzdWx0ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBuY21wdHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGphc19tYXRyaXhfZGVzdHJveSggYnVmZmVyICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorCSAgICBmcHJpbnRmKHN0ZGVyciwgIkpQRUcyMDAwIExPQURFUiBFUlJPUjogY29sb3JzcGFjZSBjb252ZXJzaW9uIGZhaWxlZFxuIiApOworICAgIH0KKworICAgIENsb3NlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgIEdyRm10SnBlZzIwMDBSZWFkZXI6OlJlYWRDb21wb25lbnQ4dSggdWNoYXIgKmRhdGEsIGphc19tYXRyaXhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IGNtcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXh2YWwsIGludCBvZmZzZXQsIGludCBuY21wdHMgKQoreworICAgIGludCB4c3RhcnQgPSBqYXNfaW1hZ2VfY21wdHRseCggbV9pbWFnZSwgY21wdCApOworICAgIGludCB4ZW5kID0gamFzX2ltYWdlX2NtcHRicngoIG1faW1hZ2UsIGNtcHQgKTsKKyAgICBpbnQgeHN0ZXAgPSBqYXNfaW1hZ2VfY21wdGhzdGVwKCBtX2ltYWdlLCBjbXB0ICk7CisgICAgaW50IHhvZmZzZXQgPSBqYXNfaW1hZ2VfdGx4KCBtX2ltYWdlICk7CisgICAgaW50IHlzdGFydCA9IGphc19pbWFnZV9jbXB0dGx5KCBtX2ltYWdlLCBjbXB0ICk7CisgICAgaW50IHllbmQgPSBqYXNfaW1hZ2VfY21wdGJyeSggbV9pbWFnZSwgY21wdCApOworICAgIGludCB5c3RlcCA9IGphc19pbWFnZV9jbXB0dnN0ZXAoIG1faW1hZ2UsIGNtcHQgKTsKKyAgICBpbnQgeW9mZnNldCA9IGphc19pbWFnZV90bHkoIG1faW1hZ2UgKTsKKyAgICBpbnQgeCwgeSwgeDEsIHkxLCBqOworICAgIGludCByc2hpZnQgPSBjdlJvdW5kKGxvZyhtYXh2YWwvMjU2LikvbG9nKDIuKSk7CisgICAgaW50IGxzaGlmdCA9IE1BWCgwLCAtcnNoaWZ0KTsKKyAgICByc2hpZnQgPSBNQVgoMCwgcnNoaWZ0KTsKKyAgICBpbnQgZGVsdGEgPSAocnNoaWZ0ID4gMCA/IDEgPDwgKHJzaGlmdCAtIDEpIDogMCkgKyBvZmZzZXQ7CisKKyAgICBmb3IoIHkgPSAwOyB5IDwgeWVuZCAtIHlzdGFydDsgKQorICAgIHsKKyAgICAgICAgamFzX3NlcWVudF90KiBwaXhfcm93ID0gJmphc19tYXRyaXhfZ2V0KCBidWZmZXIsIHkgLyB5c3RlcCwgMCApOworICAgICAgICB1Y2hhciogZHN0ID0gZGF0YSArICh5IC0geW9mZnNldCkgKiBzdGVwIC0geG9mZnNldDsKKworICAgICAgICBpZiggeHN0ZXAgPT0gMSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtYXh2YWwgPT0gMjU2ICYmIG9mZnNldCA9PSAwICkKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgeGVuZCAtIHhzdGFydDsgeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBwaXggPSBwaXhfcm93W3hdOworICAgICAgICAgICAgICAgICAgICBkc3RbeCpuY21wdHNdID0gQ1ZfQ0FTVF84VShwaXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgeGVuZCAtIHhzdGFydDsgeCsrICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBwaXggPSAoKHBpeF9yb3dbeF0gKyBkZWx0YSkgPj4gcnNoaWZ0KSA8PCBsc2hpZnQ7CisgICAgICAgICAgICAgICAgICAgIGRzdFt4Km5jbXB0c10gPSBDVl9DQVNUXzhVKHBpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHhzdGVwID09IDIgJiYgb2Zmc2V0ID09IDAgKQorICAgICAgICAgICAgZm9yKCB4ID0gMCwgaiA9IDA7IHggPCB4ZW5kIC0geHN0YXJ0OyB4ICs9IDIsIGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBpeCA9ICgocGl4X3Jvd1tqXSArIGRlbHRhKSA+PiByc2hpZnQpIDw8IGxzaGlmdDsKKyAgICAgICAgICAgICAgICBkc3RbeCpuY21wdHNdID0gZHN0Wyh4KzEpKm5jbXB0c10gPSBDVl9DQVNUXzhVKHBpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZvciggeCA9IDAsIGogPSAwOyB4IDwgeGVuZCAtIHhzdGFydDsgaisrICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcGl4ID0gKChwaXhfcm93W2pdICsgZGVsdGEpID4+IHJzaGlmdCkgPDwgbHNoaWZ0OworICAgICAgICAgICAgICAgIHBpeCA9IENWX0NBU1RfOFUocGl4KTsKKyAgICAgICAgICAgICAgICBmb3IoIHgxID0geCArIHhzdGVwOyB4IDwgeDE7IHgrKyApCisgICAgICAgICAgICAgICAgICAgIGRzdFt4Km5jbXB0c10gPSAodWNoYXIpcGl4OworICAgICAgICAgICAgfQorICAgICAgICB5MSA9IHkgKyB5c3RlcDsKKyAgICAgICAgZm9yKCArK3k7IHkgPCB5MTsgeSsrLCBkc3QgKz0gc3RlcCApCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgeGVuZCAtIHhzdGFydDsgeCsrICkKKyAgICAgICAgICAgICAgICBkc3RbeCpuY21wdHMgKyBzdGVwXSA9IGRzdFt4Km5jbXB0c107CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCAgR3JGbXRKcGVnMjAwMFJlYWRlcjo6UmVhZENvbXBvbmVudDE2dSggdW5zaWduZWQgc2hvcnQgKmRhdGEsIGphc19tYXRyaXhfdCAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCBjbXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heHZhbCwgaW50IG9mZnNldCwgaW50IG5jbXB0cyApCit7CisgICAgaW50IHhzdGFydCA9IGphc19pbWFnZV9jbXB0dGx4KCBtX2ltYWdlLCBjbXB0ICk7CisgICAgaW50IHhlbmQgPSBqYXNfaW1hZ2VfY21wdGJyeCggbV9pbWFnZSwgY21wdCApOworICAgIGludCB4c3RlcCA9IGphc19pbWFnZV9jbXB0aHN0ZXAoIG1faW1hZ2UsIGNtcHQgKTsKKyAgICBpbnQgeG9mZnNldCA9IGphc19pbWFnZV90bHgoIG1faW1hZ2UgKTsKKyAgICBpbnQgeXN0YXJ0ID0gamFzX2ltYWdlX2NtcHR0bHkoIG1faW1hZ2UsIGNtcHQgKTsKKyAgICBpbnQgeWVuZCA9IGphc19pbWFnZV9jbXB0YnJ5KCBtX2ltYWdlLCBjbXB0ICk7CisgICAgaW50IHlzdGVwID0gamFzX2ltYWdlX2NtcHR2c3RlcCggbV9pbWFnZSwgY21wdCApOworICAgIGludCB5b2Zmc2V0ID0gamFzX2ltYWdlX3RseSggbV9pbWFnZSApOworICAgIGludCB4LCB5LCB4MSwgeTEsIGo7CisgICAgaW50IHJzaGlmdCA9IGN2Um91bmQobG9nKG1heHZhbC82NTUzNi4pL2xvZygyLikpOworICAgIGludCBsc2hpZnQgPSBNQVgoMCwgLXJzaGlmdCk7CisgICAgcnNoaWZ0ID0gTUFYKDAsIHJzaGlmdCk7CisgICAgaW50IGRlbHRhID0gKHJzaGlmdCA+IDAgPyAxIDw8IChyc2hpZnQgLSAxKSA6IDApICsgb2Zmc2V0OworCisgICAgZm9yKCB5ID0gMDsgeSA8IHllbmQgLSB5c3RhcnQ7ICkKKyAgICB7CisgICAgICAgIGphc19zZXFlbnRfdCogcGl4X3JvdyA9ICZqYXNfbWF0cml4X2dldCggYnVmZmVyLCB5IC8geXN0ZXAsIDAgKTsKKyAgICAgICAgdXNob3J0KiBkc3QgPSBkYXRhICsgKHkgLSB5b2Zmc2V0KSAqIHN0ZXAgLSB4b2Zmc2V0OworCisgICAgICAgIGlmKCB4c3RlcCA9PSAxICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1heHZhbCA9PSA2NTUzNiAmJiBvZmZzZXQgPT0gMCApCisgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHhlbmQgLSB4c3RhcnQ7IHgrKyApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgcGl4ID0gcGl4X3Jvd1t4XTsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqbmNtcHRzXSA9IENWX0NBU1RfMTZVKHBpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCB4ZW5kIC0geHN0YXJ0OyB4KysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHBpeCA9ICgocGl4X3Jvd1t4XSArIGRlbHRhKSA+PiByc2hpZnQpIDw8IGxzaGlmdDsKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqbmNtcHRzXSA9IENWX0NBU1RfMTZVKHBpeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoIHhzdGVwID09IDIgJiYgb2Zmc2V0ID09IDAgKQorICAgICAgICAgICAgZm9yKCB4ID0gMCwgaiA9IDA7IHggPCB4ZW5kIC0geHN0YXJ0OyB4ICs9IDIsIGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBpeCA9ICgocGl4X3Jvd1tqXSArIGRlbHRhKSA+PiByc2hpZnQpIDw8IGxzaGlmdDsKKyAgICAgICAgICAgICAgICBkc3RbeCpuY21wdHNdID0gZHN0Wyh4KzEpKm5jbXB0c10gPSBDVl9DQVNUXzE2VShwaXgpOworICAgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBmb3IoIHggPSAwLCBqID0gMDsgeCA8IHhlbmQgLSB4c3RhcnQ7IGorKyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBpeCA9ICgocGl4X3Jvd1tqXSArIGRlbHRhKSA+PiByc2hpZnQpIDw8IGxzaGlmdDsKKyAgICAgICAgICAgICAgICBwaXggPSBDVl9DQVNUXzE2VShwaXgpOworICAgICAgICAgICAgICAgIGZvciggeDEgPSB4ICsgeHN0ZXA7IHggPCB4MTsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgZHN0W3gqbmNtcHRzXSA9ICh1c2hvcnQpcGl4OworICAgICAgICAgICAgfQorICAgICAgICB5MSA9IHkgKyB5c3RlcDsKKyAgICAgICAgZm9yKCArK3k7IHkgPCB5MTsgeSsrLCBkc3QgKz0gc3RlcCApCisgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgeGVuZCAtIHhzdGFydDsgeCsrICkKKyAgICAgICAgICAgICAgICBkc3RbeCpuY21wdHMgKyBzdGVwXSA9IGRzdFt4Km5jbXB0c107CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gR3JGbXRKcGVnMjAwMFdyaXRlciAvLy8vLy8vLy8vLy8vLy8vLy8vCisKKworR3JGbXRKcGVnMjAwMFdyaXRlcjo6R3JGbXRKcGVnMjAwMFdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10V3JpdGVyKCBmaWxlbmFtZSApCit7Cit9CisKKworR3JGbXRKcGVnMjAwMFdyaXRlcjo6fkdyRm10SnBlZzIwMDBXcml0ZXIoKQoreworfQorCisKK2Jvb2wgIEdyRm10SnBlZzIwMDBXcml0ZXI6OklzRm9ybWF0U3VwcG9ydGVkKCBpbnQgZGVwdGggKQoreworICAgIHJldHVybiBkZXB0aCA9PSBJUExfREVQVEhfOFUgfHwgZGVwdGggPT0gSVBMX0RFUFRIXzE2VTsKK30KKworCitib29sICBHckZtdEpwZWcyMDAwV3JpdGVyOjpXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApCit7CisgICAgaWYoIGNoYW5uZWxzID4gMyB8fCBjaGFubmVscyA8IDEgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBqYXNfaW1hZ2VfY21wdHBhcm1fdCBjb21wb25lbnRfaW5mb1szXTsKKyAgICBmb3IoIGludCBpID0gMDsgaSA8IGNoYW5uZWxzOyBpKysgKQorICAgIHsKKyAgICAgICAgY29tcG9uZW50X2luZm9baV0udGx4ID0gMDsKKyAgICAgICAgY29tcG9uZW50X2luZm9baV0udGx5ID0gMDsKKyAgICAgICAgY29tcG9uZW50X2luZm9baV0uaHN0ZXAgPSAxOworICAgICAgICBjb21wb25lbnRfaW5mb1tpXS52c3RlcCA9IDE7CisgICAgICAgIGNvbXBvbmVudF9pbmZvW2ldLndpZHRoID0gd2lkdGg7CisgICAgICAgIGNvbXBvbmVudF9pbmZvW2ldLmhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgY29tcG9uZW50X2luZm9baV0ucHJlYyA9IGRlcHRoOworICAgICAgICBjb21wb25lbnRfaW5mb1tpXS5zZ25kID0gMDsKKyAgICB9CisgICAgamFzX2ltYWdlX3QgKmltZyA9IGphc19pbWFnZV9jcmVhdGUoIGNoYW5uZWxzLCBjb21wb25lbnRfaW5mbywgKGNoYW5uZWxzID09IDEpID8gSkFTX0NMUlNQQ19TR1JBWSA6IEpBU19DTFJTUENfU1JHQiApOworICAgIGlmKCAhaW1nICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYoY2hhbm5lbHMgPT0gMSkKKyAgICAgICAgamFzX2ltYWdlX3NldGNtcHR0eXBlKCBpbWcsIDAsIEpBU19JTUFHRV9DVF9HUkFZX1kgKTsKKyAgICBlbHNlCisgICAgeworICAgICAgICBqYXNfaW1hZ2Vfc2V0Y21wdHR5cGUoIGltZywgMCwgSkFTX0lNQUdFX0NUX1JHQl9CICk7CisgICAgICAgIGphc19pbWFnZV9zZXRjbXB0dHlwZSggaW1nLCAxLCBKQVNfSU1BR0VfQ1RfUkdCX0cgKTsKKyAgICAgICAgamFzX2ltYWdlX3NldGNtcHR0eXBlKCBpbWcsIDIsIEpBU19JTUFHRV9DVF9SR0JfUiApOworICAgIH0KKworICAgIGJvb2wgcmVzdWx0OworICAgIGlmKCBkZXB0aCA9PSA4ICkKKyAgICAgICAgcmVzdWx0ID0gV3JpdGVDb21wb25lbnQ4dSggaW1nLCBkYXRhLCBzdGVwLCBjaGFubmVscywgd2lkdGgsIGhlaWdodCApOworICAgIGVsc2UKKyAgICAgICAgcmVzdWx0ID0gV3JpdGVDb21wb25lbnQxNnUoIGltZywgKGNvbnN0IHVuc2lnbmVkIHNob3J0ICopZGF0YSwgc3RlcCAvIDIsIGNoYW5uZWxzLCB3aWR0aCwgaGVpZ2h0ICk7CisgICAgaWYoIHJlc3VsdCApCisgICAgeworICAgICAgICBqYXNfc3RyZWFtX3QgKnN0cmVhbSA9IGphc19zdHJlYW1fZm9wZW4oIG1fZmlsZW5hbWUsICJ3YiIgKTsKKyAgICAgICAgaWYoIHN0cmVhbSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlc3VsdCA9ICFqYXNfaW1hZ2VfZW5jb2RlKCBpbWcsIHN0cmVhbSwgamFzX2ltYWdlX3N0cnRvZm10KCAianAyIiApLCAiIiApOworCisgICAgICAgICAgICBqYXNfc3RyZWFtX2Nsb3NlKCBzdHJlYW0gKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIGphc19pbWFnZV9kZXN0cm95KCBpbWcgKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCAgR3JGbXRKcGVnMjAwMFdyaXRlcjo6V3JpdGVDb21wb25lbnQ4dSggamFzX2ltYWdlX3QgKmltZywgY29uc3QgdWNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IG5jbXB0cywgaW50IHcsIGludCBoICkKK3sKKyAgICBqYXNfbWF0cml4X3QgKnJvdyA9IGphc19tYXRyaXhfY3JlYXRlKCAxLCB3ICk7CisgICAgaWYoIXJvdykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yKCBpbnQgeSA9IDA7IHkgPCBoOyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jbXB0czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpbnQgeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgamFzX21hdHJpeF9zZXR2KCByb3csIHgsIGRhdGFbeCAqIG5jbXB0cyArIGldICk7CisgICAgICAgICAgICBqYXNfaW1hZ2Vfd3JpdGVjbXB0KCBpbWcsIGksIDAsIHksIHcsIDEsIHJvdyApOworICAgICAgICB9CisgICAgfQorCisgICAgamFzX21hdHJpeF9kZXN0cm95KCByb3cgKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgIEdyRm10SnBlZzIwMDBXcml0ZXI6OldyaXRlQ29tcG9uZW50MTZ1KCBqYXNfaW1hZ2VfdCAqaW1nLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RlcCwgaW50IG5jbXB0cywgaW50IHcsIGludCBoICkKK3sKKyAgICBqYXNfbWF0cml4X3QgKnJvdyA9IGphc19tYXRyaXhfY3JlYXRlKCAxLCB3ICk7CisgICAgaWYoIXJvdykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yKCBpbnQgeSA9IDA7IHkgPCBoOyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jbXB0czsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKCBpbnQgeCA9IDA7IHggPCB3OyB4KyspCisgICAgICAgICAgICAgICAgamFzX21hdHJpeF9zZXR2KCByb3csIHgsIGRhdGFbeCAqIG5jbXB0cyArIGldICk7CisgICAgICAgICAgICBqYXNfaW1hZ2Vfd3JpdGVjbXB0KCBpbWcsIGksIDAsIHksIHcsIDEsIHJvdyApOworICAgICAgICB9CisgICAgfQorCisgICAgamFzX21hdHJpeF9kZXN0cm95KCByb3cgKTsKKworICAgIHJldHVybiB0cnVlOworfQorCisjZW5kaWYKKworLyogRW5kIG9mIGZpbGUuICovCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9qcGVnMjAwMC5oIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfanBlZzIwMDAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWU0YTEzCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfanBlZzIwMDAuaApAQCAtMCwwICsxLDExNSBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0dSRk1UX0pBU1BFUl9IXworI2RlZmluZSBfR1JGTVRfSkFTUEVSX0hfCisKKyNpZmRlZiBIQVZFX0pBU1BFUgorCisjaWZkZWYgV0lOMzIKKyNkZWZpbmUgSkFTX1dJTl9NU1ZDX0JVSUxEIDEKKyNlbmRpZgorCisjaW5jbHVkZSA8amFzcGVyL2phc3Blci5oPgorLy8gRklYTUUgYmFkIGhhY2sKKyN1bmRlZiB1Y2hhcgorI3VuZGVmIHVsb25nCisjaW5jbHVkZSAiZ3JmbXRfYmFzZS5oIgorCisKKy8qIGxpYnBuZyB2ZXJzaW9uIG9ubHkgKi8KKworY2xhc3MgR3JGbXRKcGVnMjAwMFJlYWRlciA6IHB1YmxpYyBHckZtdFJlYWRlcgoreworcHVibGljOgorCisgICAgR3JGbXRKcGVnMjAwMFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRKcGVnMjAwMFJlYWRlcigpOworCisgICAgYm9vbCAgQ2hlY2tGb3JtYXQoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApOworICAgIGJvb2wgIFJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApOworICAgIGJvb2wgIFJlYWRIZWFkZXIoKTsKKyAgICB2b2lkICBDbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgYm9vbCAgUmVhZENvbXBvbmVudDh1KCB1Y2hhciAqZGF0YSwgamFzX21hdHJpeF90ICpidWZmZXIsIGludCBzdGVwLCBpbnQgY21wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXh2YWwsIGludCBvZmZzZXQsIGludCBuY21wdHMgKTsKKyAgICBib29sICBSZWFkQ29tcG9uZW50MTZ1KCB1bnNpZ25lZCBzaG9ydCAqZGF0YSwgamFzX21hdHJpeF90ICpidWZmZXIsIGludCBzdGVwLCBpbnQgY21wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4dmFsLCBpbnQgb2Zmc2V0LCBpbnQgbmNtcHRzICk7CisKKyAgICBqYXNfc3RyZWFtX3QgKm1fc3RyZWFtOworICAgIGphc19pbWFnZV90ICAqbV9pbWFnZTsKK307CisKKworY2xhc3MgR3JGbXRKcGVnMjAwMFdyaXRlciA6IHB1YmxpYyBHckZtdFdyaXRlcgoreworcHVibGljOgorCisgICAgR3JGbXRKcGVnMjAwMFdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRKcGVnMjAwMFdyaXRlcigpOworCisgICAgYm9vbCAgSXNGb3JtYXRTdXBwb3J0ZWQoIGludCBkZXB0aCApOworICAgIGJvb2wgIFdyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICk7Citwcm90ZWN0ZWQ6CisgICAgYm9vbCAgV3JpdGVDb21wb25lbnQ4dSggamFzX2ltYWdlX3QgKmltZywgY29uc3QgdWNoYXIgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCBuY21wdHMsIGludCB3LCBpbnQgaCApOworICAgIGJvb2wgIFdyaXRlQ29tcG9uZW50MTZ1KCBqYXNfaW1hZ2VfdCAqaW1nLCBjb25zdCB1bnNpZ25lZCBzaG9ydCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCBuY21wdHMsIGludCB3LCBpbnQgaCApOworfTsKKworCisvLyBQTkcgZmlsdGVyIGZhY3RvcnkKK2NsYXNzIEdyRm10SnBlZzIwMDAgOiBwdWJsaWMgR3JGbXRGaWx0ZXJGYWN0b3J5Cit7CitwdWJsaWM6CisKKyAgICBHckZtdEpwZWcyMDAwKCk7CisgICAgfkdyRm10SnBlZzIwMDAoKTsKKworICAgIEdyRm10UmVhZGVyKiBOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgR3JGbXRXcml0ZXIqIE5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKK307CisKKyNlbmRpZgorCisjZW5kaWYvKl9HUkZNVF9KQVNQRVJfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcG5nLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3BuZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjExNmFkYQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3BuZy5jcHAKQEAgLTAsMCArMSwzMzMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKworI2lmZGVmIEhBVkVfUE5HCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICAgIFRoaXMgcGFydCBvZiB0aGUgZmlsZSBpbXBsZW1lbnRzIFBORyBjb2RlYyBvbiBiYXNlIG9mIGxpYnBuZyBsaWJyYXJ5LAorICAgIGluIHBhcnRpY3VsYXIsIHRoaXMgY29kZSBpcyBiYXNlZCBvbiBleGFtcGxlLmMgZnJvbSBsaWJwbmcKKyAgICAoc2VlIG90aGVybGlicy9fZ3JhcGhpY3MvcmVhZG1lLnR4dCBmb3IgY29weXJpZ2h0IG5vdGljZSkKKyAgICBhbmQgcG5nMmJtcCBzYW1wbGUgZnJvbSBsaWJwbmcgZGlzdHJpYnV0aW9uIChDb3B5cmlnaHQgKEMpIDE5OTktMjAwMSBNSVlBU0FLQSBNYXNhcnUpCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2lmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBIQVZFX1BOR19ICisjaW5jbHVkZSA8cG5nLmg+CisjZWxzZQorI2luY2x1ZGUgPGxpYnBuZy9wbmcuaD4KKyNlbmRpZgorI2luY2x1ZGUgImdyZm10X3BuZy5oIgorCisvLyBQTkcgRmlsdGVyIEZhY3RvcnkKK0dyRm10UG5nOjpHckZtdFBuZygpCit7CisgICAgbV9zaWduX2xlbiA9IDg7CisgICAgbV9zaWduYXR1cmUgPSAiXHg4OVx4NTBceDRlXHg0N1x4ZFx4YVx4MWFceGEiOworICAgIG1fZGVzY3JpcHRpb24gPSAiUG9ydGFibGUgTmV0d29yayBHcmFwaGljcyBmaWxlcyAoKi5wbmcpIjsKK30KKworCitHckZtdFBuZzo6fkdyRm10UG5nKCkKK3sKK30KKworCitHckZtdFJlYWRlciogR3JGbXRQbmc6Ok5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIHJldHVybiBuZXcgR3JGbXRQbmdSZWFkZXIoIGZpbGVuYW1lICk7Cit9CisKKworR3JGbXRXcml0ZXIqIEdyRm10UG5nOjpOZXdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10UG5nV3JpdGVyKCBmaWxlbmFtZSApOworfQorCisKK2Jvb2wgIEdyRm10UG5nOjpDaGVja1NpZ25hdHVyZSggY29uc3QgY2hhciogc2lnbmF0dXJlICkKK3sKKyAgICByZXR1cm4gcG5nX2NoZWNrX3NpZyggKHVjaGFyKilzaWduYXR1cmUsIG1fc2lnbl9sZW4gKSAhPSAwOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdFBuZ1JlYWRlciAvLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyRm10UG5nUmVhZGVyOjpHckZtdFBuZ1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10UmVhZGVyKCBmaWxlbmFtZSApCit7CisgICAgbV9jb2xvcl90eXBlID0gbV9iaXRfZGVwdGggPSAwOworICAgIG1fcG5nX3B0ciA9IDA7CisgICAgbV9pbmZvX3B0ciA9IG1fZW5kX2luZm8gPSAwOworICAgIG1fZiA9IDA7Cit9CisKKworR3JGbXRQbmdSZWFkZXI6On5HckZtdFBuZ1JlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRQbmdSZWFkZXI6OkNsb3NlKCkKK3sKKyAgICBpZiggbV9mICkKKyAgICB7CisgICAgICAgIGZjbG9zZSggbV9mICk7CisgICAgICAgIG1fZiA9IDA7CisgICAgfQorCisgICAgaWYoIG1fcG5nX3B0ciApCisgICAgeworICAgICAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gKHBuZ19zdHJ1Y3RwKW1fcG5nX3B0cjsKKyAgICAgICAgcG5nX2luZm9wIGluZm9fcHRyID0gKHBuZ19pbmZvcCltX2luZm9fcHRyOworICAgICAgICBwbmdfaW5mb3AgZW5kX2luZm8gPSAocG5nX2luZm9wKW1fZW5kX2luZm87CisgICAgICAgIHBuZ19kZXN0cm95X3JlYWRfc3RydWN0KCAmcG5nX3B0ciwgJmluZm9fcHRyLCAmZW5kX2luZm8gKTsKKyAgICAgICAgbV9wbmdfcHRyID0gbV9pbmZvX3B0ciA9IG1fZW5kX2luZm8gPSAwOworICAgIH0KKyAgICBHckZtdFJlYWRlcjo6Q2xvc2UoKTsKK30KKworCitib29sICBHckZtdFBuZ1JlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIENsb3NlKCk7CisKKyAgICBwbmdfc3RydWN0cCBwbmdfcHRyID0gcG5nX2NyZWF0ZV9yZWFkX3N0cnVjdCggUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwICk7CisKKyAgICBpZiggcG5nX3B0ciApCisgICAgeworICAgICAgICBwbmdfaW5mb3AgaW5mb19wdHIgPSBwbmdfY3JlYXRlX2luZm9fc3RydWN0KCBwbmdfcHRyICk7CisgICAgICAgIHBuZ19pbmZvcCBlbmRfaW5mbyA9IHBuZ19jcmVhdGVfaW5mb19zdHJ1Y3QoIHBuZ19wdHIgKTsKKworICAgICAgICBtX3BuZ19wdHIgPSBwbmdfcHRyOworICAgICAgICBtX2luZm9fcHRyID0gaW5mb19wdHI7CisgICAgICAgIG1fZW5kX2luZm8gPSBlbmRfaW5mbzsKKworICAgICAgICBpZiggaW5mb19wdHIgJiYgZW5kX2luZm8gKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggc2V0am1wKCBwbmdfcHRyLT5qbXBidWYgKSA9PSAwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBtX2YgPSBmb3BlbiggbV9maWxlbmFtZSwgInJiIiApOworICAgICAgICAgICAgICAgIGlmKCBtX2YgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgcG5nX3VpbnRfMzIgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJpdF9kZXB0aCwgY29sb3JfdHlwZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIHBuZ19pbml0X2lvKCBwbmdfcHRyLCBtX2YgKTsKKyAgICAgICAgICAgICAgICAgICAgcG5nX3JlYWRfaW5mbyggcG5nX3B0ciwgaW5mb19wdHIgKTsKKworICAgICAgICAgICAgICAgICAgICBwbmdfZ2V0X0lIRFIoIHBuZ19wdHIsIGluZm9fcHRyLCAmd2lkdGgsICZoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdF9kZXB0aCwgJmNvbG9yX3R5cGUsIDAsIDAsIDAgKTsKKworICAgICAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1JHQl9BTFBIQSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEU7CisKKyAgICAgICAgICAgICAgICAgICAgbV93aWR0aCA9IChpbnQpd2lkdGg7CisgICAgICAgICAgICAgICAgICAgIG1faGVpZ2h0ID0gKGludCloZWlnaHQ7CisgICAgICAgICAgICAgICAgICAgIG1fY29sb3JfdHlwZSA9IGNvbG9yX3R5cGU7CisgICAgICAgICAgICAgICAgICAgIG1fYml0X2RlcHRoID0gYml0X2RlcHRoOworCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFyZXN1bHQgKQorICAgICAgICBDbG9zZSgpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sICBHckZtdFBuZ1JlYWRlcjo6UmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICkKK3sKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIHVjaGFyKiogYnVmZmVyID0gMDsKKworICAgIGNvbG9yID0gY29sb3IgPiAwIHx8ICggbV9pc2NvbG9yICYmIGNvbG9yIDwgMCApOworICAgIAorICAgIGlmKCBtX3BuZ19wdHIgJiYgbV9pbmZvX3B0ciAmJiBtX2VuZF9pbmZvICYmIG1fd2lkdGggJiYgbV9oZWlnaHQgKQorICAgIHsKKyAgICAgICAgcG5nX3N0cnVjdHAgcG5nX3B0ciA9IChwbmdfc3RydWN0cCltX3BuZ19wdHI7CisgICAgICAgIHBuZ19pbmZvcCBpbmZvX3B0ciA9IChwbmdfaW5mb3ApbV9pbmZvX3B0cjsKKyAgICAgICAgcG5nX2luZm9wIGVuZF9pbmZvID0gKHBuZ19pbmZvcCltX2VuZF9pbmZvOworICAgICAgICAKKyAgICAgICAgaWYoIHNldGptcChwbmdfcHRyLT5qbXBidWYpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeTsKKworICAgICAgICAgICAgaWYoIG1fYml0X2RlcHRoID4gOCAmJiAhbV9uYXRpdmVfZGVwdGggKQorICAgICAgICAgICAgICAgIHBuZ19zZXRfc3RyaXBfMTYoIHBuZ19wdHIgKTsKKyAgICAgICAgICAgIGVsc2UgaWYoICFpc0JpZ0VuZGlhbigpICkKKyAgICAgICAgICAgICAgICBwbmdfc2V0X3N3YXAoIHBuZ19wdHIgKTsKKworICAgICAgICAgICAgLyogb2JzZXJ2YXRpb246IHBuZ19yZWFkX2ltYWdlKCkgd3JpdGVzIDQwMCBieXRlcyBiZXlvbmQKKyAgICAgICAgICAgICAqIGVuZCBvZiBkYXRhIHdoZW4gcmVhZGluZyBhIDQwMHgxMTggY29sb3IgcG5nCisgICAgICAgICAgICAgKiAibXBwbHVzX3NhbmQucG5nIi4gIE9wZW5DViBjcmFzaGVzIGV2ZW4gd2l0aCBkZW1vCisgICAgICAgICAgICAgKiBwcm9ncmFtcy4gIExvb2tpbmcgYXQgdGhlIGxvYWRlZCBpbWFnZSBJJ2Qgc2F5IHdlIGdldCA0CisgICAgICAgICAgICAgKiBieXRlcyBwZXIgcGl4ZWwgaW5zdGVhZCBvZiAzIGJ5dGVzIHBlciBwaXhlbC4gIFRlc3QKKyAgICAgICAgICAgICAqIGluZGljYXRlIHRoYXQgaXQgaXMgYSBnb29kIGlkZWEgdG8gYWx3YXlzIGFzayBmb3IKKyAgICAgICAgICAgICAqIHN0cmlwcGluZyBhbHBoYS4uICAxOC4xMS4yMDA0IEF4ZWwgV2FsdGhlbG0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcG5nX3NldF9zdHJpcF9hbHBoYSggcG5nX3B0ciApOworCisgICAgICAgICAgICBpZiggbV9jb2xvcl90eXBlID09IFBOR19DT0xPUl9UWVBFX1BBTEVUVEUgKQorICAgICAgICAgICAgICAgIHBuZ19zZXRfcGFsZXR0ZV90b19yZ2IoIHBuZ19wdHIgKTsKKworICAgICAgICAgICAgaWYoIG1fY29sb3JfdHlwZSA9PSBQTkdfQ09MT1JfVFlQRV9HUkFZICYmIG1fYml0X2RlcHRoIDwgOCApCisgICAgICAgICAgICAgICAgcG5nX3NldF9ncmF5XzFfMl80X3RvXzgoIHBuZ19wdHIgKTsKKworICAgICAgICAgICAgaWYoIG1faXNjb2xvciAmJiBjb2xvciApCisgICAgICAgICAgICAgICAgcG5nX3NldF9iZ3IoIHBuZ19wdHIgKTsgLy8gY29udmVydCBSR0IgdG8gQkdSCisgICAgICAgICAgICBlbHNlIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgcG5nX3NldF9ncmF5X3RvX3JnYiggcG5nX3B0ciApOyAvLyBHcmF5LT5SR0IKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBwbmdfc2V0X3JnYl90b19ncmF5KCBwbmdfcHRyLCAxLCAtMSwgLTEgKTsgLy8gUkdCLT5HcmF5CisKKyAgICAgICAgICAgIHBuZ19yZWFkX3VwZGF0ZV9pbmZvKCBwbmdfcHRyLCBpbmZvX3B0ciApOworCisgICAgICAgICAgICBidWZmZXIgPSBuZXcgdWNoYXIqW21faGVpZ2h0XTsKKworICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KysgKQorICAgICAgICAgICAgICAgIGJ1ZmZlclt5XSA9IGRhdGEgKyB5KnN0ZXA7CisKKyAgICAgICAgICAgIHBuZ19yZWFkX2ltYWdlKCBwbmdfcHRyLCBidWZmZXIgKTsKKyAgICAgICAgICAgIHBuZ19yZWFkX2VuZCggcG5nX3B0ciwgZW5kX2luZm8gKTsKKworICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENsb3NlKCk7CisgICAgZGVsZXRlW10gYnVmZmVyOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBHckZtdFBuZ1dyaXRlciAvLy8vLy8vLy8vLy8vLy8vLy8vCisKKworR3JGbXRQbmdXcml0ZXI6OkdyRm10UG5nV3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApIDogR3JGbXRXcml0ZXIoIGZpbGVuYW1lICkKK3sKK30KKworCitHckZtdFBuZ1dyaXRlcjo6fkdyRm10UG5nV3JpdGVyKCkKK3sKK30KKworCitib29sICBHckZtdFBuZ1dyaXRlcjo6SXNGb3JtYXRTdXBwb3J0ZWQoIGludCBkZXB0aCApCit7CisgICAgcmV0dXJuIGRlcHRoID09IElQTF9ERVBUSF84VSB8fCBkZXB0aCA9PSBJUExfREVQVEhfMTZVOworfQorCitib29sICBHckZtdFBuZ1dyaXRlcjo6V3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgY2hhbm5lbHMgKQoreworICAgIHBuZ19zdHJ1Y3RwIHBuZ19wdHIgPSBwbmdfY3JlYXRlX3dyaXRlX3N0cnVjdCggUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwICk7CisgICAgcG5nX2luZm9wIGluZm9fcHRyID0gMDsKKyAgICBGSUxFKiBmID0gMDsKKyAgICB1Y2hhcioqIGJ1ZmZlciA9IDA7CisgICAgaW50IHk7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIGlmKCBkZXB0aCAhPSBJUExfREVQVEhfOFUgJiYgZGVwdGggIT0gSVBMX0RFUFRIXzE2VSApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmKCBwbmdfcHRyICkKKyAgICB7CisgICAgICAgIGluZm9fcHRyID0gcG5nX2NyZWF0ZV9pbmZvX3N0cnVjdCggcG5nX3B0ciApOworICAgICAgICAKKyAgICAgICAgaWYoIGluZm9fcHRyICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIHNldGptcCggcG5nX3B0ci0+am1wYnVmICkgPT0gMCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZiA9IGZvcGVuKCBtX2ZpbGVuYW1lLCAid2IiICk7CisKKyAgICAgICAgICAgICAgICBpZiggZiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwbmdfaW5pdF9pbyggcG5nX3B0ciwgZiApOworCisgICAgICAgICAgICAgICAgICAgIHBuZ19zZXRfY29tcHJlc3Npb25fbWVtX2xldmVsKCBwbmdfcHRyLCBNQVhfTUVNX0xFVkVMICk7CisKKyAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9JSERSKCBwbmdfcHRyLCBpbmZvX3B0ciwgd2lkdGgsIGhlaWdodCwgZGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9PSAxID8gUE5HX0NPTE9SX1RZUEVfR1JBWSA6CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyA9PSAzID8gUE5HX0NPTE9SX1RZUEVfUkdCIDogUE5HX0NPTE9SX1RZUEVfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwgUE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBOR19GSUxURVJfVFlQRV9ERUZBVUxUICk7CisKKyAgICAgICAgICAgICAgICAgICAgcG5nX3dyaXRlX2luZm8oIHBuZ19wdHIsIGluZm9fcHRyICk7CisKKyAgICAgICAgICAgICAgICAgICAgcG5nX3NldF9iZ3IoIHBuZ19wdHIgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoICFpc0JpZ0VuZGlhbigpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBuZ19zZXRfc3dhcCggcG5nX3B0ciApOworCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyB1Y2hhcipbaGVpZ2h0XTsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclt5XSA9ICh1Y2hhciopKGRhdGEgKyB5KnN0ZXApOworCisgICAgICAgICAgICAgICAgICAgIHBuZ193cml0ZV9pbWFnZSggcG5nX3B0ciwgYnVmZmVyICk7CisgICAgICAgICAgICAgICAgICAgIHBuZ193cml0ZV9lbmQoIHBuZ19wdHIsIGluZm9fcHRyICk7CisKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCggJnBuZ19wdHIsICZpbmZvX3B0ciApOworCisgICAgaWYoZikgZmNsb3NlKCBmICk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKKworLyogRW5kIG9mIGZpbGUuICovCisKKwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcG5nLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9wbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWY3MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcG5nLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9HUkZNVF9QTkdfSF8KKyNkZWZpbmUgX0dSRk1UX1BOR19IXworCisjaWZkZWYgSEFWRV9QTkcKKworI2luY2x1ZGUgImdyZm10X2Jhc2UuaCIKKyNpbmNsdWRlICJiaXRzdHJtLmgiCisKKy8qIGxpYnBuZyB2ZXJzaW9uIG9ubHkgKi8KKworY2xhc3MgR3JGbXRQbmdSZWFkZXIgOiBwdWJsaWMgR3JGbXRSZWFkZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdFBuZ1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRQbmdSZWFkZXIoKTsKKworICAgIGJvb2wgIENoZWNrRm9ybWF0KCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKTsKKyAgICBib29sICBSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKTsKKyAgICBib29sICBSZWFkSGVhZGVyKCk7CisgICAgdm9pZCAgQ2xvc2UoKTsKKworcHJvdGVjdGVkOgorCisgICAgdm9pZCogbV9wbmdfcHRyOyAgLy8gcG9pbnRlciB0byBkZWNvbXByZXNzaW9uIHN0cnVjdHVyZQorICAgIHZvaWQqIG1faW5mb19wdHI7IC8vIHBvaW50ZXIgdG8gaW1hZ2UgaW5mb3JtYXRpb24gc3RydWN0dXJlCisgICAgdm9pZCogbV9lbmRfaW5mbzsgLy8gcG9pbnRlciB0byBvbmUgbW9yZSBpbWFnZSBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKKyAgICBGSUxFKiBtX2Y7CisgICAgaW50ICAgbV9jb2xvcl90eXBlOworfTsKKworCitjbGFzcyBHckZtdFBuZ1dyaXRlciA6IHB1YmxpYyBHckZtdFdyaXRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10UG5nV3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIH5HckZtdFBuZ1dyaXRlcigpOworCisgICAgYm9vbCAgSXNGb3JtYXRTdXBwb3J0ZWQoIGludCBkZXB0aCApOworICAgIGJvb2wgIFdyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICk7Citwcm90ZWN0ZWQ6Cit9OworCisKKy8vIFBORyBmaWx0ZXIgZmFjdG9yeQorY2xhc3MgR3JGbXRQbmcgOiBwdWJsaWMgR3JGbXRGaWx0ZXJGYWN0b3J5Cit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRQbmcoKTsKKyAgICB+R3JGbXRQbmcoKTsKKworICAgIEdyRm10UmVhZGVyKiBOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgR3JGbXRXcml0ZXIqIE5ld1dyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBib29sIENoZWNrU2lnbmF0dXJlKCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKTsKK307CisKKyNlbmRpZgorCisjZW5kaWYvKl9HUkZNVF9QTkdfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcHhtLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3B4bS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxN2VhOAotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3B4bS5jcHAKQEAgLTAsMCArMSw1MTAgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImdyZm10X3B4bS5oIgorCisvLyBQP00gZmlsdGVyIGZhY3RvcnkKKworR3JGbXRQeE06OkdyRm10UHhNKCkKK3sKKyAgICBtX3NpZ25fbGVuID0gMzsKKyAgICBtX3NpZ25hdHVyZSA9ICIiOworICAgIG1fZGVzY3JpcHRpb24gPSAiUG9ydGFibGUgaW1hZ2UgZm9ybWF0ICgqLnBibTsqLnBnbTsqLnBwbTsqLnB4bTsqLnBubSkiOworfQorCisKK0dyRm10UHhNOjp+R3JGbXRQeE0oKQoreworfQorCisKK2Jvb2wgR3JGbXRQeE06OkNoZWNrU2lnbmF0dXJlKCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKQoreworICAgIHJldHVybiBzaWduYXR1cmVbMF0gPT0gJ1AnICYmCisgICAgICAgICAgICcxJyA8PSBzaWduYXR1cmVbMV0gJiYgc2lnbmF0dXJlWzFdIDw9ICc2JyAmJgorICAgICAgICAgICBpc3NwYWNlKHNpZ25hdHVyZVsyXSk7Cit9CisKKworR3JGbXRSZWFkZXIqIEdyRm10UHhNOjpOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10UHhNUmVhZGVyKCBmaWxlbmFtZSApOworfQorCisKK0dyRm10V3JpdGVyKiBHckZtdFB4TTo6TmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdFB4TVdyaXRlciggZmlsZW5hbWUgKTsKK30KKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIFA/TSByZWFkZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3N0YXRpYyBpbnQgUmVhZE51bWJlciggUkxCeXRlU3RyZWFtJiBzdHJtLCBpbnQgbWF4ZGlnaXRzICkKK3sKKyAgICBpbnQgY29kZTsKKyAgICBpbnQgdmFsID0gMDsKKyAgICBpbnQgZGlnaXRzID0gMDsKKworICAgIGNvZGUgPSBzdHJtLkdldEJ5dGUoKTsKKworICAgIGlmKCAhaXNkaWdpdChjb2RlKSkKKyAgICB7CisgICAgICAgIGRvCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBjb2RlID09ICcjJyApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBzdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd2hpbGUoIGNvZGUgIT0gJ1xuJyAmJiBjb2RlICE9ICdccicgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgY29kZSA9IHN0cm0uR2V0Qnl0ZSgpOworCisgICAgICAgICAgICB3aGlsZSggaXNzcGFjZShjb2RlKSkKKyAgICAgICAgICAgICAgICBjb2RlID0gc3RybS5HZXRCeXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUoICFpc2RpZ2l0KCBjb2RlICkpOworICAgIH0KKworICAgIGRvCisgICAgeworICAgICAgICB2YWwgPSB2YWwqMTAgKyBjb2RlIC0gJzAnOworICAgICAgICBpZiggKytkaWdpdHMgPj0gbWF4ZGlnaXRzICkgYnJlYWs7CisgICAgICAgIGNvZGUgPSBzdHJtLkdldEJ5dGUoKTsKKyAgICB9CisgICAgd2hpbGUoIGlzZGlnaXQoY29kZSkpOworCisgICAgcmV0dXJuIHZhbDsKK30KKworCitHckZtdFB4TVJlYWRlcjo6R3JGbXRQeE1SZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFJlYWRlciggZmlsZW5hbWUgKQoreworICAgIG1fb2Zmc2V0ID0gLTE7Cit9CisKKworR3JGbXRQeE1SZWFkZXI6On5HckZtdFB4TVJlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRQeE1SZWFkZXI6OkNsb3NlKCkKK3sKKyAgICBtX3N0cm0uQ2xvc2UoKTsKK30KKworCitib29sICBHckZtdFB4TVJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAKKyAgICBhc3NlcnQoIHN0cmxlbihtX2ZpbGVuYW1lKSAhPSAwICk7CisgICAgaWYoICFtX3N0cm0uT3BlbiggbV9maWxlbmFtZSApKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiggc2V0am1wKCBtX3N0cm0uSm1wQnVmKCkpID09IDAgKQorICAgIHsKKyAgICAgICAgaW50IGNvZGUgPSBtX3N0cm0uR2V0Qnl0ZSgpOworICAgICAgICBpZiggY29kZSAhPSAnUCcgKQorICAgICAgICAgICAgQkFEX0hFQURFUl9FUlIoKTsKKworICAgICAgICBjb2RlID0gbV9zdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgc3dpdGNoKCBjb2RlICkKKyAgICAgICAgeworICAgICAgICBjYXNlICcxJzogY2FzZSAnNCc6IG1fYnBwID0gMTsgYnJlYWs7CisgICAgICAgIGNhc2UgJzInOiBjYXNlICc1JzogbV9icHAgPSA4OyBicmVhazsKKyAgICAgICAgY2FzZSAnMyc6IGNhc2UgJzYnOiBtX2JwcCA9IDI0OyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogQkFEX0hFQURFUl9FUlIoKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbV9iaW5hcnkgPSBjb2RlID49ICc0JzsKKyAgICAgICAgbV9pc2NvbG9yID0gbV9icHAgPiA4OworCisgICAgICAgIG1fd2lkdGggPSBSZWFkTnVtYmVyKCBtX3N0cm0sIElOVF9NQVggKTsKKyAgICAgICAgbV9oZWlnaHQgPSBSZWFkTnVtYmVyKCBtX3N0cm0sIElOVF9NQVggKTsKKyAgICAgICAgCisgICAgICAgIG1fbWF4dmFsID0gbV9icHAgPT0gMSA/IDEgOiBSZWFkTnVtYmVyKCBtX3N0cm0sIElOVF9NQVggKTsKKyAgICAgICAgaWYoIG1fbWF4dmFsID4gNjU1MzUgKQorICAgICAgICAgICAgQkFEX0hFQURFUl9FUlIoKTsKKworICAgICAgICAvL2lmKCBtX21heHZhbCA+IDI1NSApIG1fYmluYXJ5ID0gZmFsc2U7IG5vbnNlbnNlCisgICAgICAgIGlmKCBtX21heHZhbCA+IDI1NSApCisgICAgICAgICAgICBtX2JpdF9kZXB0aCA9IDE2OworCisgICAgICAgIGlmKCBtX3dpZHRoID4gMCAmJiBtX2hlaWdodCA+IDAgJiYgbV9tYXh2YWwgPiAwICYmIG1fbWF4dmFsIDwgKDEgPDwgMTYpKSAKKyAgICAgICAgeworICAgICAgICAgICAgbV9vZmZzZXQgPSBtX3N0cm0uR2V0UG9zKCk7CisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICB9CitiYWRfaGVhZGVyX2V4aXQ6CisgICAgICAgIDsKKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgeworICAgICAgICBtX29mZnNldCA9IC0xOworICAgICAgICBtX3dpZHRoID0gbV9oZWlnaHQgPSAtMTsKKyAgICAgICAgbV9zdHJtLkNsb3NlKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworYm9vbCAgR3JGbXRQeE1SZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgY29uc3QgIGludCBidWZmZXJfc2l6ZSA9IDEgPDwgMTI7CisgICAgdWNoYXIgIGJ1ZmZlcltidWZmZXJfc2l6ZV07CisgICAgdWNoYXIgIHBhbF9idWZmZXJbYnVmZmVyX3NpemVdOworICAgIFBhbGV0dGVFbnRyeSBwYWxldHRlWzI1Nl07CisgICAgYm9vbCAgIHJlc3VsdCA9IGZhbHNlOworICAgIHVjaGFyKiBzcmMgPSBidWZmZXI7CisgICAgdWNoYXIqIGdyYXlfcGFsZXR0ZSA9IHBhbF9idWZmZXI7CisgICAgaW50ICBzcmNfcGl0Y2ggPSAobV93aWR0aCptX2JwcCptX2JpdF9kZXB0aC84ICsgNykvODsKKyAgICBpbnQgIG5jaCA9IG1faXNjb2xvciA/IDMgOiAxOworICAgIGludCAgd2lkdGgzID0gbV93aWR0aCpuY2g7CisgICAgaW50ICBpLCB4LCB5OworCisgICAgaWYoIG1fb2Zmc2V0IDwgMCB8fCAhbV9zdHJtLklzT3BlbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiggc3JjX3BpdGNoKzMyID4gYnVmZmVyX3NpemUgKQorICAgICAgICBzcmMgPSBuZXcgdWNoYXJbd2lkdGgzKm1fYml0X2RlcHRoLzggKyAzMl07CisKKyAgICAvLyBjcmVhdGUgTFVUIGZvciBjb252ZXJ0aW5nIGNvbG9ycworICAgIGlmKCBtX2JpdF9kZXB0aCA9PSA4ICkKKyAgICB7CisgICAgICAgIGlmKCBtX21heHZhbCArIDEgPiBidWZmZXJfc2l6ZSApCisgICAgICAgICAgICBncmF5X3BhbGV0dGUgPSBuZXcgdWNoYXJbbV9tYXh2YWwgKyAxXTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDw9IG1fbWF4dmFsOyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBncmF5X3BhbGV0dGVbaV0gPSAodWNoYXIpKChpKjI1NS9tX21heHZhbCleKG1fYnBwID09IDEgPyAyNTUgOiAwKSk7CisgICAgICAgIH0KKworICAgICAgICBGaWxsR3JheVBhbGV0dGUoIHBhbGV0dGUsIG1fYnBwPT0xID8gMSA6IDggLCBtX2JwcCA9PSAxICk7CisgICAgfQorCisgICAgaWYoIHNldGptcCggbV9zdHJtLkptcEJ1ZigpKSA9PSAwICkKKyAgICB7CisgICAgICAgIG1fc3RybS5TZXRQb3MoIG1fb2Zmc2V0ICk7CisgICAgICAgIAorICAgICAgICBzd2l0Y2goIG1fYnBwICkKKyAgICAgICAgeworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAxIEJQUCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIGlmKCAhbV9iaW5hcnkgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IG1fd2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeF0gPSBSZWFkTnVtYmVyKCBtX3N0cm0sIDEgKSAhPSAwOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsQ29sb3JSb3c4KCBkYXRhLCBzcmMsIG1fd2lkdGgsIHBhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsbEdyYXlSb3c4KCBkYXRhLCBzcmMsIG1fd2lkdGgsIGdyYXlfcGFsZXR0ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsQ29sb3JSb3cxKCBkYXRhLCBzcmMsIG1fd2lkdGgsIHBhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgRmlsbEdyYXlSb3cxKCBkYXRhLCBzcmMsIG1fd2lkdGgsIGdyYXlfcGFsZXR0ZSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyA4IEJQUCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKCAhbV9iaW5hcnkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHdpZHRoMzsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSBSZWFkTnVtYmVyKCBtX3N0cm0sIElOVF9NQVggKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpY29kZSA+ICh1bnNpZ25lZCltX21heHZhbCApIGNvZGUgPSBtX21heHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2JpdF9kZXB0aCA9PSA4ICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeF0gPSBncmF5X3BhbGV0dGVbY29kZV07CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1c2hvcnQgKilzcmMpW3hdID0gKHVzaG9ydCljb2RlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG1fYml0X2RlcHRoID09IDE2ICYmICFpc0JpZ0VuZGlhbigpICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHdpZHRoMzsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB2ID0gc3JjW3ggKiAyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNbeCAqIDJdID0gc3JjW3ggKiAyICsgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjW3ggKiAyICsgMV0gPSB2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYoICFtX25hdGl2ZV9kZXB0aCAmJiBtX2JpdF9kZXB0aCA9PSAxNiApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2lkdGgzOyB4KysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdiA9ICgodXNob3J0ICopc3JjKVt4XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t4XSA9ICh1Y2hhcikodiA+PiA4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKCBtX2JwcCA9PSA4ICkgLy8gaW1hZ2UgaGFzIG9uZSBjaGFubmVsCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggY29sb3IgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbV9iaXRfZGVwdGggPT0gOCB8fCAhbV9uYXRpdmVfZGVwdGggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIgKmQgPSBkYXRhLCAqcyA9IHNyYywgKmVuZCA9IHNyYyArIG1fd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCA7IHMgPCBlbmQ7IGQgKz0gMywgcysrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gZFsxXSA9IGRbMl0gPSAqczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0ICpkID0gKHVzaG9ydCAqKWRhdGEsICpzID0gKHVzaG9ydCAqKXNyYywgKmVuZCA9ICgodXNob3J0ICopc3JjKSArIG1fd2lkdGg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCA7IHMgPCBlbmQ7IHMrKywgZCArPSAzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkWzBdID0gZFsxXSA9IGRbMl0gPSAqczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKCBtX25hdGl2ZV9kZXB0aCApCisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoIGRhdGEsIHNyYywgbV93aWR0aCptX2JpdF9kZXB0aC84ICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweSggZGF0YSwgc3JjLCBtX3dpZHRoICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX2JpdF9kZXB0aCA9PSA4IHx8ICFtX25hdGl2ZV9kZXB0aCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X1JHQjJCR1JfOHVfQzNSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X1JHQjJCR1JfMTZ1X0MzUiggKHVzaG9ydCAqKXNyYywgMCwgKHVzaG9ydCAqKWRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggbV9iaXRfZGVwdGggPT0gOCB8fCAhbV9uYXRpdmVfZGVwdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjJHcmF5Xzh1X0MzQzFSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpLCAyICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1IyR3JheV8xNnVfQzNDMVIoICh1c2hvcnQgKilzcmMsIDAsICh1c2hvcnQgKilkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSwgMiApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzcmMgIT0gYnVmZmVyICkKKyAgICAgICAgZGVsZXRlW10gc3JjOyAKKworICAgIGlmKCBncmF5X3BhbGV0dGUgIT0gcGFsX2J1ZmZlciApCisgICAgICAgIGRlbGV0ZVtdIGdyYXlfcGFsZXR0ZTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyRm10UHhNV3JpdGVyOjpHckZtdFB4TVdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10V3JpdGVyKCBmaWxlbmFtZSApCit7Cit9CisKKworR3JGbXRQeE1Xcml0ZXI6On5HckZtdFB4TVdyaXRlcigpCit7Cit9CisKKworYm9vbCAgR3JGbXRQeE1Xcml0ZXI6OklzRm9ybWF0U3VwcG9ydGVkKCBpbnQgZGVwdGggKQoreworICAgIHJldHVybiBkZXB0aCA9PSBJUExfREVQVEhfOFUgfHwgZGVwdGggPT0gSVBMX0RFUFRIXzE2VTsKK30KKworCitib29sICBHckZtdFB4TVdyaXRlcjo6V3JpdGVJbWFnZSggY29uc3QgdWNoYXIqIGRhdGEsIGludCBzdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgX2NoYW5uZWxzICkKK3sKKyAgICBib29sIGlzQmluYXJ5ID0gdHJ1ZTsKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworCisgICAgaW50ICBjaGFubmVscyA9IF9jaGFubmVscyA+IDEgPyAzIDogMTsKKyAgICBpbnQgIGZpbGVTdGVwID0gd2lkdGgqY2hhbm5lbHMqKGRlcHRoLzgpOworICAgIGludCAgeCwgeTsKKworICAgIGFzc2VydCggZGF0YSAmJiB3aWR0aCA+IDAgJiYgaGVpZ2h0ID4gMCAmJiBzdGVwID49IGZpbGVTdGVwICk7CisgICAgCisgICAgaWYoIG1fc3RybS5PcGVuKCBtX2ZpbGVuYW1lICkgKQorICAgIHsKKyAgICAgICAgaW50ICBsaW5lTGVuZ3RoOworICAgICAgICBpbnQgIGJ1ZmZlclNpemUgPSAxMjg7IC8vIGJ1ZmZlciB0aGF0IHNob3VsZCBmaXQgYSBoZWFkZXIKKyAgICAgICAgY2hhciogYnVmZmVyID0gMDsKKworICAgICAgICBpZiggaXNCaW5hcnkgKQorICAgICAgICAgICAgbGluZUxlbmd0aCA9IGNoYW5uZWxzICogd2lkdGggKiBkZXB0aCAvIDg7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxpbmVMZW5ndGggPSAoNiAqIGNoYW5uZWxzICsgKGNoYW5uZWxzID4gMSA/IDIgOiAwKSkgKiB3aWR0aCArIDMyOworCisgICAgICAgIGlmKCBidWZmZXJTaXplIDwgbGluZUxlbmd0aCApCisgICAgICAgICAgICBidWZmZXJTaXplID0gbGluZUxlbmd0aDsKKworICAgICAgICBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKKyAgICAgICAgaWYoICFidWZmZXIgKQorICAgICAgICB7CisgICAgICAgICAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyaXRlIGhlYWRlcjsKKyAgICAgICAgc3ByaW50ZiggYnVmZmVyLCAiUCVjXG4lZCAlZFxuJWRcbiIsCisgICAgICAgICAgICAgICAgICcyJyArIChjaGFubmVscyA+IDEgPyAxIDogMCkgKyAoaXNCaW5hcnkgPyAzIDogMCksCisgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsICgxIDw8IGRlcHRoKSAtIDEgKTsKKworICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGJ1ZmZlciwgKGludClzdHJsZW4oYnVmZmVyKSApOworCisgICAgICAgIGZvciggeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIGlzQmluYXJ5ICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggX2NoYW5uZWxzID09IDMgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRlcHRoID09IDggKQorICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjJSR0JfOHVfQzNSKCAodWNoYXIqKWRhdGEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVjaGFyKilidWZmZXIsIDAsIGN2U2l6ZSh3aWR0aCwxKSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSMlJHQl8xNnVfQzNSKCAodXNob3J0KilkYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2hvcnQqKWJ1ZmZlciwgMCwgY3ZTaXplKHdpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gc3dhcCBlbmRpYW5uZXNzIGlmIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGlmKCBkZXB0aCA9PSAxNiAmJiAhaXNCaWdFbmRpYW4oKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggX2NoYW5uZWxzID09IDEgKQorICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCBidWZmZXIsIGRhdGEsIGZpbGVTdGVwICk7CisgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCB3aWR0aCpjaGFubmVscyoyOyB4ICs9IDIgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciB2ID0gYnVmZmVyW3hdOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW3hdID0gYnVmZmVyW3ggKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclt4ICsgMV0gPSB2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fc3RybS5QdXRCeXRlcyggKGNoYW5uZWxzID4gMSB8fCBkZXB0aCA+IDgpID8gYnVmZmVyIDogKGNoYXIqKWRhdGEsIGZpbGVTdGVwICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciogcHRyID0gYnVmZmVyOworCisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzID4gMSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZGVwdGggPT0gOCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCB3aWR0aCpjaGFubmVsczsgeCArPSBjaGFubmVscyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggcHRyLCAiJSA0ZCIsIGRhdGFbeCArIDJdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggcHRyLCAiJSA0ZCIsIGRhdGFbeCArIDFdICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggcHRyLCAiJSA0ZCIsIGRhdGFbeF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAnICc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cisrID0gJyAnOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCB4ID0gMDsgeCA8IHdpZHRoKmNoYW5uZWxzOyB4ICs9IGNoYW5uZWxzICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBwdHIsICIlIDZkIiwgKCh1c2hvcnQgKilkYXRhKVt4ICsgMl0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBwdHIsICIlIDZkIiwgKCh1c2hvcnQgKilkYXRhKVt4ICsgMV0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBwdHIsICIlIDZkIiwgKCh1c2hvcnQgKilkYXRhKVt4XSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICcgJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyKysgPSAnICc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGRlcHRoID09IDggKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIHggPSAwOyB4IDwgd2lkdGg7IHgrKyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggcHRyLCAiJSA0ZCIsIGRhdGFbeF0gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCB3aWR0aDsgeCsrICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCBwdHIsICIlIDZkIiwgKCh1c2hvcnQgKilkYXRhKVt4XSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciArPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgKnB0cisrID0gJ1xuJzsKKworICAgICAgICAgICAgICAgIG1fc3RybS5QdXRCeXRlcyggYnVmZmVyLCAoaW50KShwdHIgLSBidWZmZXIpICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlW10gYnVmZmVyOworICAgICAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcHhtLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9weG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmI5OGIwCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfcHhtLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9HUkZNVF9QeE1fSF8KKyNkZWZpbmUgX0dSRk1UX1B4TV9IXworCisjaW5jbHVkZSAiZ3JmbXRfYmFzZS5oIgorI2luY2x1ZGUgImJpdHN0cm0uaCIKKworCitjbGFzcyBHckZtdFB4TVJlYWRlciA6IHB1YmxpYyBHckZtdFJlYWRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10UHhNUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIH5HckZtdFB4TVJlYWRlcigpOworICAgIAorICAgIGJvb2wgIENoZWNrRm9ybWF0KCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKTsKKyAgICBib29sICBSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKTsKKyAgICBib29sICBSZWFkSGVhZGVyKCk7CisgICAgdm9pZCAgQ2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIAorICAgIFJMQnl0ZVN0cmVhbSAgICBtX3N0cm07CisgICAgUGFsZXR0ZUVudHJ5ICAgIG1fcGFsZXR0ZVsyNTZdOworICAgIGludCAgICAgICAgICAgICBtX2JwcDsKKyAgICBpbnQgICAgICAgICAgICAgbV9vZmZzZXQ7CisgICAgYm9vbCAgICAgICAgICAgIG1fYmluYXJ5OworICAgIGludCAgICAgICAgICAgICBtX21heHZhbDsKK307CisKKworY2xhc3MgR3JGbXRQeE1Xcml0ZXIgOiBwdWJsaWMgR3JGbXRXcml0ZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdFB4TVdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRQeE1Xcml0ZXIoKTsKKworICAgIGJvb2wgIElzRm9ybWF0U3VwcG9ydGVkKCBpbnQgZGVwdGggKTsKKworICAgIGJvb2wgIFdyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgaW50IGNoYW5uZWxzICk7Citwcm90ZWN0ZWQ6CisKKyAgICBXTEJ5dGVTdHJlYW0gIG1fc3RybTsKK307CisKKworLy8gUHhNIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdFB4TSA6IHB1YmxpYyBHckZtdEZpbHRlckZhY3RvcnkKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdFB4TSgpOworICAgIH5HckZtdFB4TSgpOworCisgICAgR3JGbXRSZWFkZXIqIE5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBHckZtdFdyaXRlciogTmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIGJvb2wgQ2hlY2tTaWduYXR1cmUoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApOworfTsKKworCisjZW5kaWYvKl9HUkZNVF9QeE1fSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfc3VucmFzLmNwcCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3N1bnJhcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY1YjAyZQotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3N1bnJhcy5jcHAKQEAgLTAsMCArMSw0NDIgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKyNpbmNsdWRlICJncmZtdF9zdW5yYXMuaCIKKworc3RhdGljIGNvbnN0IGNoYXIqIGZtdFNpZ25TdW5SYXMgPSAiXHg1OVx4QTZceDZBXHg5NSI7CisKKy8vIFN1biBSYXN0ZXIgZmlsdGVyIGZhY3RvcnkKKworR3JGbXRTdW5SYXN0ZXI6OkdyRm10U3VuUmFzdGVyKCkKK3sKKyAgICBtX3NpZ25fbGVuID0gNDsKKyAgICBtX3NpZ25hdHVyZSA9IGZtdFNpZ25TdW5SYXM7CisgICAgbV9kZXNjcmlwdGlvbiA9ICJTdW4gcmFzdGVyIGZpbGVzICgqLnNyOyoucmFzKSI7Cit9CisKKworR3JGbXRTdW5SYXN0ZXI6On5HckZtdFN1blJhc3RlcigpCit7Cit9CisKKworR3JGbXRSZWFkZXIqIEdyRm10U3VuUmFzdGVyOjpOZXdSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICByZXR1cm4gbmV3IEdyRm10U3VuUmFzdGVyUmVhZGVyKCBmaWxlbmFtZSApOworfQorCisKK0dyRm10V3JpdGVyKiBHckZtdFN1blJhc3Rlcjo6TmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdFN1blJhc3RlcldyaXRlciggZmlsZW5hbWUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqIFN1biBSYXN0ZXIgcmVhZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHckZtdFN1blJhc3RlclJlYWRlcjo6R3JGbXRTdW5SYXN0ZXJSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFJlYWRlciggZmlsZW5hbWUgKQoreworICAgIG1fb2Zmc2V0ID0gLTE7Cit9CisKKworR3JGbXRTdW5SYXN0ZXJSZWFkZXI6On5HckZtdFN1blJhc3RlclJlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRTdW5SYXN0ZXJSZWFkZXI6OkNsb3NlKCkKK3sKKyAgICBtX3N0cm0uQ2xvc2UoKTsKK30KKworCitib29sICBHckZtdFN1blJhc3RlclJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICAKKyAgICBhc3NlcnQoIHN0cmxlbihtX2ZpbGVuYW1lKSAhPSAwICk7CisgICAgaWYoICFtX3N0cm0uT3BlbiggbV9maWxlbmFtZSApKSByZXR1cm4gZmFsc2U7CisKKyAgICBpZiggc2V0am1wKCBtX3N0cm0uSm1wQnVmKCkpID09IDAgKQorICAgIHsKKyAgICAgICAgbV9zdHJtLlNraXAoIDQgKTsKKyAgICAgICAgbV93aWR0aCAgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgbV9oZWlnaHQgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgbV9icHAgICAgPSBtX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgaW50IHBhbFNpemUgPSAzKigxIDw8IG1fYnBwKTsKKworICAgICAgICBtX3N0cm0uU2tpcCggNCApOworICAgICAgICBtX3R5cGUgICA9IChTdW5SYXNUeXBlKW1fc3RybS5HZXREV29yZCgpOworICAgICAgICBtX21hcHR5cGUgPSAoU3VuUmFzTWFwVHlwZSltX3N0cm0uR2V0RFdvcmQoKTsKKyAgICAgICAgbV9tYXBsZW5ndGggPSBtX3N0cm0uR2V0RFdvcmQoKTsKKworICAgICAgICBpZiggbV93aWR0aCA+IDAgJiYgbV9oZWlnaHQgPiAwICYmCisgICAgICAgICAgICAobV9icHAgPT0gMSB8fCBtX2JwcCA9PSA4IHx8IG1fYnBwID09IDI0IHx8IG1fYnBwID09IDMyKSAmJgorICAgICAgICAgICAgKG1fdHlwZSA9PSBSQVNfT0xEIHx8IG1fdHlwZSA9PSBSQVNfU1RBTkRBUkQgfHwKKyAgICAgICAgICAgICAobV90eXBlID09IFJBU19CWVRFX0VOQ09ERUQgJiYgbV9icHAgPT0gOCkgfHwgbV90eXBlID09IFJBU19GT1JNQVRfUkdCKSAmJgorICAgICAgICAgICAgKG1fbWFwdHlwZSA9PSBSTVRfTk9ORSAmJiBtX21hcGxlbmd0aCA9PSAwIHx8CisgICAgICAgICAgICAgbV9tYXB0eXBlID09IFJNVF9FUVVBTF9SR0IgJiYgbV9tYXBsZW5ndGggPD0gcGFsU2l6ZSAmJiBtX2JwcCA8PSA4KSkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtc2V0KCBtX3BhbGV0dGUsIDAsIHNpemVvZihtX3BhbGV0dGUpKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYoIG1fbWFwbGVuZ3RoICE9IDAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGludCByZWFkZWQ7CisgICAgICAgICAgICAgICAgdWNoYXIgYnVmZmVyWzI1NiozXTsKKworICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggYnVmZmVyLCBtX21hcGxlbmd0aCwgJnJlYWRlZCApOworICAgICAgICAgICAgICAgIGlmKCByZWFkZWQgPT0gbV9tYXBsZW5ndGggKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIHBhbFNpemUgPSBtX21hcGxlbmd0aC8zOworCisgICAgICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBwYWxTaXplOyBpKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3BhbGV0dGVbaV0uYiA9IGJ1ZmZlcltpICsgMipwYWxTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtpXS5nID0gYnVmZmVyW2kgKyBwYWxTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtpXS5yID0gYnVmZmVyW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgbV9wYWxldHRlW2ldLmEgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbV9pc2NvbG9yID0gSXNDb2xvclBhbGV0dGUoIG1fcGFsZXR0ZSwgbV9icHAgKTsKKyAgICAgICAgICAgICAgICAgICAgbV9vZmZzZXQgPSBtX3N0cm0uR2V0UG9zKCk7CisKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KCBtX29mZnNldCA9PSAzMiArIG1fbWFwbGVuZ3RoICk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1faXNjb2xvciA9IG1fYnBwID4gODsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggIW1faXNjb2xvciApCisgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5UGFsZXR0ZSggbV9wYWxldHRlLCBtX2JwcCApOworCisgICAgICAgICAgICAgICAgbV9vZmZzZXQgPSBtX3N0cm0uR2V0UG9zKCk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnQoIG1fb2Zmc2V0ID09IDMyICsgbV9tYXBsZW5ndGggKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYoICFyZXN1bHQgKQorICAgIHsKKyAgICAgICAgbV9vZmZzZXQgPSAtMTsKKyAgICAgICAgbV93aWR0aCA9IG1faGVpZ2h0ID0gLTE7CisgICAgICAgIG1fc3RybS5DbG9zZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgIEdyRm10U3VuUmFzdGVyUmVhZGVyOjpSZWFkRGF0YSggdWNoYXIqIGRhdGEsIGludCBzdGVwLCBpbnQgY29sb3IgKQoreworICAgIGNvbnN0ICBpbnQgYnVmZmVyX3NpemUgPSAxIDw8IDEyOworICAgIHVjaGFyICBidWZmZXJbYnVmZmVyX3NpemVdOworICAgIHVjaGFyICBiZ3JfYnVmZmVyW2J1ZmZlcl9zaXplXTsKKyAgICB1Y2hhciAgZ3JheV9wYWxldHRlWzI1Nl07CisgICAgYm9vbCAgIHJlc3VsdCA9IGZhbHNlOworICAgIHVjaGFyKiBzcmMgPSBidWZmZXI7CisgICAgdWNoYXIqIGJnciA9IGJncl9idWZmZXI7CisgICAgaW50ICBzcmNfcGl0Y2ggPSAoKG1fd2lkdGgqbV9icHAgKyA3KS84ICsgMSkgJiAtMjsKKyAgICBpbnQgIG5jaCA9IGNvbG9yID8gMyA6IDE7CisgICAgaW50ICB3aWR0aDMgPSBtX3dpZHRoKm5jaDsKKyAgICBpbnQgIHk7CisKKyAgICBpZiggbV9vZmZzZXQgPCAwIHx8ICFtX3N0cm0uSXNPcGVuZWQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIGlmKCBzcmNfcGl0Y2grMzIgPiBidWZmZXJfc2l6ZSApCisgICAgICAgIHNyYyA9IG5ldyB1Y2hhcltzcmNfcGl0Y2grMzJdOworCisgICAgaWYoIG1fd2lkdGgqMyArIDMyID4gYnVmZmVyX3NpemUgKQorICAgICAgICBiZ3IgPSBuZXcgdWNoYXJbbV93aWR0aCozICsgMzJdOworCisgICAgaWYoICFjb2xvciAmJiBtX21hcHR5cGUgPT0gUk1UX0VRVUFMX1JHQiApCisgICAgICAgIEN2dFBhbGV0dGVUb0dyYXkoIG1fcGFsZXR0ZSwgZ3JheV9wYWxldHRlLCAxIDw8IG1fYnBwICk7CisKKyAgICBpZiggc2V0am1wKCBtX3N0cm0uSm1wQnVmKCkpID09IDAgKQorICAgIHsKKyAgICAgICAgbV9zdHJtLlNldFBvcyggbV9vZmZzZXQgKTsKKyAgICAgICAgCisgICAgICAgIHN3aXRjaCggbV9icHAgKQorICAgICAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqIDEgQlBQICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgaWYoIG1fdHlwZSAhPSBSQVNfQllURV9FTkNPREVEICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggc3JjLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxDb2xvclJvdzEoIGRhdGEsIHNyYywgbV93aWR0aCwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5Um93MSggZGF0YSwgc3JjLCBtX3dpZHRoLCBncmF5X3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1Y2hhciogbGluZV9lbmQgPSBzcmMgKyAobV93aWR0aCptX2JwcCArIDcpLzg7CisgICAgICAgICAgICAgICAgdWNoYXIqIHRzcmMgPSBzcmM7CisgICAgICAgICAgICAgICAgeSA9IDA7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBmb3IoOzspCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2NvdW50ID0gKGludCkobGluZV9lbmQgLSB0c3JjKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUgPSAwLCBsZW4gPSAwLCBsZW4xID0gMDsKKworICAgICAgICAgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gbV9zdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2RlID09IDB4ODAgKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IG1fc3RybS5HZXRCeXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxlbiAhPSAwICkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0c3JjW2xlbjFdID0gKHVjaGFyKWNvZGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoICsrbGVuMSA8IG1heF9jb3VudCApOworCisgICAgICAgICAgICAgICAgICAgIHRzcmMgKz0gbGVuMTsKKworICAgICAgICAgICAgICAgICAgICBpZiggbGVuID4gMCApIC8vIGVuY29kZWQgbW9kZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBtX3N0cm0uR2V0Qnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGxlbiA+IGxpbmVfZW5kIC0gdHNyYyApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2RlY29kaW5nXzFicHA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldCggdHNyYywgY29kZSwgbGVuICk7CisgICAgICAgICAgICAgICAgICAgICAgICB0c3JjICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCB0c3JjID49IGxpbmVfZW5kICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHNyYyA9IHNyYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbENvbG9yUm93MSggZGF0YSwgc3JjLCBtX3dpZHRoLCBtX3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsR3JheVJvdzEoIGRhdGEsIHNyYywgbV93aWR0aCwgZ3JheV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKyt5ID49IG1faGVpZ2h0ICkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKK2JhZF9kZWNvZGluZ18xYnBwOgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiA4IEJQUCAqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIGlmKCBtX3R5cGUgIT0gUkFTX0JZVEVfRU5DT0RFRCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX3N0cm0uR2V0Qnl0ZXMoIHNyYywgc3JjX3BpdGNoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsQ29sb3JSb3c4KCBkYXRhLCBzcmMsIG1fd2lkdGgsIG1fcGFsZXR0ZSApOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBGaWxsR3JheVJvdzgoIGRhdGEsIHNyYywgbV93aWR0aCwgZ3JheV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIC8vIFJMRS1lbmNvZGVkCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWNoYXIqIGxpbmVfZW5kID0gZGF0YSArIHdpZHRoMzsKKyAgICAgICAgICAgICAgICB5ID0gMDsKKworICAgICAgICAgICAgICAgIGZvcig7OykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfY291bnQgPSAoaW50KShsaW5lX2VuZCAtIGRhdGEpOworICAgICAgICAgICAgICAgICAgICBpbnQgY29kZSA9IDAsIGxlbiA9IDAsIGxlbjE7CisgICAgICAgICAgICAgICAgICAgIHVjaGFyKiB0c3JjID0gc3JjOworCisgICAgICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgPSBtX3N0cm0uR2V0Qnl0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvZGUgPT0gMHg4MCApCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gbV9zdHJtLkdldEJ5dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbGVuICE9IDAgKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICp0c3JjKysgPSAodWNoYXIpY29kZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aGlsZSggKG1heF9jb3VudCAtPSBuY2gpID4gMCApOworCisgICAgICAgICAgICAgICAgICAgIGxlbjEgPSAoaW50KSh0c3JjIC0gc3JjKTsKKworICAgICAgICAgICAgICAgICAgICBpZiggbGVuMSA+IDAgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY29sb3IgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxDb2xvclJvdzgoIGRhdGEsIHNyYywgbGVuMSwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbEdyYXlSb3c4KCBkYXRhLCBzcmMsIGxlbjEsIGdyYXlfcGFsZXR0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArPSBsZW4xKm5jaDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmKCBsZW4gPiAwICkgLy8gZW5jb2RlZCBtb2RlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbiA9IChsZW4gKyAxKSpuY2g7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlID0gbV9zdHJtLkdldEJ5dGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gRmlsbFVuaUNvbG9yKCBkYXRhLCBsaW5lX2VuZCwgc3RlcCwgd2lkdGgzLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtX2hlaWdodCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGFsZXR0ZVtjb2RlXSApOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGaWxsVW5pR3JheSggZGF0YSwgbGluZV9lbmQsIHN0ZXAsIHdpZHRoMywgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5LCBtX2hlaWdodCwgbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JheV9wYWxldHRlW2NvZGVdICk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggeSA+PSBtX2hlaWdodCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiggZGF0YSA9PSBsaW5lX2VuZCApCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBtX3N0cm0uR2V0Qnl0ZSgpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2RlY29kaW5nX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVfZW5kICs9IHN0ZXA7CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gbGluZV9lbmQgLSB3aWR0aDM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKyt5ID49IG1faGVpZ2h0ICkgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworYmFkX2RlY29kaW5nX2VuZDoKKyAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKiogMjQgQlBQICoqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgICAgIGZvciggeSA9IDA7IHkgPCBtX2hlaWdodDsgeSsrLCBkYXRhICs9IHN0ZXAgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fc3RybS5HZXRCeXRlcyggY29sb3IgPyBkYXRhIDogYmdyLCBzcmNfcGl0Y2ggKTsKKworICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggbV90eXBlID09IFJBU19GT1JNQVRfUkdCICkKKyAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9SR0IyQkdSXzh1X0MzUiggZGF0YSwgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjJHcmF5Xzh1X0MzQzFSKCBiZ3IsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdHlwZSA9PSBSQVNfRk9STUFUX1JHQiA/IDIgOiAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiAzMiBCUFAgKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgZm9yKCB5ID0gMDsgeSA8IG1faGVpZ2h0OyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogaGFjazogYTAgYjAgZzAgcjAgYTEgYjEgZzEgcjEgLi4uIGFyZSB3cml0dGVuIHRvIHNyYyArIDMsCisgICAgICAgICAgICAgICAgICAgc28gd2hlbiB3ZSBsb29rIGF0IHNyYyArIDQsIHdlIHNlZSBiMCBnMCByMCB4IGIxIGcxIGcxIHggLi4uICovCisgICAgICAgICAgICAgICAgbV9zdHJtLkdldEJ5dGVzKCBzcmMgKyAzLCBzcmNfcGl0Y2ggKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBpZiggY29sb3IgKQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJCR1JfOHVfQzRDM1IoIHNyYyArIDQsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdHlwZSA9PSBSQVNfRk9STUFUX1JHQiA/IDIgOiAwICk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJHcmF5Xzh1X0M0QzFSKCBzcmMgKyA0LCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90eXBlID09IFJBU19GT1JNQVRfUkdCID8gMiA6IDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGFzc2VydCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzcmMgIT0gYnVmZmVyICkgZGVsZXRlW10gc3JjOyAKKyAgICBpZiggYmdyICE9IGJncl9idWZmZXIgKSBkZWxldGVbXSBiZ3I7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitHckZtdFN1blJhc3RlcldyaXRlcjo6R3JGbXRTdW5SYXN0ZXJXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFdyaXRlciggZmlsZW5hbWUgKQoreworfQorCisKK0dyRm10U3VuUmFzdGVyV3JpdGVyOjp+R3JGbXRTdW5SYXN0ZXJXcml0ZXIoKQoreworfQorCisKK2Jvb2wgIEdyRm10U3VuUmFzdGVyV3JpdGVyOjpXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgLypkZXB0aCovLCBpbnQgY2hhbm5lbHMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgaW50ICBmaWxlU3RlcCA9ICh3aWR0aCpjaGFubmVscyArIDEpICYgLTI7CisgICAgaW50ICB5OworCisgICAgYXNzZXJ0KCBkYXRhICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwICYmIHN0ZXAgPj0gZmlsZVN0ZXApOworICAgIAorICAgIGlmKCBtX3N0cm0uT3BlbiggbV9maWxlbmFtZSApICkKKyAgICB7CisgICAgICAgIG1fc3RybS5QdXRCeXRlcyggZm10U2lnblN1blJhcywgKGludClzdHJsZW4oZm10U2lnblN1blJhcykgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCB3aWR0aCApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIGhlaWdodCApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIGNoYW5uZWxzKjggKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBmaWxlU3RlcCpoZWlnaHQgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBSQVNfU1RBTkRBUkQgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBSTVRfTk9ORSApOworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIDAgKTsKKworICAgICAgICBmb3IoIHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGRhdGEsIGZpbGVTdGVwICk7CisgICAgICAgIAorICAgICAgICBtX3N0cm0uQ2xvc2UoKTsKKyAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfc3VucmFzLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF9zdW5yYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDYwNjA4Ci0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfc3VucmFzLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9HUkZNVF9TVU5SQVNfSF8KKyNkZWZpbmUgX0dSRk1UX1NVTlJBU19IXworCisjaW5jbHVkZSAiZ3JmbXRfYmFzZS5oIgorCitlbnVtIFN1blJhc1R5cGUKK3sKKyAgICBSQVNfT0xEID0gMCwKKyAgICBSQVNfU1RBTkRBUkQgPSAxLAorICAgIFJBU19CWVRFX0VOQ09ERUQgPSAyLCAvKiBSTEUgZW5jb2RlZCAqLworICAgIFJBU19GT1JNQVRfUkdCID0gMyAgICAvKiBSR0IgaW5zdGVhZCBvZiBCR1IgKi8KK307CisKK2VudW0gU3VuUmFzTWFwVHlwZQoreworICAgIFJNVF9OT05FID0gMCwgICAgICAgLyogZGlyZWN0IGNvbG9yIGVuY29kaW5nICovCisgICAgUk1UX0VRVUFMX1JHQiA9IDEgICAvKiBwYWxldHRlZCBpbWFnZSAqLworfTsKKworCisvLyBTdW4gUmFzdGVyIFJlYWRlcgorY2xhc3MgR3JGbXRTdW5SYXN0ZXJSZWFkZXIgOiBwdWJsaWMgR3JGbXRSZWFkZXIKK3sKK3B1YmxpYzoKKworICAgIEdyRm10U3VuUmFzdGVyUmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIH5HckZtdFN1blJhc3RlclJlYWRlcigpOworCisgICAgYm9vbCAgUmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICk7CisgICAgYm9vbCAgUmVhZEhlYWRlcigpOworICAgIHZvaWQgIENsb3NlKCk7CisKK3Byb3RlY3RlZDoKKyAgICAKKyAgICBSTUJ5dGVTdHJlYW0gICAgbV9zdHJtOworICAgIFBhbGV0dGVFbnRyeSAgICBtX3BhbGV0dGVbMjU2XTsKKyAgICBpbnQgICAgICAgICAgICAgbV9icHA7CisgICAgaW50ICAgICAgICAgICAgIG1fb2Zmc2V0OworICAgIFN1blJhc1R5cGUgICAgICBtX3R5cGU7CisgICAgU3VuUmFzTWFwVHlwZSAgIG1fbWFwdHlwZTsKKyAgICBpbnQgICAgICAgICAgICAgbV9tYXBsZW5ndGg7Cit9OworCisKK2NsYXNzIEdyRm10U3VuUmFzdGVyV3JpdGVyIDogcHVibGljIEdyRm10V3JpdGVyCit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRTdW5SYXN0ZXJXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10U3VuUmFzdGVyV3JpdGVyKCk7CisKKyAgICBib29sICBXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApOworcHJvdGVjdGVkOgorCisgICAgV01CeXRlU3RyZWFtICBtX3N0cm07Cit9OworCisKKy8vIC4uLiBhbmQgZmlsdGVyIGZhY3RvcnkKK2NsYXNzIEdyRm10U3VuUmFzdGVyIDogcHVibGljIEdyRm10RmlsdGVyRmFjdG9yeQoreworcHVibGljOgorICAgIAorICAgIEdyRm10U3VuUmFzdGVyKCk7CisgICAgfkdyRm10U3VuUmFzdGVyKCk7CisKKyAgICBHckZtdFJlYWRlciogTmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIEdyRm10V3JpdGVyKiBOZXdXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7Cit9OworCisjZW5kaWYvKl9HUkZNVF9TVU5SQVNfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfdGlmZi5jcHAgYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF90aWZmLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjljYzMwCi0tLSAvZGV2L251bGwKKysrIGIvb3RoZXJsaWJzL2hpZ2hndWkvZ3JmbXRfdGlmZi5jcHAKQEAgLTAsMCArMSw4MjYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyAgICBBIHBhcnQgb2YgdGhlIGZpbGUgaW1wbGVtZW50cyBUSUZGIHJlYWRlciBvbiBiYXNlIG9mIGxpYnRpZmYgbGlicmFyeQorICAgIChzZWUgb3RoZXJsaWJzL19ncmFwaGljcy9yZWFkbWUudHh0IGZvciBjb3B5cmlnaHQgbm90aWNlKQorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJfaGlnaGd1aS5oIgorI2luY2x1ZGUgImdyZm10X3RpZmYuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgZm10U2lnblRpZmZJSVtdID0gIklJXHgyYVx4MDAiOworc3RhdGljIGNvbnN0IGNoYXIgZm10U2lnblRpZmZNTVtdID0gIk1NXHgwMFx4MmEiOworCitHckZtdFRpZmY6OkdyRm10VGlmZigpCit7CisgICAgbV9zaWduX2xlbiA9IDQ7CisgICAgbV9zaWduYXR1cmUgPSAiIjsKKyAgICBtX2Rlc2NyaXB0aW9uID0gIlRJRkYgRmlsZXMgKCoudGlmZjsqLnRpZikiOworfQorCitHckZtdFRpZmY6On5HckZtdFRpZmYoKQoreworfQorCitib29sIEdyRm10VGlmZjo6Q2hlY2tTaWduYXR1cmUoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApCit7CisgICAgcmV0dXJuIG1lbWNtcCggc2lnbmF0dXJlLCBmbXRTaWduVGlmZklJLCA0ICkgPT0gMCB8fAorICAgICAgICAgICBtZW1jbXAoIHNpZ25hdHVyZSwgZm10U2lnblRpZmZNTSwgNCApID09IDA7Cit9CisKKworR3JGbXRSZWFkZXIqIEdyRm10VGlmZjo6TmV3UmVhZGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdFRpZmZSZWFkZXIoIGZpbGVuYW1lICk7Cit9CisKKworR3JGbXRXcml0ZXIqIEdyRm10VGlmZjo6TmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgcmV0dXJuIG5ldyBHckZtdFRpZmZXcml0ZXIoIGZpbGVuYW1lICk7Cit9CisKKworI2lmZGVmIEhBVkVfVElGRgorCisjaW5jbHVkZSAidGlmZi5oIgorI2luY2x1ZGUgInRpZmZpby5oIgorCitzdGF0aWMgaW50IGdyZm10X3RpZmZfZXJyX2hhbmRsZXJfaW5pdCA9IDA7CisKK3N0YXRpYyB2b2lkIEdyRm10U2lsZW50VElGRkVycm9ySGFuZGxlciggY29uc3QgY2hhciosIGNvbnN0IGNoYXIqLCB2YV9saXN0ICkge30KKworR3JGbXRUaWZmUmVhZGVyOjpHckZtdFRpZmZSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgOiBHckZtdFJlYWRlciggZmlsZW5hbWUgKQoreworICAgIG1fdGlmID0gMDsKKworICAgIGlmKCAhZ3JmbXRfdGlmZl9lcnJfaGFuZGxlcl9pbml0ICkKKyAgICB7CisgICAgICAgIGdyZm10X3RpZmZfZXJyX2hhbmRsZXJfaW5pdCA9IDE7CisKKyAgICAgICAgVElGRlNldEVycm9ySGFuZGxlciggR3JGbXRTaWxlbnRUSUZGRXJyb3JIYW5kbGVyICk7CisgICAgICAgIFRJRkZTZXRXYXJuaW5nSGFuZGxlciggR3JGbXRTaWxlbnRUSUZGRXJyb3JIYW5kbGVyICk7CisgICAgfQorfQorCisKK0dyRm10VGlmZlJlYWRlcjo6fkdyRm10VGlmZlJlYWRlcigpCit7Cit9CisKKwordm9pZCAgR3JGbXRUaWZmUmVhZGVyOjpDbG9zZSgpCit7CisgICAgaWYoIG1fdGlmICkKKyAgICB7CisgICAgICAgIFRJRkYqIHRpZiA9IChUSUZGKiltX3RpZjsKKyAgICAgICAgVElGRkNsb3NlKCB0aWYgKTsKKyAgICAgICAgbV90aWYgPSAwOworICAgIH0KK30KKworCitib29sICBHckZtdFRpZmZSZWFkZXI6OkNoZWNrRm9ybWF0KCBjb25zdCBjaGFyKiBzaWduYXR1cmUgKQoreworICAgIHJldHVybiBtZW1jbXAoIHNpZ25hdHVyZSwgZm10U2lnblRpZmZJSSwgNCApID09IDAgfHwKKyAgICAgICAgICAgbWVtY21wKCBzaWduYXR1cmUsIGZtdFNpZ25UaWZmTU0sIDQgKSA9PSAwOworfQorCisKK2Jvb2wgIEdyRm10VGlmZlJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgY2hhciBlcnJtc2dbMTAyNF07CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKworICAgIENsb3NlKCk7CisgICAgVElGRiogdGlmID0gVElGRk9wZW4oIG1fZmlsZW5hbWUsICJyIiApOworCisgICAgaWYoIHRpZiApCisgICAgeworICAgICAgICBpbnQgd2lkdGggPSAwLCBoZWlnaHQgPSAwLCBwaG90b21ldHJpYyA9IDAsIGNvbXByZXNzaW9uID0gMDsKKyAgICAgICAgbV90aWYgPSB0aWY7CisKKyAgICAgICAgaWYoIFRJRkZSR0JBSW1hZ2VPSyggdGlmLCBlcnJtc2cgKSAmJgorICAgICAgICAgICAgVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfSU1BR0VXSURUSCwgJndpZHRoICkgJiYKKyAgICAgICAgICAgIFRJRkZHZXRGaWVsZCggdGlmLCBUSUZGVEFHX0lNQUdFTEVOR1RILCAmaGVpZ2h0ICkgJiYKKyAgICAgICAgICAgIFRJRkZHZXRGaWVsZCggdGlmLCBUSUZGVEFHX1BIT1RPTUVUUklDLCAmcGhvdG9tZXRyaWMgKSAmJiAKKyAgICAgICAgICAgICghVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfQ09NUFJFU1NJT04sICZjb21wcmVzc2lvbiApIHx8CisgICAgICAgICAgICAoY29tcHJlc3Npb24gIT0gQ09NUFJFU1NJT05fTFpXICYmCisgICAgICAgICAgICAgY29tcHJlc3Npb24gIT0gQ09NUFJFU1NJT05fT0pQRUcpKSkKKyAgICAgICAgeworICAgICAgICAgICAgbV93aWR0aCA9IHdpZHRoOworICAgICAgICAgICAgbV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBtX2lzY29sb3IgPSBwaG90b21ldHJpYyA+IDE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgICAgIENsb3NlKCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK2Jvb2wgIEdyRm10VGlmZlJlYWRlcjo6UmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICkKK3sKKyAgICBib29sIHJlc3VsdCA9IGZhbHNlOworICAgIHVjaGFyKiBidWZmZXIgPSAwOworCisgICAgY29sb3IgPSBjb2xvciA+IDAgfHwgKGNvbG9yIDwgMCAmJiBtX2lzY29sb3IpOworCisgICAgaWYoIG1fdGlmICYmIG1fd2lkdGggJiYgbV9oZWlnaHQgKQorICAgIHsKKyAgICAgICAgVElGRiogdGlmID0gKFRJRkYqKW1fdGlmOworICAgICAgICBpbnQgdGlsZV93aWR0aDAgPSBtX3dpZHRoLCB0aWxlX2hlaWdodDAgPSAwOworICAgICAgICBpbnQgeCwgeSwgaTsKKyAgICAgICAgaW50IGlzX3RpbGVkID0gVElGRklzVGlsZWQodGlmKTsKKyAgICAgICAgCisgICAgICAgIGlmKCAhaXNfdGlsZWQgJiYKKyAgICAgICAgICAgIFRJRkZHZXRGaWVsZCggdGlmLCBUSUZGVEFHX1JPV1NQRVJTVFJJUCwgJnRpbGVfaGVpZ2h0MCApIHx8CisgICAgICAgICAgICBpc190aWxlZCAmJgorICAgICAgICAgICAgVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRVdJRFRILCAmdGlsZV93aWR0aDAgKSAmJgorICAgICAgICAgICAgVElGRkdldEZpZWxkKCB0aWYsIFRJRkZUQUdfVElMRUxFTkdUSCwgJnRpbGVfaGVpZ2h0MCApKQorICAgICAgICB7CisgICAgICAgICAgICBpZiggdGlsZV93aWR0aDAgPD0gMCApCisgICAgICAgICAgICAgICAgdGlsZV93aWR0aDAgPSBtX3dpZHRoOworCisgICAgICAgICAgICBpZiggdGlsZV9oZWlnaHQwIDw9IDAgKQorICAgICAgICAgICAgICAgIHRpbGVfaGVpZ2h0MCA9IG1faGVpZ2h0OworICAgICAgICAgICAgCisgICAgICAgICAgICBidWZmZXIgPSBuZXcgdWNoYXJbdGlsZV9oZWlnaHQwKnRpbGVfd2lkdGgwKjRdOworCisgICAgICAgICAgICBmb3IoIHkgPSAwOyB5IDwgbV9oZWlnaHQ7IHkgKz0gdGlsZV9oZWlnaHQwLCBkYXRhICs9IHN0ZXAqdGlsZV9oZWlnaHQwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgdGlsZV9oZWlnaHQgPSB0aWxlX2hlaWdodDA7CisKKyAgICAgICAgICAgICAgICBpZiggeSArIHRpbGVfaGVpZ2h0ID4gbV9oZWlnaHQgKQorICAgICAgICAgICAgICAgICAgICB0aWxlX2hlaWdodCA9IG1faGVpZ2h0IC0geTsKKworICAgICAgICAgICAgICAgIGZvciggeCA9IDA7IHggPCBtX3dpZHRoOyB4ICs9IHRpbGVfd2lkdGgwICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB0aWxlX3dpZHRoID0gdGlsZV93aWR0aDAsIG9rOworCisgICAgICAgICAgICAgICAgICAgIGlmKCB4ICsgdGlsZV93aWR0aCA+IG1fd2lkdGggKQorICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV93aWR0aCA9IG1fd2lkdGggLSB4OworCisgICAgICAgICAgICAgICAgICAgIGlmKCAhaXNfdGlsZWQgKQorICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBUSUZGUmVhZFJHQkFTdHJpcCggdGlmLCB5LCAodWludDMyKilidWZmZXIgKTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBUSUZGUmVhZFJHQkFUaWxlKCB0aWYsIHgsIHksICh1aW50MzIqKWJ1ZmZlciApOworCisgICAgICAgICAgICAgICAgICAgIGlmKCAhb2sgKQorICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0X2Z1bmM7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IHRpbGVfaGVpZ2h0OyBpKysgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGNvbG9yICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJCR1JfOHVfQzRDM1IoIGJ1ZmZlciArIGkqdGlsZV93aWR0aCo0LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSArIHgqMyArIHN0ZXAqKHRpbGVfaGVpZ2h0IC0gaSAtIDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZTaXplKHRpbGVfd2lkdGgsMSksIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3ZDdnRfQkdSQTJHcmF5Xzh1X0M0QzFSKCBidWZmZXIgKyBpKnRpbGVfd2lkdGgqNCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhICsgeCArIHN0ZXAqKHRpbGVfaGVpZ2h0IC0gaSAtIDEpLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN2U2l6ZSh0aWxlX3dpZHRoLDEpLCAyICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCitleGl0X2Z1bmM6CisKKyAgICBDbG9zZSgpOworICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBjb25zdCBpbnQgIHRpZmZNYXNrW10gPSB7IDB4ZmYsIDB4ZmYsIDB4ZmZmZmZmZmYsIDB4ZmZmZiwgMHhmZmZmZmZmZiB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqIFRJRkYgcmVhZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitHckZtdFRpZmZSZWFkZXI6OkdyRm10VGlmZlJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSA6IEdyRm10UmVhZGVyKCBmaWxlbmFtZSApCit7CisgICAgbV9vZmZzZXRzID0gMDsKKyAgICBtX21heG9mZnNldHMgPSAwOworICAgIG1fc3RyaXBzID0gLTE7CisgICAgbV9tYXhfcGFsX2xlbmd0aCA9IDA7CisgICAgbV90ZW1wX3BhbGV0dGUgPSAwOworfQorCisKK0dyRm10VGlmZlJlYWRlcjo6fkdyRm10VGlmZlJlYWRlcigpCit7CisgICAgQ2xvc2UoKTsKKworICAgIGRlbGV0ZVtdIG1fb2Zmc2V0czsKKyAgICBkZWxldGVbXSBtX3RlbXBfcGFsZXR0ZTsKK30KKwordm9pZCAgR3JGbXRUaWZmUmVhZGVyOjpDbG9zZSgpCit7CisgICAgbV9zdHJtLkNsb3NlKCk7Cit9CisKKworYm9vbCAgR3JGbXRUaWZmUmVhZGVyOjpDaGVja0Zvcm1hdCggY29uc3QgY2hhciogc2lnbmF0dXJlICkKK3sKKyAgICByZXR1cm4gbWVtY21wKCBzaWduYXR1cmUsIGZtdFNpZ25UaWZmSUksIDQgKSA9PSAwIHx8CisgICAgICAgICAgIG1lbWNtcCggc2lnbmF0dXJlLCBmbXRTaWduVGlmZk1NLCA0ICkgPT0gMDsKK30KKworCitpbnQgICBHckZtdFRpZmZSZWFkZXI6OkdldFdvcmRFeCgpCit7CisgICAgaW50IHZhbCA9IG1fc3RybS5HZXRXb3JkKCk7CisgICAgaWYoIG1fYnl0ZW9yZGVyID09IFRJRkZfT1JERVJfTU0gKQorICAgICAgICB2YWwgPSAoKHZhbCk+PjgpfCgoKHZhbCkmMHhmZik8PDgpOworICAgIHJldHVybiB2YWw7Cit9CisKKworaW50ICAgR3JGbXRUaWZmUmVhZGVyOjpHZXREV29yZEV4KCkKK3sKKyAgICBpbnQgdmFsID0gbV9zdHJtLkdldERXb3JkKCk7CisgICAgaWYoIG1fYnl0ZW9yZGVyID09IFRJRkZfT1JERVJfTU0gKQorICAgICAgICB2YWwgPSBCU1dBUCggdmFsICk7CisgICAgcmV0dXJuIHZhbDsKK30KKworCitpbnQgIEdyRm10VGlmZlJlYWRlcjo6UmVhZFRhYmxlKCBpbnQgb2Zmc2V0LCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaWZmRmllbGRUeXBlIGZpZWxkVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludComIGFycmF5LCBpbnQmIGFycmF5c2l6ZSApCit7CisgICAgaW50IGk7CisgICAgCisgICAgaWYoIGNvdW50IDwgMCApCisgICAgICAgIHJldHVybiBSQlNfQkFEX0hFQURFUjsKKyAgICAKKyAgICBpZiggZmllbGRUeXBlICE9IFRJRkZfVFlQRV9TSE9SVCAmJgorICAgICAgICBmaWVsZFR5cGUgIT0gVElGRl9UWVBFX0xPTkcgJiYKKyAgICAgICAgZmllbGRUeXBlICE9IFRJRkZfVFlQRV9CWVRFICkKKyAgICAgICAgcmV0dXJuIFJCU19CQURfSEVBREVSOworCisgICAgaWYoIGNvdW50ID4gYXJyYXlzaXplICkKKyAgICB7CisgICAgICAgIGRlbGV0ZVtdIGFycmF5OworICAgICAgICBhcnJheXNpemUgPSBhcnJheXNpemUqMy8yOworICAgICAgICBpZiggYXJyYXlzaXplIDwgY291bnQgKQorICAgICAgICAgICAgYXJyYXlzaXplID0gY291bnQ7CisgICAgICAgIGFycmF5ID0gbmV3IGludFthcnJheXNpemVdOworICAgIH0KKworICAgIGlmKCBjb3VudCA+IDEgKQorICAgIHsKKyAgICAgICAgaW50IHBvcyA9IG1fc3RybS5HZXRQb3MoKTsKKyAgICAgICAgbV9zdHJtLlNldFBvcyggb2Zmc2V0ICk7CisKKyAgICAgICAgaWYoIGZpZWxkVHlwZSA9PSBUSUZGX1RZUEVfTE9ORyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCBtX2J5dGVvcmRlciA9PSBUSUZGX09SREVSX01NICkKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gKChSTUJ5dGVTdHJlYW0mKW1fc3RybSkuR2V0RFdvcmQoKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgICAgICAgICAgICAgIGFycmF5W2ldID0gKChSTEJ5dGVTdHJlYW0mKW1fc3RybSkuR2V0RFdvcmQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCBmaWVsZFR5cGUgPT0gVElGRl9UWVBFX1NIT1JUICkKKyAgICAgICAgeworICAgICAgICAgICAgaWYoIG1fYnl0ZW9yZGVyID09IFRJRkZfT1JERVJfTU0gKQorICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBjb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICAgICAgYXJyYXlbaV0gPSAoKFJNQnl0ZVN0cmVhbSYpbV9zdHJtKS5HZXRXb3JkKCk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgICAgICBhcnJheVtpXSA9ICgoUkxCeXRlU3RyZWFtJiltX3N0cm0pLkdldFdvcmQoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIC8vIGZpZWxkVHlwZSA9PSBUSUZGX1RZUEVfQllURQorICAgICAgICAgICAgZm9yKCBpID0gMDsgaSA8IGNvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIGFycmF5W2ldID0gbV9zdHJtLkdldEJ5dGUoKTsKKworICAgICAgICBtX3N0cm0uU2V0UG9zKHBvcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGFzc2VydCggKG9mZnNldCAmIH50aWZmTWFza1tmaWVsZFR5cGVdKSA9PSAwICk7CisgICAgICAgIGFycmF5WzBdID0gb2Zmc2V0OworICAgIH0KKworICAgIHJldHVybiAwOworfQorCisKK2Jvb2wgIEdyRm10VGlmZlJlYWRlcjo6UmVhZEhlYWRlcigpCit7CisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBpbnQgIHBob3RvbWV0cmljID0gLTE7CisgICAgaW50ICBjaGFubmVscyA9IDE7CisgICAgaW50ICBwYWxfbGVuZ3RoID0gLTE7CisKKyAgICBjb25zdCBpbnQgTUFYX0NIQU5ORUxTID0gNDsKKyAgICBpbnQgIGJwcF9hcnJbTUFYX0NIQU5ORUxTXTsKKworICAgIGFzc2VydCggc3RybGVuKG1fZmlsZW5hbWUpICE9IDAgKTsKKyAgICBpZiggIW1fc3RybS5PcGVuKCBtX2ZpbGVuYW1lICkpIHJldHVybiBmYWxzZTsKKworICAgIG1fd2lkdGggPSAtMTsKKyAgICBtX2hlaWdodCA9IC0xOworICAgIG1fc3RyaXBzID0gLTE7CisgICAgbV9icHAgPSAxOworICAgIG1fY29tcHJlc3Npb24gPSBUSUZGX1VOQ09NUDsKKyAgICBtX3Jvd3NfcGVyX3N0cmlwID0gLTE7CisgICAgbV9pc2NvbG9yID0gZmFsc2U7CisKKyAgICBpZiggc2V0am1wKCBtX3N0cm0uSm1wQnVmKCkpID09IDAgKQorICAgIHsKKyAgICAgICAgbV9ieXRlb3JkZXIgPSAoVGlmZkJ5dGVPcmRlciltX3N0cm0uR2V0V29yZCgpOworICAgICAgICBtX3N0cm0uU2tpcCggMiApOworICAgICAgICBpbnQgaGVhZGVyX29mZnNldCA9IEdldERXb3JkRXgoKTsKKworICAgICAgICBtX3N0cm0uU2V0UG9zKCBoZWFkZXJfb2Zmc2V0ICk7CisKKyAgICAgICAgLy8gcmVhZCB0aGUgZmlyc3QgdGFnIGRpcmVjdG9yeQorICAgICAgICBpbnQgaSwgaiwgY291bnQgPSBHZXRXb3JkRXgoKTsKKworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgY291bnQ7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHJlYWQgdGFnCisgICAgICAgICAgICBUaWZmVGFnIHRhZyA9IChUaWZmVGFnKUdldFdvcmRFeCgpOworICAgICAgICAgICAgVGlmZkZpZWxkVHlwZSBmaWVsZFR5cGUgPSAoVGlmZkZpZWxkVHlwZSlHZXRXb3JkRXgoKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IEdldERXb3JkRXgoKTsKKyAgICAgICAgICAgIGludCB2YWx1ZSA9IEdldERXb3JkRXgoKTsKKyAgICAgICAgICAgIGlmKCBjb3VudCA9PSAxICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggbV9ieXRlb3JkZXIgPT0gVElGRl9PUkRFUl9NTSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiggZmllbGRUeXBlID09IFRJRkZfVFlQRV9TSE9SVCApCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh1bnNpZ25lZCl2YWx1ZSA+PiAxNjsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiggZmllbGRUeXBlID09IFRJRkZfVFlQRV9CWVRFICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gKHVuc2lnbmVkKXZhbHVlID4+IDI0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHZhbHVlICY9IHRpZmZNYXNrW2ZpZWxkVHlwZV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCggdGFnICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgIFRJRkZfVEFHX1dJRFRIOgorICAgICAgICAgICAgICAgIG1fd2lkdGggPSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAgVElGRl9UQUdfSEVJR0hUOgorICAgICAgICAgICAgICAgIG1faGVpZ2h0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgIFRJRkZfVEFHX0JJVFNfUEVSX1NBTVBMRToKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCogYnBwX2Fycl9yZWYgPSBicHBfYXJyOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBjb3VudCA+IE1BWF9DSEFOTkVMUyApCisgICAgICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworCisgICAgICAgICAgICAgICAgICAgIGlmKCBSZWFkVGFibGUoIHZhbHVlLCBjb3VudCwgZmllbGRUeXBlLCBicHBfYXJyX3JlZiwgY291bnQgKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgQkFEX0hFQURFUl9FUlIoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBqID0gMTsgaiA8IGNvdW50OyBqKysgKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggYnBwX2FycltqXSAhPSBicHBfYXJyWzBdICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbV9icHAgPSBicHBfYXJyWzBdOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICBUSUZGX1RBR19DT01QUkVTU0lPTjoKKyAgICAgICAgICAgICAgICBtX2NvbXByZXNzaW9uID0gKFRpZmZDb21wcmVzc2lvbil2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiggbV9jb21wcmVzc2lvbiAhPSBUSUZGX1VOQ09NUCAmJgorICAgICAgICAgICAgICAgICAgICBtX2NvbXByZXNzaW9uICE9IFRJRkZfSFVGRk1BTiAmJgorICAgICAgICAgICAgICAgICAgICBtX2NvbXByZXNzaW9uICE9IFRJRkZfUEFDS0JJVFMgKQorICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICBUSUZGX1RBR19QSE9UT01FVFJJQzoKKyAgICAgICAgICAgICAgICBwaG90b21ldHJpYyA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmKCAodW5zaWduZWQpcGhvdG9tZXRyaWMgPiAzICkKKyAgICAgICAgICAgICAgICAgICAgQkFEX0hFQURFUl9FUlIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAgVElGRl9UQUdfU1RSSVBfT0ZGU0VUUzoKKyAgICAgICAgICAgICAgICBtX3N0cmlwcyA9IGNvdW50OworICAgICAgICAgICAgICAgIGlmKCBSZWFkVGFibGUoIHZhbHVlLCBjb3VudCwgZmllbGRUeXBlLCBtX29mZnNldHMsIG1fbWF4b2Zmc2V0cyApIDwgMCApCisgICAgICAgICAgICAgICAgICAgIEJBRF9IRUFERVJfRVJSKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgIFRJRkZfVEFHX1NBTVBMRVNfUEVSX1BJWEVMOgorICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgaWYoIGNoYW5uZWxzICE9IDEgJiYgY2hhbm5lbHMgIT0gMyAmJiBjaGFubmVscyAhPSA0ICkKKyAgICAgICAgICAgICAgICAgICAgQkFEX0hFQURFUl9FUlIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAgVElGRl9UQUdfUk9XU19QRVJfU1RSSVA6CisgICAgICAgICAgICAgICAgbV9yb3dzX3Blcl9zdHJpcCA9IHZhbHVlOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICBUSUZGX1RBR19QTEFOQVJfQ09ORklHOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpbnQgcGxhbmFyX2NvbmZpZyA9IHZhbHVlOworICAgICAgICAgICAgICAgIGlmKCBwbGFuYXJfY29uZmlnICE9IDEgKQorICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAgVElGRl9UQUdfQ09MT1JfTUFQOgorICAgICAgICAgICAgICAgIGlmKCBmaWVsZFR5cGUgIT0gVElGRl9UWVBFX1NIT1JUIHx8IGNvdW50IDwgMiApCisgICAgICAgICAgICAgICAgICAgIEJBRF9IRUFERVJfRVJSKCk7CisgICAgICAgICAgICAgICAgaWYoIFJlYWRUYWJsZSggdmFsdWUsIGNvdW50LCBmaWVsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV90ZW1wX3BhbGV0dGUsIG1fbWF4X3BhbF9sZW5ndGggKSA8IDAgKQorICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgICAgIHBhbF9sZW5ndGggPSBjb3VudCAvIDM7CisgICAgICAgICAgICAgICAgaWYoIHBhbF9sZW5ndGggPiAyNTYgKQorICAgICAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBwYWxfbGVuZ3RoOyBpKysgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbV9wYWxldHRlW2ldLnIgPSAodWNoYXIpKG1fdGVtcF9wYWxldHRlW2ldID4+IDgpOworICAgICAgICAgICAgICAgICAgICBtX3BhbGV0dGVbaV0uZyA9ICh1Y2hhcikobV90ZW1wX3BhbGV0dGVbaSArIHBhbF9sZW5ndGhdID4+IDgpOworICAgICAgICAgICAgICAgICAgICBtX3BhbGV0dGVbaV0uYiA9ICh1Y2hhcikobV90ZW1wX3BhbGV0dGVbaSArIHBhbF9sZW5ndGgqMl0gPj4gOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAgVElGRl9UQUdfU1RSSVBfQ09VTlRTOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYoIG1fc3RyaXBzID09IDEgJiYgbV9yb3dzX3Blcl9zdHJpcCA9PSAtMSApCisgICAgICAgICAgICBtX3Jvd3NfcGVyX3N0cmlwID0gbV9oZWlnaHQ7CisKKyAgICAgICAgaWYoIG1fd2lkdGggPiAwICYmIG1faGVpZ2h0ID4gMCAmJiBtX3N0cmlwcyA+IDAgJiYKKyAgICAgICAgICAgIChtX2hlaWdodCArIG1fcm93c19wZXJfc3RyaXAgLSAxKS9tX3Jvd3NfcGVyX3N0cmlwID09IG1fc3RyaXBzICkKKyAgICAgICAgeworICAgICAgICAgICAgc3dpdGNoKCBtX2JwcCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYoIHBob3RvbWV0cmljID09IDAgfHwgcGhvdG9tZXRyaWMgPT0gMSAmJiBjaGFubmVscyA9PSAxICkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5UGFsZXR0ZSggbV9wYWxldHRlLCBtX2JwcCwgcGhvdG9tZXRyaWMgPT0gMCApOworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgaWYoIChwaG90b21ldHJpYyA9PSAwIHx8IHBob3RvbWV0cmljID09IDEgfHwKKyAgICAgICAgICAgICAgICAgICAgIHBob3RvbWV0cmljID09IDMgJiYgcGFsX2xlbmd0aCA9PSAoMSA8PCBtX2JwcCkpICYmCisgICAgICAgICAgICAgICAgICAgIG1fY29tcHJlc3Npb24gIT0gVElGRl9IVUZGTUFOICYmIGNoYW5uZWxzID09IDEgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHBhbF9sZW5ndGggPCAwICkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsbEdyYXlQYWxldHRlKCBtX3BhbGV0dGUsIG1fYnBwLCBwaG90b21ldHJpYyA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2lzY29sb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faXNjb2xvciA9IElzQ29sb3JQYWxldHRlKCBtX3BhbGV0dGUsIG1fYnBwICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiggcGhvdG9tZXRyaWMgPT0gMiAmJiBwYWxfbGVuZ3RoIDwgMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFubmVscyA9PSAzIHx8IGNoYW5uZWxzID09IDQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wcmVzc2lvbiA9PSBUSUZGX1VOQ09NUCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX2JwcCA9IDgqY2hhbm5lbHM7CisgICAgICAgICAgICAgICAgICAgIG1faXNjb2xvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBCQURfSEVBREVSX0VSUigpOworICAgICAgICAgICAgfQorICAgICAgICB9CitiYWRfaGVhZGVyX2V4aXQ6CisgICAgICAgIDsKKyAgICB9CisKKyAgICBpZiggIXJlc3VsdCApCisgICAgeworICAgICAgICBtX3N0cmlwcyA9IC0xOworICAgICAgICBtX3dpZHRoID0gbV9oZWlnaHQgPSAtMTsKKyAgICAgICAgbV9zdHJtLkNsb3NlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitib29sICBHckZtdFRpZmZSZWFkZXI6OlJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApCit7CisgICAgY29uc3QgIGludCBidWZmZXJfc2l6ZSA9IDEgPDwgMTI7CisgICAgdWNoYXIgIGJ1ZmZlcltidWZmZXJfc2l6ZV07CisgICAgdWNoYXIgIGdyYXlfcGFsZXR0ZVsyNTZdOworICAgIGJvb2wgICByZXN1bHQgPSBmYWxzZTsKKyAgICB1Y2hhciogc3JjID0gYnVmZmVyOworICAgIGludCAgICBzcmNfcGl0Y2ggPSAobV93aWR0aCptX2JwcCArIDcpLzg7CisgICAgaW50ICAgIHkgPSAwOworCisgICAgaWYoIG1fc3RyaXBzIDwgMCB8fCAhbV9zdHJtLklzT3BlbmVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAKKyAgICBpZiggc3JjX3BpdGNoKzMyID4gYnVmZmVyX3NpemUgKQorICAgICAgICBzcmMgPSBuZXcgdWNoYXJbc3JjX3BpdGNoKzMyXTsKKworICAgIGlmKCAhY29sb3IgKQorICAgICAgICBpZiggbV9icHAgPD0gOCApCisgICAgICAgIHsKKyAgICAgICAgICAgIEN2dFBhbGV0dGVUb0dyYXkoIG1fcGFsZXR0ZSwgZ3JheV9wYWxldHRlLCAxIDw8IG1fYnBwICk7CisgICAgICAgIH0KKworICAgIGlmKCBzZXRqbXAoIG1fc3RybS5KbXBCdWYoKSkgPT0gMCApCisgICAgeworICAgICAgICBmb3IoIGludCBzID0gMDsgcyA8IG1fc3RyaXBzOyBzKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgeV9saW1pdCA9IG1fcm93c19wZXJfc3RyaXA7CisKKyAgICAgICAgICAgIHlfbGltaXQgKz0geTsKKyAgICAgICAgICAgIGlmKCB5X2xpbWl0ID4gbV9oZWlnaHQgKSB5X2xpbWl0ID0gbV9oZWlnaHQ7CisKKyAgICAgICAgICAgIG1fc3RybS5TZXRQb3MoIG1fb2Zmc2V0c1tzXSApOworCisgICAgICAgICAgICBpZiggbV9jb21wcmVzc2lvbiA9PSBUSUZGX1VOQ09NUCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCA7IHkgPCB5X2xpbWl0OyB5KyssIGRhdGEgKz0gc3RlcCApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBtX3N0cm0uR2V0Qnl0ZXMoIHNyYywgc3JjX3BpdGNoICk7CisgICAgICAgICAgICAgICAgICAgIGlmKCBjb2xvciApCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIG1fYnBwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsQ29sb3JSb3cxKCBkYXRhLCBzcmMsIG1fd2lkdGgsIG1fcGFsZXR0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxDb2xvclJvdzQoIGRhdGEsIHNyYywgbV93aWR0aCwgbV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDg6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbENvbG9yUm93OCggZGF0YSwgc3JjLCBtX3dpZHRoLCBtX3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X1JHQjJCR1JfOHVfQzNSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1JBMkJHUl84dV9DNEMzUiggc3JjLCAwLCBkYXRhLCAwLCBjdlNpemUobV93aWR0aCwxKSwgMiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWRfZGVjb2RpbmdfZW5kOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goIG1fYnBwICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxsR3JheVJvdzEoIGRhdGEsIHNyYywgbV93aWR0aCwgZ3JheV9wYWxldHRlICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsbEdyYXlSb3c0KCBkYXRhLCBzcmMsIG1fd2lkdGgsIGdyYXlfcGFsZXR0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxHcmF5Um93OCggZGF0YSwgc3JjLCBtX3dpZHRoLCBncmF5X3BhbGV0dGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUjJHcmF5Xzh1X0MzQzFSKCBzcmMsIDAsIGRhdGEsIDAsIGN2U2l6ZShtX3dpZHRoLDEpLCAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1JBMkdyYXlfOHVfQzRDMVIoIHNyYywgMCwgZGF0YSwgMCwgY3ZTaXplKG1fd2lkdGgsMSksIDIgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0KDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYmFkX2RlY29kaW5nX2VuZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7CisKK2JhZF9kZWNvZGluZ19lbmQ6CisKKyAgICAgICAgICAgIDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmKCBzcmMgIT0gYnVmZmVyICkgZGVsZXRlW10gc3JjOyAKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisjZW5kaWYKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0dyRm10VGlmZldyaXRlcjo6R3JGbXRUaWZmV3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApIDogR3JGbXRXcml0ZXIoIGZpbGVuYW1lICkKK3sKK30KKworR3JGbXRUaWZmV3JpdGVyOjp+R3JGbXRUaWZmV3JpdGVyKCkKK3sKK30KKwordm9pZCAgR3JGbXRUaWZmV3JpdGVyOjpXcml0ZVRhZyggVGlmZlRhZyB0YWcsIFRpZmZGaWVsZFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgdmFsdWUgKQoreworICAgIG1fc3RybS5QdXRXb3JkKCB0YWcgKTsKKyAgICBtX3N0cm0uUHV0V29yZCggZmllbGRUeXBlICk7CisgICAgbV9zdHJtLlB1dERXb3JkKCBjb3VudCApOworICAgIG1fc3RybS5QdXREV29yZCggdmFsdWUgKTsKK30KKworCitib29sICBHckZtdFRpZmZXcml0ZXI6OldyaXRlSW1hZ2UoIGNvbnN0IHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgLypkZXB0aCovLCBpbnQgY2hhbm5lbHMgKQoreworICAgIGJvb2wgcmVzdWx0ID0gZmFsc2U7CisgICAgaW50IGZpbGVTdGVwID0gd2lkdGgqY2hhbm5lbHM7CisKKyAgICBhc3NlcnQoIGRhdGEgJiYgd2lkdGggPiAwICYmIGhlaWdodCA+IDAgJiYgc3RlcCA+PSBmaWxlU3RlcCk7CisKKyAgICBpZiggbV9zdHJtLk9wZW4oIG1fZmlsZW5hbWUgKSApCisgICAgeworICAgICAgICBpbnQgcm93c1BlclN0cmlwID0gKDEgPDwgMTMpL2ZpbGVTdGVwOworCisgICAgICAgIGlmKCByb3dzUGVyU3RyaXAgPCAxICkKKyAgICAgICAgICAgIHJvd3NQZXJTdHJpcCA9IDE7CisKKyAgICAgICAgaWYoIHJvd3NQZXJTdHJpcCA+IGhlaWdodCApCisgICAgICAgICAgICByb3dzUGVyU3RyaXAgPSBoZWlnaHQ7CisKKyAgICAgICAgaW50IGksIHN0cmlwQ291bnQgPSAoaGVpZ2h0ICsgcm93c1BlclN0cmlwIC0gMSkgLyByb3dzUGVyU3RyaXA7CisvKiNpZiBkZWZpbmVkIF9ERUJVRyB8fCAhZGVmaW5lZCBXSU4zMgorICAgICAgICBpbnQgdW5jb21wcmVzc2VkUm93U2l6ZSA9IHJvd3NQZXJTdHJpcCAqIGZpbGVTdGVwOworI2VuZGlmKi8KKyAgICAgICAgaW50IGRpcmVjdG9yeU9mZnNldCA9IDA7CisKKyAgICAgICAgaW50KiBzdHJpcE9mZnNldHMgPSBuZXcgaW50W3N0cmlwQ291bnRdOworICAgICAgICBzaG9ydCogc3RyaXBDb3VudHMgPSBuZXcgc2hvcnRbc3RyaXBDb3VudF07CisgICAgICAgIHVjaGFyKiBidWZmZXIgPSBuZXcgdWNoYXJbZmlsZVN0ZXAgKyAzMl07CisgICAgICAgIGludCAgc3RyaXBPZmZzZXRzT2Zmc2V0ID0gMDsKKyAgICAgICAgaW50ICBzdHJpcENvdW50c09mZnNldCA9IDA7CisgICAgICAgIGludCAgYml0c1BlclNhbXBsZSA9IDg7IC8vIFRPRE8gc3VwcG9ydCAxNiBiaXQKKyAgICAgICAgaW50ICB5ID0gMDsKKworICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGZtdFNpZ25UaWZmSUksIDQgKTsKKyAgICAgICAgbV9zdHJtLlB1dERXb3JkKCBkaXJlY3RvcnlPZmZzZXQgKTsKKworICAgICAgICAvLyB3cml0ZSBhbiBpbWFnZSBkYXRhIGZpcnN0ICh0aGUgbW9zdCByZWFzb25hYmxlIHdheQorICAgICAgICAvLyBmb3IgY29tcHJlc3NlZCBpbWFnZXMpCisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdHJpcENvdW50OyBpKysgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgbGltaXQgPSB5ICsgcm93c1BlclN0cmlwOworCisgICAgICAgICAgICBpZiggbGltaXQgPiBoZWlnaHQgKQorICAgICAgICAgICAgICAgIGxpbWl0ID0gaGVpZ2h0OworCisgICAgICAgICAgICBzdHJpcE9mZnNldHNbaV0gPSBtX3N0cm0uR2V0UG9zKCk7CisKKyAgICAgICAgICAgIGZvciggOyB5IDwgbGltaXQ7IHkrKywgZGF0YSArPSBzdGVwICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiggY2hhbm5lbHMgPT0gMyApCisgICAgICAgICAgICAgICAgICAgIGljdkN2dF9CR1IyUkdCXzh1X0MzUiggZGF0YSwgMCwgYnVmZmVyLCAwLCBjdlNpemUod2lkdGgsMSkgKTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmKCBjaGFubmVscyA9PSA0ICkKKyAgICAgICAgICAgICAgICAgICAgaWN2Q3Z0X0JHUkEyUkdCQV84dV9DNFIoIGRhdGEsIDAsIGJ1ZmZlciwgMCwgY3ZTaXplKHdpZHRoLDEpICk7CisKKyAgICAgICAgICAgICAgICBtX3N0cm0uUHV0Qnl0ZXMoIGNoYW5uZWxzID4gMSA/IGJ1ZmZlciA6IGRhdGEsIGZpbGVTdGVwICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cmlwQ291bnRzW2ldID0gKHNob3J0KShtX3N0cm0uR2V0UG9zKCkgLSBzdHJpcE9mZnNldHNbaV0pOworICAgICAgICAgICAgLyphc3NlcnQoIHN0cmlwQ291bnRzW2ldID09IHVuY29tcHJlc3NlZFJvd1NpemUgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RyaXBDb3VudHNbaV0gPCB1bmNvbXByZXNzZWRSb3dTaXplICYmCisgICAgICAgICAgICAgICAgICAgIGkgPT0gc3RyaXBDb3VudCAtIDEpOyovCisgICAgICAgIH0KKworICAgICAgICBpZiggc3RyaXBDb3VudCA+IDIgKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpcE9mZnNldHNPZmZzZXQgPSBtX3N0cm0uR2V0UG9zKCk7CisgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc3RyaXBDb3VudDsgaSsrICkKKyAgICAgICAgICAgICAgICBtX3N0cm0uUHV0RFdvcmQoIHN0cmlwT2Zmc2V0c1tpXSApOworCisgICAgICAgICAgICBzdHJpcENvdW50c09mZnNldCA9IG1fc3RybS5HZXRQb3MoKTsKKyAgICAgICAgICAgIGZvciggaSA9IDA7IGkgPCBzdHJpcENvdW50OyBpKysgKQorICAgICAgICAgICAgICAgIG1fc3RybS5QdXRXb3JkKCBzdHJpcENvdW50c1tpXSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYoc3RyaXBDb3VudCA9PSAyKQorICAgICAgICB7CisgICAgICAgICAgICBzdHJpcE9mZnNldHNPZmZzZXQgPSBtX3N0cm0uR2V0UG9zKCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RyaXBDb3VudDsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG1fc3RybS5QdXREV29yZCAoc3RyaXBPZmZzZXRzIFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdHJpcENvdW50c09mZnNldCA9IHN0cmlwQ291bnRzIFswXSArIChzdHJpcENvdW50cyBbMV0gPDwgMTYpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgc3RyaXBPZmZzZXRzT2Zmc2V0ID0gc3RyaXBPZmZzZXRzWzBdOworICAgICAgICAgICAgc3RyaXBDb3VudHNPZmZzZXQgPSBzdHJpcENvdW50c1swXTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBjaGFubmVscyA+IDEgKQorICAgICAgICB7CisgICAgICAgICAgICBiaXRzUGVyU2FtcGxlID0gbV9zdHJtLkdldFBvcygpOworICAgICAgICAgICAgbV9zdHJtLlB1dFdvcmQoOCk7CisgICAgICAgICAgICBtX3N0cm0uUHV0V29yZCg4KTsKKyAgICAgICAgICAgIG1fc3RybS5QdXRXb3JkKDgpOworICAgICAgICAgICAgaWYoIGNoYW5uZWxzID09IDQgKQorICAgICAgICAgICAgICAgIG1fc3RybS5QdXRXb3JkKDgpOworICAgICAgICB9CisKKyAgICAgICAgZGlyZWN0b3J5T2Zmc2V0ID0gbV9zdHJtLkdldFBvcygpOworCisgICAgICAgIC8vIHdyaXRlIGhlYWRlcgorICAgICAgICBtX3N0cm0uUHV0V29yZCggOSApOworCisgICAgICAgIC8qIHdhcm5pbmc6IHNwZWNpZmljYXRpb24gNS4wIG9mIFRpZmYgd2FudCB0byBoYXZlIHRhZ3MgaW4KKyAgICAgICAgICAgYXNjZW5kaW5nIG9yZGVyLiBUaGlzIGlzIGEgbm9uLWZhdGFsIGVycm9yLCBidXQgdGhpcyBjYXVzZQorICAgICAgICAgICB3YXJuaW5nIHdpdGggc29tZSB0b29scy4gU28sIGtlZXAgdGhpcyBpbiBhc2NlbmRpbmcgb3JkZXIgKi8KKworICAgICAgICBXcml0ZVRhZyggVElGRl9UQUdfV0lEVEgsIFRJRkZfVFlQRV9MT05HLCAxLCB3aWR0aCApOworICAgICAgICBXcml0ZVRhZyggVElGRl9UQUdfSEVJR0hULCBUSUZGX1RZUEVfTE9ORywgMSwgaGVpZ2h0ICk7CisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19CSVRTX1BFUl9TQU1QTEUsCisgICAgICAgICAgICAgICAgICBUSUZGX1RZUEVfU0hPUlQsIGNoYW5uZWxzLCBiaXRzUGVyU2FtcGxlICk7CisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19DT01QUkVTU0lPTiwgVElGRl9UWVBFX0xPTkcsIDEsIFRJRkZfVU5DT01QICk7CisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19QSE9UT01FVFJJQywgVElGRl9UWVBFX1NIT1JULCAxLCBjaGFubmVscyA+IDEgPyAyIDogMSApOworCisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19TVFJJUF9PRkZTRVRTLCBUSUZGX1RZUEVfTE9ORywKKyAgICAgICAgICAgICAgICAgIHN0cmlwQ291bnQsIHN0cmlwT2Zmc2V0c09mZnNldCApOworCisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19TQU1QTEVTX1BFUl9QSVhFTCwgVElGRl9UWVBFX1NIT1JULCAxLCBjaGFubmVscyApOworICAgICAgICBXcml0ZVRhZyggVElGRl9UQUdfUk9XU19QRVJfU1RSSVAsIFRJRkZfVFlQRV9MT05HLCAxLCByb3dzUGVyU3RyaXAgKTsKKyAgICAgICAgCisgICAgICAgIFdyaXRlVGFnKCBUSUZGX1RBR19TVFJJUF9DT1VOVFMsCisgICAgICAgICAgICAgICAgICBzdHJpcENvdW50ID4gMSA/IFRJRkZfVFlQRV9TSE9SVCA6IFRJRkZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAgc3RyaXBDb3VudCwgc3RyaXBDb3VudHNPZmZzZXQgKTsKKworICAgICAgICBtX3N0cm0uUHV0RFdvcmQoMCk7CisgICAgICAgIG1fc3RybS5DbG9zZSgpOworCisgICAgICAgIC8vIHdyaXRlIGRpcmVjdG9yeSBvZmZzZXQKKyAgICAgICAgRklMRSogZiA9IGZvcGVuKCBtX2ZpbGVuYW1lLCAicitiIiApOworICAgICAgICBidWZmZXJbMF0gPSAodWNoYXIpZGlyZWN0b3J5T2Zmc2V0OworICAgICAgICBidWZmZXJbMV0gPSAodWNoYXIpKGRpcmVjdG9yeU9mZnNldCA+PiA4KTsKKyAgICAgICAgYnVmZmVyWzJdID0gKHVjaGFyKShkaXJlY3RvcnlPZmZzZXQgPj4gMTYpOworICAgICAgICBidWZmZXJbM10gPSAodWNoYXIpKGRpcmVjdG9yeU9mZnNldCA+PiAyNCk7CisKKyAgICAgICAgZnNlZWsoIGYsIDQsIFNFRUtfU0VUICk7CisgICAgICAgIGZ3cml0ZSggYnVmZmVyLCAxLCA0LCBmICk7CisgICAgICAgIGZjbG9zZShmKTsKKworICAgICAgICBkZWxldGVbXSAgc3RyaXBPZmZzZXRzOworICAgICAgICBkZWxldGVbXSAgc3RyaXBDb3VudHM7CisgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKKworICAgICAgICByZXN1bHQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF90aWZmLmggYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdF90aWZmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNzA0MgotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10X3RpZmYuaApAQCAtMCwwICsxLDE3OCBAQAorLypNLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gIElNUE9SVEFOVDogUkVBRCBCRUZPUkUgRE9XTkxPQURJTkcsIENPUFlJTkcsIElOU1RBTExJTkcgT1IgVVNJTkcuCisvLworLy8gIEJ5IGRvd25sb2FkaW5nLCBjb3B5aW5nLCBpbnN0YWxsaW5nIG9yIHVzaW5nIHRoZSBzb2Z0d2FyZSB5b3UgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLgorLy8gIElmIHlvdSBkbyBub3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlLCBkbyBub3QgZG93bmxvYWQsIGluc3RhbGwsCisvLyAgY29weSBvciB1c2UgdGhlIHNvZnR3YXJlLgorLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgIEludGVsIExpY2Vuc2UgQWdyZWVtZW50CisvLyAgICAgICAgICAgICAgICBGb3IgT3BlbiBTb3VyY2UgQ29tcHV0ZXIgVmlzaW9uIExpYnJhcnkKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMDAsIEludGVsIENvcnBvcmF0aW9uLCBhbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVGhpcmQgcGFydHkgY29weXJpZ2h0cyBhcmUgcHJvcGVydHkgb2YgdGhlaXIgcmVzcGVjdGl2ZSBvd25lcnMuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKKy8vIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KKy8vICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vCisvLyAgICogVGhlIG5hbWUgb2YgSW50ZWwgQ29ycG9yYXRpb24gbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworLy8gICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMgImFzIGlzIiBhbmQKKy8vIGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudGllcywgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZSBpbXBsaWVkCisvLyB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UgYXJlIGRpc2NsYWltZWQuCisvLyBJbiBubyBldmVudCBzaGFsbCB0aGUgSW50ZWwgQ29ycG9yYXRpb24gb3IgY29udHJpYnV0b3JzIGJlIGxpYWJsZSBmb3IgYW55IGRpcmVjdCwKKy8vIGluZGlyZWN0LCBpbmNpZGVudGFsLCBzcGVjaWFsLCBleGVtcGxhcnksIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcworLy8gKGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCBwcm9jdXJlbWVudCBvZiBzdWJzdGl0dXRlIGdvb2RzIG9yIHNlcnZpY2VzOworLy8gbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHM7IG9yIGJ1c2luZXNzIGludGVycnVwdGlvbikgaG93ZXZlciBjYXVzZWQKKy8vIGFuZCBvbiBhbnkgdGhlb3J5IG9mIGxpYWJpbGl0eSwgd2hldGhlciBpbiBjb250cmFjdCwgc3RyaWN0IGxpYWJpbGl0eSwKKy8vIG9yIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlIG9yIG90aGVyd2lzZSkgYXJpc2luZyBpbiBhbnkgd2F5IG91dCBvZgorLy8gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgorLy8KKy8vTSovCisKKyNpZm5kZWYgX0dSRk1UX1RJRkZfSF8KKyNkZWZpbmUgX0dSRk1UX1RJRkZfSF8KKworI2luY2x1ZGUgImdyZm10X2Jhc2UuaCIKKworCisvLyBuYXRpdmUgc2ltcGxlIFRJRkYgY29kZWMKK2VudW0gVGlmZkNvbXByZXNzaW9uCit7CisgICAgVElGRl9VTkNPTVAgPSAxLAorICAgIFRJRkZfSFVGRk1BTiA9IDIsCisgICAgVElGRl9QQUNLQklUUyA9IDMyNzczCit9OworCitlbnVtIFRpZmZCeXRlT3JkZXIKK3sKKyAgICBUSUZGX09SREVSX0lJID0gMHg0OTQ5LAorICAgIFRJRkZfT1JERVJfTU0gPSAweDRkNGQKK307CisKKworZW51bSAgVGlmZlRhZworeworICAgIFRJRkZfVEFHX1dJRFRIICA9IDI1NiwKKyAgICBUSUZGX1RBR19IRUlHSFQgPSAyNTcsCisgICAgVElGRl9UQUdfQklUU19QRVJfU0FNUExFID0gMjU4LAorICAgIFRJRkZfVEFHX0NPTVBSRVNTSU9OID0gMjU5LAorICAgIFRJRkZfVEFHX1BIT1RPTUVUUklDID0gMjYyLAorICAgIFRJRkZfVEFHX1NUUklQX09GRlNFVFMgPSAyNzMsCisgICAgVElGRl9UQUdfU1RSSVBfQ09VTlRTID0gMjc5LAorICAgIFRJRkZfVEFHX1NBTVBMRVNfUEVSX1BJWEVMID0gMjc3LAorICAgIFRJRkZfVEFHX1JPV1NfUEVSX1NUUklQID0gMjc4LAorICAgIFRJRkZfVEFHX1BMQU5BUl9DT05GSUcgPSAyODQsCisgICAgVElGRl9UQUdfQ09MT1JfTUFQID0gMzIwCit9OworCisKK2VudW0gVGlmZkZpZWxkVHlwZQoreworICAgIFRJRkZfVFlQRV9CWVRFID0gMSwKKyAgICBUSUZGX1RZUEVfU0hPUlQgPSAzLAorICAgIFRJRkZfVFlQRV9MT05HID0gNAorfTsKKworCisKKyNpZmRlZiBIQVZFX1RJRkYKKworLy8gbGlidGlmZiBiYXNlZCBUSUZGIGNvZGVjCisKK2NsYXNzIEdyRm10VGlmZlJlYWRlciA6IHB1YmxpYyBHckZtdFJlYWRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10VGlmZlJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRUaWZmUmVhZGVyKCk7CisKKyAgICBib29sICBDaGVja0Zvcm1hdCggY29uc3QgY2hhciogc2lnbmF0dXJlICk7CisgICAgYm9vbCAgUmVhZERhdGEoIHVjaGFyKiBkYXRhLCBpbnQgc3RlcCwgaW50IGNvbG9yICk7CisgICAgYm9vbCAgUmVhZEhlYWRlcigpOworICAgIHZvaWQgIENsb3NlKCk7CisKK3Byb3RlY3RlZDoKKworICAgIHZvaWQqIG1fdGlmOworfTsKKworCisjZWxzZQorCitjbGFzcyBHckZtdFRpZmZSZWFkZXIgOiBwdWJsaWMgR3JGbXRSZWFkZXIKK3sKK3B1YmxpYzoKKyAgICAKKyAgICBHckZtdFRpZmZSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisgICAgfkdyRm10VGlmZlJlYWRlcigpOworCisgICAgYm9vbCAgQ2hlY2tGb3JtYXQoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApOworICAgIGJvb2wgIFJlYWREYXRhKCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsIGludCBjb2xvciApOworICAgIGJvb2wgIFJlYWRIZWFkZXIoKTsKKyAgICB2b2lkICBDbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgCisgICAgUkxCeXRlU3RyZWFtICAgICBtX3N0cm07CisgICAgUGFsZXR0ZUVudHJ5ICAgICBtX3BhbGV0dGVbMjU2XTsKKyAgICBpbnQgICAgICAgICAgICAgIG1fYnBwOworICAgIGludCogICAgICAgICAgICAgbV90ZW1wX3BhbGV0dGU7CisgICAgaW50ICAgICAgICAgICAgICBtX21heF9wYWxfbGVuZ3RoOworICAgIGludCogICAgICAgICAgICAgbV9vZmZzZXRzOworICAgIGludCAgICAgICAgICAgICAgbV9tYXhvZmZzZXRzOworICAgIGludCAgICAgICAgICAgICAgbV9zdHJpcHM7CisgICAgaW50ICAgICAgICAgICAgICBtX3Jvd3NfcGVyX3N0cmlwOworICAgIFRpZmZDb21wcmVzc2lvbiAgbV9jb21wcmVzc2lvbjsKKyAgICBUaWZmQnl0ZU9yZGVyICAgIG1fYnl0ZW9yZGVyOworCisgICAgaW50ICBHZXRXb3JkRXgoKTsKKyAgICBpbnQgIEdldERXb3JkRXgoKTsKKyAgICBpbnQgIFJlYWRUYWJsZSggaW50IG9mZnNldCwgaW50IGNvdW50LCBUaWZmRmllbGRUeXBlIGZpZWxkdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50KiYgYXJyYXksIGludCYgYXJyYXlzaXplICk7Cit9OworCisjZW5kaWYKKworLy8gLi4uIGFuZCB3cml0ZXIKK2NsYXNzIEdyRm10VGlmZldyaXRlciA6IHB1YmxpYyBHckZtdFdyaXRlcgoreworcHVibGljOgorICAgIAorICAgIEdyRm10VGlmZldyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICB+R3JGbXRUaWZmV3JpdGVyKCk7CisKKyAgICBib29sICBXcml0ZUltYWdlKCBjb25zdCB1Y2hhciogZGF0YSwgaW50IHN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBjaGFubmVscyApOworcHJvdGVjdGVkOgorCisgICAgV0xCeXRlU3RyZWFtICBtX3N0cm07CisKKyAgICB2b2lkICBXcml0ZVRhZyggVGlmZlRhZyB0YWcsIFRpZmZGaWVsZFR5cGUgZmllbGRUeXBlLAorICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQsIGludCB2YWx1ZSApOworfTsKKworCisvLyBUSUZGIGZpbHRlciBmYWN0b3J5CitjbGFzcyBHckZtdFRpZmYgOiBwdWJsaWMgR3JGbXRGaWx0ZXJGYWN0b3J5Cit7CitwdWJsaWM6CisgICAgCisgICAgR3JGbXRUaWZmKCk7CisgICAgfkdyRm10VGlmZigpOworCisgICAgR3JGbXRSZWFkZXIqIE5ld1JlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKTsKKyAgICBHckZtdFdyaXRlciogTmV3V3JpdGVyKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApOworICAgIGJvb2wgQ2hlY2tTaWduYXR1cmUoIGNvbnN0IGNoYXIqIHNpZ25hdHVyZSApOworfTsKKworI2VuZGlmLypfR1JGTVRfVElGRl9IXyovCmRpZmYgLS1naXQgYS9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdHMuaCBiL290aGVybGlicy9oaWdoZ3VpL2dyZm10cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMTgzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9ncmZtdHMuaApAQCAtMCwwICsxLDU2IEBACisvKk0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCisvLyAgSU1QT1JUQU5UOiBSRUFEIEJFRk9SRSBET1dOTE9BRElORywgQ09QWUlORywgSU5TVEFMTElORyBPUiBVU0lORy4KKy8vCisvLyAgQnkgZG93bmxvYWRpbmcsIGNvcHlpbmcsIGluc3RhbGxpbmcgb3IgdXNpbmcgdGhlIHNvZnR3YXJlIHlvdSBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UuCisvLyAgSWYgeW91IGRvIG5vdCBhZ3JlZSB0byB0aGlzIGxpY2Vuc2UsIGRvIG5vdCBkb3dubG9hZCwgaW5zdGFsbCwKKy8vICBjb3B5IG9yIHVzZSB0aGUgc29mdHdhcmUuCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWwgTGljZW5zZSBBZ3JlZW1lbnQKKy8vICAgICAgICAgICAgICAgIEZvciBPcGVuIFNvdXJjZSBDb21wdXRlciBWaXNpb24gTGlicmFyeQorLy8KKy8vIENvcHlyaWdodCAoQykgMjAwMCwgSW50ZWwgQ29ycG9yYXRpb24sIGFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBUaGlyZCBwYXJ0eSBjb3B5cmlnaHRzIGFyZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLAorLy8gYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorLy8KKy8vICAgKiBSZWRpc3RyaWJ1dGlvbidzIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorLy8gICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3MgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbgorLy8gICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorLy8KKy8vICAgKiBUaGUgbmFtZSBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisvLyAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlcnMgYW5kIGNvbnRyaWJ1dG9ycyAiYXMgaXMiIGFuZAorLy8gYW55IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzLCBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgdGhlIGltcGxpZWQKKy8vIHdhcnJhbnRpZXMgb2YgbWVyY2hhbnRhYmlsaXR5IGFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZSBhcmUgZGlzY2xhaW1lZC4KKy8vIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBJbnRlbCBDb3Jwb3JhdGlvbiBvciBjb250cmlidXRvcnMgYmUgbGlhYmxlIGZvciBhbnkgZGlyZWN0LAorLy8gaW5kaXJlY3QsIGluY2lkZW50YWwsIHNwZWNpYWwsIGV4ZW1wbGFyeSwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzCisvLyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHByb2N1cmVtZW50IG9mIHN1YnN0aXR1dGUgZ29vZHMgb3Igc2VydmljZXM7CisvLyBsb3NzIG9mIHVzZSwgZGF0YSwgb3IgcHJvZml0czsgb3IgYnVzaW5lc3MgaW50ZXJydXB0aW9uKSBob3dldmVyIGNhdXNlZAorLy8gYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QgbGlhYmlsaXR5LAorLy8gb3IgdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2Ugb3Igb3RoZXJ3aXNlKSBhcmlzaW5nIGluIGFueSB3YXkgb3V0IG9mCisvLyB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUsIGV2ZW4gaWYgYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2UuCisvLworLy9NKi8KKworI2lmbmRlZiBfR1JGTVRTX0hfCisjZGVmaW5lIF9HUkZNVFNfSF8KKworI2luY2x1ZGUgImdyZm10X2Jhc2UuaCIKKyNpbmNsdWRlICJncmZtdF9pbWFnZWlvLmgiCisjaW5jbHVkZSAiZ3JmbXRfYm1wLmgiCisjaW5jbHVkZSAiZ3JmbXRfc3VucmFzLmgiCisjaW5jbHVkZSAiZ3JmbXRfanBlZy5oIgorI2luY2x1ZGUgImdyZm10X3B4bS5oIgorI2luY2x1ZGUgImdyZm10X3RpZmYuaCIKKyNpbmNsdWRlICJncmZtdF9wbmcuaCIKKyNpbmNsdWRlICJncmZtdF9qcGVnMjAwMC5oIgorI2luY2x1ZGUgImdyZm10X2V4ci5oIgorCisjZW5kaWYvKl9HUkZNVFNfSF8qLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvaGlnaGd1aS5oIGIvb3RoZXJsaWJzL2hpZ2hndWkvaGlnaGd1aS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMzVhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9oaWdoZ3VpLmgKQEAgLTAsMCArMSwzODUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9ISUdIX0dVSV8KKyNkZWZpbmUgX0hJR0hfR1VJXworCisjaWZuZGVmIFNLSVBfSU5DTFVERVMKKworICAjaW5jbHVkZSAiY3hjb3JlLmgiCisgICNpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQKKyAgICAjaW5jbHVkZSA8d2luZG93cy5oPgorICAjZW5kaWYKKworI2Vsc2UgLy8gU0tJUF9JTkNMVURFUworCisgICNpZiBkZWZpbmVkIFdJTjMyIHx8IGRlZmluZWQgV0lONjQKKyAgICAjZGVmaW5lIENWX0NERUNMIF9fY2RlY2wKKyAgICAjZGVmaW5lIENWX1NURENBTEwgX19zdGRjYWxsCisgICNlbHNlCisgICAgI2RlZmluZSBDVl9DREVDTAorICAgICNkZWZpbmUgQ1ZfU1REQ0FMTAorICAjZW5kaWYKKworICAjaWZuZGVmIENWX0VYVEVSTl9DCisgICAgI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgICAjZGVmaW5lIENWX0VYVEVSTl9DIGV4dGVybiAiQyIKKyAgICAgICNkZWZpbmUgQ1ZfREVGQVVMVCh2YWwpID0gdmFsCisgICAgI2Vsc2UKKyAgICAgICNkZWZpbmUgQ1ZfRVhURVJOX0MKKyAgICAgICNkZWZpbmUgQ1ZfREVGQVVMVCh2YWwpCisgICAgI2VuZGlmCisgICNlbmRpZgorCisgICNpZm5kZWYgQ1ZfRVhURVJOX0NfRlVOQ1BUUgorICAgICNpZmRlZiBfX2NwbHVzcGx1cworICAgICAgI2RlZmluZSBDVl9FWFRFUk5fQ19GVU5DUFRSKHgpIGV4dGVybiAiQyIgeyB0eXBlZGVmIHg7IH0KKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBDVl9FWFRFUk5fQ19GVU5DUFRSKHgpIHR5cGVkZWYgeAorICAgICNlbmRpZgorICAjZW5kaWYKKworICAjaWZuZGVmIENWX0lOTElORQorICAgICNpZiBkZWZpbmVkIF9fY3BsdXNwbHVzCisgICAgICAjZGVmaW5lIENWX0lOTElORSBpbmxpbmUKKyAgICAjZWxpZiAoZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIFdJTjY0KSAmJiAhZGVmaW5lZCBfX0dOVUNfXworICAgICAgI2RlZmluZSBDVl9JTkxJTkUgX19pbmxpbmUKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBDVl9JTkxJTkUgc3RhdGljCisgICAgI2VuZGlmCisgICNlbmRpZiAvKiBDVl9JTkxJTkUgKi8KKworICAjaWYgKGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBXSU42NCkgJiYgZGVmaW5lZCBDVkFQSV9FWFBPUlRTCisgICAgI2RlZmluZSBDVl9FWFBPUlRTIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorICAjZWxzZQorICAgICNkZWZpbmUgQ1ZfRVhQT1JUUworICAjZW5kaWYKKworICAjaWZuZGVmIENWQVBJCisgICAgI2RlZmluZSBDVkFQSShyZXR0eXBlKSBDVl9FWFRFUk5fQyBDVl9FWFBPUlRTIHJldHR5cGUgQ1ZfQ0RFQ0wKKyAgI2VuZGlmCisKKyNlbmRpZiAvLyBTS0lQX0lOQ0xVREVTCisKKyNpZiBkZWZpbmVkKF9DSF8pCisgICNwcmFnbWEgcGFja2FnZSA8Y2hvcGVuY3Y+CisgICNpbmNsdWRlIDxjaGRsLmg+CisgIExPQURfQ0hETChoaWdoZ3VpKQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZGVmaW5lIENWX0VWRU5UX01PVVNFTU9WRSAgICAgIDAKKyNkZWZpbmUgQ1ZfRVZFTlRfTEJVVFRPTkRPV04gICAgMQorI2RlZmluZSBDVl9FVkVOVF9SQlVUVE9ORE9XTiAgICAyCisjZGVmaW5lIENWX0VWRU5UX01CVVRUT05ET1dOICAgIDMKKyNkZWZpbmUgQ1ZfRVZFTlRfTEJVVFRPTlVQICAgICAgNAorI2RlZmluZSBDVl9FVkVOVF9SQlVUVE9OVVAgICAgICA1CisjZGVmaW5lIENWX0VWRU5UX01CVVRUT05VUCAgICAgIDYKKyNkZWZpbmUgQ1ZfRVZFTlRfTEJVVFRPTkRCTENMSyAgNworI2RlZmluZSBDVl9FVkVOVF9SQlVUVE9OREJMQ0xLICA4CisjZGVmaW5lIENWX0VWRU5UX01CVVRUT05EQkxDTEsgIDkKKworI2RlZmluZSBDVl9FVkVOVF9GTEFHX0xCVVRUT04gICAxCisjZGVmaW5lIENWX0VWRU5UX0ZMQUdfUkJVVFRPTiAgIDIKKyNkZWZpbmUgQ1ZfRVZFTlRfRkxBR19NQlVUVE9OICAgNAorI2RlZmluZSBDVl9FVkVOVF9GTEFHX0NUUkxLRVkgICA4CisjZGVmaW5lIENWX0VWRU5UX0ZMQUdfU0hJRlRLRVkgIDE2CisjZGVmaW5lIENWX0VWRU5UX0ZMQUdfQUxUS0VZICAgIDMyCisKKworLyogOGJpdCwgY29sb3Igb3Igbm90ICovCisjZGVmaW5lIENWX0xPQURfSU1BR0VfVU5DSEFOR0VEICAtMQorLyogOGJpdCwgZ3JheSAqLworI2RlZmluZSBDVl9MT0FEX0lNQUdFX0dSQVlTQ0FMRSAgIDAKKy8qID8sIGNvbG9yICovCisjZGVmaW5lIENWX0xPQURfSU1BR0VfQ09MT1IgICAgICAgMQorLyogYW55IGRlcHRoLCA/ICovCisjZGVmaW5lIENWX0xPQURfSU1BR0VfQU5ZREVQVEggICAgMgorLyogPywgYW55IGNvbG9yICovCisjZGVmaW5lIENWX0xPQURfSU1BR0VfQU5ZQ09MT1IgICAgNAorCisvKiBsb2FkIGltYWdlIGZyb20gZmlsZQorICBpc2NvbG9yIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mIGFib3ZlIGZsYWdzIHdoZXJlIENWX0xPQURfSU1BR0VfVU5DSEFOR0VECisgIG92ZXJyaWRlcyB0aGUgb3RoZXIgZmxhZ3MKKyAgdXNpbmcgQ1ZfTE9BRF9JTUFHRV9BTllDT0xPUiBhbG9uZSBpcyBlcXVpdmFsZW50IHRvIENWX0xPQURfSU1BR0VfVU5DSEFOR0VECisgIHVubGVzcyBDVl9MT0FEX0lNQUdFX0FOWURFUFRIIGlzIHNwZWNpZmllZCBpbWFnZXMgYXJlIGNvbnZlcnRlZCB0byA4Yml0CisqLworQ1ZBUEkoSXBsSW1hZ2UqKSBjdkxvYWRJbWFnZSggY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBpc2NvbG9yIENWX0RFRkFVTFQoQ1ZfTE9BRF9JTUFHRV9DT0xPUikpOworQ1ZBUEkoQ3ZNYXQqKSBjdkxvYWRJbWFnZU0oIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgaXNjb2xvciBDVl9ERUZBVUxUKENWX0xPQURfSU1BR0VfQ09MT1IpKTsKKworLyogc2F2ZSBpbWFnZSB0byBmaWxlICovCitDVkFQSShpbnQpIGN2U2F2ZUltYWdlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY29uc3QgQ3ZBcnIqIGltYWdlICk7CisKKyNkZWZpbmUgQ1ZfQ1ZUSU1HX0ZMSVAgICAgICAxCisjZGVmaW5lIENWX0NWVElNR19TV0FQX1JCICAgMgorLyogdXRpbGl0eSBmdW5jdGlvbjogY29udmVydCBvbmUgaW1hZ2UgdG8gYW5vdGhlciB3aXRoIG9wdGlvbmFsIHZlcnRpY2FsIGZsaXAgKi8KK0NWQVBJKHZvaWQpIGN2Q29udmVydEltYWdlKCBjb25zdCBDdkFyciogc3JjLCBDdkFyciogZHN0LCBpbnQgZmxhZ3MgQ1ZfREVGQVVMVCgwKSk7CisKKy8qIHdhaXQgZm9yIGtleSBldmVudCBpbmZpbml0ZWx5IChkZWxheTw9MCkgb3IgZm9yICJkZWxheSIgbWlsbGlzZWNvbmRzICovCitDVkFQSShpbnQpIGN2V2FpdEtleShpbnQgZGVsYXkgQ1ZfREVGQVVMVCgwKSk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgIFdvcmtpbmcgd2l0aCBWaWRlbyBGaWxlcyBhbmQgQ2FtZXJhcyAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiAiYmxhY2sgYm94IiBjYXB0dXJlIHN0cnVjdHVyZSAqLwordHlwZWRlZiBzdHJ1Y3QgQ3ZDYXB0dXJlIEN2Q2FwdHVyZTsKKworLyogc3RhcnQgY2FwdHVyaW5nIGZyYW1lcyBmcm9tIHZpZGVvIGZpbGUgKi8KK0NWQVBJKEN2Q2FwdHVyZSopIGN2Q3JlYXRlU29ja2V0Q2FwdHVyZSggY29uc3QgY2hhciAqYWRkcmVzcywgY29uc3QgY2hhciogcG9ydCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0ICk7CisKKy8qIGdyYWIgYSBmcmFtZSwgcmV0dXJuIDEgb24gc3VjY2VzcywgMCBvbiBmYWlsLgorICB0aGlzIGZ1bmN0aW9uIGlzIHRob3VnaHQgdG8gYmUgZmFzdCAgICAgICAgICAgICAgICovCitDVkFQSShpbnQpIGN2R3JhYkZyYW1lKCBDdkNhcHR1cmUqIGNhcHR1cmUgKTsKKworLyogZ2V0IHRoZSBmcmFtZSBncmFiYmVkIHdpdGggY3ZHcmFiRnJhbWUoLi4pCisgIFRoaXMgZnVuY3Rpb24gbWF5IGFwcGx5IHNvbWUgZnJhbWUgcHJvY2Vzc2luZyBsaWtlCisgIGZyYW1lIGRlY29tcHJlc3Npb24sIGZsaXBwaW5nIGV0Yy4KKyAgISEhRE8gTk9UIFJFTEVBU0Ugb3IgTU9ESUZZIHRoZSByZXRyaWV2ZWQgZnJhbWUhISEgKi8KK0NWQVBJKElwbEltYWdlKikgY3ZSZXRyaWV2ZUZyYW1lKCBDdkNhcHR1cmUqIGNhcHR1cmUgKTsKKworLyogSnVzdCBhIGNvbWJpbmF0aW9uIG9mIGN2R3JhYkZyYW1lIGFuZCBjdlJldHJpZXZlRnJhbWUKKyAgICEhIURPIE5PVCBSRUxFQVNFIG9yIE1PRElGWSB0aGUgcmV0cmlldmVkIGZyYW1lISEhICAgICAgKi8KK0NWQVBJKElwbEltYWdlKikgY3ZRdWVyeUZyYW1lKCBDdkNhcHR1cmUqIGNhcHR1cmUgKTsKKworLyogc3RvcCBjYXB0dXJpbmcvcmVhZGluZyBhbmQgZnJlZSByZXNvdXJjZXMgKi8KK0NWQVBJKHZvaWQpIGN2UmVsZWFzZUNhcHR1cmUoIEN2Q2FwdHVyZSoqIGNhcHR1cmUgKTsKKworI2RlZmluZSBDVl9DQVBfUFJPUF9QT1NfTVNFQyAgICAgICAwCisjZGVmaW5lIENWX0NBUF9QUk9QX1BPU19GUkFNRVMgICAgIDEKKyNkZWZpbmUgQ1ZfQ0FQX1BST1BfUE9TX0FWSV9SQVRJTyAgMgorI2RlZmluZSBDVl9DQVBfUFJPUF9GUkFNRV9XSURUSCAgICAzCisjZGVmaW5lIENWX0NBUF9QUk9QX0ZSQU1FX0hFSUdIVCAgIDQKKyNkZWZpbmUgQ1ZfQ0FQX1BST1BfRlBTICAgICAgICAgICAgNQorI2RlZmluZSBDVl9DQVBfUFJPUF9GT1VSQ0MgICAgICAgICA2CisjZGVmaW5lIENWX0NBUF9QUk9QX0ZSQU1FX0NPVU5UICAgIDcKKyNkZWZpbmUgQ1ZfQ0FQX1BST1BfRk9STUFUICAgICAgICAgOAorI2RlZmluZSBDVl9DQVBfUFJPUF9NT0RFICAgICAgICAgICA5CisjZGVmaW5lIENWX0NBUF9QUk9QX0JSSUdIVE5FU1MgICAgMTAKKyNkZWZpbmUgQ1ZfQ0FQX1BST1BfQ09OVFJBU1QgICAgICAxMQorI2RlZmluZSBDVl9DQVBfUFJPUF9TQVRVUkFUSU9OICAgIDEyCisjZGVmaW5lIENWX0NBUF9QUk9QX0hVRSAgICAgICAgICAgMTMKKyNkZWZpbmUgQ1ZfQ0FQX1BST1BfR0FJTiAgICAgICAgICAxNAorI2RlZmluZSBDVl9DQVBfUFJPUF9DT05WRVJUX1JHQiAgIDE1CisKKworLyogcmV0cmlldmUgb3Igc2V0IGNhcHR1cmUgcHJvcGVydGllcyAqLworQ1ZBUEkoZG91YmxlKSBjdkdldENhcHR1cmVQcm9wZXJ0eSggQ3ZDYXB0dXJlKiBjYXB0dXJlLCBpbnQgcHJvcGVydHlfaWQgKTsKK0NWQVBJKGludCkgICAgY3ZTZXRDYXB0dXJlUHJvcGVydHkoIEN2Q2FwdHVyZSogY2FwdHVyZSwgaW50IHByb3BlcnR5X2lkLCBkb3VibGUgdmFsdWUgKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Jzb2xldGUgZnVuY3Rpb25zL3N5bm9ueW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIEhJR0hHVUlfTk9fQkFDS1dBUkRfQ09NUEFUSUJJTElUWQorICAgICNkZWZpbmUgSElHSEdVSV9CQUNLV0FSRF9DT01QQVRJQklMSVRZCisjZW5kaWYKKworI2lmZGVmIEhJR0hHVUlfQkFDS1dBUkRfQ09NUEFUSUJJTElUWQorCisjZGVmaW5lIGN2Q2FwdHVyZUZyb21GaWxlIGN2Q3JlYXRlRmlsZUNhcHR1cmUKKyNkZWZpbmUgY3ZDYXB0dXJlRnJvbUNBTSBjdkNyZWF0ZUNhbWVyYUNhcHR1cmUKKyNkZWZpbmUgY3ZDYXB0dXJlRnJvbUFWSSBjdkNhcHR1cmVGcm9tRmlsZQorI2RlZmluZSBjdkNyZWF0ZUFWSVdyaXRlciBjdkNyZWF0ZVZpZGVvV3JpdGVyCisjZGVmaW5lIGN2V3JpdGVUb0FWSSBjdldyaXRlRnJhbWUKKyNkZWZpbmUgY3ZBZGRTZWFyY2hQYXRoKHBhdGgpCisjZGVmaW5lIGN2dkluaXRTeXN0ZW0gY3ZJbml0U3lzdGVtCisjZGVmaW5lIGN2dk5hbWVkV2luZG93IGN2TmFtZWRXaW5kb3cKKyNkZWZpbmUgY3Z2UmVzaXplV2luZG93IGN2UmVzaXplV2luZG93CisjZGVmaW5lIGN2dkRlc3Ryb3lXaW5kb3cgY3ZEZXN0cm95V2luZG93CisjZGVmaW5lIGN2dkNyZWF0ZVRyYWNrYmFyIGN2Q3JlYXRlVHJhY2tiYXIKKyNkZWZpbmUgY3Z2TG9hZEltYWdlKG5hbWUpIGN2TG9hZEltYWdlKChuYW1lKSwxKQorI2RlZmluZSBjdnZTYXZlSW1hZ2UgY3ZTYXZlSW1hZ2UKKyNkZWZpbmUgY3Z2QWRkU2VhcmNoUGF0aCBjdkFkZFNlYXJjaFBhdGgKKyNkZWZpbmUgY3Z2V2FpdEtleShuYW1lKSBjdldhaXRLZXkoMCkKKyNkZWZpbmUgY3Z2V2FpdEtleUV4KG5hbWUsZGVsYXkpIGN2V2FpdEtleShkZWxheSkKKyNkZWZpbmUgY3Z2Q29udmVydEltYWdlIGN2Q29udmVydEltYWdlCisjZGVmaW5lIEhHX0FVVE9TSVpFIENWX1dJTkRPV19BVVRPU0laRQorI2RlZmluZSBzZXRfcHJlcHJvY2Vzc19mdW5jIGN2U2V0UHJlcHJvY2Vzc0Z1bmNXaW4zMgorI2RlZmluZSBzZXRfcG9zdHByb2Nlc3NfZnVuYyBjdlNldFBvc3Rwcm9jZXNzRnVuY1dpbjMyCisKKyNpZmRlZiBXSU4zMgorCit0eXBlZGVmIGludCAoQ1ZfQ0RFQ0wgKiBDdldpbjMyV2luZG93Q2FsbGJhY2spKEhXTkQsIFVJTlQsIFdQQVJBTSwgTFBBUkFNLCBpbnQqKTsKK0NWQVBJKHZvaWQpIGN2U2V0UHJlcHJvY2Vzc0Z1bmNXaW4zMiggQ3ZXaW4zMldpbmRvd0NhbGxiYWNrIG9uX3ByZXByb2Nlc3MgKTsKK0NWQVBJKHZvaWQpIGN2U2V0UG9zdHByb2Nlc3NGdW5jV2luMzIoIEN2V2luMzJXaW5kb3dDYWxsYmFjayBvbl9wb3N0cHJvY2VzcyApOworCitDVl9JTkxJTkUgaW50IGlwbFdpZHRoKCBjb25zdCBJcGxJbWFnZSogaW1nICk7CitDVl9JTkxJTkUgaW50IGlwbFdpZHRoKCBjb25zdCBJcGxJbWFnZSogaW1nICkKK3sKKyAgICByZXR1cm4gIWltZyA/IDAgOiAhaW1nLT5yb2kgPyBpbWctPndpZHRoIDogaW1nLT5yb2ktPndpZHRoOworfQorCitDVl9JTkxJTkUgaW50IGlwbEhlaWdodCggY29uc3QgSXBsSW1hZ2UqIGltZyApOworQ1ZfSU5MSU5FIGludCBpcGxIZWlnaHQoIGNvbnN0IElwbEltYWdlKiBpbWcgKQoreworICAgIHJldHVybiAhaW1nID8gMCA6ICFpbWctPnJvaSA/IGltZy0+aGVpZ2h0IDogaW1nLT5yb2ktPmhlaWdodDsKK30KKworI2VuZGlmCisKKyNlbmRpZiAvKiBvYnNvbGV0ZSBmdW5jdGlvbnMgKi8KKworLyogRm9yIHVzZSB3aXRoIFdpbjMyICovCisjaWZkZWYgV0lOMzIKKworQ1ZfSU5MSU5FIFJFQ1QgTm9ybWFsaXplUmVjdCggUkVDVCByICk7CitDVl9JTkxJTkUgUkVDVCBOb3JtYWxpemVSZWN0KCBSRUNUIHIgKQoreworICAgIGludCB0OworCisgICAgaWYoIHIubGVmdCA+IHIucmlnaHQgKQorICAgIHsKKyAgICAgICAgdCA9IHIubGVmdDsKKyAgICAgICAgci5sZWZ0ID0gci5yaWdodDsKKyAgICAgICAgci5yaWdodCA9IHQ7CisgICAgfQorCisgICAgaWYoIHIudG9wID4gci5ib3R0b20gKQorICAgIHsKKyAgICAgICAgdCA9IHIudG9wOworICAgICAgICByLnRvcCA9IHIuYm90dG9tOworICAgICAgICByLmJvdHRvbSA9IHQ7CisgICAgfQorCisgICAgcmV0dXJuIHI7Cit9CisKK0NWX0lOTElORSBDdlJlY3QgUmVjdFRvQ3ZSZWN0KCBSRUNUIHNyICk7CitDVl9JTkxJTkUgQ3ZSZWN0IFJlY3RUb0N2UmVjdCggUkVDVCBzciApCit7CisgICAgc3IgPSBOb3JtYWxpemVSZWN0KCBzciApOworICAgIHJldHVybiBjdlJlY3QoIHNyLmxlZnQsIHNyLnRvcCwgc3IucmlnaHQgLSBzci5sZWZ0LCBzci5ib3R0b20gLSBzci50b3AgKTsKK30KKworQ1ZfSU5MSU5FIFJFQ1QgQ3ZSZWN0VG9SZWN0KCBDdlJlY3Qgc3IgKTsKK0NWX0lOTElORSBSRUNUIEN2UmVjdFRvUmVjdCggQ3ZSZWN0IHNyICkKK3sKKyAgICBSRUNUIGRyOworICAgIGRyLmxlZnQgPSBzci54OworICAgIGRyLnRvcCA9IHNyLnk7CisgICAgZHIucmlnaHQgPSBzci54ICsgc3Iud2lkdGg7CisgICAgZHIuYm90dG9tID0gc3IueSArIHNyLmhlaWdodDsKKworICAgIHJldHVybiBkcjsKK30KKworQ1ZfSU5MSU5FIElwbFJPSSBSZWN0VG9ST0koIFJFQ1QgciApOworQ1ZfSU5MSU5FIElwbFJPSSBSZWN0VG9ST0koIFJFQ1QgciApCit7CisgICAgSXBsUk9JIHJvaTsKKyAgICByID0gTm9ybWFsaXplUmVjdCggciApOworICAgIHJvaS54T2Zmc2V0ID0gci5sZWZ0OworICAgIHJvaS55T2Zmc2V0ID0gci50b3A7CisgICAgcm9pLndpZHRoID0gci5yaWdodCAtIHIubGVmdDsKKyAgICByb2kuaGVpZ2h0ID0gci5ib3R0b20gLSByLnRvcDsKKyAgICByb2kuY29pID0gMDsKKworICAgIHJldHVybiByb2k7Cit9CisKKyNlbmRpZiAvKiBXSU4zMiAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8qIGVuZCBvZiBleHRlcm4gIkMiICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cyAmJiAoIWRlZmluZWQgV0lOMzIgfHwgIWRlZmluZWQgKF9fR05VQ19fKSkgJiYgIWRlZmluZWQgQ1ZfTk9fQ1ZWX0lNQUdFCisKKyNkZWZpbmUgQ0ltYWdlIEN2dkltYWdlCisKKy8qIEN2dkltYWdlIGNsYXNzIGRlZmluaXRpb24gKi8KK2NsYXNzIENWX0VYUE9SVFMgQ3Z2SW1hZ2UKK3sKK3B1YmxpYzoKKyAgICBDdnZJbWFnZSgpOworICAgIHZpcnR1YWwgfkN2dkltYWdlKCk7CisKKyAgICAvKiBDcmVhdGUgaW1hZ2UgKEJHUiBvciBncmF5c2NhbGUpICovCisgICAgdmlydHVhbCBib29sICBDcmVhdGUoIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGJpdHNfcGVyX3BpeGVsLCBpbnQgaW1hZ2Vfb3JpZ2luID0gMCApOworCisgICAgLyogTG9hZCBpbWFnZSBmcm9tIHNwZWNpZmllZCBmaWxlICovCisgICAgdmlydHVhbCBib29sICBMb2FkKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGRlc2lyZWRfY29sb3IgPSAxICk7CisKKyAgICAvKiBMb2FkIHJlY3RhbmdsZSBmcm9tIHRoZSBmaWxlICovCisgICAgdmlydHVhbCBib29sICBMb2FkUmVjdCggY29uc3QgY2hhciogZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWRfY29sb3IsIEN2UmVjdCByICk7CisKKyNpZmRlZiBXSU4zMgorICAgIHZpcnR1YWwgYm9vbCAgTG9hZFJlY3QoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXNpcmVkX2NvbG9yLCBSRUNUIHIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExvYWRSZWN0KCBmaWxlbmFtZSwgZGVzaXJlZF9jb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjdlJlY3QoIHIubGVmdCwgci50b3AsIHIucmlnaHQgLSByLmxlZnQsIHIuYm90dG9tIC0gci50b3AgKSk7CisgICAgfQorI2VuZGlmCisKKyAgICAvKiBTYXZlIGVudGlyZSBpbWFnZSB0byBzcGVjaWZpZWQgZmlsZS4gKi8KKyAgICB2aXJ0dWFsIGJvb2wgIFNhdmUoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICk7CisKKyAgICAvKiBHZXQgY29weSBvZiBpbnB1dCBpbWFnZSBST0kgKi8KKyAgICB2aXJ0dWFsIHZvaWQgIENvcHlPZiggQ3Z2SW1hZ2UmIGltYWdlLCBpbnQgZGVzaXJlZF9jb2xvciA9IC0xICk7CisgICAgdmlydHVhbCB2b2lkICBDb3B5T2YoIElwbEltYWdlKiBpbWcsIGludCBkZXNpcmVkX2NvbG9yID0gLTEgKTsKKworICAgIElwbEltYWdlKiBHZXRJbWFnZSgpIHsgcmV0dXJuIG1faW1nOyB9OworICAgIHZpcnR1YWwgdm9pZCAgRGVzdHJveSh2b2lkKTsKKworICAgIC8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgUk9JICovCisgICAgaW50IFdpZHRoKCkgeyByZXR1cm4gIW1faW1nID8gMCA6ICFtX2ltZy0+cm9pID8gbV9pbWctPndpZHRoIDogbV9pbWctPnJvaS0+d2lkdGg7IH07CisgICAgaW50IEhlaWdodCgpIHsgcmV0dXJuICFtX2ltZyA/IDAgOiAhbV9pbWctPnJvaSA/IG1faW1nLT5oZWlnaHQgOiBtX2ltZy0+cm9pLT5oZWlnaHQ7fTsKKyAgICBpbnQgQnBwKCkgeyByZXR1cm4gbV9pbWcgPyAobV9pbWctPmRlcHRoICYgMjU1KSptX2ltZy0+bkNoYW5uZWxzIDogMDsgfTsKKworICAgIHZpcnR1YWwgdm9pZCAgRmlsbCggaW50IGNvbG9yICk7CisKKworcHJvdGVjdGVkOgorCisgICAgSXBsSW1hZ2UqICBtX2ltZzsKK307CisKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYgLyogX0hJR0hfR1VJXyAqLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvaW1hZ2UuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvaW1hZ2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MmMxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9pbWFnZS5jcHAKQEAgLTAsMCArMSwyNTUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvLworLy8gSW1hZ2UuY3BwOiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ3Z2SW1hZ2UgY2xhc3MuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKworI2lmIGRlZmluZWQgX19jcGx1c3BsdXMgJiYgKCFkZWZpbmVkIFdJTjMyIHx8ICFkZWZpbmVkIF9fR05VQ19fKQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBDb25zdHJ1Y3Rpb24vRGVzdHJ1Y3Rpb24KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworQ3Z2SW1hZ2U6OkN2dkltYWdlKCkKK3sKKyAgICBtX2ltZyA9IDA7Cit9CisKK3ZvaWQgQ3Z2SW1hZ2U6OkRlc3Ryb3koKQoreworICAgIGN2UmVsZWFzZUltYWdlKCAmbV9pbWcgKTsKK30KKworQ3Z2SW1hZ2U6On5DdnZJbWFnZSgpCit7CisgICAgRGVzdHJveSgpOworfQorCitib29sICBDdnZJbWFnZTo6Q3JlYXRlKCBpbnQgdywgaW50IGgsIGludCBicHAsIGludCBvcmlnaW4gKQoreworICAgIGNvbnN0IHVuc2lnbmVkIG1heF9pbWdfc2l6ZSA9IDEwMDAwOworCisgICAgaWYoIChicHAgIT0gOCAmJiBicHAgIT0gMjQgJiYgYnBwICE9IDMyKSB8fAorICAgICAgICAodW5zaWduZWQpdyA+PSAgbWF4X2ltZ19zaXplIHx8ICh1bnNpZ25lZCloID49IG1heF9pbWdfc2l6ZSB8fAorICAgICAgICAob3JpZ2luICE9IElQTF9PUklHSU5fVEwgJiYgb3JpZ2luICE9IElQTF9PUklHSU5fQkwpKQorICAgIHsKKyAgICAgICAgYXNzZXJ0KDApOyAvLyBtb3N0IHByb2JhYmx5LCBpdCBpcyBhIHByb2dyYW1taW5nIGVycm9yCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgaWYoICFtX2ltZyB8fCBCcHAoKSAhPSBicHAgfHwgbV9pbWctPndpZHRoICE9IHcgfHwgbV9pbWctPmhlaWdodCAhPSBoICkKKyAgICB7CisgICAgICAgIGlmKCBtX2ltZyAmJiBtX2ltZy0+blNpemUgPT0gc2l6ZW9mKElwbEltYWdlKSkKKyAgICAgICAgICAgIERlc3Ryb3koKTsKKyAgICAKKyAgICAgICAgLyogcHJlcGFyZSBJUEwgaGVhZGVyICovCisgICAgICAgIG1faW1nID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKCB3LCBoICksIElQTF9ERVBUSF84VSwgYnBwLzggKTsKKyAgICB9CisKKyAgICBpZiggbV9pbWcgKQorICAgICAgICBtX2ltZy0+b3JpZ2luID0gb3JpZ2luID09IDAgPyBJUExfT1JJR0lOX1RMIDogSVBMX09SSUdJTl9CTDsKKworICAgIHJldHVybiBtX2ltZyAhPSAwOworfQorCit2b2lkICBDdnZJbWFnZTo6Q29weU9mKCBDdnZJbWFnZSYgaW1hZ2UsIGludCBkZXNpcmVkX2NvbG9yICkKK3sKKyAgICBJcGxJbWFnZSogaW1nID0gaW1hZ2UuR2V0SW1hZ2UoKTsKKyAgICBpZiggaW1nICkKKyAgICB7CisgICAgICAgIENvcHlPZiggaW1nLCBkZXNpcmVkX2NvbG9yICk7CisgICAgfQorfQorCisKKyNkZWZpbmUgSEdfSVNfSU1BR0UoaW1nKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoaW1nKSAhPSAwICYmICgoY29uc3QgSXBsSW1hZ2UqKShpbWcpKS0+blNpemUgPT0gc2l6ZW9mKElwbEltYWdlKSAmJiBcCisgICAgKChJcGxJbWFnZSopaW1nKS0+aW1hZ2VEYXRhICE9IDApCisKKwordm9pZCAgQ3Z2SW1hZ2U6OkNvcHlPZiggSXBsSW1hZ2UqIGltZywgaW50IGRlc2lyZWRfY29sb3IgKQoreworICAgIGlmKCBIR19JU19JTUFHRShpbWcpICkKKyAgICB7CisgICAgICAgIGludCBjb2xvciA9IGRlc2lyZWRfY29sb3I7CisgICAgICAgIEN2U2l6ZSBzaXplID0gY3ZHZXRTaXplKCBpbWcgKTsgCisKKyAgICAgICAgaWYoIGNvbG9yIDwgMCApCisgICAgICAgICAgICBjb2xvciA9IGltZy0+bkNoYW5uZWxzID4gMTsKKworICAgICAgICBpZiggQ3JlYXRlKCBzaXplLndpZHRoLCBzaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgKCFjb2xvciA/IDEgOiBpbWctPm5DaGFubmVscyA+IDEgPyBpbWctPm5DaGFubmVscyA6IDMpKjgsCisgICAgICAgICAgICAgICAgICAgIGltZy0+b3JpZ2luICkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGN2Q29udmVydEltYWdlKCBpbWcsIG1faW1nLCAwICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworYm9vbCAgQ3Z2SW1hZ2U6OkxvYWQoIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgZGVzaXJlZF9jb2xvciApCit7CisgICAgSXBsSW1hZ2UqIGltZyA9IGN2TG9hZEltYWdlKCBmaWxlbmFtZSwgZGVzaXJlZF9jb2xvciApOworICAgIGlmKCAhaW1nICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgQ29weU9mKCBpbWcsIGRlc2lyZWRfY29sb3IgKTsKKyAgICBjdlJlbGVhc2VJbWFnZSggJmltZyApOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCAgQ3Z2SW1hZ2U6OkxvYWRSZWN0KCBjb25zdCBjaGFyKiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc2lyZWRfY29sb3IsIEN2UmVjdCByICkKK3sKKyAgICBpZiggci53aWR0aCA8IDAgfHwgci5oZWlnaHQgPCAwICkgcmV0dXJuIGZhbHNlOworCisgICAgSXBsSW1hZ2UqIGltZyA9IGN2TG9hZEltYWdlKCBmaWxlbmFtZSwgZGVzaXJlZF9jb2xvciApOworICAgIGlmKCAhaW1nICkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYoIHIud2lkdGggPT0gMCB8fCByLmhlaWdodCA9PSAwICkKKyAgICB7CisgICAgICAgIHIud2lkdGggPSBpbWctPndpZHRoOworICAgICAgICByLmhlaWdodCA9IGltZy0+aGVpZ2h0OworICAgICAgICByLnggPSByLnkgPSAwOworICAgIH0KKworICAgIGlmKCByLnggPiBpbWctPndpZHRoIHx8IHIueSA+IGltZy0+aGVpZ2h0IHx8CisgICAgICAgIHIueCArIHIud2lkdGggPCAwIHx8IHIueSArIHIuaGVpZ2h0IDwgMCApCisgICAgeworICAgICAgICBjdlJlbGVhc2VJbWFnZSggJmltZyApOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyogdHJ1bmNhdGUgciB0byBzb3VyY2UgaW1hZ2UgKi8KKyAgICBpZiggci54IDwgMCApCisgICAgeworICAgICAgICByLndpZHRoICs9IHIueDsKKyAgICAgICAgci54ID0gMDsKKyAgICB9CisgICAgaWYoIHIueSA8IDAgKQorICAgIHsKKyAgICAgICAgci5oZWlnaHQgKz0gci55OworICAgICAgICByLnkgPSAwOworICAgIH0KKworICAgIGlmKCByLnggKyByLndpZHRoID4gaW1nLT53aWR0aCApCisgICAgICAgIHIud2lkdGggPSBpbWctPndpZHRoIC0gci54OworCisgICAgaWYoIHIueSArIHIuaGVpZ2h0ID4gaW1nLT5oZWlnaHQgKQorICAgICAgICByLmhlaWdodCA9IGltZy0+aGVpZ2h0IC0gci55OworICAgIAorICAgIGN2U2V0SW1hZ2VST0koIGltZywgciApOworICAgIENvcHlPZiggaW1nLCBkZXNpcmVkX2NvbG9yICk7CisKKyAgICBjdlJlbGVhc2VJbWFnZSggJmltZyApOworICAgIHJldHVybiB0cnVlOworfQorCisKK2Jvb2wgIEN2dkltYWdlOjpTYXZlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSApCit7CisgICAgaWYoICFtX2ltZyApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjdlNhdmVJbWFnZSggZmlsZW5hbWUsIG1faW1nICk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKworCisjaWZkZWYgV0lOMzIKKwordm9pZCAgQ0ltYWdlOjpEcmF3VG9IREMoIEhEQyBoRENEc3QsIFJFQ1QqIHBEc3RSZWN0ICkgCit7CisgICAgaWYoIHBEc3RSZWN0ICYmIG1faW1nICYmIG1faW1nLT5kZXB0aCA9PSBJUExfREVQVEhfOFUgJiYgbV9pbWctPmltYWdlRGF0YSApCisgICAgeworICAgICAgICB1Y2hhciBidWZmZXJbc2l6ZW9mKEJJVE1BUElORk9IRUFERVIpICsgMTAyNF07CisgICAgICAgIEJJVE1BUElORk8qIGJtaSA9IChCSVRNQVBJTkZPKilidWZmZXI7CisgICAgICAgIGludCBibXBfdyA9IG1faW1nLT53aWR0aCwgYm1wX2ggPSBtX2ltZy0+aGVpZ2h0OworCisgICAgICAgIEN2UmVjdCByb2kgPSBjdkdldEltYWdlUk9JKCBtX2ltZyApOworICAgICAgICBDdlJlY3QgZHN0ID0gUmVjdFRvQ3ZSZWN0KCAqcERzdFJlY3QgKTsKKworICAgICAgICBpZiggcm9pLndpZHRoID09IGRzdC53aWR0aCAmJiByb2kuaGVpZ2h0ID09IGRzdC5oZWlnaHQgKQorICAgICAgICB7CisgICAgICAgICAgICBTaG93KCBoRENEc3QsIGRzdC54LCBkc3QueSwgZHN0LndpZHRoLCBkc3QuaGVpZ2h0LCByb2kueCwgcm9pLnkgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIAorICAgICAgICBpZiggcm9pLndpZHRoID4gZHN0LndpZHRoICkKKyAgICAgICAgeworICAgICAgICAgICAgU2V0U3RyZXRjaEJsdE1vZGUoCisgICAgICAgICAgICAgICAgICAgaERDRHN0LCAgICAgICAgICAgLy8gaGFuZGxlIHRvIGRldmljZSBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgSEFMRlRPTkUgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFNldFN0cmV0Y2hCbHRNb2RlKAorICAgICAgICAgICAgICAgICAgIGhEQ0RzdCwgICAgICAgICAgIC8vIGhhbmRsZSB0byBkZXZpY2UgY29udGV4dAorICAgICAgICAgICAgICAgICAgIENPTE9ST05DT0xPUiApOworICAgICAgICB9CisKKyAgICAgICAgRmlsbEJpdG1hcEluZm8oIGJtaSwgYm1wX3csIGJtcF9oLCBCcHAoKSwgbV9pbWctPm9yaWdpbiApOworCisgICAgICAgIDo6U3RyZXRjaERJQml0cygKKyAgICAgICAgICAgIGhEQ0RzdCwKKyAgICAgICAgICAgIGRzdC54LCBkc3QueSwgZHN0LndpZHRoLCBkc3QuaGVpZ2h0LAorICAgICAgICAgICAgcm9pLngsIHJvaS55LCByb2kud2lkdGgsIHJvaS5oZWlnaHQsCisgICAgICAgICAgICBtX2ltZy0+aW1hZ2VEYXRhLCBibWksIERJQl9SR0JfQ09MT1JTLCBTUkNDT1BZICk7CisgICAgfQorfQorCisjZW5kaWYKKwordm9pZCAgQ3Z2SW1hZ2U6OkZpbGwoIGludCBjb2xvciApCit7CisgICAgY3ZTZXQoIG1faW1nLCBjdlNjYWxhcihjb2xvciYyNTUsKGNvbG9yPj44KSYyNTUsKGNvbG9yPj4xNikmMjU1LChjb2xvcj4+MjQpJjI1NSkgKTsKK30KKworI2VuZGlmCisKKy8qIEVuZCBvZiBmaWxlLiAqLwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvbG9hZHNhdmUuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvbG9hZHNhdmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzBkYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS9sb2Fkc2F2ZS5jcHAKQEAgLTAsMCArMSw1NTUgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisvLworLy8gIExvYWRpbmcgYW5kIHNhdmluZyBJUEwgaW1hZ2VzLgorLy8KKworI2luY2x1ZGUgIl9oaWdoZ3VpLmgiCisjaW5jbHVkZSAiZ3JmbXRzLmgiCisKKyNpZiAwCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlwKKyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoIGNsYXNzIChsaXN0IG9mIHNlYXJjaCBmb2xkZXJzKSAgICAgICAgICAgICAgICAgICAgICAgKgorXCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NsYXNzICBDdkZpbGVQYXRoCit7CitwdWJsaWM6CisgICAgQ3ZGaWxlUGF0aCgpOworICAgIH5DdkZpbGVQYXRoKCk7CisKKyAgICAvLyBwcmVwcm9jZXNzIGZvbGRlciBvciBmaWxlIG5hbWUgLSBjYWxjdWxhdGUgaXRzIGxlbmd0aCwKKyAgICAvLyBjaGVjayBmb3IgaW52YWxpZCBzeW1ib2xzIGluIHRoZSBuYW1lIGFuZCBzdWJzdGl0dXRlCisgICAgLy8gYWxsIGJhY2tzbGFzaGVzIHdpdGggc2ltcGxlIHNsYXNoZXMuCisgICAgLy8gdGhlIHJlc3VsdCBpcyBwdXQgaW50byB0aGUgc3BlY2lmaWVkIGJ1ZmZlcgorICAgIHN0YXRpYyBpbnQgUHJlcHJvY2VzcyggY29uc3QgY2hhciogZmlsZW5hbWUsIGNoYXIqIGJ1ZmZlciApOworCisgICAgLy8gYWRkIGZvbGRlciB0byB0aGUgcGF0aAorICAgIGJvb2wgQWRkKCBjb25zdCBjaGFyKiBwYXRoICk7CisKKyAgICAvLyBjbGVhciB0aGUgcGF0aAorICAgIHZvaWQgQ2xlYXIoKTsKKworICAgIC8vIHJldHVybiB0aGUgcGF0aCAtIHN0cmluZywgd2hlcmUgZm9sZGVycyBhcmUgc2VwYXJhdGVkIGJ5ICc7JworICAgIGNvbnN0IGNoYXIqIEdldCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF0aDsgfTsKKworICAgIC8vIGZpbmQgdGhlIGZpbGUgaW4gdGhlIHBhdGgKKyAgICBjb25zdCBjaGFyKiBGaW5kKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY2hhciogYnVmZmVyICkgY29uc3Q7CisKKyAgICAvLyByZXR1cm4gdGhlIGZpcnN0IGZvbGRlciBmcm9tIHRoZSBwYXRoCisgICAgLy8gdGhlIHJldHVybmVkIHN0cmluZyBpcyBub3QgdGVybWluYXRlZCBieSAnXDAnISEhCisgICAgLy8gaXRzIGxlbmd0aCBpcyByZXR1cm5lZCB2aWEgbGVuIHBhcmFtZXRlcgorICAgIGNvbnN0IGNoYXIqIEZpcnN0KCBpbnQmIGxlbiApIGNvbnN0OworCisgICAgLy8gcmV0dXJuIHRoZSBmb2xkZXIsIG5leHQgaW4gdGhlIHBhdGggYWZ0ZXIgdGhlIHNwZWNpZmllZCBmb2xkZXIuCisgICAgLy8gc2VlIGFsc28gbm90ZSB0byBGaXJzdCgpIG1ldGhvZAorICAgIGNvbnN0IGNoYXIqIE5leHQoIGNvbnN0IGNoYXIqIGZvbGRlciwgaW50JiBsZW4gKSBjb25zdDsKKworcHJvdGVjdGVkOgorCisgICAgY2hhciogbV9wYXRoOworICAgIGludCBtX21heHNpemU7CisgICAgaW50IG1fbGVuOworfTsKKworCit2b2lkIEN2RmlsZVBhdGg6OkNsZWFyKCkKK3sKKyAgICBkZWxldGVbXSBtX3BhdGg7CisgICAgbV9tYXhzaXplID0gbV9sZW4gPSAwOworfQorCisKK0N2RmlsZVBhdGg6OkN2RmlsZVBhdGgoKQoreworICAgIG1fcGF0aCA9IDA7CisgICAgbV9tYXhzaXplID0gbV9sZW4gPSAwOworfQorCisKK0N2RmlsZVBhdGg6On5DdkZpbGVQYXRoKCkKK3sKKyAgICBDbGVhcigpOworfQorCisKK2Jvb2wgIEN2RmlsZVBhdGg6OkFkZCggY29uc3QgY2hhciogcGF0aCApCit7CisgICAgY2hhciBidWZmZXJbX01BWF9QQVRIICsgMV07CisgICAgaW50IGxlbiA9IFByZXByb2Nlc3MoIHBhdGgsIGJ1ZmZlciApOworCisgICAgaWYoIGxlbiA8IDAgKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiggbV9sZW4gKyBsZW4gKyAzIC8vICsxIGZvciBvbmUgbW9yZSAnOycsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm90aGVyICsxIGZvciBwb3NzaWJsZSBhZGRpdGlvbmFsICcvJywKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbGFzdCArMSBpcyBmb3IgJ1wwJworICAgICAgICAgICAgICAgICAgICAgID4gbV9tYXhzaXplICkKKyAgICB7CisgICAgICAgIGludCBuZXdfc2l6ZSA9IChtX2xlbiArIGxlbiArIDMgKyAxMDIzKSAmIC0xMDI0OworICAgICAgICBjaGFyKiBuZXdfcGF0aCA9IG5ldyBjaGFyW25ld19zaXplXTsKKworICAgICAgICBpZiggbV9wYXRoICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCBuZXdfcGF0aCwgbV9wYXRoLCBtX2xlbiApOworICAgICAgICAgICAgZGVsZXRlW10gbV9wYXRoOworICAgICAgICB9CisKKyAgICAgICAgbV9wYXRoID0gbmV3X3BhdGg7CisgICAgICAgIG1fbWF4c2l6ZSA9IG5ld19zaXplOworICAgIH0KKworICAgIG1fcGF0aFttX2xlbisrXSA9ICc7JzsKKyAgICBtZW1jcHkoIG1fcGF0aCArIG1fbGVuLCBidWZmZXIsIGxlbiApOworICAgIG1fbGVuICs9IGxlbjsKKworICAgIGlmKCBtX3BhdGhbbV9sZW5dICE9ICcvJyApCisgICAgICAgIG1fcGF0aFttX2xlbisrXSA9ICcvJzsKKworICAgIG1fcGF0aFttX2xlbl0gPSAnXDAnOyAvLyAnXDAnIGlzIG5vdCBjb3VudGVkIGluIG1fbGVuLgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworY29uc3QgY2hhciogQ3ZGaWxlUGF0aDo6Rmlyc3QoIGludCYgbGVuICkgY29uc3QKK3sKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gKGNvbnN0IGNoYXIqKShtX3BhdGggPyBtX3BhdGggOiAiIik7CisgICAgY29uc3QgY2hhciogcGF0aF9lbmQgPSBwYXRoOworCisgICAgd2hpbGUoICpwYXRoX2VuZCAmJiAqcGF0aF9lbmQgIT0gJzsnICkKKyAgICAgICAgcGF0aF9lbmQrKzsKKworICAgIGxlbiA9IHBhdGhfZW5kIC0gcGF0aDsKKyAgICByZXR1cm4gcGF0aDsKK30KKworCitjb25zdCBjaGFyKiBDdkZpbGVQYXRoOjpOZXh0KCBjb25zdCBjaGFyKiBmb2xkZXIsIGludCYgbGVuICkgY29uc3QKK3sKKyAgICBpZiggIWZvbGRlciB8fCBmb2xkZXIgPCBtX3BhdGggfHwgZm9sZGVyID49IG1fcGF0aCArIG1fbGVuICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb2xkZXIgPSBzdHJjaHIoIGZvbGRlciwgJzsnICk7CisgICAgaWYoIGZvbGRlciApCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBmb2xkZXJfZW5kID0gKytmb2xkZXI7CisgICAgICAgIHdoaWxlKCAqZm9sZGVyX2VuZCAmJiAqZm9sZGVyX2VuZCAhPSAnOycgKQorICAgICAgICAgICAgZm9sZGVyX2VuZCsrOworCisgICAgICAgIGxlbiA9IGZvbGRlcl9lbmQgLSBmb2xkZXI7CisgICAgfQorCisgICAgcmV0dXJuIGZvbGRlcjsKK30KKworCitjb25zdCBjaGFyKiBDdkZpbGVQYXRoOjpGaW5kKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgY2hhciogYnVmZmVyICkgY29uc3QKK3sKKyAgICBjaGFyIHBhdGgwW19NQVhfUEFUSCArIDFdOworICAgIGludCBsZW4gPSBQcmVwcm9jZXNzKCBmaWxlbmFtZSwgcGF0aDAgKTsKKyAgICBpbnQgZm9sZGVyX2xlbiA9IDA7CisgICAgY29uc3QgY2hhciogZm9sZGVyID0gRmlyc3QoIGZvbGRlcl9sZW4gKTsKKyAgICBjaGFyKiBuYW1lX29ubHkgPSAwOworICAgIGNoYXIqIG5hbWUgPSBwYXRoMDsKKyAgICBGSUxFKiBmID0gMDsKKworICAgIGlmKCBsZW4gPCAwICkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBkbworICAgIHsKKyAgICAgICAgaWYoIGZvbGRlcl9sZW4gKyBsZW4gPD0gX01BWF9QQVRIICkKKyAgICAgICAgeworICAgICAgICAgICAgbWVtY3B5KCBidWZmZXIsIGZvbGRlciwgZm9sZGVyX2xlbiApOworICAgICAgICAgICAgc3RyY3B5KCBidWZmZXIgKyBmb2xkZXJfbGVuLCBuYW1lICk7CisKKyAgICAgICAgICAgIGYgPSBmb3BlbiggYnVmZmVyLCAicmIiICk7CisgICAgICAgICAgICBpZiggZiApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiggbmFtZSAhPSBuYW1lX29ubHkgKQorICAgICAgICB7CisgICAgICAgICAgICBuYW1lX29ubHkgPSBzdHJyY2hyKCBwYXRoMCwgJy8nICk7CisgICAgICAgICAgICBpZiggIW5hbWVfb25seSApCisgICAgICAgICAgICAgICAgbmFtZV9vbmx5ID0gcGF0aDA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbmFtZV9vbmx5Kys7CisgICAgICAgICAgICBsZW4gPSBzdHJsZW4oIG5hbWVfb25seSApOworICAgICAgICAgICAgbmFtZSA9IG5hbWVfb25seTsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSggKGZvbGRlciA9IE5leHQoIGZvbGRlciwgZm9sZGVyX2xlbiApKSAhPSAwICk7CisKKyAgICBmaWxlbmFtZSA9IDA7CisKKyAgICBpZiggZiApCisgICAgeworICAgICAgICBmaWxlbmFtZSA9IChjb25zdCBjaGFyKilidWZmZXI7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmlsZW5hbWU7Cit9CisKKworaW50IEN2RmlsZVBhdGg6OlByZXByb2Nlc3MoIGNvbnN0IGNoYXIqIHN0ciwgY2hhciogYnVmZmVyICkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmKCAhc3RyIHx8ICFidWZmZXIgKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBmb3IoIGkgPSAwOyBpIDw9IF9NQVhfUEFUSDsgaSsrICkKKyAgICB7CisgICAgICAgIGJ1ZmZlcltpXSA9IHN0cltpXTsKKworICAgICAgICBpZiggaXNhbG51bShzdHJbaV0pKSAvLyBmYXN0IGNoZWNrIHRvIHNraXAgbW9zdCBvZiBjaGFyYWN0ZXJzCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiggc3RyW2ldID09ICdcMCcgKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgaWYoIHN0cltpXSA9PSAnXFwnICkgLy8gY29udmVydCBiYWNrIHNsYXNoZXMgdG8gc2ltcGxlIHNsYXNoZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGZvciBXaW4zMi0qTklYIGNvbXBhdGliaWxpdHkpCisgICAgICAgICAgICBidWZmZXJbaV0gPSAnLyc7CisKKyAgICAgICAgaWYgKHN0cltpXSA9PSAnKicgfHwgc3RyW2ldID09ICc/JyB8fCBzdHJbaV0gPT0gJ1wiJyB8fAorICAgICAgICAgICAgc3RyW2ldID09ICc+JyB8fCBzdHJbaV0gPT0gJzwnIHx8CisgICAgICAgICAgICBzdHJbaV0gPT0gJzsnIHx8IC8qIHVzZWQgYXMgYSBzZXBhcmF0b3IgaW4gdGhlIHBhdGggKi8KKyAgICAgICAgI2lmbmRlZiBXSU4zMgorICAgICAgICAgICAgc3RyW2ldID09ICcsJyB8fCBzdHJbaV0gPT0gJyUnIHx8CisgICAgICAgICNlbmRpZgorICAgICAgICAgICAgc3RyW2ldID09ICd8JykKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gaSA8PSBfTUFYX1BBVEggPyBpIDogLTE7Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcCisqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1hZ2UgUmVhZGVycyAmIFdyaXRlcnMgQ2xhc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKK1wqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitjbGFzcyAgQ3ZJbWFnZUZpbHRlcnMKK3sKK3B1YmxpYzoKKworICAgIEN2SW1hZ2VGaWx0ZXJzKCk7CisgICAgfkN2SW1hZ2VGaWx0ZXJzKCk7CisKKyAgICBHckZtdFJlYWRlciogRmluZFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSBjb25zdDsKKyAgICBHckZtdFdyaXRlciogRmluZFdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSBjb25zdDsKKworICAgIC8vY29uc3QgQ3ZGaWxlUGF0aCYgUGF0aCgpIGNvbnN0IHsgcmV0dXJuIChjb25zdCBDdkZpbGVQYXRoJiltX3BhdGg7IH07CisgICAgLy9DdkZpbGVQYXRoJiBQYXRoKCkgeyByZXR1cm4gbV9wYXRoOyB9OworCitwcm90ZWN0ZWQ6CisKKyAgICBHckZtdEZhY3Rvcmllc0xpc3QqICBtX2ZhY3RvcmllczsKK307CisKKworQ3ZJbWFnZUZpbHRlcnM6OkN2SW1hZ2VGaWx0ZXJzKCkKK3sKKyAgICBtX2ZhY3RvcmllcyA9IG5ldyBHckZtdEZhY3Rvcmllc0xpc3Q7CisKKyNpZmRlZiBIQVZFX0lNQUdFSU8KKyAgICBtX2ZhY3Rvcmllcy0+QWRkRmFjdG9yeSggbmV3IEdyRm10SW1hZ2VJTygpICk7CisjZW5kaWYKKyAgICBtX2ZhY3Rvcmllcy0+QWRkRmFjdG9yeSggbmV3IEdyRm10Qm1wKCkgKTsKKyAgICBtX2ZhY3Rvcmllcy0+QWRkRmFjdG9yeSggbmV3IEdyRm10SnBlZygpICk7CisgICAgbV9mYWN0b3JpZXMtPkFkZEZhY3RvcnkoIG5ldyBHckZtdFN1blJhc3RlcigpICk7CisgICAgbV9mYWN0b3JpZXMtPkFkZEZhY3RvcnkoIG5ldyBHckZtdFB4TSgpICk7CisgICAgbV9mYWN0b3JpZXMtPkFkZEZhY3RvcnkoIG5ldyBHckZtdFRpZmYoKSApOworI2lmZGVmIEhBVkVfUE5HCisgICAgbV9mYWN0b3JpZXMtPkFkZEZhY3RvcnkoIG5ldyBHckZtdFBuZygpICk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0pBU1BFUgorICAgIG1fZmFjdG9yaWVzLT5BZGRGYWN0b3J5KCBuZXcgR3JGbXRKcGVnMjAwMCgpICk7CisjZW5kaWYKKyNpZmRlZiBIQVZFX0lMTUlNRgorICAgIG1fZmFjdG9yaWVzLT5BZGRGYWN0b3J5KCBuZXcgR3JGbXRFeHIoKSApOworI2VuZGlmCit9CisKKworQ3ZJbWFnZUZpbHRlcnM6On5DdkltYWdlRmlsdGVycygpCit7CisgICAgZGVsZXRlIG1fZmFjdG9yaWVzOworfQorCisKK0dyRm10UmVhZGVyKiBDdkltYWdlRmlsdGVyczo6RmluZFJlYWRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKSBjb25zdAoreworICAgIHJldHVybiBtX2ZhY3Rvcmllcy0+RmluZFJlYWRlciggZmlsZW5hbWUgKTsKK30KKworCitHckZtdFdyaXRlciogQ3ZJbWFnZUZpbHRlcnM6OkZpbmRXcml0ZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mYWN0b3JpZXMtPkZpbmRXcml0ZXIoIGZpbGVuYW1lICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorKiAgICAgICAgICAgICAgICAgICAgICAgICBIaWdoR1VJIGxvYWRpbmcgJiBzYXZpbmcgZnVuY3Rpb24gaW1wbGVtZW50YXRpb24gICAgICAgICAgICAgICAqCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludCBpY3ZTZXRDWENPUkVCaW5kaW5ncyh2b2lkKQoreworICAgIHJldHVybiBDVl9TRVRfSU1BR0VfSU9fRlVOQ1RJT05TKCk7Cit9CisKK2ludCBjeGNvcmVfYmluZGluZ3NfaW5pdGlhbGl6ZWQgPSBpY3ZTZXRDWENPUkVCaW5kaW5ncygpOworCisvLyBnbG9iYWwgaW1hZ2UgSS9PIGZpbHRlcnMKK3N0YXRpYyBDdkltYWdlRmlsdGVycyAgZ19GaWx0ZXJzOworCisjaWYgMAorQ1ZfSU1QTCB2b2lkCitjdkFkZFNlYXJjaFBhdGgoIGNvbnN0IGNoYXIqIHBhdGggKQoreworICAgIENWX0ZVTkNOQU1FKCAiY3ZBZGRTZWFyY2hQYXRoIiApOworCisgICAgX19CRUdJTl9fOworCisgICAgaWYoICFwYXRoIHx8IHN0cmxlbihwYXRoKSA9PSAwICkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c051bGxQdHIsICJOdWxsIHBhdGgiICk7CisKKyAgICBnX0ZpbHRlcnMuQWRkUGF0aCggcGF0aCApOworCisgICAgX19FTkRfXzsKK30KKyNlbmRpZgorCitDVl9JTVBMIGludAorY3ZIYXZlSW1hZ2VSZWFkZXIoIGNvbnN0IGNoYXIqIGZpbGVuYW1lICkKK3sKKyAgICBHckZtdFJlYWRlciogcmVhZGVyID0gZ19GaWx0ZXJzLkZpbmRSZWFkZXIoIGZpbGVuYW1lICk7CisgICAgaWYoIHJlYWRlciApIHsKKyAgICAgICAgZGVsZXRlIHJlYWRlcjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitDVl9JTVBMIGludCBjdkhhdmVJbWFnZVdyaXRlciggY29uc3QgY2hhciogZmlsZW5hbWUgKQoreworICAgIEdyRm10V3JpdGVyKiB3cml0ZXIgPSBnX0ZpbHRlcnMuRmluZFdyaXRlciggZmlsZW5hbWUgKTsKKyAgICBpZiggd3JpdGVyICkgeworICAgICAgICBkZWxldGUgd3JpdGVyOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkKgoraWN2TG9hZEltYWdlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGZsYWdzLCBib29sIGxvYWRfYXNfbWF0cml4ICkKK3sKKyAgICBHckZtdFJlYWRlciogcmVhZGVyID0gMDsKKyAgICBJcGxJbWFnZSogaW1hZ2UgPSAwOworICAgIEN2TWF0IGhkciwgKm1hdHJpeCA9IDA7CisgICAgaW50IGRlcHRoID0gODsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZMb2FkSW1hZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdlNpemUgc2l6ZTsKKyAgICBpbnQgaXNjb2xvcjsKKyAgICBpbnQgY247CisKKyAgICBpZiggIWZpbGVuYW1lIHx8IHN0cmxlbihmaWxlbmFtZSkgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAibnVsbCBmaWxlbmFtZSIgKTsKKworICAgIHJlYWRlciA9IGdfRmlsdGVycy5GaW5kUmVhZGVyKCBmaWxlbmFtZSApOworICAgIGlmKCAhcmVhZGVyICkKKyAgICAgICAgRVhJVDsKKworICAgIGlmKCAhcmVhZGVyLT5SZWFkSGVhZGVyKCkgKQorICAgICAgICBFWElUOworCisgICAgc2l6ZS53aWR0aCA9IHJlYWRlci0+R2V0V2lkdGgoKTsKKyAgICBzaXplLmhlaWdodCA9IHJlYWRlci0+R2V0SGVpZ2h0KCk7CisKKyAgICBpZiggZmxhZ3MgPT0gLTEgKQorICAgICAgICBpc2NvbG9yID0gcmVhZGVyLT5Jc0NvbG9yKCk7CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIChmbGFncyAmIENWX0xPQURfSU1BR0VfQ09MT1IpICE9IDAgfHwKKyAgICAgICAgICAgKChmbGFncyAmIENWX0xPQURfSU1BR0VfQU5ZQ09MT1IpICE9IDAgJiYgcmVhZGVyLT5Jc0NvbG9yKCkpICkKKyAgICAgICAgICAgIGlzY29sb3IgPSAxOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpc2NvbG9yID0gMDsKKworICAgICAgICBpZiggKGZsYWdzICYgQ1ZfTE9BRF9JTUFHRV9BTllERVBUSCkgIT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJlYWRlci0+VXNlTmF0aXZlRGVwdGgodHJ1ZSk7CisgICAgICAgICAgICBkZXB0aCA9IHJlYWRlci0+R2V0RGVwdGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNuID0gaXNjb2xvciA/IDMgOiAxOworCisgICAgaWYoIGxvYWRfYXNfbWF0cml4ICkKKyAgICB7CisgICAgICAgIGludCB0eXBlOworICAgICAgICBpZihyZWFkZXItPklzRmxvYXQoKSAmJiBkZXB0aCAhPSA4KQorICAgICAgICAgICAgdHlwZSA9IENWXzMyRjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdHlwZSA9ICggZGVwdGggPD0gOCApID8gQ1ZfOFUgOiAoIGRlcHRoIDw9IDE2ICkgPyBDVl8xNlUgOiBDVl8zMlM7CisgICAgICAgIENWX0NBTEwoIG1hdHJpeCA9IGN2Q3JlYXRlTWF0KCBzaXplLmhlaWdodCwgc2l6ZS53aWR0aCwgQ1ZfTUFLRVRZUEUodHlwZSwgY24pICkpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpbnQgdHlwZTsKKyAgICAgICAgaWYocmVhZGVyLT5Jc0Zsb2F0KCkgJiYgZGVwdGggIT0gOCkKKyAgICAgICAgICAgIHR5cGUgPSBJUExfREVQVEhfMzJGOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0eXBlID0gKCBkZXB0aCA8PSA4ICkgPyBJUExfREVQVEhfOFUgOiAoIGRlcHRoIDw9IDE2ICkgPyBJUExfREVQVEhfMTZVIDogSVBMX0RFUFRIXzMyUzsKKyAgICAgICAgQ1ZfQ0FMTCggaW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBzaXplLCB0eXBlLCBjbiApKTsKKyAgICAgICAgbWF0cml4ID0gY3ZHZXRNYXQoIGltYWdlLCAmaGRyICk7CisgICAgfQorCisgICAgaWYoICFyZWFkZXItPlJlYWREYXRhKCBtYXRyaXgtPmRhdGEucHRyLCBtYXRyaXgtPnN0ZXAsIGlzY29sb3IgKSkKKyAgICB7CisgICAgICAgIGlmKCBsb2FkX2FzX21hdHJpeCApCisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZtYXRyaXggKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZpbWFnZSApOworICAgICAgICBFWElUOworICAgIH0KKworICAgIF9fRU5EX187CisKKyAgICBkZWxldGUgcmVhZGVyOworCisgICAgaWYoIGN2R2V0RXJyU3RhdHVzKCkgPCAwICkKKyAgICB7CisgICAgICAgIGlmKCBsb2FkX2FzX21hdHJpeCApCisgICAgICAgICAgICBjdlJlbGVhc2VNYXQoICZtYXRyaXggKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY3ZSZWxlYXNlSW1hZ2UoICZpbWFnZSApOworICAgIH0KKworICAgIHJldHVybiBsb2FkX2FzX21hdHJpeCA/ICh2b2lkKiltYXRyaXggOiAodm9pZCopaW1hZ2U7Cit9CisKKworQ1ZfSU1QTCBJcGxJbWFnZSoKK2N2TG9hZEltYWdlKCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGlzY29sb3IgKQoreworICAgIHJldHVybiAoSXBsSW1hZ2UqKWljdkxvYWRJbWFnZSggZmlsZW5hbWUsIGlzY29sb3IsIGZhbHNlICk7Cit9CisKK0NWX0lNUEwgQ3ZNYXQqCitjdkxvYWRJbWFnZU0oIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgaXNjb2xvciApCit7CisgICAgcmV0dXJuIChDdk1hdCopaWN2TG9hZEltYWdlKCBmaWxlbmFtZSwgaXNjb2xvciwgdHJ1ZSApOworfQorCisKK0NWX0lNUEwgaW50CitjdlNhdmVJbWFnZSggY29uc3QgY2hhciogZmlsZW5hbWUsIGNvbnN0IEN2QXJyKiBhcnIgKQoreworICAgIGludCBvcmlnaW4gPSAwOworICAgIEdyRm10V3JpdGVyKiB3cml0ZXIgPSAwOworICAgIEN2TWF0ICp0ZW1wID0gMCwgKnRlbXAyID0gMDsKKworICAgIENWX0ZVTkNOQU1FKCAiY3ZTYXZlSW1hZ2UiICk7CisKKyAgICBfX0JFR0lOX187CisKKyAgICBDdk1hdCBzdHViLCAqaW1hZ2U7CisgICAgaW50IGNoYW5uZWxzLCBpcGxfZGVwdGg7CisKKyAgICBpZiggIWZpbGVuYW1lIHx8IHN0cmxlbihmaWxlbmFtZSkgPT0gMCApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNOdWxsUHRyLCAibnVsbCBmaWxlbmFtZSIgKTsKKworICAgIENWX0NBTEwoIGltYWdlID0gY3ZHZXRNYXQoIGFyciwgJnN0dWIgKSk7CisKKyAgICBpZiggQ1ZfSVNfSU1BR0UoIGFyciApKQorICAgICAgICBvcmlnaW4gPSAoKElwbEltYWdlKilhcnIpLT5vcmlnaW47CisKKyAgICBjaGFubmVscyA9IENWX01BVF9DTiggaW1hZ2UtPnR5cGUgKTsKKyAgICBpZiggY2hhbm5lbHMgIT0gMSAmJiBjaGFubmVscyAhPSAzICYmIGNoYW5uZWxzICE9IDQgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkTnVtQ2hhbm5lbHMsICIiICk7CisKKyAgICB3cml0ZXIgPSBnX0ZpbHRlcnMuRmluZFdyaXRlciggZmlsZW5hbWUgKTsKKyAgICBpZiggIXdyaXRlciApCisgICAgICAgIENWX0VSUk9SKCBDVl9TdHNFcnJvciwgImNvdWxkIG5vdCBmaW5kIGEgZmlsdGVyIGZvciB0aGUgc3BlY2lmaWVkIGV4dGVuc2lvbiIgKTsKKworICAgIGlmKCBvcmlnaW4gKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggdGVtcCA9IGN2Q3JlYXRlTWF0KGltYWdlLT5yb3dzLCBpbWFnZS0+Y29scywgaW1hZ2UtPnR5cGUpICk7CisgICAgICAgIENWX0NBTEwoIGN2RmxpcCggaW1hZ2UsIHRlbXAsIDAgKSk7CisgICAgICAgIGltYWdlID0gdGVtcDsKKyAgICB9CisKKyAgICBpcGxfZGVwdGggPSBjdkN2VG9JcGxEZXB0aChpbWFnZS0+dHlwZSk7CisKKyAgICBpZiggIXdyaXRlci0+SXNGb3JtYXRTdXBwb3J0ZWQoaXBsX2RlcHRoKSApCisgICAgeworICAgICAgICBhc3NlcnQoIHdyaXRlci0+SXNGb3JtYXRTdXBwb3J0ZWQoSVBMX0RFUFRIXzhVKSApOworICAgICAgICBDVl9DQUxMKCB0ZW1wMiA9IGN2Q3JlYXRlTWF0KGltYWdlLT5yb3dzLAorICAgICAgICAgICAgaW1hZ2UtPmNvbHMsIENWX01BS0VUWVBFKENWXzhVLGNoYW5uZWxzKSkgKTsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDb252ZXJ0SW1hZ2UoIGltYWdlLCB0ZW1wMiApKTsKKyAgICAgICAgaW1hZ2UgPSB0ZW1wMjsKKyAgICAgICAgaXBsX2RlcHRoID0gSVBMX0RFUFRIXzhVOworICAgIH0KKworICAgIGlmKCAhd3JpdGVyLT5Xcml0ZUltYWdlKCBpbWFnZS0+ZGF0YS5wdHIsIGltYWdlLT5zdGVwLCBpbWFnZS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlLT5oZWlnaHQsIGlwbF9kZXB0aCwgY2hhbm5lbHMgKSkKKyAgICAgICAgQ1ZfRVJST1IoIENWX1N0c0Vycm9yLCAiY291bGQgbm90IHNhdmUgdGhlIGltYWdlIiApOworCisgICAgX19FTkRfXzsKKworICAgIGRlbGV0ZSB3cml0ZXI7CisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworICAgIGN2UmVsZWFzZU1hdCggJnRlbXAyICk7CisKKyAgICByZXR1cm4gY3ZHZXRFcnJTdGF0dXMoKSA+PSAwOworfQorCisvKiBFbmQgb2YgZmlsZS4gKi8KZGlmZiAtLWdpdCBhL290aGVybGlicy9oaWdoZ3VpL3ByZWNvbXAuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvcHJlY29tcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcwNzY5ZAotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL3ByZWNvbXAuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKwpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvdXRpbHMuY3BwIGIvb3RoZXJsaWJzL2hpZ2hndWkvdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YjQ4ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9vdGhlcmxpYnMvaGlnaGd1aS91dGlscy5jcHAKQEAgLTAsMCArMSw2NjggQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaW5jbHVkZSAiX2hpZ2hndWkuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWYgZGVmaW5lZCBXSU4zMiAmJiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDEyMDAKKyNpZiBkZWZpbmVkIFdJTjY0ICYmIGRlZmluZWQgRU02NFQKKyAgICAjaWZkZWYgX0RFQlVHCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJqYXNwZXJkXzY0LmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJqcGVnZF82NC5saWIiKQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAibGlicG5nZF82NC5saWIiKQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAibGlidGlmZmRfNjQubGliIikKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgInpsaWJkXzY0LmxpYiIpCisgICAgI2Vsc2UKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgImxpYmphc3Blcl82NC5saWIiKQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAibGlianBlZ182NC5saWIiKQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAibGlicG5nXzY0LmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJ0aWZmXzY0LmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJ6bGliXzY0LmxpYiIpCisgICAgI2VuZGlmCisjZWxpZiAhZGVmaW5lZCBXSU42NAorICAgICNpZmRlZiBfREVCVUcKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgImxpYmphc3BlcmQubGliIikKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgImxpYmpwZWdkLmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJwbmdkLmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJ0aWZmZC5saWIiKQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAiemxpYmQubGliIikKKyAgICAjZWxzZQorICAgICAgICAjcHJhZ21hIGNvbW1lbnQobGliLCAibGliamFzcGVyLmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJqcGVnLmxpYiIpCisgICAgICAgICNwcmFnbWEgY29tbWVudChsaWIsICJsaWJwbmcubGliIikKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgImxpYnRpZmYubGliIikKKyAgICAgICAgI3ByYWdtYSBjb21tZW50KGxpYiwgInpsaWIubGliIikKKyAgICAjZW5kaWYKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgIFNDQUxFICAxNAorI2RlZmluZSAgY1IgIChpbnQpKDAuMjk5KigxIDw8IFNDQUxFKSArIDAuNSkKKyNkZWZpbmUgIGNHICAoaW50KSgwLjU4NyooMSA8PCBTQ0FMRSkgKyAwLjUpCisjZGVmaW5lICBjQiAgKCgxIDw8IFNDQUxFKSAtIGNSIC0gY0cpCisKKwordm9pZCBpY3ZDdnRfQkdSMkdyYXlfOHVfQzNDMVIoIGNvbnN0IHVjaGFyKiByZ2IsIGludCByZ2Jfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZ3JheSwgaW50IGdyYXlfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdlNpemUgc2l6ZSwgaW50IF9zd2FwX3JiICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgc3dhcF9yYiA9IF9zd2FwX3JiID8gMiA6IDA7CisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGdyYXkgKz0gZ3JheV9zdGVwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIHJnYiArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBkZXNjYWxlKCByZ2Jbc3dhcF9yYl0qY0IgKyByZ2JbMV0qY0cgKyByZ2Jbc3dhcF9yYl4yXSpjUiwgU0NBTEUgKTsKKyAgICAgICAgICAgIGdyYXlbaV0gPSAodWNoYXIpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJnYiArPSByZ2Jfc3RlcCAtIHNpemUud2lkdGgqMzsKKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQkdSMkdyYXlfMTZ1X0MzQzFSKCBjb25zdCB1c2hvcnQqIHJnYiwgaW50IHJnYl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQqIGdyYXksIGludCBncmF5X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgX3N3YXBfcmIgKQoreworICAgIGludCBpOworICAgIGludCBzd2FwX3JiID0gX3N3YXBfcmIgPyAyIDogMDsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZ3JheSArPSBncmF5X3N0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgcmdiICs9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBpbnQgdCA9IGRlc2NhbGUoIHJnYltzd2FwX3JiXSpjQiArIHJnYlsxXSpjRyArIHJnYltzd2FwX3JiXjJdKmNSLCBTQ0FMRSApOworICAgICAgICAgICAgZ3JheVtpXSA9ICh1c2hvcnQpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJnYiArPSByZ2Jfc3RlcCAtIHNpemUud2lkdGgqMzsKKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQkdSQTJHcmF5Xzh1X0M0QzFSKCBjb25zdCB1Y2hhciogcmdiYSwgaW50IHJnYmFfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgX3N3YXBfcmIgKQoreworICAgIGludCBpOworICAgIGludCBzd2FwX3JiID0gX3N3YXBfcmIgPyAyIDogMDsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZ3JheSArPSBncmF5X3N0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgcmdiYSArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBkZXNjYWxlKCByZ2JhW3N3YXBfcmJdKmNCICsgcmdiYVsxXSpjRyArIHJnYmFbc3dhcF9yYl4yXSpjUiwgU0NBTEUgKTsKKyAgICAgICAgICAgIGdyYXlbaV0gPSAodWNoYXIpdDsKKyAgICAgICAgfQorCisgICAgICAgIHJnYmEgKz0gcmdiYV9zdGVwIC0gc2l6ZS53aWR0aCo0OworICAgIH0KK30KKworCit2b2lkIGljdkN2dF9HcmF5MkJHUl84dV9DMUMzUiggY29uc3QgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLCBDdlNpemUgc2l6ZSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGdyYXkgKz0gZ3JheV9zdGVwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIGJnciArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgYmdyWzBdID0gYmdyWzFdID0gYmdyWzJdID0gZ3JheVtpXTsKKyAgICAgICAgfQorICAgICAgICBiZ3IgKz0gYmdyX3N0ZXAgLSBzaXplLndpZHRoKjM7CisgICAgfQorfQorCisKK3ZvaWQgaWN2Q3Z0X0JHUkEyQkdSXzh1X0M0QzNSKCBjb25zdCB1Y2hhciogYmdyYSwgaW50IGJncmFfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBfc3dhcF9yYiApCit7CisgICAgaW50IGk7CisgICAgaW50IHN3YXBfcmIgPSBfc3dhcF9yYiA/IDIgOiAwOworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBiZ3IgKz0gMywgYmdyYSArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIgdDAgPSBiZ3JhW3N3YXBfcmJdLCB0MSA9IGJncmFbMV07CisgICAgICAgICAgICBiZ3JbMF0gPSB0MDsgYmdyWzFdID0gdDE7CisgICAgICAgICAgICB0MCA9IGJncmFbc3dhcF9yYl4yXTsgYmdyWzJdID0gdDA7CisgICAgICAgIH0KKyAgICAgICAgYmdyICs9IGJncl9zdGVwIC0gc2l6ZS53aWR0aCozOworICAgICAgICBiZ3JhICs9IGJncmFfc3RlcCAtIHNpemUud2lkdGgqNDsKKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQkdSQTJSR0JBXzh1X0M0UiggY29uc3QgdWNoYXIqIGJncmEsIGludCBiZ3JhX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogcmdiYSwgaW50IHJnYmFfc3RlcCwgQ3ZTaXplIHNpemUgKQoreworICAgIGludCBpOworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBiZ3JhICs9IDQsIHJnYmEgKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHVjaGFyIHQwID0gYmdyYVswXSwgdDEgPSBiZ3JhWzFdOworICAgICAgICAgICAgdWNoYXIgdDIgPSBiZ3JhWzJdLCB0MyA9IGJncmFbM107CisgICAgICAgICAgICByZ2JhWzBdID0gdDI7IHJnYmFbMV0gPSB0MTsKKyAgICAgICAgICAgIHJnYmFbMl0gPSB0MDsgcmdiYVszXSA9IHQzOworICAgICAgICB9CisgICAgICAgIGJncmEgKz0gYmdyYV9zdGVwIC0gc2l6ZS53aWR0aCo0OworICAgICAgICByZ2JhICs9IHJnYmFfc3RlcCAtIHNpemUud2lkdGgqNDsKKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQkdSMlJHQl84dV9DM1IoIGNvbnN0IHVjaGFyKiBiZ3IsIGludCBiZ3Jfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogcmdiLCBpbnQgcmdiX3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgYmdyICs9IDMsIHJnYiArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgdWNoYXIgdDAgPSBiZ3JbMF0sIHQxID0gYmdyWzFdLCB0MiA9IGJnclsyXTsKKyAgICAgICAgICAgIHJnYlsyXSA9IHQwOyByZ2JbMV0gPSB0MTsgcmdiWzBdID0gdDI7CisgICAgICAgIH0KKyAgICAgICAgYmdyICs9IGJncl9zdGVwIC0gc2l6ZS53aWR0aCozOworICAgICAgICByZ2IgKz0gcmdiX3N0ZXAgLSBzaXplLndpZHRoKjM7CisgICAgfQorfQorCisKK3ZvaWQgaWN2Q3Z0X0JHUjJSR0JfMTZ1X0MzUiggY29uc3QgdXNob3J0KiBiZ3IsIGludCBiZ3Jfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNob3J0KiByZ2IsIGludCByZ2Jfc3RlcCwgQ3ZTaXplIHNpemUgKQoreworICAgIGludCBpOworICAgIGZvciggOyBzaXplLmhlaWdodC0tOyApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBiZ3IgKz0gMywgcmdiICs9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICB1c2hvcnQgdDAgPSBiZ3JbMF0sIHQxID0gYmdyWzFdLCB0MiA9IGJnclsyXTsKKyAgICAgICAgICAgIHJnYlsyXSA9IHQwOyByZ2JbMV0gPSB0MTsgcmdiWzBdID0gdDI7CisgICAgICAgIH0KKyAgICAgICAgYmdyICs9IGJncl9zdGVwIC0gc2l6ZS53aWR0aCozOworICAgICAgICByZ2IgKz0gcmdiX3N0ZXAgLSBzaXplLndpZHRoKjM7CisgICAgfQorfQorCisKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgdXNob3J0OworCit2b2lkIGljdkN2dF9CR1I1NTUyR3JheV84dV9DMkMxUiggY29uc3QgdWNoYXIqIGJncjU1NSwgaW50IGJncjU1NV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBncmF5LCBpbnQgZ3JheV9zdGVwLCBDdlNpemUgc2l6ZSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGdyYXkgKz0gZ3JheV9zdGVwLCBiZ3I1NTUgKz0gYmdyNTU1X3N0ZXAgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0ID0gZGVzY2FsZSggKCgoKHVzaG9ydCopYmdyNTU1KVtpXSA8PCAzKSAmIDB4ZjgpKmNCICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVzaG9ydCopYmdyNTU1KVtpXSA+PiAyKSAmIDB4ZjgpKmNHICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoKHVzaG9ydCopYmdyNTU1KVtpXSA+PiA3KSAmIDB4ZjgpKmNSLCBTQ0FMRSApOworICAgICAgICAgICAgZ3JheVtpXSA9ICh1Y2hhcil0OworICAgICAgICB9CisgICAgfQorfQorCisKK3ZvaWQgaWN2Q3Z0X0JHUjU2NTJHcmF5Xzh1X0MyQzFSKCBjb25zdCB1Y2hhciogYmdyNTY1LCBpbnQgYmdyNTY1X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgZ3JheSArPSBncmF5X3N0ZXAsIGJncjU2NSArPSBiZ3I1NjVfc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQgPSBkZXNjYWxlKCAoKCgodXNob3J0KiliZ3I1NjUpW2ldIDw8IDMpICYgMHhmOCkqY0IgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodXNob3J0KiliZ3I1NjUpW2ldID4+IDMpICYgMHhmYykqY0cgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCgodXNob3J0KiliZ3I1NjUpW2ldID4+IDgpICYgMHhmOCkqY1IsIFNDQUxFICk7CisgICAgICAgICAgICBncmF5W2ldID0gKHVjaGFyKXQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQkdSNTU1MkJHUl84dV9DMkMzUiggY29uc3QgdWNoYXIqIGJncjU1NSwgaW50IGJncjU1NV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLCBDdlNpemUgc2l6ZSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCA7IHNpemUuaGVpZ2h0LS07IGJncjU1NSArPSBiZ3I1NTVfc3RlcCApCisgICAgeworICAgICAgICBmb3IoIGkgPSAwOyBpIDwgc2l6ZS53aWR0aDsgaSsrLCBiZ3IgKz0gMyApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCB0MCA9ICgoKHVzaG9ydCopYmdyNTU1KVtpXSA8PCAzKSAmIDB4Zjg7CisgICAgICAgICAgICBpbnQgdDEgPSAoKCh1c2hvcnQqKWJncjU1NSlbaV0gPj4gMikgJiAweGY4OworICAgICAgICAgICAgaW50IHQyID0gKCgodXNob3J0KiliZ3I1NTUpW2ldID4+IDcpICYgMHhmODsKKyAgICAgICAgICAgIGJnclswXSA9ICh1Y2hhcil0MDsgYmdyWzFdID0gKHVjaGFyKXQxOyBiZ3JbMl0gPSAodWNoYXIpdDI7CisgICAgICAgIH0KKyAgICAgICAgYmdyICs9IGJncl9zdGVwIC0gc2l6ZS53aWR0aCozOworICAgIH0KK30KKworCit2b2lkIGljdkN2dF9CR1I1NjUyQkdSXzh1X0MyQzNSKCBjb25zdCB1Y2hhciogYmdyNTY1LCBpbnQgYmdyNTY1X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgYmdyNTY1ICs9IGJncjU2NV9zdGVwICkKKyAgICB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBzaXplLndpZHRoOyBpKyssIGJnciArPSAzICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHQwID0gKCgodXNob3J0KiliZ3I1NjUpW2ldIDw8IDMpICYgMHhmODsKKyAgICAgICAgICAgIGludCB0MSA9ICgoKHVzaG9ydCopYmdyNTY1KVtpXSA+PiAzKSAmIDB4ZmM7CisgICAgICAgICAgICBpbnQgdDIgPSAoKCh1c2hvcnQqKWJncjU2NSlbaV0gPj4gOCkgJiAweGY4OworICAgICAgICAgICAgYmdyWzBdID0gKHVjaGFyKXQwOyBiZ3JbMV0gPSAodWNoYXIpdDE7IGJnclsyXSA9ICh1Y2hhcil0MjsKKyAgICAgICAgfQorICAgICAgICBiZ3IgKz0gYmdyX3N0ZXAgLSBzaXplLndpZHRoKjM7CisgICAgfQorfQorCisKK3ZvaWQgaWN2Q3Z0X0NNWUsyQkdSXzh1X0M0QzNSKCBjb25zdCB1Y2hhciogY215aywgaW50IGNteWtfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgYmdyICs9IDMsIGNteWsgKz0gNCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBjID0gY215a1swXSwgbSA9IGNteWtbMV0sIHkgPSBjbXlrWzJdLCBrID0gY215a1szXTsKKyAgICAgICAgICAgIGMgPSBrIC0gKCgyNTUgLSBjKSprPj44KTsKKyAgICAgICAgICAgIG0gPSBrIC0gKCgyNTUgLSBtKSprPj44KTsKKyAgICAgICAgICAgIHkgPSBrIC0gKCgyNTUgLSB5KSprPj44KTsKKyAgICAgICAgICAgIGJnclsyXSA9ICh1Y2hhciljOyBiZ3JbMV0gPSAodWNoYXIpbTsgYmdyWzBdID0gKHVjaGFyKXk7CisgICAgICAgIH0KKyAgICAgICAgYmdyICs9IGJncl9zdGVwIC0gc2l6ZS53aWR0aCozOworICAgICAgICBjbXlrICs9IGNteWtfc3RlcCAtIHNpemUud2lkdGgqNDsKKyAgICB9Cit9CisKKwordm9pZCBpY3ZDdnRfQ01ZSzJHcmF5Xzh1X0M0QzFSKCBjb25zdCB1Y2hhciogY215aywgaW50IGNteWtfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsIEN2U2l6ZSBzaXplICkKK3sKKyAgICBpbnQgaTsKKyAgICBmb3IoIDsgc2l6ZS5oZWlnaHQtLTsgKQorICAgIHsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IHNpemUud2lkdGg7IGkrKywgY215ayArPSA0ICkKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGMgPSBjbXlrWzBdLCBtID0gY215a1sxXSwgeSA9IGNteWtbMl0sIGsgPSBjbXlrWzNdOworICAgICAgICAgICAgYyA9IGsgLSAoKDI1NSAtIGMpKms+PjgpOworICAgICAgICAgICAgbSA9IGsgLSAoKDI1NSAtIG0pKms+PjgpOworICAgICAgICAgICAgeSA9IGsgLSAoKDI1NSAtIHkpKms+PjgpOworICAgICAgICAgICAgaW50IHQgPSBkZXNjYWxlKCB5KmNCICsgbSpjRyArIGMqY1IsIFNDQUxFICk7CisgICAgICAgICAgICBncmF5W2ldID0gKHVjaGFyKXQ7CisgICAgICAgIH0KKyAgICAgICAgZ3JheSArPSBncmF5X3N0ZXA7CisgICAgICAgIGNteWsgKz0gY215a19zdGVwIC0gc2l6ZS53aWR0aCo0OworICAgIH0KK30KKworCit2b2lkIEN2dFBhbGV0dGVUb0dyYXkoIGNvbnN0IFBhbGV0dGVFbnRyeSogcGFsZXR0ZSwgdWNoYXIqIGdyYXlQYWxldHRlLCBpbnQgZW50cmllcyApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGVudHJpZXM7IGkrKyApCisgICAgeworICAgICAgICBpY3ZDdnRfQkdSMkdyYXlfOHVfQzNDMVIoICh1Y2hhciopKHBhbGV0dGUgKyBpKSwgMCwgZ3JheVBhbGV0dGUgKyBpLCAwLCBjdlNpemUoMSwxKSApOworICAgIH0KK30KKworCit2b2lkICBGaWxsR3JheVBhbGV0dGUoIFBhbGV0dGVFbnRyeSogcGFsZXR0ZSwgaW50IGJwcCwgYm9vbCBuZWdhdGl2ZSApCit7CisgICAgaW50IGksIGxlbmd0aCA9IDEgPDwgYnBwOworICAgIGludCB4b3JfbWFzayA9IG5lZ2F0aXZlID8gMjU1IDogMDsKKworICAgIGZvciggaSA9IDA7IGkgPCBsZW5ndGg7IGkrKyApCisgICAgeworICAgICAgICBpbnQgdmFsID0gKGkgKiAyNTUvKGxlbmd0aCAtIDEpKSBeIHhvcl9tYXNrOworICAgICAgICBwYWxldHRlW2ldLmIgPSBwYWxldHRlW2ldLmcgPSBwYWxldHRlW2ldLnIgPSAodWNoYXIpdmFsOworICAgICAgICBwYWxldHRlW2ldLmEgPSAwOworICAgIH0KK30KKworCitib29sICBJc0NvbG9yUGFsZXR0ZSggUGFsZXR0ZUVudHJ5KiBwYWxldHRlLCBpbnQgYnBwICkKK3sKKyAgICBpbnQgaSwgbGVuZ3RoID0gMSA8PCBicHA7CisKKyAgICBmb3IoIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKysgKQorICAgIHsKKyAgICAgICAgaWYoIHBhbGV0dGVbaV0uYiAhPSBwYWxldHRlW2ldLmcgfHwKKyAgICAgICAgICAgIHBhbGV0dGVbaV0uYiAhPSBwYWxldHRlW2ldLnIgKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCisKK3VjaGFyKiBGaWxsVW5pQ29sb3IoIHVjaGFyKiBkYXRhLCB1Y2hhciomIGxpbmVfZW5kLAorICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXAsIGludCB3aWR0aDMsCisgICAgICAgICAgICAgICAgICAgICBpbnQmIHksIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQzLCBQYWxldHRlRW50cnkgY2xyICkKK3sKKyAgICBkbworICAgIHsKKyAgICAgICAgdWNoYXIqIGVuZCA9IGRhdGEgKyBjb3VudDM7CisKKyAgICAgICAgaWYoIGVuZCA+IGxpbmVfZW5kICkKKyAgICAgICAgICAgIGVuZCA9IGxpbmVfZW5kOworCisgICAgICAgIGNvdW50MyAtPSAoaW50KShlbmQgLSBkYXRhKTsKKyAgICAgICAgCisgICAgICAgIGZvciggOyBkYXRhIDwgZW5kOyBkYXRhICs9IDMgKQorICAgICAgICB7CisgICAgICAgICAgICBXUklURV9QSVgoIGRhdGEsIGNsciApOworICAgICAgICB9CisKKyAgICAgICAgaWYoIGRhdGEgPj0gbGluZV9lbmQgKQorICAgICAgICB7CisgICAgICAgICAgICBsaW5lX2VuZCArPSBzdGVwOworICAgICAgICAgICAgZGF0YSA9IGxpbmVfZW5kIC0gd2lkdGgzOworICAgICAgICAgICAgaWYoICsreSA+PSBoZWlnaHQgICkgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoIGNvdW50MyA+IDAgKTsKKworICAgIHJldHVybiBkYXRhOworfQorCisKK3VjaGFyKiBGaWxsVW5pR3JheSggdWNoYXIqIGRhdGEsIHVjaGFyKiYgbGluZV9lbmQsCisgICAgICAgICAgICAgICAgICAgIGludCBzdGVwLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGludCYgeSwgaW50IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50LCB1Y2hhciBjbHIgKQoreworICAgIGRvCisgICAgeworICAgICAgICB1Y2hhciogZW5kID0gZGF0YSArIGNvdW50OworCisgICAgICAgIGlmKCBlbmQgPiBsaW5lX2VuZCApCisgICAgICAgICAgICBlbmQgPSBsaW5lX2VuZDsKKworICAgICAgICBjb3VudCAtPSAoaW50KShlbmQgLSBkYXRhKTsKKyAgICAgICAgCisgICAgICAgIGZvciggOyBkYXRhIDwgZW5kOyBkYXRhKysgKQorICAgICAgICB7CisgICAgICAgICAgICAqZGF0YSA9IGNscjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBkYXRhID49IGxpbmVfZW5kICkKKyAgICAgICAgeworICAgICAgICAgICAgbGluZV9lbmQgKz0gc3RlcDsKKyAgICAgICAgICAgIGRhdGEgPSBsaW5lX2VuZCAtIHdpZHRoOworICAgICAgICAgICAgaWYoICsreSA+PSBoZWlnaHQgICkgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUoIGNvdW50ID4gMCApOworCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKwordWNoYXIqIEZpbGxDb2xvclJvdzgoIHVjaGFyKiBkYXRhLCB1Y2hhciogaW5kaWNlcywgaW50IGxlbiwgUGFsZXR0ZUVudHJ5KiBwYWxldHRlICkKK3sKKyAgICB1Y2hhciogZW5kID0gZGF0YSArIGxlbiozOworICAgIHdoaWxlKCAoZGF0YSArPSAzKSA8IGVuZCApCisgICAgeworICAgICAgICAqKChQYWxldHRlRW50cnkqKShkYXRhLTMpKSA9IHBhbGV0dGVbKmluZGljZXMrK107CisgICAgfQorICAgIFBhbGV0dGVFbnRyeSBjbHIgPSBwYWxldHRlW2luZGljZXNbMF1dOworICAgIFdSSVRFX1BJWCggZGF0YSAtIDMsIGNsciApOworICAgIHJldHVybiBkYXRhOworfQorICAgICAgICAgICAgICAgICAgICAgICAKKwordWNoYXIqIEZpbGxHcmF5Um93OCggdWNoYXIqIGRhdGEsIHVjaGFyKiBpbmRpY2VzLCBpbnQgbGVuLCB1Y2hhciogcGFsZXR0ZSApCit7CisgICAgaW50IGk7CisgICAgZm9yKCBpID0gMDsgaSA8IGxlbjsgaSsrICkKKyAgICB7CisgICAgICAgIGRhdGFbaV0gPSBwYWxldHRlW2luZGljZXNbaV1dOworICAgIH0KKyAgICByZXR1cm4gZGF0YSArIGxlbjsKK30KKworCit1Y2hhciogRmlsbENvbG9yUm93NCggdWNoYXIqIGRhdGEsIHVjaGFyKiBpbmRpY2VzLCBpbnQgbGVuLCBQYWxldHRlRW50cnkqIHBhbGV0dGUgKQoreworICAgIHVjaGFyKiBlbmQgPSBkYXRhICsgbGVuKjM7CisKKyAgICB3aGlsZSggKGRhdGEgKz0gNikgPCBlbmQgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9ICppbmRpY2VzKys7CisgICAgICAgICooKFBhbGV0dGVFbnRyeSopKGRhdGEtNikpID0gcGFsZXR0ZVtpZHggPj4gNF07CisgICAgICAgICooKFBhbGV0dGVFbnRyeSopKGRhdGEtMykpID0gcGFsZXR0ZVtpZHggJiAxNV07CisgICAgfQorCisgICAgaW50IGlkeCA9IGluZGljZXNbMF07CisgICAgUGFsZXR0ZUVudHJ5IGNsciA9IHBhbGV0dGVbaWR4ID4+IDRdOworICAgIFdSSVRFX1BJWCggZGF0YSAtIDYsIGNsciApOworCisgICAgaWYoIGRhdGEgPT0gZW5kICkKKyAgICB7CisgICAgICAgIGNsciA9IHBhbGV0dGVbaWR4ICYgMTVdOworICAgICAgICBXUklURV9QSVgoIGRhdGEgLSAzLCBjbHIgKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZDsKK30KKworCit1Y2hhciogRmlsbEdyYXlSb3c0KCB1Y2hhciogZGF0YSwgdWNoYXIqIGluZGljZXMsIGludCBsZW4sIHVjaGFyKiBwYWxldHRlICkKK3sKKyAgICB1Y2hhciogZW5kID0gZGF0YSArIGxlbjsKKyAgICB3aGlsZSggKGRhdGEgKz0gMikgPCBlbmQgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9ICppbmRpY2VzKys7CisgICAgICAgIGRhdGFbLTJdID0gcGFsZXR0ZVtpZHggPj4gNF07CisgICAgICAgIGRhdGFbLTFdID0gcGFsZXR0ZVtpZHggJiAxNV07CisgICAgfQorCisgICAgaW50IGlkeCA9IGluZGljZXNbMF07CisgICAgdWNoYXIgY2xyID0gcGFsZXR0ZVtpZHggPj4gNF07CisgICAgZGF0YVstMl0gPSBjbHI7CisKKyAgICBpZiggZGF0YSA9PSBlbmQgKQorICAgIHsKKyAgICAgICAgY2xyID0gcGFsZXR0ZVtpZHggJiAxNV07CisgICAgICAgIGRhdGFbLTFdID0gY2xyOworICAgIH0KKyAgICByZXR1cm4gZW5kOworfQorCisKK3VjaGFyKiBGaWxsQ29sb3JSb3cxKCB1Y2hhciogZGF0YSwgdWNoYXIqIGluZGljZXMsIGludCBsZW4sIFBhbGV0dGVFbnRyeSogcGFsZXR0ZSApCit7CisgICAgdWNoYXIqIGVuZCA9IGRhdGEgKyBsZW4qMzsKKworICAgIHdoaWxlKCAoZGF0YSArPSAyNCkgPCBlbmQgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9ICppbmRpY2VzKys7CisgICAgICAgICooKFBhbGV0dGVFbnRyeSopKGRhdGEgLSAyNCkpID0gcGFsZXR0ZVsoaWR4ICYgMTI4KSAhPSAwXTsKKyAgICAgICAgKigoUGFsZXR0ZUVudHJ5KikoZGF0YSAtIDIxKSkgPSBwYWxldHRlWyhpZHggJiA2NCkgIT0gMF07CisgICAgICAgICooKFBhbGV0dGVFbnRyeSopKGRhdGEgLSAxOCkpID0gcGFsZXR0ZVsoaWR4ICYgMzIpICE9IDBdOworICAgICAgICAqKChQYWxldHRlRW50cnkqKShkYXRhIC0gMTUpKSA9IHBhbGV0dGVbKGlkeCAmIDE2KSAhPSAwXTsKKyAgICAgICAgKigoUGFsZXR0ZUVudHJ5KikoZGF0YSAtIDEyKSkgPSBwYWxldHRlWyhpZHggJiA4KSAhPSAwXTsKKyAgICAgICAgKigoUGFsZXR0ZUVudHJ5KikoZGF0YSAtIDkpKSA9IHBhbGV0dGVbKGlkeCAmIDQpICE9IDBdOworICAgICAgICAqKChQYWxldHRlRW50cnkqKShkYXRhIC0gNikpID0gcGFsZXR0ZVsoaWR4ICYgMikgIT0gMF07CisgICAgICAgICooKFBhbGV0dGVFbnRyeSopKGRhdGEgLSAzKSkgPSBwYWxldHRlWyhpZHggJiAxKSAhPSAwXTsKKyAgICB9CisgICAgCisgICAgaW50IGlkeCA9IGluZGljZXNbMF0gPDwgMjQ7CisgICAgZm9yKCBkYXRhIC09IDI0OyBkYXRhIDwgZW5kOyBkYXRhICs9IDMsIGlkeCArPSBpZHggKQorICAgIHsKKyAgICAgICAgUGFsZXR0ZUVudHJ5IGNsciA9IHBhbGV0dGVbaWR4IDwgMF07CisgICAgICAgIFdSSVRFX1BJWCggZGF0YSwgY2xyICk7CisgICAgfQorCisgICAgcmV0dXJuIGRhdGE7Cit9CisKKwordWNoYXIqIEZpbGxHcmF5Um93MSggdWNoYXIqIGRhdGEsIHVjaGFyKiBpbmRpY2VzLCBpbnQgbGVuLCB1Y2hhciogcGFsZXR0ZSApCit7CisgICAgdWNoYXIqIGVuZCA9IGRhdGEgKyBsZW47CisKKyAgICB3aGlsZSggKGRhdGEgKz0gOCkgPCBlbmQgKQorICAgIHsKKyAgICAgICAgaW50IGlkeCA9ICppbmRpY2VzKys7CisgICAgICAgICooKHVjaGFyKikoZGF0YSAtIDgpKSA9IHBhbGV0dGVbKGlkeCAmIDEyOCkgIT0gMF07CisgICAgICAgICooKHVjaGFyKikoZGF0YSAtIDcpKSA9IHBhbGV0dGVbKGlkeCAmIDY0KSAhPSAwXTsKKyAgICAgICAgKigodWNoYXIqKShkYXRhIC0gNikpID0gcGFsZXR0ZVsoaWR4ICYgMzIpICE9IDBdOworICAgICAgICAqKCh1Y2hhciopKGRhdGEgLSA1KSkgPSBwYWxldHRlWyhpZHggJiAxNikgIT0gMF07CisgICAgICAgICooKHVjaGFyKikoZGF0YSAtIDQpKSA9IHBhbGV0dGVbKGlkeCAmIDgpICE9IDBdOworICAgICAgICAqKCh1Y2hhciopKGRhdGEgLSAzKSkgPSBwYWxldHRlWyhpZHggJiA0KSAhPSAwXTsKKyAgICAgICAgKigodWNoYXIqKShkYXRhIC0gMikpID0gcGFsZXR0ZVsoaWR4ICYgMikgIT0gMF07CisgICAgICAgICooKHVjaGFyKikoZGF0YSAtIDEpKSA9IHBhbGV0dGVbKGlkeCAmIDEpICE9IDBdOworICAgIH0KKyAgICAKKyAgICBpbnQgaWR4ID0gaW5kaWNlc1swXSA8PCAyNDsKKyAgICBmb3IoIGRhdGEgLT0gODsgZGF0YSA8IGVuZDsgZGF0YSsrLCBpZHggKz0gaWR4ICkKKyAgICB7CisgICAgICAgIGRhdGFbMF0gPSBwYWxldHRlW2lkeCA8IDBdOworICAgIH0KKworICAgIHJldHVybiBkYXRhOworfQorCisKK0NWX0lNUEwgdm9pZAorY3ZDb252ZXJ0SW1hZ2UoIGNvbnN0IEN2QXJyKiBzcmNhcnIsIEN2QXJyKiBkc3RhcnIsIGludCBmbGFncyApCit7CisgICAgQ3ZNYXQqIHRlbXAgPSAwOworICAgIAorICAgIENWX0ZVTkNOQU1FKCAiY3ZDb252ZXJ0SW1hZ2UiICk7CisgICAgCisgICAgX19CRUdJTl9fOworCisgICAgQ3ZNYXQgc3Jjc3R1YiwgKnNyYzsKKyAgICBDdk1hdCBkc3RzdHViLCAqZHN0OworICAgIGludCBzcmNfY24sIGRzdF9jbiwgc3dhcF9yYiA9IGZsYWdzICYgQ1ZfQ1ZUSU1HX1NXQVBfUkI7CisKKyAgICBDVl9DQUxMKCBzcmMgPSBjdkdldE1hdCggc3JjYXJyLCAmc3Jjc3R1YiApKTsKKyAgICBDVl9DQUxMKCBkc3QgPSBjdkdldE1hdCggZHN0YXJyLCAmZHN0c3R1YiApKTsKKworICAgIHNyY19jbiA9IENWX01BVF9DTiggc3JjLT50eXBlICk7CisgICAgZHN0X2NuID0gQ1ZfTUFUX0NOKCBkc3QtPnR5cGUgKTsKKworICAgIGlmKCBzcmNfY24gIT0gMSAmJiBzcmNfY24gIT0gMyAmJiBzcmNfY24gIT0gNCApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIlNvdXJjZSBpbWFnZSBtdXN0IGhhdmUgMSwgMyBvciA0IGNoYW5uZWxzIiApOworCisgICAgaWYoIENWX01BVF9ERVBUSCggZHN0LT50eXBlICkgIT0gQ1ZfOFUgKQorICAgICAgICBDVl9FUlJPUiggQ1ZfQmFkRGVwdGgsICJEZXN0aW5hdGlvbiBpbWFnZSBtdXN0IGJlIDh1IiApOworCisgICAgaWYoIENWX01BVF9DTihkc3QtPnR5cGUpICE9IDEgJiYgQ1ZfTUFUX0NOKGRzdC0+dHlwZSkgIT0gMyApCisgICAgICAgIENWX0VSUk9SKCBDVl9CYWROdW1DaGFubmVscywgIkRlc3RpbmF0aW9uIGltYWdlIG11c3QgaGF2ZSAxIG9yIDMgY2hhbm5lbHMiICk7CisgICAgCisgICAgaWYoICFDVl9BUkVfREVQVEhTX0VRKCBzcmMsIGRzdCApKQorICAgIHsKKyAgICAgICAgaW50IHNyY19kZXB0aCA9IENWX01BVF9ERVBUSChzcmMtPnR5cGUpOworICAgICAgICBkb3VibGUgc2NhbGUgPSBzcmNfZGVwdGggPD0gQ1ZfOFMgPyAxIDogc3JjX2RlcHRoIDw9IENWXzMyUyA/IDEuLzI1NiA6IDI1NTsKKyAgICAgICAgZG91YmxlIHNoaWZ0ID0gc3JjX2RlcHRoID09IENWXzhTIHx8IHNyY19kZXB0aCA9PSBDVl8xNlMgPyAxMjggOiAwOworICAgICAgICAKKyAgICAgICAgaWYoICFDVl9BUkVfQ05TX0VRKCBzcmMsIGRzdCApKQorICAgICAgICB7CisgICAgICAgICAgICB0ZW1wID0gY3ZDcmVhdGVNYXQoIHNyYy0+aGVpZ2h0LCBzcmMtPndpZHRoLAorICAgICAgICAgICAgICAgIChzcmMtPnR5cGUgJiBDVl9NQVRfQ05fTUFTSyl8KGRzdC0+dHlwZSAmIENWX01BVF9ERVBUSF9NQVNLKSk7CisgICAgICAgICAgICBjdkNvbnZlcnRTY2FsZSggc3JjLCB0ZW1wLCBzY2FsZSwgc2hpZnQgKTsKKyAgICAgICAgICAgIHNyYyA9IHRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBjdkNvbnZlcnRTY2FsZSggc3JjLCBkc3QsIHNjYWxlLCBzaGlmdCApOworICAgICAgICAgICAgc3JjID0gZHN0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYoIHNyY19jbiAhPSBkc3RfY24gfHwgc3JjX2NuID09IDMgJiYgc3dhcF9yYiApCisgICAgeworICAgICAgICB1Y2hhciAqcyA9IHNyYy0+ZGF0YS5wdHIsICpkID0gZHN0LT5kYXRhLnB0cjsKKyAgICAgICAgaW50IHNfc3RlcCA9IHNyYy0+c3RlcCwgZF9zdGVwID0gZHN0LT5zdGVwOworICAgICAgICBpbnQgY29kZSA9IHNyY19jbioxMCArIGRzdF9jbjsKKyAgICAgICAgQ3ZTaXplIHNpemUgPSB7IHNyYy0+Y29scywgc3JjLT5yb3dzIH07CisKKyAgICAgICAgaWYoIENWX0lTX01BVF9DT05UKHNyYy0+dHlwZSAmIGRzdC0+dHlwZSkgKQorICAgICAgICB7CisgICAgICAgICAgICBzaXplLndpZHRoICo9IHNpemUuaGVpZ2h0OworICAgICAgICAgICAgc2l6ZS5oZWlnaHQgPSAxOworICAgICAgICAgICAgc19zdGVwID0gZF9zdGVwID0gQ1ZfU1RVQl9TVEVQOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzd2l0Y2goIGNvZGUgKQorICAgICAgICB7CisgICAgICAgIGNhc2UgMTM6CisgICAgICAgICAgICBpY3ZDdnRfR3JheTJCR1JfOHVfQzFDM1IoIHMsIHNfc3RlcCwgZCwgZF9zdGVwLCBzaXplICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAzMToKKyAgICAgICAgICAgIGljdkN2dF9CR1IyR3JheV84dV9DM0MxUiggcywgc19zdGVwLCBkLCBkX3N0ZXAsIHNpemUsIHN3YXBfcmIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDMzOgorICAgICAgICAgICAgYXNzZXJ0KCBzd2FwX3JiICk7CisgICAgICAgICAgICBpY3ZDdnRfUkdCMkJHUl84dV9DM1IoIHMsIHNfc3RlcCwgZCwgZF9zdGVwLCBzaXplICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MToKKyAgICAgICAgICAgIGljdkN2dF9CR1JBMkdyYXlfOHVfQzRDMVIoIHMsIHNfc3RlcCwgZCwgZF9zdGVwLCBzaXplLCBzd2FwX3JiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0MzoKKyAgICAgICAgICAgIGljdkN2dF9CR1JBMkJHUl84dV9DNEMzUiggcywgc19zdGVwLCBkLCBkX3N0ZXAsIHNpemUsIHN3YXBfcmIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQ1ZfRVJST1IoIENWX1N0c1Vuc3VwcG9ydGVkRm9ybWF0LCAiVW5zdXBwb3J0ZWQgY29tYmluYXRpb24gb2YgaW5wdXQvb3V0cHV0IGZvcm1hdHMiICk7CisgICAgICAgIH0KKyAgICAgICAgc3JjID0gZHN0OworICAgIH0KKworICAgIGlmKCBmbGFncyAmIENWX0NWVElNR19GTElQICkKKyAgICB7CisgICAgICAgIENWX0NBTEwoIGN2RmxpcCggc3JjLCBkc3QsIDAgKSk7CisgICAgfQorICAgIGVsc2UgaWYoIHNyYyAhPSBkc3QgKQorICAgIHsKKyAgICAgICAgQ1ZfQ0FMTCggY3ZDb3B5KCBzcmMsIGRzdCApKTsKKyAgICB9CisKKyAgICBfX0VORF9fOworCisgICAgY3ZSZWxlYXNlTWF0KCAmdGVtcCApOworfQpkaWZmIC0tZ2l0IGEvb3RoZXJsaWJzL2hpZ2hndWkvdXRpbHMuaCBiL290aGVybGlicy9oaWdoZ3VpL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MWMxNwotLS0gL2Rldi9udWxsCisrKyBiL290aGVybGlicy9oaWdoZ3VpL3V0aWxzLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qTS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vICBJTVBPUlRBTlQ6IFJFQUQgQkVGT1JFIERPV05MT0FESU5HLCBDT1BZSU5HLCBJTlNUQUxMSU5HIE9SIFVTSU5HLgorLy8KKy8vICBCeSBkb3dubG9hZGluZywgY29weWluZywgaW5zdGFsbGluZyBvciB1c2luZyB0aGUgc29mdHdhcmUgeW91IGFncmVlIHRvIHRoaXMgbGljZW5zZS4KKy8vICBJZiB5b3UgZG8gbm90IGFncmVlIHRvIHRoaXMgbGljZW5zZSwgZG8gbm90IGRvd25sb2FkLCBpbnN0YWxsLAorLy8gIGNvcHkgb3IgdXNlIHRoZSBzb2Z0d2FyZS4KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgICBJbnRlbCBMaWNlbnNlIEFncmVlbWVudAorLy8gICAgICAgICAgICAgICAgRm9yIE9wZW4gU291cmNlIENvbXB1dGVyIFZpc2lvbiBMaWJyYXJ5CisvLworLy8gQ29weXJpZ2h0IChDKSAyMDAwLCBJbnRlbCBDb3Jwb3JhdGlvbiwgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFRoaXJkIHBhcnR5IGNvcHlyaWdodHMgYXJlIHByb3BlcnR5IG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLgorLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sCisvLyBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisvLworLy8gICAqIFJlZGlzdHJpYnV0aW9uJ3Mgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisvLyAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vCisvLyAgICogUmVkaXN0cmlidXRpb24ncyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKy8vICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCisvLyAgICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisvLworLy8gICAqIFRoZSBuYW1lIG9mIEludGVsIENvcnBvcmF0aW9uIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKy8vICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBhbmQgY29udHJpYnV0b3JzICJhcyBpcyIgYW5kCisvLyBhbnkgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMsIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvLCB0aGUgaW1wbGllZAorLy8gd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlIGFyZSBkaXNjbGFpbWVkLgorLy8gSW4gbm8gZXZlbnQgc2hhbGwgdGhlIEludGVsIENvcnBvcmF0aW9uIG9yIGNvbnRyaWJ1dG9ycyBiZSBsaWFibGUgZm9yIGFueSBkaXJlY3QsCisvLyBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMKKy8vIChpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0bywgcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsKKy8vIGxvc3Mgb2YgdXNlLCBkYXRhLCBvciBwcm9maXRzOyBvciBidXNpbmVzcyBpbnRlcnJ1cHRpb24pIGhvd2V2ZXIgY2F1c2VkCisvLyBhbmQgb24gYW55IHRoZW9yeSBvZiBsaWFiaWxpdHksIHdoZXRoZXIgaW4gY29udHJhY3QsIHN0cmljdCBsaWFiaWxpdHksCisvLyBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSBvciBvdGhlcndpc2UpIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YKKy8vIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KKy8vCisvL00qLworCisjaWZuZGVmIF9VVElMU19IXworI2RlZmluZSBfVVRJTFNfSF8KKworc3RydWN0IFBhbGV0dGVFbnRyeSAKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGIsIGcsIHIsIGE7Cit9OworCisjZGVmaW5lIFdSSVRFX1BJWCggcHRyLCBjbHIgKSAgICAgICBcCisgICAgKCgodWNoYXIqKShwdHIpKVswXSA9IChjbHIpLmIsICBcCisgICAgICgodWNoYXIqKShwdHIpKVsxXSA9IChjbHIpLmcsICBcCisgICAgICgodWNoYXIqKShwdHIpKVsyXSA9IChjbHIpLnIpCisKKyNkZWZpbmUgIGRlc2NhbGUoeCxuKSAgKCgoeCkgKyAoMSA8PCAoKG4pLTEpKSkgPj4gKG4pKQorI2RlZmluZSAgc2F0dXJhdGUoeCkgICAodWNoYXIpKCgoeCkgJiB+MjU1KSA9PSAwID8gKHgpIDogfigoeCk+PjMxKSkKKwordm9pZCBpY3ZDdnRfQkdSMkdyYXlfMTZ1X0MzQzFSKCBjb25zdCB1c2hvcnQqIGJnciwgaW50IGJncl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQqIGdyYXksIGludCBncmF5X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3dhcF9yYj0wICk7Cit2b2lkIGljdkN2dF9CR1IyR3JheV84dV9DM0MxUiggY29uc3QgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiBncmF5LCBpbnQgZ3JheV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3dhcF9yYj0wICk7Cit2b2lkIGljdkN2dF9CR1JBMkdyYXlfOHVfQzRDMVIoIGNvbnN0IHVjaGFyKiBiZ3JhLCBpbnQgYmdyYV9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZ3JheSwgaW50IGdyYXlfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3ZTaXplIHNpemUsIGludCBzd2FwX3JiPTAgKTsKK3ZvaWQgaWN2Q3Z0X0dyYXkyQkdSXzh1X0MxQzNSKCBjb25zdCB1Y2hhciogZ3JheSwgaW50IGdyYXlfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsIEN2U2l6ZSBzaXplICk7Cit2b2lkIGljdkN2dF9CR1JBMkJHUl84dV9DNEMzUiggY29uc3QgdWNoYXIqIGJncmEsIGludCBiZ3JhX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN2U2l6ZSBzaXplLCBpbnQgc3dhcF9yYj0wICk7Cit2b2lkIGljdkN2dF9CR1IyUkdCXzh1X0MzUiggY29uc3QgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVjaGFyKiByZ2IsIGludCByZ2Jfc3RlcCwgQ3ZTaXplIHNpemUgKTsKKyNkZWZpbmUgaWN2Q3Z0X1JHQjJCR1JfOHVfQzNSIGljdkN2dF9CR1IyUkdCXzh1X0MzUgordm9pZCBpY3ZDdnRfQkdSMlJHQl8xNnVfQzNSKCBjb25zdCB1c2hvcnQqIGJnciwgaW50IGJncl9zdGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2hvcnQqIHJnYiwgaW50IHJnYl9zdGVwLCBDdlNpemUgc2l6ZSApOworI2RlZmluZSBpY3ZDdnRfUkdCMkJHUl8xNnVfQzNSIGljdkN2dF9CR1IyUkdCXzE2dV9DM1IKKwordm9pZCBpY3ZDdnRfQkdSQTJSR0JBXzh1X0M0UiggY29uc3QgdWNoYXIqIGJncmEsIGludCBiZ3JhX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogcmdiYSwgaW50IHJnYmFfc3RlcCwgQ3ZTaXplIHNpemUgKTsKKyNkZWZpbmUgaWN2Q3Z0X1JHQkEyQkdSQV84dV9DNFIgaWN2Q3Z0X0JHUkEyUkdCQV84dV9DNFIKKwordm9pZCBpY3ZDdnRfQkdSNTU1MkdyYXlfOHVfQzJDMVIoIGNvbnN0IHVjaGFyKiBiZ3I1NTUsIGludCBiZ3I1NTVfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogZ3JheSwgaW50IGdyYXlfc3RlcCwgQ3ZTaXplIHNpemUgKTsKK3ZvaWQgaWN2Q3Z0X0JHUjU2NTJHcmF5Xzh1X0MyQzFSKCBjb25zdCB1Y2hhciogYmdyNTY1LCBpbnQgYmdyNTY1X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsIEN2U2l6ZSBzaXplICk7Cit2b2lkIGljdkN2dF9CR1I1NTUyQkdSXzh1X0MyQzNSKCBjb25zdCB1Y2hhciogYmdyNTU1LCBpbnQgYmdyNTU1X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsIEN2U2l6ZSBzaXplICk7Cit2b2lkIGljdkN2dF9CR1I1NjUyQkdSXzh1X0MyQzNSKCBjb25zdCB1Y2hhciogYmdyNTY1LCBpbnQgYmdyNTY1X3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1Y2hhciogYmdyLCBpbnQgYmdyX3N0ZXAsIEN2U2l6ZSBzaXplICk7Cit2b2lkIGljdkN2dF9DTVlLMkJHUl84dV9DNEMzUiggY29uc3QgdWNoYXIqIGNteWssIGludCBjbXlrX3N0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGJnciwgaW50IGJncl9zdGVwLCBDdlNpemUgc2l6ZSApOwordm9pZCBpY3ZDdnRfQ01ZSzJHcmF5Xzh1X0M0QzFSKCBjb25zdCB1Y2hhciogeWNjaywgaW50IHljY2tfc3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWNoYXIqIGdyYXksIGludCBncmF5X3N0ZXAsIEN2U2l6ZSBzaXplICk7CisKK3ZvaWQgIEZpbGxHcmF5UGFsZXR0ZSggUGFsZXR0ZUVudHJ5KiBwYWxldHRlLCBpbnQgYnBwLCBib29sIG5lZ2F0aXZlID0gZmFsc2UgKTsKK2Jvb2wgIElzQ29sb3JQYWxldHRlKCBQYWxldHRlRW50cnkqIHBhbGV0dGUsIGludCBicHAgKTsKK3ZvaWQgIEN2dFBhbGV0dGVUb0dyYXkoIGNvbnN0IFBhbGV0dGVFbnRyeSogcGFsZXR0ZSwgdWNoYXIqIGdyYXlQYWxldHRlLCBpbnQgZW50cmllcyApOwordWNoYXIqIEZpbGxVbmlDb2xvciggdWNoYXIqIGRhdGEsIHVjaGFyKiYgbGluZV9lbmQsIGludCBzdGVwLCBpbnQgd2lkdGgzLAorICAgICAgICAgICAgICAgICAgICAgaW50JiB5LCBpbnQgaGVpZ2h0LCBpbnQgY291bnQzLCBQYWxldHRlRW50cnkgY2xyICk7Cit1Y2hhciogRmlsbFVuaUdyYXkoIHVjaGFyKiBkYXRhLCB1Y2hhciomIGxpbmVfZW5kLCBpbnQgc3RlcCwgaW50IHdpZHRoMywKKyAgICAgICAgICAgICAgICAgICAgIGludCYgeSwgaW50IGhlaWdodCwgaW50IGNvdW50MywgdWNoYXIgY2xyICk7CisKK3VjaGFyKiBGaWxsQ29sb3JSb3c4KCB1Y2hhciogZGF0YSwgdWNoYXIqIGluZGljZXMsIGludCBsZW4sIFBhbGV0dGVFbnRyeSogcGFsZXR0ZSApOwordWNoYXIqIEZpbGxHcmF5Um93OCggdWNoYXIqIGRhdGEsIHVjaGFyKiBpbmRpY2VzLCBpbnQgbGVuLCB1Y2hhciogcGFsZXR0ZSApOwordWNoYXIqIEZpbGxDb2xvclJvdzQoIHVjaGFyKiBkYXRhLCB1Y2hhciogaW5kaWNlcywgaW50IGxlbiwgUGFsZXR0ZUVudHJ5KiBwYWxldHRlICk7Cit1Y2hhciogRmlsbEdyYXlSb3c0KCB1Y2hhciogZGF0YSwgdWNoYXIqIGluZGljZXMsIGludCBsZW4sIHVjaGFyKiBwYWxldHRlICk7Cit1Y2hhciogRmlsbENvbG9yUm93MSggdWNoYXIqIGRhdGEsIHVjaGFyKiBpbmRpY2VzLCBpbnQgbGVuLCBQYWxldHRlRW50cnkqIHBhbGV0dGUgKTsKK3VjaGFyKiBGaWxsR3JheVJvdzEoIHVjaGFyKiBkYXRhLCB1Y2hhciogaW5kaWNlcywgaW50IGxlbiwgdWNoYXIqIHBhbGV0dGUgKTsKKworQ1ZfSU5MSU5FIGJvb2wgIGlzQmlnRW5kaWFuKCB2b2lkICkKK3sKKyAgICByZXR1cm4gKCgoY29uc3QgaW50KikiXDBceDFceDJceDNceDRceDVceDZceDciKVswXSAmIDI1NSkgIT0gMDsKK30KKworI2VuZGlmLypfVVRJTFNfSF8qLwo=